dibbler-1.0.1/0000775000175000017500000000000012561700422010116 500000000000000dibbler-1.0.1/IfaceMgr/0000775000175000017500000000000012561700417011577 500000000000000dibbler-1.0.1/IfaceMgr/tests/0000775000175000017500000000000012561700417012741 500000000000000dibbler-1.0.1/IfaceMgr/tests/run_tests.cc0000644000175000017500000000031712277722750015225 00000000000000 #define STDC_HEADERS 1 #include #include int main(int argc, char* argv[]) { testing::InitGoogleTest(&argc, argv); int status = RUN_ALL_TESTS(); return status; } dibbler-1.0.1/IfaceMgr/tests/Makefile.am0000644000175000017500000000155412277722750014730 00000000000000AM_CPPFLAGS = -I$(top_srcdir) AM_CPPFLAGS += -I$(top_srcdir)/IfaceMgr AM_CPPFLAGS += -I$(top_srcdir)/Misc AM_CPPFLAGS += -I$(top_srcdir)/poslib AM_CPPFLAGS += -I$(top_srcdir)/nettle # This is to workaround long long in gtest.h AM_CPPFLAGS += $(GTEST_INCLUDES) -Wno-long-long -Wno-variadic-macros TESTS = if HAVE_GTEST TESTS += DnsUpdate_tests DnsUpdate_tests_SOURCES = run_tests.cc DnsUpdate_tests_SOURCES += DnsUpdate_unittest.cc DnsUpdate_tests_LDFLAGS = $(AM_LDFLAGS) $(GTEST_LDFLAGS) DnsUpdate_tests_LDADD = $(GTEST_LDADD) DnsUpdate_tests_LDADD += $(top_builddir)/IfaceMgr/libIfaceMgr.a DnsUpdate_tests_LDADD += $(top_builddir)/Misc/libMisc.a DnsUpdate_tests_LDADD += $(top_builddir)/poslib/libPoslib.a DnsUpdate_tests_LDADD += $(top_builddir)/nettle/libNettle.a DnsUpdate_tests_LDADD += $(top_builddir)/tests/utils/libTestUtils.a endif noinst_PROGRAMS = $(TESTS) dibbler-1.0.1/IfaceMgr/tests/DnsUpdate_unittest.cc0000644000175000017500000001342012277722750017024 00000000000000#include #include "DNSUpdate.h" #include #include "Key.h" #include "tests/utils/poslib_utils.h" using namespace std; using namespace test; namespace { class NakedDNSUpdate : public DNSUpdate { public: NakedDNSUpdate(const std::string& dns_address, const std::string& zonename, const std::string& hostname, std::string hostip, DnsUpdateMode updateMode, DnsUpdateProtocol proto /*= DNSUPDATE_TCP*/) :DNSUpdate(dns_address, zonename, hostname, hostip, updateMode, proto), id_(0), sign_time_(0) { } virtual void sendMsg(unsigned int timeout) { Message_->ID = id_; if (sign_time_) Message_->tsig_rr_signtime = sign_time_; DNSUpdate::sendMsg(timeout); } void extractPacket() { DnsRR * tsig = Message_->tsig_rr; if (tsig) { if (tsig->presign_RDLENGTH) { if (tsig->RDATA) free(tsig->RDATA); tsig->RDATA = (unsigned char*)memdup(tsig->presign_RDATA, tsig->presign_RDLENGTH); tsig->RDLENGTH = tsig->presign_RDLENGTH; } } buffer_ = Message_->compile(1500); } message_buff buffer_; uint16_t id_; time_t sign_time_; }; TEST(DnsUpdateTest, AAAA) { DnsUpdateResult result = DNSUPDATE_SKIP; NakedDNSUpdate act(/*dns*/"::1", "", "foo.example.org", "2001::1", DNSUPDATE_AAAA, DNSUpdate::DNSUPDATE_UDP); unsigned int timeout = 1000; message_buff expected1; message_buff expected2; // hexstring exported from wireshark // this also includes case where there is old AAAA record and DNS server responded // this version also includes delete of the old AAAA record hexToBin("a09328000001000000020000076578616d706c65036f7267000006000103666f6" "fc00c001c00fe00000000001020010000000000000000000000000001c01d001c" "000100001c20001020010000000000000000000000000001", expected1); // simple add (no previous AAAA records) hexToBin("a09328000001000000010000076578616d706c65036f7267000006000103666f6" "fc00c001c000100001c20001020010000000000000000000000000001", expected2); act.id_ = 0xa093; // just a random Transaction ID result = act.run(timeout); act.extractPacket(); EXPECT_TRUE(cmpBuffers(expected1, act.buffer_) || cmpBuffers(expected2, act.buffer_)); act.showResult(result); } TEST(DnsUpdateTest, TSIG_AAAA) { DnsUpdateResult result = DNSUPDATE_SKIP; NakedDNSUpdate act(/*dns*/"::1", "", "foo.example.org", "2001::1", DNSUPDATE_AAAA, DNSUpdate::DNSUPDATE_UDP); unsigned int timeout = 1000; TSIGKey key("DDNS_KEY"); key.setData("9SYMLnjK2ohb1N/56GZ5Jg=="); act.setTSIG("DDNS_KEY", key.getPackedData(), "HMAC-MD5.SIG-ALG.REG.INT", 301 /* fudge */); message_buff expected1; message_buff expected2; // this also includes case where there is old AAAA record and DNS server responded // this version also includes delete of the old AAAA record hexToBin("a09428000001000000020001076578616d706c65036f7267000006000103666f6" "fc00c001c00fe00000000001020010000000000000000000000000001c01d001c" "000100001c200010200100000000000000000000000000010844444e535f4b455" "90000fa00ff00000000003a08484d41432d4d4435075349472d414c4703524547" "03494e54000000500dbd7a012d00106f9d86b83c867043dd14f047bf7014fda09" "400000000", expected1); // simple add (no previous AAAA records) hexToBin("a09428000001000000010001076578616d706c65036f7267000006000103666f6" "fc00c001c000100001c200010200100000000000000000000000000010844444e" "535f4b45590000fa00ff00000000003a08484d41432d4d4435075349472d414c4" "70352454703494e54000000500dbd7a012d0010ef1e84d5fb49f5305faa73dd7c" "0e1e15a09400000000", expected2); act.id_ = 0xa094; // just a random Transaction ID act.sign_time_ = 0x500dbd7a; result = act.run(timeout); // build message and store it in act.buffer_ act.extractPacket(); EXPECT_TRUE(cmpBuffers(expected1, act.buffer_) || cmpBuffers(expected2, act.buffer_)); // call it second time to verify that we can build the same message // multiple times (test environment sanity check) act.extractPacket(); EXPECT_TRUE(cmpBuffers(expected1, act.buffer_) || cmpBuffers(expected2, act.buffer_)); act.showResult(result); } TEST(DnsUpdateTest, PTR) { #if 0 DnsUpdateModeCfg FQDNMode = static_cast(cfgIface->getFQDNMode()); SPtr key = SrvCfgMgr().getKey(); TCfgMgr::DNSUpdateProtocol proto = SrvCfgMgr().getDDNSProtocol(); DNSUpdate::DnsUpdateProtocol proto2 = DNSUpdate::DNSUPDATE_TCP; if (proto == TCfgMgr::DNSUPDATE_UDP) proto2 = DNSUpdate::DNSUPDATE_UDP; if (proto == TCfgMgr::DNSUPDATE_ANY) proto2 = DNSUpdate::DNSUPDATE_ANY; unsigned int timeout = SrvCfgMgr().getDDNSTimeout(); // FQDNMode: 0 = NONE, 1 = PTR only, 2 = BOTH PTR and AAAA if ((FQDNMode == DNSUPDATE_MODE_PTR) || (FQDNMode == DNSUPDATE_MODE_BOTH)) { //Test for DNS update char zoneroot[128]; doRevDnsZoneRoot(addr->getAddr(), zoneroot, cfgIface->getRevDNSZoneRootLength()); /* add PTR only */ DnsUpdateResult result = DNSUPDATE_SKIP; DNSUpdate *act = new DNSUpdate(dnsAddr->getPlain(), zoneroot, name, addr->getPlain(), DNSUPDATE_PTR, proto2); if (key) { act->setTSIG(key->Name_, key->getPackedData(), key->getAlgorithmText(), key->Fudge_); } result = act->run(timeout); act->showResult(result); delete act; success = (result == DNSUPDATE_SUCCESS); } #endif } } dibbler-1.0.1/IfaceMgr/tests/Makefile.in0000664000175000017500000010066712561652534014746 00000000000000# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ TESTS = $(am__EXEEXT_1) @HAVE_GTEST_TRUE@am__append_1 = DnsUpdate_tests noinst_PROGRAMS = $(am__EXEEXT_2) subdir = IfaceMgr/tests DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/depcomp $(top_srcdir)/test-driver ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/libtool.m4 \ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/include/dibbler-config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = @HAVE_GTEST_TRUE@am__EXEEXT_1 = DnsUpdate_tests$(EXEEXT) am__EXEEXT_2 = $(am__EXEEXT_1) PROGRAMS = $(noinst_PROGRAMS) am__DnsUpdate_tests_SOURCES_DIST = run_tests.cc DnsUpdate_unittest.cc @HAVE_GTEST_TRUE@am_DnsUpdate_tests_OBJECTS = run_tests.$(OBJEXT) \ @HAVE_GTEST_TRUE@ DnsUpdate_unittest.$(OBJEXT) DnsUpdate_tests_OBJECTS = $(am_DnsUpdate_tests_OBJECTS) am__DEPENDENCIES_1 = @HAVE_GTEST_TRUE@DnsUpdate_tests_DEPENDENCIES = $(am__DEPENDENCIES_1) \ @HAVE_GTEST_TRUE@ $(top_builddir)/IfaceMgr/libIfaceMgr.a \ @HAVE_GTEST_TRUE@ $(top_builddir)/Misc/libMisc.a \ @HAVE_GTEST_TRUE@ $(top_builddir)/poslib/libPoslib.a \ @HAVE_GTEST_TRUE@ $(top_builddir)/nettle/libNettle.a \ @HAVE_GTEST_TRUE@ $(top_builddir)/tests/utils/libTestUtils.a AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = DnsUpdate_tests_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CXXLD) \ $(AM_CXXFLAGS) $(CXXFLAGS) $(DnsUpdate_tests_LDFLAGS) \ $(LDFLAGS) -o $@ AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)/include depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) LTCXXCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CXXFLAGS) $(CXXFLAGS) AM_V_CXX = $(am__v_CXX_@AM_V@) am__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@) am__v_CXX_0 = @echo " CXX " $@; am__v_CXX_1 = CXXLD = $(CXX) CXXLINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \ $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CXXLD = $(am__v_CXXLD_@AM_V@) am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@) am__v_CXXLD_0 = @echo " CXXLD " $@; am__v_CXXLD_1 = SOURCES = $(DnsUpdate_tests_SOURCES) DIST_SOURCES = $(am__DnsUpdate_tests_SOURCES_DIST) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags am__tty_colors_dummy = \ mgn= red= grn= lgn= blu= brg= std=; \ am__color_tests=no am__tty_colors = { \ $(am__tty_colors_dummy); \ if test "X$(AM_COLOR_TESTS)" = Xno; then \ am__color_tests=no; \ elif test "X$(AM_COLOR_TESTS)" = Xalways; then \ am__color_tests=yes; \ elif test "X$$TERM" != Xdumb && { test -t 1; } 2>/dev/null; then \ am__color_tests=yes; \ fi; \ if test $$am__color_tests = yes; then \ red=''; \ grn=''; \ lgn=''; \ blu=''; \ mgn=''; \ brg=''; \ std=''; \ fi; \ } am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__recheck_rx = ^[ ]*:recheck:[ ]* am__global_test_result_rx = ^[ ]*:global-test-result:[ ]* am__copy_in_global_log_rx = ^[ ]*:copy-in-global-log:[ ]* # A command that, given a newline-separated list of test names on the # standard input, print the name of the tests that are to be re-run # upon "make recheck". am__list_recheck_tests = $(AWK) '{ \ recheck = 1; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ { \ if ((getline line2 < ($$0 ".log")) < 0) \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[nN][Oo]/) \ { \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[yY][eE][sS]/) \ { \ break; \ } \ }; \ if (recheck) \ print $$0; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # A command that, given a newline-separated list of test names on the # standard input, create the global log from their .trs and .log files. am__create_global_log = $(AWK) ' \ function fatal(msg) \ { \ print "fatal: making $@: " msg | "cat >&2"; \ exit 1; \ } \ function rst_section(header) \ { \ print header; \ len = length(header); \ for (i = 1; i <= len; i = i + 1) \ printf "="; \ printf "\n\n"; \ } \ { \ copy_in_global_log = 1; \ global_test_result = "RUN"; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".trs"); \ if (line ~ /$(am__global_test_result_rx)/) \ { \ sub("$(am__global_test_result_rx)", "", line); \ sub("[ ]*$$", "", line); \ global_test_result = line; \ } \ else if (line ~ /$(am__copy_in_global_log_rx)[nN][oO]/) \ copy_in_global_log = 0; \ }; \ if (copy_in_global_log) \ { \ rst_section(global_test_result ": " $$0); \ while ((rc = (getline line < ($$0 ".log"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".log"); \ print line; \ }; \ printf "\n"; \ }; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # Restructured Text title. am__rst_title = { sed 's/.*/ & /;h;s/./=/g;p;x;s/ *$$//;p;g' && echo; } # Solaris 10 'make', and several other traditional 'make' implementations, # pass "-e" to $(SHELL), and POSIX 2008 even requires this. Work around it # by disabling -e (using the XSI extension "set +e") if it's set. am__sh_e_setup = case $$- in *e*) set +e;; esac # Default flags passed to test drivers. am__common_driver_flags = \ --color-tests "$$am__color_tests" \ --enable-hard-errors "$$am__enable_hard_errors" \ --expect-failure "$$am__expect_failure" # To be inserted before the command running the test. Creates the # directory for the log if needed. Stores in $dir the directory # containing $f, in $tst the test, in $log the log. Executes the # developer- defined test setup AM_TESTS_ENVIRONMENT (if any), and # passes TESTS_ENVIRONMENT. Set up options for the wrapper that # will run the test scripts (or their associated LOG_COMPILER, if # thy have one). am__check_pre = \ $(am__sh_e_setup); \ $(am__vpath_adj_setup) $(am__vpath_adj) \ $(am__tty_colors); \ srcdir=$(srcdir); export srcdir; \ case "$@" in \ */*) am__odir=`echo "./$@" | sed 's|/[^/]*$$||'`;; \ *) am__odir=.;; \ esac; \ test "x$$am__odir" = x"." || test -d "$$am__odir" \ || $(MKDIR_P) "$$am__odir" || exit $$?; \ if test -f "./$$f"; then dir=./; \ elif test -f "$$f"; then dir=; \ else dir="$(srcdir)/"; fi; \ tst=$$dir$$f; log='$@'; \ if test -n '$(DISABLE_HARD_ERRORS)'; then \ am__enable_hard_errors=no; \ else \ am__enable_hard_errors=yes; \ fi; \ case " $(XFAIL_TESTS) " in \ *[\ \ ]$$f[\ \ ]* | *[\ \ ]$$dir$$f[\ \ ]*) \ am__expect_failure=yes;; \ *) \ am__expect_failure=no;; \ esac; \ $(AM_TESTS_ENVIRONMENT) $(TESTS_ENVIRONMENT) # A shell command to get the names of the tests scripts with any registered # extension removed (i.e., equivalently, the names of the test logs, with # the '.log' extension removed). The result is saved in the shell variable # '$bases'. This honors runtime overriding of TESTS and TEST_LOGS. Sadly, # we cannot use something simpler, involving e.g., "$(TEST_LOGS:.log=)", # since that might cause problem with VPATH rewrites for suffix-less tests. # See also 'test-harness-vpath-rewrite.sh' and 'test-trs-basic.sh'. am__set_TESTS_bases = \ bases='$(TEST_LOGS)'; \ bases=`for i in $$bases; do echo $$i; done | sed 's/\.log$$//'`; \ bases=`echo $$bases` RECHECK_LOGS = $(TEST_LOGS) AM_RECURSIVE_TARGETS = check recheck TEST_SUITE_LOG = test-suite.log TEST_EXTENSIONS = @EXEEXT@ .test LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver LOG_COMPILE = $(LOG_COMPILER) $(AM_LOG_FLAGS) $(LOG_FLAGS) am__set_b = \ case '$@' in \ */*) \ case '$*' in \ */*) b='$*';; \ *) b=`echo '$@' | sed 's/\.log$$//'`; \ esac;; \ *) \ b='$*';; \ esac am__test_logs1 = $(TESTS:=.log) am__test_logs2 = $(am__test_logs1:@EXEEXT@.log=.log) TEST_LOGS = $(am__test_logs2:.test.log=.log) TEST_LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver TEST_LOG_COMPILE = $(TEST_LOG_COMPILER) $(AM_TEST_LOG_FLAGS) \ $(TEST_LOG_FLAGS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALLOCA = @ALLOCA@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ ARCH = @ARCH@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ EXTRA_DIST_SUBDIRS = @EXTRA_DIST_SUBDIRS@ FGREP = @FGREP@ GREP = @GREP@ GTEST_INCLUDES = @GTEST_INCLUDES@ GTEST_LDADD = @GTEST_LDADD@ GTEST_LDFLAGS = @GTEST_LDFLAGS@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LINKPRINT = @LINKPRINT@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PORT_CFLAGS = @PORT_CFLAGS@ PORT_LDFLAGS = @PORT_LDFLAGS@ PORT_SUBDIR = @PORT_SUBDIR@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ subdirs = @subdirs@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ # This is to workaround long long in gtest.h AM_CPPFLAGS = -I$(top_srcdir) -I$(top_srcdir)/IfaceMgr \ -I$(top_srcdir)/Misc -I$(top_srcdir)/poslib \ -I$(top_srcdir)/nettle $(GTEST_INCLUDES) -Wno-long-long \ -Wno-variadic-macros @HAVE_GTEST_TRUE@DnsUpdate_tests_SOURCES = run_tests.cc \ @HAVE_GTEST_TRUE@ DnsUpdate_unittest.cc @HAVE_GTEST_TRUE@DnsUpdate_tests_LDFLAGS = $(AM_LDFLAGS) $(GTEST_LDFLAGS) @HAVE_GTEST_TRUE@DnsUpdate_tests_LDADD = $(GTEST_LDADD) \ @HAVE_GTEST_TRUE@ $(top_builddir)/IfaceMgr/libIfaceMgr.a \ @HAVE_GTEST_TRUE@ $(top_builddir)/Misc/libMisc.a \ @HAVE_GTEST_TRUE@ $(top_builddir)/poslib/libPoslib.a \ @HAVE_GTEST_TRUE@ $(top_builddir)/nettle/libNettle.a \ @HAVE_GTEST_TRUE@ $(top_builddir)/tests/utils/libTestUtils.a all: all-am .SUFFIXES: .SUFFIXES: .cc .lo .log .o .obj .test .test$(EXEEXT) .trs $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign IfaceMgr/tests/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign IfaceMgr/tests/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstPROGRAMS: @list='$(noinst_PROGRAMS)'; test -n "$$list" || exit 0; \ echo " rm -f" $$list; \ rm -f $$list || exit $$?; \ test -n "$(EXEEXT)" || exit 0; \ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ echo " rm -f" $$list; \ rm -f $$list DnsUpdate_tests$(EXEEXT): $(DnsUpdate_tests_OBJECTS) $(DnsUpdate_tests_DEPENDENCIES) $(EXTRA_DnsUpdate_tests_DEPENDENCIES) @rm -f DnsUpdate_tests$(EXEEXT) $(AM_V_CXXLD)$(DnsUpdate_tests_LINK) $(DnsUpdate_tests_OBJECTS) $(DnsUpdate_tests_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/DnsUpdate_unittest.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/run_tests.Po@am__quote@ .cc.o: @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $< .cc.obj: @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .cc.lo: @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LTCXXCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags # Recover from deleted '.trs' file; this should ensure that # "rm -f foo.log; make foo.trs" re-run 'foo.test', and re-create # both 'foo.log' and 'foo.trs'. Break the recipe in two subshells # to avoid problems with "make -n". .log.trs: rm -f $< $@ $(MAKE) $(AM_MAKEFLAGS) $< # Leading 'am--fnord' is there to ensure the list of targets does not # expand to empty, as could happen e.g. with make check TESTS=''. am--fnord $(TEST_LOGS) $(TEST_LOGS:.log=.trs): $(am__force_recheck) am--force-recheck: @: $(TEST_SUITE_LOG): $(TEST_LOGS) @$(am__set_TESTS_bases); \ am__f_ok () { test -f "$$1" && test -r "$$1"; }; \ redo_bases=`for i in $$bases; do \ am__f_ok $$i.trs && am__f_ok $$i.log || echo $$i; \ done`; \ if test -n "$$redo_bases"; then \ redo_logs=`for i in $$redo_bases; do echo $$i.log; done`; \ redo_results=`for i in $$redo_bases; do echo $$i.trs; done`; \ if $(am__make_dryrun); then :; else \ rm -f $$redo_logs && rm -f $$redo_results || exit 1; \ fi; \ fi; \ if test -n "$$am__remaking_logs"; then \ echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \ "recursion detected" >&2; \ else \ am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \ fi; \ if $(am__make_dryrun); then :; else \ st=0; \ errmsg="fatal: making $(TEST_SUITE_LOG): failed to create"; \ for i in $$redo_bases; do \ test -f $$i.trs && test -r $$i.trs \ || { echo "$$errmsg $$i.trs" >&2; st=1; }; \ test -f $$i.log && test -r $$i.log \ || { echo "$$errmsg $$i.log" >&2; st=1; }; \ done; \ test $$st -eq 0 || exit 1; \ fi @$(am__sh_e_setup); $(am__tty_colors); $(am__set_TESTS_bases); \ ws='[ ]'; \ results=`for b in $$bases; do echo $$b.trs; done`; \ test -n "$$results" || results=/dev/null; \ all=` grep "^$$ws*:test-result:" $$results | wc -l`; \ pass=` grep "^$$ws*:test-result:$$ws*PASS" $$results | wc -l`; \ fail=` grep "^$$ws*:test-result:$$ws*FAIL" $$results | wc -l`; \ skip=` grep "^$$ws*:test-result:$$ws*SKIP" $$results | wc -l`; \ xfail=`grep "^$$ws*:test-result:$$ws*XFAIL" $$results | wc -l`; \ xpass=`grep "^$$ws*:test-result:$$ws*XPASS" $$results | wc -l`; \ error=`grep "^$$ws*:test-result:$$ws*ERROR" $$results | wc -l`; \ if test `expr $$fail + $$xpass + $$error` -eq 0; then \ success=true; \ else \ success=false; \ fi; \ br='==================='; br=$$br$$br$$br$$br; \ result_count () \ { \ if test x"$$1" = x"--maybe-color"; then \ maybe_colorize=yes; \ elif test x"$$1" = x"--no-color"; then \ maybe_colorize=no; \ else \ echo "$@: invalid 'result_count' usage" >&2; exit 4; \ fi; \ shift; \ desc=$$1 count=$$2; \ if test $$maybe_colorize = yes && test $$count -gt 0; then \ color_start=$$3 color_end=$$std; \ else \ color_start= color_end=; \ fi; \ echo "$${color_start}# $$desc $$count$${color_end}"; \ }; \ create_testsuite_report () \ { \ result_count $$1 "TOTAL:" $$all "$$brg"; \ result_count $$1 "PASS: " $$pass "$$grn"; \ result_count $$1 "SKIP: " $$skip "$$blu"; \ result_count $$1 "XFAIL:" $$xfail "$$lgn"; \ result_count $$1 "FAIL: " $$fail "$$red"; \ result_count $$1 "XPASS:" $$xpass "$$red"; \ result_count $$1 "ERROR:" $$error "$$mgn"; \ }; \ { \ echo "$(PACKAGE_STRING): $(subdir)/$(TEST_SUITE_LOG)" | \ $(am__rst_title); \ create_testsuite_report --no-color; \ echo; \ echo ".. contents:: :depth: 2"; \ echo; \ for b in $$bases; do echo $$b; done \ | $(am__create_global_log); \ } >$(TEST_SUITE_LOG).tmp || exit 1; \ mv $(TEST_SUITE_LOG).tmp $(TEST_SUITE_LOG); \ if $$success; then \ col="$$grn"; \ else \ col="$$red"; \ test x"$$VERBOSE" = x || cat $(TEST_SUITE_LOG); \ fi; \ echo "$${col}$$br$${std}"; \ echo "$${col}Testsuite summary for $(PACKAGE_STRING)$${std}"; \ echo "$${col}$$br$${std}"; \ create_testsuite_report --maybe-color; \ echo "$$col$$br$$std"; \ if $$success; then :; else \ echo "$${col}See $(subdir)/$(TEST_SUITE_LOG)$${std}"; \ if test -n "$(PACKAGE_BUGREPORT)"; then \ echo "$${col}Please report to $(PACKAGE_BUGREPORT)$${std}"; \ fi; \ echo "$$col$$br$$std"; \ fi; \ $$success || exit 1 check-TESTS: @list='$(RECHECK_LOGS)'; test -z "$$list" || rm -f $$list @list='$(RECHECK_LOGS:.log=.trs)'; test -z "$$list" || rm -f $$list @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ log_list=`for i in $$bases; do echo $$i.log; done`; \ trs_list=`for i in $$bases; do echo $$i.trs; done`; \ log_list=`echo $$log_list`; trs_list=`echo $$trs_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) TEST_LOGS="$$log_list"; \ exit $$?; recheck: all @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ bases=`for i in $$bases; do echo $$i; done \ | $(am__list_recheck_tests)` || exit 1; \ log_list=`for i in $$bases; do echo $$i.log; done`; \ log_list=`echo $$log_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) \ am__force_recheck=am--force-recheck \ TEST_LOGS="$$log_list"; \ exit $$? DnsUpdate_tests.log: DnsUpdate_tests$(EXEEXT) @p='DnsUpdate_tests$(EXEEXT)'; \ b='DnsUpdate_tests'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) .test.log: @p='$<'; \ $(am__set_b); \ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) @am__EXEEXT_TRUE@.test$(EXEEXT).log: @am__EXEEXT_TRUE@ @p='$<'; \ @am__EXEEXT_TRUE@ $(am__set_b); \ @am__EXEEXT_TRUE@ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ @am__EXEEXT_TRUE@ --log-file $$b.log --trs-file $$b.trs \ @am__EXEEXT_TRUE@ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ @am__EXEEXT_TRUE@ "$$tst" $(AM_TESTS_FD_REDIRECT) distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am $(MAKE) $(AM_MAKEFLAGS) check-TESTS check: check-am all-am: Makefile $(PROGRAMS) installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: -test -z "$(TEST_LOGS)" || rm -f $(TEST_LOGS) -test -z "$(TEST_LOGS:.log=.trs)" || rm -f $(TEST_LOGS:.log=.trs) -test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool clean-noinstPROGRAMS \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: check-am install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-TESTS check-am clean \ clean-generic clean-libtool clean-noinstPROGRAMS cscopelist-am \ ctags ctags-am distclean distclean-compile distclean-generic \ distclean-libtool distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-dvi install-dvi-am install-exec \ install-exec-am install-html install-html-am install-info \ install-info-am install-man install-pdf install-pdf-am \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ recheck tags tags-am uninstall uninstall-am # 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: dibbler-1.0.1/IfaceMgr/SocketIPv6.cpp0000644000175000017500000001747012304040124014152 00000000000000/* * Dibbler - a portable DHCPv6 * * authors: Tomasz Mrugalski * Marek Senderski * * released under GNU GPL v2 only licence * * $Id: SocketIPv6.cpp,v 1.20 2008-08-29 00:07:30 thomson Exp $ * */ #include #include #include #include "SocketIPv6.h" #include "Portable.h" #include "DHCPConst.h" #include "Logger.h" using namespace std; /** * static elements of TIfaceSocket class */ int TIfaceSocket::Count=0; int TIfaceSocket::MaxFD=0; /** * creates socket bound to specific address on this interface * @param iface interface name * @param ifindex interface index * @param port UDP port, to which socket will be bound * @param addr IPv6 address * @param ifaceonly force interface-only flag in setsockopt()? * @param reuse should socket be bound with reuse flag in setsockopt()? */ TIfaceSocket::TIfaceSocket(char * iface, int ifindex, int port, SPtr addr, bool ifaceonly, bool reuse) { if (this->Count==0) { FD_ZERO(getFDS()); } this->Count++; this->createSocket(iface, ifindex, addr, port, ifaceonly, reuse); } enum EState TIfaceSocket::getStatus() { return this->Status; } /** * creates socket bound to this interface * @param iface interface name * @param ifaceid interface index * @param port UDP port, to which socket will be bound * @param ifaceonly force interface-only flag in setsockopt()? * @param reuse should socket be bound with reuse flag in setsockopt()? */ TIfaceSocket::TIfaceSocket(char * iface,int ifaceid, int port,bool ifaceonly, bool reuse) { if (this->Count==0) { FD_ZERO(getFDS()); } // bind it to any address (::) char anyaddr[] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}; SPtr smartAny (new TIPv6Addr(anyaddr)); this->createSocket(iface, ifaceid, smartAny, port, ifaceonly, reuse); this->Count++; } /** * creates socket on this interface. * @param iface - interface name * @param ifaceid - interface ID * @param port - port, to which socket will be bound * @param addr - address * @param ifaceonly - force interface-only flag in setsockopt() * @param reuse should socket be bound with reuse flag in setsockopt()? * * @return negative error code (or 0 if everything is ok) */ int TIfaceSocket::createSocket(char * iface, int ifaceid, SPtr addr, int port, bool ifaceonly, bool reuse) { int sock; // store info about this socket strncpy(this->Iface,iface,MAX_IFNAME_LENGTH); this->IfaceID = ifaceid; this->Port = port; this->IfaceOnly = ifaceonly; this->Status = STATE_NOTCONFIGURED; this->Addr = addr; // is this address multicast? So the socket is. if ((addr->getAddr())[0]==(char)0xff) this->Multicast = true; else this->Multicast = false; // create socket sock = sock_add(this->Iface, this->IfaceID, addr->getPlain(), this->Port, ifaceonly?1:0, reuse?1:0); if (sock<0) { printError(sock, iface, ifaceid, addr, port); this->Status = STATE_FAILED; return -3; } this->FD = sock; this->Status = STATE_CONFIGURED; // add FileDescriptior fd_set using FD_SET macro FD_SET(this->FD,this->getFDS()); if (FD>MaxFD) MaxFD = FD; return 0; } /** * sends data through socket * @param buf - buffer to send * @param len - number of bytes to send * @param addr - where send this data * @param port - to which port * returns number of bytes sent or -1 if something went wrong */ int TIfaceSocket::send(char * buf,int len, SPtr addr,int port) { int result; //extern "C" int sock_send(int fd, char * addr, char * buf, int buflen, int port, int ifaceID); result = sock_send(this->FD, addr->getPlain(), buf, len, port, this->IfaceID); if (result<0) { printError(result, this->Iface, this->IfaceID, addr, port); return -1; } /* send success full */ return result; } /** * receives data from socket * @param buf - received data are stored here * @param addr - will contain info about sender */ int TIfaceSocket::recv(char * buf, SPtr addr) { char myPlainAddr[48]; char peerPlainAddr[48]; // maximum DHCPv6 packet size int len=1500; len = sock_recv(this->FD, myPlainAddr, peerPlainAddr, buf, len); if ( len < 0 ) { printError(len, this->Iface, this->IfaceID, addr, this->Port); return -1; } // convert to packed form (plain->16-byte) char packedAddr[16]; inet_pton6(peerPlainAddr,packedAddr); addr->setAddr(packedAddr); return len; } /** * returns FDS - FileDescriptorSet * it's some really weird POSIX macro. It uses FD_SET, FD_ZERO and FD_CLR macros * defined somewhere in system headers */ fd_set * TIfaceSocket::getFDS() { static fd_set FDS; return &FDS; } /** * returns FileDescritor */ int TIfaceSocket::getFD() { return this->FD; } /** * returns interface ID */ int TIfaceSocket::getIfaceID() { return this->IfaceID; } /** * returns port */ int TIfaceSocket::getPort() { return this->Port; } /** * returns address */ SPtr TIfaceSocket::getAddr() { return this->Addr; } /** * closes socket, and removes its number from FDS */ TIfaceSocket::~TIfaceSocket() { if (Status!=STATE_CONFIGURED) return; Log(Debug) << "Closing socket " << this->FD << " on " << Addr->getPlain() << ":" << Port << " on interface " << Iface << "/" << IfaceID << LogEnd; //execute low-level function sock_del(this->FD); FD_CLR(this->FD,getFDS()); this->Count--; } void TIfaceSocket::printError(int error, char * iface, int ifaceid, SPtr addr, int port) { // detect errors switch (error) { case LOWLEVEL_ERROR_UNSPEC: Log(Error) << "Unable to create socket. Is IPv6 protocol supported in your system?" << LogEnd; break; case LOWLEVEL_ERROR_BIND_IFACE: Log(Error) << "Unable to bind socket to interface " << this->Iface << "/" << this->IfaceID << "." << LogEnd; break; case LOWLEVEL_ERROR_BIND_FAILED: Log(Error) << "Unable to bind socket (iface=" << iface << "/" << ifaceid << ", addr=" << addr->getPlain() << ", port=" << this->Port << ")." << LogEnd; break; case LOWLEVEL_ERROR_MCAST_HOPS: Log(Error) << "Unable to set multicast hops. (iface= " << iface << "/" << ifaceid << ", addr=" << *this->Addr << ", port=" << this->Port << ")" << LogEnd; break; case LOWLEVEL_ERROR_MCAST_MEMBERSHIP: Log(Error) << "Unable to perform multicast group operation." << LogEnd; break; case LOWLEVEL_ERROR_GETADDRINFO: Log(Error) << "getaddrinfo() failed. Is IPv6 protocol supported by your system?" << LogEnd; break; case LOWLEVEL_ERROR_SOCK_OPTS: Log(Error) << "Unable to set up socket options." << LogEnd; break; case LOWLEVEL_ERROR_REUSE_FAILED: Log(Error) << "Unable to set up socket option SO_REUSEADDR" << LogEnd; break; default: break; } if (error_message()) { Log(Error) << "Low-level layer error message: " << error_message() << LogEnd; } } // -------------------------------------------------------------------- // --- operators ------------------------------------------------------ // -------------------------------------------------------------------- /* * flush this data in XML format */ std::ostream & operator <<(std::ostream & strum, TIfaceSocket &x) { strum << dec << "" << endl; return strum; } dibbler-1.0.1/IfaceMgr/Iface.h0000644000175000017500000000521712304040124012665 00000000000000/* * Dibbler - a portable DHCPv6 * * authors: Tomasz Mrugalski * Marek Senderski * * released under GNU GPL v2 only licence * */ #ifndef IFACEIFACE_H #define IFACEIFACE_H #include #include "Portable.h" #include "SmartPtr.h" #include "Container.h" #include "SocketIPv6.h" #include "IPv6Addr.h" /* * represents network interface */ class TIfaceIface{ public: friend std::ostream & operator <<(std::ostream & strum, TIfaceIface &x); TIfaceIface(const char * name, int id, unsigned int flags, char* mac, int maclen, char* llAddr, int llAddrCnt, char * globalAddr, int globalCnt, int hwType); char * getName(); int getID(); std::string getFullName(); // ---flags related--- unsigned int getFlags(); bool flagUp(); bool flagRunning(); bool flagMulticast(); bool flagLoopback(); void updateState(struct iface * x); // --- RA bits --- void setMBit(bool m); void setOBit(bool o); bool getMBit(); bool getOBit(); // ---layer-2 related--- int getMacLen(); char* getMac(); int getHardwareType(); char* firstLLAddress(); char* getLLAddress(); int countLLAddress(); void firstGlobalAddr(); SPtr getGlobalAddr(); unsigned int countGlobalAddr(); void addGlobalAddr(SPtr addr); void delGlobalAddr(SPtr addr); // ---address related--- bool addAddr(SPtr addr, long pref, long valid, int prefixLen); bool delAddr(SPtr addr, int prefixLen); bool updateAddr(SPtr addr, long pref, long valid); void setPrefixLength(int len); int getPrefixLength(); // ---socket related--- bool addSocket(SPtr addr,int port, bool ifaceonly, bool reuse); // bool addSocket(int port, bool ifaceonly, bool reuse); bool delSocket(int id); void firstSocket(); SPtr getSocketByFD(int fd); SPtr getSocket(); SPtr getSocketByAddr(SPtr addr); int countSocket(); virtual ~TIfaceIface(); protected: // ---interface data--- char Name[MAX_IFNAME_LENGTH]; int ID; unsigned int Flags; char* Mac; int Maclen; char* LLAddr; int LLAddrCnt; bool M_bit_; // M (managed) bit from Router Advertisement bool O_bit_; // O (other conf) bit from Router Advertisement List(TIPv6Addr) GlobalAddrLst; int HWType; // sockets List(TIfaceSocket) SocketsLst; char* PresLLAddr; int PrefixLen; // used during address adding }; typedef std::list < SPtr > TIfaceIfaceLst; #endif dibbler-1.0.1/IfaceMgr/Makefile.am0000644000175000017500000000054412277722750013564 00000000000000SUBDIRS = . if HAVE_GTEST SUBDIRS += tests endif noinst_LIBRARIES = libIfaceMgr.a libIfaceMgr_a_CPPFLAGS = -I$(top_srcdir)/poslib/poslib -I$(top_srcdir)/poslib -I$(top_srcdir)/Misc -I$(top_srcdir)/Messages -I$(top_srcdir)/Options libIfaceMgr_a_SOURCES = DNSUpdate.cpp DNSUpdate.h Iface.cpp Iface.h IfaceMgr.cpp IfaceMgr.h SocketIPv6.cpp SocketIPv6.h dibbler-1.0.1/IfaceMgr/IfaceMgr.cpp0000664000175000017500000003426012560471634013712 00000000000000/* * Dibbler - a portable DHCPv6 * * authors: Tomasz Mrugalski * Marek Senderski * * released under GNU GPL v2 only licence * */ #include #include #include #include #include #include #include #include #include "Portable.h" #include "IfaceMgr.h" #include "Iface.h" #include "SocketIPv6.h" #include "Logger.h" #include "Msg.h" #include "OptIAAddress.h" #include "OptIAPrefix.h" #include "ScriptParams.h" using namespace std; /// constructor /// /// @param xmlFile xml file, where interface info will be stored /// @param getIfaces specifies if interfaces should be detected TIfaceMgr::TIfaceMgr(const std::string& xmlFile, bool getIfaces) { this->XmlFile = xmlFile; this->IsDone = false; struct iface * ptr; struct iface * ifaceList; if (!getIfaces) return; // get interface list ifaceList = if_list_get(); // external (C coded) function ptr = ifaceList; if (!ifaceList) { IsDone = true; Log(Crit) << "Unable to read info interfaces. Make sure " << "you are using proper port (i.e. win32 on WindowsXP or 2003)" << " and you have IPv6 support enabled." << LogEnd; return; } while (ptr!=NULL) { Log(Notice) << "Detected iface " << ptr->name << "/" << ptr->id // << ", flags=" << ptr->flags << ", MAC=" << this->printMac(ptr->mac, ptr->maclen) << "." << LogEnd; SPtr iface(new TIfaceIface(ptr->name,ptr->id, ptr->flags, ptr->mac, ptr->maclen, ptr->linkaddr, ptr->linkaddrcount, ptr->globaladdr, ptr->globaladdrcount, ptr->hardwareType)); iface->setMBit(ptr->m_bit); iface->setOBit(ptr->o_bit); this->IfaceLst.append(iface); ptr = ptr->next; } if_list_release(ifaceList); // allocated in pure C, and so release it there dump(); } /* * returns true if IfaceMgr has finished it's job (failed to get info about interfaces) */ bool TIfaceMgr::isDone() { return IsDone; } /* * rewinds interface list to first interface */ void TIfaceMgr::firstIface() { IfaceLst.first(); } /* * gets next interface on list */ SPtr TIfaceMgr::getIface() { return IfaceLst.get(); } /* * gets interface by it's name (or NULL if no such inteface exists) * @param name - interface name */ SPtr TIfaceMgr::getIfaceByName(const std::string& name) { SPtr ptr; IfaceLst.first(); while ( ptr = IfaceLst.get() ) { if ( !strcmp(name.c_str(),ptr->getName()) ) return ptr; } return SPtr(); // NULL } /* * gets interface by it ID (or NULL if no such interface exists) * @param id - interface id */ SPtr TIfaceMgr::getIfaceByID(int id) { SPtr ptr; IfaceLst.first(); while ( ptr = IfaceLst.get() ) { if ( id == ptr->getID() ) return ptr; } return SPtr(); // NULL } /* * gets interface by socket descriptor (or NULL if no such interface exists) */ SPtr TIfaceMgr::getIfaceBySocket(int fd) { SPtr ptr; IfaceLst.first(); while ( ptr = IfaceLst.get() ) { if ( ptr->getSocketByFD(fd) ) return ptr; } return SPtr(); // NULL } /// tries to read data from any socket on all interfaces /// returns after time seconds. /// @param time listens for time seconds /// @param buf buffer /// @param bufsize buffer size /// @param peer [out] sender address /// @param myaddr [out] local IPv6 address /// /// @return socket descriptor (or negative values for errors) int TIfaceMgr::select(unsigned long time, char *buf, int &bufsize, SPtr peer, SPtr myaddr) { struct timeval czas; int result; if (time > DHCPV6_INFINITY/2) time /=2; #ifdef BSD // For some reason, Darwin kernel doesn't like too large timeout values if (time > DHCPV6_INFINITY/4) time = 3600*24*7; // a week is enough #endif czas.tv_sec=time; czas.tv_usec=0; // tricks with FDS macros fd_set fds; fds = *TIfaceSocket::getFDS(); int maxFD; maxFD = TIfaceSocket::getMaxFD() + 1; // no sockets to listen on... hopefully this is just inactive mode, // not an error if (!TIfaceSocket::getCount()) { Log(Debug) << "No sockets open. Sleeping for " << time << " seconds." << LogEnd; #ifdef WIN32 Sleep(time*1000); // Windows sleep is specified in milliseconds #else sleep(time); // Posix sleep is specified in seconds #endif return 0; } result = ::select(maxFD, &fds, NULL, NULL, &czas); // something received if (result==0) { // timeout, nothing received bufsize = 0; return -1; } if (result<0) { char buf[512]; strncpy(buf, strerror(errno),512); Log(Debug) << "Failed to read sockets (select() returned " << result << "), error=" << buf << LogEnd; return -1; } SPtr iface; SPtr sock; bool found = 0; IfaceLst.first(); while ( (!found) && (iface = IfaceLst.get()) ) { iface->firstSocket(); while ( sock = iface->getSocket() ) { if (FD_ISSET(sock->getFD(),&fds)) { found = true; break; } } } if (!found) { Log(Error) << "Internal error. Can't find any socket with incoming data." << LogEnd; return -1; } char myPlainAddr[48]; // my plain address char peerPlainAddr[48]; // peer plain address // receive data (pure C function used) result = sock_recv(sock->getFD(), myPlainAddr, peerPlainAddr, buf, bufsize); char peerAddrPacked[16]; char myAddrPacked[16]; inet_pton6(peerPlainAddr,peerAddrPacked); inet_pton6(myPlainAddr,myAddrPacked); peer->setAddr(peerAddrPacked); myaddr->setAddr(myAddrPacked); if (result==-1) { Log(Error) << "Socket recv() failure detected." << LogEnd; bufsize = 0; return -1; } #ifdef MOD_SRV_DST_ADDR_CHECK // check if we've received data addressed to us. There's problem with sockets binding. // If there are 2 open sockets (one bound to multicast and one to global address), // each packet sent on multicast address is also received on unicast socket. char anycast[16] = {0}; if (!iface->flagLoopback() && memcmp(sock->getAddr()->getAddr(), myAddrPacked, 16) && memcmp(sock->getAddr()->getAddr(), anycast, 16) ) { Log(Debug) << "Received data on address " << myPlainAddr << ", expected " << *sock->getAddr() << ", message ignored." << LogEnd; bufsize = 0; return -1; } #endif bufsize = result; return sock->getFD(); } /* * returns interface count */ int TIfaceMgr::countIface() { return IfaceLst.count(); } /* * dump yourself to file */ void TIfaceMgr::dump() { std::ofstream xmlDump; xmlDump.open(this->XmlFile.c_str()); xmlDump << *this; xmlDump.close(); } /* * destructor. Does really nothing. (SPtr is a sweet thing, isn't it?) */ TIfaceMgr::~TIfaceMgr() { closeSockets(); } string TIfaceMgr::printMac(char * mac, int macLen) { ostringstream tmp; int i; unsigned char x; for (i=0; i opt, std::string txtPrefix ) { switch (opt->getOptType()) { case OPTION_IA_NA: case OPTION_IA_TA: { opt->firstOption(); while (SPtr subopt = opt->getOption()) { if (subopt->getOptType() == OPTION_IAADDR) { SPtr addr = (Ptr*) subopt; params.addAddr(addr->getAddr(), addr->getPref(), addr->getValid(), txtPrefix); } } break; } case OPTION_IA_PD: { opt->firstOption(); while (SPtr subopt = opt->getOption()) { if (subopt->getOptType() == OPTION_IAPREFIX) { SPtr prefix = (Ptr*) subopt; params.addPrefix(prefix->getPrefix(), prefix->getPrefixLength(), prefix->getPref(), prefix->getValid()); } } break; } case OPTION_NEXT_HOP: { if (opt->countOption()) { // suboptions defined opt->firstOption(); while (SPtr subopt = opt->getOption()) { if (subopt->getOptType() != OPTION_RTPREFIX) continue; // ignore other options params.addParam("OPTION_NEXT_HOP_RTPREFIX", opt->getPlain() + " " + subopt->getPlain()); } } else { // no suboptions, just NEXT_HOP (default router, without ::/0 route specified) // Will define something like this: OPTION_NEXT_HOP=2001:db8:1::1 params.addParam("OPTION_NEXT_HOP", opt->getPlain()); } break; } case OPTION_RTPREFIX: { params.addParam("OPTION_RTPREFIX", opt->getPlain()); break; } default: { stringstream tmp; if (txtPrefix.length()) { tmp << txtPrefix << "_"; } tmp << "OPTION" << opt->getOptType(); params.addParam(tmp.str().c_str(), opt->getPlain()); break; } } } void TIfaceMgr::notifyScripts(const std::string& scriptName, SPtr question, SPtr reply) { TNotifyScriptParams* params = (TNotifyScriptParams*)reply->getNotifyScriptParams(); if (params) { notifyScripts(scriptName, question, reply, *params); } else { TNotifyScriptParams par; notifyScripts(scriptName, question, reply, par); } } void TIfaceMgr::notifyScript(const std::string& scriptName, std::string action, TNotifyScriptParams& params) { const char * argv[3]; // get PATH char * path = getenv("PATH"); if (path) { params.addParam("PATH", string(path)); } // parameters: [0] - script name, [1] - action (add, modify, delete) argv[0] = scriptName.c_str(); argv[1] = action.c_str(); argv[2] = NULL; Log(Debug) << "About to execute " << scriptName << " script, " << params.envCnt << " variables." << LogEnd; int returnCode = execute(scriptName.c_str(), argv, params.env); if (returnCode>=0) { Log(Debug) << "Script execution complete, return code=" << returnCode << LogEnd; } else { // negative return code, something went wrong Log(Warning) << "Script execution failed, return code=" << returnCode << LogEnd; } } void TIfaceMgr::notifyScripts(const std::string& scriptName, SPtr question, SPtr reply, TNotifyScriptParams& params) { if (!scriptName.length()) { Log(Debug) << "Not executing external script (Notify script disabled)." << LogEnd; return; } stringstream tmp; string action; switch (question->getType()) { case REQUEST_MSG: case CONFIRM_MSG: action = "add"; break; case RELEASE_MSG: action = "delete"; break; case RENEW_MSG: case REBIND_MSG: case INFORMATION_REQUEST_MSG: action = "update"; break; default: Log(Debug) << "Script execution skipped for " << reply->getName() << " response to " << question->getName() << ". No action needed for this message type." << LogEnd; return; } int ifindex = reply->getIface(); SPtr iface = (Ptr*)getIfaceByID(ifindex); if (!iface) { Log(Error) << "Unable to find interface with ifindex=" << ifindex << ". Script NOT called." << LogEnd; return; } params.addParam("IFACE", iface->getName()); tmp << dec << (int)iface->getID(); params.addParam("IFINDEX", tmp.str().c_str()); tmp.str(""); string remote; if (reply->getRemoteAddr()) { remote = reply->getRemoteAddr()->getPlain(); } else { remote = string(ALL_DHCP_RELAY_AGENTS_AND_SERVERS); } params.addParam("REMOTE_ADDR", remote); params.addParam("CLNT_MESSAGE", question->getName()); params.addParam("SRV_MESSAGE", reply->getName()); // add options from server REPLY reply->firstOption(); while ( SPtr opt = reply->getOption() ) { optionToEnv(params, opt, "SRV"); } // add options from client message question->firstOption(); while( SPtr opt = question->getOption() ) { optionToEnv(params, opt, "CLNT"); } notifyScript(scriptName, action, params); } /// @brief closes all sockets void TIfaceMgr::closeSockets() { Log(Debug) << "Closing all sockets." << LogEnd; firstIface(); while (SPtr iface = getIface()) { iface->firstSocket(); while (SPtr socket = iface->getSocket()) { iface->delSocket(socket->getFD()); } } } // -------------------------------------------------------------------- // --- operators ------------------------------------------------------ // -------------------------------------------------------------------- /* * just flush this data in XML format (used for logging and debugging purposes only) */ ostream & operator <<(ostream & strum, TIfaceMgr &x) { strum << "" << endl; SPtr ptr; x.IfaceLst.first(); while ( ptr=x.IfaceLst.get() ) { strum << *ptr; } strum << "" << endl; return strum; } dibbler-1.0.1/IfaceMgr/DNSUpdate.cpp0000644000175000017500000003137712277722750014033 00000000000000/* * Dibbler - a portable DHCPv6 * * authors: Adrien CLERC, Bahattin DEMIRPLAK, Gaëtant ELEOUET * Mickaël GUÉRIN, Lionel GUILMIN, Lauréline PROVOST * from ENSEEIHT, Toulouse, France * changes: Krzysztof Wnuk * Michal Kowalczuk * Tomasz Mrugalski * released under GNU GPL v2 licence * */ #include "DNSUpdate.h" #include "Portable.h" #include "Logger.h" #include #include "sha256.h" using namespace std; _addr ToPoslibAddr(const std::string& text_addr) { _addr dst; memset(&dst, 0, sizeof(dst)); // It seems that Windows now have sockaddr_storage with ss_family field. // It used to be sa_family on earlier Windows. // dst.sa_family = AF_INET6; dst.ss_family = AF_INET6; txt_to_addr(&dst, text_addr.c_str()); return dst; } DNSUpdate::DNSUpdate(const std::string& dns_address, const std::string& zonename, const std::string& hostname, std::string hostip, DnsUpdateMode updateMode, DnsUpdateProtocol proto /* = DNSUPDATE_TCP */) :Message_(NULL), DnsAddr_(dns_address), Hostip_(hostip), UpdateMode_(updateMode), Proto_(proto), Fudge_(0) { if (UpdateMode_ == DNSUPDATE_AAAA || UpdateMode_ == DNSUPDATE_AAAA_CLEANUP) { splitHostDomain(hostname); } else { Hostname_ = hostname; Zoneroot_ = domainname(zonename.c_str()); } TTL_ = string(DNSUPDATE_DEFAULT_TTL); } DNSUpdate::~DNSUpdate() { if (Message_) delete Message_; } /** * splits fqdn (e.g. malcolm.example.com) into hostname (e.g. malcolm) and domain (e.g. example.com) * * @param fqdnName */ void DNSUpdate::splitHostDomain(std::string fqdnName) { std::string::size_type dotpos = fqdnName.find("."); string hostname = ""; string domain = ""; if (dotpos == string::npos) { Log(Warning) << "Name provided for DNS update is not a FQDN. [" << fqdnName << "]." << LogEnd; Hostname_ = fqdnName; } else { Hostname_ = fqdnName.substr(0, dotpos); string domain = fqdnName.substr(dotpos + 1, fqdnName.length() - dotpos - 1); Zoneroot_ = domainname(domain.c_str()); } } DnsUpdateResult DNSUpdate::run(int timeout){ Log(Info) << "DDNS: Performing DNS Update over " << protoToString() << ", DNS address=" << DnsAddr_; try { switch (UpdateMode_) { case DNSUPDATE_PTR: Log(Cont) << ": Add PTR record." << LogEnd; createSOAMsg(); addinMsg_delOldRR(); addinMsg_newPTR(); break; case DNSUPDATE_PTR_CLEANUP: Log(Cont) << ": Cleanup PTR record." << LogEnd; createSOAMsg(); addinMsg_delOldRR(); deletePTRRecordFromRRSet(); break; case DNSUPDATE_AAAA: Log(Cont) << ": Add AAAA record." << LogEnd; createSOAMsg(); addinMsg_delOldRR(); addinMsg_newAAAA(); break; case DNSUPDATE_AAAA_CLEANUP: Log(Cont) << ": Cleanup AAAA record." << LogEnd; createSOAMsg(); addinMsg_delOldRR(); deleteAAAARecordFromRRSet(); break; } } catch (const PException& p) { Log(Warning) << "DNS Update failed: " << p.message << LogEnd; return DNSUPDATE_ERROR; } if (Keyname_.length()>0) { // Add TSIG Message_->tsig_rr = tsig_record(domainname(Keyname_.c_str()), Fudge_, domainname(Algorithm_.c_str())); Message_->sign_key = Key_; } try { sendMsg(timeout); } catch (const PException& p) { DnsUpdateResult result = DNSUPDATE_ERROR; if (strstr(p.message,"Could not connect TCP socket") ){ result = DNSUPDATE_CONNFAIL; } if (!strcmp(p.message,"NOTAUTH")){ Log(Error) << "DDNS: Nameserver returned NOTAUTH error." << LogEnd; result = DNSUPDATE_SRVNOTAUTH; } Log(Error) << "DDNS: Update failed. Error: " << p.message << "." << LogEnd; return result; }// exeption catch return DNSUPDATE_SUCCESS; } /** * create new message for Dns Update * */ void DNSUpdate::createSOAMsg(){ Message_ = new DnsMessage(); Message_->OPCODE = OPCODE_UPDATE; Message_->questions.push_back(DnsQuestion(Zoneroot_, DNS_TYPE_SOA, CLASS_IN)); } /** * insert a new-AAAA entry in message * */ void DNSUpdate::addinMsg_newAAAA(){ DnsRR rr; rr.NAME = domainname(Hostname_.c_str(), Zoneroot_); rr.TYPE = qtype_getcode("AAAA", false); rr.TTL = txt_to_int(TTL_.c_str()); string data = rr_fromstring(rr.TYPE, Hostip_.c_str(), Zoneroot_); rr.RDLENGTH = data.size(); rr.RDATA = (unsigned char*)memdup(data.c_str(), rr.RDLENGTH); Message_->authority.push_back(rr); Log(Info) << "DDNS: AAAA update:" << rr.NAME.tostring() << " -> " << Hostip_ << LogEnd; } void DNSUpdate::addDHCID(const char* duid, int duidlen) { DnsRR rr; rr.NAME = domainname(Hostname_.c_str(), Zoneroot_); rr.TYPE = qtype_getcode("DHCID", false); rr.TTL = txt_to_int(TTL_.c_str()); char input_buf[512]; char output_buf[35]; // identifier-type code (2) + digest type code (1) + digest (SHA-256 = 32 bytes) memcpy(input_buf, duid, duidlen); // memcpy(input_buf+duidlen, rr.NAME.c_str(), strlen((const char*)rr.NAME.c_str()) ); sha256_buffer(input_buf, duidlen + strlen((const char*)rr.NAME.c_str() ), output_buf+3); output_buf[0] = 0; output_buf[1] = 2; // identifier-type code: 0x0002 - DUID used as client identifier output_buf[2] = 1; // digest type = 1 (SHA-256) Message_->authority.push_back(rr); } /// @brief sets keys used for Transaction Signature (TSIG) /// /// One can use dnssec-keygen from bind9 to generate such a key /// /// @param keyname name of the key (e.g. "ddns-key") /// @param base64encoded the actual key (e.g. 9SYMLnjK2ohb1N/56GZ5Jg==) /// @param algo Algorithm name /// @param fudge max difference between us signing and they are receiving void DNSUpdate::setTSIG(const std::string& keyname, const std::string& base64encoded, const std::string& algo, uint32_t fudge) { Keyname_ = keyname; Key_ = base64encoded; Algorithm_ = algo; Fudge_ = fudge; } /** * delete a single rr from rrset. If no such RRs exist, then this Update RR will be * silently ignored by the primary master. * */ void DNSUpdate::deleteAAAARecordFromRRSet(){ DnsRR rr; rr.NAME = domainname(Hostname_.c_str(), Zoneroot_); rr.TYPE = qtype_getcode("AAAA", false); rr.CLASS = QCLASS_NONE; /* 254 */ rr.TTL = 0; string data = rr_fromstring(rr.TYPE, Hostip_.c_str(), Zoneroot_); rr.RDLENGTH = data.size(); rr.RDATA = (unsigned char*)memdup(data.c_str(), rr.RDLENGTH); Message_->authority.push_back(rr); Log(Debug) << "DDNS: AAAA record created:" << rr.NAME.tostring() << " -> " << Hostip_ << LogEnd; } void DNSUpdate::deletePTRRecordFromRRSet(){ DnsRR rr; const int bufSize = 128; char destination[16]; char result[bufSize]; memset(result, 0, bufSize); inet_pton6(Hostip_.c_str(), destination); doRevDnsAddress(destination,result); rr.NAME = result; rr.TYPE = qtype_getcode("PTR", false); rr.CLASS = QCLASS_NONE; rr.TTL = 0; string tmp = string(Hostname_); string data = rr_fromstring(rr.TYPE, tmp.c_str()); rr.RDLENGTH = data.size(); rr.RDATA = (unsigned char*)memdup(data.c_str(), rr.RDLENGTH); Message_->authority.push_back(rr); Log(Info) << "DDNS: PTR record created: " << result << " -> " << tmp << LogEnd; } /** * insert a new-PTR entry in message * */ void DNSUpdate::addinMsg_newPTR(){ DnsRR rr; const int bufSize = 128; char destination[16]; char result[bufSize]; memset(result, 0, bufSize); inet_pton6(Hostip_.c_str(), destination); doRevDnsAddress(destination,result); rr.NAME = result; rr.TYPE = qtype_getcode("PTR", false); rr.TTL = txt_to_int(TTL_.c_str()); string tmp = string(Hostname_); string data = rr_fromstring(rr.TYPE, tmp.c_str()); rr.RDLENGTH = data.size(); rr.RDATA = (unsigned char*)memdup(data.c_str(), rr.RDLENGTH); Message_->authority.push_back(rr); Log(Debug) << "DDNS: PTR record created: " << result << " -> " << tmp << LogEnd; } /** * insert a delete-RR entry in message for deleting old entry * */ void DNSUpdate::addinMsg_delOldRR(){ //get old, available DnsRR from Dns Server DnsRR* oldDnsRR=this->get_oldDnsRR(); if (oldDnsRR){ //delete message oldDnsRR->CLASS = QCLASS_NONE; oldDnsRR->TTL = 0; Message_->authority.push_back(*oldDnsRR); delete oldDnsRR; } } /** * check hostname-RR entry is available in response message(xfr) from server * * @param msg - DnsMessage response from server * @param RemoteDnsRR - if DnsRR entry is available set RR record in RemoteDnsRR * * @return true - if RR record available, otherwise returns false */ bool DNSUpdate::DnsRR_avail(DnsMessage *msg, DnsRR& RemoteDnsRR){ //check axfr_message bool flagSOA = false; if (msg->answers.empty()) { delete msg; return false; } stl_list(DnsRR)::iterator it = msg->answers.begin(); it++; while (it != msg->answers.end()) { if (it->TYPE == DNS_TYPE_SOA) { flagSOA = !flagSOA; } else { if (!flagSOA) { if ( !strcmp(Hostname_.c_str(),(it->NAME.label(0)).c_str()) ){ RemoteDnsRR=*it; delete msg; return true; } } } it++; } delete msg; return false; } /** get old RR entry from Dns Server */ DnsRR* DNSUpdate::get_oldDnsRR(){ DnsRR* RemoteDnsRR= NULL; DnsMessage *q = NULL, *a = NULL; int sockid = -1; try { q = create_query(Zoneroot_, QTYPE_AXFR); pos_cliresolver res; /// @todo: Make this over UDP or TCP, not always TCP (TCP blocks on connect()) _addr dnsAddr = ToPoslibAddr(DnsAddr_); sockid = res.tcpconnect(&dnsAddr); res.tcpsendmessage(q, sockid); res.tcpwaitanswer(a, sockid); if (!a) { throw PException("tcpwaitanswer returned NULL"); } if (a->RCODE != RCODE_NOERROR){ throw PException((char*)str_rcode(a->RCODE).c_str()); } if (!a->answers.empty()) { RemoteDnsRR = new DnsRR(); if (this->DnsRR_avail(a,*RemoteDnsRR) == false) { delete RemoteDnsRR; RemoteDnsRR = NULL; } } if (a) { // delete a; /// @todo: Why is this commented out? Memory leak! a = 0; } if (q) { delete q; q = 0; } if (sockid != -1) tcpclose(sockid); return RemoteDnsRR; } catch (const PException& p) { if (q) { delete q; q = NULL; } if (a) { delete a; a = NULL; } if (sockid != -1) tcpclose(sockid); if (RemoteDnsRR) delete RemoteDnsRR; Log(Error) << "DDNS: Attempt to get old DNS record failed:" << p.message << LogEnd; return 0; } } void DNSUpdate::sendMsg(unsigned int timeout) { switch (Proto_) { case DNSUPDATE_TCP: sendMsgTCP(timeout); return; case DNSUPDATE_UDP: sendMsgUDP(timeout); return; default: Log(Error) << "DDNS: Invalid protocol (non-TCP, non-UDP) specified." << LogEnd; } return; } /** send Update Message to server*/ void DNSUpdate::sendMsgTCP(unsigned int timeout){ DnsMessage *a = NULL; int sockid = -1; try { pos_cliresolver res; res.tcp_timeout = timeout; _addr dnsAddr = ToPoslibAddr(DnsAddr_); sockid = res.tcpconnect(&dnsAddr); res.tcpsendmessage(Message_, sockid); res.tcpwaitanswer(a, sockid); if (a->RCODE != RCODE_NOERROR) { throw PException((char*)str_rcode(a->RCODE).c_str()); } } catch (const PException& p) { if (a) delete a; if (sockid != -1) tcpclose(sockid); throw PException(p.message); } if (a) delete a; if (sockid != -1) tcpclose(sockid); } void DNSUpdate::sendMsgUDP(unsigned int timeout) { DnsMessage *a = NULL; try { pos_cliresolver res; res.udp_tries[0] = timeout; res.n_udp_tries = 1; // just one timeout _addr dnsAddr = ToPoslibAddr(DnsAddr_); res.query(Message_, a, &dnsAddr, Q_NOTCP); if (!a) { throw PException("DNS server asnwer not received"); } if (a->RCODE != RCODE_NOERROR) { throw PException((char*)str_rcode(a->RCODE).c_str()); } } catch (const PException& p) { if (a) delete a; throw PException(p.message); } if (a) delete a; } /** * prints status reported by result * * @param result */ void DNSUpdate::showResult(int result) { switch (result) { case DNSUPDATE_SUCCESS: if (UpdateMode_ == DNSUPDATE_AAAA || UpdateMode_ == DNSUPDATE_PTR) Log(Debug) << "DDNS: DNS Update (add) successful." << LogEnd; else Log(Debug) << "DDNS: DNS Update (delete) successful." << LogEnd; break; case DNSUPDATE_ERROR: Log(Warning) << "DDNS: DNS Update failed." << LogEnd; break; case DNSUPDATE_CONNFAIL: Log(Warning) << "DDNS: Unable to establish connection to the DNS server." << LogEnd; break; case DNSUPDATE_SRVNOTAUTH: Log(Warning) << "DDNS: DNS Update failed: server returned NOTAUTH." << LogEnd; break; case DNSUPDATE_SKIP: Log(Debug) << "DDNS: DNS Update was skipped." << LogEnd; break; } } std::string DNSUpdate::protoToString() { switch(Proto_) { case DNSUPDATE_TCP: return "TCP"; case DNSUPDATE_UDP: return "UDP"; default: case DNSUPDATE_ANY: return "ANY"; } } dibbler-1.0.1/IfaceMgr/IfaceMgr.h0000644000175000017500000000330412420530776013346 00000000000000/* * Dibbler - a portable DHCPv6 * * authors: Tomasz Mrugalski * Marek Senderski * * released under GNU GPL v2 only licence * */ class TIfaceMgr; #ifndef IFACEMGR_H #define IFACEMGR_H #include "SmartPtr.h" #include "Container.h" #include "ScriptParams.h" #include "Iface.h" class TMsg; class TOpt; class TIfaceMgr { public: friend std::ostream & operator <<(std::ostream & strum, TIfaceMgr &x); TIfaceMgr(const std::string& xmlFile, bool getIfaces); // ---Iface related--- void firstIface(); SPtr getIface(); SPtr getIfaceByName(const std::string& name); SPtr getIfaceByID(int id); virtual SPtr getIfaceBySocket(int fd); int countIface(); // ---other--- int select(unsigned long time, char *buf, int &bufsize, SPtr peer, SPtr myaddr); std::string printMac(char * mac, int macLen); void dump(); bool isDone(); virtual void notifyScripts(const std::string& scriptName, SPtr question, SPtr answer); virtual void notifyScripts(const std::string& scriptName, SPtr question, SPtr answer, TNotifyScriptParams& params); virtual void notifyScript(const std::string& scriptName, std::string action, TNotifyScriptParams& params); virtual void closeSockets(); virtual ~TIfaceMgr(); protected: virtual void optionToEnv(TNotifyScriptParams& params, SPtr opt, std::string txtPrefix ); std::string XmlFile; List(TIfaceIface) IfaceLst; //Interface list bool IsDone; }; #endif dibbler-1.0.1/IfaceMgr/Iface.cpp0000644000175000017500000002635412556506161013246 00000000000000/* * Dibbler - a portable DHCPv6 * * authors: Tomasz Mrugalski * Marek Senderski * * released under GNU GPL v2 only licence * */ #include #include #include #include #include #ifdef WIN32 #include #else #include #include #endif #include "Iface.h" #include "Portable.h" #include "Logger.h" using namespace std; /* * stores informations about interface */ TIfaceIface::TIfaceIface(const char * name, int id, unsigned int flags, char* mac, int maclen, char* llAddr, int llAddrCnt, char * globalAddr, int globalCnt, int hwType) :Mac(new char[maclen]),Maclen(maclen), M_bit_(false), O_bit_(false) { snprintf(this->Name,MAX_IFNAME_LENGTH,"%s",name); this->ID = id; this->Flags = flags; // store mac address memcpy(this->Mac,mac,maclen); // store all link-layer addresses this->LLAddrCnt=llAddrCnt; if (llAddrCnt>0) { this->LLAddr=new char[16*llAddrCnt]; memcpy(this->LLAddr,llAddr,16*llAddrCnt); } else this->LLAddr=NULL; this->PresLLAddr=this->LLAddr; // store all global addresses for (int i=0; i addr = new TIPv6Addr(globalAddr+16*i); this->GlobalAddrLst.append(addr); } // store hardware type this->HWType=hwType; } /* * returns interface name */ char* TIfaceIface::getName() { return this->Name; } /* * returns interface ID */ int TIfaceIface::getID() { return this->ID; } string TIfaceIface::getFullName() { ostringstream oss; oss << this->ID; return string(this->Name) +"/" +oss.str(); } /* * return interface flags */ unsigned int TIfaceIface::getFlags() { return this->Flags; } void TIfaceIface::updateState(struct iface *x) { this->Flags = x->flags; delete [] Mac; Mac = new char[Maclen]; Maclen = x->maclen; memcpy(Mac, x->mac, Maclen); if (LLAddrCnt && LLAddr) { delete [] LLAddr; LLAddrCnt = 0; LLAddr = 0; } LLAddrCnt = x->linkaddrcount; if (LLAddrCnt) { LLAddr = new char[16*LLAddrCnt]; memcpy(LLAddr, x->linkaddr, 16*LLAddrCnt); } PresLLAddr = LLAddr; GlobalAddrLst.clear(); // store all global addresses for (int i=0; iglobaladdrcount; i++) { SPtr addr = new TIPv6Addr(x->globaladdr+16*i); this->GlobalAddrLst.append(addr); } HWType = x->hardwareType; setMBit(x->m_bit); setOBit(x->o_bit); } /** * returns true if interface is UP */ bool TIfaceIface::flagUp() { return this->Flags & IFF_UP; } /** * returns true if interface is RUNNING */ bool TIfaceIface::flagRunning() { return (bool)(this->Flags & IFF_RUNNING); } /** * returns true is interface is MULTICAST capable */ bool TIfaceIface::flagMulticast() { return (Flags&IFF_MULTICAST)?true:false; } /** * returns true is interface is LOOPBACK */ bool TIfaceIface::flagLoopback() { return (Flags&IFF_LOOPBACK)?true:false; } /** * returns MAC length */ int TIfaceIface::getMacLen() { return Maclen; } /** * returns MAC */ char* TIfaceIface::getMac() { return Mac; } void TIfaceIface::firstGlobalAddr() { GlobalAddrLst.first(); } SPtr TIfaceIface::getGlobalAddr() { return this->GlobalAddrLst.get(); } unsigned int TIfaceIface::countGlobalAddr() { return this->GlobalAddrLst.count(); } void TIfaceIface::addGlobalAddr(SPtr addr) { this->GlobalAddrLst.append(addr); } void TIfaceIface::delGlobalAddr(SPtr addr) { SPtr tempAddr; for(unsigned int i = 0; i < this->GlobalAddrLst.count(); i++) { tempAddr = this->GlobalAddrLst.get(); if(*tempAddr == *addr){ this->GlobalAddrLst.del(); break; } } } /** * returns HW type */ int TIfaceIface::getHardwareType() { return this->HWType; } // -------------------------------------------------------------------- // --- address related ------------------------------------------------ // -------------------------------------------------------------------- /** * adds address to this interface with prefered- and valid-lifetime * (wrapper around pure C function) */ bool TIfaceIface::addAddr(SPtr addr,long pref, long valid, int prefixLen) { Log(Notice) << "Address " << addr->getPlain() << "/" << prefixLen << " added to " << getFullName() << " interface." << LogEnd; return (bool)ipaddr_add(this->Name, this->ID, addr->getPlain(), pref, valid, prefixLen); } /** * deletes address from interface * (wrapper around pure C function) */ bool TIfaceIface::delAddr(SPtr addr, int prefixLen) { Log(Notice) << "Address " << addr->getPlain() << "/" << prefixLen << " deleted from " << getFullName() << " interface." << LogEnd; return (bool)ipaddr_del( this->Name, this->ID, addr->getPlain(), prefixLen); } /** * update address prefered- and valid-lifetime */ bool TIfaceIface::updateAddr(SPtr addr, long pref, long valid) { int result; Log(Notice) << "Address " << addr->getPlain() << " updated on " << getFullName() << " interface." << LogEnd; result = ipaddr_update((char *)this->Name, this->ID, (char *)addr->getPlain(), pref, valid, this->PrefixLen); if (result!=LOWLEVEL_NO_ERROR) return false; return true; } /** * get first link-local address */ char* TIfaceIface::firstLLAddress() { return PresLLAddr=LLAddr; } /** * get next link-local address * (oh boy, this method stinks. Nobody uses it, anyway) */ char* TIfaceIface::getLLAddress() { char* retVal; if( (retVal=this->PresLLAddr) ) { if ( (this->PresLLAddr-this->LLAddr) < (16*this->LLAddrCnt) ) this->PresLLAddr+=16; else this->PresLLAddr=NULL; } return retVal; } int TIfaceIface::countLLAddress() { return this->LLAddrCnt; } // -------------------------------------------------------------------- // --- socket related ------------------------------------------------- // -------------------------------------------------------------------- /* * binds socket to one address only */ bool TIfaceIface::addSocket(SPtr addr,int port, bool ifaceonly, bool reuse) { // Log(Debug) << "Creating socket on " << *addr << " address." << LogEnd; SPtr ptr = new TIfaceSocket(this->Name, this->ID, port, addr, ifaceonly, reuse); if (ptr->getStatus()!=STATE_CONFIGURED) { return false; } SocketsLst.append(ptr); return true; } #if 0 /* * binds socket on whole interface */ bool TIfaceIface::addSocket(int port, bool ifaceonly, bool reuse) { SPtr ptr = new TIfaceSocket(this->Name, this->ID, port, ifaceonly, reuse); if (ptr->getStatus()!=STATE_CONFIGURED) { return false; } SocketsLst.append(ptr); return true; } #endif /* * closes socket */ bool TIfaceIface::delSocket(int fd) { SPtr sock; SocketsLst.first(); while ( sock = SocketsLst.get() ) { if (sock->getFD() == fd) { SocketsLst.del(); return true; } } return false; } /* * rewinds sockets list to the beginning */ void TIfaceIface::firstSocket() { SocketsLst.first(); } /* * returns next socket from list */ SPtr TIfaceIface::getSocket() { return SocketsLst.get(); } /* * returns socket by FileDescriptor (or NULL, if no such socket exists) */ SPtr TIfaceIface::getSocketByFD(int fd) { SPtr ptr; SocketsLst.first(); while ( ptr = SocketsLst.get() ) { if ( ptr->getFD()==fd ) return ptr; } return SPtr(); // NULL } /* * returns sockets count */ int TIfaceIface::countSocket() { return SocketsLst.count(); } /* * releases data allocated for ll addresses */ TIfaceIface::~TIfaceIface() { if (this->LLAddrCnt>0) { delete [] this->LLAddr; } delete [] Mac; } SPtr TIfaceIface::getSocketByAddr(SPtr addr) { SPtr ptr; SocketsLst.first(); while ( ptr = SocketsLst.get() ) { if ( *ptr->getAddr()==*addr ) return ptr; } return SPtr(); // NULL } void TIfaceIface::setPrefixLength(int len) { if (len>128 || len<0) { Log(Error) << "Invalid length " << len << " set attempt was ignored on the " << this->getFullName() << " interface." << LogEnd; return; } this->PrefixLen = len; } int TIfaceIface::getPrefixLength() { return PrefixLen; } /// @brief set M (managed) bit as received from Router Advertisement /// /// @param m bool flag (Sets of clears M bit) void TIfaceIface::setMBit(bool m) { M_bit_ = m; } /// @brief set O (other conf) bit as received from Router Advertisement /// /// @param o bool flag (Sets of clears O bit) void TIfaceIface::setOBit(bool o) { O_bit_ = o; } /// @brief returns M (managed) bit as received from Router Advertisement /// /// @return value of M bit bool TIfaceIface::getMBit() { return M_bit_; } /// @brief returns O (other conf) bit as received from Router Advertisement /// /// @return value of O bit bool TIfaceIface::getOBit() { return O_bit_; } // -------------------------------------------------------------------- // --- operators ------------------------------------------------------ // -------------------------------------------------------------------- /* * just prints important informations (debugging & logging) */ ostream & operator <<(ostream & strum, TIfaceIface &x) { char buf[48]; strum << " " << endl << " ":" no-multicast -->") << endl << " " << endl << " " << endl; for (int i=0; i" << buf << "" << endl; } strum << " " << endl; x.firstGlobalAddr(); SPtr addr; while (addr = x.getGlobalAddr()) { strum << " " << *addr; } strum << " "; for (int i=0; i" << endl; SPtr sock; x.firstSocket(); while (sock = x.getSocket() ) { strum << " " << *sock; } strum << " " << endl; return strum; } dibbler-1.0.1/IfaceMgr/DNSUpdate.h0000644000175000017500000000510612277722750013467 00000000000000/* * Dibbler - a portable DHCPv6 * * authors: Adrien CLERC, Bahattin DEMIRPLAK, Gaëtant ELEOUET * Mickaël GUÉRIN, Lionel GUILMIN, Lauréline PROVOST * from ENSEEIHT, Toulouse, France * * released under GNU GPL v2 licence * */ #ifdef WIN32 #include #endif #include #include /// @todo: remove poslib.h inclusion from here #include "poslib.h" /* used in config. file */ enum DnsUpdateModeCfg { DNSUPDATE_MODE_NONE = 0, DNSUPDATE_MODE_PTR = 1, DNSUPDATE_MODE_BOTH = 2 }; /* return values of method run*/ enum DnsUpdateResult { DNSUPDATE_SUCCESS=0, DNSUPDATE_ERROR=1, DNSUPDATE_CONNFAIL=2, DNSUPDATE_SRVNOTAUTH=3, DNSUPDATE_SKIP=4 }; /* used in DNSUpdate constructor */ enum DnsUpdateMode { DNSUPDATE_PTR=1, DNSUPDATE_PTR_CLEANUP=2, DNSUPDATE_AAAA=3, DNSUPDATE_AAAA_CLEANUP=4 }; class DNSUpdate { public: enum DnsUpdateProtocol { DNSUPDATE_TCP, DNSUPDATE_UDP, DNSUPDATE_ANY }; private: void splitHostDomain(std::string fqdnName); void createSOAMsg(); void addinMsg_newPTR(); void addinMsg_newAAAA(); void addinMsg_delOldRR(); void deleteAAAARecordFromRRSet(); void deletePTRRecordFromRRSet(); bool DnsRR_avail(DnsMessage *msg, DnsRR& RemoteDnsRR); DnsRR* get_oldDnsRR(); void sendMsgTCP(unsigned int timeout); void sendMsgUDP(unsigned int timeout); std::string protoToString(); protected: // used to be private, but is now protected for testing virtual void sendMsg(unsigned int timeout); DnsMessage *Message_; std::string DnsAddr_; std::string Hostname_; std::string Hostip_; domainname Zoneroot_; std::string TTL_; DnsUpdateMode UpdateMode_; DnsUpdateProtocol Proto_; // TSIG stuff std::string Keyname_; /// plain text name of the key std::string Key_; /// the actual key, specified as encoded64 string std::string Algorithm_; /// specify algorithm used for the key uint32_t Fudge_; /// max difference between us signing and they are receiving public: DNSUpdate(const std::string& dns_address, const std::string& zonename, const std::string& hostname, std::string hostip, DnsUpdateMode updateMode, DnsUpdateProtocol proto /*= DNSUPDATE_TCP*/ ); void addDHCID(const char* duid, int duidlen); void setTSIG(const std::string& keyname, const std::string& base64encoded, const std::string& algro, uint32_t fudge = 600); virtual ~DNSUpdate(); DnsUpdateResult run(int timeout); void showResult(int result); }; dibbler-1.0.1/IfaceMgr/Makefile.in0000664000175000017500000007535112561652534013605 00000000000000# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ @HAVE_GTEST_TRUE@am__append_1 = tests subdir = IfaceMgr DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/depcomp ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/libtool.m4 \ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/include/dibbler-config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = LIBRARIES = $(noinst_LIBRARIES) ARFLAGS = cru AM_V_AR = $(am__v_AR_@AM_V@) am__v_AR_ = $(am__v_AR_@AM_DEFAULT_V@) am__v_AR_0 = @echo " AR " $@; am__v_AR_1 = libIfaceMgr_a_AR = $(AR) $(ARFLAGS) libIfaceMgr_a_LIBADD = am_libIfaceMgr_a_OBJECTS = libIfaceMgr_a-DNSUpdate.$(OBJEXT) \ libIfaceMgr_a-Iface.$(OBJEXT) libIfaceMgr_a-IfaceMgr.$(OBJEXT) \ libIfaceMgr_a-SocketIPv6.$(OBJEXT) libIfaceMgr_a_OBJECTS = $(am_libIfaceMgr_a_OBJECTS) AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)/include depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) LTCXXCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CXXFLAGS) $(CXXFLAGS) AM_V_CXX = $(am__v_CXX_@AM_V@) am__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@) am__v_CXX_0 = @echo " CXX " $@; am__v_CXX_1 = CXXLD = $(CXX) CXXLINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \ $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CXXLD = $(am__v_CXXLD_@AM_V@) am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@) am__v_CXXLD_0 = @echo " CXXLD " $@; am__v_CXXLD_1 = COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(libIfaceMgr_a_SOURCES) DIST_SOURCES = $(libIfaceMgr_a_SOURCES) RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \ ctags-recursive dvi-recursive html-recursive info-recursive \ install-data-recursive install-dvi-recursive \ install-exec-recursive install-html-recursive \ install-info-recursive install-pdf-recursive \ install-ps-recursive install-recursive installcheck-recursive \ installdirs-recursive pdf-recursive ps-recursive \ tags-recursive uninstall-recursive am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive am__recursive_targets = \ $(RECURSIVE_TARGETS) \ $(RECURSIVE_CLEAN_TARGETS) \ $(am__extra_recursive_targets) AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \ distdir am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags DIST_SUBDIRS = . tests DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) am__relativize = \ dir0=`pwd`; \ sed_first='s,^\([^/]*\)/.*$$,\1,'; \ sed_rest='s,^[^/]*/*,,'; \ sed_last='s,^.*/\([^/]*\)$$,\1,'; \ sed_butlast='s,/*[^/]*$$,,'; \ while test -n "$$dir1"; do \ first=`echo "$$dir1" | sed -e "$$sed_first"`; \ if test "$$first" != "."; then \ if test "$$first" = ".."; then \ dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ else \ first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ if test "$$first2" = "$$first"; then \ dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ else \ dir2="../$$dir2"; \ fi; \ dir0="$$dir0"/"$$first"; \ fi; \ fi; \ dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ done; \ reldir="$$dir2" ACLOCAL = @ACLOCAL@ ALLOCA = @ALLOCA@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ ARCH = @ARCH@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ EXTRA_DIST_SUBDIRS = @EXTRA_DIST_SUBDIRS@ FGREP = @FGREP@ GREP = @GREP@ GTEST_INCLUDES = @GTEST_INCLUDES@ GTEST_LDADD = @GTEST_LDADD@ GTEST_LDFLAGS = @GTEST_LDFLAGS@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LINKPRINT = @LINKPRINT@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PORT_CFLAGS = @PORT_CFLAGS@ PORT_LDFLAGS = @PORT_LDFLAGS@ PORT_SUBDIR = @PORT_SUBDIR@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ subdirs = @subdirs@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ SUBDIRS = . $(am__append_1) noinst_LIBRARIES = libIfaceMgr.a libIfaceMgr_a_CPPFLAGS = -I$(top_srcdir)/poslib/poslib -I$(top_srcdir)/poslib -I$(top_srcdir)/Misc -I$(top_srcdir)/Messages -I$(top_srcdir)/Options libIfaceMgr_a_SOURCES = DNSUpdate.cpp DNSUpdate.h Iface.cpp Iface.h IfaceMgr.cpp IfaceMgr.h SocketIPv6.cpp SocketIPv6.h all: all-recursive .SUFFIXES: .SUFFIXES: .cpp .lo .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign IfaceMgr/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign IfaceMgr/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstLIBRARIES: -test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES) libIfaceMgr.a: $(libIfaceMgr_a_OBJECTS) $(libIfaceMgr_a_DEPENDENCIES) $(EXTRA_libIfaceMgr_a_DEPENDENCIES) $(AM_V_at)-rm -f libIfaceMgr.a $(AM_V_AR)$(libIfaceMgr_a_AR) libIfaceMgr.a $(libIfaceMgr_a_OBJECTS) $(libIfaceMgr_a_LIBADD) $(AM_V_at)$(RANLIB) libIfaceMgr.a mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libIfaceMgr_a-DNSUpdate.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libIfaceMgr_a-Iface.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libIfaceMgr_a-IfaceMgr.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libIfaceMgr_a-SocketIPv6.Po@am__quote@ .cpp.o: @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $< .cpp.obj: @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .cpp.lo: @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LTCXXCOMPILE) -c -o $@ $< libIfaceMgr_a-DNSUpdate.o: DNSUpdate.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libIfaceMgr_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libIfaceMgr_a-DNSUpdate.o -MD -MP -MF $(DEPDIR)/libIfaceMgr_a-DNSUpdate.Tpo -c -o libIfaceMgr_a-DNSUpdate.o `test -f 'DNSUpdate.cpp' || echo '$(srcdir)/'`DNSUpdate.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libIfaceMgr_a-DNSUpdate.Tpo $(DEPDIR)/libIfaceMgr_a-DNSUpdate.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='DNSUpdate.cpp' object='libIfaceMgr_a-DNSUpdate.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libIfaceMgr_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libIfaceMgr_a-DNSUpdate.o `test -f 'DNSUpdate.cpp' || echo '$(srcdir)/'`DNSUpdate.cpp libIfaceMgr_a-DNSUpdate.obj: DNSUpdate.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libIfaceMgr_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libIfaceMgr_a-DNSUpdate.obj -MD -MP -MF $(DEPDIR)/libIfaceMgr_a-DNSUpdate.Tpo -c -o libIfaceMgr_a-DNSUpdate.obj `if test -f 'DNSUpdate.cpp'; then $(CYGPATH_W) 'DNSUpdate.cpp'; else $(CYGPATH_W) '$(srcdir)/DNSUpdate.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libIfaceMgr_a-DNSUpdate.Tpo $(DEPDIR)/libIfaceMgr_a-DNSUpdate.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='DNSUpdate.cpp' object='libIfaceMgr_a-DNSUpdate.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libIfaceMgr_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libIfaceMgr_a-DNSUpdate.obj `if test -f 'DNSUpdate.cpp'; then $(CYGPATH_W) 'DNSUpdate.cpp'; else $(CYGPATH_W) '$(srcdir)/DNSUpdate.cpp'; fi` libIfaceMgr_a-Iface.o: Iface.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libIfaceMgr_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libIfaceMgr_a-Iface.o -MD -MP -MF $(DEPDIR)/libIfaceMgr_a-Iface.Tpo -c -o libIfaceMgr_a-Iface.o `test -f 'Iface.cpp' || echo '$(srcdir)/'`Iface.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libIfaceMgr_a-Iface.Tpo $(DEPDIR)/libIfaceMgr_a-Iface.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='Iface.cpp' object='libIfaceMgr_a-Iface.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libIfaceMgr_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libIfaceMgr_a-Iface.o `test -f 'Iface.cpp' || echo '$(srcdir)/'`Iface.cpp libIfaceMgr_a-Iface.obj: Iface.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libIfaceMgr_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libIfaceMgr_a-Iface.obj -MD -MP -MF $(DEPDIR)/libIfaceMgr_a-Iface.Tpo -c -o libIfaceMgr_a-Iface.obj `if test -f 'Iface.cpp'; then $(CYGPATH_W) 'Iface.cpp'; else $(CYGPATH_W) '$(srcdir)/Iface.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libIfaceMgr_a-Iface.Tpo $(DEPDIR)/libIfaceMgr_a-Iface.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='Iface.cpp' object='libIfaceMgr_a-Iface.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libIfaceMgr_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libIfaceMgr_a-Iface.obj `if test -f 'Iface.cpp'; then $(CYGPATH_W) 'Iface.cpp'; else $(CYGPATH_W) '$(srcdir)/Iface.cpp'; fi` libIfaceMgr_a-IfaceMgr.o: IfaceMgr.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libIfaceMgr_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libIfaceMgr_a-IfaceMgr.o -MD -MP -MF $(DEPDIR)/libIfaceMgr_a-IfaceMgr.Tpo -c -o libIfaceMgr_a-IfaceMgr.o `test -f 'IfaceMgr.cpp' || echo '$(srcdir)/'`IfaceMgr.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libIfaceMgr_a-IfaceMgr.Tpo $(DEPDIR)/libIfaceMgr_a-IfaceMgr.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='IfaceMgr.cpp' object='libIfaceMgr_a-IfaceMgr.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libIfaceMgr_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libIfaceMgr_a-IfaceMgr.o `test -f 'IfaceMgr.cpp' || echo '$(srcdir)/'`IfaceMgr.cpp libIfaceMgr_a-IfaceMgr.obj: IfaceMgr.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libIfaceMgr_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libIfaceMgr_a-IfaceMgr.obj -MD -MP -MF $(DEPDIR)/libIfaceMgr_a-IfaceMgr.Tpo -c -o libIfaceMgr_a-IfaceMgr.obj `if test -f 'IfaceMgr.cpp'; then $(CYGPATH_W) 'IfaceMgr.cpp'; else $(CYGPATH_W) '$(srcdir)/IfaceMgr.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libIfaceMgr_a-IfaceMgr.Tpo $(DEPDIR)/libIfaceMgr_a-IfaceMgr.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='IfaceMgr.cpp' object='libIfaceMgr_a-IfaceMgr.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libIfaceMgr_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libIfaceMgr_a-IfaceMgr.obj `if test -f 'IfaceMgr.cpp'; then $(CYGPATH_W) 'IfaceMgr.cpp'; else $(CYGPATH_W) '$(srcdir)/IfaceMgr.cpp'; fi` libIfaceMgr_a-SocketIPv6.o: SocketIPv6.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libIfaceMgr_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libIfaceMgr_a-SocketIPv6.o -MD -MP -MF $(DEPDIR)/libIfaceMgr_a-SocketIPv6.Tpo -c -o libIfaceMgr_a-SocketIPv6.o `test -f 'SocketIPv6.cpp' || echo '$(srcdir)/'`SocketIPv6.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libIfaceMgr_a-SocketIPv6.Tpo $(DEPDIR)/libIfaceMgr_a-SocketIPv6.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='SocketIPv6.cpp' object='libIfaceMgr_a-SocketIPv6.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libIfaceMgr_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libIfaceMgr_a-SocketIPv6.o `test -f 'SocketIPv6.cpp' || echo '$(srcdir)/'`SocketIPv6.cpp libIfaceMgr_a-SocketIPv6.obj: SocketIPv6.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libIfaceMgr_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libIfaceMgr_a-SocketIPv6.obj -MD -MP -MF $(DEPDIR)/libIfaceMgr_a-SocketIPv6.Tpo -c -o libIfaceMgr_a-SocketIPv6.obj `if test -f 'SocketIPv6.cpp'; then $(CYGPATH_W) 'SocketIPv6.cpp'; else $(CYGPATH_W) '$(srcdir)/SocketIPv6.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libIfaceMgr_a-SocketIPv6.Tpo $(DEPDIR)/libIfaceMgr_a-SocketIPv6.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='SocketIPv6.cpp' object='libIfaceMgr_a-SocketIPv6.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libIfaceMgr_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libIfaceMgr_a-SocketIPv6.obj `if test -f 'SocketIPv6.cpp'; then $(CYGPATH_W) 'SocketIPv6.cpp'; else $(CYGPATH_W) '$(srcdir)/SocketIPv6.cpp'; fi` mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs # This directory's subdirectories are mostly independent; you can cd # into them and run 'make' without going through this Makefile. # To change the values of 'make' variables: instead of editing Makefiles, # (1) if the variable is set in 'config.status', edit 'config.status' # (which will cause the Makefiles to be regenerated when you run 'make'); # (2) otherwise, pass the desired values on the 'make' command line. $(am__recursive_targets): @fail=; \ if $(am__make_keepgoing); then \ failcom='fail=yes'; \ else \ failcom='exit 1'; \ fi; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-recursive TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ empty_fix=.; \ else \ include_option=--include; \ empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-recursive CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-recursive cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ $(am__make_dryrun) \ || test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ $(am__relativize); \ new_distdir=$$reldir; \ dir1=$$subdir; dir2="$(top_distdir)"; \ $(am__relativize); \ new_top_distdir=$$reldir; \ echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ ($(am__cd) $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$new_top_distdir" \ distdir="$$new_distdir" \ am__remove_distdir=: \ am__skip_length_check=: \ am__skip_mode_fix=: \ distdir) \ || exit 1; \ fi; \ done check-am: all-am check: check-recursive all-am: Makefile $(LIBRARIES) installdirs: installdirs-recursive installdirs-am: install: install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-recursive clean-am: clean-generic clean-libtool clean-noinstLIBRARIES \ mostlyclean-am distclean: distclean-recursive -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive html-am: info: info-recursive info-am: install-data-am: install-dvi: install-dvi-recursive install-dvi-am: install-exec-am: install-html: install-html-recursive install-html-am: install-info: install-info-recursive install-info-am: install-man: install-pdf: install-pdf-recursive install-pdf-am: install-ps: install-ps-recursive install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-recursive -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: .MAKE: $(am__recursive_targets) install-am install-strip .PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am check \ check-am clean clean-generic clean-libtool \ clean-noinstLIBRARIES cscopelist-am ctags ctags-am distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ installdirs-am maintainer-clean maintainer-clean-generic \ mostlyclean mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf pdf-am ps ps-am tags tags-am uninstall \ uninstall-am # 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: dibbler-1.0.1/IfaceMgr/SocketIPv6.h0000644000175000017500000000476112304040124013616 00000000000000/* * Dibbler - a portable DHCPv6 * * authors: Tomasz Mrugalski * Marek Senderski * changes: Krzysztof Wnuk * Micha³ Kowalczuk * * released under GNU GPL v2 only licence * * $Id: SocketIPv6.h,v 1.7 2008-08-29 00:07:30 thomson Exp $ * */ class TIfaceSocket; #ifndef IFACESOCKETIPV6_H #define IFACESOCKETIPV6_H #include #include #include "Portable.h" #include "DHCPConst.h" #include "IPv6Addr.h" #include "SmartPtr.h" /* * repesents network socket */ class TIfaceSocket { friend std::ostream& operator<<(std::ostream& strum, TIfaceSocket &x); public: TIfaceSocket(char * iface,int ifaceid, int port, SPtr addr, bool ifaceonly, bool reuse); TIfaceSocket(char * iface,int ifaceid, int port, bool ifaceonly, bool reuse); // ---transmission--- int send(char * buf,int len, SPtr addr,int port); int recv(char * buf,SPtr addr); // ---get info--- inline static int getCount() { return Count; } int getFD(); int getPort(); int getIfaceID(); SPtr getAddr(); enum EState getStatus(); // ---select() stuff--- // FileDescriptors Set, for use with select() // (it's really messed up. fd_set is some really weird macro used // with POSIX select() function. ) static fd_set * getFDS(); inline static int getMaxFD() { return MaxFD; } inline bool multicast() { return Multicast; } ~TIfaceSocket(); private: // adds socket to this interface int createSocket(char * iface, int ifaceid, SPtr addr, int port, bool ifaceonly, bool reuse); void printError(int error, char * iface, int ifaceid, SPtr addr, int port); // FileDescriptor int FD; // bounded port int Port; // socket status enum EState Status; // error std::string Error; // interface name, on which this socket has been created char Iface[MAX_IFNAME_LENGTH]; // interface ID, on which this socket has been created int IfaceID; // bounded address SPtr Addr; // true = bounded to this interface only bool IfaceOnly; // true = bounded to multicast socket bool Multicast; // Static element. Class needs to know, when first object is // created. It call FD_SET to zero fd_set static int Count; static int MaxFD; // needed instead of FD_MAXSIZE on Macs }; #endif dibbler-1.0.1/compile0000755000175000017500000001624512360253064011424 00000000000000#! /bin/sh # Wrapper for compilers which do not understand '-c -o'. scriptversion=2012-10-14.11; # UTC # Copyright (C) 1999-2013 Free Software Foundation, Inc. # Written by Tom Tromey . # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # This file is maintained in Automake, please report # bugs to or send patches to # . nl=' ' # We need space, tab and new line, in precisely that order. Quoting is # there to prevent tools from complaining about whitespace usage. IFS=" "" $nl" file_conv= # func_file_conv build_file lazy # Convert a $build file to $host form and store it in $file # Currently only supports Windows hosts. If the determined conversion # type is listed in (the comma separated) LAZY, no conversion will # take place. func_file_conv () { file=$1 case $file in / | /[!/]*) # absolute file, and not a UNC file if test -z "$file_conv"; then # lazily determine how to convert abs files case `uname -s` in MINGW*) file_conv=mingw ;; CYGWIN*) file_conv=cygwin ;; *) file_conv=wine ;; esac fi case $file_conv/,$2, in *,$file_conv,*) ;; mingw/*) file=`cmd //C echo "$file " | sed -e 's/"\(.*\) " *$/\1/'` ;; cygwin/*) file=`cygpath -m "$file" || echo "$file"` ;; wine/*) file=`winepath -w "$file" || echo "$file"` ;; esac ;; esac } # func_cl_dashL linkdir # Make cl look for libraries in LINKDIR func_cl_dashL () { func_file_conv "$1" if test -z "$lib_path"; then lib_path=$file else lib_path="$lib_path;$file" fi linker_opts="$linker_opts -LIBPATH:$file" } # func_cl_dashl library # Do a library search-path lookup for cl func_cl_dashl () { lib=$1 found=no save_IFS=$IFS IFS=';' for dir in $lib_path $LIB do IFS=$save_IFS if $shared && test -f "$dir/$lib.dll.lib"; then found=yes lib=$dir/$lib.dll.lib break fi if test -f "$dir/$lib.lib"; then found=yes lib=$dir/$lib.lib break fi if test -f "$dir/lib$lib.a"; then found=yes lib=$dir/lib$lib.a break fi done IFS=$save_IFS if test "$found" != yes; then lib=$lib.lib fi } # func_cl_wrapper cl arg... # Adjust compile command to suit cl func_cl_wrapper () { # Assume a capable shell lib_path= shared=: linker_opts= for arg do if test -n "$eat"; then eat= else case $1 in -o) # configure might choose to run compile as 'compile cc -o foo foo.c'. eat=1 case $2 in *.o | *.[oO][bB][jJ]) func_file_conv "$2" set x "$@" -Fo"$file" shift ;; *) func_file_conv "$2" set x "$@" -Fe"$file" shift ;; esac ;; -I) eat=1 func_file_conv "$2" mingw set x "$@" -I"$file" shift ;; -I*) func_file_conv "${1#-I}" mingw set x "$@" -I"$file" shift ;; -l) eat=1 func_cl_dashl "$2" set x "$@" "$lib" shift ;; -l*) func_cl_dashl "${1#-l}" set x "$@" "$lib" shift ;; -L) eat=1 func_cl_dashL "$2" ;; -L*) func_cl_dashL "${1#-L}" ;; -static) shared=false ;; -Wl,*) arg=${1#-Wl,} save_ifs="$IFS"; IFS=',' for flag in $arg; do IFS="$save_ifs" linker_opts="$linker_opts $flag" done IFS="$save_ifs" ;; -Xlinker) eat=1 linker_opts="$linker_opts $2" ;; -*) set x "$@" "$1" shift ;; *.cc | *.CC | *.cxx | *.CXX | *.[cC]++) func_file_conv "$1" set x "$@" -Tp"$file" shift ;; *.c | *.cpp | *.CPP | *.lib | *.LIB | *.Lib | *.OBJ | *.obj | *.[oO]) func_file_conv "$1" mingw set x "$@" "$file" shift ;; *) set x "$@" "$1" shift ;; esac fi shift done if test -n "$linker_opts"; then linker_opts="-link$linker_opts" fi exec "$@" $linker_opts exit 1 } eat= case $1 in '') echo "$0: No command. Try '$0 --help' for more information." 1>&2 exit 1; ;; -h | --h*) cat <<\EOF Usage: compile [--help] [--version] PROGRAM [ARGS] Wrapper for compilers which do not understand '-c -o'. Remove '-o dest.o' from ARGS, run PROGRAM with the remaining arguments, and rename the output as expected. If you are trying to build a whole package this is not the right script to run: please start by reading the file 'INSTALL'. Report bugs to . EOF exit $? ;; -v | --v*) echo "compile $scriptversion" exit $? ;; cl | *[/\\]cl | cl.exe | *[/\\]cl.exe ) func_cl_wrapper "$@" # Doesn't return... ;; esac ofile= cfile= for arg do if test -n "$eat"; then eat= else case $1 in -o) # configure might choose to run compile as 'compile cc -o foo foo.c'. # So we strip '-o arg' only if arg is an object. eat=1 case $2 in *.o | *.obj) ofile=$2 ;; *) set x "$@" -o "$2" shift ;; esac ;; *.c) cfile=$1 set x "$@" "$1" shift ;; *) set x "$@" "$1" shift ;; esac fi shift done if test -z "$ofile" || test -z "$cfile"; then # If no '-o' option was seen then we might have been invoked from a # pattern rule where we don't need one. That is ok -- this is a # normal compilation that the losing compiler can handle. If no # '.c' file was seen then we are probably linking. That is also # ok. exec "$@" fi # Name of file we expect compiler to create. cofile=`echo "$cfile" | sed 's|^.*[\\/]||; s|^[a-zA-Z]:||; s/\.c$/.o/'` # Create the lock directory. # Note: use '[/\\:.-]' here to ensure that we don't use the same name # that we are using for the .o file. Also, base the name on the expected # object file name, since that is what matters with a parallel build. lockdir=`echo "$cofile" | sed -e 's|[/\\:.-]|_|g'`.d while true; do if mkdir "$lockdir" >/dev/null 2>&1; then break fi sleep 1 done # FIXME: race condition here if user kills between mkdir and trap. trap "rmdir '$lockdir'; exit 1" 1 2 15 # Run the compile. "$@" ret=$? if test -f "$cofile"; then test "$cofile" = "$ofile" || mv "$cofile" "$ofile" elif test -f "${cofile}bj"; then test "${cofile}bj" = "$ofile" || mv "${cofile}bj" "$ofile" fi rmdir "$lockdir" exit $ret # Local Variables: # mode: shell-script # sh-indentation: 2 # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC" # time-stamp-end: "; # UTC" # End: dibbler-1.0.1/install-sh0000755000175000017500000003325512277722750012064 00000000000000#!/bin/sh # install - install a program, script, or datafile scriptversion=2011-11-20.07; # UTC # This originates from X11R5 (mit/util/scripts/install.sh), which was # later released in X11R6 (xc/config/util/install.sh) with the # following copyright and license. # # Copyright (C) 1994 X Consortium # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to # deal in the Software without restriction, including without limitation the # rights to use, copy, modify, merge, publish, distribute, sublicense, and/or # sell copies of the Software, and to permit persons to whom the Software is # furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included in # all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE # X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN # AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC- # TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # # Except as contained in this notice, the name of the X Consortium shall not # be used in advertising or otherwise to promote the sale, use or other deal- # ings in this Software without prior written authorization from the X Consor- # tium. # # # FSF changes to this file are in the public domain. # # Calling this script install-sh is preferred over install.sh, to prevent # 'make' implicit rules from creating a file called install from it # when there is no Makefile. # # This script is compatible with the BSD install script, but was written # from scratch. nl=' ' IFS=" "" $nl" # set DOITPROG to echo to test this script # Don't use :- since 4.3BSD and earlier shells don't like it. doit=${DOITPROG-} if test -z "$doit"; then doit_exec=exec else doit_exec=$doit fi # Put in absolute file names if you don't have them in your path; # or use environment vars. chgrpprog=${CHGRPPROG-chgrp} chmodprog=${CHMODPROG-chmod} chownprog=${CHOWNPROG-chown} cmpprog=${CMPPROG-cmp} cpprog=${CPPROG-cp} mkdirprog=${MKDIRPROG-mkdir} mvprog=${MVPROG-mv} rmprog=${RMPROG-rm} stripprog=${STRIPPROG-strip} posix_glob='?' initialize_posix_glob=' test "$posix_glob" != "?" || { if (set -f) 2>/dev/null; then posix_glob= else posix_glob=: fi } ' posix_mkdir= # Desired mode of installed file. mode=0755 chgrpcmd= chmodcmd=$chmodprog chowncmd= mvcmd=$mvprog rmcmd="$rmprog -f" stripcmd= src= dst= dir_arg= dst_arg= copy_on_change=false no_target_directory= usage="\ Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE or: $0 [OPTION]... SRCFILES... DIRECTORY or: $0 [OPTION]... -t DIRECTORY SRCFILES... or: $0 [OPTION]... -d DIRECTORIES... In the 1st form, copy SRCFILE to DSTFILE. In the 2nd and 3rd, copy all SRCFILES to DIRECTORY. In the 4th, create DIRECTORIES. Options: --help display this help and exit. --version display version info and exit. -c (ignored) -C install only if different (preserve the last data modification time) -d create directories instead of installing files. -g GROUP $chgrpprog installed files to GROUP. -m MODE $chmodprog installed files to MODE. -o USER $chownprog installed files to USER. -s $stripprog installed files. -t DIRECTORY install into DIRECTORY. -T report an error if DSTFILE is a directory. Environment variables override the default commands: CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG RMPROG STRIPPROG " while test $# -ne 0; do case $1 in -c) ;; -C) copy_on_change=true;; -d) dir_arg=true;; -g) chgrpcmd="$chgrpprog $2" shift;; --help) echo "$usage"; exit $?;; -m) mode=$2 case $mode in *' '* | *' '* | *' '* | *'*'* | *'?'* | *'['*) echo "$0: invalid mode: $mode" >&2 exit 1;; esac shift;; -o) chowncmd="$chownprog $2" shift;; -s) stripcmd=$stripprog;; -t) dst_arg=$2 # Protect names problematic for 'test' and other utilities. case $dst_arg in -* | [=\(\)!]) dst_arg=./$dst_arg;; esac shift;; -T) no_target_directory=true;; --version) echo "$0 $scriptversion"; exit $?;; --) shift break;; -*) echo "$0: invalid option: $1" >&2 exit 1;; *) break;; esac shift done if test $# -ne 0 && test -z "$dir_arg$dst_arg"; then # When -d is used, all remaining arguments are directories to create. # When -t is used, the destination is already specified. # Otherwise, the last argument is the destination. Remove it from $@. for arg do if test -n "$dst_arg"; then # $@ is not empty: it contains at least $arg. set fnord "$@" "$dst_arg" shift # fnord fi shift # arg dst_arg=$arg # Protect names problematic for 'test' and other utilities. case $dst_arg in -* | [=\(\)!]) dst_arg=./$dst_arg;; esac done fi if test $# -eq 0; then if test -z "$dir_arg"; then echo "$0: no input file specified." >&2 exit 1 fi # It's OK to call 'install-sh -d' without argument. # This can happen when creating conditional directories. exit 0 fi if test -z "$dir_arg"; then do_exit='(exit $ret); exit $ret' trap "ret=129; $do_exit" 1 trap "ret=130; $do_exit" 2 trap "ret=141; $do_exit" 13 trap "ret=143; $do_exit" 15 # Set umask so as not to create temps with too-generous modes. # However, 'strip' requires both read and write access to temps. case $mode in # Optimize common cases. *644) cp_umask=133;; *755) cp_umask=22;; *[0-7]) if test -z "$stripcmd"; then u_plus_rw= else u_plus_rw='% 200' fi cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;; *) if test -z "$stripcmd"; then u_plus_rw= else u_plus_rw=,u+rw fi cp_umask=$mode$u_plus_rw;; esac fi for src do # Protect names problematic for 'test' and other utilities. case $src in -* | [=\(\)!]) src=./$src;; esac if test -n "$dir_arg"; then dst=$src dstdir=$dst test -d "$dstdir" dstdir_status=$? else # Waiting for this to be detected by the "$cpprog $src $dsttmp" command # might cause directories to be created, which would be especially bad # if $src (and thus $dsttmp) contains '*'. if test ! -f "$src" && test ! -d "$src"; then echo "$0: $src does not exist." >&2 exit 1 fi if test -z "$dst_arg"; then echo "$0: no destination specified." >&2 exit 1 fi dst=$dst_arg # If destination is a directory, append the input filename; won't work # if double slashes aren't ignored. if test -d "$dst"; then if test -n "$no_target_directory"; then echo "$0: $dst_arg: Is a directory" >&2 exit 1 fi dstdir=$dst dst=$dstdir/`basename "$src"` dstdir_status=0 else # Prefer dirname, but fall back on a substitute if dirname fails. dstdir=` (dirname "$dst") 2>/dev/null || expr X"$dst" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$dst" : 'X\(//\)[^/]' \| \ X"$dst" : 'X\(//\)$' \| \ X"$dst" : 'X\(/\)' \| . 2>/dev/null || echo X"$dst" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q' ` test -d "$dstdir" dstdir_status=$? fi fi obsolete_mkdir_used=false if test $dstdir_status != 0; then case $posix_mkdir in '') # Create intermediate dirs using mode 755 as modified by the umask. # This is like FreeBSD 'install' as of 1997-10-28. umask=`umask` case $stripcmd.$umask in # Optimize common cases. *[2367][2367]) mkdir_umask=$umask;; .*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;; *[0-7]) mkdir_umask=`expr $umask + 22 \ - $umask % 100 % 40 + $umask % 20 \ - $umask % 10 % 4 + $umask % 2 `;; *) mkdir_umask=$umask,go-w;; esac # With -d, create the new directory with the user-specified mode. # Otherwise, rely on $mkdir_umask. if test -n "$dir_arg"; then mkdir_mode=-m$mode else mkdir_mode= fi posix_mkdir=false case $umask in *[123567][0-7][0-7]) # POSIX mkdir -p sets u+wx bits regardless of umask, which # is incompatible with FreeBSD 'install' when (umask & 300) != 0. ;; *) tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$ trap 'ret=$?; rmdir "$tmpdir/d" "$tmpdir" 2>/dev/null; exit $ret' 0 if (umask $mkdir_umask && exec $mkdirprog $mkdir_mode -p -- "$tmpdir/d") >/dev/null 2>&1 then if test -z "$dir_arg" || { # Check for POSIX incompatibilities with -m. # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or # other-writable bit of parent directory when it shouldn't. # FreeBSD 6.1 mkdir -m -p sets mode of existing directory. ls_ld_tmpdir=`ls -ld "$tmpdir"` case $ls_ld_tmpdir in d????-?r-*) different_mode=700;; d????-?--*) different_mode=755;; *) false;; esac && $mkdirprog -m$different_mode -p -- "$tmpdir" && { ls_ld_tmpdir_1=`ls -ld "$tmpdir"` test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1" } } then posix_mkdir=: fi rmdir "$tmpdir/d" "$tmpdir" else # Remove any dirs left behind by ancient mkdir implementations. rmdir ./$mkdir_mode ./-p ./-- 2>/dev/null fi trap '' 0;; esac;; esac if $posix_mkdir && ( umask $mkdir_umask && $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir" ) then : else # The umask is ridiculous, or mkdir does not conform to POSIX, # or it failed possibly due to a race condition. Create the # directory the slow way, step by step, checking for races as we go. case $dstdir in /*) prefix='/';; [-=\(\)!]*) prefix='./';; *) prefix='';; esac eval "$initialize_posix_glob" oIFS=$IFS IFS=/ $posix_glob set -f set fnord $dstdir shift $posix_glob set +f IFS=$oIFS prefixes= for d do test X"$d" = X && continue prefix=$prefix$d if test -d "$prefix"; then prefixes= else if $posix_mkdir; then (umask=$mkdir_umask && $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break # Don't fail if two instances are running concurrently. test -d "$prefix" || exit 1 else case $prefix in *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;; *) qprefix=$prefix;; esac prefixes="$prefixes '$qprefix'" fi fi prefix=$prefix/ done if test -n "$prefixes"; then # Don't fail if two instances are running concurrently. (umask $mkdir_umask && eval "\$doit_exec \$mkdirprog $prefixes") || test -d "$dstdir" || exit 1 obsolete_mkdir_used=true fi fi fi if test -n "$dir_arg"; then { test -z "$chowncmd" || $doit $chowncmd "$dst"; } && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } && { test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false || test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1 else # Make a couple of temp file names in the proper directory. dsttmp=$dstdir/_inst.$$_ rmtmp=$dstdir/_rm.$$_ # Trap to clean up those temp files at exit. trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0 # Copy the file name to the temp name. (umask $cp_umask && $doit_exec $cpprog "$src" "$dsttmp") && # and set any options; do chmod last to preserve setuid bits. # # If any of these fail, we abort the whole thing. If we want to # ignore errors from any of these, just make sure not to ignore # errors from the above "$doit $cpprog $src $dsttmp" command. # { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } && { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } && { test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } && # If -C, don't bother to copy if it wouldn't change the file. if $copy_on_change && old=`LC_ALL=C ls -dlL "$dst" 2>/dev/null` && new=`LC_ALL=C ls -dlL "$dsttmp" 2>/dev/null` && eval "$initialize_posix_glob" && $posix_glob set -f && set X $old && old=:$2:$4:$5:$6 && set X $new && new=:$2:$4:$5:$6 && $posix_glob set +f && test "$old" = "$new" && $cmpprog "$dst" "$dsttmp" >/dev/null 2>&1 then rm -f "$dsttmp" else # Rename the file to the real destination. $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null || # The rename failed, perhaps because mv can't rename something else # to itself, or perhaps because mv is so ancient that it does not # support -f. { # Now remove or move aside any old file at destination location. # We try this two ways since rm can't unlink itself on some # systems and the destination file might be busy for other # reasons. In this case, the final cleanup might fail but the new # file should still install successfully. { test ! -f "$dst" || $doit $rmcmd -f "$dst" 2>/dev/null || { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null && { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; } } || { echo "$0: cannot unlink or rename $dst" >&2 (exit 1); exit 1 } } && # Now rename the file to the real destination. $doit $mvcmd "$dsttmp" "$dst" } fi || exit 1 trap '' 0 fi done # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC" # time-stamp-end: "; # UTC" # End: dibbler-1.0.1/config.guess0000755000175000017500000013036112304040124012347 00000000000000#! /bin/sh # Attempt to guess a canonical system name. # Copyright 1992-2013 Free Software Foundation, Inc. timestamp='2013-06-10' # This file is free software; you can redistribute it and/or modify it # under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, see . # # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that # program. This Exception is an additional permission under section 7 # of the GNU General Public License, version 3 ("GPLv3"). # # Originally written by Per Bothner. # # You can get the latest version of this script from: # http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD # # Please send patches with a ChangeLog entry to config-patches@gnu.org. me=`echo "$0" | sed -e 's,.*/,,'` usage="\ Usage: $0 [OPTION] Output the configuration name of the system \`$me' is run on. Operation modes: -h, --help print this help, then exit -t, --time-stamp print date of last modification, then exit -v, --version print version number, then exit Report bugs and patches to ." version="\ GNU config.guess ($timestamp) Originally written by Per Bothner. Copyright 1992-2013 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." help=" Try \`$me --help' for more information." # Parse command line while test $# -gt 0 ; do case $1 in --time-stamp | --time* | -t ) echo "$timestamp" ; exit ;; --version | -v ) echo "$version" ; exit ;; --help | --h* | -h ) echo "$usage"; exit ;; -- ) # Stop option processing shift; break ;; - ) # Use stdin as input. break ;; -* ) echo "$me: invalid option $1$help" >&2 exit 1 ;; * ) break ;; esac done if test $# != 0; then echo "$me: too many arguments$help" >&2 exit 1 fi trap 'exit 1' 1 2 15 # CC_FOR_BUILD -- compiler used by this script. Note that the use of a # compiler to aid in system detection is discouraged as it requires # temporary files to be created and, as you can see below, it is a # headache to deal with in a portable fashion. # Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still # use `HOST_CC' if defined, but it is deprecated. # Portable tmp directory creation inspired by the Autoconf team. set_cc_for_build=' trap "exitcode=\$?; (rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null) && exit \$exitcode" 0 ; trap "rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null; exit 1" 1 2 13 15 ; : ${TMPDIR=/tmp} ; { tmp=`(umask 077 && mktemp -d "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } || { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir $tmp) ; } || { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir $tmp) && echo "Warning: creating insecure temp directory" >&2 ; } || { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } ; dummy=$tmp/dummy ; tmpfiles="$dummy.c $dummy.o $dummy.rel $dummy" ; case $CC_FOR_BUILD,$HOST_CC,$CC in ,,) echo "int x;" > $dummy.c ; for c in cc gcc c89 c99 ; do if ($c -c -o $dummy.o $dummy.c) >/dev/null 2>&1 ; then CC_FOR_BUILD="$c"; break ; fi ; done ; if test x"$CC_FOR_BUILD" = x ; then CC_FOR_BUILD=no_compiler_found ; fi ;; ,,*) CC_FOR_BUILD=$CC ;; ,*,*) CC_FOR_BUILD=$HOST_CC ;; esac ; set_cc_for_build= ;' # This is needed to find uname on a Pyramid OSx when run in the BSD universe. # (ghazi@noc.rutgers.edu 1994-08-24) if (test -f /.attbin/uname) >/dev/null 2>&1 ; then PATH=$PATH:/.attbin ; export PATH fi UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown case "${UNAME_SYSTEM}" in Linux|GNU|GNU/*) # If the system lacks a compiler, then just pick glibc. # We could probably try harder. LIBC=gnu eval $set_cc_for_build cat <<-EOF > $dummy.c #include #if defined(__UCLIBC__) LIBC=uclibc #elif defined(__dietlibc__) LIBC=dietlibc #else LIBC=gnu #endif EOF eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^LIBC'` ;; esac # Note: order is significant - the case branches are not exclusive. case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in *:NetBSD:*:*) # NetBSD (nbsd) targets should (where applicable) match one or # more of the tuples: *-*-netbsdelf*, *-*-netbsdaout*, # *-*-netbsdecoff* and *-*-netbsd*. For targets that recently # switched to ELF, *-*-netbsd* would select the old # object file format. This provides both forward # compatibility and a consistent mechanism for selecting the # object file format. # # Note: NetBSD doesn't particularly care about the vendor # portion of the name. We always set it to "unknown". sysctl="sysctl -n hw.machine_arch" UNAME_MACHINE_ARCH=`(/sbin/$sysctl 2>/dev/null || \ /usr/sbin/$sysctl 2>/dev/null || echo unknown)` case "${UNAME_MACHINE_ARCH}" in armeb) machine=armeb-unknown ;; arm*) machine=arm-unknown ;; sh3el) machine=shl-unknown ;; sh3eb) machine=sh-unknown ;; sh5el) machine=sh5le-unknown ;; *) machine=${UNAME_MACHINE_ARCH}-unknown ;; esac # The Operating System including object format, if it has switched # to ELF recently, or will in the future. case "${UNAME_MACHINE_ARCH}" in arm*|i386|m68k|ns32k|sh3*|sparc|vax) eval $set_cc_for_build if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \ | grep -q __ELF__ then # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout). # Return netbsd for either. FIX? os=netbsd else os=netbsdelf fi ;; *) os=netbsd ;; esac # The OS release # Debian GNU/NetBSD machines have a different userland, and # thus, need a distinct triplet. However, they do not need # kernel version information, so it can be replaced with a # suitable tag, in the style of linux-gnu. case "${UNAME_VERSION}" in Debian*) release='-gnu' ;; *) release=`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'` ;; esac # Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM: # contains redundant information, the shorter form: # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used. echo "${machine}-${os}${release}" exit ;; *:Bitrig:*:*) UNAME_MACHINE_ARCH=`arch | sed 's/Bitrig.//'` echo ${UNAME_MACHINE_ARCH}-unknown-bitrig${UNAME_RELEASE} exit ;; *:OpenBSD:*:*) UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'` echo ${UNAME_MACHINE_ARCH}-unknown-openbsd${UNAME_RELEASE} exit ;; *:ekkoBSD:*:*) echo ${UNAME_MACHINE}-unknown-ekkobsd${UNAME_RELEASE} exit ;; *:SolidBSD:*:*) echo ${UNAME_MACHINE}-unknown-solidbsd${UNAME_RELEASE} exit ;; macppc:MirBSD:*:*) echo powerpc-unknown-mirbsd${UNAME_RELEASE} exit ;; *:MirBSD:*:*) echo ${UNAME_MACHINE}-unknown-mirbsd${UNAME_RELEASE} exit ;; alpha:OSF1:*:*) case $UNAME_RELEASE in *4.0) UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'` ;; *5.*) UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'` ;; esac # According to Compaq, /usr/sbin/psrinfo has been available on # OSF/1 and Tru64 systems produced since 1995. I hope that # covers most systems running today. This code pipes the CPU # types through head -n 1, so we only detect the type of CPU 0. ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^ The alpha \(.*\) processor.*$/\1/p' | head -n 1` case "$ALPHA_CPU_TYPE" in "EV4 (21064)") UNAME_MACHINE="alpha" ;; "EV4.5 (21064)") UNAME_MACHINE="alpha" ;; "LCA4 (21066/21068)") UNAME_MACHINE="alpha" ;; "EV5 (21164)") UNAME_MACHINE="alphaev5" ;; "EV5.6 (21164A)") UNAME_MACHINE="alphaev56" ;; "EV5.6 (21164PC)") UNAME_MACHINE="alphapca56" ;; "EV5.7 (21164PC)") UNAME_MACHINE="alphapca57" ;; "EV6 (21264)") UNAME_MACHINE="alphaev6" ;; "EV6.7 (21264A)") UNAME_MACHINE="alphaev67" ;; "EV6.8CB (21264C)") UNAME_MACHINE="alphaev68" ;; "EV6.8AL (21264B)") UNAME_MACHINE="alphaev68" ;; "EV6.8CX (21264D)") UNAME_MACHINE="alphaev68" ;; "EV6.9A (21264/EV69A)") UNAME_MACHINE="alphaev69" ;; "EV7 (21364)") UNAME_MACHINE="alphaev7" ;; "EV7.9 (21364A)") UNAME_MACHINE="alphaev79" ;; esac # A Pn.n version is a patched version. # A Vn.n version is a released version. # A Tn.n version is a released field test version. # A Xn.n version is an unreleased experimental baselevel. # 1.2 uses "1.2" for uname -r. echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[PVTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` # Reset EXIT trap before exiting to avoid spurious non-zero exit code. exitcode=$? trap '' 0 exit $exitcode ;; Alpha\ *:Windows_NT*:*) # How do we know it's Interix rather than the generic POSIX subsystem? # Should we change UNAME_MACHINE based on the output of uname instead # of the specific Alpha model? echo alpha-pc-interix exit ;; 21064:Windows_NT:50:3) echo alpha-dec-winnt3.5 exit ;; Amiga*:UNIX_System_V:4.0:*) echo m68k-unknown-sysv4 exit ;; *:[Aa]miga[Oo][Ss]:*:*) echo ${UNAME_MACHINE}-unknown-amigaos exit ;; *:[Mm]orph[Oo][Ss]:*:*) echo ${UNAME_MACHINE}-unknown-morphos exit ;; *:OS/390:*:*) echo i370-ibm-openedition exit ;; *:z/VM:*:*) echo s390-ibm-zvmoe exit ;; *:OS400:*:*) echo powerpc-ibm-os400 exit ;; arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*) echo arm-acorn-riscix${UNAME_RELEASE} exit ;; arm*:riscos:*:*|arm*:RISCOS:*:*) echo arm-unknown-riscos exit ;; SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*) echo hppa1.1-hitachi-hiuxmpp exit ;; Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*) # akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE. if test "`(/bin/universe) 2>/dev/null`" = att ; then echo pyramid-pyramid-sysv3 else echo pyramid-pyramid-bsd fi exit ;; NILE*:*:*:dcosx) echo pyramid-pyramid-svr4 exit ;; DRS?6000:unix:4.0:6*) echo sparc-icl-nx6 exit ;; DRS?6000:UNIX_SV:4.2*:7* | DRS?6000:isis:4.2*:7*) case `/usr/bin/uname -p` in sparc) echo sparc-icl-nx7; exit ;; esac ;; s390x:SunOS:*:*) echo ${UNAME_MACHINE}-ibm-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; sun4H:SunOS:5.*:*) echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*) echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; i86pc:AuroraUX:5.*:* | i86xen:AuroraUX:5.*:*) echo i386-pc-auroraux${UNAME_RELEASE} exit ;; i86pc:SunOS:5.*:* | i86xen:SunOS:5.*:*) eval $set_cc_for_build SUN_ARCH="i386" # If there is a compiler, see if it is configured for 64-bit objects. # Note that the Sun cc does not turn __LP64__ into 1 like gcc does. # This test works for both compilers. if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then if (echo '#ifdef __amd64'; echo IS_64BIT_ARCH; echo '#endif') | \ (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \ grep IS_64BIT_ARCH >/dev/null then SUN_ARCH="x86_64" fi fi echo ${SUN_ARCH}-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; sun4*:SunOS:6*:*) # According to config.sub, this is the proper way to canonicalize # SunOS6. Hard to guess exactly what SunOS6 will be like, but # it's likely to be more like Solaris than SunOS4. echo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; sun4*:SunOS:*:*) case "`/usr/bin/arch -k`" in Series*|S4*) UNAME_RELEASE=`uname -v` ;; esac # Japanese Language versions have a version number like `4.1.3-JL'. echo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'` exit ;; sun3*:SunOS:*:*) echo m68k-sun-sunos${UNAME_RELEASE} exit ;; sun*:*:4.2BSD:*) UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null` test "x${UNAME_RELEASE}" = "x" && UNAME_RELEASE=3 case "`/bin/arch`" in sun3) echo m68k-sun-sunos${UNAME_RELEASE} ;; sun4) echo sparc-sun-sunos${UNAME_RELEASE} ;; esac exit ;; aushp:SunOS:*:*) echo sparc-auspex-sunos${UNAME_RELEASE} exit ;; # The situation for MiNT is a little confusing. The machine name # can be virtually everything (everything which is not # "atarist" or "atariste" at least should have a processor # > m68000). The system name ranges from "MiNT" over "FreeMiNT" # to the lowercase version "mint" (or "freemint"). Finally # the system name "TOS" denotes a system which is actually not # MiNT. But MiNT is downward compatible to TOS, so this should # be no problem. atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*) echo m68k-atari-mint${UNAME_RELEASE} exit ;; atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*) echo m68k-atari-mint${UNAME_RELEASE} exit ;; *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*) echo m68k-atari-mint${UNAME_RELEASE} exit ;; milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*) echo m68k-milan-mint${UNAME_RELEASE} exit ;; hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*) echo m68k-hades-mint${UNAME_RELEASE} exit ;; *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*) echo m68k-unknown-mint${UNAME_RELEASE} exit ;; m68k:machten:*:*) echo m68k-apple-machten${UNAME_RELEASE} exit ;; powerpc:machten:*:*) echo powerpc-apple-machten${UNAME_RELEASE} exit ;; RISC*:Mach:*:*) echo mips-dec-mach_bsd4.3 exit ;; RISC*:ULTRIX:*:*) echo mips-dec-ultrix${UNAME_RELEASE} exit ;; VAX*:ULTRIX*:*:*) echo vax-dec-ultrix${UNAME_RELEASE} exit ;; 2020:CLIX:*:* | 2430:CLIX:*:*) echo clipper-intergraph-clix${UNAME_RELEASE} exit ;; mips:*:*:UMIPS | mips:*:*:RISCos) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #ifdef __cplusplus #include /* for printf() prototype */ int main (int argc, char *argv[]) { #else int main (argc, argv) int argc; char *argv[]; { #endif #if defined (host_mips) && defined (MIPSEB) #if defined (SYSTYPE_SYSV) printf ("mips-mips-riscos%ssysv\n", argv[1]); exit (0); #endif #if defined (SYSTYPE_SVR4) printf ("mips-mips-riscos%ssvr4\n", argv[1]); exit (0); #endif #if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD) printf ("mips-mips-riscos%sbsd\n", argv[1]); exit (0); #endif #endif exit (-1); } EOF $CC_FOR_BUILD -o $dummy $dummy.c && dummyarg=`echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` && SYSTEM_NAME=`$dummy $dummyarg` && { echo "$SYSTEM_NAME"; exit; } echo mips-mips-riscos${UNAME_RELEASE} exit ;; Motorola:PowerMAX_OS:*:*) echo powerpc-motorola-powermax exit ;; Motorola:*:4.3:PL8-*) echo powerpc-harris-powermax exit ;; Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*) echo powerpc-harris-powermax exit ;; Night_Hawk:Power_UNIX:*:*) echo powerpc-harris-powerunix exit ;; m88k:CX/UX:7*:*) echo m88k-harris-cxux7 exit ;; m88k:*:4*:R4*) echo m88k-motorola-sysv4 exit ;; m88k:*:3*:R3*) echo m88k-motorola-sysv3 exit ;; AViiON:dgux:*:*) # DG/UX returns AViiON for all architectures UNAME_PROCESSOR=`/usr/bin/uname -p` if [ $UNAME_PROCESSOR = mc88100 ] || [ $UNAME_PROCESSOR = mc88110 ] then if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx ] || \ [ ${TARGET_BINARY_INTERFACE}x = x ] then echo m88k-dg-dgux${UNAME_RELEASE} else echo m88k-dg-dguxbcs${UNAME_RELEASE} fi else echo i586-dg-dgux${UNAME_RELEASE} fi exit ;; M88*:DolphinOS:*:*) # DolphinOS (SVR3) echo m88k-dolphin-sysv3 exit ;; M88*:*:R3*:*) # Delta 88k system running SVR3 echo m88k-motorola-sysv3 exit ;; XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3) echo m88k-tektronix-sysv3 exit ;; Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD) echo m68k-tektronix-bsd exit ;; *:IRIX*:*:*) echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'` exit ;; ????????:AIX?:[12].1:2) # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX. echo romp-ibm-aix # uname -m gives an 8 hex-code CPU id exit ;; # Note that: echo "'`uname -s`'" gives 'AIX ' i*86:AIX:*:*) echo i386-ibm-aix exit ;; ia64:AIX:*:*) if [ -x /usr/bin/oslevel ] ; then IBM_REV=`/usr/bin/oslevel` else IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} fi echo ${UNAME_MACHINE}-ibm-aix${IBM_REV} exit ;; *:AIX:2:3) if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #include main() { if (!__power_pc()) exit(1); puts("powerpc-ibm-aix3.2.5"); exit(0); } EOF if $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` then echo "$SYSTEM_NAME" else echo rs6000-ibm-aix3.2.5 fi elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then echo rs6000-ibm-aix3.2.4 else echo rs6000-ibm-aix3.2 fi exit ;; *:AIX:*:[4567]) IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'` if /usr/sbin/lsattr -El ${IBM_CPU_ID} | grep ' POWER' >/dev/null 2>&1; then IBM_ARCH=rs6000 else IBM_ARCH=powerpc fi if [ -x /usr/bin/oslevel ] ; then IBM_REV=`/usr/bin/oslevel` else IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} fi echo ${IBM_ARCH}-ibm-aix${IBM_REV} exit ;; *:AIX:*:*) echo rs6000-ibm-aix exit ;; ibmrt:4.4BSD:*|romp-ibm:BSD:*) echo romp-ibm-bsd4.4 exit ;; ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC BSD and echo romp-ibm-bsd${UNAME_RELEASE} # 4.3 with uname added to exit ;; # report: romp-ibm BSD 4.3 *:BOSX:*:*) echo rs6000-bull-bosx exit ;; DPX/2?00:B.O.S.:*:*) echo m68k-bull-sysv3 exit ;; 9000/[34]??:4.3bsd:1.*:*) echo m68k-hp-bsd exit ;; hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*) echo m68k-hp-bsd4.4 exit ;; 9000/[34678]??:HP-UX:*:*) HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` case "${UNAME_MACHINE}" in 9000/31? ) HP_ARCH=m68000 ;; 9000/[34]?? ) HP_ARCH=m68k ;; 9000/[678][0-9][0-9]) if [ -x /usr/bin/getconf ]; then sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null` sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null` case "${sc_cpu_version}" in 523) HP_ARCH="hppa1.0" ;; # CPU_PA_RISC1_0 528) HP_ARCH="hppa1.1" ;; # CPU_PA_RISC1_1 532) # CPU_PA_RISC2_0 case "${sc_kernel_bits}" in 32) HP_ARCH="hppa2.0n" ;; 64) HP_ARCH="hppa2.0w" ;; '') HP_ARCH="hppa2.0" ;; # HP-UX 10.20 esac ;; esac fi if [ "${HP_ARCH}" = "" ]; then eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #define _HPUX_SOURCE #include #include int main () { #if defined(_SC_KERNEL_BITS) long bits = sysconf(_SC_KERNEL_BITS); #endif long cpu = sysconf (_SC_CPU_VERSION); switch (cpu) { case CPU_PA_RISC1_0: puts ("hppa1.0"); break; case CPU_PA_RISC1_1: puts ("hppa1.1"); break; case CPU_PA_RISC2_0: #if defined(_SC_KERNEL_BITS) switch (bits) { case 64: puts ("hppa2.0w"); break; case 32: puts ("hppa2.0n"); break; default: puts ("hppa2.0"); break; } break; #else /* !defined(_SC_KERNEL_BITS) */ puts ("hppa2.0"); break; #endif default: puts ("hppa1.0"); break; } exit (0); } EOF (CCOPTS= $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null) && HP_ARCH=`$dummy` test -z "$HP_ARCH" && HP_ARCH=hppa fi ;; esac if [ ${HP_ARCH} = "hppa2.0w" ] then eval $set_cc_for_build # hppa2.0w-hp-hpux* has a 64-bit kernel and a compiler generating # 32-bit code. hppa64-hp-hpux* has the same kernel and a compiler # generating 64-bit code. GNU and HP use different nomenclature: # # $ CC_FOR_BUILD=cc ./config.guess # => hppa2.0w-hp-hpux11.23 # $ CC_FOR_BUILD="cc +DA2.0w" ./config.guess # => hppa64-hp-hpux11.23 if echo __LP64__ | (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | grep -q __LP64__ then HP_ARCH="hppa2.0w" else HP_ARCH="hppa64" fi fi echo ${HP_ARCH}-hp-hpux${HPUX_REV} exit ;; ia64:HP-UX:*:*) HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` echo ia64-hp-hpux${HPUX_REV} exit ;; 3050*:HI-UX:*:*) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #include int main () { long cpu = sysconf (_SC_CPU_VERSION); /* The order matters, because CPU_IS_HP_MC68K erroneously returns true for CPU_PA_RISC1_0. CPU_IS_PA_RISC returns correct results, however. */ if (CPU_IS_PA_RISC (cpu)) { switch (cpu) { case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break; case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break; case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break; default: puts ("hppa-hitachi-hiuxwe2"); break; } } else if (CPU_IS_HP_MC68K (cpu)) puts ("m68k-hitachi-hiuxwe2"); else puts ("unknown-hitachi-hiuxwe2"); exit (0); } EOF $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` && { echo "$SYSTEM_NAME"; exit; } echo unknown-hitachi-hiuxwe2 exit ;; 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* ) echo hppa1.1-hp-bsd exit ;; 9000/8??:4.3bsd:*:*) echo hppa1.0-hp-bsd exit ;; *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*) echo hppa1.0-hp-mpeix exit ;; hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* ) echo hppa1.1-hp-osf exit ;; hp8??:OSF1:*:*) echo hppa1.0-hp-osf exit ;; i*86:OSF1:*:*) if [ -x /usr/sbin/sysversion ] ; then echo ${UNAME_MACHINE}-unknown-osf1mk else echo ${UNAME_MACHINE}-unknown-osf1 fi exit ;; parisc*:Lites*:*:*) echo hppa1.1-hp-lites exit ;; C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*) echo c1-convex-bsd exit ;; C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*) if getsysinfo -f scalar_acc then echo c32-convex-bsd else echo c2-convex-bsd fi exit ;; C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*) echo c34-convex-bsd exit ;; C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*) echo c38-convex-bsd exit ;; C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*) echo c4-convex-bsd exit ;; CRAY*Y-MP:*:*:*) echo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; CRAY*[A-Z]90:*:*:*) echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \ | sed -e 's/CRAY.*\([A-Z]90\)/\1/' \ -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \ -e 's/\.[^.]*$/.X/' exit ;; CRAY*TS:*:*:*) echo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; CRAY*T3E:*:*:*) echo alphaev5-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; CRAY*SV1:*:*:*) echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; *:UNICOS/mp:*:*) echo craynv-cray-unicosmp${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*) FUJITSU_PROC=`uname -m | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'` echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" exit ;; 5000:UNIX_System_V:4.*:*) FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` FUJITSU_REL=`echo ${UNAME_RELEASE} | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/ /_/'` echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" exit ;; i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*) echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE} exit ;; sparc*:BSD/OS:*:*) echo sparc-unknown-bsdi${UNAME_RELEASE} exit ;; *:BSD/OS:*:*) echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE} exit ;; *:FreeBSD:*:*) UNAME_PROCESSOR=`/usr/bin/uname -p` case ${UNAME_PROCESSOR} in amd64) echo x86_64-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; *) echo ${UNAME_PROCESSOR}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; esac exit ;; i*:CYGWIN*:*) echo ${UNAME_MACHINE}-pc-cygwin exit ;; *:MINGW64*:*) echo ${UNAME_MACHINE}-pc-mingw64 exit ;; *:MINGW*:*) echo ${UNAME_MACHINE}-pc-mingw32 exit ;; i*:MSYS*:*) echo ${UNAME_MACHINE}-pc-msys exit ;; i*:windows32*:*) # uname -m includes "-pc" on this system. echo ${UNAME_MACHINE}-mingw32 exit ;; i*:PW*:*) echo ${UNAME_MACHINE}-pc-pw32 exit ;; *:Interix*:*) case ${UNAME_MACHINE} in x86) echo i586-pc-interix${UNAME_RELEASE} exit ;; authenticamd | genuineintel | EM64T) echo x86_64-unknown-interix${UNAME_RELEASE} exit ;; IA64) echo ia64-unknown-interix${UNAME_RELEASE} exit ;; esac ;; [345]86:Windows_95:* | [345]86:Windows_98:* | [345]86:Windows_NT:*) echo i${UNAME_MACHINE}-pc-mks exit ;; 8664:Windows_NT:*) echo x86_64-pc-mks exit ;; i*:Windows_NT*:* | Pentium*:Windows_NT*:*) # How do we know it's Interix rather than the generic POSIX subsystem? # It also conflicts with pre-2.0 versions of AT&T UWIN. Should we # UNAME_MACHINE based on the output of uname instead of i386? echo i586-pc-interix exit ;; i*:UWIN*:*) echo ${UNAME_MACHINE}-pc-uwin exit ;; amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*) echo x86_64-unknown-cygwin exit ;; p*:CYGWIN*:*) echo powerpcle-unknown-cygwin exit ;; prep*:SunOS:5.*:*) echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; *:GNU:*:*) # the GNU system echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-${LIBC}`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'` exit ;; *:GNU/*:*:*) # other systems with GNU libc and userland echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr '[A-Z]' '[a-z]'``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-${LIBC} exit ;; i*86:Minix:*:*) echo ${UNAME_MACHINE}-pc-minix exit ;; aarch64:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; aarch64_be:Linux:*:*) UNAME_MACHINE=aarch64_be echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; alpha:Linux:*:*) case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in EV5) UNAME_MACHINE=alphaev5 ;; EV56) UNAME_MACHINE=alphaev56 ;; PCA56) UNAME_MACHINE=alphapca56 ;; PCA57) UNAME_MACHINE=alphapca56 ;; EV6) UNAME_MACHINE=alphaev6 ;; EV67) UNAME_MACHINE=alphaev67 ;; EV68*) UNAME_MACHINE=alphaev68 ;; esac objdump --private-headers /bin/sh | grep -q ld.so.1 if test "$?" = 0 ; then LIBC="gnulibc1" ; fi echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; arc:Linux:*:* | arceb:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; arm*:Linux:*:*) eval $set_cc_for_build if echo __ARM_EABI__ | $CC_FOR_BUILD -E - 2>/dev/null \ | grep -q __ARM_EABI__ then echo ${UNAME_MACHINE}-unknown-linux-${LIBC} else if echo __ARM_PCS_VFP | $CC_FOR_BUILD -E - 2>/dev/null \ | grep -q __ARM_PCS_VFP then echo ${UNAME_MACHINE}-unknown-linux-${LIBC}eabi else echo ${UNAME_MACHINE}-unknown-linux-${LIBC}eabihf fi fi exit ;; avr32*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; cris:Linux:*:*) echo ${UNAME_MACHINE}-axis-linux-${LIBC} exit ;; crisv32:Linux:*:*) echo ${UNAME_MACHINE}-axis-linux-${LIBC} exit ;; frv:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; hexagon:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; i*86:Linux:*:*) echo ${UNAME_MACHINE}-pc-linux-${LIBC} exit ;; ia64:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; m32r*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; m68*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; mips:Linux:*:* | mips64:Linux:*:*) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #undef CPU #undef ${UNAME_MACHINE} #undef ${UNAME_MACHINE}el #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) CPU=${UNAME_MACHINE}el #else #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) CPU=${UNAME_MACHINE} #else CPU= #endif #endif EOF eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^CPU'` test x"${CPU}" != x && { echo "${CPU}-unknown-linux-${LIBC}"; exit; } ;; or1k:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; or32:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; padre:Linux:*:*) echo sparc-unknown-linux-${LIBC} exit ;; parisc64:Linux:*:* | hppa64:Linux:*:*) echo hppa64-unknown-linux-${LIBC} exit ;; parisc:Linux:*:* | hppa:Linux:*:*) # Look for CPU level case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in PA7*) echo hppa1.1-unknown-linux-${LIBC} ;; PA8*) echo hppa2.0-unknown-linux-${LIBC} ;; *) echo hppa-unknown-linux-${LIBC} ;; esac exit ;; ppc64:Linux:*:*) echo powerpc64-unknown-linux-${LIBC} exit ;; ppc:Linux:*:*) echo powerpc-unknown-linux-${LIBC} exit ;; ppc64le:Linux:*:*) echo powerpc64le-unknown-linux-${LIBC} exit ;; ppcle:Linux:*:*) echo powerpcle-unknown-linux-${LIBC} exit ;; s390:Linux:*:* | s390x:Linux:*:*) echo ${UNAME_MACHINE}-ibm-linux-${LIBC} exit ;; sh64*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; sh*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; sparc:Linux:*:* | sparc64:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; tile*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; vax:Linux:*:*) echo ${UNAME_MACHINE}-dec-linux-${LIBC} exit ;; x86_64:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; xtensa*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; i*86:DYNIX/ptx:4*:*) # ptx 4.0 does uname -s correctly, with DYNIX/ptx in there. # earlier versions are messed up and put the nodename in both # sysname and nodename. echo i386-sequent-sysv4 exit ;; i*86:UNIX_SV:4.2MP:2.*) # Unixware is an offshoot of SVR4, but it has its own version # number series starting with 2... # I am not positive that other SVR4 systems won't match this, # I just have to hope. -- rms. # Use sysv4.2uw... so that sysv4* matches it. echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION} exit ;; i*86:OS/2:*:*) # If we were able to find `uname', then EMX Unix compatibility # is probably installed. echo ${UNAME_MACHINE}-pc-os2-emx exit ;; i*86:XTS-300:*:STOP) echo ${UNAME_MACHINE}-unknown-stop exit ;; i*86:atheos:*:*) echo ${UNAME_MACHINE}-unknown-atheos exit ;; i*86:syllable:*:*) echo ${UNAME_MACHINE}-pc-syllable exit ;; i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.[02]*:*) echo i386-unknown-lynxos${UNAME_RELEASE} exit ;; i*86:*DOS:*:*) echo ${UNAME_MACHINE}-pc-msdosdjgpp exit ;; i*86:*:4.*:* | i*86:SYSTEM_V:4.*:*) UNAME_REL=`echo ${UNAME_RELEASE} | sed 's/\/MP$//'` if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then echo ${UNAME_MACHINE}-univel-sysv${UNAME_REL} else echo ${UNAME_MACHINE}-pc-sysv${UNAME_REL} fi exit ;; i*86:*:5:[678]*) # UnixWare 7.x, OpenUNIX and OpenServer 6. case `/bin/uname -X | grep "^Machine"` in *486*) UNAME_MACHINE=i486 ;; *Pentium) UNAME_MACHINE=i586 ;; *Pent*|*Celeron) UNAME_MACHINE=i686 ;; esac echo ${UNAME_MACHINE}-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION} exit ;; i*86:*:3.2:*) if test -f /usr/options/cb.name; then UNAME_REL=`sed -n 's/.*Version //p' /dev/null >/dev/null ; then UNAME_REL=`(/bin/uname -X|grep Release|sed -e 's/.*= //')` (/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486 (/bin/uname -X|grep '^Machine.*Pentium' >/dev/null) \ && UNAME_MACHINE=i586 (/bin/uname -X|grep '^Machine.*Pent *II' >/dev/null) \ && UNAME_MACHINE=i686 (/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \ && UNAME_MACHINE=i686 echo ${UNAME_MACHINE}-pc-sco$UNAME_REL else echo ${UNAME_MACHINE}-pc-sysv32 fi exit ;; pc:*:*:*) # Left here for compatibility: # uname -m prints for DJGPP always 'pc', but it prints nothing about # the processor, so we play safe by assuming i586. # Note: whatever this is, it MUST be the same as what config.sub # prints for the "djgpp" host, or else GDB configury will decide that # this is a cross-build. echo i586-pc-msdosdjgpp exit ;; Intel:Mach:3*:*) echo i386-pc-mach3 exit ;; paragon:*:*:*) echo i860-intel-osf1 exit ;; i860:*:4.*:*) # i860-SVR4 if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4 else # Add other i860-SVR4 vendors below as they are discovered. echo i860-unknown-sysv${UNAME_RELEASE} # Unknown i860-SVR4 fi exit ;; mini*:CTIX:SYS*5:*) # "miniframe" echo m68010-convergent-sysv exit ;; mc68k:UNIX:SYSTEM5:3.51m) echo m68k-convergent-sysv exit ;; M680?0:D-NIX:5.3:*) echo m68k-diab-dnix exit ;; M68*:*:R3V[5678]*:*) test -r /sysV68 && { echo 'm68k-motorola-sysv'; exit; } ;; 3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0 | S7501*:*:4.0:3.0) OS_REL='' test -r /etc/.relid \ && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && { echo i486-ncr-sysv4.3${OS_REL}; exit; } /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;; 3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*) /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && { echo i486-ncr-sysv4; exit; } ;; NCR*:*:4.2:* | MPRAS*:*:4.2:*) OS_REL='.3' test -r /etc/.relid \ && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && { echo i486-ncr-sysv4.3${OS_REL}; exit; } /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ && { echo i586-ncr-sysv4.3${OS_REL}; exit; } /bin/uname -p 2>/dev/null | /bin/grep pteron >/dev/null \ && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;; m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*) echo m68k-unknown-lynxos${UNAME_RELEASE} exit ;; mc68030:UNIX_System_V:4.*:*) echo m68k-atari-sysv4 exit ;; TSUNAMI:LynxOS:2.*:*) echo sparc-unknown-lynxos${UNAME_RELEASE} exit ;; rs6000:LynxOS:2.*:*) echo rs6000-unknown-lynxos${UNAME_RELEASE} exit ;; PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.[02]*:*) echo powerpc-unknown-lynxos${UNAME_RELEASE} exit ;; SM[BE]S:UNIX_SV:*:*) echo mips-dde-sysv${UNAME_RELEASE} exit ;; RM*:ReliantUNIX-*:*:*) echo mips-sni-sysv4 exit ;; RM*:SINIX-*:*:*) echo mips-sni-sysv4 exit ;; *:SINIX-*:*:*) if uname -p 2>/dev/null >/dev/null ; then UNAME_MACHINE=`(uname -p) 2>/dev/null` echo ${UNAME_MACHINE}-sni-sysv4 else echo ns32k-sni-sysv fi exit ;; PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort # says echo i586-unisys-sysv4 exit ;; *:UNIX_System_V:4*:FTX*) # From Gerald Hewes . # How about differentiating between stratus architectures? -djm echo hppa1.1-stratus-sysv4 exit ;; *:*:*:FTX*) # From seanf@swdc.stratus.com. echo i860-stratus-sysv4 exit ;; i*86:VOS:*:*) # From Paul.Green@stratus.com. echo ${UNAME_MACHINE}-stratus-vos exit ;; *:VOS:*:*) # From Paul.Green@stratus.com. echo hppa1.1-stratus-vos exit ;; mc68*:A/UX:*:*) echo m68k-apple-aux${UNAME_RELEASE} exit ;; news*:NEWS-OS:6*:*) echo mips-sony-newsos6 exit ;; R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*) if [ -d /usr/nec ]; then echo mips-nec-sysv${UNAME_RELEASE} else echo mips-unknown-sysv${UNAME_RELEASE} fi exit ;; BeBox:BeOS:*:*) # BeOS running on hardware made by Be, PPC only. echo powerpc-be-beos exit ;; BeMac:BeOS:*:*) # BeOS running on Mac or Mac clone, PPC only. echo powerpc-apple-beos exit ;; BePC:BeOS:*:*) # BeOS running on Intel PC compatible. echo i586-pc-beos exit ;; BePC:Haiku:*:*) # Haiku running on Intel PC compatible. echo i586-pc-haiku exit ;; x86_64:Haiku:*:*) echo x86_64-unknown-haiku exit ;; SX-4:SUPER-UX:*:*) echo sx4-nec-superux${UNAME_RELEASE} exit ;; SX-5:SUPER-UX:*:*) echo sx5-nec-superux${UNAME_RELEASE} exit ;; SX-6:SUPER-UX:*:*) echo sx6-nec-superux${UNAME_RELEASE} exit ;; SX-7:SUPER-UX:*:*) echo sx7-nec-superux${UNAME_RELEASE} exit ;; SX-8:SUPER-UX:*:*) echo sx8-nec-superux${UNAME_RELEASE} exit ;; SX-8R:SUPER-UX:*:*) echo sx8r-nec-superux${UNAME_RELEASE} exit ;; Power*:Rhapsody:*:*) echo powerpc-apple-rhapsody${UNAME_RELEASE} exit ;; *:Rhapsody:*:*) echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE} exit ;; *:Darwin:*:*) UNAME_PROCESSOR=`uname -p` || UNAME_PROCESSOR=unknown eval $set_cc_for_build if test "$UNAME_PROCESSOR" = unknown ; then UNAME_PROCESSOR=powerpc fi if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then if (echo '#ifdef __LP64__'; echo IS_64BIT_ARCH; echo '#endif') | \ (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \ grep IS_64BIT_ARCH >/dev/null then case $UNAME_PROCESSOR in i386) UNAME_PROCESSOR=x86_64 ;; powerpc) UNAME_PROCESSOR=powerpc64 ;; esac fi fi echo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE} exit ;; *:procnto*:*:* | *:QNX:[0123456789]*:*) UNAME_PROCESSOR=`uname -p` if test "$UNAME_PROCESSOR" = "x86"; then UNAME_PROCESSOR=i386 UNAME_MACHINE=pc fi echo ${UNAME_PROCESSOR}-${UNAME_MACHINE}-nto-qnx${UNAME_RELEASE} exit ;; *:QNX:*:4*) echo i386-pc-qnx exit ;; NEO-?:NONSTOP_KERNEL:*:*) echo neo-tandem-nsk${UNAME_RELEASE} exit ;; NSE-*:NONSTOP_KERNEL:*:*) echo nse-tandem-nsk${UNAME_RELEASE} exit ;; NSR-?:NONSTOP_KERNEL:*:*) echo nsr-tandem-nsk${UNAME_RELEASE} exit ;; *:NonStop-UX:*:*) echo mips-compaq-nonstopux exit ;; BS2000:POSIX*:*:*) echo bs2000-siemens-sysv exit ;; DS/*:UNIX_System_V:*:*) echo ${UNAME_MACHINE}-${UNAME_SYSTEM}-${UNAME_RELEASE} exit ;; *:Plan9:*:*) # "uname -m" is not consistent, so use $cputype instead. 386 # is converted to i386 for consistency with other x86 # operating systems. if test "$cputype" = "386"; then UNAME_MACHINE=i386 else UNAME_MACHINE="$cputype" fi echo ${UNAME_MACHINE}-unknown-plan9 exit ;; *:TOPS-10:*:*) echo pdp10-unknown-tops10 exit ;; *:TENEX:*:*) echo pdp10-unknown-tenex exit ;; KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*) echo pdp10-dec-tops20 exit ;; XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*) echo pdp10-xkl-tops20 exit ;; *:TOPS-20:*:*) echo pdp10-unknown-tops20 exit ;; *:ITS:*:*) echo pdp10-unknown-its exit ;; SEI:*:*:SEIUX) echo mips-sei-seiux${UNAME_RELEASE} exit ;; *:DragonFly:*:*) echo ${UNAME_MACHINE}-unknown-dragonfly`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` exit ;; *:*VMS:*:*) UNAME_MACHINE=`(uname -p) 2>/dev/null` case "${UNAME_MACHINE}" in A*) echo alpha-dec-vms ; exit ;; I*) echo ia64-dec-vms ; exit ;; V*) echo vax-dec-vms ; exit ;; esac ;; *:XENIX:*:SysV) echo i386-pc-xenix exit ;; i*86:skyos:*:*) echo ${UNAME_MACHINE}-pc-skyos`echo ${UNAME_RELEASE}` | sed -e 's/ .*$//' exit ;; i*86:rdos:*:*) echo ${UNAME_MACHINE}-pc-rdos exit ;; i*86:AROS:*:*) echo ${UNAME_MACHINE}-pc-aros exit ;; x86_64:VMkernel:*:*) echo ${UNAME_MACHINE}-unknown-esx exit ;; esac eval $set_cc_for_build cat >$dummy.c < # include #endif main () { #if defined (sony) #if defined (MIPSEB) /* BFD wants "bsd" instead of "newsos". Perhaps BFD should be changed, I don't know.... */ printf ("mips-sony-bsd\n"); exit (0); #else #include printf ("m68k-sony-newsos%s\n", #ifdef NEWSOS4 "4" #else "" #endif ); exit (0); #endif #endif #if defined (__arm) && defined (__acorn) && defined (__unix) printf ("arm-acorn-riscix\n"); exit (0); #endif #if defined (hp300) && !defined (hpux) printf ("m68k-hp-bsd\n"); exit (0); #endif #if defined (NeXT) #if !defined (__ARCHITECTURE__) #define __ARCHITECTURE__ "m68k" #endif int version; version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`; if (version < 4) printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version); else printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version); exit (0); #endif #if defined (MULTIMAX) || defined (n16) #if defined (UMAXV) printf ("ns32k-encore-sysv\n"); exit (0); #else #if defined (CMU) printf ("ns32k-encore-mach\n"); exit (0); #else printf ("ns32k-encore-bsd\n"); exit (0); #endif #endif #endif #if defined (__386BSD__) printf ("i386-pc-bsd\n"); exit (0); #endif #if defined (sequent) #if defined (i386) printf ("i386-sequent-dynix\n"); exit (0); #endif #if defined (ns32000) printf ("ns32k-sequent-dynix\n"); exit (0); #endif #endif #if defined (_SEQUENT_) struct utsname un; uname(&un); if (strncmp(un.version, "V2", 2) == 0) { printf ("i386-sequent-ptx2\n"); exit (0); } if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */ printf ("i386-sequent-ptx1\n"); exit (0); } printf ("i386-sequent-ptx\n"); exit (0); #endif #if defined (vax) # if !defined (ultrix) # include # if defined (BSD) # if BSD == 43 printf ("vax-dec-bsd4.3\n"); exit (0); # else # if BSD == 199006 printf ("vax-dec-bsd4.3reno\n"); exit (0); # else printf ("vax-dec-bsd\n"); exit (0); # endif # endif # else printf ("vax-dec-bsd\n"); exit (0); # endif # else printf ("vax-dec-ultrix\n"); exit (0); # endif #endif #if defined (alliant) && defined (i860) printf ("i860-alliant-bsd\n"); exit (0); #endif exit (1); } EOF $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null && SYSTEM_NAME=`$dummy` && { echo "$SYSTEM_NAME"; exit; } # Apollos put the system type in the environment. test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit; } # Convex versions that predate uname can use getsysinfo(1) if [ -x /usr/convex/getsysinfo ] then case `getsysinfo -f cpu_type` in c1*) echo c1-convex-bsd exit ;; c2*) if getsysinfo -f scalar_acc then echo c32-convex-bsd else echo c2-convex-bsd fi exit ;; c34*) echo c34-convex-bsd exit ;; c38*) echo c38-convex-bsd exit ;; c4*) echo c4-convex-bsd exit ;; esac fi cat >&2 < in order to provide the needed information to handle your system. config.guess timestamp = $timestamp uname -m = `(uname -m) 2>/dev/null || echo unknown` uname -r = `(uname -r) 2>/dev/null || echo unknown` uname -s = `(uname -s) 2>/dev/null || echo unknown` uname -v = `(uname -v) 2>/dev/null || echo unknown` /usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null` /bin/uname -X = `(/bin/uname -X) 2>/dev/null` hostinfo = `(hostinfo) 2>/dev/null` /bin/universe = `(/bin/universe) 2>/dev/null` /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null` /bin/arch = `(/bin/arch) 2>/dev/null` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null` UNAME_MACHINE = ${UNAME_MACHINE} UNAME_RELEASE = ${UNAME_RELEASE} UNAME_SYSTEM = ${UNAME_SYSTEM} UNAME_VERSION = ${UNAME_VERSION} EOF exit 1 # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "timestamp='" # time-stamp-format: "%:y-%02m-%02d" # time-stamp-end: "'" # End: dibbler-1.0.1/SrvCfgMgr/0000775000175000017500000000000012561700421011755 500000000000000dibbler-1.0.1/SrvCfgMgr/tests/0000775000175000017500000000000012561700421013117 500000000000000dibbler-1.0.1/SrvCfgMgr/tests/run_tests.cpp0000664000175000017500000000031712233256142015574 00000000000000 #define STDC_HEADERS 1 #include #include int main(int argc, char* argv[]) { testing::InitGoogleTest(&argc, argv); int status = RUN_ALL_TESTS(); return status; } dibbler-1.0.1/SrvCfgMgr/tests/testdata/0000775000175000017500000000000012561700421014730 500000000000000dibbler-1.0.1/SrvCfgMgr/tests/testdata/info.txt0000664000175000017500000000007412233256142016347 00000000000000This is an empty directory. Test data will be stored here. dibbler-1.0.1/SrvCfgMgr/tests/testdata/keys-mapping0000644000175000017500000000022212277722750017206 00000000000000# Comments starting with # are ignored. # So are empty lines 00:01:02:03:04:06:07:08:09, 0x010203ff 00:04:ff:ab:cd:ef:09:87:65:a1:bc, 0xabcdef00 dibbler-1.0.1/SrvCfgMgr/tests/expressions_unittest.cc0000644000175000017500000000501712277722750017705 00000000000000#include #include "SrvCfgMgr.h" #include "SrvIfaceMgr.h" #include "NodeClientSpecific.h" #include "SrvMsg.h" #include "SrvMsgSolicit.h" #include "OptGeneric.h" #include "OptUserClass.h" #include "OptVendorClass.h" #include "OptVendorSpecInfo.h" #include using namespace std; namespace { class ExpressionsTest : public ::testing::Test { public: ExpressionsTest() { TSrvIfaceMgr::instanceCreate(SRVIFACEMGR_FILE); if ( SrvIfaceMgr().isDone() ) { return; } string config = " iface eth0 { class { pool 2001:db8:1::/64 } }"; string cfgfile = "testdata/server-2.conf"; ofstream file(cfgfile.c_str()); file << config; file.close(); TSrvCfgMgr::instanceCreate(cfgfile, SRVCFGMGR_FILE); if ( SrvCfgMgr().isDone() ) { return; } } }; TEST_F(ExpressionsTest, simple) { char buffer[] = { 0 }; // This is content for tested options char payload1[] = { 0x41, 0x42, 0x43, 0x44 }; // ABCD char payload2[] = { 0, 0, 0x11, 0x8b, // uint32_t = 4491 (enterprise-id) 0, 3, // uint16_t = 3 (data length) 0x45, 0x46, 0x47 }; // "EFG" char payload3[] = { 0x48, 0x49, 0x4a, 0x4b, 0x4c }; // HIJKL SPtr addr = new TIPv6Addr("2001:db8:1::1", true); SPtr msg = new TSrvMsgSolicit(1, addr, buffer, 0); const uint32_t enterprise = 1701; SPtr opt; // add user-class option opt = new TOptUserClass(OPTION_USER_CLASS, payload1, sizeof(payload1), NULL); msg->addOption(opt); // add vendor-class option opt = new TOptVendorClass(OPTION_VENDOR_CLASS, payload2, sizeof(payload2), NULL); msg->addOption(opt); // add vendor-spec option opt = new TOptVendorSpecInfo(OPTION_VENDOR_OPTS, enterprise, 1, payload3, sizeof(payload3), NULL); msg->addOption(opt); // check that the enterprise-num can be extracted properly NodeClientSpecific c(NodeClientSpecific::CLIENT_VENDOR_CLASS_ENTERPRISE_NUM); EXPECT_EQ("4491", c.exec(msg)); // check that the content of the vendor spec info option can be extracted properly NodeClientSpecific d(NodeClientSpecific::CLIENT_VENDOR_CLASS_DATA); EXPECT_EQ("EFG", d.exec(msg)); // check that the enterprise-num can be extracted properly NodeClientSpecific e(NodeClientSpecific::CLIENT_VENDOR_SPEC_ENTERPRISE_NUM); EXPECT_EQ("1701", e.exec(msg)); // check that the content of the vendor spec info option can be extracted properly NodeClientSpecific f(NodeClientSpecific::CLIENT_VENDOR_SPEC_DATA); EXPECT_EQ("HIJKL", f.exec(msg)); } } dibbler-1.0.1/SrvCfgMgr/tests/Makefile.am0000644000175000017500000000402312277722750015105 00000000000000AM_CPPFLAGS = -I$(top_srcdir)/SrvCfgMgr AM_CPPFLAGS += -I$(top_srcdir)/CfgMgr AM_CPPFLAGS += -I$(top_srcdir)/SrvIfaceMgr AM_CPPFLAGS += -I$(top_srcdir)/IfaceMgr AM_CPPFLAGS += -I$(top_srcdir)/AddrMgr AM_CPPFLAGS += -I$(top_srcdir)/SrvAddrMgr AM_CPPFLAGS += -I$(top_srcdir)/Options AM_CPPFLAGS += -I$(top_srcdir)/SrvOptions AM_CPPFLAGS += -I$(top_srcdir)/Messages AM_CPPFLAGS += -I$(top_srcdir)/SrvMessages AM_CPPFLAGS += -I$(top_srcdir)/Misc # This is to workaround long long in gtest.h AM_CPPFLAGS += $(GTEST_INCLUDES) -Wno-long-long -Wno-variadic-macros info: @echo "GTEST_LDADD=$(GTEST_LDADD)" @echo "GTEST_LDFLAGS=$(GTEST_LDFLAGS)" @echo "GTEST_INCLUDES=$(GTEST_INCLUDES)" @echo "HAVE_GTEST=$(HAVE_GTEST)" TESTS = if HAVE_GTEST TESTS += SrvCfgMgr_tests SrvCfgMgr_tests_SOURCES = run_tests.cpp SrvCfgMgr_tests_SOURCES += SrvCfgMgr_unittest.cc SrvCfgMgr_tests_SOURCES += expressions_unittest.cc SrvCfgMgr_tests_LDFLAGS = $(AM_LDFLAGS) $(GTEST_LDFLAGS) SrvCfgMgr_tests_LDADD = $(GTEST_LDADD) SrvCfgMgr_tests_LDADD += $(top_builddir)/SrvTransMgr/libSrvTransMgr.a SrvCfgMgr_tests_LDADD += $(top_builddir)/SrvCfgMgr/libSrvCfgMgr.a SrvCfgMgr_tests_LDADD += $(top_builddir)/CfgMgr/libCfgMgr.a SrvCfgMgr_tests_LDADD += $(top_builddir)/SrvIfaceMgr/libSrvIfaceMgr.a SrvCfgMgr_tests_LDADD += $(top_builddir)/IfaceMgr/libIfaceMgr.a SrvCfgMgr_tests_LDADD += $(top_builddir)/SrvAddrMgr/libSrvAddrMgr.a SrvCfgMgr_tests_LDADD += $(top_builddir)/AddrMgr/libAddrMgr.a SrvCfgMgr_tests_LDADD += $(top_builddir)/SrvMessages/libSrvMessages.a SrvCfgMgr_tests_LDADD += $(top_builddir)/Messages/libMessages.a SrvCfgMgr_tests_LDADD += $(top_builddir)/SrvOptions/libSrvOptions.a SrvCfgMgr_tests_LDADD += $(top_builddir)/Options/libOptions.a SrvCfgMgr_tests_LDADD += $(top_builddir)/Misc/libMisc.a SrvCfgMgr_tests_LDADD += $(top_builddir)/poslib/libPoslib.a SrvCfgMgr_tests_LDADD += $(top_builddir)/nettle/libNettle.a SrvCfgMgr_tests_LDADD += $(top_builddir)/@PORT_SUBDIR@/libLowLevel.a dist_noinst_DATA = testdata/info.txt testdata/keys-mapping endif noinst_PROGRAMS = $(TESTS) dibbler-1.0.1/SrvCfgMgr/tests/SrvCfgMgr_unittest.cc0000644000175000017500000000676612277722750017177 00000000000000#include "IPv6Addr.h" #include "SrvIfaceMgr.h" #include "SrvCfgMgr.h" #include "OptAddrLst.h" #include using namespace std; namespace { class NakedSrvIfaceMgr: public TSrvIfaceMgr { public: NakedSrvIfaceMgr(const std::string& xmlFile) : TSrvIfaceMgr(xmlFile) { TSrvIfaceMgr::Instance = this; } ~NakedSrvIfaceMgr() { TSrvIfaceMgr::Instance = NULL; } }; class SrvCfgMgrTest : public ::testing::Test { public: SrvCfgMgrTest() { ifacemgr_ = new NakedSrvIfaceMgr("testdata/server-IfaceMgr.xml"); // try to pick up an up and running interface ifacemgr_->firstIface(); while ( (iface_ = ifacemgr_->getIface()) && (!iface_->flagUp() || !iface_->flagRunning())) { } } virtual ~SrvCfgMgrTest() { unlink("testdata/server-IfaceMgr.xml"); } NakedSrvIfaceMgr * ifacemgr_; SPtr iface_; }; class NakedSrvCfgMgr : public TSrvCfgMgr { public: NakedSrvCfgMgr(const std::string& config, const std::string& dbfile) :TSrvCfgMgr(config, dbfile) { } }; TEST_F(SrvCfgMgrTest, constructor) { ASSERT_TRUE(iface_); string cfg = string("iface \"") + iface_->getName() + "\" {\n" " class { pool 2001:db8:1111::/64 }\n" " option nis-server 2000::400,2000::401,2000::404,2000::405,2000::405\n" " option nis-domain nis.example.com\n" " option nis+-server 2000::501,2000::502\n" " option nis+-domain nisplus.example.com\n" "}\n" "\n" "iface nonexistent0 {\n" " class { pool 2003::/64 }\n" "}"; ofstream cfgfile("testdata/server-1.conf"); cfgfile << cfg; cfgfile.close(); SPtr cfgmgr = new NakedSrvCfgMgr("testdata/server-1.conf", "testdata/server-CfgMgr1.xml"); SPtr cfgIface; cfgmgr->firstIface(); while (cfgIface = cfgmgr->getIface()) { if (cfgIface->getName() == iface_->getName()) break; } if (!cfgIface) { ADD_FAILURE() << "Failed to find expected " << iface_->getName() << " interface." << endl; } else { SPtr opt = (Ptr*)cfgIface->getExtraOption(OPTION_NIS_SERVERS); EXPECT_TRUE(opt); List(TIPv6Addr) addrLst = opt->getAddrLst(); ASSERT_EQ(5u, addrLst.count()); SPtr addr; addrLst.first(); addr = addrLst.get(); ASSERT_TRUE(addr); EXPECT_EQ(string("2000::400"), addr->getPlain()); } unlink("testdata/server-1.conf"); unlink("testdata/server-CfgMgr1.xml"); } TEST_F(SrvCfgMgrTest, getDelayedAuthKeyID) { // We don't care about config here SPtr cfgmgr = new NakedSrvCfgMgr("", ""); SPtr duid1(new TDUID("00:01:02:03:04:06:07:08:09")); SPtr duid2(new TDUID("00:04:ff:ab:cd:ef:09:87:65:a1:bc")); SPtr duid_bogus(new TDUID("01:02:03:04")); EXPECT_EQ(0x010203ff, cfgmgr->getDelayedAuthKeyID("testdata/keys-mapping", duid1)); EXPECT_EQ(0xabcdef00, cfgmgr->getDelayedAuthKeyID("testdata/keys-mapping", duid2)); EXPECT_EQ(0, cfgmgr->getDelayedAuthKeyID("testdata/keys-mapping", duid_bogus)); EXPECT_EQ(0, cfgmgr->getDelayedAuthKeyID("no-such-file", duid1)); } } dibbler-1.0.1/SrvCfgMgr/tests/Makefile.in0000664000175000017500000010726112561652535015127 00000000000000# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ TESTS = $(am__EXEEXT_1) @HAVE_GTEST_TRUE@am__append_1 = SrvCfgMgr_tests noinst_PROGRAMS = $(am__EXEEXT_2) subdir = SrvCfgMgr/tests DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/depcomp $(am__dist_noinst_DATA_DIST) \ $(top_srcdir)/test-driver ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/libtool.m4 \ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/include/dibbler-config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = @HAVE_GTEST_TRUE@am__EXEEXT_1 = SrvCfgMgr_tests$(EXEEXT) am__EXEEXT_2 = $(am__EXEEXT_1) PROGRAMS = $(noinst_PROGRAMS) am__SrvCfgMgr_tests_SOURCES_DIST = run_tests.cpp SrvCfgMgr_unittest.cc \ expressions_unittest.cc @HAVE_GTEST_TRUE@am_SrvCfgMgr_tests_OBJECTS = run_tests.$(OBJEXT) \ @HAVE_GTEST_TRUE@ SrvCfgMgr_unittest.$(OBJEXT) \ @HAVE_GTEST_TRUE@ expressions_unittest.$(OBJEXT) SrvCfgMgr_tests_OBJECTS = $(am_SrvCfgMgr_tests_OBJECTS) am__DEPENDENCIES_1 = @HAVE_GTEST_TRUE@SrvCfgMgr_tests_DEPENDENCIES = $(am__DEPENDENCIES_1) \ @HAVE_GTEST_TRUE@ $(top_builddir)/SrvTransMgr/libSrvTransMgr.a \ @HAVE_GTEST_TRUE@ $(top_builddir)/SrvCfgMgr/libSrvCfgMgr.a \ @HAVE_GTEST_TRUE@ $(top_builddir)/CfgMgr/libCfgMgr.a \ @HAVE_GTEST_TRUE@ $(top_builddir)/SrvIfaceMgr/libSrvIfaceMgr.a \ @HAVE_GTEST_TRUE@ $(top_builddir)/IfaceMgr/libIfaceMgr.a \ @HAVE_GTEST_TRUE@ $(top_builddir)/SrvAddrMgr/libSrvAddrMgr.a \ @HAVE_GTEST_TRUE@ $(top_builddir)/AddrMgr/libAddrMgr.a \ @HAVE_GTEST_TRUE@ $(top_builddir)/SrvMessages/libSrvMessages.a \ @HAVE_GTEST_TRUE@ $(top_builddir)/Messages/libMessages.a \ @HAVE_GTEST_TRUE@ $(top_builddir)/SrvOptions/libSrvOptions.a \ @HAVE_GTEST_TRUE@ $(top_builddir)/Options/libOptions.a \ @HAVE_GTEST_TRUE@ $(top_builddir)/Misc/libMisc.a \ @HAVE_GTEST_TRUE@ $(top_builddir)/poslib/libPoslib.a \ @HAVE_GTEST_TRUE@ $(top_builddir)/nettle/libNettle.a \ @HAVE_GTEST_TRUE@ $(top_builddir)/@PORT_SUBDIR@/libLowLevel.a AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = SrvCfgMgr_tests_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CXXLD) \ $(AM_CXXFLAGS) $(CXXFLAGS) $(SrvCfgMgr_tests_LDFLAGS) \ $(LDFLAGS) -o $@ AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)/include depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) LTCXXCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CXXFLAGS) $(CXXFLAGS) AM_V_CXX = $(am__v_CXX_@AM_V@) am__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@) am__v_CXX_0 = @echo " CXX " $@; am__v_CXX_1 = CXXLD = $(CXX) CXXLINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \ $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CXXLD = $(am__v_CXXLD_@AM_V@) am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@) am__v_CXXLD_0 = @echo " CXXLD " $@; am__v_CXXLD_1 = SOURCES = $(SrvCfgMgr_tests_SOURCES) DIST_SOURCES = $(am__SrvCfgMgr_tests_SOURCES_DIST) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__dist_noinst_DATA_DIST = testdata/info.txt testdata/keys-mapping DATA = $(dist_noinst_DATA) am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags am__tty_colors_dummy = \ mgn= red= grn= lgn= blu= brg= std=; \ am__color_tests=no am__tty_colors = { \ $(am__tty_colors_dummy); \ if test "X$(AM_COLOR_TESTS)" = Xno; then \ am__color_tests=no; \ elif test "X$(AM_COLOR_TESTS)" = Xalways; then \ am__color_tests=yes; \ elif test "X$$TERM" != Xdumb && { test -t 1; } 2>/dev/null; then \ am__color_tests=yes; \ fi; \ if test $$am__color_tests = yes; then \ red=''; \ grn=''; \ lgn=''; \ blu=''; \ mgn=''; \ brg=''; \ std=''; \ fi; \ } am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__recheck_rx = ^[ ]*:recheck:[ ]* am__global_test_result_rx = ^[ ]*:global-test-result:[ ]* am__copy_in_global_log_rx = ^[ ]*:copy-in-global-log:[ ]* # A command that, given a newline-separated list of test names on the # standard input, print the name of the tests that are to be re-run # upon "make recheck". am__list_recheck_tests = $(AWK) '{ \ recheck = 1; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ { \ if ((getline line2 < ($$0 ".log")) < 0) \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[nN][Oo]/) \ { \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[yY][eE][sS]/) \ { \ break; \ } \ }; \ if (recheck) \ print $$0; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # A command that, given a newline-separated list of test names on the # standard input, create the global log from their .trs and .log files. am__create_global_log = $(AWK) ' \ function fatal(msg) \ { \ print "fatal: making $@: " msg | "cat >&2"; \ exit 1; \ } \ function rst_section(header) \ { \ print header; \ len = length(header); \ for (i = 1; i <= len; i = i + 1) \ printf "="; \ printf "\n\n"; \ } \ { \ copy_in_global_log = 1; \ global_test_result = "RUN"; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".trs"); \ if (line ~ /$(am__global_test_result_rx)/) \ { \ sub("$(am__global_test_result_rx)", "", line); \ sub("[ ]*$$", "", line); \ global_test_result = line; \ } \ else if (line ~ /$(am__copy_in_global_log_rx)[nN][oO]/) \ copy_in_global_log = 0; \ }; \ if (copy_in_global_log) \ { \ rst_section(global_test_result ": " $$0); \ while ((rc = (getline line < ($$0 ".log"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".log"); \ print line; \ }; \ printf "\n"; \ }; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # Restructured Text title. am__rst_title = { sed 's/.*/ & /;h;s/./=/g;p;x;s/ *$$//;p;g' && echo; } # Solaris 10 'make', and several other traditional 'make' implementations, # pass "-e" to $(SHELL), and POSIX 2008 even requires this. Work around it # by disabling -e (using the XSI extension "set +e") if it's set. am__sh_e_setup = case $$- in *e*) set +e;; esac # Default flags passed to test drivers. am__common_driver_flags = \ --color-tests "$$am__color_tests" \ --enable-hard-errors "$$am__enable_hard_errors" \ --expect-failure "$$am__expect_failure" # To be inserted before the command running the test. Creates the # directory for the log if needed. Stores in $dir the directory # containing $f, in $tst the test, in $log the log. Executes the # developer- defined test setup AM_TESTS_ENVIRONMENT (if any), and # passes TESTS_ENVIRONMENT. Set up options for the wrapper that # will run the test scripts (or their associated LOG_COMPILER, if # thy have one). am__check_pre = \ $(am__sh_e_setup); \ $(am__vpath_adj_setup) $(am__vpath_adj) \ $(am__tty_colors); \ srcdir=$(srcdir); export srcdir; \ case "$@" in \ */*) am__odir=`echo "./$@" | sed 's|/[^/]*$$||'`;; \ *) am__odir=.;; \ esac; \ test "x$$am__odir" = x"." || test -d "$$am__odir" \ || $(MKDIR_P) "$$am__odir" || exit $$?; \ if test -f "./$$f"; then dir=./; \ elif test -f "$$f"; then dir=; \ else dir="$(srcdir)/"; fi; \ tst=$$dir$$f; log='$@'; \ if test -n '$(DISABLE_HARD_ERRORS)'; then \ am__enable_hard_errors=no; \ else \ am__enable_hard_errors=yes; \ fi; \ case " $(XFAIL_TESTS) " in \ *[\ \ ]$$f[\ \ ]* | *[\ \ ]$$dir$$f[\ \ ]*) \ am__expect_failure=yes;; \ *) \ am__expect_failure=no;; \ esac; \ $(AM_TESTS_ENVIRONMENT) $(TESTS_ENVIRONMENT) # A shell command to get the names of the tests scripts with any registered # extension removed (i.e., equivalently, the names of the test logs, with # the '.log' extension removed). The result is saved in the shell variable # '$bases'. This honors runtime overriding of TESTS and TEST_LOGS. Sadly, # we cannot use something simpler, involving e.g., "$(TEST_LOGS:.log=)", # since that might cause problem with VPATH rewrites for suffix-less tests. # See also 'test-harness-vpath-rewrite.sh' and 'test-trs-basic.sh'. am__set_TESTS_bases = \ bases='$(TEST_LOGS)'; \ bases=`for i in $$bases; do echo $$i; done | sed 's/\.log$$//'`; \ bases=`echo $$bases` RECHECK_LOGS = $(TEST_LOGS) AM_RECURSIVE_TARGETS = check recheck TEST_SUITE_LOG = test-suite.log TEST_EXTENSIONS = @EXEEXT@ .test LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver LOG_COMPILE = $(LOG_COMPILER) $(AM_LOG_FLAGS) $(LOG_FLAGS) am__set_b = \ case '$@' in \ */*) \ case '$*' in \ */*) b='$*';; \ *) b=`echo '$@' | sed 's/\.log$$//'`; \ esac;; \ *) \ b='$*';; \ esac am__test_logs1 = $(TESTS:=.log) am__test_logs2 = $(am__test_logs1:@EXEEXT@.log=.log) TEST_LOGS = $(am__test_logs2:.test.log=.log) TEST_LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver TEST_LOG_COMPILE = $(TEST_LOG_COMPILER) $(AM_TEST_LOG_FLAGS) \ $(TEST_LOG_FLAGS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALLOCA = @ALLOCA@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ ARCH = @ARCH@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ EXTRA_DIST_SUBDIRS = @EXTRA_DIST_SUBDIRS@ FGREP = @FGREP@ GREP = @GREP@ GTEST_INCLUDES = @GTEST_INCLUDES@ GTEST_LDADD = @GTEST_LDADD@ GTEST_LDFLAGS = @GTEST_LDFLAGS@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LINKPRINT = @LINKPRINT@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PORT_CFLAGS = @PORT_CFLAGS@ PORT_LDFLAGS = @PORT_LDFLAGS@ PORT_SUBDIR = @PORT_SUBDIR@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ subdirs = @subdirs@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ # This is to workaround long long in gtest.h AM_CPPFLAGS = -I$(top_srcdir)/SrvCfgMgr -I$(top_srcdir)/CfgMgr \ -I$(top_srcdir)/SrvIfaceMgr -I$(top_srcdir)/IfaceMgr \ -I$(top_srcdir)/AddrMgr -I$(top_srcdir)/SrvAddrMgr \ -I$(top_srcdir)/Options -I$(top_srcdir)/SrvOptions \ -I$(top_srcdir)/Messages -I$(top_srcdir)/SrvMessages \ -I$(top_srcdir)/Misc $(GTEST_INCLUDES) -Wno-long-long \ -Wno-variadic-macros @HAVE_GTEST_TRUE@SrvCfgMgr_tests_SOURCES = run_tests.cpp \ @HAVE_GTEST_TRUE@ SrvCfgMgr_unittest.cc expressions_unittest.cc @HAVE_GTEST_TRUE@SrvCfgMgr_tests_LDFLAGS = $(AM_LDFLAGS) $(GTEST_LDFLAGS) @HAVE_GTEST_TRUE@SrvCfgMgr_tests_LDADD = $(GTEST_LDADD) \ @HAVE_GTEST_TRUE@ $(top_builddir)/SrvTransMgr/libSrvTransMgr.a \ @HAVE_GTEST_TRUE@ $(top_builddir)/SrvCfgMgr/libSrvCfgMgr.a \ @HAVE_GTEST_TRUE@ $(top_builddir)/CfgMgr/libCfgMgr.a \ @HAVE_GTEST_TRUE@ $(top_builddir)/SrvIfaceMgr/libSrvIfaceMgr.a \ @HAVE_GTEST_TRUE@ $(top_builddir)/IfaceMgr/libIfaceMgr.a \ @HAVE_GTEST_TRUE@ $(top_builddir)/SrvAddrMgr/libSrvAddrMgr.a \ @HAVE_GTEST_TRUE@ $(top_builddir)/AddrMgr/libAddrMgr.a \ @HAVE_GTEST_TRUE@ $(top_builddir)/SrvMessages/libSrvMessages.a \ @HAVE_GTEST_TRUE@ $(top_builddir)/Messages/libMessages.a \ @HAVE_GTEST_TRUE@ $(top_builddir)/SrvOptions/libSrvOptions.a \ @HAVE_GTEST_TRUE@ $(top_builddir)/Options/libOptions.a \ @HAVE_GTEST_TRUE@ $(top_builddir)/Misc/libMisc.a \ @HAVE_GTEST_TRUE@ $(top_builddir)/poslib/libPoslib.a \ @HAVE_GTEST_TRUE@ $(top_builddir)/nettle/libNettle.a \ @HAVE_GTEST_TRUE@ $(top_builddir)/@PORT_SUBDIR@/libLowLevel.a @HAVE_GTEST_TRUE@dist_noinst_DATA = testdata/info.txt testdata/keys-mapping all: all-am .SUFFIXES: .SUFFIXES: .cc .cpp .lo .log .o .obj .test .test$(EXEEXT) .trs $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign SrvCfgMgr/tests/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign SrvCfgMgr/tests/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstPROGRAMS: @list='$(noinst_PROGRAMS)'; test -n "$$list" || exit 0; \ echo " rm -f" $$list; \ rm -f $$list || exit $$?; \ test -n "$(EXEEXT)" || exit 0; \ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ echo " rm -f" $$list; \ rm -f $$list SrvCfgMgr_tests$(EXEEXT): $(SrvCfgMgr_tests_OBJECTS) $(SrvCfgMgr_tests_DEPENDENCIES) $(EXTRA_SrvCfgMgr_tests_DEPENDENCIES) @rm -f SrvCfgMgr_tests$(EXEEXT) $(AM_V_CXXLD)$(SrvCfgMgr_tests_LINK) $(SrvCfgMgr_tests_OBJECTS) $(SrvCfgMgr_tests_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/SrvCfgMgr_unittest.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/expressions_unittest.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/run_tests.Po@am__quote@ .cc.o: @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $< .cc.obj: @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .cc.lo: @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LTCXXCOMPILE) -c -o $@ $< .cpp.o: @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $< .cpp.obj: @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .cpp.lo: @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LTCXXCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags # Recover from deleted '.trs' file; this should ensure that # "rm -f foo.log; make foo.trs" re-run 'foo.test', and re-create # both 'foo.log' and 'foo.trs'. Break the recipe in two subshells # to avoid problems with "make -n". .log.trs: rm -f $< $@ $(MAKE) $(AM_MAKEFLAGS) $< # Leading 'am--fnord' is there to ensure the list of targets does not # expand to empty, as could happen e.g. with make check TESTS=''. am--fnord $(TEST_LOGS) $(TEST_LOGS:.log=.trs): $(am__force_recheck) am--force-recheck: @: $(TEST_SUITE_LOG): $(TEST_LOGS) @$(am__set_TESTS_bases); \ am__f_ok () { test -f "$$1" && test -r "$$1"; }; \ redo_bases=`for i in $$bases; do \ am__f_ok $$i.trs && am__f_ok $$i.log || echo $$i; \ done`; \ if test -n "$$redo_bases"; then \ redo_logs=`for i in $$redo_bases; do echo $$i.log; done`; \ redo_results=`for i in $$redo_bases; do echo $$i.trs; done`; \ if $(am__make_dryrun); then :; else \ rm -f $$redo_logs && rm -f $$redo_results || exit 1; \ fi; \ fi; \ if test -n "$$am__remaking_logs"; then \ echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \ "recursion detected" >&2; \ else \ am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \ fi; \ if $(am__make_dryrun); then :; else \ st=0; \ errmsg="fatal: making $(TEST_SUITE_LOG): failed to create"; \ for i in $$redo_bases; do \ test -f $$i.trs && test -r $$i.trs \ || { echo "$$errmsg $$i.trs" >&2; st=1; }; \ test -f $$i.log && test -r $$i.log \ || { echo "$$errmsg $$i.log" >&2; st=1; }; \ done; \ test $$st -eq 0 || exit 1; \ fi @$(am__sh_e_setup); $(am__tty_colors); $(am__set_TESTS_bases); \ ws='[ ]'; \ results=`for b in $$bases; do echo $$b.trs; done`; \ test -n "$$results" || results=/dev/null; \ all=` grep "^$$ws*:test-result:" $$results | wc -l`; \ pass=` grep "^$$ws*:test-result:$$ws*PASS" $$results | wc -l`; \ fail=` grep "^$$ws*:test-result:$$ws*FAIL" $$results | wc -l`; \ skip=` grep "^$$ws*:test-result:$$ws*SKIP" $$results | wc -l`; \ xfail=`grep "^$$ws*:test-result:$$ws*XFAIL" $$results | wc -l`; \ xpass=`grep "^$$ws*:test-result:$$ws*XPASS" $$results | wc -l`; \ error=`grep "^$$ws*:test-result:$$ws*ERROR" $$results | wc -l`; \ if test `expr $$fail + $$xpass + $$error` -eq 0; then \ success=true; \ else \ success=false; \ fi; \ br='==================='; br=$$br$$br$$br$$br; \ result_count () \ { \ if test x"$$1" = x"--maybe-color"; then \ maybe_colorize=yes; \ elif test x"$$1" = x"--no-color"; then \ maybe_colorize=no; \ else \ echo "$@: invalid 'result_count' usage" >&2; exit 4; \ fi; \ shift; \ desc=$$1 count=$$2; \ if test $$maybe_colorize = yes && test $$count -gt 0; then \ color_start=$$3 color_end=$$std; \ else \ color_start= color_end=; \ fi; \ echo "$${color_start}# $$desc $$count$${color_end}"; \ }; \ create_testsuite_report () \ { \ result_count $$1 "TOTAL:" $$all "$$brg"; \ result_count $$1 "PASS: " $$pass "$$grn"; \ result_count $$1 "SKIP: " $$skip "$$blu"; \ result_count $$1 "XFAIL:" $$xfail "$$lgn"; \ result_count $$1 "FAIL: " $$fail "$$red"; \ result_count $$1 "XPASS:" $$xpass "$$red"; \ result_count $$1 "ERROR:" $$error "$$mgn"; \ }; \ { \ echo "$(PACKAGE_STRING): $(subdir)/$(TEST_SUITE_LOG)" | \ $(am__rst_title); \ create_testsuite_report --no-color; \ echo; \ echo ".. contents:: :depth: 2"; \ echo; \ for b in $$bases; do echo $$b; done \ | $(am__create_global_log); \ } >$(TEST_SUITE_LOG).tmp || exit 1; \ mv $(TEST_SUITE_LOG).tmp $(TEST_SUITE_LOG); \ if $$success; then \ col="$$grn"; \ else \ col="$$red"; \ test x"$$VERBOSE" = x || cat $(TEST_SUITE_LOG); \ fi; \ echo "$${col}$$br$${std}"; \ echo "$${col}Testsuite summary for $(PACKAGE_STRING)$${std}"; \ echo "$${col}$$br$${std}"; \ create_testsuite_report --maybe-color; \ echo "$$col$$br$$std"; \ if $$success; then :; else \ echo "$${col}See $(subdir)/$(TEST_SUITE_LOG)$${std}"; \ if test -n "$(PACKAGE_BUGREPORT)"; then \ echo "$${col}Please report to $(PACKAGE_BUGREPORT)$${std}"; \ fi; \ echo "$$col$$br$$std"; \ fi; \ $$success || exit 1 check-TESTS: @list='$(RECHECK_LOGS)'; test -z "$$list" || rm -f $$list @list='$(RECHECK_LOGS:.log=.trs)'; test -z "$$list" || rm -f $$list @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ log_list=`for i in $$bases; do echo $$i.log; done`; \ trs_list=`for i in $$bases; do echo $$i.trs; done`; \ log_list=`echo $$log_list`; trs_list=`echo $$trs_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) TEST_LOGS="$$log_list"; \ exit $$?; recheck: all @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ bases=`for i in $$bases; do echo $$i; done \ | $(am__list_recheck_tests)` || exit 1; \ log_list=`for i in $$bases; do echo $$i.log; done`; \ log_list=`echo $$log_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) \ am__force_recheck=am--force-recheck \ TEST_LOGS="$$log_list"; \ exit $$? SrvCfgMgr_tests.log: SrvCfgMgr_tests$(EXEEXT) @p='SrvCfgMgr_tests$(EXEEXT)'; \ b='SrvCfgMgr_tests'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) .test.log: @p='$<'; \ $(am__set_b); \ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) @am__EXEEXT_TRUE@.test$(EXEEXT).log: @am__EXEEXT_TRUE@ @p='$<'; \ @am__EXEEXT_TRUE@ $(am__set_b); \ @am__EXEEXT_TRUE@ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ @am__EXEEXT_TRUE@ --log-file $$b.log --trs-file $$b.trs \ @am__EXEEXT_TRUE@ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ @am__EXEEXT_TRUE@ "$$tst" $(AM_TESTS_FD_REDIRECT) distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am $(MAKE) $(AM_MAKEFLAGS) check-TESTS check: check-am all-am: Makefile $(PROGRAMS) $(DATA) installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: -test -z "$(TEST_LOGS)" || rm -f $(TEST_LOGS) -test -z "$(TEST_LOGS:.log=.trs)" || rm -f $(TEST_LOGS:.log=.trs) -test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool clean-noinstPROGRAMS \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: check-am install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-TESTS check-am clean \ clean-generic clean-libtool clean-noinstPROGRAMS cscopelist-am \ ctags ctags-am distclean distclean-compile distclean-generic \ distclean-libtool distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-dvi install-dvi-am install-exec \ install-exec-am install-html install-html-am install-info \ install-info-am install-man install-pdf install-pdf-am \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ recheck tags tags-am uninstall uninstall-am info: @echo "GTEST_LDADD=$(GTEST_LDADD)" @echo "GTEST_LDFLAGS=$(GTEST_LDFLAGS)" @echo "GTEST_INCLUDES=$(GTEST_INCLUDES)" @echo "HAVE_GTEST=$(HAVE_GTEST)" # 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: dibbler-1.0.1/SrvCfgMgr/SrvCfgPD.cpp0000664000175000017500000002324712556511513014035 00000000000000/* * Dibbler - a portable DHCPv6 * * authors: Krzysztof Wnuk * changes: Tomasz Mrugalski * Nguyen Vinh Nghiem * * released under GNU GPL v2 only licence * */ #include "SrvCfgPD.h" #include "SmartPtr.h" #include "SrvParsGlobalOpt.h" #include "DHCPConst.h" #include "Logger.h" #include "SrvMsg.h" using namespace std; /* * static field initialization */ unsigned long TSrvCfgPD::StaticID_ = 0; TSrvCfgPD::TSrvCfgPD() :PD_T1Beg_(SERVER_DEFAULT_MIN_T1), PD_T1End_(SERVER_DEFAULT_MAX_T1), PD_T2Beg_(SERVER_DEFAULT_MIN_T2), PD_T2End_(SERVER_DEFAULT_MAX_T2), PD_PrefBeg_(SERVER_DEFAULT_MIN_PREF), PD_PrefEnd_(SERVER_DEFAULT_MAX_PREF), PD_ValidBeg_(SERVER_DEFAULT_MIN_VALID), PD_ValidEnd_(SERVER_DEFAULT_MAX_VALID) { ID_ = StaticID_++; PD_MaxLease_ = SERVER_DEFAULT_CLASSMAXLEASE; PD_Assigned_ = 0; PD_Count_ = 0; PD_Length_ = 0; } TSrvCfgPD::~TSrvCfgPD() { } unsigned long TSrvCfgPD::chooseTime(unsigned long beg, unsigned long end, unsigned long clntTime) { if (clntTime < beg) return beg; if (clntTime > end) return end; return clntTime; } unsigned long TSrvCfgPD::getT1(unsigned long hintT1) { return chooseTime(PD_T1Beg_, PD_T1End_, hintT1); } unsigned long TSrvCfgPD::getT2(unsigned long hintT2) { return chooseTime(PD_T2Beg_, PD_T2End_, hintT2); } unsigned long TSrvCfgPD::getPrefered(unsigned long hintPref) { return chooseTime(PD_PrefBeg_, PD_PrefEnd_, hintPref); } unsigned long TSrvCfgPD::getValid(unsigned long hintValid) { return chooseTime(PD_ValidBeg_, PD_ValidEnd_, hintValid); } unsigned long TSrvCfgPD::getPD_Length() { return PD_Length_; } bool TSrvCfgPD::setOptions(SPtr opt, int prefixLength) { int poolLength=0; Log(Debug) << "PD: Client will receive /" << prefixLength << " prefixes (T1=" << opt->getT1Beg() << ".." << opt->getT1End() << ", T2=" << opt->getT2Beg() << ".." << opt->getT2End() << ")." <getT1Beg(); PD_T2Beg_ = opt->getT2Beg(); PD_T1End_ = opt->getT1End(); PD_T2End_ = opt->getT2End(); PD_PrefBeg_ = opt->getPrefBeg(); PD_PrefEnd_ = opt->getPrefEnd(); PD_ValidBeg_ = opt->getValidBeg(); PD_ValidEnd_ = opt->getValidEnd(); PD_Length_ = prefixLength; PD_MaxLease_ = opt->getClassMaxLease(); SPtr PD_Range; opt->firstPool(); SPtr pool; if (!(pool=opt->getPool())) { Log(Error) << "Unable to find any prefix pools. Please define at least one using 'pd-pool' keyword." << LogEnd; return false; } PD_Count_ = prefixLength - pool->getPrefixLength(); if (PD_Count_ > 0) { if (PD_Count_ > 32) { PD_Count_ = DHCPV6_INFINITY; } else { PD_Count_ = ((unsigned long)2) << (PD_Count_ - 1); } } else { PD_Count_ = 1; // only 1 prefix available } opt->firstPool(); while ( pool = opt->getPool() ) { poolLength = pool->getPrefixLength(); PoolLst_.append(pool); Log(Debug) << "PD: Pool " << pool->getAddrL()->getPlain() << " - " << pool->getAddrR()->getPlain() << ", pool length: " << pool->getPrefixLength() << ", " << PD_Count_ << " prefix(es) total." << LogEnd; /** @todo: this code is fishy. It behave erraticaly, when there is only 1 prefix to be assigned if (PD_Count_ > pool->rangeCount()) PD_Count_ = pool->rangeCount(); cnt++; */ } // calculate common section PoolLst_.first(); pool = PoolLst_.get(); if (!pool) { Log(Crit) << "Unable to find first prefix pool. Something is wrong, very wrong." << LogEnd; return false; } CommonPool_ = new THostRange( new TIPv6Addr(*pool->getAddrL()), new TIPv6Addr(*pool->getAddrR())); CommonPool_->truncate(pool->getPrefixLength()+1, prefixLength); CommonPool_->setPrefixLength(poolLength); /* Log(Debug) << "PD: Common part is " << CommonPool->getAddrL()->getPlain() << " - " << CommonPool->getAddrR()->getPlain() << ", pool length: " << CommonPool->getPrefixLength() << "." << LogEnd; */ // set up prefix counter counts PD_Assigned_ = 0; if (PD_MaxLease_ > PD_Count_) PD_MaxLease_ = PD_Count_; Log(Debug) << "PD: Up to " << PD_Count_ << " prefixes may be assigned." << LogEnd; AllowLst_ = opt->getAllowClientClassString(); DenyLst_ = opt->getDenyClientClassString(); return true; } bool TSrvCfgPD::prefixInPool(SPtr prefix) { SPtr pool; PoolLst_.first(); while ( pool = PoolLst_.get() ) { if (pool->in(prefix)) return true; } return false; } /** * returns random prefix from a first pool * * @return */ SPtr TSrvCfgPD::getRandomPrefix() { SPtr pool; PoolLst_.first(); pool = PoolLst_.get(); if (pool) return pool->getRandomPrefix(); return SPtr(); // NULL } /** * gets random prefix from the common part (b) and * returns a list of prefixes generated by concatenation * of the common part and pool-specific prefix * * @return list of prefixes (one prefix for each defined pool) */ List(TIPv6Addr) TSrvCfgPD::getRandomList() { SPtr commonPart,tmp; SPtr range; List(TIPv6Addr) lst; lst.clear(); commonPart = CommonPool_->getRandomPrefix(); commonPart->truncate(0, getPD_Length()); /// @todo: it's just workaround. Prefix random generation should be implemented for real. if (PD_Count_ == PD_Assigned_ + 1) { commonPart = new TIPv6Addr(*CommonPool_->getAddrR()); } PoolLst_.first(); while (range = PoolLst_.get()) { tmp = range->getAddrL(); SPtr x = new TIPv6Addr(tmp->getAddr(), commonPart->getAddr(), CommonPool_->getPrefixLength()); lst.append( x ); } return lst; } unsigned long TSrvCfgPD::getPD_MaxLease() { return PD_MaxLease_; } unsigned long TSrvCfgPD::getID() { return ID_; } long TSrvCfgPD::incrAssigned(int count) { PD_Assigned_ += count; return PD_Assigned_; } long TSrvCfgPD::decrAssigned(int count) { PD_Assigned_ -= count; return PD_Assigned_; } unsigned long TSrvCfgPD::getAssignedCount() { return PD_Assigned_; } unsigned long TSrvCfgPD::getTotalCount() { return PD_Count_; } ostream& operator<<(ostream& out,TSrvCfgPD& prefix) { out << " " << std::endl; out << " " << endl; out << " " << endl; out << " " << endl; out << " " << endl; out << " " << endl; out << " " << prefix.PD_MaxLease_ << "" << endl; SPtr statRange; out << " " << endl; SPtr pool; prefix.PoolLst_.first(); while (pool = prefix.PoolLst_.get()) { out << *pool; } /*out << " " << endl; addrClass.RejedClnt.first(); while(statRange=addrClass.RejedClnt.get()) out << *statRange; out << " " << endl; addrClass.AcceptClnt.first(); while(statRange=addrClass.AcceptClnt.get()) out << *statRange;*/ out << " " << std::endl; return out; } void TSrvCfgPD::mapAllowDenyList( List(TSrvCfgClientClass) clientClassLst) { Log(Info)<<"Mapping allow, deny list to PD "<< ID_ < classname; SPtr clntClass; AllowLst_.first(); while (classname = AllowLst_.get()) { clientClassLst.first(); while( clntClass = clientClassLst.get() ) { if (clntClass->getClassName()== *classname) { AllowClientClassLst_.append(clntClass); // Log(Info)<<" Insert ino allow list "<getClassName()<getClassName()== *classname) { DenyClientClassLst_.append(clntClass); // Log(Info)<<" Insert ino deny list "<getClassName()< duid,SPtr clntAddr) { ///@todo implement access control for PD for real return true; } bool TSrvCfgPD::clntSupported(SPtr duid,SPtr clntAddr, SPtr msg) { ///@todo implement access control for PD for real // is client on denied client class SPtr clntClass; DenyClientClassLst_.first(); while(clntClass = DenyClientClassLst_.get()) { if (clntClass->isStatisfy(msg)) return false; } // is client on accepted client class AllowClientClassLst_.first(); while(clntClass = AllowClientClassLst_.get()) { if (clntClass->isStatisfy(msg)) return true; } if (AllowClientClassLst_.count()) return false ; return true; } dibbler-1.0.1/SrvCfgMgr/SrvCfgIface.h0000644000175000017500000001374012556515620014204 00000000000000/* * Dibbler - a portable DHCPv6 * * authors: Tomasz Mrugalski * Marek Senderski * changes: Krzysztof Wnuk * Nguyen Vinh Nghiem * * released under GNU GPL v2 only licence * */ class TSrvCfgIface; #ifndef SRVCONFIFACE_H #define SRVCONFIFACE_H #include "DHCPConst.h" #include "SrvCfgAddrClass.h" #include "SrvCfgTA.h" #include "SrvCfgPD.h" #include "SrvParsGlobalOpt.h" #include #include #include #include "OptVendorSpecInfo.h" #include "SrvCfgOptions.h" class TSrvCfgIface: public TSrvCfgOptions { friend std::ostream& operator<<(std::ostream& out, TSrvCfgIface& iface); public: TSrvCfgIface(const std::string& ifaceName); TSrvCfgIface(int ifindex); virtual ~TSrvCfgIface(); void setDefaults(); void setName(const std::string& ifaceName); void setID(int ifindex); int getID() const; std::string getName() const; std::string getFullName() const; // permanent address management (IA_NA) void addAddrClass(SPtr addrClass); void firstAddrClass(); int getPreferedAddrClassID(SPtr duid, SPtr clntAddr); int getAllowedAddrClassID(SPtr duid, SPtr clntAddr); SPtr getAddrClass(); SPtr getClassByID(unsigned long id); SPtr getRandomClass(SPtr clntDuid, SPtr clntAddr); long countAddrClass() const; // temporary address management (IA_TA) void addTA(SPtr ta); void firstTA(); SPtr getTA(); SPtr getTA(SPtr duid, SPtr clntAddr); // prefix management (IA_PD) void addPDClass(SPtr PDClass); SPtr getPDByID(unsigned long id); //SPtr getRandomPrefix(SPtr clntDuid, SPtr clntAddr); long countPD() const; void addPD(SPtr pd); void firstPD(); SPtr getPD(); bool addClntPrefix(SPtr ptrPD, bool quiet = false); bool delClntPrefix(SPtr ptrPD, bool quiet = false); bool supportPrefixDelegation() const; // CONFIRM support EAddrStatus confirmAddress(TIAType type, SPtr addr); bool addrInPool(SPtr addr); bool addrInTaPool(SPtr addr); bool prefixInPdPool(SPtr addr); // subnet management void addSubnet(SPtr min, SPtr max); bool addrInSubnet(SPtr addr); bool subnetDefined(); // other SPtr getUnicast(); void setNoConfig(); void setOptions(SPtr opt); unsigned char getPreference() const; bool getRapidCommit() const; long getIfaceMaxLease() const; unsigned long getClntMaxLease() const; // IA address functions void addClntAddr(SPtr ptrAddr, bool quiet = false); void delClntAddr(SPtr ptrAddr, bool quiet = false); // TA address functions void addTAAddr(); void delTAAddr(); // relays std::string getRelayName() const; int getRelayID() const; SPtr getRelayInterfaceID() const; bool isRelay() const; void setRelayName(const std::string& name); void setRelayID(int id); // per-client parameters (exceptions) unsigned int removeReservedFromCache(); void addClientExceptionsLst(List(TSrvCfgOptions) exLst); SPtr getClientException(SPtr duid, TMsg* message, bool quiet=true); bool checkReservedPrefix(SPtr pfx, SPtr duid, SPtr remoteID, SPtr linkLocal); bool addrReserved(SPtr addr); bool prefixReserved(SPtr prefix); // option: FQDN List(TFQDN) * getFQDNLst(); SPtr getFQDNName(SPtr duid, SPtr addr, const std::string& hint); SPtr getFQDNDuid(const std::string& name); void setFQDNLst(List(TFQDN) * fqdn); int getFQDNMode() const; std::string getFQDNModeString() const; int getRevDNSZoneRootLength() const; void setRevDNSZoneRootLength(int revDNSZoneRootLength); bool supportFQDN() const; bool leaseQuerySupport() const; void mapAllowDenyList( List(TSrvCfgClientClass) clientClassLst); // following methods are used by out-of-pool reservations (others are using // methods from pool (SrvCfgAddrClass) uint32_t getT1(uint32_t proposal); uint32_t getT2(uint32_t proposal); uint32_t getPref(uint32_t proposal); uint32_t getValid(uint32_t proposal); private: uint32_t chooseTime(uint32_t min, uint32_t max, uint32_t proposal); unsigned char Preference_; int ID_; std::string Name_; bool NoConfig_; SPtr Unicast_; unsigned long IfaceMaxLease_; unsigned long ClntMaxLease_; bool RapidCommit_; List(TSrvCfgAddrClass) SrvCfgAddrClassLst_; // IA_NA list (normal addresses) bool LeaseQuery_; // --- Temporary Addresses --- List(TSrvCfgTA) SrvCfgTALst_; // IA_TA list (temporary addresses) // --- Prefix Delegation --- List(TSrvCfgPD) SrvCfgPDLst_; // --- subnets --- std::vector Subnets_; // --- relay --- bool Relay_; std::string RelayName_; // name of the underlaying physical interface (or other relay) int RelayID_; // ifindex (-1 means this is not a relay) SPtr RelayInterfaceID_; // value of interface-id option (optional) // --- option: FQDN --- List(TFQDN) FQDNLst_; int FQDNMode_; int RevDNSZoneRootLength_; EUnknownFQDNMode UnknownFQDN_; std::string FQDNDomain_; // --- per-client parameters (exceptions) --- List(TSrvCfgOptions) ExceptionsLst_; uint32_t T1Min_; uint32_t T1Max_; uint32_t T2Min_; uint32_t T2Max_; uint32_t PrefMin_; uint32_t PrefMax_; uint32_t ValidMin_; uint32_t ValidMax_; }; #endif /* SRVCONFIFACE_H */ dibbler-1.0.1/SrvCfgMgr/SrvCfgOptions.cpp0000664000175000017500000001355412556511270015165 00000000000000/* * Dibbler - a portable DHCPv6 * * authors: Tomasz Mrugalski * Marek Senderski * changes: Krzysztof Wnuk * * released under GNU GPL v2 only licence * */ #include "Logger.h" #include "SrvCfgOptions.h" using namespace std; TSrvCfgOptions::TSrvCfgOptions() { SetDefaults(); } TSrvCfgOptions::TSrvCfgOptions(SPtr duid) { SetDefaults(); Duid = duid; } TSrvCfgOptions::TSrvCfgOptions(SPtr remoteID) { SetDefaults(); RemoteID = remoteID; } TSrvCfgOptions::TSrvCfgOptions(SPtr clntaddr) { SetDefaults(); ClntAddr = clntaddr; } SPtr TSrvCfgOptions::getDuid() const { return Duid; } SPtr TSrvCfgOptions::getRemoteID() const { return RemoteID; } SPtr TSrvCfgOptions::getClntAddr() const { return ClntAddr; } void TSrvCfgOptions::SetDefaults() { this->VendorSpecSupport = false; Duid.reset(); RemoteID.reset(); ClntAddr.reset(); ExtraOpts_.clear(); ForcedOpts_.clear(); } // -------------------------------------------------------------------- // --- options -------------------------------------------------------- // -------------------------------------------------------------------- // --- option: DNS servers --- // --- option: DOMAIN --- // --- option: NTP-SERVERS --- // --- option: TIMEZONE --- // --- option: SIP server --- // --- option: SIP domain --- // --- option: LIFETIME --- // --- option: VENDOR-SPEC INFO --- #if 0 bool TSrvCfgOptions::supportVendorSpec() { if (VendorSpec.count()) return true; return false; } #endif List(TOptVendorSpecInfo) TSrvCfgOptions::getVendorSpecLst(unsigned int vendor) { SPtr opt; SPtr x; List(TOptVendorSpecInfo) returnList; returnList.clear(); for (TOptList::iterator opt = ExtraOpts_.begin(); opt!=ExtraOpts_.end(); ++opt) { if ( (*opt)->getOptType() != OPTION_VENDOR_OPTS) continue; x = (Ptr*) *opt; if (!vendor || x->getVendor() == vendor) { // enterprise number not specified => return all returnList.append(x); } } return returnList; } void TSrvCfgOptions::setAddr(SPtr addr) { Addr = addr; } SPtr TSrvCfgOptions::getAddr() const { return Addr; } void TSrvCfgOptions::addExtraOption(SPtr custom, bool always) { Log(Debug) << "Setting " << (always?"mandatory ":"request-only ") << custom->getOptType() << " generic option (length=" << custom->getSize() << ")." << LogEnd; ExtraOpts_.push_back(custom); // allways add to extra options if (always) ForcedOpts_.push_back(custom); // also add to forced, if requested so } const TOptList& TSrvCfgOptions::getExtraOptions() { return ExtraOpts_; } TOptPtr TSrvCfgOptions::getExtraOption(uint16_t type) { for (TOptList::iterator opt=ExtraOpts_.begin(); opt!=ExtraOpts_.end(); ++opt) { if ((*opt)->getOptType() == type) return *opt; } return TOptPtr(); // NULL } const TOptList& TSrvCfgOptions::getForcedOptions() { return ForcedOpts_; } bool TSrvCfgOptions::setOptions(SPtr opt) { addExtraOptions(opt->getExtraOptions()); addForcedOptions(opt->getForcedOptions()); return true; } /// @brief Copies a list of extra options. /// /// Extra options are options that may be requested by a client. This list also /// contains forced options (i.e. options that are sent regardless if client /// asks for them or not). /// /// @param extra list of options to be copied void TSrvCfgOptions::addExtraOptions(const TOptList& extra) { for (TOptList::const_iterator opt = extra.begin(); opt != extra.end(); ++opt) ExtraOpts_.push_back(*opt); } /// @brief Copies a list of forced options. /// /// This method add a list of forced options. Forced options are the ones that /// are sent to a client, regardless if client requested them or not. /// /// @param forced list of forced options to be copied void TSrvCfgOptions::addForcedOptions(const TOptList& forced) { for (TOptList::const_iterator opt = forced.begin(); opt != forced.end(); ++opt) ForcedOpts_.push_back(*opt); } // -------------------------------------------------------------------- // --- operators ------------------------------------------------------ // -------------------------------------------------------------------- ostream& operator<<(ostream& out,TSrvCfgOptions& iface) { SPtr addr; SPtr str; out << " " << endl; if (iface.Duid) out << " " << *iface.Duid; else out << " " << endl; if (iface.RemoteID) out << " getVendor() << "\" length=\"" << iface.RemoteID->getVendorDataLen() << "\">" << iface.RemoteID->getVendorDataPlain() << "" << endl; else out << " " << endl; out << " " << endl; if (iface.Addr) { out << " " << iface.Addr->getPlain() << "" << endl; } else { out << " " << endl; } // option: DNS-SERVERS // option: DOMAINS // NTP-SERVERS // option: TIMEZONE // option: SIP-SERVERS // option: SIP-DOMAINS // option: LIFETIME #if 0 // option: VENDOR-SPEC if (iface.VendorSpec.count()) { out << " " << endl; iface.VendorSpec.first(); SPtr v; while (v = iface.VendorSpec.get()) { out << v << endl; } out << " " << endl; } else { out << " " << endl; } #endif out << " " << endl; return out; } dibbler-1.0.1/SrvCfgMgr/SrvLexer.l0000644000175000017500000002744212420535235013636 00000000000000%option noyywrap %option yylineno %{ #ifdef WIN32 #define strncasecmp _strnicmp #endif using namespace std; #include "SrvParser.h" #include "Portable.h" #define YYABORT yyterminate(); /* duplicate default definition from flex. This makes cppcheck check for defined YY_FATAL_ERROR() go away. */ #define YY_FATAL_ERROR(msg) LexerError(msg) %} %x COMMENT %x ADDR hexdigit [0-9A-Fa-f] hexnumber {hexdigit}+h letter [a-zA-Z] cipher [0-9] integer {cipher}+ curly_op [{] curly_cl [}] hex1to4 {hexdigit}{1,4} CR \r LF \n EOL (({CR}{LF}?)|{LF}) %{ using namespace std; unsigned ComBeg; // line, in which comment begins unsigned LftCnt; // how many chars : on the left side of '::' char was interpreted unsigned RgtCnt; // the same as above, but on the right side of '::' char Address[16]; // address, which is analizing right now char AddrPart[16]; unsigned intpos,pos; namespace std{ yy_SrvParser_stype yylval; } %} %% {EOL}* ; // ignore end of line [ \t] ; // ignore TABs and spaces iface { return SrvParser::IFACE_;} class { return SrvParser::CLASS_;} ta-class { return SrvParser::TACLASS_; } stateless { return SrvParser::STATELESS_; } relay { return SrvParser::RELAY_; } interface-id { return SrvParser::IFACE_ID_; } interface-id-order { return SrvParser::IFACE_ID_ORDER_; } log-name { return SrvParser::LOGNAME_;} log-level { return SrvParser::LOGLEVEL_;} log-mode { return SrvParser::LOGMODE_; } log-colors { return SrvParser::LOGCOLORS_; } work-dir { return SrvParser::WORKDIR_;} accept-only { return SrvParser::ACCEPT_ONLY_;} reject-clients { return SrvParser::REJECT_CLIENTS_;} T1 { return SrvParser::T1_;} T2 { return SrvParser::T2_;} preferred-lifetime { return SrvParser::PREF_TIME_;} prefered-lifetime { return SrvParser::PREF_TIME_;} valid-lifetime { return SrvParser::VALID_TIME_;} drop-unicast { return SrvParser::DROP_UNICAST_; } unicast { return SrvParser::UNICAST_;} preference { return SrvParser::PREFERENCE_;} pool { return SrvParser::POOL_;} share { return SrvParser::SHARE_;} rapid-commit { return SrvParser::RAPID_COMMIT_;} iface-max-lease { return SrvParser::IFACE_MAX_LEASE_; } class-max-lease { return SrvParser::CLASS_MAX_LEASE_; } client-max-lease { return SrvParser::CLNT_MAX_LEASE_; } client { return SrvParser::CLIENT_; } duid { return SrvParser::DUID_KEYWORD_; } remote-id { return SrvParser::REMOTE_ID_; } link-local { return SrvParser::LINK_LOCAL_; } address { return SrvParser::ADDRESS_;} prefix { return SrvParser::PREFIX_; } guess-mode { return SrvParser::GUESS_MODE_; } option { return SrvParser::OPTION_; } dns-server { return SrvParser::DNS_SERVER_;} domain { return SrvParser::DOMAIN_;} ntp-server { return SrvParser::NTP_SERVER_;} time-zone { return SrvParser::TIME_ZONE_;} sip-server { return SrvParser::SIP_SERVER_; } sip-domain { return SrvParser::SIP_DOMAIN_; } next-hop { return SrvParser::NEXT_HOP_; } subnet { return SrvParser::SUBNET_; } route { return SrvParser::ROUTE_; } fqdn { return SrvParser::FQDN_; } infinite { return SrvParser::INFINITE_; } accept-unknown-fqdn { return SrvParser::ACCEPT_UNKNOWN_FQDN_; } fqdn-ddns-address { return SrvParser::FQDN_DDNS_ADDRESS_; } ddns-protocol { return SrvParser::DDNS_PROTOCOL_; } ddns-timeout { return SrvParser::DDNS_TIMEOUT_; } nis-server { return SrvParser::NIS_SERVER_; } nis-domain { return SrvParser::NIS_DOMAIN_; } nis\+-server { return SrvParser::NISP_SERVER_; } nis\+-domain { return SrvParser::NISP_DOMAIN_; } lifetime { return SrvParser::LIFETIME_; } cache-size { return SrvParser::CACHE_SIZE_; } pd-class { return SrvParser::PDCLASS_; } pd-length { return SrvParser::PD_LENGTH_; } pd-pool { return SrvParser::PD_POOL_;} vendor-spec { return SrvParser::VENDOR_SPEC_; } script { return SrvParser::SCRIPT_; } experimental { return SrvParser::EXPERIMENTAL_; } addr-params { return SrvParser::ADDR_PARAMS_; } neighbors { return SrvParser::REMOTE_AUTOCONF_NEIGHBORS_; } aftr { return SrvParser::AFTR_; } inactive-mode { return SrvParser::INACTIVE_MODE_; } accept-leasequery { return SrvParser::ACCEPT_LEASEQUERY_; } bulk-leasequery-accept { return SrvParser::BULKLQ_ACCEPT_; } bulk-leasequery-tcp-port { return SrvParser::BULKLQ_TCPPORT_; } bulk-leasequery-max-conns { return SrvParser::BULKLQ_MAX_CONNS_; } bulk-leasequery-timeout { return SrvParser::BULKLQ_TIMEOUT_; } auth-protocol { return SrvParser::AUTH_PROTOCOL_; } auth-algorithm { return SrvParser::AUTH_ALGORITHM_; } auth-replay { return SrvParser::AUTH_REPLAY_;} auth-realm { return SrvParser::AUTH_REALM_; } auth-methods { return SrvParser::AUTH_METHODS_; } auth-required { return SrvParser::AUTH_DROP_UNAUTH_; } digest-none { return SrvParser::DIGEST_NONE_; } digest-plain { return SrvParser::DIGEST_PLAIN_; } digest-hmac-md5 { return SrvParser::DIGEST_HMAC_MD5_; } hmac-md5 { return SrvParser::DIGEST_HMAC_MD5_; } digest-hmac-sha1 { return SrvParser::DIGEST_HMAC_SHA1_; } hmac-sha1 { return SrvParser::DIGEST_HMAC_SHA1_; } digest-hmac-sha224 { return SrvParser::DIGEST_HMAC_SHA224_; } hmac-sha224 { return SrvParser::DIGEST_HMAC_SHA224_; } digest-hmac-sha256 { return SrvParser::DIGEST_HMAC_SHA256_; } hmac-sha256 { return SrvParser::DIGEST_HMAC_SHA256_; } digest-hmac-sha384 { return SrvParser::DIGEST_HMAC_SHA384_; } hmac-sha384 { return SrvParser::DIGEST_HMAC_SHA384_; } digest-hmac-sha512 { return SrvParser::DIGEST_HMAC_SHA512_; } hmac-sha512 { return SrvParser::DIGEST_HMAC_SHA512_; } key { return SrvParser::KEY_; } secret { return SrvParser::SECRET_; } algorithm { return SrvParser::ALGORITHM_; } reconfigure-enabled { return SrvParser::RECONFIGURE_ENABLED_; } fudge { return SrvParser::FUDGE_; } client-class { return SrvParser::CLIENT_CLASS_; } match-if { return SrvParser::MATCH_IF_; } == { return SrvParser::EQ_; } and { return SrvParser::AND_; } or { return SrvParser::OR_; } client.vendor-spec.en { return SrvParser::CLIENT_VENDOR_SPEC_ENTERPRISE_NUM_; } client.vendor-spec.data { return SrvParser::CLIENT_VENDOR_SPEC_DATA_; } client.vendor-class.en { return SrvParser::CLIENT_VENDOR_CLASS_EN_; } client.vendor-class.data { return SrvParser::CLIENT_VENDOR_CLASS_DATA_; } allow { return SrvParser::ALLOW_; } deny { return SrvParser::DENY_; } substring { return SrvParser::SUBSTRING_; } contain { return SrvParser::CONTAIN_; } string { return SrvParser::STRING_KEYWORD_; } address-list { return SrvParser::ADDRESS_LIST_; } performance-mode { return SrvParser::PERFORMANCE_MODE_; } yes { yylval.ival=1; return SrvParser::INTNUMBER_;} no { yylval.ival=0; return SrvParser::INTNUMBER_;} true { yylval.ival=1; return SrvParser::INTNUMBER_;} false { yylval.ival=0; return SrvParser::INTNUMBER_;} #.* ; "//"(.*) ; "/*" { BEGIN(COMMENT); ComBeg=yylineno; } "*/" BEGIN(INITIAL); .|"\n" ; <> { Log(Crit) << "Comment not closed. (/* in line " << ComBeg << LogEnd; { YYABORT; } } %{ //IPv6 address - various forms %} ({hex1to4}:){7}{hex1to4} { if(!inet_pton6(yytext,yylval.addrval)) { Log(Crit) << "Invalid address format: [" << yytext << "]" << LogEnd; YYABORT; } else { return SrvParser::IPV6ADDR_; } } (({hex1to4}:){1,6})?{hex1to4}"::"(({hex1to4}:){1,6})?{hex1to4} { if(!inet_pton6(yytext,yylval.addrval)) { Log(Crit) << "Invalid address format: [" << yytext << "]" << LogEnd; YYABORT; } else { return SrvParser::IPV6ADDR_; } } "::"(({hex1to4}:){1,7})?{hex1to4} { if(!inet_pton6(yytext,yylval.addrval)) { Log(Crit) << "Invalid address format: [" << yytext << "]" << LogEnd; YYABORT; } else { return SrvParser::IPV6ADDR_; } } (({hex1to4}:){0,7})?{hex1to4}:: { if(!inet_pton6(yytext,yylval.addrval)) { Log(Crit) << "Invalid address format: [" << yytext << "]" << LogEnd; YYABORT; } else { return SrvParser::IPV6ADDR_; } } "::" { if(!inet_pton6(yytext,yylval.addrval)) { Log(Crit) << "Invalid address format: [" << yytext << "]" << LogEnd; YYABORT; } else { return SrvParser::IPV6ADDR_; } } (({hex1to4}:){1,5})?{hex1to4}"::"(({hex1to4}:){1,6})?{integer}"."{integer}"."{integer}"."{integer} { if(!inet_pton6(yytext,yylval.addrval)) { Log(Crit) << "Invalid address format: [" << yytext << "]" << LogEnd; YYABORT; } else { return SrvParser::IPV6ADDR_; } } "::"(({hex1to4}":"){1,6})?{integer}"."{integer}"."{integer}"."{integer} { if(!inet_pton6(yytext,yylval.addrval)) { Log(Crit) << "Invalid address format: [" << yytext << "]" << LogEnd; YYABORT; } else { return SrvParser::IPV6ADDR_; } } %{ //STRING (interface identifier,dns server etc.) %} ('([^']|(''))*')|(\"[^\"]*\") { yylval.strval=new char[strlen(yytext)-1]; strncpy(yylval.strval, yytext+1, strlen(yytext)-2); yylval.strval[strlen(yytext)-2]=0; return SrvParser::STRING_; } ([a-zA-Z][a-zA-Z0-9\.-]+) { int len = strlen(yytext); if ( ( (len>2) && !strncasecmp("yes",yytext,3) ) || ( (len>3) && !strncasecmp("true", yytext,4) ) ) { yylval.ival = 1; return SrvParser::INTNUMBER_; } if ( ( (len>1) && !strncasecmp("no",yytext,2) ) || ( (len>4) && !strncasecmp("false",yytext,5) ) ) { yylval.ival = 0; return SrvParser::INTNUMBER_; } yylval.strval=new char[strlen(yytext)+1]; strncpy(yylval.strval, yytext, strlen(yytext)); yylval.strval[strlen(yytext)]=0; return SrvParser::STRING_; } 0x{hexdigit}+ { // DUID int len; char * ptr; if (strlen(yytext)%2) { yytext[1]='0'; //if odd then no-meaning zero at the beginning len = strlen(yytext)-1; ptr = yytext+1; } else { len = strlen(yytext)-2; ptr = yytext+2; } //and now there is an even number of hex digits yylval.duidval.length = len >> 1; yylval.duidval.duid = new char[len >> 1]; for (int i=0 ; i>1]<<=4; if (!isxdigit(ptr[i])) { Log(Crit) << "DUID parsing failed (" << yytext << ")." << LogEnd; YYABORT; } if (isalpha(ptr[i])) { yylval.duidval.duid[i>>1]|=toupper(ptr[i])-'A'+10; } else { yylval.duidval.duid[i>>1]|=ptr[i]-'0'; } } return SrvParser::DUID_; } {hexdigit}{2}(:{hexdigit}{2})+ { int len = (strlen(yytext)+1)/3; char * pos = 0; yylval.duidval.length = len; yylval.duidval.duid = new char[len]; int i=0; for (pos = yytext; pos<=yytext+strlen(yytext)-2; pos+=3) { char x; if (isalpha(*pos)) x = (toupper(*pos)-'A' + 10); else x = *pos-'0'; x *= 16; if (isalpha(*(pos+1))) x += (toupper(*(pos+1))-'A' + 10); else x += *(pos+1) - '0'; yylval.duidval.duid[i] = x; i++; } return SrvParser::DUID_; } {hexnumber} { // HEX NUMBER yytext[strlen(yytext)-1]='\n'; if(!sscanf(yytext,"%20x",&(yylval.ival))) { Log(Crit) << "Hex value [" << yytext << "] parsing failed." << LogEnd; YYABORT; } return SrvParser::HEXNUMBER_; } {integer} { // DECIMAL NUMBER if(!sscanf(yytext,"%20u",&(yylval.ival))) { Log(Crit) << "Decimal value [" << yytext << "] parsing failed." << LogEnd; YYABORT; } return SrvParser::INTNUMBER_; } . { return yytext[0]; } %% dibbler-1.0.1/SrvCfgMgr/NodeClientSpecific.cpp0000644000175000017500000000711612556512062016104 00000000000000/* * Dibbler - a portable DHCPv6 * * authors: Nguyen Vinh Nghiem * changes: Tomasz Mrugalski * * released under GNU GPL v2 or later licence * */ #include "NodeClientSpecific.h" #include "SrvMsg.h" #include "DHCPConst.h" #include "OptVendorData.h" #include "OptVendorClass.h" #include "hex.h" #include using namespace std; SPtr NodeClientSpecific::CurrentMsg; string NodeClientSpecific::vendor_spec_num ; string NodeClientSpecific::vendor_spec_data ; string NodeClientSpecific::vendor_class_num ; string NodeClientSpecific::vendor_class_data ; NodeClientSpecific::NodeClientSpecific() :Node(NODE_CLIENT_SPECIFIC) { CurrentMsg.reset(); Type = CLIENT_UNKNOWN; } NodeClientSpecific::~NodeClientSpecific() { } string NodeClientSpecific::exec(SPtr msg) { // If have not analyse the Msg, then analyse it if (CurrentMsg != msg) { analyseMessage(msg); } // if new message switch (Type) { case NodeClientSpecific::CLIENT_VENDOR_SPEC_ENTERPRISE_NUM : return vendor_spec_num; break; case NodeClientSpecific::CLIENT_VENDOR_SPEC_DATA : return vendor_spec_data; break; case NodeClientSpecific::CLIENT_VENDOR_CLASS_ENTERPRISE_NUM : return vendor_class_num; break; case NodeClientSpecific::CLIENT_VENDOR_CLASS_DATA : return vendor_class_data; break; default : return ""; } } NodeClientSpecific::NodeClientSpecific(ClientSpecificType t) :Node(NODE_CLIENT_SPECIFIC) { CurrentMsg.reset(); Type = t; } void NodeClientSpecific::analyseMessage(SPtr msg) { if (CurrentMsg == msg) return; CurrentMsg = msg; vendor_spec_num = ""; vendor_spec_data = ""; vendor_class_num = ""; vendor_class_data = ""; SPtr ptrOpt; msg->firstOption(); while (ptrOpt = msg->getOption()) { switch (ptrOpt->getOptType()) { case OPTION_VENDOR_OPTS: { SPtr vendorspec = (Ptr*) ptrOpt; stringstream convert; // convert enterprise-id to string convert << vendorspec->getVendor(); convert >> vendor_spec_num; // now the tricky part: convert content #if 1 // The following text converts content of the vendor options // into string as is (this will produce junk if the content is // not ASCII printable vendor_spec_data = ""; vendorspec->firstOption(); while (SPtr opt = vendorspec->getOption()) { int len = opt->getSize(); char* buf = new char[len+1]; buf[len] = 0; // make sure it is null-terminated opt->storeSelf(buf); vendor_spec_data += string(buf + 4); // +4 (skip packet header) delete [] buf; } #else // The following code converts option into hex string, eg. // 00:01:00:05:48:49:4a:4b:4c int len = vendorspec->getSize(); char* buf = new char[len+1]; buf[len]=0; vendorspec->storeSelf(buf); vendor_spec_data = hexToText((uint8_t*)buf + 8, len - 8, true, false); delete [] buf; #endif break; } case OPTION_VENDOR_CLASS: SPtr vendorclass = (Ptr*) ptrOpt; // Convert enterprise-id stringstream convert; convert << vendorclass->Enterprise_id_; convert >> vendor_class_num; // Convert content of all sub-options vendor_class_data = ""; for (std::vector::const_iterator data = vendorclass->userClassData_.begin(); data != vendorclass->userClassData_.end(); ++data) { vendor_class_data += std::string( reinterpret_cast(&data->opaqueData_[0]), data->opaqueData_.size()); } break; } // switch } // while } dibbler-1.0.1/SrvCfgMgr/SrvParsIfaceOpt.cpp0000644000175000017500000001423412556511762015432 00000000000000/* * Dibbler - a portable DHCPv6 * * authors: Tomasz Mrugalski * Marek Senderski * changes: Krzysztof Wnuk * * released under GNU GPL v2 only licence * */ #include #include "SrvParsIfaceOpt.h" #include "OptAddr.h" #include "OptString.h" #include "DHCPDefaults.h" #include "Logger.h" using namespace std; TSrvParsIfaceOpt::TSrvParsIfaceOpt(void) :Preference_(SERVER_DEFAULT_PREFERENCE), RapidCommit_(SERVER_DEFAULT_RAPIDCOMMIT), IfaceMaxLease_(SERVER_DEFAULT_IFACEMAXLEASE), ClntMaxLease_(SERVER_DEFAULT_CLNTMAXLEASE), Unicast_(), LeaseQuery_(SERVER_DEFAULT_LEASEQUERY), Relay_(false), RelayName_("[unknown]"), RelayID_(-1), RelayInterfaceID_(), FQDNSupport_(false), FQDNMode_(0/*DNS_UPDATE_MODE_NONE*/), UnknownFQDN_(SERVER_DEFAULT_UNKNOWN_FQDN), FQDNDomain_("") { RevDNSZoneRootLength_ = SERVER_DEFAULT_DNSUPDATE_REVDNS_ZONE_LEN; // don't support leasequery unless explicitly configured to do so } TSrvParsIfaceOpt::~TSrvParsIfaceOpt(void) { } void TSrvParsIfaceOpt::setUnknownFQDN(EUnknownFQDNMode mode, const std::string& domain) { UnknownFQDN_ = mode; FQDNDomain_ = domain; } /** * returns enum that specifies, how to handle unknown FQDNs * * * @return */ EUnknownFQDNMode TSrvParsIfaceOpt::getUnknownFQDN() { return UnknownFQDN_; } std::string TSrvParsIfaceOpt::getFQDNDomain() { return FQDNDomain_; } void TSrvParsIfaceOpt::setLeaseQuerySupport(bool support) { LeaseQuery_ = support; } bool TSrvParsIfaceOpt::getLeaseQuerySupport() { return LeaseQuery_; } // --- unicast --- void TSrvParsIfaceOpt::setUnicast(SPtr addr) { Unicast_ = addr; } SPtr TSrvParsIfaceOpt::getUnicast() { return Unicast_; } // --- iface-max-lease --- void TSrvParsIfaceOpt::setIfaceMaxLease(long maxLease) { IfaceMaxLease_ = maxLease; } long TSrvParsIfaceOpt::getIfaceMaxLease() { return IfaceMaxLease_; } // --- clnt max lease --- void TSrvParsIfaceOpt::setClntMaxLease(long clntMaxLease) { ClntMaxLease_ = clntMaxLease; } long TSrvParsIfaceOpt::getClntMaxLease() { return ClntMaxLease_; } // --- preference --- void TSrvParsIfaceOpt::setPreference(char pref) { Preference_ = pref; } char TSrvParsIfaceOpt::getPreference() { return Preference_; } // --- rapid commit --- void TSrvParsIfaceOpt::setRapidCommit(bool rapidComm) { RapidCommit_ = rapidComm; } bool TSrvParsIfaceOpt::getRapidCommit() { return RapidCommit_; } // --- relay related --- void TSrvParsIfaceOpt::setRelayName(std::string name) { Relay_ = true; RelayName_ = name; RelayID_ = -1; } void TSrvParsIfaceOpt::setRelayID(int id) { Relay_ = true; RelayName_ = "[unknown]"; RelayID_ = id; } void TSrvParsIfaceOpt::setRelayInterfaceID(SPtr id) { Relay_ = true; RelayInterfaceID_ = id; } string TSrvParsIfaceOpt::getRelayName() { return RelayName_; } int TSrvParsIfaceOpt::getRelayID() { return RelayID_; } SPtr TSrvParsIfaceOpt::getRelayInterfaceID() { return RelayInterfaceID_; } bool TSrvParsIfaceOpt::isRelay() { return Relay_; } // --- option: DNS servers --- // --- option: DOMAIN --- // --- option: NTP-SERVERS --- // --- option: TIMEZONE --- // --- option: SIP server --- // --- option: SIP domain --- // --- option: LIFETIME --- #if 0 // --- option: VENDOR-SPEC INFO --- void TSrvParsIfaceOpt::setVendorSpec(List(TOptVendorSpecInfo) vendor) { VendorSpec = vendor; VendorSpecSupport = true; } bool TSrvParsIfaceOpt::supportVendorSpec() { return VendorSpecSupport; } List(TOptVendorSpecInfo) TSrvParsIfaceOpt::getVendorSpec() { return VendorSpec; } #endif // --- option: FQDN --- void TSrvParsIfaceOpt::setFQDNLst(List(TFQDN) *fqdn) { FQDNLst_ = *fqdn; FQDNSupport_ = true; } List(TFQDN) *TSrvParsIfaceOpt::getFQDNLst() { return &this->FQDNLst_; } int TSrvParsIfaceOpt::getFQDNMode(){ return FQDNMode_; } void TSrvParsIfaceOpt::setFQDNMode(int FQDNMode){ FQDNMode_ = FQDNMode; } int TSrvParsIfaceOpt::getRevDNSZoneRootLength(){ return RevDNSZoneRootLength_; } void TSrvParsIfaceOpt::setRevDNSZoneRootLength(int revDNSZoneRootLength){ RevDNSZoneRootLength_ = revDNSZoneRootLength; } bool TSrvParsIfaceOpt::supportFQDN() { return FQDNSupport_; } /// @brief adds option to the list (and merges vendor-options if possible) /// /// Adds new option to the list. However, if the option being added in vendor-option, /// it tries to find if there's existing vendor option with the same vendor-id. If /// there is, it just copies sub-options from the option being added to the option /// that is already defined. /// /// @param list list of options (new option will be added or merged here) /// @param custom new option to be added void TSrvParsIfaceOpt::addOption(TOptList& list, TOptPtr custom) { if (custom->getOptType() == OPTION_VENDOR_OPTS) { SPtr newone = (Ptr*) (custom); for (TOptList::iterator opt=ExtraOpts.begin(); opt!=ExtraOpts.end(); ++opt) { if ((*opt)->getOptType() != OPTION_VENDOR_OPTS) continue; SPtr existing = (Ptr*) (*opt); if (existing->getVendor() == newone->getVendor()) { newone->firstOption(); while (TOptPtr subopt = newone->getOption()) { existing->addOption(subopt); } return; } } } // This wasn't vendor-option or vendor-id didn't match, add it the usual way list.push_back(custom); } void TSrvParsIfaceOpt::addExtraOption(SPtr custom, bool always) { addOption(ExtraOpts, custom); if (always) addOption(ForcedOpts, custom); // also add to forced, if requested so } const TOptList& TSrvParsIfaceOpt::getExtraOptions() { return ExtraOpts; } TOptPtr TSrvParsIfaceOpt::getExtraOption(uint16_t type) { for (TOptList::iterator opt=ExtraOpts.begin(); opt!=ExtraOpts.end(); ++opt) { if ((*opt)->getOptType() == type) return *opt; } return TOptPtr(); // NULL } const TOptList& TSrvParsIfaceOpt::getForcedOptions() { return ForcedOpts; } dibbler-1.0.1/SrvCfgMgr/SrvCfgOptions.h0000664000175000017500000000566412233256142014631 00000000000000/* * Dibbler - a portable DHCPv6 * * authors: Tomasz Mrugalski * Marek Senderski * changes: Krzysztof Wnuk * * released under GNU GPL v2 only licence * */ #ifndef SRVCFGOPTIONS_H #define SRVCFGOPTIONS_H #include #include #include #include "SmartPtr.h" #include "Container.h" #include "IPv6Addr.h" #include "SrvParsGlobalOpt.h" #include "OptVendorSpecInfo.h" #include "OptVendorData.h" #include "OptGeneric.h" class TSrvCfgIface; class TSrvCfgOptions { friend std::ostream& operator<<(std::ostream& out,TSrvCfgIface& iface); friend std::ostream& operator<<(std::ostream& out,TSrvCfgOptions& opt); public: TSrvCfgOptions(); TSrvCfgOptions(SPtr duid); TSrvCfgOptions(SPtr remoteid); TSrvCfgOptions(SPtr clntaddr); bool setOptions(SPtr opt); // address reservation void setAddr(SPtr addr); SPtr getAddr() const; void setPrefix(SPtr prefix, uint8_t length) { Prefix = prefix, PrefixLen = length; } SPtr getPrefix() { return Prefix; } uint8_t getPrefixLen() { return PrefixLen; } SPtr getDuid() const; SPtr getRemoteID() const; SPtr getClntAddr() const; // option: DNS Servers is now handled with extra options mechanism // option: Domain is now handled with extra options mechanism // option: NTP servers is now handled with extra options mechanism // option: Timezone is now handled with extra options mechanism // option: SIP servers is now handled with extra options mechanism // option: SIP domains is now handled with extra options mechanism // option: NIS servers is now handled with extra options mechanism // option: NIS+ servers is now handled with extra options mechanism // option: NIS domain is now handled with extra options mechanism // option: NIS+ domain is now handled with extra options mechanism // option: LIFETIME is now handled with extra options mechanism // option: VENDOR-SPEC List(TOptVendorSpecInfo) getVendorSpecLst(unsigned int vendor=0); void addExtraOption(SPtr extra, bool always); const TOptList& getExtraOptions(); SPtr getExtraOption(uint16_t type); const TOptList& getForcedOptions(); void addExtraOptions(const TOptList& extra); void addForcedOptions(const TOptList& extra); private: // options bool VendorSpecSupport; // address reservation SPtr Addr; SPtr Prefix; uint8_t PrefixLen; // options reservation TOptList ExtraOpts_; // extra options ALWAYS sent to client (may also include ForcedOpts) TOptList ForcedOpts_; // list of options that are forced to client void SetDefaults(); //client specification SPtr RemoteID; SPtr Duid; SPtr ClntAddr; }; #endif dibbler-1.0.1/SrvCfgMgr/Node.cpp0000664000175000017500000000070412233256142013271 00000000000000/* * Dibbler - a portable DHCPv6 * * author : Vinh Nghiem Nguyen * changes: Tomasz Mrugalski * * released under GNU GPL v2 or later licence * * $Id: Node.cpp,v 1.1 2008-10-12 19:36:58 thomson Exp $ * */ /* * Node.cpp * * Created on: 9 sept. 2008 */ #ifndef NODE_CPP_ #define NODE_CPP_ #include "Node.h" #include "SrvMsg.h" Node::Node(NodeType type) { Type = type; } Node::~Node() { } #endif /* NODE_H_ */ dibbler-1.0.1/SrvCfgMgr/SrvLexer.cpp0000664000175000017500000047704212556513130014174 00000000000000#line 2 "SrvLexer.cpp" #line 4 "SrvLexer.cpp" #define YY_INT_ALIGNED short int /* A lexical scanner generated by flex */ #define FLEX_SCANNER #define YY_FLEX_MAJOR_VERSION 2 #define YY_FLEX_MINOR_VERSION 5 #define YY_FLEX_SUBMINOR_VERSION 39 #if YY_FLEX_SUBMINOR_VERSION > 0 #define FLEX_BETA #endif /* The c++ scanner is a mess. The FlexLexer.h header file relies on the * following macro. This is required in order to pass the c++-multiple-scanners * test in the regression suite. We get reports that it breaks inheritance. * We will address this in a future release of flex, or omit the C++ scanner * altogether. */ #define yyFlexLexer yyFlexLexer /* First, we deal with platform-specific or compiler-specific issues. */ /* begin standard C headers. */ /* end standard C headers. */ /* flex integer type definitions */ #ifndef FLEXINT_H #define FLEXINT_H /* C99 systems have . Non-C99 systems may or may not. */ #if defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L /* C99 says to define __STDC_LIMIT_MACROS before including stdint.h, * if you want the limit (max/min) macros for int types. */ #ifndef __STDC_LIMIT_MACROS #define __STDC_LIMIT_MACROS 1 #endif #include typedef int8_t flex_int8_t; typedef uint8_t flex_uint8_t; typedef int16_t flex_int16_t; typedef uint16_t flex_uint16_t; typedef int32_t flex_int32_t; typedef uint32_t flex_uint32_t; #else typedef signed char flex_int8_t; typedef short int flex_int16_t; typedef int flex_int32_t; typedef unsigned char flex_uint8_t; typedef unsigned short int flex_uint16_t; typedef unsigned int flex_uint32_t; /* Limits of integral types. */ #ifndef INT8_MIN #define INT8_MIN (-128) #endif #ifndef INT16_MIN #define INT16_MIN (-32767-1) #endif #ifndef INT32_MIN #define INT32_MIN (-2147483647-1) #endif #ifndef INT8_MAX #define INT8_MAX (127) #endif #ifndef INT16_MAX #define INT16_MAX (32767) #endif #ifndef INT32_MAX #define INT32_MAX (2147483647) #endif #ifndef UINT8_MAX #define UINT8_MAX (255U) #endif #ifndef UINT16_MAX #define UINT16_MAX (65535U) #endif #ifndef UINT32_MAX #define UINT32_MAX (4294967295U) #endif #endif /* ! C99 */ #endif /* ! FLEXINT_H */ /* begin standard C++ headers. */ #include #include #include #include #include /* end standard C++ headers. */ #ifdef __cplusplus /* The "const" storage-class-modifier is valid. */ #define YY_USE_CONST #else /* ! __cplusplus */ /* C99 requires __STDC__ to be defined as 1. */ #if defined (__STDC__) #define YY_USE_CONST #endif /* defined (__STDC__) */ #endif /* ! __cplusplus */ #ifdef YY_USE_CONST #define yyconst const #else #define yyconst #endif /* Returned upon end-of-file. */ #define YY_NULL 0 /* Promotes a possibly negative, possibly signed char to an unsigned * integer for use as an array index. If the signed char is negative, * we want to instead treat it as an 8-bit unsigned char, hence the * double cast. */ #define YY_SC_TO_UI(c) ((unsigned int) (unsigned char) c) /* Enter a start condition. This macro really ought to take a parameter, * but we do it the disgusting crufty way forced on us by the ()-less * definition of BEGIN. */ #define BEGIN (yy_start) = 1 + 2 * /* Translate the current start state into a value that can be later handed * to BEGIN to return to the state. The YYSTATE alias is for lex * compatibility. */ #define YY_START (((yy_start) - 1) / 2) #define YYSTATE YY_START /* Action number for EOF rule of a given start state. */ #define YY_STATE_EOF(state) (YY_END_OF_BUFFER + state + 1) /* Special action meaning "start processing a new file". */ #define YY_NEW_FILE yyrestart( yyin ) #define YY_END_OF_BUFFER_CHAR 0 /* Size of default input buffer. */ #ifndef YY_BUF_SIZE #ifdef __ia64__ /* On IA-64, the buffer size is 16k, not 8k. * Moreover, YY_BUF_SIZE is 2*YY_READ_BUF_SIZE in the general case. * Ditto for the __ia64__ case accordingly. */ #define YY_BUF_SIZE 32768 #else #define YY_BUF_SIZE 16384 #endif /* __ia64__ */ #endif /* The state buf must be large enough to hold one state per character in the main buffer. */ #define YY_STATE_BUF_SIZE ((YY_BUF_SIZE + 2) * sizeof(yy_state_type)) #ifndef YY_TYPEDEF_YY_BUFFER_STATE #define YY_TYPEDEF_YY_BUFFER_STATE typedef struct yy_buffer_state *YY_BUFFER_STATE; #endif #ifndef YY_TYPEDEF_YY_SIZE_T #define YY_TYPEDEF_YY_SIZE_T typedef size_t yy_size_t; #endif extern yy_size_t yyleng; #define EOB_ACT_CONTINUE_SCAN 0 #define EOB_ACT_END_OF_FILE 1 #define EOB_ACT_LAST_MATCH 2 /* Note: We specifically omit the test for yy_rule_can_match_eol because it requires * access to the local variable yy_act. Since yyless() is a macro, it would break * existing scanners that call yyless() from OUTSIDE yylex. * One obvious solution it to make yy_act a global. I tried that, and saw * a 5% performance hit in a non-yylineno scanner, because yy_act is * normally declared as a register variable-- so it is not worth it. */ #define YY_LESS_LINENO(n) \ do { \ int yyl;\ for ( yyl = n; yyl < yyleng; ++yyl )\ if ( yytext[yyl] == '\n' )\ --yylineno;\ }while(0) #define YY_LINENO_REWIND_TO(dst) \ do {\ const char *p;\ for ( p = yy_cp-1; p >= (dst); --p)\ if ( *p == '\n' )\ --yylineno;\ }while(0) /* Return all but the first "n" matched characters back to the input stream. */ #define yyless(n) \ do \ { \ /* Undo effects of setting up yytext. */ \ int yyless_macro_arg = (n); \ YY_LESS_LINENO(yyless_macro_arg);\ *yy_cp = (yy_hold_char); \ YY_RESTORE_YY_MORE_OFFSET \ (yy_c_buf_p) = yy_cp = yy_bp + yyless_macro_arg - YY_MORE_ADJ; \ YY_DO_BEFORE_ACTION; /* set up yytext again */ \ } \ while ( 0 ) #define unput(c) yyunput( c, (yytext_ptr) ) #ifndef YY_STRUCT_YY_BUFFER_STATE #define YY_STRUCT_YY_BUFFER_STATE struct yy_buffer_state { std::istream* yy_input_file; char *yy_ch_buf; /* input buffer */ char *yy_buf_pos; /* current position in input buffer */ /* Size of input buffer in bytes, not including room for EOB * characters. */ yy_size_t yy_buf_size; /* Number of characters read into yy_ch_buf, not including EOB * characters. */ yy_size_t yy_n_chars; /* Whether we "own" the buffer - i.e., we know we created it, * and can realloc() it to grow it, and should free() it to * delete it. */ int yy_is_our_buffer; /* Whether this is an "interactive" input source; if so, and * if we're using stdio for input, then we want to use getc() * instead of fread(), to make sure we stop fetching input after * each newline. */ int yy_is_interactive; /* Whether we're considered to be at the beginning of a line. * If so, '^' rules will be active on the next match, otherwise * not. */ int yy_at_bol; int yy_bs_lineno; /**< The line count. */ int yy_bs_column; /**< The column count. */ /* Whether to try to fill the input buffer when we reach the * end of it. */ int yy_fill_buffer; int yy_buffer_status; #define YY_BUFFER_NEW 0 #define YY_BUFFER_NORMAL 1 /* When an EOF's been seen but there's still some text to process * then we mark the buffer as YY_EOF_PENDING, to indicate that we * shouldn't try reading from the input source any more. We might * still have a bunch of tokens to match, though, because of * possible backing-up. * * When we actually see the EOF, we change the status to "new" * (via yyrestart()), so that the user can continue scanning by * just pointing yyin at a new input file. */ #define YY_BUFFER_EOF_PENDING 2 }; #endif /* !YY_STRUCT_YY_BUFFER_STATE */ /* We provide macros for accessing buffer states in case in the * future we want to put the buffer states in a more general * "scanner state". * * Returns the top of the stack, or NULL. */ #define YY_CURRENT_BUFFER ( (yy_buffer_stack) \ ? (yy_buffer_stack)[(yy_buffer_stack_top)] \ : NULL) /* Same as previous macro, but useful when we know that the buffer stack is not * NULL or when we need an lvalue. For internal use only. */ #define YY_CURRENT_BUFFER_LVALUE (yy_buffer_stack)[(yy_buffer_stack_top)] void *yyalloc (yy_size_t ); void *yyrealloc (void *,yy_size_t ); void yyfree (void * ); #define yy_new_buffer yy_create_buffer #define yy_set_interactive(is_interactive) \ { \ if ( ! YY_CURRENT_BUFFER ){ \ yyensure_buffer_stack (); \ YY_CURRENT_BUFFER_LVALUE = \ yy_create_buffer( yyin, YY_BUF_SIZE ); \ } \ YY_CURRENT_BUFFER_LVALUE->yy_is_interactive = is_interactive; \ } #define yy_set_bol(at_bol) \ { \ if ( ! YY_CURRENT_BUFFER ){\ yyensure_buffer_stack (); \ YY_CURRENT_BUFFER_LVALUE = \ yy_create_buffer( yyin, YY_BUF_SIZE ); \ } \ YY_CURRENT_BUFFER_LVALUE->yy_at_bol = at_bol; \ } #define YY_AT_BOL() (YY_CURRENT_BUFFER_LVALUE->yy_at_bol) /* Begin user sect3 */ #define YY_SKIP_YYWRAP typedef unsigned char YY_CHAR; #define yytext_ptr yytext #define YY_INTERACTIVE #include int yyFlexLexer::yywrap() { return 1; } /* Done after the current pattern has been matched and before the * corresponding action - sets up yytext. */ #define YY_DO_BEFORE_ACTION \ (yytext_ptr) = yy_bp; \ yyleng = (size_t) (yy_cp - yy_bp); \ (yy_hold_char) = *yy_cp; \ *yy_cp = '\0'; \ (yy_c_buf_p) = yy_cp; #define YY_NUM_RULES 139 #define YY_END_OF_BUFFER 140 /* This struct is not used in this scanner, but its presence is necessary. */ struct yy_trans_info { flex_int32_t yy_verify; flex_int32_t yy_nxt; }; static yyconst flex_int16_t yy_accept[1118] = { 0, 1, 1, 0, 0, 0, 0, 140, 138, 2, 1, 1, 138, 120, 138, 138, 137, 137, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 124, 124, 139, 1, 1, 1, 0, 132, 120, 0, 132, 122, 121, 137, 0, 0, 136, 0, 129, 102, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 117, 133, 133, 104, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 17, 18, 133, 133, 133, 133, 133, 133, 133, 133, 123, 121, 137, 0, 0, 0, 128, 134, 127, 127, 133, 133, 133, 133, 133, 133, 103, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 95, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 116, 137, 0, 0, 0, 0, 126, 126, 0, 127, 0, 127, 133, 133, 133, 68, 133, 133, 133, 133, 133, 133, 133, 133, 133, 110, 133, 133, 133, 133, 32, 133, 133, 48, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 0, 133, 133, 133, 133, 133, 133, 133, 25, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 118, 133, 133, 133, 133, 137, 0, 135, 0, 0, 0, 126, 0, 126, 0, 127, 127, 127, 127, 133, 133, 133, 133, 133, 109, 133, 133, 133, 4, 133, 133, 133, 133, 133, 133, 133, 133, 119, 133, 99, 133, 133, 3, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 0, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 7, 133, 47, 133, 133, 26, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 0, 0, 0, 0, 0, 126, 126, 126, 126, 0, 127, 127, 127, 0, 127, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 31, 133, 133, 133, 133, 133, 40, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 0, 0, 133, 133, 133, 38, 133, 133, 133, 133, 133, 36, 133, 133, 133, 133, 64, 96, 133, 133, 133, 113, 46, 133, 133, 133, 133, 133, 133, 133, 0, 0, 0, 0, 126, 126, 126, 0, 126, 0, 0, 127, 127, 127, 127, 133, 133, 35, 133, 133, 133, 133, 133, 133, 133, 133, 0, 133, 133, 112, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 0, 0, 133, 133, 133, 133, 133, 62, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 23, 133, 133, 133, 135, 0, 0, 0, 0, 0, 126, 126, 126, 126, 0, 127, 127, 127, 0, 127, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 0, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 84, 133, 133, 133, 49, 133, 58, 133, 133, 133, 12, 10, 101, 133, 45, 0, 0, 133, 133, 133, 60, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 5, 133, 133, 133, 14, 0, 0, 0, 0, 126, 126, 126, 0, 126, 131, 127, 127, 127, 127, 133, 133, 133, 133, 133, 97, 133, 133, 133, 133, 133, 133, 133, 133, 133, 0, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 86, 133, 133, 133, 133, 133, 133, 133, 133, 11, 67, 0, 0, 133, 133, 133, 61, 133, 133, 133, 133, 133, 133, 133, 33, 133, 133, 6, 111, 42, 133, 133, 0, 0, 0, 0, 130, 126, 126, 126, 126, 127, 127, 127, 0, 127, 133, 133, 133, 133, 133, 133, 133, 133, 78, 133, 133, 133, 59, 133, 0, 133, 133, 133, 133, 133, 133, 133, 133, 39, 133, 133, 133, 37, 133, 133, 133, 133, 133, 133, 133, 34, 13, 0, 0, 55, 54, 41, 133, 133, 24, 133, 133, 133, 133, 44, 43, 133, 133, 135, 0, 0, 126, 126, 126, 0, 126, 127, 127, 127, 127, 133, 15, 133, 66, 133, 133, 133, 133, 77, 133, 133, 133, 0, 133, 133, 133, 133, 133, 133, 81, 133, 133, 133, 133, 88, 90, 92, 94, 133, 133, 133, 57, 56, 133, 133, 133, 133, 133, 133, 133, 63, 0, 0, 0, 0, 126, 126, 126, 126, 127, 127, 127, 0, 127, 133, 133, 114, 133, 79, 133, 133, 133, 133, 0, 100, 133, 133, 133, 53, 133, 82, 22, 65, 133, 133, 133, 8, 133, 133, 133, 27, 133, 133, 133, 0, 0, 0, 126, 126, 126, 0, 126, 127, 127, 127, 127, 133, 133, 133, 75, 80, 133, 133, 0, 133, 133, 52, 133, 133, 133, 133, 69, 133, 133, 133, 133, 133, 133, 133, 135, 0, 0, 0, 126, 126, 126, 126, 127, 127, 127, 0, 127, 133, 133, 76, 133, 133, 0, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 16, 21, 0, 0, 125, 128, 126, 126, 126, 0, 126, 127, 127, 127, 127, 133, 133, 133, 29, 0, 0, 133, 133, 133, 83, 133, 133, 28, 133, 133, 133, 133, 133, 0, 0, 125, 0, 126, 126, 126, 126, 126, 127, 127, 127, 0, 127, 133, 133, 133, 0, 0, 30, 133, 133, 85, 133, 133, 133, 133, 133, 115, 133, 133, 133, 135, 125, 128, 126, 0, 126, 126, 126, 126, 127, 127, 127, 70, 133, 133, 133, 133, 0, 0, 133, 133, 133, 133, 133, 133, 51, 133, 20, 133, 133, 0, 125, 126, 126, 126, 126, 127, 127, 127, 133, 133, 133, 133, 133, 0, 0, 133, 133, 87, 89, 91, 93, 9, 19, 133, 0, 126, 126, 0, 126, 126, 127, 50, 133, 133, 133, 133, 0, 0, 133, 133, 98, 135, 126, 126, 127, 133, 133, 133, 133, 0, 0, 0, 133, 133, 133, 0, 126, 126, 0, 133, 133, 133, 133, 0, 0, 0, 105, 133, 133, 133, 105, 125, 126, 126, 71, 133, 133, 133, 0, 107, 0, 133, 107, 133, 125, 126, 126, 0, 133, 133, 74, 0, 106, 133, 106, 0, 126, 126, 133, 72, 108, 108, 0, 126, 126, 0, 73, 135, 126, 126, 0, 126, 126, 0, 126, 126, 0 } ; static yyconst flex_int32_t yy_ec[256] = { 0, 1, 1, 1, 1, 1, 1, 1, 1, 2, 3, 1, 1, 4, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 5, 6, 1, 1, 1, 7, 1, 1, 8, 9, 1, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 20, 22, 1, 1, 23, 1, 1, 1, 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, 1, 1, 1, 1, 1, 1, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 } ; static yyconst flex_int32_t yy_meta[76] = { 0, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 1, 3, 3, 3, 3, 3, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 3, 3, 3, 3, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 } ; static yyconst flex_int16_t yy_base[1208] = { 0, 0, 0, 1166, 1165, 0, 0, 1172, 6257, 6257, 73, 75, 1165, 0, 1162, 72, 72, 34, 1116, 1109, 136, 186, 233, 280, 71, 208, 338, 66, 236, 38, 89, 223, 240, 340, 72, 359, 377, 422, 419, 68, 392, 180, 209, 6257, 1118, 6257, 111, 137, 213, 1120, 6257, 0, 1082, 1064, 6257, 0, 480, 1022, 499, 6257, 0, 525, 6257, 60, 568, 188, 192, 182, 184, 270, 275, 279, 231, 283, 420, 276, 274, 279, 405, 388, 375, 560, 478, 561, 335, 564, 583, 585, 591, 604, 608, 411, 613, 603, 337, 628, 601, 370, 623, 621, 413, 477, 638, 643, 652, 645, 659, 459, 656, 673, 680, 670, 692, 687, 570, 600, 709, 701, 658, 700, 704, 697, 705, 710, 6257, 0, 768, 978, 542, 969, 813, 0, 858, 553, 901, 719, 710, 890, 894, 895, 732, 893, 901, 760, 898, 918, 766, 899, 900, 945, 754, 951, 937, 950, 952, 940, 818, 948, 941, 953, 972, 986, 981, 989, 800, 991, 992, 983, 988, 1004, 985, 1037, 1021, 1005, 1038, 1028, 1006, 1040, 1034, 1041, 1042, 1044, 1049, 1057, 1065, 1074, 1076, 1092, 1078, 1084, 1087, 1107, 1109, 1112, 1108, 1117, 1137, 1124, 1036, 1195, 832, 968, 965, 964, 1242, 878, 1182, 1287, 1330, 1214, 1373, 1100, 1308, 1101, 1210, 1333, 1195, 1325, 1368, 1362, 1247, 1385, 1363, 1123, 1366, 1369, 1148, 1404, 1229, 1374, 1403, 1406, 1412, 1375, 1410, 1414, 1408, 1290, 1405, 1416, 1443, 1453, 1439, 1450, 1451, 939, 1464, 1456, 1455, 1457, 1484, 1466, 1491, 1467, 1512, 1495, 1505, 1507, 1497, 1503, 1525, 1513, 1530, 1532, 1554, 1536, 1548, 1559, 1519, 1564, 1583, 1547, 1570, 1577, 1571, 1587, 1645, 925, 914, 885, 884, 1655, 1666, 1709, 1685, 1728, 1754, 1773, 1799, 1818, 883, 1688, 1584, 1568, 1798, 1572, 1819, 1813, 1645, 1741, 1797, 1815, 1832, 1818, 1836, 1582, 1670, 1833, 1733, 1851, 1752, 1835, 1856, 1872, 1864, 1867, 1865, 1875, 1879, 1892, 1884, 1903, 1907, 1883, 1888, 1915, 1902, 1922, 1920, 1924, 1906, 1937, 1938, 1927, 1939, 1952, 1951, 1969, 1955, 1945, 1800, 1972, 1802, 1959, 1961, 1967, 1974, 1989, 1988, 1990, 1992, 2004, 2003, 2006, 2010, 2031, 2022, 2024, 882, 881, 880, 879, 2089, 2100, 2119, 2145, 2164, 2128, 2190, 878, 2202, 2245, 2221, 2087, 2144, 2023, 2013, 2232, 2042, 2028, 2240, 2247, 2235, 2242, 2317, 2243, 2241, 2284, 2181, 2289, 2020, 2244, 2299, 2288, 2300, 2293, 2303, 2309, 2304, 2307, 2328, 2321, 2342, 2320, 2322, 2341, 2351, 2352, 2344, 2359, 2138, 2255, 2363, 2360, 2361, 2345, 2374, 2390, 2365, 2388, 2408, 2373, 2393, 2407, 2428, 2430, 2397, 2403, 2417, 2413, 2427, 2412, 2415, 2432, 2424, 2451, 2460, 2449, 2476, 2464, 868, 839, 838, 2522, 2534, 837, 2546, 2589, 2565, 2608, 2634, 2645, 2664, 2690, 2709, 2711, 2447, 2567, 2474, 2691, 2463, 2693, 2712, 2689, 2706, 2710, 2454, 2722, 2724, 2457, 2727, 2576, 2759, 2741, 2755, 2760, 2763, 2745, 2735, 2777, 2784, 2791, 2792, 2797, 2804, 2811, 2800, 2812, 2815, 2824, 2821, 2816, 2833, 2533, 2590, 2829, 2843, 2845, 2851, 2853, 2624, 2856, 2865, 2873, 2866, 2881, 2894, 2897, 2900, 2863, 2898, 2895, 2903, 2912, 2632, 2916, 2910, 2918, 836, 835, 834, 832, 2976, 2987, 2998, 3017, 3043, 3062, 3026, 3088, 821, 3100, 3143, 3119, 3121, 3129, 3137, 3042, 3141, 3142, 3139, 3157, 3136, 3173, 3175, 2861, 3145, 3172, 3176, 2925, 3187, 3194, 3196, 3182, 3209, 3197, 3191, 3195, 3226, 3232, 3225, 3229, 3233, 2913, 3267, 3228, 3264, 2940, 3250, 2985, 3263, 3248, 3256, 3030, 3246, 3249, 3268, 3261, 3282, 3264, 3295, 3286, 3297, 3277, 3298, 3306, 3313, 3302, 3317, 3316, 3278, 3314, 3318, 3341, 3335, 3322, 3347, 3330, 3352, 3353, 3354, 3337, 794, 793, 792, 3412, 3423, 791, 3435, 3478, 3454, 3463, 3523, 3497, 3568, 3542, 3476, 3556, 3564, 3465, 3377, 3350, 3558, 3563, 3565, 3568, 3587, 3600, 3608, 3611, 3570, 3578, 3619, 3598, 3609, 3610, 3612, 3623, 3622, 3640, 3642, 3651, 3644, 3650, 3663, 3607, 3681, 3679, 3683, 3688, 3667, 3692, 3680, 3674, 3660, 3661, 3676, 3691, 3691, 3699, 3711, 3678, 3712, 3724, 3719, 3716, 3721, 3726, 3740, 3727, 3743, 3733, 3731, 3732, 3735, 3760, 3764, 790, 789, 786, 785, 3551, 3824, 3806, 3869, 3843, 3888, 784, 3914, 3957, 3933, 3919, 3944, 3953, 3949, 3952, 3969, 3763, 3803, 3822, 3951, 3959, 3958, 3856, 3971, 3884, 3989, 3935, 4003, 4008, 3991, 4010, 4009, 4006, 3996, 4000, 4021, 4025, 4002, 4038, 4039, 4050, 4033, 4046, 4048, 4052, 4030, 4041, 4050, 4047, 4045, 4049, 4053, 4073, 4089, 4054, 4090, 4094, 4100, 4101, 4060, 4061, 4092, 4106, 783, 782, 781, 4164, 779, 4176, 4219, 4195, 4264, 4238, 4309, 4283, 4304, 4093, 4102, 4095, 4098, 4198, 4297, 4302, 4104, 4324, 4129, 4325, 4186, 4303, 4340, 4306, 4313, 4311, 4251, 4243, 4345, 4342, 4352, 4361, 4346, 4347, 4348, 4349, 4376, 4379, 4380, 6257, 6257, 4390, 4392, 4393, 4359, 4399, 4398, 4394, 4383, 778, 747, 746, 744, 4459, 4478, 4504, 4523, 4549, 739, 4561, 4604, 4580, 4401, 4564, 4395, 4595, 4396, 4600, 4616, 4609, 4503, 4415, 4446, 4618, 4597, 4605, 4491, 4606, 4601, 4603, 4607, 4651, 4656, 4653, 4672, 4647, 4657, 4655, 4643, 4661, 4649, 4658, 734, 733, 705, 4719, 644, 4732, 4775, 4751, 4820, 4794, 4865, 4839, 4652, 4825, 4762, 4654, 4659, 4855, 4856, 646, 4773, 4853, 4711, 4877, 4870, 4861, 4864, 4807, 4865, 4869, 4867, 4910, 4904, 4900, 4915, 627, 624, 594, 589, 4975, 4994, 5020, 5039, 5065, 587, 5077, 5120, 5096, 4917, 4902, 4905, 4907, 5098, 5117, 4908, 5134, 4999, 5133, 5135, 5136, 4912, 5138, 5019, 4914, 5137, 4954, 4962, 585, 584, 581, 0, 5198, 580, 5210, 5253, 5229, 5298, 5272, 5343, 5317, 5332, 5311, 5114, 5081, 5127, 5127, 5346, 5240, 5336, 5123, 5368, 5335, 5152, 5360, 5363, 5374, 5376, 5251, 579, 543, 506, 505, 504, 5436, 5408, 5481, 5455, 5500, 503, 5526, 0, 5545, 5341, 5527, 5546, 5209, 5360, 5365, 5479, 5529, 5397, 5554, 5460, 5468, 5542, 5547, 5415, 5559, 5556, 5550, 502, 501, 6257, 466, 0, 5617, 462, 5629, 5648, 5674, 5693, 0, 5544, 5678, 5671, 5692, 5706, 5553, 5599, 5675, 5695, 5713, 5608, 5716, 5705, 5616, 5696, 5674, 5707, 5724, 460, 451, 450, 449, 5784, 5803, 5829, 446, 0, 5709, 5763, 5712, 5787, 5817, 5712, 0, 5786, 5858, 5711, 5723, 5726, 5762, 5785, 5814, 5841, 445, 417, 416, 0, 5882, 6257, 0, 5834, 5861, 5862, 5863, 5864, 0, 5863, 5918, 5885, 5839, 406, 403, 402, 6257, 5898, 5884, 5904, 5906, 5918, 5864, 5884, 5929, 5934, 5916, 400, 396, 395, 0, 5918, 5921, 5937, 5907, 5940, 5929, 5924, 6257, 5956, 5952, 5951, 5953, 363, 357, 355, 5954, 5965, 5964, 5967, 5960, 6257, 5988, 5970, 5972, 6001, 353, 352, 349, 0, 6004, 5974, 5983, 6006, 6257, 6008, 5989, 339, 314, 310, 6005, 6002, 6257, 6006, 0, 307, 305, 0, 6010, 303, 276, 273, 267, 260, 254, 0, 220, 214, 6257, 6080, 6084, 6088, 6092, 6096, 6100, 6102, 232, 6104, 6106, 6108, 6110, 6112, 6114, 6116, 6118, 6120, 6122, 6126, 6128, 6130, 6132, 6134, 6136, 6138, 6140, 6142, 6144, 6146, 6148, 6150, 6152, 6154, 6156, 6158, 6160, 6162, 6164, 6166, 6168, 6170, 6172, 6174, 6176, 6178, 231, 6180, 6182, 6184, 230, 6186, 6188, 6190, 228, 226, 6192, 6194, 6196, 224, 6200, 6204, 6206, 6208, 223, 219, 6212, 6216, 6218, 6220, 6222, 6224, 6226, 217, 6228, 6230, 6232, 6234, 6236, 145, 6238, 6240, 6242, 131, 6244, 117, 6246, 6248, 6250, 80, 6252 } ; static yyconst flex_int16_t yy_def[1208] = { 0, 1117, 1, 1118, 1118, 1119, 1119, 1117, 1117, 1117, 1117, 1117, 1120, 1121, 1122, 1117, 1117, 16, 1117, 1117, 1117, 20, 20, 22, 22, 22, 22, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 1117, 1117, 1117, 1117, 1117, 1117, 1120, 1117, 1121, 1122, 1117, 1117, 1123, 1117, 1124, 56, 1117, 1125, 1117, 1117, 26, 26, 64, 64, 64, 26, 26, 26, 26, 26, 64, 26, 26, 64, 64, 26, 26, 26, 26, 26, 26, 64, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 1117, 1123, 1117, 1126, 126, 1127, 1117, 1125, 1117, 132, 64, 134, 134, 26, 26, 26, 26, 26, 26, 134, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 1117, 199, 1128, 1129, 1130, 1117, 204, 1117, 1117, 1117, 207, 134, 210, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 1117, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 200, 200, 1129, 1131, 1132, 1117, 1117, 1117, 282, 1117, 1117, 286, 1117, 288, 210, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 1117, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 1133, 1117, 1134, 1135, 1117, 1117, 363, 1117, 365, 1117, 1117, 1117, 1117, 1117, 370, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 1136, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 1117, 1117, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 1137, 1138, 1139, 1117, 1117, 1117, 1117, 1117, 446, 1117, 1117, 1117, 451, 1117, 453, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 1117, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 1117, 1117, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 1134, 1117, 1140, 1141, 1117, 1117, 1117, 524, 1117, 526, 1117, 1117, 1117, 1117, 1117, 531, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 1117, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 1117, 1117, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 1142, 1143, 1144, 1117, 1117, 1117, 1117, 1117, 608, 1117, 1117, 612, 1117, 614, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 1117, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 1117, 1117, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 1145, 1117, 1146, 1147, 1117, 1117, 682, 1117, 684, 1117, 1117, 1117, 1117, 688, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 1117, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 1117, 1117, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 1148, 1149, 1150, 1117, 1117, 1117, 1117, 749, 1117, 752, 1117, 754, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 1117, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 1117, 1117, 26, 26, 26, 26, 26, 26, 26, 26, 1151, 1117, 1152, 1153, 1117, 801, 1117, 803, 1117, 1117, 1117, 1117, 807, 26, 26, 26, 26, 26, 26, 26, 26, 26, 1117, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 1154, 1155, 1156, 1117, 1117, 1117, 1117, 845, 1117, 848, 1117, 850, 26, 26, 26, 26, 26, 26, 26, 1117, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 1157, 1117, 1158, 1159, 1117, 879, 1117, 881, 1117, 1117, 1117, 1117, 885, 26, 26, 26, 26, 26, 1117, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 1160, 1161, 1162, 1163, 1117, 1117, 1117, 1117, 913, 1117, 916, 1117, 918, 26, 26, 26, 26, 1117, 1117, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 1164, 1117, 1165, 1117, 1166, 1117, 943, 1117, 945, 1117, 1117, 1117, 1167, 949, 26, 26, 26, 1117, 1117, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 1168, 1169, 1117, 1170, 1171, 1117, 1117, 1117, 977, 1117, 979, 1172, 26, 26, 26, 26, 26, 1117, 1117, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 1173, 1117, 1174, 1175, 1117, 1004, 1117, 1117, 1176, 26, 26, 26, 26, 26, 1117, 1177, 26, 1178, 26, 26, 26, 26, 26, 26, 26, 1179, 1117, 1180, 1181, 1117, 1117, 1182, 26, 26, 26, 26, 26, 1183, 1117, 1184, 26, 26, 1185, 1186, 1187, 1117, 26, 26, 26, 26, 1117, 1117, 1117, 26, 26, 26, 1188, 1117, 1189, 1190, 26, 26, 26, 26, 1117, 1117, 1117, 1117, 26, 26, 26, 26, 1191, 1192, 1193, 26, 26, 26, 26, 1117, 1117, 1117, 26, 26, 26, 1194, 1117, 1195, 1196, 26, 26, 26, 1117, 1117, 26, 26, 1197, 1198, 1199, 26, 26, 1117, 26, 1200, 1117, 1201, 1202, 26, 1117, 1203, 1204, 1197, 1117, 1205, 1206, 1207, 1117, 0, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117 } ; static yyconst flex_int16_t yy_nxt[6333] = { 0, 8, 9, 10, 11, 12, 13, 14, 8, 8, 8, 8, 15, 16, 17, 17, 17, 17, 17, 17, 17, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 29, 36, 37, 38, 39, 40, 41, 29, 42, 29, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 29, 36, 37, 38, 39, 40, 41, 29, 42, 29, 46, 47, 48, 47, 54, 1117, 63, 946, 55, 56, 56, 56, 56, 56, 56, 56, 56, 56, 57, 64, 58, 58, 58, 58, 58, 58, 88, 59, 63, 119, 63, 1117, 63, 63, 63, 99, 63, 100, 46, 47, 63, 91, 83, 60, 1110, 64, 58, 58, 58, 58, 58, 58, 88, 59, 63, 119, 63, 63, 1108, 63, 63, 99, 63, 100, 48, 47, 63, 91, 83, 60, 63, 63, 1098, 64, 64, 64, 64, 64, 64, 64, 64, 64, 57, 63, 64, 64, 65, 66, 64, 67, 63, 68, 63, 63, 63, 69, 63, 70, 63, 63, 63, 63, 63, 63, 71, 63, 63, 63, 63, 63, 64, 64, 65, 66, 64, 67, 63, 68, 63, 63, 63, 69, 63, 70, 63, 63, 63, 63, 63, 63, 71, 63, 63, 63, 63, 63, 64, 64, 135, 64, 46, 47, 122, 136, 1074, 63, 1045, 63, 63, 137, 1044, 1031, 63, 1008, 72, 1003, 84, 981, 942, 131, 1114, 123, 64, 64, 135, 64, 1114, 63, 122, 136, 63, 63, 85, 63, 63, 137, 86, 63, 63, 92, 72, 73, 84, 64, 64, 93, 64, 123, 94, 89, 142, 63, 74, 63, 63, 75, 63, 90, 85, 63, 1114, 63, 86, 63, 63, 92, 1106, 73, 63, 64, 64, 93, 64, 1117, 94, 89, 142, 63, 74, 1114, 63, 75, 1106, 90, 138, 63, 140, 63, 64, 139, 63, 76, 77, 143, 63, 147, 78, 146, 63, 63, 148, 79, 80, 63, 63, 81, 141, 63, 82, 1111, 138, 1106, 140, 1088, 64, 139, 1106, 76, 77, 143, 1088, 147, 78, 146, 63, 63, 148, 79, 80, 63, 63, 81, 141, 63, 82, 63, 63, 63, 63, 63, 63, 63, 63, 63, 1117, 972, 63, 63, 63, 63, 63, 63, 95, 63, 155, 1088, 96, 63, 1059, 1096, 63, 1088, 97, 1059, 168, 63, 87, 98, 63, 941, 101, 102, 63, 63, 63, 63, 63, 63, 95, 63, 155, 103, 96, 63, 104, 105, 63, 63, 97, 106, 168, 63, 87, 98, 63, 151, 101, 102, 63, 107, 120, 1059, 1028, 63, 121, 63, 910, 103, 1059, 1028, 104, 105, 1056, 63, 150, 106, 63, 114, 115, 149, 63, 151, 1028, 974, 63, 107, 120, 116, 144, 63, 121, 63, 108, 63, 109, 117, 145, 110, 111, 63, 150, 63, 63, 164, 118, 149, 63, 63, 63, 112, 113, 878, 950, 116, 144, 1028, 974, 941, 108, 63, 109, 117, 145, 110, 111, 63, 130, 63, 914, 164, 118, 174, 974, 63, 63, 112, 113, 126, 126, 126, 126, 126, 126, 126, 126, 126, 127, 183, 128, 128, 128, 128, 128, 128, 153, 59, 128, 128, 128, 128, 128, 128, 128, 128, 128, 63, 63, 941, 1000, 886, 974, 972, 941, 183, 128, 128, 128, 128, 128, 128, 153, 59, 132, 132, 132, 132, 132, 132, 132, 132, 132, 63, 63, 133, 133, 133, 133, 133, 133, 200, 200, 200, 200, 200, 200, 200, 200, 200, 1117, 878, 209, 209, 209, 209, 209, 209, 209, 209, 209, 133, 133, 133, 133, 133, 133, 134, 134, 134, 134, 134, 134, 134, 134, 134, 127, 156, 134, 134, 134, 134, 134, 134, 152, 68, 154, 800, 846, 941, 63, 63, 878, 130, 63, 808, 157, 910, 63, 158, 63, 159, 878, 156, 134, 134, 134, 134, 134, 134, 152, 68, 154, 63, 160, 63, 63, 63, 161, 167, 63, 63, 157, 162, 63, 158, 63, 159, 165, 171, 63, 63, 800, 63, 63, 907, 166, 163, 63, 63, 160, 63, 893, 63, 161, 167, 169, 63, 172, 162, 173, 63, 750, 63, 165, 171, 63, 63, 63, 63, 63, 170, 166, 163, 63, 175, 177, 176, 63, 63, 178, 179, 169, 63, 172, 63, 173, 63, 180, 63, 181, 182, 63, 184, 63, 185, 63, 170, 193, 63, 186, 175, 177, 176, 63, 187, 178, 179, 190, 63, 63, 63, 188, 63, 180, 191, 181, 182, 63, 184, 63, 185, 63, 878, 193, 63, 186, 63, 194, 189, 196, 187, 63, 192, 190, 195, 63, 63, 188, 63, 63, 63, 197, 211, 63, 63, 63, 212, 198, 63, 63, 800, 680, 63, 194, 189, 196, 689, 63, 192, 225, 195, 130, 63, 800, 680, 63, 63, 197, 211, 63, 63, 63, 212, 198, 63, 63, 199, 199, 199, 199, 199, 199, 199, 199, 199, 57, 218, 200, 200, 200, 200, 200, 200, 63, 59, 130, 609, 63, 800, 680, 797, 532, 130, 680, 221, 63, 521, 521, 447, 680, 521, 130, 218, 200, 200, 200, 200, 200, 200, 63, 59, 204, 204, 204, 204, 204, 204, 204, 204, 204, 221, 63, 205, 205, 205, 205, 205, 205, 371, 63, 277, 277, 277, 277, 277, 277, 277, 277, 277, 130, 231, 521, 361, 602, 283, 521, 361, 63, 205, 205, 205, 205, 205, 205, 206, 63, 207, 207, 207, 207, 207, 207, 207, 207, 207, 208, 231, 209, 209, 209, 209, 209, 209, 63, 1117, 361, 284, 284, 284, 284, 284, 284, 284, 284, 284, 208, 130, 361, 203, 130, 1117, 361, 203, 209, 209, 209, 209, 209, 209, 210, 210, 210, 210, 210, 210, 210, 210, 210, 57, 216, 210, 210, 210, 210, 210, 210, 213, 214, 215, 63, 217, 358, 63, 63, 63, 219, 222, 63, 63, 63, 63, 220, 1117, 223, 326, 216, 210, 210, 210, 210, 210, 210, 213, 214, 215, 63, 217, 63, 63, 63, 63, 219, 222, 63, 63, 63, 63, 220, 224, 223, 226, 227, 228, 232, 234, 229, 63, 230, 233, 63, 63, 130, 203, 63, 63, 203, 203, 63, 241, 63, 63, 63, 63, 235, 224, 130, 226, 227, 228, 232, 234, 229, 63, 230, 233, 63, 63, 236, 237, 242, 63, 63, 238, 63, 239, 63, 63, 63, 63, 235, 63, 240, 63, 244, 63, 63, 247, 63, 63, 243, 63, 63, 248, 236, 237, 242, 253, 63, 238, 130, 239, 245, 246, 63, 63, 63, 63, 240, 63, 244, 63, 63, 252, 63, 63, 243, 63, 63, 248, 249, 63, 255, 253, 258, 254, 257, 52, 63, 250, 63, 63, 63, 251, 63, 256, 63, 63, 63, 252, 63, 63, 63, 259, 63, 53, 249, 63, 255, 63, 258, 254, 257, 261, 63, 250, 260, 63, 264, 251, 63, 256, 63, 63, 63, 63, 63, 63, 63, 259, 63, 262, 266, 263, 63, 63, 63, 265, 63, 261, 267, 50, 260, 63, 63, 268, 124, 63, 62, 269, 272, 63, 63, 270, 61, 291, 271, 262, 266, 263, 63, 63, 63, 265, 63, 273, 267, 63, 63, 63, 63, 268, 63, 63, 275, 269, 272, 63, 63, 270, 274, 291, 271, 63, 63, 53, 50, 63, 1117, 44, 44, 273, 1117, 63, 63, 63, 305, 63, 63, 1117, 275, 1117, 1117, 63, 1117, 1117, 274, 1117, 63, 63, 63, 285, 285, 285, 285, 285, 285, 285, 285, 285, 1117, 296, 305, 63, 276, 276, 276, 276, 276, 276, 276, 276, 276, 57, 63, 277, 277, 277, 277, 277, 277, 1117, 59, 287, 287, 287, 287, 287, 287, 287, 287, 287, 1117, 1117, 1117, 63, 1117, 1117, 1117, 1117, 1117, 277, 277, 277, 277, 277, 277, 294, 59, 281, 63, 282, 282, 282, 282, 282, 282, 282, 282, 282, 283, 63, 284, 284, 284, 284, 284, 284, 1117, 63, 1117, 1117, 1117, 294, 1117, 1117, 63, 1117, 1117, 1117, 300, 1117, 1117, 1117, 1117, 1117, 1117, 63, 284, 284, 284, 284, 284, 284, 206, 63, 286, 286, 286, 286, 286, 286, 286, 286, 286, 208, 300, 287, 287, 287, 287, 287, 287, 63, 292, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 315, 1117, 1117, 1117, 1117, 1117, 1117, 63, 297, 293, 287, 287, 287, 287, 287, 287, 288, 288, 288, 288, 288, 288, 288, 288, 288, 63, 315, 289, 289, 289, 289, 289, 289, 63, 1117, 293, 1117, 1117, 1117, 1117, 1117, 1117, 63, 1117, 1117, 1117, 302, 1117, 1117, 1117, 63, 63, 295, 289, 289, 289, 289, 289, 289, 290, 290, 290, 290, 290, 290, 290, 290, 290, 63, 298, 290, 290, 290, 290, 290, 290, 63, 299, 295, 63, 63, 303, 301, 63, 304, 63, 63, 306, 307, 309, 311, 63, 63, 312, 1117, 298, 290, 290, 290, 290, 290, 290, 63, 299, 308, 63, 63, 303, 301, 63, 304, 63, 63, 310, 307, 313, 311, 63, 63, 316, 63, 63, 63, 63, 314, 63, 318, 63, 63, 63, 308, 63, 317, 63, 325, 1117, 1117, 1117, 1117, 310, 1117, 313, 1117, 323, 1117, 316, 63, 63, 63, 63, 314, 63, 319, 63, 324, 63, 63, 63, 317, 63, 63, 320, 321, 322, 327, 331, 330, 63, 63, 323, 63, 329, 63, 63, 63, 1117, 1117, 333, 319, 328, 324, 63, 63, 63, 63, 332, 63, 320, 321, 322, 327, 331, 330, 63, 63, 337, 63, 329, 63, 63, 63, 63, 334, 333, 1117, 328, 339, 63, 63, 63, 63, 332, 63, 335, 63, 338, 1117, 336, 340, 341, 63, 337, 63, 1117, 63, 343, 342, 63, 334, 63, 63, 344, 339, 345, 63, 351, 63, 348, 63, 335, 63, 338, 63, 336, 340, 341, 63, 63, 63, 63, 63, 343, 342, 63, 346, 63, 63, 344, 349, 345, 350, 351, 63, 348, 63, 63, 353, 354, 63, 347, 357, 63, 352, 63, 1117, 63, 63, 355, 1117, 63, 346, 63, 356, 375, 349, 63, 350, 63, 63, 63, 63, 63, 390, 354, 63, 347, 374, 63, 352, 63, 63, 63, 63, 355, 63, 1117, 1117, 63, 356, 375, 1117, 63, 1117, 63, 63, 63, 1117, 1117, 390, 1117, 63, 1117, 374, 1117, 1117, 63, 63, 63, 382, 1117, 63, 276, 276, 276, 276, 276, 276, 276, 276, 276, 1117, 362, 362, 362, 362, 362, 362, 362, 362, 362, 281, 1117, 363, 363, 363, 363, 363, 363, 363, 363, 363, 283, 63, 364, 364, 364, 364, 364, 364, 1117, 1117, 364, 364, 364, 364, 364, 364, 364, 364, 364, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 391, 63, 364, 364, 364, 364, 364, 364, 365, 365, 365, 365, 365, 365, 365, 365, 365, 373, 63, 366, 366, 366, 366, 366, 366, 367, 391, 285, 285, 285, 285, 285, 285, 285, 285, 285, 1117, 383, 1117, 1117, 1117, 1117, 1117, 373, 63, 366, 366, 366, 366, 366, 366, 206, 1117, 368, 368, 368, 368, 368, 368, 368, 368, 368, 208, 63, 369, 369, 369, 369, 369, 369, 1117, 63, 369, 369, 369, 369, 369, 369, 369, 369, 369, 1117, 63, 1117, 1117, 1117, 1117, 1117, 1117, 63, 369, 369, 369, 369, 369, 369, 206, 63, 370, 370, 370, 370, 370, 370, 370, 370, 370, 371, 63, 372, 372, 372, 372, 372, 372, 1117, 376, 372, 372, 372, 372, 372, 372, 372, 372, 372, 384, 63, 63, 377, 63, 394, 63, 385, 381, 372, 372, 372, 372, 372, 372, 378, 376, 63, 379, 63, 380, 388, 63, 63, 389, 392, 384, 63, 63, 377, 63, 386, 63, 385, 381, 387, 63, 63, 393, 63, 63, 378, 397, 63, 379, 63, 380, 388, 63, 63, 389, 392, 395, 407, 400, 63, 398, 386, 396, 399, 63, 387, 63, 63, 393, 63, 63, 401, 63, 63, 1117, 63, 404, 408, 402, 1117, 63, 1117, 395, 63, 400, 63, 398, 63, 396, 399, 63, 63, 63, 410, 403, 406, 63, 401, 63, 63, 63, 63, 404, 408, 402, 405, 63, 415, 411, 63, 409, 63, 413, 63, 63, 63, 414, 63, 63, 410, 403, 406, 63, 63, 412, 416, 63, 1117, 63, 418, 63, 405, 63, 415, 411, 63, 409, 63, 413, 417, 63, 63, 414, 422, 419, 63, 63, 63, 423, 63, 412, 416, 424, 63, 63, 418, 63, 420, 63, 63, 63, 63, 421, 63, 425, 417, 426, 63, 427, 63, 419, 63, 63, 63, 423, 63, 428, 63, 424, 63, 63, 429, 63, 420, 431, 63, 63, 430, 421, 63, 425, 434, 426, 63, 427, 63, 63, 63, 63, 432, 63, 63, 428, 63, 1117, 437, 63, 429, 63, 433, 431, 63, 63, 430, 63, 439, 436, 434, 63, 435, 458, 63, 63, 63, 63, 432, 63, 438, 63, 457, 63, 63, 63, 461, 460, 433, 63, 63, 63, 63, 63, 439, 436, 1117, 63, 435, 458, 63, 1117, 1117, 63, 1117, 1117, 438, 63, 457, 63, 63, 63, 461, 460, 455, 63, 1117, 443, 63, 362, 362, 362, 362, 362, 362, 362, 362, 362, 281, 63, 444, 444, 444, 444, 444, 444, 444, 444, 444, 283, 1117, 445, 445, 445, 445, 445, 445, 1117, 63, 445, 445, 445, 445, 445, 445, 445, 445, 445, 449, 449, 449, 449, 449, 449, 449, 449, 449, 445, 445, 445, 445, 445, 445, 281, 63, 446, 446, 446, 446, 446, 446, 446, 446, 446, 447, 456, 448, 448, 448, 448, 448, 448, 1117, 493, 448, 448, 448, 448, 448, 448, 448, 448, 448, 1117, 1117, 63, 1117, 1117, 472, 1117, 1117, 456, 448, 448, 448, 448, 448, 448, 206, 493, 450, 450, 450, 450, 450, 450, 450, 450, 450, 208, 206, 63, 451, 451, 451, 451, 451, 451, 451, 451, 451, 371, 63, 452, 452, 452, 452, 452, 452, 1117, 1117, 452, 452, 452, 452, 452, 452, 452, 452, 452, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 63, 452, 452, 452, 452, 452, 452, 453, 453, 453, 453, 453, 453, 453, 453, 453, 459, 462, 454, 454, 454, 454, 454, 454, 463, 63, 464, 465, 63, 469, 474, 470, 494, 63, 63, 63, 63, 63, 1117, 1117, 63, 1117, 459, 462, 454, 454, 454, 454, 454, 454, 463, 63, 464, 465, 63, 469, 474, 470, 494, 63, 63, 63, 63, 63, 476, 471, 63, 466, 466, 478, 466, 466, 466, 466, 466, 466, 467, 63, 466, 473, 1117, 63, 63, 479, 475, 477, 63, 1117, 466, 466, 476, 471, 63, 63, 480, 478, 63, 63, 481, 482, 63, 483, 63, 63, 486, 473, 484, 63, 63, 479, 475, 477, 63, 63, 63, 63, 487, 488, 63, 63, 480, 63, 63, 63, 481, 482, 63, 483, 63, 485, 486, 491, 484, 490, 63, 63, 489, 63, 63, 63, 63, 63, 487, 488, 63, 63, 492, 63, 495, 500, 496, 497, 63, 63, 63, 485, 63, 491, 63, 490, 63, 63, 489, 63, 63, 498, 63, 63, 504, 499, 63, 63, 492, 501, 495, 500, 496, 497, 63, 63, 63, 63, 63, 63, 63, 502, 63, 506, 505, 507, 63, 498, 63, 63, 504, 499, 63, 1117, 503, 501, 63, 63, 508, 509, 510, 63, 63, 63, 63, 63, 63, 502, 63, 511, 505, 512, 63, 63, 1117, 1117, 63, 63, 63, 63, 503, 63, 63, 63, 508, 509, 510, 63, 63, 515, 63, 516, 63, 537, 513, 511, 63, 512, 63, 63, 63, 517, 63, 63, 549, 63, 63, 63, 514, 63, 539, 541, 63, 63, 1117, 515, 1117, 1117, 1117, 537, 513, 1117, 63, 63, 63, 63, 63, 517, 1117, 1117, 549, 1117, 63, 1117, 514, 63, 539, 541, 63, 63, 522, 522, 522, 522, 522, 522, 522, 522, 522, 63, 281, 63, 523, 523, 523, 523, 523, 523, 523, 523, 523, 283, 281, 1117, 524, 524, 524, 524, 524, 524, 524, 524, 524, 447, 578, 525, 525, 525, 525, 525, 525, 1117, 538, 525, 525, 525, 525, 525, 525, 525, 525, 525, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 578, 525, 525, 525, 525, 525, 525, 526, 526, 526, 526, 526, 526, 526, 526, 526, 63, 554, 527, 527, 527, 527, 527, 527, 528, 63, 449, 449, 449, 449, 449, 449, 449, 449, 449, 1117, 579, 1117, 1117, 1117, 1117, 1117, 63, 554, 527, 527, 527, 527, 527, 527, 206, 63, 450, 450, 450, 450, 450, 450, 450, 450, 450, 206, 579, 529, 529, 529, 529, 529, 529, 529, 529, 529, 371, 63, 530, 530, 530, 530, 530, 530, 1117, 63, 530, 530, 530, 530, 530, 530, 530, 530, 530, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 63, 530, 530, 530, 530, 530, 530, 206, 63, 531, 531, 531, 531, 531, 531, 531, 531, 531, 532, 546, 533, 533, 533, 533, 533, 533, 1117, 540, 533, 533, 533, 533, 533, 533, 533, 533, 533, 542, 1117, 63, 548, 63, 543, 63, 547, 546, 533, 533, 533, 533, 533, 533, 534, 540, 550, 535, 63, 544, 545, 563, 63, 536, 63, 542, 551, 63, 548, 63, 543, 63, 547, 553, 63, 552, 63, 552, 1117, 63, 534, 1117, 550, 535, 63, 544, 545, 63, 63, 536, 63, 562, 551, 63, 558, 559, 560, 63, 555, 553, 63, 552, 63, 552, 556, 63, 557, 63, 561, 564, 1117, 63, 63, 63, 1117, 63, 565, 562, 1117, 63, 558, 559, 560, 63, 555, 1117, 1117, 566, 567, 63, 556, 568, 557, 63, 561, 564, 63, 63, 63, 1117, 569, 63, 565, 63, 63, 570, 571, 1117, 572, 63, 1117, 573, 63, 566, 567, 63, 63, 568, 575, 1117, 574, 580, 63, 63, 63, 576, 569, 63, 63, 63, 63, 570, 571, 63, 572, 63, 63, 573, 63, 1117, 577, 63, 63, 1117, 575, 63, 574, 580, 585, 63, 63, 576, 1117, 63, 63, 63, 581, 63, 582, 63, 586, 583, 63, 63, 584, 63, 577, 63, 63, 588, 587, 63, 589, 627, 585, 63, 594, 63, 63, 590, 1117, 63, 581, 63, 582, 63, 586, 583, 591, 63, 584, 63, 593, 63, 63, 588, 587, 592, 589, 627, 596, 63, 594, 63, 63, 590, 63, 63, 595, 63, 63, 63, 63, 597, 591, 63, 599, 598, 593, 63, 600, 631, 63, 592, 63, 63, 596, 601, 63, 1117, 63, 1117, 63, 63, 595, 63, 63, 1117, 63, 597, 1117, 63, 599, 598, 1117, 1117, 600, 631, 63, 1117, 63, 63, 63, 601, 63, 605, 63, 522, 522, 522, 522, 522, 522, 522, 522, 522, 281, 1117, 523, 523, 523, 523, 523, 523, 523, 523, 523, 281, 63, 606, 606, 606, 606, 606, 606, 606, 606, 606, 447, 1117, 607, 607, 607, 607, 607, 607, 1117, 63, 607, 607, 607, 607, 607, 607, 607, 607, 607, 611, 611, 611, 611, 611, 611, 611, 611, 611, 607, 607, 607, 607, 607, 607, 281, 63, 608, 608, 608, 608, 608, 608, 608, 608, 608, 609, 619, 610, 610, 610, 610, 610, 610, 1117, 63, 610, 610, 610, 610, 610, 610, 610, 610, 610, 1117, 1117, 63, 1117, 1117, 1117, 1117, 1117, 619, 610, 610, 610, 610, 610, 610, 206, 63, 450, 450, 450, 450, 450, 450, 450, 450, 450, 371, 206, 63, 612, 612, 612, 612, 612, 612, 612, 612, 612, 532, 1117, 613, 613, 613, 613, 613, 613, 1117, 1117, 613, 613, 613, 613, 613, 613, 613, 613, 613, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 616, 613, 613, 613, 613, 613, 613, 614, 614, 614, 614, 614, 614, 614, 614, 614, 63, 617, 615, 615, 615, 615, 615, 615, 63, 618, 616, 620, 622, 621, 624, 63, 63, 1117, 63, 1117, 63, 63, 628, 623, 63, 1117, 63, 617, 615, 615, 615, 615, 615, 615, 63, 618, 63, 620, 622, 621, 624, 63, 63, 625, 63, 626, 63, 63, 628, 623, 63, 63, 63, 633, 63, 63, 629, 632, 630, 634, 635, 63, 63, 1117, 638, 639, 63, 1117, 637, 625, 63, 626, 636, 63, 63, 63, 63, 63, 63, 633, 63, 63, 629, 632, 630, 634, 635, 63, 63, 640, 638, 639, 63, 641, 637, 644, 63, 642, 636, 63, 63, 63, 63, 1117, 63, 63, 643, 63, 63, 650, 649, 63, 63, 651, 63, 640, 645, 646, 647, 641, 648, 644, 652, 642, 653, 63, 654, 63, 63, 63, 63, 63, 643, 63, 63, 63, 649, 63, 63, 651, 63, 656, 63, 63, 657, 655, 63, 63, 652, 659, 653, 63, 654, 63, 63, 63, 63, 667, 663, 1117, 660, 63, 658, 664, 661, 63, 63, 656, 63, 63, 657, 655, 63, 63, 63, 659, 63, 63, 662, 665, 669, 63, 63, 667, 668, 63, 660, 666, 658, 664, 661, 63, 63, 63, 1117, 63, 63, 63, 671, 672, 63, 63, 63, 63, 662, 665, 669, 63, 670, 63, 668, 63, 673, 666, 63, 674, 63, 675, 63, 63, 63, 63, 63, 63, 671, 672, 63, 63, 676, 63, 1117, 63, 63, 63, 670, 63, 1117, 1117, 673, 1117, 63, 674, 63, 675, 695, 1117, 63, 1117, 1117, 1117, 1117, 1117, 63, 1117, 676, 63, 63, 63, 63, 63, 681, 681, 681, 681, 681, 681, 681, 681, 681, 281, 695, 523, 523, 523, 523, 523, 523, 523, 523, 523, 447, 281, 63, 682, 682, 682, 682, 682, 682, 682, 682, 682, 609, 1117, 683, 683, 683, 683, 683, 683, 1117, 1117, 683, 683, 683, 683, 683, 683, 683, 683, 683, 611, 611, 611, 611, 611, 611, 611, 611, 611, 683, 683, 683, 683, 683, 683, 684, 684, 684, 684, 684, 684, 684, 684, 684, 691, 694, 685, 685, 685, 685, 685, 685, 1117, 63, 687, 687, 687, 687, 687, 687, 687, 687, 687, 1117, 63, 1117, 1117, 1117, 1117, 1117, 691, 694, 685, 685, 685, 685, 685, 685, 206, 63, 686, 686, 686, 686, 686, 686, 686, 686, 686, 532, 63, 687, 687, 687, 687, 687, 687, 1117, 1117, 690, 690, 690, 690, 690, 690, 690, 690, 690, 681, 681, 681, 681, 681, 681, 681, 681, 681, 687, 687, 687, 687, 687, 687, 206, 704, 688, 688, 688, 688, 688, 688, 688, 688, 688, 689, 692, 690, 690, 690, 690, 690, 690, 693, 696, 63, 697, 63, 698, 699, 1117, 1117, 63, 63, 63, 1117, 700, 63, 1117, 63, 705, 1117, 692, 690, 690, 690, 690, 690, 690, 693, 696, 63, 697, 63, 698, 699, 63, 701, 63, 63, 63, 702, 700, 63, 703, 63, 705, 63, 706, 63, 707, 708, 711, 709, 1117, 710, 63, 63, 63, 63, 63, 63, 63, 701, 712, 717, 1117, 702, 63, 713, 703, 63, 63, 63, 706, 63, 707, 708, 711, 709, 715, 710, 63, 63, 63, 63, 63, 63, 714, 63, 712, 63, 716, 63, 63, 713, 718, 63, 63, 63, 63, 719, 722, 723, 720, 721, 715, 725, 724, 63, 63, 1117, 63, 728, 714, 63, 63, 63, 716, 63, 726, 727, 718, 63, 729, 63, 63, 63, 63, 63, 63, 736, 63, 730, 724, 63, 63, 63, 63, 728, 63, 63, 63, 733, 1117, 731, 726, 727, 63, 63, 729, 1117, 735, 63, 63, 63, 63, 732, 63, 730, 63, 63, 737, 63, 734, 63, 63, 63, 63, 733, 63, 731, 738, 63, 63, 63, 63, 739, 735, 741, 63, 63, 63, 732, 63, 740, 63, 63, 737, 63, 734, 63, 63, 742, 63, 762, 63, 743, 738, 63, 1117, 63, 63, 739, 1117, 741, 63, 63, 63, 63, 63, 740, 63, 63, 1117, 63, 1117, 1117, 63, 742, 1117, 762, 1117, 743, 748, 748, 748, 748, 748, 748, 748, 748, 748, 1117, 763, 63, 1117, 1117, 63, 63, 281, 1117, 747, 747, 747, 747, 747, 747, 747, 747, 747, 609, 63, 748, 748, 748, 748, 748, 748, 1117, 763, 751, 751, 751, 751, 751, 751, 751, 751, 751, 1117, 63, 1117, 1117, 1117, 1117, 1117, 1117, 63, 748, 748, 748, 748, 748, 748, 281, 1117, 749, 749, 749, 749, 749, 749, 749, 749, 749, 750, 63, 751, 751, 751, 751, 751, 751, 206, 63, 450, 450, 450, 450, 450, 450, 450, 450, 450, 532, 768, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 751, 751, 751, 751, 751, 751, 206, 63, 752, 752, 752, 752, 752, 752, 752, 752, 752, 689, 768, 753, 753, 753, 753, 753, 753, 1117, 770, 753, 753, 753, 753, 753, 753, 753, 753, 753, 1117, 1117, 1117, 1117, 1117, 1117, 756, 1117, 63, 753, 753, 753, 753, 753, 753, 754, 754, 754, 754, 754, 754, 754, 754, 754, 63, 1117, 755, 755, 755, 755, 755, 755, 756, 63, 63, 758, 759, 757, 63, 760, 63, 63, 63, 766, 764, 765, 761, 63, 63, 1117, 63, 767, 755, 755, 755, 755, 755, 755, 63, 63, 63, 758, 759, 757, 63, 760, 63, 63, 63, 766, 764, 765, 761, 63, 63, 771, 769, 767, 63, 772, 773, 774, 775, 776, 63, 63, 63, 777, 1117, 63, 778, 63, 63, 783, 779, 63, 1117, 63, 63, 63, 780, 771, 769, 781, 63, 772, 773, 774, 775, 776, 63, 63, 782, 777, 63, 63, 778, 63, 63, 63, 779, 63, 63, 63, 63, 63, 784, 63, 63, 786, 63, 785, 787, 788, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 1117, 63, 789, 1117, 63, 63, 63, 1117, 784, 63, 63, 786, 63, 785, 787, 788, 63, 63, 63, 63, 63, 63, 790, 63, 63, 63, 791, 792, 789, 793, 794, 63, 63, 796, 63, 63, 795, 63, 63, 63, 63, 811, 812, 63, 63, 63, 63, 63, 790, 63, 1117, 63, 791, 792, 1117, 793, 794, 1117, 1117, 796, 63, 63, 795, 63, 63, 63, 63, 811, 812, 63, 1117, 63, 63, 63, 817, 63, 281, 63, 523, 523, 523, 523, 523, 523, 523, 523, 523, 609, 281, 1117, 801, 801, 801, 801, 801, 801, 801, 801, 801, 750, 817, 802, 802, 802, 802, 802, 802, 1117, 1117, 802, 802, 802, 802, 802, 802, 802, 802, 802, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 819, 1117, 802, 802, 802, 802, 802, 802, 803, 803, 803, 803, 803, 803, 803, 803, 803, 813, 63, 804, 804, 804, 804, 804, 804, 1117, 819, 806, 806, 806, 806, 806, 806, 806, 806, 806, 1117, 825, 1117, 1117, 1117, 1117, 1117, 813, 63, 804, 804, 804, 804, 804, 804, 206, 1117, 805, 805, 805, 805, 805, 805, 805, 805, 805, 689, 63, 806, 806, 806, 806, 806, 806, 1117, 63, 809, 809, 809, 809, 809, 809, 809, 809, 809, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 63, 806, 806, 806, 806, 806, 806, 206, 63, 807, 807, 807, 807, 807, 807, 807, 807, 807, 808, 810, 809, 809, 809, 809, 809, 809, 814, 815, 63, 1117, 1117, 822, 820, 63, 63, 63, 1117, 63, 823, 816, 818, 824, 63, 1117, 63, 810, 809, 809, 809, 809, 809, 809, 814, 815, 63, 63, 63, 822, 820, 63, 63, 63, 821, 63, 823, 816, 818, 824, 63, 826, 63, 63, 827, 63, 828, 829, 63, 63, 63, 63, 63, 63, 63, 63, 1117, 1117, 1117, 833, 821, 836, 63, 830, 63, 831, 832, 826, 837, 63, 827, 63, 828, 829, 63, 63, 63, 63, 63, 63, 834, 63, 63, 63, 835, 839, 63, 836, 63, 830, 63, 831, 832, 63, 838, 63, 63, 63, 63, 63, 852, 63, 63, 1117, 63, 63, 834, 1117, 63, 63, 835, 839, 63, 1117, 1117, 859, 1117, 1117, 1117, 63, 838, 63, 63, 63, 63, 63, 852, 63, 63, 281, 63, 843, 843, 843, 843, 843, 843, 843, 843, 843, 750, 859, 844, 844, 844, 844, 844, 844, 1117, 63, 844, 844, 844, 844, 844, 844, 844, 844, 844, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 844, 844, 844, 844, 844, 844, 281, 63, 845, 845, 845, 845, 845, 845, 845, 845, 845, 846, 858, 847, 847, 847, 847, 847, 847, 1117, 63, 847, 847, 847, 847, 847, 847, 847, 847, 847, 1117, 1117, 63, 1117, 1117, 1117, 1117, 1117, 858, 847, 847, 847, 847, 847, 847, 206, 63, 450, 450, 450, 450, 450, 450, 450, 450, 450, 689, 206, 63, 848, 848, 848, 848, 848, 848, 848, 848, 848, 808, 1117, 849, 849, 849, 849, 849, 849, 1117, 1117, 849, 849, 849, 849, 849, 849, 849, 849, 849, 1117, 1117, 1117, 1117, 1117, 1117, 63, 1117, 853, 849, 849, 849, 849, 849, 849, 850, 850, 850, 850, 850, 850, 850, 850, 850, 854, 1117, 851, 851, 851, 851, 851, 851, 63, 855, 853, 857, 861, 63, 862, 63, 863, 856, 63, 63, 860, 63, 864, 63, 63, 63, 854, 63, 851, 851, 851, 851, 851, 851, 63, 855, 63, 857, 861, 63, 862, 63, 863, 856, 63, 63, 860, 63, 864, 63, 63, 63, 865, 63, 866, 867, 868, 869, 871, 870, 63, 63, 63, 872, 1117, 63, 873, 63, 874, 63, 888, 63, 63, 63, 63, 63, 63, 63, 865, 63, 866, 867, 1117, 869, 871, 870, 1117, 63, 1117, 872, 63, 63, 873, 63, 874, 63, 888, 63, 63, 63, 63, 63, 63, 63, 281, 63, 523, 523, 523, 523, 523, 523, 523, 523, 523, 750, 63, 281, 1117, 879, 879, 879, 879, 879, 879, 879, 879, 879, 846, 63, 880, 880, 880, 880, 880, 880, 1117, 1117, 880, 880, 880, 880, 880, 880, 880, 880, 880, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 63, 880, 880, 880, 880, 880, 880, 881, 881, 881, 881, 881, 881, 881, 881, 881, 894, 890, 882, 882, 882, 882, 882, 882, 1117, 63, 884, 884, 884, 884, 884, 884, 884, 884, 884, 1117, 63, 1117, 1117, 1117, 1117, 1117, 894, 890, 882, 882, 882, 882, 882, 882, 206, 63, 883, 883, 883, 883, 883, 883, 883, 883, 883, 808, 63, 884, 884, 884, 884, 884, 884, 1117, 63, 887, 887, 887, 887, 887, 887, 887, 887, 887, 1117, 889, 895, 1117, 1117, 1117, 1117, 1117, 63, 884, 884, 884, 884, 884, 884, 206, 63, 885, 885, 885, 885, 885, 885, 885, 885, 885, 886, 889, 887, 887, 887, 887, 887, 887, 63, 891, 63, 892, 63, 63, 897, 898, 900, 896, 63, 899, 901, 63, 63, 902, 63, 921, 63, 63, 887, 887, 887, 887, 887, 887, 63, 891, 63, 892, 63, 63, 897, 898, 900, 896, 63, 899, 901, 63, 63, 902, 63, 903, 63, 63, 904, 905, 906, 63, 920, 63, 63, 63, 63, 926, 63, 63, 933, 63, 922, 63, 936, 63, 63, 1117, 63, 1117, 1117, 903, 1117, 1117, 904, 905, 906, 63, 920, 63, 1117, 63, 63, 926, 63, 63, 933, 63, 922, 63, 936, 63, 63, 281, 63, 911, 911, 911, 911, 911, 911, 911, 911, 911, 846, 63, 912, 912, 912, 912, 912, 912, 1117, 63, 912, 912, 912, 912, 912, 912, 912, 912, 912, 1117, 929, 1117, 1117, 1117, 1117, 1117, 1117, 63, 912, 912, 912, 912, 912, 912, 281, 63, 913, 913, 913, 913, 913, 913, 913, 913, 913, 914, 63, 915, 915, 915, 915, 915, 915, 1117, 935, 915, 915, 915, 915, 915, 915, 915, 915, 915, 1117, 1117, 63, 1117, 1117, 1117, 1117, 1117, 63, 915, 915, 915, 915, 915, 915, 206, 935, 450, 450, 450, 450, 450, 450, 450, 450, 450, 808, 206, 63, 916, 916, 916, 916, 916, 916, 916, 916, 916, 886, 1117, 917, 917, 917, 917, 917, 917, 1117, 1117, 917, 917, 917, 917, 917, 917, 917, 917, 917, 1117, 1117, 1117, 1117, 1117, 1117, 954, 63, 923, 917, 917, 917, 917, 917, 917, 918, 918, 918, 918, 918, 918, 918, 918, 918, 63, 924, 919, 919, 919, 919, 919, 919, 1117, 63, 923, 1117, 1117, 1117, 1117, 930, 63, 925, 927, 937, 955, 931, 932, 934, 956, 63, 63, 924, 919, 919, 919, 919, 919, 919, 928, 63, 63, 63, 63, 63, 63, 930, 63, 925, 927, 937, 955, 931, 932, 934, 956, 63, 1117, 1117, 63, 1117, 1117, 1117, 1117, 1117, 928, 63, 63, 63, 63, 63, 63, 281, 1117, 523, 523, 523, 523, 523, 523, 523, 523, 523, 846, 281, 63, 943, 943, 943, 943, 943, 943, 943, 943, 943, 914, 987, 944, 944, 944, 944, 944, 944, 1117, 1117, 944, 944, 944, 944, 944, 944, 944, 944, 944, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 987, 944, 944, 944, 944, 944, 944, 945, 945, 945, 945, 945, 945, 945, 945, 945, 958, 969, 946, 946, 946, 946, 946, 946, 1117, 63, 948, 948, 948, 948, 948, 948, 948, 948, 948, 1117, 63, 1117, 1117, 1117, 1117, 1117, 958, 969, 946, 946, 946, 946, 946, 946, 206, 63, 947, 947, 947, 947, 947, 947, 947, 947, 947, 886, 63, 948, 948, 948, 948, 948, 948, 1117, 1117, 951, 951, 951, 951, 951, 951, 951, 951, 951, 1117, 953, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 948, 948, 948, 948, 948, 948, 206, 63, 949, 949, 949, 949, 949, 949, 949, 949, 949, 950, 953, 951, 951, 951, 951, 951, 951, 952, 957, 959, 63, 964, 1117, 63, 63, 63, 960, 961, 962, 63, 963, 965, 988, 982, 63, 966, 1117, 951, 951, 951, 951, 951, 951, 952, 957, 959, 63, 964, 63, 63, 63, 63, 968, 63, 967, 63, 63, 965, 988, 982, 63, 966, 63, 1117, 63, 976, 976, 976, 976, 976, 976, 976, 976, 976, 63, 1117, 1117, 63, 968, 63, 967, 1117, 63, 1117, 1117, 63, 1117, 1117, 63, 1117, 63, 281, 1117, 975, 975, 975, 975, 975, 975, 975, 975, 975, 914, 63, 976, 976, 976, 976, 976, 976, 1117, 63, 978, 978, 978, 978, 978, 978, 978, 978, 978, 1117, 1117, 1117, 1117, 993, 994, 1117, 1117, 63, 976, 976, 976, 976, 976, 976, 281, 1117, 977, 977, 977, 977, 977, 977, 977, 977, 977, 989, 63, 978, 978, 978, 978, 978, 978, 206, 63, 450, 450, 450, 450, 450, 450, 450, 450, 450, 886, 63, 1117, 1117, 1117, 1117, 1117, 989, 63, 978, 978, 978, 978, 978, 978, 206, 63, 979, 979, 979, 979, 979, 979, 979, 979, 979, 950, 63, 980, 980, 980, 980, 980, 980, 1117, 990, 980, 980, 980, 980, 980, 980, 980, 980, 980, 983, 1117, 991, 984, 63, 992, 63, 1117, 996, 980, 980, 980, 980, 980, 980, 985, 990, 995, 999, 63, 997, 63, 986, 63, 63, 998, 983, 63, 1014, 984, 63, 63, 63, 63, 996, 1117, 63, 1117, 1117, 1117, 1117, 985, 1117, 995, 999, 63, 997, 63, 986, 63, 63, 998, 1117, 63, 1014, 1117, 1117, 63, 1015, 63, 1019, 281, 63, 523, 523, 523, 523, 523, 523, 523, 523, 523, 914, 281, 1117, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1015, 63, 1005, 1005, 1005, 1005, 1005, 1005, 1117, 63, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 63, 1005, 1005, 1005, 1005, 1005, 1005, 206, 63, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 950, 1010, 1007, 1007, 1007, 1007, 1007, 1007, 1117, 1009, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 63, 1011, 1016, 63, 63, 1021, 1017, 63, 1010, 1007, 1007, 1007, 1007, 1007, 1007, 1018, 1009, 1012, 1020, 1117, 1023, 63, 1022, 1013, 63, 63, 63, 1011, 1016, 63, 63, 1032, 1017, 63, 63, 63, 63, 1024, 63, 1037, 63, 63, 63, 1012, 1034, 63, 1023, 63, 1022, 1013, 63, 63, 63, 63, 1117, 63, 1117, 1032, 1117, 1117, 63, 63, 63, 1024, 63, 1037, 63, 63, 63, 1117, 1034, 63, 1117, 1117, 1033, 1117, 1117, 1117, 63, 63, 281, 63, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 63, 63, 1030, 1030, 1030, 1030, 1030, 1030, 1117, 1033, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1117, 1035, 1117, 1039, 63, 63, 63, 63, 63, 1030, 1030, 1030, 1030, 1030, 1030, 206, 1117, 450, 450, 450, 450, 450, 450, 450, 450, 450, 950, 1035, 1036, 1039, 63, 63, 63, 63, 1038, 1038, 63, 1038, 1038, 1038, 1038, 1038, 1038, 1041, 1117, 1038, 1117, 1047, 1048, 1117, 1117, 1117, 1117, 63, 1036, 1038, 1038, 1117, 63, 63, 63, 1117, 63, 1066, 1046, 1051, 1052, 1049, 281, 1041, 523, 523, 523, 523, 523, 523, 523, 523, 523, 63, 63, 63, 63, 63, 63, 1061, 63, 1054, 1055, 1066, 1046, 1051, 1052, 1049, 1050, 1050, 1067, 1050, 1050, 1050, 1050, 1050, 1050, 63, 63, 1050, 63, 63, 63, 63, 1117, 1061, 1060, 1054, 1055, 1050, 1050, 63, 1062, 1063, 1064, 1065, 1067, 63, 1117, 63, 1078, 1117, 1071, 63, 63, 1068, 1069, 1070, 1076, 63, 1075, 63, 1060, 1079, 63, 1080, 1081, 63, 1062, 1063, 1064, 1065, 63, 63, 1077, 63, 1078, 63, 1071, 1082, 63, 1068, 1069, 1070, 1076, 63, 1075, 63, 1083, 1079, 63, 1080, 1081, 1084, 63, 63, 63, 63, 63, 63, 1077, 1089, 1092, 63, 1090, 1082, 63, 63, 63, 1091, 63, 1093, 1094, 63, 1083, 63, 1100, 63, 1117, 1084, 63, 63, 63, 63, 1095, 63, 63, 1089, 1092, 1101, 1090, 1102, 63, 63, 63, 1091, 63, 1093, 1094, 63, 1099, 63, 1100, 63, 63, 63, 1107, 63, 63, 63, 1095, 63, 63, 63, 1117, 1101, 1117, 1102, 63, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1099, 1117, 1117, 1117, 63, 63, 1107, 63, 63, 63, 1117, 63, 1117, 63, 43, 43, 43, 43, 45, 45, 45, 45, 49, 49, 49, 49, 51, 1117, 51, 51, 52, 52, 52, 52, 125, 1117, 125, 125, 129, 129, 201, 201, 202, 202, 278, 278, 279, 279, 280, 280, 359, 359, 360, 360, 440, 440, 441, 441, 442, 442, 468, 1117, 468, 468, 518, 518, 519, 519, 520, 520, 603, 603, 604, 604, 677, 677, 678, 678, 679, 679, 744, 744, 745, 745, 746, 746, 603, 603, 798, 798, 799, 799, 840, 840, 841, 841, 842, 842, 875, 875, 876, 876, 877, 877, 745, 745, 908, 908, 909, 909, 938, 938, 939, 939, 940, 940, 970, 970, 971, 971, 973, 973, 841, 841, 1001, 1001, 1002, 1002, 1025, 1025, 1026, 1026, 1027, 1027, 1038, 1117, 1038, 1038, 1040, 1117, 1040, 1040, 1042, 1042, 1043, 1043, 1050, 1117, 1050, 1050, 1053, 1117, 1053, 1053, 908, 908, 1057, 1057, 1058, 1058, 1072, 1072, 1073, 1073, 1085, 1085, 1086, 1086, 1087, 1087, 971, 971, 1097, 1097, 1103, 1103, 1104, 1104, 1105, 1105, 1109, 1109, 1112, 1112, 1113, 1113, 1115, 1115, 1116, 1116, 7, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117 } ; static yyconst flex_int16_t yy_chk[6333] = { 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 10, 10, 11, 11, 15, 17, 29, 1206, 15, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 24, 16, 16, 16, 16, 16, 16, 27, 16, 63, 39, 24, 17, 29, 24, 27, 34, 39, 34, 46, 46, 34, 30, 24, 16, 1202, 24, 16, 16, 16, 16, 16, 16, 27, 16, 63, 39, 24, 30, 1200, 24, 27, 34, 39, 34, 47, 47, 34, 30, 24, 16, 20, 20, 1196, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 30, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 21, 21, 65, 21, 48, 48, 41, 66, 1190, 21, 1182, 21, 41, 67, 1181, 1176, 68, 1172, 21, 1171, 25, 1167, 1163, 1125, 1116, 42, 21, 21, 65, 21, 1115, 25, 41, 66, 25, 21, 25, 21, 41, 67, 25, 42, 68, 31, 21, 22, 25, 22, 22, 31, 22, 42, 32, 28, 72, 31, 22, 25, 22, 22, 25, 28, 25, 72, 1113, 22, 25, 42, 28, 31, 1112, 22, 32, 22, 22, 31, 22, 1111, 32, 28, 72, 31, 22, 1110, 22, 22, 1109, 28, 69, 72, 70, 22, 23, 69, 28, 23, 23, 73, 32, 76, 23, 75, 69, 23, 77, 23, 23, 70, 75, 23, 71, 71, 23, 1108, 69, 1105, 70, 1104, 23, 69, 1098, 23, 23, 73, 1097, 76, 23, 75, 69, 23, 77, 23, 23, 70, 75, 23, 71, 71, 23, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 1096, 26, 26, 26, 26, 26, 26, 33, 26, 84, 1087, 33, 26, 1086, 1085, 26, 1074, 33, 1073, 94, 94, 26, 33, 33, 1072, 35, 35, 26, 26, 26, 26, 26, 26, 33, 26, 84, 35, 33, 26, 35, 36, 26, 35, 33, 36, 94, 94, 26, 33, 33, 80, 35, 35, 97, 36, 40, 1058, 1057, 80, 40, 36, 1056, 35, 1044, 1043, 35, 36, 1042, 35, 79, 36, 79, 38, 38, 78, 40, 80, 1027, 1026, 97, 36, 40, 38, 74, 80, 40, 36, 37, 78, 37, 38, 74, 37, 37, 91, 79, 100, 79, 91, 38, 78, 40, 38, 74, 37, 37, 1025, 1007, 38, 74, 1003, 1002, 1001, 37, 78, 37, 38, 74, 37, 37, 91, 1000, 100, 976, 91, 38, 101, 973, 38, 74, 37, 37, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 107, 56, 56, 56, 56, 56, 56, 82, 56, 58, 58, 58, 58, 58, 58, 58, 58, 58, 101, 82, 971, 970, 948, 942, 941, 940, 107, 56, 56, 56, 56, 56, 56, 82, 56, 61, 61, 61, 61, 61, 61, 61, 61, 61, 101, 82, 61, 61, 61, 61, 61, 61, 128, 128, 128, 128, 128, 128, 128, 128, 128, 133, 939, 133, 133, 133, 133, 133, 133, 133, 133, 133, 61, 61, 61, 61, 61, 61, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 85, 64, 64, 64, 64, 64, 64, 81, 64, 83, 938, 912, 909, 81, 83, 908, 907, 85, 884, 86, 878, 64, 87, 114, 88, 877, 85, 64, 64, 64, 64, 64, 64, 81, 64, 83, 86, 89, 87, 81, 83, 90, 93, 85, 88, 86, 90, 64, 87, 114, 88, 92, 96, 115, 96, 876, 93, 89, 875, 92, 90, 90, 86, 89, 87, 859, 92, 90, 93, 95, 88, 98, 90, 99, 99, 844, 98, 92, 96, 115, 96, 95, 93, 89, 95, 92, 90, 90, 102, 104, 103, 102, 92, 105, 106, 95, 103, 98, 105, 99, 99, 106, 98, 106, 106, 104, 108, 95, 109, 108, 95, 118, 106, 110, 102, 104, 103, 102, 111, 105, 106, 113, 103, 111, 105, 112, 109, 106, 116, 106, 106, 104, 108, 110, 109, 108, 842, 118, 106, 110, 113, 119, 112, 121, 111, 112, 117, 113, 120, 111, 121, 112, 109, 119, 117, 122, 135, 120, 122, 110, 136, 123, 116, 123, 841, 840, 113, 119, 112, 121, 806, 112, 117, 150, 120, 800, 121, 799, 798, 119, 117, 122, 135, 120, 122, 140, 136, 123, 116, 123, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 143, 126, 126, 126, 126, 126, 126, 150, 126, 797, 748, 140, 746, 745, 744, 687, 680, 679, 146, 146, 678, 677, 607, 604, 603, 602, 143, 126, 126, 126, 126, 126, 126, 150, 126, 130, 130, 130, 130, 130, 130, 130, 130, 130, 146, 146, 130, 130, 130, 130, 130, 130, 530, 164, 200, 200, 200, 200, 200, 200, 200, 200, 200, 521, 156, 520, 519, 518, 445, 442, 441, 156, 130, 130, 130, 130, 130, 130, 132, 164, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 156, 132, 132, 132, 132, 132, 132, 156, 205, 440, 205, 205, 205, 205, 205, 205, 205, 205, 205, 369, 361, 360, 359, 358, 290, 280, 279, 132, 132, 132, 132, 132, 132, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 141, 134, 134, 134, 134, 134, 134, 137, 138, 139, 137, 142, 278, 141, 138, 139, 144, 147, 144, 147, 148, 142, 145, 277, 148, 245, 141, 134, 134, 134, 134, 134, 134, 137, 138, 139, 137, 142, 145, 141, 138, 139, 144, 147, 144, 147, 148, 142, 145, 149, 148, 151, 152, 153, 157, 159, 154, 152, 155, 158, 155, 158, 203, 202, 145, 149, 201, 129, 157, 167, 153, 151, 154, 159, 160, 149, 127, 151, 152, 153, 157, 159, 154, 152, 155, 158, 155, 158, 161, 162, 168, 149, 160, 163, 157, 165, 153, 151, 154, 159, 160, 162, 166, 167, 170, 170, 161, 172, 168, 163, 169, 165, 166, 173, 161, 162, 168, 176, 160, 163, 57, 165, 171, 171, 169, 173, 176, 162, 166, 167, 170, 170, 161, 175, 168, 163, 169, 165, 166, 173, 174, 172, 178, 176, 181, 177, 180, 53, 175, 174, 169, 173, 176, 174, 178, 179, 198, 171, 174, 175, 177, 179, 180, 182, 181, 52, 174, 172, 178, 182, 181, 177, 180, 184, 175, 174, 183, 183, 187, 174, 178, 179, 198, 171, 174, 184, 177, 179, 180, 182, 181, 185, 189, 186, 185, 182, 186, 188, 188, 184, 190, 49, 183, 183, 189, 190, 44, 190, 19, 191, 194, 184, 187, 192, 18, 211, 193, 185, 189, 186, 185, 213, 186, 188, 188, 195, 190, 191, 194, 192, 189, 190, 193, 190, 197, 191, 194, 195, 187, 192, 196, 211, 193, 223, 197, 14, 12, 213, 7, 4, 3, 195, 0, 191, 194, 192, 226, 196, 193, 0, 197, 0, 0, 195, 0, 0, 196, 0, 226, 223, 197, 206, 206, 206, 206, 206, 206, 206, 206, 206, 0, 216, 226, 196, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 226, 199, 199, 199, 199, 199, 199, 209, 199, 209, 209, 209, 209, 209, 209, 209, 209, 209, 0, 0, 0, 216, 0, 0, 0, 0, 0, 199, 199, 199, 199, 199, 199, 214, 199, 204, 214, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 216, 204, 204, 204, 204, 204, 204, 0, 228, 0, 0, 0, 214, 0, 0, 214, 0, 0, 0, 220, 0, 0, 0, 0, 0, 0, 220, 204, 204, 204, 204, 204, 204, 207, 228, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 220, 207, 207, 207, 207, 207, 207, 220, 212, 0, 0, 0, 0, 0, 0, 0, 0, 237, 0, 0, 0, 0, 0, 0, 237, 217, 212, 207, 207, 207, 207, 207, 207, 208, 208, 208, 208, 208, 208, 208, 208, 208, 212, 237, 208, 208, 208, 208, 208, 208, 237, 0, 212, 0, 0, 0, 0, 0, 0, 217, 0, 0, 0, 222, 0, 0, 0, 215, 212, 215, 208, 208, 208, 208, 208, 208, 210, 210, 210, 210, 210, 210, 210, 210, 210, 217, 218, 210, 210, 210, 210, 210, 210, 215, 219, 215, 219, 222, 224, 221, 224, 225, 218, 225, 227, 229, 231, 233, 229, 233, 234, 0, 218, 210, 210, 210, 210, 210, 210, 221, 219, 230, 219, 222, 224, 221, 224, 225, 218, 225, 232, 229, 235, 233, 229, 233, 238, 230, 227, 238, 231, 236, 236, 240, 234, 221, 232, 230, 235, 239, 239, 244, 0, 0, 0, 0, 232, 0, 235, 0, 242, 0, 238, 230, 227, 238, 231, 236, 236, 241, 234, 243, 232, 242, 235, 239, 239, 240, 241, 241, 241, 246, 249, 248, 243, 244, 242, 241, 247, 248, 247, 249, 0, 0, 251, 241, 246, 243, 246, 242, 251, 253, 250, 240, 241, 241, 241, 246, 249, 248, 243, 244, 255, 241, 247, 248, 247, 249, 250, 252, 251, 0, 246, 257, 246, 252, 251, 253, 250, 255, 254, 258, 256, 0, 254, 258, 259, 259, 255, 256, 0, 257, 261, 260, 250, 252, 254, 261, 262, 257, 263, 252, 268, 268, 265, 255, 254, 258, 256, 260, 254, 258, 259, 259, 262, 256, 263, 257, 261, 260, 265, 264, 254, 261, 262, 266, 263, 267, 268, 268, 265, 271, 266, 270, 272, 260, 264, 275, 264, 269, 262, 0, 263, 267, 273, 0, 265, 264, 269, 274, 293, 266, 293, 267, 272, 274, 295, 271, 266, 305, 272, 273, 264, 292, 264, 269, 305, 270, 292, 267, 273, 275, 0, 0, 269, 274, 293, 0, 293, 0, 272, 274, 295, 0, 0, 305, 0, 273, 0, 292, 0, 0, 305, 270, 292, 298, 0, 275, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 281, 281, 281, 281, 281, 281, 281, 281, 281, 282, 0, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 298, 282, 282, 282, 282, 282, 282, 284, 0, 284, 284, 284, 284, 284, 284, 284, 284, 284, 0, 0, 0, 0, 0, 0, 0, 306, 298, 282, 282, 282, 282, 282, 282, 283, 283, 283, 283, 283, 283, 283, 283, 283, 291, 291, 283, 283, 283, 283, 283, 283, 285, 306, 285, 285, 285, 285, 285, 285, 285, 285, 285, 0, 299, 0, 0, 0, 0, 0, 291, 291, 283, 283, 283, 283, 283, 283, 286, 0, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 308, 286, 286, 286, 286, 286, 286, 287, 299, 287, 287, 287, 287, 287, 287, 287, 287, 287, 0, 310, 0, 0, 0, 0, 0, 0, 308, 286, 286, 286, 286, 286, 286, 288, 299, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 310, 288, 288, 288, 288, 288, 288, 289, 294, 289, 289, 289, 289, 289, 289, 289, 289, 289, 300, 300, 294, 296, 340, 311, 342, 301, 297, 288, 288, 288, 288, 288, 288, 296, 294, 297, 296, 301, 296, 303, 303, 296, 304, 307, 300, 300, 294, 296, 340, 302, 342, 301, 297, 302, 302, 307, 309, 311, 304, 296, 313, 297, 296, 301, 296, 303, 303, 296, 304, 307, 312, 323, 316, 309, 314, 302, 312, 315, 312, 302, 302, 307, 309, 311, 304, 317, 314, 316, 0, 315, 320, 324, 318, 0, 313, 0, 312, 317, 316, 309, 314, 318, 312, 315, 312, 323, 320, 326, 319, 322, 324, 317, 314, 316, 319, 315, 320, 324, 318, 321, 313, 330, 326, 317, 325, 321, 328, 318, 330, 322, 329, 323, 320, 326, 319, 322, 324, 325, 327, 331, 319, 0, 328, 333, 327, 321, 329, 330, 326, 333, 325, 321, 328, 332, 330, 322, 329, 337, 334, 331, 332, 334, 338, 325, 327, 331, 339, 339, 328, 333, 327, 335, 329, 336, 335, 333, 336, 338, 341, 332, 343, 343, 344, 344, 334, 331, 332, 334, 338, 345, 346, 337, 339, 339, 341, 347, 346, 335, 349, 336, 335, 348, 336, 338, 341, 352, 343, 343, 344, 344, 348, 347, 349, 350, 350, 345, 346, 337, 0, 355, 341, 347, 346, 351, 349, 352, 351, 348, 353, 357, 354, 352, 354, 353, 376, 376, 348, 347, 349, 350, 350, 356, 390, 375, 356, 375, 357, 379, 378, 351, 379, 352, 351, 355, 353, 357, 354, 0, 354, 353, 376, 376, 0, 0, 378, 0, 0, 356, 390, 375, 356, 375, 357, 379, 378, 373, 379, 0, 362, 355, 362, 362, 362, 362, 362, 362, 362, 362, 362, 363, 378, 363, 363, 363, 363, 363, 363, 363, 363, 363, 363, 0, 363, 363, 363, 363, 363, 363, 364, 373, 364, 364, 364, 364, 364, 364, 364, 364, 364, 367, 367, 367, 367, 367, 367, 367, 367, 367, 363, 363, 363, 363, 363, 363, 365, 373, 365, 365, 365, 365, 365, 365, 365, 365, 365, 365, 374, 365, 365, 365, 365, 365, 365, 366, 410, 366, 366, 366, 366, 366, 366, 366, 366, 366, 0, 0, 374, 0, 0, 388, 0, 0, 374, 365, 365, 365, 365, 365, 365, 368, 410, 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, 370, 374, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 388, 370, 370, 370, 370, 370, 370, 372, 0, 372, 372, 372, 372, 372, 372, 372, 372, 372, 0, 0, 0, 0, 0, 0, 0, 0, 388, 370, 370, 370, 370, 370, 370, 371, 371, 371, 371, 371, 371, 371, 371, 371, 377, 380, 371, 371, 371, 371, 371, 371, 381, 377, 382, 383, 382, 385, 391, 386, 411, 380, 386, 383, 385, 391, 0, 0, 381, 0, 377, 380, 371, 371, 371, 371, 371, 371, 381, 377, 382, 383, 382, 385, 391, 386, 411, 380, 386, 383, 385, 391, 393, 387, 381, 384, 384, 395, 384, 384, 384, 384, 384, 384, 384, 387, 384, 389, 0, 393, 389, 396, 392, 394, 395, 0, 384, 384, 393, 387, 392, 394, 397, 395, 396, 398, 398, 399, 399, 400, 397, 387, 403, 389, 401, 393, 389, 396, 392, 394, 395, 403, 401, 404, 404, 405, 392, 394, 397, 400, 396, 398, 398, 399, 399, 400, 397, 402, 403, 408, 401, 407, 405, 402, 406, 408, 415, 403, 401, 404, 404, 405, 406, 407, 409, 400, 412, 418, 413, 414, 409, 413, 414, 402, 412, 408, 418, 407, 405, 402, 406, 408, 415, 416, 421, 416, 422, 417, 406, 407, 409, 419, 412, 418, 413, 414, 409, 413, 414, 419, 412, 417, 418, 420, 422, 424, 423, 425, 426, 416, 421, 416, 422, 417, 427, 0, 420, 419, 423, 420, 428, 429, 430, 431, 429, 419, 432, 417, 428, 420, 422, 433, 423, 434, 426, 434, 0, 0, 430, 424, 427, 425, 420, 433, 423, 420, 428, 429, 430, 431, 429, 437, 432, 438, 428, 456, 435, 433, 456, 434, 437, 434, 435, 439, 430, 424, 466, 425, 469, 433, 436, 436, 458, 460, 460, 439, 0, 437, 0, 0, 0, 456, 435, 0, 456, 458, 437, 438, 435, 439, 0, 0, 466, 0, 469, 0, 436, 436, 458, 460, 460, 439, 443, 443, 443, 443, 443, 443, 443, 443, 443, 458, 444, 438, 444, 444, 444, 444, 444, 444, 444, 444, 444, 444, 446, 0, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 493, 446, 446, 446, 446, 446, 446, 448, 457, 448, 448, 448, 448, 448, 448, 448, 448, 448, 0, 0, 0, 0, 0, 0, 0, 0, 493, 446, 446, 446, 446, 446, 446, 447, 447, 447, 447, 447, 447, 447, 447, 447, 457, 471, 447, 447, 447, 447, 447, 447, 449, 471, 449, 449, 449, 449, 449, 449, 449, 449, 449, 0, 494, 0, 0, 0, 0, 0, 457, 471, 447, 447, 447, 447, 447, 447, 450, 471, 450, 450, 450, 450, 450, 450, 450, 450, 450, 451, 494, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 500, 451, 451, 451, 451, 451, 451, 452, 514, 452, 452, 452, 452, 452, 452, 452, 452, 452, 0, 0, 0, 0, 0, 0, 0, 0, 500, 451, 451, 451, 451, 451, 451, 453, 514, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 463, 453, 453, 453, 453, 453, 453, 454, 459, 454, 454, 454, 454, 454, 454, 454, 454, 454, 461, 0, 463, 465, 459, 462, 461, 464, 463, 453, 453, 453, 453, 453, 453, 455, 459, 467, 455, 464, 462, 462, 478, 465, 455, 462, 461, 467, 463, 465, 459, 462, 461, 464, 470, 467, 467, 468, 468, 0, 470, 455, 0, 467, 455, 464, 462, 462, 478, 465, 455, 462, 477, 467, 473, 473, 474, 475, 477, 472, 470, 467, 467, 468, 468, 472, 470, 472, 474, 476, 479, 0, 472, 475, 478, 0, 476, 480, 477, 0, 473, 473, 474, 475, 477, 472, 0, 0, 481, 482, 479, 472, 483, 472, 474, 476, 479, 480, 472, 475, 0, 484, 476, 480, 481, 482, 485, 486, 0, 487, 483, 0, 488, 486, 481, 482, 479, 484, 483, 490, 0, 489, 495, 480, 485, 487, 491, 484, 488, 491, 481, 482, 485, 486, 490, 487, 483, 489, 488, 486, 0, 492, 495, 484, 0, 490, 492, 489, 495, 501, 485, 487, 491, 0, 488, 491, 496, 496, 497, 497, 490, 502, 498, 489, 498, 499, 499, 492, 495, 501, 503, 502, 492, 504, 545, 501, 509, 509, 502, 504, 505, 0, 496, 496, 497, 497, 503, 502, 498, 506, 498, 499, 499, 508, 505, 501, 503, 502, 507, 504, 545, 511, 509, 509, 502, 504, 505, 506, 511, 510, 507, 510, 503, 508, 512, 506, 512, 515, 513, 508, 505, 516, 549, 516, 507, 513, 563, 511, 517, 515, 0, 517, 0, 506, 511, 510, 507, 510, 0, 508, 512, 0, 512, 515, 513, 0, 0, 516, 549, 516, 0, 513, 563, 567, 517, 515, 522, 517, 522, 522, 522, 522, 522, 522, 522, 522, 522, 523, 0, 523, 523, 523, 523, 523, 523, 523, 523, 523, 524, 567, 524, 524, 524, 524, 524, 524, 524, 524, 524, 524, 0, 524, 524, 524, 524, 524, 524, 525, 569, 525, 525, 525, 525, 525, 525, 525, 525, 525, 528, 528, 528, 528, 528, 528, 528, 528, 528, 524, 524, 524, 524, 524, 524, 526, 569, 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, 537, 526, 526, 526, 526, 526, 526, 527, 573, 527, 527, 527, 527, 527, 527, 527, 527, 527, 0, 0, 537, 0, 0, 0, 0, 0, 537, 526, 526, 526, 526, 526, 526, 529, 573, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 531, 537, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 0, 531, 531, 531, 531, 531, 531, 533, 0, 533, 533, 533, 533, 533, 533, 533, 533, 533, 0, 0, 0, 0, 0, 0, 0, 0, 534, 531, 531, 531, 531, 531, 531, 532, 532, 532, 532, 532, 532, 532, 532, 532, 534, 535, 532, 532, 532, 532, 532, 532, 535, 536, 534, 538, 540, 539, 542, 542, 536, 0, 540, 0, 538, 539, 546, 541, 546, 0, 534, 535, 532, 532, 532, 532, 532, 532, 535, 536, 541, 538, 540, 539, 542, 542, 536, 543, 540, 544, 538, 539, 546, 541, 546, 547, 543, 551, 544, 548, 547, 550, 548, 552, 553, 553, 541, 0, 556, 557, 550, 0, 555, 543, 556, 544, 554, 551, 557, 552, 555, 547, 543, 551, 544, 548, 547, 550, 548, 552, 553, 553, 554, 558, 556, 557, 550, 559, 555, 562, 556, 560, 554, 551, 557, 552, 555, 0, 560, 558, 561, 565, 561, 566, 565, 559, 562, 568, 554, 558, 564, 564, 564, 559, 564, 562, 570, 560, 571, 574, 572, 571, 575, 568, 560, 558, 561, 565, 561, 572, 565, 559, 562, 568, 577, 578, 570, 566, 579, 576, 564, 576, 570, 581, 571, 574, 572, 571, 575, 568, 583, 590, 586, 0, 582, 572, 580, 587, 584, 581, 577, 578, 570, 566, 579, 576, 564, 576, 580, 581, 582, 584, 585, 588, 592, 587, 583, 590, 591, 585, 582, 589, 580, 587, 584, 581, 586, 591, 0, 589, 588, 592, 594, 595, 580, 595, 582, 584, 585, 588, 592, 587, 593, 597, 591, 585, 596, 589, 594, 598, 601, 599, 586, 591, 593, 589, 588, 592, 594, 595, 596, 595, 600, 621, 0, 598, 599, 600, 593, 597, 0, 0, 596, 0, 594, 598, 601, 599, 620, 0, 593, 0, 0, 0, 0, 0, 596, 0, 600, 621, 620, 598, 599, 600, 605, 605, 605, 605, 605, 605, 605, 605, 605, 606, 620, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 608, 620, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 0, 608, 608, 608, 608, 608, 608, 610, 0, 610, 610, 610, 610, 610, 610, 610, 610, 610, 611, 611, 611, 611, 611, 611, 611, 611, 611, 608, 608, 608, 608, 608, 608, 609, 609, 609, 609, 609, 609, 609, 609, 609, 616, 619, 609, 609, 609, 609, 609, 609, 613, 619, 613, 613, 613, 613, 613, 613, 613, 613, 613, 0, 616, 0, 0, 0, 0, 0, 616, 619, 609, 609, 609, 609, 609, 609, 612, 619, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 616, 612, 612, 612, 612, 612, 612, 615, 0, 615, 615, 615, 615, 615, 615, 615, 615, 615, 681, 681, 681, 681, 681, 681, 681, 681, 681, 612, 612, 612, 612, 612, 612, 614, 630, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 617, 614, 614, 614, 614, 614, 614, 618, 622, 617, 623, 622, 624, 625, 0, 0, 623, 618, 624, 0, 626, 625, 0, 630, 631, 0, 617, 614, 614, 614, 614, 614, 614, 618, 622, 617, 623, 622, 624, 625, 626, 627, 623, 618, 624, 628, 626, 625, 629, 630, 631, 633, 632, 627, 633, 634, 637, 635, 0, 636, 645, 628, 634, 635, 629, 636, 626, 627, 638, 643, 0, 628, 632, 639, 629, 638, 637, 633, 632, 627, 633, 634, 637, 635, 641, 636, 645, 628, 634, 635, 629, 636, 640, 639, 638, 640, 642, 642, 632, 639, 644, 638, 637, 643, 641, 646, 648, 649, 646, 647, 641, 651, 650, 654, 655, 0, 644, 656, 640, 639, 650, 640, 642, 642, 652, 653, 644, 653, 657, 643, 641, 661, 647, 652, 646, 665, 648, 658, 650, 654, 655, 649, 644, 656, 658, 651, 650, 662, 0, 659, 652, 653, 659, 653, 657, 0, 664, 661, 647, 652, 646, 660, 648, 658, 660, 662, 666, 649, 663, 665, 658, 651, 664, 662, 666, 659, 667, 663, 659, 667, 669, 668, 664, 671, 672, 673, 671, 660, 674, 670, 660, 662, 666, 668, 663, 665, 670, 675, 664, 697, 666, 676, 667, 663, 0, 667, 669, 668, 0, 671, 672, 673, 671, 675, 674, 670, 697, 676, 0, 668, 0, 0, 670, 675, 0, 697, 683, 676, 683, 683, 683, 683, 683, 683, 683, 683, 683, 0, 698, 675, 0, 0, 697, 676, 682, 0, 682, 682, 682, 682, 682, 682, 682, 682, 682, 682, 698, 682, 682, 682, 682, 682, 682, 685, 698, 685, 685, 685, 685, 685, 685, 685, 685, 685, 0, 699, 0, 0, 0, 0, 0, 0, 698, 682, 682, 682, 682, 682, 682, 684, 0, 684, 684, 684, 684, 684, 684, 684, 684, 684, 684, 699, 684, 684, 684, 684, 684, 684, 686, 703, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 705, 0, 0, 0, 0, 0, 0, 0, 684, 684, 684, 684, 684, 684, 688, 703, 688, 688, 688, 688, 688, 688, 688, 688, 688, 688, 705, 688, 688, 688, 688, 688, 688, 690, 707, 690, 690, 690, 690, 690, 690, 690, 690, 690, 0, 0, 0, 0, 0, 0, 691, 0, 691, 688, 688, 688, 688, 688, 688, 689, 689, 689, 689, 689, 689, 689, 689, 689, 707, 0, 689, 689, 689, 689, 689, 689, 691, 692, 691, 693, 694, 692, 694, 695, 700, 695, 693, 702, 700, 701, 696, 702, 701, 0, 707, 704, 689, 689, 689, 689, 689, 689, 696, 692, 704, 693, 694, 692, 694, 695, 700, 695, 693, 702, 700, 701, 696, 702, 701, 708, 706, 704, 706, 709, 710, 711, 712, 713, 696, 714, 704, 715, 0, 715, 716, 718, 708, 722, 717, 713, 0, 709, 712, 711, 719, 708, 706, 720, 706, 709, 710, 711, 712, 713, 716, 714, 721, 715, 717, 715, 716, 718, 708, 726, 717, 713, 722, 709, 712, 711, 723, 719, 720, 725, 727, 724, 728, 729, 730, 723, 716, 724, 731, 721, 717, 725, 732, 735, 0, 726, 733, 0, 722, 740, 741, 0, 723, 719, 720, 725, 727, 724, 728, 729, 730, 723, 733, 724, 731, 721, 734, 725, 732, 735, 736, 737, 733, 738, 739, 740, 741, 743, 734, 736, 742, 742, 757, 737, 759, 758, 760, 760, 733, 738, 739, 758, 734, 764, 0, 743, 736, 737, 0, 738, 739, 0, 0, 743, 734, 736, 742, 742, 757, 737, 759, 758, 760, 760, 0, 738, 739, 758, 766, 764, 747, 743, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 749, 0, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 766, 749, 749, 749, 749, 749, 749, 751, 0, 751, 751, 751, 751, 751, 751, 751, 751, 751, 0, 0, 0, 0, 0, 0, 0, 768, 0, 749, 749, 749, 749, 749, 749, 750, 750, 750, 750, 750, 750, 750, 750, 750, 761, 761, 750, 750, 750, 750, 750, 750, 753, 768, 753, 753, 753, 753, 753, 753, 753, 753, 753, 0, 774, 0, 0, 0, 0, 0, 761, 761, 750, 750, 750, 750, 750, 750, 752, 0, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 775, 752, 752, 752, 752, 752, 752, 755, 774, 755, 755, 755, 755, 755, 755, 755, 755, 755, 0, 0, 0, 0, 0, 0, 0, 0, 775, 752, 752, 752, 752, 752, 752, 754, 774, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 756, 754, 754, 754, 754, 754, 754, 762, 763, 762, 0, 0, 771, 769, 763, 769, 756, 0, 771, 772, 765, 767, 773, 773, 0, 772, 756, 754, 754, 754, 754, 754, 754, 762, 763, 762, 765, 767, 771, 769, 763, 769, 756, 770, 771, 772, 765, 767, 773, 773, 776, 772, 770, 777, 777, 778, 779, 776, 780, 781, 782, 783, 765, 767, 778, 0, 0, 0, 789, 770, 792, 792, 784, 779, 785, 786, 776, 793, 770, 777, 777, 778, 779, 776, 780, 781, 782, 783, 784, 790, 778, 785, 786, 791, 795, 796, 792, 792, 784, 779, 785, 786, 789, 794, 790, 791, 795, 812, 814, 810, 794, 793, 0, 810, 784, 790, 0, 785, 786, 791, 795, 796, 0, 0, 819, 0, 0, 0, 789, 794, 790, 791, 795, 812, 814, 810, 794, 793, 801, 810, 801, 801, 801, 801, 801, 801, 801, 801, 801, 801, 819, 801, 801, 801, 801, 801, 801, 802, 820, 802, 802, 802, 802, 802, 802, 802, 802, 802, 0, 0, 0, 0, 0, 0, 0, 0, 0, 801, 801, 801, 801, 801, 801, 803, 820, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 818, 803, 803, 803, 803, 803, 803, 804, 824, 804, 804, 804, 804, 804, 804, 804, 804, 804, 0, 0, 818, 0, 0, 0, 0, 0, 818, 803, 803, 803, 803, 803, 803, 805, 824, 805, 805, 805, 805, 805, 805, 805, 805, 805, 805, 807, 818, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 0, 807, 807, 807, 807, 807, 807, 809, 0, 809, 809, 809, 809, 809, 809, 809, 809, 809, 0, 0, 0, 0, 0, 0, 811, 0, 811, 807, 807, 807, 807, 807, 807, 808, 808, 808, 808, 808, 808, 808, 808, 808, 813, 0, 808, 808, 808, 808, 808, 808, 811, 815, 811, 817, 822, 813, 823, 822, 825, 816, 815, 826, 821, 827, 825, 823, 825, 828, 813, 817, 808, 808, 808, 808, 808, 808, 816, 815, 821, 817, 822, 813, 823, 822, 825, 816, 815, 826, 821, 827, 825, 823, 825, 828, 829, 817, 830, 831, 832, 833, 835, 834, 816, 836, 821, 837, 0, 833, 838, 838, 839, 829, 852, 831, 855, 835, 830, 834, 839, 856, 829, 837, 830, 831, 0, 833, 835, 834, 0, 836, 0, 837, 832, 833, 838, 838, 839, 829, 852, 831, 855, 835, 830, 834, 839, 856, 843, 837, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 832, 845, 0, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 862, 845, 845, 845, 845, 845, 845, 847, 0, 847, 847, 847, 847, 847, 847, 847, 847, 847, 0, 0, 0, 0, 0, 0, 0, 0, 862, 845, 845, 845, 845, 845, 845, 846, 846, 846, 846, 846, 846, 846, 846, 846, 860, 854, 846, 846, 846, 846, 846, 846, 849, 854, 849, 849, 849, 849, 849, 849, 849, 849, 849, 0, 860, 0, 0, 0, 0, 0, 860, 854, 846, 846, 846, 846, 846, 846, 848, 854, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 860, 848, 848, 848, 848, 848, 848, 851, 867, 851, 851, 851, 851, 851, 851, 851, 851, 851, 0, 853, 861, 0, 0, 0, 0, 0, 853, 848, 848, 848, 848, 848, 848, 850, 867, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 853, 850, 850, 850, 850, 850, 850, 853, 857, 861, 858, 857, 858, 864, 865, 868, 863, 865, 866, 869, 866, 868, 870, 870, 889, 869, 864, 850, 850, 850, 850, 850, 850, 863, 857, 861, 858, 857, 858, 864, 865, 868, 863, 865, 866, 869, 866, 868, 870, 870, 871, 869, 864, 872, 873, 874, 873, 888, 889, 863, 872, 890, 894, 891, 894, 900, 871, 891, 900, 903, 903, 874, 0, 888, 0, 0, 871, 0, 0, 872, 873, 874, 873, 888, 889, 0, 872, 890, 894, 891, 894, 900, 871, 891, 900, 903, 903, 874, 879, 888, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 905, 879, 879, 879, 879, 879, 879, 880, 906, 880, 880, 880, 880, 880, 880, 880, 880, 880, 0, 896, 0, 0, 0, 0, 0, 0, 905, 879, 879, 879, 879, 879, 879, 881, 906, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 896, 881, 881, 881, 881, 881, 881, 882, 902, 882, 882, 882, 882, 882, 882, 882, 882, 882, 0, 0, 902, 0, 0, 0, 0, 0, 896, 881, 881, 881, 881, 881, 881, 883, 902, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 885, 902, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 0, 885, 885, 885, 885, 885, 885, 887, 0, 887, 887, 887, 887, 887, 887, 887, 887, 887, 0, 0, 0, 0, 0, 0, 922, 923, 892, 885, 885, 885, 885, 885, 885, 886, 886, 886, 886, 886, 886, 886, 886, 886, 892, 893, 886, 886, 886, 886, 886, 886, 0, 923, 892, 0, 0, 0, 0, 897, 922, 893, 895, 904, 924, 898, 899, 901, 925, 929, 892, 893, 886, 886, 886, 886, 886, 886, 895, 897, 895, 898, 899, 904, 901, 897, 922, 893, 895, 904, 924, 898, 899, 901, 925, 929, 0, 0, 932, 0, 0, 0, 0, 0, 895, 897, 895, 898, 899, 904, 901, 911, 0, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 913, 932, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 955, 913, 913, 913, 913, 913, 913, 915, 0, 915, 915, 915, 915, 915, 915, 915, 915, 915, 0, 0, 0, 0, 0, 0, 0, 0, 955, 913, 913, 913, 913, 913, 913, 914, 914, 914, 914, 914, 914, 914, 914, 914, 927, 937, 914, 914, 914, 914, 914, 914, 917, 927, 917, 917, 917, 917, 917, 917, 917, 917, 917, 0, 937, 0, 0, 0, 0, 0, 927, 937, 914, 914, 914, 914, 914, 914, 916, 927, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 937, 916, 916, 916, 916, 916, 916, 919, 0, 919, 919, 919, 919, 919, 919, 919, 919, 919, 0, 921, 0, 0, 0, 0, 0, 0, 0, 916, 916, 916, 916, 916, 916, 918, 921, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 921, 918, 918, 918, 918, 918, 918, 920, 926, 928, 920, 931, 0, 931, 928, 921, 930, 930, 930, 952, 930, 933, 956, 952, 926, 934, 0, 918, 918, 918, 918, 918, 918, 920, 926, 928, 920, 931, 933, 931, 928, 934, 936, 957, 935, 952, 930, 933, 956, 952, 926, 934, 935, 944, 936, 944, 944, 944, 944, 944, 944, 944, 944, 944, 933, 0, 0, 934, 936, 957, 935, 0, 930, 0, 0, 960, 0, 0, 935, 0, 936, 943, 0, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 966, 943, 943, 943, 943, 943, 943, 946, 960, 946, 946, 946, 946, 946, 946, 946, 946, 946, 0, 0, 0, 0, 962, 963, 0, 0, 966, 943, 943, 943, 943, 943, 943, 945, 0, 945, 945, 945, 945, 945, 945, 945, 945, 945, 958, 962, 945, 945, 945, 945, 945, 945, 947, 963, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 958, 0, 0, 0, 0, 0, 958, 962, 945, 945, 945, 945, 945, 945, 949, 963, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 958, 949, 949, 949, 949, 949, 949, 951, 959, 951, 951, 951, 951, 951, 951, 951, 951, 951, 953, 0, 961, 954, 953, 961, 959, 0, 965, 949, 949, 949, 949, 949, 949, 954, 959, 964, 969, 964, 967, 982, 954, 954, 965, 968, 953, 969, 987, 954, 953, 961, 959, 968, 965, 0, 967, 0, 0, 0, 0, 954, 0, 964, 969, 964, 967, 982, 954, 954, 965, 968, 0, 969, 987, 0, 0, 961, 988, 968, 992, 975, 967, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 977, 0, 977, 977, 977, 977, 977, 977, 977, 977, 977, 988, 992, 977, 977, 977, 977, 977, 977, 978, 995, 978, 978, 978, 978, 978, 978, 978, 978, 978, 0, 0, 0, 0, 0, 0, 0, 0, 992, 977, 977, 977, 977, 977, 977, 979, 995, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 984, 979, 979, 979, 979, 979, 979, 980, 983, 980, 980, 980, 980, 980, 980, 980, 980, 980, 984, 985, 989, 997, 989, 994, 990, 983, 984, 979, 979, 979, 979, 979, 979, 991, 983, 986, 993, 0, 998, 985, 996, 986, 990, 996, 984, 985, 989, 997, 989, 1009, 990, 983, 994, 986, 998, 999, 1009, 1014, 1018, 1011, 991, 986, 1011, 993, 998, 985, 996, 986, 990, 996, 1019, 999, 0, 1020, 0, 1009, 0, 0, 994, 986, 998, 999, 1009, 1014, 1018, 1011, 991, 0, 1011, 993, 0, 0, 1010, 0, 0, 0, 1019, 999, 1004, 1020, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1021, 1010, 1004, 1004, 1004, 1004, 1004, 1004, 1005, 1010, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 0, 1012, 0, 1016, 1022, 1016, 1012, 1021, 1010, 1004, 1004, 1004, 1004, 1004, 1004, 1006, 0, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1012, 1013, 1016, 1022, 1016, 1012, 1023, 1017, 1017, 1013, 1017, 1017, 1017, 1017, 1017, 1017, 1024, 0, 1017, 0, 1034, 1035, 0, 0, 0, 0, 1032, 1013, 1017, 1017, 0, 1041, 1023, 1024, 0, 1013, 1051, 1033, 1038, 1038, 1036, 1029, 1024, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1032, 1033, 1034, 1035, 1036, 1041, 1047, 1024, 1040, 1040, 1051, 1033, 1038, 1038, 1036, 1039, 1039, 1052, 1039, 1039, 1039, 1039, 1039, 1039, 1047, 1040, 1039, 1033, 1034, 1035, 1036, 0, 1047, 1046, 1040, 1040, 1039, 1039, 1046, 1048, 1049, 1050, 1050, 1052, 1048, 0, 1049, 1063, 0, 1055, 1047, 1040, 1053, 1053, 1054, 1061, 1055, 1060, 1060, 1046, 1064, 1061, 1065, 1066, 1046, 1048, 1049, 1050, 1050, 1053, 1048, 1062, 1049, 1063, 1054, 1055, 1068, 1062, 1053, 1053, 1054, 1061, 1055, 1060, 1060, 1069, 1064, 1061, 1065, 1066, 1070, 1070, 1069, 1071, 1075, 1053, 1068, 1062, 1076, 1079, 1054, 1077, 1068, 1062, 1077, 1076, 1078, 1078, 1081, 1082, 1082, 1069, 1083, 1090, 1090, 0, 1070, 1070, 1069, 1071, 1075, 1084, 1068, 1091, 1076, 1079, 1092, 1077, 1094, 1095, 1077, 1076, 1078, 1078, 1081, 1082, 1082, 1089, 1083, 1090, 1090, 1084, 1100, 1099, 1089, 1099, 1102, 1084, 1094, 1091, 1107, 0, 1092, 0, 1094, 1095, 0, 0, 0, 0, 0, 0, 0, 1089, 0, 0, 0, 1084, 1100, 1099, 1089, 1099, 1102, 0, 1094, 0, 1107, 1118, 1118, 1118, 1118, 1119, 1119, 1119, 1119, 1120, 1120, 1120, 1120, 1121, 0, 1121, 1121, 1122, 1122, 1122, 1122, 1123, 0, 1123, 1123, 1124, 1124, 1126, 1126, 1127, 1127, 1128, 1128, 1129, 1129, 1130, 1130, 1131, 1131, 1132, 1132, 1133, 1133, 1134, 1134, 1135, 1135, 1136, 0, 1136, 1136, 1137, 1137, 1138, 1138, 1139, 1139, 1140, 1140, 1141, 1141, 1142, 1142, 1143, 1143, 1144, 1144, 1145, 1145, 1146, 1146, 1147, 1147, 1148, 1148, 1149, 1149, 1150, 1150, 1151, 1151, 1152, 1152, 1153, 1153, 1154, 1154, 1155, 1155, 1156, 1156, 1157, 1157, 1158, 1158, 1159, 1159, 1160, 1160, 1161, 1161, 1162, 1162, 1164, 1164, 1165, 1165, 1166, 1166, 1168, 1168, 1169, 1169, 1170, 1170, 1173, 1173, 1174, 1174, 1175, 1175, 1177, 0, 1177, 1177, 1178, 0, 1178, 1178, 1179, 1179, 1180, 1180, 1183, 0, 1183, 1183, 1184, 0, 1184, 1184, 1185, 1185, 1186, 1186, 1187, 1187, 1188, 1188, 1189, 1189, 1191, 1191, 1192, 1192, 1193, 1193, 1194, 1194, 1195, 1195, 1197, 1197, 1198, 1198, 1199, 1199, 1201, 1201, 1203, 1203, 1204, 1204, 1205, 1205, 1207, 1207, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117 } ; /* Table of booleans, true if rule could match eol. */ static yyconst flex_int32_t yy_rule_can_match_eol[140] = { 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, }; /* The intent behind this definition is that it'll catch * any uses of REJECT which flex missed. */ #define REJECT reject_used_but_not_detected #define yymore() yymore_used_but_not_detected #define YY_MORE_ADJ 0 #define YY_RESTORE_YY_MORE_OFFSET #line 1 "SrvLexer.l" #line 5 "SrvLexer.l" #ifdef WIN32 #define strncasecmp _strnicmp #endif using namespace std; #include "SrvParser.h" #include "Portable.h" #define YYABORT yyterminate(); /* duplicate default definition from flex. This makes cppcheck check for defined YY_FATAL_ERROR() go away. */ #define YY_FATAL_ERROR(msg) LexerError(msg) #line 37 "SrvLexer.l" using namespace std; unsigned ComBeg; // line, in which comment begins unsigned LftCnt; // how many chars : on the left side of '::' char was interpreted unsigned RgtCnt; // the same as above, but on the right side of '::' char Address[16]; // address, which is analizing right now char AddrPart[16]; unsigned intpos,pos; namespace std{ yy_SrvParser_stype yylval; } #line 2263 "SrvLexer.cpp" #define INITIAL 0 #define COMMENT 1 #define ADDR 2 #ifndef YY_NO_UNISTD_H /* Special case for "unistd.h", since it is non-ANSI. We include it way * down here because we want the user's section 1 to have been scanned first. * The user has a chance to override it with an option. */ #include #endif #ifndef YY_EXTRA_TYPE #define YY_EXTRA_TYPE void * #endif #ifndef yytext_ptr static void yy_flex_strncpy (char *,yyconst char *,int ); #endif #ifdef YY_NEED_STRLEN static int yy_flex_strlen (yyconst char * ); #endif #ifndef YY_NO_INPUT #endif /* Amount of stuff to slurp up with each read. */ #ifndef YY_READ_BUF_SIZE #ifdef __ia64__ /* On IA-64, the buffer size is 16k, not 8k */ #define YY_READ_BUF_SIZE 16384 #else #define YY_READ_BUF_SIZE 8192 #endif /* __ia64__ */ #endif /* Copy whatever the last rule matched to the standard output. */ #ifndef ECHO #define ECHO LexerOutput( yytext, yyleng ) #endif /* Gets input and stuffs it into "buf". number of characters read, or YY_NULL, * is returned in "result". */ #ifndef YY_INPUT #define YY_INPUT(buf,result,max_size) \ \ if ( (result = LexerInput( (char *) buf, max_size )) < 0 ) \ YY_FATAL_ERROR( "input in flex scanner failed" ); #endif /* No semi-colon after return; correct usage is to write "yyterminate();" - * we don't want an extra ';' after the "return" because that will cause * some compilers to complain about unreachable statements. */ #ifndef yyterminate #define yyterminate() return YY_NULL #endif /* Number of entries by which start-condition stack grows. */ #ifndef YY_START_STACK_INCR #define YY_START_STACK_INCR 25 #endif /* Report a fatal error. */ #ifndef YY_FATAL_ERROR #define YY_FATAL_ERROR(msg) LexerError( msg ) #endif /* end tables serialization structures and prototypes */ /* Default declaration of generated scanner - a define so the user can * easily add parameters. */ #ifndef YY_DECL #define YY_DECL_IS_OURS 1 #define YY_DECL int yyFlexLexer::yylex() #endif /* !YY_DECL */ /* Code executed at the beginning of each rule, after yytext and yyleng * have been set up. */ #ifndef YY_USER_ACTION #define YY_USER_ACTION #endif /* Code executed at the end of each rule. */ #ifndef YY_BREAK #define YY_BREAK break; #endif #define YY_RULE_SETUP \ YY_USER_ACTION /** The main scanner function which does all the work. */ YY_DECL { register yy_state_type yy_current_state; register char *yy_cp, *yy_bp; register int yy_act; if ( !(yy_init) ) { (yy_init) = 1; #ifdef YY_USER_INIT YY_USER_INIT; #endif if ( ! (yy_start) ) (yy_start) = 1; /* first start state */ if ( ! yyin ) yyin = & std::cin; if ( ! yyout ) yyout = & std::cout; if ( ! YY_CURRENT_BUFFER ) { yyensure_buffer_stack (); YY_CURRENT_BUFFER_LVALUE = yy_create_buffer( yyin, YY_BUF_SIZE ); } yy_load_buffer_state( ); } { #line 50 "SrvLexer.l" #line 2400 "SrvLexer.cpp" while ( 1 ) /* loops until end-of-file is reached */ { yy_cp = (yy_c_buf_p); /* Support of yytext. */ *yy_cp = (yy_hold_char); /* yy_bp points to the position in yy_ch_buf of the start of * the current run. */ yy_bp = yy_cp; yy_current_state = (yy_start); yy_match: do { register YY_CHAR yy_c = yy_ec[YY_SC_TO_UI(*yy_cp)] ; if ( yy_accept[yy_current_state] ) { (yy_last_accepting_state) = yy_current_state; (yy_last_accepting_cpos) = yy_cp; } while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) { yy_current_state = (int) yy_def[yy_current_state]; if ( yy_current_state >= 1118 ) yy_c = yy_meta[(unsigned int) yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; ++yy_cp; } while ( yy_base[yy_current_state] != 6257 ); yy_find_action: yy_act = yy_accept[yy_current_state]; if ( yy_act == 0 ) { /* have to back up */ yy_cp = (yy_last_accepting_cpos); yy_current_state = (yy_last_accepting_state); yy_act = yy_accept[yy_current_state]; } YY_DO_BEFORE_ACTION; if ( yy_act != YY_END_OF_BUFFER && yy_rule_can_match_eol[yy_act] ) { yy_size_t yyl; for ( yyl = 0; yyl < yyleng; ++yyl ) if ( yytext[yyl] == '\n' ) yylineno++; ; } do_action: /* This label is used only to access EOF actions. */ switch ( yy_act ) { /* beginning of action switch */ case 0: /* must back up */ /* undo the effects of YY_DO_BEFORE_ACTION */ *yy_cp = (yy_hold_char); yy_cp = (yy_last_accepting_cpos); yy_current_state = (yy_last_accepting_state); goto yy_find_action; case 1: /* rule 1 can match eol */ YY_RULE_SETUP #line 52 "SrvLexer.l" ; // ignore end of line YY_BREAK case 2: YY_RULE_SETUP #line 53 "SrvLexer.l" ; // ignore TABs and spaces YY_BREAK case 3: YY_RULE_SETUP #line 55 "SrvLexer.l" { return SrvParser::IFACE_;} YY_BREAK case 4: YY_RULE_SETUP #line 56 "SrvLexer.l" { return SrvParser::CLASS_;} YY_BREAK case 5: YY_RULE_SETUP #line 57 "SrvLexer.l" { return SrvParser::TACLASS_; } YY_BREAK case 6: YY_RULE_SETUP #line 58 "SrvLexer.l" { return SrvParser::STATELESS_; } YY_BREAK case 7: YY_RULE_SETUP #line 59 "SrvLexer.l" { return SrvParser::RELAY_; } YY_BREAK case 8: YY_RULE_SETUP #line 60 "SrvLexer.l" { return SrvParser::IFACE_ID_; } YY_BREAK case 9: YY_RULE_SETUP #line 61 "SrvLexer.l" { return SrvParser::IFACE_ID_ORDER_; } YY_BREAK case 10: YY_RULE_SETUP #line 63 "SrvLexer.l" { return SrvParser::LOGNAME_;} YY_BREAK case 11: YY_RULE_SETUP #line 64 "SrvLexer.l" { return SrvParser::LOGLEVEL_;} YY_BREAK case 12: YY_RULE_SETUP #line 65 "SrvLexer.l" { return SrvParser::LOGMODE_; } YY_BREAK case 13: YY_RULE_SETUP #line 66 "SrvLexer.l" { return SrvParser::LOGCOLORS_; } YY_BREAK case 14: YY_RULE_SETUP #line 68 "SrvLexer.l" { return SrvParser::WORKDIR_;} YY_BREAK case 15: YY_RULE_SETUP #line 70 "SrvLexer.l" { return SrvParser::ACCEPT_ONLY_;} YY_BREAK case 16: YY_RULE_SETUP #line 71 "SrvLexer.l" { return SrvParser::REJECT_CLIENTS_;} YY_BREAK case 17: YY_RULE_SETUP #line 73 "SrvLexer.l" { return SrvParser::T1_;} YY_BREAK case 18: YY_RULE_SETUP #line 74 "SrvLexer.l" { return SrvParser::T2_;} YY_BREAK case 19: YY_RULE_SETUP #line 75 "SrvLexer.l" { return SrvParser::PREF_TIME_;} YY_BREAK case 20: YY_RULE_SETUP #line 76 "SrvLexer.l" { return SrvParser::PREF_TIME_;} YY_BREAK case 21: YY_RULE_SETUP #line 77 "SrvLexer.l" { return SrvParser::VALID_TIME_;} YY_BREAK case 22: YY_RULE_SETUP #line 79 "SrvLexer.l" { return SrvParser::DROP_UNICAST_; } YY_BREAK case 23: YY_RULE_SETUP #line 80 "SrvLexer.l" { return SrvParser::UNICAST_;} YY_BREAK case 24: YY_RULE_SETUP #line 81 "SrvLexer.l" { return SrvParser::PREFERENCE_;} YY_BREAK case 25: YY_RULE_SETUP #line 82 "SrvLexer.l" { return SrvParser::POOL_;} YY_BREAK case 26: YY_RULE_SETUP #line 83 "SrvLexer.l" { return SrvParser::SHARE_;} YY_BREAK case 27: YY_RULE_SETUP #line 84 "SrvLexer.l" { return SrvParser::RAPID_COMMIT_;} YY_BREAK case 28: YY_RULE_SETUP #line 85 "SrvLexer.l" { return SrvParser::IFACE_MAX_LEASE_; } YY_BREAK case 29: YY_RULE_SETUP #line 86 "SrvLexer.l" { return SrvParser::CLASS_MAX_LEASE_; } YY_BREAK case 30: YY_RULE_SETUP #line 87 "SrvLexer.l" { return SrvParser::CLNT_MAX_LEASE_; } YY_BREAK case 31: YY_RULE_SETUP #line 88 "SrvLexer.l" { return SrvParser::CLIENT_; } YY_BREAK case 32: YY_RULE_SETUP #line 89 "SrvLexer.l" { return SrvParser::DUID_KEYWORD_; } YY_BREAK case 33: YY_RULE_SETUP #line 90 "SrvLexer.l" { return SrvParser::REMOTE_ID_; } YY_BREAK case 34: YY_RULE_SETUP #line 91 "SrvLexer.l" { return SrvParser::LINK_LOCAL_; } YY_BREAK case 35: YY_RULE_SETUP #line 92 "SrvLexer.l" { return SrvParser::ADDRESS_;} YY_BREAK case 36: YY_RULE_SETUP #line 93 "SrvLexer.l" { return SrvParser::PREFIX_; } YY_BREAK case 37: YY_RULE_SETUP #line 94 "SrvLexer.l" { return SrvParser::GUESS_MODE_; } YY_BREAK case 38: YY_RULE_SETUP #line 96 "SrvLexer.l" { return SrvParser::OPTION_; } YY_BREAK case 39: YY_RULE_SETUP #line 97 "SrvLexer.l" { return SrvParser::DNS_SERVER_;} YY_BREAK case 40: YY_RULE_SETUP #line 98 "SrvLexer.l" { return SrvParser::DOMAIN_;} YY_BREAK case 41: YY_RULE_SETUP #line 99 "SrvLexer.l" { return SrvParser::NTP_SERVER_;} YY_BREAK case 42: YY_RULE_SETUP #line 100 "SrvLexer.l" { return SrvParser::TIME_ZONE_;} YY_BREAK case 43: YY_RULE_SETUP #line 101 "SrvLexer.l" { return SrvParser::SIP_SERVER_; } YY_BREAK case 44: YY_RULE_SETUP #line 102 "SrvLexer.l" { return SrvParser::SIP_DOMAIN_; } YY_BREAK case 45: YY_RULE_SETUP #line 103 "SrvLexer.l" { return SrvParser::NEXT_HOP_; } YY_BREAK case 46: YY_RULE_SETUP #line 104 "SrvLexer.l" { return SrvParser::SUBNET_; } YY_BREAK case 47: YY_RULE_SETUP #line 105 "SrvLexer.l" { return SrvParser::ROUTE_; } YY_BREAK case 48: YY_RULE_SETUP #line 106 "SrvLexer.l" { return SrvParser::FQDN_; } YY_BREAK case 49: YY_RULE_SETUP #line 107 "SrvLexer.l" { return SrvParser::INFINITE_; } YY_BREAK case 50: YY_RULE_SETUP #line 108 "SrvLexer.l" { return SrvParser::ACCEPT_UNKNOWN_FQDN_; } YY_BREAK case 51: YY_RULE_SETUP #line 109 "SrvLexer.l" { return SrvParser::FQDN_DDNS_ADDRESS_; } YY_BREAK case 52: YY_RULE_SETUP #line 110 "SrvLexer.l" { return SrvParser::DDNS_PROTOCOL_; } YY_BREAK case 53: YY_RULE_SETUP #line 111 "SrvLexer.l" { return SrvParser::DDNS_TIMEOUT_; } YY_BREAK case 54: YY_RULE_SETUP #line 112 "SrvLexer.l" { return SrvParser::NIS_SERVER_; } YY_BREAK case 55: YY_RULE_SETUP #line 113 "SrvLexer.l" { return SrvParser::NIS_DOMAIN_; } YY_BREAK case 56: YY_RULE_SETUP #line 114 "SrvLexer.l" { return SrvParser::NISP_SERVER_; } YY_BREAK case 57: YY_RULE_SETUP #line 115 "SrvLexer.l" { return SrvParser::NISP_DOMAIN_; } YY_BREAK case 58: YY_RULE_SETUP #line 116 "SrvLexer.l" { return SrvParser::LIFETIME_; } YY_BREAK case 59: YY_RULE_SETUP #line 117 "SrvLexer.l" { return SrvParser::CACHE_SIZE_; } YY_BREAK case 60: YY_RULE_SETUP #line 118 "SrvLexer.l" { return SrvParser::PDCLASS_; } YY_BREAK case 61: YY_RULE_SETUP #line 119 "SrvLexer.l" { return SrvParser::PD_LENGTH_; } YY_BREAK case 62: YY_RULE_SETUP #line 120 "SrvLexer.l" { return SrvParser::PD_POOL_;} YY_BREAK case 63: YY_RULE_SETUP #line 121 "SrvLexer.l" { return SrvParser::VENDOR_SPEC_; } YY_BREAK case 64: YY_RULE_SETUP #line 122 "SrvLexer.l" { return SrvParser::SCRIPT_; } YY_BREAK case 65: YY_RULE_SETUP #line 124 "SrvLexer.l" { return SrvParser::EXPERIMENTAL_; } YY_BREAK case 66: YY_RULE_SETUP #line 125 "SrvLexer.l" { return SrvParser::ADDR_PARAMS_; } YY_BREAK case 67: YY_RULE_SETUP #line 126 "SrvLexer.l" { return SrvParser::REMOTE_AUTOCONF_NEIGHBORS_; } YY_BREAK case 68: YY_RULE_SETUP #line 128 "SrvLexer.l" { return SrvParser::AFTR_; } YY_BREAK case 69: YY_RULE_SETUP #line 129 "SrvLexer.l" { return SrvParser::INACTIVE_MODE_; } YY_BREAK case 70: YY_RULE_SETUP #line 130 "SrvLexer.l" { return SrvParser::ACCEPT_LEASEQUERY_; } YY_BREAK case 71: YY_RULE_SETUP #line 131 "SrvLexer.l" { return SrvParser::BULKLQ_ACCEPT_; } YY_BREAK case 72: YY_RULE_SETUP #line 132 "SrvLexer.l" { return SrvParser::BULKLQ_TCPPORT_; } YY_BREAK case 73: YY_RULE_SETUP #line 133 "SrvLexer.l" { return SrvParser::BULKLQ_MAX_CONNS_; } YY_BREAK case 74: YY_RULE_SETUP #line 134 "SrvLexer.l" { return SrvParser::BULKLQ_TIMEOUT_; } YY_BREAK case 75: YY_RULE_SETUP #line 135 "SrvLexer.l" { return SrvParser::AUTH_PROTOCOL_; } YY_BREAK case 76: YY_RULE_SETUP #line 136 "SrvLexer.l" { return SrvParser::AUTH_ALGORITHM_; } YY_BREAK case 77: YY_RULE_SETUP #line 137 "SrvLexer.l" { return SrvParser::AUTH_REPLAY_;} YY_BREAK case 78: YY_RULE_SETUP #line 138 "SrvLexer.l" { return SrvParser::AUTH_REALM_; } YY_BREAK case 79: YY_RULE_SETUP #line 139 "SrvLexer.l" { return SrvParser::AUTH_METHODS_; } YY_BREAK case 80: YY_RULE_SETUP #line 140 "SrvLexer.l" { return SrvParser::AUTH_DROP_UNAUTH_; } YY_BREAK case 81: YY_RULE_SETUP #line 141 "SrvLexer.l" { return SrvParser::DIGEST_NONE_; } YY_BREAK case 82: YY_RULE_SETUP #line 142 "SrvLexer.l" { return SrvParser::DIGEST_PLAIN_; } YY_BREAK case 83: YY_RULE_SETUP #line 143 "SrvLexer.l" { return SrvParser::DIGEST_HMAC_MD5_; } YY_BREAK case 84: YY_RULE_SETUP #line 144 "SrvLexer.l" { return SrvParser::DIGEST_HMAC_MD5_; } YY_BREAK case 85: YY_RULE_SETUP #line 145 "SrvLexer.l" { return SrvParser::DIGEST_HMAC_SHA1_; } YY_BREAK case 86: YY_RULE_SETUP #line 146 "SrvLexer.l" { return SrvParser::DIGEST_HMAC_SHA1_; } YY_BREAK case 87: YY_RULE_SETUP #line 147 "SrvLexer.l" { return SrvParser::DIGEST_HMAC_SHA224_; } YY_BREAK case 88: YY_RULE_SETUP #line 148 "SrvLexer.l" { return SrvParser::DIGEST_HMAC_SHA224_; } YY_BREAK case 89: YY_RULE_SETUP #line 149 "SrvLexer.l" { return SrvParser::DIGEST_HMAC_SHA256_; } YY_BREAK case 90: YY_RULE_SETUP #line 150 "SrvLexer.l" { return SrvParser::DIGEST_HMAC_SHA256_; } YY_BREAK case 91: YY_RULE_SETUP #line 151 "SrvLexer.l" { return SrvParser::DIGEST_HMAC_SHA384_; } YY_BREAK case 92: YY_RULE_SETUP #line 152 "SrvLexer.l" { return SrvParser::DIGEST_HMAC_SHA384_; } YY_BREAK case 93: YY_RULE_SETUP #line 153 "SrvLexer.l" { return SrvParser::DIGEST_HMAC_SHA512_; } YY_BREAK case 94: YY_RULE_SETUP #line 154 "SrvLexer.l" { return SrvParser::DIGEST_HMAC_SHA512_; } YY_BREAK case 95: YY_RULE_SETUP #line 155 "SrvLexer.l" { return SrvParser::KEY_; } YY_BREAK case 96: YY_RULE_SETUP #line 156 "SrvLexer.l" { return SrvParser::SECRET_; } YY_BREAK case 97: YY_RULE_SETUP #line 157 "SrvLexer.l" { return SrvParser::ALGORITHM_; } YY_BREAK case 98: YY_RULE_SETUP #line 158 "SrvLexer.l" { return SrvParser::RECONFIGURE_ENABLED_; } YY_BREAK case 99: YY_RULE_SETUP #line 159 "SrvLexer.l" { return SrvParser::FUDGE_; } YY_BREAK case 100: YY_RULE_SETUP #line 160 "SrvLexer.l" { return SrvParser::CLIENT_CLASS_; } YY_BREAK case 101: YY_RULE_SETUP #line 161 "SrvLexer.l" { return SrvParser::MATCH_IF_; } YY_BREAK case 102: YY_RULE_SETUP #line 162 "SrvLexer.l" { return SrvParser::EQ_; } YY_BREAK case 103: YY_RULE_SETUP #line 163 "SrvLexer.l" { return SrvParser::AND_; } YY_BREAK case 104: YY_RULE_SETUP #line 164 "SrvLexer.l" { return SrvParser::OR_; } YY_BREAK case 105: YY_RULE_SETUP #line 165 "SrvLexer.l" { return SrvParser::CLIENT_VENDOR_SPEC_ENTERPRISE_NUM_; } YY_BREAK case 106: YY_RULE_SETUP #line 166 "SrvLexer.l" { return SrvParser::CLIENT_VENDOR_SPEC_DATA_; } YY_BREAK case 107: YY_RULE_SETUP #line 167 "SrvLexer.l" { return SrvParser::CLIENT_VENDOR_CLASS_EN_; } YY_BREAK case 108: YY_RULE_SETUP #line 168 "SrvLexer.l" { return SrvParser::CLIENT_VENDOR_CLASS_DATA_; } YY_BREAK case 109: YY_RULE_SETUP #line 169 "SrvLexer.l" { return SrvParser::ALLOW_; } YY_BREAK case 110: YY_RULE_SETUP #line 170 "SrvLexer.l" { return SrvParser::DENY_; } YY_BREAK case 111: YY_RULE_SETUP #line 171 "SrvLexer.l" { return SrvParser::SUBSTRING_; } YY_BREAK case 112: YY_RULE_SETUP #line 172 "SrvLexer.l" { return SrvParser::CONTAIN_; } YY_BREAK case 113: YY_RULE_SETUP #line 173 "SrvLexer.l" { return SrvParser::STRING_KEYWORD_; } YY_BREAK case 114: YY_RULE_SETUP #line 174 "SrvLexer.l" { return SrvParser::ADDRESS_LIST_; } YY_BREAK case 115: YY_RULE_SETUP #line 175 "SrvLexer.l" { return SrvParser::PERFORMANCE_MODE_; } YY_BREAK case 116: YY_RULE_SETUP #line 177 "SrvLexer.l" { yylval.ival=1; return SrvParser::INTNUMBER_;} YY_BREAK case 117: YY_RULE_SETUP #line 178 "SrvLexer.l" { yylval.ival=0; return SrvParser::INTNUMBER_;} YY_BREAK case 118: YY_RULE_SETUP #line 179 "SrvLexer.l" { yylval.ival=1; return SrvParser::INTNUMBER_;} YY_BREAK case 119: YY_RULE_SETUP #line 180 "SrvLexer.l" { yylval.ival=0; return SrvParser::INTNUMBER_;} YY_BREAK case 120: YY_RULE_SETUP #line 182 "SrvLexer.l" ; YY_BREAK case 121: YY_RULE_SETUP #line 184 "SrvLexer.l" ; YY_BREAK case 122: YY_RULE_SETUP #line 186 "SrvLexer.l" { BEGIN(COMMENT); ComBeg=yylineno; } YY_BREAK case 123: YY_RULE_SETUP #line 191 "SrvLexer.l" BEGIN(INITIAL); YY_BREAK case 124: /* rule 124 can match eol */ YY_RULE_SETUP #line 192 "SrvLexer.l" ; YY_BREAK case YY_STATE_EOF(COMMENT): #line 193 "SrvLexer.l" { Log(Crit) << "Comment not closed. (/* in line " << ComBeg << LogEnd; { YYABORT; } } YY_BREAK //IPv6 address - various forms case 125: YY_RULE_SETUP #line 200 "SrvLexer.l" { if(!inet_pton6(yytext,yylval.addrval)) { Log(Crit) << "Invalid address format: [" << yytext << "]" << LogEnd; YYABORT; } else { return SrvParser::IPV6ADDR_; } } YY_BREAK case 126: YY_RULE_SETUP #line 209 "SrvLexer.l" { if(!inet_pton6(yytext,yylval.addrval)) { Log(Crit) << "Invalid address format: [" << yytext << "]" << LogEnd; YYABORT; } else { return SrvParser::IPV6ADDR_; } } YY_BREAK case 127: YY_RULE_SETUP #line 218 "SrvLexer.l" { if(!inet_pton6(yytext,yylval.addrval)) { Log(Crit) << "Invalid address format: [" << yytext << "]" << LogEnd; YYABORT; } else { return SrvParser::IPV6ADDR_; } } YY_BREAK case 128: YY_RULE_SETUP #line 227 "SrvLexer.l" { if(!inet_pton6(yytext,yylval.addrval)) { Log(Crit) << "Invalid address format: [" << yytext << "]" << LogEnd; YYABORT; } else { return SrvParser::IPV6ADDR_; } } YY_BREAK case 129: YY_RULE_SETUP #line 236 "SrvLexer.l" { if(!inet_pton6(yytext,yylval.addrval)) { Log(Crit) << "Invalid address format: [" << yytext << "]" << LogEnd; YYABORT; } else { return SrvParser::IPV6ADDR_; } } YY_BREAK case 130: YY_RULE_SETUP #line 245 "SrvLexer.l" { if(!inet_pton6(yytext,yylval.addrval)) { Log(Crit) << "Invalid address format: [" << yytext << "]" << LogEnd; YYABORT; } else { return SrvParser::IPV6ADDR_; } } YY_BREAK case 131: YY_RULE_SETUP #line 254 "SrvLexer.l" { if(!inet_pton6(yytext,yylval.addrval)) { Log(Crit) << "Invalid address format: [" << yytext << "]" << LogEnd; YYABORT; } else { return SrvParser::IPV6ADDR_; } } YY_BREAK //STRING (interface identifier,dns server etc.) case 132: /* rule 132 can match eol */ YY_RULE_SETUP #line 266 "SrvLexer.l" { yylval.strval=new char[strlen(yytext)-1]; strncpy(yylval.strval, yytext+1, strlen(yytext)-2); yylval.strval[strlen(yytext)-2]=0; return SrvParser::STRING_; } YY_BREAK case 133: YY_RULE_SETUP #line 273 "SrvLexer.l" { int len = strlen(yytext); if ( ( (len>2) && !strncasecmp("yes",yytext,3) ) || ( (len>3) && !strncasecmp("true", yytext,4) ) ) { yylval.ival = 1; return SrvParser::INTNUMBER_; } if ( ( (len>1) && !strncasecmp("no",yytext,2) ) || ( (len>4) && !strncasecmp("false",yytext,5) ) ) { yylval.ival = 0; return SrvParser::INTNUMBER_; } yylval.strval=new char[strlen(yytext)+1]; strncpy(yylval.strval, yytext, strlen(yytext)); yylval.strval[strlen(yytext)]=0; return SrvParser::STRING_; } YY_BREAK case 134: YY_RULE_SETUP #line 294 "SrvLexer.l" { // DUID int len; char * ptr; if (strlen(yytext)%2) { yytext[1]='0'; //if odd then no-meaning zero at the beginning len = strlen(yytext)-1; ptr = yytext+1; } else { len = strlen(yytext)-2; ptr = yytext+2; } //and now there is an even number of hex digits yylval.duidval.length = len >> 1; yylval.duidval.duid = new char[len >> 1]; for (int i=0 ; i>1]<<=4; if (!isxdigit(ptr[i])) { Log(Crit) << "DUID parsing failed (" << yytext << ")." << LogEnd; YYABORT; } if (isalpha(ptr[i])) { yylval.duidval.duid[i>>1]|=toupper(ptr[i])-'A'+10; } else { yylval.duidval.duid[i>>1]|=ptr[i]-'0'; } } return SrvParser::DUID_; } YY_BREAK case 135: YY_RULE_SETUP #line 326 "SrvLexer.l" { int len = (strlen(yytext)+1)/3; char * pos = 0; yylval.duidval.length = len; yylval.duidval.duid = new char[len]; int i=0; for (pos = yytext; pos<=yytext+strlen(yytext)-2; pos+=3) { char x; if (isalpha(*pos)) x = (toupper(*pos)-'A' + 10); else x = *pos-'0'; x *= 16; if (isalpha(*(pos+1))) x += (toupper(*(pos+1))-'A' + 10); else x += *(pos+1) - '0'; yylval.duidval.duid[i] = x; i++; } return SrvParser::DUID_; } YY_BREAK case 136: YY_RULE_SETUP #line 353 "SrvLexer.l" { // HEX NUMBER yytext[strlen(yytext)-1]='\n'; if(!sscanf(yytext,"%20x",&(yylval.ival))) { Log(Crit) << "Hex value [" << yytext << "] parsing failed." << LogEnd; YYABORT; } return SrvParser::HEXNUMBER_; } YY_BREAK case 137: YY_RULE_SETUP #line 363 "SrvLexer.l" { // DECIMAL NUMBER if(!sscanf(yytext,"%20u",&(yylval.ival))) { Log(Crit) << "Decimal value [" << yytext << "] parsing failed." << LogEnd; YYABORT; } return SrvParser::INTNUMBER_; } YY_BREAK case 138: YY_RULE_SETUP #line 372 "SrvLexer.l" { return yytext[0]; } YY_BREAK case 139: YY_RULE_SETUP #line 375 "SrvLexer.l" ECHO; YY_BREAK #line 3322 "SrvLexer.cpp" case YY_STATE_EOF(INITIAL): case YY_STATE_EOF(ADDR): yyterminate(); case YY_END_OF_BUFFER: { /* Amount of text matched not including the EOB char. */ int yy_amount_of_matched_text = (int) (yy_cp - (yytext_ptr)) - 1; /* Undo the effects of YY_DO_BEFORE_ACTION. */ *yy_cp = (yy_hold_char); YY_RESTORE_YY_MORE_OFFSET if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_NEW ) { /* We're scanning a new file or input source. It's * possible that this happened because the user * just pointed yyin at a new source and called * yylex(). If so, then we have to assure * consistency between YY_CURRENT_BUFFER and our * globals. Here is the right place to do so, because * this is the first action (other than possibly a * back-up) that will match for the new input source. */ (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_n_chars; YY_CURRENT_BUFFER_LVALUE->yy_input_file = yyin; YY_CURRENT_BUFFER_LVALUE->yy_buffer_status = YY_BUFFER_NORMAL; } /* Note that here we test for yy_c_buf_p "<=" to the position * of the first EOB in the buffer, since yy_c_buf_p will * already have been incremented past the NUL character * (since all states make transitions on EOB to the * end-of-buffer state). Contrast this with the test * in input(). */ if ( (yy_c_buf_p) <= &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] ) { /* This was really a NUL. */ yy_state_type yy_next_state; (yy_c_buf_p) = (yytext_ptr) + yy_amount_of_matched_text; yy_current_state = yy_get_previous_state( ); /* Okay, we're now positioned to make the NUL * transition. We couldn't have * yy_get_previous_state() go ahead and do it * for us because it doesn't know how to deal * with the possibility of jamming (and we don't * want to build jamming into it because then it * will run more slowly). */ yy_next_state = yy_try_NUL_trans( yy_current_state ); yy_bp = (yytext_ptr) + YY_MORE_ADJ; if ( yy_next_state ) { /* Consume the NUL. */ yy_cp = ++(yy_c_buf_p); yy_current_state = yy_next_state; goto yy_match; } else { yy_cp = (yy_c_buf_p); goto yy_find_action; } } else switch ( yy_get_next_buffer( ) ) { case EOB_ACT_END_OF_FILE: { (yy_did_buffer_switch_on_eof) = 0; if ( yywrap( ) ) { /* Note: because we've taken care in * yy_get_next_buffer() to have set up * yytext, we can now set up * yy_c_buf_p so that if some total * hoser (like flex itself) wants to * call the scanner after we return the * YY_NULL, it'll still work - another * YY_NULL will get returned. */ (yy_c_buf_p) = (yytext_ptr) + YY_MORE_ADJ; yy_act = YY_STATE_EOF(YY_START); goto do_action; } else { if ( ! (yy_did_buffer_switch_on_eof) ) YY_NEW_FILE; } break; } case EOB_ACT_CONTINUE_SCAN: (yy_c_buf_p) = (yytext_ptr) + yy_amount_of_matched_text; yy_current_state = yy_get_previous_state( ); yy_cp = (yy_c_buf_p); yy_bp = (yytext_ptr) + YY_MORE_ADJ; goto yy_match; case EOB_ACT_LAST_MATCH: (yy_c_buf_p) = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)]; yy_current_state = yy_get_previous_state( ); yy_cp = (yy_c_buf_p); yy_bp = (yytext_ptr) + YY_MORE_ADJ; goto yy_find_action; } break; } default: YY_FATAL_ERROR( "fatal flex scanner internal error--no action found" ); } /* end of action switch */ } /* end of scanning one token */ } /* end of user's declarations */ } /* end of yylex */ /* The contents of this function are C++ specific, so the () macro is not used. */ yyFlexLexer::yyFlexLexer( std::istream* arg_yyin, std::ostream* arg_yyout ) { yyin = arg_yyin; yyout = arg_yyout; yy_c_buf_p = 0; yy_init = 0; yy_start = 0; yy_flex_debug = 0; yylineno = 1; // this will only get updated if %option yylineno yy_did_buffer_switch_on_eof = 0; yy_looking_for_trail_begin = 0; yy_more_flag = 0; yy_more_len = 0; yy_more_offset = yy_prev_more_offset = 0; yy_start_stack_ptr = yy_start_stack_depth = 0; yy_start_stack = NULL; yy_buffer_stack = 0; yy_buffer_stack_top = 0; yy_buffer_stack_max = 0; yy_state_buf = 0; } /* The contents of this function are C++ specific, so the () macro is not used. */ yyFlexLexer::~yyFlexLexer() { delete [] yy_state_buf; yyfree(yy_start_stack ); yy_delete_buffer( YY_CURRENT_BUFFER ); yyfree(yy_buffer_stack ); } /* The contents of this function are C++ specific, so the () macro is not used. */ void yyFlexLexer::switch_streams( std::istream* new_in, std::ostream* new_out ) { if ( new_in ) { yy_delete_buffer( YY_CURRENT_BUFFER ); yy_switch_to_buffer( yy_create_buffer( new_in, YY_BUF_SIZE ) ); } if ( new_out ) yyout = new_out; } #ifdef YY_INTERACTIVE int yyFlexLexer::LexerInput( char* buf, int /* max_size */ ) #else int yyFlexLexer::LexerInput( char* buf, int max_size ) #endif { if ( yyin->eof() || yyin->fail() ) return 0; #ifdef YY_INTERACTIVE yyin->get( buf[0] ); if ( yyin->eof() ) return 0; if ( yyin->bad() ) return -1; return 1; #else (void) yyin->read( buf, max_size ); if ( yyin->bad() ) return -1; else return yyin->gcount(); #endif } void yyFlexLexer::LexerOutput( const char* buf, int size ) { (void) yyout->write( buf, size ); } /* yy_get_next_buffer - try to read in a new buffer * * Returns a code representing an action: * EOB_ACT_LAST_MATCH - * EOB_ACT_CONTINUE_SCAN - continue scanning from current position * EOB_ACT_END_OF_FILE - end of file */ int yyFlexLexer::yy_get_next_buffer() { register char *dest = YY_CURRENT_BUFFER_LVALUE->yy_ch_buf; register char *source = (yytext_ptr); register int number_to_move, i; int ret_val; if ( (yy_c_buf_p) > &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars) + 1] ) YY_FATAL_ERROR( "fatal flex scanner internal error--end of buffer missed" ); if ( YY_CURRENT_BUFFER_LVALUE->yy_fill_buffer == 0 ) { /* Don't try to fill the buffer, so this is an EOF. */ if ( (yy_c_buf_p) - (yytext_ptr) - YY_MORE_ADJ == 1 ) { /* We matched a single character, the EOB, so * treat this as a final EOF. */ return EOB_ACT_END_OF_FILE; } else { /* We matched some text prior to the EOB, first * process it. */ return EOB_ACT_LAST_MATCH; } } /* Try to read more data. */ /* First move last chars to start of buffer. */ number_to_move = (int) ((yy_c_buf_p) - (yytext_ptr)) - 1; for ( i = 0; i < number_to_move; ++i ) *(dest++) = *(source++); if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_EOF_PENDING ) /* don't do the read, it's not guaranteed to return an EOF, * just force an EOF */ YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars) = 0; else { yy_size_t num_to_read = YY_CURRENT_BUFFER_LVALUE->yy_buf_size - number_to_move - 1; while ( num_to_read <= 0 ) { /* Not enough room in the buffer - grow it. */ /* just a shorter name for the current buffer */ YY_BUFFER_STATE b = YY_CURRENT_BUFFER_LVALUE; int yy_c_buf_p_offset = (int) ((yy_c_buf_p) - b->yy_ch_buf); if ( b->yy_is_our_buffer ) { yy_size_t new_size = b->yy_buf_size * 2; if ( new_size <= 0 ) b->yy_buf_size += b->yy_buf_size / 8; else b->yy_buf_size *= 2; b->yy_ch_buf = (char *) /* Include room in for 2 EOB chars. */ yyrealloc((void *) b->yy_ch_buf,b->yy_buf_size + 2 ); } else /* Can't grow it, we don't own it. */ b->yy_ch_buf = 0; if ( ! b->yy_ch_buf ) YY_FATAL_ERROR( "fatal error - scanner input buffer overflow" ); (yy_c_buf_p) = &b->yy_ch_buf[yy_c_buf_p_offset]; num_to_read = YY_CURRENT_BUFFER_LVALUE->yy_buf_size - number_to_move - 1; } if ( num_to_read > YY_READ_BUF_SIZE ) num_to_read = YY_READ_BUF_SIZE; /* Read in more data. */ YY_INPUT( (&YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move]), (yy_n_chars), num_to_read ); YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars); } if ( (yy_n_chars) == 0 ) { if ( number_to_move == YY_MORE_ADJ ) { ret_val = EOB_ACT_END_OF_FILE; yyrestart( yyin ); } else { ret_val = EOB_ACT_LAST_MATCH; YY_CURRENT_BUFFER_LVALUE->yy_buffer_status = YY_BUFFER_EOF_PENDING; } } else ret_val = EOB_ACT_CONTINUE_SCAN; if ((yy_size_t) ((yy_n_chars) + number_to_move) > YY_CURRENT_BUFFER_LVALUE->yy_buf_size) { /* Extend the array by 50%, plus the number we really need. */ yy_size_t new_size = (yy_n_chars) + number_to_move + ((yy_n_chars) >> 1); YY_CURRENT_BUFFER_LVALUE->yy_ch_buf = (char *) yyrealloc((void *) YY_CURRENT_BUFFER_LVALUE->yy_ch_buf,new_size ); if ( ! YY_CURRENT_BUFFER_LVALUE->yy_ch_buf ) YY_FATAL_ERROR( "out of dynamic memory in yy_get_next_buffer()" ); } (yy_n_chars) += number_to_move; YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] = YY_END_OF_BUFFER_CHAR; YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars) + 1] = YY_END_OF_BUFFER_CHAR; (yytext_ptr) = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[0]; return ret_val; } /* yy_get_previous_state - get the state just before the EOB char was reached */ yy_state_type yyFlexLexer::yy_get_previous_state() { register yy_state_type yy_current_state; register char *yy_cp; yy_current_state = (yy_start); for ( yy_cp = (yytext_ptr) + YY_MORE_ADJ; yy_cp < (yy_c_buf_p); ++yy_cp ) { register YY_CHAR yy_c = (*yy_cp ? yy_ec[YY_SC_TO_UI(*yy_cp)] : 1); if ( yy_accept[yy_current_state] ) { (yy_last_accepting_state) = yy_current_state; (yy_last_accepting_cpos) = yy_cp; } while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) { yy_current_state = (int) yy_def[yy_current_state]; if ( yy_current_state >= 1118 ) yy_c = yy_meta[(unsigned int) yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; } return yy_current_state; } /* yy_try_NUL_trans - try to make a transition on the NUL character * * synopsis * next_state = yy_try_NUL_trans( current_state ); */ yy_state_type yyFlexLexer::yy_try_NUL_trans( yy_state_type yy_current_state ) { register int yy_is_jam; register char *yy_cp = (yy_c_buf_p); register YY_CHAR yy_c = 1; if ( yy_accept[yy_current_state] ) { (yy_last_accepting_state) = yy_current_state; (yy_last_accepting_cpos) = yy_cp; } while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) { yy_current_state = (int) yy_def[yy_current_state]; if ( yy_current_state >= 1118 ) yy_c = yy_meta[(unsigned int) yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; yy_is_jam = (yy_current_state == 1117); return yy_is_jam ? 0 : yy_current_state; } void yyFlexLexer::yyunput( int c, register char* yy_bp) { register char *yy_cp; yy_cp = (yy_c_buf_p); /* undo effects of setting up yytext */ *yy_cp = (yy_hold_char); if ( yy_cp < YY_CURRENT_BUFFER_LVALUE->yy_ch_buf + 2 ) { /* need to shift things up to make room */ /* +2 for EOB chars. */ register yy_size_t number_to_move = (yy_n_chars) + 2; register char *dest = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[ YY_CURRENT_BUFFER_LVALUE->yy_buf_size + 2]; register char *source = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move]; while ( source > YY_CURRENT_BUFFER_LVALUE->yy_ch_buf ) *--dest = *--source; yy_cp += (int) (dest - source); yy_bp += (int) (dest - source); YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_buf_size; if ( yy_cp < YY_CURRENT_BUFFER_LVALUE->yy_ch_buf + 2 ) YY_FATAL_ERROR( "flex scanner push-back overflow" ); } *--yy_cp = (char) c; if ( c == '\n' ){ --yylineno; } (yytext_ptr) = yy_bp; (yy_hold_char) = *yy_cp; (yy_c_buf_p) = yy_cp; } int yyFlexLexer::yyinput() { int c; *(yy_c_buf_p) = (yy_hold_char); if ( *(yy_c_buf_p) == YY_END_OF_BUFFER_CHAR ) { /* yy_c_buf_p now points to the character we want to return. * If this occurs *before* the EOB characters, then it's a * valid NUL; if not, then we've hit the end of the buffer. */ if ( (yy_c_buf_p) < &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] ) /* This was really a NUL. */ *(yy_c_buf_p) = '\0'; else { /* need more input */ yy_size_t offset = (yy_c_buf_p) - (yytext_ptr); ++(yy_c_buf_p); switch ( yy_get_next_buffer( ) ) { case EOB_ACT_LAST_MATCH: /* This happens because yy_g_n_b() * sees that we've accumulated a * token and flags that we need to * try matching the token before * proceeding. But for input(), * there's no matching to consider. * So convert the EOB_ACT_LAST_MATCH * to EOB_ACT_END_OF_FILE. */ /* Reset buffer status. */ yyrestart( yyin ); /*FALLTHROUGH*/ case EOB_ACT_END_OF_FILE: { if ( yywrap( ) ) return EOF; if ( ! (yy_did_buffer_switch_on_eof) ) YY_NEW_FILE; #ifdef __cplusplus return yyinput(); #else return input(); #endif } case EOB_ACT_CONTINUE_SCAN: (yy_c_buf_p) = (yytext_ptr) + offset; break; } } } c = *(unsigned char *) (yy_c_buf_p); /* cast for 8-bit char's */ *(yy_c_buf_p) = '\0'; /* preserve yytext */ (yy_hold_char) = *++(yy_c_buf_p); if ( c == '\n' ) yylineno++; ; return c; } /** Immediately switch to a different input stream. * @param input_file A readable stream. * * @note This function does not reset the start condition to @c INITIAL . */ void yyFlexLexer::yyrestart( std::istream* input_file ) { if ( ! YY_CURRENT_BUFFER ){ yyensure_buffer_stack (); YY_CURRENT_BUFFER_LVALUE = yy_create_buffer( yyin, YY_BUF_SIZE ); } yy_init_buffer( YY_CURRENT_BUFFER, input_file ); yy_load_buffer_state( ); } /** Switch to a different input buffer. * @param new_buffer The new input buffer. * */ void yyFlexLexer::yy_switch_to_buffer( YY_BUFFER_STATE new_buffer ) { /* TODO. We should be able to replace this entire function body * with * yypop_buffer_state(); * yypush_buffer_state(new_buffer); */ yyensure_buffer_stack (); if ( YY_CURRENT_BUFFER == new_buffer ) return; if ( YY_CURRENT_BUFFER ) { /* Flush out information for old buffer. */ *(yy_c_buf_p) = (yy_hold_char); YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = (yy_c_buf_p); YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars); } YY_CURRENT_BUFFER_LVALUE = new_buffer; yy_load_buffer_state( ); /* We don't actually know whether we did this switch during * EOF (yywrap()) processing, but the only time this flag * is looked at is after yywrap() is called, so it's safe * to go ahead and always set it. */ (yy_did_buffer_switch_on_eof) = 1; } void yyFlexLexer::yy_load_buffer_state() { (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_n_chars; (yytext_ptr) = (yy_c_buf_p) = YY_CURRENT_BUFFER_LVALUE->yy_buf_pos; yyin = YY_CURRENT_BUFFER_LVALUE->yy_input_file; (yy_hold_char) = *(yy_c_buf_p); } /** Allocate and initialize an input buffer state. * @param file A readable stream. * @param size The character buffer size in bytes. When in doubt, use @c YY_BUF_SIZE. * * @return the allocated buffer state. */ YY_BUFFER_STATE yyFlexLexer::yy_create_buffer( std::istream* file, int size ) { YY_BUFFER_STATE b; b = (YY_BUFFER_STATE) yyalloc(sizeof( struct yy_buffer_state ) ); if ( ! b ) YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" ); b->yy_buf_size = size; /* yy_ch_buf has to be 2 characters longer than the size given because * we need to put in 2 end-of-buffer characters. */ b->yy_ch_buf = (char *) yyalloc(b->yy_buf_size + 2 ); if ( ! b->yy_ch_buf ) YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" ); b->yy_is_our_buffer = 1; yy_init_buffer( b, file ); return b; } /** Destroy the buffer. * @param b a buffer created with yy_create_buffer() * */ void yyFlexLexer::yy_delete_buffer( YY_BUFFER_STATE b ) { if ( ! b ) return; if ( b == YY_CURRENT_BUFFER ) /* Not sure if we should pop here. */ YY_CURRENT_BUFFER_LVALUE = (YY_BUFFER_STATE) 0; if ( b->yy_is_our_buffer ) yyfree((void *) b->yy_ch_buf ); yyfree((void *) b ); } /* Initializes or reinitializes a buffer. * This function is sometimes called more than once on the same buffer, * such as during a yyrestart() or at EOF. */ void yyFlexLexer::yy_init_buffer( YY_BUFFER_STATE b, std::istream* file ) { int oerrno = errno; yy_flush_buffer( b ); b->yy_input_file = file; b->yy_fill_buffer = 1; /* If b is the current buffer, then yy_init_buffer was _probably_ * called from yyrestart() or through yy_get_next_buffer. * In that case, we don't want to reset the lineno or column. */ if (b != YY_CURRENT_BUFFER){ b->yy_bs_lineno = 1; b->yy_bs_column = 0; } b->yy_is_interactive = 0; errno = oerrno; } /** Discard all buffered characters. On the next scan, YY_INPUT will be called. * @param b the buffer state to be flushed, usually @c YY_CURRENT_BUFFER. * */ void yyFlexLexer::yy_flush_buffer( YY_BUFFER_STATE b ) { if ( ! b ) return; b->yy_n_chars = 0; /* We always need two end-of-buffer characters. The first causes * a transition to the end-of-buffer state. The second causes * a jam in that state. */ b->yy_ch_buf[0] = YY_END_OF_BUFFER_CHAR; b->yy_ch_buf[1] = YY_END_OF_BUFFER_CHAR; b->yy_buf_pos = &b->yy_ch_buf[0]; b->yy_at_bol = 1; b->yy_buffer_status = YY_BUFFER_NEW; if ( b == YY_CURRENT_BUFFER ) yy_load_buffer_state( ); } /** Pushes the new state onto the stack. The new state becomes * the current state. This function will allocate the stack * if necessary. * @param new_buffer The new state. * */ void yyFlexLexer::yypush_buffer_state (YY_BUFFER_STATE new_buffer) { if (new_buffer == NULL) return; yyensure_buffer_stack(); /* This block is copied from yy_switch_to_buffer. */ if ( YY_CURRENT_BUFFER ) { /* Flush out information for old buffer. */ *(yy_c_buf_p) = (yy_hold_char); YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = (yy_c_buf_p); YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars); } /* Only push if top exists. Otherwise, replace top. */ if (YY_CURRENT_BUFFER) (yy_buffer_stack_top)++; YY_CURRENT_BUFFER_LVALUE = new_buffer; /* copied from yy_switch_to_buffer. */ yy_load_buffer_state( ); (yy_did_buffer_switch_on_eof) = 1; } /** Removes and deletes the top of the stack, if present. * The next element becomes the new top. * */ void yyFlexLexer::yypop_buffer_state (void) { if (!YY_CURRENT_BUFFER) return; yy_delete_buffer(YY_CURRENT_BUFFER ); YY_CURRENT_BUFFER_LVALUE = NULL; if ((yy_buffer_stack_top) > 0) --(yy_buffer_stack_top); if (YY_CURRENT_BUFFER) { yy_load_buffer_state( ); (yy_did_buffer_switch_on_eof) = 1; } } /* Allocates the stack if it does not exist. * Guarantees space for at least one push. */ void yyFlexLexer::yyensure_buffer_stack(void) { yy_size_t num_to_alloc; if (!(yy_buffer_stack)) { /* First allocation is just for 2 elements, since we don't know if this * scanner will even need a stack. We use 2 instead of 1 to avoid an * immediate realloc on the next call. */ num_to_alloc = 1; (yy_buffer_stack) = (struct yy_buffer_state**)yyalloc (num_to_alloc * sizeof(struct yy_buffer_state*) ); if ( ! (yy_buffer_stack) ) YY_FATAL_ERROR( "out of dynamic memory in yyensure_buffer_stack()" ); memset((yy_buffer_stack), 0, num_to_alloc * sizeof(struct yy_buffer_state*)); (yy_buffer_stack_max) = num_to_alloc; (yy_buffer_stack_top) = 0; return; } if ((yy_buffer_stack_top) >= ((yy_buffer_stack_max)) - 1){ /* Increase the buffer to prepare for a possible push. */ int grow_size = 8 /* arbitrary grow size */; num_to_alloc = (yy_buffer_stack_max) + grow_size; (yy_buffer_stack) = (struct yy_buffer_state**)yyrealloc ((yy_buffer_stack), num_to_alloc * sizeof(struct yy_buffer_state*) ); if ( ! (yy_buffer_stack) ) YY_FATAL_ERROR( "out of dynamic memory in yyensure_buffer_stack()" ); /* zero only the new slots.*/ memset((yy_buffer_stack) + (yy_buffer_stack_max), 0, grow_size * sizeof(struct yy_buffer_state*)); (yy_buffer_stack_max) = num_to_alloc; } } void yyFlexLexer::yy_push_state( int new_state ) { if ( (yy_start_stack_ptr) >= (yy_start_stack_depth) ) { yy_size_t new_size; (yy_start_stack_depth) += YY_START_STACK_INCR; new_size = (yy_start_stack_depth) * sizeof( int ); if ( ! (yy_start_stack) ) (yy_start_stack) = (int *) yyalloc(new_size ); else (yy_start_stack) = (int *) yyrealloc((void *) (yy_start_stack),new_size ); if ( ! (yy_start_stack) ) YY_FATAL_ERROR( "out of memory expanding start-condition stack" ); } (yy_start_stack)[(yy_start_stack_ptr)++] = YY_START; BEGIN(new_state); } void yyFlexLexer::yy_pop_state() { if ( --(yy_start_stack_ptr) < 0 ) YY_FATAL_ERROR( "start-condition stack underflow" ); BEGIN((yy_start_stack)[(yy_start_stack_ptr)]); } int yyFlexLexer::yy_top_state() { return (yy_start_stack)[(yy_start_stack_ptr) - 1]; } #ifndef YY_EXIT_FAILURE #define YY_EXIT_FAILURE 2 #endif void yyFlexLexer::LexerError( yyconst char msg[] ) { std::cerr << msg << std::endl; exit( YY_EXIT_FAILURE ); } /* Redefine yyless() so it works in section 3 code. */ #undef yyless #define yyless(n) \ do \ { \ /* Undo effects of setting up yytext. */ \ int yyless_macro_arg = (n); \ YY_LESS_LINENO(yyless_macro_arg);\ yytext[yyleng] = (yy_hold_char); \ (yy_c_buf_p) = yytext + yyless_macro_arg; \ (yy_hold_char) = *(yy_c_buf_p); \ *(yy_c_buf_p) = '\0'; \ yyleng = yyless_macro_arg; \ } \ while ( 0 ) /* Accessor methods (get/set functions) to struct members. */ /* * Internal utility routines. */ #ifndef yytext_ptr static void yy_flex_strncpy (char* s1, yyconst char * s2, int n ) { register int i; for ( i = 0; i < n; ++i ) s1[i] = s2[i]; } #endif #ifdef YY_NEED_STRLEN static int yy_flex_strlen (yyconst char * s ) { register int n; for ( n = 0; s[n]; ++n ) ; return n; } #endif void *yyalloc (yy_size_t size ) { return (void *) malloc( size ); } void *yyrealloc (void * ptr, yy_size_t size ) { /* The cast to (char *) in the following accommodates both * implementations that use char* generic pointers, and those * that use void* generic pointers. It works with the latter * because both ANSI C and C++ allow castless assignment from * any pointer type to void*, and deal with argument conversions * as though doing an assignment. */ return (void *) realloc( (char *) ptr, size ); } void yyfree (void * ptr ) { free( (char *) ptr ); /* see yyrealloc() for (char *) cast */ } #define YYTABLES_NAME "yytables" #line 374 "SrvLexer.l" dibbler-1.0.1/SrvCfgMgr/SrvCfgClientClass.h0000664000175000017500000000125112233256142015366 00000000000000/* * Dibbler - a portable DHCPv6 * * authors: Nguyen Vinh Nghiem * changes: Tomasz Mrugalski * * released under GNU GPL v2 or later licence * */ #ifndef SRVCFGCLIENTCLASS_H_ #define SRVCFGCLIENTCLASS_H_ #include #include "SmartPtr.h" #include "Node.h" class TSrvCfgClientClass { public: TSrvCfgClientClass(); TSrvCfgClientClass(std::string); TSrvCfgClientClass(std::string , SPtr&); virtual ~TSrvCfgClientClass(); std::string getClassName(); SPtr getCondition(); bool isStatisfy(SPtr msg); private: std::string classname; SPtr condition; }; #endif /* SRVCFGCLIENTCLASS_H_ */ dibbler-1.0.1/SrvCfgMgr/SrvCfgMgr.h0000644000175000017500000001264012420535753013717 00000000000000/* * Dibbler - a portable DHCPv6 * * authors: Tomasz Mrugalski * Marek Senderski * changes: Michal Kowalczuk * Nguyen Vinh Nghiem * * released under GNU GPL v2 only licence * */ class TSrvCfgMgr; #ifndef SRVCONFMGR_H #define SRVCONFMGR_H #include "SmartPtr.h" #include "SrvCfgIface.h" #include "SrvIfaceMgr.h" #include "CfgMgr.h" #include "DHCPConst.h" #include "Container.h" #include "DUID.h" #include "KeyList.h" #include "SrvCfgClientClass.h" #define SrvCfgMgr() (TSrvCfgMgr::instance()) class SrvParser; class TSrvCfgMgr : public TCfgMgr { public: friend std::ostream & operator<<(std::ostream &strum, TSrvCfgMgr &x); static void instanceCreate(const std::string& cfgFile, const std::string& xmlDumpFile); static TSrvCfgMgr &instance(); bool parseConfigFile(const std::string& cfgFile); //Interfaces acccess methods void firstIface(); SPtr getIface(); SPtr getIfaceByID(int iface); SPtr getIfaceByName(const std::string& name); long countIface(); void addIface(SPtr iface); void makeInactiveIface(int ifindex, bool inactive); int inactiveIfacesCnt(); SPtr checkInactiveIfaces(); void dump(); bool setupRelay(SPtr cfgIface); //Address assignment connected methods void setCounters(); void removeReservedFromCache(); long countAvailAddrs(SPtr clntDuid, SPtr clntAddr, int iface); SPtr getClassByAddr(int iface, SPtr addr); SPtr getClassByPrefix(int iface, SPtr prefix); SPtr getRandomAddr(SPtr duid, SPtr clntAddr, int iface); // bool isClntSupported(SPtr duid, SPtr clntAddr, int iface); bool isClntSupported(/*SPtr duid, SPtr clntAddr, int iface,*/ SPtr msg); // prefix-related bool incrPrefixCount(int iface, SPtr prefix); bool decrPrefixCount(int iface, SPtr prefix); // class' usage management void delClntAddr(int iface, SPtr addr); void addClntAddr(int iface, SPtr addr); void addTAAddr(int iface); void delTAAddr(int iface); bool addrReserved(SPtr addr); bool prefixReserved(SPtr prefix); bool isDone(); virtual ~TSrvCfgMgr(); bool setGlobalOptions(SPtr opt); // configuration parameters std::string getWorkdir(); bool stateless(); bool inactiveMode(); bool guessMode(); ESrvIfaceIdOrder getInterfaceIDOrder(); int getCacheSize(); /// returns where reconfigure should be supported or not /// /// @return true if supported bool getReconfigureSupport(); /// sets whether the reconfigure should be supported or not /// /// @param reconf tells whether reconfigure should be supported void setReconfigureSupport(bool reconf); void setDDNSAddress(SPtr ddnsAddress); SPtr getDDNSAddress(int iface); // Bulk-LeaseQuery void bulkLQAccept(bool enabled); void bulkLQTcpPort(unsigned short portNumber); void bulkLQMaxConns(unsigned int maxConnections); void bulkLQTimeout(unsigned int timeout); //Authentication #ifndef MOD_DISABLE_AUTH SPtr AuthKeys; void setAuthDigests(const DigestTypesLst& digests); DigestTypesLst getAuthDigests(); enum DigestTypes getDigest(); uint32_t getDelayedAuthKeyID(const char* mapping_file, SPtr clientid); #endif void setDefaults(); std::string getScriptName() { return ScriptName; } void setScriptName(std::string scriptFile) { ScriptName = scriptFile; } // Client List check void InClientClass(SPtr msg); // Used to find specific relay int getRelayByInterfaceID(SPtr interfaceID); int getRelayByLinkAddr(SPtr addr); int getAnyRelay(); // Sets performance mode (not write whole XML) void setPerformanceMode(bool mode); bool getPerformanceMode(); void dropUnicast(bool drop); bool dropUnicast(); // used to be private, but we need access in tests protected: TSrvCfgMgr(const std::string& cfgFile, const std::string& xmlFile); static TSrvCfgMgr * Instance; static int NextRelayID; std::string XmlFile; /// specifies whether the server should support reconfigure or not bool Reconfigure_; bool IsDone; bool validateConfig(); bool validateIface(SPtr ptrIface); bool validateClass(SPtr ptrIface, SPtr ptrClass); List(TSrvCfgIface) SrvCfgIfaceLst; List(TSrvCfgIface) InactiveLst; List(TSrvCfgClientClass) ClientClassLst; bool matchParsedSystemInterfaces(SrvParser *parser); // global options bool Stateless; bool InactiveMode; bool GuessMode; int CacheSize; ESrvIfaceIdOrder InterfaceIDOrder; std::string ScriptName; #ifndef MOD_DISABLE_AUTH unsigned int AuthLifetime; unsigned int AuthKeyGenNonceLen; DigestTypesLst DigestTypesLst_; #endif // DDNS address SPtr FqdnDdnsAddress; // lease-query parameters bool BulkLQAccept; unsigned short BulkLQTcpPort; unsigned int BulkLQMaxConns; unsigned int BulkLQTimeout; bool PerformanceMode_; bool DropUnicast_; }; #endif /* SRVCONFMGR_H */ dibbler-1.0.1/SrvCfgMgr/Makefile.am0000644000175000017500000000332212277722750013744 00000000000000SUBDIRS = . if HAVE_GTEST SUBDIRS += tests endif noinst_LIBRARIES = libSrvCfgMgr.a libSrvCfgMgr_a_CPPFLAGS = -I$(top_srcdir)/Misc -I$(top_srcdir)/CfgMgr -I$(top_srcdir)/SrvOptions libSrvCfgMgr_a_CPPFLAGS += -I$(top_srcdir)/Options -I$(top_srcdir)/SrvIfaceMgr libSrvCfgMgr_a_CPPFLAGS += -I$(top_srcdir)/IfaceMgr -I$(top_srcdir)/SrvAddrMgr libSrvCfgMgr_a_CPPFLAGS += -I$(top_srcdir)/AddrMgr -I$(top_srcdir)/SrvTransMgr libSrvCfgMgr_a_CPPFLAGS += -I$(top_srcdir)/SrvMessages -I$(top_srcdir)/Messages libSrvCfgMgr_a_CPPFLAGS += -I$(top_srcdir)/poslib -I$(top_srcdir)/poslib/poslib libSrvCfgMgr_a_CPPFLAGS += -I$(top_srcdir)/@PORT_SUBDIR@ libSrvCfgMgr_a_SOURCES = NodeClientSpecific.cpp NodeClientSpecific.h NodeConstant.cpp NodeConstant.h Node.cpp Node.h NodeOperator.cpp NodeOperator.h SrvCfgAddrClass.cpp SrvCfgAddrClass.h SrvCfgClientClass.cpp SrvCfgClientClass.h SrvCfgIface.cpp SrvCfgIface.h SrvCfgMgr.cpp SrvCfgMgr.h SrvCfgOptions.cpp SrvCfgOptions.h SrvCfgPD.cpp SrvCfgPD.h SrvCfgTA.cpp SrvCfgTA.h SrvLexer.cpp SrvParsClassOpt.cpp SrvParsClassOpt.h SrvParser.cpp SrvParser.h SrvParsGlobalOpt.cpp SrvParsGlobalOpt.h SrvParsIfaceOpt.cpp SrvParsIfaceOpt.h dist_noinst_DATA = SrvLexer.l SrvParser.y parser: SrvParser.y SrvLexer.l @echo "[BISON++] $(SUBDIR)/SrvParser.y" $(top_builddir)/bison++/bison++ --skeleton=$(top_builddir)/bison++/bison.cc --headerskeleton=$(top_builddir)/bison++/bison.h -v --debug --defines -d SrvParser.y -o SrvParser.cpp @echo "[FLEX ] $(SUBDIR)/SrvLexer.l" flex -+ -i -oSrvLexer.cpp SrvLexer.l @echo "[SED ] $(SUBDIR)/SrvLexer.cpp" cat SrvLexer.cpp | sed 's/extern "C" int isatty (int );/\/\/extern "C" int isatty (int ) throw ();/' > SrvLexer.cpp2 rm -f SrvLexer.cpp mv SrvLexer.cpp2 SrvLexer.cpp dibbler-1.0.1/SrvCfgMgr/SrvCfgAddrClass.h0000664000175000017500000000552612233256142015033 00000000000000/* * Dibbler - a portable DHCPv6 * * authors: Tomasz Mrugalski * Marek Senderski * changes: Nguyen Vinh Nghiem * * released under GNU GPL v2 or later licence * */ class TSrvCfgAddrClass; #ifndef SRVCONFADDRCLASS_H #define SRVCONFADDRCLASS_H #include #include #include #include "DHCPDefaults.h" #include "SrvAddrMgr.h" #include "SrvParsGlobalOpt.h" #include "DHCPConst.h" #include "SmartPtr.h" #include "IPv6Addr.h" #include "DUID.h" #include "SmartPtr.h" #include "SrvOptAddrParams.h" #include "SrvCfgClientClass.h" class TSrvCfgAddrClass { friend std::ostream& operator<<(std::ostream& out, TSrvCfgAddrClass& iface); public: TSrvCfgAddrClass(); //Is client with this DUID and IP address supported? bool clntSupported(SPtr duid,SPtr clntAddr); bool clntSupported(SPtr duid,SPtr clntAddr, SPtr msg); //Is client with this DUID and IP address prefered? (is in accept-only?) bool clntPrefered(SPtr duid,SPtr clntAddr); //checks if the address belongs to the pool bool addrInPool(SPtr addr); unsigned long countAddrInPool(); SPtr getRandomAddr(); SPtr getFirstAddr(); SPtr getLastAddr(); uint32_t getT1(uint32_t clntT1 = SERVER_DEFAULT_MAX_T1); uint32_t getT2(uint32_t clntT2 = SERVER_DEFAULT_MAX_T2); uint32_t getPref(uint32_t clntPref = SERVER_DEFAULT_MAX_PREF); uint32_t getValid(uint32_t clntValid = SERVER_DEFAULT_MAX_VALID); unsigned long getClassMaxLease(); unsigned long getID(); unsigned long getShare(); bool isLinkLocal(); unsigned long getAssignedCount(); long incrAssigned(int count=1); long decrAssigned(int count=1); void setOptions(SPtr opt); SPtr getAddrParams(); virtual ~TSrvCfgAddrClass(); void mapAllowDenyList( List(TSrvCfgClientClass) clientClassLst); private: uint32_t T1Min_; uint32_t T2Min_; uint32_t PrefMin_; uint32_t ValidMin_; uint32_t T1Max_; uint32_t T2Max_; uint32_t PrefMax_; uint32_t ValidMax_; uint32_t Share_; uint32_t chooseTime(uint32_t beg, uint32_t end, uint32_t clntTime); SPtr Pool_; unsigned long ClassMaxLease_; unsigned long AddrsAssigned_; unsigned long AddrsCount_; SPtr AddrParams_; // AddrParams - experimental option // new, better white/black-list unsigned long ID_; // client class ID static unsigned long StaticID_; List(std::string) AllowLst_; List(std::string) DenyLst_; List(TSrvCfgClientClass) AllowClientClassLst_; List(TSrvCfgClientClass) DenyClientClassLst_; // old white/black-list List(THostRange) RejedClnt_; List(THostRange) AcceptClnt_; }; #endif dibbler-1.0.1/SrvCfgMgr/SrvCfgPD.h0000664000175000017500000000620312233256142013467 00000000000000/* * Dibbler - a portable DHCPv6 * * authors: Krzysztof Wnuk * changes: Tomasz Mrugalski * Nguyen Vinh Nghiem * * released under GNU GPL v2 only licence * * $Id: SrvCfgPD.h,v 1.6 2008-10-12 20:07:31 thomson Exp $ * */ /* Generally prefixes can be divided into 3 parts: - constant prefix (a) - variable section (b) - zeroed tail (c) (a) (b) (c) aaaa:aaaa:aaaa:bbbb:bbbb:bbbb:0000:0000 When there are several prefix pools defined, (a) becomes pool-specific prefix (b) becomes common part (c) stays zeroed tail */ class TSrvCfgPD; #ifndef SRVCONFPD_H #define SRVCONFPD_H #include #include #include #include "SrvAddrMgr.h" #include "SrvParsGlobalOpt.h" #include "DHCPConst.h" #include "SmartPtr.h" #include "IPv6Addr.h" #include "DUID.h" #include "SmartPtr.h" #include "SrvCfgPD.h" #include "Node.h" class TSrvCfgClientClass; class TSrvCfgPD { friend std::ostream& operator<<(std::ostream& out, TSrvCfgPD& iface); public: TSrvCfgPD(); //Is client with this DUID and IP address supported? bool clntSupported(SPtr duid,SPtr clntAddr); bool clntSupported(SPtr duid,SPtr clntAddr, SPtr msg); //Is client with this DUID and IP address prefered? (is in accept-only?) bool clntPrefered(SPtr duid,SPtr clntAddr); //checks if the prefix belongs to the pool bool prefixInPool(SPtr prefix); unsigned long countPrefixesInPool(); SPtr getRandomPrefix(); List(TIPv6Addr) getRandomList(); unsigned long getT1(unsigned long hintT1); unsigned long getT2(unsigned long hintT2); unsigned long getPrefered(unsigned long hintPrefered); unsigned long getValid(unsigned long hintValid); unsigned long getPD_Length(); // length of prefix unsigned long getPD_MaxLease(); unsigned long getID(); bool isLinkLocal(); unsigned long getAssignedCount(); unsigned long getTotalCount(); long incrAssigned(int count=1); long decrAssigned(int count=1); bool setOptions(SPtr opt, int PDPrefix); virtual ~TSrvCfgPD(); void mapAllowDenyList( List(TSrvCfgClientClass) clientClassLst); private: unsigned long PD_T1Beg_; unsigned long PD_T1End_; unsigned long PD_T2Beg_; unsigned long PD_T2End_; unsigned long PD_Length_; // (shorter) prefix, assigned to the user, e.g. 64 unsigned long PD_PrefBeg_; unsigned long PD_PrefEnd_; unsigned long PD_ValidBeg_; unsigned long PD_ValidEnd_; unsigned long chooseTime(unsigned long beg, unsigned long end, unsigned long clntTime); unsigned long ID_; static unsigned long StaticID_; List(THostRange) PoolLst_; SPtr CommonPool_; /* common part of all available prefix pools (section b in the description above) */ unsigned long PD_MaxLease_; unsigned long PD_Assigned_; unsigned long PD_Count_; List(std::string) AllowLst_; List(std::string) DenyLst_; List(TSrvCfgClientClass) AllowClientClassLst_; List(TSrvCfgClientClass) DenyClientClassLst_; }; #endif dibbler-1.0.1/SrvCfgMgr/SrvCfgTA.cpp0000664000175000017500000001635512233256142014034 00000000000000/* * Dibbler - a portable DHCPv6 * * authors: Tomasz Mrugalski * changes: Nguyen Vinh Nghiem * * released under GNU GPL v2 only licence * */ #include "SrvCfgTA.h" #include "SmartPtr.h" #include "SrvParsGlobalOpt.h" #include "DHCPConst.h" #include "Logger.h" #include "SrvMsg.h" using namespace std; /* * static field initialization */ unsigned long TSrvCfgTA::staticID=0; TSrvCfgTA::TSrvCfgTA() :Pref(SERVER_DEFAULT_TA_PREF_LIFETIME), Valid(SERVER_DEFAULT_TA_VALID_LIFETIME), ClassMaxLease(SERVER_DEFAULT_CLASS_MAX_LEASE), AddrsAssigned(0), AddrsCount(0) { ID = staticID++; } TSrvCfgTA::~TSrvCfgTA() { } /** * is client allowed to use this class? (it can be rejected on DUID or address basis) * * @param clntDuid * @param clntAddr * * @return */ bool TSrvCfgTA::clntSupported(SPtr clntDuid, SPtr clntAddr) { SPtr range; RejedClnt.first(); // is client on black list? while(range=RejedClnt.get()) if (range->in(clntDuid,clntAddr)) return false; if (AcceptClnt.count()) { AcceptClnt.first(); // there's white list while(range=AcceptClnt.get()) { // is client on this white list? if (range->in(clntDuid,clntAddr)) return true; } return false; } return true; } bool TSrvCfgTA::clntSupported(SPtr duid,SPtr clntAddr, SPtr msg) { // is client on denied client class SPtr clntClass; denyClientClassLst.first(); while(clntClass = denyClientClassLst.get()) { if (clntClass->isStatisfy(msg)) return false; } // is client on accepted client class allowClientClassLst.first(); while(clntClass = allowClientClassLst.get()) { if (clntClass->isStatisfy(msg)) return true; } SPtr range; RejedClnt.first(); // is client on black list? while(range=RejedClnt.get()) if (range->in(duid,clntAddr)) return false; if (AcceptClnt.count()) { AcceptClnt.first(); // there's white list while(range=AcceptClnt.get()) { // is client on this white list? if (range->in(duid,clntAddr)) return true; } return false; } if (allowClientClassLst.count()) return false ; return true; } /* * is client prefered in this class? (= is it in whitelist?) */ bool TSrvCfgTA::clntPrefered(SPtr duid,SPtr clntAddr) { SPtr range; RejedClnt.first(); // is client on black list? while(range=RejedClnt.get()) if (range->in(duid,clntAddr)) return false; if (AcceptClnt.count()) { AcceptClnt.first(); while(range=AcceptClnt.get()) { if (range->in(duid,clntAddr)) return true; } } return false; } unsigned long TSrvCfgTA::getPref() { return this->Pref; } unsigned long TSrvCfgTA::getValid() { return this->Valid; } void TSrvCfgTA::setOptions(SPtr opt) { if (opt->getPrefBeg()!=opt->getPrefEnd()) { Log(Warning) << "TA-class does not support preferred-lifetime ranges. Lower bound (" << opt->getPrefBeg() << ") was used." << LogEnd; } this->Pref = opt->getPrefBeg(); if (opt->getValidBeg()!=opt->getValidEnd()) { Log(Warning) << "TA-class does not support valid-lifetime ranges. Lower bound (" << opt->getPrefBeg() << ") was used." << LogEnd; } this->Valid = opt->getValidBeg(); ClassMaxLease = opt->getClassMaxLease(); // copy black-list SPtr statRange; opt->firstRejedClnt(); while(statRange=opt->getRejedClnt()) this->RejedClnt.append(statRange); // copy white-list opt->firstAcceptClnt(); while(statRange=opt->getAcceptClnt()) this->AcceptClnt.append(statRange); opt->firstPool(); this->Pool = opt->getPool(); if (opt->getPool()) { Log(Warning) << "Two or more pool defined for TA. Only one is used." << LogEnd; } // set up address counter counts this->AddrsCount = this->Pool->rangeCount(); this->AddrsAssigned = 0; if (this->ClassMaxLease > this->AddrsCount) this->ClassMaxLease = this->AddrsCount; // Get ClientClass allowLst = opt->getAllowClientClassString(); denyLst = opt->getDenyClientClassString(); } unsigned long TSrvCfgTA::countAddrInPool() { return this->AddrsCount; } SPtr TSrvCfgTA::getRandomAddr() { return Pool->getRandomAddr(); } unsigned long TSrvCfgTA::getClassMaxLease() { return ClassMaxLease; } unsigned long TSrvCfgTA::getID() { return this->ID; } long TSrvCfgTA::incrAssigned(int count) { this->AddrsAssigned += count; return this->AddrsAssigned; } long TSrvCfgTA::decrAssigned(int count) { this->AddrsAssigned -= count; return this->AddrsAssigned; } unsigned long TSrvCfgTA::getAssignedCount() { return this->AddrsAssigned; } bool TSrvCfgTA::addrInPool(SPtr addr) { return Pool->in(addr); } ostream& operator<<(ostream& out,TSrvCfgTA& addrClass) { out << " " << endl; out << " " << endl; out << " " << addrClass.ClassMaxLease << "" << endl; SPtr statRange; out << " " << endl; out << *addrClass.Pool; out << " " << endl; addrClass.RejedClnt.first(); while(statRange=addrClass.RejedClnt.get()) out << *statRange; out << " " << endl; addrClass.AcceptClnt.first(); while(statRange=addrClass.AcceptClnt.get()) out << *statRange; out << " " << std::endl; return out; } void TSrvCfgTA::mapAllowDenyList( List(TSrvCfgClientClass) clientClassLst) { Log(Info)<<"Mapping allow, deny list to TA "<< ID < classname; SPtr clntClass; allowLst.first(); while (classname = allowLst.get()) { clientClassLst.first(); while( clntClass = clientClassLst.get() ) { if (clntClass->getClassName()== *classname) { allowClientClassLst.append(clntClass); // Log(Info)<<" Insert ino allow list "<getClassName()<getClassName()== *classname) { denyClientClassLst.append(clntClass); // Log(Info)<<" Insert ino deny list "<getClassName()< GPLv2 only) * * Revision 1.3 2006-03-21 19:12:47 thomson * TA related tune ups. * * Revision 1.2 2006/03/05 21:34:05 thomson * Temp. addresses support merged to the top branch. * * Revision 1.1.2.1 2006/02/05 23:42:33 thomson * Initial revision. * */ dibbler-1.0.1/SrvCfgMgr/SrvParsIfaceOpt.h0000644000175000017500000000730312343563603015071 00000000000000/* * Dibbler - a portable DHCPv6 * * authors: Tomasz Mrugalski * Marek Senderski * changes: Krzysztof Wnuk * released under GNU GPL v2 only licence * */ #ifndef TSRCPARSIFACEOPT_H_ #define TSRCPARSIFACEOPT_H_ #include "OptVendorSpecInfo.h" #include "SrvOptInterfaceID.h" #include "SrvParsClassOpt.h" #include "FQDN.h" class TSrvParsIfaceOpt : public TSrvParsClassOpt { public: TSrvParsIfaceOpt(void); ~TSrvParsIfaceOpt(void); void setClntMaxLease(long maxLeases); long getClntMaxLease(); void setIfaceMaxLease(long maxLease); long getIfaceMaxLease(); void setPreference(char pref); char getPreference(); void setRapidCommit(bool rapidComm); bool getRapidCommit(); void setUnicast(SPtr addr); SPtr getUnicast(); void setRelayName(std::string name); void setRelayID(int ifindex); void setRelayInterfaceID(SPtr id); std::string getRelayName(); int getRelayID(); SPtr getRelayInterfaceID(); bool isRelay(); // leasequery support void setLeaseQuerySupport(bool support); bool getLeaseQuerySupport(); //-- options related methods -- // option: DNS Servers servers is now handled with extra options mechanism // option: Domain servers is now handled with extra options mechanism // option: NTP servers servers is now handled with extra options mechanism // option: Timezone servers is now handled with extra options mechanism // option: SIP servers is now handled with extra options mechanism // option: SIP domains is now handled with extra options mechanism // option: NIS servers is now handled with extra options mechanism // option: NIS+ servers is now handled with extra options mechanism // option: NIS domain is now handled with extra options mechanism // option: NISP domain is now handled with extra options mechanism // option: LIFETIME servers is now handled with extra options mechanism // option: FQDN List(TFQDN) *getFQDNLst(); int getRevDNSZoneRootLength(); void setRevDNSZoneRootLength(int revDNSZoneRootLength); void setUnknownFQDN(EUnknownFQDNMode mode, const std::string& domain); EUnknownFQDNMode getUnknownFQDN(); std::string getFQDNDomain(); void setFQDNLst(List(TFQDN) *fqdn); bool supportFQDN(); int getFQDNMode(); void setFQDNMode(int FQDNMode); #if 0 // option: VENDOR-SPEC INFO void setVendorSpec(List(TOptVendorSpecInfo) vendor); bool supportVendorSpec(); List(TOptVendorSpecInfo) getVendorSpec(); #endif // extra options void addExtraOption(SPtr extra, bool always); const TOptList& getExtraOptions(); SPtr getExtraOption(uint16_t type); const TOptList& getForcedOptions(); private: void addOption(TOptList& list, SPtr opt); /// @todo: Preference should be a global value char Preference_; bool RapidCommit_; long IfaceMaxLease_; long ClntMaxLease_; SPtr Unicast_; bool LeaseQuery_; // support for leasequery // relay bool Relay_; std::string RelayName_; int RelayID_; SPtr RelayInterfaceID_; // options List(TOptVendorSpecInfo) VendorSpec_; // FQDN bool FQDNSupport_; List(TFQDN) FQDNLst_; int FQDNMode_; EUnknownFQDNMode UnknownFQDN_; // accept, reject, append domain, generate procedurally std::string FQDNDomain_; int RevDNSZoneRootLength_; /// @brief extra options ALWAYS sent to client (may also include ForcedOpts) TOptList ExtraOpts; /// @brief list of options that are forced to client TOptList ForcedOpts; }; #endif dibbler-1.0.1/SrvCfgMgr/NodeClientSpecific.h0000664000175000017500000000206212233256142015542 00000000000000/* * Dibbler - a portable DHCPv6 * * authors: Nguyen Vinh Nghiem * changes: Tomasz Mrugalski * * released under GNU GPL v2 or later licence * */ #ifndef NODECLIENTSPECIFIC_H_ #define NODECLIENTSPECIFIC_H_ #include "Node.h" #include "SmartPtr.h" #include "Container.h" #include "Opt.h" #include class NodeClientSpecific: public Node { public: enum ClientSpecificType { CLIENT_UNKNOWN = 0, CLIENT_VENDOR_SPEC_ENTERPRISE_NUM = 1, CLIENT_VENDOR_SPEC_DATA = 2, CLIENT_VENDOR_CLASS_ENTERPRISE_NUM = 3, CLIENT_VENDOR_CLASS_DATA = 4 }; NodeClientSpecific(); virtual ~NodeClientSpecific(); NodeClientSpecific(ClientSpecificType t); std::string exec(SPtr msg); static void analyseMessage(SPtr msg); static std::string vendor_spec_num; static std::string vendor_spec_data; static std::string vendor_class_num; static std::string vendor_class_data; static SPtr CurrentMsg; private: ClientSpecificType Type; }; #endif /* NODECLIENTSPECIFIC_H_ */ dibbler-1.0.1/SrvCfgMgr/SrvParser.h0000644000175000017500000004524112556513130014004 00000000000000#ifndef YY_SrvParser_h_included #define YY_SrvParser_h_included #define YY_USE_CLASS #line 1 "../bison++/bison.h" /* before anything */ #ifdef c_plusplus #ifndef __cplusplus #define __cplusplus #endif #endif #line 8 "../bison++/bison.h" #line 3 "SrvParser.y" #include #include #include #include #include "Portable.h" #include "DHCPConst.h" #include "SmartPtr.h" #include "Container.h" #include "SrvParser.h" #include "SrvParsGlobalOpt.h" #include "SrvParsClassOpt.h" #include "SrvParsIfaceOpt.h" #include "OptAddr.h" #include "OptAddrLst.h" #include "OptDomainLst.h" #include "OptString.h" #include "OptVendorSpecInfo.h" #include "OptRtPrefix.h" #include "SrvOptAddrParams.h" #include "SrvCfgMgr.h" #include "SrvCfgTA.h" #include "SrvCfgPD.h" #include "SrvCfgClientClass.h" #include "SrvCfgAddrClass.h" #include "SrvCfgIface.h" #include "SrvCfgOptions.h" #include "DUID.h" #include "Logger.h" #include "FQDN.h" #include "Key.h" #include "Node.h" #include "NodeConstant.h" #include "NodeClientSpecific.h" #include "NodeOperator.h" using namespace std; #define YY_USE_CLASS #define YY_SrvParser_MEMBERS FlexLexer * lex; \ List(TSrvParsGlobalOpt) ParserOptStack; /* list of parsed interfaces/IAs/addrs */ \ List(TSrvCfgIface) SrvCfgIfaceLst; /* list of SrvCfg interfaces */ \ List(TSrvCfgAddrClass) SrvCfgAddrClassLst; /* list of SrvCfg address classes */ \ List(TSrvCfgTA) SrvCfgTALst; /* list of SrvCfg TA objects */ \ List(TSrvCfgPD) SrvCfgPDLst; /* list of SrvCfg PD objects */ \ List(TSrvCfgClientClass) SrvCfgClientClassLst; /* list of SrvCfgClientClass objs */ \ List(TIPv6Addr) PresentAddrLst; /* address list (used for DNS,NTP,etc.)*/ \ List(std::string) PresentStringLst; /* string list */ \ List(Node) NodeClientClassLst; /* Node list */ \ List(TFQDN) PresentFQDNLst; \ SPtr addr; \ SPtr CurrentKey; \ DigestTypesLst DigestLst; \ List(THostRange) PresentRangeLst; \ List(THostRange) PDLst; \ List(TSrvCfgOptions) ClientLst; \ int PDPrefix; \ bool IfaceDefined(int ifaceNr); \ bool IfaceDefined(string ifaceName); \ bool StartIfaceDeclaration(string iface); \ bool StartIfaceDeclaration(int ifindex); \ bool EndIfaceDeclaration(); \ void StartClassDeclaration(); \ bool EndClassDeclaration(); \ SPtr getRangeMin(char * addrPacked, int prefix); \ SPtr getRangeMax(char * addrPacked, int prefix); \ void StartTAClassDeclaration(); \ bool EndTAClassDeclaration(); \ void StartPDDeclaration(); \ bool EndPDDeclaration(); \ TSrvCfgMgr * CfgMgr; \ SPtr nextHop; \ virtual ~SrvParser(); #define YY_SrvParser_CONSTRUCTOR_PARAM yyFlexLexer * lex #define YY_SrvParser_CONSTRUCTOR_CODE \ ParserOptStack.append(new TSrvParsGlobalOpt()); \ this->lex = lex; \ CfgMgr = 0; \ nextHop.reset(); \ yynerrs = 0; \ yychar = 0; \ PDPrefix = 0; #line 95 "SrvParser.y" typedef union { unsigned int ival; char *strval; struct SDuid { int length; char* duid; } duidval; char addrval[16]; } yy_SrvParser_stype; #define YY_SrvParser_STYPE yy_SrvParser_stype #line 21 "../bison++/bison.h" /* %{ and %header{ and %union, during decl */ #ifndef YY_SrvParser_COMPATIBILITY #ifndef YY_USE_CLASS #define YY_SrvParser_COMPATIBILITY 1 #else #define YY_SrvParser_COMPATIBILITY 0 #endif #endif #if YY_SrvParser_COMPATIBILITY != 0 /* backward compatibility */ #ifdef YYLTYPE #ifndef YY_SrvParser_LTYPE #define YY_SrvParser_LTYPE YYLTYPE /* WARNING obsolete !!! user defined YYLTYPE not reported into generated header */ /* use %define LTYPE */ #endif #endif /*#ifdef YYSTYPE*/ #ifndef YY_SrvParser_STYPE #define YY_SrvParser_STYPE YYSTYPE /* WARNING obsolete !!! user defined YYSTYPE not reported into generated header */ /* use %define STYPE */ #endif /*#endif*/ #ifdef YYDEBUG #ifndef YY_SrvParser_DEBUG #define YY_SrvParser_DEBUG YYDEBUG /* WARNING obsolete !!! user defined YYDEBUG not reported into generated header */ /* use %define DEBUG */ #endif #endif /* use goto to be compatible */ #ifndef YY_SrvParser_USE_GOTO #define YY_SrvParser_USE_GOTO 1 #endif #endif /* use no goto to be clean in C++ */ #ifndef YY_SrvParser_USE_GOTO #define YY_SrvParser_USE_GOTO 0 #endif #ifndef YY_SrvParser_PURE #line 65 "../bison++/bison.h" #line 65 "../bison++/bison.h" /* YY_SrvParser_PURE */ #endif #line 68 "../bison++/bison.h" #line 68 "../bison++/bison.h" /* prefix */ #ifndef YY_SrvParser_DEBUG #line 71 "../bison++/bison.h" #define YY_SrvParser_DEBUG 1 #line 71 "../bison++/bison.h" /* YY_SrvParser_DEBUG */ #endif #ifndef YY_SrvParser_LSP_NEEDED #line 75 "../bison++/bison.h" #line 75 "../bison++/bison.h" /* YY_SrvParser_LSP_NEEDED*/ #endif /* DEFAULT LTYPE*/ #ifdef YY_SrvParser_LSP_NEEDED #ifndef YY_SrvParser_LTYPE #ifndef BISON_YYLTYPE_ISDECLARED #define BISON_YYLTYPE_ISDECLARED typedef struct yyltype { int timestamp; int first_line; int first_column; int last_line; int last_column; char *text; } yyltype; #endif #define YY_SrvParser_LTYPE yyltype #endif #endif /* DEFAULT STYPE*/ #ifndef YY_SrvParser_STYPE #define YY_SrvParser_STYPE int #endif /* DEFAULT MISCELANEOUS */ #ifndef YY_SrvParser_PARSE #define YY_SrvParser_PARSE yyparse #endif #ifndef YY_SrvParser_LEX #define YY_SrvParser_LEX yylex #endif #ifndef YY_SrvParser_LVAL #define YY_SrvParser_LVAL yylval #endif #ifndef YY_SrvParser_LLOC #define YY_SrvParser_LLOC yylloc #endif #ifndef YY_SrvParser_CHAR #define YY_SrvParser_CHAR yychar #endif #ifndef YY_SrvParser_NERRS #define YY_SrvParser_NERRS yynerrs #endif #ifndef YY_SrvParser_DEBUG_FLAG #define YY_SrvParser_DEBUG_FLAG yydebug #endif #ifndef YY_SrvParser_ERROR #define YY_SrvParser_ERROR yyerror #endif #ifndef YY_SrvParser_PARSE_PARAM #ifndef __STDC__ #ifndef __cplusplus #ifndef YY_USE_CLASS #define YY_SrvParser_PARSE_PARAM #ifndef YY_SrvParser_PARSE_PARAM_DEF #define YY_SrvParser_PARSE_PARAM_DEF #endif #endif #endif #endif #ifndef YY_SrvParser_PARSE_PARAM #define YY_SrvParser_PARSE_PARAM void #endif #endif /* TOKEN C */ #ifndef YY_USE_CLASS #ifndef YY_SrvParser_PURE #ifndef yylval extern YY_SrvParser_STYPE YY_SrvParser_LVAL; #else #if yylval != YY_SrvParser_LVAL extern YY_SrvParser_STYPE YY_SrvParser_LVAL; #else #warning "Namespace conflict, disabling some functionality (bison++ only)" #endif #endif #endif #line 169 "../bison++/bison.h" #define IFACE_ 258 #define RELAY_ 259 #define IFACE_ID_ 260 #define IFACE_ID_ORDER_ 261 #define CLASS_ 262 #define TACLASS_ 263 #define LOGNAME_ 264 #define LOGLEVEL_ 265 #define LOGMODE_ 266 #define LOGCOLORS_ 267 #define WORKDIR_ 268 #define OPTION_ 269 #define DNS_SERVER_ 270 #define DOMAIN_ 271 #define NTP_SERVER_ 272 #define TIME_ZONE_ 273 #define SIP_SERVER_ 274 #define SIP_DOMAIN_ 275 #define NIS_SERVER_ 276 #define NIS_DOMAIN_ 277 #define NISP_SERVER_ 278 #define NISP_DOMAIN_ 279 #define LIFETIME_ 280 #define FQDN_ 281 #define ACCEPT_UNKNOWN_FQDN_ 282 #define FQDN_DDNS_ADDRESS_ 283 #define DDNS_PROTOCOL_ 284 #define DDNS_TIMEOUT_ 285 #define ACCEPT_ONLY_ 286 #define REJECT_CLIENTS_ 287 #define POOL_ 288 #define SHARE_ 289 #define T1_ 290 #define T2_ 291 #define PREF_TIME_ 292 #define VALID_TIME_ 293 #define UNICAST_ 294 #define DROP_UNICAST_ 295 #define PREFERENCE_ 296 #define RAPID_COMMIT_ 297 #define IFACE_MAX_LEASE_ 298 #define CLASS_MAX_LEASE_ 299 #define CLNT_MAX_LEASE_ 300 #define STATELESS_ 301 #define CACHE_SIZE_ 302 #define PDCLASS_ 303 #define PD_LENGTH_ 304 #define PD_POOL_ 305 #define SCRIPT_ 306 #define VENDOR_SPEC_ 307 #define CLIENT_ 308 #define DUID_KEYWORD_ 309 #define REMOTE_ID_ 310 #define LINK_LOCAL_ 311 #define ADDRESS_ 312 #define PREFIX_ 313 #define GUESS_MODE_ 314 #define INACTIVE_MODE_ 315 #define EXPERIMENTAL_ 316 #define ADDR_PARAMS_ 317 #define REMOTE_AUTOCONF_NEIGHBORS_ 318 #define AFTR_ 319 #define PERFORMANCE_MODE_ 320 #define AUTH_PROTOCOL_ 321 #define AUTH_ALGORITHM_ 322 #define AUTH_REPLAY_ 323 #define AUTH_METHODS_ 324 #define AUTH_DROP_UNAUTH_ 325 #define AUTH_REALM_ 326 #define KEY_ 327 #define SECRET_ 328 #define ALGORITHM_ 329 #define FUDGE_ 330 #define DIGEST_NONE_ 331 #define DIGEST_PLAIN_ 332 #define DIGEST_HMAC_MD5_ 333 #define DIGEST_HMAC_SHA1_ 334 #define DIGEST_HMAC_SHA224_ 335 #define DIGEST_HMAC_SHA256_ 336 #define DIGEST_HMAC_SHA384_ 337 #define DIGEST_HMAC_SHA512_ 338 #define ACCEPT_LEASEQUERY_ 339 #define BULKLQ_ACCEPT_ 340 #define BULKLQ_TCPPORT_ 341 #define BULKLQ_MAX_CONNS_ 342 #define BULKLQ_TIMEOUT_ 343 #define CLIENT_CLASS_ 344 #define MATCH_IF_ 345 #define EQ_ 346 #define AND_ 347 #define OR_ 348 #define CLIENT_VENDOR_SPEC_ENTERPRISE_NUM_ 349 #define CLIENT_VENDOR_SPEC_DATA_ 350 #define CLIENT_VENDOR_CLASS_EN_ 351 #define CLIENT_VENDOR_CLASS_DATA_ 352 #define RECONFIGURE_ENABLED_ 353 #define ALLOW_ 354 #define DENY_ 355 #define SUBSTRING_ 356 #define STRING_KEYWORD_ 357 #define ADDRESS_LIST_ 358 #define CONTAIN_ 359 #define NEXT_HOP_ 360 #define ROUTE_ 361 #define INFINITE_ 362 #define SUBNET_ 363 #define STRING_ 364 #define HEXNUMBER_ 365 #define INTNUMBER_ 366 #define IPV6ADDR_ 367 #define DUID_ 368 #line 169 "../bison++/bison.h" /* #defines token */ /* after #define tokens, before const tokens S5*/ #else #ifndef YY_SrvParser_CLASS #define YY_SrvParser_CLASS SrvParser #endif #ifndef YY_SrvParser_INHERIT #define YY_SrvParser_INHERIT #endif #ifndef YY_SrvParser_MEMBERS #define YY_SrvParser_MEMBERS #endif #ifndef YY_SrvParser_LEX_BODY #define YY_SrvParser_LEX_BODY #endif #ifndef YY_SrvParser_ERROR_BODY #define YY_SrvParser_ERROR_BODY #endif #ifndef YY_SrvParser_CONSTRUCTOR_PARAM #define YY_SrvParser_CONSTRUCTOR_PARAM #endif /* choose between enum and const */ #ifndef YY_SrvParser_USE_CONST_TOKEN #define YY_SrvParser_USE_CONST_TOKEN 0 /* yes enum is more compatible with flex, */ /* so by default we use it */ #endif #if YY_SrvParser_USE_CONST_TOKEN != 0 #ifndef YY_SrvParser_ENUM_TOKEN #define YY_SrvParser_ENUM_TOKEN yy_SrvParser_enum_token #endif #endif class YY_SrvParser_CLASS YY_SrvParser_INHERIT { public: #if YY_SrvParser_USE_CONST_TOKEN != 0 /* static const int token ... */ #line 212 "../bison++/bison.h" static const int IFACE_; static const int RELAY_; static const int IFACE_ID_; static const int IFACE_ID_ORDER_; static const int CLASS_; static const int TACLASS_; static const int LOGNAME_; static const int LOGLEVEL_; static const int LOGMODE_; static const int LOGCOLORS_; static const int WORKDIR_; static const int OPTION_; static const int DNS_SERVER_; static const int DOMAIN_; static const int NTP_SERVER_; static const int TIME_ZONE_; static const int SIP_SERVER_; static const int SIP_DOMAIN_; static const int NIS_SERVER_; static const int NIS_DOMAIN_; static const int NISP_SERVER_; static const int NISP_DOMAIN_; static const int LIFETIME_; static const int FQDN_; static const int ACCEPT_UNKNOWN_FQDN_; static const int FQDN_DDNS_ADDRESS_; static const int DDNS_PROTOCOL_; static const int DDNS_TIMEOUT_; static const int ACCEPT_ONLY_; static const int REJECT_CLIENTS_; static const int POOL_; static const int SHARE_; static const int T1_; static const int T2_; static const int PREF_TIME_; static const int VALID_TIME_; static const int UNICAST_; static const int DROP_UNICAST_; static const int PREFERENCE_; static const int RAPID_COMMIT_; static const int IFACE_MAX_LEASE_; static const int CLASS_MAX_LEASE_; static const int CLNT_MAX_LEASE_; static const int STATELESS_; static const int CACHE_SIZE_; static const int PDCLASS_; static const int PD_LENGTH_; static const int PD_POOL_; static const int SCRIPT_; static const int VENDOR_SPEC_; static const int CLIENT_; static const int DUID_KEYWORD_; static const int REMOTE_ID_; static const int LINK_LOCAL_; static const int ADDRESS_; static const int PREFIX_; static const int GUESS_MODE_; static const int INACTIVE_MODE_; static const int EXPERIMENTAL_; static const int ADDR_PARAMS_; static const int REMOTE_AUTOCONF_NEIGHBORS_; static const int AFTR_; static const int PERFORMANCE_MODE_; static const int AUTH_PROTOCOL_; static const int AUTH_ALGORITHM_; static const int AUTH_REPLAY_; static const int AUTH_METHODS_; static const int AUTH_DROP_UNAUTH_; static const int AUTH_REALM_; static const int KEY_; static const int SECRET_; static const int ALGORITHM_; static const int FUDGE_; static const int DIGEST_NONE_; static const int DIGEST_PLAIN_; static const int DIGEST_HMAC_MD5_; static const int DIGEST_HMAC_SHA1_; static const int DIGEST_HMAC_SHA224_; static const int DIGEST_HMAC_SHA256_; static const int DIGEST_HMAC_SHA384_; static const int DIGEST_HMAC_SHA512_; static const int ACCEPT_LEASEQUERY_; static const int BULKLQ_ACCEPT_; static const int BULKLQ_TCPPORT_; static const int BULKLQ_MAX_CONNS_; static const int BULKLQ_TIMEOUT_; static const int CLIENT_CLASS_; static const int MATCH_IF_; static const int EQ_; static const int AND_; static const int OR_; static const int CLIENT_VENDOR_SPEC_ENTERPRISE_NUM_; static const int CLIENT_VENDOR_SPEC_DATA_; static const int CLIENT_VENDOR_CLASS_EN_; static const int CLIENT_VENDOR_CLASS_DATA_; static const int RECONFIGURE_ENABLED_; static const int ALLOW_; static const int DENY_; static const int SUBSTRING_; static const int STRING_KEYWORD_; static const int ADDRESS_LIST_; static const int CONTAIN_; static const int NEXT_HOP_; static const int ROUTE_; static const int INFINITE_; static const int SUBNET_; static const int STRING_; static const int HEXNUMBER_; static const int INTNUMBER_; static const int IPV6ADDR_; static const int DUID_; #line 212 "../bison++/bison.h" /* decl const */ #else enum YY_SrvParser_ENUM_TOKEN { YY_SrvParser_NULL_TOKEN=0 #line 215 "../bison++/bison.h" ,IFACE_=258 ,RELAY_=259 ,IFACE_ID_=260 ,IFACE_ID_ORDER_=261 ,CLASS_=262 ,TACLASS_=263 ,LOGNAME_=264 ,LOGLEVEL_=265 ,LOGMODE_=266 ,LOGCOLORS_=267 ,WORKDIR_=268 ,OPTION_=269 ,DNS_SERVER_=270 ,DOMAIN_=271 ,NTP_SERVER_=272 ,TIME_ZONE_=273 ,SIP_SERVER_=274 ,SIP_DOMAIN_=275 ,NIS_SERVER_=276 ,NIS_DOMAIN_=277 ,NISP_SERVER_=278 ,NISP_DOMAIN_=279 ,LIFETIME_=280 ,FQDN_=281 ,ACCEPT_UNKNOWN_FQDN_=282 ,FQDN_DDNS_ADDRESS_=283 ,DDNS_PROTOCOL_=284 ,DDNS_TIMEOUT_=285 ,ACCEPT_ONLY_=286 ,REJECT_CLIENTS_=287 ,POOL_=288 ,SHARE_=289 ,T1_=290 ,T2_=291 ,PREF_TIME_=292 ,VALID_TIME_=293 ,UNICAST_=294 ,DROP_UNICAST_=295 ,PREFERENCE_=296 ,RAPID_COMMIT_=297 ,IFACE_MAX_LEASE_=298 ,CLASS_MAX_LEASE_=299 ,CLNT_MAX_LEASE_=300 ,STATELESS_=301 ,CACHE_SIZE_=302 ,PDCLASS_=303 ,PD_LENGTH_=304 ,PD_POOL_=305 ,SCRIPT_=306 ,VENDOR_SPEC_=307 ,CLIENT_=308 ,DUID_KEYWORD_=309 ,REMOTE_ID_=310 ,LINK_LOCAL_=311 ,ADDRESS_=312 ,PREFIX_=313 ,GUESS_MODE_=314 ,INACTIVE_MODE_=315 ,EXPERIMENTAL_=316 ,ADDR_PARAMS_=317 ,REMOTE_AUTOCONF_NEIGHBORS_=318 ,AFTR_=319 ,PERFORMANCE_MODE_=320 ,AUTH_PROTOCOL_=321 ,AUTH_ALGORITHM_=322 ,AUTH_REPLAY_=323 ,AUTH_METHODS_=324 ,AUTH_DROP_UNAUTH_=325 ,AUTH_REALM_=326 ,KEY_=327 ,SECRET_=328 ,ALGORITHM_=329 ,FUDGE_=330 ,DIGEST_NONE_=331 ,DIGEST_PLAIN_=332 ,DIGEST_HMAC_MD5_=333 ,DIGEST_HMAC_SHA1_=334 ,DIGEST_HMAC_SHA224_=335 ,DIGEST_HMAC_SHA256_=336 ,DIGEST_HMAC_SHA384_=337 ,DIGEST_HMAC_SHA512_=338 ,ACCEPT_LEASEQUERY_=339 ,BULKLQ_ACCEPT_=340 ,BULKLQ_TCPPORT_=341 ,BULKLQ_MAX_CONNS_=342 ,BULKLQ_TIMEOUT_=343 ,CLIENT_CLASS_=344 ,MATCH_IF_=345 ,EQ_=346 ,AND_=347 ,OR_=348 ,CLIENT_VENDOR_SPEC_ENTERPRISE_NUM_=349 ,CLIENT_VENDOR_SPEC_DATA_=350 ,CLIENT_VENDOR_CLASS_EN_=351 ,CLIENT_VENDOR_CLASS_DATA_=352 ,RECONFIGURE_ENABLED_=353 ,ALLOW_=354 ,DENY_=355 ,SUBSTRING_=356 ,STRING_KEYWORD_=357 ,ADDRESS_LIST_=358 ,CONTAIN_=359 ,NEXT_HOP_=360 ,ROUTE_=361 ,INFINITE_=362 ,SUBNET_=363 ,STRING_=364 ,HEXNUMBER_=365 ,INTNUMBER_=366 ,IPV6ADDR_=367 ,DUID_=368 #line 215 "../bison++/bison.h" /* enum token */ }; /* end of enum declaration */ #endif public: int YY_SrvParser_PARSE(YY_SrvParser_PARSE_PARAM); virtual void YY_SrvParser_ERROR(char *msg) YY_SrvParser_ERROR_BODY; #ifdef YY_SrvParser_PURE #ifdef YY_SrvParser_LSP_NEEDED virtual int YY_SrvParser_LEX(YY_SrvParser_STYPE *YY_SrvParser_LVAL,YY_SrvParser_LTYPE *YY_SrvParser_LLOC) YY_SrvParser_LEX_BODY; #else virtual int YY_SrvParser_LEX(YY_SrvParser_STYPE *YY_SrvParser_LVAL) YY_SrvParser_LEX_BODY; #endif #else virtual int YY_SrvParser_LEX() YY_SrvParser_LEX_BODY; YY_SrvParser_STYPE YY_SrvParser_LVAL; #ifdef YY_SrvParser_LSP_NEEDED YY_SrvParser_LTYPE YY_SrvParser_LLOC; #endif int YY_SrvParser_NERRS; int YY_SrvParser_CHAR; #endif #if YY_SrvParser_DEBUG != 0 public: int YY_SrvParser_DEBUG_FLAG; /* nonzero means print parse trace */ #endif public: YY_SrvParser_CLASS(YY_SrvParser_CONSTRUCTOR_PARAM); public: YY_SrvParser_MEMBERS }; /* other declare folow */ #endif #if YY_SrvParser_COMPATIBILITY != 0 /* backward compatibility */ /* Removed due to bison problems /#ifndef YYSTYPE / #define YYSTYPE YY_SrvParser_STYPE /#endif*/ #ifndef YYLTYPE #define YYLTYPE YY_SrvParser_LTYPE #endif #ifndef YYDEBUG #ifdef YY_SrvParser_DEBUG #define YYDEBUG YY_SrvParser_DEBUG #endif #endif #endif /* END */ #line 267 "../bison++/bison.h" #endif dibbler-1.0.1/SrvCfgMgr/NodeConstant.cpp0000664000175000017500000000130512233256142015001 00000000000000/* * Dibbler - a portable DHCPv6 * * authors: Nguyen Vinh Nghiem * changes: Tomasz Mrugalski * * released under GNU GPL v2 or later licence * */ #ifndef NODECONSTANT_CPP_ #define NODECONSTANT_CPP_ #include "NodeConstant.h" #include "SrvMsg.h" #include "SrvMsg.h" using namespace std; NodeConstant::NodeConstant() :Node(NODE_CONST) { } NodeConstant::~NodeConstant() { } NodeConstant::NodeConstant(std::string v) :Node(NODE_CONST), value(v) { } std::string NodeConstant::getStringValue() { return value; } std::string NodeConstant::exec() { return value; } string NodeConstant::exec(SPtr msg) { return value; } #endif /* NODECONSTANT_CPP_ */ dibbler-1.0.1/SrvCfgMgr/SrvParser.y0000644000175000017500000016134412556512005014030 00000000000000%name SrvParser %header{ #include #include #include #include #include "Portable.h" #include "DHCPConst.h" #include "SmartPtr.h" #include "Container.h" #include "SrvParser.h" #include "SrvParsGlobalOpt.h" #include "SrvParsClassOpt.h" #include "SrvParsIfaceOpt.h" #include "OptAddr.h" #include "OptAddrLst.h" #include "OptDomainLst.h" #include "OptString.h" #include "OptVendorSpecInfo.h" #include "OptRtPrefix.h" #include "SrvOptAddrParams.h" #include "SrvCfgMgr.h" #include "SrvCfgTA.h" #include "SrvCfgPD.h" #include "SrvCfgClientClass.h" #include "SrvCfgAddrClass.h" #include "SrvCfgIface.h" #include "SrvCfgOptions.h" #include "DUID.h" #include "Logger.h" #include "FQDN.h" #include "Key.h" #include "Node.h" #include "NodeConstant.h" #include "NodeClientSpecific.h" #include "NodeOperator.h" using namespace std; #define YY_USE_CLASS %} %{ #include "FlexLexer.h" %} // class definition %define MEMBERS FlexLexer * lex; \ List(TSrvParsGlobalOpt) ParserOptStack; /* list of parsed interfaces/IAs/addrs */ \ List(TSrvCfgIface) SrvCfgIfaceLst; /* list of SrvCfg interfaces */ \ List(TSrvCfgAddrClass) SrvCfgAddrClassLst; /* list of SrvCfg address classes */ \ List(TSrvCfgTA) SrvCfgTALst; /* list of SrvCfg TA objects */ \ List(TSrvCfgPD) SrvCfgPDLst; /* list of SrvCfg PD objects */ \ List(TSrvCfgClientClass) SrvCfgClientClassLst; /* list of SrvCfgClientClass objs */ \ List(TIPv6Addr) PresentAddrLst; /* address list (used for DNS,NTP,etc.)*/ \ List(std::string) PresentStringLst; /* string list */ \ List(Node) NodeClientClassLst; /* Node list */ \ List(TFQDN) PresentFQDNLst; \ SPtr addr; \ SPtr CurrentKey; \ DigestTypesLst DigestLst; \ List(THostRange) PresentRangeLst; \ List(THostRange) PDLst; \ List(TSrvCfgOptions) ClientLst; \ int PDPrefix; \ bool IfaceDefined(int ifaceNr); \ bool IfaceDefined(string ifaceName); \ bool StartIfaceDeclaration(string iface); \ bool StartIfaceDeclaration(int ifindex); \ bool EndIfaceDeclaration(); \ void StartClassDeclaration(); \ bool EndClassDeclaration(); \ SPtr getRangeMin(char * addrPacked, int prefix); \ SPtr getRangeMax(char * addrPacked, int prefix); \ void StartTAClassDeclaration(); \ bool EndTAClassDeclaration(); \ void StartPDDeclaration(); \ bool EndPDDeclaration(); \ TSrvCfgMgr * CfgMgr; \ SPtr nextHop; \ virtual ~SrvParser(); // constructor %define CONSTRUCTOR_PARAM yyFlexLexer * lex %define CONSTRUCTOR_CODE \ ParserOptStack.append(new TSrvParsGlobalOpt()); \ this->lex = lex; \ CfgMgr = 0; \ nextHop.reset(); \ yynerrs = 0; \ yychar = 0; \ PDPrefix = 0; %union { unsigned int ival; char *strval; struct SDuid { int length; char* duid; } duidval; char addrval[16]; } %token IFACE_, RELAY_, IFACE_ID_, IFACE_ID_ORDER_, CLASS_, TACLASS_ %token LOGNAME_, LOGLEVEL_, LOGMODE_, LOGCOLORS_, WORKDIR_ %token OPTION_, DNS_SERVER_,DOMAIN_, NTP_SERVER_,TIME_ZONE_, SIP_SERVER_, SIP_DOMAIN_ %token NIS_SERVER_, NIS_DOMAIN_, NISP_SERVER_, NISP_DOMAIN_, LIFETIME_ %token FQDN_, ACCEPT_UNKNOWN_FQDN_, FQDN_DDNS_ADDRESS_, DDNS_PROTOCOL_, DDNS_TIMEOUT_ %token ACCEPT_ONLY_,REJECT_CLIENTS_,POOL_, SHARE_ %token T1_,T2_,PREF_TIME_,VALID_TIME_ %token UNICAST_, DROP_UNICAST_, PREFERENCE_,RAPID_COMMIT_ %token IFACE_MAX_LEASE_, CLASS_MAX_LEASE_, CLNT_MAX_LEASE_ %token STATELESS_ %token CACHE_SIZE_ %token PDCLASS_, PD_LENGTH_, PD_POOL_ %token SCRIPT_ %token VENDOR_SPEC_ %token CLIENT_, DUID_KEYWORD_, REMOTE_ID_, LINK_LOCAL_, ADDRESS_, PREFIX_, GUESS_MODE_ %token INACTIVE_MODE_ %token EXPERIMENTAL_, ADDR_PARAMS_, REMOTE_AUTOCONF_NEIGHBORS_ %token AFTR_, PERFORMANCE_MODE_ %token AUTH_PROTOCOL_, AUTH_ALGORITHM_, AUTH_REPLAY_, AUTH_METHODS_ %token AUTH_DROP_UNAUTH_, AUTH_REALM_ %token KEY_, SECRET_, ALGORITHM_, FUDGE_ %token DIGEST_NONE_, DIGEST_PLAIN_, DIGEST_HMAC_MD5_, DIGEST_HMAC_SHA1_, DIGEST_HMAC_SHA224_ %token DIGEST_HMAC_SHA256_, DIGEST_HMAC_SHA384_, DIGEST_HMAC_SHA512_ %token ACCEPT_LEASEQUERY_ %token BULKLQ_ACCEPT_, BULKLQ_TCPPORT_, BULKLQ_MAX_CONNS_, BULKLQ_TIMEOUT_ %token CLIENT_CLASS_ %token MATCH_IF_ %token EQ_, AND_, OR_ %token CLIENT_VENDOR_SPEC_ENTERPRISE_NUM_ %token CLIENT_VENDOR_SPEC_DATA_ %token CLIENT_VENDOR_CLASS_EN_ %token CLIENT_VENDOR_CLASS_DATA_ %token RECONFIGURE_ENABLED_ %token ALLOW_ %token DENY_ %token SUBSTRING_, STRING_KEYWORD_, ADDRESS_LIST_ %token CONTAIN_ %token NEXT_HOP_, ROUTE_, INFINITE_ %token SUBNET_ %token STRING_ %token HEXNUMBER_ %token INTNUMBER_ %token IPV6ADDR_ %token DUID_ %type Number %% ///////////////////////////////////////////////////////////////////////////// // rules section ///////////////////////////////////////////////////////////////////////////// Grammar : GlobalDeclarationList | ; GlobalDeclarationList : GlobalOption | InterfaceDeclaration | GlobalDeclarationList GlobalOption | GlobalDeclarationList InterfaceDeclaration ; GlobalOption : InterfaceOptionDeclaration | LogModeOption | LogLevelOption | LogNameOption | LogColors | WorkDirOption | StatelessOption | CacheSizeOption | AuthProtocol | AuthAlgorithm | AuthReplay | AuthRealm | AuthMethods | AuthDropUnauthenticated | Experimental | IfaceIDOrder | FqdnDdnsAddress | DdnsProtocol | DdnsTimeout | GuessMode | ClientClass | Key | ScriptName | PerformanceMode | ReconfigureEnabled | DropUnicast ; InterfaceOptionDeclaration : ClassOptionDeclaration | RelayOption | InterfaceIDOption | AcceptLeaseQuery | BulkLeaseQueryAccept | BulkLeaseQueryTcpPort | BulkLeaseQueryMaxConns | BulkLeaseQueryTimeout | UnicastAddressOption | PreferenceOption | RapidCommitOption | IfaceMaxLeaseOption | ClntMaxLeaseOption | DNSServerOption | DomainOption | NTPServerOption | TimeZoneOption | SIPServerOption | SIPDomainOption | FQDNOption | AcceptUnknownFQDN | NISServerOption | NISDomainOption | NISPServerOption | NISPDomainOption | DsLiteAftrName | LifetimeOption | ExtraOption | RemoteAutoconfNeighborsOption | PDDeclaration | VendorSpecOption | Client | InactiveMode | Subnet ; InterfaceDeclaration /* iface eth0 { ... } */ :IFACE_ STRING_ '{' { if (!StartIfaceDeclaration($2)) YYABORT; } InterfaceDeclarationsList '}' { //Information about new interface has been read //Add it to list of read interfaces delete [] $2; EndIfaceDeclaration(); } /* iface 5 { ... } */ |IFACE_ Number '{' { if (!StartIfaceDeclaration($2)) YYABORT; } InterfaceDeclarationsList '}' { EndIfaceDeclaration(); } InterfaceDeclarationsList : InterfaceOptionDeclaration | InterfaceDeclarationsList InterfaceOptionDeclaration | ClassDeclaration | TAClassDeclaration | NextHopDeclaration | Route | InterfaceDeclarationsList TAClassDeclaration | InterfaceDeclarationsList ClassDeclaration | InterfaceDeclarationsList NextHopDeclaration | InterfaceDeclarationsList Route ; Key : KEY_ STRING_ '{' { /// this is key object initialization part CurrentKey = new TSIGKey(string($2)); } KeyOptions '}' { /// check that both secret and algorithm keywords were defined. Log(Debug) << "Loaded key '" << CurrentKey->Name_ << "', base64len is " << CurrentKey->getBase64Data().length() << ", rawlen is " << CurrentKey->getPackedData().length() << "." << LogEnd; if (CurrentKey->getPackedData().length() == 0) { Log(Crit) << "Key " << CurrentKey->Name_ << " does not have secret specified." << LogEnd; YYABORT; } if ( (CurrentKey->Digest_ != DIGEST_HMAC_MD5) && (CurrentKey->Digest_ != DIGEST_HMAC_SHA1) && (CurrentKey->Digest_ != DIGEST_HMAC_SHA256) ) { Log(Crit) << "Invalid key type specified: only hmac-md5, hmac-sha1 and " << "hmac-sha256 are supported." << LogEnd; YYABORT; } #if !defined(MOD_SRV_DISABLE_DNSUPDATE) && !defined(MOD_CLNT_DISABLE_DNSUPDATE) CfgMgr->addKey( CurrentKey ); #else Log(Crit) << "DNS Update disabled at compilation time. Can't specify TSIG key." << LogEnd; #endif } ';' ; KeyOptions :KeyOption |KeyOptions KeyOption ; KeyOption :KeyAlgorithm |KeySecret |KeyFudge ; KeySecret : SECRET_ STRING_ ';' { // store the key in base64 encoded form CurrentKey->setData(string($2)); }; KeyFudge : FUDGE_ Number ';' { CurrentKey->Fudge_ = $2; } KeyAlgorithm : ALGORITHM_ DIGEST_HMAC_SHA256_ ';' { CurrentKey->Digest_ = DIGEST_HMAC_SHA256; } | ALGORITHM_ DIGEST_HMAC_SHA1_ ';' { CurrentKey->Digest_ = DIGEST_HMAC_SHA1; } | ALGORITHM_ DIGEST_HMAC_MD5_ ';' { CurrentKey->Digest_ = DIGEST_HMAC_MD5; } ; /// add other key types here Client : CLIENT_ DUID_KEYWORD_ DUID_ '{' { ParserOptStack.append(new TSrvParsGlobalOpt()); SPtr duid = new TDUID($3.duid,$3.length); ClientLst.append(new TSrvCfgOptions(duid)); } ClientOptions '}' { Log(Debug) << "Exception: DUID-based exception specified." << LogEnd; // copy all defined options ClientLst.getLast()->setOptions(ParserOptStack.getLast()); ParserOptStack.delLast(); } | CLIENT_ REMOTE_ID_ Number '-' DUID_ '{' { ParserOptStack.append(new TSrvParsGlobalOpt()); SPtr remoteid = new TOptVendorData($3, $5.duid, $5.length, 0); ClientLst.append(new TSrvCfgOptions(remoteid)); } ClientOptions '}' { Log(Debug) << "Exception: RemoteID-based exception specified." << LogEnd; // copy all defined options ClientLst.getLast()->setOptions(ParserOptStack.getLast()); ParserOptStack.delLast(); } | CLIENT_ LINK_LOCAL_ IPV6ADDR_ '{' { ParserOptStack.append(new TSrvParsGlobalOpt()); SPtr clntaddr = new TIPv6Addr($3); ClientLst.append(new TSrvCfgOptions(clntaddr)); } ClientOptions '}' { Log(Debug) << "Exception: Link-local-based exception specified." << LogEnd; // copy all defined options ClientLst.getLast()->setOptions(ParserOptStack.getLast()); ParserOptStack.delLast(); }; ClientOptions : ClientOption | ClientOptions ClientOption ; ClientOption : DNSServerOption | DomainOption | NTPServerOption | TimeZoneOption | SIPServerOption | SIPDomainOption | NISServerOption | NISDomainOption | NISPServerOption | NISPDomainOption | LifetimeOption | VendorSpecOption | ExtraOption | DsLiteAftrName | AddressReservation | PrefixReservation ; AddressReservation: ADDRESS_ IPV6ADDR_ { addr = new TIPv6Addr($2); Log(Info) << "Exception: Address " << addr->getPlain() << " reserved." << LogEnd; ClientLst.getLast()->setAddr(addr); }; PrefixReservation: PREFIX_ IPV6ADDR_ '/' Number { addr = new TIPv6Addr($2); Log(Info) << "Exception: Prefix " << addr->getPlain() << "/" << $4 << " reserved." << LogEnd; ClientLst.getLast()->setPrefix(addr, $4); } /* class { ... } */ ClassDeclaration: CLASS_ '{' { StartClassDeclaration(); } ClassOptionDeclarationsList '}' { if (!EndClassDeclaration()) YYABORT; } ; ClassOptionDeclarationsList : ClassOptionDeclaration | ClassOptionDeclarationsList ClassOptionDeclaration ; /* ta-class { ... } */ TAClassDeclaration :TACLASS_ '{' { StartTAClassDeclaration(); } TAClassOptionsList '}' { if (!EndTAClassDeclaration()) YYABORT; } ; TAClassOptionsList : TAClassOption | TAClassOptionsList TAClassOption ; TAClassOption : PreferredTimeOption | ValidTimeOption | PoolOption | ClassMaxLeaseOption | RejectClientsOption | AcceptOnlyOption | AllowClientClassDeclaration | DenyClientClassDeclaration ; PDDeclaration :PDCLASS_ '{' { StartPDDeclaration(); } PDOptionsList '}' { if (!EndPDDeclaration()) YYABORT; } ; PDOptionsList : PDOptions | PDOptions PDOptionsList PDOptions : PDLength | PDPoolOption | ValidTimeOption | PreferredTimeOption | T1Option | T2Option | AllowClientClassDeclaration | DenyClientClassDeclaration ; //////////////////////////////////////////////////////////// /// Route Option /////////////////////////////////////////// //////////////////////////////////////////////////////////// NextHopDeclaration: NEXT_HOP_ IPV6ADDR_ '{' { SPtr routerAddr = new TIPv6Addr($2); SPtr myNextHop = new TOptAddr(OPTION_NEXT_HOP, routerAddr, NULL); nextHop = myNextHop; } RouteList '}' { ParserOptStack.getLast()->addExtraOption(nextHop, false); nextHop.reset(); } | NEXT_HOP_ IPV6ADDR_ { SPtr routerAddr = new TIPv6Addr($2); SPtr myNextHop = new TOptAddr(OPTION_NEXT_HOP, routerAddr, NULL); ParserOptStack.getLast()->addExtraOption(myNextHop, false); } ; RouteList : Route | RouteList Route ; Route: ROUTE_ IPV6ADDR_ '/' INTNUMBER_ LIFETIME_ INTNUMBER_ { SPtr prefix = new TIPv6Addr($2); SPtr rtPrefix = new TOptRtPrefix($6, $4, 42, prefix, NULL); if (nextHop) nextHop->addOption(rtPrefix); else ParserOptStack.getLast()->addExtraOption(rtPrefix, false); } | ROUTE_ IPV6ADDR_ '/' INTNUMBER_ { SPtr prefix = new TIPv6Addr($2); SPtr rtPrefix = new TOptRtPrefix(DHCPV6_INFINITY, $4, 42, prefix, NULL); if (nextHop) nextHop->addOption(rtPrefix); else ParserOptStack.getLast()->addExtraOption(rtPrefix, false); } | ROUTE_ IPV6ADDR_ '/' INTNUMBER_ LIFETIME_ INFINITE_ { SPtr prefix = new TIPv6Addr($2); SPtr rtPrefix = new TOptRtPrefix(DHCPV6_INFINITY, $4, 42, prefix, NULL); if (nextHop) nextHop->addOption(rtPrefix); else ParserOptStack.getLast()->addExtraOption(rtPrefix, false); }; AuthProtocol : AUTH_PROTOCOL_ STRING_ { #ifndef MOD_DISABLE_AUTH if (!strcasecmp($2,"none")) { CfgMgr->setAuthProtocol(AUTH_PROTO_NONE); CfgMgr->setAuthAlgorithm(AUTH_ALGORITHM_NONE); } else if (!strcasecmp($2, "delayed")) { CfgMgr->setAuthProtocol(AUTH_PROTO_DELAYED); } else if (!strcasecmp($2, "reconfigure-key")) { CfgMgr->setAuthProtocol(AUTH_PROTO_RECONFIGURE_KEY); CfgMgr->setAuthAlgorithm(AUTH_ALGORITHM_RECONFIGURE_KEY); } else if (!strcasecmp($2, "dibbler")) { CfgMgr->setAuthProtocol(AUTH_PROTO_DIBBLER); } else { Log(Crit) << "Invalid auth-protocol parameter: " << string($2) << LogEnd; YYABORT; } #else Log(Crit) << "Auth support disabled at compilation time." << LogEnd; #endif }; AuthAlgorithm : AUTH_ALGORITHM_ STRING_ { Log(Crit) << "auth-algorithm secification is not supported yet." << LogEnd; YYABORT; }; AuthReplay : AUTH_REPLAY_ STRING_ { #ifndef MOD_DISABLE_AUTH if (strcasecmp($2, "none")) { CfgMgr->setAuthReplay(AUTH_REPLAY_NONE); } else if (strcasecmp($2, "monotonic")) { CfgMgr->setAuthReplay(AUTH_REPLAY_MONOTONIC); } else { Log(Crit) << "Invalid auth-replay parameter: " << string($2) << LogEnd; YYABORT; } #else Log(Crit) << "Auth support disabled at compilation time." << LogEnd; #endif }; AuthRealm : AUTH_REALM_ STRING_ { #ifndef MOD_DISABLE_AUTH CfgMgr->setAuthRealm(std::string($2)); #else Log(Crit) << "Auth support disabled at compilation time." << LogEnd; #endif }; AuthMethods : AUTH_METHODS_ { DigestLst.clear(); } DigestList { #ifndef MOD_DISABLE_AUTH CfgMgr->setAuthDigests(DigestLst); CfgMgr->setAuthDropUnauthenticated(true); DigestLst.clear(); #else Log(Crit) << "Auth support disabled at compilation time." << LogEnd; #endif } DigestList : Digest | DigestList ',' Digest ; Digest : DIGEST_NONE_ { DigestLst.push_back(DIGEST_NONE); } | DIGEST_PLAIN_ { DigestLst.push_back(DIGEST_PLAIN); } | DIGEST_HMAC_MD5_ { DigestLst.push_back(DIGEST_HMAC_MD5); } | DIGEST_HMAC_SHA1_ { DigestLst.push_back(DIGEST_HMAC_SHA1); } | DIGEST_HMAC_SHA224_ { DigestLst.push_back(DIGEST_HMAC_SHA224); } | DIGEST_HMAC_SHA256_ { DigestLst.push_back(DIGEST_HMAC_SHA256); } | DIGEST_HMAC_SHA384_ { DigestLst.push_back(DIGEST_HMAC_SHA384); } | DIGEST_HMAC_SHA512_ { DigestLst.push_back(DIGEST_HMAC_SHA512); } ; AuthDropUnauthenticated : AUTH_DROP_UNAUTH_ Number { #ifndef MOD_DISABLE_AUTH CfgMgr->setAuthDropUnauthenticated($2); #else Log(Crit) << "Auth support disabled at compilation time." << LogEnd; #endif } ///////////////////////////////////////////////////////////////////////////// // Now Options and their parameters ///////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////// // Parameters for FQDN Options // /////////////////////////////////////////////////// FQDNList : STRING_ { Log(Notice)<< "FQDN: The client "<<$1<<" has no address nor DUID"<getPlain()<getPlain() << LogEnd; PresentFQDNLst.append(new TFQDN( duidNew, $3,false)); } | FQDNList ',' STRING_ '-' IPV6ADDR_ { addr = new TIPv6Addr($5); Log(Debug)<< "FQDN:" << $3<<" reserved for address "<< addr->getPlain() << LogEnd; PresentFQDNLst.append(new TFQDN(new TIPv6Addr($5), $3,false)); } ; Number : HEXNUMBER_ {$$=$1;} | INTNUMBER_ {$$=$1;} ; ADDRESSList : IPV6ADDR_ { PresentAddrLst.append(new TIPv6Addr($1)); } | ADDRESSList ',' IPV6ADDR_ { PresentAddrLst.append(new TIPv6Addr($3)); } ; VendorSpecList : Number '-' Number '-' DUID_ { Log(Debug) << "Vendor-spec defined: Enterprise: " << $1 << ", optionCode: " << $3 << ", valuelen=" << $5.length << LogEnd; ParserOptStack.getLast()->addExtraOption(new TOptVendorSpecInfo(OPTION_VENDOR_OPTS, $1, $3, $5.duid, $5.length, 0), false); } | Number '-' Number '-' IPV6ADDR_ { SPtr addr(new TIPv6Addr($5)); Log(Debug) << "Vendor-spec defined: Enterprise: " << $1 << ", optionCode: " << $3 << ", value=" << addr->getPlain() << LogEnd; ParserOptStack.getLast()->addExtraOption(new TOptVendorSpecInfo(OPTION_VENDOR_OPTS, $1, $3, new TIPv6Addr($5), 0), false); } | Number '-' Number '-' STRING_ { Log(Debug) << "Vendor-spec defined: Enterprise: " << $1 << ", optionCode: " << $3 << ", valuelen=" << strlen($5) << LogEnd; ParserOptStack.getLast()->addExtraOption(new TOptVendorSpecInfo(OPTION_VENDOR_OPTS, $1, $3, $5, 0), false); } | VendorSpecList ',' Number '-' Number '-' DUID_ { Log(Debug) << "Vendor-spec defined: Enterprise: " << $3 << ", optionCode: " << $5 << ", valuelen=" << $7.length << LogEnd; ParserOptStack.getLast()->addExtraOption(new TOptVendorSpecInfo(OPTION_VENDOR_OPTS, $3, $5, $7.duid, $7.length, 0), false); } | VendorSpecList ',' Number '-' Number '-' IPV6ADDR_ { SPtr addr(new TIPv6Addr($7)); Log(Debug) << "Vendor-spec defined: Enterprise: " << $3 << ", optionCode: " << $5 << ", value=" << addr->getPlain() << LogEnd; ParserOptStack.getLast()->addExtraOption(new TOptVendorSpecInfo(OPTION_VENDOR_OPTS, $3, $5, addr, 0), false); } | VendorSpecList ',' Number '-' Number '-' STRING_ { Log(Debug) << "Vendor-spec defined: Enterprise: " << $3 << ", optionCode: " << $5 << ", valuelen=" << strlen($7) << LogEnd; ParserOptStack.getLast()->addExtraOption(new TOptVendorSpecInfo(OPTION_VENDOR_OPTS, $3, $5, $7, 0), false); } ; StringList : STRING_ { PresentStringLst.append(SPtr (new string($1))); } | StringList ',' STRING_ { PresentStringLst.append(SPtr (new string($3))); } ; ADDRESSRangeList : IPV6ADDR_ { PresentRangeLst.append(new THostRange(new TIPv6Addr($1),new TIPv6Addr($1))); } | IPV6ADDR_ '-' IPV6ADDR_ { SPtr addr1(new TIPv6Addr($1)); SPtr addr2(new TIPv6Addr($3)); if (*addr1<=*addr2) PresentRangeLst.append(new THostRange(addr1,addr2)); else PresentRangeLst.append(new THostRange(addr2,addr1)); } | IPV6ADDR_ '/' INTNUMBER_ { SPtr addr(new TIPv6Addr($1)); int prefix = $3; if ( (prefix<1) || (prefix>128)) { Log(Crit) << "Invalid prefix defined: " << prefix << " in line " << lex->lineno() << ". Allowed range: 1..128." << LogEnd; YYABORT; } SPtr addr1 = this->getRangeMin($1, prefix); SPtr addr2 = this->getRangeMax($1, prefix); if (*addr1<=*addr2) PresentRangeLst.append(new THostRange(addr1,addr2)); else PresentRangeLst.append(new THostRange(addr2,addr1)); } | ADDRESSRangeList ',' IPV6ADDR_ { PresentRangeLst.append(new THostRange(new TIPv6Addr($3),new TIPv6Addr($3))); } | ADDRESSRangeList ',' IPV6ADDR_ '-' IPV6ADDR_ { SPtr addr1(new TIPv6Addr($3)); SPtr addr2(new TIPv6Addr($5)); if (*addr1<=*addr2) PresentRangeLst.append(new THostRange(addr1,addr2)); else PresentRangeLst.append(new THostRange(addr2,addr1)); } ; PDRangeList : IPV6ADDR_ '/' INTNUMBER_ { SPtr addr(new TIPv6Addr($1)); int prefix = $3; if ( (prefix<1) || (prefix>128)) { Log(Crit) << "Invalid prefix defined: " << prefix << " in line " << lex->lineno() << ". Allowed range: 1..128." << LogEnd; YYABORT; } SPtr addr1 = this->getRangeMin($1, prefix); SPtr addr2 = this->getRangeMax($1, prefix); SPtr range; if (*addr1<=*addr2) range = new THostRange(addr1,addr2); else range = new THostRange(addr2,addr1); range->setPrefixLength(prefix); PDLst.append(range); } ; ADDRESSDUIDRangeList : IPV6ADDR_ { PresentRangeLst.append(new THostRange(new TIPv6Addr($1),new TIPv6Addr($1))); } | IPV6ADDR_ '-' IPV6ADDR_ { SPtr addr1(new TIPv6Addr($1)); SPtr addr2(new TIPv6Addr($3)); if (*addr1<=*addr2) PresentRangeLst.append(new THostRange(addr1,addr2)); else PresentRangeLst.append(new THostRange(addr2,addr1)); } | ADDRESSDUIDRangeList ',' IPV6ADDR_ { PresentRangeLst.append(new THostRange(new TIPv6Addr($3),new TIPv6Addr($3))); } | ADDRESSDUIDRangeList ',' IPV6ADDR_ '-' IPV6ADDR_ { SPtr addr1(new TIPv6Addr($3)); SPtr addr2(new TIPv6Addr($5)); if (*addr1<=*addr2) PresentRangeLst.append(new THostRange(addr1,addr2)); else PresentRangeLst.append(new THostRange(addr2,addr1)); } | DUID_ { SPtr duid(new TDUID($1.duid, $1.length)); PresentRangeLst.append(new THostRange(duid, duid)); delete $1.duid; } | DUID_ '-' DUID_ { SPtr duid1(new TDUID($1.duid,$1.length)); SPtr duid2(new TDUID($3.duid,$3.length)); if (*duid1<=*duid2) PresentRangeLst.append(new THostRange(duid1,duid2)); else PresentRangeLst.append(new THostRange(duid2,duid1)); /// @todo: delete [] $1.duid; delete [] $3.duid? } | ADDRESSDUIDRangeList ',' DUID_ { SPtr duid(new TDUID($3.duid, $3.length)); PresentRangeLst.append(new THostRange(duid, duid)); delete $3.duid; } | ADDRESSDUIDRangeList ',' DUID_ '-' DUID_ { SPtr duid2(new TDUID($3.duid,$3.length)); SPtr duid1(new TDUID($5.duid,$5.length)); if (*duid1<=*duid2) PresentRangeLst.append(new THostRange(duid1,duid2)); else PresentRangeLst.append(new THostRange(duid2,duid1)); delete $3.duid; delete $5.duid; } ; RejectClientsOption : REJECT_CLIENTS_ { PresentRangeLst.clear(); } ADDRESSDUIDRangeList { ParserOptStack.getLast()->setRejedClnt(&PresentRangeLst); } ; AcceptOnlyOption : ACCEPT_ONLY_ { PresentRangeLst.clear(); } ADDRESSDUIDRangeList { ParserOptStack.getLast()->setAcceptClnt(&PresentRangeLst); } ; PoolOption : POOL_ { PresentRangeLst.clear(); } ADDRESSRangeList { ParserOptStack.getLast()->setPool(&PresentRangeLst); } ; PDPoolOption : PD_POOL_ { } PDRangeList { ParserOptStack.getLast()->setPool(&PresentRangeLst/*PDList*/); } ; PDLength : PD_LENGTH_ Number { if ( (($2) > 128) || (($2) < 1) ) { Log(Crit) << "Invalid pd-length:" << $2 << ", allowed range is 1..128." << LogEnd; YYABORT; } this->PDPrefix = $2; } ; PreferredTimeOption : PREF_TIME_ Number { ParserOptStack.getLast()->setPrefBeg($2); ParserOptStack.getLast()->setPrefEnd($2); } | PREF_TIME_ Number '-' Number { ParserOptStack.getLast()->setPrefBeg($2); ParserOptStack.getLast()->setPrefEnd($4); } ; ValidTimeOption : VALID_TIME_ Number { ParserOptStack.getLast()->setValidBeg($2); ParserOptStack.getLast()->setValidEnd($2); } | VALID_TIME_ Number '-' Number { ParserOptStack.getLast()->setValidBeg($2); ParserOptStack.getLast()->setValidEnd($4); } ; ShareOption : SHARE_ Number { int x=$2; if ( (x<1) || (x>1000)) { Log(Crit) << "Invalid share value: " << x << " in line " << lex->lineno() << ". Allowed range: 1..1000." << LogEnd; YYABORT; } ParserOptStack.getLast()->setShare(x); } T1Option : T1_ Number { ParserOptStack.getLast()->setT1Beg($2); ParserOptStack.getLast()->setT1End($2); } | T1_ Number '-' Number { ParserOptStack.getLast()->setT1Beg($2); ParserOptStack.getLast()->setT1End($4); } ; T2Option : T2_ Number { ParserOptStack.getLast()->setT2Beg($2); ParserOptStack.getLast()->setT2End($2); } | T2_ Number '-' Number { ParserOptStack.getLast()->setT2Beg($2); ParserOptStack.getLast()->setT2End($4); } ; ClntMaxLeaseOption : CLNT_MAX_LEASE_ Number { ParserOptStack.getLast()->setClntMaxLease($2); } ; ClassMaxLeaseOption : CLASS_MAX_LEASE_ Number { ParserOptStack.getLast()->setClassMaxLease($2); } ; AddrParams : ADDR_PARAMS_ Number { if (!ParserOptStack.getLast()->getExperimental()) { Log(Crit) << "Experimental 'addr-params' defined, but experimental " << "features are disabled. Add 'experimental' " << "in global section of server.conf to enable it." << LogEnd; YYABORT; } int bitfield = ADDRPARAMS_MASK_PREFIX; Log(Warning) << "Experimental addr-params added (prefix=" << $2 << ", bitfield=" << bitfield << ")." << LogEnd; ParserOptStack.getLast()->setAddrParams($2,bitfield); }; DsLiteAftrName : OPTION_ AFTR_ STRING_ { SPtr tunnelName = new TOptDomainLst(OPTION_AFTR_NAME, $3, 0); Log(Debug) << "Enabling DS-Lite tunnel option, AFTR name=" << $3 << LogEnd; ParserOptStack.getLast()->addExtraOption(tunnelName, false); }; ExtraOption :OPTION_ Number DUID_KEYWORD_ DUID_ { SPtr opt = new TOptGeneric($2, $4.duid, $4.length, 0); ParserOptStack.getLast()->addExtraOption(opt, false); Log(Debug) << "Extra option defined: code=" << $2 << ", length=" << $4.length << LogEnd; } |OPTION_ Number ADDRESS_ IPV6ADDR_ { SPtr addr(new TIPv6Addr($4)); SPtr opt = new TOptAddr($2, addr, 0); ParserOptStack.getLast()->addExtraOption(opt, false); Log(Debug) << "Extra option defined: code=" << $2 << ", address=" << addr->getPlain() << LogEnd; } |OPTION_ Number ADDRESS_LIST_ { PresentAddrLst.clear(); } ADDRESSList { SPtr opt = new TOptAddrLst($2, PresentAddrLst, 0); ParserOptStack.getLast()->addExtraOption(opt, false); Log(Debug) << "Extra option defined: code=" << $2 << ", address count=" << PresentAddrLst.count() << LogEnd; } |OPTION_ Number STRING_KEYWORD_ STRING_ { SPtr opt = new TOptString($2, string($4), 0); ParserOptStack.getLast()->addExtraOption(opt, false); Log(Debug) << "Extra option defined: code=" << $2 << ", string=" << $4 << LogEnd; }; RemoteAutoconfNeighborsOption :OPTION_ REMOTE_AUTOCONF_NEIGHBORS_ { if (!ParserOptStack.getLast()->getExperimental()) { Log(Crit) << "Experimental 'remote autoconf neighbors' defined, but " << "experimental features are disabled. Add 'experimental' " << "in global section of server.conf to enable it." << LogEnd; YYABORT; } PresentAddrLst.clear(); } ADDRESSList { SPtr opt = new TOptAddrLst(OPTION_NEIGHBORS, PresentAddrLst, 0); ParserOptStack.getLast()->addExtraOption(opt, false); Log(Debug) << "Remote autoconf neighbors enabled (" << PresentAddrLst.count() << " neighbors defined.)" << LogEnd; } IfaceMaxLeaseOption : IFACE_MAX_LEASE_ Number { ParserOptStack.getLast()->setIfaceMaxLease($2); } ; UnicastAddressOption : UNICAST_ IPV6ADDR_ { ParserOptStack.getLast()->setUnicast(new TIPv6Addr($2)); } ; DropUnicast : DROP_UNICAST_ { CfgMgr->dropUnicast(true); } RapidCommitOption : RAPID_COMMIT_ Number { if ( ($2!=0) && ($2!=1)) { Log(Crit) << "RAPID-COMMIT parameter in line " << lex->lineno() << " must have 0 or 1 value." << LogEnd; YYABORT; } if (yyvsp[0].ival==1) ParserOptStack.getLast()->setRapidCommit(true); else ParserOptStack.getLast()->setRapidCommit(false); } ; PreferenceOption : PREFERENCE_ Number { if (($2<0)||($2>255)) { Log(Crit) << "Preference value (" << $2 << ") in line " << lex->lineno() << " is out of range [0..255]." << LogEnd; YYABORT; } ParserOptStack.getLast()->setPreference($2); } ; LogLevelOption : LOGLEVEL_ Number { logger::setLogLevel($2); } ; LogModeOption : LOGMODE_ STRING_ { logger::setLogMode($2); } LogNameOption : LOGNAME_ STRING_ { logger::setLogName($2); } ; LogColors : LOGCOLORS_ Number { logger::setColors($2==1); } WorkDirOption : WORKDIR_ STRING_ { ParserOptStack.getLast()->setWorkDir($2); } ; StatelessOption : STATELESS_ { ParserOptStack.getLast()->setStateless(true); } ; GuessMode : GUESS_MODE_ { Log(Info) << "Guess-mode enabled: relay interfaces may be loosely " << "defined (matching interface-id is not mandatory)." << LogEnd; ParserOptStack.getLast()->setGuessMode(true); }; ScriptName : SCRIPT_ STRING_ { CfgMgr->setScriptName($2); }; PerformanceMode : PERFORMANCE_MODE_ Number { if (!ParserOptStack.getLast()->getExperimental()) { Log(Crit) << "Experimental 'performance-mode' defined, but experimental " << "features are disabled. Add 'experimental' " << "in global section of server.conf to enable it." << LogEnd; YYABORT; } CfgMgr->setPerformanceMode($2); }; ReconfigureEnabled : RECONFIGURE_ENABLED_ Number { switch ($2) { case 0: case 1: CfgMgr->setReconfigureSupport($2); break; default: Log(Crit) << "Invalid reconfigure-enabled value " << $2 << ", only 0 and 1 are supported." << LogEnd; YYABORT; } }; InactiveMode : INACTIVE_MODE_ { ParserOptStack.getLast()->setInactiveMode(true); }; Experimental : EXPERIMENTAL_ { Log(Crit) << "Experimental features are allowed." << LogEnd; ParserOptStack.getLast()->setExperimental(true); }; IfaceIDOrder :IFACE_ID_ORDER_ STRING_ { if (!strncasecmp($2,"before",6)) { ParserOptStack.getLast()->setInterfaceIDOrder(SRV_IFACE_ID_ORDER_BEFORE); } else if (!strncasecmp($2,"after",5)) { ParserOptStack.getLast()->setInterfaceIDOrder(SRV_IFACE_ID_ORDER_AFTER); } else if (!strncasecmp($2,"omit",4)) { ParserOptStack.getLast()->setInterfaceIDOrder(SRV_IFACE_ID_ORDER_NONE); } else { Log(Crit) << "Invalid interface-id-order specified. Allowed " << "values: before, after, omit" << LogEnd; YYABORT; } }; CacheSizeOption : CACHE_SIZE_ Number { ParserOptStack.getLast()->setCacheSize($2); } ; //////////////////////////////////////////////////////////////////////// /// LEASE-QUERY (regular and bulk) ///////////////////////////////////// //////////////////////////////////////////////////////////////////////// AcceptLeaseQuery : ACCEPT_LEASEQUERY_ { ParserOptStack.getLast()->setLeaseQuerySupport(true); } | ACCEPT_LEASEQUERY_ Number { switch ($2) { case 0: ParserOptStack.getLast()->setLeaseQuerySupport(false); break; case 1: ParserOptStack.getLast()->setLeaseQuerySupport(true); break; default: Log(Crit) << "Invalid value of accept-leasequery specifed. Allowed " << "values: 0, 1, yes, no, true, false" << LogEnd; YYABORT; } }; BulkLeaseQueryAccept : BULKLQ_ACCEPT_ Number { if ($2!=0 && $2!=1) { Log(Error) << "Invalid bulk-leasequery-accept value: " << ($2) << ", 0 or 1 expected." << LogEnd; YYABORT; } CfgMgr->bulkLQAccept( (bool) $2); }; BulkLeaseQueryTcpPort : BULKLQ_TCPPORT_ Number { CfgMgr->bulkLQTcpPort( $2 ); } BulkLeaseQueryMaxConns : BULKLQ_MAX_CONNS_ Number { CfgMgr->bulkLQMaxConns( $2 ); }; BulkLeaseQueryTimeout : BULKLQ_TIMEOUT_ Number { CfgMgr->bulkLQTimeout( $2 ); }; //////////////////////////////////////////////////////////////////////// /// RELAY ////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// RelayOption :RELAY_ STRING_ { ParserOptStack.getLast()->setRelayName($2); } |RELAY_ Number { ParserOptStack.getLast()->setRelayID($2); } ; InterfaceIDOption :IFACE_ID_ Number { SPtr id = new TSrvOptInterfaceID($2, 0); ParserOptStack.getLast()->setRelayInterfaceID(id); } |IFACE_ID_ DUID_ { SPtr id = new TSrvOptInterfaceID($2.duid, $2.length, 0); ParserOptStack.getLast()->setRelayInterfaceID(id); } |IFACE_ID_ STRING_ { SPtr id = new TSrvOptInterfaceID($2, strlen($2), 0); ParserOptStack.getLast()->setRelayInterfaceID(id); } ; Subnet :SUBNET_ IPV6ADDR_ '/' Number { int prefix = $4; if ( (prefix<1) || (prefix>128) ) { Log(Crit) << "Invalid (1..128 allowed) prefix used: " << prefix << " in subnet definition in line " << lex->lineno() << LogEnd; YYABORT; } SPtr min = getRangeMin($2, prefix); SPtr max = getRangeMax($2, prefix); SrvCfgIfaceLst.getLast()->addSubnet(min, max); Log(Debug) << "Defined subnet " << min->getPlain() << "/" << $4 << " on " << SrvCfgIfaceLst.getLast()->getFullName() << LogEnd; }|SUBNET_ IPV6ADDR_ '-' IPV6ADDR_ { SPtr min = new TIPv6Addr($2); SPtr max = new TIPv6Addr($4); SrvCfgIfaceLst.getLast()->addSubnet(min, max); Log(Debug) << "Defined subnet " << min->getPlain() << "-" << max->getPlain() << "on " << SrvCfgIfaceLst.getLast()->getFullName() << LogEnd; } ClassOptionDeclaration : PreferredTimeOption | ValidTimeOption | PoolOption | ShareOption | T1Option | T2Option | RejectClientsOption | AcceptOnlyOption | ClassMaxLeaseOption | AddrParams | AllowClientClassDeclaration | DenyClientClassDeclaration ; AllowClientClassDeclaration : ALLOW_ STRING_ { SPtr clntClass; bool found = false; SrvCfgClientClassLst.first(); while (clntClass = SrvCfgClientClassLst.get()) { if (clntClass->getClassName() == string($2)) found = true; } if (!found) { Log(Crit) << "Line " << lex->lineno() << ": Unable to use class " << string($2) << ", no such class defined." << LogEnd; YYABORT; } ParserOptStack.getLast()->setAllowClientClass(string($2)); int deny = ParserOptStack.getLast()->getDenyClientClassString().count(); if (deny) { Log(Crit) << "Line " << lex->lineno() << ": Unable to define both allow and deny lists for this client class." << LogEnd; YYABORT; } } DenyClientClassDeclaration : DENY_ STRING_ { SPtr clntClass; bool found = false; SrvCfgClientClassLst.first(); while (clntClass = SrvCfgClientClassLst.get()) { if (clntClass->getClassName() == string($2)) found = true; } if (!found) { Log(Crit) << "Line " << lex->lineno() << ": Unable to use class " << string($2) << ", no such class defined." << LogEnd; YYABORT; } ParserOptStack.getLast()->setDenyClientClass(string($2)); int allow = ParserOptStack.getLast()->getAllowClientClassString().count(); if (allow) { Log(Crit) << "Line " << lex->lineno() << ": Unable to define both allow and deny lists for this client class." << LogEnd; YYABORT; } } //////////////////////////////////////////////////////////////////////// /// DNS-server option ////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// DNSServerOption :OPTION_ DNS_SERVER_ { PresentAddrLst.clear(); } ADDRESSList { SPtr nis_servers = new TOptAddrLst(OPTION_DNS_SERVERS, PresentAddrLst, NULL); ParserOptStack.getLast()->addExtraOption(nis_servers, false); } ; //////////////////////////////////////////////////////////////////////// /// DOMAIN option ////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// DomainOption : OPTION_ DOMAIN_ { PresentStringLst.clear(); } StringList { SPtr domains = new TOptDomainLst(OPTION_DOMAIN_LIST, PresentStringLst, NULL); ParserOptStack.getLast()->addExtraOption(domains, false); } ; //////////////////////////////////////////////////////////////////////// /// NTP-SERVER option ////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// NTPServerOption :OPTION_ NTP_SERVER_ { PresentAddrLst.clear(); } ADDRESSList { SPtr ntp_servers = new TOptAddrLst(OPTION_SNTP_SERVERS, PresentAddrLst, NULL); ParserOptStack.getLast()->addExtraOption(ntp_servers, false); // ParserOptStack.getLast()->setNTPServerLst(&PresentAddrLst); } ; //////////////////////////////////////////////////////////////////////// /// TIME-ZONE option /////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// TimeZoneOption : OPTION_ TIME_ZONE_ STRING_ { SPtr timezone = new TOptString(OPTION_NEW_TZDB_TIMEZONE, string($3), NULL); ParserOptStack.getLast()->addExtraOption(timezone, false); // ParserOptStack.getLast()->setTimezone($3); } ; ////////////////////////////////////////////////////////////////////// //SIP-SERVER option/////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////// SIPServerOption :OPTION_ SIP_SERVER_ { PresentAddrLst.clear(); } ADDRESSList { SPtr sip_servers = new TOptAddrLst(OPTION_SIP_SERVER_A, PresentAddrLst, NULL); ParserOptStack.getLast()->addExtraOption(sip_servers, false); // ParserOptStack.getLast()->setSIPServerLst(&PresentAddrLst); } ; ////////////////////////////////////////////////////////////////////// //SIP-DOMAIN option/////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////// SIPDomainOption :OPTION_ SIP_DOMAIN_ { PresentStringLst.clear(); } StringList { SPtr sip_domains = new TOptDomainLst(OPTION_SIP_SERVER_D, PresentStringLst, NULL); ParserOptStack.getLast()->addExtraOption(sip_domains, false); //ParserOptStack.getLast()->setSIPDomainLst(&PresentStringLst); } ; ////////////////////////////////////////////////////////////////////// //FQDN option///////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////// FQDNOption :OPTION_ FQDN_ { PresentFQDNLst.clear(); Log(Debug) << "No FQDNMode found, setting default mode 2 (all updates " "executed by server)." << LogEnd; Log(Warning) << "revDNS zoneroot lenght not found, dynamic revDNS update " "will not be possible." << LogEnd; ParserOptStack.getLast()->setFQDNMode(2); ParserOptStack.getLast()->setRevDNSZoneRootLength(0); } FQDNList { ParserOptStack.getLast()->setFQDNLst(&PresentFQDNLst); } |OPTION_ FQDN_ INTNUMBER_ { PresentFQDNLst.clear(); Log(Debug) << "FQDN: Setting update mode to " << $3; switch ($3) { case 0: Log(Cont) << "(no updates)" << LogEnd; break; case 1: Log(Cont) << "(client will update AAAA, server will update PTR)" << LogEnd; break; case 2: Log(Cont) << "(server will update both AAAA and PTR)" << LogEnd; break; default: Log(Cont) << LogEnd; Log(Crit) << "FQDN: Invalid mode. Only 0-2 are supported." << LogEnd; YYABORT; } Log(Warning)<< "FQDN: RevDNS zoneroot lenght not specified, dynamic revDNS update will not be possible." << LogEnd; ParserOptStack.getLast()->setFQDNMode($3); ParserOptStack.getLast()->setRevDNSZoneRootLength(0); } FQDNList { ParserOptStack.getLast()->setFQDNLst(&PresentFQDNLst); } |OPTION_ FQDN_ INTNUMBER_ INTNUMBER_ { PresentFQDNLst.clear(); Log(Debug) << "FQDN: Setting update mode to " << $3; switch ($3) { case 0: Log(Cont) << "(no updates)" << LogEnd; break; case 1: Log(Cont) << "(client will update AAAA, server will update PTR)" << LogEnd; break; case 2: Log(Cont) << "(server will update both AAAA and PTR)" << LogEnd; break; default: Log(Cont) << LogEnd; Log(Crit) << "FQDN: Invalid mode. Only 0-2 are supported." << LogEnd; YYABORT; } Log(Debug) << "FQDN: RevDNS zoneroot lenght set to " << $4 < 128) ) { Log(Crit) << "FQDN: Invalid zoneroot length specified:" << $4 << ". Value 0-128 expected." << LogEnd; YYABORT; } ParserOptStack.getLast()->setFQDNMode($3); ParserOptStack.getLast()->setRevDNSZoneRootLength($4); } FQDNList { ParserOptStack.getLast()->setFQDNLst(&PresentFQDNLst); } ; AcceptUnknownFQDN :ACCEPT_UNKNOWN_FQDN_ Number STRING_ { ParserOptStack.getLast()->setUnknownFQDN(EUnknownFQDNMode($2), string($3) ); Log(Debug) << "FQDN: Unknown fqdn names processing set to " << $2 << ", domain=" << $3 << "." << LogEnd; } |ACCEPT_UNKNOWN_FQDN_ Number { ParserOptStack.getLast()->setUnknownFQDN(EUnknownFQDNMode($2), string("") ); Log(Debug) << "FQDN: Unknown fqdn names processing set to " << $2 << ", no domain." << LogEnd; } ; FqdnDdnsAddress :FQDN_DDNS_ADDRESS_ IPV6ADDR_ { addr = new TIPv6Addr($2); CfgMgr->setDDNSAddress(addr); Log(Info) << "FQDN: DDNS updates will be performed to " << addr->getPlain() << "." << LogEnd; }; DdnsProtocol :DDNS_PROTOCOL_ STRING_ { if (!strcasecmp($2,"tcp")) CfgMgr->setDDNSProtocol(TCfgMgr::DNSUPDATE_TCP); else if (!strcasecmp($2,"udp")) CfgMgr->setDDNSProtocol(TCfgMgr::DNSUPDATE_UDP); else if (!strcasecmp($2,"any")) CfgMgr->setDDNSProtocol(TCfgMgr::DNSUPDATE_ANY); else { Log(Crit) << "Invalid ddns-protocol specifed:" << ($2) << ", supported values are tcp, udp, any." << LogEnd; YYABORT; } Log(Debug) << "DDNS: Setting protocol to " << ($2) << LogEnd; }; DdnsTimeout :DDNS_TIMEOUT_ Number { Log(Debug) << "DDNS: Setting timeout to " << $2 << "ms." << LogEnd; CfgMgr->setDDNSTimeout($2); } ////////////////////////////////////////////////////////////////////// //NIS-SERVER option/////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////// NISServerOption :OPTION_ NIS_SERVER_ { PresentAddrLst.clear(); } ADDRESSList { SPtr nis_servers = new TOptAddrLst(OPTION_NIS_SERVERS, PresentAddrLst, NULL); ParserOptStack.getLast()->addExtraOption(nis_servers, false); ///ParserOptStack.getLast()->setNISServerLst(&PresentAddrLst); } ; ////////////////////////////////////////////////////////////////////// //NISP-SERVER option////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////// NISPServerOption : OPTION_ NISP_SERVER_ { PresentAddrLst.clear(); } ADDRESSList { SPtr nisp_servers = new TOptAddrLst(OPTION_NISP_SERVERS, PresentAddrLst, NULL); ParserOptStack.getLast()->addExtraOption(nisp_servers, false); // ParserOptStack.getLast()->setNISPServerLst(&PresentAddrLst); } ; ////////////////////////////////////////////////////////////////////// //NIS-DOMAIN option/////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////// NISDomainOption :OPTION_ NIS_DOMAIN_ STRING_ { SPtr nis_domain = new TOptDomainLst(OPTION_NIS_DOMAIN_NAME, string($3), NULL); ParserOptStack.getLast()->addExtraOption(nis_domain, false); // ParserOptStack.getLast()->setNISDomain($3); } ; ////////////////////////////////////////////////////////////////////// //NISP-DOMAIN option////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////// NISPDomainOption :OPTION_ NISP_DOMAIN_ STRING_ { SPtr nispdomain = new TOptDomainLst(OPTION_NISP_DOMAIN_NAME, string($3), NULL); ParserOptStack.getLast()->addExtraOption(nispdomain, false); } ; ////////////////////////////////////////////////////////////////////// //NISP-DOMAIN option////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////// LifetimeOption :OPTION_ LIFETIME_ Number { SPtr lifetime = new TOptInteger(OPTION_INFORMATION_REFRESH_TIME, OPTION_INFORMATION_REFRESH_TIME_LEN, (uint32_t)($3), NULL); ParserOptStack.getLast()->addExtraOption(lifetime, false); //ParserOptStack.getLast()->setLifetime($3); } ; VendorSpecOption :OPTION_ VENDOR_SPEC_ { } VendorSpecList { // ParserOptStack.getLast()->setVendorSpec(VendorSpec); // Log(Debug) << "Vendor-spec parsing finished" << LogEnd; }; ClientClass :CLIENT_CLASS_ STRING_ '{' { Log(Notice) << "ClientClass found, name: " << string($2) << LogEnd; } ClientClassDecleration '}' { SPtr cond = NodeClientClassLst.getLast(); SrvCfgClientClassLst.append( new TSrvCfgClientClass(string($2),cond)); NodeClientClassLst.delLast(); } ; ClientClassDecleration : MATCH_IF_ Condition { } ; Condition : | '(' Expr CONTAIN_ Expr ')' { SPtr r = NodeClientClassLst.getLast(); NodeClientClassLst.delLast(); SPtr l = NodeClientClassLst.getLast(); NodeClientClassLst.delLast(); NodeClientClassLst.append(new NodeOperator(NodeOperator::OPERATOR_CONTAIN,l,r)); } | '(' Expr EQ_ Expr ')' { SPtr l = NodeClientClassLst.getLast(); NodeClientClassLst.delLast(); SPtr r = NodeClientClassLst.getLast(); NodeClientClassLst.delLast(); NodeClientClassLst.append(new NodeOperator(NodeOperator::OPERATOR_EQUAL,l,r)); } | '(' Condition AND_ Condition ')' { SPtr l = NodeClientClassLst.getLast(); NodeClientClassLst.delLast(); SPtr r = NodeClientClassLst.getLast(); NodeClientClassLst.delLast(); NodeClientClassLst.append(new NodeOperator(NodeOperator::OPERATOR_AND,l,r)); } | '(' Condition OR_ Condition ')' { SPtr l = NodeClientClassLst.getLast(); NodeClientClassLst.delLast(); SPtr r = NodeClientClassLst.getLast(); NodeClientClassLst.delLast(); NodeClientClassLst.append(new NodeOperator(NodeOperator::OPERATOR_OR,l,r)); } ; Expr :CLIENT_VENDOR_SPEC_ENTERPRISE_NUM_ { NodeClientClassLst.append(new NodeClientSpecific(NodeClientSpecific::CLIENT_VENDOR_SPEC_ENTERPRISE_NUM)); } |CLIENT_VENDOR_SPEC_DATA_ { NodeClientClassLst.append(new NodeClientSpecific(NodeClientSpecific::CLIENT_VENDOR_SPEC_DATA)); } | CLIENT_VENDOR_CLASS_EN_ { NodeClientClassLst.append(new NodeClientSpecific(NodeClientSpecific::CLIENT_VENDOR_CLASS_ENTERPRISE_NUM)); } | CLIENT_VENDOR_CLASS_DATA_ { NodeClientClassLst.append(new NodeClientSpecific(NodeClientSpecific::CLIENT_VENDOR_CLASS_DATA)); } | STRING_ { // Log(Info) << "Constant expression found:" <>snum; NodeClientClassLst.append(new NodeConstant(snum)); } | SUBSTRING_ '(' Expr ',' Number ',' Number ')' { SPtr l = NodeClientClassLst.getLast(); NodeClientClassLst.delLast(); NodeClientClassLst.append(new NodeOperator(NodeOperator::OPERATOR_SUBSTRING,l, $5,$7)); } ; %% ///////////////////////////////////////////////////////////////////////////// // programs section /** * method check whether interface with id=ifaceNr has been already declared * * @param ifaceNr * * @return true if interface was not declared */ bool SrvParser::IfaceDefined(int ifaceNr) { SPtr ptr; SrvCfgIfaceLst.first(); while (ptr=SrvCfgIfaceLst.get()) if ((ptr->getID())==ifaceNr) { Log(Crit) << "Interface with ID=" << ifaceNr << " is already defined." << LogEnd; return false; } return true; } /** * check whether interface with id=ifaceName has been already declared * * @param ifaceName * * @return true, if defined, false otherwise */ bool SrvParser::IfaceDefined(string ifaceName) { SPtr ptr; SrvCfgIfaceLst.first(); while (ptr=SrvCfgIfaceLst.get()) { string presName=ptr->getName(); if (presName==ifaceName) { Log(Crit) << "Interface " << ifaceName << " is already defined." << LogEnd; return false; } } return true; } /** * method creates new option for just started interface scope * clears all lists except the list of interfaces and adds new group * */ bool SrvParser::StartIfaceDeclaration(string ifaceName) { if (!IfaceDefined(ifaceName)) return false; SrvCfgIfaceLst.append(new TSrvCfgIface(ifaceName)); // create new option (representing this interface) on the parser stack ParserOptStack.append(new TSrvParsGlobalOpt(*ParserOptStack.getLast())); SrvCfgAddrClassLst.clear(); ClientLst.clear(); return true; } /** * method creates new option for just started interface scope * clears all lists except the list of interfaces and adds new group * */ bool SrvParser::StartIfaceDeclaration(int ifindex) { if (!IfaceDefined(ifindex)) return false; SrvCfgIfaceLst.append(new TSrvCfgIface(ifindex)); // create new option (representing this interface) on the parser stack ParserOptStack.append(new TSrvParsGlobalOpt(*ParserOptStack.getLast())); SrvCfgAddrClassLst.clear(); ClientLst.clear(); return true; } /** * this method is called after inteface declaration has ended. It creates * new interface representation used in SrvCfgMgr. Also removes corresponding * element from the parser stack * * @return true if everything is ok */ bool SrvParser::EndIfaceDeclaration() { // get this interface object SPtr iface = SrvCfgIfaceLst.getLast(); // set its options SrvCfgIfaceLst.getLast()->setOptions(ParserOptStack.getLast()); // copy all IA objects SPtr ptrAddrClass; SrvCfgAddrClassLst.first(); while (ptrAddrClass=SrvCfgAddrClassLst.get()) iface->addAddrClass(ptrAddrClass); SrvCfgAddrClassLst.clear(); // copy all TA objects SPtr ta; SrvCfgTALst.first(); while (ta=SrvCfgTALst.get()) iface->addTA(ta); SrvCfgTALst.clear(); SPtr pd; SrvCfgPDLst.first(); while (pd=SrvCfgPDLst.get()) iface->addPD(pd); SrvCfgPDLst.clear(); iface->addClientExceptionsLst(ClientLst); // remove last option (representing this interface) from the parser stack ParserOptStack.delLast(); return true; } void SrvParser::StartClassDeclaration() { ParserOptStack.append(new TSrvParsGlobalOpt(*ParserOptStack.getLast())); SrvCfgAddrClassLst.append(new TSrvCfgAddrClass()); } /** * this method is adds new object representig just parsed IA class. * * @return true if everything works ok. */ bool SrvParser::EndClassDeclaration() { if (!ParserOptStack.getLast()->countPool()) { Log(Crit) << "No pools defined for this class." << LogEnd; return false; } //setting interface options on the basis of just read information SrvCfgAddrClassLst.getLast()->setOptions(ParserOptStack.getLast()); ParserOptStack.delLast(); return true; } /** * Just add global options * */ void SrvParser::StartTAClassDeclaration() { ParserOptStack.append(new TSrvParsGlobalOpt(*ParserOptStack.getLast())); } bool SrvParser::EndTAClassDeclaration() { if (!ParserOptStack.getLast()->countPool()) { Log(Crit) << "No pools defined for this ta-class." << LogEnd; return false; } // create new object representing just parsed TA and add it to the list SPtr ptrTA = new TSrvCfgTA(); ptrTA->setOptions(ParserOptStack.getLast()); SrvCfgTALst.append(ptrTA); // remove temporary parser object for this (just finished) scope ParserOptStack.delLast(); return true; } void SrvParser::StartPDDeclaration() { ParserOptStack.append(new TSrvParsGlobalOpt(*ParserOptStack.getLast())); this->PDLst.clear(); this->PDPrefix = 0; } bool SrvParser::EndPDDeclaration() { if (!this->PDLst.count()) { Log(Crit) << "No PD pools defined ." << LogEnd; return false; } if (!this->PDPrefix) { Log(Crit) << "PD prefix length not defined or set to 0." << LogEnd; return false; } int len = 0; this->PDLst.first(); while ( SPtr pool = PDLst.get() ) { if (!len) len = pool->getPrefixLength(); if (len!=pool->getPrefixLength()) { Log(Crit) << "Prefix pools with different lengths are not supported. " "Make sure that all 'pd-pool' uses the same prefix length." << LogEnd; return false; } } if (len>PDPrefix) { Log(Crit) << "Clients are supposed to get /" << this->PDPrefix << " prefixes," << "but pd-pool(s) are only /" << len << " long." << LogEnd; return false; } if (len==PDPrefix) { Log(Warning) << "Prefix pool /" << PDPrefix << " defined and clients are " "supposed to get /" << len << " prefixes. Only ONE client will get " "prefix" << LogEnd; } SPtr ptrPD = new TSrvCfgPD(); ParserOptStack.getLast()->setPool(&this->PDLst); if (!ptrPD->setOptions(ParserOptStack.getLast(), this->PDPrefix)) return false; SrvCfgPDLst.append(ptrPD); // remove temporary parser object for this (just finished) scope ParserOptStack.delLast(); return true; } namespace std { extern yy_SrvParser_stype yylval; } int SrvParser::yylex() { memset(&std::yylval,0, sizeof(std::yylval)); memset(&this->yylval,0, sizeof(this->yylval)); int x = this->lex->yylex(); this->yylval=std::yylval; return x; } void SrvParser::yyerror(char *m) { Log(Crit) << "Config parse error: line " << lex->lineno() << ", unexpected [" << lex->YYText() << "] token." << LogEnd; } SrvParser::~SrvParser() { ParserOptStack.clear(); SrvCfgIfaceLst.clear(); SrvCfgAddrClassLst.clear(); SrvCfgTALst.clear(); PresentAddrLst.clear(); PresentStringLst.clear(); PresentRangeLst.clear(); } static char bitMask[]= { 0, 0x80, 0xc0, 0xe0, 0xf0, 0xf8, 0xfc, 0xfe, 0xff }; SPtr SrvParser::getRangeMin(char * addrPacked, int prefix) { char packed[16]; char mask; memcpy(packed, addrPacked, 16); if (prefix%8!=0) { mask = bitMask[prefix%8]; packed[prefix/8] = packed[prefix/8] & mask; prefix = (prefix/8 + 1)*8; } for (int i=prefix/8;i<16; i++) { packed[i]=0; } return new TIPv6Addr(packed, false); } SPtr SrvParser::getRangeMax(char * addrPacked, int prefix){ char packed[16]; char mask; memcpy(packed, addrPacked,16); if (prefix%8!=0) { mask = bitMask[prefix%8]; packed[prefix/8] = packed[prefix/8] | ~mask; prefix = (prefix/8 + 1)*8; } for (int i=prefix/8;i<16; i++) { packed[i]=0xff; } return new TIPv6Addr(packed, false); } dibbler-1.0.1/SrvCfgMgr/NodeOperator.cpp0000664000175000017500000000364712556511773015032 00000000000000/* * Dibbler - a portable DHCPv6 * * authors: Nguyen Vinh Nghiem * changes: Tomasz Mrugalski * * released under GNU GPL v2 or later licence * */ #include "NodeOperator.h" #include "SrvMsg.h" #include "Logger.h" using namespace std; NodeOperator::~NodeOperator() { } NodeOperator::NodeOperator(OperatorType t, SPtr& left, SPtr& right) :Node(NODE_OPERATOR), Type_(t), L_(left), R_(right) { if (left->Type == NODE_CONST && right->Type == NODE_CONST) Log(Warning) << "Both tokens (" << left->exec(SPtr()) << " and " << right->exec(SPtr()) << ") used in expression are constant." << LogEnd; } NodeOperator::NodeOperator(OperatorType t, SPtr& left, int in, int len) :Node(NODE_OPERATOR), Type_(t), L_(left), Index_(in), Length_(len) { } NodeOperator::NodeOperator(OperatorType t, SPtr& left, std::string s) :Node(NODE_OPERATOR), Type_(t), L_(left), ContainString_(s) { } string NodeOperator::exec() { return ""; } string NodeOperator::exec(SPtr msg) { switch (Type_) { case OPERATOR_EQUAL : if (L_->exec(msg) == R_->exec(msg)) return "true"; else return "false"; break; case OPERATOR_AND : if ( (L_->exec(msg) == "true") && (R_->exec(msg) == "true")) return "true"; else return "false"; break; case OPERATOR_OR : if ( (L_->exec(msg) == "true") || (R_->exec(msg) == "true") ) return "true"; else return "false"; break; case OPERATOR_SUBSTRING : return (L_->exec(msg)).substr(Index_, Length_); break; case OPERATOR_CONTAIN : if ((L_->exec(msg)).find((R_->exec(msg)))!= string::npos ) return "true"; else return "false"; break; default : return ""; } } dibbler-1.0.1/SrvCfgMgr/SrvParsGlobalOpt.h0000644000175000017500000000333412277722750015270 00000000000000/* * Dibbler - a portable DHCPv6 * * authors: Tomasz Mrugalski * Marek Senderski * * released under GNU GPL v2 only licence * */ #ifndef TSRVPARSGLOBALOPT_H_ #define TSRVPARSGLOBALOPT_H_ #include "SrvParsIfaceOpt.h" #include "DHCPConst.h" typedef enum { SRV_IFACE_ID_ORDER_BEFORE, SRV_IFACE_ID_ORDER_AFTER, SRV_IFACE_ID_ORDER_NONE } ESrvIfaceIdOrder; class TSrvParsGlobalOpt : public TSrvParsIfaceOpt { public: TSrvParsGlobalOpt(void); ~TSrvParsGlobalOpt(void); std::string getWorkDir() const; void setWorkDir(const std::string& dir); void setStateless(bool stateless); bool getStateless() const; void setCacheSize(int bytes); int getCacheSize() const; bool getExperimental() const; // is experimental stuff allowed? void setExperimental(bool exper); void setInterfaceIDOrder(ESrvIfaceIdOrder order); ESrvIfaceIdOrder getInterfaceIDOrder() const; void setInactiveMode(bool flex); bool getInactiveMode() const; void setGuessMode(bool guess); bool getGuessMode() const; private: bool Experimental_; std::string WorkDir_; bool Stateless_; bool InactiveMode_; bool GuessMode_; int CacheSize_; ESrvIfaceIdOrder InterfaceIDOrder_; }; #endif dibbler-1.0.1/SrvCfgMgr/SrvCfgIface.cpp0000664000175000017500000010570312561652113014535 00000000000000/* * Dibbler - a portable DHCPv6 * * authors: Tomasz Mrugalski * Marek Senderski * changes: Nguyen Vinh Nghiem * * released under GNU GPL v2 only licence * */ #include #include #include "SrvCfgIface.h" #include "SrvCfgAddrClass.h" #include "SrvCfgPD.h" #include "Logger.h" #include "Opt.h" #include "SrvMsg.h" #include "DNSUpdate.h" using namespace std; void TSrvCfgIface::addClientExceptionsLst(List(TSrvCfgOptions) exLst) { Log(Debug) << exLst.count() << " per-client configurations (exceptions) added." << LogEnd; ExceptionsLst_ = exLst; } bool TSrvCfgIface::leaseQuerySupport() const { return LeaseQuery_; } SPtr TSrvCfgIface::getClientException(SPtr duid, TMsg * parent, bool quiet) { SPtr remoteID; TSrvMsg* par = (TSrvMsg*)(parent); SPtr peer; if (par) { remoteID = par->getRemoteID(); peer = par->getClientPeer(); Log(Debug) << "Checking exceptions for link-local=" << peer->getPlain() << LogEnd; } SPtr x; ExceptionsLst_.first(); while (x = ExceptionsLst_.get()) { if ( duid && x->getDuid() && (*(x->getDuid()) == *duid) ) { if (!quiet) Log(Debug) << "Found per-client configuration (exception) for client with DUID=" << x->getDuid()->getPlain() << LogEnd; return x; } SPtr remoteid; remoteid = x->getRemoteID(); if ( remoteID && remoteid && (remoteID->getVendor() == remoteid->getVendor()) && (remoteid->getVendorDataLen() == remoteID->getVendorDataLen()) && !memcmp(remoteid->getVendorData(), remoteID->getVendorData(), remoteid->getVendorDataLen()) ) { Log(Debug) << "Found per-client configuration (exception) for client with RemoteID: vendor=" << remoteid->getVendor() << ", data=" << remoteid->getVendorDataPlain() << "." << LogEnd; return x; } if ( peer && x && x->getClntAddr() && *(peer) == *(x->getClntAddr()) ) { Log(Debug) << "Found per-client configuration (exception) for client with link-local=" << peer->getPlain() << LogEnd; return x; } } return SPtr(); } /// @brief Checks if address is reserved. /// /// Iterates over exceptions list and checks if specified address is reserved. /// /// @param addr Address in question. /// /// @return True if reserved (false otherwise). bool TSrvCfgIface::addrReserved(SPtr addr) { SPtr x; ExceptionsLst_.first(); while (x=ExceptionsLst_.get()) { if ( (x->getAddr()) && (*x->getAddr() == *addr) ) return true; } return false; } /// @brief removes reserved addresses/prefixes from cache /// /// @return number of removed entries unsigned int TSrvCfgIface::removeReservedFromCache() { unsigned int cnt = 0; SPtr x; ExceptionsLst_.first(); while (x=ExceptionsLst_.get()) { if (x->getAddr()) cnt += SrvAddrMgr().delCachedEntry(x->getAddr(), IATYPE_IA); if (x->getPrefix()) cnt += SrvAddrMgr().delCachedEntry(x->getPrefix(), IATYPE_PD); } return cnt; } /// @brief Checks if prefix is reserved. /// /// Iterates over exceptions list and checks if specified prefix is reserved. /// /// @param prefix prefix in question. /// /// @return True if reserved (false otherwise). bool TSrvCfgIface::prefixReserved(SPtr prefix) { SPtr x; ExceptionsLst_.first(); while (x=ExceptionsLst_.get()) { if (x->getPrefix() && (*x->getPrefix() == *prefix) ) return true; } return false; } /// @brief Checks if a prefix is reserved for another client. /// /// @param pfx checked prefix (mandatory) /// @param duid Client's duid (mandatory) /// @param myRemoteID (can be NULL) /// @param linkLocal (can be NULL) /// /// @return true if reserved for some else, false = not reserved bool TSrvCfgIface::checkReservedPrefix(SPtr pfx, SPtr duid, SPtr myRemoteID, SPtr linkLocal) { // sanity check if (!pfx || !duid) { // should not happen Log(Error) << "Reservation check failed. Required parameters not specified." << LogEnd; return true; } SPtr x; ExceptionsLst_.first(); Log(Debug) << "Checking prefix " << pfx->getPlain() << " against reservations ... " << LogEnd; while (x=ExceptionsLst_.get()) { if (!x->getPrefix()) // that is not prefix reservation continue; if ( *(x->getPrefix()) != (*pfx) ) continue; // that is not the prefix we are looking for // we found the prefix we are looking for. Let's check if we can use it // DUID based reservation? if (x->getDuid()) { if (*duid == *x->getDuid()) { return false; // reserved for us! } else { Log(Debug) << "Prefix " << x->getPrefix()->getPlain() << " is reserved for DUID=" << x->getDuid()->getPlain() << LogEnd; return true; } } // remote-id based reservation? SPtr remoteid = x->getRemoteID(); if (remoteid) { if ( (myRemoteID->getVendor() == remoteid->getVendor()) && (myRemoteID->getVendorDataLen() == remoteid->getVendorDataLen()) && (!memcmp(myRemoteID->getVendorData(), remoteid->getVendorData(), remoteid->getVendorDataLen())) ) { return false; // reserved for us! } else { Log(Debug) << "Prefix " << x->getPrefix()->getPlain() << "is reserved for remote-id=" << remoteid->getPlain() << LogEnd; return true; // no, sorry. It's somebody else's prefix } } // link-local based reservation SPtr addr = x->getClntAddr(); if (addr) { if (*linkLocal == *addr) { return false; // reserved for us! } else { Log(Debug) << "Prefix " << x->getPrefix()->getPlain() << " is reserved for link-local address " << addr->getPlain() << LogEnd; return true; } } Log(Error) << "Found reservation for prefix " << x->getPrefix()->getPlain() << ", but it is misconfigured (no DUID, remote-id nor link-local specified)" << LogEnd; // this reservation is malformed let's not use it return true; } return false; } void TSrvCfgIface::firstAddrClass() { SrvCfgAddrClassLst_.first(); } /// @brief Returns ID of the preferred pool for specified client /// /// tries to find if there is a class, where client is on white-list /// /// @param duid client's DUID /// @param clntAddr client's address /// /// @return ID of prefered pool (or -1 if there is none) int TSrvCfgIface::getPreferedAddrClassID(SPtr duid, SPtr clntAddr) { SPtr ptrClass; SrvCfgAddrClassLst_.first(); while(ptrClass=SrvCfgAddrClassLst_.get()) { if (ptrClass->clntPrefered(duid, clntAddr)) { return ptrClass->getID(); } } return -1; } /// tries to find a class, which client is allowed to use /// /// @param duid client's DUID /// @param clntAddr client's linkaddress /// /// @return classid (or -1 if no suitable class is found) int TSrvCfgIface::getAllowedAddrClassID(SPtr duid, SPtr clntAddr) { unsigned int clsid[100]; unsigned int share[100]; unsigned int cnt = 0; unsigned int sum = 0; unsigned int rnd; /// @todo Buffer overflow for more than 100 classes SPtr ptrClass; SrvCfgAddrClassLst_.first(); while( (ptrClass=SrvCfgAddrClassLst_.get()) && (cnt<100) ) { if (ptrClass->clntSupported(duid, clntAddr) && ptrClass->getClassMaxLease() > ptrClass->getAssignedCount()) { clsid[cnt] = ptrClass->getID(); share[cnt] = ptrClass->getShare(); sum += ptrClass->getShare(); cnt++; } } if (!cnt) return -1; // this client is not supported by any class rnd = rand() % sum; unsigned int j = 0; for (unsigned int i = 0; i < cnt; i++) { j += share[i]; if (j >= rnd) { return clsid[i]; } } return clsid[cnt-1]; } void TSrvCfgIface::firstPD() { SrvCfgPDLst_.first(); } bool TSrvCfgIface::supportPrefixDelegation() const { return SrvCfgPDLst_.count(); } void TSrvCfgIface::addTA(SPtr ta) { SrvCfgTALst_.append(ta); } void TSrvCfgIface::firstTA() { SrvCfgTALst_.first(); } SPtr TSrvCfgIface::getTA() { return SrvCfgTALst_.get(); } void TSrvCfgIface::addPD(SPtr pd) { SrvCfgPDLst_.append(pd); } SPtr TSrvCfgIface::getTA(SPtr clntDuid, SPtr clntAddr) { SPtr ta; // try to find preferred TA for this client SrvCfgTALst_.first(); while ( ta = getTA() ) { if (ta->clntPrefered(clntDuid, clntAddr)) return ta; } // prefered not found? Then find first allowed SrvCfgTALst_.first(); while ( ta = getTA() ) { if (ta->clntSupported(clntDuid, clntAddr)) return ta; } return SPtr(); // NULL } SPtr TSrvCfgIface::getAddrClass() { return SrvCfgAddrClassLst_.get(); } SPtr TSrvCfgIface::getClassByID(unsigned long id) { firstAddrClass(); SPtr ptrClass; while (ptrClass = getAddrClass()) { if (ptrClass->getID() == id) return ptrClass; } return SPtr(); // NULL } void TSrvCfgIface::addClntAddr(SPtr ptrAddr, bool quiet /* =false*/) { SPtr ptrClass; firstAddrClass(); while (ptrClass = getAddrClass() ) { if (ptrClass->addrInPool(ptrAddr)) { unsigned int count = ptrClass->incrAssigned(); if (quiet) return; Log(Debug) << "Address usage for class " << ptrClass->getID() << " increased to " << count << "." << LogEnd; return; } } Log(Warning) << "Unable to increase address usage: no class found for " << *ptrAddr << LogEnd; } void TSrvCfgIface::delClntAddr(SPtr ptrAddr, bool quiet /* =false*/) { SPtr ptrClass; firstAddrClass(); while (ptrClass = getAddrClass() ) { if (ptrClass->addrInPool(ptrAddr)) { unsigned long count = ptrClass->decrAssigned(); if (quiet) return; Log(Debug) << "Address usage for class " << ptrClass->getID() << " decreased to " << count << "." << LogEnd; return; } } Log(Warning) << "Unable to decrease address usage: no class found for " << *ptrAddr << LogEnd; } SPtr TSrvCfgIface::getRandomClass(SPtr clntDuid, SPtr clntAddr) { long classid; // step 1: Is there a class reserved for this client? // if there is class where client is on whitelist, it should be used rather than any other class // that would be also suitable classid = getPreferedAddrClassID(clntDuid, clntAddr); if(classid > -1) { Log(Debug) << "Found prefered class " << classid << " for client (duid = " << *clntDuid << ", addr = " << *clntAddr << ")" << LogEnd; return getClassByID(classid); } // Get one of the normal classes classid = getAllowedAddrClassID(clntDuid, clntAddr); if(classid > -1) { Log(Debug) << "Prefered class for client not found, using classid=" << classid << "." << LogEnd; return getClassByID(classid); } // This is some kind of problem... // we are out of addresses, or we really don't like this client Log(Warning) << "No class is available for client (duid=" << clntDuid->getPlain() << ", addr=" << clntAddr->getPlain() << ")." << LogEnd; return SPtr(); // NULL } long TSrvCfgIface::countAddrClass() const { return SrvCfgAddrClassLst_.count(); } SPtr TSrvCfgIface::getPD() { return SrvCfgPDLst_.get(); } SPtr TSrvCfgIface::getPDByID(unsigned long id) { firstPD(); SPtr ptrPD; while (ptrPD = getPD()) { if (ptrPD->getID() == id) return ptrPD; } return SPtr(); // NULL } bool TSrvCfgIface::addClntPrefix(SPtr ptrAddr, bool quiet /* =false */) { SPtr ptrPD; firstPD(); while (ptrPD = getPD() ) { if (ptrPD->prefixInPool(ptrAddr)) { unsigned long count = ptrPD->incrAssigned(); if (quiet) return true; Log(Debug) << "PD: Prefix usage for class " << ptrPD->getID() << " increased to " << count << "." << LogEnd; return true; } } Log(Warning) << "Unable to increase prefix usage: no prefix found for " << *ptrAddr << LogEnd; return false; } bool TSrvCfgIface::delClntPrefix(SPtr ptrAddr, bool quiet /* =false */) { SPtr ptrPD; firstPD(); while (ptrPD = getPD() ) { if (ptrPD->prefixInPool(ptrAddr)) { unsigned long count = ptrPD->decrAssigned(); if (quiet) return true; Log(Debug) << "PD: Prefix usage for class " << ptrPD->getID() << " decreased to " << count << "." << LogEnd; return true; } } Log(Warning) << "Unable to decrease address usage: no class found for " << *ptrAddr << LogEnd; return false; } long TSrvCfgIface::countPD() const { return SrvCfgPDLst_.count(); } int TSrvCfgIface::getID() const { return ID_; } string TSrvCfgIface::getName() const { return Name_; } string TSrvCfgIface::getFullName() const { ostringstream oss; oss << ID_; return string(Name_) + "/" + oss.str(); } SPtr TSrvCfgIface::getUnicast() { return Unicast_; } TSrvCfgIface::~TSrvCfgIface() { } void TSrvCfgIface::setOptions(SPtr opt) { // default options Preference_ = opt->getPreference(); IfaceMaxLease_ = opt->getIfaceMaxLease(); ClntMaxLease_ = opt->getClntMaxLease(); RapidCommit_ = opt->getRapidCommit(); Unicast_ = opt->getUnicast(); LeaseQuery_ = opt->getLeaseQuerySupport(); T1Min_ = opt->getT1Beg(); T1Max_ = opt->getT1End(); T2Min_ = opt->getT2Beg(); T2Max_ = opt->getT2End(); PrefMin_ = opt->getPrefBeg(); PrefMax_ = opt->getPrefEnd(); ValidMin_ = opt->getValidBeg(); ValidMax_ = opt->getValidEnd(); if (opt->supportFQDN()){ UnknownFQDN_ = opt->getUnknownFQDN(); FQDNDomain_ = opt->getFQDNDomain(); setFQDNLst(opt->getFQDNLst()); FQDNMode_ = opt->getFQDNMode(); setRevDNSZoneRootLength(opt->getRevDNSZoneRootLength()); Log(Debug) <<"FQDN: Support is enabled on the " << getFullName() << " interface." << LogEnd; Log(Debug) <<"FQDN: Mode set to " << getFQDNMode() << ": "; switch (getFQDNMode()) { case DNSUPDATE_MODE_NONE: Log(Cont) << "server will not perform any updates." << LogEnd; break; case DNSUPDATE_MODE_PTR: Log(Cont) << "server will perform reverse (PTR) update only." << LogEnd; break; case DNSUPDATE_MODE_BOTH: Log(Cont) << "server will perform both (AAAA and PTR) updates." << LogEnd; } Log(Debug) <<"FQDN: RevDNS zoneroot lenght set to " << getRevDNSZoneRootLength()<< "." << LogEnd; } if (opt->isRelay()) { Relay_ = true; RelayName_ = opt->getRelayName(); RelayID_ = opt->getRelayID(); RelayInterfaceID_ = opt->getRelayInterfaceID(); } else { Relay_ = false; RelayName_ = ""; RelayID_ = -1; RelayInterfaceID_.reset(); } TSrvCfgOptions::setOptions(opt); } TSrvCfgIface::TSrvCfgIface(int ifindex) { setDefaults(); ID_ = ifindex; } TSrvCfgIface::TSrvCfgIface(const std::string& ifaceName) { setDefaults(); Name_ = ifaceName; } void TSrvCfgIface::setDefaults() { NoConfig_ = false; Name_ = "[unknown]"; ID_ = -1; Relay_ = false; RevDNSZoneRootLength_ = SERVER_DEFAULT_DNSUPDATE_REVDNS_ZONE_LEN; RelayID_ = -1; Preference_ = 0; IfaceMaxLease_ = SERVER_DEFAULT_IFACEMAXLEASE; ClntMaxLease_ = SERVER_DEFAULT_CLNTMAXLEASE; RapidCommit_ = SERVER_DEFAULT_RAPIDCOMMIT; LeaseQuery_ = SERVER_DEFAULT_LEASEQUERY; FQDNMode_ = DNSUPDATE_MODE_NONE; UnknownFQDN_ = SERVER_DEFAULT_UNKNOWN_FQDN; T1Min_ = SERVER_DEFAULT_MIN_T1; T1Max_ = SERVER_DEFAULT_MAX_T1; T2Min_ = SERVER_DEFAULT_MIN_T2; T2Max_ = SERVER_DEFAULT_MAX_T2; PrefMin_ = SERVER_DEFAULT_MIN_PREF; PrefMax_ = SERVER_DEFAULT_MAX_PREF; ValidMin_ = SERVER_DEFAULT_MIN_VALID; ValidMax_ = SERVER_DEFAULT_MAX_VALID; } void TSrvCfgIface::setNoConfig() { NoConfig_ = true; } unsigned char TSrvCfgIface::getPreference() const { return Preference_; } void TSrvCfgIface::setName(const std::string& ifaceName) { Name_ = ifaceName; } void TSrvCfgIface::setID(int ifaceID) { ID_ = ifaceID; } bool TSrvCfgIface::getRapidCommit() const { return RapidCommit_; } void TSrvCfgIface::addAddrClass(SPtr addrClass) { SrvCfgAddrClassLst_.append(addrClass); } long TSrvCfgIface::getIfaceMaxLease() const { return IfaceMaxLease_; } unsigned long TSrvCfgIface::getClntMaxLease() const { return ClntMaxLease_; } string TSrvCfgIface::getRelayName() const { return RelayName_; } int TSrvCfgIface::getRelayID() const { return RelayID_; } SPtr TSrvCfgIface::getRelayInterfaceID() const { return RelayInterfaceID_; } bool TSrvCfgIface::isRelay() const { return Relay_; } void TSrvCfgIface::setRelayName(const std::string& name) { RelayName_ = name; } void TSrvCfgIface::setRelayID(int id) { RelayID_ = id; } // --- option: FQDN --- void TSrvCfgIface::setFQDNLst(List(TFQDN) *fqdn) { FQDNLst_ = *fqdn; } /** * this method tries to find a name for a client. It check client's hint, and possible reservations * by duid or by address * * @param duid * @param addr * @param hint * * @return */ SPtr TSrvCfgIface::getFQDNName(SPtr duid, SPtr addr, const std::string& hint) { SPtr alternative; // best FQDN found for that client SPtr foo; FQDNLst_.first(); while ( foo = FQDNLst_.get()) { if (foo->isUsed()) { // client sent a hint, but it is used currently if ( (foo->getDuid()) && (*foo->getDuid() == *duid) && (foo->getAddr()) && (*foo->getAddr() == *addr)) { Log(Debug) << "FQDN: This client (DUID=" << duid->getPlain() << ") has already assigned name " << foo->getName() <<" to its address " << foo->getAddr()->getPlain() << "." << LogEnd; return foo; } if ( (foo->getName() == hint) && (*foo->getDuid() == *duid) ) { Log(Debug) << "FQDN: Client requested " << hint << ", it is already assinged to this client. Reusing." << LogEnd; return foo; } continue; } if (duid && (foo->getDuid()) && *(foo->getDuid())== *duid) { Log(Debug) << "FQDN found: " << foo->getName() << " using duid " << duid->getPlain() << LogEnd; return foo; } if (addr && (foo->getAddr()) && *(foo->getAddr())==*addr) { Log(Debug) << "FQDN found: " << foo->getName() << " using address " << addr->getPlain() << LogEnd; return foo; } if (foo->getName() == hint){ // client asked for this name. Let's check if client is allowed to get this name. if ( (!foo->getDuid()) && (!foo->getAddr()) ) { Log(Debug) << "Client's hint: " << hint << " found in fqdn list, setting fqdn to " << foo->getName() << LogEnd; return foo; } } if (!foo->getAddr() && !foo->getDuid()) { if (!alternative) alternative = foo; } } switch (UnknownFQDN_) { default: { Log(Error) << "FQDN: Invalid unknown-fqdn mode specified (" << UnknownFQDN_ << ")." << LogEnd; return SPtr(); // NULL } case UNKNOWN_FQDN_REJECT: { Log(Info) << "FQDN: Client sent valid hint (" << hint << ") that is not " << "mentioned in server configuration. Server is configured to " << "drop such hints. To accept them, please " << "add 'accept-unknown-fqdn X' in the server.conf (with X>0)." << LogEnd; return SPtr(); // NULL } case UNKKOWN_FQDN_ACCEPT_POOL: { if (alternative) Log(Info) << "FQDN: Client requested " << hint << ", but assigning other name (" << alternative->getName() << ") from available pool instead." << LogEnd; return alternative; } case UNKNOWN_FQDN_ACCEPT: { Log(Info) << "FQDN: Accepting unknown (" << hint <<") FQDN requested by client." < newEntry = new TFQDN(duid, hint, false); FQDNLst_.append(newEntry); // Log(Debug) << "Retured FQDN " << newEntry->getName() <=0; k--){ char x = assignedDomain[k]; if (!isalpha(x) && !isdigit(x) && (x!='-') ) { assignedDomain.replace(k,1,""); // remove all inappropriate chars } } assignedDomain += "." + FQDNDomain_; SPtr newEntry = new TFQDN(duid, assignedDomain, false); FQDNLst_.append(newEntry); Log(Info) << "FQDN: Client requested " << hint <<", assigning " << assignedDomain << "." <getPlain(); std::string::size_type j = 0; while ( (j = tmp.find("::")) != std::string::npos) tmp.replace(j, 1, "-"); while ( (j = tmp.find(':')) != std::string::npos) tmp.replace(j, 1, "-"); tmp = tmp + "." + FQDNDomain_; SPtr newEntry = new TFQDN(duid, tmp, false); FQDNLst_.append(newEntry); Log(Info) << "FQDN: Client requested " << hint <<", assigning " << tmp << "." <(); // NULL } SPtr TSrvCfgIface::getFQDNDuid(const std::string& name) { /// @todo: Implement this! SPtr res = new TDUID(); return res; } List(TFQDN) *TSrvCfgIface::getFQDNLst() { return &FQDNLst_; } bool TSrvCfgIface::supportFQDN() const { return FQDNLst_.count() || (UnknownFQDN_ >= UNKNOWN_FQDN_ACCEPT); } int TSrvCfgIface::getFQDNMode() const{ return FQDNMode_; } int TSrvCfgIface::getRevDNSZoneRootLength() const{ return RevDNSZoneRootLength_; } void TSrvCfgIface::setRevDNSZoneRootLength(int revDNSZoneRootLength){ RevDNSZoneRootLength_ = revDNSZoneRootLength; } string TSrvCfgIface::getFQDNModeString() const { switch (FQDNMode_) { case 0: return "updates disabled"; case 1: return "server will update PTR"; case 2: return "server will update PTR and AAAA"; default: return "unknown"; } } void TSrvCfgIface::addTAAddr() { SPtr ta; firstTA(); ta = getTA(); if (!ta) { Log(Error) << "Unable to increase TA usage. TA (temporary addresses) is not found on the " << getFullName() << " interface." << LogEnd; return; } ta->incrAssigned(); } void TSrvCfgIface::delTAAddr() { SPtr ta; firstTA(); ta = getTA(); if (!ta) { Log(Error) << "Unable to decrease TA usage. TA (temporary addresses) is not found on the " << getFullName() << " interface." << LogEnd; return; } ta->decrAssigned(); } void TSrvCfgIface::addSubnet(SPtr min, SPtr max) { Subnets_.push_back(THostRange(min, max)); } bool TSrvCfgIface::addrInSubnet(SPtr addr) { for (std::vector::const_iterator range = Subnets_.begin(); range != Subnets_.end(); ++range) { if (range->in(addr)) { return true; } } return false; } bool TSrvCfgIface::subnetDefined() { return !Subnets_.empty(); } // -------------------------------------------------------------------- // --- operators ------------------------------------------------------ // -------------------------------------------------------------------- ostream& operator<<(ostream& out,TSrvCfgIface& iface) { SPtr Station; SPtr addr; SPtr str; out << dec; out << " " << endl; if (iface.Relay_) { out << " getPlain() << "\""; } else { out << "\" interfaceid=null"; } out << "/>" << std::endl; } else { out << " " << std::endl; } out << " " << std::endl; for (std::vector::const_iterator range = iface.Subnets_.begin(); range != iface.Subnets_.end(); ++range) { out << " " << range->getAddrL()->getPlain() << "-" << range->getAddrR()->getPlain() << "" << std::endl; } out << " " << (int)iface.Preference_ << "" << std::endl; out << " " << iface.IfaceMaxLease_ << "" << std::endl; out << " " << iface.ClntMaxLease_ << "" << std::endl; out << " " << (iface.LeaseQuery_?"1":"0") << "" << std::endl; out << " " << endl; out << " " << endl; out << " " <" << endl; if (iface.Unicast_) { out << " " << *(iface.Unicast_) << "" << endl; } else { out << " " << endl; } if (iface.RapidCommit_) { out << " " << std::endl; } else { out << " " << std::endl; } out << endl; // print IA objects SPtr ia; iface.SrvCfgAddrClassLst_.first(); out << " " << endl; while( ia=iface.SrvCfgAddrClassLst_.get() ) { out << *ia; } out << endl; // print PD objects SPtr pd; iface.SrvCfgPDLst_.first(); out << " " << endl; while( pd=iface.SrvCfgPDLst_.get() ) { out << *pd; } out << endl; // print TA objects SPtr ta; iface.firstTA(); out << " " << endl; while( ta=iface.getTA() ) { out << *ta; } out << endl << " " << endl; // option: DNS-SERVERS // option: DOMAINS // NTP-SERVERS // option: TIMEZONE // option: SIP-SERVERS // option: SIP-DOMAINS // option: LIFETIME // option: VENDOR-SPEC /* if (iface.supportVendorSpec()) { out << " " << endl; iface.VendorSpec.first(); SPtr v; while (v = iface.VendorSpec.get()) { out << " getVendor() << "\">" << endl; SPtr sub; v->firstOption(); while (sub = v->getOption()) { out << " " << endl; } out << " " << endl; } out << " " << endl; } else { out << " " << endl; }*/ out << " " << endl; TOptList extraLst = iface.getExtraOptions(); for (TOptList::iterator extra = extraLst.begin(); extra!=extraLst.end(); ++extra) { out << " getOptType() << "\" length=\"" << (*extra)->getSize() << "\">" << ((*extra)->getPlain()) << "" << endl; } // option: FQDN if (iface.supportFQDN()) { SPtr f; List(TFQDN) * lst = iface.getFQDNLst(); out << " count() << "\" prefix=\"" << iface.getRevDNSZoneRootLength() << "\"" << " domain=\"" << iface.FQDNDomain_ << "\"" << " unknownFqdnMode=\"" << iface.UnknownFQDN_ << "\"" << ">" << endl; lst->first(); while ((f = lst->get())) { out << " " << *f; } out << " " << endl; } else { out << " " << endl; } SPtr ex; out << " " << endl; iface.ExceptionsLst_.first(); while (ex = iface.ExceptionsLst_.get()) { out << *ex; } out << " " << endl; return out; } void TSrvCfgIface::mapAllowDenyList( List(TSrvCfgClientClass) clientClassLst) { // Log(Info)<<"Mapping allow, deny list inside interface "< ptrClass; SrvCfgAddrClassLst_.first(); while(ptrClass = SrvCfgAddrClassLst_.get()){ ptrClass->mapAllowDenyList(clientClassLst); } // Map the Allow and Deny list to TA c SPtr ptrTA; SrvCfgTALst_.first(); while(ptrTA = SrvCfgTALst_.get()){ ptrTA->mapAllowDenyList(clientClassLst); } // Map the Allow and Deny list to prefix SPtr ptrPD; SrvCfgPDLst_.first(); while(ptrPD = SrvCfgPDLst_.get()){ ptrPD->mapAllowDenyList(clientClassLst); } } uint32_t TSrvCfgIface::chooseTime(uint32_t min, uint32_t max, uint32_t proposal) { if (proposal < min) return min; if (proposal > max) return max; return proposal; } uint32_t TSrvCfgIface::getT1(uint32_t proposal) { return chooseTime(T1Min_, T1Max_, proposal); } uint32_t TSrvCfgIface::getT2(uint32_t proposal) { return chooseTime(T2Min_, T2Max_, proposal); } uint32_t TSrvCfgIface::getPref(uint32_t proposal) { return chooseTime(PrefMin_, PrefMax_, proposal); } uint32_t TSrvCfgIface::getValid(uint32_t proposal) { return chooseTime(ValidMin_, ValidMax_, proposal); } /// checks if given address/prefix is valid on this interface /// /// @param type IA, TA or PD /// @param addr address or prefix to be confirmed /// /// @return YES, NO or UNKNOWN (if no subnet is defined and addr is outside of pool) EAddrStatus TSrvCfgIface::confirmAddress(TIAType type, SPtr addr) { string what = "address"; if (type == IATYPE_PD) what = "prefix"; Log(Debug) << "Confirm that " << what << " " << addr->getPlain() << " is on-link:"; if (subnetDefined()) { // this is easy to check - client defined subnet // we just check if the address is in subnet and we're done if (addrInSubnet(addr)) { Log(Cont) << "yes (belongs to defined subnet)." << LogEnd; return ADDRSTATUS_YES; } else { Log(Cont) << "no (outside of defined subnet)." << LogEnd; return ADDRSTATUS_NO; } } else { // Ok, admin was lazy enough and did not specify subnet // parameter for us. We have to check it the hard way bool inPool; switch (type) { case IATYPE_IA: inPool = addrInPool(addr); break; case IATYPE_TA: inPool = addrInTaPool(addr); break; case IATYPE_PD: inPool = prefixInPdPool(addr); break; default: // should never happen inPool = false; } if (inPool) { Log(Cont) << "yes (belongs to defined class)." << LogEnd; return ADDRSTATUS_YES; } else { Log(Cont) << "unknown (outside of defined class)." << LogEnd; return ADDRSTATUS_UNKNOWN; } } } /// checks if address is in NA pool /// /// @param addr address to be checked /// /// @return true if in pool, false otherwise bool TSrvCfgIface::addrInPool(SPtr addr) { firstAddrClass(); SPtr ptrClass; bool inPool = false; while (ptrClass = getAddrClass()) { inPool = ptrClass->addrInPool(addr); if (!inPool) return false; } return inPool; } /// checks if address is in TA pool /// /// @param addr address to be checked /// /// @return true if in pool, false otherwise bool TSrvCfgIface::addrInTaPool(SPtr addr) { firstTA(); SPtr ptrClass; bool inPool = false; while (ptrClass = getTA()) { inPool = ptrClass->addrInPool(addr); if (!inPool) return false; } return inPool; } /// checks if prefix is in PD pool /// /// @param prefix prefix to be checked /// /// @return true if in pool, false otherwise bool TSrvCfgIface::prefixInPdPool(SPtr prefix) { firstPD(); SPtr ptrClass; bool inPool = false; while (ptrClass = getPD()) { inPool = ptrClass->prefixInPool(prefix); if (!inPool) return false; } return inPool; } dibbler-1.0.1/SrvCfgMgr/SrvCfgTA.h0000664000175000017500000000364212233256142013474 00000000000000/* * Dibbler - a portable DHCPv6 * * authors: Tomasz Mrugalski * changes: Nguyen Vinh Nghiem * * released under GNU GPL v2 only licence * */ class TSrcCfgTA; #ifndef SRVCONFTA_H #define SRVCONFTA_H #include #include #include #include "SrvAddrMgr.h" #include "SrvParsGlobalOpt.h" #include "DHCPConst.h" #include "SmartPtr.h" #include "IPv6Addr.h" #include "DUID.h" class TSrvCfgTA { friend std::ostream& operator<<(std::ostream& out, TSrvCfgTA& iface); public: TSrvCfgTA(); //Is client with this DUID and IP address supported? bool clntSupported(SPtr duid,SPtr clntAddr); //Is client with this DUID and IP address prefered? (is in accept-only?) bool clntPrefered(SPtr duid,SPtr clntAddr); unsigned long countAddrInPool(); SPtr getRandomAddr(); bool addrInPool(SPtr addr); unsigned long getPref(); unsigned long getValid(); unsigned long getClassMaxLease(); unsigned long getID(); unsigned long getAssignedCount(); long incrAssigned(int count=1); long decrAssigned(int count=1); void setOptions(SPtr opt); virtual ~TSrvCfgTA(); void mapAllowDenyList( List(TSrvCfgClientClass) clientClassLst); bool clntSupported(SPtr duid,SPtr clntAddr, SPtr msg); private: unsigned long Pref; unsigned long Valid; unsigned long ID; // this is not IAID, just internal ID counter static unsigned long staticID; TContainer > RejedClnt; TContainer > AcceptClnt; SPtr Pool; unsigned long ClassMaxLease; unsigned long AddrsAssigned; unsigned long AddrsCount; List(std::string) allowLst; List(std::string) denyLst; List(TSrvCfgClientClass) allowClientClassLst; List(TSrvCfgClientClass) denyClientClassLst; }; #endif dibbler-1.0.1/SrvCfgMgr/Node.h0000664000175000017500000000103712233256142012736 00000000000000/* * Dibbler - a portable DHCPv6 * * authors: Nguyen Vinh Nghiem * changes: Tomasz Mrugalski * * released under GNU GPL v2 or later licence * */ #ifndef NODE_H_ #define NODE_H_ #include #include "SmartPtr.h" class TSrvMsg; class Node { public: enum NodeType { NODE_OPERATOR = 1, NODE_CONST = 2, NODE_CLIENT_SPECIFIC = 3 }; Node(NodeType type); virtual ~Node(); virtual std::string exec(SPtr msg) = 0; NodeType Type; }; #endif /* NODE_H_ */ dibbler-1.0.1/SrvCfgMgr/NodeOperator.h0000664000175000017500000000232712233256142014455 00000000000000/* * Dibbler - a portable DHCPv6 * * authors: Nguyen Vinh Nghiem * changes: Tomasz Mrugalski * * released under GNU GPL v2 or later licence * */ #ifndef NODEOPERATOR_H_ #define NODEOPERATOR_H_ #include "Node.h" #include "SmartPtr.h" #include class NodeOperator : public Node { public: enum OperatorType { OPERATOR_EQUAL = 1, OPERATOR_AND = 2, OPERATOR_OR = 3, OPERATOR_SUBSTRING = 4, OPERATOR_CONTAIN = 5 }; NodeOperator(OperatorType t , SPtr& lll, SPtr& rrr); // Construction method for Substring NodeOperator(OperatorType t , SPtr& lll, int in, int len); // Construction method for Contain NodeOperator(OperatorType t, SPtr& lll, std::string s ); virtual ~NodeOperator(); virtual std::string exec(SPtr msg); virtual std::string exec(); private : OperatorType Type_; SPtr L_; SPtr R_; // support substring int Index_; int Length_; // support contain std::string ContainString_; }; #endif /* NODEOPERATOR_H_ */ dibbler-1.0.1/SrvCfgMgr/SrvCfgAddrClass.cpp0000644000175000017500000002367212277722750015401 00000000000000/* * Dibbler - a portable DHCPv6 * * authors: Tomasz Mrugalski * Marek Senderski * changes: Nguyen Vinh Nghiem * * released under GNU GPL v2 only licence * */ #include "SrvCfgAddrClass.h" #include "SmartPtr.h" #include "SrvParsGlobalOpt.h" #include "DHCPConst.h" #include "Logger.h" #include "SrvOptAddrParams.h" #include "SrvMsg.h" #include "DHCPDefaults.h" using namespace std; // static field initialization unsigned long TSrvCfgAddrClass::StaticID_ = 0; TSrvCfgAddrClass::TSrvCfgAddrClass() { T1Min_ = SERVER_DEFAULT_MIN_T1; T1Max_ = SERVER_DEFAULT_MAX_T1; T2Min_ = SERVER_DEFAULT_MIN_T2; T2Max_ = SERVER_DEFAULT_MAX_T2; PrefMin_ = SERVER_DEFAULT_MIN_PREF; PrefMax_ = SERVER_DEFAULT_MAX_PREF; ValidMin_ = SERVER_DEFAULT_MIN_VALID; ValidMax_ = SERVER_DEFAULT_MAX_VALID; ID_ = StaticID_++; // client-class ID AddrsAssigned_ = 0; AddrsCount_ = 0; Share_ = 100; ClassMaxLease_ = SERVER_DEFAULT_CLASSMAXLEASE; } TSrvCfgAddrClass::~TSrvCfgAddrClass() { } /* * is client allowed to use this class? (it can be rejected on DUID or address basis) */ bool TSrvCfgAddrClass::clntSupported(SPtr duid,SPtr clntAddr) { SPtr range; RejedClnt_.first(); // is client on black list? while(range = RejedClnt_.get()) if (range->in(duid,clntAddr)) return false; if (AcceptClnt_.count()) { AcceptClnt_.first(); // there's white list while(range = AcceptClnt_.get()) { // is client on this white list? if (range->in(duid,clntAddr)) return true; } return false; } return true; } bool TSrvCfgAddrClass::clntSupported(SPtr duid,SPtr clntAddr, SPtr msg) { // is client on denied client class SPtr clntClass; DenyClientClassLst_.first(); while(clntClass = DenyClientClassLst_.get()) { if (clntClass->isStatisfy(msg)) return false; } // is client on accepted client class AllowClientClassLst_.first(); while(clntClass = AllowClientClassLst_.get()) { if (clntClass->isStatisfy(msg)) return true; } SPtr range; RejedClnt_.first(); // is client on black list? while(range = RejedClnt_.get()) if (range->in(duid,clntAddr)) return false; if (AcceptClnt_.count()) { AcceptClnt_.first(); // there's white list while(range = AcceptClnt_.get()) { // is client on this white list? if (range->in(duid,clntAddr)) return true; } return false; } if (AllowClientClassLst_.count()) return false ; return true; } /* * is client prefered in this class? (= is it in whitelist?) */ bool TSrvCfgAddrClass::clntPrefered(SPtr duid,SPtr clntAddr) { SPtr range; RejedClnt_.first(); // is client on black list? while(range = RejedClnt_.get()) if (range->in(duid,clntAddr)) return false; if (AcceptClnt_.count()) { AcceptClnt_.first(); while(range = AcceptClnt_.get()) { if (range->in(duid,clntAddr)) return true; } return false; } else { return false; } } uint32_t TSrvCfgAddrClass::chooseTime(uint32_t beg, uint32_t end, uint32_t clntTime) { if (clntTime < beg) return beg; if (clntTime > end) return end; return clntTime; } uint32_t TSrvCfgAddrClass::getT1(uint32_t clntT1) { return chooseTime(T1Min_, T1Max_, clntT1); } uint32_t TSrvCfgAddrClass::getT2(uint32_t clntT2) { return chooseTime(T2Min_, T2Max_, clntT2); } uint32_t TSrvCfgAddrClass::getPref(uint32_t clntPref) { return chooseTime(PrefMin_, PrefMax_, clntPref); } uint32_t TSrvCfgAddrClass::getValid(uint32_t clntValid) { return chooseTime(ValidMin_, ValidMax_, clntValid); } void TSrvCfgAddrClass::setOptions(SPtr opt) { T1Min_ = opt->getT1Beg(); T2Min_ = opt->getT2Beg(); T1Max_ = opt->getT1End(); T2Max_ = opt->getT2End(); PrefMin_ = opt->getPrefBeg(); PrefMax_ = opt->getPrefEnd(); ValidMin_ = opt->getValidBeg(); ValidMax_ = opt->getValidEnd(); Share_ = opt->getShare(); AllowLst_ = opt->getAllowClientClassString(); DenyLst_ = opt->getDenyClientClassString(); ClassMaxLease_ = opt->getClassMaxLease(); SPtr statRange; opt->firstRejedClnt(); while(statRange = opt->getRejedClnt()) RejedClnt_.append(statRange); opt->firstAcceptClnt(); while(statRange = opt->getAcceptClnt()) AcceptClnt_.append(statRange); opt->firstPool(); Pool_ = opt->getPool(); if (opt->getPool()) { Log(Warning) << "Two or more pool defined. Only one is used." << LogEnd; } // set up address counter counts AddrsCount_ = Pool_->rangeCount(); AddrsAssigned_ = 0; if (ClassMaxLease_ > AddrsCount_) ClassMaxLease_ = AddrsCount_; AddrParams_ = opt->getAddrParams(); } bool TSrvCfgAddrClass::addrInPool(SPtr addr) { return Pool_->in(addr); } unsigned long TSrvCfgAddrClass::countAddrInPool() { return AddrsCount_; } SPtr TSrvCfgAddrClass::getRandomAddr() { return Pool_->getRandomAddr(); } SPtr TSrvCfgAddrClass::getFirstAddr() { return Pool_->getAddrL(); } SPtr TSrvCfgAddrClass::getLastAddr() { return Pool_->getAddrR(); } unsigned long TSrvCfgAddrClass::getClassMaxLease() { return ClassMaxLease_; } unsigned long TSrvCfgAddrClass::getID() { return ID_; } unsigned long TSrvCfgAddrClass::getShare() { return Share_; } long TSrvCfgAddrClass::incrAssigned(int count) { AddrsAssigned_ += count; return AddrsAssigned_; } long TSrvCfgAddrClass::decrAssigned(int count) { AddrsAssigned_ -= count; return AddrsAssigned_; } unsigned long TSrvCfgAddrClass::getAssignedCount() { return AddrsAssigned_; } bool TSrvCfgAddrClass::isLinkLocal() { SPtr addr = new TIPv6Addr("fe80::",true); if (addrInPool(addr)) { Log(Crit) << "Link local address (fe80::) belongs to the class." << LogEnd; return true; } addr = new TIPv6Addr("fe80:ffff:ffff:ffff:ffff:ffff:ffff:ffff", true); if (addrInPool(addr)) { Log(Crit) << "Link local address (fe80:ffff:ffff:ffff:ffff:ffff:ffff:ffff) belongs to the class." << LogEnd; return true; } addr = Pool_->getAddrL(); char linklocal[] = {0xfeu, 0x80u}; if (!memcmp(addr->getAddr(), linklocal,2)) { Log(Crit) << "Staring address " << addr->getPlain() << " is link-local." << LogEnd; return true; } addr = Pool_->getAddrR(); if (!memcmp(addr->getAddr(), linklocal,2)) { Log(Crit) << "Ending address " << addr->getPlain() << " is link-local." << LogEnd; return true; } return false; } SPtr TSrvCfgAddrClass::getAddrParams() { return AddrParams_; } ostream& operator<<(ostream& out,TSrvCfgAddrClass& addrClass) { out << " " << std::endl; out << " " << endl; out << " " << endl; out << " " << endl; out << " " <" << endl; out << " " << addrClass.ClassMaxLease_ << "" << endl; SPtr statRange; out << " " << endl; out << *addrClass.Pool_; out << " " << endl; addrClass.RejedClnt_.first(); while(statRange=addrClass.RejedClnt_.get()) out << *statRange; out << " " << endl; addrClass.AcceptClnt_.first(); while(statRange=addrClass.AcceptClnt_.get()) out << *statRange; if (addrClass.AddrParams_) out << " getPrefix() << "\" bitfield=\"" << addrClass.AddrParams_->getBitfield() << "\"/>" << endl; out << " " << std::endl; return out; } /** * Create the AllowClientClassLst and DenyClientClassLst * * @param clientClassLst list of available client class names */ void TSrvCfgAddrClass::mapAllowDenyList( List(TSrvCfgClientClass) clientClassLst ) { Log(Info) << "Mapping allow, deny list to class "<< ID_ << ":" << clientClassLst.count() << " allow/deny entries in total." << LogEnd; SPtr classname; SPtr clntClass; AllowLst_.first(); while (classname = AllowLst_.get()) { clientClassLst.first(); while( clntClass = clientClassLst.get() ) { if (clntClass->getClassName()== *classname) { AllowClientClassLst_.append(clntClass); Log(Debug) << " Insert into allow list " <getClassName() << LogEnd; } } } DenyLst_.first(); while (classname = DenyLst_.get()) { clientClassLst.first(); while( clntClass = clientClassLst.get() ) { if (clntClass->getClassName()== *classname) { DenyClientClassLst_.append(clntClass); Log(Debug) << " Insert into deny list " <getClassName()< * Marek Senderski * * released under GNU GPL v2 only licence */ #include "SrvParsGlobalOpt.h" #include "DHCPDefaults.h" #include "Portable.h" #include "Logger.h" using namespace std; TSrvParsGlobalOpt::TSrvParsGlobalOpt(void) :Experimental_(false), WorkDir_(DEFAULT_WORKDIR), Stateless_(false), InactiveMode_(false), GuessMode_(false), CacheSize_(SERVER_DEFAULT_CACHE_SIZE), InterfaceIDOrder_(SRV_IFACE_ID_ORDER_BEFORE) { } TSrvParsGlobalOpt::~TSrvParsGlobalOpt(void) { } std::string TSrvParsGlobalOpt::getWorkDir() const { return WorkDir_; } void TSrvParsGlobalOpt::setWorkDir(const std::string& dir) { WorkDir_ = dir; } void TSrvParsGlobalOpt::setStateless(bool stateless) { Stateless_ = stateless; } bool TSrvParsGlobalOpt::getStateless() const { return Stateless_; } void TSrvParsGlobalOpt::setExperimental(bool exper) { Experimental_ = exper; } bool TSrvParsGlobalOpt::getExperimental() const { return Experimental_; } void TSrvParsGlobalOpt::setCacheSize(int bytes) { CacheSize_ = bytes; } int TSrvParsGlobalOpt::getCacheSize() const { return CacheSize_; } void TSrvParsGlobalOpt::setInterfaceIDOrder(ESrvIfaceIdOrder order) { InterfaceIDOrder_ = order; } ESrvIfaceIdOrder TSrvParsGlobalOpt::getInterfaceIDOrder() const { return InterfaceIDOrder_; } void TSrvParsGlobalOpt::setInactiveMode(bool flex) { InactiveMode_ = flex; } bool TSrvParsGlobalOpt::getInactiveMode() const { return InactiveMode_; } void TSrvParsGlobalOpt::setGuessMode(bool guess) { GuessMode_ = guess; } bool TSrvParsGlobalOpt::getGuessMode() const { return GuessMode_; } dibbler-1.0.1/SrvCfgMgr/SrvCfgClientClass.cpp0000664000175000017500000000155012233256142015723 00000000000000/* * Dibbler - a portable DHCPv6 * * authors: Nguyen Vinh Nghiem * changes: Tomasz Mrugalski * * released under GNU GPL v2 or later licence * */ #include using namespace std; #include "SrvCfgClientClass.h" #include "SrvMsg.h" TSrvCfgClientClass::TSrvCfgClientClass() :classname("") { } TSrvCfgClientClass::TSrvCfgClientClass(std::string name) :classname(name) { } TSrvCfgClientClass::TSrvCfgClientClass(std::string name , SPtr& cond) :classname(name), condition(cond) { } TSrvCfgClientClass::~TSrvCfgClientClass() { } std::string TSrvCfgClientClass::getClassName() { return classname; } SPtr TSrvCfgClientClass::getCondition() { return condition; } bool TSrvCfgClientClass::isStatisfy(SPtr msg) { if (condition->exec(msg) == "true") return true; return false; } dibbler-1.0.1/SrvCfgMgr/SrvCfgMgr.cpp0000664000175000017500000011023412560471634014254 00000000000000/* * Dibbler - a portable DHCPv6 * * authors: Tomasz Mrugalski * Marek Senderski * changes: Petr Pisar * Michal Kowalczuk * Nguyen Vinh Nghiem * Grzegorz Pluto * * released under GNU GPL v2 only licence * */ #include #include #include #include #include #include "SmartPtr.h" #include "Portable.h" #include "FlexLexer.h" #include "SrvParser.h" #include "SrvCfgMgr.h" #include "SrvCfgIface.h" #include "Logger.h" #include "IfaceMgr.h" #include "SrvIfaceMgr.h" #include "AddrMgr.h" #include "SrvParser.h" #include "OptDUID.h" using namespace std; TSrvCfgMgr * TSrvCfgMgr::Instance = 0; int TSrvCfgMgr::NextRelayID = RELAY_MIN_IFINDEX; TSrvCfgMgr::TSrvCfgMgr(const std::string& cfgFile, const std::string& xmlFile) :TCfgMgr(), XmlFile(xmlFile), Reconfigure_(false), PerformanceMode_(false), DropUnicast_(false) { setDefaults(); // load config file if (!this->parseConfigFile(cfgFile)) { IsDone = true; return; } // load or create DUID string duidFile = (string)SRVDUID_FILE; if (!setDUID(duidFile, SrvIfaceMgr())) { this->IsDone=true; return; } this->dump(); #ifndef MOD_DISABLE_AUTH AuthKeys = new KeyList(); #endif IsDone = false; } void TSrvCfgMgr::setDefaults() { BulkLQAccept = BULKLQ_ACCEPT; BulkLQTcpPort = BULKLQ_TCP_PORT; BulkLQMaxConns = BULKLQ_MAX_CONNS; BulkLQTimeout = BULKLQ_TIMEOUT; } bool TSrvCfgMgr::parseConfigFile(const std::string& cfgFile) { int result; ifstream f; // parse config file f.open( cfgFile.c_str() ); if ( ! f.is_open() ) { Log(Crit) << "Unable to open " << cfgFile << " file." << LogEnd; return false; } else { Log(Notice) << "Parsing " << cfgFile << " config file..." << LogEnd; } yyFlexLexer lexer(&f,&clog); SrvParser parser(&lexer); parser.CfgMgr = this; // just a workaround (parser is called, while SrvCfgMgr is still // in constructor, so instance() singleton method can't be called result = parser.yyparse(); Log(Debug) << "Parsing " << cfgFile << " done." << LogEnd; f.close(); this->LogLevel = logger::getLogLevel(); this->LogName = logger::getLogName(); if (result) { Log(Crit) << "Fatal error during config parsing." << LogEnd; this->IsDone = true; return false; } // setup global options this->setGlobalOptions(parser.ParserOptStack.getLast()); // setup ClientClass List ClientClassLst = parser.SrvCfgClientClassLst; Log(Info) << ClientClassLst.count() << " client class(es) defined." << LogEnd; // analyse interfaces mentioned in config file if (!this->matchParsedSystemInterfaces(&parser)) { this->IsDone = true; return false; } // check for invalid values, e.g. T1>T2 if(!this->validateConfig()) { this->IsDone = true; return false; } if (this->stateless()) { Log(Notice) << "Running in stateless mode." << LogEnd; } else { Log(Notice) << "Running in stateful mode." << LogEnd; } // @todo: remove this info later Log(Debug) << "Bulk-leasequery: enabled=" << (BulkLQAccept?"yes":"no") << ", TCP port=" << BulkLQTcpPort << ", max conns=" << BulkLQMaxConns << ", timeout=" << BulkLQTimeout << LogEnd; return true; } void TSrvCfgMgr::dump() { std::ofstream xmlDump; xmlDump.open(this->XmlFile.c_str()); xmlDump << *this; xmlDump.close(); } bool TSrvCfgMgr::setGlobalOptions(SPtr opt) { this->Workdir = opt->getWorkDir(); this->Stateless = opt->getStateless(); this->CacheSize = opt->getCacheSize(); this->InterfaceIDOrder = opt->getInterfaceIDOrder(); this->InactiveMode = opt->getInactiveMode(); // should the client accept not ready interfaces? this->GuessMode = opt->getGuessMode(); return true; } /* * Now parsed information should be placed in config manager * in accordance with information provided by interface manager */ bool TSrvCfgMgr::matchParsedSystemInterfaces(SrvParser *parser) { int cfgIfaceCnt; cfgIfaceCnt = parser->SrvCfgIfaceLst.count(); Log(Debug) << cfgIfaceCnt << " interface(s) specified in " << SRVCONF_FILE << LogEnd; SPtr cfgIface; SPtr ifaceIface; parser->SrvCfgIfaceLst.first(); while(cfgIface=parser->SrvCfgIfaceLst.get()) { // for each interface from config file // map deny and allow list cfgIface->mapAllowDenyList(parser->SrvCfgClientClassLst); // relay interface if (cfgIface->isRelay()) { cfgIface->setID(this->NextRelayID++); // let's find physical interface underneath SPtr under_relay = cfgIface; ifaceIface = SPtr(); while (!ifaceIface && under_relay && under_relay->getRelayName() != "") { ifaceIface = SrvIfaceMgr().getIfaceByName(under_relay->getRelayName()); if (!ifaceIface) { under_relay = getIfaceByName(under_relay->getRelayName()); } } if (!ifaceIface) { Log(Crit) << "Interface " << cfgIface->getFullName() << " defined physical interface as " << cfgIface->getRelayName() << ", but there is no such interface present." << LogEnd; return false; } cfgIface->setRelayID(ifaceIface->getID()); addIface(cfgIface); continue; // skip physical interface checking part } // physical interface if (cfgIface->getID()==-1) { // ID==-1 means that user referenced to interface by name ifaceIface = SrvIfaceMgr().getIfaceByName(cfgIface->getName()); } else { ifaceIface = SrvIfaceMgr().getIfaceByID(cfgIface->getID()); } if (!ifaceIface) { Log(Crit) << "Interface " << cfgIface->getFullName() << " is not present in the system or does not support IPv6." << LogEnd; return false; } // Complete name and ID (one of them usually misses depending on // identifier used in config file. /// @todo: Client's class uses setIface{Name,ID}(). We should unite the // method names. cfgIface->setName(ifaceIface->getName()); cfgIface->setID(ifaceIface->getID()); // Check for link scope address presence if (!ifaceIface->countLLAddress()) { if (this->inactiveMode()) { Log(Notice) << "Interface " << ifaceIface->getFullName() << " is not operational yet (does not have link scope address), skipping it for now." << LogEnd; this->addIface(cfgIface); this->makeInactiveIface(cfgIface->getID(), true); // move it to InactiveLst continue; } Log(Crit) << "Interface " << ifaceIface->getName() << "/" << ifaceIface->getID() << " is down or doesn't have any link scope address." << LogEnd; return false; } // Check if the interface is during bring-up phase (i.e. DAD procedure for link-local addr is not complete yet) char tmp[64]; ifaceIface->firstLLAddress(); inet_ntop6(ifaceIface->getLLAddress(), tmp); if (is_addr_tentative(ifaceIface->getName(), ifaceIface->getID(), tmp) == LOWLEVEL_TENTATIVE_YES) { Log(Notice) << "Interface " << ifaceIface->getFullName() << " has link-scope address " << tmp << ", but it is currently tentative." << LogEnd; if (this->inactiveMode()) { Log(Notice) << "Interface " << ifaceIface->getFullName() << " is not operational yet (link-scope address is not ready), skipping it for now." << LogEnd; addIface(cfgIface); makeInactiveIface(cfgIface->getID(), true); // move it to InactiveLst continue; } Log(Crit) << "Interface " << ifaceIface->getFullName() << " has tentative link-scope address (and inactive-mode is disabled)." << LogEnd; return false; } this->addIface(cfgIface); Log(Info) << "Interface " << cfgIface->getFullName() << " configuration has been loaded." << LogEnd; } return true; } SPtr TSrvCfgMgr::getIface() { return this->SrvCfgIfaceLst.get(); } void TSrvCfgMgr::addIface(SPtr ptr) { SrvCfgIfaceLst.append(ptr); } /** * Moves interface identified by ifindex between SrvCfgIfaceLst and InactiveLst. * * @param ifindex Index of the moving interface * @param inactive true for makeing inactive, false for makeing active */ void TSrvCfgMgr::makeInactiveIface(int ifindex, bool inactive) { SPtr x; if (inactive) { SrvCfgIfaceLst.first(); while (x= SrvCfgIfaceLst.get()) { if (x->getID() == ifindex) { Log(Info) << "Switching " << x->getFullName() << " to inactive-mode." << LogEnd; SrvCfgIfaceLst.del(); InactiveLst.append(x); return; } } Log(Error) << "Unable to switch interface ifindex=" << ifindex << " to inactive-mode: interface not found." << LogEnd; // something is wrong, VERY wrong } else { InactiveLst.first(); while (x= InactiveLst.get()) { if (x->getID() == ifindex) { Log(Info) << "Switching " << x->getFullName() << " to normal mode." << LogEnd; InactiveLst.del(); InactiveLst.first(); addIface(x); return; } } Log(Error) << "Unable to switch interface ifindex=" << ifindex << " from inactive-mode to normal operation: interface not found." << LogEnd; } } /** * Returns number of inactive interfaces */ int TSrvCfgMgr::inactiveIfacesCnt() { return InactiveLst.count(); } void TSrvCfgMgr::firstIface() { SrvCfgIfaceLst.first(); } long TSrvCfgMgr::countIface() { return SrvCfgIfaceLst.count(); } /** * * Tryies to find interface in list of inactive interfaces which becames * ready. In positive case such an interface is moved back into standard list. * Only first matching interface is processed. * * @returns Interface that becomes ready and has been moved out of inactive list. * If no such interface exists, 0 will be returned. */ SPtr TSrvCfgMgr::checkInactiveIfaces() { if (!InactiveLst.count()) return SPtr(); // NULL SrvIfaceMgr().redetectIfaces(); SPtr x; SPtr iface; InactiveLst.first(); while (x = InactiveLst.get()) { iface = SrvIfaceMgr().getIfaceByID(x->getID()); if (!iface) { Log(Error) << "TSrvCfgMgr::checkInactiveIfaces(): " << "Unable to find interface with ifindex=" << x->getID() << LogEnd; continue; } iface->firstLLAddress(); if (iface->flagUp() && iface->flagRunning() && iface->getLLAddress()) { // check if its link-local address is not tentative char tmp[64]; iface->firstLLAddress(); inet_ntop6(iface->getLLAddress(), tmp); if (is_addr_tentative(iface->getName(), iface->getID(), tmp)==LOWLEVEL_TENTATIVE_YES) { Log(Debug) << "Interface " << iface->getFullName() << " is up and running, but link-scope address " << tmp << " is currently tentative." << LogEnd; continue; } makeInactiveIface(x->getID(), false); // move it to InactiveLst return x; } } return SPtr(); // NULL } TSrvCfgMgr::~TSrvCfgMgr() { Log(Debug) << "SrvCfgMgr cleanup." << LogEnd; } /** * returns how many addresses can be assigned to this client? * factors used: * - iface-max-lease * - clntSupported() * - class-max-lease in each class * - assignedCount in each class * * @param clntDuid * @param clntAddr * @param iface * * @return return value <= clnt-max-lease <= iface-max-lease */ long TSrvCfgMgr::countAvailAddrs(SPtr clntDuid, SPtr clntAddr, int iface) { /// @todo: long long long int (128bit) could come in handy double avail = 0; // how many are available? double ifaceAssigned = 0; // how many are assigned on this iface? SPtr ptrIface; ptrIface = this->getIfaceByID(iface); if (!ptrIface) { Log(Error) << "Interface " << iface << " does not exist in SrvCfgMgr." << LogEnd; return 0; } unsigned long ifaceMaxLease = ptrIface->getIfaceMaxLease(); SPtr ptrClass; ptrIface->firstAddrClass(); while (ptrClass = ptrIface->getAddrClass()) { if (!ptrClass->clntSupported(clntDuid,clntAddr)) continue; unsigned long classMaxLease; unsigned long classAssigned; double tmp; classMaxLease = ptrClass->getClassMaxLease(); classAssigned = ptrClass->getAssignedCount(); tmp = classMaxLease - classAssigned; ifaceAssigned += classAssigned; if (tmp>0) avail += tmp; } if (avail > (ifaceMaxLease-ifaceAssigned)) avail = ifaceMaxLease-ifaceAssigned; return (long)avail; } /** * return class, which address belongs to * * @param iface * @param addr * * @return pointer to the class (or 0, if no suitable class found) */ SPtr TSrvCfgMgr::getClassByAddr(int iface, SPtr addr) { this->firstIface(); SPtr ptrIface; ptrIface = this->getIfaceByID(iface); if (!ptrIface) { Log(Error) << "Trying to find class on unknown (" << iface <<") interface." << LogEnd; return SPtr(); // NULL } SPtr ptrClass; ptrIface->firstAddrClass(); while (ptrClass = ptrIface->getAddrClass()) { if (ptrClass->addrInPool(addr)) return ptrClass; } return SPtr(); // NULL } /** * get a class, which prefix belongs to * * @param iface * @param addr * * @return class (or 0 if no class is found) */ SPtr TSrvCfgMgr::getClassByPrefix(int iface, SPtr addr) { this->firstIface(); SPtr ptrIface; ptrIface = this->getIfaceByID(iface); if (!ptrIface) { Log(Error) << "Trying to find class on unknown (" << iface <<") interface." << LogEnd; return SPtr(); } SPtr ptrClass; ptrIface->firstPD(); while (ptrClass = ptrIface->getPD()) { if (ptrClass->prefixInPool(addr)) return ptrClass; } return SPtr(); } //on basis of duid/address/iface assign addresss to client SPtr TSrvCfgMgr::getRandomAddr(SPtr clntDuid, SPtr clntAddr, int iface) { SPtr ptrIface; SPtr ptrClass; SPtr any; ptrIface = this->getIfaceByID(iface); if (!ptrIface) { return SPtr(); } any = new TIPv6Addr(); ptrIface->firstAddrClass(); ptrClass = ptrIface->getAddrClass(); return ptrClass->getRandomAddr(); /// @todo: get addrs from first address only } /// Checks if a given client is supported /// /// @param msg message sent by client /// /// @return true if supported, false otherwise bool TSrvCfgMgr::isClntSupported(SPtr msg) { int iface=msg->getIface(); SPtr clntAddr = msg->getRemoteAddr(); SPtr opt = msg->getOption(OPTION_CLIENTID); SPtr duid; if (!opt) { // malformed message or anonymous inf-request duid = new TDUID("", 0); // zero-length DUID } else { SPtr clientId = (Ptr*) opt; duid = clientId->getDUID(); } SPtr ptrIface; firstIface(); while((ptrIface=getIface())&&(ptrIface->getID()!=iface)) ; /** @todo: reject-client and accept-only does not work in stateless mode */ if (this->stateless()) return true; int classCnt = 0; if (ptrIface) { SPtr ptrClass; ptrIface->firstAddrClass(); while(ptrClass=ptrIface->getAddrClass()) { if (ptrClass->clntSupported(duid,clntAddr)) return true; classCnt++; } SPtr pd; ptrIface->firstPD(); while ( pd=ptrIface->getPD() ) { if (pd->clntSupported(duid, clntAddr, msg)) return true; classCnt++; } } if (!classCnt && ptrIface) { Log(Warning) << "There are no address class defined on the " << ptrIface->getFullName() << ". Maybe you are trying to configure clients on cascade relay interface? " << "If that is so, please define separate class on this interface, too." << LogEnd; } else if (!classCnt) { Log(Warning) << "Interface not found." << "Maybe you are trying to configure clients on cascade relay interface? " << "If that is so, please define separate class on this interface, too." << LogEnd; } return false; } #if 0 /* * Method checks whether client is supported and assigned addresses from any class */ bool TSrvCfgMgr::isClntSupported(SPtr duid, SPtr clntAddr, int iface, SPtr msg) { SPtr ptrIface; firstIface(); while((ptrIface=getIface())&&(ptrIface->getID()!=iface)) ; /** @todo: reject-client and accept-only does not work in stateless mode */ if (this->stateless()) return true; int classCnt = 0; if (ptrIface) { SPtr ptrClass; ptrIface->firstAddrClass(); while(ptrClass=ptrIface->getAddrClass()) { if (ptrClass->clntSupported(duid,clntAddr,msg)) return true; classCnt++; } } if (!classCnt) { Log(Warning) << "There are no address class defined on the " << ptrIface->getFullName() << ". Maybe you are trying to configure clients on cascade relay interface? " << "If that is so, please define separate class on this interface, too." << LogEnd; } return false; } #endif /// checks if an address is reserved (checks all interfaces) /// /// @param addr /// /// @return true if reserved, false otherwise bool TSrvCfgMgr::addrReserved(SPtr addr) { SPtr iface; SrvCfgIfaceLst.first(); while (iface = SrvCfgIfaceLst.get()) { if (iface->addrReserved(addr)) return true; } return false; } /// checks if a prefix is reserved (checks all interfaces) /// /// @param prefix prefix to be checked /// /// @return true if reserved, false otherwise bool TSrvCfgMgr::prefixReserved(SPtr prefix) { SPtr iface; SrvCfgIfaceLst.first(); while (iface = SrvCfgIfaceLst.get()) { if (iface->prefixReserved(prefix)) return true; } return false; } bool TSrvCfgMgr::isDone() { return IsDone; } bool TSrvCfgMgr::validateConfig() { SPtr ptrIface; if (0 == (this->countIface() + this->inactiveIfacesCnt())) { Log(Crit) << "Config problem: No interface defined." << LogEnd; return false; } firstIface(); while(ptrIface=getIface()) { if (!this->validateIface(ptrIface)) return false; } return true; } bool TSrvCfgMgr::validateIface(SPtr ptrIface) { SPtr iface = SrvIfaceMgr().getIfaceByID(ptrIface->getID()); if (ptrIface->countAddrClass() && stateless()) { Log(Crit) << "Config problem: Interface " << ptrIface->getFullName() << ": Class definitions present, but stateless mode set." << LogEnd; return false; } if (!ptrIface->countAddrClass() && !ptrIface->countPD() && !ptrIface->getTA() && !stateless()) { if (!ptrIface->isRelay()) { Log(Crit) << "Config problem: Interface " << ptrIface->getName() << "/" << ptrIface->getID() << ": No class definitions (IA,TA or PD) present, but stateless mode not set." << LogEnd; return false; } else { Log(Notice) << "Interface " << ptrIface->getFullName() << " has no address or prefix pools defined." << LogEnd; } } if (ptrIface->supportFQDN() && !ptrIface->getExtraOption(OPTION_DNS_SERVERS)) { Log(Crit) << "FQDN defined on the " << ptrIface->getFullName() << ", but no DNS servers defined." << " Please disable FQDN support or add DNS servers." << LogEnd; return false; } SPtr ptrClass; ptrIface->firstAddrClass(); while(ptrClass=ptrIface->getAddrClass()) { if (!this->validateClass(ptrIface, ptrClass)) { Log(Crit) << "Config problem: Interface " << ptrIface->getName() << "/" << ptrIface->getID() << ": Invalid class defined." << LogEnd; return false; } } return true; } bool TSrvCfgMgr::validateClass(SPtr ptrIface, SPtr ptrClass) { if (ptrClass->isLinkLocal()) { Log(Crit) << "One of the classes defined on the " << ptrIface->getName() << "/" << ptrIface->getID() << " overlaps with link local addresses." << LogEnd; return false; } if ( ptrClass->getPref(0) > ptrClass->getValid(0x7fffffff) ) { Log(Crit) << "Prefered time max value (" <getPref(0x7fffffff) << ") can't be lower than valid time min. value (" << ptrClass->getValid(0) << ") on the " << ptrIface->getName() << "/" << ptrIface->getID() << " interface." << LogEnd; return false; } if ( ptrClass->getT1(0)>ptrClass->getT2(0x7fffffff) ) { Log(Crit) << "T1 timeout upper bound (" <getPref(0x7fffffff) << " can't be lower than T2 lower bound (" << ptrClass->getT2(0) << ") on the "<getName()<<"/" << ptrIface->getID() << " interface." << LogEnd; return false; } return true; } SPtr TSrvCfgMgr::getIfaceByID(int iface) { SPtr ptrIface; firstIface(); while ( ptrIface = getIface() ) { if ( ptrIface->getID()==iface ) return ptrIface; } Log(Error) << "Invalid interface (ifindex=" << iface << ") specifed: no such interface." << LogEnd; return SPtr(); // NULL } SPtr TSrvCfgMgr::getIfaceByName(const std::string& name) { SPtr ptrIface; firstIface(); while ( ptrIface = getIface() ) { if ( ptrIface->getName()==name ) { return ptrIface; } } Log(Error) << "Invalid interface (name=" << name << ") specifed: no such interface." << LogEnd; return SPtr(); // NULL } void TSrvCfgMgr::delClntAddr(int iface, SPtr addr) { SPtr ptrIface; ptrIface = this->getIfaceByID(iface); if (!ptrIface) { Log(Warning) << "Unable to decrease address usage: unknown interface (id=" << iface << ")" << LogEnd; return; } ptrIface->delClntAddr(addr); } void TSrvCfgMgr::addClntAddr(int iface, SPtr addr) { SPtr ptrIface; ptrIface = this->getIfaceByID(iface); if (!ptrIface) { Log(Warning) << "Unable to increase address usage: unknown interface (id=" << iface << ")" << LogEnd; return; } ptrIface->addClntAddr(addr); } void TSrvCfgMgr::addTAAddr(int iface) { SPtr ptrIface; ptrIface = this->getIfaceByID(iface); if (!ptrIface) { Log(Error) << "Unable to increase address usage: interface (id=" << iface << ") not found." << LogEnd; return; } ptrIface->addTAAddr(); } void TSrvCfgMgr::delTAAddr(int iface) { SPtr ptrIface; ptrIface = this->getIfaceByID(iface); if (!ptrIface) { Log(Error) << "Unable to decrease address usage: interface (id=" << iface << ") not found." << LogEnd; return; } ptrIface->delTAAddr(); } bool TSrvCfgMgr::stateless() { return this->Stateless; } bool TSrvCfgMgr::inactiveMode() { return InactiveMode; } bool TSrvCfgMgr::guessMode() { return GuessMode; } bool TSrvCfgMgr::setupRelay(SPtr cfgIface) { SPtr iface; string name = cfgIface->getRelayName(); iface = SrvIfaceMgr().getIfaceByName(name); if (!iface) { Log(Crit) << "Underlaying interface for " << cfgIface->getFullName() << " with name " << name << " is missing." << LogEnd; return false; } cfgIface->setRelayID(iface->getID()); return true; } /** * returns size (in bytes of the configured cache size * * @return */ int TSrvCfgMgr::getCacheSize() { return this->CacheSize; } ESrvIfaceIdOrder TSrvCfgMgr::getInterfaceIDOrder() { return InterfaceIDOrder; } /// @ decreases prefix usage count (i.e. decreases prefix-pool usage by one) /// Actual prefix is also deleted in AddrMgr. /// /// @param ifindex interface index /// @param prefix prefix to be deleted /// /// @return true is deletion was successful bool TSrvCfgMgr::decrPrefixCount(int ifindex, SPtr prefix) { SPtr iface; iface = getIfaceByID(ifindex); if (!iface) { Log(Error) << "Unable to find interface with ifindex=" << ifindex << ", prefix deletion aborted." << LogEnd; return false; } return iface->delClntPrefix(prefix); } bool TSrvCfgMgr::incrPrefixCount(int ifindex, SPtr prefix) { SPtr iface; iface = getIfaceByID(ifindex); if (!iface) { Log(Error) << "Unable to find interface with ifindex=" << ifindex << ", prefix increase count aborted." << LogEnd; return false; } return iface->addClntPrefix(prefix); } #ifndef MOD_DISABLE_AUTH /// @todo move this to CfgMgr and unify with TClntCfgMgr::setAuthAcceptMethods void TSrvCfgMgr::setAuthDigests(const DigestTypesLst& types) { DigestTypesLst_ = types; } DigestTypesLst TSrvCfgMgr::getAuthDigests() { return DigestTypesLst_; } enum DigestTypes TSrvCfgMgr::getDigest() { if (DigestTypesLst_.empty()) return DIGEST_NONE; return DigestTypesLst_[0]; } #endif // -------------------------------------------------------------------- // --- operators ------------------------------------------------------ // -------------------------------------------------------------------- ostream & operator<<(ostream &out, TSrvCfgMgr &x) { out << "" << std::endl; out << " " << x.getWorkDir() << "" << endl; out << " " << x.getLogName() << "" << endl; out << " " << x.getLogLevel() << "" << endl; out << " " << (x.InactiveMode?1:0) << "" << endl; out << " " << (x.GuessMode?1:0) << "" << endl; if (x.DUID) out << " " << *x.DUID; else out << " " << std::endl; out << " "; switch (x.InterfaceIDOrder) { case SRV_IFACE_ID_ORDER_BEFORE: out << "before"; break; case SRV_IFACE_ID_ORDER_AFTER: out << "after"; break; case SRV_IFACE_ID_ORDER_NONE: out << "none"; break; default: out << "unknown(" << x.InterfaceIDOrder << ")"; break; } out << "" << endl; #ifndef MOD_DISABLE_AUTH out << " "; for (DigestTypesLst::const_iterator dig = x.DigestTypesLst_.begin(); dig != x.DigestTypesLst_.end(); ++dig) { out << getDigestName(*dig) << " "; } out << "" << endl; #endif if (x.stateless()) out << " " << std::endl; else out << " " << std::endl; SPtr ptrIface; x.firstIface(); while (ptrIface = x.getIface()) { out << *ptrIface; } out << "" << std::endl; return out; } /// @todo: Fix this! We check if message is from accepted client, but don't do anything with that info void TSrvCfgMgr::InClientClass(SPtr msg) { // For each client class, check whether the message belong to ClientClass ClientClassLst.first(); SPtr clntClass; while( clntClass= ClientClassLst.get() ) { Log(Debug) << "Checking if client belongs to " << clntClass->getClassName() << " client class"; if (clntClass->isStatisfy(msg)) Log(Cont)<<" ... yes." << LogEnd; else Log(Cont)<<" ... no." << LogEnd; } } void TSrvCfgMgr::setReconfigureSupport(bool reconf) { Reconfigure_ = reconf; } bool TSrvCfgMgr::getReconfigureSupport() { return Reconfigure_; } /// @brief removes reserved entries from the cache void TSrvCfgMgr::removeReservedFromCache() { SPtr iface; SrvCfgIfaceLst.first(); unsigned int cnt = 0; while (iface = SrvCfgIfaceLst.get()) { cnt += iface->removeReservedFromCache(); } if (cnt) { Log(Info) << "Removed " << cnt << " leases from cache that are reserved." << LogEnd; } } /** * sets pool usage counters (used during bringup, after AddrDB is loaded from file) * */ void TSrvCfgMgr::setCounters() { int iaCnt = 0, pdCnt = 0; SrvAddrMgr().firstClient(); SPtr client; SPtr iface; while (client = SrvAddrMgr().getClient()) { // addresses SPtr ia; client->firstIA(); while ( ia=client->getIA() ) { iface = getIfaceByID(ia->getIfindex()); if (!iface) continue; SPtr addr; ia->firstAddr(); while ( addr=ia->getAddr() ) { iface->addClntAddr(addr->get(), true/*quiet*/); iaCnt++; } } // prefixes client->firstPD(); while (ia = client->getPD() ) { iface = getIfaceByID(ia->getIfindex()); if (!iface) continue; SPtr prefix; ia->firstPrefix(); while ( prefix=ia->getPrefix() ) { iface->addClntPrefix(prefix->get(), true); pdCnt++; } } } Log(Debug) << "Increased pools usage: currently " << iaCnt << " address(es) and " << pdCnt << " prefix(es) are leased." << LogEnd; } void TSrvCfgMgr::instanceCreate(const std::string& cfgFile, const std::string& xmlDumpFile ) { if (Instance) { Log(Crit) << "SrvCfgMgr already created. Application error!" << LogEnd; return; } Instance = new TSrvCfgMgr(cfgFile, xmlDumpFile); } TSrvCfgMgr & TSrvCfgMgr::instance() { if (!Instance) { Log(Crit) << "SrvCfgMgr not initalized yet. Application error. Emergency shutdown." << LogEnd; exit(EXIT_FAILURE); } return *Instance; } // Bulk-LeaseQuery void TSrvCfgMgr::bulkLQAccept(bool enabled) { BulkLQAccept = enabled; } void TSrvCfgMgr::bulkLQTcpPort(unsigned short portNumber) { BulkLQTcpPort = portNumber; } void TSrvCfgMgr::bulkLQMaxConns(unsigned int maxConnections) { BulkLQMaxConns = maxConnections; } void TSrvCfgMgr::bulkLQTimeout(unsigned int timeout) { BulkLQTimeout = timeout; } /// Sets DNS server address suitable for DNS Update /// /// @param ddnsAddress DNS server address void TSrvCfgMgr::setDDNSAddress(SPtr ddnsAddress) { FqdnDdnsAddress = ddnsAddress; } /// Returns DNS server address suitable for DNS Update /// /// @param iface interface index /// /// @return DNS address (or NULL) SPtr TSrvCfgMgr::getDDNSAddress(int iface) { if (FqdnDdnsAddress) return FqdnDdnsAddress; SPtr ptrIface = this->getIfaceByID(iface); if (!ptrIface) { Log(Warning) << "No global DNS Update address specified and can't find dns-address on " << "interface " << iface << LogEnd; return SPtr(); // NULL } SPtr DNSAddr; SPtr opt = (Ptr*) ptrIface->getExtraOption(OPTION_DNS_SERVERS); if (!opt) { Log(Error) << "DDNS: DNS Update aborted. DNS server address is not specified." << LogEnd; return SPtr(); // NULL } List(TIPv6Addr) DNSSrvLst = opt->getAddrLst(); DNSSrvLst.first(); if (DNSSrvLst.count()) DNSAddr = DNSSrvLst.get(); if (!DNSAddr) { } return DNSAddr; } /// @brief returns ifindex of an interface with specified interface-id /// /// @param interfaceID pointer to TSrvOptInterfaceID /// /// @return interface index (or -1 if not found) int TSrvCfgMgr::getRelayByInterfaceID(SPtr interfaceID) { if (!interfaceID) { return -1; } firstIface(); while (SPtr cfgIface = getIface()) { SPtr cfgIfaceID = cfgIface->getRelayInterfaceID(); if (cfgIfaceID && (*cfgIfaceID == *interfaceID)) { return cfgIface->getID(); } } return -1; } /// @brief returns ifindex of an interface with matched address /// /// @param addr address to be matched /// /// @return interface index (or -1 if not found) int TSrvCfgMgr::getRelayByLinkAddr(SPtr addr) { SPtr cfgIface; firstIface(); while (cfgIface = getIface()) { if (cfgIface->addrInSubnet(addr)) { Log(Debug) << "Address " << addr->getPlain() << " matched on interface " << cfgIface->getFullName() << LogEnd; return cfgIface->getID(); } } Log(Warning) << "Finding RELAYs using link address failed." << LogEnd; return -1; } /// @brief return any relay (used with guess-mode on) /// /// @return interface index of the first relay (or -1 if there are no relays) int TSrvCfgMgr::getAnyRelay() { SPtr cfgIface; firstIface(); while (cfgIface = getIface()) { if (cfgIface->isRelay()) { Log(Debug) << "Guess-mode: Picked " << cfgIface->getFullName() << " as relay." << LogEnd; return cfgIface->getID(); } } return -1; } #ifndef MOD_DISABLE_AUTH /// returns key-id that should be used for a given client-id /// /// @param clientid client identifier /// /// @return Key ID to be used (or 0) uint32_t TSrvCfgMgr::getDelayedAuthKeyID(const char* mapping_file, SPtr clientid) { ifstream f(mapping_file, ios::in); if (!f.is_open()) { Log(Error) << "Can't open keys mapping file: " << mapping_file << LogEnd; // map not found or is inaccessible return 0; } string lookingfor = clientid->getPlain(); for( std::string line; getline( f, line ); ) { if (line.empty()) continue; if (!line.empty() && (line[0] == '#') ) continue; std::istringstream iss(line); string duid; uint32_t keyid; // parse the line. We don't really care if it is malformed. // If it is, server will not use the right key iss >> duid >> hex >> keyid; duid = duid.substr(0, duid.find(",")); if (duid == lookingfor) { return keyid; } } // no key found return 0; } #endif void TSrvCfgMgr::setPerformanceMode(bool mode) { PerformanceMode_ = mode; } bool TSrvCfgMgr::getPerformanceMode() { return PerformanceMode_; } void TSrvCfgMgr::dropUnicast(bool drop) { DropUnicast_ = drop; } bool TSrvCfgMgr::dropUnicast() { return DropUnicast_; } dibbler-1.0.1/SrvCfgMgr/SrvParsClassOpt.h0000664000175000017500000000550312233256142015124 00000000000000/* * Dibbler - a portable DHCPv6 * * authors: Tomasz Mrugalski * Marek Senderski * changes: Nguyen Vinh Nghiem * * released under GNU GPL v2 only licence * */ class TSrvParsClassOpt; #ifndef TSRVPARSCLASS_H #define TSRVPARSCLASS_H #include #include "DHCPConst.h" #include "Container.h" #include "SmartPtr.h" #include "HostID.h" #include "HostRange.h" #include "IPv6Addr.h" #include "SrvOptAddrParams.h" class TSrvParsClassOpt { public: TSrvParsClassOpt(void); ~TSrvParsClassOpt(void); //T1,T2,Valid,Prefered time routines void setT1Beg(unsigned long t1); void setT1End(unsigned long t1); unsigned long getT1Beg(); unsigned long getT1End(); void setT2Beg(unsigned long t2); void setT2End(unsigned long t2); unsigned long getT2Beg(); unsigned long getT2End(); void setPrefBeg(unsigned long pref); void setPrefEnd(unsigned long pref); unsigned long getPrefBeg(); unsigned long getPrefEnd(); void setShare(unsigned long share); unsigned long getShare(); void setValidEnd(unsigned long valid); void setValidBeg(unsigned long valid); unsigned long getValidEnd(); unsigned long getValidBeg(); //Rejected clients access routines void addRejedClnt(SPtr addr); void firstRejedClnt(); SPtr getRejedClnt(); void setRejedClnt(TContainer > *rejedClnt); //Accepted clients access routines void addAcceptClnt(SPtr addr); void firstAcceptClnt(); SPtr getAcceptClnt(); void setAcceptClnt(TContainer > *acceptClnt); //Pool access routines void addPool(SPtr addr); void firstPool(); SPtr getPool(); void setPool(TContainer > *pool); long countPool(); // leases count void setClassMaxLease(unsigned long maxClntLeases); unsigned long getClassMaxLease(); void setAddrParams(int prefix, int bitfield); SPtr getAddrParams(); // Allow and deny list void setAllowClientClass(std::string s); List(std::string) getAllowClientClassString(); void setDenyClientClass(std::string s); List(std::string) getDenyClientClassString(); private: //Ranges of T1 i T2 unsigned long T1Beg; unsigned long T1End; unsigned long T2End; unsigned long T2Beg; unsigned long PrefBeg; unsigned long PrefEnd; unsigned long ValidBeg; unsigned long ValidEnd; unsigned long Share; TContainer > RejedClnt; TContainer > AcceptClnt; TContainer > Pool; unsigned long ClassMaxLease; // AddrParams fields SPtr AddrParams; List(std::string) allowLst; List(std::string) denyLst; }; #endif dibbler-1.0.1/SrvCfgMgr/Makefile.in0000664000175000017500000016604112561652535013766 00000000000000# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ @HAVE_GTEST_TRUE@am__append_1 = tests subdir = SrvCfgMgr DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/depcomp $(dist_noinst_DATA) ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/libtool.m4 \ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/include/dibbler-config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = LIBRARIES = $(noinst_LIBRARIES) ARFLAGS = cru AM_V_AR = $(am__v_AR_@AM_V@) am__v_AR_ = $(am__v_AR_@AM_DEFAULT_V@) am__v_AR_0 = @echo " AR " $@; am__v_AR_1 = libSrvCfgMgr_a_AR = $(AR) $(ARFLAGS) libSrvCfgMgr_a_LIBADD = am_libSrvCfgMgr_a_OBJECTS = \ libSrvCfgMgr_a-NodeClientSpecific.$(OBJEXT) \ libSrvCfgMgr_a-NodeConstant.$(OBJEXT) \ libSrvCfgMgr_a-Node.$(OBJEXT) \ libSrvCfgMgr_a-NodeOperator.$(OBJEXT) \ libSrvCfgMgr_a-SrvCfgAddrClass.$(OBJEXT) \ libSrvCfgMgr_a-SrvCfgClientClass.$(OBJEXT) \ libSrvCfgMgr_a-SrvCfgIface.$(OBJEXT) \ libSrvCfgMgr_a-SrvCfgMgr.$(OBJEXT) \ libSrvCfgMgr_a-SrvCfgOptions.$(OBJEXT) \ libSrvCfgMgr_a-SrvCfgPD.$(OBJEXT) \ libSrvCfgMgr_a-SrvCfgTA.$(OBJEXT) \ libSrvCfgMgr_a-SrvLexer.$(OBJEXT) \ libSrvCfgMgr_a-SrvParsClassOpt.$(OBJEXT) \ libSrvCfgMgr_a-SrvParser.$(OBJEXT) \ libSrvCfgMgr_a-SrvParsGlobalOpt.$(OBJEXT) \ libSrvCfgMgr_a-SrvParsIfaceOpt.$(OBJEXT) libSrvCfgMgr_a_OBJECTS = $(am_libSrvCfgMgr_a_OBJECTS) AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)/include depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) LTCXXCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CXXFLAGS) $(CXXFLAGS) AM_V_CXX = $(am__v_CXX_@AM_V@) am__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@) am__v_CXX_0 = @echo " CXX " $@; am__v_CXX_1 = CXXLD = $(CXX) CXXLINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \ $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CXXLD = $(am__v_CXXLD_@AM_V@) am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@) am__v_CXXLD_0 = @echo " CXXLD " $@; am__v_CXXLD_1 = COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(libSrvCfgMgr_a_SOURCES) DIST_SOURCES = $(libSrvCfgMgr_a_SOURCES) RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \ ctags-recursive dvi-recursive html-recursive info-recursive \ install-data-recursive install-dvi-recursive \ install-exec-recursive install-html-recursive \ install-info-recursive install-pdf-recursive \ install-ps-recursive install-recursive installcheck-recursive \ installdirs-recursive pdf-recursive ps-recursive \ tags-recursive uninstall-recursive am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac DATA = $(dist_noinst_DATA) RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive am__recursive_targets = \ $(RECURSIVE_TARGETS) \ $(RECURSIVE_CLEAN_TARGETS) \ $(am__extra_recursive_targets) AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \ distdir am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags DIST_SUBDIRS = . tests DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) am__relativize = \ dir0=`pwd`; \ sed_first='s,^\([^/]*\)/.*$$,\1,'; \ sed_rest='s,^[^/]*/*,,'; \ sed_last='s,^.*/\([^/]*\)$$,\1,'; \ sed_butlast='s,/*[^/]*$$,,'; \ while test -n "$$dir1"; do \ first=`echo "$$dir1" | sed -e "$$sed_first"`; \ if test "$$first" != "."; then \ if test "$$first" = ".."; then \ dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ else \ first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ if test "$$first2" = "$$first"; then \ dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ else \ dir2="../$$dir2"; \ fi; \ dir0="$$dir0"/"$$first"; \ fi; \ fi; \ dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ done; \ reldir="$$dir2" ACLOCAL = @ACLOCAL@ ALLOCA = @ALLOCA@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ ARCH = @ARCH@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ EXTRA_DIST_SUBDIRS = @EXTRA_DIST_SUBDIRS@ FGREP = @FGREP@ GREP = @GREP@ GTEST_INCLUDES = @GTEST_INCLUDES@ GTEST_LDADD = @GTEST_LDADD@ GTEST_LDFLAGS = @GTEST_LDFLAGS@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LINKPRINT = @LINKPRINT@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PORT_CFLAGS = @PORT_CFLAGS@ PORT_LDFLAGS = @PORT_LDFLAGS@ PORT_SUBDIR = @PORT_SUBDIR@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ subdirs = @subdirs@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ SUBDIRS = . $(am__append_1) noinst_LIBRARIES = libSrvCfgMgr.a libSrvCfgMgr_a_CPPFLAGS = -I$(top_srcdir)/Misc -I$(top_srcdir)/CfgMgr \ -I$(top_srcdir)/SrvOptions -I$(top_srcdir)/Options \ -I$(top_srcdir)/SrvIfaceMgr -I$(top_srcdir)/IfaceMgr \ -I$(top_srcdir)/SrvAddrMgr -I$(top_srcdir)/AddrMgr \ -I$(top_srcdir)/SrvTransMgr -I$(top_srcdir)/SrvMessages \ -I$(top_srcdir)/Messages -I$(top_srcdir)/poslib \ -I$(top_srcdir)/poslib/poslib -I$(top_srcdir)/@PORT_SUBDIR@ libSrvCfgMgr_a_SOURCES = NodeClientSpecific.cpp NodeClientSpecific.h NodeConstant.cpp NodeConstant.h Node.cpp Node.h NodeOperator.cpp NodeOperator.h SrvCfgAddrClass.cpp SrvCfgAddrClass.h SrvCfgClientClass.cpp SrvCfgClientClass.h SrvCfgIface.cpp SrvCfgIface.h SrvCfgMgr.cpp SrvCfgMgr.h SrvCfgOptions.cpp SrvCfgOptions.h SrvCfgPD.cpp SrvCfgPD.h SrvCfgTA.cpp SrvCfgTA.h SrvLexer.cpp SrvParsClassOpt.cpp SrvParsClassOpt.h SrvParser.cpp SrvParser.h SrvParsGlobalOpt.cpp SrvParsGlobalOpt.h SrvParsIfaceOpt.cpp SrvParsIfaceOpt.h dist_noinst_DATA = SrvLexer.l SrvParser.y all: all-recursive .SUFFIXES: .SUFFIXES: .cpp .lo .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign SrvCfgMgr/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign SrvCfgMgr/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstLIBRARIES: -test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES) libSrvCfgMgr.a: $(libSrvCfgMgr_a_OBJECTS) $(libSrvCfgMgr_a_DEPENDENCIES) $(EXTRA_libSrvCfgMgr_a_DEPENDENCIES) $(AM_V_at)-rm -f libSrvCfgMgr.a $(AM_V_AR)$(libSrvCfgMgr_a_AR) libSrvCfgMgr.a $(libSrvCfgMgr_a_OBJECTS) $(libSrvCfgMgr_a_LIBADD) $(AM_V_at)$(RANLIB) libSrvCfgMgr.a mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libSrvCfgMgr_a-Node.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libSrvCfgMgr_a-NodeClientSpecific.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libSrvCfgMgr_a-NodeConstant.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libSrvCfgMgr_a-NodeOperator.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libSrvCfgMgr_a-SrvCfgAddrClass.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libSrvCfgMgr_a-SrvCfgClientClass.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libSrvCfgMgr_a-SrvCfgIface.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libSrvCfgMgr_a-SrvCfgMgr.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libSrvCfgMgr_a-SrvCfgOptions.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libSrvCfgMgr_a-SrvCfgPD.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libSrvCfgMgr_a-SrvCfgTA.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libSrvCfgMgr_a-SrvLexer.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libSrvCfgMgr_a-SrvParsClassOpt.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libSrvCfgMgr_a-SrvParsGlobalOpt.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libSrvCfgMgr_a-SrvParsIfaceOpt.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libSrvCfgMgr_a-SrvParser.Po@am__quote@ .cpp.o: @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $< .cpp.obj: @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .cpp.lo: @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LTCXXCOMPILE) -c -o $@ $< libSrvCfgMgr_a-NodeClientSpecific.o: NodeClientSpecific.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libSrvCfgMgr_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libSrvCfgMgr_a-NodeClientSpecific.o -MD -MP -MF $(DEPDIR)/libSrvCfgMgr_a-NodeClientSpecific.Tpo -c -o libSrvCfgMgr_a-NodeClientSpecific.o `test -f 'NodeClientSpecific.cpp' || echo '$(srcdir)/'`NodeClientSpecific.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libSrvCfgMgr_a-NodeClientSpecific.Tpo $(DEPDIR)/libSrvCfgMgr_a-NodeClientSpecific.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='NodeClientSpecific.cpp' object='libSrvCfgMgr_a-NodeClientSpecific.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libSrvCfgMgr_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libSrvCfgMgr_a-NodeClientSpecific.o `test -f 'NodeClientSpecific.cpp' || echo '$(srcdir)/'`NodeClientSpecific.cpp libSrvCfgMgr_a-NodeClientSpecific.obj: NodeClientSpecific.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libSrvCfgMgr_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libSrvCfgMgr_a-NodeClientSpecific.obj -MD -MP -MF $(DEPDIR)/libSrvCfgMgr_a-NodeClientSpecific.Tpo -c -o libSrvCfgMgr_a-NodeClientSpecific.obj `if test -f 'NodeClientSpecific.cpp'; then $(CYGPATH_W) 'NodeClientSpecific.cpp'; else $(CYGPATH_W) '$(srcdir)/NodeClientSpecific.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libSrvCfgMgr_a-NodeClientSpecific.Tpo $(DEPDIR)/libSrvCfgMgr_a-NodeClientSpecific.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='NodeClientSpecific.cpp' object='libSrvCfgMgr_a-NodeClientSpecific.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libSrvCfgMgr_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libSrvCfgMgr_a-NodeClientSpecific.obj `if test -f 'NodeClientSpecific.cpp'; then $(CYGPATH_W) 'NodeClientSpecific.cpp'; else $(CYGPATH_W) '$(srcdir)/NodeClientSpecific.cpp'; fi` libSrvCfgMgr_a-NodeConstant.o: NodeConstant.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libSrvCfgMgr_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libSrvCfgMgr_a-NodeConstant.o -MD -MP -MF $(DEPDIR)/libSrvCfgMgr_a-NodeConstant.Tpo -c -o libSrvCfgMgr_a-NodeConstant.o `test -f 'NodeConstant.cpp' || echo '$(srcdir)/'`NodeConstant.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libSrvCfgMgr_a-NodeConstant.Tpo $(DEPDIR)/libSrvCfgMgr_a-NodeConstant.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='NodeConstant.cpp' object='libSrvCfgMgr_a-NodeConstant.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libSrvCfgMgr_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libSrvCfgMgr_a-NodeConstant.o `test -f 'NodeConstant.cpp' || echo '$(srcdir)/'`NodeConstant.cpp libSrvCfgMgr_a-NodeConstant.obj: NodeConstant.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libSrvCfgMgr_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libSrvCfgMgr_a-NodeConstant.obj -MD -MP -MF $(DEPDIR)/libSrvCfgMgr_a-NodeConstant.Tpo -c -o libSrvCfgMgr_a-NodeConstant.obj `if test -f 'NodeConstant.cpp'; then $(CYGPATH_W) 'NodeConstant.cpp'; else $(CYGPATH_W) '$(srcdir)/NodeConstant.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libSrvCfgMgr_a-NodeConstant.Tpo $(DEPDIR)/libSrvCfgMgr_a-NodeConstant.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='NodeConstant.cpp' object='libSrvCfgMgr_a-NodeConstant.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libSrvCfgMgr_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libSrvCfgMgr_a-NodeConstant.obj `if test -f 'NodeConstant.cpp'; then $(CYGPATH_W) 'NodeConstant.cpp'; else $(CYGPATH_W) '$(srcdir)/NodeConstant.cpp'; fi` libSrvCfgMgr_a-Node.o: Node.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libSrvCfgMgr_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libSrvCfgMgr_a-Node.o -MD -MP -MF $(DEPDIR)/libSrvCfgMgr_a-Node.Tpo -c -o libSrvCfgMgr_a-Node.o `test -f 'Node.cpp' || echo '$(srcdir)/'`Node.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libSrvCfgMgr_a-Node.Tpo $(DEPDIR)/libSrvCfgMgr_a-Node.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='Node.cpp' object='libSrvCfgMgr_a-Node.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libSrvCfgMgr_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libSrvCfgMgr_a-Node.o `test -f 'Node.cpp' || echo '$(srcdir)/'`Node.cpp libSrvCfgMgr_a-Node.obj: Node.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libSrvCfgMgr_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libSrvCfgMgr_a-Node.obj -MD -MP -MF $(DEPDIR)/libSrvCfgMgr_a-Node.Tpo -c -o libSrvCfgMgr_a-Node.obj `if test -f 'Node.cpp'; then $(CYGPATH_W) 'Node.cpp'; else $(CYGPATH_W) '$(srcdir)/Node.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libSrvCfgMgr_a-Node.Tpo $(DEPDIR)/libSrvCfgMgr_a-Node.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='Node.cpp' object='libSrvCfgMgr_a-Node.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libSrvCfgMgr_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libSrvCfgMgr_a-Node.obj `if test -f 'Node.cpp'; then $(CYGPATH_W) 'Node.cpp'; else $(CYGPATH_W) '$(srcdir)/Node.cpp'; fi` libSrvCfgMgr_a-NodeOperator.o: NodeOperator.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libSrvCfgMgr_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libSrvCfgMgr_a-NodeOperator.o -MD -MP -MF $(DEPDIR)/libSrvCfgMgr_a-NodeOperator.Tpo -c -o libSrvCfgMgr_a-NodeOperator.o `test -f 'NodeOperator.cpp' || echo '$(srcdir)/'`NodeOperator.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libSrvCfgMgr_a-NodeOperator.Tpo $(DEPDIR)/libSrvCfgMgr_a-NodeOperator.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='NodeOperator.cpp' object='libSrvCfgMgr_a-NodeOperator.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libSrvCfgMgr_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libSrvCfgMgr_a-NodeOperator.o `test -f 'NodeOperator.cpp' || echo '$(srcdir)/'`NodeOperator.cpp libSrvCfgMgr_a-NodeOperator.obj: NodeOperator.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libSrvCfgMgr_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libSrvCfgMgr_a-NodeOperator.obj -MD -MP -MF $(DEPDIR)/libSrvCfgMgr_a-NodeOperator.Tpo -c -o libSrvCfgMgr_a-NodeOperator.obj `if test -f 'NodeOperator.cpp'; then $(CYGPATH_W) 'NodeOperator.cpp'; else $(CYGPATH_W) '$(srcdir)/NodeOperator.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libSrvCfgMgr_a-NodeOperator.Tpo $(DEPDIR)/libSrvCfgMgr_a-NodeOperator.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='NodeOperator.cpp' object='libSrvCfgMgr_a-NodeOperator.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libSrvCfgMgr_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libSrvCfgMgr_a-NodeOperator.obj `if test -f 'NodeOperator.cpp'; then $(CYGPATH_W) 'NodeOperator.cpp'; else $(CYGPATH_W) '$(srcdir)/NodeOperator.cpp'; fi` libSrvCfgMgr_a-SrvCfgAddrClass.o: SrvCfgAddrClass.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libSrvCfgMgr_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libSrvCfgMgr_a-SrvCfgAddrClass.o -MD -MP -MF $(DEPDIR)/libSrvCfgMgr_a-SrvCfgAddrClass.Tpo -c -o libSrvCfgMgr_a-SrvCfgAddrClass.o `test -f 'SrvCfgAddrClass.cpp' || echo '$(srcdir)/'`SrvCfgAddrClass.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libSrvCfgMgr_a-SrvCfgAddrClass.Tpo $(DEPDIR)/libSrvCfgMgr_a-SrvCfgAddrClass.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='SrvCfgAddrClass.cpp' object='libSrvCfgMgr_a-SrvCfgAddrClass.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libSrvCfgMgr_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libSrvCfgMgr_a-SrvCfgAddrClass.o `test -f 'SrvCfgAddrClass.cpp' || echo '$(srcdir)/'`SrvCfgAddrClass.cpp libSrvCfgMgr_a-SrvCfgAddrClass.obj: SrvCfgAddrClass.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libSrvCfgMgr_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libSrvCfgMgr_a-SrvCfgAddrClass.obj -MD -MP -MF $(DEPDIR)/libSrvCfgMgr_a-SrvCfgAddrClass.Tpo -c -o libSrvCfgMgr_a-SrvCfgAddrClass.obj `if test -f 'SrvCfgAddrClass.cpp'; then $(CYGPATH_W) 'SrvCfgAddrClass.cpp'; else $(CYGPATH_W) '$(srcdir)/SrvCfgAddrClass.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libSrvCfgMgr_a-SrvCfgAddrClass.Tpo $(DEPDIR)/libSrvCfgMgr_a-SrvCfgAddrClass.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='SrvCfgAddrClass.cpp' object='libSrvCfgMgr_a-SrvCfgAddrClass.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libSrvCfgMgr_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libSrvCfgMgr_a-SrvCfgAddrClass.obj `if test -f 'SrvCfgAddrClass.cpp'; then $(CYGPATH_W) 'SrvCfgAddrClass.cpp'; else $(CYGPATH_W) '$(srcdir)/SrvCfgAddrClass.cpp'; fi` libSrvCfgMgr_a-SrvCfgClientClass.o: SrvCfgClientClass.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libSrvCfgMgr_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libSrvCfgMgr_a-SrvCfgClientClass.o -MD -MP -MF $(DEPDIR)/libSrvCfgMgr_a-SrvCfgClientClass.Tpo -c -o libSrvCfgMgr_a-SrvCfgClientClass.o `test -f 'SrvCfgClientClass.cpp' || echo '$(srcdir)/'`SrvCfgClientClass.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libSrvCfgMgr_a-SrvCfgClientClass.Tpo $(DEPDIR)/libSrvCfgMgr_a-SrvCfgClientClass.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='SrvCfgClientClass.cpp' object='libSrvCfgMgr_a-SrvCfgClientClass.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libSrvCfgMgr_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libSrvCfgMgr_a-SrvCfgClientClass.o `test -f 'SrvCfgClientClass.cpp' || echo '$(srcdir)/'`SrvCfgClientClass.cpp libSrvCfgMgr_a-SrvCfgClientClass.obj: SrvCfgClientClass.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libSrvCfgMgr_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libSrvCfgMgr_a-SrvCfgClientClass.obj -MD -MP -MF $(DEPDIR)/libSrvCfgMgr_a-SrvCfgClientClass.Tpo -c -o libSrvCfgMgr_a-SrvCfgClientClass.obj `if test -f 'SrvCfgClientClass.cpp'; then $(CYGPATH_W) 'SrvCfgClientClass.cpp'; else $(CYGPATH_W) '$(srcdir)/SrvCfgClientClass.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libSrvCfgMgr_a-SrvCfgClientClass.Tpo $(DEPDIR)/libSrvCfgMgr_a-SrvCfgClientClass.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='SrvCfgClientClass.cpp' object='libSrvCfgMgr_a-SrvCfgClientClass.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libSrvCfgMgr_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libSrvCfgMgr_a-SrvCfgClientClass.obj `if test -f 'SrvCfgClientClass.cpp'; then $(CYGPATH_W) 'SrvCfgClientClass.cpp'; else $(CYGPATH_W) '$(srcdir)/SrvCfgClientClass.cpp'; fi` libSrvCfgMgr_a-SrvCfgIface.o: SrvCfgIface.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libSrvCfgMgr_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libSrvCfgMgr_a-SrvCfgIface.o -MD -MP -MF $(DEPDIR)/libSrvCfgMgr_a-SrvCfgIface.Tpo -c -o libSrvCfgMgr_a-SrvCfgIface.o `test -f 'SrvCfgIface.cpp' || echo '$(srcdir)/'`SrvCfgIface.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libSrvCfgMgr_a-SrvCfgIface.Tpo $(DEPDIR)/libSrvCfgMgr_a-SrvCfgIface.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='SrvCfgIface.cpp' object='libSrvCfgMgr_a-SrvCfgIface.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libSrvCfgMgr_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libSrvCfgMgr_a-SrvCfgIface.o `test -f 'SrvCfgIface.cpp' || echo '$(srcdir)/'`SrvCfgIface.cpp libSrvCfgMgr_a-SrvCfgIface.obj: SrvCfgIface.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libSrvCfgMgr_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libSrvCfgMgr_a-SrvCfgIface.obj -MD -MP -MF $(DEPDIR)/libSrvCfgMgr_a-SrvCfgIface.Tpo -c -o libSrvCfgMgr_a-SrvCfgIface.obj `if test -f 'SrvCfgIface.cpp'; then $(CYGPATH_W) 'SrvCfgIface.cpp'; else $(CYGPATH_W) '$(srcdir)/SrvCfgIface.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libSrvCfgMgr_a-SrvCfgIface.Tpo $(DEPDIR)/libSrvCfgMgr_a-SrvCfgIface.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='SrvCfgIface.cpp' object='libSrvCfgMgr_a-SrvCfgIface.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libSrvCfgMgr_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libSrvCfgMgr_a-SrvCfgIface.obj `if test -f 'SrvCfgIface.cpp'; then $(CYGPATH_W) 'SrvCfgIface.cpp'; else $(CYGPATH_W) '$(srcdir)/SrvCfgIface.cpp'; fi` libSrvCfgMgr_a-SrvCfgMgr.o: SrvCfgMgr.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libSrvCfgMgr_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libSrvCfgMgr_a-SrvCfgMgr.o -MD -MP -MF $(DEPDIR)/libSrvCfgMgr_a-SrvCfgMgr.Tpo -c -o libSrvCfgMgr_a-SrvCfgMgr.o `test -f 'SrvCfgMgr.cpp' || echo '$(srcdir)/'`SrvCfgMgr.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libSrvCfgMgr_a-SrvCfgMgr.Tpo $(DEPDIR)/libSrvCfgMgr_a-SrvCfgMgr.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='SrvCfgMgr.cpp' object='libSrvCfgMgr_a-SrvCfgMgr.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libSrvCfgMgr_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libSrvCfgMgr_a-SrvCfgMgr.o `test -f 'SrvCfgMgr.cpp' || echo '$(srcdir)/'`SrvCfgMgr.cpp libSrvCfgMgr_a-SrvCfgMgr.obj: SrvCfgMgr.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libSrvCfgMgr_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libSrvCfgMgr_a-SrvCfgMgr.obj -MD -MP -MF $(DEPDIR)/libSrvCfgMgr_a-SrvCfgMgr.Tpo -c -o libSrvCfgMgr_a-SrvCfgMgr.obj `if test -f 'SrvCfgMgr.cpp'; then $(CYGPATH_W) 'SrvCfgMgr.cpp'; else $(CYGPATH_W) '$(srcdir)/SrvCfgMgr.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libSrvCfgMgr_a-SrvCfgMgr.Tpo $(DEPDIR)/libSrvCfgMgr_a-SrvCfgMgr.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='SrvCfgMgr.cpp' object='libSrvCfgMgr_a-SrvCfgMgr.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libSrvCfgMgr_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libSrvCfgMgr_a-SrvCfgMgr.obj `if test -f 'SrvCfgMgr.cpp'; then $(CYGPATH_W) 'SrvCfgMgr.cpp'; else $(CYGPATH_W) '$(srcdir)/SrvCfgMgr.cpp'; fi` libSrvCfgMgr_a-SrvCfgOptions.o: SrvCfgOptions.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libSrvCfgMgr_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libSrvCfgMgr_a-SrvCfgOptions.o -MD -MP -MF $(DEPDIR)/libSrvCfgMgr_a-SrvCfgOptions.Tpo -c -o libSrvCfgMgr_a-SrvCfgOptions.o `test -f 'SrvCfgOptions.cpp' || echo '$(srcdir)/'`SrvCfgOptions.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libSrvCfgMgr_a-SrvCfgOptions.Tpo $(DEPDIR)/libSrvCfgMgr_a-SrvCfgOptions.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='SrvCfgOptions.cpp' object='libSrvCfgMgr_a-SrvCfgOptions.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libSrvCfgMgr_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libSrvCfgMgr_a-SrvCfgOptions.o `test -f 'SrvCfgOptions.cpp' || echo '$(srcdir)/'`SrvCfgOptions.cpp libSrvCfgMgr_a-SrvCfgOptions.obj: SrvCfgOptions.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libSrvCfgMgr_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libSrvCfgMgr_a-SrvCfgOptions.obj -MD -MP -MF $(DEPDIR)/libSrvCfgMgr_a-SrvCfgOptions.Tpo -c -o libSrvCfgMgr_a-SrvCfgOptions.obj `if test -f 'SrvCfgOptions.cpp'; then $(CYGPATH_W) 'SrvCfgOptions.cpp'; else $(CYGPATH_W) '$(srcdir)/SrvCfgOptions.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libSrvCfgMgr_a-SrvCfgOptions.Tpo $(DEPDIR)/libSrvCfgMgr_a-SrvCfgOptions.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='SrvCfgOptions.cpp' object='libSrvCfgMgr_a-SrvCfgOptions.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libSrvCfgMgr_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libSrvCfgMgr_a-SrvCfgOptions.obj `if test -f 'SrvCfgOptions.cpp'; then $(CYGPATH_W) 'SrvCfgOptions.cpp'; else $(CYGPATH_W) '$(srcdir)/SrvCfgOptions.cpp'; fi` libSrvCfgMgr_a-SrvCfgPD.o: SrvCfgPD.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libSrvCfgMgr_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libSrvCfgMgr_a-SrvCfgPD.o -MD -MP -MF $(DEPDIR)/libSrvCfgMgr_a-SrvCfgPD.Tpo -c -o libSrvCfgMgr_a-SrvCfgPD.o `test -f 'SrvCfgPD.cpp' || echo '$(srcdir)/'`SrvCfgPD.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libSrvCfgMgr_a-SrvCfgPD.Tpo $(DEPDIR)/libSrvCfgMgr_a-SrvCfgPD.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='SrvCfgPD.cpp' object='libSrvCfgMgr_a-SrvCfgPD.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libSrvCfgMgr_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libSrvCfgMgr_a-SrvCfgPD.o `test -f 'SrvCfgPD.cpp' || echo '$(srcdir)/'`SrvCfgPD.cpp libSrvCfgMgr_a-SrvCfgPD.obj: SrvCfgPD.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libSrvCfgMgr_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libSrvCfgMgr_a-SrvCfgPD.obj -MD -MP -MF $(DEPDIR)/libSrvCfgMgr_a-SrvCfgPD.Tpo -c -o libSrvCfgMgr_a-SrvCfgPD.obj `if test -f 'SrvCfgPD.cpp'; then $(CYGPATH_W) 'SrvCfgPD.cpp'; else $(CYGPATH_W) '$(srcdir)/SrvCfgPD.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libSrvCfgMgr_a-SrvCfgPD.Tpo $(DEPDIR)/libSrvCfgMgr_a-SrvCfgPD.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='SrvCfgPD.cpp' object='libSrvCfgMgr_a-SrvCfgPD.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libSrvCfgMgr_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libSrvCfgMgr_a-SrvCfgPD.obj `if test -f 'SrvCfgPD.cpp'; then $(CYGPATH_W) 'SrvCfgPD.cpp'; else $(CYGPATH_W) '$(srcdir)/SrvCfgPD.cpp'; fi` libSrvCfgMgr_a-SrvCfgTA.o: SrvCfgTA.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libSrvCfgMgr_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libSrvCfgMgr_a-SrvCfgTA.o -MD -MP -MF $(DEPDIR)/libSrvCfgMgr_a-SrvCfgTA.Tpo -c -o libSrvCfgMgr_a-SrvCfgTA.o `test -f 'SrvCfgTA.cpp' || echo '$(srcdir)/'`SrvCfgTA.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libSrvCfgMgr_a-SrvCfgTA.Tpo $(DEPDIR)/libSrvCfgMgr_a-SrvCfgTA.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='SrvCfgTA.cpp' object='libSrvCfgMgr_a-SrvCfgTA.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libSrvCfgMgr_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libSrvCfgMgr_a-SrvCfgTA.o `test -f 'SrvCfgTA.cpp' || echo '$(srcdir)/'`SrvCfgTA.cpp libSrvCfgMgr_a-SrvCfgTA.obj: SrvCfgTA.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libSrvCfgMgr_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libSrvCfgMgr_a-SrvCfgTA.obj -MD -MP -MF $(DEPDIR)/libSrvCfgMgr_a-SrvCfgTA.Tpo -c -o libSrvCfgMgr_a-SrvCfgTA.obj `if test -f 'SrvCfgTA.cpp'; then $(CYGPATH_W) 'SrvCfgTA.cpp'; else $(CYGPATH_W) '$(srcdir)/SrvCfgTA.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libSrvCfgMgr_a-SrvCfgTA.Tpo $(DEPDIR)/libSrvCfgMgr_a-SrvCfgTA.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='SrvCfgTA.cpp' object='libSrvCfgMgr_a-SrvCfgTA.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libSrvCfgMgr_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libSrvCfgMgr_a-SrvCfgTA.obj `if test -f 'SrvCfgTA.cpp'; then $(CYGPATH_W) 'SrvCfgTA.cpp'; else $(CYGPATH_W) '$(srcdir)/SrvCfgTA.cpp'; fi` libSrvCfgMgr_a-SrvLexer.o: SrvLexer.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libSrvCfgMgr_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libSrvCfgMgr_a-SrvLexer.o -MD -MP -MF $(DEPDIR)/libSrvCfgMgr_a-SrvLexer.Tpo -c -o libSrvCfgMgr_a-SrvLexer.o `test -f 'SrvLexer.cpp' || echo '$(srcdir)/'`SrvLexer.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libSrvCfgMgr_a-SrvLexer.Tpo $(DEPDIR)/libSrvCfgMgr_a-SrvLexer.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='SrvLexer.cpp' object='libSrvCfgMgr_a-SrvLexer.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libSrvCfgMgr_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libSrvCfgMgr_a-SrvLexer.o `test -f 'SrvLexer.cpp' || echo '$(srcdir)/'`SrvLexer.cpp libSrvCfgMgr_a-SrvLexer.obj: SrvLexer.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libSrvCfgMgr_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libSrvCfgMgr_a-SrvLexer.obj -MD -MP -MF $(DEPDIR)/libSrvCfgMgr_a-SrvLexer.Tpo -c -o libSrvCfgMgr_a-SrvLexer.obj `if test -f 'SrvLexer.cpp'; then $(CYGPATH_W) 'SrvLexer.cpp'; else $(CYGPATH_W) '$(srcdir)/SrvLexer.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libSrvCfgMgr_a-SrvLexer.Tpo $(DEPDIR)/libSrvCfgMgr_a-SrvLexer.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='SrvLexer.cpp' object='libSrvCfgMgr_a-SrvLexer.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libSrvCfgMgr_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libSrvCfgMgr_a-SrvLexer.obj `if test -f 'SrvLexer.cpp'; then $(CYGPATH_W) 'SrvLexer.cpp'; else $(CYGPATH_W) '$(srcdir)/SrvLexer.cpp'; fi` libSrvCfgMgr_a-SrvParsClassOpt.o: SrvParsClassOpt.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libSrvCfgMgr_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libSrvCfgMgr_a-SrvParsClassOpt.o -MD -MP -MF $(DEPDIR)/libSrvCfgMgr_a-SrvParsClassOpt.Tpo -c -o libSrvCfgMgr_a-SrvParsClassOpt.o `test -f 'SrvParsClassOpt.cpp' || echo '$(srcdir)/'`SrvParsClassOpt.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libSrvCfgMgr_a-SrvParsClassOpt.Tpo $(DEPDIR)/libSrvCfgMgr_a-SrvParsClassOpt.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='SrvParsClassOpt.cpp' object='libSrvCfgMgr_a-SrvParsClassOpt.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libSrvCfgMgr_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libSrvCfgMgr_a-SrvParsClassOpt.o `test -f 'SrvParsClassOpt.cpp' || echo '$(srcdir)/'`SrvParsClassOpt.cpp libSrvCfgMgr_a-SrvParsClassOpt.obj: SrvParsClassOpt.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libSrvCfgMgr_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libSrvCfgMgr_a-SrvParsClassOpt.obj -MD -MP -MF $(DEPDIR)/libSrvCfgMgr_a-SrvParsClassOpt.Tpo -c -o libSrvCfgMgr_a-SrvParsClassOpt.obj `if test -f 'SrvParsClassOpt.cpp'; then $(CYGPATH_W) 'SrvParsClassOpt.cpp'; else $(CYGPATH_W) '$(srcdir)/SrvParsClassOpt.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libSrvCfgMgr_a-SrvParsClassOpt.Tpo $(DEPDIR)/libSrvCfgMgr_a-SrvParsClassOpt.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='SrvParsClassOpt.cpp' object='libSrvCfgMgr_a-SrvParsClassOpt.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libSrvCfgMgr_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libSrvCfgMgr_a-SrvParsClassOpt.obj `if test -f 'SrvParsClassOpt.cpp'; then $(CYGPATH_W) 'SrvParsClassOpt.cpp'; else $(CYGPATH_W) '$(srcdir)/SrvParsClassOpt.cpp'; fi` libSrvCfgMgr_a-SrvParser.o: SrvParser.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libSrvCfgMgr_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libSrvCfgMgr_a-SrvParser.o -MD -MP -MF $(DEPDIR)/libSrvCfgMgr_a-SrvParser.Tpo -c -o libSrvCfgMgr_a-SrvParser.o `test -f 'SrvParser.cpp' || echo '$(srcdir)/'`SrvParser.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libSrvCfgMgr_a-SrvParser.Tpo $(DEPDIR)/libSrvCfgMgr_a-SrvParser.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='SrvParser.cpp' object='libSrvCfgMgr_a-SrvParser.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libSrvCfgMgr_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libSrvCfgMgr_a-SrvParser.o `test -f 'SrvParser.cpp' || echo '$(srcdir)/'`SrvParser.cpp libSrvCfgMgr_a-SrvParser.obj: SrvParser.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libSrvCfgMgr_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libSrvCfgMgr_a-SrvParser.obj -MD -MP -MF $(DEPDIR)/libSrvCfgMgr_a-SrvParser.Tpo -c -o libSrvCfgMgr_a-SrvParser.obj `if test -f 'SrvParser.cpp'; then $(CYGPATH_W) 'SrvParser.cpp'; else $(CYGPATH_W) '$(srcdir)/SrvParser.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libSrvCfgMgr_a-SrvParser.Tpo $(DEPDIR)/libSrvCfgMgr_a-SrvParser.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='SrvParser.cpp' object='libSrvCfgMgr_a-SrvParser.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libSrvCfgMgr_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libSrvCfgMgr_a-SrvParser.obj `if test -f 'SrvParser.cpp'; then $(CYGPATH_W) 'SrvParser.cpp'; else $(CYGPATH_W) '$(srcdir)/SrvParser.cpp'; fi` libSrvCfgMgr_a-SrvParsGlobalOpt.o: SrvParsGlobalOpt.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libSrvCfgMgr_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libSrvCfgMgr_a-SrvParsGlobalOpt.o -MD -MP -MF $(DEPDIR)/libSrvCfgMgr_a-SrvParsGlobalOpt.Tpo -c -o libSrvCfgMgr_a-SrvParsGlobalOpt.o `test -f 'SrvParsGlobalOpt.cpp' || echo '$(srcdir)/'`SrvParsGlobalOpt.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libSrvCfgMgr_a-SrvParsGlobalOpt.Tpo $(DEPDIR)/libSrvCfgMgr_a-SrvParsGlobalOpt.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='SrvParsGlobalOpt.cpp' object='libSrvCfgMgr_a-SrvParsGlobalOpt.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libSrvCfgMgr_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libSrvCfgMgr_a-SrvParsGlobalOpt.o `test -f 'SrvParsGlobalOpt.cpp' || echo '$(srcdir)/'`SrvParsGlobalOpt.cpp libSrvCfgMgr_a-SrvParsGlobalOpt.obj: SrvParsGlobalOpt.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libSrvCfgMgr_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libSrvCfgMgr_a-SrvParsGlobalOpt.obj -MD -MP -MF $(DEPDIR)/libSrvCfgMgr_a-SrvParsGlobalOpt.Tpo -c -o libSrvCfgMgr_a-SrvParsGlobalOpt.obj `if test -f 'SrvParsGlobalOpt.cpp'; then $(CYGPATH_W) 'SrvParsGlobalOpt.cpp'; else $(CYGPATH_W) '$(srcdir)/SrvParsGlobalOpt.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libSrvCfgMgr_a-SrvParsGlobalOpt.Tpo $(DEPDIR)/libSrvCfgMgr_a-SrvParsGlobalOpt.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='SrvParsGlobalOpt.cpp' object='libSrvCfgMgr_a-SrvParsGlobalOpt.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libSrvCfgMgr_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libSrvCfgMgr_a-SrvParsGlobalOpt.obj `if test -f 'SrvParsGlobalOpt.cpp'; then $(CYGPATH_W) 'SrvParsGlobalOpt.cpp'; else $(CYGPATH_W) '$(srcdir)/SrvParsGlobalOpt.cpp'; fi` libSrvCfgMgr_a-SrvParsIfaceOpt.o: SrvParsIfaceOpt.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libSrvCfgMgr_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libSrvCfgMgr_a-SrvParsIfaceOpt.o -MD -MP -MF $(DEPDIR)/libSrvCfgMgr_a-SrvParsIfaceOpt.Tpo -c -o libSrvCfgMgr_a-SrvParsIfaceOpt.o `test -f 'SrvParsIfaceOpt.cpp' || echo '$(srcdir)/'`SrvParsIfaceOpt.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libSrvCfgMgr_a-SrvParsIfaceOpt.Tpo $(DEPDIR)/libSrvCfgMgr_a-SrvParsIfaceOpt.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='SrvParsIfaceOpt.cpp' object='libSrvCfgMgr_a-SrvParsIfaceOpt.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libSrvCfgMgr_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libSrvCfgMgr_a-SrvParsIfaceOpt.o `test -f 'SrvParsIfaceOpt.cpp' || echo '$(srcdir)/'`SrvParsIfaceOpt.cpp libSrvCfgMgr_a-SrvParsIfaceOpt.obj: SrvParsIfaceOpt.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libSrvCfgMgr_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libSrvCfgMgr_a-SrvParsIfaceOpt.obj -MD -MP -MF $(DEPDIR)/libSrvCfgMgr_a-SrvParsIfaceOpt.Tpo -c -o libSrvCfgMgr_a-SrvParsIfaceOpt.obj `if test -f 'SrvParsIfaceOpt.cpp'; then $(CYGPATH_W) 'SrvParsIfaceOpt.cpp'; else $(CYGPATH_W) '$(srcdir)/SrvParsIfaceOpt.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libSrvCfgMgr_a-SrvParsIfaceOpt.Tpo $(DEPDIR)/libSrvCfgMgr_a-SrvParsIfaceOpt.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='SrvParsIfaceOpt.cpp' object='libSrvCfgMgr_a-SrvParsIfaceOpt.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libSrvCfgMgr_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libSrvCfgMgr_a-SrvParsIfaceOpt.obj `if test -f 'SrvParsIfaceOpt.cpp'; then $(CYGPATH_W) 'SrvParsIfaceOpt.cpp'; else $(CYGPATH_W) '$(srcdir)/SrvParsIfaceOpt.cpp'; fi` mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs # This directory's subdirectories are mostly independent; you can cd # into them and run 'make' without going through this Makefile. # To change the values of 'make' variables: instead of editing Makefiles, # (1) if the variable is set in 'config.status', edit 'config.status' # (which will cause the Makefiles to be regenerated when you run 'make'); # (2) otherwise, pass the desired values on the 'make' command line. $(am__recursive_targets): @fail=; \ if $(am__make_keepgoing); then \ failcom='fail=yes'; \ else \ failcom='exit 1'; \ fi; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-recursive TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ empty_fix=.; \ else \ include_option=--include; \ empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-recursive CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-recursive cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ $(am__make_dryrun) \ || test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ $(am__relativize); \ new_distdir=$$reldir; \ dir1=$$subdir; dir2="$(top_distdir)"; \ $(am__relativize); \ new_top_distdir=$$reldir; \ echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ ($(am__cd) $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$new_top_distdir" \ distdir="$$new_distdir" \ am__remove_distdir=: \ am__skip_length_check=: \ am__skip_mode_fix=: \ distdir) \ || exit 1; \ fi; \ done check-am: all-am check: check-recursive all-am: Makefile $(LIBRARIES) $(DATA) installdirs: installdirs-recursive installdirs-am: install: install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-recursive clean-am: clean-generic clean-libtool clean-noinstLIBRARIES \ mostlyclean-am distclean: distclean-recursive -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive html-am: info: info-recursive info-am: install-data-am: install-dvi: install-dvi-recursive install-dvi-am: install-exec-am: install-html: install-html-recursive install-html-am: install-info: install-info-recursive install-info-am: install-man: install-pdf: install-pdf-recursive install-pdf-am: install-ps: install-ps-recursive install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-recursive -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: .MAKE: $(am__recursive_targets) install-am install-strip .PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am check \ check-am clean clean-generic clean-libtool \ clean-noinstLIBRARIES cscopelist-am ctags ctags-am distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ installdirs-am maintainer-clean maintainer-clean-generic \ mostlyclean mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf pdf-am ps ps-am tags tags-am uninstall \ uninstall-am parser: SrvParser.y SrvLexer.l @echo "[BISON++] $(SUBDIR)/SrvParser.y" $(top_builddir)/bison++/bison++ --skeleton=$(top_builddir)/bison++/bison.cc --headerskeleton=$(top_builddir)/bison++/bison.h -v --debug --defines -d SrvParser.y -o SrvParser.cpp @echo "[FLEX ] $(SUBDIR)/SrvLexer.l" flex -+ -i -oSrvLexer.cpp SrvLexer.l @echo "[SED ] $(SUBDIR)/SrvLexer.cpp" cat SrvLexer.cpp | sed 's/extern "C" int isatty (int );/\/\/extern "C" int isatty (int ) throw ();/' > SrvLexer.cpp2 rm -f SrvLexer.cpp mv SrvLexer.cpp2 SrvLexer.cpp # 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: dibbler-1.0.1/SrvCfgMgr/SrvParser.cpp0000644000175000017500000042235412556513130014343 00000000000000#define YY_SrvParser_h_included #define YY_USE_CLASS /* A Bison++ parser, made from SrvParser.y */ /* with Bison++ version bison++ Version 1.21.9-1, adapted from GNU bison by coetmeur@icdc.fr Maintained by Magnus Ekdahl */ #define YY_USE_CLASS #line 1 "../bison++/bison.cc" /* -*-C-*- Note some compilers choke on comments on `#line' lines. */ /* Skeleton output parser for bison, Copyright (C) 1984, 1989, 1990 Bob Corbett and Richard Stallman 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 1, 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., 675 Mass Ave, Cambridge, MA 02139, USA. As a special exception, when this file is copied by Bison++ into a Bison++ output file, you may use that output file without restriction. This special exception was added by the Free Software Foundation in version 1.24 of Bison, and has been in Bison++ since 1.21.9. */ /* HEADER SECTION */ #if defined( _MSDOS ) || defined(MSDOS) || defined(__MSDOS__) #define __MSDOS_AND_ALIKE #endif #if defined(_WINDOWS) && defined(_MSC_VER) #define __HAVE_NO_ALLOCA #define __MSDOS_AND_ALIKE #endif #ifndef alloca #if defined( __GNUC__) #define alloca __builtin_alloca #elif (!defined (__STDC__) && defined (sparc)) || defined (__sparc__) || defined (__sparc) || defined (__sgi) #include #elif defined (__MSDOS_AND_ALIKE) #include #ifndef __TURBOC__ /* MS C runtime lib */ #define alloca _alloca #endif #elif defined(_AIX) /* pragma must be put before any C/C++ instruction !! */ #pragma alloca #include #elif defined(__hpux) #ifdef __cplusplus extern "C" { void *alloca (unsigned int); }; #else /* not __cplusplus */ void *alloca (); #endif /* not __cplusplus */ #endif /* not _AIX not MSDOS, or __TURBOC__ or _AIX, not sparc. */ #endif /* alloca not defined. */ #ifdef c_plusplus #ifndef __cplusplus #define __cplusplus #endif #endif #ifdef __cplusplus #ifndef YY_USE_CLASS /*#warning "For C++ its recomended to use bison++, otherwise classes won't be generated"*/ #endif #else #ifndef __STDC__ #define const #endif #ifdef YY_USE_CLASS #error "This is a C++ header generated by bison++, please use a C++ compiler!" #endif #endif #include #define YYBISON 1 #line 88 "../bison++/bison.cc" #line 3 "SrvParser.y" #include #include #include #include #include "Portable.h" #include "DHCPConst.h" #include "SmartPtr.h" #include "Container.h" #include "SrvParser.h" #include "SrvParsGlobalOpt.h" #include "SrvParsClassOpt.h" #include "SrvParsIfaceOpt.h" #include "OptAddr.h" #include "OptAddrLst.h" #include "OptDomainLst.h" #include "OptString.h" #include "OptVendorSpecInfo.h" #include "OptRtPrefix.h" #include "SrvOptAddrParams.h" #include "SrvCfgMgr.h" #include "SrvCfgTA.h" #include "SrvCfgPD.h" #include "SrvCfgClientClass.h" #include "SrvCfgAddrClass.h" #include "SrvCfgIface.h" #include "SrvCfgOptions.h" #include "DUID.h" #include "Logger.h" #include "FQDN.h" #include "Key.h" #include "Node.h" #include "NodeConstant.h" #include "NodeClientSpecific.h" #include "NodeOperator.h" using namespace std; #define YY_USE_CLASS #line 44 "SrvParser.y" #include "FlexLexer.h" #define YY_SrvParser_MEMBERS FlexLexer * lex; \ List(TSrvParsGlobalOpt) ParserOptStack; /* list of parsed interfaces/IAs/addrs */ \ List(TSrvCfgIface) SrvCfgIfaceLst; /* list of SrvCfg interfaces */ \ List(TSrvCfgAddrClass) SrvCfgAddrClassLst; /* list of SrvCfg address classes */ \ List(TSrvCfgTA) SrvCfgTALst; /* list of SrvCfg TA objects */ \ List(TSrvCfgPD) SrvCfgPDLst; /* list of SrvCfg PD objects */ \ List(TSrvCfgClientClass) SrvCfgClientClassLst; /* list of SrvCfgClientClass objs */ \ List(TIPv6Addr) PresentAddrLst; /* address list (used for DNS,NTP,etc.)*/ \ List(std::string) PresentStringLst; /* string list */ \ List(Node) NodeClientClassLst; /* Node list */ \ List(TFQDN) PresentFQDNLst; \ SPtr addr; \ SPtr CurrentKey; \ DigestTypesLst DigestLst; \ List(THostRange) PresentRangeLst; \ List(THostRange) PDLst; \ List(TSrvCfgOptions) ClientLst; \ int PDPrefix; \ bool IfaceDefined(int ifaceNr); \ bool IfaceDefined(string ifaceName); \ bool StartIfaceDeclaration(string iface); \ bool StartIfaceDeclaration(int ifindex); \ bool EndIfaceDeclaration(); \ void StartClassDeclaration(); \ bool EndClassDeclaration(); \ SPtr getRangeMin(char * addrPacked, int prefix); \ SPtr getRangeMax(char * addrPacked, int prefix); \ void StartTAClassDeclaration(); \ bool EndTAClassDeclaration(); \ void StartPDDeclaration(); \ bool EndPDDeclaration(); \ TSrvCfgMgr * CfgMgr; \ SPtr nextHop; \ virtual ~SrvParser(); #define YY_SrvParser_CONSTRUCTOR_PARAM yyFlexLexer * lex #define YY_SrvParser_CONSTRUCTOR_CODE \ ParserOptStack.append(new TSrvParsGlobalOpt()); \ this->lex = lex; \ CfgMgr = 0; \ nextHop.reset(); \ yynerrs = 0; \ yychar = 0; \ PDPrefix = 0; #line 95 "SrvParser.y" typedef union { unsigned int ival; char *strval; struct SDuid { int length; char* duid; } duidval; char addrval[16]; } yy_SrvParser_stype; #define YY_SrvParser_STYPE yy_SrvParser_stype #line 88 "../bison++/bison.cc" /* %{ and %header{ and %union, during decl */ #define YY_SrvParser_BISON 1 #ifndef YY_SrvParser_COMPATIBILITY #ifndef YY_USE_CLASS #define YY_SrvParser_COMPATIBILITY 1 #else #define YY_SrvParser_COMPATIBILITY 0 #endif #endif #if YY_SrvParser_COMPATIBILITY != 0 /* backward compatibility */ #ifdef YYLTYPE #ifndef YY_SrvParser_LTYPE #define YY_SrvParser_LTYPE YYLTYPE #endif #endif /* Testing alternative bison solution /#ifdef YYSTYPE*/ #ifndef YY_SrvParser_STYPE #define YY_SrvParser_STYPE YYSTYPE #endif /*#endif*/ #ifdef YYDEBUG #ifndef YY_SrvParser_DEBUG #define YY_SrvParser_DEBUG YYDEBUG #endif #endif /* use goto to be compatible */ #ifndef YY_SrvParser_USE_GOTO #define YY_SrvParser_USE_GOTO 1 #endif #endif /* use no goto to be clean in C++ */ #ifndef YY_SrvParser_USE_GOTO #define YY_SrvParser_USE_GOTO 0 #endif #ifndef YY_SrvParser_PURE #line 130 "../bison++/bison.cc" #line 130 "../bison++/bison.cc" /* YY_SrvParser_PURE */ #endif /* section apres lecture def, avant lecture grammaire S2 */ #line 134 "../bison++/bison.cc" #line 134 "../bison++/bison.cc" /* prefix */ #ifndef YY_SrvParser_DEBUG #line 136 "../bison++/bison.cc" #define YY_SrvParser_DEBUG 1 #line 136 "../bison++/bison.cc" /* YY_SrvParser_DEBUG */ #endif #ifndef YY_SrvParser_LSP_NEEDED #line 141 "../bison++/bison.cc" #line 141 "../bison++/bison.cc" /* YY_SrvParser_LSP_NEEDED*/ #endif /* DEFAULT LTYPE*/ #ifdef YY_SrvParser_LSP_NEEDED #ifndef YY_SrvParser_LTYPE #ifndef BISON_YYLTYPE_ISDECLARED #define BISON_YYLTYPE_ISDECLARED typedef struct yyltype { int timestamp; int first_line; int first_column; int last_line; int last_column; char *text; } yyltype; #endif #define YY_SrvParser_LTYPE yyltype #endif #endif /* DEFAULT STYPE*/ /* We used to use `unsigned long' as YY_SrvParser_STYPE on MSDOS, but it seems better to be consistent. Most programs should declare their own type anyway. */ #ifndef YY_SrvParser_STYPE #define YY_SrvParser_STYPE int #endif /* DEFAULT MISCELANEOUS */ #ifndef YY_SrvParser_PARSE #define YY_SrvParser_PARSE yyparse #endif #ifndef YY_SrvParser_LEX #define YY_SrvParser_LEX yylex #endif #ifndef YY_SrvParser_LVAL #define YY_SrvParser_LVAL yylval #endif #ifndef YY_SrvParser_LLOC #define YY_SrvParser_LLOC yylloc #endif #ifndef YY_SrvParser_CHAR #define YY_SrvParser_CHAR yychar #endif #ifndef YY_SrvParser_NERRS #define YY_SrvParser_NERRS yynerrs #endif #ifndef YY_SrvParser_DEBUG_FLAG #define YY_SrvParser_DEBUG_FLAG yydebug #endif #ifndef YY_SrvParser_ERROR #define YY_SrvParser_ERROR yyerror #endif #ifndef YY_SrvParser_PARSE_PARAM #ifndef YY_USE_CLASS #ifdef YYPARSE_PARAM #define YY_SrvParser_PARSE_PARAM void* YYPARSE_PARAM #else #ifndef __STDC__ #ifndef __cplusplus #define YY_SrvParser_PARSE_PARAM #endif #endif #endif #endif #ifndef YY_SrvParser_PARSE_PARAM #define YY_SrvParser_PARSE_PARAM void #endif #endif #if YY_SrvParser_COMPATIBILITY != 0 /* backward compatibility */ #ifdef YY_SrvParser_LTYPE #ifndef YYLTYPE #define YYLTYPE YY_SrvParser_LTYPE #else /* WARNING obsolete !!! user defined YYLTYPE not reported into generated header */ #endif #endif /* Removed due to bison compabilityproblems /#ifndef YYSTYPE /#define YYSTYPE YY_SrvParser_STYPE /#else*/ /* WARNING obsolete !!! user defined YYSTYPE not reported into generated header */ /*#endif*/ #ifdef YY_SrvParser_PURE # ifndef YYPURE # define YYPURE YY_SrvParser_PURE # endif #endif #ifdef YY_SrvParser_DEBUG # ifndef YYDEBUG # define YYDEBUG YY_SrvParser_DEBUG # endif #endif #ifndef YY_SrvParser_ERROR_VERBOSE #ifdef YYERROR_VERBOSE #define YY_SrvParser_ERROR_VERBOSE YYERROR_VERBOSE #endif #endif #ifndef YY_SrvParser_LSP_NEEDED # ifdef YYLSP_NEEDED # define YY_SrvParser_LSP_NEEDED YYLSP_NEEDED # endif #endif #endif #ifndef YY_USE_CLASS /* TOKEN C */ #line 263 "../bison++/bison.cc" #define IFACE_ 258 #define RELAY_ 259 #define IFACE_ID_ 260 #define IFACE_ID_ORDER_ 261 #define CLASS_ 262 #define TACLASS_ 263 #define LOGNAME_ 264 #define LOGLEVEL_ 265 #define LOGMODE_ 266 #define LOGCOLORS_ 267 #define WORKDIR_ 268 #define OPTION_ 269 #define DNS_SERVER_ 270 #define DOMAIN_ 271 #define NTP_SERVER_ 272 #define TIME_ZONE_ 273 #define SIP_SERVER_ 274 #define SIP_DOMAIN_ 275 #define NIS_SERVER_ 276 #define NIS_DOMAIN_ 277 #define NISP_SERVER_ 278 #define NISP_DOMAIN_ 279 #define LIFETIME_ 280 #define FQDN_ 281 #define ACCEPT_UNKNOWN_FQDN_ 282 #define FQDN_DDNS_ADDRESS_ 283 #define DDNS_PROTOCOL_ 284 #define DDNS_TIMEOUT_ 285 #define ACCEPT_ONLY_ 286 #define REJECT_CLIENTS_ 287 #define POOL_ 288 #define SHARE_ 289 #define T1_ 290 #define T2_ 291 #define PREF_TIME_ 292 #define VALID_TIME_ 293 #define UNICAST_ 294 #define DROP_UNICAST_ 295 #define PREFERENCE_ 296 #define RAPID_COMMIT_ 297 #define IFACE_MAX_LEASE_ 298 #define CLASS_MAX_LEASE_ 299 #define CLNT_MAX_LEASE_ 300 #define STATELESS_ 301 #define CACHE_SIZE_ 302 #define PDCLASS_ 303 #define PD_LENGTH_ 304 #define PD_POOL_ 305 #define SCRIPT_ 306 #define VENDOR_SPEC_ 307 #define CLIENT_ 308 #define DUID_KEYWORD_ 309 #define REMOTE_ID_ 310 #define LINK_LOCAL_ 311 #define ADDRESS_ 312 #define PREFIX_ 313 #define GUESS_MODE_ 314 #define INACTIVE_MODE_ 315 #define EXPERIMENTAL_ 316 #define ADDR_PARAMS_ 317 #define REMOTE_AUTOCONF_NEIGHBORS_ 318 #define AFTR_ 319 #define PERFORMANCE_MODE_ 320 #define AUTH_PROTOCOL_ 321 #define AUTH_ALGORITHM_ 322 #define AUTH_REPLAY_ 323 #define AUTH_METHODS_ 324 #define AUTH_DROP_UNAUTH_ 325 #define AUTH_REALM_ 326 #define KEY_ 327 #define SECRET_ 328 #define ALGORITHM_ 329 #define FUDGE_ 330 #define DIGEST_NONE_ 331 #define DIGEST_PLAIN_ 332 #define DIGEST_HMAC_MD5_ 333 #define DIGEST_HMAC_SHA1_ 334 #define DIGEST_HMAC_SHA224_ 335 #define DIGEST_HMAC_SHA256_ 336 #define DIGEST_HMAC_SHA384_ 337 #define DIGEST_HMAC_SHA512_ 338 #define ACCEPT_LEASEQUERY_ 339 #define BULKLQ_ACCEPT_ 340 #define BULKLQ_TCPPORT_ 341 #define BULKLQ_MAX_CONNS_ 342 #define BULKLQ_TIMEOUT_ 343 #define CLIENT_CLASS_ 344 #define MATCH_IF_ 345 #define EQ_ 346 #define AND_ 347 #define OR_ 348 #define CLIENT_VENDOR_SPEC_ENTERPRISE_NUM_ 349 #define CLIENT_VENDOR_SPEC_DATA_ 350 #define CLIENT_VENDOR_CLASS_EN_ 351 #define CLIENT_VENDOR_CLASS_DATA_ 352 #define RECONFIGURE_ENABLED_ 353 #define ALLOW_ 354 #define DENY_ 355 #define SUBSTRING_ 356 #define STRING_KEYWORD_ 357 #define ADDRESS_LIST_ 358 #define CONTAIN_ 359 #define NEXT_HOP_ 360 #define ROUTE_ 361 #define INFINITE_ 362 #define SUBNET_ 363 #define STRING_ 364 #define HEXNUMBER_ 365 #define INTNUMBER_ 366 #define IPV6ADDR_ 367 #define DUID_ 368 #line 263 "../bison++/bison.cc" /* #defines tokens */ #else /* CLASS */ #ifndef YY_SrvParser_CLASS #define YY_SrvParser_CLASS SrvParser #endif #ifndef YY_SrvParser_INHERIT #define YY_SrvParser_INHERIT #endif #ifndef YY_SrvParser_MEMBERS #define YY_SrvParser_MEMBERS #endif #ifndef YY_SrvParser_LEX_BODY #define YY_SrvParser_LEX_BODY #endif #ifndef YY_SrvParser_ERROR_BODY #define YY_SrvParser_ERROR_BODY #endif #ifndef YY_SrvParser_CONSTRUCTOR_PARAM #define YY_SrvParser_CONSTRUCTOR_PARAM #endif #ifndef YY_SrvParser_CONSTRUCTOR_CODE #define YY_SrvParser_CONSTRUCTOR_CODE #endif #ifndef YY_SrvParser_CONSTRUCTOR_INIT #define YY_SrvParser_CONSTRUCTOR_INIT #endif /* choose between enum and const */ #ifndef YY_SrvParser_USE_CONST_TOKEN #define YY_SrvParser_USE_CONST_TOKEN 0 /* yes enum is more compatible with flex, */ /* so by default we use it */ #endif #if YY_SrvParser_USE_CONST_TOKEN != 0 #ifndef YY_SrvParser_ENUM_TOKEN #define YY_SrvParser_ENUM_TOKEN yy_SrvParser_enum_token #endif #endif class YY_SrvParser_CLASS YY_SrvParser_INHERIT { public: #if YY_SrvParser_USE_CONST_TOKEN != 0 /* static const int token ... */ #line 307 "../bison++/bison.cc" static const int IFACE_; static const int RELAY_; static const int IFACE_ID_; static const int IFACE_ID_ORDER_; static const int CLASS_; static const int TACLASS_; static const int LOGNAME_; static const int LOGLEVEL_; static const int LOGMODE_; static const int LOGCOLORS_; static const int WORKDIR_; static const int OPTION_; static const int DNS_SERVER_; static const int DOMAIN_; static const int NTP_SERVER_; static const int TIME_ZONE_; static const int SIP_SERVER_; static const int SIP_DOMAIN_; static const int NIS_SERVER_; static const int NIS_DOMAIN_; static const int NISP_SERVER_; static const int NISP_DOMAIN_; static const int LIFETIME_; static const int FQDN_; static const int ACCEPT_UNKNOWN_FQDN_; static const int FQDN_DDNS_ADDRESS_; static const int DDNS_PROTOCOL_; static const int DDNS_TIMEOUT_; static const int ACCEPT_ONLY_; static const int REJECT_CLIENTS_; static const int POOL_; static const int SHARE_; static const int T1_; static const int T2_; static const int PREF_TIME_; static const int VALID_TIME_; static const int UNICAST_; static const int DROP_UNICAST_; static const int PREFERENCE_; static const int RAPID_COMMIT_; static const int IFACE_MAX_LEASE_; static const int CLASS_MAX_LEASE_; static const int CLNT_MAX_LEASE_; static const int STATELESS_; static const int CACHE_SIZE_; static const int PDCLASS_; static const int PD_LENGTH_; static const int PD_POOL_; static const int SCRIPT_; static const int VENDOR_SPEC_; static const int CLIENT_; static const int DUID_KEYWORD_; static const int REMOTE_ID_; static const int LINK_LOCAL_; static const int ADDRESS_; static const int PREFIX_; static const int GUESS_MODE_; static const int INACTIVE_MODE_; static const int EXPERIMENTAL_; static const int ADDR_PARAMS_; static const int REMOTE_AUTOCONF_NEIGHBORS_; static const int AFTR_; static const int PERFORMANCE_MODE_; static const int AUTH_PROTOCOL_; static const int AUTH_ALGORITHM_; static const int AUTH_REPLAY_; static const int AUTH_METHODS_; static const int AUTH_DROP_UNAUTH_; static const int AUTH_REALM_; static const int KEY_; static const int SECRET_; static const int ALGORITHM_; static const int FUDGE_; static const int DIGEST_NONE_; static const int DIGEST_PLAIN_; static const int DIGEST_HMAC_MD5_; static const int DIGEST_HMAC_SHA1_; static const int DIGEST_HMAC_SHA224_; static const int DIGEST_HMAC_SHA256_; static const int DIGEST_HMAC_SHA384_; static const int DIGEST_HMAC_SHA512_; static const int ACCEPT_LEASEQUERY_; static const int BULKLQ_ACCEPT_; static const int BULKLQ_TCPPORT_; static const int BULKLQ_MAX_CONNS_; static const int BULKLQ_TIMEOUT_; static const int CLIENT_CLASS_; static const int MATCH_IF_; static const int EQ_; static const int AND_; static const int OR_; static const int CLIENT_VENDOR_SPEC_ENTERPRISE_NUM_; static const int CLIENT_VENDOR_SPEC_DATA_; static const int CLIENT_VENDOR_CLASS_EN_; static const int CLIENT_VENDOR_CLASS_DATA_; static const int RECONFIGURE_ENABLED_; static const int ALLOW_; static const int DENY_; static const int SUBSTRING_; static const int STRING_KEYWORD_; static const int ADDRESS_LIST_; static const int CONTAIN_; static const int NEXT_HOP_; static const int ROUTE_; static const int INFINITE_; static const int SUBNET_; static const int STRING_; static const int HEXNUMBER_; static const int INTNUMBER_; static const int IPV6ADDR_; static const int DUID_; #line 307 "../bison++/bison.cc" /* decl const */ #else enum YY_SrvParser_ENUM_TOKEN { YY_SrvParser_NULL_TOKEN=0 #line 310 "../bison++/bison.cc" ,IFACE_=258 ,RELAY_=259 ,IFACE_ID_=260 ,IFACE_ID_ORDER_=261 ,CLASS_=262 ,TACLASS_=263 ,LOGNAME_=264 ,LOGLEVEL_=265 ,LOGMODE_=266 ,LOGCOLORS_=267 ,WORKDIR_=268 ,OPTION_=269 ,DNS_SERVER_=270 ,DOMAIN_=271 ,NTP_SERVER_=272 ,TIME_ZONE_=273 ,SIP_SERVER_=274 ,SIP_DOMAIN_=275 ,NIS_SERVER_=276 ,NIS_DOMAIN_=277 ,NISP_SERVER_=278 ,NISP_DOMAIN_=279 ,LIFETIME_=280 ,FQDN_=281 ,ACCEPT_UNKNOWN_FQDN_=282 ,FQDN_DDNS_ADDRESS_=283 ,DDNS_PROTOCOL_=284 ,DDNS_TIMEOUT_=285 ,ACCEPT_ONLY_=286 ,REJECT_CLIENTS_=287 ,POOL_=288 ,SHARE_=289 ,T1_=290 ,T2_=291 ,PREF_TIME_=292 ,VALID_TIME_=293 ,UNICAST_=294 ,DROP_UNICAST_=295 ,PREFERENCE_=296 ,RAPID_COMMIT_=297 ,IFACE_MAX_LEASE_=298 ,CLASS_MAX_LEASE_=299 ,CLNT_MAX_LEASE_=300 ,STATELESS_=301 ,CACHE_SIZE_=302 ,PDCLASS_=303 ,PD_LENGTH_=304 ,PD_POOL_=305 ,SCRIPT_=306 ,VENDOR_SPEC_=307 ,CLIENT_=308 ,DUID_KEYWORD_=309 ,REMOTE_ID_=310 ,LINK_LOCAL_=311 ,ADDRESS_=312 ,PREFIX_=313 ,GUESS_MODE_=314 ,INACTIVE_MODE_=315 ,EXPERIMENTAL_=316 ,ADDR_PARAMS_=317 ,REMOTE_AUTOCONF_NEIGHBORS_=318 ,AFTR_=319 ,PERFORMANCE_MODE_=320 ,AUTH_PROTOCOL_=321 ,AUTH_ALGORITHM_=322 ,AUTH_REPLAY_=323 ,AUTH_METHODS_=324 ,AUTH_DROP_UNAUTH_=325 ,AUTH_REALM_=326 ,KEY_=327 ,SECRET_=328 ,ALGORITHM_=329 ,FUDGE_=330 ,DIGEST_NONE_=331 ,DIGEST_PLAIN_=332 ,DIGEST_HMAC_MD5_=333 ,DIGEST_HMAC_SHA1_=334 ,DIGEST_HMAC_SHA224_=335 ,DIGEST_HMAC_SHA256_=336 ,DIGEST_HMAC_SHA384_=337 ,DIGEST_HMAC_SHA512_=338 ,ACCEPT_LEASEQUERY_=339 ,BULKLQ_ACCEPT_=340 ,BULKLQ_TCPPORT_=341 ,BULKLQ_MAX_CONNS_=342 ,BULKLQ_TIMEOUT_=343 ,CLIENT_CLASS_=344 ,MATCH_IF_=345 ,EQ_=346 ,AND_=347 ,OR_=348 ,CLIENT_VENDOR_SPEC_ENTERPRISE_NUM_=349 ,CLIENT_VENDOR_SPEC_DATA_=350 ,CLIENT_VENDOR_CLASS_EN_=351 ,CLIENT_VENDOR_CLASS_DATA_=352 ,RECONFIGURE_ENABLED_=353 ,ALLOW_=354 ,DENY_=355 ,SUBSTRING_=356 ,STRING_KEYWORD_=357 ,ADDRESS_LIST_=358 ,CONTAIN_=359 ,NEXT_HOP_=360 ,ROUTE_=361 ,INFINITE_=362 ,SUBNET_=363 ,STRING_=364 ,HEXNUMBER_=365 ,INTNUMBER_=366 ,IPV6ADDR_=367 ,DUID_=368 #line 310 "../bison++/bison.cc" /* enum token */ }; /* end of enum declaration */ #endif public: int YY_SrvParser_PARSE (YY_SrvParser_PARSE_PARAM); virtual void YY_SrvParser_ERROR(char *msg) YY_SrvParser_ERROR_BODY; #ifdef YY_SrvParser_PURE #ifdef YY_SrvParser_LSP_NEEDED virtual int YY_SrvParser_LEX (YY_SrvParser_STYPE *YY_SrvParser_LVAL,YY_SrvParser_LTYPE *YY_SrvParser_LLOC) YY_SrvParser_LEX_BODY; #else virtual int YY_SrvParser_LEX (YY_SrvParser_STYPE *YY_SrvParser_LVAL) YY_SrvParser_LEX_BODY; #endif #else virtual int YY_SrvParser_LEX() YY_SrvParser_LEX_BODY; YY_SrvParser_STYPE YY_SrvParser_LVAL; #ifdef YY_SrvParser_LSP_NEEDED YY_SrvParser_LTYPE YY_SrvParser_LLOC; #endif int YY_SrvParser_NERRS; int YY_SrvParser_CHAR; #endif #if YY_SrvParser_DEBUG != 0 int YY_SrvParser_DEBUG_FLAG; /* nonzero means print parse trace */ #endif public: YY_SrvParser_CLASS(YY_SrvParser_CONSTRUCTOR_PARAM); public: YY_SrvParser_MEMBERS }; /* other declare folow */ #if YY_SrvParser_USE_CONST_TOKEN != 0 #line 341 "../bison++/bison.cc" const int YY_SrvParser_CLASS::IFACE_=258; const int YY_SrvParser_CLASS::RELAY_=259; const int YY_SrvParser_CLASS::IFACE_ID_=260; const int YY_SrvParser_CLASS::IFACE_ID_ORDER_=261; const int YY_SrvParser_CLASS::CLASS_=262; const int YY_SrvParser_CLASS::TACLASS_=263; const int YY_SrvParser_CLASS::LOGNAME_=264; const int YY_SrvParser_CLASS::LOGLEVEL_=265; const int YY_SrvParser_CLASS::LOGMODE_=266; const int YY_SrvParser_CLASS::LOGCOLORS_=267; const int YY_SrvParser_CLASS::WORKDIR_=268; const int YY_SrvParser_CLASS::OPTION_=269; const int YY_SrvParser_CLASS::DNS_SERVER_=270; const int YY_SrvParser_CLASS::DOMAIN_=271; const int YY_SrvParser_CLASS::NTP_SERVER_=272; const int YY_SrvParser_CLASS::TIME_ZONE_=273; const int YY_SrvParser_CLASS::SIP_SERVER_=274; const int YY_SrvParser_CLASS::SIP_DOMAIN_=275; const int YY_SrvParser_CLASS::NIS_SERVER_=276; const int YY_SrvParser_CLASS::NIS_DOMAIN_=277; const int YY_SrvParser_CLASS::NISP_SERVER_=278; const int YY_SrvParser_CLASS::NISP_DOMAIN_=279; const int YY_SrvParser_CLASS::LIFETIME_=280; const int YY_SrvParser_CLASS::FQDN_=281; const int YY_SrvParser_CLASS::ACCEPT_UNKNOWN_FQDN_=282; const int YY_SrvParser_CLASS::FQDN_DDNS_ADDRESS_=283; const int YY_SrvParser_CLASS::DDNS_PROTOCOL_=284; const int YY_SrvParser_CLASS::DDNS_TIMEOUT_=285; const int YY_SrvParser_CLASS::ACCEPT_ONLY_=286; const int YY_SrvParser_CLASS::REJECT_CLIENTS_=287; const int YY_SrvParser_CLASS::POOL_=288; const int YY_SrvParser_CLASS::SHARE_=289; const int YY_SrvParser_CLASS::T1_=290; const int YY_SrvParser_CLASS::T2_=291; const int YY_SrvParser_CLASS::PREF_TIME_=292; const int YY_SrvParser_CLASS::VALID_TIME_=293; const int YY_SrvParser_CLASS::UNICAST_=294; const int YY_SrvParser_CLASS::DROP_UNICAST_=295; const int YY_SrvParser_CLASS::PREFERENCE_=296; const int YY_SrvParser_CLASS::RAPID_COMMIT_=297; const int YY_SrvParser_CLASS::IFACE_MAX_LEASE_=298; const int YY_SrvParser_CLASS::CLASS_MAX_LEASE_=299; const int YY_SrvParser_CLASS::CLNT_MAX_LEASE_=300; const int YY_SrvParser_CLASS::STATELESS_=301; const int YY_SrvParser_CLASS::CACHE_SIZE_=302; const int YY_SrvParser_CLASS::PDCLASS_=303; const int YY_SrvParser_CLASS::PD_LENGTH_=304; const int YY_SrvParser_CLASS::PD_POOL_=305; const int YY_SrvParser_CLASS::SCRIPT_=306; const int YY_SrvParser_CLASS::VENDOR_SPEC_=307; const int YY_SrvParser_CLASS::CLIENT_=308; const int YY_SrvParser_CLASS::DUID_KEYWORD_=309; const int YY_SrvParser_CLASS::REMOTE_ID_=310; const int YY_SrvParser_CLASS::LINK_LOCAL_=311; const int YY_SrvParser_CLASS::ADDRESS_=312; const int YY_SrvParser_CLASS::PREFIX_=313; const int YY_SrvParser_CLASS::GUESS_MODE_=314; const int YY_SrvParser_CLASS::INACTIVE_MODE_=315; const int YY_SrvParser_CLASS::EXPERIMENTAL_=316; const int YY_SrvParser_CLASS::ADDR_PARAMS_=317; const int YY_SrvParser_CLASS::REMOTE_AUTOCONF_NEIGHBORS_=318; const int YY_SrvParser_CLASS::AFTR_=319; const int YY_SrvParser_CLASS::PERFORMANCE_MODE_=320; const int YY_SrvParser_CLASS::AUTH_PROTOCOL_=321; const int YY_SrvParser_CLASS::AUTH_ALGORITHM_=322; const int YY_SrvParser_CLASS::AUTH_REPLAY_=323; const int YY_SrvParser_CLASS::AUTH_METHODS_=324; const int YY_SrvParser_CLASS::AUTH_DROP_UNAUTH_=325; const int YY_SrvParser_CLASS::AUTH_REALM_=326; const int YY_SrvParser_CLASS::KEY_=327; const int YY_SrvParser_CLASS::SECRET_=328; const int YY_SrvParser_CLASS::ALGORITHM_=329; const int YY_SrvParser_CLASS::FUDGE_=330; const int YY_SrvParser_CLASS::DIGEST_NONE_=331; const int YY_SrvParser_CLASS::DIGEST_PLAIN_=332; const int YY_SrvParser_CLASS::DIGEST_HMAC_MD5_=333; const int YY_SrvParser_CLASS::DIGEST_HMAC_SHA1_=334; const int YY_SrvParser_CLASS::DIGEST_HMAC_SHA224_=335; const int YY_SrvParser_CLASS::DIGEST_HMAC_SHA256_=336; const int YY_SrvParser_CLASS::DIGEST_HMAC_SHA384_=337; const int YY_SrvParser_CLASS::DIGEST_HMAC_SHA512_=338; const int YY_SrvParser_CLASS::ACCEPT_LEASEQUERY_=339; const int YY_SrvParser_CLASS::BULKLQ_ACCEPT_=340; const int YY_SrvParser_CLASS::BULKLQ_TCPPORT_=341; const int YY_SrvParser_CLASS::BULKLQ_MAX_CONNS_=342; const int YY_SrvParser_CLASS::BULKLQ_TIMEOUT_=343; const int YY_SrvParser_CLASS::CLIENT_CLASS_=344; const int YY_SrvParser_CLASS::MATCH_IF_=345; const int YY_SrvParser_CLASS::EQ_=346; const int YY_SrvParser_CLASS::AND_=347; const int YY_SrvParser_CLASS::OR_=348; const int YY_SrvParser_CLASS::CLIENT_VENDOR_SPEC_ENTERPRISE_NUM_=349; const int YY_SrvParser_CLASS::CLIENT_VENDOR_SPEC_DATA_=350; const int YY_SrvParser_CLASS::CLIENT_VENDOR_CLASS_EN_=351; const int YY_SrvParser_CLASS::CLIENT_VENDOR_CLASS_DATA_=352; const int YY_SrvParser_CLASS::RECONFIGURE_ENABLED_=353; const int YY_SrvParser_CLASS::ALLOW_=354; const int YY_SrvParser_CLASS::DENY_=355; const int YY_SrvParser_CLASS::SUBSTRING_=356; const int YY_SrvParser_CLASS::STRING_KEYWORD_=357; const int YY_SrvParser_CLASS::ADDRESS_LIST_=358; const int YY_SrvParser_CLASS::CONTAIN_=359; const int YY_SrvParser_CLASS::NEXT_HOP_=360; const int YY_SrvParser_CLASS::ROUTE_=361; const int YY_SrvParser_CLASS::INFINITE_=362; const int YY_SrvParser_CLASS::SUBNET_=363; const int YY_SrvParser_CLASS::STRING_=364; const int YY_SrvParser_CLASS::HEXNUMBER_=365; const int YY_SrvParser_CLASS::INTNUMBER_=366; const int YY_SrvParser_CLASS::IPV6ADDR_=367; const int YY_SrvParser_CLASS::DUID_=368; #line 341 "../bison++/bison.cc" /* const YY_SrvParser_CLASS::token */ #endif /*apres const */ YY_SrvParser_CLASS::YY_SrvParser_CLASS(YY_SrvParser_CONSTRUCTOR_PARAM) YY_SrvParser_CONSTRUCTOR_INIT { #if YY_SrvParser_DEBUG != 0 YY_SrvParser_DEBUG_FLAG=0; #endif YY_SrvParser_CONSTRUCTOR_CODE; } #endif #line 352 "../bison++/bison.cc" #define YYFINAL 507 #define YYFLAG -32768 #define YYNTBASE 122 #define YYTRANSLATE(x) ((unsigned)(x) <= 368 ? yytranslate[x] : 263) static const char yytranslate[] = { 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 120, 121, 2, 2, 119, 117, 2, 118, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 116, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 114, 2, 115, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 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, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113 }; #if YY_SrvParser_DEBUG != 0 static const short yyprhs[] = { 0, 0, 2, 3, 5, 7, 10, 13, 15, 17, 19, 21, 23, 25, 27, 29, 31, 33, 35, 37, 39, 41, 43, 45, 47, 49, 51, 53, 55, 57, 59, 61, 63, 65, 67, 69, 71, 73, 75, 77, 79, 81, 83, 85, 87, 89, 91, 93, 95, 97, 99, 101, 103, 105, 107, 109, 111, 113, 115, 117, 119, 121, 123, 125, 127, 129, 131, 133, 134, 141, 142, 149, 151, 154, 156, 158, 160, 162, 165, 168, 171, 174, 175, 176, 185, 187, 190, 192, 194, 196, 200, 204, 208, 212, 216, 217, 225, 226, 236, 237, 245, 247, 250, 252, 254, 256, 258, 260, 262, 264, 266, 268, 270, 272, 274, 276, 278, 280, 282, 285, 290, 291, 297, 299, 302, 303, 309, 311, 314, 316, 318, 320, 322, 324, 326, 328, 330, 331, 337, 339, 342, 344, 346, 348, 350, 352, 354, 356, 358, 359, 366, 369, 371, 374, 381, 386, 393, 396, 399, 402, 405, 406, 410, 412, 416, 418, 420, 422, 424, 426, 428, 430, 432, 435, 437, 441, 445, 449, 455, 461, 463, 465, 467, 471, 477, 483, 489, 497, 505, 513, 515, 519, 521, 525, 529, 533, 539, 543, 545, 549, 553, 559, 561, 565, 569, 575, 576, 580, 581, 585, 586, 590, 591, 595, 598, 601, 606, 609, 614, 617, 620, 625, 628, 633, 636, 639, 642, 646, 651, 656, 657, 663, 668, 669, 674, 677, 680, 682, 685, 688, 691, 694, 697, 700, 703, 705, 707, 710, 713, 716, 718, 720, 723, 726, 728, 731, 734, 737, 740, 743, 746, 749, 752, 755, 758, 763, 768, 770, 772, 774, 776, 778, 780, 782, 784, 786, 788, 790, 792, 795, 798, 799, 804, 805, 810, 811, 816, 820, 821, 826, 827, 832, 833, 838, 839, 845, 846, 853, 857, 860, 863, 866, 869, 870, 875, 876, 881, 885, 889, 893, 894, 899, 900, 907, 910, 911, 917, 923, 929, 935, 937, 939, 941, 943, 945, 947 }; static const short yyrhs[] = { 123, 0, 0, 124, 0, 126, 0, 123, 124, 0, 123, 126, 0, 125, 0, 206, 0, 205, 0, 207, 0, 208, 0, 209, 0, 210, 0, 218, 0, 161, 0, 162, 0, 163, 0, 164, 0, 165, 0, 169, 0, 216, 0, 217, 0, 246, 0, 247, 0, 248, 0, 211, 0, 258, 0, 130, 0, 212, 0, 213, 0, 214, 0, 202, 0, 227, 0, 224, 0, 225, 0, 219, 0, 220, 0, 221, 0, 222, 0, 223, 0, 201, 0, 204, 0, 203, 0, 200, 0, 192, 0, 230, 0, 232, 0, 234, 0, 236, 0, 237, 0, 239, 0, 241, 0, 245, 0, 249, 0, 253, 0, 251, 0, 254, 0, 195, 0, 255, 0, 196, 0, 198, 0, 153, 0, 256, 0, 138, 0, 215, 0, 226, 0, 0, 3, 109, 114, 127, 129, 115, 0, 0, 3, 171, 114, 128, 129, 115, 0, 125, 0, 129, 125, 0, 146, 0, 149, 0, 157, 0, 160, 0, 129, 149, 0, 129, 146, 0, 129, 157, 0, 129, 160, 0, 0, 0, 72, 109, 114, 131, 133, 115, 132, 116, 0, 134, 0, 133, 134, 0, 137, 0, 135, 0, 136, 0, 73, 109, 116, 0, 75, 171, 116, 0, 74, 81, 116, 0, 74, 79, 116, 0, 74, 78, 116, 0, 0, 53, 54, 113, 114, 139, 142, 115, 0, 0, 53, 55, 171, 117, 113, 114, 140, 142, 115, 0, 0, 53, 56, 112, 114, 141, 142, 115, 0, 143, 0, 142, 143, 0, 230, 0, 232, 0, 234, 0, 236, 0, 237, 0, 239, 0, 249, 0, 253, 0, 251, 0, 254, 0, 255, 0, 256, 0, 196, 0, 195, 0, 144, 0, 145, 0, 57, 112, 0, 58, 112, 118, 171, 0, 0, 7, 114, 147, 148, 115, 0, 227, 0, 148, 227, 0, 0, 8, 114, 150, 151, 115, 0, 152, 0, 151, 152, 0, 187, 0, 188, 0, 182, 0, 193, 0, 178, 0, 180, 0, 228, 0, 229, 0, 0, 48, 114, 154, 155, 115, 0, 156, 0, 156, 155, 0, 186, 0, 184, 0, 188, 0, 187, 0, 190, 0, 191, 0, 228, 0, 229, 0, 0, 105, 112, 114, 158, 159, 115, 0, 105, 112, 0, 160, 0, 159, 160, 0, 106, 112, 118, 111, 25, 111, 0, 106, 112, 118, 111, 0, 106, 112, 118, 111, 25, 107, 0, 66, 109, 0, 67, 109, 0, 68, 109, 0, 71, 109, 0, 0, 69, 166, 167, 0, 168, 0, 167, 119, 168, 0, 76, 0, 77, 0, 78, 0, 79, 0, 80, 0, 81, 0, 82, 0, 83, 0, 70, 171, 0, 109, 0, 109, 117, 113, 0, 109, 117, 112, 0, 170, 119, 109, 0, 170, 119, 109, 117, 113, 0, 170, 119, 109, 117, 112, 0, 110, 0, 111, 0, 112, 0, 172, 119, 112, 0, 171, 117, 171, 117, 113, 0, 171, 117, 171, 117, 112, 0, 171, 117, 171, 117, 109, 0, 173, 119, 171, 117, 171, 117, 113, 0, 173, 119, 171, 117, 171, 117, 112, 0, 173, 119, 171, 117, 171, 117, 109, 0, 109, 0, 174, 119, 109, 0, 112, 0, 112, 117, 112, 0, 112, 118, 111, 0, 175, 119, 112, 0, 175, 119, 112, 117, 112, 0, 112, 118, 111, 0, 112, 0, 112, 117, 112, 0, 177, 119, 112, 0, 177, 119, 112, 117, 112, 0, 113, 0, 113, 117, 113, 0, 177, 119, 113, 0, 177, 119, 113, 117, 113, 0, 0, 32, 179, 177, 0, 0, 31, 181, 177, 0, 0, 33, 183, 175, 0, 0, 50, 185, 176, 0, 49, 171, 0, 37, 171, 0, 37, 171, 117, 171, 0, 38, 171, 0, 38, 171, 117, 171, 0, 34, 171, 0, 35, 171, 0, 35, 171, 117, 171, 0, 36, 171, 0, 36, 171, 117, 171, 0, 45, 171, 0, 44, 171, 0, 62, 171, 0, 14, 64, 109, 0, 14, 171, 54, 113, 0, 14, 171, 57, 112, 0, 0, 14, 171, 103, 197, 172, 0, 14, 171, 102, 109, 0, 0, 14, 63, 199, 172, 0, 43, 171, 0, 39, 112, 0, 40, 0, 42, 171, 0, 41, 171, 0, 10, 171, 0, 11, 109, 0, 9, 109, 0, 12, 171, 0, 13, 109, 0, 46, 0, 59, 0, 51, 109, 0, 65, 171, 0, 98, 171, 0, 60, 0, 61, 0, 6, 109, 0, 47, 171, 0, 84, 0, 84, 171, 0, 85, 171, 0, 86, 171, 0, 87, 171, 0, 88, 171, 0, 4, 109, 0, 4, 171, 0, 5, 171, 0, 5, 113, 0, 5, 109, 0, 108, 112, 118, 171, 0, 108, 112, 117, 112, 0, 187, 0, 188, 0, 182, 0, 189, 0, 190, 0, 191, 0, 178, 0, 180, 0, 193, 0, 194, 0, 228, 0, 229, 0, 99, 109, 0, 100, 109, 0, 0, 14, 15, 231, 172, 0, 0, 14, 16, 233, 174, 0, 0, 14, 17, 235, 172, 0, 14, 18, 109, 0, 0, 14, 19, 238, 172, 0, 0, 14, 20, 240, 174, 0, 0, 14, 26, 242, 170, 0, 0, 14, 26, 111, 243, 170, 0, 0, 14, 26, 111, 111, 244, 170, 0, 27, 171, 109, 0, 27, 171, 0, 28, 112, 0, 29, 109, 0, 30, 171, 0, 0, 14, 21, 250, 172, 0, 0, 14, 23, 252, 172, 0, 14, 22, 109, 0, 14, 24, 109, 0, 14, 25, 171, 0, 0, 14, 52, 257, 173, 0, 0, 89, 109, 114, 259, 260, 115, 0, 90, 261, 0, 0, 120, 262, 104, 262, 121, 0, 120, 262, 91, 262, 121, 0, 120, 261, 92, 261, 121, 0, 120, 261, 93, 261, 121, 0, 94, 0, 95, 0, 96, 0, 97, 0, 109, 0, 171, 0, 101, 120, 262, 119, 171, 119, 171, 121, 0 }; #endif #if (YY_SrvParser_DEBUG != 0) || defined(YY_SrvParser_ERROR_VERBOSE) static const short yyrline[] = { 0, 162, 163, 167, 168, 169, 170, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 241, 246, 254, 259, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 278, 283, 308, 311, 312, 316, 317, 318, 322, 329, 335, 336, 337, 342, 348, 356, 362, 370, 376, 385, 386, 390, 391, 392, 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, 405, 408, 416, 425, 430, 438, 439, 444, 447, 455, 456, 460, 461, 462, 463, 464, 465, 466, 467, 471, 474, 482, 483, 486, 487, 488, 489, 490, 491, 492, 493, 500, 507, 512, 521, 522, 525, 535, 544, 555, 578, 584, 602, 611, 614, 625, 626, 630, 631, 632, 633, 634, 635, 636, 637, 642, 659, 664, 671, 677, 682, 688, 697, 698, 702, 706, 713, 721, 729, 737, 744, 752, 762, 763, 767, 771, 780, 796, 800, 812, 835, 839, 848, 852, 861, 867, 879, 885, 899, 903, 909, 913, 919, 923, 929, 932, 937, 949, 954, 962, 967, 975, 987, 992, 1000, 1005, 1013, 1020, 1027, 1042, 1050, 1057, 1065, 1069, 1075, 1083, 1094, 1103, 1110, 1117, 1123, 1138, 1150, 1156, 1161, 1168, 1174, 1181, 1188, 1196, 1202, 1215, 1231, 1237, 1244, 1266, 1277, 1282, 1299, 1310, 1316, 1322, 1331, 1335, 1342, 1347, 1352, 1360, 1373, 1383, 1384, 1385, 1386, 1387, 1388, 1389, 1390, 1391, 1392, 1393, 1394, 1398, 1427, 1460, 1464, 1474, 1477, 1487, 1491, 1502, 1514, 1517, 1528, 1531, 1543, 1553, 1556, 1579, 1583, 1612, 1619, 1625, 1634, 1642, 1659, 1669, 1672, 1683, 1686, 1697, 1709, 1720, 1731, 1733, 1740, 1743, 1753, 1759, 1759, 1767, 1776, 1785, 1796, 1800, 1804, 1808, 1812, 1817, 1826 }; static const char * const yytname[] = { "$","error","$illegal.","IFACE_","RELAY_", "IFACE_ID_","IFACE_ID_ORDER_","CLASS_","TACLASS_","LOGNAME_","LOGLEVEL_","LOGMODE_", "LOGCOLORS_","WORKDIR_","OPTION_","DNS_SERVER_","DOMAIN_","NTP_SERVER_","TIME_ZONE_", "SIP_SERVER_","SIP_DOMAIN_","NIS_SERVER_","NIS_DOMAIN_","NISP_SERVER_","NISP_DOMAIN_", "LIFETIME_","FQDN_","ACCEPT_UNKNOWN_FQDN_","FQDN_DDNS_ADDRESS_","DDNS_PROTOCOL_", "DDNS_TIMEOUT_","ACCEPT_ONLY_","REJECT_CLIENTS_","POOL_","SHARE_","T1_","T2_", "PREF_TIME_","VALID_TIME_","UNICAST_","DROP_UNICAST_","PREFERENCE_","RAPID_COMMIT_", "IFACE_MAX_LEASE_","CLASS_MAX_LEASE_","CLNT_MAX_LEASE_","STATELESS_","CACHE_SIZE_", "PDCLASS_","PD_LENGTH_","PD_POOL_","SCRIPT_","VENDOR_SPEC_","CLIENT_","DUID_KEYWORD_", "REMOTE_ID_","LINK_LOCAL_","ADDRESS_","PREFIX_","GUESS_MODE_","INACTIVE_MODE_", "EXPERIMENTAL_","ADDR_PARAMS_","REMOTE_AUTOCONF_NEIGHBORS_","AFTR_","PERFORMANCE_MODE_", "AUTH_PROTOCOL_","AUTH_ALGORITHM_","AUTH_REPLAY_","AUTH_METHODS_","AUTH_DROP_UNAUTH_", "AUTH_REALM_","KEY_","SECRET_","ALGORITHM_","FUDGE_","DIGEST_NONE_","DIGEST_PLAIN_", "DIGEST_HMAC_MD5_","DIGEST_HMAC_SHA1_","DIGEST_HMAC_SHA224_","DIGEST_HMAC_SHA256_", "DIGEST_HMAC_SHA384_","DIGEST_HMAC_SHA512_","ACCEPT_LEASEQUERY_","BULKLQ_ACCEPT_", "BULKLQ_TCPPORT_","BULKLQ_MAX_CONNS_","BULKLQ_TIMEOUT_","CLIENT_CLASS_","MATCH_IF_", "EQ_","AND_","OR_","CLIENT_VENDOR_SPEC_ENTERPRISE_NUM_","CLIENT_VENDOR_SPEC_DATA_", "CLIENT_VENDOR_CLASS_EN_","CLIENT_VENDOR_CLASS_DATA_","RECONFIGURE_ENABLED_", "ALLOW_","DENY_","SUBSTRING_","STRING_KEYWORD_","ADDRESS_LIST_","CONTAIN_","NEXT_HOP_", "ROUTE_","INFINITE_","SUBNET_","STRING_","HEXNUMBER_","INTNUMBER_","IPV6ADDR_", "DUID_","'{'","'}'","';'","'-'","'/'","','","'('","')'","Grammar","GlobalDeclarationList", "GlobalOption","InterfaceOptionDeclaration","InterfaceDeclaration","@1","@2", "InterfaceDeclarationsList","Key","@3","@4","KeyOptions","KeyOption","KeySecret", "KeyFudge","KeyAlgorithm","Client","@5","@6","@7","ClientOptions","ClientOption", "AddressReservation","PrefixReservation","ClassDeclaration","@8","ClassOptionDeclarationsList", "TAClassDeclaration","@9","TAClassOptionsList","TAClassOption","PDDeclaration", "@10","PDOptionsList","PDOptions","NextHopDeclaration","@11","RouteList","Route", "AuthProtocol","AuthAlgorithm","AuthReplay","AuthRealm","AuthMethods","@12", "DigestList","Digest","AuthDropUnauthenticated","FQDNList","Number","ADDRESSList", "VendorSpecList","StringList","ADDRESSRangeList","PDRangeList","ADDRESSDUIDRangeList", "RejectClientsOption","@13","AcceptOnlyOption","@14","PoolOption","@15","PDPoolOption", "@16","PDLength","PreferredTimeOption","ValidTimeOption","ShareOption","T1Option", "T2Option","ClntMaxLeaseOption","ClassMaxLeaseOption","AddrParams","DsLiteAftrName", "ExtraOption","@17","RemoteAutoconfNeighborsOption","@18","IfaceMaxLeaseOption", "UnicastAddressOption","DropUnicast","RapidCommitOption","PreferenceOption", "LogLevelOption","LogModeOption","LogNameOption","LogColors","WorkDirOption", "StatelessOption","GuessMode","ScriptName","PerformanceMode","ReconfigureEnabled", "InactiveMode","Experimental","IfaceIDOrder","CacheSizeOption","AcceptLeaseQuery", "BulkLeaseQueryAccept","BulkLeaseQueryTcpPort","BulkLeaseQueryMaxConns","BulkLeaseQueryTimeout", "RelayOption","InterfaceIDOption","Subnet","ClassOptionDeclaration","AllowClientClassDeclaration", "DenyClientClassDeclaration","DNSServerOption","@19","DomainOption","@20","NTPServerOption", "@21","TimeZoneOption","SIPServerOption","@22","SIPDomainOption","@23","FQDNOption", "@24","@25","@26","AcceptUnknownFQDN","FqdnDdnsAddress","DdnsProtocol","DdnsTimeout", "NISServerOption","@27","NISPServerOption","@28","NISDomainOption","NISPDomainOption", "LifetimeOption","VendorSpecOption","@29","ClientClass","@30","ClientClassDecleration", "Condition","Expr","" }; #endif static const short yyr1[] = { 0, 122, 122, 123, 123, 123, 123, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 127, 126, 128, 126, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 131, 132, 130, 133, 133, 134, 134, 134, 135, 136, 137, 137, 137, 139, 138, 140, 138, 141, 138, 142, 142, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 144, 145, 147, 146, 148, 148, 150, 149, 151, 151, 152, 152, 152, 152, 152, 152, 152, 152, 154, 153, 155, 155, 156, 156, 156, 156, 156, 156, 156, 156, 158, 157, 157, 159, 159, 160, 160, 160, 161, 162, 163, 164, 166, 165, 167, 167, 168, 168, 168, 168, 168, 168, 168, 168, 169, 170, 170, 170, 170, 170, 170, 171, 171, 172, 172, 173, 173, 173, 173, 173, 173, 174, 174, 175, 175, 175, 175, 175, 176, 177, 177, 177, 177, 177, 177, 177, 177, 179, 178, 181, 180, 183, 182, 185, 184, 186, 187, 187, 188, 188, 189, 190, 190, 191, 191, 192, 193, 194, 195, 196, 196, 197, 196, 196, 199, 198, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 219, 220, 221, 222, 223, 224, 224, 225, 225, 225, 226, 226, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 228, 229, 231, 230, 233, 232, 235, 234, 236, 238, 237, 240, 239, 242, 241, 243, 241, 244, 241, 245, 245, 246, 247, 248, 250, 249, 252, 251, 253, 254, 255, 257, 256, 259, 258, 260, 261, 261, 261, 261, 261, 262, 262, 262, 262, 262, 262, 262 }; static const short yyr2[] = { 0, 1, 0, 1, 1, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 6, 0, 6, 1, 2, 1, 1, 1, 1, 2, 2, 2, 2, 0, 0, 8, 1, 2, 1, 1, 1, 3, 3, 3, 3, 3, 0, 7, 0, 9, 0, 7, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 4, 0, 5, 1, 2, 0, 5, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 0, 5, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 0, 6, 2, 1, 2, 6, 4, 6, 2, 2, 2, 2, 0, 3, 1, 3, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 3, 3, 3, 5, 5, 1, 1, 1, 3, 5, 5, 5, 7, 7, 7, 1, 3, 1, 3, 3, 3, 5, 3, 1, 3, 3, 5, 1, 3, 3, 5, 0, 3, 0, 3, 0, 3, 0, 3, 2, 2, 4, 2, 4, 2, 2, 4, 2, 4, 2, 2, 2, 3, 4, 4, 0, 5, 4, 0, 4, 2, 2, 1, 2, 2, 2, 2, 2, 2, 2, 1, 1, 2, 2, 2, 1, 1, 2, 2, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 4, 4, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 0, 4, 0, 4, 0, 4, 3, 0, 4, 0, 4, 0, 4, 0, 5, 0, 6, 3, 2, 2, 2, 2, 0, 4, 0, 4, 3, 3, 3, 0, 4, 0, 6, 2, 0, 5, 5, 5, 5, 1, 1, 1, 1, 1, 1, 8 }; static const short yydefact[] = { 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 207, 205, 209, 0, 0, 0, 0, 0, 0, 236, 0, 0, 0, 0, 0, 244, 0, 0, 0, 0, 245, 249, 250, 0, 0, 0, 0, 0, 160, 0, 0, 0, 253, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 3, 7, 4, 28, 64, 62, 15, 16, 17, 18, 19, 20, 272, 273, 268, 266, 267, 269, 270, 271, 45, 274, 275, 58, 60, 61, 44, 41, 32, 43, 42, 9, 8, 10, 11, 12, 13, 26, 29, 30, 31, 65, 21, 22, 14, 36, 37, 38, 39, 40, 34, 35, 66, 33, 276, 277, 46, 47, 48, 49, 50, 51, 52, 53, 23, 24, 25, 54, 56, 55, 57, 59, 63, 27, 0, 179, 180, 0, 259, 260, 263, 262, 261, 251, 241, 239, 240, 242, 243, 280, 282, 284, 0, 287, 289, 302, 0, 304, 0, 0, 291, 309, 232, 0, 0, 298, 299, 300, 301, 0, 0, 0, 218, 219, 221, 214, 216, 235, 238, 237, 234, 224, 223, 252, 136, 246, 0, 0, 0, 225, 247, 156, 157, 158, 0, 172, 159, 0, 254, 255, 256, 257, 258, 0, 248, 278, 279, 0, 5, 6, 67, 69, 0, 0, 0, 286, 0, 0, 0, 306, 0, 307, 308, 293, 0, 0, 0, 226, 0, 0, 0, 229, 297, 197, 201, 208, 206, 191, 210, 0, 0, 0, 0, 0, 0, 0, 0, 164, 165, 166, 167, 168, 169, 170, 171, 161, 162, 81, 311, 0, 0, 0, 0, 181, 281, 189, 283, 285, 288, 290, 303, 305, 295, 0, 173, 292, 0, 310, 233, 227, 228, 231, 0, 0, 0, 0, 0, 0, 0, 220, 222, 215, 217, 0, 211, 0, 138, 141, 140, 143, 142, 144, 145, 146, 147, 94, 0, 98, 0, 0, 0, 265, 264, 0, 0, 0, 0, 71, 0, 73, 74, 75, 76, 0, 0, 0, 0, 294, 0, 0, 0, 0, 230, 198, 202, 199, 203, 192, 193, 194, 213, 0, 137, 139, 0, 0, 0, 163, 0, 0, 0, 0, 84, 87, 88, 86, 314, 0, 120, 124, 150, 0, 68, 72, 78, 77, 79, 80, 70, 182, 190, 296, 175, 174, 176, 0, 0, 0, 0, 0, 0, 212, 0, 0, 0, 0, 100, 116, 117, 115, 114, 102, 103, 104, 105, 106, 107, 108, 110, 109, 111, 112, 113, 96, 0, 0, 0, 0, 0, 0, 82, 85, 314, 313, 312, 0, 0, 148, 0, 0, 0, 0, 200, 204, 195, 0, 118, 0, 95, 101, 0, 99, 89, 93, 92, 91, 90, 0, 319, 320, 321, 322, 0, 323, 324, 0, 0, 0, 122, 0, 126, 132, 133, 130, 128, 129, 131, 134, 135, 0, 154, 178, 177, 185, 184, 183, 0, 196, 0, 0, 83, 0, 314, 314, 0, 0, 121, 123, 125, 127, 0, 151, 0, 0, 119, 97, 0, 0, 0, 0, 0, 149, 152, 155, 153, 188, 187, 186, 0, 317, 318, 316, 315, 0, 0, 0, 325, 0, 0, 0 }; static const short yydefgoto[] = { 505, 57, 58, 59, 60, 259, 260, 316, 61, 307, 435, 349, 350, 351, 352, 353, 62, 342, 428, 344, 383, 384, 385, 386, 317, 413, 445, 318, 414, 447, 448, 63, 241, 293, 294, 319, 457, 478, 320, 64, 65, 66, 67, 68, 192, 253, 254, 69, 273, 442, 262, 275, 264, 236, 379, 233, 70, 168, 71, 167, 72, 169, 295, 339, 296, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 280, 83, 224, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 210, 115, 211, 116, 212, 117, 118, 214, 119, 215, 120, 222, 271, 324, 121, 122, 123, 124, 125, 216, 126, 218, 127, 128, 129, 130, 223, 131, 308, 355, 411, 444 }; static const short yypact[] = { 443, -24, 116, 145, -30, -6, 96, 25, 96, 29, 285, 96, 43, 32, 96,-32768,-32768,-32768, 96, 96, 96, 96, 96, 68,-32768, 96, 96, 96, 96, 96,-32768, 96, 72, 102, 258,-32768,-32768,-32768, 96, 96, 137, 143, 151,-32768, 96, 153, 157, 96, 96, 96, 96, 96, 167, 96, 178, 184, 187, 443,-32768,-32768,-32768, -32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768, -32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768, -32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768, -32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768, -32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768, -32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768, -32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768, -32768, 128,-32768,-32768, 205,-32768,-32768,-32768,-32768,-32768, -32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768, 222, -32768,-32768,-32768, 225,-32768, 229, 96, 232,-32768,-32768, 231, 57, 241,-32768,-32768,-32768, 103, 103, 253,-32768, 238, 254, 255, 257,-32768,-32768,-32768,-32768,-32768,-32768, -32768,-32768,-32768, 267, 96, 271,-32768,-32768,-32768,-32768, -32768, 440,-32768,-32768, 270,-32768,-32768,-32768,-32768,-32768, 272,-32768,-32768,-32768, 165,-32768,-32768,-32768,-32768, 277, 289, 277,-32768, 277, 289, 277,-32768, 277,-32768,-32768, 283, 290, 96, 277,-32768, 287, 291, 292,-32768,-32768, 297, 298, 300, 300, 208, 307, 96, 96, 96, 96, 95, 288, 311, 294,-32768,-32768,-32768,-32768,-32768,-32768, -32768,-32768, 310,-32768,-32768,-32768, 305, 96, 530, 530, -32768, 313,-32768, 315, 313, 313, 315, 313, 313,-32768, 290, 321, 320, 324, 323, 313,-32768,-32768,-32768, 277, 333, 337, 108, 339, 293, 346,-32768,-32768,-32768,-32768, 96,-32768, 345, 95,-32768,-32768,-32768,-32768,-32768,-32768, -32768,-32768,-32768, 348,-32768, 440, 243, 372,-32768,-32768, 349, 350, 354, 355,-32768, 236,-32768,-32768,-32768,-32768, 325, 356, 360, 290, 320, 121, 383, 96, 96, 313, -32768,-32768, 376, 380,-32768,-32768, 381,-32768, 387,-32768, -32768, 37, 386, 37,-32768, 397, 216, 96, 130,-32768, -32768,-32768,-32768, 404, 392,-32768,-32768, 411, 408,-32768, -32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768, 320,-32768, -32768, 416, 419, 422, 428, 432, 434, 429,-32768, 579, 436, 437, 82,-32768,-32768,-32768,-32768,-32768,-32768,-32768, -32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768, -32768, 114, 438, 439, 442, 444, 454,-32768,-32768, 296, -32768,-32768, 620, 186,-32768, 441, 233, 119, 96,-32768, -32768,-32768, 445,-32768, 435,-32768,-32768, 37,-32768,-32768, -32768,-32768,-32768,-32768, 460,-32768,-32768,-32768,-32768, 430, -32768,-32768, 261, -20, 588,-32768, 344,-32768,-32768,-32768, -32768,-32768,-32768,-32768,-32768,-32768, 453, 552,-32768,-32768, -32768,-32768,-32768, 462,-32768, 96, 133,-32768, 326, 404, 404, 326, 326,-32768,-32768,-32768,-32768, -70,-32768, 2, 152,-32768,-32768, 461, 463, 464, 465, 466,-32768,-32768, -32768,-32768,-32768,-32768,-32768, 96,-32768,-32768,-32768,-32768, 469, 96, 468,-32768, 581, 582,-32768 }; static const short yypgoto[] = {-32768, -32768, 534, -138, 536,-32768,-32768, 347,-32768,-32768,-32768, -32768, 256,-32768,-32768,-32768,-32768,-32768,-32768,-32768, -322, -300,-32768,-32768, -153,-32768,-32768, -134,-32768,-32768, 159, -32768,-32768, 314,-32768, -123,-32768,-32768, -305,-32768,-32768, -32768,-32768,-32768,-32768,-32768, 303,-32768, -256, -1, 35, -32768, 395,-32768,-32768, 459, -356,-32768, -248,-32768, -245, -32768,-32768,-32768,-32768, -238, -237,-32768, -197, -187,-32768, -239,-32768, -330, -313,-32768,-32768,-32768,-32768,-32768,-32768, -32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768, -32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768, -32768,-32768,-32768,-32768, -390, -235, -233, -310,-32768, -309, -32768, -303,-32768, -302, -282,-32768, -279,-32768,-32768,-32768, -32768,-32768,-32768,-32768,-32768,-32768, -278,-32768, -275,-32768, -267, -266, -254, -232,-32768,-32768,-32768,-32768, -328, -181 }; #define YYLAST 720 static const short yytable[] = { 135, 137, 140, 297, 298, 143, 301, 145, 302, 162, 163, 365, 387, 166, 387, 325, 365, 170, 171, 172, 173, 174, 402, 446, 176, 177, 178, 179, 180, 388, 181, 388, 389, 390, 389, 390, 314, 187, 188, 391, 392, 391, 392, 193, 299, 489, 196, 197, 198, 199, 200, 380, 202, 387, 300, 475, 297, 298, 449, 301, 393, 302, 393, 394, 395, 394, 395, 396, 369, 396, 388, 472, 387, 389, 390, 397, 398, 397, 398, 141, 391, 392, 443, 427, 473, 132, 133, 134, 399, 388, 399, 449, 389, 390, 381, 382, 380, 299, 387, 391, 392, 393, 427, 142, 394, 395, 467, 300, 396, 491, 400, 226, 400, 492, 227, 388, 397, 398, 389, 390, 393, 315, 315, 394, 395, 391, 392, 396, 380, 399, 19, 20, 21, 22, 144, 397, 398, 387, 146, 381, 382, 165, 485, 486, 291, 292, 393, 380, 399, 394, 395, 400, 479, 396, 388, 164, 220, 389, 390, 228, 229, 397, 398, 362, 391, 392, 450, 427, 362, 451, 400, 381, 382, 490, 399, 454, 452, 453, 361, 455, 175, 456, 363, 361, 243, 393, 182, 363, 394, 395, 381, 382, 396, 364, 54, 55, 400, 426, 364, 450, 397, 398, 451, 346, 347, 348, 133, 134, 454, 452, 453, 183, 455, 399, 456, 231, 232, 15, 16, 17, 333, 334, 274, 21, 22, 136, 133, 134, 461, 429, 28, 462, 463, 370, 371, 400, 287, 288, 289, 290, 2, 3, 208, 311, 312, 408, 189, 265, 483, 266, 10, 268, 190, 269, 138, 133, 134, 310, 139, 276, 191, 493, 194, 11, 494, 495, 195, 15, 16, 17, 18, 19, 20, 21, 22, 23, 201, 25, 26, 27, 28, 29, 257, 258, 32, 54, 55, 203, 484, 34, 338, 487, 488, 204, 404, 405, 36, 406, 38, 205, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 184, 185, 186, 330, 346, 347, 348, 209, 47, 48, 49, 50, 51, 284, 285, 373, 374, 2, 3, 213, 311, 312, 217, 54, 55, 159, 219, 10, 225, 313, 314, 221, 56, 459, 460, 407, 160, 161, 230, 360, 11, 470, 471, 237, 15, 16, 17, 18, 19, 20, 21, 22, 23, 235, 25, 26, 27, 28, 29, 238, 239, 32, 240, 15, 16, 17, 34, 162, 242, 21, 22, 244, 255, 36, 256, 38, 28, 261, 436, 437, 438, 439, 270, 133, 134, 440, 263, 272, 277, 279, 303, 278, 336, 441, 133, 134, 305, 47, 48, 49, 50, 51, 281, 282, 410, 309, 464, 283, 436, 437, 438, 439, 54, 55, 286, 440, 304, 306, 313, 314, 322, 56, 323, 441, 133, 134, 326, 327, 366, 328, 329, 54, 55, 331, 1, 2, 3, 4, 332, 335, 5, 6, 7, 8, 9, 10, 337, 476, 340, 343, 354, 356, 357, 482, 358, 359, 367, 368, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 372, 375, 33, 501, 34, 376, 377, 378, 401, 503, 35, 36, 37, 38, 403, 412, 39, 40, 41, 42, 43, 44, 45, 46, 245, 246, 247, 248, 249, 250, 251, 252, 410, 415, 416, 47, 48, 49, 50, 51, 52, 417, 2, 3, 418, 311, 312, 419, 420, 53, 54, 55, 10, 421, 422, 423, 424, 425, 469, 56, 458, 466, 430, 431, 465, 11, 432, 314, 433, 15, 16, 17, 18, 19, 20, 21, 22, 23, 434, 25, 26, 27, 28, 29, 468, 480, 32, 481, 496, 506, 507, 34, 497, 498, 499, 500, 502, 504, 36, 206, 38, 207, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 409, 477, 321, 341, 345, 267, 0, 0, 0, 47, 48, 49, 50, 51, 15, 16, 17, 18, 19, 20, 21, 22, 234, 0, 54, 55, 159, 28, 0, 0, 313, 314, 0, 56, 0, 0, 0, 0, 161, 0, 0, 0, 0, 0, 0, 38, 15, 16, 17, 18, 19, 20, 21, 22, 0, 0, 0, 0, 0, 28, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 38, 0, 0, 0, 0, 54, 55, 133, 134, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 474, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 54, 55 }; static const short yycheck[] = { 1, 2, 3, 241, 241, 6, 241, 8, 241, 10, 11, 316, 342, 14, 344, 271, 321, 18, 19, 20, 21, 22, 344, 413, 25, 26, 27, 28, 29, 342, 31, 344, 342, 342, 344, 344, 106, 38, 39, 342, 342, 344, 344, 44, 241, 115, 47, 48, 49, 50, 51, 14, 53, 383, 241, 445, 294, 294, 414, 294, 342, 294, 344, 342, 342, 344, 344, 342, 324, 344, 383, 91, 402, 383, 383, 342, 342, 344, 344, 109, 383, 383, 410, 383, 104, 109, 110, 111, 342, 402, 344, 447, 402, 402, 57, 58, 14, 294, 428, 402, 402, 383, 402, 109, 383, 383, 428, 294, 383, 107, 342, 54, 344, 111, 57, 428, 383, 383, 428, 428, 402, 259, 260, 402, 402, 428, 428, 402, 14, 383, 35, 36, 37, 38, 109, 402, 402, 467, 109, 57, 58, 109, 470, 471, 49, 50, 428, 14, 402, 428, 428, 383, 457, 428, 467, 112, 157, 467, 467, 102, 103, 428, 428, 316, 467, 467, 414, 467, 321, 414, 402, 57, 58, 478, 428, 414, 414, 414, 316, 414, 112, 414, 316, 321, 185, 467, 114, 321, 467, 467, 57, 58, 467, 316, 99, 100, 428, 115, 321, 447, 467, 467, 447, 73, 74, 75, 110, 111, 447, 447, 447, 109, 447, 467, 447, 112, 113, 31, 32, 33, 112, 113, 223, 37, 38, 109, 110, 111, 109, 115, 44, 112, 113, 112, 113, 467, 237, 238, 239, 240, 4, 5, 114, 7, 8, 115, 109, 212, 115, 214, 14, 216, 109, 218, 109, 110, 111, 258, 113, 224, 109, 109, 109, 27, 112, 113, 109, 31, 32, 33, 34, 35, 36, 37, 38, 39, 109, 41, 42, 43, 44, 45, 117, 118, 48, 99, 100, 109, 469, 53, 291, 472, 473, 109, 78, 79, 60, 81, 62, 112, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 54, 55, 56, 280, 73, 74, 75, 114, 84, 85, 86, 87, 88, 117, 118, 328, 329, 4, 5, 109, 7, 8, 109, 99, 100, 52, 109, 14, 109, 105, 106, 111, 108, 112, 113, 348, 63, 64, 109, 115, 27, 92, 93, 117, 31, 32, 33, 34, 35, 36, 37, 38, 39, 112, 41, 42, 43, 44, 45, 117, 117, 48, 117, 31, 32, 33, 53, 380, 113, 37, 38, 112, 114, 60, 114, 62, 44, 112, 94, 95, 96, 97, 111, 110, 111, 101, 109, 109, 113, 109, 114, 112, 111, 109, 110, 111, 114, 84, 85, 86, 87, 88, 117, 117, 120, 112, 419, 119, 94, 95, 96, 97, 99, 100, 119, 101, 117, 119, 105, 106, 119, 108, 119, 109, 110, 111, 117, 119, 115, 117, 119, 99, 100, 112, 3, 4, 5, 6, 113, 112, 9, 10, 11, 12, 13, 14, 112, 115, 115, 113, 90, 114, 114, 466, 112, 112, 112, 109, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 109, 117, 51, 496, 53, 117, 117, 112, 114, 502, 59, 60, 61, 62, 109, 115, 65, 66, 67, 68, 69, 70, 71, 72, 76, 77, 78, 79, 80, 81, 82, 83, 120, 114, 118, 84, 85, 86, 87, 88, 89, 117, 4, 5, 117, 7, 8, 117, 112, 98, 99, 100, 14, 113, 112, 118, 112, 112, 120, 108, 111, 118, 116, 116, 111, 27, 116, 106, 116, 31, 32, 33, 34, 35, 36, 37, 38, 39, 116, 41, 42, 43, 44, 45, 116, 25, 48, 117, 119, 0, 0, 53, 121, 121, 121, 121, 119, 121, 60, 57, 62, 57, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 349, 447, 260, 294, 306, 215, -1, -1, -1, 84, 85, 86, 87, 88, 31, 32, 33, 34, 35, 36, 37, 38, 168, -1, 99, 100, 52, 44, -1, -1, 105, 106, -1, 108, -1, -1, -1, -1, 64, -1, -1, -1, -1, -1, -1, 62, 31, 32, 33, 34, 35, 36, 37, 38, -1, -1, -1, -1, -1, 44, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 62, -1, -1, -1, -1, 99, 100, 110, 111, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 115, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 99, 100 }; #line 352 "../bison++/bison.cc" /* fattrs + tables */ /* parser code folow */ /* This is the parser code that is written into each bison parser when the %semantic_parser declaration is not specified in the grammar. It was written by Richard Stallman by simplifying the hairy parser used when %semantic_parser is specified. */ /* Note: dollar marks section change the next is replaced by the list of actions, each action as one case of the switch. */ #if YY_SrvParser_USE_GOTO != 0 /* SUPRESSION OF GOTO : on some C++ compiler (sun c++) the goto is strictly forbidden if any constructor/destructor is used in the whole function (very stupid isn't it ?) so goto are to be replaced with a 'while/switch/case construct' here are the macro to keep some apparent compatibility */ #define YYGOTO(lb) {yy_gotostate=lb;continue;} #define YYBEGINGOTO enum yy_labels yy_gotostate=yygotostart; \ for(;;) switch(yy_gotostate) { case yygotostart: { #define YYLABEL(lb) } case lb: { #define YYENDGOTO } } #define YYBEGINDECLARELABEL enum yy_labels {yygotostart #define YYDECLARELABEL(lb) ,lb #define YYENDDECLARELABEL } #else /* macro to keep goto */ #define YYGOTO(lb) goto lb #define YYBEGINGOTO #define YYLABEL(lb) lb: #define YYENDGOTO #define YYBEGINDECLARELABEL #define YYDECLARELABEL(lb) #define YYENDDECLARELABEL #endif /* LABEL DECLARATION */ YYBEGINDECLARELABEL YYDECLARELABEL(yynewstate) YYDECLARELABEL(yybackup) /* YYDECLARELABEL(yyresume) */ YYDECLARELABEL(yydefault) YYDECLARELABEL(yyreduce) YYDECLARELABEL(yyerrlab) /* here on detecting error */ YYDECLARELABEL(yyerrlab1) /* here on error raised explicitly by an action */ YYDECLARELABEL(yyerrdefault) /* current state does not do anything special for the error token. */ YYDECLARELABEL(yyerrpop) /* pop the current state because it cannot handle the error token */ YYDECLARELABEL(yyerrhandle) YYENDDECLARELABEL /* ALLOCA SIMULATION */ /* __HAVE_NO_ALLOCA */ #ifdef __HAVE_NO_ALLOCA int __alloca_free_ptr(char *ptr,char *ref) {if(ptr!=ref) free(ptr); return 0;} #define __ALLOCA_alloca(size) malloc(size) #define __ALLOCA_free(ptr,ref) __alloca_free_ptr((char *)ptr,(char *)ref) #ifdef YY_SrvParser_LSP_NEEDED #define __ALLOCA_return(num) \ do { return( __ALLOCA_free(yyss,yyssa)+\ __ALLOCA_free(yyvs,yyvsa)+\ __ALLOCA_free(yyls,yylsa)+\ (num)); } while(0) #else #define __ALLOCA_return(num) \ do { return( __ALLOCA_free(yyss,yyssa)+\ __ALLOCA_free(yyvs,yyvsa)+\ (num)); } while(0) #endif #else #define __ALLOCA_return(num) do { return(num); } while(0) #define __ALLOCA_alloca(size) alloca(size) #define __ALLOCA_free(ptr,ref) #endif /* ENDALLOCA SIMULATION */ #define yyerrok (yyerrstatus = 0) #define yyclearin (YY_SrvParser_CHAR = YYEMPTY) #define YYEMPTY -2 #define YYEOF 0 #define YYACCEPT __ALLOCA_return(0) #define YYABORT __ALLOCA_return(1) #define YYERROR YYGOTO(yyerrlab1) /* Like YYERROR except do call yyerror. This remains here temporarily to ease the transition to the new meaning of YYERROR, for GCC. Once GCC version 2 has supplanted version 1, this can go. */ #define YYFAIL YYGOTO(yyerrlab) #define YYRECOVERING() (!!yyerrstatus) #define YYBACKUP(token, value) \ do \ if (YY_SrvParser_CHAR == YYEMPTY && yylen == 1) \ { YY_SrvParser_CHAR = (token), YY_SrvParser_LVAL = (value); \ yychar1 = YYTRANSLATE (YY_SrvParser_CHAR); \ YYPOPSTACK; \ YYGOTO(yybackup); \ } \ else \ { YY_SrvParser_ERROR ("syntax error: cannot back up"); YYERROR; } \ while (0) #define YYTERROR 1 #define YYERRCODE 256 #ifndef YY_SrvParser_PURE /* UNPURE */ #define YYLEX YY_SrvParser_LEX() #ifndef YY_USE_CLASS /* If nonreentrant, and not class , generate the variables here */ int YY_SrvParser_CHAR; /* the lookahead symbol */ YY_SrvParser_STYPE YY_SrvParser_LVAL; /* the semantic value of the */ /* lookahead symbol */ int YY_SrvParser_NERRS; /* number of parse errors so far */ #ifdef YY_SrvParser_LSP_NEEDED YY_SrvParser_LTYPE YY_SrvParser_LLOC; /* location data for the lookahead */ /* symbol */ #endif #endif #else /* PURE */ #ifdef YY_SrvParser_LSP_NEEDED #define YYLEX YY_SrvParser_LEX(&YY_SrvParser_LVAL, &YY_SrvParser_LLOC) #else #define YYLEX YY_SrvParser_LEX(&YY_SrvParser_LVAL) #endif #endif #ifndef YY_USE_CLASS #if YY_SrvParser_DEBUG != 0 int YY_SrvParser_DEBUG_FLAG; /* nonzero means print parse trace */ /* Since this is uninitialized, it does not stop multiple parsers from coexisting. */ #endif #endif /* YYINITDEPTH indicates the initial size of the parser's stacks */ #ifndef YYINITDEPTH #define YYINITDEPTH 200 #endif /* YYMAXDEPTH is the maximum size the stacks can grow to (effective only if the built-in stack extension method is used). */ #if YYMAXDEPTH == 0 #undef YYMAXDEPTH #endif #ifndef YYMAXDEPTH #define YYMAXDEPTH 10000 #endif #if __GNUC__ > 1 /* GNU C and GNU C++ define this. */ #define __yy_bcopy(FROM,TO,COUNT) __builtin_memcpy(TO,FROM,COUNT) #else /* not GNU C or C++ */ /* This is the most reliable way to avoid incompatibilities in available built-in functions on various systems. */ #ifdef __cplusplus static void __yy_bcopy (char *from, char *to, int count) #else #ifdef __STDC__ static void __yy_bcopy (char *from, char *to, int count) #else static void __yy_bcopy (from, to, count) char *from; char *to; int count; #endif #endif { register char *f = from; register char *t = to; register int i = count; while (i-- > 0) *t++ = *f++; } #endif int #ifdef YY_USE_CLASS YY_SrvParser_CLASS:: #endif YY_SrvParser_PARSE(YY_SrvParser_PARSE_PARAM) #ifndef __STDC__ #ifndef __cplusplus #ifndef YY_USE_CLASS /* parameter definition without protypes */ YY_SrvParser_PARSE_PARAM_DEF #endif #endif #endif { register int yystate; register int yyn; register short *yyssp; register YY_SrvParser_STYPE *yyvsp; int yyerrstatus; /* number of tokens to shift before error messages enabled */ int yychar1=0; /* lookahead token as an internal (translated) token number */ short yyssa[YYINITDEPTH]; /* the state stack */ YY_SrvParser_STYPE yyvsa[YYINITDEPTH]; /* the semantic value stack */ short *yyss = yyssa; /* refer to the stacks thru separate pointers */ YY_SrvParser_STYPE *yyvs = yyvsa; /* to allow yyoverflow to reallocate them elsewhere */ #ifdef YY_SrvParser_LSP_NEEDED YY_SrvParser_LTYPE yylsa[YYINITDEPTH]; /* the location stack */ YY_SrvParser_LTYPE *yyls = yylsa; YY_SrvParser_LTYPE *yylsp; #define YYPOPSTACK (yyvsp--, yyssp--, yylsp--) #else #define YYPOPSTACK (yyvsp--, yyssp--) #endif int yystacksize = YYINITDEPTH; #ifdef YY_SrvParser_PURE int YY_SrvParser_CHAR; YY_SrvParser_STYPE YY_SrvParser_LVAL; int YY_SrvParser_NERRS; #ifdef YY_SrvParser_LSP_NEEDED YY_SrvParser_LTYPE YY_SrvParser_LLOC; #endif #endif YY_SrvParser_STYPE yyval; /* the variable used to return */ /* semantic values from the action */ /* routines */ int yylen; /* start loop, in which YYGOTO may be used. */ YYBEGINGOTO #if YY_SrvParser_DEBUG != 0 if (YY_SrvParser_DEBUG_FLAG) fprintf(stderr, "Starting parse\n"); #endif yystate = 0; yyerrstatus = 0; YY_SrvParser_NERRS = 0; YY_SrvParser_CHAR = YYEMPTY; /* Cause a token to be read. */ /* Initialize stack pointers. Waste one element of value and location stack so that they stay on the same level as the state stack. The wasted elements are never initialized. */ yyssp = yyss - 1; yyvsp = yyvs; #ifdef YY_SrvParser_LSP_NEEDED yylsp = yyls; #endif /* Push a new state, which is found in yystate . */ /* In all cases, when you get here, the value and location stacks have just been pushed. so pushing a state here evens the stacks. */ YYLABEL(yynewstate) *++yyssp = yystate; if (yyssp >= yyss + yystacksize - 1) { /* Give user a chance to reallocate the stack */ /* Use copies of these so that the &'s don't force the real ones into memory. */ YY_SrvParser_STYPE *yyvs1 = yyvs; short *yyss1 = yyss; #ifdef YY_SrvParser_LSP_NEEDED YY_SrvParser_LTYPE *yyls1 = yyls; #endif /* Get the current used size of the three stacks, in elements. */ int size = yyssp - yyss + 1; #ifdef yyoverflow /* Each stack pointer address is followed by the size of the data in use in that stack, in bytes. */ #ifdef YY_SrvParser_LSP_NEEDED /* This used to be a conditional around just the two extra args, but that might be undefined if yyoverflow is a macro. */ yyoverflow("parser stack overflow", &yyss1, size * sizeof (*yyssp), &yyvs1, size * sizeof (*yyvsp), &yyls1, size * sizeof (*yylsp), &yystacksize); #else // cppcheck-suppress constStatement yyoverflow("parser stack overflow", &yyss1, size * sizeof (*yyssp), &yyvs1, size * sizeof (*yyvsp), &yystacksize); #endif yyss = yyss1; yyvs = yyvs1; #ifdef YY_SrvParser_LSP_NEEDED yyls = yyls1; #endif #else /* no yyoverflow */ /* Extend the stack our own way. */ if (yystacksize >= YYMAXDEPTH) { YY_SrvParser_ERROR(((char*)"parser stack overflow")); __ALLOCA_return(2); } yystacksize *= 2; if (yystacksize > YYMAXDEPTH) yystacksize = YYMAXDEPTH; yyss = (short *) __ALLOCA_alloca (yystacksize * sizeof (*yyssp)); __yy_bcopy ((char *)yyss1, (char *)yyss, size * sizeof (*yyssp)); __ALLOCA_free(yyss1,yyssa); yyvs = (YY_SrvParser_STYPE *) __ALLOCA_alloca (yystacksize * sizeof (*yyvsp)); __yy_bcopy ((char *)yyvs1, (char *)yyvs, size * sizeof (*yyvsp)); __ALLOCA_free(yyvs1,yyvsa); #ifdef YY_SrvParser_LSP_NEEDED yyls = (YY_SrvParser_LTYPE *) __ALLOCA_alloca (yystacksize * sizeof (*yylsp)); __yy_bcopy ((char *)yyls1, (char *)yyls, size * sizeof (*yylsp)); __ALLOCA_free(yyls1,yylsa); #endif #endif /* no yyoverflow */ yyssp = yyss + size - 1; yyvsp = yyvs + size - 1; #ifdef YY_SrvParser_LSP_NEEDED yylsp = yyls + size - 1; #endif #if YY_SrvParser_DEBUG != 0 if (YY_SrvParser_DEBUG_FLAG) fprintf(stderr, "Stack size increased to %d\n", yystacksize); #endif if (yyssp >= yyss + yystacksize - 1) YYABORT; } #if YY_SrvParser_DEBUG != 0 if (YY_SrvParser_DEBUG_FLAG) fprintf(stderr, "Entering state %d\n", yystate); #endif YYGOTO(yybackup); YYLABEL(yybackup) /* Do appropriate processing given the current state. */ /* Read a lookahead token if we need one and don't already have one. */ /* YYLABEL(yyresume) */ /* First try to decide what to do without reference to lookahead token. */ yyn = yypact[yystate]; if (yyn == YYFLAG) YYGOTO(yydefault); /* Not known => get a lookahead token if don't already have one. */ /* yychar is either YYEMPTY or YYEOF or a valid token in external form. */ if (YY_SrvParser_CHAR == YYEMPTY) { #if YY_SrvParser_DEBUG != 0 if (YY_SrvParser_DEBUG_FLAG) fprintf(stderr, "Reading a token: "); #endif YY_SrvParser_CHAR = YYLEX; } /* Convert token to internal form (in yychar1) for indexing tables with */ if (YY_SrvParser_CHAR <= 0) /* This means end of input. */ { yychar1 = 0; YY_SrvParser_CHAR = YYEOF; /* Don't call YYLEX any more */ #if YY_SrvParser_DEBUG != 0 if (YY_SrvParser_DEBUG_FLAG) fprintf(stderr, "Now at end of input.\n"); #endif } else { yychar1 = YYTRANSLATE(YY_SrvParser_CHAR); #if YY_SrvParser_DEBUG != 0 if (YY_SrvParser_DEBUG_FLAG) { fprintf (stderr, "Next token is %d (%s", YY_SrvParser_CHAR, yytname[yychar1]); /* Give the individual parser a way to print the precise meaning of a token, for further debugging info. */ #ifdef YYPRINT YYPRINT (stderr, YY_SrvParser_CHAR, YY_SrvParser_LVAL); #endif fprintf (stderr, ")\n"); } #endif } yyn += yychar1; if (yyn < 0 || yyn > YYLAST || yycheck[yyn] != yychar1) YYGOTO(yydefault); yyn = yytable[yyn]; /* yyn is what to do for this token type in this state. Negative => reduce, -yyn is rule number. Positive => shift, yyn is new state. New state is final state => don't bother to shift, just return success. 0, or most negative number => error. */ if (yyn < 0) { if (yyn == YYFLAG) YYGOTO(yyerrlab); yyn = -yyn; YYGOTO(yyreduce); } else if (yyn == 0) YYGOTO(yyerrlab); if (yyn == YYFINAL) YYACCEPT; /* Shift the lookahead token. */ #if YY_SrvParser_DEBUG != 0 if (YY_SrvParser_DEBUG_FLAG) fprintf(stderr, "Shifting token %d (%s), ", YY_SrvParser_CHAR, yytname[yychar1]); #endif /* Discard the token being shifted unless it is eof. */ if (YY_SrvParser_CHAR != YYEOF) YY_SrvParser_CHAR = YYEMPTY; *++yyvsp = YY_SrvParser_LVAL; #ifdef YY_SrvParser_LSP_NEEDED *++yylsp = YY_SrvParser_LLOC; #endif /* count tokens shifted since error; after three, turn off error status. */ if (yyerrstatus) yyerrstatus--; yystate = yyn; YYGOTO(yynewstate); /* Do the default action for the current state. */ YYLABEL(yydefault) yyn = yydefact[yystate]; if (yyn == 0) YYGOTO(yyerrlab); /* Do a reduction. yyn is the number of a rule to reduce with. */ YYLABEL(yyreduce) yylen = yyr2[yyn]; if (yylen > 0) yyval = yyvsp[1-yylen]; /* implement default value of the action */ #if YY_SrvParser_DEBUG != 0 if (YY_SrvParser_DEBUG_FLAG) { int i; fprintf (stderr, "Reducing via rule %d (line %d), ", yyn, yyrline[yyn]); /* Print the symbols being reduced, and their result. */ for (i = yyprhs[yyn]; yyrhs[i] > 0; i++) fprintf (stderr, "%s ", yytname[yyrhs[i]]); fprintf (stderr, " -> %s\n", yytname[yyr1[yyn]]); } #endif #line 840 "../bison++/bison.cc" switch (yyn) { case 67: #line 242 "SrvParser.y" { if (!StartIfaceDeclaration(yyvsp[-1].strval)) YYABORT; ; break;} case 68: #line 247 "SrvParser.y" { //Information about new interface has been read //Add it to list of read interfaces delete [] yyvsp[-4].strval; EndIfaceDeclaration(); ; break;} case 69: #line 255 "SrvParser.y" { if (!StartIfaceDeclaration(yyvsp[-1].ival)) YYABORT; ; break;} case 70: #line 260 "SrvParser.y" { EndIfaceDeclaration(); ; break;} case 81: #line 279 "SrvParser.y" { /// this is key object initialization part CurrentKey = new TSIGKey(string(yyvsp[-1].strval)); ; break;} case 82: #line 284 "SrvParser.y" { /// check that both secret and algorithm keywords were defined. Log(Debug) << "Loaded key '" << CurrentKey->Name_ << "', base64len is " << CurrentKey->getBase64Data().length() << ", rawlen is " << CurrentKey->getPackedData().length() << "." << LogEnd; if (CurrentKey->getPackedData().length() == 0) { Log(Crit) << "Key " << CurrentKey->Name_ << " does not have secret specified." << LogEnd; YYABORT; } if ( (CurrentKey->Digest_ != DIGEST_HMAC_MD5) && (CurrentKey->Digest_ != DIGEST_HMAC_SHA1) && (CurrentKey->Digest_ != DIGEST_HMAC_SHA256) ) { Log(Crit) << "Invalid key type specified: only hmac-md5, hmac-sha1 and " << "hmac-sha256 are supported." << LogEnd; YYABORT; } #if !defined(MOD_SRV_DISABLE_DNSUPDATE) && !defined(MOD_CLNT_DISABLE_DNSUPDATE) CfgMgr->addKey( CurrentKey ); #else Log(Crit) << "DNS Update disabled at compilation time. Can't specify TSIG key." << LogEnd; #endif ; break;} case 89: #line 323 "SrvParser.y" { // store the key in base64 encoded form CurrentKey->setData(string(yyvsp[-1].strval)); ; break;} case 90: #line 330 "SrvParser.y" { CurrentKey->Fudge_ = yyvsp[-1].ival; ; break;} case 91: #line 335 "SrvParser.y" { CurrentKey->Digest_ = DIGEST_HMAC_SHA256; ; break;} case 92: #line 336 "SrvParser.y" { CurrentKey->Digest_ = DIGEST_HMAC_SHA1; ; break;} case 93: #line 337 "SrvParser.y" { CurrentKey->Digest_ = DIGEST_HMAC_MD5; ; break;} case 94: #line 343 "SrvParser.y" { ParserOptStack.append(new TSrvParsGlobalOpt()); SPtr duid = new TDUID(yyvsp[-1].duidval.duid,yyvsp[-1].duidval.length); ClientLst.append(new TSrvCfgOptions(duid)); ; break;} case 95: #line 349 "SrvParser.y" { Log(Debug) << "Exception: DUID-based exception specified." << LogEnd; // copy all defined options ClientLst.getLast()->setOptions(ParserOptStack.getLast()); ParserOptStack.delLast(); ; break;} case 96: #line 357 "SrvParser.y" { ParserOptStack.append(new TSrvParsGlobalOpt()); SPtr remoteid = new TOptVendorData(yyvsp[-3].ival, yyvsp[-1].duidval.duid, yyvsp[-1].duidval.length, 0); ClientLst.append(new TSrvCfgOptions(remoteid)); ; break;} case 97: #line 363 "SrvParser.y" { Log(Debug) << "Exception: RemoteID-based exception specified." << LogEnd; // copy all defined options ClientLst.getLast()->setOptions(ParserOptStack.getLast()); ParserOptStack.delLast(); ; break;} case 98: #line 371 "SrvParser.y" { ParserOptStack.append(new TSrvParsGlobalOpt()); SPtr clntaddr = new TIPv6Addr(yyvsp[-1].addrval); ClientLst.append(new TSrvCfgOptions(clntaddr)); ; break;} case 99: #line 377 "SrvParser.y" { Log(Debug) << "Exception: Link-local-based exception specified." << LogEnd; // copy all defined options ClientLst.getLast()->setOptions(ParserOptStack.getLast()); ParserOptStack.delLast(); ; break;} case 118: #line 410 "SrvParser.y" { addr = new TIPv6Addr(yyvsp[0].addrval); Log(Info) << "Exception: Address " << addr->getPlain() << " reserved." << LogEnd; ClientLst.getLast()->setAddr(addr); ; break;} case 119: #line 418 "SrvParser.y" { addr = new TIPv6Addr(yyvsp[-2].addrval); Log(Info) << "Exception: Prefix " << addr->getPlain() << "/" << yyvsp[0].ival << " reserved." << LogEnd; ClientLst.getLast()->setPrefix(addr, yyvsp[0].ival); ; break;} case 120: #line 427 "SrvParser.y" { StartClassDeclaration(); ; break;} case 121: #line 431 "SrvParser.y" { if (!EndClassDeclaration()) YYABORT; ; break;} case 124: #line 445 "SrvParser.y" { StartTAClassDeclaration(); ; break;} case 125: #line 448 "SrvParser.y" { if (!EndTAClassDeclaration()) YYABORT; ; break;} case 136: #line 472 "SrvParser.y" { StartPDDeclaration(); ; break;} case 137: #line 475 "SrvParser.y" { if (!EndPDDeclaration()) YYABORT; ; break;} case 148: #line 502 "SrvParser.y" { SPtr routerAddr = new TIPv6Addr(yyvsp[-1].addrval); SPtr myNextHop = new TOptAddr(OPTION_NEXT_HOP, routerAddr, NULL); nextHop = myNextHop; ; break;} case 149: #line 508 "SrvParser.y" { ParserOptStack.getLast()->addExtraOption(nextHop, false); nextHop.reset(); ; break;} case 150: #line 513 "SrvParser.y" { SPtr routerAddr = new TIPv6Addr(yyvsp[0].addrval); SPtr myNextHop = new TOptAddr(OPTION_NEXT_HOP, routerAddr, NULL); ParserOptStack.getLast()->addExtraOption(myNextHop, false); ; break;} case 153: #line 527 "SrvParser.y" { SPtr prefix = new TIPv6Addr(yyvsp[-4].addrval); SPtr rtPrefix = new TOptRtPrefix(yyvsp[0].ival, yyvsp[-2].ival, 42, prefix, NULL); if (nextHop) nextHop->addOption(rtPrefix); else ParserOptStack.getLast()->addExtraOption(rtPrefix, false); ; break;} case 154: #line 536 "SrvParser.y" { SPtr prefix = new TIPv6Addr(yyvsp[-2].addrval); SPtr rtPrefix = new TOptRtPrefix(DHCPV6_INFINITY, yyvsp[0].ival, 42, prefix, NULL); if (nextHop) nextHop->addOption(rtPrefix); else ParserOptStack.getLast()->addExtraOption(rtPrefix, false); ; break;} case 155: #line 545 "SrvParser.y" { SPtr prefix = new TIPv6Addr(yyvsp[-4].addrval); SPtr rtPrefix = new TOptRtPrefix(DHCPV6_INFINITY, yyvsp[-2].ival, 42, prefix, NULL); if (nextHop) nextHop->addOption(rtPrefix); else ParserOptStack.getLast()->addExtraOption(rtPrefix, false); ; break;} case 156: #line 555 "SrvParser.y" { #ifndef MOD_DISABLE_AUTH if (!strcasecmp(yyvsp[0].strval,"none")) { CfgMgr->setAuthProtocol(AUTH_PROTO_NONE); CfgMgr->setAuthAlgorithm(AUTH_ALGORITHM_NONE); } else if (!strcasecmp(yyvsp[0].strval, "delayed")) { CfgMgr->setAuthProtocol(AUTH_PROTO_DELAYED); } else if (!strcasecmp(yyvsp[0].strval, "reconfigure-key")) { CfgMgr->setAuthProtocol(AUTH_PROTO_RECONFIGURE_KEY); CfgMgr->setAuthAlgorithm(AUTH_ALGORITHM_RECONFIGURE_KEY); } else if (!strcasecmp(yyvsp[0].strval, "dibbler")) { CfgMgr->setAuthProtocol(AUTH_PROTO_DIBBLER); } else { Log(Crit) << "Invalid auth-protocol parameter: " << string(yyvsp[0].strval) << LogEnd; YYABORT; } #else Log(Crit) << "Auth support disabled at compilation time." << LogEnd; #endif ; break;} case 157: #line 578 "SrvParser.y" { Log(Crit) << "auth-algorithm secification is not supported yet." << LogEnd; YYABORT; ; break;} case 158: #line 584 "SrvParser.y" { #ifndef MOD_DISABLE_AUTH if (strcasecmp(yyvsp[0].strval, "none")) { CfgMgr->setAuthReplay(AUTH_REPLAY_NONE); } else if (strcasecmp(yyvsp[0].strval, "monotonic")) { CfgMgr->setAuthReplay(AUTH_REPLAY_MONOTONIC); } else { Log(Crit) << "Invalid auth-replay parameter: " << string(yyvsp[0].strval) << LogEnd; YYABORT; } #else Log(Crit) << "Auth support disabled at compilation time." << LogEnd; #endif ; break;} case 159: #line 602 "SrvParser.y" { #ifndef MOD_DISABLE_AUTH CfgMgr->setAuthRealm(std::string(yyvsp[0].strval)); #else Log(Crit) << "Auth support disabled at compilation time." << LogEnd; #endif ; break;} case 160: #line 612 "SrvParser.y" { DigestLst.clear(); ; break;} case 161: #line 614 "SrvParser.y" { #ifndef MOD_DISABLE_AUTH CfgMgr->setAuthDigests(DigestLst); CfgMgr->setAuthDropUnauthenticated(true); DigestLst.clear(); #else Log(Crit) << "Auth support disabled at compilation time." << LogEnd; #endif ; break;} case 164: #line 630 "SrvParser.y" { DigestLst.push_back(DIGEST_NONE); ; break;} case 165: #line 631 "SrvParser.y" { DigestLst.push_back(DIGEST_PLAIN); ; break;} case 166: #line 632 "SrvParser.y" { DigestLst.push_back(DIGEST_HMAC_MD5); ; break;} case 167: #line 633 "SrvParser.y" { DigestLst.push_back(DIGEST_HMAC_SHA1); ; break;} case 168: #line 634 "SrvParser.y" { DigestLst.push_back(DIGEST_HMAC_SHA224); ; break;} case 169: #line 635 "SrvParser.y" { DigestLst.push_back(DIGEST_HMAC_SHA256); ; break;} case 170: #line 636 "SrvParser.y" { DigestLst.push_back(DIGEST_HMAC_SHA384); ; break;} case 171: #line 637 "SrvParser.y" { DigestLst.push_back(DIGEST_HMAC_SHA512); ; break;} case 172: #line 642 "SrvParser.y" { #ifndef MOD_DISABLE_AUTH CfgMgr->setAuthDropUnauthenticated(yyvsp[0].ival); #else Log(Crit) << "Auth support disabled at compilation time." << LogEnd; #endif ; break;} case 173: #line 660 "SrvParser.y" { Log(Notice)<< "FQDN: The client "<getPlain()<getPlain() << LogEnd; PresentFQDNLst.append(new TFQDN( duidNew, yyvsp[-2].strval,false)); ; break;} case 178: #line 689 "SrvParser.y" { addr = new TIPv6Addr(yyvsp[0].addrval); Log(Debug)<< "FQDN:" << yyvsp[-2].strval<<" reserved for address "<< addr->getPlain() << LogEnd; PresentFQDNLst.append(new TFQDN(new TIPv6Addr(yyvsp[0].addrval), yyvsp[-2].strval,false)); ; break;} case 179: #line 697 "SrvParser.y" {yyval.ival=yyvsp[0].ival;; break;} case 180: #line 698 "SrvParser.y" {yyval.ival=yyvsp[0].ival;; break;} case 181: #line 703 "SrvParser.y" { PresentAddrLst.append(new TIPv6Addr(yyvsp[0].addrval)); ; break;} case 182: #line 707 "SrvParser.y" { PresentAddrLst.append(new TIPv6Addr(yyvsp[0].addrval)); ; break;} case 183: #line 714 "SrvParser.y" { Log(Debug) << "Vendor-spec defined: Enterprise: " << yyvsp[-4].ival << ", optionCode: " << yyvsp[-2].ival << ", valuelen=" << yyvsp[0].duidval.length << LogEnd; ParserOptStack.getLast()->addExtraOption(new TOptVendorSpecInfo(OPTION_VENDOR_OPTS, yyvsp[-4].ival, yyvsp[-2].ival, yyvsp[0].duidval.duid, yyvsp[0].duidval.length, 0), false); ; break;} case 184: #line 722 "SrvParser.y" { SPtr addr(new TIPv6Addr(yyvsp[0].addrval)); Log(Debug) << "Vendor-spec defined: Enterprise: " << yyvsp[-4].ival << ", optionCode: " << yyvsp[-2].ival << ", value=" << addr->getPlain() << LogEnd; ParserOptStack.getLast()->addExtraOption(new TOptVendorSpecInfo(OPTION_VENDOR_OPTS, yyvsp[-4].ival, yyvsp[-2].ival, new TIPv6Addr(yyvsp[0].addrval), 0), false); ; break;} case 185: #line 730 "SrvParser.y" { Log(Debug) << "Vendor-spec defined: Enterprise: " << yyvsp[-4].ival << ", optionCode: " << yyvsp[-2].ival << ", valuelen=" << strlen(yyvsp[0].strval) << LogEnd; ParserOptStack.getLast()->addExtraOption(new TOptVendorSpecInfo(OPTION_VENDOR_OPTS, yyvsp[-4].ival, yyvsp[-2].ival, yyvsp[0].strval, 0), false); ; break;} case 186: #line 738 "SrvParser.y" { Log(Debug) << "Vendor-spec defined: Enterprise: " << yyvsp[-4].ival << ", optionCode: " << yyvsp[-2].ival << ", valuelen=" << yyvsp[0].duidval.length << LogEnd; ParserOptStack.getLast()->addExtraOption(new TOptVendorSpecInfo(OPTION_VENDOR_OPTS, yyvsp[-4].ival, yyvsp[-2].ival, yyvsp[0].duidval.duid, yyvsp[0].duidval.length, 0), false); ; break;} case 187: #line 745 "SrvParser.y" { SPtr addr(new TIPv6Addr(yyvsp[0].addrval)); Log(Debug) << "Vendor-spec defined: Enterprise: " << yyvsp[-4].ival << ", optionCode: " << yyvsp[-2].ival << ", value=" << addr->getPlain() << LogEnd; ParserOptStack.getLast()->addExtraOption(new TOptVendorSpecInfo(OPTION_VENDOR_OPTS, yyvsp[-4].ival, yyvsp[-2].ival, addr, 0), false); ; break;} case 188: #line 753 "SrvParser.y" { Log(Debug) << "Vendor-spec defined: Enterprise: " << yyvsp[-4].ival << ", optionCode: " << yyvsp[-2].ival << ", valuelen=" << strlen(yyvsp[0].strval) << LogEnd; ParserOptStack.getLast()->addExtraOption(new TOptVendorSpecInfo(OPTION_VENDOR_OPTS, yyvsp[-4].ival, yyvsp[-2].ival, yyvsp[0].strval, 0), false); ; break;} case 189: #line 762 "SrvParser.y" { PresentStringLst.append(SPtr (new string(yyvsp[0].strval))); ; break;} case 190: #line 763 "SrvParser.y" { PresentStringLst.append(SPtr (new string(yyvsp[0].strval))); ; break;} case 191: #line 768 "SrvParser.y" { PresentRangeLst.append(new THostRange(new TIPv6Addr(yyvsp[0].addrval),new TIPv6Addr(yyvsp[0].addrval))); ; break;} case 192: #line 772 "SrvParser.y" { SPtr addr1(new TIPv6Addr(yyvsp[-2].addrval)); SPtr addr2(new TIPv6Addr(yyvsp[0].addrval)); if (*addr1<=*addr2) PresentRangeLst.append(new THostRange(addr1,addr2)); else PresentRangeLst.append(new THostRange(addr2,addr1)); ; break;} case 193: #line 781 "SrvParser.y" { SPtr addr(new TIPv6Addr(yyvsp[-2].addrval)); int prefix = yyvsp[0].ival; if ( (prefix<1) || (prefix>128)) { Log(Crit) << "Invalid prefix defined: " << prefix << " in line " << lex->lineno() << ". Allowed range: 1..128." << LogEnd; YYABORT; } SPtr addr1 = this->getRangeMin(yyvsp[-2].addrval, prefix); SPtr addr2 = this->getRangeMax(yyvsp[-2].addrval, prefix); if (*addr1<=*addr2) PresentRangeLst.append(new THostRange(addr1,addr2)); else PresentRangeLst.append(new THostRange(addr2,addr1)); ; break;} case 194: #line 797 "SrvParser.y" { PresentRangeLst.append(new THostRange(new TIPv6Addr(yyvsp[0].addrval),new TIPv6Addr(yyvsp[0].addrval))); ; break;} case 195: #line 801 "SrvParser.y" { SPtr addr1(new TIPv6Addr(yyvsp[-2].addrval)); SPtr addr2(new TIPv6Addr(yyvsp[0].addrval)); if (*addr1<=*addr2) PresentRangeLst.append(new THostRange(addr1,addr2)); else PresentRangeLst.append(new THostRange(addr2,addr1)); ; break;} case 196: #line 813 "SrvParser.y" { SPtr addr(new TIPv6Addr(yyvsp[-2].addrval)); int prefix = yyvsp[0].ival; if ( (prefix<1) || (prefix>128)) { Log(Crit) << "Invalid prefix defined: " << prefix << " in line " << lex->lineno() << ". Allowed range: 1..128." << LogEnd; YYABORT; } SPtr addr1 = this->getRangeMin(yyvsp[-2].addrval, prefix); SPtr addr2 = this->getRangeMax(yyvsp[-2].addrval, prefix); SPtr range; if (*addr1<=*addr2) range = new THostRange(addr1,addr2); else range = new THostRange(addr2,addr1); range->setPrefixLength(prefix); PDLst.append(range); ; break;} case 197: #line 836 "SrvParser.y" { PresentRangeLst.append(new THostRange(new TIPv6Addr(yyvsp[0].addrval),new TIPv6Addr(yyvsp[0].addrval))); ; break;} case 198: #line 840 "SrvParser.y" { SPtr addr1(new TIPv6Addr(yyvsp[-2].addrval)); SPtr addr2(new TIPv6Addr(yyvsp[0].addrval)); if (*addr1<=*addr2) PresentRangeLst.append(new THostRange(addr1,addr2)); else PresentRangeLst.append(new THostRange(addr2,addr1)); ; break;} case 199: #line 849 "SrvParser.y" { PresentRangeLst.append(new THostRange(new TIPv6Addr(yyvsp[0].addrval),new TIPv6Addr(yyvsp[0].addrval))); ; break;} case 200: #line 853 "SrvParser.y" { SPtr addr1(new TIPv6Addr(yyvsp[-2].addrval)); SPtr addr2(new TIPv6Addr(yyvsp[0].addrval)); if (*addr1<=*addr2) PresentRangeLst.append(new THostRange(addr1,addr2)); else PresentRangeLst.append(new THostRange(addr2,addr1)); ; break;} case 201: #line 862 "SrvParser.y" { SPtr duid(new TDUID(yyvsp[0].duidval.duid, yyvsp[0].duidval.length)); PresentRangeLst.append(new THostRange(duid, duid)); delete yyvsp[0].duidval.duid; ; break;} case 202: #line 868 "SrvParser.y" { SPtr duid1(new TDUID(yyvsp[-2].duidval.duid,yyvsp[-2].duidval.length)); SPtr duid2(new TDUID(yyvsp[0].duidval.duid,yyvsp[0].duidval.length)); if (*duid1<=*duid2) PresentRangeLst.append(new THostRange(duid1,duid2)); else PresentRangeLst.append(new THostRange(duid2,duid1)); /// @todo: delete [] $1.duid; delete [] $3.duid? ; break;} case 203: #line 880 "SrvParser.y" { SPtr duid(new TDUID(yyvsp[0].duidval.duid, yyvsp[0].duidval.length)); PresentRangeLst.append(new THostRange(duid, duid)); delete yyvsp[0].duidval.duid; ; break;} case 204: #line 886 "SrvParser.y" { SPtr duid2(new TDUID(yyvsp[-2].duidval.duid,yyvsp[-2].duidval.length)); SPtr duid1(new TDUID(yyvsp[0].duidval.duid,yyvsp[0].duidval.length)); if (*duid1<=*duid2) PresentRangeLst.append(new THostRange(duid1,duid2)); else PresentRangeLst.append(new THostRange(duid2,duid1)); delete yyvsp[-2].duidval.duid; delete yyvsp[0].duidval.duid; ; break;} case 205: #line 900 "SrvParser.y" { PresentRangeLst.clear(); ; break;} case 206: #line 903 "SrvParser.y" { ParserOptStack.getLast()->setRejedClnt(&PresentRangeLst); ; break;} case 207: #line 910 "SrvParser.y" { PresentRangeLst.clear(); ; break;} case 208: #line 913 "SrvParser.y" { ParserOptStack.getLast()->setAcceptClnt(&PresentRangeLst); ; break;} case 209: #line 920 "SrvParser.y" { PresentRangeLst.clear(); ; break;} case 210: #line 923 "SrvParser.y" { ParserOptStack.getLast()->setPool(&PresentRangeLst); ; break;} case 211: #line 930 "SrvParser.y" { ; break;} case 212: #line 932 "SrvParser.y" { ParserOptStack.getLast()->setPool(&PresentRangeLst/*PDList*/); ; break;} case 213: #line 938 "SrvParser.y" { if ( ((yyvsp[0].ival) > 128) || ((yyvsp[0].ival) < 1) ) { Log(Crit) << "Invalid pd-length:" << yyvsp[0].ival << ", allowed range is 1..128." << LogEnd; YYABORT; } this->PDPrefix = yyvsp[0].ival; ; break;} case 214: #line 950 "SrvParser.y" { ParserOptStack.getLast()->setPrefBeg(yyvsp[0].ival); ParserOptStack.getLast()->setPrefEnd(yyvsp[0].ival); ; break;} case 215: #line 955 "SrvParser.y" { ParserOptStack.getLast()->setPrefBeg(yyvsp[-2].ival); ParserOptStack.getLast()->setPrefEnd(yyvsp[0].ival); ; break;} case 216: #line 963 "SrvParser.y" { ParserOptStack.getLast()->setValidBeg(yyvsp[0].ival); ParserOptStack.getLast()->setValidEnd(yyvsp[0].ival); ; break;} case 217: #line 968 "SrvParser.y" { ParserOptStack.getLast()->setValidBeg(yyvsp[-2].ival); ParserOptStack.getLast()->setValidEnd(yyvsp[0].ival); ; break;} case 218: #line 976 "SrvParser.y" { int x=yyvsp[0].ival; if ( (x<1) || (x>1000)) { Log(Crit) << "Invalid share value: " << x << " in line " << lex->lineno() << ". Allowed range: 1..1000." << LogEnd; YYABORT; } ParserOptStack.getLast()->setShare(x); ; break;} case 219: #line 988 "SrvParser.y" { ParserOptStack.getLast()->setT1Beg(yyvsp[0].ival); ParserOptStack.getLast()->setT1End(yyvsp[0].ival); ; break;} case 220: #line 993 "SrvParser.y" { ParserOptStack.getLast()->setT1Beg(yyvsp[-2].ival); ParserOptStack.getLast()->setT1End(yyvsp[0].ival); ; break;} case 221: #line 1001 "SrvParser.y" { ParserOptStack.getLast()->setT2Beg(yyvsp[0].ival); ParserOptStack.getLast()->setT2End(yyvsp[0].ival); ; break;} case 222: #line 1006 "SrvParser.y" { ParserOptStack.getLast()->setT2Beg(yyvsp[-2].ival); ParserOptStack.getLast()->setT2End(yyvsp[0].ival); ; break;} case 223: #line 1014 "SrvParser.y" { ParserOptStack.getLast()->setClntMaxLease(yyvsp[0].ival); ; break;} case 224: #line 1021 "SrvParser.y" { ParserOptStack.getLast()->setClassMaxLease(yyvsp[0].ival); ; break;} case 225: #line 1028 "SrvParser.y" { if (!ParserOptStack.getLast()->getExperimental()) { Log(Crit) << "Experimental 'addr-params' defined, but experimental " << "features are disabled. Add 'experimental' " << "in global section of server.conf to enable it." << LogEnd; YYABORT; } int bitfield = ADDRPARAMS_MASK_PREFIX; Log(Warning) << "Experimental addr-params added (prefix=" << yyvsp[0].ival << ", bitfield=" << bitfield << ")." << LogEnd; ParserOptStack.getLast()->setAddrParams(yyvsp[0].ival,bitfield); ; break;} case 226: #line 1043 "SrvParser.y" { SPtr tunnelName = new TOptDomainLst(OPTION_AFTR_NAME, yyvsp[0].strval, 0); Log(Debug) << "Enabling DS-Lite tunnel option, AFTR name=" << yyvsp[0].strval << LogEnd; ParserOptStack.getLast()->addExtraOption(tunnelName, false); ; break;} case 227: #line 1051 "SrvParser.y" { SPtr opt = new TOptGeneric(yyvsp[-2].ival, yyvsp[0].duidval.duid, yyvsp[0].duidval.length, 0); ParserOptStack.getLast()->addExtraOption(opt, false); Log(Debug) << "Extra option defined: code=" << yyvsp[-2].ival << ", length=" << yyvsp[0].duidval.length << LogEnd; ; break;} case 228: #line 1058 "SrvParser.y" { SPtr addr(new TIPv6Addr(yyvsp[0].addrval)); SPtr opt = new TOptAddr(yyvsp[-2].ival, addr, 0); ParserOptStack.getLast()->addExtraOption(opt, false); Log(Debug) << "Extra option defined: code=" << yyvsp[-2].ival << ", address=" << addr->getPlain() << LogEnd; ; break;} case 229: #line 1066 "SrvParser.y" { PresentAddrLst.clear(); ; break;} case 230: #line 1069 "SrvParser.y" { SPtr opt = new TOptAddrLst(yyvsp[-3].ival, PresentAddrLst, 0); ParserOptStack.getLast()->addExtraOption(opt, false); Log(Debug) << "Extra option defined: code=" << yyvsp[-3].ival << ", address count=" << PresentAddrLst.count() << LogEnd; ; break;} case 231: #line 1076 "SrvParser.y" { SPtr opt = new TOptString(yyvsp[-2].ival, string(yyvsp[0].strval), 0); ParserOptStack.getLast()->addExtraOption(opt, false); Log(Debug) << "Extra option defined: code=" << yyvsp[-2].ival << ", string=" << yyvsp[0].strval << LogEnd; ; break;} case 232: #line 1084 "SrvParser.y" { if (!ParserOptStack.getLast()->getExperimental()) { Log(Crit) << "Experimental 'remote autoconf neighbors' defined, but " << "experimental features are disabled. Add 'experimental' " << "in global section of server.conf to enable it." << LogEnd; YYABORT; } PresentAddrLst.clear(); ; break;} case 233: #line 1094 "SrvParser.y" { SPtr opt = new TOptAddrLst(OPTION_NEIGHBORS, PresentAddrLst, 0); ParserOptStack.getLast()->addExtraOption(opt, false); Log(Debug) << "Remote autoconf neighbors enabled (" << PresentAddrLst.count() << " neighbors defined.)" << LogEnd; ; break;} case 234: #line 1104 "SrvParser.y" { ParserOptStack.getLast()->setIfaceMaxLease(yyvsp[0].ival); ; break;} case 235: #line 1111 "SrvParser.y" { ParserOptStack.getLast()->setUnicast(new TIPv6Addr(yyvsp[0].addrval)); ; break;} case 236: #line 1118 "SrvParser.y" { CfgMgr->dropUnicast(true); ; break;} case 237: #line 1124 "SrvParser.y" { if ( (yyvsp[0].ival!=0) && (yyvsp[0].ival!=1)) { Log(Crit) << "RAPID-COMMIT parameter in line " << lex->lineno() << " must have 0 or 1 value." << LogEnd; YYABORT; } if (yyvsp[0].ival==1) ParserOptStack.getLast()->setRapidCommit(true); else ParserOptStack.getLast()->setRapidCommit(false); ; break;} case 238: #line 1139 "SrvParser.y" { if ((yyvsp[0].ival<0)||(yyvsp[0].ival>255)) { Log(Crit) << "Preference value (" << yyvsp[0].ival << ") in line " << lex->lineno() << " is out of range [0..255]." << LogEnd; YYABORT; } ParserOptStack.getLast()->setPreference(yyvsp[0].ival); ; break;} case 239: #line 1150 "SrvParser.y" { logger::setLogLevel(yyvsp[0].ival); ; break;} case 240: #line 1156 "SrvParser.y" { logger::setLogMode(yyvsp[0].strval); ; break;} case 241: #line 1162 "SrvParser.y" { logger::setLogName(yyvsp[0].strval); ; break;} case 242: #line 1169 "SrvParser.y" { logger::setColors(yyvsp[0].ival==1); ; break;} case 243: #line 1175 "SrvParser.y" { ParserOptStack.getLast()->setWorkDir(yyvsp[0].strval); ; break;} case 244: #line 1182 "SrvParser.y" { ParserOptStack.getLast()->setStateless(true); ; break;} case 245: #line 1189 "SrvParser.y" { Log(Info) << "Guess-mode enabled: relay interfaces may be loosely " << "defined (matching interface-id is not mandatory)." << LogEnd; ParserOptStack.getLast()->setGuessMode(true); ; break;} case 246: #line 1197 "SrvParser.y" { CfgMgr->setScriptName(yyvsp[0].strval); ; break;} case 247: #line 1203 "SrvParser.y" { if (!ParserOptStack.getLast()->getExperimental()) { Log(Crit) << "Experimental 'performance-mode' defined, but experimental " << "features are disabled. Add 'experimental' " << "in global section of server.conf to enable it." << LogEnd; YYABORT; } CfgMgr->setPerformanceMode(yyvsp[0].ival); ; break;} case 248: #line 1216 "SrvParser.y" { switch (yyvsp[0].ival) { case 0: case 1: CfgMgr->setReconfigureSupport(yyvsp[0].ival); break; default: Log(Crit) << "Invalid reconfigure-enabled value " << yyvsp[0].ival << ", only 0 and 1 are supported." << LogEnd; YYABORT; } ; break;} case 249: #line 1232 "SrvParser.y" { ParserOptStack.getLast()->setInactiveMode(true); ; break;} case 250: #line 1238 "SrvParser.y" { Log(Crit) << "Experimental features are allowed." << LogEnd; ParserOptStack.getLast()->setExperimental(true); ; break;} case 251: #line 1245 "SrvParser.y" { if (!strncasecmp(yyvsp[0].strval,"before",6)) { ParserOptStack.getLast()->setInterfaceIDOrder(SRV_IFACE_ID_ORDER_BEFORE); } else if (!strncasecmp(yyvsp[0].strval,"after",5)) { ParserOptStack.getLast()->setInterfaceIDOrder(SRV_IFACE_ID_ORDER_AFTER); } else if (!strncasecmp(yyvsp[0].strval,"omit",4)) { ParserOptStack.getLast()->setInterfaceIDOrder(SRV_IFACE_ID_ORDER_NONE); } else { Log(Crit) << "Invalid interface-id-order specified. Allowed " << "values: before, after, omit" << LogEnd; YYABORT; } ; break;} case 252: #line 1267 "SrvParser.y" { ParserOptStack.getLast()->setCacheSize(yyvsp[0].ival); ; break;} case 253: #line 1278 "SrvParser.y" { ParserOptStack.getLast()->setLeaseQuerySupport(true); ; break;} case 254: #line 1283 "SrvParser.y" { switch (yyvsp[0].ival) { case 0: ParserOptStack.getLast()->setLeaseQuerySupport(false); break; case 1: ParserOptStack.getLast()->setLeaseQuerySupport(true); break; default: Log(Crit) << "Invalid value of accept-leasequery specifed. Allowed " << "values: 0, 1, yes, no, true, false" << LogEnd; YYABORT; } ; break;} case 255: #line 1300 "SrvParser.y" { if (yyvsp[0].ival!=0 && yyvsp[0].ival!=1) { Log(Error) << "Invalid bulk-leasequery-accept value: " << (yyvsp[0].ival) << ", 0 or 1 expected." << LogEnd; YYABORT; } CfgMgr->bulkLQAccept( (bool) yyvsp[0].ival); ; break;} case 256: #line 1311 "SrvParser.y" { CfgMgr->bulkLQTcpPort( yyvsp[0].ival ); ; break;} case 257: #line 1317 "SrvParser.y" { CfgMgr->bulkLQMaxConns( yyvsp[0].ival ); ; break;} case 258: #line 1323 "SrvParser.y" { CfgMgr->bulkLQTimeout( yyvsp[0].ival ); ; break;} case 259: #line 1332 "SrvParser.y" { ParserOptStack.getLast()->setRelayName(yyvsp[0].strval); ; break;} case 260: #line 1336 "SrvParser.y" { ParserOptStack.getLast()->setRelayID(yyvsp[0].ival); ; break;} case 261: #line 1343 "SrvParser.y" { SPtr id = new TSrvOptInterfaceID(yyvsp[0].ival, 0); ParserOptStack.getLast()->setRelayInterfaceID(id); ; break;} case 262: #line 1348 "SrvParser.y" { SPtr id = new TSrvOptInterfaceID(yyvsp[0].duidval.duid, yyvsp[0].duidval.length, 0); ParserOptStack.getLast()->setRelayInterfaceID(id); ; break;} case 263: #line 1353 "SrvParser.y" { SPtr id = new TSrvOptInterfaceID(yyvsp[0].strval, strlen(yyvsp[0].strval), 0); ParserOptStack.getLast()->setRelayInterfaceID(id); ; break;} case 264: #line 1361 "SrvParser.y" { int prefix = yyvsp[0].ival; if ( (prefix<1) || (prefix>128) ) { Log(Crit) << "Invalid (1..128 allowed) prefix used: " << prefix << " in subnet definition in line " << lex->lineno() << LogEnd; YYABORT; } SPtr min = getRangeMin(yyvsp[-2].addrval, prefix); SPtr max = getRangeMax(yyvsp[-2].addrval, prefix); SrvCfgIfaceLst.getLast()->addSubnet(min, max); Log(Debug) << "Defined subnet " << min->getPlain() << "/" << yyvsp[0].ival << " on " << SrvCfgIfaceLst.getLast()->getFullName() << LogEnd; ; break;} case 265: #line 1374 "SrvParser.y" { SPtr min = new TIPv6Addr(yyvsp[-2].addrval); SPtr max = new TIPv6Addr(yyvsp[0].addrval); SrvCfgIfaceLst.getLast()->addSubnet(min, max); Log(Debug) << "Defined subnet " << min->getPlain() << "-" << max->getPlain() << "on " << SrvCfgIfaceLst.getLast()->getFullName() << LogEnd; ; break;} case 278: #line 1399 "SrvParser.y" { SPtr clntClass; bool found = false; SrvCfgClientClassLst.first(); while (clntClass = SrvCfgClientClassLst.get()) { if (clntClass->getClassName() == string(yyvsp[0].strval)) found = true; } if (!found) { Log(Crit) << "Line " << lex->lineno() << ": Unable to use class " << string(yyvsp[0].strval) << ", no such class defined." << LogEnd; YYABORT; } ParserOptStack.getLast()->setAllowClientClass(string(yyvsp[0].strval)); int deny = ParserOptStack.getLast()->getDenyClientClassString().count(); if (deny) { Log(Crit) << "Line " << lex->lineno() << ": Unable to define both allow and deny lists for this client class." << LogEnd; YYABORT; } ; break;} case 279: #line 1428 "SrvParser.y" { SPtr clntClass; bool found = false; SrvCfgClientClassLst.first(); while (clntClass = SrvCfgClientClassLst.get()) { if (clntClass->getClassName() == string(yyvsp[0].strval)) found = true; } if (!found) { Log(Crit) << "Line " << lex->lineno() << ": Unable to use class " << string(yyvsp[0].strval) << ", no such class defined." << LogEnd; YYABORT; } ParserOptStack.getLast()->setDenyClientClass(string(yyvsp[0].strval)); int allow = ParserOptStack.getLast()->getAllowClientClassString().count(); if (allow) { Log(Crit) << "Line " << lex->lineno() << ": Unable to define both allow and deny lists for this client class." << LogEnd; YYABORT; } ; break;} case 280: #line 1461 "SrvParser.y" { PresentAddrLst.clear(); ; break;} case 281: #line 1464 "SrvParser.y" { SPtr nis_servers = new TOptAddrLst(OPTION_DNS_SERVERS, PresentAddrLst, NULL); ParserOptStack.getLast()->addExtraOption(nis_servers, false); ; break;} case 282: #line 1474 "SrvParser.y" { PresentStringLst.clear(); ; break;} case 283: #line 1477 "SrvParser.y" { SPtr domains = new TOptDomainLst(OPTION_DOMAIN_LIST, PresentStringLst, NULL); ParserOptStack.getLast()->addExtraOption(domains, false); ; break;} case 284: #line 1488 "SrvParser.y" { PresentAddrLst.clear(); ; break;} case 285: #line 1491 "SrvParser.y" { SPtr ntp_servers = new TOptAddrLst(OPTION_SNTP_SERVERS, PresentAddrLst, NULL); ParserOptStack.getLast()->addExtraOption(ntp_servers, false); // ParserOptStack.getLast()->setNTPServerLst(&PresentAddrLst); ; break;} case 286: #line 1503 "SrvParser.y" { SPtr timezone = new TOptString(OPTION_NEW_TZDB_TIMEZONE, string(yyvsp[0].strval), NULL); ParserOptStack.getLast()->addExtraOption(timezone, false); // ParserOptStack.getLast()->setTimezone($3); ; break;} case 287: #line 1514 "SrvParser.y" { PresentAddrLst.clear(); ; break;} case 288: #line 1517 "SrvParser.y" { SPtr sip_servers = new TOptAddrLst(OPTION_SIP_SERVER_A, PresentAddrLst, NULL); ParserOptStack.getLast()->addExtraOption(sip_servers, false); // ParserOptStack.getLast()->setSIPServerLst(&PresentAddrLst); ; break;} case 289: #line 1528 "SrvParser.y" { PresentStringLst.clear(); ; break;} case 290: #line 1531 "SrvParser.y" { SPtr sip_domains = new TOptDomainLst(OPTION_SIP_SERVER_D, PresentStringLst, NULL); ParserOptStack.getLast()->addExtraOption(sip_domains, false); //ParserOptStack.getLast()->setSIPDomainLst(&PresentStringLst); ; break;} case 291: #line 1544 "SrvParser.y" { PresentFQDNLst.clear(); Log(Debug) << "No FQDNMode found, setting default mode 2 (all updates " "executed by server)." << LogEnd; Log(Warning) << "revDNS zoneroot lenght not found, dynamic revDNS update " "will not be possible." << LogEnd; ParserOptStack.getLast()->setFQDNMode(2); ParserOptStack.getLast()->setRevDNSZoneRootLength(0); ; break;} case 292: #line 1553 "SrvParser.y" { ParserOptStack.getLast()->setFQDNLst(&PresentFQDNLst); ; break;} case 293: #line 1557 "SrvParser.y" { PresentFQDNLst.clear(); Log(Debug) << "FQDN: Setting update mode to " << yyvsp[0].ival; switch (yyvsp[0].ival) { case 0: Log(Cont) << "(no updates)" << LogEnd; break; case 1: Log(Cont) << "(client will update AAAA, server will update PTR)" << LogEnd; break; case 2: Log(Cont) << "(server will update both AAAA and PTR)" << LogEnd; break; default: Log(Cont) << LogEnd; Log(Crit) << "FQDN: Invalid mode. Only 0-2 are supported." << LogEnd; YYABORT; } Log(Warning)<< "FQDN: RevDNS zoneroot lenght not specified, dynamic revDNS update will not be possible." << LogEnd; ParserOptStack.getLast()->setFQDNMode(yyvsp[0].ival); ParserOptStack.getLast()->setRevDNSZoneRootLength(0); ; break;} case 294: #line 1579 "SrvParser.y" { ParserOptStack.getLast()->setFQDNLst(&PresentFQDNLst); ; break;} case 295: #line 1584 "SrvParser.y" { PresentFQDNLst.clear(); Log(Debug) << "FQDN: Setting update mode to " << yyvsp[-1].ival; switch (yyvsp[-1].ival) { case 0: Log(Cont) << "(no updates)" << LogEnd; break; case 1: Log(Cont) << "(client will update AAAA, server will update PTR)" << LogEnd; break; case 2: Log(Cont) << "(server will update both AAAA and PTR)" << LogEnd; break; default: Log(Cont) << LogEnd; Log(Crit) << "FQDN: Invalid mode. Only 0-2 are supported." << LogEnd; YYABORT; } Log(Debug) << "FQDN: RevDNS zoneroot lenght set to " << yyvsp[0].ival < 128) ) { Log(Crit) << "FQDN: Invalid zoneroot length specified:" << yyvsp[0].ival << ". Value 0-128 expected." << LogEnd; YYABORT; } ParserOptStack.getLast()->setFQDNMode(yyvsp[-1].ival); ParserOptStack.getLast()->setRevDNSZoneRootLength(yyvsp[0].ival); ; break;} case 296: #line 1612 "SrvParser.y" { ParserOptStack.getLast()->setFQDNLst(&PresentFQDNLst); ; break;} case 297: #line 1620 "SrvParser.y" { ParserOptStack.getLast()->setUnknownFQDN(EUnknownFQDNMode(yyvsp[-1].ival), string(yyvsp[0].strval) ); Log(Debug) << "FQDN: Unknown fqdn names processing set to " << yyvsp[-1].ival << ", domain=" << yyvsp[0].strval << "." << LogEnd; ; break;} case 298: #line 1626 "SrvParser.y" { ParserOptStack.getLast()->setUnknownFQDN(EUnknownFQDNMode(yyvsp[0].ival), string("") ); Log(Debug) << "FQDN: Unknown fqdn names processing set to " << yyvsp[0].ival << ", no domain." << LogEnd; ; break;} case 299: #line 1635 "SrvParser.y" { addr = new TIPv6Addr(yyvsp[0].addrval); CfgMgr->setDDNSAddress(addr); Log(Info) << "FQDN: DDNS updates will be performed to " << addr->getPlain() << "." << LogEnd; ; break;} case 300: #line 1643 "SrvParser.y" { if (!strcasecmp(yyvsp[0].strval,"tcp")) CfgMgr->setDDNSProtocol(TCfgMgr::DNSUPDATE_TCP); else if (!strcasecmp(yyvsp[0].strval,"udp")) CfgMgr->setDDNSProtocol(TCfgMgr::DNSUPDATE_UDP); else if (!strcasecmp(yyvsp[0].strval,"any")) CfgMgr->setDDNSProtocol(TCfgMgr::DNSUPDATE_ANY); else { Log(Crit) << "Invalid ddns-protocol specifed:" << (yyvsp[0].strval) << ", supported values are tcp, udp, any." << LogEnd; YYABORT; } Log(Debug) << "DDNS: Setting protocol to " << (yyvsp[0].strval) << LogEnd; ; break;} case 301: #line 1660 "SrvParser.y" { Log(Debug) << "DDNS: Setting timeout to " << yyvsp[0].ival << "ms." << LogEnd; CfgMgr->setDDNSTimeout(yyvsp[0].ival); ; break;} case 302: #line 1669 "SrvParser.y" { PresentAddrLst.clear(); ; break;} case 303: #line 1672 "SrvParser.y" { SPtr nis_servers = new TOptAddrLst(OPTION_NIS_SERVERS, PresentAddrLst, NULL); ParserOptStack.getLast()->addExtraOption(nis_servers, false); ///ParserOptStack.getLast()->setNISServerLst(&PresentAddrLst); ; break;} case 304: #line 1683 "SrvParser.y" { PresentAddrLst.clear(); ; break;} case 305: #line 1686 "SrvParser.y" { SPtr nisp_servers = new TOptAddrLst(OPTION_NISP_SERVERS, PresentAddrLst, NULL); ParserOptStack.getLast()->addExtraOption(nisp_servers, false); // ParserOptStack.getLast()->setNISPServerLst(&PresentAddrLst); ; break;} case 306: #line 1698 "SrvParser.y" { SPtr nis_domain = new TOptDomainLst(OPTION_NIS_DOMAIN_NAME, string(yyvsp[0].strval), NULL); ParserOptStack.getLast()->addExtraOption(nis_domain, false); // ParserOptStack.getLast()->setNISDomain($3); ; break;} case 307: #line 1710 "SrvParser.y" { SPtr nispdomain = new TOptDomainLst(OPTION_NISP_DOMAIN_NAME, string(yyvsp[0].strval), NULL); ParserOptStack.getLast()->addExtraOption(nispdomain, false); ; break;} case 308: #line 1721 "SrvParser.y" { SPtr lifetime = new TOptInteger(OPTION_INFORMATION_REFRESH_TIME, OPTION_INFORMATION_REFRESH_TIME_LEN, (uint32_t)(yyvsp[0].ival), NULL); ParserOptStack.getLast()->addExtraOption(lifetime, false); //ParserOptStack.getLast()->setLifetime($3); ; break;} case 309: #line 1731 "SrvParser.y" { ; break;} case 310: #line 1733 "SrvParser.y" { // ParserOptStack.getLast()->setVendorSpec(VendorSpec); // Log(Debug) << "Vendor-spec parsing finished" << LogEnd; ; break;} case 311: #line 1741 "SrvParser.y" { Log(Notice) << "ClientClass found, name: " << string(yyvsp[-1].strval) << LogEnd; ; break;} case 312: #line 1744 "SrvParser.y" { SPtr cond = NodeClientClassLst.getLast(); SrvCfgClientClassLst.append( new TSrvCfgClientClass(string(yyvsp[-4].strval),cond)); NodeClientClassLst.delLast(); ; break;} case 313: #line 1754 "SrvParser.y" { ; break;} case 315: #line 1760 "SrvParser.y" { SPtr r = NodeClientClassLst.getLast(); NodeClientClassLst.delLast(); SPtr l = NodeClientClassLst.getLast(); NodeClientClassLst.delLast(); NodeClientClassLst.append(new NodeOperator(NodeOperator::OPERATOR_CONTAIN,l,r)); ; break;} case 316: #line 1768 "SrvParser.y" { SPtr l = NodeClientClassLst.getLast(); NodeClientClassLst.delLast(); SPtr r = NodeClientClassLst.getLast(); NodeClientClassLst.delLast(); NodeClientClassLst.append(new NodeOperator(NodeOperator::OPERATOR_EQUAL,l,r)); ; break;} case 317: #line 1777 "SrvParser.y" { SPtr l = NodeClientClassLst.getLast(); NodeClientClassLst.delLast(); SPtr r = NodeClientClassLst.getLast(); NodeClientClassLst.delLast(); NodeClientClassLst.append(new NodeOperator(NodeOperator::OPERATOR_AND,l,r)); ; break;} case 318: #line 1786 "SrvParser.y" { SPtr l = NodeClientClassLst.getLast(); NodeClientClassLst.delLast(); SPtr r = NodeClientClassLst.getLast(); NodeClientClassLst.delLast(); NodeClientClassLst.append(new NodeOperator(NodeOperator::OPERATOR_OR,l,r)); ; break;} case 319: #line 1797 "SrvParser.y" { NodeClientClassLst.append(new NodeClientSpecific(NodeClientSpecific::CLIENT_VENDOR_SPEC_ENTERPRISE_NUM)); ; break;} case 320: #line 1801 "SrvParser.y" { NodeClientClassLst.append(new NodeClientSpecific(NodeClientSpecific::CLIENT_VENDOR_SPEC_DATA)); ; break;} case 321: #line 1805 "SrvParser.y" { NodeClientClassLst.append(new NodeClientSpecific(NodeClientSpecific::CLIENT_VENDOR_CLASS_ENTERPRISE_NUM)); ; break;} case 322: #line 1809 "SrvParser.y" { NodeClientClassLst.append(new NodeClientSpecific(NodeClientSpecific::CLIENT_VENDOR_CLASS_DATA)); ; break;} case 323: #line 1813 "SrvParser.y" { // Log(Info) << "Constant expression found:" <>snum; NodeClientClassLst.append(new NodeConstant(snum)); ; break;} case 325: #line 1827 "SrvParser.y" { SPtr l = NodeClientClassLst.getLast(); NodeClientClassLst.delLast(); NodeClientClassLst.append(new NodeOperator(NodeOperator::OPERATOR_SUBSTRING,l, yyvsp[-3].ival,yyvsp[-1].ival)); ; break;} } #line 840 "../bison++/bison.cc" /* the action file gets copied in in place of this dollarsign */ yyvsp -= yylen; yyssp -= yylen; #ifdef YY_SrvParser_LSP_NEEDED yylsp -= yylen; #endif #if YY_SrvParser_DEBUG != 0 if (YY_SrvParser_DEBUG_FLAG) { short *ssp1 = yyss - 1; fprintf (stderr, "state stack now"); while (ssp1 != yyssp) fprintf (stderr, " %d", *++ssp1); fprintf (stderr, "\n"); } #endif *++yyvsp = yyval; #ifdef YY_SrvParser_LSP_NEEDED yylsp++; if (yylen == 0) { yylsp->first_line = YY_SrvParser_LLOC.first_line; yylsp->first_column = YY_SrvParser_LLOC.first_column; yylsp->last_line = (yylsp-1)->last_line; yylsp->last_column = (yylsp-1)->last_column; yylsp->text = 0; } else { yylsp->last_line = (yylsp+yylen-1)->last_line; yylsp->last_column = (yylsp+yylen-1)->last_column; } #endif /* Now "shift" the result of the reduction. Determine what state that goes to, based on the state we popped back to and the rule number reduced by. */ yyn = yyr1[yyn]; yystate = yypgoto[yyn - YYNTBASE] + *yyssp; if (yystate >= 0 && yystate <= YYLAST && yycheck[yystate] == *yyssp) yystate = yytable[yystate]; else yystate = yydefgoto[yyn - YYNTBASE]; YYGOTO(yynewstate); YYLABEL(yyerrlab) /* here on detecting error */ if (! yyerrstatus) /* If not already recovering from an error, report this error. */ { ++YY_SrvParser_NERRS; #ifdef YY_SrvParser_ERROR_VERBOSE yyn = yypact[yystate]; if (yyn > YYFLAG && yyn < YYLAST) { int size = 0; char *msg; int x, count; count = 0; /* Start X at -yyn if nec to avoid negative indexes in yycheck. */ for (x = (yyn < 0 ? -yyn : 0); x < (sizeof(yytname) / sizeof(char *)); x++) if (yycheck[x + yyn] == x) size += strlen(yytname[x]) + 15, count++; msg = (char *) malloc(size + 15); if (msg != 0) { strcpy(msg, "parse error"); if (count < 5) { count = 0; for (x = (yyn < 0 ? -yyn : 0); x < (sizeof(yytname) / sizeof(char *)); x++) if (yycheck[x + yyn] == x) { strcat(msg, count == 0 ? ", expecting `" : " or `"); strcat(msg, yytname[x]); strcat(msg, "'"); count++; } } YY_SrvParser_ERROR(msg); free(msg); } else YY_SrvParser_ERROR ("parse error; also virtual memory exceeded"); } else #endif /* YY_SrvParser_ERROR_VERBOSE */ YY_SrvParser_ERROR((char*)"parse error"); } YYGOTO(yyerrlab1); YYLABEL(yyerrlab1) /* here on error raised explicitly by an action */ if (yyerrstatus == 3) { /* if just tried and failed to reuse lookahead token after an error, discard it. */ /* return failure if at end of input */ if (YY_SrvParser_CHAR == YYEOF) YYABORT; #if YY_SrvParser_DEBUG != 0 if (YY_SrvParser_DEBUG_FLAG) fprintf(stderr, "Discarding token %d (%s).\n", YY_SrvParser_CHAR, yytname[yychar1]); #endif YY_SrvParser_CHAR = YYEMPTY; } /* Else will try to reuse lookahead token after shifting the error token. */ yyerrstatus = 3; /* Each real token shifted decrements this */ YYGOTO(yyerrhandle); YYLABEL(yyerrdefault) /* current state does not do anything special for the error token. */ #if 0 /* This is wrong; only states that explicitly want error tokens should shift them. */ yyn = yydefact[yystate]; /* If its default is to accept any token, ok. Otherwise pop it.*/ if (yyn) YYGOTO(yydefault); #endif YYLABEL(yyerrpop) /* pop the current state because it cannot handle the error token */ if (yyssp == yyss) YYABORT; yyvsp--; yystate = *--yyssp; #ifdef YY_SrvParser_LSP_NEEDED yylsp--; #endif #if YY_SrvParser_DEBUG != 0 if (YY_SrvParser_DEBUG_FLAG) { short *ssp1 = yyss - 1; fprintf (stderr, "Error: state stack now"); while (ssp1 != yyssp) fprintf (stderr, " %d", *++ssp1); fprintf (stderr, "\n"); } #endif YYLABEL(yyerrhandle) yyn = yypact[yystate]; if (yyn == YYFLAG) YYGOTO(yyerrdefault); yyn += YYTERROR; if (yyn < 0 || yyn > YYLAST || yycheck[yyn] != YYTERROR) YYGOTO(yyerrdefault); yyn = yytable[yyn]; if (yyn < 0) { if (yyn == YYFLAG) YYGOTO(yyerrpop); yyn = -yyn; YYGOTO(yyreduce); } else if (yyn == 0) YYGOTO(yyerrpop); if (yyn == YYFINAL) YYACCEPT; #if YY_SrvParser_DEBUG != 0 if (YY_SrvParser_DEBUG_FLAG) fprintf(stderr, "Shifting error token, "); #endif *++yyvsp = YY_SrvParser_LVAL; #ifdef YY_SrvParser_LSP_NEEDED *++yylsp = YY_SrvParser_LLOC; #endif yystate = yyn; YYGOTO(yynewstate); /* end loop, in which YYGOTO may be used. */ YYENDGOTO } /* END */ #line 1039 "../bison++/bison.cc" #line 1833 "SrvParser.y" ///////////////////////////////////////////////////////////////////////////// // programs section /** * method check whether interface with id=ifaceNr has been already declared * * @param ifaceNr * * @return true if interface was not declared */ bool SrvParser::IfaceDefined(int ifaceNr) { SPtr ptr; SrvCfgIfaceLst.first(); while (ptr=SrvCfgIfaceLst.get()) if ((ptr->getID())==ifaceNr) { Log(Crit) << "Interface with ID=" << ifaceNr << " is already defined." << LogEnd; return false; } return true; } /** * check whether interface with id=ifaceName has been already declared * * @param ifaceName * * @return true, if defined, false otherwise */ bool SrvParser::IfaceDefined(string ifaceName) { SPtr ptr; SrvCfgIfaceLst.first(); while (ptr=SrvCfgIfaceLst.get()) { string presName=ptr->getName(); if (presName==ifaceName) { Log(Crit) << "Interface " << ifaceName << " is already defined." << LogEnd; return false; } } return true; } /** * method creates new option for just started interface scope * clears all lists except the list of interfaces and adds new group * */ bool SrvParser::StartIfaceDeclaration(string ifaceName) { if (!IfaceDefined(ifaceName)) return false; SrvCfgIfaceLst.append(new TSrvCfgIface(ifaceName)); // create new option (representing this interface) on the parser stack ParserOptStack.append(new TSrvParsGlobalOpt(*ParserOptStack.getLast())); SrvCfgAddrClassLst.clear(); ClientLst.clear(); return true; } /** * method creates new option for just started interface scope * clears all lists except the list of interfaces and adds new group * */ bool SrvParser::StartIfaceDeclaration(int ifindex) { if (!IfaceDefined(ifindex)) return false; SrvCfgIfaceLst.append(new TSrvCfgIface(ifindex)); // create new option (representing this interface) on the parser stack ParserOptStack.append(new TSrvParsGlobalOpt(*ParserOptStack.getLast())); SrvCfgAddrClassLst.clear(); ClientLst.clear(); return true; } /** * this method is called after inteface declaration has ended. It creates * new interface representation used in SrvCfgMgr. Also removes corresponding * element from the parser stack * * @return true if everything is ok */ bool SrvParser::EndIfaceDeclaration() { // get this interface object SPtr iface = SrvCfgIfaceLst.getLast(); // set its options SrvCfgIfaceLst.getLast()->setOptions(ParserOptStack.getLast()); // copy all IA objects SPtr ptrAddrClass; SrvCfgAddrClassLst.first(); while (ptrAddrClass=SrvCfgAddrClassLst.get()) iface->addAddrClass(ptrAddrClass); SrvCfgAddrClassLst.clear(); // copy all TA objects SPtr ta; SrvCfgTALst.first(); while (ta=SrvCfgTALst.get()) iface->addTA(ta); SrvCfgTALst.clear(); SPtr pd; SrvCfgPDLst.first(); while (pd=SrvCfgPDLst.get()) iface->addPD(pd); SrvCfgPDLst.clear(); iface->addClientExceptionsLst(ClientLst); // remove last option (representing this interface) from the parser stack ParserOptStack.delLast(); return true; } void SrvParser::StartClassDeclaration() { ParserOptStack.append(new TSrvParsGlobalOpt(*ParserOptStack.getLast())); SrvCfgAddrClassLst.append(new TSrvCfgAddrClass()); } /** * this method is adds new object representig just parsed IA class. * * @return true if everything works ok. */ bool SrvParser::EndClassDeclaration() { if (!ParserOptStack.getLast()->countPool()) { Log(Crit) << "No pools defined for this class." << LogEnd; return false; } //setting interface options on the basis of just read information SrvCfgAddrClassLst.getLast()->setOptions(ParserOptStack.getLast()); ParserOptStack.delLast(); return true; } /** * Just add global options * */ void SrvParser::StartTAClassDeclaration() { ParserOptStack.append(new TSrvParsGlobalOpt(*ParserOptStack.getLast())); } bool SrvParser::EndTAClassDeclaration() { if (!ParserOptStack.getLast()->countPool()) { Log(Crit) << "No pools defined for this ta-class." << LogEnd; return false; } // create new object representing just parsed TA and add it to the list SPtr ptrTA = new TSrvCfgTA(); ptrTA->setOptions(ParserOptStack.getLast()); SrvCfgTALst.append(ptrTA); // remove temporary parser object for this (just finished) scope ParserOptStack.delLast(); return true; } void SrvParser::StartPDDeclaration() { ParserOptStack.append(new TSrvParsGlobalOpt(*ParserOptStack.getLast())); this->PDLst.clear(); this->PDPrefix = 0; } bool SrvParser::EndPDDeclaration() { if (!this->PDLst.count()) { Log(Crit) << "No PD pools defined ." << LogEnd; return false; } if (!this->PDPrefix) { Log(Crit) << "PD prefix length not defined or set to 0." << LogEnd; return false; } int len = 0; this->PDLst.first(); while ( SPtr pool = PDLst.get() ) { if (!len) len = pool->getPrefixLength(); if (len!=pool->getPrefixLength()) { Log(Crit) << "Prefix pools with different lengths are not supported. " "Make sure that all 'pd-pool' uses the same prefix length." << LogEnd; return false; } } if (len>PDPrefix) { Log(Crit) << "Clients are supposed to get /" << this->PDPrefix << " prefixes," << "but pd-pool(s) are only /" << len << " long." << LogEnd; return false; } if (len==PDPrefix) { Log(Warning) << "Prefix pool /" << PDPrefix << " defined and clients are " "supposed to get /" << len << " prefixes. Only ONE client will get " "prefix" << LogEnd; } SPtr ptrPD = new TSrvCfgPD(); ParserOptStack.getLast()->setPool(&this->PDLst); if (!ptrPD->setOptions(ParserOptStack.getLast(), this->PDPrefix)) return false; SrvCfgPDLst.append(ptrPD); // remove temporary parser object for this (just finished) scope ParserOptStack.delLast(); return true; } namespace std { extern yy_SrvParser_stype yylval; } int SrvParser::yylex() { memset(&std::yylval,0, sizeof(std::yylval)); memset(&this->yylval,0, sizeof(this->yylval)); int x = this->lex->yylex(); this->yylval=std::yylval; return x; } void SrvParser::yyerror(char *m) { Log(Crit) << "Config parse error: line " << lex->lineno() << ", unexpected [" << lex->YYText() << "] token." << LogEnd; } SrvParser::~SrvParser() { ParserOptStack.clear(); SrvCfgIfaceLst.clear(); SrvCfgAddrClassLst.clear(); SrvCfgTALst.clear(); PresentAddrLst.clear(); PresentStringLst.clear(); PresentRangeLst.clear(); } static char bitMask[]= { 0, 0x80, 0xc0, 0xe0, 0xf0, 0xf8, 0xfc, 0xfe, 0xff }; SPtr SrvParser::getRangeMin(char * addrPacked, int prefix) { char packed[16]; char mask; memcpy(packed, addrPacked, 16); if (prefix%8!=0) { mask = bitMask[prefix%8]; packed[prefix/8] = packed[prefix/8] & mask; prefix = (prefix/8 + 1)*8; } for (int i=prefix/8;i<16; i++) { packed[i]=0; } return new TIPv6Addr(packed, false); } SPtr SrvParser::getRangeMax(char * addrPacked, int prefix){ char packed[16]; char mask; memcpy(packed, addrPacked,16); if (prefix%8!=0) { mask = bitMask[prefix%8]; packed[prefix/8] = packed[prefix/8] | ~mask; prefix = (prefix/8 + 1)*8; } for (int i=prefix/8;i<16; i++) { packed[i]=0xff; } return new TIPv6Addr(packed, false); } dibbler-1.0.1/SrvCfgMgr/SrvParsClassOpt.cpp0000644000175000017500000001124012277722750015463 00000000000000/* * Dibbler - a portable DHCPv6 * * authors: Tomasz Mrugalski * Marek Senderski * changes: Nguyen Vinh Nghiem * * released under GNU GPL v2 only licence * */ #include #include "SrvParsClassOpt.h" #include "DHCPDefaults.h" using namespace std; TSrvParsClassOpt::TSrvParsClassOpt(void) { this->T1Beg = SERVER_DEFAULT_MIN_T1; this->T1End = SERVER_DEFAULT_MAX_T1; this->T2Beg = SERVER_DEFAULT_MIN_T2; this->T2End = SERVER_DEFAULT_MAX_T2; this->PrefBeg = SERVER_DEFAULT_MIN_PREF; this->PrefEnd = SERVER_DEFAULT_MAX_PREF; this->ValidBeg = SERVER_DEFAULT_MIN_VALID; this->ValidEnd = SERVER_DEFAULT_MAX_VALID; this->Share = SERVER_DEFAULT_CLASS_SHARE; this->ClassMaxLease = SERVER_DEFAULT_CLASS_MAX_LEASE; } //T1,T2,Valid,Prefered time routines void TSrvParsClassOpt::setT1Beg(unsigned long t1) { this->T1Beg=t1; } void TSrvParsClassOpt::setT1End(unsigned long t1) { this->T1End=t1; } unsigned long TSrvParsClassOpt::getT1Beg() { return T1Beg; } unsigned long TSrvParsClassOpt::getT1End() { return T1End; } void TSrvParsClassOpt::setT2Beg(unsigned long t2) { this->T2Beg=t2; } void TSrvParsClassOpt::setT2End(unsigned long t2) { this->T2End=t2; } unsigned long TSrvParsClassOpt::getT2Beg() { return this->T2Beg; } unsigned long TSrvParsClassOpt::getT2End() { return this->T2End; } void TSrvParsClassOpt::setShare(unsigned long share) { this->Share = share; } unsigned long TSrvParsClassOpt::getShare() { return this->Share; } void TSrvParsClassOpt::setPrefBeg(unsigned long pref) { this->PrefBeg=pref; } void TSrvParsClassOpt::setPrefEnd(unsigned long pref) { this->PrefEnd=pref; } unsigned long TSrvParsClassOpt::getPrefBeg() { return this->PrefBeg; } unsigned long TSrvParsClassOpt::getPrefEnd() { return this->PrefEnd; } void TSrvParsClassOpt::setValidEnd(unsigned long valid) { this->ValidEnd=valid; } void TSrvParsClassOpt::setValidBeg(unsigned long valid) { this->ValidBeg=valid; } unsigned long TSrvParsClassOpt::getValidEnd() { return this->ValidEnd; } unsigned long TSrvParsClassOpt::getValidBeg() { return this->ValidBeg; } //Rejected clients access routines void TSrvParsClassOpt::addRejedClnt(SPtr addr) { this->RejedClnt.append(addr); } void TSrvParsClassOpt::firstRejedClnt() { this->RejedClnt.first(); } SPtr TSrvParsClassOpt::getRejedClnt() { return this->RejedClnt.get(); } void TSrvParsClassOpt::setRejedClnt(TContainer > *rejedClnt) { this->RejedClnt.clear(); rejedClnt->first(); SPtr addr; while(addr=rejedClnt->get()) this->RejedClnt.append(addr); } //Accepted clients access routines void TSrvParsClassOpt::addAcceptClnt(SPtr addr) { this->AcceptClnt.append(addr); } void TSrvParsClassOpt::firstAcceptClnt() { this->AcceptClnt.first(); } SPtr TSrvParsClassOpt::getAcceptClnt() { return this->AcceptClnt.get(); } void TSrvParsClassOpt::setAcceptClnt(TContainer > *acceptClnt) { this->AcceptClnt.clear(); acceptClnt->first(); SPtr addr; while(addr=acceptClnt->get()) this->AcceptClnt.append(addr); } //Pool access routines void TSrvParsClassOpt::addPool(SPtr addr) { this->Pool.append(addr); } void TSrvParsClassOpt::firstPool() { this->Pool.first(); } SPtr TSrvParsClassOpt::getPool() { return this->Pool.get(); } void TSrvParsClassOpt::setPool(TContainer > *pool) { this->Pool.clear(); pool->first(); SPtr addr; while(addr=pool->get()) this->Pool.append(addr); } void TSrvParsClassOpt::setClassMaxLease(unsigned long classMaxLease) { this->ClassMaxLease = classMaxLease; } unsigned long TSrvParsClassOpt::getClassMaxLease() { return this->ClassMaxLease; } TSrvParsClassOpt::~TSrvParsClassOpt(void) { } long TSrvParsClassOpt::countPool() { return this->Pool.count(); } void TSrvParsClassOpt::setAddrParams(int prefix, int bitfield) { AddrParams = new TSrvOptAddrParams(prefix, bitfield, 0 /* parent */); } SPtr TSrvParsClassOpt::getAddrParams() { return AddrParams; } void TSrvParsClassOpt::setAllowClientClass(std::string s) { allowLst.append(SPtr (new string(s))); } void TSrvParsClassOpt::setDenyClientClass(std::string s) { denyLst.append(SPtr (new string(s))); } List(std::string) TSrvParsClassOpt::getAllowClientClassString() { return allowLst; } List(std::string) TSrvParsClassOpt::getDenyClientClassString() { return denyLst; } dibbler-1.0.1/SrvCfgMgr/NodeConstant.h0000664000175000017500000000104712233256142014451 00000000000000/* * Dibbler - a portable DHCPv6 * * authors: Nguyen Vinh Nghiem * changes: Tomasz Mrugalski * * released under GNU GPL v2 or later licence * */ #ifndef NODECONSTANT_H_ #define NODECONSTANT_H_ #include "Node.h" #include class NodeConstant : public Node { public : NodeConstant(); NodeConstant(std::string v); ~NodeConstant(); std::string getStringValue(); std::string value; virtual std::string exec(); virtual std::string exec(SPtr msg); }; #endif /* NODECONSTANT_H_ */ dibbler-1.0.1/RELNOTES0000644000175000017500000000132512561662012011215 00000000000000 Dibbler 1.0.1 [2015-08-09] ---------------------------- This is the final version of the 1.0.1 release of the Dibbler software. This update contains a number of small fixes, with one of them possibly having security implications. Upgrade is strongly recommended. If you find bugs, please report them on http://klub.com.pl/bugzilla/. Appropriate links are on project website: http://klub.com.pl/dhcpv6/. If you need help or want to share your thoughts, take a look at one of two mailing lists: dibbler or dibbler-devel. Please do not contact author directly, unless you want to report security issues or discuss confidential matters. Thank you for using Dibbler. Tomek Mrugalski, author dibbler-1.0.1/tests/0000755000175000017500000000000012561700376011266 500000000000000dibbler-1.0.1/tests/testCase04/0000755000175000017500000000000012277734640013212 500000000000000dibbler-1.0.1/tests/testCase04/server.conf0000664000175000017500000000012412233256142015272 00000000000000iface 'eth0' { T1 10 time-zone 'EST' class { pool 20::90-20::90 } }dibbler-1.0.1/tests/testCase04/client.conf0000664000175000017500000000002212233256142015237 00000000000000iface 'eth0' { }dibbler-1.0.1/tests/remote-autoconf/0000755000175000017500000000000012277734640014402 500000000000000dibbler-1.0.1/tests/remote-autoconf/server-1.conf0000664000175000017500000000061312233256142016623 00000000000000log-level 8 log-mode short log-colors 0 preference 2 experimental iface "eth0" { t1 1800 class { pool 2001:db8:1111::/64 } rapid-commit 1 unicast 2001:db8:1111::f option dns-server 2001:db8:1111::f option domain alfa.example.com option time-zone CET option nis-server 2001:db8:1111::abc option nis-domain alfa.example.com option neighbors 2001:db8:2222::f,2001:db8:3333::f } dibbler-1.0.1/tests/remote-autoconf/capture1.pcap0000664000175000017500000002207012233256142016702 00000000000000Ôò¡ÿÿqß„LVuAA!)™hÊE1@°À¨ïÿÿúll´NOTIFY * HTTP/1.1 HOST: 239.255.255.250:1900 CACHE-CONTROL: max-age=180 Location: http://192.168.21.1:5431/dyndev/uuid:0021-2999-68ca000099dc NT: upnp:rootdevice NTS: ssdp:alive SERVER:LINUX/2.4 UPnP/1.0 BRCM400/1.0 USN: uuid:0021-2999-68ca000099dc::upnp:rootdevice ß„Lq<<!)™hÊE,@°À¨ïÿÿúll«ôNOTIFY * HTTP/1.1 HOST: 239.255.255.250:1900 CACHE-CONTROL: max-age=180 Location: http://192.168.21.1:5431/dyndev/uuid:0021-2999-68ca000099dc NT: uuid:0021-2999-68ca000099dc NTS: ssdp:alive SERVER:LINUX/2.4 UPnP/1.0 BRCM400/1.0 USN: uuid:0021-2999-68ca000099dc ß„LA›‰‰!)™hÊEy@¯ÐÀ¨ïÿÿúlleENOTIFY * HTTP/1.1 HOST: 239.255.255.250:1900 CACHE-CONTROL: max-age=180 Location: http://192.168.21.1:5431/dyndev/uuid:0021-2999-68ca000099dc NT: urn:schemas-upnp-org:device:InternetGatewayDevice:1 NTS: ssdp:alive SERVER:LINUX/2.4 UPnP/1.0 BRCM400/1.0 USN: uuid:0021-2999-68ca000099dc::urn:schemas-upnp-org:device:InternetGatewayDevice:1 ß„LÙ©!)™hÊEq@¯ØÀ¨ïÿÿúll]íÖNOTIFY * HTTP/1.1 HOST: 239.255.255.250:1900 CACHE-CONTROL: max-age=180 Location: http://192.168.21.1:5431/dyndev/uuid:0021-2999-68ca000099dc NT: urn:schemas-upnp-org:service:Layer3Forwarding:1 NTS: ssdp:alive SERVER:LINUX/2.4 UPnP/1.0 BRCM400/1.0 USN: uuid:0021-2999-68ca000099dc::urn:schemas-upnp-org:service:Layer3Forwarding:1 ß„Læµ<<!)™hÊE,@°À¨ïÿÿúll«òNOTIFY * HTTP/1.1 HOST: 239.255.255.250:1900 CACHE-CONTROL: max-age=180 Location: http://192.168.21.1:5431/dyndev/uuid:0021-2999-68ca000099dc NT: uuid:0021-2999-68ca010099dc NTS: ssdp:alive SERVER:LINUX/2.4 UPnP/1.0 BRCM400/1.0 USN: uuid:0021-2999-68ca010099dc ß„LÄqq!)™hÊEa@¯èÀ¨ïÿÿúllM‡NOTIFY * HTTP/1.1 HOST: 239.255.255.250:1900 CACHE-CONTROL: max-age=180 Location: http://192.168.21.1:5431/dyndev/uuid:0021-2999-68ca000099dc NT: urn:schemas-upnp-org:device:WANDevice:1 NTS: ssdp:alive SERVER:LINUX/2.4 UPnP/1.0 BRCM400/1.0 USN: uuid:0021-2999-68ca010099dc::urn:schemas-upnp-org:device:WANDevice:1 ß„L,Ó‘‘!)™hÊE@¯ÈÀ¨ïÿÿúllm÷¿NOTIFY * HTTP/1.1 HOST: 239.255.255.250:1900 CACHE-CONTROL: max-age=180 Location: http://192.168.21.1:5431/dyndev/uuid:0021-2999-68ca000099dc NT: urn:schemas-upnp-org:service:WANCommonInterfaceConfig:1 NTS: ssdp:alive SERVER:LINUX/2.4 UPnP/1.0 BRCM400/1.0 USN: uuid:0021-2999-68ca010099dc::urn:schemas-upnp-org:service:WANCommonInterfaceConfig:1 ß„L0ß<<!)™hÊE,@°À¨ïÿÿúll«ðNOTIFY * HTTP/1.1 HOST: 239.255.255.250:1900 CACHE-CONTROL: max-age=180 Location: http://192.168.21.1:5431/dyndev/uuid:0021-2999-68ca000099dc NT: uuid:0021-2999-68ca020099dc NTS: ssdp:alive SERVER:LINUX/2.4 UPnP/1.0 BRCM400/1.0 USN: uuid:0021-2999-68ca020099dc ß„L¼í……!)™hÊEu@¯ÔÀ¨ïÿÿúllakJNOTIFY * HTTP/1.1 HOST: 239.255.255.250:1900 CACHE-CONTROL: max-age=180 Location: http://192.168.21.1:5431/dyndev/uuid:0021-2999-68ca000099dc NT: urn:schemas-upnp-org:device:WANConnectionDevice:1 NTS: ssdp:alive SERVER:LINUX/2.4 UPnP/1.0 BRCM400/1.0 USN: uuid:0021-2999-68ca020099dc::urn:schemas-upnp-org:device:WANConnectionDevice:1 ß„L,ü!)™hÊEo@¯ÚÀ¨ïÿÿúll[-NOTIFY * HTTP/1.1 HOST: 239.255.255.250:1900 CACHE-CONTROL: max-age=180 Location: http://192.168.21.1:5431/dyndev/uuid:0021-2999-68ca000099dc NT: urn:schemas-upnp-org:service:WANIPConnection:1 NTS: ssdp:alive SERVER:LINUX/2.4 UPnP/1.0 BRCM400/1.0 USN: uuid:0021-2999-68ca020099dc::urn:schemas-upnp-org:service:WANIPConnection:1 ß„LÎ !)™hÊEq@¯ØÀ¨ïÿÿúll]K2NOTIFY * HTTP/1.1 HOST: 239.255.255.250:1900 CACHE-CONTROL: max-age=180 Location: http://192.168.21.1:5431/dyndev/uuid:0021-2999-68ca000099dc NT: urn:schemas-upnp-org:service:WANPPPConnection:1 NTS: ssdp:alive SERVER:LINUX/2.4 UPnP/1.0 BRCM400/1.0 USN: uuid:0021-2999-68ca020099dc::urn:schemas-upnp-org:service:WANPPPConnection:1 á„LÖRXXϯ¨EHÔ®Ï÷  ÿ4 Õ9ÿÿÿÿë„LU ††H[9(.†Ý`N@þ€J[9ÿþ(.ÿ"#Nœ‚ébûHKÖ€ à ÿÿÿÿÿÿÿÿþ *þë„L=z XX'æ†Ý` :ÿ  ¸ÿÿ(.‡jþ€J[9ÿþ(.'æë„Lºz XXH[9(.†Ý` :ÿþ€J[9ÿþ(.  ¸ˆÈø`þ€J[9ÿþ(.H[9(.ë„LÉ{ 'æ†Ý`I@  ¸þ€J[9ÿþ(.#"IÇ[éb„  ¸¿l¤óæºQ€£ X1 address granted. You may include IAADDR in IA option, if you want to provide a hint. <û'æûHKÖ€ à   ¸  ¸alfaexamplecom  ¸ ¼alfa.example.comþ  ¸""  ¸33ì„LëM ´´H[9(.†Ý`|@þ€J[9ÿþ(.ÿ"#|N¼¥jûHKÖ€ à(ÿÿÿÿÿÿÿÿ  ¸¿l¤óæºQ€£þ *þ <û'æì„LÁ‘ GG'æ†Ý`@  ¸þ€J[9ÿþ(.#"A¬¥jJ  ¸¿l¤óæºQ€£ All addresses were assigned. <û'æûHKÖ€ à   ¸  ¸alfaexamplecom  ¸ ¼alfa.example.comaþ  ¸""  ¸33ì„L 2 „„H[9(.†Ý`Lþ€J[9ÿþ(.ÿ:¦Kÿÿóæºÿÿÿÿ(.í„LXÏPPH[9(.†Ý`:ÿÿÿóæº‡Œq  ¸¿l¤óæºî„L~ÃÃH[9(.E³@ÿ )àûééŸëÔab6e3f104af1c6fb000011118bd01002ip6arpaÿvoyagerlocalÿÀZx  ¸¿l¤óæºÀ xÀZî„L½ˆˆH[9(.Ex@ÿP )àûééd뙄voyagerlocal €x I686LINUXÀ €x  ¸À €x )î„L¢P ÃÃH[9(.E³@ÿ )àûééŸëÔab6e3f104af1c6fb000011118bd01002ip6arpaÿvoyagerlocalÿÀZx  ¸¿l¤óæºÀ xÀZï„LÓßÃÃH[9(.E³@ÿ )àûééŸëÔab6e3f104af1c6fb000011118bd01002ip6arpaÿvoyagerlocalÿÀZx  ¸¿l¤óæºÀ xÀZï„Lv興H[9(.Ex@ÿP )àûééd뙄voyagerlocal €x I686LINUXÀ €x  ¸À €x )ï„L0ñ··H[9(.E§@ÿ! )àûéé“ëÈ„ab6e3f104af1c6fb000011118bd01002ip6arpa €xvoyagerlocalÀ`€x  ¸¿l¤óæºð„L;„„H[9(.†Ý`Lþ€J[9ÿþ(.ÿ:¦Kÿÿóæºÿÿÿÿ(.ð„LõÓÓÓH[9(.EÃ@ÿ )àûéé¯ëä„ab6e3f104af1c6fb000011118bd01002ip6arpa €xvoyagerlocalÀ`€x  ¸¿l¤óæºÀ`€x  ¸ð„L¾p XXH[9(.†Ý` :ÿþ€J[9ÿþ(.  ¸‡›;  ¸H[9(.ð„LÈq PP'æ†Ý`:ÿ  ¸þ€J[9ÿþ(.ˆ ß@  ¸ð„LH_ jjH[9(.†Ý`2@  ¸¿l¤óæº  ¸"""#2O¨d§ûHKÖ€ à ÿÿÿÿÿÿÿÿð„Ld XXŒ›sI†Ý` :ÿþ€Œÿþ›sIÿÿóæº‡‹á  ¸¿l¤ó溌›sIð„LHd XXH[9(.†Ý` :ÿ  ¸¿l¤óæºþ€Œÿþ›sIˆYs`  ¸¿l¤óæºH[9(.ð„L¡e ÀÀŒ›sI†Ý`ˆ:ÿþ€Œÿþ›sI  ¸¿l¤ó溉[  ¸""  ¸"" `2@  ¸¿l¤óæº  ¸"""#2O¨d§ûHKÖ€ à ÿÿÿÿÿÿÿÿð„Lp jjH[9(.†Ý`2@  ¸¿l¤óæº  ¸33"#28ªG–±ûHKÖ€ à ÿÿÿÿÿÿÿÿð„L}p ÀÀŒ›sI†Ý`ˆ:ÿþ€Œÿþ›sI  ¸¿l¤ó溉8þ  ¸33  ¸33 `2@  ¸¿l¤óæº  ¸33"#28ªG–±ûHKÖ€ à ÿÿÿÿÿÿÿÿð„LÍ· --Œ›sI†Ý`õ?  ¸""  ¸¿l¤óæº#"õ™¼d§„Ð ¸  ¸""(¹í±ÛÎÛC X1 address granted. You may include IAADDR in IA option, if you want to provide a hint.à´'ì<ûHKÖ€ à   ¸""þ  ¸  ¸33ð„LAÕ 99Œ›sI†Ý`?  ¸33  ¸¿l¤óæº#"„|G–±„  ¸33E¯°%õî§ÿQ€£ X1 address granted. You may include IAADDR in IA option, if you want to provide a hint. Ë,'¥ŒûHKÖ€ à   ¸33þ  ¸  ¸""Ò4Vy«Íïò„L€º ÓÓH[9(.EÃ@ÿ )àûéé¯ëä„ab6e3f104af1c6fb000011118bd01002ip6arpa €xvoyagerlocalÀ`€x  ¸¿l¤óæºÀ`€x  ¸dibbler-1.0.1/tests/remote-autoconf/capture4.pcap0000664000175000017500000004756412233256142016724 00000000000000Ôò¡ÿÿÞ„L^L ZZ33'æ†Ý`$þ€ 'ÿþæÿ:-ÿÞ„LoL ZZ33'æ†Ý`$þ€ 'ÿþæÿ:-ÿß„L'dZZ33'æ†Ý`$þ€ 'ÿþæÿ:-ÿß„L;dZZ33'æ†Ý`$þ€ 'ÿþæÿ:-ÿß„LhËZZ33'æ†Ý`$þ€ 'ÿþæÿ:,ÿß„LËZZ33'æ†Ý`$þ€ 'ÿþæÿ:,ÿé„L·: ZZ33'æ†Ý`$þ€ 'ÿþæÿ:,ÿé„LÃ: ZZ33'æ†Ý`$þ€ 'ÿþæÿ:,ÿë„Lb_„„33H[9(.†Ý`N@þ€J[9ÿþ(.ÿ"#Nœ‚ébûHKÖ€ à ÿÿÿÿÿÿÿÿþ *þë„LÀ»VV33ÿ(.'æ†Ý` :ÿ  ¸ÿÿ(.‡jþ€J[9ÿþ(.'æë„LÙ»VV33ÿ(.'æ†Ý` :ÿ  ¸ÿÿ(.‡jþ€J[9ÿþ(.'æë„L©¼VV'æH[9(.†Ý` :ÿþ€J[9ÿþ(.  ¸ˆÈø`þ€J[9ÿþ(.H[9(.ë„LA½H[9(.'æ†Ý`I@  ¸þ€J[9ÿþ(.#"IÇ[éb„  ¸¿l¤óæºQ€£ X1 address granted. You may include IAADDR in IA option, if you want to provide a hint. <û'æûHKÖ€ à   ¸  ¸alfaexamplecom  ¸ ¼alfa.example.comþ  ¸""  ¸33ë„LF½H[9(.'æ†Ý`I@  ¸þ€J[9ÿþ(.#"IÇ[éb„  ¸¿l¤óæºQ€£ X1 address granted. You may include IAADDR in IA option, if you want to provide a hint. <û'æûHKÖ€ à   ¸  ¸alfaexamplecom  ¸ ¼alfa.example.comþ  ¸""  ¸33ì„L³²²33H[9(.†Ý`|@þ€J[9ÿþ(.ÿ"#|N¼¥jûHKÖ€ à(ÿÿÿÿÿÿÿÿ  ¸¿l¤óæºQ€£þ *þ <û'æì„LÓEEH[9(.'æ†Ý`@  ¸þ€J[9ÿþ(.#"A¬¥jJ  ¸¿l¤óæºQ€£ All addresses were assigned. <û'æûHKÖ€ à   ¸  ¸alfaexamplecom  ¸ ¼alfa.example.comaþ  ¸""  ¸33ì„LÓEEH[9(.'æ†Ý`@  ¸þ€J[9ÿþ(.#"A¬¥jJ  ¸¿l¤óæºQ€£ All addresses were assigned. <û'æûHKÖ€ à   ¸  ¸alfaexamplecom  ¸ ¼alfa.example.comaþ  ¸""  ¸33ì„LÈs‚‚33H[9(.†Ý`Lþ€J[9ÿþ(.ÿ:¦Kÿÿóæºÿÿÿÿ(.í„LJNN33ÿóæºH[9(.†Ý`:ÿÿÿóæº‡Œq  ¸¿l¤óæºî„Lœ. ZZ33'ì<†Ý`$þ€ 'ÿþì<ÿ:àÿî„L½. ZZ33'ì<†Ý`$þ€ 'ÿþì<ÿ:àÿï„Lî¾ ‚‚33H[9(.†Ý`Lþ€J[9ÿþ(.ÿ:¦Kÿÿóæºÿÿÿÿ(.ð„LøÑZZ33'¥Œ†Ý`$þ€ 'ÿþ¥Œÿ:™ìÿð„LÒZZ33'¥Œ†Ý`$þ€ 'ÿþ¥Œÿ:™ìÿð„L°±VV'æH[9(.†Ý` :ÿþ€J[9ÿþ(.  ¸‡›;  ¸H[9(.ð„Ls²NNH[9(.'æ†Ý`:ÿ  ¸þ€J[9ÿþ(.ˆ ß@  ¸ð„Ly²NNH[9(.'æ†Ý`:ÿ  ¸þ€J[9ÿþ(.ˆ ß@  ¸ð„L5 hhŒ›sIH[9(.†Ý`2@  ¸¿l¤óæº  ¸"""#2O¨d§ûHKÖ€ à ÿÿÿÿÿÿÿÿð„Lœ¤VV33ÿóæºŒ›sI†Ý` :ÿþ€Œÿþ›sIÿÿóæº‡‹á  ¸¿l¤ó溌›sIð„L±¤VV33ÿŒ›sI†Ý` :ÿþ€Œÿþ›sIÿÿ‡*  ¸""Œ›sIð„L)¥VVŒ›sIH[9(.†Ý` :ÿ  ¸¿l¤óæºþ€Œÿþ›sIˆYs`  ¸¿l¤óæºH[9(.ð„LD¥¾¾H[9(.Œ›sI†Ý`ˆ:ÿþ€Œÿþ›sI  ¸¿l¤ó溉[  ¸""  ¸"" `2@  ¸¿l¤óæº  ¸"""#2O¨d§ûHKÖ€ à ÿÿÿÿÿÿÿÿð„Lr¦VVŒ›sI'ì<†Ý` :ÿ  ¸""þ€Œÿþ›sIˆ'#`  ¸""'ì<ð„L‚¦hh'ì<Œ›sI†Ý`2?  ¸¿l¤óæº  ¸"""#2O¨d§ûHKÖ€ à ÿÿÿÿÿÿÿÿð„Ló°hhŒ›sIH[9(.†Ý`2@  ¸¿l¤óæº  ¸33"#28ªG–±ûHKÖ€ à ÿÿÿÿÿÿÿÿð„L±¾¾H[9(.Œ›sI†Ý`ˆ:ÿþ€Œÿþ›sI  ¸¿l¤ó溉8þ  ¸33  ¸33 `2@  ¸¿l¤óæº  ¸33"#28ªG–±ûHKÖ€ à ÿÿÿÿÿÿÿÿð„LóÁVV33ÿŒ›sI†Ý` :ÿþ€Œÿþ›sIÿÿ‡  ¸33Œ›sIð„L©ÂVVŒ›sI'¥Œ†Ý` :ÿ  ¸33þ€Œÿþ›sIˆ `  ¸33'¥Œð„L°Âhh'¥ŒŒ›sI†Ý`2?  ¸¿l¤óæº  ¸33"#28ªG–±ûHKÖ€ à ÿÿÿÿÿÿÿÿð„Lå÷++Œ›sI'ì<†Ý`õ@  ¸""  ¸¿l¤óæº#"õ™¼d§„Ð ¸  ¸""(¹í±ÛÎÛC X1 address granted. You may include IAADDR in IA option, if you want to provide a hint.à´'ì<ûHKÖ€ à   ¸""þ  ¸  ¸33ð„L?ø††'ì<Œ›sI†Ý`P:ÿþ€Œÿþ›sI  ¸""‰  ¸¿l¤óæº  ¸¿l¤óæºH[9(.$`õ@  ¸""  ¸¿l¤óæº#"õ™¼d§„Ð ¸  ¸""(¹í±ÛÎÛC X1 address granted. You may include IAADDR in IA option, if you want to provide a hint.à´'ì<ûHKÖ€ à   ¸""þ  ¸  ¸33ð„LQø++H[9(.Œ›sI†Ý`õ?  ¸""  ¸¿l¤óæº#"õ™¼d§„Ð ¸  ¸""(¹í±ÛÎÛC X1 address granted. You may include IAADDR in IA option, if you want to provide a hint.à´'ì<ûHKÖ€ à   ¸""þ  ¸  ¸33ð„L‘ 77Œ›sI'¥Œ†Ý`@  ¸33  ¸¿l¤óæº#"„|G–±„  ¸33E¯°%õî§ÿQ€£ X1 address granted. You may include IAADDR in IA option, if you want to provide a hint. Ë,'¥ŒûHKÖ€ à   ¸33þ  ¸  ¸""Ò4Vy«Íïð„Lµ ––'¥ŒŒ›sI†Ý``:ÿþ€Œÿþ›sI  ¸33‰Ïã  ¸¿l¤óæº  ¸¿l¤óæºH[9(.&`@  ¸33  ¸¿l¤óæº#"„|G–±„  ¸33E¯°%õî§ÿQ€£ X1 address granted. You may include IAADDR in IA option, if you want to provide a hint. Ë,'¥ŒûHKÖ€ à   ¸33þ  ¸  ¸""Ò4Vy«Íð„L¿ 77H[9(.Œ›sI†Ý`?  ¸33  ¸¿l¤óæº#"„|G–±„  ¸33E¯°%õî§ÿQ€£ X1 address granted. You may include IAADDR in IA option, if you want to provide a hint. Ë,'¥ŒûHKÖ€ à   ¸33þ  ¸  ¸""Ò4Vy«Íïñ„Lp ZZ33'ì<†Ý`$þ€ 'ÿþì<ÿ:àÿñ„Lp ZZ33'ì<†Ý`$þ€ 'ÿþì<ÿ:àÿó„L^‡ZZ33'¥Œ†Ý`$þ€ 'ÿþ¥Œÿ:™ìÿó„Lk‡ZZ33'¥Œ†Ý`$þ€ 'ÿþ¥Œÿ:™ìÿõ„LíŸVVŒ›sI'ì<†Ý` :ÿþ€ 'ÿþì<þ€Œÿþ›sI‡ÚÊþ€Œÿþ›sI'ì<õ„L- NN'ì<Œ›sI†Ý`:ÿþ€Œÿþ›sIþ€ 'ÿþì<ˆiûÀþ€Œÿþ›sIõ„LsÀVVŒ›sI'¥Œ†Ý` :ÿþ€ 'ÿþ¥Œþ€Œÿþ›sI‡Îãþ€Œÿþ›sI'¥Œõ„L|ÀNN'¥ŒŒ›sI†Ý`:ÿþ€Œÿþ›sIþ€ 'ÿþ¥ŒˆäÀþ€Œÿþ›sIõ„LîVVŒ›sI'ì<†Ý` :ÿþ€ 'ÿþì<  ¸""‡:  ¸""'ì<õ„L îNN'ì<Œ›sI†Ý`:ÿ  ¸""þ€ 'ÿþì<ˆÉJÀ  ¸""õ„LÇ VVŒ›sI'¥Œ†Ý` :ÿþ€ 'ÿþ¥Œ  ¸33‡   ¸33'¥Œõ„LÓ NN'¥ŒŒ›sI†Ý`:ÿ  ¸33þ€ 'ÿþ¥Œˆ!5À  ¸33ú„L‘VV'ì<Œ›sI†Ý` :ÿþ€Œÿþ›sIþ€ 'ÿþì<‡ÚÊþ€ 'ÿþì<Œ›sIú„Lá‘NNŒ›sI'ì<†Ý`:ÿþ€ 'ÿþì<þ€Œÿþ›sIˆšÖ@þ€ 'ÿþì<ú„Lè¿VV'¥ŒŒ›sI†Ý` :ÿþ€Œÿþ›sIþ€ 'ÿþ¥Œ‡Îãþ€ 'ÿþ¥ŒŒ›sIú„LÊÀNNŒ›sI'¥Œ†Ý`:ÿþ€ 'ÿþ¥Œþ€Œÿþ›sIˆŽï@þ€ 'ÿþ¥ŒŠ„Lm$ZZ33'¥Œ†Ý`$þ€ 'ÿþ¥Œÿ:šìÿŠ„L$ZZ33'¥Œ†Ý`$þ€ 'ÿþ¥Œÿ:šìÿ‘„LØ+ ZZ33'æ†Ý`$þ€ 'ÿþæÿ:-ÿ‘„Lñ+ ZZ33'æ†Ý`$þ€ 'ÿþæÿ:-ÿ’„Ló} ZZ33'¥Œ†Ý`$þ€ 'ÿþ¥Œÿ:šìÿ’„L~ ZZ33'¥Œ†Ý`$þ€ 'ÿþ¥Œÿ:šìÿš„L×!ZZ33'æ†Ý`$þ€ 'ÿþæÿ:-ÿš„Læ!ZZ33'æ†Ý`$þ€ 'ÿþæÿ:-ÿ¦„Leù  33H[9(.†Ý`j@þ€J[9ÿþ(.ÿ"#jäG–±ûHKÖ€ à(  ¸¿l¤óæºdþ *þ¦„L)VV33ÿ(.'ì<†Ý` :ÿ  ¸""ÿÿ(.‡ý1þ€J[9ÿþ(.'ì<¦„L))VV33ÿ(.'ì<†Ý` :ÿ  ¸""ÿÿ(.‡ý1þ€J[9ÿþ(.'ì<¦„LÈ)VV'ì@þ€ 'ÿþì<ù„L$ìNNH[9(.'ì<†Ý`:ÿþ€ 'ÿþì<þ€J[9ÿþ(.ˆë>@þ€ 'ÿþì<ü„Lra˜˜33H[9(.†Ý`b@þ€J[9ÿþ(.ÿ"#b öà´'ì<ûHKÖ€ à(  ¸""(¹í±ÛÎÛCü„L9hZZ33H[9(.†Ý`$þ€J[9ÿþ(.ÿ:å\ÿÿÎÛCü„L’‘¯¯H[9(.'ì<†Ý`y@  ¸""þ€J[9ÿþ(.#"y‘ öà´'ì<ûHKÖ€ à   ¸"" ,All IAs in RELEASE message were processed.ü„L¡‘¯¯H[9(.'ì<†Ý`y@  ¸""þ€J[9ÿþ(.#"y‘ öà´'ì<ûHKÖ€ à   ¸"" ,All IAs in RELEASE message were processed.„LTë„„33H[9(.†Ý`N@þ€J[9ÿþ(.ÿ"#Nv´èJûHKÖ€ à ÿÿÿÿÿÿÿÿþ *þ„LBooH[9(.'ì<†Ý`9@  ¸""þ€J[9ÿþ(.#"9á èJ„Ð ¸  ¸""(¹í±ÛÎÛC X1 address granted. You may include IAADDR in IA option, if you want to provide a hint.à´'ì<ûHKÖ€ à   ¸"" ÿ þbravoexamplecom*CETþ  ¸  ¸33„LBooH[9(.'ì<†Ý`9@  ¸""þ€J[9ÿþ(.#"9á èJ„Ð ¸  ¸""(¹í±ÛÎÛC X1 address granted. You may include IAADDR in IA option, if you want to provide a hint.à´'ì<ûHKÖ€ à   ¸"" ÿ þbravoexamplecom*CETþ  ¸  ¸33„LÂ*²²33H[9(.†Ý`|@þ€J[9ÿþ(.ÿ"#|Jõ¬ËûHKÖ€ à(ÿÿÿÿÿÿÿÿ  ¸""(¹í±ÛÎÛC þ *þà´'ì<„Lk55H[9(.'ì<†Ý`ÿ@  ¸""þ€J[9ÿþ(.#"ÿÙÕõ¬ËJÐ ¸  ¸""(¹í±ÛÎÛC All addresses were assigned.à´'ì<ûHKÖ€ à   ¸"" ÿ þbravoexamplecom*CETþ  ¸  ¸33„L2k55H[9(.'ì<†Ý`ÿ@  ¸""þ€J[9ÿþ(.#"ÿÙÕõ¬ËJÐ ¸  ¸""(¹í±ÛÎÛC All addresses were assigned.à´'ì<ûHKÖ€ à   ¸"" ÿ þbravoexamplecom*CETþ  ¸  ¸33„Lã3‚‚33H[9(.†Ý`Lþ€J[9ÿþ(.ÿ:±çÿÿÎÛCÿÿÿÿ(.„LšãNN33ÿÎÛCH[9(.†Ý`:ÿÿÿÎÛC‡=  ¸""(¹í±ÛÎÛC„Lô‚‚33H[9(.†Ý`Lþ€J[9ÿþ(.ÿ:±çÿÿÎÛCÿÿÿÿ(.„Lµ   33H[9(.†Ý`j@þ€J[9ÿþ(.ÿ"#jæ”z}©ûHKÖ€ à(  ¸""(¹í±ÛÎÛCdþ *þ„L1 99H[9(.'ì<†Ý`@  ¸""þ€J[9ÿþ(.#"ólz}© "Your addresses are valid! Yahoo!(Ð ¸  ¸""(¹í±ÛÎÛC à´'ì<ûHKÖ€ à   ¸"" ÿ þbravoexamplecom*CET þ  ¸  ¸33„L1 99H[9(.'ì<†Ý`@  ¸""þ€J[9ÿþ(.#"ólz}© "Your addresses are valid! Yahoo!(Ð ¸  ¸""(¹í±ÛÎÛC à´'ì<ûHKÖ€ à   ¸"" ÿ þbravoexamplecom*CET þ  ¸  ¸33 „Là ˜˜33H[9(.†Ý`b@þ€J[9ÿþ(.ÿ"#bZVÎÄíà´'ì<ûHKÖ€ à(  ¸""(¹í±ÛÎÛC „L  ZZ33H[9(.†Ý`$þ€J[9ÿþ(.ÿ:å\ÿÿÎÛC „Lx' ¯¯H[9(.'ì<†Ý`y@  ¸""þ€J[9ÿþ(.#"y×]ÎÄíà´'ì<ûHKÖ€ à   ¸"" ,All IAs in RELEASE message were processed. „Lƒ' ¯¯H[9(.'ì<†Ý`y@  ¸""þ€J[9ÿþ(.#"y×]ÎÄíà´'ì<ûHKÖ€ à   ¸"" ,All IAs in RELEASE message were processed.„LÅZZ33H[9(.†Ý`$þ€J[9ÿþ(.ÿ:å\ÿÿÎÛCdibbler-1.0.1/tests/remote-autoconf/remote-autoconf0000775000175000017500000000022712233256142017346 00000000000000#!/bin/sh echo "\033[32mRemote Autoconf script." echo "Received remote address $1 from srv $2 on $3/$4" echo "Remote autoconf script complete.\033[0m" dibbler-1.0.1/tests/remote-autoconf/capture2.pcap0000664000175000017500000004204112233256142016703 00000000000000Ôò¡ÿÿqw„LÛyXXϯ¨EHÔ³Ïò  ÿ4 Õ9ÿÿÿÿy„LÅL ^^sŽS÷ENF€ßh # ÿ‰‰:×H‡z FAFCEPFIFJCOFEEFFAEFEOEFFECACAAA z„L v^^sŽS÷ENFR€ß+ # ÿ‰‰:×H‡z FAFCEPFIFJCOFEEFFAEFEOEFFECACAAA {„L©¦^^sŽS÷ENF~€Þÿ # ÿ‰‰:×H‡z FAFCEPFIFJCOFEEFFAEFEOEFFECACAAA “„LWÌAA!)™hÊE1@°À¨ïÿÿúll´NOTIFY * HTTP/1.1 HOST: 239.255.255.250:1900 CACHE-CONTROL: max-age=180 Location: http://192.168.21.1:5431/dyndev/uuid:0021-2999-68ca000099dc NT: upnp:rootdevice NTS: ssdp:alive SERVER:LINUX/2.4 UPnP/1.0 BRCM400/1.0 USN: uuid:0021-2999-68ca000099dc::upnp:rootdevice “„L.Þ<<!)™hÊE,@°À¨ïÿÿúll«ôNOTIFY * HTTP/1.1 HOST: 239.255.255.250:1900 CACHE-CONTROL: max-age=180 Location: http://192.168.21.1:5431/dyndev/uuid:0021-2999-68ca000099dc NT: uuid:0021-2999-68ca000099dc NTS: ssdp:alive SERVER:LINUX/2.4 UPnP/1.0 BRCM400/1.0 USN: uuid:0021-2999-68ca000099dc “„L—쉉!)™hÊEy@¯ÐÀ¨ïÿÿúlleENOTIFY * HTTP/1.1 HOST: 239.255.255.250:1900 CACHE-CONTROL: max-age=180 Location: http://192.168.21.1:5431/dyndev/uuid:0021-2999-68ca000099dc NT: urn:schemas-upnp-org:device:InternetGatewayDevice:1 NTS: ssdp:alive SERVER:LINUX/2.4 UPnP/1.0 BRCM400/1.0 USN: uuid:0021-2999-68ca000099dc::urn:schemas-upnp-org:device:InternetGatewayDevice:1 “„Lû!)™hÊEq@¯ØÀ¨ïÿÿúll]íÖNOTIFY * HTTP/1.1 HOST: 239.255.255.250:1900 CACHE-CONTROL: max-age=180 Location: http://192.168.21.1:5431/dyndev/uuid:0021-2999-68ca000099dc NT: urn:schemas-upnp-org:service:Layer3Forwarding:1 NTS: ssdp:alive SERVER:LINUX/2.4 UPnP/1.0 BRCM400/1.0 USN: uuid:0021-2999-68ca000099dc::urn:schemas-upnp-org:service:Layer3Forwarding:1 “„L$<<!)™hÊE,@°À¨ïÿÿúll«òNOTIFY * HTTP/1.1 HOST: 239.255.255.250:1900 CACHE-CONTROL: max-age=180 Location: http://192.168.21.1:5431/dyndev/uuid:0021-2999-68ca000099dc NT: uuid:0021-2999-68ca010099dc NTS: ssdp:alive SERVER:LINUX/2.4 UPnP/1.0 BRCM400/1.0 USN: uuid:0021-2999-68ca010099dc “„Lqq!)™hÊEa@¯èÀ¨ïÿÿúllM‡NOTIFY * HTTP/1.1 HOST: 239.255.255.250:1900 CACHE-CONTROL: max-age=180 Location: http://192.168.21.1:5431/dyndev/uuid:0021-2999-68ca000099dc NT: urn:schemas-upnp-org:device:WANDevice:1 NTS: ssdp:alive SERVER:LINUX/2.4 UPnP/1.0 BRCM400/1.0 USN: uuid:0021-2999-68ca010099dc::urn:schemas-upnp-org:device:WANDevice:1 “„Lµ#‘‘!)™hÊE@¯ÈÀ¨ïÿÿúllm÷¿NOTIFY * HTTP/1.1 HOST: 239.255.255.250:1900 CACHE-CONTROL: max-age=180 Location: http://192.168.21.1:5431/dyndev/uuid:0021-2999-68ca000099dc NT: urn:schemas-upnp-org:service:WANCommonInterfaceConfig:1 NTS: ssdp:alive SERVER:LINUX/2.4 UPnP/1.0 BRCM400/1.0 USN: uuid:0021-2999-68ca010099dc::urn:schemas-upnp-org:service:WANCommonInterfaceConfig:1 “„L 0<<!)™hÊE,@°À¨ïÿÿúll«ðNOTIFY * HTTP/1.1 HOST: 239.255.255.250:1900 CACHE-CONTROL: max-age=180 Location: http://192.168.21.1:5431/dyndev/uuid:0021-2999-68ca000099dc NT: uuid:0021-2999-68ca020099dc NTS: ssdp:alive SERVER:LINUX/2.4 UPnP/1.0 BRCM400/1.0 USN: uuid:0021-2999-68ca020099dc “„Lž>……!)™hÊEu@¯ÔÀ¨ïÿÿúllakJNOTIFY * HTTP/1.1 HOST: 239.255.255.250:1900 CACHE-CONTROL: max-age=180 Location: http://192.168.21.1:5431/dyndev/uuid:0021-2999-68ca000099dc NT: urn:schemas-upnp-org:device:WANConnectionDevice:1 NTS: ssdp:alive SERVER:LINUX/2.4 UPnP/1.0 BRCM400/1.0 USN: uuid:0021-2999-68ca020099dc::urn:schemas-upnp-org:device:WANConnectionDevice:1 “„L M!)™hÊEo@¯ÚÀ¨ïÿÿúll[-NOTIFY * HTTP/1.1 HOST: 239.255.255.250:1900 CACHE-CONTROL: max-age=180 Location: http://192.168.21.1:5431/dyndev/uuid:0021-2999-68ca000099dc NT: urn:schemas-upnp-org:service:WANIPConnection:1 NTS: ssdp:alive SERVER:LINUX/2.4 UPnP/1.0 BRCM400/1.0 USN: uuid:0021-2999-68ca020099dc::urn:schemas-upnp-org:service:WANIPConnection:1 “„L¤[!)™hÊEq@¯ØÀ¨ïÿÿúll]K2NOTIFY * HTTP/1.1 HOST: 239.255.255.250:1900 CACHE-CONTROL: max-age=180 Location: http://192.168.21.1:5431/dyndev/uuid:0021-2999-68ca000099dc NT: urn:schemas-upnp-org:service:WANPPPConnection:1 NTS: ssdp:alive SERVER:LINUX/2.4 UPnP/1.0 BRCM400/1.0 USN: uuid:0021-2999-68ca020099dc::urn:schemas-upnp-org:service:WANPPPConnection:1 •„L®XXϯ¨EHÔ´Ïñ  ÿ4 Õ9ÿÿÿÿ¦„L°.¢¢H[9(.†Ý`j@þ€J[9ÿþ(.ÿ"#jäóG–±ûHKÖ€ à(  ¸¿l¤óæºþ *þ§„LhXXH[9(.EH€9–ÿÿÿÿDC4ù ¡|hH[9(.c‚Sc52 ) voyager7 w ,/y*ÿ§„L PPϯ¨E@ÔµÿÐÍ  )CD,ÂÚ¡|h ) H[9(.zyxelc‚Sc5ÿÿÿ storczykowa.netÂÌŸÂ̘" dhcppc8:ú@;uð3ô€6 ÿ§„Lyç00H[9(.FÀ @øó )àû” àû§„L=FžžH[9(.EŽ@ÿ: )àûééz믄 _services_dns-sd_udplocal ” _workstation_tcpÀ#À4 ”voyager [48:5b:39:28:2e:17]À4§„L´®µµH[9(.E¥@ÿ# )àûéé‘ìÆ ab6e3f104af1c6fb000011118bd01002ip6arpaÿvoyagerlocalÿ410010in-addrÀPÿvoyager [48:5b:39:28:2e:17] _workstation_tcpÀbÿ2000000000000000À,ÿÀZx )Àm xÀZÀZ x I686LINUXÀ…!x ÀZÀ…”ÀZx  ¸À¹ xÀZÀZx  ¸¿l¤óæºÀ xÀZ§„L)š¢¢H[9(.†Ý`j@þ€J[9ÿþ(.ÿ"#jäG–±ûHKÖ€ à(  ¸¿l¤óæºdþ *þ§„LJÊXX'ì<†Ý` :ÿ  ¸""ÿÿ(.‡ý1þ€J[9ÿþ(.'ì<§„L¢ÊXXH[9(.†Ý` :ÿþ€J[9ÿþ(.  ¸""ˆ·ç`þ€J[9ÿþ(.H[9(.§„L×Ë""'ì<†Ý`ê@  ¸""þ€J[9ÿþ(.#"ê=ÓG–± 5Sorry, those addresses are not valid for this link.à´'ì<ûHKÖ€ à   ¸"" ÿ þbravoexamplecom*CET"þ  ¸  ¸33§„Lk„µµH[9(.E¥@ÿ# )àûéé‘ìÆ ab6e3f104af1c6fb000011118bd01002ip6arpaÿvoyagerlocalÿ410010in-addrÀPÿvoyager [48:5b:39:28:2e:17] _workstation_tcpÀbÿ2000000000000000À,ÿÀZx )Àm xÀZÀZ x I686LINUXÀ…!x ÀZÀ…”ÀZx  ¸À¹ xÀZÀZx  ¸¿l¤óæºÀ xÀZ§„L¨V µµH[9(.E¥@ÿ# )àûéé‘ìÆ ab6e3f104af1c6fb000011118bd01002ip6arpaÿvoyagerlocalÿ410010in-addrÀPÿvoyager [48:5b:39:28:2e:17] _workstation_tcpÀbÿ2000000000000000À,ÿÀZx )Àm xÀZÀZ x I686LINUXÀ…!x ÀZÀ…”ÀZx  ¸À¹ xÀZÀZx  ¸¿l¤óæºÀ xÀZ§„Luf ——H[9(.E‡@ÿA )àûéés쨄 ab6e3f104af1c6fb000011118bd01002ip6arpa €xvoyagerlocalÀ`€x )410010in-addrÀP €xÀ`À` €x I686LINUXvoyager [48:5b:39:28:2e:17] _workstation_tcpÀh!€x À`À¶€”À`€x  ¸2000000000000000À, €xÀ`À`€x  ¸¿l¤ó溨„LužžH[9(.EŽ@ÿ: )àûééz믄 _services_dns-sd_udplocal ” _workstation_tcpÀ#À4 ”voyager [48:5b:39:28:2e:17]À4¨„LÓ,,H[9(.H[9(. ) ¨„L2Ô>>ϯ¨ϯ¨ H[9(. )¨„LKÔCCH[9(.E3T¸@º )ÂÌŸÍ`5l'ÓÓlocal¨„L%ŽŽϯ¨E~@ûxÂÌŸ )5Í`jàÓÓƒlocal "@a root-serversnetnstld verisign-grscomwÏŒ„ :€Q€¨„LCCH[9(.E3T¹@º )ÂÌŸ|5l'"ílocal¨„L0 ŽŽϯ¨E~s@û XÂÌŸ )5|jÍ"íƒlocal@a root-serversnetnstld verisign-grscomwÏŒ„ :€Q€¨„LøŠ LLH[9(.E<±@@² )ÂÌŸ§-5(l0Yntpubuntucom¨„L§‹ ——H[9(.E‡@ÿA )àûéés쨄 ab6e3f104af1c6fb000011118bd01002ip6arpa €xvoyagerlocalÀ`€x )410010in-addrÀP €xÀ`À` €x I686LINUXvoyager [48:5b:39:28:2e:17] _workstation_tcpÀh!€x À`À¶€”2000000000000000À, €xÀ`À`€x  ¸¿l¤óæºÀ`€x  ¸¨„LâÍ ‰‰ϯ¨EyÅÉ@ûM³ÂÌŸ )5§-e×Y€ntpubuntucomÀ1ns1 canonicalÀ hostmasterÀ0wÏ‹>*0 :€¨„LÏ \\H[9(.EL± @@ )ÂÌŸ f58l@O~ntpubuntucom storczykowanet©„L‘ÄŽŽϯ¨E~s @û WÂÌŸ )5 fj(MO~ƒntpubuntucom storczykowanetÀ&thirdeyeÀrootÀ< ùc„6„L”ÅLLH[9(.E<±ƒ@@7 )ÂÌŸî5(l0Ç×ntpubuntucom©„LF\\ϯ¨EL@ûªÂÌŸ )5î8MÇ×€ntpubuntucomÀ B[½^©„L\\H[9(.EL@@v· )[½^{{8Ä3ãúÐ.)n*¾©„LR`\\ϯ¨EL@5·[½^ ){{8³Ê$ìêÁOíÐ.Œã7•ðäÐ.)n*¾Ð.)aœixÐ.)až=j©„La\\H[9(.EL@@v· )[½^{{8Ä3ãúÐ.){ʸ©„LD.\\ϯ¨EL@5·[½^ ){{8ž$ìêÁOíÐ.Œã7•ðäÐ.){ʸÐ.)o-J_Ð.)o.¼©„L/\\H[9(.EL@@v· )[½^{{8Ä3ãúÐ.)‰JG©„L \\ϯ¨EL@5·[½^ ){{8H³$ìêÁOíÐ.Œã7•ðäÐ.)‰JGÐ.)|ëaîÐ.)|ìø±©„L{ \\H[9(.EL@@v· )[½^{{8Ä3ãúÐ.)—ø©„LÒ \\ϯ¨EL@5·[½^ ){{8@$ìêÁOíÐ.Œã7•ðäÐ.)—øÐ.)Š‘‘öÐ.)Š“¼ª„L,”H[9(.Eÿ@ÿÉ )àûééëì „ _services_dns-sd_udplocal ” _workstation_tcpÀ#À4 ”voyager [48:5b:39:28:2e:17]À4ÀT€”ÀT!€x voyagerÀ#À‘€x  ¸À‘€x  ¸¿l¤óæºÀ‘€x )ª„LÀ¬ ——H[9(.E‡@ÿA )àûéés쨄 ab6e3f104af1c6fb000011118bd01002ip6arpa €xvoyagerlocalÀ`€x )410010in-addrÀP €xÀ`À` €x I686LINUXvoyager [48:5b:39:28:2e:17] _workstation_tcpÀh!€x À`À¶€”2000000000000000À, €xÀ`À`€x  ¸¿l¤óæºÀ`€x  ¸¬„LÃ+>>"°F½ÖEÀ²_Ÿ !àâî !àâLÛ¿XXH[9(.†Ý` :ÿþ€J[9ÿþ(.  ¸""‡y  ¸""H[9(.¬„L ÁPP'ì<†Ý`:ÿ  ¸""þ€J[9ÿþ(.ˆè¼@  ¸""­„Lò00H[9(.FÀ @øó )àû” àû³„L²wXXϯ¨EHÔ¶Ïï  ÿ4 Õ9ÿÿÿÿÄLÙyõõsŽS÷EåHI€Ü # ÿŠŠÑ‡ #Š» FHEPFCELFDEFFCFGCNEEDCDBDBEDDDCA EHFCFFFAEBFPFCEPECEPEDFKEBCACABOÿSMB%!è!V2\MAILSLOT\BROWSE€ü WORKSERV-D211C3UªÏ„L•0AA!)™hÊE1@°À¨ïÿÿúll´NOTIFY * HTTP/1.1 HOST: 239.255.255.250:1900 CACHE-CONTROL: max-age=180 Location: http://192.168.21.1:5431/dyndev/uuid:0021-2999-68ca000099dc NT: upnp:rootdevice NTS: ssdp:alive SERVER:LINUX/2.4 UPnP/1.0 BRCM400/1.0 USN: uuid:0021-2999-68ca000099dc::upnp:rootdevice Ï„LþG<<!)™hÊE,@°À¨ïÿÿúll«ôNOTIFY * HTTP/1.1 HOST: 239.255.255.250:1900 CACHE-CONTROL: max-age=180 Location: http://192.168.21.1:5431/dyndev/uuid:0021-2999-68ca000099dc NT: uuid:0021-2999-68ca000099dc NTS: ssdp:alive SERVER:LINUX/2.4 UPnP/1.0 BRCM400/1.0 USN: uuid:0021-2999-68ca000099dc Ï„LßV‰‰!)™hÊEy@¯ÐÀ¨ïÿÿúlleENOTIFY * HTTP/1.1 HOST: 239.255.255.250:1900 CACHE-CONTROL: max-age=180 Location: http://192.168.21.1:5431/dyndev/uuid:0021-2999-68ca000099dc NT: urn:schemas-upnp-org:device:InternetGatewayDevice:1 NTS: ssdp:alive SERVER:LINUX/2.4 UPnP/1.0 BRCM400/1.0 USN: uuid:0021-2999-68ca000099dc::urn:schemas-upnp-org:device:InternetGatewayDevice:1 Ï„Le!)™hÊEq@¯ØÀ¨ïÿÿúll]íÖNOTIFY * HTTP/1.1 HOST: 239.255.255.250:1900 CACHE-CONTROL: max-age=180 Location: http://192.168.21.1:5431/dyndev/uuid:0021-2999-68ca000099dc NT: urn:schemas-upnp-org:service:Layer3Forwarding:1 NTS: ssdp:alive SERVER:LINUX/2.4 UPnP/1.0 BRCM400/1.0 USN: uuid:0021-2999-68ca000099dc::urn:schemas-upnp-org:service:Layer3Forwarding:1 Ï„L8q<<!)™hÊE,@°À¨ïÿÿúll«òNOTIFY * HTTP/1.1 HOST: 239.255.255.250:1900 CACHE-CONTROL: max-age=180 Location: http://192.168.21.1:5431/dyndev/uuid:0021-2999-68ca000099dc NT: uuid:0021-2999-68ca010099dc NTS: ssdp:alive SERVER:LINUX/2.4 UPnP/1.0 BRCM400/1.0 USN: uuid:0021-2999-68ca010099dc Ï„L÷~qq!)™hÊEa@¯èÀ¨ïÿÿúllM‡NOTIFY * HTTP/1.1 HOST: 239.255.255.250:1900 CACHE-CONTROL: max-age=180 Location: http://192.168.21.1:5431/dyndev/uuid:0021-2999-68ca000099dc NT: urn:schemas-upnp-org:device:WANDevice:1 NTS: ssdp:alive SERVER:LINUX/2.4 UPnP/1.0 BRCM400/1.0 USN: uuid:0021-2999-68ca010099dc::urn:schemas-upnp-org:device:WANDevice:1 Ï„Ló‘‘!)™hÊE@¯ÈÀ¨ïÿÿúllm÷¿NOTIFY * HTTP/1.1 HOST: 239.255.255.250:1900 CACHE-CONTROL: max-age=180 Location: http://192.168.21.1:5431/dyndev/uuid:0021-2999-68ca000099dc NT: urn:schemas-upnp-org:service:WANCommonInterfaceConfig:1 NTS: ssdp:alive SERVER:LINUX/2.4 UPnP/1.0 BRCM400/1.0 USN: uuid:0021-2999-68ca010099dc::urn:schemas-upnp-org:service:WANCommonInterfaceConfig:1 Ï„LFš<<!)™hÊE,@°À¨ïÿÿúll«ðNOTIFY * HTTP/1.1 HOST: 239.255.255.250:1900 CACHE-CONTROL: max-age=180 Location: http://192.168.21.1:5431/dyndev/uuid:0021-2999-68ca000099dc NT: uuid:0021-2999-68ca020099dc NTS: ssdp:alive SERVER:LINUX/2.4 UPnP/1.0 BRCM400/1.0 USN: uuid:0021-2999-68ca020099dc Ï„L©……!)™hÊEu@¯ÔÀ¨ïÿÿúllakJNOTIFY * HTTP/1.1 HOST: 239.255.255.250:1900 CACHE-CONTROL: max-age=180 Location: http://192.168.21.1:5431/dyndev/uuid:0021-2999-68ca000099dc NT: urn:schemas-upnp-org:device:WANConnectionDevice:1 NTS: ssdp:alive SERVER:LINUX/2.4 UPnP/1.0 BRCM400/1.0 USN: uuid:0021-2999-68ca020099dc::urn:schemas-upnp-org:device:WANConnectionDevice:1 Ï„Lf·!)™hÊEo@¯ÚÀ¨ïÿÿúll[-NOTIFY * HTTP/1.1 HOST: 239.255.255.250:1900 CACHE-CONTROL: max-age=180 Location: http://192.168.21.1:5431/dyndev/uuid:0021-2999-68ca000099dc NT: urn:schemas-upnp-org:service:WANIPConnection:1 NTS: ssdp:alive SERVER:LINUX/2.4 UPnP/1.0 BRCM400/1.0 USN: uuid:0021-2999-68ca020099dc::urn:schemas-upnp-org:service:WANIPConnection:1 Ï„LÙÅ!)™hÊEq@¯ØÀ¨ïÿÿúll]K2NOTIFY * HTTP/1.1 HOST: 239.255.255.250:1900 CACHE-CONTROL: max-age=180 Location: http://192.168.21.1:5431/dyndev/uuid:0021-2999-68ca000099dc NT: urn:schemas-upnp-org:service:WANPPPConnection:1 NTS: ssdp:alive SERVER:LINUX/2.4 UPnP/1.0 BRCM400/1.0 USN: uuid:0021-2999-68ca020099dc::urn:schemas-upnp-org:service:WANPPPConnection:1 Ñ„LÛDXXϯ¨EHÔ·Ïî  ÿ4 Õ9ÿÿÿÿÔ„Lð >>sŽS÷sŽS÷ # k‡´PDèD·küÕ„Læ) ^^sŽS÷ENHy€Ý # ÿ‰‰:×A‡ FAFCEPFIFJCOFEEFFAEFEOEFFECACAAA Ö„L%S^^sŽS÷ENHz€Ý # ÿ‰‰:×A‡ FAFCEPFIFJCOFEEFFAEFEOEFFECACAAA ׄL̃^^sŽS÷ENH|€Ý # ÿ‰‰:×A‡ FAFCEPFIFJCOFEEFFAEFEOEFFECACAAA dibbler-1.0.1/tests/remote-autoconf/server-2.conf0000664000175000017500000000103012233256142016616 00000000000000log-level 8 log-mode short preference 1 experimental iface "eth1" { t1 1800-2000 t2 2700-3000 prefered-lifetime 3600 valid-lifetime 7200 unicast 2001:db8:2222::f rapid-commit 1 class { pool 2001:db8:2222::/64 } option dns-server 2000::ff,2000::fe option domain bravo.example.com option ntp-server 2000::200,2000::201,2000::202 option time-zone CET option sip-server 2000::300,2000::302,2000::303,2000::304 option sip-domain sip1.example.com,sip2.example.com option neighbors 2001:db8:1111::f,2001:db8:3333::f } dibbler-1.0.1/tests/remote-autoconf/capture3.pcap0000664000175000017500000000500212233256142016700 00000000000000Ôò¡ÿÿq„Lï.††H[9(.†Ý`N@þ€J[9ÿþ(.ÿ"#Nv´èJûHKÖ€ à ÿÿÿÿÿÿÿÿþ *þ„La‡qq'ì<†Ý`9@  ¸""þ€J[9ÿþ(.#"9á èJ„Ð ¸  ¸""(¹í±ÛÎÛC X1 address granted. You may include IAADDR in IA option, if you want to provide a hint.à´'ì<ûHKÖ€ à   ¸"" ÿ þbravoexamplecom*CETþ  ¸  ¸33„LÃm´´H[9(.†Ý`|@þ€J[9ÿþ(.ÿ"#|Jõ¬ËûHKÖ€ à(ÿÿÿÿÿÿÿÿ  ¸""(¹í±ÛÎÛC þ *þà´'ì<„Lš®77'ì<†Ý`ÿ@  ¸""þ€J[9ÿþ(.#"ÿÙÕõ¬ËJÐ ¸  ¸""(¹í±ÛÎÛC All addresses were assigned.à´'ì<ûHKÖ€ à   ¸"" ÿ þbravoexamplecom*CETþ  ¸  ¸33„LÉv „„H[9(.†Ý`Lþ€J[9ÿþ(.ÿ:±çÿÿÎÛCÿÿÿÿ(.„L %PPH[9(.†Ý`:ÿÿÿÎÛC‡=  ¸""(¹í±ÛÎÛC„LL2 „„H[9(.†Ý`Lþ€J[9ÿþ(.ÿ:±çÿÿÎÛCÿÿÿÿ(. „Lf ¢¢H[9(.†Ý`j@þ€J[9ÿþ(.ÿ"#jæ”z}©ûHKÖ€ à(  ¸""(¹í±ÛÎÛCdþ *þ „L:,;;'ì<†Ý`@  ¸""þ€J[9ÿþ(.#"ólz}© "Your addresses are valid! Yahoo!(Ð ¸  ¸""(¹í±ÛÎÛC à´'ì<ûHKÖ€ à   ¸"" ÿ þbravoexamplecom*CET þ  ¸  ¸33 „L¿:ššH[9(.†Ý`b@þ€J[9ÿþ(.ÿ"#bZVÎÄíà´'ì<ûHKÖ€ à(  ¸""(¹í±ÛÎÛC „LãT\\H[9(.†Ý`$þ€J[9ÿþ(.ÿ:å\ÿÿÎÛC „L¼_±±'ì<†Ý`y@  ¸""þ€J[9ÿþ(.#"y×]ÎÄíà´'ì<ûHKÖ€ à   ¸"" ,All IAs in RELEASE message were processed.„Lrì\\H[9(.†Ý`$þ€J[9ÿþ(.ÿ:å\ÿÿÎÛCdibbler-1.0.1/tests/remote-autoconf/server-3.conf0000664000175000017500000000047612233256142016634 00000000000000log-level 8 log-mode short preference 0 experimental iface "eth1" { unicast 2001:db8:3333::f rapid-commit 1 class { pool 2001:db8:3333::/64 } option dns-server 2001:db8:3333::f option neighbors 2001:db8:1111::f,2001:db8:2222::f # send those extra options to the client option 1234-0x012345679abcdef } dibbler-1.0.1/tests/remote-autoconf/client.conf0000664000175000017500000000063312233256142016437 00000000000000# # Example client configuration file: default # # Uncomment following line to make confirm enable at start #skip-confirm log-mode short log-colors 1 # 7 = omit debug messages log-level 8 experimental remote-autoconf iface "eth0" { ia unicast 1 option dns-server option domain option nis-server option nis-domain option nis+-server option nis+-domain option time-zone option lifetime } dibbler-1.0.1/tests/LowLevel/0000755000175000017500000000000012277734640013024 500000000000000dibbler-1.0.1/tests/LowLevel/test1.cpp0000664000175000017500000000131512233256142014476 00000000000000 #include #include "Portable.h" int main() { char dev[] = "eth0"; char prefix[] = "2000::"; int len = 64; int result; domain_add("eth0", 4, "example.com"); domain_add("eth0", 4, "klub.com.pl"); getwchar(); domain_del("eth0", 4, "example.com"); getwchar(); domain_del("eth0", 4, "klub.com.pl"); #if 0 lowlevelInit(); printf("Adding %s/%d prefix to %s interface\n", prefix, len, dev); result = prefix_add(dev, 4, prefix, len); printf("RESULT=%d\n", result); getwchar(); result = printf("Deleting the same prefix\n"); prefix_del(dev, 4, prefix, len); printf("RESULT=%d\n", result); lowlevelExit(); #endif return 0; } dibbler-1.0.1/tests/3.2-relay/0000755000175000017500000000000012277734640012707 500000000000000dibbler-1.0.1/tests/3.2-relay/relay1.conf0000664000175000017500000000131612233256142014662 00000000000000log-level 8 log-mode short # messages will be forwarded on this interface using multicast #iface eth1 { # server multicast yes // relay messages on this interface to ff05::1:3 # server unicast 6010::1 // relay messages on this interface to this global address #} iface eth2 { server multicast yes // relay messages on this interface to ff05::1:3 # server unicast 6011::1 // relay messages on this interface to this global address } # client can send messages to multicast # (or specific link-local addr) on this link iface eth0 { client multicast yes // bind ff02::1:2 # client unicast 6021::1 // bind this address interface-id 6021 } dibbler-1.0.1/tests/3.2-relay/server.conf0000664000175000017500000000025312233256142014772 00000000000000log-level 7 log-mode short iface relay1 { relay eth0 interface-id 6011 rapid-commit 1 T1 1000 T2 2000 // for all the others class { pool 6020::20-6020::ff } } dibbler-1.0.1/tests/3.2-relay/relay2.conf0000664000175000017500000000137512233256142014670 00000000000000log-level 8 log-mode full # messages will be forwarded on this interface using multicast iface eth2 { server multicast yes // relay messages on this interface to ff05::1:3 # server unicast 6000::10 // relay messages on this interface to this global address } # client can send messages to multicast # (or specific link-local addr) on this link iface eth0 { client multicast yes // bind ff02::1:2 # client unicast 6010::1 // bind this address interface-id 6010 } iface eth1 { client multicast yes // bind ff02::1:2 # client unicast 6011::1 // bind this address interface-id 6011 } iface eth3 { client multicast yes // bind ff02::1:2 # client unicast 6020::1 // bind this address interface-id 6020 } dibbler-1.0.1/tests/tahi/0000755000175000017500000000000012277734640012220 500000000000000dibbler-1.0.1/tests/tahi/info.txt0000664000175000017500000000072612233256142013627 00000000000000 Scripts for TAHI tests ------------------------ Scripts in this directory can be used to run TAHI tests on Dibbler. They are in a very early stage of development, so they are not very usable yet. TODO: - remove server-AddrMgr.xml after test (otherwise following tests get NoAddrAvail) - check that server indeed started after start attempt - check that server indeed stopped after stop attempt - get additional files (dibbler-server.log, server-cache.xml, etc.) dibbler-1.0.1/tests/tahi/dhcp6s.rmt0000775000175000017500000003612312233256142014051 00000000000000#!/usr/bin/perl # # Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005 Yokogawa Electric Corporation, # YDC Corporation, IPA (Information-technology Promotion Agency, Japan). # All rights reserved. # # Redistribution and use of this software in source and binary forms, with # or without modification, are permitted provided that the following # conditions and disclaimer are agreed and accepted by the user: # # 1. Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # # 2. Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the distribution. # # 3. Neither the names of the copyrighters, the name of the project which # is related to this software (hereinafter referred to as "project") nor # the names of the contributors may be used to endorse or promote products # derived from this software without specific prior written permission. # # 4. No merchantable use may be permitted without prior written # notification to the copyrighters. However, using this software for the # purpose of testing or evaluating any products including merchantable # products may be permitted without any notification to the copyrighters. # # # # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHTERS, THE PROJECT AND # CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING # BUT NOT LIMITED THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS # FOR A PARTICULAR PURPOSE, ARE DISCLAIMED. IN NO EVENT SHALL THE # COPYRIGHTERS, THE PROJECT OR 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. # # $TAHI: dhcpv6.p2/remote/manual/dhcp6s.rmt,v 1.3 2010/03/29 23:34:22 mario Exp $ # use V6evalRemote; use File::Basename; my $basename = "Dibbler-srv"; my $prompt = "$basename> "; my $CFGFILE_PATH = "/etc/dibbler/server.conf"; my $DUIDFILE_PATH = "/var/lib/dibbler/server-duid"; my $LOGFILE_PATH = "/var/log/dibbler/dibbler-server.log"; my @FILES_PATH = { $LOGFILE_PATH, $CFGFILE_PATH, $DUIDFILE_PATH, "/var/lib/dibbler/server-cache.xml", "/var/lib/dibbler/server-AddrMgr.xml", "/var/lib/dibbler/server-CfgMgr.xml", "/var/lib/dibbler/server-IfaceMgr.xml", "/var/lib/dibbler/server-TransMgr.xml" }; print "#### arguments passed to dhcp6s.rmt:"; for my $arg (@ARGV) { print $arg ." "; } print "\n"; # print "# BEFORE rOpen()=".$V6evalRemote::Device."\n"; rOpen(); # print "# BEFORE rArg()=".$V6evalRemote::Device."\n"; rArg() || goto error; # print "# AFTER rArg()=".$V6evalRemote::Device."\n"; # print "# rOpt_link0=". $rOpt_link0."\n"; print "\n"; if(defined($rOpt_start)){ if (!defined($rOpt_link0) ){ print "lio_start". "\n"; print $prompt."NG:The interface used by Dibbler Server test has not been defined in the configuration file."; print $prompt."Please define it!"; print "lio_stop". "\n"; goto error; } open(CFG, ">server.conf") or die("Failed to create server.conf: $!"); print CFG "# server.conf for Dibbler-server. Autogenerated by TAHI tests.\n"; print CFG "# It will be overwritten with the next test. Do not edit!\n\n"; print CFG "log-level 8\n"; print CFG "log-mode full\n"; print CFG "\n"; print "lio_start". "\n"; print $prompt . "Set parameters of Dibbler Server manually as following:\n\n"; if(defined($rOpt_stateless)){ print CFG "stateless\n"; } if(defined($rOpt_duid)){ print $prompt."Please set the DUID type using by Server to $rOpt_duid.\n"; } if(defined($rOpt_link0) ){ print CFG "iface $rOpt_link0 {\n"; } # TODO: Duid is written to /var/lib/dibbler/server-duid if(defined($rOpt_valduid)){ open(DUID, ">server-duid") or die("Failed to create server-duid file: $!"); print DUID "$rOpt_valduid"; close(DUID); } else { unlink("server-duid"); } if(defined($rOpt_preference)){ if("default" eq $rOpt_preference){ #print $prompt."Please set the Server Preference value to default value.\n"; } else{ print CFG " preference ".$rOpt_preference."\n"; #print $prompt."Please set the Server Preference value to $rOpt_preference.\n"; } } if(defined($rOpt_startaddr) && (defined($rOpt_endaddr))){ print CFG " preferred-lifetime 10000\n"; print CFG " valid-lifetime 20000\n"; print CFG " t1 5000\n"; print CFG " t2 16000\n"; print CFG " class {\n"; print CFG " pool ".$rOpt_startaddr." - ".$rOpt_endaddr."\n"; print CFG " }\n"; } if(defined($rOpt_reconf)){ # NOT SUPPORTED by Dibbler print $prompt."Please enable the Reconfigure.\n"; } if(defined($rOpt_rapidcommit)){ print CFG " rapid-commit true\n"; } if(defined($rOpt_allowoptions)){ # Not supported by Dibbler print $prompt."Please set the server to allow the option: $rOpt_allowoptions.\n"; } if(defined($rOpt_onlypermit)){ # Not supported by Dibbler print $prompt."Please set the server which only allows the option: $rOpt_onlypermit.\n"; } if(defined($rOpt_sendoptions)){ print CFG " option ".$rOpt_sendoptions." string \"customoption.example.org\"\n"; } if(defined($rOpt_authentication)){ # Not supported by Dibbler print $prompt."Please set the Authentication protocol:"; if($rOpt_authentication eq "delayed"){ print $prompt."Delayed Authentication Protocol.\n"; } elsif($rOpt_authentication eq "reconfigure"){ print $prompt."Reconfigure Key Authentication Protocol.\n"; } else{ print $prompt."$rOpt_authentication.\n"; } print $prompt."Please set the Authentication parameter.\n"; print $prompt."\tREALM: $rOpt_auth_realm\n"; print $prompt."\tKey ID: $rOpt_auth_keid\n"; print $prompt."\tShared Secret Key: $rOpt_auth_sharedsecretkey\n"; } if("notset" eq $rOpt_delegateprefix){ print CFG "# prefix delegation disabled.\n"; } elsif(defined($rOpt_delegateprefix) && defined($rOpt_delegateprefixlength)){ print CFG " pd-class {\n"; print CFG " pd-pool ".$rOpt_delegateprefix."/".$rOpt_delegateprefixlength."\n"; #print $prompt."Please set server with the delegate prefix: $rOpt_delegateprefix.\n"; #print $prompt."And the length of prefix: $rOpt_delegateprefixlength.\n"; if(defined($rOpt_additional_delegateprefix)){ print $prompt."Please set server with the additional delegate prefix: $rOpt_additional_delegateprefix.\n"; print $prompt."And the length of prefix: $rOpt_delegateprefixlength.\n"; } if (defined($rOpt_renewtime)){ print CFG " t1 ".$rOpt_renewtime."\n"; #print $prompt."Please set the T1 of IA_PD option to $rOpt_renewtime.\n"; } else{ print CFG " t1 500\n"; #print $prompt."Please set the T1 of IA_PD to 500.\n"; } if (defined($rOpt_rebindtime)){ print CFG " t2 ".$rOpt_rebindtime."\n"; #print $prompt."Please set the T2 of IA_PD option to $rOpt_rebindtime.\n"; } else{ print CFG " t2 800\n"; #print $prompt."Please set the T2 of IA_PD to 800.\n"; } #if (defined($rOpt_pltimeiapd)){ if (defined($rOpt_preferredlifetime)){ # print $prompt."Please set the preferred time of IA_PD prefix option to $rOpt_pltimeiapd.\n"; print $prompt."Please set the preferred time of IA_PD prefix option to $rOpt_preferredlifetime.\n"; # if(defined($rOpt_vltimeiapd)){ if(defined($rOpt_validlifetime)){ # print $prompt."Please set the valid time of IA_PD prefix option to $rOpt_vltimeiapd.\n"; print $prompt."Please set the valid time of IA_PD prefix option to $rOpt_validlifetime.\n"; } } # In a message sent by a delegating router the preferred and valid # lifetimes should be set to the values of AdvPreferredLifetime and # AdvValidLifetime as specified in section 6.2.1, "Router Configuration # Variables" of RFC 2461 [4], unless administratively configured. else{ print $prompt."Please set the preferred time of IA_PD prefix option to the default value AdvPreferredLifetime(604800 s).\n"; print $prompt."Please set the valid time of IA_PD prefix option to the default value AdvValidLifetime(2592000 s).\n"; } print CFG " }\n"; # end of pd-class } if(defined($rOpt_other_delegateprefix) && defined($rOpt_delegateprefixlength)){ print $prompt."Please set server with the other delegate prefix: $rOpt_other_delegateprefix.\n"; print $prompt."And the length of prefix: $rOpt_other_delegateprefixlength.\n"; if (defined($rOpt_renewtime)){ print $prompt."Please set the T1 of IA_PD option to $rOpt_renewtime.\n"; } else{ print $prompt."Please set the T1 of IA_PD to 500.\n"; } if (defined($rOpt_rebindtime)){ print $prompt."Please set the T2 of IA_PD option to $rOpt_rebindtime.\n"; } else{ print $prompt."Please set the T2 of IA_PD to 800.\n"; } #if (defined($rOpt_pltimeiapd)){ if (defined($rOpt_preferredlifetime)){ # print $prompt."Please set the preferred time of IA_PD prefix option to $rOpt_pltimeiapd.\n"; print $prompt."Please set the preferred time of IA_PD prefix option to $rOpt_preferredlifetime.\n"; # if(defined($rOpt_vltimeiapd)){ if(defined($rOpt_validlifetime)){ # print $prompt."Please set the valid time of IA_PD prefix option to $rOpt_vltimeiapd.\n"; print $prompt."Please set the valid time of IA_PD prefix option to $rOpt_validlifetime.\n"; } } # In a message sent by a delegating router the preferred and valid # lifetimes should be set to the values of AdvPreferredLifetime and # AdvValidLifetime as specified in section 6.2.1, "Router Configuration # Variables" of RFC 2461 [4], unless administratively configured. else{ print $prompt."Please set the preferred time of IA_PD prefix option to the default value AdvPreferredLifetime(604800 s).\n"; print $prompt."Please set the valid time of IA_PD prefix option to the default value AdvValidLifetime(2592000 s).\n"; } } if(defined($rOpt_delegateprefix2) && defined($rOpt_length2)){ print $prompt."\n"; print $prompt."Please set server with the next delegate prefix: $rOpt_delegateprefix2.\n"; print $prompt."And the length of prefix: $rOpt_length2.\n"; print $prompt."Please set the T1 of IA_PD to 500.\n"; print $prompt."Please set the T2 of IA_PD to 800.\n"; print $prompt."Please set the preferred time of IA_PD prefix option to the default value AdvPreferredLifetime(604800 s).\n"; print $prompt."Please set the valid time of IA_PD prefix option to the default value AdvValidLifetime(2592000 s).\n"; } if(defined($rOpt_dns)){ print CFG " option dns-server $rOpt_dns\n"; } if(defined($rOpt_domainlist)){ print CFG " option domain $rOpt_domainlist\n"; } if(defined($rOpt_sipd)){ print CFG " option sip-domain $rOpt_sipd\n"; } if(defined($rOpt_sipa)){ print CFG " option sip-server $rOpt_sipa\n"; } print CFG "}\n"; close(CFG); send_file("server.conf", $CFGFILE_PATH); if (defined($rOpt_valduid)) { send_file("server-duid", $DUIDFILE_PATH); } # ---------------Begin start--------------------------- linux_start_dibbler_server(); print $prompt."Dibbler server started. Please verify!\n"; print $prompt."Then press the Enter.\a\n"; #print "lio_stop". "\n"; } elsif(defined($rOpt_stop)){ #print "lio_start". "\n"; linux_stop_dibbler_server(); print $prompt."Please stop the Dibbler Server!\n"; print $prompt."Then press the Enter.\a\n"; #print "lio_stop". "\n"; } elsif(defined($rOpt_restart)){ #print "lio_start". "\n"; linux_stop_dibbler_server(); linux_start_dibbler_server(); print $prompt."Please restart the Dibbler Server!\n"; print $prompt."Then press the Enter.\a\n"; #print "lio_stop". "\n"; } #; rClose(); exit($V6evalRemote::exitPass); error: rClose(); exit($V6evalRemote::exitFail); sub linux_start_dibbler_server() { print "Starting dibbler-server\n"; my $cmd = "dibbler-server start"; my $status = rCommand($cmd, 5); my $output = rCmdOutput(); if ($status != 1) { print "Failed to execute [".$cmd."]. Output:\n"; print "---remote-output-start----------\n"; print $output."\n"; print "---remote-output-end------------\n"; return(0); } if ($V6evalRemote::debug) { print "---remote-output-start----------\n"; print $output."\n"; print "---remote-output-end------------\n"; } return (1); } sub linux_stop_dibbler_server() { print "Stopping dibbler-server\n"; my $cmd = "dibbler-server stop"; my $status = rCommand($cmd, 5); my $output = rCmdOutput(); if ($status != 1) { print "Failed to execute [".$cmd."]. Output:\n"; print "---remote-output-start----------\n"; print $output."\n"; print "---remote-output-end------------\n"; return(0); } if ($V6evalRemote::debug) { print "---remote-output-start----------\n"; print $output."\n"; print "---remote-output-end------------\n"; } return (1); } sub send_file() { my($from_local, $to_remote, $timeout)=@_; my $use_rPutfile = 0; if ($use_rPutfile) { my $result = rPutfile($from_local, $to_remote, 5); print "Sent file ".$from_local." to ".$to_remote.", timeout=5, result=".$result."\n"; } else { my $content = ""; if (!open(CFG, $from_local)) { print "Failed to open server.conf $!"; goto error; } while () { $content .= $_; } close(CFG); $cmd = "/bin/echo \"".$content."\" > ".$to_remote; $result = rCommand($cmd, 5); print "Sent file ".$from_local." to ".$to_remote.", timeout=5, result=".$result."\n"; } } __END__ =head1 NAME B - XXX =head1 SYNOPSIS B [-commonoption ...] [XXX=XXX] [XXX="XXX"] =head1 DESCRIPTION B XXX Default timeout value is five seconds. Do ``perldoc V6evalRemote'' for common options. B option works only if B is "nec-libra". =head1 RETURN VALUES The B exits with one of the following values: 0 command completed successfully 1 command failed =head1 SEE ALSO perldoc V6evalRemote =cut dibbler-1.0.1/tests/Makefile0000664000175000017500000004436512561700376012664 00000000000000# Makefile.in generated by automake 1.14.1 from Makefile.am. # tests/Makefile. Generated from Makefile.in by configure. # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/dibbler pkgincludedir = $(includedir)/dibbler pkglibdir = $(libdir)/dibbler pkglibexecdir = $(libexecdir)/dibbler am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = x86_64-unknown-linux-gnu host_triplet = x86_64-unknown-linux-gnu subdir = tests DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/libtool.m4 \ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/include/dibbler-config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = AM_V_P = $(am__v_P_$(V)) am__v_P_ = $(am__v_P_$(AM_DEFAULT_VERBOSITY)) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_$(V)) am__v_GEN_ = $(am__v_GEN_$(AM_DEFAULT_VERBOSITY)) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_$(V)) am__v_at_ = $(am__v_at_$(AM_DEFAULT_VERBOSITY)) am__v_at_0 = @ am__v_at_1 = SOURCES = DIST_SOURCES = RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \ ctags-recursive dvi-recursive html-recursive info-recursive \ install-data-recursive install-dvi-recursive \ install-exec-recursive install-html-recursive \ install-info-recursive install-pdf-recursive \ install-ps-recursive install-recursive installcheck-recursive \ installdirs-recursive pdf-recursive ps-recursive \ tags-recursive uninstall-recursive am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive am__recursive_targets = \ $(RECURSIVE_TARGETS) \ $(RECURSIVE_CLEAN_TARGETS) \ $(am__extra_recursive_targets) AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \ distdir am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags DIST_SUBDIRS = $(SUBDIRS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) am__relativize = \ dir0=`pwd`; \ sed_first='s,^\([^/]*\)/.*$$,\1,'; \ sed_rest='s,^[^/]*/*,,'; \ sed_last='s,^.*/\([^/]*\)$$,\1,'; \ sed_butlast='s,/*[^/]*$$,,'; \ while test -n "$$dir1"; do \ first=`echo "$$dir1" | sed -e "$$sed_first"`; \ if test "$$first" != "."; then \ if test "$$first" = ".."; then \ dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ else \ first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ if test "$$first2" = "$$first"; then \ dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ else \ dir2="../$$dir2"; \ fi; \ dir0="$$dir0"/"$$first"; \ fi; \ fi; \ dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ done; \ reldir="$$dir2" ACLOCAL = ${SHELL} /home/thomson/devel/dibbler-git/missing aclocal-1.14 ALLOCA = AMTAR = $${TAR-tar} AM_DEFAULT_VERBOSITY = 1 AR = ar ARCH = LINUX AUTOCONF = ${SHELL} /home/thomson/devel/dibbler-git/missing autoconf AUTOHEADER = ${SHELL} /home/thomson/devel/dibbler-git/missing autoheader AUTOMAKE = ${SHELL} /home/thomson/devel/dibbler-git/missing automake-1.14 AWK = gawk CC = gcc CCDEPMODE = depmode=gcc3 CFLAGS = CPP = gcc -E CPPFLAGS = -O2 -DLINUX -Wall -pedantic -funsigned-char -DMOD_CLNT_BIND_REUSE -DMOD_CLNT_CONFIRM CXX = g++ CXXCPP = g++ -E CXXDEPMODE = depmode=gcc3 CXXFLAGS = CYGPATH_W = echo DEFS = -DHAVE_CONFIG_H DEPDIR = .deps DLLTOOL = false DSYMUTIL = DUMPBIN = ECHO_C = ECHO_N = -n ECHO_T = EGREP = /bin/grep -E EXEEXT = EXTRA_DIST_SUBDIRS = Port-bsd Port-winnt2k Port-sun FGREP = /bin/grep -F GREP = /bin/grep GTEST_INCLUDES = GTEST_LDADD = GTEST_LDFLAGS = INSTALL = /usr/bin/install -c INSTALL_DATA = ${INSTALL} -m 644 INSTALL_PROGRAM = ${INSTALL} INSTALL_SCRIPT = ${INSTALL} INSTALL_STRIP_PROGRAM = $(install_sh) -c -s LD = /usr/bin/ld -m elf_x86_64 LDFLAGS = -lpthread LIBOBJS = LIBS = LIBTOOL = $(SHELL) $(top_builddir)/libtool LINKPRINT = LIPO = LN_S = ln -s LTLIBOBJS = MAINT = # MAKEINFO = ${SHELL} /home/thomson/devel/dibbler-git/missing makeinfo MANIFEST_TOOL = : MKDIR_P = /bin/mkdir -p NM = /usr/bin/nm -B NMEDIT = OBJDUMP = objdump OBJEXT = o OTOOL = OTOOL64 = PACKAGE = dibbler PACKAGE_BUGREPORT = dibbler@klub.com.pl PACKAGE_NAME = dibbler PACKAGE_STRING = dibbler 1.0.1 PACKAGE_TARNAME = dibbler PACKAGE_URL = PACKAGE_VERSION = 1.0.1 PATH_SEPARATOR = : PORT_CFLAGS = PORT_LDFLAGS = PORT_SUBDIR = Port-linux RANLIB = ranlib SED = /bin/sed SET_MAKE = SHELL = /bin/bash STRIP = strip VERSION = 1.0.1 abs_builddir = /home/thomson/devel/dibbler-git/tests abs_srcdir = /home/thomson/devel/dibbler-git/tests abs_top_builddir = /home/thomson/devel/dibbler-git abs_top_srcdir = /home/thomson/devel/dibbler-git ac_ct_AR = ar ac_ct_CC = gcc ac_ct_CXX = g++ ac_ct_DUMPBIN = am__include = include am__leading_dot = . am__quote = am__tar = $${TAR-tar} chof - "$$tardir" am__untar = $${TAR-tar} xf - bindir = ${exec_prefix}/bin build = x86_64-unknown-linux-gnu build_alias = build_cpu = x86_64 build_os = linux-gnu build_vendor = unknown builddir = . datadir = ${datarootdir} datarootdir = ${prefix}/share docdir = ${datarootdir}/doc/${PACKAGE_TARNAME} dvidir = ${docdir} exec_prefix = ${prefix} host = x86_64-unknown-linux-gnu host_alias = host_cpu = x86_64 host_os = linux-gnu host_vendor = unknown htmldir = ${docdir} includedir = ${prefix}/include infodir = ${datarootdir}/info install_sh = ${SHELL} /home/thomson/devel/dibbler-git/install-sh libdir = ${exec_prefix}/lib libexecdir = ${exec_prefix}/libexec localedir = ${datarootdir}/locale localstatedir = ${prefix}/var mandir = ${datarootdir}/man mkdir_p = $(MKDIR_P) oldincludedir = /usr/include pdfdir = ${docdir} prefix = /usr/local program_transform_name = s,x,x, psdir = ${docdir} sbindir = ${exec_prefix}/sbin sharedstatedir = ${prefix}/com srcdir = . subdirs = bison++ sysconfdir = ${prefix}/etc target_alias = top_build_prefix = ../ top_builddir = .. top_srcdir = .. SUBDIRS = . utils Srv all: all-recursive .SUFFIXES: $(srcdir)/Makefile.in: # $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign tests/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign tests/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: # $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): # $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs # This directory's subdirectories are mostly independent; you can cd # into them and run 'make' without going through this Makefile. # To change the values of 'make' variables: instead of editing Makefiles, # (1) if the variable is set in 'config.status', edit 'config.status' # (which will cause the Makefiles to be regenerated when you run 'make'); # (2) otherwise, pass the desired values on the 'make' command line. $(am__recursive_targets): @fail=; \ if $(am__make_keepgoing); then \ failcom='fail=yes'; \ else \ failcom='exit 1'; \ fi; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-recursive TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ empty_fix=.; \ else \ include_option=--include; \ empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-recursive CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-recursive cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ $(am__make_dryrun) \ || test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ $(am__relativize); \ new_distdir=$$reldir; \ dir1=$$subdir; dir2="$(top_distdir)"; \ $(am__relativize); \ new_top_distdir=$$reldir; \ echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ ($(am__cd) $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$new_top_distdir" \ distdir="$$new_distdir" \ am__remove_distdir=: \ am__skip_length_check=: \ am__skip_mode_fix=: \ distdir) \ || exit 1; \ fi; \ done check-am: all-am check: check-recursive all-am: Makefile installdirs: installdirs-recursive installdirs-am: install: install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-recursive clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-recursive -rm -f Makefile distclean-am: clean-am distclean-generic distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive html-am: info: info-recursive info-am: install-data-am: install-dvi: install-dvi-recursive install-dvi-am: install-exec-am: install-html: install-html-recursive install-html-am: install-info: install-info-recursive install-info-am: install-man: install-pdf: install-pdf-recursive install-pdf-am: install-ps: install-ps-recursive install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-recursive -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: .MAKE: $(am__recursive_targets) install-am install-strip .PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am check \ check-am clean clean-generic clean-libtool cscopelist-am ctags \ ctags-am distclean distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ installdirs-am maintainer-clean maintainer-clean-generic \ mostlyclean mostlyclean-generic mostlyclean-libtool pdf pdf-am \ ps ps-am tags tags-am uninstall uninstall-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: dibbler-1.0.1/tests/testCase02/0000755000175000017500000000000012277734640013210 500000000000000dibbler-1.0.1/tests/testCase02/INFO0000664000175000017500000000022712233256142013575 00000000000000Server : Client : 0.1.1, WindowsXP + SP1 Report by: Thomson, during laboratories with students. Details : This config file does not work in Linuxdibbler-1.0.1/tests/testCase02/client.conf0000664000175000017500000000007412233256142015244 00000000000000 iface 'eth0' { IA { address { 20::1 } } } dibbler-1.0.1/tests/Makefile.am0000644000175000017500000000002712556473622013246 00000000000000SUBDIRS = . utils Srv dibbler-1.0.1/tests/testCase09/0000755000175000017500000000000012277734640013217 500000000000000dibbler-1.0.1/tests/testCase09/INFO0000664000175000017500000000027312233256142013605 00000000000000Client: 0.1.1, WindowsXP Details : - crashes if conf file does not start with "log-level 8" - crashes if interface name used instead of number - crashes if wrong interface named used dibbler-1.0.1/tests/captures/0000755000175000017500000000000012277734640013121 500000000000000dibbler-1.0.1/tests/captures/info.txt0000644000175000017500000000020012277722751014525 00000000000000dhcp-and-ddns.pcap - downloaded from wireshark.org sample library DHCPv4 with DDNS using TSIG dns.cap -various DNS queries dibbler-1.0.1/tests/captures/dhcp-and-ddns.pcap0000644000175000017500000000760412277722751016321 00000000000000Ôò¡ÿÿu*\A‚•VVÿÿÿÿÿÿPºGËEHEÇ€óÞÿÿÿÿDC4a þœPºGËc‚Sc5t=PºGË2  academy04<MSFT 5.07 ,./!ù+ÿu*\A—>>PºGË]£YE0r@@û  ·-@Òv*\A+OO]£Wë]£YEAs@@û  €5-> 1©router far-far-awayv*\A–„„]£Y]£WëEv.@@û  5€b&'1©…ƒrouter far-far-awayÀQ€)eselsumpfÀadminÀ1*0 :€Q€v*\AðOO]£Wë]£YEAt@@û  €5->1ªrouter far-far-awayv*\Aá „„]£Y]£WëEv/@@û  5€b&&1ª…ƒrouter far-far-awayÀQ€)eselsumpfÀadminÀ1*0 :€Q€v*\AàVVÿÿÿÿÿÿ]£YEHu@@ ÿÿÿÿCD4ŠDþœ  PºGËc‚Sc56 3,ÿÿÿ far-far-away ÿv*\AddÿÿÿÿÿÿPºGËEVEÈ€óÏÿÿÿÿDCBö+þœPºGËc‚Sc5=PºGË2 6  academy04Q academy04.<MSFT 5.07 ,./!ù+ÿv*\A×ïï]£Wë]£YEáv@@úi  €5Í"Ì!ë( far-far-away academy04À ÿþÀ– À–#"315d481afbd2eb55b3ada8851cdd1e2d44 DHCP_UPDATERúÿ:HMAC-MD5SIG-ALGREGINTA\*v,Q<§ê™0¾ÃŒVU‡À)›!ëv*\A³_ˆˆ]£Y]£WëEz0@@û  5€fÏÛ!먀 dhcp_updaterúÿ:hmac-md5sig-algregintA\*R,JÝwÙ*ÃkWx÷Ï.!ëv*\A|aÖÖ]£Wë]£YEÈw@@ú  €5´$ï!ì(202010in-addrarpa20À ÿÀ' – academy04 far-far-away DHCP_UPDATERúÿ:HMAC-MD5SIG-ALGREGINTA\*v,Þ.ï¾K­÷F8)BNŸ!ìv*\Al͈ˆ]£Y]£WëEz1@@û  5€fË¢!쨀 dhcp_updaterúÿ:hmac-md5sig-algregintA\*R,A/TSs°+®Š¼]Eò™!ìv*\AèÔ__ÿÿÿÿÿÿ]£YEQx@@ ÿÿÿÿCD=·¨þœ  PºGËc‚Sc56 3,Qacademy04.far-far-awayÿÿÿ far-far-away ÿv*\Aì<<ÿÿÿÿÿÿPºGËPºGË  †— ŠÄ EBEv*\A!l<<ÿÿÿÿÿÿPºGËPºGË  †– EBFCEw*\Aer<<ÿÿÿÿÿÿPºGËPºGË  †ƒ) EBFCE{*\A**]£Wë]£Y]£Y  {*\AÉ<<]£Y]£Wë]£Wë ]£Y ´*\Aò<<ÿÿÿÿÿÿPºGËPºGË  †¬) EBFCE´*\Aáò<<PºGË]£Wë]£Wë PºGË ´*\A–óLL]£WëPºGËE>F€¸a  5**‹<sus far-far-away´*\AgõPºGË]£WëEs2@@û  5_  <…ƒsus far-far-awayÀQ€)eselsumpfÀadminÀ.*0 :€Q€´*\AoöLL]£WëPºGËE>F€¸`  5**Š=sus far-far-away´*\Ap÷PºGË]£WëEs3@@û  5_  =…ƒsus far-far-awayÀQ€)eselsumpfÀadminÀ.*0 :€Q€¹*\A‘ó<<PºGË]£Wë]£Wë  ¹*\AQô<<]£WëPºGËPºGË ]£Wë †² Ц EBEdibbler-1.0.1/tests/captures/dns.cap0000644000175000017500000001036212277722751014314 00000000000000Ôò¡ÿÿ²gJB®‘FFÀŸ2AŒà± ­E8@@eGÀ¨ªÀ¨ª€5$…í2googlecom²gJBÀ“bbà± ­ÀŸ2AŒETË쀙>À¨ªÀ¨ª5€@Ç%2€googlecomÀ v=spf1 ptr ?all¶gJB¦FFÀŸ2AŒà± ­E8@@eGÀ¨ªÀ¨ª€5$ž°÷ogooglecom·gJBY**à± ­ÀŸ2AŒEÌ»€—§À¨ªÀ¨ª5€Öó÷o€googlecomÀ ( (smtp4À À ( smtp5À À ( smtp6À À ( smtp1À À ( smtp2À À ( (smtp3À À*XØï%À@X@é§ÀVXBf ÀlXØï9À‚XØï%À˜XØï9¿gJBÇFFÀŸ2AŒà± ­E8@@eGÀ¨ªÀ¨ª€5$LqI¡googlecom¿gJBŸæFFà± ­ÀŸ2AŒE8ÌÍ€˜yÀ¨ªÀ¨ª5€$ËðI¡€googlecomÇgJBiåUUÀŸ2AŒà± ­EG@@e8À¨ªÀ¨ª€53›»104919266in-addrarpa ÇgJBcçà± ­ÀŸ2AŒEsÍ€—ðÀ¨ªÀ¨ª5€_‚µ›»€104919266in-addrarpa À Q% 66-192-9-104gen twtelecomnethJBw JJÀŸ2AŒà± ­E<@@eCÀ¨ªÀ¨ª€5(¯auÀwwwnetbsdorghJBŽ6 ZZà± ­ÀŸ2AŒELÏù€•9À¨ªÀ¨ª5€8£uÀ€wwwnetbsdorgÀ @ï̘¾ hJB} JJÀŸ2AŒà± ­E@@eAÀ¨ªÀ¨ª€5*= Ü¢wwwlgooglecomnhJB¿—LLà± ­ÀŸ2AŒE>Õ9€À¨ªÀ¨ª5€*¼‰Ü¢€wwwlgooglecom—hJB<KKÀŸ2AŒà± ­E=@@eBÀ¨ªÀ¨ª€5)ˆa¼wwwexamplecom—hJBó¬KKà± ­ÀŸ2AŒE=ÖŸ€Ž¢À¨ªÀ¨ª5€)á¼€wwwexamplecom¢hJBƒ OOÀŸ2AŒà± ­EA@@e>À¨ªÀ¨ª€5-D(&mwwwexamplenotginh£hJBЀOOà± ­ÀŸ2AŒEA×.€ŽÀ¨ªÀ¨ª5€-¿¤&m…ƒwwwexamplenotginhÁhJB, GGÀŸ2AŒà± ­E9@@eFÀ¨ªÀ¨ª€5%BnþãwwwiscorgÿÁhJBÈ0 ssà± ­ÀŸ2AŒEeØô€Œ%À¨ªÀ¨ª5€QËdþã€wwwiscorgÿÀ X ø À X̘¸XÁhJB´? RRÀŸ2AŒà± ­ED@@e;À¨ªÀ¨ª€505ZS100127in-addrarpa ÁhJBB iià± ­ÀŸ2AŒE[Øõ€Œ.À¨ªÀ¨ª5€Gù0ZS…€100127in-addrarpa À  localhostÁhJBFK CCÀŸ2AŒà± ­E5@@eJÀ¨ªÀ¨ª€5!˜½ ŠiscorgÁhJBÚˆ ©2#`EäUEs‡Þ€j•À¨ª8Ù «5_9ð2n_ldap_tcpDefault-First-Site-Name_sitesdc_msdcs utelsystemslocal!ÁhJBµ’ ¦¦à± ­ÀŸ2AŒE˜Ø÷€‹ïÀ¨ªÀ¨ª5€„{Ø Š€iscorgÀ ns-extnrt1À À ns-extsth1À À  ns-extÀ À ns-extlga1À ÁhJB=Ö `EäU©2#Es@:øsÙ À¨ª85«_µl2n…ƒ_ldap_tcpDefault-First-Site-Name_sitesdc_msdcs utelsystemslocal!ÁhJBÌØ bb©2#`EäUET‡ð€j¢À¨ª8Ù ¬5@|Qña_ldap_tcpdc_msdcs utelsystemslocal!ÁhJBa bb`EäU©2#ET@:ø’Ù À¨ª85¬@÷Íña…ƒ_ldap_tcpdc_msdcs utelsystemslocal!ÁhJB€ ŒŒ©2#`EäUE~‡ñ€jwÀ¨ª8Ù ­5jw˜ƒa_ldap_tcp$05b5292b-34b8-4fb7-85a3-8beef5fd2069domains_msdcs utelsystemslocal!ÁhJBdk ŒŒ`EäU©2#E~@:øhÙ À¨ª85­jóƒa…ƒ_ldap_tcp$05b5292b-34b8-4fb7-85a3-8beef5fd2069domains_msdcs utelsystemslocal!ÁhJBùø SS©2#`EäUEE‡õ€j¬À¨ª8Ù ®51Ð`GRIMM utelsystemslocalÁhJB;SS`EäU©2#EE@:ø¡Ù À¨ª85®1– Ð`…ƒGRIMM utelsystemslocalÉhJBâsSS©2#`EäUEE‡û€j¦À¨ª8Ù ¯51t‰vcGRIMM utelsystemslocalÉhJB?ºSS`EäU©2#EE@:ø¡Ù À¨ª85¯1ðvc…ƒGRIMM utelsystemslocaldibbler-1.0.1/tests/packet-dhcpv6.c0000664000175000017500000006654412233256142014023 00000000000000/* packet-dhpcv6.c * Routines for DHCPv6 packet disassembly * Jun-ichiro itojun Hagino * IItom Tsutomu MIENO * SHIRASAKI Yasuhiro * Tony Lindstrom * Tomasz Mrugalski * * $Id: packet-dhcpv6.c,v 1.2 2008-11-13 22:40:26 thomson Exp $ * * The information used comes from: * RFC3315.txt (DHCPv6) * RFC3319.txt (SIP options) * RFC3633.txt (Prefix options) * RFC3646.txt (DNS servers/domains) * RFC3898.txt (NIS options) * draft-ietf-dhc-dhcpv6-opt-timeconfig-03.txt * draft-ietf-dhc-dhcpv6-opt-fqdn-00.txt * draft-ietf-dhc-dhcpv6-opt-lifetime-00.txt * * Note that protocol constants are still subject to change, based on IANA * assignment decisions. * * Ethereal - Network traffic analyzer * By Gerald Combs * Copyright 1998 Gerald Combs * * 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. */ #ifdef HAVE_CONFIG_H # include "config.h" #endif #include #include #include #include static int proto_dhcpv6 = -1; static int hf_dhcpv6_msgtype = -1; static int hf_fqdn_1 = -1; static int hf_fqdn_2 = -1; static int hf_fqdn_3 = -1; static int hf_fqdn_4 = -1; static gint ett_dhcpv6 = -1; static gint ett_dhcpv6_option = -1; #define UDP_PORT_DHCPV6_DOWNSTREAM 546 #define UDP_PORT_DHCPV6_UPSTREAM 547 #define DHCPV6_LEASEDURATION_INFINITY 0xffffffff #define SOLICIT 1 #define ADVERTISE 2 #define REQUEST 3 #define CONFIRM 4 #define RENEW 5 #define REBIND 6 #define REPLY 7 #define RELEASE 8 #define DECLINE 9 #define RECONFIGURE 10 #define INFORMATION_REQUEST 11 #define RELAY_FORW 12 #define RELAY_REPLY 13 #define OPTION_CLIENTID 1 #define OPTION_SERVERID 2 #define OPTION_IA_NA 3 #define OPTION_IA_TA 4 #define OPTION_IAADDR 5 #define OPTION_ORO 6 #define OPTION_PREFERENCE 7 #define OPTION_ELAPSED_TIME 8 #define OPTION_RELAY_MSG 9 /* #define OPTION_SERVER_MSG 10 */ #define OPTION_AUTH 11 #define OPTION_UNICAST 12 #define OPTION_STATUS_CODE 13 #define OPTION_RAPID_COMMIT 14 #define OPTION_USER_CLASS 15 #define OPTION_VENDOR_CLASS 16 #define OPTION_VENDOR_OPTS 17 #define OPTION_INTERFACE_ID 18 #define OPTION_RECONF_MSG 19 #define OPTION_RECONF_ACCEPT 20 #define OPTION_SIP_SERVER_D 21 #define OPTION_SIP_SERVER_A 22 #define OPTION_DNS_SERVERS 23 #define OPTION_DOMAIN_LIST 24 #define OPTION_IA_PD 25 #define OPTION_IAPREFIX 26 #define OPTION_NIS_SERVERS 27 #define OPTION_NISP_SERVERS 28 #define OPTION_NIS_DOMAIN_NAME 29 #define OPTION_NISP_DOMAIN_NAME 30 /* * The followings are unassigned numbers. */ #define OPTION_CLIENT_FQDN 34 #define OPTION_SNTP_SERVERS 40 #define OPTION_NEW_TZDB_TIMEZONE 41 #define OPTION_LIFETIME 42 #define DUID_LLT 1 #define DUID_EN 2 #define DUID_LL 3 #define DUID_LL_OLD 4 static const value_string msgtype_vals[] = { { SOLICIT, "Solicit" }, { ADVERTISE, "Advertise" }, { REQUEST, "Request" }, { CONFIRM, "Confirm" }, { RENEW, "Renew" }, { REBIND, "Rebind" }, { REPLY, "Reply" }, { RELEASE, "Release" }, { DECLINE, "Decline" }, { RECONFIGURE, "Reconfigure" }, { INFORMATION_REQUEST, "Information-request" }, { RELAY_FORW, "Relay-forw" }, { RELAY_REPLY, "Relay-reply" }, { 0, NULL } }; static const value_string opttype_vals[] = { { OPTION_CLIENTID, "Client Identifier" }, { OPTION_SERVERID, "Server Identifier" }, { OPTION_IA_NA, "Identity Association" }, { OPTION_IA_TA, "Identity Association for Temporary Address" }, { OPTION_IAADDR, "IA Address" }, { OPTION_ORO, "Option Request" }, { OPTION_PREFERENCE, "Preference" }, { OPTION_ELAPSED_TIME, "Elapsed time" }, { OPTION_RELAY_MSG, "Relay Message" }, /* { OPTION_SERVER_MSG, "Server message" }, */ { OPTION_AUTH, "Authentication" }, { OPTION_UNICAST, "Server unicast" }, { OPTION_STATUS_CODE, "Status code" }, { OPTION_RAPID_COMMIT, "Rapid Commit" }, { OPTION_USER_CLASS, "User Class" }, { OPTION_VENDOR_CLASS, "Vendor Class" }, { OPTION_VENDOR_OPTS, "Vendor-specific Information" }, { OPTION_INTERFACE_ID, "Interface-Id" }, { OPTION_RECONF_MSG, "Reconfigure Message" }, { OPTION_RECONF_ACCEPT, "Reconfigure Accept" }, { OPTION_SIP_SERVER_D, "SIP Server Domain Name List" }, { OPTION_SIP_SERVER_A, "SIP Servers IPv6 Address List" }, { OPTION_DNS_SERVERS, "DNS recursive name server" }, { OPTION_DOMAIN_LIST, "Domain Search List" }, { OPTION_IA_PD, "Identity Association for Prefix Delegation" }, { OPTION_IAPREFIX, "IA Prefix" }, { OPTION_NIS_SERVERS, "Network Information Server" }, { OPTION_NISP_SERVERS, "Network Information Server V2" }, { OPTION_NIS_DOMAIN_NAME, "Network Information Server Domain Name" }, { OPTION_NISP_DOMAIN_NAME,"Network Information Server V2 Domain Name" }, { OPTION_SNTP_SERVERS, "Simple Network Time Protocol Server" }, { OPTION_NEW_TZDB_TIMEZONE, "Time zone name" }, { OPTION_LIFETIME, "Lifetime" }, { OPTION_CLIENT_FQDN, "Fully Qualified Domain Name" }, { 0, NULL } }; static const value_string statuscode_vals[] = { {0, "Success" }, {1, "UnspecFail" }, {2, "NoAddrAvail" }, {3, "NoBinding" }, {4, "NotOnLink" }, {5, "UseMulticast" }, {6, "NoPrefixAvail" }, {0, NULL } }; static const value_string duidtype_vals[] = { { DUID_LLT, "link-layer address plus time" }, { DUID_EN, "assigned by vendor based on Enterprise number" }, { DUID_LL, "link-layer address" }, { DUID_LL_OLD, "link-layer address (old)" }, { 0, NULL } }; static const true_false_string tfs_present = { "present", "absent" }; /* This FQDN draft is a mess, I've tried to understand, but N,O,S bit descriptions are really cryptic */ static const true_false_string fqdn_n = { /* "Client doesn't want server to perform DNS update", "" */ "N bit set","N bit cleared" }; static const true_false_string fqdn_o = { "O bit set", "O bit cleared" }; static const true_false_string fqdn_s = { /* "Forward mapping (FQDN-to-IPv6, AAAA) performed by client", "Forward mapping (FQDN-to-IPv6, AAAA) performed by server" */ "S bit set", "S bit cleared" }; /* Adds domain */ static void dhcpv6_domain(proto_tree * subtree, tvbuff_t *tvb, int off, guint16 optlen) { guint8 domain[256]; guint8 count = 0; guint8 len = 0; while (optlen) { count++; tvb_memcpy(tvb, (guint8*)&len, off, 1); if (len==0) break; if (len>optlen) { proto_tree_add_text(subtree, tvb, off, optlen, "Malformed option"); return; } tvb_memcpy(tvb, (guint8*)&domain, off+1, len); domain[len]=0; proto_tree_add_text(subtree, tvb, off, len+1, "Domain: %s", domain); off += len+1; optlen -= len+1; }; } /* Returns the number of bytes consumed by this option. */ static int dhcpv6_option(tvbuff_t *tvb, proto_tree *bp_tree, int off, int eoff, gboolean *at_end) { guint8 buf[255]; guint16 opttype; guint16 optlen; guint16 temp_optlen = 0; proto_item *ti; proto_tree *subtree; int i; struct e_in6_addr in6; guint16 duidtype; /* option type and length must be present */ if (eoff - off < 4) { *at_end = TRUE; return 0; } opttype = tvb_get_ntohs(tvb, off); optlen = tvb_get_ntohs(tvb, off + 2); /* all option data must be present */ if (eoff - off < 4 + optlen) { *at_end = TRUE; return 0; } ti = proto_tree_add_text(bp_tree, tvb, off, 4 + optlen, "%s", val_to_str(opttype, opttype_vals, "DHCP option %u")); subtree = proto_item_add_subtree(ti, ett_dhcpv6_option); proto_tree_add_text(subtree, tvb, off, 2, "option type: %d", opttype); proto_tree_add_text(subtree, tvb, off + 2, 2, "option length: %d", optlen); off += 4; switch (opttype) { case OPTION_CLIENTID: case OPTION_SERVERID: if (optlen < 2) { proto_tree_add_text(subtree, tvb, off, optlen, "DUID: malformed option"); break; } duidtype = tvb_get_ntohs(tvb, off); proto_tree_add_text(subtree, tvb, off, 2, "DUID type: %s (%u)", val_to_str(duidtype, duidtype_vals, "Unknown"), duidtype); switch (duidtype) { case DUID_LLT: if (optlen < 8) { proto_tree_add_text(subtree, tvb, off, optlen, "DUID: malformed option"); break; } /* XXX seconds since Jan 1 2000 */ proto_tree_add_text(subtree, tvb, off + 2, 2, "Hardware type: %u", tvb_get_ntohs(tvb, off + 2)); proto_tree_add_text(subtree, tvb, off + 4, 4, "Time: %u", tvb_get_ntohl(tvb, off + 4)); if (optlen > 8) { proto_tree_add_text(subtree, tvb, off + 8, optlen - 8, "Link-layer address"); } break; case DUID_EN: if (optlen < 6) { proto_tree_add_text(subtree, tvb, off, optlen, "DUID: malformed option"); break; } proto_tree_add_text(subtree, tvb, off + 2, 4, "enterprise-number"); if (optlen > 6) { proto_tree_add_text(subtree, tvb, off + 6, optlen - 6, "identifier"); } break; case DUID_LL: case DUID_LL_OLD: if (optlen < 4) { proto_tree_add_text(subtree, tvb, off, optlen, "DUID: malformed option"); break; } proto_tree_add_text(subtree, tvb, off + 2, 2, "Hardware type: %u", tvb_get_ntohs(tvb, off + 2)); if (optlen > 4) { proto_tree_add_text(subtree, tvb, off + 4, optlen - 4, "Link-layer address"); } break; } break; case OPTION_IA_NA: case OPTION_IA_PD: if (optlen < 12) { if (opttype == OPTION_IA_NA) proto_tree_add_text(subtree, tvb, off, optlen, "IA_NA: malformed option"); else proto_tree_add_text(subtree, tvb, off, optlen, "IA_PD: malformed option"); break; } proto_tree_add_text(subtree, tvb, off, 4, "IAID: %u", tvb_get_ntohl(tvb, off)); if (tvb_get_ntohl(tvb, off+4) == DHCPV6_LEASEDURATION_INFINITY) { proto_tree_add_text(subtree, tvb, off+4, 4, "T1: infinity"); } else { proto_tree_add_text(subtree, tvb, off+4, 4, "T1: %u", tvb_get_ntohl(tvb, off+4)); } if (tvb_get_ntohl(tvb, off+8) == DHCPV6_LEASEDURATION_INFINITY) { proto_tree_add_text(subtree, tvb, off+8, 4, "T1: infinity"); } else { proto_tree_add_text(subtree, tvb, off+8, 4, "T2: %u", tvb_get_ntohl(tvb, off+8)); } temp_optlen = 12; while ((optlen - temp_optlen) > 0) { temp_optlen += dhcpv6_option(tvb, subtree, off+temp_optlen, off + optlen, at_end); if (*at_end) { /* Bad option - just skip to the end */ temp_optlen = optlen; } } break; case OPTION_IA_TA: if (optlen < 4) { proto_tree_add_text(subtree, tvb, off, optlen, "IA_TA: malformed option"); break; } proto_tree_add_text(subtree, tvb, off, 4, "IAID: %u", tvb_get_ntohl(tvb, off)); temp_optlen = 4; while ((optlen - temp_optlen) > 0) { temp_optlen += dhcpv6_option(tvb, subtree, off+temp_optlen, off + optlen, at_end); if (*at_end) { /* Bad option - just skip to the end */ temp_optlen = optlen; } } break; case OPTION_IAADDR: { guint32 preferred_lifetime, valid_lifetime; if (optlen < 24) { proto_tree_add_text(subtree, tvb, off, optlen, "IAADDR: malformed option"); break; } tvb_memcpy(tvb, (guint8 *)&in6, off, sizeof(in6)); proto_tree_add_text(subtree, tvb, off, sizeof(in6), "IPv6 address: %s", ip6_to_str(&in6)); preferred_lifetime = tvb_get_ntohl(tvb, off + 16); valid_lifetime = tvb_get_ntohl(tvb, off + 20); if (preferred_lifetime == DHCPV6_LEASEDURATION_INFINITY) { proto_tree_add_text(subtree, tvb, off + 16, 4, "Preferred lifetime: infinity"); } else { proto_tree_add_text(subtree, tvb, off + 16, 4, "Preferred lifetime: %u", preferred_lifetime); } if (valid_lifetime == DHCPV6_LEASEDURATION_INFINITY) { proto_tree_add_text(subtree, tvb, off + 20, 4, "Valid lifetime: infinity"); } else { proto_tree_add_text(subtree, tvb, off + 20, 4, "Valid lifetime: %u", valid_lifetime); } temp_optlen = 24; while ((optlen - temp_optlen) > 0) { temp_optlen += dhcpv6_option(tvb, subtree, off+temp_optlen, off + optlen, at_end); if (*at_end) { /* Bad option - just skip to the end */ temp_optlen = optlen; } } } break; case OPTION_ORO: for (i = 0; i < optlen; i += 2) { guint16 requested_opt_code; requested_opt_code = tvb_get_ntohs(tvb, off + i); proto_tree_add_text(subtree, tvb, off + i, 2, "Requested Option code: %s (%d)", val_to_str(requested_opt_code, opttype_vals, "Unknown"), requested_opt_code); } break; case OPTION_PREFERENCE: if (optlen != 1) { proto_tree_add_text(subtree, tvb, off, optlen, "PREFERENCE: malformed option"); break; } proto_tree_add_text(subtree, tvb, off, 1, "pref-value: %d", (guint32)tvb_get_guint8(tvb, off)); break; case OPTION_ELAPSED_TIME: if (optlen != 2) { proto_tree_add_text(subtree, tvb, off, optlen, "ELAPSED-TIME: malformed option"); break; } proto_tree_add_text(subtree, tvb, off, 2, "elapsed-time: %d sec", (guint32)tvb_get_ntohs(tvb, off)); break; case OPTION_RELAY_MSG: if (optlen == 0) { proto_tree_add_text(subtree, tvb, off, optlen, "RELAY-MSG: malformed option"); break; } else { /* XXX - shouldn't we be dissecting a full DHCP message here? */ dhcpv6_option(tvb, subtree, off, off + optlen, at_end); if (*at_end) return 0; } break; case OPTION_AUTH: if (optlen < 15) { proto_tree_add_text(subtree, tvb, off, optlen, "AUTH: malformed option"); break; } proto_tree_add_text(subtree, tvb, off, 1, "Protocol: %d", (guint32)tvb_get_guint8(tvb, off)); proto_tree_add_text(subtree, tvb, off+1, 1, "Algorithm: %d", (guint32)tvb_get_guint8(tvb, off+1)); proto_tree_add_text(subtree, tvb, off+2, 1, "RDM: %d", (guint32)tvb_get_guint8(tvb, off+2)); proto_tree_add_text(subtree, tvb, off+3, 8, "Reply Detection"); proto_tree_add_text(subtree, tvb, off+11, optlen-11, "Authentication Information"); break; case OPTION_UNICAST: if (optlen != 16) { proto_tree_add_text(subtree, tvb, off, optlen, "UNICAST: malformed option"); break; } tvb_memcpy(tvb, (guint8 *)&in6, off, sizeof(in6)); proto_tree_add_text(subtree, tvb, off, sizeof(in6), "IPv6 address: %s", ip6_to_str(&in6)); break; case OPTION_STATUS_CODE: { guint16 status_code; char *status_message = 0; status_code = tvb_get_ntohs(tvb, off); proto_tree_add_text(subtree, tvb, off, 2, "Status Code: %s (%d)", val_to_str(status_code, statuscode_vals, "Unknown"), status_code); if (optlen - 2 > 0) { status_message = tvb_get_string(tvb, off + 2, optlen - 2); proto_tree_add_text(subtree, tvb, off + 2, optlen - 2, "Status Message: %s", status_message); g_free(status_message); } } break; case OPTION_VENDOR_CLASS: if (optlen < 4) { proto_tree_add_text(subtree, tvb, off, optlen, "VENDOR_CLASS: malformed option"); break; } proto_tree_add_text(subtree, tvb, off, 4, "enterprise-number: %u", tvb_get_ntohl(tvb, off)); if (optlen > 4) { proto_tree_add_text(subtree, tvb, off+4, optlen-4, "vendor-class-data"); } break; case OPTION_VENDOR_OPTS: if (optlen < 4) { proto_tree_add_text(subtree, tvb, off, optlen, "VENDOR_OPTS: malformed option"); break; } proto_tree_add_text(subtree, tvb, off, 4, "enterprise-number: %u", tvb_get_ntohl(tvb, off)); if (optlen > 4) { proto_tree_add_text(subtree, tvb, off+4, optlen-4, "option-data"); } break; case OPTION_INTERFACE_ID: if (optlen == 0) { proto_tree_add_text(subtree, tvb, off, optlen, "INTERFACE_ID: malformed option"); break; } proto_tree_add_text(subtree, tvb, off, optlen, "Interface-ID"); break; case OPTION_RECONF_MSG: if (optlen != 1) { proto_tree_add_text(subtree, tvb, off, optlen, "RECONF_MSG: malformed option"); break; } proto_tree_add_text(subtree, tvb, off, optlen, "Reconfigure-type: %s", val_to_str(tvb_get_guint8(tvb, off), msgtype_vals, "Message Type %u")); break; case OPTION_SIP_SERVER_D: if (optlen > 0) { proto_tree_add_text(subtree, tvb, off, optlen, "SIP Servers Domain Search List"); } dhcpv6_domain(subtree,tvb, off, optlen); break; case OPTION_SIP_SERVER_A: if (optlen % 16) { proto_tree_add_text(subtree, tvb, off, optlen, "SIP servers address: malformed option"); break; } for (i = 0; i < optlen; i += 16) { tvb_memcpy(tvb, (guint8 *)&in6, off + i, sizeof(in6)); proto_tree_add_text(subtree, tvb, off + i, sizeof(in6), "SIP servers address: %s", ip6_to_str(&in6)); } break; case OPTION_DNS_SERVERS: if (optlen % 16) { proto_tree_add_text(subtree, tvb, off, optlen, "DNS servers address: malformed option"); break; } for (i = 0; i < optlen; i += 16) { tvb_memcpy(tvb, (guint8 *)&in6, off + i, sizeof(in6)); proto_tree_add_text(subtree, tvb, off + i, sizeof(in6), "DNS servers address: %s", ip6_to_str(&in6)); } break; case OPTION_DOMAIN_LIST: if (optlen > 0) { proto_tree_add_text(subtree, tvb, off, optlen, "DNS Domain Search List"); } dhcpv6_domain(subtree,tvb, off, optlen); break; case OPTION_NIS_SERVERS: if (optlen % 16) { proto_tree_add_text(subtree, tvb, off, optlen, "NIS servers address: malformed option"); break; } for (i = 0; i < optlen; i += 16) { tvb_memcpy(tvb, (guint8 *)&in6, off + i, sizeof(in6)); proto_tree_add_text(subtree, tvb, off + i, sizeof(in6), "NIS servers address: %s", ip6_to_str(&in6)); } break; case OPTION_NISP_SERVERS: if (optlen % 16) { proto_tree_add_text(subtree, tvb, off, optlen, "NISP servers address: malformed option"); break; } for (i = 0; i < optlen; i += 16) { tvb_memcpy(tvb, (guint8 *)&in6, off + i, sizeof(in6)); proto_tree_add_text(subtree, tvb, off + i, sizeof(in6), "NISP servers address: %s", ip6_to_str(&in6)); } break; case OPTION_NIS_DOMAIN_NAME: if (optlen > 0) { proto_tree_add_text(subtree, tvb, off, optlen, "nis-domain-name"); } dhcpv6_domain(subtree,tvb, off, optlen); break; case OPTION_NISP_DOMAIN_NAME: if (optlen > 0) { proto_tree_add_text(subtree, tvb, off, optlen, "nisp-domain-name"); } dhcpv6_domain(subtree,tvb, off, optlen); break; case OPTION_SNTP_SERVERS: if (optlen % 16) { proto_tree_add_text(subtree, tvb, off, optlen, "SNTP servers address: malformed option"); break; } for (i = 0; i < optlen; i += 16) { tvb_memcpy(tvb, (guint8 *)&in6, off + i, sizeof(in6)); proto_tree_add_text(subtree, tvb, off + i, sizeof(in6), "SNTP servers address: %s", ip6_to_str(&in6)); } break; case OPTION_NEW_TZDB_TIMEZONE: if (optlen > 0) { tvb_memcpy(tvb, (guint*)buf, off, optlen); buf[optlen]=0; proto_tree_add_text(subtree, tvb, off, optlen, "time-zone name: %s", buf); } break; case OPTION_LIFETIME: if (optlen != 4) { proto_tree_add_text(subtree, tvb, off, optlen, "LIFETIME: malformed option"); break; } proto_tree_add_text(subtree, tvb, off, 4, "Lifetime: %d", (guint32)tvb_get_ntohl(tvb, off)); break; case OPTION_CLIENT_FQDN: if (optlen < 1) { proto_tree_add_text(subtree, tvb, off, optlen, "FQDN: malformed option"); break; } // +-----+-+-+-+ // | MBZ |N|O|S| // +-----+-+-+-+ proto_tree_add_item(subtree, hf_fqdn_1, tvb, off, 1, FALSE); proto_tree_add_item(subtree, hf_fqdn_2, tvb, off, 1, FALSE); proto_tree_add_item(subtree, hf_fqdn_3, tvb, off, 1, FALSE); proto_tree_add_item(subtree, hf_fqdn_4, tvb, off, 1, FALSE); /* proto_tree_add_text(subtree, tvb, off, 1, */ /* "flags: %d", */ /* (guint32)tvb_get_guint8(tvb, off)); */ dhcpv6_domain(subtree,tvb, off+1, optlen-1); break; case OPTION_IAPREFIX: { guint32 preferred_lifetime, valid_lifetime; guint8 prefix_length; struct e_in6_addr in6; if (optlen < 25) { proto_tree_add_text(subtree, tvb, off, optlen, "IAPREFIX: malformed option"); break; } preferred_lifetime = tvb_get_ntohl(tvb, off); valid_lifetime = tvb_get_ntohl(tvb, off + 4); prefix_length = tvb_get_guint8(tvb, off + 8); if (preferred_lifetime == DHCPV6_LEASEDURATION_INFINITY) { proto_tree_add_text(subtree, tvb, off, 4, "Preferred lifetime: infinity"); } else { proto_tree_add_text(subtree, tvb, off, 4, "Preferred lifetime: %u", preferred_lifetime); } if (valid_lifetime == DHCPV6_LEASEDURATION_INFINITY) { proto_tree_add_text(subtree, tvb, off + 4, 4, "Valid lifetime: infinity"); } else { proto_tree_add_text(subtree, tvb, off + 4, 4, "Valid lifetime: %u", valid_lifetime); } proto_tree_add_text(subtree, tvb, off + 8, 1, "Prefix length: %d", prefix_length); tvb_memcpy(tvb, (guint8 *)&in6, off + 9 , sizeof(in6)); proto_tree_add_text(subtree, tvb, off + 9, 16, "Prefix address: %s", ip6_to_str(&in6)); temp_optlen = 25; while ((optlen - temp_optlen) > 0) { temp_optlen += dhcpv6_option(tvb, subtree, off+temp_optlen, off + optlen, at_end); if (*at_end) { /* Bad option - just skip to the end */ temp_optlen = optlen; } } } break; } return 4 + optlen; } static void dissect_dhcpv6(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, gboolean downstream) { proto_tree *bp_tree = NULL; proto_item *ti; guint8 msgtype, hop_count ; guint32 xid; int off = 0; int eoff; struct e_in6_addr in6; gboolean at_end; gboolean relay_msg_option = FALSE; int length; eoff = tvb_reported_length(tvb); downstream = 0; /* feature reserved */ if (check_col(pinfo->cinfo, COL_PROTOCOL)) col_set_str(pinfo->cinfo, COL_PROTOCOL, "DHCPv6"); if (check_col(pinfo->cinfo, COL_INFO)) col_clear(pinfo->cinfo, COL_INFO); msgtype = tvb_get_guint8(tvb, off); if (tree) { ti = proto_tree_add_item(tree, proto_dhcpv6, tvb, 0, -1, FALSE); bp_tree = proto_item_add_subtree(ti, ett_dhcpv6); } while (msgtype == RELAY_FORW || msgtype == RELAY_REPLY) { if (check_col(pinfo->cinfo, COL_INFO)) { col_set_str(pinfo->cinfo, COL_INFO, val_to_str(msgtype, msgtype_vals, "Message Type %u")); } proto_tree_add_uint(bp_tree, hf_dhcpv6_msgtype, tvb, off, 1, msgtype); hop_count = tvb_get_guint8(tvb, off+1); proto_tree_add_text(bp_tree, tvb, off+1, 1, "Hop count: %d", hop_count); tvb_memcpy(tvb, (guint8 *)&in6, off+2, sizeof(in6)); proto_tree_add_text(bp_tree, tvb, off+2, sizeof(in6), "Link-address: %s",ip6_to_str(&in6)); tvb_memcpy(tvb, (guint8 *)&in6, off+18, sizeof(in6)); proto_tree_add_text(bp_tree, tvb, off+18, sizeof(in6), "Peer-address: %s",ip6_to_str(&in6)); off += 34; relay_msg_option = FALSE; while (!relay_msg_option && off < eoff) { length = dhcpv6_option(tvb, bp_tree, off, eoff, &at_end); if (at_end) return; if (tvb_get_ntohs(tvb, off) == OPTION_RELAY_MSG) { relay_msg_option = TRUE; off += 4; } else { if (length > 0) off += length; else { proto_tree_add_text(bp_tree, tvb, off, eoff, "Message: malformed"); return; } } } msgtype = tvb_get_guint8(tvb, off); } xid = tvb_get_ntohl(tvb, off) & 0x00ffffff; if (!off) { if (check_col(pinfo->cinfo, COL_INFO)) { col_set_str(pinfo->cinfo, COL_INFO, val_to_str(msgtype, msgtype_vals, "Message Type %u")); } } if (tree) { proto_tree_add_uint(bp_tree, hf_dhcpv6_msgtype, tvb, off, 1, msgtype); proto_tree_add_text(bp_tree, tvb, off+1, 3, "Transaction-ID: 0x%08x", xid); #if 0 tvb_memcpy(tvb, (guint8 *)&in6, 4, sizeof(in6)); proto_tree_add_text(bp_tree, tvb, 4, sizeof(in6), "Server address: %s", ip6_to_str(&in6)); #endif } off += 4; at_end = FALSE; while (off < eoff && !at_end) off += dhcpv6_option(tvb, bp_tree, off, eoff, &at_end); } static void dissect_dhcpv6_downstream(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) { dissect_dhcpv6(tvb, pinfo, tree, TRUE); } static void dissect_dhcpv6_upstream(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) { dissect_dhcpv6(tvb, pinfo, tree, FALSE); } void proto_register_dhcpv6(void) { static hf_register_info hf[] = { { &hf_dhcpv6_msgtype, { "Message type", "dhcpv6.msgtype", FT_UINT8, BASE_DEC, VALS(msgtype_vals), 0x0, "", HFILL }}, { &hf_fqdn_1, { "Reserved", "", FT_UINT8, BASE_HEX, NULL, 0xF8, "", HFILL}}, { &hf_fqdn_2, { "N", "", FT_BOOLEAN, 8, TFS(&fqdn_n), 0x4, "", HFILL}}, { &hf_fqdn_3, { "O", "", FT_BOOLEAN, 8, TFS(&fqdn_o), 0x2, "", HFILL}}, { &hf_fqdn_4, { "S", "", FT_BOOLEAN, 8, TFS(&fqdn_s), 0x1, "", HFILL}} } ; static gint *ett[] = { &ett_dhcpv6, &ett_dhcpv6_option, }; proto_dhcpv6 = proto_register_protocol("DHCPv6", "DHCPv6", "dhcpv6"); proto_register_field_array(proto_dhcpv6, hf, array_length(hf)); proto_register_subtree_array(ett, array_length(ett)); } void proto_reg_handoff_dhcpv6(void) { dissector_handle_t dhcpv6_handle; dhcpv6_handle = create_dissector_handle(dissect_dhcpv6_downstream, proto_dhcpv6); dissector_add("udp.port", UDP_PORT_DHCPV6_DOWNSTREAM, dhcpv6_handle); dhcpv6_handle = create_dissector_handle(dissect_dhcpv6_upstream, proto_dhcpv6); dissector_add("udp.port", UDP_PORT_DHCPV6_UPSTREAM, dhcpv6_handle); } dibbler-1.0.1/tests/DnsUpdate/0000755000175000017500000000000012277734640013162 500000000000000dibbler-1.0.1/tests/DnsUpdate/Makefile0000644000175000017500000000121112277734640014535 00000000000000TOPDIR=../.. OBJECTS = DnsUpdate01.o DnsUpdate02.o TESTS = DnsUpdate01 DnsUpdate02 tests: $(TESTS) objs: $(OBJECTS) libs: testDnsUpdate.a include $(TOPDIR)/Makefile.inc DnsUpdate01: DnsUpdate01.cpp $(CXX) $(CPPFLAGS) -o DnsUpdate01 $< $(LD) $< -L$(TOPDIR)/Misc -lMisc \ -L$(TOPDIR)/IfaceMgr -lIfaceMgr DnsUpdate02: DnsUpdate02.cpp cd $(TOPDIR); make libposlib cd $(MISC); make libs cd $(SRVIFACEMGR); make libs $(CXX) $(CXXFLAGS) -o DnsUpdate02 $< -L$(TOPDIR)/Misc -lMisc \ -L$(TOPDIR)/IfaceMgr -lIfaceMgr \ -L$(TOPDIR)/SrvIfaceMgr -lSrvIfaceMgr \ -L$(POSLIB) -lposlib \ -L$(MISC) -lMisc dibbler-1.0.1/tests/DnsUpdate/DnsUpdate02.cpp0000664000175000017500000000167612233256142015637 00000000000000#include #include "DNSUpdate.h" #include "Logger.h" using namespace std; bool DnsUpdate_test(DNSUpdate::DnsUpdateProtocol proto, bool dhcid, bool tsig) { string dnsAddr = "2000::1"; string zonename = "example.org."; string hostname = "troi.example.org."; string hostip = "2000::dead:beef"; char duid[]="this is my duid"; int duidLen = strlen(duid); DNSUpdate *act = new DNSUpdate(dnsAddr, zonename, hostname, hostip, DNSUPDATE_AAAA, proto); if (dhcid) act->addDHCID(duid, duidLen); int result = act->run(5); delete act; Log(Debug) << "RESULT: PTR=" << result << LogEnd; return true; } int main(int argc, const char *argv[]) { DnsUpdate_test(DNSUpdate::DNSUPDATE_UDP, false, false); DnsUpdate_test(DNSUpdate::DNSUPDATE_TCP, false, false); DnsUpdate_test(DNSUpdate::DNSUPDATE_UDP, true, false); DnsUpdate_test(DNSUpdate::DNSUPDATE_UDP, false, true); } dibbler-1.0.1/tests/DnsUpdate/DnsUpdate01.cpp0000664000175000017500000000103312233256142015621 00000000000000 #include "DNSUpdate.h" #include "base64.h" int main() { char *plain = "any carnal pleasure."; char encoded[128]; char decoded[128]; base64_encode(plain, strlen(plain), encoded, 128); printf("encoded [%s] => [%s]\n", plain, encoded); // decode struct base64_decode_context ctx; base64_decode_ctx_init(&ctx); size_t decodedLen; base64_decode(&ctx, encoded, strlen(encoded), decoded, &decodedLen); printf("decoded [%s] => [%s]\n", encoded, decoded); return 0; } dibbler-1.0.1/tests/testCase01/0000755000175000017500000000000012277734640013207 500000000000000dibbler-1.0.1/tests/testCase01/INFO0000664000175000017500000000045612233256142013600 00000000000000Server : 0.1.1, Linux Client : 0.1.1, Linux Report by: Thomson, during laboratories with students. Details : segfault in TAddrMgr::dbStore (this=0x80cfe70) at AddrMgr.cpp:81 During trying to send ADVERTISE Status : Fix pending: SrvOptIA_NA.cpp: 182 classNr is sometimes negative dibbler-1.0.1/tests/testCase01/server.conf0000664000175000017500000000007412233256142015273 00000000000000iface 'eth0' { class { pool 2000:2::1-2000:2::100 } } dibbler-1.0.1/tests/testCase07/0000755000175000017500000000000012277734640013215 500000000000000dibbler-1.0.1/tests/testCase07/INFO0000664000175000017500000000024612233256142013603 00000000000000Server : 0.1.1, WindowsXP Client : 0.1.1, WindowsXP Report by: Josep Sole, France Telecom R&D Details : Server is unable to read full (without ::) IPv6 address. dibbler-1.0.1/tests/testCase07/server.conf0000664000175000017500000000020512233256142015275 00000000000000iface eth0 { option dns-server 2002:709:2efb:d34:548:1111:254:ff54 class { pool 3ffe:1111::1-3ffe:1111::30 } }dibbler-1.0.1/tests/testCase07/client.conf0000664000175000017500000000022312233256142015245 00000000000000log-mode short log-level 8 iface 'eth0' { option dns-server option domain option time-zone option ntp-server IA { address { 20::1 } } } dibbler-1.0.1/tests/parse-gtest-results.py0000664000175000017500000000405112233256142015510 00000000000000#!/usr/bin/python #import easy to use xml parser called minidom: from xml.dom.minidom import parseString import os import sys # # # # # #all these imports are standard on most modern python implementations if (len(sys.argv) > 1): dir = sys.argv[1] else: dir = "." #print("Looking for XMLs in %s" % dir) def parseFile(xmlFile): #open the xml file for reading: file = open(xmlFile,'r') #convert to string: data = file.read() #close file because we dont need it anymore: file.close() #parse the xml you got from the file dom = parseString(data) #print (data) #retrieve the first xml tag (data) that the parser finds with name tagName: testsuites = dom.getElementsByTagName('testsuites')[0] total = int(testsuites.getAttribute("tests")) failed = int(testsuites.getAttribute("failures")) disabled = int(testsuites.getAttribute("disabled")) errors = int(testsuites.getAttribute("errors")) execTime = float(testsuites.getAttribute("time")) passed = total - failed - disabled - errors return (passed, failed, disabled, errors, total, execTime) passedCnt = 0 failedCnt = 0 disabledCnt = 0 errorsCnt = 0 totalCnt = 0 execTimeCnt = 0.0 dirList = os.listdir(dir) for fname in dirList: #print(fname) if (fname.count(".") != 1): continue name,ext = fname.split('.') if (ext != "xml"): continue #print("Parsing file %s" % fname) (passed, failed, disabled, errors, total, execTime) = parseFile(dir + "/" + fname) passedCnt += passed failedCnt += failed disabledCnt += disabled errorsCnt += errors totalCnt += total execTimeCnt = execTime print("%d:%d:%d:%d:%d:%f" % (passedCnt, failedCnt, disabledCnt, errorsCnt, totalCnt, execTimeCnt)) dibbler-1.0.1/tests/utils/0000755000175000017500000000000012561700377012427 500000000000000dibbler-1.0.1/tests/utils/poslib_utils.cc0000644000175000017500000000327312277722751015377 00000000000000#include #include #include "poslib.h" using namespace std; namespace test { /// @brief convert hex string (from wireshark export) to binary format /// /// @param hex /// @param dst void hexToBin(const std::string& hex, message_buff &dst) { size_t len = hex.length()/2; // keep this C-style, as message_buff desctructor does free() unsigned char * bin = (unsigned char*)malloc(len); for (unsigned int i = 0; i < 2*len; i+=2) { if (!isxdigit(hex[i]) || !isxdigit(hex[i+1])) { throw ("Invalid character "); } bin[i/2] = (hex[i]-'0')*(isdigit(hex[i])>0) + (tolower(hex[i])-'a' + 10)*(isalpha(hex[i])>0); bin[i/2] <<= 4; bin[i/2] += (hex[i+1]-'0')*(isdigit(hex[i+1])>0) + (tolower(hex[i+1])-'a' + 10)*(isalpha(hex[i+1])>0); } dst.msg = bin; dst.len = len; dst.is_static = false; } /// @brief compares two buffers /// /// @param a /// @param b /// /// @return true if buffers contain the same data, false otherwise bool cmpBuffers(const message_buff& a, const message_buff&b) { if (a.len != b.len) return false; if (!memcmp(a.msg, b.msg, a.len)) return true; // ok, it differs. Let's compare them cout << hex; for (int i = 0; i < a.len; i++) { if (a.msg[i] != b.msg[i]) { cout << "Offset 0x" << i << " differs: " << int(a.msg[i]) << " vs " << int(b.msg[i]) << endl; } } cout << dec; return false; } } dibbler-1.0.1/tests/utils/Makefile0000664000175000017500000004371212561700376014017 00000000000000# Makefile.in generated by automake 1.14.1 from Makefile.am. # tests/utils/Makefile. Generated from Makefile.in by configure. # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/dibbler pkgincludedir = $(includedir)/dibbler pkglibdir = $(libdir)/dibbler pkglibexecdir = $(libexecdir)/dibbler am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = x86_64-unknown-linux-gnu host_triplet = x86_64-unknown-linux-gnu subdir = tests/utils DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/depcomp ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/libtool.m4 \ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/include/dibbler-config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = LIBRARIES = $(noinst_LIBRARIES) ARFLAGS = cru AM_V_AR = $(am__v_AR_$(V)) am__v_AR_ = $(am__v_AR_$(AM_DEFAULT_VERBOSITY)) am__v_AR_0 = @echo " AR " $@; am__v_AR_1 = libTestUtils_a_AR = $(AR) $(ARFLAGS) libTestUtils_a_LIBADD = am_libTestUtils_a_OBJECTS = poslib_utils.$(OBJEXT) libTestUtils_a_OBJECTS = $(am_libTestUtils_a_OBJECTS) AM_V_P = $(am__v_P_$(V)) am__v_P_ = $(am__v_P_$(AM_DEFAULT_VERBOSITY)) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_$(V)) am__v_GEN_ = $(am__v_GEN_$(AM_DEFAULT_VERBOSITY)) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_$(V)) am__v_at_ = $(am__v_at_$(AM_DEFAULT_VERBOSITY)) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I. -I$(top_builddir)/include depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) AM_V_lt = $(am__v_lt_$(V)) am__v_lt_ = $(am__v_lt_$(AM_DEFAULT_VERBOSITY)) am__v_lt_0 = --silent am__v_lt_1 = LTCXXCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CXXFLAGS) $(CXXFLAGS) AM_V_CXX = $(am__v_CXX_$(V)) am__v_CXX_ = $(am__v_CXX_$(AM_DEFAULT_VERBOSITY)) am__v_CXX_0 = @echo " CXX " $@; am__v_CXX_1 = CXXLD = $(CXX) CXXLINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \ $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CXXLD = $(am__v_CXXLD_$(V)) am__v_CXXLD_ = $(am__v_CXXLD_$(AM_DEFAULT_VERBOSITY)) am__v_CXXLD_0 = @echo " CXXLD " $@; am__v_CXXLD_1 = COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_$(V)) am__v_CC_ = $(am__v_CC_$(AM_DEFAULT_VERBOSITY)) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_$(V)) am__v_CCLD_ = $(am__v_CCLD_$(AM_DEFAULT_VERBOSITY)) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(libTestUtils_a_SOURCES) DIST_SOURCES = $(libTestUtils_a_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = ${SHELL} /home/thomson/devel/dibbler-git/missing aclocal-1.14 ALLOCA = AMTAR = $${TAR-tar} AM_DEFAULT_VERBOSITY = 1 AR = ar ARCH = LINUX AUTOCONF = ${SHELL} /home/thomson/devel/dibbler-git/missing autoconf AUTOHEADER = ${SHELL} /home/thomson/devel/dibbler-git/missing autoheader AUTOMAKE = ${SHELL} /home/thomson/devel/dibbler-git/missing automake-1.14 AWK = gawk CC = gcc CCDEPMODE = depmode=gcc3 CFLAGS = CPP = gcc -E CPPFLAGS = -O2 -DLINUX -Wall -pedantic -funsigned-char -DMOD_CLNT_BIND_REUSE -DMOD_CLNT_CONFIRM CXX = g++ CXXCPP = g++ -E CXXDEPMODE = depmode=gcc3 CXXFLAGS = CYGPATH_W = echo DEFS = -DHAVE_CONFIG_H DEPDIR = .deps DLLTOOL = false DSYMUTIL = DUMPBIN = ECHO_C = ECHO_N = -n ECHO_T = EGREP = /bin/grep -E EXEEXT = EXTRA_DIST_SUBDIRS = Port-bsd Port-winnt2k Port-sun FGREP = /bin/grep -F GREP = /bin/grep GTEST_INCLUDES = GTEST_LDADD = GTEST_LDFLAGS = INSTALL = /usr/bin/install -c INSTALL_DATA = ${INSTALL} -m 644 INSTALL_PROGRAM = ${INSTALL} INSTALL_SCRIPT = ${INSTALL} INSTALL_STRIP_PROGRAM = $(install_sh) -c -s LD = /usr/bin/ld -m elf_x86_64 LDFLAGS = -lpthread LIBOBJS = LIBS = LIBTOOL = $(SHELL) $(top_builddir)/libtool LINKPRINT = LIPO = LN_S = ln -s LTLIBOBJS = MAINT = # MAKEINFO = ${SHELL} /home/thomson/devel/dibbler-git/missing makeinfo MANIFEST_TOOL = : MKDIR_P = /bin/mkdir -p NM = /usr/bin/nm -B NMEDIT = OBJDUMP = objdump OBJEXT = o OTOOL = OTOOL64 = PACKAGE = dibbler PACKAGE_BUGREPORT = dibbler@klub.com.pl PACKAGE_NAME = dibbler PACKAGE_STRING = dibbler 1.0.1 PACKAGE_TARNAME = dibbler PACKAGE_URL = PACKAGE_VERSION = 1.0.1 PATH_SEPARATOR = : PORT_CFLAGS = PORT_LDFLAGS = PORT_SUBDIR = Port-linux RANLIB = ranlib SED = /bin/sed SET_MAKE = SHELL = /bin/bash STRIP = strip VERSION = 1.0.1 abs_builddir = /home/thomson/devel/dibbler-git/tests/utils abs_srcdir = /home/thomson/devel/dibbler-git/tests/utils abs_top_builddir = /home/thomson/devel/dibbler-git abs_top_srcdir = /home/thomson/devel/dibbler-git ac_ct_AR = ar ac_ct_CC = gcc ac_ct_CXX = g++ ac_ct_DUMPBIN = am__include = include am__leading_dot = . am__quote = am__tar = $${TAR-tar} chof - "$$tardir" am__untar = $${TAR-tar} xf - bindir = ${exec_prefix}/bin build = x86_64-unknown-linux-gnu build_alias = build_cpu = x86_64 build_os = linux-gnu build_vendor = unknown builddir = . datadir = ${datarootdir} datarootdir = ${prefix}/share docdir = ${datarootdir}/doc/${PACKAGE_TARNAME} dvidir = ${docdir} exec_prefix = ${prefix} host = x86_64-unknown-linux-gnu host_alias = host_cpu = x86_64 host_os = linux-gnu host_vendor = unknown htmldir = ${docdir} includedir = ${prefix}/include infodir = ${datarootdir}/info install_sh = ${SHELL} /home/thomson/devel/dibbler-git/install-sh libdir = ${exec_prefix}/lib libexecdir = ${exec_prefix}/libexec localedir = ${datarootdir}/locale localstatedir = ${prefix}/var mandir = ${datarootdir}/man mkdir_p = $(MKDIR_P) oldincludedir = /usr/include pdfdir = ${docdir} prefix = /usr/local program_transform_name = s,x,x, psdir = ${docdir} sbindir = ${exec_prefix}/sbin sharedstatedir = ${prefix}/com srcdir = . subdirs = bison++ sysconfdir = ${prefix}/etc target_alias = top_build_prefix = ../../ top_builddir = ../.. top_srcdir = ../.. # This is to workaround long long in gtest.h AM_CPPFLAGS = -I$(top_srcdir)/CfgMgr -I$(top_srcdir)/Misc \ -I$(top_srcdir)/poslib $(GTEST_INCLUDES) -Wno-long-long \ -Wno-variadic-macros noinst_LIBRARIES = libTestUtils.a libTestUtils_a_SOURCES = poslib_utils.cc poslib_utils.h all: all-am .SUFFIXES: .SUFFIXES: .cc .lo .o .obj $(srcdir)/Makefile.in: # $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign tests/utils/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign tests/utils/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: # $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): # $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstLIBRARIES: -test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES) libTestUtils.a: $(libTestUtils_a_OBJECTS) $(libTestUtils_a_DEPENDENCIES) $(EXTRA_libTestUtils_a_DEPENDENCIES) $(AM_V_at)-rm -f libTestUtils.a $(AM_V_AR)$(libTestUtils_a_AR) libTestUtils.a $(libTestUtils_a_OBJECTS) $(libTestUtils_a_LIBADD) $(AM_V_at)$(RANLIB) libTestUtils.a mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c include ./$(DEPDIR)/poslib_utils.Po .cc.o: $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po # $(AM_V_CXX)source='$<' object='$@' libtool=no \ # DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) \ # $(AM_V_CXX_no)$(CXXCOMPILE) -c -o $@ $< .cc.obj: $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po # $(AM_V_CXX)source='$<' object='$@' libtool=no \ # DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) \ # $(AM_V_CXX_no)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .cc.lo: $(AM_V_CXX)$(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo # $(AM_V_CXX)source='$<' object='$@' libtool=yes \ # DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) \ # $(AM_V_CXX_no)$(LTCXXCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LIBRARIES) installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool clean-noinstLIBRARIES \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \ clean-libtool clean-noinstLIBRARIES cscopelist-am ctags \ ctags-am distclean distclean-compile distclean-generic \ distclean-libtool distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-dvi install-dvi-am install-exec \ install-exec-am install-html install-html-am install-info \ install-info-am install-man install-pdf install-pdf-am \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ tags tags-am uninstall uninstall-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: dibbler-1.0.1/tests/utils/Makefile.am0000644000175000017500000000047712277722751014417 00000000000000AM_CPPFLAGS = -I$(top_srcdir)/CfgMgr AM_CPPFLAGS += -I$(top_srcdir)/Misc AM_CPPFLAGS += -I$(top_srcdir)/poslib # This is to workaround long long in gtest.h AM_CPPFLAGS += $(GTEST_INCLUDES) -Wno-long-long -Wno-variadic-macros noinst_LIBRARIES = libTestUtils.a libTestUtils_a_SOURCES = poslib_utils.cc poslib_utils.h dibbler-1.0.1/tests/utils/poslib_utils.h0000644000175000017500000000035312277722751015235 00000000000000 #ifndef TEST_POSLIB_UTILS_H #define TEST_POSLIB_UTILS_H #include "poslib.h" namespace test { void hexToBin(const std::string& hex, message_buff &dst); bool cmpBuffers(const message_buff& a, const message_buff&b); } #endif dibbler-1.0.1/tests/utils/.deps/0000775000175000017500000000000012561700377013442 500000000000000dibbler-1.0.1/tests/utils/.deps/poslib_utils.Po0000664000175000017500000000001012561700377016361 00000000000000# dummy dibbler-1.0.1/tests/utils/Makefile.in0000664000175000017500000004445612561652536014436 00000000000000# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = tests/utils DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/depcomp ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/libtool.m4 \ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/include/dibbler-config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = LIBRARIES = $(noinst_LIBRARIES) ARFLAGS = cru AM_V_AR = $(am__v_AR_@AM_V@) am__v_AR_ = $(am__v_AR_@AM_DEFAULT_V@) am__v_AR_0 = @echo " AR " $@; am__v_AR_1 = libTestUtils_a_AR = $(AR) $(ARFLAGS) libTestUtils_a_LIBADD = am_libTestUtils_a_OBJECTS = poslib_utils.$(OBJEXT) libTestUtils_a_OBJECTS = $(am_libTestUtils_a_OBJECTS) AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)/include depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = LTCXXCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CXXFLAGS) $(CXXFLAGS) AM_V_CXX = $(am__v_CXX_@AM_V@) am__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@) am__v_CXX_0 = @echo " CXX " $@; am__v_CXX_1 = CXXLD = $(CXX) CXXLINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \ $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CXXLD = $(am__v_CXXLD_@AM_V@) am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@) am__v_CXXLD_0 = @echo " CXXLD " $@; am__v_CXXLD_1 = COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(libTestUtils_a_SOURCES) DIST_SOURCES = $(libTestUtils_a_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALLOCA = @ALLOCA@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ ARCH = @ARCH@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ EXTRA_DIST_SUBDIRS = @EXTRA_DIST_SUBDIRS@ FGREP = @FGREP@ GREP = @GREP@ GTEST_INCLUDES = @GTEST_INCLUDES@ GTEST_LDADD = @GTEST_LDADD@ GTEST_LDFLAGS = @GTEST_LDFLAGS@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LINKPRINT = @LINKPRINT@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PORT_CFLAGS = @PORT_CFLAGS@ PORT_LDFLAGS = @PORT_LDFLAGS@ PORT_SUBDIR = @PORT_SUBDIR@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ subdirs = @subdirs@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ # This is to workaround long long in gtest.h AM_CPPFLAGS = -I$(top_srcdir)/CfgMgr -I$(top_srcdir)/Misc \ -I$(top_srcdir)/poslib $(GTEST_INCLUDES) -Wno-long-long \ -Wno-variadic-macros noinst_LIBRARIES = libTestUtils.a libTestUtils_a_SOURCES = poslib_utils.cc poslib_utils.h all: all-am .SUFFIXES: .SUFFIXES: .cc .lo .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign tests/utils/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign tests/utils/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstLIBRARIES: -test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES) libTestUtils.a: $(libTestUtils_a_OBJECTS) $(libTestUtils_a_DEPENDENCIES) $(EXTRA_libTestUtils_a_DEPENDENCIES) $(AM_V_at)-rm -f libTestUtils.a $(AM_V_AR)$(libTestUtils_a_AR) libTestUtils.a $(libTestUtils_a_OBJECTS) $(libTestUtils_a_LIBADD) $(AM_V_at)$(RANLIB) libTestUtils.a mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/poslib_utils.Po@am__quote@ .cc.o: @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $< .cc.obj: @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .cc.lo: @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LTCXXCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LIBRARIES) installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool clean-noinstLIBRARIES \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \ clean-libtool clean-noinstLIBRARIES cscopelist-am ctags \ ctags-am distclean distclean-compile distclean-generic \ distclean-libtool distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-dvi install-dvi-am install-exec \ install-exec-am install-html install-html-am install-info \ install-info-am install-man install-pdf install-pdf-am \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ tags tags-am uninstall uninstall-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: dibbler-1.0.1/tests/Srv/0000755000175000017500000000000012561700377012041 500000000000000dibbler-1.0.1/tests/Srv/assign_utils.h0000644000175000017500000001510312474426552014641 00000000000000#include #include "SrvMsgSolicit.h" #include "SrvMsgAdvertise.h" #include "SrvMsgRequest.h" #include "SrvMsgReply.h" #include "SrvMsgRenew.h" #include "SrvMsgRebind.h" #include "SrvMsgRelease.h" #include "SrvMsgConfirm.h" #include "SrvMsgDecline.h" #include "SrvMsgInfRequest.h" #include "SrvOptIA_NA.h" #include "SrvOptIA_PD.h" #include #include namespace test { /// @brief holds information about received IPv6 packet data struct Pkt6Info { Pkt6Info(int iface, char* msg, int size, SPtr addr, int port); int Iface_; std::vector Data_; SPtr Addr_; int Port_; }; /// @brief a collection of received (unparsed) packets typedef std::vector Pkt6Collection; class NakedSrvIfaceMgr: public TSrvIfaceMgr { public: Pkt6Collection sent_pkts_; NakedSrvIfaceMgr(const std::string& xmlFile) : TSrvIfaceMgr(xmlFile) { TSrvIfaceMgr::Instance = this; } ~NakedSrvIfaceMgr() { TSrvIfaceMgr::Instance = NULL; } virtual bool send(int iface, char *msg, int size, SPtr addr, int port); virtual int receive(unsigned long timeout, char* buf, int& bufsize, SPtr peer, SPtr myaddr); }; class NakedSrvAddrMgr: public TSrvAddrMgr { public: NakedSrvAddrMgr(const std::string& config, bool load_db) :TSrvAddrMgr(config, load_db) { TSrvAddrMgr::Instance = this; } ~NakedSrvAddrMgr() { TSrvAddrMgr::Instance = NULL; } }; class NakedSrvCfgMgr : public TSrvCfgMgr { public: NakedSrvCfgMgr(const std::string& config, const std::string& dbfile) :TSrvCfgMgr(config, dbfile) { TSrvCfgMgr::Instance = this; } ~NakedSrvCfgMgr() { TSrvCfgMgr::Instance = NULL; } }; class NakedSrvTransMgr: public TSrvTransMgr { public: NakedSrvTransMgr(const std::string& xmlFile, int port) :TSrvTransMgr(xmlFile, port) { TSrvTransMgr::Instance = this; } virtual void sendPacket(SPtr msg); SrvMsgList& getMsgLst() { return MsgLst_; } ~NakedSrvTransMgr() { TSrvTransMgr::Instance = NULL; } SrvMsgList MsgLst_; }; class ServerTest : public ::testing::Test { public: ServerTest(); bool createMgrs(std::string config); void createIAs(TMsg * msg); void setIface(const std::string& name); /// @brief creates SOLICIT message and IA_NA, IA_TA, IA_PD options SPtr createSolicit(); /// @brief creates REQUEST message and IA_NA, IA_TA, IA_PD options SPtr createRequest(); /// @brief creates RENEW message and IA_NA, IA_TA, IA_PD options SPtr createRenew(); /// @brief creates REBIND message and IA_NA, IA_TA, IA_PD options SPtr createRebind(); /// @brief creates RELEASE message and IA_NA, IA_TA, IA_PD options SPtr createRelease(); /// @brief creates DECLINE message and IA_NA, IA_TA, IA_PD options SPtr createDecline(); /// @brief creates CONFIRM message and IA_NA, IA_TA, IA_PD options SPtr createConfirm(); /// @brief creates INF-REQUEST message and IA_NA, IA_TA, IA_PD options SPtr createInfRequest(); /// @brief creates an IAPREFIX option with specified parameters /// /// @param addr_txt text representation of the prefix /// @param len prefix length /// @param pref preferred lifetime (in seconds) /// @param valid valid lifetime (in seconds) /// /// @return IAPREFIX option TOptPtr createPrefix(const std::string& addr_txt, uint8_t len, uint32_t pref, uint32_t valid); /// @brief Conducts prefix delegation assignment test /// /// Sends SOLCIT with IA_PD, checks that the ADVERTISE contains proper response /// with expected values, then sends REQUEST and repeats the checks for /// received REPLY. /// /// @param config /// @param pd_to_be_sent /// @param min_range /// @param max_range /// @param expected_prefix_len /// @param expected_iaid /// @param expected_t1 /// @param expected_t2 /// @param expected_pref /// @param expected_valid void prefixText(const std::string& config, const TOptPtr& pd_to_be_sent, const std::string& min_range, const std::string& max_range, uint8_t expected_prefix_len, uint32_t expected_iaid, uint32_t expected_t1, uint32_t expected_t2, uint32_t expected_pref, uint32_t expected_valid); SPtr sendAndReceive(SPtr clntMsg, unsigned int expectedMsgCount = 1); bool checkIA_NA(SPtr ia, SPtr minRange, SPtr maxRange, uint32_t iaid, uint32_t t1, uint32_t t2, uint32_t pref, uint32_t valid); bool checkIA_PD(SPtr ia, SPtr minRange, SPtr maxRange, uint32_t iaid, uint32_t t1, uint32_t t2, uint32_t pref, uint32_t valid, uint8_t prefixLen); void addRelayInfo(const std::string& linkAddr, const std::string& peerAddr, uint8_t hopCount, const TOptList& echoList); void sendHex(const std::string& src_addr, uint16_t src_port, const std::string& dst_addr, uint16_t dst_port, const std::string& iface_name, const std::string& hex_data); void clearRelayInfo(); void setRelayInfo(SPtr msg); ~ServerTest(); NakedSrvIfaceMgr * ifacemgr_; NakedSrvCfgMgr * cfgmgr_; NakedSrvAddrMgr * addrmgr_; NakedSrvTransMgr * transmgr_; SPtr iface_; SPtr cfgIface_; SPtr clntAddr_; SPtr clntDuid_; SPtr clntId_; SPtr ia_; SPtr pd_; SPtr ta_; uint32_t ia_iaid_; uint32_t ta_iaid_; uint32_t pd_iaid_; // Relay info std::vector relayInfo_; }; } // namespace test dibbler-1.0.1/tests/Srv/relay_unittest.cc0000644000175000017500000003325512277722750015356 00000000000000/* * Dibbler - a portable DHCPv6 * * author: Tomasz Mrugalski * * released under GNU GPL v2 only licence * */ #include "SrvIfaceMgr.h" #include "SrvCfgMgr.h" #include "SrvTransMgr.h" #include "assign_utils.h" #include using namespace std; namespace test { TEST_F(ServerTest, decodeRelayForwGuessMode) { // check that an interface was successfully selected string cfg = "guess-mode\n" "iface REPLACE_ME {\n" " class { pool 2001:db8:1::/64 }\n" "}\n" "\n" "iface relay1 {" " relay REPLACE_ME\n" " interface-id 1234\n" " class { pool 2001:db8:123::/64 }\n" "}\n"; ASSERT_TRUE( createMgrs(cfg) ); SrvIfaceMgr().dump(); // now generate SOLICIT setIface("relay1"); clntAddr_ = SPtr(new TIPv6Addr("ff05::1:3", true)); SPtr sol = (Ptr*)createSolicit(); sol->addOption((Ptr*)clntId_); // include client-id sol->addOption((Ptr*)ia_); // include IA_NA sol->setMsgType(RELAY_FORW_MSG); TOptList echoOpts; addRelayInfo("2001:db8:123::1", "fe80::abcd", 31, echoOpts); setRelayInfo(sol); sol->send(10000 + DHCPSERVER_PORT); SPtr received = SrvIfaceMgr().select(1); ASSERT_TRUE(received); vector rcvRelay = received->RelayInfo_; // Check that there's info about exactly one relay ASSERT_EQ(rcvRelay.size(), 1u); // Check link-address, peer-addr and hop fields ASSERT_TRUE(rcvRelay[0].LinkAddr_); EXPECT_EQ(string(rcvRelay[0].LinkAddr_->getPlain()), "2001:db8:123::1"); ASSERT_TRUE(rcvRelay[0].PeerAddr_); EXPECT_EQ(string(rcvRelay[0].PeerAddr_->getPlain()), "fe80::abcd"); EXPECT_EQ(rcvRelay[0].Hop_, 31); // Check that there are no echo request options stored EXPECT_EQ(rcvRelay[0].EchoList_.size(), 0u); // Check that no remote-id was stored EXPECT_FALSE(received->getRemoteID()); // Check that the packet was marked as received over proper interface SPtr cfgIface = SrvCfgMgr().getIfaceByID(received->getIface()); ASSERT_TRUE(cfgIface); EXPECT_EQ(cfgIface->getName(), "relay1"); } TEST_F(ServerTest, relaySelectInterfaceIdInteger) { // check that an interface was successfully selected string cfg = "iface REPLACE_ME {\n" " class { pool 2001:db8:0::/64 }\n" "}\n" "\n" "iface relay1 {" " relay REPLACE_ME\n" " interface-id 11111\n" " class { pool 2001:db8:1::/64 }\n" "}\n" "iface relay2 {" " relay REPLACE_ME\n" " interface-id 12345\n" " class { pool 2001:db8:2::/64 }\n" "}\n" "iface relay3 {" " relay REPLACE_ME\n" " interface-id 33333\n" " class { pool 2001:db8:3::/64 }\n" "}\n"; ASSERT_TRUE( createMgrs(cfg) ); SrvIfaceMgr().dump(); // now generate SOLICIT setIface("relay2"); clntAddr_ = SPtr(new TIPv6Addr("ff05::1:3", true)); SPtr sol = (Ptr*)createSolicit(); sol->addOption((Ptr*)clntId_); // include client-id sol->addOption((Ptr*)ia_); // include IA_NA sol->setMsgType(RELAY_FORW_MSG); TOptList echoOpts; SPtr ifaceId(new TSrvOptInterfaceID(12346, NULL)); echoOpts.push_back(ifaceId); addRelayInfo("2001:db8:123::1", "fe80::abcd", 31, echoOpts); setRelayInfo(sol); // Sending packet with mismatched interface-id sol->send(10000 + DHCPSERVER_PORT); // It should not be handled SPtr received = SrvIfaceMgr().select(1); ASSERT_FALSE(received); clearRelayInfo(); sol->clearRelayInfo(); ifaceId = SPtr(new TSrvOptInterfaceID(12345, NULL)); echoOpts.clear(); echoOpts.push_back(ifaceId); addRelayInfo("2001:db8:123::1", "fe80::abcd", 31, echoOpts); setRelayInfo(sol); // Sending packet with matched interface-id sol->send(10000 + DHCPSERVER_PORT); received = SrvIfaceMgr().select(1); ASSERT_TRUE(received); vector rcvRelay = received->RelayInfo_; // Check that there's info about 1 relay ASSERT_EQ(rcvRelay.size(), 1u); // Check link-address, peer-addr and hop fields ASSERT_TRUE(rcvRelay[0].LinkAddr_); EXPECT_EQ(string(rcvRelay[0].LinkAddr_->getPlain()), "2001:db8:123::1"); ASSERT_TRUE(rcvRelay[0].PeerAddr_); EXPECT_EQ(string(rcvRelay[0].PeerAddr_->getPlain()), "fe80::abcd"); EXPECT_EQ(rcvRelay[0].Hop_, 31); // Check that there is one option stored (it should be interface-id) EXPECT_EQ(rcvRelay[0].EchoList_.size(), 1u); // Check that no remote-id was stored EXPECT_FALSE(received->getRemoteID()); // Check that the packet was marked as received over proper interface SPtr cfgIface = SrvCfgMgr().getIfaceByID(received->getIface()); ASSERT_TRUE(cfgIface); EXPECT_EQ(cfgIface->getName(), "relay2"); } TEST_F(ServerTest, relaySelectInterfaceIdString) { // check that an interface was successfully selected string cfg = "iface REPLACE_ME {\n" " class { pool 2001:db8:0::/64 }\n" "}\n" "\n" "iface relay1 {" " relay REPLACE_ME\n" " interface-id \"alpha\"\n" " class { pool 2001:db8:1::/64 }\n" "}\n" "iface relay2 {" " relay REPLACE_ME\n" " interface-id \"bravo-foxtrot\"\n" " class { pool 2001:db8:2::/64 }\n" "}\n" "iface relay3 {" " relay REPLACE_ME\n" " interface-id \"charlie\"\n" " class { pool 2001:db8:3::/64 }\n" "}\n"; ASSERT_TRUE( createMgrs(cfg) ); SrvIfaceMgr().dump(); // now generate SOLICIT setIface("relay2"); clntAddr_ = SPtr(new TIPv6Addr("ff05::1:3", true)); SPtr sol = (Ptr*)createSolicit(); sol->addOption((Ptr*)clntId_); // include client-id sol->addOption((Ptr*)ia_); // include IA_NA sol->setMsgType(RELAY_FORW_MSG); TOptList echoOpts; SPtr ifaceId(new TSrvOptInterfaceID("delta", 5, NULL)); echoOpts.push_back(ifaceId); addRelayInfo("2001:db8:123::1", "fe80::abcd", 31, echoOpts); setRelayInfo(sol); // Sending packet with mismatched interface-id sol->send(10000 + DHCPSERVER_PORT); // It should not be handled SPtr received = SrvIfaceMgr().select(1); ASSERT_FALSE(received); clearRelayInfo(); sol->clearRelayInfo(); ifaceId = SPtr(new TSrvOptInterfaceID("bravo-foxtrot", 13, NULL)); echoOpts.clear(); echoOpts.push_back(ifaceId); addRelayInfo("2001:db8:123::1", "fe80::abcd", 31, echoOpts); setRelayInfo(sol); // Sending packet with matched interface-id sol->send(10000 + DHCPSERVER_PORT); received = SrvIfaceMgr().select(1); ASSERT_TRUE(received); vector &rcvRelay = received->RelayInfo_; // Check that there's info about 1 relay ASSERT_EQ(rcvRelay.size(), 1u); // Check link-address, peer-addr and hop fields ASSERT_TRUE(rcvRelay[0].LinkAddr_); EXPECT_EQ(string(rcvRelay[0].LinkAddr_->getPlain()), "2001:db8:123::1"); ASSERT_TRUE(rcvRelay[0].PeerAddr_); EXPECT_EQ(string(rcvRelay[0].PeerAddr_->getPlain()), "fe80::abcd"); EXPECT_EQ(rcvRelay[0].Hop_, 31); // Check that there are no echo request options stored other than interface-id EXPECT_EQ(rcvRelay[0].EchoList_.size(), 1u); // Check that no remote-id was stored EXPECT_FALSE(received->getRemoteID()); // Check that the packet was marked as received over proper interface SPtr cfgIface = SrvCfgMgr().getIfaceByID(received->getIface()); ASSERT_TRUE(cfgIface); EXPECT_EQ(cfgIface->getName(), "relay2"); } TEST_F(ServerTest, relaySelectInterfaceIdHex) { // check that an interface was successfully selected string cfg = "iface REPLACE_ME {\n" " class { pool 2001:db8:0::/64 }\n" "}\n" "\n" "iface relay1 {" " relay REPLACE_ME\n" " interface-id 0x123456\n" " class { pool 2001:db8:1::/64 }\n" "}\n" "iface relay2 {" " relay REPLACE_ME\n" " interface-id 0xbc\n" " class { pool 2001:db8:2::/64 }\n" "}\n" "iface relay3 {" " relay REPLACE_ME\n" " interface-id 0x01234567890abcdef1234567890fedcba\n" " class { pool 2001:db8:3::/64 }\n" "}\n"; ASSERT_TRUE( createMgrs(cfg) ); SrvIfaceMgr().dump(); // now generate SOLICIT setIface("relay2"); clntAddr_ = SPtr(new TIPv6Addr("ff05::1:3", true)); SPtr sol = (Ptr*)createSolicit(); sol->addOption((Ptr*)clntId_); // include client-id sol->addOption((Ptr*)ia_); // include IA_NA sol->setMsgType(RELAY_FORW_MSG); TOptList echoOpts; char bogusIfaceId[] = { 0xff }; echoOpts.clear(); SPtr ifaceId(new TSrvOptInterfaceID(bogusIfaceId, 1, NULL)); echoOpts.push_back(ifaceId); addRelayInfo("2001:db8:123::1", "fe80::abcd", 31, echoOpts); setRelayInfo(sol); // Sending packet with mismatched interface-id sol->send(10000 + DHCPSERVER_PORT); // It should not be handled SPtr received = SrvIfaceMgr().select(1); ASSERT_FALSE(received); clearRelayInfo(); sol->clearRelayInfo(); char validIfaceId[] = { 0xbc }; ifaceId = SPtr(new TSrvOptInterfaceID(validIfaceId, 1, NULL)); echoOpts.clear(); echoOpts.push_back(ifaceId); addRelayInfo("2001:db8:123::1", "fe80::abcd", 31, echoOpts); setRelayInfo(sol); // Sending packet with matched interface-id sol->send(10000 + DHCPSERVER_PORT); received = SrvIfaceMgr().select(1); ASSERT_TRUE(received); vector rcvRelay = received->RelayInfo_; // Check that there's info about 1 relay ASSERT_EQ(rcvRelay.size(), 1u); // Check link-address, peer-addr and hop fields ASSERT_TRUE(rcvRelay[0].LinkAddr_); EXPECT_EQ(string(rcvRelay[0].LinkAddr_->getPlain()), "2001:db8:123::1"); ASSERT_TRUE(rcvRelay[0].PeerAddr_); EXPECT_EQ(string(rcvRelay[0].PeerAddr_->getPlain()), "fe80::abcd"); EXPECT_EQ(rcvRelay[0].Hop_, 31); // Check that there are no echo request options stored other than interface-id EXPECT_EQ(rcvRelay[0].EchoList_.size(), 1u); // Check that no remote-id was stored EXPECT_FALSE(received->getRemoteID()); // Check that the packet was marked as received over proper interface SPtr cfgIface = SrvCfgMgr().getIfaceByID(received->getIface()); ASSERT_TRUE(cfgIface); EXPECT_EQ(cfgIface->getName(), "relay2"); } TEST_F(ServerTest, relaySelectSubnet) { // check that an interface was successfully selected string cfg = "iface REPLACE_ME {\n" " class { pool 2001:db8:0::/64 }\n" "}\n" "\n" "iface relay1 {" " subnet 2001:db8:1::/64\n" " relay REPLACE_ME\n" " class { pool 2001:db8:1::/64 }\n" "}\n" "iface relay2 {" " subnet 2001:db8:2::/64\n" " relay REPLACE_ME\n" " class { pool 2001:db8:2::/64 }\n" "}\n" "iface relay3 {" " subnet 2001:db8:3::/64\n" " relay REPLACE_ME\n" " class { pool 2001:db8:3::/64 }\n" "}\n"; ASSERT_TRUE( createMgrs(cfg) ); SrvIfaceMgr().dump(); // now generate SOLICIT setIface("relay2"); clntAddr_ = SPtr(new TIPv6Addr("ff05::1:3", true)); SPtr sol = (Ptr*)createSolicit(); sol->addOption((Ptr*)clntId_); // include client-id sol->addOption((Ptr*)ia_); // include IA_NA sol->setMsgType(RELAY_FORW_MSG); TOptList echoOpts; addRelayInfo("2001:db8:123::1", "fe80::abcd", 31, echoOpts); setRelayInfo(sol); // Sending packet with mismatched link-address sol->send(10000 + DHCPSERVER_PORT); // It should not be handled SPtr received = SrvIfaceMgr().select(1); ASSERT_FALSE(received); clearRelayInfo(); sol->clearRelayInfo(); addRelayInfo("2001:db8:2::1", "fe80::abcd", 31, echoOpts); setRelayInfo(sol); // Sending packet with matched interface-id sol->send(10000 + DHCPSERVER_PORT); received = SrvIfaceMgr().select(1); ASSERT_TRUE(received); vector rcvRelay = received->RelayInfo_; // Check that there's info about 1 relay ASSERT_EQ(rcvRelay.size(), 1u); // Check link-address, peer-addr and hop fields ASSERT_TRUE(rcvRelay[0].LinkAddr_); EXPECT_EQ(string(rcvRelay[0].LinkAddr_->getPlain()), "2001:db8:2::1"); ASSERT_TRUE(rcvRelay[0].PeerAddr_); EXPECT_EQ(string(rcvRelay[0].PeerAddr_->getPlain()), "fe80::abcd"); EXPECT_EQ(rcvRelay[0].Hop_, 31); // Check that there are no echo request options stored EXPECT_EQ(rcvRelay[0].EchoList_.size(), 0u); // Check that no remote-id was stored EXPECT_FALSE(received->getRemoteID()); // Check that the packet was marked as received over proper interface SPtr cfgIface = SrvCfgMgr().getIfaceByID(received->getIface()); ASSERT_TRUE(cfgIface); EXPECT_EQ(cfgIface->getName(), "relay2"); } } dibbler-1.0.1/tests/Srv/run_tests.cpp0000664000175000017500000000031712233256142014506 00000000000000 #define STDC_HEADERS 1 #include #include int main(int argc, char* argv[]) { testing::InitGoogleTest(&argc, argv); int status = RUN_ALL_TESTS(); return status; } dibbler-1.0.1/tests/Srv/testdata/0000755000175000017500000000000012561666001013645 500000000000000dibbler-1.0.1/tests/Srv/testdata/info.txt0000644000175000017500000000007412277722750015272 00000000000000This is an empty directory. Test data will be stored here. dibbler-1.0.1/tests/Srv/assign_utils.cc0000644000175000017500000003477112556515335015012 00000000000000#include #include #include "assign_utils.h" #include "OptAddrLst.h" #include "OptStatusCode.h" #include #include using namespace std; namespace test { Pkt6Info::Pkt6Info(int iface, char* msg, int size, SPtr addr, int port) :Iface_(iface), Data_(size), Addr_(addr), Port_(port) { memcpy(&Data_[0], msg, size); } bool NakedSrvIfaceMgr::send(int iface, char *msg, int size, SPtr addr, int port) { Pkt6Info x(iface, msg, size, addr, port); sent_pkts_.push_back(x); return TSrvIfaceMgr::send(iface, msg, size, addr, port); } int NakedSrvIfaceMgr::receive(unsigned long timeout, char* buf, int& bufsize, SPtr peer, SPtr myaddr) { return TSrvIfaceMgr::receive(timeout, buf, bufsize, peer, myaddr); } ServerTest::ServerTest() { clntDuid_ = new TDUID("00:01:00:0a:0b:0c:0d:0e:0f"); clntId_ = new TOptDUID(OPTION_CLIENTID, clntDuid_, NULL); clntAddr_ = new TIPv6Addr("fe80::1234", true); ifacemgr_ = new NakedSrvIfaceMgr("testdata/server-IfaceMgr.xml"); // try to pick up an up and running interface ifacemgr_->firstIface(); while ( (iface_ = ifacemgr_->getIface()) && (!iface_->flagUp() || !iface_->flagRunning())) { } } void ServerTest::createIAs(TMsg* msg) { ia_iaid_ = 123; ia_ = new TSrvOptIA_NA(ia_iaid_, 100, 200, msg); ta_iaid_ = 456; ta_ = new TOptTA(ta_iaid_, msg); pd_iaid_ = 789; pd_ = new TSrvOptIA_PD(pd_iaid_, 100, 200, msg); } SPtr ServerTest::createSolicit() { char empty[] = { SOLICIT_MSG, 0x1, 0x2, 0x3}; SPtr sol = new TSrvMsgSolicit(iface_->getID(), clntAddr_, empty, sizeof(empty)); createIAs(&(*sol)); return sol; } SPtr ServerTest::createRequest() { char empty[] = { REQUEST_MSG, 0x1, 0x2, 0x4}; SPtr request = new TSrvMsgRequest(iface_->getID(), clntAddr_, empty, sizeof(empty)); createIAs(&(*request)); return request; } SPtr ServerTest::createRenew() { char empty[] = { RENEW_MSG, 0x1, 0x2, 0x5}; SPtr renew = new TSrvMsgRenew(iface_->getID(), clntAddr_, empty, sizeof(empty)); createIAs(&(*renew)); return renew; } SPtr ServerTest::createRebind() { char empty[] = { REBIND_MSG, 0x1, 0x2, 0x6}; SPtr rebind = new TSrvMsgRebind(iface_->getID(), clntAddr_, empty, sizeof(empty)); createIAs(&(*rebind)); return rebind; } SPtr ServerTest::createRelease() { char empty[] = { RELEASE_MSG, 0x1, 0x2, 0x7}; SPtr release = new TSrvMsgRelease(iface_->getID(), clntAddr_, empty, sizeof(empty)); createIAs(&(*release)); return release; } SPtr ServerTest::createDecline() { char empty[] = { DECLINE_MSG, 0x1, 0x2, 0x8}; SPtr decline = new TSrvMsgDecline(iface_->getID(), clntAddr_, empty, sizeof(empty)); createIAs(&(*decline)); return decline; } SPtr ServerTest::createConfirm() { char empty[] = { CONFIRM_MSG, 0x1, 0x2, 0x9}; SPtr confirm = new TSrvMsgConfirm(iface_->getID(), clntAddr_, empty, sizeof(empty)); createIAs(&(*confirm)); return confirm; } SPtr ServerTest::createInfRequest() { char empty[] = { INFORMATION_REQUEST_MSG, 0x1, 0x2, 0xa}; SPtr infrequest = new TSrvMsgInfRequest(iface_->getID(), clntAddr_, empty, sizeof(empty)); createIAs(&(*infrequest)); return infrequest; } bool ServerTest::checkIA_NA(SPtr ia, SPtr minRange, SPtr maxRange, uint32_t iaid, uint32_t t1, uint32_t t2, uint32_t pref, uint32_t valid) { THostRange range(minRange, maxRange); int count = 0; EXPECT_EQ(iaid, ia->getIAID()); EXPECT_EQ(t1, ia->getT1()); EXPECT_EQ(t2, ia->getT2()); ia->firstOption(); while (SPtr option = ia->getOption()) { switch (option->getOptType()) { case OPTION_STATUS_CODE: { SPtr optCode = (Ptr*)option; EXPECT_EQ(STATUSCODE_SUCCESS, optCode->getCode()); break; } case OPTION_IAADDR: { SPtr optAddr = (Ptr*)option; cout << "Checking received address " << optAddr->getAddr()->getPlain() << endl; EXPECT_TRUE( range.in(optAddr->getAddr()) ); EXPECT_EQ(pref, optAddr->getPref() ); EXPECT_EQ(valid, optAddr->getValid() ); count++; break; } default: ADD_FAILURE() << "Unexpected option type " << option->getOptType() << " received in IA_NA(iaid=" << ia_->getIAID(); break; } } return (count>0); } bool ServerTest::checkIA_PD(SPtr pd, SPtr minRange, SPtr maxRange, uint32_t iaid, uint32_t t1, uint32_t t2, uint32_t pref, uint32_t valid, uint8_t prefixLen) { THostRange range(minRange, maxRange); int count = 0; EXPECT_EQ(iaid, pd->getIAID()); EXPECT_EQ(t1, pd->getT1()); EXPECT_EQ(t2, pd->getT2()); pd->firstOption(); while (SPtr option = pd->getOption()) { switch (option->getOptType()) { case OPTION_STATUS_CODE: { SPtr optCode = (Ptr*)option; EXPECT_EQ(STATUSCODE_SUCCESS, optCode->getCode()); break; } case OPTION_IAPREFIX: { SPtr optPrefix = (Ptr*)option; cout << "Checking received prefix " << optPrefix->getPrefix()->getPlain() << "/" << (int)optPrefix->getPrefixLength() << endl; EXPECT_TRUE( range.in(optPrefix->getPrefix()) ); EXPECT_EQ(pref, optPrefix->getPref() ); EXPECT_EQ(valid, optPrefix->getValid() ); EXPECT_EQ(prefixLen, optPrefix->getPrefixLength()); count++; break; } default: ADD_FAILURE() << "Unexpected option type " << option->getOptType() << " received in IA_PD(iaid=" << ia_->getIAID() << ")"; break; } } return (count>0); } SPtr ServerTest::sendAndReceive(SPtr clntMsg, unsigned int expectedMsgCount/* = 1*/) { EXPECT_EQ(expectedMsgCount - 1, transmgr_->getMsgLst().size()); // process it through server usual routines transmgr_->relayMsg(clntMsg); EXPECT_EQ(expectedMsgCount, transmgr_->getMsgLst().size()); SrvMsgList& msglst = transmgr_->getMsgLst(); SPtr rsp; for (SrvMsgList::const_iterator it = msglst.begin(); it != msglst.end(); ++it) { if ((*it)->getTransID() == clntMsg->getTransID()) { rsp = *it; } } if (!rsp) { ADD_FAILURE() << "Response with transid=" << std::hex << clntMsg->getTransID() << " not found."; return SPtr(); // NULL } if (clntMsg->getTransID() != rsp->getTransID()) { ADD_FAILURE() << "Returned message has transid=" << rsp->getTransID() << ", but sent message with transid=" << clntMsg->getTransID(); return SPtr(); // NULL } return rsp; } void NakedSrvTransMgr::sendPacket(SPtr msg) { std::cout << "Pretending to send packet" << std::endl; MsgLst_.push_back(msg); } bool ServerTest::createMgrs(std::string config) { if (!iface_) { ADD_FAILURE() << "No suitable interface detected: all are down or not running"; return false; } // try to repalace IFACE name with an actual string name size_t pos; do { pos = config.find("REPLACE_ME"); if (pos != std::string::npos) { config.replace(pos, 10, iface_->getName()); } } while (pos != std::string::npos); std::ofstream cfgfile("testdata/server.conf"); cfgfile << config; cfgfile.close(); unlink("server-cache.xml"); cfgmgr_ = new NakedSrvCfgMgr("testdata/server.conf", "testdata/server-CfgMgr.xml"); addrmgr_ = new NakedSrvAddrMgr("testdata/server-AddrMgr.xml", false); // don't load db transmgr_ = new NakedSrvTransMgr("testdata/server-TransMgr.xml", 10000 + DHCPSERVER_PORT); if (cfgmgr_->isDone()) { ADD_FAILURE() << "CfgMgr reported problems and is shutting down."; return false; } cfgmgr_->firstIface(); while (cfgIface_ = cfgmgr_->getIface()) { if (cfgIface_->getName() == iface_->getName()) break; } if (!cfgIface_) { ADD_FAILURE() << "Failed to find expected " << iface_->getName() << " interface in CfgMgr." << std::endl; return false; } return true; } void ServerTest::addRelayInfo(const std::string& linkAddr, const std::string& peerAddr, uint8_t hopCount, const TOptList& echoList) { TSrvMsg::RelayInfo x; x.LinkAddr_ = SPtr(new TIPv6Addr(linkAddr.c_str(), true)); x.PeerAddr_ = SPtr(new TIPv6Addr(peerAddr.c_str(), true)); x.Len_ = 0; x.Hop_ = hopCount; x.EchoList_ = echoList; relayInfo_.push_back(x); } void ServerTest::clearRelayInfo() { relayInfo_.clear(); } void ServerTest::setRelayInfo(SPtr msg) { for (std::vector::const_iterator relay = relayInfo_.begin(); relay != relayInfo_.end(); ++relay) { msg->addRelayInfo(relay->LinkAddr_, relay->PeerAddr_, relay->Hop_, relay->EchoList_); } } void ServerTest::setIface(const std::string& name) { ASSERT_TRUE(SrvCfgMgr().getIfaceByName(name)); ASSERT_NE(-1, SrvCfgMgr().getIfaceByName("relay1")->getRelayID()); iface_ = (Ptr*) SrvIfaceMgr().getIfaceByID(SrvCfgMgr().getIfaceByName(name)->getRelayID()); } void ServerTest::sendHex(const std::string& src_addr, uint16_t src_port, const std::string& dst_addr, uint16_t dst_port, const std::string& iface_name, const std::string& hex_data) { // convert hex data to binary data first if (hex_data.length()%2) { ADD_FAILURE() << "Specified hex string (" << hex_data << " has length " << hex_data.length() << ", even length required."; return; } size_t len = hex_data.length()/2; char* buffer = new char[len]; TDUID tmp(hex_data.c_str()); EXPECT_EQ(tmp.storeSelf(static_cast(buffer)), buffer + len); SPtr iface = SrvIfaceMgr().getIfaceByName(iface_name); ASSERT_TRUE(iface); SPtr addr = new TIPv6Addr(dst_addr.c_str(), true); bool status = SrvIfaceMgr().send(iface->getID(), buffer, len, addr, dst_port); EXPECT_TRUE(status); delete [] buffer; } TOptPtr ServerTest::createPrefix(const std::string& addr_txt, uint8_t len, uint32_t pref, uint32_t valid) { SPtr addr(new TIPv6Addr(addr_txt.c_str(), true)); TOptPtr iaprefix = new TSrvOptIAPrefix(addr, len, pref, valid, NULL); return (iaprefix); } void ServerTest::prefixText(const std::string& config, const TOptPtr& pd_to_be_sent, const std::string& min_range, const std::string& max_range, uint8_t expected_prefix_len, uint32_t expected_iaid, uint32_t expected_t1, uint32_t expected_t2, uint32_t expected_pref, uint32_t expected_valid) { // Create configuration with the following config file ASSERT_TRUE( createMgrs(config) ); // Get the server configuration. We'll use it later for verification SPtr cfgIface = SrvCfgMgr().getIfaceByID(iface_->getID()); ASSERT_TRUE(cfgIface); cfgIface->firstPD(); SPtr cfgPD = cfgIface->getPD(); ASSERT_TRUE(cfgPD); // Now generate SOLICIT with a single IA_PD and one IAPREFIX hint in it // That's a perfect hint (valid, within scope, exact length, not used) SPtr sol = createSolicit(); sol->addOption((Ptr*)clntId_); // include client-id sol->addOption(pd_to_be_sent); // include IA_PD SPtr adv = (Ptr*)sendAndReceive((Ptr*)sol, 1); ASSERT_TRUE(adv); // Check that there is a response SPtr rcvPD = (Ptr*) adv->getOption(OPTION_IA_PD); ASSERT_TRUE(rcvPD); // The server should return exactly the hint, because it is available SPtr minRange = new TIPv6Addr(min_range.c_str(), true); SPtr maxRange = new TIPv6Addr(max_range.c_str(), true); // Check that the IA_PD included in the response matches expectations EXPECT_TRUE( checkIA_PD(rcvPD, minRange, maxRange, expected_iaid, expected_t1, expected_t2, expected_pref, expected_valid, expected_prefix_len)); // Nothing should be assigned (this is SOLICIT/ADVERTISE only) EXPECT_EQ(0u, cfgPD->getAssignedCount()); // now generate REQUEST SPtr req = createRequest(); req->addOption((Ptr*)clntId_); req->addOption(pd_to_be_sent); ASSERT_TRUE(adv->getOption(OPTION_SERVERID)); req->addOption(adv->getOption(OPTION_SERVERID)); // ... and get REPLY from the server cout << "Pretending to send REQUEST" << endl; SPtr reply = (Ptr*)sendAndReceive((Ptr*)req, 2); ASSERT_TRUE(reply); rcvPD = (Ptr*) reply->getOption(OPTION_IA_PD); ASSERT_TRUE(rcvPD); EXPECT_TRUE( checkIA_PD(rcvPD, minRange, maxRange, expected_iaid, expected_t1, expected_t2, expected_pref, expected_valid, expected_prefix_len)); // Check that the lease was indeed assigned EXPECT_EQ(1u, cfgPD->getAssignedCount()); // let's release it SPtr rel = createRelease(); rel->addOption((Ptr*)clntId_); rel->addOption(req->getOption(OPTION_SERVERID)); rcvPD->delOption(OPTION_STATUS_CODE); rel->addOption((Ptr*)rcvPD); cout << "Pretending to send RELEASE" << endl; SPtr releaseReply = (Ptr*)sendAndReceive((Ptr*)rel, 3); // Check that the lease is now released. EXPECT_EQ(0u, cfgPD->getAssignedCount()); } ServerTest::~ServerTest() { delete transmgr_; delete cfgmgr_; delete addrmgr_; delete ifacemgr_; } } dibbler-1.0.1/tests/Srv/Makefile0000664000175000017500000010543512561700376013432 00000000000000# Makefile.in generated by automake 1.14.1 from Makefile.am. # tests/Srv/Makefile. Generated from Makefile.in by configure. # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/dibbler pkgincludedir = $(includedir)/dibbler pkglibdir = $(libdir)/dibbler pkglibexecdir = $(libexecdir)/dibbler am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = x86_64-unknown-linux-gnu host_triplet = x86_64-unknown-linux-gnu TESTS = $(am__EXEEXT_1) #am__append_1 = Srv_tests noinst_PROGRAMS = $(am__EXEEXT_2) subdir = tests/Srv DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/depcomp $(top_srcdir)/test-driver ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/libtool.m4 \ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/include/dibbler-config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = #am__EXEEXT_1 = Srv_tests$(EXEEXT) am__EXEEXT_2 = $(am__EXEEXT_1) PROGRAMS = $(noinst_PROGRAMS) am__Srv_tests_SOURCES_DIST = run_tests.cpp assign_utils.cc \ assign_utils.h assign_addr_unittest.cc \ assign_prefix_unittest.cc options_unittest.cc \ relay_unittest.cc wireshark.cc #am_Srv_tests_OBJECTS = run_tests.$(OBJEXT) \ # assign_utils.$(OBJEXT) \ # assign_addr_unittest.$(OBJEXT) \ # assign_prefix_unittest.$(OBJEXT) \ # options_unittest.$(OBJEXT) \ # relay_unittest.$(OBJEXT) wireshark.$(OBJEXT) Srv_tests_OBJECTS = $(am_Srv_tests_OBJECTS) am__DEPENDENCIES_1 = #Srv_tests_DEPENDENCIES = $(am__DEPENDENCIES_1) \ # $(top_builddir)/SrvTransMgr/libSrvTransMgr.a \ # $(top_builddir)/SrvCfgMgr/libSrvCfgMgr.a \ # $(top_builddir)/CfgMgr/libCfgMgr.a \ # $(top_builddir)/SrvIfaceMgr/libSrvIfaceMgr.a \ # $(top_builddir)/IfaceMgr/libIfaceMgr.a \ # $(top_builddir)/SrvAddrMgr/libSrvAddrMgr.a \ # $(top_builddir)/AddrMgr/libAddrMgr.a \ # $(top_builddir)/SrvMessages/libSrvMessages.a \ # $(top_builddir)/Messages/libMessages.a \ # $(top_builddir)/SrvOptions/libSrvOptions.a \ # $(top_builddir)/Options/libOptions.a \ # $(top_builddir)/Misc/libMisc.a \ # $(top_builddir)/poslib/libPoslib.a \ # $(top_builddir)/nettle/libNettle.a \ # $(top_builddir)/Port-linux/libLowLevel.a AM_V_lt = $(am__v_lt_$(V)) am__v_lt_ = $(am__v_lt_$(AM_DEFAULT_VERBOSITY)) am__v_lt_0 = --silent am__v_lt_1 = Srv_tests_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \ $(CXXFLAGS) $(Srv_tests_LDFLAGS) $(LDFLAGS) -o $@ AM_V_P = $(am__v_P_$(V)) am__v_P_ = $(am__v_P_$(AM_DEFAULT_VERBOSITY)) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_$(V)) am__v_GEN_ = $(am__v_GEN_$(AM_DEFAULT_VERBOSITY)) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_$(V)) am__v_at_ = $(am__v_at_$(AM_DEFAULT_VERBOSITY)) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I. -I$(top_builddir)/include depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) LTCXXCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CXXFLAGS) $(CXXFLAGS) AM_V_CXX = $(am__v_CXX_$(V)) am__v_CXX_ = $(am__v_CXX_$(AM_DEFAULT_VERBOSITY)) am__v_CXX_0 = @echo " CXX " $@; am__v_CXX_1 = CXXLD = $(CXX) CXXLINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \ $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CXXLD = $(am__v_CXXLD_$(V)) am__v_CXXLD_ = $(am__v_CXXLD_$(AM_DEFAULT_VERBOSITY)) am__v_CXXLD_0 = @echo " CXXLD " $@; am__v_CXXLD_1 = COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_$(V)) am__v_CC_ = $(am__v_CC_$(AM_DEFAULT_VERBOSITY)) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_$(V)) am__v_CCLD_ = $(am__v_CCLD_$(AM_DEFAULT_VERBOSITY)) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(Srv_tests_SOURCES) DIST_SOURCES = $(am__Srv_tests_SOURCES_DIST) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags am__tty_colors_dummy = \ mgn= red= grn= lgn= blu= brg= std=; \ am__color_tests=no am__tty_colors = { \ $(am__tty_colors_dummy); \ if test "X$(AM_COLOR_TESTS)" = Xno; then \ am__color_tests=no; \ elif test "X$(AM_COLOR_TESTS)" = Xalways; then \ am__color_tests=yes; \ elif test "X$$TERM" != Xdumb && { test -t 1; } 2>/dev/null; then \ am__color_tests=yes; \ fi; \ if test $$am__color_tests = yes; then \ red=''; \ grn=''; \ lgn=''; \ blu=''; \ mgn=''; \ brg=''; \ std=''; \ fi; \ } am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__recheck_rx = ^[ ]*:recheck:[ ]* am__global_test_result_rx = ^[ ]*:global-test-result:[ ]* am__copy_in_global_log_rx = ^[ ]*:copy-in-global-log:[ ]* # A command that, given a newline-separated list of test names on the # standard input, print the name of the tests that are to be re-run # upon "make recheck". am__list_recheck_tests = $(AWK) '{ \ recheck = 1; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ { \ if ((getline line2 < ($$0 ".log")) < 0) \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[nN][Oo]/) \ { \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[yY][eE][sS]/) \ { \ break; \ } \ }; \ if (recheck) \ print $$0; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # A command that, given a newline-separated list of test names on the # standard input, create the global log from their .trs and .log files. am__create_global_log = $(AWK) ' \ function fatal(msg) \ { \ print "fatal: making $@: " msg | "cat >&2"; \ exit 1; \ } \ function rst_section(header) \ { \ print header; \ len = length(header); \ for (i = 1; i <= len; i = i + 1) \ printf "="; \ printf "\n\n"; \ } \ { \ copy_in_global_log = 1; \ global_test_result = "RUN"; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".trs"); \ if (line ~ /$(am__global_test_result_rx)/) \ { \ sub("$(am__global_test_result_rx)", "", line); \ sub("[ ]*$$", "", line); \ global_test_result = line; \ } \ else if (line ~ /$(am__copy_in_global_log_rx)[nN][oO]/) \ copy_in_global_log = 0; \ }; \ if (copy_in_global_log) \ { \ rst_section(global_test_result ": " $$0); \ while ((rc = (getline line < ($$0 ".log"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".log"); \ print line; \ }; \ printf "\n"; \ }; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # Restructured Text title. am__rst_title = { sed 's/.*/ & /;h;s/./=/g;p;x;s/ *$$//;p;g' && echo; } # Solaris 10 'make', and several other traditional 'make' implementations, # pass "-e" to $(SHELL), and POSIX 2008 even requires this. Work around it # by disabling -e (using the XSI extension "set +e") if it's set. am__sh_e_setup = case $$- in *e*) set +e;; esac # Default flags passed to test drivers. am__common_driver_flags = \ --color-tests "$$am__color_tests" \ --enable-hard-errors "$$am__enable_hard_errors" \ --expect-failure "$$am__expect_failure" # To be inserted before the command running the test. Creates the # directory for the log if needed. Stores in $dir the directory # containing $f, in $tst the test, in $log the log. Executes the # developer- defined test setup AM_TESTS_ENVIRONMENT (if any), and # passes TESTS_ENVIRONMENT. Set up options for the wrapper that # will run the test scripts (or their associated LOG_COMPILER, if # thy have one). am__check_pre = \ $(am__sh_e_setup); \ $(am__vpath_adj_setup) $(am__vpath_adj) \ $(am__tty_colors); \ srcdir=$(srcdir); export srcdir; \ case "$@" in \ */*) am__odir=`echo "./$@" | sed 's|/[^/]*$$||'`;; \ *) am__odir=.;; \ esac; \ test "x$$am__odir" = x"." || test -d "$$am__odir" \ || $(MKDIR_P) "$$am__odir" || exit $$?; \ if test -f "./$$f"; then dir=./; \ elif test -f "$$f"; then dir=; \ else dir="$(srcdir)/"; fi; \ tst=$$dir$$f; log='$@'; \ if test -n '$(DISABLE_HARD_ERRORS)'; then \ am__enable_hard_errors=no; \ else \ am__enable_hard_errors=yes; \ fi; \ case " $(XFAIL_TESTS) " in \ *[\ \ ]$$f[\ \ ]* | *[\ \ ]$$dir$$f[\ \ ]*) \ am__expect_failure=yes;; \ *) \ am__expect_failure=no;; \ esac; \ $(AM_TESTS_ENVIRONMENT) $(TESTS_ENVIRONMENT) # A shell command to get the names of the tests scripts with any registered # extension removed (i.e., equivalently, the names of the test logs, with # the '.log' extension removed). The result is saved in the shell variable # '$bases'. This honors runtime overriding of TESTS and TEST_LOGS. Sadly, # we cannot use something simpler, involving e.g., "$(TEST_LOGS:.log=)", # since that might cause problem with VPATH rewrites for suffix-less tests. # See also 'test-harness-vpath-rewrite.sh' and 'test-trs-basic.sh'. am__set_TESTS_bases = \ bases='$(TEST_LOGS)'; \ bases=`for i in $$bases; do echo $$i; done | sed 's/\.log$$//'`; \ bases=`echo $$bases` RECHECK_LOGS = $(TEST_LOGS) AM_RECURSIVE_TARGETS = check recheck TEST_SUITE_LOG = test-suite.log TEST_EXTENSIONS = .test LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver LOG_COMPILE = $(LOG_COMPILER) $(AM_LOG_FLAGS) $(LOG_FLAGS) am__set_b = \ case '$@' in \ */*) \ case '$*' in \ */*) b='$*';; \ *) b=`echo '$@' | sed 's/\.log$$//'`; \ esac;; \ *) \ b='$*';; \ esac am__test_logs1 = $(TESTS:=.log) am__test_logs2 = $(am__test_logs1:.log=.log) TEST_LOGS = $(am__test_logs2:.test.log=.log) TEST_LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver TEST_LOG_COMPILE = $(TEST_LOG_COMPILER) $(AM_TEST_LOG_FLAGS) \ $(TEST_LOG_FLAGS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = ${SHELL} /home/thomson/devel/dibbler-git/missing aclocal-1.14 ALLOCA = AMTAR = $${TAR-tar} AM_DEFAULT_VERBOSITY = 1 AR = ar ARCH = LINUX AUTOCONF = ${SHELL} /home/thomson/devel/dibbler-git/missing autoconf AUTOHEADER = ${SHELL} /home/thomson/devel/dibbler-git/missing autoheader AUTOMAKE = ${SHELL} /home/thomson/devel/dibbler-git/missing automake-1.14 AWK = gawk CC = gcc CCDEPMODE = depmode=gcc3 CFLAGS = CPP = gcc -E CPPFLAGS = -O2 -DLINUX -Wall -pedantic -funsigned-char -DMOD_CLNT_BIND_REUSE -DMOD_CLNT_CONFIRM CXX = g++ CXXCPP = g++ -E CXXDEPMODE = depmode=gcc3 CXXFLAGS = CYGPATH_W = echo DEFS = -DHAVE_CONFIG_H DEPDIR = .deps DLLTOOL = false DSYMUTIL = DUMPBIN = ECHO_C = ECHO_N = -n ECHO_T = EGREP = /bin/grep -E EXEEXT = EXTRA_DIST_SUBDIRS = Port-bsd Port-winnt2k Port-sun FGREP = /bin/grep -F GREP = /bin/grep GTEST_INCLUDES = GTEST_LDADD = GTEST_LDFLAGS = INSTALL = /usr/bin/install -c INSTALL_DATA = ${INSTALL} -m 644 INSTALL_PROGRAM = ${INSTALL} INSTALL_SCRIPT = ${INSTALL} INSTALL_STRIP_PROGRAM = $(install_sh) -c -s LD = /usr/bin/ld -m elf_x86_64 LDFLAGS = -lpthread LIBOBJS = LIBS = LIBTOOL = $(SHELL) $(top_builddir)/libtool LINKPRINT = LIPO = LN_S = ln -s LTLIBOBJS = MAINT = # MAKEINFO = ${SHELL} /home/thomson/devel/dibbler-git/missing makeinfo MANIFEST_TOOL = : MKDIR_P = /bin/mkdir -p NM = /usr/bin/nm -B NMEDIT = OBJDUMP = objdump OBJEXT = o OTOOL = OTOOL64 = PACKAGE = dibbler PACKAGE_BUGREPORT = dibbler@klub.com.pl PACKAGE_NAME = dibbler PACKAGE_STRING = dibbler 1.0.1 PACKAGE_TARNAME = dibbler PACKAGE_URL = PACKAGE_VERSION = 1.0.1 PATH_SEPARATOR = : PORT_CFLAGS = PORT_LDFLAGS = PORT_SUBDIR = Port-linux RANLIB = ranlib SED = /bin/sed SET_MAKE = SHELL = /bin/bash STRIP = strip VERSION = 1.0.1 abs_builddir = /home/thomson/devel/dibbler-git/tests/Srv abs_srcdir = /home/thomson/devel/dibbler-git/tests/Srv abs_top_builddir = /home/thomson/devel/dibbler-git abs_top_srcdir = /home/thomson/devel/dibbler-git ac_ct_AR = ar ac_ct_CC = gcc ac_ct_CXX = g++ ac_ct_DUMPBIN = am__include = include am__leading_dot = . am__quote = am__tar = $${TAR-tar} chof - "$$tardir" am__untar = $${TAR-tar} xf - bindir = ${exec_prefix}/bin build = x86_64-unknown-linux-gnu build_alias = build_cpu = x86_64 build_os = linux-gnu build_vendor = unknown builddir = . datadir = ${datarootdir} datarootdir = ${prefix}/share docdir = ${datarootdir}/doc/${PACKAGE_TARNAME} dvidir = ${docdir} exec_prefix = ${prefix} host = x86_64-unknown-linux-gnu host_alias = host_cpu = x86_64 host_os = linux-gnu host_vendor = unknown htmldir = ${docdir} includedir = ${prefix}/include infodir = ${datarootdir}/info install_sh = ${SHELL} /home/thomson/devel/dibbler-git/install-sh libdir = ${exec_prefix}/lib libexecdir = ${exec_prefix}/libexec localedir = ${datarootdir}/locale localstatedir = ${prefix}/var mandir = ${datarootdir}/man mkdir_p = $(MKDIR_P) oldincludedir = /usr/include pdfdir = ${docdir} prefix = /usr/local program_transform_name = s,x,x, psdir = ${docdir} sbindir = ${exec_prefix}/sbin sharedstatedir = ${prefix}/com srcdir = . subdirs = bison++ sysconfdir = ${prefix}/etc target_alias = top_build_prefix = ../../ top_builddir = ../.. top_srcdir = ../.. # This is to workaround long long in gtest.h AM_CPPFLAGS = -I$(top_srcdir)/SrvCfgMgr -I$(top_srcdir)/CfgMgr \ -I$(top_srcdir)/SrvIfaceMgr -I$(top_srcdir)/IfaceMgr \ -I$(top_srcdir)/AddrMgr -I$(top_srcdir)/SrvAddrMgr \ -I$(top_srcdir)/Options -I$(top_srcdir)/SrvOptions \ -I$(top_srcdir)/Messages -I$(top_srcdir)/SrvMessages \ -I$(top_srcdir)/SrvTransMgr -I$(top_srcdir)/Misc \ $(GTEST_INCLUDES) -Wno-long-long -Wno-variadic-macros #Srv_tests_SOURCES = run_tests.cpp assign_utils.cc \ # assign_utils.h assign_addr_unittest.cc \ # assign_prefix_unittest.cc options_unittest.cc \ # relay_unittest.cc wireshark.cc #Srv_tests_LDFLAGS = $(AM_LDFLAGS) $(GTEST_LDFLAGS) #Srv_tests_LDADD = $(GTEST_LDADD) \ # $(top_builddir)/SrvTransMgr/libSrvTransMgr.a \ # $(top_builddir)/SrvCfgMgr/libSrvCfgMgr.a \ # $(top_builddir)/CfgMgr/libCfgMgr.a \ # $(top_builddir)/SrvIfaceMgr/libSrvIfaceMgr.a \ # $(top_builddir)/IfaceMgr/libIfaceMgr.a \ # $(top_builddir)/SrvAddrMgr/libSrvAddrMgr.a \ # $(top_builddir)/AddrMgr/libAddrMgr.a \ # $(top_builddir)/SrvMessages/libSrvMessages.a \ # $(top_builddir)/Messages/libMessages.a \ # $(top_builddir)/SrvOptions/libSrvOptions.a \ # $(top_builddir)/Options/libOptions.a \ # $(top_builddir)/Misc/libMisc.a \ # $(top_builddir)/poslib/libPoslib.a \ # $(top_builddir)/nettle/libNettle.a \ # $(top_builddir)/Port-linux/libLowLevel.a all: all-am .SUFFIXES: .SUFFIXES: .cc .cpp .lo .log .o .obj .test .test$(EXEEXT) .trs $(srcdir)/Makefile.in: # $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign tests/Srv/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign tests/Srv/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: # $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): # $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstPROGRAMS: @list='$(noinst_PROGRAMS)'; test -n "$$list" || exit 0; \ echo " rm -f" $$list; \ rm -f $$list || exit $$?; \ test -n "$(EXEEXT)" || exit 0; \ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ echo " rm -f" $$list; \ rm -f $$list Srv_tests$(EXEEXT): $(Srv_tests_OBJECTS) $(Srv_tests_DEPENDENCIES) $(EXTRA_Srv_tests_DEPENDENCIES) @rm -f Srv_tests$(EXEEXT) $(AM_V_CXXLD)$(Srv_tests_LINK) $(Srv_tests_OBJECTS) $(Srv_tests_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c include ./$(DEPDIR)/assign_addr_unittest.Po include ./$(DEPDIR)/assign_prefix_unittest.Po include ./$(DEPDIR)/assign_utils.Po include ./$(DEPDIR)/options_unittest.Po include ./$(DEPDIR)/relay_unittest.Po include ./$(DEPDIR)/run_tests.Po include ./$(DEPDIR)/wireshark.Po .cc.o: $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po # $(AM_V_CXX)source='$<' object='$@' libtool=no \ # DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) \ # $(AM_V_CXX_no)$(CXXCOMPILE) -c -o $@ $< .cc.obj: $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po # $(AM_V_CXX)source='$<' object='$@' libtool=no \ # DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) \ # $(AM_V_CXX_no)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .cc.lo: $(AM_V_CXX)$(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo # $(AM_V_CXX)source='$<' object='$@' libtool=yes \ # DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) \ # $(AM_V_CXX_no)$(LTCXXCOMPILE) -c -o $@ $< .cpp.o: $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po # $(AM_V_CXX)source='$<' object='$@' libtool=no \ # DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) \ # $(AM_V_CXX_no)$(CXXCOMPILE) -c -o $@ $< .cpp.obj: $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po # $(AM_V_CXX)source='$<' object='$@' libtool=no \ # DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) \ # $(AM_V_CXX_no)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .cpp.lo: $(AM_V_CXX)$(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo # $(AM_V_CXX)source='$<' object='$@' libtool=yes \ # DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) \ # $(AM_V_CXX_no)$(LTCXXCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags # Recover from deleted '.trs' file; this should ensure that # "rm -f foo.log; make foo.trs" re-run 'foo.test', and re-create # both 'foo.log' and 'foo.trs'. Break the recipe in two subshells # to avoid problems with "make -n". .log.trs: rm -f $< $@ $(MAKE) $(AM_MAKEFLAGS) $< # Leading 'am--fnord' is there to ensure the list of targets does not # expand to empty, as could happen e.g. with make check TESTS=''. am--fnord $(TEST_LOGS) $(TEST_LOGS:.log=.trs): $(am__force_recheck) am--force-recheck: @: $(TEST_SUITE_LOG): $(TEST_LOGS) @$(am__set_TESTS_bases); \ am__f_ok () { test -f "$$1" && test -r "$$1"; }; \ redo_bases=`for i in $$bases; do \ am__f_ok $$i.trs && am__f_ok $$i.log || echo $$i; \ done`; \ if test -n "$$redo_bases"; then \ redo_logs=`for i in $$redo_bases; do echo $$i.log; done`; \ redo_results=`for i in $$redo_bases; do echo $$i.trs; done`; \ if $(am__make_dryrun); then :; else \ rm -f $$redo_logs && rm -f $$redo_results || exit 1; \ fi; \ fi; \ if test -n "$$am__remaking_logs"; then \ echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \ "recursion detected" >&2; \ else \ am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \ fi; \ if $(am__make_dryrun); then :; else \ st=0; \ errmsg="fatal: making $(TEST_SUITE_LOG): failed to create"; \ for i in $$redo_bases; do \ test -f $$i.trs && test -r $$i.trs \ || { echo "$$errmsg $$i.trs" >&2; st=1; }; \ test -f $$i.log && test -r $$i.log \ || { echo "$$errmsg $$i.log" >&2; st=1; }; \ done; \ test $$st -eq 0 || exit 1; \ fi @$(am__sh_e_setup); $(am__tty_colors); $(am__set_TESTS_bases); \ ws='[ ]'; \ results=`for b in $$bases; do echo $$b.trs; done`; \ test -n "$$results" || results=/dev/null; \ all=` grep "^$$ws*:test-result:" $$results | wc -l`; \ pass=` grep "^$$ws*:test-result:$$ws*PASS" $$results | wc -l`; \ fail=` grep "^$$ws*:test-result:$$ws*FAIL" $$results | wc -l`; \ skip=` grep "^$$ws*:test-result:$$ws*SKIP" $$results | wc -l`; \ xfail=`grep "^$$ws*:test-result:$$ws*XFAIL" $$results | wc -l`; \ xpass=`grep "^$$ws*:test-result:$$ws*XPASS" $$results | wc -l`; \ error=`grep "^$$ws*:test-result:$$ws*ERROR" $$results | wc -l`; \ if test `expr $$fail + $$xpass + $$error` -eq 0; then \ success=true; \ else \ success=false; \ fi; \ br='==================='; br=$$br$$br$$br$$br; \ result_count () \ { \ if test x"$$1" = x"--maybe-color"; then \ maybe_colorize=yes; \ elif test x"$$1" = x"--no-color"; then \ maybe_colorize=no; \ else \ echo "$@: invalid 'result_count' usage" >&2; exit 4; \ fi; \ shift; \ desc=$$1 count=$$2; \ if test $$maybe_colorize = yes && test $$count -gt 0; then \ color_start=$$3 color_end=$$std; \ else \ color_start= color_end=; \ fi; \ echo "$${color_start}# $$desc $$count$${color_end}"; \ }; \ create_testsuite_report () \ { \ result_count $$1 "TOTAL:" $$all "$$brg"; \ result_count $$1 "PASS: " $$pass "$$grn"; \ result_count $$1 "SKIP: " $$skip "$$blu"; \ result_count $$1 "XFAIL:" $$xfail "$$lgn"; \ result_count $$1 "FAIL: " $$fail "$$red"; \ result_count $$1 "XPASS:" $$xpass "$$red"; \ result_count $$1 "ERROR:" $$error "$$mgn"; \ }; \ { \ echo "$(PACKAGE_STRING): $(subdir)/$(TEST_SUITE_LOG)" | \ $(am__rst_title); \ create_testsuite_report --no-color; \ echo; \ echo ".. contents:: :depth: 2"; \ echo; \ for b in $$bases; do echo $$b; done \ | $(am__create_global_log); \ } >$(TEST_SUITE_LOG).tmp || exit 1; \ mv $(TEST_SUITE_LOG).tmp $(TEST_SUITE_LOG); \ if $$success; then \ col="$$grn"; \ else \ col="$$red"; \ test x"$$VERBOSE" = x || cat $(TEST_SUITE_LOG); \ fi; \ echo "$${col}$$br$${std}"; \ echo "$${col}Testsuite summary for $(PACKAGE_STRING)$${std}"; \ echo "$${col}$$br$${std}"; \ create_testsuite_report --maybe-color; \ echo "$$col$$br$$std"; \ if $$success; then :; else \ echo "$${col}See $(subdir)/$(TEST_SUITE_LOG)$${std}"; \ if test -n "$(PACKAGE_BUGREPORT)"; then \ echo "$${col}Please report to $(PACKAGE_BUGREPORT)$${std}"; \ fi; \ echo "$$col$$br$$std"; \ fi; \ $$success || exit 1 check-TESTS: @list='$(RECHECK_LOGS)'; test -z "$$list" || rm -f $$list @list='$(RECHECK_LOGS:.log=.trs)'; test -z "$$list" || rm -f $$list @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ log_list=`for i in $$bases; do echo $$i.log; done`; \ trs_list=`for i in $$bases; do echo $$i.trs; done`; \ log_list=`echo $$log_list`; trs_list=`echo $$trs_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) TEST_LOGS="$$log_list"; \ exit $$?; recheck: all @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ bases=`for i in $$bases; do echo $$i; done \ | $(am__list_recheck_tests)` || exit 1; \ log_list=`for i in $$bases; do echo $$i.log; done`; \ log_list=`echo $$log_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) \ am__force_recheck=am--force-recheck \ TEST_LOGS="$$log_list"; \ exit $$? Srv_tests.log: Srv_tests$(EXEEXT) @p='Srv_tests$(EXEEXT)'; \ b='Srv_tests'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) .test.log: @p='$<'; \ $(am__set_b); \ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) #.test$(EXEEXT).log: # @p='$<'; \ # $(am__set_b); \ # $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ # --log-file $$b.log --trs-file $$b.trs \ # $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ # "$$tst" $(AM_TESTS_FD_REDIRECT) distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am $(MAKE) $(AM_MAKEFLAGS) check-TESTS check: check-am all-am: Makefile $(PROGRAMS) installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: -test -z "$(TEST_LOGS)" || rm -f $(TEST_LOGS) -test -z "$(TEST_LOGS:.log=.trs)" || rm -f $(TEST_LOGS:.log=.trs) -test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool clean-noinstPROGRAMS \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: check-am install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-TESTS check-am clean \ clean-generic clean-libtool clean-noinstPROGRAMS cscopelist-am \ ctags ctags-am distclean distclean-compile distclean-generic \ distclean-libtool distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-dvi install-dvi-am install-exec \ install-exec-am install-html install-html-am install-info \ install-info-am install-man install-pdf install-pdf-am \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ recheck tags tags-am uninstall uninstall-am info: @echo "GTEST_LDADD=$(GTEST_LDADD)" @echo "GTEST_LDFLAGS=$(GTEST_LDFLAGS)" @echo "GTEST_INCLUDES=$(GTEST_INCLUDES)" @echo "HAVE_GTEST=$(HAVE_GTEST)" # 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: dibbler-1.0.1/tests/Srv/Makefile.am0000644000175000017500000000403112277722750014016 00000000000000AM_CPPFLAGS = -I$(top_srcdir)/SrvCfgMgr AM_CPPFLAGS += -I$(top_srcdir)/CfgMgr AM_CPPFLAGS += -I$(top_srcdir)/SrvIfaceMgr AM_CPPFLAGS += -I$(top_srcdir)/IfaceMgr AM_CPPFLAGS += -I$(top_srcdir)/AddrMgr AM_CPPFLAGS += -I$(top_srcdir)/SrvAddrMgr AM_CPPFLAGS += -I$(top_srcdir)/Options AM_CPPFLAGS += -I$(top_srcdir)/SrvOptions AM_CPPFLAGS += -I$(top_srcdir)/Messages AM_CPPFLAGS += -I$(top_srcdir)/SrvMessages AM_CPPFLAGS += -I$(top_srcdir)/SrvTransMgr AM_CPPFLAGS += -I$(top_srcdir)/Misc # This is to workaround long long in gtest.h AM_CPPFLAGS += $(GTEST_INCLUDES) -Wno-long-long -Wno-variadic-macros info: @echo "GTEST_LDADD=$(GTEST_LDADD)" @echo "GTEST_LDFLAGS=$(GTEST_LDFLAGS)" @echo "GTEST_INCLUDES=$(GTEST_INCLUDES)" @echo "HAVE_GTEST=$(HAVE_GTEST)" TESTS = if HAVE_GTEST TESTS += Srv_tests Srv_tests_SOURCES = run_tests.cpp Srv_tests_SOURCES += assign_utils.cc assign_utils.h Srv_tests_SOURCES += assign_addr_unittest.cc assign_prefix_unittest.cc Srv_tests_SOURCES += options_unittest.cc Srv_tests_SOURCES += relay_unittest.cc Srv_tests_SOURCES += wireshark.cc Srv_tests_LDFLAGS = $(AM_LDFLAGS) $(GTEST_LDFLAGS) Srv_tests_LDADD = $(GTEST_LDADD) Srv_tests_LDADD += $(top_builddir)/SrvTransMgr/libSrvTransMgr.a Srv_tests_LDADD += $(top_builddir)/SrvCfgMgr/libSrvCfgMgr.a Srv_tests_LDADD += $(top_builddir)/CfgMgr/libCfgMgr.a Srv_tests_LDADD += $(top_builddir)/SrvIfaceMgr/libSrvIfaceMgr.a Srv_tests_LDADD += $(top_builddir)/IfaceMgr/libIfaceMgr.a Srv_tests_LDADD += $(top_builddir)/SrvAddrMgr/libSrvAddrMgr.a Srv_tests_LDADD += $(top_builddir)/AddrMgr/libAddrMgr.a Srv_tests_LDADD += $(top_builddir)/SrvMessages/libSrvMessages.a Srv_tests_LDADD += $(top_builddir)/Messages/libMessages.a Srv_tests_LDADD += $(top_builddir)/SrvOptions/libSrvOptions.a Srv_tests_LDADD += $(top_builddir)/Options/libOptions.a Srv_tests_LDADD += $(top_builddir)/Misc/libMisc.a Srv_tests_LDADD += $(top_builddir)/poslib/libPoslib.a Srv_tests_LDADD += $(top_builddir)/nettle/libNettle.a Srv_tests_LDADD += $(top_builddir)/@PORT_SUBDIR@/libLowLevel.a endif noinst_PROGRAMS = $(TESTS) dibbler-1.0.1/tests/Srv/assign_prefix_unittest.cc0000664000175000017500000004104112556252311017064 00000000000000#include "IPv6Addr.h" #include "SrvIfaceMgr.h" #include "SrvCfgMgr.h" #include "SrvTransMgr.h" #include "OptDUID.h" #include "OptAddrLst.h" #include "OptStatusCode.h" #include "SrvOptTA.h" #include "DHCPConst.h" #include "HostRange.h" #include "assign_utils.h" #include using namespace std; namespace test { // This test checks that the server will properly assign a prefix from the // specified pool when client sends a IA_PD without any hint. TEST_F(ServerTest, SARR_prefix_single_class) { // check that an interface was successfully selected string cfg = "iface REPLACE_ME {\n" " pd-class {\n" " pd-pool 2001:db8:123::/48\n" " pd-length 64\n" " }\n" "}\n"; ASSERT_TRUE( createMgrs(cfg) ); // now generate SOLICIT SPtr sol = createSolicit(); sol->addOption((Ptr*)clntId_); // include client-id sol->addOption((Ptr*)pd_); // include IA_PD pd_->setIAID(100); pd_->setT1(101); pd_->setT2(102); SPtr adv = (Ptr*)sendAndReceive((Ptr*)sol, 1); ASSERT_TRUE(adv); // check that there is an ADVERTISE response SPtr rcvPD = (Ptr*) adv->getOption(OPTION_IA_PD); ASSERT_TRUE(rcvPD); SPtr minRange = new TIPv6Addr("2001:db8:123::", true); SPtr maxRange = new TIPv6Addr("2001:db8:123:ffff:ffff:ffff:ffff:ffff", true); EXPECT_TRUE( checkIA_PD(rcvPD, minRange, maxRange, 100, 101, 102, SERVER_DEFAULT_MAX_PREF, SERVER_DEFAULT_MAX_VALID, 64) ); SPtr cfgIface = SrvCfgMgr().getIfaceByID(iface_->getID()); ASSERT_TRUE(cfgIface); cfgIface->firstPD(); SPtr cfgPD = cfgIface->getPD(); ASSERT_TRUE(cfgPD); EXPECT_EQ(0u, cfgPD->getAssignedCount()); // now generate REQUEST SPtr req = createRequest(); req->addOption((Ptr*)clntId_); req->addOption((Ptr*)pd_); pd_->setIAID(100); pd_->setT1(101); pd_->setT2(102); ASSERT_TRUE(adv->getOption(OPTION_SERVERID)); req->addOption(adv->getOption(OPTION_SERVERID)); // ... and get REPLY from the server cout << "Pretending to send REQUEST" << endl; SPtr reply = (Ptr*)sendAndReceive((Ptr*)req, 2); ASSERT_TRUE(reply); rcvPD = (Ptr*) reply->getOption(OPTION_IA_PD); ASSERT_TRUE(rcvPD); // server should return T1 = 101, becasue SERVER_DEFAULT_MIN_T1(5) < 101 < SERVER_DEFAULT_MAX_T1 (3600) // server should return T2 = 101, becasue SERVER_DEFAULT_MIN_T1(10) < 102 < SERVER_DEFAULT_MAX_T1 (5400) EXPECT_TRUE( checkIA_PD(rcvPD, minRange, maxRange, 100, 101, 102, SERVER_DEFAULT_MAX_PREF, SERVER_DEFAULT_MAX_VALID, 64) ); EXPECT_EQ(1u, cfgPD->getAssignedCount()); // let's release it SPtr rel = createRelease(); rel->addOption((Ptr*)clntId_); rel->addOption(req->getOption(OPTION_SERVERID)); rcvPD->delOption(OPTION_STATUS_CODE); rel->addOption((Ptr*)rcvPD); cout << "Pretending to send RELEASE" << endl; SPtr releaseReply = (Ptr*)sendAndReceive((Ptr*)rel, 3); EXPECT_EQ(0u, cfgPD->getAssignedCount()); } // This test verifies if the server properly responds with NoAddrsAvail status // code for temporary addresses request if no temporary addresses are configured. TEST_F(ServerTest, SARR_prefix_noiata_reqta) { string cfg = "iface REPLACE_ME {\n" " pd-class {\n" " pd-pool 2001:db8:123::/80\n" " pd-length 96\n" " }\n" "}\n"; ASSERT_TRUE( createMgrs(cfg) ); SPtr sol = createSolicit(); sol->addOption((Ptr*)clntId_); sol->addOption((Ptr*)pd_); sol->addOption((Ptr*)ta_); SPtr adv = (Ptr*)sendAndReceive((Ptr*)sol, 1); ASSERT_TRUE(adv); TOptPtr ta = adv->getOption(OPTION_IA_TA); ASSERT_TRUE(ta); TOptPtr status_opt = ta->getOption(OPTION_STATUS_CODE); ASSERT_TRUE(status_opt); SPtr status = (Ptr*) status_opt; ASSERT_TRUE(status); EXPECT_EQ(STATUSCODE_NOADDRSAVAIL, status->getCode()); } // This test check that the server sets T1,T2,preferred,valid lifetimes // properly and that the client's hints are ignored. TEST_F(ServerTest, SARR_prefix_single_class_params) { // check that an interface was successfully selected string cfg = "iface REPLACE_ME {\n" " t1 1000\n" " t2 2000\n" " preferred-lifetime 3000\n" " valid-lifetime 4000\n" " pd-class {\n" " pd-pool 2001:db8:123::/48\n" " pd-length 65\n" " }\n" "}\n"; ASSERT_TRUE( createMgrs(cfg) ); // now generate SOLICIT SPtr sol = createSolicit(); sol->addOption((Ptr*)clntId_); // include client-id sol->addOption((Ptr*)pd_); // include IA_NA pd_->setIAID(100); pd_->setT1(101); pd_->setT2(102); SPtr adv = (Ptr*)sendAndReceive((Ptr*)sol, 1); ASSERT_TRUE(adv); // check that there is an ADVERTISE response SPtr rcvPD = (Ptr*) adv->getOption(OPTION_IA_PD); ASSERT_TRUE(rcvPD); SPtr minRange = new TIPv6Addr("2001:db8:123::", true); SPtr maxRange = new TIPv6Addr("2001:db8:123:ffff:ffff:ffff:ffff:ffff", true); EXPECT_TRUE( checkIA_PD(rcvPD, minRange, maxRange, 100, 1000, 2000, 3000, 4000, 65)); cout << "REQUEST" << endl; // now generate REQUEST SPtr req = createRequest(); req->addOption((Ptr*)clntId_); req->addOption((Ptr*)pd_); pd_->setIAID(100); pd_->setT1(101); pd_->setT2(102); ASSERT_TRUE(adv->getOption(OPTION_SERVERID)); req->addOption(adv->getOption(OPTION_SERVERID)); // ... and get REPLY from the server SPtr reply = (Ptr*)sendAndReceive((Ptr*)req, 2); ASSERT_TRUE(reply); rcvPD = (Ptr*) reply->getOption(OPTION_IA_PD); ASSERT_TRUE(rcvPD); EXPECT_TRUE( checkIA_PD(rcvPD, minRange, maxRange, 100, 1000, 2000, 3000, 4000, 65)); } // Test checks that that the in-pool reservation is handle properly, i.e. // values specified in the reservation are used, not the onces from pd-class TEST_F(ServerTest, SARR_prefix_inpool_reservation) { // check that an interface was successfully selected string cfg = "iface REPLACE_ME {\n" " t1 1000\n" " t2 2000\n" " preferred-lifetime 3000\n" " valid-lifetime 4000\n" " pd-class {\n" " pd-pool 2001:db8:123::/48\n" " pd-length 68\n" " }\n" " client duid 00:01:00:0a:0b:0c:0d:0e:0f {\n" " prefix 2001:db8:123:babe::/67\n" " }\n" "}\n"; ASSERT_TRUE( createMgrs(cfg) ); // now generate SOLICIT SPtr sol = createSolicit(); sol->addOption((Ptr*)clntId_); // include client-id sol->addOption((Ptr*)pd_); // include IA_NA pd_->setIAID(100); pd_->setT1(101); pd_->setT2(102); SPtr adv = (Ptr*)sendAndReceive((Ptr*)sol, 1); ASSERT_TRUE(adv); // check that there is an ADVERTISE response SPtr rcvPD = (Ptr*) adv->getOption(OPTION_IA_PD); ASSERT_TRUE(rcvPD); SPtr minRange = new TIPv6Addr("2001:db8:123:babe::", true); SPtr maxRange = new TIPv6Addr("2001:db8:123:babe::", true); EXPECT_TRUE( checkIA_PD(rcvPD, minRange, maxRange, 100, 1000, 2000, 3000, 4000, 67)); cout << "REQUEST" << endl; // now generate REQUEST SPtr req = createRequest(); req->addOption((Ptr*)clntId_); req->addOption((Ptr*)pd_); pd_->setIAID(100); pd_->setT1(101); pd_->setT2(102); ASSERT_TRUE(adv->getOption(OPTION_SERVERID)); req->addOption(adv->getOption(OPTION_SERVERID)); // ... and get REPLY from the server SPtr reply = (Ptr*)sendAndReceive((Ptr*)req, 2); ASSERT_TRUE(reply); rcvPD = (Ptr*) reply->getOption(OPTION_IA_PD); ASSERT_TRUE(rcvPD); EXPECT_TRUE( checkIA_PD(rcvPD, minRange, maxRange, 100, 1000, 2000, 3000, 4000, 67)); } TEST_F(ServerTest, SARR_prefix_inpool_reservation_negative) { // check that an interface was successfully selected string cfg = "iface REPLACE_ME {\n" " t1 1000\n" " t2 2000\n" " preferred-lifetime 3000\n" " valid-lifetime 4000\n" " pd-class {\n" " pd-pool 2001:db8:123::/48\n" " pd-length 56\n" " }\n" " client duid 00:01:00:00:00:00:00:00:00 {\n" // not our DUID " prefix 2002:babe::/68\n" " }\n" "}\n"; ASSERT_TRUE( createMgrs(cfg) ); // now generate SOLICIT SPtr sol = createSolicit(); sol->addOption((Ptr*)clntId_); // include client-id sol->addOption((Ptr*)pd_); // include PD_NA pd_->setIAID(100); pd_->setT1(101); pd_->setT2(102); const uint8_t prefixLen = 68; SPtr prefix = new TIPv6Addr("2002:babe::", true); SPtr optPrefix = new TSrvOptIAPrefix(prefix, prefixLen, 1000, 2000, &(*sol)); pd_->addOption((Ptr*)optPrefix); SPtr adv = (Ptr*)sendAndReceive((Ptr*)sol, 1); ASSERT_TRUE(adv); // check that there is an ADVERTISE response SPtr rcvPD = (Ptr*) adv->getOption(OPTION_IA_PD); ASSERT_TRUE(rcvPD); SPtr rcvOptPrefix = (Ptr*)rcvPD->getOption(OPTION_IAPREFIX); ASSERT_TRUE(rcvOptPrefix); cout << "Requested " << prefix->getPlain() << "/" << prefixLen << ", received " << rcvOptPrefix->getPrefix()->getPlain() << "/" << (int)rcvOptPrefix->getPrefixLength() << endl; if (prefix->getPlain() == rcvOptPrefix->getPrefix()->getPlain()) { ADD_FAILURE() << "Assigned address that was reserved for someone else."; } SPtr minRange = new TIPv6Addr("2001:db8:123::", true); SPtr maxRange = new TIPv6Addr("2001:db8:123:ffff:ffff:ffff:ffff:ffff", true); EXPECT_TRUE( checkIA_PD(rcvPD, minRange, maxRange, 100, 1000, 2000, 3000, 4000, 56)); cout << "REQUEST" << endl; // now generate REQUEST SPtr req = createRequest(); req->addOption((Ptr*)clntId_); req->addOption((Ptr*)pd_); pd_->setIAID(100); pd_->setT1(101); pd_->setT2(102); ASSERT_TRUE(adv->getOption(OPTION_SERVERID)); req->addOption(adv->getOption(OPTION_SERVERID)); // ... and get REPLY from the server SPtr reply = (Ptr*)sendAndReceive((Ptr*)req, 2); ASSERT_TRUE(reply); rcvPD = (Ptr*) reply->getOption(OPTION_IA_PD); ASSERT_TRUE(rcvPD); EXPECT_TRUE( checkIA_PD(rcvPD, minRange, maxRange, 100, 1000, 2000, 3000, 4000, 56)); } TEST_F(ServerTest, SARR_prefix_inpool_reservation_negative2) { // check that if the pool is small and prefix is reserved for client A, client B // will not get it string cfg = "iface REPLACE_ME {\n" " t1 1000\n" " t2 2000\n" " preferred-lifetime 3000\n" " valid-lifetime 4000\n" " pd-class {\n" " pd-pool 2001:db8:123::/64\n" " pd-length 64\n" " }\n" " client duid 00:01:00:00:00:00:00:00:00 {\n" // not our DUID " prefix 2001:db8:123::/64\n" " }\n" "}\n"; ASSERT_TRUE( createMgrs(cfg) ); // now generate SOLICIT SPtr sol = createSolicit(); sol->addOption((Ptr*)clntId_); // include client-id sol->addOption((Ptr*)pd_); // include PD_NA pd_->setIAID(100); pd_->setT1(101); pd_->setT2(102); const uint8_t prefixLen = 68; SPtr prefix = new TIPv6Addr("2002:babe::", true); SPtr optPrefix = new TSrvOptIAPrefix(prefix, prefixLen, 1000, 2000, &(*sol)); pd_->addOption((Ptr*)optPrefix); SPtr adv = (Ptr*)sendAndReceive((Ptr*)sol, 1); ASSERT_TRUE(adv); // check that there is an ADVERTISE response SPtr rcvPD = (Ptr*) adv->getOption(OPTION_IA_PD); ASSERT_TRUE(rcvPD); SPtr rcvOptPrefix = (Ptr*)rcvPD->getOption(OPTION_IAPREFIX); if (rcvOptPrefix) { FAIL() << "Client received " << rcvOptPrefix->getPrefix()->getPlain() << " prefix, but expected NoPrefixAvail status." << endl; } SPtr rcvStatusCode = (Ptr*)rcvPD->getOption(OPTION_STATUS_CODE); ASSERT_TRUE(rcvStatusCode); EXPECT_EQ(STATUSCODE_NOPREFIXAVAIL, rcvStatusCode->getCode()); } TEST_F(ServerTest, SARR_prefix_outpool_reservation) { // check that an interface was successfully selected string cfg = "iface REPLACE_ME {\n" " t1 1000\n" " t2 2000\n" " preferred-lifetime 3000\n" " valid-lifetime 4000\n" " pd-class {\n" " pd-pool 2001:db8:123::/48\n" " pd-length 50\n" " }\n" " client duid 00:01:00:0a:0b:0c:0d:0e:0f {\n" " prefix 2002:babe::/32\n" " }\n" "}\n"; ASSERT_TRUE( createMgrs(cfg) ); // now generate SOLICIT SPtr sol = createSolicit(); sol->addOption((Ptr*)clntId_); // include client-id sol->addOption((Ptr*)pd_); // include PD_NA pd_->setIAID(100); pd_->setT1(101); pd_->setT2(102); SPtr adv = (Ptr*)sendAndReceive((Ptr*)sol, 1); ASSERT_TRUE(adv); // check that there is an ADVERTISE response SPtr rcvPD = (Ptr*) adv->getOption(OPTION_IA_PD); ASSERT_TRUE(rcvPD); SPtr minRange = new TIPv6Addr("2002:babe::", true); SPtr maxRange = new TIPv6Addr("2002:babe::", true); EXPECT_TRUE( checkIA_PD(rcvPD, minRange, maxRange, 100, 1000, 2000, 3000, 4000, 32)); cout << "REQUEST" << endl; // now generate REQUEST SPtr req = createRequest(); req->addOption((Ptr*)clntId_); req->addOption((Ptr*)pd_); pd_->setIAID(100); pd_->setT1(101); pd_->setT2(102); ASSERT_TRUE(adv->getOption(OPTION_SERVERID)); req->addOption(adv->getOption(OPTION_SERVERID)); // ... and get REPLY from the server SPtr reply = (Ptr*)sendAndReceive((Ptr*)req, 2); ASSERT_TRUE(reply); rcvPD = (Ptr*) reply->getOption(OPTION_IA_PD); ASSERT_TRUE(rcvPD); EXPECT_TRUE( checkIA_PD(rcvPD, minRange, maxRange, 100, 1000, 2000, 3000, 4000, 32)); } // This test checks that the server will properly handle a hint // sent by the client. The hint is in pool. TEST_F(ServerTest, SARR_prefix_hint) { // Create configuration with the following config file string cfg = "iface REPLACE_ME {\n" " pd-class {\n" " pd-pool 2001:db8::/32\n" " pd-length 64\n" " }\n" "}\n"; // Include the following IA_PD in the SOLCIT and REQUEST SPtr pd(new TSrvOptIA_PD(123, 100, 200, NULL)); pd->addOption(createPrefix("2001:db8:123::", 64, 1000, 2000)); prefixText(cfg, (Ptr*)pd, "2001:db8:123::", "2001:db8:123::", 64, pd->getIAID(), pd->getT1(), pd->getT2(), SERVER_DEFAULT_MIN_PREF, SERVER_DEFAULT_MIN_VALID); } // This test checks that the hint specified from out of pool will not // be accepted and som address from the pool will be assigned instead. TEST_F(ServerTest, SARR_prefix_out_of_pool_hint) { // Create configuration with the following config file string cfg = "iface REPLACE_ME {\n" " pd-class {\n" " pd-pool 2001:db8::/48\n" " pd-length 64\n" " }\n" "}\n"; // Include the following IA_PD in the SOLCIT and REQUEST SPtr pd(new TSrvOptIA_PD(123, 100, 200, NULL)); pd->addOption(createPrefix("3000::", 64, 1000, 2000)); prefixText(cfg, (Ptr*)pd, "2001:db8::", "2001:db8:ffff:ffff:ffff:ffff:ffff:ffff", 64, pd->getIAID(), pd->getT1(), pd->getT2(), SERVER_DEFAULT_MIN_PREF, SERVER_DEFAULT_MIN_VALID); } // This test checks that the hint specified from in pool, but with // the bits set in host part will be sanitized correctly. TEST_F(ServerTest, SARR_prefix_hint_nonzero_host_part) { // Create configuration with the following config file string cfg = "iface REPLACE_ME {\n" " pd-class {\n" " pd-pool 2001:db8::/32\n" " pd-length 64\n" " }\n" "}\n"; // Include the following IA_PD in the SOLCIT and REQUEST SPtr pd(new TSrvOptIA_PD(123, 100, 200, NULL)); pd->addOption(createPrefix("2001:db8::1:2:3:4:5", 64, 1000, 2000)); // The 2:3:4:5 should be zeroed, because they are chopped by /64 prefixText(cfg, (Ptr*)pd, "2001:db8::", "2001:db8:ffff:ffff:ffff:ffff:ffff:ffff", 64, pd->getIAID(), pd->getT1(), pd->getT2(), SERVER_DEFAULT_MIN_PREF, SERVER_DEFAULT_MIN_VALID); } } dibbler-1.0.1/tests/Srv/assign_addr_unittest.cc0000644000175000017500000003056412277722750016520 00000000000000/* * Dibbler - a portable DHCPv6 * * author: Tomasz Mrugalski * * released under GNU GPL v2 only licence * */ #include "IPv6Addr.h" #include "SrvIfaceMgr.h" #include "SrvCfgMgr.h" #include "SrvTransMgr.h" #include "OptDUID.h" #include "OptStatusCode.h" #include "SrvOptTA.h" #include "DHCPConst.h" #include "HostRange.h" #include "assign_utils.h" #include using namespace std; namespace test { TEST_F(ServerTest, SARR_single_class) { // check that an interface was successfully selected string cfg = "iface REPLACE_ME {\n" " class { pool 2001:db8:123::/64 }\n" "}\n"; ASSERT_TRUE( createMgrs(cfg) ); // now generate SOLICIT SPtr sol = createSolicit(); sol->addOption((Ptr*)clntId_); // include client-id sol->addOption((Ptr*)ia_); // include IA_NA ia_->setIAID(100); ia_->setT1(101); ia_->setT2(102); cout << "Sending SOLICIT" << endl; SPtr adv = (Ptr*)sendAndReceive((Ptr*)sol, 1); ASSERT_TRUE(adv); // check that there is an ADVERTISE response SPtr rcvIA = (Ptr*) adv->getOption(OPTION_IA_NA); ASSERT_TRUE(rcvIA); SPtr minRange = new TIPv6Addr("2001:db8:123::", true); SPtr maxRange = new TIPv6Addr("2001:db8:123::ffff:ffff:ffff:ffff", true); EXPECT_TRUE( checkIA_NA(rcvIA, minRange, maxRange, 100, 101, 102, SERVER_DEFAULT_MAX_PREF, SERVER_DEFAULT_MAX_VALID) ); SPtr cfgIface = SrvCfgMgr().getIfaceByID(iface_->getID()); ASSERT_TRUE(cfgIface); cfgIface->firstAddrClass(); SPtr cfgAddrClass = cfgIface->getAddrClass(); ASSERT_TRUE(cfgAddrClass); EXPECT_EQ(0u, cfgAddrClass->getAssignedCount()); // now generate REQUEST SPtr req = createRequest(); req->addOption((Ptr*)clntId_); req->addOption((Ptr*)ia_); ia_->setIAID(100); ia_->setT1(101); ia_->setT2(102); ASSERT_TRUE(adv->getOption(OPTION_SERVERID)); req->addOption(adv->getOption(OPTION_SERVERID)); // ... and get REPLY from the server cout << "Sending REQUEST" << endl; SPtr reply = (Ptr*)sendAndReceive((Ptr*)req, 2); ASSERT_TRUE(reply); rcvIA = (Ptr*) reply->getOption(OPTION_IA_NA); ASSERT_TRUE(rcvIA); // server should return T1 = 101, becasue SERVER_DEFAULT_MIN_T1(5) < 101 < SERVER_DEFAULT_MAX_T1 (3600) // server should return T2 = 101, becasue SERVER_DEFAULT_MIN_T1(10) < 102 < SERVER_DEFAULT_MAX_T1 (5400) EXPECT_TRUE( checkIA_NA(rcvIA, minRange, maxRange, 100, 101, 102, SERVER_DEFAULT_MAX_PREF, SERVER_DEFAULT_MAX_VALID) ); EXPECT_EQ(1u, cfgAddrClass->getAssignedCount()); cout << "Sending RELEASE" << endl; SPtr rel = createRelease(); rel->addOption((Ptr*)clntId_); rel->addOption(req->getOption(OPTION_SERVERID)); rcvIA->delOption(OPTION_STATUS_CODE); rel->addOption((Ptr*)rcvIA); SPtr releaseReply = (Ptr*)sendAndReceive((Ptr*)rel, 3); EXPECT_EQ(0u, cfgAddrClass->getAssignedCount()); } TEST_F(ServerTest, SARR_single_class_params) { // check that an interface was successfully selected string cfg = "iface REPLACE_ME {\n" " t1 1000\n" " t2 2000\n" " preferred-lifetime 3000\n" " valid-lifetime 4000\n" " class { pool 2001:db8:123::/64 }\n" "}\n"; ASSERT_TRUE( createMgrs(cfg) ); // now generate SOLICIT SPtr sol = createSolicit(); sol->addOption((Ptr*)clntId_); // include client-id sol->addOption((Ptr*)ia_); // include IA_NA ia_->setIAID(100); ia_->setT1(101); ia_->setT2(102); SPtr adv = (Ptr*)sendAndReceive((Ptr*)sol, 1); ASSERT_TRUE(adv); // check that there is an ADVERTISE response SPtr rcvIA = (Ptr*) adv->getOption(OPTION_IA_NA); ASSERT_TRUE(rcvIA); SPtr minRange = new TIPv6Addr("2001:db8:123::", true); SPtr maxRange = new TIPv6Addr("2001:db8:123::ffff:ffff:ffff:ffff", true); EXPECT_TRUE( checkIA_NA(rcvIA, minRange, maxRange, 100, 1000, 2000, 3000, 4000)); cout << "REQUEST" << endl; // now generate REQUEST SPtr req = createRequest(); req->addOption((Ptr*)clntId_); req->addOption((Ptr*)ia_); ia_->setIAID(100); ia_->setT1(101); ia_->setT2(102); ASSERT_TRUE(adv->getOption(OPTION_SERVERID)); req->addOption(adv->getOption(OPTION_SERVERID)); // ... and get REPLY from the server SPtr reply = (Ptr*)sendAndReceive((Ptr*)req, 2); ASSERT_TRUE(reply); rcvIA = (Ptr*) reply->getOption(OPTION_IA_NA); ASSERT_TRUE(rcvIA); EXPECT_TRUE( checkIA_NA(rcvIA, minRange, maxRange, 100, 1000, 2000, 3000, 4000)); } TEST_F(ServerTest, SARR_inpool_reservation) { // check that an interface was successfully selected string cfg = "iface REPLACE_ME {\n" " t1 1000\n" " t2 2000\n" " preferred-lifetime 3000\n" " valid-lifetime 4000\n" " class { pool 2001:db8:123::/64 }\n" " client duid 00:01:00:0a:0b:0c:0d:0e:0f {\n" " address 2001:db8:123::babe\n" " }\n" "}\n"; ASSERT_TRUE( createMgrs(cfg) ); // now generate SOLICIT SPtr sol = createSolicit(); sol->addOption((Ptr*)clntId_); // include client-id sol->addOption((Ptr*)ia_); // include IA_NA ia_->setIAID(100); ia_->setT1(101); ia_->setT2(102); SPtr adv = (Ptr*)sendAndReceive((Ptr*)sol, 1); ASSERT_TRUE(adv); // check that there is an ADVERTISE response SPtr rcvIA = (Ptr*) adv->getOption(OPTION_IA_NA); ASSERT_TRUE(rcvIA); SPtr minRange = new TIPv6Addr("2001:db8:123::babe", true); SPtr maxRange = new TIPv6Addr("2001:db8:123::babe", true); EXPECT_TRUE( checkIA_NA(rcvIA, minRange, maxRange, 100, 1000, 2000, 3000, 4000)); cout << "REQUEST" << endl; // now generate REQUEST SPtr req = createRequest(); req->addOption((Ptr*)clntId_); req->addOption((Ptr*)ia_); ia_->setIAID(100); ia_->setT1(101); ia_->setT2(102); ASSERT_TRUE(adv->getOption(OPTION_SERVERID)); req->addOption(adv->getOption(OPTION_SERVERID)); // ... and get REPLY from the server SPtr reply = (Ptr*)sendAndReceive((Ptr*)req, 2); ASSERT_TRUE(reply); rcvIA = (Ptr*) reply->getOption(OPTION_IA_NA); ASSERT_TRUE(rcvIA); EXPECT_TRUE( checkIA_NA(rcvIA, minRange, maxRange, 100, 1000, 2000, 3000, 4000)); } TEST_F(ServerTest, SARR_inpool_reservation_negative) { // check that an interface was successfully selected string cfg = "iface REPLACE_ME {\n" " t1 1000\n" " t2 2000\n" " preferred-lifetime 3000\n" " valid-lifetime 4000\n" " class { pool 2001:db8:123::/64 }\n" " client duid 00:01:00:00:00:00:00:00:00 {\n" // not our DUID " address 2001:db8:123::babe\n" " }\n" "}\n"; ASSERT_TRUE( createMgrs(cfg) ); // now generate SOLICIT SPtr sol = createSolicit(); sol->addOption((Ptr*)clntId_); // include client-id sol->addOption((Ptr*)ia_); // include IA_NA ia_->setIAID(100); ia_->setT1(101); ia_->setT2(102); SPtr addr = new TIPv6Addr("2001:db8:123::babe", true); SPtr optAddr = new TSrvOptIAAddress(addr, 1000, 2000, &(*sol)); ia_->addOption((Ptr*)optAddr); SPtr adv = (Ptr*)sendAndReceive((Ptr*)sol, 1); ASSERT_TRUE(adv); // check that there is an ADVERTISE response SPtr rcvIA = (Ptr*) adv->getOption(OPTION_IA_NA); ASSERT_TRUE(rcvIA); SPtr rcvOptAddr = (Ptr*)rcvIA->getOption(OPTION_IAADDR); ASSERT_TRUE(rcvOptAddr); cout << "Requested " << addr->getPlain() << ", received " << rcvOptAddr->getAddr()->getPlain() << endl; if (addr->getPlain() == rcvOptAddr->getAddr()->getPlain()) { ADD_FAILURE() << "Assigned address that was reserved for someone else."; } SPtr minRange = new TIPv6Addr("2001:db8:123::", true); SPtr maxRange = new TIPv6Addr("2001:db8:123::ffff:ffff:ffff:ffff", true); EXPECT_TRUE( checkIA_NA(rcvIA, minRange, maxRange, 100, 1000, 2000, 3000, 4000)); cout << "REQUEST" << endl; // now generate REQUEST SPtr req = createRequest(); req->addOption((Ptr*)clntId_); req->addOption((Ptr*)ia_); ia_->setIAID(100); ia_->setT1(101); ia_->setT2(102); ASSERT_TRUE(adv->getOption(OPTION_SERVERID)); req->addOption(adv->getOption(OPTION_SERVERID)); // ... and get REPLY from the server SPtr reply = (Ptr*)sendAndReceive((Ptr*)req, 2); ASSERT_TRUE(reply); rcvIA = (Ptr*) reply->getOption(OPTION_IA_NA); ASSERT_TRUE(rcvIA); EXPECT_TRUE( checkIA_NA(rcvIA, minRange, maxRange, 100, 1000, 2000, 3000, 4000)); } TEST_F(ServerTest, SARR_inpool_reservation_negative2) { // check that if the pool is small and address is reserved for client A, client B // will not get it string cfg = "iface REPLACE_ME {\n" " t1 1000\n" " t2 2000\n" " preferred-lifetime 3000\n" " valid-lifetime 4000\n" " class { pool 2001:db8:123::babe }\n" " client duid 00:01:00:00:00:00:00:00:00 {\n" // not our DUID " address 2001:db8:123::babe\n" " }\n" "}\n"; ASSERT_TRUE( createMgrs(cfg) ); // now generate SOLICIT SPtr sol = createSolicit(); sol->addOption((Ptr*)clntId_); // include client-id sol->addOption((Ptr*)ia_); // include IA_NA ia_->setIAID(100); ia_->setT1(101); ia_->setT2(102); SPtr addr = new TIPv6Addr("2001:db8:123::babe", true); SPtr optAddr = new TSrvOptIAAddress(addr, 1000, 2000, &(*sol)); ia_->addOption((Ptr*)optAddr); SPtr adv = (Ptr*)sendAndReceive((Ptr*)sol, 1); ASSERT_TRUE(adv); // check that there is an ADVERTISE response SPtr rcvIA = (Ptr*) adv->getOption(OPTION_IA_NA); ASSERT_TRUE(rcvIA); SPtr rcvOptAddr = (Ptr*)rcvIA->getOption(OPTION_IAADDR); if (rcvOptAddr) { FAIL() << "Client received " << rcvOptAddr->getAddr()->getPlain() << " addr, but expected NoAddrsAvail status." << endl; } SPtr rcvStatusCode = (Ptr*)rcvIA->getOption(OPTION_STATUS_CODE); ASSERT_TRUE(rcvStatusCode); EXPECT_EQ(STATUSCODE_NOADDRSAVAIL, rcvStatusCode->getCode()); } TEST_F(ServerTest, SARR_outpool_reservation) { // check that an interface was successfully selected string cfg = "iface REPLACE_ME {\n" " t1 1000\n" " t2 2000\n" " preferred-lifetime 3000\n" " valid-lifetime 4000\n" " class { pool 2001:db8:123::/64 }\n" " client duid 00:01:00:0a:0b:0c:0d:0e:0f {\n" " address 2002::babe\n" " }\n" "}\n"; ASSERT_TRUE( createMgrs(cfg) ); // now generate SOLICIT SPtr sol = createSolicit(); sol->addOption((Ptr*)clntId_); // include client-id sol->addOption((Ptr*)ia_); // include IA_NA ia_->setIAID(100); ia_->setT1(101); ia_->setT2(102); SPtr adv = (Ptr*)sendAndReceive((Ptr*)sol, 1); ASSERT_TRUE(adv); // check that there is an ADVERTISE response SPtr rcvIA = (Ptr*) adv->getOption(OPTION_IA_NA); ASSERT_TRUE(rcvIA); SPtr minRange = new TIPv6Addr("2002::babe", true); SPtr maxRange = new TIPv6Addr("2002::babe", true); EXPECT_TRUE( checkIA_NA(rcvIA, minRange, maxRange, 100, 1000, 2000, 3000, 4000)); cout << "REQUEST" << endl; // now generate REQUEST SPtr req = createRequest(); req->addOption((Ptr*)clntId_); req->addOption((Ptr*)ia_); ia_->setIAID(100); ia_->setT1(101); ia_->setT2(102); ASSERT_TRUE(adv->getOption(OPTION_SERVERID)); req->addOption(adv->getOption(OPTION_SERVERID)); // ... and get REPLY from the server SPtr reply = (Ptr*)sendAndReceive((Ptr*)req, 2); ASSERT_TRUE(reply); rcvIA = (Ptr*) reply->getOption(OPTION_IA_NA); ASSERT_TRUE(rcvIA); EXPECT_TRUE( checkIA_NA(rcvIA, minRange, maxRange, 100, 1000, 2000, 3000, 4000)); } } dibbler-1.0.1/tests/Srv/.deps/0000775000175000017500000000000012561700377013054 500000000000000dibbler-1.0.1/tests/Srv/.deps/assign_utils.Po0000664000175000017500000000001012561700377015767 00000000000000# dummy dibbler-1.0.1/tests/Srv/.deps/wireshark.Po0000664000175000017500000000001012561700377015262 00000000000000# dummy dibbler-1.0.1/tests/Srv/.deps/relay_unittest.Po0000664000175000017500000000001012561700377016336 00000000000000# dummy dibbler-1.0.1/tests/Srv/.deps/assign_prefix_unittest.Po0000664000175000017500000000001012561700377020063 00000000000000# dummy dibbler-1.0.1/tests/Srv/.deps/options_unittest.Po0000664000175000017500000000001012561700377016715 00000000000000# dummy dibbler-1.0.1/tests/Srv/.deps/run_tests.Po0000664000175000017500000000001012561700377015311 00000000000000# dummy dibbler-1.0.1/tests/Srv/.deps/assign_addr_unittest.Po0000664000175000017500000000001012561700377017500 00000000000000# dummy dibbler-1.0.1/tests/Srv/Makefile.in0000664000175000017500000011131112561652536014031 00000000000000# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ TESTS = $(am__EXEEXT_1) @HAVE_GTEST_TRUE@am__append_1 = Srv_tests noinst_PROGRAMS = $(am__EXEEXT_2) subdir = tests/Srv DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/depcomp $(top_srcdir)/test-driver ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/libtool.m4 \ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/include/dibbler-config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = @HAVE_GTEST_TRUE@am__EXEEXT_1 = Srv_tests$(EXEEXT) am__EXEEXT_2 = $(am__EXEEXT_1) PROGRAMS = $(noinst_PROGRAMS) am__Srv_tests_SOURCES_DIST = run_tests.cpp assign_utils.cc \ assign_utils.h assign_addr_unittest.cc \ assign_prefix_unittest.cc options_unittest.cc \ relay_unittest.cc wireshark.cc @HAVE_GTEST_TRUE@am_Srv_tests_OBJECTS = run_tests.$(OBJEXT) \ @HAVE_GTEST_TRUE@ assign_utils.$(OBJEXT) \ @HAVE_GTEST_TRUE@ assign_addr_unittest.$(OBJEXT) \ @HAVE_GTEST_TRUE@ assign_prefix_unittest.$(OBJEXT) \ @HAVE_GTEST_TRUE@ options_unittest.$(OBJEXT) \ @HAVE_GTEST_TRUE@ relay_unittest.$(OBJEXT) wireshark.$(OBJEXT) Srv_tests_OBJECTS = $(am_Srv_tests_OBJECTS) am__DEPENDENCIES_1 = @HAVE_GTEST_TRUE@Srv_tests_DEPENDENCIES = $(am__DEPENDENCIES_1) \ @HAVE_GTEST_TRUE@ $(top_builddir)/SrvTransMgr/libSrvTransMgr.a \ @HAVE_GTEST_TRUE@ $(top_builddir)/SrvCfgMgr/libSrvCfgMgr.a \ @HAVE_GTEST_TRUE@ $(top_builddir)/CfgMgr/libCfgMgr.a \ @HAVE_GTEST_TRUE@ $(top_builddir)/SrvIfaceMgr/libSrvIfaceMgr.a \ @HAVE_GTEST_TRUE@ $(top_builddir)/IfaceMgr/libIfaceMgr.a \ @HAVE_GTEST_TRUE@ $(top_builddir)/SrvAddrMgr/libSrvAddrMgr.a \ @HAVE_GTEST_TRUE@ $(top_builddir)/AddrMgr/libAddrMgr.a \ @HAVE_GTEST_TRUE@ $(top_builddir)/SrvMessages/libSrvMessages.a \ @HAVE_GTEST_TRUE@ $(top_builddir)/Messages/libMessages.a \ @HAVE_GTEST_TRUE@ $(top_builddir)/SrvOptions/libSrvOptions.a \ @HAVE_GTEST_TRUE@ $(top_builddir)/Options/libOptions.a \ @HAVE_GTEST_TRUE@ $(top_builddir)/Misc/libMisc.a \ @HAVE_GTEST_TRUE@ $(top_builddir)/poslib/libPoslib.a \ @HAVE_GTEST_TRUE@ $(top_builddir)/nettle/libNettle.a \ @HAVE_GTEST_TRUE@ $(top_builddir)/@PORT_SUBDIR@/libLowLevel.a AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = Srv_tests_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \ $(CXXFLAGS) $(Srv_tests_LDFLAGS) $(LDFLAGS) -o $@ AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)/include depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) LTCXXCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CXXFLAGS) $(CXXFLAGS) AM_V_CXX = $(am__v_CXX_@AM_V@) am__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@) am__v_CXX_0 = @echo " CXX " $@; am__v_CXX_1 = CXXLD = $(CXX) CXXLINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \ $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CXXLD = $(am__v_CXXLD_@AM_V@) am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@) am__v_CXXLD_0 = @echo " CXXLD " $@; am__v_CXXLD_1 = COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(Srv_tests_SOURCES) DIST_SOURCES = $(am__Srv_tests_SOURCES_DIST) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags am__tty_colors_dummy = \ mgn= red= grn= lgn= blu= brg= std=; \ am__color_tests=no am__tty_colors = { \ $(am__tty_colors_dummy); \ if test "X$(AM_COLOR_TESTS)" = Xno; then \ am__color_tests=no; \ elif test "X$(AM_COLOR_TESTS)" = Xalways; then \ am__color_tests=yes; \ elif test "X$$TERM" != Xdumb && { test -t 1; } 2>/dev/null; then \ am__color_tests=yes; \ fi; \ if test $$am__color_tests = yes; then \ red=''; \ grn=''; \ lgn=''; \ blu=''; \ mgn=''; \ brg=''; \ std=''; \ fi; \ } am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__recheck_rx = ^[ ]*:recheck:[ ]* am__global_test_result_rx = ^[ ]*:global-test-result:[ ]* am__copy_in_global_log_rx = ^[ ]*:copy-in-global-log:[ ]* # A command that, given a newline-separated list of test names on the # standard input, print the name of the tests that are to be re-run # upon "make recheck". am__list_recheck_tests = $(AWK) '{ \ recheck = 1; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ { \ if ((getline line2 < ($$0 ".log")) < 0) \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[nN][Oo]/) \ { \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[yY][eE][sS]/) \ { \ break; \ } \ }; \ if (recheck) \ print $$0; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # A command that, given a newline-separated list of test names on the # standard input, create the global log from their .trs and .log files. am__create_global_log = $(AWK) ' \ function fatal(msg) \ { \ print "fatal: making $@: " msg | "cat >&2"; \ exit 1; \ } \ function rst_section(header) \ { \ print header; \ len = length(header); \ for (i = 1; i <= len; i = i + 1) \ printf "="; \ printf "\n\n"; \ } \ { \ copy_in_global_log = 1; \ global_test_result = "RUN"; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".trs"); \ if (line ~ /$(am__global_test_result_rx)/) \ { \ sub("$(am__global_test_result_rx)", "", line); \ sub("[ ]*$$", "", line); \ global_test_result = line; \ } \ else if (line ~ /$(am__copy_in_global_log_rx)[nN][oO]/) \ copy_in_global_log = 0; \ }; \ if (copy_in_global_log) \ { \ rst_section(global_test_result ": " $$0); \ while ((rc = (getline line < ($$0 ".log"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".log"); \ print line; \ }; \ printf "\n"; \ }; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # Restructured Text title. am__rst_title = { sed 's/.*/ & /;h;s/./=/g;p;x;s/ *$$//;p;g' && echo; } # Solaris 10 'make', and several other traditional 'make' implementations, # pass "-e" to $(SHELL), and POSIX 2008 even requires this. Work around it # by disabling -e (using the XSI extension "set +e") if it's set. am__sh_e_setup = case $$- in *e*) set +e;; esac # Default flags passed to test drivers. am__common_driver_flags = \ --color-tests "$$am__color_tests" \ --enable-hard-errors "$$am__enable_hard_errors" \ --expect-failure "$$am__expect_failure" # To be inserted before the command running the test. Creates the # directory for the log if needed. Stores in $dir the directory # containing $f, in $tst the test, in $log the log. Executes the # developer- defined test setup AM_TESTS_ENVIRONMENT (if any), and # passes TESTS_ENVIRONMENT. Set up options for the wrapper that # will run the test scripts (or their associated LOG_COMPILER, if # thy have one). am__check_pre = \ $(am__sh_e_setup); \ $(am__vpath_adj_setup) $(am__vpath_adj) \ $(am__tty_colors); \ srcdir=$(srcdir); export srcdir; \ case "$@" in \ */*) am__odir=`echo "./$@" | sed 's|/[^/]*$$||'`;; \ *) am__odir=.;; \ esac; \ test "x$$am__odir" = x"." || test -d "$$am__odir" \ || $(MKDIR_P) "$$am__odir" || exit $$?; \ if test -f "./$$f"; then dir=./; \ elif test -f "$$f"; then dir=; \ else dir="$(srcdir)/"; fi; \ tst=$$dir$$f; log='$@'; \ if test -n '$(DISABLE_HARD_ERRORS)'; then \ am__enable_hard_errors=no; \ else \ am__enable_hard_errors=yes; \ fi; \ case " $(XFAIL_TESTS) " in \ *[\ \ ]$$f[\ \ ]* | *[\ \ ]$$dir$$f[\ \ ]*) \ am__expect_failure=yes;; \ *) \ am__expect_failure=no;; \ esac; \ $(AM_TESTS_ENVIRONMENT) $(TESTS_ENVIRONMENT) # A shell command to get the names of the tests scripts with any registered # extension removed (i.e., equivalently, the names of the test logs, with # the '.log' extension removed). The result is saved in the shell variable # '$bases'. This honors runtime overriding of TESTS and TEST_LOGS. Sadly, # we cannot use something simpler, involving e.g., "$(TEST_LOGS:.log=)", # since that might cause problem with VPATH rewrites for suffix-less tests. # See also 'test-harness-vpath-rewrite.sh' and 'test-trs-basic.sh'. am__set_TESTS_bases = \ bases='$(TEST_LOGS)'; \ bases=`for i in $$bases; do echo $$i; done | sed 's/\.log$$//'`; \ bases=`echo $$bases` RECHECK_LOGS = $(TEST_LOGS) AM_RECURSIVE_TARGETS = check recheck TEST_SUITE_LOG = test-suite.log TEST_EXTENSIONS = @EXEEXT@ .test LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver LOG_COMPILE = $(LOG_COMPILER) $(AM_LOG_FLAGS) $(LOG_FLAGS) am__set_b = \ case '$@' in \ */*) \ case '$*' in \ */*) b='$*';; \ *) b=`echo '$@' | sed 's/\.log$$//'`; \ esac;; \ *) \ b='$*';; \ esac am__test_logs1 = $(TESTS:=.log) am__test_logs2 = $(am__test_logs1:@EXEEXT@.log=.log) TEST_LOGS = $(am__test_logs2:.test.log=.log) TEST_LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver TEST_LOG_COMPILE = $(TEST_LOG_COMPILER) $(AM_TEST_LOG_FLAGS) \ $(TEST_LOG_FLAGS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALLOCA = @ALLOCA@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ ARCH = @ARCH@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ EXTRA_DIST_SUBDIRS = @EXTRA_DIST_SUBDIRS@ FGREP = @FGREP@ GREP = @GREP@ GTEST_INCLUDES = @GTEST_INCLUDES@ GTEST_LDADD = @GTEST_LDADD@ GTEST_LDFLAGS = @GTEST_LDFLAGS@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LINKPRINT = @LINKPRINT@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PORT_CFLAGS = @PORT_CFLAGS@ PORT_LDFLAGS = @PORT_LDFLAGS@ PORT_SUBDIR = @PORT_SUBDIR@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ subdirs = @subdirs@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ # This is to workaround long long in gtest.h AM_CPPFLAGS = -I$(top_srcdir)/SrvCfgMgr -I$(top_srcdir)/CfgMgr \ -I$(top_srcdir)/SrvIfaceMgr -I$(top_srcdir)/IfaceMgr \ -I$(top_srcdir)/AddrMgr -I$(top_srcdir)/SrvAddrMgr \ -I$(top_srcdir)/Options -I$(top_srcdir)/SrvOptions \ -I$(top_srcdir)/Messages -I$(top_srcdir)/SrvMessages \ -I$(top_srcdir)/SrvTransMgr -I$(top_srcdir)/Misc \ $(GTEST_INCLUDES) -Wno-long-long -Wno-variadic-macros @HAVE_GTEST_TRUE@Srv_tests_SOURCES = run_tests.cpp assign_utils.cc \ @HAVE_GTEST_TRUE@ assign_utils.h assign_addr_unittest.cc \ @HAVE_GTEST_TRUE@ assign_prefix_unittest.cc options_unittest.cc \ @HAVE_GTEST_TRUE@ relay_unittest.cc wireshark.cc @HAVE_GTEST_TRUE@Srv_tests_LDFLAGS = $(AM_LDFLAGS) $(GTEST_LDFLAGS) @HAVE_GTEST_TRUE@Srv_tests_LDADD = $(GTEST_LDADD) \ @HAVE_GTEST_TRUE@ $(top_builddir)/SrvTransMgr/libSrvTransMgr.a \ @HAVE_GTEST_TRUE@ $(top_builddir)/SrvCfgMgr/libSrvCfgMgr.a \ @HAVE_GTEST_TRUE@ $(top_builddir)/CfgMgr/libCfgMgr.a \ @HAVE_GTEST_TRUE@ $(top_builddir)/SrvIfaceMgr/libSrvIfaceMgr.a \ @HAVE_GTEST_TRUE@ $(top_builddir)/IfaceMgr/libIfaceMgr.a \ @HAVE_GTEST_TRUE@ $(top_builddir)/SrvAddrMgr/libSrvAddrMgr.a \ @HAVE_GTEST_TRUE@ $(top_builddir)/AddrMgr/libAddrMgr.a \ @HAVE_GTEST_TRUE@ $(top_builddir)/SrvMessages/libSrvMessages.a \ @HAVE_GTEST_TRUE@ $(top_builddir)/Messages/libMessages.a \ @HAVE_GTEST_TRUE@ $(top_builddir)/SrvOptions/libSrvOptions.a \ @HAVE_GTEST_TRUE@ $(top_builddir)/Options/libOptions.a \ @HAVE_GTEST_TRUE@ $(top_builddir)/Misc/libMisc.a \ @HAVE_GTEST_TRUE@ $(top_builddir)/poslib/libPoslib.a \ @HAVE_GTEST_TRUE@ $(top_builddir)/nettle/libNettle.a \ @HAVE_GTEST_TRUE@ $(top_builddir)/@PORT_SUBDIR@/libLowLevel.a all: all-am .SUFFIXES: .SUFFIXES: .cc .cpp .lo .log .o .obj .test .test$(EXEEXT) .trs $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign tests/Srv/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign tests/Srv/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstPROGRAMS: @list='$(noinst_PROGRAMS)'; test -n "$$list" || exit 0; \ echo " rm -f" $$list; \ rm -f $$list || exit $$?; \ test -n "$(EXEEXT)" || exit 0; \ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ echo " rm -f" $$list; \ rm -f $$list Srv_tests$(EXEEXT): $(Srv_tests_OBJECTS) $(Srv_tests_DEPENDENCIES) $(EXTRA_Srv_tests_DEPENDENCIES) @rm -f Srv_tests$(EXEEXT) $(AM_V_CXXLD)$(Srv_tests_LINK) $(Srv_tests_OBJECTS) $(Srv_tests_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/assign_addr_unittest.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/assign_prefix_unittest.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/assign_utils.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/options_unittest.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/relay_unittest.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/run_tests.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/wireshark.Po@am__quote@ .cc.o: @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $< .cc.obj: @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .cc.lo: @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LTCXXCOMPILE) -c -o $@ $< .cpp.o: @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $< .cpp.obj: @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .cpp.lo: @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LTCXXCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags # Recover from deleted '.trs' file; this should ensure that # "rm -f foo.log; make foo.trs" re-run 'foo.test', and re-create # both 'foo.log' and 'foo.trs'. Break the recipe in two subshells # to avoid problems with "make -n". .log.trs: rm -f $< $@ $(MAKE) $(AM_MAKEFLAGS) $< # Leading 'am--fnord' is there to ensure the list of targets does not # expand to empty, as could happen e.g. with make check TESTS=''. am--fnord $(TEST_LOGS) $(TEST_LOGS:.log=.trs): $(am__force_recheck) am--force-recheck: @: $(TEST_SUITE_LOG): $(TEST_LOGS) @$(am__set_TESTS_bases); \ am__f_ok () { test -f "$$1" && test -r "$$1"; }; \ redo_bases=`for i in $$bases; do \ am__f_ok $$i.trs && am__f_ok $$i.log || echo $$i; \ done`; \ if test -n "$$redo_bases"; then \ redo_logs=`for i in $$redo_bases; do echo $$i.log; done`; \ redo_results=`for i in $$redo_bases; do echo $$i.trs; done`; \ if $(am__make_dryrun); then :; else \ rm -f $$redo_logs && rm -f $$redo_results || exit 1; \ fi; \ fi; \ if test -n "$$am__remaking_logs"; then \ echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \ "recursion detected" >&2; \ else \ am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \ fi; \ if $(am__make_dryrun); then :; else \ st=0; \ errmsg="fatal: making $(TEST_SUITE_LOG): failed to create"; \ for i in $$redo_bases; do \ test -f $$i.trs && test -r $$i.trs \ || { echo "$$errmsg $$i.trs" >&2; st=1; }; \ test -f $$i.log && test -r $$i.log \ || { echo "$$errmsg $$i.log" >&2; st=1; }; \ done; \ test $$st -eq 0 || exit 1; \ fi @$(am__sh_e_setup); $(am__tty_colors); $(am__set_TESTS_bases); \ ws='[ ]'; \ results=`for b in $$bases; do echo $$b.trs; done`; \ test -n "$$results" || results=/dev/null; \ all=` grep "^$$ws*:test-result:" $$results | wc -l`; \ pass=` grep "^$$ws*:test-result:$$ws*PASS" $$results | wc -l`; \ fail=` grep "^$$ws*:test-result:$$ws*FAIL" $$results | wc -l`; \ skip=` grep "^$$ws*:test-result:$$ws*SKIP" $$results | wc -l`; \ xfail=`grep "^$$ws*:test-result:$$ws*XFAIL" $$results | wc -l`; \ xpass=`grep "^$$ws*:test-result:$$ws*XPASS" $$results | wc -l`; \ error=`grep "^$$ws*:test-result:$$ws*ERROR" $$results | wc -l`; \ if test `expr $$fail + $$xpass + $$error` -eq 0; then \ success=true; \ else \ success=false; \ fi; \ br='==================='; br=$$br$$br$$br$$br; \ result_count () \ { \ if test x"$$1" = x"--maybe-color"; then \ maybe_colorize=yes; \ elif test x"$$1" = x"--no-color"; then \ maybe_colorize=no; \ else \ echo "$@: invalid 'result_count' usage" >&2; exit 4; \ fi; \ shift; \ desc=$$1 count=$$2; \ if test $$maybe_colorize = yes && test $$count -gt 0; then \ color_start=$$3 color_end=$$std; \ else \ color_start= color_end=; \ fi; \ echo "$${color_start}# $$desc $$count$${color_end}"; \ }; \ create_testsuite_report () \ { \ result_count $$1 "TOTAL:" $$all "$$brg"; \ result_count $$1 "PASS: " $$pass "$$grn"; \ result_count $$1 "SKIP: " $$skip "$$blu"; \ result_count $$1 "XFAIL:" $$xfail "$$lgn"; \ result_count $$1 "FAIL: " $$fail "$$red"; \ result_count $$1 "XPASS:" $$xpass "$$red"; \ result_count $$1 "ERROR:" $$error "$$mgn"; \ }; \ { \ echo "$(PACKAGE_STRING): $(subdir)/$(TEST_SUITE_LOG)" | \ $(am__rst_title); \ create_testsuite_report --no-color; \ echo; \ echo ".. contents:: :depth: 2"; \ echo; \ for b in $$bases; do echo $$b; done \ | $(am__create_global_log); \ } >$(TEST_SUITE_LOG).tmp || exit 1; \ mv $(TEST_SUITE_LOG).tmp $(TEST_SUITE_LOG); \ if $$success; then \ col="$$grn"; \ else \ col="$$red"; \ test x"$$VERBOSE" = x || cat $(TEST_SUITE_LOG); \ fi; \ echo "$${col}$$br$${std}"; \ echo "$${col}Testsuite summary for $(PACKAGE_STRING)$${std}"; \ echo "$${col}$$br$${std}"; \ create_testsuite_report --maybe-color; \ echo "$$col$$br$$std"; \ if $$success; then :; else \ echo "$${col}See $(subdir)/$(TEST_SUITE_LOG)$${std}"; \ if test -n "$(PACKAGE_BUGREPORT)"; then \ echo "$${col}Please report to $(PACKAGE_BUGREPORT)$${std}"; \ fi; \ echo "$$col$$br$$std"; \ fi; \ $$success || exit 1 check-TESTS: @list='$(RECHECK_LOGS)'; test -z "$$list" || rm -f $$list @list='$(RECHECK_LOGS:.log=.trs)'; test -z "$$list" || rm -f $$list @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ log_list=`for i in $$bases; do echo $$i.log; done`; \ trs_list=`for i in $$bases; do echo $$i.trs; done`; \ log_list=`echo $$log_list`; trs_list=`echo $$trs_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) TEST_LOGS="$$log_list"; \ exit $$?; recheck: all @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ bases=`for i in $$bases; do echo $$i; done \ | $(am__list_recheck_tests)` || exit 1; \ log_list=`for i in $$bases; do echo $$i.log; done`; \ log_list=`echo $$log_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) \ am__force_recheck=am--force-recheck \ TEST_LOGS="$$log_list"; \ exit $$? Srv_tests.log: Srv_tests$(EXEEXT) @p='Srv_tests$(EXEEXT)'; \ b='Srv_tests'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) .test.log: @p='$<'; \ $(am__set_b); \ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) @am__EXEEXT_TRUE@.test$(EXEEXT).log: @am__EXEEXT_TRUE@ @p='$<'; \ @am__EXEEXT_TRUE@ $(am__set_b); \ @am__EXEEXT_TRUE@ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ @am__EXEEXT_TRUE@ --log-file $$b.log --trs-file $$b.trs \ @am__EXEEXT_TRUE@ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ @am__EXEEXT_TRUE@ "$$tst" $(AM_TESTS_FD_REDIRECT) distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am $(MAKE) $(AM_MAKEFLAGS) check-TESTS check: check-am all-am: Makefile $(PROGRAMS) installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: -test -z "$(TEST_LOGS)" || rm -f $(TEST_LOGS) -test -z "$(TEST_LOGS:.log=.trs)" || rm -f $(TEST_LOGS:.log=.trs) -test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool clean-noinstPROGRAMS \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: check-am install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-TESTS check-am clean \ clean-generic clean-libtool clean-noinstPROGRAMS cscopelist-am \ ctags ctags-am distclean distclean-compile distclean-generic \ distclean-libtool distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-dvi install-dvi-am install-exec \ install-exec-am install-html install-html-am install-info \ install-info-am install-man install-pdf install-pdf-am \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ recheck tags tags-am uninstall uninstall-am info: @echo "GTEST_LDADD=$(GTEST_LDADD)" @echo "GTEST_LDFLAGS=$(GTEST_LDFLAGS)" @echo "GTEST_INCLUDES=$(GTEST_INCLUDES)" @echo "HAVE_GTEST=$(HAVE_GTEST)" # 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: dibbler-1.0.1/tests/Srv/wireshark.cc0000644000175000017500000000742612360252515014271 00000000000000/* * Dibbler - a portable DHCPv6 * * author: Tomasz Mrugalski * * released under GNU GPL v2 only licence * */ #include "SrvIfaceMgr.h" #include "SrvCfgMgr.h" #include "SrvTransMgr.h" #include "SrvOptInterfaceID.h" #include "assign_utils.h" #include using namespace std; namespace test { TEST_F(ServerTest, parseDoubleRelay) { // check that an interface was successfully selected string cfg = "iface REPLACE_ME { class { pool 2001:db8:dead::/64 } } " "iface \"relay1\" { " "relay \"REPLACE_ME\" " "interface-id \"ISAM144|299|ipv6|nt:vp:1:110\" " "}" "iface \"relay2\" {" "relay relay1 " "interface-id \"ISAM144 eth 1/1/05/01\" " "class { " " pool 2001:888:db8:1::/64" "}" "}"; #if 0 "guess-mode\n" "iface REPLACE_ME {\n" " unicast 2001:db8:100:f101::3\n" " class { pool 2001:db8:1::/64 }\n" "}\n" "\n" "iface relay1 {" " relay REPLACE_ME\n" " interface-id 1234\n" " class { pool 2001:db8:123::/64 }\n" "}\n"; #endif ASSERT_TRUE( createMgrs(cfg) ); SrvIfaceMgr().dump(); // Send doubly encapsulated relay, with sendHex("2001:888:db8:1::5", 547, "ff05::1:3", 10000 + DHCPSERVER_PORT, iface_->getName(), "0c01200108880db800010000000000000000fe80000000000000020021fffe5c18a900" "09007d0c0000000000000000000000000000000000fe80000000000000020021fffe5c" "18a9001200154953414d3134342065746820312f312f30352f30310025000400000de9" "00090036016b4fe20001000e0001000118b033410000215c18a90003000c00000001ff" "ffffffffffffff00080002000000060006001700f200f30012001c4953414d3134347c" "3239397c697076367c6e743a76703a313a313130002500120000197f0001000118b033" "410000215c18a9"); SPtr received = SrvIfaceMgr().select(1); ASSERT_TRUE(received); vector &rcvRelay = received->RelayInfo_; // Check that there's info about exactly one relay ASSERT_EQ(rcvRelay.size(), 2u); // Check link-address, peer-addr and hop fields ASSERT_TRUE(rcvRelay[0].LinkAddr_); EXPECT_EQ(string(rcvRelay[0].LinkAddr_->getPlain()), "2001:888:db8:1::"); ASSERT_TRUE(rcvRelay[0].PeerAddr_); EXPECT_EQ(string(rcvRelay[0].PeerAddr_->getPlain()), "fe80::200:21ff:fe5c:18a9"); EXPECT_EQ(rcvRelay[0].Hop_, 1); // Check that there are 2 options: interface-id and remote-id EXPECT_EQ(rcvRelay[0].EchoList_.size(), 2u); // Check that the packet was marked as received over proper interface SPtr cfgIface = SrvCfgMgr().getIfaceByID(received->getIface()); ASSERT_TRUE(cfgIface); EXPECT_EQ(cfgIface->getName(), "relay2"); // PHASE 1: Parse outer relay // Check that interface-id was stored SPtr interfaceid = (Ptr*) TOpt::getOption(rcvRelay[0].EchoList_, OPTION_INTERFACE_ID); ASSERT_TRUE(interfaceid); const char* ifaceid = "ISAM144|299|ipv6|nt:vp:1:110"; TSrvOptInterfaceID expected_ifaceId(ifaceid, strlen(ifaceid), 0); EXPECT_EQ(*interfaceid, expected_ifaceId); // Check that remote-id was stored EXPECT_TRUE(received->getRemoteID()); interfaceid = (Ptr*) TOpt::getOption(rcvRelay[1].EchoList_, OPTION_INTERFACE_ID); ASSERT_TRUE(interfaceid); ifaceid = "ISAM144 eth 1/1/05/01"; TSrvOptInterfaceID expected_ifaceId2(ifaceid, strlen(ifaceid), 0); EXPECT_EQ(*interfaceid, expected_ifaceId2); // Check that remote-id was stored EXPECT_TRUE(received->getRemoteID()); } } dibbler-1.0.1/tests/Srv/options_unittest.cc0000664000175000017500000000237212233256142015720 00000000000000#include "assign_utils.h" #include #include "OptAddrLst.h" using namespace std; namespace test { TEST_F(ServerTest, CfgMgr_options1) { string cfg = "iface REPLACE_ME {\n" " class { pool 2001:db8:1111::/64 }\n" " option nis-server 2000::400,2000::401,2000::404,2000::405,2000::406\n" " option nis-domain nis.example.com\n" " option nis+-server 2000::501,2000::502\n" " option nis+-domain nisplus.example.com\n" "}\n"; ASSERT_TRUE( createMgrs(cfg) ); // check that NIS-SERVERS option is handled properly SPtr opt = (Ptr*)cfgIface_->getExtraOption(OPTION_NIS_SERVERS); ASSERT_TRUE(opt); // check that NIS-servers are supported List(TIPv6Addr) addrLst = opt->getAddrLst(); ASSERT_EQ(5u, addrLst.count()); addrLst.first(); EXPECT_EQ(string("2000::400"), addrLst.get()->getPlain()); EXPECT_EQ(string("2000::401"), addrLst.get()->getPlain()); EXPECT_EQ(string("2000::404"), addrLst.get()->getPlain()); EXPECT_EQ(string("2000::405"), addrLst.get()->getPlain()); EXPECT_EQ(string("2000::406"), addrLst.get()->getPlain()); EXPECT_FALSE(addrLst.get()); // no additional addresses } } dibbler-1.0.1/tests/testCase05/0000755000175000017500000000000012277734640013213 500000000000000dibbler-1.0.1/tests/testCase05/INFO0000664000175000017500000000010212233256142013570 00000000000000Server: 0.1.1-CVS, Linux Client: 0.1.1-CVS, Linux Bug : crashes dibbler-1.0.1/tests/testCase05/server.conf0000664000175000017500000000024212233256142015274 00000000000000iface eth0 { option dns-server 20::1 option domain ipv6.klub.com.pl option time-zone CET option ntp-server 20::2 class { pool 2000:2::1-2000:2::100 } } dibbler-1.0.1/tests/testCase05/client.conf0000664000175000017500000000017012233256142015244 00000000000000 iface 'eth0' { option dns-server option domain option time-zone option ntp-server IA { address { 20::1 } } } dibbler-1.0.1/tests/Logger/0000755000175000017500000000000012277734640012512 500000000000000dibbler-1.0.1/tests/Logger/basic01.cpp0000664000175000017500000000131412233256142014345 00000000000000#include "Logger.h" #include using namespace std; int main() { ostringstream strum; strum << "dupa"; logger::setLogLevel(6); logger::Initialize("foo.log"); Log(Debug) << "Entry Debug: str=" << LogEnd; Log(Info) << "Entry Info: str=" << LogEnd; Log(Notice) << "Entry Notice: str=" << strum.str() << LogEnd; Log(Warning) << "Entry Warning: str=" << strum.str() << LogEnd; Log(Error) << "Entry Error: str=" << strum.str() << LogEnd; Log(Crit) << "Entry Crit: str=" << strum.str() << LogEnd; Log(Alert) << "Entry Alert: str=" << strum.str() << LogEnd; Log(Emerg) << "Entry Emerg: str=" << strum.str() << LogEnd; logger::Terminate(); return 0; } dibbler-1.0.1/tests/testCase03/0000755000175000017500000000000012277734640013211 500000000000000dibbler-1.0.1/tests/testCase03/server.conf0000664000175000017500000000011312233256142015267 00000000000000iface 'eth0' { class { pool 2000:5::1-2000:5::100 } }dibbler-1.0.1/tests/crypto/0000755000175000017500000000000012277734640012613 500000000000000dibbler-1.0.1/tests/crypto/Digests.cpp0000664000175000017500000000143612233256142014633 00000000000000#include #include "sha256.h" void printHash(char* digest) { int x=0; for (x=0;x<32;x++) { printf("%02x", digest[x]); } printf("\n"); } int main() { char * buf1 = "The quick brown fox jumps over the lazy dog"; char digest[32]; int len = strlen(buf1); void * result = sha256_buffer(buf1, len, (void*)digest); printf("str=[%s] len=%d result=%p digest=%p\n", buf1, strlen(buf1), result, digest); printHash(digest); printf("\n"); char * buf2="The quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dog"; len = strlen(buf2); result = sha256_buffer(buf2, len, (void*)digest); printf("str=[%s] len=%d result=%p digest=%p\n", buf2, strlen(buf2), result, digest); printHash(digest); } dibbler-1.0.1/tests/Makefile.in0000664000175000017500000004416712561652536013275 00000000000000# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = tests DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/libtool.m4 \ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/include/dibbler-config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = SOURCES = DIST_SOURCES = RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \ ctags-recursive dvi-recursive html-recursive info-recursive \ install-data-recursive install-dvi-recursive \ install-exec-recursive install-html-recursive \ install-info-recursive install-pdf-recursive \ install-ps-recursive install-recursive installcheck-recursive \ installdirs-recursive pdf-recursive ps-recursive \ tags-recursive uninstall-recursive am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive am__recursive_targets = \ $(RECURSIVE_TARGETS) \ $(RECURSIVE_CLEAN_TARGETS) \ $(am__extra_recursive_targets) AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \ distdir am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags DIST_SUBDIRS = $(SUBDIRS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) am__relativize = \ dir0=`pwd`; \ sed_first='s,^\([^/]*\)/.*$$,\1,'; \ sed_rest='s,^[^/]*/*,,'; \ sed_last='s,^.*/\([^/]*\)$$,\1,'; \ sed_butlast='s,/*[^/]*$$,,'; \ while test -n "$$dir1"; do \ first=`echo "$$dir1" | sed -e "$$sed_first"`; \ if test "$$first" != "."; then \ if test "$$first" = ".."; then \ dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ else \ first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ if test "$$first2" = "$$first"; then \ dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ else \ dir2="../$$dir2"; \ fi; \ dir0="$$dir0"/"$$first"; \ fi; \ fi; \ dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ done; \ reldir="$$dir2" ACLOCAL = @ACLOCAL@ ALLOCA = @ALLOCA@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ ARCH = @ARCH@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ EXTRA_DIST_SUBDIRS = @EXTRA_DIST_SUBDIRS@ FGREP = @FGREP@ GREP = @GREP@ GTEST_INCLUDES = @GTEST_INCLUDES@ GTEST_LDADD = @GTEST_LDADD@ GTEST_LDFLAGS = @GTEST_LDFLAGS@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LINKPRINT = @LINKPRINT@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PORT_CFLAGS = @PORT_CFLAGS@ PORT_LDFLAGS = @PORT_LDFLAGS@ PORT_SUBDIR = @PORT_SUBDIR@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ subdirs = @subdirs@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ SUBDIRS = . utils Srv all: all-recursive .SUFFIXES: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign tests/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign tests/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs # This directory's subdirectories are mostly independent; you can cd # into them and run 'make' without going through this Makefile. # To change the values of 'make' variables: instead of editing Makefiles, # (1) if the variable is set in 'config.status', edit 'config.status' # (which will cause the Makefiles to be regenerated when you run 'make'); # (2) otherwise, pass the desired values on the 'make' command line. $(am__recursive_targets): @fail=; \ if $(am__make_keepgoing); then \ failcom='fail=yes'; \ else \ failcom='exit 1'; \ fi; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-recursive TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ empty_fix=.; \ else \ include_option=--include; \ empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-recursive CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-recursive cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ $(am__make_dryrun) \ || test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ $(am__relativize); \ new_distdir=$$reldir; \ dir1=$$subdir; dir2="$(top_distdir)"; \ $(am__relativize); \ new_top_distdir=$$reldir; \ echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ ($(am__cd) $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$new_top_distdir" \ distdir="$$new_distdir" \ am__remove_distdir=: \ am__skip_length_check=: \ am__skip_mode_fix=: \ distdir) \ || exit 1; \ fi; \ done check-am: all-am check: check-recursive all-am: Makefile installdirs: installdirs-recursive installdirs-am: install: install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-recursive clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-recursive -rm -f Makefile distclean-am: clean-am distclean-generic distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive html-am: info: info-recursive info-am: install-data-am: install-dvi: install-dvi-recursive install-dvi-am: install-exec-am: install-html: install-html-recursive install-html-am: install-info: install-info-recursive install-info-am: install-man: install-pdf: install-pdf-recursive install-pdf-am: install-ps: install-ps-recursive install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-recursive -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: .MAKE: $(am__recursive_targets) install-am install-strip .PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am check \ check-am clean clean-generic clean-libtool cscopelist-am ctags \ ctags-am distclean distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ installdirs-am maintainer-clean maintainer-clean-generic \ mostlyclean mostlyclean-generic mostlyclean-libtool pdf pdf-am \ ps ps-am tags tags-am uninstall uninstall-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: dibbler-1.0.1/tests/testCase06/0000755000175000017500000000000012277734640013214 500000000000000dibbler-1.0.1/tests/testCase06/INFO0000664000175000017500000000015512233256142013601 00000000000000Server : 0.1.1, WindowsXP Client : 0.1.1, WindowsXP Report by: Josep Sole, France Telecom R&D Details : dibbler-1.0.1/tests/testCase06/server.conf0000664000175000017500000000012312233256142015273 00000000000000iface 4 { class { pool 3ffe:1111::1-3ffe:1111::30 RapidCommit 1 } } dibbler-1.0.1/tests/testCase06/client.conf0000664000175000017500000000010012233256142015236 00000000000000iface 4 { dns-servers :: ia 3 { address { } } } dibbler-1.0.1/tests/testCase08/0000755000175000017500000000000012277734640013216 500000000000000dibbler-1.0.1/tests/testCase08/INFO0000664000175000017500000000012212233256142013575 00000000000000Client : 0.1.1, WindowsXP Server : 0.1.1, Linux Report by: Thomson Details : dibbler-1.0.1/tests/testCase08/server.conf0000664000175000017500000000007012233256142015276 00000000000000iface 'eth0' { class { pool fe80::220:edff:fe2b:3b48 } }dibbler-1.0.1/ClntIfaceMgr/0000775000175000017500000000000012561700421012413 500000000000000dibbler-1.0.1/ClntIfaceMgr/ClntIfaceMgr.cpp0000644000175000017500000005700012556514271015347 00000000000000/* * Dibbler - a portable DHCPv6 * * authors: Tomasz Mrugalski * Marek Senderski * changes: Michal Kowalczuk * * released under GNU GPL v2 only licence * */ #include #include #include #include "Portable.h" #include "SmartPtr.h" #include "ClntIfaceMgr.h" #include "ClntTransMgr.h" #include "ClntMsgReply.h" #include "ClntMsgRenew.h" #include "ClntMsgAdvertise.h" #include "ClntMsgReconfigure.h" #include "Logger.h" #ifndef MOD_CLNT_DISABLE_DNSUPDATE #include "DNSUpdate.h" #endif using namespace std; TClntIfaceMgr * TClntIfaceMgr::Instance = 0; void TClntIfaceMgr::instanceCreate(const std::string& xmlFile) { if (Instance) { Log(Crit) << "Application error: Attempt to create another ClntIfaceMgr instance!" << LogEnd; return; } Instance = new TClntIfaceMgr(xmlFile); } TClntIfaceMgr& TClntIfaceMgr::instance() { if (!Instance) { Log(Crit) << "Requested IfaceMgr, but it is not created yet." << LogEnd; instanceCreate(CLNTIFACEMGR_FILE); } return *Instance; } bool TClntIfaceMgr::sendUnicast(int iface, char *msg, int size, SPtr addr) { int result; // get interface SPtr Iface; Iface = this->getIfaceByID(iface); if (!Iface) { Log(Error) << " No such interface (id=" << iface << "). Send failed." << LogEnd; return false; } // are there any sockets on this interface? SPtr sock; if (! Iface->countSocket() ) { Log(Error) << "Interface " << Iface->getName() << " has no open sockets." << LogEnd; return false; } // yes, there are. Get first of them (there's usually only one anyway. // Additional socket is created for unicast communication Iface->firstSocket(); sock = Iface->getSocket(); result = sock->send( (char*)msg, size, addr, DHCPSERVER_PORT); if (result == -1) { Log(Error) << "Send failed: " << size << " bytes to " << *addr << " on " << Iface->getFullName() << "(socket " << sock->getFD() << ")." << LogEnd; return false; } return true; } bool TClntIfaceMgr::sendMulticast(int iface, char * msg, int msgsize) { // prepare address char addr[16]; inet_pton6(ALL_DHCP_RELAY_AGENTS_AND_SERVERS,addr); SPtr multicastAddr = new TIPv6Addr(ALL_DHCP_RELAY_AGENTS_AND_SERVERS,true); return this->sendUnicast(iface, msg, msgsize, multicastAddr); } SPtr TClntIfaceMgr::select(unsigned int timeout) { int bufsize=4096; static char buf[4096]; SPtr peer(new TIPv6Addr()); SPtr myaddr(new TIPv6Addr()); int sockid; sockid = TIfaceMgr::select(timeout, buf, bufsize, peer, myaddr); if (sockid>0) { if (bufsize<4) { if (bufsize == 1 && buf[0] == CONTROL_MSG) { Log(Debug) << "Control message received." << LogEnd; return SPtr(); // NULL } Log(Warning) << "Received message is too short (" << bufsize << ") bytes, at least 4 bytes are required.." << LogEnd; return SPtr(); // NULL } int msgtype = buf[0]; SPtr ptr; SPtr ptrIface; ptrIface = this->getIfaceBySocket(sockid); int ifaceid = ptrIface->getID(); Log(Debug) << "Received " << bufsize << " bytes on interface " << ptrIface->getFullName() << " (socket=" << sockid << ", addr=" << *peer << ")." << LogEnd; switch (msgtype) { case ADVERTISE_MSG: ptr = new TClntMsgAdvertise(ifaceid, peer, buf, bufsize); break; case REPLY_MSG: ptr = new TClntMsgReply(ifaceid, peer, buf, bufsize); break; case RECONFIGURE_MSG: ptr = new TClntMsgReconfigure(ifaceid, peer, buf, bufsize); break; case SOLICIT_MSG: case REQUEST_MSG: case CONFIRM_MSG: case RENEW_MSG: case REBIND_MSG: case RELEASE_MSG: case DECLINE_MSG: case INFORMATION_REQUEST_MSG: case RELAY_FORW_MSG: case RELAY_REPL_MSG: default: Log(Warning) << "Message type " << msgtype << " is not supposed to " << "be received by client. Check your relay/server configuration." << LogEnd; return SPtr(); // NULL } #ifndef MOD_DISABLE_AUTH if (ClntCfgMgr().getAuthProtocol() == AUTH_PROTO_RECONFIGURE_KEY) { ptr->getReconfKeyFromAddrMgr(); } if (!ptr->validateAuthInfo(buf, bufsize, ClntCfgMgr().getAuthProtocol(), ClntCfgMgr().getAuthAcceptMethods())) { /// @todo Implement AUTH_DROP_UNAUTH_ on client-side Log(Warning) << "Message dropped, authentication validation failed." << LogEnd; return SPtr(); // NULL } #endif return ptr; } else { return SPtr(); // NULL } } TClntIfaceMgr::TClntIfaceMgr(const std::string& xmlFile) : TIfaceMgr(xmlFile, false) { struct iface * ptr; struct iface * ifaceList; this->XmlFile = xmlFile; // get interface list ifaceList = if_list_get(); // external (C coded) function ptr = ifaceList; if (!ifaceList) { IsDone = true; Log(Crit) << "Unable to read info interfaces. Make sure " << "you are using proper port (i.e. win32 on WindowsXP or 2003)" << " and you have IPv6 support enabled." << LogEnd; return; } while (ptr!=NULL) { Log(Notice) << "Detected iface " << ptr->name << "/" << ptr->id // << ", flags=" << ptr->flags << ", MAC=" << this->printMac(ptr->mac, ptr->maclen) << "." << LogEnd; SPtr iface = new TClntIfaceIface(ptr->name,ptr->id, ptr->flags, ptr->mac, ptr->maclen, ptr->linkaddr, ptr->linkaddrcount, ptr->globaladdr, ptr->globaladdrcount, ptr->hardwareType); iface->setMBit(ptr->m_bit); iface->setOBit(ptr->o_bit); this->IfaceLst.append(iface); ptr = ptr->next; } if_list_release(ifaceList); // allocated in pure C, and so release it there dump(); } TClntIfaceMgr::~TClntIfaceMgr() { IfaceLst.clear(); Log(Debug) << "ClntIfaceMgr cleanup." << LogEnd; } void TClntIfaceMgr::removeAllOpts() { SPtr iface; SPtr clntIface; this->firstIface(); while (iface = this->getIface()) { clntIface = (Ptr*) iface; clntIface->removeAllOpts(); } } unsigned int TClntIfaceMgr::getTimeout() { unsigned int min=DHCPV6_INFINITY, tmp; SPtr iface; SPtr clntIface; this->firstIface(); while (iface = this->getIface()) { clntIface = (Ptr*) iface; tmp = clntIface->getTimeout(); if (min > tmp) min = tmp; } return min; } bool TClntIfaceMgr::doDuties() { SPtr iface; SPtr cfgIface; this->firstIface(); while (iface = (Ptr*)this->getIface()) { cfgIface = ClntCfgMgr().getIface(iface->getID()); if (cfgIface) { // Log(Debug) << "FQDN State: " << cfgIface->getFQDNState() << " on " << iface->getFullName() << LogEnd; if (cfgIface->getFQDNState() == STATE_INPROCESS) { // Here we check if all parameters are set, and do the DNS update if possible List(TIPv6Addr) DNSSrvLst = iface->getDNSServerLst(); string fqdn = iface->getFQDN(); if (ClntAddrMgr().countIA() > 0 && DNSSrvLst.count() > 0 && fqdn.size() > 0) { Log(Warning) << "Sleeping 3 seconds before performing DNS Update." << LogEnd; /** @todo: sleep cannot be performed here. What if client has to perform other action during those 3 seconds? */ #ifdef WIN32 Sleep(3); #else sleep(3); #endif this->fqdnAdd(iface, fqdn); } } } } ClntAddrMgr().dump(); this->dump(); return true; } bool TClntIfaceMgr::fqdnAdd(SPtr iface, const std::string& fqdn) { SPtr DNSAddr; SPtr addr; SPtr cfgIface; cfgIface = ClntCfgMgr().getIface(iface->getID()); if (!cfgIface) { Log(Error) << "Unable to find interface with ifindex=" << iface->getID() << "." << LogEnd; return false; } // For the moment, we just take the first DNS entry. List(TIPv6Addr) DNSSrvLst = iface->getDNSServerLst(); if (!DNSSrvLst.count()) { Log(Error) << "Unable to find DNS Server. FQDN add failed." << LogEnd; return false; } DNSSrvLst.first(); DNSAddr = DNSSrvLst.get(); // And the first IP address SPtr ptrAddrIA; ClntAddrMgr().firstIA(); ptrAddrIA = ClntAddrMgr().getIA(); if (ptrAddrIA->countAddr() > 0) { ptrAddrIA->firstAddr(); addr = ptrAddrIA->getAddr()->get(); Log(Notice) << "FQDN: About to perform DNS Update: DNS server=" << *DNSAddr << ", IP=" << *addr << " and FQDN=" << fqdn << LogEnd; // remember DNS Address (used during address release) ptrAddrIA->setFQDNDnsServer(DNSAddr); #ifndef MOD_CLNT_DISABLE_DNSUPDATE TCfgMgr::DNSUpdateProtocol proto = ClntCfgMgr().getDDNSProtocol(); DNSUpdate::DnsUpdateProtocol proto2 = DNSUpdate::DNSUPDATE_TCP; if (proto == TCfgMgr::DNSUPDATE_UDP) proto2 = DNSUpdate::DNSUPDATE_UDP; if (proto == TCfgMgr::DNSUPDATE_ANY) proto2 = DNSUpdate::DNSUPDATE_ANY; unsigned int timeout = ClntCfgMgr().getDDNSTimeout(); /* add AAAA record */ DNSUpdate *act = new DNSUpdate(DNSAddr->getPlain(), "", fqdn, addr->getPlain(), DNSUPDATE_AAAA, proto2); int result = act->run(timeout); act->showResult(result); delete act; #else Log(Error) << "This version is compiled without DNS Update support." << LogEnd; return false; #endif } return true; } bool TClntIfaceMgr::fqdnDel(SPtr iface, SPtr ia, const std::string& fqdn) { SPtr dns = ia->getFQDNDnsServer(); // let's do deleting update SPtr clntAddr; ia->firstAddr(); SPtr tmpAddr = ia->getAddr(); if (!tmpAddr) { Log(Error) << "FQDN: Unable to delete FQDN: IA (IAID=" << ia->getIAID() << ") does not have any addresses." << LogEnd; return false; } SPtr myAddr = tmpAddr->get(); SPtr ptrIface = ClntCfgMgr().getIface(iface->getID()); #ifndef MOD_CLNT_DISABLE_DNSUPDATE TCfgMgr::DNSUpdateProtocol proto = ClntCfgMgr().getDDNSProtocol(); DNSUpdate::DnsUpdateProtocol proto2 = DNSUpdate::DNSUPDATE_TCP; if (proto == TCfgMgr::DNSUPDATE_UDP) proto2 = DNSUpdate::DNSUPDATE_UDP; if (proto == TCfgMgr::DNSUPDATE_ANY) proto2 = DNSUpdate::DNSUPDATE_ANY; unsigned int timeout = ClntCfgMgr().getDDNSTimeout(); Log(Debug) << "FQDN: Cleaning up DNS AAAA record in server " << *dns << ", for IP=" << *myAddr << " and FQDN=" << fqdn << LogEnd; DNSUpdate *act = new DNSUpdate(dns->getPlain(), "", fqdn, myAddr->getPlain(), DNSUPDATE_AAAA_CLEANUP, proto2); int result = act->run(timeout); act->showResult(result); delete act; #else Log(Error) << "This Dibbler version is compiled without DNS Update support." << LogEnd; #endif return false; } void TClntIfaceMgr::dump() { std::ofstream xmlDump; xmlDump.open( this->XmlFile.c_str() ); xmlDump << *this; xmlDump.close(); } /** * @brief configures prefix in the operating system * * configures specified prefix in the operating system * * @param iface interface index * @param prefix prefix to be configured * @param prefixLen prefix length * @param pref prefered lifetime * @param valid valid lifetime * * @return true if operation was successful, false otherwise */ bool TClntIfaceMgr::addPrefix(int iface, SPtr prefix, int prefixLen, unsigned int pref, unsigned int valid, TNotifyScriptParams* params /*= NULL*/) { return modifyPrefix(iface, prefix, prefixLen, pref, valid, PREFIX_MODIFY_ADD, params); } bool TClntIfaceMgr::updatePrefix(int iface, SPtr prefix, int prefixLen, unsigned int pref, unsigned int valid, TNotifyScriptParams* params /*= NULL*/) { return modifyPrefix(iface, prefix, prefixLen, pref, valid, PREFIX_MODIFY_UPDATE, params); } /** * deletes prefix from the operating system * * @param iface * @param prefix * @param prefixLen * * @return true if operation was successful, false otherwise */ bool TClntIfaceMgr::delPrefix(int iface, SPtr prefix, int prefixLen, TNotifyScriptParams* params /*= NULL*/) { return modifyPrefix(iface, prefix, prefixLen, 0, 0, PREFIX_MODIFY_DEL, params); } bool TClntIfaceMgr::modifyPrefix(int iface, SPtr prefix, int prefixLen, unsigned int pref, unsigned int valid, PrefixModifyMode mode, TNotifyScriptParams* params /*= NULL*/) { SPtr ptrIface = (Ptr*)getIfaceByID(iface); if (!ptrIface) { Log(Error) << "Unable to find interface with ifindex=" << iface << ", prefix add/modify operation failed." << LogEnd; return false; } string action; int conf = 0; // number of successfully configured prefixes int status = -1; switch (mode) { case PREFIX_MODIFY_ADD: action = "Adding"; break; case PREFIX_MODIFY_UPDATE: action = "Updating"; break; case PREFIX_MODIFY_DEL: action = "Deleting"; break; } // option: split this prefix and add it to all interfaces Log(Notice) << "PD: " << action << " prefix " << prefix->getPlain() << "/" << (int)prefixLen << " to all interfaces (prefix will be split to /" << int(prefixLen+8) << " prefixes if necessary)." << LogEnd; if (prefixLen>120) { Log(Error) << "PD: Unable to perform prefix operation: prefix /" << prefixLen << " can't be split. At least /120 prefix is required." << LogEnd; return false; } // get a list of interfaces that we will assign prefixes to TIfaceIfaceLst ifaceLst; vector ifaceNames = ClntCfgMgr().getDownlinkPrefixIfaces(); // skip PD split, because it was administratively disabled // (i.e. user specified downlink-prefix-ifaces none bool skip = false; if (ifaceNames.size() == 1 && (ifaceNames[0] == "none")) { skip = true; } for (vector::const_iterator name = ifaceNames.begin(); name != ifaceNames.end(); ++name) { if (*name == "none") { break; } SPtr x = getIfaceByName(*name); if (x) ifaceLst.push_back(x); else Log(Warning) << "Interface " << *name << " specified in downlink-prefix-ifaces is missing." << LogEnd; } if (!skip && (ifaceLst.empty()) ) { SPtr x; firstIface(); while ( x = (Ptr*)getIface() ) { if (x->getID() == ptrIface->getID()) { Log(Debug) << "PD: Interface " << x->getFullName() << " is the interface, where prefix has been obtained, skipping." << LogEnd; continue; } // for each interface present in the system... if (!x->flagUp()) { Log(Debug) << "PD: Interface " << x->getFullName() << " is down, ignoring." << LogEnd; continue; } if (!x->flagRunning()) { Log(Debug) << "PD: Interface " << x->getFullName() << " has flag RUNNING not set, ignoring." << LogEnd; continue; } if (!x->flagMulticast()) { Log(Debug) << "PD: Interface " << x->getFullName() << " is not multicast capable, ignoring." << LogEnd; continue; } if ( !(x->getMacLen() > 5) ) { Log(Debug) << "PD: Interface " << x->getFullName() << " has MAC address length " << x->getMacLen() << " (6 or more required), ignoring." << LogEnd; continue; } x->firstLLAddress(); if (!x->getLLAddress()) { Log(Debug) << "PD: Interface " << x->getFullName() << " has no link-local address, ignoring. (Disconnected? Not associated? No-link?)" << LogEnd; continue; } Log(Debug) << "PD: Interface " << x->getFullName() << " is suitable for PD." << LogEnd; ifaceLst.push_back(x); } } TIfaceIfaceLst::const_iterator i; string dl_ifaces; for (TIfaceIfaceLst::const_iterator i=ifaceLst.begin(); i!=ifaceLst.end(); ++i) { dl_ifaces += string((*i)->getName()) + " "; } if (skip) { dl_ifaces += string("[none]"); } Log(Info) << "PD: Using " << ifaceLst.size() << " suitable interface(s):" << dl_ifaces << LogEnd; // pass this info to the script as well if (params) { params->addParam("DOWNLINK_PREFIX_IFACES", dl_ifaces); } if (!skip && ifaceLst.empty()) { Log(Warning) << "Suitable interfaces not found. Delegated prefix not split." << LogEnd; return true; } stringstream prefix_split; // textual representation, used to pass as script for (TIfaceIfaceLst::const_iterator i=ifaceLst.begin(); i!=ifaceLst.end(); ++i) { char buf[16]; int subprefixLen; memmove(buf, prefix->getAddr(), 16); if (ifaceLst.size() == 1) { // just one interface - use delegated prefix as is subprefixLen = prefixLen; } else if (ifaceLst.size()<256) { subprefixLen = prefixLen + 8; int offset = prefixLen/8; if (prefixLen%8 == 0) { // that's easy, just put ID in the next octet buf[offset] = (*i)->getID(); } else { // here's fun uint16_t existing = readUint16(buf+offset); uint16_t bitmask = 0xff00; uint16_t infixmask = ((uint8_t)(*i)->getID()) << 8; bitmask = bitmask >> (prefixLen%8); infixmask = infixmask >> (prefixLen%8); // clear out if there is anything there, i.e. server assigned prefix // with garbage in host section existing = existing & (~bitmask); existing = existing | (bitmask & infixmask); writeUint16(buf+offset, existing); } } else { // users with too much time that play with virtual interfaces are out of luck Log(Error) << "Something is wrong. Detected more than 256 interface." << LogEnd; return false; } SPtr tmpAddr = new TIPv6Addr(buf, false); Log(Notice) << "PD: " << action << " prefix " << tmpAddr->getPlain() << "/" << subprefixLen << " on the " << (*i)->getFullName() << " interface." << LogEnd; if (params) { prefix_split << (*i)->getName() << " " << tmpAddr->getPlain() << "/" << subprefixLen << " "; } switch (mode) { case PREFIX_MODIFY_ADD: status = prefix_add( (*i)->getName(), (*i)->getID(), tmpAddr->getPlain(), subprefixLen, pref, valid); break; case PREFIX_MODIFY_UPDATE: status = prefix_update( (*i)->getName(), (*i)->getID(), tmpAddr->getPlain(), subprefixLen, pref, valid); break; case PREFIX_MODIFY_DEL: status = prefix_del( (*i)->getName(), (*i)->getID(), tmpAddr->getPlain(), subprefixLen); break; } if (status==LOWLEVEL_NO_ERROR) { conf++; } else { string tmp = error_message(); Log(Error) << "Prefix error encountered during " << action << " operation: " << tmp << LogEnd; } } if (params) { params->addParam("DOWNLINK_PREFIXES", prefix_split.str()); } // If at least one prefix configured successfully (or we were told to skip) // then it's a great success! if (conf || skip) { return true; } else { // We failed again... dammit. return false; } } void TClntIfaceMgr::redetectIfaces() { struct iface * ptr; struct iface * ifaceList; SPtr iface; ifaceList = if_list_get(); // external (C coded) function ptr = ifaceList; if (!ifaceList) { Log(Error) << "Unable to read interface info. Inactive mode failed." << LogEnd; return; } while (ptr!=NULL) { iface = getIfaceByID(ptr->id); if (!iface) { ptr = ptr->next; continue; } if ( (ptr->flags != iface->getFlags()) || (ptr->m_bit != iface->getMBit()) || (ptr->o_bit != iface->getOBit()) ) { Log(Notice) << "Flags on interface " << iface->getFullName() << " has changed (old=" << hex <getFlags() << ", new=" << ptr->flags << dec << ", M bit:" << (iface->getMBit()?"1":"0") << "->" << (ptr->m_bit?"1":"0") << ", O bit:" << (iface->getOBit()?"1":"0") << "->" << (ptr->o_bit?"1":"0") << ")." << LogEnd; iface->updateState(ptr); } ptr = ptr->next; } if_list_release(ifaceList); // allocated in pure C, and so release it there } #ifdef MOD_REMOTE_AUTOCONF bool TClntIfaceMgr::notifyRemoteScripts(SPtr rcvdAddr, SPtr srvAddr, int ifindex) { Log(Info) << "Received address " << rcvdAddr->getPlain() << " from remote server located at " << srvAddr->getPlain() << LogEnd; SPtr iface = getIfaceByID(ifindex); stringstream tmp; tmp << "./remote-autoconf " << rcvdAddr->getPlain() << " " << srvAddr->getPlain() << " " << iface->getName() << " " << iface->getID(); int returnCode = system(tmp.str().c_str()); Log(Info) << "Executed command: " << tmp.str() << ", return code=" << returnCode << LogEnd; return true; } #endif ostream & operator <<(ostream & strum, TClntIfaceMgr &x) { strum << "" << std::endl; SPtr ptr; x.IfaceLst.first(); while ( ptr= (Ptr*) x.IfaceLst.get() ) { strum << *ptr; } strum << "" << std::endl; return strum; } dibbler-1.0.1/ClntIfaceMgr/Makefile.am0000664000175000017500000000121212233256142014365 00000000000000noinst_LIBRARIES = libClntIfaceMgr.a libClntIfaceMgr_a_CPPFLAGS = -I$(top_srcdir)/Misc -I$(top_srcdir)/IfaceMgr libClntIfaceMgr_a_CPPFLAGS += -I$(top_srcdir)/ClntCfgMgr -I$(top_srcdir)/CfgMgr libClntIfaceMgr_a_CPPFLAGS += -I$(top_srcdir)/Options -I$(top_srcdir)/ClntOptions libClntIfaceMgr_a_CPPFLAGS += -I$(top_srcdir)/AddrMgr -I$(top_srcdir)/ClntAddrMgr -I$(top_srcdir)/ClntTransMgr libClntIfaceMgr_a_CPPFLAGS += -I$(top_srcdir)/ClntMessages -I$(top_srcdir)/Messages libClntIfaceMgr_a_CPPFLAGS += -I$(top_srcdir)/poslib/poslib -I$(top_srcdir)/poslib libClntIfaceMgr_a_SOURCES = ClntIfaceIface.cpp ClntIfaceIface.h ClntIfaceMgr.cpp ClntIfaceMgr.h dibbler-1.0.1/ClntIfaceMgr/ClntIfaceMgr.h0000644000175000017500000000477612277722750015033 00000000000000/* * Dibbler - a portable DHCPv6 * * authors: Tomasz Mrugalski * Marek Senderski * * released under GNU GPL v2 only licence * */ #include class TClntIfaceMgr; class TClntMsg; class TClntIfaceIface; #ifndef CLNTIFACEMGR_H #define CLNTIFACEMGR_H #include "SmartPtr.h" #include "IfaceMgr.h" #include "ClntCfgMgr.h" #include "ClntAddrMgr.h" #include "ClntTransMgr.h" #include "ClntIfaceIface.h" #include "IPv6Addr.h" #include "ClntMsg.h" #include "ScriptParams.h" #define ClntIfaceMgr() (TClntIfaceMgr::instance()) class TClntIfaceMgr : public TIfaceMgr { public: typedef enum { PREFIX_MODIFY_ADD, PREFIX_MODIFY_UPDATE, PREFIX_MODIFY_DEL } PrefixModifyMode; private: TClntIfaceMgr(const std::string& xmlFile); // this is singleton public: static void instanceCreate(const std::string& xmlFile); static TClntIfaceMgr& instance(); ~TClntIfaceMgr(); friend std::ostream & operator <<(std::ostream & strum, TClntIfaceMgr &x); void dump(); bool sendUnicast(int iface, char *msg, int size, SPtr addr); bool sendMulticast(int iface, char *msg, int msgsize); SPtr select(unsigned int timeout); #ifdef MOD_REMOTE_AUTOCONF bool notifyRemoteScripts(SPtr receivedAddr, SPtr serverAddr, int ifindex); #endif bool fqdnAdd(SPtr iface, const std::string& domainname); bool fqdnDel(SPtr iface, SPtr ia, const std::string& domainname); bool addPrefix (int iface, SPtr prefix, int prefixLen, unsigned int pref, unsigned int valid, TNotifyScriptParams* params /*= NULL*/); bool updatePrefix(int iface, SPtr prefix, int prefixLen, unsigned int pref, unsigned int valid, TNotifyScriptParams* params /*= NULL*/); bool delPrefix (int iface, SPtr prefix, int prefixLen, TNotifyScriptParams* params /*= NULL*/); // --- option related --- void removeAllOpts(); unsigned int getTimeout(); bool doDuties(); void redetectIfaces(); private: bool modifyPrefix(int iface, SPtr prefix, int prefixLen, unsigned int pref, unsigned int valid, PrefixModifyMode mode, TNotifyScriptParams* params /*= NULL*/); std::string XmlFile; static TClntIfaceMgr* Instance; }; #endif dibbler-1.0.1/ClntIfaceMgr/ClntIfaceIface.cpp0000664000175000017500000007167512556514227015652 00000000000000/* * Dibbler - a portable DHCPv6 * * authors: Tomasz Mrugalski * Marek Senderski * * released under GNU GPL v2 only licence * */ #include #include #include "ClntIfaceIface.h" #include "Portable.h" #include "Logger.h" #include "DHCPDefaults.h" #ifdef MINGWBUILD #include #endif using namespace std; /* * stores informations about interface */ TClntIfaceIface::TClntIfaceIface(char * name, int id, unsigned int flags, char* mac, int maclen, char* llAddr, int llAddrCnt, char * globalAddr, int globalAddrCnt, int hwType) :TIfaceIface(name, id, flags, mac, maclen, llAddr, llAddrCnt, globalAddr, globalAddrCnt, hwType), TunnelEndpoint(), LifetimeTimeout(DHCPV6_INFINITY) { LifetimeTimestamp = (uint32_t)time(NULL); this->DNSServerLst.clear(); this->DomainLst.clear(); this->NTPServerLst.clear(); this->Timezone = ""; DnsConfigured = ! FLUSH_OTHER_CONFIGURED_DNS_SERVERS; unlink(OPTION_DNS_SERVERS_FILENAME); unlink(OPTION_DOMAINS_FILENAME); unlink(OPTION_NTP_SERVERS_FILENAME); unlink(OPTION_TIMEZONE_FILENAME); unlink(OPTION_SIP_SERVERS_FILENAME); unlink(OPTION_SIP_DOMAINS_FILENAME); unlink(OPTION_NIS_SERVERS_FILENAME); unlink(OPTION_NIS_DOMAIN_FILENAME); unlink(OPTION_NISP_SERVERS_FILENAME); unlink(OPTION_NISP_DOMAIN_FILENAME); setPrefixLength(CLIENT_DEFAULT_PREFIX_LENGTH); } /* * this method returns timeout to nearest option renewal */ unsigned int TClntIfaceIface::getTimeout() { if (this->LifetimeTimeout == DHCPV6_INFINITY) return DHCPV6_INFINITY; unsigned int current = (uint32_t)time(NULL); if (current > this->LifetimeTimestamp+this->LifetimeTimeout) return 0; return this->LifetimeTimestamp+this->LifetimeTimeout-current; } bool TClntIfaceIface::setDNSServerLst(SPtr duid, SPtr srv, List(TIPv6Addr) addrs) { #ifdef WIN32 //remove all dns records before the first configuration if (!DnsConfigured) { Log(Notice) << "Removing all DNS servers on interface " << getFullName() << " (not configured yet)." << LogEnd; dns_del(this->getName(), this->getID(), NULL); DnsConfigured = true; } #endif // remove old addresses SPtr old, addr; this->DNSServerLst.first(); while (old = this->DNSServerLst.get()) { // for each already set server... addrs.first(); bool found = false; while (addr = addrs.get()) { // ... check if it's on the new list if ( *addr == *old ) { found = true; break; } } if (!found) { // it's not on the new list, so remove it Log(Notice) << "Removing DNS server " << *old << " on interface " << this->getName() << "/" << this->getID() << " (no longer valid)." << LogEnd; dns_del(this->getName(), this->getID(), old->getPlain()); this->delString(OPTION_DNS_SERVERS_FILENAME,old->getPlain()); this->DNSServerLst.del(); } } // add new addresses addrs.first(); while (addr = addrs.get()) { this->DNSServerLst.first(); bool found = false; while (old = this->DNSServerLst.get()) { if ( *addr == *old ) { found = true; break; } } if (found) { // this address is already set Log(Info) << "DNS server " << *addr << " is already set on interface " << this->getName() << "/" << this->getID() << ", no change is needed." << LogEnd; } else { // it's new address,set it! Log(Notice) << "Setting up DNS server " << * addr << " on interface " << this->getName() << "/" << this->getID() << "." << LogEnd; dns_add(this->getName(), this->getID(), addr->getPlain()); this->addString(OPTION_DNS_SERVERS_FILENAME,addr->getPlain()); this->DNSServerLst.append(addr); } } return true; } bool TClntIfaceIface::setDomainLst(SPtr duid, SPtr srv, List(std::string) domains) { // remove old domains SPtr old, domain; this->DomainLst.first(); while (old = this->DomainLst.get()) { // for each already domain ... domains.first(); bool found = false; while (domain = domains.get()) { // ... check if it's on the new list if ( *domain == *old ) { found = true; break; } } if (!found) { // it's not on the new list, so remove it Log(Notice) << "Removing domain " << *old << " from interface " << this->getName() << "/" << this->getID() << " (no longer valid)." << LogEnd; domain_del(this->getName(), this->getID(), old->c_str()); this->delString(OPTION_DOMAINS_FILENAME,old->c_str()); this->DomainLst.del(); } } // add new domains domains.first(); while (domain = domains.get()) { this->DomainLst.first(); bool found = false; while (old = this->DomainLst.get()) { if ( *domain == *old ) { found = true; break; } } if (found) { // this domain is already set Log(Info) << "Domain " << *domain << " is already set on interface " << this->getName() << "/" << this->getID() << ", no change is needed." << LogEnd; } else { // it's new domain, set it! Log(Notice) << "Setting up Domain " << * domain << " on interface " << this->getName() << "/" << this->getID() << "." << LogEnd; domain_add(this->getName(), this->getID(), domain->c_str()); this->addString(OPTION_DOMAINS_FILENAME,domain->c_str()); this->DomainLst.append(domain); } } return true; } bool TClntIfaceIface::setNTPServerLst(SPtr duid, SPtr srv, List(TIPv6Addr) addrs) { // remove old addresses SPtr old, addr; this->NTPServerLst.first(); while (old = this->NTPServerLst.get()) { // for each already set server... addrs.first(); bool found = false; while (addr = addrs.get()) { // ... check if it's on the new list if ( *addr == *old ) { found = true; break; } } if (!found) { // it's not on the new list, so remove it Log(Notice) << "Removing NTP server " << *old << " on interface " << this->getName() << "/" << this->getID() << " (no longer valid)." << LogEnd; ntp_del(this->getName(), this->getID(), old->getPlain()); this->delString(OPTION_NTP_SERVERS_FILENAME,old->getPlain()); this->NTPServerLst.del(); } } // add new addresses addrs.first(); while (addr = addrs.get()) { this->NTPServerLst.first(); bool found = false; while (old = this->NTPServerLst.get()) { if ( *addr == *old ) { found = true; break; } } if (found) { // this address is already set Log(Info) << "NTP server " << *addr << " is already set on the interface " << this->getName() << "/" << this->getID() << ", no change is needed." << LogEnd; } else { // it's new address,set it! Log(Notice) << "Setting up NTP server " << * addr << " on the interface " << this->getName() << "/" << this->getID() << "." << LogEnd; ntp_add(this->getName(), this->getID(), addr->getPlain()); this->addString(OPTION_NTP_SERVERS_FILENAME,addr->getPlain()); this->NTPServerLst.append(addr); } } return true; } bool TClntIfaceIface::setTimezone(SPtr duid, SPtr srv, const std::string& timezone) { if (timezone==this->Timezone) { // timezone has not changed Log(Info) << "Timezone " << timezone << " is already set on the interface " << this->getName() << "/" << this->getID() << ", no change is needed." << LogEnd; return true; } this->Timezone = timezone; Log(Notice) << "Setting up timezone " << timezone << " (obtained on the interface " << this->getName() << "/" << this->getID() << ")." << LogEnd; timezone_set(this->getName(), this->getID(), timezone.c_str()); this->setString(OPTION_TIMEZONE_FILENAME,timezone.c_str()); return true; } bool TClntIfaceIface::setSIPServerLst(SPtr duid, SPtr srv, List(TIPv6Addr) addrs) { // remove old addresses SPtr old, addr; this->SIPServerLst.first(); while (old = this->SIPServerLst.get()) { // for each already set server... addrs.first(); bool found = false; while (addr = addrs.get()) { // ... check if it's on the new list if ( *addr == *old ) { found = true; break; } } if (!found) { // it's not on the new list, so remove it Log(Notice) << "Removing SIP server " << *old << " on interface " << this->getName() << "/" << this->getID() << " (no longer valid)." << LogEnd; sipserver_del(this->getName(), this->getID(), old->getPlain()); this->delString(OPTION_SIP_SERVERS_FILENAME,old->getPlain()); this->SIPServerLst.del(); } } // add new addresses addrs.first(); while (addr = addrs.get()) { this->SIPServerLst.first(); bool found = false; while (old = this->SIPServerLst.get()) { if ( *addr == *old ) { found = true; break; } } if (found) { // this address is already set Log(Info) << "SIP server " << *addr << " is already set on interface " << this->getName() << "/" << this->getID() << ", no change is needed." << LogEnd; } else { // it's new address,set it! Log(Notice) << "Setting up SIP server " << * addr << " on interface " << this->getName() << "/" << this->getID() << "." << LogEnd; sipserver_add(this->getName(), this->getID(), addr->getPlain()); this->addString(OPTION_SIP_SERVERS_FILENAME,addr->getPlain()); this->SIPServerLst.append(addr); } } return true; } bool TClntIfaceIface::setSIPDomainLst(SPtr duid, SPtr srv, List(std::string) domains) { // remove old domains SPtr old, domain; this->SIPDomainLst.first(); while (old = this->SIPDomainLst.get()) { // for each already domain ... domains.first(); bool found = false; while (domain = domains.get()) { // ... check if it's on the new list if ( *domain == *old ) { found = true; break; } } if (!found) { // it's not on the new list, so remove it Log(Notice) << "Removing SIP domain " << *old << " from interface " << this->getName() << "/" << this->getID() << " (no longer valid)." << LogEnd; sipdomain_del(this->getName(), this->getID(), old->c_str()); this->delString(OPTION_SIP_DOMAINS_FILENAME,old->c_str()); this->SIPDomainLst.del(); } } // add new domains domains.first(); while (domain = domains.get()) { this->SIPDomainLst.first(); bool found = false; while (old = this->SIPDomainLst.get()) { if ( *domain == *old ) { found = true; break; } } if (found) { // this domain is already set Log(Info) << "SIP domain " << *domain << " is already set on interface " << this->getName() << "/" << this->getID() << ", no change is needed." << LogEnd; } else { // it's new domain, set it! Log(Notice) << "Setting up SIP domain " << * domain << " on interface " << this->getName() << "/" << this->getID() << "." << LogEnd; sipdomain_add(this->getName(), this->getID(), domain->c_str()); this->addString( OPTION_SIP_DOMAINS_FILENAME, domain->c_str() ); this->SIPDomainLst.append(domain); } } return true; } bool TClntIfaceIface::setFQDN(SPtr duid, SPtr srv, const std::string& fqdn) { FQDN = fqdn; return true; } bool TClntIfaceIface::setNISServerLst(SPtr duid, SPtr srv, List(TIPv6Addr) addrs) { // remove old addresses SPtr old, addr; this->NISServerLst.first(); while (old = this->NISServerLst.get()) { // for each already set server... addrs.first(); bool found = false; while (addr = addrs.get()) { // ... check if it's on the new list if ( *addr == *old ) { found = true; break; } } if (!found) { // it's not on the new list, so remove it Log(Notice) << "Removing NIS server " << *old << " on interface " << this->getName() << "/" << this->getID() << " (no longer valid)." << LogEnd; nisserver_del(this->getName(), this->getID(), old->getPlain()); this->delString(OPTION_NIS_SERVERS_FILENAME,old->getPlain()); this->NISServerLst.del(); } } // add new addresses addrs.first(); while (addr = addrs.get()) { this->NISServerLst.first(); bool found = false; while (old = this->NISServerLst.get()) { if ( *addr == *old ) { found = true; break; } } if (found) { // this address is already set Log(Info) << "NIS server " << *addr << " is already set on interface " << this->getName() << "/" << this->getID() << ", no change is needed." << LogEnd; } else { // it's new address,set it! Log(Notice) << "Setting up NIS server " << * addr << " on interface " << this->getName() << "/" << this->getID() << "." << LogEnd; nisserver_add(this->getName(), this->getID(), addr->getPlain()); this->addString(OPTION_NIS_SERVERS_FILENAME, addr->getPlain()); this->NISServerLst.append(addr); } } return true; } bool TClntIfaceIface::setNISDomain(SPtr duid, SPtr srv, const std::string& domain) { if (domain==this->NISDomain) { // NIS Domain has not changed Log(Info) << "NIS Domain " << timezone << " is already set on the interface " << this->getName() << "/" << this->getID() << ", no change is needed." << LogEnd; return true; } this->NISDomain = domain; Log(Notice) << "Setting up NIS domain " << domain << " on the interface " << this->getName() << "/" << this->getID() << "." << LogEnd; nisdomain_set(this->getName(), this->getID(), domain.c_str()); this->setString( OPTION_NIS_DOMAIN_FILENAME, domain.c_str() ); return true; } bool TClntIfaceIface::setNISPServerLst(SPtr duid, SPtr srv, List(TIPv6Addr) addrs) { // remove old addresses SPtr old, addr; this->NISPServerLst.first(); while (old = this->NISPServerLst.get()) { // for each already set server... addrs.first(); bool found = false; while (addr = addrs.get()) { // ... check if it's on the new list if ( *addr == *old ) { found = true; break; } } if (!found) { // it's not on the new list, so remove it Log(Notice) << "Removing NIS+ server " << *old << " on interface " << this->getName() << "/" << this->getID() << " (no longer valid)." << LogEnd; nisplusserver_del(this->getName(), this->getID(), old->getPlain()); this->delString(OPTION_NISP_SERVERS_FILENAME,old->getPlain()); this->NISPServerLst.del(); } } // add new addresses addrs.first(); while (addr = addrs.get()) { this->NISPServerLst.first(); bool found = false; while (old = this->NISPServerLst.get()) { if ( *addr == *old ) { found = true; break; } } if (found) { // this address is already set Log(Info) << "NIS+ server " << *addr << " is already set on interface " << this->getName() << "/" << this->getID() << ", no change is needed." << LogEnd; } else { // it's new address,set it! Log(Notice) << "Setting up NIS+ server " << * addr << " on interface " << this->getName() << "/" << this->getID() << "." << LogEnd; nisplusserver_add(this->getName(), this->getID(), addr->getPlain()); this->addString(OPTION_NISP_SERVERS_FILENAME,addr->getPlain()); this->NISPServerLst.append(addr); } } return true; } bool TClntIfaceIface::setNISPDomain(SPtr duid, SPtr srv, const std::string& domain) { if (domain==this->NISPDomain) { // NIS+ Domain has not changed Log(Info) << "NIS+ Domain " << timezone << " is already set on the interface " << this->getName() << "/" << this->getID() << ", no change is needed." << LogEnd; return true; } this->NISPDomain = domain; Log(Notice) << "Setting up NIS+ domain " << domain << " on the interface " << this->getName() << "/" << this->getID() << "." << LogEnd; nisplusdomain_set(this->getName(), this->getID(), domain.c_str()); this->setString(OPTION_NISP_DOMAIN_FILENAME, domain.c_str()); return true; } bool TClntIfaceIface::setLifetime(SPtr duid, SPtr srv, unsigned int life) { this->LifetimeTimeout = life; this->LifetimeTimestamp = (uint32_t)time(NULL); if (life == DHCPV6_INFINITY) { Log(Info) << "Granted options are parmanent (lifetime = INFINITY.)" << LogEnd; return true; } Log(Info) << "Next option renewal in " << life << " seconds ." << LogEnd; return true; } TClntIfaceIface::~TClntIfaceIface() { this->removeAllOpts(); } void TClntIfaceIface::addString(const char * filename, const char * str) { FILE * f; if ( !(f=fopen(filename,"a+"))) { Log(Debug) << "Unable to add [" << str << "] to the " << filename << " file." << LogEnd; return; } fprintf(f,"%s\n", str); fclose(f); } void TClntIfaceIface::delString(const char * filename, const char * str) { FILE *f, *fout; char buf[512]; unsigned int len = (unsigned int)strlen(str); bool found = false; string fileout(filename); fileout += "-old"; if ( !(f=fopen(filename,"r"))) { Log(Debug) << "Unable to open file " << filename <<" while trying to delete " << str << " line." << LogEnd; return; } if ( !(fout=fopen(fileout.c_str(),"w"))) { Log(Debug) << "Unable to create/overwrite file " << fileout << " while trying to delete " << str << " line." << LogEnd; fclose(f); return; } while (!feof(f)) { if (!fgets(buf,511,f)) { break; } if ( !found && (strlen(buf)==len) && !strncmp(str,buf,len) ) { found = true; } else { fprintf(fout,"%s",buf); } } fclose(f); // close original file fclose(fout); // file with specified string cut out unlink(filename); // delete old version rename(fileout.c_str(), filename); return; } void TClntIfaceIface::setString(const char * filename, const char * str) { FILE * f; if ( !(f=fopen(filename,"w"))) { Log(Debug) << "Unable to write [" << str << "] to the " << filename << " file." << LogEnd; return; } fprintf(f,"%s\n", str); fclose(f); } void TClntIfaceIface::removeAllOpts() { SPtr addr; SPtr str; // --- option: DNS-SERVER --- this->DNSServerLst.first(); while (addr = this->DNSServerLst.get()) { Log(Notice) << "DNS server " << *addr << " removed from the " << this->getName() << "/" << this->getID() <<" interface." << LogEnd; this->DNSServerLst.del(); dns_del(this->getName(), this->getID(), addr->getPlain()); } // --- option: DOMAIN --- this->DomainLst.first(); while (str = this->DomainLst.get()) { Log(Notice) << "Domain " << *str << " removed from the " << this->getName() << "/" << this->getID() <<" interface." << LogEnd; this->DomainLst.del(); domain_del( this->getName(), this->getID(), str->c_str() ); } // --- option: NTP-SERVER --- this->NTPServerLst.first(); while (addr = this->NTPServerLst.get()) { Log(Notice) << "NTP server " << *addr << " removed from the " << this->getName() << "/" << this->getID() <<" interface." << LogEnd; this->NTPServerLst.del(); ntp_del(this->getName(), this->getID(), addr->getPlain()); } // --- option: TIMEZONE --- if (this->Timezone.length()) { Log(Notice) << "Timezone " << this->Timezone << " unset on the interface " << this->getName() << "/" << this->getID() <<"." << LogEnd; this->Timezone = ""; timezone_del( this->getName(), this->getID(), this->Timezone.c_str() ); } // --- option: SIP-SERVER --- this->SIPServerLst.first(); while (addr = this->SIPServerLst.get()) { Log(Notice) << "SIP server " << *addr << " removed from the " << this->getName() << "/" << this->getID() <<" interface." << LogEnd; this->SIPServerLst.del(); sipserver_del(this->getName(), this->getID(), addr->getPlain()); } // --- option: SIP-DOMAIN --- this->SIPDomainLst.first(); while (str = this->SIPDomainLst.get()) { Log(Notice) << "SIP domain " << *str << " removed from the " << this->getName() << "/" << this->getID() << " interface." << LogEnd; this->SIPDomainLst.del(); sipdomain_del( this->getName(), this->getID(), str->c_str() ); } // --- option: NIS-SERVER --- this->NISServerLst.first(); while (addr = this->NISServerLst.get()) { Log(Notice) << "NIS server " << *addr << " removed from the " << this->getName() << "/" << this->getID() <<" interface." << LogEnd; this->NISServerLst.del(); nisserver_del(this->getName(), this->getID(), addr->getPlain()); } // --- option: NIS-DOMAIN --- if (this->NISDomain.length()) { Log(Notice) << "NIS Domain " << this->NISDomain << " unset on the " << this->getName() << "/" << this->getID() <<" interface." << LogEnd; nisdomain_del( this->getName(), this->getID(), this->NISDomain.c_str() ); } // --- option: NIS+-SERVER --- this->NISPServerLst.first(); while (addr = this->NISPServerLst.get()) { Log(Notice) << "NIS+ server " << *addr << " removed from the " << this->getName() << "/" << this->getID() <<" interface." << LogEnd; this->NISPServerLst.del(); nisplusserver_del(this->getName(), this->getID(), addr->getPlain()); } // --- option: NIS+-DOMAIN --- if (this->NISPDomain.length()) { Log(Notice) << "NIS+ domain " << this->NISDomain << " unset on the " << this->getName() << "/" << this->getID() <<" interface." << LogEnd; nisplusdomain_del( this->getName(), this->getID(), this->NISPDomain.c_str() ); } } string TClntIfaceIface::getFQDN() { return FQDN; } List(TIPv6Addr) TClntIfaceIface::getDNSServerLst() { return DNSServerLst; } SPtr TClntIfaceIface::getDsLiteTunnel() { return TunnelEndpoint; } // -------------------------------------------------------------------- // --- operators ------------------------------------------------------ // -------------------------------------------------------------------- /* * just prints important informations (debugging & logging) */ std::ostream & operator <<(std::ostream & strum, TClntIfaceIface &x) { char buf[48]; SPtr addr; SPtr str; strum << dec; strum << " " << endl; strum << " ":" no-multicast -->") << endl; strum << " " << endl; for (int i=0; i" << buf << "" << endl; } strum << " "; for (int i=0; i" << dec << endl; SPtr sock; x.firstSocket(); while (sock = x.getSocket() ) { strum << " " << *sock; } strum << " " << x.getPrefixLength() << "" << endl; strum << " " << endl; // --- option: DNS-SERVERS --- if (!x.DNSServerLst.count()) { strum << " " << endl; } x.DNSServerLst.first(); while (addr = x.DNSServerLst.get()) { strum << " " << *addr << "" << endl; } // --- option: DOMAINS --- if (!x.DomainLst.count()) { strum << " " << endl; } x.DomainLst.first(); while (str = x.DomainLst.get()) { strum << " " << *str << "" << endl; } // --- option: NTP-SERVERS --- if (!x.NTPServerLst.count()) { strum << " " << endl; } x.NTPServerLst.first(); while (addr = x.NTPServerLst.get()) { strum << " " << *addr << "" << endl; } // --- option: TIMEZONE --- if (!x.Timezone.length()) { strum << " " << endl; } else { strum << " " << x.Timezone << "" << endl; } // --- option: SIP-SERVERS --- if (!x.SIPServerLst.count()) { strum << " " << endl; } x.SIPServerLst.first(); while (addr = x.SIPServerLst.get()) { strum << " " << *addr << "" << endl; } // --- option: SIP-DOMAINS --- if (!x.SIPDomainLst.count()) { strum << " " << endl; } x.SIPDomainLst.first(); while (str = x.SIPDomainLst.get()) { strum << " " << *str << "" << endl; } // --- option: NIS-SERVERS --- if (!x.NISServerLst.count()) { strum << " " << endl; } x.NISServerLst.first(); while (addr = x.NISServerLst.get()) { strum << " " << *addr << "" << endl; } // --- option: NIS-DOMAIN --- if (!x.NISDomain.length()) { strum << " " << endl; } else { strum << " " << x.NISDomain << "" << endl; } // --- option: NIS+-SERVERS --- if (!x.NISPServerLst.count()) { strum << " " << endl; } x.NISPServerLst.first(); while (addr = x.NISPServerLst.get()) { strum << " " << *addr << "" << endl; } // --- option: NIS+-DOMAIN --- if (!x.NISPDomain.length()) { strum << " " << endl; } else { strum << " " << x.NISPDomain << "" << endl; } // --- option: LIFETIME --- if (x.LifetimeTimeout==DHCPV6_INFINITY) { strum << " " << endl; } else { strum << " " << endl; } strum << " " << endl; return strum; } dibbler-1.0.1/ClntIfaceMgr/ClntIfaceIface.h0000644000175000017500000000544512277722750015307 00000000000000/* * Dibbler - a portable DHCPv6 * * authors: Tomasz Mrugalski * Marek Senderski * * released under GNU GPL v2 only licence * */ #ifndef CLNTIFACEIFACE_H #define CLNTIFACEIFACE_H #include "Iface.h" #include "SmartPtr.h" #include "DUID.h" #include "ClntIfaceMgr.h" #include "OptFQDN.h" class TClntIfaceIface: public TIfaceIface { public: friend std::ostream & operator <<(std::ostream & strum, TClntIfaceIface &x); TClntIfaceIface(char * name, int id, unsigned int flags, char* mac, int maclen, char* llAddr, int llAddrCnt, char * globalAddr, int globalAddrCnt, int hwType); ~TClntIfaceIface(); bool setDNSServerLst(SPtr duid, SPtr srv, List(TIPv6Addr) addrs); bool setDomainLst(SPtr duid, SPtr srv, List(std::string) domains); bool setNTPServerLst(SPtr duid, SPtr srv, List(TIPv6Addr) addrs); bool setTimezone(SPtr duid, SPtr srv, const std::string& timezone); bool setSIPServerLst(SPtr duid, SPtr srv, List(TIPv6Addr) addrs); bool setSIPDomainLst(SPtr duid, SPtr srv, List(std::string) domains); bool setFQDN(SPtr duid, SPtr srv, const std::string& fqdn); bool setNISServerLst(SPtr duid, SPtr srv, List(TIPv6Addr) addrs); bool setNISDomain(SPtr duid, SPtr srv, const std::string& domain); bool setNISPServerLst(SPtr duid, SPtr srv, List(TIPv6Addr) addrs); bool setNISPDomain(SPtr duid, SPtr srv, const std::string& domain); bool setLifetime(SPtr duid, SPtr srv, unsigned int life); bool setDsLiteTunnel(SPtr remoteEndpoint); SPtr getDsLiteTunnel(); void removeAllOpts(); unsigned int getTimeout(); std::string getFQDN(); List(TIPv6Addr) getDNSServerLst(); private: void addString(const char * filename, const char * str); void delString(const char * filename, const char * str); void setString(const char * filename, const char * str); List(TIPv6Addr) DNSServerLst; List(std::string) DomainLst; List(TIPv6Addr) NTPServerLst; std::string Timezone; std::string FQDN; List(TIPv6Addr) SIPServerLst; List(std::string) SIPDomainLst; List(TIPv6Addr) NISServerLst; std::string NISDomain; List(TIPv6Addr) NISPServerLst; std::string NISPDomain; SPtr TunnelEndpoint; unsigned int LifetimeTimeout; unsigned int LifetimeTimestamp; /// @brief specifies if the DNS configuration should be wiped out during /// first configuration /// /// Controlled with FLUSH_OTHER_CONFIGURED_DNS_SERVERS in Misc/Portable.h bool DnsConfigured; }; #endif dibbler-1.0.1/ClntIfaceMgr/Makefile.in0000664000175000017500000005614112561652534014422 00000000000000# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = ClntIfaceMgr DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/depcomp ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/libtool.m4 \ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/include/dibbler-config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = LIBRARIES = $(noinst_LIBRARIES) ARFLAGS = cru AM_V_AR = $(am__v_AR_@AM_V@) am__v_AR_ = $(am__v_AR_@AM_DEFAULT_V@) am__v_AR_0 = @echo " AR " $@; am__v_AR_1 = libClntIfaceMgr_a_AR = $(AR) $(ARFLAGS) libClntIfaceMgr_a_LIBADD = am_libClntIfaceMgr_a_OBJECTS = \ libClntIfaceMgr_a-ClntIfaceIface.$(OBJEXT) \ libClntIfaceMgr_a-ClntIfaceMgr.$(OBJEXT) libClntIfaceMgr_a_OBJECTS = $(am_libClntIfaceMgr_a_OBJECTS) AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)/include depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) LTCXXCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CXXFLAGS) $(CXXFLAGS) AM_V_CXX = $(am__v_CXX_@AM_V@) am__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@) am__v_CXX_0 = @echo " CXX " $@; am__v_CXX_1 = CXXLD = $(CXX) CXXLINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \ $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CXXLD = $(am__v_CXXLD_@AM_V@) am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@) am__v_CXXLD_0 = @echo " CXXLD " $@; am__v_CXXLD_1 = COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(libClntIfaceMgr_a_SOURCES) DIST_SOURCES = $(libClntIfaceMgr_a_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALLOCA = @ALLOCA@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ ARCH = @ARCH@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ EXTRA_DIST_SUBDIRS = @EXTRA_DIST_SUBDIRS@ FGREP = @FGREP@ GREP = @GREP@ GTEST_INCLUDES = @GTEST_INCLUDES@ GTEST_LDADD = @GTEST_LDADD@ GTEST_LDFLAGS = @GTEST_LDFLAGS@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LINKPRINT = @LINKPRINT@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PORT_CFLAGS = @PORT_CFLAGS@ PORT_LDFLAGS = @PORT_LDFLAGS@ PORT_SUBDIR = @PORT_SUBDIR@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ subdirs = @subdirs@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ noinst_LIBRARIES = libClntIfaceMgr.a libClntIfaceMgr_a_CPPFLAGS = -I$(top_srcdir)/Misc \ -I$(top_srcdir)/IfaceMgr -I$(top_srcdir)/ClntCfgMgr \ -I$(top_srcdir)/CfgMgr -I$(top_srcdir)/Options \ -I$(top_srcdir)/ClntOptions -I$(top_srcdir)/AddrMgr \ -I$(top_srcdir)/ClntAddrMgr -I$(top_srcdir)/ClntTransMgr \ -I$(top_srcdir)/ClntMessages -I$(top_srcdir)/Messages \ -I$(top_srcdir)/poslib/poslib -I$(top_srcdir)/poslib libClntIfaceMgr_a_SOURCES = ClntIfaceIface.cpp ClntIfaceIface.h ClntIfaceMgr.cpp ClntIfaceMgr.h all: all-am .SUFFIXES: .SUFFIXES: .cpp .lo .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign ClntIfaceMgr/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign ClntIfaceMgr/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstLIBRARIES: -test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES) libClntIfaceMgr.a: $(libClntIfaceMgr_a_OBJECTS) $(libClntIfaceMgr_a_DEPENDENCIES) $(EXTRA_libClntIfaceMgr_a_DEPENDENCIES) $(AM_V_at)-rm -f libClntIfaceMgr.a $(AM_V_AR)$(libClntIfaceMgr_a_AR) libClntIfaceMgr.a $(libClntIfaceMgr_a_OBJECTS) $(libClntIfaceMgr_a_LIBADD) $(AM_V_at)$(RANLIB) libClntIfaceMgr.a mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libClntIfaceMgr_a-ClntIfaceIface.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libClntIfaceMgr_a-ClntIfaceMgr.Po@am__quote@ .cpp.o: @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $< .cpp.obj: @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .cpp.lo: @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LTCXXCOMPILE) -c -o $@ $< libClntIfaceMgr_a-ClntIfaceIface.o: ClntIfaceIface.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libClntIfaceMgr_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libClntIfaceMgr_a-ClntIfaceIface.o -MD -MP -MF $(DEPDIR)/libClntIfaceMgr_a-ClntIfaceIface.Tpo -c -o libClntIfaceMgr_a-ClntIfaceIface.o `test -f 'ClntIfaceIface.cpp' || echo '$(srcdir)/'`ClntIfaceIface.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libClntIfaceMgr_a-ClntIfaceIface.Tpo $(DEPDIR)/libClntIfaceMgr_a-ClntIfaceIface.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='ClntIfaceIface.cpp' object='libClntIfaceMgr_a-ClntIfaceIface.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libClntIfaceMgr_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libClntIfaceMgr_a-ClntIfaceIface.o `test -f 'ClntIfaceIface.cpp' || echo '$(srcdir)/'`ClntIfaceIface.cpp libClntIfaceMgr_a-ClntIfaceIface.obj: ClntIfaceIface.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libClntIfaceMgr_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libClntIfaceMgr_a-ClntIfaceIface.obj -MD -MP -MF $(DEPDIR)/libClntIfaceMgr_a-ClntIfaceIface.Tpo -c -o libClntIfaceMgr_a-ClntIfaceIface.obj `if test -f 'ClntIfaceIface.cpp'; then $(CYGPATH_W) 'ClntIfaceIface.cpp'; else $(CYGPATH_W) '$(srcdir)/ClntIfaceIface.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libClntIfaceMgr_a-ClntIfaceIface.Tpo $(DEPDIR)/libClntIfaceMgr_a-ClntIfaceIface.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='ClntIfaceIface.cpp' object='libClntIfaceMgr_a-ClntIfaceIface.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libClntIfaceMgr_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libClntIfaceMgr_a-ClntIfaceIface.obj `if test -f 'ClntIfaceIface.cpp'; then $(CYGPATH_W) 'ClntIfaceIface.cpp'; else $(CYGPATH_W) '$(srcdir)/ClntIfaceIface.cpp'; fi` libClntIfaceMgr_a-ClntIfaceMgr.o: ClntIfaceMgr.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libClntIfaceMgr_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libClntIfaceMgr_a-ClntIfaceMgr.o -MD -MP -MF $(DEPDIR)/libClntIfaceMgr_a-ClntIfaceMgr.Tpo -c -o libClntIfaceMgr_a-ClntIfaceMgr.o `test -f 'ClntIfaceMgr.cpp' || echo '$(srcdir)/'`ClntIfaceMgr.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libClntIfaceMgr_a-ClntIfaceMgr.Tpo $(DEPDIR)/libClntIfaceMgr_a-ClntIfaceMgr.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='ClntIfaceMgr.cpp' object='libClntIfaceMgr_a-ClntIfaceMgr.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libClntIfaceMgr_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libClntIfaceMgr_a-ClntIfaceMgr.o `test -f 'ClntIfaceMgr.cpp' || echo '$(srcdir)/'`ClntIfaceMgr.cpp libClntIfaceMgr_a-ClntIfaceMgr.obj: ClntIfaceMgr.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libClntIfaceMgr_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libClntIfaceMgr_a-ClntIfaceMgr.obj -MD -MP -MF $(DEPDIR)/libClntIfaceMgr_a-ClntIfaceMgr.Tpo -c -o libClntIfaceMgr_a-ClntIfaceMgr.obj `if test -f 'ClntIfaceMgr.cpp'; then $(CYGPATH_W) 'ClntIfaceMgr.cpp'; else $(CYGPATH_W) '$(srcdir)/ClntIfaceMgr.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libClntIfaceMgr_a-ClntIfaceMgr.Tpo $(DEPDIR)/libClntIfaceMgr_a-ClntIfaceMgr.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='ClntIfaceMgr.cpp' object='libClntIfaceMgr_a-ClntIfaceMgr.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libClntIfaceMgr_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libClntIfaceMgr_a-ClntIfaceMgr.obj `if test -f 'ClntIfaceMgr.cpp'; then $(CYGPATH_W) 'ClntIfaceMgr.cpp'; else $(CYGPATH_W) '$(srcdir)/ClntIfaceMgr.cpp'; fi` mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LIBRARIES) installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool clean-noinstLIBRARIES \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \ clean-libtool clean-noinstLIBRARIES cscopelist-am ctags \ ctags-am distclean distclean-compile distclean-generic \ distclean-libtool distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-dvi install-dvi-am install-exec \ install-exec-am install-html install-html-am install-info \ install-info-am install-man install-pdf install-pdf-am \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ tags tags-am uninstall uninstall-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: dibbler-1.0.1/SrvAddrMgr/0000775000175000017500000000000012561700420012127 500000000000000dibbler-1.0.1/SrvAddrMgr/SrvAddrMgr.cpp0000664000175000017500000007156612560471634014620 00000000000000/* * Dibbler - a portable DHCPv6 * * authors: Tomasz Mrugalski * Marek Senderski * changes: Krzysztof WNuk * Grzegorz Pluto * * released under GNU GPL v2 only licence * */ #include #include "SrvAddrMgr.h" #include "AddrClient.h" #include "AddrIA.h" #include "AddrAddr.h" #include "Logger.h" #include "SrvCfgAddrClass.h" #include "Portable.h" #include "SrvCfgMgr.h" using namespace std; TSrvAddrMgr * TSrvAddrMgr::Instance = 0; TSrvAddrMgr::TSrvAddrMgr(const std::string& xmlfile, bool loadDB) :TAddrMgr(xmlfile, loadDB) { this->CacheMaxSize = 999999999; this->cacheRead(); } TSrvAddrMgr::~TSrvAddrMgr() { Log(Debug) << "SrvAddrMgr cleanup." << LogEnd; } /** * @brief adds an address to the client. * * Adds a single address to the client. If the client is not present in * address manager, adds it, too. Also, if client's IA is missing, adds it as well. * * @param clntDuid client DUID * @param clntAddr client's address (link-local, used if unicast is to be used) * @param iface interface, on which client is reachable * @param IAID ID of an IA * @param T1 - T1 timer * @param T2 - T2 timer * @param addr - address to be added * @param pref preferred lifetime * @param valid valid lifetime * @param quiet quiet mode (e.g. used during SOLICIT handling, don't print anything about * adding client/IA/address, as it will be deleted immediately anyway) * * @return true, if addition was successful */ bool TSrvAddrMgr::addClntAddr(SPtr clntDuid , SPtr clntAddr, int iface, unsigned long IAID, unsigned long T1, unsigned long T2, SPtr addr, unsigned long pref, unsigned long valid, bool quiet) { // find config interface for this ifindex SPtr cfgIface = SrvCfgMgr().getIfaceByID(iface); if (!cfgIface) { Log(Error) << "Failed to add address: config interface with ifindex=" << iface << " not found." << LogEnd; return false; } // find this client SPtr ptrClient; this->firstClient(); while ( ptrClient = this->getClient() ) { if ( (*ptrClient->getDUID()) == (*clntDuid) ) break; } // have we found this client? if (!ptrClient) { if (!quiet) Log(Debug) << "Adding client (DUID=" << clntDuid->getPlain() << ") to addrDB." << LogEnd; ptrClient = new TAddrClient(clntDuid); this->addClient(ptrClient); } // find this IA SPtr ptrIA; ptrClient->firstIA(); while ( ptrIA = ptrClient->getIA() ) { if ( ptrIA->getIAID() == IAID) break; } // have we found this IA? if (!ptrIA) { ptrIA = new TAddrIA(cfgIface->getName(), iface, IATYPE_IA, clntAddr, clntDuid, T1, T2, IAID); ptrClient->addIA(ptrIA); if (!quiet) Log(Debug) << "Adding IA (IAID=" << IAID << ") to addrDB." << LogEnd; } SPtr ptrAddr; ptrIA->firstAddr(); while ( ptrAddr = ptrIA->getAddr() ) { if (*ptrAddr->get()==*addr) break; } // address already exists if (ptrAddr) { Log(Warning) << "Address " << *ptrAddr << " is already assigned to this IA." << LogEnd; return false; } // add address ptrAddr = new TAddrAddr(addr, pref, valid); ptrIA->addAddr(ptrAddr); if (!quiet) Log(Debug) << "Adding " << ptrAddr->get()->getPlain() << " to IA (IAID=" << IAID << ") to addrDB." << LogEnd; return true; } /// Frees address (also deletes IA and/or client, if this was last address) /// /// @param clntDuid DUID of the client /// @param IAID IA identifier /// @param clntAddr address to be removed from DB /// @param quiet print out anything? /// /// @return true if removal was successful bool TSrvAddrMgr::delClntAddr(SPtr clntDuid, unsigned long IAID, SPtr clntAddr, bool quiet) { // find this client SPtr ptrClient; this->firstClient(); while ( ptrClient = this->getClient() ) { if ( (*ptrClient->getDUID()) == (*clntDuid) ) break; } if (!ptrClient) { // have we found this client? Log(Warning) << "Client (DUID=" << clntDuid->getPlain() << ") not found in addrDB, cannot delete address and/or client." << LogEnd; return false; } // find this IA SPtr ptrIA; ptrClient->firstIA(); while ( ptrIA = ptrClient->getIA() ) { if ( ptrIA->getIAID() == IAID) break; } if (!ptrIA) { // have we found this IA? Log(Warning) << "IA (IAID=" << IAID << ") not assigned to client, cannot delete address and/or IA." << LogEnd; return false; } // find an address SPtr ptrAddr; ptrIA->firstAddr(); while ( ptrAddr = ptrIA->getAddr() ) { if (*ptrAddr->get()==*clntAddr) break; } if (!ptrAddr) { Log(Warning) << "Address " << *clntAddr << " not assigned, cannot delete." << LogEnd; return false; } ptrIA->delAddr(clntAddr); this->addCachedEntry(clntDuid, clntAddr, IATYPE_IA); if (!quiet) Log(Debug) << "Deleted address " << *clntAddr << " from addrDB." << LogEnd; if (!ptrIA->countAddr()) { if (!quiet) Log(Debug) << "Deleted empty IA (IAID=" << IAID << ") from addrDB." << LogEnd; ptrClient->delIA(IAID); } if (!ptrClient->countIA() && !ptrClient->countTA() && !ptrClient->countPD()) { if (!quiet) Log(Debug) << "Deleted empty client (DUID=" << clntDuid->getPlain() << ") from addrDB." << LogEnd; this->delClient(clntDuid); } return true; } /** * @brief adds TA address to AddrMgr * * adds temporary address. Add missing client or TA, if necessary. * * @param clntDuid * @param clntAddr * @param iface * @param iaid * @param addr * @param pref * @param valid * * @return */ bool TSrvAddrMgr::addTAAddr(SPtr clntDuid , SPtr clntAddr, int iface, unsigned long iaid, SPtr addr, unsigned long pref, unsigned long valid) { // find config interface for this ifindex SPtr cfgIface = SrvCfgMgr().getIfaceByID(iface); if (!cfgIface) { Log(Error) << "Failed to add temp. address: config interface with ifindex=" << iface << " not found." << LogEnd; return false; } // find this client SPtr ptrClient; this->firstClient(); while ( ptrClient = this->getClient() ) { if ( (*ptrClient->getDUID()) == (*clntDuid) ) break; } // have we found this client? if (!ptrClient) { Log(Debug) << "Adding client (DUID=" << clntDuid->getPlain() << ") to the addrDB." << LogEnd; ptrClient = new TAddrClient(clntDuid); this->addClient(ptrClient); } // find this TA SPtr ta; ptrClient->firstTA(); while ( ta = ptrClient->getTA() ) { if ( ta->getIAID() == iaid) break; } // have we found this TA? if (!ta) { ta = new TAddrIA(cfgIface->getName(), iface, IATYPE_TA, clntAddr, clntDuid, DHCPV6_INFINITY, DHCPV6_INFINITY, iaid); ptrClient->addTA(ta); Log(Debug) << "Adding TA (IAID=" << iaid << ") to the addrDB." << LogEnd; } SPtr ptrAddr; ta->firstAddr(); while ( ptrAddr = ta->getAddr() ) { if (*ptrAddr->get()==*addr) break; } // address already exists if (ptrAddr) { Log(Warning) << "Address " << *ptrAddr << " is already assigned to TA (iaid=" << iaid << ")." << LogEnd; return false; } // add address ptrAddr = new TAddrAddr(addr, pref, valid); ta->addAddr(ptrAddr); Log(Debug) << "Adding " << ptrAddr->get()->getPlain() << " to TA (IAID=" << iaid << ") to addrDB." << LogEnd; return true; } /** * Frees address (also deletes IA and/or client, if this was last address) * * @param clntDuid DUID of the client * @param iaid IAID of IA that contains address to be deleted * @param clntAddr address to be deleted * @param quiet should method log deleted address? * * @return true if removal was successful */ bool TSrvAddrMgr::delTAAddr(SPtr clntDuid, unsigned long iaid, SPtr clntAddr, bool quiet) { // find this client SPtr ptrClient; this->firstClient(); while ( ptrClient = this->getClient() ) { if ( (*ptrClient->getDUID()) == (*clntDuid) ) break; } // have we found this client? if (!ptrClient) { Log(Warning) << "Client (DUID=" << clntDuid->getPlain() << ") not found in addrDB, cannot delete address and/or client." << LogEnd; return false; } // find this IA SPtr ta; ptrClient->firstTA(); while ( ta = ptrClient->getTA() ) { if ( ta->getIAID() == iaid) break; } // have we found this TA? if (!ta) { Log(Warning) << "TA (IAID=" << iaid << ") not assigned to client, cannot delete address and/or IA." << LogEnd; return false; } SPtr ptrAddr; ta->firstAddr(); while ( ptrAddr = ta->getAddr() ) { if (*ptrAddr->get()==*clntAddr) break; } // address already exists if (!ptrAddr) { Log(Warning) << "Temp. address " << *clntAddr << " not assigned, cannot delete." << LogEnd; return false; } ta->delAddr(clntAddr); if (!quiet) Log(Debug) << "Deleted temp. address " << *clntAddr << " from addrDB." << LogEnd; if (!ta->countAddr()) { if (!quiet) Log(Debug) << "Deleted TA (IAID=" << iaid << ") from addrDB." << LogEnd; ptrClient->delTA(iaid); } if (!ptrClient->countIA() && !ptrClient->countTA() && !ptrClient->countPD()) { if (!quiet) Log(Debug) << "Deleted client (DUID=" << clntDuid->getPlain() << ") from addrDB." << LogEnd; this->delClient(clntDuid); } return true; } bool TSrvAddrMgr::delPrefix(SPtr clntDuid, unsigned long IAID, SPtr prefix, bool quiet) { bool result = TAddrMgr::delPrefix(clntDuid, IAID, prefix, quiet); if (result) addCachedEntry(clntDuid, prefix, IATYPE_PD); return result; } /// @brief returns how many leases does this client have? /// /// @param duid client's DUID /// /// @return number of leases (addresses and/or prefixes) unsigned long TSrvAddrMgr::getLeaseCount(SPtr duid) { SPtr ptrClient; ClntsLst.first(); while ( ptrClient = ClntsLst.get() ) { if ( (*ptrClient->getDUID()) == (*duid)) break; } // Have we found this client? if (!ptrClient) { return 0; } unsigned long count = 0; // count each of client's IAs SPtr ptrIA; ptrClient->firstIA(); while ( ptrIA = ptrClient->getIA() ) { count += ptrIA->countAddr(); } // count each of client's TA ptrClient->firstTA(); while (ptrIA = ptrClient->getTA() ) { count += ptrIA->countAddr(); } // count each of client's PD ptrClient->firstPD(); while (ptrIA = ptrClient->getPD() ) { count += ptrIA->countPrefix(); } return count; } bool TSrvAddrMgr::addrIsFree(SPtr addr) { // for each client... SPtr ptrClient; ClntsLst.first(); while ( ptrClient = ClntsLst.get() ) { // look at each client's IAs SPtr ptrIA; ptrClient->firstIA(); while ( ptrIA = ptrClient->getIA() ) { SPtr ptrAddr; if (ptrAddr = ptrIA->getAddr(addr) ) return false; } } return true; } /** * Verifies if addr is unused * * @param addr * * @return */ bool TSrvAddrMgr::taAddrIsFree(SPtr addr) { // for each client... SPtr ptrClient; ClntsLst.first(); while ( ptrClient = ClntsLst.get() ) { // look at each client's TAs SPtr ta; ptrClient->firstTA(); while ( ta = ptrClient->getTA() ) { if (ta->getAddr(addr) ) return false; } } return true; } void TSrvAddrMgr::getAddrsCount(SPtr< List(TSrvCfgAddrClass) > classes, long *clntCnt, long *addrCnt, SPtr duid, int iface) { memset(clntCnt,0,sizeof(long)*classes->count()); memset(addrCnt,0,sizeof(long)*classes->count()); int classNr=0; SPtr ptrClient; firstClient(); while(ptrClient=getClient()) { bool thisClient=(*(ptrClient->getDUID())==*duid); ptrClient->firstIA(); SPtr ptrIA; while(ptrIA=ptrClient->getIA()) { SPtr ptrAddr; ptrIA->firstAddr(); while(ptrAddr=ptrIA->getAddr()) { if(ptrIA->getIfindex() == iface) { SPtr ptrClass; classes->first(); classNr=0; while(ptrClass=classes->get()) { if(ptrClass->addrInPool(ptrAddr->get())) { if(thisClient) clntCnt[classNr]++; addrCnt[classNr]++; } classNr++; } } } } } } SPtr TSrvAddrMgr::getFirstAddr(SPtr clntDuid) { SPtr ptrAddrClient = this->getClient(clntDuid); if (!ptrAddrClient) { Log(Warning) << "Unable to find client in the addrDB." << LogEnd; return SPtr(); } ptrAddrClient->firstIA(); SPtr ptrAddrIA = ptrAddrClient->getIA(); if (!ptrAddrIA) { Log(Warning) << "Client does not have any addresses assigned." << LogEnd; return SPtr(); } ptrAddrIA->firstAddr(); SPtr addr = ptrAddrIA->getAddr(); if (!addr) { return SPtr(); } return addr->get(); } /* ******************************************************************************** */ /* *** ADDRESS CACHE ************************************************************** */ /* ******************************************************************************** */ /// @brief remove outdated addresses /// /// @param addrLst /// @param tempAddrLst /// @param prefixLst /// void TSrvAddrMgr::doDuties(std::vector& addrLst, std::vector& tempAddrLst, std::vector& prefixLst) { SPtr ptrClient; SPtr ptrIA; SPtr ptrAddr; // for each client... this->firstClient(); while (ptrClient = this->getClient() ) { // ... which has outdated addresses if (ptrClient->getValidTimeout()) continue; // check for expired addresses ptrClient->firstIA(); while ( ptrIA = ptrClient->getIA() ) { // has this IA outdated addressess? if ( ptrIA->getValidTimeout() ) continue; ptrIA->firstAddr(); while ( ptrAddr = ptrIA->getAddr() ) { if (ptrAddr->getValidTimeout()) continue; TExpiredInfo expire; expire.client = ptrClient; expire.ia = ptrIA; expire.addr = ptrAddr->get(); addrLst.push_back(expire); // delClntAddr(ptrClient->getDUID(), ptrIA->getIAID(), ptrAddr->get(), false); } } ptrClient->firstTA(); while (ptrIA = ptrClient->getTA()) { if (ptrIA->getValidTimeout()) continue; ptrIA->firstAddr(); while ( ptrAddr = ptrIA->getAddr() ) { if (ptrAddr->getValidTimeout()) continue; TExpiredInfo expire; expire.client = ptrClient; expire.ia = ptrIA; expire.addr = ptrAddr->get(); tempAddrLst.push_back(expire); // delTAAddr(ptrClient->getDUID(), ptrIA->getIAID(), ptrAddr->get()); } } SPtr pd; SPtr prefix; ptrClient->firstPD(); while (pd = ptrClient->getPD()) { if (pd->getValidTimeout()) continue; pd->firstPrefix(); while (prefix = pd->getPrefix()) { if (prefix->getValidTimeout()) continue; TExpiredInfo expire; expire.client = ptrClient; expire.ia = pd; expire.addr = prefix->get(); expire.prefixLen = prefix->getLength(); prefixLst.push_back(expire); // delPrefix(ptrClient->getDUID(), pd->getIAID(), prefix->get(), false); } // while (prefix) } // while (pd) } // while (client) } /// @brief Checks if address is still supported in current configuration (used in loadDB) /// /// @param addr checked address /// /// @return true, if supported bool TSrvAddrMgr::verifyAddr(SPtr addr) { if (SrvCfgMgr().addrReserved(addr)) { return true; } SrvCfgMgr().firstIface(); while (SPtr iface = SrvCfgMgr().getIface()) { if (SrvCfgMgr().getClassByAddr(iface->getID(), addr)) { return true; } } return false; } /// @brief Checks if prefix is still supported in current configuration (used in loadDB) /// /// @param prefix checked prefix /// /// @return true, if prefix is supported bool TSrvAddrMgr::verifyPrefix(SPtr prefix) { if (SrvCfgMgr().prefixReserved(prefix)) { return true; } SrvCfgMgr().firstIface(); while (SPtr iface = SrvCfgMgr().getIface()) { if (SrvCfgMgr().getClassByPrefix(iface->getID(), prefix)) { return true; } } return false; } /** * returns address or prefix cached for this client. * * @param clntDuid * @param type type of entry looked for (TYPE_IA for address or TYPE_PD for prefix) * * @return cached address or prefix. 0 if cached address is not found. */ SPtr TSrvAddrMgr::getCachedEntry(SPtr clntDuid, TIAType type) { if (!this->CacheMaxSize) return SPtr(); SPtr entry; this->Cache.first(); while (entry = this->Cache.get()) { if (!entry->Duid) continue; // something is wrong. VERY wrong. But shut up and continue. if ((entry->type==type) && (*entry->Duid == *clntDuid) ) { Log(Debug) << "Cache: Cached " << (type==IATYPE_IA?"address":"prefix") << " for client (DUID=" << clntDuid->getPlain() << ") found: " << entry->Addr->getPlain() << LogEnd; return entry->Addr; } } Log(Debug) << "Cache: There are no cached " << (type==IATYPE_IA?"address":"prefix") << " address entries for client (DUID=" << clntDuid->getPlain() << ")." << LogEnd; return SPtr(); } /** * this function deletes cached address or prefix entry * * @param addr * @param type type of entry looked for (TYPE_IA for address or TYPE_PD for prefix) * * @return */ bool TSrvAddrMgr::delCachedEntry(SPtr addr, TIAType type) { if (!this->CacheMaxSize) return false; this->Cache.first(); SPtr entry; while (entry = this->Cache.get()) { if (!entry->Addr) continue; // something is wrong. VERY wrong. But shut up and continue. if ( (entry->type==type) && (*(entry->Addr) == *addr) ) { this->Cache.del(); this->Cache.first(); Log(Debug) << "Cache: " << (type==IATYPE_IA?"Address ":"Prefix ") << *addr << " was deleted." << LogEnd; return true; } } Log(Debug) << "Cache: Attempt to delete " << *addr << " failed." << LogEnd; return false; } /** * this function deletes cache entry * * @param clntDuid * @param type type of entry looked for (TYPE_IA for address or TYPE_PD for prefix) * * @return */ bool TSrvAddrMgr::delCachedEntry(SPtr clntDuid, TIAType type) { if (!this->CacheMaxSize) return false; this->Cache.first(); SPtr entry; while (entry = this->Cache.get()) { if (!entry->Duid) continue; // something is wrong. VERY wrong. But shut up and continue. if ( (entry->type==type) && (*(entry->Duid) == *clntDuid) ) { this->Cache.del(); this->Cache.first(); Log(Debug) << "Cache: Entry for client (DUID=" << clntDuid->getPlain() << ") was deleted." << LogEnd; return true; } } // delete attempt is done on multiple occasions as a safety precausion, so don't warn if it is missing // Log(Debug) << "Cache: Attempt to delete entry for client (DUID=" << clntDuid->getPlain() << ") failed." << LogEnd; return false; } /** * this function adds an address or prefix to a cache. If there is entry for this client, updates it * * @param clntDuid * @param cachedAddr * @param type type of entry looked for (TYPE_IA for address or TYPE_PD for prefix) */ void TSrvAddrMgr::addCachedEntry(SPtr clntDuid, SPtr cachedAddr, TIAType type) { // if cache is disabled (size set to 0) if (!this->CacheMaxSize) return; // if this address is reserved, don't add it to cache) if ( (type == IATYPE_IA) && (SrvCfgMgr().addrReserved(cachedAddr))) return; // if this prefix is reserved, don't add it to cache) if ( (type == IATYPE_PD) && (SrvCfgMgr().prefixReserved(cachedAddr))) return; SPtr entry; // is there an entry for this client, delete it. New entry will be added at the end this->delCachedEntry(clntDuid, type); entry = new TSrvCacheEntry(); entry->type = type; entry->Duid = clntDuid; entry->Addr = cachedAddr; Log(Debug) << "Cache: " << (type==IATYPE_IA?"Address ":"Prefix ") << cachedAddr->getPlain() << " added for client (DUID=" << clntDuid->getPlain() << "). " << LogEnd; this->Cache.append(entry); this->checkCacheSize(); } void TSrvAddrMgr::setCacheSize(int bytes) { int entrySize = sizeof(TSrvCacheEntry) + sizeof(TIPv6Addr) + sizeof(TDUID); this->CacheMaxSize = bytes/entrySize; Log(Debug) << "Cache: size set to " << bytes << " bytes, 1 cache entry size is " << entrySize << " bytes, so maximum " << this->CacheMaxSize << " address-client pair(s) may be cached." << LogEnd; this->checkCacheSize(); } /** * this function checks if the cache size was not exceeded. If that is so, oldest entries are removed * */ void TSrvAddrMgr::checkCacheSize() { if (this->Cache.count() <= this->CacheMaxSize) return; // there are too many cached elements, delete some while (this->Cache.count() > this->CacheMaxSize) { this->Cache.delFirst(); } } void TSrvAddrMgr::print(std::ostream & out) { out << " Cache.count() << "\"/>" << endl; } void TSrvAddrMgr::dump() { // Do not write anything to disk if there is performance mode enabled if (SrvCfgMgr().getPerformanceMode()) return; TAddrMgr::dump(); // perform normal dump of the AddrMgr cacheDump(); } /** * dumps address cache into a file specified by SRVCACHE_FILE * */ void TSrvAddrMgr::cacheDump() { std::ofstream f; f.open(SRVCACHE_FILE); if (!f.is_open()) { Log(Error) << "Cache: File " << SRVCACHE_FILE << " creation failed." << LogEnd; return; } f << "Cache.count() << "\">" << endl; SPtr x; this->Cache.first(); while (x=this->Cache.get()) { f << " type) { case IATYPE_IA: f << "addr"; break; case IATYPE_PD: f << "prefix"; break; default: Log(Error) << "Invalid cache type entry. Skipping." << LogEnd; continue; } f << "\" duid=\""; if (x->Duid) f << x->Duid->getPlain(); f << "\">"; if (x->Addr) f << x->Addr->getPlain(); f << "" << endl; } f << "" << endl; f.close(); } /** * dumps address cache into a file specified by SRVCACHE_FILE * */ void TSrvAddrMgr::cacheRead() { this->Cache.clear(); bool started = false; bool ended = false; bool parsed = false; int lineno = 0; size_t entries = 0; std::ifstream f; string s; TIAType type; f.open(SRVCACHE_FILE); if (!f.is_open()) { Log(Warning) << "Cache: Unable to open cache file " << SRVCACHE_FILE << "." << LogEnd; return; } parsed = false; while (!f.eof()) { getline(f,s); string::size_type pos=0; if ( ((pos = s.find(" missing." << LogEnd; return; } type = IATYPE_IA; // assume that entry is for address (to maintain backward compatibility) if ( (pos=s.find("type=\""))!=string::npos) { s = s.substr(pos+6); string typeStr = s.substr(0, s.find("\"")); if (typeStr =="addr") type = IATYPE_IA; else if (typeStr =="prefix") type = IATYPE_PD; else { Log(Error) << "Invalid entry type in line " << lineno << " in " << SRVCACHE_FILE << LogEnd; continue; } } if ( (pos=s.find("duid=\""))!=string::npos) { s = s.substr(pos+6); string duid = s.substr(0, s.find("\"")); s = s.substr(s.find("\"")+2); string addr = s.substr(0, s.find("<")); SPtr tmp2 = new TIPv6Addr(addr.c_str(), true); SPtr tmp1 = new TDUID(duid.c_str()); addCachedEntry(tmp1, tmp2, type); } else { Log(Error) << "Cache: " << SRVCACHE_FILE << " file: missing duid=\"...\" in line " << lineno << "." << LogEnd; return; } } if (s.find("")!=string::npos) { if (!started) { Log(Error) << "Cache: Reading file " << SRVCACHE_FILE << " failed: closing tag found at line " << lineno << ", but opening tag is missing." << LogEnd; f.close(); return; } parsed = true; ended = true; } } f.close(); if (this->Cache.count() != entries) { Log(Debug) << "Cache: " << SRVCACHE_FILE << " file: " << entries << " entries expected, but " << this->Cache.count() << " found." << LogEnd; } if (!parsed) { Log(Info) << "Did not find any useful information in " << SRVCACHE_FILE << LogEnd; } if (!ended) { Log(Warning) << SRVCACHE_FILE << " seems truncated." << LogEnd; } } void TSrvAddrMgr::instanceCreate(const std::string& xmlFile, bool loadDB) { if (Instance) { Log(Crit) << "SrvAddrMgr already exists! Application error" << LogEnd; return; } Instance = new TSrvAddrMgr(xmlFile, loadDB); } TSrvAddrMgr & TSrvAddrMgr::instance() { if (!Instance) { Log(Crit) << "SrvAddrMgr not created yet. Application error. Emergency shutdown." << LogEnd; exit(EXIT_FAILURE); } return *Instance; } dibbler-1.0.1/SrvAddrMgr/SrvAddrMgr.h0000644000175000017500000000631312277722750014252 00000000000000/* * Dibbler - a portable DHCPv6 * * authors: Tomasz Mrugalski * Marek Senderski * changes: Grzegorz Pluto * * released under GNU GPL v2 only licence * */ #ifndef SRVADDRMGR_H #define SRVADDRMGR_H #include #include "AddrMgr.h" #include "SrvCfgAddrClass.h" #include "SrvCfgPD.h" #define SrvAddrMgr() (TSrvAddrMgr::instance()) class TSrvAddrMgr : public TAddrMgr { public: static void instanceCreate(const std::string& xmlFile, bool loadDB); static TSrvAddrMgr & instance(); class TSrvCacheEntry { public: TIAType type; // address or prefix SPtr Addr; // cached address, previously assigned to a client SPtr Duid; // client's duid }; struct TExpiredInfo { SPtr client; SPtr ia; SPtr addr; // address or prefix int prefixLen; // just for prefixes }; ~TSrvAddrMgr(); // IA address management bool addClntAddr(SPtr clntDuid, SPtr clntAddr, int iface, unsigned long IAID, unsigned long T1, unsigned long T2, SPtr addr, unsigned long pref, unsigned long valid, bool quiet); bool delClntAddr(SPtr duid,unsigned long IAID, SPtr addr, bool quiet); virtual bool verifyAddr(SPtr addr); // TA address management bool addTAAddr(SPtr clntDuid, SPtr clntAddr, int iface, unsigned long iaid, SPtr addr, unsigned long pref, unsigned long valid); bool delTAAddr(SPtr duid,unsigned long iaid, SPtr addr, bool quiet); // prefix management virtual bool delPrefix(SPtr clntDuid, unsigned long IAID, SPtr prefix, bool quiet); virtual bool verifyPrefix(SPtr addr); // how many addresses does this client have? unsigned long getLeaseCount(SPtr duid); void doDuties(std::vector& addrLst, std::vector& tempAddrLst, std::vector& prefixLst); void getAddrsCount(SPtr classes, long *clntCnt, long *addrCnt, SPtr duid, int iface); bool addrIsFree(SPtr addr); bool taAddrIsFree(SPtr addr); SPtr getFirstAddr(SPtr clntDuid); // address and prefix caching SPtr getCachedEntry(SPtr clntDuid, TIAType type); bool delCachedEntry(SPtr cachedEntry, TIAType type); bool delCachedEntry(SPtr clntDuid, TIAType type); void addCachedEntry(SPtr clntDuid, SPtr cachedEntry, TIAType type); void setCacheSize(int bytes); void dump(); protected: void print(std::ostream & out); TSrvAddrMgr(const std::string& xmlfile, bool loadDB); static TSrvAddrMgr * Instance; void cacheRead(); void cacheDump(); void checkCacheSize(); List(TSrvCacheEntry) Cache; // list of cached addresses size_t CacheMaxSize; // maximum number of cached elements }; #endif dibbler-1.0.1/SrvAddrMgr/Makefile.am0000664000175000017500000000074112233256142014110 00000000000000noinst_LIBRARIES = libSrvAddrMgr.a libSrvAddrMgr_a_CPPFLAGS = -I$(top_srcdir)/Misc -I$(top_srcdir)/AddrMgr libSrvAddrMgr_a_CPPFLAGS += -I$(top_srcdir)/SrvCfgMgr -I$(top_srcdir)/CfgMgr libSrvAddrMgr_a_CPPFLAGS += -I$(top_srcdir)/Options -I$(top_srcdir)/SrvOptions libSrvAddrMgr_a_CPPFLAGS += -I$(top_srcdir)/IfaceMgr -I$(top_srcdir)/SrvIfaceMgr libSrvAddrMgr_a_CPPFLAGS += -I$(top_srcdir)/SrvMessages -I$(top_srcdir)/Messages libSrvAddrMgr_a_SOURCES = SrvAddrMgr.cpp SrvAddrMgr.h dibbler-1.0.1/SrvAddrMgr/Makefile.in0000664000175000017500000005075512561652535014145 00000000000000# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = SrvAddrMgr DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/depcomp ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/libtool.m4 \ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/include/dibbler-config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = LIBRARIES = $(noinst_LIBRARIES) ARFLAGS = cru AM_V_AR = $(am__v_AR_@AM_V@) am__v_AR_ = $(am__v_AR_@AM_DEFAULT_V@) am__v_AR_0 = @echo " AR " $@; am__v_AR_1 = libSrvAddrMgr_a_AR = $(AR) $(ARFLAGS) libSrvAddrMgr_a_LIBADD = am_libSrvAddrMgr_a_OBJECTS = libSrvAddrMgr_a-SrvAddrMgr.$(OBJEXT) libSrvAddrMgr_a_OBJECTS = $(am_libSrvAddrMgr_a_OBJECTS) AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)/include depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) LTCXXCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CXXFLAGS) $(CXXFLAGS) AM_V_CXX = $(am__v_CXX_@AM_V@) am__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@) am__v_CXX_0 = @echo " CXX " $@; am__v_CXX_1 = CXXLD = $(CXX) CXXLINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \ $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CXXLD = $(am__v_CXXLD_@AM_V@) am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@) am__v_CXXLD_0 = @echo " CXXLD " $@; am__v_CXXLD_1 = COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(libSrvAddrMgr_a_SOURCES) DIST_SOURCES = $(libSrvAddrMgr_a_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALLOCA = @ALLOCA@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ ARCH = @ARCH@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ EXTRA_DIST_SUBDIRS = @EXTRA_DIST_SUBDIRS@ FGREP = @FGREP@ GREP = @GREP@ GTEST_INCLUDES = @GTEST_INCLUDES@ GTEST_LDADD = @GTEST_LDADD@ GTEST_LDFLAGS = @GTEST_LDFLAGS@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LINKPRINT = @LINKPRINT@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PORT_CFLAGS = @PORT_CFLAGS@ PORT_LDFLAGS = @PORT_LDFLAGS@ PORT_SUBDIR = @PORT_SUBDIR@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ subdirs = @subdirs@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ noinst_LIBRARIES = libSrvAddrMgr.a libSrvAddrMgr_a_CPPFLAGS = -I$(top_srcdir)/Misc \ -I$(top_srcdir)/AddrMgr -I$(top_srcdir)/SrvCfgMgr \ -I$(top_srcdir)/CfgMgr -I$(top_srcdir)/Options \ -I$(top_srcdir)/SrvOptions -I$(top_srcdir)/IfaceMgr \ -I$(top_srcdir)/SrvIfaceMgr -I$(top_srcdir)/SrvMessages \ -I$(top_srcdir)/Messages libSrvAddrMgr_a_SOURCES = SrvAddrMgr.cpp SrvAddrMgr.h all: all-am .SUFFIXES: .SUFFIXES: .cpp .lo .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign SrvAddrMgr/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign SrvAddrMgr/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstLIBRARIES: -test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES) libSrvAddrMgr.a: $(libSrvAddrMgr_a_OBJECTS) $(libSrvAddrMgr_a_DEPENDENCIES) $(EXTRA_libSrvAddrMgr_a_DEPENDENCIES) $(AM_V_at)-rm -f libSrvAddrMgr.a $(AM_V_AR)$(libSrvAddrMgr_a_AR) libSrvAddrMgr.a $(libSrvAddrMgr_a_OBJECTS) $(libSrvAddrMgr_a_LIBADD) $(AM_V_at)$(RANLIB) libSrvAddrMgr.a mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libSrvAddrMgr_a-SrvAddrMgr.Po@am__quote@ .cpp.o: @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $< .cpp.obj: @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .cpp.lo: @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LTCXXCOMPILE) -c -o $@ $< libSrvAddrMgr_a-SrvAddrMgr.o: SrvAddrMgr.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libSrvAddrMgr_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libSrvAddrMgr_a-SrvAddrMgr.o -MD -MP -MF $(DEPDIR)/libSrvAddrMgr_a-SrvAddrMgr.Tpo -c -o libSrvAddrMgr_a-SrvAddrMgr.o `test -f 'SrvAddrMgr.cpp' || echo '$(srcdir)/'`SrvAddrMgr.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libSrvAddrMgr_a-SrvAddrMgr.Tpo $(DEPDIR)/libSrvAddrMgr_a-SrvAddrMgr.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='SrvAddrMgr.cpp' object='libSrvAddrMgr_a-SrvAddrMgr.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libSrvAddrMgr_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libSrvAddrMgr_a-SrvAddrMgr.o `test -f 'SrvAddrMgr.cpp' || echo '$(srcdir)/'`SrvAddrMgr.cpp libSrvAddrMgr_a-SrvAddrMgr.obj: SrvAddrMgr.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libSrvAddrMgr_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libSrvAddrMgr_a-SrvAddrMgr.obj -MD -MP -MF $(DEPDIR)/libSrvAddrMgr_a-SrvAddrMgr.Tpo -c -o libSrvAddrMgr_a-SrvAddrMgr.obj `if test -f 'SrvAddrMgr.cpp'; then $(CYGPATH_W) 'SrvAddrMgr.cpp'; else $(CYGPATH_W) '$(srcdir)/SrvAddrMgr.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libSrvAddrMgr_a-SrvAddrMgr.Tpo $(DEPDIR)/libSrvAddrMgr_a-SrvAddrMgr.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='SrvAddrMgr.cpp' object='libSrvAddrMgr_a-SrvAddrMgr.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libSrvAddrMgr_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libSrvAddrMgr_a-SrvAddrMgr.obj `if test -f 'SrvAddrMgr.cpp'; then $(CYGPATH_W) 'SrvAddrMgr.cpp'; else $(CYGPATH_W) '$(srcdir)/SrvAddrMgr.cpp'; fi` mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LIBRARIES) installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool clean-noinstLIBRARIES \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \ clean-libtool clean-noinstLIBRARIES cscopelist-am ctags \ ctags-am distclean distclean-compile distclean-generic \ distclean-libtool distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-dvi install-dvi-am install-exec \ install-exec-am install-html install-html-am install-info \ install-info-am install-man install-pdf install-pdf-am \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ tags tags-am uninstall uninstall-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: dibbler-1.0.1/Port-winnt2k/0000775000175000017500000000000012561700422012434 500000000000000dibbler-1.0.1/Port-winnt2k/WinService.h0000664000175000017500000000451312233256142014607 00000000000000/* * Dibbler - a portable DHCPv6 * * authors: Tomasz Mrugalski * Marek Senderski * win2k version by * * $Id: WinService.h,v 1.2 2005-07-26 00:03:03 thomson Exp $ * * Released under GNU GPL v2 licence * */ #ifndef _WINSERVICE_ #define _WINSERVICE_ #include #include #define SERVICE_CONTROL_USER 128 typedef enum { STATUS, START, STOP, INSTALL, UNINSTALL, SERVICE, RUN, HELP, INVALID } EServiceState; class TWinService { public: std::string ServiceDir; TWinService(const char* serviceName, const char* dispName, DWORD deviceType=SERVICE_DEMAND_START, char* dependencies=NULL, char* descr=NULL); static void WINAPI ServiceMain(DWORD dwArgc, LPTSTR* lpszArgv); static void WINAPI Handler(DWORD dwOpcode); void LogEvent(WORD wType, DWORD dwID, const char* pszS1 = NULL, const char* pszS2 = NULL, const char* pszS3 = NULL); bool IsInstalled(); bool IsInstalled(const char *name); bool Install(); bool Uninstall(); bool StartService(); /* invoked to trigger start */ bool RunService(); /* actual service start and run */ bool StopService(); void SetStatus(DWORD dwState); bool Initialize(); bool verifyPort(); virtual void Run(); virtual bool OnInit(); virtual void OnStop(); virtual void OnInterrogate(); virtual void OnPause(); virtual void OnContinue(); virtual void OnShutdown(); virtual bool OnUserControl(DWORD dwOpcode); void showStatus(); int getStatus(); bool isRunning(const char * name); bool isRunning(); ~TWinService(void); protected: SERVICE_STATUS Status; SERVICE_STATUS_HANDLE hServiceStatus; BOOL IsRunning; char ServiceName[64]; int MajorVersion; int MinorVersion; DWORD ServiceType; char* Dependencies; char* DisplayName; char* descr; static TWinService* ServicePtr; HANDLE EventSource; }; #endif /* * $Log: not supported by cvs2svn $ * Revision 1.1 2005/07/23 14:33:22 thomson * Port for win2k/NT added. * */ dibbler-1.0.1/Port-winnt2k/ClntService.cpp0000664000175000017500000001046412233256142015307 00000000000000/* * Dibbler - a portable DHCPv6 * * authors: Tomasz Mrugalski * Marek Senderski * win2k version by * * $Id: ClntService.cpp,v 1.2 2005-07-24 16:00:03 thomson Exp $ * * Released under GNU GPL v2 licence * */ #include "ClntService.h" #include "DHCPClient.h" #include "portable.h" #include "logger.h" #include "DHCPConst.h" #include TDHCPClient * clntPtr; TClntService StaticService; TClntService::TClntService() :TWinService("DHCPv6Client","Dibbler - a DHCPv6 client",SERVICE_AUTO_START, "RpcSS\0tcpip6\0winmgmt\0", "Dibbler - a portable DHCPv6. This is DHCPv6 client," " version " DIBBLER_VERSION ".") { } EServiceState TClntService::ParseStandardArgs(int argc,char* argv[]) { bool dirFound=false; EServiceState status = INVALID; int n=1; while(nstop(); } void TClntService::OnStop() { clntPtr->stop(); } bool TClntService::CheckAndInstall() { // NT4 does not have winmgmt... OSVERSIONINFO verinfo; verinfo.dwOSVersionInfoSize=sizeof(OSVERSIONINFO); if(GetVersionEx(&verinfo) && (verinfo.dwMajorVersion < 5)) { Dependencies="RpcSS\0tcpip6\0"; } return Install(); } void TClntService::Run() { if (_chdir(this->ServiceDir.c_str())) { Log(Crit) << "Unable to change directory to " << this->ServiceDir << ". Aborting.\n" << LogEnd; return; } string confile = CLNTCONF_FILE; string oldconf = CLNTCONF_FILE+(string)"-old"; string workdir = this->ServiceDir; string addrfile = CLNTADDRMGR_FILE; string logFile = CLNTLOG_FILE; logger::setLogName("Client"); logger::Initialize((char*)logFile.c_str()); Log(Crit) << DIBBLER_COPYRIGHT1 << "(CLIENT, WinNT/2000 port)" << LogEnd; TDHCPClient client(workdir+"\\"+confile); clntPtr = &client; // remember address client.setWorkdir(this->ServiceDir); if (!client.isDone()) client.run(); } void TClntService::setState(EServiceState status) { this->status = status; } TClntService::~TClntService(void) { } /* * $Log: not supported by cvs2svn $ * Revision 1.1 2005/07/23 14:33:22 thomson * Port for win2k/NT added. * */ dibbler-1.0.1/Port-winnt2k/server.log0000664000175000017500000000000012233256142014354 00000000000000dibbler-1.0.1/Port-winnt2k/dibbler-server.ico0000664000175000017500000000566612233256142015775 00000000000000 è& ¨( @€€€€€€€€€ÀÀÀ€€€ÿÿÿÿÿÿÿÿÿÿÿÿÌÌÌÌ ÌÌÌÌÌÌÀ" ÌÌÌÌÌÌ À"" ÌÌÌÌÀ Ì*¢¢ ÌÌÌÀ`ÌÀª**" ÌÌÌÌ Ì*ªª¢¢ ÌÌÌÌÌ"*ªªª" ÌÌÌÌÀ" ªªªª¢" ÌÌ "" §ªªª¢"ÎÀ """ zzªª""ììÂ"""""§§§ª¢".ÎÎÂbb"""§zzª".îîìâ&&"" ¯w§ª.îîîîÂrbb""zwzz¢îîîî'f&""" §w¢.îîîâvgbb"" ú§®îîîîî'"v&&" ÿúîîîîîîâÌ"rb" ÿïîîîîîâîìÌ'f" ÿþþ"îîî". Ì'f"ÿÿâ".îîâ⢠Âr"ÿþò¢.îîîî* Ì""ò*¢"îîîîâ¢ÌÌ *ª¢".îîîî,ÌÌÀ zª""îîîîìì̧÷ªª".â,îîÌÀ zª¢""",î̧÷ªªª¢""ÌÌ §÷ªªª¢",À ªzªª" ªªªªÿðÿÿ€ÿþü?øðàÀÀ€€€€€€ÀÀàðøü?þÿ€ÿÿðÿ( @€€€€€€€€€ÀÀÀÀÜÀðʦÔðÿ±âÿŽÔÿkÆÿH¸ÿ%ªÿªÿ’Üz¹b–Js2PÔãÿ±ÇÿŽ«ÿkÿHsÿ%WÿUÿIÜ=¹1–%sPÔÔÿ±±ÿŽŽÿkkÿHHÿ%%ÿþܹ–sPãÔÿDZÿ«ŽÿkÿsHÿW%ÿUÿIÜ=¹1–%sPðÔÿâ±ÿÔŽÿÆkÿ¸Hÿª%ÿªÿ’Üz¹b–Js2PÿÔÿÿ±ÿÿŽÿÿkÿÿHÿÿ%ÿþþÜܹ¹––ssPPÿÔðÿ±âÿŽÔÿkÆÿH¸ÿ%ªÿªÜ’¹z–bsJP2ÿÔãÿ±ÇÿŽ«ÿkÿHsÿ%WÿUÜI¹=–1s%PÿÔÔÿ±±ÿŽŽÿkkÿHHÿ%%þܹ–sPÿãÔÿDZÿ«ŽÿkÿsHÿW%ÿUÜI¹=–1s%PÿðÔÿâ±ÿÔŽÿÆkÿ¸Hÿª%ÿªÜ’¹z–bsJP2ÿÿÔÿÿ±ÿÿŽÿÿkÿÿHÿÿ%þþÜܹ¹––ssPPðÿÔâÿ±ÔÿŽÆÿk¸ÿHªÿ%ªÿ’Üz¹b–Js2PãÿÔÇÿ±«ÿŽÿksÿHWÿ%UÿIÜ=¹1–%sPÔÿÔ±ÿ±ŽÿŽkÿkHÿH%ÿ%þܹ–sPÔÿã±ÿÇŽÿ«kÿHÿs%ÿWÿUÜI¹=–1s%PÔÿð±ÿâŽÿÔkÿÆHÿ¸%ÿªÿªÜ’¹z–bsJP2Ôÿÿ±ÿÿŽÿÿkÿÿHÿÿ%ÿÿþþÜܹ¹––ssPPòòòæææÚÚÚÎÎζ¶¶ªªªžžž’’’†††zzznnnbbbVVVJJJ>>>222&&&ðûÿ¤  €€€ÿÿÿÿÿÿÿÿÿÿÿÿ~~~~~~~~~~~~~~~o~o~~~~½Çǽoooooooo~o~~½~~½ÇÇÇǽooo{o{oooo½Õ½~~½®®Ç®Çǽ½o{{o{ooo½«½~~~Ç®®Ç®Ç®ÇÇǽ{{{o{ooo½ooo½½Ç««®®®®Ç®Çǽ{{{{{{o{oo½½Õսǫ®«®®®®ÇÇǽ{{{{{{{oo½¼¼¼½Õ®«««®«®«®®ÇÇǽ{{{{{½o½Ç¼¼¼¼Õ½®«²««®«®®®ÇÇǽˆ{ˆ{½Ç½Ç¼Ç¼¼¼½Õ®²«²««®«®ÇÇÇÕˆ{ˆ{{ÕÇÇÇǼǼ¼¼Õ®²«²«²««®Çǽ½ˆ{ˆ{ˆ{Õ«¯«ÇǼǼ¼Õ½®²²«²«««Ç½½ˆˆˆˆˆˆ{ˆÕ¯«¯«¼Ç¼Ç¼½Õ®â²²«²««½†ˆ†ˆˆˆˆˆˆ{Õ²¯«¯«¼Ç¼¼¼½ ®²²²«²««½†ˆ†ˆ†ˆˆˆÕ²««¯«¯Ç¼Ç¼¼Õ Ž®²²²«½½†††ˆ†ˆ†ˆÕ²««²«¯«¯¯¼Ç¼Õ ŽŽ®®²®†“††††ˆ†ˆ†ˆÕ²¼¼²«¯«¯«Ç¼Õ âŽŽŽ®““†“††††ˆ†ˆ†ˆÕ{{¼¼²¯«¯Ç¼Õ Žâޓޓ““††††††ˆ†Õˆˆˆ{{{¼²««ÇÇÕ ŽâޓޓÕÕ††††ˆ“¼ÕÕ†Õ½{{¼²««ÇÇ âŽâŽ“ÕÇÇÕ†††††“¼†¼®Õ½{{¼²ÇǼ ŽâŽ“ŽÕ®ÇÕˆ††††ˆ†ˆ†¼®Õ½{{¼¼Ç¼ ŽâÕÕ®®ÇÇÕˆ††††ˆ†ˆ†¼®¼{{{{¼ âÕ«««®ÇÇÇÕˆ††††ˆ†ˆ†¼{{{{{{®²â²«®®ÇÇÇÕˆ††ˆ†ˆˆˆ†{ˆ{{{®²â²«®®®ÇÇÕˆ†ÕÕ{ˆˆˆˆ{{{®²â²««®®ÇÇÕÕÇÇÕÕ{ˆˆ{{®²â²«««®®®®ÇÇÇÇÕ{{{{®®²â²««««®®®ÇÇÇÕ{{®®®²â²«««®®ÇÇÕ®®®®®®®®ÿðÿÿ€ÿþü?øðàÀÀ€€€€€€ÀÀàðøü?þÿ€ÿÿðÿdibbler-1.0.1/Port-winnt2k/WinService.cpp0000664000175000017500000003562112233256142015146 00000000000000/* * Dibbler - a portable DHCPv6 * * authors: Tomasz Mrugalski * Marek Senderski * win2k version by * * based on WinService.cpp,v 1.14 2005/02/01 22:39:20 thomson Exp $ * * $Id: WinService.cpp,v 1.4 2008-09-22 17:08:53 thomson Exp $ * * Released under GNU GPL v2 licence * */ #include #include #include "winservice.h" #include "Logger.h" TWinService* TWinService::ServicePtr= NULL; TWinService::TWinService(const char* serviceName, const char* dispName, DWORD serviceType, char* dependencies, char * descr) { ServicePtr= this; strncpy(ServiceName, serviceName, sizeof(ServiceName)-1); ServiceType=serviceType; Dependencies=dependencies; MajorVersion = 1; MinorVersion = 0; EventSource = NULL; this->descr = descr; // set service status hServiceStatus = (SERVICE_STATUS_HANDLE)NULL; Status.dwServiceType = SERVICE_WIN32_OWN_PROCESS; Status.dwCurrentState = SERVICE_STOPPED; Status.dwControlsAccepted = SERVICE_ACCEPT_STOP; Status.dwWin32ExitCode = 0; Status.dwServiceSpecificExitCode = 0; Status.dwCheckPoint = 0; Status.dwWaitHint = 0; IsRunning = FALSE; DisplayName=new char[strlen(dispName)+1]; strcpy(DisplayName,dispName); } TWinService::~TWinService(void) { if (EventSource) DeregisterEventSource(EventSource); } void TWinService::ServiceMain(DWORD dwArgc, LPTSTR* lpszArgv) { // Get a pointer to the C++ object TWinService* pService = ServicePtr; // Register the control request handler pService->Status.dwCurrentState = SERVICE_START_PENDING; pService->hServiceStatus = RegisterServiceCtrlHandler(pService->ServiceName,Handler); if (pService->hServiceStatus==(SERVICE_STATUS_HANDLE)NULL) { return; } // Start the initialisation if (pService->Initialize()) { // Do the real work. // When the Run function returns, the service has stopped. pService->IsRunning = TRUE; pService->Status.dwWin32ExitCode = 0; pService->Status.dwCheckPoint = 0; pService->Status.dwWaitHint = 0; pService->Run(); } // Tell the service manager we are stopped pService->SetStatus(SERVICE_STOPPED); } void TWinService::Handler(DWORD dwOpcode) { //DebugBreak(); // Get a pointer to the object TWinService* pService = ServicePtr; switch (dwOpcode) { case SERVICE_CONTROL_STOP: // 1 pService->SetStatus(SERVICE_STOP_PENDING); pService->OnStop(); pService->SetStatus(SERVICE_STOPPED); pService->IsRunning = FALSE; break; case SERVICE_CONTROL_PAUSE: // 2 pService->OnPause(); break; case SERVICE_CONTROL_CONTINUE: // 3 pService->OnContinue(); break; case SERVICE_CONTROL_INTERROGATE: // 4 pService->OnInterrogate(); break; case SERVICE_CONTROL_SHUTDOWN: // 5 pService->OnShutdown(); break; default: if (dwOpcode >= SERVICE_CONTROL_USER) { if (!pService->OnUserControl(dwOpcode)) { } } else { } break; } // Report current status SetServiceStatus(pService->hServiceStatus, &pService->Status); } void TWinService::LogEvent(WORD wType, DWORD dwID, const char* pszS1, const char* pszS2, const char* pszS3) { const char* ps[3]; ps[0] = pszS1; ps[1] = pszS2; ps[2] = pszS3; int iStr = 0; for (int i = 0; i < 3; i++) if (ps[i] != NULL) iStr++; // Check the event source has been registered and if // not then register it now if (!EventSource) EventSource = ::RegisterEventSource(NULL,ServiceName); if (EventSource) ReportEvent(EventSource,wType,0,dwID,NULL,iStr,0,ps,NULL); } bool TWinService::IsInstalled() { return this->IsInstalled(this->ServiceName); } bool TWinService::IsInstalled(const char *name) { bool result = false; // Open the Service Control Manager SC_HANDLE hSCM = ::OpenSCManager(NULL, // local machine NULL, // ServicesActive database SC_MANAGER_ALL_ACCESS); // full access if (hSCM) { // Try to open the service SC_HANDLE hService = OpenService(hSCM,name,SERVICE_QUERY_CONFIG); if (hService) { result = true; CloseServiceHandle(hService); } CloseServiceHandle(hSCM); } return result; } bool TWinService::Install() { if (this->IsInstalled()) { Log(Crit) << "Service " << ServiceName << " is already installed." << LogEnd; return false; } // Open the Service Control Manager SC_HANDLE hSCM = ::OpenSCManager(NULL, // local machine NULL, // ServicesActive database SC_MANAGER_ALL_ACCESS); // full access if (!hSCM) return false; // Get the executable file path char filePath[_MAX_PATH]; GetModuleFileName(NULL, filePath, sizeof(filePath)); int i = strlen(filePath); sprintf(filePath+i, " service -d \"%s\"",ServiceDir.c_str()); // Create the service //printf("Install(): filepath=[%s]\nServiceName=[%s]\n",filePath,ServiceName); //printf("ServiceDir=[%s]\n",ServiceDir.c_str()); SC_HANDLE hService = CreateService( hSCM,ServiceName, DisplayName, SERVICE_ALL_ACCESS, SERVICE_WIN32_OWN_PROCESS, ServiceType, SERVICE_ERROR_NORMAL, filePath,NULL,NULL,Dependencies,NULL,NULL); if (!hService) { CloseServiceHandle(hSCM); Log(Crit) << "Unable to create " << ServiceName << " service." << LogEnd; return FALSE; } /* Not available on NT4 -> disabled - we can live without this... SERVICE_DESCRIPTION sdBuf; sdBuf.lpDescription = this->descr; ChangeServiceConfig2(hService,SERVICE_CONFIG_DESCRIPTION, &sdBuf ); */ CloseServiceHandle(hService); CloseServiceHandle(hSCM); Log(Notice) << "Service " << ServiceName << " has been installed." << LogEnd; return true; } bool TWinService::Uninstall() { if (this->isRunning()) { Log(Crit) << "Unable to stop. Service " << ServiceName << " is running." << LogEnd; return false; } if (!this->IsInstalled()) { Log(Crit) << "Service " << ServiceName << " is not installed." << LogEnd; return false; } // Open the Service Control Manager SC_HANDLE hSCM = OpenSCManager(NULL,NULL,SC_MANAGER_ALL_ACCESS); if (!hSCM) { Log(Crit) << "Unable to open Service Control Manager." << LogEnd; return false; } bool result = false; SC_HANDLE hService = ::OpenService(hSCM,ServiceName,DELETE); if (!hService) { Log(Crit) << "Unable to open " << ServiceName << " service for deletion." << LogEnd; CloseServiceHandle(hSCM); return false; } if (!DeleteService(hService)) { Log(Crit) << "Unable to delete " << ServiceName << " service." << LogEnd; CloseServiceHandle(hService); CloseServiceHandle(hSCM); return false; } CloseServiceHandle(hService); CloseServiceHandle(hSCM); Log(Notice) << "Service " << ServiceName << " has been uninstalled." << LogEnd; return result; } /* this method is called when service is being started (by service itself) */ bool TWinService::RunService() { SERVICE_TABLE_ENTRY st[] = { {ServiceName, ServiceMain}, {NULL, NULL} }; BOOL result = StartServiceCtrlDispatcher(st); return result?true:false; } /* this method is called from console, when someone wants to start service */ bool TWinService::StartService() { if (!IsInstalled()) { Log(Crit) << "Unable to start. Service " << ServiceName << " is not installed." << LogEnd; return false; } // open a handle to the SCM SC_HANDLE handle = ::OpenSCManager( NULL, NULL, SC_MANAGER_ALL_ACCESS ); if(!handle) { Log(Crit) << "Could not connect to SCM dataase" << LogEnd; return false; } // open a handle to the service SC_HANDLE service = ::OpenService( handle, ServiceName, GENERIC_EXECUTE ); if(!service) { ::CloseServiceHandle( handle ); Log(Crit) << "Could not get handle to " << ServiceName << " service" << LogEnd; return false; } // and start the service! if( !::StartService( service, 0, NULL ) ) { Log(Crit) << "Service " << ServiceName << " startup failed." << LogEnd; ::CloseServiceHandle( service ); ::CloseServiceHandle( handle ); return false; } Log(Notice) << "Service " << ServiceName << " started." << LogEnd; ::CloseServiceHandle( service ); ::CloseServiceHandle( handle ); return true; } bool TWinService::StopService() { if (!IsInstalled()) { Log(Crit) << "Unable to stop. Service " << ServiceName << " is not installed." << LogEnd; return false; } // open a handle to the SCM SC_HANDLE handle = ::OpenSCManager( NULL, NULL, SC_MANAGER_ALL_ACCESS ); if(!handle) { Log(Crit) << "Could not connect to SCM database" << LogEnd; return false; } // open a handle to the service SC_HANDLE service = ::OpenService( handle, ServiceName, GENERIC_EXECUTE ); if(!service) { ::CloseServiceHandle( handle ); Log(Crit) << "Unable to open service " << ServiceName << LogEnd; return false; } // send the STOP control request to the service SERVICE_STATUS status; ::ControlService( service, SERVICE_CONTROL_STOP, &status ); ::CloseServiceHandle( service ); ::CloseServiceHandle( handle ); if (status.dwCurrentState == SERVICE_STOP_PENDING) { Log(Notice) << "Service " << ServiceName << " stop process initialized." << LogEnd; return true; } if( status.dwCurrentState != SERVICE_STOPPED ) { Log(Crit) << "Service " << ServiceName << " stop failed." << LogEnd; return false; } Log(Notice) << "Service " << ServiceName << " stopped." << LogEnd; return true; } void TWinService::SetStatus(DWORD dwState) { Status.dwCurrentState = dwState; SetServiceStatus(hServiceStatus, &Status); } bool TWinService::Initialize() { // Start the initialization SetStatus(SERVICE_START_PENDING); // Perform the actual initialization bool result = OnInit(); // Set final state Status.dwWin32ExitCode = GetLastError(); Status.dwCheckPoint = 0; Status.dwWaitHint = 0; if (!result) { SetStatus(SERVICE_STOPPED); return false; } SetStatus(SERVICE_RUNNING); return true; } void TWinService::Run() { printf("WinService::Run()\n"); return; while (IsRunning) { Sleep(1000); } } bool TWinService::OnInit() { return true; } void TWinService::OnStop() { } void TWinService::OnInterrogate() { } void TWinService::OnPause() { } void TWinService::OnContinue() { } void TWinService::OnShutdown() { } bool TWinService::OnUserControl(DWORD dwOpcode) { return false; } int TWinService::getStatus() { return this->Status.dwCurrentState; } bool TWinService::isRunning() { return this->isRunning(this->ServiceName); } bool TWinService::isRunning(const char * name) { DWORD state = 0; // Open the Service Control Manager SC_HANDLE hSCM = ::OpenSCManager(NULL,NULL,SC_MANAGER_ALL_ACCESS); if (!hSCM) { //Log(Crit) << "Unable to open Service Control Manager." << LogEnd; return false; } // Try to open the service SC_HANDLE hService = OpenService(hSCM,name, GENERIC_READ); if (!hService) { //Log(Crit) << "Unable to open " << name << " service." << LogEnd; CloseServiceHandle(hSCM); return false; } SERVICE_STATUS service; LPSERVICE_STATUS ptr = &service; memset((void*)&service,0, sizeof(SERVICE_STATUS) ); if (QueryServiceStatus(hService, ptr)) { state = ptr->dwCurrentState; } CloseServiceHandle(hService); CloseServiceHandle(hSCM); switch (state) { case SERVICE_STOPPED: return false; case SERVICE_RUNNING: return true; case SERVICE_START_PENDING: default: return false; } return false; } void TWinService::showStatus() { bool serverInst, clientInst, relayInst; bool serverRun, clientRun, relayRun; serverInst = this->IsInstalled("DHCPv6Server"); clientInst = this->IsInstalled("DHCPv6Client"); relayInst = this->IsInstalled("DHCPv6Relay"); relayRun = this->isRunning("DHCPV6Relay"); serverRun = this->isRunning("DHCPv6Server"); clientRun = this->isRunning("DHCPv6Client"); Log(Notice) << "Dibbler server : " << (serverInst? "INSTALLED":"NOT INSTALLED") << ", " << (serverRun ? "RUNNING":"NOT RUNNING") << LogEnd; Log(Notice) << "Dibbler client : " << (clientInst? "INSTALLED":"NOT INSTALLED") << ", " << (clientRun ? "RUNNING":"NOT RUNNING") << LogEnd; Log(Notice) << "Dibbler relay : " << (relayInst ? "INSTALLED":"NOT INSTALLED") << ", " << (relayRun ? "RUNNING":"NOT RUNNING") << LogEnd; } bool TWinService::verifyPort() { // does this proper Dibbler port for this windows? OSVERSIONINFO verinfo; verinfo.dwOSVersionInfoSize=sizeof(OSVERSIONINFO); GetVersionEx(&verinfo); bool ok=false; if (verinfo.dwMajorVersion<5) { Log(Notice) << "Windows NT detected (major=" << verinfo.dwMajorVersion << ", minor=" << verinfo.dwMinorVersion << "), so this is proper port." << LogEnd; ok = true; } if ((verinfo.dwMajorVersion==5) && (verinfo.dwMinorVersion==0)) { Log(Notice) << "Windows 2000 detected (major=" << verinfo.dwMajorVersion << ", minor=" << verinfo.dwMinorVersion << "), so this is proper port." << LogEnd; ok = true; } if (!ok) { Log(Warning) << "Unsupported operating system detected (major=" << verinfo.dwMajorVersion << ", minor=" << verinfo.dwMinorVersion << ")." << LogEnd; Log(Notice) << "Supported systems:" << LogEnd; Log(Notice) << "Windows NT4: major<5 minor=0" << LogEnd; Log(Notice) << "Windows 2000: major=5 minor=0" << LogEnd; Log(Notice) << "Unsupported systems (there's specific Dibbler version for recent systems):" << LogEnd; Log(Notice) << "Windows XP: major=5 minor=1" << LogEnd; Log(Notice) << "Windows 2003: major=5 minor=2" << LogEnd; Log(Notice) << "Windows Vista: major=6 minor=0" << LogEnd; } return ok; } /* * $Log: not supported by cvs2svn $ * Revision 1.3 2005-07-26 00:03:03 thomson * Preparation for relase 0.4.1 * * Revision 1.2 2005/07/24 16:00:03 thomson * Port WinNT/2000 related changes. * * Revision 1.1 2005/07/23 14:33:22 thomson * Port for win2k/NT added. * */ dibbler-1.0.1/Port-winnt2k/dibbler-server.dev0000664000175000017500000004556112233256142015777 00000000000000[Project] FileName=dibbler-server.dev Name=dibbler-server UnitCount=130 Type=1 Ver=1 ObjFiles= Includes=..\AddrMgr;..\CfgMgr;..\SrvAddrMgr;..\SrvCfgMgr;..\SrvIfaceMgr;..\SrvMessages;..\SrvOptions;..\SrvTransMgr;..\IfaceMgr;..\Messages;..\Misc;..\Options;..\Port-winnt2k;..\TransMgr;..\poslib\poslib;..\Port-winnt2k;..\Port-winnt2k\CVS Libs= PrivateResource=dibbler-server_private.rc ResourceIncludes= MakeIncludes= Compiler=-DMINGWBUILD -funsigned-char_@@_ CppCompiler=-DMINGWBUILD -funsigned-char_@@_ Linker=-lws2_32_@@_ IsCpp=1 Icon=dibbler-server.ico ExeOutput= ObjectOutput= OverrideOutput=0 OverrideOutputName=dibbler-server.exe HostApplication= Folders=AddrMgr,CfgMgr,IfaceMgr,Messages,Misc,Options,Port-winnt2k,poslib,SrvAddrMgr,SrvCfgMgr,SrvIfaceMgr,SrvMessages,SrvOptions,SrvTransMgr CommandLine=run UseCustomMakefile=0 CustomMakefile= IncludeVersionInfo=0 SupportXPThemes=0 CompilerSet=0 CompilerSettings=0000000000000000000000 [Unit1] FileName=WinService.cpp CompileCpp=1 Folder=Port-winnt2k Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit6] FileName=..\Misc\IPv6Addr.cpp CompileCpp=1 Folder=Misc Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [VersionInfo] Major=0 Minor=1 Release=1 Build=1 LanguageID=1033 CharsetID=1252 CompanyName= FileVersion= FileDescription=Developed using the Dev-C++ IDE InternalName= LegalCopyright= LegalTrademarks= OriginalFilename= ProductName= ProductVersion= AutoIncBuildNr=0 [Unit3] FileName=..\Misc\Logger.cpp CompileCpp=1 Folder=Misc Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit5] FileName=..\Misc\DUID.cpp CompileCpp=1 Folder=Misc Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit10] FileName=..\IfaceMgr\IfaceMgr.cpp CompileCpp=1 Folder=IfaceMgr Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit11] FileName=..\CfgMgr\CfgMgr.cpp CompileCpp=1 Folder=CfgMgr Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit7] FileName=..\Messages\Msg.cpp CompileCpp=1 Folder=Messages Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit9] FileName=..\IfaceMgr\Iface.cpp CompileCpp=1 Folder=IfaceMgr Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit14] FileName=..\SrvCfgMgr\SrvCfgAddrClass.cpp CompileCpp=1 Folder=SrvCfgMgr Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit16] FileName=..\SrvCfgMgr\SrvCfgMgr.cpp CompileCpp=1 Folder=SrvCfgMgr Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit20] FileName=..\SrvCfgMgr\SrvParsGlobalOpt.cpp CompileCpp=1 Folder=SrvCfgMgr Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit21] FileName=..\SrvIfaceMgr\SrvIfaceMgr.cpp CompileCpp=1 Folder=SrvIfaceMgr Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit24] FileName=..\AddrMgr\AddrAddr.cpp CompileCpp=1 Folder=AddrMgr Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit25] FileName=..\AddrMgr\AddrClient.cpp CompileCpp=1 Folder=AddrMgr Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit26] FileName=..\AddrMgr\AddrIA.cpp CompileCpp=1 Folder=AddrMgr Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit27] FileName=..\SrvTransMgr\SrvTransMgr.cpp CompileCpp=1 Folder=SrvTransMgr Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit28] FileName=..\Options\OptVendorSpecInfo.cpp CompileCpp=1 Folder=Options Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit29] FileName=..\Options\Opt.cpp CompileCpp=1 Folder=Options Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit30] FileName=..\Options\OptAddr.cpp CompileCpp=1 Folder=Options Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit31] FileName=..\Options\OptAddrLst.cpp CompileCpp=1 Folder=Options Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit32] FileName=..\Options\OptElapsed.cpp CompileCpp=1 Folder=Options Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit33] FileName=..\Options\OptGeneric.cpp CompileCpp=1 Folder=Options Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit12] FileName=..\SrvAddrMgr\SrvAddrMgr.cpp CompileCpp=1 Folder=SrvAddrMgr Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit13] FileName=..\SrvCfgMgr\SrvParsIfaceOpt.cpp CompileCpp=1 Folder=SrvCfgMgr Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit15] FileName=..\SrvCfgMgr\SrvCfgIface.cpp CompileCpp=1 Folder=SrvCfgMgr Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit17] FileName=..\SrvCfgMgr\SrvLexer.cpp CompileCpp=1 Folder=SrvCfgMgr Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit18] FileName=..\SrvCfgMgr\SrvParsClassOpt.cpp CompileCpp=1 Folder=SrvCfgMgr Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit19] FileName=..\SrvCfgMgr\SrvParser.cpp CompileCpp=1 Folder=SrvCfgMgr Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit22] FileName=..\SrvIfaceMgr\SrvIfaceIface.cpp CompileCpp=1 Folder=SrvIfaceMgr Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit23] FileName=..\AddrMgr\AddrMgr.cpp CompileCpp=1 Folder=AddrMgr Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit34] FileName=..\Options\OptIA_NA.cpp CompileCpp=1 Folder=Options Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit35] FileName=..\Options\OptIAAddress.cpp CompileCpp=1 Folder=Options Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit36] FileName=..\Options\OptOptionRequest.cpp CompileCpp=1 Folder=Options Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit37] FileName=..\Options\OptPreference.cpp CompileCpp=1 Folder=Options Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit38] FileName=..\Options\OptRapidCommit.cpp CompileCpp=1 Folder=Options Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit39] FileName=..\Options\OptStatusCode.cpp CompileCpp=1 Folder=Options Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit40] FileName=..\Options\OptString.cpp CompileCpp=1 Folder=Options Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit41] FileName=..\Options\OptStringLst.cpp CompileCpp=1 Folder=Options Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit42] FileName=..\Options\OptUserClass.cpp CompileCpp=1 Folder=Options Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit43] FileName=..\Options\OptVendorClass.cpp CompileCpp=1 Folder=Options Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit44] FileName=..\SrvOptions\SrvOptClientIdentifier.cpp CompileCpp=1 Folder=SrvOptions Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit45] FileName=..\SrvOptions\SrvOptDNSServers.cpp CompileCpp=1 Folder=SrvOptions Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit46] FileName=..\SrvOptions\SrvOptDomainName.cpp CompileCpp=1 Folder=SrvOptions Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit47] FileName=..\SrvOptions\SrvOptElapsed.cpp CompileCpp=1 Folder=SrvOptions Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit48] FileName=..\SrvOptions\SrvOptFQDN.cpp CompileCpp=1 Folder=SrvOptions Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit49] FileName=..\SrvOptions\SrvOptIA_NA.cpp CompileCpp=1 Folder=SrvOptions Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit50] FileName=..\SrvOptions\SrvOptIAAddress.cpp CompileCpp=1 Folder=SrvOptions Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit51] FileName=..\SrvOptions\SrvOptInterfaceID.cpp CompileCpp=1 Folder=SrvOptions Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit52] FileName=..\SrvOptions\SrvOptLifetime.cpp CompileCpp=1 Folder=SrvOptions Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit53] FileName=..\SrvOptions\SrvOptNISDomain.cpp CompileCpp=1 Folder=SrvOptions Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit54] FileName=..\SrvOptions\SrvOptNISPDomain.cpp CompileCpp=1 Folder=SrvOptions Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit55] FileName=..\SrvOptions\SrvOptNISPServer.cpp CompileCpp=1 Folder=SrvOptions Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit56] FileName=..\SrvOptions\SrvOptNISServer.cpp CompileCpp=1 Folder=SrvOptions Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit57] FileName=..\SrvOptions\SrvOptNTPServers.cpp CompileCpp=1 Folder=SrvOptions Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit58] FileName=..\SrvOptions\SrvOptOptionRequest.cpp CompileCpp=1 Folder=SrvOptions Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit59] FileName=..\SrvOptions\SrvOptPreference.cpp CompileCpp=1 Folder=SrvOptions Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit60] FileName=..\SrvOptions\SrvOptRapidCommit.cpp CompileCpp=1 Folder=SrvOptions Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit61] FileName=..\SrvOptions\SrvOptServerIdentifier.cpp CompileCpp=1 Folder=SrvOptions Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit62] FileName=..\SrvOptions\SrvOptServerUnicast.cpp CompileCpp=1 Folder=SrvOptions Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit63] FileName=..\SrvOptions\SrvOptSIPDomain.cpp CompileCpp=1 Folder=SrvOptions Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit64] FileName=..\SrvOptions\SrvOptSIPServer.cpp CompileCpp=1 Folder=SrvOptions Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit65] FileName=..\SrvOptions\SrvOptStatusCode.cpp CompileCpp=1 Folder=SrvOptions Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit66] FileName=..\SrvOptions\SrvOptTimeZone.cpp CompileCpp=1 Folder=SrvOptions Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit67] FileName=..\SrvOptions\SrvOptUserClass.cpp CompileCpp=1 Folder=SrvOptions Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit68] FileName=..\SrvOptions\SrvOptVendorClass.cpp CompileCpp=1 Folder=SrvOptions Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit69] FileName=..\SrvMessages\SrvMsgSolicit.cpp CompileCpp=1 Folder=SrvMessages Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit70] FileName=..\SrvMessages\SrvMsg.cpp CompileCpp=1 Folder=SrvMessages Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit71] FileName=..\SrvMessages\SrvMsgAdvertise.cpp CompileCpp=1 Folder=SrvMessages Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit72] FileName=..\SrvMessages\SrvMsgConfirm.cpp CompileCpp=1 Folder=SrvMessages Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit73] FileName=..\SrvMessages\SrvMsgDecline.cpp CompileCpp=1 Folder=SrvMessages Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit74] FileName=..\SrvMessages\SrvMsgInfRequest.cpp CompileCpp=1 Folder=SrvMessages Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit75] FileName=..\SrvMessages\SrvMsgRebind.cpp CompileCpp=1 Folder=SrvMessages Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit76] FileName=..\SrvMessages\SrvMsgRelease.cpp CompileCpp=1 Folder=SrvMessages Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit77] FileName=..\SrvMessages\SrvMsgRenew.cpp CompileCpp=1 Folder=SrvMessages Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit78] FileName=..\SrvMessages\SrvMsgReply.cpp CompileCpp=1 Folder=SrvMessages Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit79] FileName=..\SrvMessages\SrvMsgRequest.cpp CompileCpp=1 Folder=SrvMessages Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit80] FileName=..\Misc\DHCPServer.cpp CompileCpp=1 Folder=Misc Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit81] FileName=SrvService.cpp CompileCpp=1 Folder=Port-winnt2k Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit82] FileName=server-winnt2k.cpp CompileCpp=1 Folder=Port-winnt2k Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit83] FileName=..\CfgMgr\StationRange.cpp CompileCpp=1 Folder=CfgMgr Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit84] FileName=..\Options\OptDUID.cpp CompileCpp=1 Folder=Options Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit85] FileName=..\SrvCfgMgr\SrvCfgTA.cpp CompileCpp=1 Folder=SrvCfgMgr Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit86] FileName=..\Options\OptFQDN.cpp CompileCpp=1 Folder=Options Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit87] FileName=..\SrvOptions\SrvOptTA.cpp CompileCpp=1 Folder=SrvOptions Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit4] FileName=..\Misc\DHCPConst.cpp CompileCpp=1 Folder=Misc Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit8] FileName=..\IfaceMgr\SocketIPv6.cpp CompileCpp=1 Folder=IfaceMgr Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit88] FileName=..\Misc\FQDN.cpp CompileCpp=1 Folder=Misc Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit89] FileName=..\IfaceMgr\DNSUpdate.cpp CompileCpp=1 Folder=IfaceMgr Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit90] FileName=..\Misc\addrpack.c CompileCpp=0 Folder=Misc Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd=$(CC) -c addrpack.c -o addrpack.o $(CFLAGS) [Unit91] FileName=..\Options\OptTA.cpp CompileCpp=1 Folder=Options Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit92] FileName=..\poslib\poslib\socket.cpp CompileCpp=1 Folder=poslib Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit93] FileName=..\poslib\poslib\dnsmessage.cpp CompileCpp=1 Folder=poslib Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit2] FileName=lowlevel-winnt2k.c CompileCpp=0 Folder=Port-winnt2k Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd=$(CC) -c lowlevel-winnt2k.c -o lowlevel-winnt2k.o $(CFLAGS) [Unit94] FileName=..\poslib\poslib\domainfn.cpp CompileCpp=1 Folder=poslib Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit95] FileName=..\poslib\poslib\exception.cpp CompileCpp=1 Folder=poslib Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit96] FileName=..\poslib\poslib\lexfn.cpp CompileCpp=1 Folder=poslib Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit97] FileName=..\poslib\poslib\masterfile.cpp CompileCpp=1 Folder=poslib Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit98] FileName=..\poslib\poslib\postime.cpp CompileCpp=1 Folder=poslib Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit99] FileName=..\poslib\poslib\random.cpp CompileCpp=1 Folder=poslib Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit100] FileName=..\poslib\poslib\resolver.cpp CompileCpp=1 Folder=poslib Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit101] FileName=..\poslib\poslib\rr.cpp CompileCpp=1 Folder=poslib Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit102] FileName=..\AddrMgr\AddrPrefix.cpp CompileCpp=1 Folder=AddrMgr Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit103] FileName=..\Options\OptInteger.cpp CompileCpp=1 Folder=Options Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit104] FileName=..\Options\OptIA_PD.cpp CompileCpp=1 Folder=Options Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit105] FileName=..\Options\OptIAPrefix.cpp CompileCpp=1 Folder=Options Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit106] FileName=..\SrvOptions\SrvOptVendorSpec.cpp CompileCpp=1 Folder=SrvOptions Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit107] FileName=..\SrvCfgMgr\SrvCfgPD.cpp CompileCpp=1 Folder=SrvCfgMgr Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit108] FileName=..\SrvOptions\SrvOptIA_PD.cpp CompileCpp=1 Folder=SrvOptions Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit109] FileName=..\SrvOptions\SrvOptIAPrefix.cpp CompileCpp=1 Folder=SrvOptions Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit110] FileName=..\Misc\hmac-sha-md5.c CompileCpp=1 Folder=Misc Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit111] FileName=..\Misc\md5.c CompileCpp=0 Folder=Misc Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd=$(CC) -c md5.c -o md5.o $(CFLAGS) [Unit112] FileName=..\Misc\sha1.c CompileCpp=0 Folder=Misc Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd=$(CC) -c sha1.c -o sha1.o $(CFLAGS) [Unit113] FileName=..\Misc\sha256.c CompileCpp=0 Folder=Misc Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd=$(CC) -c sha256.c -o sha256.o $(CFLAGS) [Unit114] FileName=..\Misc\sha512.c CompileCpp=0 Folder=Misc Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd=$(CC) -c sha512.c -o sha512.o $(CFLAGS) [Unit115] FileName=..\SrvCfgMgr\SrvCfgOptions.cpp CompileCpp=1 Folder=SrvCfgMgr Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit116] FileName=..\SrvOptions\SrvOptAuthentication.cpp CompileCpp=1 Folder=SrvOptions Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit117] FileName=..\Options\OptAuthentication.cpp CompileCpp=1 Folder=Options Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit118] FileName=..\SrvOptions\SrvOptAddrParams.cpp CompileCpp=1 Folder=SrvOptions Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit119] FileName=..\Misc\KeyList.cpp CompileCpp=1 Folder=Misc Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit120] FileName=..\poslib\poslib\w32poll.cpp CompileCpp=1 Folder=poslib Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit121] FileName=..\SrvOptions\SrvOptGeneric.cpp CompileCpp=1 Folder=SrvOptions Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit122] FileName=..\SrvOptions\SrvOptRemoteID.cpp CompileCpp=1 Folder=SrvOptions Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit123] FileName=..\SrvOptions\SrvOptEcho.cpp CompileCpp=1 Folder=SrvOptions Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit124] FileName=..\SrvOptions\SrvOptAAAAuthentication.cpp CompileCpp=1 Folder=SrvOptions Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit125] FileName=..\SrvOptions\SrvOptLQ.cpp CompileCpp=1 Folder=SrvOptions Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit126] FileName=..\SrvMessages\SrvMsgLeaseQuery.cpp CompileCpp=1 Folder=SrvMessages Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit127] FileName=..\SrvMessages\SrvMsgLeaseQueryReply.cpp CompileCpp=1 Folder=SrvMessages Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit128] FileName=..\Options\OptAAAAuthentication.cpp CompileCpp=1 Folder=Options Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit129] FileName=..\SrvOptions\SrvOptKeyGeneration.cpp CompileCpp=1 Folder=SrvOptions Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit130] FileName=..\Options\OptKeyGeneration.cpp CompileCpp=1 Folder=Options Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= dibbler-1.0.1/Port-winnt2k/Makefile.win0000664000175000017500000001147012233256142014614 00000000000000# Project: dibbler-requestor # Makefile created by Dev-C++ 4.9.9.2 CPP = g++.exe CC = gcc.exe WINDRES = windres.exe RES = dibbler-relay_private.res OBJ = lowlevel-winnt2k.o ../Misc/Logger.o ../Misc/DHCPConst.o ../Misc/DUID.o ../Misc/IPv6Addr.o ../Messages/Msg.o ../IfaceMgr/SocketIPv6.o ../IfaceMgr/Iface.o ../IfaceMgr/IfaceMgr.o ../CfgMgr/CfgMgr.o ../Options/Opt.o ../Options/OptGeneric.o ../Misc/addrpack.o ../Requestor/Requestor.o ../Requestor/ReqCfgMgr.o ../Requestor/ReqMsg.o ../Requestor/ReqOpt.o ../Requestor/ReqOpts.o ../Requestor/ReqTransMgr.o ../Options/OptDUID.o ../Options/OptIAAddress.o ../Misc/KeyList.o $(RES) LINKOBJ = lowlevel-winnt2k.o ../Misc/Logger.o ../Misc/DHCPConst.o ../Misc/DUID.o ../Misc/IPv6Addr.o ../Messages/Msg.o ../IfaceMgr/SocketIPv6.o ../IfaceMgr/Iface.o ../IfaceMgr/IfaceMgr.o ../CfgMgr/CfgMgr.o ../Options/Opt.o ../Options/OptGeneric.o ../Misc/addrpack.o ../Requestor/Requestor.o ../Requestor/ReqCfgMgr.o ../Requestor/ReqMsg.o ../Requestor/ReqOpt.o ../Requestor/ReqOpts.o ../Requestor/ReqTransMgr.o ../Options/OptDUID.o ../Options/OptIAAddress.o ../Misc/KeyList.o $(RES) LIBS = -L"C:/Dev-Cpp/lib" -lws2_32 INCS = -I"C:/Dev-Cpp/include" -I"../AddrMgr" -I"../CfgMgr" -I"../IfaceMgr" -I"../Messages" -I"../Misc" -I"../Options" -I"../Port-winnt2k" -I"../RelCfgMgr" -I"../RelIfaceMgr" -I"../RelMessages" -I"../RelOptions" -I"../RelTransMgr" -I"../TransMgr" CXXINCS = -I"C:/Dev-Cpp/lib/gcc/mingw32/3.4.2/include" -I"C:/Dev-Cpp/include/c++/3.4.2/backward" -I"C:/Dev-Cpp/include/c++/3.4.2/mingw32" -I"C:/Dev-Cpp/include/c++/3.4.2" -I"C:/Dev-Cpp/include" -I"../AddrMgr" -I"../CfgMgr" -I"../IfaceMgr" -I"../Messages" -I"../Misc" -I"../Options" -I"../Port-winnt2k" -I"../RelCfgMgr" -I"../RelIfaceMgr" -I"../RelMessages" -I"../RelOptions" -I"../RelTransMgr" -I"../TransMgr" BIN = dibbler-requestor.exe CXXFLAGS = $(CXXINCS) -D_GLIBCXX_USE_C99_DYNAMIC -DMINGWBUILD -funsigned-char CFLAGS = $(INCS) -DMINGWBUILD -funsigned-char RM = rm -f .PHONY: all all-before all-after clean clean-custom all: all-before dibbler-requestor.exe all-after clean: clean-custom ${RM} $(OBJ) $(BIN) $(BIN): $(OBJ) $(CPP) $(LINKOBJ) -o "dibbler-requestor.exe" $(LIBS) lowlevel-winnt2k.o: lowlevel-winnt2k.c $(CC) -c lowlevel-winnt2k.c -o lowlevel-winnt2k.o $(CFLAGS) ../Misc/Logger.o: ../Misc/Logger.cpp $(CPP) -c ../Misc/Logger.cpp -o ../Misc/Logger.o $(CXXFLAGS) ../Misc/DHCPConst.o: ../Misc/DHCPConst.cpp $(CPP) -c ../Misc/DHCPConst.cpp -o ../Misc/DHCPConst.o $(CXXFLAGS) ../Misc/DUID.o: ../Misc/DUID.cpp $(CPP) -c ../Misc/DUID.cpp -o ../Misc/DUID.o $(CXXFLAGS) ../Misc/IPv6Addr.o: ../Misc/IPv6Addr.cpp $(CPP) -c ../Misc/IPv6Addr.cpp -o ../Misc/IPv6Addr.o $(CXXFLAGS) ../Messages/Msg.o: ../Messages/Msg.cpp $(CPP) -c ../Messages/Msg.cpp -o ../Messages/Msg.o $(CXXFLAGS) ../IfaceMgr/SocketIPv6.o: ../IfaceMgr/SocketIPv6.cpp $(CPP) -c ../IfaceMgr/SocketIPv6.cpp -o ../IfaceMgr/SocketIPv6.o $(CXXFLAGS) ../IfaceMgr/Iface.o: ../IfaceMgr/Iface.cpp $(CPP) -c ../IfaceMgr/Iface.cpp -o ../IfaceMgr/Iface.o $(CXXFLAGS) ../IfaceMgr/IfaceMgr.o: ../IfaceMgr/IfaceMgr.cpp $(CPP) -c ../IfaceMgr/IfaceMgr.cpp -o ../IfaceMgr/IfaceMgr.o $(CXXFLAGS) ../CfgMgr/CfgMgr.o: ../CfgMgr/CfgMgr.cpp $(CPP) -c ../CfgMgr/CfgMgr.cpp -o ../CfgMgr/CfgMgr.o $(CXXFLAGS) ../Options/Opt.o: ../Options/Opt.cpp $(CPP) -c ../Options/Opt.cpp -o ../Options/Opt.o $(CXXFLAGS) ../Options/OptGeneric.o: ../Options/OptGeneric.cpp $(CPP) -c ../Options/OptGeneric.cpp -o ../Options/OptGeneric.o $(CXXFLAGS) ../Misc/addrpack.o: ../Misc/addrpack.c $(CC) -c ../Misc/addrpack.c -o ../Misc/addrpack.o $(CFLAGS) ../Requestor/Requestor.o: ../Requestor/Requestor.cpp $(CPP) -c ../Requestor/Requestor.cpp -o ../Requestor/Requestor.o $(CXXFLAGS) ../Requestor/ReqCfgMgr.o: ../Requestor/ReqCfgMgr.cpp $(CPP) -c ../Requestor/ReqCfgMgr.cpp -o ../Requestor/ReqCfgMgr.o $(CXXFLAGS) ../Requestor/ReqMsg.o: ../Requestor/ReqMsg.cpp $(CPP) -c ../Requestor/ReqMsg.cpp -o ../Requestor/ReqMsg.o $(CXXFLAGS) ../Requestor/ReqOpt.o: ../Requestor/ReqOpt.cpp $(CPP) -c ../Requestor/ReqOpt.cpp -o ../Requestor/ReqOpt.o $(CXXFLAGS) ../Requestor/ReqOpts.o: ../Requestor/ReqOpts.cpp $(CPP) -c ../Requestor/ReqOpts.cpp -o ../Requestor/ReqOpts.o $(CXXFLAGS) ../Requestor/ReqTransMgr.o: ../Requestor/ReqTransMgr.cpp $(CPP) -c ../Requestor/ReqTransMgr.cpp -o ../Requestor/ReqTransMgr.o $(CXXFLAGS) ../Options/OptDUID.o: ../Options/OptDUID.cpp $(CPP) -c ../Options/OptDUID.cpp -o ../Options/OptDUID.o $(CXXFLAGS) ../Options/OptIAAddress.o: ../Options/OptIAAddress.cpp $(CPP) -c ../Options/OptIAAddress.cpp -o ../Options/OptIAAddress.o $(CXXFLAGS) ../Misc/KeyList.o: ../Misc/KeyList.cpp $(CPP) -c ../Misc/KeyList.cpp -o ../Misc/KeyList.o $(CXXFLAGS) dibbler-relay_private.res: dibbler-relay_private.rc $(WINDRES) -i dibbler-relay_private.rc --input-format=rc -o dibbler-relay_private.res -O coff dibbler-1.0.1/Port-winnt2k/config.h0000664000175000017500000000715112233256142013777 00000000000000/* config.h, used for poslib under Win32 */ /* Define to 1 if you have the header file. */ #define HAVE_DLFCN_H 1 /* Define to 1 if you have the header file. */ /* commented out by thomson #define HAVE_EXT_SLIST 1 */ /* Define to 1 if you have the header file. */ #define HAVE_FCNTL_H 1 /* Define to 1 if you have the `gethostbyname' function. */ #define HAVE_GETHOSTBYNAME 1 /* Define to 1 if you have the `gethostname' function. */ #define HAVE_GETHOSTNAME 1 /* Defines whether the gettimeofday() function is available */ /* #define HAVE_GETTIMEOFDAY 1 */ /* Define to 1 if you have the `inet_aton' function. */ #define HAVE_INET_ATON 1 /* Define to 1 if you have the header file. */ /* commented out for win32 by thomson #define HAVE_INTTYPES_H 1 */ /* Defines whether IPv6 support is available */ #define HAVE_IPV6 1 /* Define to 1 if you have the header file. */ #define HAVE_LIMITS_H 1 /* Define to 1 if you have the header file. */ #define HAVE_MEMORY_H 1 /* Defines whether the poll function is available */ /* #define HAVE_POLL 1 */ /* Define to 1 if you have the header file. */ #define HAVE_POLL_H 1 /* Define to 1 if you have the `select' function. */ #define HAVE_SELECT 1 /* Defines whether the sin6_len field should be used */ /* #undef HAVE_SIN6_LEN */ /* Defines whether the sin_len field is available */ /* #undef HAVE_SIN_LEN */ /* Define to 1 if you have the header file. */ /* #undef HAVE_SLIST */ /* Defines whether sockaddr_storage should be used */ #define HAVE_SOCKADDR_STORAGE 1 /* Define to 1 if you have the `socket' function. */ #define HAVE_SOCKET 1 /* Defines whether we have the socklen_t field */ #define HAVE_SOCKLEN_T 1 /* Define to 1 if you have the header file. */ /* commented out for win32 by thomson #define HAVE_STDINT_H 1 */ /* Define to 1 if you have the header file. */ #define HAVE_STDLIB_H 1 /* Define to 1 if you have the header file. */ #define HAVE_STRINGS_H 1 /* Define to 1 if you have the header file. */ #define HAVE_STRING_H 1 /* Define to 1 if you have the header file. */ #define HAVE_SYSLOG_H 1 /* Define to 1 if you have the header file. */ #define HAVE_SYS_POLL_H 1 /* Define to 1 if you have the header file. */ #define HAVE_SYS_SELECT_H 1 /* Define to 1 if you have the header file. */ #define HAVE_SYS_STAT_H 1 /* Define to 1 if you have the header file. */ #define HAVE_SYS_TIME_H 1 /* Define to 1 if you have the header file. */ #define HAVE_SYS_TYPES_H 1 /* Define to 1 if you have the header file. */ #define HAVE_UNISTD_H 1 /* Defines whether the vsnprintf() function is available */ /* #define HAVE_VSNPRINTF 1 */ /* Define to 1 if you have the header file. */ /* #undef HAVE_WINSOCK2_H */ /* Defines wiether the __ss_family field should be used */ /* #undef HAVE___SS_FAMILY */ /* Name of package */ /* #undef PACKAGE */ /* Define to the address where bug reports for this package should be sent. */ #define PACKAGE_BUGREPORT "" /* Define to the full name of this package. */ #define PACKAGE_NAME "" /* Define to the full name and version of this package. */ #define PACKAGE_STRING "" /* Define to the one symbol short name of this package. */ #define PACKAGE_TARNAME "" /* Define to the version of this package. */ #define PACKAGE_VERSION "" /* Define to 1 if you have the ANSI C header files. */ #define STDC_HEADERS 1 /* Version number of package */ /* #undef VERSION */ /* Defines whether leak checking is enabled */ /* #undef _LEAKCHECK_ */ dibbler-1.0.1/Port-winnt2k/Makefile0000664000175000017500000004703412561700376014034 00000000000000# Makefile.in generated by automake 1.14.1 from Makefile.am. # Port-winnt2k/Makefile. Generated from Makefile.in by configure. # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/dibbler pkgincludedir = $(includedir)/dibbler pkglibdir = $(libdir)/dibbler pkglibexecdir = $(libexecdir)/dibbler am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = x86_64-unknown-linux-gnu host_triplet = x86_64-unknown-linux-gnu subdir = Port-winnt2k DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(dist_noinst_DATA) ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/libtool.m4 \ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/include/dibbler-config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = AM_V_P = $(am__v_P_$(V)) am__v_P_ = $(am__v_P_$(AM_DEFAULT_VERBOSITY)) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_$(V)) am__v_GEN_ = $(am__v_GEN_$(AM_DEFAULT_VERBOSITY)) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_$(V)) am__v_at_ = $(am__v_at_$(AM_DEFAULT_VERBOSITY)) am__v_at_0 = @ am__v_at_1 = SOURCES = DIST_SOURCES = RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \ ctags-recursive dvi-recursive html-recursive info-recursive \ install-data-recursive install-dvi-recursive \ install-exec-recursive install-html-recursive \ install-info-recursive install-pdf-recursive \ install-ps-recursive install-recursive installcheck-recursive \ installdirs-recursive pdf-recursive ps-recursive \ tags-recursive uninstall-recursive am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac DATA = $(dist_noinst_DATA) RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive am__recursive_targets = \ $(RECURSIVE_TARGETS) \ $(RECURSIVE_CLEAN_TARGETS) \ $(am__extra_recursive_targets) AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \ distdir am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags DIST_SUBDIRS = $(SUBDIRS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) am__relativize = \ dir0=`pwd`; \ sed_first='s,^\([^/]*\)/.*$$,\1,'; \ sed_rest='s,^[^/]*/*,,'; \ sed_last='s,^.*/\([^/]*\)$$,\1,'; \ sed_butlast='s,/*[^/]*$$,,'; \ while test -n "$$dir1"; do \ first=`echo "$$dir1" | sed -e "$$sed_first"`; \ if test "$$first" != "."; then \ if test "$$first" = ".."; then \ dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ else \ first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ if test "$$first2" = "$$first"; then \ dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ else \ dir2="../$$dir2"; \ fi; \ dir0="$$dir0"/"$$first"; \ fi; \ fi; \ dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ done; \ reldir="$$dir2" ACLOCAL = ${SHELL} /home/thomson/devel/dibbler-git/missing aclocal-1.14 ALLOCA = AMTAR = $${TAR-tar} AM_DEFAULT_VERBOSITY = 1 AR = ar ARCH = LINUX AUTOCONF = ${SHELL} /home/thomson/devel/dibbler-git/missing autoconf AUTOHEADER = ${SHELL} /home/thomson/devel/dibbler-git/missing autoheader AUTOMAKE = ${SHELL} /home/thomson/devel/dibbler-git/missing automake-1.14 AWK = gawk CC = gcc CCDEPMODE = depmode=gcc3 CFLAGS = CPP = gcc -E CPPFLAGS = -O2 -DLINUX -Wall -pedantic -funsigned-char -DMOD_CLNT_BIND_REUSE -DMOD_CLNT_CONFIRM CXX = g++ CXXCPP = g++ -E CXXDEPMODE = depmode=gcc3 CXXFLAGS = CYGPATH_W = echo DEFS = -DHAVE_CONFIG_H DEPDIR = .deps DLLTOOL = false DSYMUTIL = DUMPBIN = ECHO_C = ECHO_N = -n ECHO_T = EGREP = /bin/grep -E EXEEXT = EXTRA_DIST_SUBDIRS = Port-bsd Port-winnt2k Port-sun FGREP = /bin/grep -F GREP = /bin/grep GTEST_INCLUDES = GTEST_LDADD = GTEST_LDFLAGS = INSTALL = /usr/bin/install -c INSTALL_DATA = ${INSTALL} -m 644 INSTALL_PROGRAM = ${INSTALL} INSTALL_SCRIPT = ${INSTALL} INSTALL_STRIP_PROGRAM = $(install_sh) -c -s LD = /usr/bin/ld -m elf_x86_64 LDFLAGS = -lpthread LIBOBJS = LIBS = LIBTOOL = $(SHELL) $(top_builddir)/libtool LINKPRINT = LIPO = LN_S = ln -s LTLIBOBJS = MAINT = # MAKEINFO = ${SHELL} /home/thomson/devel/dibbler-git/missing makeinfo MANIFEST_TOOL = : MKDIR_P = /bin/mkdir -p NM = /usr/bin/nm -B NMEDIT = OBJDUMP = objdump OBJEXT = o OTOOL = OTOOL64 = PACKAGE = dibbler PACKAGE_BUGREPORT = dibbler@klub.com.pl PACKAGE_NAME = dibbler PACKAGE_STRING = dibbler 1.0.1 PACKAGE_TARNAME = dibbler PACKAGE_URL = PACKAGE_VERSION = 1.0.1 PATH_SEPARATOR = : PORT_CFLAGS = PORT_LDFLAGS = PORT_SUBDIR = Port-linux RANLIB = ranlib SED = /bin/sed SET_MAKE = SHELL = /bin/bash STRIP = strip VERSION = 1.0.1 abs_builddir = /home/thomson/devel/dibbler-git/Port-winnt2k abs_srcdir = /home/thomson/devel/dibbler-git/Port-winnt2k abs_top_builddir = /home/thomson/devel/dibbler-git abs_top_srcdir = /home/thomson/devel/dibbler-git ac_ct_AR = ar ac_ct_CC = gcc ac_ct_CXX = g++ ac_ct_DUMPBIN = am__include = include am__leading_dot = . am__quote = am__tar = $${TAR-tar} chof - "$$tardir" am__untar = $${TAR-tar} xf - bindir = ${exec_prefix}/bin build = x86_64-unknown-linux-gnu build_alias = build_cpu = x86_64 build_os = linux-gnu build_vendor = unknown builddir = . datadir = ${datarootdir} datarootdir = ${prefix}/share docdir = ${datarootdir}/doc/${PACKAGE_TARNAME} dvidir = ${docdir} exec_prefix = ${prefix} host = x86_64-unknown-linux-gnu host_alias = host_cpu = x86_64 host_os = linux-gnu host_vendor = unknown htmldir = ${docdir} includedir = ${prefix}/include infodir = ${datarootdir}/info install_sh = ${SHELL} /home/thomson/devel/dibbler-git/install-sh libdir = ${exec_prefix}/lib libexecdir = ${exec_prefix}/libexec localedir = ${datarootdir}/locale localstatedir = ${prefix}/var mandir = ${datarootdir}/man mkdir_p = $(MKDIR_P) oldincludedir = /usr/include pdfdir = ${docdir} prefix = /usr/local program_transform_name = s,x,x, psdir = ${docdir} sbindir = ${exec_prefix}/sbin sharedstatedir = ${prefix}/com srcdir = . subdirs = bison++ sysconfdir = ${prefix}/etc target_alias = top_build_prefix = ../ top_builddir = .. top_srcdir = .. SUBDIRS = . dist_noinst_DATA = client.log client-winnt2k.cpp ClntService.cpp ClntService.h config.h dibbler-client.dev dibbler-client.ico dibbler-client.layout dibbler.iss dibbler-relay.dev dibbler-relay.ico dibbler-relay.layout dibbler-requestor.dev dibbler-requestor.layout dibbler-server.dev dibbler-server.ico dibbler-server.layout INFO lowlevel-winnt2k.c Makefile Makefile.win relay.log relay-winnt2k.cpp RelService.cpp RelService.h server.log server-winnt2k.cpp SrvService.cpp SrvService.h tpipv6.h WinService.cpp WinService.h wspiapi.h all: all-recursive .SUFFIXES: $(srcdir)/Makefile.in: # $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign Port-winnt2k/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign Port-winnt2k/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: # $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): # $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs # This directory's subdirectories are mostly independent; you can cd # into them and run 'make' without going through this Makefile. # To change the values of 'make' variables: instead of editing Makefiles, # (1) if the variable is set in 'config.status', edit 'config.status' # (which will cause the Makefiles to be regenerated when you run 'make'); # (2) otherwise, pass the desired values on the 'make' command line. $(am__recursive_targets): @fail=; \ if $(am__make_keepgoing); then \ failcom='fail=yes'; \ else \ failcom='exit 1'; \ fi; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-recursive TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ empty_fix=.; \ else \ include_option=--include; \ empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-recursive CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-recursive cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ $(am__make_dryrun) \ || test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ $(am__relativize); \ new_distdir=$$reldir; \ dir1=$$subdir; dir2="$(top_distdir)"; \ $(am__relativize); \ new_top_distdir=$$reldir; \ echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ ($(am__cd) $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$new_top_distdir" \ distdir="$$new_distdir" \ am__remove_distdir=: \ am__skip_length_check=: \ am__skip_mode_fix=: \ distdir) \ || exit 1; \ fi; \ done check-am: all-am check: check-recursive all-am: Makefile $(DATA) installdirs: installdirs-recursive installdirs-am: install: install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-recursive clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-recursive -rm -f Makefile distclean-am: clean-am distclean-generic distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive html-am: info: info-recursive info-am: install-data-am: install-dvi: install-dvi-recursive install-dvi-am: install-exec-am: install-html: install-html-recursive install-html-am: install-info: install-info-recursive install-info-am: install-man: install-pdf: install-pdf-recursive install-pdf-am: install-ps: install-ps-recursive install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-recursive -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: .MAKE: $(am__recursive_targets) install-am install-strip .PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am check \ check-am clean clean-generic clean-libtool cscopelist-am ctags \ ctags-am distclean distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ installdirs-am maintainer-clean maintainer-clean-generic \ mostlyclean mostlyclean-generic mostlyclean-libtool pdf pdf-am \ ps ps-am tags tags-am uninstall uninstall-am # ============================================================ # === C low level stuff ====================================== # ============================================================ lowlevel-winnt2k.o: lowlevel-winnt2k.c @echo "[CC ] $(SUBDIR)/$@" $(CC) $(COPTS) -c $< ClntService.o: ClntService.cpp @echo "[CXX ] $(SUBDIR)/$@" $(CXX) -I../include $(OPTS) -c -o $@ $< SrvService.o: SrvService.cpp @echo "[CXX ] $(SUBDIR)/$@" $(CXX) -I../include $(OPTS) -c -o $@ $< RelService.o: RelService.cpp @echo "[CXX ] $(SUBDIR)/$@" $(CXX) -I../include $(OPTS) -c -o $@ $< WinService.o: WinService.cpp @echo "[CXX ] $(SUBDIR)/$@" $(CXX) -I../include $(OPTS) -c -o $@ $< # 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: dibbler-1.0.1/Port-winnt2k/dibbler-client.layout0000664000175000017500000001037112233256142016475 00000000000000[Editor_3] CursorCol=1 CursorRow=1 TopLine=1 LeftChar=1 Open=0 Top=0 [Editors] Order= Focused=0 [Editor_0] Open=0 Top=0 CursorCol=1 CursorRow=1 TopLine=1 LeftChar=1 [Editor_1] Open=0 Top=0 CursorCol=1 CursorRow=1 TopLine=1 LeftChar=1 [Editor_2] Open=0 Top=0 [Editor_4] Open=0 Top=0 [Editor_5] Open=0 Top=0 [Editor_6] Open=0 Top=0 CursorCol=1 CursorRow=18 TopLine=1 LeftChar=1 [Editor_7] Open=0 Top=0 [Editor_8] Open=0 Top=0 [Editor_9] Open=0 Top=0 [Editor_10] Open=0 Top=0 [Editor_11] Open=0 Top=0 [Editor_12] Open=0 Top=0 [Editor_13] Open=0 Top=0 [Editor_14] Open=0 Top=0 [Editor_15] Open=0 Top=0 [Editor_16] Open=0 Top=0 [Editor_17] Open=0 Top=0 CursorCol=3 CursorRow=2261 TopLine=2236 LeftChar=1 [Editor_18] Open=0 Top=0 [Editor_19] Open=0 Top=0 [Editor_20] Open=0 Top=0 [Editor_21] Open=0 Top=0 [Editor_22] Open=0 Top=0 [Editor_23] Open=0 Top=0 [Editor_24] Open=0 Top=0 [Editor_25] Open=0 Top=0 [Editor_26] Open=0 Top=0 [Editor_27] Open=0 Top=0 [Editor_28] Open=0 Top=0 [Editor_29] Open=0 Top=0 [Editor_30] Open=0 Top=0 [Editor_31] Open=0 Top=0 [Editor_32] Open=0 Top=0 [Editor_33] Open=0 Top=0 [Editor_34] Open=0 Top=0 [Editor_35] Open=0 Top=0 [Editor_36] Open=0 Top=0 [Editor_37] Open=0 Top=0 [Editor_38] Open=0 Top=0 [Editor_39] Open=0 Top=0 [Editor_40] Open=0 Top=0 [Editor_41] Open=0 Top=0 [Editor_42] Open=0 Top=0 [Editor_43] Open=0 Top=0 [Editor_44] Open=0 Top=0 [Editor_45] Open=0 Top=0 [Editor_46] Open=0 Top=0 [Editor_47] Open=0 Top=0 [Editor_48] Open=0 Top=0 [Editor_49] Open=0 Top=0 [Editor_50] Open=0 Top=0 [Editor_51] Open=0 Top=0 [Editor_52] Open=0 Top=0 [Editor_53] Open=0 Top=0 [Editor_54] Open=0 Top=0 [Editor_55] Open=0 Top=0 [Editor_56] Open=0 Top=0 [Editor_57] Open=0 Top=0 [Editor_58] Open=0 Top=0 [Editor_59] Open=0 Top=0 [Editor_60] Open=0 Top=0 [Editor_61] Open=0 Top=0 [Editor_62] Open=0 Top=0 [Editor_63] Open=0 Top=0 [Editor_64] Open=0 Top=0 [Editor_65] Open=0 Top=0 [Editor_66] Open=0 Top=0 [Editor_67] Open=0 Top=0 [Editor_68] Open=0 Top=0 [Editor_69] Open=0 Top=0 [Editor_70] Open=0 Top=0 [Editor_71] Open=0 Top=0 [Editor_72] Open=0 Top=0 [Editor_73] Open=0 Top=0 [Editor_74] Open=0 Top=0 [Editor_75] Open=0 Top=0 [Editor_76] Open=0 Top=0 [Editor_77] Open=0 Top=0 [Editor_78] Open=0 Top=0 [Editor_79] Open=0 Top=0 [Editor_80] Open=0 Top=0 CursorCol=1 CursorRow=1 TopLine=1 LeftChar=1 [Editor_81] Open=0 Top=0 CursorCol=1 CursorRow=1 TopLine=1 LeftChar=1 [Editor_82] Open=0 Top=0 [Editor_83] Open=0 Top=0 [Editor_84] Open=0 Top=0 [Editor_85] Open=0 Top=0 CursorCol=1 CursorRow=52 TopLine=16 LeftChar=1 [Editor_86] Open=0 Top=0 CursorCol=1 CursorRow=106 TopLine=96 LeftChar=1 [Editor_87] Open=0 Top=0 CursorCol=1 CursorRow=106 TopLine=96 LeftChar=1 [Editor_88] Open=0 Top=0 CursorCol=1 CursorRow=1 TopLine=1 LeftChar=1 [Editor_89] Open=0 Top=0 [Editor_90] Open=0 Top=0 [Editor_91] Open=0 Top=0 [Editor_92] Open=0 Top=0 [Editor_93] Open=0 Top=0 [Editor_94] Open=0 Top=0 [Editor_95] Open=0 Top=0 [Editor_96] Open=0 Top=0 [Editor_97] Open=0 Top=0 [Editor_98] Open=0 Top=0 [Editor_99] Open=0 Top=0 [Editor_100] Open=0 Top=0 [Editor_101] Open=0 Top=0 [Editor_102] Open=0 Top=0 [Editor_103] Open=0 Top=0 CursorCol=1 CursorRow=1 TopLine=1 LeftChar=1 [Editor_104] Open=0 Top=0 CursorCol=1 CursorRow=1 TopLine=1 LeftChar=1 [Editor_105] Open=0 Top=0 CursorCol=1 CursorRow=1 TopLine=1 LeftChar=1 [Editor_106] Open=0 Top=0 CursorCol=1 CursorRow=1 TopLine=1 LeftChar=1 [Editor_107] Open=0 Top=0 CursorCol=1 CursorRow=1 TopLine=1 LeftChar=1 [Editor_108] Open=0 Top=0 CursorCol=1 CursorRow=1 TopLine=1 LeftChar=1 [Editor_109] Open=0 Top=0 CursorCol=1 CursorRow=1 TopLine=1 LeftChar=1 [Editor_110] Open=0 Top=0 CursorCol=1 CursorRow=1 TopLine=1 LeftChar=1 [Editor_111] Open=0 Top=0 CursorCol=1 CursorRow=1 TopLine=1 LeftChar=1 [Editor_112] Open=0 Top=0 [Editor_113] Open=0 Top=0 CursorCol=1 CursorRow=79 TopLine=35 LeftChar=1 [Editor_114] Open=0 Top=0 [Editor_115] Open=0 Top=0 [Editor_116] Open=0 Top=0 [Editor_117] Open=0 Top=0 [Editor_118] Open=0 Top=0 [Editor_119] Open=0 Top=0 CursorCol=1 CursorRow=14 TopLine=1 LeftChar=1 [Editor_120] Open=0 Top=0 CursorCol=3 CursorRow=18 TopLine=25 LeftChar=1 [Editor_121] Open=0 Top=0 [Editor_122] Open=0 Top=0 CursorCol=1 CursorRow=1 TopLine=1 LeftChar=1 [Editor_123] Open=0 Top=0 [Editor_124] Open=0 Top=0 [Editor_125] Open=0 Top=0 [Editor_126] Open=0 Top=0 [Editor_127] Open=0 Top=0 dibbler-1.0.1/Port-winnt2k/client-winnt2k.cpp0000664000175000017500000000624012233256142015733 00000000000000/* * Dibbler - a portable DHCPv6 * * authors: Tomasz Mrugalski * Marek Senderski * win2k version by * * based on client-winxp.cpp,v 1.15 2005/02/01 22:39:20 thomson Exp $ * * $Id: client-winnt2k.cpp,v 1.3 2005-07-26 00:03:03 thomson Exp $ * * Released under GNU GPL v2 licence * */ #include #include #include #include #include #include "WinService.h" #include "ClntService.h" #include "Portable.h" #include "DHCPClient.h" #include "logger.h" #include extern "C" int lowlevelInit(); using namespace std; void usage() { cout << "Usage:" << endl; cout << " dibbler-client.exe ACTION [-d c:\\path\\to\\config\\file]" << endl << " ACTION = status|start|stop|install|uninstall|run" << endl << " status - show status and exit" << endl << " start - start installed service" << endl << " stop - stop installed service" << endl << " install - install service" << endl << " uninstall - uninstall service" << endl << " run - run interactively" << endl << " help - displays usage info." << endl << endl << " Note: -d parameter is optional." << endl; } extern TDHCPClient * clntPtr; /* * Handle the CTRL-C, CTRL-BREAK signal. */ BOOL CtrlHandler( DWORD fdwCtrlType ) { switch( fdwCtrlType ) { case CTRL_C_EVENT: { clntPtr->stop(); return TRUE; } case CTRL_BREAK_EVENT: return FALSE; } return TRUE; } int main(int argc, char* argv[]) { // get the service object TClntService * Client = TClntService::getHandle(); WSADATA wsaData; cout << DIBBLER_COPYRIGHT1 << " (CLIENT, WinNT/2000 port)" << endl; cout << DIBBLER_COPYRIGHT2 << endl; cout << DIBBLER_COPYRIGHT3 << endl; cout << DIBBLER_COPYRIGHT4 << endl; cout << endl; SetConsoleCtrlHandler( (PHANDLER_ROUTINE) CtrlHandler, TRUE ); if( WSAStartup( MAKEWORD( 2, 2 ), &wsaData )) { cout << "Unable to load WinSock 2.2 library." << endl; return -1; } EServiceState status = Client->ParseStandardArgs(argc, argv); Client->setState(status); if (!Client->verifyPort()) { Log(Crit) << "Operating system version is not supported by this Dibbler port." << LogEnd; return -1; } // find ipv6.exe (or netsh.exe in future implementations) if (!lowlevelInit()) { clog << "lowlevelInit() failed. Startup aborted." << endl; return -1; } switch(status) { case STATUS: { Client->showStatus(); break; } case START: { Client->StartService(); break; } case STOP: { Client->StopService(); break; } case INSTALL: { Client->CheckAndInstall(); break; } case UNINSTALL: { Client->Uninstall(); break; } case RUN: { Client->Run(); break; } case SERVICE: { Client->RunService(); break; } case INVALID: { Log(Crit) << "Invalid usage." << endl; } case HELP: default: { usage(); } } return 0; } /* * $Log: not supported by cvs2svn $ * Revision 1.2 2005/07/24 16:00:03 thomson * Port WinNT/2000 related changes. * * Revision 1.1 2005/07/23 14:33:22 thomson * Port for win2k/NT added. * */ dibbler-1.0.1/Port-winnt2k/dibbler-client.dev0000664000175000017500000004550712233256142015747 00000000000000[Project] FileName=dibbler-client.dev Name=dibbler-client UnitCount=128 Type=1 Ver=1 ObjFiles= Includes=..\AddrMgr;..\CfgMgr;..\ClntAddrMgr;..\ClntCfgMgr;..\ClntIfaceMgr;..\ClntMessages;..\ClntOptions;..\ClntTransMgr;..\IfaceMgr;..\Messages;..\Misc;..\Options;..\Port-winnt2k;..\RelCfgMgr;..\RelIfaceMgr;..\RelMessages;..\RelOptions;..\RelTransMgr;..\TransMgr;..\Port-winnt2k\CVS;..\poslib\poslib Libs= PrivateResource=dibbler-client_private.rc ResourceIncludes= MakeIncludes= Compiler=-DMINGWBUILD -funsigned-char_@@_ CppCompiler=-D_GLIBCXX_USE_C99_DYNAMIC -DMINGWBUILD -funsigned-char_@@_ Linker=-lws2_32_@@_ IsCpp=1 Icon=dibbler-client.ico ExeOutput= ObjectOutput= OverrideOutput=0 OverrideOutputName=dibbler-client.exe HostApplication= Folders=AddrMgr,CfgMgr,ClntAddrMgr,ClntCfgMgr,ClntIfaceMgr,ClntMessages,ClntOptions,ClntTransMgr,IfaceMgr,Messages,Misc,Options,Port-winnt2k,poslib CommandLine= UseCustomMakefile=0 CustomMakefile= IncludeVersionInfo=0 SupportXPThemes=0 CompilerSet=0 CompilerSettings=0000000000000000000000 [Unit1] FileName=WinService.cpp CompileCpp=1 Folder=Port-winnt2k Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit8] FileName=..\IfaceMgr\SocketIPv6.cpp CompileCpp=1 Folder=IfaceMgr Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [VersionInfo] Major=0 Minor=1 Release=1 Build=1 LanguageID=1033 CharsetID=1252 CompanyName= FileVersion= FileDescription=Developed using the Dev-C++ IDE InternalName= LegalCopyright= LegalTrademarks= OriginalFilename= ProductName= ProductVersion= AutoIncBuildNr=0 [Unit3] FileName=..\Misc\Logger.cpp CompileCpp=1 Folder=Misc Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit5] FileName=..\Misc\DUID.cpp CompileCpp=1 Folder=Misc Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit10] FileName=..\IfaceMgr\IfaceMgr.cpp CompileCpp=1 Folder=IfaceMgr Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit11] FileName=..\CfgMgr\CfgMgr.cpp CompileCpp=1 Folder=CfgMgr Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit7] FileName=..\Messages\Msg.cpp CompileCpp=1 Folder=Messages Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit9] FileName=..\IfaceMgr\Iface.cpp CompileCpp=1 Folder=IfaceMgr Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit14] FileName=..\ClntCfgMgr\ClntCfgAddr.cpp CompileCpp=1 Folder=ClntCfgMgr Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit16] FileName=..\ClntCfgMgr\ClntCfgIface.cpp CompileCpp=1 Folder=ClntCfgMgr Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit20] FileName=..\ClntCfgMgr\ClntParser.cpp CompileCpp=1 Folder=ClntCfgMgr Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit21] FileName=..\ClntCfgMgr\ClntParsGlobalOpt.cpp CompileCpp=1 Folder=ClntCfgMgr Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit24] FileName=..\ClntIfaceMgr\ClntIfaceMgr.cpp CompileCpp=1 Folder=ClntIfaceMgr Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit25] FileName=..\ClntIfaceMgr\ClntIfaceIface.cpp CompileCpp=1 Folder=ClntIfaceMgr Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit26] FileName=..\ClntMessages\ClntMsgSolicit.cpp CompileCpp=1 Folder=ClntMessages Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit27] FileName=..\ClntMessages\ClntMsg.cpp CompileCpp=1 Folder=ClntMessages Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit28] FileName=..\ClntMessages\ClntMsgAdvertise.cpp CompileCpp=1 Folder=ClntMessages Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit29] FileName=..\ClntMessages\ClntMsgConfirm.cpp CompileCpp=1 Folder=ClntMessages Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit30] FileName=..\ClntMessages\ClntMsgDecline.cpp CompileCpp=1 Folder=ClntMessages Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit31] FileName=..\ClntMessages\ClntMsgInfRequest.cpp CompileCpp=1 Folder=ClntMessages Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit32] FileName=..\ClntMessages\ClntMsgRebind.cpp CompileCpp=1 Folder=ClntMessages Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit33] FileName=..\ClntMessages\ClntMsgRelease.cpp CompileCpp=1 Folder=ClntMessages Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit12] FileName=..\ClntAddrMgr\ClntAddrMgr.cpp CompileCpp=1 Folder=ClntAddrMgr Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit13] FileName=..\ClntCfgMgr\ClntParsIfaceOpt.cpp CompileCpp=1 Folder=ClntCfgMgr Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit15] FileName=..\ClntCfgMgr\ClntCfgIA.cpp CompileCpp=1 Folder=ClntCfgMgr Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit17] FileName=..\ClntCfgMgr\ClntCfgMgr.cpp CompileCpp=1 Folder=ClntCfgMgr Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit18] FileName=..\ClntCfgMgr\ClntLexer.cpp CompileCpp=1 Folder=ClntCfgMgr Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit19] FileName=..\ClntCfgMgr\ClntParsAddrOpt.cpp CompileCpp=1 Folder=ClntCfgMgr Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit22] FileName=..\ClntCfgMgr\ClntParsIAOpt.cpp CompileCpp=1 Folder=ClntCfgMgr Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit23] FileName=..\ClntTransMgr\ClntTransMgr.cpp CompileCpp=1 Folder=ClntTransMgr Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit34] FileName=..\ClntMessages\ClntMsgRenew.cpp CompileCpp=1 Folder=ClntMessages Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit35] FileName=..\ClntMessages\ClntMsgReply.cpp CompileCpp=1 Folder=ClntMessages Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit36] FileName=..\ClntMessages\ClntMsgRequest.cpp CompileCpp=1 Folder=ClntMessages Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit37] FileName=..\ClntOptions\ClntOptClientIdentifier.cpp CompileCpp=1 Folder=ClntOptions Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit38] FileName=..\ClntOptions\ClntOptDNSServers.cpp CompileCpp=1 Folder=ClntOptions Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit39] FileName=..\ClntOptions\ClntOptDomainName.cpp CompileCpp=1 Folder=ClntOptions Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit40] FileName=..\ClntOptions\ClntOptElapsed.cpp CompileCpp=1 Folder=ClntOptions Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit41] FileName=..\ClntOptions\ClntOptFQDN.cpp CompileCpp=1 Folder=ClntOptions Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit42] FileName=..\ClntOptions\ClntOptIA_NA.cpp CompileCpp=1 Folder=ClntOptions Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit43] FileName=..\ClntOptions\ClntOptIAAddress.cpp CompileCpp=1 Folder=ClntOptions Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit44] FileName=..\ClntOptions\ClntOptLifetime.cpp CompileCpp=1 Folder=ClntOptions Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit45] FileName=..\ClntOptions\ClntOptNISDomain.cpp CompileCpp=1 Folder=ClntOptions Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit46] FileName=..\ClntOptions\ClntOptNISPDomain.cpp CompileCpp=1 Folder=ClntOptions Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit47] FileName=..\ClntOptions\ClntOptNISPServer.cpp CompileCpp=1 Folder=ClntOptions Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit48] FileName=..\ClntOptions\ClntOptNISServer.cpp CompileCpp=1 Folder=ClntOptions Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit49] FileName=..\ClntOptions\ClntOptNTPServers.cpp CompileCpp=1 Folder=ClntOptions Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit50] FileName=..\ClntOptions\ClntOptOptionRequest.cpp CompileCpp=1 Folder=ClntOptions Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit51] FileName=..\ClntOptions\ClntOptPreference.cpp CompileCpp=1 Folder=ClntOptions Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit52] FileName=..\ClntOptions\ClntOptRapidCommit.cpp CompileCpp=1 Folder=ClntOptions Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit53] FileName=..\ClntOptions\ClntOptServerIdentifier.cpp CompileCpp=1 Folder=ClntOptions Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit54] FileName=..\ClntOptions\ClntOptServerUnicast.cpp CompileCpp=1 Folder=ClntOptions Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit55] FileName=..\ClntOptions\ClntOptSIPDomain.cpp CompileCpp=1 Folder=ClntOptions Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit56] FileName=..\ClntOptions\ClntOptSIPServer.cpp CompileCpp=1 Folder=ClntOptions Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit57] FileName=..\ClntOptions\ClntOptStatusCode.cpp CompileCpp=1 Folder=ClntOptions Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit58] FileName=..\ClntOptions\ClntOptTimeZone.cpp CompileCpp=1 Folder=ClntOptions Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit59] FileName=..\ClntOptions\ClntOptUserClass.cpp CompileCpp=1 Folder=ClntOptions Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit60] FileName=..\ClntOptions\ClntOptVendorClass.cpp CompileCpp=1 Folder=ClntOptions Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit61] FileName=..\AddrMgr\AddrMgr.cpp CompileCpp=1 Folder=AddrMgr Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit62] FileName=..\AddrMgr\AddrAddr.cpp CompileCpp=1 Folder=AddrMgr Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit63] FileName=..\AddrMgr\AddrClient.cpp CompileCpp=1 Folder=AddrMgr Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit64] FileName=..\AddrMgr\AddrIA.cpp CompileCpp=1 Folder=AddrMgr Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit65] FileName=..\Options\OptVendorSpecInfo.cpp CompileCpp=1 Folder=Options Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit66] FileName=..\Options\Opt.cpp CompileCpp=1 Folder=Options Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit4] FileName=..\Misc\DHCPConst.cpp CompileCpp=1 Folder=Misc Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit67] FileName=..\Options\OptAddr.cpp CompileCpp=1 Folder=Options Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit68] FileName=..\Options\OptAddrLst.cpp CompileCpp=1 Folder=Options Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit69] FileName=..\Options\OptElapsed.cpp CompileCpp=1 Folder=Options Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit70] FileName=..\Options\OptGeneric.cpp CompileCpp=1 Folder=Options Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit71] FileName=..\Options\OptIA_NA.cpp CompileCpp=1 Folder=Options Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit72] FileName=..\Options\OptIAAddress.cpp CompileCpp=1 Folder=Options Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit73] FileName=..\Options\OptOptionRequest.cpp CompileCpp=1 Folder=Options Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit74] FileName=..\Options\OptPreference.cpp CompileCpp=1 Folder=Options Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit75] FileName=..\Options\OptRapidCommit.cpp CompileCpp=1 Folder=Options Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit76] FileName=..\Options\OptStatusCode.cpp CompileCpp=1 Folder=Options Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit77] FileName=..\Options\OptString.cpp CompileCpp=1 Folder=Options Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit78] FileName=..\Options\OptStringLst.cpp CompileCpp=1 Folder=Options Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit79] FileName=..\Options\OptUserClass.cpp CompileCpp=1 Folder=Options Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit80] FileName=..\Options\OptVendorClass.cpp CompileCpp=1 Folder=Options Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit81] FileName=client-winnt2k.cpp CompileCpp=1 Folder=Port-winnt2k Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit82] FileName=ClntService.cpp CompileCpp=1 Folder=Port-winnt2k Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit83] FileName=..\Misc\DHCPClient.cpp CompileCpp=1 Folder=Misc Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit84] FileName=..\CfgMgr\StationID.cpp CompileCpp=1 Folder=CfgMgr Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit85] FileName=..\CfgMgr\TimeZone.cpp CompileCpp=1 Folder=CfgMgr Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit86] FileName=..\IfaceMgr\DNSUpdate.cpp CompileCpp=1 Folder=IfaceMgr Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit87] FileName=..\Misc\FQDN.cpp CompileCpp=1 Folder=Misc Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit88] FileName=..\Misc\addrpack.c CompileCpp=0 Folder=Misc Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd=$(CC) -c addrpack.c -o addrpack.o $(CFLAGS) [Unit6] FileName=..\Misc\IPv6Addr.cpp CompileCpp=1 Folder=Misc Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit89] FileName=..\poslib\poslib\socket.cpp CompileCpp=1 Folder=poslib Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit90] FileName=..\poslib\poslib\dnsmessage.cpp CompileCpp=1 Folder=poslib Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit91] FileName=..\poslib\poslib\domainfn.cpp CompileCpp=1 Folder=poslib Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit2] FileName=lowlevel-winnt2k.c CompileCpp=0 Folder=Port-winnt2k Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd=$(CC) -c lowlevel-winnt2k.c -o lowlevel-winnt2k.o $(CFLAGS) [Unit92] FileName=..\poslib\poslib\exception.cpp CompileCpp=1 Folder=poslib Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit93] FileName=..\poslib\poslib\lexfn.cpp CompileCpp=1 Folder=poslib Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit94] FileName=..\poslib\poslib\masterfile.cpp CompileCpp=1 Folder=poslib Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit95] FileName=..\poslib\poslib\postime.cpp CompileCpp=1 Folder=poslib Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit96] FileName=..\poslib\poslib\random.cpp CompileCpp=1 Folder=poslib Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit97] FileName=..\poslib\poslib\resolver.cpp CompileCpp=1 Folder=poslib Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit98] FileName=..\poslib\poslib\rr.cpp CompileCpp=1 Folder=poslib Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit99] FileName=..\ClntCfgMgr\ClntCfgTA.cpp CompileCpp=1 Folder=ClntCfgMgr Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit100] FileName=..\Options\OptDUID.cpp CompileCpp=1 Folder=Options Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit101] FileName=..\Options\OptFQDN.cpp CompileCpp=1 Folder=Options Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit102] FileName=..\ClntOptions\ClntOptTA.cpp CompileCpp=1 Folder=ClntOptions Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit103] FileName=..\Options\OptTA.cpp CompileCpp=1 Folder=Options Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit104] FileName=..\Options\OptIA_PD.cpp CompileCpp=1 Folder=Options Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit105] FileName=..\Options\OptIAPrefix.cpp CompileCpp=1 Folder=Options Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit106] FileName=..\Options\OptInteger.cpp CompileCpp=1 Folder=Options Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit107] FileName=..\ClntCfgMgr\ClntCfgPD.cpp CompileCpp=1 Folder=ClntCfgMgr Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit108] FileName=..\ClntCfgMgr\ClntCfgPrefix.cpp CompileCpp=1 Folder=ClntCfgMgr Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit109] FileName=..\ClntOptions\ClntOptIA_PD.cpp CompileCpp=1 Folder=ClntOptions Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit110] FileName=..\ClntOptions\ClntOptVendorSpec.cpp CompileCpp=1 Folder=ClntOptions Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit111] FileName=..\ClntOptions\ClntOptIAPrefix.cpp CompileCpp=1 Folder=ClntOptions Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit112] FileName=..\AddrMgr\AddrPrefix.cpp CompileCpp=1 Folder=AddrMgr Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit113] FileName=..\Misc\hmac-sha-md5.c CompileCpp=0 Folder=Misc Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd=$(CC) -c hmac-sha-md5.c -o hmac-sha-md5.o $(CFLAGS) [Unit114] FileName=..\Misc\md5.c CompileCpp=0 Folder=Misc Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd=$(CC) -c md5.c -o md5.o $(CFLAGS) [Unit115] FileName=..\Misc\sha1.c CompileCpp=0 Folder=Misc Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd=$(CC) -c sha1.c -o sha1.o $(CFLAGS) [Unit116] FileName=..\Misc\sha256.c CompileCpp=0 Folder=Misc Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd=$(CC) -c sha256.c -o sha256.o $(CFLAGS) [Unit117] FileName=..\Misc\sha512.c CompileCpp=0 Folder=Misc Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd=$(CC) -c sha512.c -o sha512.o $(CFLAGS) [Unit118] FileName=..\ClntOptions\ClntOptAuthentication.cpp CompileCpp=1 Folder=ClntOptions Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit119] FileName=..\Options\OptAuthentication.cpp CompileCpp=1 Folder=Options Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit120] FileName=..\Messages\Msg.h CompileCpp=1 Folder=Messages Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit121] FileName=..\Misc\SmartPtr.h CompileCpp=1 Folder=Misc Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit122] FileName=..\ClntOptions\ClntOptAddrParams.cpp CompileCpp=1 Folder=ClntOptions Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit124] FileName=..\Options\OptKeyGeneration.cpp CompileCpp=1 Folder=Options Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit125] FileName=..\Options\OptAAAAuthentication.cpp CompileCpp=1 Folder=Options Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit126] FileName=..\ClntOptions\ClntOptKeyGeneration.cpp CompileCpp=1 Folder=ClntOptions Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit123] FileName=..\Misc\KeyList.cpp CompileCpp=1 Folder=Misc Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit127] FileName=..\ClntOptions\ClntOptAAAAuthentication.cpp CompileCpp=1 Folder=ClntOptions Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit128] FileName=..\poslib\poslib\w32poll.cpp CompileCpp=1 Folder=poslib Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= dibbler-1.0.1/Port-winnt2k/INFO0000664000175000017500000000763012233256142013041 00000000000000================================================================================ Dibbler 0.4.0 for Windows 2000/NT4 by , rev. 2005-07-22-001 ================================================================================ Introduction: ------------- I needed DHCPv6 client for Windows 2000. Dibbler looked great at the first sight, but soon I realized that author dropped w2k support some time ago. And because I was unable to find some other DHCPv6 client for w2k, I decided to look what can be done with Dibbler. And since I don't know C much, I was a bit surprised when I was successfull. :) With rev. 2005-07-22-001 it works for Windows NT 4.0 too. It means that every version of Windows with IPv6 stack can use Dibbler. Well, client only, but thats probably enough. Status: ------- client: compiles and works ok (I use it and it does what it is supposed to) server: fails with "Unable to join multicast group" relay: compiles and executes, but further untested; will probably fail in same way as server Requirements: ------------- - MinGW 4.1.0 - MSYS 1.0 - tpipv6.h and wspiapi.h from Win2000 IPv6 install May work with some other compiler, but it is not tested. How to compile: --------------- - download and install MinGW and MSYS - copy tpipv6.h and wspiapi.h to {MINGWPATH}\include - download and unpack Dibbler 0.4.0 - apply this patch - cd into dibbler's directory and run "make" - pray ;) More information about changes: ------------------------------- I'm not a C coder, so all the changes I made are not guaranteed to be the best ones or even the correct ones. Don't be fooled by the fact that the resulting executable works for me. More detailed description of changes follows: -------------------------------------------------------------------------------- All changes outside /Port-winnt2k are because of MinGW compiler (conditional defines are used, so it should not break anything - it doesn't apply to Makefiles). Only content of Port directory have something to do with Windows 2000/NT. -------------------------------------------------------------------------------- - Makefile - Makefile.inc Few changes to make things work with just one "make". Basically redirection from Port-linux to Port-winnt2k. - ClntIfaceMgr\ClntIfaceIface.cpp Missing "unlink" fixed by including io.h. - Misc\DHCPServer.cpp MinGW doesn't have crtdbg.h and it seems it isn't needed anyway, so removed. - Misc\long128.cpp I don't know how to make MinGW use inline assembler -> C version for Linux seems to work. - Options\OptElapsed.cpp MinGW didn't like the typecast, removed. I'm not really sure if this is correct, but it seems to work. - Port-win2k\Makefile Created. - Port-win2k\addrpack.c - Port-win2k\ClntService.h - Port-win2k\RelService.h - Port-win2k\SrvService.h - Port-win2k\WinService.h Copied from /Port-win32. - Port-win2k\WinService.cpp Copied from /Port-win32 and disabled part with ChangeServiceConfig2 (NT4 doesn't have this function). - Port-win2k\client-win2k.cpp - Port-win2k\relay-win2k.cpp - Port-win2k\server-win2k.cpp Almost the same as xp files. Only renamed "ptr" because linker did not like the same variable in multiple files and I don't know better way to solve this. - Port-win2k\ClntService.cpp - Port-win2k\RelService.cpp - Port-win2k\SrvService.cpp Almost the same as in Port-win32. Removed crtdbg.h, renamed "ptr" and service dependencies in ClntService are different-the same as were in Dibbler 0.2.0-RC2. Maybe it is supposed to be like this or maybe it is an error, I don't know. But again, it seems to work. ;) - Port-win2k\lowlevel-win2k.c Basically a fusion of port-win2k\ipv6-wrapper.c and port-win2k\windowsfun.c from Dibbler 0.2.0-RC2 with some changes. Update for rev. 2005-07-22-001: Ported as much from Port-win32\lowlevel-win32.c as possible. ================================================================================ @EOFdibbler-1.0.1/Port-winnt2k/RelService.h0000664000175000017500000000225412233256142014574 00000000000000/* * Dibbler - a portable DHCPv6 * * authors: Tomasz Mrugalski * Marek Senderski * win2k version by * * $Id: RelService.h,v 1.1 2005-07-23 14:33:22 thomson Exp $ * * Released under GNU GPL v2 licence * */ class TRelService; #ifndef RELSERVICE_H #define RELSERVICE_H #include #include #include "winservice.h" #include "DHCPRelay.h" extern TRelService StaticService; class TRelService : public TWinService { public: TRelService(void); void Run(); void OnStop(); bool CheckAndInstall(); EServiceState ParseStandardArgs(int argc,char* argv[]); void setState(EServiceState status); static TRelService * getHandle() { return &StaticService; } ~TRelService(void); private: EServiceState status; }; #endif /* * $Log: not supported by cvs2svn $ */ dibbler-1.0.1/Port-winnt2k/server-winnt2k.cpp0000664000175000017500000000632712233256142015771 00000000000000/* * Dibbler - a portable DHCPv6 * * authors: Tomasz Mrugalski * Marek Senderski * win2k version by * * based on server-winxp.cpp,v 1.10 2005/02/01 22:39:20 thomson Exp $ * * $Id: server-winnt2k.cpp,v 1.3 2005-07-26 00:03:03 thomson Exp $ * * Released under GNU GPL v2 licence * */ #include #include #include #include #include "Portable.h" #include "DHCPServer.h" #include "WinService.h" #include "SrvService.h" #include "Logger.h" extern "C" int lowlevelInit(); extern TDHCPServer * srvPtr; void usage() { cout << "Usage:" << endl; cout << " server-winnt2k.exe ACTION -d dirname " << endl << " ACTION = status|start|stop|install|uninstall|run" << endl << " status - show status and exit" << endl << " start - start installed service" << endl << " stop - stop installed service" << endl << " install - install service" << endl << " uninstall - uninstall service" << endl << " run - run in console" << endl; } /* * Handle the CTRL-C, CTRL-BREAK signal. */ BOOL CtrlHandler( DWORD fdwCtrlType ) { switch( fdwCtrlType ) { case CTRL_C_EVENT: { srvPtr->stop(); return TRUE; } case CTRL_BREAK_EVENT: return FALSE; } return TRUE; } int main(int argc, char* argv[]) { cout << DIBBLER_COPYRIGHT1 << " (SERVER, WinNT/2000 port)" << endl; cout << DIBBLER_COPYRIGHT2 << endl; cout << DIBBLER_COPYRIGHT3 << endl; cout << DIBBLER_COPYRIGHT4 << endl; cout << endl; // get the service object TSrvService * SrvService = TSrvService::getHandle(); // load winsock library if it is not already loaded WSADATA wsaData; if( WSAStartup( MAKEWORD( 2, 2 ), &wsaData )) { cout<<"Unable to load WinSock 2.2"<ParseStandardArgs(argc, argv); SrvService->setState(status); // is this proper port? if (!SrvService->verifyPort()) { Log(Crit) << "Operating system version is not supported by this Dibbler port." << LogEnd; return -1; } SetConsoleCtrlHandler( (PHANDLER_ROUTINE) CtrlHandler, TRUE ); switch (status) { case STATUS: { SrvService->showStatus(); break; }; case START: { SrvService->StartService(); break; } case STOP: { SrvService->StopService(); break; } case INSTALL: { SrvService->Install(); break; } case UNINSTALL: { SrvService->Uninstall(); break; } case RUN: { SrvService->Run(); break; } case SERVICE: { SrvService->RunService(); break; } case INVALID: { cout << "Invalid usage." << endl; } case HELP: default: { usage(); } } return 0; } /* * $Log: not supported by cvs2svn $ * Revision 1.2 2005/07/24 16:00:03 thomson * Port WinNT/2000 related changes. * * Revision 1.1 2005/07/23 14:33:22 thomson * Port for win2k/NT added. * */ dibbler-1.0.1/Port-winnt2k/ClntService.h0000664000175000017500000000234112233256142014747 00000000000000/* * Dibbler - a portable DHCPv6 * * authors: Tomasz Mrugalski * Marek Senderski * win2k version by * * $Id: ClntService.h,v 1.2 2005-07-24 16:00:03 thomson Exp $ * * Released under GNU GPL v2 licence * */ #ifndef CLNTSERVICE_H #define CLNTSERVICE_H #include "winservice.h" class TClntService; extern TClntService StaticService; class TClntService : public TWinService { public: TClntService(void); void Run(); void OnStop(); void OnShutdown(); bool CheckAndInstall(); ~TClntService(void); EServiceState ParseStandardArgs(int argc, char* argv[]); void setState(EServiceState status); static TClntService * getHandle() { return &StaticService; } private: EServiceState status; }; #endif /* * $Log: not supported by cvs2svn $ * Revision 1.1 2005/07/23 14:33:22 thomson * Port for win2k/NT added. * */ dibbler-1.0.1/Port-winnt2k/Makefile.am0000664000175000017500000000233112233256142014410 00000000000000SUBDIRS = . dist_noinst_DATA = client.log client-winnt2k.cpp ClntService.cpp ClntService.h config.h dibbler-client.dev dibbler-client.ico dibbler-client.layout dibbler.iss dibbler-relay.dev dibbler-relay.ico dibbler-relay.layout dibbler-requestor.dev dibbler-requestor.layout dibbler-server.dev dibbler-server.ico dibbler-server.layout INFO lowlevel-winnt2k.c Makefile Makefile.win relay.log relay-winnt2k.cpp RelService.cpp RelService.h server.log server-winnt2k.cpp SrvService.cpp SrvService.h tpipv6.h WinService.cpp WinService.h wspiapi.h # ============================================================ # === C low level stuff ====================================== # ============================================================ lowlevel-winnt2k.o: lowlevel-winnt2k.c @echo "[CC ] $(SUBDIR)/$@" $(CC) $(COPTS) -c $< ClntService.o: ClntService.cpp @echo "[CXX ] $(SUBDIR)/$@" $(CXX) -I../include $(OPTS) -c -o $@ $< SrvService.o: SrvService.cpp @echo "[CXX ] $(SUBDIR)/$@" $(CXX) -I../include $(OPTS) -c -o $@ $< RelService.o: RelService.cpp @echo "[CXX ] $(SUBDIR)/$@" $(CXX) -I../include $(OPTS) -c -o $@ $< WinService.o: WinService.cpp @echo "[CXX ] $(SUBDIR)/$@" $(CXX) -I../include $(OPTS) -c -o $@ $< dibbler-1.0.1/Port-winnt2k/lowlevel-winnt2k.c0000644000175000017500000004135412277722750015764 00000000000000/* * Dibbler - a portable DHCPv6 * * authors: Tomasz Mrugalski * win2k version by * * based on code from Dibbler 0.2.0-RC2 and Dibbler 0.4.0 * * released under GNU GPL v2 licence * */ /* this file contains lowlevel functions for M$ Windows 2000. It uses ipv6.exe to perform various low level tasks. */ #define WIN32_LEAN_AND_MEAN #include #include #include #include #include #include #include #include #include #include #include #include #include "Portable.h" #define ERROR_MESSAGE_SIZE 1024 static char Message[ERROR_MESSAGE_SIZE] = {0}; static void error_message_set(int errCode); static void error_message_set_string(char *str); char * error_message() { return Message; } void error_message_set(int errCode) { char tmp[ERROR_MESSAGE_SIZE-10]; FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS | FORMAT_MESSAGE_MAX_WIDTH_MASK, NULL, errCode, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPSTR)tmp, ERROR_MESSAGE_SIZE-10, NULL); sprintf(Message, "Error %d: %s\n", errCode, tmp); } /* From the net: The header files distributed in the MSDN Technology Preview define ipv6_mreq so that it is 2 byte aligned, while wship6.dll and tcpip6.sys were compiled with header files that defined mreq_size as 8 byte aligned. This makes a difference in the size of ipv6_mreq because the 4 byte ipv6mr_interface field (u_int) is allocated 8 bytes and therefore the size of ipv6_mreq increases from 20 to 24 bytes. The problem can be fixed by forcing ipv6_mreq in tpipv6.h to 8 byte alignment. Additional comments by Sob: - I don't know if this is proper solution of "forcing to 8 byte alignment", but it works ;) - changing the definition in tpipv6.h has no effect, probably definition from ws2tcpip.h is used and it seems like very bad idea to change it there -> that's the reason for own definition here */ typedef struct w2k_ipv6_mreq { struct in6_addr ipv6mr_multiaddr; // IPv6 multicast address. unsigned int ipv6mr_interface; // Interface index. char padding[4]; } W2K_IPV6_MREQ; char ipv6Path[256]; char cmdPath[256]; char tmpFile[256]; /* Find ipv6.exe */ int lowlevelInit() { char buf[256]; FILE *f; int i; i = GetEnvironmentVariable("SYSTEMROOT",buf, 256); if (!i) { printf("Environment variable SYSTEMROOT not set.\n"); return 0; } strcpy(buf+i,"\\system32\\ipv6.exe"); if (!(f=fopen(buf,"r"))) { printf("Unable to open %s file.\n",buf); return 0; } fclose(f); strncpy(ipv6Path, buf, 256); strcpy(buf+i,"\\system32\\cmd.exe"); strncpy(cmdPath, buf, 256); /// @todo: Use mktmpfile or something similar strcpy(buf+i,"\\dibbler-ipv6.tmp"); memcpy(tmpFile, buf, 256); // return 1; } char * displayError(int errCode) { static char Message[1024]; printf("Error %d:",errCode); FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS | FORMAT_MESSAGE_MAX_WIDTH_MASK, NULL, errCode, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPSTR)Message, 1024, NULL); printf("%s\n",Message); return Message; } void if_list_release(struct iface * list) { struct iface * tmp; while (list) { tmp = list->next; if (list->linkaddrcount) free(list->linkaddr); free(list); list = tmp; } } extern struct iface* if_list_get() { struct iface * head = NULL; struct iface * tmp; int pos; char * bufPtr; char buf[512]; char * name; char * tmpbuf; FILE *f; int result = spawnl(_P_WAIT,cmdPath,cmdPath,"/C",ipv6Path,"if",">",tmpFile,NULL); if (result<0) { printf("ERROR: unable to run ipv6.exe\n"); return NULL; } if ( ! (f=fopen(tmpFile,"r")) ) { printf("ERROR: unable to open %s file\n",tmpFile); return NULL; } while ( !feof(f)) { fgets(buf,511,f); // Interface 1 (site 1): my network interface if (strstr(buf,"Interface ")) { tmp = (struct iface*)malloc(sizeof(struct iface)); memset(tmp, 0, sizeof(struct iface)); tmp->next = head; memset(tmp->mac,0,255); tmp->maclen = 0; tmp->linkaddrcount = 0; tmp->hardwareType = 1; // other (ipifcons.h) tmp->flags = 0; head = tmp; printf(">>>%s",(buf+10)); tmp->id = atoi(buf+10); name = (strstr(buf+10,":")+2); name[ strlen(name)-1] = 0; sprintf(tmp->name,name); } // link-level address: 00-11-22-33-44-55 if (strstr(buf,"link-level address:")) { printf("###(%d)%s",strlen(buf+22),buf+22); if (strlen(buf+22)==18) { // ethernet tmp->hardwareType = 6; tmp->flags = IF_UP | IF_RUNNING | IF_MULTICAST; sscanf( (buf+22) ,"%2x-%2x-%2x-%2x-%2x-%2x", tmp->mac, tmp->mac+1, tmp->mac+2, tmp->mac+3, tmp->mac+4, tmp->mac+5); tmp->maclen=6; } else if (strlen(buf+22) > 7) { // tunnel 0.0.0.0 tmp->hardwareType = 131; // tunnel sscanf( (buf+22), "%3d.%3d.%3d.%3d", tmp->mac, tmp->mac+1, tmp->mac+2, tmp->mac+3); tmp->maclen = 4; } else if (strlen(buf+22) < 2) { // loopback "" tmp->hardwareType = 24; // loopback tmp->flags = IF_UP | IF_RUNNING | IF_LOOPBACK | IF_MULTICAST; tmp->maclen = 0; } else { tmp->hardwareType = 1; // unknown tmp->flags = IF_UP | IF_RUNNING | IF_MULTICAST; // uncomment this if you like cute defaults // tmp->hardwareType = 132; // coffee pot } } // link-local address if (strstr(buf,"fe80::")) { bufPtr = strstr(buf,","); if (bufPtr) *bufPtr = 0; //printf("ADDR=[%s]",strstr(buf,"fe80::")); fflush(stdout); pos = (tmp->linkaddrcount + 1)*16; //printf("Alokuje %d pamieci.\n",pos); tmpbuf = (char*) malloc( pos ); memcpy(tmpbuf,tmp->linkaddr, pos - 16); inet_pton6( strstr(buf,"fe80::"), tmpbuf + tmp->linkaddrcount*16); free(tmp->linkaddr); tmp->linkaddr = tmpbuf; tmp->linkaddrcount++; } } fclose(f); return tmp; } extern int is_addr_tentative(char* ifacename, int iface, char* plainAddr) { int result; char buf[512]; FILE *f; sprintf(buf, "%d",iface); result = spawnl(_P_WAIT,cmdPath,cmdPath,"/C",ipv6Path,"if",buf,">",tmpFile,NULL); if (result<0) { printf("ERROR: unable to run ipv6.exe\n"); return -1; } if ( ! (f=fopen(tmpFile,"r")) ) { printf("ERROR: unable to open %s file\n",tmpFile); return -1; } while ( !feof(f)) { fgets(buf,511,f); if (strstr(buf,plainAddr) && strstr(buf,"duplicate") ) { fclose(f); return 1; // duplicate } } fclose(f); return 0; // address ok } int ipaddr_add(const char* ifacename, int ifindex, const char* addr, unsigned long pref, unsigned long valid, int prefixLength) { char addr2[128]; char buf[64]; int result; sprintf(buf,"%u/%u",valid,pref); sprintf(addr2,"%d/%s", ifindex, addr); result = spawnl(_P_WAIT,cmdPath,cmdPath,"/C",ipv6Path, "adu",addr2,"lifetime",buf,">",tmpFile,NULL); if (result<0) { return result; } return 0; } int ipaddr_update(const char* ifacename, int ifindex, const char* addr, unsigned long pref, unsigned long valid, int prefixLength) { return ipaddr_add(ifacename, ifindex, addr, pref, valid, prefixLength); } int ipaddr_del(const char* ifacename, int ifindex, const char* addr, int prefixLength) { return ipaddr_add(ifacename, ifindex, addr, 0, 0, prefixLength); } SOCKET mcast=0; extern int sock_add(char * ifacename,int ifaceid, char * addr, int port, int thisifaceonly, int reuse) { SOCKET s; struct sockaddr_in6 bindme; struct w2k_ipv6_mreq ipmreq; int hops=1; char packedAddr[16]; //char multiAddr[16] = { 0xff,2, 0,0, 0,0, 0,0, 0,0, 0,0, 0,1, 0,2}; inet_pton6(addr,packedAddr); if ((s=socket(AF_INET6,SOCK_DGRAM, 0)) == INVALID_SOCKET) return -2; memset(&bindme, 0, sizeof(bindme)); bindme.sin6_family = AF_INET6; bindme.sin6_port = htons(port); if (IN6_IS_ADDR_LINKLOCAL((IN6_ADDR*)packedAddr)) bindme.sin6_scope_id = ifaceid; if (!IN6_IS_ADDR_MULTICAST((IN6_ADDR*)packedAddr)) { inet_pton6(addr, (char*)&bindme.sin6_addr); } // REUSEADDR must be before bind() in order to take effect if (setsockopt(s, SOL_SOCKET, SO_REUSEADDR, (const char*)&hops, sizeof(hops))) return -9; if (bind(s, (struct sockaddr*)&bindme, sizeof(bindme))) { // displayError(WSAGetLastError()); return -4; } if (IN6_IS_ADDR_MULTICAST((IN6_ADDR*)packedAddr)) { /* multicast */ ipmreq.ipv6mr_interface=ifaceid; memcpy(&ipmreq.ipv6mr_multiaddr,packedAddr,16); if(setsockopt(s,IPPROTO_IPV6,IPV6_ADD_MEMBERSHIP,(char*)&ipmreq,sizeof(ipmreq))) return -6; if(setsockopt(s,IPPROTO_IPV6,IPV6_MULTICAST_HOPS,(char*)&hops,sizeof(hops))) return -5; } return s; } int sock_del(int fd) { return closesocket(fd); } int sock_send(int fd, char * addr, char * buf, int buflen, int port,int iface) { struct addrinfo inforemote,*remote; char addrStr[sizeof("ffff:ffff:ffff:ffff:ffff:ffff:255.255.255.255")+5]; char portStr[10]; int i; char packaddr[16]; char ifaceStr[10]; memset(addrStr, 0, sizeof(addrStr)); memset(portStr, 0, sizeof(portStr)); memset(packaddr, 0, sizeof(packaddr)); memset(ifaceStr, 0, sizeof(ifaceStr)); strcpy(addrStr,addr); itoa(port,portStr,10); itoa(iface,ifaceStr,10); inet_pton6(addrStr,packaddr); if(IN6_IS_ADDR_LINKLOCAL((struct in6_addr*)packaddr) ||IN6_IS_ADDR_SITELOCAL((struct in6_addr*)packaddr)) strcat(strcat(addrStr,"%"),ifaceStr); #if 0 /* if (IN6_IS_ADDR_MULTICAST((IN6_ADDR*)addr)) { ipmreq.ipv6mr_interface=4; memcpy(&ipmreq.ipv6mr_multiaddr,addr,16); if(setsockopt(fd,IPPROTO_IPV6,IPV6_ADD_MEMBERSHIP,(char*)&ipmreq,sizeof(ipmreq))) return -1; //WSAGetLastError(); //int hops=8; //if(setsockopt(fd,IPPROTO_IPV6,IPV6_MULTICAST_HOPS,(char*)&hops,sizeof(hops))) // return -1; //WSAGetLastError(); }*/ #endif memset(&inforemote, 0, sizeof(inforemote)); inforemote.ai_flags=AI_NUMERICHOST; inforemote.ai_family=PF_INET6; inforemote.ai_socktype=SOCK_DGRAM; inforemote.ai_protocol=IPPROTO_IPV6; //inet_ntop6(addr,addrStr); if(getaddrinfo(addrStr,portStr,&inforemote,&remote)) return 0; if (i=sendto(fd,buf,buflen,0,remote->ai_addr,remote->ai_addrlen)) { freeaddrinfo(remote); if (i<0) displayError(WSAGetLastError()); return 0; } /* if((setsockopt(fd,IPPROTO_IPV6,IPV6_DROP_MEMBERSHIP,(char*)&ipmreq,sizeof(ipmreq)))) return WSAGetLastError();*/ freeaddrinfo(remote); return i; } int sock_recv(int fd, char * myPlainAddr, char * peerPlainAddr, char * buf, int buflen) { struct sockaddr_in6 info; int infolen ; int readBytes; infolen=sizeof(info); if(!(readBytes=recvfrom(fd,buf,buflen,0,(SOCKADDR*)&info,&infolen))) { return -1; } else { #ifdef MINGWBUILD inet_ntop6((const char *)info.sin6_addr._S6_un._S6_u8,peerPlainAddr); #else inet_ntop6(info.sin6_addr.u.Byte,peerPlainAddr); #endif return readBytes; } } extern int dns_add(const char* ifname, int ifindex, const char* addrPlain) { // I think Windows NT/2000 does not support DNS over IPv6... return 0; } extern int dns_del(const char* ifname, int ifindex, const char* addrPlain) { // I think Windows NT/2000 does not support DNS over IPv6... return 0; } extern int domain_add(const char* ifname, int ifindex, const char* domain) { return 0; } extern int domain_del(const char* ifname, int ifindex, const char* domain) { return 0; } extern int ntp_add(const char* ifname, int ifindex, const char* addrPlain) { return 0; } extern int ntp_del(const char* ifname, int ifindex, const char* addrPlain) { return 0; } extern int timezone_set(const char* ifname, int ifindex, const char* timezone) { return 0; } extern int timezone_del(const char* ifname, int ifindex, const char* timezone) { return 0; } extern int sipserver_add(const char* ifname, int ifindex, const char* addrPlain) { return 0; } extern int sipserver_del(const char* ifname, int ifindex, const char* addrPlain) { return 0; } extern int sipdomain_add(const char* ifname, int ifindex, const char* domain) { return 0; } extern int sipdomain_del(const char* ifname, int ifindex, const char* domain) { return 0; } extern int nisserver_add(const char* ifname, int ifindex, const char* addrPlain) { return 0; } extern int nisserver_del(const char* ifname, int ifindex, const char* addrPlain) { return 0; } extern int nisdomain_set(const char* ifname, int ifindex, const char* domain) { return 0; } extern int nisdomain_del(const char* ifname, int ifindex, const char* domain) { return 0; } extern int nisplusserver_add(const char* ifname, int ifindex, const char* addrPlain) { return 0; } extern int nisplusserver_del(const char* ifname, int ifindex, const char* addrPlain) { return 0; } extern int nisplusdomain_set(const char* ifname, int ifindex, const char* domain) { return 0; } extern int nisplusdomain_del(const char* ifname, int ifindex, const char* domain) { return 0; } int prefix_add(const char* ifname, int ifindex, const char* prefixPlain, int prefixLength, unsigned long prefered, unsigned long valid) { // ipv6 rtu 2000::/64 4 life 1800/900 publish char arg1[]="rtu"; char arg2[256]; // 2000::/64 char arg3[256]; // ifindex char arg4[]="life"; char arg5[256]; // 1800/900 char arg6[]="age"; char arg7[]="publish"; // publish int i; sprintf(arg2, "%s/%d", prefixPlain, prefixLength); sprintf(arg3,"%d", ifindex); sprintf(arg5,"%u/%u", valid, prefered); i=_spawnl(_P_WAIT,cmdPath,cmdPath, "/C", ipv6Path, arg1, arg2, arg3, arg4, arg5, arg6, arg7, NULL); if (i==-1) { /// @todo: some better error support return LOWLEVEL_ERROR_UNSPEC; } return LOWLEVEL_NO_ERROR; } int prefix_update(const char* ifname, int ifindex, const char* prefixPlain, int prefixLength, unsigned long prefered, unsigned long valid) { return prefix_add(ifname, ifindex, prefixPlain, prefixLength, prefered, valid); } int prefix_del(const char* ifname, int ifindex, const char* prefixPlain, int prefixLength) { return prefix_add(ifname, ifindex, prefixPlain, prefixLength, 0, 0); } /* when updating this file, remember to also update copy in Port-win32/lowlevel-win32.c */ uint32_t getAAASPIfromFile() { char filename[1024]; struct stat st; uint32_t ret; FILE *file; strcpy(filename, "AAA-SPI"); if (stat(filename, &st)) return 0; file = fopen(filename, "r"); if (!file) return 0; fscanf(file, "%10x", &ret); fclose(file); return ret; } /* when updating this file, remember to also update copy in Port-win32/lowlevel-win32.c */ char * getAAAKeyFilename(uint32_t SPI) { static char filename[1024]; if (SPI) snprintf(filename, 1024, "%s%s%x", "", "AAA-key-", SPI); else strcpy(filename, "AAA-key"); return filename; } /* when updating this file, remember to also update copy in Port-win32/lowlevel-win32.c */ char * getAAAKey(uint32_t SPI, uint32_t *len) { char * filename; struct stat st; char * retval; int offset = 0; int fd; filename = getAAAKeyFilename(SPI); if (stat(filename, &st)) return NULL; fd = open(filename, O_RDONLY); if (0 > fd) return NULL; retval = malloc(st.st_size); if (!retval) { close(fd); return NULL; } while (offset < st.st_size) { int ret = read(fd, retval + offset, st.st_size - offset); if (!ret) break; if (ret < 0) { free(retval); return NULL; } offset += ret; } close(fd); if (offset != st.st_size) { free(retval); return NULL; } *len = st.st_size; return retval; } dibbler-1.0.1/Port-winnt2k/client.log0000664000175000017500000000000012233256142014324 00000000000000dibbler-1.0.1/Port-winnt2k/tpipv6.h0000664000175000017500000002572712233256142013773 00000000000000/*++ Copyright (c) 2000 Microsoft Corporation Module Name: tpipv6.h Abstract: This module contains IPv6-specific extensions, and address family independent extensions to Winsock for the IPv6 Technology Preview. --*/ #ifndef _TPIPV6_ #define _TPIPV6_ #ifdef _MSC_VER #define TPIPV6_INLINE __inline #else #define TPIPV6_INLINE extern inline /* GNU style */ #endif #ifdef __cplusplus #define TPIPV6_EXTERN extern "C" #else #define TPIPV6_EXTERN extern #endif #ifdef _WINSOCK2API_ /* This section gets included if winsock2.h is included */ #ifndef IPPROTO_IPV6 #define IPPROTO_IPV6 41 typedef unsigned __int64 u_int64; // // Portable socket structure. // // // Desired design of maximum size and alignment. // These are implementation specific. // #define _SS_MAXSIZE 128 // Maximum size. #define _SS_ALIGNSIZE (sizeof(__int64)) // Desired alignment. // // Definitions used for sockaddr_storage structure paddings design. // #define _SS_PAD1SIZE (_SS_ALIGNSIZE - sizeof (short)) #define _SS_PAD2SIZE (_SS_MAXSIZE - (sizeof (short) + _SS_PAD1SIZE \ + _SS_ALIGNSIZE)) struct sockaddr_storage { short ss_family; // Address family. char __ss_pad1[_SS_PAD1SIZE]; // 6 byte pad, this is to make // implementation specific pad up to // alignment field that follows explicit // in the data structure. __int64 __ss_align; // Field to force desired structure. char __ss_pad2[_SS_PAD2SIZE]; // 112 byte pad to achieve desired size; // _SS_MAXSIZE value minus size of // ss_family, __ss_pad1, and // __ss_align fields is 112. }; typedef struct sockaddr_storage SOCKADDR_STORAGE; typedef struct sockaddr_storage *PSOCKADDR_STORAGE; typedef struct sockaddr_storage FAR *LPSOCKADDR_STORAGE; #endif /* !IPPROTO_IPV6 */ #endif /* _WINSOCK2API_ */ #ifdef _WS2TCPIP_H_ /* This section gets included if ws2tcpip.h is included */ #ifndef IPV6_JOIN_GROUP #define in6_addr in_addr6 // Macro that works for both IPv4 and IPv6 #define SS_PORT(ssp) (((struct sockaddr_in*)(ssp))->sin_port) #define IN6ADDR_ANY_INIT { 0 } #define IN6ADDR_LOOPBACK_INIT { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1 } TPIPV6_EXTERN const struct in6_addr in6addr_any; TPIPV6_EXTERN const struct in6_addr in6addr_loopback; TPIPV6_INLINE int IN6_ADDR_EQUAL(const struct in6_addr *a, const struct in6_addr *b) { return (memcmp(a, b, sizeof(struct in6_addr)) == 0); } TPIPV6_INLINE int IN6_IS_ADDR_UNSPECIFIED(const struct in6_addr *a) { return IN6_ADDR_EQUAL(a, &in6addr_any); } TPIPV6_INLINE int IN6_IS_ADDR_LOOPBACK(const struct in6_addr *a) { return IN6_ADDR_EQUAL(a, &in6addr_loopback); } TPIPV6_INLINE int IN6_IS_ADDR_MULTICAST(const struct in6_addr *a) { return (a->s6_addr[0] == 0xff); } TPIPV6_INLINE int IN6_IS_ADDR_LINKLOCAL(const struct in6_addr *a) { return ((a->s6_addr[0] == 0xfe) && ((a->s6_addr[1] & 0xc0) == 0x80)); } TPIPV6_INLINE int IN6_IS_ADDR_SITELOCAL(const struct in6_addr *a) { return ((a->s6_addr[0] == 0xfe) && ((a->s6_addr[1] & 0xc0) == 0xc0)); } TPIPV6_INLINE int IN6_IS_ADDR_V4MAPPED(const struct in6_addr *a) { return ((a->s6_addr[0] == 0) && (a->s6_addr[1] == 0) && (a->s6_addr[2] == 0) && (a->s6_addr[3] == 0) && (a->s6_addr[4] == 0) && (a->s6_addr[5] == 0) && (a->s6_addr[6] == 0) && (a->s6_addr[7] == 0) && (a->s6_addr[8] == 0) && (a->s6_addr[9] == 0) && (a->s6_addr[10] == 0xff) && (a->s6_addr[11] == 0xff)); } TPIPV6_INLINE int IN6_IS_ADDR_V4COMPAT(const struct in6_addr *a) { return ((a->s6_addr[0] == 0) && (a->s6_addr[1] == 0) && (a->s6_addr[2] == 0) && (a->s6_addr[3] == 0) && (a->s6_addr[4] == 0) && (a->s6_addr[5] == 0) && (a->s6_addr[6] == 0) && (a->s6_addr[7] == 0) && (a->s6_addr[8] == 0) && (a->s6_addr[9] == 0) && (a->s6_addr[10] == 0) && (a->s6_addr[11] == 0) && !((a->s6_addr[12] == 0) && (a->s6_addr[13] == 0) && (a->s6_addr[14] == 0) && ((a->s6_addr[15] == 0) || (a->s6_addr[15] == 1)))); } TPIPV6_INLINE int IN6_IS_ADDR_MC_NODELOCAL(const struct in6_addr *a) { return IN6_IS_ADDR_MULTICAST(a) && ((a->s6_addr[1] & 0xf) == 1); } TPIPV6_INLINE int IN6_IS_ADDR_MC_LINKLOCAL(const struct in6_addr *a) { return IN6_IS_ADDR_MULTICAST(a) && ((a->s6_addr[1] & 0xf) == 2); } TPIPV6_INLINE int IN6_IS_ADDR_MC_SITELOCAL(const struct in6_addr *a) { return IN6_IS_ADDR_MULTICAST(a) && ((a->s6_addr[1] & 0xf) == 5); } TPIPV6_INLINE int IN6_IS_ADDR_MC_ORGLOCAL(const struct in6_addr *a) { return IN6_IS_ADDR_MULTICAST(a) && ((a->s6_addr[1] & 0xf) == 8); } TPIPV6_INLINE int IN6_IS_ADDR_MC_GLOBAL(const struct in6_addr *a) { return IN6_IS_ADDR_MULTICAST(a) && ((a->s6_addr[1] & 0xf) == 0xe); } /* Argument structure for IPV6_JOIN_GROUP and IPV6_LEAVE_GROUP */ typedef struct ipv6_mreq { struct in6_addr ipv6mr_multiaddr; // IPv6 multicast address. unsigned int ipv6mr_interface; // Interface index. } IPV6_MREQ; // // Socket options at the IPPROTO_IPV6 level. // #define IPV6_UNICAST_HOPS 4 // Set/get IP unicast hop limit. #define IPV6_MULTICAST_IF 9 // Set/get IP multicast interface. #define IPV6_MULTICAST_HOPS 10 // Set/get IP multicast ttl. #define IPV6_MULTICAST_LOOP 11 // Set/get IP multicast loopback. #define IPV6_ADD_MEMBERSHIP 12 // Add an IP group membership. #define IPV6_DROP_MEMBERSHIP 13 // Drop an IP group membership. #define IPV6_JOIN_GROUP IPV6_ADD_MEMBERSHIP #define IPV6_LEAVE_GROUP IPV6_DROP_MEMBERSHIP // // Socket options at the IPPROTO_UDP level. // #define UDP_CHECKSUM_COVERAGE 20 // Set/get UDP-Lite checksum coverage. // // Error codes from getaddrinfo(). // #define EAI_AGAIN WSATRY_AGAIN #define EAI_BADFLAGS WSAEINVAL #define EAI_FAIL WSANO_RECOVERY #define EAI_FAMILY WSAEAFNOSUPPORT #define EAI_MEMORY WSA_NOT_ENOUGH_MEMORY #define EAI_NODATA WSANO_DATA #define EAI_NONAME WSAHOST_NOT_FOUND #define EAI_SERVICE WSATYPE_NOT_FOUND #define EAI_SOCKTYPE WSAESOCKTNOSUPPORT // // Structure used in getaddrinfo() call. // typedef struct addrinfo { int ai_flags; // AI_PASSIVE, AI_CANONNAME, AI_NUMERICHOST. int ai_family; // PF_xxx. int ai_socktype; // SOCK_xxx. int ai_protocol; // 0 or IPPROTO_xxx for IPv4 and IPv6. size_t ai_addrlen; // Length of ai_addr. char *ai_canonname; // Canonical name for nodename. struct sockaddr *ai_addr; // Binary address. struct addrinfo *ai_next; // Next structure in linked list. } ADDRINFO, FAR * LPADDRINFO; // // Flags used in "hints" argument to getaddrinfo(). // #define AI_PASSIVE 0x1 // Socket address will be used in bind() call. #define AI_CANONNAME 0x2 // Return canonical name in first ai_canonname. #define AI_NUMERICHOST 0x4 // Nodename must be a numeric address string. #ifdef __cplusplus extern "C" { #endif WINSOCK_API_LINKAGE int WSAAPI getaddrinfo( IN const char FAR * nodename, IN const char FAR * servname, IN const struct addrinfo FAR * hints, OUT struct addrinfo FAR * FAR * res ); #if INCL_WINSOCK_API_TYPEDEFS typedef int (WSAAPI * LPFN_GETADDRINFO)( IN const char FAR * nodename, IN const char FAR * servname, IN const struct addrinfo FAR * hints, OUT struct addrinfo FAR * FAR * res ); #endif WINSOCK_API_LINKAGE void WSAAPI freeaddrinfo( IN struct addrinfo FAR * ai ); #if INCL_WINSOCK_API_TYPEDEFS typedef void (WSAAPI * LPFN_FREEADDRINFO)( IN struct addrinfo FAR * ai ); #endif #ifdef UNICODE #define gai_strerror gai_strerrorW #else #define gai_strerror gai_strerrorA #endif /* UNICODE */ // WARNING: The gai_strerror inline functions below use static buffers, // and hence are not thread-safe. We'll use buffers long enough to hold // 1k characters. Any system error messages longer than this will be // returned as empty strings. However 1k should work for the error codes // used by getaddrinfo(). #define GAI_STRERROR_BUFFER_SIZE 1024 TPIPV6_INLINE char * gai_strerrorA( IN int ecode) { DWORD dwMsgLen; static char buff[GAI_STRERROR_BUFFER_SIZE + 1]; dwMsgLen = FormatMessageA(FORMAT_MESSAGE_FROM_SYSTEM |FORMAT_MESSAGE_IGNORE_INSERTS, NULL, ecode, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPSTR)buff, GAI_STRERROR_BUFFER_SIZE, NULL); return buff; } TPIPV6_INLINE WCHAR * gai_strerrorW( IN int ecode ) { DWORD dwMsgLen; static WCHAR buff[GAI_STRERROR_BUFFER_SIZE + 1]; dwMsgLen = FormatMessageW(FORMAT_MESSAGE_FROM_SYSTEM |FORMAT_MESSAGE_IGNORE_INSERTS, NULL, ecode, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPWSTR)buff, GAI_STRERROR_BUFFER_SIZE, NULL); return buff; } typedef int socklen_t; WINSOCK_API_LINKAGE int WSAAPI getnameinfo( IN const struct sockaddr FAR * sa, IN socklen_t salen, OUT char FAR * host, IN DWORD hostlen, OUT char FAR * serv, IN DWORD servlen, IN int flags ); #if INCL_WINSOCK_API_TYPEDEFS typedef int (WSAAPI * LPFN_GETNAMEINFO)( IN const struct sockaddr FAR * sa, IN socklen_t salen, OUT char FAR * host, IN DWORD hostlen, OUT char FAR * serv, IN DWORD servlen, IN int flags ); #endif #define NI_MAXHOST 1025 // Max size of a fully-qualified domain name. #define NI_MAXSERV 32 // Max size of a service name. // // Flags for getnameinfo(). // #define NI_NOFQDN 0x01 // Only return nodename portion for local hosts. #define NI_NUMERICHOST 0x02 // Return numeric form of the host's address. #define NI_NAMEREQD 0x04 // Error if the host's name not in DNS. #define NI_NUMERICSERV 0x08 // Return numeric form of the service (port #). #define NI_DGRAM 0x10 // Service is a datagram service. #ifdef __cplusplus } #endif #endif /* !IPV6_JOIN_GROUP */ #endif /* _WS2TCPIP_H_ */ // // Unless the build environment is explicitly targeting // platforms that include built-in getaddrinfo() support, // include the backwards-compatibility version of the APIs. // #if !defined(_WIN32_WINNT) || (_WIN32_WINNT <= 0x0500) #include #endif #endif /* _TPIPV6_ */ dibbler-1.0.1/Port-winnt2k/dibbler-server.layout0000664000175000017500000001077712233256142016537 00000000000000[Editor_7] CursorCol=1 CursorRow=1 TopLine=1 LeftChar=1 Open=0 Top=0 [Editor_3] CursorCol=1 CursorRow=109 TopLine=74 LeftChar=1 Open=0 Top=0 [Editors] Focused=-1 Order= [Editor_0] Open=0 Top=0 [Editor_1] Open=0 Top=0 CursorCol=1 CursorRow=237 TopLine=245 LeftChar=1 [Editor_2] Open=0 Top=0 CursorCol=1 CursorRow=249 TopLine=215 LeftChar=1 [Editor_4] Open=0 Top=0 [Editor_5] Open=0 Top=0 [Editor_6] Open=0 Top=0 [Editor_8] Open=0 Top=0 [Editor_9] Open=0 Top=0 [Editor_10] Open=0 Top=0 [Editor_11] Open=0 Top=0 [Editor_12] Open=0 Top=0 CursorCol=1 CursorRow=36 TopLine=36 LeftChar=1 [Editor_13] Open=0 Top=0 [Editor_14] Open=0 Top=0 [Editor_15] Open=0 Top=0 CursorCol=1 CursorRow=1 TopLine=1 LeftChar=1 [Editor_16] Open=0 Top=0 CursorCol=3 CursorRow=2348 TopLine=2331 LeftChar=1 [Editor_17] Open=0 Top=0 CursorCol=3 CursorRow=2348 TopLine=2331 LeftChar=1 [Editor_18] Open=0 Top=0 [Editor_19] Open=0 Top=0 [Editor_20] Open=0 Top=0 CursorCol=22 CursorRow=32 TopLine=13 LeftChar=1 [Editor_21] Open=0 Top=0 [Editor_22] Open=0 Top=0 [Editor_23] Open=0 Top=0 [Editor_24] Open=0 Top=0 [Editor_25] Open=0 Top=0 [Editor_26] Open=0 Top=0 [Editor_27] Open=0 Top=0 [Editor_28] Open=0 Top=0 [Editor_29] Open=0 Top=0 [Editor_30] Open=0 Top=0 [Editor_31] Open=0 Top=0 [Editor_32] Open=0 Top=0 [Editor_33] Open=0 Top=0 [Editor_34] Open=0 Top=0 [Editor_35] Open=0 Top=0 [Editor_36] Open=0 Top=0 [Editor_37] Open=0 Top=0 [Editor_38] Open=0 Top=0 [Editor_39] Open=0 Top=0 [Editor_40] Open=0 Top=0 [Editor_41] Open=0 Top=0 [Editor_42] Open=0 Top=0 [Editor_43] Open=0 Top=0 [Editor_44] Open=0 Top=0 [Editor_45] Open=0 Top=0 [Editor_46] Open=0 Top=0 [Editor_47] Open=0 Top=0 [Editor_48] Open=0 Top=0 [Editor_49] Open=0 Top=0 [Editor_50] Open=0 Top=0 [Editor_51] Open=0 Top=0 [Editor_52] Open=0 Top=0 [Editor_53] Open=0 Top=0 [Editor_54] Open=0 Top=0 [Editor_55] Open=0 Top=0 [Editor_56] Open=0 Top=0 [Editor_57] Open=0 Top=0 [Editor_58] Open=0 Top=0 [Editor_59] Open=0 Top=0 [Editor_60] Open=0 Top=0 [Editor_61] Open=0 Top=0 [Editor_62] Open=0 Top=0 [Editor_63] Open=0 Top=0 [Editor_64] Open=0 Top=0 [Editor_65] Open=0 Top=0 [Editor_66] Open=0 Top=0 [Editor_67] Open=0 Top=0 [Editor_68] Open=0 Top=0 [Editor_69] Open=0 Top=0 [Editor_70] Open=0 Top=0 [Editor_71] Open=0 Top=0 CursorCol=1 CursorRow=45 TopLine=11 LeftChar=1 [Editor_72] Open=0 Top=0 CursorCol=1 CursorRow=45 TopLine=11 LeftChar=1 [Editor_73] Open=0 Top=0 [Editor_74] Open=0 Top=0 [Editor_75] Open=0 Top=0 [Editor_76] Open=0 Top=0 [Editor_77] Open=0 Top=0 [Editor_78] Open=0 Top=0 [Editor_79] Open=0 Top=0 [Editor_80] Open=0 Top=0 [Editor_81] Open=0 Top=0 [Editor_82] Open=0 Top=0 [Editor_83] Open=0 Top=0 [Editor_84] Open=0 Top=0 CursorCol=1 CursorRow=129 TopLine=97 LeftChar=1 [Editor_85] Open=0 Top=0 CursorCol=1 CursorRow=129 TopLine=97 LeftChar=1 [Editor_86] Open=0 Top=0 CursorCol=28 CursorRow=87 TopLine=66 LeftChar=1 [Editor_87] Open=0 Top=0 [Editor_88] Open=0 Top=0 [Editor_89] Open=0 Top=0 CursorCol=1 CursorRow=1 TopLine=1 LeftChar=1 [Editor_90] Open=0 Top=0 [Editor_91] Open=0 Top=0 CursorCol=1 CursorRow=24 TopLine=1 LeftChar=1 [Editor_92] Open=0 Top=0 CursorCol=1 CursorRow=24 TopLine=1 LeftChar=1 [Editor_93] Open=0 Top=0 [Editor_94] Open=0 Top=0 [Editor_95] Open=0 Top=0 [Editor_96] Open=0 Top=0 [Editor_97] Open=0 Top=0 [Editor_98] Open=0 Top=0 CursorCol=1 CursorRow=31 TopLine=14 LeftChar=1 [Editor_99] Open=0 Top=0 CursorCol=1 CursorRow=21 TopLine=3 LeftChar=1 [Editor_100] Open=0 Top=0 [Editor_101] Open=0 Top=0 CursorCol=1 CursorRow=21 TopLine=1 LeftChar=1 [Editor_102] Open=0 Top=0 CursorCol=1 CursorRow=1 TopLine=1 LeftChar=1 [Editor_103] Open=0 Top=0 CursorCol=1 CursorRow=1 TopLine=1 LeftChar=1 [Editor_104] Open=0 Top=0 CursorCol=1 CursorRow=1 TopLine=1 LeftChar=1 [Editor_105] Open=0 Top=0 CursorCol=1 CursorRow=1 TopLine=1 LeftChar=1 [Editor_106] Open=0 Top=0 CursorCol=1 CursorRow=1 TopLine=4 LeftChar=1 [Editor_107] Open=0 Top=0 CursorCol=1 CursorRow=1 TopLine=1 LeftChar=1 [Editor_108] Open=0 Top=0 CursorCol=13 CursorRow=14 TopLine=1 LeftChar=1 [Editor_109] Open=0 Top=0 [Editor_110] Open=0 Top=0 [Editor_111] Open=0 Top=0 [Editor_112] Open=0 Top=0 [Editor_113] Open=0 Top=0 [Editor_114] Open=0 Top=0 [Editor_115] Open=0 Top=0 CursorCol=1 CursorRow=1 TopLine=1 LeftChar=1 [Editor_116] Open=0 Top=0 [Editor_117] Open=0 Top=0 [Editor_118] Open=0 Top=0 [Editor_119] Open=0 Top=0 [Editor_120] Open=0 Top=0 [Editor_121] Open=0 Top=0 [Editor_122] Open=0 Top=0 [Editor_123] Open=0 Top=0 [Editor_124] Open=0 Top=0 [Editor_125] Open=0 Top=0 [Editor_126] Open=0 Top=0 [Editor_127] Open=0 Top=0 [Editor_128] Open=0 Top=0 [Editor_129] Open=0 Top=0 dibbler-1.0.1/Port-winnt2k/relay-winnt2k.cpp0000664000175000017500000000641012233256142015570 00000000000000/* * Dibbler - a portable DHCPv6 * * authors: Tomasz Mrugalski * Marek Senderski * win2k version by * * based on relay-win32.cpp,v 1.4 2005/02/01 22:39:20 thomson Exp $ * * $Id: relay-winnt2k.cpp,v 1.4 2007-05-05 15:40:33 thomson Exp $ * * Released under GNU GPL v2 licence * */ #include #include #include #include #include "Portable.h" #include "DHCPRelay.h" #include "WinService.h" #include "RelService.h" #include "Logger.h" extern "C" int lowlevelInit(); extern TDHCPRelay * relPtr; void usage() { cout << "Usage:" << endl; cout << " dibbler-relay.exe ACTION [-d c:\\path\\to\\config\\file]" << endl << " ACTION = status|start|stop|install|uninstall|run" << endl << " status - show status and exit" << endl << " start - start installed service" << endl << " stop - stop installed service" << endl << " install - install service" << endl << " uninstall - uninstall service" << endl << " run - run in console" << endl << endl << " -d parameter is optional." << endl; } /* * Handle the CTRL-C, CTRL-BREAK signal. */ BOOL CtrlHandler( DWORD fdwCtrlType ) { switch( fdwCtrlType ) { case CTRL_C_EVENT: { relPtr->stop(); return TRUE; } case CTRL_BREAK_EVENT: return FALSE; } return TRUE; } int main(int argc, char* argv[]) { cout << DIBBLER_COPYRIGHT1 << " (RELAY, WinNT/2000 port)" << endl; cout << DIBBLER_COPYRIGHT2 << endl; cout << DIBBLER_COPYRIGHT3 << endl; cout << DIBBLER_COPYRIGHT4 << endl; cout << endl; // get the service object TRelService * RelService = TRelService::getHandle(); WSADATA wsaData; if( WSAStartup( MAKEWORD( 2, 2 ), &wsaData )) { cout<<"Unable to load WinSock 2.2"<ParseStandardArgs(argc, argv); RelService->setState(status); // is this proper port? if (!RelService->verifyPort()) { Log(Crit) << "Operating system version is not supported by this Dibbler port." << LogEnd; return -1; } SetConsoleCtrlHandler( (PHANDLER_ROUTINE) CtrlHandler, TRUE ); switch (status) { case STATUS: { RelService->showStatus(); break; }; case START: { RelService->StartService(); break; } case STOP: { RelService->StopService(); break; } case INSTALL: { RelService->Install(); break; } case UNINSTALL: { RelService->Uninstall(); break; } case RUN: { RelService->Run(); break; } case SERVICE: { RelService->RunService(); break; } case INVALID: { cout << "Invalid usage." << endl; } case HELP: default: { usage(); } } return 0; } /* ugly workaround for some weird dev-cpp/mingw 3.4.2 problem */ void md5_init_ctx (struct md5_ctx *ctx) { } void md5_process_bytes (const void *buffer, size_t len, struct md5_ctx *ctx) { } void *md5_finish_ctx (struct md5_ctx *ctx, void *resbuf) { } dibbler-1.0.1/Port-winnt2k/dibbler-relay.dev0000664000175000017500000001564212233256142015602 00000000000000[Project] FileName=dibbler-relay.dev Name=dibbler-relay UnitCount=43 Type=1 Ver=1 ObjFiles= Includes=..\AddrMgr;..\CfgMgr;..\IfaceMgr;..\Messages;..\Misc;..\Options;..\Port-winnt2k;..\RelCfgMgr;..\RelIfaceMgr;..\RelMessages;..\RelOptions;..\RelTransMgr;..\TransMgr Libs= PrivateResource=dibbler-relay_private.rc ResourceIncludes= MakeIncludes= Compiler=-DMINGWBUILD -funsigned-char_@@_ CppCompiler=-D_GLIBCXX_USE_C99_DYNAMIC -DMINGWBUILD -funsigned-char_@@_ Linker=-lws2_32_@@_ IsCpp=1 Icon=dibbler-relay.ico ExeOutput= ObjectOutput= OverrideOutput=0 OverrideOutputName=dibbler-relay.exe HostApplication= Folders=CfgMgr,IfaceMgr,Messages,Misc,Options,Port-winnt2k,RelCfgMgr,RelIfaceMgr,RelMessages,RelOptions,RelTransMgr CommandLine= UseCustomMakefile=0 CustomMakefile= IncludeVersionInfo=0 SupportXPThemes=0 CompilerSet=0 CompilerSettings=0000000000000000000000 [Unit1] FileName=WinService.cpp CompileCpp=1 Folder=Port-winnt2k Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit2] FileName=lowlevel-winnt2k.c CompileCpp=0 Folder=Port-winnt2k Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd=$(CC) -c lowlevel-winnt2k.c -o lowlevel-winnt2k.o $(CFLAGS) [Unit4] FileName=RelService.cpp CompileCpp=1 Folder=Port-winnt2k Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit6] FileName=..\Misc\DHCPConst.cpp CompileCpp=1 Folder=Misc Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit8] FileName=..\Misc\DUID.cpp CompileCpp=1 Folder=Misc Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [VersionInfo] Major=0 Minor=1 Release=1 Build=1 LanguageID=1033 CharsetID=1252 CompanyName= FileVersion= FileDescription=Developed using the Dev-C++ IDE InternalName= LegalCopyright= LegalTrademarks= OriginalFilename= ProductName= ProductVersion= AutoIncBuildNr=0 [Unit3] FileName=relay-winnt2k.cpp CompileCpp=1 Folder=Port-winnt2k Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit5] FileName=..\Misc\Logger.cpp CompileCpp=1 Folder=Misc Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit10] FileName=..\Messages\Msg.cpp CompileCpp=1 Folder=Messages Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit11] FileName=..\RelMessages\RelMsgRelayRepl.cpp CompileCpp=1 Folder=RelMessages Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit12] FileName=..\RelMessages\RelMsg.cpp CompileCpp=1 Folder=RelMessages Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit7] FileName=..\Misc\DHCPRelay.cpp CompileCpp=1 Folder=Misc Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit9] FileName=..\Misc\IPv6Addr.cpp CompileCpp=1 Folder=Misc Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit13] FileName=..\RelMessages\RelMsgGeneric.cpp CompileCpp=1 Folder=RelMessages Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit14] FileName=..\RelMessages\RelMsgRelayForw.cpp CompileCpp=1 Folder=RelMessages Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit15] FileName=..\IfaceMgr\SocketIPv6.cpp CompileCpp=1 Folder=IfaceMgr Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit16] FileName=..\IfaceMgr\Iface.cpp CompileCpp=1 Folder=IfaceMgr Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit17] FileName=..\IfaceMgr\IfaceMgr.cpp CompileCpp=1 Folder=IfaceMgr Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit18] FileName=..\RelIfaceMgr\RelIfaceMgr.cpp CompileCpp=1 Folder=RelIfaceMgr Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit19] FileName=..\RelTransMgr\RelTransMgr.cpp CompileCpp=1 Folder=RelTransMgr Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit20] FileName=..\CfgMgr\CfgMgr.cpp CompileCpp=1 Folder=CfgMgr Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit21] FileName=..\RelCfgMgr\RelParsIfaceOpt.cpp CompileCpp=1 Folder=RelCfgMgr Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit22] FileName=..\RelCfgMgr\RelCfgIface.cpp CompileCpp=1 Folder=RelCfgMgr Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit23] FileName=..\RelCfgMgr\RelCfgMgr.cpp CompileCpp=1 Folder=RelCfgMgr Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit24] FileName=..\RelCfgMgr\RelLexer.cpp CompileCpp=1 Folder=RelCfgMgr Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit25] FileName=..\RelCfgMgr\RelParser.cpp CompileCpp=1 Folder=RelCfgMgr Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit26] FileName=..\RelCfgMgr\RelParsGlobalOpt.cpp CompileCpp=1 Folder=RelCfgMgr Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit27] FileName=..\Options\Opt.cpp CompileCpp=1 Folder=Options Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit28] FileName=..\RelOptions\RelOptRelayMsg.cpp CompileCpp=1 Folder=RelOptions Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit29] FileName=..\RelOptions\RelOptGeneric.cpp CompileCpp=1 Folder=RelOptions Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit30] FileName=..\RelOptions\RelOptInterfaceID.cpp CompileCpp=1 Folder=RelOptions Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit31] FileName=..\Options\OptGeneric.cpp CompileCpp=1 Folder=Options Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit32] FileName=..\Misc\addrpack.c CompileCpp=0 Folder=Misc Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd=$(CC) -c addrpack.c -o addrpack.o $(CFLAGS) [Unit33] FileName=..\Options\OptInteger.cpp CompileCpp=1 Folder= Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit34] FileName=..\Misc\sha512.c CompileCpp=0 Folder=Misc Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd=$(CC) -c sha512.c -o sha512.o $(CFLAGS) [Unit35] FileName=..\Misc\hmac-sha-md5.c CompileCpp=1 Folder=Misc Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit36] FileName=..\Misc\md5.c CompileCpp=0 Folder=Misc Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd=$(CC) -c md5.c -o md5.o $(CFLAGS) [Unit37] FileName=..\Misc\sha1.c CompileCpp=0 Folder=Misc Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd=$(CC) -c sha1.c -o sha1.o $(CFLAGS) [Unit38] FileName=..\Misc\sha256.c CompileCpp=0 Folder=Misc Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd=$(CC) -c sha256.c -o sha256.o $(CFLAGS) [Unit39] FileName=..\Misc\KeyList.cpp CompileCpp=1 Folder=Misc Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit40] FileName=..\Options\OptOptionRequest.cpp CompileCpp=1 Folder=Options Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit41] FileName=..\Options\OptVendorSpecInfo.cpp CompileCpp=1 Folder=Options Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit42] FileName=..\RelOptions\RelOptEcho.cpp CompileCpp=1 Folder=RelOptions Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit43] FileName=..\RelOptions\RelOptRemoteID.cpp CompileCpp=1 Folder=RelOptions Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= dibbler-1.0.1/Port-winnt2k/dibbler-client.ico0000664000175000017500000000566612233256142015745 00000000000000 è& ¨( @€€€€€€€€€ÀÀÀ€€€ÿÿÿÿÿÿÿÿÿÿÿÿÌÌÌÌ ÌÌÌÌÌÌÀ" ÌÌÌÌÌÌ À"" ÌÌÌÌÀ Ì*¢¢ ÌÌÌÀ`ÌÀª**" ÌÌÌÌ Ì*ªª¢¢ ÌÌÌÌÌ"*ªªª" ÌÌÌÌÀ" ªªªª¢" ÌÌ "" §ªªª¢"ÎÀ """ zzªª""ììÂ"""""§§§ª¢".ÎÎÂbb"""§zzª".îîìâ&&"" ¯w§ª.îîîîÂrbb""zwzz¢îîîî'f&""" §w¢.îîîâvgbb"" ú§®îîîîî'"v&&" ÿúîîîîîîâÌ"rb" ÿïîîîîîâîìÌ'f" ÿþþ"îîî". Ì'f"ÿÿâ".îîâ⢠Âr"ÿþò¢.îîîî* Ì""ò*¢"îîîîâ¢ÌÌ *ª¢".îîîî,ÌÌÀ zª""îîîîìì̧÷ªª".â,îîÌÀ zª¢""",î̧÷ªªª¢""ÌÌ §÷ªªª¢",À ªzªª" ªªªªÿðÿÿ€ÿþü?øðàÀÀ€€€€€€ÀÀàðøü?þÿ€ÿÿðÿ( @€€€€€€€€€ÀÀÀÀÜÀðʦÔðÿ±âÿŽÔÿkÆÿH¸ÿ%ªÿªÿ’Üz¹b–Js2PÔãÿ±ÇÿŽ«ÿkÿHsÿ%WÿUÿIÜ=¹1–%sPÔÔÿ±±ÿŽŽÿkkÿHHÿ%%ÿþܹ–sPãÔÿDZÿ«ŽÿkÿsHÿW%ÿUÿIÜ=¹1–%sPðÔÿâ±ÿÔŽÿÆkÿ¸Hÿª%ÿªÿ’Üz¹b–Js2PÿÔÿÿ±ÿÿŽÿÿkÿÿHÿÿ%ÿþþÜܹ¹––ssPPÿÔðÿ±âÿŽÔÿkÆÿH¸ÿ%ªÿªÜ’¹z–bsJP2ÿÔãÿ±ÇÿŽ«ÿkÿHsÿ%WÿUÜI¹=–1s%PÿÔÔÿ±±ÿŽŽÿkkÿHHÿ%%þܹ–sPÿãÔÿDZÿ«ŽÿkÿsHÿW%ÿUÜI¹=–1s%PÿðÔÿâ±ÿÔŽÿÆkÿ¸Hÿª%ÿªÜ’¹z–bsJP2ÿÿÔÿÿ±ÿÿŽÿÿkÿÿHÿÿ%þþÜܹ¹––ssPPðÿÔâÿ±ÔÿŽÆÿk¸ÿHªÿ%ªÿ’Üz¹b–Js2PãÿÔÇÿ±«ÿŽÿksÿHWÿ%UÿIÜ=¹1–%sPÔÿÔ±ÿ±ŽÿŽkÿkHÿH%ÿ%þܹ–sPÔÿã±ÿÇŽÿ«kÿHÿs%ÿWÿUÜI¹=–1s%PÔÿð±ÿâŽÿÔkÿÆHÿ¸%ÿªÿªÜ’¹z–bsJP2Ôÿÿ±ÿÿŽÿÿkÿÿHÿÿ%ÿÿþþÜܹ¹––ssPPòòòæææÚÚÚÎÎζ¶¶ªªªžžž’’’†††zzznnnbbbVVVJJJ>>>222&&&ðûÿ¤  €€€ÿÿÿÿÿÿÿÿÿÿÿÿ~~~~~~~~~~~~~~~o~o~~~~½Çǽoooooooo~o~~½~~½ÇÇÇǽooo{o{oooo½Õ½~~½®®Ç®Çǽ½o{{o{ooo½«½~~~Ç®®Ç®Ç®ÇÇǽ{{{o{ooo½ooo½½Ç««®®®®Ç®Çǽ{{{{{{o{oo½½Õսǫ®«®®®®ÇÇǽ{{{{{{{oo½¼¼¼½Õ®«««®«®«®®ÇÇǽ{{{{{½o½Ç¼¼¼¼Õ½®«²««®«®®®ÇÇǽˆ{ˆ{½Ç½Ç¼Ç¼¼¼½Õ®²«²««®«®ÇÇÇÕˆ{ˆ{{ÕÇÇÇǼǼ¼¼Õ®²«²«²««®Çǽ½ˆ{ˆ{ˆ{Õ«¯«ÇǼǼ¼Õ½®²²«²«««Ç½½ˆˆˆˆˆˆ{ˆÕ¯«¯«¼Ç¼Ç¼½Õ®â²²«²««½†ˆ†ˆˆˆˆˆˆ{Õ²¯«¯«¼Ç¼¼¼½ ®²²²«²««½†ˆ†ˆ†ˆˆˆÕ²««¯«¯Ç¼Ç¼¼Õ Ž®²²²«½½†††ˆ†ˆ†ˆÕ²««²«¯«¯¯¼Ç¼Õ ŽŽ®®²®†“††††ˆ†ˆ†ˆÕ²¼¼²«¯«¯«Ç¼Õ âŽŽŽ®““†“††††ˆ†ˆ†ˆÕ{{¼¼²¯«¯Ç¼Õ Žâޓޓ““††††††ˆ†Õˆˆˆ{{{¼²««ÇÇÕ ŽâޓޓÕÕ††††ˆ“¼ÕÕ†Õ½{{¼²««ÇÇ âŽâŽ“ÕÇÇÕ†††††“¼†¼®Õ½{{¼²ÇǼ ŽâŽ“ŽÕ®ÇÕˆ††††ˆ†ˆ†¼®Õ½{{¼¼Ç¼ ŽâÕÕ®®ÇÇÕˆ††††ˆ†ˆ†¼®¼{{{{¼ âÕ«««®ÇÇÇÕˆ††††ˆ†ˆ†¼{{{{{{®²â²«®®ÇÇÇÕˆ††ˆ†ˆˆˆ†{ˆ{{{®²â²«®®®ÇÇÕˆ†ÕÕ{ˆˆˆˆ{{{®²â²««®®ÇÇÕÕÇÇÕÕ{ˆˆ{{®²â²«««®®®®ÇÇÇÇÕ{{{{®®²â²««««®®®ÇÇÇÕ{{®®®²â²«««®®ÇÇÕ®®®®®®®®ÿðÿÿ€ÿþü?øðàÀÀ€€€€€€ÀÀàðøü?þÿ€ÿÿðÿdibbler-1.0.1/Port-winnt2k/dibbler-requestor.layout0000664000175000017500000000151512233256142017250 00000000000000[Editor_2] CursorCol=1 CursorRow=1 TopLine=1 LeftChar=1 Open=0 Top=0 [Editors] Order=-1 Focused=-1 [Editor_0] Open=0 Top=0 [Editor_1] Open=0 Top=0 [Editor_3] Open=1 Top=0 CursorCol=1 CursorRow=1 TopLine=1 LeftChar=1 [Editor_4] Open=0 Top=0 [Editor_5] Open=1 Top=0 CursorCol=42 CursorRow=5 TopLine=1 LeftChar=1 [Editor_6] Open=0 Top=0 [Editor_7] Open=0 Top=0 [Editor_8] Open=0 Top=0 [Editor_9] Open=0 Top=0 [Editor_10] Open=0 Top=0 [Editor_11] Open=0 Top=0 [Editor_12] Open=0 Top=0 [Editor_13] Open=1 Top=1 CursorCol=1 CursorRow=183 TopLine=144 LeftChar=1 [Editor_14] Open=0 Top=0 CursorCol=1 CursorRow=1 TopLine=1 LeftChar=1 [Editor_15] Open=0 Top=0 [Editor_16] Open=0 Top=0 [Editor_17] Open=0 Top=0 CursorCol=1 CursorRow=1 TopLine=1 LeftChar=1 [Editor_18] Open=0 Top=0 [Editor_19] Open=0 Top=0 [Editor_20] Open=0 Top=0 [Editor_21] Open=0 Top=0 dibbler-1.0.1/Port-winnt2k/SrvService.cpp0000664000175000017500000000775512233256142015172 00000000000000/* * Dibbler - a portable DHCPv6 * * authors: Tomasz Mrugalski * Marek Senderski * win2k version by * * based on SrvService.cpp,v 1.15 2005/03/08 00:43:48 thomson Exp * * $Id: SrvService.cpp,v 1.2 2005-07-24 16:00:03 thomson Exp $ * * Released under GNU GPL v2 licence * */ #include #include "SrvService.h" #include "DHCPClient.h" #include "Logger.h" #include "DHCPConst.h" TDHCPServer * srvPtr; TSrvService StaticService; TSrvService::TSrvService() :TWinService("DHCPv6Server","Dibbler - a DHCPv6 server",SERVICE_AUTO_START, "RpcSS\0tcpip6\0winmgmt\0", "Dibbler - a portable DHCPv6. This is DHCPv6 server, version " DIBBLER_VERSION ".") { } EServiceState TSrvService::ParseStandardArgs(int argc,char* argv[]) { bool dirFound = false; EServiceState status = INVALID; int n=1; while (nstop(); } bool TSrvService::CheckAndInstall() { // NT4 does not have winmgmt... OSVERSIONINFO verinfo; verinfo.dwOSVersionInfoSize=sizeof(OSVERSIONINFO); if(GetVersionEx(&verinfo) && (verinfo.dwMajorVersion < 5)) { Dependencies="RpcSS\0tcpip6\0"; } return Install(); } void TSrvService::Run() { if (_chdir(this->ServiceDir.c_str())) { Log(Crit) << "Unable to change directory to " << this->ServiceDir << ". Aborting.\n" << LogEnd; return; } string confile = SRVCONF_FILE; string oldconf = SRVCONF_FILE+(string)"-old"; string workdir = this->ServiceDir; string addrfile = SRVADDRMGR_FILE; string logFile = SRVLOG_FILE; logger::setLogName("Srv"); logger::Initialize((char*)logFile.c_str()); Log(Crit) << DIBBLER_COPYRIGHT1 << " (SERVER, WinNT/2000 port)" << LogEnd; string tmp1 = workdir+"\\"+confile; TDHCPServer server(tmp1); srvPtr = &server; // remember address server.setWorkdir(this->ServiceDir); if (!server.isDone()) server.run(); } void TSrvService::setState(EServiceState status) { this->status = status; } /* * $Log: not supported by cvs2svn $ * Revision 1.1 2005/07/23 14:33:22 thomson * Port for win2k/NT added. * */ dibbler-1.0.1/Port-winnt2k/SrvService.h0000664000175000017500000000225512233256142014625 00000000000000/* * Dibbler - a portable DHCPv6 * * authors: Tomasz Mrugalski * Marek Senderski * win2k version by * * $Id: SrvService.h,v 1.1 2005-07-23 14:33:22 thomson Exp $ * * Released under GNU GPL v2 licence * */ #ifndef SRVSERVICE_H #define SRVSERVICE_H #include #include #include "winservice.h" #include "DHCPServer.h" class TSrvService; extern TSrvService StaticService; class TSrvService : public TWinService { public: TSrvService(void); void Run(); void OnStop(); bool CheckAndInstall(); EServiceState ParseStandardArgs(int argc,char* argv[]); void setState(EServiceState status); static TSrvService * getHandle() { return &StaticService; } ~TSrvService(void); private: EServiceState status; }; #endif /* * $Log: not supported by cvs2svn $ */ dibbler-1.0.1/Port-winnt2k/RelService.cpp0000664000175000017500000001017012233256142015123 00000000000000/* * Dibbler - a portable DHCPv6 * * authors: Tomasz Mrugalski * Marek Senderski * win2k version by * * $Id: RelService.cpp,v 1.2 2005-07-24 16:00:03 thomson Exp $ * * Released under GNU GPL v2 licence * */ #include #include "RelService.h" #include "DHCPRelay.h" #include "Portable.h" #include "Logger.h" #include "DHCPConst.h" TDHCPRelay * relPtr; TRelService StaticService; TRelService::TRelService() :TWinService("DHCPv6Relay","Dibbler - a DHCPv6 relay",SERVICE_AUTO_START, "RpcSS\0tcpip6\0winmgmt\0", "Dibbler - a portable DHCPv6. This is DHCPv6 Relay, version " DIBBLER_VERSION ".") { } EServiceState TRelService::ParseStandardArgs(int argc,char* argv[]) { bool dirFound = false; EServiceState status = INVALID; int n=1; while (nstop(); } bool TRelService::CheckAndInstall() { // NT4 does not have winmgmt... OSVERSIONINFO verinfo; verinfo.dwOSVersionInfoSize=sizeof(OSVERSIONINFO); if(GetVersionEx(&verinfo) && (verinfo.dwMajorVersion < 5)) { Dependencies="RpcSS\0tcpip6\0"; } return Install(); } void TRelService::Run() { if (_chdir(this->ServiceDir.c_str())) { Log(Crit) << "Unable to change directory to " << this->ServiceDir << ". Aborting.\n" << LogEnd; return; } string confile = RELCONF_FILE; string oldconf = RELCONF_FILE+(string)"-old"; string workdir = this->ServiceDir; string logFile = RELLOG_FILE; logger::setLogName("Rel"); logger::Initialize((char*)logFile.c_str()); Log(Crit) << DIBBLER_COPYRIGHT1 << " (RELAY, WinNT/2000 port)" << LogEnd; TDHCPRelay relay(confile); relPtr = &relay; // remember address relay.setWorkdir(this->ServiceDir); if (!relay.isDone()) relay.run(); } void TRelService::setState(EServiceState status) { this->status = status; } /* * $Log: not supported by cvs2svn $ * Revision 1.1 2005/07/23 14:33:22 thomson * Port for win2k/NT added. * */ dibbler-1.0.1/Port-winnt2k/relay.log0000664000175000017500000000000012233256142014162 00000000000000dibbler-1.0.1/Port-winnt2k/wspiapi.h0000664000175000017500000006771612233256142014223 00000000000000/*++ Copyright (c) 2000, Microsoft Corporation Module Name: wspiapi.h Abstract: The file contains protocol independent API functions. Revision History: Wed Jul 12 10:50:31 2000, Created --*/ #ifndef _WSPIAPI_H_ #define _WSPIAPI_H_ #include // sprintf() #include // calloc(), strtoul() #include // calloc() #include // strlen(), strcmp(), strstr() #define WspiapiMalloc(tSize) calloc(1, (tSize)) #define WspiapiFree(p) free(p) #define WspiapiSwap(a, b, c) { (c) = (a); (a) = (b); (b) = (c); } #define getaddrinfo WspiapiGetAddrInfo #define getnameinfo WspiapiGetNameInfo #define freeaddrinfo WspiapiFreeAddrInfo typedef int (WINAPI *WSPIAPI_PGETADDRINFO) ( IN const char *nodename, IN const char *servname, IN const struct addrinfo *hints, OUT struct addrinfo **res); typedef int (WINAPI *WSPIAPI_PGETNAMEINFO) ( IN const struct sockaddr *sa, IN socklen_t salen, OUT char *host, IN size_t hostlen, OUT char *serv, IN size_t servlen, IN int flags); typedef void (WINAPI *WSPIAPI_PFREEADDRINFO) ( IN struct addrinfo *ai); #ifdef __cplusplus extern "C" { #endif //////////////////////////////////////////////////////////// // v4 only versions of getaddrinfo and friends. // NOTE: gai_strerror is inlined in ws2tcpip.h //////////////////////////////////////////////////////////// __inline char * WINAPI WspiapiStrdup ( IN const char * pszString) /*++ Routine Description allocates enough storage via calloc() for a copy of the string, copies the string into the new memory, and returns a pointer to it. Arguments pszString string to copy into new memory Return Value a pointer to the newly allocated storage with the string in it. NULL if enough memory could not be allocated, or string was NULL. --*/ { char *pszMemory; if (!pszString) return(NULL); pszMemory = (char *) WspiapiMalloc(strlen(pszString) + 1); if (!pszMemory) return(NULL); return(strcpy(pszMemory, pszString)); } __inline BOOL WINAPI WspiapiParseV4Address ( IN const char * pszAddress, OUT PDWORD pdwAddress) /*++ Routine Description get the IPv4 address (in network byte order) from its string representation. the syntax should be a.b.c.d. Arguments pszArgument string representation of the IPv4 address ptAddress pointer to the resulting IPv4 address Return Value Returns FALSE if there is an error, TRUE for success. --*/ { DWORD dwAddress = 0; const char *pcNext = NULL; int iCount = 0; // ensure there are 3 '.' (periods) for (pcNext = pszAddress; *pcNext != '\0'; pcNext++) if (*pcNext == '.') iCount++; if (iCount != 3) return FALSE; // return an error if dwAddress is INADDR_NONE (255.255.255.255) // since this is never a valid argument to getaddrinfo. dwAddress = inet_addr(pszAddress); if (dwAddress == INADDR_NONE) return FALSE; *pdwAddress = dwAddress; return TRUE; } __inline struct addrinfo * WINAPI WspiapiNewAddrInfo ( IN int iSocketType, IN int iProtocol, IN WORD wPort, IN DWORD dwAddress) /*++ Routine Description allocate an addrinfo structure and populate fields. IPv4 specific internal function, not exported. Arguments iSocketType SOCK_*. can be wildcarded (zero). iProtocol IPPROTO_*. can be wildcarded (zero). wPort port number of service (in network order). dwAddress IPv4 address (in network order). Return Value returns an addrinfo struct, or NULL if out of memory. --*/ { struct addrinfo *ptNew; struct sockaddr_in *ptAddress; // allocate a new addrinfo structure. ptNew = (struct addrinfo *) WspiapiMalloc(sizeof(struct addrinfo)); if (!ptNew) return NULL; ptAddress = (struct sockaddr_in *) WspiapiMalloc(sizeof(struct sockaddr_in)); if (!ptAddress) { WspiapiFree(ptNew); return NULL; } ptAddress->sin_family = AF_INET; ptAddress->sin_port = wPort; ptAddress->sin_addr.s_addr = dwAddress; // fill in the fields... ptNew->ai_family = PF_INET; ptNew->ai_socktype = iSocketType; ptNew->ai_protocol = iProtocol; ptNew->ai_addrlen = sizeof(struct sockaddr_in); ptNew->ai_addr = (struct sockaddr *) ptAddress; return ptNew; } __inline int WINAPI WspiapiQueryDNS( IN const char *pszNodeName, IN int iSocketType, IN int iProtocol, IN WORD wPort, OUT char *pszAlias, OUT struct addrinfo **pptResult) /*++ Routine Description helper routine for WspiapiLookupNode. performs name resolution by querying the DNS for A records. *pptResult would need to be freed if an error is returned. Arguments pszNodeName name of node to resolve. iSocketType SOCK_*. can be wildcarded (zero). iProtocol IPPROTO_*. can be wildcarded (zero). wPort port number of service (in network order). pszAlias where to return the alias. pptResult where to return the result. Return Value Returns 0 on success, an EAI_* style error value otherwise. --*/ { struct addrinfo **pptNext = pptResult; struct hostent *ptHost = NULL; char **ppAddresses; *pptNext = NULL; pszAlias[0] = '\0'; ptHost = gethostbyname(pszNodeName); if (ptHost) { if ((ptHost->h_addrtype == AF_INET) && (ptHost->h_length == sizeof(struct in_addr))) { for (ppAddresses = ptHost->h_addr_list; *ppAddresses != NULL; ppAddresses++) { // create an addrinfo structure... *pptNext = WspiapiNewAddrInfo( iSocketType, iProtocol, wPort, ((struct in_addr *) *ppAddresses)->s_addr); if (!*pptNext) return EAI_MEMORY; pptNext = &((*pptNext)->ai_next); } } // pick up the canonical name. strcpy(pszAlias, ptHost->h_name); return 0; } switch (WSAGetLastError()) { case WSAHOST_NOT_FOUND: return EAI_NONAME; case WSATRY_AGAIN: return EAI_AGAIN; case WSANO_RECOVERY: return EAI_FAIL; case WSANO_DATA: return EAI_NODATA; default: return EAI_NONAME; } } __inline int WINAPI WspiapiLookupNode( IN const char *pszNodeName, IN int iSocketType, IN int iProtocol, IN WORD wPort, IN BOOL bAI_CANONNAME, OUT struct addrinfo **pptResult) /*++ Routine Description resolve a nodename and return a list of addrinfo structures. IPv4 specific internal function, not exported. *pptResult would need to be freed if an error is returned. NOTE: if bAI_CANONNAME is true, the canonical name should be returned in the first addrinfo structure. Arguments pszNodeName name of node to resolve. iSocketType SOCK_*. can be wildcarded (zero). iProtocol IPPROTO_*. can be wildcarded (zero). wPort port number of service (in network order). bAI_CANONNAME whether the AI_CANONNAME flag is set. pptResult where to return result. Return Value Returns 0 on success, an EAI_* style error value otherwise. --*/ { int iError = 0; int iAliasCount = 0; char szFQDN1[NI_MAXHOST] = ""; char szFQDN2[NI_MAXHOST] = ""; char *pszName = szFQDN1; char *pszAlias = szFQDN2; char *pszScratch = NULL; strcpy(pszName, pszNodeName); for (;;) { iError = WspiapiQueryDNS(pszNodeName, iSocketType, iProtocol, wPort, pszAlias, pptResult); if (iError) break; // if we found addresses, then we are done. if (*pptResult) break; // stop infinite loops due to DNS misconfiguration. there appears // to be no particular recommended limit in RFCs 1034 and 1035. if ((!strlen(pszAlias)) || (!strcmp(pszName, pszAlias)) || (++iAliasCount == 16)) { iError = EAI_FAIL; break; } // there was a new CNAME, look again. WspiapiSwap(pszName, pszAlias, pszScratch); } if (!iError && bAI_CANONNAME) { (*pptResult)->ai_canonname = WspiapiStrdup(pszAlias); if (!(*pptResult)->ai_canonname) iError = EAI_MEMORY; } return iError; } __inline int WINAPI WspiapiClone ( IN WORD wPort, IN struct addrinfo *ptResult) /*++ Routine Description clone every addrinfo structure in ptResult for the UDP service. ptResult would need to be freed if an error is returned. Arguments wPort port number of UDP service. ptResult list of addrinfo structures, each of whose node needs to be cloned. Return Value Returns 0 on success, an EAI_MEMORY on allocation failure. --*/ { struct addrinfo *ptNext = NULL; struct addrinfo *ptNew = NULL; for (ptNext = ptResult; ptNext != NULL; ) { // create an addrinfo structure... ptNew = WspiapiNewAddrInfo( SOCK_DGRAM, ptNext->ai_protocol, wPort, ((struct sockaddr_in *) ptNext->ai_addr)->sin_addr.s_addr); if (!ptNew) break; // link the cloned addrinfo ptNew->ai_next = ptNext->ai_next; ptNext->ai_next = ptNew; ptNext = ptNew->ai_next; } if (ptNext != NULL) return EAI_MEMORY; return 0; } __inline void WINAPI WspiapiLegacyFreeAddrInfo ( IN struct addrinfo *ptHead) /*++ Routine Description Free an addrinfo structure (or chain of structures). As specified in RFC 2553, Section 6.4. Arguments ptHead structure (chain) to free --*/ { struct addrinfo *ptNext; // next strcture to free for (ptNext = ptHead; ptNext != NULL; ptNext = ptHead) { if (ptNext->ai_canonname) WspiapiFree(ptNext->ai_canonname); if (ptNext->ai_addr) WspiapiFree(ptNext->ai_addr); ptHead = ptNext->ai_next; WspiapiFree(ptNext); } } __inline int WINAPI WspiapiLegacyGetAddrInfo( IN const char *pszNodeName, IN const char *pszServiceName, IN const struct addrinfo *ptHints, OUT struct addrinfo **pptResult) /*++ Routine Description Protocol-independent name-to-address translation. As specified in RFC 2553, Section 6.4. This is the hacked version that only supports IPv4. Arguments pszNodeName node name to lookup. pszServiceName service name to lookup. ptHints hints about how to process request. pptResult where to return result. Return Value returns zero if successful, an EAI_* error code if not. --*/ { int iError = 0; int iFlags = 0; int iFamily = PF_UNSPEC; int iSocketType = 0; int iProtocol = 0; WORD wPort = 0; DWORD dwAddress = 0; struct servent *ptService = NULL; char *pc = NULL; BOOL bClone = FALSE; WORD wTcpPort = 0; WORD wUdpPort = 0; // initialize pptResult with default return value. *pptResult = NULL; //////////////////////////////////////// // validate arguments... // // both the node name and the service name can't be NULL. if ((!pszNodeName) && (!pszServiceName)) return EAI_NONAME; // validate hints. if (ptHints) { // all members other than ai_flags, ai_family, ai_socktype // and ai_protocol must be zero or a null pointer. if ((ptHints->ai_addrlen != 0) || (ptHints->ai_canonname != NULL) || (ptHints->ai_addr != NULL) || (ptHints->ai_next != NULL)) { return EAI_FAIL; } // the spec has the "bad flags" error code, so presumably we // should check something here. insisting that there aren't // any unspecified flags set would break forward compatibility, // however. so we just check for non-sensical combinations. // // we cannot come up with a canonical name given a null node name. iFlags = ptHints->ai_flags; if ((iFlags & AI_CANONNAME) && !pszNodeName) return EAI_BADFLAGS; // we only support a limited number of protocol families. iFamily = ptHints->ai_family; if ((iFamily != PF_UNSPEC) && (iFamily != PF_INET)) return EAI_FAMILY; // we only support only these socket types. iSocketType = ptHints->ai_socktype; if ((iSocketType != 0) && (iSocketType != SOCK_STREAM) && (iSocketType != SOCK_DGRAM) && (iSocketType != SOCK_RAW)) return EAI_SOCKTYPE; // REVIEW: What if ai_socktype and ai_protocol are at odds? iProtocol = ptHints->ai_protocol; } //////////////////////////////////////// // do service lookup... if (pszServiceName) { wPort = (WORD) strtoul(pszServiceName, &pc, 10); if (*pc == '\0') // numeric port string { wPort = wTcpPort = wUdpPort = htons(wPort); if (iSocketType == 0) { bClone = TRUE; iSocketType = SOCK_STREAM; } } else // non numeric port string { if ((iSocketType == 0) || (iSocketType == SOCK_DGRAM)) { ptService = getservbyname(pszServiceName, "udp"); if (ptService) wPort = wUdpPort = ptService->s_port; } if ((iSocketType == 0) || (iSocketType == SOCK_STREAM)) { ptService = getservbyname(pszServiceName, "tcp"); if (ptService) wPort = wTcpPort = ptService->s_port; } // assumes 0 is an invalid service port... if (wPort == 0) // no service exists return (iSocketType ? EAI_SERVICE : EAI_NONAME); if (iSocketType == 0) { // if both tcp and udp, process tcp now & clone udp later. iSocketType = (wTcpPort) ? SOCK_STREAM : SOCK_DGRAM; bClone = (wTcpPort && wUdpPort); } } } //////////////////////////////////////// // do node name lookup... // if we weren't given a node name, // return the wildcard or loopback address (depending on AI_PASSIVE). // // if we have a numeric host address string, // return the binary address. // if ((!pszNodeName) || (WspiapiParseV4Address(pszNodeName, &dwAddress))) { if (!pszNodeName) { dwAddress = htonl((iFlags & AI_PASSIVE) ? INADDR_ANY : INADDR_LOOPBACK); } // create an addrinfo structure... *pptResult = WspiapiNewAddrInfo(iSocketType, iProtocol, wPort, dwAddress); if (!(*pptResult)) iError = EAI_MEMORY; if (!iError && pszNodeName) { // implementation specific behavior: set AI_NUMERICHOST // to indicate that we got a numeric host address string. (*pptResult)->ai_flags |= AI_NUMERICHOST; // return the numeric address string as the canonical name if (iFlags & AI_CANONNAME) { (*pptResult)->ai_canonname = WspiapiStrdup(inet_ntoa(*((struct in_addr *) &dwAddress))); if (!(*pptResult)->ai_canonname) iError = EAI_MEMORY; } } } // if we do not have a numeric host address string and // AI_NUMERICHOST flag is set, return an error! else if (iFlags & AI_NUMERICHOST) { iError = EAI_NONAME; } // since we have a non-numeric node name, // we have to do a regular node name lookup. else { iError = WspiapiLookupNode(pszNodeName, iSocketType, iProtocol, wPort, (iFlags & AI_CANONNAME), pptResult); } if (!iError && bClone) { iError = WspiapiClone(wUdpPort, *pptResult); } if (iError) { WspiapiLegacyFreeAddrInfo(*pptResult); *pptResult = NULL; } return (iError); } __inline int WINAPI WspiapiLegacyGetNameInfo( IN const struct sockaddr *ptSocketAddress, IN socklen_t tSocketLength, OUT char *pszNodeName, IN size_t tNodeLength, OUT char *pszServiceName, IN size_t tServiceLength, IN int iFlags) /*++ Routine Description protocol-independent address-to-name translation. as specified in RFC 2553, Section 6.5. this is the hacked version that only supports IPv4. Arguments ptSocketAddress socket address to translate. tSocketLength length of above socket address. pszNodeName where to return the node name. tNodeLength size of above buffer. pszServiceName where to return the service name. tServiceLength size of above buffer. iFlags flags of type NI_*. Return Value returns zero if successful, an EAI_* error code if not. --*/ { struct servent *ptService; WORD wPort; char szBuffer[] = "65535"; char *pszService = szBuffer; struct hostent *ptHost; struct in_addr tAddress; char *pszNode = NULL; char *pc = NULL; // sanity check ptSocketAddress and tSocketLength. if (!ptSocketAddress) return EAI_FAIL; if ((ptSocketAddress->sa_family != AF_INET) || (tSocketLength != sizeof(struct sockaddr_in))) { return EAI_FAMILY; } if (!(pszNodeName && tNodeLength) && !(pszServiceName && tServiceLength)) { return EAI_NONAME; } // the draft has the "bad flags" error code, so presumably we // should check something here. insisting that there aren't // any unspecified flags set would break forward compatibility, // however. so we just check for non-sensical combinations. if ((iFlags & NI_NUMERICHOST) && (iFlags & NI_NAMEREQD)) { return EAI_BADFLAGS; } // translate the port to a service name (if requested). if (pszServiceName && tServiceLength) { wPort = ((struct sockaddr_in *) ptSocketAddress)->sin_port; if (iFlags & NI_NUMERICSERV) { // return numeric form of the address. sprintf(szBuffer, "%u", ntohs(wPort)); } else { // return service name corresponding to port. ptService = getservbyport(wPort, (iFlags & NI_DGRAM) ? "udp" : NULL); if (ptService && ptService->s_name) { // lookup successful. pszService = ptService->s_name; } else { // DRAFT: return numeric form of the port! sprintf(szBuffer, "%u", ntohs(wPort)); } } if (tServiceLength > strlen(pszService)) strcpy(pszServiceName, pszService); else return EAI_FAIL; } // translate the address to a node name (if requested). if (pszNodeName && tNodeLength) { // this is the IPv4-only version, so we have an IPv4 address. tAddress = ((struct sockaddr_in *) ptSocketAddress)->sin_addr; if (iFlags & NI_NUMERICHOST) { // return numeric form of the address. pszNode = inet_ntoa(tAddress); } else { // return node name corresponding to address. ptHost = gethostbyaddr((char *) &tAddress, sizeof(struct in_addr), AF_INET); if (ptHost && ptHost->h_name) { // DNS lookup successful. // stop copying at a "." if NI_NOFQDN is specified. pszNode = ptHost->h_name; if ((iFlags & NI_NOFQDN) && (pc = strchr(pszNode, '.'))) *pc = '\0'; } else { // DNS lookup failed. return numeric form of the address. if (iFlags & NI_NAMEREQD) { switch (WSAGetLastError()) { case WSAHOST_NOT_FOUND: return EAI_NONAME; case WSATRY_AGAIN: return EAI_AGAIN; case WSANO_RECOVERY: return EAI_FAIL; default: return EAI_NONAME; } } else pszNode = inet_ntoa(tAddress); } } if (tNodeLength > strlen(pszNode)) strcpy(pszNodeName, pszNode); else return EAI_FAIL; } return 0; } typedef struct { char const *pszName; FARPROC pfAddress; } WSPIAPI_FUNCTION; #define WSPIAPI_FUNCTION_ARRAY \ { \ "getaddrinfo", (FARPROC) WspiapiLegacyGetAddrInfo, \ "getnameinfo", (FARPROC) WspiapiLegacyGetNameInfo, \ "freeaddrinfo", (FARPROC) WspiapiLegacyFreeAddrInfo, \ } __inline FARPROC WINAPI WspiapiLoad( IN WORD wFunction) /*++ Routine Description try to locate the address family independent name resolution routines (i.e. getaddrinfo, getnameinfo, freeaddrinfo, gai_strerror). Locks this function call is not synchronized. hence the library containing the routines might be loaded multiple times. another option is to synchronize through a spin lock using a static local variable and the InterlockedExchange operation. Arguments wFunction ordinal # of the function to get the pointer to 0 getaddrinfo 1 getnameinfo 2 freeaddrinfo Return Value address of the library/legacy routine --*/ { HMODULE hLibrary = NULL; // these static variables store state across calls, across threads. static BOOL bInitialized = FALSE; static WSPIAPI_FUNCTION rgtGlobal[] = WSPIAPI_FUNCTION_ARRAY; static const int iNumGlobal = (sizeof(rgtGlobal) / sizeof(WSPIAPI_FUNCTION)); // we overwrite rgtGlobal only if all routines exist in library. WSPIAPI_FUNCTION rgtLocal[] = WSPIAPI_FUNCTION_ARRAY; FARPROC fScratch = NULL; int i = 0; if (bInitialized) // WspiapiLoad has already been called once return (rgtGlobal[wFunction].pfAddress); do // breakout loop { // in Whistler and beyond... // the routines are present in the WinSock 2 library (ws2_32.dll). // printf("Looking in ws2_32 for getaddrinfo...\n"); hLibrary = LoadLibraryA("ws2_32"); if (hLibrary != NULL) { fScratch = GetProcAddress(hLibrary, "getaddrinfo"); if (fScratch == NULL) { FreeLibrary(hLibrary); hLibrary = NULL; } } if (hLibrary != NULL) break; // in the IPv6 Technology Preview... // the routines are present in the IPv6 WinSock library (wship6.dll). // printf("Looking in wship6 for getaddrinfo...\n"); hLibrary = LoadLibraryA("wship6"); if (hLibrary != NULL) { fScratch = GetProcAddress(hLibrary, "getaddrinfo"); if (fScratch == NULL) { FreeLibrary(hLibrary); hLibrary = NULL; } } } while (FALSE); if (hLibrary != NULL) { // use routines from this library... // since getaddrinfo is here, we expect all routines to be here, // but will fall back to IPv4-only if any of them is missing. for (i = 0; i < iNumGlobal; i++) { rgtLocal[i].pfAddress = GetProcAddress(hLibrary, rgtLocal[i].pszName); if (rgtLocal[i].pfAddress == NULL) { FreeLibrary(hLibrary); hLibrary = NULL; break; } } if (hLibrary != NULL) { // printf("found!\n"); for (i = 0; i < iNumGlobal; i++) rgtGlobal[i].pfAddress = rgtLocal[i].pfAddress; } } bInitialized = TRUE; return (rgtGlobal[wFunction].pfAddress); } __inline int WINAPI WspiapiGetAddrInfo( IN const char *nodename, IN const char *servname, IN const struct addrinfo *hints, OUT struct addrinfo **res) { static WSPIAPI_PGETADDRINFO pfGetAddrInfo = NULL; if (!pfGetAddrInfo) pfGetAddrInfo = (WSPIAPI_PGETADDRINFO) WspiapiLoad(0); return ((*pfGetAddrInfo) (nodename, servname, hints, res)); } __inline int WINAPI WspiapiGetNameInfo ( IN const struct sockaddr *sa, IN socklen_t salen, OUT char *host, IN size_t hostlen, OUT char *serv, IN size_t servlen, IN int flags) { static WSPIAPI_PGETNAMEINFO pfGetNameInfo = NULL; if (!pfGetNameInfo) pfGetNameInfo = (WSPIAPI_PGETNAMEINFO) WspiapiLoad(1); return ((*pfGetNameInfo) (sa, salen, host, hostlen, serv, servlen, flags)); } __inline void WINAPI WspiapiFreeAddrInfo ( IN struct addrinfo *ai) { static WSPIAPI_PFREEADDRINFO pfFreeAddrInfo = NULL; if (!pfFreeAddrInfo) pfFreeAddrInfo = (WSPIAPI_PFREEADDRINFO) WspiapiLoad(2); (*pfFreeAddrInfo)(ai); } #ifdef __cplusplus } #endif #endif // _WSPIAPI_H_ dibbler-1.0.1/Port-winnt2k/dibbler-relay.ico0000664000175000017500000000566612233256142015603 00000000000000 è& ¨( @€€€€€€€€€ÀÀÀ€€€ÿÿÿÿÿÿÿÿÿÿÿÿÌÌÌÌ ÌÌÌÌÌÌÀ" ÌÌÌÌÌÌ À"" ÌÌÌÌÀ Ì*¢¢ ÌÌÌÀ`ÌÀª**" ÌÌÌÌ Ì*ªª¢¢ ÌÌÌÌÌ"*ªªª" ÌÌÌÌÀ" ªªªª¢" ÌÌ "" §ªªª¢"ÎÀ """ zzªª""ììÂ"""""§§§ª¢".ÎÎÂbb"""§zzª".îîìâ&&"" ¯w§ª.îîîîÂrbb""zwzz¢îîîî'f&""" §w¢.îîîâvgbb"" ú§®îîîîî'"v&&" ÿúîîîîîîâÌ"rb" ÿïîîîîîâîìÌ'f" ÿþþ"îîî". Ì'f"ÿÿâ".îîâ⢠Âr"ÿþò¢.îîîî* Ì""ò*¢"îîîîâ¢ÌÌ *ª¢".îîîî,ÌÌÀ zª""îîîîìì̧÷ªª".â,îîÌÀ zª¢""",î̧÷ªªª¢""ÌÌ §÷ªªª¢",À ªzªª" ªªªªÿðÿÿ€ÿþü?øðàÀÀ€€€€€€ÀÀàðøü?þÿ€ÿÿðÿ( @€€€€€€€€€ÀÀÀÀÜÀðʦÔðÿ±âÿŽÔÿkÆÿH¸ÿ%ªÿªÿ’Üz¹b–Js2PÔãÿ±ÇÿŽ«ÿkÿHsÿ%WÿUÿIÜ=¹1–%sPÔÔÿ±±ÿŽŽÿkkÿHHÿ%%ÿþܹ–sPãÔÿDZÿ«ŽÿkÿsHÿW%ÿUÿIÜ=¹1–%sPðÔÿâ±ÿÔŽÿÆkÿ¸Hÿª%ÿªÿ’Üz¹b–Js2PÿÔÿÿ±ÿÿŽÿÿkÿÿHÿÿ%ÿþþÜܹ¹––ssPPÿÔðÿ±âÿŽÔÿkÆÿH¸ÿ%ªÿªÜ’¹z–bsJP2ÿÔãÿ±ÇÿŽ«ÿkÿHsÿ%WÿUÜI¹=–1s%PÿÔÔÿ±±ÿŽŽÿkkÿHHÿ%%þܹ–sPÿãÔÿDZÿ«ŽÿkÿsHÿW%ÿUÜI¹=–1s%PÿðÔÿâ±ÿÔŽÿÆkÿ¸Hÿª%ÿªÜ’¹z–bsJP2ÿÿÔÿÿ±ÿÿŽÿÿkÿÿHÿÿ%þþÜܹ¹––ssPPðÿÔâÿ±ÔÿŽÆÿk¸ÿHªÿ%ªÿ’Üz¹b–Js2PãÿÔÇÿ±«ÿŽÿksÿHWÿ%UÿIÜ=¹1–%sPÔÿÔ±ÿ±ŽÿŽkÿkHÿH%ÿ%þܹ–sPÔÿã±ÿÇŽÿ«kÿHÿs%ÿWÿUÜI¹=–1s%PÔÿð±ÿâŽÿÔkÿÆHÿ¸%ÿªÿªÜ’¹z–bsJP2Ôÿÿ±ÿÿŽÿÿkÿÿHÿÿ%ÿÿþþÜܹ¹––ssPPòòòæææÚÚÚÎÎζ¶¶ªªªžžž’’’†††zzznnnbbbVVVJJJ>>>222&&&ðûÿ¤  €€€ÿÿÿÿÿÿÿÿÿÿÿÿ~~~~~~~~~~~~~~~o~o~~~~½Çǽoooooooo~o~~½~~½ÇÇÇǽooo{o{oooo½Õ½~~½®®Ç®Çǽ½o{{o{ooo½«½~~~Ç®®Ç®Ç®ÇÇǽ{{{o{ooo½ooo½½Ç««®®®®Ç®Çǽ{{{{{{o{oo½½Õսǫ®«®®®®ÇÇǽ{{{{{{{oo½¼¼¼½Õ®«««®«®«®®ÇÇǽ{{{{{½o½Ç¼¼¼¼Õ½®«²««®«®®®ÇÇǽˆ{ˆ{½Ç½Ç¼Ç¼¼¼½Õ®²«²««®«®ÇÇÇÕˆ{ˆ{{ÕÇÇÇǼǼ¼¼Õ®²«²«²««®Çǽ½ˆ{ˆ{ˆ{Õ«¯«ÇǼǼ¼Õ½®²²«²«««Ç½½ˆˆˆˆˆˆ{ˆÕ¯«¯«¼Ç¼Ç¼½Õ®â²²«²««½†ˆ†ˆˆˆˆˆˆ{Õ²¯«¯«¼Ç¼¼¼½ ®²²²«²««½†ˆ†ˆ†ˆˆˆÕ²««¯«¯Ç¼Ç¼¼Õ Ž®²²²«½½†††ˆ†ˆ†ˆÕ²««²«¯«¯¯¼Ç¼Õ ŽŽ®®²®†“††††ˆ†ˆ†ˆÕ²¼¼²«¯«¯«Ç¼Õ âŽŽŽ®““†“††††ˆ†ˆ†ˆÕ{{¼¼²¯«¯Ç¼Õ Žâޓޓ““††††††ˆ†Õˆˆˆ{{{¼²««ÇÇÕ ŽâޓޓÕÕ††††ˆ“¼ÕÕ†Õ½{{¼²««ÇÇ âŽâŽ“ÕÇÇÕ†††††“¼†¼®Õ½{{¼²ÇǼ ŽâŽ“ŽÕ®ÇÕˆ††††ˆ†ˆ†¼®Õ½{{¼¼Ç¼ ŽâÕÕ®®ÇÇÕˆ††††ˆ†ˆ†¼®¼{{{{¼ âÕ«««®ÇÇÇÕˆ††††ˆ†ˆ†¼{{{{{{®²â²«®®ÇÇÇÕˆ††ˆ†ˆˆˆ†{ˆ{{{®²â²«®®®ÇÇÕˆ†ÕÕ{ˆˆˆˆ{{{®²â²««®®ÇÇÕÕÇÇÕÕ{ˆˆ{{®²â²«««®®®®ÇÇÇÇÕ{{{{®®²â²««««®®®ÇÇÇÕ{{®®®²â²«««®®ÇÇÕ®®®®®®®®ÿðÿÿ€ÿþü?øðàÀÀ€€€€€€ÀÀàðøü?þÿ€ÿÿðÿdibbler-1.0.1/Port-winnt2k/dibbler-requestor.dev0000664000175000017500000001513312233256142016512 00000000000000[Project] FileName=dibbler-requestor.dev Name=dibbler-requestor UnitCount=22 Type=1 Ver=1 ObjFiles= Includes=..\AddrMgr;..\CfgMgr;..\IfaceMgr;..\Messages;..\Misc;..\Options;..\Port-winnt2k;..\RelCfgMgr;..\RelIfaceMgr;..\RelMessages;..\RelOptions;..\RelTransMgr;..\TransMgr Libs= PrivateResource=dibbler-relay_private.rc ResourceIncludes= MakeIncludes= Compiler=-DMINGWBUILD -funsigned-char_@@_ CppCompiler=-D_GLIBCXX_USE_C99_DYNAMIC -DMINGWBUILD -funsigned-char_@@_ Linker=-lws2_32_@@_ IsCpp=1 Icon=dibbler-requestor.ico ExeOutput= ObjectOutput= OverrideOutput=0 OverrideOutputName=dibbler-relay.exe HostApplication= Folders=CfgMgr,IfaceMgr,Messages,Misc,Options,Port-winnt2k,Requestor CommandLine= UseCustomMakefile=0 CustomMakefile= IncludeVersionInfo=1 SupportXPThemes=0 CompilerSet=0 CompilerSettings=0000000000000000000000 [Unit2] FileName=..\Misc\Logger.cpp CompileCpp=1 Folder=Misc Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit6] FileName=..\Messages\Msg.cpp CompileCpp=1 Folder=Messages Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit8] FileName=..\IfaceMgr\Iface.cpp CompileCpp=1 Folder=IfaceMgr Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [VersionInfo] Major=0 Minor=7 Release=2 Build=1 LanguageID=1033 CharsetID=1252 CompanyName= FileVersion= FileDescription=Developed using the Dev-C++ IDE InternalName= LegalCopyright= LegalTrademarks= OriginalFilename= ProductName=dibbler ProductVersion= AutoIncBuildNr=0 [Unit5] FileName=..\Misc\IPv6Addr.cpp CompileCpp=1 Folder=Misc Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit10] FileName=..\CfgMgr\CfgMgr.cpp CompileCpp=1 Folder=CfgMgr Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit7] FileName=..\IfaceMgr\SocketIPv6.cpp CompileCpp=1 Folder=IfaceMgr Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit9] FileName=..\IfaceMgr\IfaceMgr.cpp CompileCpp=1 Folder=IfaceMgr Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit13] FileName=..\Misc\addrpack.c CompileCpp=0 Folder=Misc Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd=$(CC) -c addrpack.c -o addrpack.o $(CFLAGS) [Unit16] FileName=..\Requestor\ReqMsg.cpp CompileCpp=1 Folder=Requestor Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit19] FileName=..\Requestor\ReqTransMgr.cpp CompileCpp=1 Folder=Requestor Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit20] FileName=..\Options\OptDUID.cpp CompileCpp=1 Folder=Options Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit23] FileName=..\RelCfgMgr\RelCfgMgr.cpp CompileCpp=1 Folder=RelCfgMgr Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit24] FileName=..\RelCfgMgr\RelLexer.cpp CompileCpp=1 Folder=RelCfgMgr Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit25] FileName=..\RelCfgMgr\RelParser.cpp CompileCpp=1 Folder=RelCfgMgr Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit26] FileName=..\RelCfgMgr\RelParsGlobalOpt.cpp CompileCpp=1 Folder=RelCfgMgr Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit27] FileName=..\Options\Opt.cpp CompileCpp=1 Folder=Options Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit29] FileName=..\RelOptions\RelOptGeneric.cpp CompileCpp=1 Folder=RelOptions Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit30] FileName=..\RelOptions\RelOptInterfaceID.cpp CompileCpp=1 Folder=RelOptions Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit32] FileName=..\Misc\addrpack.c CompileCpp=0 Folder=Misc Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd=$(CC) -c addrpack.c -o addrpack.o $(CFLAGS) [Unit33] FileName=..\Options\OptInteger.cpp CompileCpp=1 Folder= Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit34] FileName=..\Misc\sha512.c CompileCpp=0 Folder=Misc Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd=$(CC) -c sha512.c -o sha512.o $(CFLAGS) [Unit35] FileName=..\Misc\hmac-sha-md5.c CompileCpp=1 Folder=Misc Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit36] FileName=..\Misc\md5.c CompileCpp=0 Folder=Misc Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd=$(CC) -c md5.c -o md5.o $(CFLAGS) [Unit37] FileName=..\Misc\sha1.c CompileCpp=0 Folder=Misc Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd=$(CC) -c sha1.c -o sha1.o $(CFLAGS) [Unit38] FileName=..\Misc\sha256.c CompileCpp=0 Folder=Misc Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd=$(CC) -c sha256.c -o sha256.o $(CFLAGS) [Unit39] FileName=..\Misc\KeyList.cpp CompileCpp=1 Folder=Misc Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit40] FileName=..\Options\OptOptionRequest.cpp CompileCpp=1 Folder=Options Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit41] FileName=..\Options\OptVendorSpecInfo.cpp CompileCpp=1 Folder=Options Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit42] FileName=..\RelOptions\RelOptEcho.cpp CompileCpp=1 Folder=RelOptions Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit43] FileName=..\RelOptions\RelOptRemoteID.cpp CompileCpp=1 Folder=RelOptions Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit1] FileName=lowlevel-winnt2k.c CompileCpp=0 Folder=Port-winnt2k Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd=$(CC) -c lowlevel-winnt2k.c -o lowlevel-winnt2k.o $(CFLAGS) [Unit3] FileName=..\Misc\DHCPConst.cpp CompileCpp=1 Folder=Misc Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit11] FileName=..\Options\Opt.cpp CompileCpp=1 Folder=Options Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit12] FileName=..\Options\OptGeneric.cpp CompileCpp=1 Folder=Options Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit17] FileName=..\Requestor\ReqOpt.cpp CompileCpp=1 Folder=Requestor Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit21] FileName=..\Options\OptIAAddress.cpp CompileCpp=1 Folder=Options Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit22] FileName=..\Misc\KeyList.cpp CompileCpp=1 Folder=Misc Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit4] FileName=..\Misc\DUID.cpp CompileCpp=1 Folder=Misc Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit18] FileName=..\Requestor\ReqOpts.cpp CompileCpp=1 Folder=Requestor Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit14] FileName=..\Requestor\Requestor.cpp CompileCpp=1 Folder=Requestor Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit15] FileName=..\Requestor\ReqCfgMgr.cpp CompileCpp=1 Folder=Requestor Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= dibbler-1.0.1/Port-winnt2k/dibbler-relay.layout0000664000175000017500000000304012233256142016326 00000000000000[Editor_0] CursorCol=31 CursorRow=496 TopLine=476 LeftChar=1 Open=0 Top=0 [Editor_1] CursorCol=10 CursorRow=27 TopLine=1 LeftChar=1 Open=0 Top=0 [Editor_5] CursorCol=1 CursorRow=1 TopLine=1 LeftChar=1 Open=0 Top=0 [Editors] Focused=0 Order= [Editor_2] Open=0 Top=0 CursorCol=1 CursorRow=141 TopLine=97 LeftChar=1 [Editor_3] Open=0 Top=0 CursorCol=1 CursorRow=89 TopLine=61 LeftChar=1 [Editor_4] Open=0 Top=0 CursorCol=1 CursorRow=140 TopLine=96 LeftChar=1 [Editor_6] Open=0 Top=0 [Editor_7] Open=0 Top=0 [Editor_8] Open=0 Top=0 CursorCol=1 CursorRow=12 TopLine=1 LeftChar=1 [Editor_9] Open=0 Top=0 [Editor_10] Open=0 Top=0 [Editor_11] Open=0 Top=0 [Editor_12] Open=0 Top=0 [Editor_13] Open=0 Top=0 [Editor_14] Open=0 Top=0 [Editor_15] Open=0 Top=0 [Editor_16] Open=0 Top=0 [Editor_17] Open=0 Top=0 [Editor_18] Open=0 Top=0 [Editor_19] Open=0 Top=0 [Editor_20] Open=0 Top=0 [Editor_21] Open=0 Top=0 [Editor_22] Open=0 Top=0 [Editor_23] Open=0 Top=0 [Editor_24] Open=0 Top=0 CursorCol=3 CursorRow=1889 TopLine=1864 LeftChar=1 [Editor_25] Open=0 Top=0 [Editor_26] Open=0 Top=0 [Editor_27] Open=0 Top=0 [Editor_28] Open=0 Top=0 [Editor_29] Open=0 Top=0 [Editor_30] Open=0 Top=0 [Editor_31] Open=0 Top=0 [Editor_32] Open=0 Top=0 [Editor_33] Open=0 Top=0 [Editor_34] Open=0 Top=0 CursorCol=21 CursorRow=12 TopLine=1 LeftChar=1 [Editor_35] Open=0 Top=0 CursorCol=1 CursorRow=32 TopLine=18 LeftChar=1 [Editor_36] Open=0 Top=0 [Editor_37] Open=0 Top=0 [Editor_38] Open=0 Top=0 [Editor_39] Open=0 Top=0 [Editor_40] Open=0 Top=0 [Editor_41] Open=0 Top=0 [Editor_42] Open=0 Top=0 dibbler-1.0.1/Port-winnt2k/Makefile.in0000664000175000017500000004661112561652535014444 00000000000000# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = Port-winnt2k DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(dist_noinst_DATA) ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/libtool.m4 \ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/include/dibbler-config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = SOURCES = DIST_SOURCES = RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \ ctags-recursive dvi-recursive html-recursive info-recursive \ install-data-recursive install-dvi-recursive \ install-exec-recursive install-html-recursive \ install-info-recursive install-pdf-recursive \ install-ps-recursive install-recursive installcheck-recursive \ installdirs-recursive pdf-recursive ps-recursive \ tags-recursive uninstall-recursive am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac DATA = $(dist_noinst_DATA) RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive am__recursive_targets = \ $(RECURSIVE_TARGETS) \ $(RECURSIVE_CLEAN_TARGETS) \ $(am__extra_recursive_targets) AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \ distdir am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags DIST_SUBDIRS = $(SUBDIRS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) am__relativize = \ dir0=`pwd`; \ sed_first='s,^\([^/]*\)/.*$$,\1,'; \ sed_rest='s,^[^/]*/*,,'; \ sed_last='s,^.*/\([^/]*\)$$,\1,'; \ sed_butlast='s,/*[^/]*$$,,'; \ while test -n "$$dir1"; do \ first=`echo "$$dir1" | sed -e "$$sed_first"`; \ if test "$$first" != "."; then \ if test "$$first" = ".."; then \ dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ else \ first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ if test "$$first2" = "$$first"; then \ dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ else \ dir2="../$$dir2"; \ fi; \ dir0="$$dir0"/"$$first"; \ fi; \ fi; \ dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ done; \ reldir="$$dir2" ACLOCAL = @ACLOCAL@ ALLOCA = @ALLOCA@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ ARCH = @ARCH@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ EXTRA_DIST_SUBDIRS = @EXTRA_DIST_SUBDIRS@ FGREP = @FGREP@ GREP = @GREP@ GTEST_INCLUDES = @GTEST_INCLUDES@ GTEST_LDADD = @GTEST_LDADD@ GTEST_LDFLAGS = @GTEST_LDFLAGS@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LINKPRINT = @LINKPRINT@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PORT_CFLAGS = @PORT_CFLAGS@ PORT_LDFLAGS = @PORT_LDFLAGS@ PORT_SUBDIR = @PORT_SUBDIR@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ subdirs = @subdirs@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ SUBDIRS = . dist_noinst_DATA = client.log client-winnt2k.cpp ClntService.cpp ClntService.h config.h dibbler-client.dev dibbler-client.ico dibbler-client.layout dibbler.iss dibbler-relay.dev dibbler-relay.ico dibbler-relay.layout dibbler-requestor.dev dibbler-requestor.layout dibbler-server.dev dibbler-server.ico dibbler-server.layout INFO lowlevel-winnt2k.c Makefile Makefile.win relay.log relay-winnt2k.cpp RelService.cpp RelService.h server.log server-winnt2k.cpp SrvService.cpp SrvService.h tpipv6.h WinService.cpp WinService.h wspiapi.h all: all-recursive .SUFFIXES: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign Port-winnt2k/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign Port-winnt2k/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs # This directory's subdirectories are mostly independent; you can cd # into them and run 'make' without going through this Makefile. # To change the values of 'make' variables: instead of editing Makefiles, # (1) if the variable is set in 'config.status', edit 'config.status' # (which will cause the Makefiles to be regenerated when you run 'make'); # (2) otherwise, pass the desired values on the 'make' command line. $(am__recursive_targets): @fail=; \ if $(am__make_keepgoing); then \ failcom='fail=yes'; \ else \ failcom='exit 1'; \ fi; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-recursive TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ empty_fix=.; \ else \ include_option=--include; \ empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-recursive CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-recursive cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ $(am__make_dryrun) \ || test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ $(am__relativize); \ new_distdir=$$reldir; \ dir1=$$subdir; dir2="$(top_distdir)"; \ $(am__relativize); \ new_top_distdir=$$reldir; \ echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ ($(am__cd) $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$new_top_distdir" \ distdir="$$new_distdir" \ am__remove_distdir=: \ am__skip_length_check=: \ am__skip_mode_fix=: \ distdir) \ || exit 1; \ fi; \ done check-am: all-am check: check-recursive all-am: Makefile $(DATA) installdirs: installdirs-recursive installdirs-am: install: install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-recursive clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-recursive -rm -f Makefile distclean-am: clean-am distclean-generic distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive html-am: info: info-recursive info-am: install-data-am: install-dvi: install-dvi-recursive install-dvi-am: install-exec-am: install-html: install-html-recursive install-html-am: install-info: install-info-recursive install-info-am: install-man: install-pdf: install-pdf-recursive install-pdf-am: install-ps: install-ps-recursive install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-recursive -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: .MAKE: $(am__recursive_targets) install-am install-strip .PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am check \ check-am clean clean-generic clean-libtool cscopelist-am ctags \ ctags-am distclean distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ installdirs-am maintainer-clean maintainer-clean-generic \ mostlyclean mostlyclean-generic mostlyclean-libtool pdf pdf-am \ ps ps-am tags tags-am uninstall uninstall-am # ============================================================ # === C low level stuff ====================================== # ============================================================ lowlevel-winnt2k.o: lowlevel-winnt2k.c @echo "[CC ] $(SUBDIR)/$@" $(CC) $(COPTS) -c $< ClntService.o: ClntService.cpp @echo "[CXX ] $(SUBDIR)/$@" $(CXX) -I../include $(OPTS) -c -o $@ $< SrvService.o: SrvService.cpp @echo "[CXX ] $(SUBDIR)/$@" $(CXX) -I../include $(OPTS) -c -o $@ $< RelService.o: RelService.cpp @echo "[CXX ] $(SUBDIR)/$@" $(CXX) -I../include $(OPTS) -c -o $@ $< WinService.o: WinService.cpp @echo "[CXX ] $(SUBDIR)/$@" $(CXX) -I../include $(OPTS) -c -o $@ $< # 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: dibbler-1.0.1/Port-winnt2k/dibbler.iss0000664000175000017500000000644112233256142014505 00000000000000; -- Example1.iss -- ; Demonstrates copying 3 files and creating an icon. ; SEE THE DOCUMENTATION FOR DETAILS ON CREATING .ISS SCRIPT FILES! [Setup] AppName=Dibbler - a portable DHCPv6 AppVerName=Dibbler 0.7.2 (WinNT/2000 port) OutputBaseFilename=dibbler-0.7.2-winnt2k OutputDir=.. DefaultDirName={sd}\dibbler DefaultGroupName=Dibbler UninstallDisplayIcon={app}\MyProg.exe Compression=lzma SolidCompression=yes LicenseFile=..\license InfoAfterFile=..\RELNOTES [Components] Name: "Server"; Description: "DHCPv6 server"; Types: Full Compact; Name: "Client"; Description: "DHCPv6 client"; Types: Full Compact; Name: "Tools"; Description: "Relay, requestor (for leasequery) and other tools."; Types: Full; Name: "Documentation"; Description: "User's Guide"; Types: Full Compact; [Files] Source: "dibbler-client.exe"; DestDir: "{app}"; Components: Client; Source: "..\client*.conf"; DestDir: "{app}"; Components: Client; Source: "client.log"; DestDir: "{app}"; Components: Client; Source: "dibbler-relay.exe"; DestDir: "{app}"; Components: Tools; Source: "..\relay*.conf"; DestDir: "{app}"; Components: Tools; Source: "relay.log"; DestDir: "{app}"; Components: Tools; Source: "dibbler-server.exe"; DestDir: "{app}"; Components: Server; Source: "..\server*.conf"; DestDir: "{app}"; Components: Server; Source: "server.log"; DestDir: "{app}"; Components: Server; Source: "..\doc\dibbler-user.pdf"; DestDir: "{app}"; Components: Documentation; Source: "..\CHANGELOG"; DestDir: "{app}"; Components: Documentation; Source: "..\RELNOTES"; DestDir: "{app}"; Components: Documentation; [Icons] Name: "{group}\User's Guide"; Filename: "{app}\dibbler-user.pdf" Name: "{group}\Release notes"; Filename: "notepad.exe"; Parameters: "{app}\RELNOTES" Name: "{group}\Client Run in the console"; Filename: "{app}\dibbler-client.exe";Parameters: "run -d {app}"; Name: "{group}\Client Install as service"; Filename: "{app}\dibbler-client.exe";Parameters: "install -d {app}"; Name: "{group}\Client Remove service"; Filename: "{app}\dibbler-client.exe"; Parameters: "uninstall"; Name: "{group}\Client View log file"; Filename: "notepad.exe"; Parameters: "{app}\client.log" Name: "{group}\Client Edit config file"; Filename: "notepad.exe"; Parameters: "{app}\client.conf" Name: "{group}\Server Run in the console"; Filename: "{app}\dibbler-server.exe"; Parameters: "run -d {app}"; Name: "{group}\Server Install as service"; Filename: "{app}\dibbler-server.exe"; Parameters: "install -d {app}"; Name: "{group}\Server Remove service"; Filename: "{app}\dibbler-server.exe"; Parameters: "uninstall"; Name: "{group}\Server View log file"; Filename: "{win}\notepad.exe"; Parameters: "{app}\server.log" Name: "{group}\Server Edit config file"; Filename: "{win}\notepad.exe"; Parameters: "{app}\server.conf" Name: "{group}\Relay Run in the console"; Filename: "{app}\dibbler-run.exe";Parameters: "run -d {app}"; Name: "{group}\Relay Install as service"; Filename: "{app}\dibbler-relay.exe";Parameters: "install -d {app}"; Name: "{group}\Relay Remove service"; Filename: "{app}\dibbler-relay.exe"; Parameters: "uninstall"; Name: "{group}\Relay View log file"; Filename: "notepad.exe"; Parameters: "{app}\relay.log" Name: "{group}\Relay Edit config file"; Filename: "notepad.exe"; Parameters: "{app}\relay.conf" Name: "{group}\Remove Dibbler"; Filename: {app}\unins000.exe dibbler-1.0.1/SrvTransMgr/0000775000175000017500000000000012561700420012344 500000000000000dibbler-1.0.1/SrvTransMgr/Makefile.am0000664000175000017500000000107112233256142014322 00000000000000noinst_LIBRARIES = libSrvTransMgr.a libSrvTransMgr_a_CPPFLAGS = -I$(top_srcdir)/SrvCfgMgr -I$(top_srcdir)/CfgMgr -I$(top_srcdir)/Misc libSrvTransMgr_a_CPPFLAGS += -I$(top_srcdir)/Options -I$(top_srcdir)/SrvOptions libSrvTransMgr_a_CPPFLAGS += -I$(top_srcdir)/AddrMgr -I$(top_srcdir)/SrvAddrMgr libSrvTransMgr_a_CPPFLAGS += -I$(top_srcdir)/SrvMessages -I$(top_srcdir)/Messages libSrvTransMgr_a_CPPFLAGS += -I$(top_srcdir)/SrvIfaceMgr -I$(top_srcdir)/IfaceMgr libSrvTransMgr_a_CPPFLAGS += -I$(top_srcdir)/poslib libSrvTransMgr_a_SOURCES = SrvTransMgr.cpp SrvTransMgr.h dibbler-1.0.1/SrvTransMgr/SrvTransMgr.h0000644000175000017500000000532412474424101014671 00000000000000/* * Dibbler - a portable DHCPv6 * * authors: Tomasz Mrugalski * Marek Senderski * changes: Grzegorz Pluto * * released under GNU GPL v2 only licence * */ #ifndef SRVTRANSMGR_H #define SRVTRANSMGR_H #include #include #include "SmartPtr.h" #include "Container.h" #include "Opt.h" #include "SrvMsg.h" #include "SrvIfaceMgr.h" #include "SrvCfgIface.h" #include "SrvAddrMgr.h" #define SrvTransMgr() (TSrvTransMgr::instance()) class TSrvTransMgr { friend std::ostream & operator<<(std::ostream &strum, TSrvTransMgr &x); public: static void instanceCreate(const std::string& config, int port); static TSrvTransMgr &instance(); bool openSocket(SPtr confIface, int port); long getTimeout(); void relayMsg(SPtr msg); /// @brief Checks whether message was sent to unicast when it was forbidden /// /// Client is allowed to send data to unicast only if the server is /// configured with server-unicast option. Otherwise it will send /// back message with only status-code=UseMulticast, client-id and server-id /// @return true (accept message) or false (drop it) bool unicastCheck(SPtr msg); void doDuties(); void dump(); bool isDone(); void shutdown(); #if 0 SPtr addFQDN(int iface, SPtr requestFQDN, SPtr clntDuid, SPtr clntAddr, std::string hint, bool doRealUpdate); void removeFQDN(SPtr ptrIface, SPtr ptrIA, SPtr fqdn); #endif bool sanitizeAddrDB(); void removeExpired(std::vector& addrLst, std::vector& tempAddrLst, std::vector& prefixLst); void notifyExpireInfo(TNotifyScriptParams& params, const TSrvAddrMgr::TExpiredInfo& exp, TIAType type); char * getCtrlAddr(); int getCtrlIface(); int checkReconfigures(); bool sendReconfigure(SPtr addr, int iface, int msgType, SPtr ptrDUID); bool ClientInPool1(SPtr addr, int iface,bool PD); /// @brief sends specified packet /// /// @param msg message to be sent virtual void sendPacket(SPtr msg); // not private, as we need to instantiate derived SrvTransMgr in tests protected: TSrvTransMgr(std::string xmlFile, int port); virtual ~TSrvTransMgr(); std::string XmlFile; bool IsDone; int ctrlIface; char ctrlAddr[48]; // @todo: WTF is that? It should be TIPv6Addr static TSrvTransMgr * Instance; int port_; }; #endif dibbler-1.0.1/SrvTransMgr/SrvTransMgr.cpp0000664000175000017500000006035212474424044015236 00000000000000/* * Dibbler - a portable DHCPv6 * * authors: Tomasz Mrugalski * Marek Senderski * changes: Petr Pisar * Nguyen Vinh Nghiem * * released under GNU GPL v2 only licence * */ #include #include #include #include "SrvTransMgr.h" #include "SmartPtr.h" #include "SrvCfgIface.h" #include "IfaceMgr.h" #include "Iface.h" #include "DHCPConst.h" #include "Logger.h" #include "AddrClient.h" #include "AddrIA.h" #include "SrvMsgAdvertise.h" #include "SrvMsgReply.h" #include "SrvMsgConfirm.h" #include "SrvMsgDecline.h" #include "SrvMsgRequest.h" #include "SrvMsgReply.h" #include "SrvMsgRebind.h" #include "SrvMsgRenew.h" #include "SrvMsgRelease.h" #include "SrvMsgReconfigure.h" #include "SrvMsg.h" #include "SrvMsgLeaseQuery.h" #include "SrvMsgLeaseQueryReply.h" #include "SrvOptIA_NA.h" #include "OptStatusCode.h" #include "NodeClientSpecific.h" using namespace std; TSrvTransMgr * TSrvTransMgr::Instance = 0; TSrvTransMgr::TSrvTransMgr(const std::string xmlFile, int port) : XmlFile(xmlFile), IsDone(false), port_(port) { // TransMgr is certainly not done yet. We're just getting started // for each interface in CfgMgr, create socket (in IfaceMgr) SPtr confIface; SrvCfgMgr().firstIface(); while (confIface = SrvCfgMgr().getIface()) { if (!this->openSocket(confIface, port)) { this->IsDone = true; break; } } if (SrvCfgMgr().getReconfigureSupport()) { int clients = checkReconfigures(); Log(Info) << "Sent Reconfigure to " << clients << " client(s)." << LogEnd; } else { Log(Info) << "Reconfigure support was not enabled." << LogEnd; } SrvAddrMgr().setCacheSize(SrvCfgMgr().getCacheSize()); } /// @brief Checks loaded database and sends RECONFIGURE to some clients. /// /// Checks loaded database against current configuration and finds addresses /// that are outdated (do not match current configuration). RECONFIGURE message /// is sent to clients that currently hold those addresses. /// /// @return number of clients that were reconfigured int TSrvTransMgr::checkReconfigures() { int clients = 0; // how many client did we reconfigure? int iface; bool PD; bool check; SPtr cli; SPtr ptrDUID; SrvAddrMgr().firstClient(); unsigned long IAID; Log(Debug) << "Checking which clients need RECONFIGURE." << LogEnd; while (cli = SrvAddrMgr().getClient() ) { /// @todo clean up this shit check=true; ptrDUID=cli->getDUID(); SPtr ia; cli->firstIA(); while ( (ia = cli->getIA()) && check) { IAID=ia->getIAID(); iface=ia->getIfindex(); SPtr ptrIface = SrvIfaceMgr().getIfaceByID(iface); SPtr unicast=ia->getSrvAddr(); SPtr adr; SPtr addra; ia->firstAddr(); while( (adr=ia->getAddr()) && check ) { PD=false; if(ClientInPool1(adr->get(),iface,PD)) { Log(Debug) << "Client " << cli->getDUID()->getPlain() << " doesn't need to reconfigure IA (iaid=" << ia->getIAID() << ")." << LogEnd; } else { Log(Info) << "Client " << cli->getDUID()->getPlain() << " uses outdated info. Sending RECONFIGURE." << LogEnd; if (!unicast) { Log(Warning) << "Unable to send RECONFIGURE to client " << cli->getDUID()->getPlain() << ": no unicast address recorded." << LogEnd; check = false; // Can't do anything here if we don't have unicast address of the client. // (That's odd. Unicast should be in the database. Are we dealing with a // broken database here?) break; } sendReconfigure(unicast, iface, RENEW_MSG, ptrDUID); clients++; if (SrvAddrMgr().delClntAddr(cli->getDUID(), ia->getIAID(), adr->get(),false)) { Log(Debug) << "Outdated " << *adr->get() << " address deleted." << LogEnd; } check = false; break; // break inner while loop } } } SPtr pd; cli->firstPD(); while ( (pd = cli->getPD()) && check ) { IAID=pd->getIAID(); iface=pd->getIfindex(); SPtr prefix; SPtr addra; SPtr ptrIface = SrvIfaceMgr().getIfaceByID(iface); SPtr unicast=pd->getSrvAddr(); pd->firstPrefix(); while(prefix=pd->getPrefix() ) { PD=true; if(ClientInPool1(prefix->get(),iface,PD)) { Log(Debug) << "Client " << cli->getDUID()->getPlain() << " doesn't need to reconfigure PD (iaid=" << pd->getIAID() << ")." << LogEnd; } else { if (!unicast) { Log(Warning) << "Unable to send RECONFIGURE to client " << cli->getDUID()->getPlain() << ": no unicast address recorded." << LogEnd; check = false; // Can't do anything here if we don't have unicast address of the client. // (That's odd. Unicast should be in the database. Are we dealing with a // broken database here?) break; } Log(Info) << "Client " << cli->getDUID()->getPlain() << "uses outdated info. Sending RECONFIGURE." << LogEnd; sendReconfigure(unicast, iface, RENEW_MSG, ptrDUID); clients++; check=false; if(SrvAddrMgr().delPrefix(ptrDUID, IAID, prefix->get(),true)) { Log(Debug) << "Outdated " << *prefix->get() << " prefix for client " << cli->getDUID()->getPlain() << " deleted." << LogEnd; } break; } } } } return clients; } /* * opens proper (multicast or unicast) socket on interface */ bool TSrvTransMgr::openSocket(SPtr confIface, int port) { int ifindex = -1; if (confIface->isRelay()) { ifindex = confIface->getRelayID(); } else { ifindex = confIface->getID(); } SPtr iface = SrvIfaceMgr().getIfaceByID(ifindex); SPtr unicast = confIface->getUnicast(); if (!iface) { Log(Crit) << "Unable to find interface with ifindex=" << ifindex << LogEnd; return false; } if (confIface->isRelay()) { Log(Info) << "Relay init: Creating socket on the underlaying interface: " << iface->getFullName() << "." << LogEnd; } if (unicast) { /* unicast */ Log(Notice) << "Creating unicast (" << *unicast << ") socket on " << confIface->getFullName() << " interface." << LogEnd; if (!iface->addSocket(unicast, port, true, false)) { Log(Crit) << "Proper socket creation failed." << LogEnd; return false; } } char srvAddr[16]; if (!confIface->isRelay()) { inet_pton6(ALL_DHCP_RELAY_AGENTS_AND_SERVERS,srvAddr); } else { inet_pton6(ALL_DHCP_SERVERS,srvAddr); } SPtr ipAddr(new TIPv6Addr(srvAddr)); Log(Notice) << "Creating multicast (" << ipAddr->getPlain() << ") socket on " << confIface->getFullName() << " (" << iface->getFullName() << ") interface." << LogEnd; if (iface->getSocketByAddr(ipAddr)) { Log(Notice) << "Address " << ipAddr->getPlain() << " is already bound on the " << iface->getName() << "." << LogEnd; return true; } if (!iface->addSocket(ipAddr, port, true, false)) { Log(Crit) << "Proper socket creation failed." << LogEnd; return false; } #if 1 if (!iface->countLLAddress()) { Log(Crit) << "There is no link-local address on " << iface->getFullName() << " defined." << LogEnd; return false; } memcpy(srvAddr, iface->firstLLAddress(), 16); SPtr llAddr = new TIPv6Addr(iface->firstLLAddress()); if (iface->getSocketByAddr(llAddr)) { Log(Notice) << "Address " << llAddr->getPlain() << " is already bound on the " << iface->getName() << "." << LogEnd; return true; } else { Log(Notice) << "Creating link-local (" << llAddr->getPlain() << ") socket on " << iface->getFullName() << " interface." << LogEnd; if (!iface->addSocket(llAddr, port, true, false)) { Log(Crit) << "Failed to create link-local socket on " << iface->getFullName() << " interface." << LogEnd; return false; } } #endif return true; } /** * Computes number of seconds when next event is expected or a job is * supposted to be proceeded. * * @returns Number of seconds when something should happend */ long TSrvTransMgr::getTimeout() { unsigned long min = 0xffffffff; unsigned long ifaceRecheckPeriod = 10; unsigned long addrTimeout = 0xffffffff; SPtr ptrMsg; if (SrvCfgMgr().inactiveIfacesCnt() && ifaceRecheckPeriod msg) { if (!msg->check()) { // proper warnings will be printed in the check() method, if necessary. // Log(Warning) << "Invalid message received." << LogEnd; return; } // If unicast is disabled and the client sent it to unicast, // send back status code with UseMulticast and be done with it. if (!unicastCheck(msg)) { Log(Warning) << "Message was dropped, because it was sent to unicast and " << "unicast traffic is not allowed." << LogEnd; return; } SPtr cfgIface = SrvCfgMgr().getIfaceByID(msg->getIface()); if (!cfgIface) { Log(Error) << "Received message on unknown interface (ifindex=" << msg->getIface() << LogEnd; return; } // LEASE ASSIGN STEP 1: Evaluate defined expressions (client classification) // Ask NodeClietSpecific to analyse the message NodeClientSpecific::analyseMessage(msg); // LEASE ASSIGN STEP 2: Is this client supported? // is this client supported? (white-list, black-list) if (!SrvCfgMgr().isClntSupported(msg)) { return; } SPtr q, a; // question and answer q = (Ptr*) msg; switch(msg->getType()) { case SOLICIT_MSG: { if (msg->getOption(OPTION_RAPID_COMMIT)) { if (!cfgIface->getRapidCommit()) { Log(Info) << "SOLICIT with RAPID-COMMIT received, but RAPID-COMMIT is disabled on " << cfgIface->getName() << " interface." << LogEnd; a = new TSrvMsgAdvertise((Ptr*)msg); } else { SPtr nmsg = (Ptr*)msg; a = new TSrvMsgReply(nmsg); } } else { a = new TSrvMsgAdvertise( (Ptr*) msg); } break; } case REQUEST_MSG: { SPtr nmsg = (Ptr*)msg; a = new TSrvMsgReply(nmsg); break; } case CONFIRM_MSG: { SPtr nmsg=(Ptr*)msg; a = new TSrvMsgReply(nmsg); break; } case RENEW_MSG: { SPtr nmsg=(Ptr*)msg; a = new TSrvMsgReply(nmsg); break; } case REBIND_MSG: { SPtr nmsg=(Ptr*)msg; a = new TSrvMsgReply(nmsg); break; } case DECLINE_MSG: { SPtr nmsg=(Ptr*)msg; a = new TSrvMsgReply(nmsg); break; } case RELEASE_MSG: { SPtr nmsg=(Ptr*)msg; a = new TSrvMsgReply(nmsg); break; } case INFORMATION_REQUEST_MSG : { SPtr nmsg=(Ptr*)msg; a = new TSrvMsgReply(nmsg); break; } case LEASEQUERY_MSG: { int iface = msg->getIface(); if (!SrvCfgMgr().getIfaceByID(iface) || !SrvCfgMgr().getIfaceByID(iface)->leaseQuerySupport()) { Log(Error) << "LQ: LeaseQuery message received on " << iface << " interface, but it is not supported there." << LogEnd; return; } Log(Debug) << "LQ: LeaseQuery received, preparing RQ_REPLY" << LogEnd; SPtr lq = (Ptr*)msg; a = new TSrvMsgLeaseQueryReply(lq); break; } case RECONFIGURE_MSG: case ADVERTISE_MSG: case REPLY_MSG: { Log(Warning) << "Invalid message type received: " << msg->getType() << LogEnd; break; } case RELAY_FORW_MSG: // They should be decapsulated earlier case RELAY_REPL_MSG: default: { Log(Warning)<< "Message type " << msg->getType() << " not supported." << LogEnd; break; } } if (a && !a->isDone()) { SPtr answ = (Ptr*)a; // Send the packet sendPacket(answ); // Call notify script SrvIfaceMgr().notifyScripts(SrvCfgMgr().getScriptName(), q, a); } // save DB state regardless of action taken SrvAddrMgr().dump(); SrvCfgMgr().dump(); } void TSrvTransMgr::sendPacket(SPtr msg) { if (!msg) { return; } msg->send(); } bool TSrvTransMgr::unicastCheck(SPtr msg) { // If it's relayed message, then it's ok if (!msg->RelayInfo_.empty()) return true; // Ok, we don't know what address it was received on. // This must be one weird OS we're running on. Anyway, let's // pretend it was not unicast. if (!msg->getLocalAddr()) return true; // All good, received on multicast if (msg->getLocalAddr()->multicast()) return true; // Received on unicast and it's not relayed. Do we have // unicast support enabled on this interface? SPtr cfgIface = SrvCfgMgr().getIfaceByID(msg->getIface()); // That's weird! We don't have a configuration for this interface? if (!cfgIface) return true; // Do we have unicast enabled on this interface? Yes => all is good. if (cfgIface->getUnicast()) return true; // Ok, so we've got a problem here. Unicast is forbidden and we // received unicast traffic. if (!SrvCfgMgr().dropUnicast()) { Log(Warning) << "Received message on address " << msg->getLocalAddr()->getPlain() << " on interface " << cfgIface->getFullName() << ", but unicast is not allowed on this interface." << LogEnd; return true; } TOptList options; SPtr status(new TOptStatusCode(STATUSCODE_USEMULTICAST, string("Please send your message to multicast, not to ") + msg->getLocalAddr()->getPlain(), NULL)); options.push_back(status); // Message will be sent in the constructor TSrvMsgReply(msg, options); return false; } void TSrvTransMgr::doDuties() { // are there any outdated addresses? std::vector addrLst; std::vector tempAddrLst; std::vector prefixLst; if (!SrvAddrMgr().getValidTimeout()) { SrvAddrMgr().doDuties(addrLst, tempAddrLst, prefixLst); removeExpired(addrLst, tempAddrLst, prefixLst); } // Open socket on interface which becames ready during server run if (SrvCfgMgr().inactiveMode()) { SPtr x; x = SrvCfgMgr().checkInactiveIfaces(); if (x) openSocket(x, port_); } } /// @brief Generates parameters for notify script based on expired lease information /// /// @param params Notify parameters (all available info will be set here) /// @param exp expired lease details /// @param type type of lease (IA, TA or PD) void TSrvTransMgr::notifyExpireInfo(TNotifyScriptParams& params, const TSrvAddrMgr::TExpiredInfo& exp, TIAType type) { stringstream tmp; tmp << exp.ia->getIfindex(); params.addParam("IFINDEX", tmp.str()); SPtr iface = SrvIfaceMgr().getIfaceByID(exp.ia->getIfindex()); if (iface) params.addParam("IFACE", iface->getName()); if (exp.ia->getSrvAddr()) params.addParam("REMOTE_ADDR", exp.ia->getSrvAddr()->getPlain()); switch (type) { case IATYPE_IA: case IATYPE_TA: { params.addAddr(exp.addr, 0, 0, ""); break; } case IATYPE_PD: { params.addPrefix(exp.addr, exp.prefixLen, 0, 0); break; } } tmp.str(""); tmp << exp.ia->getIAID(); params.addParam("IAID", tmp.str()); params.addParam("SRV_OPTION1", exp.client->getDUID()->getPlain()); // set client-id } /// @brief Removes expired leases and calls notify script /// /// @param addrLst list of expired address leases /// @param tempAddrLst list of expired temporary addresses leases /// @param prefixLst list of expired prefix delegation leases void TSrvTransMgr::removeExpired(std::vector& addrLst, std::vector& tempAddrLst, std::vector& prefixLst) { for (vector::iterator addr = addrLst.begin(); addr != addrLst.end(); ++addr) { // delete this address Log(Notice) << "Address " << *(addr->addr) << " in IA (IAID=" << addr->ia->getIAID() << ") in client (DUID=\"" << addr->client->getDUID()->getPlain() << "\") has expired." << LogEnd; // FQDN - remove SPtr dnsAddr = addr->ia->getFQDNDnsServer(); SPtr fqdn = addr->ia->getFQDN(); if (dnsAddr && fqdn) { SrvIfaceMgr().delFQDN(addr->ia->getIfindex(), dnsAddr, addr->addr, fqdn->getName()); /// @todo: remove this FQDN from the list of used names } SrvAddrMgr().delClntAddr(addr->client->getDUID(), addr->ia->getIAID(), addr->addr, false); SrvCfgMgr().delClntAddr(addr->ia->getIfindex(), addr->addr); TNotifyScriptParams params; notifyExpireInfo(params, *addr, IATYPE_IA); std::string scriptName = SrvCfgMgr().getScriptName(); if( !scriptName.empty() ) SrvIfaceMgr().notifyScript(SrvCfgMgr().getScriptName(), "expire", params); } for (vector::iterator addr = tempAddrLst.begin(); addr != tempAddrLst.end(); ++addr) { // delete this address Log(Notice) << "Temp. address " << *(addr->addr) << " in IA (IAID=" << addr->ia->getIAID() << ") in client (DUID=\"" << addr->client->getDUID()->getPlain() << "\") has expired." << LogEnd; SrvAddrMgr().delTAAddr(addr->client->getDUID(), addr->ia->getIAID(), addr->addr, false); TNotifyScriptParams params; notifyExpireInfo(params, *addr, IATYPE_TA); SrvIfaceMgr().notifyScript(SrvCfgMgr().getScriptName(), "expire", params); } for (vector::iterator prefix = prefixLst.begin(); prefix != prefixLst.end(); ++prefix) { // delete this prefix Log(Notice) << "Prefix " << prefix->addr->getPlain() << " in IAID=" << prefix->ia->getIAID() << " for client (DUID=" << prefix->client->getDUID()->getPlain() << ") has expired." << LogEnd; SrvAddrMgr().delPrefix(prefix->client->getDUID(), prefix->ia->getIAID(), prefix->addr, false); SrvCfgMgr().decrPrefixCount(prefix->ia->getIfindex(), prefix->addr); TNotifyScriptParams params; notifyExpireInfo(params, *prefix, IATYPE_PD); SrvIfaceMgr().notifyScript(SrvCfgMgr().getScriptName(), "expire", params); } SrvAddrMgr().dump(); SrvCfgMgr().dump(); } void TSrvTransMgr::shutdown() { SrvAddrMgr().dump(); IsDone = true; } bool TSrvTransMgr::isDone() { return IsDone; } char* TSrvTransMgr::getCtrlAddr() { return this->ctrlAddr; } int TSrvTransMgr::getCtrlIface() { return this->ctrlIface; } void TSrvTransMgr::dump() { std::ofstream xmlDump; xmlDump.open(this->XmlFile.c_str()); xmlDump << *this; xmlDump.close(); } TSrvTransMgr::~TSrvTransMgr() { Log(Debug) << "SrvTransMgr cleanup." << LogEnd; } void TSrvTransMgr::instanceCreate(const std::string& config, int port) { if (!Instance) Instance = new TSrvTransMgr(config, port); else Log(Crit) << "Attempt to create another Transmission Manager. " << "One instance already present!" << LogEnd; } TSrvTransMgr & TSrvTransMgr::instance() { if (!Instance) { Log(Crit) << "TransMgr not created yet. Application error. " << "Emergency shutdown." << LogEnd; exit(EXIT_FAILURE); } return *Instance; } /// @brief checks/updates loaded database (regarding interface names/indexes) /// /// /// @return true if sanitization was successful, false if it failed bool TSrvTransMgr::sanitizeAddrDB() { // Those two maps will hold current interface names/ifindexes TAddrMgr::NameToIndexMapping currentNameToIndex; TAddrMgr::IndexToNameMapping currentIndexToName; // Let's get name->index and index->name maps first SrvCfgMgr().firstIface(); while (SPtr iface = SrvCfgMgr().getIface()) { currentNameToIndex.insert(make_pair(iface->getName(), iface->getID())); currentIndexToName.insert(make_pair(iface->getID(), iface->getName())); } // Ok, let's iterate over all loaded entries in Ifa return SrvAddrMgr().updateInterfacesInfo(currentNameToIndex, currentIndexToName); } ostream & operator<<(ostream &s, TSrvTransMgr &x) { s << "" << endl; s << "" << endl; s << "" << endl; return s; } /// @brief Checks if client's address or prefix is in current pool /// /// This method is used after configuration and old database is loaded. /// We need to check if client's leases are still within current configuration. /// /// @param addr address /// @param iface interface /// @param PD is this PD? /// /// @return bool TSrvTransMgr::ClientInPool1(SPtr addr, int iface, bool PD) { SPtr ptrIface = SrvCfgMgr().getIfaceByID(iface); if (!ptrIface) return false; if(PD) { // checking prefix delegation ptrIface->firstPD(); SPtr PDClass; while (PDClass = ptrIface->getPD()) { if (PDClass->prefixInPool(addr)){ return true; } } return false; } else { // checking addresses ptrIface->firstAddrClass(); SPtr addrClass; while (addrClass = ptrIface->getAddrClass()) { if (addrClass->addrInPool(addr)){ return true; } } return false; } } bool TSrvTransMgr::sendReconfigure(SPtr addr, int iface, int msgType, SPtr ptrDUID) { SPtr reconfigure; reconfigure = new TSrvMsgReconfigure(iface, addr, msgType, ptrDUID); //reconfigure->send(); // not needed (message will send itself in constructor) return true; } // vim:ts=4 expandtab dibbler-1.0.1/SrvTransMgr/Makefile.in0000664000175000017500000005116112561652535014352 00000000000000# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = SrvTransMgr DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/depcomp ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/libtool.m4 \ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/include/dibbler-config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = LIBRARIES = $(noinst_LIBRARIES) ARFLAGS = cru AM_V_AR = $(am__v_AR_@AM_V@) am__v_AR_ = $(am__v_AR_@AM_DEFAULT_V@) am__v_AR_0 = @echo " AR " $@; am__v_AR_1 = libSrvTransMgr_a_AR = $(AR) $(ARFLAGS) libSrvTransMgr_a_LIBADD = am_libSrvTransMgr_a_OBJECTS = libSrvTransMgr_a-SrvTransMgr.$(OBJEXT) libSrvTransMgr_a_OBJECTS = $(am_libSrvTransMgr_a_OBJECTS) AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)/include depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) LTCXXCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CXXFLAGS) $(CXXFLAGS) AM_V_CXX = $(am__v_CXX_@AM_V@) am__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@) am__v_CXX_0 = @echo " CXX " $@; am__v_CXX_1 = CXXLD = $(CXX) CXXLINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \ $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CXXLD = $(am__v_CXXLD_@AM_V@) am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@) am__v_CXXLD_0 = @echo " CXXLD " $@; am__v_CXXLD_1 = COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(libSrvTransMgr_a_SOURCES) DIST_SOURCES = $(libSrvTransMgr_a_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALLOCA = @ALLOCA@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ ARCH = @ARCH@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ EXTRA_DIST_SUBDIRS = @EXTRA_DIST_SUBDIRS@ FGREP = @FGREP@ GREP = @GREP@ GTEST_INCLUDES = @GTEST_INCLUDES@ GTEST_LDADD = @GTEST_LDADD@ GTEST_LDFLAGS = @GTEST_LDFLAGS@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LINKPRINT = @LINKPRINT@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PORT_CFLAGS = @PORT_CFLAGS@ PORT_LDFLAGS = @PORT_LDFLAGS@ PORT_SUBDIR = @PORT_SUBDIR@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ subdirs = @subdirs@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ noinst_LIBRARIES = libSrvTransMgr.a libSrvTransMgr_a_CPPFLAGS = -I$(top_srcdir)/SrvCfgMgr \ -I$(top_srcdir)/CfgMgr -I$(top_srcdir)/Misc \ -I$(top_srcdir)/Options -I$(top_srcdir)/SrvOptions \ -I$(top_srcdir)/AddrMgr -I$(top_srcdir)/SrvAddrMgr \ -I$(top_srcdir)/SrvMessages -I$(top_srcdir)/Messages \ -I$(top_srcdir)/SrvIfaceMgr -I$(top_srcdir)/IfaceMgr \ -I$(top_srcdir)/poslib libSrvTransMgr_a_SOURCES = SrvTransMgr.cpp SrvTransMgr.h all: all-am .SUFFIXES: .SUFFIXES: .cpp .lo .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign SrvTransMgr/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign SrvTransMgr/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstLIBRARIES: -test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES) libSrvTransMgr.a: $(libSrvTransMgr_a_OBJECTS) $(libSrvTransMgr_a_DEPENDENCIES) $(EXTRA_libSrvTransMgr_a_DEPENDENCIES) $(AM_V_at)-rm -f libSrvTransMgr.a $(AM_V_AR)$(libSrvTransMgr_a_AR) libSrvTransMgr.a $(libSrvTransMgr_a_OBJECTS) $(libSrvTransMgr_a_LIBADD) $(AM_V_at)$(RANLIB) libSrvTransMgr.a mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libSrvTransMgr_a-SrvTransMgr.Po@am__quote@ .cpp.o: @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $< .cpp.obj: @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .cpp.lo: @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LTCXXCOMPILE) -c -o $@ $< libSrvTransMgr_a-SrvTransMgr.o: SrvTransMgr.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libSrvTransMgr_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libSrvTransMgr_a-SrvTransMgr.o -MD -MP -MF $(DEPDIR)/libSrvTransMgr_a-SrvTransMgr.Tpo -c -o libSrvTransMgr_a-SrvTransMgr.o `test -f 'SrvTransMgr.cpp' || echo '$(srcdir)/'`SrvTransMgr.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libSrvTransMgr_a-SrvTransMgr.Tpo $(DEPDIR)/libSrvTransMgr_a-SrvTransMgr.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='SrvTransMgr.cpp' object='libSrvTransMgr_a-SrvTransMgr.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libSrvTransMgr_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libSrvTransMgr_a-SrvTransMgr.o `test -f 'SrvTransMgr.cpp' || echo '$(srcdir)/'`SrvTransMgr.cpp libSrvTransMgr_a-SrvTransMgr.obj: SrvTransMgr.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libSrvTransMgr_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libSrvTransMgr_a-SrvTransMgr.obj -MD -MP -MF $(DEPDIR)/libSrvTransMgr_a-SrvTransMgr.Tpo -c -o libSrvTransMgr_a-SrvTransMgr.obj `if test -f 'SrvTransMgr.cpp'; then $(CYGPATH_W) 'SrvTransMgr.cpp'; else $(CYGPATH_W) '$(srcdir)/SrvTransMgr.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libSrvTransMgr_a-SrvTransMgr.Tpo $(DEPDIR)/libSrvTransMgr_a-SrvTransMgr.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='SrvTransMgr.cpp' object='libSrvTransMgr_a-SrvTransMgr.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libSrvTransMgr_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libSrvTransMgr_a-SrvTransMgr.obj `if test -f 'SrvTransMgr.cpp'; then $(CYGPATH_W) 'SrvTransMgr.cpp'; else $(CYGPATH_W) '$(srcdir)/SrvTransMgr.cpp'; fi` mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LIBRARIES) installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool clean-noinstLIBRARIES \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \ clean-libtool clean-noinstLIBRARIES cscopelist-am ctags \ ctags-am distclean distclean-compile distclean-generic \ distclean-libtool distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-dvi install-dvi-am install-exec \ install-exec-am install-html install-html-am install-info \ install-info-am install-man install-pdf install-pdf-am \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ tags tags-am uninstall uninstall-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: dibbler-1.0.1/LICENSE0000664000175000017500000004311012560471634011053 00000000000000 GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc. 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Library General Public License instead.) You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and modification follow. GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. 1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. 6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. 7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. 10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 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 Also add information on how to contact you by electronic and paper mail. If the program is interactive, make it output a short notice like this when it starts in an interactive mode: Gnomovision version 69, Copyright (C) year name of author Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker. , 1 April 1989 Ty Coon, President of Vice This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Library General Public License instead of this License. dibbler-1.0.1/nettle/0000775000175000017500000000000012561700416011414 500000000000000dibbler-1.0.1/nettle/base64-encode.c0000644000175000017500000001121712277722750014030 00000000000000/* base64-encode.c * */ /* nettle, low-level cryptographics library * * Copyright (C) 2002 Niels Möller * * The nettle library is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at your * option) any later version. * * The nettle 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 Lesser General Public * License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with the nettle library; see the file COPYING.LIB. If not, write to * the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, * MA 02111-1307, USA. */ #if HAVE_CONFIG_H # include "dibbler-config.h" #endif #include #include #include "base64.h" static const uint8_t encode_table[64] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" "abcdefghijklmnopqrstuvwxyz" "0123456789+/"; #define ENCODE(x) (encode_table[0x3F & (x)]) void base64_encode_raw(uint8_t *dst, unsigned length, const uint8_t *src) { const uint8_t *in = src + length; uint8_t *out = dst + BASE64_ENCODE_RAW_LENGTH(length); unsigned left_over = length % 3; if (left_over) { in -= left_over; *--out = '='; switch(left_over) { case 1: *--out = '='; *--out = ENCODE(in[0] << 4); break; case 2: *--out = ENCODE( in[1] << 2); *--out = ENCODE((in[0] << 4) | (in[1] >> 4)); break; default: abort(); } *--out = ENCODE(in[0] >> 2); } while (in > src) { in -= 3; *--out = ENCODE( in[2]); *--out = ENCODE((in[1] << 2) | (in[2] >> 6)); *--out = ENCODE((in[0] << 4) | (in[1] >> 4)); *--out = ENCODE( in[0] >> 2); } assert(in == src); assert(out == dst); } #if 0 unsigned base64_encode(uint8_t *dst, unsigned src_length, const uint8_t *src) { unsigned dst_length = BASE64_ENCODE_RAW_LENGTH(src_length); unsigned n = src_length / 3; unsigned left_over = src_length % 3; unsigned done = 0; if (left_over) { const uint8_t *in = src + n * 3; uint8_t *out = dst + dst_length; switch(left_over) { case 1: *--out = '='; *--out = ENCODE(in[0] << 4); break; case 2: *--out = ENCODE( in[1] << 2); *--out = ENCODE((in[0] << 4) | (in[1] >> 4)); break; default: abort(); } *--out = ENCODE(in[0] >> 2); done = 4; } base64_encode_raw(n, dst, src); done += n * 4; assert(done == dst_length); return done; } #endif void base64_encode_group(uint8_t *dst, uint32_t group) { *dst++ = ENCODE(group >> 18); *dst++ = ENCODE(group >> 12); *dst++ = ENCODE(group >> 6); *dst++ = ENCODE(group); } void base64_encode_init(struct base64_encode_ctx *ctx) { ctx->word = ctx->bits = 0; } /* Encodes a single byte. */ unsigned base64_encode_single(struct base64_encode_ctx *ctx, uint8_t *dst, uint8_t src) { unsigned done = 0; unsigned word = ctx->word << 8 | src; unsigned bits = ctx->bits + 8; while (bits >= 6) { bits -= 6; dst[done++] = ENCODE(word >> bits); } ctx->bits = bits; ctx->word = word; assert(done <= 2); return done; } /* Returns the number of output characters. DST should point to an * area of size at least BASE64_ENCODE_LENGTH(length). */ unsigned base64_encode_update(struct base64_encode_ctx *ctx, uint8_t *dst, unsigned length, const uint8_t *src) { unsigned done = 0; unsigned left = length; unsigned left_over; unsigned bulk; while (ctx->bits && left) { left--; done += base64_encode_single(ctx, dst + done, *src++); } left_over = left % 3; bulk = left - left_over; if (bulk) { assert(!(bulk % 3)); base64_encode_raw(dst + done, bulk, src); done += BASE64_ENCODE_RAW_LENGTH(bulk); src += bulk; left = left_over; } while (left) { left--; done += base64_encode_single(ctx, dst + done, *src++); } assert(done <= BASE64_ENCODE_LENGTH(length)); return done; } /* DST should point to an area of size at least * BASE64_ENCODE_FINAL_SIZE */ unsigned base64_encode_final(struct base64_encode_ctx *ctx, uint8_t *dst) { unsigned done = 0; unsigned bits = ctx->bits; if (bits) { dst[done++] = ENCODE(ctx->word << (6 - ctx->bits)); for (; bits < 6; bits += 2) dst[done++] = '='; ctx->bits = 0; } assert(done <= BASE64_ENCODE_FINAL_LENGTH); return done; } dibbler-1.0.1/nettle/md5.h0000644000175000017500000000332112277722750012200 00000000000000/* md5.h * * The MD5 hash function, described in RFC 1321. */ /* nettle, low-level cryptographics library * * Copyright (C) 2001 Niels Möller * * The nettle library is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at your * option) any later version. * * The nettle 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 Lesser General Public * License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with the nettle library; see the file COPYING.LIB. If not, write to * the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, * MA 02111-1307, USA. */ #ifndef NETTLE_MD5_H_INCLUDED #define NETTLE_MD5_H_INCLUDED #include "nettle-types.h" /* Name mangling */ #define md5_init nettle_md5_init #define md5_update nettle_md5_update #define md5_digest nettle_md5_digest #define MD5_DIGEST_SIZE 16 #define MD5_DATA_SIZE 64 /* Digest is kept internally as 4 32-bit words. */ #define _MD5_DIGEST_LENGTH 4 struct md5_ctx { uint32_t digest[_MD5_DIGEST_LENGTH]; uint32_t count_l, count_h; /* Block count */ uint8_t block[MD5_DATA_SIZE]; /* Block buffer */ unsigned index; /* Into buffer */ }; void md5_init(struct md5_ctx *ctx); void md5_update(struct md5_ctx *ctx, unsigned length, const uint8_t *data); void md5_digest(struct md5_ctx *ctx, unsigned length, uint8_t *digest); #endif /* NETTLE_MD5_H_INCLUDED */ dibbler-1.0.1/nettle/memxor.c0000644000175000017500000000066312277722750013023 00000000000000/* memxor.c * * $Id: memxor.c,v 1.1.2.1 2005/01/28 22:50:03 meilof Exp $ */ /* XOR LEN bytes starting at SRCADDR onto DESTADDR. Result undefined if the source overlaps with the destination. Return DESTADDR. */ #if HAVE_CONFIG_H # include "dibbler-config.h" #endif #include "memxor.h" uint8_t *memxor(uint8_t *dst, const uint8_t *src, size_t n) { size_t i; for (i = 0; i #include #include "base64.h" #define TABLE_INVALID -1 #define TABLE_SPACE -2 #define TABLE_END -3 /* FIXME: Make sure that all whitespace characters, SPC, HT, VT, FF, * CR and LF are ignored. */ static const signed char decode_table[0x100] = { -1, -1, -1, -1, -1, -1, -1, -1, -1, -2, -2, -1, -1, -2, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -2, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 62, -1, -1, -1, 63, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, -1, -1, -1, -3, -1, -1, -1, 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, -1, -1, -1, -1, -1, -1, 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, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, }; void base64_decode_init(struct base64_decode_ctx *ctx) { ctx->word = ctx->bits = ctx->padding = 0; } int base64_decode_single(struct base64_decode_ctx *ctx, uint8_t *dst, uint8_t src) { int data; data = decode_table[src]; switch(data) { default: assert(data >= 0 && data < 0x40); if (ctx->padding) return -1; ctx->word = ctx->word << 6 | data; ctx->bits += 6; if (ctx->bits >= 8) { ctx->bits -= 8; dst[0] = ctx->word >> ctx->bits; return 1; } else return 0; case TABLE_INVALID: return -1; case TABLE_SPACE: return 0; case TABLE_END: /* There can be at most two padding characters. */ if (!ctx->bits || ctx->padding > 2) return -1; if (ctx->word & ( (1<bits) - 1)) /* We shouldn't have any leftover bits */ return -1; ctx->padding++; ctx->bits -= 2; return 0; } } int base64_decode_update(struct base64_decode_ctx *ctx, unsigned *dst_length, uint8_t *dst, unsigned src_length, const uint8_t *src) { unsigned done; unsigned i; assert(*dst_length >= BASE64_DECODE_LENGTH(src_length)); for (i = 0, done = 0; ibits == 0; } dibbler-1.0.1/nettle/macros.h0000644000175000017500000000546612277722750013013 00000000000000/* macros.h * */ /* nettle, low-level cryptographics library * * Copyright (C) 2001 Niels Möller * * The nettle library is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at your * option) any later version. * * The nettle 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 Lesser General Public * License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with the nettle library; see the file COPYING.LIB. If not, write to * the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, * MA 02111-1307, USA. */ #ifndef NETTLE_MACROS_H_INCLUDED #define NETTLE_MACROS_H_INCLUDED /* Reads a 32-bit integer, in network, big-endian, byte order */ #define READ_UINT32(p) \ ( (((uint32_t) (p)[0]) << 24) \ | (((uint32_t) (p)[1]) << 16) \ | (((uint32_t) (p)[2]) << 8) \ | ((uint32_t) (p)[3])) #define WRITE_UINT32(p, i) \ do { \ (p)[0] = ((i) >> 24) & 0xff; \ (p)[1] = ((i) >> 16) & 0xff; \ (p)[2] = ((i) >> 8) & 0xff; \ (p)[3] = (i) & 0xff; \ } while(0) /* Analogous macros, for 24 and 16 bit numbers */ #define READ_UINT24(p) \ ( (((uint32_t) (p)[0]) << 16) \ | (((uint32_t) (p)[1]) << 8) \ | ((uint32_t) (p)[2])) #define WRITE_UINT24(p, i) \ do { \ (p)[0] = ((i) >> 16) & 0xff; \ (p)[1] = ((i) >> 8) & 0xff; \ (p)[2] = (i) & 0xff; \ } while(0) #define READ_UINT16(p) \ ( (((uint32_t) (p)[0]) << 8) \ | ((uint32_t) (p)[1])) #define WRITE_UINT16(p, i) \ do { \ (p)[0] = ((i) >> 8) & 0xff; \ (p)[1] = (i) & 0xff; \ } while(0) /* And the other, little-endian, byteorder */ #define LE_READ_UINT32(p) \ ( (((uint32_t) (p)[3]) << 24) \ | (((uint32_t) (p)[2]) << 16) \ | (((uint32_t) (p)[1]) << 8) \ | ((uint32_t) (p)[0])) #define LE_WRITE_UINT32(p, i) \ do { \ (p)[3] = ((i) >> 24) & 0xff; \ (p)[2] = ((i) >> 16) & 0xff; \ (p)[1] = ((i) >> 8) & 0xff; \ (p)[0] = (i) & 0xff; \ } while(0) /* Analogous macros, for 16 bit numbers */ #define LE_READ_UINT16(p) \ ( (((uint32_t) (p)[1]) << 8) \ | ((uint32_t) (p)[0])) #define LE_WRITE_UINT16(p, i) \ do { \ (p)[1] = ((i) >> 8) & 0xff; \ (p)[0] = (i) & 0xff; \ } while(0) /* Macro to make it easier to loop over several blocks. */ #define FOR_BLOCKS(length, dst, src, blocksize) \ assert( !((length) % (blocksize))); \ for (; (length); ((length) -= (blocksize), \ (dst) += (blocksize), \ (src) += (blocksize)) ) #endif /* NETTLE_MACROS_H_INCLUDED */ dibbler-1.0.1/nettle/memxor.h0000644000175000017500000000035212277722750013023 00000000000000/* memxor.h * */ #ifndef NETTLE_MEMXOR_H_INCLUDED #define NETTLE_MEMXOR_H_INCLUDED #include #include "nettle-types.h" uint8_t *memxor(uint8_t *dst, const uint8_t *src, size_t n); #endif /* NETTLE_MEMXOR_H_INCLUDED */ dibbler-1.0.1/nettle/nettle-types.h0000664000175000017500000001770112560471634014156 00000000000000#ifndef __NETTLE_TYPES_H #define __NETTLE_TYPES_H 1 #ifndef _GENERATED_STDINT_H #define _GENERATED_STDINT_H " " /* generated using gnu compiler gcc.exe (GCC) 3.2.3 (mingw special 20030504-1) */ #define _STDINT_HAVE_STDINT_H 1 /* ................... shortcircuit part ........................... */ #if defined HAVE_STDINT_H || defined _STDINT_HAVE_STDINT_H #include #else #include /* .................... configured part ............................ */ /* whether we have a C99 compatible stdint header file */ /* #undef _STDINT_HEADER_INTPTR */ /* whether we have a C96 compatible inttypes header file */ /* #undef _STDINT_HEADER_UINT32 */ /* whether we have a BSD compatible inet types header */ /* #undef _STDINT_HEADER_U_INT32 */ /* which 64bit typedef has been found */ /* #undef _STDINT_HAVE_UINT64_T */ /* #undef _STDINT_HAVE_U_INT64_T */ /* which type model has been detected */ /* #undef _STDINT_CHAR_MODEL // skipped */ /* #undef _STDINT_LONG_MODEL // skipped */ /* whether int_least types were detected */ /* #undef _STDINT_HAVE_INT_LEAST32_T */ /* whether int_fast types were detected */ /* #undef _STDINT_HAVE_INT_FAST32_T */ /* whether intmax_t type was detected */ /* #undef _STDINT_HAVE_INTMAX_T */ /* .................... detections part ............................ */ /* whether we need to define bitspecific types from compiler base types */ #ifndef _STDINT_HEADER_INTPTR #ifndef _STDINT_HEADER_UINT32 #ifndef _STDINT_HEADER_U_INT32 #define _STDINT_NEED_INT_MODEL_T #else #define _STDINT_HAVE_U_INT_TYPES #endif #endif #endif #ifdef _STDINT_HAVE_U_INT_TYPES #undef _STDINT_NEED_INT_MODEL_T #endif #ifdef _STDINT_CHAR_MODEL #if _STDINT_CHAR_MODEL+0 == 122 || _STDINT_CHAR_MODEL+0 == 124 #ifndef _STDINT_BYTE_MODEL #define _STDINT_BYTE_MODEL 12 #endif #endif #endif #ifndef _STDINT_HAVE_INT_LEAST32_T #define _STDINT_NEED_INT_LEAST_T #endif #ifndef _STDINT_HAVE_INT_FAST32_T #define _STDINT_NEED_INT_FAST_T #endif #ifndef _STDINT_HEADER_INTPTR #define _STDINT_NEED_INTPTR_T #ifndef _STDINT_HAVE_INTMAX_T #define _STDINT_NEED_INTMAX_T #endif #endif /* .................... definition part ............................ */ /* some system headers have good uint64_t */ #ifndef _HAVE_UINT64_T #if defined _STDINT_HAVE_UINT64_T || defined HAVE_UINT64_T #define _HAVE_UINT64_T #elif defined _STDINT_HAVE_U_INT64_T || defined HAVE_U_INT64_T #define _HAVE_UINT64_T typedef u_int64_t uint64_t; #endif #endif #ifndef _HAVE_UINT64_T /* .. here are some common heuristics using compiler runtime specifics */ #if defined __STDC_VERSION__ && defined __STDC_VERSION__ >= 199901L #define _HAVE_UINT64_T typedef long long int64_t; typedef unsigned long long uint64_t; #elif !defined __STRICT_ANSI__ #if defined _MSC_VER || defined __WATCOMC__ || defined __BORLANDC__ #define _HAVE_UINT64_T typedef __int64 int64_t; typedef unsigned __int64 uint64_t; #elif defined __GNUC__ || defined __MWERKS__ || defined __ELF__ /* note: all ELF-systems seem to have loff-support which needs 64-bit */ #if !defined _NO_LONGLONG #define _HAVE_UINT64_T typedef long long int64_t; typedef unsigned long long uint64_t; #endif #elif defined __alpha || (defined __mips && defined _ABIN32) #if !defined _NO_LONGLONG typedef long int64_t; typedef unsigned long uint64_t; #endif /* compiler/cpu type to define int64_t */ #endif #endif #endif #if defined _STDINT_HAVE_U_INT_TYPES /* int8_t int16_t int32_t defined by inet code, redeclare the u_intXX types */ typedef u_int8_t uint8_t; typedef u_int16_t uint16_t; typedef u_int32_t uint32_t; /* glibc compatibility */ #ifndef __int8_t_defined #define __int8_t_defined #endif #endif #ifdef _STDINT_NEED_INT_MODEL_T /* we must guess all the basic types. Apart from byte-addressable system, */ /* there a few 32-bit-only dsp-systems that we guard with BYTE_MODEL 8-} */ /* (btw, those nibble-addressable systems are way off, or so we assume) */ #if defined _STDINT_BYTE_MODEL #if _STDINT_LONG_MODEL+0 == 242 /* 2:4:2 = IP16 = a normal 16-bit system */ typedef unsigned char uint8_t; typedef unsigned short uint16_t; typedef unsigned long uint32_t; #ifndef __int8_t_defined #define __int8_t_defined typedef char int8_t; typedef short int16_t; typedef long int32_t; #endif #elif _STDINT_LONG_MODEL+0 == 244 || _STDINT_LONG_MODEL == 444 /* 2:4:4 = LP32 = a 32-bit system derived from a 16-bit */ /* 4:4:4 = ILP32 = a normal 32-bit system */ typedef unsigned char uint8_t; typedef unsigned short uint16_t; typedef unsigned int uint32_t; #ifndef __int8_t_defined #define __int8_t_defined typedef char int8_t; typedef short int16_t; typedef int int32_t; #endif #elif _STDINT_LONG_MODEL+0 == 484 || _STDINT_LONG_MODEL+0 == 488 /* 4:8:4 = IP32 = a 32-bit system prepared for 64-bit */ /* 4:8:8 = LP64 = a normal 64-bit system */ typedef unsigned char uint8_t; typedef unsigned short uint16_t; typedef unsigned int uint32_t; #ifndef __int8_t_defined #define __int8_t_defined typedef char int8_t; typedef short int16_t; typedef int int32_t; #endif /* this system has a "long" of 64bit */ #ifndef _HAVE_UINT64_T #define _HAVE_UINT64_T typedef unsigned long uint64_t; typedef long int64_t; #endif #elif _STDINT_LONG_MODEL+0 == 448 /* LLP64 a 64-bit system derived from a 32-bit system */ typedef unsigned char uint8_t; typedef unsigned short uint16_t; typedef unsigned int uint32_t; #ifndef __int8_t_defined #define __int8_t_defined typedef char int8_t; typedef short int16_t; typedef int int32_t; #endif /* assuming the system has a "long long" */ #ifndef _HAVE_UINT64_T #define _HAVE_UINT64_T typedef unsigned long long uint64_t; typedef long long int64_t; #endif #else #define _STDINT_NO_INT32_T #endif #else #define _STDINT_NO_INT8_T #define _STDINT_NO_INT32_T #endif #endif /* * quote from SunOS-5.8 sys/inttypes.h: * Use at your own risk. As of February 1996, the committee is squarely * behind the fixed sized types; the "least" and "fast" types are still being * discussed. The probability that the "fast" types may be removed before * the standard is finalized is high enough that they are not currently * implemented. */ #if defined _STDINT_NEED_INT_LEAST_T typedef int8_t int_least8_t; typedef int16_t int_least16_t; typedef int32_t int_least32_t; #ifdef _HAVE_UINT64_T typedef int64_t int_least64_t; #endif typedef uint8_t uint_least8_t; typedef uint16_t uint_least16_t; typedef uint32_t uint_least32_t; #ifdef _HAVE_UINT64_T typedef uint64_t uint_least64_t; #endif /* least types */ #endif #if defined _STDINT_NEED_INT_FAST_T typedef int8_t int_fast8_t; typedef int int_fast16_t; typedef int32_t int_fast32_t; #ifdef _HAVE_UINT64_T typedef int64_t int_fast64_t; #endif typedef uint8_t uint_fast8_t; typedef unsigned uint_fast16_t; typedef uint32_t uint_fast32_t; #ifdef _HAVE_UINT64_T typedef uint64_t uint_fast64_t; #endif /* fast types */ #endif #ifdef _STDINT_NEED_INTMAX_T #ifdef _HAVE_UINT64_T typedef int64_t intmax_t; typedef uint64_t uintmax_t; #else typedef long intmax_t; typedef unsigned long uintmax_t; #endif #endif #ifdef _STDINT_NEED_INTPTR_T #ifndef __intptr_t_defined #define __intptr_t_defined /* we encourage using "long" to store pointer values, never use "int" ! */ #if _STDINT_LONG_MODEL+0 == 242 || _STDINT_LONG_MODEL+0 == 484 typedef unsinged int uintptr_t; typedef int intptr_t; #elif _STDINT_LONG_MODEL+0 == 244 || _STDINT_LONG_MODEL+0 == 444 typedef unsigned long uintptr_t; typedef long intptr_t; #elif _STDINT_LONG_MODEL+0 == 448 && defined _HAVE_UINT64_T typedef uint64_t uintptr_t; typedef int64_t intptr_t; #else /* matches typical system types ILP32 and LP64 - but not IP16 or LLP64 */ typedef unsigned long uintptr_t; typedef long intptr_t; #endif #endif #endif /* shortcircuit*/ #endif /* once */ #endif #endif dibbler-1.0.1/nettle/base64-meta.c0000644000175000017500000000245612277722750013526 00000000000000/* base64-meta.c */ /* nettle, low-level cryptographics library * * Copyright (C) 2002 Dan Egnor, Niels Möller * * The nettle library is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at your * option) any later version. * * The nettle 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 Lesser General Public * License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with the nettle library; see the file COPYING.LIB. If not, write to * the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, * MA 02111-1307, USA. */ #if HAVE_CONFIG_H # include "dibbler-config.h" #endif #include "nettle-meta.h" #include "base64.h" /* Same as the macros with the same name */ static unsigned base64_encode_length(unsigned length) { return BASE64_ENCODE_LENGTH(length); } static unsigned base64_decode_length(unsigned length) { return BASE64_DECODE_LENGTH(length); } const struct nettle_armor nettle_base64 = _NETTLE_ARMOR(base64, BASE64); dibbler-1.0.1/nettle/sha.h0000644000175000017500000000543412277722750012275 00000000000000/* sha.h * * The sha1 and sha256 hash functions. */ /* nettle, low-level cryptographics library * * Copyright (C) 2001 Niels Möller * * The nettle library is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at your * option) any later version. * * The nettle 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 Lesser General Public * License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with the nettle library; see the file COPYING.LIB. If not, write to * the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, * MA 02111-1307, USA. */ #ifndef NETTLE_SHA_H_INCLUDED #define NETTLE_SHA_H_INCLUDED #include "nettle-types.h" /* Name mangling */ #define sha1_init nettle_sha1_init #define sha1_update nettle_sha1_update #define sha1_digest nettle_sha1_digest #define sha256_init nettle_sha256_init #define sha256_update nettle_sha256_update #define sha256_digest nettle_sha256_digest /* SHA1 */ #define SHA1_DIGEST_SIZE 20 #define SHA1_DATA_SIZE 64 /* Digest is kept internally as 5 32-bit words. */ #define _SHA1_DIGEST_LENGTH 5 struct sha1_ctx { uint32_t digest[_SHA1_DIGEST_LENGTH]; /* Message digest */ uint32_t count_low, count_high; /* 64-bit block count */ uint8_t block[SHA1_DATA_SIZE]; /* SHA1 data buffer */ unsigned int index; /* index into buffer */ }; void sha1_init(struct sha1_ctx *ctx); void sha1_update(struct sha1_ctx *ctx, unsigned length, const uint8_t *data); void sha1_digest(struct sha1_ctx *ctx, unsigned length, uint8_t *digest); /* Internal compression function. STATE points to 5 uint32_t words, and DATA points to 16 uint32_t words which are destroyed. */ void _nettle_sha1_compress(uint32_t *state, uint32_t *data); /* SHA256 */ #define SHA256_DIGEST_SIZE 32 #define SHA256_DATA_SIZE 64 /* Digest is kept internally as 8 32-bit words. */ #define _SHA256_DIGEST_LENGTH 8 struct sha256_ctx { uint32_t state[_SHA256_DIGEST_LENGTH]; /* State variables */ uint32_t count_low, count_high; /* 64-bit block count */ uint8_t block[SHA256_DATA_SIZE]; /* SHA256 data buffer */ unsigned int index; /* index into buffer */ }; void sha256_init(struct sha256_ctx *ctx); void sha256_update(struct sha256_ctx *ctx, unsigned length, const uint8_t *data); void sha256_digest(struct sha256_ctx *ctx, unsigned length, uint8_t *digest); #endif /* NETTLE_SHA_H_INCLUDED */ dibbler-1.0.1/nettle/md5-meta.c0000644000175000017500000000204212277722750013116 00000000000000/* md5-meta.c */ /* nettle, low-level cryptographics library * * Copyright (C) 2002 Niels Möller * * The nettle library is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at your * option) any later version. * * The nettle 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 Lesser General Public * License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with the nettle library; see the file COPYING.LIB. If not, write to * the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, * MA 02111-1307, USA. */ #if HAVE_CONFIG_H # include "dibbler-config.h" #endif #include "nettle-meta.h" #include "md5.h" const struct nettle_hash nettle_md5 = _NETTLE_HASH(md5, MD5); dibbler-1.0.1/nettle/Makefile.am0000644000175000017500000000047312277722750013403 00000000000000noinst_LIBRARIES = libNettle.a libNettle_a_SOURCES = \ base64-decode.c \ base64-encode.c \ base64-meta.c \ base64.h \ cbc.h \ hmac-md5.c \ hmac.c \ hmac.h \ macros.h \ md5-meta.c \ md5.c \ md5.h \ memxor.c \ memxor.h \ nettle-internal.h \ nettle-meta.h \ nettle-types.h \ sha.h dibbler-1.0.1/nettle/cbc.h0000644000175000017500000000607512277722750012253 00000000000000/* cbc.h * * Cipher block chaining mode. */ /* nettle, low-level cryptographics library * * Copyright (C) 2001 Niels Möller * * The nettle library is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at your * option) any later version. * * The nettle 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 Lesser General Public * License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with the nettle library; see the file COPYING.LIB. If not, write to * the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, * MA 02111-1307, USA. */ #ifndef NETTLE_CBC_H_INCLUDED #define NETTLE_CBC_H_INCLUDED #include "nettle-types.h" /* Name mangling */ #define cbc_encrypt nettle_cbc_encrypt #define cbc_decrypt nettle_cbc_decrypt /* Uses a void * for cipher contexts. For block ciphers it would make sense with a const void * for the context, but we use the same typedef for stream ciphers where the internal state changes during the encryption. */ typedef void (*nettle_crypt_func)(void *ctx, unsigned length, uint8_t *dst, const uint8_t *src); void cbc_encrypt(void *ctx, nettle_crypt_func f, unsigned block_size, uint8_t *iv, unsigned length, uint8_t *dst, const uint8_t *src); void cbc_decrypt(void *ctx, nettle_crypt_func f, unsigned block_size, uint8_t *iv, unsigned length, uint8_t *dst, const uint8_t *src); #define CBC_CTX(type, size) \ { type ctx; uint8_t iv[size]; } #define CBC_SET_IV(ctx, data) \ memcpy((ctx)->iv, (data), sizeof((ctx)->iv)) #if 0 #define CBC_ENCRYPT(self, f, length, dst, src) \ do { if (0) (f)(&(self)->ctx, 0, NULL, NULL); \ cbc_encrypt((void *) &(self)->ctx, \ (void (*)(void *, unsigned, uint8_t *, const uint8_t *)) (f), \ sizeof((self)->iv), (self)->iv, \ (length), (dst), (src)); \ } while (0) #endif #define CBC_ENCRYPT(self, f, length, dst, src) \ (0 ? ((f)(&(self)->ctx, 0, NULL, NULL)) \ : cbc_encrypt((void *) &(self)->ctx, \ (void (*)(void *, unsigned, uint8_t *, const uint8_t *)) (f), \ sizeof((self)->iv), (self)->iv, \ (length), (dst), (src))) #define CBC_DECRYPT(self, f, length, dst, src) \ (0 ? ((f)(&(self)->ctx, 0, NULL, NULL)) \ : cbc_decrypt((void *) &(self)->ctx, \ (void (*)(void *, unsigned, uint8_t *, const uint8_t *)) (f), \ sizeof((self)->iv), (self)->iv, \ (length), (dst), (src))) #if 0 /* Type safer variants */ #define CBC_ENCRYPT2(ctx, f, b, iv, l, dst, src) \ (0 ? ((f)((ctx),0,NULL,NULL)) \ : cbc_encrypt((void *)(ctx), \ (void (*)(void *, unsigned, uint8_t *, const uint8_t *)) (f), \ (b), (iv), (l), (dst), (src))) #endif #endif /* NETTLE_CBC_H_INCLUDED */ dibbler-1.0.1/nettle/nettle-meta.h0000644000175000017500000001600612277722750013736 00000000000000/* nettle-meta.h * * Information about algorithms. */ /* nettle, low-level cryptographics library * * Copyright (C) 2002 Niels Möller * * The nettle library is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at your * option) any later version. * * The nettle 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 Lesser General Public * License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with the nettle library; see the file COPYING.LIB. If not, write to * the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, * MA 02111-1307, USA. */ #ifndef NETTLE_META_H_INCLUDED #define NETTLE_META_H_INCLUDED #include "nettle-types.h" /* For nettle_crypt_func */ #include "cbc.h" /* Randomness. Used by key generation and dsa signature creation. */ typedef void (*nettle_random_func)(void *ctx, unsigned length, uint8_t *dst); /* Progress report function, mainly for key generation. */ typedef void (*nettle_progress_func)(void *ctx, int c); /* Ciphers */ typedef void (*nettle_set_key_func)(void *ctx, unsigned length, const uint8_t *key); struct nettle_cipher { const char *name; unsigned context_size; /* Zero for stream ciphers */ unsigned block_size; /* Suggested key size; other sizes are sometimes possible. */ unsigned key_size; nettle_set_key_func set_encrypt_key; nettle_set_key_func set_decrypt_key; nettle_crypt_func encrypt; nettle_crypt_func decrypt; }; #define _NETTLE_CIPHER(name, NAME, keysize) { \ #name #keysize, \ sizeof(struct name##_ctx), \ NAME##_BLOCK_SIZE, \ keysize / 8, \ (nettle_set_key_func) name##_set_key, \ (nettle_set_key_func) name##_set_key, \ (nettle_crypt_func) name##_encrypt, \ (nettle_crypt_func) name##_decrypt, \ } #define _NETTLE_CIPHER_SEP(name, NAME, keysize) { \ #name #keysize, \ sizeof(struct name##_ctx), \ NAME##_BLOCK_SIZE, \ keysize / 8, \ (nettle_set_key_func) name##_set_encrypt_key, \ (nettle_set_key_func) name##_set_decrypt_key, \ (nettle_crypt_func) name##_encrypt, \ (nettle_crypt_func) name##_decrypt, \ } #define _NETTLE_CIPHER_FIX(name, NAME, keysize) { \ #name, \ sizeof(struct name##_ctx), \ NAME##_BLOCK_SIZE, \ keysize / 8, \ (nettle_set_key_func) name##_set_key, \ (nettle_set_key_func) name##_set_key, \ (nettle_crypt_func) name##_encrypt, \ (nettle_crypt_func) name##_decrypt, \ } extern const struct nettle_cipher nettle_aes128; extern const struct nettle_cipher nettle_aes192; extern const struct nettle_cipher nettle_aes256; extern const struct nettle_cipher nettle_arcfour128; extern const struct nettle_cipher nettle_cast128; extern const struct nettle_cipher nettle_serpent128; extern const struct nettle_cipher nettle_serpent192; extern const struct nettle_cipher nettle_serpent256; extern const struct nettle_cipher nettle_twofish128; extern const struct nettle_cipher nettle_twofish192; extern const struct nettle_cipher nettle_twofish256; extern const struct nettle_cipher nettle_arctwo40; extern const struct nettle_cipher nettle_arctwo64; extern const struct nettle_cipher nettle_arctwo128; extern const struct nettle_cipher nettle_arctwo_gutmann128; /* Hash algorithms */ typedef void (*nettle_hash_init_func)(void *ctx); typedef void (*nettle_hash_update_func)(void *ctx, unsigned length, const uint8_t *src); typedef void (*nettle_hash_digest_func)(void *ctx, unsigned length, uint8_t *dst); struct nettle_hash { const char *name; /* Size of the context struct */ unsigned context_size; /* Size of digests */ unsigned digest_size; /* Internal block size */ unsigned block_size; nettle_hash_init_func init; nettle_hash_update_func update; nettle_hash_digest_func digest; }; #define _NETTLE_HASH(name, NAME) { \ #name, \ sizeof(struct name##_ctx), \ NAME##_DIGEST_SIZE, \ NAME##_DATA_SIZE, \ (nettle_hash_init_func) name##_init, \ (nettle_hash_update_func) name##_update, \ (nettle_hash_digest_func) name##_digest \ } extern const struct nettle_hash nettle_md2; extern const struct nettle_hash nettle_md4; extern const struct nettle_hash nettle_md5; extern const struct nettle_hash nettle_sha1; extern const struct nettle_hash nettle_sha256; /* ASCII armor codecs. NOTE: Experimental and subject to change. */ typedef unsigned (*nettle_armor_length_func)(unsigned length); typedef void (*nettle_armor_init_func)(void *ctx); typedef unsigned (*nettle_armor_encode_update_func)(void *ctx, uint8_t *dst, unsigned src_length, const uint8_t *src); typedef unsigned (*nettle_armor_encode_final_func)(void *ctx, uint8_t *dst); typedef int (*nettle_armor_decode_update_func)(void *ctx, unsigned *dst_length, uint8_t *dst, unsigned src_length, const uint8_t *src); typedef int (*nettle_armor_decode_final_func)(void *ctx); struct nettle_armor { const char *name; unsigned encode_context_size; unsigned decode_context_size; unsigned encode_final_length; nettle_armor_init_func encode_init; nettle_armor_length_func encode_length; nettle_armor_encode_update_func encode_update; nettle_armor_encode_final_func encode_final; nettle_armor_init_func decode_init; nettle_armor_length_func decode_length; nettle_armor_decode_update_func decode_update; nettle_armor_decode_final_func decode_final; }; #define _NETTLE_ARMOR(name, NAME) { \ #name, \ sizeof(struct name##_encode_ctx), \ sizeof(struct name##_decode_ctx), \ NAME##_ENCODE_FINAL_LENGTH, \ (nettle_armor_init_func) name##_encode_init, \ (nettle_armor_length_func) name##_encode_length, \ (nettle_armor_encode_update_func) name##_encode_update, \ (nettle_armor_encode_final_func) name##_encode_final, \ (nettle_armor_init_func) name##_decode_init, \ (nettle_armor_length_func) name##_decode_length, \ (nettle_armor_decode_update_func) name##_decode_update, \ (nettle_armor_decode_final_func) name##_decode_final, \ } #define _NETTLE_ARMOR_0(name, NAME) { \ #name, \ 0, \ sizeof(struct name##_decode_ctx), \ NAME##_ENCODE_FINAL_LENGTH, \ (nettle_armor_init_func) name##_encode_init, \ (nettle_armor_length_func) name##_encode_length, \ (nettle_armor_encode_update_func) name##_encode_update, \ (nettle_armor_encode_final_func) name##_encode_final, \ (nettle_armor_init_func) name##_decode_init, \ (nettle_armor_length_func) name##_decode_length, \ (nettle_armor_decode_update_func) name##_decode_update, \ (nettle_armor_decode_final_func) name##_decode_final, \ } extern const struct nettle_armor nettle_base64; extern const struct nettle_armor nettle_base16; #endif /* NETTLE_META_H_INCLUDED */ dibbler-1.0.1/nettle/base64.h0000644000175000017500000001110712277722750012600 00000000000000/* base64.h * * "ASCII armor" codecs. */ /* nettle, low-level cryptographics library * * Copyright (C) 2002 Niels Möller, Dan Egnor * * The nettle library is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at your * option) any later version. * * The nettle 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 Lesser General Public * License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with the nettle library; see the file COPYING.LIB. If not, write to * the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, * MA 02111-1307, USA. */ #ifndef NETTLE_BASE64_H_INCLUDED #define NETTLE_BASE64_H_INCLUDED #include "nettle-types.h" /* Name mangling */ #define base64_encode_init nettle_base64_encode_init #define base64_encode_single nettle_base64_encode_single #define base64_encode_update nettle_base64_encode_update #define base64_encode_final nettle_base64_encode_final #define base64_encode_raw nettle_base64_encode_raw #define base64_encode_group nettle_base64_encode_group #define base64_decode_init nettle_base64_decode_init #define base64_decode_single nettle_base64_decode_single #define base64_decode_update nettle_base64_decode_update #define base64_decode_final nettle_base64_decode_final #define BASE64_BINARY_BLOCK_SIZE 3 #define BASE64_TEXT_BLOCK_SIZE 4 /* Base64 encoding */ /* Maximum length of output for base64_encode_update. NOTE: Doesn't * include any padding that base64_encode_final may add. */ /* We have at most 4 buffered bits, and a total of (4 + length * 8) bits. */ #define BASE64_ENCODE_LENGTH(length) (((length) * 8 + 4)/6) /* Maximum lengbth of output generated by base64_encode_final. */ #define BASE64_ENCODE_FINAL_LENGTH 3 /* Exact length of output generated by base64_encode_raw, including * padding. */ #define BASE64_ENCODE_RAW_LENGTH(length) ((((length) + 2)/3)*4) struct base64_encode_ctx { unsigned word; /* Leftover bits */ unsigned bits; /* Number of bits, always 0, 2, or 4. */ }; void base64_encode_init(struct base64_encode_ctx *ctx); /* Encodes a single byte. Returns amount of output (always 1 or 2). */ unsigned base64_encode_single(struct base64_encode_ctx *ctx, uint8_t *dst, uint8_t src); /* Returns the number of output characters. DST should point to an * area of size at least BASE64_ENCODE_LENGTH(length). */ unsigned base64_encode_update(struct base64_encode_ctx *ctx, uint8_t *dst, unsigned length, const uint8_t *src); /* DST should point to an area of size at least * BASE64_ENCODE_FINAL_LENGTH */ unsigned base64_encode_final(struct base64_encode_ctx *ctx, uint8_t *dst); /* Lower level functions */ /* Encodes a string in one go, including any padding at the end. * Generates exactly BASE64_ENCODE_RAW_LENGTH(length) bytes of output. * Supports overlapped operation, if src <= dst. */ void base64_encode_raw(uint8_t *dst, unsigned length, const uint8_t *src); void base64_encode_group(uint8_t *dst, uint32_t group); /* Base64 decoding */ /* Maximum length of output for base64_decode_update. */ /* We have at most 6 buffered bits, and a total of (length + 1) * 6 bits. */ #define BASE64_DECODE_LENGTH(length) ((((length) + 1) * 6) / 8) struct base64_decode_ctx { unsigned word; /* Leftover bits */ unsigned bits; /* Number buffered bits */ /* Number of padding characters encountered */ unsigned padding; }; void base64_decode_init(struct base64_decode_ctx *ctx); /* Decodes a single byte. Returns amount of output (0 or 1), or -1 on * errors. */ int base64_decode_single(struct base64_decode_ctx *ctx, uint8_t *dst, uint8_t src); /* Returns 1 on success, 0 on error. DST should point to an area of * size at least BASE64_DECODE_LENGTH(length), and for sanity * checking, *DST_LENGTH should be initialized to the size of that * area before the call. *DST_LENGTH is updated to the amount of * decoded output. */ /* FIXME: Currently results in an assertion failure if *DST_LENGTH is * too small. Return some error instead? */ int base64_decode_update(struct base64_decode_ctx *ctx, unsigned *dst_length, uint8_t *dst, unsigned src_length, const uint8_t *src); /* Returns 1 on success. */ int base64_decode_final(struct base64_decode_ctx *ctx); #endif /* NETTLE_BASE64_H_INCLUDED */ dibbler-1.0.1/nettle/md5.c0000644000175000017500000002077712277722750012211 00000000000000/* md5.c * * The MD5 hash function, described in RFC 1321. */ /* nettle, low-level cryptographics library * * Copyright (C) 2001 Niels Möller * * The nettle library is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at your * option) any later version. * * The nettle 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 Lesser General Public * License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with the nettle library; see the file COPYING.LIB. If not, write to * the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, * MA 02111-1307, USA. */ /* Based on public domain code hacked by Colin Plumb, Andrew Kuchling, and * Niels Möller. */ #if HAVE_CONFIG_H # include "dibbler-config.h" #endif #include #include #include "md5.h" #include "macros.h" /* A block, treated as a sequence of 32-bit words. */ #define MD5_DATA_LENGTH 16 static void md5_transform(uint32_t *digest, const uint32_t *data); static void md5_block(struct md5_ctx *ctx, const uint8_t *block); static void md5_final(struct md5_ctx *ctx); void md5_init(struct md5_ctx *ctx) { ctx->digest[0] = 0x67452301; ctx->digest[1] = 0xefcdab89; ctx->digest[2] = 0x98badcfe; ctx->digest[3] = 0x10325476; ctx->count_l = ctx->count_h = 0; ctx->index = 0; } void md5_update(struct md5_ctx *ctx, unsigned length, const uint8_t *data) { if (ctx->index) { /* Try to fill partial block */ unsigned left = MD5_DATA_SIZE - ctx->index; if (length < left) { memcpy(ctx->block + ctx->index, data, length); ctx->index += length; return; /* Finished */ } else { memcpy(ctx->block + ctx->index, data, left); md5_block(ctx, ctx->block); data += left; length -= left; } } while (length >= MD5_DATA_SIZE) { md5_block(ctx, data); data += MD5_DATA_SIZE; length -= MD5_DATA_SIZE; } if ((ctx->index = length)) /* This assignment is intended */ /* Buffer leftovers */ memcpy(ctx->block, data, length); } void md5_digest(struct md5_ctx *ctx, unsigned length, uint8_t *digest) { unsigned i; unsigned words; unsigned leftover; assert(length <= MD5_DIGEST_SIZE); md5_final(ctx); words = length / 4; leftover = length % 4; /* Little endian order */ for (i = 0; i < words; i++, digest += 4) LE_WRITE_UINT32(digest, ctx->digest[i]); if (leftover) { uint32_t word; unsigned j; assert(i < _MD5_DIGEST_LENGTH); /* Still least significant byte first. */ for (word = ctx->digest[i], j = 0; j < leftover; j++, word >>= 8) digest[j] = word & 0xff; } md5_init(ctx); } /* MD5 functions */ #define F1(x, y, z) ((z) ^ ((x) & ((y) ^ (z)))) #define F2(x, y, z) F1((z), (x), (y)) #define F3(x, y, z) ((x) ^ (y) ^ (z)) #define F4(x, y, z) ((y) ^ ((x) | ~(z))) #define ROUND(f, w, x, y, z, data, s) \ ( w += f(x, y, z) + data, w = w<>(32-s), w += x ) /* Perform the MD5 transformation on one full block of 16 32-bit * words. * * Compresses 20 (_MD5_DIGEST_LENGTH + MD5_DATA_LENGTH) words into 4 * (_MD5_DIGEST_LENGTH) words. */ static void md5_transform(uint32_t *digest, const uint32_t *data) { uint32_t a, b, c, d; a = digest[0]; b = digest[1]; c = digest[2]; d = digest[3]; ROUND(F1, a, b, c, d, data[ 0] + 0xd76aa478, 7); ROUND(F1, d, a, b, c, data[ 1] + 0xe8c7b756, 12); ROUND(F1, c, d, a, b, data[ 2] + 0x242070db, 17); ROUND(F1, b, c, d, a, data[ 3] + 0xc1bdceee, 22); ROUND(F1, a, b, c, d, data[ 4] + 0xf57c0faf, 7); ROUND(F1, d, a, b, c, data[ 5] + 0x4787c62a, 12); ROUND(F1, c, d, a, b, data[ 6] + 0xa8304613, 17); ROUND(F1, b, c, d, a, data[ 7] + 0xfd469501, 22); ROUND(F1, a, b, c, d, data[ 8] + 0x698098d8, 7); ROUND(F1, d, a, b, c, data[ 9] + 0x8b44f7af, 12); ROUND(F1, c, d, a, b, data[10] + 0xffff5bb1, 17); ROUND(F1, b, c, d, a, data[11] + 0x895cd7be, 22); ROUND(F1, a, b, c, d, data[12] + 0x6b901122, 7); ROUND(F1, d, a, b, c, data[13] + 0xfd987193, 12); ROUND(F1, c, d, a, b, data[14] + 0xa679438e, 17); ROUND(F1, b, c, d, a, data[15] + 0x49b40821, 22); ROUND(F2, a, b, c, d, data[ 1] + 0xf61e2562, 5); ROUND(F2, d, a, b, c, data[ 6] + 0xc040b340, 9); ROUND(F2, c, d, a, b, data[11] + 0x265e5a51, 14); ROUND(F2, b, c, d, a, data[ 0] + 0xe9b6c7aa, 20); ROUND(F2, a, b, c, d, data[ 5] + 0xd62f105d, 5); ROUND(F2, d, a, b, c, data[10] + 0x02441453, 9); ROUND(F2, c, d, a, b, data[15] + 0xd8a1e681, 14); ROUND(F2, b, c, d, a, data[ 4] + 0xe7d3fbc8, 20); ROUND(F2, a, b, c, d, data[ 9] + 0x21e1cde6, 5); ROUND(F2, d, a, b, c, data[14] + 0xc33707d6, 9); ROUND(F2, c, d, a, b, data[ 3] + 0xf4d50d87, 14); ROUND(F2, b, c, d, a, data[ 8] + 0x455a14ed, 20); ROUND(F2, a, b, c, d, data[13] + 0xa9e3e905, 5); ROUND(F2, d, a, b, c, data[ 2] + 0xfcefa3f8, 9); ROUND(F2, c, d, a, b, data[ 7] + 0x676f02d9, 14); ROUND(F2, b, c, d, a, data[12] + 0x8d2a4c8a, 20); ROUND(F3, a, b, c, d, data[ 5] + 0xfffa3942, 4); ROUND(F3, d, a, b, c, data[ 8] + 0x8771f681, 11); ROUND(F3, c, d, a, b, data[11] + 0x6d9d6122, 16); ROUND(F3, b, c, d, a, data[14] + 0xfde5380c, 23); ROUND(F3, a, b, c, d, data[ 1] + 0xa4beea44, 4); ROUND(F3, d, a, b, c, data[ 4] + 0x4bdecfa9, 11); ROUND(F3, c, d, a, b, data[ 7] + 0xf6bb4b60, 16); ROUND(F3, b, c, d, a, data[10] + 0xbebfbc70, 23); ROUND(F3, a, b, c, d, data[13] + 0x289b7ec6, 4); ROUND(F3, d, a, b, c, data[ 0] + 0xeaa127fa, 11); ROUND(F3, c, d, a, b, data[ 3] + 0xd4ef3085, 16); ROUND(F3, b, c, d, a, data[ 6] + 0x04881d05, 23); ROUND(F3, a, b, c, d, data[ 9] + 0xd9d4d039, 4); ROUND(F3, d, a, b, c, data[12] + 0xe6db99e5, 11); ROUND(F3, c, d, a, b, data[15] + 0x1fa27cf8, 16); ROUND(F3, b, c, d, a, data[ 2] + 0xc4ac5665, 23); ROUND(F4, a, b, c, d, data[ 0] + 0xf4292244, 6); ROUND(F4, d, a, b, c, data[ 7] + 0x432aff97, 10); ROUND(F4, c, d, a, b, data[14] + 0xab9423a7, 15); ROUND(F4, b, c, d, a, data[ 5] + 0xfc93a039, 21); ROUND(F4, a, b, c, d, data[12] + 0x655b59c3, 6); ROUND(F4, d, a, b, c, data[ 3] + 0x8f0ccc92, 10); ROUND(F4, c, d, a, b, data[10] + 0xffeff47d, 15); ROUND(F4, b, c, d, a, data[ 1] + 0x85845dd1, 21); ROUND(F4, a, b, c, d, data[ 8] + 0x6fa87e4f, 6); ROUND(F4, d, a, b, c, data[15] + 0xfe2ce6e0, 10); ROUND(F4, c, d, a, b, data[ 6] + 0xa3014314, 15); ROUND(F4, b, c, d, a, data[13] + 0x4e0811a1, 21); ROUND(F4, a, b, c, d, data[ 4] + 0xf7537e82, 6); ROUND(F4, d, a, b, c, data[11] + 0xbd3af235, 10); ROUND(F4, c, d, a, b, data[ 2] + 0x2ad7d2bb, 15); ROUND(F4, b, c, d, a, data[ 9] + 0xeb86d391, 21); digest[0] += a; digest[1] += b; digest[2] += c; digest[3] += d; } static void md5_block(struct md5_ctx *ctx, const uint8_t *block) { uint32_t data[MD5_DATA_LENGTH]; unsigned i; /* Update block count */ if (!++ctx->count_l) ++ctx->count_h; /* Endian independent conversion */ for (i = 0; i<16; i++, block += 4) data[i] = LE_READ_UINT32(block); md5_transform(ctx->digest, data); } /* Final wrapup - pad to MD5_DATA_SIZE-byte boundary with the bit * pattern 1 0* (64-bit count of bits processed, LSB-first) */ static void md5_final(struct md5_ctx *ctx) { uint32_t data[MD5_DATA_LENGTH]; unsigned i; unsigned words; i = ctx->index; /* Set the first char of padding to 0x80. This is safe since there * is always at least one byte free */ assert(i < MD5_DATA_SIZE); ctx->block[i++] = 0x80; /* Fill rest of word */ for( ; i & 3; i++) ctx->block[i] = 0; /* i is now a multiple of the word size 4 */ words = i >> 2; for (i = 0; i < words; i++) data[i] = LE_READ_UINT32(ctx->block + 4*i); if (words > (MD5_DATA_LENGTH-2)) { /* No room for length in this block. Process it and * pad with another one */ for (i = words ; i < MD5_DATA_LENGTH; i++) data[i] = 0; md5_transform(ctx->digest, data); for (i = 0; i < (MD5_DATA_LENGTH-2); i++) data[i] = 0; } else for (i = words ; i < MD5_DATA_LENGTH - 2; i++) data[i] = 0; /* There are 512 = 2^9 bits in one block * Little-endian order => Least significant word first */ data[MD5_DATA_LENGTH-1] = (ctx->count_h << 9) | (ctx->count_l >> 23); data[MD5_DATA_LENGTH-2] = (ctx->count_l << 9) | (ctx->index << 3); md5_transform(ctx->digest, data); } dibbler-1.0.1/nettle/nettle-internal.h0000644000175000017500000000515412277722750014626 00000000000000/* nettle-internal.h * * Things that are used only by the testsuite and benchmark, and * subject to change. */ /* nettle, low-level cryptographics library * * Copyright (C) 2002 Niels Möller * * The nettle library is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at your * option) any later version. * * The nettle 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 Lesser General Public * License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with the nettle library; see the file COPYING.LIB. If not, write to * the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, * MA 02111-1307, USA. */ #ifndef NETTLE_INTERNAL_H_INCLUDED #define NETTLE_INTERNAL_H_INCLUDED #include "nettle-meta.h" /* Temporary allocation, for systems that don't support alloca. Note * that the allocation requests should always be reasonably small, so * that they can fit on the stack. For non-alloca systems, we use a * fix maximum size, and abort if we ever need anything larger. */ #if HAVE_ALLOCA # define TMP_DECL(name, type, max) type *name # define TMP_ALLOC(name, size) (name = alloca(sizeof (*name) * size)) #else /* !HAVE_ALLOCA */ # define TMP_DECL(name, type, max) type name[max] # define TMP_ALLOC(name, size) \ do { if (size > (sizeof(name) / sizeof(name[0]))) abort(); } while (0) #endif /* Arbitrary limits which apply to systems that don't have alloca */ #define NETTLE_MAX_BIGNUM_BITS 10000 #define NETTLE_MAX_HASH_BLOCK_SIZE 64 #define NETTLE_MAX_HASH_DIGEST_SIZE 32 #define NETTLE_MAX_SEXP_ASSOC 17 /* Doesn't quite fit with the other algorithms, because of the weak * keys. Weak keys are not reported, the functions will simply crash * if you try to use a weak key. */ extern const struct nettle_cipher nettle_des; extern const struct nettle_cipher nettle_des3; extern const struct nettle_cipher nettle_blowfish128; /* Glue to openssl, for comparative benchmarking. The corresponding * code is not included in the nettle library, as that would make the * shared library depend on openssl. Instead, look at * examples/nettle-openssl.c. */ extern const struct nettle_cipher nettle_openssl_blowfish128; extern const struct nettle_cipher nettle_openssl_des; extern const struct nettle_cipher nettle_openssl_cast128; #endif /* NETTLE_INTERNAL_H_INCLUDED */ dibbler-1.0.1/nettle/hmac-md5.c0000644000175000017500000000265212277722750013107 00000000000000/* hmac-md5.c * * HMAC-MD5 message authentication code. */ /* nettle, low-level cryptographics library * * Copyright (C) 2002 Niels Möller * * The nettle library is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at your * option) any later version. * * The nettle 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 Lesser General Public * License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with the nettle library; see the file COPYING.LIB. If not, write to * the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, * MA 02111-1307, USA. */ #if HAVE_CONFIG_H # include "dibbler-config.h" #endif #include "md5.h" #include "hmac.h" void hmac_md5_set_key(struct hmac_md5_ctx *ctx, unsigned key_length, const uint8_t *key) { HMAC_SET_KEY(ctx, &nettle_md5, key_length, key); } void hmac_md5_update(struct hmac_md5_ctx *ctx, unsigned length, const uint8_t *data) { md5_update(&ctx->state, length, data); } void hmac_md5_digest(struct hmac_md5_ctx *ctx, unsigned length, uint8_t *digest) { HMAC_DIGEST(ctx, &nettle_md5, length, digest); } dibbler-1.0.1/nettle/hmac.h0000644000175000017500000000712112277722750012425 00000000000000/* hmac.h * * HMAC message authentication code (RFC-2104). */ /* nettle, low-level cryptographics library * * Copyright (C) 2001, 2002 Niels Möller * * The nettle library is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at your * option) any later version. * * The nettle 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 Lesser General Public * License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with the nettle library; see the file COPYING.LIB. If not, write to * the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, * MA 02111-1307, USA. */ #ifndef NETTLE_HMAC_H_INCLUDED #define NETTLE_HMAC_H_INCLUDED #include "nettle-meta.h" #include "md5.h" #include "sha.h" /* Namespace mangling */ #define hmac_set_key nettle_hmac_set_key #define hmac_update nettle_hmac_update #define hmac_digest nettle_hmac_digest #define hmac_md5_set_key nettle_hmac_md5_set_key #define hmac_md5_update nettle_hmac_md5_update #define hmac_md5_digest nettle_hmac_md5_digest #define hmac_sha1_set_key nettle_hmac_sha1_set_key #define hmac_sha1_update nettle_hmac_sha1_update #define hmac_sha1_digest nettle_hmac_sha1_digest #define hmac_sha256_set_key nettle_hmac_sha256_set_key #define hmac_sha256_update nettle_hmac_sha256_update #define hmac_sha256_digest nettle_hmac_sha256_digest void hmac_set_key(void *outer, void *inner, void *state, const struct nettle_hash *hash, unsigned length, const uint8_t *key); /* This function is not strictly needed, it's s just the same as the * hash update function. */ void hmac_update(void *state, const struct nettle_hash *hash, unsigned length, const uint8_t *data); void hmac_digest(const void *outer, const void *inner, void *state, const struct nettle_hash *hash, unsigned length, uint8_t *digest); #define HMAC_CTX(type) \ { type outer; type inner; type state; } #define HMAC_SET_KEY(ctx, hash, length, key) \ hmac_set_key( &(ctx)->outer, &(ctx)->inner, &(ctx)->state, \ (hash), (length), (key) ) #define HMAC_DIGEST(ctx, hash, length, digest) \ hmac_digest( &(ctx)->outer, &(ctx)->inner, &(ctx)->state, \ (hash), (length), (digest) ) /* HMAC using specific hash functions */ /* hmac-md5 */ struct hmac_md5_ctx HMAC_CTX(struct md5_ctx); void hmac_md5_set_key(struct hmac_md5_ctx *ctx, unsigned key_length, const uint8_t *key); void hmac_md5_update(struct hmac_md5_ctx *ctx, unsigned length, const uint8_t *data); void hmac_md5_digest(struct hmac_md5_ctx *ctx, unsigned length, uint8_t *digest); /* hmac-sha1 */ struct hmac_sha1_ctx HMAC_CTX(struct sha1_ctx); void hmac_sha1_set_key(struct hmac_sha1_ctx *ctx, unsigned key_length, const uint8_t *key); void hmac_sha1_update(struct hmac_sha1_ctx *ctx, unsigned length, const uint8_t *data); void hmac_sha1_digest(struct hmac_sha1_ctx *ctx, unsigned length, uint8_t *digest); /* hmac-sha256 */ struct hmac_sha256_ctx HMAC_CTX(struct sha256_ctx); void hmac_sha256_set_key(struct hmac_sha256_ctx *ctx, unsigned key_length, const uint8_t *key); void hmac_sha256_update(struct hmac_sha256_ctx *ctx, unsigned length, const uint8_t *data); void hmac_sha256_digest(struct hmac_sha256_ctx *ctx, unsigned length, uint8_t *digest); #endif /* NETTLE_HMAC_H_INCLUDED */ dibbler-1.0.1/nettle/hmac.c0000644000175000017500000000543612277722750012427 00000000000000/* hmac.c * * HMAC message authentication code (RFC-2104). */ /* nettle, low-level cryptographics library * * Copyright (C) 2001 Niels Möller * * The nettle library is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at your * option) any later version. * * The nettle 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 Lesser General Public * License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with the nettle library; see the file COPYING.LIB. If not, write to * the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, * MA 02111-1307, USA. */ #if HAVE_CONFIG_H # include "dibbler-config.h" #endif #include #include #include "hmac.h" #include "memxor.h" #include "nettle-internal.h" #define IPAD 0x36 #define OPAD 0x5c void hmac_set_key(void *outer, void *inner, void *state, const struct nettle_hash *hash, unsigned key_length, const uint8_t *key) { TMP_DECL(pad, uint8_t, NETTLE_MAX_HASH_BLOCK_SIZE); TMP_ALLOC(pad, hash->block_size); hash->init(outer); hash->init(inner); if (key_length > hash->block_size) { /* Reduce key to the algorithm's hash size. Use the area pointed * to by state for the temporary state. */ TMP_DECL(digest, uint8_t, NETTLE_MAX_HASH_DIGEST_SIZE); TMP_ALLOC(digest, hash->digest_size); hash->init(state); hash->update(state, key_length, key); hash->digest(state, hash->digest_size, digest); key = digest; key_length = hash->digest_size; } assert(key_length <= hash->block_size); memset(pad, OPAD, hash->block_size); memxor(pad, key, key_length); hash->update(outer, hash->block_size, pad); memset(pad, IPAD, hash->block_size); memxor(pad, key, key_length); hash->update(inner, hash->block_size, pad); memcpy(state, inner, hash->context_size); } void hmac_update(void *state, const struct nettle_hash *hash, unsigned length, const uint8_t *data) { hash->update(state, length, data); } void hmac_digest(const void *outer, const void *inner, void *state, const struct nettle_hash *hash, unsigned length, uint8_t *dst) { TMP_DECL(digest, uint8_t, NETTLE_MAX_HASH_DIGEST_SIZE); TMP_ALLOC(digest, hash->digest_size); hash->digest(state, hash->digest_size, digest); memcpy(state, outer, hash->context_size); hash->update(state, hash->digest_size, digest); hash->digest(state, length, dst); memcpy(state, inner, hash->context_size); } dibbler-1.0.1/nettle/Makefile.in0000664000175000017500000004415212561652535013417 00000000000000# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = nettle DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/depcomp ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/libtool.m4 \ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/include/dibbler-config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = LIBRARIES = $(noinst_LIBRARIES) ARFLAGS = cru AM_V_AR = $(am__v_AR_@AM_V@) am__v_AR_ = $(am__v_AR_@AM_DEFAULT_V@) am__v_AR_0 = @echo " AR " $@; am__v_AR_1 = libNettle_a_AR = $(AR) $(ARFLAGS) libNettle_a_LIBADD = am_libNettle_a_OBJECTS = base64-decode.$(OBJEXT) \ base64-encode.$(OBJEXT) base64-meta.$(OBJEXT) \ hmac-md5.$(OBJEXT) hmac.$(OBJEXT) md5-meta.$(OBJEXT) \ md5.$(OBJEXT) memxor.$(OBJEXT) libNettle_a_OBJECTS = $(am_libNettle_a_OBJECTS) AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)/include depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(libNettle_a_SOURCES) DIST_SOURCES = $(libNettle_a_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALLOCA = @ALLOCA@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ ARCH = @ARCH@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ EXTRA_DIST_SUBDIRS = @EXTRA_DIST_SUBDIRS@ FGREP = @FGREP@ GREP = @GREP@ GTEST_INCLUDES = @GTEST_INCLUDES@ GTEST_LDADD = @GTEST_LDADD@ GTEST_LDFLAGS = @GTEST_LDFLAGS@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LINKPRINT = @LINKPRINT@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PORT_CFLAGS = @PORT_CFLAGS@ PORT_LDFLAGS = @PORT_LDFLAGS@ PORT_SUBDIR = @PORT_SUBDIR@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ subdirs = @subdirs@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ noinst_LIBRARIES = libNettle.a libNettle_a_SOURCES = \ base64-decode.c \ base64-encode.c \ base64-meta.c \ base64.h \ cbc.h \ hmac-md5.c \ hmac.c \ hmac.h \ macros.h \ md5-meta.c \ md5.c \ md5.h \ memxor.c \ memxor.h \ nettle-internal.h \ nettle-meta.h \ nettle-types.h \ sha.h all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign nettle/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign nettle/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstLIBRARIES: -test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES) libNettle.a: $(libNettle_a_OBJECTS) $(libNettle_a_DEPENDENCIES) $(EXTRA_libNettle_a_DEPENDENCIES) $(AM_V_at)-rm -f libNettle.a $(AM_V_AR)$(libNettle_a_AR) libNettle.a $(libNettle_a_OBJECTS) $(libNettle_a_LIBADD) $(AM_V_at)$(RANLIB) libNettle.a mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/base64-decode.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/base64-encode.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/base64-meta.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hmac-md5.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hmac.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/md5-meta.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/md5.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/memxor.Po@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LIBRARIES) installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool clean-noinstLIBRARIES \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \ clean-libtool clean-noinstLIBRARIES cscopelist-am ctags \ ctags-am distclean distclean-compile distclean-generic \ distclean-libtool distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-dvi install-dvi-am install-exec \ install-exec-am install-html install-html-am install-info \ install-info-am install-man install-pdf install-pdf-am \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ tags tags-am uninstall uninstall-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: dibbler-1.0.1/configure.ac0000664000175000017500000004475112561652513012346 00000000000000# -*- Autoconf -*- # Process this file with autoconf to produce a configure script. AC_PREREQ([2.67]) AC_INIT([dibbler], [1.0.1], [dibbler@klub.com.pl]) AM_INIT_AUTOMAKE(foreign) AC_CONFIG_SRCDIR([IfaceMgr/SocketIPv6.cpp]) AC_CONFIG_HEADERS([include/dibbler-config.h]) AC_CONFIG_MACRO_DIR([m4]) # DO NOT trigger rebuild rules, unless I tell you so. AM_MAINTAINER_MODE([disable]) # Poslib stuff AC_LANG_CPLUSPLUS dnl -- Check for Max OS x and define __APPLE_USE_RFC3542 if version needs system=`uname -s` s_version=`uname -r` case $system in Darwin) case $s_version in 12*|13*|14*) AC_DEFINE([__APPLE_USE_RFC_3542], [1], [Are we _special_?]) NEED_RFC_3542=yes # Yup, Mac OS X 10.6.x is special. 10.9 is no different, too. ;; *) # Let's hope that madness will go way one day. ;; esac ;; esac dnl change this to [no] to have verbose build system dnl make V=0 and make V=1 will do the trick AM_SILENT_RULES([no]) CFLAGS_SAVED="$CFLAGS" CPPFLAGS_SAVED="$CPPFLAGS" CXXFLAGS_SAVED="$CXXFLAGS" # Checks for programs. AC_PROG_CXX AC_PROG_CC LT_INIT([disable-shared]) #AM_PROG_LEX #AC_PROG_YACC # poslib AC_CHECK_TOOL([STRIP],[strip]) AC_HEADER_STDC dnl ----------------------- dnl Checks for header files dnl ----------------------- AC_FUNC_ALLOCA AC_CHECK_HEADERS([arpa/inet.h fcntl.h inttypes.h limits.h malloc.h netdb.h netinet/in.h stddef.h stdint.h stdlib.h string.h sys/ioctl.h sys/socket.h sys/time.h syslog.h unistd.h wchar.h]) AC_CHECK_HEADERS(poll.h sys/poll.h winsock2.h sys/select.h) AC_CHECK_HEADERS(slist ext/slist) if test x$ac_cv_header_poll_h = xyes || test x$ac_cv_header_sys_poll_h = xyes; then AC_DEFINE(HAVE_POLL, 1, [Defines whether the poll function is available]) fi AC_CHECK_DECLS([IPV6_PKTINFO],,,[ #include #include #include ]) AC_CHECK_DECLS([IPV6_RECVPKTINFO],,,[ #include #include #include ]) # Checks for typedefs, structures, and compiler characteristics. AC_HEADER_STDBOOL AC_C_INLINE AC_TYPE_INT16_T AC_TYPE_INT32_T AC_TYPE_INT8_T AC_TYPE_PID_T AC_C_RESTRICT AC_TYPE_SIZE_T AC_TYPE_SSIZE_T AC_TYPE_UINT16_T AC_TYPE_UINT32_T AC_TYPE_UINT64_T AC_TYPE_UINT8_T # Checks for library functions. AC_FUNC_FORK AC_CHECK_FUNCS([bzero gethostbyaddr gethostname gethostbyname gettimeofday inet_ntoa inet_aton memchr memmove memset select socket strcasecmp strchr strdup strerror strncasecmp strstr strtol strtoul]) CFLAGS="$CFLAGS_SAVED" CPPFLAGS="$CPPFLAGS_SAVED" CXXFLAGS="$CXXFLAGS_SAVED" dnl ------------------------------------------------------------ dnl --- poslib stuff ------------------------------------------- dnl ------------------------------------------------------------ if test $ac_cv_func_socket = no; then # socket is not in the default libraries. AC_CHECK_LIB(socket, socket, [ LIB_LIBS="$LIB_LIBS -lsocket" ]) fi AC_MSG_CHECKING(for vsnprintf) AC_TRY_COMPILE([#include #include ],[char buff[1]; va_list valist; vsnprintf(buff, 1, "", valist);], [AC_MSG_RESULT(yes) AC_DEFINE(HAVE_VSNPRINTF, 1, [Defines whether the vsnprintf() function is available]) ],[AC_MSG_RESULT(no)]) if test $ac_cv_func_inet_aton = no; then # inet_aton is not in the default libraries. AC_CHECK_LIB(resolv, inet_aton, LIB_LIBS="$LIB_LIBS -lresolv") fi if test $ac_cv_func_gethostname = no; then AC_CHECK_LIB(nsl, gethostname, LIB_LIBS="$LIB_LIBS -lnsl") fi dnl May end up with duplicate -lnsl -- oh well if test $ac_cv_func_gethostbyname = no; then AC_CHECK_LIB(nsl, gethostbyname, LIB_LIBS="$LIB_LIBS -lnsl") OLD_LIBS=$LIBS LIBS="$LIB_LIBS $LIBS -lws2_32" AC_TRY_LINK([#include ], [gethostbyname("test");], LIB_LIBS="$LIB_LIBS -lws2_32") LIBS=$OLD_LIBS fi AC_MSG_CHECKING(for struct sockaddr_in6) AC_TRY_COMPILE([#include #include #include ],[static struct sockaddr_in6 ac_i;], [AC_MSG_RESULT(yes) AC_DEFINE(HAVE_IPV6, 1, [Defines whether IPv6 support is available]) dnl ------------------ dnl Check for sin6_len dnl ------------------ AC_MSG_CHECKING(whether struct sockaddr_in6 has a sin6_len field) AC_TRY_COMPILE([#include #include #include ],[static struct sockaddr_in6 ac_i;int ac_j = sizeof(ac_i.sin6_len);], [AC_MSG_RESULT(yes) AC_DEFINE(HAVE_SIN6_LEN, 1, [Defines whether the sin6_len field should be used])], AC_MSG_RESULT(no)) dnl --------------------- dnl Check for __ss_family dnl --------------------- AC_MSG_CHECKING(whether struct sockaddr_storage has a __ss_family field) AC_TRY_COMPILE([#include #include #include ],[static struct sockaddr_storage ac_i;int ac_j = sizeof(ac_i.__ss_family);], [AC_MSG_RESULT(yes) AC_DEFINE(HAVE___SS_FAMILY, 1, [Defines wiether the __ss_family field should be used])], AC_MSG_RESULT(no)) ], AC_MSG_RESULT(no)) AC_MSG_CHECKING(for struct sockaddr_storage) AC_TRY_COMPILE([ #ifdef HAVE_WINSOCK2_H #include #else #include #include #include #endif ],[static struct sockaddr_storage ac_i;], [AC_MSG_RESULT(yes) AC_DEFINE(HAVE_SOCKADDR_STORAGE, 1, [Defines whether sockaddr_storage should be used])], AC_MSG_ERROR(For IPv6 you will need a struct sockaddr_storage!) ) dnl -------------------------------- dnl Check for sin_len in sockaddr_in dnl -------------------------------- AC_MSG_CHECKING(whether struct sockaddr_in has a sin_len field) AC_TRY_COMPILE([#include #include ],[static struct sockaddr_in ac_i;int ac_j = sizeof(ac_i.sin_len);], [AC_MSG_RESULT(yes) AC_DEFINE(HAVE_SIN_LEN, 1, [Defines whether the sin_len field is available])], AC_MSG_RESULT(no)) dnl ------------------- dnl Check for socklen_t dnl ------------------- AC_MSG_CHECKING(for socklen_t) AC_EGREP_HEADER(socklen_t, sys/socket.h, AC_MSG_RESULT(yes) AC_DEFINE(HAVE_SOCKLEN_T, 1, [Defines whether we have the socklen_t field]), AC_MSG_RESULT(no)) dnl ------------------------------------------------------------ dnl --- poslib stuff ------------------------------------------- dnl ------------------------------------------------------------ dnl --------------------------------------------- dnl Detect OS (will be used to select proper port dnl --------------------------------------------- AC_MSG_CHECKING(which port is appropriate for this system) # system=`uname -s` case $system in Linux) ARCH="LINUX" PORT_SUBDIR="Port-linux" PORT_CFLAGS="" PORT_LDFLAGS="" EXTRA_DIST_SUBDIRS="Port-bsd Port-winnt2k Port-sun" ;; Darwin | FreeBSD | NetBSD) ARCH="BSD" PORT_SUBDIR="Port-bsd" PORT_CFLAGS="" if test "$NEED_RFC_3542" == "yes"; then PORT_CFLAGS="-D__APPLE_USE_RFC_3542" fi PORT_LDFLAGS= EXTRA_DIST_SUBDIRS="Port-linux Port-winnt2k Port-sun" ;; OpenBSD) ARCH="BSD" PORT_SUBDIR="Port-bsd" PORT_CFLAGS="-DOPENBSD" PORT_LDFLAGS= EXTRA_DIST_SUBDIRS="Port-linux Port-winnt2k Port-sun" ;; SunOS) ARCH="SUNOS" PORT_SUBDIR="Port-sun" PORT_CFLAGS="-DSUNOS -D__EXTENSIONS__" PORT_LDFLAGS="-lsocket -lnsl" EXTRA_DIST_SUBDIRS="Port-linux Port-winnt2k Port-bsd" ;; MINGW32*) ARCH="WIN2K" PORT_LDFLAGS = "-lws2_32" PORT_CFLAGS = "-std=c99 -DMINGWBUILD" PORT_SUBDIR = "Port-win2k" EXTRA_DIST_SUBDIRS="Port-linux Port-bsd" ;; *) AC_MSG_ERROR("Unsupported OS: uname returned $system") ;; esac AC_MSG_RESULT($PORT_SUBDIR) CFLAGS="${CFLAGS} ${PORT_CFLAGS}" LDFLAGS="${LDFLAGS} ${PORT_LDFLAGS}" CPPFLAGS="${CPPFLAGS} -D${ARCH}" CPPFLAGS="${CPPFLAGS} -Wall -pedantic -funsigned-char" dnl ------------------------------------------------------------ dnl ./configure parameters dnl ------------------------------------------------------------ AC_ARG_ENABLE(, ) AC_ARG_ENABLE(, Dibbler modular features:) ### debugging ################## AC_ARG_ENABLE(debug, [ --enable-debug Turn on debugging (default: no)], [ case "${enableval}" in yes) debug=yes ;; no) debug=no ;; *) AC_MSG_ERROR(bad value ${enableval} for --enable-debug) ;; esac], [ debug=no ] ) if test x$debug = xyes; then OPTFLAG="-O0" CPPFLAGS="-g ${CPPFLAGS}" LINKPRINT="${LINKPRINT} debug" else OPTFLAG="-O2" fi # add -O2 or -O0 only if it isn't specified already by user TMP=`echo "$CPPFLAGS" | grep "\-O" -` if test "$CPPFLAGS" != "$TMP"; then CPPFLAGS="${OPTFLAG} ${CPPFLAGS}" fi ### electric-fence #################### AC_ARG_ENABLE(efence, [ --enable-efence Enables linking with electric-fence (default: no)], [ case "${enableval}" in yes) efence=yes ;; no) efence=no ;; *) AC_MSG_ERROR(bad value ${enableval} for --enable-efence) ;; esac], [ efence=no] ) if test x$efence = xyes; then LDFLAGS="${LDFLAGS} -lefence" LINKPRINT="${LINKPRINT} efence" fi ### reusing socket binding (bind SO_REUSEADDR) #################### AC_ARG_ENABLE(bind-reuse, [ --enable-bind-reuse Enables reusing the same port/address: SO_REUSEADDR (default: yes)], [ case "${enableval}" in yes) MOD_CLNT_BIND_REUSE=yes ;; no) MOD_CLNT_BIND_REUSE=no ;; *) AC_MSG_ERROR(bad value ${enableval} for --enable-bind-reuse) ;; esac], [MOD_CLNT_BIND_REUSE=yes] ) if test x$MOD_CLNT_BIND_REUSE = xyes; then CPPFLAGS="${CPPFLAGS} -DMOD_CLNT_BIND_REUSE" fi ### reusing dst addr filter #################### AC_ARG_ENABLE(dst-addr-filter, [ --enable-dst-addr-check Enables server checks of dst address vs socket binding address (default: no)], [ case "${enableval}" in yes) MOD_SRV_DST_ADDR_CHECK=yes ;; no) MOD_SRV_DST_ADDR_CHECK=no ;; *) AC_MSG_ERROR(bad value ${enableval} for --enable-dst-addr-check) ;; esac], [MOD_SRV_DST_ADDR_CHECK=yes] ) AM_CONDITIONAL(MOD_SRV_DST_ADDR_CHECK, test $MOD_SRV_DST_ADDR_CHECK = yes) AM_COND_IF([MOD_SRV_DST_ADDR_CHECK], [AC_DEFINE([MOD_SRV_DST_ADDR_CHECK], [1], [Support for server checks if incoming destination addr matches socket address])]) ### support for resolvconf tool (mostly Debian, probably) ############## AC_ARG_ENABLE(resolvconf, [ --enable-resolvconf Enables support for resolvconf (/sbin/resolvcof) (default: no)], [ case "${enableval}" in yes) MOD_RESOLVCONF=yes ;; no) MOD_RESOLVCONF=no ;; *) AC_MSG_ERROR(bad value ${enablevald} for --enable-resolvconf) ;; esac], [MOD_RESOLVCONF=no] ) AM_CONDITIONAL(RESOLVCONF, test $MOD_RESOLVCONF = yes) AM_COND_IF([RESOLVCONF], [AC_DEFINE([MOD_RESOLVCONF], [1], [Support for /sbin/resolvconf enabled?])]) ### DNS Update #################################### ### We may add separate parameter for client and server eventually ########## AC_ARG_ENABLE(dns-update, [ --enable-dns-update Enables DNS Update mechanism (default: yes)], [ case "${enableval}" in yes) MOD_CLNT_DISABLE_DNSUPDATE=no MOD_SRV_DISABLE_DNSUPDATE=no ;; no) MOD_CLNT_DISABLE_DNSUPDATE=yes MOD_SRV_DISABLE_DNSUPDATE=yes ;; *) AC_MSG_ERROR(bad value ${enableval} for --enable-dns-update) ;; esac], [MOD_CLNT_DISABLE_DNSUPDATE=no; MOD_SRV_DISABLE_DNSUPDATE=no] ) if test x$MOD_CLNT_DISABLE_DNSUPDATE = xyes; then CPPFLAGS="${CPPFLAGS} -DMOD_CLNT_DISABLE_DNSUPDATE" fi if test x$MOD_SRV_DISABLE_DNSUPDATE = xyes; then CPPFLAGS="${CPPFLAGS} -DMOD_SRV_DISABLE_DNSUPDATE" fi ### Authentication ############################### AC_ARG_ENABLE(auth, [ --enable-auth Enables authentication (default: yes)], [ case "${enableval}" in yes) MOD_DISABLE_AUTH=no ;; no) MOD_DISABLE_AUTH=yes ;; *) AC_MSG_ERROR(bad value ${enableval} for --enable-auth) ;; esac], [MOD_DISABLE_AUTH=no] ) if test x$MOD_DISABLE_AUTH = xyes; then CPPFLAGS="${CPPFLAGS} -DMOD_DISABLE_AUTH" fi ### gtests ################################################# AC_ARG_WITH(gtest, [ --with-gtest=PATH specify a path to gtest header files and library], gtest_path="$withval", gtest_path="no") AC_ARG_ENABLE(gtest-static, [ --enable-gtest-static Enables static linking for gtest (default: yes)], [ case "${enableval}" in yes) gtest_static=yes ;; no) gtest_static=no ;; *) AC_MSG_ERROR(bad value ${enableval} for --enable-gtest-static) ;; esac], [ gtest_static=yes] ) #echo "After gtest" if test "$gtest_path" != "no" then if test -x "${gtest_path}/scripts/gtest-config" then GTEST_CONFIG="${gtest_path}/scripts/gtest-config" GTEST_INCLUDES=`${GTEST_CONFIG} --cppflags` GTEST_LDFLAGS=`${GTEST_CONFIG} --ldflags` GTEST_LDADD=`${GTEST_CONFIG} --libs` # Linking gtest statically if test "$gtest_static" != "no" then GTEST_LDFLAGS="${GTEST_LDFLAGS} -static" fi else AC_MSG_ERROR(Google test not found: couldn't execute ${gtest_path}/scripts/gtest-config) fi fi AC_SUBST(GTEST_INCLUDES) AC_SUBST(GTEST_LDFLAGS) AC_SUBST(GTEST_LDADD) ### Link-state change detections ########################## AC_ARG_ENABLE(link-state, [ --enable-link-state Enables link-state change detections (default: yes)], [ case "${enableval}" in yes) MOD_CLNT_CONFIRM=yes ;; no) MOD_CLNT_CONFIRM=no ;; *) AC_MSG_ERROR(bad value ${enableval} for --enable-link-state) ;; esac], [MOD_CLNT_CONFIRM=yes] ) if test x$MOD_CLNT_CONFIRM = xyes; then CPPFLAGS="${CPPFLAGS} -DMOD_CLNT_CONFIRM" fi if test x$MOD_CLNT_CONFIRM = xyes && test $ARCH = LINUX ; then echo "Link state detection enabled on Linux, adding -lpthreads" LDFLAGS="${LDFLAGS} -lpthread" else echo "Link state detection disabled or this is not Linux, NOT adding -lpthreads" fi ### Remote autoconf ###################################### AC_ARG_ENABLE(remote-autoconf, [ --enable-remote-autoconf Enables *experimental* remote autoconfiguration (default: no)], [ case "${enableval}" in yes) MOD_REMOTE_AUTOCONF=yes ;; no) MOD_REMOTE_AUTOCONF=no ;; *) AC_MSG_ERROR(bad value ${enableval} for --enable-remote-autoconf) ;; esac], [MOD_REMOTE_AUTOCONF=no] ) if test x$MOD_REMOTE_AUTOCONF = xyes; then CPPFLAGS="${CPPFLAGS} -DMOD_REMOTE_AUTOCONF" fi AC_SUBST(LDFLAGS) AC_SUBST(CPPFLAGS) AC_SUBST(CXXFLAGS) AC_SUBST(ARCH) AC_SUBST(PORT_SUBDIR) # Lists all port directories that are unused on this platform (e.g. BSD and winn2k on Linux) AC_SUBST(EXTRA_DIST_SUBDIRS) AC_SUBST(PORT_LDFLAGS) AC_SUBST(PORT_CFLAGS) AC_SUBST(LINKPRINT) AC_CONFIG_SUBDIRS([bison++]) #AC_CONFIG_SUBDIRS([poslib]) if test "$gtest_path" != "no"; then echo "GTEST enabled, generating Makefiles" AC_DEFINE(HAVE_GTEST, 1, [Defines if google test is available and should be used]) fi AM_CONDITIONAL(HAVE_GTEST, [test "$gtest_path" != "no"]) dnl replace "$PORT_SUBDIR/Makefile with Port-linux/Makefile Port-bsd/Makefile" dnl and use autoreconf to generate Makefile.in in Port directories. AC_OUTPUT( Makefile AddrMgr/Makefile CfgMgr/Makefile ClntAddrMgr/Makefile ClntCfgMgr/Makefile ClntIfaceMgr/Makefile ClntMessages/Makefile ClntOptions/Makefile ClntTransMgr/Makefile IfaceMgr/Makefile Messages/Makefile Misc/Makefile Options/Makefile RelCfgMgr/Makefile RelIfaceMgr/Makefile RelMessages/Makefile RelOptions/Makefile RelTransMgr/Makefile Requestor/Makefile SrvAddrMgr/Makefile SrvCfgMgr/Makefile SrvIfaceMgr/Makefile SrvMessages/Makefile SrvOptions/Makefile SrvTransMgr/Makefile poslib/Makefile nettle/Makefile $PORT_SUBDIR/Makefile Port-linux/Makefile Port-bsd/Makefile Port-sun/Makefile Port-win32/Makefile Port-winnt2k/Makefile doc/Makefile Misc/Portable.h doc/doxygen.cfg doc/version.tex AddrMgr/tests/Makefile IfaceMgr/tests/Makefile Options/tests/Makefile SrvCfgMgr/tests/Makefile CfgMgr/tests/Makefile poslib/tests/Makefile Misc/tests/Makefile RelTransMgr/tests/Makefile tests/Makefile tests/Srv/Makefile tests/utils/Makefile) dnl ---------------------------------------- dnl Print out configured parameters dnl ---------------------------------------- echo echo "Dibbler version : $PACKAGE_VERSION" echo "Selected OS port : $PORT_SUBDIR" echo "Actual OS : $system $s_version" echo "Debug : $debug" echo "Electric fence : $efence" echo "Socket bind reuse : $MOD_CLNT_BIND_REUSE" echo "DNS Update (clnt/srv) disabled: $MOD_CLNT_DISABLE_DNSUPDATE/$MOD_SRV_DISABLE_DNSUPDATE" echo "Authentication disabled : $MOD_DISABLE_AUTH" echo "Link-state change detection : $MOD_CLNT_CONFIRM" echo "/sbin/resolvconf support : $MOD_RESOLVCONF" echo echo "Experimental features:" echo "Remote autoconfigution : $MOD_REMOTE_AUTOCONF" echo echo "CFLAGS : $CFLAGS" echo "CPPFLAGS : $CPPFLAGS" echo "CXXFLAGS : $CXXFLAGS" echo "LDFLAGS : $LDFLAGS" echo echo "Google test : $gtest_path" if test "$gtest_path" != "no" then echo "GTEST_INCLUDES : $GTEST_INCLUDES" echo "GTEST_LDFLAGS : $GTEST_LDFLAGS" echo "GTEST_LDADD : $GTEST_LDADD" echo fi echo Type make to compile dibbler. echo dibbler-1.0.1/AUTHORS0000664000175000017500000001153412556257446011133 00000000000000 Dibbler authors and contributors ---------------------------------- Primary authors: - Tomasz Mrugalski - Marek Senderski (inactive since 2003) Contributors: - Tomasz Torcz 2005-07: Compatibility with gcc 2.x fixed - NIIBE Yutaka 2005-12: Makefile improvements - Sob 2006-01: Process checking in Linux - Adrien CLERC, Bahattin DEMIRPLAK, Gaëtant ELEOUET, Mickaël GUÉRIN, Lionel GUILMIN, Lauréline PROVOST from the ENSEEIHT University, Toulouse, France. 2006-03: DNS Updates (FQDN) support - Krzysztof Wnuk 2006-05: Reverse DNS Updates, lots of enhancements 2006-09: Initial prefix delegation support - Arne Bernin 2006-10: XML fixes - David Minodier 2007-03: Prefix during prefix delegation is now split properly 2007-04: Fixes in prefix delegation - Petr Pisar 2007-03: Various fixes (ntp_add, xml syntax, tun support improved) 2007-08: Inactive mode for server 2008-07: Small xml fix 2008-08: /etc/resolv.conf rewriting improved 2008-09: Race condition under linux fixed 2008-09: PID is now stored in pid_t type, not int 2008-09: Timezone implementation and fixes 2008-09: Syslog support 2014-02: Shutdown improvement on Linux - Michal Kowalczuk 2007-12: Authentication and authorization - Liu Ming/BII group 2008-08: CONFIRM support fixes 2009-03: link state change detection added - Nghiem Nguyen/Orange FT group 2008-10: Client classification - Paul Schauer 2009-04: MacOSX port. 2011-04: MacOSX debugging/improvements. - Christopher Small 2009-05: Max OS X fixes. - Wojciech Guminski 2010-11: Windows/Linux compilation fixes - Aniela Mrugalska 2011-05: Relay compilation fix on Windows. - Tomasz Gierszewski 2011-07: NetBSD compilation fix. - Harro Haan 2011-10: fix alignment errors (ARMv5) - Mateusz Ozga 2011-11: Routing configuration - Christof Schulz (develop(at)kristov(dot)de> 2012-02: Fix for prefix delegation segfault - Mickael Marchand 2012-03: link-local client reservation, several fixes - Tao Cui 2013-01: interface-id shorter than 4 bytes are now handled ok - Grzegorz Pluto 200?-2012: reconfigure support - Jean-Jacques Sarton 2013-03: Patch for double free in file read error handling 2013-03: Patch for stop command not working on Linux 2013-04: Patch for socket descriptor == 0 in daemon mode - Vaclav Michalek 2013-03: Various WIN32 fixes 2013-03: gethostname for WIN32 2013-03: Inactive-mode for Win32 2013-04: OptFQDN improvements - George Joseph 2013-08: Fixed leases are now kept in the database (bug #291) 2013-08: Client segfault when incomplete/invalid AUTH info specified (bug #289) 2013-08: Log message fix (bug #292) - Patrick Pichon 2013-09: Fedora RPM script - Hernan Martinez 2013-10: Service dependency for Windows Vista and newer fix 2013-10: Script calling fix. 2013-11: Migration to Visual Studio 2013 2013-11: Fix for reconfigure-key 2013-12: Win32: detection of admin privileges 2014-02: Win32: Proper shutdown from Microsft Mgmt Console (bug #162) 2014-02: Vendor-spec info option with IPv6 address in it - Shine- (https://github.com/Shine-) 2014-06: Address renewals on WIN32 systems. - Maciek Fijalkowski 2014-06: Prefix scope added to the client parser. 2014-07: Prefix sanity checks on the client side. 2014-09: More thorough sanity checks for multiple IA_PDs on the client side. - Justin Cormack 2014-09: Added missing includes for NetBSD (and probably other BSDs) - John Davidge and Baodong (Robert) Li 2015-03: it is possible for the client to select an address to be used 2015-03: client's working directory can be selected with -w dir 2015-03: time calculation workarounds 2015-03: bind-to-address improvements - Etienne Buira 2015-07: Fix in IA_TA status code Dibbler uses poslib library to communicate with DNS servers (DNS Update mechanism). Poslib is written by Meilof Veeningen dibbler-1.0.1/SrvOptions/0000775000175000017500000000000012561700420012242 500000000000000dibbler-1.0.1/SrvOptions/SrvOptIA_NA.cpp0000664000175000017500000006145012561651572014736 00000000000000/* * Dibbler - a portable DHCPv6 * * authors: Tomasz Mrugalski * Marek Senderski * changes: Nguyen Vinh Nghiem * * released under GNU GPL v2 only licence */ #ifdef WIN32 #include #endif #ifdef LINUX #include #endif #include #include "SrvOptIA_NA.h" #include "SrvOptIAAddress.h" #include "OptStatusCode.h" #include "OptVendorData.h" #include "SrvCfgOptions.h" #include "Logger.h" #include "AddrClient.h" #include "DHCPConst.h" #include "Msg.h" #include "SrvAddrMgr.h" #include "SrvCfgMgr.h" using namespace std; /// @brief Creates an empty IA_NA (used for DECLINE and CONFIRM). /// /// @param IAID iaid value to be used. /// @param T1 T1 timer value to be used. /// @param T2 T2 timer value to be used. /// @param parent Pointer to parent message. TSrvOptIA_NA::TSrvOptIA_NA(long IAID, long T1, long T2, TMsg* parent) :TOptIA_NA(IAID, T1, T2, parent), Iface(parent->getIface()) { } /// @brief Creates an IA_NA with option status code. /// /// @param iaid iaid value to be used. /// @param t1 T1 timer value to be used. /// @param t2 T2 timer value to be used. /// @param code Status Code (to be set in status code option) /// @param text text to be used in status code option as description /// @param parent Pointer to parent message. TSrvOptIA_NA::TSrvOptIA_NA(long iaid, long t1, long t2, int code, const std::string& text, TMsg* parent) :TOptIA_NA(iaid, t1, t2, parent), Iface(parent->getIface()) { SubOptions.append(new TOptStatusCode(code, text, parent)); } /// @brief Create IA_NA option based on receive buffer. /// /// @param buf pointer to beginning of a buffer containing IA_NA (without type and option fields) /// @param bufsize length of the option (value or already parsed option-len) /// @param parent Pointer to parent message. TSrvOptIA_NA::TSrvOptIA_NA(char * buf, int bufsize, TMsg* parent) :TOptIA_NA(buf,bufsize, parent), Iface(parent->getIface()) { int pos=0; /// @todo: implement unpack() while (pos < bufsize) { int code=buf[pos]*256 + buf[pos+1]; pos += 2; int length=buf[pos]*256 + buf[pos+1]; pos += 2; if ((code > 0) && (code <= 24)) { if(allowOptInOpt(parent->getType(),OPTION_IA_NA,code)) { SPtr opt; opt = SPtr(); /* NULL */ switch (code) { case OPTION_IAADDR: opt = (Ptr*)SPtr (new TSrvOptIAAddress(buf+pos,length,this->Parent)); break; case OPTION_STATUS_CODE: opt = (Ptr*)SPtr (new TOptStatusCode(buf+pos,length,this->Parent)); break; default: Log(Warning) <<"Option " << code<< "not supported " <<" in message (type=" << parent->getType() <<") in this version of server." << LogEnd; break; } if((opt)&&(opt->isValid())) SubOptions.append(opt); } else { Log(Warning) << "Illegal option received (type=" << code << ") in an IA_NA option." << LogEnd; } } else { Log(Warning) << "Unknown option received (type=" << code << ") in an IA_NA option." << LogEnd; }; pos+=length; } } /// This constructor is used to create IA option as an aswer to a SOLICIT, SOLICIT (RAPID_COMMIT) or REQUEST. /// /// @param queryOpt /// @param queryMsg /// @param parent TSrvOptIA_NA::TSrvOptIA_NA(SPtr queryOpt, SPtr queryMsg, TMsg* parent) :TOptIA_NA(queryOpt->getIAID(), queryOpt->getT1(), queryOpt->getT2(), parent) { Iface = parent->getIface(); ClntAddr = queryMsg->getRemoteAddr(); ClntDuid = queryMsg->getClientDUID(); // true for advertise, false for everything else bool quiet = (parent->getType()==ADVERTISE_MSG); // --- LEASE ASSIGN STEP 3: check if client already has binding if (renew(queryOpt, false)) { Log(Info) << "Previous binding for client " << ClntDuid->getPlain() << ", IA(iaid=" << queryOpt->getIAID() << ") found and renewed." << LogEnd; return; } // --- LEASE ASSIGN STEP 4: Try to find fixed lease if (assignFixedLease(queryOpt, quiet)) { return; } // --- LEASE ASSIGN STEP 5: Count available addresses --- unsigned long leaseAssigned = SrvAddrMgr().getLeaseCount(ClntDuid); // already assigned unsigned long leaseMax = SrvCfgMgr().getIfaceByID(Iface)->getClntMaxLease(); // clnt-max-lease if (leaseAssigned >= leaseMax) { Log(Notice) << "Client got " << leaseAssigned << " lease(s) and requested 1 more, but limit for a client is " << leaseMax << LogEnd; stringstream tmp; tmp << "Sorry. You already have " << leaseAssigned << " lease(es) and you can't have more."; SubOptions.append(new TOptStatusCode(STATUSCODE_NOADDRSAVAIL, tmp.str(), parent)); return; } // --- LEASE ASSIGN STEP 6: Cached address? --- if (assignCachedAddr(quiet)) { return; } // --- LEASE ASSIGN STEP 7: client's hint --- if (assignRequestedAddr(queryMsg, queryOpt, quiet)) { return; } // --- LEASE ASSIGN STEP 8: get new random address -- if (assignRandomAddr(queryMsg, quiet)) { return; } SubOptions.append(new TOptStatusCode(STATUSCODE_NOADDRSAVAIL, "No more addresses for you. Sorry.", Parent)); } bool TSrvOptIA_NA::assignRequestedAddr(SPtr queryMsg, SPtr queryOpt, bool quiet) { SPtr opt; SPtr hint, candidate; SPtr optAddr; SPtr ptrClass; queryOpt->firstOption(); while ( opt = queryOpt->getOption() ) { switch ( opt->getOptType() ) { case OPTION_IAADDR: { optAddr = (Ptr*) opt; hint = optAddr->getAddr(); if (SrvCfgMgr().addrReserved(hint)) { Log(Debug) << "Requested address " << hint->getPlain() << " is reserved for someone else, sorry." << LogEnd; return false; } if (candidate = getAddressHint(queryMsg, hint)) { if (assignAddr(candidate, optAddr->getPref(), optAddr->getValid(), quiet)) return true; } continue; } default: continue; } } return false; } /// @brief Tries to get cached address for this client. /// /// This method may delete entry from cache if it finds out that entry is used by someone else /// or is no longer valid (i.e. updated config has different pool definitions). /// That is step 6 of lease assignment policy. /// /// @param quiet should the assignment messages be logged (it shouldn't for solicit) /// /// @return true, if address was assigned bool TSrvOptIA_NA::assignCachedAddr(bool quiet) { SPtr candidate; if (candidate = SrvAddrMgr().getCachedEntry(ClntDuid, IATYPE_IA)) { SPtr pool = SrvCfgMgr().getClassByAddr(Iface, candidate); if (pool) { Log(Info) << "Cache: Cached address " << *candidate << " found. Welcome back." << LogEnd; if (SrvAddrMgr().addrIsFree(candidate) && !SrvCfgMgr().addrReserved(candidate)) { if (assignAddr(candidate, pool->getPref(), pool->getValid(), quiet)) return true; // WTF? Address is free, buy we can't assign it? Log(Error) << "Failed to assign cached address that seems unused. Strange." << LogEnd; return false; } Log(Info) << "Unfortunately, " << candidate->getPlain() << " is already used or reserved." << LogEnd; SrvAddrMgr().delCachedEntry(candidate, IATYPE_IA); return false; } else { Log(Warning) << "Cache: Cached address " << *candidate << " found, but it is no longer valid." << LogEnd; SrvAddrMgr().delCachedEntry(candidate, IATYPE_IA); return false; }// else } return false; } /// @brief Tries to assign fixed (reserved) lease. /// /// @param req client's IA_NA (used for trying to assign as close T1,T2,pref,valid values as possible) /// /// @return true, if assignment was successful, false if there are no fixed-leases reserved bool TSrvOptIA_NA::assignFixedLease(SPtr req, bool quiet) { // is there any specific address reserved for this client? (exception mechanism) SPtr reservedAddr = getExceptionAddr(); if (!reservedAddr) { // there's no reserved address for this pal return false; } // we've got fixed address, yay! Let's try to calculate its preferred and valid lifetimes SPtr iface = SrvCfgMgr().getIfaceByID(Iface); if (!iface) { // this should never happen Log(Error) << "Unable to find interface with ifindex=" << Iface << " in SrvCfgMgr." << LogEnd; return false; } // if the lease is not within normal range, treat it as fixed, infinite one uint32_t pref = DHCPV6_INFINITY; uint32_t valid = DHCPV6_INFINITY; SPtr hint = (Ptr*) req->getOption(OPTION_IAADDR); if (hint) { pref = hint->getPref(); valid = hint->getValid(); } SPtr pool; iface->firstAddrClass(); while (pool = iface->getAddrClass()) { // This is not the pool you are looking for. if (!pool->addrInPool(reservedAddr)) continue; T1_ = pool->getT1(req->getT1()); T2_ = pool->getT2(req->getT2()); pref = pool->getPref(pref); valid = pool->getValid(valid); Log(Info) << "Reserved in-pool address " << reservedAddr->getPlain() << " for this client found, assigning." << LogEnd; SPtr optAddr = new TSrvOptIAAddress(reservedAddr, pref, valid, Parent); SubOptions.append(optAddr); SubOptions.append(new TOptStatusCode(STATUSCODE_SUCCESS,"Assigned fixed address.", Parent)); SrvAddrMgr().addClntAddr(ClntDuid, ClntAddr, Iface, IAID_, T1_, T2_, reservedAddr, pref, valid, quiet); SrvCfgMgr().addClntAddr(this->Iface, reservedAddr); return true; } // This address does not belong to any pool. Assign it anyway T1_ = iface->getT1(req->getT1()); T2_ = iface->getT2(req->getT2()); pref = iface->getPref(pref); valid = iface->getValid(valid); Log(Info) << "Reserved out-of-pool address " << reservedAddr->getPlain() << " for this client found, assigning." << LogEnd; SPtr optAddr = new TSrvOptIAAddress(reservedAddr, pref, valid, Parent); SubOptions.append(optAddr); SubOptions.append(new TOptStatusCode(STATUSCODE_SUCCESS,"Assigned fixed address.", Parent)); SrvAddrMgr().addClntAddr(ClntDuid, ClntAddr, Iface, IAID_, T1_, T2_, reservedAddr, pref, valid, quiet); SrvCfgMgr().addClntAddr(this->Iface, reservedAddr); return true; } void TSrvOptIA_NA::releaseAllAddrs(bool quiet) { SPtr opt; SPtr addr; SPtr optAddr; this->firstOption(); while ( opt = this->getOption() ) { if (opt->getOptType() != OPTION_IAADDR) continue; optAddr = (Ptr*) opt; addr = optAddr->getAddr(); SrvAddrMgr().delClntAddr(this->ClntDuid, IAID_, addr, quiet); SrvCfgMgr().delClntAddr(this->Iface, addr); } } bool TSrvOptIA_NA::assignAddr(SPtr addr, uint32_t pref, uint32_t valid, bool quiet) { // Try to find a class this address belongs to. SPtr ptrClass = SrvCfgMgr().getClassByAddr(Iface, addr); if (ptrClass) { // Found! This is in-pool assignment. pref = ptrClass->getPref(pref); valid = ptrClass->getValid(valid); // configure this IA T1_ = ptrClass->getT1(T1_); T2_ = ptrClass->getT2(T2_); } else { // Class not found. This is out-of-pool assignment. The address does not belong // to any specified pool, so we need to pick the values from the interface, rather // than the pool. SPtr iface = SrvCfgMgr().getIfaceByID(Iface); if (!iface) { return false; } pref = iface->getPref(pref); valid = iface->getValid(valid); T1_ = iface->getT1(T1_); T2_ = iface->getT2(T2_); } SPtr optAddr = new TSrvOptIAAddress(addr, pref, valid, this->Parent); /// @todo: remove get addr-params if (ptrClass && ptrClass->getAddrParams()) { Log(Debug) << "Experimental: addr-params subotion added." << LogEnd; optAddr->addOption((Ptr*)ptrClass->getAddrParams()); } SubOptions.append((Ptr*)optAddr); SubOptions.append(new TOptStatusCode(STATUSCODE_SUCCESS, "Assigned an address.", Parent)); Log(Info) << "Client " << ClntDuid->getPlain() << " got " << *addr << " (IAID=" << IAID_ << ", pref=" << pref << ",valid=" << valid << ")." << LogEnd; // register this address as used by this client SrvAddrMgr().addClntAddr(ClntDuid, ClntAddr, Iface, IAID_, T1_, T2_, addr, pref, valid, quiet); SrvCfgMgr().addClntAddr(this->Iface, addr); return true; } /// @brief tries to find address reserved for this particular client /// /// @return fixed address (if found) SPtr TSrvOptIA_NA::getExceptionAddr() { SPtr ptrIface=SrvCfgMgr().getIfaceByID(Iface); if (!ptrIface) { return SPtr(); } SPtr ex = ptrIface->getClientException(ClntDuid, Parent, false /* false = verbose */); if (ex) return ex->getAddr(); return SPtr(); } // constructor used only in RENEW, REBIND, DECLINE and RELEASE TSrvOptIA_NA::TSrvOptIA_NA(SPtr queryOpt, SPtr clntAddr, SPtr clntDuid, int iface, unsigned long &addrCount, int msgType , TMsg* parent) :TOptIA_NA(queryOpt->getIAID(),0x7fffffff,0x7fffffff, parent) { ClntDuid = clntDuid; ClntAddr = clntAddr; Iface = iface; IAID_ = queryOpt->getIAID(); switch (msgType) { case SOLICIT_MSG: //this->solicit(cfgMgr, addrMgr, queryOpt, clntAddr, clntDUID,iface, addrCount); break; case REQUEST_MSG: //this->request(cfgMgr, addrMgr, queryOpt, clntAddr, clntDUID, iface, addrCount); break; case RENEW_MSG: this->renew(queryOpt, true); break; case REBIND_MSG: this->rebind(queryOpt, addrCount); break; case RELEASE_MSG: this->release(queryOpt, addrCount); break; case DECLINE_MSG: this->decline(queryOpt, addrCount); break; default: { Log(Warning) << "Unknown message type (" << msgType << "). Cannot generate OPTION_IA_NA."<< LogEnd; SubOptions.append(new TOptStatusCode(STATUSCODE_UNSPECFAIL, "Unknown message type.",this->Parent)); break; } } } /** * generates OPTION_IA_NA based on OPTION_IA_NA received in RENEW message * * @param queryOpt IA_NA option received from client in the RENEW message * @param complainIfMissing specifies if potential warnings should be printed or not * * @return true - if binding was renewed, false - if not found or invalid */ bool TSrvOptIA_NA::renew(SPtr queryOpt, bool complainIfMissing) { // find that client in addrdb SPtr ptrClient; ptrClient = SrvAddrMgr().getClient(this->ClntDuid); if (!ptrClient) { if (complainIfMissing) { SubOptions.append(new TOptStatusCode(STATUSCODE_NOBINDING,"Who are you? Do I know you?", this->Parent)); Log(Info) << "Unable to RENEW binding for IA(iaid=" << queryOpt->getIAID() << ", client=" << ClntDuid->getPlain() << ": No such client." << LogEnd; } return false; } // find that IA SPtr ptrIA; ptrIA = ptrClient->getIA(IAID_); if (!ptrIA) { if (complainIfMissing) { SubOptions.append(new TOptStatusCode(STATUSCODE_NOBINDING,"I see this IAID first time.", this->Parent )); Log(Info) << "Unable to RENEW binding for IA(iaid=" << queryOpt->getIAID() << ", client=" << ClntDuid->getPlain() << ": No such IA." << LogEnd; } return false; } // everything seems ok, update data in addrdb ptrIA->setTimestamp(); T1_ = ptrIA->getT1(); T2_ = ptrIA->getT2(); // send addr info to client SPtr ptrAddr; ptrIA->firstAddr(); while ( ptrAddr = ptrIA->getAddr() ) { SPtr optAddr; ptrAddr->setTimestamp(); optAddr = new TSrvOptIAAddress(ptrAddr->get(), ptrAddr->getPref(),ptrAddr->getValid(), this->Parent); SubOptions.append( (Ptr*)optAddr ); } // finally send greetings and happy OK status code SPtr ptrStatus; ptrStatus = new TOptStatusCode(STATUSCODE_SUCCESS,"Address(es) renewed. Greetings from planet Earth",this->Parent); SubOptions.append( (Ptr*)ptrStatus ); return true; } void TSrvOptIA_NA::rebind(SPtr queryOpt, unsigned long &addrCount) { // find that client in addrdb SPtr ptrClient = SrvAddrMgr().getClient(this->ClntDuid); if (!ptrClient) { // hmmm, that's not our client SubOptions.append(new TOptStatusCode(STATUSCODE_NOBINDING, "Who are you? Do I know you?",this->Parent )); return; } // find that IA SPtr ptrIA; ptrIA = ptrClient->getIA(IAID_); if (!ptrIA) { SubOptions.append(new TOptStatusCode(STATUSCODE_NOBINDING, "I see this IAID first time.",this->Parent )); return; } /// @todo: 18.2.4 par. 3 (check if addrs are appropriate for this link) // everything seems ok, update data in addrdb ptrIA->setTimestamp(); T1_ = ptrIA->getT1(); T2_ = ptrIA->getT2(); // send addr info to client SPtr ptrAddr; ptrIA->firstAddr(); while ( ptrAddr = ptrIA->getAddr() ) { SPtr optAddr; optAddr = new TSrvOptIAAddress(ptrAddr->get(), ptrAddr->getPref(), ptrAddr->getValid(),this->Parent); SubOptions.append( (Ptr*)optAddr ); } // finally send greetings and happy OK status code SPtr ptrStatus; ptrStatus = new TOptStatusCode(STATUSCODE_SUCCESS,"Greetings from planet Earth", this->Parent); SubOptions.append( (Ptr*)ptrStatus ); } void TSrvOptIA_NA::release(SPtr queryOpt, unsigned long &addrCount) { } void TSrvOptIA_NA::decline(SPtr queryOpt, unsigned long &addrCount) { } bool TSrvOptIA_NA::doDuties() { return true; } /// @brief Checks if address is sane and assignable. /// /// Verifies that requested address is sane (i.e. no anyaddr, not link-local, /// not multicast etc.) and that it is within supported pool /// /// @param clientReq /// @param hint /// /// @return true if it is sane and assignable SPtr TSrvOptIA_NA::getAddressHint(SPtr clientReq, SPtr hint) { SPtr ptrIface; SPtr addr; ptrIface = SrvCfgMgr().getIfaceByID(this->Iface); if (!ptrIface) { Log(Error) << "Trying to find free address on non-existent interface (id=%d)\n" << Iface << LogEnd; return SPtr(); // NULL } // check if this address is ok // is it anyaddress (::)? SPtr anyaddr = new TIPv6Addr(); if (*anyaddr==*hint) { Log(Debug) << "Client requested unspecified (" << *hint << ") address. Hint ignored." << LogEnd; return SPtr(); // NULL } // is it multicast address (ff...)? if ((*(hint->getAddr()))==0xff) { Log(Debug) << "Client requested multicast (" << *hint << ") address. Hint ignored." << LogEnd; return SPtr(); // NULL } // is it link-local address (fe80::...)? char linklocal[]={0xfe, 0x80}; if (!memcmp(hint->getAddr(),linklocal,2)) { Log(Debug) << "Client requested link-local (" << *hint << ") address. Hint ignored." << LogEnd; return SPtr(); // NULL } SPtr ptrClass; ptrClass = SrvCfgMgr().getClassByAddr(this->Iface, hint); if (!ptrClass) return SPtr(); // NULL if ( !ptrClass->clntSupported(ClntDuid, ClntAddr, clientReq) ) return SPtr(); // NULL // If the Class is valid and support the Client (based on duid, addr, clientclass) // best case: address belongs to supported class, and is free if ( SrvAddrMgr().addrIsFree(hint) ) { Log(Debug) << "Requested address (" << *hint << ") is free, great!" << LogEnd; return hint; } // medium case: addess belongs to supported class, but is used // however the class pool is still free unsigned long assignedCnt = ptrClass->getAssignedCount(); unsigned long classMaxLease = ptrClass->getClassMaxLease(); if (assignedCnt >=classMaxLease) { Log(Debug) << "Requested address (" << *hint << ") belongs to supported class, which has reached its limit (" << assignedCnt << " assigned, " << classMaxLease << " max lease)." << LogEnd; // this class is useless } else { Log(Debug) << "Requested address (" << *hint << ") belongs to supported class, but is used." << LogEnd; do { addr = ptrClass->getRandomAddr(); } while (!SrvAddrMgr().addrIsFree(addr)); return addr; } return SPtr(); // NULL } bool TSrvOptIA_NA::assignRandomAddr(SPtr queryMsg, bool quiet) { // worst case: address does not belong to supported class // or specified hint is invalid (or there was no hint at all) SPtr candidate; SPtr iface = SrvCfgMgr().getIfaceByID(Iface); if (!iface) { Log(Error) << "Failed to find interface with ifindex=" << Iface << LogEnd; return false; } SPtr pool = iface->getRandomClass(ClntDuid, ClntAddr); if (!pool) { Log(Warning) << "Unable to find any suitable (allowed, non-full) class for this client." << LogEnd; return 0; } if (pool->clntSupported(ClntDuid, ClntAddr, queryMsg) && pool->getAssignedCount() < pool->getClassMaxLease() ) { int safety = 0; while (safety < SERVER_MAX_IA_RANDOM_TRIES) { candidate = pool->getRandomAddr(); if (SrvAddrMgr().addrIsFree(candidate) && !SrvCfgMgr().addrReserved(candidate)) break; safety++; } if (safety < SERVER_MAX_IA_RANDOM_TRIES) { return assignAddr(candidate, pool->getPref(), pool->getValid(), quiet); } else { Log(Error) << "Unable to randomly choose address after " << SERVER_MAX_IA_RANDOM_TRIES << " tries." << LogEnd; return false; } } return false; } bool TSrvOptIA_NA::assignSequentialAddr(SPtr clientMsg, bool quiet) { // Random pool failed. That really should not happen. We are most probably not supporting // this client or are completely out of leases. Last chance: iterate over all pools and // find suitable lease: SPtr ptrIface=SrvCfgMgr().getIfaceByID(Iface); if (!ptrIface) { return 0; } SPtr pool; ptrIface->firstAddrClass(); while (pool = ptrIface->getAddrClass()) { if (!pool->clntSupported(ClntDuid, ClntAddr, clientMsg)) continue; if (pool->getAssignedCount() >= pool->getClassMaxLease()) continue; break; SPtr candidate = pool->getFirstAddr(); for (candidate = pool->getFirstAddr(); candidate != pool->getLastAddr(); ++(*candidate)) { if (!SrvAddrMgr().addrIsFree(candidate)) continue; if (assignAddr(candidate, pool->getPref(), pool->getValid(), quiet)) return true; } } // That is definite failure. I have iterated over every address in every pool // and all of them are not usable for one reason or ther other. I finally // give up. return false; } dibbler-1.0.1/SrvOptions/SrvOptIAPrefix.h0000664000175000017500000000075212233256142015167 00000000000000/* * Dibbler - a portable DHCPv6 * * author T Krzysztof Wnuk * * */ #ifndef SRVOPTIAPREFIX_H #define SRVOPTIAPREFIX_H #include "SmartPtr.h" #include "Container.h" #include "OptIAPrefix.h" class TSrvOptIAPrefix : public TOptIAPrefix { public: TSrvOptIAPrefix( char * addr, int n, TMsg* parent); TSrvOptIAPrefix(SPtr prefix,char length, unsigned long pref, unsigned long valid, TMsg* parent); bool doDuties(); }; #endif dibbler-1.0.1/SrvOptions/SrvOptIA_NA.h0000644000175000017500000000413012277722750014372 00000000000000/* * Dibbler - a portable DHCPv6 * * authors: Tomasz Mrugalski * Marek Senderski * * released under GNU GPL v2 only licence * */ class TSrvOptIA_NA; #ifndef SRVOPTIA_NA_H #define SRVOPTIA_NA_H #include "OptIA_NA.h" #include "SrvOptIAAddress.h" #include "SmartPtr.h" #include "DUID.h" #include "Container.h" #include "IPv6Addr.h" #include "SrvMsg.h" class TSrvOptIA_NA : public TOptIA_NA { public: TSrvOptIA_NA(SPtr queryOpt, SPtr clntAddr, SPtr duid, int iface, unsigned long &addrCount, int msgType , TMsg* parent); TSrvOptIA_NA(char * buf, int bufsize, TMsg* parent); TSrvOptIA_NA(long IAID, long T1, long T2, TMsg* parent); TSrvOptIA_NA(long IAID, long T1, long T2, int Code, const std::string& Msg, TMsg* parent); TSrvOptIA_NA(SPtr queryOpt, SPtr queryMsg, TMsg* parent); void releaseAllAddrs(bool quiet); void solicit(SPtr queryOpt, unsigned long &addrCount); void request(SPtr queryOpt, unsigned long &addrCount); bool renew(SPtr queryOpt, bool complainIfMissing); void rebind(SPtr queryOpt, unsigned long &addrCount); void release(SPtr queryOpt, unsigned long &addrCount); void decline(SPtr queryOpt, unsigned long &addrCount); bool doDuties(); private: bool assignCachedAddr(bool quiet); bool assignRequestedAddr(SPtr queryMsg, SPtr queryOpt, bool quiet); bool assignSequentialAddr(SPtr clientMsg, bool quiet); bool assignRandomAddr(SPtr queryMsg, bool quiet); SPtr getAddressHint(SPtr clientReq, SPtr hint); bool assignAddr(SPtr addr, uint32_t pref, uint32_t valid, bool quiet); bool assignFixedLease(SPtr req, bool quiet); SPtr ClntAddr; SPtr ClntDuid; int Iface; SPtr getFreeAddr(SPtr hint); SPtr getExceptionAddr(); }; #endif dibbler-1.0.1/SrvOptions/SrvOptFQDN.cpp0000664000175000017500000000074412233256142014604 00000000000000/* * Dibbler - a portable DHCPv6 * * authors: Tomasz Mrugalski * Marek Senderski * * released under GNU GPL v2 only licence * */ #include "SrvOptFQDN.h" TSrvOptFQDN::TSrvOptFQDN(const std::string& fqdn, TMsg* parent) :TOptFQDN(fqdn, parent) { this->setNFlag(false); } TSrvOptFQDN::TSrvOptFQDN(char *buf, int bufsize, TMsg* parent) :TOptFQDN(buf, bufsize, parent) { } bool TSrvOptFQDN::doDuties() { return true; } dibbler-1.0.1/SrvOptions/SrvOptAddrParams.h0000664000175000017500000000104412233256142015531 00000000000000/* * Dibbler - a portable DHCPv6 * * authors: Tomasz Mrugalski * * released under GNU GPL v2 only licence * * $Id: SrvOptAddrParams.h,v 1.3 2008-08-29 00:07:35 thomson Exp $ * */ #ifndef SRVOPTADDRPARAMS_H #define SRVOPTADDRPARAMS_H #include "OptInteger.h" class TSrvOptAddrParams : public TOptInteger { public: TSrvOptAddrParams(int prefix, int bitfield, TMsg * parent); TSrvOptAddrParams(char * buf, int n, TMsg* parent); int getPrefix(); int getBitfield(); bool doDuties(); }; #endif dibbler-1.0.1/SrvOptions/SrvOptInterfaceID.cpp0000644000175000017500000000217412277722750016201 00000000000000/* * Dibbler - a portable DHCPv6 * * authors: Tomasz Mrugalski * Marek Senderski * * released under GNU GPL v2 only licence * * $Id: SrvOptInterfaceID.cpp,v 1.7 2009-03-09 22:45:58 thomson Exp $ * */ #include "SrvOptInterfaceID.h" #include "DHCPConst.h" #include #ifdef WIN32 #include #else #include #endif /** * compares two interface-ids * * @param other * * @return true, if both interface-IDs are the same */ bool TSrvOptInterfaceID::operator==(const TSrvOptInterfaceID &other) const { if (DataLen != other.DataLen) return false; if (!memcmp(Data, other.Data, DataLen)) return true; return false; } /// @todo: not endian-safe! TSrvOptInterfaceID::TSrvOptInterfaceID(int id, TMsg * parent) :TOptGeneric(OPTION_INTERFACE_ID, (char*)&id, sizeof(int), parent) { int tmp = htonl(id); memmove(Data, &tmp, sizeof(int)); } TSrvOptInterfaceID::TSrvOptInterfaceID(const char * buf, int n, TMsg* parent) :TOptGeneric(OPTION_INTERFACE_ID, buf,n, parent) { } bool TSrvOptInterfaceID::doDuties() { return true; } dibbler-1.0.1/SrvOptions/SrvOptInterfaceID.h0000644000175000017500000000106012277722750015637 00000000000000/* * Dibbler - a portable DHCPv6 * * authors: Tomasz Mrugalski * Marek Senderski * * released under GNU GPL v2 only licence * */ #ifndef SRVOPTIONINTERFACEID_H #define SRVOPTIONINTERFACEID_H #include "OptGeneric.h" class TSrvOptInterfaceID : public TOptGeneric { public: bool operator==(const TSrvOptInterfaceID &other) const; TSrvOptInterfaceID(int id, TMsg * parent); TSrvOptInterfaceID(const char * buf, int n, TMsg* parent); bool doDuties(); }; #endif /* OPTIONINTERFACEID_H */ dibbler-1.0.1/SrvOptions/SrvOptTA.cpp0000664000175000017500000001674212560471634014375 00000000000000/* * Dibbler - a portable DHCPv6 * * authors: Tomasz Mrugalski * * released under GNU GPL v2 only licence * */ #include "SrvOptTA.h" #include "SrvOptIAAddress.h" #include "OptStatusCode.h" #include "Logger.h" #include "AddrClient.h" #include "DHCPConst.h" using namespace std; /* * Create IA_TA option based on receive buffer */ TSrvOptTA::TSrvOptTA( char * buf, int bufsize, TMsg* parent) :TOptTA(buf,bufsize, parent), OrgMessage(parent->getType()) { Iface = parent->getIface(); int pos=0; while(pos opt; switch (code) { case OPTION_IAADDR: opt = (Ptr*) SPtr(new TSrvOptIAAddress(buf+pos,length,this->Parent)); SubOptions.append(opt); break; case OPTION_STATUS_CODE: opt = (Ptr*) SPtr(new TOptStatusCode(buf+pos,length,this->Parent)); SubOptions.append(opt); break; default: Log(Warning) <<"Option " << code << "not supported " <<" in message (type=" << parent->getType() <<") in this version of server." << LogEnd; break; } pos+=length; } } /* * Constructor used in aswers to: * - SOLICIT * - SOLICIT (with RAPID_COMMIT) * - REQUEST */ TSrvOptTA::TSrvOptTA(SPtr queryOpt, SPtr clientMsg, int msgType, TMsg* parent) :TOptTA(queryOpt->getIAID(), parent) { ClntDuid = clientMsg->getClientDUID(); ClntAddr = clientMsg->getRemoteAddr(); Iface = clientMsg->getIface(); this->OrgMessage = msgType; switch (msgType) { case SOLICIT_MSG: this->solicit(clientMsg, queryOpt); break; case REQUEST_MSG: this->request(clientMsg, queryOpt); break; case RELEASE_MSG: this->release(queryOpt); break; case CONFIRM_MSG: this->confirm(queryOpt); break; default: Log(Warning) << "Option TA in not supported in message " << MsgTypeToString(msgType) << "." << LogEnd; return; } } TSrvOptTA::TSrvOptTA(int iaid, int statusCode, std::string txt, TMsg* parent) :TOptTA(iaid, parent), OrgMessage(parent->getType()) { Iface = parent->getIface(); SubOptions.append(new TOptStatusCode(statusCode, txt, parent)); } /// @brief constructor used in SOLICIT message (and others) /// /// @param clientMsg client message that we are currently responding to /// @param queryOpt specific IA_TA option we are trying to answer now void TSrvOptTA::solicit(SPtr clientMsg, SPtr queryOpt) { solicitRequest(clientMsg, queryOpt, true); } void TSrvOptTA::solicitRequest(SPtr clientMsg, SPtr queryOpt, bool solicit) { // --- check address counts, how many we've got, how many assigned etc. --- unsigned long addrsAssigned = 0; // already assigned unsigned long addrsAvail = 0; // how many are allowed for client? unsigned long addrsMax = 0; // clnt-max-lease unsigned long willAssign = 1; // how many will be assigned? Just 1. addrsAssigned = SrvAddrMgr().getLeaseCount(this->ClntDuid); addrsAvail = SrvCfgMgr().countAvailAddrs(this->ClntDuid, this->ClntAddr, this->Iface); addrsMax = SrvCfgMgr().getIfaceByID(this->Iface)->getClntMaxLease(); if (willAssign > addrsMax - addrsAssigned) { Log(Notice) << "Client got " << addrsAssigned << " and requested " << willAssign << " more, but limit for a client is " << addrsMax << LogEnd; willAssign = addrsMax - addrsAssigned; } if (willAssign > addrsAvail) { Log(Notice) << willAssign << " addrs " << (solicit?"would":"will") << " be assigned, but only" << addrsAssigned << " is available." << LogEnd; willAssign = addrsAvail; } Log(Info) << "Client has " << addrsAssigned << " addrs, " << addrsAvail << " is available, limit for client is " << addrsMax << ", " << willAssign << " will be assigned." << LogEnd; if (!willAssign) { SubOptions.append(new TOptStatusCode(STATUSCODE_NOADDRSAVAIL, "Sorry, buddy. No temporary addresses for you", Parent) ); Log(Warning) << "No temporary addresses were assigned in TA (iaid="<< IAID_ << ")." << LogEnd; return; } // --- ok, let's assign those damn addresses --- SPtr optAddr; optAddr = this->assignAddr(clientMsg); if (!optAddr) { Log(Error) << "No temporary address found. Server is NOT configured with TA option." << LogEnd; SPtr ptrStatus; ptrStatus = new TOptStatusCode(STATUSCODE_NOADDRSAVAIL, "Server support for temporary addresses is not enabled. Sorry buddy.",this->Parent); this->SubOptions.append((Ptr*)ptrStatus); return; } SubOptions.append((Ptr*) optAddr); // those addresses will be released in the TSrvMsgAdvertise::answer() method } void TSrvOptTA::request(SPtr clientMsg, SPtr queryOpt) { solicitRequest(clientMsg, queryOpt, false); } void TSrvOptTA::release(SPtr queryOpt) { Log(Crit) << "### Implement this: TA in RELEASE msg." << LogEnd; } void TSrvOptTA::confirm(SPtr queryOpt) { Log(Crit) << "### Implement this: TA in CONFIRM msg." << LogEnd; } void TSrvOptTA::releaseAllAddrs(bool quiet) { SPtr opt; SPtr addr; SPtr optAddr; this->firstOption(); while ( opt = this->getOption() ) { if (opt->getOptType() != OPTION_IAADDR) continue; optAddr = (Ptr*) opt; addr = optAddr->getAddr(); SrvAddrMgr().delClntAddr(ClntDuid, IAID_, addr, quiet); SrvCfgMgr().delClntAddr(Iface, addr); } } /// this method finds a temp. address for this client, marks it as used and then /// creates IAAADDR option containing this option. /// /// @param clientMsg /// /// @return IAADDR option with new temporary address (or NULL) SPtr TSrvOptTA::assignAddr(SPtr clientMsg) { SPtr ptrIface; ptrIface = SrvCfgMgr().getIfaceByID(this->Iface); if (!ptrIface) { Log(Error) << "Trying to find free address on non-existent interface (id=%d)\n" << this->Iface << LogEnd; return SPtr(); // NULL } SPtr ta; ptrIface->firstTA(); while ( ta = ptrIface->getTA()) { if (!ta->clntSupported(ClntDuid, ClntAddr, clientMsg )) continue; break; } if (!ta) { Log(Warning) << "Unable to find any suitable (allowed,non-full) TA for this client." << LogEnd; return SPtr(); // NULL } SPtr addr; int safety=0; while (safety < SERVER_MAX_TA_RANDOM_TRIES) { addr = ta->getRandomAddr(); if (SrvAddrMgr().taAddrIsFree(addr)) { if ((this->OrgMessage == REQUEST_MSG)) { Log(Debug) << "Temporary address " << addr->getPlain() << " granted." << LogEnd; SrvAddrMgr().addTAAddr(this->ClntDuid, this->ClntAddr, this->Iface, IAID_, addr, ta->getPref(), ta->getValid()); SrvCfgMgr().addTAAddr(this->Iface); } else { Log(Debug) << "Temporary address " << addr->getPlain() << " generated (not granted)." << LogEnd; } return new TSrvOptIAAddress(addr, ta->getPref(), ta->getValid(), this->Parent); } safety++; } Log(Error) << "Unable to randomly choose address after " << SERVER_MAX_TA_RANDOM_TRIES << " tries." << LogEnd; return SPtr(); // NULL } bool TSrvOptTA::doDuties() { return true; } dibbler-1.0.1/SrvOptions/Makefile.am0000644000175000017500000000477012277722750014242 00000000000000noinst_LIBRARIES = libSrvOptions.a libSrvOptions_a_CPPFLAGS = -I$(top_srcdir)/Misc -I$(top_srcdir)/Options -I$(top_srcdir)/SrvMessages libSrvOptions_a_CPPFLAGS += -I$(top_srcdir)/Messages -I$(top_srcdir)/SrvIfaceMgr -I$(top_srcdir)/IfaceMgr libSrvOptions_a_CPPFLAGS += -I$(top_srcdir)/SrvCfgMgr -I$(top_srcdir)/CfgMgr -I$(top_srcdir)/SrvAddrMgr libSrvOptions_a_CPPFLAGS += -I$(top_srcdir)/AddrMgr -I$(top_srcdir)/SrvTransMgr #libSrvOptions_a_SOURCES = SrvOptAAAAuthentication.cpp SrvOptAAAAuthentication.h libSrvOptions_a_SOURCES = SrvOptAddrParams.cpp SrvOptAddrParams.h #libSrvOptions_a_SOURCES += SrvOptAuthentication.cpp SrvOptAuthentication.h #libSrvOptions_a_SOURCES += SrvOptClientIdentifier.cpp SrvOptClientIdentifier.h #libSrvOptions_a_SOURCES += SrvOptDNSServers.cpp SrvOptDNSServers.h #libSrvOptions_a_SOURCES += SrvOptDomainName.cpp SrvOptDomainName.h #libSrvOptions_a_SOURCES += SrvOptEcho.cpp SrvOptEcho.h #libSrvOptions_a_SOURCES += SrvOptElapsed.cpp SrvOptElapsed.h libSrvOptions_a_SOURCES += SrvOptFQDN.cpp SrvOptFQDN.h libSrvOptions_a_SOURCES += SrvOptIAAddress.cpp SrvOptIAAddress.h libSrvOptions_a_SOURCES += SrvOptIA_NA.cpp SrvOptIA_NA.h libSrvOptions_a_SOURCES += SrvOptIA_PD.cpp SrvOptIA_PD.h libSrvOptions_a_SOURCES += SrvOptIAPrefix.cpp SrvOptIAPrefix.h libSrvOptions_a_SOURCES += SrvOptInterfaceID.cpp SrvOptInterfaceID.h #libSrvOptions_a_SOURCES += SrvOptKeyGeneration.cpp SrvOptKeyGeneration.h #libSrvOptions_a_SOURCES += SrvOptLifetime.cpp SrvOptLifetime.h libSrvOptions_a_SOURCES += SrvOptLQ.cpp SrvOptLQ.h #libSrvOptions_a_SOURCES += SrvOptNISDomain.cpp SrvOptNISDomain.h #libSrvOptions_a_SOURCES += SrvOptNISPDomain.cpp SrvOptNISPDomain.h #libSrvOptions_a_SOURCES += SrvOptNISPServer.cpp SrvOptNISPServer.h #libSrvOptions_a_SOURCES += SrvOptNISServer.cpp SrvOptNISServer.h #libSrvOptions_a_SOURCES += SrvOptNTPServers.cpp SrvOptNTPServers.h #libSrvOptions_a_SOURCES += SrvOptOptionRequest.cpp SrvOptOptionRequest.h #libSrvOptions_a_SOURCES += SrvOptPreference.cpp SrvOptPreference.h #libSrvOptions_a_SOURCES += SrvOptServerIdentifier.cpp SrvOptServerIdentifier.h #libSrvOptions_a_SOURCES += SrvOptServerUnicast.cpp SrvOptServerUnicast.h #libSrvOptions_a_SOURCES += SrvOptSIPDomain.cpp SrvOptSIPDomain.h #libSrvOptions_a_SOURCES += SrvOptSIPServer.cpp SrvOptSIPServer.h #libSrvOptions_a_SOURCES += SrvOptStatusCode.cpp SrvOptStatusCode.h libSrvOptions_a_SOURCES += SrvOptTA.cpp SrvOptTA.h #libSrvOptions_a_SOURCES += SrvOptTimeZone.cpp SrvOptTimeZone.h #libSrvOptions_a_SOURCES += SrvOptUserClass.cpp SrvOptUserClass.h dibbler-1.0.1/SrvOptions/SrvOptAddrParams.cpp0000664000175000017500000000154612233256142016073 00000000000000/* * Dibbler - a portable DHCPv6 * * authors: Tomasz Mrugalski * * released under GNU GPL v2 only licence * * $Id: SrvOptAddrParams.cpp,v 1.3 2008-08-29 00:07:35 thomson Exp $ * */ #include "SrvOptAddrParams.h" #include "DHCPConst.h" TSrvOptAddrParams::TSrvOptAddrParams(int prefix, int bitfield, TMsg * parent) :TOptInteger(OPTION_ADDRPARAMS, 2, 0, parent) { if (prefix>128) prefix = 128; if (prefix<0) prefix = 0; int value = (prefix << 8) + (bitfield & 0xff); Value = value; } TSrvOptAddrParams::TSrvOptAddrParams(char * buf, int n, TMsg* parent) :TOptInteger(OPTION_ADDRPARAMS, 2, buf, n, parent) { } int TSrvOptAddrParams::getPrefix() { return (Value >> 8) & 0xff; } int TSrvOptAddrParams::getBitfield() { return Value & 0xff; } bool TSrvOptAddrParams::doDuties() { return true; } dibbler-1.0.1/SrvOptions/SrvOptIA_PD.cpp0000664000175000017500000005747412561651501014746 00000000000000/* * Dibbler - a portable DHCPv6 * * authors: Tomasz Mrugalski * Marek Senderski * changes: Krzysztof Wnuk * Nguyen Vinh Nghiem * * released under GNU GPL v2 only licence * */ #include #include "SrvOptIA_PD.h" #include "SrvOptIAPrefix.h" #include "OptStatusCode.h" #include "Logger.h" #include "AddrClient.h" #include "DHCPDefaults.h" #include "Msg.h" #include "SrvCfgMgr.h" using namespace std; TSrvOptIA_PD::TSrvOptIA_PD(uint32_t iaid, uint32_t t1, uint32_t t2, int Code, const std::string& Text, TMsg* parent) :TOptIA_PD(iaid, t1, t2, parent), PDLength(0) { Iface = parent->getIface(); SubOptions.append(new TOptStatusCode(Code, Text, parent)); } TSrvOptIA_PD::TSrvOptIA_PD(uint32_t iaid, uint32_t t1, uint32_t t2, TMsg* parent) :TOptIA_PD(iaid, t1, t2, parent), PDLength(0) { if (parent) { Iface = parent->getIface(); } else { Iface = -1; } } /* * Create IA_PD option based on receive buffer */ TSrvOptIA_PD::TSrvOptIA_PD(char * buf, int bufsize, TMsg* parent) :TOptIA_PD(buf, bufsize, parent), PDLength(0) { int pos=0; Iface = parent->getIface(); /// @todo: implement unpack while(pos0)&&(code<=26)) // was 24 { if(allowOptInOpt(parent->getType(),OPTION_IA_PD,code)) { SPtr opt; opt = SPtr(); /* NULL */ switch (code) { case OPTION_IAPREFIX: opt = (Ptr*)SPtr (new TSrvOptIAPrefix(buf+pos,length,this->Parent)); break; case OPTION_STATUS_CODE: opt = (Ptr*)SPtr (new TOptStatusCode(buf+pos,length,this->Parent)); break; default: Log(Warning) <<"Option " << code<< "not supported " <<" in message (type=" << parent->getType() <<") in this version of server." << LogEnd; break; } if((opt)&&(opt->isValid())) SubOptions.append(opt); } else { Log(Warning) << "Illegal option received (type=" << code << ") in an IA_PD option." << LogEnd; } } else { Log(Warning) << "Unknown option received (type=" << code << ") in an IA_PD option." << LogEnd; }; pos+=length; } } void TSrvOptIA_PD::releaseAllPrefixes(bool quiet) { SPtr opt; SPtr prefix; SPtr optPrefix; this->firstOption(); while ( opt = this->getOption() ) { if (opt->getOptType() != OPTION_IAPREFIX) continue; optPrefix = (Ptr*) opt; prefix = optPrefix->getPrefix(); SrvAddrMgr().delPrefix(ClntDuid, IAID_, prefix, quiet); SrvCfgMgr().decrPrefixCount(this->Iface, prefix); } } /// @brief checks if there are existing leases (and assigns them) /// /// @return true, if existing lease(s) are found bool TSrvOptIA_PD::existingLease() { SPtr client = SrvAddrMgr().getClient(ClntDuid); if (!client) return false; SPtr pd = client->getPD(IAID_); if (!pd) return false; if (!pd->countPrefix()) return false; SPtr prefix; pd->firstPrefix(); while (prefix = pd->getPrefix()) { Log(Debug) << "Assinging existing lease: prefix=" << prefix->get()->getPlain() << "/" << prefix->getLength() << ", pref=" << prefix->getPref() << ", valid=" << prefix->getValid() << LogEnd; SPtr optPrefix = new TSrvOptIAPrefix(prefix->get(), prefix->getLength(), prefix->getPref(), prefix->getValid(), this->Parent); SubOptions.append((Ptr*)optPrefix); } T1_ = pd->getT1(); T2_ = pd->getT2(); stringstream status; status << "Here's your existing lease: " << countPrefixes() << " prefix(es)."; SubOptions.append(new TOptStatusCode(STATUSCODE_SUCCESS, status.str(), this->Parent) ); return true; } // @brief gets one (or more) prefix for requested // // @param clientMsg client message // @param hint proposed prefix // @param fake should the prefix be really assigned or not (used in SOLICIT processing) // // @return true, if something was assigned bool TSrvOptIA_PD::assignPrefix(SPtr clientMsg, SPtr hint, bool fake) { SPtr prefix; SPtr optPrefix; SPtr ptrPD; List(TIPv6Addr) prefixLst; SPtr cached; if (hint->getPlain()==string("::") ) { cached = SrvAddrMgr().getCachedEntry(ClntDuid, IATYPE_PD); if (cached) hint = cached; } // Get the list of prefixes prefixLst.clear(); prefixLst = getFreePrefixes(clientMsg, hint); ostringstream buf; prefixLst.first(); while (prefix = prefixLst.get()) { buf << prefix->getPlain() << "/" << this->PDLength << " "; optPrefix = new TSrvOptIAPrefix(prefix, (char)this->PDLength, this->Prefered, this->Valid, this->Parent); SubOptions.append((Ptr*)optPrefix); // We do actual reservation here, even if it is SOLICIT. For SOLICIT, we will release // the prefix before sending ADVERTISE. We need to do this. Otherwise we could start // sending duplicate prefixes if client requested multiple IA_PDs. SPtr cfgIface = SrvCfgMgr().getIfaceByID(Iface); if (!cfgIface) { Log(Error) << "Missing configuration interface with ifindex=" << Iface << LogEnd; return false; } // every prefix has to be remembered in AddrMgr, e.g. when there are 2 pools defined, // prefixLst contains entries from each pool, so 2 prefixes has to be remembered SrvAddrMgr().addPrefix(this->ClntDuid, this->ClntAddr, cfgIface->getName(), Iface, IAID_, T1_, T2_, prefix, Prefered, Valid, this->PDLength, false); // Increase prefix pool usage counter SrvCfgMgr().incrPrefixCount(Iface, prefix); } Log(Info) << "PD:" << (fake?"(would be)":"") << " assigned prefix(es):" << buf.str() << LogEnd; if (prefixLst.count()) { stringstream tmp; tmp << "Assigned " << prefixLst.count() << " prefix(es)."; SubOptions.append( new TOptStatusCode(STATUSCODE_SUCCESS, tmp.str(), Parent) ); return true; } SubOptions.append( new TOptStatusCode(STATUSCODE_NOPREFIXAVAIL, "Unable to provide any prefixes. Sorry.", this->Parent) ); return false; } /// @brief constructor used in replies to SOLICIT, REQUEST, RENEW, REBIND, DECLINE and RELEASE /// /// @param clientMsg client message that server responds to /// @param queryOpt IA_PD option from client message /// @param parent message that we are currently building TSrvOptIA_PD::TSrvOptIA_PD(SPtr clientMsg, SPtr queryOpt, TMsg* parent) :TOptIA_PD(queryOpt->getIAID(), queryOpt->getT1(), queryOpt->getT2(), parent) { int msgType = clientMsg->getType(); ClntDuid = clientMsg->getClientDUID(); ClntAddr = clientMsg->getRemoteAddr(); Iface = clientMsg->getIface(); SPtr ptrIface = SrvCfgMgr().getIfaceByID(Iface); if (!ptrIface) { Log(Error) << "Unable to find interface with ifindex=" << Iface << ". Something is wrong, VERY wrong." << LogEnd; return; } // is the prefix delegation supported? if ( !ptrIface->supportPrefixDelegation() ) { SPtr ptrStatus; ptrStatus = new TOptStatusCode(STATUSCODE_NOPREFIXAVAIL, "Server support for prefix delegation is not enabled. Sorry buddy.", Parent); this->SubOptions.append((Ptr*)ptrStatus); return; } bool fake = false; // is this assignment for real? if (msgType == SOLICIT_MSG) fake = true; if (parent->getType() == REPLY_MSG) fake = false; switch (msgType) { case SOLICIT_MSG: case REQUEST_MSG: solicitRequest(clientMsg, queryOpt, ptrIface, fake); break; case RENEW_MSG: renew(queryOpt, ptrIface); break; case REBIND_MSG: rebind(queryOpt, ptrIface); break; case RELEASE_MSG: release(queryOpt, ptrIface); break; case CONFIRM_MSG: confirm(queryOpt, ptrIface); break; case DECLINE_MSG: decline(queryOpt, ptrIface); break; default: { Log(Warning) << "Unknown message type (" << msgType << "). Cannot generate OPTION_PD."<< LogEnd; SubOptions.append(new TOptStatusCode(STATUSCODE_UNSPECFAIL, "Unknown message type.",this->Parent)); break; } } } /** * this method is used to prepare response to IA_PD received in SOLICIT and REQUEST messages * (i.e. it tries to assign prefix as requested by client) * * @param clientMsg original message received from a client * @param queryOpt specific option in clientMsg that we are answering now * @param ptrIface pointer to SrvCfgIface * @param fake is this fake request? (fake = solicit, so nothing is actually assigned) */ void TSrvOptIA_PD::solicitRequest(SPtr clientMsg, SPtr queryOpt, SPtr ptrIface, bool fake) { // --- Is this PD without IAPREFIX options? --- SPtr hint; if (!queryOpt->countPrefixes()) { Log(Info) << "PD option (with IAPREFIX suboptions missing) received. " << LogEnd; hint = new TIPv6Addr(); /* :: - any address */ this->Prefered = DHCPV6_INFINITY; this->Valid = DHCPV6_INFINITY; } else { SPtr hintPrefix = (Ptr*) queryOpt->getOption(OPTION_IAPREFIX); hint = hintPrefix->getPrefix(); Log(Info) << "PD: PD option with " << hint->getPlain() << " as a hint received." << LogEnd; this->Prefered = hintPrefix->getPref(); this->Valid = hintPrefix->getValid(); } // --- LEASE ASSIGN STEP 3: check if client already has binding if (existingLease()) { return; } // --- LEASE ASSIGN STEP 4: Try to find fixed lease if (assignFixedLease(queryOpt)) { return; } // --- LEASE ASSIGN STEP 5: Count available addresses --- unsigned long leaseAssigned = SrvAddrMgr().getLeaseCount(ClntDuid); // already assigned unsigned long leaseMax = SrvCfgMgr().getIfaceByID(Iface)->getClntMaxLease(); // clnt-max-lease if (leaseAssigned >= leaseMax) { Log(Notice) << "Client got " << leaseAssigned << " lease(s) and requested 1 more, but limit for a client is " << leaseMax << LogEnd; stringstream tmp; tmp << "Sorry. You already have " << leaseAssigned << " lease(es) and you can't have more."; SubOptions.append(new TOptStatusCode(STATUSCODE_NOPREFIXAVAIL,tmp.str(), Parent)); return; } // --- LEASE ASSIGN STEP 6: Cached address? --- // --- LEASE ASSIGN STEP 7: client's hint --- // --- LEASE ASSIGN STEP 8: get new random address -- assignPrefix(clientMsg, hint, fake); } /** * generate OPTION_PD based on OPTION_PD received in RENEW message * * @param queryOpt IA_PD option received from client in the RENEW message * @param iface interface on which client communicated */ void TSrvOptIA_PD::renew(SPtr queryOpt, SPtr iface) { SPtr ptrClient; ptrClient = SrvAddrMgr().getClient(this->ClntDuid); if (!ptrClient) { SubOptions.append(new TOptStatusCode(STATUSCODE_NOBINDING,"Who are you? Do I know you?", this->Parent)); return; } // find that IA SPtr ptrIA; ptrIA = ptrClient->getPD(IAID_); if (!ptrIA) { SubOptions.append(new TOptStatusCode(STATUSCODE_NOBINDING,"I see this IAID first time.", this->Parent )); return; } // everything seems ok, update data in addrdb ptrIA->setTimestamp(); T1_ = ptrIA->getT1(); T2_ = ptrIA->getT2(); // send addr info to client SPtr prefix; ptrIA->firstPrefix(); while ( prefix = ptrIA->getPrefix() ) { SPtr optPrefix; prefix->setTimestamp(); optPrefix = new TSrvOptIAPrefix(prefix->get(), prefix->getLength(), prefix->getPref(), prefix->getValid(), this->Parent); SubOptions.append( (Ptr*)optPrefix ); } // finally send greetings and happy OK status code SPtr ptrStatus; ptrStatus = new TOptStatusCode(STATUSCODE_SUCCESS,"Prefix(es) renewed.", this->Parent); SubOptions.append( (Ptr*)ptrStatus ); } void TSrvOptIA_PD::rebind(SPtr queryOpt, SPtr iface) { /// @todo: implement PD support in REBIND message } void TSrvOptIA_PD::release(SPtr queryOpt, SPtr iface) { /// @todo: implement PD support in RELEASE message } void TSrvOptIA_PD::confirm(SPtr queryOpt, SPtr iface) { /// @todo: implement PD support in CONFIRM message } void TSrvOptIA_PD::decline(SPtr queryOpt, SPtr iface) { SubOptions.append(new TOptStatusCode(STATUSCODE_NOPREFIXAVAIL, "You tried to decline a prefix. Are you crazy?", Parent)); } bool TSrvOptIA_PD::doDuties() { return true; } /// @brief tries to find a fixed lease for a client /// /// @param req IA_PD sent by client /// /// @return true, if fixed lease is assigned bool TSrvOptIA_PD::assignFixedLease(SPtr req) { // is there any specific address reserved for this client? (exception mechanism) SPtr ptrIface=SrvCfgMgr().getIfaceByID(Iface); if (!ptrIface) { return 0; } SPtr ex = ptrIface->getClientException(ClntDuid, Parent, false/* = verbose */); if (!ex) return false; SPtr reservedPrefix = ex->getPrefix(); if (!reservedPrefix) { // there's no reserved prefix for this lad return false; } // we've got fixed prefix, yay! Let's try to calculate its preferred and valid lifetimes SPtr iface = SrvCfgMgr().getIfaceByID(Iface); if (!iface) { // this should never happen Log(Error) << "Unable to find interface with ifindex=" << Iface << " in SrvCfgMgr." << LogEnd; return false; } // if the lease is not within normal range, treat it as fixed, infinite one uint32_t pref = DHCPV6_INFINITY; uint32_t valid = DHCPV6_INFINITY; SPtr hint = (Ptr*) req->getOption(OPTION_IAPREFIX); if (hint) { pref = hint->getPref(); valid = hint->getValid(); } SPtr pool; iface->firstPD(); while (pool = iface->getPD()) { // This is not the pool you are looking for. if (!pool->prefixInPool(reservedPrefix)) continue; // we found matching pool! Yay! T1_ = pool->getT1(req->getT1()); T2_ = pool->getT2(req->getT2()); pref = pool->getPrefered(pref); valid = pool->getValid(valid); Log(Info) << "Reserved in-pool prefix " << reservedPrefix->getPlain() << "/" << static_cast(ex->getPrefixLen()) << " for this client found, assigning." << LogEnd; SPtr optPrefix = new TSrvOptIAPrefix(reservedPrefix, ex->getPrefixLen(), pref, valid, Parent); SubOptions.append(optPrefix); SubOptions.append(new TOptStatusCode(STATUSCODE_SUCCESS,"Assigned fixed in-pool prefix.", Parent)); SrvAddrMgr().addPrefix(ClntDuid, this->ClntAddr, iface->getName(), Iface, IAID_, T1_, T2_, reservedPrefix, pref, valid, ex->getPrefixLen(), false); // but CfgMgr has to increase usage only once. Don't ask my why :) SrvCfgMgr().incrPrefixCount(Iface, reservedPrefix); return true; } // This address does not belong to any pool. Assign it anyway T1_ = iface->getT1(req->getT1()); T2_ = iface->getT2(req->getT2()); pref = iface->getPref(pref); valid = iface->getValid(valid); Log(Info) << "Reserved out-of-pool address " << reservedPrefix->getPlain() << static_cast(ex->getPrefixLen()) << " for this client found, assigning." << LogEnd; SPtr optPrefix = new TSrvOptIAPrefix(reservedPrefix, ex->getPrefixLen(), pref, valid, Parent); SubOptions.append(optPrefix); SubOptions.append(new TOptStatusCode(STATUSCODE_SUCCESS,"Assigned fixed out-of-pool address.", Parent)); SrvAddrMgr().addPrefix(ClntDuid, this->ClntAddr, iface->getName(), Iface, IAID_, T1_, T2_, reservedPrefix, pref, valid, ex->getPrefixLen(), false); return true; } /** * @brief returns list of free prefixes for this client * * return free prefixes for a client. There are several ways that method may work: * 1 - client didn't provide any hints: * => one prefix from each pool will be granted * 2 - client has provided hint and that is valid (supported and unused): * => requested prefix will be granted * 3 - client has provided hint, which belongs to supported pool, but this prefix is used: * => other prefix from that pool will be asigned * 4 - client has provided hint, but it is invalid (not beloninging to a supported pool, * multicast or link-local): * => see 1 * * @param clientMsg message received from a client * @param cli_hint hint provided by client (or ::) * * @return - list of prefixes */ List(TIPv6Addr) TSrvOptIA_PD::getFreePrefixes(SPtr clientMsg, SPtr cli_hint) { SPtr ptrIface; SPtr prefix; SPtr ptrPD; bool validHint = true; List(TIPv6Addr) lst; lst.clear(); ptrIface = SrvCfgMgr().getIfaceByID(this->Iface); if (!ptrIface) { Log(Error) << "PD: Trying to find free prefix on non-existent interface (ifindex=" << this->Iface << ")." << LogEnd; return lst; // empty list } if (!ptrIface->supportPrefixDelegation()) { // this method should not be called anyway Log(Error) << "PD: Prefix delegation is not supported on the " << ptrIface->getFullName() << "." << LogEnd; return lst; // empty list } ptrIface->firstPD(); ptrPD = ptrIface->getPD(); // should be ==, asigned>total should never happen if (ptrPD->getAssignedCount() >= ptrPD->getTotalCount()) { Log(Error) << "PD: Unable to grant any prefixes: Already asigned " << ptrPD->getAssignedCount() << " out of " << ptrPD->getTotalCount() << "." << LogEnd; return lst; // empty list } // check if this prefix is ok // is it anyaddress (::)? SPtr anyaddr = new TIPv6Addr(); if (*anyaddr==*cli_hint) { Log(Debug) << "PD: Client requested unspecified (" << *cli_hint << ") prefix. Hint ignored." << LogEnd; validHint = false; } // is it multicast address (ff...)? if ((*(cli_hint->getAddr()))==0xff) { Log(Debug) << "PD: Client requested multicast (" << *cli_hint << ") prefix. Hint ignored." << LogEnd; validHint = false; } // is it link-local address (fe80::...)? char linklocal[]={0xfe, 0x80}; if (!memcmp(cli_hint->getAddr(),linklocal,2)) { Log(Debug) << "PD: Client requested link-local (" << *cli_hint << ") prefix. Hint ignored." << LogEnd; validHint = false; } SPtr remoteID; TSrvMsg * par = (TSrvMsg*)(Parent); if (par) { remoteID = par->getRemoteID(); } if ( validHint ) { // hint is valid, try to use it ptrPD = SrvCfgMgr().getClassByPrefix(this->Iface, cli_hint); // if the PD allow the hint, based on DUID, Addr, and Msg from client if (ptrPD && ptrPD->clntSupported(ClntDuid, ClntAddr, clientMsg)) { // Let's make a copy of the hint (we may need to tweak the hint in a second) SPtr hint(new TIPv6Addr(cli_hint->getAddr())); // Now zero the remaining part hint->truncate(0, ptrPD->getPD_Length()); // Is this hint reserved for someone else? if (!ptrIface->checkReservedPrefix(hint, ClntDuid, remoteID, ClntAddr)) { // Nope, not reserved. // case 2: address belongs to supported class, and is free if ( SrvAddrMgr().prefixIsFree(hint) ) { Log(Debug) << "PD: Requested prefix (" << *hint << ") is free, great!" << LogEnd; this->PDLength = ptrPD->getPD_Length(); this->Prefered = ptrPD->getPrefered(this->Prefered); this->Valid = ptrPD->getValid(this->Valid); T1_ = ptrPD->getT1(T1_); T2_ = ptrPD->getT2(T2_); lst.append(hint); return lst; } else { // case 3: hint is used, but we can assign another prefix from the same pool do { prefix=ptrPD->getRandomPrefix(); } while (!SrvAddrMgr().prefixIsFree(prefix)); lst.append(prefix); this->PDLength = ptrPD->getPD_Length(); this->Prefered = ptrPD->getPrefered(this->Prefered); this->Valid = ptrPD->getValid(this->Valid); T1_ = ptrPD->getT1(T1_); T2_ = ptrPD->getT2(T2_); return lst; } // if hint is used } // if this hint is reserved for someone? } // if client is supported at all } // if this is a valid hint // case 1: no hint provided, assign one prefix from each pool // case 4: provided hint does not belong to supported class or is useless (multicast,link-local, ::) ptrIface->firstPD(); while ( ptrPD = ptrIface->getPD()) { if (!ptrPD->clntSupported(ClntDuid, ClntAddr, clientMsg )) continue; break; } if (!ptrPD) { Log(Warning) << "Unable to find any PD for this client." << LogEnd; return lst; // return empty list } int attempts = SERVER_MAX_PD_RANDOM_TRIES; while (attempts--) { List(TIPv6Addr) lst; lst = ptrPD->getRandomList(); lst.first(); bool allFree = true; while (prefix = lst.get()) { if (!SrvAddrMgr().prefixIsFree(prefix) || SrvCfgMgr().prefixReserved(prefix)) { allFree = false; } } if (allFree) { this->PDLength = ptrPD->getPD_Length(); this->Prefered = ptrPD->getPrefered(this->Prefered); this->Valid = ptrPD->getValid(this->Valid); T1_ = ptrPD->getT1(T1_); T2_ = ptrPD->getT2(T2_); return lst; } }; // failed to find available prefixes after 100 attempts. Return empty list return List(TIPv6Addr)(); } dibbler-1.0.1/SrvOptions/SrvOptLQ.cpp0000644000175000017500000000655412304040124014361 00000000000000/* * Dibbler - a portable DHCPv6 * * author: Tomasz Mrugalski * * released under GNU GPL v2 only licence * */ #include "Msg.h" #include "Logger.h" #include "SrvOptLQ.h" #include "SrvOptIAAddress.h" #include "OptDUID.h" #include "Portable.h" // --- TSrvOptLQ --- TSrvOptLQ::TSrvOptLQ(char * buf, int bufsize, TMsg* parent) :TOpt(OPTION_LQ_QUERY, parent) { IsValid = true; // @TODO parse if (bufsize<17) { Log(Warning) << "Truncated (len=" << bufsize << ", at least 17 required) option OPTION_LQ_QUERY received." << LogEnd; IsValid = false; return; } QueryType = (ELeaseQueryType)buf[0]; Addr = new TIPv6Addr(buf+1); int pos = 17; while (posbufsize) { IsValid = false; Log(Warning) << "Truncated IA_NA option received." << LogEnd; return; } int code=buf[pos]*256+buf[pos+1]; pos+=2; int length=buf[pos]*256+buf[pos+1]; pos+=2; if (allowOptInOpt(parent->getType(), OPTION_LQ_QUERY, code)) { switch (code) { case OPTION_IAADDR: SubOptions.append( new TSrvOptIAAddress(buf+pos, length, Parent)); break; case OPTION_CLIENTID: SubOptions.append( new TOptDUID(OPTION_CLIENTID, buf+pos, length, Parent) ); break; default: Log(Warning) << "Not supported option " << code << " received in LQ_QUERY option." << LogEnd; } } else { Log(Warning) << "Illegal option " << code << " received inside LQ_QUERY option." << LogEnd; } pos += length; continue; } } bool TSrvOptLQ::doDuties() { return true; } ELeaseQueryType TSrvOptLQ::getQueryType() { return QueryType; } SPtr TSrvOptLQ::getLinkAddr() { return Addr; } size_t TSrvOptLQ::getSize() { SPtr opt; int len = 17; SubOptions.first(); while (opt = SubOptions.get() ) { len += opt->getSize(); } return len; } char * TSrvOptLQ::storeSelf(char* buf) { Log(Error) << "LQ: Something is wrong. Server was trying to send OPTION_LQ_QUERY option." << LogEnd; return buf; } // ----------------------------------------------------------------------------------- TSrvOptLQClientData::TSrvOptLQClientData(TMsg * parent) :TOpt(OPTION_CLIENT_DATA, parent) { } size_t TSrvOptLQClientData::getSize() { int cnt = 0; SPtr x; SubOptions.first(); while ( x=SubOptions.get() ) { cnt += x->getSize(); } return cnt+4; } char* TSrvOptLQClientData::storeSelf(char* buf) { buf = writeUint16(buf, OptType); buf = writeUint16(buf, getSize()-4); buf = storeSubOpt(buf); return buf; } bool TSrvOptLQClientData::doDuties() { return true; } // ----------------------------------------------------------------------------------- TSrvOptLQClientTime::TSrvOptLQClientTime(unsigned int value, TMsg* parent) :TOptInteger(OPTION_CLT_TIME, 4, value, parent) { } bool TSrvOptLQClientTime::doDuties() { return true; } // ----------------------------------------------------------------------------------- TSrvOptLQRelayData::TSrvOptLQRelayData(SPtr addr, TMsg* parent) :TOptGeneric(OPTION_LQ_RELAY_DATA, parent) { // @TODO - implement this } // ----------------------------------------------------------------------------------- TSrvOptLQClientLink::TSrvOptLQClientLink(List(TIPv6Addr) AddrLst, TMsg * parent) :TOpt(OPTION_LQ_CLIENT_LINK, parent) { LinkAddrLst = AddrLst; } dibbler-1.0.1/SrvOptions/SrvOptIAAddress.cpp0000664000175000017500000000402412560471634015656 00000000000000/* * Dibbler - a portable DHCPv6 * * authors: Tomasz Mrugalski * Marek Senderski * * released under GNU GPL v2 only licence * */ #include "Portable.h" #include "DHCPConst.h" #include "Opt.h" #include "OptIAAddress.h" #include "SrvOptIAAddress.h" #include "OptStatusCode.h" #include "Msg.h" #include "Logger.h" TSrvOptIAAddress::TSrvOptIAAddress( char * buf, int bufsize, TMsg* parent) :TOptIAAddress(buf,bufsize, parent) { int pos=0; while(pos0)&&(code<=24)) { if(allowOptInOpt(parent->getType(),OPTION_IAADDR,code)) { SPtr opt; opt = SPtr(); switch (code) { case OPTION_STATUS_CODE: opt =(Ptr*)SPtr ( new TOptStatusCode(buf+pos, length, Parent)); break; default: Log(Warning) << "Option " << code<< " not supported " <<" in message (type="<< parent->getType() <<")." << LogEnd; break; } if((opt)&&(opt->isValid())) SubOptions.append(opt); } else { Log(Warning) << "Illegal option received, opttype=" << code << " in field options of IA_NA option" << LogEnd; } } else { Log(Warning) <<"Unknown option in option IAADDR( optType=" << code << "). Option ignored." << LogEnd; }; pos += length; } } TSrvOptIAAddress::TSrvOptIAAddress(SPtr addr, unsigned long pref, unsigned long valid, TMsg* parent) :TOptIAAddress(addr,pref,valid, parent) { } bool TSrvOptIAAddress::doDuties() { return true; } dibbler-1.0.1/SrvOptions/SrvOptLQ.h0000644000175000017500000000265312304040124014022 00000000000000/* * Dibbler - a portable DHCPv6 * * author: Tomasz Mrugalski * * released under GNU GPL v2 only licence * */ class TSrvOptLQ; class TSrvOptLQClientData; class TSrvOptLQClientTime; class TSrvOptLQRelayData; class TSrvOptLQClientLink; #ifndef SRVOPTLQ_H #define SRVOPTLQ_H #include "DHCPConst.h" #include "SmartPtr.h" #include "DUID.h" #include "IPv6Addr.h" #include "Opt.h" #include "OptInteger.h" #include "OptGeneric.h" class TSrvOptLQ : public TOpt { public: TSrvOptLQ(char * buf, int bufsize, TMsg* parent); bool doDuties(); ELeaseQueryType getQueryType(); size_t getSize(); char * storeSelf(char* buf); SPtr getLinkAddr(); private: ELeaseQueryType QueryType; SPtr Duid; SPtr Addr; bool IsValid; }; class TSrvOptLQClientData : public TOpt { public: size_t getSize(); char* storeSelf(char*); bool doDuties(); TSrvOptLQClientData(TMsg * parent); // only suboptions }; class TSrvOptLQClientTime : public TOptInteger { public: TSrvOptLQClientTime(unsigned int value, TMsg* parent); bool doDuties(); }; // not supported class TSrvOptLQRelayData : public TOptGeneric { public: TSrvOptLQRelayData(SPtr addr, TMsg* parent); }; class TSrvOptLQClientLink : public TOpt { public: TSrvOptLQClientLink(List(TIPv6Addr) AddrLst, TMsg * parent); private: List(TIPv6Addr) LinkAddrLst; }; #endif dibbler-1.0.1/SrvOptions/SrvOptIA_PD.h0000664000175000017500000000352212233256142014372 00000000000000/* * Dibbler - a portable DHCPv6 * * author: Krzysztof Wnuk * changes: Tomasz Mrugalski * * released under GNU GPL v2 only licence * * */ class TSrvOptIA_PD; #ifndef SRVOPTIA_PD_H #define SRVOPTIA_PD_H #include "OptIA_PD.h" #include "SrvOptIAPrefix.h" #include "SmartPtr.h" #include "DUID.h" #include "Container.h" #include "IPv6Addr.h" #include "SrvCfgIface.h" class TSrvOptIA_PD : public TOptIA_PD { public: TSrvOptIA_PD(SPtr clientMsg, SPtr queryOpt, TMsg* parent); TSrvOptIA_PD(char * buf, int bufsize, TMsg* parent); TSrvOptIA_PD(uint32_t IAID, uint32_t T1, uint32_t T2, TMsg* parent); TSrvOptIA_PD(uint32_t IAID, uint32_t T1, uint32_t T2, int Code, const std::string& Msg, TMsg* parent); void releaseAllPrefixes(bool quiet); void solicitRequest(SPtr clientMsg, SPtr queryOpt, SPtr ptr, bool fake); void renew (SPtr queryOpt, SPtr iface); void rebind (SPtr queryOpt, SPtr iface); void release (SPtr queryOpt, SPtr iface); void confirm (SPtr queryOpt, SPtr iface); void decline (SPtr queryOpt, SPtr iface); bool doDuties(); private: SPtr ClntAddr; SPtr ClntDuid; /// @todo: replace with Parent->getIface(); int Iface; bool existingLease(); bool assignPrefix(SPtr clientMsg, SPtr hint, bool fake); bool assignFixedLease(SPtr request); List(TIPv6Addr) getFreePrefixes(SPtr clientMsg, SPtr hint); uint32_t Prefered; uint32_t Valid; unsigned long PDLength; }; #endif dibbler-1.0.1/SrvOptions/SrvOptFQDN.h0000664000175000017500000000130612233256142014244 00000000000000/* * Dibbler - a portable DHCPv6 * * author: Krzysztof Wnuk * * released under GNU GPL v2 only licence * * $Id: SrvOptFQDN.h,v 1.4 2008-08-29 00:07:36 thomson Exp $ * * $Log: not supported by cvs2svn $ * Revision 1.3 2006-10-06 00:37:59 thomson * Initial PD support. * * Revision 1.2 2006-03-03 20:49:54 thomson * FQDN support improved. * * Revision 1.1 2004/11/02 01:30:54 thomson * Initial version. * */ #ifndef SRVOPTFQDN_H #define SRVOPTFQDN_H #include "OptFQDN.h" class TSrvOptFQDN : public TOptFQDN { public: TSrvOptFQDN(const std::string& fqdn, TMsg* parent); TSrvOptFQDN(char *buf, int bufsize, TMsg* parent); bool doDuties(); }; #endif dibbler-1.0.1/SrvOptions/SrvOptTA.h0000664000175000017500000000262112233256142014021 00000000000000/* * Dibbler - a portable DHCPv6 * * authors: Tomasz Mrugalski * * released under GNU GPL v2 only licence */ class TSrvOptTA; #ifndef SRVOPTTA_H #define SRVOPTTA_H #include "OptTA.h" #include "SrvOptIAAddress.h" #include "SmartPtr.h" #include "DUID.h" #include "SrvCfgMgr.h" #include "SrvAddrMgr.h" #include "Container.h" #include "IPv6Addr.h" class TSrvOptTA : public TOptTA { public: /* Constructor used in answers to: SOLICIT, SOLICIT (with RAPID_COMMIT) and REQUEST */ TSrvOptTA(SPtr queryOpt, SPtr clientMsg, int msgType, TMsg* parent); TSrvOptTA(char * buf, int bufsize, TMsg* parent); TSrvOptTA(int iaid, int statusCode, std::string txt, TMsg* parent); /// @todo: Why 3 construstors? void releaseAllAddrs(bool quiet); bool doDuties(); private: SPtr ClntAddr; SPtr ClntDuid; /// @todo: replace with Parent->getIface(); int Iface; SPtr assignAddr(SPtr clientMsg); void solicit(SPtr clientMsg, SPtr queryOpt); void request(SPtr clientMsg, SPtr queryOpt); void release(SPtr queryOpt); void confirm(SPtr queryOpt); void solicitRequest(SPtr clientMsg, SPtr queryOpt, bool solicit); int OrgMessage; // original message, which we are responding to }; #endif dibbler-1.0.1/SrvOptions/SrvOptIAAddress.h0000664000175000017500000000206212233256142015313 00000000000000/* * Dibbler - a portable DHCPv6 * * authors: Tomasz Mrugalski * Marek Senderski * * released under GNU GPL v2 only licence * * $Id: SrvOptIAAddress.h,v 1.5 2008-08-29 00:07:36 thomson Exp $ * * $Log: not supported by cvs2svn $ * Revision 1.4 2004-10-27 22:07:56 thomson * Signed/unsigned issues fixed, Lifetime option implemented, INFORMATION-REQUEST * message is now sent properly. Valid lifetime granted by server fixed. * * Revision 1.3 2004/09/07 22:02:34 thomson * pref/valid/IAID is not unsigned, RAPID-COMMIT now works ok. * * Revision 1.2 2004/06/17 23:53:55 thomson * Server Address Assignment rewritten. */ #ifndef SRVOPTIAADDRESS_H #define SRVOPTIAADDRESS_H #include "SmartPtr.h" #include "Container.h" #include "OptIAAddress.h" class TSrvOptIAAddress : public TOptIAAddress { public: TSrvOptIAAddress( char * addr, int n, TMsg* parent); TSrvOptIAAddress(SPtr addr, unsigned long pref, unsigned long valid, TMsg* parent); bool doDuties(); }; #endif dibbler-1.0.1/SrvOptions/Makefile.in0000664000175000017500000012045412561652535014252 00000000000000# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = SrvOptions DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/depcomp ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/libtool.m4 \ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/include/dibbler-config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = LIBRARIES = $(noinst_LIBRARIES) ARFLAGS = cru AM_V_AR = $(am__v_AR_@AM_V@) am__v_AR_ = $(am__v_AR_@AM_DEFAULT_V@) am__v_AR_0 = @echo " AR " $@; am__v_AR_1 = libSrvOptions_a_AR = $(AR) $(ARFLAGS) libSrvOptions_a_LIBADD = am_libSrvOptions_a_OBJECTS = \ libSrvOptions_a-SrvOptAddrParams.$(OBJEXT) \ libSrvOptions_a-SrvOptFQDN.$(OBJEXT) \ libSrvOptions_a-SrvOptIAAddress.$(OBJEXT) \ libSrvOptions_a-SrvOptIA_NA.$(OBJEXT) \ libSrvOptions_a-SrvOptIA_PD.$(OBJEXT) \ libSrvOptions_a-SrvOptIAPrefix.$(OBJEXT) \ libSrvOptions_a-SrvOptInterfaceID.$(OBJEXT) \ libSrvOptions_a-SrvOptLQ.$(OBJEXT) \ libSrvOptions_a-SrvOptTA.$(OBJEXT) libSrvOptions_a_OBJECTS = $(am_libSrvOptions_a_OBJECTS) AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)/include depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) LTCXXCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CXXFLAGS) $(CXXFLAGS) AM_V_CXX = $(am__v_CXX_@AM_V@) am__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@) am__v_CXX_0 = @echo " CXX " $@; am__v_CXX_1 = CXXLD = $(CXX) CXXLINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \ $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CXXLD = $(am__v_CXXLD_@AM_V@) am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@) am__v_CXXLD_0 = @echo " CXXLD " $@; am__v_CXXLD_1 = COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(libSrvOptions_a_SOURCES) DIST_SOURCES = $(libSrvOptions_a_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALLOCA = @ALLOCA@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ ARCH = @ARCH@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ EXTRA_DIST_SUBDIRS = @EXTRA_DIST_SUBDIRS@ FGREP = @FGREP@ GREP = @GREP@ GTEST_INCLUDES = @GTEST_INCLUDES@ GTEST_LDADD = @GTEST_LDADD@ GTEST_LDFLAGS = @GTEST_LDFLAGS@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LINKPRINT = @LINKPRINT@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PORT_CFLAGS = @PORT_CFLAGS@ PORT_LDFLAGS = @PORT_LDFLAGS@ PORT_SUBDIR = @PORT_SUBDIR@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ subdirs = @subdirs@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ noinst_LIBRARIES = libSrvOptions.a libSrvOptions_a_CPPFLAGS = -I$(top_srcdir)/Misc \ -I$(top_srcdir)/Options -I$(top_srcdir)/SrvMessages \ -I$(top_srcdir)/Messages -I$(top_srcdir)/SrvIfaceMgr \ -I$(top_srcdir)/IfaceMgr -I$(top_srcdir)/SrvCfgMgr \ -I$(top_srcdir)/CfgMgr -I$(top_srcdir)/SrvAddrMgr \ -I$(top_srcdir)/AddrMgr -I$(top_srcdir)/SrvTransMgr #libSrvOptions_a_SOURCES = SrvOptAAAAuthentication.cpp SrvOptAAAAuthentication.h #libSrvOptions_a_SOURCES += SrvOptAuthentication.cpp SrvOptAuthentication.h #libSrvOptions_a_SOURCES += SrvOptClientIdentifier.cpp SrvOptClientIdentifier.h #libSrvOptions_a_SOURCES += SrvOptDNSServers.cpp SrvOptDNSServers.h #libSrvOptions_a_SOURCES += SrvOptDomainName.cpp SrvOptDomainName.h #libSrvOptions_a_SOURCES += SrvOptEcho.cpp SrvOptEcho.h #libSrvOptions_a_SOURCES += SrvOptElapsed.cpp SrvOptElapsed.h #libSrvOptions_a_SOURCES += SrvOptKeyGeneration.cpp SrvOptKeyGeneration.h #libSrvOptions_a_SOURCES += SrvOptLifetime.cpp SrvOptLifetime.h #libSrvOptions_a_SOURCES += SrvOptNISDomain.cpp SrvOptNISDomain.h #libSrvOptions_a_SOURCES += SrvOptNISPDomain.cpp SrvOptNISPDomain.h #libSrvOptions_a_SOURCES += SrvOptNISPServer.cpp SrvOptNISPServer.h #libSrvOptions_a_SOURCES += SrvOptNISServer.cpp SrvOptNISServer.h #libSrvOptions_a_SOURCES += SrvOptNTPServers.cpp SrvOptNTPServers.h #libSrvOptions_a_SOURCES += SrvOptOptionRequest.cpp SrvOptOptionRequest.h #libSrvOptions_a_SOURCES += SrvOptPreference.cpp SrvOptPreference.h #libSrvOptions_a_SOURCES += SrvOptServerIdentifier.cpp SrvOptServerIdentifier.h #libSrvOptions_a_SOURCES += SrvOptServerUnicast.cpp SrvOptServerUnicast.h #libSrvOptions_a_SOURCES += SrvOptSIPDomain.cpp SrvOptSIPDomain.h #libSrvOptions_a_SOURCES += SrvOptSIPServer.cpp SrvOptSIPServer.h #libSrvOptions_a_SOURCES += SrvOptStatusCode.cpp SrvOptStatusCode.h libSrvOptions_a_SOURCES = SrvOptAddrParams.cpp SrvOptAddrParams.h \ SrvOptFQDN.cpp SrvOptFQDN.h SrvOptIAAddress.cpp \ SrvOptIAAddress.h SrvOptIA_NA.cpp SrvOptIA_NA.h \ SrvOptIA_PD.cpp SrvOptIA_PD.h SrvOptIAPrefix.cpp \ SrvOptIAPrefix.h SrvOptInterfaceID.cpp SrvOptInterfaceID.h \ SrvOptLQ.cpp SrvOptLQ.h SrvOptTA.cpp SrvOptTA.h all: all-am .SUFFIXES: .SUFFIXES: .cpp .lo .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign SrvOptions/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign SrvOptions/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstLIBRARIES: -test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES) libSrvOptions.a: $(libSrvOptions_a_OBJECTS) $(libSrvOptions_a_DEPENDENCIES) $(EXTRA_libSrvOptions_a_DEPENDENCIES) $(AM_V_at)-rm -f libSrvOptions.a $(AM_V_AR)$(libSrvOptions_a_AR) libSrvOptions.a $(libSrvOptions_a_OBJECTS) $(libSrvOptions_a_LIBADD) $(AM_V_at)$(RANLIB) libSrvOptions.a mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libSrvOptions_a-SrvOptAddrParams.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libSrvOptions_a-SrvOptFQDN.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libSrvOptions_a-SrvOptIAAddress.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libSrvOptions_a-SrvOptIAPrefix.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libSrvOptions_a-SrvOptIA_NA.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libSrvOptions_a-SrvOptIA_PD.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libSrvOptions_a-SrvOptInterfaceID.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libSrvOptions_a-SrvOptLQ.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libSrvOptions_a-SrvOptTA.Po@am__quote@ .cpp.o: @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $< .cpp.obj: @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .cpp.lo: @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LTCXXCOMPILE) -c -o $@ $< libSrvOptions_a-SrvOptAddrParams.o: SrvOptAddrParams.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libSrvOptions_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libSrvOptions_a-SrvOptAddrParams.o -MD -MP -MF $(DEPDIR)/libSrvOptions_a-SrvOptAddrParams.Tpo -c -o libSrvOptions_a-SrvOptAddrParams.o `test -f 'SrvOptAddrParams.cpp' || echo '$(srcdir)/'`SrvOptAddrParams.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libSrvOptions_a-SrvOptAddrParams.Tpo $(DEPDIR)/libSrvOptions_a-SrvOptAddrParams.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='SrvOptAddrParams.cpp' object='libSrvOptions_a-SrvOptAddrParams.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libSrvOptions_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libSrvOptions_a-SrvOptAddrParams.o `test -f 'SrvOptAddrParams.cpp' || echo '$(srcdir)/'`SrvOptAddrParams.cpp libSrvOptions_a-SrvOptAddrParams.obj: SrvOptAddrParams.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libSrvOptions_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libSrvOptions_a-SrvOptAddrParams.obj -MD -MP -MF $(DEPDIR)/libSrvOptions_a-SrvOptAddrParams.Tpo -c -o libSrvOptions_a-SrvOptAddrParams.obj `if test -f 'SrvOptAddrParams.cpp'; then $(CYGPATH_W) 'SrvOptAddrParams.cpp'; else $(CYGPATH_W) '$(srcdir)/SrvOptAddrParams.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libSrvOptions_a-SrvOptAddrParams.Tpo $(DEPDIR)/libSrvOptions_a-SrvOptAddrParams.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='SrvOptAddrParams.cpp' object='libSrvOptions_a-SrvOptAddrParams.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libSrvOptions_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libSrvOptions_a-SrvOptAddrParams.obj `if test -f 'SrvOptAddrParams.cpp'; then $(CYGPATH_W) 'SrvOptAddrParams.cpp'; else $(CYGPATH_W) '$(srcdir)/SrvOptAddrParams.cpp'; fi` libSrvOptions_a-SrvOptFQDN.o: SrvOptFQDN.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libSrvOptions_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libSrvOptions_a-SrvOptFQDN.o -MD -MP -MF $(DEPDIR)/libSrvOptions_a-SrvOptFQDN.Tpo -c -o libSrvOptions_a-SrvOptFQDN.o `test -f 'SrvOptFQDN.cpp' || echo '$(srcdir)/'`SrvOptFQDN.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libSrvOptions_a-SrvOptFQDN.Tpo $(DEPDIR)/libSrvOptions_a-SrvOptFQDN.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='SrvOptFQDN.cpp' object='libSrvOptions_a-SrvOptFQDN.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libSrvOptions_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libSrvOptions_a-SrvOptFQDN.o `test -f 'SrvOptFQDN.cpp' || echo '$(srcdir)/'`SrvOptFQDN.cpp libSrvOptions_a-SrvOptFQDN.obj: SrvOptFQDN.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libSrvOptions_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libSrvOptions_a-SrvOptFQDN.obj -MD -MP -MF $(DEPDIR)/libSrvOptions_a-SrvOptFQDN.Tpo -c -o libSrvOptions_a-SrvOptFQDN.obj `if test -f 'SrvOptFQDN.cpp'; then $(CYGPATH_W) 'SrvOptFQDN.cpp'; else $(CYGPATH_W) '$(srcdir)/SrvOptFQDN.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libSrvOptions_a-SrvOptFQDN.Tpo $(DEPDIR)/libSrvOptions_a-SrvOptFQDN.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='SrvOptFQDN.cpp' object='libSrvOptions_a-SrvOptFQDN.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libSrvOptions_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libSrvOptions_a-SrvOptFQDN.obj `if test -f 'SrvOptFQDN.cpp'; then $(CYGPATH_W) 'SrvOptFQDN.cpp'; else $(CYGPATH_W) '$(srcdir)/SrvOptFQDN.cpp'; fi` libSrvOptions_a-SrvOptIAAddress.o: SrvOptIAAddress.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libSrvOptions_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libSrvOptions_a-SrvOptIAAddress.o -MD -MP -MF $(DEPDIR)/libSrvOptions_a-SrvOptIAAddress.Tpo -c -o libSrvOptions_a-SrvOptIAAddress.o `test -f 'SrvOptIAAddress.cpp' || echo '$(srcdir)/'`SrvOptIAAddress.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libSrvOptions_a-SrvOptIAAddress.Tpo $(DEPDIR)/libSrvOptions_a-SrvOptIAAddress.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='SrvOptIAAddress.cpp' object='libSrvOptions_a-SrvOptIAAddress.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libSrvOptions_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libSrvOptions_a-SrvOptIAAddress.o `test -f 'SrvOptIAAddress.cpp' || echo '$(srcdir)/'`SrvOptIAAddress.cpp libSrvOptions_a-SrvOptIAAddress.obj: SrvOptIAAddress.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libSrvOptions_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libSrvOptions_a-SrvOptIAAddress.obj -MD -MP -MF $(DEPDIR)/libSrvOptions_a-SrvOptIAAddress.Tpo -c -o libSrvOptions_a-SrvOptIAAddress.obj `if test -f 'SrvOptIAAddress.cpp'; then $(CYGPATH_W) 'SrvOptIAAddress.cpp'; else $(CYGPATH_W) '$(srcdir)/SrvOptIAAddress.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libSrvOptions_a-SrvOptIAAddress.Tpo $(DEPDIR)/libSrvOptions_a-SrvOptIAAddress.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='SrvOptIAAddress.cpp' object='libSrvOptions_a-SrvOptIAAddress.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libSrvOptions_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libSrvOptions_a-SrvOptIAAddress.obj `if test -f 'SrvOptIAAddress.cpp'; then $(CYGPATH_W) 'SrvOptIAAddress.cpp'; else $(CYGPATH_W) '$(srcdir)/SrvOptIAAddress.cpp'; fi` libSrvOptions_a-SrvOptIA_NA.o: SrvOptIA_NA.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libSrvOptions_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libSrvOptions_a-SrvOptIA_NA.o -MD -MP -MF $(DEPDIR)/libSrvOptions_a-SrvOptIA_NA.Tpo -c -o libSrvOptions_a-SrvOptIA_NA.o `test -f 'SrvOptIA_NA.cpp' || echo '$(srcdir)/'`SrvOptIA_NA.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libSrvOptions_a-SrvOptIA_NA.Tpo $(DEPDIR)/libSrvOptions_a-SrvOptIA_NA.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='SrvOptIA_NA.cpp' object='libSrvOptions_a-SrvOptIA_NA.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libSrvOptions_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libSrvOptions_a-SrvOptIA_NA.o `test -f 'SrvOptIA_NA.cpp' || echo '$(srcdir)/'`SrvOptIA_NA.cpp libSrvOptions_a-SrvOptIA_NA.obj: SrvOptIA_NA.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libSrvOptions_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libSrvOptions_a-SrvOptIA_NA.obj -MD -MP -MF $(DEPDIR)/libSrvOptions_a-SrvOptIA_NA.Tpo -c -o libSrvOptions_a-SrvOptIA_NA.obj `if test -f 'SrvOptIA_NA.cpp'; then $(CYGPATH_W) 'SrvOptIA_NA.cpp'; else $(CYGPATH_W) '$(srcdir)/SrvOptIA_NA.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libSrvOptions_a-SrvOptIA_NA.Tpo $(DEPDIR)/libSrvOptions_a-SrvOptIA_NA.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='SrvOptIA_NA.cpp' object='libSrvOptions_a-SrvOptIA_NA.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libSrvOptions_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libSrvOptions_a-SrvOptIA_NA.obj `if test -f 'SrvOptIA_NA.cpp'; then $(CYGPATH_W) 'SrvOptIA_NA.cpp'; else $(CYGPATH_W) '$(srcdir)/SrvOptIA_NA.cpp'; fi` libSrvOptions_a-SrvOptIA_PD.o: SrvOptIA_PD.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libSrvOptions_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libSrvOptions_a-SrvOptIA_PD.o -MD -MP -MF $(DEPDIR)/libSrvOptions_a-SrvOptIA_PD.Tpo -c -o libSrvOptions_a-SrvOptIA_PD.o `test -f 'SrvOptIA_PD.cpp' || echo '$(srcdir)/'`SrvOptIA_PD.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libSrvOptions_a-SrvOptIA_PD.Tpo $(DEPDIR)/libSrvOptions_a-SrvOptIA_PD.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='SrvOptIA_PD.cpp' object='libSrvOptions_a-SrvOptIA_PD.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libSrvOptions_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libSrvOptions_a-SrvOptIA_PD.o `test -f 'SrvOptIA_PD.cpp' || echo '$(srcdir)/'`SrvOptIA_PD.cpp libSrvOptions_a-SrvOptIA_PD.obj: SrvOptIA_PD.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libSrvOptions_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libSrvOptions_a-SrvOptIA_PD.obj -MD -MP -MF $(DEPDIR)/libSrvOptions_a-SrvOptIA_PD.Tpo -c -o libSrvOptions_a-SrvOptIA_PD.obj `if test -f 'SrvOptIA_PD.cpp'; then $(CYGPATH_W) 'SrvOptIA_PD.cpp'; else $(CYGPATH_W) '$(srcdir)/SrvOptIA_PD.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libSrvOptions_a-SrvOptIA_PD.Tpo $(DEPDIR)/libSrvOptions_a-SrvOptIA_PD.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='SrvOptIA_PD.cpp' object='libSrvOptions_a-SrvOptIA_PD.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libSrvOptions_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libSrvOptions_a-SrvOptIA_PD.obj `if test -f 'SrvOptIA_PD.cpp'; then $(CYGPATH_W) 'SrvOptIA_PD.cpp'; else $(CYGPATH_W) '$(srcdir)/SrvOptIA_PD.cpp'; fi` libSrvOptions_a-SrvOptIAPrefix.o: SrvOptIAPrefix.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libSrvOptions_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libSrvOptions_a-SrvOptIAPrefix.o -MD -MP -MF $(DEPDIR)/libSrvOptions_a-SrvOptIAPrefix.Tpo -c -o libSrvOptions_a-SrvOptIAPrefix.o `test -f 'SrvOptIAPrefix.cpp' || echo '$(srcdir)/'`SrvOptIAPrefix.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libSrvOptions_a-SrvOptIAPrefix.Tpo $(DEPDIR)/libSrvOptions_a-SrvOptIAPrefix.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='SrvOptIAPrefix.cpp' object='libSrvOptions_a-SrvOptIAPrefix.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libSrvOptions_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libSrvOptions_a-SrvOptIAPrefix.o `test -f 'SrvOptIAPrefix.cpp' || echo '$(srcdir)/'`SrvOptIAPrefix.cpp libSrvOptions_a-SrvOptIAPrefix.obj: SrvOptIAPrefix.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libSrvOptions_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libSrvOptions_a-SrvOptIAPrefix.obj -MD -MP -MF $(DEPDIR)/libSrvOptions_a-SrvOptIAPrefix.Tpo -c -o libSrvOptions_a-SrvOptIAPrefix.obj `if test -f 'SrvOptIAPrefix.cpp'; then $(CYGPATH_W) 'SrvOptIAPrefix.cpp'; else $(CYGPATH_W) '$(srcdir)/SrvOptIAPrefix.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libSrvOptions_a-SrvOptIAPrefix.Tpo $(DEPDIR)/libSrvOptions_a-SrvOptIAPrefix.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='SrvOptIAPrefix.cpp' object='libSrvOptions_a-SrvOptIAPrefix.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libSrvOptions_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libSrvOptions_a-SrvOptIAPrefix.obj `if test -f 'SrvOptIAPrefix.cpp'; then $(CYGPATH_W) 'SrvOptIAPrefix.cpp'; else $(CYGPATH_W) '$(srcdir)/SrvOptIAPrefix.cpp'; fi` libSrvOptions_a-SrvOptInterfaceID.o: SrvOptInterfaceID.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libSrvOptions_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libSrvOptions_a-SrvOptInterfaceID.o -MD -MP -MF $(DEPDIR)/libSrvOptions_a-SrvOptInterfaceID.Tpo -c -o libSrvOptions_a-SrvOptInterfaceID.o `test -f 'SrvOptInterfaceID.cpp' || echo '$(srcdir)/'`SrvOptInterfaceID.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libSrvOptions_a-SrvOptInterfaceID.Tpo $(DEPDIR)/libSrvOptions_a-SrvOptInterfaceID.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='SrvOptInterfaceID.cpp' object='libSrvOptions_a-SrvOptInterfaceID.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libSrvOptions_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libSrvOptions_a-SrvOptInterfaceID.o `test -f 'SrvOptInterfaceID.cpp' || echo '$(srcdir)/'`SrvOptInterfaceID.cpp libSrvOptions_a-SrvOptInterfaceID.obj: SrvOptInterfaceID.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libSrvOptions_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libSrvOptions_a-SrvOptInterfaceID.obj -MD -MP -MF $(DEPDIR)/libSrvOptions_a-SrvOptInterfaceID.Tpo -c -o libSrvOptions_a-SrvOptInterfaceID.obj `if test -f 'SrvOptInterfaceID.cpp'; then $(CYGPATH_W) 'SrvOptInterfaceID.cpp'; else $(CYGPATH_W) '$(srcdir)/SrvOptInterfaceID.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libSrvOptions_a-SrvOptInterfaceID.Tpo $(DEPDIR)/libSrvOptions_a-SrvOptInterfaceID.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='SrvOptInterfaceID.cpp' object='libSrvOptions_a-SrvOptInterfaceID.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libSrvOptions_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libSrvOptions_a-SrvOptInterfaceID.obj `if test -f 'SrvOptInterfaceID.cpp'; then $(CYGPATH_W) 'SrvOptInterfaceID.cpp'; else $(CYGPATH_W) '$(srcdir)/SrvOptInterfaceID.cpp'; fi` libSrvOptions_a-SrvOptLQ.o: SrvOptLQ.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libSrvOptions_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libSrvOptions_a-SrvOptLQ.o -MD -MP -MF $(DEPDIR)/libSrvOptions_a-SrvOptLQ.Tpo -c -o libSrvOptions_a-SrvOptLQ.o `test -f 'SrvOptLQ.cpp' || echo '$(srcdir)/'`SrvOptLQ.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libSrvOptions_a-SrvOptLQ.Tpo $(DEPDIR)/libSrvOptions_a-SrvOptLQ.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='SrvOptLQ.cpp' object='libSrvOptions_a-SrvOptLQ.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libSrvOptions_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libSrvOptions_a-SrvOptLQ.o `test -f 'SrvOptLQ.cpp' || echo '$(srcdir)/'`SrvOptLQ.cpp libSrvOptions_a-SrvOptLQ.obj: SrvOptLQ.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libSrvOptions_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libSrvOptions_a-SrvOptLQ.obj -MD -MP -MF $(DEPDIR)/libSrvOptions_a-SrvOptLQ.Tpo -c -o libSrvOptions_a-SrvOptLQ.obj `if test -f 'SrvOptLQ.cpp'; then $(CYGPATH_W) 'SrvOptLQ.cpp'; else $(CYGPATH_W) '$(srcdir)/SrvOptLQ.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libSrvOptions_a-SrvOptLQ.Tpo $(DEPDIR)/libSrvOptions_a-SrvOptLQ.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='SrvOptLQ.cpp' object='libSrvOptions_a-SrvOptLQ.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libSrvOptions_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libSrvOptions_a-SrvOptLQ.obj `if test -f 'SrvOptLQ.cpp'; then $(CYGPATH_W) 'SrvOptLQ.cpp'; else $(CYGPATH_W) '$(srcdir)/SrvOptLQ.cpp'; fi` libSrvOptions_a-SrvOptTA.o: SrvOptTA.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libSrvOptions_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libSrvOptions_a-SrvOptTA.o -MD -MP -MF $(DEPDIR)/libSrvOptions_a-SrvOptTA.Tpo -c -o libSrvOptions_a-SrvOptTA.o `test -f 'SrvOptTA.cpp' || echo '$(srcdir)/'`SrvOptTA.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libSrvOptions_a-SrvOptTA.Tpo $(DEPDIR)/libSrvOptions_a-SrvOptTA.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='SrvOptTA.cpp' object='libSrvOptions_a-SrvOptTA.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libSrvOptions_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libSrvOptions_a-SrvOptTA.o `test -f 'SrvOptTA.cpp' || echo '$(srcdir)/'`SrvOptTA.cpp libSrvOptions_a-SrvOptTA.obj: SrvOptTA.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libSrvOptions_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libSrvOptions_a-SrvOptTA.obj -MD -MP -MF $(DEPDIR)/libSrvOptions_a-SrvOptTA.Tpo -c -o libSrvOptions_a-SrvOptTA.obj `if test -f 'SrvOptTA.cpp'; then $(CYGPATH_W) 'SrvOptTA.cpp'; else $(CYGPATH_W) '$(srcdir)/SrvOptTA.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libSrvOptions_a-SrvOptTA.Tpo $(DEPDIR)/libSrvOptions_a-SrvOptTA.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='SrvOptTA.cpp' object='libSrvOptions_a-SrvOptTA.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libSrvOptions_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libSrvOptions_a-SrvOptTA.obj `if test -f 'SrvOptTA.cpp'; then $(CYGPATH_W) 'SrvOptTA.cpp'; else $(CYGPATH_W) '$(srcdir)/SrvOptTA.cpp'; fi` mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LIBRARIES) installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool clean-noinstLIBRARIES \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \ clean-libtool clean-noinstLIBRARIES cscopelist-am ctags \ ctags-am distclean distclean-compile distclean-generic \ distclean-libtool distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-dvi install-dvi-am install-exec \ install-exec-am install-html install-html-am install-info \ install-info-am install-man install-pdf install-pdf-am \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ tags tags-am uninstall uninstall-am #libSrvOptions_a_SOURCES += SrvOptTimeZone.cpp SrvOptTimeZone.h #libSrvOptions_a_SOURCES += SrvOptUserClass.cpp SrvOptUserClass.h # 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: dibbler-1.0.1/SrvOptions/SrvOptIAPrefix.cpp0000664000175000017500000000411412560471634015526 00000000000000/* * Dibbler - a portable DHCPv6 * * authors: Tomasz Mrugalski * Marek Senderski * changes: Krzysztof Wnuk * * */ #include "DHCPConst.h" #include "Opt.h" #include "OptIAPrefix.h" #include "SrvOptIAPrefix.h" #include "OptStatusCode.h" #include "Msg.h" #include "Logger.h" #include "Portable.h" TSrvOptIAPrefix::TSrvOptIAPrefix( char * buf, int bufsize, TMsg* parent) :TOptIAPrefix(buf,bufsize, parent) { int pos=0; while(pos0)&&(code<=24)) { if(allowOptInOpt(parent->getType(),OPTION_IAPREFIX,code)) { SPtr opt; opt = SPtr(); switch (code) { case OPTION_STATUS_CODE: opt =(Ptr*)SPtr (new TOptStatusCode(buf+pos,length,this->Parent)); break; default: Log(Warning) << "Option " << code<< " not supported " << " in message (type="<< parent->getType() <<")." << LogEnd; break; } if((opt)&&(opt->isValid())) SubOptions.append(opt); } else { Log(Warning) << "Illegal option received, opttype=" << code << " in field options of IA_PD option" << LogEnd; } } else { Log(Warning) <<"Unknown option in option IAPREFIX(optType=" << code << "). Option ignored." << LogEnd; }; pos+=length; } } TSrvOptIAPrefix::TSrvOptIAPrefix(SPtr prefix, char length, unsigned long pref, unsigned long valid, TMsg* parent) :TOptIAPrefix(prefix,length,pref,valid, parent) { } bool TSrvOptIAPrefix::doDuties() { return true; } dibbler-1.0.1/Messages/0000775000175000017500000000000012561700417011671 500000000000000dibbler-1.0.1/Messages/Makefile.am0000664000175000017500000000021712233256142013642 00000000000000noinst_LIBRARIES = libMessages.a libMessages_a_CPPFLAGS = -I$(top_srcdir)/Misc -I$(top_srcdir)/Options libMessages_a_SOURCES = Msg.cpp Msg.h dibbler-1.0.1/Messages/Msg.cpp0000664000175000017500000004321512560471634013055 00000000000000/* * Dibbler - a portable DHCPv6 * * authors: Tomasz Mrugalski * Marek Senderski * changes: Michal Kowalczuk * * released under GNU GPL v2 only licence */ #include #include #include #include "Portable.h" #include "DHCPConst.h" #include "SmartPtr.h" #include "Container.h" #include "Msg.h" #include "Opt.h" #include "OptAuthentication.h" #include "Logger.h" #include "hmac-sha-md5.h" class TNotifyScriptParams; TMsg::TMsg(int iface, SPtr addr, char* &buf, int &bufSize) :NotifyScripts(NULL) { setAttribs(iface, addr, 0, 0); if (bufSize<4) return; this->MsgType=buf[0]; unsigned char * buf2 = (unsigned char *)(buf+1); this->TransID= ((long)buf2[0])<<16 | ((long)buf2[1])<<8 | (long)buf2[2]; buf+=4; bufSize-=4; } TMsg::TMsg(int iface, SPtr addr, int msgType) :NotifyScripts(NULL) { long tmp = rand() % (255*255*255); setAttribs(iface,addr,msgType,tmp); } TMsg::TMsg(int iface, SPtr addr, int msgType, long transID) :NotifyScripts(NULL) { setAttribs(iface,addr,msgType,transID); } void TMsg::setAttribs(int iface, SPtr addr, int msgType, long transID) { PeerAddr_ = addr; Iface = iface; TransID = transID; IsDone = false; MsgType = msgType; DigestType_ = DIGEST_NONE; /* by default digest is none */ AuthDigestPtr_ = NULL; AuthDigestLen_ = 0; SPI_ = 0; } int TMsg::getSize() { int pktsize=0; TOptList::iterator opt; for (opt = Options.begin(); opt!=Options.end(); ++opt) { pktsize += (*opt)->getSize(); } return pktsize + 4; } unsigned long TMsg::getTimeout() { return 0; } long TMsg::getType() { return MsgType; } long TMsg::getTransID() { return TransID; } TOptList & TMsg::getOptLst() { return Options; } /* prepares binary version of this message, returns number of bytes used **/ int TMsg::storeSelf(char * buffer) { char *start = buffer; int tmp = this->TransID; *(buffer++) = (char)MsgType; /* ugly 3-byte version of htons/htonl */ buffer[2] = tmp%256; tmp = tmp/256; buffer[1] = tmp%256; tmp = tmp/256; buffer[0] = tmp%256; tmp = tmp/256; buffer+=3; TOptList::iterator option; for (option=Options.begin(); option!=Options.end(); ++option) { (*option)->storeSelf(buffer); buffer += (*option)->getSize(); } #ifndef MOD_DISABLE_AUTH calculateDigests(start, buffer - start); #endif return buffer-start; } void TMsg::calculateDigests(char* buffer, size_t len) { SPtr auth = (Ptr*)getOption(OPTION_AUTH); if (!auth) return; switch (auth->getProto()) { default: { Log(Error) << "AUTH: protocol " << auth->getProto() << " not supported yet." << LogEnd; return; } case AUTH_PROTO_DELAYED: { if (AuthKey_.empty()) { if (MsgType == SOLICIT_MSG) { return; // That's alright, no auth info in SOLICIT } Log(Error) << "AUTH: Can't sign delayed-auth option, key empty." << LogEnd; return; } if (auth->getAuthDataPtr()) { hmac_md5(buffer, len, (char*) &AuthKey_[0], AuthKey_.size() ,auth->getAuthDataPtr()); } return; } case AUTH_PROTO_RECONFIGURE_KEY: { if (AuthKey_.size() != RECONFIGURE_KEY_SIZE) { Log(Error) << "AUTH: Invalid size of reconfigure-key: expected " << RECONFIGURE_KEY_SIZE << ", actual size " << AuthKey_.size() << LogEnd; return; } if (auth->getAuthDataPtr()) { hmac_md5(buffer, len, (char*) &AuthKey_[0], AuthKey_.size() ,auth->getAuthDataPtr()); } return; } case AUTH_PROTO_NONE: { // don't calculate anything return; } case AUTH_PROTO_DIBBLER: { DigestTypes UsedDigestType; // for AAAAUTH use only HMAC-SHA1 UsedDigestType = DigestType_; if (getSPI() && !loadAuthKey()) { return; } if (getSPI() && !AuthKey_.empty() && UsedDigestType != DIGEST_NONE) { Log(Debug) << "Auth: Used digest type is " << getDigestName(UsedDigestType) << LogEnd; switch (UsedDigestType) { case DIGEST_PLAIN: memcpy(AuthDigestPtr_, "This is 32-byte plain testkey...", getDigestSize(UsedDigestType)); break; case DIGEST_HMAC_MD5: hmac_md5(buffer, len, (char*)&AuthKey_[0], AuthKey_.size(), (char *)AuthDigestPtr_); break; case DIGEST_HMAC_SHA1: hmac_sha(buffer, len, (char*)&AuthKey_[0], AuthKey_.size(), (char *)AuthDigestPtr_, 1); break; case DIGEST_HMAC_SHA224: hmac_sha(buffer, len, (char*)&AuthKey_[0], AuthKey_.size(), (char *)AuthDigestPtr_, 224); break; case DIGEST_HMAC_SHA256: hmac_sha(buffer, len, (char*)&AuthKey_[0], AuthKey_.size(), (char *)AuthDigestPtr_, 256); break; case DIGEST_HMAC_SHA384: hmac_sha(buffer, len, (char*)&AuthKey_[0], AuthKey_.size(), (char *)AuthDigestPtr_, 384); break; case DIGEST_HMAC_SHA512: hmac_sha(buffer, len, (char*)&AuthKey_[0], AuthKey_.size(), (char *)AuthDigestPtr_, 512); break; default: break; } PrintHex(std::string("Auth: Sending digest ") + getDigestName(UsedDigestType) +" : ", (uint8_t*)AuthDigestPtr_, getDigestSize(UsedDigestType)); } } } } SPtr TMsg::getOption(int type) { TOptList::iterator opt; for (opt = Options.begin(); opt!=Options.end(); ++opt) if ( (*opt)->getOptType()==type) return *opt; return SPtr(); } void TMsg::firstOption() { NextOpt = Options.begin(); } int TMsg::countOption() { return Options.size(); } SPtr TMsg::getOption() { if (NextOpt != Options.end()) { TOptList::iterator it = NextOpt; ++NextOpt; return (*it); } return SPtr(); } TMsg::~TMsg() { if (NotifyScripts) { delete NotifyScripts; } } SPtr TMsg::getRemoteAddr() { return PeerAddr_; } int TMsg::getIface() { return Iface; } bool TMsg::isDone() { return IsDone; } bool TMsg::isDone(bool done) { IsDone = done; return IsDone; } void TMsg::setAuthDigestPtr(char* ptr, unsigned len) { AuthDigestPtr_ = ptr; AuthDigestLen_ = len; } void TMsg::setAuthKey(const TKey& key) { AuthKey_ = key; PrintHex("Auth: setting key to: ", (uint8_t*)&AuthKey_[0], AuthKey_.size()); } bool TMsg::loadAuthKey() { unsigned len = 0; char * ptr = getAAAKey(SPI_, &len); AuthKey_.resize(len); memcpy(&AuthKey_[0], ptr, len); free(ptr); return (len>0); } TKey TMsg::getAuthKey() { return AuthKey_; } void TMsg::setSPI(uint32_t val) { SPI_ = val; } uint32_t TMsg::getSPI() { return SPI_; } bool TMsg::validateAuthInfo(char *buf, int bufSize, AuthProtocols proto, const DigestTypesLst& acceptedDigestTypes) { bool is_ok = false; bool dt_in_list = false; switch (proto) { case AUTH_PROTO_NONE: return true; case AUTH_PROTO_DELAYED: { SPtr auth = (Ptr*)getOption(OPTION_AUTH); if (!auth) { Log(Warning) << "AUTH: Mandatory AUTH option missing in delayed auth." << LogEnd; return false; } if (auth->getProto() != AUTH_PROTO_DELAYED) { Log(Warning) << "AUTH: Bad protocol in auth: expected 2(delayed auth), but got " << int(auth->getProto()) << ", key ignored." << LogEnd; return false; } if (auth->getAlgorithm() != 1) { Log(Warning) << "AUTH: Bad algorithm in auth option: expected 1 (HMAC-MD5), but got " << int(auth->getAlgorithm()) << ", key ignored." << LogEnd; return false; } if (MsgType == SOLICIT_MSG) { if (auth->getSize() != TOptAuthentication::OPT_AUTH_FIXED_SIZE + TOpt::OPTION6_HDR_LEN) { Log(Warning) << "AUTH: Received non-empty delayed-auth option in SOLICIT," << " expected empty." << LogEnd; return false; } else { return true; // delayed auth in Solicit should come in empty } } if (SPI_ == 0) { Log(Warning) << "AUTH: Received invalid SPI = 0." << LogEnd; return false; } if (!loadAuthKey()) { Log(Warning) << "AUTH: Failed to load delayed auth key with key id=" << std::hex << getSPI() << std::dec << LogEnd; return false; } // Ok, let's do validation char *rcvdAuthInfo = new char[RECONFIGURE_DIGEST_SIZE]; char *goodAuthInfo = new char[RECONFIGURE_DIGEST_SIZE]; memmove(rcvdAuthInfo, AuthDigestPtr_, DELAYED_AUTH_DIGEST_SIZE); memset(AuthDigestPtr_, 0, DELAYED_AUTH_DIGEST_SIZE); hmac_md5(buf, bufSize, (char*)&AuthKey_[0], AuthKey_.size(), goodAuthInfo); Log(Debug) << "Auth: Checking delayed-auth (HMAC-MD5) digest:" << LogEnd; PrintHex("Auth:received digest: ", (uint8_t*)rcvdAuthInfo, DELAYED_AUTH_DIGEST_SIZE); PrintHex("Auth: proper digest: ", (uint8_t*)goodAuthInfo, DELAYED_AUTH_DIGEST_SIZE); if (0 == memcmp(goodAuthInfo, rcvdAuthInfo, DELAYED_AUTH_DIGEST_SIZE)) is_ok = true; delete [] rcvdAuthInfo; delete [] goodAuthInfo; return is_ok; } case AUTH_PROTO_RECONFIGURE_KEY: { if (MsgType != RECONFIGURE_MSG) return true; SPtr auth = (Ptr*)getOption(OPTION_AUTH); if (!auth) { Log(Warning) << "AUTH: Mandatory AUTH option missing in RECONFIGURE." << LogEnd; return false; } if (auth->getProto() != AUTH_PROTO_RECONFIGURE_KEY) { Log(Warning) << "AUTH: Bad protocol in auth: expected 3(reconfigure-key), but got " << int(auth->getProto()) << ", key ignored." << LogEnd; return false; } if (auth->getAlgorithm() != 1) { Log(Warning) << "AUTH: Bad algorithm in auth option: expected 1, but got " << int(auth->getAlgorithm()) << ", key ignored." << LogEnd; return false; } if (auth->getRDM() != AUTH_REPLAY_NONE) { Log(Warning) << "AUTH: Bad replay detection method (RDM) value: expected 0," << ", but got " << auth->getRDM() << LogEnd; // This is small issue enough, so we can continue. } if (AuthKey_.size() != RECONFIGURE_KEY_SIZE) { Log(Error) << "AUTH: Failed to verify incoming RECONFIGURE message due to " << "reconfigure-key issue: expected size " << RECONFIGURE_KEY_SIZE << ", but got " << AuthKey_.size() << ", message dropped." << LogEnd; return false; } if (!AuthDigestPtr_) { Log(Error) << "AUTH: Failed to verify incoming RECONFIGURE message: " << "AuthDigestPtr_ not set, message dropped." << LogEnd; return false; } char *rcvdAuthInfo = new char[RECONFIGURE_DIGEST_SIZE]; char *goodAuthInfo = new char[RECONFIGURE_DIGEST_SIZE]; memmove(rcvdAuthInfo, AuthDigestPtr_, RECONFIGURE_DIGEST_SIZE); memset(AuthDigestPtr_, 0, RECONFIGURE_DIGEST_SIZE); hmac_md5(buf, bufSize, (char*)&AuthKey_[0], AuthKey_.size(), goodAuthInfo); Log(Debug) << "Auth: Checking reconfigure-key" << LogEnd; PrintHex("Auth:received digest: ", (uint8_t*)rcvdAuthInfo, RECONFIGURE_DIGEST_SIZE); PrintHex("Auth: proper digest: ", (uint8_t*)goodAuthInfo, RECONFIGURE_DIGEST_SIZE); if (0 == memcmp(goodAuthInfo, rcvdAuthInfo, RECONFIGURE_DIGEST_SIZE)) is_ok = true; delete [] rcvdAuthInfo; delete [] goodAuthInfo; return is_ok; } case AUTH_PROTO_DIBBLER: break; } //empty list means that any digest type is accepted if (acceptedDigestTypes.empty()) { dt_in_list = true; } else { // check if the digest is allowed AUTH list for (unsigned i = 0; i < acceptedDigestTypes.size(); ++i) { if (acceptedDigestTypes[i] == DigestType_) { dt_in_list = true; break; } } } if (dt_in_list == false) { if (DigestType_ == DIGEST_NONE) Log(Warning) << "Authentication option is required." << LogEnd; else Log(Warning) << "Authentication method " << getDigestName(DigestType_) << " not accepted." << LogEnd; return false; } if (DigestType_ == DIGEST_NONE) { is_ok = true; } else if (AuthDigestPtr_) { #ifndef MOD_DISABLE_AUTH if (AuthKey_.empty() && !loadAuthKey()) { Log(Debug) << "Auth: Failed to load key with SPI=" << SPI_ << LogEnd; return false; } unsigned AuthInfoLen = getDigestSize(DigestType_); char *rcvdAuthInfo = new char[AuthInfoLen]; char *goodAuthInfo = new char[AuthInfoLen]; memmove(rcvdAuthInfo, AuthDigestPtr_, AuthInfoLen); memset(AuthDigestPtr_, 0, AuthInfoLen); switch (DigestType_) { case DIGEST_PLAIN: /// @todo: load plain text from a file memcpy(goodAuthInfo, "This is 32-byte plain testkey...", 32); break; case DIGEST_HMAC_MD5: hmac_md5(buf, bufSize, (char*)&AuthKey_[0], AuthKey_.size(), goodAuthInfo); break; case DIGEST_HMAC_SHA1: hmac_sha(buf, bufSize, (char*)&AuthKey_[0], AuthKey_.size(), goodAuthInfo, 1); break; case DIGEST_HMAC_SHA224: hmac_sha(buf, bufSize, (char*)&AuthKey_[0], AuthKey_.size(), goodAuthInfo, 224); break; case DIGEST_HMAC_SHA256: hmac_sha(buf, bufSize, (char*)&AuthKey_[0], AuthKey_.size(), goodAuthInfo, 256); break; case DIGEST_HMAC_SHA384: hmac_sha(buf, bufSize, (char*)&AuthKey_[0], AuthKey_.size(), goodAuthInfo, 384); break; case DIGEST_HMAC_SHA512: hmac_sha(buf, bufSize, (char*)&AuthKey_[0], AuthKey_.size(), goodAuthInfo, 512); break; default: break; } if (0 == memcmp(goodAuthInfo, rcvdAuthInfo, AuthInfoLen)) is_ok = true; Log(Debug) << "Auth:Checking using digest method: " << getDigestName(DigestType_) << LogEnd; PrintHex("Auth:received digest: ", (uint8_t*)rcvdAuthInfo, AuthInfoLen); PrintHex("Auth: proper digest: ", (uint8_t*)goodAuthInfo, AuthInfoLen); delete [] rcvdAuthInfo; delete [] goodAuthInfo; if (is_ok) Log(Info) << "Auth: Digest correct." << LogEnd; else { Log(Warning) << "Auth: Digest incorrect." << LogEnd; } #endif } else { Log(Error) << "Auth: Digest mode set to " << DigestType_ << ", but AUTH option not set." << LogEnd; return false; } return is_ok; } /** * checks if appropriate number of server/client IDs has been attached * * @param srvIDmandatory - is ServerID option mandatory? (false==ServerID not allowed) * @param clntIDmandatory - is ClientID option mandatory?(false==ClientID is optional) * * @return */ bool TMsg::check(bool clntIDmandatory, bool srvIDmandatory) { SPtr option; int clntCnt=0; int srvCnt =0; int authCnt = 0; bool status = true; for (TOptList::iterator opt=Options.begin(); opt!=Options.end(); ++opt) { switch ( (*opt)->getOptType() ) { case OPTION_CLIENTID: clntCnt++; break; case OPTION_SERVERID: srvCnt++; break; case OPTION_AUTH: authCnt++; break; default: break; /* ignore the rest */ } } if (clntIDmandatory && (clntCnt!=1) ) { Log(Warning) << "Exactly 1 ClientID option required in the " << this->getName() << " message, but " << clntCnt << " received."; status = false; } if (srvIDmandatory && (srvCnt!=1) ) { Log(Warning) << "Exactly 1 ServerID option required in the " << this->getName() << " message, but " << srvCnt << " received."; status = false; } if (!srvIDmandatory && (srvCnt)) { Log(Warning) << "No ServerID option is allowed in the " << this->getName() << " message, but " << srvCnt << " received."; status = false; } if (authCnt > 1) { Log(Warning) << "No more that one authentication option is allowed in the " << this->getName() << " message, but " << authCnt << " received."; status = false; } if (!status) { Log(Cont) << "Message dropped." << LogEnd; IsDone = true; } return status; } bool TMsg::delOption(int code) { for (TOptList::iterator opt = Options.begin(); opt!=Options.end(); ++opt) { if ( (*opt)->getOptType() == code) { Options.erase(opt); firstOption(); return true; } } return false; } void* TMsg::getNotifyScriptParams() { if (!NotifyScripts) { NotifyScripts = new TNotifyScriptParams(); } return NotifyScripts; } void TMsg::setLocalAddr(SPtr myaddr) { LocalAddr_ = myaddr; } SPtr TMsg::getLocalAddr() { return LocalAddr_; } dibbler-1.0.1/Messages/Msg.h0000664000175000017500000000644012420532141012503 00000000000000/* * Dibbler - a portable DHCPv6 * * authors: Tomasz Mrugalski * Marek Senderski * changes: Michal Kowalczuk * * released under GNU GPL v2 only licence */ class TMsg; #ifndef MSG_H #define MSG_H #include #include #include #include #include "SmartPtr.h" #include "Container.h" #include "DHCPConst.h" #include "IPv6Addr.h" #include "Opt.h" #include "Key.h" #include "ScriptParams.h" // Hey! It's grampa of all messages class TMsg { public: // Used to create TMsg object (normal way) TMsg(int iface, SPtr addr, int msgType); TMsg(int iface, SPtr addr, int msgType, long transID); // used to create TMsg object based on received char[] data TMsg(int iface, SPtr addr, char* &buf, int &bufSize); virtual int getSize(); // transmit (or retransmit) virtual unsigned long getTimeout(); virtual int storeSelf(char * buffer); virtual std::string getName() const = 0; // returns requested option (or NULL, there is no such option) SPtr getOption(int type); void firstOption(); int countOption(); void addOption(SPtr opt) { Options.push_back(opt); } virtual SPtr getOption(); long getType(); long getTransID(); TOptList & getOptLst(); int getIface(); virtual ~TMsg(); bool isDone(); bool isDone(bool done); // useful auth stuff below void calculateDigests(char* buffer, size_t len); /// @todo: remove from here (and move to AUTH option) void setAuthDigestPtr(char* ptr, unsigned len); bool loadAuthKey(); void setAuthKey(const TKey& key); TKey getAuthKey(); bool validateAuthInfo(char *buf, int bufSize, AuthProtocols proto, const DigestTypesLst& acceptedDigestTypes); uint32_t getSPI(); void setSPI(uint32_t val); DigestTypes DigestType_; // notify scripts stuff void* getNotifyScriptParams(); SPtr getRemoteAddr(); void setLocalAddr(SPtr myaddr); SPtr getLocalAddr(); protected: int MsgType; long TransID; bool delOption(int code); TOptList Options; TOptList::iterator NextOpt; // to be removed together with firstOption() and getOption(); void setAttribs(int iface, SPtr addr, int msgType, long transID); virtual bool check(bool clntIDmandatory, bool srvIDmandatory); bool IsDone; // Is this transaction done? int Iface; // logical interface (for direct messages it equals PhysicalIface // for relayed messages Iface points to relayX, PhysicalInterface to ethX) /// Address of the corresponding node (received from or to be sent to) /// @todo: rename to RemoteAddr_ SPtr PeerAddr_; /// Address the packet was received on SPtr LocalAddr_; // Auth stuff uint32_t SPI_; // Key identifier char* AuthDigestPtr_; // Digest (pointer to Authentication Information field of OPTION AUTH) unsigned AuthDigestLen_; // Length of the digest TKey AuthKey_; // Auth Key // a pointer to NotifyScriptParams structure (if defined) TNotifyScriptParams* NotifyScripts; }; typedef std::list< SPtr > TMsgLst; #endif dibbler-1.0.1/Messages/Makefile.in0000664000175000017500000004771012561652534013675 00000000000000# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = Messages DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/depcomp ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/libtool.m4 \ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/include/dibbler-config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = LIBRARIES = $(noinst_LIBRARIES) ARFLAGS = cru AM_V_AR = $(am__v_AR_@AM_V@) am__v_AR_ = $(am__v_AR_@AM_DEFAULT_V@) am__v_AR_0 = @echo " AR " $@; am__v_AR_1 = libMessages_a_AR = $(AR) $(ARFLAGS) libMessages_a_LIBADD = am_libMessages_a_OBJECTS = libMessages_a-Msg.$(OBJEXT) libMessages_a_OBJECTS = $(am_libMessages_a_OBJECTS) AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)/include depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) LTCXXCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CXXFLAGS) $(CXXFLAGS) AM_V_CXX = $(am__v_CXX_@AM_V@) am__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@) am__v_CXX_0 = @echo " CXX " $@; am__v_CXX_1 = CXXLD = $(CXX) CXXLINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \ $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CXXLD = $(am__v_CXXLD_@AM_V@) am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@) am__v_CXXLD_0 = @echo " CXXLD " $@; am__v_CXXLD_1 = COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(libMessages_a_SOURCES) DIST_SOURCES = $(libMessages_a_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALLOCA = @ALLOCA@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ ARCH = @ARCH@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ EXTRA_DIST_SUBDIRS = @EXTRA_DIST_SUBDIRS@ FGREP = @FGREP@ GREP = @GREP@ GTEST_INCLUDES = @GTEST_INCLUDES@ GTEST_LDADD = @GTEST_LDADD@ GTEST_LDFLAGS = @GTEST_LDFLAGS@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LINKPRINT = @LINKPRINT@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PORT_CFLAGS = @PORT_CFLAGS@ PORT_LDFLAGS = @PORT_LDFLAGS@ PORT_SUBDIR = @PORT_SUBDIR@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ subdirs = @subdirs@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ noinst_LIBRARIES = libMessages.a libMessages_a_CPPFLAGS = -I$(top_srcdir)/Misc -I$(top_srcdir)/Options libMessages_a_SOURCES = Msg.cpp Msg.h all: all-am .SUFFIXES: .SUFFIXES: .cpp .lo .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign Messages/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign Messages/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstLIBRARIES: -test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES) libMessages.a: $(libMessages_a_OBJECTS) $(libMessages_a_DEPENDENCIES) $(EXTRA_libMessages_a_DEPENDENCIES) $(AM_V_at)-rm -f libMessages.a $(AM_V_AR)$(libMessages_a_AR) libMessages.a $(libMessages_a_OBJECTS) $(libMessages_a_LIBADD) $(AM_V_at)$(RANLIB) libMessages.a mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libMessages_a-Msg.Po@am__quote@ .cpp.o: @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $< .cpp.obj: @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .cpp.lo: @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LTCXXCOMPILE) -c -o $@ $< libMessages_a-Msg.o: Msg.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libMessages_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libMessages_a-Msg.o -MD -MP -MF $(DEPDIR)/libMessages_a-Msg.Tpo -c -o libMessages_a-Msg.o `test -f 'Msg.cpp' || echo '$(srcdir)/'`Msg.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libMessages_a-Msg.Tpo $(DEPDIR)/libMessages_a-Msg.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='Msg.cpp' object='libMessages_a-Msg.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libMessages_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libMessages_a-Msg.o `test -f 'Msg.cpp' || echo '$(srcdir)/'`Msg.cpp libMessages_a-Msg.obj: Msg.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libMessages_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libMessages_a-Msg.obj -MD -MP -MF $(DEPDIR)/libMessages_a-Msg.Tpo -c -o libMessages_a-Msg.obj `if test -f 'Msg.cpp'; then $(CYGPATH_W) 'Msg.cpp'; else $(CYGPATH_W) '$(srcdir)/Msg.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libMessages_a-Msg.Tpo $(DEPDIR)/libMessages_a-Msg.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='Msg.cpp' object='libMessages_a-Msg.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libMessages_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libMessages_a-Msg.obj `if test -f 'Msg.cpp'; then $(CYGPATH_W) 'Msg.cpp'; else $(CYGPATH_W) '$(srcdir)/Msg.cpp'; fi` mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LIBRARIES) installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool clean-noinstLIBRARIES \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \ clean-libtool clean-noinstLIBRARIES cscopelist-am ctags \ ctags-am distclean distclean-compile distclean-generic \ distclean-libtool distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-dvi install-dvi-am install-exec \ install-exec-am install-html install-html-am install-info \ install-info-am install-man install-pdf install-pdf-am \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ tags tags-am uninstall uninstall-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: dibbler-1.0.1/scripts/0000755000175000017500000000000012277734640011620 500000000000000dibbler-1.0.1/scripts/hdr_strip0000775000175000017500000000125512233256142013455 00000000000000#!/usr/bin/perl -w $name = $ARGV[0]; print "FILE: $name\n"; $file = open(FILE, $name) or die "Unable to open $name file."; @tmptable = ; $data = join "", @tmptable; close(FILE); # GOOD $logPattern = '/\*[^*]*\*+([^/*][^*]*\*+)*/'; #$logPattern = '(/\*[^*]*\*+([^/*][^*]*\*+)*/)'; $logPattern = '(/\*[^*]*\*+([^/*][^*])*Log([^/*][^*]*\*+)*/)'; $hdrPattern = '(/\*[^*]*\*+([^/*])*GNU([^/*][^*]*\*+)*/)'; #if ($data =~ s%$logPattern%LOG%smg) { #$cmt = $1; #} if ($data =~ s%$hdrPattern%HDR%smg) { $hdr = $1; } #$data =~ s#/\*[^*]*\*+([^/*][^*]*\*+)*/|//[^\n]*|("(\\.|[^"\\])*"|'(\\.|[^'\\])*'|.[^/"'\\]*)#defined $2 ? $2 : ""#gse; print "====\n$data===$cmt===\n$hdr===\n"; dibbler-1.0.1/scripts/hdr_ins0000775000175000017500000000103012233256142013074 00000000000000#!/usr/bin/perl -w $name = $ARGV[0]; print "FILE: $name\n"; open(FILE, $name) or die "Unable to open $name file."; @tmptable = ; $data = join "", @tmptable; close(FILE); $hdr='/* * Dibbler - a portable DHCPv6 * * authors: Tomasz Mrugalski * Marek Senderski * * released under GNU GPL v2 or later licence */ '; unlink("$name") or die "Unable to delete $name file."; open(RESULT, ">$name") or die "Unable to create $name file\n"; print RESULT "$hdr\n$data"; close(RESULT); dibbler-1.0.1/scripts/remote-autoconf0000775000175000017500000000022712233256142014564 00000000000000#!/bin/sh echo "\033[32mRemote Autoconf script." echo "Received remote address $1 from srv $2 on $3/$4" echo "Remote autoconf script complete.\033[0m" dibbler-1.0.1/scripts/Makefile0000644000175000017500000000031512277734640013177 00000000000000include ../Makefile.inc MAKEFLAGS= all: test14 OBJECTS = test14.o test14: test14.cpp ../misc/Logger.cpp cd ../misc; $(MAKE) Logger.o $(CXX) $(OPTS) -o $@ $< ../misc/Logger.o objs: $(OBJECTS) libs: dibbler-1.0.1/scripts/mo-flags.c0000644000175000017500000001176112277722750013416 00000000000000 #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #define IF_RA_MANAGED 0x40 #define IF_RA_OTHERCONF 0x80 int main() { int sd, status; int seq = time(NULL); struct sockaddr_nl nl_addr; struct nlmsghdr *nlm_hdr; struct rtgenmsg *rt_genmsg; char buf[NLMSG_ALIGN(sizeof(struct nlmsghdr)) + NLMSG_ALIGN(sizeof(struct rtgenmsg))]; struct msghdr msgh; struct nlmsghdr *nlm; size_t newsize = 65536, size = 0; int msg_len; char *nbuf = NULL; int nlm_len; struct ifinfomsg *ifim; struct rtattr *rta, *rta1; size_t rtasize, rtapayload, rtasize1; void *rtadata; char if_name[10]; sd = socket(PF_NETLINK, SOCK_RAW, NETLINK_ROUTE); if (sd < 0) { perror("socket"); return -1; } memset(&nl_addr, 0, sizeof(nl_addr)); nl_addr.nl_family = AF_NETLINK; if (bind(sd, (struct sockaddr *)&nl_addr, sizeof(nl_addr)) < 0) { perror("bind"); return -1; } memset(&buf, 0, sizeof(buf)); nlm_hdr = (struct nlmsghdr *)buf; nlm_hdr->nlmsg_len = NLMSG_LENGTH(sizeof(*rt_genmsg)); nlm_hdr->nlmsg_type = RTM_GETLINK; nlm_hdr->nlmsg_flags = NLM_F_ROOT | NLM_F_REQUEST; nlm_hdr->nlmsg_pid = getpid(); nlm_hdr->nlmsg_seq = seq; memset(&nl_addr, 0, sizeof(nl_addr)); nl_addr.nl_family = AF_NETLINK; rt_genmsg = (struct rtgenmsg *)NLMSG_DATA(nlm_hdr); rt_genmsg->rtgen_family = AF_INET6; status = sendto(sd, (void *)nlm_hdr, nlm_hdr->nlmsg_len, 0, (struct sockaddr *)&nl_addr, sizeof(nl_addr)); if (status < 0) { perror("sendto"); return -1; } for (;;) { void *newbuf = realloc(nbuf, newsize); if (newbuf == NULL) { perror("realloc"); return -1; } nbuf = newbuf; /* If call intrupted do it again */ do { struct iovec iov = {nbuf, newsize}; memset(&msgh, 0, sizeof(msgh)); msgh.msg_name = (void *)&nl_addr; msgh.msg_namelen = sizeof(nl_addr); msgh.msg_iov = &iov; msgh.msg_iovlen = 1; msg_len = recvmsg(sd, &msgh, 0); }while (msg_len < 0 && errno == EINTR); /* If msg truncated because of less size, call it with double the size */ if (msg_len < 0 || msgh.msg_flags & MSG_TRUNC) { size = newsize; newsize *= 2; continue; } else if (msg_len == 0) break; for (nlm = (struct nlmsghdr *)nbuf; NLMSG_OK(nlm, msg_len); nlm = (struct nlmsghdr *)NLMSG_NEXT(nlm, msg_len)) { if (nlm->nlmsg_type == NLMSG_DONE) { printf("NLMSG_DONE\n"); return 0; } else if (nlm->nlmsg_type == NLMSG_ERROR) { printf("NLMSG_ERROR\n"); return -1; } if (nlm->nlmsg_pid != getpid() || nlm->nlmsg_seq != seq) continue; ifim = (struct ifinfomsg *)NLMSG_DATA(nlm); if (ifim->ifi_family != AF_INET6 || nlm->nlmsg_type != RTM_NEWLINK) { printf("Not AF_INET6 or RTM_NEWLINK request\n"); return -1; } nlm_len = msg_len; rtasize = NLMSG_PAYLOAD(nlm, nlm_len) - NLMSG_ALIGN(sizeof(*ifim)); for (rta = (struct rtattr *) (((char *) NLMSG_DATA(nlm)) + NLMSG_ALIGN(sizeof(*ifim))); RTA_OK(rta, rtasize); rta = RTA_NEXT(rta, rtasize)) { rtadata = RTA_DATA(rta); rtapayload = RTA_PAYLOAD(rta); switch (rta->rta_type) { case IFLA_PROTINFO: rtasize1 = rta->rta_len; for (rta1 = (struct rtattr *)rtadata; RTA_OK(rta1, rtasize1); rta1 = RTA_NEXT(rta1, rtasize1)) { void *rtadata1 = RTA_DATA(rta1); switch(rta1->rta_type) { case IFLA_INET6_FLAGS: if_indextoname(ifim->ifi_index, if_name); printf("interface: %s\n", if_name); if (*((u_int32_t *)rtadata1) & IF_RA_MANAGED) printf("\tmanaged flag is set\n"); else printf("\tmanaged flag is not set\n"); if (*((u_int32_t *)rtadata1) & IF_RA_OTHERCONF) printf("\tother flag is set\n"); else printf("\tother flag is not set\n"); break; } } break; } } } } } dibbler-1.0.1/scripts/bison-sanitizer.py0000775000175000017500000000211112233256142015216 00000000000000#!/usr/bin/python # Note: this script is not needed. It is kept for sentimental reasons import re import sys def expandMacro(text, macro_name): # do the magic here members = re.compile(r'#define (YY_ClntParser_MEMBERS) ([^#]*)', re.MULTILINE|re.DOTALL) m = members.search(text) if m: # found MEMBERS! print(">>>>%s<<<<" % m.group(2)) else: print("ClntParser_MEMBERS not found\n") return text members_used = re.compile('^ YY_ClntParser_MEMBERS', re.MULTILINE) puthere = members_used.search(text) if puthere: text = text[0:puthere.start()] + m.group(2) + text[puthere.end():] text = text[0:m.start()] + text[m.end():] return text if (len(sys.argv) < 2): print("Usage: bison-sanitizer.py input-file.h") sys.exit(-1) else: infile = sys.argv[1] if (len(sys.argv) >=3): outfile = sys.argv[2] else: outfile = infile + "-new"; f = open(infile, 'r') content = f.read() f.close() output = expandMacro(content, "YY_ClntParser_MEMBERS") fout = open(outfile, 'w') fout.write(output) fout.close() dibbler-1.0.1/scripts/fedora/0000755000175000017500000000000012277734640013060 500000000000000dibbler-1.0.1/scripts/fedora/dibbler.spec0000644000175000017500000000175612277722750015267 00000000000000Summary: Dibbler - a portable DHCPv6 Name: dibbler Version: 1.0.0RC1 Release: 1 License: GPL Group: Applications/Internet Source: %{name}-%{version}.tar.gz URL: http://klub.com.pl/dhcpv6/ Packager: Patrick PICHON BuildRoot: /var/tmp/%{name}-buildroot %description Dibbler is a portable DHCPv6 implementation. It supports stateful (i.e. IPv6 address granting and IPv6 prefix delegation) as well as stateless (i.e. option granting) autoconfiguration for IPv6. Currently Linux 2.4 or later and Windows XP or later are supported. %prep %setup %build ./configure --prefix=/usr make %install rm -rf $RPM_BUILD_ROOT make DESTDIR=$RPM_BUILD_ROOT install mkdir -p $RPM_BUILD_ROOT/var/lib/dibbler mkdir -p $RPM_BUILD_ROOT/etc/dibbler rm -rf $RPM_BUILD_ROOT%{_docdir}/%{name} %clean rm -rf $RPM_BUILD_ROOT %files %doc AUTHORS TODO RELNOTES LICENSE /etc/dibbler /var/lib/dibbler /usr/sbin/* %{_mandir}/* /usr/share/* %changelog * Fri Aug 30 2013 Patrick Pichon - Initial RPM for dedibox dibbler-1.0.1/scripts/hdr_mass0000775000175000017500000000022612233256142013254 00000000000000#!/usr/bin/perl -w open(FILE, $ARGV[0]) or die "Unable to open '$ARGV[0]' file.\n"; while ($list = ) { `./hdr_ins $list`; } close(FILE);dibbler-1.0.1/scripts/hdr0000775000175000017500000000044412233256142012233 00000000000000#!/usr/bin/perl -w if (1) { @list = `find .. -name \*.cpp -or -name \*.h`; } else { open(FILE, $ARGV[0]) or die "Unable to open $ARGV[0] file."; @list = ; close(FILE); }; foreach $file (@list) { if (`grep "GPL" $file`) { # print "GPL $file"; } else { print "$file"; } } dibbler-1.0.1/scripts/notify-scripts/0000755000175000017500000000000012304040124014567 500000000000000dibbler-1.0.1/scripts/notify-scripts/client-notify-macos.sh0000755000175000017500000000076012304040124020735 00000000000000#!/bin/sh ServiceID=`echo show State:/Network/Global/IPv6 | /usr/sbin/scutil | awk '/PrimaryService/ { print $3 }'` echo $ServiceID echo "open" > /tmp/resolv.conf-dhcp echo "d.init" >> /tmp/resolv.conf-dhcp echo "d.add ServerAddresses * $SRV_OPTION23" >> /tmp/resolv.conf-dhcp echo "d.add DomainName $SRV_OPTION24" >> /tmp/resolv.conf-dhcp echo "set State:/Network/Service/$ServiceID/DNS" >> /tmp/resolv.conf-dhcp echo "quit" >> /tmp/resolv.conf-dhcp /usr/sbin/scutil < /tmp/resolv.conf-dhcp dibbler-1.0.1/scripts/notify-scripts/client-notify-win32.cmd0000644000175000017500000000031112304040124020713 00000000000000@echo off echo Running Windows script client-notify-win32.cmd echo %1 address %ADDR1% on interface %IFACE%/%IFINDEX% echo Received domain %SRV_OPTION24% echo Received DNS servers %SRV_OPTION23% dibbler-1.0.1/scripts/notify-scripts/server-notify-win32.cmd0000644000175000017500000000034212304040124020747 00000000000000@echo off rem %1 denotes operation. Allowed operations: add, update, delete, expire rem Uncomment this to print out available variables rem set @echo %1 %ADDR1% for client %SRV_OPTION1% on interface %IFACE%/%IFINDEX% dibbler-1.0.1/scripts/notify-scripts/client-notify-bsd.sh0000755000175000017500000000554312304040124020407 00000000000000#!/usr/local/bin/bash # author: Sly Midnight # This script was tested on OpenBSD, but it is likely to work on other BSDs as well. version="v0.2.3-openbsd" LOGFILE=/var/lib/dibbler/client-notify-bsd.log # uncomment this to get full list of available variables set >> $LOGFILE echo "Argument to script: $1 version: $version" >> $LOGFILE echo "-----------" >> $LOGFILE if [ -n "$OPTION_NEXT_HOP" ]; then route -n delete -inet6 default > /dev/null 2>&1 route -n add -inet6 default ${OPTION_NEXT_HOP}%$IFACE echo "Added default route via ${OPTION_NEXT_HOP} on interface $IFACE/$IFINDEX" >> $LOGFILE fi if [ -n "$OPTION_NEXT_HOP_RTPREFIX" ]; then NEXT_HOP=`echo ${OPTION_NEXT_HOP_RTPREFIX} | awk '{print $1}'` NETWORK=`echo ${OPTION_NEXT_HOP_RTPREFIX} | awk '{print $2}'` #LIFETIME=`echo ${OPTION_NEXT_HOP_RTPREFIX} | awk '{print $3}'` METRIC=`echo ${OPTION_NEXT_HOP_RTPREFIX} | awk '{print $4}'` if [ "$NETWORK" == "::/0" ]; then route -n delete -inet6 default > /dev/null 2>&1 route -n add -inet6 default ${OPTION_NEXT_HOP}%$IFACE echo "Added default route via ${OPTION_NEXT_HOP} on interface $IFACE/$IFINDEX" >> $LOGFILE else route -n add -inet6 ${NETWORK} ${NEXT_HOP}%$IFACE echo "Added nexthop to network ${NETWORK} via ${NEXT_HOP} on interface $IFACE/$IFINDEX, metric ${METRIC}" >> $LOGFILE fi fi if [ -n "$OPTION_RTPREFIX" ]; then ONLINK=`echo ${OPTION_RTPREFIX} | awk '{print $1}'` METRIC=`echo ${OPTION_RTPREFIX} | awk '{print $3}'` route -n add -inet6 ${ONLINK}%$IFACE -iface echo "Added route to network ${ONLINK} on interface $IFACE/$IFINDEX onlink, metric ${METRIC}" >> $LOGFILE fi if [ -n "$ADDR1" ]; then echo "Address ${ADDR1} (operation $1) to client $REMOTE_ADDR on inteface $IFACE/$IFINDEX" >> $LOGFILE ifconfig $IFACE inet6 ${ADDR1} prefixlen 64 default_route=`echo -n ${ADDR1} | awk -F\: '{print $1":"$2":"$3":"$4"::1"; }'` route -n delete -inet6 default route -n add -inet6 default ${default_route} echo "Added default route via ${default_route} on interface $IFACE/$IFINDEX" >> $LOGFILE if [ -n "$SRV_OPTION23" ]; then echo ${SRV_OPTION23} | awk -F' ' '{ print "nameserver "$1"\nnameserver "$2; }' >> /etc/resolv.conf cat /etc/resolv.conf | sort -u > /etc/resolv.tmp mv -f /etc/resolv.tmp /etc/resolv.conf echo "DNS servers ${SRV_OPTION23} (operation $1) to client $REMOTE_ADDR on inteface $IFACE/$IFINDEX" >> $LOGFILE fi fi if [ -n "$PREFIX1" ]; then echo "Prefix ${PREFIX1} (operation $1) to client $REMOTE_ADDR on inteface $IFACE/$IFINDEX" >> $LOGFILE PREFIXIFACE=`cat /etc/dibbler/client.conf | grep -i downlink | grep -v -e '^#' | awk -F" " '{ print $2; }' | sed 's/\"//g'` ifconfig $PREFIXIFACE inet6 "$PREFIX1"1 prefixlen $PREFIX1LEN fi # sample return code. Dibbler will just print it out. exit 3 dibbler-1.0.1/scripts/notify-scripts/server-notify.sh0000775000175000017500000000141112233256142017673 00000000000000#!/bin/bash # this is example notify script that can be invoked on a server side # This script will be called by dibbler-server with a single parameter # describing operation (add, update, delete, expire) # # Many parameters will be passed as environment variables LOGFILE=/var/lib/dibbler/server-notify.log echo "---$1--------" >> $LOGFILE date >> $LOGFILE # uncomment this to get full list of available variables #set >> $LOGFILE if [ "$ADDR1" != "" ]; then echo "Address ${ADDR1} (operation $1) to client $REMOTE_ADDR on inteface $IFACE/$IFINDEX" >> $LOGFILE fi if [ "$PREFIX1" != "" ]; then echo "Prefix ${PREFIX1} (operation $1) to client $REMOTE_ADDR on inteface $IFACE/$IFINDEX" >> $LOGFILE fi # sample return code. Dibbler will just print it out. exit 3 dibbler-1.0.1/scripts/notify-scripts/client-notify-linux.sh0000755000175000017500000000353412304040124020774 00000000000000#!/bin/bash LOGFILE=/var/lib/dibbler/client.sh-log # uncomment this to get full list of available variables #set >> $LOGFILE echo "-----------" >> $LOGFILE if [ "$OPTION_NEXT_HOP" != "" ]; then ip -6 route del default > /dev/null 2>&1 ip -6 route add default via ${OPTION_NEXT_HOP} dev $IFACE echo "Added default route via ${OPTION_NEXT_HOP} on interface $IFACE/$IFINDEX" >> $LOGFILE fi if [ "$OPTION_NEXT_HOP_RTPREFIX" != "" ]; then NEXT_HOP=`echo ${OPTION_NEXT_HOP_RTPREFIX} | awk '{print $1}'` NETWORK=`echo ${OPTION_NEXT_HOP_RTPREFIX} | awk '{print $2}'` #LIFETIME=`echo ${OPTION_NEXT_HOP_RTPREFIX} | awk '{print $3}'` METRIC=`echo ${OPTION_NEXT_HOP_RTPREFIX} | awk '{print $4}'` if [ "$NETWORK" == "::/0" ]; then ip -6 route del default > /dev/null 2>&1 ip -6 route add default via ${OPTION_NEXT_HOP} dev $IFACE echo "Added default route via ${OPTION_NEXT_HOP} on interface $IFACE/$IFINDEX" >> $LOGFILE else ip -6 route add ${NETWORK} nexthop via ${NEXT_HOP} dev $IFACE weight ${METRIC} echo "Added nexthop to network ${NETWORK} via ${NEXT_HOP} on interface $IFACE/$IFINDEX, metric ${METRIC}" >> $LOGFILE fi fi if [ "$OPTION_RTPREFIX" != "" ]; then ONLINK=`echo ${OPTION_RTPREFIX} | awk '{print $1}'` METRIC=`echo ${OPTION_RTPREFIX} | awk '{print $3}'` ip -6 route add ${ONLINK} dev $IFACE onlink metric ${METRIC} echo "Added route to network ${ONLINK} on interface $IFACE/$IFINDEX onlink, metric ${METRIC}" >> $LOGFILE fi if [ "$ADDR1" != "" ]; then echo "Address ${ADDR1} (operation $1) to client $REMOTE_ADDR on inteface $IFACE/$IFINDEX" >> $LOGFILE fi if [ "$PREFIX1" != "" ]; then echo "Prefix ${PREFIX1} (operation $1) to client $REMOTE_ADDR on inteface $IFACE/$IFINDEX" >> $LOGFILE fi # sample return code. Dibbler will just print it out. exit 3 dibbler-1.0.1/include/0000775000175000017500000000000012561700415011543 500000000000000dibbler-1.0.1/include/dibbler-config.h.in0000644000175000017500000002341312277722750015122 00000000000000/* include/dibbler-config.h.in. Generated from configure.ac by autoheader. */ /* Define to one of `_getb67', `GETB67', `getb67' for Cray-2 and Cray-YMP systems. This function is required for `alloca.c' support on those systems. */ #undef CRAY_STACKSEG_END /* Define to 1 if using `alloca.c'. */ #undef C_ALLOCA /* Define to 1 if you have `alloca', as a function or macro. */ #undef HAVE_ALLOCA /* Define to 1 if you have and it should be used (not on Ultrix). */ #undef HAVE_ALLOCA_H /* Define to 1 if you have the header file. */ #undef HAVE_ARPA_INET_H /* Define to 1 if you have the `bzero' function. */ #undef HAVE_BZERO /* Define to 1 if you have the declaration of `IPV6_PKTINFO', and to 0 if you don't. */ #undef HAVE_DECL_IPV6_PKTINFO /* Define to 1 if you have the declaration of `IPV6_RECVPKTINFO', and to 0 if you don't. */ #undef HAVE_DECL_IPV6_RECVPKTINFO /* Define to 1 if you have the header file. */ #undef HAVE_DLFCN_H /* Define to 1 if you have the header file. */ #undef HAVE_EXT_SLIST /* Define to 1 if you have the header file. */ #undef HAVE_FCNTL_H /* Define to 1 if you have the `fork' function. */ #undef HAVE_FORK /* Define to 1 if you have the `gethostbyaddr' function. */ #undef HAVE_GETHOSTBYADDR /* Define to 1 if you have the `gethostbyname' function. */ #undef HAVE_GETHOSTBYNAME /* Define to 1 if you have the `gethostname' function. */ #undef HAVE_GETHOSTNAME /* Define to 1 if you have the `gettimeofday' function. */ #undef HAVE_GETTIMEOFDAY /* Defines if google test is available and should be used */ #undef HAVE_GTEST /* Define to 1 if you have the `inet_aton' function. */ #undef HAVE_INET_ATON /* Define to 1 if you have the `inet_ntoa' function. */ #undef HAVE_INET_NTOA /* Define to 1 if you have the header file. */ #undef HAVE_INTTYPES_H /* Defines whether IPv6 support is available */ #undef HAVE_IPV6 /* Define to 1 if you have the header file. */ #undef HAVE_LIMITS_H /* Define to 1 if you have the header file. */ #undef HAVE_MALLOC_H /* Define to 1 if you have the `memchr' function. */ #undef HAVE_MEMCHR /* Define to 1 if you have the `memmove' function. */ #undef HAVE_MEMMOVE /* Define to 1 if you have the header file. */ #undef HAVE_MEMORY_H /* Define to 1 if you have the `memset' function. */ #undef HAVE_MEMSET /* Define to 1 if you have the header file. */ #undef HAVE_NETDB_H /* Define to 1 if you have the header file. */ #undef HAVE_NETINET_IN_H /* Defines whether the poll function is available */ #undef HAVE_POLL /* Define to 1 if you have the header file. */ #undef HAVE_POLL_H /* Define to 1 if you have the `select' function. */ #undef HAVE_SELECT /* Defines whether the sin6_len field should be used */ #undef HAVE_SIN6_LEN /* Defines whether the sin_len field is available */ #undef HAVE_SIN_LEN /* Define to 1 if you have the header file. */ #undef HAVE_SLIST /* Defines whether sockaddr_storage should be used */ #undef HAVE_SOCKADDR_STORAGE /* Define to 1 if you have the `socket' function. */ #undef HAVE_SOCKET /* Defines whether we have the socklen_t field */ #undef HAVE_SOCKLEN_T /* Define to 1 if stdbool.h conforms to C99. */ #undef HAVE_STDBOOL_H /* Define to 1 if you have the header file. */ #undef HAVE_STDDEF_H /* Define to 1 if you have the header file. */ #undef HAVE_STDINT_H /* Define to 1 if you have the header file. */ #undef HAVE_STDLIB_H /* Define to 1 if you have the `strcasecmp' function. */ #undef HAVE_STRCASECMP /* Define to 1 if you have the `strchr' function. */ #undef HAVE_STRCHR /* Define to 1 if you have the `strdup' function. */ #undef HAVE_STRDUP /* Define to 1 if you have the `strerror' function. */ #undef HAVE_STRERROR /* Define to 1 if you have the header file. */ #undef HAVE_STRINGS_H /* Define to 1 if you have the header file. */ #undef HAVE_STRING_H /* Define to 1 if you have the `strncasecmp' function. */ #undef HAVE_STRNCASECMP /* Define to 1 if you have the `strstr' function. */ #undef HAVE_STRSTR /* Define to 1 if you have the `strtol' function. */ #undef HAVE_STRTOL /* Define to 1 if you have the `strtoul' function. */ #undef HAVE_STRTOUL /* Define to 1 if you have the header file. */ #undef HAVE_SYSLOG_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_IOCTL_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_POLL_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_SELECT_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_SOCKET_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_STAT_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_TIME_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_TYPES_H /* Define to 1 if you have the header file. */ #undef HAVE_UNISTD_H /* Define to 1 if you have the `vfork' function. */ #undef HAVE_VFORK /* Define to 1 if you have the header file. */ #undef HAVE_VFORK_H /* Defines whether the vsnprintf() function is available */ #undef HAVE_VSNPRINTF /* Define to 1 if you have the header file. */ #undef HAVE_WCHAR_H /* Define to 1 if you have the header file. */ #undef HAVE_WINSOCK2_H /* Define to 1 if `fork' works. */ #undef HAVE_WORKING_FORK /* Define to 1 if `vfork' works. */ #undef HAVE_WORKING_VFORK /* Define to 1 if the system has the type `_Bool'. */ #undef HAVE__BOOL /* Defines wiether the __ss_family field should be used */ #undef HAVE___SS_FAMILY /* Define to the sub-directory in which libtool stores uninstalled libraries. */ #undef LT_OBJDIR /* Support for /sbin/resolvconf enabled? */ #undef MOD_RESOLVCONF /* Support for server checks if incoming destination addr matches socket address */ #undef MOD_SRV_DST_ADDR_CHECK /* Name of package */ #undef PACKAGE /* Define to the address where bug reports for this package should be sent. */ #undef PACKAGE_BUGREPORT /* Define to the full name of this package. */ #undef PACKAGE_NAME /* Define to the full name and version of this package. */ #undef PACKAGE_STRING /* Define to the one symbol short name of this package. */ #undef PACKAGE_TARNAME /* Define to the home page for this package. */ #undef PACKAGE_URL /* Define to the version of this package. */ #undef PACKAGE_VERSION /* If using the C implementation of alloca, define if you know the direction of stack growth for your system; otherwise it will be automatically deduced at runtime. STACK_DIRECTION > 0 => grows toward higher addresses STACK_DIRECTION < 0 => grows toward lower addresses STACK_DIRECTION = 0 => direction of growth unknown */ #undef STACK_DIRECTION /* Define to 1 if you have the ANSI C header files. */ #undef STDC_HEADERS /* Version number of package */ #undef VERSION /* Define for Solaris 2.5.1 so the uint32_t typedef from , , or is not used. If the typedef were allowed, the #define below would cause a syntax error. */ #undef _UINT32_T /* Define for Solaris 2.5.1 so the uint64_t typedef from , , or is not used. If the typedef were allowed, the #define below would cause a syntax error. */ #undef _UINT64_T /* Define for Solaris 2.5.1 so the uint8_t typedef from , , or is not used. If the typedef were allowed, the #define below would cause a syntax error. */ #undef _UINT8_T /* Are we _special_? */ #undef __APPLE_USE_RFC_3542 /* Define to `__inline__' or `__inline' if that's what the C compiler calls it, or to nothing if 'inline' is not supported under any name. */ #ifndef __cplusplus #undef inline #endif /* Define to the type of a signed integer type of width exactly 16 bits if such a type exists and the standard includes do not define it. */ #undef int16_t /* Define to the type of a signed integer type of width exactly 32 bits if such a type exists and the standard includes do not define it. */ #undef int32_t /* Define to the type of a signed integer type of width exactly 8 bits if such a type exists and the standard includes do not define it. */ #undef int8_t /* Define to `int' if does not define. */ #undef pid_t /* Define to the equivalent of the C99 'restrict' keyword, or to nothing if this is not supported. Do not define if restrict is supported directly. */ #undef restrict /* Work around a bug in Sun C++: it does not support _Restrict or __restrict__, even though the corresponding Sun C compiler ends up with "#define restrict _Restrict" or "#define restrict __restrict__" in the previous line. Perhaps some future version of Sun C++ will work with restrict; if so, hopefully it defines __RESTRICT like Sun C does. */ #if defined __SUNPRO_CC && !defined __RESTRICT # define _Restrict # define __restrict__ #endif /* Define to `unsigned int' if does not define. */ #undef size_t /* Define to `int' if does not define. */ #undef ssize_t /* Define to the type of an unsigned integer type of width exactly 16 bits if such a type exists and the standard includes do not define it. */ #undef uint16_t /* Define to the type of an unsigned integer type of width exactly 32 bits if such a type exists and the standard includes do not define it. */ #undef uint32_t /* Define to the type of an unsigned integer type of width exactly 64 bits if such a type exists and the standard includes do not define it. */ #undef uint64_t /* Define to the type of an unsigned integer type of width exactly 8 bits if such a type exists and the standard includes do not define it. */ #undef uint8_t /* Define as `fork' if `vfork' does not work. */ #undef vfork dibbler-1.0.1/AddrMgr/0000775000175000017500000000000012561700417011442 500000000000000dibbler-1.0.1/AddrMgr/tests/0000775000175000017500000000000012561700417012604 500000000000000dibbler-1.0.1/AddrMgr/tests/run_tests.cpp0000664000175000017500000000031712233256142015254 00000000000000 #define STDC_HEADERS 1 #include #include int main(int argc, char* argv[]) { testing::InitGoogleTest(&argc, argv); int status = RUN_ALL_TESTS(); return status; } dibbler-1.0.1/AddrMgr/tests/AddrMgr_unittest.cc0000644000175000017500000000552412277722750016326 00000000000000#include #include #include #include namespace test { class AddrMgrTest : public ::testing::Test { public: AddrMgrTest() { } }; class NakedAddrMgr : public TAddrMgr { public: NakedAddrMgr(const std::string& addrdb, bool loadfile): TAddrMgr(addrdb, loadfile) { } virtual void print(std::ostream& s) { } }; TEST_F(AddrMgrTest, constructor) { // do no load the XML file NakedAddrMgr * mgr = new NakedAddrMgr("non-existing.xml", false); EXPECT_FALSE(mgr->isDone()); EXPECT_EQ(0, mgr->countClient()); delete mgr; // please load the XML file mgr = new NakedAddrMgr("non-existing.xml", true); EXPECT_FALSE(mgr->isDone()); EXPECT_EQ(0, mgr->countClient()); delete mgr; } TEST_F(AddrMgrTest, XmlLoadValidDB) { TAddrMgr* mgr = new NakedAddrMgr("server-AddrMgr-0.8.3.xml", true); ASSERT_FALSE(mgr->isDone()); // file load should be successful /* this test validates the following XML: 00:01:00:01:17:6c:b5:cf:f4:6d:04:fa:ce:ba:be 00:01:00:01:17:6c:b5:cf:f4:6d:04:fa:ce:ba:be 2001:db8:3333::1fe2:0:0 */ // check first client (1 PD) mgr->firstClient(); SPtr client1 = mgr->getClient(); ASSERT_TRUE(client1); SPtr exp_duid1 = new TDUID("00:01:00:01:17:6c:b5:cf:f4:6d:04:fa:ce:ba:be"); ASSERT_TRUE(client1->getDUID()); EXPECT_TRUE(*client1->getDUID() == *exp_duid1); EXPECT_EQ(0, client1->countIA()); EXPECT_EQ(0, client1->countTA()); EXPECT_EQ(1, client1->countPD()); client1->firstIA(); EXPECT_FALSE(client1->getIA()); client1->firstTA(); EXPECT_FALSE(client1->getTA()); client1->firstPD(); SPtr pd1 = client1->getPD(); ASSERT_TRUE(pd1); EXPECT_EQ(2000u, pd1->getT1()); EXPECT_EQ(3000u, pd1->getT2()); EXPECT_EQ(1u, pd1->getIAID()); EXPECT_EQ("", pd1->getIfacename()); EXPECT_EQ(2, pd1->getIfindex()); EXPECT_TRUE(*pd1->getDUID() == *exp_duid1); EXPECT_EQ(0, pd1->countAddr()); EXPECT_EQ(1, pd1->countPrefix()); pd1->firstPrefix(); SPtr prefix1 = pd1->getPrefix(); ASSERT_TRUE(prefix1); SPtr exp_addr1(new TIPv6Addr("2001:db8:3333::1fe2:0:0", true)); EXPECT_TRUE(*prefix1->get() == *exp_addr1); EXPECT_EQ(96, prefix1->getLength()); EXPECT_EQ(8000000u, prefix1->getPref()); EXPECT_EQ(9000000u, prefix1->getValid()); delete mgr; } } // end of anonymous namespace dibbler-1.0.1/AddrMgr/tests/server-AddrMgr-old-ifindex.xml0000644000175000017500000000371112277722750020302 00000000000000 1370686767 00:01:00:01:17:6c:b5:cf:f4:6d:04:fa:ce:ba:be 00:01:00:01:17:6c:b5:cf:f4:6d:04:fa:ce:ba:be 2001:db8:3333::1fe2:0:0 00:01:00:01:19:45:bd:f5:f4:6d:04:96:55:54 00:01:00:01:19:45:bd:f5:f4:6d:04:96:55:54 2001:db8:1111:0:7004:3aaf:dd73:5bb0 00:01:00:01:19:45:c1:15:f4:6d:04:96:55:54 00:01:00:01:19:45:c1:15:f4:6d:04:96:55:54 2001:db8:1111:0:9fad:d137:6126:e4bf 00:01:00:01:19:45:c1:15:f4:6d:04:96:55:54 2001:db8:3333::3eb3:0:0 dibbler-1.0.1/AddrMgr/tests/server-AddrMgr-0.8.3.xml0000644000175000017500000000362212277722750016547 00000000000000 1370686676 00:01:00:01:17:6c:b5:cf:f4:6d:04:fa:ce:ba:be 00:01:00:01:17:6c:b5:cf:f4:6d:04:fa:ce:ba:be 2001:db8:3333::1fe2:0:0 00:01:00:01:19:45:bd:f5:f4:6d:04:96:55:54 00:01:00:01:19:45:bd:f5:f4:6d:04:96:55:54 2001:db8:1111:0:7004:3aaf:dd73:5bb0 00:01:00:01:19:45:c1:15:f4:6d:04:96:55:54 00:01:00:01:19:45:c1:15:f4:6d:04:96:55:54 2001:db8:1111:0:9fad:d137:6126:e4bf 00:01:00:01:19:45:c1:15:f4:6d:04:96:55:54 2001:db8:3333::3eb3:0:0 dibbler-1.0.1/AddrMgr/tests/Makefile.am0000644000175000017500000000311712277722750014570 00000000000000AM_CPPFLAGS = -I$(top_srcdir)/AddrMgr AM_CPPFLAGS += -I$(top_srcdir)/Misc # This is to workaround long long in gtest.h AM_CPPFLAGS += $(GTEST_INCLUDES) -Wno-long-long -Wno-variadic-macros # Darwin quirks: # dyld can't find proper lib if make instal was not done for gtest # Original content of GTEST_ADD (retrned by: gtest-config --libs) #GTEST_LDADD = /Users/thomson/devel/gtest-1.6.0/lib/libgtest.la # Library that would do the trick #GTEST_LDADD = /Users/thomson/devel/gtest-1.6.0/lib/.libs/libgtest.a # At runtime this could be solved with: #export DYLD_LIBRARY_PATH=/Users/thomson/devel/gtest-1.6.0/lib/.libs/ info: @echo "GTEST_LDADD=$(GTEST_LDADD)" @echo "GTEST_LDFLAGS=$(GTEST_LDFLAGS)" @echo "GTEST_INCLUDES=$(GTEST_INCLUDES)" @echo "HAVE_GTEST=$(HAVE_GTEST)" TESTS = if HAVE_GTEST TESTS += AddrMgr_tests AddrMgr_tests_SOURCES = run_tests.cpp AddrMgr_tests_SOURCES += AddrAddr_unittest.cc AddrMgr_tests_SOURCES += AddrPrefix_unittest.cc AddrMgr_tests_SOURCES += AddrIA_unittest.cc AddrMgr_tests_SOURCES += AddrClient_unittest.cc AddrMgr_tests_SOURCES += AddrMgr_unittest.cc AddrMgr_tests_LDFLAGS = $(AM_LDFLAGS) $(GTEST_LDFLAGS) AddrMgr_tests_LDADD = $(GTEST_LDADD) AddrMgr_tests_LDADD += $(top_builddir)/AddrMgr/libAddrMgr.a AddrMgr_tests_LDADD += $(top_builddir)/Misc/libMisc.a AddrMgr_tests_LDADD += $(top_builddir)/@PORT_SUBDIR@/libLowLevel.a dist_noinst_DATA = server-AddrMgr-0.8.3.xml dist_noinst_DATA += server-AddrMgr-bogus-ifacenames.xml dist_noinst_DATA += server-AddrMgr-empty-ifacenames.xml dist_noinst_DATA += server-AddrMgr-old-ifindex.xml endif noinst_PROGRAMS = $(TESTS) dibbler-1.0.1/AddrMgr/tests/AddrIA_unittest.cc0000644000175000017500000000124612277722750016067 00000000000000#include #include #include #include using namespace std; namespace test { TEST(AddrIATest, constructor) { SPtr addr = new TIPv6Addr("fe80::abcd", true); const char duidData[] = {0x1, 0x2, 0x3, 0x4, 0x5, 0x6}; SPtr duid = new TDUID(duidData, sizeof(duidData)); SPtr ia = new TAddrIA("eth0", 1, IATYPE_IA, addr, duid, 100, 200, 300); EXPECT_EQ(1, ia->getIfindex()); EXPECT_EQ(100u, ia->getT1()); EXPECT_EQ(200u, ia->getT2()); EXPECT_EQ(300u, ia->getIAID()); EXPECT_EQ(string("fe80::abcd"), ia->getSrvAddr()->getPlain()); EXPECT_EQ(0, ia->countAddr()); } } dibbler-1.0.1/AddrMgr/tests/server-AddrMgr-empty-ifacenames.xml0000644000175000017500000000366112277722750021333 00000000000000 1370686767 00:01:00:01:17:6c:b5:cf:f4:6d:04:fa:ce:ba:be 00:01:00:01:17:6c:b5:cf:f4:6d:04:fa:ce:ba:be 2001:db8:3333::1fe2:0:0 00:01:00:01:19:45:bd:f5:f4:6d:04:96:55:54 00:01:00:01:19:45:bd:f5:f4:6d:04:96:55:54 2001:db8:1111:0:7004:3aaf:dd73:5bb0 00:01:00:01:19:45:c1:15:f4:6d:04:96:55:54 00:01:00:01:19:45:c1:15:f4:6d:04:96:55:54 2001:db8:1111:0:9fad:d137:6126:e4bf 00:01:00:01:19:45:c1:15:f4:6d:04:96:55:54 2001:db8:3333::3eb3:0:0 dibbler-1.0.1/AddrMgr/tests/server-AddrMgr-bogus-ifacenames.xml0000644000175000017500000000374112277722750021313 00000000000000 1370686767 00:01:00:01:17:6c:b5:cf:f4:6d:04:fa:ce:ba:be 00:01:00:01:17:6c:b5:cf:f4:6d:04:fa:ce:ba:be 2001:db8:3333::1fe2:0:0 00:01:00:01:19:45:bd:f5:f4:6d:04:96:55:54 00:01:00:01:19:45:bd:f5:f4:6d:04:96:55:54 2001:db8:1111:0:7004:3aaf:dd73:5bb0 00:01:00:01:19:45:c1:15:f4:6d:04:96:55:54 00:01:00:01:19:45:c1:15:f4:6d:04:96:55:54 2001:db8:1111:0:9fad:d137:6126:e4bf 00:01:00:01:19:45:c1:15:f4:6d:04:96:55:54 2001:db8:3333::3eb3:0:0 dibbler-1.0.1/AddrMgr/tests/AddrAddr_unittest.cc0000664000175000017500000000067112233256142016440 00000000000000#include #include #include namespace test { class AddrAddrTest : public ::testing::Test { public: AddrAddrTest() { } }; TEST_F(AddrAddrTest, constructor) { SPtr addr = new TIPv6Addr("fe80::abcd", true); SPtr addrAddr = new TAddrAddr(addr, 100, 200); EXPECT_EQ(100u, addrAddr->getPref() ); EXPECT_EQ(200u, addrAddr->getValid() ); } } dibbler-1.0.1/AddrMgr/tests/Makefile.in0000664000175000017500000010623712561652534014610 00000000000000# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ TESTS = $(am__EXEEXT_1) @HAVE_GTEST_TRUE@am__append_1 = AddrMgr_tests noinst_PROGRAMS = $(am__EXEEXT_2) subdir = AddrMgr/tests DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/depcomp $(am__dist_noinst_DATA_DIST) \ $(top_srcdir)/test-driver ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/libtool.m4 \ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/include/dibbler-config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = @HAVE_GTEST_TRUE@am__EXEEXT_1 = AddrMgr_tests$(EXEEXT) am__EXEEXT_2 = $(am__EXEEXT_1) PROGRAMS = $(noinst_PROGRAMS) am__AddrMgr_tests_SOURCES_DIST = run_tests.cpp AddrAddr_unittest.cc \ AddrPrefix_unittest.cc AddrIA_unittest.cc \ AddrClient_unittest.cc AddrMgr_unittest.cc @HAVE_GTEST_TRUE@am_AddrMgr_tests_OBJECTS = run_tests.$(OBJEXT) \ @HAVE_GTEST_TRUE@ AddrAddr_unittest.$(OBJEXT) \ @HAVE_GTEST_TRUE@ AddrPrefix_unittest.$(OBJEXT) \ @HAVE_GTEST_TRUE@ AddrIA_unittest.$(OBJEXT) \ @HAVE_GTEST_TRUE@ AddrClient_unittest.$(OBJEXT) \ @HAVE_GTEST_TRUE@ AddrMgr_unittest.$(OBJEXT) AddrMgr_tests_OBJECTS = $(am_AddrMgr_tests_OBJECTS) am__DEPENDENCIES_1 = @HAVE_GTEST_TRUE@AddrMgr_tests_DEPENDENCIES = $(am__DEPENDENCIES_1) \ @HAVE_GTEST_TRUE@ $(top_builddir)/AddrMgr/libAddrMgr.a \ @HAVE_GTEST_TRUE@ $(top_builddir)/Misc/libMisc.a \ @HAVE_GTEST_TRUE@ $(top_builddir)/@PORT_SUBDIR@/libLowLevel.a AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = AddrMgr_tests_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CXXLD) \ $(AM_CXXFLAGS) $(CXXFLAGS) $(AddrMgr_tests_LDFLAGS) $(LDFLAGS) \ -o $@ AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)/include depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) LTCXXCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CXXFLAGS) $(CXXFLAGS) AM_V_CXX = $(am__v_CXX_@AM_V@) am__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@) am__v_CXX_0 = @echo " CXX " $@; am__v_CXX_1 = CXXLD = $(CXX) CXXLINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \ $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CXXLD = $(am__v_CXXLD_@AM_V@) am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@) am__v_CXXLD_0 = @echo " CXXLD " $@; am__v_CXXLD_1 = SOURCES = $(AddrMgr_tests_SOURCES) DIST_SOURCES = $(am__AddrMgr_tests_SOURCES_DIST) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__dist_noinst_DATA_DIST = server-AddrMgr-0.8.3.xml \ server-AddrMgr-bogus-ifacenames.xml \ server-AddrMgr-empty-ifacenames.xml \ server-AddrMgr-old-ifindex.xml DATA = $(dist_noinst_DATA) am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags am__tty_colors_dummy = \ mgn= red= grn= lgn= blu= brg= std=; \ am__color_tests=no am__tty_colors = { \ $(am__tty_colors_dummy); \ if test "X$(AM_COLOR_TESTS)" = Xno; then \ am__color_tests=no; \ elif test "X$(AM_COLOR_TESTS)" = Xalways; then \ am__color_tests=yes; \ elif test "X$$TERM" != Xdumb && { test -t 1; } 2>/dev/null; then \ am__color_tests=yes; \ fi; \ if test $$am__color_tests = yes; then \ red=''; \ grn=''; \ lgn=''; \ blu=''; \ mgn=''; \ brg=''; \ std=''; \ fi; \ } am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__recheck_rx = ^[ ]*:recheck:[ ]* am__global_test_result_rx = ^[ ]*:global-test-result:[ ]* am__copy_in_global_log_rx = ^[ ]*:copy-in-global-log:[ ]* # A command that, given a newline-separated list of test names on the # standard input, print the name of the tests that are to be re-run # upon "make recheck". am__list_recheck_tests = $(AWK) '{ \ recheck = 1; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ { \ if ((getline line2 < ($$0 ".log")) < 0) \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[nN][Oo]/) \ { \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[yY][eE][sS]/) \ { \ break; \ } \ }; \ if (recheck) \ print $$0; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # A command that, given a newline-separated list of test names on the # standard input, create the global log from their .trs and .log files. am__create_global_log = $(AWK) ' \ function fatal(msg) \ { \ print "fatal: making $@: " msg | "cat >&2"; \ exit 1; \ } \ function rst_section(header) \ { \ print header; \ len = length(header); \ for (i = 1; i <= len; i = i + 1) \ printf "="; \ printf "\n\n"; \ } \ { \ copy_in_global_log = 1; \ global_test_result = "RUN"; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".trs"); \ if (line ~ /$(am__global_test_result_rx)/) \ { \ sub("$(am__global_test_result_rx)", "", line); \ sub("[ ]*$$", "", line); \ global_test_result = line; \ } \ else if (line ~ /$(am__copy_in_global_log_rx)[nN][oO]/) \ copy_in_global_log = 0; \ }; \ if (copy_in_global_log) \ { \ rst_section(global_test_result ": " $$0); \ while ((rc = (getline line < ($$0 ".log"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".log"); \ print line; \ }; \ printf "\n"; \ }; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # Restructured Text title. am__rst_title = { sed 's/.*/ & /;h;s/./=/g;p;x;s/ *$$//;p;g' && echo; } # Solaris 10 'make', and several other traditional 'make' implementations, # pass "-e" to $(SHELL), and POSIX 2008 even requires this. Work around it # by disabling -e (using the XSI extension "set +e") if it's set. am__sh_e_setup = case $$- in *e*) set +e;; esac # Default flags passed to test drivers. am__common_driver_flags = \ --color-tests "$$am__color_tests" \ --enable-hard-errors "$$am__enable_hard_errors" \ --expect-failure "$$am__expect_failure" # To be inserted before the command running the test. Creates the # directory for the log if needed. Stores in $dir the directory # containing $f, in $tst the test, in $log the log. Executes the # developer- defined test setup AM_TESTS_ENVIRONMENT (if any), and # passes TESTS_ENVIRONMENT. Set up options for the wrapper that # will run the test scripts (or their associated LOG_COMPILER, if # thy have one). am__check_pre = \ $(am__sh_e_setup); \ $(am__vpath_adj_setup) $(am__vpath_adj) \ $(am__tty_colors); \ srcdir=$(srcdir); export srcdir; \ case "$@" in \ */*) am__odir=`echo "./$@" | sed 's|/[^/]*$$||'`;; \ *) am__odir=.;; \ esac; \ test "x$$am__odir" = x"." || test -d "$$am__odir" \ || $(MKDIR_P) "$$am__odir" || exit $$?; \ if test -f "./$$f"; then dir=./; \ elif test -f "$$f"; then dir=; \ else dir="$(srcdir)/"; fi; \ tst=$$dir$$f; log='$@'; \ if test -n '$(DISABLE_HARD_ERRORS)'; then \ am__enable_hard_errors=no; \ else \ am__enable_hard_errors=yes; \ fi; \ case " $(XFAIL_TESTS) " in \ *[\ \ ]$$f[\ \ ]* | *[\ \ ]$$dir$$f[\ \ ]*) \ am__expect_failure=yes;; \ *) \ am__expect_failure=no;; \ esac; \ $(AM_TESTS_ENVIRONMENT) $(TESTS_ENVIRONMENT) # A shell command to get the names of the tests scripts with any registered # extension removed (i.e., equivalently, the names of the test logs, with # the '.log' extension removed). The result is saved in the shell variable # '$bases'. This honors runtime overriding of TESTS and TEST_LOGS. Sadly, # we cannot use something simpler, involving e.g., "$(TEST_LOGS:.log=)", # since that might cause problem with VPATH rewrites for suffix-less tests. # See also 'test-harness-vpath-rewrite.sh' and 'test-trs-basic.sh'. am__set_TESTS_bases = \ bases='$(TEST_LOGS)'; \ bases=`for i in $$bases; do echo $$i; done | sed 's/\.log$$//'`; \ bases=`echo $$bases` RECHECK_LOGS = $(TEST_LOGS) AM_RECURSIVE_TARGETS = check recheck TEST_SUITE_LOG = test-suite.log TEST_EXTENSIONS = @EXEEXT@ .test LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver LOG_COMPILE = $(LOG_COMPILER) $(AM_LOG_FLAGS) $(LOG_FLAGS) am__set_b = \ case '$@' in \ */*) \ case '$*' in \ */*) b='$*';; \ *) b=`echo '$@' | sed 's/\.log$$//'`; \ esac;; \ *) \ b='$*';; \ esac am__test_logs1 = $(TESTS:=.log) am__test_logs2 = $(am__test_logs1:@EXEEXT@.log=.log) TEST_LOGS = $(am__test_logs2:.test.log=.log) TEST_LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver TEST_LOG_COMPILE = $(TEST_LOG_COMPILER) $(AM_TEST_LOG_FLAGS) \ $(TEST_LOG_FLAGS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALLOCA = @ALLOCA@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ ARCH = @ARCH@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ EXTRA_DIST_SUBDIRS = @EXTRA_DIST_SUBDIRS@ FGREP = @FGREP@ GREP = @GREP@ GTEST_INCLUDES = @GTEST_INCLUDES@ GTEST_LDADD = @GTEST_LDADD@ GTEST_LDFLAGS = @GTEST_LDFLAGS@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LINKPRINT = @LINKPRINT@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PORT_CFLAGS = @PORT_CFLAGS@ PORT_LDFLAGS = @PORT_LDFLAGS@ PORT_SUBDIR = @PORT_SUBDIR@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ subdirs = @subdirs@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ # This is to workaround long long in gtest.h AM_CPPFLAGS = -I$(top_srcdir)/AddrMgr -I$(top_srcdir)/Misc \ $(GTEST_INCLUDES) -Wno-long-long -Wno-variadic-macros @HAVE_GTEST_TRUE@AddrMgr_tests_SOURCES = run_tests.cpp \ @HAVE_GTEST_TRUE@ AddrAddr_unittest.cc AddrPrefix_unittest.cc \ @HAVE_GTEST_TRUE@ AddrIA_unittest.cc AddrClient_unittest.cc \ @HAVE_GTEST_TRUE@ AddrMgr_unittest.cc @HAVE_GTEST_TRUE@AddrMgr_tests_LDFLAGS = $(AM_LDFLAGS) $(GTEST_LDFLAGS) @HAVE_GTEST_TRUE@AddrMgr_tests_LDADD = $(GTEST_LDADD) \ @HAVE_GTEST_TRUE@ $(top_builddir)/AddrMgr/libAddrMgr.a \ @HAVE_GTEST_TRUE@ $(top_builddir)/Misc/libMisc.a \ @HAVE_GTEST_TRUE@ $(top_builddir)/@PORT_SUBDIR@/libLowLevel.a @HAVE_GTEST_TRUE@dist_noinst_DATA = server-AddrMgr-0.8.3.xml \ @HAVE_GTEST_TRUE@ server-AddrMgr-bogus-ifacenames.xml \ @HAVE_GTEST_TRUE@ server-AddrMgr-empty-ifacenames.xml \ @HAVE_GTEST_TRUE@ server-AddrMgr-old-ifindex.xml all: all-am .SUFFIXES: .SUFFIXES: .cc .cpp .lo .log .o .obj .test .test$(EXEEXT) .trs $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign AddrMgr/tests/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign AddrMgr/tests/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstPROGRAMS: @list='$(noinst_PROGRAMS)'; test -n "$$list" || exit 0; \ echo " rm -f" $$list; \ rm -f $$list || exit $$?; \ test -n "$(EXEEXT)" || exit 0; \ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ echo " rm -f" $$list; \ rm -f $$list AddrMgr_tests$(EXEEXT): $(AddrMgr_tests_OBJECTS) $(AddrMgr_tests_DEPENDENCIES) $(EXTRA_AddrMgr_tests_DEPENDENCIES) @rm -f AddrMgr_tests$(EXEEXT) $(AM_V_CXXLD)$(AddrMgr_tests_LINK) $(AddrMgr_tests_OBJECTS) $(AddrMgr_tests_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/AddrAddr_unittest.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/AddrClient_unittest.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/AddrIA_unittest.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/AddrMgr_unittest.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/AddrPrefix_unittest.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/run_tests.Po@am__quote@ .cc.o: @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $< .cc.obj: @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .cc.lo: @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LTCXXCOMPILE) -c -o $@ $< .cpp.o: @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $< .cpp.obj: @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .cpp.lo: @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LTCXXCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags # Recover from deleted '.trs' file; this should ensure that # "rm -f foo.log; make foo.trs" re-run 'foo.test', and re-create # both 'foo.log' and 'foo.trs'. Break the recipe in two subshells # to avoid problems with "make -n". .log.trs: rm -f $< $@ $(MAKE) $(AM_MAKEFLAGS) $< # Leading 'am--fnord' is there to ensure the list of targets does not # expand to empty, as could happen e.g. with make check TESTS=''. am--fnord $(TEST_LOGS) $(TEST_LOGS:.log=.trs): $(am__force_recheck) am--force-recheck: @: $(TEST_SUITE_LOG): $(TEST_LOGS) @$(am__set_TESTS_bases); \ am__f_ok () { test -f "$$1" && test -r "$$1"; }; \ redo_bases=`for i in $$bases; do \ am__f_ok $$i.trs && am__f_ok $$i.log || echo $$i; \ done`; \ if test -n "$$redo_bases"; then \ redo_logs=`for i in $$redo_bases; do echo $$i.log; done`; \ redo_results=`for i in $$redo_bases; do echo $$i.trs; done`; \ if $(am__make_dryrun); then :; else \ rm -f $$redo_logs && rm -f $$redo_results || exit 1; \ fi; \ fi; \ if test -n "$$am__remaking_logs"; then \ echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \ "recursion detected" >&2; \ else \ am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \ fi; \ if $(am__make_dryrun); then :; else \ st=0; \ errmsg="fatal: making $(TEST_SUITE_LOG): failed to create"; \ for i in $$redo_bases; do \ test -f $$i.trs && test -r $$i.trs \ || { echo "$$errmsg $$i.trs" >&2; st=1; }; \ test -f $$i.log && test -r $$i.log \ || { echo "$$errmsg $$i.log" >&2; st=1; }; \ done; \ test $$st -eq 0 || exit 1; \ fi @$(am__sh_e_setup); $(am__tty_colors); $(am__set_TESTS_bases); \ ws='[ ]'; \ results=`for b in $$bases; do echo $$b.trs; done`; \ test -n "$$results" || results=/dev/null; \ all=` grep "^$$ws*:test-result:" $$results | wc -l`; \ pass=` grep "^$$ws*:test-result:$$ws*PASS" $$results | wc -l`; \ fail=` grep "^$$ws*:test-result:$$ws*FAIL" $$results | wc -l`; \ skip=` grep "^$$ws*:test-result:$$ws*SKIP" $$results | wc -l`; \ xfail=`grep "^$$ws*:test-result:$$ws*XFAIL" $$results | wc -l`; \ xpass=`grep "^$$ws*:test-result:$$ws*XPASS" $$results | wc -l`; \ error=`grep "^$$ws*:test-result:$$ws*ERROR" $$results | wc -l`; \ if test `expr $$fail + $$xpass + $$error` -eq 0; then \ success=true; \ else \ success=false; \ fi; \ br='==================='; br=$$br$$br$$br$$br; \ result_count () \ { \ if test x"$$1" = x"--maybe-color"; then \ maybe_colorize=yes; \ elif test x"$$1" = x"--no-color"; then \ maybe_colorize=no; \ else \ echo "$@: invalid 'result_count' usage" >&2; exit 4; \ fi; \ shift; \ desc=$$1 count=$$2; \ if test $$maybe_colorize = yes && test $$count -gt 0; then \ color_start=$$3 color_end=$$std; \ else \ color_start= color_end=; \ fi; \ echo "$${color_start}# $$desc $$count$${color_end}"; \ }; \ create_testsuite_report () \ { \ result_count $$1 "TOTAL:" $$all "$$brg"; \ result_count $$1 "PASS: " $$pass "$$grn"; \ result_count $$1 "SKIP: " $$skip "$$blu"; \ result_count $$1 "XFAIL:" $$xfail "$$lgn"; \ result_count $$1 "FAIL: " $$fail "$$red"; \ result_count $$1 "XPASS:" $$xpass "$$red"; \ result_count $$1 "ERROR:" $$error "$$mgn"; \ }; \ { \ echo "$(PACKAGE_STRING): $(subdir)/$(TEST_SUITE_LOG)" | \ $(am__rst_title); \ create_testsuite_report --no-color; \ echo; \ echo ".. contents:: :depth: 2"; \ echo; \ for b in $$bases; do echo $$b; done \ | $(am__create_global_log); \ } >$(TEST_SUITE_LOG).tmp || exit 1; \ mv $(TEST_SUITE_LOG).tmp $(TEST_SUITE_LOG); \ if $$success; then \ col="$$grn"; \ else \ col="$$red"; \ test x"$$VERBOSE" = x || cat $(TEST_SUITE_LOG); \ fi; \ echo "$${col}$$br$${std}"; \ echo "$${col}Testsuite summary for $(PACKAGE_STRING)$${std}"; \ echo "$${col}$$br$${std}"; \ create_testsuite_report --maybe-color; \ echo "$$col$$br$$std"; \ if $$success; then :; else \ echo "$${col}See $(subdir)/$(TEST_SUITE_LOG)$${std}"; \ if test -n "$(PACKAGE_BUGREPORT)"; then \ echo "$${col}Please report to $(PACKAGE_BUGREPORT)$${std}"; \ fi; \ echo "$$col$$br$$std"; \ fi; \ $$success || exit 1 check-TESTS: @list='$(RECHECK_LOGS)'; test -z "$$list" || rm -f $$list @list='$(RECHECK_LOGS:.log=.trs)'; test -z "$$list" || rm -f $$list @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ log_list=`for i in $$bases; do echo $$i.log; done`; \ trs_list=`for i in $$bases; do echo $$i.trs; done`; \ log_list=`echo $$log_list`; trs_list=`echo $$trs_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) TEST_LOGS="$$log_list"; \ exit $$?; recheck: all @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ bases=`for i in $$bases; do echo $$i; done \ | $(am__list_recheck_tests)` || exit 1; \ log_list=`for i in $$bases; do echo $$i.log; done`; \ log_list=`echo $$log_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) \ am__force_recheck=am--force-recheck \ TEST_LOGS="$$log_list"; \ exit $$? AddrMgr_tests.log: AddrMgr_tests$(EXEEXT) @p='AddrMgr_tests$(EXEEXT)'; \ b='AddrMgr_tests'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) .test.log: @p='$<'; \ $(am__set_b); \ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) @am__EXEEXT_TRUE@.test$(EXEEXT).log: @am__EXEEXT_TRUE@ @p='$<'; \ @am__EXEEXT_TRUE@ $(am__set_b); \ @am__EXEEXT_TRUE@ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ @am__EXEEXT_TRUE@ --log-file $$b.log --trs-file $$b.trs \ @am__EXEEXT_TRUE@ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ @am__EXEEXT_TRUE@ "$$tst" $(AM_TESTS_FD_REDIRECT) distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am $(MAKE) $(AM_MAKEFLAGS) check-TESTS check: check-am all-am: Makefile $(PROGRAMS) $(DATA) installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: -test -z "$(TEST_LOGS)" || rm -f $(TEST_LOGS) -test -z "$(TEST_LOGS:.log=.trs)" || rm -f $(TEST_LOGS:.log=.trs) -test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool clean-noinstPROGRAMS \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: check-am install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-TESTS check-am clean \ clean-generic clean-libtool clean-noinstPROGRAMS cscopelist-am \ ctags ctags-am distclean distclean-compile distclean-generic \ distclean-libtool distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-dvi install-dvi-am install-exec \ install-exec-am install-html install-html-am install-info \ install-info-am install-man install-pdf install-pdf-am \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ recheck tags tags-am uninstall uninstall-am # Darwin quirks: # dyld can't find proper lib if make instal was not done for gtest # Original content of GTEST_ADD (retrned by: gtest-config --libs) #GTEST_LDADD = /Users/thomson/devel/gtest-1.6.0/lib/libgtest.la # Library that would do the trick #GTEST_LDADD = /Users/thomson/devel/gtest-1.6.0/lib/.libs/libgtest.a # At runtime this could be solved with: #export DYLD_LIBRARY_PATH=/Users/thomson/devel/gtest-1.6.0/lib/.libs/ info: @echo "GTEST_LDADD=$(GTEST_LDADD)" @echo "GTEST_LDFLAGS=$(GTEST_LDFLAGS)" @echo "GTEST_INCLUDES=$(GTEST_INCLUDES)" @echo "HAVE_GTEST=$(HAVE_GTEST)" # 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: dibbler-1.0.1/AddrMgr/tests/AddrPrefix_unittest.cc0000664000175000017500000000073412233256142017023 00000000000000#include #include #include using namespace std; namespace test { TEST(AddrPrefixTest, constructor) { SPtr addr = new TIPv6Addr("fe80::abcd", true); SPtr prefix = new TAddrPrefix(addr, 100, 200, 64); EXPECT_EQ(100u, prefix->getPref() ); EXPECT_EQ(200u, prefix->getValid() ); EXPECT_EQ(64u, prefix->getLength() ); EXPECT_EQ(string("fe80::abcd"), prefix->get()->getPlain()); } } dibbler-1.0.1/AddrMgr/tests/AddrClient_unittest.cc0000644000175000017500000000173112277722750017013 00000000000000#include #include #include #include #include #include #include namespace test { class AddrClientTest : public ::testing::Test { public: AddrClientTest() { } }; TEST_F(AddrClientTest, constructor) { const char duidData[] = {0x1, 0x2, 0x3, 0x4, 0x5, 0x6}; SPtr duid = new TDUID(duidData, sizeof(duidData)); TAddrClient *client = new TAddrClient(duid); SPtr d = client->getDUID(); EXPECT_TRUE(d); EXPECT_EQ(duid->getLen(), d->getLen()); EXPECT_TRUE(duid == d); EXPECT_EQ(0, client->countIA()); EXPECT_EQ(0, client->countPD()); EXPECT_EQ(0, client->countTA()); EXPECT_EQ(UINT_MAX, client->getT1Timeout()); EXPECT_EQ(UINT_MAX, client->getT2Timeout()); EXPECT_EQ(UINT_MAX, client->getPrefTimeout()); EXPECT_EQ(UINT_MAX, client->getValidTimeout()); delete client; } } // end of anonymous namespace dibbler-1.0.1/AddrMgr/AddrAddr.cpp0000644000175000017500000000717212277722750013550 00000000000000/* * Dibbler - a portable DHCPv6 * * authors: Tomasz Mrugalski * Marek Senderski * * released under GNU GPL v2 licence * */ #include #include #include "Portable.h" #include "AddrAddr.h" #include "DHCPConst.h" #include "Logger.h" using namespace std; /** * @brief AddrAddr constructor for addresses * * constructor used for creating an address * * @param addr IPv6 address * @param pref prefered lifetime * @param valid valid lifetime * */ TAddrAddr::TAddrAddr(SPtr addr, long pref, long valid) { this->Prefered = pref; this->Valid = valid; this->Addr=addr; this->Timestamp = (unsigned long)time(NULL); this->Tentative = ADDRSTATUS_UNKNOWN; this->Prefix = 128; if (pref>valid) { Log(Warning) << "Trying to create " << this->Addr->getPlain() << " with prefered(" << pref << ") larger than valid(" << valid << ") lifetime." << LogEnd; } } /** * @brief AddrAddr constructor for prefixes * * constructor used for prefix creation * * @param addr IPv6 address that will be used as a prefix * @param pref prefered lifetime * @param valid valid lifetime * @param prefix length of the prefix (1..128) * */ TAddrAddr::TAddrAddr(SPtr addr, long pref, long valid, int prefix) { this->Prefered = pref; this->Valid = valid; this->Addr=addr; this->Timestamp = (unsigned long)time(NULL); this->Tentative = ADDRSTATUS_UNKNOWN; this->Prefix = prefix; if (pref>valid) { Log(Warning) << "Trying to store " << this->Addr->getPlain() << " with prefered(" << pref << ")>valid(" << valid << ") lifetimes." << LogEnd; } } unsigned long TAddrAddr::getPref() { return Prefered; } unsigned long TAddrAddr::getValid() { return Valid; } int TAddrAddr::getPrefix() { return Prefix; } SPtr TAddrAddr::get() { return Addr; } /** * @brief returns preferred lifetime left * * returns preferred lifetime * * * @return preferred lifetime */ unsigned long TAddrAddr::getPrefTimeout() { unsigned long ts = Timestamp + Prefered; unsigned long x = (unsigned long)time(NULL); if (tsx) return ts-x; else return 0; } /** * @brief returns valid lifetime * * returns valid lifetime * * @return valid lifetime */ unsigned long TAddrAddr::getValidTimeout() { unsigned long ts = Timestamp + Valid; unsigned long x = (unsigned long)time(NULL); if (tsx) return ts-x; else return 0; } // return timestamp long TAddrAddr::getTimestamp() { return this->Timestamp; } // set timestamp void TAddrAddr::setTimestamp(long ts) { this->Timestamp = ts; } void TAddrAddr::setTentative(enum EAddrStatus state) { this->Tentative = state; } void TAddrAddr::setPref(unsigned long pref) { this->Prefered = pref; } void TAddrAddr::setValid(unsigned long valid) { this->Valid = valid; } // set timestamp void TAddrAddr::setTimestamp() { this->Timestamp = (unsigned long)time(NULL); } enum EAddrStatus TAddrAddr::getTentative() { return Tentative; } ostream & operator<<(ostream & strum,TAddrAddr &x) { strum << "" << x.Addr->getPlain()<< "" << std::endl; return strum; } dibbler-1.0.1/AddrMgr/AddrMgr.cpp0000644000175000017500000010720512556505771013423 00000000000000/* * Dibbler - a portable DHCPv6 * * authors: Tomasz Mrugalski * Marek Senderski * changes: Krzysztof Wnuk * Michal Kowalczuk * Grzegorz Pluto * * released under GNU GPL v2 only licence * */ #include #include #include #include #include "Portable.h" #include #include "AddrMgr.h" #include "AddrClient.h" #include "DHCPDefaults.h" #include "Logger.h" #include "hex.h" using namespace std; TAddrMgr::TAddrMgr(const std::string& xmlFile, bool loadfile) :ReplayDetectionValue_(0) { this->IsDone = false; this->XmlFile = xmlFile; if (loadfile) { dbLoad(xmlFile.c_str()); } else { Log(Debug) << "Skipping database loading." << LogEnd; } DeleteEmptyClient = true; } /** * @brief loads XML database from disk * * this method loads database from disk. (see dump() method * for storing the database on disk). Right now it is used by * client only, but it can be adapted easily for server side. * After DB is loaded, necessary TAddrClient, TAddrIA and TAddrAddr * lists are created. * * There used to be 2 versions of this function: * 1. libxml2 based. Libxml2 is an external library that provides * xml parsing capabilities. It is reliable, but adds big dependency * to dibbler, therefore it is not currently used. It is no longer * available (because there was nobody to maintain it). * 2. internal parser. See xmlLuadBuiltIn() method. It is very small, * works with files generated by dibbler, but due to its size it is * quite dumb and may be confused quite easily. This is the only * version that is available. * * @param xmlFile filename of the database * */ void TAddrMgr::dbLoad(const char * xmlFile) { Log(Info) << "Loading old address database (" << xmlFile << "), using built-in routines." << LogEnd; // Ignore status code. Missing server-AddrMgr.xml is ok if running // for the first time xmlLoadBuiltIn(xmlFile); } /** * @brief stores content of the AddrMgr database to a file * * stores content of the AddrMgr database to XML file * */ void TAddrMgr::dump() { std::ofstream xmlDump; xmlDump.open(this->XmlFile.c_str(), std::ios::ate); xmlDump << *this; xmlDump.close(); } void TAddrMgr::addClient(SPtr x) { ClntsLst.append(x); } void TAddrMgr::firstClient() { ClntsLst.first(); } SPtr TAddrMgr::getClient() { return ClntsLst.get(); } /** * @brief returns client with a specified DUID * * returns client with a specified DUID * * @param duid client DUID * * @return smart pointer to the client (or 0 if client is not found) */ SPtr TAddrMgr::getClient(SPtr duid) { SPtr ptr; ClntsLst.first(); while (ptr = ClntsLst.get() ) { if ( *(ptr->getDUID()) == (*duid) ) return ptr; } return SPtr(); } /** * @brief returns client with specified SPI index * * returns client with specified SPI (Security Prameters Index). * Useful for security purposes only * * @param SPI security * * @return smart pointer to the client (or 0 if client is not found) */ SPtr TAddrMgr::getClient(uint32_t SPI) { SPtr ptr; ClntsLst.first(); while (ptr = ClntsLst.get() ) { if ( ptr->getSPI() == SPI ) return ptr; } return SPtr(); } /** * @brief returns client that leased specified address * * returns client that leased specified address * * @param leasedAddr address leased to the client * * @return smart pointer to the client (or 0 if client is not found) */ SPtr TAddrMgr::getClient(SPtr leasedAddr) { SPtr cli; ClntsLst.first(); while (cli = ClntsLst.get() ) { SPtr ia; cli->firstIA(); while (ia = cli->getIA()) { if ( ia->getAddr(leasedAddr) ) return cli; } } return SPtr(); } int TAddrMgr::countClient() { return ClntsLst.count(); } bool TAddrMgr::delClient(SPtr duid) { SPtr ptr; ClntsLst.first(); while ( ptr = ClntsLst.get() ) { if ((*ptr->getDUID())==(*duid)) { ClntsLst.del(); return true; } } return false; } /// @brief tries to update interface name/index information (if required) /// /// @param nameToIndex network interface name to index mapping /// @param indexToName network interface index to name mapping /// /// @return true if successful bool TAddrMgr::updateInterfacesInfo(const NameToIndexMapping& nameToIndex, const IndexToNameMapping& indexToName) { firstClient(); while (SPtr client = getClient()) { client->firstIA(); while (SPtr ia = client->getIA()) { if (!updateInterfacesInfoIA(ia, nameToIndex, indexToName)) return false; } client->firstTA(); while (SPtr ta = client->getTA()) { if (!updateInterfacesInfoIA(ta, nameToIndex, indexToName)) return false; } client->firstPD(); while (SPtr pd = client->getPD()) { if (!updateInterfacesInfoIA(pd, nameToIndex, indexToName)) return false; } } return true; } bool TAddrMgr::updateInterfacesInfoIA(SPtr ia, const NameToIndexMapping& nameToIndex, const IndexToNameMapping& indexToName) { // check if ifacename is empty. If it is, then this is an // old (pre 0.8.4) database that didn't store interface names // info. if (ia->getIfacename().length() == 0) { IndexToNameMapping::const_iterator i = indexToName.find(ia->getIfindex()); if ( i == indexToName.end() ) { Log(Crit) << "Loaded old (pre 0.8.4?) database contains only " << "interface index and that index " << ia->getIfindex() << " is not present in the OS now. Can't fix this database." << LogEnd; return false; } ia->setIfacename(i->second); Log(Debug) << "Updated old (pre 0.8.4?) database: IA with ifindex=" << ia->getIfindex() << " and no ifacename, updated to " << i->second << LogEnd; return true; } // Check if name is present in the system NameToIndexMapping::const_iterator n = nameToIndex.find(ia->getIfacename()); if (n == nameToIndex.end()) { Log(Crit) << "Loaded database mentions interface " << ia->getIfacename() << ", which is not present in the OS." << "Can't use this database." << LogEnd; return false; } // check if ifindex is valid. If it changed, update it. if (ia->getIfindex() != n->second) { Log(Warning) << "Interface index for " << n->first << " has changed: was " << ia->getIfindex() << ", but it is now " << n->second << ", updating database." << LogEnd; ia->setIfindex(n->second); } return true; } // -------------------------------------------------------------------- // --- time related methods ------------------------------------------- // -------------------------------------------------------------------- unsigned long TAddrMgr::getT1Timeout() { unsigned long ts = UINT_MAX; SPtr ptr; ClntsLst.first(); while (ptr = ClntsLst.get() ) { if (ts > ptr->getT1Timeout() ) ts = ptr->getT1Timeout(); } return ts; } unsigned long TAddrMgr::getT2Timeout() { unsigned long ts = UINT_MAX; SPtr ptr; ClntsLst.first(); while (ptr = ClntsLst.get() ) { if (ts > ptr->getT2Timeout() ) ts = ptr->getT2Timeout(); } return ts; } unsigned long TAddrMgr::getPrefTimeout() { unsigned long ts = UINT_MAX; SPtr ptr; ClntsLst.first(); while (ptr = ClntsLst.get() ) { if (ts > ptr->getPrefTimeout() ) ts = ptr->getPrefTimeout(); } return ts; } unsigned long TAddrMgr::getValidTimeout() { unsigned long ts = UINT_MAX; SPtr ptr; ClntsLst.first(); while (ptr = ClntsLst.get() ) { if (ts > ptr->getValidTimeout() ) ts = ptr->getValidTimeout(); } return ts; } /* Prefix Delegation-related method starts here */ /** * adds prefix for a client. If client's IA is missing, add it, too. * * @param clntDuid client DUID * @param clntAddr client address * @param iface interface index used for client communication * @param IAID IA identifier * @param T1 T1 timer value * @param T2 T2 timer value * @param prefix prefix to be added * @param pref preferred lifetime * @param valid valid lifetime * @param length prefix length * @param quiet should it be added quietly? (i.e. no messages printed) * * @return true if adding was successful */ bool TAddrMgr::addPrefix(SPtr clntDuid , SPtr clntAddr, const std::string& ifname, int ifindex, unsigned long IAID, unsigned long T1, unsigned long T2, SPtr prefix, unsigned long pref, unsigned long valid, int length, bool quiet) { // find this client SPtr ptrClient; this->firstClient(); while ( ptrClient = this->getClient() ) { if ( (*ptrClient->getDUID()) == (*clntDuid) ) break; } // have we found this client? if (!ptrClient) { if (!quiet) Log(Debug) << "Adding client (DUID=" << clntDuid->getPlain() << ") to addrDB." << LogEnd; ptrClient = new TAddrClient(clntDuid); this->addClient(ptrClient); } return addPrefix(ptrClient, clntDuid, clntAddr, ifname, ifindex, IAID, T1, T2, prefix, pref, valid, length, quiet); } bool TAddrMgr::addPrefix(SPtr client, SPtr duid , SPtr addr, const std::string& ifname, int ifindex, unsigned long IAID, unsigned long T1, unsigned long T2, SPtr prefix, unsigned long pref, unsigned long valid, int length, bool quiet) { if (!prefix) { Log(Error) << "Attempt to add null prefix failed." << LogEnd; return false; } if (!client) { Log(Error) << "Unable to add prefix, client not defined." << LogEnd; return false; } // find this PD SPtr ptrPD; client->firstPD(); while ( ptrPD = client->getPD() ) { if ( ptrPD->getIAID() == IAID) break; } // have we found this PD? if (!ptrPD) { ptrPD = new TAddrIA(ifname, ifindex, IATYPE_PD, addr, duid, T1, T2, IAID); /// @todo: This setState() was used on reconfigure branch, but not on master ptrPD->setState(STATE_CONFIGURED); client->addPD(ptrPD); if (!quiet) Log(Debug) << "PD: Adding PD (iaid=" << IAID << ") to addrDB." << LogEnd; } ptrPD->setT1(T1); ptrPD->setT2(T2); SPtr ptrPrefix; ptrPD->firstPrefix(); while ( ptrPrefix = ptrPD->getPrefix() ) { if (*ptrPrefix->get()==*prefix) break; } // address already exists if (ptrPrefix) { Log(Warning) << "PD: Prefix " << ptrPrefix->get()->getPlain() << "/" << ptrPrefix->getLength() << " is already assigned to this PD." << LogEnd; return false; } // add address ptrPD->addPrefix(prefix, pref, valid, length); if (!quiet) Log(Debug) << "PD: Adding " << prefix->getPlain() << " prefix to PD (iaid=" << IAID << ") to addrDB." << LogEnd; ptrPD->setDUID(duid); return true; } bool TAddrMgr::updatePrefix(SPtr duid , SPtr addr, const std::string& ifname, int ifindex, unsigned long IAID, unsigned long T1, unsigned long T2, SPtr prefix, unsigned long pref, unsigned long valid, int length, bool quiet) { // find client... SPtr client; this->firstClient(); while ( client = this->getClient() ) { if ( (*client->getDUID()) == (*duid) ) break; } if (!client) { Log(Error) << "Unable to update prefix " << prefix->getPlain() << "/" << (int)length << ": DUID=" << duid->getPlain() << " not found." << LogEnd; return false; } return updatePrefix(client, duid, addr, ifindex, IAID, T1, T2, prefix, pref, valid, length, quiet); } bool TAddrMgr::updatePrefix(SPtr client, SPtr duid , SPtr clntAddr, int iface, unsigned long IAID, unsigned long T1, unsigned long T2, SPtr prefix, unsigned long pref, unsigned long valid, int length, bool quiet) { if (!prefix) { Log(Error) << "Attempt to update null prefix failed." << LogEnd; return false; } if (!client) { Log(Error) << "Unable to update prefix, client not defined." << LogEnd; return false; } // for that client, find IA SPtr pd; client->firstPD(); while ( pd = client->getPD() ) { if ( pd->getIAID() == IAID) break; } // have we found this PD? if (!pd) { Log(Error) << "Unable to find PD (iaid=" << IAID << ") for client " << duid->getPlain() << "." << LogEnd; return false; } pd->setTimestamp(); pd->setT1(T1); pd->setT2(T2); SPtr ptrPrefix; pd->firstPrefix(); while ( ptrPrefix = pd->getPrefix() ) { if (*ptrPrefix->get()==*prefix) break; } // address already exists if (!ptrPrefix) { Log(Warning) << "PD: Prefix " << prefix->getPlain() << " is not known. Unable to update." << LogEnd; return false; } ptrPrefix->setTimestamp(); ptrPrefix->setPref(pref); ptrPrefix->setValid(pref); return true; } /* * Frees prefix (also deletes IA and/or client, if this was last address) */ bool TAddrMgr::delPrefix(SPtr clntDuid, unsigned long IAID, SPtr prefix, bool quiet) { Log(Debug) << "PD: Deleting prefix " << prefix->getPlain() << ", DUID=" << clntDuid->getPlain() << ", iaid=" << IAID << LogEnd; // find this client SPtr ptrClient; this->firstClient(); while ( ptrClient = this->getClient() ) { if ( (*ptrClient->getDUID()) == (*clntDuid) ) break; } // have we found this client? if (!ptrClient) { Log(Warning) << "PD: Client (DUID=" << clntDuid->getPlain() << ") not found in addrDB, cannot delete address and/or client." << LogEnd; return false; } // find this IA SPtr ptrPD; ptrClient->firstPD(); while ( ptrPD = ptrClient->getPD() ) { if ( ptrPD->getIAID() == IAID) break; } // have we found this IA? if (!ptrPD) { Log(Warning) << "PD: iaid=" << IAID << " not assigned to client, cannot delete address and/or PD." << LogEnd; return false; } SPtr ptrPrefix; ptrPD->firstPrefix(); while ( ptrPrefix = ptrPD->getPrefix() ) { if (*ptrPrefix->get()==*prefix) break; } // address already exists if (!ptrPrefix) { Log(Warning) << "PD: Prefix " << *prefix << " not assigned, cannot delete." << LogEnd; return false; } ptrPD->delPrefix(prefix); /// @todo: Cache for prefixes this->addCachedAddr(clntDuid, clntAddr); if (!quiet) Log(Debug) << "PD: Deleted prefix " << *prefix << " from addrDB." << LogEnd; if (!ptrPD->countPrefix()) { if (!quiet) Log(Debug) << "PD: Deleted PD (iaid=" << IAID << ") from addrDB." << LogEnd; ptrClient->delPD(IAID); } if (!ptrClient->countIA() && !ptrClient->countTA() && !ptrClient->countPD() && DeleteEmptyClient) { if (!quiet) Log(Debug) << "PD: Deleted client (DUID=" << clntDuid->getPlain() << ") from addrDB." << LogEnd; this->delClient(clntDuid); } return true; } /** * checks if a specific prefix is used * * @param x * * @return true if prefix is free, false if it is used */ bool TAddrMgr::prefixIsFree(SPtr x) { SPtr client; SPtr pd; SPtr prefix; firstClient(); while (client = getClient()) { client->firstPD(); while (pd = client->getPD()) { pd->firstPrefix(); while (prefix = pd->getPrefix()) { if (*prefix->get()==*x) return false; } } } /* prefix not found, so it's free */ return true; } // -------------------------------------------------------------------- // --- XML-related methods (built-in) --------------------------------- // -------------------------------------------------------------------- /** * @brief loads AddrMgr database from a file * * loads AddrMgr database from a file. Opens specified * XML file and parsed outer \\ tags. * * @param xmlFile filename that contains database * * @return database load status: true=success, false if there were problems */ bool TAddrMgr::xmlLoadBuiltIn(const char * xmlFile) { SPtr clnt; bool AddrMgrTag = false; char buf[256]; FILE * f; if (!(f = fopen(xmlFile,"r"))) { Log(Warning) << "Unable to open " << xmlFile << "." << LogEnd; return false; } while (!feof(f)) { if (!fgets(buf, 255, f)) { Log(Warning) << "File " << xmlFile << " truncated ( not found)." << LogEnd; fclose(f); return false; } if (strstr(buf,"")) { AddrMgrTag = true; continue; } if (strstr(buf,"")) { stringstream tmp(strstr(buf,"")+11); unsigned int ts; tmp >> ts; uint32_t now = (uint32_t)time(NULL); Log(Info) << "DB timestamp:" << ts << ", now()=" << now << ", db is " << (now-ts) << " second(s) old." << LogEnd; continue; } if (strstr(buf,"")) { stringstream tmp(strstr(buf,"") + 17); tmp >> ReplayDetectionValue_; Log(Debug) << "Auth: Replay detection value loaded " << ReplayDetectionValue_ << LogEnd; continue; } if (AddrMgrTag && strstr(buf,"countIA() + clnt->countTA() + clnt->countPD() > 0) { ClntsLst.append(clnt); Log(Debug) << "Client " << clnt->getDUID()->getPlain() << " loaded from disk successfuly (" << clnt->countIA() << "/" << clnt->countPD() << "/" << clnt->countTA() << " ia/pd/ta)." << LogEnd; } else { Log(Info) << "All client's " << clnt->getDUID()->getPlain() << " leases are not valid." << LogEnd; } continue; } } if (strstr(buf,"")) { AddrMgrTag = false; break; } } fclose(f); if (clnt) return true; // client detected, then file loading was successful return false; } /** * @brief parses XML section that defines single client * * parses XML section that defines single client. * That is <AddrClient>...</AddrClient> section. * * @param xmlFile name of the file being currently read * @param f file handle * * @return pointer to a newly created TAddrClient object */ SPtr TAddrMgr::parseAddrClient(const char * xmlFile, FILE *f) { char buf[256]; char * x = 0; int t1 = 0, t2 = 0, iaid = 0, pdid = 0, ifindex = 0; SPtr clnt; SPtr duid; SPtr ia; SPtr ptrpd; SPtr ta; SPtr unicast; string ifacename; std::vector reconfKey; while (!feof(f)) { if (!fgets(buf,255,f)) { Log(Error) << "Truncated " << xmlFile << " file: failed to read AddrClient content." << LogEnd; return SPtr(); } if (strstr(buf,"")+1; if (x) x = strstr(x,""); if (x) *x = 0; // remove trailing xml tag duid = new TDUID(strstr(buf,">")+1); clnt = new TAddrClient(duid); continue; } if (strstr(buf, "") + 1; char* end; if (x) { end = strstr(x, ""); if (end) *end = 0; } reconfKey = textToHex(string(x)); } if(strstr(buf,"countAddr()) { // we don't want empty IAs here clnt->addIA(ia); } else { Log(Debug) << "IA with iaid=" << iaid << " has no valid addresses." << LogEnd; continue; } if (unicast) { ia->setUnicast(unicast); unicast.reset(); } Log(Cont) << LogEnd; continue; } } if(strstr(buf,"setUnicast(unicast); unicast.reset(); } if (ptrpd->countPrefix()) { clnt->addPD(ptrpd); } else { Log(Debug) << "PD with iaid=" << pdid << " has no valid prefixes." << LogEnd; } } } if (strstr(buf,"")) break; } if (clnt) { clnt->ReconfKey_ = reconfKey; } return clnt; } /** * parses TA definition * just a dummy function for now. Temporary addresses are ignored completely * * @param xmlFile name of the file being currently read * @param f file handle * * @return will return parsed temporary IA someday. Returns 0 now */ SPtr TAddrMgr::parseAddrTA(const char * xmlFile, FILE *f) { char buf[256]; while(!feof(f)) { if (!fgets(buf,255,f)) { Log(Error) << "Failed to parse AddrTA. File " << xmlFile << " truncated." << LogEnd; return SPtr(); } if (strstr(buf,"")){ break; } } return SPtr(); } /** * @brief parses part XML section that represents single PD * * (section between <AddrPD>...</AddrPD>) * * @param xmlFile name of the file being currently read * @param f file handle * @param t1 T1 value * @param t2 T2 value * @param iaid IAID * @param iface interface index * * @return pointer to newly created TAddrIA object */ SPtr TAddrMgr::parseAddrPD(const char * xmlFile, FILE * f, int t1,int t2, int iaid, const string& ifacename, int ifindex, SPtr unicast /* =0 */) { // IA paramteres char buf[256]; char * x = 0; SPtr ptrpd; SPtr addr; SPtr pr; SPtr duid; while (!feof(f)) { if (!fgets(buf,255,f)) { Log(Error) << "Failed to parse AddrPD entry. File " << xmlFile << " truncated." << LogEnd; return SPtr(); } if (strstr(buf,"duid")) { //char * x; x = strstr(buf,">")+1; if (x) x = strstr(x,""); if (x) *x = 0; // remove trailing xml tag duid = new TDUID(strstr(buf,">")+1); // Log(Debug) << "Parsed IA: duid=" << duid->getPlain() << LogEnd; Log(Debug) << "Loaded PD from a file: t1=" << t1 << ", t2="<< t2 << ", iaid=" << iaid << ", iface=" << ifacename << "/" << ifindex << LogEnd; ptrpd = new TAddrIA(ifacename, ifindex, IATYPE_PD, SPtr(), duid, t1, t2, iaid); // @todo: Why are we always setting CONFIRMME state? What if the address/prefix // hasn't changed? ptrpd->setState(STATE_CONFIRMME); continue; } if (strstr(buf,"get())) { ptrpd->addPrefix(pr); pr->setTentative(ADDRSTATUS_NO); //Log(Debug) << "Parsed prefix " << pr->getPlain() << LogEnd; } else { Log(Debug) << "Prefix " << pr->get()->getPlain() << " does no longer match current configuration. Lease dropped." << LogEnd; } } } if (strstr(buf,"")) break; } if (ptrpd) ptrpd->setTentative(); return ptrpd; } /** * @brief parses part XML section that represents single IA * * (section between <AddrIA>...</AddrIA>) * * @param xmlFile name of the file being currently read * @param f file handle * @param t1 parsed T1 timer value * @param t2 parsed T2 timer value * @param iaid parsed IAID * @param iface parsed interface index (ifindex) * * @return pointer to newly created TAddrIA object */ SPtr TAddrMgr::parseAddrIA(const char * xmlFile, FILE * f, int t1,int t2, int iaid, const string& ifacename, int ifindex, SPtr unicast) { // IA paramteres char buf[256]; char * x = 0; SPtr ia; SPtr addr; SPtr duid; while (!feof(f)) { if (!fgets(buf,255,f)) { Log(Error) << "Failed to parse AddrIA entry. File " << xmlFile << " truncated." << LogEnd; return SPtr(); } if (strstr(buf,"")+1; if (x) x = strstr(x,""); if (x) *x = 0; // remove trailing xml tag duid = new TDUID(strstr(buf,">")+1); // Log(Debug) << "Parsed IA: duid=" << duid->getPlain() << LogEnd; Log(Debug) << "Loaded IA from a file: t1=" << t1 << ", t2="<< t2 << ",iaid=" << iaid << ", iface=" << ifacename << "/" << ifindex << LogEnd; ia = new TAddrIA(ifacename, ifindex, IATYPE_IA, SPtr(), duid, t1,t2, iaid); continue; } if (strstr(buf,"")) { char * beg = strstr(buf, ">")+1; if (!beg) continue; // malformed line, ignore it char * end = strstr(beg, ""); if (!end) continue; // malformed line, ignore it *end = 0; SPtr dns = new TIPv6Addr(beg, true); if (ia) ia->setFQDNDnsServer(dns); continue; } if (strstr(buf, " char * end = strstr(beg, "\""); string duidTxt(beg, end); SPtr duid = new TDUID(duidTxt.c_str()); beg = strstr(buf, "used=\"") + 6; if (!beg) { continue; } end = strstr(beg, "\""); string usedTxt(beg, end); bool used = false; if (usedTxt == "TRUE") used = true; beg = strstr(buf, ">") + 1; if (!beg) continue; // malformed line: " end = strstr(beg, "<"); if (!end) continue; *end = 0; SPtr fqdn = new TFQDN(duid, string(beg, end), used); if (ia) ia->setFQDN(fqdn); continue; } if (strstr(buf,"get())) { ia->addAddr(addr); addr->setTentative(ADDRSTATUS_NO); } else { Log(Debug) << "Address " << addr->get()->getPlain() << " is no longer supported. Lease dropped." << LogEnd; } } } if (strstr(buf,"")) break; } if (ia) ia->setTentative(); return ia; } /** * @brief parses single address * * parses single address that is defined in <AddrAddr> tag. * * @param xmlFile name of the file being currently read * @param buf null terminated buffer that contains string to parse * @param pd specified if AddrAddr is actually a prefix * * @return pointer to the newly created TAddrAddr object */ SPtr TAddrMgr::parseAddrAddr(const char * xmlFile, char * buf, bool pd) { // address parameters int prefix = CLIENT_DEFAULT_PREFIX_LENGTH; SPtr addr; SPtr addraddr; if (strstr(buf, ""))) { if (!pd) x = strstr(x, ""); else x = strstr(x, ""); if (x) *x = 0; addr = new TIPv6Addr(strstr(buf,">")+1, true); Log(Debug) << "Parsed addr=" << addr->getPlain() << ", pref=" << pref << ", valid=" << valid << ",ts=" << timestamp << LogEnd; } if (addr && timestamp && pref && valid && pd==false) { addraddr = new TAddrAddr(addr, pref, valid, prefix); addraddr->setTimestamp(timestamp); } } return addraddr; } SPtr TAddrMgr::parseAddrPrefix(const char * xmlFile, char * buf, bool pd) { // address parameters SPtr addr; SPtr addraddr; if (strstr(buf, ""))) { if (pd) x = strstr(x, ""); else x = strstr(x, ""); if (x) *x = 0; addr = new TIPv6Addr(strstr(buf,">")+1, true); Log(Debug) << "Parsed prefix " << addr->getPlain() << "/" << length << ", pref=" << pref << ", valid=" << valid << ",ts=" << timestamp << LogEnd; } if (addr && timestamp && pref && valid && pd==true) { addraddr = new TAddrPrefix(addr, pref, valid, length); addraddr->setTimestamp(timestamp); } } return addraddr; } /** * @brief returns if shutdown is complete * * returns is AddrMgr completed its operations and is ready * to conclude shutdown. * * @return true - I'm done. false - keep going */ bool TAddrMgr::isDone() { return this->IsDone; } TAddrMgr::~TAddrMgr() { } uint64_t TAddrMgr::getNextReplayDetectionValue() { return ++ReplayDetectionValue_; } // -------------------------------------------------------------------- // --- operators ------------------------------------------------------ // -------------------------------------------------------------------- ostream & operator<<(ostream & strum,TAddrMgr &x) { strum << "" << endl; strum << " " << (uint32_t)time(NULL) << "" << endl; strum << " " << x.ReplayDetectionValue_ << "" << endl; x.print(strum); SPtr ptr; x.ClntsLst.first(); while ( ptr = x.ClntsLst.get() ) { strum << *ptr; } strum << "" << endl; return strum; } dibbler-1.0.1/AddrMgr/Makefile.am0000664000175000017500000000042412233256142013413 00000000000000SUBDIRS= . if HAVE_GTEST SUBDIRS += tests endif noinst_LIBRARIES = libAddrMgr.a libAddrMgr_a_CPPFLAGS = -I$(top_srcdir)/Misc libAddrMgr_a_SOURCES = AddrAddr.cpp AddrAddr.h AddrClient.cpp AddrClient.h AddrIA.cpp AddrIA.h AddrMgr.cpp AddrMgr.h AddrPrefix.cpp AddrPrefix.h dibbler-1.0.1/AddrMgr/AddrIA.cpp0000644000175000017500000003327512556505402013163 00000000000000/* * Dibbler - a portable DHCPv6 * * authors: Tomasz Mrugalski * Marek Senderski * changes: Grzegorz Pluto * * released under GNU GPL v2 only licence * */ #include #include #include "Portable.h" #include "DHCPConst.h" #include "SmartPtr.h" #include "AddrIA.h" #include "AddrAddr.h" #include "DHCPDefaults.h" #include "Logger.h" using namespace std; /** * @brief constructor for new IA * * used for creation of IA, a container for addresses * * @param ifacename, name of the interface * @param ifindex interface index (ifindex) * @param type specifies container type (IA, PD or TA) * @param addr address * @param duid DUID (client DUID in server's database and server DUID in client's database) * @param t1 T1 timer * @param t2 T2 timer * @param id IAID (if this is really IA) or PDID (if this is PD, not IA) * */ TAddrIA::TAddrIA(const std::string& ifacename, int ifindex, TIAType type, SPtr addr, SPtr duid, unsigned long t1, unsigned long t2,unsigned long id) :IAID(id),T1(t1),T2(t2), State(STATE_NOTCONFIGURED), Tentative(ADDRSTATUS_UNKNOWN), Timestamp((unsigned long)time(NULL)), Unicast(false), Iface_(ifacename), Ifindex_(ifindex), Type(type) { this->setDUID(duid); if (addr) this->setUnicast(addr); else this->setMulticast(); } unsigned long TAddrIA::getIAID() { return this->IAID; } /** * resets IA to unconfigured state * */ void TAddrIA::reset() { setState(STATE_NOTCONFIGURED); } const std::string& TAddrIA::getIfacename() { return Iface_; } int TAddrIA::getIfindex() { return Ifindex_; } void TAddrIA::setT1(unsigned long T1) { this->T1 = T1; } unsigned long TAddrIA::getT1() { return T1; } unsigned long TAddrIA::getT2() { return T2; } void TAddrIA::setT2(unsigned long T2) { this->T2 = T2; } void TAddrIA::addAddr(SPtr x) { AddrLst.append(x); Tentative = ADDRSTATUS_UNKNOWN; } void TAddrIA::addAddr(SPtr addr, unsigned long pref, unsigned long valid) { SPtr ptr = new TAddrAddr(addr, pref, valid); AddrLst.append(ptr); Tentative = ADDRSTATUS_UNKNOWN; } void TAddrIA::addAddr(SPtr addr, unsigned long pref, unsigned long valid, int prefix) { SPtr ptr = new TAddrAddr(addr, pref, valid, prefix); AddrLst.append(ptr); Tentative = ADDRSTATUS_UNKNOWN; } enum EState TAddrIA::getState() { return this->State; } void TAddrIA::setState(enum EState state) { this->State = state; } TAddrIA::~TAddrIA() { } // -------------------------------------------------------------------- // --- contact with server using Unicast/Multicast -------------------- // -------------------------------------------------------------------- void TAddrIA::setUnicast(SPtr addr) { this->Unicast = true; this->SrvAddr=addr; } void TAddrIA::setMulticast() { this->Unicast = false; } SPtr TAddrIA::getSrvAddr() { if (!this->Unicast) return SPtr(); else return SrvAddr; } // -------------------------------------------------------------------- // --- server's DUID -------------------------------------------------- // -------------------------------------------------------------------- void TAddrIA::setDUID(SPtr duid) { this->DUID = duid; } SPtr TAddrIA::getDUID() { return DUID; } // -------------------------------------------------------------------- // --- list related methods ------------------------------------------- // -------------------------------------------------------------------- void TAddrIA::firstAddr() { AddrLst.first(); } // returns next address SPtr TAddrIA::getAddr() { return AddrLst.get(); } /** * This function returns TAddrAddr object or 0 if such address is not present * * @param addr * * @return */ SPtr TAddrIA::getAddr(SPtr addr) { if (!addr) { return SPtr(); } AddrLst.first(); SPtr ptrAddr; while (ptrAddr = AddrLst.get() ) { if ( (*addr)==(*(ptrAddr->get())) ) return ptrAddr; } return SPtr(); } int TAddrIA::countAddr() { return AddrLst.count(); } int TAddrIA::delAddr(SPtr addr) { SPtr< TAddrAddr> ptr; AddrLst.first(); while (ptr = AddrLst.get()) { if (*(ptr->get())==(*addr)) { AddrLst.del(); return 0; } } return -1; } // -------------------------------------------------------------------- // --- prefix related methods ----------------------------------------- // -------------------------------------------------------------------- void TAddrIA::firstPrefix() { this->PrefixLst.first(); } SPtr TAddrIA::getPrefix() { return this->PrefixLst.get(); } void TAddrIA::addPrefix(SPtr x) { this->PrefixLst.append(x); } void TAddrIA::addPrefix(SPtr addr, unsigned long pref, unsigned long valid, int length) { SPtr ptr = new TAddrPrefix(addr, pref, valid, length); PrefixLst.append(ptr); } int TAddrIA::countPrefix() { return this->PrefixLst.count(); } bool TAddrIA::delPrefix(SPtr x) { SPtr ptr; PrefixLst.first(); while (ptr = PrefixLst.get()) { /// @todo: should we compare prefix length, too? if (*(ptr->get())==(*x->get())) { PrefixLst.del(); return true; } } return false; } bool TAddrIA::delPrefix(SPtr x) { SPtr ptr; PrefixLst.first(); while (ptr = PrefixLst.get()) { /// @todo: should we compare prefix length, too? if (*(ptr->get())==(*x)) { PrefixLst.del(); return true; } } return false; } // -------------------------------------------------------------------- // --- time related methods ------------------------------------------- // -------------------------------------------------------------------- unsigned long TAddrIA::getT1Timeout() { unsigned long ts, x; ts = Timestamp + T1; if (tsx) return ts-x; else return 0; } unsigned long TAddrIA::getT2Timeout() { unsigned long ts, x; ts = Timestamp + T2; if (tsx) return ts-x; else return 0; } unsigned long TAddrIA::getPrefTimeout() { unsigned long ts = UINT_MAX; SPtr ptr; this->AddrLst.first(); while (ptr = this->AddrLst.get() ) { if (ts > ptr->getPrefTimeout()) ts = ptr->getPrefTimeout(); } return ts; } unsigned long TAddrIA::getMaxValidTimeout() { unsigned long ts = 0; // should be 0 SPtr ptr; this->AddrLst.first(); while (ptr = this->AddrLst.get() ) { if (ts < ptr->getValidTimeout()) ts = ptr->getValidTimeout(); } SPtr prefix; firstPrefix(); while (prefix = getPrefix()) { if (ts < prefix->getValidTimeout()) ts = prefix->getValidTimeout(); } return ts; } unsigned long TAddrIA::getValidTimeout() { unsigned long ts = UINT_MAX; SPtr ptr; this->AddrLst.first(); while (ptr = this->AddrLst.get() ) { if (ts > ptr->getValidTimeout()) ts = ptr->getValidTimeout(); } SPtr prefix; firstPrefix(); while (prefix = getPrefix()) { if (ts > prefix->getValidTimeout()) ts = prefix->getValidTimeout(); } return ts; } // set timestamp void TAddrIA::setTimestamp(unsigned long ts) { this->Timestamp = ts; SPtr ptr; AddrLst.first(); while (ptr = AddrLst.get() ) { ptr->setTimestamp(ts); } } void TAddrIA::setTimestamp() { this->setTimestamp((unsigned long)time(NULL)); } unsigned long TAddrIA::getTimestamp() { return Timestamp; } /** * @brief returns time till DAD procedure finishes * * returns how much time left until DAD procedure is finished * * @return timeout in seconds */ unsigned long TAddrIA::getTentativeTimeout() { unsigned long min = DHCPV6_INFINITY; switch (this->getTentative()) { case ADDRSTATUS_YES: return 0; case ADDRSTATUS_NO: return DHCPV6_INFINITY; case ADDRSTATUS_UNKNOWN: SPtr ptrAddr; AddrLst.first(); while ( ptrAddr = AddrLst.get() ) { if (ptrAddr->getTentative()==ADDRSTATUS_UNKNOWN) if (min > ptrAddr->getTimestamp()+DADTIMEOUT-(unsigned long)time(NULL) ) { min = ptrAddr->getTimestamp()+DADTIMEOUT-(unsigned long)time(NULL); } } } return min; } /** * @brief checks and returns tentative status * * checks if DAD procedure is finished and returns tentative status * * @return Tentative status (ADDRSTATUS_YES/ADDRSTATUS_NO/ADDRSTATUS_UNKNOWN) */ enum EAddrStatus TAddrIA::getTentative() { if (Tentative != ADDRSTATUS_UNKNOWN) return Tentative; SPtr ptrAddr; AddrLst.first(); bool allChecked = true; while ( ptrAddr = AddrLst.get() ) { switch (ptrAddr->getTentative()) { case ADDRSTATUS_YES: Log(Warning) << "DAD failed. Address " << ptrAddr->get()->getPlain() << " was detected as tentative." << LogEnd; this->Tentative = ADDRSTATUS_YES; return ADDRSTATUS_YES; case ADDRSTATUS_NO: continue; case ADDRSTATUS_UNKNOWN: if ( ptrAddr->getTimestamp()+DADTIMEOUT < (unsigned long)time(NULL) ) { switch (is_addr_tentative(NULL, Ifindex_, ptrAddr->get()->getPlain()) ) { case LOWLEVEL_TENTATIVE_YES: ptrAddr->setTentative(ADDRSTATUS_YES); this->Tentative=ADDRSTATUS_YES; return ADDRSTATUS_YES; case LOWLEVEL_TENTATIVE_NO: ptrAddr->setTentative(ADDRSTATUS_NO); Log(Debug) << "DAD finished successfully. Address " << ptrAddr->get()->getPlain() << " is not tentative." << LogEnd; break; default: Log(Error) << "DAD inconclusive. Unable to dermine " << ptrAddr->get()->getPlain() << " address state. Assuming NOT TENTATIVE." << LogEnd; ptrAddr->setTentative(ADDRSTATUS_NO); break; } } else allChecked = false; } } if (allChecked) { this->Tentative = ADDRSTATUS_NO; return ADDRSTATUS_NO; } else { return ADDRSTATUS_UNKNOWN; } } /** * @brief sets tentative state, according to states of addresses * * sets tentative state, based on stats of addresses defined within * this IA * */ void TAddrIA::setTentative() { SPtr ptrAddr; AddrLst.first(); Tentative = ADDRSTATUS_NO; while ( ptrAddr = AddrLst.get() ) { switch (ptrAddr->getTentative()) { case ADDRSTATUS_YES: Tentative = ADDRSTATUS_YES; return; case ADDRSTATUS_NO: continue; case ADDRSTATUS_UNKNOWN: Tentative = ADDRSTATUS_UNKNOWN; break; } } } /** * stores DNS server address, at which DNSUpdate was performed * * @param srvAddr DNS Server address to be stored */ void TAddrIA::setFQDNDnsServer(SPtr srvAddr) { this->fqdnDnsServer = srvAddr; } /** * return DNS server address, where the DNSUpdate was performed * * @return DNS server that DNS Update was performed at */ SPtr TAddrIA::getFQDNDnsServer() { return this->fqdnDnsServer; } /** * stores FQDN information * * @param fqdn */ void TAddrIA::setFQDN(SPtr fqdn) { this->fqdn = fqdn; } /** * returns stored FQDN information * * @return */ SPtr TAddrIA::getFQDN() { return this->fqdn; } // -------------------------------------------------------------------- // --- operators ------------------------------------------------------ // -------------------------------------------------------------------- std::ostream & operator<<(std::ostream & strum, TAddrIA &x) { SPtr ptr; SPtr prefix; string name; switch (x.Type) { case IATYPE_IA: name="AddrIA"; break; case IATYPE_TA: name="AddrTA"; break; case IATYPE_PD: name="AddrPD"; break; } strum << " <" << name << " unicast=\""; if (x.Unicast) strum << x.SrvAddr->getPlain(); strum << "\" T1=\"" << x.T1 << "\"" << " T2=\"" << x.T2 << "\""; strum << " IAID=\"" << x.IAID << "\"" << " state=\"" << StateToString(x.State) << "\" ifacename=\"" << x.Iface_ << "\" iface=\"" << x.Ifindex_ << "\"" << ">" << endl; if (x.getDUID() && x.getDUID()->getLen()) strum << " " << *x.DUID; // Address list x.AddrLst.first(); while (ptr = x.AddrLst.get()) { if (ptr) strum << " " << *ptr; } // Prefix list x.PrefixLst.first(); while (prefix = x.PrefixLst.get()) { strum << " " << *prefix; } // FQDN if (x.Type != IATYPE_PD) { // it does not make sense to mention FQDN in PD if (x.fqdnDnsServer) { strum << " " << x.fqdnDnsServer->getPlain() << "" << endl; } else { strum << " " << endl; } if (x.fqdn) { strum << " " << *x.fqdn; } else { strum << " " << endl; } } strum << " " << dec << endl; return strum; } dibbler-1.0.1/AddrMgr/AddrPrefix.cpp0000664000175000017500000000147112233256142014116 00000000000000/* * Dibbler - a portable DHCPv6 * * author: Krzysztof Wnuk * * released under GNU GPL v2 licence * */ #include #include #include "Portable.h" #include "AddrPrefix.h" #include "DHCPConst.h" #include "Logger.h" using namespace std; TAddrPrefix::TAddrPrefix(SPtr prefix, long pref, long valid, int length) :TAddrAddr(prefix, pref, valid) { this->Length = length; } int TAddrPrefix::getLength() { return this->Length; } ostream & operator<<(ostream & strum,TAddrPrefix &x) { strum << "" << x.Addr->getPlain()<< "" << std::endl; return strum; } dibbler-1.0.1/AddrMgr/AddrAddr.h0000644000175000017500000000246212277722750013212 00000000000000/* * Dibbler - a portable DHCPv6 * * authors: Tomasz Mrugalski * Marek Senderski * * released under GNU GPL v2 only licence */ #ifndef ADDRADDR_H #define ADDRADDR_H #include #include #include "IPv6Addr.h" #include "SmartPtr.h" #include "DHCPConst.h" class TAddrAddr { friend std::ostream & operator<<(std::ostream & strum, TAddrAddr &x); public: TAddrAddr(SPtr addr, long pref, long valid); TAddrAddr(SPtr addr, long pref, long valid, int prefix); // return address in packed format (char[16]) SPtr get(); // lifetime related unsigned long getPref(); unsigned long getValid(); unsigned long getPrefTimeout(); void setPref(unsigned long pref); void setValid(unsigned long valid); unsigned long getValidTimeout(); int getPrefix(); // timestamp long getTimestamp(); void setTimestamp(long ts); void setTimestamp(); // tentative enum EAddrStatus getTentative(); void setTentative(enum EAddrStatus state); protected: enum EAddrStatus Tentative; unsigned long Prefered; unsigned long Valid; SPtr Addr; unsigned long Timestamp; int Prefix; }; typedef std::list< SPtr > TAddrList; #endif dibbler-1.0.1/AddrMgr/AddrIA.h0000644000175000017500000000711612277722750012632 00000000000000/* * Dibbler - a portable DHCPv6 * * authors: Tomasz Mrugalski * Marek Senderski * changes: Grzegorz Pluto * * released under GNU GPL v2 only licence * */ class TAddrIA; #ifndef ADDRIA_H #define ADDRIA_H #include #include #include "DHCPConst.h" #include "SmartPtr.h" #include "Container.h" #include "AddrAddr.h" #include "AddrPrefix.h" #include "DUID.h" #include "FQDN.h" class TAddrIA { public: friend std::ostream & operator<<(std::ostream & strum,TAddrIA &x); TAddrIA(const std::string& ifacename, int ifindex, TIAType mode, SPtr addr, SPtr duid, unsigned long T1, unsigned long T2,unsigned long ID); ~TAddrIA(); //---IA state--- enum EState getState(); void setState(enum EState state); void setT1(unsigned long T1); void setT2(unsigned long T2); void reset(); unsigned long getT1(); unsigned long getT2(); unsigned long getIAID(); //---Iface details --- const std::string& getIfacename(); int getIfindex(); void setIfindex(int ifindex) { Ifindex_ = ifindex; } void setIfacename(const std::string& ifacename) { Iface_ = ifacename; } //---Server's DUID--- void setDUID(SPtr duid); SPtr getDUID(); //---Contact with server using Unicast/Multicast--- void setUnicast(SPtr addr); void setMulticast(); SPtr getSrvAddr(); //--- address list related methods--- void addAddr(SPtr x); void addAddr(SPtr addr, unsigned long pref, unsigned long valid); void addAddr(SPtr addr, unsigned long pref, unsigned long valid, int prefix); //--- prefix list related methods --- void firstPrefix(); SPtr getPrefix(); void addPrefix(SPtr x); void addPrefix(SPtr addr, unsigned long pref, unsigned long valid, int length); int countPrefix(); bool delPrefix(SPtr x); bool delPrefix(SPtr x); // --- address management --- void firstAddr(); SPtr getAddr(); SPtr getAddr(SPtr addr); int countAddr(); int delAddr(SPtr addr); // timestamp void setTimestamp(unsigned long ts); void setTimestamp(); unsigned long getT1Timeout(); unsigned long getT2Timeout(); unsigned long getPrefTimeout(); unsigned long getValidTimeout(); unsigned long getMaxValidTimeout(); unsigned long getTimestamp(); //---tentative--- unsigned long getTentativeTimeout(); enum EAddrStatus getTentative(); void setTentative(); //---DNS Updates--- void setFQDNDnsServer(SPtr srvAddr); SPtr getFQDNDnsServer(); void setFQDN(SPtr fqdn); SPtr getFQDN(); private: List(TAddrAddr) AddrLst; List(TAddrPrefix) PrefixLst; unsigned long IAID; unsigned long T1; unsigned long T2; enum EState State; // State of this IA enum EAddrStatus Tentative; unsigned long Timestamp; // timestamp of last IA refresh (renew/rebind/confirm etc.) SPtr DUID; // Server which maintains this IA is connected by unicast or multicast bool Unicast; SPtr SrvAddr; std::string Iface_; ///< Interface name int Ifindex_; ///< Interface index SPtr fqdnDnsServer; // DNS Updates was performed to that server SPtr fqdn; // this FQDN object was used to perform update TIAType Type; // type of this IA (IA, TA or PD) }; #endif dibbler-1.0.1/AddrMgr/AddrClient.cpp0000644000175000017500000002064712556505340014110 00000000000000/* * Dibbler - a portable DHCPv6 * * authors: Tomasz Mrugalski * Marek Senderski * changes: Krzysztof Wnuk * released under GNU GPL v2 licence * */ #include #include #include #include #include "AddrClient.h" #include "Logger.h" #include "hex.h" using namespace std; /** * @brief constructor for creating client * * constructor used for creating client container. Client * contains list of IAs, TAs and PDs. * * @param duid Client DUID * */ TAddrClient::TAddrClient(SPtr duid) :DUID_(duid), SPI_(0), ReplayDetectionRcvd_(0) { } SPtr TAddrClient::getDUID() { return DUID_; } // --- IA ------------------------------------------------------------ /** * @brief rewinds IA list to the beginning * * rewinds IA list to the beginning */ void TAddrClient::firstIA() { IAsLst.first(); } /** * @brief returns next IA * * returns next IA. Make sure to all firstIA() method before calling * getIA() for the first time. * * * @return next IA */ SPtr TAddrClient::getIA() { return IAsLst.get(); } SPtr TAddrClient::getIA(unsigned long IAID) { SPtr ptr; IAsLst.first(); while ( ptr = IAsLst.get() ) { if (ptr->getIAID() == IAID) { return ptr; } } return SPtr(); } void TAddrClient::addIA(SPtr ia) { if (getIA(ia->getIAID())) { Log(Debug) << "Unable to add IA (iaid=" << ia->getIAID() << "), such IA already exists." << LogEnd; return; } IAsLst.append(ia); } /** * @brief returns number of IAs in this client * * returns number of IAs in this client * * @return number of IAs */ int TAddrClient::countIA() { return IAsLst.count(); } bool TAddrClient::delIA(unsigned long IAID) { SPtr ptr; IAsLst.first(); while ( ptr = IAsLst.get() ) { if (ptr->getIAID() == IAID) { IAsLst.del(); return true; } } return false; } // --- PD ------------------------------------------------------------ SPtr TAddrClient::getPD() { return PDLst.get(); } SPtr TAddrClient::getPD(unsigned long IAID) { SPtr ptr; PDLst.first(); while ( ptr = PDLst.get() ) { if (ptr->getIAID() == IAID) { return ptr; } } return SPtr(); } void TAddrClient::firstPD() { PDLst.first(); } void TAddrClient::addPD(SPtr pd) { PDLst.append(pd); } int TAddrClient::countPD() { return PDLst.count(); } bool TAddrClient::delPD(unsigned long IAID) { SPtr ptr; PDLst.first(); while ( ptr = PDLst.get() ) { if (ptr->getIAID() == IAID) { PDLst.del(); return true; } } return false; } // --- TA ------------------------------------------------------------ SPtr TAddrClient::getTA() { return TALst.get(); } SPtr TAddrClient::getTA(unsigned long IAID) { SPtr ptr; TALst.first(); while ( ptr = TALst.get() ) { if (ptr->getIAID() == IAID) { return ptr; } } return SPtr(); } void TAddrClient::firstTA() { TALst.first(); } void TAddrClient::addTA(SPtr ia) { TALst.append(ia); } int TAddrClient::countTA() { return TALst.count(); } bool TAddrClient::delTA(unsigned long iaid) { SPtr ptr; TALst.first(); while ( ptr = TALst.get() ) { if (ptr->getIAID() == iaid) { TALst.del(); return true; } } return false; } // -------------------------------------------------------------------- // --- time related methods ------------------------------------------- // -------------------------------------------------------------------- unsigned long TAddrClient::getT1Timeout() { SPtr ptr; unsigned long ts = UINT_MAX; IAsLst.first(); while ( ptr = IAsLst.get() ) { if (ptr->getState()==STATE_CONFIGURED) { if (ts > ptr->getT1Timeout()) ts = ptr->getT1Timeout(); }else if (ptr->getState()==STATE_NOTCONFIGURED){ ts = 0; } } PDLst.first(); while ( ptr = PDLst.get() ) { if (ptr->getState()!=STATE_CONFIGURED) continue; if (ts > ptr->getT1Timeout()) ts = ptr->getT1Timeout(); } return ts; } unsigned long TAddrClient::getT2Timeout() { SPtr ptr; unsigned long ts = UINT_MAX; IAsLst.first(); while ( ptr = IAsLst.get() ) { if (ptr->getState()!=STATE_CONFIGURED) continue; if (ts > ptr->getT2Timeout()) ts = ptr->getT2Timeout(); } PDLst.first(); while ( ptr = PDLst.get() ) { if (ptr->getState()!=STATE_CONFIGURED) continue; if (ts > ptr->getT2Timeout()) ts = ptr->getT2Timeout(); } return ts; } unsigned long TAddrClient::getPrefTimeout() { SPtr ptr; unsigned long ts = UINT_MAX; IAsLst.first(); while ( ptr = IAsLst.get() ) { if (ptr->getState()!=STATE_CONFIGURED) continue; if (ts > ptr->getPrefTimeout()) ts = ptr->getPrefTimeout(); } PDLst.first(); while ( ptr = PDLst.get() ) { if (ptr->getState()!=STATE_CONFIGURED) continue; if (ts > ptr->getPrefTimeout()) ts = ptr->getPrefTimeout(); } return ts; } unsigned long TAddrClient::getValidTimeout() { SPtr ptr; unsigned long ts = UINT_MAX; IAsLst.first(); while ( ptr = IAsLst.get() ) { if (ts > ptr->getValidTimeout()) ts = ptr->getValidTimeout(); } TALst.first(); while ( ptr = TALst.get() ) { if (ts > ptr->getValidTimeout()) ts = ptr->getValidTimeout(); } PDLst.first(); while ( ptr = PDLst.get() ) { if (ts > ptr->getValidTimeout()) ts = ptr->getValidTimeout(); } return ts; } unsigned long TAddrClient::getLastTimestamp() { unsigned long ts = 0; SPtr ptr; IAsLst.first(); while ( ptr = IAsLst.get() ) { if (ts < ptr->getTimestamp()) ts = ptr->getTimestamp(); } firstTA(); while ( ptr = getTA() ) { if (ts < ptr->getTimestamp()) ts = ptr->getTimestamp(); } PDLst.first(); while ( ptr = PDLst.get() ) { if (ts > ptr->getTimestamp()) ts = ptr->getTimestamp(); } return ts; } // -------------------------------------------------------------------- // --- authentication related methods --------------------------------- // -------------------------------------------------------------------- uint32_t TAddrClient::getSPI() { return SPI_; } void TAddrClient::setSPI(uint32_t val) { SPI_ = val; } uint64_t TAddrClient::getReplayDetectionRcvd() { return ReplayDetectionRcvd_; } void TAddrClient::setReplayDetectionRcvd(uint64_t val) { ReplayDetectionRcvd_ = val; } void TAddrClient::generateReconfKey() { ReconfKey_.resize(16); fill_random(&ReconfKey_[0], 16); } // -------------------------------------------------------------------- // --- operators ------------------------------------------------------ // -------------------------------------------------------------------- std::ostream & operator<<(std::ostream & strum, TAddrClient &x) { strum << " " << endl; if (x.DUID_->getLen()) strum << " " << *x.DUID_; if (x.DUID_->getLen()==1) strum << " " << endl; // reconfigure-key if (!x.ReconfKey_.empty()) { strum << " " << hexToText(&x.ReconfKey_[0], x.ReconfKey_.size(), false) << "" << endl; } else { strum << " " << endl; } strum << " " << endl; SPtr ptr; x.IAsLst.first(); while (ptr = x.IAsLst.get() ) { strum << *ptr; } strum << " " << endl; x.TALst.first(); while (ptr = x.TALst.get() ) { strum << *ptr; } strum << " " << endl; x.PDLst.first(); while (ptr = x.PDLst.get() ) { strum << *ptr; } strum << " " << endl; return strum; } dibbler-1.0.1/AddrMgr/AddrClient.h0000644000175000017500000000406612277722750013560 00000000000000/* * Dibbler - a portable DHCPv6 * * authors: Tomasz Mrugalski * Marek Senderski * changes: Michal Kowalczuk * * released under GNU GPL v2 licence * */ class TAddrClient; #ifndef ADDRCLIENT_H #define ADDRCLIENT_H #include #include "SmartPtr.h" #include "Container.h" #include "AddrIA.h" #include "DUID.h" #include "Portable.h" class TAddrClient { friend std::ostream & operator<<(std::ostream & strum, TAddrClient &x); public: TAddrClient(SPtr duid); SPtr getDUID(); //--- IA list --- void firstIA(); SPtr getIA(); SPtr getIA(unsigned long IAID); void addIA(SPtr ia); bool delIA(unsigned long IAID); int countIA(); //--- PD list --- void firstPD(); SPtr getPD(); SPtr getPD(unsigned long IAID); void addPD(SPtr ia); bool delPD(unsigned long IAID); int countPD(); //--- TA list --- void firstTA(); SPtr getTA(); SPtr getTA(unsigned long iaid); void addTA(SPtr ia); bool delTA(unsigned long iaid); int countTA(); // time related unsigned long getT1Timeout(); unsigned long getT2Timeout(); unsigned long getPrefTimeout(); unsigned long getValidTimeout(); //authentication uint32_t getSPI(); void setSPI(uint32_t val); uint64_t getReplayDetectionRcvd(); void setReplayDetectionRcvd(uint64_t val); void generateReconfKey(); unsigned long getLastTimestamp(); /// @brief 128 bits of pure randomness used in reconfigure process /// /// Reconfigure Key nonce is set be the server and the stored by the client. /// It is later used to check if the reconfigure message came from the same /// server that initially provided the configuration. std::vector ReconfKey_; private: List(TAddrIA) IAsLst; List(TAddrIA) TALst; List(TAddrIA) PDLst; SPtr DUID_; uint32_t SPI_; uint64_t ReplayDetectionRcvd_; }; #endif dibbler-1.0.1/AddrMgr/AddrPrefix.h0000664000175000017500000000113612233256142013561 00000000000000/* * Dibbler - a portable DHCPv6 * * author: Krzysztof Wnuk * changes: Tomasz Mrugalski * */ #ifndef ADDRPREFIX_H #define ADDRPREFIX_H #include #include "IPv6Addr.h" #include "AddrAddr.h" #include "SmartPtr.h" #include "DHCPConst.h" class TAddrPrefix: public TAddrAddr { friend std::ostream & operator<<(std::ostream & strum,TAddrPrefix &x); public: TAddrPrefix(SPtr addr, long pref, long valid, int length); // return address in packed format (char[16]) int getLength(); private: int Length; }; #endif dibbler-1.0.1/AddrMgr/Makefile.in0000664000175000017500000010116612561652534013442 00000000000000# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ @HAVE_GTEST_TRUE@am__append_1 = tests subdir = AddrMgr DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/depcomp ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/libtool.m4 \ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/include/dibbler-config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = LIBRARIES = $(noinst_LIBRARIES) ARFLAGS = cru AM_V_AR = $(am__v_AR_@AM_V@) am__v_AR_ = $(am__v_AR_@AM_DEFAULT_V@) am__v_AR_0 = @echo " AR " $@; am__v_AR_1 = libAddrMgr_a_AR = $(AR) $(ARFLAGS) libAddrMgr_a_LIBADD = am_libAddrMgr_a_OBJECTS = libAddrMgr_a-AddrAddr.$(OBJEXT) \ libAddrMgr_a-AddrClient.$(OBJEXT) \ libAddrMgr_a-AddrIA.$(OBJEXT) libAddrMgr_a-AddrMgr.$(OBJEXT) \ libAddrMgr_a-AddrPrefix.$(OBJEXT) libAddrMgr_a_OBJECTS = $(am_libAddrMgr_a_OBJECTS) AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)/include depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) LTCXXCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CXXFLAGS) $(CXXFLAGS) AM_V_CXX = $(am__v_CXX_@AM_V@) am__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@) am__v_CXX_0 = @echo " CXX " $@; am__v_CXX_1 = CXXLD = $(CXX) CXXLINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \ $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CXXLD = $(am__v_CXXLD_@AM_V@) am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@) am__v_CXXLD_0 = @echo " CXXLD " $@; am__v_CXXLD_1 = COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(libAddrMgr_a_SOURCES) DIST_SOURCES = $(libAddrMgr_a_SOURCES) RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \ ctags-recursive dvi-recursive html-recursive info-recursive \ install-data-recursive install-dvi-recursive \ install-exec-recursive install-html-recursive \ install-info-recursive install-pdf-recursive \ install-ps-recursive install-recursive installcheck-recursive \ installdirs-recursive pdf-recursive ps-recursive \ tags-recursive uninstall-recursive am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive am__recursive_targets = \ $(RECURSIVE_TARGETS) \ $(RECURSIVE_CLEAN_TARGETS) \ $(am__extra_recursive_targets) AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \ distdir am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags DIST_SUBDIRS = . tests DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) am__relativize = \ dir0=`pwd`; \ sed_first='s,^\([^/]*\)/.*$$,\1,'; \ sed_rest='s,^[^/]*/*,,'; \ sed_last='s,^.*/\([^/]*\)$$,\1,'; \ sed_butlast='s,/*[^/]*$$,,'; \ while test -n "$$dir1"; do \ first=`echo "$$dir1" | sed -e "$$sed_first"`; \ if test "$$first" != "."; then \ if test "$$first" = ".."; then \ dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ else \ first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ if test "$$first2" = "$$first"; then \ dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ else \ dir2="../$$dir2"; \ fi; \ dir0="$$dir0"/"$$first"; \ fi; \ fi; \ dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ done; \ reldir="$$dir2" ACLOCAL = @ACLOCAL@ ALLOCA = @ALLOCA@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ ARCH = @ARCH@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ EXTRA_DIST_SUBDIRS = @EXTRA_DIST_SUBDIRS@ FGREP = @FGREP@ GREP = @GREP@ GTEST_INCLUDES = @GTEST_INCLUDES@ GTEST_LDADD = @GTEST_LDADD@ GTEST_LDFLAGS = @GTEST_LDFLAGS@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LINKPRINT = @LINKPRINT@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PORT_CFLAGS = @PORT_CFLAGS@ PORT_LDFLAGS = @PORT_LDFLAGS@ PORT_SUBDIR = @PORT_SUBDIR@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ subdirs = @subdirs@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ SUBDIRS = . $(am__append_1) noinst_LIBRARIES = libAddrMgr.a libAddrMgr_a_CPPFLAGS = -I$(top_srcdir)/Misc libAddrMgr_a_SOURCES = AddrAddr.cpp AddrAddr.h AddrClient.cpp AddrClient.h AddrIA.cpp AddrIA.h AddrMgr.cpp AddrMgr.h AddrPrefix.cpp AddrPrefix.h all: all-recursive .SUFFIXES: .SUFFIXES: .cpp .lo .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign AddrMgr/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign AddrMgr/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstLIBRARIES: -test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES) libAddrMgr.a: $(libAddrMgr_a_OBJECTS) $(libAddrMgr_a_DEPENDENCIES) $(EXTRA_libAddrMgr_a_DEPENDENCIES) $(AM_V_at)-rm -f libAddrMgr.a $(AM_V_AR)$(libAddrMgr_a_AR) libAddrMgr.a $(libAddrMgr_a_OBJECTS) $(libAddrMgr_a_LIBADD) $(AM_V_at)$(RANLIB) libAddrMgr.a mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libAddrMgr_a-AddrAddr.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libAddrMgr_a-AddrClient.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libAddrMgr_a-AddrIA.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libAddrMgr_a-AddrMgr.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libAddrMgr_a-AddrPrefix.Po@am__quote@ .cpp.o: @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $< .cpp.obj: @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .cpp.lo: @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LTCXXCOMPILE) -c -o $@ $< libAddrMgr_a-AddrAddr.o: AddrAddr.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libAddrMgr_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libAddrMgr_a-AddrAddr.o -MD -MP -MF $(DEPDIR)/libAddrMgr_a-AddrAddr.Tpo -c -o libAddrMgr_a-AddrAddr.o `test -f 'AddrAddr.cpp' || echo '$(srcdir)/'`AddrAddr.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libAddrMgr_a-AddrAddr.Tpo $(DEPDIR)/libAddrMgr_a-AddrAddr.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='AddrAddr.cpp' object='libAddrMgr_a-AddrAddr.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libAddrMgr_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libAddrMgr_a-AddrAddr.o `test -f 'AddrAddr.cpp' || echo '$(srcdir)/'`AddrAddr.cpp libAddrMgr_a-AddrAddr.obj: AddrAddr.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libAddrMgr_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libAddrMgr_a-AddrAddr.obj -MD -MP -MF $(DEPDIR)/libAddrMgr_a-AddrAddr.Tpo -c -o libAddrMgr_a-AddrAddr.obj `if test -f 'AddrAddr.cpp'; then $(CYGPATH_W) 'AddrAddr.cpp'; else $(CYGPATH_W) '$(srcdir)/AddrAddr.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libAddrMgr_a-AddrAddr.Tpo $(DEPDIR)/libAddrMgr_a-AddrAddr.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='AddrAddr.cpp' object='libAddrMgr_a-AddrAddr.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libAddrMgr_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libAddrMgr_a-AddrAddr.obj `if test -f 'AddrAddr.cpp'; then $(CYGPATH_W) 'AddrAddr.cpp'; else $(CYGPATH_W) '$(srcdir)/AddrAddr.cpp'; fi` libAddrMgr_a-AddrClient.o: AddrClient.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libAddrMgr_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libAddrMgr_a-AddrClient.o -MD -MP -MF $(DEPDIR)/libAddrMgr_a-AddrClient.Tpo -c -o libAddrMgr_a-AddrClient.o `test -f 'AddrClient.cpp' || echo '$(srcdir)/'`AddrClient.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libAddrMgr_a-AddrClient.Tpo $(DEPDIR)/libAddrMgr_a-AddrClient.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='AddrClient.cpp' object='libAddrMgr_a-AddrClient.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libAddrMgr_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libAddrMgr_a-AddrClient.o `test -f 'AddrClient.cpp' || echo '$(srcdir)/'`AddrClient.cpp libAddrMgr_a-AddrClient.obj: AddrClient.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libAddrMgr_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libAddrMgr_a-AddrClient.obj -MD -MP -MF $(DEPDIR)/libAddrMgr_a-AddrClient.Tpo -c -o libAddrMgr_a-AddrClient.obj `if test -f 'AddrClient.cpp'; then $(CYGPATH_W) 'AddrClient.cpp'; else $(CYGPATH_W) '$(srcdir)/AddrClient.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libAddrMgr_a-AddrClient.Tpo $(DEPDIR)/libAddrMgr_a-AddrClient.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='AddrClient.cpp' object='libAddrMgr_a-AddrClient.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libAddrMgr_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libAddrMgr_a-AddrClient.obj `if test -f 'AddrClient.cpp'; then $(CYGPATH_W) 'AddrClient.cpp'; else $(CYGPATH_W) '$(srcdir)/AddrClient.cpp'; fi` libAddrMgr_a-AddrIA.o: AddrIA.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libAddrMgr_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libAddrMgr_a-AddrIA.o -MD -MP -MF $(DEPDIR)/libAddrMgr_a-AddrIA.Tpo -c -o libAddrMgr_a-AddrIA.o `test -f 'AddrIA.cpp' || echo '$(srcdir)/'`AddrIA.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libAddrMgr_a-AddrIA.Tpo $(DEPDIR)/libAddrMgr_a-AddrIA.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='AddrIA.cpp' object='libAddrMgr_a-AddrIA.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libAddrMgr_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libAddrMgr_a-AddrIA.o `test -f 'AddrIA.cpp' || echo '$(srcdir)/'`AddrIA.cpp libAddrMgr_a-AddrIA.obj: AddrIA.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libAddrMgr_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libAddrMgr_a-AddrIA.obj -MD -MP -MF $(DEPDIR)/libAddrMgr_a-AddrIA.Tpo -c -o libAddrMgr_a-AddrIA.obj `if test -f 'AddrIA.cpp'; then $(CYGPATH_W) 'AddrIA.cpp'; else $(CYGPATH_W) '$(srcdir)/AddrIA.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libAddrMgr_a-AddrIA.Tpo $(DEPDIR)/libAddrMgr_a-AddrIA.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='AddrIA.cpp' object='libAddrMgr_a-AddrIA.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libAddrMgr_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libAddrMgr_a-AddrIA.obj `if test -f 'AddrIA.cpp'; then $(CYGPATH_W) 'AddrIA.cpp'; else $(CYGPATH_W) '$(srcdir)/AddrIA.cpp'; fi` libAddrMgr_a-AddrMgr.o: AddrMgr.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libAddrMgr_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libAddrMgr_a-AddrMgr.o -MD -MP -MF $(DEPDIR)/libAddrMgr_a-AddrMgr.Tpo -c -o libAddrMgr_a-AddrMgr.o `test -f 'AddrMgr.cpp' || echo '$(srcdir)/'`AddrMgr.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libAddrMgr_a-AddrMgr.Tpo $(DEPDIR)/libAddrMgr_a-AddrMgr.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='AddrMgr.cpp' object='libAddrMgr_a-AddrMgr.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libAddrMgr_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libAddrMgr_a-AddrMgr.o `test -f 'AddrMgr.cpp' || echo '$(srcdir)/'`AddrMgr.cpp libAddrMgr_a-AddrMgr.obj: AddrMgr.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libAddrMgr_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libAddrMgr_a-AddrMgr.obj -MD -MP -MF $(DEPDIR)/libAddrMgr_a-AddrMgr.Tpo -c -o libAddrMgr_a-AddrMgr.obj `if test -f 'AddrMgr.cpp'; then $(CYGPATH_W) 'AddrMgr.cpp'; else $(CYGPATH_W) '$(srcdir)/AddrMgr.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libAddrMgr_a-AddrMgr.Tpo $(DEPDIR)/libAddrMgr_a-AddrMgr.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='AddrMgr.cpp' object='libAddrMgr_a-AddrMgr.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libAddrMgr_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libAddrMgr_a-AddrMgr.obj `if test -f 'AddrMgr.cpp'; then $(CYGPATH_W) 'AddrMgr.cpp'; else $(CYGPATH_W) '$(srcdir)/AddrMgr.cpp'; fi` libAddrMgr_a-AddrPrefix.o: AddrPrefix.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libAddrMgr_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libAddrMgr_a-AddrPrefix.o -MD -MP -MF $(DEPDIR)/libAddrMgr_a-AddrPrefix.Tpo -c -o libAddrMgr_a-AddrPrefix.o `test -f 'AddrPrefix.cpp' || echo '$(srcdir)/'`AddrPrefix.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libAddrMgr_a-AddrPrefix.Tpo $(DEPDIR)/libAddrMgr_a-AddrPrefix.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='AddrPrefix.cpp' object='libAddrMgr_a-AddrPrefix.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libAddrMgr_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libAddrMgr_a-AddrPrefix.o `test -f 'AddrPrefix.cpp' || echo '$(srcdir)/'`AddrPrefix.cpp libAddrMgr_a-AddrPrefix.obj: AddrPrefix.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libAddrMgr_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libAddrMgr_a-AddrPrefix.obj -MD -MP -MF $(DEPDIR)/libAddrMgr_a-AddrPrefix.Tpo -c -o libAddrMgr_a-AddrPrefix.obj `if test -f 'AddrPrefix.cpp'; then $(CYGPATH_W) 'AddrPrefix.cpp'; else $(CYGPATH_W) '$(srcdir)/AddrPrefix.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libAddrMgr_a-AddrPrefix.Tpo $(DEPDIR)/libAddrMgr_a-AddrPrefix.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='AddrPrefix.cpp' object='libAddrMgr_a-AddrPrefix.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libAddrMgr_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libAddrMgr_a-AddrPrefix.obj `if test -f 'AddrPrefix.cpp'; then $(CYGPATH_W) 'AddrPrefix.cpp'; else $(CYGPATH_W) '$(srcdir)/AddrPrefix.cpp'; fi` mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs # This directory's subdirectories are mostly independent; you can cd # into them and run 'make' without going through this Makefile. # To change the values of 'make' variables: instead of editing Makefiles, # (1) if the variable is set in 'config.status', edit 'config.status' # (which will cause the Makefiles to be regenerated when you run 'make'); # (2) otherwise, pass the desired values on the 'make' command line. $(am__recursive_targets): @fail=; \ if $(am__make_keepgoing); then \ failcom='fail=yes'; \ else \ failcom='exit 1'; \ fi; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-recursive TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ empty_fix=.; \ else \ include_option=--include; \ empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-recursive CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-recursive cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ $(am__make_dryrun) \ || test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ $(am__relativize); \ new_distdir=$$reldir; \ dir1=$$subdir; dir2="$(top_distdir)"; \ $(am__relativize); \ new_top_distdir=$$reldir; \ echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ ($(am__cd) $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$new_top_distdir" \ distdir="$$new_distdir" \ am__remove_distdir=: \ am__skip_length_check=: \ am__skip_mode_fix=: \ distdir) \ || exit 1; \ fi; \ done check-am: all-am check: check-recursive all-am: Makefile $(LIBRARIES) installdirs: installdirs-recursive installdirs-am: install: install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-recursive clean-am: clean-generic clean-libtool clean-noinstLIBRARIES \ mostlyclean-am distclean: distclean-recursive -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive html-am: info: info-recursive info-am: install-data-am: install-dvi: install-dvi-recursive install-dvi-am: install-exec-am: install-html: install-html-recursive install-html-am: install-info: install-info-recursive install-info-am: install-man: install-pdf: install-pdf-recursive install-pdf-am: install-ps: install-ps-recursive install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-recursive -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: .MAKE: $(am__recursive_targets) install-am install-strip .PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am check \ check-am clean clean-generic clean-libtool \ clean-noinstLIBRARIES cscopelist-am ctags ctags-am distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ installdirs-am maintainer-clean maintainer-clean-generic \ mostlyclean mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf pdf-am ps ps-am tags tags-am uninstall \ uninstall-am # 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: dibbler-1.0.1/AddrMgr/AddrMgr.h0000644000175000017500000001352612556505435013067 00000000000000/* * Dibbler - a portable DHCPv6 * * authors: Tomasz Mrugalski * Marek Senderski * changes: Grzegorz Pluto * * released under GNU GPL v2 licence */ class TAddrMgr; #ifndef ADDRMGR_H #define ADDRMGR_H #include #include #include "SmartPtr.h" #include "Container.h" #include "AddrClient.h" #include "AddrIA.h" /// /// @brief Address Manager that holds address and prefix information. /// /// This class holds information about assigned leases: addresses /// and prefixes with additional associated information: list of /// clients, listf of IAs, list of addresses, peer addresses, /// associated FQDN names, DNS addresses that performed DNS Update, /// t1,t2,prefered,valid lifetimes and similar data. /// /// TAddrMgr is used by both server and client. /// /// TAddrMgr has a container for TAddrClient - a list of clients. /// Each TAddrClient contains list of Identity Associations (IAs), /// represented by TAddrIA. Each TAddrIA contains list of addresses /// (TAddrAddr) or prefixes (TAddrPrefix). /// class TAddrMgr { public: /// holds network interface name to ifindex mapping typedef std::map NameToIndexMapping; /// holds network interface ifindex to name mapping typedef std::map IndexToNameMapping; friend std::ostream & operator<<(std::ostream & strum,TAddrMgr &x); TAddrMgr(const std::string& addrdb, bool loadfile = false); virtual ~TAddrMgr(); bool updateInterfacesInfo(const NameToIndexMapping& nameToIndex, const IndexToNameMapping& indexToName); bool updateInterfacesInfoIA(SPtr ia, const NameToIndexMapping& nameToIndex, const IndexToNameMapping& indexToName); //--- Client container --- void addClient(SPtr x); void firstClient(); SPtr getClient(); SPtr getClient(SPtr duid); SPtr getClient(uint32_t SPI); SPtr getClient(SPtr leasedAddr); int countClient(); bool delClient(SPtr duid); // checks if address is conformant to current configuration (used in loadDB()) virtual bool verifyAddr(SPtr addr) { return true; } virtual bool verifyPrefix(SPtr addr) { return true; } // --- prefix related --- virtual bool addPrefix(SPtr clntDuid, SPtr clntAddr, const std::string& ifname, int ifindex, unsigned long IAID, unsigned long T1, unsigned long T2, SPtr prefix, unsigned long pref, unsigned long valid, int length, bool quiet); virtual bool updatePrefix(SPtr duid , SPtr addr, const std::string& ifname, int ifindex, unsigned long IAID, unsigned long T1, unsigned long T2, SPtr prefix, unsigned long pref, unsigned long valid, int length, bool quiet); virtual bool delPrefix(SPtr clntDuid, unsigned long IAID, SPtr prefix, bool quiet); bool prefixIsFree(SPtr prefix); //--- Time related methods --- unsigned long getT1Timeout(); unsigned long getT2Timeout(); unsigned long getPrefTimeout(); unsigned long getValidTimeout(); // --- backup/restore --- void dbLoad(const char * xmlFile); virtual void dump(); bool isDone(); #ifdef MOD_LIBXML2 // database loading methods that use libxml2 xmlDocPtr xmlLoad(const char * filename); SPtr parseAddrAddr(xmlDocPtr doc, xmlNodePtr xmlAddr, int depth); SPtr libxml_parseAddrIA(xmlDocPtr doc, xmlNodePtr xmlIA, int depth); SPtr parseAddrClient(xmlDocPtr doc, xmlNodePtr xmlClient, int depth); void parseAddrMgr(xmlDocPtr doc,int depth); #else // database loading methods that use internal loading routines bool xmlLoadBuiltIn(const char * xmlFile); SPtr parseAddrClient(const char * xmlFile, FILE *f); SPtr parseAddrIA(const char * xmlFile, FILE * f, int t1,int t2, int iaid, const std::string& ifname, int ifindex, SPtr unicast = SPtr()); SPtr parseAddrPD(const char * xmlFile, FILE * f, int t1,int t2, int iaid, const std::string& ifname, int ifindex, SPtr unicast = SPtr()); SPtr parseAddrAddr(const char * xmlFile, char * buf,bool pd); SPtr parseAddrPrefix(const char * xmlFile, char * buf,bool pd); SPtr parseAddrTA(const char * xmlFile, FILE *f); #endif uint64_t getNextReplayDetectionValue(); protected: virtual void print(std::ostream & out) = 0; bool addPrefix(SPtr client, SPtr duid , SPtr clntAddr, const std::string& ifname, int ifindex, unsigned long IAID, unsigned long T1, unsigned long T2, SPtr prefix, unsigned long pref, unsigned long valid, int length, bool quiet); bool updatePrefix(SPtr client, SPtr duid , SPtr clntAddr, int iface, unsigned long IAID, unsigned long T1, unsigned long T2, SPtr prefix, unsigned long pref, unsigned long valid, int length, bool quiet); bool IsDone; List(TAddrClient) ClntsLst; std::string XmlFile; /// should the client without any IA, TA or PDs be deleted? (srv = yes, client = no) bool DeleteEmptyClient; uint64_t ReplayDetectionValue_; }; #endif dibbler-1.0.1/Misc/0000775000175000017500000000000012561700416011014 500000000000000dibbler-1.0.1/Misc/DHCPConst.h0000664000175000017500000002130112413230313012615 00000000000000/* * Dibbler - a portable DHCPv6 * * authors: Tomasz Mrugalski * Marek Senderski * changes: Michal Kowalczuk * * Released under GNU GPL v2 licence * */ #ifndef DHCPCONST_H #define DHCPCONST_H #define ALL_DHCP_RELAY_AGENTS_AND_SERVERS "ff02::1:2" #define ALL_DHCP_SERVERS "ff05::1:3" #define DHCPCLIENT_PORT 546 #define DHCPSERVER_PORT 547 // messages #define SOLICIT_MSG 1 #define ADVERTISE_MSG 2 #define REQUEST_MSG 3 #define CONFIRM_MSG 4 #define RENEW_MSG 5 #define REBIND_MSG 6 #define REPLY_MSG 7 #define RELEASE_MSG 8 #define DECLINE_MSG 9 #define RECONFIGURE_MSG 10 #define INFORMATION_REQUEST_MSG 11 #define RELAY_FORW_MSG 12 #define RELAY_REPL_MSG 13 #define LEASEQUERY_MSG 14 #define LEASEQUERY_REPLY_MSG 15 // implementation specific #define CONTROL_MSG 255 // timers, timeouts #define SOL_MAX_DELAY 1 #define SOL_TIMEOUT 1 #define SOL_MAX_RT 120 #define REQ_TIMEOUT 1 #define REQ_MAX_RT 30 #define REQ_MAX_RC 10 #define CNF_MAX_DELAY 1 #define CNF_TIMEOUT 1 #define CNF_MAX_RT 4 #define CNF_MAX_RD 10 #define REN_TIMEOUT 10 #define REN_MAX_RT 600 #define REB_TIMEOUT 10 #define REB_MAX_RT 600 #define INF_MAX_DELAY 1 #define INF_TIMEOUT 1 #define INF_MAX_RT 120 #define REL_TIMEOUT 1 #define REL_MAX_RC 5 #define DEC_TIMEOUT 1 #define DEC_MAX_RC 5 #define REC_TIMEOUT 2 #define REC_MAX_RC 8 #define HOP_COUNT_LIMIT 32 // how long does server caches its replies? #define SERVER_REPLY_CACHE_TIMEOUT 60 // RFC3315: supported options #define OPTION_CLIENTID 1 #define OPTION_SERVERID 2 #define OPTION_IA_NA 3 #define OPTION_IA_TA 4 #define OPTION_IAADDR 5 #define OPTION_ORO 6 #define OPTION_PREFERENCE 7 #define OPTION_ELAPSED_TIME 8 #define OPTION_UNICAST 12 #define OPTION_STATUS_CODE 13 #define OPTION_RAPID_COMMIT 14 // RFC3315: options not supported yet #define OPTION_RELAY_MSG 9 #define OPTION_AUTH 11 #define OPTION_USER_CLASS 15 #define OPTION_VENDOR_CLASS 16 #define OPTION_VENDOR_OPTS 17 #define OPTION_INTERFACE_ID 18 #define OPTION_RECONF_MSG 19 #define OPTION_RECONF_ACCEPT 20 // additional options // RFC3319: SIP servers and domains #define OPTION_SIP_SERVER_D 21 #define OPTION_SIP_SERVER_A 22 // RFC3646: DNS servers and domains #define OPTION_DNS_SERVERS 23 #define OPTION_DOMAIN_LIST 24 // RFC3633: Prefix options #define OPTION_IA_PD 25 #define OPTION_IAPREFIX 26 // RFC3898: NIS options #define OPTION_NIS_SERVERS 27 #define OPTION_NISP_SERVERS 28 #define OPTION_NIS_DOMAIN_NAME 29 #define OPTION_NISP_DOMAIN_NAME 30 // RFC4075: Simple Network Time Protocol (SNTP) #define OPTION_SNTP_SERVERS 31 // RFC4242: Information Refresh Time Option #define OPTION_INFORMATION_REFRESH_TIME 32 // RFC4280: Broadcast and Multicast Control Servers #define OPTION_BCMCS_SERVER_D 33 #define OPTION_BCMCS_SERVER_A 34 // RFC4776: Option for Civic Addresses Configuration Information #define OPTION_GEOCONF_CIVIC 36 // RFC4649: Relay Agent Remote-ID Option #define OPTION_REMOTE_ID 37 // RFC4580: Relay Agent Subscriber-ID Option #define OPTION_SUBSCRIBER_ID 38 // RFC4704: Client Fully Qualified Domain Name (FQDN) Option #define OPTION_FQDN 39 // RFC-ietf-dhc-paa-option-05.txt #define OPTION_PANA_AGENT 40 // RFC4833: Timezone options for DHCP #define OPTION_NEW_POSIX_TIMEZONE 41 #define OPTION_NEW_TZDB_TIMEZONE 42 // RFC-ietf-dhc-dhcpv6-ero-01.txt #define OPTION_ERO 43 // RFC5007: Leasequery #define OPTION_LQ_QUERY 44 #define OPTION_CLIENT_DATA 45 #define OPTION_CLT_TIME 46 #define OPTION_LQ_RELAY_DATA 47 #define OPTION_LQ_CLIENT_LINK 48 #define OPTION_RELAY_ID 53 // draft-ietf-softwire-ds-lite-tunnel-option-10, approved by IESG #define OPTION_AFTR_NAME 64 // RFC6939 #define OPTION_CLIENT_LINKLAYER_ADDR 79 // draft-ietf-mif-dhcpv6-route-option-04 #define OPTION_NEXT_HOP 242 #define OPTION_RTPREFIX 243 // Experimental implementation for address prefix length information // See: http://klub.com.pl/dhcpv6/doc/draft-mrugalski-addropts-XX-2007-04-17.txt #define OPTION_ADDRPARAMS 251 // draft-mrugalski-remote-dhcpv6-00 #define OPTION_NEIGHBORS 254 // -- Query types (RFC5007) -- typedef enum { QUERY_BY_ADDRESS = 1, QUERY_BY_CLIENTID = 2 } ELeaseQueryType; // --- Option lengths -- // (value of the len field, so actual option length is +4 bytes) #define OPTION_ELAPSED_TIME_LEN 2 #define OPTION_INFORMATION_REFRESH_TIME_LEN 4 // --- Status Codes --- /// @todo: convert this to enum #define STATUSCODE_SUCCESS 0 #define STATUSCODE_UNSPECFAIL 1 #define STATUSCODE_NOADDRSAVAIL 2 #define STATUSCODE_NOBINDING 3 #define STATUSCODE_NOTONLINK 4 #define STATUSCODE_USEMULTICAST 5 #define STATUSCODE_NOPREFIXAVAIL 6 // Leasequery status codes #define STATUSCODE_UNKNOWNQUERYTYPE 7 #define STATUSCODE_MALFORMEDQUERY 8 #define STATUSCODE_NOTCONFIGURED 9 #define STATUSCODE_NOTALLOWED 10 // INFINITY + 1 is 0. That's cool! #define DHCPV6_INFINITY 0xffffffffu /// used for 2 purposes: /// is address tentative? /// is address valid on link? enum EAddrStatus { ADDRSTATUS_UNKNOWN = -1, ADDRSTATUS_NO = 0, ADDRSTATUS_YES = 1 }; enum EState { STATE_NOTCONFIGURED, STATE_INPROCESS, STATE_CONFIGURED, STATE_FAILED, STATE_DISABLED, STATE_CONFIRMME, STATE_TENTATIVECHECK, STATE_TENTATIVE}; // specifies server behavior, when receiving unknown FQDN enum EUnknownFQDNMode { UNKNOWN_FQDN_REJECT = 0, // reject unknown FQDNs (do not assign a name from pool) UNKKOWN_FQDN_ACCEPT_POOL = 1, // assign other name available in pool UNKNOWN_FQDN_ACCEPT = 2, // accept unknown FQDNs UNKNOWN_FQDN_APPEND = 3, // accept, but append defined domain suffix UNKNOWN_FQDN_PROCEDURAL = 4 // generate name procedurally, append defined domain suffix }; // defines Identity assotiation type enum TIAType { IATYPE_IA, // IA_NA - non-temporary addresses IATYPE_TA, // IA_TA - temporary addresses IATYPE_PD // IA_PD - prefix delegation }; // FQDN option flags #define FQDN_N 0x4 #define FQDN_O 0x2 #define FQDN_S 0x1 // --- Bitfield in ADDRPARAMS option --- #define ADDRPARAMS_MASK_PREFIX 0x01 #define ADDRPARAMS_MASK_ANYCAST 0x02 #define ADDRPARAMS_MASK_MULTICAST 0x04 int allowOptInOpt(int msgType, int optOut, int optIn); int allowOptInMsg(int msgType, int optType); // Supported authorization protocols enum AuthProtocols { AUTH_PROTO_NONE = 0, // disabled AUTH_PROTO_DELAYED = 2, // RFC 3315 AUTH_PROTO_RECONFIGURE_KEY = 3, // RFC 3315, section 21.5.1 AUTH_PROTO_DIBBLER = 4 // Mechanism proposed by Kowalczuk }; enum AuthReplay { AUTH_REPLAY_NONE = 0, AUTH_REPLAY_MONOTONIC = 1 }; // AUTH_ALGORITHM values for protocol type None (0) // 0 // AUTH_ALGORITHM values for delayed auth (2) // AUTH_ALGORITHM values for reconfigure key (3) // This is protocol specific value and is useful only when AuthProtocols = 3 enum AuthAlgorithm_ReconfigureKey { AUTH_ALGORITHM_NONE = 0, AUTH_ALGORITHM_RECONFIGURE_KEY = 1 }; // AUTH_ALGORITHM values for protocol type Dibbler (4) /// @todo: rename to AuthAlgorithm_DibblerDigestTypes // This is protocol specific value and is useful only when AuthProtocols = 4 enum DigestTypes { DIGEST_NONE = 0, DIGEST_PLAIN = 1, DIGEST_HMAC_MD5 = 2, DIGEST_HMAC_SHA1 = 3, DIGEST_HMAC_SHA224 = 4, DIGEST_HMAC_SHA256 = 5, DIGEST_HMAC_SHA384 = 6, DIGEST_HMAC_SHA512 = 7, //this must be last, increase it if necessary DIGEST_INVALID = 8 }; #ifdef __cplusplus #include typedef std::vector DigestTypesLst; #endif unsigned getDigestSize(enum DigestTypes type); char *getDigestName(enum DigestTypes type); // key is generated this way: // key = HMAC-SHA1 (AAA-key, {Key Generation Nonce || client identifier}) // so it's size is always size of HMAC-SHA1 result which is 160bits = 20bytes #define AUTHKEYLEN 20 // Values used in reconfigure-key algorithm (see RFC3315, section 21.5.1) const static unsigned int RECONFIGURE_KEY_AUTHINFO_SIZE = 17; const static unsigned int RECONFIGURE_KEY_SIZE = 16; // HMAC-MD5 key const static unsigned int RECONFIGURE_DIGEST_SIZE = 16; // HMAC-MD5 digest // Values used in delayed-auth algorithm (see RFC3315, section 21.4) const static unsigned int DELAYED_AUTH_KEY_SIZE = 16; // HMAC-MD5 key const static unsigned int DELAYED_AUTH_DIGEST_SIZE = 16; // HMAC-MD5 digest const static unsigned int DELAYED_AUTH_KEY_ID_SIZE = 4; // uint32 #endif dibbler-1.0.1/Misc/DUID.h0000644000175000017500000000154512277722750011646 00000000000000/* * Dibbler - a portable DHCPv6 * * authors: Tomasz Mrugalski * Marek Senderski * * Released under GNU GPL v2 licence * */ class TDUID; #ifndef DUID_H_ #define DUID_H_ #include #include #include class TDUID { friend std::ostream& operator<<(std::ostream& out,TDUID &range); public: TDUID(); // @todo: remove this TDUID(const char* DUID,int DUIDlen); // packed TDUID(const char* text); // plain TDUID(const TDUID &duid); TDUID& operator=(const TDUID& duid); bool operator==(const TDUID &duid); bool operator<=(const TDUID &duid); size_t getLen() const; char * storeSelf(char* buf); const std::string getPlain() const; const char * get() const; ~TDUID(); private: std::vector DUID_; std::string Plain_; }; #endif dibbler-1.0.1/Misc/md5.h0000664000175000017500000000703712233256142011577 00000000000000/* Declaration of functions and data types used for MD5 sum computing library functions. Copyright (C) 1995-1997,1999,2000,2001,2004,2005,2006 Free Software Foundation, Inc. This file is part of the GNU C Library. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ /* This file is taken from coreutils-6.2 (lib/md5.h) and adapted for dibbler * by Michal Kowalczuk */ #ifndef _MD5_H #define _MD5_H 1 #include #include #define MD5_BLOCKSIZE 64 #define MD5_DIGESTSIZE 16 #ifndef __GNUC_PREREQ # if defined __GNUC__ && defined __GNUC_MINOR__ # define __GNUC_PREREQ(maj, min) \ ((__GNUC__ << 16) + __GNUC_MINOR__ >= ((maj) << 16) + (min)) # else # define __GNUC_PREREQ(maj, min) 0 # endif #endif #ifndef __THROW # if defined __cplusplus && __GNUC_PREREQ (2,8) # define __THROW throw () # else # define __THROW # endif #endif #ifndef _LIBC # define __md5_buffer md5_buffer # define __md5_finish_ctx md5_finish_ctx # define __md5_init_ctx md5_init_ctx # define __md5_process_block md5_process_block # define __md5_process_bytes md5_process_bytes # define __md5_read_ctx md5_read_ctx #endif /* Structure to save state of computation between the single steps. */ struct md5_ctx { uint32_t A; uint32_t B; uint32_t C; uint32_t D; uint32_t total[2]; uint32_t buflen; uint32_t buffer[32]; }; /* Initialize structure containing state of computation. (RFC 1321, 3.3: Step 3) */ extern void __md5_init_ctx (struct md5_ctx *ctx) __THROW; /* Starting with the result of former calls of this function (or the initialization function update the context for the next LEN bytes starting at BUFFER. It is necessary that LEN is a multiple of 64!!! */ extern void __md5_process_block (const void *buffer, size_t len, struct md5_ctx *ctx) __THROW; /* Starting with the result of former calls of this function (or the initialization function update the context for the next LEN bytes starting at BUFFER. It is NOT required that LEN is a multiple of 64. */ extern void __md5_process_bytes (const void *buffer, size_t len, struct md5_ctx *ctx) __THROW; /* Process the remaining bytes in the buffer and put result from CTX in first 16 bytes following RESBUF. The result is always in little endian byte order, so that a byte-wise output yields to the wanted ASCII representation of the message digest. IMPORTANT: On some systems, RESBUF must be aligned to a 32-bit boundary. */ extern void *__md5_finish_ctx (struct md5_ctx *ctx, void *resbuf) __THROW; /* Put result from CTX in first 16 bytes following RESBUF. The result is always in little endian byte order, so that a byte-wise output yields to the wanted ASCII representation of the message digest. IMPORTANT: On some systems, RESBUF must be aligned to a 32-bit boundary. */ extern void *__md5_read_ctx (const struct md5_ctx *ctx, void *resbuf) __THROW; #endif /* md5.h */ dibbler-1.0.1/Misc/Container.h0000644000175000017500000000350012360252161013017 00000000000000/* * Dibbler - a portable DHCPv6 * * authors: Tomasz Mrugalski * Marek Senderski * * Released under GNU GPL v2 licence * */ #ifndef CONTAINER_H #define CONTAINER_H #include #include #define List(x) TContainer< SPtr< x > > template class TContainer{ public: TContainer(); ~TContainer() { lista.clear(); } void append(const TYP &foo) { lista.push_back(foo); } size_t count() const { return lista.size(); } bool empty() const { return lista.empty(); } void first(); void delFirst() { lista.pop_front(); first(); } void del() { it--; lista.erase(it); first(); } void clear(); TYP get() { if (it != lista.end()) { return *it++; } else { return TYP(); } } TYP getLast() { if (lista.empty()) { return TYP(); } else { return lista.back(); } } TYP getFirst() { if (lista.empty()) { return TYP(); } else { return lista.front(); } } void delLast() { lista.pop_back(); first(); } /// @brief returns underlying STL container /// /// @return const reference to the STL container const std::list& getSTL() const { return (lista); } std::list& getSTL() { return (lista); } private: std::list lista; typename std::list::iterator it; }; template TContainer::TContainer() { } template void TContainer::clear() { lista.clear(); } template void TContainer::first() { it=lista.begin(); return; } #endif dibbler-1.0.1/Misc/tests/0000775000175000017500000000000012561700416012156 500000000000000dibbler-1.0.1/Misc/tests/run_tests.cc0000644000175000017500000000031712277722750014443 00000000000000 #define STDC_HEADERS 1 #include #include int main(int argc, char* argv[]) { testing::InitGoogleTest(&argc, argv); int status = RUN_ALL_TESTS(); return status; } dibbler-1.0.1/Misc/tests/Container_unittest.cc0000644000175000017500000000367412556500315016276 00000000000000#include "Container.h" #include "SmartPtr.h" #include #include using namespace std; namespace { int static_value = 0; class Base { public: Base() :value(1) { static_value++; } int value; virtual ~Base() { static_value--; } }; class ContainerTest : public ::testing::Test { public: ContainerTest() { static_value = 0; } }; TEST_F(ContainerTest, empty) { TContainer< SPtr > container; EXPECT_TRUE(container.empty()); EXPECT_EQ(0, container.count()); container.first(); EXPECT_FALSE(container.get()); EXPECT_FALSE(container.getFirst()); EXPECT_FALSE(container.getLast()); } TEST_F(ContainerTest, singleElement) { TContainer< SPtr > container; SPtr a = new Base(); SPtr b = new Base(); SPtr c = new Base(); container.append(a); EXPECT_EQ(1, container.count()); container.first(); // First call should return the first element EXPECT_EQ(a, container.get()); // Second call should return NULL, as there's no more elements EXPECT_FALSE(container.get()); EXPECT_EQ(a, container.getLast()); EXPECT_EQ(a, container.getFirst()); } TEST_F(ContainerTest, 3Elements) { TContainer< SPtr > container; SPtr a = new Base(); SPtr b = new Base(); SPtr c = new Base(); container.append(a); EXPECT_EQ(1, container.count()); container.append(b); EXPECT_EQ(b, container.getLast()); EXPECT_EQ(a, container.getFirst()); container.first(); // First call should return the first element EXPECT_EQ(a, container.get()); // Second call should get the second element EXPECT_EQ(b, container.get()); // Second call should return NULL, as there's no more elements EXPECT_FALSE(container.get()); container.append(c); EXPECT_EQ(a, container.getFirst()); EXPECT_EQ(c, container.getLast()); } } dibbler-1.0.1/Misc/tests/DUID_unittest.cc0000644000175000017500000000315612277722750015105 00000000000000#include "DUID.h" #include "SmartPtr.h" #include #include using namespace std; namespace { TEST(DUIDTest, constructor) { char expData[] = { 0x12, 0x34, 0x56, 0x78, 0x90, 0xab, 0xcd, 0xef }; char buffer[100]; SPtr duid1 = new TDUID("1234567890abcdef"); ASSERT_EQ(8u, duid1->getLen()); EXPECT_TRUE(0 == memcmp(expData, duid1->get(), 8)); duid1->storeSelf(buffer); EXPECT_TRUE(0 == memcmp(buffer, expData, 8)); EXPECT_EQ("12:34:56:78:90:ab:cd:ef", duid1->getPlain()); SPtr duid2 = new TDUID("12:34:56:78:90:ab:cd:ef"); ASSERT_EQ(8u, duid2->getLen()); EXPECT_TRUE(0 == memcmp(expData, duid2->get(), 8)); memset(buffer, 0, sizeof(buffer)); duid2->storeSelf(buffer); EXPECT_TRUE(0 == memcmp(buffer, expData, 8)); EXPECT_EQ("12:34:56:78:90:ab:cd:ef", duid2->getPlain()); EXPECT_TRUE(*duid1 == *duid2); SPtr duid3 = new TDUID(expData, sizeof(expData)); ASSERT_EQ(8u, duid3->getLen()); EXPECT_TRUE(0 == memcmp(expData, duid3->get(), 8)); memset(buffer, 0, sizeof(buffer)); duid3->storeSelf(buffer); EXPECT_TRUE(0 == memcmp(buffer, expData, 8)); EXPECT_EQ("12:34:56:78:90:ab:cd:ef", duid3->getPlain()); EXPECT_TRUE(*duid1 == *duid3); EXPECT_TRUE(*duid2 == *duid3); } TEST(DuidTest, operators) { TDUID duid1("123456"); TDUID duid2("1234"); // shorter TDUID duid3("f23456"); // greater TDUID duid4("123455"); // smaller TDUID duid5("123456"); EXPECT_TRUE(duid2 <= duid1); EXPECT_TRUE(duid1 <= duid3); EXPECT_TRUE(duid4 <= duid1); EXPECT_TRUE(duid1 == duid5); } } dibbler-1.0.1/Misc/tests/Makefile.am0000644000175000017500000000113512360221564014127 00000000000000AM_CPPFLAGS = -I$(top_srcdir)/Misc AM_CPPFLAGS += -I$(top_srcdir)/CfgMgr # This is to workaround long long in gtest.h AM_CPPFLAGS += $(GTEST_INCLUDES) -Wno-long-long -Wno-variadic-macros TESTS = if HAVE_GTEST TESTS += Misc_tests Misc_tests_SOURCES = run_tests.cc Misc_tests_SOURCES += IPv6Addr_unittest.cc Misc_tests_SOURCES += DUID_unittest.cc Misc_tests_SOURCES += SPtr_unittest.cc Misc_tests_SOURCES += Container_unittest.cc Misc_tests_LDFLAGS = $(AM_LDFLAGS) $(GTEST_LDFLAGS) Misc_tests_LDADD = $(GTEST_LDADD) Misc_tests_LDADD += $(top_builddir)/Misc/libMisc.a endif noinst_PROGRAMS = $(TESTS) dibbler-1.0.1/Misc/tests/IPv6Addr_unittest.cc0000644000175000017500000000413612304040124015711 00000000000000#include "IPv6Addr.h" #include #include using namespace std; namespace { TEST(IPv6AddrTest, constructor) { SPtr addr = new TIPv6Addr("fe80::abcd", true); EXPECT_EQ(string(addr->getPlain()), string("fe80::abcd")); EXPECT_TRUE(addr->linkLocal()); // EXPECT_FALSE(addr->isLopback()); } TEST(IPv6AddrTest, subtraction) { TIPv6Addr a("2001:db8:1::ffff:ffff:ffff:ffff", true); TIPv6Addr b("2001:db8:1::", true); TIPv6Addr result = a - b; EXPECT_EQ(string(result.getPlain()), "::ffff:ffff:ffff:ffff"); // This is somewhat ill defined, but let's check it anyway result = b - a; EXPECT_EQ(string(result.getPlain()), "ffff:ffff:ffff:ffff::1"); } TEST(IPv6AddrTest, randomDecrease) { srandom(time(NULL)); TIPv6Addr x("1::", true); for (int i=0; i < 30; ++i) { TIPv6Addr y = x; --y; cout << "x=" << x.getPlain() << " y=" << y.getPlain() << endl; EXPECT_TRUE(y <= x); } } // Tests if truncation operation is conducted properly. TEST(IPv6AddrTest, truncate) { TIPv6Addr x("ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff", true); x.truncate(0, 128); EXPECT_EQ("ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff", string(x.getPlain())); x.truncate(0, 127); EXPECT_EQ("ffff:ffff:ffff:ffff:ffff:ffff:ffff:fffe", string(x.getPlain())); x.truncate(0, 126); EXPECT_EQ("ffff:ffff:ffff:ffff:ffff:ffff:ffff:fffc", string(x.getPlain())); x.truncate(0, 125); EXPECT_EQ("ffff:ffff:ffff:ffff:ffff:ffff:ffff:fff8", string(x.getPlain())); x.truncate(0, 124); EXPECT_EQ("ffff:ffff:ffff:ffff:ffff:ffff:ffff:fff0", string(x.getPlain())); x.truncate(0, 120); EXPECT_EQ("ffff:ffff:ffff:ffff:ffff:ffff:ffff:ff00", string(x.getPlain())); x.truncate(0, 112); EXPECT_EQ("ffff:ffff:ffff:ffff:ffff:ffff:ffff:0", string(x.getPlain())); x.truncate(0, 96); EXPECT_EQ("ffff:ffff:ffff:ffff:ffff:ffff::", string(x.getPlain())); x.truncate(0, 64); EXPECT_EQ("ffff:ffff:ffff:ffff::", string(x.getPlain())); x.truncate(0, 8); EXPECT_EQ("ff00::", string(x.getPlain())); } } dibbler-1.0.1/Misc/tests/SPtr_unittest.cc0000664000175000017500000001221012560471634015236 00000000000000#include "SmartPtr.h" #include #include using namespace std; namespace { /// @brief Shows creation and destruction of Base,DerivedA,DerivedB objects /// /// There are 3 classes here: /// Base /// | /// +------+-----+ /// | | /// DerivedA DerivedB /// /// Each instance of a class increase static_value by a specific /// value: 1 for Base, 10 for DerivedA and 100 for DerivedB in /// their constructors. They decrease the value in their destructors. /// This way the tests can check when a given object is created /// or destroyed. int static_value = 0; class Base { public: Base() :value(1) { static_value += value; } int value; virtual ~Base() { static_value -= value; } }; class DerivedA : public Base { public: DerivedA() :Base() { value = 10; static_value += value; } virtual ~DerivedA() { static_value -= value; } }; class DerivedB : public Base { public: DerivedB() :Base() { value = 100; static_value += value; } virtual ~DerivedB() { static_value -= value; } }; class SmartPtrTest : public ::testing::Test { public: SmartPtrTest() { static_value = 0; } }; // Checks if NULL pointer is behaving properly TEST_F(SmartPtrTest, null) { // Check that by default a pointer is NULL SPtr base; EXPECT_FALSE(base); EXPECT_FALSE((Ptr*)base); EXPECT_EQ(1, base.refCount()); EXPECT_EQ(0, static_value); } // Test checks whether basic pointer operations are working // properly TEST_F(SmartPtrTest, basic_assign) { SPtr base = new Base(); EXPECT_TRUE(base); EXPECT_TRUE((Ptr*)base); EXPECT_EQ(1, base->value); EXPECT_EQ(1, static_value); EXPECT_EQ(1, ((Ptr*)base)->refcount); // Explicitly assign empty pointer, the object should be deleted // and the pointer should be NULL base = SPtr(); EXPECT_FALSE(base); EXPECT_FALSE((Ptr*)base); EXPECT_EQ(0, static_value); // Assign a new object again base = new Base(); EXPECT_TRUE(base); EXPECT_TRUE((Ptr*)base); EXPECT_EQ(1, base->value); EXPECT_EQ(1, static_value); // Explicitly assign NULL, the object should be deleted // and the pointer should be NULL base.reset(); EXPECT_FALSE(base); EXPECT_FALSE((Ptr*)base); EXPECT_EQ(0, static_value); } // This test checks if the reference counting is implemented properly. TEST_F(SmartPtrTest, refcounting) { SPtr a,b,c; a = new Base(); EXPECT_TRUE(a); EXPECT_FALSE(b); EXPECT_FALSE(c); EXPECT_EQ(1, a.refCount()); b = a; EXPECT_EQ(2, a.refCount()); EXPECT_EQ(2, b.refCount()); EXPECT_TRUE(a); EXPECT_TRUE(b); EXPECT_FALSE(c); c = b; EXPECT_EQ(3, a.refCount()); // non-NULL EXPECT_EQ(3, b.refCount()); // non-NULL EXPECT_EQ(3, c.refCount()); // non-NULL EXPECT_TRUE(a); EXPECT_TRUE(b); EXPECT_TRUE(c); a.reset(); EXPECT_EQ(1, a.refCount()); // NULL EXPECT_EQ(2, b.refCount()); EXPECT_EQ(2, c.refCount()); EXPECT_FALSE(a); EXPECT_TRUE(b); EXPECT_TRUE(c); b.reset(); EXPECT_EQ(1, a.refCount()); // NULL EXPECT_EQ(1, b.refCount()); // NULL EXPECT_EQ(1, c.refCount()); EXPECT_FALSE(a); EXPECT_FALSE(b); EXPECT_TRUE(c); // Check that the object is still not destroyed EXPECT_EQ(1, static_value); c.reset(); // This will destroy the last pointer, thus // triggering object destruction EXPECT_EQ(0, static_value); EXPECT_FALSE(a); EXPECT_FALSE(b); EXPECT_FALSE(c); } // This test checks whether a pointer can be successfully cast to derived // class pointer. TEST_F(SmartPtrTest, pointer_cast_success) { // Create an instance of a derived class and keep base pointer to it. SPtr base(new DerivedA()); EXPECT_EQ(1, base.refCount()); // Try to cast it to derived pointer SPtr derived = base.dynamic_pointer_cast(); ASSERT_TRUE(derived); EXPECT_EQ(2, base.refCount()); EXPECT_EQ(2, derived.refCount()); // Case 1 after casting: reset the derived pointer. // The reference counter should be decreased back to 1. derived.reset(); ASSERT_EQ(1, base.refCount()); // Cast 2 after casting: reset the base pointer. // The reference counter should be decreased back to 1 as well. derived = base.dynamic_pointer_cast(); base.reset(); ASSERT_EQ(1, derived.refCount()); } // This test checks if the reference counting is implemented properly. TEST_F(SmartPtrTest, pointer_cast_failure) { // We have a single object. SPtr base = new Base(); ASSERT_EQ(1, base.refCount()); // Let's try to cast it to derived pointer. It should fail as the // object is of type Base, not DerivedA. SPtr derived = base.dynamic_pointer_cast(); ASSERT_FALSE(derived); ASSERT_EQ(1, base.refCount()); // Attempt to cast to DerivedB should fail, too. ASSERT_FALSE(base.dynamic_pointer_cast()); ASSERT_EQ(1, base.refCount()); } } // end of anonymous namespace dibbler-1.0.1/Misc/tests/Makefile.in0000664000175000017500000010041012561652534014146 00000000000000# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ TESTS = $(am__EXEEXT_1) @HAVE_GTEST_TRUE@am__append_1 = Misc_tests noinst_PROGRAMS = $(am__EXEEXT_2) subdir = Misc/tests DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/depcomp $(top_srcdir)/test-driver ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/libtool.m4 \ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/include/dibbler-config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = @HAVE_GTEST_TRUE@am__EXEEXT_1 = Misc_tests$(EXEEXT) am__EXEEXT_2 = $(am__EXEEXT_1) PROGRAMS = $(noinst_PROGRAMS) am__Misc_tests_SOURCES_DIST = run_tests.cc IPv6Addr_unittest.cc \ DUID_unittest.cc SPtr_unittest.cc Container_unittest.cc @HAVE_GTEST_TRUE@am_Misc_tests_OBJECTS = run_tests.$(OBJEXT) \ @HAVE_GTEST_TRUE@ IPv6Addr_unittest.$(OBJEXT) \ @HAVE_GTEST_TRUE@ DUID_unittest.$(OBJEXT) \ @HAVE_GTEST_TRUE@ SPtr_unittest.$(OBJEXT) \ @HAVE_GTEST_TRUE@ Container_unittest.$(OBJEXT) Misc_tests_OBJECTS = $(am_Misc_tests_OBJECTS) am__DEPENDENCIES_1 = @HAVE_GTEST_TRUE@Misc_tests_DEPENDENCIES = $(am__DEPENDENCIES_1) \ @HAVE_GTEST_TRUE@ $(top_builddir)/Misc/libMisc.a AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = Misc_tests_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \ $(CXXFLAGS) $(Misc_tests_LDFLAGS) $(LDFLAGS) -o $@ AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)/include depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) LTCXXCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CXXFLAGS) $(CXXFLAGS) AM_V_CXX = $(am__v_CXX_@AM_V@) am__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@) am__v_CXX_0 = @echo " CXX " $@; am__v_CXX_1 = CXXLD = $(CXX) CXXLINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \ $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CXXLD = $(am__v_CXXLD_@AM_V@) am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@) am__v_CXXLD_0 = @echo " CXXLD " $@; am__v_CXXLD_1 = SOURCES = $(Misc_tests_SOURCES) DIST_SOURCES = $(am__Misc_tests_SOURCES_DIST) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags am__tty_colors_dummy = \ mgn= red= grn= lgn= blu= brg= std=; \ am__color_tests=no am__tty_colors = { \ $(am__tty_colors_dummy); \ if test "X$(AM_COLOR_TESTS)" = Xno; then \ am__color_tests=no; \ elif test "X$(AM_COLOR_TESTS)" = Xalways; then \ am__color_tests=yes; \ elif test "X$$TERM" != Xdumb && { test -t 1; } 2>/dev/null; then \ am__color_tests=yes; \ fi; \ if test $$am__color_tests = yes; then \ red=''; \ grn=''; \ lgn=''; \ blu=''; \ mgn=''; \ brg=''; \ std=''; \ fi; \ } am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__recheck_rx = ^[ ]*:recheck:[ ]* am__global_test_result_rx = ^[ ]*:global-test-result:[ ]* am__copy_in_global_log_rx = ^[ ]*:copy-in-global-log:[ ]* # A command that, given a newline-separated list of test names on the # standard input, print the name of the tests that are to be re-run # upon "make recheck". am__list_recheck_tests = $(AWK) '{ \ recheck = 1; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ { \ if ((getline line2 < ($$0 ".log")) < 0) \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[nN][Oo]/) \ { \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[yY][eE][sS]/) \ { \ break; \ } \ }; \ if (recheck) \ print $$0; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # A command that, given a newline-separated list of test names on the # standard input, create the global log from their .trs and .log files. am__create_global_log = $(AWK) ' \ function fatal(msg) \ { \ print "fatal: making $@: " msg | "cat >&2"; \ exit 1; \ } \ function rst_section(header) \ { \ print header; \ len = length(header); \ for (i = 1; i <= len; i = i + 1) \ printf "="; \ printf "\n\n"; \ } \ { \ copy_in_global_log = 1; \ global_test_result = "RUN"; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".trs"); \ if (line ~ /$(am__global_test_result_rx)/) \ { \ sub("$(am__global_test_result_rx)", "", line); \ sub("[ ]*$$", "", line); \ global_test_result = line; \ } \ else if (line ~ /$(am__copy_in_global_log_rx)[nN][oO]/) \ copy_in_global_log = 0; \ }; \ if (copy_in_global_log) \ { \ rst_section(global_test_result ": " $$0); \ while ((rc = (getline line < ($$0 ".log"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".log"); \ print line; \ }; \ printf "\n"; \ }; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # Restructured Text title. am__rst_title = { sed 's/.*/ & /;h;s/./=/g;p;x;s/ *$$//;p;g' && echo; } # Solaris 10 'make', and several other traditional 'make' implementations, # pass "-e" to $(SHELL), and POSIX 2008 even requires this. Work around it # by disabling -e (using the XSI extension "set +e") if it's set. am__sh_e_setup = case $$- in *e*) set +e;; esac # Default flags passed to test drivers. am__common_driver_flags = \ --color-tests "$$am__color_tests" \ --enable-hard-errors "$$am__enable_hard_errors" \ --expect-failure "$$am__expect_failure" # To be inserted before the command running the test. Creates the # directory for the log if needed. Stores in $dir the directory # containing $f, in $tst the test, in $log the log. Executes the # developer- defined test setup AM_TESTS_ENVIRONMENT (if any), and # passes TESTS_ENVIRONMENT. Set up options for the wrapper that # will run the test scripts (or their associated LOG_COMPILER, if # thy have one). am__check_pre = \ $(am__sh_e_setup); \ $(am__vpath_adj_setup) $(am__vpath_adj) \ $(am__tty_colors); \ srcdir=$(srcdir); export srcdir; \ case "$@" in \ */*) am__odir=`echo "./$@" | sed 's|/[^/]*$$||'`;; \ *) am__odir=.;; \ esac; \ test "x$$am__odir" = x"." || test -d "$$am__odir" \ || $(MKDIR_P) "$$am__odir" || exit $$?; \ if test -f "./$$f"; then dir=./; \ elif test -f "$$f"; then dir=; \ else dir="$(srcdir)/"; fi; \ tst=$$dir$$f; log='$@'; \ if test -n '$(DISABLE_HARD_ERRORS)'; then \ am__enable_hard_errors=no; \ else \ am__enable_hard_errors=yes; \ fi; \ case " $(XFAIL_TESTS) " in \ *[\ \ ]$$f[\ \ ]* | *[\ \ ]$$dir$$f[\ \ ]*) \ am__expect_failure=yes;; \ *) \ am__expect_failure=no;; \ esac; \ $(AM_TESTS_ENVIRONMENT) $(TESTS_ENVIRONMENT) # A shell command to get the names of the tests scripts with any registered # extension removed (i.e., equivalently, the names of the test logs, with # the '.log' extension removed). The result is saved in the shell variable # '$bases'. This honors runtime overriding of TESTS and TEST_LOGS. Sadly, # we cannot use something simpler, involving e.g., "$(TEST_LOGS:.log=)", # since that might cause problem with VPATH rewrites for suffix-less tests. # See also 'test-harness-vpath-rewrite.sh' and 'test-trs-basic.sh'. am__set_TESTS_bases = \ bases='$(TEST_LOGS)'; \ bases=`for i in $$bases; do echo $$i; done | sed 's/\.log$$//'`; \ bases=`echo $$bases` RECHECK_LOGS = $(TEST_LOGS) AM_RECURSIVE_TARGETS = check recheck TEST_SUITE_LOG = test-suite.log TEST_EXTENSIONS = @EXEEXT@ .test LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver LOG_COMPILE = $(LOG_COMPILER) $(AM_LOG_FLAGS) $(LOG_FLAGS) am__set_b = \ case '$@' in \ */*) \ case '$*' in \ */*) b='$*';; \ *) b=`echo '$@' | sed 's/\.log$$//'`; \ esac;; \ *) \ b='$*';; \ esac am__test_logs1 = $(TESTS:=.log) am__test_logs2 = $(am__test_logs1:@EXEEXT@.log=.log) TEST_LOGS = $(am__test_logs2:.test.log=.log) TEST_LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver TEST_LOG_COMPILE = $(TEST_LOG_COMPILER) $(AM_TEST_LOG_FLAGS) \ $(TEST_LOG_FLAGS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALLOCA = @ALLOCA@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ ARCH = @ARCH@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ EXTRA_DIST_SUBDIRS = @EXTRA_DIST_SUBDIRS@ FGREP = @FGREP@ GREP = @GREP@ GTEST_INCLUDES = @GTEST_INCLUDES@ GTEST_LDADD = @GTEST_LDADD@ GTEST_LDFLAGS = @GTEST_LDFLAGS@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LINKPRINT = @LINKPRINT@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PORT_CFLAGS = @PORT_CFLAGS@ PORT_LDFLAGS = @PORT_LDFLAGS@ PORT_SUBDIR = @PORT_SUBDIR@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ subdirs = @subdirs@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ # This is to workaround long long in gtest.h AM_CPPFLAGS = -I$(top_srcdir)/Misc -I$(top_srcdir)/CfgMgr \ $(GTEST_INCLUDES) -Wno-long-long -Wno-variadic-macros @HAVE_GTEST_TRUE@Misc_tests_SOURCES = run_tests.cc \ @HAVE_GTEST_TRUE@ IPv6Addr_unittest.cc DUID_unittest.cc \ @HAVE_GTEST_TRUE@ SPtr_unittest.cc Container_unittest.cc @HAVE_GTEST_TRUE@Misc_tests_LDFLAGS = $(AM_LDFLAGS) $(GTEST_LDFLAGS) @HAVE_GTEST_TRUE@Misc_tests_LDADD = $(GTEST_LDADD) \ @HAVE_GTEST_TRUE@ $(top_builddir)/Misc/libMisc.a all: all-am .SUFFIXES: .SUFFIXES: .cc .lo .log .o .obj .test .test$(EXEEXT) .trs $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign Misc/tests/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign Misc/tests/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstPROGRAMS: @list='$(noinst_PROGRAMS)'; test -n "$$list" || exit 0; \ echo " rm -f" $$list; \ rm -f $$list || exit $$?; \ test -n "$(EXEEXT)" || exit 0; \ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ echo " rm -f" $$list; \ rm -f $$list Misc_tests$(EXEEXT): $(Misc_tests_OBJECTS) $(Misc_tests_DEPENDENCIES) $(EXTRA_Misc_tests_DEPENDENCIES) @rm -f Misc_tests$(EXEEXT) $(AM_V_CXXLD)$(Misc_tests_LINK) $(Misc_tests_OBJECTS) $(Misc_tests_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Container_unittest.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/DUID_unittest.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/IPv6Addr_unittest.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/SPtr_unittest.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/run_tests.Po@am__quote@ .cc.o: @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $< .cc.obj: @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .cc.lo: @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LTCXXCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags # Recover from deleted '.trs' file; this should ensure that # "rm -f foo.log; make foo.trs" re-run 'foo.test', and re-create # both 'foo.log' and 'foo.trs'. Break the recipe in two subshells # to avoid problems with "make -n". .log.trs: rm -f $< $@ $(MAKE) $(AM_MAKEFLAGS) $< # Leading 'am--fnord' is there to ensure the list of targets does not # expand to empty, as could happen e.g. with make check TESTS=''. am--fnord $(TEST_LOGS) $(TEST_LOGS:.log=.trs): $(am__force_recheck) am--force-recheck: @: $(TEST_SUITE_LOG): $(TEST_LOGS) @$(am__set_TESTS_bases); \ am__f_ok () { test -f "$$1" && test -r "$$1"; }; \ redo_bases=`for i in $$bases; do \ am__f_ok $$i.trs && am__f_ok $$i.log || echo $$i; \ done`; \ if test -n "$$redo_bases"; then \ redo_logs=`for i in $$redo_bases; do echo $$i.log; done`; \ redo_results=`for i in $$redo_bases; do echo $$i.trs; done`; \ if $(am__make_dryrun); then :; else \ rm -f $$redo_logs && rm -f $$redo_results || exit 1; \ fi; \ fi; \ if test -n "$$am__remaking_logs"; then \ echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \ "recursion detected" >&2; \ else \ am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \ fi; \ if $(am__make_dryrun); then :; else \ st=0; \ errmsg="fatal: making $(TEST_SUITE_LOG): failed to create"; \ for i in $$redo_bases; do \ test -f $$i.trs && test -r $$i.trs \ || { echo "$$errmsg $$i.trs" >&2; st=1; }; \ test -f $$i.log && test -r $$i.log \ || { echo "$$errmsg $$i.log" >&2; st=1; }; \ done; \ test $$st -eq 0 || exit 1; \ fi @$(am__sh_e_setup); $(am__tty_colors); $(am__set_TESTS_bases); \ ws='[ ]'; \ results=`for b in $$bases; do echo $$b.trs; done`; \ test -n "$$results" || results=/dev/null; \ all=` grep "^$$ws*:test-result:" $$results | wc -l`; \ pass=` grep "^$$ws*:test-result:$$ws*PASS" $$results | wc -l`; \ fail=` grep "^$$ws*:test-result:$$ws*FAIL" $$results | wc -l`; \ skip=` grep "^$$ws*:test-result:$$ws*SKIP" $$results | wc -l`; \ xfail=`grep "^$$ws*:test-result:$$ws*XFAIL" $$results | wc -l`; \ xpass=`grep "^$$ws*:test-result:$$ws*XPASS" $$results | wc -l`; \ error=`grep "^$$ws*:test-result:$$ws*ERROR" $$results | wc -l`; \ if test `expr $$fail + $$xpass + $$error` -eq 0; then \ success=true; \ else \ success=false; \ fi; \ br='==================='; br=$$br$$br$$br$$br; \ result_count () \ { \ if test x"$$1" = x"--maybe-color"; then \ maybe_colorize=yes; \ elif test x"$$1" = x"--no-color"; then \ maybe_colorize=no; \ else \ echo "$@: invalid 'result_count' usage" >&2; exit 4; \ fi; \ shift; \ desc=$$1 count=$$2; \ if test $$maybe_colorize = yes && test $$count -gt 0; then \ color_start=$$3 color_end=$$std; \ else \ color_start= color_end=; \ fi; \ echo "$${color_start}# $$desc $$count$${color_end}"; \ }; \ create_testsuite_report () \ { \ result_count $$1 "TOTAL:" $$all "$$brg"; \ result_count $$1 "PASS: " $$pass "$$grn"; \ result_count $$1 "SKIP: " $$skip "$$blu"; \ result_count $$1 "XFAIL:" $$xfail "$$lgn"; \ result_count $$1 "FAIL: " $$fail "$$red"; \ result_count $$1 "XPASS:" $$xpass "$$red"; \ result_count $$1 "ERROR:" $$error "$$mgn"; \ }; \ { \ echo "$(PACKAGE_STRING): $(subdir)/$(TEST_SUITE_LOG)" | \ $(am__rst_title); \ create_testsuite_report --no-color; \ echo; \ echo ".. contents:: :depth: 2"; \ echo; \ for b in $$bases; do echo $$b; done \ | $(am__create_global_log); \ } >$(TEST_SUITE_LOG).tmp || exit 1; \ mv $(TEST_SUITE_LOG).tmp $(TEST_SUITE_LOG); \ if $$success; then \ col="$$grn"; \ else \ col="$$red"; \ test x"$$VERBOSE" = x || cat $(TEST_SUITE_LOG); \ fi; \ echo "$${col}$$br$${std}"; \ echo "$${col}Testsuite summary for $(PACKAGE_STRING)$${std}"; \ echo "$${col}$$br$${std}"; \ create_testsuite_report --maybe-color; \ echo "$$col$$br$$std"; \ if $$success; then :; else \ echo "$${col}See $(subdir)/$(TEST_SUITE_LOG)$${std}"; \ if test -n "$(PACKAGE_BUGREPORT)"; then \ echo "$${col}Please report to $(PACKAGE_BUGREPORT)$${std}"; \ fi; \ echo "$$col$$br$$std"; \ fi; \ $$success || exit 1 check-TESTS: @list='$(RECHECK_LOGS)'; test -z "$$list" || rm -f $$list @list='$(RECHECK_LOGS:.log=.trs)'; test -z "$$list" || rm -f $$list @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ log_list=`for i in $$bases; do echo $$i.log; done`; \ trs_list=`for i in $$bases; do echo $$i.trs; done`; \ log_list=`echo $$log_list`; trs_list=`echo $$trs_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) TEST_LOGS="$$log_list"; \ exit $$?; recheck: all @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ bases=`for i in $$bases; do echo $$i; done \ | $(am__list_recheck_tests)` || exit 1; \ log_list=`for i in $$bases; do echo $$i.log; done`; \ log_list=`echo $$log_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) \ am__force_recheck=am--force-recheck \ TEST_LOGS="$$log_list"; \ exit $$? Misc_tests.log: Misc_tests$(EXEEXT) @p='Misc_tests$(EXEEXT)'; \ b='Misc_tests'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) .test.log: @p='$<'; \ $(am__set_b); \ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) @am__EXEEXT_TRUE@.test$(EXEEXT).log: @am__EXEEXT_TRUE@ @p='$<'; \ @am__EXEEXT_TRUE@ $(am__set_b); \ @am__EXEEXT_TRUE@ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ @am__EXEEXT_TRUE@ --log-file $$b.log --trs-file $$b.trs \ @am__EXEEXT_TRUE@ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ @am__EXEEXT_TRUE@ "$$tst" $(AM_TESTS_FD_REDIRECT) distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am $(MAKE) $(AM_MAKEFLAGS) check-TESTS check: check-am all-am: Makefile $(PROGRAMS) installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: -test -z "$(TEST_LOGS)" || rm -f $(TEST_LOGS) -test -z "$(TEST_LOGS:.log=.trs)" || rm -f $(TEST_LOGS:.log=.trs) -test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool clean-noinstPROGRAMS \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: check-am install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-TESTS check-am clean \ clean-generic clean-libtool clean-noinstPROGRAMS cscopelist-am \ ctags ctags-am distclean distclean-compile distclean-generic \ distclean-libtool distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-dvi install-dvi-am install-exec \ install-exec-am install-html install-html-am install-info \ install-info-am install-man install-pdf install-pdf-am \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ recheck tags tags-am uninstall uninstall-am # 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: dibbler-1.0.1/Misc/addrpack.c0000664000175000017500000002430512556247252012665 00000000000000/* * Dibbler - a portable DHCPv6 * * authors: Tomasz Mrugalski * Marek Senderski * changes: Krzysztof Wnuk * Michal Kowalczuk * * released under GNU GPL v2 only licence * * some of those functions are taken form GNU libc6 library * */ #include #include #include #include #include "Portable.h" #ifdef WIN32 #include #endif #ifdef LINUX #include #endif #include "stdint.h" void print_packed(char addr[]); #define NS_INADDRSZ 4 /* IPv4 T_A */ #define NS_IN6ADDRSZ 16 /* IPv6 T_AAAA */ #define NS_INT16SZ 2 /* #/bytes of data in a u_int16_t */ #define u_char unsigned char #define u_int unsigned int static int inet_pton4(const char * src, char * dst) { int saw_digit, octets, ch; u_char tmp[NS_INADDRSZ], *tp; saw_digit = 0; octets = 0; *(tp = tmp) = 0; while ((ch = *src++) != '\0') { if (ch >= '0' && ch <= '9') { u_int new = *tp * 10 + (ch - '0'); if (new > 255) return (0); *tp = new; if (! saw_digit) { if (++octets > 4) return (0); saw_digit = 1; } } else if (ch == '.' && saw_digit) { if (octets == 4) return (0); *++tp = 0; saw_digit = 0; } else return (0); } if (octets < 4) return (0); memcpy(dst, tmp, NS_INADDRSZ); return (1); } int inet_pton6(const char *src, char * dst) { static char xdigits[] = "0123456789abcdef"; u_char tmp[NS_IN6ADDRSZ], *tp, *endp, *colonp; const char *curtok; int ch, saw_xdigit; u_int val; memset(tmp, '\0', NS_IN6ADDRSZ); tp = tmp; endp = tp + NS_IN6ADDRSZ; colonp = NULL; /* Leading :: requires some special handling. */ if (*src == ':') if (*++src != ':') return (0); curtok = src; saw_xdigit = 0; val = 0; while ((ch = tolower (*src++)) != '\0') { char * pch; pch = strchr(xdigits, ch); if (pch != NULL) { val <<= 4; val |= (pch - xdigits); if (val > 0xffff) return (0); saw_xdigit = 1; continue; } if (ch == ':') { curtok = src; if (!saw_xdigit) { if (colonp) return (0); colonp = tp; continue; } else if (*src == '\0') { return (0); } if (tp + NS_INT16SZ > endp) return (0); *tp++ = (u_char) (val >> 8) & 0xff; *tp++ = (u_char) val & 0xff; saw_xdigit = 0; val = 0; continue; } if (ch == '.' && ((tp + NS_INADDRSZ) <= endp) && inet_pton4(curtok, (char*)tp) > 0) { tp += NS_INADDRSZ; saw_xdigit = 0; break; /* '\0' was seen by inet_pton4(). */ } return (0); } if (saw_xdigit) { if (tp + NS_INT16SZ > endp) return (0); *tp++ = (u_char) (val >> 8) & 0xff; *tp++ = (u_char) val & 0xff; } if (colonp != NULL) { /* * Since some memmove()'s erroneously fail to handle * overlapping regions, we'll do the shift by hand. */ const int n = tp - colonp; int i; if (tp == endp) return (0); for (i = 1; i <= n; i++) { endp[- i] = colonp[n - i]; colonp[n - i] = 0; } tp = endp; } if (tp != endp) return (0); memcpy(dst, tmp, NS_IN6ADDRSZ); return (1); } char * inet_ntop4(const char * src, char * dst) { char tmp[sizeof "255.255.255.255"]; sprintf(tmp,"%u.%u.%u.%u", (const unsigned char)src[0], (const unsigned char)src[1], (const unsigned char)src[2], (const unsigned char)src[3]); return strcpy(dst, tmp); } char * inet_ntop6(const char * src2, char * dst) { const unsigned char* src = (unsigned char*)src2; char tmp[sizeof "ffff:ffff:ffff:ffff:ffff:ffff:255.255.255.255"], *tp; struct { int base, len; } best, cur; u_int words[NS_IN6ADDRSZ / NS_INT16SZ]; int i; best.len = cur.len = 0; /* * Preprocess: * Copy the input (bytewise) array into a wordwise array. * Find the longest run of 0x00's in src[] for :: shorthanding. */ memset(words, '\0', sizeof words); for (i = 0; i < NS_IN6ADDRSZ; i += 2) words[i / 2] = (src[i] << 8) | src[i + 1]; best.base = -1; cur.base = -1; for (i = 0; i < (NS_IN6ADDRSZ / NS_INT16SZ); i++) { if (words[i] == 0) { if (cur.base == -1) cur.base = i, cur.len = 1; else cur.len++; } else { if (cur.base != -1) { if (best.base == -1 || cur.len > best.len) best = cur; cur.base = -1; } } } if (cur.base != -1) { if (best.base == -1 || cur.len > best.len) best = cur; } if (best.base != -1 && best.len < 2) best.base = -1; /* * Format the result. */ tp = tmp; for (i = 0; i < (NS_IN6ADDRSZ / NS_INT16SZ); i++) { /* Are we inside the best run of 0x00's? */ if (best.base != -1 && i >= best.base && i < (best.base + best.len)) { if (i == best.base) *tp++ = ':'; continue; } /* Are we following an initial run of 0x00s or any real hex? */ if (i != 0) *tp++ = ':'; #if 0 /* encapsulated IPv4 addresses are no concern in Dibbler */ /* Is this address an encapsulated IPv4? */ if (i == 6 && best.base == 0 && (best.len == 6 || (best.len == 5 && words[5] == 0xffff))) { if (!inet_ntop4((char*)src+12, tp)) return (NULL); tp += strlen(tp); break; } #endif tp += sprintf(tp, "%x", words[i]); } /* Was it a trailing run of 0x00's? */ if (best.base != -1 && (best.base + best.len) == (NS_IN6ADDRSZ / NS_INT16SZ)) *tp++ = ':'; *tp++ = '\0'; return strcpy(dst, tmp); } void truncatePrefixFromConfig( char * src, char * dst, char length){ int i=0; dst[0]=0; for(i=0;i=0;i--) { sprintf(dst + strlen(dst), "%x.%x.", (src[i] & 0x0f), ( (src[i] & 0xf0 ) >> 4 ) ); } sprintf(dst + strlen(dst), "ip6.arpa."); } /** * function converts address to a DNS zone root with specified length * * @param src - packed address, e.g. 3ffe::123 * @param dst - dns zone root, e.g. 0.0.0.0.e.f.f.3.ip6.arpa * @param length - zone length, e.g. 96 */ void doRevDnsZoneRoot( char * src, char * dst, int length){ int i=0; dst[0]=0; i = 15 - length/8; /* skip whole bytes */ /** @todo: what to do with prefixes which do not divide by 4? */ switch (length%8) { case 1: break; case 2: break; case 3: break; case 4: sprintf(dst + strlen(dst), "%x.", (src[i]&0xf0) >> 4); break; case 5: break; case 6: break; case 7: default: break; } if (length%8) i--; /* print the rest */ for(; i>=0 ; i--) { sprintf(dst + strlen(dst), "%x.%x.", (src[i] & 0x0f), ( (src[i] & 0xf0 ) >> 4 ) ); } sprintf(dst + strlen(dst), "ip6.arpa."); } void print_packed(char * addr) { int i=0; for (;i<16;i++) { printf("%02x",*(unsigned char*)(addr+i)); if ((i%2) && i<15) printf(":"); } printf("\n"); } uint8_t readUint8(const BUFFER_TYPE* buf) { return buf[0]; } BUFFER_TYPE* writeUint8(BUFFER_TYPE* buf, uint8_t octet) { buf[0] = octet; return buf + sizeof(uint8_t); } /// @brief reads uint16_t from buffer in a portable way /// /// Buffer must be at least 2 bytes long. /// /// @param buf pointer to first byte of buffer /// /// @return read 16-bits value uint16_t readUint16(const BUFFER_TYPE * buf) { uint16_t value = ( ((uint16_t)buf[0]) << 8) + buf[1]; return value; } /// @brief stores uint16_t to a buffer in a portable way /// /// Buffer must be at least 2 bytes long. /// /// @param buf pointer to first byte of buffer /// @param word 16-bits value to be stored /// /// @return pointer to the next byte after stored value BUFFER_TYPE * writeUint16(BUFFER_TYPE * buf, uint16_t word) { buf[0] = (uint8_t)( (word >> 8) & 0xff ); buf[1] = (uint8_t)( (word) & 0xff ); return buf + sizeof(uint16_t); } /// @brief reads uint32_t from buffer in a portable way /// /// Buffer must be at least 4 bytes long. /// /// @param buf pointer to first address of buffer /// /// @return read value uint32_t readUint32(const BUFFER_TYPE * buf) { uint32_t value = ( ( (uint32_t)(buf[0]) ) << 24) + ( ( (uint32_t)(buf[1])) << 16) + ( ( (uint32_t)(buf[2])) << 8) + buf[3]; return value; } /// @brief stores uint32_t to a buffer in a portable way /// /// Buffer must be at least 4 bytes long. /// /// @param buf pointer to first byte of buffer /// @param dword 32-bits value to be stored /// /// @return pointer to the next byte after stored value BUFFER_TYPE * writeUint32(BUFFER_TYPE * buf, uint32_t dword) { buf[0] = (uint8_t)( (dword >> 24) & 0xff ); buf[1] = (uint8_t)( (dword >> 16) & 0xff ); buf[2] = (uint8_t)( (dword >> 8) & 0xff ); buf[3] = (uint8_t)( (dword) & 0xff ); return buf + sizeof(uint32_t); } /// @brief reads uint64_t from buffer in a portable way /// /// Buffer must be at least 8 bytes long. /// /// @param buf pointer to first address of buffer /// /// @return read value uint64_t readUint64(const BUFFER_TYPE * buf) { uint64_t value = ( ( (uint64_t)(buf[0]) ) << 56) + ( ( (uint64_t)(buf[1])) << 48) + ( ( (uint64_t)(buf[2])) << 40) + ( ( (uint64_t)(buf[3])) << 32) + ( ( (uint64_t)(buf[4])) << 24) + ( ( (uint64_t)(buf[5])) << 16) + ( ( (uint64_t)(buf[6])) << 8) + buf[7]; return value; } /// @brief stores uint64_t to a buffer in a portable way /// /// Buffer must be at least 8 bytes long. /// /// @param buf pointer to first byte of buffer /// @param qword 64-bits value to be stored /// /// @return pointer to the next byte after stored value BUFFER_TYPE * writeUint64(BUFFER_TYPE * buf, uint64_t qword) { buf[0] = (uint8_t)( (qword >> 56) & 0xff ); buf[1] = (uint8_t)( (qword >> 48) & 0xff ); buf[2] = (uint8_t)( (qword >> 40) & 0xff ); buf[3] = (uint8_t)( (qword >> 32) & 0xff ); buf[4] = (uint8_t)( (qword >> 24) & 0xff ); buf[5] = (uint8_t)( (qword >> 16) & 0xff ); buf[6] = (uint8_t)( (qword >> 8) & 0xff ); buf[7] = (uint8_t)( (qword) & 0xff ); return buf + sizeof(uint64_t); } BUFFER_TYPE* writeData(BUFFER_TYPE* buf, BUFFER_TYPE* data, size_t len) { memcpy(buf, data, len); return buf + len; } dibbler-1.0.1/Misc/sha512.h0000664000175000017500000000633012233256142012110 00000000000000/* Declarations of functions and data types used for SHA512 and SHA384 sum library functions. Copyright (C) 2005, 2006 Free Software Foundation, Inc. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ /* This file is taken from coreutils-6.2 (lib/sha512.h) and adapted for dibbler * by Michal Kowalczuk */ #ifndef SHA512_H # define SHA512_H 1 # include # include #ifdef __cplusplus extern "C" { #endif #define SHA384_BLOCKSIZE 128 #define SHA384_DIGESTSIZE 48 #define SHA512_BLOCKSIZE 128 #define SHA512_DIGESTSIZE 64 /* Structure to save state of computation between the single steps. */ struct sha512_ctx { uint64_t state[8]; uint64_t total[2]; uint64_t buflen; uint64_t buffer[32]; }; /* Initialize structure containing state of computation. */ extern void sha512_init_ctx (struct sha512_ctx *ctx); extern void sha384_init_ctx (struct sha512_ctx *ctx); /* Starting with the result of former calls of this function (or the initialization function update the context for the next LEN bytes starting at BUFFER. It is necessary that LEN is a multiple of 128!!! */ extern void sha512_process_block (const void *buffer, size_t len, struct sha512_ctx *ctx); /* Starting with the result of former calls of this function (or the initialization function update the context for the next LEN bytes starting at BUFFER. It is NOT required that LEN is a multiple of 128. */ extern void sha512_process_bytes (const void *buffer, size_t len, struct sha512_ctx *ctx); /* Process the remaining bytes in the buffer and put result from CTX in first 64 (48) bytes following RESBUF. The result is always in little endian byte order, so that a byte-wise output yields to the wanted ASCII representation of the message digest. IMPORTANT: On some systems it is required that RESBUF be correctly aligned for a 64 bits value. */ extern void *sha512_finish_ctx (struct sha512_ctx *ctx, void *resbuf); extern void *sha384_finish_ctx (struct sha512_ctx *ctx, void *resbuf); /* Put result from CTX in first 64 (48) bytes following RESBUF. The result is always in little endian byte order, so that a byte-wise output yields to the wanted ASCII representation of the message digest. IMPORTANT: On some systems it is required that RESBUF is correctly aligned for a 32 bits value. */ extern void *sha512_read_ctx (const struct sha512_ctx *ctx, void *resbuf); extern void *sha384_read_ctx (const struct sha512_ctx *ctx, void *resbuf); # define rol64(x,n) ( ((x) << (n)) | ((x) >> (64-(n))) ) #ifdef __cplusplus } #endif #endif dibbler-1.0.1/Misc/Logger.cpp0000664000175000017500000002175712233256142012671 00000000000000/* * Dibbler - a portable DHCPv6 * * authors: Tomasz Mrugalski * Marek Senderski * changes: Michal Kowalczuk * * released under GNU GPL v2 only licence */ #include #include #include #include #include #include #include "Logger.h" #include "Portable.h" #include "DHCPConst.h" #if defined(LINUX) || defined(BSD) #include #include #endif using namespace std; namespace logger { string logname="Init"; // Application ID in the log int logLevel=8; // Don't log messages with lower priority (=higher number) Elogmode logmode = LOGMODE_DEFAULT; /* default logmode */ ofstream logFile; // file where wanted msgs are stored string logFileName; bool logFileMode = false; // loging into file is active bool echo = true; // copy log on tty int curLogEntry = 8; // Log level of currently constructed message bool color = false; #ifdef LINUX string syslogname="DibblerInit"; // logname for syslog int curSyslogEntry = LOG_NOTICE; // curLogEntry for syslog #endif ostringstream buffer; // buffer for currently constructed message // LogEnd; ostream & endl (ostream & strum) { if (curLogEntry <= logLevel) { if (color) buffer << "\033[0m"; // log on the console if (echo) std::cout << buffer.str() << std::endl; // log to the file if (logFileMode) logger::logFile << buffer.str() << std::endl; #ifdef LINUX // POSIX syslog if (logmode == LOGMODE_SYSLOG) syslog(curSyslogEntry, "%s", buffer.str().c_str()); #endif } buffer.str(std::string()); buffer.clear(); return strum; } void setColors(bool colorLogs) { Log(Debug) << "Color logs " << (colorLogs?"enabled.":"disabled.") << LogEnd; color = colorLogs; } ostream & logCommon(int x) { static char lv[][10]= {"Emergency", "Alert ", "Critical ", "Error ", "Warning ", "Notice ", "Info ", "Debug " }; static char colors[][10] = { "\033[31m", "\033[31m", "\033[31m", "\033[31m", "\033[33m", "\033[30m", "\033[30m", "\033[37m" }; logger::curLogEntry = x; #ifdef LINUX static int syslogLevel[]= {LOG_EMERG, LOG_ALERT, LOG_CRIT, LOG_ERR, LOG_WARNING, LOG_NOTICE, LOG_INFO, LOG_DEBUG}; logger::curSyslogEntry = syslogLevel[logger::curLogEntry - 1]; #endif time_t teraz; teraz = time(NULL); struct tm * now = localtime( &teraz ); if (color && (logmode==LOGMODE_FULL || logmode==LOGMODE_SHORT) ) { buffer << colors[x-1]; } switch(logmode) { case LOGMODE_FULL: buffer << (1900+now->tm_year) << "."; buffer.width(2); buffer.fill('0'); buffer << now->tm_mon+1 << "."; buffer.width(2); buffer.fill('0'); buffer << now->tm_mday << " "; buffer.width(2); buffer.fill('0'); buffer << now->tm_hour << ":"; buffer.width(2); buffer.fill('0'); buffer << now->tm_min << ":"; buffer.width(2); buffer.fill('0'); buffer << now->tm_sec; break; case LOGMODE_SHORT: buffer.width(2); buffer.fill('0'); buffer << now->tm_min << ":"; buffer.width(2); buffer.fill('0'); buffer << now->tm_sec; break; case LOGMODE_PRECISE: int sec, usec; #ifndef WIN32 /* get time, Unix style */ struct timeval preciseTime; gettimeofday(&preciseTime, NULL); sec = preciseTime.tv_sec%3600; usec = preciseTime.tv_usec; #else /* get time, Windws style */ SYSTEMTIME now; GetSystemTime(&now); sec = now.wMinute*60 + now.wSecond; usec= now.wMilliseconds*1000; #endif buffer.width(4); buffer.fill('0'); buffer << sec << "s,"; buffer.width(6); buffer.fill('0'); buffer << usec << "us "; break; case LOGMODE_SYSLOG: return buffer; break; case LOGMODE_EVENTLOG: buffer << "EVENTLOG logging mode not supported yet."; break; } buffer << ' ' << logger::logname ; buffer << ' ' << lv[x-1] << " "; return buffer; } ostream& logCont() { return logger::buffer; } ostream& logEmerg() { return logger::logCommon(1); } ostream& logAlert() { return logger::logCommon(2); } ostream& logCrit() { return logger::logCommon(3); } ostream& logError() { return logger::logCommon(4); } ostream& logWarning() { return logger::logCommon(5); } ostream& logNotice() { return logger::logCommon(6); } ostream& logInfo() { return logger::logCommon(7); } ostream& logDebug() { return logger::logCommon(8); } /** * Prepare logging backend specified in logger::logmode for logging. */ static void openLog() { switch (logger::logmode) { case LOGMODE_FULL: case LOGMODE_SHORT: case LOGMODE_PRECISE: logger::logFileMode = true; logger::logFile.open(logFileName.c_str(), ofstream::out | ofstream::app); break; case LOGMODE_SYSLOG: #ifdef LINUX openlog(syslogname.c_str(), LOG_PID, LOG_DAEMON); #endif break; case LOGMODE_EVENTLOG: #ifdef WIN32 #endif break; } } /** * Change logging mode, possibly backend too. * Some modes log into common backend, some modes have unique backends. * * @param newMode New logging mode * */ static void changeLogMode(Elogmode newMode) { if (newMode != logger::logmode) { if (logger::logFileMode && ((newMode == LOGMODE_FULL) || (newMode == LOGMODE_SHORT) || (newMode == LOGMODE_PRECISE))) logger::logmode = newMode; else { Terminate(); logger::logmode = newMode; openLog(); } } } /** * Initialize logging. * * @param file File suitable for logging into */ void Initialize(const char * file) { logger::logFileName = std::string(file); openLog(); } /** * Close loging backend. */ void Terminate() { switch (logger::logmode) { case LOGMODE_FULL: case LOGMODE_SHORT: case LOGMODE_PRECISE: logger::logFileMode = false; logger::logFile.close(); break; case LOGMODE_SYSLOG: #ifdef LINUX closelog(); #endif break; case LOGMODE_EVENTLOG: #ifdef WIN32 #endif break; } } void EchoOn() { logger::echo = true; } void EchoOff() { logger::echo = false; } void setLogLevel(int x) { if (x>8 || x<1) return; logger::logLevel = x; } void setLogName(string x) { logger::logname = x; #ifdef LINUX logger::syslogname = std::string("Dibbler").append(logger::logname); #endif } string getLogName() { return logger::logname; } int getLogLevel() { return logger::logLevel; } void setLogMode(string x) { if (x=="short") { changeLogMode(LOGMODE_SHORT); } if (x=="full") { changeLogMode(LOGMODE_FULL); } if (x=="precise") { changeLogMode(LOGMODE_PRECISE); } #ifdef LINUX if (x=="syslog") { changeLogMode(LOGMODE_SYSLOG); } #endif #ifdef WIN32 if (x=="eventlog") { changeLogMode(LOGMODE_EVENTLOG); } #endif } } std::string StateToString(EState state) { std::stringstream tmp; switch (state) { case STATE_NOTCONFIGURED: return "NOTCONFIGURED"; case STATE_INPROCESS: return "INPROCESS"; case STATE_CONFIGURED: return "CONFIGURED"; case STATE_FAILED: return "FAILED"; case STATE_DISABLED: return "DISABLED"; case STATE_TENTATIVECHECK: return "TENTATIVECHECK"; case STATE_CONFIRMME: return "CONFIRMME"; case STATE_TENTATIVE: return "TENTATIVE"; default: tmp << "UNKNOWN(" << state << ")"; return tmp.str(); } } std::string StatusCodeToString(int status) { switch(status) { case STATUSCODE_SUCCESS: return "Success"; case STATUSCODE_UNSPECFAIL: return "Unspecified failure"; case STATUSCODE_NOADDRSAVAIL: return "No addresses available"; case STATUSCODE_NOBINDING: return "No binding"; case STATUSCODE_NOTONLINK: return "Not on link"; case STATUSCODE_USEMULTICAST: return "Use multicast"; case STATUSCODE_NOPREFIXAVAIL: return "No prefix available"; } return ""; } std::string MsgTypeToString(int msgType) { switch (msgType) { case SOLICIT_MSG: return "SOLICIT"; break; case ADVERTISE_MSG: return "ADVERTISE"; case REQUEST_MSG: return "REQUEST"; case REPLY_MSG: return "REPLY"; case RELEASE_MSG: return "RELEASE"; case CONFIRM_MSG: return "CONFIRM"; case DECLINE_MSG: return "DECLINE"; case RENEW_MSG: return "RENEW"; case REBIND_MSG: return "REBIND"; case INFORMATION_REQUEST_MSG: return "INF-REQUEST"; case RELAY_FORW_MSG: return "RELAY-FORW"; case RELAY_REPL_MSG: return "RELAY-REPL"; default: return "?"; } } dibbler-1.0.1/Misc/ScriptParams.h0000664000175000017500000000152712233256142013520 00000000000000/* * Dibbler - a portable DHCPv6 * * author: Tomasz Mrugalski * * released under GNU GPL v2 only licence * */ #ifndef NOTIFYSCRIPTPARAMS #define NOTIFYSCRIPTPARAMS #include #include "IPv6Addr.h" class TNotifyScriptParams { public: static const int MAX_PARAMS = 512; const char * env[MAX_PARAMS]; std::string params; int envCnt; int ipCnt; int pdCnt; TNotifyScriptParams(); ~TNotifyScriptParams(); void addParam(const std::string& name, const std::string& value); void addAddr(SPtr addr, unsigned int prefered, unsigned int valid, std::string txt = std::string("") ); void addPrefix(SPtr prefix, unsigned short length, unsigned int prefered, unsigned int valid, std::string txt = std::string("")); }; #endif dibbler-1.0.1/Misc/DHCPServer.h0000644000175000017500000000103512277722750013020 00000000000000/* * Dibbler - a portable DHCPv6 * * authors: Tomasz Mrugalski * Marek Senderski * * released under GNU GPL v2 only licence */ #ifndef DHCPSERVER_H #define DHCPSERVER_H #include #include #include "SmartPtr.h" class TDHCPServer { public: TDHCPServer(const std::string& config); void run(); void stop(); bool isDone(); bool checkPrivileges(); void setWorkdir(std::string workdir); ~TDHCPServer(); private: bool IsDone_; }; #endif dibbler-1.0.1/Misc/hex.cpp0000644000175000017500000000324312277722750012235 00000000000000/* * Dibbler - a portable DHCPv6 * * authors: Tomasz Mrugalski * * Released under GNU GPL v2 licence * */ #include #include #include #include "hex.h" #include "Logger.h" std::vector textToHex(std::string buf) { // if it starts with 0x, just ignore that prefix if ( (buf.length() >= 2) && (buf[0] == '0') && (buf[1] == 'x')) { buf = buf.substr(2); } std::vector tmp; int textLen = buf.length(); unsigned char digit; int i=0; bool twonibbles = false; char value = 0; while (i < textLen) { if (buf[i]==':') { i++; } digit = buf[i]; if (isalpha(digit)) digit = toupper(digit)-'A'+10; else digit -= '0'; value <<= 4; value |= digit; i++; if (twonibbles) { twonibbles = false; tmp.push_back(value); value = 0; } else twonibbles = true; } return tmp; } std::string hexToText(const uint8_t* buf, size_t buf_len, bool add_colons /*= false*/, bool add_0x /* = false*/) { std::ostringstream tmp; if (add_0x) tmp << "0x"; for(unsigned i = 0; i < buf_len; i++) { if (i) tmp << ":"; tmp << std::setfill('0') << std::setw(2) << std::hex << (unsigned short)((unsigned char) buf[i]); } return tmp.str(); } std::string hexToText(const std::vector& vector, bool add_colons /*= false*/, bool add_0x /*= false*/) { return hexToText(&vector[0], vector.size(), add_colons, add_0x); } dibbler-1.0.1/Misc/DHCPDefaults.h0000644000175000017500000000416112304040124013277 00000000000000/* * Dibbler - a portable DHCPv6 * * authors: Tomasz Mrugalski * changes: * * Released under GNU GPL v2 licence * */ #include #ifndef DHCPDEFAULTS_H #define DHCPDEFAULTS_H // How long should we wait before we assume that OS detected duplicated addresses (in secs) #define DADTIMEOUT ((unsigned long) 3) // addresses reported as DECLINED are not used for 2 hours #define DECLINED_TIMEOUT ((unsigned long) 7200) // 1 (quiet) - 8 (debug) #define DEFAULT_LOGLEVEL 7 // DHCPv6 server default values #define SERVER_DEFAULT_DOMAIN "" #define SERVER_DEFAULT_TIMEZONE "" #define SERVER_DEFAULT_CLNTMAXLEASE 10 #define SERVER_DEFAULT_CLASSMAXLEASE 1048576 #define SERVER_DEFAULT_IFACEMAXLEASE UINT_MAX #define SERVER_DEFAULT_PREFERENCE 0 #define SERVER_DEFAULT_RAPIDCOMMIT false #define SERVER_DEFAULT_LEASEQUERY false #define SERVER_DEFAULT_DNSUPDATE_MODE DNSUPDATE_MODE_NONE #define SERVER_DEFAULT_DNSUPDATE_REVDNS_ZONE_LEN 64 #define SERVER_DEFAULT_MIN_T1 5 #define SERVER_DEFAULT_MAX_T1 3600 /* 1 hour */ #define SERVER_DEFAULT_MIN_T2 10 #define SERVER_DEFAULT_MAX_T2 5400 /* 1,5 hour */ #define SERVER_DEFAULT_MIN_PREF 7200 /* 2 hours */ #define SERVER_DEFAULT_MAX_PREF 86400 /* 1 day */ #define SERVER_DEFAULT_MIN_VALID 10800 /* 3 hours */ #define SERVER_DEFAULT_MAX_VALID 172800 /* 2 days */ #define SERVER_DEFAULT_CLASS_SHARE 100 #define SERVER_DEFAULT_CLASS_MAX_LEASE UINT_MAX #define SERVER_DEFAULT_TA_PREF_LIFETIME 3600 #define SERVER_DEFAULT_TA_VALID_LIFETIME 7200 #define SERVER_DEFAULT_CACHE_SIZE 1048576 /* cache size, specified in bytes */ #define SERVER_MAX_IA_RANDOM_TRIES 100 #define SERVER_MAX_TA_RANDOM_TRIES 100 #define SERVER_MAX_PD_RANDOM_TRIES 100 // see DHCPConst.h for available enums #define SERVER_DEFAULT_UNKNOWN_FQDN UNKNOWN_FQDN_REJECT #define CLIENT_DEFAULT_T1 UINT_MAX #define CLIENT_DEFAULT_T2 UINT_MAX #define CLIENT_DEFAULT_UNICAST false #define CLIENT_DEFAULT_RAPID_COMMIT false // It is now /128. See discussion in bug #222 #define CLIENT_DEFAULT_PREFIX_LENGTH 128 #define CLIENT_DEFAULT_FQDN_FLAG_S true #endif /* DHCPDEFAULTS_H */ dibbler-1.0.1/Misc/Key.cpp0000644000175000017500000000275512277722750012210 00000000000000/* * Dibbler - a portable DHCPv6 * * author: Tomasz Mrugalski * * released under GNU GPL v2 licence */ #include #include "Key.h" #include "Logger.h" extern "C" { #include "base64.h" } TSIGKey::TSIGKey(const std::string& name) : Digest_(DIGEST_NONE), Name_(name), Fudge_(300) { } std::string TSIGKey::getAlgorithmText() { switch (Digest_) { case DIGEST_HMAC_MD5: return std::string("HMAC-MD5.SIG-ALG.REG.INT"); case DIGEST_HMAC_SHA1: return std::string("HMAC-SHA1.SIG-ALG.REG.INT"); case DIGEST_HMAC_SHA256: return std::string("HMAC-SHA256.SIG-ALG.REG.INT"); default: return std::string("Unsupported algorithm"); } } bool TSIGKey::setData(const std::string& base64encoded) { Base64Data_ = base64encoded; char raw[100]; size_t raw_len = 100; memset(raw, 0, 100); base64_decode_context ctx = {0}; base64_decode_ctx_init(&ctx); bool status = base64_decode(&ctx, Base64Data_.c_str(), Base64Data_.length(), raw, &raw_len); if (!status) { Log(Warning) << "Failed to base64-decode key. There are trailing unparsed characters." << LogEnd; } Data_.resize(raw_len); for (unsigned i=0; i * * released under GNU GPL v2 only licence * */ #include #include #include "ScriptParams.h" #include "Logger.h" #include #include "Portable.h" using namespace std; TNotifyScriptParams::TNotifyScriptParams() :envCnt(0), ipCnt(1), pdCnt(1) { for (int i = 0; i<512; i++) { env[i] = 0; } } /// adds parameter to parameters list /// /// @param name name of the parameter to be added /// @param value value to be copied /// /// @return next unused offset void TNotifyScriptParams::addParam(const std::string& name, const std::string& value) { if (envCnt>=MAX_PARAMS) { Log(Error) << "Too many parameter for script: " << envCnt << LogEnd; return; } // +2, because = and \n have to be added. size_t len = name.length() + value.length() + 2; char * tmp = new char[len]; snprintf(tmp, len, "%s=%s", name.c_str(), value.c_str()); env[envCnt] = tmp; envCnt++; } TNotifyScriptParams::~TNotifyScriptParams() { int offset = 0; while (env[offset] != NULL) { delete [] env[offset]; env[offset] = 0; offset++; } } void TNotifyScriptParams::addAddr(SPtr addr, unsigned int prefered, unsigned int valid, std::string txt /*= std::string("")*/ ) { stringstream name, value; name << "ADDR" << ipCnt; addParam(name.str(), addr->getPlain()); name.str(""); name << "ADDR" << ipCnt << "PREF"; value << prefered; addParam(name.str(), value.str()); name.str(""); value.str(""); name << "ADDR" << ipCnt << "VALID"; value << valid; addParam(name.str(), value.str()); ipCnt++; } void TNotifyScriptParams::addPrefix(SPtr prefix, unsigned short length, unsigned int prefered, unsigned int valid, std::string txt /*= std::string("") */ ) { stringstream name, value; name << "PREFIX" << pdCnt; addParam(name.str(), prefix->getPlain()); name.str(""); name << "PREFIX" << pdCnt << "LEN"; value << length; addParam(name.str(), value.str()); name.str(""); value.str(""); name << "PREFIX" << pdCnt << "PREF"; value << prefered; addParam(name.str(), value.str()); name.str(""); value.str(""); name << "PREFIX" << pdCnt << "VALID"; value << valid; addParam(name.str(), value.str()); name.str(""); value.str(""); pdCnt++; } dibbler-1.0.1/Misc/KeyList.h0000644000175000017500000000123212277722750012476 00000000000000/* * Dibbler - a portable DHCPv6 * * author: Michal Kowalczuk * * released under GNU GPL v2 only licence * */ #include #include #include "Portable.h" #ifndef KEYLIST_FILE_HEADER_INC #define KEYLIST_FILE_HEADER_INC struct KeyListElement { // client-server SPI uint32_t SPI; uint32_t AAASPI; char * AuthInfoKey; KeyListElement * next; }; class KeyList { public: KeyList(): beginning(NULL) {} ~KeyList(); void Add(uint32_t SPI, uint32_t AAASPI, char * AuthInfoKey); void Del(uint32_t SPI); char * Get(uint32_t SPI); protected: KeyListElement * beginning; }; #endif dibbler-1.0.1/Misc/IPv6Addr.h0000644000175000017500000000232512420532733012463 00000000000000/* * Dibbler - a portable DHCPv6 * * authors: Tomasz Mrugalski * Marek Senderski * * Released under GNU GPL v2 licence * */ #ifndef IPV6ADDR_H #define IPV6ADDR_H #include #include class TIPv6Addr { friend std::ostream& operator<<(std::ostream& out,TIPv6Addr& group); public: TIPv6Addr(); //Creates any address TIPv6Addr(const char* addr, bool plain=false); /* creates address from prefix+host, used in SrvCfgPD */ TIPv6Addr(const char* prefix, const char* host, int prefixLength); char* getAddr(); void setAddr(char* addr); char* getPlain(); char* storeSelf(char *buf); bool linkLocal(); bool multicast(); TIPv6Addr operator-(const TIPv6Addr &other); TIPv6Addr operator+(const TIPv6Addr &other); TIPv6Addr& operator--(); TIPv6Addr& operator++(); bool operator==(const TIPv6Addr &other); bool operator!=(const TIPv6Addr &other); bool operator<=(const TIPv6Addr &other); void truncate(int minPrefix, int maxPrefix); private: char Addr[16]; char Plain[sizeof("0000:0000:0000:0000:0000:0000:0000.000.000.000.000")]; }; typedef std::list< SPtr > TAddrLst; #endif dibbler-1.0.1/Misc/long128.h0000664000175000017500000000102412233256142012272 00000000000000/* * Dibbler - a portable DHCPv6 * * authors: Tomasz Mrugalski * Marek Senderski * * $Id: long128.h,v 1.3 2004-03-29 22:06:49 thomson Exp $ * * $Log: not supported by cvs2svn $ * * Released under GNU GPL v2 licence * */ #ifndef LONG128_H #define LONG128_H #include "IPv6Addr.h" #include "SmartPtr.h" class ulong128 { public: ulong128(); ulong128(SPtr addr); ulong128 operator+(ulong128& other); private: unsigned char bytes[16]; }; #endif dibbler-1.0.1/Misc/FQDN.h0000644000175000017500000000155712277722750011654 00000000000000/* * Dibbler - a portable DHCPv6 * * author: Krzysztof Wnuk * * released under GNU GPL v2 only licence * */ #ifndef FQDN_H #define FQDN_H #include #include #include #include #include "DUID.h" #include "IPv6Addr.h" #include "SmartPtr.h" class TFQDN { friend std::ostream& operator<<(std::ostream& out,TFQDN& truc); public: TFQDN(); //Creates any addresses and names TFQDN(SPtr duid, const std::string& name, bool used); TFQDN(SPtr addr, const std::string& name, bool used); TFQDN(const std::string& name, bool used); SPtr getDuid(); SPtr getAddr(); std::string getName(); bool isUsed(); void setUsed(bool used); private: SPtr Duid_; SPtr Addr_; std::string Name_; bool Used_; }; #endif dibbler-1.0.1/Misc/hmac-sha-md5.c0000644000175000017500000000763512277722750013266 00000000000000/* * Dibbler - a portable DHCPv6 * * author: Michal Kowalczuk * * released under GNU GPL v2 licence * */ #include #include #include "Misc/md5.h" #include "Misc/sha1.h" #include "Misc/sha256.h" #include "Misc/sha512.h" /* "Feeding The Void With Emptiness..." ;) */ #define SHA_CASE(x,y) \ case x: \ ctx = malloc(sizeof(struct sha##y##_ctx)); \ init_ctx = (void(*)(void *)) &sha##x##_init_ctx; \ process_bytes = (void(*)(void *, size_t, void *))&sha##y##_process_bytes; \ finish_ctx = (void* (*)(void *, void *)) &sha##x##_finish_ctx; \ blocksize = SHA##x##_BLOCKSIZE; \ digestsize = SHA##x##_DIGESTSIZE; \ break; /* Take buffer and key (and their lengths), generate HMAC-SHA (or HMAC-MD5) */ /* and write the result to RESBUF */ /* type is one of the following: 1, 224, 256, 384, 512 (for SHA) or 5 (for MD5) */ static void * hmac_sha_md5 (const char *buffer, size_t len, char *key, size_t key_len, char *resbuf, int type) { /* SHA512_BLOCKSIZE and SHA512_DIGESTSIZE are the biggest, so we can use it with other algorithms */ char Ki[SHA512_BLOCKSIZE]; char Ko[SHA512_BLOCKSIZE]; char tmpbuf[SHA512_DIGESTSIZE]; int i; int blocksize; int digestsize; void *ctx; void (*init_ctx)(void *); void (*process_bytes)(void *, size_t, void *); void *(*finish_ctx)(void *, void *); void *result; switch (type) { case 5: /* Oh, it's MD5! */ ctx = malloc(sizeof(struct md5_ctx)); init_ctx = (void(*)(void *)) &md5_init_ctx; process_bytes = (void(*)(void *, size_t, void *)) &md5_process_bytes; finish_ctx = (void* (*)(void *, void *)) &md5_finish_ctx; blocksize = MD5_BLOCKSIZE; digestsize = MD5_DIGESTSIZE; break; /* .--------< SHA variant | v */ SHA_CASE( 1, 1) SHA_CASE(224, 256) SHA_CASE(256, 256) SHA_CASE(384, 512) SHA_CASE(512, 512) default: return NULL; } /* if given key is longer that algorithm's block, we must change it to hash of the original key (of size of algorithm's digest) */ if (key_len > blocksize) { init_ctx (&ctx); process_bytes (key, key_len, &ctx); finish_ctx (&ctx, Ki); key_len = digestsize; memcpy(Ko, Ki, key_len); } else { memcpy(Ki, key, key_len); memcpy(Ko, key, key_len); } /* prepare input and output key */ for (i = 0; i < key_len; i++) { Ki[i] ^= 0x36; Ko[i] ^= 0x5c; } for (; i < blocksize; i++) { Ki[i] = 0x36; Ko[i] = 0x5c; } init_ctx (ctx); process_bytes (Ki, blocksize, ctx); process_bytes ((void *)buffer, len, ctx); finish_ctx (ctx, tmpbuf); init_ctx (ctx); process_bytes (Ko, blocksize, ctx); process_bytes (tmpbuf, digestsize, ctx); result = finish_ctx (ctx, resbuf); free(ctx); return result; } /* HMAC-SHA function wrapper */ void *hmac_sha (const char *buffer, size_t len, char *key, size_t key_len, char *resbuf, int type) { return hmac_sha_md5(buffer, len, key, key_len, resbuf, type); } /* HMAC-MD5 function wrapper */ void *hmac_md5 (const char *buffer, size_t len, char *key, size_t key_len, char *resbuf) { return hmac_sha_md5(buffer, len, key, key_len, resbuf, 5); } dibbler-1.0.1/Misc/Portable.h.in0000664000175000017500000003617012561700136013270 00000000000000/* * Dibbler - a portable DHCPv6 * * authors: Tomasz Mrugalski * Marek Senderski * changes: Krzysztof Wnuk * Michal Kowalczuk * * Released under GNU GPL v2 licence * */ #ifndef PORTABLE_H #define PORTABLE_H #define DIBBLER_VERSION "@PACKAGE_VERSION@" #define DIBBLER_COPYRIGHT1 "| Dibbler - a portable DHCPv6, version " DIBBLER_VERSION #define DIBBLER_COPYRIGHT2 "| Authors : Tomasz Mrugalski,Marek Senderski" #define DIBBLER_COPYRIGHT3 "| Licence : GNU GPL v2 only. Developed at Gdansk University of Technology." #define DIBBLER_COPYRIGHT4 "| Homepage: http://klub.com.pl/dhcpv6/" #ifdef WIN32 #include #define strcasecmp strcmpi #define snprintf _snprintf #endif #if defined(LINUX) || defined(BSD) #include #endif #include #include /* this should look like this: uint16_t readUint16(uint8_t* buf); uint8_t * writeUint16(uint8_t* buf, uint16_t word); uint32_t readUint32(uint8_t* buf); uint8_t* writeUint32(uint8_t* buf, uint32_t dword); uint64_t readUint64(uint8_t* buf); uint8_t* writeUint64(uint8_t* buf, uint64_t qword); */ /* due to poor type usage (char* instead of uint8_t*), we need to stick with char* for now. Changing to uint8_t would require rewriting large parts of the code */ #define BUFFER_TYPE char #ifdef __cplusplus extern "C" { #endif uint8_t readUint8(const BUFFER_TYPE* buf); BUFFER_TYPE* writeUint8(BUFFER_TYPE* buf, uint8_t octet); uint16_t readUint16(const BUFFER_TYPE * buf); BUFFER_TYPE * writeUint16(BUFFER_TYPE * buf, uint16_t word); uint32_t readUint32(const BUFFER_TYPE * buf); BUFFER_TYPE * writeUint32(BUFFER_TYPE * buf, uint32_t dword); uint64_t readUint64(const BUFFER_TYPE * buf); BUFFER_TYPE * writeUint64(BUFFER_TYPE * buf, uint64_t qword); BUFFER_TYPE* writeData(BUFFER_TYPE* buf, BUFFER_TYPE* data, size_t len); #ifdef __cplusplus } #endif #define DEFAULT_UMASK 027 /**********************************************************************/ /*** data structures **************************************************/ /**********************************************************************/ #ifndef MAX_IFNAME_LENGTH #define MAX_IFNAME_LENGTH 255 #endif /* Structure used for interface name reporting */ struct iface { char name[MAX_IFNAME_LENGTH]; /* interface name */ int id; /* interface ID (often called ifindex) */ int hardwareType; /* type of hardware (see RFC 826) */ char mac[255]; /* link layer address */ int maclen; /* length of link layer address */ char *linkaddr; /* assigned IPv6 link local addresses */ int linkaddrcount; /* number of assigned IPv6 link local addresses */ char *globaladdr; /* global IPv6 addresses */ int globaladdrcount; /* number of global IPV6 addresses */ int link_state; /* used in link change detection routines */ unsigned int flags; /* look IF_xxx in portable.h */ unsigned char m_bit; /* M bit in RA received? */ unsigned char o_bit; /* O bit in RA received? */ struct iface* next; /* structure describing next iface in system */ }; #define MAX_LINK_STATE_CHANGES_AT_ONCE 16 struct link_state_notify_t { int ifindex[MAX_LINK_STATE_CHANGES_AT_ONCE]; /* indexes of interfaces that has changed. Only non-zero values will be used */ int stat[MAX_LINK_STATE_CHANGES_AT_ONCE]; int cnt; /* number of iterface indexes filled */ }; /**********************************************************************/ /*** file setup/default paths *****************************************/ /**********************************************************************/ #define CLNTCFGMGR_FILE "client-CfgMgr.xml" #define CLNTIFACEMGR_FILE "client-IfaceMgr.xml" #define CLNTDUID_FILE "client-duid" #define CLNTADDRMGR_FILE "client-AddrMgr.xml" #define CLNTTRANSMGR_FILE "client-TransMgr.xml" #define SRVCFGMGR_FILE "server-CfgMgr.xml" #define SRVIFACEMGR_FILE "server-IfaceMgr.xml" #define SRVDUID_FILE "server-duid" #define SRVADDRMGR_FILE "server-AddrMgr.xml" #define SRVTRANSMGR_FILE "server-TransMgr.xml" #define SRVCACHE_FILE "server-cache.xml" #define RELCFGMGR_FILE "relay-CfgMgr.xml" #define RELIFACEMGR_FILE "relay-IfaceMgr.xml" #define RELTRANSMGR_FILE "relay-TransMgr.xml" #define REQIFACEMGR_FILE "requestor-IfaceMgr.xml" #define DNSUPDATE_DEFAULT_TTL "2h" #define DNSUPDATE_DEFAULT_TIMEOUT 1000 /* in ms */ #define INACTIVE_MODE_INTERVAL 3 /* 3 seconds */ #define REQLOG_FILE "dibbler-requestor.log" #ifdef WIN32 #define DEFAULT_WORKDIR ".\\" #define DEFAULT_SCRIPT "" #define DEFAULT_CLNTCONF_FILE "client.conf" #define SRVCONF_FILE "server.conf" #define RELCONF_FILE "relay.conf" #define DEFAULT_CLNTLOG_FILE "dibbler-client.log" #define SRVLOG_FILE "dibbler-server.log" #define RELLOG_FILE "dibbler-relay.log" #define CLNT_AAASPI_FILE "AAA-SPI" #define SRV_KEYMAP_FILE "keys-mapping" #define NULLFILE "nul" /* specifies if client should remove any configured DNS servers when configuring DNS servers for the first time. This makes sense on WIN32 only. */ #define FLUSH_OTHER_CONFIGURED_DNS_SERVERS true #endif #if defined(LINUX) || defined(BSD) || defined(SUNOS) #define DEFAULT_WORKDIR "/var/lib/dibbler" #define DEFAULT_CLNTCONF_FILE "/etc/dibbler/client.conf" #define DEFAULT_CLNTPID_FILE "/var/lib/dibbler/client.pid" #define DEFAULT_CLNTLOG_FILE "/var/log/dibbler/dibbler-client.log" #define DEFAULT_SCRIPT "" #define SRVCONF_FILE "/etc/dibbler/server.conf" #define RELCONF_FILE "/etc/dibbler/relay.conf" #define RESOLVCONF_FILE "/etc/resolv.conf" #define NTPCONF_FILE "/etc/ntp.conf" #define RADVD_FILE "/etc/dibbler/radvd.conf" #define SRVPID_FILE "/var/lib/dibbler/server.pid" #define RELPID_FILE "/var/lib/dibbler/relay.pid" #define SRVLOG_FILE "/var/log/dibbler/dibbler-server.log" #define RELLOG_FILE "/var/log/dibbler/dibbler-relay.log" #define CLNT_AAASPI_FILE "/var/lib/dibbler/AAA/AAA-SPI" #define SRV_KEYMAP_FILE "/var/lib/dibbler/AAA/keys-mapping" #define NULLFILE "/dev/null" /* those defines were initially used on Linux only, but hopefully they will work on other Posix systems as well */ #define RESOLVCONF "/sbin/resolvconf" #define TIMEZONE_FILE "/etc/localtime" #define TIMEZONES_DIR "/usr/share/zoneinfo" /* specifies if client should remove any configured DNS servers when configuring DNS servers for the first time. This makes sense on WIN32 only. */ #define FLUSH_OTHER_CONFIGURED_DNS_SERVERS false #endif /* --- options --- */ #define OPTION_DNS_SERVERS_FILENAME "option-dns-servers" #define OPTION_DOMAINS_FILENAME "option-domains" #define OPTION_NTP_SERVERS_FILENAME "option-ntp-servers" #define OPTION_TIMEZONE_FILENAME "option-timezone" #define OPTION_SIP_SERVERS_FILENAME "option-sip-servers" #define OPTION_SIP_DOMAINS_FILENAME "option-sip-domains" #define OPTION_NIS_SERVERS_FILENAME "option-nis-servers" #define OPTION_NIS_DOMAIN_FILENAME "option-nis-domain" #define OPTION_NISP_SERVERS_FILENAME "option-nisplus-servers" #define OPTION_NISP_DOMAIN_FILENAME "option-nisplus-domain" /* --- bulk leasequery --- */ #define BULKLQ_ACCEPT false #define BULKLQ_TCP_PORT 547 #define BULKLQ_MAX_CONNS 10 #define BULKLQ_TIMEOUT 300 /* ********************************************************************** */ /* *** interface flags ************************************************** */ /* ********************************************************************** */ /* those flags are used to parse flags in the structure returned by if_list_get(). They are highly system specific. Posix systems use values imported from headers */ #ifdef WIN32 #define IFF_RUNNING IFF_UP /* those defines are in ws2ipdef.h #define IFF_UP 0x1 #define IFF_MULTICAST 0x4 #define IFF_LOOPBACK 0x8 */ #endif /* ********************************************************************** */ /* *** low-level error codes ******************************************** */ /* ********************************************************************** */ #define LOWLEVEL_NO_ERROR 0 #define LOWLEVEL_ERROR_UNSPEC -1 #define LOWLEVEL_ERROR_BIND_IFACE -2 #define LOWLEVEL_ERROR_BIND_FAILED -4 #define LOWLEVEL_ERROR_MCAST_HOPS -5 #define LOWLEVEL_ERROR_MCAST_MEMBERSHIP -6 #define LOWLEVEL_ERROR_GETADDRINFO -7 #define LOWLEVEL_ERROR_SOCK_OPTS -8 #define LOWLEVEL_ERROR_REUSE_FAILED -9 #define LOWLEVEL_ERROR_FILE -10 #define LOWLEVEL_ERROR_SOCKET -11 #define LOWLEVEL_ERROR_NOT_IMPLEMENTED -12 #define LOWLEVEL_TENTATIVE_YES 1 #define LOWLEVEL_TENTATIVE_NO 0 #define LOWLEVEL_TENTATIVE_DONT_KNOW -1 /* ********************************************************************** */ /* *** time related functions ******************************************* */ /* ********************************************************************** */ #ifdef WIN32 #define strncasecmp _strnicmp #include #include #include #endif /* ********************************************************************** */ /* *** interface/socket low level functions ***************************** */ /* ********************************************************************** */ #ifdef __cplusplus extern "C" { #endif int lowlevelInit(); int lowlevelExit(); /* get list of interfaces */ extern struct iface * if_list_get(); extern void if_list_release(struct iface * list); /* add address to interface */ extern int ipaddr_add(const char* ifacename, int ifindex, const char* addr, unsigned long pref, unsigned long valid, int prefixLength); extern int ipaddr_update(const char* ifacename, int ifindex, const char* addr, unsigned long pref, unsigned long valid, int prefixLength); extern int ipaddr_del(const char* ifacename, int ifindex, const char* addr, int prefixLength); /* add socket to interface */ extern int sock_add(char* ifacename,int ifaceid, char* addr, int port, int thisifaceonly, int reuse); extern int sock_del(int fd); extern int sock_send(int fd, char* addr, char* buf, int buflen, int port, int iface); extern int sock_recv(int fd, char* myPlainAddr, char* peerPlainAddr, char* buf, int buflen); /** @brief gets MAC address from the specified IPv6 address * * This is called immediately after we received message from that address, * so the neighbor cache is guaranteed to have entry for it. This is highly * os specific * * @param iface_name network interface name * @param ifindex network interface index * @param v6addr text represenation of the IPv6 address * @param mac pointer to MAC buffer (length specified in mac_len) * @param mac_len specifies MAC buffer length. Must be set so number of bytes set by the function * * @return 0 if successful, negative values if there are errors */ extern int get_mac_from_ipv6(const char* iface_name, int ifindex, const char* v6addr, char* mac, int* mac_len); /* pack/unpack address */ extern void print_packed(char addr[]); extern int inet_pton6(const char* src, char* dst); extern char * inet_ntop4(const char* src, char* dst); extern char * inet_ntop6(const char* src, char* dst); extern void print_packed(char * addr); extern void doRevDnsAddress( char * src, char *dst); extern void doRevDnsZoneRoot( char * src, char * dst, int lenght); extern void truncatePrefixFromConfig( char * src, char * dst, char lenght); extern int is_addr_tentative(char* ifacename, int iface, char* plainAddr); extern void link_state_change_init(volatile struct link_state_notify_t * changed_links, volatile int * notify); extern void link_state_change_cleanup(); extern void microsleep(int microsecs); extern char * error_message(); /* options */ extern int dns_add(const char* ifname, int ifindex, const char* addrPlain); extern int dns_del(const char* ifname, int ifindex, const char* addrPlain); extern int domain_add(const char* ifname, int ifindex, const char* domain); extern int domain_del(const char* ifname, int ifindex, const char* domain); extern int ntp_add(const char* ifname, int ifindex, const char* addrPlain); extern int ntp_del(const char* ifname, int ifindex, const char* addrPlain); extern int timezone_set(const char* ifname, int ifindex, const char* timezone); extern int timezone_del(const char* ifname, int ifindex, const char* timezone); extern int sipserver_add(const char* ifname, int ifindex, const char* addrPlain); extern int sipserver_del(const char* ifname, int ifindex, const char* addrPlain); extern int sipdomain_add(const char* ifname, int ifindex, const char* domain); extern int sipdomain_del(const char* ifname, int ifindex, const char* domain); extern int nisserver_add(const char* ifname, int ifindex, const char* addrPlain); extern int nisserver_del(const char* ifname, int ifindex, const char* addrPlain); extern int nisdomain_set(const char* ifname, int ifindex, const char* domain); extern int nisdomain_del(const char* ifname, int ifindex, const char* domain); extern int nisplusserver_add(const char* ifname, int ifindex, const char* addrPlain); extern int nisplusserver_del(const char* ifname, int ifindex, const char* addrPlain); extern int nisplusdomain_set(const char* ifname, int ifindex, const char* domain); extern int nisplusdomain_del(const char* ifname, int ifindex, const char* domain); extern int prefix_add(const char* ifname, int ifindex, const char* prefixPlain, int prefixLength, unsigned long prefered, unsigned long valid); extern int prefix_update(const char* ifname, int ifindex, const char* prefixPlain, int prefixLength, unsigned long prefered, unsigned long valid); extern int prefix_del(const char* ifname, int ifindex, const char* prefixPlain, int prefixLength); char * getAAAKey(uint32_t SPI, uint32_t *len); /* reads AAA key from a file */ char * getAAAKeyFilename(uint32_t SPI); /* which file? use this function to find out */ uint32_t getAAASPIfromFile(); int execute(const char *filename, const char * argv[], const char *env[]); /** @brief fills specified buffer with random data * @param buffer random data will be written here * @param len length of the buffer */ void fill_random(uint8_t* buffer, int len); /** @brief returns host name of this host * * @param hostname buffer (hostname will be stored here) * @param hostname_len length of the buffer * @return LOWLEVEL_NO_ERROR if successful, appropriate LOWLEVEL_ERROR_* otherwise */ int get_hostname(char* hostname, int hostname_len); #ifdef __cplusplus } #endif #ifdef LINUX #ifdef DEBUG void print_trace(void); #endif #endif #endif dibbler-1.0.1/Misc/lowlevel-posix.c0000644000175000017500000000445712277722750014112 00000000000000/* * Dibbler - a portable DHCPv6 * * author: Tomasz Mrugalski * * released under GNU GPL v2 licence * */ // We need this, so unistd.h include gethostname() definition #define _BSD_SOURCE #include #include #include #include #include #include "Portable.h" int execute(const char *filename, const char * argv[], const char *env[]) { #ifdef LOWLEVEL_DEBUG char ** x = argv; printf("Execute script: %s\n", filename); while (*x) { printf("Param: %s\n", *x); ++x; } x = env; while (*x) { printf("env: %s\n", *x); ++x; } #endif pid_t pid; int status = 0; pid = fork(); if (!pid) { int result = execve(filename, (char * const *)argv, (char * const *)env); result = errno; /* printf("#### Error during attempt to execute %s script: %s\n", filename, strerror(result)); */ /* errors only. if execution succeeds, this process is replaced by instance of filename */ if (result>0) { result = -result; } exit(-1); } else { /* printf("#### before waitpid() pid=%d status=%d\n", pid, status); */ waitpid(pid, &status, 0); /* printf("#### after waitpid() pid=%d status=%d\n", pid, status); */ if (WIFEXITED(status)) return WEXITSTATUS(status); else return LOWLEVEL_ERROR_UNSPEC; } } /** @brief returns host name of this host * * @param hostname buffer (hostname will be stored here) * @param hostname_len length of the buffer * @return LOWLEVEL_NO_ERROR if successful, appropriate LOWLEVEL_ERROR_* otherwise */ int get_hostname(char* hostname, int hostname_len) { int status = gethostname(hostname, hostname_len); if (status == 0) { return LOWLEVEL_NO_ERROR; } else { return LOWLEVEL_ERROR_UNSPEC; } } uint32_t getAAASPIfromFile() { uint32_t ret; FILE *file; file = fopen(CLNT_AAASPI_FILE, "r"); if (!file) { return 0; } if (fscanf(file, "%10x", &ret) <= 0) { ret = 0; } fclose(file); return ret; } void fill_random(uint8_t* buffer, int len) { // @todo: put some better randomness here for (int i = 0; i < len; i++) { buffer[i] = random()%256; } } dibbler-1.0.1/Misc/DHCPConst.cpp0000644000175000017500000001273612304040124013160 00000000000000/* * Dibbler - a portable DHCPv6 * * authors: Tomasz Mrugalski * Marek Senderski * changes: Michal Kowalczuk * * released under GNU GPL v2 only licence * */ #include "DHCPConst.h" #include "Logger.h" #include "SmartPtr.h" #include "hex.h" // standard options specified in RFC3315, pg. 99 bool OptInMsg[13][20] = { // Client Server IA_NA IA_TA IAAddr Option Pref Elap Relay Empty Auth. Server Status Rap. User Vendor Vendor Inter. Recon. Recon. // ID ID Request Time Msg. Empty Unica. Code Comm. Class Class Spec. ID Msg. Accept /*Solicit */ {true, false, true, true, false, true, false, true, false, false,true, false, false, true, true, true, true, false, false,true }, /*Advertise*/{true, true , true, true, false, false,true , false,false, false,true, true, true , false,true, true, true, false, false,true }, /*Request*/ {true, true , true, true, false, true, false, true, false, false,true, false, false, false,true, true, true, false, false,true }, /*Confirm*/ {true, false, true, true, false, true, false, true, false, false,true, false, false, false,true, true, true, false, false,false}, /*Renew*/ {true, true , true, true, false, true, false, true, false, false,true, false, false, false,true, true, true, false, false, true}, /*Rebind*/ {true, false, true, true, false, true, false, true, false, false,true, false, false, false,true, true, true, false, false, true}, /*Reply*/ {true, true , true, true, false, false,true, false,false, false,true, true, true , true ,true, true, true, false, false,true }, /*Release*/ {true, true , true, true, false, true, false, true, false, false,true, false, false, false,true, true, true, false, false,false}, /*Decline*/ {true, true , true, true, false, true, false, true, false, false,true, false, false, false,true, true, true, false, false,false}, /*Reconf.*/ {true, true , false, false,false, true, false, false,false, false,true, false, false, false,false,false, false,false, true ,false}, /*Inform.*/ {true, true, false, false,false, true ,false, true, false, false,true, false, false, false,true, true, true, false, false,true}, /*R-forw.*/ {false, false, false, false,false, false,false, false,true, false,true, false, false, false,true, true, true, true , false,false}, /*R-repl.*/ {false, false, false, false,false, false,false, false,true, false,true, false, false, false,true, true, true, true , false,false}, }; int allowOptInMsg(int msg, int opt) { // standard options specified in RFC3315 if (msg>13) return 1; // allow everthing in new messages if (opt <=20) { return OptInMsg[msg-1][opt-1]; } // additional options: allow them return 1; } /* Appearance of Options in the Options Field of DHCP Options Option IA_NA/ IAADDR Relay Relay Field IA_TA Forw. Reply 1 Client ID * 2 Server ID * 3 IA_NA * 4 IA_TA * 5 IAADDR * 6 ORO * 7 Preference * 8 Elapsed Time * 9 Relay Message * * 11 Authentic. * 12 Server Uni. * 13 Status Code * * * 14 Rapid Comm. * 15 User Class * 16 Vendor Class * 17 Vendor Info. * 18 Interf. ID * * 19 Reconf. MSG. * 20 Reconf. Accept * */ int allowOptInOpt(int msgType, int parent, int subopt) { // additional options (not specified in RFC3315) if (subopt>20) return 1; if ((msgType==RELAY_FORW_MSG)||(msgType==RELAY_REPL_MSG)) { if ( (subopt==OPTION_INTERFACE_ID) || (subopt=OPTION_RELAY_MSG)) return 1; return 0; } switch (parent) { case 0: //Option Field if ((subopt!=OPTION_IAADDR)&& (subopt!=OPTION_RELAY_MSG)&& (subopt!=OPTION_INTERFACE_ID)) return 1; break; case OPTION_IA_NA: case OPTION_IA_TA: if ((subopt==OPTION_IAADDR)||(subopt==OPTION_STATUS_CODE)) return 1; break; case OPTION_IAADDR: if (subopt==OPTION_STATUS_CODE) return 1; if (subopt==OPTION_ADDRPARAMS) return 1; break; case OPTION_IA_PD: if ( (subopt==OPTION_IAPREFIX) || (subopt==OPTION_STATUS_CODE)) return 1; case OPTION_LQ_QUERY: if ( (subopt == OPTION_IAADDR) || (subopt==OPTION_CLIENTID) ) return 1; } return 0; } unsigned DIGESTSIZE[] = { 0, //NONE 32, //PLAIN 16, //HMAC-MD5 20, //HMAC-SHA1 28, //HMAC-SHA224 32, //HMAC-SHA256 48, //HMAC-SHA384 64, //HMAC-SHA512 0 //_END_ }; char *DIGESTNAME[] = { (char *)"NONE", (char *)"PLAIN", (char *)"HMAC-MD5", (char *)"HMAC-SHA-1", (char *)"HMAC-SHA-224", (char *)"HMAC-SHA-256", (char *)"HMAC-SHA-384", (char *)"HMAC-SHA-512", (char *)"" //_END_ }; unsigned getDigestSize(enum DigestTypes type) { if (type >= DIGEST_INVALID) { Log(Error) << "Invalid digest type: " << type << LogEnd; return 0; } return DIGESTSIZE[type]; } char *getDigestName(enum DigestTypes type) { return DIGESTNAME[type]; } void PrintHex(const std::string& message, const uint8_t *buffer, unsigned len) { Log(Debug) << message << hexToText(buffer, len, false, false) << LogEnd; } dibbler-1.0.1/Misc/sha512.c0000664000175000017500000003415212233256142012106 00000000000000/* sha512.c - Functions to compute SHA512 and SHA384 message digest of files or memory blocks according to the NIST specification FIPS-180-2. Copyright (C) 2005, 2006 Free Software Foundation, Inc. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ /* Written by David Madore, considerably copypasting from Scott G. Miller's sha1.c */ /* This file is taken from coreutils-6.2 (lib/sha512.c) and adapted for dibbler * by Michal Kowalczuk */ #include "sha512.h" #include #include #if USE_UNLOCKED_IO # include "unlocked-io.h" #endif #ifdef WORDS_BIGENDIAN # define SWAP(n) (n) #else # define SWAP(n) \ (((n) << 56) | (((n) & 0xff00) << 40) | (((n) & 0xff0000UL) << 24) \ | (((n) & 0xff000000UL) << 8) | (((n) >> 8) & 0xff000000UL) \ | (((n) >> 24) & 0xff0000UL) | (((n) >> 40) & 0xff00UL) | ((n) >> 56)) #endif #define BLOCKSIZE 4096 #if BLOCKSIZE % 128 != 0 # error "invalid BLOCKSIZE" #endif /* This array contains the bytes used to pad the buffer to the next 128-byte boundary. */ static const unsigned char fillbuf[128] = { 0x80, 0 /* , 0, 0, ... */ }; /* Takes a pointer to a 512 bit block of data (eight 64 bit ints) and intializes it to the start constants of the SHA512 algorithm. This must be called before using hash in the call to sha512_hash */ void sha512_init_ctx (struct sha512_ctx *ctx) { ctx->state[0] = 0x6a09e667f3bcc908ULL; ctx->state[1] = 0xbb67ae8584caa73bULL; ctx->state[2] = 0x3c6ef372fe94f82bULL; ctx->state[3] = 0xa54ff53a5f1d36f1ULL; ctx->state[4] = 0x510e527fade682d1ULL; ctx->state[5] = 0x9b05688c2b3e6c1fULL; ctx->state[6] = 0x1f83d9abfb41bd6bULL; ctx->state[7] = 0x5be0cd19137e2179ULL; ctx->total[0] = ctx->total[1] = 0; ctx->buflen = 0; } void sha384_init_ctx (struct sha512_ctx *ctx) { ctx->state[0] = 0xcbbb9d5dc1059ed8ULL; ctx->state[1] = 0x629a292a367cd507ULL; ctx->state[2] = 0x9159015a3070dd17ULL; ctx->state[3] = 0x152fecd8f70e5939ULL; ctx->state[4] = 0x67332667ffc00b31ULL; ctx->state[5] = 0x8eb44a8768581511ULL; ctx->state[6] = 0xdb0c2e0d64f98fa7ULL; ctx->state[7] = 0x47b5481dbefa4fa4ULL; ctx->total[0] = ctx->total[1] = 0; ctx->buflen = 0; } /* Put result from CTX in first 64 bytes following RESBUF. The result must be in little endian byte order. IMPORTANT: On some systems it is required that RESBUF is correctly aligned for a 64-bit value. */ void * sha512_read_ctx (const struct sha512_ctx *ctx, void *resbuf) { int i; for (i = 0; i < 8; i++) ((uint64_t *) resbuf)[i] = SWAP (ctx->state[i]); return resbuf; } void * sha384_read_ctx (const struct sha512_ctx *ctx, void *resbuf) { int i; for (i = 0; i < 6; i++) ((uint64_t *) resbuf)[i] = SWAP (ctx->state[i]); return resbuf; } /* Process the remaining bytes in the internal buffer and the usual prolog according to the standard and write the result to RESBUF. IMPORTANT: On some systems it is required that RESBUF is correctly aligned for a 64-bit value. */ static void sha512_conclude_ctx (struct sha512_ctx *ctx) { /* Take yet unprocessed bytes into account. */ uint64_t bytes = ctx->buflen; size_t size = (bytes < 112) ? 128 / 8 : 128 * 2 / 8; /* Now count remaining bytes. */ ctx->total[0] += bytes; if (ctx->total[0] < bytes) ++ctx->total[1]; /* Put the 64-bit file length in *bits* at the end of the buffer. */ ctx->buffer[size - 2] = SWAP ((ctx->total[1] << 3) | (ctx->total[0] >> 61)); ctx->buffer[size - 1] = SWAP (ctx->total[0] << 3); memcpy (&((char *) ctx->buffer)[bytes], fillbuf, (size - 2) * 8 - bytes); /* Process last bytes. */ sha512_process_block (ctx->buffer, size * 8, ctx); } void * sha512_finish_ctx (struct sha512_ctx *ctx, void *resbuf) { sha512_conclude_ctx (ctx); return sha512_read_ctx (ctx, resbuf); } void * sha384_finish_ctx (struct sha512_ctx *ctx, void *resbuf) { sha512_conclude_ctx (ctx); return sha384_read_ctx (ctx, resbuf); } void sha512_process_bytes (const void *buffer, size_t len, struct sha512_ctx *ctx) { /* When we already have some bits in our internal buffer concatenate both inputs first. */ if (ctx->buflen != 0) { size_t left_over = ctx->buflen; size_t add = 256 - left_over > len ? len : 256 - left_over; memcpy (&((char *) ctx->buffer)[left_over], buffer, add); ctx->buflen += add; if (ctx->buflen > 128) { sha512_process_block (ctx->buffer, ctx->buflen & ~63, ctx); ctx->buflen &= 127; /* The regions in the following copy operation cannot overlap. */ memcpy (ctx->buffer, &((char *) ctx->buffer)[(left_over + add) & ~127], ctx->buflen); } buffer = (const char *) buffer + add; len -= add; } /* Process available complete blocks. */ if (len >= 128) { #if !_STRING_ARCH_unaligned # define alignof(type) offsetof (struct { char c; type x; }, x) # define UNALIGNED_P(p) (((size_t) p) % alignof (uint64_t) != 0) if (UNALIGNED_P (buffer)) while (len > 128) { sha512_process_block (memcpy (ctx->buffer, buffer, 128), 128, ctx); buffer = (const char *) buffer + 128; len -= 128; } else #endif { sha512_process_block (buffer, len & ~127, ctx); buffer = (const char *) buffer + (len & ~127); len &= 127; } } /* Move remaining bytes in internal buffer. */ if (len > 0) { size_t left_over = ctx->buflen; memcpy (&((char *) ctx->buffer)[left_over], buffer, len); left_over += len; if (left_over >= 128) { sha512_process_block (ctx->buffer, 128, ctx); left_over -= 128; memcpy (ctx->buffer, &ctx->buffer[16], left_over); } ctx->buflen = left_over; } } /* --- Code below is the primary difference between sha1.c and sha512.c --- */ /* SHA512 round constants */ #define K(I) sha512_round_constants[I] static const uint64_t sha512_round_constants[80] = { 0x428a2f98d728ae22ULL, 0x7137449123ef65cdULL, 0xb5c0fbcfec4d3b2fULL, 0xe9b5dba58189dbbcULL, 0x3956c25bf348b538ULL, 0x59f111f1b605d019ULL, 0x923f82a4af194f9bULL, 0xab1c5ed5da6d8118ULL, 0xd807aa98a3030242ULL, 0x12835b0145706fbeULL, 0x243185be4ee4b28cULL, 0x550c7dc3d5ffb4e2ULL, 0x72be5d74f27b896fULL, 0x80deb1fe3b1696b1ULL, 0x9bdc06a725c71235ULL, 0xc19bf174cf692694ULL, 0xe49b69c19ef14ad2ULL, 0xefbe4786384f25e3ULL, 0x0fc19dc68b8cd5b5ULL, 0x240ca1cc77ac9c65ULL, 0x2de92c6f592b0275ULL, 0x4a7484aa6ea6e483ULL, 0x5cb0a9dcbd41fbd4ULL, 0x76f988da831153b5ULL, 0x983e5152ee66dfabULL, 0xa831c66d2db43210ULL, 0xb00327c898fb213fULL, 0xbf597fc7beef0ee4ULL, 0xc6e00bf33da88fc2ULL, 0xd5a79147930aa725ULL, 0x06ca6351e003826fULL, 0x142929670a0e6e70ULL, 0x27b70a8546d22ffcULL, 0x2e1b21385c26c926ULL, 0x4d2c6dfc5ac42aedULL, 0x53380d139d95b3dfULL, 0x650a73548baf63deULL, 0x766a0abb3c77b2a8ULL, 0x81c2c92e47edaee6ULL, 0x92722c851482353bULL, 0xa2bfe8a14cf10364ULL, 0xa81a664bbc423001ULL, 0xc24b8b70d0f89791ULL, 0xc76c51a30654be30ULL, 0xd192e819d6ef5218ULL, 0xd69906245565a910ULL, 0xf40e35855771202aULL, 0x106aa07032bbd1b8ULL, 0x19a4c116b8d2d0c8ULL, 0x1e376c085141ab53ULL, 0x2748774cdf8eeb99ULL, 0x34b0bcb5e19b48a8ULL, 0x391c0cb3c5c95a63ULL, 0x4ed8aa4ae3418acbULL, 0x5b9cca4f7763e373ULL, 0x682e6ff3d6b2b8a3ULL, 0x748f82ee5defb2fcULL, 0x78a5636f43172f60ULL, 0x84c87814a1f0ab72ULL, 0x8cc702081a6439ecULL, 0x90befffa23631e28ULL, 0xa4506cebde82bde9ULL, 0xbef9a3f7b2c67915ULL, 0xc67178f2e372532bULL, 0xca273eceea26619cULL, 0xd186b8c721c0c207ULL, 0xeada7dd6cde0eb1eULL, 0xf57d4f7fee6ed178ULL, 0x06f067aa72176fbaULL, 0x0a637dc5a2c898a6ULL, 0x113f9804bef90daeULL, 0x1b710b35131c471bULL, 0x28db77f523047d84ULL, 0x32caab7b40c72493ULL, 0x3c9ebe0a15c9bebcULL, 0x431d67c49c100d4cULL, 0x4cc5d4becb3e42b6ULL, 0x597f299cfc657e2aULL, 0x5fcb6fab3ad6faecULL, 0x6c44198c4a475817ULL, }; /* Round functions. */ #define F2(A,B,C) ( ( A & B ) | ( C & ( A | B ) ) ) #define F1(E,F,G) ( G ^ ( E & ( F ^ G ) ) ) /* Process LEN bytes of BUFFER, accumulating context into CTX. It is assumed that LEN % 128 == 0. Most of this code comes from GnuPG's cipher/sha1.c. */ void sha512_process_block (const void *buffer, size_t len, struct sha512_ctx *ctx) { const uint64_t *words = buffer; size_t nwords = len / sizeof (uint64_t); const uint64_t *endp = words + nwords; uint64_t x[16]; uint64_t a = ctx->state[0]; uint64_t b = ctx->state[1]; uint64_t c = ctx->state[2]; uint64_t d = ctx->state[3]; uint64_t e = ctx->state[4]; uint64_t f = ctx->state[5]; uint64_t g = ctx->state[6]; uint64_t h = ctx->state[7]; /* First increment the byte count. FIPS PUB 180-2 specifies the possible length of the file up to 2^128 bits. Here we only compute the number of bytes. Do a double word increment. */ ctx->total[0] += len; if (ctx->total[0] < len) ++ctx->total[1]; #define S0(x) (rol64(x,63)^rol64(x,56)^(x>>7)) #define S1(x) (rol64(x,45)^rol64(x,3)^(x>>6)) #define SS0(x) (rol64(x,36)^rol64(x,30)^rol64(x,25)) #define SS1(x) (rol64(x,50)^rol64(x,46)^rol64(x,23)) #define M(I) ( tm = S1(x[(I-2)&0x0f]) + x[(I-7)&0x0f] \ + S0(x[(I-15)&0x0f]) + x[I&0x0f] \ , x[I&0x0f] = tm ) #define R(A,B,C,D,E,F,G,H,K,M) do { t0 = SS0(A) + F2(A,B,C); \ t1 = H + SS1(E) \ + F1(E,F,G) \ + K \ + M; \ D += t1; H = t0 + t1; \ } while(0) while (words < endp) { uint64_t tm; uint64_t t0, t1; int t; /** @todo: see sha1.c for a better implementation. */ for (t = 0; t < 16; t++) { x[t] = SWAP (*words); words++; } R( a, b, c, d, e, f, g, h, K( 0), x[ 0] ); R( h, a, b, c, d, e, f, g, K( 1), x[ 1] ); R( g, h, a, b, c, d, e, f, K( 2), x[ 2] ); R( f, g, h, a, b, c, d, e, K( 3), x[ 3] ); R( e, f, g, h, a, b, c, d, K( 4), x[ 4] ); R( d, e, f, g, h, a, b, c, K( 5), x[ 5] ); R( c, d, e, f, g, h, a, b, K( 6), x[ 6] ); R( b, c, d, e, f, g, h, a, K( 7), x[ 7] ); R( a, b, c, d, e, f, g, h, K( 8), x[ 8] ); R( h, a, b, c, d, e, f, g, K( 9), x[ 9] ); R( g, h, a, b, c, d, e, f, K(10), x[10] ); R( f, g, h, a, b, c, d, e, K(11), x[11] ); R( e, f, g, h, a, b, c, d, K(12), x[12] ); R( d, e, f, g, h, a, b, c, K(13), x[13] ); R( c, d, e, f, g, h, a, b, K(14), x[14] ); R( b, c, d, e, f, g, h, a, K(15), x[15] ); R( a, b, c, d, e, f, g, h, K(16), M(16) ); R( h, a, b, c, d, e, f, g, K(17), M(17) ); R( g, h, a, b, c, d, e, f, K(18), M(18) ); R( f, g, h, a, b, c, d, e, K(19), M(19) ); R( e, f, g, h, a, b, c, d, K(20), M(20) ); R( d, e, f, g, h, a, b, c, K(21), M(21) ); R( c, d, e, f, g, h, a, b, K(22), M(22) ); R( b, c, d, e, f, g, h, a, K(23), M(23) ); R( a, b, c, d, e, f, g, h, K(24), M(24) ); R( h, a, b, c, d, e, f, g, K(25), M(25) ); R( g, h, a, b, c, d, e, f, K(26), M(26) ); R( f, g, h, a, b, c, d, e, K(27), M(27) ); R( e, f, g, h, a, b, c, d, K(28), M(28) ); R( d, e, f, g, h, a, b, c, K(29), M(29) ); R( c, d, e, f, g, h, a, b, K(30), M(30) ); R( b, c, d, e, f, g, h, a, K(31), M(31) ); R( a, b, c, d, e, f, g, h, K(32), M(32) ); R( h, a, b, c, d, e, f, g, K(33), M(33) ); R( g, h, a, b, c, d, e, f, K(34), M(34) ); R( f, g, h, a, b, c, d, e, K(35), M(35) ); R( e, f, g, h, a, b, c, d, K(36), M(36) ); R( d, e, f, g, h, a, b, c, K(37), M(37) ); R( c, d, e, f, g, h, a, b, K(38), M(38) ); R( b, c, d, e, f, g, h, a, K(39), M(39) ); R( a, b, c, d, e, f, g, h, K(40), M(40) ); R( h, a, b, c, d, e, f, g, K(41), M(41) ); R( g, h, a, b, c, d, e, f, K(42), M(42) ); R( f, g, h, a, b, c, d, e, K(43), M(43) ); R( e, f, g, h, a, b, c, d, K(44), M(44) ); R( d, e, f, g, h, a, b, c, K(45), M(45) ); R( c, d, e, f, g, h, a, b, K(46), M(46) ); R( b, c, d, e, f, g, h, a, K(47), M(47) ); R( a, b, c, d, e, f, g, h, K(48), M(48) ); R( h, a, b, c, d, e, f, g, K(49), M(49) ); R( g, h, a, b, c, d, e, f, K(50), M(50) ); R( f, g, h, a, b, c, d, e, K(51), M(51) ); R( e, f, g, h, a, b, c, d, K(52), M(52) ); R( d, e, f, g, h, a, b, c, K(53), M(53) ); R( c, d, e, f, g, h, a, b, K(54), M(54) ); R( b, c, d, e, f, g, h, a, K(55), M(55) ); R( a, b, c, d, e, f, g, h, K(56), M(56) ); R( h, a, b, c, d, e, f, g, K(57), M(57) ); R( g, h, a, b, c, d, e, f, K(58), M(58) ); R( f, g, h, a, b, c, d, e, K(59), M(59) ); R( e, f, g, h, a, b, c, d, K(60), M(60) ); R( d, e, f, g, h, a, b, c, K(61), M(61) ); R( c, d, e, f, g, h, a, b, K(62), M(62) ); R( b, c, d, e, f, g, h, a, K(63), M(63) ); R( a, b, c, d, e, f, g, h, K(64), M(64) ); R( h, a, b, c, d, e, f, g, K(65), M(65) ); R( g, h, a, b, c, d, e, f, K(66), M(66) ); R( f, g, h, a, b, c, d, e, K(67), M(67) ); R( e, f, g, h, a, b, c, d, K(68), M(68) ); R( d, e, f, g, h, a, b, c, K(69), M(69) ); R( c, d, e, f, g, h, a, b, K(70), M(70) ); R( b, c, d, e, f, g, h, a, K(71), M(71) ); R( a, b, c, d, e, f, g, h, K(72), M(72) ); R( h, a, b, c, d, e, f, g, K(73), M(73) ); R( g, h, a, b, c, d, e, f, K(74), M(74) ); R( f, g, h, a, b, c, d, e, K(75), M(75) ); R( e, f, g, h, a, b, c, d, K(76), M(76) ); R( d, e, f, g, h, a, b, c, K(77), M(77) ); R( c, d, e, f, g, h, a, b, K(78), M(78) ); R( b, c, d, e, f, g, h, a, K(79), M(79) ); a = ctx->state[0] += a; b = ctx->state[1] += b; c = ctx->state[2] += c; d = ctx->state[3] += d; e = ctx->state[4] += e; f = ctx->state[5] += f; g = ctx->state[6] += g; h = ctx->state[7] += h; } } dibbler-1.0.1/Misc/DHCPRelay.cpp0000664000175000017500000000604612413230313013147 00000000000000/* * Dibbler - a portable DHCPv6 * * authors: Tomasz Mrugalski * Marek Senderski * * released under GNU GPL v2 licence * */ #include #include "DHCPRelay.h" #include "Logger.h" #include "Portable.h" #include "RelIfaceMgr.h" #include "RelCfgMgr.h" #include "RelTransMgr.h" #include "RelMsg.h" using namespace std; volatile int serviceShutdown; TDHCPRelay::TDHCPRelay(const std::string& config) { serviceShutdown = 0; srand((uint32_t)time(NULL)); IsDone = false; TRelIfaceMgr::instanceCreate(RELIFACEMGR_FILE); if ( RelIfaceMgr().isDone() ) { Log(Crit) << "Fatal error during IfaceMgr initialization." << LogEnd; this->IsDone = true; return; } RelIfaceMgr().dump(); TRelCfgMgr::instanceCreate(config, RELCFGMGR_FILE); if ( RelCfgMgr().isDone() ) { Log(Crit) << "Fatal error during CfgMgr initialization." << LogEnd; this->IsDone = true; return; } RelCfgMgr().dump(); TRelTransMgr::instanceCreate(RELTRANSMGR_FILE); if ( RelTransMgr().isDone() ) { Log(Crit) << "Fatal error during TransMgr initialization." << LogEnd; this->IsDone = true; return; } RelIfaceMgr().dump(); RelTransMgr().dump(); } void TDHCPRelay::run() { bool silent = false; while ( (!isDone()) && (!RelTransMgr().isDone()) ) { if (serviceShutdown) RelTransMgr().shutdown(); RelTransMgr().doDuties(); unsigned int timeout = DHCPV6_INFINITY/2; if (serviceShutdown) timeout = 0; if (!silent) Log(Debug) << "Accepting messages." << LogEnd; #ifdef WIN32 // There's no easy way to break select, so just don't sleep for too long. if (timeout>5) { silent = true; timeout = 5; } #endif SPtr msg = RelIfaceMgr().select(timeout); if (!msg) continue; silent = false; int iface = msg->getIface(); SPtr ptrIface; ptrIface = RelIfaceMgr().getIfaceByID(iface); Log(Notice) << "Received " << msg->getName() << " on " << ptrIface->getName() << "/" << iface; if (msg->getType()!=RELAY_FORW_MSG && msg->getType()!=RELAY_REPL_MSG) Log(Cont) << hex << ",trans-id=0x" << msg->getTransID() << dec; Log(Cont) << ", " << msg->countOption() << " opts:"; SPtr ptrOpt; msg->firstOption(); while ( ptrOpt = msg->getOption() ) { Log(Cont) << " " << ptrOpt->getOptType(); // uncomment this to get detailed info about option lengths Log(Cont) << "/" << ptrOpt->getSize(); } // Log(Cont) << ", " << msg->getRelayCount() << " relay(s)."; Log(Cont) << LogEnd; RelTransMgr().relayMsg(msg); } Log(Notice) << "Bye bye." << LogEnd; } bool TDHCPRelay::isDone() { return this->IsDone; } bool TDHCPRelay::checkPrivileges() { /// @todo: check privileges return true; } void TDHCPRelay::stop() { serviceShutdown = 1; Log(Crit) << "Service SHUTDOWN." << LogEnd; } void TDHCPRelay::setWorkdir(std::string workdir) { RelCfgMgr().setWorkdir(workdir); RelCfgMgr().dump(); } TDHCPRelay::~TDHCPRelay() { } dibbler-1.0.1/Misc/hmac-sha-md5.h0000644000175000017500000000070012277722750013255 00000000000000/* * Dibbler - a portable DHCPv6 * * authors: Michal Kowalczuk * changes: Tomasz Mrugalski * * Released under GNU GPL v2 licence * */ #ifdef __cplusplus extern "C" { #endif void *hmac_sha (const char *buffer, size_t len, char *key, size_t key_len, char *resbuf, int type); void *hmac_md5 (const char *buffer, size_t len, char *key, size_t key_len, char *resbuf); #ifdef __cplusplus } #endif dibbler-1.0.1/Misc/Key.h0000644000175000017500000000130312277722750011641 00000000000000/* * Dibbler - a portable DHCPv6 * * author: Tomasz Mrugalski * * released under GNU GPL v2 licence */ #ifndef KEY_H #define KEY_H #include #include "SmartPtr.h" #include "DHCPConst.h" #include "Portable.h" typedef std::vector TKey; class TSIGKey { public: TSIGKey(const std::string& name); std::string getAlgorithmText(); bool setData(const std::string& base64encoded); std::string getPackedData(); std::string getBase64Data(); DigestTypes Digest_; std::string Name_; uint16_t Fudge_; protected: std::string Data_; std::string Base64Data_; }; typedef std::vector< SPtr > TSIGKeyList; #endif /* KEY_H */ dibbler-1.0.1/Misc/Makefile.am0000644000175000017500000000161512277722750013002 00000000000000SUBDIRS = . if HAVE_GTEST SUBDIRS += tests endif noinst_LIBRARIES = libMisc.a libMisc_a_CFLAGS = -std=c99 libMisc_a_CPPFLAGS = -I$(top_srcdir) libMisc_a_SOURCES = addrpack.c libMisc_a_SOURCES += base64.c base64.h libMisc_a_SOURCES += SmartPtr.h Container.h libMisc_a_SOURCES += hex.cpp hex.h libMisc_a_SOURCES += DHCPConst.cpp DHCPConst.h DHCPDefaults.h libMisc_a_SOURCES += DUID.cpp DUID.h libMisc_a_SOURCES += FQDN.cpp FQDN.h libMisc_a_SOURCES += IPv6Addr.cpp IPv6Addr.h libMisc_a_SOURCES += KeyList.cpp KeyList.h Key.cpp Key.h libMisc_a_SOURCES += Logger.cpp Logger.h libMisc_a_SOURCES += long128.cpp long128.h libMisc_a_SOURCES += Portable.h libMisc_a_SOURCES += ScriptParams.cpp ScriptParams.h libMisc_a_SOURCES += lowlevel-posix.c libMisc_a_SOURCES += hmac-sha-md5.h hmac-sha-md5.c libMisc_a_SOURCES += md5-coreutils.c md5.h libMisc_a_SOURCES += sha1.c sha1.h sha256.c sha256.h sha512.c sha512.hdibbler-1.0.1/Misc/md5-coreutils.c0000644000175000017500000002670212277722750013612 00000000000000/* Functions to compute MD5 message digest of files or memory blocks. according to the definition of MD5 in RFC 1321 from April 1992. Copyright (C) 1995,1996,1997,1999,2000,2001,2005,2006 Free Software Foundation, Inc. This file is part of the GNU C Library. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ /* Written by Ulrich Drepper , 1995. */ /* This file is taken from coreutils-6.2 (lib/md5.c) and adapted for dibbler * by Michal Kowalczuk */ #include "md5.h" #include #include #include #include #ifdef _LIBC # include # if __BYTE_ORDER == __BIG_ENDIAN # define WORDS_BIGENDIAN 1 # endif /* We need to keep the namespace clean so define the MD5 function protected using leading __ . */ # define md5_init_ctx __md5_init_ctx # define md5_process_block __md5_process_block # define md5_process_bytes __md5_process_bytes # define md5_finish_ctx __md5_finish_ctx # define md5_read_ctx __md5_read_ctx # define md5_stream __md5_stream # define md5_buffer __md5_buffer #endif #ifdef WORDS_BIGENDIAN # define SWAP(n) \ (((n) << 24) | (((n) & 0xff00) << 8) | (((n) >> 8) & 0xff00) | ((n) >> 24)) #else # define SWAP(n) (n) #endif #define BLOCKSIZE 4096 #if BLOCKSIZE % 64 != 0 # error "invalid BLOCKSIZE" #endif /* This array contains the bytes used to pad the buffer to the next 64-byte boundary. (RFC 1321, 3.1: Step 1) */ static const unsigned char fillbuf[64] = { 0x80, 0 /* , 0, 0, ... */ }; /* Initialize structure containing state of computation. (RFC 1321, 3.3: Step 3) */ void md5_init_ctx (struct md5_ctx *ctx) { ctx->A = 0x67452301; ctx->B = 0xefcdab89; ctx->C = 0x98badcfe; ctx->D = 0x10325476; ctx->total[0] = ctx->total[1] = 0; ctx->buflen = 0; } /* Put result from CTX in first 16 bytes following RESBUF. The result must be in little endian byte order. IMPORTANT: On some systems it is required that RESBUF is correctly aligned for a 32-bit value. */ void * md5_read_ctx (const struct md5_ctx *ctx, void *resbuf) { ((uint32_t *) resbuf)[0] = SWAP (ctx->A); ((uint32_t *) resbuf)[1] = SWAP (ctx->B); ((uint32_t *) resbuf)[2] = SWAP (ctx->C); ((uint32_t *) resbuf)[3] = SWAP (ctx->D); return resbuf; } /* Process the remaining bytes in the internal buffer and the usual prolog according to the standard and write the result to RESBUF. IMPORTANT: On some systems it is required that RESBUF is correctly aligned for a 32-bit value. */ void * md5_finish_ctx (struct md5_ctx *ctx, void *resbuf) { /* Take yet unprocessed bytes into account. */ uint32_t bytes = ctx->buflen; size_t size = (bytes < 56) ? 64 / 4 : 64 * 2 / 4; /* Now count remaining bytes. */ ctx->total[0] += bytes; if (ctx->total[0] < bytes) ++ctx->total[1]; /* Put the 64-bit file length in *bits* at the end of the buffer. */ ctx->buffer[size - 2] = SWAP (ctx->total[0] << 3); ctx->buffer[size - 1] = SWAP ((ctx->total[1] << 3) | (ctx->total[0] >> 29)); memcpy (&((char *) ctx->buffer)[bytes], fillbuf, (size - 2) * 4 - bytes); /* Process last bytes. */ md5_process_block (ctx->buffer, size * 4, ctx); return md5_read_ctx (ctx, resbuf); } void md5_process_bytes (const void *buffer, size_t len, struct md5_ctx *ctx) { /* When we already have some bits in our internal buffer concatenate both inputs first. */ if (ctx->buflen != 0) { size_t left_over = ctx->buflen; size_t add = 128 - left_over > len ? len : 128 - left_over; memcpy (&((char *) ctx->buffer)[left_over], buffer, add); ctx->buflen += add; if (ctx->buflen > 64) { md5_process_block (ctx->buffer, ctx->buflen & ~63, ctx); ctx->buflen &= 63; /* The regions in the following copy operation cannot overlap. */ memcpy (ctx->buffer, &((char *) ctx->buffer)[(left_over + add) & ~63], ctx->buflen); } buffer = (const char *) buffer + add; len -= add; } /* Process available complete blocks. */ if (len >= 64) { #if !_STRING_ARCH_unaligned # define alignof(type) offsetof (struct { char c; type x; }, x) # define UNALIGNED_P(p) (((size_t) p) % alignof (uint32_t) != 0) if (UNALIGNED_P (buffer)) while (len > 64) { md5_process_block (memcpy (ctx->buffer, buffer, 64), 64, ctx); buffer = (const char *) buffer + 64; len -= 64; } else #endif { md5_process_block (buffer, len & ~63, ctx); buffer = (const char *) buffer + (len & ~63); len &= 63; } } /* Move remaining bytes in internal buffer. */ if (len > 0) { size_t left_over = ctx->buflen; memcpy (&((char *) ctx->buffer)[left_over], buffer, len); left_over += len; if (left_over >= 64) { md5_process_block (ctx->buffer, 64, ctx); left_over -= 64; memcpy (ctx->buffer, &ctx->buffer[16], left_over); } ctx->buflen = left_over; } } /* These are the four functions used in the four steps of the MD5 algorithm and defined in the RFC 1321. The first function is a little bit optimized (as found in Colin Plumbs public domain implementation). */ /* #define FF(b, c, d) ((b & c) | (~b & d)) */ #define FF(b, c, d) (d ^ (b & (c ^ d))) #define FG(b, c, d) FF (d, b, c) #define FH(b, c, d) (b ^ c ^ d) #define FI(b, c, d) (c ^ (b | ~d)) /* Process LEN bytes of BUFFER, accumulating context into CTX. It is assumed that LEN % 64 == 0. */ void md5_process_block (const void *buffer, size_t len, struct md5_ctx *ctx) { uint32_t correct_words[16]; const uint32_t *words = buffer; size_t nwords = len / sizeof (uint32_t); const uint32_t *endp = words + nwords; uint32_t A = ctx->A; uint32_t B = ctx->B; uint32_t C = ctx->C; uint32_t D = ctx->D; /* First increment the byte count. RFC 1321 specifies the possible length of the file up to 2^64 bits. Here we only compute the number of bytes. Do a double word increment. */ ctx->total[0] += len; if (ctx->total[0] < len) ++ctx->total[1]; /* Process all bytes in the buffer with 64 bytes in each round of the loop. */ while (words < endp) { uint32_t *cwp = correct_words; uint32_t A_save = A; uint32_t B_save = B; uint32_t C_save = C; uint32_t D_save = D; /* First round: using the given function, the context and a constant the next context is computed. Because the algorithms processing unit is a 32-bit word and it is determined to work on words in little endian byte order we perhaps have to change the byte order before the computation. To reduce the work for the next steps we store the swapped words in the array CORRECT_WORDS. */ #define OP(a, b, c, d, s, T) \ do \ { \ a += FF (b, c, d) + (*cwp++ = SWAP (*words)) + T; \ ++words; \ CYCLIC (a, s); \ a += b; \ } \ while (0) /* It is unfortunate that C does not provide an operator for cyclic rotation. Hope the C compiler is smart enough. */ #define CYCLIC(w, s) (w = (w << s) | (w >> (32 - s))) /* Before we start, one word to the strange constants. They are defined in RFC 1321 as T[i] = (int) (4294967296.0 * fabs (sin (i))), i=1..64 Here is an equivalent invocation using Perl: perl -e 'foreach(1..64){printf "0x%08x\n", int (4294967296 * abs (sin $_))}' */ /* Round 1. */ OP (A, B, C, D, 7, 0xd76aa478); OP (D, A, B, C, 12, 0xe8c7b756); OP (C, D, A, B, 17, 0x242070db); OP (B, C, D, A, 22, 0xc1bdceee); OP (A, B, C, D, 7, 0xf57c0faf); OP (D, A, B, C, 12, 0x4787c62a); OP (C, D, A, B, 17, 0xa8304613); OP (B, C, D, A, 22, 0xfd469501); OP (A, B, C, D, 7, 0x698098d8); OP (D, A, B, C, 12, 0x8b44f7af); OP (C, D, A, B, 17, 0xffff5bb1); OP (B, C, D, A, 22, 0x895cd7be); OP (A, B, C, D, 7, 0x6b901122); OP (D, A, B, C, 12, 0xfd987193); OP (C, D, A, B, 17, 0xa679438e); OP (B, C, D, A, 22, 0x49b40821); /* For the second to fourth round we have the possibly swapped words in CORRECT_WORDS. Redefine the macro to take an additional first argument specifying the function to use. */ #undef OP #define OP(f, a, b, c, d, k, s, T) \ do \ { \ a += f (b, c, d) + correct_words[k] + T; \ CYCLIC (a, s); \ a += b; \ } \ while (0) /* Round 2. */ OP (FG, A, B, C, D, 1, 5, 0xf61e2562); OP (FG, D, A, B, C, 6, 9, 0xc040b340); OP (FG, C, D, A, B, 11, 14, 0x265e5a51); OP (FG, B, C, D, A, 0, 20, 0xe9b6c7aa); OP (FG, A, B, C, D, 5, 5, 0xd62f105d); OP (FG, D, A, B, C, 10, 9, 0x02441453); OP (FG, C, D, A, B, 15, 14, 0xd8a1e681); OP (FG, B, C, D, A, 4, 20, 0xe7d3fbc8); OP (FG, A, B, C, D, 9, 5, 0x21e1cde6); OP (FG, D, A, B, C, 14, 9, 0xc33707d6); OP (FG, C, D, A, B, 3, 14, 0xf4d50d87); OP (FG, B, C, D, A, 8, 20, 0x455a14ed); OP (FG, A, B, C, D, 13, 5, 0xa9e3e905); OP (FG, D, A, B, C, 2, 9, 0xfcefa3f8); OP (FG, C, D, A, B, 7, 14, 0x676f02d9); OP (FG, B, C, D, A, 12, 20, 0x8d2a4c8a); /* Round 3. */ OP (FH, A, B, C, D, 5, 4, 0xfffa3942); OP (FH, D, A, B, C, 8, 11, 0x8771f681); OP (FH, C, D, A, B, 11, 16, 0x6d9d6122); OP (FH, B, C, D, A, 14, 23, 0xfde5380c); OP (FH, A, B, C, D, 1, 4, 0xa4beea44); OP (FH, D, A, B, C, 4, 11, 0x4bdecfa9); OP (FH, C, D, A, B, 7, 16, 0xf6bb4b60); OP (FH, B, C, D, A, 10, 23, 0xbebfbc70); OP (FH, A, B, C, D, 13, 4, 0x289b7ec6); OP (FH, D, A, B, C, 0, 11, 0xeaa127fa); OP (FH, C, D, A, B, 3, 16, 0xd4ef3085); OP (FH, B, C, D, A, 6, 23, 0x04881d05); OP (FH, A, B, C, D, 9, 4, 0xd9d4d039); OP (FH, D, A, B, C, 12, 11, 0xe6db99e5); OP (FH, C, D, A, B, 15, 16, 0x1fa27cf8); OP (FH, B, C, D, A, 2, 23, 0xc4ac5665); /* Round 4. */ OP (FI, A, B, C, D, 0, 6, 0xf4292244); OP (FI, D, A, B, C, 7, 10, 0x432aff97); OP (FI, C, D, A, B, 14, 15, 0xab9423a7); OP (FI, B, C, D, A, 5, 21, 0xfc93a039); OP (FI, A, B, C, D, 12, 6, 0x655b59c3); OP (FI, D, A, B, C, 3, 10, 0x8f0ccc92); OP (FI, C, D, A, B, 10, 15, 0xffeff47d); OP (FI, B, C, D, A, 1, 21, 0x85845dd1); OP (FI, A, B, C, D, 8, 6, 0x6fa87e4f); OP (FI, D, A, B, C, 15, 10, 0xfe2ce6e0); OP (FI, C, D, A, B, 6, 15, 0xa3014314); OP (FI, B, C, D, A, 13, 21, 0x4e0811a1); OP (FI, A, B, C, D, 4, 6, 0xf7537e82); OP (FI, D, A, B, C, 11, 10, 0xbd3af235); OP (FI, C, D, A, B, 2, 15, 0x2ad7d2bb); OP (FI, B, C, D, A, 9, 21, 0xeb86d391); /* Add the starting values of the context. */ A += A_save; B += B_save; C += C_save; D += D_save; } /* Put checksum in context given as argument. */ ctx->A = A; ctx->B = B; ctx->C = C; ctx->D = D; } dibbler-1.0.1/Misc/DHCPClient.h0000644000175000017500000000251512277722750012774 00000000000000/* * Dibbler - a portable DHCPv6 * * authors: Tomasz Mrugalski * Marek Senderski * * released under GNU GPL v2 only licence * * $Id: DHCPClient.h,v 1.8 2009-03-24 23:17:18 thomson Exp $ * */ #ifndef DHCPCLIENT_H #define DHCPCLIENT_H #include #include #include "SmartPtr.h" #include "Portable.h" class TDHCPClient { public: TDHCPClient(const std::string& config); void run(); void stop(); void resetLinkstate(); bool isDone() const; bool checkPrivileges(); void setWorkdir(const std::string& workdir); #ifdef MOD_CLNT_CONFIRM void requestLinkstateChange(); #endif char* getCtrlIface(); ~TDHCPClient(); private: void initLinkStateChange(); bool IsDone_; volatile link_state_notify_t linkstates; }; #endif dibbler-1.0.1/Misc/base64.h0000664000175000017500000000363412233256142012175 00000000000000/* -*- buffer-read-only: t -*- vi: set ro: */ /* DO NOT EDIT! GENERATED AUTOMATICALLY! */ /* base64.h -- Encode binary data using printable characters. Copyright (C) 2004, 2005, 2006 Free Software Foundation, Inc. Written by Simon Josefsson. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #ifndef BASE64_H # define BASE64_H /* Get size_t. */ # include /* Get bool. */ # include /* This uses that the expression (n+(k-1))/k means the smallest integer >= n/k, i.e., the ceiling of n/k. */ # define BASE64_LENGTH(inlen) ((((inlen) + 2) / 3) * 4) struct base64_decode_context { unsigned int i; char buf[4]; }; #ifdef __cplusplus extern "C" { #endif extern bool isbase64 (char ch); extern void base64_encode (const char * in, size_t inlen, char * out, size_t outlen); extern size_t base64_encode_alloc (const char *in, size_t inlen, char **out); extern void base64_decode_ctx_init (struct base64_decode_context *ctx); extern bool base64_decode (struct base64_decode_context *ctx, const char * in, size_t inlen, char * out, size_t *outlen); extern bool base64_decode_alloc (struct base64_decode_context *ctx, const char *in, size_t inlen, char **out, size_t *outlen); #ifdef __cplusplus } #endif #endif /* BASE64_H */ dibbler-1.0.1/Misc/FQDN.cpp0000644000175000017500000000344512277722750012205 00000000000000/* * Dibbler - a portable DHCPv6 * * author: Krzysztof Wnuk * * released under GNU GPL v2 only licence * */ #include #include "FQDN.h" #include "SmartPtr.h" using namespace std; TFQDN::TFQDN() { this->Name_ = ""; this->Used_ = false; } TFQDN::TFQDN(SPtr duid, const std::string& name, bool used) :Duid_(duid), Name_(name), Used_(used) { } TFQDN::TFQDN(SPtr addr, const std::string& name, bool used) :Addr_(addr), Name_(name), Used_(used) { } TFQDN::TFQDN(const std::string& name, bool used) :Name_(name), Used_(used) { } SPtr TFQDN::getDuid() { return Duid_; } SPtr TFQDN::getAddr() { return Addr_; } string TFQDN::getName() { return Name_; } bool TFQDN::isUsed() { return Used_; } void TFQDN::setUsed(bool used) { Used_ = used; } // -------------------------------------------------------------------- // --- operators ------------------------------------------------------ // -------------------------------------------------------------------- ostream& operator<<(ostream& out, TFQDN& fqdn) { out << "getPlain() << "\""; } if (fqdn.Addr_) { out << " addr=\"" << fqdn.Addr_->getPlain() << "\""; } out << " used=\"" << (fqdn.Used_?"TRUE":"FALSE") << "\">" << fqdn.getName() << "" << endl; return out; } dibbler-1.0.1/Misc/base64.c0000644000175000017500000004031112277722750012172 00000000000000/* base64.c -- Encode binary data using printable characters. Copyright (C) 1999, 2000, 2001, 2004, 2005, 2006, 2007 Free Software Foundation, Inc. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ /* Written by Simon Josefsson. Partially adapted from GNU MailUtils * (mailbox/filter_trans.c, as of 2004-11-28). Improved by review * from Paul Eggert, Bruno Haible, and Stepan Kasal. * * See also RFC 3548 . * * Be careful with error checking. Here is how you would typically * use these functions: * * bool ok = base64_decode_alloc (in, inlen, &out, &outlen); * if (!ok) * FAIL: input was not valid base64 * if (out == NULL) * FAIL: memory allocation error * OK: data in OUT/OUTLEN * * size_t outlen = base64_encode_alloc (in, inlen, &out); * if (out == NULL && outlen == 0 && inlen != 0) * FAIL: input too long * if (out == NULL) * FAIL: memory allocation error * OK: data in OUT/OUTLEN. * */ /* adapted to dibbler project by Tomasz Mrugalski (2011-08-16) */ #ifdef WIN32 // Visual Studio is a dumb compiler. It does not support those C99 features #define inline #define restrict #endif /* Get prototype. */ #include "base64.h" /* Get malloc. */ #include /* Get UCHAR_MAX. */ #include #include /* C89 compliant way to cast 'char' to 'unsigned char'. */ static inline unsigned char to_uchar (char ch) { return ch; } /* Base64 encode IN array of size INLEN into OUT array of size OUTLEN. If OUTLEN is less than BASE64_LENGTH(INLEN), write as many bytes as possible. If OUTLEN is larger than BASE64_LENGTH(INLEN), also zero terminate the output buffer. */ void base64_encode (const char *restrict in, size_t inlen, char *restrict out, size_t outlen) { static const char b64str[64] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; while (inlen && outlen) { *out++ = b64str[(to_uchar (in[0]) >> 2) & 0x3f]; if (!--outlen) break; *out++ = b64str[((to_uchar (in[0]) << 4) + (--inlen ? to_uchar (in[1]) >> 4 : 0)) & 0x3f]; if (!--outlen) break; *out++ = (inlen ? b64str[((to_uchar (in[1]) << 2) + (--inlen ? to_uchar (in[2]) >> 6 : 0)) & 0x3f] : '='); if (!--outlen) break; *out++ = inlen ? b64str[to_uchar (in[2]) & 0x3f] : '='; if (!--outlen) break; if (inlen) inlen--; if (inlen) in += 3; } if (outlen) *out = '\0'; } /* Allocate a buffer and store zero terminated base64 encoded data from array IN of size INLEN, returning BASE64_LENGTH(INLEN), i.e., the length of the encoded data, excluding the terminating zero. On return, the OUT variable will hold a pointer to newly allocated memory that must be deallocated by the caller. If output string length would overflow, 0 is returned and OUT is set to NULL. If memory allocation failed, OUT is set to NULL, and the return value indicates length of the requested memory block, i.e., BASE64_LENGTH(inlen) + 1. */ size_t base64_encode_alloc (const char *in, size_t inlen, char **out) { size_t outlen = 1 + BASE64_LENGTH (inlen); /* Check for overflow in outlen computation. * * If there is no overflow, outlen >= inlen. * * If the operation (inlen + 2) overflows then it yields at most +1, so * outlen is 0. * * If the multiplication overflows, we lose at least half of the * correct value, so the result is < ((inlen + 2) / 3) * 2, which is * less than (inlen + 2) * 0.66667, which is less than inlen as soon as * (inlen > 4). */ if (inlen > outlen) { *out = NULL; return 0; } *out = malloc (outlen); if (!*out) return outlen; base64_encode (in, inlen, *out, outlen); return outlen - 1; } /* With this approach this file works independent of the charset used (think EBCDIC). However, it does assume that the characters in the Base64 alphabet (A-Za-z0-9+/) are encoded in 0..255. POSIX 1003.1-2001 require that char and unsigned char are 8-bit quantities, though, taking care of that problem. But this may be a potential problem on non-POSIX C99 platforms. IBM C V6 for AIX mishandles "#define B64(x) ...'x'...", so use "_" as the formal parameter rather than "x". */ #define B64(_) \ ((_) == 'A' ? 0 \ : (_) == 'B' ? 1 \ : (_) == 'C' ? 2 \ : (_) == 'D' ? 3 \ : (_) == 'E' ? 4 \ : (_) == 'F' ? 5 \ : (_) == 'G' ? 6 \ : (_) == 'H' ? 7 \ : (_) == 'I' ? 8 \ : (_) == 'J' ? 9 \ : (_) == 'K' ? 10 \ : (_) == 'L' ? 11 \ : (_) == 'M' ? 12 \ : (_) == 'N' ? 13 \ : (_) == 'O' ? 14 \ : (_) == 'P' ? 15 \ : (_) == 'Q' ? 16 \ : (_) == 'R' ? 17 \ : (_) == 'S' ? 18 \ : (_) == 'T' ? 19 \ : (_) == 'U' ? 20 \ : (_) == 'V' ? 21 \ : (_) == 'W' ? 22 \ : (_) == 'X' ? 23 \ : (_) == 'Y' ? 24 \ : (_) == 'Z' ? 25 \ : (_) == 'a' ? 26 \ : (_) == 'b' ? 27 \ : (_) == 'c' ? 28 \ : (_) == 'd' ? 29 \ : (_) == 'e' ? 30 \ : (_) == 'f' ? 31 \ : (_) == 'g' ? 32 \ : (_) == 'h' ? 33 \ : (_) == 'i' ? 34 \ : (_) == 'j' ? 35 \ : (_) == 'k' ? 36 \ : (_) == 'l' ? 37 \ : (_) == 'm' ? 38 \ : (_) == 'n' ? 39 \ : (_) == 'o' ? 40 \ : (_) == 'p' ? 41 \ : (_) == 'q' ? 42 \ : (_) == 'r' ? 43 \ : (_) == 's' ? 44 \ : (_) == 't' ? 45 \ : (_) == 'u' ? 46 \ : (_) == 'v' ? 47 \ : (_) == 'w' ? 48 \ : (_) == 'x' ? 49 \ : (_) == 'y' ? 50 \ : (_) == 'z' ? 51 \ : (_) == '0' ? 52 \ : (_) == '1' ? 53 \ : (_) == '2' ? 54 \ : (_) == '3' ? 55 \ : (_) == '4' ? 56 \ : (_) == '5' ? 57 \ : (_) == '6' ? 58 \ : (_) == '7' ? 59 \ : (_) == '8' ? 60 \ : (_) == '9' ? 61 \ : (_) == '+' ? 62 \ : (_) == '/' ? 63 \ : -1) static const signed char b64[0x100] = { B64 (0), B64 (1), B64 (2), B64 (3), B64 (4), B64 (5), B64 (6), B64 (7), B64 (8), B64 (9), B64 (10), B64 (11), B64 (12), B64 (13), B64 (14), B64 (15), B64 (16), B64 (17), B64 (18), B64 (19), B64 (20), B64 (21), B64 (22), B64 (23), B64 (24), B64 (25), B64 (26), B64 (27), B64 (28), B64 (29), B64 (30), B64 (31), B64 (32), B64 (33), B64 (34), B64 (35), B64 (36), B64 (37), B64 (38), B64 (39), B64 (40), B64 (41), B64 (42), B64 (43), B64 (44), B64 (45), B64 (46), B64 (47), B64 (48), B64 (49), B64 (50), B64 (51), B64 (52), B64 (53), B64 (54), B64 (55), B64 (56), B64 (57), B64 (58), B64 (59), B64 (60), B64 (61), B64 (62), B64 (63), B64 (64), B64 (65), B64 (66), B64 (67), B64 (68), B64 (69), B64 (70), B64 (71), B64 (72), B64 (73), B64 (74), B64 (75), B64 (76), B64 (77), B64 (78), B64 (79), B64 (80), B64 (81), B64 (82), B64 (83), B64 (84), B64 (85), B64 (86), B64 (87), B64 (88), B64 (89), B64 (90), B64 (91), B64 (92), B64 (93), B64 (94), B64 (95), B64 (96), B64 (97), B64 (98), B64 (99), B64 (100), B64 (101), B64 (102), B64 (103), B64 (104), B64 (105), B64 (106), B64 (107), B64 (108), B64 (109), B64 (110), B64 (111), B64 (112), B64 (113), B64 (114), B64 (115), B64 (116), B64 (117), B64 (118), B64 (119), B64 (120), B64 (121), B64 (122), B64 (123), B64 (124), B64 (125), B64 (126), B64 (127), B64 (128), B64 (129), B64 (130), B64 (131), B64 (132), B64 (133), B64 (134), B64 (135), B64 (136), B64 (137), B64 (138), B64 (139), B64 (140), B64 (141), B64 (142), B64 (143), B64 (144), B64 (145), B64 (146), B64 (147), B64 (148), B64 (149), B64 (150), B64 (151), B64 (152), B64 (153), B64 (154), B64 (155), B64 (156), B64 (157), B64 (158), B64 (159), B64 (160), B64 (161), B64 (162), B64 (163), B64 (164), B64 (165), B64 (166), B64 (167), B64 (168), B64 (169), B64 (170), B64 (171), B64 (172), B64 (173), B64 (174), B64 (175), B64 (176), B64 (177), B64 (178), B64 (179), B64 (180), B64 (181), B64 (182), B64 (183), B64 (184), B64 (185), B64 (186), B64 (187), B64 (188), B64 (189), B64 (190), B64 (191), B64 (192), B64 (193), B64 (194), B64 (195), B64 (196), B64 (197), B64 (198), B64 (199), B64 (200), B64 (201), B64 (202), B64 (203), B64 (204), B64 (205), B64 (206), B64 (207), B64 (208), B64 (209), B64 (210), B64 (211), B64 (212), B64 (213), B64 (214), B64 (215), B64 (216), B64 (217), B64 (218), B64 (219), B64 (220), B64 (221), B64 (222), B64 (223), B64 (224), B64 (225), B64 (226), B64 (227), B64 (228), B64 (229), B64 (230), B64 (231), B64 (232), B64 (233), B64 (234), B64 (235), B64 (236), B64 (237), B64 (238), B64 (239), B64 (240), B64 (241), B64 (242), B64 (243), B64 (244), B64 (245), B64 (246), B64 (247), B64 (248), B64 (249), B64 (250), B64 (251), B64 (252), B64 (253), B64 (254), B64 (255) }; #if UCHAR_MAX == 255 # define uchar_in_range(c) true #else # define uchar_in_range(c) ((c) <= 255) #endif /* Return true if CH is a character from the Base64 alphabet, and false otherwise. Note that '=' is padding and not considered to be part of the alphabet. */ bool isbase64 (char ch) { return uchar_in_range (to_uchar (ch)) && 0 <= b64[to_uchar (ch)]; } /* Initialize decode-context buffer, CTX. */ void base64_decode_ctx_init (struct base64_decode_context *ctx) { ctx->i = 0; } /* If CTX->i is 0 or 4, there are four or more bytes in [*IN..IN_END), and none of those four is a newline, then return *IN. Otherwise, copy up to 4 - CTX->i non-newline bytes from that range into CTX->buf, starting at index CTX->i and setting CTX->i to reflect the number of bytes copied, and return CTX->buf. In either case, advance *IN to point to the byte after the last one processed, and set *N_NON_NEWLINE to the number of verified non-newline bytes accessible through the returned pointer. */ static inline char * get_4 (struct base64_decode_context *ctx, char const *restrict *in, char const *restrict in_end, size_t *n_non_newline) { if (ctx->i == 4) ctx->i = 0; if (ctx->i == 0) { char const *t = *in; if (4 <= in_end - *in && memchr (t, '\n', 4) == NULL) { /* This is the common case: no newline. */ *in += 4; *n_non_newline = 4; return (char *) t; } } { /* Copy non-newline bytes into BUF. */ char const *p = *in; while (p < in_end) { char c = *p++; if (c != '\n') { ctx->buf[ctx->i++] = c; if (ctx->i == 4) break; } } *in = p; *n_non_newline = ctx->i; return ctx->buf; } } #define return_false \ do \ { \ *outp = out; \ return false; \ } \ while (false) /* Decode up to four bytes of base64-encoded data, IN, of length INLEN into the output buffer, *OUT, of size *OUTLEN bytes. Return true if decoding is successful, false otherwise. If *OUTLEN is too small, as many bytes as possible are written to *OUT. On return, advance *OUT to point to the byte after the last one written, and decrement *OUTLEN to reflect the number of bytes remaining in *OUT. */ static inline bool decode_4 (char const *restrict in, size_t inlen, char *restrict *outp, size_t *outleft) { char *out = *outp; if (inlen < 2) return false; if (!isbase64 (in[0]) || !isbase64 (in[1])) return false; if (*outleft) { *out++ = ((b64[to_uchar (in[0])] << 2) | (b64[to_uchar (in[1])] >> 4)); --*outleft; } if (inlen == 2) return_false; if (in[2] == '=') { if (inlen != 4) return_false; if (in[3] != '=') return_false; } else { if (!isbase64 (in[2])) return_false; if (*outleft) { *out++ = (((b64[to_uchar (in[1])] << 4) & 0xf0) | (b64[to_uchar (in[2])] >> 2)); --*outleft; } if (inlen == 3) return_false; if (in[3] == '=') { if (inlen != 4) return_false; } else { if (!isbase64 (in[3])) return_false; if (*outleft) { *out++ = (((b64[to_uchar (in[2])] << 6) & 0xc0) | b64[to_uchar (in[3])]); --*outleft; } } } *outp = out; return true; } /* Decode base64-encoded input array IN of length INLEN to output array OUT that can hold *OUTLEN bytes. The input data may be interspersed with newlines. Return true if decoding was successful, i.e. if the input was valid base64 data, false otherwise. If *OUTLEN is too small, as many bytes as possible will be written to OUT. On return, *OUTLEN holds the length of decoded bytes in OUT. Note that as soon as any non-alphabet, non-newline character is encountered, decoding is stopped and false is returned. If INLEN is zero, then process only whatever data is stored in CTX. Initially, CTX must have been initialized via base64_decode_ctx_init. Subsequent calls to this function must reuse whatever state is recorded in that buffer. It is necessary for when a quadruple of base64 input bytes spans two input buffers. */ bool base64_decode (struct base64_decode_context *ctx, const char *restrict in, size_t inlen, char *restrict out, size_t *outlen) { size_t outleft = *outlen; bool flush_ctx = inlen == 0; while (true) { size_t outleft_save = outleft; if (ctx->i == 0 && !flush_ctx) { while (true) { /* Save a copy of outleft, in case we need to re-parse this block of four bytes. */ outleft_save = outleft; if (!decode_4 (in, inlen, &out, &outleft)) break; in += 4; inlen -= 4; } } if (inlen == 0 && !flush_ctx) break; /* Handle the common case of 72-byte wrapped lines. This also handles any other multiple-of-4-byte wrapping. */ if (inlen && *in == '\n') { ++in; --inlen; continue; } /* Restore OUT and OUTLEFT. */ out -= outleft_save - outleft; outleft = outleft_save; { char const *in_end = in + inlen; char const *non_nl = get_4 (ctx, &in, in_end, &inlen); /* If the input is empty or consists solely of newlines (0 non-newlines), then we're done. Likewise if there are fewer than 4 bytes when not flushing context. */ if (inlen == 0 || (inlen < 4 && !flush_ctx)) { inlen = 0; break; } if (!decode_4 (non_nl, inlen, &out, &outleft)) break; inlen = in_end - in; } } *outlen -= outleft; return inlen == 0; } /* Allocate an output buffer in *OUT, and decode the base64 encoded data stored in IN of size INLEN to the *OUT buffer. On return, the size of the decoded data is stored in *OUTLEN. OUTLEN may be NULL, if the caller is not interested in the decoded length. *OUT may be NULL to indicate an out of memory error, in which case *OUTLEN contains the size of the memory block needed. The function returns true on successful decoding and memory allocation errors. (Use the *OUT and *OUTLEN parameters to differentiate between successful decoding and memory error.) The function returns false if the input was invalid, in which case *OUT is NULL and *OUTLEN is undefined. */ bool base64_decode_alloc (struct base64_decode_context *ctx, const char *in, size_t inlen, char **out, size_t *outlen) { /* This may allocate a few bytes too many, depending on input, but it's not worth the extra CPU time to compute the exact size. The exact size is 3 * inlen / 4, minus 1 if the input ends with "=" and minus another 1 if the input ends with "==". Dividing before multiplying avoids the possibility of overflow. */ size_t needlen = 3 * (inlen / 4) + 2; *out = malloc (needlen); if (!*out) return true; if (!base64_decode (ctx, in, inlen, *out, &needlen)) { free (*out); *out = NULL; return false; } if (outlen) *outlen = needlen; return true; } dibbler-1.0.1/Misc/DUID.cpp0000644000175000017500000000334712277722750012203 00000000000000/* * Dibbler - a portable DHCPv6 * * authors: Tomasz Mrugalski * Marek Senderski * * released under GNU GPL v2 only licence * */ #include #include "hex.h" #include "DUID.h" #include "Logger.h" using namespace std; TDUID::TDUID() { } // packed TDUID::TDUID(const char* duid,int len) { if (duid && len) { DUID_.resize(len); memcpy(&DUID_[0], duid, len); Plain_ = hexToText((uint8_t*)&DUID_[0], DUID_.size(), true); } } // plain TDUID::TDUID(const char* text) { if (!text) { return; } Plain_ = string(text); DUID_ = textToHex(Plain_); Plain_ = hexToText((uint8_t*)&DUID_[0], DUID_.size(), true); } TDUID::~TDUID() { } TDUID::TDUID(const TDUID &other) { DUID_ = other.DUID_; Plain_ = other.Plain_; } TDUID& TDUID::operator=(const TDUID &other) { if (this == &other) return *this; DUID_ = other.DUID_; Plain_ = other.Plain_; return *this; } bool TDUID::operator==(const TDUID &other) { return (DUID_ == other.DUID_); } bool TDUID::operator<=(const TDUID &other) { return (DUID_ <= other.DUID_); } size_t TDUID::getLen() const { return DUID_.size(); } const string TDUID::getPlain() const { return Plain_; } const char* TDUID::get() const { return (const char*)(&DUID_[0]); } char * TDUID::storeSelf(char* buf) { memcpy(buf, &DUID_[0], DUID_.size()); return buf + DUID_.size(); } ostream& operator<<(ostream& out,TDUID& duid) { if (duid.DUID_.size()) { out << "" << duid.Plain_ << "" << std::endl; } else { out << "" << std::endl; } return out; } dibbler-1.0.1/Misc/Portable.h0000664000175000017500000003615412561700376012673 00000000000000/* * Dibbler - a portable DHCPv6 * * authors: Tomasz Mrugalski * Marek Senderski * changes: Krzysztof Wnuk * Michal Kowalczuk * * Released under GNU GPL v2 licence * */ #ifndef PORTABLE_H #define PORTABLE_H #define DIBBLER_VERSION "1.0.1" #define DIBBLER_COPYRIGHT1 "| Dibbler - a portable DHCPv6, version " DIBBLER_VERSION #define DIBBLER_COPYRIGHT2 "| Authors : Tomasz Mrugalski,Marek Senderski" #define DIBBLER_COPYRIGHT3 "| Licence : GNU GPL v2 only. Developed at Gdansk University of Technology." #define DIBBLER_COPYRIGHT4 "| Homepage: http://klub.com.pl/dhcpv6/" #ifdef WIN32 #include #define strcasecmp strcmpi #define snprintf _snprintf #endif #if defined(LINUX) || defined(BSD) #include #endif #include #include /* this should look like this: uint16_t readUint16(uint8_t* buf); uint8_t * writeUint16(uint8_t* buf, uint16_t word); uint32_t readUint32(uint8_t* buf); uint8_t* writeUint32(uint8_t* buf, uint32_t dword); uint64_t readUint64(uint8_t* buf); uint8_t* writeUint64(uint8_t* buf, uint64_t qword); */ /* due to poor type usage (char* instead of uint8_t*), we need to stick with char* for now. Changing to uint8_t would require rewriting large parts of the code */ #define BUFFER_TYPE char #ifdef __cplusplus extern "C" { #endif uint8_t readUint8(const BUFFER_TYPE* buf); BUFFER_TYPE* writeUint8(BUFFER_TYPE* buf, uint8_t octet); uint16_t readUint16(const BUFFER_TYPE * buf); BUFFER_TYPE * writeUint16(BUFFER_TYPE * buf, uint16_t word); uint32_t readUint32(const BUFFER_TYPE * buf); BUFFER_TYPE * writeUint32(BUFFER_TYPE * buf, uint32_t dword); uint64_t readUint64(const BUFFER_TYPE * buf); BUFFER_TYPE * writeUint64(BUFFER_TYPE * buf, uint64_t qword); BUFFER_TYPE* writeData(BUFFER_TYPE* buf, BUFFER_TYPE* data, size_t len); #ifdef __cplusplus } #endif #define DEFAULT_UMASK 027 /**********************************************************************/ /*** data structures **************************************************/ /**********************************************************************/ #ifndef MAX_IFNAME_LENGTH #define MAX_IFNAME_LENGTH 255 #endif /* Structure used for interface name reporting */ struct iface { char name[MAX_IFNAME_LENGTH]; /* interface name */ int id; /* interface ID (often called ifindex) */ int hardwareType; /* type of hardware (see RFC 826) */ char mac[255]; /* link layer address */ int maclen; /* length of link layer address */ char *linkaddr; /* assigned IPv6 link local addresses */ int linkaddrcount; /* number of assigned IPv6 link local addresses */ char *globaladdr; /* global IPv6 addresses */ int globaladdrcount; /* number of global IPV6 addresses */ int link_state; /* used in link change detection routines */ unsigned int flags; /* look IF_xxx in portable.h */ unsigned char m_bit; /* M bit in RA received? */ unsigned char o_bit; /* O bit in RA received? */ struct iface* next; /* structure describing next iface in system */ }; #define MAX_LINK_STATE_CHANGES_AT_ONCE 16 struct link_state_notify_t { int ifindex[MAX_LINK_STATE_CHANGES_AT_ONCE]; /* indexes of interfaces that has changed. Only non-zero values will be used */ int stat[MAX_LINK_STATE_CHANGES_AT_ONCE]; int cnt; /* number of iterface indexes filled */ }; /**********************************************************************/ /*** file setup/default paths *****************************************/ /**********************************************************************/ #define CLNTCFGMGR_FILE "client-CfgMgr.xml" #define CLNTIFACEMGR_FILE "client-IfaceMgr.xml" #define CLNTDUID_FILE "client-duid" #define CLNTADDRMGR_FILE "client-AddrMgr.xml" #define CLNTTRANSMGR_FILE "client-TransMgr.xml" #define SRVCFGMGR_FILE "server-CfgMgr.xml" #define SRVIFACEMGR_FILE "server-IfaceMgr.xml" #define SRVDUID_FILE "server-duid" #define SRVADDRMGR_FILE "server-AddrMgr.xml" #define SRVTRANSMGR_FILE "server-TransMgr.xml" #define SRVCACHE_FILE "server-cache.xml" #define RELCFGMGR_FILE "relay-CfgMgr.xml" #define RELIFACEMGR_FILE "relay-IfaceMgr.xml" #define RELTRANSMGR_FILE "relay-TransMgr.xml" #define REQIFACEMGR_FILE "requestor-IfaceMgr.xml" #define DNSUPDATE_DEFAULT_TTL "2h" #define DNSUPDATE_DEFAULT_TIMEOUT 1000 /* in ms */ #define INACTIVE_MODE_INTERVAL 3 /* 3 seconds */ #define REQLOG_FILE "dibbler-requestor.log" #ifdef WIN32 #define DEFAULT_WORKDIR ".\\" #define DEFAULT_SCRIPT "" #define DEFAULT_CLNTCONF_FILE "client.conf" #define SRVCONF_FILE "server.conf" #define RELCONF_FILE "relay.conf" #define DEFAULT_CLNTLOG_FILE "dibbler-client.log" #define SRVLOG_FILE "dibbler-server.log" #define RELLOG_FILE "dibbler-relay.log" #define CLNT_AAASPI_FILE "AAA-SPI" #define SRV_KEYMAP_FILE "keys-mapping" #define NULLFILE "nul" /* specifies if client should remove any configured DNS servers when configuring DNS servers for the first time. This makes sense on WIN32 only. */ #define FLUSH_OTHER_CONFIGURED_DNS_SERVERS true #endif #if defined(LINUX) || defined(BSD) || defined(SUNOS) #define DEFAULT_WORKDIR "/var/lib/dibbler" #define DEFAULT_CLNTCONF_FILE "/etc/dibbler/client.conf" #define DEFAULT_CLNTPID_FILE "/var/lib/dibbler/client.pid" #define DEFAULT_CLNTLOG_FILE "/var/log/dibbler/dibbler-client.log" #define DEFAULT_SCRIPT "" #define SRVCONF_FILE "/etc/dibbler/server.conf" #define RELCONF_FILE "/etc/dibbler/relay.conf" #define RESOLVCONF_FILE "/etc/resolv.conf" #define NTPCONF_FILE "/etc/ntp.conf" #define RADVD_FILE "/etc/dibbler/radvd.conf" #define SRVPID_FILE "/var/lib/dibbler/server.pid" #define RELPID_FILE "/var/lib/dibbler/relay.pid" #define SRVLOG_FILE "/var/log/dibbler/dibbler-server.log" #define RELLOG_FILE "/var/log/dibbler/dibbler-relay.log" #define CLNT_AAASPI_FILE "/var/lib/dibbler/AAA/AAA-SPI" #define SRV_KEYMAP_FILE "/var/lib/dibbler/AAA/keys-mapping" #define NULLFILE "/dev/null" /* those defines were initially used on Linux only, but hopefully they will work on other Posix systems as well */ #define RESOLVCONF "/sbin/resolvconf" #define TIMEZONE_FILE "/etc/localtime" #define TIMEZONES_DIR "/usr/share/zoneinfo" /* specifies if client should remove any configured DNS servers when configuring DNS servers for the first time. This makes sense on WIN32 only. */ #define FLUSH_OTHER_CONFIGURED_DNS_SERVERS false #endif /* --- options --- */ #define OPTION_DNS_SERVERS_FILENAME "option-dns-servers" #define OPTION_DOMAINS_FILENAME "option-domains" #define OPTION_NTP_SERVERS_FILENAME "option-ntp-servers" #define OPTION_TIMEZONE_FILENAME "option-timezone" #define OPTION_SIP_SERVERS_FILENAME "option-sip-servers" #define OPTION_SIP_DOMAINS_FILENAME "option-sip-domains" #define OPTION_NIS_SERVERS_FILENAME "option-nis-servers" #define OPTION_NIS_DOMAIN_FILENAME "option-nis-domain" #define OPTION_NISP_SERVERS_FILENAME "option-nisplus-servers" #define OPTION_NISP_DOMAIN_FILENAME "option-nisplus-domain" /* --- bulk leasequery --- */ #define BULKLQ_ACCEPT false #define BULKLQ_TCP_PORT 547 #define BULKLQ_MAX_CONNS 10 #define BULKLQ_TIMEOUT 300 /* ********************************************************************** */ /* *** interface flags ************************************************** */ /* ********************************************************************** */ /* those flags are used to parse flags in the structure returned by if_list_get(). They are highly system specific. Posix systems use values imported from headers */ #ifdef WIN32 #define IFF_RUNNING IFF_UP /* those defines are in ws2ipdef.h #define IFF_UP 0x1 #define IFF_MULTICAST 0x4 #define IFF_LOOPBACK 0x8 */ #endif /* ********************************************************************** */ /* *** low-level error codes ******************************************** */ /* ********************************************************************** */ #define LOWLEVEL_NO_ERROR 0 #define LOWLEVEL_ERROR_UNSPEC -1 #define LOWLEVEL_ERROR_BIND_IFACE -2 #define LOWLEVEL_ERROR_BIND_FAILED -4 #define LOWLEVEL_ERROR_MCAST_HOPS -5 #define LOWLEVEL_ERROR_MCAST_MEMBERSHIP -6 #define LOWLEVEL_ERROR_GETADDRINFO -7 #define LOWLEVEL_ERROR_SOCK_OPTS -8 #define LOWLEVEL_ERROR_REUSE_FAILED -9 #define LOWLEVEL_ERROR_FILE -10 #define LOWLEVEL_ERROR_SOCKET -11 #define LOWLEVEL_ERROR_NOT_IMPLEMENTED -12 #define LOWLEVEL_TENTATIVE_YES 1 #define LOWLEVEL_TENTATIVE_NO 0 #define LOWLEVEL_TENTATIVE_DONT_KNOW -1 /* ********************************************************************** */ /* *** time related functions ******************************************* */ /* ********************************************************************** */ #ifdef WIN32 #define strncasecmp _strnicmp #include #include #include #endif /* ********************************************************************** */ /* *** interface/socket low level functions ***************************** */ /* ********************************************************************** */ #ifdef __cplusplus extern "C" { #endif int lowlevelInit(); int lowlevelExit(); /* get list of interfaces */ extern struct iface * if_list_get(); extern void if_list_release(struct iface * list); /* add address to interface */ extern int ipaddr_add(const char* ifacename, int ifindex, const char* addr, unsigned long pref, unsigned long valid, int prefixLength); extern int ipaddr_update(const char* ifacename, int ifindex, const char* addr, unsigned long pref, unsigned long valid, int prefixLength); extern int ipaddr_del(const char* ifacename, int ifindex, const char* addr, int prefixLength); /* add socket to interface */ extern int sock_add(char* ifacename,int ifaceid, char* addr, int port, int thisifaceonly, int reuse); extern int sock_del(int fd); extern int sock_send(int fd, char* addr, char* buf, int buflen, int port, int iface); extern int sock_recv(int fd, char* myPlainAddr, char* peerPlainAddr, char* buf, int buflen); /** @brief gets MAC address from the specified IPv6 address * * This is called immediately after we received message from that address, * so the neighbor cache is guaranteed to have entry for it. This is highly * os specific * * @param iface_name network interface name * @param ifindex network interface index * @param v6addr text represenation of the IPv6 address * @param mac pointer to MAC buffer (length specified in mac_len) * @param mac_len specifies MAC buffer length. Must be set so number of bytes set by the function * * @return 0 if successful, negative values if there are errors */ extern int get_mac_from_ipv6(const char* iface_name, int ifindex, const char* v6addr, char* mac, int* mac_len); /* pack/unpack address */ extern void print_packed(char addr[]); extern int inet_pton6(const char* src, char* dst); extern char * inet_ntop4(const char* src, char* dst); extern char * inet_ntop6(const char* src, char* dst); extern void print_packed(char * addr); extern void doRevDnsAddress( char * src, char *dst); extern void doRevDnsZoneRoot( char * src, char * dst, int lenght); extern void truncatePrefixFromConfig( char * src, char * dst, char lenght); extern int is_addr_tentative(char* ifacename, int iface, char* plainAddr); extern void link_state_change_init(volatile struct link_state_notify_t * changed_links, volatile int * notify); extern void link_state_change_cleanup(); extern void microsleep(int microsecs); extern char * error_message(); /* options */ extern int dns_add(const char* ifname, int ifindex, const char* addrPlain); extern int dns_del(const char* ifname, int ifindex, const char* addrPlain); extern int domain_add(const char* ifname, int ifindex, const char* domain); extern int domain_del(const char* ifname, int ifindex, const char* domain); extern int ntp_add(const char* ifname, int ifindex, const char* addrPlain); extern int ntp_del(const char* ifname, int ifindex, const char* addrPlain); extern int timezone_set(const char* ifname, int ifindex, const char* timezone); extern int timezone_del(const char* ifname, int ifindex, const char* timezone); extern int sipserver_add(const char* ifname, int ifindex, const char* addrPlain); extern int sipserver_del(const char* ifname, int ifindex, const char* addrPlain); extern int sipdomain_add(const char* ifname, int ifindex, const char* domain); extern int sipdomain_del(const char* ifname, int ifindex, const char* domain); extern int nisserver_add(const char* ifname, int ifindex, const char* addrPlain); extern int nisserver_del(const char* ifname, int ifindex, const char* addrPlain); extern int nisdomain_set(const char* ifname, int ifindex, const char* domain); extern int nisdomain_del(const char* ifname, int ifindex, const char* domain); extern int nisplusserver_add(const char* ifname, int ifindex, const char* addrPlain); extern int nisplusserver_del(const char* ifname, int ifindex, const char* addrPlain); extern int nisplusdomain_set(const char* ifname, int ifindex, const char* domain); extern int nisplusdomain_del(const char* ifname, int ifindex, const char* domain); extern int prefix_add(const char* ifname, int ifindex, const char* prefixPlain, int prefixLength, unsigned long prefered, unsigned long valid); extern int prefix_update(const char* ifname, int ifindex, const char* prefixPlain, int prefixLength, unsigned long prefered, unsigned long valid); extern int prefix_del(const char* ifname, int ifindex, const char* prefixPlain, int prefixLength); char * getAAAKey(uint32_t SPI, uint32_t *len); /* reads AAA key from a file */ char * getAAAKeyFilename(uint32_t SPI); /* which file? use this function to find out */ uint32_t getAAASPIfromFile(); int execute(const char *filename, const char * argv[], const char *env[]); /** @brief fills specified buffer with random data * @param buffer random data will be written here * @param len length of the buffer */ void fill_random(uint8_t* buffer, int len); /** @brief returns host name of this host * * @param hostname buffer (hostname will be stored here) * @param hostname_len length of the buffer * @return LOWLEVEL_NO_ERROR if successful, appropriate LOWLEVEL_ERROR_* otherwise */ int get_hostname(char* hostname, int hostname_len); #ifdef __cplusplus } #endif #ifdef LINUX #ifdef DEBUG void print_trace(void); #endif #endif #endif dibbler-1.0.1/Misc/KeyList.cpp0000644000175000017500000000412712277722750013037 00000000000000/* * Dibbler - a portable DHCPv6 * * author : Michal Kowalczuk * changes: Tomasz Mrugalski * * released under GNU GPL v2 only licence * */ #include "KeyList.h" #include "Logger.h" #include KeyList::~KeyList() { KeyListElement * tmp1 = beginning, * tmp2; while(tmp1) { tmp2 = tmp1; tmp1 = tmp1->next; delete tmp2->AuthInfoKey; delete tmp2; } } void KeyList::Add(uint32_t SPI, uint32_t AAASPI, char * AuthInfoKey) { char buf[100]; sprintf(buf, "Auth: Key (SPI: 0x%8.8x, AAASPI: 0x%8.8x, pointer: %p) added to keylist.", SPI, AAASPI, AuthInfoKey); Log(Debug) << buf << LogEnd; if (AuthInfoKey == NULL) { Log(Error) << "Auth: AuthInfoKey is NULL. Probably internal error." << LogEnd; return; } KeyListElement * act = beginning; KeyListElement * act2 = NULL; while (act) { if (act->SPI == SPI) { Log(Debug) << "Auth: Strange, SPI already exists in KeyList" << LogEnd; return; } act2 = act; act = act->next; } KeyListElement * new_el = new KeyListElement; new_el->SPI = SPI; new_el->AAASPI = AAASPI; new_el->AuthInfoKey = new char[AUTHKEYLEN]; memcpy(new_el->AuthInfoKey, AuthInfoKey, AUTHKEYLEN); new_el->next = NULL; if (act2) act2->next = new_el; else beginning = new_el; } char * KeyList::Get(uint32_t SPI) { KeyListElement * tmp = beginning; while (tmp) { if (tmp->SPI == SPI) return tmp->AuthInfoKey; tmp = tmp->next; } Log(Warning) << "Auth: Required key (SPI=" << SPI << ") not found." << LogEnd; return NULL; } void KeyList::Del(uint32_t SPI) { KeyListElement * tmp = beginning, * prev = NULL; while (tmp) { if (tmp->SPI == SPI) { if (prev) prev->next = tmp->next; else beginning = tmp->next; delete tmp->AuthInfoKey; delete tmp; return; } prev = tmp; tmp = tmp->next; } } dibbler-1.0.1/Misc/hex.h0000644000175000017500000000103012277722750011672 00000000000000/* * Dibbler - a portable DHCPv6 * * authors: Tomasz Mrugalski * * Released under GNU GPL v2 licence * */ #ifndef HEX_H #define HEX_H #include #include #include std::vector textToHex(std::string buf); std::string hexToText(const uint8_t* buf, size_t buf_len, bool add_colons = false, bool add_0x = false); std::string hexToText(const std::vector& vector, bool add_colons = false, bool add_0x = false); #endif dibbler-1.0.1/Misc/SmartPtr.h0000664000175000017500000001052412560471634012671 00000000000000/* * Dibbler - a portable DHCPv6 * * authors: Tomasz Mrugalski * Marek Senderski * * Released under GNU GPL v2 licence * */ #ifndef SPtr_H #define SPtr_H #include //Don't use this class alone, it's used only in casting //one smartpointer to another smartpointer //e.g. //SPtr a(new a()); SPtr b(new(b)); a=b; class Ptr { public: //constructor used in case of NULL SPtr Ptr() { ptr = NULL; refcount = 1; } //Constructor used in case of non NULL SPtr Ptr(void* object) { ptr = object; refcount = 1; } ~Ptr() { } int refcount; //refrence counter void * ptr; //pointer to the real object }; template class SPtr { public: SPtr(); SPtr(T* something); SPtr(Ptr* voidptr) { if(voidptr) { ptr = voidptr; ptr->refcount++; } else { ptr = new Ptr(); } } SPtr(const SPtr& ref); SPtr& operator=(const SPtr& old); /// @brief Resets a pointer (essentially assign NULL value) void reset() { decrease_reference(); ptr = new Ptr(); } /// @brief re-sets the pointer to point to the new object /// /// @param obj pointer to the new object (may be NULL) void reset(T* obj) { decrease_reference(); ptr = new Ptr(obj); } /// @brief Returns pointer to the underlying object /// /// @todo Is this really used? /// /// @return raw pointer to the object operator Ptr*() { if (ptr->ptr) return ptr; else return (Ptr*)NULL; } operator const Ptr*() const { if (ptr->ptr) return ptr; else return (Ptr*)NULL; } int refCount(); ~SPtr(); T& operator*() const; T* operator->() const; const T* get() const; /// @brief Attempts to dynamic cast to SmartPtr /// @tparam to derived class /// @return SmartPtr to the derived class (or NULL if cast failed) template SPtr dynamic_pointer_cast() { // Null pointer => return null pointer, too. if (ptr->ptr == NULL) { return SPtr(); } // Try to dynamic cast the underlying pointer. to* tmp = dynamic_cast( static_cast(ptr->ptr) ); if (tmp) { // Cast was successful? Then return SmartPtr of the derived type return SPtr(ptr); } else { // Cast failed? Ok, incorrect type. Return null return SPtr(); } } private: void decrease_reference(); Ptr * ptr; }; template void SPtr::decrease_reference() { if (!(--(ptr->refcount))) { if (ptr->ptr) { delete (T*)(ptr->ptr); } delete ptr; } } template SPtr::SPtr() { ptr = new Ptr(); } template int SPtr::refCount() { if (ptr) { return ptr->refcount; } return 0; } template SPtr::SPtr(T* something) { ptr = new Ptr(something); } template SPtr::SPtr(const SPtr& old) { // #include // std::cout << "### Copy constr " << typeid(T).name() << std::endl; old.ptr->refcount++; ptr = old.ptr; // This doesn't make sense. It just copies value to itself ptr->refcount = old.ptr->refcount; } template SPtr::~SPtr() { decrease_reference(); } template T& SPtr::operator*() const { return *((T*)(ptr->ptr)); //it can return NULL } template T* SPtr::operator->() const { if (!ptr) { return 0; } return (T*)(ptr->ptr); //it can return NULL } template const T* SPtr::get() const { if (!ptr) { return 0; } return (T*)(ptr->ptr); } template SPtr& SPtr::operator=(const SPtr& old) { if (this==&old) return *this; // If this pointer points to something... if (this->ptr) { if(!(--this->ptr->refcount)) { if (this->ptr->ptr) { // delete the object itself delete (T*)(this->ptr->ptr); } // now delete its reference delete this->ptr; this->ptr = NULL; } } this->ptr=old.ptr; old.ptr->refcount++; return *this; } #endif dibbler-1.0.1/Misc/sha256.h0000664000175000017500000000672212233256142012122 00000000000000/* Declarations of functions and data types used for SHA256 and SHA224 sum library functions. Copyright (C) 2005, 2006 Free Software Foundation, Inc. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ /* This file is taken from coreutils-6.2 (lib/sha256.h) and adapted for dibbler * by Michal Kowalczuk */ #ifndef SHA256_H # define SHA256_H 1 # include # include #ifdef __cplusplus extern "C" { #endif #define SHA224_BLOCKSIZE 64 #define SHA224_DIGESTSIZE 28 #define SHA256_BLOCKSIZE 64 #define SHA256_DIGESTSIZE 32 /* Structure to save state of computation between the single steps. */ struct sha256_ctx { uint32_t state[8]; uint32_t total[2]; uint32_t buflen; uint32_t buffer[32]; }; /* Initialize structure containing state of computation. */ extern void sha256_init_ctx (struct sha256_ctx *ctx); extern void sha224_init_ctx (struct sha256_ctx *ctx); /* Starting with the result of former calls of this function (or the initialization function update the context for the next LEN bytes starting at BUFFER. It is necessary that LEN is a multiple of 64!!! */ extern void sha256_process_block (const void *buffer, size_t len, struct sha256_ctx *ctx); /* Starting with the result of former calls of this function (or the initialization function update the context for the next LEN bytes starting at BUFFER. It is NOT required that LEN is a multiple of 64. */ extern void sha256_process_bytes (const void *buffer, size_t len, struct sha256_ctx *ctx); /* Process the remaining bytes in the buffer and put result from CTX in first 32 (28) bytes following RESBUF. The result is always in little endian byte order, so that a byte-wise output yields to the wanted ASCII representation of the message digest. IMPORTANT: On some systems it is required that RESBUF be correctly aligned for a 32 bits value. */ extern void *sha256_finish_ctx (struct sha256_ctx *ctx, void *resbuf); extern void *sha224_finish_ctx (struct sha256_ctx *ctx, void *resbuf); /* Put result from CTX in first 32 (28) bytes following RESBUF. The result is always in little endian byte order, so that a byte-wise output yields to the wanted ASCII representation of the message digest. IMPORTANT: On some systems it is required that RESBUF is correctly aligned for a 32 bits value. */ extern void *sha256_read_ctx (const struct sha256_ctx *ctx, void *resbuf); extern void *sha224_read_ctx (const struct sha256_ctx *ctx, void *resbuf); /* Compute SHA256 (SHA224) message digest for LEN bytes beginning at BUFFER. The result is always in little endian byte order, so that a byte-wise output yields to the wanted ASCII representation of the message digest. */ extern void *sha256_buffer (const char *buffer, size_t len, void *resblock); #ifdef __cplusplus } #endif #endif dibbler-1.0.1/Misc/DHCPClient.cpp0000644000175000017500000001331712277722750013331 00000000000000/* * Dibbler - a portable DHCPv6 * * authors: Tomasz Mrugalski * Marek Senderski * * released under GNU GPL v2 only licence * */ #include #include #include "SmartPtr.h" #include "DHCPClient.h" #include "ClntTransMgr.h" #include "IfaceMgr.h" #include "ClntIfaceMgr.h" #include "Logger.h" #include "Portable.h" using namespace std; volatile int serviceShutdown; volatile int linkstateChange; TDHCPClient::TDHCPClient(const std::string& config) :IsDone_(false) { serviceShutdown = 0; linkstateChange = 0; srand((uint32_t)time(NULL)); TClntIfaceMgr::instanceCreate(CLNTIFACEMGR_FILE); if ( ClntIfaceMgr().isDone() ) { Log(Crit) << "Fatal error during IfaceMgr initialization." << LogEnd; IsDone_ = true; return; } TClntCfgMgr::instanceCreate(config); if ( ClntCfgMgr().isDone() ) { Log(Crit) << "Fatal error during CfgMgr initialization." << LogEnd; IsDone_ = true; return; } TClntAddrMgr::instanceCreate(ClntCfgMgr().getDUID(), ClntCfgMgr().useConfirm(), CLNTADDRMGR_FILE, false); if ( ClntAddrMgr().isDone() ) { Log(Crit) << "Fatal error during AddrMgr initialization." << LogEnd; IsDone_ = true; return; } TClntTransMgr::instanceCreate(CLNTTRANSMGR_FILE); if ( TClntTransMgr::instance().isDone() ) { Log(Crit) << "Fatal error during TransMgr initialization." << LogEnd; IsDone_ = true; return; } if ( !ClntTransMgr().sanitizeAddrDB() ) { Log(Crit) << "Loaded address database failed sanitization checks." << LogEnd; IsDone_ = true; return; } if (ClntCfgMgr().useConfirm()) initLinkStateChange(); else Log(Debug) << "Confirm disabled, skipping link change detection." << LogEnd; } /** * initializes low-level link state change detection mechanism * */ void TDHCPClient::initLinkStateChange() { // Log(Debug) << "LinkState change detection not fully supported (disabled for now)." << LogEnd; // return; // disable this for now memset((void*)&this->linkstates, 0, sizeof(linkstates)); ClntCfgMgr().firstIface(); SPtr iface; Log(Debug) << "Initialising link-state detection for interfaces: "; while (iface = ClntCfgMgr().getIface()) { linkstates.ifindex[linkstates.cnt++] = iface->getID(); Log(Cont) << iface->getFullName() << " "; } Log(Cont) << LogEnd; link_state_change_init(&linkstates, &linkstateChange); } void TDHCPClient::stop() { serviceShutdown = 1; #ifdef MOD_CLNT_CONFIRM if (ClntCfgMgr().useConfirm()) link_state_change_cleanup(); #endif #ifdef WIN32 // just to break select() in WIN32 systems if (ClntTransMgr().getCtrlIface() < 0) { return; // no interfaces configured yet } SPtr iface = ClntIfaceMgr().getIfaceByID(ClntTransMgr().getCtrlIface()); Log(Warning) << "Sending SHUTDOWN packet on the " << iface->getName() << "/" << iface->getID() << " (addr=" << ClntTransMgr().getCtrlAddr() << ")." << LogEnd; int fd = sock_add("", ClntTransMgr().getCtrlIface(),"::",0,true, false); char buf = CONTROL_MSG; int cnt = sock_send(fd,ClntTransMgr().getCtrlAddr(),&buf,1,DHCPCLIENT_PORT,ClntTransMgr().getCtrlIface()); if (cnt<0) { Log(Error) << "Failed to send shutdown command" << LogEnd; exit(EXIT_FAILURE); } sock_del(fd); #endif } /* Function removed. Please use link_state_changed() instead */ /* void TDHCPClient::changeLinkstate(int iface_id) */ void TDHCPClient::resetLinkstate() { linkstates.cnt = 0; for (int i = 0; i iface = ClntIfaceMgr().getIfaceByID(ClntTransMgr().getCtrlIface()); return iface->getName(); ; } void TDHCPClient::run() { SPtr msg; while ( (!this->isDone()) && !ClntTransMgr().isDone() ) { if (serviceShutdown) ClntTransMgr().shutdown(); #ifdef MOD_CLNT_CONFIRM if (linkstateChange) { ClntAddrMgr().setIA2Confirm(&linkstates); this->resetLinkstate(); } #endif ClntTransMgr().doDuties(); unsigned int timeout = ClntTransMgr().getTimeout(); if (timeout == 0) timeout = 1; Log(Debug) << "Sleeping for " << timeout << " second(s)." << LogEnd; SPtr msg=ClntIfaceMgr().select(timeout); if (msg) { int iface = msg->getIface(); SPtr ptrIface; ptrIface = ClntIfaceMgr().getIfaceByID(iface); Log(Info) << "Received " << msg->getName() << " on " << ptrIface->getName() << "/" << iface << hex << ",trans-id=0x" << msg->getTransID() << dec << ", " << msg->countOption() << " opts:"; SPtr ptrOpt; msg->firstOption(); while (ptrOpt = msg->getOption() ) Log(Cont) << " " << ptrOpt->getOptType(); Log(Cont) << LogEnd; ClntTransMgr().relayMsg(msg); } } Log(Notice) << "Bye bye." << LogEnd; } bool TDHCPClient::isDone() const { return IsDone_; } bool TDHCPClient::checkPrivileges() { /// @todo: check privileges return true; } void TDHCPClient::setWorkdir(const std::string& workdir) { ClntCfgMgr().setWorkdir(workdir); ClntCfgMgr().dump(); } TDHCPClient::~TDHCPClient() { } dibbler-1.0.1/Misc/sha1.h0000664000175000017500000000564012233256142011744 00000000000000/* Declarations of functions and data types used for SHA1 sum library functions. Copyright (C) 2000, 2001, 2003, 2005, 2006 Free Software Foundation, Inc. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ /* This file is taken from coreutils-6.2 (lib/sha1.h) and adapted for dibbler * by Michal Kowalczuk */ #ifndef SHA1_H # define SHA1_H 1 # include # include #ifdef __cplusplus extern "C" { #endif #define SHA1_BLOCKSIZE 64 #define SHA1_DIGESTSIZE 20 /* Structure to save state of computation between the single steps. */ struct sha1_ctx { uint32_t A; uint32_t B; uint32_t C; uint32_t D; uint32_t E; uint32_t total[2]; uint32_t buflen; uint32_t buffer[32]; }; /* Initialize structure containing state of computation. */ extern void sha1_init_ctx (struct sha1_ctx *ctx); /* Starting with the result of former calls of this function (or the initialization function update the context for the next LEN bytes starting at BUFFER. It is necessary that LEN is a multiple of 64!!! */ extern void sha1_process_block (const void *buffer, size_t len, struct sha1_ctx *ctx); /* Starting with the result of former calls of this function (or the initialization function update the context for the next LEN bytes starting at BUFFER. It is NOT required that LEN is a multiple of 64. */ extern void sha1_process_bytes (const void *buffer, size_t len, struct sha1_ctx *ctx); /* Process the remaining bytes in the buffer and put result from CTX in first 20 bytes following RESBUF. The result is always in little endian byte order, so that a byte-wise output yields to the wanted ASCII representation of the message digest. IMPORTANT: On some systems it is required that RESBUF be correctly aligned for a 32 bits value. */ extern void *sha1_finish_ctx (struct sha1_ctx *ctx, void *resbuf); /* Put result from CTX in first 20 bytes following RESBUF. The result is always in little endian byte order, so that a byte-wise output yields to the wanted ASCII representation of the message digest. IMPORTANT: On some systems it is required that RESBUF is correctly aligned for a 32 bits value. */ extern void *sha1_read_ctx (const struct sha1_ctx *ctx, void *resbuf); #ifdef __cplusplus } #endif #endif dibbler-1.0.1/Misc/IPv6Addr.cpp0000644000175000017500000002052012420536551013015 00000000000000/* * Dibbler - a portable DHCPv6 * * authors: Tomasz Mrugalski * Marek Senderski * * released under GNU GPL v2 only licence * */ #include #include #include #include #include "IPv6Addr.h" #include "Portable.h" #include "Logger.h" static unsigned char truncLeft[] = { 0xff, 0x7f, 0x3f, 0x1f, 0xf, 0x7, 0x3, 0x1, 0 }; static unsigned char truncRight[]= { 0, 0x80, 0xc0, 0xe0, 0xf0, 0xf8, 0xfc, 0xfe, 0xff }; TIPv6Addr::TIPv6Addr() { memset(Addr,0,16); inet_ntop6(Addr,Plain); } TIPv6Addr::TIPv6Addr(const char* addr, bool plain) { if (plain) { strncpy(Plain,addr, sizeof(Plain)); inet_pton6(Plain,Addr); } else { memcpy(Addr,addr,16); inet_ntop6(Addr,Plain); } } TIPv6Addr::TIPv6Addr(const char* prefix, const char* host, int prefixLength) { int offset = prefixLength/8; if (prefixLength%8==0) { memmove(Addr, host, 16); memmove(Addr, prefix, offset); inet_ntop6(Addr, Plain); return; } memmove(Addr, host, 16); // copy whole host address, but... memmove(Addr, prefix, offset); // overwrite first bits with prefix... Addr[offset] = (prefix[offset] & truncRight[prefixLength%8]) | (host[offset] & truncLeft[prefixLength%8]); inet_ntop6(Addr, Plain); } bool TIPv6Addr::linkLocal() { if (this->Addr[0]==0xfe && this->Addr[1]==0x80) return true; return false; } bool TIPv6Addr::multicast() { return Addr[0] == 0xff; } char* TIPv6Addr::getAddr() { return Addr; } char* TIPv6Addr::getPlain() { inet_ntop6(Addr, Plain); return Plain; } void TIPv6Addr::setAddr(char* addr) { memcpy(Addr,addr,16); inet_ntop6(Addr,Plain); } char* TIPv6Addr::storeSelf(char *buf) { memcpy(buf,this->Addr,16); return buf+16; } bool TIPv6Addr::operator==(const TIPv6Addr &other) { return !memcmp(this->Addr,other.Addr,16); } bool TIPv6Addr::operator!=(const TIPv6Addr &other) { return memcmp(this->Addr,other.Addr,16); } void TIPv6Addr::truncate(int minPrefix, int maxPrefix) { if (minPrefix>128 || minPrefix<0 || maxPrefix>128 || maxPrefix<0) { Log(Error) << "Unable to truncate address: invalid prefix lengths: minPrefix=" << minPrefix << ", maxPrefix=" << maxPrefix << LogEnd; return; } // truncating from the left int x = minPrefix/8; memset(this->Addr, 0, x); if (minPrefix%8) { this->Addr[x] = this->Addr[x] & truncLeft[minPrefix%8]; } // truncating from the right x = maxPrefix/8; if (maxPrefix%8) x++; memset(this->Addr+x, 0, 16-x); if (maxPrefix%8) { x = maxPrefix/8; this->Addr[x] = this->Addr[x] & truncRight[maxPrefix%8]; } // update plain form inet_ntop6(Addr,Plain); } std::ostream& operator<<(std::ostream& out,TIPv6Addr& addr) { char buf[48]; inet_ntop6(addr.Addr, buf); out << buf; return out; } bool TIPv6Addr::operator<=(const TIPv6Addr &other) { for (int i=0;i<16;i++) { if (Addr[i]other.Addr[i]) return false; } return true; //hmm: are they equal } TIPv6Addr TIPv6Addr::operator-(const TIPv6Addr &other) { char result[16]; memset(result,0,16); char carry=0; for (int i=15;i>=0;i--) { unsigned int left=Addr[i]; unsigned int right=other.Addr[i]; if(left>=(right+carry)) { result[i]=left-other.Addr[i]-carry; carry=0; } else { result[i]=Addr[i]+256-other.Addr[i]-carry; carry=1; } } return TIPv6Addr(result); } TIPv6Addr TIPv6Addr::operator+(const TIPv6Addr &other) { char result[16]; memset(result,0,16); unsigned int carry=0; for (int i=15;i>=0;i--) { unsigned int left=Addr[i]; unsigned int right=other.Addr[i]; if(left+right+carry>255) { result[i]=char (left+right+carry-256); carry=1; } else { result[i]=left+right+carry; carry=0; } } return TIPv6Addr(result); } /** * Decreases randomly an address * * * @return */ TIPv6Addr& TIPv6Addr::operator--() { //#define ALGO_ANIA //#define OLD_CRAPPY_CODE //#define NEW_CRAPPY_CODE #define NEW_AWESOME_CODE #ifdef ALGO_ANIA // Start with first non-zero most significant byte. // For i-th byte randomize a value from 0..Addr[i] // If randomized value equals i-th (randomized max allowed // value, then continue) // If randomized value is smaller than i-th byte, then // all following bytes are random. // // Issue: for 1:: half of the addresses are 1:: bool any = false; // insert any (0-255) value? for (int i=0; i<16; ++i) { if (!any) { // Let's search for first non-zero byte if (Addr[i] == 0) continue; // let's random a number from 0 to Addr[i] uint8_t x = random()%( (uint16_t)(Addr[i]) + 1); if (x < Addr[i]) { Addr[i] = x; // decrease this byte any = true; // next bytes are random } } else { // Completely random value Addr[i] = random() % 256; } } #endif #ifdef OLD_CRAPPY_CODE for (int i=15;i>=0;i--) { int j=i-1; while((j>=0)&&(!Addr[j])) j--; int r; if (j>0) r=rand()%256; else r=rand()%(Addr[i]+1); if (r>Addr[i]) { Addr[j]--; for(j++;j=0; --i) { int j=i-1; while( (j>=0) && (!Addr[j])) j--; if (j == i - 1) { // this is the last non-zero byte Addr[i] = random()%(Addr[i] + 1); } else { } if (j < 0) { // there are no non-zero bytes left of current position // If i-th address is non-zero, let's decrease it randomly if (Addr[i]) { Addr[i] = rand()%(Addr[i] + 1); } return *this; } // Let's decrease this byte by a random value int16_t r = random()%256; // we try to decrease n-th byte by value greater than that byte, // so we need to borrow from n-1-th byte j = i; while (r > Addr[i] && j>=0) { // Borrow one from the next byte (it becomes 256 in this byte) Addr[j] = static_cast( (int16_t)(256) + (int16_t)(Addr[i]) - r); r = 1; // subtract from the next j--; } if (j >= 0) { Addr[j] = Addr[j] - (uint8_t)(r); // decrease this byte } } #endif #ifdef NEW_AWESOME_CODE int j = 0; // j - the most significant non-zero byte for (j = 0; j<15; j++) { if (Addr[j]) break; } uint8_t b = 0; // Borrow from the next byte // Let's iterate over all octects, starting with the least significant for (int i=15; i>=0; --i) { // Did we underflow (subtract below zero) this byte? if (Addr[i] < b) { // Yes - borrow 256 from the next byte Addr[i] = Addr[i] - b; b = 1; } else { // No - we don't need to borrow anything Addr[i] = Addr[i] - b; b = 0; } if (j == i) { // this is the last non-zero byte unsigned int div = (unsigned int)(Addr[i]) + 1; Addr[i] = rand()%(div); return *this; } // Let's decrease this byte by a random value short int r = rand() % 256; // Do we need to borrow 256 from the next byte? b += (r > Addr[i]); r = (uint8_t)(-r + 256 + Addr[i]); Addr[i] = (uint8_t)(r); } #endif return *this; } /// @brief increases address by one /// TIPv6Addr& TIPv6Addr::operator++() { int carry = 1; for (int i=15; i>=0; i--) { carry = (Addr[i] == 255); Addr[i]++; if (!carry) return *this; } return *this; } dibbler-1.0.1/Misc/sha256.c0000664000175000017500000004271412233256142012116 00000000000000/* sha256.c - Functions to compute SHA256 and SHA224 message digest of files or memory blocks according to the NIST specification FIPS-180-2. Copyright (C) 2005, 2006 Free Software Foundation, Inc. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ /* Written by David Madore, considerably copypasting from Scott G. Miller's sha1.c */ /* This file is taken from coreutils-6.2 (lib/sha256.c) and adapted for dibbler * by Michal Kowalczuk changes: Tomasz Mrugalski */ #include "dibbler-config.h" #include "sha256.h" #include #include #ifdef WIN32 # define SWAP(n) \ (((n) << 24) | (((n) & 0xff00) << 8) | (((n) >> 8) & 0xff00) | ((n) >> 24)) #else #if defined( WORDS_BIGENDIAN) # define SWAP(n) (n) #else # define SWAP(n) \ (((n) << 24) | (((n) & 0xff00) << 8) | (((n) >> 8) & 0xff00) | ((n) >> 24)) #endif #endif #define BLOCKSIZE 4096 #if BLOCKSIZE % 64 != 0 # error "invalid BLOCKSIZE" #endif /* This array contains the bytes used to pad the buffer to the next 64-byte boundary. */ static const unsigned char fillbuf[64] = { 0x80, 0 /* , 0, 0, ... */ }; /* Takes a pointer to a 256 bit block of data (eight 32 bit ints) and intializes it to the start constants of the SHA256 algorithm. This must be called before using hash in the call to sha256_hash */ void sha256_init_ctx (struct sha256_ctx *ctx) { ctx->state[0] = 0x6a09e667UL; ctx->state[1] = 0xbb67ae85UL; ctx->state[2] = 0x3c6ef372UL; ctx->state[3] = 0xa54ff53aUL; ctx->state[4] = 0x510e527fUL; ctx->state[5] = 0x9b05688cUL; ctx->state[6] = 0x1f83d9abUL; ctx->state[7] = 0x5be0cd19UL; ctx->total[0] = ctx->total[1] = 0; ctx->buflen = 0; } void sha224_init_ctx (struct sha256_ctx *ctx) { ctx->state[0] = 0xc1059ed8UL; ctx->state[1] = 0x367cd507UL; ctx->state[2] = 0x3070dd17UL; ctx->state[3] = 0xf70e5939UL; ctx->state[4] = 0xffc00b31UL; ctx->state[5] = 0x68581511UL; ctx->state[6] = 0x64f98fa7UL; ctx->state[7] = 0xbefa4fa4UL; ctx->total[0] = ctx->total[1] = 0; ctx->buflen = 0; } /* Put result from CTX in first 32 bytes following RESBUF. The result must be in little endian byte order. IMPORTANT: On some systems it is required that RESBUF is correctly aligned for a 32-bit value. */ void * sha256_read_ctx (const struct sha256_ctx *ctx, void *resbuf) { int i; for (i = 0; i < 8; i++) ((uint32_t *) resbuf)[i] = SWAP (ctx->state[i]); return resbuf; } void * sha224_read_ctx (const struct sha256_ctx *ctx, void *resbuf) { int i; for (i = 0; i < 7; i++) ((uint32_t *) resbuf)[i] = SWAP (ctx->state[i]); return resbuf; } /* Process the remaining bytes in the internal buffer and the usual prolog according to the standard and write the result to RESBUF. IMPORTANT: On some systems it is required that RESBUF is correctly aligned for a 32-bit value. */ static void sha256_conclude_ctx (struct sha256_ctx *ctx) { /* Take yet unprocessed bytes into account. */ uint32_t bytes = ctx->buflen; size_t size = (bytes < 56) ? 64 / 4 : 64 * 2 / 4; /* Now count remaining bytes. */ ctx->total[0] += bytes; if (ctx->total[0] < bytes) ++ctx->total[1]; /* Put the 64-bit file length in *bits* at the end of the buffer. */ ctx->buffer[size - 2] = SWAP ((ctx->total[1] << 3) | (ctx->total[0] >> 29)); ctx->buffer[size - 1] = SWAP (ctx->total[0] << 3); memcpy (&((char *) ctx->buffer)[bytes], fillbuf, (size - 2) * 4 - bytes); /* Process last bytes. */ sha256_process_block (ctx->buffer, size * 4, ctx); } void * sha256_finish_ctx (struct sha256_ctx *ctx, void *resbuf) { sha256_conclude_ctx (ctx); return sha256_read_ctx (ctx, resbuf); } void * sha224_finish_ctx (struct sha256_ctx *ctx, void *resbuf) { sha256_conclude_ctx (ctx); return sha224_read_ctx (ctx, resbuf); } #if 0 /* Compute SHA256 message digest for bytes read from STREAM. The resulting message digest number will be written into the 32 bytes beginning at RESBLOCK. */ int sha256_stream (FILE *stream, void *resblock) { struct sha256_ctx ctx; size_t sum; char *buffer = malloc (BLOCKSIZE + 72); if (!buffer) return 1; /* Initialize the computation context. */ sha256_init_ctx (&ctx); /* Iterate over full file contents. */ while (1) { /* We read the file in blocks of BLOCKSIZE bytes. One call of the computation function processes the whole buffer so that with the next round of the loop another block can be read. */ size_t n; sum = 0; /* Read block. Take care for partial reads. */ while (1) { n = fread (buffer + sum, 1, BLOCKSIZE - sum, stream); sum += n; if (sum == BLOCKSIZE) break; if (n == 0) { /* Check for the error flag IFF N == 0, so that we don't exit the loop after a partial read due to e.g., EAGAIN or EWOULDBLOCK. */ if (ferror (stream)) { free (buffer); return 1; } goto process_partial_block; } /* We've read at least one byte, so ignore errors. But always check for EOF, since feof may be true even though N > 0. Otherwise, we could end up calling fread after EOF. */ if (feof (stream)) goto process_partial_block; } /* Process buffer with BLOCKSIZE bytes. Note that BLOCKSIZE % 64 == 0 */ sha256_process_block (buffer, BLOCKSIZE, &ctx); } process_partial_block:; /* Process any remaining bytes. */ if (sum > 0) sha256_process_bytes (buffer, sum, &ctx); /* Construct result in desired memory. */ sha256_finish_ctx (&ctx, resblock); free (buffer); return 0; } /* @todo: Avoid code duplication */ int sha224_stream (FILE *stream, void *resblock) { struct sha256_ctx ctx; size_t sum; char *buffer = malloc (BLOCKSIZE + 72); if (!buffer) return 1; /* Initialize the computation context. */ sha224_init_ctx (&ctx); /* Iterate over full file contents. */ while (1) { /* We read the file in blocks of BLOCKSIZE bytes. One call of the computation function processes the whole buffer so that with the next round of the loop another block can be read. */ size_t n; sum = 0; /* Read block. Take care for partial reads. */ while (1) { n = fread (buffer + sum, 1, BLOCKSIZE - sum, stream); sum += n; if (sum == BLOCKSIZE) break; if (n == 0) { /* Check for the error flag IFF N == 0, so that we don't exit the loop after a partial read due to e.g., EAGAIN or EWOULDBLOCK. */ if (ferror (stream)) { free (buffer); return 1; } goto process_partial_block; } /* We've read at least one byte, so ignore errors. But always check for EOF, since feof may be true even though N > 0. Otherwise, we could end up calling fread after EOF. */ if (feof (stream)) goto process_partial_block; } /* Process buffer with BLOCKSIZE bytes. Note that BLOCKSIZE % 64 == 0 */ sha256_process_block (buffer, BLOCKSIZE, &ctx); } process_partial_block:; /* Process any remaining bytes. */ if (sum > 0) sha256_process_bytes (buffer, sum, &ctx); /* Construct result in desired memory. */ sha224_finish_ctx (&ctx, resblock); free (buffer); return 0; } #endif /* Compute SHA512 message digest for LEN bytes beginning at BUFFER. The result is always in little endian byte order, so that a byte-wise output yields to the wanted ASCII representation of the message digest. */ void * sha256_buffer (const char *buffer, size_t len, void *resblock) { struct sha256_ctx ctx; /* Initialize the computation context. */ sha256_init_ctx (&ctx); /* Process whole buffer but last len % 64 bytes. */ sha256_process_bytes (buffer, len, &ctx); /* Put result in desired memory area. */ return sha256_finish_ctx (&ctx, resblock); } void * sha224_buffer (const char *buffer, size_t len, void *resblock) { struct sha256_ctx ctx; /* Initialize the computation context. */ sha224_init_ctx (&ctx); /* Process whole buffer but last len % 64 bytes. */ sha256_process_bytes (buffer, len, &ctx); /* Put result in desired memory area. */ return sha224_finish_ctx (&ctx, resblock); } void sha256_process_bytes (const void *buffer, size_t len, struct sha256_ctx *ctx) { /* When we already have some bits in our internal buffer concatenate both inputs first. */ if (ctx->buflen != 0) { size_t left_over = ctx->buflen; size_t add = 128 - left_over > len ? len : 128 - left_over; memcpy (&((char *) ctx->buffer)[left_over], buffer, add); ctx->buflen += add; if (ctx->buflen > 64) { sha256_process_block (ctx->buffer, ctx->buflen & ~63, ctx); ctx->buflen &= 63; /* The regions in the following copy operation cannot overlap. */ memcpy (ctx->buffer, &((char *) ctx->buffer)[(left_over + add) & ~63], ctx->buflen); } buffer = (const char *) buffer + add; len -= add; } /* Process available complete blocks. */ if (len >= 64) { #if !_STRING_ARCH_unaligned # define alignof(type) offsetof (struct { char c; type x; }, x) # define UNALIGNED_P(p) (((size_t) p) % alignof (uint32_t) != 0) if (UNALIGNED_P (buffer)) while (len > 64) { sha256_process_block (memcpy (ctx->buffer, buffer, 64), 64, ctx); buffer = (const char *) buffer + 64; len -= 64; } else #endif { sha256_process_block (buffer, len & ~63, ctx); buffer = (const char *) buffer + (len & ~63); len &= 63; } } /* Move remaining bytes in internal buffer. */ if (len > 0) { size_t left_over = ctx->buflen; memcpy (&((char *) ctx->buffer)[left_over], buffer, len); left_over += len; if (left_over >= 64) { sha256_process_block (ctx->buffer, 64, ctx); left_over -= 64; memcpy (ctx->buffer, &ctx->buffer[16], left_over); } ctx->buflen = left_over; } } /* --- Code below is the primary difference between sha1.c and sha256.c --- */ /* SHA256 round constants */ #define K(I) sha256_round_constants[I] static const uint32_t sha256_round_constants[64] = { 0x428a2f98UL, 0x71374491UL, 0xb5c0fbcfUL, 0xe9b5dba5UL, 0x3956c25bUL, 0x59f111f1UL, 0x923f82a4UL, 0xab1c5ed5UL, 0xd807aa98UL, 0x12835b01UL, 0x243185beUL, 0x550c7dc3UL, 0x72be5d74UL, 0x80deb1feUL, 0x9bdc06a7UL, 0xc19bf174UL, 0xe49b69c1UL, 0xefbe4786UL, 0x0fc19dc6UL, 0x240ca1ccUL, 0x2de92c6fUL, 0x4a7484aaUL, 0x5cb0a9dcUL, 0x76f988daUL, 0x983e5152UL, 0xa831c66dUL, 0xb00327c8UL, 0xbf597fc7UL, 0xc6e00bf3UL, 0xd5a79147UL, 0x06ca6351UL, 0x14292967UL, 0x27b70a85UL, 0x2e1b2138UL, 0x4d2c6dfcUL, 0x53380d13UL, 0x650a7354UL, 0x766a0abbUL, 0x81c2c92eUL, 0x92722c85UL, 0xa2bfe8a1UL, 0xa81a664bUL, 0xc24b8b70UL, 0xc76c51a3UL, 0xd192e819UL, 0xd6990624UL, 0xf40e3585UL, 0x106aa070UL, 0x19a4c116UL, 0x1e376c08UL, 0x2748774cUL, 0x34b0bcb5UL, 0x391c0cb3UL, 0x4ed8aa4aUL, 0x5b9cca4fUL, 0x682e6ff3UL, 0x748f82eeUL, 0x78a5636fUL, 0x84c87814UL, 0x8cc70208UL, 0x90befffaUL, 0xa4506cebUL, 0xbef9a3f7UL, 0xc67178f2UL, }; /* Round functions. */ #define F2(A,B,C) ( ( A & B ) | ( C & ( A | B ) ) ) #define F1(E,F,G) ( G ^ ( E & ( F ^ G ) ) ) /* Process LEN bytes of BUFFER, accumulating context into CTX. It is assumed that LEN % 64 == 0. Most of this code comes from GnuPG's cipher/sha1.c. */ void sha256_process_block (const void *buffer, size_t len, struct sha256_ctx *ctx) { const uint32_t *words = buffer; size_t nwords = len / sizeof (uint32_t); const uint32_t *endp = words + nwords; uint32_t x[16]; uint32_t a = ctx->state[0]; uint32_t b = ctx->state[1]; uint32_t c = ctx->state[2]; uint32_t d = ctx->state[3]; uint32_t e = ctx->state[4]; uint32_t f = ctx->state[5]; uint32_t g = ctx->state[6]; uint32_t h = ctx->state[7]; /* First increment the byte count. FIPS PUB 180-2 specifies the possible length of the file up to 2^64 bits. Here we only compute the number of bytes. Do a double word increment. */ ctx->total[0] += len; if (ctx->total[0] < len) ++ctx->total[1]; #define rol(x, n) (((x) << (n)) | ((x) >> (32 - (n)))) #define S0(x) (rol(x,25)^rol(x,14)^(x>>3)) #define S1(x) (rol(x,15)^rol(x,13)^(x>>10)) #define SS0(x) (rol(x,30)^rol(x,19)^rol(x,10)) #define SS1(x) (rol(x,26)^rol(x,21)^rol(x,7)) #define M(I) ( tm = S1(x[(I-2)&0x0f]) + x[(I-7)&0x0f] \ + S0(x[(I-15)&0x0f]) + x[I&0x0f] \ , x[I&0x0f] = tm ) #define R(A,B,C,D,E,F,G,H,K,M) do { t0 = SS0(A) + F2(A,B,C); \ t1 = H + SS1(E) \ + F1(E,F,G) \ + K \ + M; \ D += t1; H = t0 + t1; \ } while(0) while (words < endp) { uint32_t tm; uint32_t t0, t1; int t; /** @todo: see sha1.c for a better implementation. */ for (t = 0; t < 16; t++) { x[t] = SWAP (*words); words++; } R( a, b, c, d, e, f, g, h, K( 0), x[ 0] ); R( h, a, b, c, d, e, f, g, K( 1), x[ 1] ); R( g, h, a, b, c, d, e, f, K( 2), x[ 2] ); R( f, g, h, a, b, c, d, e, K( 3), x[ 3] ); R( e, f, g, h, a, b, c, d, K( 4), x[ 4] ); R( d, e, f, g, h, a, b, c, K( 5), x[ 5] ); R( c, d, e, f, g, h, a, b, K( 6), x[ 6] ); R( b, c, d, e, f, g, h, a, K( 7), x[ 7] ); R( a, b, c, d, e, f, g, h, K( 8), x[ 8] ); R( h, a, b, c, d, e, f, g, K( 9), x[ 9] ); R( g, h, a, b, c, d, e, f, K(10), x[10] ); R( f, g, h, a, b, c, d, e, K(11), x[11] ); R( e, f, g, h, a, b, c, d, K(12), x[12] ); R( d, e, f, g, h, a, b, c, K(13), x[13] ); R( c, d, e, f, g, h, a, b, K(14), x[14] ); R( b, c, d, e, f, g, h, a, K(15), x[15] ); R( a, b, c, d, e, f, g, h, K(16), M(16) ); R( h, a, b, c, d, e, f, g, K(17), M(17) ); R( g, h, a, b, c, d, e, f, K(18), M(18) ); R( f, g, h, a, b, c, d, e, K(19), M(19) ); R( e, f, g, h, a, b, c, d, K(20), M(20) ); R( d, e, f, g, h, a, b, c, K(21), M(21) ); R( c, d, e, f, g, h, a, b, K(22), M(22) ); R( b, c, d, e, f, g, h, a, K(23), M(23) ); R( a, b, c, d, e, f, g, h, K(24), M(24) ); R( h, a, b, c, d, e, f, g, K(25), M(25) ); R( g, h, a, b, c, d, e, f, K(26), M(26) ); R( f, g, h, a, b, c, d, e, K(27), M(27) ); R( e, f, g, h, a, b, c, d, K(28), M(28) ); R( d, e, f, g, h, a, b, c, K(29), M(29) ); R( c, d, e, f, g, h, a, b, K(30), M(30) ); R( b, c, d, e, f, g, h, a, K(31), M(31) ); R( a, b, c, d, e, f, g, h, K(32), M(32) ); R( h, a, b, c, d, e, f, g, K(33), M(33) ); R( g, h, a, b, c, d, e, f, K(34), M(34) ); R( f, g, h, a, b, c, d, e, K(35), M(35) ); R( e, f, g, h, a, b, c, d, K(36), M(36) ); R( d, e, f, g, h, a, b, c, K(37), M(37) ); R( c, d, e, f, g, h, a, b, K(38), M(38) ); R( b, c, d, e, f, g, h, a, K(39), M(39) ); R( a, b, c, d, e, f, g, h, K(40), M(40) ); R( h, a, b, c, d, e, f, g, K(41), M(41) ); R( g, h, a, b, c, d, e, f, K(42), M(42) ); R( f, g, h, a, b, c, d, e, K(43), M(43) ); R( e, f, g, h, a, b, c, d, K(44), M(44) ); R( d, e, f, g, h, a, b, c, K(45), M(45) ); R( c, d, e, f, g, h, a, b, K(46), M(46) ); R( b, c, d, e, f, g, h, a, K(47), M(47) ); R( a, b, c, d, e, f, g, h, K(48), M(48) ); R( h, a, b, c, d, e, f, g, K(49), M(49) ); R( g, h, a, b, c, d, e, f, K(50), M(50) ); R( f, g, h, a, b, c, d, e, K(51), M(51) ); R( e, f, g, h, a, b, c, d, K(52), M(52) ); R( d, e, f, g, h, a, b, c, K(53), M(53) ); R( c, d, e, f, g, h, a, b, K(54), M(54) ); R( b, c, d, e, f, g, h, a, K(55), M(55) ); R( a, b, c, d, e, f, g, h, K(56), M(56) ); R( h, a, b, c, d, e, f, g, K(57), M(57) ); R( g, h, a, b, c, d, e, f, K(58), M(58) ); R( f, g, h, a, b, c, d, e, K(59), M(59) ); R( e, f, g, h, a, b, c, d, K(60), M(60) ); R( d, e, f, g, h, a, b, c, K(61), M(61) ); R( c, d, e, f, g, h, a, b, K(62), M(62) ); R( b, c, d, e, f, g, h, a, K(63), M(63) ); a = ctx->state[0] += a; b = ctx->state[1] += b; c = ctx->state[2] += c; d = ctx->state[3] += d; e = ctx->state[4] += e; f = ctx->state[5] += f; g = ctx->state[6] += g; h = ctx->state[7] += h; } } dibbler-1.0.1/Misc/Logger.h0000644000175000017500000000275612277722750012345 00000000000000/* * Dibbler - a portable DHCPv6 * * authors: Tomasz Mrugalski * Marek Senderski * changes: Michal Kowalczuk * * Released under GNU GPL v2 only licence * */ #ifndef LOGGER_H #define LOGGER_H #include #include #include "DHCPConst.h" #include #define Log(X) logger :: log##X () #define LogEnd logger :: endl #define LOGMODE_DEFAULT LOGMODE_FULL namespace logger { enum Elogmode { LOGMODE_FULL, LOGMODE_SHORT, LOGMODE_PRECISE, LOGMODE_SYSLOG, /* unix only */ LOGMODE_EVENTLOG /* windows only */ }; std::ostream& logCont(); std::ostream& logEmerg(); std::ostream& logAlert(); std::ostream& logCrit(); std::ostream& logError(); std::ostream& logWarning(); std::ostream& logNotice(); std::ostream& logInfo(); std::ostream& logDebug(); std::ostream & endl (std::ostream & strum); void Initialize(const char * file); void Terminate(); void setLogName(const std::string x); void setLogLevel(int x); void setLogMode(const std::string x); void EchoOff(); void EchoOn(); void setColors(bool colors); std::string getLogName(); int getLogLevel(); } std::string StateToString(EState state); std::string StatusCodeToString(int status); std::string MsgTypeToString(int msgType); // for debugging purposes void PrintHex(const std::string& message, const uint8_t *buf, unsigned len); #endif dibbler-1.0.1/Misc/DHCPRelay.h0000664000175000017500000000100112233256142012606 00000000000000/* * Dibbler - a portable DHCPv6 * * authors: Tomasz Mrugalski * Marek Senderski * * released under GNU GPL v2 licence * */ #ifndef DHCPSERVER_H #define DHCPSERVER_H #include #include class TDHCPRelay { public: TDHCPRelay(const std::string& config); void run(); void stop(); bool isDone(); bool checkPrivileges(); void setWorkdir(std::string workdir); ~TDHCPRelay(); private: bool IsDone; }; #endif dibbler-1.0.1/Misc/DHCPServer.cpp0000644000175000017500000001144212420527372013347 00000000000000/* * Dibbler - a portable DHCPv6 * * authors: Tomasz Mrugalski * Marek Senderski * * released under GNU GPL v2 licence * */ #include "DHCPServer.h" #include "AddrClient.h" #include "Logger.h" #include "SrvIfaceMgr.h" #include "SrvCfgMgr.h" #include "SrvTransMgr.h" using namespace std; volatile int serviceShutdown; TDHCPServer::TDHCPServer(const std::string& config) :IsDone_(false) { serviceShutdown = 0; srand((uint32_t)time(NULL)); TSrvIfaceMgr::instanceCreate(SRVIFACEMGR_FILE); if ( SrvIfaceMgr().isDone() ) { Log(Crit) << "Fatal error during IfaceMgr initialization." << LogEnd; IsDone_ = true; return; } SrvIfaceMgr().dump(); TSrvCfgMgr::instanceCreate(config, SRVCFGMGR_FILE); if ( SrvCfgMgr().isDone() ) { Log(Crit) << "Fatal error during CfgMgr initialization." << LogEnd; IsDone_ = true; return; } SrvCfgMgr().dump(); TSrvAddrMgr::instanceCreate(SRVADDRMGR_FILE, true /*always load DB*/ ); if ( SrvAddrMgr().isDone() ) { Log(Crit) << "Fatal error during AddrMgr initialization." << LogEnd; IsDone_ = true; return; } TSrvTransMgr::instanceCreate(SRVTRANSMGR_FILE, DHCPSERVER_PORT); if ( SrvTransMgr().isDone() ) { Log(Crit) << "Fatal error during TransMgr initialization." << LogEnd; IsDone_ = true; return; } if ( !SrvTransMgr().sanitizeAddrDB() ) { Log(Crit) << "Loaded address database failed sanitization checks." << LogEnd; IsDone_ = true; return; } SrvAddrMgr().dump(); SrvCfgMgr().removeReservedFromCache(); SrvCfgMgr().setCounters(); SrvCfgMgr().dump(); SrvTransMgr().dump(); } void TDHCPServer::run() { Log(Notice) << "Server begins operation." << LogEnd; bool silent = false; while ( (!isDone()) && (!SrvTransMgr().isDone()) ) { if (serviceShutdown) SrvTransMgr().shutdown(); SrvTransMgr().doDuties(); unsigned int timeout = SrvTransMgr().getTimeout(); if (timeout == 0) timeout = 1; if (serviceShutdown) timeout = 0; if (!silent) Log(Notice) << "Accepting connections. Next event in " << timeout << " second(s)." << LogEnd; #ifdef WIN32 // There's no easy way to break select under Windows, so just don't sleep for too long. if (timeout>5) { silent = true; timeout = 5; } #endif SPtr msg=SrvIfaceMgr().select(timeout); if (!msg) continue; silent = false; SPtr physicalIface = SrvIfaceMgr().getIfaceByID(msg->getPhysicalIface()); SPtr logicalIface = SrvCfgMgr().getIfaceByID(msg->getIface()); if (!physicalIface) { Log(Error) << "Received data over unknown physical interface: ifindex=" << msg->getPhysicalIface() << LogEnd; continue; } if (!logicalIface) { Log(Error) << "Received data over unknown logical interface: ifindex=" << msg->getIface() << LogEnd; continue; } Log(Notice) << "Received " << msg->getName() << " on " << physicalIface->getFullName() << hex << ", trans-id=0x" << msg->getTransID() << dec << ", " << msg->countOption() << " opts:"; SPtr ptrOpt; msg->firstOption(); while (ptrOpt = msg->getOption() ) Log(Cont) << " " << ptrOpt->getOptType(); if (msg->RelayInfo_.size()) { Log(Cont) << " (" << logicalIface->getFullName() << ", " << msg->RelayInfo_.size() << " relay(s)." << LogEnd; } else { Log(Cont) << " (non-relayed)" << LogEnd; } if (SrvCfgMgr().stateless() && ( (msg->getType()!=INFORMATION_REQUEST_MSG) && (msg->getType()!=RELAY_FORW_MSG))) { Log(Warning) << "Stateful configuration message received while running in " << "the stateless mode. Message ignored." << LogEnd; continue; } SrvTransMgr().relayMsg(msg); } SrvCfgMgr().setPerformanceMode(false); SrvAddrMgr().dump(); SrvIfaceMgr().closeSockets(); Log(Notice) << "Bye bye." << LogEnd; } bool TDHCPServer::isDone() { return IsDone_; } bool TDHCPServer::checkPrivileges() { /// @todo: check privileges return true; } void TDHCPServer::stop() { serviceShutdown = 1; Log(Warning) << "Service SHUTDOWN." << LogEnd; } void TDHCPServer::setWorkdir(std::string workdir) { SrvCfgMgr().setWorkdir(workdir); SrvCfgMgr().dump(); } TDHCPServer::~TDHCPServer() { } dibbler-1.0.1/Misc/Makefile.in0000664000175000017500000016570312561652534013024 00000000000000# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ @HAVE_GTEST_TRUE@am__append_1 = tests subdir = Misc DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(srcdir)/Portable.h.in $(top_srcdir)/depcomp ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/libtool.m4 \ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/include/dibbler-config.h CONFIG_CLEAN_FILES = Portable.h CONFIG_CLEAN_VPATH_FILES = LIBRARIES = $(noinst_LIBRARIES) ARFLAGS = cru AM_V_AR = $(am__v_AR_@AM_V@) am__v_AR_ = $(am__v_AR_@AM_DEFAULT_V@) am__v_AR_0 = @echo " AR " $@; am__v_AR_1 = libMisc_a_AR = $(AR) $(ARFLAGS) libMisc_a_LIBADD = am_libMisc_a_OBJECTS = libMisc_a-addrpack.$(OBJEXT) \ libMisc_a-base64.$(OBJEXT) libMisc_a-hex.$(OBJEXT) \ libMisc_a-DHCPConst.$(OBJEXT) libMisc_a-DUID.$(OBJEXT) \ libMisc_a-FQDN.$(OBJEXT) libMisc_a-IPv6Addr.$(OBJEXT) \ libMisc_a-KeyList.$(OBJEXT) libMisc_a-Key.$(OBJEXT) \ libMisc_a-Logger.$(OBJEXT) libMisc_a-long128.$(OBJEXT) \ libMisc_a-ScriptParams.$(OBJEXT) \ libMisc_a-lowlevel-posix.$(OBJEXT) \ libMisc_a-hmac-sha-md5.$(OBJEXT) \ libMisc_a-md5-coreutils.$(OBJEXT) libMisc_a-sha1.$(OBJEXT) \ libMisc_a-sha256.$(OBJEXT) libMisc_a-sha512.$(OBJEXT) libMisc_a_OBJECTS = $(am_libMisc_a_OBJECTS) AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)/include depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) LTCXXCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CXXFLAGS) $(CXXFLAGS) AM_V_CXX = $(am__v_CXX_@AM_V@) am__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@) am__v_CXX_0 = @echo " CXX " $@; am__v_CXX_1 = CXXLD = $(CXX) CXXLINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \ $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CXXLD = $(am__v_CXXLD_@AM_V@) am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@) am__v_CXXLD_0 = @echo " CXXLD " $@; am__v_CXXLD_1 = SOURCES = $(libMisc_a_SOURCES) DIST_SOURCES = $(libMisc_a_SOURCES) RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \ ctags-recursive dvi-recursive html-recursive info-recursive \ install-data-recursive install-dvi-recursive \ install-exec-recursive install-html-recursive \ install-info-recursive install-pdf-recursive \ install-ps-recursive install-recursive installcheck-recursive \ installdirs-recursive pdf-recursive ps-recursive \ tags-recursive uninstall-recursive am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive am__recursive_targets = \ $(RECURSIVE_TARGETS) \ $(RECURSIVE_CLEAN_TARGETS) \ $(am__extra_recursive_targets) AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \ distdir am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags DIST_SUBDIRS = . tests DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) am__relativize = \ dir0=`pwd`; \ sed_first='s,^\([^/]*\)/.*$$,\1,'; \ sed_rest='s,^[^/]*/*,,'; \ sed_last='s,^.*/\([^/]*\)$$,\1,'; \ sed_butlast='s,/*[^/]*$$,,'; \ while test -n "$$dir1"; do \ first=`echo "$$dir1" | sed -e "$$sed_first"`; \ if test "$$first" != "."; then \ if test "$$first" = ".."; then \ dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ else \ first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ if test "$$first2" = "$$first"; then \ dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ else \ dir2="../$$dir2"; \ fi; \ dir0="$$dir0"/"$$first"; \ fi; \ fi; \ dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ done; \ reldir="$$dir2" ACLOCAL = @ACLOCAL@ ALLOCA = @ALLOCA@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ ARCH = @ARCH@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ EXTRA_DIST_SUBDIRS = @EXTRA_DIST_SUBDIRS@ FGREP = @FGREP@ GREP = @GREP@ GTEST_INCLUDES = @GTEST_INCLUDES@ GTEST_LDADD = @GTEST_LDADD@ GTEST_LDFLAGS = @GTEST_LDFLAGS@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LINKPRINT = @LINKPRINT@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PORT_CFLAGS = @PORT_CFLAGS@ PORT_LDFLAGS = @PORT_LDFLAGS@ PORT_SUBDIR = @PORT_SUBDIR@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ subdirs = @subdirs@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ SUBDIRS = . $(am__append_1) noinst_LIBRARIES = libMisc.a libMisc_a_CFLAGS = -std=c99 libMisc_a_CPPFLAGS = -I$(top_srcdir) libMisc_a_SOURCES = addrpack.c base64.c base64.h SmartPtr.h \ Container.h hex.cpp hex.h DHCPConst.cpp DHCPConst.h \ DHCPDefaults.h DUID.cpp DUID.h FQDN.cpp FQDN.h IPv6Addr.cpp \ IPv6Addr.h KeyList.cpp KeyList.h Key.cpp Key.h Logger.cpp \ Logger.h long128.cpp long128.h Portable.h ScriptParams.cpp \ ScriptParams.h lowlevel-posix.c hmac-sha-md5.h hmac-sha-md5.c \ md5-coreutils.c md5.h sha1.c sha1.h sha256.c sha256.h sha512.c \ sha512.h all: all-recursive .SUFFIXES: .SUFFIXES: .c .cpp .lo .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign Misc/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign Misc/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): Portable.h: $(top_builddir)/config.status $(srcdir)/Portable.h.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ clean-noinstLIBRARIES: -test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES) libMisc.a: $(libMisc_a_OBJECTS) $(libMisc_a_DEPENDENCIES) $(EXTRA_libMisc_a_DEPENDENCIES) $(AM_V_at)-rm -f libMisc.a $(AM_V_AR)$(libMisc_a_AR) libMisc.a $(libMisc_a_OBJECTS) $(libMisc_a_LIBADD) $(AM_V_at)$(RANLIB) libMisc.a mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libMisc_a-DHCPConst.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libMisc_a-DUID.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libMisc_a-FQDN.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libMisc_a-IPv6Addr.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libMisc_a-Key.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libMisc_a-KeyList.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libMisc_a-Logger.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libMisc_a-ScriptParams.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libMisc_a-addrpack.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libMisc_a-base64.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libMisc_a-hex.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libMisc_a-hmac-sha-md5.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libMisc_a-long128.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libMisc_a-lowlevel-posix.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libMisc_a-md5-coreutils.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libMisc_a-sha1.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libMisc_a-sha256.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libMisc_a-sha512.Po@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< libMisc_a-addrpack.o: addrpack.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libMisc_a_CPPFLAGS) $(CPPFLAGS) $(libMisc_a_CFLAGS) $(CFLAGS) -MT libMisc_a-addrpack.o -MD -MP -MF $(DEPDIR)/libMisc_a-addrpack.Tpo -c -o libMisc_a-addrpack.o `test -f 'addrpack.c' || echo '$(srcdir)/'`addrpack.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libMisc_a-addrpack.Tpo $(DEPDIR)/libMisc_a-addrpack.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='addrpack.c' object='libMisc_a-addrpack.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libMisc_a_CPPFLAGS) $(CPPFLAGS) $(libMisc_a_CFLAGS) $(CFLAGS) -c -o libMisc_a-addrpack.o `test -f 'addrpack.c' || echo '$(srcdir)/'`addrpack.c libMisc_a-addrpack.obj: addrpack.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libMisc_a_CPPFLAGS) $(CPPFLAGS) $(libMisc_a_CFLAGS) $(CFLAGS) -MT libMisc_a-addrpack.obj -MD -MP -MF $(DEPDIR)/libMisc_a-addrpack.Tpo -c -o libMisc_a-addrpack.obj `if test -f 'addrpack.c'; then $(CYGPATH_W) 'addrpack.c'; else $(CYGPATH_W) '$(srcdir)/addrpack.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libMisc_a-addrpack.Tpo $(DEPDIR)/libMisc_a-addrpack.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='addrpack.c' object='libMisc_a-addrpack.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libMisc_a_CPPFLAGS) $(CPPFLAGS) $(libMisc_a_CFLAGS) $(CFLAGS) -c -o libMisc_a-addrpack.obj `if test -f 'addrpack.c'; then $(CYGPATH_W) 'addrpack.c'; else $(CYGPATH_W) '$(srcdir)/addrpack.c'; fi` libMisc_a-base64.o: base64.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libMisc_a_CPPFLAGS) $(CPPFLAGS) $(libMisc_a_CFLAGS) $(CFLAGS) -MT libMisc_a-base64.o -MD -MP -MF $(DEPDIR)/libMisc_a-base64.Tpo -c -o libMisc_a-base64.o `test -f 'base64.c' || echo '$(srcdir)/'`base64.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libMisc_a-base64.Tpo $(DEPDIR)/libMisc_a-base64.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='base64.c' object='libMisc_a-base64.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libMisc_a_CPPFLAGS) $(CPPFLAGS) $(libMisc_a_CFLAGS) $(CFLAGS) -c -o libMisc_a-base64.o `test -f 'base64.c' || echo '$(srcdir)/'`base64.c libMisc_a-base64.obj: base64.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libMisc_a_CPPFLAGS) $(CPPFLAGS) $(libMisc_a_CFLAGS) $(CFLAGS) -MT libMisc_a-base64.obj -MD -MP -MF $(DEPDIR)/libMisc_a-base64.Tpo -c -o libMisc_a-base64.obj `if test -f 'base64.c'; then $(CYGPATH_W) 'base64.c'; else $(CYGPATH_W) '$(srcdir)/base64.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libMisc_a-base64.Tpo $(DEPDIR)/libMisc_a-base64.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='base64.c' object='libMisc_a-base64.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libMisc_a_CPPFLAGS) $(CPPFLAGS) $(libMisc_a_CFLAGS) $(CFLAGS) -c -o libMisc_a-base64.obj `if test -f 'base64.c'; then $(CYGPATH_W) 'base64.c'; else $(CYGPATH_W) '$(srcdir)/base64.c'; fi` libMisc_a-lowlevel-posix.o: lowlevel-posix.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libMisc_a_CPPFLAGS) $(CPPFLAGS) $(libMisc_a_CFLAGS) $(CFLAGS) -MT libMisc_a-lowlevel-posix.o -MD -MP -MF $(DEPDIR)/libMisc_a-lowlevel-posix.Tpo -c -o libMisc_a-lowlevel-posix.o `test -f 'lowlevel-posix.c' || echo '$(srcdir)/'`lowlevel-posix.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libMisc_a-lowlevel-posix.Tpo $(DEPDIR)/libMisc_a-lowlevel-posix.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='lowlevel-posix.c' object='libMisc_a-lowlevel-posix.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libMisc_a_CPPFLAGS) $(CPPFLAGS) $(libMisc_a_CFLAGS) $(CFLAGS) -c -o libMisc_a-lowlevel-posix.o `test -f 'lowlevel-posix.c' || echo '$(srcdir)/'`lowlevel-posix.c libMisc_a-lowlevel-posix.obj: lowlevel-posix.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libMisc_a_CPPFLAGS) $(CPPFLAGS) $(libMisc_a_CFLAGS) $(CFLAGS) -MT libMisc_a-lowlevel-posix.obj -MD -MP -MF $(DEPDIR)/libMisc_a-lowlevel-posix.Tpo -c -o libMisc_a-lowlevel-posix.obj `if test -f 'lowlevel-posix.c'; then $(CYGPATH_W) 'lowlevel-posix.c'; else $(CYGPATH_W) '$(srcdir)/lowlevel-posix.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libMisc_a-lowlevel-posix.Tpo $(DEPDIR)/libMisc_a-lowlevel-posix.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='lowlevel-posix.c' object='libMisc_a-lowlevel-posix.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libMisc_a_CPPFLAGS) $(CPPFLAGS) $(libMisc_a_CFLAGS) $(CFLAGS) -c -o libMisc_a-lowlevel-posix.obj `if test -f 'lowlevel-posix.c'; then $(CYGPATH_W) 'lowlevel-posix.c'; else $(CYGPATH_W) '$(srcdir)/lowlevel-posix.c'; fi` libMisc_a-hmac-sha-md5.o: hmac-sha-md5.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libMisc_a_CPPFLAGS) $(CPPFLAGS) $(libMisc_a_CFLAGS) $(CFLAGS) -MT libMisc_a-hmac-sha-md5.o -MD -MP -MF $(DEPDIR)/libMisc_a-hmac-sha-md5.Tpo -c -o libMisc_a-hmac-sha-md5.o `test -f 'hmac-sha-md5.c' || echo '$(srcdir)/'`hmac-sha-md5.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libMisc_a-hmac-sha-md5.Tpo $(DEPDIR)/libMisc_a-hmac-sha-md5.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='hmac-sha-md5.c' object='libMisc_a-hmac-sha-md5.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libMisc_a_CPPFLAGS) $(CPPFLAGS) $(libMisc_a_CFLAGS) $(CFLAGS) -c -o libMisc_a-hmac-sha-md5.o `test -f 'hmac-sha-md5.c' || echo '$(srcdir)/'`hmac-sha-md5.c libMisc_a-hmac-sha-md5.obj: hmac-sha-md5.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libMisc_a_CPPFLAGS) $(CPPFLAGS) $(libMisc_a_CFLAGS) $(CFLAGS) -MT libMisc_a-hmac-sha-md5.obj -MD -MP -MF $(DEPDIR)/libMisc_a-hmac-sha-md5.Tpo -c -o libMisc_a-hmac-sha-md5.obj `if test -f 'hmac-sha-md5.c'; then $(CYGPATH_W) 'hmac-sha-md5.c'; else $(CYGPATH_W) '$(srcdir)/hmac-sha-md5.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libMisc_a-hmac-sha-md5.Tpo $(DEPDIR)/libMisc_a-hmac-sha-md5.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='hmac-sha-md5.c' object='libMisc_a-hmac-sha-md5.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libMisc_a_CPPFLAGS) $(CPPFLAGS) $(libMisc_a_CFLAGS) $(CFLAGS) -c -o libMisc_a-hmac-sha-md5.obj `if test -f 'hmac-sha-md5.c'; then $(CYGPATH_W) 'hmac-sha-md5.c'; else $(CYGPATH_W) '$(srcdir)/hmac-sha-md5.c'; fi` libMisc_a-md5-coreutils.o: md5-coreutils.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libMisc_a_CPPFLAGS) $(CPPFLAGS) $(libMisc_a_CFLAGS) $(CFLAGS) -MT libMisc_a-md5-coreutils.o -MD -MP -MF $(DEPDIR)/libMisc_a-md5-coreutils.Tpo -c -o libMisc_a-md5-coreutils.o `test -f 'md5-coreutils.c' || echo '$(srcdir)/'`md5-coreutils.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libMisc_a-md5-coreutils.Tpo $(DEPDIR)/libMisc_a-md5-coreutils.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='md5-coreutils.c' object='libMisc_a-md5-coreutils.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libMisc_a_CPPFLAGS) $(CPPFLAGS) $(libMisc_a_CFLAGS) $(CFLAGS) -c -o libMisc_a-md5-coreutils.o `test -f 'md5-coreutils.c' || echo '$(srcdir)/'`md5-coreutils.c libMisc_a-md5-coreutils.obj: md5-coreutils.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libMisc_a_CPPFLAGS) $(CPPFLAGS) $(libMisc_a_CFLAGS) $(CFLAGS) -MT libMisc_a-md5-coreutils.obj -MD -MP -MF $(DEPDIR)/libMisc_a-md5-coreutils.Tpo -c -o libMisc_a-md5-coreutils.obj `if test -f 'md5-coreutils.c'; then $(CYGPATH_W) 'md5-coreutils.c'; else $(CYGPATH_W) '$(srcdir)/md5-coreutils.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libMisc_a-md5-coreutils.Tpo $(DEPDIR)/libMisc_a-md5-coreutils.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='md5-coreutils.c' object='libMisc_a-md5-coreutils.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libMisc_a_CPPFLAGS) $(CPPFLAGS) $(libMisc_a_CFLAGS) $(CFLAGS) -c -o libMisc_a-md5-coreutils.obj `if test -f 'md5-coreutils.c'; then $(CYGPATH_W) 'md5-coreutils.c'; else $(CYGPATH_W) '$(srcdir)/md5-coreutils.c'; fi` libMisc_a-sha1.o: sha1.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libMisc_a_CPPFLAGS) $(CPPFLAGS) $(libMisc_a_CFLAGS) $(CFLAGS) -MT libMisc_a-sha1.o -MD -MP -MF $(DEPDIR)/libMisc_a-sha1.Tpo -c -o libMisc_a-sha1.o `test -f 'sha1.c' || echo '$(srcdir)/'`sha1.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libMisc_a-sha1.Tpo $(DEPDIR)/libMisc_a-sha1.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='sha1.c' object='libMisc_a-sha1.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libMisc_a_CPPFLAGS) $(CPPFLAGS) $(libMisc_a_CFLAGS) $(CFLAGS) -c -o libMisc_a-sha1.o `test -f 'sha1.c' || echo '$(srcdir)/'`sha1.c libMisc_a-sha1.obj: sha1.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libMisc_a_CPPFLAGS) $(CPPFLAGS) $(libMisc_a_CFLAGS) $(CFLAGS) -MT libMisc_a-sha1.obj -MD -MP -MF $(DEPDIR)/libMisc_a-sha1.Tpo -c -o libMisc_a-sha1.obj `if test -f 'sha1.c'; then $(CYGPATH_W) 'sha1.c'; else $(CYGPATH_W) '$(srcdir)/sha1.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libMisc_a-sha1.Tpo $(DEPDIR)/libMisc_a-sha1.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='sha1.c' object='libMisc_a-sha1.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libMisc_a_CPPFLAGS) $(CPPFLAGS) $(libMisc_a_CFLAGS) $(CFLAGS) -c -o libMisc_a-sha1.obj `if test -f 'sha1.c'; then $(CYGPATH_W) 'sha1.c'; else $(CYGPATH_W) '$(srcdir)/sha1.c'; fi` libMisc_a-sha256.o: sha256.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libMisc_a_CPPFLAGS) $(CPPFLAGS) $(libMisc_a_CFLAGS) $(CFLAGS) -MT libMisc_a-sha256.o -MD -MP -MF $(DEPDIR)/libMisc_a-sha256.Tpo -c -o libMisc_a-sha256.o `test -f 'sha256.c' || echo '$(srcdir)/'`sha256.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libMisc_a-sha256.Tpo $(DEPDIR)/libMisc_a-sha256.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='sha256.c' object='libMisc_a-sha256.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libMisc_a_CPPFLAGS) $(CPPFLAGS) $(libMisc_a_CFLAGS) $(CFLAGS) -c -o libMisc_a-sha256.o `test -f 'sha256.c' || echo '$(srcdir)/'`sha256.c libMisc_a-sha256.obj: sha256.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libMisc_a_CPPFLAGS) $(CPPFLAGS) $(libMisc_a_CFLAGS) $(CFLAGS) -MT libMisc_a-sha256.obj -MD -MP -MF $(DEPDIR)/libMisc_a-sha256.Tpo -c -o libMisc_a-sha256.obj `if test -f 'sha256.c'; then $(CYGPATH_W) 'sha256.c'; else $(CYGPATH_W) '$(srcdir)/sha256.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libMisc_a-sha256.Tpo $(DEPDIR)/libMisc_a-sha256.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='sha256.c' object='libMisc_a-sha256.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libMisc_a_CPPFLAGS) $(CPPFLAGS) $(libMisc_a_CFLAGS) $(CFLAGS) -c -o libMisc_a-sha256.obj `if test -f 'sha256.c'; then $(CYGPATH_W) 'sha256.c'; else $(CYGPATH_W) '$(srcdir)/sha256.c'; fi` libMisc_a-sha512.o: sha512.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libMisc_a_CPPFLAGS) $(CPPFLAGS) $(libMisc_a_CFLAGS) $(CFLAGS) -MT libMisc_a-sha512.o -MD -MP -MF $(DEPDIR)/libMisc_a-sha512.Tpo -c -o libMisc_a-sha512.o `test -f 'sha512.c' || echo '$(srcdir)/'`sha512.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libMisc_a-sha512.Tpo $(DEPDIR)/libMisc_a-sha512.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='sha512.c' object='libMisc_a-sha512.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libMisc_a_CPPFLAGS) $(CPPFLAGS) $(libMisc_a_CFLAGS) $(CFLAGS) -c -o libMisc_a-sha512.o `test -f 'sha512.c' || echo '$(srcdir)/'`sha512.c libMisc_a-sha512.obj: sha512.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libMisc_a_CPPFLAGS) $(CPPFLAGS) $(libMisc_a_CFLAGS) $(CFLAGS) -MT libMisc_a-sha512.obj -MD -MP -MF $(DEPDIR)/libMisc_a-sha512.Tpo -c -o libMisc_a-sha512.obj `if test -f 'sha512.c'; then $(CYGPATH_W) 'sha512.c'; else $(CYGPATH_W) '$(srcdir)/sha512.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libMisc_a-sha512.Tpo $(DEPDIR)/libMisc_a-sha512.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='sha512.c' object='libMisc_a-sha512.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libMisc_a_CPPFLAGS) $(CPPFLAGS) $(libMisc_a_CFLAGS) $(CFLAGS) -c -o libMisc_a-sha512.obj `if test -f 'sha512.c'; then $(CYGPATH_W) 'sha512.c'; else $(CYGPATH_W) '$(srcdir)/sha512.c'; fi` .cpp.o: @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $< .cpp.obj: @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .cpp.lo: @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LTCXXCOMPILE) -c -o $@ $< libMisc_a-hex.o: hex.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libMisc_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libMisc_a-hex.o -MD -MP -MF $(DEPDIR)/libMisc_a-hex.Tpo -c -o libMisc_a-hex.o `test -f 'hex.cpp' || echo '$(srcdir)/'`hex.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libMisc_a-hex.Tpo $(DEPDIR)/libMisc_a-hex.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='hex.cpp' object='libMisc_a-hex.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libMisc_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libMisc_a-hex.o `test -f 'hex.cpp' || echo '$(srcdir)/'`hex.cpp libMisc_a-hex.obj: hex.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libMisc_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libMisc_a-hex.obj -MD -MP -MF $(DEPDIR)/libMisc_a-hex.Tpo -c -o libMisc_a-hex.obj `if test -f 'hex.cpp'; then $(CYGPATH_W) 'hex.cpp'; else $(CYGPATH_W) '$(srcdir)/hex.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libMisc_a-hex.Tpo $(DEPDIR)/libMisc_a-hex.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='hex.cpp' object='libMisc_a-hex.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libMisc_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libMisc_a-hex.obj `if test -f 'hex.cpp'; then $(CYGPATH_W) 'hex.cpp'; else $(CYGPATH_W) '$(srcdir)/hex.cpp'; fi` libMisc_a-DHCPConst.o: DHCPConst.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libMisc_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libMisc_a-DHCPConst.o -MD -MP -MF $(DEPDIR)/libMisc_a-DHCPConst.Tpo -c -o libMisc_a-DHCPConst.o `test -f 'DHCPConst.cpp' || echo '$(srcdir)/'`DHCPConst.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libMisc_a-DHCPConst.Tpo $(DEPDIR)/libMisc_a-DHCPConst.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='DHCPConst.cpp' object='libMisc_a-DHCPConst.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libMisc_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libMisc_a-DHCPConst.o `test -f 'DHCPConst.cpp' || echo '$(srcdir)/'`DHCPConst.cpp libMisc_a-DHCPConst.obj: DHCPConst.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libMisc_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libMisc_a-DHCPConst.obj -MD -MP -MF $(DEPDIR)/libMisc_a-DHCPConst.Tpo -c -o libMisc_a-DHCPConst.obj `if test -f 'DHCPConst.cpp'; then $(CYGPATH_W) 'DHCPConst.cpp'; else $(CYGPATH_W) '$(srcdir)/DHCPConst.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libMisc_a-DHCPConst.Tpo $(DEPDIR)/libMisc_a-DHCPConst.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='DHCPConst.cpp' object='libMisc_a-DHCPConst.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libMisc_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libMisc_a-DHCPConst.obj `if test -f 'DHCPConst.cpp'; then $(CYGPATH_W) 'DHCPConst.cpp'; else $(CYGPATH_W) '$(srcdir)/DHCPConst.cpp'; fi` libMisc_a-DUID.o: DUID.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libMisc_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libMisc_a-DUID.o -MD -MP -MF $(DEPDIR)/libMisc_a-DUID.Tpo -c -o libMisc_a-DUID.o `test -f 'DUID.cpp' || echo '$(srcdir)/'`DUID.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libMisc_a-DUID.Tpo $(DEPDIR)/libMisc_a-DUID.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='DUID.cpp' object='libMisc_a-DUID.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libMisc_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libMisc_a-DUID.o `test -f 'DUID.cpp' || echo '$(srcdir)/'`DUID.cpp libMisc_a-DUID.obj: DUID.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libMisc_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libMisc_a-DUID.obj -MD -MP -MF $(DEPDIR)/libMisc_a-DUID.Tpo -c -o libMisc_a-DUID.obj `if test -f 'DUID.cpp'; then $(CYGPATH_W) 'DUID.cpp'; else $(CYGPATH_W) '$(srcdir)/DUID.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libMisc_a-DUID.Tpo $(DEPDIR)/libMisc_a-DUID.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='DUID.cpp' object='libMisc_a-DUID.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libMisc_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libMisc_a-DUID.obj `if test -f 'DUID.cpp'; then $(CYGPATH_W) 'DUID.cpp'; else $(CYGPATH_W) '$(srcdir)/DUID.cpp'; fi` libMisc_a-FQDN.o: FQDN.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libMisc_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libMisc_a-FQDN.o -MD -MP -MF $(DEPDIR)/libMisc_a-FQDN.Tpo -c -o libMisc_a-FQDN.o `test -f 'FQDN.cpp' || echo '$(srcdir)/'`FQDN.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libMisc_a-FQDN.Tpo $(DEPDIR)/libMisc_a-FQDN.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='FQDN.cpp' object='libMisc_a-FQDN.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libMisc_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libMisc_a-FQDN.o `test -f 'FQDN.cpp' || echo '$(srcdir)/'`FQDN.cpp libMisc_a-FQDN.obj: FQDN.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libMisc_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libMisc_a-FQDN.obj -MD -MP -MF $(DEPDIR)/libMisc_a-FQDN.Tpo -c -o libMisc_a-FQDN.obj `if test -f 'FQDN.cpp'; then $(CYGPATH_W) 'FQDN.cpp'; else $(CYGPATH_W) '$(srcdir)/FQDN.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libMisc_a-FQDN.Tpo $(DEPDIR)/libMisc_a-FQDN.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='FQDN.cpp' object='libMisc_a-FQDN.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libMisc_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libMisc_a-FQDN.obj `if test -f 'FQDN.cpp'; then $(CYGPATH_W) 'FQDN.cpp'; else $(CYGPATH_W) '$(srcdir)/FQDN.cpp'; fi` libMisc_a-IPv6Addr.o: IPv6Addr.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libMisc_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libMisc_a-IPv6Addr.o -MD -MP -MF $(DEPDIR)/libMisc_a-IPv6Addr.Tpo -c -o libMisc_a-IPv6Addr.o `test -f 'IPv6Addr.cpp' || echo '$(srcdir)/'`IPv6Addr.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libMisc_a-IPv6Addr.Tpo $(DEPDIR)/libMisc_a-IPv6Addr.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='IPv6Addr.cpp' object='libMisc_a-IPv6Addr.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libMisc_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libMisc_a-IPv6Addr.o `test -f 'IPv6Addr.cpp' || echo '$(srcdir)/'`IPv6Addr.cpp libMisc_a-IPv6Addr.obj: IPv6Addr.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libMisc_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libMisc_a-IPv6Addr.obj -MD -MP -MF $(DEPDIR)/libMisc_a-IPv6Addr.Tpo -c -o libMisc_a-IPv6Addr.obj `if test -f 'IPv6Addr.cpp'; then $(CYGPATH_W) 'IPv6Addr.cpp'; else $(CYGPATH_W) '$(srcdir)/IPv6Addr.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libMisc_a-IPv6Addr.Tpo $(DEPDIR)/libMisc_a-IPv6Addr.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='IPv6Addr.cpp' object='libMisc_a-IPv6Addr.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libMisc_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libMisc_a-IPv6Addr.obj `if test -f 'IPv6Addr.cpp'; then $(CYGPATH_W) 'IPv6Addr.cpp'; else $(CYGPATH_W) '$(srcdir)/IPv6Addr.cpp'; fi` libMisc_a-KeyList.o: KeyList.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libMisc_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libMisc_a-KeyList.o -MD -MP -MF $(DEPDIR)/libMisc_a-KeyList.Tpo -c -o libMisc_a-KeyList.o `test -f 'KeyList.cpp' || echo '$(srcdir)/'`KeyList.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libMisc_a-KeyList.Tpo $(DEPDIR)/libMisc_a-KeyList.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='KeyList.cpp' object='libMisc_a-KeyList.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libMisc_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libMisc_a-KeyList.o `test -f 'KeyList.cpp' || echo '$(srcdir)/'`KeyList.cpp libMisc_a-KeyList.obj: KeyList.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libMisc_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libMisc_a-KeyList.obj -MD -MP -MF $(DEPDIR)/libMisc_a-KeyList.Tpo -c -o libMisc_a-KeyList.obj `if test -f 'KeyList.cpp'; then $(CYGPATH_W) 'KeyList.cpp'; else $(CYGPATH_W) '$(srcdir)/KeyList.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libMisc_a-KeyList.Tpo $(DEPDIR)/libMisc_a-KeyList.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='KeyList.cpp' object='libMisc_a-KeyList.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libMisc_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libMisc_a-KeyList.obj `if test -f 'KeyList.cpp'; then $(CYGPATH_W) 'KeyList.cpp'; else $(CYGPATH_W) '$(srcdir)/KeyList.cpp'; fi` libMisc_a-Key.o: Key.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libMisc_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libMisc_a-Key.o -MD -MP -MF $(DEPDIR)/libMisc_a-Key.Tpo -c -o libMisc_a-Key.o `test -f 'Key.cpp' || echo '$(srcdir)/'`Key.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libMisc_a-Key.Tpo $(DEPDIR)/libMisc_a-Key.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='Key.cpp' object='libMisc_a-Key.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libMisc_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libMisc_a-Key.o `test -f 'Key.cpp' || echo '$(srcdir)/'`Key.cpp libMisc_a-Key.obj: Key.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libMisc_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libMisc_a-Key.obj -MD -MP -MF $(DEPDIR)/libMisc_a-Key.Tpo -c -o libMisc_a-Key.obj `if test -f 'Key.cpp'; then $(CYGPATH_W) 'Key.cpp'; else $(CYGPATH_W) '$(srcdir)/Key.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libMisc_a-Key.Tpo $(DEPDIR)/libMisc_a-Key.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='Key.cpp' object='libMisc_a-Key.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libMisc_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libMisc_a-Key.obj `if test -f 'Key.cpp'; then $(CYGPATH_W) 'Key.cpp'; else $(CYGPATH_W) '$(srcdir)/Key.cpp'; fi` libMisc_a-Logger.o: Logger.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libMisc_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libMisc_a-Logger.o -MD -MP -MF $(DEPDIR)/libMisc_a-Logger.Tpo -c -o libMisc_a-Logger.o `test -f 'Logger.cpp' || echo '$(srcdir)/'`Logger.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libMisc_a-Logger.Tpo $(DEPDIR)/libMisc_a-Logger.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='Logger.cpp' object='libMisc_a-Logger.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libMisc_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libMisc_a-Logger.o `test -f 'Logger.cpp' || echo '$(srcdir)/'`Logger.cpp libMisc_a-Logger.obj: Logger.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libMisc_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libMisc_a-Logger.obj -MD -MP -MF $(DEPDIR)/libMisc_a-Logger.Tpo -c -o libMisc_a-Logger.obj `if test -f 'Logger.cpp'; then $(CYGPATH_W) 'Logger.cpp'; else $(CYGPATH_W) '$(srcdir)/Logger.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libMisc_a-Logger.Tpo $(DEPDIR)/libMisc_a-Logger.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='Logger.cpp' object='libMisc_a-Logger.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libMisc_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libMisc_a-Logger.obj `if test -f 'Logger.cpp'; then $(CYGPATH_W) 'Logger.cpp'; else $(CYGPATH_W) '$(srcdir)/Logger.cpp'; fi` libMisc_a-long128.o: long128.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libMisc_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libMisc_a-long128.o -MD -MP -MF $(DEPDIR)/libMisc_a-long128.Tpo -c -o libMisc_a-long128.o `test -f 'long128.cpp' || echo '$(srcdir)/'`long128.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libMisc_a-long128.Tpo $(DEPDIR)/libMisc_a-long128.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='long128.cpp' object='libMisc_a-long128.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libMisc_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libMisc_a-long128.o `test -f 'long128.cpp' || echo '$(srcdir)/'`long128.cpp libMisc_a-long128.obj: long128.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libMisc_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libMisc_a-long128.obj -MD -MP -MF $(DEPDIR)/libMisc_a-long128.Tpo -c -o libMisc_a-long128.obj `if test -f 'long128.cpp'; then $(CYGPATH_W) 'long128.cpp'; else $(CYGPATH_W) '$(srcdir)/long128.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libMisc_a-long128.Tpo $(DEPDIR)/libMisc_a-long128.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='long128.cpp' object='libMisc_a-long128.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libMisc_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libMisc_a-long128.obj `if test -f 'long128.cpp'; then $(CYGPATH_W) 'long128.cpp'; else $(CYGPATH_W) '$(srcdir)/long128.cpp'; fi` libMisc_a-ScriptParams.o: ScriptParams.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libMisc_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libMisc_a-ScriptParams.o -MD -MP -MF $(DEPDIR)/libMisc_a-ScriptParams.Tpo -c -o libMisc_a-ScriptParams.o `test -f 'ScriptParams.cpp' || echo '$(srcdir)/'`ScriptParams.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libMisc_a-ScriptParams.Tpo $(DEPDIR)/libMisc_a-ScriptParams.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='ScriptParams.cpp' object='libMisc_a-ScriptParams.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libMisc_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libMisc_a-ScriptParams.o `test -f 'ScriptParams.cpp' || echo '$(srcdir)/'`ScriptParams.cpp libMisc_a-ScriptParams.obj: ScriptParams.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libMisc_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libMisc_a-ScriptParams.obj -MD -MP -MF $(DEPDIR)/libMisc_a-ScriptParams.Tpo -c -o libMisc_a-ScriptParams.obj `if test -f 'ScriptParams.cpp'; then $(CYGPATH_W) 'ScriptParams.cpp'; else $(CYGPATH_W) '$(srcdir)/ScriptParams.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libMisc_a-ScriptParams.Tpo $(DEPDIR)/libMisc_a-ScriptParams.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='ScriptParams.cpp' object='libMisc_a-ScriptParams.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libMisc_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libMisc_a-ScriptParams.obj `if test -f 'ScriptParams.cpp'; then $(CYGPATH_W) 'ScriptParams.cpp'; else $(CYGPATH_W) '$(srcdir)/ScriptParams.cpp'; fi` mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs # This directory's subdirectories are mostly independent; you can cd # into them and run 'make' without going through this Makefile. # To change the values of 'make' variables: instead of editing Makefiles, # (1) if the variable is set in 'config.status', edit 'config.status' # (which will cause the Makefiles to be regenerated when you run 'make'); # (2) otherwise, pass the desired values on the 'make' command line. $(am__recursive_targets): @fail=; \ if $(am__make_keepgoing); then \ failcom='fail=yes'; \ else \ failcom='exit 1'; \ fi; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-recursive TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ empty_fix=.; \ else \ include_option=--include; \ empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-recursive CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-recursive cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ $(am__make_dryrun) \ || test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ $(am__relativize); \ new_distdir=$$reldir; \ dir1=$$subdir; dir2="$(top_distdir)"; \ $(am__relativize); \ new_top_distdir=$$reldir; \ echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ ($(am__cd) $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$new_top_distdir" \ distdir="$$new_distdir" \ am__remove_distdir=: \ am__skip_length_check=: \ am__skip_mode_fix=: \ distdir) \ || exit 1; \ fi; \ done check-am: all-am check: check-recursive all-am: Makefile $(LIBRARIES) installdirs: installdirs-recursive installdirs-am: install: install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-recursive clean-am: clean-generic clean-libtool clean-noinstLIBRARIES \ mostlyclean-am distclean: distclean-recursive -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive html-am: info: info-recursive info-am: install-data-am: install-dvi: install-dvi-recursive install-dvi-am: install-exec-am: install-html: install-html-recursive install-html-am: install-info: install-info-recursive install-info-am: install-man: install-pdf: install-pdf-recursive install-pdf-am: install-ps: install-ps-recursive install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-recursive -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: .MAKE: $(am__recursive_targets) install-am install-strip .PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am check \ check-am clean clean-generic clean-libtool \ clean-noinstLIBRARIES cscopelist-am ctags ctags-am distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ installdirs-am maintainer-clean maintainer-clean-generic \ mostlyclean mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf pdf-am ps ps-am tags tags-am uninstall \ uninstall-am # 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: dibbler-1.0.1/Misc/long128.cpp0000664000175000017500000000207012233256142012627 00000000000000/* * * Dibbler - a portable DHCPv6 * * * * authors: Tomasz Mrugalski * * Marek Senderski * * * * released under GNU GPL v2 only licence */ #include #include "long128.h" ulong128::ulong128() { memset(bytes,0,16); } ulong128::ulong128(SPtr addr) { memcpy(this->bytes,addr->getAddr(),16); } ulong128 ulong128::operator+(ulong128& other) { ulong128 ret1; memcpy(ret1.bytes,this->bytes,16); unsigned int c=0; for (int j=0;j<16;j++) { unsigned int i=c+(unsigned int)other.bytes[j]+ (unsigned int)this->bytes[j]; ret1.bytes[j]=(i&0xFF); c=i>>8; } return ret1; } dibbler-1.0.1/Misc/sha1.c0000664000175000017500000002437412233256142011744 00000000000000/* sha1.c - Functions to compute SHA1 message digest of files or memory blocks according to the NIST specification FIPS-180-1. Copyright (C) 2000, 2001, 2003, 2004, 2005, 2006 Free Software Foundation, Inc. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ /* Written by Scott G. Miller Credits: Robert Klep -- Expansion function fix */ /* This file is taken from coreutils-6.2 (lib/sha1.c) and adapted for dibbler * by Michal Kowalczuk */ #include "sha1.h" #include #include #include #ifdef WIN32 # define SWAP(n) \ (((n) << 24) | (((n) & 0xff00) << 8) | (((n) >> 8) & 0xff00) | ((n) >> 24)) #else #if __BYTE_ORDER == __BIG_ENDIAN # define SWAP(n) (n) #else # define SWAP(n) \ (((n) << 24) | (((n) & 0xff00) << 8) | (((n) >> 8) & 0xff00) | ((n) >> 24)) #endif #endif #define BLOCKSIZE 4096 #if BLOCKSIZE % 64 != 0 # error "invalid BLOCKSIZE" #endif /* This array contains the bytes used to pad the buffer to the next 64-byte boundary. (RFC 1321, 3.1: Step 1) */ static const unsigned char fillbuf[64] = { 0x80, 0 /* , 0, 0, ... */ }; /* Take a pointer to a 160 bit block of data (five 32 bit ints) and initialize it to the start constants of the SHA1 algorithm. This must be called before using hash in the call to sha1_hash. */ void sha1_init_ctx (struct sha1_ctx *ctx) { ctx->A = 0x67452301; ctx->B = 0xefcdab89; ctx->C = 0x98badcfe; ctx->D = 0x10325476; ctx->E = 0xc3d2e1f0; ctx->total[0] = ctx->total[1] = 0; ctx->buflen = 0; } /* Put result from CTX in first 20 bytes following RESBUF. The result must be in little endian byte order. IMPORTANT: On some systems it is required that RESBUF is correctly aligned for a 32-bit value. */ void * sha1_read_ctx (const struct sha1_ctx *ctx, void *resbuf) { ((uint32_t *) resbuf)[0] = SWAP (ctx->A); ((uint32_t *) resbuf)[1] = SWAP (ctx->B); ((uint32_t *) resbuf)[2] = SWAP (ctx->C); ((uint32_t *) resbuf)[3] = SWAP (ctx->D); ((uint32_t *) resbuf)[4] = SWAP (ctx->E); return resbuf; } /* Process the remaining bytes in the internal buffer and the usual prolog according to the standard and write the result to RESBUF. IMPORTANT: On some systems it is required that RESBUF is correctly aligned for a 32-bit value. */ void * sha1_finish_ctx (struct sha1_ctx *ctx, void *resbuf) { /* Take yet unprocessed bytes into account. */ uint32_t bytes = ctx->buflen; size_t size = (bytes < 56) ? 64 / 4 : 64 * 2 / 4; /* Now count remaining bytes. */ ctx->total[0] += bytes; if (ctx->total[0] < bytes) ++ctx->total[1]; /* Put the 64-bit file length in *bits* at the end of the buffer. */ ctx->buffer[size - 2] = SWAP ((ctx->total[1] << 3) | (ctx->total[0] >> 29)); ctx->buffer[size - 1] = SWAP (ctx->total[0] << 3); memcpy (&((char *) ctx->buffer)[bytes], fillbuf, (size - 2) * 4 - bytes); /* Process last bytes. */ sha1_process_block (ctx->buffer, size * 4, ctx); return sha1_read_ctx (ctx, resbuf); } void sha1_process_bytes (const void *buffer, size_t len, struct sha1_ctx *ctx) { /* When we already have some bits in our internal buffer concatenate both inputs first. */ if (ctx->buflen != 0) { size_t left_over = ctx->buflen; size_t add = 128 - left_over > len ? len : 128 - left_over; memcpy (&((char *) ctx->buffer)[left_over], buffer, add); ctx->buflen += add; if (ctx->buflen > 64) { sha1_process_block (ctx->buffer, ctx->buflen & ~63, ctx); ctx->buflen &= 63; /* The regions in the following copy operation cannot overlap. */ memcpy (ctx->buffer, &((char *) ctx->buffer)[(left_over + add) & ~63], ctx->buflen); } buffer = (const char *) buffer + add; len -= add; } /* Process available complete blocks. */ if (len >= 64) { #if !_STRING_ARCH_unaligned # define alignof(type) offsetof (struct { char c; type x; }, x) # define UNALIGNED_P(p) (((size_t) p) % alignof (uint32_t) != 0) if (UNALIGNED_P (buffer)) while (len > 64) { sha1_process_block (memcpy (ctx->buffer, buffer, 64), 64, ctx); buffer = (const char *) buffer + 64; len -= 64; } else #endif { sha1_process_block (buffer, len & ~63, ctx); buffer = (const char *) buffer + (len & ~63); len &= 63; } } /* Move remaining bytes in internal buffer. */ if (len > 0) { size_t left_over = ctx->buflen; memcpy (&((char *) ctx->buffer)[left_over], buffer, len); left_over += len; if (left_over >= 64) { sha1_process_block (ctx->buffer, 64, ctx); left_over -= 64; memcpy (ctx->buffer, &ctx->buffer[16], left_over); } ctx->buflen = left_over; } } /* --- Code below is the primary difference between md5.c and sha1.c --- */ /* SHA1 round constants */ #define K1 0x5a827999 #define K2 0x6ed9eba1 #define K3 0x8f1bbcdc #define K4 0xca62c1d6 /* Round functions. Note that F2 is the same as F4. */ #define F1(B,C,D) ( D ^ ( B & ( C ^ D ) ) ) #define F2(B,C,D) (B ^ C ^ D) #define F3(B,C,D) ( ( B & C ) | ( D & ( B | C ) ) ) #define F4(B,C,D) (B ^ C ^ D) /* Process LEN bytes of BUFFER, accumulating context into CTX. It is assumed that LEN % 64 == 0. Most of this code comes from GnuPG's cipher/sha1.c. */ void sha1_process_block (const void *buffer, size_t len, struct sha1_ctx *ctx) { const uint32_t *words = buffer; size_t nwords = len / sizeof (uint32_t); const uint32_t *endp = words + nwords; uint32_t x[16]; uint32_t a = ctx->A; uint32_t b = ctx->B; uint32_t c = ctx->C; uint32_t d = ctx->D; uint32_t e = ctx->E; /* First increment the byte count. RFC 1321 specifies the possible length of the file up to 2^64 bits. Here we only compute the number of bytes. Do a double word increment. */ ctx->total[0] += len; if (ctx->total[0] < len) ++ctx->total[1]; #define rol(x, n) (((x) << (n)) | ((uint32_t) (x) >> (32 - (n)))) #define M(I) ( tm = x[I&0x0f] ^ x[(I-14)&0x0f] \ ^ x[(I-8)&0x0f] ^ x[(I-3)&0x0f] \ , (x[I&0x0f] = rol(tm, 1)) ) #define R(A,B,C,D,E,F,K,M) do { E += rol( A, 5 ) \ + F( B, C, D ) \ + K \ + M; \ B = rol( B, 30 ); \ } while(0) while (words < endp) { uint32_t tm; int t; for (t = 0; t < 16; t++) { x[t] = SWAP (*words); words++; } R( a, b, c, d, e, F1, K1, x[ 0] ); R( e, a, b, c, d, F1, K1, x[ 1] ); R( d, e, a, b, c, F1, K1, x[ 2] ); R( c, d, e, a, b, F1, K1, x[ 3] ); R( b, c, d, e, a, F1, K1, x[ 4] ); R( a, b, c, d, e, F1, K1, x[ 5] ); R( e, a, b, c, d, F1, K1, x[ 6] ); R( d, e, a, b, c, F1, K1, x[ 7] ); R( c, d, e, a, b, F1, K1, x[ 8] ); R( b, c, d, e, a, F1, K1, x[ 9] ); R( a, b, c, d, e, F1, K1, x[10] ); R( e, a, b, c, d, F1, K1, x[11] ); R( d, e, a, b, c, F1, K1, x[12] ); R( c, d, e, a, b, F1, K1, x[13] ); R( b, c, d, e, a, F1, K1, x[14] ); R( a, b, c, d, e, F1, K1, x[15] ); R( e, a, b, c, d, F1, K1, M(16) ); R( d, e, a, b, c, F1, K1, M(17) ); R( c, d, e, a, b, F1, K1, M(18) ); R( b, c, d, e, a, F1, K1, M(19) ); R( a, b, c, d, e, F2, K2, M(20) ); R( e, a, b, c, d, F2, K2, M(21) ); R( d, e, a, b, c, F2, K2, M(22) ); R( c, d, e, a, b, F2, K2, M(23) ); R( b, c, d, e, a, F2, K2, M(24) ); R( a, b, c, d, e, F2, K2, M(25) ); R( e, a, b, c, d, F2, K2, M(26) ); R( d, e, a, b, c, F2, K2, M(27) ); R( c, d, e, a, b, F2, K2, M(28) ); R( b, c, d, e, a, F2, K2, M(29) ); R( a, b, c, d, e, F2, K2, M(30) ); R( e, a, b, c, d, F2, K2, M(31) ); R( d, e, a, b, c, F2, K2, M(32) ); R( c, d, e, a, b, F2, K2, M(33) ); R( b, c, d, e, a, F2, K2, M(34) ); R( a, b, c, d, e, F2, K2, M(35) ); R( e, a, b, c, d, F2, K2, M(36) ); R( d, e, a, b, c, F2, K2, M(37) ); R( c, d, e, a, b, F2, K2, M(38) ); R( b, c, d, e, a, F2, K2, M(39) ); R( a, b, c, d, e, F3, K3, M(40) ); R( e, a, b, c, d, F3, K3, M(41) ); R( d, e, a, b, c, F3, K3, M(42) ); R( c, d, e, a, b, F3, K3, M(43) ); R( b, c, d, e, a, F3, K3, M(44) ); R( a, b, c, d, e, F3, K3, M(45) ); R( e, a, b, c, d, F3, K3, M(46) ); R( d, e, a, b, c, F3, K3, M(47) ); R( c, d, e, a, b, F3, K3, M(48) ); R( b, c, d, e, a, F3, K3, M(49) ); R( a, b, c, d, e, F3, K3, M(50) ); R( e, a, b, c, d, F3, K3, M(51) ); R( d, e, a, b, c, F3, K3, M(52) ); R( c, d, e, a, b, F3, K3, M(53) ); R( b, c, d, e, a, F3, K3, M(54) ); R( a, b, c, d, e, F3, K3, M(55) ); R( e, a, b, c, d, F3, K3, M(56) ); R( d, e, a, b, c, F3, K3, M(57) ); R( c, d, e, a, b, F3, K3, M(58) ); R( b, c, d, e, a, F3, K3, M(59) ); R( a, b, c, d, e, F4, K4, M(60) ); R( e, a, b, c, d, F4, K4, M(61) ); R( d, e, a, b, c, F4, K4, M(62) ); R( c, d, e, a, b, F4, K4, M(63) ); R( b, c, d, e, a, F4, K4, M(64) ); R( a, b, c, d, e, F4, K4, M(65) ); R( e, a, b, c, d, F4, K4, M(66) ); R( d, e, a, b, c, F4, K4, M(67) ); R( c, d, e, a, b, F4, K4, M(68) ); R( b, c, d, e, a, F4, K4, M(69) ); R( a, b, c, d, e, F4, K4, M(70) ); R( e, a, b, c, d, F4, K4, M(71) ); R( d, e, a, b, c, F4, K4, M(72) ); R( c, d, e, a, b, F4, K4, M(73) ); R( b, c, d, e, a, F4, K4, M(74) ); R( a, b, c, d, e, F4, K4, M(75) ); R( e, a, b, c, d, F4, K4, M(76) ); R( d, e, a, b, c, F4, K4, M(77) ); R( c, d, e, a, b, F4, K4, M(78) ); R( b, c, d, e, a, F4, K4, M(79) ); a = ctx->A += a; b = ctx->B += b; c = ctx->C += c; d = ctx->D += d; e = ctx->E += e; } } dibbler-1.0.1/Port-sun/0000775000175000017500000000000012561700422011645 500000000000000dibbler-1.0.1/Port-sun/dibbler-relay.cpp0000644000175000017500000000555712277722750015034 00000000000000/* * Dibbler - a portable DHCPv6 * * authors: Tomasz Mrugalski * * released under GNU GPL v2 only licence * */ #include #include #include #include "DHCPRelay.h" #include "Portable.h" #include "Logger.h" #include "daemon.h" using namespace std; TDHCPRelay * ptr; void signal_handler(int n) { Log(Crit) << "Signal received. Shutting down." << LogEnd; ptr->stop(); } int status() { int pid = getServerPID(); if (pid==-1) { cout << "Dibbler server: NOT RUNNING." << endl; } else { cout << "Dibbler server: RUNNING, pid=" << pid << endl; } pid = getClientPID(); if (pid==-1) { cout << "Dibbler client: NOT RUNNING." << endl; } else { cout << "Dibbler client: RUNNING, pid=" << pid << endl; } pid = getRelayPID(); if (pid==-1) { cout << "Dibbler relay : NOT RUNNING." << endl; } else { cout << "Dibbler relay : RUNNING, pid=" << pid << endl; } return pid; } int run() { if (!init(RELPID_FILE, WORKDIR)) { return -1; } TDHCPRelay relay(RELCONF_FILE); ptr = &relay; if (ptr->isDone()) { return -1; } // connect signals signal(SIGTERM, signal_handler); signal(SIGINT, signal_handler); ptr->run(); die(RELPID_FILE); return 0; } int help() { cout << "Usage:" << endl; cout << " dibbler-relay ACTION" << endl << " ACTION = status|start|stop|install|uninstall|run" << endl << " status - show status and exit" << endl << " start - start installed service" << endl << " stop - stop installed service" << endl << " install - Not available in Linux/Unix systems." << endl << " uninstall - Not available in Linux/Unix systems." << endl << " run - run in the console" << endl << " help - displays usage info." << endl; return 0; } int main(int argc, char * argv[]) { char command[256]; int result=-1; logStart("(RELAY, SunOS port)", "Relay", RELLOG_FILE); // parse command line parameters if (argc>1) { int len = strlen(argv[1])+1; if (len>255) len = 255; strncpy(command,argv[1],len); } else { memset(command,0,256); } if (!strncasecmp(command,"start",5) ) { result = start(RELPID_FILE, WORKDIR); } else if (!strncasecmp(command,"run",3) ) { result = run(); } else if (!strncasecmp(command,"stop",4)) { result = stop(RELPID_FILE); } else if (!strncasecmp(command,"status",6)) { result = status(); } else if (!strncasecmp(command,"help",4)) { result = help(); } else if (!strncasecmp(command,"install",7)) { cout << "Function not available in Linux/Unix systems." << endl; result = 0; } else if (!strncasecmp(command,"uninstall",9)) { cout << "Function not available in Linux/Unix systems." << endl; result = 0; } else { help(); } logEnd(); return result; } dibbler-1.0.1/Port-sun/dibbler-server.cpp0000644000175000017500000000570512277722750015221 00000000000000/* * Dibbler - a portable DHCPv6 * * authors: Tomasz Mrugalski * Marek Senderski * * released under GNU GPL v2 only licence * */ #include #include #include #include "DHCPServer.h" #include "Portable.h" #include "Logger.h" #include "daemon.h" using namespace std; TDHCPServer * ptr; void signal_handler(int n) { Log(Crit) << "Signal received. Shutting down." << LogEnd; ptr->stop(); } int status() { int pid = getServerPID(); if (pid==-1) { cout << "Dibbler server: NOT RUNNING." << endl; } else { cout << "Dibbler server: RUNNING, pid=" << pid << endl; } int result = pid; pid = getClientPID(); if (pid==-1) { cout << "Dibbler client: NOT RUNNING." << endl; } else { cout << "Dibbler client: RUNNING, pid=" << pid << endl; } pid = getRelayPID(); if (pid==-1) { cout << "Dibbler relay : NOT RUNNING." << endl; } else { cout << "Dibbler relay : RUNNING, pid=" << pid << endl; } return result; } int run() { if (!init(SRVPID_FILE, WORKDIR)) { die(SRVPID_FILE); return -1; } TDHCPServer srv(SRVCONF_FILE); ptr = &srv; if (ptr->isDone()) { die(SRVPID_FILE); return -1; } // connect signals signal(SIGTERM, signal_handler); signal(SIGINT, signal_handler); ptr->run(); die(SRVPID_FILE); return 0; } int help() { cout << "Usage:" << endl; cout << " dibbler-server ACTION" << endl << " ACTION = status|start|stop|run" << endl << " status - show status and exit" << endl << " start - start installed service" << endl << " stop - stop installed service" << endl << " install - Not available in Linux/Unix systems." << endl << " uninstall - Not available in Linux/Unix systems." << endl << " run - run in the console" << endl << " help - displays usage info." << endl; return 0; } int main(int argc, char * argv[]) { char command[256]; int result=-1; logStart("(SERVER, SunOS port)", "Server", SRVLOG_FILE); // parse command line parameters if (argc>1) { int len = strlen(argv[1])+1; if (len>255) len = 255; strncpy(command,argv[1],len); } else { memset(command,0,256); } if (!strncasecmp(command,"start",5) ) { result = start(SRVPID_FILE, WORKDIR); } else if (!strncasecmp(command,"run",3) ) { result = run(); } else if (!strncasecmp(command,"stop",4)) { result = stop(SRVPID_FILE); } else if (!strncasecmp(command,"status",6)) { result = status(); } else if (!strncasecmp(command,"help",4)) { result = help(); } else if (!strncasecmp(command,"install",7)) { cout << "Function not available in Linux/Unix systems." << endl; result = 0; } else if (!strncasecmp(command,"uninstall",9)) { cout << "Function not available in Linux/Unix systems." << endl; result = 0; } else { help(); } logEnd(); return result; } dibbler-1.0.1/Port-sun/Makefile.am0000644000175000017500000000046112277722750013634 00000000000000noinst_LIBRARIES = libLowLevel.a libLowLevel_a_CPPFLAGS = -I$(top_srcdir)/Misc libLowLevel_a_CFLAGS = -D__EXTENSIONS__ -D_XOPEN_SOURCE=1 -D_XOPEN_SOURCE_EXTENDED=1 libLowLevel_a_SOURCES = daemon.cpp daemon.h lowlevel-sun.c lowlevel-options-sun.c dibbler-client.cpp dibbler-server.cpp dibbler-relay.cpp dibbler-1.0.1/Port-sun/dibbler-client.cpp0000644000175000017500000000621612277722750015167 00000000000000/* * Dibbler - a portable DHCPv6 * * authors: Tomasz Mrugalski * * released under GNU GPL v2 only licence * */ #include #include #include #include "DHCPClient.h" #include "Portable.h" #include "Logger.h" #include "daemon.h" using namespace std; TDHCPClient * ptr; void signal_handler(int n) { Log(Crit) << "Signal received. Shutting down." << LogEnd; ptr->stop(); } int status() { pid_t pid = getServerPID(); if (pid==-1) { cout << "Dibbler server: NOT RUNNING." << endl; } else { cout << "Dibbler server: RUNNING, pid=" << pid << endl; } pid = getClientPID(); if (pid==-1) { cout << "Dibbler client: NOT RUNNING." << endl; } else { cout << "Dibbler client: RUNNING, pid=" << pid << endl; } int result = (pid > 0)? 0: -1; pid = getRelayPID(); if (pid==-1) { cout << "Dibbler relay : NOT RUNNING." << endl; } else { cout << "Dibbler relay : RUNNING, pid=" << pid << endl; } return result; } int run() { if (!init(CLNTPID_FILE, WORKDIR)) { die(CLNTPID_FILE); return -1; } if (lowlevelInit()<0) { cout << "Lowlevel init failed:" << error_message() << endl; die(CLNTPID_FILE); return -1; } TDHCPClient client(CLNTCONF_FILE); ptr = &client; if (ptr->isDone()) { die(CLNTPID_FILE); return -1; } // connect signals (SIGTERM, SIGINT = shutdown) signal(SIGTERM, signal_handler); signal(SIGINT, signal_handler); ptr->run(); lowlevelExit(); die(CLNTPID_FILE); return 0; } int help() { cout << "Usage:" << endl; cout << " dibbler-client ACTION" << endl << " ACTION = status|start|stop|install|uninstall|run" << endl << " status - show status and exit" << endl << " start - start installed service" << endl << " stop - stop installed service" << endl << " install - Not available in Linux/Unix systems." << endl << " uninstall - Not available in Linux/Unix systems." << endl << " run - run in the console" << endl << " help - displays usage info." << endl; return 0; } int main(int argc, char * argv[]) { char command[256]; int result=-1; logStart("(CLIENT, SunOS port)", "Client", CLNTLOG_FILE); // parse command line parameters if (argc>1) { int len = strlen(argv[1])+1; if (len>255) len = 255; strncpy(command,argv[1],len); } else { memset(command,0,256); } if (!strncasecmp(command,"start",5) ) { result = start(CLNTPID_FILE, WORKDIR); } else if (!strncasecmp(command,"run",3) ) { result = run(); } else if (!strncasecmp(command,"stop",4)) { result = stop(CLNTPID_FILE); } else if (!strncasecmp(command,"status",6)) { result = status(); } else if (!strncasecmp(command,"help",4)) { result = help(); } else if (!strncasecmp(command,"install",7)) { cout << "Function not available in Linux/Unix systems." << endl; result = 0; } else if (!strncasecmp(command,"uninstall",9)) { cout << "Function not available in Linux/Unix systems." << endl; result = 0; } else { help(); } logEnd(); return result? EXIT_FAILURE: EXIT_SUCCESS; } dibbler-1.0.1/Port-sun/lowlevel-sun.c0000644000175000017500000004144712277722750014411 00000000000000/* * Dibbler - a portable DHCPv6 * * author: Paul Schauer * changes: Tomasz Mrugalski * * released under GNU GPL v2 licence * * Based on Port-linux/lowlevel-linux.c * */ #include "dibbler-config.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "Portable.h" #include #ifdef OPENBSD #include "sys/uio.h" #endif /* Useful links: msg_control info: http://docs.oracle.com/cd/E23824_01/html/821-1466/recvmsg-3xnet.html#scrolltoc */ // #define LOWLEVEL_DEBUG 0 char Message[1024] = {0}; int lowlevelInit() { return LOWLEVEL_NO_ERROR; } int lowlevelExit() { return LOWLEVEL_NO_ERROR; } void if_list_release(struct iface * list) { struct iface * tmp; while (list) { tmp = list->next; if (list->linkaddrcount) free(list->linkaddr); if (list->globaladdrcount) free(list->globaladdr); free(list); list = tmp; } } void if_print(struct iface * iface_ptr) { int tmp, tmpInt = 0; printf("Interface %s, index=%i type=%x flags=%x\n", iface_ptr->name, iface_ptr->id, iface_ptr->hardwareType, iface_ptr->flags); printf("\tLink layer Length: %x Addr:", iface_ptr->maclen); for (tmp = 0; tmp < iface_ptr->maclen; tmp++) { printf("%02x:", (unsigned char) iface_ptr->mac[tmp]); } printf("\n"); printf("\tLocal IPv6 address count: %i, address ", iface_ptr->linkaddrcount); for (tmp = 0; tmp < iface_ptr->linkaddrcount; tmp++) { printf("\t%i=", tmp); for (tmpInt = 0; tmpInt < 16; tmpInt += 2) { printf("%02x%02x:", (unsigned char) iface_ptr->linkaddr[tmpInt + tmp * 16], (unsigned char) iface_ptr->linkaddr[tmpInt + 1 + tmp * 16]); } printf("\n"); } if (iface_ptr->linkaddrcount==0) printf("\n"); printf("\t%s Global IPv6 address count: %i, address ", iface_ptr->name, iface_ptr->globaladdrcount); tmpInt = 0; for (tmp = 0; tmp < iface_ptr->globaladdrcount; tmp++) { printf("\t%i=", tmp); for (tmpInt = 0; tmpInt < 16; tmpInt += 2) { printf("%02x%02x:", (unsigned char) iface_ptr->globaladdr[tmpInt+ tmp * 16], (unsigned char) iface_ptr->globaladdr[tmpInt + 1 + tmp * 16]); } printf("\n"); } if (iface_ptr->globaladdrcount==0) printf("\n"); } struct iface * if_list_add(struct iface * head, struct iface * element) { struct iface *tmp; element->next = NULL; if (!head) return element; tmp = head; while (tmp->next != NULL) { tmp = tmp->next; } tmp->next = element; return head; } /* * returns interface list with detailed informations */ struct iface * if_list_get() { /* * Translating between Mac OS X internal representation of link and IP address * and Dibbler internal format. */ struct ifaddrs *addrs_lst = NULL; // list returned by system struct ifaddrs *addr_ptr = NULL; // single address struct iface *iface_lst = NULL; // interface list struct iface *iface_ptr = NULL; // pointer to single interface if (getifaddrs(&addrs_lst) != 0) { perror("Error in getifaddrs: "); return iface_lst; } /* First pass through entire addrs_lst: collect unique interface names and flags */ addr_ptr = addrs_lst; while (addr_ptr != NULL) { // check if this interface name is already on target list iface_ptr = iface_lst; while (iface_ptr!=NULL) { if (!strcmp(addr_ptr->ifa_name, iface_ptr->name)) break; iface_ptr = iface_ptr->next; } if (!iface_ptr) { // interface with that name not found, let's add one! iface_ptr = malloc(sizeof(struct iface)); memset(iface_ptr, 0, sizeof(struct iface)); strncpy(iface_ptr->name, addr_ptr->ifa_name, MAX_IFNAME_LENGTH - 1); iface_ptr->name[MAX_IFNAME_LENGTH-1] = 0; iface_ptr->id = if_nametoindex(iface_ptr->name); iface_ptr->flags = addr_ptr->ifa_flags; #ifdef LOWLEVEL_DEBUG printf("Detected interface %s, ifindex=%d, flags=%d\n", iface_ptr->name, iface_ptr->id, iface_ptr->flags); #endif // add this new structure to the end of the interfaces list iface_lst = if_list_add(iface_lst, iface_ptr); } addr_ptr = addr_ptr->ifa_next; } /* * Second pass through addrs_lst: collect link and IP layer info for each interface * by name */ // for each address... for (addr_ptr = addrs_lst; addr_ptr != NULL; addr_ptr = addr_ptr->ifa_next) { for (iface_ptr = iface_lst; iface_ptr != NULL; iface_ptr = iface_ptr->next) { // ... find its corresponding interface if (strncmp(iface_ptr->name, addr_ptr->ifa_name, strlen(addr_ptr->ifa_name))) continue; switch (addr_ptr->ifa_addr->sa_family) { case AF_INET6: { char * ptr = (char*)(&((struct sockaddr_in6 *) addr_ptr->ifa_addr)->sin6_addr); if (ptr[0] == 0xfe && ptr[1] == 0x80) { // link-local IPv6 address char * addrs = malloc( (iface_ptr->linkaddrcount+1)*16); memcpy(addrs, iface_ptr->linkaddr, 16*iface_ptr->linkaddrcount); memcpy(addrs + 16*iface_ptr->linkaddrcount, ptr, 16); free(iface_ptr->linkaddr); iface_ptr->linkaddr = addrs; iface_ptr->linkaddrcount++; } else { // this is global address char * addrs = malloc( (iface_ptr->globaladdrcount+1)*16); memcpy(addrs, iface_ptr->globaladdr, 16*iface_ptr->globaladdrcount); memcpy(addrs + 16*iface_ptr->globaladdrcount, ptr, 16); free(iface_ptr->globaladdr); iface_ptr->globaladdr = addrs; iface_ptr->globaladdrcount++; } break; } // end of AF_INET6 handling case AF_LINK: { struct sockaddr_dl *linkInfo; linkInfo = (struct sockaddr_dl *) addr_ptr->ifa_addr; // Note: sdl_type is unsigned character; hardwareType is integer iface_ptr->hardwareType = linkInfo->sdl_type; if (linkInfo->sdl_alen > 1) { memcpy(iface_ptr->mac, LLADDR(linkInfo), linkInfo->sdl_alen); iface_ptr->maclen = linkInfo->sdl_alen; } break; } default: break; // ignore other address families } } } /* Print out iface_lst data if debug mode */ #ifdef LOWLEVEL_DEBUG iface_ptr = iface_lst; while (iface_ptr) { if_print(iface_ptr); iface_ptr = iface_ptr->next; } #endif return iface_lst; } /* end of if_list_get */ int ipaddr_add(const char * ifacename, int ifaceid, const char * addr, unsigned long pref, unsigned long valid, int prefixLength) { char buf[512]; int status; sprintf(buf, "ifconfig %s inet6 %s prefixlen %d add", ifacename, addr, prefixLength); status = system(buf); if (!status) return LOWLEVEL_NO_ERROR; return LOWLEVEL_ERROR_UNSPEC; } int ipaddr_update(const char* ifacename, int ifindex, const char* addr, unsigned long pref, unsigned long valid, int prefixLength) { /// @todo: implement this sprintf(Message, "Address update on BSD systems not implemented yet."); return LOWLEVEL_ERROR_NOT_IMPLEMENTED; } int ipaddr_del(const char * ifacename, int ifaceid, const char * addr, int prefixLength) { char buf[512]; int status; sprintf(buf, "ifconfig %s inet6 %s prefixlen %d delete", ifacename, addr, prefixLength); status = system(buf); if (!status) return LOWLEVEL_NO_ERROR; return LOWLEVEL_ERROR_UNSPEC; } int sock_add(char * ifacename, int ifaceid, char * addr, int port, int thisifaceonly, int reuse) { int error; int on = 1; struct addrinfo hints; struct addrinfo *res; int Insock; int multicast; char port_char[6]; char * tmp; struct sockaddr_in6 bindme; sprintf(port_char, "%d", port); /* just because I can't make Solaris version of strncasecmp to work */ if (strlen(addr)>=2 && (tolower(addr[0]) == 'f') && (tolower(addr[1])== 'f') ) multicast = 1; else multicast = 0; #ifdef LOWLEVEL_DEBUG printf( "LOWLEVEL_DEBUG iface: %s(id=%d), addr=%s, port=%d, ifaceonly=%d reuse=%d###\n", ifacename, ifaceid, addr, port, thisifaceonly, reuse); fflush(stdout); #endif /* Open a socket for inbound traffic */ memset(&hints, 0, sizeof (hints)); hints.ai_family = PF_INET6; hints.ai_socktype = SOCK_DGRAM; hints.ai_protocol = IPPROTO_UDP; hints.ai_flags = AI_PASSIVE; if ((error = getaddrinfo(NULL, port_char, &hints, &res))) { sprintf(Message, "getaddrinfo failed. Is IPv6 protocol supported by kernel?"); return LOWLEVEL_ERROR_GETADDRINFO; } if ((Insock = socket(AF_INET6, SOCK_DGRAM, 0)) < 0) { sprintf(Message, "socket creation failed. Is IPv6 protocol supported by kernel?"); return LOWLEVEL_ERROR_UNSPEC; } /* Mac OS X have IPV6_PKTINFO only */ /* OpenBSD, NetBSD require IPV6_RECVPKTINFO */ #if (HAVE_DECL_IPV6_RECVPKTINFO == 0) && (HAVE_DECL_IPV6_PKTINFO == 0) #error "Both IPV6_RECVPKTINFO and IPV6_PKTINFO not defined. Need at least one of them" #endif /* Set the options to receive info about ipv6 traffic */ #if HAVE_DECL_IPV6_RECVPKTINFO == 1 if (setsockopt(Insock, IPPROTO_IPV6, IPV6_RECVPKTINFO, &on, sizeof (on)) < 0) #endif #if HAVE_DECL_IPV6_PKTINFO == 1 if (setsockopt(Insock, IPPROTO_IPV6, IPV6_PKTINFO, &on, sizeof(on)) < 0) #endif { sprintf(Message, "Failed to set up socket option (tried both IPV6_RECVPKTINFO and IPV6_PKTINFO)."); return LOWLEVEL_ERROR_SOCK_OPTS; } if (thisifaceonly) { #if 0 /* this part also looks like linux only code */ if (setsockopt(Insock, SOL_SOCKET, SO_BINDTODEVICE, ifacename, strlen(ifacename) + 1) < 0) { sprintf(Message, "Unable to bind socket to interface %s.", ifacename); return LOWLEVEL_ERROR_BIND_IFACE; } #endif } /* allow address reuse (this option sucks - why allow running multiple servers?) */ if (reuse != 0) { if (setsockopt(Insock, SOL_SOCKET, SO_REUSEADDR, &on, sizeof (on)) < 0) { sprintf(Message, "Unable to set up socket option SO_REUSEADDR."); return LOWLEVEL_ERROR_REUSE_FAILED; } } /* bind socket to a specified port */ bzero(&bindme, sizeof (struct sockaddr_in6)); bindme.sin6_family = AF_INET6; bindme.sin6_port = htons(port); /* Bind to interface using scope_id */ bindme.sin6_scope_id = ifaceid; tmp = (char*) (&bindme.sin6_addr); inet_pton6(addr, tmp); if (bind(Insock, (struct sockaddr*) & bindme, sizeof (bindme)) < 0) { sprintf(Message, "Unable to bind socket: %s", strerror(errno)); return LOWLEVEL_ERROR_BIND_FAILED; } freeaddrinfo(res); /* multicast server stuff */ if (multicast) { struct ipv6_mreq mreq6; memset(&mreq6, 0, sizeof (mreq6)); mreq6.ipv6mr_interface = ifaceid; tmp = (char*) (&mreq6.ipv6mr_multiaddr); inet_pton6(addr, tmp); /* Add to the all agent multicast address */ if (setsockopt(Insock, IPPROTO_IPV6, IPV6_JOIN_GROUP, &mreq6, sizeof (mreq6))) { sprintf(Message, "error joining ipv6 group"); return LOWLEVEL_ERROR_MCAST_MEMBERSHIP; } } return Insock; } int sock_del(int fd) { return close(fd); } int sock_send(int sock, char *addr, char *buf, int message_len, int port, int iface) { int result; struct sockaddr_in6 dst; memset(&dst, 0, sizeof (struct sockaddr_in6)); // dst.sin6_len = sizeof(struct sockaddr_in6); // field missing on Solaris 11 dst.sin6_family = PF_INET6; dst.sin6_port = htons(port); // htons? inet_pton6(addr,(char*)&dst.sin6_addr); dst.sin6_scope_id = iface; result = sendto(sock, buf, message_len, 0, (struct sockaddr*)&dst, sizeof(struct sockaddr_in6)); if (result < 0) { sprintf(Message, "Unable to send data (dst addr: %s), error=%d", addr, result); return LOWLEVEL_ERROR_SOCKET; } return LOWLEVEL_NO_ERROR; } /* * */ int sock_recv(int fd, char * myPlainAddr, char * peerPlainAddr, char * buf, int buflen) { struct msghdr msg; /* message received by recvmsg */ struct sockaddr_in6 peerAddr; /* sender address */ struct sockaddr_in6 myAddr; /* my address */ struct iovec iov; /* simple structure containing buffer address and length */ struct cmsghdr *cm; /* control message */ struct in6_pktinfo *pktinfo; char control[CMSG_SPACE(sizeof (struct in6_pktinfo))]; char controlLen = CMSG_SPACE(sizeof (struct in6_pktinfo)); int result = 0; bzero(&msg, sizeof (msg)); bzero(&peerAddr, sizeof (peerAddr)); bzero(&myAddr, sizeof (myAddr)); bzero(&control, sizeof (control)); iov.iov_base = buf; iov.iov_len = buflen; msg.msg_name = &peerAddr; msg.msg_namelen = sizeof (peerAddr); msg.msg_iov = &iov; msg.msg_iovlen = 1; msg.msg_control = control; msg.msg_controllen = controlLen; result = recvmsg(fd, &msg, 0); if (result == -1) { return LOWLEVEL_ERROR_UNSPEC; } /* get source address */ inet_ntop6((void*) & peerAddr.sin6_addr, peerPlainAddr); /* get destination address */ for (cm = (struct cmsghdr *) CMSG_FIRSTHDR(&msg); cm; cm = (struct cmsghdr *) CMSG_NXTHDR(&msg, cm)) { if (cm->cmsg_level != IPPROTO_IPV6 || cm->cmsg_type != IPV6_PKTINFO) continue; pktinfo = (struct in6_pktinfo *) (CMSG_DATA(cm)); inet_ntop6((void*) & pktinfo->ipi6_addr, myPlainAddr); } return result; } #if 0 void microsleep(int microsecs) { struct timespec x, y; x.tv_sec = (int) microsecs / 1000000; x.tv_nsec = (microsecs - x.tv_sec * 1000000) * 1000; nanosleep(&x, &y); } #endif /* * returns: -1 - address not found, 0 - addr is ok, 1 - addr is tentative */ int is_addr_tentative(char * ifacename, int iface, char * addr) { /// @todo: implement this return 0; } char * getAAAKeyFilename(uint32_t SPI) { static char filename[1024]; if (SPI != 0) snprintf(filename, 1024, "%s%s%x", "/var/lib/dibbler/AAA/", "AAA-key-", SPI); else strcpy(filename, "/var/lib/dibbler/AAA/AAA-key"); return filename; } char * getAAAKey(uint32_t SPI, unsigned *len) { char * filename = 0; struct stat st; char * retval; int offset = 0; int fd; int ret; filename = getAAAKeyFilename(SPI); if (stat(filename, &st)) return NULL; fd = open(filename, O_RDONLY); if (0 > fd) return NULL; retval = malloc(st.st_size); if (!retval) { close(fd); return NULL; } while (offset < st.st_size) { ret = read(fd, retval + offset, st.st_size - offset); if (!ret) break; if (ret < 0) { free(retval); close(fd); return NULL; } offset += ret; } close(fd); if (offset != st.st_size) { free(retval); return NULL; } *len = st.st_size; return retval; } char * error_message() { return Message; } /** * begin link monitoring * * @param monitored_links head of the monitored links list * @param notify pointer to variable that is going to be modifed if change is detected */ void link_state_change_init(volatile struct link_state_notify_t * monitored_links, volatile int * notify) { printf("Link change monitoring is not supported yet on Solaris. Sorry.\n"); return; } /** * cleanup code for link state monitoring * */ void link_state_change_cleanup() { return; } int get_mac_from_ipv6(const char* iface_name, int ifindex, const char* v6addr, char* mac, int* mac_len) { /// @todo: Implement this for Solaris return LOWLEVEL_ERROR_NOT_IMPLEMENTED; } dibbler-1.0.1/Port-sun/daemon.h0000644000175000017500000000134112277722750013212 00000000000000/* * Dibbler - a portable DHCPv6 * * authors: Tomasz Mrugalski * changes: Paul Schauer * * released under GNU GPL v2 only licence * * $Id: daemon.h,v 1.3 2009-04-19 21:37:44 thomson Exp $ * */ #ifndef DAEMON_H #define DAEMON_H #ifndef SIGTERM #define SIGTERM 15 #endif #ifndef SIGINT #define SIGINT 2 #endif int start(const char * pidfile, const char * workdir); int stop(const char * pidfile); int init(const char * pidfile, const char * workdir); int getPID(char * pidfile); int getServerPID(); int getClientPID(); int getRelayPID(); int die(const char * pidfile); void logStart(const char * note, const char * logname, const char * logfile); void logEnd(); #endif dibbler-1.0.1/Port-sun/lowlevel-options-sun.c0000644000175000017500000001663512277722750016103 00000000000000/* * Dibbler - a portable DHCPv6 * * authors: Tomasz Mrugalski * * released under GNU GPL v2 licence * */ #include #include #include #include #include #include "Portable.h" #define CR 0x0a #define LF 0x0d extern char * Message; /* * results 0 - ok -1 - unable to open temp. file -2 - unable to open resolv.conf file */ int dns_add(const char * ifname, int ifaceid, const char * addrPlain) { FILE * f; unsigned char c; if ( !(f=fopen(RESOLVCONF_FILE,"a+"))) { return LOWLEVEL_ERROR_FILE; } fseek(f, -1, SEEK_END); c = fgetc(f); fseek(f,0, SEEK_END); if ( (c!=CR) && (c!=LF) ) { fprintf(f,"\n"); } fprintf(f,"nameserver %s\n",addrPlain); fclose(f); return LOWLEVEL_NO_ERROR; } int dns_del(const char * ifname, int ifaceid, const char *addrPlain) { FILE * f, *f2; char buf[512]; int found=0; struct stat st; memset(&st,0,sizeof(st)); stat(RESOLVCONF_FILE, &st); unlink(RESOLVCONF_FILE".old"); rename(RESOLVCONF_FILE,RESOLVCONF_FILE".old"); f = fopen(RESOLVCONF_FILE".old","r"); f2 = fopen(RESOLVCONF_FILE,"w"); while (fgets(buf,511,f)) { if ( (!found) && (strstr(buf, addrPlain)) ) { found = 1; continue; } fprintf(f2,"%s",buf); } fclose(f); fclose(f2); chmod(RESOLVCONF_FILE, st.st_mode); return LOWLEVEL_NO_ERROR; } int domain_add(const char* ifname, int ifaceid, const char* domain) { FILE * f, *f2; char buf[512]; int found = 0; unsigned char c; struct stat st; memset(&st,0,sizeof(st)); stat(RESOLVCONF_FILE, &st); unlink(RESOLVCONF_FILE".old"); rename(RESOLVCONF_FILE,RESOLVCONF_FILE".old"); if ( !(f = fopen(RESOLVCONF_FILE".old","r")) ) return LOWLEVEL_ERROR_FILE; if ( !(f2= fopen(RESOLVCONF_FILE,"w+"))) { fclose(f); return LOWLEVEL_ERROR_FILE; } while (fgets(buf,511,f)) { if ( (!found) && (strstr(buf, "search")) ) { if (strlen(buf)) buf[strlen(buf)-1]=0; fprintf(f2, "%s %s\n", buf, domain); found = 1; continue; } fprintf(f2,"%s",buf); } fseek(f2, -1, SEEK_END); c = fgetc(f2); fseek(f2,0, SEEK_END); if ( (c!=CR) && (c!=LF) ) { fprintf(f2,"\n"); } if (!found) fprintf(f2,"search %s\n",domain); fclose(f); fclose(f2); chmod(RESOLVCONF_FILE,st.st_mode); return LOWLEVEL_NO_ERROR; } int domain_del(const char * ifname, int ifaceid, const char *domain) { FILE * f, *f2; char buf[512], searchbuf[512], *ptr; int found=0; struct stat st; memset(&st,0,sizeof(st)); stat(RESOLVCONF_FILE, &st); if (strlen(domain) >= sizeof(searchbuf)-1 ) return LOWLEVEL_ERROR_UNSPEC; searchbuf[0] = ' '; strcpy(&(searchbuf[1]), domain); unlink(RESOLVCONF_FILE".old"); rename(RESOLVCONF_FILE,RESOLVCONF_FILE".old"); if ( !(f = fopen(RESOLVCONF_FILE".old","r")) ) { return LOWLEVEL_ERROR_FILE; } if ( !(f2= fopen(RESOLVCONF_FILE,"w+"))) { fclose(f); return LOWLEVEL_ERROR_FILE; } while (fgets(buf,511,f)) { if ( (!found) && (ptr=strstr(buf, searchbuf)) ) { found = 1; strcpy(ptr, ptr+strlen(searchbuf)); if (strlen(buf)<11) /* 11=minimum length (one letter domain in 2letter top domain, e.g. "search x.pl") */ continue; } fprintf(f2,"%s",buf); } fclose(f); fclose(f2); chmod(RESOLVCONF_FILE,st.st_mode); return LOWLEVEL_NO_ERROR; } int ntp_add(const char* ifname, const int ifindex, const char* addrPlain){ FILE * f; unsigned char c; if ( !(f=fopen(NTPCONF_FILE,"a+"))) { return LOWLEVEL_ERROR_FILE; } fseek(f, -1, SEEK_END); c = fgetc(f); fseek(f,0, SEEK_END); if ( (c!=CR) && (c!=LF) ) { fprintf(f,"\n"); } fprintf(f,"server %s\n",addrPlain); fclose(f); return LOWLEVEL_NO_ERROR; } int ntp_del(const char* ifname, const int ifindex, const char* addrPlain){ FILE * f, *f2; char buf[512]; int found=0; struct stat st; memset(&st,0,sizeof(st)); stat(NTPCONF_FILE, &st); unlink(NTPCONF_FILE".old"); rename(NTPCONF_FILE, NTPCONF_FILE".old"); f = fopen(NTPCONF_FILE".old","r"); f2 = fopen(NTPCONF_FILE,"w"); while (fgets(buf,511,f)) { if ( (!found) && (strstr(buf, addrPlain)) ) { found = 1; continue; } fprintf(f2,"%s",buf); } fclose(f); fclose(f2); chmod(NTPCONF_FILE, st.st_mode); return LOWLEVEL_NO_ERROR; } int timezone_set(const char* ifname, int ifindex, const char* timezone){ return LOWLEVEL_NO_ERROR; } int timezone_del(const char* ifname, int ifindex, const char* timezone){ return LOWLEVEL_NO_ERROR; } int sipserver_add(const char* ifname, const int ifindex, const char* addrPlain){ return LOWLEVEL_NO_ERROR; } int sipserver_del(const char* ifname, const int ifindex, const char* addrPlain){ return LOWLEVEL_NO_ERROR; } int sipdomain_add(const char* ifname, int ifindex, const char* domain){ return LOWLEVEL_NO_ERROR; } int sipdomain_del(const char* ifname, int ifindex, const char* domain){ return LOWLEVEL_NO_ERROR; } int nisserver_add(const char* ifname, const int ifindex, const char* addrPlain){ return LOWLEVEL_NO_ERROR; } int nisserver_del(const char* ifname, const int ifindex, const char* addrPlain){ return LOWLEVEL_NO_ERROR; } int nisdomain_set(const char* ifname, int ifindex, const char* domain){ return LOWLEVEL_NO_ERROR; } int nisdomain_del(const char* ifname, int ifindex, const char* domain){ return LOWLEVEL_NO_ERROR; } int nisplusserver_add(const char* ifname, const int ifindex, const char* addrPlain){ return LOWLEVEL_NO_ERROR; } int nisplusserver_del(const char* ifname, const int ifindex, const char* addrPlain){ return LOWLEVEL_NO_ERROR; } int nisplusdomain_set(const char* ifname, int ifindex, const char* domain){ return LOWLEVEL_NO_ERROR; } int nisplusdomain_del(const char* ifname, int ifindex, const char* domain){ return LOWLEVEL_NO_ERROR; } /** * adds prefix - if this node has IPv6 forwarding disabled, it will configure that prefix on the * interface, which prefix has been received on. If the forwarding is enabled, it will be assigned * to all other up, running and multicast capable interfaces. * In both cases, radvd.conf file will be created. * * @param ifname interface name * @param ifindex interface index * @param prefixPlain prefix (specified in human readable format) * @param prefixLength prefix length * @param prefered preferred lifetime * @param valid valid lifetime * * @return negative error code or 0 if successful */ int prefix_add(const char* ifname, int ifindex, const char* prefixPlain, int prefixLength, unsigned long prefered, unsigned long valid) { /** @todo: implement this */ sprintf(error_message(), "Prefix configuration on BSD systems not implemented yet."); return LOWLEVEL_ERROR_NOT_IMPLEMENTED; } int prefix_update(const char* ifname, int ifindex, const char* prefixPlain, int prefixLength, unsigned long prefered, unsigned long valid) { /** @todo: implement this */ sprintf(error_message(), "Prefix configuration on BSD systems not implemented yet."); return LOWLEVEL_ERROR_NOT_IMPLEMENTED; } int prefix_del(const char* ifname, int ifindex, const char* prefixPlain, int prefixLength) { /** @todo: implement this */ sprintf(error_message(), "Prefix configuration on BSD systems not implemented yet."); return LOWLEVEL_ERROR_NOT_IMPLEMENTED; } dibbler-1.0.1/Port-sun/daemon.cpp0000644000175000017500000001152412277722750013551 00000000000000/* * Dibbler - a portable DHCPv6 * * authors: Tomasz Mrugalski * changes: Paul Schauer * * released under GNU GPL v2 licence * */ #include #include #include #include #include #include #include #include #include #include "Portable.h" #include "Logger.h" extern int status(); extern int run(); using namespace std; /** * checks if pid file exists, and returns its content (or -2 if unable to read) * * @param file * * @return pid value, or negative if error was detected */ pid_t getPID(const char * file) { /* check if the file exists */ struct stat buf; int i = stat(file, &buf); if (i!=0) return LOWLEVEL_ERROR_UNSPEC; ifstream pidfile(file); if (!pidfile.is_open()) return LOWLEVEL_ERROR_FILE; pid_t pid; pidfile >> pid; return pid; } pid_t getClientPID() { return getPID(CLNTPID_FILE); } pid_t getServerPID() { return getPID(SRVPID_FILE); } pid_t getRelayPID() { return getPID(RELPID_FILE); } void daemon_init() { std::cout << "Starting daemon..." << std::endl; // daemon should close all open files fclose(stdin); fclose(stdout); fclose(stderr); pid_t childpid; cout << "Starting daemon..." << endl; logger::EchoOff(); if (getppid()!=1) { #ifdef SIGTTOU signal(SIGTTOU, SIG_IGN); #endif #ifdef SIGTTIN signal(SIGTTIN, SIG_IGN); #endif #ifdef SIGTSTP signal(SIGTSTP, SIG_IGN); #endif if ( (childpid = fork()) <0 ) { Log(Crit) << "Can't fork first child." << endl; return; } else if (childpid > 0) exit(EXIT_SUCCESS); // parent process #if 0 // @todo: daemon spawning in Mac OS is done a bit differently if (setpgrp(0) == -1) { Log(Crit) << "Can't change process group." << endl; return; } #endif signal( SIGHUP, SIG_IGN); if ( (childpid = fork()) <0) { cout << "Can't fork second child." << endl; return; } else if (childpid > 0) exit(EXIT_SUCCESS); // first child } // getppid()!=1 umask(DEFAULT_UMASK); } void daemon_die() { logger::Terminate(); logger::EchoOn(); } int init(const char * pidfile, const char * workdir) { string tmp; int pid = getPID(pidfile); if (pid > 0) { /** @todo: This is linux-specific. It will not work on Solaris */ char buf[20]; char cmd[256]; sprintf(buf,"/proc/%d", pid); if (!access(buf, F_OK)) { sprintf(buf, "/proc/%d/exe", pid); int len=readlink(buf, cmd, sizeof(cmd)); if(len!=-1) { cmd[len]=0; if(strstr(cmd, "dibbler")==NULL) { Log(Warning) << "Process is running but it is not Dibbler (pid=" << pid << ", name " << cmd << ")." << LogEnd; } else { Log(Crit) << "Process already running and it seems to be Dibbler (pid=" << pid << ", name " << cmd << ")." << LogEnd; return 0; } } else { Log(Crit) << "Process already running (pid=" << pid << ", file " << pidfile << " is present)." << LogEnd; return 0; } } else { Log(Warning) << "Pid file found (pid=" << pid << ", file " << pidfile << "), but process " << pid << " does not exist." << LogEnd; } } unlink(pidfile); ofstream pidFile(pidfile); if (!pidFile.is_open()) { Log(Crit) << "Unable to create " << pidfile << " file." << LogEnd; return 0; } pidFile << getpid(); pidFile.close(); Log(Notice) << "My pid (" << getpid() << ") is stored in " << pidfile << LogEnd; if (chdir(workdir)) { Log(Crit) << "Unable to change directory to " << workdir << "." << LogEnd; return 0; } umask(DEFAULT_UMASK); return 1; } void die(const char * pidfile) { if (unlink(pidfile)) { Log(Warning) << "Unable to delete " << pidfile << "." << LogEnd; } } int start(const char * pidfile, const char * workdir) { int result; daemon_init(); result = run(); daemon_die(); return result; } int stop(const char * pidfile) { int pid = getPID(pidfile); if (pid==-1) { cout << "Process is not running." << endl; return -1; } cout << "Sending KILL signal to process " << pid << endl; kill(pid, SIGTERM); return 0; } int install() { return 0; } int uninstall() { return 0; } /** things to do just after started */ void logStart(const char * note, const char * logname, const char * logfile) { std::cout << DIBBLER_COPYRIGHT1 << " " << note << std::endl; std::cout << DIBBLER_COPYRIGHT2 << std::endl; std::cout << DIBBLER_COPYRIGHT3 << std::endl; std::cout << DIBBLER_COPYRIGHT4 << std::endl; logger::setLogName(logname); logger::Initialize(logfile); logger::EchoOff(); Log(Emerg) << DIBBLER_COPYRIGHT1 << " " << note << LogEnd; logger::EchoOn(); } /** things to do just before end */ void logEnd() { logger::Terminate(); } dibbler-1.0.1/Port-sun/Makefile.in0000664000175000017500000010143412561652535013650 00000000000000# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = Port-sun DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/depcomp ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/libtool.m4 \ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/include/dibbler-config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = LIBRARIES = $(noinst_LIBRARIES) ARFLAGS = cru AM_V_AR = $(am__v_AR_@AM_V@) am__v_AR_ = $(am__v_AR_@AM_DEFAULT_V@) am__v_AR_0 = @echo " AR " $@; am__v_AR_1 = libLowLevel_a_AR = $(AR) $(ARFLAGS) libLowLevel_a_LIBADD = am_libLowLevel_a_OBJECTS = libLowLevel_a-daemon.$(OBJEXT) \ libLowLevel_a-lowlevel-sun.$(OBJEXT) \ libLowLevel_a-lowlevel-options-sun.$(OBJEXT) \ libLowLevel_a-dibbler-client.$(OBJEXT) \ libLowLevel_a-dibbler-server.$(OBJEXT) \ libLowLevel_a-dibbler-relay.$(OBJEXT) libLowLevel_a_OBJECTS = $(am_libLowLevel_a_OBJECTS) AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)/include depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) LTCXXCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CXXFLAGS) $(CXXFLAGS) AM_V_CXX = $(am__v_CXX_@AM_V@) am__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@) am__v_CXX_0 = @echo " CXX " $@; am__v_CXX_1 = CXXLD = $(CXX) CXXLINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \ $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CXXLD = $(am__v_CXXLD_@AM_V@) am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@) am__v_CXXLD_0 = @echo " CXXLD " $@; am__v_CXXLD_1 = SOURCES = $(libLowLevel_a_SOURCES) DIST_SOURCES = $(libLowLevel_a_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALLOCA = @ALLOCA@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ ARCH = @ARCH@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ EXTRA_DIST_SUBDIRS = @EXTRA_DIST_SUBDIRS@ FGREP = @FGREP@ GREP = @GREP@ GTEST_INCLUDES = @GTEST_INCLUDES@ GTEST_LDADD = @GTEST_LDADD@ GTEST_LDFLAGS = @GTEST_LDFLAGS@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LINKPRINT = @LINKPRINT@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PORT_CFLAGS = @PORT_CFLAGS@ PORT_LDFLAGS = @PORT_LDFLAGS@ PORT_SUBDIR = @PORT_SUBDIR@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ subdirs = @subdirs@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ noinst_LIBRARIES = libLowLevel.a libLowLevel_a_CPPFLAGS = -I$(top_srcdir)/Misc libLowLevel_a_CFLAGS = -D__EXTENSIONS__ -D_XOPEN_SOURCE=1 -D_XOPEN_SOURCE_EXTENDED=1 libLowLevel_a_SOURCES = daemon.cpp daemon.h lowlevel-sun.c lowlevel-options-sun.c dibbler-client.cpp dibbler-server.cpp dibbler-relay.cpp all: all-am .SUFFIXES: .SUFFIXES: .c .cpp .lo .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign Port-sun/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign Port-sun/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstLIBRARIES: -test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES) libLowLevel.a: $(libLowLevel_a_OBJECTS) $(libLowLevel_a_DEPENDENCIES) $(EXTRA_libLowLevel_a_DEPENDENCIES) $(AM_V_at)-rm -f libLowLevel.a $(AM_V_AR)$(libLowLevel_a_AR) libLowLevel.a $(libLowLevel_a_OBJECTS) $(libLowLevel_a_LIBADD) $(AM_V_at)$(RANLIB) libLowLevel.a mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libLowLevel_a-daemon.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libLowLevel_a-dibbler-client.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libLowLevel_a-dibbler-relay.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libLowLevel_a-dibbler-server.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libLowLevel_a-lowlevel-options-sun.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libLowLevel_a-lowlevel-sun.Po@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< libLowLevel_a-lowlevel-sun.o: lowlevel-sun.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libLowLevel_a_CPPFLAGS) $(CPPFLAGS) $(libLowLevel_a_CFLAGS) $(CFLAGS) -MT libLowLevel_a-lowlevel-sun.o -MD -MP -MF $(DEPDIR)/libLowLevel_a-lowlevel-sun.Tpo -c -o libLowLevel_a-lowlevel-sun.o `test -f 'lowlevel-sun.c' || echo '$(srcdir)/'`lowlevel-sun.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libLowLevel_a-lowlevel-sun.Tpo $(DEPDIR)/libLowLevel_a-lowlevel-sun.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='lowlevel-sun.c' object='libLowLevel_a-lowlevel-sun.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libLowLevel_a_CPPFLAGS) $(CPPFLAGS) $(libLowLevel_a_CFLAGS) $(CFLAGS) -c -o libLowLevel_a-lowlevel-sun.o `test -f 'lowlevel-sun.c' || echo '$(srcdir)/'`lowlevel-sun.c libLowLevel_a-lowlevel-sun.obj: lowlevel-sun.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libLowLevel_a_CPPFLAGS) $(CPPFLAGS) $(libLowLevel_a_CFLAGS) $(CFLAGS) -MT libLowLevel_a-lowlevel-sun.obj -MD -MP -MF $(DEPDIR)/libLowLevel_a-lowlevel-sun.Tpo -c -o libLowLevel_a-lowlevel-sun.obj `if test -f 'lowlevel-sun.c'; then $(CYGPATH_W) 'lowlevel-sun.c'; else $(CYGPATH_W) '$(srcdir)/lowlevel-sun.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libLowLevel_a-lowlevel-sun.Tpo $(DEPDIR)/libLowLevel_a-lowlevel-sun.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='lowlevel-sun.c' object='libLowLevel_a-lowlevel-sun.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libLowLevel_a_CPPFLAGS) $(CPPFLAGS) $(libLowLevel_a_CFLAGS) $(CFLAGS) -c -o libLowLevel_a-lowlevel-sun.obj `if test -f 'lowlevel-sun.c'; then $(CYGPATH_W) 'lowlevel-sun.c'; else $(CYGPATH_W) '$(srcdir)/lowlevel-sun.c'; fi` libLowLevel_a-lowlevel-options-sun.o: lowlevel-options-sun.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libLowLevel_a_CPPFLAGS) $(CPPFLAGS) $(libLowLevel_a_CFLAGS) $(CFLAGS) -MT libLowLevel_a-lowlevel-options-sun.o -MD -MP -MF $(DEPDIR)/libLowLevel_a-lowlevel-options-sun.Tpo -c -o libLowLevel_a-lowlevel-options-sun.o `test -f 'lowlevel-options-sun.c' || echo '$(srcdir)/'`lowlevel-options-sun.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libLowLevel_a-lowlevel-options-sun.Tpo $(DEPDIR)/libLowLevel_a-lowlevel-options-sun.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='lowlevel-options-sun.c' object='libLowLevel_a-lowlevel-options-sun.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libLowLevel_a_CPPFLAGS) $(CPPFLAGS) $(libLowLevel_a_CFLAGS) $(CFLAGS) -c -o libLowLevel_a-lowlevel-options-sun.o `test -f 'lowlevel-options-sun.c' || echo '$(srcdir)/'`lowlevel-options-sun.c libLowLevel_a-lowlevel-options-sun.obj: lowlevel-options-sun.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libLowLevel_a_CPPFLAGS) $(CPPFLAGS) $(libLowLevel_a_CFLAGS) $(CFLAGS) -MT libLowLevel_a-lowlevel-options-sun.obj -MD -MP -MF $(DEPDIR)/libLowLevel_a-lowlevel-options-sun.Tpo -c -o libLowLevel_a-lowlevel-options-sun.obj `if test -f 'lowlevel-options-sun.c'; then $(CYGPATH_W) 'lowlevel-options-sun.c'; else $(CYGPATH_W) '$(srcdir)/lowlevel-options-sun.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libLowLevel_a-lowlevel-options-sun.Tpo $(DEPDIR)/libLowLevel_a-lowlevel-options-sun.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='lowlevel-options-sun.c' object='libLowLevel_a-lowlevel-options-sun.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libLowLevel_a_CPPFLAGS) $(CPPFLAGS) $(libLowLevel_a_CFLAGS) $(CFLAGS) -c -o libLowLevel_a-lowlevel-options-sun.obj `if test -f 'lowlevel-options-sun.c'; then $(CYGPATH_W) 'lowlevel-options-sun.c'; else $(CYGPATH_W) '$(srcdir)/lowlevel-options-sun.c'; fi` .cpp.o: @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $< .cpp.obj: @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .cpp.lo: @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LTCXXCOMPILE) -c -o $@ $< libLowLevel_a-daemon.o: daemon.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libLowLevel_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libLowLevel_a-daemon.o -MD -MP -MF $(DEPDIR)/libLowLevel_a-daemon.Tpo -c -o libLowLevel_a-daemon.o `test -f 'daemon.cpp' || echo '$(srcdir)/'`daemon.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libLowLevel_a-daemon.Tpo $(DEPDIR)/libLowLevel_a-daemon.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='daemon.cpp' object='libLowLevel_a-daemon.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libLowLevel_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libLowLevel_a-daemon.o `test -f 'daemon.cpp' || echo '$(srcdir)/'`daemon.cpp libLowLevel_a-daemon.obj: daemon.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libLowLevel_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libLowLevel_a-daemon.obj -MD -MP -MF $(DEPDIR)/libLowLevel_a-daemon.Tpo -c -o libLowLevel_a-daemon.obj `if test -f 'daemon.cpp'; then $(CYGPATH_W) 'daemon.cpp'; else $(CYGPATH_W) '$(srcdir)/daemon.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libLowLevel_a-daemon.Tpo $(DEPDIR)/libLowLevel_a-daemon.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='daemon.cpp' object='libLowLevel_a-daemon.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libLowLevel_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libLowLevel_a-daemon.obj `if test -f 'daemon.cpp'; then $(CYGPATH_W) 'daemon.cpp'; else $(CYGPATH_W) '$(srcdir)/daemon.cpp'; fi` libLowLevel_a-dibbler-client.o: dibbler-client.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libLowLevel_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libLowLevel_a-dibbler-client.o -MD -MP -MF $(DEPDIR)/libLowLevel_a-dibbler-client.Tpo -c -o libLowLevel_a-dibbler-client.o `test -f 'dibbler-client.cpp' || echo '$(srcdir)/'`dibbler-client.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libLowLevel_a-dibbler-client.Tpo $(DEPDIR)/libLowLevel_a-dibbler-client.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='dibbler-client.cpp' object='libLowLevel_a-dibbler-client.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libLowLevel_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libLowLevel_a-dibbler-client.o `test -f 'dibbler-client.cpp' || echo '$(srcdir)/'`dibbler-client.cpp libLowLevel_a-dibbler-client.obj: dibbler-client.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libLowLevel_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libLowLevel_a-dibbler-client.obj -MD -MP -MF $(DEPDIR)/libLowLevel_a-dibbler-client.Tpo -c -o libLowLevel_a-dibbler-client.obj `if test -f 'dibbler-client.cpp'; then $(CYGPATH_W) 'dibbler-client.cpp'; else $(CYGPATH_W) '$(srcdir)/dibbler-client.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libLowLevel_a-dibbler-client.Tpo $(DEPDIR)/libLowLevel_a-dibbler-client.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='dibbler-client.cpp' object='libLowLevel_a-dibbler-client.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libLowLevel_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libLowLevel_a-dibbler-client.obj `if test -f 'dibbler-client.cpp'; then $(CYGPATH_W) 'dibbler-client.cpp'; else $(CYGPATH_W) '$(srcdir)/dibbler-client.cpp'; fi` libLowLevel_a-dibbler-server.o: dibbler-server.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libLowLevel_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libLowLevel_a-dibbler-server.o -MD -MP -MF $(DEPDIR)/libLowLevel_a-dibbler-server.Tpo -c -o libLowLevel_a-dibbler-server.o `test -f 'dibbler-server.cpp' || echo '$(srcdir)/'`dibbler-server.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libLowLevel_a-dibbler-server.Tpo $(DEPDIR)/libLowLevel_a-dibbler-server.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='dibbler-server.cpp' object='libLowLevel_a-dibbler-server.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libLowLevel_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libLowLevel_a-dibbler-server.o `test -f 'dibbler-server.cpp' || echo '$(srcdir)/'`dibbler-server.cpp libLowLevel_a-dibbler-server.obj: dibbler-server.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libLowLevel_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libLowLevel_a-dibbler-server.obj -MD -MP -MF $(DEPDIR)/libLowLevel_a-dibbler-server.Tpo -c -o libLowLevel_a-dibbler-server.obj `if test -f 'dibbler-server.cpp'; then $(CYGPATH_W) 'dibbler-server.cpp'; else $(CYGPATH_W) '$(srcdir)/dibbler-server.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libLowLevel_a-dibbler-server.Tpo $(DEPDIR)/libLowLevel_a-dibbler-server.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='dibbler-server.cpp' object='libLowLevel_a-dibbler-server.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libLowLevel_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libLowLevel_a-dibbler-server.obj `if test -f 'dibbler-server.cpp'; then $(CYGPATH_W) 'dibbler-server.cpp'; else $(CYGPATH_W) '$(srcdir)/dibbler-server.cpp'; fi` libLowLevel_a-dibbler-relay.o: dibbler-relay.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libLowLevel_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libLowLevel_a-dibbler-relay.o -MD -MP -MF $(DEPDIR)/libLowLevel_a-dibbler-relay.Tpo -c -o libLowLevel_a-dibbler-relay.o `test -f 'dibbler-relay.cpp' || echo '$(srcdir)/'`dibbler-relay.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libLowLevel_a-dibbler-relay.Tpo $(DEPDIR)/libLowLevel_a-dibbler-relay.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='dibbler-relay.cpp' object='libLowLevel_a-dibbler-relay.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libLowLevel_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libLowLevel_a-dibbler-relay.o `test -f 'dibbler-relay.cpp' || echo '$(srcdir)/'`dibbler-relay.cpp libLowLevel_a-dibbler-relay.obj: dibbler-relay.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libLowLevel_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libLowLevel_a-dibbler-relay.obj -MD -MP -MF $(DEPDIR)/libLowLevel_a-dibbler-relay.Tpo -c -o libLowLevel_a-dibbler-relay.obj `if test -f 'dibbler-relay.cpp'; then $(CYGPATH_W) 'dibbler-relay.cpp'; else $(CYGPATH_W) '$(srcdir)/dibbler-relay.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libLowLevel_a-dibbler-relay.Tpo $(DEPDIR)/libLowLevel_a-dibbler-relay.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='dibbler-relay.cpp' object='libLowLevel_a-dibbler-relay.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libLowLevel_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libLowLevel_a-dibbler-relay.obj `if test -f 'dibbler-relay.cpp'; then $(CYGPATH_W) 'dibbler-relay.cpp'; else $(CYGPATH_W) '$(srcdir)/dibbler-relay.cpp'; fi` mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LIBRARIES) installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool clean-noinstLIBRARIES \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \ clean-libtool clean-noinstLIBRARIES cscopelist-am ctags \ ctags-am distclean distclean-compile distclean-generic \ distclean-libtool distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-dvi install-dvi-am install-exec \ install-exec-am install-html install-html-am install-info \ install-info-am install-man install-pdf install-pdf-am \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ tags tags-am uninstall uninstall-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: dibbler-1.0.1/Makefile.am0000644000175000017500000002001212351541651012067 00000000000000AUTOMAKE_OPTIONS = foreign COMMON_SUBDIRS = @PORT_SUBDIR@ nettle if HAVE_GTEST COMMON_SUBDIRS += tests/utils endif COMMON_SUBDIRS += Misc poslib Messages Options AddrMgr CfgMgr IfaceMgr COMMON_SUBDIRS += doc SRV_SUBDIRS = SrvOptions SrvIfaceMgr SrvAddrMgr SrvMessages SrvTransMgr SrvCfgMgr REL_SUBDIRS = RelCfgMgr RelIfaceMgr RelMessages RelOptions RelTransMgr CLNT_SUBDIRS = ClntOptions ClntTransMgr ClntAddrMgr ClntCfgMgr ClntIfaceMgr ClntMessages REQ_SUBDIRS = Requestor SUBDIRS = $(COMMON_SUBDIRS) $(SRV_SUBDIRS) $(CLNT_SUBDIRS) $(REL_SUBDIRS) $(REQ_SUBDIRS) if HAVE_GTEST SUBDIRS += tests endif DIST_SUBDIRS = $(COMMON_SUBDIRS) $(SRV_SUBDIRS) $(CLNT_SUBDIRS) $(REL_SUBDIRS) $(REQ_SUBDIRS) DIST_SUBDIRS += Port-win32 bison++ @EXTRA_DIST_SUBDIRS@ tests sbin_PROGRAMS = dibbler-client dibbler-server dibbler-relay dibbler-requestor common-libs: for dir in $(COMMON_SUBDIRS) ; do \ $(MAKE) -C $$dir ; \ done client-libs: for dir in $(CLNT_SUBDIRS) ; do \ $(MAKE) -C $$dir ; \ done server-libs: for dir in $(SRV_SUBDIRS) ; do \ $(MAKE) -C $$dir ; \ done relay-libs: for dir in $(REL_SUBDIRS) ; do \ $(MAKE) -C $$dir ; \ done requestor-libs: for dir in $(REQ_SUBDIRS) ; do \ $(MAKE) -C $$dir ; \ done client: common-libs client-libs $(MAKE) dibbler-client dibbler_client_SOURCES = $(top_srcdir)/@PORT_SUBDIR@/dibbler-client.cpp dibbler_client_SOURCES += $(top_srcdir)/Misc/DHCPClient.cpp $(top_srcdir)/Misc/DHCPClient.h dibbler_client_CPPFLAGS = -I$(top_srcdir)/Misc -I$(top_srcdir)/ClntTransMgr dibbler_client_CPPFLAGS += -I$(top_srcdir)/ClntCfgMgr -I$(top_srcdir)/CfgMgr dibbler_client_CPPFLAGS += -I$(top_srcdir)/Options -I$(top_srcdir)/ClntOptions dibbler_client_CPPFLAGS += -I$(top_srcdir)/ClntIfaceMgr -I$(top_srcdir)/IfaceMgr dibbler_client_CPPFLAGS += -I$(top_srcdir)/AddrMgr -I$(top_srcdir)/ClntAddrMgr dibbler_client_CPPFLAGS += -I$(top_srcdir)/ClntMessages -I$(top_srcdir)/Messages dibbler_client_LDADD = -L$(top_builddir)/ClntTransMgr -lClntTransMgr dibbler_client_LDADD += -L$(top_builddir)/ClntMessages -lClntMessages dibbler_client_LDADD += -lClntTransMgr dibbler_client_LDADD += -L$(top_builddir)/ClntOptions -lClntOptions dibbler_client_LDADD += -L$(top_builddir)/ClntCfgMgr -lClntCfgMgr dibbler_client_LDADD += -L$(top_builddir)/ClntIfaceMgr -lClntIfaceMgr dibbler_client_LDADD += -lClntMessages -lClntCfgMgr dibbler_client_LDADD += -L$(top_builddir)/CfgMgr -lCfgMgr dibbler_client_LDADD += -L$(top_builddir)/ClntAddrMgr -lClntAddrMgr dibbler_client_LDADD += -L$(top_builddir)/IfaceMgr -lIfaceMgr dibbler_client_LDADD += -L$(top_builddir)/AddrMgr -lAddrMgr dibbler_client_LDADD += -L$(top_builddir)/poslib -lPoslib dibbler_client_LDADD += -L$(top_builddir)/nettle -lNettle dibbler_client_LDADD += -L$(top_builddir)/Options -lOptions dibbler_client_LDADD += -L$(top_builddir)/Messages -lMessages dibbler_client_LDADD += -lOptions -lMessages dibbler_client_LDADD += -L$(top_builddir)/@PORT_SUBDIR@ -lLowLevel dibbler_client_LDADD += -L$(top_builddir)/Misc -lMisc -lClntOptions -lOptions server: common-libs server-libs $(MAKE) dibbler-server dibbler_server_SOURCES = $(top_srcdir)/@PORT_SUBDIR@/dibbler-server.cpp dibbler_server_SOURCES += $(top_srcdir)/Misc/DHCPServer.cpp $(top_srcdir)/Misc/DHCPServer.h dibbler_server_CPPFLAGS = -I$(top_srcdir)/Misc -I$(top_srcdir)/SrvTransMgr dibbler_server_CPPFLAGS += -I$(top_srcdir)/SrvCfgMgr -I$(top_srcdir)/CfgMgr dibbler_server_CPPFLAGS += -I$(top_srcdir)/Options -I$(top_srcdir)/SrvOptions dibbler_server_CPPFLAGS += -I$(top_srcdir)/SrvIfaceMgr -I$(top_srcdir)/IfaceMgr dibbler_server_CPPFLAGS += -I$(top_srcdir)/AddrMgr -I$(top_srcdir)/SrvAddrMgr dibbler_server_CPPFLAGS += -I$(top_srcdir)/SrvMessages -I$(top_srcdir)/Messages dibbler_server_LDADD = -L$(top_builddir)/SrvOptions -lSrvOptions dibbler_server_LDADD += -L$(top_builddir)/SrvMessages -lSrvMessages dibbler_server_LDADD += -L$(top_builddir)/SrvIfaceMgr -lSrvIfaceMgr dibbler_server_LDADD += -L$(top_builddir)/SrvCfgMgr -lSrvCfgMgr dibbler_server_LDADD += -lSrvOptions -lSrvMessages -lSrvIfaceMgr -lSrvCfgMgr dibbler_server_LDADD += -L$(top_builddir)/SrvTransMgr -lSrvTransMgr dibbler_server_LDADD += -L$(top_builddir)/SrvAddrMgr -lSrvAddrMgr dibbler_server_LDADD += -L$(top_builddir)/IfaceMgr -lIfaceMgr dibbler_server_LDADD += -L$(top_builddir)/AddrMgr -lAddrMgr dibbler_server_LDADD += -L$(top_builddir)/poslib -lPoslib dibbler_server_LDADD += -L$(top_builddir)/Options -lOptions dibbler_server_LDADD += -L$(top_builddir)/Messages -lMessages dibbler_server_LDADD += -L$(top_builddir)/CfgMgr -lCfgMgr dibbler_server_LDADD += -L$(top_builddir)/@PORT_SUBDIR@ -lLowLevel dibbler_server_LDADD += -L$(top_builddir)/Misc -lMisc dibbler_server_LDADD += -lSrvCfgMgr -lSrvMessages -lCfgMgr -lSrvOptions -lOptions dibbler_server_LDADD += -lIfaceMgr -lPoslib -lMisc dibbler_server_LDADD += -L$(top_builddir)/nettle -lNettle relay: common-libs relay-libs $(MAKE) dibbler-relay dibbler_relay_SOURCES = $(top_srcdir)/@PORT_SUBDIR@/dibbler-relay.cpp dibbler_relay_SOURCES += $(top_srcdir)/Misc/DHCPRelay.cpp $(top_srcdir)/Misc/DHCPRelay.h dibbler_relay_CPPFLAGS = -I$(top_srcdir)/Misc -I$(top_srcdir)/RelTransMgr dibbler_relay_CPPFLAGS += -I$(top_srcdir)/RelCfgMgr -I$(top_srcdir)/CfgMgr dibbler_relay_CPPFLAGS += -I$(top_srcdir)/Options -I$(top_srcdir)/RelOptions dibbler_relay_CPPFLAGS += -I$(top_srcdir)/RelIfaceMgr -I$(top_srcdir)/IfaceMgr dibbler_relay_CPPFLAGS += -I$(top_srcdir)/AddrMgr -I$(top_srcdir)/RelAddrMgr dibbler_relay_CPPFLAGS += -I$(top_srcdir)/RelMessages -I$(top_srcdir)/Messages dibbler_relay_LDADD = -L$(top_builddir)/RelTransMgr -lRelTransMgr dibbler_relay_LDADD += -L$(top_builddir)/RelIfaceMgr -lRelIfaceMgr dibbler_relay_LDADD += -L$(top_builddir)/RelCfgMgr -lRelCfgMgr dibbler_relay_LDADD += -lRelIfaceMgr dibbler_relay_LDADD += -L$(top_builddir)/RelMessages -lRelMessages dibbler_relay_LDADD += -lRelCfgMgr dibbler_relay_LDADD += -L$(top_builddir)/CfgMgr -lCfgMgr dibbler_relay_LDADD += -L$(top_builddir)/RelOptions -lRelOptions dibbler_relay_LDADD += -L$(top_builddir)/IfaceMgr -lIfaceMgr dibbler_relay_LDADD += -L$(top_builddir)/poslib -lPoslib dibbler_relay_LDADD += -L$(top_builddir)/Messages -lMessages dibbler_relay_LDADD += -L$(top_builddir)/Options -lOptions dibbler_relay_LDADD += -L$(top_builddir)/@PORT_SUBDIR@ -lLowLevel dibbler_relay_LDADD += -L$(top_builddir)/Misc -lMisc requestor: common-libs requestor-libs $(MAKE) dibbler-requestor dibbler_requestor_SOURCES = $(top_srcdir)/Requestor/Requestor.cpp $(top_srcdir)/Requestor/Requestor.h dibbler_requestor_CPPFLAGS = -I$(top_srcdir)/Misc -I$(top_srcdir)/Options dibbler_requestor_CPPFLAGS += -I$(top_srcdir)/Messages -I$(top_srcdir)/Requestor dibbler_requestor_CPPFLAGS += -I$(top_srcdir)/IfaceMgr dibbler_requestor_LDADD = -L$(top_builddir)/Requestor -lRequestor dibbler_requestor_LDADD += -L$(top_builddir)/Messages -lMessages dibbler_requestor_LDADD += -L$(top_builddir)/IfaceMgr -lIfaceMgr dibbler_requestor_LDADD += -L$(top_builddir)/Misc -lMisc dibbler_requestor_LDADD += -L$(top_builddir)/Options -lOptions dibbler_requestor_LDADD += -L$(top_builddir)/@PORT_SUBDIR@ -lLowLevel nobase_dist_doc_DATA = CHANGELOG LICENSE RELNOTES nobase_dist_doc_DATA += scripts/notify-scripts/client-notify-linux.sh nobase_dist_doc_DATA += scripts/notify-scripts/client-notify-macos.sh nobase_dist_doc_DATA += scripts/notify-scripts/client-notify-bsd.sh nobase_dist_doc_DATA += scripts/notify-scripts/server-notify.sh nobase_dist_doc_DATA += scripts/bison-sanitizer.py scripts/remote-autoconf dist_noinst_DATA = m4/libtool.m4 m4/lt~obsolete.m4 m4/ltoptions.m4 m4/ltsugar.m4 m4/ltversion.m4 dist_noinst_DATA += scripts dist_noinst_DATA += tests # these are conditional directories. Therefore they are not added to # dist directory. bison: bison/bison++ bison/bison++: @echo "[CONFIG ] /bison++/" cd $(top_srcdir)/bison++; ./configure --host=$(CHOST) --build=$(CBUILD) >configure.log @echo "[MAKE ] /bison++/bison++" $(MAKE) -C $(top_srcdir)/bison++ parser: $(MAKE) -C SrvCfgMgr parser $(MAKE) -C ClntCfgMgr parser $(MAKE) -C RelCfgMgr parser .PHONY: common-libs dibbler-1.0.1/RelIfaceMgr/0000775000175000017500000000000012561700421012235 500000000000000dibbler-1.0.1/RelIfaceMgr/Makefile.am0000664000175000017500000000063112233256142014213 00000000000000noinst_LIBRARIES = libRelIfaceMgr.a libRelIfaceMgr_a_CPPFLAGS = -I$(top_srcdir)/Misc -I$(top_srcdir)/IfaceMgr libRelIfaceMgr_a_CPPFLAGS += -I$(top_srcdir)/RelCfgMgr -I$(top_srcdir)/CfgMgr libRelIfaceMgr_a_CPPFLAGS += -I$(top_srcdir)/Options -I$(top_srcdir)/RelOptions libRelIfaceMgr_a_CPPFLAGS += -I$(top_srcdir)/RelMessages -I$(top_srcdir)/Messages libRelIfaceMgr_a_SOURCES = RelIfaceMgr.cpp RelIfaceMgr.h dibbler-1.0.1/RelIfaceMgr/RelIfaceMgr.cpp0000644000175000017500000002361312556515116015015 00000000000000/* * Dibbler - a portable DHCPv6 * * authors: Tomasz Mrugalski * * released under GNU GPL v2 only licence * */ #include #include #include "Logger.h" #include "IPv6Addr.h" #include "Iface.h" #include "SocketIPv6.h" #include "RelIfaceMgr.h" #include "RelCfgMgr.h" #include "RelMsgGeneric.h" #include "RelMsgRelayForw.h" #include "RelMsgRelayRepl.h" #include "RelOptInterfaceID.h" #include "Portable.h" TRelIfaceMgr * TRelIfaceMgr::Instance = 0; using namespace std; /* * constructor. Do nothing particular, just invoke IfaceMgr constructor */ TRelIfaceMgr::TRelIfaceMgr(const std::string& xmlFile) : TIfaceMgr(xmlFile, true) { } TRelIfaceMgr::~TRelIfaceMgr() { Log(Debug) << "RelIfaceMgr cleanup." << LogEnd; } void TRelIfaceMgr::dump() { std::ofstream xmlDump; xmlDump.open( this->XmlFile.c_str() ); xmlDump << *this; xmlDump.close(); } /** * sends data to client. Uses multicast address as source * @param ifindex interface ID * @param data buffer containing message ready to send * @param dataLen size of message * @param addr destination address * @param port UDP port to send the data to * returns true if message was send successfully */ bool TRelIfaceMgr::send(int ifindex, char *data, int dataLen, SPtr addr, int port) { // find this interface SPtr iface = this->getIfaceByID(ifindex); if (!iface) { Log(Error) << "Send failed: No such interface id=" << ifindex << LogEnd; return false; } // find this socket SPtr ptrSocket; iface->firstSocket(); ptrSocket = iface->getSocket(); if (!ptrSocket) { Log(Error) << "Send failed: interface " << iface->getName() << "/" << iface->getID() << " has no open sockets." << LogEnd; return false; } // send it! if (ptrSocket->send(data, dataLen, addr, port) < 0) return false; return true; } /** * reads messages from all interfaces * it's wrapper around IfaceMgr::select(...) method * @param timeout - how long can we wait for packets? * returns SPtr to message object */ SPtr TRelIfaceMgr::select(unsigned long timeout) { // static buffer speeds things up static char data[2048]; int dataLen=2048; SPtr peer (new TIPv6Addr()); SPtr myaddr(new TIPv6Addr()); int sockid; // read data sockid = TIfaceMgr::select(timeout, data, dataLen, peer, myaddr); if (sockid < 0) { Log(Warning) << "Socket read error: " << sockid << LogEnd; return SPtr(); // NULL } if (dataLen<4) { Log(Warning) << "Received message is truncated (" << dataLen << " bytes)." << LogEnd; return SPtr(); // NULL } // check message type int msgtype = data[0]; if (msgtype > LEASEQUERY_REPLY_MSG) { Log(Warning) << "Invalid message type " << msgtype << " received." << LogEnd; return SPtr(); // NULL } SPtr ptr; SPtr iface; SPtr sock; // get interface iface = this->getIfaceBySocket(sockid); sock = iface->getSocketByFD(sockid); Log(Debug) << "Received " << dataLen << " bytes on the " << iface->getName() << "/" << iface->getID() << " interface (socket=" << sockid << ", addr=" << peer->getPlain() << ", port=" << sock->getPort() << ")." << LogEnd; if (sock->getPort()!=DHCPSERVER_PORT) { Log(Error) << "Message was received on invalid (" << sock->getPort() << ") port." << LogEnd; return SPtr(); // NULL } return decodeMsg(iface, peer, data, dataLen); } SPtr TRelIfaceMgr::decodeRelayForw(SPtr iface, SPtr peer, char * data, int dataLen) { int ifindex = iface->getID(); SPtr msg = new TRelMsgRelayForw(ifindex, peer, data, dataLen); return msg; } SPtr TRelIfaceMgr::decodeGeneric(SPtr iface, SPtr peer, char * buf, int bufsize) { int ifindex = iface->getID(); return new TRelMsgGeneric(ifindex, peer, buf, bufsize); } SPtr TRelIfaceMgr::decodeRelayRepl(SPtr iface, SPtr peer, char * buf, int bufsize) { // SPtr linkAddrTbl[HOP_COUNT_LIMIT]; // SPtr peerAddrTbl[HOP_COUNT_LIMIT]; //SPtr interfaceIDTbl[HOP_COUNT_LIMIT]; //int hopTbl[HOP_COUNT_LIMIT]; SPtr ptrIfaceID; char * relayBuf=0; int relayLen = 0; int relays=0; /* decode RELAY_FORW message */ if (bufsize < 34) { Log(Warning) << "Truncated RELAY_REPL message received." << LogEnd; return SPtr(); // NULL } // char type = buf[0]; // ignore it // int hopCount = buf[1]; // this one is not currently needed either SPtr linkAddr = new TIPv6Addr(buf+2,false); SPtr peerAddr = new TIPv6Addr(buf+18, false); buf+=34; bufsize-=34; // options: only INTERFACEID and RELAY_MSG are allowed while (bufsize>=4) { unsigned short code = readUint16(buf); unsigned short len = readUint16(buf + sizeof(uint16_t)); if (len>bufsize) { Log(Error) << "Message RELAY-REPL truncated. There are " << (bufsize-len) << " bytes left to parse. Message dropped." << LogEnd; return SPtr(); // NULL } buf += 4; bufsize -= 4; switch (code) { case OPTION_INTERFACE_ID: if (bufsize<4) { Log(Warning) << "Truncated INTERFACE_ID option in RELAY_REPL message. Message dropped." << LogEnd; return SPtr(); // NULL } if (len!=4) { Log(Warning) << "Invalid INTERFACE_ID option, expected length " << 4 << ", actual length " << len << "." << LogEnd; return SPtr(); // NULL } ptrIfaceID = new TRelOptInterfaceID(buf, bufsize, 0); buf += ptrIfaceID->getSize()-4; bufsize -= ptrIfaceID->getSize()-4; break; case OPTION_RELAY_MSG: relayBuf = buf; relayLen = len; buf += relayLen; bufsize -= relayLen; break; default: SPtr echo = RelCfgMgr().getEcho(); if (echo && echo->isOption(code)) { Log(Notice) << "Received echoed back option " << code << "." << LogEnd; } else { Log(Warning) << "Invalid option " << code << " in RELAY_REPL message. Option ignored." << LogEnd; } buf += len; bufsize -= len; continue; } } Log(Info) << "RELAY_REPL was decapsulated: link=" << linkAddr->getPlain() << ", peer=" << peerAddr->getPlain(); if (ptrIfaceID) Log(Cont) << ", interfaceID=" << ptrIfaceID->getValue(); Log(Cont) << LogEnd; if (!ptrIfaceID) { if (!RelCfgMgr().guessMode()) { /* guessMode disabled */ Log(Warning) << "InterfaceID option is missing, guessMode disabled, unable to forward. Packet dropped." << LogEnd; return SPtr(); // NULL } /* guess mode enabled, let's find any interface */ SPtr tmp; RelCfgMgr().firstIface(); while (tmp = RelCfgMgr().getIface()) { if (tmp->getID() == iface->getID()) continue; // skip the interface we've received the data on break; } if (!tmp) { Log(Error) << "Guess-mode failed. Unable to find any interface the message can be relayed on. Please send interface-id option in server replies." << LogEnd; return SPtr(); // NULL } Log(Notice) << "Guess-mode successful. Using " << tmp->getFullName() << " as destination interface." << LogEnd; ptrIfaceID = new TRelOptInterfaceID(tmp->getInterfaceID(), 0); } //linkAddrTbl[relays] = linkAddr; //peerAddrTbl[relays] = peerAddr; //interfaceIDTbl[relays] = ptrIfaceID; //hopTbl[relays] = hopCount; relays++; SPtr msg; switch (relayBuf[0]) { case RELAY_REPL_MSG: //msg = this->decodeRelayRepl(iface, peer, buf, bufsize); msg = new TRelMsgRelayRepl(iface->getID(), peer, relayBuf, relayLen); break; case RELAY_FORW_MSG: Log(Error) << "RELAY_REPL contains RELAY_FORW message." << LogEnd; return SPtr(); // NULL default: msg = this->decodeGeneric(iface, peer, relayBuf, relayLen); }; // inform that this message should be sent to the peerAddr address on the ptrIface interface. msg->setDestination(ptrIfaceID->getValue(), peerAddr); return (Ptr*)msg; } SPtr TRelIfaceMgr::decodeMsg(SPtr iface, SPtr peer, char * data, int dataLen) { if (dataLen <= 0) return SPtr(); // NULL // create specific message object switch (data[0]) { default: { Log(Warning) << "Unknown message type " << (int)(data[0]) << ", relaying anyway." << LogEnd; // no break here } case SOLICIT_MSG: case REQUEST_MSG: case CONFIRM_MSG: case RENEW_MSG: case REBIND_MSG: case RELEASE_MSG: case DECLINE_MSG: case INFORMATION_REQUEST_MSG: case ADVERTISE_MSG: case REPLY_MSG: return decodeGeneric(iface, peer, data, dataLen); case RELAY_FORW_MSG: return decodeRelayForw(iface, peer, data, dataLen); case RELAY_REPL_MSG: return decodeRelayRepl(iface, peer, data, dataLen); case RECONFIGURE_MSG: return SPtr(); // NULL } } void TRelIfaceMgr::instanceCreate(const std::string& xmlFile) { if (Instance) Log(Crit) << "RelIfaceMgr instance already created. Application error!" << LogEnd; Instance = new TRelIfaceMgr(xmlFile); } TRelIfaceMgr& TRelIfaceMgr::instance() { if (!Instance) { Log(Crit) << "RelIfaceMgr istance not created yet. Application error. Emergency shutdown." << LogEnd; exit(EXIT_FAILURE); } return *Instance; } ostream & operator <<(ostream & strum, TRelIfaceMgr &x) { strum << "" << std::endl; SPtr ptr; x.IfaceLst.first(); while ( ptr= (Ptr*) x.IfaceLst.get() ) { strum << *ptr; } strum << "" << std::endl; return strum; } dibbler-1.0.1/RelIfaceMgr/RelIfaceMgr.h0000664000175000017500000000307612413230313014446 00000000000000/* * Dibbler - a portable DHCPv6 * * authors: Tomasz Mrugalski * Marek Senderski * * released under GNU GPL v2 only licence * */ #ifndef RELIFACEMGR_H #define RELIFACEMGR_H #include "RelMsg.h" #include "IfaceMgr.h" #include "Iface.h" #define RelIfaceMgr() (TRelIfaceMgr::instance()) class TRelIfaceMgr: public TIfaceMgr { public: static void instanceCreate(const std::string& xmlFile); static TRelIfaceMgr& instance(); ~TRelIfaceMgr(); friend std::ostream & operator <<(std::ostream & strum, TRelIfaceMgr &x); SPtr decodeMsg(SPtr iface, SPtr peer, char * buf, int bufsize); SPtr decodeRelayRepl(SPtr iface, SPtr peer, char * buf, int bufsize); SPtr decodeRelayForw(SPtr iface, SPtr peer, char * buf, int bufsize); SPtr decodeGeneric(SPtr iface, SPtr peer, char * buf, int bufsize); void dump(); // ---sends messages--- bool send(int iface, char *data, int dataLen, SPtr addr, int port); // ---receives messages--- SPtr select(unsigned long timeout); protected: TRelIfaceMgr(const std::string& xmlFile); static TRelIfaceMgr * Instance; }; #endif dibbler-1.0.1/RelIfaceMgr/Makefile.in0000664000175000017500000005100512561652535014237 00000000000000# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = RelIfaceMgr DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/depcomp ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/libtool.m4 \ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/include/dibbler-config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = LIBRARIES = $(noinst_LIBRARIES) ARFLAGS = cru AM_V_AR = $(am__v_AR_@AM_V@) am__v_AR_ = $(am__v_AR_@AM_DEFAULT_V@) am__v_AR_0 = @echo " AR " $@; am__v_AR_1 = libRelIfaceMgr_a_AR = $(AR) $(ARFLAGS) libRelIfaceMgr_a_LIBADD = am_libRelIfaceMgr_a_OBJECTS = libRelIfaceMgr_a-RelIfaceMgr.$(OBJEXT) libRelIfaceMgr_a_OBJECTS = $(am_libRelIfaceMgr_a_OBJECTS) AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)/include depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) LTCXXCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CXXFLAGS) $(CXXFLAGS) AM_V_CXX = $(am__v_CXX_@AM_V@) am__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@) am__v_CXX_0 = @echo " CXX " $@; am__v_CXX_1 = CXXLD = $(CXX) CXXLINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \ $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CXXLD = $(am__v_CXXLD_@AM_V@) am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@) am__v_CXXLD_0 = @echo " CXXLD " $@; am__v_CXXLD_1 = COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(libRelIfaceMgr_a_SOURCES) DIST_SOURCES = $(libRelIfaceMgr_a_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALLOCA = @ALLOCA@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ ARCH = @ARCH@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ EXTRA_DIST_SUBDIRS = @EXTRA_DIST_SUBDIRS@ FGREP = @FGREP@ GREP = @GREP@ GTEST_INCLUDES = @GTEST_INCLUDES@ GTEST_LDADD = @GTEST_LDADD@ GTEST_LDFLAGS = @GTEST_LDFLAGS@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LINKPRINT = @LINKPRINT@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PORT_CFLAGS = @PORT_CFLAGS@ PORT_LDFLAGS = @PORT_LDFLAGS@ PORT_SUBDIR = @PORT_SUBDIR@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ subdirs = @subdirs@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ noinst_LIBRARIES = libRelIfaceMgr.a libRelIfaceMgr_a_CPPFLAGS = -I$(top_srcdir)/Misc \ -I$(top_srcdir)/IfaceMgr -I$(top_srcdir)/RelCfgMgr \ -I$(top_srcdir)/CfgMgr -I$(top_srcdir)/Options \ -I$(top_srcdir)/RelOptions -I$(top_srcdir)/RelMessages \ -I$(top_srcdir)/Messages libRelIfaceMgr_a_SOURCES = RelIfaceMgr.cpp RelIfaceMgr.h all: all-am .SUFFIXES: .SUFFIXES: .cpp .lo .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign RelIfaceMgr/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign RelIfaceMgr/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstLIBRARIES: -test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES) libRelIfaceMgr.a: $(libRelIfaceMgr_a_OBJECTS) $(libRelIfaceMgr_a_DEPENDENCIES) $(EXTRA_libRelIfaceMgr_a_DEPENDENCIES) $(AM_V_at)-rm -f libRelIfaceMgr.a $(AM_V_AR)$(libRelIfaceMgr_a_AR) libRelIfaceMgr.a $(libRelIfaceMgr_a_OBJECTS) $(libRelIfaceMgr_a_LIBADD) $(AM_V_at)$(RANLIB) libRelIfaceMgr.a mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libRelIfaceMgr_a-RelIfaceMgr.Po@am__quote@ .cpp.o: @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $< .cpp.obj: @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .cpp.lo: @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LTCXXCOMPILE) -c -o $@ $< libRelIfaceMgr_a-RelIfaceMgr.o: RelIfaceMgr.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libRelIfaceMgr_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libRelIfaceMgr_a-RelIfaceMgr.o -MD -MP -MF $(DEPDIR)/libRelIfaceMgr_a-RelIfaceMgr.Tpo -c -o libRelIfaceMgr_a-RelIfaceMgr.o `test -f 'RelIfaceMgr.cpp' || echo '$(srcdir)/'`RelIfaceMgr.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libRelIfaceMgr_a-RelIfaceMgr.Tpo $(DEPDIR)/libRelIfaceMgr_a-RelIfaceMgr.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='RelIfaceMgr.cpp' object='libRelIfaceMgr_a-RelIfaceMgr.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libRelIfaceMgr_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libRelIfaceMgr_a-RelIfaceMgr.o `test -f 'RelIfaceMgr.cpp' || echo '$(srcdir)/'`RelIfaceMgr.cpp libRelIfaceMgr_a-RelIfaceMgr.obj: RelIfaceMgr.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libRelIfaceMgr_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libRelIfaceMgr_a-RelIfaceMgr.obj -MD -MP -MF $(DEPDIR)/libRelIfaceMgr_a-RelIfaceMgr.Tpo -c -o libRelIfaceMgr_a-RelIfaceMgr.obj `if test -f 'RelIfaceMgr.cpp'; then $(CYGPATH_W) 'RelIfaceMgr.cpp'; else $(CYGPATH_W) '$(srcdir)/RelIfaceMgr.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libRelIfaceMgr_a-RelIfaceMgr.Tpo $(DEPDIR)/libRelIfaceMgr_a-RelIfaceMgr.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='RelIfaceMgr.cpp' object='libRelIfaceMgr_a-RelIfaceMgr.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libRelIfaceMgr_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libRelIfaceMgr_a-RelIfaceMgr.obj `if test -f 'RelIfaceMgr.cpp'; then $(CYGPATH_W) 'RelIfaceMgr.cpp'; else $(CYGPATH_W) '$(srcdir)/RelIfaceMgr.cpp'; fi` mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LIBRARIES) installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool clean-noinstLIBRARIES \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \ clean-libtool clean-noinstLIBRARIES cscopelist-am ctags \ ctags-am distclean distclean-compile distclean-generic \ distclean-libtool distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-dvi install-dvi-am install-exec \ install-exec-am install-html install-html-am install-info \ install-info-am install-man install-pdf install-pdf-am \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ tags tags-am uninstall uninstall-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: dibbler-1.0.1/Port-bsd/0000775000175000017500000000000012561700422011610 500000000000000dibbler-1.0.1/Port-bsd/dibbler-relay.cpp0000664000175000017500000000566512556247252015000 00000000000000/* * Dibbler - a portable DHCPv6 * * authors: Tomasz Mrugalski * * released under GNU GPL v2 only licence * */ #include #include #include "DHCPRelay.h" #include "Portable.h" #include "Logger.h" #include "daemon.h" using namespace std; TDHCPRelay * ptr; /// the default working directory std::string WORKDIR(DEFAULT_WORKDIR); void signal_handler(int n) { Log(Crit) << "Signal received. Shutting down." << LogEnd; ptr->stop(); } int status() { int pid = getServerPID(); if (pid==-1) { cout << "Dibbler server: NOT RUNNING." << endl; } else { cout << "Dibbler server: RUNNING, pid=" << pid << endl; } pid = getClientPID(); if (pid==-1) { cout << "Dibbler client: NOT RUNNING." << endl; } else { cout << "Dibbler client: RUNNING, pid=" << pid << endl; } pid = getRelayPID(); if (pid==-1) { cout << "Dibbler relay : NOT RUNNING." << endl; } else { cout << "Dibbler relay : RUNNING, pid=" << pid << endl; } return pid; } int run() { if (!init(RELPID_FILE, WORKDIR.c_str())) { return -1; } TDHCPRelay relay(RELCONF_FILE); ptr = &relay; if (ptr->isDone()) { return -1; } // connect signals signal(SIGTERM, signal_handler); signal(SIGINT, signal_handler); ptr->run(); die(RELPID_FILE); return 0; } int help() { cout << "Usage:" << endl; cout << " dibbler-relay ACTION" << endl << " ACTION = status|start|stop|install|uninstall|run" << endl << " status - show status and exit" << endl << " start - start installed service" << endl << " stop - stop installed service" << endl << " install - Not available in Linux/Unix systems." << endl << " uninstall - Not available in Linux/Unix systems." << endl << " run - run in the console" << endl << " help - displays usage info." << endl; return 0; } int main(int argc, char * argv[]) { char command[256]; int result=-1; logStart("(RELAY, BSD port)", "Relay", RELLOG_FILE); // parse command line parameters if (argc>1) { int len = strlen(argv[1])+1; if (len>255) len = 255; strncpy(command,argv[1],len); } else { memset(command,0,256); } if (!strncasecmp(command,"start",5) ) { result = start(RELPID_FILE, WORKDIR.c_str()); } else if (!strncasecmp(command,"run",3) ) { result = run(); } else if (!strncasecmp(command,"stop",4)) { result = stop(RELPID_FILE); } else if (!strncasecmp(command,"status",6)) { result = status(); } else if (!strncasecmp(command,"help",4)) { result = help(); } else if (!strncasecmp(command,"install",7)) { cout << "Function not available in Linux/Unix systems." << endl; result = 0; } else if (!strncasecmp(command,"uninstall",9)) { cout << "Function not available in Linux/Unix systems." << endl; result = 0; } else { help(); } logEnd(); return result; } dibbler-1.0.1/Port-bsd/dibbler-server.cpp0000664000175000017500000000615712556247252015167 00000000000000/* * Dibbler - a portable DHCPv6 * * authors: Tomasz Mrugalski * Marek Senderski * * released under GNU GPL v2 only licence * * $Id: dibbler-server.cpp,v 1.2 2008-08-29 00:07:31 thomson Exp $ * */ #include #include #include "DHCPServer.h" #include "Portable.h" #include "Logger.h" #include "daemon.h" using namespace std; TDHCPServer * ptr; /// the default working directory std::string WORKDIR(DEFAULT_WORKDIR); void signal_handler(int n) { Log(Crit) << "Signal received. Shutting down." << LogEnd; ptr->stop(); } int status() { int pid = getServerPID(); if (pid==-1) { cout << "Dibbler server: NOT RUNNING." << endl; } else { cout << "Dibbler server: RUNNING, pid=" << pid << endl; } int result = pid; pid = getClientPID(); if (pid==-1) { cout << "Dibbler client: NOT RUNNING." << endl; } else { cout << "Dibbler client: RUNNING, pid=" << pid << endl; } pid = getRelayPID(); if (pid==-1) { cout << "Dibbler relay : NOT RUNNING." << endl; } else { cout << "Dibbler relay : RUNNING, pid=" << pid << endl; } return result; } int run() { if (!init(SRVPID_FILE, WORKDIR.c_str())) { die(SRVPID_FILE); return -1; } TDHCPServer srv(SRVCONF_FILE); ptr = &srv; if (ptr->isDone()) { die(SRVPID_FILE); return -1; } // connect signals signal(SIGTERM, signal_handler); signal(SIGINT, signal_handler); ptr->run(); die(SRVPID_FILE); return 0; } int help() { cout << "Usage:" << endl; cout << " dibbler-server ACTION" << endl << " ACTION = status|start|stop|run" << endl << " status - show status and exit" << endl << " start - start installed service" << endl << " stop - stop installed service" << endl << " install - Not available in Linux/Unix systems." << endl << " uninstall - Not available in Linux/Unix systems." << endl << " run - run in the console" << endl << " help - displays usage info." << endl; return 0; } int main(int argc, char * argv[]) { char command[256]; int result=-1; logStart("(SERVER, BSD port)", "Server", SRVLOG_FILE); // parse command line parameters if (argc>1) { int len = strlen(argv[1])+1; if (len>255) len = 255; strncpy(command,argv[1],len); } else { memset(command,0,256); } if (!strncasecmp(command,"start",5) ) { result = start(SRVPID_FILE, WORKDIR.c_str()); } else if (!strncasecmp(command,"run",3) ) { result = run(); } else if (!strncasecmp(command,"stop",4)) { result = stop(SRVPID_FILE); } else if (!strncasecmp(command,"status",6)) { result = status(); } else if (!strncasecmp(command,"help",4)) { result = help(); } else if (!strncasecmp(command,"install",7)) { cout << "Function not available in Linux/Unix systems." << endl; result = 0; } else if (!strncasecmp(command,"uninstall",9)) { cout << "Function not available in Linux/Unix systems." << endl; result = 0; } else { help(); } logEnd(); return result ? EXIT_FAILURE : EXIT_SUCCESS; } dibbler-1.0.1/Port-bsd/Makefile.am0000644000175000017500000000040412277722750013574 00000000000000noinst_LIBRARIES = libLowLevel.a libLowLevel_a_CFLAGS = -std=c99 libLowLevel_a_CPPFLAGS = -I$(top_srcdir)/Misc libLowLevel_a_SOURCES = daemon.cpp daemon.h lowlevel-bsd.c lowlevel-options-bsd.c malloc.h dibbler-client.cpp dibbler-server.cpp dibbler-relay.cpp dibbler-1.0.1/Port-bsd/lowlevel-bsd.c0000664000175000017500000004330512406100152014270 00000000000000/* * Dibbler - a portable DHCPv6 * * author: Paul Schauer * changes: Tomasz Mrugalski * * released under GNU GPL v2 licence * * Based on Port-linux/lowlevel-linux.c * */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "Portable.h" #include "dibbler-config.h" #ifdef OPENBSD #include "sys/uio.h" #endif // #define LOWLEVEL_DEBUG 0 char Message[1024] = {0}; int lowlevelInit() { return LOWLEVEL_NO_ERROR; } int lowlevelExit() { return LOWLEVEL_NO_ERROR; } void if_list_release(struct iface * list) { struct iface * tmp; while (list) { tmp = list->next; if (list->linkaddrcount) free(list->linkaddr); if (list->globaladdrcount) free(list->globaladdr); free(list); list = tmp; } } void if_print(struct iface * iface_ptr) { int tmp, tmpInt = 0; printf("Interface %s, index=%i type=%x flags=%x\n", iface_ptr->name, iface_ptr->id, iface_ptr->hardwareType, iface_ptr->flags); printf("\tLink layer Length: %x Addr:", iface_ptr->maclen); for (tmp = 0; tmp < iface_ptr->maclen; tmp++) { printf("%02x:", (unsigned char) iface_ptr->mac[tmp]); } printf("\n"); printf("\tLocal IPv6 address count: %i, address ", iface_ptr->linkaddrcount); for (tmp = 0; tmp < iface_ptr->linkaddrcount; tmp++) { printf("\t%i=", tmp); for (tmpInt = 0; tmpInt < 16; tmpInt += 2) { printf("%02x%02x:", (unsigned char) iface_ptr->linkaddr[tmpInt + tmp * 16], (unsigned char) iface_ptr->linkaddr[tmpInt + 1 + tmp * 16]); } printf("\n"); } if (iface_ptr->linkaddrcount==0) printf("\n"); printf("\t%s Global IPv6 address count: %i, address ", iface_ptr->name, iface_ptr->globaladdrcount); tmpInt = 0; for (tmp = 0; tmp < iface_ptr->globaladdrcount; tmp++) { printf("\t%i=", tmp); for (tmpInt = 0; tmpInt < 16; tmpInt += 2) { printf("%02x%02x:", (unsigned char) iface_ptr->globaladdr[tmpInt+ tmp * 16], (unsigned char) iface_ptr->globaladdr[tmpInt + 1 + tmp * 16]); } printf("\n"); } if (iface_ptr->globaladdrcount==0) printf("\n"); } struct iface * if_list_add(struct iface * head, struct iface * element) { struct iface *tmp; element->next = NULL; if (!head) return element; tmp = head; while (tmp->next != NULL) { tmp = tmp->next; } tmp->next = element; return head; } /* * returns interface list with detailed informations */ struct iface * if_list_get() { /* * Translating between Mac OS X internal representation of link and IP address * and Dibbler internal format. */ struct ifaddrs *addrs_lst = NULL; // list returned by system struct ifaddrs *addr_ptr = NULL; // single address struct iface *iface_lst = NULL; // interface list struct iface *iface_ptr = NULL; // pointer to single interface if (getifaddrs(&addrs_lst) != 0) { perror("Error in getifaddrs: "); return iface_lst; } /* First pass through entire addrs_lst: collect unique interface names and flags */ addr_ptr = addrs_lst; while (addr_ptr != NULL) { #ifdef LOWLEVEL_DEBUG if (addr_ptr->ifa_addr->sa_family == AF_INET6) { char * ptr = (char*)(&((struct sockaddr_in6 *) addr_ptr->ifa_addr)->sin6_addr); printf("Link-local addr: %02x%02x:%02x%02x:%02x%02x:%02x%02x" ":%02x%02x:%02x%02x:%02x%02x:%02x%02x\n", ptr[0], ptr[1], ptr[2], ptr[3], ptr[4], ptr[5], ptr[6], ptr[7], ptr[8], ptr[9], ptr[10], ptr[11], ptr[12], ptr[13], ptr[14], ptr[15]); } #endif // check if this interface name is already on target list iface_ptr = iface_lst; while (iface_ptr!=NULL) { if (!strcmp(addr_ptr->ifa_name, iface_ptr->name)) break; iface_ptr = iface_ptr->next; } if (!iface_ptr) { // interface with that name not found, let's add one! iface_ptr = malloc(sizeof(struct iface)); memset(iface_ptr, 0, sizeof(struct iface)); strlcpy(iface_ptr->name, addr_ptr->ifa_name, MAX_IFNAME_LENGTH); iface_ptr->id = if_nametoindex(iface_ptr->name); iface_ptr->flags = addr_ptr->ifa_flags; #ifdef LOWLEVEL_DEBUG printf("Detected interface %s, ifindex=%d, flags=%d\n", iface_ptr->name, iface_ptr->id, iface_ptr->flags); #endif // add this new structure to the end of the interfaces list iface_lst = if_list_add(iface_lst, iface_ptr); } addr_ptr = addr_ptr->ifa_next; } /* * Second pass through addrs_lst: collect link and IP layer info for each interface * by name */ // for each address... for (addr_ptr = addrs_lst; addr_ptr != NULL; addr_ptr = addr_ptr->ifa_next) { for (iface_ptr = iface_lst; iface_ptr != NULL; iface_ptr = iface_ptr->next) { // ... find its corresponding interface if (strncmp(iface_ptr->name, addr_ptr->ifa_name, strlen(addr_ptr->ifa_name))) continue; switch (addr_ptr->ifa_addr->sa_family) { case AF_INET6: { char * ptr = (char*)(&((struct sockaddr_in6 *) addr_ptr->ifa_addr)->sin6_addr); /// @todo: Ugly workaround. Please remove one BSD guys fix their kernel. // This is ugly. OpenBSD returns interface index on the 4th byte. Link-local // addresses are supposed to be in format fe80:[6 zeros here]:EUI-64 // This problem also appears on pfSense memset(ptr+2, 0, 6); #ifdef LOWLEVEL_DEBUG printf("Link-local addr: %02x%02x:%02x%02x:%02x%02x:%02x%02x:" "%02x%02x:%02x%02x:%02x%02x:%02x%02x\n", ptr[0], ptr[1], ptr[2], ptr[3], ptr[4], ptr[5], ptr[6], ptr[7], ptr[8], ptr[9], ptr[10], ptr[11], ptr[12], ptr[13], ptr[14], ptr[15]); #endif if (ptr[0] == 0xfe && ptr[1] == 0x80) { // link-local IPv6 address char * addrs = malloc( (iface_ptr->linkaddrcount+1)*16); memcpy(addrs, iface_ptr->linkaddr, 16*iface_ptr->linkaddrcount); memcpy(addrs + 16*iface_ptr->linkaddrcount, ptr, 16); free(iface_ptr->linkaddr); iface_ptr->linkaddr = addrs; iface_ptr->linkaddrcount++; } else { // this is global address char * addrs = malloc( (iface_ptr->globaladdrcount+1)*16); memcpy(addrs, iface_ptr->globaladdr, 16*iface_ptr->globaladdrcount); memcpy(addrs + 16*iface_ptr->globaladdrcount, ptr, 16); free(iface_ptr->globaladdr); iface_ptr->globaladdr = addrs; iface_ptr->globaladdrcount++; } break; } // end of AF_INET6 handling case AF_LINK: { struct sockaddr_dl *linkInfo; linkInfo = (struct sockaddr_dl *) addr_ptr->ifa_addr; // Note: sdl_type is unsigned character; hardwareType is integer iface_ptr->hardwareType = linkInfo->sdl_type; if (linkInfo->sdl_alen > 1) { memcpy(iface_ptr->mac, LLADDR(linkInfo), linkInfo->sdl_alen); iface_ptr->maclen = linkInfo->sdl_alen; } break; } default: break; // ignore other address families } } } /* Print out iface_lst data if debug mode */ #ifdef LOWLEVEL_DEBUG iface_ptr = iface_lst; while (iface_ptr) { if_print(iface_ptr); iface_ptr = iface_ptr->next; } #endif return iface_lst; } /* end of if_list_get */ int ipaddr_add(const char * ifacename, int ifaceid, const char * addr, unsigned long pref, unsigned long valid, int prefixLength) { char buf[512]; int status; #ifdef NETBSD sprintf(buf, "ifconfig %s inet6 %s prefixlen %d", ifacename, addr, prefixLength); #else sprintf(buf, "ifconfig %s inet6 %s prefixlen %d add", ifacename, addr, prefixLength); #endif status = system(buf); if (!status) return LOWLEVEL_NO_ERROR; return LOWLEVEL_ERROR_UNSPEC; } int ipaddr_update(const char* ifacename, int ifindex, const char* addr, unsigned long pref, unsigned long valid, int prefixLength) { /// @todo: implement this sprintf(Message, "Address update on BSD systems not implemented yet."); return LOWLEVEL_ERROR_NOT_IMPLEMENTED; } int ipaddr_del(const char * ifacename, int ifaceid, const char * addr, int prefixLength) { char buf[512]; int status; sprintf(buf, "ifconfig %s inet6 %s prefixlen %d delete", ifacename, addr, prefixLength); status = system(buf); if (!status) return LOWLEVEL_NO_ERROR; return LOWLEVEL_ERROR_UNSPEC; } int sock_add(char * ifacename, int ifaceid, char * addr, int port, int thisifaceonly, int reuse) { int error; int on = 1; struct addrinfo hints; struct addrinfo *res; int Insock; int multicast; char port_char[6]; char * tmp; struct sockaddr_in6 bindme; sprintf(port_char, "%d", port); if (!strncasecmp(addr, "ff", 2)) multicast = 1; else multicast = 0; #ifdef LOWLEVEL_DEBUG printf( "LOWLEVEL_DEBUG iface: %s(id=%d), addr=%s, port=%d, ifaceonly=%d reuse=%d###\n", ifacename, ifaceid, addr, port, thisifaceonly, reuse); fflush(stdout); #endif /* Open a socket for inbound traffic */ memset(&hints, 0, sizeof (hints)); hints.ai_family = PF_INET6; hints.ai_socktype = SOCK_DGRAM; hints.ai_protocol = IPPROTO_UDP; hints.ai_flags = AI_PASSIVE; if ((error = getaddrinfo(NULL, port_char, &hints, &res))) { sprintf(Message, "getaddrinfo failed. Is IPv6 protocol supported by kernel?"); return LOWLEVEL_ERROR_GETADDRINFO; } if ((Insock = socket(AF_INET6, SOCK_DGRAM, 0)) < 0) { sprintf(Message, "socket creation failed. Is IPv6 protocol supported by kernel?"); return LOWLEVEL_ERROR_UNSPEC; } /* Mac OS X have IPV6_PKTINFO only */ /* OpenBSD, NetBSD require IPV6_RECVPKTINFO */ #if (HAVE_DECL_IPV6_RECVPKTINFO == 0) && (HAVE_DECL_IPV6_PKTINFO == 0) #error "Both IPV6_RECVPKTINFO and IPV6_PKTINFO not defined. Need at least one of them" #endif /* Set the options to receive info about ipv6 traffic */ #if HAVE_DECL_IPV6_RECVPKTINFO == 1 if (setsockopt(Insock, IPPROTO_IPV6, IPV6_RECVPKTINFO, &on, sizeof (on)) < 0) #endif #if HAVE_DECL_IPV6_PKTINFO == 1 if (setsockopt(Insock, IPPROTO_IPV6, IPV6_PKTINFO, &on, sizeof(on)) < 0) #endif { sprintf(Message, "Failed to set up socket option (tried both IPV6_RECVPKTINFO and IPV6_PKTINFO)."); return LOWLEVEL_ERROR_SOCK_OPTS; } if (thisifaceonly) { #if 0 /* this part also looks like linux only code */ if (setsockopt(Insock, SOL_SOCKET, SO_BINDTODEVICE, ifacename, strlen(ifacename) + 1) < 0) { sprintf(Message, "Unable to bind socket to interface %s.", ifacename); return LOWLEVEL_ERROR_BIND_IFACE; } #endif } /* allow address reuse (this option sucks - why allow running multiple servers?) */ if (reuse != 0) { if (setsockopt(Insock, SOL_SOCKET, SO_REUSEADDR, &on, sizeof (on)) < 0) { sprintf(Message, "Unable to set up socket option SO_REUSEADDR."); return LOWLEVEL_ERROR_REUSE_FAILED; } } /* bind socket to a specified port */ bzero(&bindme, sizeof (struct sockaddr_in6)); bindme.sin6_family = AF_INET6; bindme.sin6_port = htons(port); /* Bind to interface using scope_id */ bindme.sin6_scope_id = ifaceid; tmp = (char*) (&bindme.sin6_addr); inet_pton6(addr, tmp); if (bind(Insock, (struct sockaddr*) & bindme, sizeof (bindme)) < 0) { sprintf(Message, "Unable to bind socket: %s", strerror(errno)); return LOWLEVEL_ERROR_BIND_FAILED; } freeaddrinfo(res); /* multicast server stuff */ if (multicast) { struct ipv6_mreq mreq6; memset(&mreq6, 0, sizeof (mreq6)); mreq6.ipv6mr_interface = ifaceid; tmp = (char*) (&mreq6.ipv6mr_multiaddr); inet_pton6(addr, tmp); /* Add to the all agent multicast address */ if (setsockopt(Insock, IPPROTO_IPV6, IPV6_JOIN_GROUP, &mreq6, sizeof (mreq6))) { sprintf(Message, "error joining ipv6 group"); return LOWLEVEL_ERROR_MCAST_MEMBERSHIP; } } return Insock; } int sock_del(int fd) { return close(fd); } int sock_send(int sock, char *addr, char *buf, int message_len, int port, int iface) { int result; struct sockaddr_in6 dst; memset(&dst, 0, sizeof (struct sockaddr_in6)); dst.sin6_len = sizeof(struct sockaddr_in6); dst.sin6_family = PF_INET6; dst.sin6_port = htons(port); // htons? inet_pton6(addr,(char*)&dst.sin6_addr); dst.sin6_scope_id = iface; result = sendto(sock, buf, message_len, 0, (struct sockaddr*)&dst, sizeof(struct sockaddr_in6)); if (result < 0) { sprintf(Message, "Unable to send data (dst addr: %s), error=%d", addr, result); return LOWLEVEL_ERROR_SOCKET; } return LOWLEVEL_NO_ERROR; } /* * */ int sock_recv(int fd, char * myPlainAddr, char * peerPlainAddr, char * buf, int buflen) { struct msghdr msg; /* message received by recvmsg */ struct sockaddr_in6 peerAddr; /* sender address */ struct sockaddr_in6 myAddr; /* my address */ struct iovec iov; /* simple structure containing buffer address and length */ struct cmsghdr *cm; /* control message */ struct in6_pktinfo *pktinfo; char control[CMSG_SPACE(sizeof (struct in6_pktinfo))]; char controlLen = CMSG_SPACE(sizeof (struct in6_pktinfo)); int result = 0; bzero(&msg, sizeof (msg)); bzero(&peerAddr, sizeof (peerAddr)); bzero(&myAddr, sizeof (myAddr)); bzero(&control, sizeof (control)); iov.iov_base = buf; iov.iov_len = buflen; msg.msg_name = &peerAddr; msg.msg_namelen = sizeof (peerAddr); msg.msg_iov = &iov; msg.msg_iovlen = 1; msg.msg_control = control; msg.msg_controllen = controlLen; result = recvmsg(fd, &msg, 0); if (result == -1) { return LOWLEVEL_ERROR_UNSPEC; } /* get source address */ inet_ntop6((void*) & peerAddr.sin6_addr, peerPlainAddr); /* get destination address */ for (cm = (struct cmsghdr *) CMSG_FIRSTHDR(&msg); cm; cm = (struct cmsghdr *) CMSG_NXTHDR(&msg, cm)) { if (cm->cmsg_level != IPPROTO_IPV6 || cm->cmsg_type != IPV6_PKTINFO) continue; pktinfo = (struct in6_pktinfo *) (CMSG_DATA(cm)); inet_ntop6((void*) & pktinfo->ipi6_addr, myPlainAddr); } return result; } void microsleep(int microsecs) { struct timespec x, y; x.tv_sec = (int) microsecs / 1000000; x.tv_nsec = (microsecs - x.tv_sec * 1000000) * 1000; nanosleep(&x, &y); } /* * returns: -1 - address not found, 0 - addr is ok, 1 - addr is tentative */ int is_addr_tentative(char * ifacename, int iface, char * addr) { /// @todo: implement this return 0; } char * getAAAKeyFilename(uint32_t SPI) { static char filename[1024]; if (SPI != 0) snprintf(filename, 1024, "%s%s%x", "/var/lib/dibbler/AAA/", "AAA-key-", SPI); else strcpy(filename, "/var/lib/dibbler/AAA/AAA-key"); return filename; } char * getAAAKey(uint32_t SPI, unsigned *len) { char * filename = 0; struct stat st; char * retval; int offset = 0; int fd; int ret; filename = getAAAKeyFilename(SPI); if (stat(filename, &st)) return NULL; fd = open(filename, O_RDONLY); if (0 > fd) return NULL; retval = malloc(st.st_size); if (!retval) { close(fd); return NULL; } while (offset < st.st_size) { ret = read(fd, retval + offset, st.st_size - offset); if (!ret) break; if (ret < 0) { free(retval); close(fd); return NULL; } offset += ret; } close(fd); if (offset != st.st_size) { free(retval); return NULL; } *len = st.st_size; return retval; } char * error_message() { return Message; } /** * begin link monitoring * * @param monitored_links head of the monitored links list * @param notify pointer to variable that is going to be modifed if change is detected */ void link_state_change_init(volatile struct link_state_notify_t * monitored_links, volatile int * notify) { printf("Link change monitoring is not supported yet on MacOS or BSD. Sorry.\n"); return; } /** * cleanup code for link state monitoring * */ void link_state_change_cleanup() { return; } int get_mac_from_ipv6(const char* iface_name, int ifindex, const char* v6addr, char* mac, int* mac_len) { /// @todo: Implement this for BSD /// see "/usr/sbin/ndp -a -n" return LOWLEVEL_ERROR_NOT_IMPLEMENTED; } dibbler-1.0.1/Port-bsd/dibbler-client.cpp0000664000175000017500000000666212556247252015140 00000000000000/* * Dibbler - a portable DHCPv6 * * authors: Tomasz Mrugalski * * released under GNU GPL v2 only licence * */ #include #include #include #include "DHCPClient.h" #include "Portable.h" #include "Logger.h" #include "daemon.h" //#include "ClntCfgMgr.h" using namespace std; TDHCPClient * ptr; std::string WORKDIR(DEFAULT_WORKDIR); std::string CLNTCONF_FILE(DEFAULT_CLNTCONF_FILE); std::string CLNTLOG_FILE(DEFAULT_CLNTLOG_FILE); std::string CLNTPID_FILE(DEFAULT_CLNTPID_FILE); void signal_handler(int n) { Log(Crit) << "Signal received. Shutting down." << LogEnd; ptr->stop(); } int status() { pid_t pid = getServerPID(); if (pid==-1) { cout << "Dibbler server: NOT RUNNING." << endl; } else { cout << "Dibbler server: RUNNING, pid=" << pid << endl; } pid = getClientPID(); if (pid==-1) { cout << "Dibbler client: NOT RUNNING." << endl; } else { cout << "Dibbler client: RUNNING, pid=" << pid << endl; } int result = (pid > 0)? 0: -1; pid = getRelayPID(); if (pid==-1) { cout << "Dibbler relay : NOT RUNNING." << endl; } else { cout << "Dibbler relay : RUNNING, pid=" << pid << endl; } return result; } int run() { if (!init(CLNTPID_FILE.c_str(), WORKDIR.c_str())) { die(CLNTPID_FILE.c_str()); return -1; } if (lowlevelInit()<0) { cout << "Lowlevel init failed:" << error_message() << endl; die(CLNTPID_FILE.c_str()); return -1; } TDHCPClient client(CLNTCONF_FILE); ptr = &client; if (ptr->isDone()) { die(CLNTPID_FILE.c_str()); return -1; } // connect signals (SIGTERM, SIGINT = shutdown) signal(SIGTERM, signal_handler); signal(SIGINT, signal_handler); ptr->run(); lowlevelExit(); die(CLNTPID_FILE.c_str()); return 0; } int help() { cout << "Usage:" << endl; cout << " dibbler-client ACTION" << endl << " ACTION = status|start|stop|install|uninstall|run" << endl << " status - show status and exit" << endl << " start - start installed service" << endl << " stop - stop installed service" << endl << " install - Not available in Linux/Unix systems." << endl << " uninstall - Not available in Linux/Unix systems." << endl << " run - run in the console" << endl << " help - displays usage info." << endl; return 0; } int main(int argc, char * argv[]) { char command[256]; int result=-1; logStart("(CLIENT, BSD port)", "Client", CLNTLOG_FILE.c_str()); // parse command line parameters if (argc>1) { int len = strlen(argv[1])+1; if (len>255) len = 255; strncpy(command,argv[1],len); } else { memset(command,0,256); } if (!strncasecmp(command,"start",5) ) { result = start(CLNTPID_FILE.c_str(), WORKDIR.c_str()); } else if (!strncasecmp(command,"run",3) ) { result = run(); } else if (!strncasecmp(command,"stop",4)) { result = stop(CLNTPID_FILE.c_str()); } else if (!strncasecmp(command,"status",6)) { result = status(); } else if (!strncasecmp(command,"help",4)) { result = help(); } else if (!strncasecmp(command,"install",7)) { cout << "Function not available in Linux/Unix systems." << endl; result = 0; } else if (!strncasecmp(command,"uninstall",9)) { cout << "Function not available in Linux/Unix systems." << endl; result = 0; } else { help(); } logEnd(); return result? EXIT_FAILURE: EXIT_SUCCESS; } dibbler-1.0.1/Port-bsd/lowlevel-options-bsd.c0000664000175000017500000001663512233256142016000 00000000000000/* * Dibbler - a portable DHCPv6 * * authors: Tomasz Mrugalski * * released under GNU GPL v2 licence * */ #include #include #include #include #include #include "Portable.h" #define CR 0x0a #define LF 0x0d extern char * Message; /* * results 0 - ok -1 - unable to open temp. file -2 - unable to open resolv.conf file */ int dns_add(const char * ifname, int ifaceid, const char * addrPlain) { FILE * f; unsigned char c; if ( !(f=fopen(RESOLVCONF_FILE,"a+"))) { return LOWLEVEL_ERROR_FILE; } fseek(f, -1, SEEK_END); c = fgetc(f); fseek(f,0, SEEK_END); if ( (c!=CR) && (c!=LF) ) { fprintf(f,"\n"); } fprintf(f,"nameserver %s\n",addrPlain); fclose(f); return LOWLEVEL_NO_ERROR; } int dns_del(const char * ifname, int ifaceid, const char *addrPlain) { FILE * f, *f2; char buf[512]; int found=0; struct stat st; memset(&st,0,sizeof(st)); stat(RESOLVCONF_FILE, &st); unlink(RESOLVCONF_FILE".old"); rename(RESOLVCONF_FILE,RESOLVCONF_FILE".old"); f = fopen(RESOLVCONF_FILE".old","r"); f2 = fopen(RESOLVCONF_FILE,"w"); while (fgets(buf,511,f)) { if ( (!found) && (strstr(buf, addrPlain)) ) { found = 1; continue; } fprintf(f2,"%s",buf); } fclose(f); fclose(f2); chmod(RESOLVCONF_FILE, st.st_mode); return LOWLEVEL_NO_ERROR; } int domain_add(const char* ifname, int ifaceid, const char* domain) { FILE * f, *f2; char buf[512]; int found = 0; unsigned char c; struct stat st; memset(&st,0,sizeof(st)); stat(RESOLVCONF_FILE, &st); unlink(RESOLVCONF_FILE".old"); rename(RESOLVCONF_FILE,RESOLVCONF_FILE".old"); if ( !(f = fopen(RESOLVCONF_FILE".old","r")) ) return LOWLEVEL_ERROR_FILE; if ( !(f2= fopen(RESOLVCONF_FILE,"w+"))) { fclose(f); return LOWLEVEL_ERROR_FILE; } while (fgets(buf,511,f)) { if ( (!found) && (strstr(buf, "search")) ) { if (strlen(buf)) buf[strlen(buf)-1]=0; fprintf(f2, "%s %s\n", buf, domain); found = 1; continue; } fprintf(f2,"%s",buf); } fseek(f2, -1, SEEK_END); c = fgetc(f2); fseek(f2,0, SEEK_END); if ( (c!=CR) && (c!=LF) ) { fprintf(f2,"\n"); } if (!found) fprintf(f2,"search %s\n",domain); fclose(f); fclose(f2); chmod(RESOLVCONF_FILE,st.st_mode); return LOWLEVEL_NO_ERROR; } int domain_del(const char * ifname, int ifaceid, const char *domain) { FILE * f, *f2; char buf[512], searchbuf[512], *ptr; int found=0; struct stat st; memset(&st,0,sizeof(st)); stat(RESOLVCONF_FILE, &st); if (strlen(domain) >= sizeof(searchbuf)-1 ) return LOWLEVEL_ERROR_UNSPEC; searchbuf[0] = ' '; strcpy(&(searchbuf[1]), domain); unlink(RESOLVCONF_FILE".old"); rename(RESOLVCONF_FILE,RESOLVCONF_FILE".old"); if ( !(f = fopen(RESOLVCONF_FILE".old","r")) ) { return LOWLEVEL_ERROR_FILE; } if ( !(f2= fopen(RESOLVCONF_FILE,"w+"))) { fclose(f); return LOWLEVEL_ERROR_FILE; } while (fgets(buf,511,f)) { if ( (!found) && (ptr=strstr(buf, searchbuf)) ) { found = 1; strcpy(ptr, ptr+strlen(searchbuf)); if (strlen(buf)<11) /* 11=minimum length (one letter domain in 2letter top domain, e.g. "search x.pl") */ continue; } fprintf(f2,"%s",buf); } fclose(f); fclose(f2); chmod(RESOLVCONF_FILE,st.st_mode); return LOWLEVEL_NO_ERROR; } int ntp_add(const char* ifname, const int ifindex, const char* addrPlain){ FILE * f; unsigned char c; if ( !(f=fopen(NTPCONF_FILE,"a+"))) { return LOWLEVEL_ERROR_FILE; } fseek(f, -1, SEEK_END); c = fgetc(f); fseek(f,0, SEEK_END); if ( (c!=CR) && (c!=LF) ) { fprintf(f,"\n"); } fprintf(f,"server %s\n",addrPlain); fclose(f); return LOWLEVEL_NO_ERROR; } int ntp_del(const char* ifname, const int ifindex, const char* addrPlain){ FILE * f, *f2; char buf[512]; int found=0; struct stat st; memset(&st,0,sizeof(st)); stat(NTPCONF_FILE, &st); unlink(NTPCONF_FILE".old"); rename(NTPCONF_FILE, NTPCONF_FILE".old"); f = fopen(NTPCONF_FILE".old","r"); f2 = fopen(NTPCONF_FILE,"w"); while (fgets(buf,511,f)) { if ( (!found) && (strstr(buf, addrPlain)) ) { found = 1; continue; } fprintf(f2,"%s",buf); } fclose(f); fclose(f2); chmod(NTPCONF_FILE, st.st_mode); return LOWLEVEL_NO_ERROR; } int timezone_set(const char* ifname, int ifindex, const char* timezone){ return LOWLEVEL_NO_ERROR; } int timezone_del(const char* ifname, int ifindex, const char* timezone){ return LOWLEVEL_NO_ERROR; } int sipserver_add(const char* ifname, const int ifindex, const char* addrPlain){ return LOWLEVEL_NO_ERROR; } int sipserver_del(const char* ifname, const int ifindex, const char* addrPlain){ return LOWLEVEL_NO_ERROR; } int sipdomain_add(const char* ifname, int ifindex, const char* domain){ return LOWLEVEL_NO_ERROR; } int sipdomain_del(const char* ifname, int ifindex, const char* domain){ return LOWLEVEL_NO_ERROR; } int nisserver_add(const char* ifname, const int ifindex, const char* addrPlain){ return LOWLEVEL_NO_ERROR; } int nisserver_del(const char* ifname, const int ifindex, const char* addrPlain){ return LOWLEVEL_NO_ERROR; } int nisdomain_set(const char* ifname, int ifindex, const char* domain){ return LOWLEVEL_NO_ERROR; } int nisdomain_del(const char* ifname, int ifindex, const char* domain){ return LOWLEVEL_NO_ERROR; } int nisplusserver_add(const char* ifname, const int ifindex, const char* addrPlain){ return LOWLEVEL_NO_ERROR; } int nisplusserver_del(const char* ifname, const int ifindex, const char* addrPlain){ return LOWLEVEL_NO_ERROR; } int nisplusdomain_set(const char* ifname, int ifindex, const char* domain){ return LOWLEVEL_NO_ERROR; } int nisplusdomain_del(const char* ifname, int ifindex, const char* domain){ return LOWLEVEL_NO_ERROR; } /** * adds prefix - if this node has IPv6 forwarding disabled, it will configure that prefix on the * interface, which prefix has been received on. If the forwarding is enabled, it will be assigned * to all other up, running and multicast capable interfaces. * In both cases, radvd.conf file will be created. * * @param ifname interface name * @param ifindex interface index * @param prefixPlain prefix (specified in human readable format) * @param prefixLength prefix length * @param prefered preferred lifetime * @param valid valid lifetime * * @return negative error code or 0 if successful */ int prefix_add(const char* ifname, int ifindex, const char* prefixPlain, int prefixLength, unsigned long prefered, unsigned long valid) { /** @todo: implement this */ sprintf(error_message(), "Prefix configuration on BSD systems not implemented yet."); return LOWLEVEL_ERROR_NOT_IMPLEMENTED; } int prefix_update(const char* ifname, int ifindex, const char* prefixPlain, int prefixLength, unsigned long prefered, unsigned long valid) { /** @todo: implement this */ sprintf(error_message(), "Prefix configuration on BSD systems not implemented yet."); return LOWLEVEL_ERROR_NOT_IMPLEMENTED; } int prefix_del(const char* ifname, int ifindex, const char* prefixPlain, int prefixLength) { /** @todo: implement this */ sprintf(error_message(), "Prefix configuration on BSD systems not implemented yet."); return LOWLEVEL_ERROR_NOT_IMPLEMENTED; } dibbler-1.0.1/Port-bsd/daemon.h0000664000175000017500000000134112233256142013144 00000000000000/* * Dibbler - a portable DHCPv6 * * authors: Tomasz Mrugalski * changes: Paul Schauer * * released under GNU GPL v2 only licence * * $Id: daemon.h,v 1.3 2009-04-19 21:37:44 thomson Exp $ * */ #ifndef DAEMON_H #define DAEMON_H #ifndef SIGTERM #define SIGTERM 15 #endif #ifndef SIGINT #define SIGINT 2 #endif int start(const char * pidfile, const char * workdir); int stop(const char * pidfile); int init(const char * pidfile, const char * workdir); int getPID(char * pidfile); int getServerPID(); int getClientPID(); int getRelayPID(); int die(const char * pidfile); void logStart(const char * note, const char * logname, const char * logfile); void logEnd(); #endif dibbler-1.0.1/Port-bsd/daemon.cpp0000664000175000017500000001207512556247252013517 00000000000000/* * Dibbler - a portable DHCPv6 * * authors: Tomasz Mrugalski * changes: Paul Schauer * * released under GNU GPL v2 licence * */ #include #include #include #include #include #include #include #include #include #include "Portable.h" #include "Logger.h" extern int status(); extern int run(); extern std::string WORKDIR; using namespace std; /** * checks if pid file exists, and returns its content (or -2 if unable to read) * * @param file * * @return pid value, or negative if error was detected */ pid_t getPID(const char * file) { /* check if the file exists */ struct stat buf; int i = stat(file, &buf); if (i!=0) return LOWLEVEL_ERROR_UNSPEC; ifstream pidfile(file); if (!pidfile.is_open()) return LOWLEVEL_ERROR_FILE; pid_t pid; pidfile >> pid; return pid; } pid_t getClientPID() { std::string clntpid_file = WORKDIR + "/client.pid"; return getPID(clntpid_file.c_str()); } pid_t getServerPID() { std::string relpid_file = WORKDIR + "/relay.pid"; return getPID(relpid_file.c_str()); } pid_t getRelayPID() { std::string relpid_file = WORKDIR + "/relay.pid"; return getPID(relpid_file.c_str()); } void daemon_init() { std::cout << "Starting daemon..." << std::endl; // daemon should close all open files fclose(stdin); fclose(stdout); fclose(stderr); pid_t childpid; cout << "Starting daemon..." << endl; logger::EchoOff(); if (getppid()!=1) { #ifdef SIGTTOU signal(SIGTTOU, SIG_IGN); #endif #ifdef SIGTTIN signal(SIGTTIN, SIG_IGN); #endif #ifdef SIGTSTP signal(SIGTSTP, SIG_IGN); #endif if ( (childpid = fork()) <0 ) { Log(Crit) << "Can't fork first child." << endl; return; } else if (childpid > 0) exit(EXIT_SUCCESS); // parent process #if 0 // @todo: daemon spawning in Mac OS is done a bit differently if (setpgrp(0) == -1) { Log(Crit) << "Can't change process group." << endl; return; } #endif signal( SIGHUP, SIG_IGN); if ( (childpid = fork()) <0) { cout << "Can't fork second child." << endl; return; } else if (childpid > 0) exit(EXIT_SUCCESS); // first child } // getppid()!=1 umask(DEFAULT_UMASK); } void daemon_die() { logger::Terminate(); logger::EchoOn(); } int init(const char * pidfile, const char * workdir) { string tmp; int pid = getPID(pidfile); if (pid > 0) { /** @todo: This is Linux specific. It will most likely not work on BSD or Mac OS */ char buf[20]; char cmd[256]; sprintf(buf,"/proc/%d", pid); if (!access(buf, F_OK)) { sprintf(buf, "/proc/%d/exe", pid); int len=readlink(buf, cmd, sizeof(cmd)); if(len!=-1) { cmd[len]=0; if(strstr(cmd, "dibbler")==NULL) { Log(Warning) << "Process is running but it is not Dibbler (pid=" << pid << ", name " << cmd << ")." << LogEnd; } else { Log(Crit) << "Process already running and it seems to be Dibbler (pid=" << pid << ", name " << cmd << ")." << LogEnd; return 0; } } else { Log(Crit) << "Process already running (pid=" << pid << ", file " << pidfile << " is present)." << LogEnd; return 0; } } else { Log(Warning) << "Pid file found (pid=" << pid << ", file " << pidfile << "), but process " << pid << " does not exist." << LogEnd; } } unlink(pidfile); ofstream pidFile(pidfile); if (!pidFile.is_open()) { Log(Crit) << "Unable to create " << pidfile << " file." << LogEnd; return 0; } pidFile << getpid(); pidFile.close(); Log(Notice) << "My pid (" << getpid() << ") is stored in " << pidfile << LogEnd; if (chdir(workdir)) { Log(Crit) << "Unable to change directory to " << workdir << "." << LogEnd; return 0; } umask(DEFAULT_UMASK); return 1; } void die(const char * pidfile) { if (unlink(pidfile)) { Log(Warning) << "Unable to delete " << pidfile << "." << LogEnd; } } int start(const char * pidfile, const char * workdir) { int result; daemon_init(); result = run(); daemon_die(); return result; } int stop(const char * pidfile) { int pid = getPID(pidfile); if (pid==-1) { cout << "Process is not running." << endl; return -1; } cout << "Sending KILL signal to process " << pid << endl; kill(pid, SIGTERM); return 0; } int install() { return 0; } int uninstall() { return 0; } /** things to do just after started */ void logStart(const char * note, const char * logname, const char * logfile) { std::cout << DIBBLER_COPYRIGHT1 << " " << note << std::endl; std::cout << DIBBLER_COPYRIGHT2 << std::endl; std::cout << DIBBLER_COPYRIGHT3 << std::endl; std::cout << DIBBLER_COPYRIGHT4 << std::endl; logger::setLogName(logname); logger::Initialize(logfile); logger::EchoOff(); Log(Emerg) << DIBBLER_COPYRIGHT1 << " " << note << LogEnd; logger::EchoOn(); } /** things to do just before end */ void logEnd() { logger::Terminate(); } dibbler-1.0.1/Port-bsd/Makefile.in0000664000175000017500000010136012561652535013611 00000000000000# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = Port-bsd DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/depcomp ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/libtool.m4 \ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/include/dibbler-config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = LIBRARIES = $(noinst_LIBRARIES) ARFLAGS = cru AM_V_AR = $(am__v_AR_@AM_V@) am__v_AR_ = $(am__v_AR_@AM_DEFAULT_V@) am__v_AR_0 = @echo " AR " $@; am__v_AR_1 = libLowLevel_a_AR = $(AR) $(ARFLAGS) libLowLevel_a_LIBADD = am_libLowLevel_a_OBJECTS = libLowLevel_a-daemon.$(OBJEXT) \ libLowLevel_a-lowlevel-bsd.$(OBJEXT) \ libLowLevel_a-lowlevel-options-bsd.$(OBJEXT) \ libLowLevel_a-dibbler-client.$(OBJEXT) \ libLowLevel_a-dibbler-server.$(OBJEXT) \ libLowLevel_a-dibbler-relay.$(OBJEXT) libLowLevel_a_OBJECTS = $(am_libLowLevel_a_OBJECTS) AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)/include depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) LTCXXCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CXXFLAGS) $(CXXFLAGS) AM_V_CXX = $(am__v_CXX_@AM_V@) am__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@) am__v_CXX_0 = @echo " CXX " $@; am__v_CXX_1 = CXXLD = $(CXX) CXXLINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \ $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CXXLD = $(am__v_CXXLD_@AM_V@) am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@) am__v_CXXLD_0 = @echo " CXXLD " $@; am__v_CXXLD_1 = SOURCES = $(libLowLevel_a_SOURCES) DIST_SOURCES = $(libLowLevel_a_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALLOCA = @ALLOCA@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ ARCH = @ARCH@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ EXTRA_DIST_SUBDIRS = @EXTRA_DIST_SUBDIRS@ FGREP = @FGREP@ GREP = @GREP@ GTEST_INCLUDES = @GTEST_INCLUDES@ GTEST_LDADD = @GTEST_LDADD@ GTEST_LDFLAGS = @GTEST_LDFLAGS@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LINKPRINT = @LINKPRINT@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PORT_CFLAGS = @PORT_CFLAGS@ PORT_LDFLAGS = @PORT_LDFLAGS@ PORT_SUBDIR = @PORT_SUBDIR@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ subdirs = @subdirs@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ noinst_LIBRARIES = libLowLevel.a libLowLevel_a_CFLAGS = -std=c99 libLowLevel_a_CPPFLAGS = -I$(top_srcdir)/Misc libLowLevel_a_SOURCES = daemon.cpp daemon.h lowlevel-bsd.c lowlevel-options-bsd.c malloc.h dibbler-client.cpp dibbler-server.cpp dibbler-relay.cpp all: all-am .SUFFIXES: .SUFFIXES: .c .cpp .lo .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign Port-bsd/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign Port-bsd/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstLIBRARIES: -test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES) libLowLevel.a: $(libLowLevel_a_OBJECTS) $(libLowLevel_a_DEPENDENCIES) $(EXTRA_libLowLevel_a_DEPENDENCIES) $(AM_V_at)-rm -f libLowLevel.a $(AM_V_AR)$(libLowLevel_a_AR) libLowLevel.a $(libLowLevel_a_OBJECTS) $(libLowLevel_a_LIBADD) $(AM_V_at)$(RANLIB) libLowLevel.a mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libLowLevel_a-daemon.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libLowLevel_a-dibbler-client.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libLowLevel_a-dibbler-relay.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libLowLevel_a-dibbler-server.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libLowLevel_a-lowlevel-bsd.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libLowLevel_a-lowlevel-options-bsd.Po@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< libLowLevel_a-lowlevel-bsd.o: lowlevel-bsd.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libLowLevel_a_CPPFLAGS) $(CPPFLAGS) $(libLowLevel_a_CFLAGS) $(CFLAGS) -MT libLowLevel_a-lowlevel-bsd.o -MD -MP -MF $(DEPDIR)/libLowLevel_a-lowlevel-bsd.Tpo -c -o libLowLevel_a-lowlevel-bsd.o `test -f 'lowlevel-bsd.c' || echo '$(srcdir)/'`lowlevel-bsd.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libLowLevel_a-lowlevel-bsd.Tpo $(DEPDIR)/libLowLevel_a-lowlevel-bsd.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='lowlevel-bsd.c' object='libLowLevel_a-lowlevel-bsd.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libLowLevel_a_CPPFLAGS) $(CPPFLAGS) $(libLowLevel_a_CFLAGS) $(CFLAGS) -c -o libLowLevel_a-lowlevel-bsd.o `test -f 'lowlevel-bsd.c' || echo '$(srcdir)/'`lowlevel-bsd.c libLowLevel_a-lowlevel-bsd.obj: lowlevel-bsd.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libLowLevel_a_CPPFLAGS) $(CPPFLAGS) $(libLowLevel_a_CFLAGS) $(CFLAGS) -MT libLowLevel_a-lowlevel-bsd.obj -MD -MP -MF $(DEPDIR)/libLowLevel_a-lowlevel-bsd.Tpo -c -o libLowLevel_a-lowlevel-bsd.obj `if test -f 'lowlevel-bsd.c'; then $(CYGPATH_W) 'lowlevel-bsd.c'; else $(CYGPATH_W) '$(srcdir)/lowlevel-bsd.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libLowLevel_a-lowlevel-bsd.Tpo $(DEPDIR)/libLowLevel_a-lowlevel-bsd.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='lowlevel-bsd.c' object='libLowLevel_a-lowlevel-bsd.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libLowLevel_a_CPPFLAGS) $(CPPFLAGS) $(libLowLevel_a_CFLAGS) $(CFLAGS) -c -o libLowLevel_a-lowlevel-bsd.obj `if test -f 'lowlevel-bsd.c'; then $(CYGPATH_W) 'lowlevel-bsd.c'; else $(CYGPATH_W) '$(srcdir)/lowlevel-bsd.c'; fi` libLowLevel_a-lowlevel-options-bsd.o: lowlevel-options-bsd.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libLowLevel_a_CPPFLAGS) $(CPPFLAGS) $(libLowLevel_a_CFLAGS) $(CFLAGS) -MT libLowLevel_a-lowlevel-options-bsd.o -MD -MP -MF $(DEPDIR)/libLowLevel_a-lowlevel-options-bsd.Tpo -c -o libLowLevel_a-lowlevel-options-bsd.o `test -f 'lowlevel-options-bsd.c' || echo '$(srcdir)/'`lowlevel-options-bsd.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libLowLevel_a-lowlevel-options-bsd.Tpo $(DEPDIR)/libLowLevel_a-lowlevel-options-bsd.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='lowlevel-options-bsd.c' object='libLowLevel_a-lowlevel-options-bsd.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libLowLevel_a_CPPFLAGS) $(CPPFLAGS) $(libLowLevel_a_CFLAGS) $(CFLAGS) -c -o libLowLevel_a-lowlevel-options-bsd.o `test -f 'lowlevel-options-bsd.c' || echo '$(srcdir)/'`lowlevel-options-bsd.c libLowLevel_a-lowlevel-options-bsd.obj: lowlevel-options-bsd.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libLowLevel_a_CPPFLAGS) $(CPPFLAGS) $(libLowLevel_a_CFLAGS) $(CFLAGS) -MT libLowLevel_a-lowlevel-options-bsd.obj -MD -MP -MF $(DEPDIR)/libLowLevel_a-lowlevel-options-bsd.Tpo -c -o libLowLevel_a-lowlevel-options-bsd.obj `if test -f 'lowlevel-options-bsd.c'; then $(CYGPATH_W) 'lowlevel-options-bsd.c'; else $(CYGPATH_W) '$(srcdir)/lowlevel-options-bsd.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libLowLevel_a-lowlevel-options-bsd.Tpo $(DEPDIR)/libLowLevel_a-lowlevel-options-bsd.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='lowlevel-options-bsd.c' object='libLowLevel_a-lowlevel-options-bsd.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libLowLevel_a_CPPFLAGS) $(CPPFLAGS) $(libLowLevel_a_CFLAGS) $(CFLAGS) -c -o libLowLevel_a-lowlevel-options-bsd.obj `if test -f 'lowlevel-options-bsd.c'; then $(CYGPATH_W) 'lowlevel-options-bsd.c'; else $(CYGPATH_W) '$(srcdir)/lowlevel-options-bsd.c'; fi` .cpp.o: @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $< .cpp.obj: @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .cpp.lo: @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LTCXXCOMPILE) -c -o $@ $< libLowLevel_a-daemon.o: daemon.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libLowLevel_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libLowLevel_a-daemon.o -MD -MP -MF $(DEPDIR)/libLowLevel_a-daemon.Tpo -c -o libLowLevel_a-daemon.o `test -f 'daemon.cpp' || echo '$(srcdir)/'`daemon.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libLowLevel_a-daemon.Tpo $(DEPDIR)/libLowLevel_a-daemon.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='daemon.cpp' object='libLowLevel_a-daemon.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libLowLevel_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libLowLevel_a-daemon.o `test -f 'daemon.cpp' || echo '$(srcdir)/'`daemon.cpp libLowLevel_a-daemon.obj: daemon.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libLowLevel_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libLowLevel_a-daemon.obj -MD -MP -MF $(DEPDIR)/libLowLevel_a-daemon.Tpo -c -o libLowLevel_a-daemon.obj `if test -f 'daemon.cpp'; then $(CYGPATH_W) 'daemon.cpp'; else $(CYGPATH_W) '$(srcdir)/daemon.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libLowLevel_a-daemon.Tpo $(DEPDIR)/libLowLevel_a-daemon.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='daemon.cpp' object='libLowLevel_a-daemon.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libLowLevel_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libLowLevel_a-daemon.obj `if test -f 'daemon.cpp'; then $(CYGPATH_W) 'daemon.cpp'; else $(CYGPATH_W) '$(srcdir)/daemon.cpp'; fi` libLowLevel_a-dibbler-client.o: dibbler-client.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libLowLevel_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libLowLevel_a-dibbler-client.o -MD -MP -MF $(DEPDIR)/libLowLevel_a-dibbler-client.Tpo -c -o libLowLevel_a-dibbler-client.o `test -f 'dibbler-client.cpp' || echo '$(srcdir)/'`dibbler-client.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libLowLevel_a-dibbler-client.Tpo $(DEPDIR)/libLowLevel_a-dibbler-client.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='dibbler-client.cpp' object='libLowLevel_a-dibbler-client.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libLowLevel_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libLowLevel_a-dibbler-client.o `test -f 'dibbler-client.cpp' || echo '$(srcdir)/'`dibbler-client.cpp libLowLevel_a-dibbler-client.obj: dibbler-client.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libLowLevel_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libLowLevel_a-dibbler-client.obj -MD -MP -MF $(DEPDIR)/libLowLevel_a-dibbler-client.Tpo -c -o libLowLevel_a-dibbler-client.obj `if test -f 'dibbler-client.cpp'; then $(CYGPATH_W) 'dibbler-client.cpp'; else $(CYGPATH_W) '$(srcdir)/dibbler-client.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libLowLevel_a-dibbler-client.Tpo $(DEPDIR)/libLowLevel_a-dibbler-client.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='dibbler-client.cpp' object='libLowLevel_a-dibbler-client.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libLowLevel_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libLowLevel_a-dibbler-client.obj `if test -f 'dibbler-client.cpp'; then $(CYGPATH_W) 'dibbler-client.cpp'; else $(CYGPATH_W) '$(srcdir)/dibbler-client.cpp'; fi` libLowLevel_a-dibbler-server.o: dibbler-server.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libLowLevel_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libLowLevel_a-dibbler-server.o -MD -MP -MF $(DEPDIR)/libLowLevel_a-dibbler-server.Tpo -c -o libLowLevel_a-dibbler-server.o `test -f 'dibbler-server.cpp' || echo '$(srcdir)/'`dibbler-server.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libLowLevel_a-dibbler-server.Tpo $(DEPDIR)/libLowLevel_a-dibbler-server.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='dibbler-server.cpp' object='libLowLevel_a-dibbler-server.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libLowLevel_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libLowLevel_a-dibbler-server.o `test -f 'dibbler-server.cpp' || echo '$(srcdir)/'`dibbler-server.cpp libLowLevel_a-dibbler-server.obj: dibbler-server.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libLowLevel_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libLowLevel_a-dibbler-server.obj -MD -MP -MF $(DEPDIR)/libLowLevel_a-dibbler-server.Tpo -c -o libLowLevel_a-dibbler-server.obj `if test -f 'dibbler-server.cpp'; then $(CYGPATH_W) 'dibbler-server.cpp'; else $(CYGPATH_W) '$(srcdir)/dibbler-server.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libLowLevel_a-dibbler-server.Tpo $(DEPDIR)/libLowLevel_a-dibbler-server.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='dibbler-server.cpp' object='libLowLevel_a-dibbler-server.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libLowLevel_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libLowLevel_a-dibbler-server.obj `if test -f 'dibbler-server.cpp'; then $(CYGPATH_W) 'dibbler-server.cpp'; else $(CYGPATH_W) '$(srcdir)/dibbler-server.cpp'; fi` libLowLevel_a-dibbler-relay.o: dibbler-relay.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libLowLevel_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libLowLevel_a-dibbler-relay.o -MD -MP -MF $(DEPDIR)/libLowLevel_a-dibbler-relay.Tpo -c -o libLowLevel_a-dibbler-relay.o `test -f 'dibbler-relay.cpp' || echo '$(srcdir)/'`dibbler-relay.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libLowLevel_a-dibbler-relay.Tpo $(DEPDIR)/libLowLevel_a-dibbler-relay.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='dibbler-relay.cpp' object='libLowLevel_a-dibbler-relay.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libLowLevel_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libLowLevel_a-dibbler-relay.o `test -f 'dibbler-relay.cpp' || echo '$(srcdir)/'`dibbler-relay.cpp libLowLevel_a-dibbler-relay.obj: dibbler-relay.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libLowLevel_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libLowLevel_a-dibbler-relay.obj -MD -MP -MF $(DEPDIR)/libLowLevel_a-dibbler-relay.Tpo -c -o libLowLevel_a-dibbler-relay.obj `if test -f 'dibbler-relay.cpp'; then $(CYGPATH_W) 'dibbler-relay.cpp'; else $(CYGPATH_W) '$(srcdir)/dibbler-relay.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libLowLevel_a-dibbler-relay.Tpo $(DEPDIR)/libLowLevel_a-dibbler-relay.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='dibbler-relay.cpp' object='libLowLevel_a-dibbler-relay.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libLowLevel_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libLowLevel_a-dibbler-relay.obj `if test -f 'dibbler-relay.cpp'; then $(CYGPATH_W) 'dibbler-relay.cpp'; else $(CYGPATH_W) '$(srcdir)/dibbler-relay.cpp'; fi` mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LIBRARIES) installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool clean-noinstLIBRARIES \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \ clean-libtool clean-noinstLIBRARIES cscopelist-am ctags \ ctags-am distclean distclean-compile distclean-generic \ distclean-libtool distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-dvi install-dvi-am install-exec \ install-exec-am install-html install-html-am install-info \ install-info-am install-man install-pdf install-pdf-am \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ tags tags-am uninstall uninstall-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: dibbler-1.0.1/Port-bsd/malloc.h0000664000175000017500000000022412233256142013147 00000000000000 /* dummy header for Mac OS X: malloc is defined in stdlib.h, not in malloc.h */ /* required for files generated by bison++ */ #include dibbler-1.0.1/doc/0000775000175000017500000000000012561700420010661 500000000000000dibbler-1.0.1/doc/dibbler-multiple-cli.png0000664000175000017500000024366412233256142015332 00000000000000‰PNG  IHDRp•vžsRGB®ÎégAMA± üa cHRMz&€„ú€èu0ê`:˜pœºQ< pHYsÂÂnÐu>ÿyIDATx^ì½´$Ç‘¶½ß÷µýïÚÒ®-°Ð–,´-fffáˆqD3˜™™™™™FÌ8b°d{½ÿs'®bBYЕÕUÝuûF>sîtgeU½õ曑™ÿçÿ÷ÿÍGÀpGÀpG 4J?GÀpGÀpÒü[é3ýDGÀpGÀpG oºÛQpGÀpGÀpÚAÀe;èù¹Ž€#à8Ž€#à8î¡tpGÀpGÀh÷P¶‡ŸŸí8Ž€#à8ŽÀ GÀå 7ÀpGÀpöpAÙ~~¶#à8Ž€#à8ƒ”ƒÞGÀpGÀpÚCÀe{øùÙŽ€#à8Ž€#à z\Pzpz #F<žv|ðÁQ*uP›=ë›o¾‘¢pjm-+ÑgiY²²n¾ |@¿%GÀp,.(ÝžB`žyæI݈ursPf§vÊ—˜§JZt<ð@©Êè)Ò"ü›z?ÜÁc¶\ÀßCGÀ̸ Ì­ïÏÞƒD Jž_stU—Ÿ”ƒvIM'ç¬Tu¨µñkêªF©.Ò|AiÃ@ƒ:S£BE s'ÈÇ 3))¼R-ãšk® NÔëò=¿Ú³J$åpÛYõ§âC8¦®âĹ©ÀrV.ë)Aa›îMåÈÞ'\GÀ(Š€ Ê¢Hy9G`@ ÐA™³neªw0ßï•%}Re–ç϶NªRA™£D³š8õ¡òí¡¸‡²ˆDNUê*(³\†Z ¸ ´¦ÜØ@ÜE}@¼§~“Ž@ï!à‚²÷ÚÔŸhP#ÐA™?eœ*¤Deù5i°Tm”S•ÄAæšý£Ö ‚2V$ézÔToqA©%‹<‘uFæèEyê‚2™/IBhtwOjfñ‡wZ!à‚²Bþ»#0 ˆ”Y 9I9Y¬‚SŽ Ìq –”©«ä䬆SZP¶t¦H AYä‰ê”"Cõæí-Iô¤/4 øÀoÖè.(;‡µ_É豂RÓARÓhŸœ®¼“ó ”ùþ<ùÕúD›/(‹<‘³¬ÃC©-KTƒ,Z¤¢â2ÇÓÜ ÷K8Ž@3pAÙÌvñ»rJ"%(mÆt0¡™ã¡DXäl-£7`ËHm9I'vIE}òmšï%MÅ®´ ìØ”wì\|­‚R1äññJÊÆBª)ÝOYòýôÓÞEÀeï¶­?Ù D JPÚ´òeŽô)—”“š1“*(³¦’[¶viAIÍ-“rdÁp.¡J«ø”w‘¤œÔ§ëŒ ÔK³H“>T‰Lù– äG`@#à‚r@7Ÿß¼#"P\Pêj5¸²ö¶Iò¦|êÞ†ÜJÖ 8-Yª_3U“emíc¹ZQxú};‚Rï$gÙ ñÞé‹ J]<@Û>ו'ªuÊ›;á\(+Úµ\8©¿¥Ž€#0pA9ZÙŸq!PPPÚýšS½MùʬDo½zêÎàYJTw5 Uª&³{¦:Ju†šËYý׎ TÍW÷ÂæY»Š§6kûÊ r kQ}£DœâêCÀe1œ¼”#0@På!‹‚ÀnäBR¤î7“/(“[/RIË tñáš 5©ÁyÁ.ˆYN>»íuà2´[/â¯AIãëÍÔºõb.mŸ×ša%‚20ç1uC£@©7ÃoÓpêEÀe½øzíŽ@‡PAPd  g¥×ä/$W¡ Z¡Æ¿* ù#gçh]’³8ìÝ&…ZN¸¤=Q¦¶9lâHR(·)(­œÒ·ê<¸bñ)o±U,5À&e\;‚Ò(“ér©`ëîÉ¿Ô~9G`@ à‚r@4“ߤ#P"‚²È‚‚ù‚ÒægX嚥P¥6ÉYI.C“´—#(¨g”erî6¥ˆ­,xù>¸b¬ ¤~î0 ŽJðdøf;‚Ò:†Eª…?KQf…Ï5P/ç8=Š€ ÊmX¬ÁŠÊâ®Ë:P!E¶<‘Óƒéi4|/èj‡$‹ä,%#g‰$â길$ùƒ(Y÷£Ï’:)OU¸B9]ª’Ú¨9+oFo>«¶‚&#kèèýg=xÖͧ«— Ù¼eýœÂƒX`“÷Ÿ_@Ñ“V`á6ô1[¶TA輘#àô0.({¸qýÑGÀpGÀè.(;²_ÃpGÀpFÀe7®?š#à8Ž€#à8@Àe'Pök8Ž€#à8Ž€#Ðø ìáÆõGsGÀpG ¸ ìÊ~ GÀpGÀpz”=ܸþhŽ€#à8Ž€#àt”@Ù¯á8Ž€#à8Ž@#à‚²‡×ÍpGÀpN à‚²(û5GÀpGÀèa\Pöpãú£9Ž€#à8Ž€#Ð \Pve¿†#à8Ž€#à8=Œ€ Ên\4GÀpGÀp:€ ÊN ì×pGÀpG ‡pAÙÃëæ8Ž€#à8Ž@'pAÙ ”ýŽ€#à8Ž€#àô0.(G7î_|qWÆñÐCõ°ø£5 §žz*Ë?üðæݭßO¯"à”Ø«-;¨ž+‹Kù~PáЇuAÙòI'ô«_ýêß²ßÿþ÷”é@“ø%3tá3Î8cŽòÓ +¬ðæ›of”üÙ;€€Sb@öKÔŠ’ñ¿þë¿rè”Nï½÷þÛßþVëm žÊ]Pöµ5½x¾šT‹¤³÷aÍày=:ÿ¤»îºk¾š”_1WJb·¿C¿â`@À)q0´rÏ?ãTSMU„Nñ]tÑE=FÐeÈguV³Ó2î"ê€iÎKüñ,nŠî5œFÒ§vJìÈ~‰Zx饗Šs)%ç˜cmk³E\Pö¸ÁDYžºˆÜUÞ¦ýùé&²cíòxÍݪEÀ)±Z<½¶Î#pðÁ— S,ßãÔK7– Ê>èl˜Å~ûí·á†þâ¿ÀÇsL,Þ~ûí›nºi¦™fJZ§»ÊK[žŸ˜Dàè£VÃUyöÙgO9å”òÍB -tçw¾òÊ+Æ ûå/™4Å5ÖXÃyЪ*œ«BÒëé ,°€ò$2q÷ÝwÿÍo~#Π-·Üò¹çž{üñÇ_|ñ$—büˆQ÷•h8”ÿKL¤5©»ï¾ûÉ'Ÿ¼þúë\pAù~òÉ'?÷Üsßyçã?~ì±ÇNÚŸ»ÊKXžŸ’DÀ2àZk­õÄO`Šðàï~÷;±ºM6ÙäùçŸçûå–[.i‡`îFU N‰•Àè•t‚€-Cžzê©pé=÷ܳöÚkË÷ãŽ;îAD·~É%—L3Í4I:eHÕUWuñâ¥]Pþ¯Mƒ˜e–Y¤ç`é–ÓN;M]DèKxöÕW_Ý~ûíÝE4m½á÷¤AÀ€jŠ÷Þ{/^s±:ñšÃƒW_}õÌ3Ïì^ó†7ë@¼=§ÄØj~Ï’l”qLÚn™8÷Üs˯ÓN;-‚:E\¦z‹ä£Û‚¸ ü_›¶õÖ[[ËÃ’ž~úé=öØc¬±ÆWùV[mõ / 7S]Dî*/hv^,‰@À€„E¦xã7ª×¼ôÒKß}÷ÝN8ÁyÐÍ©ZŠS"¬è”X-ø^[%Ø àe—]6٭Ü“L2‰ÈÊ%–X‚>ž©ðToÑvÛmçKji—Á.(ƒ4ˆ+®¸"iyhÊûï¿uÖãgœqÍЗӣ»«¼ˆ‘y™"X\l±Å°ÃTS<ñÄ-¢;sxpóÍ7÷ÀÊ"à{EÀ)Ñ¡°AÀûì³O*—>óÌ3Ûn»­Vî°Ã¯½öó6ôHÝœTHŒ{ Së# vAÉâ½j1ã?~V/Žåq\sÍ5ÖU~Ùe—½÷Þ{Dﺋ¨V$•“०Ȥv¾)î²Ë.ʃ¸ˆ^|ñE”%ãìä ¸{͉ýTõ˜N‰U!éõt dp– ¤['ÙqµÕVSožKºõóÏ?²É&KÒ)Î{2t»õ\Í¿î`”¶–4±¼ë®»nÇw¼ùæ›qOrˆ |vÔáZÓâtçY®r\Dî*oþkÐõ;DZò‚Õ<ðÀÃ;L¢/¬)>ðÀë®»®òàQG2ÈÉòš;v½•Ä ´O‰³Sâ€hë^½Éd°të÷Ýw9Ž_|q²[‡9g›m6¡SR)®½öZè׿cŒ‘”•¼#¾WYªñ jAɺvƒœSN9E{q\D˜á(ÂGyÄ J–à ¨B]DHÏ7Þxãá‡Ö7k‚î*ïUÚªð¹ÄÞ”ÎXÏBL‘µyÅD§›n:–Æ6Ø!ħ<8묳2zÿý÷9ä,¤Â oÛ«ê1Ú¡D´rJì1{ cƒ€™ÀÑn]—ë'âöÛoOvëÇ—| ŽõÖ[a<„©ãvÛ­û^e.(CÈöRaáÉ|P,n{äȑӆ…zè¡ê¡AÉê-,0´úê««‹ˆà6úrw•PêîmÛý»7ÝtS”XžEÂvÅÌßqÇIS„'˜`)Ã6Nƒ¬1”[ó˜w·­›|u§Ä&·Žß[‚ àË/¿\å·ß~ËÐ]Ònü@ùè£ÊÄ£vë:t¨.©GoÑ­·Þ:çœs&éÔ÷* ZdP{(mq¸Ú‹³|401X×õÿ°$Ö:ãŒ3¬å¡)ɇ göÙgSÑ|°ï¾ûº‹¨ÈËïe@ `À /¼PMñ›o¾¡³ÞÊe0ÝFmÄ|w`ŠLè° •uQ-ë ¹×Üm¬8N‰Å±ò’ÍD V.E2rÃÿó?ÿC7­tŠ·ˆ€¢d·ÎŠ•K-µ”›xâ‰Ï<óLºuþh¢‰’²Ò÷*SKÔ‚2HƒPËûøãè†nÀtÆ›`¢á'ŸÿÇIúãsÙ°ä–[n¥J†Ž;î8u•¯¿þúø8_~ùåT‘»Ê›IC]¼+Ë€ã7v(¦ˆ J*ØöÃöYsÝ~§#ƶçž{ê¨ZM¹âŠ+¿ùM_|.Æ4dÈÏ­ DS˜ššÃêÓ¬^‰¨1×\s¹«¼WÉ«’çb’Z-då•WVA) øé§Ÿ Þ|ÏSØáe×ß3ç<ý{8*Ä 9Û`ŠD[Ä© Lõšsu0¯¤z%uP"K±èì¡Sâ@·æß|ì±Çj·þå—_rÿ§Ÿ~:\:Ý 3K·~ø±gà3ú]rÉ% c ºuè”UÕ[D<Òˆ#:²¤­ìí{• ^AiÓ ÈxÐ^#f÷ÏþSöÈ9â¸3ñùÜõÈËk­7ÚE´×^{©‡³#jƒ+—^ziuÌB€ü›å*wQóIªÖ;Le@!ÁÏ?ÿ\pŠ©¦Q;äcO½à“ö{Í^xa†CIS<òÈ#­×\"Љ4OoÜk^k”ÊJKù}f! .e°ÄTg‰ÜtË•N|êÍ­¶g›ï~o”²È9}ºtë„Z"%uh´ß~ûÑ­³?3ùà©Þ"\›ƒ³¯ dn5æ¦UP’)È`ý¿üåCO½ùÄ‹ØÏu·=²ÀÂý þá":ûì³Õì°”Á‰“IåjŠˆÔ($œc@Cê7_ÎP"{8%–h?¥ üã•N!CíÖ ¢|Šü:þeuëWÞp¾Ô@Ôì$žwÞySO=µ”!§ÆfhD€\j`å`Û«l J] ›`È¢½¸¦A`(ü´û>‡>ùò‡9 ¨‹7'Žq+(Ñôf›m¦.¢ý÷ߟ `6evWyA‚èùb–YWMQ2Ãpäô™èXãäÛáõw<ºà"£½æçœsN0¶Á-Š×üwÞÙi§<À¼çm¬ÈvŒI}pJ,Ò"^& ˜}ITPJ^Ó5Ðé*k¬—O§ÇŸv¡‘ëÍrèI:Õtâ…¶Ùféë‰ÂLÎ@ª½Ê© ´nÂe–YF{ñ âÆ;{zÄGùŸû±Ñ¦ý£\D¬­¯JŒŒg;¡¾‹.º¨ºÊÉ™øä“OXG=ËUî.¢X* åd•r5E›¶ÜJ«·´C œ~Þ•SN=­˜’‘ š¤)ý£."úuŒ“ tM ·lèæÔ¨ÊݶSb9Üü¬æ `ƒ€§˜b åR¼ŒÜäßÿþwÉ‹8ú„³ŠÐéλï÷›1úBÔr“nKøP@§Ì¤ë û¸ãŽË¬&Ý:AœÓNÛO–Nq †½Ê£ $ Âî¨åI‹“c ôÍEÌNÊ =\¤t‚?oÜ*(é¶Ùuž… þô§?‰‘1îÁß}÷ÝwÞÙ]åÍ¡¤ß Á+éŠ)"ò¸b(I+΀bŠ{ìsèX?VhA…)r®óìʃ]ª×„"; ‹_®Ãt‘ÿüç?ëˆØ §Ä7}/].Ön%$yL¼Œ¢yöí‚=;Þ¢µ×ßTìoiŽÌf{v"ç›o>)]ÖÈJDEj¾Kõö^eƒQPÚã% B,ŽVÒ d«øÍ·Þé™W>ŽúœqÞUê""j —»x(EPr¼þúë,(«·àb¥~¾äºº†ªÓ *Wy/ñZñga9}mqB&TP²,•0°|ô¹w¢ìðþÇ_Ùh³md 2;Œm°:ö~°$‰Ã±LÙ]ÿîá½Ê£ ¤9µi% B,‘fÇ`]Ò Î8ÿªg_ý¸ÄgÏýkìþ½òp‰KŠ™ J4%‘šlv"÷ ."úrzô,W¹»ˆºÎVuÜÀ_|aé†Ì05EÉ œí/s•0BN¹ùîÇZ´ßk>餓²[0¶Á-2ªalƒ¡2Îq¯y-ÞØ:Û4~cHK·ÎT55°fìFï\ŽNO:ã¢I&\oc°€Nÿï²Ë.:4bî¿û9K>Fpà-"A­à£  bƒQPÚ4v«Ó^ܦA<ñÜk—þ<øä+C6ïwaa,d%{ƒro1ÿüó‹Í6Ûl¸3Ù@üˆ#ŽHuõ¼«|½3Uݪe@¶L$£KLQ|Ê€»ì±i;äÄ3/¸jªŸ+qI2A“4Å¿þõ¯Êƒp"+gåxÍ{’«jÓZO)‘ÙÃk®¹Æ)q€ZTço;,‚RvmÐ rn¹ûñvè6ÖÀJx‹:}ä‘GÖ^{mõvÚiØ0˲ÌPRVöÞ^eƒNPJ …p– JIƒØqÇùu…•×xþµOÚüÜr÷ ÿä"ÂŽ Ÿ‡J ãÔSOp å~VZi%F9°KÉØ»íaWyç ¨ëWdýQm\2ÃTP ˆ#scEmÚ!§ïµßáê5ßpà ы)rõâ<Èò«ƒ!À¼ëÒ™h%²F5wJìŒ 諤‹ d"ˆGcž.ehÝ>—>ôä«ënØ?—M‚#iŽÌf{vömÖ€N¶Ç[Ä(q{j`e/íU6è¥Mƒ`\®½¸¦AHjÂáÃOyáõO*ùœ}áU3ÌÔ¿ž>."b׬ $¯œ©öaÆYAÄ,RM¢îàq•h:+qópÀjŠŸ}ö^z饴þ$š¼#¤’‡Ÿzuè6ý`±¼ÁØSdA+åA¼æ¸3¹™òÂRË®(f†ˆiwu–«)Z¯ùZk­ R&ËkÎÚ™âðc€"0P(‘ÙC§Äjcuß¶ Æ%¤Ýz°=ÄÙ^]-RáTî_$ˆ•ï½÷Þ€N¹îM¢ÆI‰·ˆeÙ,*)+ÿûßCÈucUkýƒKPÒó1І<餓ÔòlÄìsÌýÒ›ŸVþyúå÷¶Üv´‹Û²‚MÉBÓÌ$Î<óÌr‡óÌ3Ï=÷ÜÃJFlÞó®òZ­¼•£ÃÔiqìPL‘¥Î¸[Í ;碫+·C*¼øÊ›f˜iV¹y ç L‘xsîPy $‰’ð l2•y•²ßRK%’:)V‡×œ§Ä–Í:Ø AÀÚ­8¬LŽñûX—RçÞôA˜ ¼I è7ÁrË-'6<ñÄã-†ù·÷¢\‚’”´;”4±<㘾qr_(°Û_xùÍ‘5}îôÅ¥‹ˆ€!ñPŠ ä`%¶N8ÁºÊe÷Þv•6ÄǬ¦Hf˜š"›ÃZ¬É¥Ú#=ÍzÍÙ40EÞ‹T„“²²÷̃MJd‚‰&šH¬¯¹Sâ`0΂Ϙ VAió"V\eÍúèôÑg^ßt‹þÅ1è» aÒ íÙIØPoyâŒÏ¥ÚÑK{• .AiwŽÇA­½xqãxkd­ŸK®ºyFã"ºóÎ;­ DS2ù¾Ã;¨‹ˆ=xÔÝETeš\ {³‚Œ@5Å~ø;—Ì0æ¦k5B*vÄû[m·‹˜•x"ƒ± ¦Èþ=ÖkŽbФ{Í›lcïÍ)± P^¬±°î„Ò©äEˆ d1Hî™"É‹`ü\7Þyÿ“‹,¶”Ü +ö³%^’N YVoÑ[l!Iäã&‡èq¯²Á%(í9Ì8«åIý::Á„½î´±Z±rÈ!8ÆÅCÉAL'+È,¿üòbjì¤rùå—3EÅF>©."Ò)|ÏÆÆ²ž½1Ë€ã7CU1E¶9¶ xÐáÇuÆxü¥¥—ëg4+‰¡Tg¹šâ‰'ž¨4ʃY^sä&³ö¢-ùMhJ„!C§ÄAnÃÉ `”$VƒŒæEàDì žwɵSÿ¹o‡3ŽÅ_oQ@§,\À®âê-:è ƒ°áÛn»|ð¤¬X{• "AiÓ h6âÆ¤×4$߯·Ñf*(_}糺?Ï¿úÁÖÛv¸ÆÚ‹óJp #§™f15\åÜ3."JÚxP5D£Á‘>È)¦áoöRAI» ² ª X·Jý—]}ËŒ3÷3Qk„óÚ± vÈÔ’åA†Ú_~ù%œ6•f°v#;?úøÓ•É4'Œ20Eî6ɃgœqF*º×¼É†=Ð)‘T0§Ä&Xî-fh!~"ÖQáêäEà#„N%/ÂÊNÐéÏ¿¹ÙÐþoŠxÝWÝ:Þ¢É&›L:qV#&ž¨úTo? ÷ "AIÒ€j/™öâ’ ò+‰`äb[AùÚ»Ÿ¿Þ©Ïå×Ü:“q±  ”X rë­·VW93§_}õ®Ö,‘ïÙØF‹½¢vHf (¦ˆ§\Pò`¶ßeO+(_{§svøâkn³}¨8<¸Ûn»á4 LñŠ+®ÐB Gf²ž½(²¼æê5œc±7Ê÷%â5wJì ã,øA°vëA^Ä ·?he'»õ{zzÑÅ—ÎG;¤¸ŠàFVG—tt$j’)r}™ô£‚‘§óÅ‹ L¦A¨åIÄî»ïNã‘Á*¡ |ïó×;ø~ÂéNÔŸE‹‹ˆ0JñPbvÈ_VmÕíA§Ÿ~zå‡C qKu±(ŒlåçGCH2 ˜" ˜q‡8)eƒœëo{0EPvÐ~êå•W[K[|ê,WS´¡gßrË-“Ct¾ÙvÛm›³WÙ ”Aýœ JIƒ8ùä“ivÜÕ‹§Lyãªyóƒ/ßêÆçªën›i–þ,Ú\É+(Ñ”XÛf›õïUOÿÍÞMôåôèY®r~Ð$2 oÞ2 ÞýÄE`a¨Òj§œuIŽ ìŠŽxó£ívd¦ðš“"Œm0E&˜Ôk®<ˆ×¼ù<8 ªÄÍ*J„ðKIóOI‹ ÄÛÂÍk^ÄS/½—#(»B§÷?òìbKôV²„Ëõ×_Ð)®®=÷ÜS½EÌR~úé§ÄÙ°ž¤Sú}bÞšÐ^ƒBPÚ4<‘LÛI/¤A°s|¾ |ûƒ/ßþ°;Ÿ#Ž9qìqúV #‡¼æÅCÉqØíAgŸ}vÖ¾bÑzýâ*oÂËÐ{° ¸ñÆ« ´™a4ñ“/¾—/(»e‡?3bñŸxA|å•Wª³\L‘‘4óø–GŽIªx*RŒe2:»_"@`0P"³ /¼°ô¾`sæ”ØK/B|î¹çªŸHò"È&¤é—ZfÅþn=CÉ”7Je·èô’+®ÿÓdý!’+¬°x2ߨ1÷¨Æ³Ï>&ÚØ¡¤¬œa†è÷»ÛăBP’l¯è“¤¢½¸¦Aüîw¿£À×ÝÙRP¾óáWï|ÔÏó#Þºõöâ"ÂU~Ê)§XAI·ÍÁö ºæ9."Iήòî¾¹:S–`@5EaÀ}öÙ‡ /ºä ¯ÚRPv˹î%WÞ0Í´ý+÷ƒ$$¦Èʽºæ¹ò "f`˜wÆ*ºr•ÁC‰—^z©õš;%vÅÞê¸h¬\Jì,—3yÇ”]¤Ó½÷;xŒQ)Þ °÷ØcR: ¼E>ø }ý¾ûî›ê-b'ÉpïÊ1(¥Ý9÷‰Zž¤A\}õÕ´%ä¼ðú'Eå»}ÕÅÏ]÷?¶ÀB‹ˆ.ai_F$â¡AÉäk]Däáò%‰Þ©."¢ˆx-»byƒð¢D#¨ $3 ;S|æ™g„Éz¡À‡[PPvѹ´ò .Ufg˜£ L1àA°è¬ÄÝn·ÝvjŠ²Ãµ˜¢2 Q•¸àò›Ê Ê&˜â[ï}ºµáAÌ,ŸY˜—-wyIñYv—K4è=Å)QlJÜy畱@qJ(Vmƒ€™ÖnQÅ#H^ÄøLô³n½È”7Ýú'_7K¹‡û|bÁ…ú b¦™¤S8V‡F,ÿÂj!o½õù¸É™Ù³±noQ J›ÁE{qMƒ éèÿºßa¥åG#¿mÂçÑßrø1’,K•0f`M䦘{7]{íµ˜¹ÆMp•"+}Ÿª)2Aâ¿kìqž{í“’‚rä7M°CîáÑ'_¨»`^º­›|¢S¢eÅÀkNJ¸Sb“­Wî-fñ2”äEÈ9â¿\mÍõK ʆp)Ýú—ŒÎ—ÀшÅÝ:sAIoÑ-·Ü’ºWÝP­{•õ¸ ¤Tª“¡½xqËÝ·%(?ûö£n°<<¦/½úîÆ›•G¶K É2rØ Êp¡­¿üòK²tÝET“°k‡Œ0 ˜"KïJf˜0àò+­Ñ– ì¶ö½#¿el)žñ•“MÞ¿Ä3ݬåa¿_}õÕm¶ÙF]DGq“ÄB¹×¼>;¤f§ÄÀù/Ã9VÌ7ƒSb­Ø~åA°vëìdHåº=ÄðÏnKP6€N¥[ïË—Øc]ZH–Ô̘Eµu;û©¦šêÖ[o…N™+Oõ±™8¢¼ý†HÖÐË‚ò;Ç“¡–'igžy& 2ÕÔÓ>÷êÇíÊ?ûö“Ï»öùøó>9+–ÇD<Óñ7ß~ÿœsõï¿<÷Üs³´P’C­«œ)\åo¿ýöj«­Ö-WyÆÝœ:™kP` uÅÅIÆ”h˜cN<»MA‰1tÓ Ä_ç“]áÁQ[Ò“7Vœ³¼æõñ`sL¥Ö;qJij(ñØcÕÙC†:N‰µšb;•ÃJ§äEh·.äh^ÄãϿӎ ìn·Ýú“Ͻ²Ü +˃ӉÈÒBÁÁ—ºê* R²%fÌteª·ˆ(¬Ê—ÔèeAI:½š‰`·Ýv›XŽqÌßø*«ô¥³l±õNUÊï>ù¼;Ÿ¤ d=-A8õ¬ dsŽõ×__6×±ßlºé¦R€%Ž?þøü”Xp?)+ëv•·Ã/Í?×2àºë®«‚R¥‰#p|u=ÿN‚²;vˆýCÁê¡”± vÈæ:«¬¾–XK ±ÍC`‡ü—/-Š­fñ ÞÜΘ7ß®bïÐ)±%%^s§ÄX«»|2X¥Í‹˜{¾…Ân=&†%(»Æ¥IAɪFÐéÕ×ßöçiú7•`i!r:“tJ@°îU†·ˆìÁCâNª·è裮°ÉzYPÚ4ˆ™gžY{qIƒÀI)iç_vc%‚òÓ/¾ëü§¯O eDP²û/ë>ôXv–4¾ûï¿»ScAJ%ÚyWy…6Ý´ªD¸«) øì«W"(;o‡\1KPb‡lnv%[ÒÏ<«˜ö†ÕáA”årË-—ʃ0oš!µ?N‰E(‘NÚÎ^wÝuN‰íÛ^U5$ƒ€EP¢™¸D’±ç¾‡U"(»Â¥£è4ôPŠ :=à£dæ7C ‚Þ",™Ü‰$2ENÔG% Ô˂ҦAµª½¸MƒøÍcöõâLy÷©É‘_~ßÉO/ž-(±<ö*½÷¡g]¼úÉ&›Œ>Ù‡Þ^x!?‰©á*—ÝŸܤºÊqUî*¯Äš›Y‰eÀ_ÿú×,W+¦d†í¼ûþ ÊNÚ!×j)(±Ã7Þÿbÿƒ{ìqÄÌÈI”{ðõšŸqÆÿûßs¼æUñ`3-§ò»rJ,N‰ð¤.Ë%òë”X¹A–¨0,‚’$TjÓí!n¾ëñªåÈ/:Ú­å™Ê”ÐéÓ/¾µáÆ}{²pªÁBîÉnÝz‹XZä¾ûîƒN‰V·¡€ª/Ùy¨ý…¨{VP;Ç_qÅÒ‹kº¾O<­´zµ‚ò³/¿ÿì«N|F÷â­åï}ñú»ŸŸyîe“þir±ÆßŒç’öÇ*Vê*ßk¯½Ør€ 2w:à*/Á,åÝŸÉ SA©™a¿ùÍoøé¦»¯VPvÆ1øâ‚òõ÷>ò…77Ò—$<8|øðTœk®¹¤ <-þãÿ8ᄲxP6)ð#§Dñîôm S¢nÁÐzذa$Ø:%vñE ‚€iõÉ9’1åÔÓ>ûJÂOTjÊ»ÏOôÅ÷ëÖûè´˜ ¾å®Gþ2çÜB•$–Ýpà I:Å£A¬‘”Y}õÕe\·ÛÎ#os¯²ž”D(R¬œ¬½¸¤A0ÕÈ$8=úäÊåç_ý­þéÅ‹ Ê×ÞùüÕw>Û}¯ÕU¾ãŽ;²fáhöÀm¶Þzë tV^pÁôå×_}Ý®ò.’TÝ—¶2TS”Ì0|Ã@=ɤ“=óÊÇÕ ÊÏ¿ú¾~;ü[¬ |íÝ>;¼ù·çaåA ,°Cþ›Êƒ2Lu˜×m®ß)1”)¯9['+%2°qJì°éêå‚ `r™EP’ãLò"V^¹/meó­wª\Pv€KaìXA)tzâ©ç±äœ˜(Ý7x@§tô»ï¾ûcŒAT£x‹íð€à ß/½WYÏ J›*×^\Âùá@$þàþÇGÔ!(¿øúoµ~°¼X¥°ç+oöÀc/®±öbC¸ˆè¶“}ùí·ßn]D<ð±)Gy¤»ˆb™Ô2 €Ã€bŠ’ƱÖZ} +mºu‚²V#¤rH¶œ ÄG¼5òøSÏ`ÂÑCç"<øí·ß²‘{ÍcíòN‰©‚² %2]¸à‚ mkî”XÂÛ?%Ön=È‹8ã¼+ë”õÓiIA‰ ?;âý­¶íßæáˆç"Ù­Þ"|tëLÞÚH—9Wl“õ¦ $ÂÏÿ‘¡–gÓ f}®g^ù¨&Aùå7?Ôó铪íJ:ò—ÞyÑ7Í0S’Ú™ê"Òu4ˆ›$<…ðS¢Q“cšö]屆;PÊ3ƒ pÍ4ÓLØ¡˜"g<‚f†~Þ•5 Ê/¿ù[=vøCû‚òå·F>ýò{[nÛ¿a <È0:ÕkΘP`„ûnƒ™Ü!–AùÕ7UÛá·}ƒ¥JåKo~Š)Þóðó /º¤¼³ð ò_RÄ1ÈT\a…Ú0o¾u¿C§Ä–‚²8%ÚÙCÙvJ,n‡í”LK·Î“²AŽÄÃ,·Òêµ ÊŠûôQ"¡*AùÒ}tzö…WMòS¾©6à“¤S&µ­·èýQ‡ŽÛí@=j¯²Þ”6 b‘EÑ^œµ»1;€“4ˆï|¬nAùõ·?V÷ùeP­ d—¿Ÿ|uÈfý–à":äC’Ƈ'ÏѺˆxqUè*o‡h{nÀ€ŒÅyà Ãâ¶Åݻ܊«×-(¿þö‡êìðGÀmMyã¡AùÂ런ñ™ç_Å.bfL/çÁÍ6Û̽æùoSbAAYœm¬9¯¶SbÝ÷’¦›¡«z\BŒ‚R½E8’¤?"^<Ž$$¢&/jp J»s<i/®i¬"j§{Eåß¿û[ùOG^¿ |êå~æ­­wØqáÂD±çöÀ7)»~Ó£«mñb®r¢f(uòBÚ·‘y5Ea@˜öŽ Êöìðï” ñÔË^tÕí–¯½öÚÀùïe—]&ka`~bÀŽá<8Pl¦¦ûtJ,-( R"$É–ªØ!c§Ä:Ìøª«®ÒÁ9yDŸ‹ŸH7ÈYtÑE)°ÓnûuPP–ïÓááo¿E§õ ʧF|ôäËtäI¿«i!l•Nñâþ3=kŠâ{ƒ1BFÞ7ß|3ÙßHOë2gœSG7€êtJlGP¤Ä-·ÜS¤ÇQJduU(ñßÿýßÛY‚ `íÖY¦›ÊùWò"®¿ãQ”B§ê¡AùÄKÞõÈËl¼•x‹‡#ƒný¨£Žâ'YõF¥dž¯¹æš &˜@mX|ðYG¯MyigŸ}¶X[3IÄÎ;ï 4‹/µ=V‡å÷?üão‘ŸïèuÒC)ìùø‹<öÂûg^pÝSõ»ÁÑ”¼´zŒ=öØÀÈÎxVPî¶ÛnjvôñùÁíSLÃk° 8ï¼ób‡bŠ’ÆðFðÊï밠Ĩâíð£‡ÔõOy[Aùø <ðäëÿăÌ9X;$„ ÙüŽ;î°‚r’I&QSäžr§Ä÷>þº}AÙ’eëZâ|¬ tJ¬Š¥ƒ `”²AÎùçŸøÄkÑuXP–êÖ vÊC‰ eÃ\zÝ=sÎÓ¿¢*Ühét¹å–Ffº­ <í´Ó¬‡2[²^”É4±<CÆì4 bŸƒŽéŽ üñ+þùáÝ”>ÿþ#Ͻ‡7{ºôÒKÕòðñ͸ãŽK/nå ÷ï}¯‡1˜Ë€¬3¢‚R2ÃXG°;‚²¸þˆvSP2¶yäù÷·Û¥o:†Ë€²Â9´h%ƒË€ƒ<)Ç)±BA™E‰â)gßZ¸Ñ J§ÄJº€d°të’A~½ŒÞ×Zo“îÊ.EüŒN;.(ûløù÷ç˜gaN¥Sb%|unå[ôïÎO¬ë’ß ½&(í|?k/.i¬³(s²÷<:¢[‚ò‡¿ÿ³ÐçÇâF꺠¼äÚ»Å=ÎÆÓzl¿ýö|ɬw (ÿû¿ÿ[;r6à©„Jh%ˆ«i˜„Sd+yy"Ë€]”?üXÌÿþÏ;î¡A¹è’}10 Ú᫯¾*¹Þ,J`eP+~ÛN‰Õ ÊTJ”(Uï¼óN+(‹jNÉd°J€³¢K^Ä©ç\Ñ-AY¨O§ë§[o€ ¼ï‰7ÄO†J§—\r ßL<ñÄØ°”º´ ¿ægäÐ=%(SÓ Äò$ âðÃ"ý Ïꢠüñïÿlùé³¼ÊíG¹…ð„[A)vÌ1ÇXA))&zHÖí =¼ÿþûEP xÜ©À€Ý”-eC¥0 ¡¨jŠçž{nßë<Ýt|i¥eÀA¾|•SâûŸ|]­ L¥DY¢$CY-mrø†I1VPÊbLrx„MxçUAù駟€ØdŸ‰þò—=ýfwe ;üGS¥0à„NhpuÖáKÍVP’ å™aÚ‘;%V.(“”H<•xÊÉM´‚r­µÖrJl_SAÀÌ}I·N^„l³ÓN;3Y¤„ vWPêÖà¡\cÝM@lÈ!–NÑ—|yê©§ZA¹çž{ª ³'Y˼ˆž”x#ôáÿò—¿h/®i¿ûÝï(pá•·5APþãŸÿ“úÁ("(ïxè%É{î¹çÀPvĆ–VPN:é¤ þ OƒÀ;«PðÇ)§œ"¦H$d†±Ø>ß/°ðä?u]PæÙac%I9€j‡ü¾äKﬠ´ è™aN‰Õ ÊTJ<î¸ã°ÃYgJ´‚Ò)±}5I (H¥S¶‡Ðn…oøU7ÈÙûÀ£› ([wë ”œ¤/Œ9n¥SñqLÀ†”l4¨àÉ‹è)AiwdÔ¢–'iZ ‰`¬EÒAùÏþÏ?ÿç_ÁslŽ <àðÅÝh{qIƒ ËÄ JûÎóë Oƒ°hüö·¿ÅÅ53Lü—£°‚2i‡gŸ6FP&P|o šï¹ç+(c°’>¯±•8%V+(S)qÕUWÅ·Þzk+(«z)‚ `íÖuƒ™‘`Mœ†ÊÝz·å5·< \äE¼òÊ+Ú³ïµ×^| ÔЩ”±AÀ½#(ƒ4ËcG`±ìM6ésó®¼úzÍ”ÿó?ÿ² ±Q‚r™ú›dJñ­Ÿ6w‘ɲL¬ ”49Z&‚UE4­Ç2à’K.©‚R2ØÁd±ÏæÊЛ$(¯½µ1<ÌOM³äKÖ› %‹¨)zf˜BÁN‰oøeìN9º4¯,”¤D RÖPcÝ+(+áç ˜EUPJ^ıÇ øäEÐ@Í”yÝz·åöÃö±e—]V¹”?ÄÇqÀXAi7Oç×"y½#(15eÏÉ'Ÿ\{qMƒàK {Ê”ì›)&Ø4A) 뤖wñÅóÍSLqß}÷YA©Úò«§Aà6SSd¡D5EaÀáÇbÀ™G1`S<”˜ßÏL±I‚r×½±Å[,É€D÷ZAy 'X U„+éöšY‰SâŸ~S­‡2I‰²YÆB‰:åí”XÉK‘ AùôÓOS?DK/½4øo2tÇf JíÖÿ•èÖ»-(g•AèšÒ)» ‰ŸˆÅÌ­ \{íµ•N æEôŽ ´;Ço¸á†Ú‹i>ùfÓ%/Æ¿þÅbZÍ”g^xÆD˜5=È/áKÒÁ¬ dOƒPödúU_B`!ÌTLñÉ'Ÿü9îÐùDò".¸â¶Æ J¸”52&(xòMÉ‹`;¥SñòŒ [AY"¸G%;Ç[ÏI/¤AÐ3±ñFÓ%j²‚r“¡;)c+(% ‚ r¬ <ðÀ|Oƒ©X9fši&€Sd82¼¤sj  eŠ£œå”Œ“ (ëÍ3Ï<k%;)+øƒ<3Ì)ñÑßT+(S)ñÏþ3&ÇêñVP:%V%(mðŽ;î¨~¢¯¿þšK°Ýà7ÁDlÓ8A)ÝzÃåáÇž)“íÖWYe¾Üf›m¬ ”EÙô(˜Ñ#‚ÒF@³s¼öâš1ß|ó sgM”\ÿ§aJÙtñä“O~㧃ü/¾a>—¢”2é ÇK,Q• Ðz,§¯¦øå—_òDÄž‚gÄc5MPþÌ#(Å€tÛj‡üA_’Ðm¥ÄcèÁ`r€šP%·í”X¹ LRâ½÷Þ‹½1Šf^ J§ÄJl˜]þì-AÀ²=kI^ÄJ«­Û@A©tF²uuÊ{™V1Üê–N%øÂ /´‚}©àÏ‹èAIl¾>jy’› h_öõâMšòî[9è矆dy³¢ ˆÍ?ÿüv#‰`¼äVP ¶zàH¯„Jh%–Ùà ;Sdž'å4Óôù}~F³e›3åÍ:_ ë©)2’Äiå\sÍ¥vÈΖÔ„*¹m§Ä>û¶ZA™J‰0$&·ß~ûYAé”X‰ SI¬Ýºlßx˜ûŸx£Y‚2¿[ïž dnÃi»u ^wÝu­ $·\^D/Ê ‚¼0±<ötÁìH[i¥•€lã¡;4JP¶^µ{[/²æ6ˆ1þ~ý§ƒ I#ËÄ J Q{q6ȪŠJh=– ?UA)™a=ö˜aÀMyg.°ßíu(•ÕùCâô7Þxc+(yë-’{;@M¨’ÛvJ¬\P&)‘…µu 5+(+±ád°tëèÙ Ï<@^ģϿß(AÙb¿’î Jö±•W^ÙÒ©³AŽ”Ö3•Ñ ‚r×]wUM#ibyšÁòú8ã‚ëš$(Ù}1óÓÝrØPÒ HwPË“Ånæw^fo­ œzê©|OƒàÝS4@LL‘U6Èù‰Å€ ”¹vØmA™Ê€²EØ9çœcå!‡ô--$GVÒù5­§Äje*%J”êôÓOo)‘)o§ÄJ^‡d°të/¼ðõ³AŽäE Ûë& ÊÝz÷%«u‚tíÖéâ…0‰¶‚R‚Ôå(²A޶x/J›Ú)iby6 ‚ã‘^¼ SÞÿgË仸—÷©çôïÿš9Öô½½Ã†Yö$JZÍŽ?yÄE]¤hÆ+*¦ÈÆ•¼oD_n¿Ë>Í”­íðïÿü[À€ßýøÕ·?|ùÍ_|ý·Ï¿úÛg_~?òËï?ýâ»O>ÿîãϾýhä·~::»ö¾½šôû_¼þÞ篽ûù«ï|öÊÛŸxkäËo|éÍO_|ãÓ^ÿäù×>yîÕŸ}õãg^ùèé=õò‡lg5Ëì}³ØÇsŒZ"Kýñ !.k¥e@Ï sJ¬VP¦R¢lÕÍæ–e?6=9%¶£,“AÀÒ­Ëâ²H"™‘¸ú–‡›#([Óé :ýÖÒé÷}túÅw£èôÛІ?þêgtúÞ¯¿ûs:}säKoŒ¦ÓQ\úq—Žøˆ ~o½¯o©5|ê(r¥S¢5ør©¥–†­ $]m8j{ˆ/(ƒãÏ?ÿ|éÅ5 ‚©1 YtÉå›"(ü'b±Èço]šò^k½¾Ä&­ ”4ˆ«¯¾Ú²§¤éÈáiÄí)ìu®‚òý÷߇uƒœK®½»!‚²ˆö lº$(ïyt„0 Kxª)Ê6è+®¸";`YAipg†9%~œìŒ?JëŒß=¶yéÍ‘£6Ÿ>ÿú'ϽöÉèÎøå¾Î8•e 5z§Äv„cÖ¹6/‚¹/õytë”Åúô:í” Üç c0׿üå/¶[±mVP2ýmEQy^PÚÝèT´ùå—Å1®¸ùž§ºì¡üáÈÄâŸïøûwûû·ßÿøÍw?~ýí_}ƒgèo£Ç§‚gåÍ÷¿x SüðKâi~fŠ#¿!æ†É>5EÜØ£ìðo8¶qo²ÃKaç=”€7ß|³Úá‰'žÈ7³Í6Ûã?n%"²4VÒ6¡’XJ$”Ê)QÃys¦¼S)QLƒ´‚Ò)±ÍøÈ`dÈ„GÛn>HÍoÑšk®)ï>+,täIÄ'ôwë¯$ºuK§Ò­túñWïÑ­òuØ­QS·>j§#‚òÔsû›d+EÛ­ t;ì°ƒ”²7½±AÀOPâ ²»Ûš'¥.$›~Ž1âïÿ»Øß%—\¢ÍYâöží˜ DS¶ñéÜ”÷¬£Ò È™UË“Ù$#¶e¥ì×$ÇàLƒÀÒlöƒ5E¡d{@û‘Ý,Ê®èƒû<¼c‚² #ìè”÷i£inPÖÿ‚­ ¼á†ÚaÀ6»À&œÞ%²yS"îƒA™¤Dº¡D„Ž”N‰í¼Œ´ƒ‘¹¾×¬.rÍ5×HRŽtëÏ>ûì·ß~+—ã¿ 2¥0‰Ì—\}{_·ÞAYvDP®µ~ßai–NaW¾$—Ô J»@D‰¼ˆ&( ··Ñ÷jpØÓ!Cä¿¿ýíoí¦ŸXîÜwß}W¯úî»ïˆoÓg›o½ÓcÏ¿S·‡’HûŸÄPÞûèY0ˆ[-oß}÷åÁ˜p´‚r0§A§Ìb VÇÈß„  u^Ôí°C2¾eZúì³Ï.'N?ã,ç]zcÝÊö°c1”nÚ7¥0 lF"­”m2`;]`ÎuJ¬5¬<•e*ü»P¢”ƒ™Ûy²Fæ,F´•¨L"46ÜpCVeAÉÁ̹Þê-"úw¿ûÐéªk®ÿÀ㯄ÝzÕÊjè´#‚’YY`9ï¼ó´[G ó AÀ¤:¡‘#GŠÝ¿óÎ;Ë,³Œ”$àzø‰g×7åͬw5Ÿú“r9²oÛTn]=ÄÂŽ<òH+(%MG¨D°v¨§ëçâ BÁØõ&V2çÍS<ðÀ•×Ygæm­)òV+H0ÖXcI%«­¹þ]=_Ó”w5FØ©¤e@µC¦€ˆÌ0Ð JêÛaÀ®[T騜ué%§DÍòN¥DÙª›ð2+(-%–6`NLÓ[Fæ{íµ—p)ï»õ:i¹Êe õm¹å–ýÁÁcŒ¹Ëûÿ¬[¯TPVF§õ ÊîìÛPHqë*nµÕV|I°”ìZÒæö@PæxƒX‘¾ùퟸpÕEDV<þ Ô$!‚)¿ùæyîÌ0à ÒÍ3ßB×ßú@å1”„QVù©9Ë{¹ûvŽÇÔÔì0AIƒ ÷²‚RÒtä`Ú·N@çfyƒ!gØ!1jC‡ˆðšï¼óÎ2ªS$ð½÷ÞSħ®<8lÏý+¡¬ÒG™t­ëPÞ8Š1¼$2h¶‚’WØf†ñî s*}«õQ"¯¹S¢]6(•e µ[n¹Å ÊÁI‰¥m8'NùÈLN@§·ß~»¬qÃÁ¶²³‹vëäK|þùçr3$hÉ©¦žöì ¯êïÖ«”µÑi-ëPî´{^„õ‰{ŽÍ Ê#Ž8B»õry”ìH›å Â냗"°9û_ë"b/,’›DP2ýÍÁRLê"Dum²ù¶>óZUI9tº5|j\6HvŽ',—E—ä8þøãù†D°§Ÿ~Ú J2ïÔòh£Ò´2PNÄrrä9vH”Õb‹-&Xá5g^FI;RõšÃƒê_ŸäO“Ÿ}áÕU%åÔ`„õ Ê=ö9¸YdµCþÌ0¶y°‚’YË€ôRÅ¢ÊݧSbš1w”Ï=÷\LnŠ)¦JÔ)ïÁF‰å XÎBǤ†K²u-CÄ:e,æ(ä•ÇO̺¶[ÇßIH›\âÊ+¯œd’I¤äRË®xߣ/¼\‘ ¬“Nk”LˆªÒ)a|ƒdä+(W[m5¥ÓryÍ”8RÃ%yoY^;Çæô'\Dê*'º‚EáUPâ²®r:uYÿœc¬±Ç9øˆãÚÏò&Á¶¾OëPž{I_rº¶gi¾Äf%Cs5;þÀ«Ñ¹4ü\íž úàøÏHK:ÈS-cVD'±î—5E U½æ¨yrñä* /¶Ô½Ø¿Ú@Ù,ïúŒ°¾ræžw¡€™‹äµµ‚Ò2 ½QÃm©ÍÛë$%~öÙgº“S¢¥DY¥o›m¶±‚rPQb;fœ§X,Ò­3ðV7³[l±¡nâ'¢[ç`–üŸÿü'7ÉèkÏ=÷Ô|‰vùë³#ÞÿÙâ-ñYÞ5Óiõ‚ò‘gß–¼´£š±lÕM06leûAÀM”ôµv*í ÉÇaFø£x¹9ì7É¿­«|Úi§%dM-“gžyF½̯ɲÉ3Î4ë¥WßÒβAu[Þèýî*ZØ|ó­vâÁOŒóôD0Â׬ ”ÝJä` Ù¿4ù\øˆ0©ÔpÉå–[ç„Û|@ª ÿæ˜"NqjÓÀJ†:8/­)ƒê5ÿë_ÿª<¸õv»<ÿ꬙WnÙ ší°ú­}îm‰² ©SíPÖ1F‹óÂZA9Þxã©)²~S“Í©{ë%2ó¨Tì”(Ö(”H~ƒ”ƒ„Û±áœ8 "2QɓŀXï<Ú:eŽ›]ä݇=ôPË¥óG}$wKd‘;'˜pâÓϹtt·>åÑ'ôí8O‹íÖI±åK¢Q­ ´[ók¹¼ˆf Êo[¦Z›ûøãµ÷åþ›/+­«œ‰EÖf(ƒ äÀçrWWù…^(”Á±æ:>ôäËñëP²eíŸÊå”SOË##ÙÕòdI*F-Hm+(é×µ/‘Ö+uìÜ,oÐÌ3ÏŒƒ\ ¶úꫯþõ¯qcüËß|“σÖkΞW2ªSD*ñ H`%‘æë­·žà žtÚy%eì°ò½¼>± ̵ (™7 ¬­ ¼øâ‹ÕK3`Ç,ªÜ…š@‰¼ N‰b²FÃB¥D™ò ”X΀9+'‘‘Ð5;2ÇÚÆË…ð22s˜ß­Óê‚™Qù¶[g8!KmŒÞ5&a¾¾å®Gâס¬½O‡®+ßË{¹•úò"ÈUR:¥+o¾6+(ñõ*–Þ¢)‚3¢·(è ’½ì‚EH\ÜED„¬#pHD¦ˆTn† q“Œ1Ƙ{îs`ÔÂæØD>Õ Ê;xއå‘ù½øÓö©ê5×´‚’7S×åæ×ÞKƒöiÐw,ÕA.s+ö(ƒ×Ô± ¦Úê5ÇKgyð¶»-¾°yŒP.1Ú?û–uþY˜5ÿYùŸõÿY}5ØY‰Ûæ%‚ÄÙ)@W“&X™}Fí¡ü ù˜,óAv-K~ªÒ"ò2ÞvÛmVPZì½Ì°¦Q"N‰ø5°CÖCµ‚J„™aõeÖÈ|Î9ç$‘ÑŽÌu=5[ó?þˆÊÌ—•¦ë\-3l„ÇØn¨$©¬­‚Mɯê"ârºÏŸ&›ü¢Ë¯o½SÎßìàg”Ù}Çæ(l‘òáÈѽ8¨ü¬#/°qí~‡ v‚*ÔìøCò=O9å+(e·9ôRDê> Â>è"ÕœðˆÃt9”ʯ”ɱC~²È)QŽ%Ó Ê¦Ä‚ª1µXNœÆ 'œ`¹‘¸5™–É:XÜ€¢:ÅýÆ~âÂßî·\Š”seðO‡¥ùøc=α'ž1zã±lAÙÉn}du‚òÒkúBÏé;l·._[AÉX]»uþ(ÑeA‰ïPzû$ò7Þ ¢¦¬$žô¥ÚÅ(œß—3å­®òYf™å‚ .@Mr`y,-¤{64Ë«Ê]-¾ÄÒO<óJÎÖ‹t«þT%(ZdI¥¿Mré,’‘yX+(m†JϤAˆ7(5ñpñŇ՜à5Žhɶ”ÌçAæÕsxÙÊÒBÖš‹×ÜvÛmûߎqÆ=â˜ó·^ì°V%(/½¶ŸÕùcõÕûfm˜4°‚/o% ز;\À)±MÓ­™Ú-XAÙ“”ØŽÙçÇiM®tJ¸¤†®å_ÅI§Œ—'§gÇ1©k©â¢:öØc-—2e/W¡‹_pÁ…@fše¶›n¿¯N3e›YîôJ<”ìÛ²‡¥S _!´Ï J¢ö•NÛɋ蚠,î €ŒÐmë :1¹ùš2p­¼òʲ®ŠƒÎ^]ål kýò—¿Ú~§]_ç“ä^ÞYW>í{(Ù+HˆòÖ[oUËcÝ%¾aUsÞ=+(­/¹7Ò zƒ0¨Î*hR |ã7òM1ðšãÿб vB»Iœy–Ù®¹áöÑÛÊ›½¼»b‡}yÛÊ-Z1 z(8à€J0ª5k-ì”X•ÝÖD‰Lg%)O˜.àÀ¯½A‰¥í㜠Ó]äéJ»øisÊûŒóû’oXµËŽc$ ‚}­ ”ýšô(—Å µÎÙ§‡eÒZ˜†Æ y,ȃc HLOSdÊ[½æðàW\aM‘[Õ#¶sT\wý!O‘Ž)Š ìö§ÍÊÙþÒ·d=·š"82kc=”ºÓU› X«¯|€R"»á J”ÝVwß}wK‰×^{m/Qbq‹M–Ì™šJIdE^è”>%5z2Y?ƒy„R¡Ó£Ž:J—Ô ãf!jñI·NÏ%1K(`@pð˜cî³ÿ!|òuC»õHAyçƒýy<µÒ©[AÉ´XUy”Y»vN6Ùdl]¥†ÂD!NÿKGBLÆwæ™gÒËæ=¿R†’Ìb1;)¸ÊÉtVËÃ{ÄÕÕ?JýL‘ ƒ,¸Ð¢÷=ø=(y×?íÄP®³Á¦<+qB”rð˜ba¼‡–=ÅåÐi9û4€ÚE‡Yý› hÔ!cáÁœøQ~¢Å(,›â<àA 0_k­µYSdtþÃ?¢õ•÷=à”Ýÿ´‘”óà¯`W<”ìh%‹}ò%P‚²*l§­äÜ‚”ÈÈÖ)1ʼ«¥DLQLމ,K‰„îõ%¶cÌ9qÁÈÜÒ)l†ûPH’ÙüãY÷À/ ã)yÆg0ª/È¥8#%¯”ƒ…¨ X.E˜òB©·HVÒá˜fÚ鯸úÆ&vë‘‚rÿCûò"f›m6åRþà¿|I/c%ø« ·™Ñ9A™ã b=$k".I† hTÂæ°'¬ ¯OÒE„œïÅæ(i+Ĉé€Yƒ ßYƺÊoñž (90>¬SRl–@”§´ÁÖÛî0âõ÷ ¯®4µ66)GÒ Î:ë,µ<þæÁèÅ-{ª˜æWzúv8¨‹çæxƒÐj$ÐxÄË2é¬ßÃh؆ð`Òk-Šƒœ³ô‡1³ŒæV$mK³æ;í´“ŒªÕ­×œl±ÃÉ&ŸâŠknìºöÝ@Ù,ï²1ž”$Š)òÇÍ +N‰p—R"ƒíR"ýý` Df·{’K³q~œ†™C¡â„T-"òD,â Båw«­dË`ž!½åg‚Ô%°2ç@ è^eôhø8-—rEô†\”úql ±¬°â*ϼøZètt·)(—Xf„Å´[g .>šdÞ ÕEPªÃŒ_Y)£>êä¹9û4àˆ•¼+9²”_p·².•åAFƒü‘ã O}ê"^s˃0–iM‘+Š_Ÿ'e¹~åÁÓϾ°‹F(—..(…ÉØG“U ‰QS¤DE=ÔuҜڹVqJÌ Wo,%²…I/Q"n ì O9Ë/ˆ)hJldžóã4 ŽÌí HÇJòµÌü0\·âT ¼õÁƒàødº2ß[%/ì·ˆ=-áвô²ó¢BC¼Xh‘»ï¼»t%(×Ýp3ˆìÓI0ƒ¥SºuBª”KÛÏ‹¨EPæxƒPÇüŠG4qui ¤èßüÑÒæì…X‹’==ù7Æ­.¢…Zf±-¤."†Gh2q•1æ˜{ï0ÍßµOá…ÍzêU™ÅæÕÕçbΑod7=t¿&1>‚, 6Yw‹eyƒH£f…QÛÜÐðHÁC¼æZ^m[aÁa’–^ç˜"•k€9<¸çž{<¨æHä¹çî$pÀƒwÝÿX×ìW °‡rãÍ·Éb@üú°ô–qUl¯î+N‰vK÷"÷\-%â¡a°ä”P"¯ß,½ôÒ=@‰EŒ*µL~œÓƒj6D:ÚH³"WDZg´VÈOÅWÿoQ¾ 3´›o¾ù„$Ù1„àÀ[¤aÙü$ÁÁ¬¸å6Û³´Pé4e¿’Œr&ùÓäܳõ‚ñ7ߨð¬³Îª‚²ýí!*”è*]¨y´aÔ_¬ÏŽ( šùÎ;ïd¢ˆÚ"6Gâ*8D²Ì• «L©Eæ¿."q•ë¡kЩ³ž¥<øŸ&›â’+oÀºõ=Õ˜½SÎáÃû’0)û8ba„’Ø/O?ýtÛ ÍOƒ ™ I#ä¿8Èû&[?w~¦a`N¬IÉè"ËrˆùC±@-ƒ<%N(ßÑý6Àœ{¶mDX $©p…qÆéÛt‹cèÖÛ??âîÛaîÖ‹Ê€úDÊ€öùÛ2`ó3Ãb)»í.%b<R…”¸Ê*« tJ” ÄhJŒ¢£ 0#óÔ•þˆG$Â'°:h8¶8Ò cöx³¬ŽL†Ø…¨áç–6 jð “!£Ûö%²NT,ƒXñ¼Œ=θǟ|f·¸´  ¼õž'¸Uü‘V¨È$þ¦›njŸ`«Í‹¨RPfíÚ‰ßøºë®Km]ÌHæ ‹AÒ5ΔüJªÍYƒ@_lŽñ³3--¼«Ü6 ·¤."2 ¦vZáÐÅ—X†ÍuÞùð«ÎŠÊV^ƒ›$šDŸQ%Æ’"‡Æ”ðSÃÓ röi`Që ·í~ñÅgeÜ µIâ!ëAfYà N$æùÃ$H9ß°í…ðšçð $SÙ-éáÁ#Ù\§»v˜-(…1¼T´vX9¶jœ¶~/A‰8˜5Œ¬åظrJÄ-%æ¶µÃâ”!\JÄ&…qk PJlLjsâ4µ¦ ÓâY^„±""S)Œ‘dÑ)IHµÈBÔð3×¥Î"Ý:DÔèBÔìFx‹t•ŽÃæKÜtûý]¦Sñ¥y(‡íÙ—D¶E‚€úÖ†Ù±E}.íl£V ÌÚµ #úT=˜”|ô\åb.9BF•%€µb==è7ŒrÄ:ù7g„¤š€„òÑl…ù“él]å9."Òr5Yl»w}å­Pxþ°Ké›ïñF¶‡r¬±ûœXµ ,J, É;¬ÅdŠ~‰†Ö ›T¯¹(?I#wŠÑs©ÇZ5?ªRd°„Åjø9Ê‚¦ÈŠÏÀ˜'½æÜÉ"‹," Ç&cW_[‡°HRÎ^û÷íABHI’yŬ ØØÌ°v(‘!&fyÍ+§DÜ0˜4‹yÃríb=O‰ä½bœ,à7)±)™§S#a%ÞDþÕoŠ ö°.VD¸¤žNŸn»u\æ2àG$ ²J&0…u¡ßâ6LL᪫®*$I7-x‹ w ˆ"üFƒƒ×Yo£çF¼Ý5:Í”’±ß~ûéS€ßÈrÖŒ—[n9íÖ+É‹hWPæ{ƒ¬ÍšcwíÄ™\DZš“e¨¬Í‰GZ¢ˆô{ìë”^?9BRoPª&À%@~ƒU©FÉ ÞºˆX«Èª~úu•oµÕVÒ`¸ˆŽ;©oúrå…—÷ï½y±0âd_9DDŽ7ˆû·fC|†K’aƒé¯˜fØ^s«ü kÔ ‰á°*RÕ–”“^s« ðjÛ ±@ìPâŠrh‘Û°^sÄ–mJØÄòàä“÷EÕp,»üÊ==¢ v˜í¡œg¾…„õþ!n¾A13Þ³¦X9¶Ó㦞[%…¬ÏŒk¢D]9ÕŽj°§D19Öýp”XÚ¶s ]³#sD¡M”áo¾±¨Þ"+­òKŽÌ19øY2l,B2ö¦ÿev1x:õÖC¹PK›È´‡åùTR%„I÷*#®†ÈK§d š)$ϾÄýùcŒ9l÷½G¼ùQè4CP>õÒ{âP·²„•jø†ÅÛ­ ó·Ý¢’¼ˆò‚XñT‰¯88R½AIãFZ‘Au•Óݪ7ˆÆ€æ81H ÇbЬv„$n;Ÿž¯ l…<Õ»Iû \D,Ùˆö·ö‡˜–iwüÿ8üú]D3Ïzåu·!ò:ùÉòPÝfg™½m±0½ÉgÔƒ…u´‰˜ÁkŽ9æHÚaªƒò†Ù  ¬/Y‘Àd=4MGúò†l#Þ ÔÄCi統ʯx¤Ì³0’Ó‚,¿« ³M/“2-¹;‚T‚U‹«µZ|˜$ K©<Ȳ\ʃâ5·¦¨KÒà5X9ó¬—_skgŒ0Œ"%(W_{ƒ,äͲ¦ÈÆZ*(›“6Ð)«(8L´”¸úê«7Ÿ[ÒQNœ8 äÓqQ#s½cxú>=K#–^29©0‚R|d®7ð|j·Ek€ ór$EX.% —³Ô[Äâ!BMk­»áÃO¾Ü:}säKo|*yV„à3â‚€­ ówÛCDÊâÞ €¦Çb‰“–>!kâtÒøQ²Ü0ØtÔ Atdà *¨ RõnêM."F6^o™,Í…[E{ìqö;èHµ:ñù¹‡òÀÃŽÃȘŰ7)+nžzê©=d¿&9²ANAo4“lÏe<Öµ´5vØ2÷6¸V eÁ6­¶à0Iê,ƒ×üÈ#´M,Ӛƒ6À|ÑÅ—¾û¡§;a‡vŽf” œ`Â>.>çœsô>¹ga@k‡ü=ÅS¨)6!3¬—(ƒlév²†¸z•§›n:LŽ­äN‰Qüf ç'2ŠlÒƒ!q‘õX‚úa¼¬nä"#ó@ÚÚ‚Êó'0”½›z“xf˜a¡ºKÄ«¥SÈV+ÙÖËz‹^xíÃNÓé›#¯ºþ. dÜùöÛoom׆r)Tµ=DQAIÞSª7ˆÄL|×’“e¢bųͤsK[§]QŸøÃyàdUò 1m3ѲB   ˆzɪåÐ Ð,B¬ ÛͪP¾Çn]DŒí‚Xë"Ò5¦žfºó/¹–ùè|tÊ{áÅ–ÂŒ¸Û óÿÈþ¬Ëùªå[üúÊdíÓ0æ˜c"|S[G¢!‚HObñ f54†Ÿi<;eö9ǰ W,ñ²0PηC~½õÖ[ÕkžäA²y„9¬×|³¡Û=ñü³Ã—ßyÕ ™ Hp…µC^Ë€€PŸ™©¹Ç(ÃÆuä”h)ñ„ÉA‰ÌÒ4–‹ØjV™¬‘9+ý1ÚL’ ¹Û6E¼E¼¤h€Ôª¤r~"d³8 ?g±·‡þ‹Š„Ÿ[vë\Ž—]+7ÜpC¦­lÏŽ,–‡¦ìùηèèãOë—j$ÛËoŽÜrÛ¾Ðs«öö$\¬ îJ§æE´”Y»v’4Š)ئ¥‹Òÿ‚¬ÆLä¯Ó‹â”ùhY 5ËVt9€–Bå'‹n4™U¼\±H·$š€ò9²À^(p•wÜqèW=Ñ4ÓL#íºÈâKÝõÀS¾º?ÄP>ýòû’Æú zc’yÃ|1q!öhHDÎ> ,ÖŠo[›Ÿ‡þ *©ÖŒXr¼æ´2¢SÂqÈá,Í4ÌçA—XVNä¬ e•«‚<È ‚'/GïW±<¸ÖZkᬵ¦h*^óþ•{ÇgߨÛe`ƒ dWO{cbrЋµCÙÀIŽ °DÜ“”(.ÌÕ)QM‘•¹06FþͤĦ«§äÄi#sÈxq% „ˆræƒyÅ¢rúMjÓUØòü–Ÿsȹ%Ï+êÆB¨´ŸS€N>‡ è.-eñ7î$YëÃîU6ãL³^zõ-¢Ó7GÎ0S_è93<…¤\Øï“sÌ1ê*Ïw±Î™´1Aµ»íu}m}Ÿõ6êËŒ&ÉKÍ”D0æ èWô°äУ—f±Ò'æxƒ0ª •ƒp‰8Ô2Oð zN…&hØ 1qÊA‹Ë`]¢$Æ YZBç ±UqÓ7#¹¨}YtÍ6ŒSןð[gñ 5£ Åuʹ®žÅµx;°mÂsóížµæ9^sºŠÑ^óÅ–ºñއê³ÃGŸ}]кN…É ³vbŸr`¥-ªÜ‰]¤DZ¹VJ”.Y†ÖJ‰0s0{ØaJdðÓJ$(¥Q”X΀嬜DFË~A/œO€ð’KXåôÂØp°Þ‹x‹ÔðÖÔÞÖøUùÉvÛ©üœÃóÉÙQYÝXÐNÀÏHqŠåÓ)O7ÕTS 1ê°}ÀˆBåÐl@Ѧ[l ãÕG§Þ—A¸‚Õ¸<|øpkØriµy)‚’½mTYïKqOAg–eÜI!¨."<72F 5ó5Ô/#$Ëz:BBbsj‹tÌIåÜd wQŸÁ”(Ö¯Z A²Z'ï€]Ç•šáz«w“†H€…uá*–Ö³."fœóIÿ4ù©g_Âú>u|&˜pb.Á2Tz'Ø=ß`|8üì¡«aóëÞ{ïÝ—Åž›µOá’{î¹gÐÊVù „ £ÞÑg2)#[ƒ$™%õ†„;t‰JøN•ºÜ“Dù%õ.$«ÆÃ è«ʃ4¼,\…kÙ§†³ìšmÁ`)•¯9îUkŠÜÒkN»3üxô™×ë°Ãƒ~b@{’yZ;´ HL[T¨_¬á%Ë÷<%ŠÓHmJ¤Ë´N£AH‰Ç{,vÈz~Í¡Äv,9gdN$¥¥‹ü•þ²šÒÕvƒ^¦JågYÅöžê#‡êëÈÜ n5Õ•ô)ϱ†gÁN`n¬$?ó˜-½EÌæIb c]†Á¸-ñ MAªC‡•noÑÞQ—RçRË®È%ðLémà¶ã“Κ1+œ«´«dƒµÌŸ Êœ];QòK] :°xÊXÊL„ –GÖzêh#ç‘Åîõ,\5ºUR$•_Ps 픨¨ *G :5%-!¥öåø8ÕUN—iÅÍIg“YOK]DóÌ¿Ðõ·=Èš‘~¨cbský+¯¼2_2å³M¦b툢HpU;”§çÒÊlÕ“ºfþúë¯Ob]ªÏ/ÿÒA¨däT~ùU¥zÍEö¥“åTžÃƒBÐÔð)øØÕzm…Á`)Õ-â¥æ­·–+ª×ü7cŒ¹ëžTh„RUòXSÔÙḚ́.Rb‘|ÕZ)ÑzÍ-%"š@‰íðj~œFl/Ì$ P„`ÔÈ\ŸÌò‘cu²Ò_‘^X* xÞÎŽêÈ<éÆJ3ÉÇLÒ)Î,Ý«ŒÀJBwo7/bšVPcè³/¼ºZ:e{Xz´n|@|C°µaþ®//¢_Pæ{ƒ‚Hx9ØÏ†#ʾÅE¤5à£ý/#ãÔEt³.!£§Œˆ 'ªC¿AJ&½A©µ‰Ô‰~)QüT«ßóGrcžd…¢ ìYÉ¿rYW9moµ¹·,¨+QD£\D›=òôkUÙÊ€:Q·öÒã7_¢`p’écUåÄOÌÓ¡Âs|QV‘U8ÇDïn!EîÉ4Ô )Ah%oØ 54¢Èƒˆ×ܾ²P”­PB#ŠÔÆ+À‹ çBy2/CöeÁòyjå2ŸžcŠÌ]Úsä{°n³ò ã¶«í5?ë’ªìz„·èÕ…Y;ÂÚ![$ÀÇFÝNÊAK‰â4’Ã)‘ ¹®SbI-“§ZŠÀà£.ÚŽš záœ}’’¡‘ef&yÊñ3< „Éqð‡}dz´–üð|*©b!óÏ?¿$³|\ÈÒ©økå‘­·ˆ…Vn»÷ɪè…ÊÕÉ‹°—– `rˬ ÓÃZ?í\-q(h}‚2kE¼8r‘ƒôsø ºD€!Ô²º7ªBÔ¼])Fù¬ÚĬ£jJfµBûVðeqM  ”Aê}²¼ºÊ¯­5u•óãED×»ýÎ{>ùâ»/¼þI›Ù9žž[/zÁð ‰`4“=fŸ}vµ<@Q!r°:ƒ·1ËO…¿ƲgœqFkëò7kÆâ O" ãð=÷Sðr–e96rŸ_ ÖF1 3BͪW_ì[j‡7T[n˜$÷/“9š’ŸÈ¾´^s†RÖeéu© „fb?W\wg›FÈég_Ø· #™T´váX« WPSDøò -·ã*Þ¦R²%Y—ŠÊ‹P"ÏuÏÕR"ƒF«!%Êä Ñ5Ý¥Ä( 3ǵÒ“³If †›éš‚(¹YD—f1 /µ,/ò t|‚´•Ç.”ÚÓŦßĺ±§XêSÓêRáð*¾UËlH)‚Ñšs¶Þ†›=üÔ«íÓ)õ`±k®¹¦^Ò–¸sú5kÆvƒœ™fšI¹”?€¨ Ï"«Aû6>Iváì{†9¦¢Æ%%¼rK!¨`ä,ËCP=}‘Ũ4*à—^X®N=0ï–`‹˜Éê‰ô¨£}÷ÝW÷*ʈ\´tŠbŽ¢Xi\½EÃöØ¿.åÜIþ49-Ž÷Q/G:ßà1µ6Ìߺ4¿ä–Ú­Oˆæ.1ùokyì ÈJ1²’_Î! –ŠLe=›Ha[ý2N¿a×Yå‘m§½WМ|/š@ü£Y÷FmªwóÉ15ÉùÅU“U!ý+x?µ|½5%­~ý¿côê*gt -Õƒ°Në"¢+•–ší/s]víϽúq‰ÏaGŸB $‚Ù qi¾dñ*|¥zi§†Ýóh©–'_â\ddS$¬6C»—f¦•‹æ#É®‘שaS¤)Iy­ƳÅk£ß0Ö ß?ëVUP7dÖªÞM®¬Ô ±ê¬ Ò²j“™F-Kqkc1EÞÖFQ¯9Œ€5°2ðšo·Ó?ÿN ;ä”I&Íd@k‡üýç?ÿYM1‹Õ8y]:ªå ›Z %>óÌ3ù”¨+óI/›O‰6¯?ËiT+%ÂͧDã5¯˜aHLŽ»K‰å ˜³‚A;¸üõ¯…gòÙ€×\"m²„ ™Óy1„Ó !RèRÕo(Ðr*ËÏÈS^Þ¬;Ìçy ‘cò&rJVm£ðmÏk¼¹Ò/ðG:%`iµÕVÊbæð÷½-ÂTW¬¤ß\b‰%¤$|xÒ•ãÒ[î~œÈ‹°¼½ÒJ+ñå[lam˜äN«÷€(§[g*’&Ž’•¡ \{íµ­MäÀÇ•hdH=‚ü!mÏOlN]è9Jjýܺæ®rmÈ…sPÒj —¤ŒU» ¡²„ ]Œû³‰¿-лºB{ÎÉjîÖVØOÚXµÔ¢‹.а[$ñ,Š-²c‚ &ƒXmÍõï|ð¹g_ý8ê³üJ};ÇG¬—àr|àŠVC¬èÁZÓjyÜUŽÙéO kÚéË­ üÿø<öEÞ^Ê(Ë2ë°Grmm+7¶èJ…“^s»ZoÐãJ€Üè…Я:îO‚Xßë0Éò)·˜Þ•ŒrÙ©"µ³±Ã$^(û²pWù¦êfÙÄ,â5v>´^óõÖ[OÌcü &:æÄ³£ŒÂ7b@ü‘¼,za@Ö˜´vd†å3 š"´SzxÊÒ”¨BP¦A„e#cÛ çP"t'¶ÑJdÀ,œ)䃙qX4„«”èã‚bˆvç}AfæË™C¡2IÅKGšJ€ÉiCÄœ&Ê0˜·&'áìX©ß[žO‚¶œDðs wsx^aW1#n,+fZvë„¿ë^eŒ|Î;ï÷ö3¯|Tð#;Ç[ãfäÊ7¬jnÍŽ¿Åå`¤^Äò¤Lé¾<ðP¢qÁ¼ RLMÄTdI )É,ÉÐÏ@&½æ–YЈ&≩ß–~OzÍíÑüJû¤˜Ô»J÷ÉÉ»Zoà“•;$°2ÒÀkÎõ–¤dŸUy‹át]l|Ö¿ÌuÞ¥74BŠí¹ï¡Øîù$žp Öí9Pì°ôðÆ Êv(Q¸B§AÊQ"–¬k¢É2 µRbàvÌ”È2y%ÚÕô:C‰-ûï¬ɰ ÂÓƒ4‡à7u£Ð©åŒÌS!¨ˆHàu€út3Ù 'e`W«ÞRgGm/ŒòËâç–<¯xZ7V02—¡>Ìð|*ž‰š fÙ†W+uº‰Ö±ÆK:Üu6ØôŽž-N§Ð/gÑ•kÍøPø† àÀ†g›m6íÖm^DËþл"®ÊŸ Ê)§œò·¿ý-×£ŸÀ+ päŽôß2¬á¿öÄüäY‚è-9…a½ A¾ð¯D%j9é b1Z’! ›Ë ²ò7_ãê©9FdØÈ¾&rð\vJÔzƒh?†øö©ƒLsQú˜©À2c=gioô¹;vóMÜæ6÷V]Dc5Î!GüôˆZ~νä©ÙV˰†/‡ †­ëÁªFjvü§¹¥ÁÙôåQ)~ò[A ›‹“€Œ|Ð,’´©.].kXØV¦)ócì„ ´BFfê5¹(?k69ë È(B Œ¨^s¤˜þÍ÷ö°Þä{+BP‹ÉcŠ%Kü¨ÍeZ ÿeÁnÑ—ù¯6o±åAV{µ6Ã=ëʽX¾zÍ—Xz…Ûx¶¥R`îyÔj•­ò·X‚,ne‡2¼‰ 𵂲4%Â2{(>?Öº*M‰œØJ”|9œIˆì:%V%(e9aÇXþ‹o¥»Q7ŠŒÌí¯0@~Ò¡x‹ô‚Â¥ÀðsÖz/²b¥V¿ÙÙQ;)ÁWjéüœÃó2@è¹n/ðsRÌ<Ÿ„—gÜi§4°¡åRþ&°R|\šŽXâÈñm³ã<ûvK:¥ŒÄbZ––•/ ¶6Œ“¸H^DÇ‚mËh«Ÿ Jü®LªJG€ù\Üø()êØžR<8è2U¢üš+wXŒŽ’š€»Í_c()ÙTF¯JKM ÔºeõVPù7œ$@‚W ütÒ<ç‘e \½a¸~(7fK ø¥Â(7V𘩺¦{•±¯,[èÞ"æ6¥Cá¹–_~yéû(:êø³ò»u P’D[¡„“amXö¦—£e^DÓæO‡‚’>ƒA‰hê- .«ýMK=X )i­Ð1_Æf#$,¦ˆ7(Õ “."$KÒ„)²¦f wS \å9."|T“N:©XÉâK¯pÛýÏ<ùò‡©Ÿ)§ž†2ÖñÉ›Ã747Ó¸öˆJƒÈ²¼XMJô–.„ɸÍúcm2ؼ»%MC²ƒ Aëóã˨õ’’<ˆÈ(®ü‚» ¼æ¸¾èù’rôõnK¯¹ 0Ïñšcü£C0Ççà#OʲÃ#G1 Ëû'ðÀ´vÈÛg@ì3JS‚Ò)qÀQ"]X›”Ȳ»%N=õÔjŠ-3ê¢Ä–L•U ˜òƆ™?…„ËG Ñ-ß2uµÖwâ±tj+„7Z2•}Ì€™ (íÆÊšMº±Š,’ð|j'E?>à 3ˆ!1 oÞ"æÍåaÉéT¿Ò¬³ÏuÑU·gÑér+®Nm„ÉiU„oJC#Ü­/½ôÒjÃó"R-9GS¦J:r–P’ÍZÐð`49ö{È>r3QäÅàÖñ1ʺDµFLÈWVmˆŒ¬Œò¬»•iǬ ©-Ê".¢TyoÕEôë_ÿšt-„ˆ=ÔEÄ ÓõНßϦ[îx÷£/?ñÒösë}O÷ýú‹_0FÔJp‰ó%i´¸LwªÙñó¼%ÜBrJ”¦L JLq÷Ýw«g¬Jyt3®÷‚ òÃ/q·Y×°‹¯K%žE(M“UaìD¢w³j‹ÍË“ÁR>°ÚÑŒ}ÙªÔÚ!o™ö1Äi^ãw†YN=çòÀùï*kô%ô 2D+Qd{*kŠ–ç›o¾Òv¥)“‚Ò)qðP¢„m´ÑFM Ä"ýfj™¤ ” Ùs©Al4V :¥ƒ–ø±‚Þ"‰ÆÉéˆÙÝz,(xX®ËƒdÝ9³‘y^qƒsÈ™ Euëâ-Ê–ù7 (¢ †ý,B¡Š-}ñøã/Ýñ²+®N'ž¤ÓßÕ—ÁL¦VÂÖÄ|C°µaþ.œ$Þ,M™.(I>'Õ\"î1>duKŒ’ ‡-… î‰Õ)­¬ÆØ‹"Ê@“g1GP!OZdðñá¬åAŸåè]ʧžµÝò•F5ZWùÑGmW‘„!á!v­‹h·½yüÅô³÷G˨Ȟ.™7l=ÂêHz°áž JÖ_m§MYáTAI1å-š’r}’;ÛRjâ!“)YrKb«EK¼.™c9ü q0G_Äx$=(ß°s–ßJ^‚Ö!"3çö9‡qÿ+22žd’IÄŠXx‰ko{Äš"ó8|OtlÀ€d†Y;äoË€ûï¿›¦Xг’*(“–Ó“”Èt$ÆInl(±!D JÌXÙŽ:ê(&ýZv@Aò]t‹í|!h—° |.ëB·Sd‹ MZ pVm(WjkÉó ”‚ä9z S„çµBÜX€ÜUÒ ¶ÞzkaH–Ô õ0ð¡Œ5°’Xsë-zð©7•N/¼²ÏI ötÍ‹°6L²£õÙí!Êñjêˆ"SP ë¶è€†HÁƬq˜*¥3Ó0ŒU[ï¿"„õ~Õ˜‰¬’xƒtù+ºsÛ´V¢$Ñä AzzM¶w\´ˆÞU# ‚ÊW9÷ƒ•ëY×(a|ƒ/GLgŠ©¦9ùìË{á>ôë|Ã:áz¼À7$‚1iΨýºZ^‰4ˆ¤u`‘A^– ÄÉ€ÃG+‚YÐòuMàæÊ‚Â,‹=Ø0BLѺ“mÔ66–Êé0‹ì5/éAÌehÁðL‰ò… ÷2¬ÂKšoœ\´È`ItAÉQÌi‘m·ÝÖÚ!3¥ñÖk¾ÁÆ[ÝùðËØáWô3 =Q<‘ÔfíqŽeÀØÌ°ØÉmÄ,A锨EQb‘ÁR£(‘y¹€çœsήPb‚’n))yö\m9;‘Ê36Å0I€¶¦— œDÄÖËÀrÀçJ€²RzêS39É‹™ÊÏ–Ná±|ž×Ê­+g^TEBËÙQ™Úâsf·0é¸YTGÚ‚À3ϲ"i¸6°RG¸$<ü$éÖ7Ú—ꉀ)}%²ÛÒ)ËŸ© gm¥,q%ýÊ-%Æ'³¢ h0ºÕ؃žU]DHf¶Ú™I€·Õ¢«qôOhYý•’’>‰€ FHê ’Í4m…\”Y±ûÓŸ(&ù\Ìâ%]D” +š€Ñ¹%æ¬y1ôÜæšQnÓ¾V@c÷8õt®e3d¶l².".gí)©Žhn@7 Ÿá%.½îIƒÀÖõúo¾Áý‰ZÕƒ»j? "i—x[’cŽ Äy=ÄŸJº m±¸Açôš[fA¨q«¶•Ua˜¥þD1 êÀ<Žš)%“2jðLè@ ¶•±ìk¤˜~OJRùõ©BP¼AâËÄim#Ä­ñ` âÍ™ÀÚ±yy­Ú ±¢|H©ßzÍak‡Ô­«×œí"Ä¢àÁ]÷:d“¡}þoË€œ+ ÈÝZSdU eÀr™aI;$ åâù‚Ò)±rJÄà1{LÑ)±%I,5å-ƒ"‚©äå"”¨8Ú’ õˆÅ ö²Ò_ÀTúö¡EÔCºZ;©e—°ø¦~&°Ò`*Ï+t‹Ž;àç,žÇ[dyÞ¶…Š™$?·¤S\;kœA¶†©Y{OäŠz‹¦aæ3/¸ŽiD’o”eN°åRþÖKðké à€Qñ¯ÙZPr£D;‰ñ­±ÆtäåúrÄ“X ÜŨ7ˆì§¤ò î2GŠ«Üj‚¤ò R(èê¬2ÆDÔKªBsWšËÒr“Tn-Fõ.¸ÊU i°xûÔÜtÀ(ƒ|xѺˆð8 AèÚÐç=âˆ#p†k¯ÌlŽ-)y¸Óé!ô`ç(-_:,u Órâ;_P&ošhJ\„dX>ŠâDº“Uù@’Y’ŽÕ,!(qEaÔ¡.”Áb;¥‡ (ïó×ú«lT‹§“A‘5cÝÒŒ_+É‹°=».uz(ñ°‘92HîOd/. ±<ž„Å­(èPcíOËSsqö”6„ ½4A¾Å5UéI+Ad6¥w­DïÒ®X36¥ ô1­2HE˜&SWù:ë¬ÃÑÚQ,Üf„¦´ßKº:€8h=‚D°JÒ ¬å)˜C‘VP²ŠÊš¢Äˆˆr°Ó´ºÌ¹„c”¶C|ÉŒ·¢H<Ÿ ŠDŽÚˉ×\ïÝ “Ь.©<(Ü)w¥—ÈqÚ K©^s;zÁð„÷Úk/¬Ž½C$3 *´¦ÈIeå ˆÁèüQ²¹­ ì%âAɹÃT­¥µ­Ü%ŠÓHkcPˆa„ˆ–äÎP"!¿Í¡Ä(.²…A¹Ùf›É²A©Ý:‰ìv!¯ù:í Ñ­Í0¹l¥F‘g ÐÖkßQZ®%óHZ £èÀUÐäD$z—ÎßSrd^$ý4¦Ò)ÎTíYdT„í¾áò{$(È:’—|C€»µa Ô‘¡=;ÚFŸúßøZâoVþË”²Κk®©þ!˜¢¥âiÙÁÓÏáÚIÝî=ß S‡Sp-]\HòlÀnöžycÉå”õÔèݨu\“#¤dÍ‹ïcà"‰Û/% ‚!),=Úß §ešXŽ4'<Üš"YoÌÒª)‚;$.D]æ²ÁzKKË/€å0┠ċП–É" ;0ϯ–väA²n’‰B\}Q7Æ»‰½eU%EÕë5Oò ‘¯Ä[;$~ÃÚ!jCìSŽrää›bÎBM D† 2I56N AiúXJ䢌ÜdYNOR¢l;ŒC¨9”õzÚ¡kâ¹ð5d J{XßRI²EûCt\«ë- „ !Z°åz,\(ZF¹Y6ŒÞˆåy†ÄYµ1ý+rF€r8Šymõ¡õáOKžL£;í7’ÁˆÝÚ° ãå¨6/B9V#)ÿ6ÐEôªâDMz(EP2—Ê-ªH¯¦ÆÒVâCNMµÎ©ÄUn/M¿+¾hâh•üÓé¡åÒx§²î_ônAr—Åbè²j‹%wÌ3ʹ=½’˺Êé†eTš<ø‰¶&Œ[Õ!ewޝ*,è×qýfµ '/hJ~‰§Üz(ÅñbN7ÝtRžJ™ê-m‡¼ÀÈn1®X‚ƒ«ËDs¤•%\2ßr(d”g‰&õ³ò ;Šî©ŠØÇ–ðò X$<\œÍ©‡ìÁJ¼ÖI¯›1Ëœµ”»N‰¼ k56cwrû”S 6J$ú¢Q”XZPr¢„—ØcÉ%—LíÖEPÒ­“ö'ayˆQF`Ë—=§¯Xq ž– = gI¦¡GH&§kÒœ“u‡PYq½«üœUÜX„ç­„éÑZ"LͺWírÐAeq)=ˆ¨2t”5cfxÔ ªÍ‹ÐÎ]çû%Gàâòl#(Åø$ž€[EF¥Ùî]"‹ÁÀ€èhr½:ö„B§**ÌR%¦IÌ”vÅ[£§38³Ê·¶»dØd½ä¼~(?‘#9v¬z·ˆ' N—·¨ˆ ”û·®ò…^˜«$íO¶ÉfA(ä‹ €Xöawï–îÆ~ä8hÙ3&Дø i¦,A‰ò“¾0ÄVÊ"g¥íy¨‚ ”&-!Ƀº*jÖ`I¼Aš(ÃBöæí³@©Ä‰ai9b@V‹¥Y³ÐºÇÀ0³ü®‹¡¼l=£wƒ«`±›nº©X¾¼æI;Dh ÂÅb‡Ììpó6„ÅYÂÌŠœ’ÐuJ„‘4»W´O‰ºr*Ö(›‘ 6Jdò­i”X­¦$’D2‚m$› Jè”=Qy%%¤²Í!:öƒ°*o‘%@ÄS*ªòƒ¬`KNQ¦O—Ù|9Tïæ ŒÌ…ŸY\ oKO]Ä)¦++åè„àB¾îĈõ•¤SÉ‹˜e–YÔ†‰Q„ål,YûÛCdQ«ø_ú%á& 4„Ù–§J,ÐT4¾õÉÄ_;}9©IùB0çCÔ¦ Á`è€ÍiÇŒG*°9ÉÀJ}¸•7P×ÜJºÊUùÑIšoA–ÞÍ!Ñ­Jz7Ï;ˆŒ|?\ÒE„a(£‡ìÕÎä#¡»4¢LÿÙб1Æ£H—\®LþÔŽöà>™ýdaóT¥Ø!Çn»í¦.sjhsl]ƒ%×J+ã§·­¬™æW¤?a]v§ŠàuPå'K´XM k¶ã~Õ»Yž0»f秊§TØrj"ðšÓEY;”­ºa@ìƒ)*I`²€ó²œ™µ<+?¢·!”h½æQîd1Œâ”¨ƒáÁL‰Ä£7ÛÑ” ÒÐöìäg )³%\J§¿Øb‹É)¸êÛ¢·ï-J‚PCq É™Ã{çǶ÷ÔÙQ0¹µ]SOPÀÏ0³%@«w³œbùc¶–®ÜÉ@F×Ò)hšŒ-š±a†  ϋƶ~åyJ³@5ZPò& “šÓ¤œ@P"t°ËUVYEÎbLx¢¢ÁÚ9hEIïçeÀ;õ:‰‹H¯Nf¾ AêD¥!At BþkïSmN¯(ËUh¬Aüä4ŒHr«üd‘=°6%Ê@e¶]3Ê­‹H58¢ø¯ž‚ÁÉ<]ð˜©h*ûÒr`…tÞb|H^€²/‰Þ¡]0¨Ž4µ¼–©*(BV§²¦ˆ¦d…‹ä”· JLÑ©.s,6@»„A‚ÊÀ[™‰U!ˆ5b“bœ¬‰­ÚG¶ë È”¨þÊcª˜‡Nwܱo (yT-±mI°Tb½E±ÁÁª„¡& ]“‘¹½»IŠ #Þ"+`à€çUùÉf?ð¼ÆMIèšð38€†Þ6¬ü̈Úò|UbÆcKƒÒ-’V«šR‚€É¬Õ‘9Ë:ÓJ§Um‘:V·ÔÏeà¦R{¢£’ìÚ¤ ÄònUÿiG•ôåàHÍÅc&‚W()qÑI[ŠNE¶çÛœ­Pü‹ZÞ’{–&ÈIž ÞL¸Òg«&`ðæHµ¹,½›úJ3UW9*íŒ3έº—Yfµu"M™é°iì^ßÒÁSº@Ë8Д8 ­Ó,o5Ee@ì–T—91æP‰UN-)/µ@µ<ˆ”Éhe«ü,³$»ä`Iy;Ì&@ªl‚ðè#cl%"ƒ%;ÚÁD-2Á0Iî3–‘̳R ¯-ݹÝ"ìOúSi3+r"à´ìª­ç¾»”kéì!íÕòÎm–”ß,Jän“Ë®ƒ¥(J\vÙeJüÏÿüO팻N‰QͦH†§C–NyÍíø:=õÔS%¤’sQ¥E†Ž-9–‹Î¼Å¦æ  Ô“#óÙ*ÙzÖç%¼‡ÙPŸTžç…e¨½|rÌ–Ì4/â-¢~u‘ g]Bf™ÛÑ‘92˜œ…‡Ô†kÊ‹¦Å ”"(ùŠÕ ƒ ëTÁþ9‚㣛üñÅõuðÁy±[ŸõdÅLä¼fdè .âTŸ_Ë×5k„”ï J­6 wû˜âsÊò¥ÖVä=·®réÅ1tj“MW™B 6È¡ë*Ò—+#–×òàÅXb‰¾ýÇõ@S28“eƒR%vÈOºeckJK­ÓÒ)P-2ä…ÍoPÁ5,’Ê ”aR¾ƒ<ðՑ§ƒ<¡"<ˆ‹H·r;„åÆ n¬Š'3nål¬àY-“öäÞE‰ÕzÍ(%f “¤½ÊQ"]rÃ)±%gæH O‡…”N“‚:eêV‡èÌ@ÂQv°s¦–QU$Ã&x¨@²cu üЬþ+Ím½E:; 2†Ô9™,sfG…Ÿƒ1[þöϧÂH½º]„N!LnsQœp)ý¾í@+Ü '•`Á<ôP X¨·ä€†Øš,%–ÇìL§;üŠŸœ ÐZôCí„:Ɉ!ˆ™(øv!³î¡eUp ±}z#j°ÆûV|I qééTÅ[Á›f+„7 N ´„š@u•cdøYéÝé)%'‡¥Z^}ij…×õÏVXÁ¾ü½Ë.»äJì·ÿXc%Ãú Þ´c„rn›<˜uÌbÀíY»ÌÀx°F}@ ¾ ŸRàÈ`IS l;+½yáÁ|¨‰¢Ñ…vé¥d2HL‘…0ls×”¦v˜³xPТDn»Xó®h>%¦:ȳKù½Ï@¤Ä(– §†§óÆ¥NyÓ§K·ŽeKy+eRôz›tJà~S¸–óY´7à XËP–™€ª\/,bÎ Ü. <¯åçœ%&ì½"!sVüÕ€"„˜o”nEU•N+ß"©)éÅÒ%”: !JÖß8Š[¦¼Õò8‹¨#õ““-[¤ƒ)bšê;áÈIµN}ß!¨—tº±¬íÞ“U1Í„Ë:ën±Âصfx- Ϊ0#œÏ&Y)õ‹ •O*4þH2]å8㌣–W_„š`‘©F}Ød¾-±¡YJ”Ø!Ip .¸ <žNüâkó¨ƒQöLXóN<ДXÌžõ,(¶Ø)Qš&«6J§Q ög9<¨qÀ Ùi¢°CüdbŠ[mµ•Úa­™abŠE¢/ô‘›F‰˜Æš—›=L¶xÃ)±øêÂÒj½J‰_Ãd±dx:5’ÎvëÒ³Ý:Ý®î-3Ö·RšTÕ[E€ú\©Þ"&¾™å+8FU’´Ëe=E¬Þ…Ÿ1Ô¬Ú`æ‚jÒ>¦õb‰?âÅŒ6Ì/t*‚rî¹çV:­5/B蔼œLAÉÃ0]äÛb|ø{ò%¡Hr}ÔOŒÊÙ˜Ò‰J¬X””†IJ[!å/¹\Zwí̺yø]<ÛE¢æ5% ¸²*Ä&¢fèT(Ÿ¬Íº9aÆ£¸7Ĩ <öØc­[¨¾D°r‚üy[?墋.Šd ‚~d`#‚`9؃^WVƒªÞTë5§6‰+2Xº¤0¼™c9(¸ü–¬ŸÅäHŽaK"QA½++w¤¶usr]&=0E+(ç™gžN2`” l %ÒdÕzÍ›O‰hèâ­ÖÔXZS&ÃÓyㆠ–:å-\*tŠèÔ¸=™”ùâr½¹=‹ýÀ$²¼ž”¶l'ŽÏ–‹mÙDÆA5;*üLòn,ð¶$lAqc%o­ S˜™§Ön]%gu,¸ ä‘ù²½=¶ß~û¥täÀÊÔ$˲s"ª!(}9ö׿Á<…nsÜR&ÛL|'z!£ü¬’xƒ$ŒFÂkhï}fÿ‹ ‘Î>_jJš,U‚I^ B%ò—ÚÑ55y!mmÖæÀĈtáèŒ@Pʲ”rÔ!–å¡”FdXØ!ë¥A6)')(±CÄÍôÓO/ç²À! *S~íà)æÀÎp¢ AX߉ރ]t0k°$Ì"¶Ê Åzº¬® ÿ…}düƒÝ2~È‚”—Ý,8dï“ÔƒÚx@,åó ârò²@¶6!Ê#\DM‚²Ã X\šhã61‚-¹¢”h V)ÓÍñšóúèª9”;%FñLja^Æ <nd÷E´N’NUPJ·þMDPM&Óís)œÐ¾·Hoƒmu4±F×c  °KXÀäA·nmXy>Ÿ!1@"gaÂOÂ-b`¢n,Ù‰GÑÄÃ2ßh»u”8S´ÇD‰ÕšQTPÒ©Ö©âÝNòVAIŠªz'µ‰ºýÒ‘ k‚±ïX )”õè8­«\gáûÀD´ƒ”’U9änWSçÕµ8ˆ‘ÃÊnnFW_Oµš«²fÔJÂ÷Ì-"­R¥M«; ¢´ ¤‰“ù¶xÙõ'˜£±JSÜvÛmåí yµªÞT˃*1lKvÉ eFS¶•ƒqjA´Ê—J²¦(–c_UyLáÁ¬Á’]¹ƒÕ¾¬ØUEË{øØ!¶š”gÀ‚²±”¨(ÍT<|B™“¦I‚•P¢®ÐŽcK–®‰8¢g&/B‰0¿PbÖ`iPQblǧåSÃÓɇc@’:å­Ý:t 5éL‚Ì@ÊŠŒíwë·H °àc·¡BÓ¢ °cB‚³³LN³ ‘,YËΨÉéŽ …ð3uZÙÍcJ&¥ð<…ƒ„0³ÜXvqC^%N:M ÊçE´žò¶ÆGà]Ò?„_7la%­H!C†È¹’u[U_N3 òd\‹}™hé"b:XæJ²¼AI—OðP–ÜÅEÄÝêjê(Nœ Öæ‚Š€ÜéžuJT=aÔig»x|­Ðzƒø’q'-S¤ JvĶ;Ç×ÑŽ ¤á’ë_`WŒU¬¦ JLo¢„ÉBÔV•«²M¯yÀƒÖkγ¨Ï/é ·c« ,³'yÐzƒ‚¡yU–óò j™Wש»(T⊰CŽ,A‰DI¦™a±1”–ôª™”HƒŠ;¹Z¯yû”È`Is+…ÁPWæK“ R"Ä8È)± ØJ-–ÜÍ„ÉàÉœn]ÆçL°pÀ2)û4V媄UtÌPd¯äse A܇˜ŠŽÌ“½p2´1x(zí`v´ÈÈ\ï0vT‹éÈrª&àâ"Ò’Œu”Ï€שÎB"7µÏ¢b—›y:~ž"GPʲ”rt BeìÐÓbžŒ+çΉ8†ÔR§¼……) û¢.°À oÄÁܦÊéºVy¹sEè¡322×Ì­Ú_¹çœõ‚‡ÂxÖ–±NšÓ©Û sÖ¯¹f5 ë5·©šöe±†M&ÒSÌ”L0šb2ðCâÀÚéK‰4n;±æöh“ãQJĤ•yqJP¢eþAN‰íØ0Ð9æ˜Ö[„ £³ºu”´7à 3h4<4w;¼ªn”ÒÞ"Û{ª„éâƒ^îÍI —ÁÖfy^zazy » ?'y^btRÖûŽ…KVxpŸWЭ'%©ß¶M;Á]‘j’—”“4ÓäÚ«šÛ,ïTA‰qÀqºŒ¬>h¦vŒžŒ{“.3+f"JRgš ªå¡¬Å`BîX^”&j ¹ëK¼ë¼Ã©6Gž]8oQKA¹ÐB ©åá$O®PÇ7ÅWJmµÔùÖKC:I9:å-‚;ä:ÞˆwSTx%ÃÚ‚VnÓkny!ÈxI™…Ÿì˜!¿# KʃXE0L*²Æe,Dš$"ï£Þ¶»Ü-~t®H¢^¾ ¤Q,Ò”u^Pgìøs`Q¢v¢ˆþä´Z¾ñ$…`iJ”©Ë¥â5ç5±ƒa ä“R)‘tJlGPr.Q(Aö-o"«ù¦vëVPÒ|¸6†*o.®JÖuI6wéž½Zoˆ©${á‚k Þ"ê¡OÇŒƒ‘y~Nø5_:åE³ülÅ.ßÓ#$»õ¤ \gu”N;“!©q‚[ÇdšÆgÓÁ$zWÝBÒ‘cy,¾?餓ʣJøEÐí•6>NT߉,òõš±‘mÅà6J,WÁÄŸV"K©ë‹¯.);7Cw‹ç@+´Þ Ùm’.¤  ´i‡vXzqš)ªi² 'çkXZFËšòVA‰’±h÷¥änÒñ3k™õ¼ýöÛ±Î]YˆX+´f×YòTÌS½æ jØ-¢vØRPn´ÑFÊ€N8aìKñ|å̲ɔh½)膨d*@Ç«Iƒl“e/;§D±óª(1ª}mašƒ;¢ão¾Á;$å$%tŠPSW%é>ØVÕÌz‹sÒµE tgfÑ)nÅ(Ä @[5\+P>8MQŠÖeÇWhFæYÝzRPvr{åjž(ZPJr ŒoÖYgeõN]®%KPõHÖÛ”ð É£Nä?†"{åµyèe¬šYd^c Ò¬K3n ‡ `÷ƒ& áñÇdÕÆ ƒ1zÁEXÄ ÑÇÌ&+´6‡8v(€ú Êý÷ßß’HÁ0¾â«I·|Û“[˜à2'¦ÂÚ¡5EñP€Ø!®5˃L€ŠfjÓåtÚK½æ¼-y{ÏMŽåÀ§Qƒ%b†Fg6ß·Ì4 š€W]žÄ‡§³Ñ 41lí°¥ ´ Ȳ”Øoi‡ §DM.,8{ˆé>é9%8Jli«9X#Дx.¡ˆ$J$›ú‰„N™('hŠRg´/¾ºªºu0šC]Ä[$½06 ÿgñ9ÜX|a> —dº<«6.T„ç-þŒÙètRéTå Ðó»õ@P2ßù¼•”‚HÒøðÑäYSÞâ¡Ë ˜}öÙÅ|%Y§Â¾œ¹|Ýæ8GªÍav X8*ËV4œ¼åIs èM³j“윂äŽ&F'ÉݺÖð¾ñÈt” ì|BîªÖ ÎM¯a?h›–¨Îò@PbuD‘*J€o…<ÈøX#s\D0‹$Âq4e–åàG—ȳ–ƒ%@–äY†õ©C.\(‘"<ˆ½aüÔ–Ô»ÖÍɨ‘438Q‚²+ ˆ)œí*h®M¦DÈMšæF,f½ƒ´2 'VÁpÈ)±3›j)± ¹¦ciñõèÁJl<Ðiª „KéƒV\qE9—™Lù©dˆN%E¼E:2džáÀœA‘F–·\l‹É dÊ”2ʳÚBÇlÛÛ‘¹lD¤Ði” Üqǵù:–!ñèå%'3½ºx=öÈ™òVAI*ý7;ÉÃͦ3à•Ø–¤«ñA¦GÓÔ¸uD›½¢D-NSîVó`PÆICQM€åQ¹­Gˆ„ ÉQÜíb²ŠµÖ`½A<&OGXAÉ Òn°¹óÎ;w†=™5h‡ò’ç¦Î×°ö$^±ÔJ;°iYâYdåA†¶ [‰R‰u^se™Ð±­,c†` Eyc°”Œ³šûø”‡²>ƒ‚zWù”#§(,ÖANÍt3 ) X\P¢¤m / KtÀYŠ¡Z;JÄ=cûãFQ¢õš'ÇÆŒ»taÛÊ4·Sb­Y9%¶cؤ7èV~jÉD¤&¤tš%(¥[gå l#qBf~àŠJè4ðhGæÜ‰½¢Œ{g`Ö*Tv ‹$?tZDïÊÈ\Çl<ŽÞ¤ —d.ç”ÒiqAyÌ1ÇèžF4_6È‘Wƒøv%çƒ`ÒøØ&‡N%5†2”tTd¿¯¹æšb¸TÅ‚jLØзXÇå¨߬xƒP~ܽ6góETVJl——J8—}Öu;Õ|σc Z'O¡BV”þDdM‰ÚÅp'ðBêYÖæ !´;ﬠd:óÌ3³IƒüjÝBJ¬ <cëC=4gÊ[<”ð†ÁAËj¢1¾:Þ¾RVxÍfÁì…‚õ$&I †Ôi—.ç}<ãŒ3Ôÿm+´–¼_vù­ œ #ÇÔeäM~–a£’¹ ì0VPn¼ñÆ6Š—ìXfTÞN¿›unó)‘eY‚ÙC‘€ §Da’N‰¥Í;u%)§œ’³Sc(“Ý:V„ŸLÛt槪n•Ú$*C…`02§³N%+Á$‹íb[v“žÚò3O¡ü,®½V’çm+‹x:yy õ,+<¨ <¥[”Üü’K.t‚ǯu,¤• my()ú]æ¬ƒÇ ‹Õ"©µÉ` éÅ¥#'0–ƒiÁ©§žZ*!ªƒÄ\›:}¡AiNñåÛœÚARꊒ¸Êu†(P~ÖwmM*Pºæ:@¦DÕ„êeŠ3Õæh<@cn‘^\,ICªå”÷¥—^ºêª«Å;³ìÆ×~^mK&çkx4¶ ãµ´YÞI¥J eN|³Í6S¤B.‡¾·#vLT¯y*³PyΪ©PÃY]­×*?* †I`r°L‰Ú¢™²Ã$+vq3&d %‚ç.+V01ÔÒCyÈ!‡|“4Åά„ÊLSTsTß< (Q½)2ñ{ä †ƒÇwJ¬°“®•£ìÖ†7’+­BŒ¬çU¤[:…7æ›o>yÇgœqFºªj½EôêRŸ_–òKÚ°‚Ð cuØLFæ(?ÔHÖÈ\ë¤[·}„åy™ °c6^½T±K%èºuèTºuDtZdÊ{ýõ×Fæ`Ávf¶GkJ0änË<¹ët6E%–Á±ÓN;I4Iâ"²­ÞN_N(1Áh#Kùö—%Åd•_¾&È!IS¾7ˆÆUÙz»GÝ®¾úêï@Žo|«­¶úïÿþïdÎ;ß™ØsX¸ª4ˆ,¢ä=L®B@tïùçŸo³¼uHm=”0 Ø!Ë%¢°(j¯9ú£ªá5 OIhDŽ7(õs„ –(?ë O­-àAë5×x»,9wŽþFÈ bŠGuÔþð@›wÞysåÙgŸ=çœs&íw¿cãé 3ÃR(”(^s9t9ò,ã±o„Ž£äfÝ”XZSr"+­Qm¼¶Ì@¢uò»u”B§ Ë5°pÉ—ˆ²Jñᓲ>¿"½0˜%Å÷ËÏA!*;HKz(ÅòHJ¥[ZtÑEIÃ"²’¯ýCV;Ó#EÓä«(£ºk¶ß¤zƒr”žËÉîv˜ÚW¿·6GÆsÜ\Q%²û׿þµÀ…|ÏòP~øá,F•´9F0l]Eí®#j-‰-Äuòay?S“rtÊ[;ä`%åA|ðøÞTV¶o‡Ô`[¹¸ÙÈóoŒ‘do,~‹›°ªžËZ3°3Ã$@Ð/íò03΂AØ¡0 IB:M¦<óÌ3SåW\ÁàÇf j3±ôï~;Öung¢Ö%Z;¤¹{ÛÑ”©«bÉ dN·n%4‚2#$Iµ)‹·H¦\Ú?ÚìÖ„Üè‹Kós è²Ñ¦Ä»ãŠNd/ݺÐ)][ 728‡FR%2šÕuRGæÙB(Wæ“«”Ôˆ•$wÇŒ† dySÞ*(å1Ï?ÿü‚"•qŽ ÕÛ·BjÀùÄ势o8ÆéG³.MOLDñÚ( }„žjs| b¼–\],_Ž®FK@$&›š”COŸ\` Tñ‘…Ó¸öôâ(pÚ) Á<5‹á}Ì™òV;„¹mÈ”7S½æ ¯%,¡*Ô¶f¸»ú4òžeŠTˆw5ÝK¦Î˜?å-JîYìä·Ýv[^ãþÔßJF5TÂýÈÌH‘J±UI”IZŽÞqK.™jØÖÍI1îÓš"»d±ÿª¼¡,A…e¦&å¤Òv<¸“Þ O÷ݖ¡Ä ûœ“ð:%Ver•דÜ'fïO²[O”B§Äh-¶ØbÂ,3B¾Žx‹ªš„„%_‡Î½ˆ“£|™S ¿BnWw’pIÄ@²[FæD£ÊzLJ¢•˜¥Xè¤PðYI9üôÛßþ6é˜ddÞ±9n#‰§Y­AIíY~rvÊ‘u(ó=”vHG—£ÓµöÊÒV4 ö‡ðjó`¡›çAîGB×¥“κ(K Èš‘ša“õVÓ ¢ P¨ÄDÚ ­c‰˜6¦0MéÅá1þÈ¿¬Ï7©YÞÄU¤Úë¶éà)qzÝ!k9ì™ÜPôX,°¿ Ë;˜ò ø:¼æ­–á5ê¤M#”Ó¹ºµ±Ô'²‰‡˜+î¬KKøDKÄØÀAJ¢)mm<—2Ó`‡0 ˜âi§FÖ§ Ášä,’šåÍwrÊ‚SPçÛl³M‡ä2B ÷ª¼¯-R¡Sbþ`É)±ˆu·L–»_cЭ§ J˨tC§Î$¤z‹*éÖ™D.B€jrô×Hº,.E$ˆBå`î™˜Õ ð3 lKÉ@'Ønb¸u…NEP’=‚ˆ:e‡ïR³¼Yt²É&KJɇ®i;"ƒ]”ë” q'Wr ‚¨ˆÈ”âJøá4  ÿœä‹Iúmû’NaIºˆðá¿”Ÿ¸m,U/‡é šÁmHÌDÖ cbÖUlŽ.cÕ mÎ…P˜ ÊýöÛO½AŒðÖ6Ë[סä>‘ÝI›½Že<R xkZ*¨ ½¦®¬Æ A oR“r²ŒïG²®¯eCˆªd%N›Jwà5¹ü„­¦BdòH͉ñ4S?9<ˆ‘CÌ’† ¼ÔÉ`€ÞBU0\pAAƒÄÝ«I9vH 'nºé¦àk ;ï ›ìLèd–Y:%¦zÍí0É)± §u±>Åd¦îvÄVÖ”w£l­sšþ(ÞÊö»uúVÌ)•m/ÌÄi02ñÜì!ó™©Þ";2øÙvë<õ@§Ò­#(шºl$“ÝLyÛ,oð¡N»X¯ÒiWBׄK JFUÕ((ÅâSýä„ôüñvÙ ™òÎ?hVM·ùb'Q•·2pÞ «ü°õÊ@R` ˜©˜²ºÊuÒœ/Ÿp™*%±?šŠ^zqž#c™n±¡é¦›`³¼ÕCÉ(Š%r’R’—eßyo˜™wÁ ¦+Tˆ71¹ †¸*ÑâºlP+ìÿ¨5uLc|«’•I¯¹uc¥Y~D¶ê¤9¾IìÇ“¬aU)N\1E¬ŽÄ&éKp³¾ Òfy« d¶d~g‘xع˜bÁ­Së¶ÏAK‰ôŽ×Ü“œë6¼ ë§çM.¦3°ëX2DZ%©¢ kúcU²’~V&EZå3©˜5=(pÞ"™ºÐ¯nQaGæ–ŸÕå$´ŒCT¸T%~%Õˆ¬CB¸¤&åè²A¼2„¤ë´dйwqdNÐO—´¨Ú%—Lõ“ éKà%1”Å@ßzë­5O‚ 5I¿¥Ábg‡ø´Ô‘9î'< –Nmè1lü×fy«‡’$VÌHzˆ$t­»#s¨•æÎ±±Îy(õ&pegi4YGb{‹ýé.;ØíÚþA àE]Td }L, Q•¼4·d½AØĪ[#êR¥Äê2úÑŸÔ-„åÑÓ3lÈ2TIAÙp5)m”5í8餓’Â\ÜölI¸€HMXGîË.;QÉÁ°8?Ó0xÛ ¤|ê¥í‰b"åàMd¥$Õˆ¬™O¤iÒqB°ÃSL‘ê çM/7=]áYMV“N‰b–N‰W•_‘.)U)mPG9:…‡9]¹…9IÙe§B:ÅaIO] 4CèT:Õn? Û­Ó/èbèlòk-—Z%A¨©#ó)!3y›U%7”3¦!YGòJçœsΠ/lí9_‰ý‘è*•ÄL´ í×];™Â,φKÊÑzÐ믽öÚr󘫎Û_åoq ÙÅÿlGÞ•e¨’}¿ì|ZüínÉÔ½L@•dZ¤„r j ^PÇ97ì*!k­µ?‘%Šð ñ²v³'Ú.\ÖÌ·ÆfÙf MœjЬ?—³f~…¢°tU¼bÝ]^ ¸m;%ÒRN‰Å ¦%¡8âÈ“ àtgða9.å,‚nac­e&KV"+%°’¨$`>¤aKF“ÔYÝ:5 d:Q¢! ‘ B×’tJ·Îb½ºS‰íÖ ]kÂÈ.²w¥´\Ö˜†zµA¬QË•eítçŠ,1%‰±©Ñ¶ áÌNªå±AØ6¤‡]†ŠÕMI£±¿êß(f²¼“Þ n-C•ª&7™Ïôå©;ÑÛ%У,P ³¤þNi/â1`[¸iÇ[É@ExPB!SŸŽa·–Á¿®—³R›”õ¸òÊ+çšk.¹aØÑ]ªBNŠw²çà¬ï ˜£5[nUÐÀ.Ù)Ñ)±fuKYQÄa3ËWŽH9 IÀºË꽓¬‰öGéôÑšaÃX=uœ ç‚„KR†^ÞÒ©‚#;(ZÂ$q[C×HddžJ§|¯ ±Ùν ¡kš…S0Ôª›‚’–À RµÂn†J¿%6–8ÐdÔ`½DˆÉ–GQ¹ƒ5dérzk¬\‰Ú4=݉FÑú­”$Ø‚³˜³ÖÃŽKX†Š4û«þM Úâ‹/žWÑù³zq¢I•ÓŃxSRg›m6Úº„ê)Œ@#iÛ^ ±Ê»œr–îü.^s˃hV–eÛ^ºëÐ[ÖÒ‚}XHQSª)²$®‡j ’ÄÃï ˜£&‰WŽjýæJLæ/:%Öè”Ø£MÞIV`«PÓ5—¦SÙ^{í¥k ;'a…mvëŸ~ú©®ÇB?n׻Б9^LVÿµÝzºfí“~\wPddN/ŸÊ¥°.óø©#óÎï ˜E§¨¦â‘¦]”bˆŒiR·Ó@ìo3¤bÿ¦IªÒ…Céÿ vdS®G§Ÿ÷=7ý·.C…PýÔ.\¼A„_èÁ"XvE–e±¿êßä³o²É&©á’]\†*i|¸Ê®šTB$©+¹8fC(Œk~¶<§#%•;„ 5$¨œ2nQ¯9<È”„®™ÏHÕaÆœ‹56ÆZªÙ–“¤ÅTSdâTy­A¶ ôirOì”(£VKqJl¾¡æÜaVÈ¢9ŒWÛ¡SòVí(ðM¨[çÊÑ)}7=8Ý:ëÁÁ'ôh¤4äÌ%\Ò²%ËF²Õ†®1ןʥ|É„UêȜеæŒÌÁ$jʱ‚RŒ—º2Ø¥ãã\Zˆ|Uu˜ã`d€M—ÙÐ[«›ÓESÕ”­7ˆð YåGBt5¥FvP$lÙпyð.C•ª&c³àË•Ê/é æ¾gLÙŽ)ÊGWá¡N¨KÈ·´ÃRyP&e0uÜ©#iäâ©—Ö”vP<ÿüóSí ¥¬Äî젘ã›,èÓXÛ nÌ)1iN‰Åzå>³¢8è‹ñÁ‡íÐ)ãgæ!Õa ’‰(,Ý­³È¹nH¦ámY#s¨©5Ñí·ßÞî HGŸJ§ŒÌ!Û&‡® Á2å¥&iî Jî†n5u·Féwi›„_âo’R;ì0;²ÁÍ“N…Ó©G#GޤÿFY?¡'Z)Iä6Çܽ¬½¢ãR·ˆ8¶¿êß9ËPñ¥Óê8‘Œ¥žQ“JÖH¨Ôi†×C† !@¶„ùÙSðOS†d’þ"TXâÀ鈿/¸=WM‘/‰¤´–†áÍ?ÿüBj$«Ž§Ú!FPvVâa·vPL5cÞâ‚>¨KvJtJ@æšz«YÉ:0È»M.åtÆì¢ó?x¦ìüO,2‡ƒã€Éæ:R»ut'µ„yÌ1ÇèjЬI÷J§°®n±f¥,oÞ­ÝìRéôý÷ß/1åØ,A©Ó=Y."ÚðB3ãÜæÁ¤›ÈiÀ,MËœ;#taé],Oß(ñáÕƒEt\Âü×þªg-Ýe¨¬ñ±;(vwÍü$–£¿ÒUcN‰©äMX™oPQbéW†™Ÿo‚¬}.%<Œ˜m„¹;hM°ÍnÝŽÌ´[¶$‘‘Õv5NãÐCMåR8ÉÑüÐ51fæ¸Ê­ÑDA©®òÔEIDüá@²ë<•þ·6µéȆ©pEÌ4~Û—Ûe¨ðcÜzàŽÒU¯ñ±#¹ýÕþµƒ"&ÛÅSG0¼Why Ò<ˆ‹ˆ`—ÔÀÊ`E±ÒFȉLŽ P-â’GYâ ¥BKLÖà•·Æþfê Ǩ°ÌTSD/f­™ßÝSM±4ý•¶Š®œÈì¡S¢ÊJ§Ä®a›e!khÄÌ/¶Ã¢z.‹õ®ºêªv^…^žá1vè” IË–L¸¯»îº:2G.ó†¦Òi3wPÌšçÉÙ§eë7WPÊ­3 ˜º\*´Âª²mQûsÖˆ<ÛKú&(¾¢üâŒþ@)!ºØ™Ú DãÕ_í,1µƒbC–¡²öÇp³÷¦¹sÞž—ÕòS+1ì¤}#”˜+Yn¹ålÞ>Kâ}yÄ}^Й­`ÅV4Í4ÓÈ#L>ùä$¦Ú!ö©»ãÏÛœÄC5Eú§vè¯%?6°€SbsVæÌ”ØÎ«/khÄ:© ß– XÖ€<äCXI×ò˜ Ô%1¼å¡ÏH, óQ–0٢﷿ý­ÔŒ·ˆ‘y*²Ë_$;82—ýxÛiÙ¦ Jy¶¬àtúÝ e%&KØÊ2i‚ˆ ñ%EŸþžcbÎô`BM3bÅ&ëí¯ú7ßÛýÔøš³ U0”Éß|©slø¹ÈØ©²rÊ)§¬PVbЬ.Î ÛFeà>gp/îó;ä'Â%­¥1^_~ùåå¶!ÁwÜ1Õù’Ÿ”%íc6aÅÔT°6é¯áö–s{ù”•è€SOqJ,w>h)±7ˆiF¦¤Sé”A5ËóUeÃ8ŒØœÆNErQ‰³”°õ:…aH²„ɺŽÌùƒÿ¦Ò)/> â4ÄÂ+Ùb`J¬V–gKy¤Í°?,ƒaGU&Âà†¥­Ûœ¥^ð1(¾"}—Ȩe¯¦¤õ é[_•‰'ž˜ÌDû«þMˆ.‚85®‚¢»¾kg’I™ææÙÛ!‘8—vÉ^£ÿ˜Sfd\•RÏÅ_Ì*âVËMX¯>H¡BE•Ž950âqÙü׿þµœ Áar©¦È2“M6Y’þX3¿òªèo@[cKJÄr*´C§Ä¬È§ÄvÞ#è%5ý.b“2 *´aª:ꨣVYe»^O0P×gW ]³l‰ÆÐ­øxãéLåR¾Üj«­”uƒ‘yÓB×°j"ªZcÀJifÙÔ$u!Pš où©§žšº};_²_òÎúЏÝ9÷ƒÍ±Ô9‘zô½Š aR, dµ“îê jÔ2T–CÁ ªiî|–¤)³†×° ƒgmwTÚÙPy–`O¸X6 C^°D…50ÂÃ̈)Î>ûìl³”jŠä†/´ÐBI)‰ƒ¼9kæ[;dTS|¡Ývººq®SbbMeœ+yG஬€á%ÆÒô¶¥i3ëDrp“u& ä‰X鿦&á’º4 ô}*ò ʺ–T›§Á{A÷Qá<Ï”ÒØ@€§0ÕUΗ¬½L……*I·lÓX Ÿé’¡DbÁë0E§Äh0 ¼g‘•©[œ`cLþ@z¸ë°aÙ,‘IN%LúqÝ„‚þ^>•KáX\›Y¡kZ¬WYšŒõ:æ° To%öGtcªÃûcï#ÆYÛ•û^®E€š„‹1±fá>ûì£ßÛ?ˆ]cÁ¿Ô¸ŠFí ä-Ú]MÈ>º%b̳b+± ~beþrö–u³0ÔÌRSjiºŸ F…Y¦š"^p»U¾8MÛAѦrWâÓ(ƒ©éf¤KΡD&RœËð;%Öd·¶Z&ÄHvÉšü¡·e{CFéÕÒ©JD¤Ð&]¶ ¹éµYB2•KùÒ¦{[ÒØÐ5R¹ë›oð‚R¬%v!kXÃÌ -ÞÁÔ}J|)vC\…äÜð_‚$pžë—öø=u}l&¾›é ÂÞ{›Žt€¹“2Y ­a$,hÏ uÖN›±¦¨‚Rmúé§ç*Ìà¤Ú!YK/½trè%kæ7jŸíï Só.¼„éJ\šSb9ᘚè”XÂÛ<…”¬Éxl±Å#›0–6³Ê‹ d¼-äÉ nü÷¿ÿû¿ uK¥ScŸzê©“tÊȼ™¡kÌ`Ô=ߨ#‚R¬ÍI«°;"M6;á¿ôåúþA’뵦Ú\—¡‚FÉkûꫯéý9ÃæL²²Ë»”;„=‰œƒ¤”ú \vÙe©žªî (6‡”ô‰Åj T–CgYŠäˆB¾aNgذaÄ唳CB$©„D15<”¤5E†.àkï¤;(Š)"%Kl#[mÛõXmPbêÖGbN‰©ŽL§ÄF½ù“?˜ñüóÏÏÎà帔³Øƒ›JØî9_Êéœ(‡J²Ëõ‡ÿó?ÿ3)#»@´ÏæÔ÷¾åÇ´IwÎL4(±v¨‚R #A)ß$Ãîàhfâ!`„Šûw}¦%æÄc%:Ô)‘83§Äúì°šó'°a'Ö[o=FP±tª‚RÈ“w”Ê®lžºFŠwUÁUÕÃp)ÙáÉÆ^”bµØñaY!êÒÑâ¾&Þ(uO÷Ô/å,"&å` ”ò÷¤“Nšì›¹ {®ø’~í°[ñs%#ÇK„Í0wCô7ëM4EÒ¼8‹EtÕEPb„„K²jjâa3wPdFÆ¥dqsj§¤PbVx¥S¢Sb;ÖÕ™s™ü!ç:+kGl˜€u$ ñ<éT%‹ú 2‡ÉÇgþf ÍÙAÑ]ãµÚR›•·tö8%¶‰°Ÿ^7Ìn“4““)>Ë¥–ZŠsVcµt*‚òØc…N³ºF¤/K²4jX>x¥Xv‘P ŒŒNQ–˜ ØŸJþË¢ÉáKCˆ¦óþøã›fpuÊÀ­¿HwޱÁz¬dÎØ¡Jf^V[mµÔpɆ¬™Ï&7l™ØÝ¹˜k¾s§Äî—«–-ÖaN8s‘Ea/Q–"(Þë¾µ¶s—е®/Ö‹$Ó;ÍŒXì‚Ò†b0²ÉÏÝ‘ÁÍ’K.™‘òM×wPTÙLk«œ8z¯BºsòÃr½RÛ›|òÉ%N\vôŽ®ï ("’ÉÄ&LÄôžtà‰á8%vg¿D}HÀzËùÈsÞyç%Ô?þýßÿ=I§Ý ]SÙüuy]P†ÆÌʸ|Š˜``v]ñI¦6‘‘x"]DÖGL¯eITP~ÎDêÀ¦[rÂ"1E’µ]DvÞZj½¢Sb­ðzå@€ì\ùA–©tÊÈœ,ïªr‹×—2Áˆ'²ù"Ò6Ÿ ÊLcÆIß)b‚[ š˜ t}6‰±L ºï§LÔõKÈô ñ¾ùAâ ïLâ!#føîÓO?űCÉtÝH:sN‰ÁÙ¯RpS@ùË·‰²ìØÈœU~ SæsÐi£b"cÂekÄp›gÍB’-Ž©u^Âh–¾"ZœYÈÿø_'ÓÄøÂ•m_Ä+pZ#à”Ø#/Ñld (u†î¸3áÛf?AïÎeD«Ì<óæ“L²ˆÌB2'NpFÝ[­GÜœ4œvÚ-SO½Úüó/-$ánƒæéýA„ÀKì %.¸àÂN‰ j¿•6ÚèÈÉ&[zñÅ—AGâ!b.­S—€ ÊkøË_väq‚uj@A‰òo u{•Ž@+¬p ¦È|]Ä9^Ôh[lq"6üį5é¦꽸 Œh9”`yÑÚpAY´^q.(ãðòÒÍCÀe…mâ‚2L”`yÑÚpAY´^q.(ãðòÒÍCÀe…mâ‚2L”`yÑÚpAY´^q.(ãðòÒÍCÀe…mâ‚2L”`yÑÚpAY´^q.(ãðòÒÍCÀe…mâ‚2L”`yÑÚpAY´^q.(ãðòÒÍCÀe…mâ‚2L”`yÑÚpAY´^q.(ãðòÒÍCÀe…mâ‚2L”`yÑÚpAY´^q.(ãðòÒÍCÀe…mâ‚2L”`yÑÚpAY´^q.(ãðòÒÍCÀe…mâ‚2L”`yÑÚpAY´^q.(ãðòÒÍCÀe…mâ‚2L”`yÑÚpAY´^q.(ãðòÒÍCÀe…mâ‚2L”`yÑÚpAY´^q.(ãðòÒÍCÀe…mâ‚2L”`yÑÚpAY´^q.(ãðòÒÍCÀe…mâ‚2L”`yÑÚpAY´^q.(ãðòÒÍCÀe…mâ‚2L”`yÑÚpAY´^q.(ãðòÒÍCÀe…mâ‚2L”`yÑÚpAY´^q.(ãðòÒÍCÀe…mâ‚2L”`yÑÚpAY´^q.(ãðòÒÍCÀe…mâ‚2L”`yÑÚpAY´^q.(ãðòÒÍCÀe…mâ‚2L”`yÑÚpAY´^q.(ãðòÒÍCÀe…mâ‚2L”`yÑÚpAY´^q.(ãðòÒÍCÀe…mâ‚2L”`yÑÚpAY´^q.(ãðòÒÍCÀe…mâ‚2L”`yÑÚpAY´^q.(ãðòÒÍCÀe…mâ‚2L”`yÑÚpAY´^q.(ãðòÒÍCÀe…mâ‚2L”`yÑÚpAY´^q.(ãðòÒÍCÀe…mâ‚2L”`yÑÚpAY´^q.(ãðòÒÍCÀe…mâ‚2L”`yÑÚpAY´^q.(ãðòÒÍCÀe…mâ‚2L”`yÑÚpAY´^q.(ãðòÒÍCÀe…mâ‚2L”`yÑÚpAY´^q.(ãðòÒÍCÀe…mâ‚2L”`yÑÚpAY´^q.(ãðòÒÍCÀe…mâ‚2L”`yÑÚpAY´^q.(ãðòÒÍCÀe…mâ‚2L”`yÑÚpAY´^q.(ãðòÒÍCÀe…mâ‚2L”`yÑÚpAY´^q.(ãðòÒÍCÀe…mâ‚2L”`yÑÚpAY´^q.(ãðòÒÍCÀe…mâ‚2L”`yÑÚpAY´^q.(ãðòÒÍCÀe…mâ‚2L”`yÑÚpAY´^q.(ãðòÒÍCÀe…mâ‚2L”`yÑÚpAY´^q.(ãðòÒÍCÀe…mâ‚2L”`yÑÚpAY´^q.(ãðòÒÍCÀe…mâ‚2L”`yÑÚpAY´^q.(ãðòÒÍCÀe…mâ‚2L”`yÑÚpAY´^q.(ãðòÒÍCÀe…mâ‚2L”`yÑÚpAY´^q.(ãðòÒÍCÀe…mâ‚2L”`yÑÚpAY´^q.(ãðòÒÍCÀe…mâ‚2L”`yÑÚpAY´^q.(ãðòÒÍCÀe…mâ‚2L”`yÑÚpAY´^q.(ãðòÒÍCÀe…mâ‚2L”`yÑÚpAY´^q.(ãðòÒÍCÀe…mâ‚2L”`yÑÚpAY´^q.(ãðòÒÍCÀe…mâ‚2L”`yÑÚpAY´^q.(ãðòÒÍCÀe…mâ‚2L”`yÑÚpAY´^q.(ãðòÒÍCÀe…mâ‚2L”`yÑÚpAY´^q.(ãðòÒÍCÀe…mâ‚2L”`yÑÚpAY´^q.(ãðòÒÍCÀe…mâ‚2L”`yÑÚpAY´^q.(ãðòÒÍCÀe…mâ‚2L”`yÑÚpAY´^q.(ãðòÒÍCÀe…mâ‚2L”`yÑÚpAY´^q.(ãðòÒÍCÀe…mâ‚2L”`yÑÚpAY´^q.(ãðòÒÍCÀe…mâ‚2L”`yÑÚpAY´^q.(ãðòÒÍCÀe…mâ‚2L”`yÑÚpAY´^q.(ãðòÒÍCÀe…mâ‚2L”`yÑÚpAY´^q.(ãðòÒÍCÀe…mâ‚2L”`yÑÚpAY´^q.(ãðòÒÍCÀe…mâ‚2L”`yÑÚpAY´^q.(ãðòÒÍCÀe…mâ‚2L”`yÑÚpAY´^q.(ãðòÒÍCÀe…mâ‚2L”`yÑÚpAY´^q.(ãðòÒÍCÀe…mâ‚2L”`yÑÚpAY´^q.(ãðòÒÍCÀe…mâ‚2L”`yÑÚpAY´^q.(ãðòÒÍCÀe…mâ‚2L”`yÑÚpAY´^q.(ãðòÒÍCÀe…mâ‚2L”`yÑÚpAY´^q.(ãðòÒÍCÀe…mâ‚2L”`yÑÚpAY´^q.(ãðòÒÍCÀe…mâ‚2L”`yÑÚpAY´^q.(ãðòÒÍCÀe…mâ‚2L”`yÑÚpAY´^q.(ãðòÒÍCÀe…mâ‚2L”`yÑÚpAY´^q.(ãðòÒÍCÀe…mâ‚2L”`yÑÚpAY´^q.(ãðòÒÍCÀe…mâ‚2L”`yÑÚpAY´^q.(ãðòÒÍCÀe…mâ‚2L”`yÑÚpAY´^q.(ãðòÒÍCÀe…mâ‚2L”`yÑÚpAY´^q.(ãðòÒÍCÀe…mâ‚2L”`yÑÚpAY´^q.(ãðòÒÍCÀe…mâ‚2L”`yÑÚpAY´^q.(ãðòÒÍCÀe…mâ‚2L”`yÑÚpAY´^q.(ãðòÒÍCÀe…mâ‚2L”`yÑÚpAY´^q.(ãðòÒÍCÀe…mâ‚2L”`yÑÚpAY´^q.(ãðòÒÍCÀe…mâ‚2L”`yÑÚpAY´^q.(ãðòÒÍCÀe…mâ‚2L”`yÑÚpAY´^q.(ãðòÒÍCÀe…mâ‚2L”`yÑÚpAY´^q.(ãðòÒÍCÀe…mâ‚2L”`yÑÚpAY´^q.(ãðòÒÍCÀe…mâ‚2L”`yÑÚpAY´^q.(ãðòÒÍCÀe…mâ‚2L”`yÑÚpAY´^q.(ãðòÒÍCÀe…mâ‚2L”`yÑÚpAY´^q.(ãðòÒÍCÀe…mâ‚2L”`yÑÚpAY´^q.(ãðòÒÍCÀe…mâ‚2L”`yÑÚpAY´^q.(ãðòÒÍCÀe…mâ‚2L”`yÑÚpAY´^q.(ãðòÒÍCÀe…mâ‚2L”`yÑÚpAY´^q.(ãðòÒÍCÀe…mâ‚2L”`yÑÚpAY´^q.(ãðòÒÍCÀe…mâ‚2L”`yÑÚpAY´^q.(ãðòÒÍCÀe…mâ‚2L”`yÑÚpAY´^q.(ãðòÒÍCÀe…mâ‚2L”`yÑÚpAY´^q.(ãðòÒÍCÀe…mâ‚2L”`yÑÚpAY´^q.(ãðòÒÍCÀe…mâ‚2L”`yÑÚpAY´^q.(ãðòÒÍCÀe…mâ‚2L”`yÑÚpAY´^q.(ãðòÒÍCÀe…mâ‚2L”`yÑÚpAY´^q.(ãðòÒÍCÀe…mâ‚2L”`yÑÚpAY´^q.(ãðòÒÍCÀe…mâ‚2L”`yÑÚpAY´^q.(ãðòÒÍCÀe…mâ‚2L”`yÑÚpAY´^q.(ãðòÒÍCÀe…mâ‚2L”`yÑÚpAY´^q.(ãðòÒÍCÀe…mâ‚2L”`yÑÚpAY´^q.(ãðòÒÍCÀe…mâ‚2L”`yÑÚpAY´^q.(ãðòÒÍCÀe…mâ‚2L”`yÑÚpAY´^q.(ãðòÒÍCÀe…mâ‚2L”`yÑÚpAY´^q.(ãðòÒÍCÀe…mÒ,AùÔSO|ðÁk¬±Æ<Æc">¼5¿©A„À”SNòï zfÔF"0ÖX“`ŠsÍ5w#ïÎoÊhÀøãO Ï2Ë_Zm|‰VXaï½÷¾ë®»*ÔˆQU5EP¾ôÒKsÌ1Ç¿ùá8Ž€#à8Ž€#P©¦šê¦›nŠÒ‚•n„ Ä+ù«_ýª,t~ž#à8Ž€#à8ŽÀh6Ø`ƒ¿ýío•(Å‚•t_Pâ¡upGÀpGÀ¨&Á jÁJŠuYPžtÒIv¿þÝxS/´úÜëí±ØöÇûÇpGÀpG ù†ì7íâëŽùû?š ?e%b±H%Ý”ÌñO>Ãëmpü½CNyØ?Ž€#à8Ž€#à8Q̱Úv¿øßXq…箈l¿L×%SûÄÚg^`ÿnvú#þqGÀpGÀ(‚Àz‡Þ²ÌƧ,¼Â!K¬uÌÊ;\È)Ëî|Òÿû÷_¨¾"GåÃ?l_/¶¬¡k‚’D«&ç\eË­ÎzÔ?Ž€#à8Ž€#à8EXkËç˜kgY$[>K¬qÔ–§?¼ÜíÄb5Æ–r°ýÝ”ˆe›Ö=öÄSlîcþqGÀpGÀ(‚Àƒo¹çžç=ñÄkW\ñà"‹ìÉ—\óhNŸfÞe¬¦dïö%c~ Ý”G}´}Î ¼p—óŸð#à8Ž€#à8Ž@Kv8ã¡yÜùxôÑרÎ1âýyçÆ—ëïqÙ–'ÜúKLÙ'ewåïÿ{”3/²Êî=éGÀpGÀp"¬½ÃyÇÕV;ôÇÿa‡]tßϻлžÿø"ëíÔÉHÊ.Ê«®ºÊº'7;ôâ½/yÊ?Ž€#à8Ž€#à8-øë…OÌ·PŸ{’™îä4ôºëÙç¤váç?ò«ÿñMîJ­³Þ]”쇩‚r¢)¦?àògüã8ÝE`¯ózØEQŸí޽¶ø=KÍ\¥ø)ƒ°$ø,ºÖÖ|´9Z‚¬MV¼¤+ç&OlÇ ¼¡¡Ýú#wÍö¹ɈpLˆwßý¿.¸ØÞÜØ\ˬ£ŠëücO JV ²é8«n½ÿ!W=ëGÀè.‹¯½Mìö œz¦Ô{Þtÿ3‚ï·>âb©œ«t÷1»{õ=μc¿‹ι‡å7Ý”ÆoâN¸NãïœòZ¬eIm[!sbÐŽZ² =ØÓ½¡»k`~õÁƒÀrk…d¼þúG³âRKíC]O¾{Ç㯱ïòK/½TŸ¦ì´‡ò®»î²ÏvÀEyíóþqî"°ÔºÛZl’?ÏÜó®']?Ýœ '¿ßþ¨Kå,®ÒÝÇìâÕyö±ÆÿPäÜèÒ_]‰2ÐrNYi³=l«å”Ôö]`Å ôäA{ic´{º7t Ì/=x8øÒ'çœ{ôâ×_Ÿ¥÷Ûïb l´óùÀ2Á¤£×ü®uÖ»Ó‚r»í¶Sžš|ºÙ޽þÿ8Ž@×Xf½~A9öø˜ôÏ3ù̹ØÊÁms.o7çßï|L¿ ä*]Ү܀ 97 n}ðÙ”^¡ÊЦŸs+ûZiìÊi))•Ë'µ½´± Z‚5oè®X—_t°!°ÝW#·ØâÄ_ヾD™åV;pX~=% b{ÇC9ãŒ3êƒ-¿áö'Þô¢G ë,·~ÿHïOÓÌ\úfÆ™ O%kØõØËä­ç*¥+Ð'*¼@‘õ Ûz6¡Ø`çC´çZ$ë|®ÅWÎB^O”Z¹|ÏÍðÙçômýÚXå,Aê<úÊÇt{ùÍ;MF`ÃmÏB,žsÎ9ÒÔoÊÌ5÷.<Èf{gGž_|ñEMš²£J(íSíú§Ýò²G ë¬¸ÁöònN6í,¥oFTK²†=¿B*ç*¥+Ð'*¼@‘õ ‹¯²‘EîS˜zÊN‡Ÿ+¨Ùå°™æ^Tô"g% +þE7ªð€n¿yG`€"°ì*‡"ñAæëBÉõ>äì†_ñ¨•^=ôP/Jj·Ouöí#üã8M@`åúåÓÎRú~Æ%(“5ìsâ•òâs•Ò•è^ ÈzAÏB$ßprö-ɳ–\m?Qæ˜Kï_w뽤䦻ž,©W/‚¿6V;–0 ËoÞh8øó(E/zèåÛí°kyœñ&šTÕ×YgÕ ‚Ò®@9þÄ“žç+þq& °Ú„n¦œn–Øû9ý†§9Ïï'ü#5ð¯üwýmö–ªö?¹_Pò%ÿÝã¨óXjUŠÉ‡+Ê÷9Ÿã/{€S(©gÍ:Ï¢[ìvxê)z?üA½§ìpÀI|à~øÉÞÞyÎ-qÏö~ø;õ,¾¤$õ ¼K¯6DÀ‘{Ó(èqî­ú%…å¬Ô'U´)ÏYR’ %ï™{“_må š)h¬v,Hc­ÈË;Ž@N¼â dâ +ØR²#%·Ùã"ªežÑñÖ»îºkËsËèè”7éEª‘gœ}¾KîyÕ?Ž€#ÐÖØ¤_PN5ݬ±÷sð©?Ûª@ßq­J p•eרX Ø?(|Ìù·¦^šSÆ%¶’Çìó.–J~Õ?òï‡bz·']|‡­™ÿê­jmZ@ï6‰€Â›| 9]ªMÖIUòøA£Ì9ÿâÁ÷À(·ÍµR1LVžÚ^ N KÐsƒ{(mQ~¢#à~ÊíÈD–™l©ùž{;×î#@å(¢¾ýrº&(·vÀM¼éGÀhëoÑ/(¡› &úcËÏ\ ,ž¼mÎâôif˜5øéØsF ʽ8-yââË­.bˆÛ°¿J…‡žtQ*J\K œ~ÙZÀ^nç}ŽNžh ¤Öœu?øŒ’K/×§µŽ>£?6øýïßòÜr:*(§šjôrí;ï}Äí¿åGÀh ÝYÝrEþ˜vÆÙ’·=ÁÄ“pnò§ÏëßH©»ë~GËE¹ -pä)ý6γàâYm½Ë~râjënªeZ^®e­ÖÞõËf=ξ²'°…—K'Ÿ…›OÅ’z«©È}ÚÚ¸hòö²E'¸U½bK3Hâ ç¸5ÁÂýÞ@`¯ƒúvñ>í´[Zj>öÑ¡äKí˃Ÿíýönyn¹”8Zõ‘8ò´{ž|Ç?Ž€#Ð6Ùry7'œx’éfœ­ågéÖHÞ6çRç?zÁ Ryò')©¸ =wõú£Èí—AÍç_uw²æâ—‹ºŸá§^’ÿroÿÚ[Ux¹·$nܧ𼩖DU‘áñS¯²ÇÇÈ÷ŠOjå©í¥èµ´„y\"«¡sš¬ Öî÷à \öÜÿ2d"ÜE4%ùð°—\ÿ ”, ^äôØ2]”ÇŸqéϼëGÀh›mÝ/(§Ÿi¶Ò÷3Ñ(-•¬áÌ‹n.ã*©•§ 9‹?r>R†KkÍå.go,µ…ˆkåÜ€ÀA%Z§žk¿Ô_å”ÔŸ(#8ØL~#Uém/³âòÍ» 7“Ê·©í¥•”°„–È—6-?Ñp­¶?HwµÇêBæ¬ËozÈ Ê7ß|³Èé±eº&(‡ŸvɽO½ãGÀh›l5ZP–¾ñx!D‚N»°ßCÉUR+O- ‚Òò`Öß\Zk.w9{c©5(DEî‡2T¢uê¹öKùuÏŽ¡°½ÿ¢íwÝ_®(ç^uÛã‚3Nâ$˜ê•Ÿæ[h‰œÊSÛKŸ=ÙŽ- £%ò-kðŽ€#Àv;Ÿ]\P.²Èž¦ÂKoø™‡²×åžwÇãoûÇpš€ÀŸb(‰¨+}?®ÔpÒy׋$â*©•§ˆ@þhù!ÎRk.w9{c©5(DÊqÔ)—$Á¤~â/½ù1~Íj91õW}ö–ÐùÒ¦å':Ž€ °û~—¢/ºèž"îCJÎ=÷.œuÁµØ‘p‘sK”騇Ò.´ã^‡ßòè›þq& °ÁOYÞÓÎ8kéû‘¬ád ÇŸÛŸåÍUR+O-@=€üuKå.g/‘ZƒB”õ97©ç&ŸE@Ûrç}sN·À.1*#žoRËï²ozÓá']tÆåw €Y•§¶—>{ Kh‰|T;zaGÀH"°Ï¡WLÊ9òkJ.¾d·sæè,o8¡„X,rJ]õ¦^Û Êíö<ìú‡Þð#à4õ6½eéûÑu ƒŽ9«_Pr•ÔÊS ¬ôÓŠ9YgeÝg¹ËÙÚRk8ø„þ…Y 1"…—ší¹8!wp;÷º‡sêÔU')“²œN=R€+nþÓ*ž\%µòÔªôÙKlV ¶Ý[‡ üœ»ÀRýêŠ+Vr9­$ë~Ž<ïVyF®ܽÛ…78Kj §B¤×„sl†Ú4þºûáY…¥NZ<½àû"VÚ²¡‹TâeG “¯|™¸îºG¶œ•fi¡¾½¼‡žJmK®²ÒÂk¬ÑòÜr::å}ÓM7é#7ѤçÜ>Â?Ž€#ÐVÙh{«B þ½ï‰WÚ›ŸbÚYôÄq'øÿ•_)&ßs•Ô‡Í)0ÿ’«Ø:—\m•ð%õë÷»yž­¶Ëµ¼áÍv=ÜÞwÂýpWö~’ÉÚ³(L=ò%1‹Ã,ó,šŠÞ  ¿ôþ¬ÂRL›)xöàû"7Ùù"•xGÀÈAफžF&.µÔ>-5ß9çÜAÉ­v¿Úf™{¥ ƒ>¸å¹å tTP¾ôÒK¶£:ãÖ—ýã8M@`¥ ËʽN¸ÂÞüÖûžhu˯“Ÿ«¤>l~βÕZ™|ÚYv9üÜ Î6/×ò†ƒÇ´÷Ã}®½Õ_SŸ‘[µ%y¨y—èÓÊ|_Ä6v˜žÎßù§èµò+Tƒ2Š^Á³wÒù"OêeG G­.Iw¾ìÛe—³(¶û‘7P.<%«®ºªœ^lyVG%»ýXJÝáÐsN¾é%ÿ8Ž@×àe\~ýíb?ï|"¸ó}O¿iÑ•7šlšYøð‡à_©9ë•oYàÐ î]cè_¥Úq&øÿÎ8×"î|h*n-kk¿×åê܃Þp‡ÜgNSR@Náß¡{Ÿ çòeÁÖ×ÖIÂÔ ­ÉUr*— ƒPpŠß˜^¢%°ŸÔ‹9Ž@«­,JñËWxx1ûòÁÏ{è¨Ëý÷_üRÕ®½–Ò°\Ž JnqÆgÔ§Zr­¡ÇÝð‚GÀpGÀpŠ °É.ç£O8á†Ù'kÍ;ÿnT¸Á°Ñ:¿ÿýïˉÅ"guZPî½÷è(û &êèkŸ÷#à8Ž€#à8Ž@v;îvÄâj«š#ò®¸âAʬ¼Þ±T8Ó¼Kª#Õ‹HÃre:-(Ÿzê);ëý׳î:ìêçüã8Ž€#à8Ž€#Pùî £|ë­³”ßvÛFÍ÷ºü Kÿÿþó7ª»Î:ë¬rb±ÈY”Ü‹jê³-¶Î¶^ñŒGÀpGÀpŠ °Ê“r6`üñÇÌ;ï0 ìqæk½\#Òë‹/¾(" ˕邠´Ë›ÿרãïséÓþqGÀpGÀ(‚ÀvÃo“ŃЎIñwÑE÷ðërkCU“Í8·ºðØþºœR,xVe0ë½æ®ÇïyÑ“þqGÀpGÀ(‚À"Ë€jD;jï믿—üî-¿i»“n³A†]tQAiX®X%7ŠLÖ‡œxêY†]ð„GÀpGÀpŠ 0d¿kúò¸çFB·Õûíw1ß/¼ÌT2ëk©Ö"¿›¥Ë)Å‚guGP"“­j^zèA;œû¸GÀpGÀpŠ °ØJ‡Ê6Œx%EóÉî8sεófGݾîZ¡E´aA]XºXw%2±¬úcþnËÓîßæìGýã8Ž€#à8Ž€#Ð-N¼wž÷`J–¥”Ìn>«l{çþþOÓªÊúÕ¯~õᇖVŠOìŽ äæØüÇjçIfš‹3ñ#à8Ž€#à8Ž@†sç‚Kï/:²_Mîx!'ÎºÜÆVb±xAQØN±® Jnz‰%–°<Å\Ko|êÃþqGÀpGÀ(ˆÀšû^·Üg®²ëe ¿›SæXm;+®X«±îèI‘¡Ý”l(ù_ÿõ_ö±ÇždÚ÷¹xƒ“ò#à8Ž€#à8Ž@qV?ìú‰gœÏÊ*þ¾ë®»Úñ;?·›‚’»|衇˜Úþ¿'œ|ÜÉgò#à8Ž€#à8Ž@Æšdš@MñßZ·Æ ´f—%wsÓM7%5eÿÆpGÀpG  |pqÿbû%»/(yü±SM5UA€¼˜#à8Ž€#à8Ž@ÄvÒ7ÙýJ+‡‰Ýu×]ƒJ·GÀpGÀpâl¾ùæX$(éÑl„‡ÒÞQ•'t)î~8Ž@i\p• &˜s­µ6)]ƒŸè8Ž€#0€8úè£;–“:?Þ8AÙþ,¾×à8²ûÖõ×?êP8Ž€#à8@Àe@öK8FÀe§÷ë9Ž€#0¸pA9¸Ûߟ¾GpAÙ£ ëå8Ž@CpAÙІñÛrÚAÀe;èù¹Ž€#à8±¸ ŒEÌË;” ‘üGÀè!\PöPcú£8?!à‚ÒmÁpG “¸ ì$Ú~-G C¸ ìÐ~GÀpQ¸ tCpz”=بþHŽ€#à4” n¿5G ,.(Ë"çç9Ž€#à”AÀeÔüG á¸ lxùí9Ž€#Ðc¸ ì±õÇqú?œÚG˜IDATpAévà8Ž€#ÐI\Pvm¿–#Ð!\Pvh¿Œ#à8ŽÀ(\Pº!8=ˆ€ ÊlT$GÀpŒ€ Ê7Žßš#P”e‘óóGÀpÊ à‚² j~Ž#Ðp\P6¼üöGÀè1\PöXƒúã8}¸ t;pGÀè$.(;‰¶_Ëè.(;´_ÆpG`.(ÝDÀe6ª?’#à8 FÀeƒÇoÍ(‹€ ʲÈùyŽ€#à8epAY5?Çh8.(Þ@~{Ž€#àô.({¬Aýq>\Pº8Ž€#àt”DÛ¯åt”Ú/ã8Ž€#0 ”nŽ@"à‚²ÕÉp#à‚²Áã·æ”EÀeYäüçÞºï0$¥!iã^ ` JÆm@@ú @(Ñ@À @(ͰQQ%1¥ˆEM @(5%‡ó@@4!¡Ô„ΑPW(KKK׬YcccÓÓÓ#òª¡x  "$¡a£ H  -áBY[[;gΜÿûûsçw’Vj{{œ  1J‰58ª+ B„²¥¥…F%o¾ùfÖ&Ù/ãÇ÷ðð*Ô@@@ ”:€ˆK€€Ø¨Ê={öÐ`¤¼Jryíµ×BCCÅV5”@@@„ ”"l ´% D(ièñ¾ûîS®’Ü2eJjjª¶Âù  fMBiÖÍ‹ÊI•¯PÒpã„ xUòÛ/§¤D{ÙžØõøcóðÃ?ÐÛ–Rʼnzƒ€¨ ¡D3$ #”¹¹¹4ÐÈkŠï¾õJ¨ŸCeA4‡ö¬s÷]òÓÛ–óçϧ7/ͪ   ¥vüp6ˆ’+”2‹¸¹šøÌøÇ]ìVÆðÆÚ¿q‡¼V6Œ–ò »(›…£€P =n ú#@BùÜs¿~õÕO¼‹¸ï¹û®‡·UÆ*â¬ð…¿Í´´´×JZÐCËzôW~\@@À´@(M«½PZDà½÷¾0`°¼Ò ãÚó«Šâ„GjìùY3¦4Pþj´¸ÇÑÑQPp€€€Y€Pšuó¢rÒ# h7áÂy³rS«‹ã4ˆ¸pÏ?yŸ÷-LJZ‰ìBÒëh¨1€Ü@B‰fB@Ù"¥Æ]¨.Ž×2¼m'¿ý*¯VRÒJd2“ž„j€€€ú ”ê3à 2JqO~çÕˆ@çš’†«ƒÕ³OãÕJZKNÛ‚‹ Š   wJ½#Æ @@”,âž8áYW‡#5%‰z ë#;z?A:mޤ•úkt\@DHB)ÂFA‘@@5%;q“çYÙYS’d€Ø³}ÍH¾ìB´ºœ² !i¥ê†Ä  ` ”fÑŒ¨„”PHJÙCù å'Éí¶m\V[šdÈ(Ë‹Y¿j¡¥åÞ¤•TT$­”R÷D]A$JB)цGµM”¥éá݉›|nÑï?—åÅÖ–&%òÓÃ~›ûov!JZiccc¢ÀQl! ”B(á0>ZÄM zx—ÂüüãW‰ue)F*Æ÷_Ê[ÈG}”RŸ#J   J=@Å%A@§(ÏäÉ“y-í½w^OŒ:_W–*ª "QÁeBÒJö\ @DAB)Šf@!@€—­•þá‡xÍlâ„çΟ;SWž&Úòu¢B*Ê.„¤•èó  `N ”æÔš¨‹ù õÑK—.å݉ûáï?u|O}EºI„‡ÓÉqÿ“W+É•‘´Ò|º,j mJi·?j/>Jqß¾y¥Ix¤L!ÜvϘÑòZIÆ<þ|d_7D‰@@@=JõxáhÐ+E‹¸‡ZùcÁÜŠ¢ÄúÊ Ó k–Œ1œ7»%­Dv!½v-\@ôJB©W¼¸8% l÷¬o2SBL×#¹%''&3&?–×JÊ.DI+…òÂq  b"¡Sk ,’$ l÷»o$Çú7TfšYfÇÌžõí Aƒäµ’²lÒ0­$;*  &LBi‡¢›:%‹¸_zñy_/û†ª,3råéŸOá]¯C7}}}M½}Q~¥tÚ5e‹¸ºÿô‰}fì‘2U ñw}oò›Š’V"»ˆz-Š Š @(Ñ;@À ”-â9|ÇÖÕ«³%ç\OÑ ¬¢¤•È.dÐ>Š›€€ú ”ê3à  )%‹¸/ú¥ª4õbMŽ”ã´õ‡z€W+çÌ™Coh ç€è—„R¿|qu`(YÄ=û§ï²Ó"/Öä"öl9’'»%­¤dïHZ‰g @DHB)ÂFA‘ÌŠ€’EÜÿžüVJBpcmB†@uYúÆõˆZZÊVÒzd¬4«'•0 J³hFTB””-âžø/?'x¤rÅù Ký*Ÿ]ÈÃÃC” ŽB€€t @(¥Ûö¨¹þ(YÄýĸÇlm5Õå#È͈þiÖ îP¥þÚWЀ„Rh8Pºˆ{ÄÁ}[›ê  tµ7\¿~­¾"óΑ·±N ¡Ä b#¡[‹ <&L€D‡ö”íoèPËU+þ¨)Ïjª+D$ÐÞRsíÚÕæúâxÿþv‹F ÿßû”J~HPt3%¡4Ó†Eµ K€¶u¡Å"ò*IïÿÍýyFiAJs}B ¶¦Š«W.u¶5¤Gž tX`¿BiØîŒ»€€Ú ”j#à À%@‹¸_{í5ÞÔ‰Ó¦|–NclZ/–_¹ÜÓÓÙ’—ätvyãR%70 J“h&RŒhû–éÓ§óªä¤—^ˆñni(F'p¹·³«ýbivh˜Ûº`§J1vz” @€P¢k€€Úh÷üùó)϶¼M>1n¬«“MËÅ„p=]-•…q1>;C]V‡8¯‚PªÝ)q€•„Ò¨øqsS#@‹¸·lÙ2lØ0y•9rÄ¡;Z.–"„èîljo®j¬É÷;æ¶>Ìu-„ÒÔž ”@ú@(Ñ@@(%‹¸×¬ú³®:¿µ± !@WÇÅëׯ¶6–§EœŽ8·)Ü}„RhGÄq  >Jñµ J$>ŠqßL‹¸çÌ,/Î$1B$ÐÞZ{íê•ζúì8—H¯­‘ž›!”âëò(€¨GB©/-5Jq2í£ÌÔ趦r„@-ÕW¯ôöv·¦ûEûìˆòÞ¡”Ú…ú‚˜+¥¹¶,ê¥-¥‹¸_Œ ó¥t‰¡Zª®\ê&•¬ÈŠ÷Ûs~„RÛŠóA@@L ”bj ”E”-â~âq7gÛ¶¦J„p—z:z:›kËÒƒŽÆùî½°B)ŽžŽR€€€Î@(u†2Jq9ÂêànZ’ŒN ·«µ«½‘öZ¤=ohÅ8¿ýJ3xLP'¡D¯¿(YĽvõ²†Ú’öæj„@ÝÍׯ_ko®É‰wI ´J8¡Ä“ fLBiÆ‹ª % d÷/sª*Ë¥Õ$º)е«ÝM…i¾IÁÇ’‚Ž@(…vD &KBi²M‡‚ë‚ÍqO™2…wûÄO§}œßÑRƒH «­þÚÕË4Í]––z29ä8„R× ¡4FBõG€¦¹åmòåIc"ƒ:[k‚ ÔS> K½Õʼn鑶©a6JýuZ\@DHB)ÂFA‘ G`Íš5\¡|ò‰q®­uá(©dCUvVœ3-¾I ?¡4\Æ@@@ ”âh”ÂH¸B9á™G;[ë \êéìéjii(ÍMôȈ¶O²ƒP©#ã¶  `dJ#7no\\¡œüêø˜s»éE@„J—º[iwGk]qF@V¬SfŒ#„Ò¸=wã€P—?înd\¡üpòK¡Nkc±(#° Å'?Ù B©ßN‰«ƒ€€ €Pš`£¡Èº# H(Ó"mc}öX/i®-êél–f\½Üs¹·³­©²4;Œ¶½)H½¡Ô]×Õ@@À¬@(ͪ9Qu (Êô(ûÄÀcçöΨ-N‘šPÒv7ׯ_ïj¿XY[œX”î¡T·káx¥¤š••% \(3¢Ó"l½Í.N êíj‘B\îé EܽÝmµe©%Y!%™AJ<6  * @(U"ÂæL@¥PfÆ8eÄ8ùXìw¬«í"mTm®q¹§ý:-½¹ÜÛP•S–^š ¡4箺€€N @(uŠ35B„2+Î%;Þ-ÜeS€Í’Æê½3·èíèSÉKÝ´çME~Ty^$„ÒÔ:2Ê  F&¡4ràöÆ% \(sÜSB¬=þ\”ìkNBI&y…'›«ª‹+ b ”*;d’‚ʹttt0—‘9‹ù1??_'WSyÍn§ò²8@@‚ ”ltTùÔÊÜÄsYq®§—Äzííh­¿ÔÓnÒqõê%–ìl«¯-K«*Н,Œ…Pª|6ÈÀþOÁçaÎgêÔ©¶¶¶J®¶iÓ&æ22NI× 'Mš¤²$Ü]MùEغ¨{;µÊ†ƒA$BB)‘†F5ù ¨+”yÉ^ù)>1Þ{lþ¬)J2Q¡¤Ô’ÿýïuÚ>±¾2«¦$‰Æ&!”Ÿ%B)ï™$jòcÌ ”ã0S!¡4•–B9õB@3¡ÌO½uÖÇê—h÷íÍÕ—z;L%hv›ò]êí¤Då´Ž»¦4B©VÇâ %ù"ï‡ed>ô×)!”jaÇÁ â'¡¡„z$ ±P¤ù¦ÄûZÛûcf¤3)šÈãòånÊDsÜmåõ™uåéJ :+”dŠJN?xð «•ô¥¦¦Fæ`EïPbÊ[ƒFÁ) b ¡C+  F# ¥Peå§ú†;o:oõkMqÊåK]¢ •¼víêåŽÖZJ ÔP™¡Ô¸Ã Jº>É:%½R)ðŽJ p€€Ø@(ÅÖ"(A h/”Å”ý;;4'þÜù£¿Ñ 8ÿ‰Ê)I$)·$mGÞTWp±:B©e÷.”t#OOOvî[àÂm¥– „ÓAŒEBi,ò¸¯(èJ(KsÂËò"“Oºïù>Ök_[SYœqãÚµ+W¯ÒŠm­ ¥Mµ…µùJíûœZBI·£±IÆ)gΜɽ{hh(½FIšûæþÎJ:†Ng׎+Y9.óF&ýOz¹“9‘¾üñÇòsîÌ*S6%«¼¹—b®F³ùŠ025¢bÓô…-€’S´o\@@$ ”"iÃ8t+”åùѱÉÇ=ö2ZYI‹` ô¦$ѼÔÓÑz±¬¹®ˆB©«î¥®PRò vu· *å°'Ê,ç=g¯F2GÎ'¿ÞœÜN>‘r¡¤ã¹«‹¸×T´z9ž C Ë=^ùû¦ºj\@À¸ ”Æå»™€>„²²0¾ª81%ÈÚcïýZYuåJ¯aâڵ˔èò¥îÖÆÊ&òH60B©£Ž¦®PÒÐ £Y2R¥\(Y“#uc†ýh€“û£LmØ«±÷¢ã™¹~)ã”J„’«³l¸Wã]½ÎÜ”eF(åGguÔ¸ €€¸@(ÅÕ( (ʽ[Yí^Æl½H;åPbs&%¥ bVyÓ¢æJfÊ›¡d„²º$¹¦455äieŒÇÎê‚DZa­Ï¸üßë×iŠ›ÒÑx¤|`Ê[']K]¡¤›²"Èͤ\(™á=™™bz “½Î;ÞÉÌ_ËLp³ã…2R«H(¹7’פR)š(çŽh²%¤ASÞ w4. Jñ´JbJ„rýòÙ·Ü ®ö‹ä‘5ùÊ‹r´ïR†JòBE£z¬í1k_˜;Þ©ÈäÈ2å‡ %ï=ïÕ¸B)pI»öÍ+€ˆ‡„R Æš*Wy ÊŽ–ÚÎÖúζŠÊüøÔ3aŽkI.i½m™çy±2•¤”–-Ëú¤P›ÀÖ‹šô”¿ÎQW(5ËC)¡T>BÉ^r_—Ä¥= §‚€É€Pš|¢Ú(””6ˆåŒqÇ€›nbÆi HC•VûÖ)O¤®P2ZÉDCUn~âùxŸƒ‘®[)W9 g6Teë ”Zôu…RÑN9ÊG(•ìýÍ€{ {5%«aØJöåSÞJ¤V?¥= §‚€É€Pš|¢Ú.””6(!Ä~Ò‹ÏXÌ]©óôSc}N+ÊC©†PÒ ¥‚hi(»ÜÛÙ@KÅuõ™uåéµe©5¥)5%IÕʼnUEñ•…±1ùQåy‘e¹á¥Ù¡%”b“mf¥û¦ùPöMÊÁ™ì•—䙛葓à–ïšçœë”ã˜mŸe—y&-üTj˜MJèÉäãIÁÇ’‚Ž$Z%Š÷?ç·?Îwoì…Ý1çwEûìˆòÞéµ5ÒssĹMáîÂÜÖ‡¹® uYâ¼*ØiEÐÙåAŽK–Ø/ö·[4jøÿ^fµ±±Ñ¦Ñµ9W-¡d绩ÃpeST¨ì‰¼‹r¸Ð2WÐí¢ÞâA(µéZ8L„ÒÔ[å׊€ZBɤ ZºpÖ0Îô7¹‚…Å­_~öaF‚¯|bsBÙÑZ§$H(é½I²@„R³~£–P²Ã“òëTT¨xò\=¥æ¼'²k·¹ãš¼#”Ü—>eöç^™ç¡Ô¬Sá,0JóhGÔBC%í”sîìÁ‘#î¸õ–›Ù¡Ê›nú––ëV.Ù)G§B™QO)-uJÍzŒ@¡$-c³ËOª¡¤SxÕÐÓÓ“7§wëEÞ–¬†rw¾Q™Ø\Ñbsv뙩y¥f g€y€PšG;¢ÐL(™´A¿Íù††*ÇŒ³gÏ¢——×Âóí¬Ø­… eK--ÍQ-õ¥—z:Hu˜òÖ Óp…’¾ËÈíH³x7!äÞNƒ­É&ÙËÒwÞ«Éo½H#ˆ¬ÚÊ ” ÙzQÞ)ÙD˜ò¢ ¡Ô Gá0J³iJTDÚ%íå]{õJogG}[KE{[UoOkBB‹/¾°gûZÚË[ˆP¶·Ô(–ú¥ØÞ¡’U‡KÑÒ•ïP²#‘t$}Ø!Fú]^òØ<”Ìat_:†~¤ÿ²*¿+£"¡¤‰]œÎ½ L*e¥&ƒp˜ ¥¹´$ê¡åBI‹»Ób½)m}‘ßË»(#ˆ¶Ðn¬ÏkºXÐÒXÜÒTÂDG[5å÷;ö±!.ú%?+šÙz‘Ý)‡IlÎæ¡¤T”Ê£¥¾˜„’uX”£n¯a%L¹P2J§hûD•SÞ䂤t\{cn§ÈPY¡¤ñH®z²…¤å€+J*!w@T¦²T §”G¡T·;áx0'JsjMÔEmÊ…2.ÌåÉ'ÇÙ»‚W(K²Ãh¿Ä‹uÙŒP¶µ”Ó%µ©©©Ã† £ìB·ÞzËçŸ~”È+”mÍÕ*£B)šUÞdlÌ¡¢‰ ’¥Öl¥$˜+È,|a~d–„3/b2ÛÒÐi€P‘¡²Wc®Oe`Ï¢ùwî{“Ü'„­ ¯²—¢+°W£/t°¢b0…Wr5µŸOœ `: ”¦ÓV(©(Êâ¬àâÂì—&<ýÝôR£œ˜UÞ´(‡Ýz‘Æ»:¸BÙÕQÏÄ¥Þ6ÊnÃí |뤉/xºÙÒ^ÞÜʶ¦*•Ñ\×7BÙ7š¨@Ú =ô+\@¤FB)µG}o  R(ór³<œ.œ÷Ã#ÝwÞå ŒPÒN9]M—zÛۚ˘JRÉî®ÆÞž š?~üéÔw_žølt=¥ ¢UÞì^Þe¹‘´ì¦½¹†æ¦¹u¹r¹÷ÈÁí?t¿¥åÞeôû̓½óö‡ì*/Îjm¬¦Ú¢ÞîvÒ>ývÊ1VÄ}A@À<@(Í£Q ¨ÊÎö‹{¶-Ò?Êxï=£ï]½eýÂî¿çÄ¡\¡T¹õ¢¯—ã[o¾JoRÞrË-¼f9˜>·ÞºhÁ¯4.Mµ…J‘¤ Ò°Ÿá40wJsoaÔO)!B™çáårxÜØ‡I0ë‡Oímv>óô㯼ô¼¿— My—d‡ªJ&mPJBèÎmëŸ7–´’×,iÀ2"Ô·åb97û…²ª(AŸ½¼ñ¨€€hNB©9;œi eR”kD€í”ßdŸ}zÜéÛW.ýõîÑ£æÌú2-Î[ P6Ö0«¼ó³vïØôò¤ HC“ÿ{·ÒÒ2Ð׃6ïæFcMAowÍJë5* c+ b*ò£Êó"ËrÃK³CKÈ•é%ÑŒÀ¢tÿÂ4ßÚˆV¸'{å%yæ&zä$¸eÇ»fÇ9gÅ:eÆ8fDÛ§GÙ¥GžI ?•f“z29äxR𱤠#‰V ‡âýÄùíóÝ{awÌù]Ñ>;¢¼·GzmôÜqnS¸û†0·õa®kC]V‡8¯ vZtvyãÒ@‡%ö‹ýE“6È ú<ª ú ¡ÔU\Ódʸ°³QAö«—ýÇbð­ä4?=ã»OíöOÿìƒÑwÚ¸faY^dy~´ð½¼)·9EYaú¡ý;úÌrÐ žœ6åCæwn0BYY§ç€PšL¿EAA@@l ”bk”Ç ” e~ÊùË—ºò3Bh„’Ê0¿36G7Ó;”̘"Pþ¹höþ]kÞxmâ?þq·“íABÙÜP"µ•¹á!>ò¿Ó/5ùýB«ïÀ¥A;n fDBiF‰ª¨O@å^Þ4ÏÛÝÑTQ’Æ eÐy›s}˽'³óÔ4¾}ãÒ5+æýó‘Þ}ë•”˜ U´"»„ÒF*ÜË›f½…#”}¶g€À”·ú½g€€@(Ñ$M@¥PfÆ8e'¸Ó:ë–¦Ú‰‘F(I(/x÷r=²×êÇë[©CŸnšüΫ»·­œóÓ×4sýù'ø8(ÊbÚMQx4ÖäõvµVÐ|º!ïPJú‰@åA@@3J͸á,3! D(³â\h/o’¹îζ´V(ÝÓ;” çý8|øíŒVZ±øü“÷÷í\÷õ—Sï¾û.J?épúp]EF}e³Ê›Y”ÓTW¬VЉýBe˜À¢3éܨ€„Ò€°q+ñ.”9 î´Ò¹«½±´(ƒ¡d„ÒáÔžV[?~ÿ-¤d´’ÖèLÿì£=;Öþþë¬ÇÇþó®;GíÛ½ñF¡$§T#.Vçötµ–çÑØ¡a«¼Å×SQ"7¥¸Û¥Ó3µ„27ñíåMz×ÒTtÁžÊÓ'vZ[mÛ±eÙ“O<ƾX9dˆÅ'Sßß»sÝæË^™4aذ¡+—-,ÎO¢¤’êFC#”‘ ¤ Òs¿ÃåA@ÀÜ@(Í­EQµh ”´—wyALG{KNf¢›ã!¡d„òè¡Í÷¬ÿuÎ÷w¾“ÕJÚç·_Ý»sý1«ŸLù`ÔÈ_~1íŒÍašûŒP–åF0‡R­~„ƒA@@ê ”RﯿfB™Ÿzö]¤÷ ÛÛš#B¼X¡<¼oƒÕþVû7/üý§ñO>ÎÝbñµW'îÙ±ÁÅáÄ þ3iâ ƒûÌÒú0å˜T •$”-4jhÈ@bs‰?¨>€¨EB©.ln4Ê‚4?rʲü(Úì»¶¦âœ‹ÍñÃ[NÞzÒjÛI«ÖGwZݵcËÊ×_8`ÀÖ,Ÿ÷Ø¢s½Üm}½W._@–I3ãÓ¿˜vÚúÐÅš|EÑP™Ó'”9a† ¥¹õuÔ@ôIB©Oº¸¶è h)”E´3aVHMY꥞ŽüÜt‡£¶Ö{l­÷ÙÚowê€ý郧8ºkúçSèJî€åË“&P†ºG…ymÞ¸üí7_¡dC³úþbMž|4Tf÷t¶á8°õ¢èû/  b!¡KK F! ¡,!ÕË oª+lkkNMŠt²;ìì`åìpÄÅñ¨«ã1W§ãnN'ÜœOÎûeÖ÷ßËÕJúþܳã׬\á“‘:rÄð”¸`J$ eHi¶ABi”>‰›‚€€)€Pšb«¡Ì:# C¡¤½¼+ ãÛ[jº:;2Óâ¼=N{¹Ùx»¢/>g|ÎÙúœ³£8m}à?sf<=~œŒYNxáÙáwÜžÔP+”Æ’F(ûôÎðAC°Eéþ”2‰6 *HñÉOöÊKòÌMôÈIpËŽwÍŽsΊuÊŒq̈¶O²K<“~*5Ì&%ôdrÈñ¤àcIAG­ÅûˆóÛç»7öÂî˜ó»¢}vDyoôÚé¹9âܦp÷ anëÃ\׆º¬q^ì´"èìò Ç¥KìûÛ-5Ü’%fcc£³€ €è‚„Rq “% [¡,§l bkËÒ:Zëz{»‹ ³BÜüÎ;øŸwô¿p–`׈sÞž¶46ùúk/±ž4xð­É±”±R&ê+H(›K²‚J“íÛ(8€’„Ò´q/ÑЇPÒ8%íåMZÙÞ\ÓÓÝY[]–äÎ ʘHŸÄX¿´¤ ÔÄÀ=;×}øÁ;C,'Ç4TeËD}Efwgs1¹Q#”¢ë¶(€ˆŽ„RtM‚’€þ„²º$™öò®+Ïhkª¼z¥·©±6+=&&Üûá“ã—–”“^]ZpϘÑI±õ•Ù²ñ—Pg# ”ÂzäÁƒ'Mšôðßú>sæÌÐÐPågÛÚÚÊœõÇÔÔÔðžE·Ø´iý—þÕÓÓ“=‘N¡Ñ?ч~WrGæúÈCW˜:u*[~ú¢¤üìíè:ùùùì‰t ýOaÀp€€Y€PšUs¢2êзPÖ–¥3{y·6–_êíìêl//ÉNO MŠõc"-10'=¬ ;ª´ ¾_(ýé`Ù¨Èè¡Ì0VàJåý*))‰ôKæ¥Xö’cñžNg‘òžEW#Ñ”?‹9žþKÖ(s"iSú¯¢Ò’2g‘ÿÉC¿(*?ÙªüII™{±÷eOg|©€PJ­ÅQßH(+2iÚš¢©¶°»£éÚÕ+íÍUåy9‘ÉÁ7eŒ?sä QžAg‘Õ1°(GÑ“ÓÑÑÁÚ$i;HÉ:–¼“q”N§˜¹b'P²îÈ|¡ß©x¬ž*#d‹$3nʞȌJ2%¡/l½ä˜J¶ÀìЦ¢áUüé0oJón_ÔNÃe]E¦L4×—0fÙÕÙZ[]XœŸPR?fÌèÄùƒiÞ¼_(ýŒJE=‰\Gù‘9vQ~Ôu8yW#Ûc}QF ¹#št"£nt #ˆ$ LI‰òa²–I'9æV“®ÏÞQ¦vŒP2:†)¯|Â@̘„ÒŒUSMÀPB™Aß¼Ñ\_̘eOwÛ?îCoUòVžNÇÒÞ<Æ ¤ âïNŒr)šhf_.äª!É™¢©gæ¬ÊÌM³zÇ IÊ”Ìz³×ä—R©˜’Љ26É\œ‘÷š¬PÒ¿bHRõ ¡”@#£ŠŠ B(ËÓë™å×_}QÍsp#”¾Æ ä¡äíGŠÆð˜ƒy-=EÉ’^S~/º¢Imú'vnš«¶ìð*ï2¦ ì‰ÜÒ²B)ÿ:&þÞ€H“„RšíŽZÿEÀBIër´Ê>Ÿ3z ±¹Ü£Ã72sÍ*—uÓT®žáj½mÉÞ“JîÜ)ZvÃ4Ê mª¼ ]œ­ W:Y¡Tb¢ø+ )JI57*+K@ÿB™F )µîŽÆ‚ÔóÆ%ß3$³X›|‘~!Óâ]C.ÈÎ2ÓaŠ>ì‚®±)Ÿ^gŠÆk«¬Ê,ôa$¼óì¬P*R[ü­¥ÔZõ½€¾…²¦,U'Ñ'”)>bl½Èû1ïJÊgÞ¡eÆðX¡T”¦Gæwu…’U=®;*2Q%ÙŽä‹ÇÝ„Pâ/)€€ %º„¤ è](KS)½¹öÑÕјŸâ-ŠÀ^Þ žšV&Í"ë’·4®Š ¡d‡ ¹Ë«…ŒP²³ÛìÛìÊùÕßG(™ÂpO‡PJúï&*| ”è’& g¡L©)ÕMtµ7ÒРH"/É37Ñ#'Á-;Þ5;Î9+Ö)3Æ1#Ú>=Ê.=òLZø©Ô0›”ГÉ!Ç“‚%I ´J8ï ÎoœïÞØ »cÎïŠöÙå½=Òkk¤çæˆs›ÂÝ7„¹­s]ê²:ÄyU°ÓŠ ³Ëƒ—:, °_ìo·hÔpKvÌÌÆÆFä½–Þeäæqä¦òa…RÑJm%U"”t:³Œ†]Í®¼‘¿SÈÛœ¼åPм¢x `xJÃ3ÇED@¯BI»/ê$jJRºÚ/æ%{Š% ”‚»0»ìš›WHc(”l† ftSÉí„,ÊP nm’&¡”tó£ò¦$”Iž44(’À%óìÐl23Ç­${Ž¼Ï±ÍJÒ€3—¥ÿr‡ %+‘ÌéÌÈ.ïЬïòþ+SGú'v™û#”øã  CB‰.!izÊâ¤jEMq2Pæ&Q`Êûïç†õEÞüÞ¼‰ÁYS4ë­h‹áBɘ"•ýÂ[ ­å¸ûõ¶¡ƒyå°BYYƒþ   `,Jc‘Ç}EA@¥PfÆ8eʬþóçA 8pËÚßÙ)ošõ6L”f÷ e •醯«¼ÏŸ^øí´‰·bm’¾pWy³BI_z»ÛEÑ«P¥ôÚ5æ(”ô¥óîC6óþ»¯$F¸¤ù,J³Cû…ò°é†fBùûÌwoö¿IÖ)½q=’ýŽ7)ñpƒ€€±@(E÷áBI‹rÒ¢§~ø&iÍÝ£G9ŸÙ]@Ks ¥Y$”Uäd&jå¡\ÿǧ÷Œ¾ƒ;*É|4hà¿ÏàµIæÇ«WzEѱP¥ÄÕ½‘€ZBÉ,ÊÙ½e‰åÁ4ýýëì¯3âÏÑŠo}G eSU‚ÿA“B¹gíwc¾[^%é—O>~;Ìï´›¤j¹X†>  `xJÃ3ÇED@¹Pž<¸êWž÷÷8,“6(ÄÇzü’â ¿ã¶Ý[þÌO9¯×(É ikª"!3õP¾SΙýó&ý«ªüç•—žS4Í-ã—ØŒQDOŠ %J)µ6ê*G@¹PZíZJkq† ¼cã‚òPR*ʪ$¡$û!¹t:½³o±Ž~¢$+¸O(ý˜z(Ês6Kß{ãi^•|ìÑíOnW>*ÉýW¬õÆS F!¡4 vÜT,TNyÛßxw*Ê©¼AïPÒ”w^²é±î?ÿðMÓÓ?}/*À–û¯ºú^œÙ'”}6fqã^Þ¾Žk¾ùäÕo’·É1£GYí]-\%Ù#¯_¿&–î…r€€€d@(%ÓÔ¨(•BIiƒbOýûíIý©(Ç\p;œ—ì-ÁÞ'ßzm@ïV.üíûôX7ùc´ù¥_(+ã|÷™Eì½°;æü®P÷-óf}h1øy•1ü¶Kfk ’Ì)ØÚÏ:€ž„ÒðÌqG"””‡’Þ¡Ü´úW‰¤X»lnÿ8¥l?°–É+t÷è‘”®’÷Í~,Î "¡Œ¥±=óˆ »W,˜~ÇmCäUÒrˆÅ¼¹ß¤D»jl“tbwg“ˆzŠ Ò ¡”F;£– Jz‡’vÊa”ñÍ×&$„:æ&yÉDz…³èKf½ÎÂ_¿St﹊~,ÎèÊ {Ì öl˜ýðü‹¸g|356ÄQ•dÎ…PâqÀPž9î("j %¥ J‹q™þÉdfòôÑM¹Ižò‘ê°láL: /oâÀt|×qÞ#þø·Pî¦ÉbÓã»æÉ‡xWÞ¼ýÆD•ù€„‹&„RDŠ JÉ45*ÊG@¹P†xYm\1—™ò¦ÊœÄsLرŒ†|óµ"ülØße¾lZ3ïÑGîgŠŽH‰‡È>»ú׳ãÖ,ák£äöŸŠÒZ+¢}v˜Pø;­ÿñ«·åÚ¶a‘pAT÷ÈÞîvI÷iT@ŒABi 긧h¨JJdsx-ù"Yàw_~å”à.«—ÎfxþÙqnv»ä` ÷µ¦ƒß|õ¯KfÌòÏ?xQrVaºŸPzï0•˜7ë#E‹¸)Pv¢—ºŽ(üø’ì`Ñt.@$DB)¡ÆFUå Jz‡2.è̤û¶r¡ñH§ýôJ¥LÐßMÿ€}¤/4E. ÷:žvß¡ô–Ì»˜ô¹ÿ¾»ÿ3ësú]þDF(£¼·‹?Ö.þꮑ}»É| 8gæZ梕µe©èç  †'¡4úð}t ]AÉYôO©Z/–Exl2z,šóñíÆȫ¤å‹?~Ÿ¡×|@*ÍÓx¬A@Àˆ ”F„[‹‚Àøñ}:È~È)ÏžÜpÃ% Rª «Ý˘Å:ô_ú®üø¤0»íëï­‰ä ìK–”AÝËq7ï‰)hñr¸ÇF#ÆÆ¥_ÿãîò*Iù€f|3Õù€” %†'Eñ,¡ &¡”pã£êýZZZäòÄþåÌ”wFÌY‘fûûÜ/G|þ™±{·.r"FÓåìl8ïY ¥û†pcľõ?Ž}äÞ•7Ÿ|üv˜ßi•c‡ú> 83Û-âiã€P—?î. òNIoFÞµ¤O(ÕŒ/«ÿý*óbåè»F¬\<3Úÿ¤‹Ø[?÷ÇOx.H9ß7Bé¾ÞÀa{`ÞË/<Æ«’¯¼ôœ·ó!}›¢Àë#÷¤(ž"@@Ú ”ÒnÔþo䔓'O–‘§Åó¾MvÐ ‚½ÏùñfÜ‘æÐ¿ùâ=_×}\‡9%?ŧ¥¡4ÌmÁÂýäâɯ÷í $ÿyìÑ ŸH‰YÖU¤£ƒ€„ÒèM€ˆ…@OO¼SN~ëÅ„ÓéQ¸~ùœûïýkÿº”íÑõ\'?™ʵŸ3K¿š:ià€›äUrÌèQÆÊ¤H(+ò#¯_¿&–„r€€€„ @(%Üø¨ºrÊ)S¦È¸Ô?¾××e/½R©qìٲ๧ÿš;¦«ÍùqÚ9û¯–ŸìMBêºV¯áï¸ò—&+Ê´bÉlÐ;ŒlòÊ¥nôb1€PŠ¡Pqà&§dä’¦­Oì_‘i§M8Yoúè½WèR¯ì=gÆ4úQå5ó¡tY­¿øóÊdÁ›hÞÜoŒ¾ˆ[^Ri¦ûÚÕ+âê7( €H˜„Rª+&@ù)‡ ë{’û™7û •ò'ä€=›Y¿}(sñÑwŽøúóÉJÌ’Ê—Õúˆ­+¾zè¾;y_—¤|@±!Žqx#ZÓÝÚXÎ   *JQ5 #"¥¥¥2é„Ⱥž|ü!»m”¥R'Aɉ>›òíÐó·Yç½x¿P–„8¯ÒmÜôãøÇïåUɷߘ(†|@òŠIÓÜ—z;EÔKP~JtPH€^©œ>}ºŒr 8`ÞìÏS#Îè0ÎžÜøõgïÒ{–g¬VË_67É«_(Wê*ý:éùòªä Ï?)ž|@2BÙP™‰%8x\A@@œ ”âl”JDöìÙsóͲ[W?1öAÛ­´I£"7ѳ¹¾$Øi…öárô÷Oþý/Eù€¬­6 œw6ða¥9¡íÍU"ê( €€À ”è  š@nnî„ ä‡*gÿ0%>ð„¾òo¡\ì¤yxZ/üîÓ—åÚ¶a‘Qøí.Vgcýê>Š#@@À¨ ”FÅ››-[¶ÈUÞqûÐå ¿O ?¥¿ÈMCœù€jJ“:Zj и€€€Á@( †7’ ­¤Iðûî»wY óãk/=½iåÏѾ‡ƒ« ^¡\³àã{Fß. Ê4㛩"ÌDÛpÓ› X¾-•Çõ¥ÄÕ5 ùýudð‰±ü2kšõ¥‰ÁÇ#”~¶ ™Ø¾ü³Gº‹×V?ùøí0¿Ó›¶r#òÈÆš<ä'7`¿Ã­@@À ”F€Ž[JŠ@jjêœ9s”̃3j8ÄâÖw^~éï_»Ø¬K :Êì8צºB¿3 Žoû~â³òªä+/=çí|Hˆáà˜âÌJÔÚXW$%ÕÕQY)€PJ¹õQwƒ ËéÓ§ËoÞ(/ˆxö©G¾Ÿ>yãŠYÎ6ë²â\s3bÞ~y,¯J>öèƒ"ÉTUGƒ‘]í Š7¥EZ¸CoXNžú¨p¹dޤ|@+–Ì6Àä5s GŠºŠtšy§èl«¿ÔÛij¸+€€€( @(EÙ,(”ÄÐFŽVVV´—£Ê ñ¡C‡®X¾¤¶º¤»³IßÙ놨.€hNB©9;œ ú @rI#—”&¦Åe–òÌŸ?¿¶¶V7Å5A@@@Jmèá\Ð;zç’v §‰¦Þo†€€€€Fþ?#PÆ ŽIEND®B`‚dibbler-1.0.1/doc/dibbler-user.pdf0000664000175000017500000455406612561661464013715 00000000000000%PDF-1.5 %ÐÔÅØ 2 0 obj << /Type /ObjStm /N 100 /First 808 /Length 1285 /Filter /FlateDecode >> stream xÚ•V]oÛ6}÷¯¸ ÐÅ")ê( 8ñ²Kœ,v×<ôE‘锘,iúHâþúKK^²6•Xà•Ì{xî9—”y¤IyŠ(¦P‘ð(òI 1 D¾$â‡+"éI’‚¤ 'Q“ä|!)\2&¥FT‘ ¥È¸óÉW!á燒òc?H+ot­ñ¿&ÅäHþŸ‚@‘/,«…ŸB,­C ±‚Ž(t (ÒbHŠbŸM±ä\ŠCä‚¿çi$c”Þ¾¸#Šò"À "!1FC RˆI„‚¥¢Æc j?¡x*Ž)V,FÉç51$žöÆ—VÁ«#@‰l„Ž˜0ØÃ 4ÝEà¨6túãi%…“µ "¦ 3D40AD~È„D9æ•ÁLÄPY0D áìžà~yðAÀé±.¸‘ne$Hž°íR0Uð–Rr{a<¸.Y=$\@ÍUÌUÙç•a”ôýˆËEfI§J’š!ªÔ,3÷SÀ5Á3ø € Ä_!÷X´oDJ È¡ X ¡œ8'#ÁJ}ȧÃ<síp¦BZØ'〵rÌœa ò*OkV AL>| é’¦¿«‚¦szW›´±E~,ŽèãÇɻ󼩊£ïgµw‡‰ýÔ«S=Xó80[îg/Û²,ªÆ¬©LªdkSÕ™jŸ¹(ªÙ“4me†rýŽciª¤±ù=-wuc¶tcþime¶&o† ôwij¤ÙÕöG‰]–ìU¬›$Ãt<£$_S['÷æ§ëÉ^Ö ›·OdŸ! äuk~¶ùºx¬ß’Ù |™¤tµ¤Û·¤vúžUÆœ,çïia7BðÜË"K*[c§ u2Ÿ$µM_Õ©›Ý>-¶¥AS½ÐtÚ×9íXO÷¤§çiOy<|'ýe±6UN½_ÞÝ^ã6ürDéh´®º sŸ¤»gh‹ÕTzž÷&¬ÎŸó뇠ß%Û23tr¾˜!úäÐ÷)Œ¤9ŒÉꄞïòd‹óy¯Lí¤bÑ[Öc`:•gijJ—ü)ÿ;/s:ûs¾Ò,|öê_·î)5¥™e—ÓŒ-ߨt¤a/çé³|t)Æj4„ü¯$à PËÆ$öëºÔ5œcQsAk4pŽ÷¸cdê1pþ‹Î¨©ØÐ¾¬_N]Y§{qvXi@ä¨G‡OždT§•-›¤¸ß²oÙ6ÂëΔ"ËŠGÖàïeº³PaSa'ñ^4ÍÖø€kl=âc ½©W‹³ó›KÚ—¡Od^w6³ÍÐY!oÀ¤Æwš©ús¼ÁNϸUjªùfÓfnÏÞÓj6òð‡Ã¼‚4”t§_š¤_‡ ÝÑs{yA›™Áźm7k›¯0 Û_Ž4?**ûmäv‡-wcðº£9¾®ÓѹòÿMfè³£—¼Ž&ÿô=EX endstream endobj 203 0 obj << /Type /ObjStm /N 100 /First 867 /Length 1312 /Filter /FlateDecode >> stream xÚWËnÛH¼ë+úlsž$… €ec¯7vöä EìÁò>’èï·Z¤ì±ŽÇ Vk<]Ó]UC¶e$)"YÒ1YKRD$J!Hð²Ð$‰OC"Mñ™TŸˆcMRJR"ZH©Hi IK*ŽŒIK䫈´žd€-•&£íÃX`¨„l<•’å|-É&b!µ¢8Røn)Ö8GÇǨÃD”¬A ãM ×g ¥O(Å^iRJcì³ý½V!àÊÑ%:ÄV“|FŒž…â†Ð´à,t&¸u£m®]Æ . N$HÇ©B » §cU(&%²Â²L¬%L'z•)uÌ )æÈÆjRX6Ò …â„•+@¶– Û4fÎ •r䨀}V*N9r%€œh€œØˆÔIj 5‰T@;è%RÃS4§{`ŠÛŽÀ±‚f2J8`á#vl ‹#¸lZ('Y%Åê0ŠåPÜ…aý¹ ÃÆ%ʰ²Š kh¦ ŸÔ)@6eumºP–eOq(ûÔ*b–“±Š`#f©PË^†((…x%aax%e=°Â¾IZŒR%(Œ›ŒØÂPPE¨Eq×ÃåÂ@;e(f[ñ>6‘†‚ O.Þ¾¥ó:ÿXßÖt¾¢7ݰæ—÷¾®Îô™ˆÏÔ ½{·x³rE¶sºúWõ>ÏxËI‚žüz]¸v†@×mÝ×y]A™êw·£{W¹öE<¥%cÒ‡Ÿ¹kx­[Rƒ:ò£ Êëjëï‡0¨t„úËU›º¥®q¹ßúœ|µ­Û2AF#ÂU½?¹Â@ª¯z×n³Üut÷ÆWvw§e½qw'/Šð:k³Ò¦£ ØÝÐ4uËØëu®ýކºó],²m·®e¦V_/WÔï×½”úè™õpï«ûó¼.гö…ïw´uY?´ÏÁ#Mý](:õª›0ó!]ø®N]ÙàðË‹;<¯.^2õ«~÷ôCÙfƒú»ó¦u[ÿ“ à‹¤èƒ a>_‚Ьx úÀÄͨæ5è`ÓU¹#4bbãb,ŸžL”=ÑðÅ•uïøׯ¹gMÃrŒ2eN ܸ{ÅsÄM æˆðð^ë»Éëæåްýð±¨×à¢ã¼49»´qy‘µAÏfÎWÇ~@.~Ÿ®×b ^™<‘{‹[Y·Y»;Ü©×âØÉ”õг‚óâ1ïýøNKžÞ@¿ÈyLG9†CLåœ|2¼7·þÙûú˜¯žw.n]V6Eˆ-¾ÆKºñ…äÊã\¹¤[ÜuÈt²:ÎVKúäK¿—8+ëœÔÛƒeÂzÑLjzI_+ !¿ˆËr¨G†2ÇPfI_²ÆoNÈ÷!öÁ.é"Ï÷¾}ybŒø#^Òç¡è=Ç{¿„Ñ’£$è…G½Ã‘C¤KzŸuy¶èÔ2X˜×¢™Ù¢%­vUVbÀZ]Ý`|ùíÏÕÕssË kn\8wÚN‡¶Ë§¡-pØ#Ïl-àëëWM“3¼™Ñœ>=P7®p÷á@3 ý/?Œ/ÈÀ;?s·€½/§™4hÒØƒÌ .àðO.ëÜ·Áµ» „™½üýßÿB¡Íl.æ>§¾ ¡ú»ªTO9¦Í“Å?pƦw endstream endobj 404 0 obj << /Type /ObjStm /N 100 /First 862 /Length 1216 /Filter /FlateDecode >> stream xÚVÛnÛF}×WÌ£ý`›{_ Aê MšXNŸòBQ+‡E ¼öß÷ŒD»UW«4äî9s9³;Ô‰¢„tâH üyr),ABâ­$4?)?[’’ŸS’ÏØ£€×R‘Rj¢¥&e,ž©tÒƒR“V°pJ’Öx§ iÏÿ– |ðš1¼–±Ø§Ù$h­ÉJðiGÖÚ-Özø3‚œäINƒËržÿ-ùûLJžÓ± y‹Ì¬¢4‘m5¥~ñ.5À[O)Þi'(Má×!ßÉj‡„ƒ …Á!¡,Bp.>À5ÂÙ‰öF 7Þ¡lÊmsÒ`sÊ…LÙ³â¥Ìʱf.°†cÁ™˜Ì. J*ŒÖ~Æñ˜­`ÌVsÙÀlý®~ Ìΰf§2 Zè$<’4(šH…œ(%R”×@*‘zÞãI&`5K&Ô’ Ò5 BòôÆÃ@n ˜”È@2ü» âæá%GR±¢P U ²IîÖZ²˜ÂIíù ˜9é¤aÐNöñ¤fb ”´Šß€ÙZÄ ý¤e8r“9q±¤Sl€ÙY^³Gi ”žã©ô– 0§I21PP¦ÈÛ@A™r¡  JX (¨.T šÐ@A…ž€aap<ÈV œ 7 µƒ!µ™|ø@Wsºº«kºšÑYÛ/øò®¨«Ks©.EzN?NÎ~{ÎÖ›2@Œ)Íæ¿] ®¯ªPÒ÷³ëÛLJïççt2Ù§“É”nú¶«×ToxWÅ"F,bJa]#¦ë¾«óºZO}“1 ŠOòÍûE:Z†¼ÌÞe8ì~S¡ê(Âý+îrHd–uu/›ÐÙ?:Ïëw÷îmup_u¡Yey8’Ð~px}*Pí€'õøev*Ðì€×ËeÚöTô á—&¬Šçãà7äç¼ËºP²ßSär}eöBm¿ÙÔMw2dyS¯×h¶cý2du[ «Ë:‰Éí5óCX…&Ty8‚ò{¨›_k@ñŠèW9:Ù8ˆ³°Êú²‹1ÀŸç1@µTSz,Ö¡î»–²jIí&äŪÈ)ÛõV ¥Þ§ÔSúT7¸3dÕU8…ÊìS™)}í‹üç~§QßÕ=d›by‘£;Ѝ’Ù}n‹‹ï­“×õ2Äp¸}‡²¿TÙõBù1n¿Î>Ìä÷™ü”þ¹¸Šjžãšh4³0²þ Õ²n.Þ„Œ6ÛŽ,‘õ­*ò¬å«~½îÙŽ»e@6îo4øÛ•S†§x¢Q¯ ɵj +›u½PL‘aÃ_!ždÔç>+‹24<‹à68¥<£VèõùÏb³»Pšu‡=äøÖ†æb‰2WaI÷×÷³(¢Q_ û¿?}¶t£æîÔOŸ-Ëø{ÌŸôé30¹_çNüÀr¯×ó]Y/²’Zþ 9‚'€¼A‡þü㿪ó¶Y¿›…Èù’™?ó‚­ìáø5ØÖŠ¡9FŸÎvñZŨ\G¤†ë…>œ:w=¦ÂEÌÍÀøÃɲՆ‡TWÓI90CO  8Ùõâ£5ìÒ;Ÿü ¨$ÿ endstream endobj 657 0 obj << /Length 311 /Filter /FlateDecode >> stream xÚuQÁNÃ0 ½÷+|£=ÔØn“4W !!ÁTNÀ¡c]™Ö­£Ý¸ðó¸†@Ql9yïåÅ~FúÞ}sTΦ°Òe9GñœÏÑ[ï=ô5,á."hôzúo>+£ÓK¶À…M儉 °!³-à!ž¬æó¶î“4#‰ßCªBÚ%©Ø¸ë÷•"ÂÑäêüöÍ&Oå5XA6Raô\±û¡îO†m«E="Õ†V”12ÚH]Π ̘±L ‰»M½V®¸ø¦?4U;¬W#?"t@( !uTϦúϼvGì§¼CËê‹3ôù—¯ýK·ºí#ªöyÝæøÜmp׆'¾ºöÛ«äX8¯–3Ô 1!6))ù#êDLèÉó¨À™D æÎ0òŸä‹2ú9©y endstream endobj 713 0 obj << /Length 1808 /Filter /FlateDecode >> stream xÚí\[s›8}÷¯àmñLÑ ¡ÇÜ7ÆicwÛ™¶Ä–³ÌbãÎå߯„$lƒ“Æ!i‡é¤€! Ÿ£ï|7‘K 8nñ“\¬žYSËÿ<€ȈEv˜Ç³n­/-׺§Z»ƒV÷‹‰Óгc‹xŽÇE tˆÇ¬ÁÈúaï‡ççOÚä#[<Àiw€ ÄbMyòW*ObûhŽx»ð© Û¿[ƒÖe äÃÅݱïP„¬á¤õã—kĹ–ë`æ[×ù•Kì;bøb?²ú­Òˆ!µÄ7C؃ËC†Èñ‰ñ^(4ø÷Ï€¸‰>vƒ4Ôæ°Ö‡Qôþ´ç¥ÙzPL‚TL²Ofá:Á¾ç¸3•€Sñ˜C]²:wP5é.$µ¯,õ{W™²É¤Ew•-ws+¦ÊŠ»ýeã-¾ÌÚ@†?CªaX¨ðþ'q®U#žL$•pà§KÜïŸÛ"ŒtGœ¥â ®J̇p½7bÄ{{æ²n\ nãÔ?ñ‹`x«€X à$ØTƒr°{ƒ.t]w 滌'Ýßz¡çÉÐ&lã¦?_yº¨³”¼V\‡ÏÞ« x® q¤l—Ìçb °”xf <ÂÕÏ} "C­R¹¦S™[–GÜc‹©zi¹/Ø{í!¢õO(Òµ«* ê"Z±4H^YXV…Ö‡Õ„S8ÛU,…7@•D€W? ²¸&²Ò­VFæºþvÜI-ß™§\u@î p%·%þV¶6Hl ‘%‘Õ.2VÙÒa›y¶i6åÜ¿Oe_ùÛàôþì‰>Uö„‹ìésºß(rG<ìºH”"Ödà›MZCq‘Áñ(ùÚm¥ C˜ß´Ÿ‹<¿y&Ü„ëL;ÈóAµ?[1» MË©éjê+òòD…"Ÿ,g…Ïn‹¯¡ÌÎïçp‘#žÅóECyO%èód­ÄùÔorûè€n-ƒ0…Þ½yšÅº§Ït‰-­¶¡XÓ†zK°Kžfi¿§ ¨_UYed•’Š)TËXQøþMöŠu !¨^F \qs³L6Ž"•9×ɳ®9?<'ªò‡òªlþB©¸lg¤_mÌ”ßùbað}À\ø]Ê{§½Ãã³Ü$_Ř®["ËîY1мK¨3RoâCEÉI|Fa–wå*õµ‹Ò›ô(^=ÞâíR~9çÉmõj¿©Ù½> stream xÚí[]SÛ8}ϯðÛ:q­okߨ†2t[–Bº³3Ý>G¤žñGj'-Ý_¿’%›$v€ `òÁthBùÝsϽ’¾;Àó›Ÿb²ôëʼn“9¾üGö 'ãØã”sî¹v>õ|g"/ŸôþõÞ¼CÀáò2¤ÎèÚ!Ô£9Œ@PîŒÆÎw_]%¢èP€\ù^\ ÿ#÷s)ŠßJu»'óx,ú@À\Ôÿ:zß;õ¾÷@5Ð|:<†¥½/_}g,¯½w|óÀùY½3uäsO_>OœËÞíˆ}yú‡©Û^üõÂÜOàßã>ê~ò|‘};Ø´? ºÿ|ü Çû¯p"ÊjÀõ79_Ì箼Yâû|À|Ã?ر‡ßß ûÐEÁÒËw3)ß2È#˜7¤1MÚÑ|öMd}¸³8 gqž)±fcM¦zC^Äÿék+#á ï% ö€C⩘i¡îÉH§»bš„}ÈÜ_桘‰¨ bÌà–ÍÆ—~h“\Ä1ûÉ °¦!Ê3¥W“y!ôÌÿSüºù+¡±:ýåµ—«.p±o)-ÒèE=Ç%PbüPX‡:‘¶Ècƒ|c2äŒVˆ÷+”ÑhI=rÏ‹|–K›¸Qž¬+ôíjÚ¼CÌ1´šh Z`w"2QtNgê{©ËO3ãÑ&D Ö¤Õ@›™ã›HLåï7LÜ©œÖÌ­ã Jb#™ÄÙäM”§S™®â$ž5³¹×"œÉ2¬Å†ÁÁ¥jßl€¨n6œfJÎÖb#8ù´3~©÷™ˆhåcT7Îòl Òél¡åszÔnéBz ‡ ì! V{ºh¡§+?𡦣ÛîÕBŸxÒUUäGUC:;º‹{Š÷šíN~ÙFõð™G!î5ÓòÅ´¢ø‡t\ñXj馎ÇR×Ê7ÓB(;|£Iøf“Ó‹85©?LîN'ÀWj<9븩ÏeåcYãcϵ©­ªÀ,úÅÆÑ¶äˆ³]_¹Ù~»U‰¼É7GZq´ü¬Ô"­|úÅž,@ê5…4Ÿ‰¦õZ·VM¯I&†îv øÁ¹\þ™€èLð×U™'Â”ÓØ7uóO'vb€”î׺ñƒ{<ê“Zõ?†Óic}¦jÂ׳òÕ$¯ñu±Aì–‚$&ŒTgvže"¹'Ý2rxíŽge¥Ú ´P‘ 0ð°Ì™+01TIõâh§„ [o ºsmÔó)—¿è0‹Y÷ &X åóÉò¼©BøRM/£|]³Œ<¸óºgc!†¶B,)¬H2ôO’üJ'=ì–šP™[þ±×}Y÷ŽÍz±¢J–ZqZÇ"JÂuKÇdŸ+ —ƒø—Ê" {iV¾ÊFîžg•k ||‘¤ˆÀ†ˆó…NØ™PiñµaÓ"Y†1ŒT>Q¤õºdX˜6ux2f=9‘–>,Õ³{9 Þç¬`‹=5Ø_äóYS1­ÏÔðW¯uŸƒ²å„NÞêÝB¬Þ-t‡0r8éÙ2b°%;a§Ùw·ž¼ íœZèߌAwùë ri 6KŽ­jAvµÞ¶p¶HYãÊ`S0®jÞ‚/û>ÍÞaåÛ:–ð#»y{c)x‚èAk¢gµTq"nÂtÚqÒ S|Øå:ömÔDű†Yª­ÅؽŒ«×ZA@_ÊcyðÛÀ.  ¡`§Bçö‚&å‡ÓZìòÀZÂŽº`Göq×ÕŠ,Ó|¾˜2ò륲±-NìÞ–jÕõ@M×c OlðüœÅQX6gRUX§JûçÙÚsgxOtYNTÒ,1À^„Óx<ˆÊùÚ²[ÛY}¶ÊØlÚ65`EÑmc5×V±hŸ'Û Ü_¶ym;ëÂÜ?ΓYl^5†½Ãbx0Å–p]pµ¦TGZojèƒLäh÷«Á¡mZ Ä.Oò.è¹þmXFá¸ö€z¾5&ìÿ*J-ç:ðõ&‘åÇ7ˆea›Ã{óK}YFz§@ÿ4<ë<„ÄöÅ0[tAºuy{drPÖ iý–NLž.œ˜¼cã>Çl+·³Rn‹ ìB°.Ï—:$›îÅ;²Ùï^Œ™o‹1긮öΗŽ,ŒE"&Ý5 g{\Q³•påñxÔûл0 endstream endobj 605 0 obj << /Type /ObjStm /N 100 /First 876 /Length 2570 /Filter /FlateDecode >> stream xÚµZ]o[7}ׯàc²9äpÈ…QÀim ÐM²ØÔެ:BlÉ•d4ù÷{†q¶¶. úÁatEž{8ß䨄ì‚+¡º¤Cs\\‰äªÉÅÈ‹‹Œo£¸Xš+aY¡è(EŒÙQ)³Bì¨a>Œ°žšKó¹Tñ<%—ôûT\ÖuI\.ÀÍÁå†ù9:Æ«KÎŽs•ÌŽór3}Þú; “ý%WŠ`ÌNp˜]U¾\]›‹!böCI3zŒY—el%·°‹Â-˜Sk툔~©Ž"&ì™’l<ƒm+bÑ'äHB›IŽj0šî R$¼KŠŠ¯q© @ V $¤ð¥ˆ(`y6^*¹ªÌJM.éœ ±á=虣N† ‹"WHR¨b¹AÞ¥B“|K Ž ê- ÒMûj¤âͳÒ´M˜Œ•,ºSãÖ'c^P7¼&ê§VU:T2vÐE®Ë%èN ?Q5HCBÂHÿ8‰à+‰TQ˜—ÁY°[á¦8ø“¤+š“ γ«A¿‡åÕíHŒøOã™@) Ó•ïj…© 4]8 ì,°ÆÒ(ër-U}’\ã¤O²kªѶËL òÖ`BB0ó !Ç@JÔ”´-p“Jàª`[ØþWƒ>ƒË`)ÖBT±6ÁÄ"Qœ¸ù[7ÿÛæÝÆÍ_ºg»åb¿Ú¬}}î¾ûnöìÍò×Ûån¿ÙºÅfýËêòv{®_?p];¬{µÕ…ëýÕwºû´¼pÿPLØýÁÒÛ¿¯öñ°þûÍõõf=yVý}µ¾ýìv7ËÅê—ÕÂý:qu:¬þ×j}±ùm7m½-Žá°öõj·X^]¯—›ÛÛonV‹ÇßÃÝVX©|¿›Mw‚YïÏ{w¾¾pÛåÍf»_­/݇ÛË£¯³]¾>_]é’+¼öèš|XóîãùúÓ®¿ór»\ê+“‰mìtñi½ùíjyq¹¼†)<¼â/w›{±úpµÚ\nÏo>þ¿<ÞkL ZíÏtþÉÉlþîËÍÒÍ:¿\Îæ*}‚«èÌÙüÍr·¹Ý.–»oû£×Ë‹Õù‹Íg÷>h’Aô•Fg3@l±Ñ#æ®×@½ï!\_{6»÷Êþýlþb³½Xn;V8›ÿ0ÿqþ=>À ÏôíPÔ{bòˆ Hg^À+1Œ\“Föd˜õööÈsï§ùéÉIÇŸŸvÉÌßÎÿùæGý{v ½í7ÝÜ\ï6럟ï~þéêöƒ_l®ýÍÕs3~_‹êßÿù¯cöVEª¯ˆ#ëÛ««³ç–ÃÜ”=bÛý¹¯ ^§Jy5S†}ÄÎÃÍUÔÿE󟶛ÅÛ%d ½|åæï–Ÿ÷ßÊñÕILߪNíŸT]9lM3êa,6ŠÕÆv%Øm$“†'†'†'†'†'†W ¯^5¼jxÕðªáUë†W ¯^3¼fxÍðšá5Ãk†× ¯^3¼vÀÓty£dc²1ÛÈ6ÅÆjc{ÄEÌÀ]·ð?ö˜Ø?ÜyL7XQ¶^KÔK^³k_%aÖ©{0ôô82„„Çn¡!_Q  @óÒ«Oí_EÎ' R6`nØ-2kðµðq&4œ‰ª‡´ Eæì5©øËq&i8“Œ®Gœ}Ъ–“/y“<œ UÏZ™5ñY+ëq&<ŽÉ×Õ",ѦD†ï´Gf¸…p#èõgMžµ4iw–æbcl ¡gZ=rÕq&ãERØ3Jp Åg˜, £N¢ãL†; g•N†j *“+,é8“áNéx=~E¸/!CsF€od2ÞipvB4Õ0à€¤ÌËe~Ôm†k&#x@!™DÓ£ü.Ç-$÷ÀGTt ‘„Sí¼Âq Iã½&K—A·UF­‘5 Ä|œÉxݰx­cA˜ŠÙe¤cJrœÉ@¯"Ã>2Ô™ Ù‰^ºÀ‚ëÙæ—‘¶rÇ&¯§Dk)™ÊD64žM„©L7±×+§Œ¼ŒãÃD>i<Ÿ\½k|Ò1Lh"Ÿñ¶“jóRçq˜É(­ 2÷ùŒ» µ#ãÐ.p/—ä‘HcD†§¡ÄÑ·¨W®Í÷ëá‚*2­¬óøÀ›<š…àSšÔúå8“áiÙWì Ñ?!Us˜ÀdxàMÈ̤·Þð$.z‰O¾±g2ÜN¨§çÖmqé) N`ÂÙô­É(ô´¨Þ\*ò¿fR†Ò ­ý†Ô}‡**Ö)á\ž Q¿[£^ïkåÃñ%µ‰|Ƨ#Ê0Z‚xP·ÔÞŸa„¦Êg|:"Bø×ÚZÓðO(wˤt¤|Æ{TÄ©93ÔÄ>1>#[ǘŽÛ±Œ— jÝÖX[i|øá·%O’Œ<%džƒHÖëHªBcHÔ!òD>ã-9â¼*zýÏÒÔ«ø\¦òoÉZ‡iÖ[uÐKÈáe"á†3â ʻأá!0£´9nÈu8¾Q/¢4I)£\`Ïõ8“6œ E PN%¨)"b¤2!IYKm$IHýJL´ÙŽäÐ&ˆ$/ð@ Wojý–0$Á V‡×w5àx"|8Í6òSêÝñ¸ UOG¡Ç½­š@ä ®¢|M©ßÎõ_*0Òö„<ï•v/irßíþ\ë»!! Âý}·¤¿:`kµ‘þA†õÝ-°{}·"²ï¦?„è}¡hý¡hý&²çdý&²~Y¿‰¬ßDÖo"ë7‘õ›ÈðÈð’á%ÃK†— /^2¼dxÉð’á%È— /^6¼lxÙð²áeÈ— ÏZ¯b-faÃcÃcÃcó¦«X¿ULçR ÏúRxd?îà#PN¹§í¶@Ø>Ów-£ÝU´õ´pÄÑ=ÚÙíÁ{TÆWŽp[œ1²þ,«g\ ¬·Ú“J‘ø¥£vC…pªôCGA))2™ÐøÚ±”‚ÓjÇlÑ‘ˆ§_¥þcÇ~dÕßÍšB¥okâxZsïF4$ë£:Ú„ë¹á-WX,’ZJÒÄ0$¸Ø*OÐc^¢'U­%¹&uq•ñMV–C a¤‡ªÔÜj‚­ÐøÃ9ã”’’èÐÜD…G5MriJO8ÁZµ !íûfšxõß O Œ„Y+<éÇ2¦æ¥M¥3¾-pLÕ»¨`ÍèÈêalç :|zÓÛwØŒž¹_MKô$M>ÑDYûý¡Þod$N~¤ûù ¡ßmçµ½– endstream endobj 822 0 obj << /Length 1591 /Filter /FlateDecode >> stream xÚí[[s›8~÷¯àmñ,ºKûæMšL;Ýî6q÷¥íÁJʃ‹aÓüû ˆmd{R97Û“qˆ‘Çß¹}ç‡ü {å7Ko/ÎÔ Ô؇‚8L`_P!„“KçÚù8œµ|>øs<øý G¨eHñµC¨Or>¡ÂOœÏîi|u•È|è!Ž\õü¡\ ~ˆûi.óßæÕ"vÏËx"‡€3¿Žß ÞŒ? Þè¾sŸ!äDÓÁç¯3QkïœÀÇ‚;·õ'§ŽúÛWÛW'Îåà~Çz¾æÅªÇ^|{¡Ÿ‡; ðE @õ<êkæƒÈç¤yâ#uoèQŒÝ7?Ãé,Q[F»ÿ1ô°ºûW™±¾ÜY.¿ÿ”óúÚ8Ÿ=H¨«ÀÀBT¯ý²ò|Àepéöf¨xù‹¬‰ k¢±~›†Qÿ7„ÜÕKÓLis•"­l‡ô4`<±@¨#[Ô© uªQ/ùüQÊünõ¿ã€¿lM݉pvù¢Oa&Ä™FüÞ‰*—2*‹o2­t¾ˆ£°ˆ³tuGd'º¾ŠÌM°r ë…L ǻæþ¼œÍjï‘åEsç6.¾5 —é÷4«>{›67âF2¿#éUA-žôä€Ñ³#ˆm&E«˜—Þû¸Ð±®(ÓT&Í'¾$/Ôô6ôŠCVh+ °Â@ÃzR΋lÚ šÍ*ï¥T°W˜)<fb 30Á :ûŸf…¾9*‡À-ªì»Q–VIÛM™Ý+Eô5¤ Fw` (Üèey•Ê¢ÑÛ‰Œ’Ð  €ü…Ÿ§·.j «ŒÀƒX]5â* ¸'I¬>‚nÑ”Qõsêªú š¯`´YÞ²¾¼*|eñS¿*ÛÝÓ°µËªpy×DÍ~‰#8Ý“Úæy–Z-õ¡–Úe”Íj÷Öüe&…¯L²Æö éAâWF¸*ÂÚô@]ñV§ÓÎ­Ž–ähA¿jAä}Ø¢?jÞ¦ØFÅko)<¢˜'ó‘Äx¨Âàh»þ xp¸?0°Æ?§[­‚"rŒk#„­ ˆÄh2Éå|¾ÝGAv •pKàikºË¿yHøgXörðs¤.H£6Ë-ÂB&Ü—Jª¼_“#¡=Qñ—g!X eS£µw„pè%à³JŒh‰dÓ©>dèU‹ˆ‚c ¸; +Q-°³¸=rNtÓèí$GÛyv¡±ÖÊêÆ^edc¼×2—iÔ;½è¤žTB|„NVZ¯µÅéfxÏQr@²é\N~µéÕ%t¼ëy-=¶'ò:,“^ú <¦@_ý»–×òAO þ‡Ë^ ™£OÑŒb –b@&1 -†q<•YYÌ/¦^ë6W®*Ò«º7°šn?^`y4®5¨ØjÇßËò–Ïð-L›µ,•›QÄ`¯ rÎ,&&„[ÖÞÇ2Žªú}¥DWú}TÅn9Ó›ö‹pO¼HÕ$qñ„œ³²8·9eà]7i ´–t·Ò×XËsäˆ éŽsK5e&Ä;ÒÝ]Ncí>«ˆ×›Î*íýxúÁDnâ L ëº. ô¹f)N'ÒÀ“f„ìž K°… ì–¥÷ouZ&ÓI–{sÍÕ¨‹KùÁšÚe~°@q´Ä½Oi…sÍ€Š* p§•¦—é®.†{â/~ ÙÅjÏDÕm¹·xÂRù&òÆ|´%ØŸ `«½&ú€SžÇ­òN›.b?ÁŒZ'-ìÈ;:N±<.êç´u¦ÂÖ#Y—ßãYƒ©n•æSÿÌñŽ@–a‘nB»šŸô&uhLå¤Áýíèíi/ã`O:ÿFŒ±­J³Món‡:äb+ß4ÔvrÙÌbóÛ¡ ¹ˆÝÍap=DÑÌaÔ4kËêFUémÅÖ£:.°nã<ɮ¤±¡yTï¡-ð{¼dr¤iØ(•Í¡ë†0 }¯üe|<è\Á´¼Á¿Íˆ1~àÔqËç3F<;‘­aF&j†\CÍ`öÉ´X9â[¹¾þØ‰ë¢ endstream endobj 844 0 obj << /Length 947 /Filter /FlateDecode >> stream xÚíWMsÛ6½ëWàVð@ßzKRÇL=;Êôàæ@Q°Ì1EÊ$5Žÿ}åX$§‘åÊnG#QÀ’Äâ½Ý‡ÝkD#r÷­[ócT EEÄŒD±‘QÆTYtN'-À|> stream xÚÅ[ß‹]·~¿…Û]ÍŒ43HbÜZ0±Ú?8ÎRLÃn±×þ÷ýFWk'iã+§:töѧÑHóã;×DSI&–¨6´žØ+Úž*÷dµ¤f‚–’CËÉ£_•Ô=ž×D$Ñ¡%b³“U…$F÷ ‘M£¯'²{"oèÜJ¢Þ!®QâñzãÄlŠ I\ ZMÜšã¢%¶Â'kØ¢%î¨ñX.¯÷$ãu-I*a,¥$MñH9É€ŽÄ1 iMÒ;㢥JÒNf³5Œ¥–ª0æˆ T‰ ª¦êޱŒS+Œé@ óÁEMM(î´ÔªÆMMKÜ1¨­HöԼǞ´@›Y -à‚’ aPç¤Ó5—¤-€aÔ°0†~:FwüS8ú`&¤~2Ç›BÑ94 ÝØÐHGŸN†¬€Ú%y %à±…&g h]±¢,y3:Y÷äKÐ{r‡Žñjê¥@-…R',ãŸÎÐ ¡Jˆ¯©7ÌÛ1ÿn6e;¦RJ?y)jq¶P8F C©5€® .\1®,Ä’àÊ¡FÀ†©Ž{°5"XŒxL cP•rr¨c\ô%¬ ®bŒ÷b$‡•‹§ÌLñFX±Ä”’¹Åœ¡bI³‡wŒÁñn¼!,%ð Ð ¹Cõ°JŒä˜IÅ:ú’`áq…1$ŒÙ±Â#–±ýŠD?ŒQIûéÑ£Óùù¿þy“Î_ÞÞÞÝŸÎÏÞw?þÿó›ÛœÎ_ݽýþæí‹‚Ý[^žÿxþÓùë4þ9¿¹y}Ÿ^tË{¯*™±¦¬%wL¨ZÍÝ Ý¾L¥ó³tþÃÝó»t~œ~÷îýwñ‡×ßÜÝæš¹fù}úâ‹þþw@Æ6QkÏqpã s>ÊØk¿Šç#˜¶ʃnD3N¢ÄEsE­–ÝûšnZ¦ý€ q3XR×\-N#¬@]ÅÃûð´–'‚t‡‚8ÎíÌ¡ Ò¡ úï€&”¶ÛbÄkÖØ¸B9ræšÅ±>b€€ó†zC ¯ãœqn/,Чõ¬ðQ Õ„Oí™— &ðð~¹»½<h„Úå­'žXâýÎOßÞ½~v¨éüôñ“t~~óã}zùóÙ?}õ÷›Óùkˆ»¹½—œÇë1Çwwïß¾¾y7Š@ãÖ_n¾óê«»ÓЊÒ(”a¦O_½Å»Y.ý†BßaÔ(–¨^Z™mm›íC?›­Ï¶_Z/³¥ÙNy>åù”çSžOy>åù”çS^Ÿòú”×§¼>åõ)¯Oy}ÊëS^ŸòúE^Ôù.-Í–g+³­³m³ÕÙÚl}¶SMy4åÑ”GSMysÝ£œwi§<ºÈ{¹wß!ŠÒbX:GìCœJ¼lêû]¾´0†s­õ]l[ ‰h¿ÓÇnÍ*Q§‘Ä[Á@¼Ñ~·¯È–‹Gæ¹  r=[´ßñ«Â“\ 4‡·†-­;“ýž_ ‰Gþ­ -_6êý®_þD©ÁÍ…Qkد†F¼ß÷+b!÷¨¸ Á©‘ÙjlÄûý¿ÆRÉ,)„ q„%Ë€ö×z[ñH‰bÉÂ7ûd©WwgòÍo“s‰úws$×òxÝ_Qh‘ï8(97Ü–Fב˜ÕŽ¡ë‡ok8yÅ=èÞZËÁFBÀ…M;ðÁmÏúaHŒ^ª!¢iГ/y«À³¿¢ÐंpŽÊ0¥wÎÖñì/joh‘¤²_¶TA¦ÁºˆçÎÍ‘œFÒaNPJpæd¶ˆgû‰S£¤Ÿ=æ !²ë;}?1:|8²vÒ‚ùu$u?E[r×(·ô˵‚Ä}Év꯲ÁE¥i)t„m_²ßL‘žFAÎqSNR‚mgC'%ËU/üù§(ÙŸ"Ùu>³Áö ö±Ãr…—¶²ÈÎ2!úÕöìlà9€ m0–Å>ƒœ 8r9¤ZXÎ:9xêa䬸Žxœ <í8rV/9Ë:9xôr–ƒ;B{) Ìz+ µ†XÀÁ»q'é]|Kø:Ší88…‡’>´=ta¯à¨¿`?ã×ÿ_ö³Öÿ`?+ÿFö3>”lO¶Ž'[Ç“­ãÉÖñdÿxö—ÉþÉdÿd²2Ù?™òdÊ“)O¦<™òdÊ«S^¥#YÁùÝÖ:+ˆõ? •µ(G™]XÊø õ\­/âáã8A›Q&[çF 2÷ñ-ä:%xêaŒ ·ˆúg0‚§BvJµA`¨Ö¬¦‹xô0>P°¯Âž×ùÀÀcÛÃ­Ö >ÝRFh«ý“a€ï§ÜzÉiÔæQú·}?á¦Ð®ãûÐæÈAê5Ÿ×`Ü$ÜÄ¥m‚€ˆ¯#Ù‹áæ& “È~T®#‘ýöÁ‘š"Pt‹5Án*õ“&²³”0B”]ãÇjQÒÀÿ£ö}ÕH¨ì·’Ú= ]~ï2 `RtÊv3©ñÅžÆ\-bù¿Øj¶€äƒ™üÕ&§ endstream endobj 858 0 obj << /Length 3011 /Filter /FlateDecode >> stream xÚYYSÜH~çWèmD-T¥’ÔòÛØ`†‰€wcÃãÑ*º¨¥F˜Ø?¿yéyƱáÀª»òü2³úÁQž?üÕÛY÷êÂ)þEÊx: 81^%IâÔÖ¹s>ùΦ/ŽÞÞ¾”“À´Žœ›;'Œ¼( œ8Ô^%ÎMæ|uÏòÛÛÂÖÇ«`¸pw¼R®‚ÿB­B÷Kcë_œ4îE—göx¥•ZÇntüíæ÷£ó›£‡#Eä¨át³öâ p6û£¯ß|'ƒ¹ßß3ÉÚy¢•{Úí¹>zA±Žà,0‘ž’¬o2ÅHœÒ¡{YÊmë I9}¿v”ï%~¢p›Š¼$ˆœ•†“BÍûÞçuÓýaâVwð|7-ŠhÅÆMžIK™éÚ]UóØ%žŽuìVݱr‹Œùý±^»–çÛŠGÛ]ZÞóÐ3Nÿëϓњ‡ó»­­mO]^öÁ]yóßÞ}zŒdÁþPؽåi›W%hÍhß½¼CY8«ž}x¡E·;<*P›!¡±»éèˆXŽÀ9ÍsÀRSþÒòjˆr´Š'b¶æ…Ï, é=t@="7TóEÜÙ¥¸ÿ‡,¤ÄÁ3ïiºíV9Á‘ؽ³¶à…wµµ¼ …ŒßM%Üo„Ì}fC"ð™y1ûýP¤yiAo¯PÀh½>¸ÿÅèeÓîÕÅ‘óÖj÷Ýä"Ú$¶JÓ »éå÷×¢©øŠ[#wHzh85 hæ&6xôÎnP&÷QÕ÷ÞÔá{´»a´óÕ 'Ê,rUÚfÑ\| !gð”M‘Û²m4°ÊaÝ_~èçž% ˆÜ’oÌ,c™™kÆgÚþZ¦‰!!™G2•¨“%‚µ¯<^ ûU°@pìcþ?‚AŠ„Þ˜Mqäù¡™K}¤·÷X ;Ö,Iâ¸A^xmdI À,h%ï³Eú¼È–ö” ^³F³÷lA†3e ¯'ÃFâМ+ u¥¥6c,X K÷¯ (Àó\UÊÐ “yná¸kÏñ\hì? ¯2>e ”l¤5ГÉ\‚h£ ÷ÄJÆK- ÎLÏšHUبí¾jåf4Žî¤^d" g 7£Önsà7yp‹>H¾r ¦Uøís\&®ž·ê\ñÆ.ZAˆs#Àÿ(ÛÜ}m &ö”J†(GP áó–©$È…nïÿ™„íK ¹¹,l¤’ øŠuOuŒÒÌöy™7 ¶ª§Ár"P^gëgîM$Ì)ëpˆ÷€‘¹œÐ@FÖ vDZ­õ ºÙ®°«¦É·œÕ‡´N÷á—q) “ŠXb |Sþ°†«º@‡¡^‘ئ$˜BßFJÔÜŸHÙ€rÈdÑÙü Ï´z0F†~¼™=$[,R5ø(úî2¯®®Åt)Á2Œ#BÚèS l¬¬#àî|<¡•žKì†ùý˜‰Âð¿ó2#´{jx’ÇÖîå´:-·y¹•3êjÏ­7†çÙÎYŸpŽúçüÝw^˜ÀóLNìÂuV(kž›Öî›%¿aGÖÆý3ETÐûñš!åe­ó¡R(Ä·cÈ ®1£ÆÅלÁþ\FŒû"Æa&R‘Ù¤ÜÐ=ùŽ9ðaªÜ(~Õ/ã·w]1²ÂpN‡}z„"žJ³ ,mQ4ÛZb+¨Ibê­ tE{©;‰„Æw«ÃPÈ$?:¨2ŠY¼#8IÜ·¶0)'ܦ å™Ð¼ëJuZôh8\?Â+žg…N®S^2''ÎV-ˆ}õïx@"È ¾þ”ŠÝð…rÝoœyСy+A„ Â| 8 P›ÅÔvÍ¡@»ÄJ6-74Ü›c#gZoKñ&vÏ>\O‰ÝáÜ!he¢ÎÅ" ù<‰<^kåŸÑP økE/F;`y–<Ü@­‹ôsûnŒ¼DèÖ`Æü–’TK»2³õOUlXP†‹_xçŧ?^œ0ü¨™¼"ßX(­â¦Q¶)™®¦gÌÛ9‡XMÏ?FO©ÓðGKTTÐWጽ¬ ”´Kë­Œ³šp¥h …¿òèp\Åù>®~` ‚@)‘K–›¢Ëh Uüû½­%ÿP¤ÇdÂŵ(ˆ®ï³Yî"ãtZí‚GM’Ûì„mˆêøÀ¼"ŽæÐŠïñm†Zg˪ÛîÄþÈ„ Vøço»m#Gnq£„z•“¨˜1¼‹=u­Ü %Í)R°Š‹\Ôg½µÿ¨ž2}õéWGñPYt#vc6’`ÅfT³b‡‰ ž9…–z¾2y|Àó¯§eì±{e{rx«\ò§±˜å@bã ôh ©Ã ?UβÜ…„arŸIV­=í3këœt@ŠÏÅ55wx[¢YíCFÃcµÝ¦5Û(®-lÚð’ÂXseÃð¾á“ÌMXköbØ’Ë"mÈò8e™œš6÷<Ê-ÓTËø`»‘VSÏ‚ÐÓÓ²”YHd]iÍoyZ£LOpD¦­, Š )é±b~3ž h©©žÇÏ<ØmxpL Ò â o÷àu¹Ü v äÐc.,#Eái›œ€csOêc³H!eß/q>T\-’áÂ÷'C§V¯b'ïg—^‹f×¢0G¨û‹ÒŒ³S@ti«C¾AŸH >ëÒØðœŒ¬â'ZhÞ—Œ}‰›Ê¸›"¦²ñðÅqÂyÛ‡†—’‘ë·zÔËÛå7Àþ{~3ü: Èב£•ñBáÏGÊó~º 7†6MÁÚó õ“öö3§—{åœUGŸ'¿ô·¬úkV“{èg…ù£¢ŽBG%p«2ýïòÎ,ª7K0 Õe<>´\ØÒRMJïRáz¬–³„WžóëWo¥3²V*ñ½ 1¨Ç ×êe–¬éDÌ“G¦¨L$ÁŸ5xnX’$šø).'s‡…“Ô1òñ·š9ГD›oº"­yˆñwTÉ ‰¯HøÛªmʉÍÞ¼x‰ü-ˆ@PZ{¡Šú§ÿíó55{õ½•Ä< 'é&÷!ðn*ù±!'ŠÄ‹a~ÀGêPÞ'µ¼ӗŧºÀ÷¢1 ^üãòÝåÍÒ;Fìã£ñÂY9UدøõìXGî¿P—çWø¶~sy}¾pnd> stream xÚìXTÇú¸ï󿹚û‹ ¹ŠÑ؈-ÞhŒQcר1jbbIŒ%E½‹5D±Äh;–Ø‘"*ÒQz]úÒ;,KïùìèÜqÏÙÃ.,°à÷>ßãƒgçÌ™3gá¼;;ç›ÚZAAA^9,--gΜ¹hÑ"ì AA¤ Æ;f̘0Ì;W,cÏ ‚ ‚ m °\pÝ(`Ù²e‰{ AAi€Ù®]»öõñúë¯ëééåååa!‚ ‚ ­°Ù_ýÌ–«»={t×éòîöN:Á.eeeØ{‚ ‚ HëÂÐа[·n\ÅÕÑéüëîÍ)Ñáþv[7-×ÖîÀ-;a"‚ ‚ ­KKK]]]®Ö¶oߌ¼ì—F Çý•ËÂKÜòP T…ý‰ ‚ ‚h,Ü$”ÏyÚ¤Æxò†—ë½_ÍâÝqذa˜- AAÑ4’<Ìüt’«ÝíÔ¯zÃîþÉ“øýyòäÉ"‘ûAAiq’< 6äî­s©±Þ*ì;òVŽ€}Ž ‚ ‚´Izõì~ùü‘´8ŸìÞ¿Ÿ.¯ëééaÒ`AAƒ——— ø3"€¢$]u:ïß»µ1êˆá‘_ BÞ¤ÁàÞ˜4AA¨/ïÓúl6*LÊŠ°$yؾeUdSz¼¯#Aì¾{×mm-Þ¤ÁàáøþDADy ô%€b¶¶¶Ø]ˆ@’‡UËùvK¾ûZQ¶4LŒ ‚ ˆ0†††ÿP===œxùJ!‘H–-[Æûf7fÄ‹k’„€f_7°nEÙÒ0i0‚ ‚ ŠU Ú°páÂM›6iii‘Ç‹¶nÝíììÌ–‘›x‰ØæO:úúú¼Iú÷Ó½záXó«/àÞ`àŠ²¥á#œ‚ ‚p݆›‹/:88Ìž=ûù³ü]»^ºt)99ùÆýúõÃõ¹^)ÊÊÊà3|ÒáMòðçá݉&×Ï yï]^ ^¶lfKCA„bjjJ=AKKËËË+P†H$ã:tèóï¸Ç³µµ‰‰Ñ×××ÖÖÆ… ^‘÷o’‡ŽÚZ;ôÖ$Eûd$‰4-Οþ£WÏ·y³¥á¤AAì¬Î3fP‚‚‚þøã.]ºK–,!¯þðüŽzŒŽÑpqq6lïhêêß…ø;f$irÜ·³«NÞI;¿þú+fKCAWv ƒýû÷sðõõ]»vmûöíëFÿ:vüùçŸccc?~sæL^õýlÆTO[irp«ˆäß[×väK oQœ»Ž ‚ ¯,^^^¬¸ººò p° gggªF 066NMMýûï¿utt¸Ž1f̨{¸!”äaìÈGV7[‹ú²à´zÅ÷ä³›ººº˜- AA^A~ýõWê#FŒöëããsàÀsssV€Cd\¹r…®š1uêTp游¸mÛ¶ñ:Æ¢E‹ðá#ÍG ÉÀþï\ûû„4%¤U‡¿×ãEßÌQ”4áDAW vžçêÕ«©ƒú’ß|ó££#+À¡2öíÛG'¯ZµJ,‹D¢9sæðN ÆY—‹`’‡.Gÿ%3%´Í„ó㻟͘ª(i0fKCAW¹àLLL¨éëëÓÔ[¶lñõõe8,,ÌËËkåÊ•tbðþýûÓÒÒlll†Î;ë¿nÖ4’<ìܺ.%Ö¿-Ù/ K³+#†U”43™ ‚ HÛÆÈȈÞúß~ûm"ÀÁÁÁðjMMÍøñãÙ'Nœ`···ÿä“OèÄ`ssóôôtCCî]»â8›Æ"äaÍÊÂD®™©am;®ÿ}r@ÿwx{`íÚµ8oAAÚ*sçÎ¥7ý¯¿þš pbb"¼š••Õ®];xéèÉËC>x>¨ûÑGݽ{—` ""ââÅ‹}ûö}ž+à³Ï|||"##7nÜÈ;1£Jò0ó“/ûÌÔðW'N?Ì›-ÌÛÁ„~‚ ÒÆ(++cz:uêàÜÜ\(ð÷ßÃöƒû…§A>z®s—烺 ,puue˜ðóÏ?Ó5”7mÚåëëË«[:u200À‰Á͉@’‡ñc?²µ1ÉJ #5>ð·ý?ñfK#+}ã»AAÚ ¶¶¶ôFß®];OOO"À"‘¨ºº ,\¸°îɸ Ûý#ÒIxŠ6nÝ­¥¥M&ëéé²,‹Áx—.]J×PþóÏ?Á»îÝ»7xð`ÞüöÛuëÉ^3µ ˆHgÃþiÐü…KÈŽ=zô8uê+À@ddä£G&NœHÊ 2äáÇìØ±#W0fΜ {ái „’hÐ Ì–† ‚ ­öñ}}}*ÀR©^utt„í»t KxÃÔÒqä¨qd÷Q£FYXX° DEE={ ™”™7o^HHl\½z5¯`èééá”Kõ¢8Ƀö®íÓƒ³%‘Üôuú|æ4Þ‰Áø'‚ ‚´^à>ÎÞÙïß¿O¸¢¢ lÚ´ ¶Ïž·00R"ÇÎ\}»G/RÉÂ… ÝÜÜXBCC·oß®­­MüaÇŽÉÉÉîîîS§NU4å¯NãHò°vÕÒˆ`lI†p¸:Z7J®÷ ðÝ… ‚ ­v¸úùù‡W«««ßÿ}xéøÙ«¢¨ áð IÚ¼}–vG21xÛ¶mÁÁÁT€£exzz.^¼˜N ¾pá‚T*5550`~׬ö6Š’<|5w–ÈÏ9'# CÉÈËŒy`cýÖ[ÿKè¿8øCAVÊäÉ“é=}ÕªUT€ÓÒÒàU±X ÛÛ·or•¡L8z„|³x)|æÌV€cdØØØŒ=š”9r¤³³sJJÊÞ½{y'㒪ݥ0ÉøѮŽÖ9ÑÊGyYaiqnlˆÝïõAFAÖN^^kGW®\¡\XXŽ=Z稣ÇGKU 3k'Ø‹N ¶²²b8VÆÉ“'uttH6’H×Ü^ýu}}}œ¬ÌÕÓÓãMòðþÿÞ5½œ+ÁP>ÊJrËŠsSb¼]ï´3Þ>ô¿½P€A¤µsõêUzC×ÒÒò“öKð©©©!ß¡ïÚs($FÚ€8qî¼xñbV€ãââ"""¶lÙB×PÞ»wojjª‹‹ »ð›„ÊÈȯ/eee ’<èœ9ùg®4Cù()Ê~ö¬&35ÜýþŸ&?ÙßÚ‰Œ ‚ mƒE‹þ—èé‹/¾ L¦dff’Å,ì\ýCc¥ ÿðd½Ï'kkkïØ±#,,Œ 0ïããóå—_’fôîÝûÆÙÙÙð/ïÊcÆŒñòòÂk'÷A>ð$y訽oÏNIrD®4CÉ(Ê“ÔÔTçeÆû9žw¼½ÛÑTAAÚ eeeì€áo¿ýF8'' ˜™™Áöwú ‹Íld¸z…-øöƒOœ8Á 0Êmaañᇒ2&LËMKKÛµkr­lÞ$ÐiëÖü˜#ÊËŒÃP2 sSª«*J ³B=LœÍ~qº³AAÚ...ìpNNND€Ép?üð¼´ríæð¸LµÄ=çF?ŸÛÚfnnÎ 0˜˜ø×_щÁëÖ­ƒ—ÄbñW_}Å;1$ä•]V$±0¾”äaÞ—ÁOó²â1”Œ‚œäªÊ²²’¼hÑCWóý.w÷¡#‚ H›DOOÞÍGŒáëëK8**ª–]ÎÄ*">Kqúüõ={Ñy>>>¬¡¡¡ëׯ§ƒ>œ““cgg7räHÞ‰Á¦¦¦¯Ô…ƒŽbç®°L?ÆÍåa~V†òQUQRZ”ùÔí¾«ÅA`Aià 4ˆÞÍ·nÝJ˜,çææV÷dœvGqB–Ú#(2uÛ®½db0ˆî–-["##©'Éðôôœ1cMP|÷îÝÜÜÜ3gÎðN žÊK ÊKòÓâü|Ÿzjuø‰å!`AiÀm²údmmM˜,·{÷nØ>ëËy‘ ÙM¾{žôLGGçÔ©S¬'Ë033ÊJòž=«É‘Äø9]p¿ÿ‡›µ 0‚ ‚´y é­¼{÷î¾2À~CCCke À1¢n½×£§£³›4¬¹NüøÒ’?üÐÒÒ’àû÷ï§k(ƒý‚$Ïš5‹w eÅ661X ÉÃþ_ô¥é19ÉJFIaÖ³šê‚œ”PGÝmŽ #‚ È+ûüÔ¢E‹¨ƒm«qqqíÚµƒ—|ƒãÀQ£“rš:þ¾nÖ·ßóÕgÏžíïïÏ pjjjDDĪU«žy¾õÖñãÇóòòlllÈJÍrèêêÚÚڶˤ(ÉÃëíÛ¯_»"9> …Vù(*ÔTW–çFÚx=2ô|x AA^@Ùy¤FFFT€Ép'Ož¬[ÁmÌøÈ„l"À1ÉÍ{~=¬ýbbðÖ­[cbb¨iiiOž<™2e iöСCåm{AA^5,--ÙàÜÜ܈ÖÊ€›={6¼´m×Þ—8·" ,aÙŠutbðÙ³gYÒÓÓoݺտšG"***))iݺu¼º¨§§×ºÖPHò0qÂX÷'v…¹©ÊGUEYYq^ZœŸ¿ãy»3(À‚ òj²lÙ2zÿôÓO}||ˆ“à Ép=YŽMÉm¶°sñ™4ùùÄàáÇ߿Ÿ`@"‘ìÞ½› ü¾þúëúúúR©ÔÏÏoÚ´i¼ƒ 5ÿº$yúþ`‹»Æ…¹iÊGEyqEY‘494øé ?#_û³(À‚ òÊÂ>QõË/¿P& Àݹs§n½¶ž½Ä Yr—Ú¬qÕøn¿þÏ'Ï™3G$± „„„,]º”N ¾råJAAÁ½{÷ÈuÈAƒ¹¸¸hæLòÐõüYâ¼t 壼´ öÙ³\i\¨çí§‹þŽçQ€AäUÆËË‹õ+GGG"Àþþþd¸+VÀö…ß-ãàøÔ¼ø´f½û§ƒ·mÛ–@8C†““Ó¸qãÈéŒ5 þ[XX¸ÿ~Þ‰Á Òd [£ì—÷I·Žµüº;+#…Vù(+®ËoV”/‰ °t¹àü7 0‚ ‚ pã¦7ñ!C†øÈ&Ï‹Œ‘áÓ‹Wï(à„´æŽ`qâòUϧøvíÚõÊ•+¬Ke\¿~½W¯ç~2þüXDæ¹k(ëëëkÎÄ`vJö‹¶ß°nUZRTq¾CÉ(-̪©©.-Îs zz]ôä* 0‚ ‚ v°qåÊ•T€Á$áUøŒµŠÄ©œ˜žßüáôÔw̸ ¤åãÆsssc8333%%eïÞ½dŒN:8p ++ËÃÃcâĉrJNÎ(h‘ˆI’nݡ߾ý벉²9 0ýøñã‘#G’34i’§§'lܽ{7oŽ…… ¶àÊìE>t€ÕéÙi‘%™ÂQYQZQV˜#‰‰ô³ óºêiŠŒ ‚ —¹sçÒ;øW_}E˜,—ššJ€{⦤§´\†DÏøì :™ÙÒÒ’` ''çÒ¥K]»v%eV­Z/ã›o¾á JÓ"k(³}JØßß¿–Ynýæª pfaZKÇþChw|ž*mçÎ ½Ù/øù矓s÷Ýw­­­KKK¯_¿þÖ[oq5xòäÉ"‘¨8Ðõª¯½‘å‰e‰Á¥EÙå%ùÏjªËK Rc}¢l"ý­Q€A©—µk×ÒÛ÷˜1c¼e€ÇÅÅÕÊ€ëÞ½;¼tËÜVUN‡È*jÙˆŒM]²ìyÒ³^½zÜfq°²²2d)3}út°\‰D²cÇÞ‰ÁÐ]Í31˜W€EO®¸\±:µ">Ä¥´(çUŽò’¼šêªªŠRirh´èQtà`AA”DWW—Þ¾wíÚE8;;»öÅøp®a±™ `IV‘&„£‹Çˆ‘‘sœ:uª§§'Wƒ=J'oÚ´)###22òË/¿ä]CÙÀÀ ©'+à ·›¢§7^Øîa^VœûJF~MuEUEYŽ$&.Ä!&è1 0‚ ‚ Ê#‰Xµ³°° ìççG€#ãÃs¾ZÔ`ÎÈ.Ö„d]¼Úµëó¹ kÖ¬‰•s`زeË:ï÷ôéÓ`¹vvvC‡åj0|p°´´lv¿âaêpý'ÿÇ^5û­®*¯ª,+ÈINŒpû ¶CFAD% è½{À€^^^D€épdnÀÉs×%À9- ÀéYE☔ ›·‘Ti]»v=zôh&©S§’>ùàƒìííËËËA†;uêÄÕà™3g’¾j~õ¼ãjvð©ÙáÂÜôò’¼6à½åÅEùÉÑžñáÎñ¡Ž(À‚ ‚4€É“'Ó{÷Š+¨“i®AAAä 2ÿ°äư4§XšÛ’A8-³.G„—èä©Óhª4[[[®ß¾}>2sæÌ‰ŠŠÊÈÈØ´iÓ?øÐÓÓSûÊÊp˜—™§¡ýÕ]’ø ò’ü¶•%Ïž=++Ε$&ŠŸ$D¸¢#‚ Ò0ÀÙX‹;{ö,`²Üï¿ÿÛ?=.4FÚHÎÌ-i¹`h4òº‰y¿þÏS¥Í;744TÊáСCey$^ýõ]»vÁ–éÓ§óN 644l~÷1t¹fsnmèÓ;å¥m,*ËA}k*Ë‹¥)aÉQîI‘n(ÀÄÒÒræÌ™ê}¯"‚ H+‚U¬:xÉû ®•-÷ñÇ×=·ûZ8+¯eB‘CS£2výü«¶vG²xÜž={’““å8::zõêÕtb°±±qEE…Í»ï¾ËÕàAƒÙÚÚ6³ƒï…ùÜs6ùÕÅä@AvJ±ßò¢g5ÕU•e9±)1^ÉÑž(ÀWßaÆ‘v.[¶ ÿ"‚ ¯&‹-¢7îY³fQ ¬•-§¥¥/=vñW—gç•fç7cÔ'ÀÐ`h¶(ê‹Ù_ÑTi&&&ÇG“ʹ¹UVVþöÛo¼ƒçΛМág%ö¿ïkwÞÒðÇäH¯Š²ÂV55UÕUÙÉéñ©±>(ÀjT_]]]xk5õ]\\V¬X1AƼyóΜ9“žž.P>**êðáÃ^°cǨ[¬¨¨è°Œzeà Š^…úÙ¶Õ{ Ra½¨Ô?Š*¹yó&·¯h{€2 ¾¤~E=È`ÃÚ§m VÁå @ê­V ‘\*ä}ƒ)s¡å*ç­‡VžZïÙ‘Sx÷Z[[+z§‘ß n—6¸+”l­ª¿• ø "g]ïu‡ ¿×ì[½“PtA‘¶DYY+o¤\PPnݺÛßéÛ?$ZªFÎÉ/Í)h–PZ€¡ñq)¹æÖöƤ©ÒÜÝݹ æ†LÊ,\¸0Y–[CY__¿1ƒ À‘Â}­]ÜìuÿDQ¾´¢¼¨ÕQßâ|iFRpz¼Zœ pëR_ð+¸ûÐçjéDzøAÑÝ\ˆ-OwY’³5RL¸ pƒbÐ î-RɶɈT(L½­â¶P *¸•sÛ# YºˆÝEÑÉrMƒÔÏí1 ©¡Áí©`ÀþÌ£ @ ‘\„+ä^÷z/4Û ¤rØÂûуTÅvu½gGN Þ¥ŠÞN´ß¸jo¹Ã5²+”l­ª¿• ø "g ÿ |ˆVô7¶+êCE¨ôIi¥À_$v8{{{"À~~~µ²à¾ýö[xiùšMjàÜ‚²¦•NNçÀῺèü/0ü‘¼LbbâîÝ»µµµ‰åîÛ·þúÁ_2]„»†²‘‘Qs p¨`Ðcï'­Nüø¸©/xoUeYYqnfj¸$1(=!¸u©/{ßw¥)dlŠ´ÄÚÚš·<¹ÿÒüL·³÷úÆ0ìKî}pOdÛFÌA®mr"¿ãh©ßÿeT`8´?z+goÄTPý#÷çœ,÷BÐNh¼+Ù¸¬ô t;=SVl …l äÒÈõï°žð»®—\Û O gH?³#~×…{^T¹–% ÀÜÆpOô¶œï‘n$•p%lèU»BùÖªô[©dßʉ i!o?Sù‡Ó¿!ð/üLÞurŸ%Iß ´÷ã ÒÆÐ××§wíáÇ{zz& Àà.ß´h Î+lÚh°ÃIù…Ä-]þ|u¼®]»ž8qBÂ!88xáÂ…Ôr-,,ª««ïݻǮ*BŽmNŽ ¶ûY;ÜüÙñÆžIlEy±&GUeù³gÏÀs3b¥É¡IÁ(À­Q}…=ŠWJ‰ÁFÞ›}U-Ì{7¤ßöÊU+| zuQIV4Ö¤¨=Ê‘œ,ï·Æôƒ¯`«*ÀÊŸ,¯½±á½(õö’ò¬è³ yƒ± Séˆì)÷“"Væƒé¹!Yò®€‰ _ Æw…ò­Ué·RÕ«IÝ+p‚¼Ÿ¨<ËíUoG!¯ƒ ¢¿¼[¶l¡L€svv†íZÚƒ£3šH€ó‹Ê›()Àpjp‚ NöÔùë=zþoÒoPPP:###º†òÚµkÓdÐña¹‰Á HJ®¡¬ŽwIˆxâauÌÂpi¬È®²¢Tc¢üÙ³šêêÊ¢|I¶$*+=¸U«¯Ü­P™¯É—оÖäu¹ 0ý>WÑ.*M6njæÎUéˆäSƒð³<¼Ÿ,š¸)”Iyë#žÙH†Êy¿ oŒÓÙr—€l!¿8ì›™»¥ñ]¡ L摎å*ºÜ›SÉ9H(Àˆ¡¡!½ewïÞÝSpxx8¼ZZZ:|øðº'ã N6µª5Ô.ÀpÊá)ë6íhß¾=tˆ¶¶öîÝ»áボÖíÛ·“2:uúý÷ßKJJ<<<ÆŒÃ;1>q4§'ŠÝbƒínýrÿÌê8‘]Uei˘oMuUIQv^f|NF pP_¹û&yŒKø–T¯”rï­ `â{ÊOmY&ƒ]쀞òG$îToÑéµÍ Àt0”ÑRþ*4©Ó§5Ù‰" `z‚ì(wc˜ÛáDÿÈõ"/7]Aø±t…&°ÜÄfE¿ÅäÍ ¯²ÓûQ€E° À-\¸ 0ù ‹ÅíÚµƒ—Üü¢š\€K*ŠÔ…ÅM!Àpâ!1R'Ð)Ó>#=Ö¿ccã4"‘hΜ94!ð£Gž={fbbÆËÕ`pcá¡`õ pR”Gr´h°³É¾{Ǿ{Y•—VU–5sõ-+ÎË“ÆçfÄB ·õ•»™Ò‡²¥$"·³zï°ì «a¬¤6¿ƒâÊ¥`"_s <ý7AT]ÖE `eÚCý}úžL{¨79žºI®Ÿ‰1rO™Qà¼Ø‹Â*"¶M¿ûP$ÀŠj–›À@>Ñßâxô¿r—C™··ª]¡|kUzË)Ù·¼¿¶_%ÐGGé!¥R¤'ËK¾§@Zà]ì$UøÍ¥L€û믿`ûÈQã‚¢2šG€‹KM-ÀÁÑRèK7-tûö'ý6eÊooo®›››<˜&®•­¸§¯¯Ï¬§§×Ìœã“ë›þÄÍÜÀòÄ2±·UEYQuUy3DÝ|‡ªÊòÒ‚¼Ì„œ:ï¥ÜFÔWNxàVÂæ#âÞ¹šM€•Ü«ùXQ2(è(Þ)l–'9¨h)Ù6µ°2í‘ûF›¾@N6µ 0o'óšJš"¸Y 蹉ŠX rî·ÿtw¹y¿äXÄɵP4ñ¾Á]¡|kU`eú¶–/±›ð'Yš˜}ƒq½š~ÀäEx5Ò€»'»ܪˆÕÊ€›5kV]°m»›Q€+Í#À¢¨ŒÀHÉöŸjiÕ¥Akß¾ý† """R9ìß¿ŸLú¥Ýž>Ìþå^KX€÷î\ñâϽ®6@€ÓâýA/“Äîî÷þ¼w쿇F¹ÒÄꪊ&ŠššªÚÚgeÅùYI9’n «ôé•wí•GÑ›™ä#¢ÚÖРÜ€ï=›G€Ù”Päé~@Qê%Øœ#À îp8MªdM‚ÍåE¿.çlع™d"D#§@Ô2“~Iͬ›ÑŒô@õ~õ¯jW´øò–ƒÎds”q§jç>f«ÌŸrûÖLtuuÅb1zlƒ[íÌiÓ¦yxxNJJ‚W333ÉpÜšS€KÊÍ,Àb‰‹Oä× —>ÔÑÑ9{ö¬œ?~^?~¼£££­­íƒàw¹G´ó &Àw¯iß¾Ýkÿüç:i›\þ½a ’™‘’ç/rºvÿôjû«?Å9T”—TWWª/ªA}«*Ë rR²%ÑŠXsøÿïÿµ"fï’rg)s/Sï`åÝ£Eæó&(kÀ•¹Å“¯Œ•7V¯Ës*jmÍ&啯ưÜDˆÆ 0õ% fSاä¸I!ÔÒ-+Àì: ^ ®øÑf@m0ì”Ô={öP& ÀÃö·{ôÓkf.-¯j@´ˆûG¤û…§›Ûù`85Ÿ†Ù³gÃF}}}V€/]ºÄ¾…?Ç ðÞË_½=yIKë¿›Ó`–¦„e¦Fd¥EÆ9>1;|ïø¿GFÙé155• PßšêÊÂÜ´ìô¨zXy$‰žžQæÙøu·Õ…ð½Xî;ÍzS“Õr2E4X€ÉWÆ7_8»þZK=G”q“†©tDež.”û0"°úX#jþfY@´šî!8:ø)7Õ¤‘ÌN„h¼“FBÒh¼W„7-p㻢e˜&ˆæ.U,÷Ö%#½Ê§wÇà^e¼¼¼X»ÿ>`__ßZÙpd|øÛ%«ZD€Ë*T‹–`ß°4Ÿ°´áå 0Y*îÖ­[¬¯[·Žý"CøJ °ûãK½{v{íµ’Wÿï߯øŽ›ÝõÆpvztNÝ:a!On=4ÚpÿÌj0áŒ„àšš*UÔ·n9ãivz¤’Ü64XX½¸“ú„vÑï”i 0M‰¯(?›J ‡›4 Í+Ûà#Ò…êä6’¥²jùr^Õ*^M€·ÂŒH+zÞ­E¸–Y²P½̦¼h¤“7-Q>î[‘æÅU²ÁªvE °ð\_¹5;„³)¢#,pƒ¦7ëÁƒ{Èމ‰©•-7pà@xéôE“–àòÊj¥¢¢ZC˜Ì†_4j¿fff°¥wïÞÎÎά“ärÊ<W[ß`?—Ÿ|üQ‡ÿGËtê¨uéÌF p®4./3!?+)#18ÔíŽýÕ]æG¿õ¶9•,öªËá𬺾xV]]YR˜•-‰ÎJ«(À­^ƒéWÀÜû&ù~_N„hy®GEEÑ…v«•Ó32¦ÿrXÕ%çšT€éòì÷¶ª‘>ÂOO–]]šw™ö¢ï‘UZ9Ž[3ïz¼®Þ<L¿dÎ]Ö€ÊÉ»š»žµªLl ÿr]#X™ÌrªvE °ðwCr èÿò~î¦o]ö%àWúð8°|ùr*ÀYYY𪻻;lo×¾½WPb p…¡!ltÕz¬gÏžÉ ëׯ'ÝË °……I.§hΕJL²@ì×_ÓQ»-¦¥õÆ‹f‡úÜo¼ä¤æ¦æIr¥ bkWÓf|ãtso°óMáÒœgÏj^ŽºQß²âÜœ:õhX · ¦–Er|‘Ç»è)ÜÇhþ"ø<¡Ã>À"§FôV{˜:I’W€éÐÍQLÚFÌ›v¬L†ì„§vËwf¦ð‰äþ¤È%d¦ÏÙñfä¨}1Wœ© Ê“™!ª^¹ö°=Ç…jaw’óMÑ:ÂÊô1Ca¡Rfý_nî2nz:ZX rzj\æýZŸÂÛ~E÷ Ú«ÊtŽª]¡|kUú­T¦oÉ¡n‘rŸÈÈ 0ûÖ…ß Eo]šõBõ>a‡´RàFÉÎÅ"ìíí]UUvïÞ]·ªï'3ÁñZV€+«jBsxéÊän p¿~ý`ã¥K—XÞ»w/»$\½ëÁ)™íÁ“Ý»uyíµ×HÉöíÛ ì¯kgõ·º¸(_Z\I")ÂMä|ÃÕt¿…áÒ‡F½mNEûÛ–å@kËË aw¨ªQÜ&4˜Þzä²-)rðnŽ&Þò4û–ð£1¼LLL. 6Ê¡5R€ë­w4ŒŽš*sâ\׸$ß)9k9Ç OÙË]®Ì«ÚE=‡Sd¿õöw\ZU¦ƒír¹Ë„¡µ /-Á}žQQ"2¶«y{@Ñûû‰@ç¨ÚÊ·V¥ßÊzû–ÎVRæ›&v ïßnçp‹5ì ;¤ÕÁ:U÷îÝÝÝ݉‡……ÕÊ€#+—ýzØP¸ªš?4J€uß©K |çΤ@’õàXž6mí|’X-îc.r¿3mò­oü/»Ýÿ·pþç"/kõ 0‰!bo+Û‹5ÕUyY‰™©ájà6¤Áp#S48©È*iy/^ýC%îæì¹rróæM:Ú£¨©S Šv„£ƒy “ /-×ÿúPT½ìÉ’ajÞ{=ÉQFwQ4w·ía{^ø*+ÓKd’Œðx”> 4‰ígrDa”¬œ¼Ê6žlQ²reÞi¤ñ¼ýÃíU»B¥Ö*ÿ[Yo…¿¼Â¿žìßx§ñ¾uëmƒò+"­ 6-üL˜¼OâããÉwôvOƒ4D€«9¡QlmçM²GGGSÞ·oéÞ'Ož°üæ›o²cïj`’íàž ;jÑ]^{íŸÚZ~ݽY ¬8J ³««*¡µ p››ñ B’hx#‰ð´ê~xüÁÎAŠÜpT€Ép§N‚íï0ìNS¸æY ð_`ý}@MŸ>=‘Œ¢Ãí`CCCöKðµ °Øÿþ#‹óÝ»éÐéÀoü_¯žÝo_?ÕΈ’Â¬êª °V5 0jp«ÆÚÚZ Ý¢.êfÇÎÁ~@‚­­-½M·k×ÜŒp`` ¼ZUUE€[µ~»f ð³çÀš&Àc'Lû믿¨ý†„„´oßžä—cø»ï¾£†¬ÌõjØRÈ!>V³?ŸÊN‡´µ;Œ=ÜÓÅ¢!,%™2Qc £#ˆ2#ØØ Ø9¢ k×®¥·éÑ£G»Ëm«•-×½{wxéŠ‰Æ pm-„¦ °G`B;™ëúúú&¼àÂ… °eäÈ‘nnn¬÷íÛWUGj˜“4h÷ÍÎõ{§×”)“é’1Ð‹ÆÆÆú;6‰¼lU`á(– 0(«z¸©5ØÐÐÿ$"‚ ¯ºººô6½}ûv*Àùùùµ/V êÜ¥«_xºæƒ¿iœ=uzì½÷ÞK`˜?>lܲe +À7nÜ`ÇcE"QS pL°]VzTUeiaAjNV4DnvLqQFuużysg}öÉSG å8]8Š ¤2Ro 7µ×»r1‚ ‚´Äb1ë`wïÞ%ìããS+[nÕªU°ý‹¹ 4P€ih”½p qÝxØhbb 0|ÜP~8%8ÔËÌâÎe~VS-õÍËŽËÏM$Q—\YY2sæÌÞñáP¨¡®/Šó3@€%‰"µ 0‚ ‚ ÄÀÀ€MŽzF˜.7xð`xéèÉË'Àšú\÷uÚsïÞ=j¿ð3léÓ§§§'+ÀãÆ£¿víZµp°§ù‚ßÌ5ÙÛñ:¯ƒ—ædFQ.,H}iÕUåäI½ŽÚZ½{õ8uü0¯ä¦ÕE(À(À‚ ¢©Lž<™Þ£¿ÿþ{*Àd8___²œ{@¼f °¦¦A3±p€ÓÑÑa‡·lÙøáV€=zÄ.G'å6R€#ýïW”—üeÓûƒš^ùƒ+Àiñþ•ŹٱT€‹ 3Jг ÊJsE"úÆÿ§¥Õáç]z"?×—8'µÞ(Ê“€×ÉjS 0‚ ‚ %//ÿpêÔ)"Ààid¸ýû÷Ãö±¦ø†¥i”kìB«7ÔÍjøúë¯ãÞ{ï=ØxñâEV€Ù±we€S^€³2¥ À÷LNöÞÖ ?È pl¨CfjDeyIiqàÒ’ìò²<ˆêªr===ö]Ѿ}{0á>½{ýºw—¯§³L€ëçÐ4Œ ‚ HaUªC‡n2@€CCCke ÀMš4 ^ÚúÓ~M`¡hq1ªnVÃÉ“'©ý‚îÅ}úô)+À_~ù¥J À)/ÀRiÝÂÖ_~>å‘åùïÏž8n¸»ÃMV€ãœ’¢< sÓŸ=«©ª*«¬(.//¨¬(‚Ÿ««+rssþýï×Ù¤Á„þóŸZZºw{kÅKÜ\çg§Da.`ÿ& `AAÆ¢E‹è ú³Ï>£œ––¯‚¼ÃKVvÞš#ÀõF °«o2 Œ}ÁÁƒaã'Ÿ|âííÍ p·nÝhç©Q€‹ óµ´êòýêö~ûÂéƒÚÑ«g÷¿Ïb˜,…œé!M /ÈI)/-(/-,/+¬(+*+ɹ®Y¹¤Ão€ 󮊮­­,^8ÿõüìdn€]WW•ƒ¦6] #‚ Ò:uêÄÞ ©“àˆhõy§¿OXšFpEµ’ÑR¼ÿ÷$—r,çŸ~ ûí7V€/^¼Èú¤J Ô+À•%N¯¾?x le“­úq•ÙّÇ,ûn^€û=V€…—BN‰ýcÿþó&èî?б£öˆáÃ2R£ó³’Ø(ÌM“ °oÓ 0‚ ‚ ªâââÂ.÷èÑ#"Àµ²hàläÕO?›cë*jqV)ZD€g|>ºkÏž=1/ # À=xð€à¥K—ÒÎ6l˜JNö¶ ð0_úÝRì£ï›\=¶rÙ‚ž=ºüe‹’LÓ ¹:ÚlZ¿ª{··´´:üóŸÿ”sàÿûßÇÎËJd£ 7µIAAå‰D$ááÃ?|úô)`°ßZÙ"È?ýôÉTЮ}û [w{ŠZJ€Í/ÀZZÚÐWvvvT€/_¾ [†êççÇ 0y,®aj¤¼û<¹mpp[‡7þJ¾ùfÇý{6_9o0ý“ º}zš\3T^€i4_§[7öéÝë7Þh߾݋do_¿˜—™ÈFA 0 0‚ ‚h ‰„]û˜ðõ×_SvwwÎËË#å“’’fÍšEŠ½Ý£×é‹&Í/À Žæà‹7ê’ýöèÑ#šañâŰqÛ¶m¬[ZZ²ïååÕtìîdbzíøõ{¾ÔõGœ;±ÿC;ÞÔÿËÏ?ñs³VI€i¸ý~è0a¨sõÊ¥ìK$ rRª*ËSb¼›8P€A©CCCvÞ/Ëœ9s¬­­i`ðððÒÒR²£Í»ï¾KJŽ›8ÅÒÖ½Ù¸‘ÑlüãêMÐ9Ë–-c|6ššš²¬¯¯O»½[·nª^ÄzW‚+)ÌNK ¡ìb{ã‘åŹ_~Jvù׿þ5ç‹OΟþmݪïºtþÞÆå1¡O”àÜÌxå#?'¹N€A­›8P€AQ„­­í Aƒ¸ÞÛ·oßü‘¬}СC‡5kÖP@ØHN`ààÁƒZZZ$ÑÁò5›<ü£›Z€ÕÍ#Àº}ûCÏܼy“Ú/| €-ð‰#00à‰'ÒþaV¯‡x˜†y›ƒµäeø{Ü#ìøðª­Õßû÷lîªÓùÅÃkZkW~{îġٳ¦uéüæñ?©_€¥ñÊG~v×Ùi3 0‚ ‚ /#‹gΜɗÉJ{ß¾}‰2Àоøâ ²½OŸ>ÇŽ£ øûûgddÚ²³³W¬XAJvÑézÄðBÓ °Ú¢éø¡³ù\õ‚7ÂÆÅ‹³ìääD’Ë,--Õ.À¡žw¼ÌÀ ËJ B©Û˜_¸sóÄw ¿ü׿žçøíûN¯z«ÿ8¤?fôðÎÿysÿÞm ‘Þ¼œ#S)ò²“ê8Ê£YAAçäåå±ß¶³€Ä†††&½Ì½{÷†J Œ3ÆÄÄ„°— P»‚‚R³Ï¨Q£HɆ¸gã¬vV{4©ïÙÿ'tÅ´iÓ¢HTÇú#¿ï7û³Žµ}3×ÃõA㸠¼´ÙAA^e\\\† ÆUßž={^¼x1I ¶nÝJ'ïÚµ‹ °¸\JJJuu5«¬¬lÓ¦M$Uš–vÇŸùMÜTÑDì’ÔN–ì\— 0È0l™0aBPP+Àì§CCÃf`±ÿý¤(÷‚üì ?V€¯ž?ráÌ™Í.÷öÞ ›×¯¸rÉpÍÊz¼Ýmê”‰Öæ7³%1ªFn& 0 0‚ ‚4‰dîܹ¼Ó}õõõcbb’_‘‘‘›››,È“'OÈ*fÀ€Î;Gðõõ‰D™™™ä¸PóŒ3HÉÿ¾7äæûà&¦`óuF:hÐ 1ÃçŸ÷ïßÏ °©©iƒ€kŒG>ˆ q(ÈIÍ’¦:<2eøì‰Cþ¦?yÒXVƒ»wë l|ýì¾=Ûßòß·ÞÒY»j™«£u¶$ZÉÈÍLN?mÆ@FAW‹²²2¸Ã’1[9¾ù曀€ªµiii%%%d¯ÊÊJXa 611¡ Ð>þøc+++"ÀH]DDDqq1©ÍÚÚºoß¾¤ä³¿ò ŒT]€›#Ô.Àß,®[ÖmÆ Ô~AzIº GGGV€×­[G¯ sîuÃ8 T0èqjœ_yYaLTðí›gˆúíüéÃçOýuÁü/:w~“VÞ©“öÂoæ_={ãÊ™ k—èß·{··¶l\ãõôqvz´päJeñ¤9AA^LMMy§û>|•ªlJJJAAÁ³gϸò,‘H„5øðáÃ$p»ví–.]êääDð÷÷—&µÁž¦JÛùó>q\†òÜl¡^~»G/’ì7â×®]ƒ-ðÁ!44”`¸"ôêèëë7¿ÇÛņ:d¥Gøx8]6úóÊù#W/½záØµ‹Ç®]:~ýïëW/íßO—Y&û_O·÷ç­ŽïZܽ²qýòwt{÷}§÷Îí=ŸÚf¥GñF®4Œ´™AAÚ<^^^ìŠÆ³gϦ0äääY»¼€¦¥¥¥(F,¯_¿žÔß¹sçß~û 0 ‰ÒÓÓÉÊPÏÂ… ŸO<îÕûš±¹2ܼ¡66³vªË×¥KÃ’%K`ãš5kXvpp`¯‘‹‹KK p\˜Sb¤[ANj~~Ž“¥ñÕÆWOݺvêÖõÓ&7ΚÞ8gjlthÿOãÆ~Ä6>û|úɤßíöõzüÀÚxÓ†ýúê~ïÝð w0j¹È•ÆÕ p¸K3 0‚ ‚´axW4&ã®[·n¥âš‘‘QQQ¡L`ȹ¹¹)‚8::Nš4‰ëý÷ß¿rå àà{P©ÍÝÝx~}ÈA§OŸnggG8PFtt4|òäI™™¿¾~ÓÖðèd®·\¨A€GŽgwôèÑðØÛÛÓàX¦O6l¸¦àD±[R”Gfª¸ª¢,59ÎÍÅÆÆâÚ‹ë¬n<´ºùÐÚø¡õ-Û¦ÎþõÍ×_öéÝóåO[íz¼ÝÍÒüzfšX.rdjþ@FA¶…¥¥¥®®.W}|÷îÝTžžžçÎ%+,,T¦~ð·+W®§ÖG\\ÜÓéÄàÕ«Wƒ{ÉHNN&k(çååééé=Ÿ›Ñõ­³®°ܲÑHöˆ&£îÞÞÞT€úé'Øøõ×_ÃÏT€=<<ÈÔh‚©©©æpr´WJŒ(kEyqN¶4ÈßÍÞö¶ƒí‡Çf4ß}âdéùÔæîíK›7®ônÿ F´,ï^ËL‹IŒL€[ P€A¤­ hEcVM% ý9::ÚÌÌ øÒ¥K ÃÄHyIII¹}û6) ÇJU°»ï¾ûŽ´äí·ß>vì`x ôO*•’Çî"""¦Nú\ÛF|äè✑ÓòÑ>ôçI8>ú(Œþ ?Î ðùóçÙààC¦ pj¬oZ¼¶$º¬$¿¬¬$Z,rs¹Ò˰Ÿ×ã Çð`W'÷ø©n¸N€Ãå"G]UQ.Ú"Œ ‚ ­vUŽ•+W‚XRÛ$Ë´³ìççwíÚ5[ø7**J®þÂÂB{{ûs2?~œ@wLOO/**ÊÉÉÖà‡Ò•‘GŽ "M¦k(›››÷ìùükô%ËVDÅ¥‚¶x4X€g~Q—uù§Ÿ~¢öëååÕ^¶(†¯¯/+ÀË–-£WmòäÉy?4©§'Jƒ²Ò#K‹sÊËJS’¢ý}½ÜÒðó|äçäæå3vÌK³kÒ”p¹È®àÒ88V‹ 0‚ ‚´f y§ûN™2åÉ“'i/Ý¥Ón 555ùùù´@JJŠ‹‹ËùóçÁr---³²² LUUÛ¥K—`£™™YdddìN²:°Kš PÍÆ6þ|’7XFHHH\\\YYY­lóîÝ»‰%jwìxà·?À?[<&ÀZÚá,îß¿ú‚#GŽÀ–‰'’éT€Ù‰+ [®98#9Dš\\Y]U™›-‰ ù:xÛAù9„¹D…¹ÇGyËø*–‹lIplˆ}‹ 0‚ ‚´BÀW ÄUßþýû+2U9@q³³³iI°Pkkk2Øëààõaa¶BØ…w²Dii)˜¶€'$$èëë“õ8´´´6oÞìëëK„2¤f¨ç«¯¾z>yÈPsˇ  -ª ðÕ[–dâG(Ü9s`#>&üàÁƒÆ/×ÜœJ"3%¬ ;¹¬$¿ºº*?Wš’üä%¾s…¦‘.`8\Ë 0‚ ‚´"@­hüóÏ?+cªr”——K¥Rºˆ™©©)¨ïùóçA³SRRèKdœV`Úééé Æ;þ|ÒæwÞyž™™I&;99 <˜”œ3o¾(,&D´¥BE^¹v34ûûï¿gÏŽ<éfeeE•xÇŽô"êêê6òíÑ<Ì iJh~ çÕTWæg¦¥DÆG×M°¸s™[8+=R&À[0P€A¤U——GGPåX²d ¨Tú ’““åæ<ÂYTT~Kkðóó‹§ÿ…— w8^HÆàtA@?øàÒøñãÇ[[[³¢ESüõ×_àö$Ušþžý±ÉRÑ– åø~ Í—/_¦'ell [úôéÞ)\µ‘#GÒ먧§× 8)D ¤É¡ùY2®©ž8q¼å+Ü2Yi‘•¥  -(À‚ ¢á(ZÑxܸqrz fuåÊîmŠ Ó}ùª›››ª© ’’’Òëãøñãô¤¾ÿþ{ww÷`0pòÔzÅŠtñ¸›&÷R2 Z$”`û'$™ãA K“,]º”=GèX2ṑ À5§K’‚•‰ŒäcGû;q_ÊLËøQË 0‚ ‚h,ŠV4îÚµ+X.¯XŠÅbòD›¹¹y½K]€'“,p E¦z÷î]¨ðéÓ§ÊÌ©_½ÿ>Ô™®pôm۶щÁ;wî ~™´´4²L³H$¢ƒ¥“§LsqóK–4(#Àû…FN:•=‘wß}6Â% bøã?Øà„g˜hŠ'722Së¸Î?[P€ADc +óN÷;w.kªì°!üÌŠkhh(#èèßÿíççG‹•––:;;=Ž‹‹£»Ðé¾tb0}ÉÝÝdE»sçNjjª\›AŒAáUPe8.ë·yyyåå嬟óbffF†II&·G±ƒ¥b±˜L †sܹs'™9 Óõ­Ã#mæ`‘8•´¤z#ìÙ³¶Ìš5+ðeØàÀ]5_€ÓEij8pWAA4E+1âÁƒ\S•Û+®žžžDMcccÁ„Á‡‰©‚›É™ª\Î4ø/l¤’““íììˆ9CcÈÀ2È0(1Y'$™­0;;»¢¢‚õóÌÌLa ó'ÉA#—/_îææÆj0¸:©0!!á‹/¾ =óÞà÷MÍm@J›3 ðéó×É86ÛìñãÇÃÆ¿þú+€áâÅ‹ìõmÌpÍ'À ¢Æ‡4¸$*ÐF#AAZ‘H4yòdÞé¾þùgƒ@v_*®P†–q¥ º‘a0U¶ÂœœœÊÊJEµÁK ²´pLLŒ……™;A'Z@ýpZF*•–””p«?/..†W3½aÃrî;w>pà;m 888==L vqq2d)9}欧^Áà¥Í¼¼ð»ºeÝÖ¬YCìããÓ®];ØüV­Z¥®àšQ€ÕÒ”°:¸¯!Œ ‚ -B^^ÉÀî»iÓ¦¨¨(%M•+®P^N\åL533³´´T™Ú ¦;Ò‰ÁP'ÔÌlaa¡pÎ4’18C//¯I“&‘~xÿý÷oܸÁj0;1øìÙ³:::¤ä+׉"âRs›#ø¸GÏ:±a[{üøqØ2tèPß—8p ½Ðš/Àiñj‰ŒäPàÈkM `ADó‹Å3g΄{„Z¾#Ö@­h}ªR®€ªªªÈÈHE’«dv_:~KæWPä*ÏÍÍU&Sm”Ö`pì>}ú™1c†ƒƒ;‡Þd¼7vìØñ| eíŽ{~=+³ÓfV€-¸Qk¶‘dá­[·ú0XYY±×N¤5°z"#9¤N€ý­4'P€AMÃÒÒ’æ‰jclkkË»¢ñ€LMM¥H*‘H¤LýQQQPøÑ£GRÀKp ðj%L¦û*ª šçèèÈ›qB óÑÑÑRA’““8@>#´k×nÍš5ÞÞÞ¬a²ƒgÍšEú°o¿—o˜6CPÞ°e'zöìÙlóÞ~ûmØhllìͰk×.5.×篮ÈH ©,/ÃÑ5(P€‘VFzzº¿¿¿@¾w>`/nIø£-\·Œ}°7Ee¸G$G©—z› §yæÌ™Ã2nÞ¼É{Ö°£ðQ”Ï¥_oãº]™3h­À¥h*÷5 ¤ÙxذamIƒÉ°6W};vìxèÐ!VÿàL333é½¼¼ÈmÂâš‘‘qïÞ=2Ý×ÇÇG‘[zxx¼÷ïßîRøMyøð!), Àäˆ xÊŒ“Çñ\\\¤J¶råJ:1øØ±cìeð‰ --Ì‹†“1b)9iò'½AP›:ˆS÷°Ûï¿ÿNfbb[Þzë-¯—as;7~8µ p°ÏÃïÍ3êÃïÏs±»œç§®<`K `¤u1aÂ2Z¢¨¼Ä;º€²%A…«ÈjD`••³ÐC€D “k üüú í$…¡äÔwÞ¼yr̓ÿÂFÞ@®æzh<4j³¶¶V²¼Ü™ ´–·frúúJ®¦À ’ÜNCPƒƒÀŠÆ«W¯f‡CsrrÈÀ&x]aa!Ýž’’âììLÒírÅLÕÑÑ‘˜êãÇA’éŽ Ò%%%P'ÔL7ÂçÊ»wï’'ÚxçW€Ê‚Ð’Ä·oßug½´  €õsQ²¬†±±q\\œ¢N€— Í—*ÝèÑ£iZ ÐKVƒCBBrssÉ! ~:1xñ÷Ë<ü#¢’²›0³}ƒãȵ««+m\SظpáBO(À.gkk«QìðàzϾ}–ìÙ¸êÔÞO7Û©g×ãî«s`5…$1¸N€}-4*P€‘Ö5üK̇UM®½¤LAìHN~ÈF1OR›@årÐu-‰ó¿"¿;vì …a/¶lçÝW@€IŸÀ¿ð*Ã$'®¨$BÑ)PÛWI€á¤¸UQ}eMU ¼Ü™*j-«úlÍõ 0x)ÃûæªH·ó\#¨Á ÃÈȈwEãñãǃÓf¾ ;;›û`ˆ( &$&&ZYYqussqeMÕÜÜ\:“Þðl⨎B_ "â F É~írýúu²tŽ­0??Ÿ¤b ƒéöŒŒ <âçÐBú¨þK› ÅÈSxô¬ËËË+++ÙÓäC»qþüùööö¬GFF×ÊæWìÙ³‡N ÞöÓ/ÁQi‘‰ÙMGO-góþûïÃÆS§Ny0ÐK…¿œzxú'ö;r+Äñ´Å§¿×=0|gò‡jt`"À¾÷4.P€‘V1C049/PVö¯:±©+VÈø±[¸CÄìx Àqå ¬h°QxðYx_®C‡(·$§Ì:-Ù¢ÆoùI{}Ạ—çm?ok¹5×+À¬åÊ}ê¡n,7ªŒ 7ø`KÌÒ«W/0LÖî@ÞL#+JÐÂááá&&&DP‰©‚ǂͲBÏðNHàŠëÓ§O‰?ß¹s'""‚š*Èyjj*-I‡¦Y@†A‰i™ääd2 ç^&Dl— - V\RRž5fýœ ´g÷îÝt å7zzz²3£âããIº ‰DòÕW_‘Þîѳ÷™ 7Ä ÙMŸY7š±mÛ6Ú;;;¢¸ úî Ÿþ9»²‰ßf`ó ïþ¯S|àÝp× þ6n·vÚŸÿöÎAí>o¹ØÝI‰õi|HƒêÚ yŒ´ ¨’AT:ܪŒ&’Cw„-"Jì‹=ŠºXØÖT`Ò¼æFL›-ÜÌLíÙNS—sð•àZ!„? !¨Á*¡hEãŽ;îÝ»7%%…;¦* ˆ"è"H#ÝÑÃÃÄUјªpm\q}ôèÍ œ˜˜(`ªÂ~yûömâçdê2è:ldU¶  €÷¬IÆ`ö4¹€¥/X°€>JvêÔ)Öáo÷7n)9jÌx‹.²e‹ÕZÚ¡rsssÚxC’á}·—éܹ³z€S£_=ÿÇèÉãA€­#=®Šlyš‘Aà1ÛÌøôã”ïÆ‡$QTY^îsWÑx@Dé8'wlVIG%žCçðZ®"sÓX&ãìIÉÕÆŽv¶=¦¯*)Àt°—ŒÓaa•fGPƒ¹”••Acx§ûÂß«ððð,†„„•*'©téîiiiàÒô¿ ¾Â¦*GEEEnn.ÝÕÆÆ&44”m¡Ü$ ?'ó+èŽÞÞÞD€á¶B¸Lõæ47fO“hê|@:vìØ±wïÞe×› ''µöìÙóù%˜¿è©O¸ºì÷šI]Z³îÝ»³‡&ËšìÞ½û)ƒ‘‘ûN€ëÝ¥R2º&à“G÷Nœ5 ì÷n¸+™qÀõúÛÓßÞ9ؾ}»äh¯ÆGzB`{ßÕÈ@F4¹Q_¢UÜéšÂŽÊ%ó¸C¼ž¦.&2¯®)¤6rõæphfæ¶V]ÌUk%¸–3ÝWч 5XÕé¼Ó}GŽikk˵¸k×®qgÌ ÿU·®"'‰Dʧä’’’âããU¨j¢ZPev÷4ô¿`¤*M|•ós^ i‡/^¼ØÙÙ™uшˆ²2÷ÀZZZd‘õ›wF¤„Çe62V®ÝLŽKýOŽ—õ òeËè›áÃ?Œ{˜°D"ÉÏÏW~¡“¦`{›«o¿ÓëªÈö‚¿ Ø/™±ÂúHGÝn¶Ö7Ô%Àà™(Àˆ&#g;d,—ëQÂŽJŸM«w^Á~ŽjK%V.8´œ¨šÀ˜­J\ûrj’üÃ+Ãõ>×0† åÎ@÷Sé!8vV‘Ãu!/ÉÍÐVÞíéœáñs5Xù±_îÀo×®]/^¼(0ŒÉΘ¨œ¦P077WT™x]ok¡‹ÈÑÁU¯Þ»wOI?'Ó}áZ(ªÌPÉÏ¡mì7/Ð3ðËK'oݺUnñµÄÄD:1øÇ$×¥‹N×£'.„Åf6&ÞéW÷ÇÈȈ‹Œô8Ðåeú÷ïOß›7oŽã#99¹ÞÕ®›H€ãœtºüçð£+Ç<Í@}¸^ßãô7ðº†êøzr´g##=!iÜqZEÓw ÀÄ…@MåÆT¹S,„Ó ±RªR´Æ 0i3Uk¶Ir›ÂiДßVäÞ¼}¢j4Ö`i" 9ÈiÊ=˦’Ó‰ Èü† sñòò’[ÑxË–-iiiÙ‚„††Òä`¼K]Ð €££#|ô£ûæææçääÐ-`˜ä‰6׌Œ S%àw“­PxUI?‡³ Ó}aEµ=yò„œ&hm½ ýfffå“’’²• ((húôé¤çÁ?Y)èÄàððð)S¦’C‡¸u÷QhŒ´açêO ¹»»Ó-^¼6®[·Î™>³°o øÜ§˜„„8e¦…«W€÷þ´aìüà½D}·Øžû]a}äß´ü=î'Ey42Òâý+Ê‹C=okp´5^¶lÙd¤5#<H†׆ 0Ww¹JÌV®ÌÜ4hÄNz&ÀìG2úJ=Ò“°¥ÞE(T`vD— üÂѹ(0bÌÛšö™ ô'w|^¥Ùt"w—E‹áo_kdÈ!:t oûýë_`zÍ9ÿõœI“&I$’låðôô$âÊ.uÁš*è}||<-ÒK'‘’‰Áô¥ÔÔT;;;"®NNNrÓÚA>éƒib±˜mCaa!TE&ÐP†ø944RÀT¡´–<…GÈÏÏ—ószš° ì¨è“)m??[a½€ö¿ûÿ?þøcøàÀ®D ’L3ƒ…öë×”œùÅÜÇ®þ!1R•bïÁ#ä(ì!ºwïá’91° ÀõìÙ3N @ƒár4§‹í>üà½oÏþD¼÷‹ß!&ì\¤u®_¿¶Ì™3Ç‘>#€‡ÓwtZœ*À‰Ô›šF]œñ$Ä×vùÒ:]þS7¸=q´ŸûýÄHwµDªL€C›ª×Tå5•W¨‡h0™´,`ª\ÊËËáDØÓ$ÒKF}¹Â/pÖàçd~…¾¾¾ü1¹C† úYöóó«'µÁçŽ3f’ïþwð¥÷D‘8~æ*™lÌV8|øpØxðàA{ö‘p戈ˆ8Õž¡FN»5Q¤ÆÊÚ£ÙŒhÜÄeÜ›wµbá_ÞìÁÔ{É,EeÔ•»&]c¦@ÔFN§ù§@й+rwQ€‘¶§¾¼üôéS[[ÛÑ£G“¯Åá¿Âƒ–¤¤¤(z¢M ¢R©”Õ`•LUX\ÃÂÂäLUùD^ÄÏiWì ¦rÂO†¦ëõs8 8áÞ311¡3š>ýôSv̦KBþûßÿ’’S¦Í´xä)áù‹–@™•+WÒzÈH¯µµµìY³Øiáq EÀÕ*ÀO›(Rc}+ÊŠ‚¡I­ P€MŒñ L{Žûœ¸ÖŽ;xópï_ô1_òW ­\™<ÀŠ–okp`è+h9i9qrÖ¬mÖû+ ®P^x}4eò³ÃÝõ>ÇÍ¡’+:5`Tßf`P;''§‰'’µq(À(ÀˆJÔûý~í‹Te*#ãºÂëDPI. L&´zW‚ã>žÖ`®•%4`ÛFæ&Nƒ&×$e¸«wDW.ao½iÐ}õîÝ»äRZXXÜg Ù?_ýuœZÉÎÎþÿí xM×úÿûüžŸð¿†*Z”^T©º½JG?JuP©ª¡­©UM´%nj(E”6nÐ5–DÑD3‘GB$’$1%ˆ„ G ‰éÖÿMÞZwwOÙ'9INø~žõx’sÖ^{¯½·s>{å]ï²®Wt9KœDVYJ ð‰Cág2vß¹Uˆ| )b5R_Už:uª–ÇÇÇ“÷ìÙS„“^±)))R52‰+)®jk¼X†E­ÉÄ•üܸ©–êçÑÑѤ¦‡–6ÈK$[êçª,Y²D4(<<\ªÁôPFu8¬WjÈœ†ÈÞÞ>HY±X”° À§Ñ œº½¢ËéŒ=ÅLÇV­JE 0•ÓéÑp`ÕR»ÆKØÑÑQK€‰„„‘•«G¼>E9˜œÍÃÃC6£Í,kíܹsª't Ê,Šª8pÀR??{ö¬Vk¤Ä–vSæçJΜ93iÒ$,ée|||–.]*}…sJ̘1#P¬Y³Ê¿œ>bš^ùøDêöŠ.Y%\ì“Õ®T°SÉ>x`ÕwwwYêAƒéð¾}ûæÍ›'B‚I Êù''.ãˆY‹þ?þ`?œ?žƒ¥'´  <œ_ëð"""”3Ú´¸~ýzXXÕ×é,u3==Ýx“’’蜗z9¡D‹-–,Y²[ƒ;vpTðÚµk$ ‘‘‘tÄâËÄôéÓOV <é¯T^¿r–®GVBÉJß],À;VTÇR L¥ðúe|~¨¾H…„éÞ½»ÉdÒàÄÄDÈ=zˆ ùœ¬<,×°°0rT‹ºÀÁRqiÇdâJ¿²…’û‘‘JA„ûÊ–…Ÿ“‘*ý\ä4¦ÓxèÐ!é†dæt`Z~NçPµ›"§15/'õóRÏó¼yóÄÊŸ~úihhhŒ„÷Þ{Þrvvö÷÷ JOO§k—––fÝà´0›Í¥ ð"÷âe;ÞëÙ5~ûoª|ü`d%”¬´bÞ¿ã×jY*E€3šîÞ¹‰ÏOÕÚ9ŽTйsçÈÈH-&öïß?räH®Ü¿ò4ȫ僌”ÃÈýh¿ÊEÄô¹uëù¡ht”S1¸ž*A„[Ð[Òý*s¦Ñ¯………¢Â¥K—Ä 1Ù)/E'‚(èhÉ-9UCf+ÍDÁ‰×”Ý$¯¦ó)ºI'066–G’CBBrss¥IZÎ~.릒ììì1cÆð¥iРÁĉ…Ó¯<Ç.¨Ÿ1c†¸î­[·>Yaÿ—*À‰&ŸAЧ[6kú„ïêŸÔ¸2JVZL±o_^MK%0•K9éøðP­ “9p›6mÈuøÀóçÏçà&Mš˜L&‰-§9rDŒ©Z1{ï~*]ÑI©X&C,!'5Uýœi2q={ö¬0^±D²ÌT©A­œi·oß–žÑMŸãÇzï•GÔð_·HU€3šð± à 33Sš€¨[·®Ž'—°lÙ²FqvOOOí¼VnèxÄŒ6Ú»¥Ý‘Š«`Ïž=~~~gÏž5ØOL;þ¼ÖAZ:qlùÔ©SZ­åääXäçZÝdnܸA»ËÍÍurrúüóÏI¶ƒ‚‚Y€ß|óÍŠ[NI~~¾¥iÐV,™AL•G9:–Z9%óˆ©D€—Uëb\€ƒ½' ÿ¸[Úµ”êûx£Ç<ý j¿\®\ÀÇ&€’¥Ž;J¿íììfÍš¥/À)))»wï¶··çMèj§ÔñIƒ¤¦¦ŠmJjÑø­tÄ•[ãø 1£MÇTãâ⸲Ž[4q/==ú¡Õù¹EݼpáÙ¬òð¤ÃÈtŽ;,àÚµk‹«¼xñbà´ýÁ{¢ÖvëòÕîÙ§×®ü)#9´¢Ë)àˆ¥Õº`g‡^ ê×Qªo½ºu¦Mu$1XÇ~1Àƒ„Ùl–901tèP}&<èææ&fÆ………±^/7äN$Øì¢dq–®ÑFjZXX(Z#]ÙÆâããUÅ•M•­;##Cz0Ô£7nˆ_>Ì5õ'îåäälÞ¼™wJçJ«§GÝ ¨©"Íi|ñâEi#·nÝÃÈyyyáááÔ_™Ó•’.G±ÊØké÷O6}|žÛ8yà¤mÇ8Ô+™÷~¯î±Që蕊+§ï¼YXñKu/ú0<0ã‰áÜÿËK/‘qé 0Au:tè  PSœ·ü,Ä•ˆµtqaÙaˆ¥.dâ*LuÕªUÔYéˆp_ ¯“©Š$f´-µ 3U^÷™ •Ê*§ æÀ`ñ"UàøgjPµ›t ô0"VÖ8sæŒTÎEÖú5&&†C¨5¥0 ¢€³T€Ãý—´jѬ8·^Ÿ7“÷l”pq‰ZûaßwŠ ÍÎîëQŸŠÿ=ãþ[Ö-§ï(àð%Õ½h ðâY_>Óª©j¸ïGýzÆíô5¢¾">-<`Œ?^öýØ´iS’F}>tèPjj*m[³fMÚ¤]»vT£‚¯[R)???‘Ô×¢ÉÄ• Åe“$q=qâ„0U“ÉDÂ&5UåÄ4-q÷ØT…gffjÓÞ»ŸØ¡ÔnR#>>>œBíèÑ£J9gÕ?|øpDDuGK€›5k&.ë¤I“lA€Åúî\ý^Ï®ôîÓ-›ý¾~a±Ø*-×üüܳOç ~²ñÒùÓeïZ¥œL-àxÈê^þ*Àދƾöb[UõíùV—ˆ •ÆÕW”›…WñQ àÃ××W–"ØÎÎîçŸ.U€ ÿV­ZñÌ8WWWrE24Ž(?bY7‹f´ q%M™Íæ]»vy܇1''Gº/™©*ÇcI>E嬬,1€Ì¦JÖG:*mö.Ëî+ Í–u“ã+¨ÍŒŒ 2X¹Á«x´wi¸ovvööíÛ###u˜Z^Sª\ |åʃ1À³¿w®iW£¦ëÔÑéB”eÆÔqDÄ«/ý3t‹§j2—?8lñQþ`¯ïz¿ý²ªúvìÐn½×Ü2¨/—kæ|Nxð ¿•¥† FŽYª“õQáÇó&íÚµ#S:^™‘Š+™ž¥©Òd6NÒK–˜––fÐT•â*Õ`W^ÑX˜*ÁO¥SËüœ~NçðÒ¥KªrÎkìØ±£T1b„¸”Í›7?Y)ÐÑŸ·uÓ/íÚ?=½Ý£ó>“oÚþ`Y¡‡Ò—›ðÁÛÛü=”uÊVNÚNGêø@”¨Í?î×ÝÎî•êÛºÕSúIŒ”«ùÙøð@BfÕ£GÙ·'½­/ÀÄ‘#G|}}Ÿ~úi±trnn®Ìñʉ+/ͦ3£M‹‚‚‚ììl­–OŸ>mÑYRŠë… į¤Ç: Ï©SËüœÌ6++KUÎIƒé*˜L¦;wàçŸ^\GGGÇÊ`:Z‹²@$Çnò‘=§öóž›¶?HY6,zõ¥?ûÒ­Ë‹KžªZÍ¢râPT±‡.¬î%:pÞh‡>ujÿ?ÕüfnÓÇ”S}!À”!Á-[¶ (U€–0aÂŽ ®_¿¾»»»ƒ-´Çß°aÇddd”ÚÚ/¯7G¬Õ¦¯a|¨œ>žƒI\uÖP¦#äÀZ??¿œœ­É$9ê &&F_\ÉTY¿I/uØøÄ½‚‚‚mÛ¶QýS§NÉÚ‘#_ºt‰¤z÷îÝ ðĉ¥ ÀÑ¥©&“/U€w{Ðs×ÖB€¹Ä„{ó0o£†ý<{¢x]V¨ÚW±-Ó¿ôsTð ­Ê:åø¡Hà½ÛæWÓòÓtÇÍŸPÍoæ8l€Áüf`@6Ω 1bDBBB©œ^9*/ÇyÒÌf3'g°Š_¾|Yˆ+ ¡,08;;{ãÆ,¢Ôé†Q ”>}ú´˜ÑFõ•gƒv'&¦‘ÞóÊÈbœVæöû÷ï'd©Òt<4Í:Mí‹Í¥á¾Ô/:žØØXÚ©ELO+Ï>û¬¸p}úô©œøH/5p±»Ö©½dîäRßF ‹óÖ¾ð϶¾«çÈÞ%9v“«‹S³¦`ïw_§ éE­úÊrüPD±oý¹Ú•¥î£_ügkÕ™n}ìߨþ›uÕ à¡B5$˜´*00ЈgddPQ£Fñ†Mš4!/b÷# -²çÎ  ‡ôòòJLL¼'IÆË¦ZPP *ÓNe‘ÃwîÜ‘¶&FŒ7lØ@ ÍuD/*wñâEé&bœ–”•4X¼Nû«W('îÑ™;:~ü¸ØŠÔW„ûÒ¡Rµ¸¸8Ú»Eìçç÷ñÇKƒˆ¹sçVŽsžŠRC Ö¯œÅ–;|hŸä=›Žî zÅù«Á5íj°ÙÆ„yË*HË/ó\Dxpñdº7^›ýØ„ët6árü ð•Ø­óªQÙ°|R÷ÎÏ«ªo÷®/‡lZVêË¥ðúe|$xxP†׬YsúôéF˜8vìšXr®sçÎTåÓZ,|ÒÇÇG,¯–››+3UÕgJq%Õdqݶm›T‰¥¦Ê£¾ÊI_Ib•~NGE~NN{áÂjNHHP•sj–~ß¾}T˜Nà/¿übD€{ì1ÙõjÞ¼y%,Gˆán#1ÀqQÞo¿ñjqÚ¶­¶núåȾße%2h9Ù,Ç9|ã<,iÏFeiå)ߌxEnÂ_G‡­ÖÚäØÁð›7®Ä†Ì«%Øç‡þïýŸªú>×®uyò›\ã?þƒC¾¾¾>ú¨ìk·k×®äfFøx sæÌ©W¯oëààÀ9"dc°eæúõë¡UGZ¢C½~˜2’ÕšyåÅlYû³²æ±”0àâuÓl»„ûý{ØÇoªæ7kþdãEs§V¨úr9wj><„dffvîÜYöýÛ¨Q#OOOƒ|âĉäääO>ù„·­U«Öøñã90øöíÛ7­µ&ýµTSUŠ+m"6§ƒ'Ï”¶IïO¿ÆCÜÌ7Èf½¼¼Î;'^—#Sã´G’íýû÷³Ó¹mÓ¦ Ÿ®N:………© °ŸŸßo¼¡’ ^½I“&UÎÜ7‚îÑãL…ì”·Ÿ7ã·ÿÆ/ÊÊ”oxÖ[£†õ¿ù×§ZÕ¤…êÌþÞ¹wÏ®%ví¬¬p,%´X€ƒçØlÙé?{ì—hå7›6yT%¨/—Ëçã3ÀC‹«««ò»øË/¿$m3"ÀlJQQQï¾û.oË©ÒŠŠŠ¬¨ÁÒE‹ÖP&¹%óÔjíÒ¥KZ3Ú´ N]½zU´PPP *çôÃÙ³gSRR’’’X€ƒƒƒ…Ó6lØN‘j phhègŸ}& ÷³ÞâããOV"ÒYéÐó…,ÔĨ+Ê®­+ÞëÙ•“¤ýÉèõªÕ¨x/s}½óŸ'¡]›–óÜÆÅEykUV-IÛŠ8ðGÛ)«ŽéôüÓªêÛó­.”߬Ôb¾˜…=€ñôô”-–A¼þúëäiZ¬Å¢E‹š7o.ÒD=Þ+ H°Š“¸òbJq½yó&­HVvåÊé†\“ƒ¤÷œbÍš5Ô5åiILL$‘æ‘ç³gÏŠ ¥á¾ÔæéÓ§éaáðáÃ,À>>>:tà3жmÛÕ«WK³@¦„¾}ûªýY¼¦““Så¤zAQ.ý,àâé{SF(85n“VY½Ì•œ–6|²éã‹çLÒ©ì·°ßûÿÍÔ÷V÷WfMÿ×Þ(oMDaŽ œm eÓŠo»½Ö^U}_{¥ƒÿºEU¢¾þ” ¶k×N)c&LP p©¸¹¹=þøã܈½½=/Ha- &OãEÜ„¸RûlªþþþRS•Ó eï’—òÀ2mËkŸYYYb™æ””©úŠRjöÂ… tÞ8\„˜l¿_¿~"ÜwêÔ©bœL€ÇŒÃé äcƒ={FGGŸ¬ 233é!BycÐ9‘ä —/\Jù~ò—uëÔ.IãÐ~³Ïš¦­¿Reªöß±Îéz]g«Œ¤­Å0»jK ·ËÀºhå7[í9«ªÔÿ€EEENNN*ßÝÏ=·qãF`㤦¦Nœ8QdKëÑ£GXXؽ’ ’ÒÛå&))‰¥—õ•d˜D]ZA+]0»«ô®\¹Â+nDA¯^»vMT“ÆÐëB} 2ðñãÇ×­[—ŸFŒA+Í!xþüù-Z´PžäÖ­[“rŸ¬"N:uãÆ ­CyWŒrè/øÐ^?#%6ÒkØàÞ¼9ý°3d¹~}ª0sÚè·º¿"ÉÖ~ú¤/w­UVN?B0«ªÊ¶uÓ¿U§v-Õ$sfN¬ZõÅð/ O@@@ýúõ•ßãC‡%;f!´É˜1c„·k×ÎÛÛ›LÛ*LCÏëY¨Êª²cÈÎÎæÀ`‚8//O¼u÷î]áÒ7oÞ<~üøa ‹/nÖ¬™È¨L'PšB°ŸŸŸ2û§8›>}úÉ*E+¦ZÇX$À\‚|ðènM»ýÞƒ~5bÎsÝÆÚ¿Ó…—“7z¨†›£ŸY%åëï5¨¯2ž_¯ni“GI ®rû=™Içn€f³ÙÁÁAù…Þ¨Q£ dXΡC‡¾ûî;a‰Mš4qwwç¼ÁaEnݺeQgyšž ==WV#SÍ3gΤJ~ýõ×Eö OOOi!À;vìøüóÏUSœ9::VI¸¯”üü|#'J™7oØ ûb¶¼,rŸøJ§?ƒºv~Áké÷F¶J4ùPÍØ/å[éûƒIðvýîVÉeÖ”¡Mž¨¯šßÌé‹Á•œß Á@ù1™Lʨ`¢[·ndtéebþüù/¼ð‚tù ^sc­ÂÚµkIêŒw377—¬Uµ)i¸o^^ÞA {öì6lw¤nݺ“&MoÉØÅÅE¤ƒøË|¨×^‹ŒŒRVâãã¿ùæ›F‰ð`Ž‹(Ÿ;wŽg´yyy¥¤¤H;rìØ±5kÖÐ[6l8uꔪúr¸ï äɤè"ÅÙüùó¨7räHYѸl9Œ@ݤ+%ëৃìSv¯+OIØáíöÝÈ®¯u„X<7ḭÐÍ õ7<šPtÝlÚüC•5“?~ÿ5»ÿ«’¾£ÕSž‹~°5õ¥r)'c¿@ù1›ÍªyÒjÖ¬ùå—_’.³fÍ’†wîÜÙÛÛ[L”+ìºdïÙÙÙyyylÅÉÉÉÒšÒ„iùùù‰bcc¥+õÕWôJ¢³gÏV ÷­’uòý–Ó~™ÜÜ\eR‹ÿx&`Ýœ”ÝkËYv‡ýJ&lÿvgà á±£i5μsóV/á¾ûêÓ·µò›¹Mcƒê{êÈŽëðyX]ÕÕ{ëÖ­;eÊ””GƒCBB $"lkÕªEòi2™8B¸ |ëÖ-íÀìÚµëêÕ«¢‚,Ü7%%eŸÒréŠÆaaaûÔX·nÝK/½d;+[ºÚEÙ(**?~¼üiÈ®™jJÌZ«”„í«Îß÷½nuëüÛŸ6ÑQYíè¾Þô½uË7_õÖÊo6vô0[Èo¦öp÷ÎM|L»»û£>ªtƒ'Ÿ|rîܹ©å†ƈ–-[ÒÉßʦÁf³944400ðÂ… Rõ¿wîÜIOO—°jÕªçŸ^¬hL¿Æ«±mÛ¶?üPkEc ÷eΜ9sûöm«ß ¾¾¾²`âŸ%CÁÉ1>V,+Oå8ÀÏk–ò­#û~'Þ±iºµŠÛ¤oÖP5¿™ã°¶“ßLV.Ÿ?†& BÉÍÍUŠ/¼¼¼•›ðððqãÆ‘T‹–ííí½½½ yL¸Ìõ¥²³³ã$lݺõý÷ßᾓ'OŽÓ`ôèѶ¶¢±dþZë╟äädeÆ<;»cGLŽþ­Ê‘„-E×ówlœVþ²ÀuØ í[¨ÞÕ}ìߨþ›mªï™ŒÝ7®^ćP9dfföïß_UºvíºiÓ¦ƒÖÀÃã_¿~"eD­Zµ† B&œŸŸo© K=Ðl6'$$ÄÞÇd2999±ÓÚÙÙ}öÙg±jh­hܾ}û*\ÑXkÊ[© ½•Ÿ¢¢"å ùgûÖ~^3+K€¿+Oñ^0ªë+mUïäî]_Ù´Ì6Õ÷djäåóÇ1ß ¨|âââD’}ûöUÍ”[vïÞ=mÚ4‘ˆLL—[¸páÑ£G-R_¶äää=ÜÝÝ›6m*V©X¿~ý5èuz×6W4Vrúôi+ý¹ TOéõökQ‹“¢×TP9œàO¼ÝojÙʦåc?èÙIõî}®]kÌo&JNæ~$:ª–€€Uÿ©Y³æÀCCCS¬55iÒ¤®]»Êâ.ÆOö‡â ïÞ½{ìØ± ëÖ­Nû÷¿ÿ}Þ¼y1jÐN?ýôSUM²…•œ?^:ůrÐ ¶³«áøÉûÑ[—%íò¶z9¿¹X€}],-^ã‡ô묚߬ù“Íj³ê›yÔ„T€íàé驚1¸x$°W/??¿dëA^úÓO?Q³"q'vppøý÷ß9TXý|îܹh Û¶m#3ç­êÔ©óõ×_Gk0a„ ¨üq¼{w[XÑXöP†UÞ¬ˆÖPpÃ~ûõЊàÂëùQ¾.ÆË6ŸoG»ÎßÔó›M›<ÊfÕ·$æáØîÞÁG `S¹ººª¦‰à5Ô–.]šdm¨Í?þX:cŽprrâC*(( +3IpvvSØúöí»eË“ .|æ™glyEc$ù•ö ºúõ뫤 iÒh¢óиˆ_˜V[¥¤Æm*à S –IN½?þ¨j’‡±£‡Ùl’‡SGvú"Ë`Ëpš1sMFË–-g̘q  •3fŒމ‰¡wJX°`pÚŽ;®X±b§þþþÒTl¶¹¢±,Ío%Ìw³³Ùìââ¢Ì“Vœ8ºÎßF~Þ7rË‚&¯r–Ô¸$À‘&—ZfOغÅêq,ÃÄíôµaõ=ŽQ_ i0)ÖhpÆ 'L˜`2™öW¼8ùíöû¬[·ND7hÐàßÿþ÷v5BCC‡®º¢ñG}d#+ËÈËË«üˆ_ƒè¤ ±³«ñ}×à söïô*s9´·D€×OÒ)ž?~þÂsO©CÏ·ºØl~³Ì£&óÅ,¨/P1›Í .lÒ¤‰ªÔ­[×ÁÁ!<<<Ѫ°ÿúë¯Q%lÛ¶ƒ“9Åý¥Æwß}§îkS+KÉÎÎ.**²ý{€s´R…]^}Þu²£)xÉþ«,-‡öú•ð·ªeí¢¯º¼üŒêN_{¥ƒÿºE¶©¾Ù'â¯æg#¿ðàíí­:=н´OŸ>«W¯Þg%X€—/_Q‚Ovóóó‹PÃÃÃã¹çž³ý¥1ôdQ½n€¸¸8­Ñ`~÷ÍW~vû×þ+—C±$À—#ÖM”¿eNì_ÒÊo¶Ús–mù^>ìÖÍëø¬0t›6mêììföôô /á·ß~£_7n®À××W¬þ&Kà6vìXÛ ÷ÍÏÏ·Ù˜‡R¡ãwppP ù">úàå ¾Mܱ²ÔR,À×.G¬ Ê–_‡ ø¿:«©šäaÎ̉6¨¾çϼfÎÁ‡ð`£?Èk Ï;7¡¬¼øâ‹,Àa%¬Y³†8LBPP££cíÚµ«ÅŠÆ€úJáøpÕLÒ1á];Nø× ÍÞn‰;V¨–C±¾$Àák'põiÇU¹ õêÖ™6yÔ‘Ä`›šÝ–›•|åÒäv*x0P+YO”>|x@@@¼…°{xxl+aõêÕ,ÀÛîãææÖ¼yój±¢1‘••uåÊifモ¢"___ýG¡?ÿ4ФaŸ^]fOûrý¯Ó·ÿ*Ê¡=ŠØç›Æõmܨžj~3§/ÛN~³ìñ—Ï/ºaÆàa&77×ÝÝ]+<˜!¡>}ztttœ1X€—.]R‚——ýúÄOÐÏžžž ¡Lq6sæL¨oUÝt]:vìøˆ1^z¡í‡}º»ŒûÄë—éá¡Á­ÿþ¸jµúõ¬òüf'S#ÏÚw)'ýš9) ƒÄU?:´N: ­Ý[B€ƒKXµjÏhëÛ·ouYÑøÂ… ×®]{Øî´´4WWWã&¬BóV—ˆ •UÛ@Æ{ùüq2^Ìh€Ìf³§§§þ€pÆ û÷ï?þüX :uêÄTÂÊ•+é×ÿùŸÿ±ýÏ;WPPð`ú–‡ÜÜ\___z ÒJ §EÇíÖ{Í­œ`ݼ³©äºT ¯_¦‚€^”‡R„yL¸wïÞîîî;wîÜ#xÉ’%3gÎ|ê©§TW4ööö¶ï=}út~~þ;ø¹ ÉÉÉt‰íííõe˜šèrãt ºSTTDšÚ¹sgýq?;;»wÞygÆŒlÂ,À¤¾¯¾úª-¯hœ““CÞ{ó&† b6›M&“««ë!CD¤‰±§§'N0ÒÒÒÆß²eËRÿÞ­[·-ZÐ5jÔP¾ûÉ'ŸTíŠÆ,½………¸¦ÀÉÉÉ®®®úAªTÕŠÆgΜô€ò“™™¹páÂR£#*sEãÓ§O“ë^ºtÉl6“îÞ¾}— XÎ"«ºžB­Zµ\]]‹ŠŠp–Àƒ‡Ùlöõõ2dyo“&Mè‡ÌÌLœX…¥K—¾®ÆìÙ³M&“²þ_|Aïfddð¯J0² úW§5Xj-XQd¥Òäää(ëËƈÒÈ,È•†¥K¡+×®]«¦w Ý<òH›¿òÈ}”wFz}ÿþýü+×7² úW§5Xj-XQT}†~þöÛoeõecDiddƒJÃÒ%ŽÐˆƒ• rl~¸¨Ö,=~zJ¢óF |çе–=YPe!ü`ØŽKí”$~%õe¥‘9ðìl6™LZÓ·º@Vwåò £Ó;0lS€d€<¬£‚¤W‰@Vw&Ö®]Ë8¯hSMžQÆ™ˆ]äääÐÃÝ<ô¯ìÔº[¨YŽ·QnÂ-óîè]Ú5UÖé)½+ö®USwÜwþ{D¯(c¨§ôºl/Vì ,²Sú –Åvjë(Ø}ówº2ÀXKiXT7±ThsnMálpXç`ÈñÄ&b/²SÁ¯óù¬ æ*xާ,ºá¤·ï‚êÈbrèÎѹ[8†\Ì#Û„÷Î!î"ÂGÿ?…´)Y»‘ÝqøÃ²j♸{­ÛX*Àl:A¿F”†ßUÖ‘úªRi‚‚‚DMÕM,ÒÚP§µRc€K=>~3”U“æ@6RÇK`î¾83Jæî ùg÷“Fó.¤ÊG•yCѬòná‰pz<á–¥<Ò GhMrä §ò1ÐÈîÄmÉ;|´ª1‘½hž  ,¾Å€§R€KUaâkš~à­D³2¥!iä‰M¨}n‡\ÔR àX©²²ÐŠÐ`##žèu>Ô2בŸ?À!âZ‹ ª,½‚÷ãŸbXö ÆçVõnáÛI9²ª¼u•{7ø?‚.¢ðOƒ»“y¬jgÅÍ)Z³n_PfÖÉdeDiTM@öE/S -‹¨T j€jk´/1 «/ÀFF°4ÅéŠìtA€•ãŸl€â1w¡HÃÃé²»Eë¦[NÚ”‘xuéœVŒŠÁÝ©V£ã—=ñÝ%öeݾ ‚¸T¥‘ª‹¬e±­Li´¾ßeMÔ­jbfÙ 8îwÄàîtX´ t]ëö pPP2‹×=9;úJ£ÚŽl¤K¦4Ê\¬÷îLʲ@ÓS¶&MU¡/ÀFæ¡`i@ˆt­ Yþç{#À|2ÉôèAIyÿHwAD‚T‰•y€Ez‘ÞåÊܹFîºó¹)Ú–šâÙd×Èîtøž$ƒŸò-+ö:,›Û%”¦T£3¢4bm^¬P*±ÖÒ‚8C™Ø ˆ=ò°~kÅ*5µÔƒ1(À"JV:¡©z p5´º#þÖ/Î_©3«¦§£Å×HÜ9Òx•=GQTN[“îÝH7¥GÈM)ƒ"JÝ÷]kt ©6kõ¾@KQ”h­,¬àR•FXtÉ6YZ`U¥!=jm.Kùk‘H[“¹û†T€-=ÕxÎ{j!"b=8-ùyHØ_‚~ŒŒ ªSêŒ0e³¥¶lÞ»~SVÜ]%7€JSš2|¡ó&Ê4Âw•p0ÖêTSþ?4V† endstream endobj 870 0 obj << /Length 2505 /Filter /FlateDecode >> stream xÚµX[sÛ¶~÷¯à[©‹!ð‚¾%±“ºÓzZÇ=}hû@“„1E*$eד?öˆ”¬ôœÉ™3™XÄX,v¿½ás ¢øð¿_ ï>mÿL¨(ÑikéLkô&X¿^ÄÁ¦?^¼»¿xóAŠ@Ãt’÷« Í¢LË O“(Ítp_„Wöá¡1ýb) ÂÑb)BÒD¤áoƒé¿pR…÷¶6‹e"D‘‡ùâ¯û/®ï/>_G¸«"Ê¥ ªíÅÅA s?q¤t<ÓÊm߈ßMðéb’øk¿þG(Ø—Š8Š G|¾ˆ´RŠL_4!E4Ld:ð3on¶IpÕÁ¹¿¾:aéXÎÎ Et¬*R:Je¨"›4ùÁ®÷=(HJ&ߣ~@ýr¾MåQžæp­ÿdž@ï©Ë6¥EX5Ö´#j;ÍÃa¿Ûád×k^óð¿]kÜ:Ó#´Æ×ÔbÄs1–"è€øK…Ð,Ο±È؜ޙ>'áû§ER„„œL†½©÷m]¶ÕË›wf‘¨H¶ù¢ÚU·HòÐQ_˜ü…ž7¦å}¤\2º}f4)&·)Èã¦lù‹µ|b~8±D.O‹4 KÛ”ÍB„†Ùü§ñξà¥áZK!£T9[ö¦2öɶkXœHf¢ü™ ŸyÆÆà‘˜ôôöj‘¤á¿®ïyÞß|ºæ=GšÍ4 -ñ;¶fʵùÄ%ž”…¤ùø %Þtà…Á ,ʸqÒ=À\~p«Y-° lkþèÍÖlQAn%:{ìÞÓ¥mñÚ¨“%8z$´8V 0ä%ý*P2 J’îq¿‹Npt ?FÒ20$²oAßÏûf´»ÄW*ŸÁlpô¼8S¾ðÏû°pl݆ªÜ8»n…¿¡õÓ1†èB."â*T*t,[7™…U·%%ï[[•£íZ&?ÛqslƒqÜ9dh ÀéáR’S!à Â]Ïnoþ.· DH–; 0xÆïnßÔÛÞ4 ës/{04X—nkF»%På:¬G8“P‘aÃa <†€‹®~xÿËSƳqÈ"ÚÖ®7õ°¼íF¦?#ÃÔÚöõEXþ,Œõ‚n .X¹¸aØ{•‘ e^vîrumÑ·Éieîz [CW–ÚaY4 ]IâÁÎÒ~Ñür.: j³k(_¾ÐÍ FòŒÏÏ@<Ã73 ÓÎ] ÄèÝhø{òxÐ]«©Š<žuãœ&ÙÌ9G,zq/Lñ’ÌEE“=Håõé$ù¸^ž½G¾ZÁsZ‡?¬¢PÜIÀqfÊMtZ ¶Þ œˆ¸ Η ›¾\Å‘¹ŠÑ¥¤˜¥ž·–XRàŽCòA*F%$ŽeóH¡‰£ãM¡ 'Î0»lÊweíúxËÁR±Ö8ÔMZûïC[ú-¡í-‡b´jµ5¤mŠ4@øÂ?oW£ V^x+û^Ë”s.«¾Û:2ÿL€Ã°§äQ>Ä3'Ãá¡øÁ„±ßWtpŒÊždå%ãð•ÀBQDœÂ¶õâ2- âa Ú HguˆËr*ܱ×÷–C`m+¥¢ 8œ«4“*Myh'î®o¯?S]BÓ¡Àt³êÒ¬ ËÊ‘Äpê¤ì¸d"gœÂ! ×}éîı¼)Ô%Çš±ä§xeV\»Â¥/¨((ýã<ÕZðË…Öë(S+ð#(=вEvlY`eýAä€ôÅ…Ìž2Žf»sÀ‹!iBŸr$à:Â*^;ù\B– ÏꔳVqù”é¯ßÝÜ^3S%JŸ4|°/]Xó/§å v ÿɳ$Š*ÿƒÿ†VÁòKI بƒWæ’\©@¸³+ڕŲòÛ[Î/¦PˆP"\:@Ìí K*®f‰%•„¼œ <ÔÔÀ”)îá&PËóU·Gúw„!wº"±;NåŽzHú¸å¸õ€5{°q,©$Azk(¾¤…CeNõÕ;×°0ßtì…·?;NÞx¡寡 Ù©Ÿu)."A )de ë… /çMü6Öí[ ;~çn>õ°Ø¶üûÓÛ[”5¡Ï(äÂÐ4û~ˆŒhÕX­ÄÚ5‰´jôé'ŠþŸãs×|x‡°EG: –R'‘*Ò@F:u¦gŸ?^yŠe$µ/È"•«oñ‚«ý®A¸ãµœe­Ü+^š_5€:o9‘lÝjSH!÷ÖøÊ§bÕA |€}ž Ü¤ L2h‰Jд07ØqO~‰Ž¡PßxÎí?»,éè㳇j–‰8o/`hÙ6?k]’3ÂÆý@Ó¾Õol x¾Ã¦ƒ‰à# ?+ F>ž„<™y Íß–÷œ6Ägå8û2þµ¿T¶¯öÛ*ÅŠÎÁà¾ÜËÇëžEq, ¸~ÿÓÍí¹—|•çrÒ$sE1õ²8(!Hlƒ—(òYÞÔqîÛøU g2`ï¶ì™6nìà^m Øgp¯Õ*Óà ›„Þn™¨ KûØRãñì-âˆoÈY ª†Á®[?í 9ëÃOÒØi§œ¼Î½):R§Êrö ,4,Pòð L/¶B)DþRe77à*aS+65 éJLÙ¢{ÊJκ]øà†îM¸TøZÃ|»Î£–ú!¸BÄiñ-8Ã.<;iJ>ØP…©ZdEÙ Â-¾UPTþModèíÕë°CoCzÓ•uôîã‹)¥" endstream endobj 854 0 obj << /Type /XObject /Subtype /Image /Width 880 /Height 661 /BitsPerComponent 8 /ColorSpace /DeviceRGB /Length 68731 /Filter /FlateDecode >> stream xÚì}wxåöõýç“ûÇîïÒlؤxEP©R”&V”^¥i!Ò«€ôÞ¡Bè„B¤@: -„zÑkç[ÉÛÍœs&'ä4’½žyxÂ9“Éœ™5ë]{Ÿ½ß÷þ}…B¡P( …B¡P( …B¡P( …B¡P( …B¡P( …B¡P( …B¡P( …B¡P( …B¡P( …B¡P( …B¡P( …B¡P( …B¡P( …B¡P( …B¡p’““YÃÅ‹suú-M¾x÷î]z=·geõhö–ÇúF8äR( …B¡P¸ µjÕú‡5”À>ß~û­¹ÃÄnø-ì)_7n-·ÏêÑìÿ,£¥´uòv)œ„ÀÀ@}d …B¡PØé'­:L¸Jõ“ÓO&''·lÙÒCl­B¡P( Ï´1”‡´ùF§NÔO@?éQiR…B¡P(žicàýlíC¹)¶”V³”VËüÔOæýä=¤~Rý¤B¡P(мøIB§NØRÚYG§~2ßœ¼úI…B¡P(y÷“rç–-[ªŸT?©P( …B‘[?ÈÅ–†vïqY˜={¶‰ŸÄ© 3Çžqé^ðGa_¹Ù?¯ZµêÑ,™áP@§NlåZñ:}¨û¾ñç_Éշϸ&ü©éƒ[½Ô¶NÞê…eàâ|äñM®ÏÝ»wéhøÁòjà –……îþµz>8 ÜMÃÇÌqN…B¡P(ÐO²Ó ¦Å¼ÖÅj#9~˪ùá£á]«ÍæV¤æ~R–€`µ"”Ng÷hhJ²åî Ø¶m›áåÇ»öœ¼Ib§mëøV¯ŽÌ¿kõñ‡¤[æ_±Ü÷Á=2ù˜¶Ì­B¡P(Šë'¹ŠÒàÁÌý$g·ðë”à’öÒÒrðþì^è·ðëòEûý¤lcçsG³ì[g?ÉF”“oö¤Ý` S->89ÕGö“|#è éàÒaZþ ›CþD|aåí¿ˆ3¤6Ã$|¹dÊš/, Ý»Á9+ …B¡(à~’-¢Á®˜ûIzË`Ã8E†ßµê'­&e¶Ðpζ,[/ì@_õ2pJü[¶¾¬§_¤¯Å±¿îÈÄ©òùÈ,b®ü$N•/¥yæãþ´L6â _ôËT°åú¶l-¶ÕÓàû«U— …B¡P¨ŸÌ»Ÿ4äâ,ÁË™˜1òEœÀÌÑOâïò9Ì$[J«G“'ŸÛ:@ö{¶—øTù²äÊOòõ±Uüiy|ƒŸ´ú‹|;,É`ËOš÷ép-¥>h …B¡P¨ŸÌ£Ÿ´5 :›=«G31rüuªôEV-gÉL> Õ£ñÉÛÙÌnõªÚò{Ô¤ƒ?ñ~’¿b6916´²,ý¤eBØð[¹õ“Vó“äÕõS( …Bý¤Cü¤É|•Vsƒ9ÎNcÕùXµdöÌÃcõh|òv^™?”7"G?iC¶jÔÙOÚº°¼ƒý~R—âÄÇ™š …B¡Px¾Ÿ4ÿ¾Øª¢£ÙÊjÚ²F&‡¢=M`y´Gž<“¿@ÏÕ÷¼öûIy¶9~"éiMìâ#ûIËæwê‚E×ä¤B¡P(ê'­ÂV¯‡¹ŸÌ­¢£™œÒ#øI{à?™cÐQ~Ò8ÛOÒoÙš Šf|Ò§L¡P( õ“–¾ÂV'ûÉZv@šdÏ÷“ö|"Ycé$?I ¤ÙŠ, ¼IžY¡P( EAó“²WÚðm¦yý¤É‚2V;‘éh&ý&r*E{üd®Jóè']ö}÷#]gøIùñW­ZE+ï˜L1ªP( …¢`úI9‘£=~ÃKöhý8V›e¹DZ~ÒKó„ãO°Ñrl?Žý$ãîÝ»¹]ð]¡P( Eþö“s«Ý¾ü×­®nËòR††?gÕ’ÉmÍ‘huzð¼øI¶|ΞÏÜÖJâVokÞý¤ÁáÛš>Ôò:h ¥B¡P(ÁOÒäÀÈ%¡MV™Éíz‹8HŽßž[µL0“ü®aéÃ×[´\dP®·hð~yñ“òdœºÞ¢UK)?¯vÑ~?i¸€&“—12Ÿ€T¡P( E¾ñ“vN§c«³Æ¼¿›Wy†ëÀ‹ø—†Õ¥ùhüwÇeAž­¥1)•”¿ÈG“=#–>9~Rº)þàÒœþb®ü¤4<—¸áÂZº¸¼øIyåŠV?¦áÚjrR¡P( õ“öL$hî'ek†=•ç ’ß³Ëó±êˆÌ[o¤3æÇòëø<úÉû¶'f´ÌÖ>‚Ÿ¤3´5»&ö·L æÅOÊ´°!óixËp§LÊV …B¡PäÌž={œ)à1ìYè„v6|÷ KC¯Ó¹}ƒúDL *ý9"üuXAþEø[çßÅê7ò÷³êýðët(:Žlë«X>y[G³4yNŽÜÖÉ[½° \ Z Üž ‹#Ë ›ÛøêÑ]0œ'Nƒ?fŽwJ¡P( …B¡P( …B¡P( …B¡P( …B¡P( …B¡P( …B¡P( …B¡P( …B¡P( …B¡P( …B¡P( …B¡P( …B¡P( …B¡P( …B¡P( …B¡P( …B¡P( …B¡P( …B¡P( …B¡P( …B¡P( …"àæÍ›6pøða½> —!::Ú/]º¤×G¡’¨P؉@ÛЋ£pæÍ›÷Ïþó¶ñä“Ob½P gà•+Wþ‡)Z´hqæÌ½V •D…ÂÜIþûßÿ6á0>jÔ¨ÿýïz­ÄÍ•“±^ƒ…ó0tèP{xºbOðV¯˜B%Q¡°ŠråÊÙÃaDFk×®ÕË¥p–-[öÜ@D 'á…^°Ÿ‡š R¨$*V‘˜˜˜+¿ýöÛZÅ¡È;Ú·oÿ\‚Dš'W8‘ÿ‘{T®\YeP¡’¨PHL˜0áäÌ×uE^ K,FÝ¡C‡'žx?-ZtÔ¨QçÎÛ¹sç›o¾©yr…S1}út¦Ö /¼°|ùò²eËÒëÖ­{àÀ“'O2¤P¡B–Tüâ‹/T*‰ ¡víÚÒ%zyy.\˜Ÿž={ÆÆÆ;v¬aÆ–ùáE52R<%—<åïï_§Nz¥L™2+W®LKK›={v‰%4O®p¶nÝ:22T„ +VŒ^ìÒ¥K\\^oÖ¬™Ö–+T «¸yó¦$äÂ… Áá   ¯¾úŠ^)UªÔøñãÁa__ßòåË[rý–-[ôJ*rÙQµjUÄèèèE‹q‚Z ™MIIéß¿¿&ˆÎ@Ùd*wèÐXG "ÈàÖ­[«T©¢ "…J¢Ba4yX¸paÉa¸Äš5kÒ[*T€Ÿ„œÂ[ZŒããWôz*ì„lëÝ»·$3|øðâÅ‹Sþ§W¯^ñññx×j‚Hóä G àáÇ T àdpýúõçÏŸŸ3gŽÊ Â]’¨$*<²¸iÓ¦–†r¾øâ‹´C£FðhܳgO«‘Q¿~ýt2 EŽ0t@lÚ´É’x@hhè×_Mû”,Y± †r èš'W8C?øàƒÈ,XRqîܹRa;Md°{÷îš R¨$* d°···U?~¼oß¾\T9`À€ÔÔÔÀÀ@Yw$#£éÓ§ë…U˜`Þ¼yL˜§Ÿ~ÚÖ ~< Û¶m“yò 6¤§§#úÖ‘"ïxòÉ'™<£F2§âàÁƒY{õê•c {© "…J¢¢€Ã²Ø„Ãøì³Ï82š3g8¼zõêW^yÅ’Ãåʕ۹s§^a…UÈ!˜: ˆxÛ·o8pà®]»$ñNdz+D 'Fs“‘æÉ9nPÒzÈT7nÜäÉ“ :t¨M›6,ƒ?üðdº­‘Ê Â5’2«$*ÜË`âpHHˆ——׺uë,9 å¬^½:ÿŠŸŸäÔÛÛ»H‘"–Éu¶U…ÿûßÿdÄ‚ ˜x£FÂ+ÐC¨ß‘#G$ñb³Ð¯_?NAfOŸ>Îåmš'Wä Ä7V³cÇŽ‰¢+V\¹r¥AÁCèË`µjÕ0è_¸paâĉ¶dÔ«­p†$2D%Qá À½zõbó,ýÍš5Û·oŸ%‡gΜɅÁmÛ¶EÁä°]W(S˜`Ë–-L'žx",,Œˆ‡QûÚµk\Ï‚Mš4É@¼¸¸¸ƒ~þùçœ š;w.†rÍ“+rÍî®]»²Ÿ£@°‹ áþýû-©|æ™gx¥’Á.]ºX°WkË*‰Šü CðÆÙOÞ»wa¥ÍûôíÛ7""ÂÀaìÙ£GžLÃËË ‘Ñž={jÔ¨¡+”)L ; j׮̓øÉ“')Tçyÿ€²eË.Y²Dˆß´iÓ[o½%D/^üþûï5A¤x4ôñña*Þ½{;Œ7Žß…ÐuìØñСC*B-û÷ï/D8lpp°&ˆ*‰Š‚C0sÅ»þù'8É; 2š|8¼oß¾wÞyGóä `´eb´jÕŠý$ àÕ«WIwEƒ‡üƒjÔªÃßÂ14X·n”A‡‚ ZMá¯km¹ÂI’8`À•D…Ë`(þñǙ÷nÝ‹/Î,G¯T…8<åÇ%ˆhçÆ>>Óùóçs¿¤a {mµ€b%oýÒ¥K™xwîÜÁ ^çÝ:Q‰—¬n Wl*[®<;ƽ{÷JñLÎÂĉy^_Ê“Ÿ8qBóä ‰îÝ»3 jÔ¨qôèQ¢"w@<ýôÓxkÅ:«< ŠHîÐ¥÷YŽ2Æq°5W2¨µå*‰N’ÄéÓ§«$*œ‡^xÁPL¾zõ*Þõ÷÷ÏlÒy¦´-oÞ†Ó¯WªT ñµ¥œ®Zµêµ×^ãâa(6"£Þ½{ë e<€€…qî€Oð–—÷¤¨¤K&và"úˆˆ)ž°8f·nÝ8A4f̘+W®hž\a)€C‡e*Rľ}û2)Z¼¤9ý÷GÔ©ÿw‚hÅŠ†qT”2H9ó´´´o¿ýVkË®”ÄØØX•D…3`(ÞµkûI*îÕ«^ÿ䋶枽ȇ«‰š4ib)§\ŽŽÀ§OŸ>4Ö7nÜXW(+€ñG}Äâiè€8p4&ù²ùr4¹c×ìØ¤xñâÞÞÞ’u@JJÊÁƒ4hÀ ¢uëÖedd,X°@D*€òÖûùù1eD³?Ï‘‡Ø¯Ú\öµ ì÷ïßoIÅÑ£Gs‚Ã:^‰‹‹ã–pM©$ª$*SÈàW_}•9œ€wûí7*ž>g™=r:Èktá"E)2êÙ³çñãÇ 4†Må¯×K•*5eÊpxË–-*TÐÊ 0DÊÅâA&u@¬^½:svµ×*ØÃ:Ú ³uêgÇ&¯½öÚªU«¤x©©©kÖ¬yùå—9êÏŸ??hÐ Í“X n5 Qï~VDÅŠí@Ú†{O*þ AÔµkWÐ@Ũ¨(þ’eZg5A„BêRIt’$¾þúë:tH%QñÈ03‡/^¼ˆwIœ8g'‡}Õ®+UN›6Í»wï~ï½÷¸‹ j 9Ådµ0Xg[Í‹ÅSã,u@ÐêðÝ{{üä•\mKVmáQýúõwíÚ%Å8uêÔˆ#8OÞ·o_¼ˆ¿ËS§jž¼@¡víÚ$*¦§§ã]„Õ$€±i¹âa豓»õá‘———aöìÙ#epëÖ­W¯^… ZMá<µ¶\%ÑI’8fÌ•DEaYÌ~òÞ½{ØaòäÉ™½`ïÕÍ-‡·î ÅoÉÈÈRN—-[ÆÉ¢–-[ÆÇÇãÅnݺé eù¸›†"âŽû¢bÉê-'R®<Â6bôäâ%²åöíÛSs‹'Ó±cG™ ÂPŽÝVž\DùK$*R `õÿ¾óh<ÜuðXÝÙ ¢—^ziñâņq2ˆã8Þ˜® "•D•DÅcË`âðñãÇïgÓJa â£qxÞ’µ/¾T†##„`9Eø?xð`ŽŒ ”žžF…ǺBY~…ì€èß¿?Ov@.R46õÊ#oaQ';uÏN`Ç—ây: øCï¿ÿ>FõêÕ¹_»vmêÔ©VDš'ÏßX¸pለ¢"eY“*.]³¥ÜƒÑ{ï½·{÷nK*~÷Ýw,ƒÄ .˜$ˆTU] ‰+Vܶm›J¢ÂNX‡i±^g÷Ácy¡1Ô˜‹*»uë†ÈÈ@ã#GŽ|õÕW-Z´öõõ-S¦ŒÎ¶šÿ@E H: ˜¹hH«/âR3ò¸í>YïA‚èå—_^ºt©Ï3YX¸pá³Ï>Kû|üñLjq°ƒœCFóäù_|ñ…@ö“$€´7X”w*Ž=…D:t€]4PÝ~,W®œÖ–«$:IW¬X!sæ*‰Šaµ˜8LôXµjU¦p½V!ï>•Ò¦CöÙ%J”=z´!,‡wìØÁŜժUÛµk‚t„íV‹*u…²Ç²Q9âÜA] Sf.ˆ?•ám¹Ï–JoVåÑž={¤xž={699yÈ!2AtñâÅðððzõêi‚¨€àرc™Š×¯_ÇëׯÇë/¾\ÆQ< NéÑg'ˆFŒaÇAÅ€€–ÁêÕ«ïÞ½'3nÜ8­-WIt¥$*‰ ûa( %#p¦eq¨è(ï ú;2zíµ×|||,åtáÂ…<™¢xšÇ?è eù²¢]»v,žÔJd·€Å¤&œ¾êÀmêÌ…œ êØ±cLLŒÏsçÎ!’úúë¯9A„x C9L…­‘æÉó“îß¿Ÿ¨ImÚ´ÉlÒéÞ×±< >ߤiKN-[¶Ì0ŽƒŠ2gÞºukh ö±• RTIt$.Z´H%Qa²ásذ*ÄrŸ­Žå0Xîõìj¢ ä'€sãÙV¿ûî;DF¬Y³¦ÕÙV!Èz7`à“k%Ï›7‰'; Þz»f♫ßb’Ò{öý;AjIñÒÒÒvîÜY¥J:½ZµjݸqcäÈ‘š'Ïg€ ãûˆ;‘ð0))I àŠµ[AÅu›wVz³ýõ÷ßß¾}*¦¤¤à YÁÀK—.9rœ´*ƒx”ôžª$:IkÔ¨Á9ó={ö¨$* 03‡322ðnHH;ƒÃØFÍ®&“w?~Ü@ãÈÈÈfÍšñö«V­‡ñ¯Î¶úXcíÚµ†"^TTÔý¬ˆF2öÝØ¤3ל´…F$|(D+V¬â œ?~Μ92ON3ókžižü1@Ü/ö“¸ï$€4U   xˆmÃÖÝ•«TãI­wîÜ)Çqð011QÊ í[·nA«W¯n5A´víZ½×*‰ÎÄíÛ·óò ï¾ûnHHˆJbÁ„Õ`ò“rYœ·Þ®™tæš+åtôø©22Š‹‹3Èixx8“p²rúÃ?”*UJW(ó|ÈÅâ«T©Âƒ8w@PM[Ï.ØÂ"“>z zöÙg/^,Åób&MšÄ ¢=zœ;w.99¹U«Vš z¼€ûb@¦"u@Ìœ9óA„«yˆmúìÅ,ƒmÚ´‰ŠŠ2Pgk)ƒK–,±*ƒš RItž$âÙQI,à0#² ÇÄÄÜÏ*nذ!»˜Ã‘qgºõèÇ‘h‹Àaèç+¯¼Â³Ÿ8q4îß¿¿ÕÈHW(óT®\™ï ćœ: ðu@Ä$¥KñL=㔫¶Ûö¼)D»wï–â "A-{÷îÍ ¢éÓ§ß¾}{ß¾}¶Dš'÷@নIH-0ý~25ÍuwïܹCè¿7ÌŠŸt!ã“Z}֚γtéÒK–,‘HT”28`ÀÈàÉ“'MdPD*‰ÎÄ£G6nܘsævT  ÀÌajðçàLŸq'‡}6øqdT»ví   ƒœ"2êÚµ+϶JÉ" îà³%‡Ë–-«+”¹óæÍ3t@ñNœ8q_t@Œ›<˪xž¾pÓ•[âé˃‡*’µNh‘"E ìR<+W®¬]»–çõmÚ´)•g`L×<¹‡ãÉ'Ÿ4 QÑБpúª¥Ÿ<~ÓÅTôßüvZœ 6PÒ ƒ°ÄAD:–<|þùç5A¤’è$IµdÎ\%1ßãðáÆ`âð±cÇhY.¶ê']/§3ç.)ñ B£K—.III’Eû÷Nœ8Ñêd 6ÔÊÜ®ø¢e²Y<©"55•: ŽÄ¤ÚÏ3.ß"¢“¿jÓóä>>>R<ŒŒŒ1cÆp‚hàÀéééñññ¶DãÇW&x”Âw!€u@tèfËOžq,YÍ "È Bi:$e0 àîÝ»3f̰• RTITITä–ÀÄaÔ}Q¼Üg«-?éz'¾Üw@v5QÉ’%á a°nÝ:žmõÓO?ÅÃ÷ìÙÓê e}ûöÕÙV] C†9&u@ÌŸ?¯Wz³jÖ nCJb¾„e0qL¸/ €£ÓMü¤[8zäIJ‹*Ë—/ïïïoS„u#FŒàÈÈËËëêÕ«‘‘‘ 4°ä0H>wî\åƒk ; tñ =ú 2ÏsØ.¹g›:cn‰’¥h­Þ½{Ÿ€¡˜9LËâppPxœ~ÒŽ:q²M»Ž<™Æºuë a»hÑ¢’¢—çt:w­ºÐ y©·lÙBÄ;zô(u@|óÍ7xý³ÖíìÏô+wÜ»­^»¹ôƒþˆöíÛÇÇÇ_{ -[¶ä¦ZðC9† «yòÊ•+*Uœ-Zð5ÿðÃÙO" Å»ééé$€Ããì÷“îåaÂÉómÚub\±b ÃR1¾Û’Á¡C‡j‚H%ÑI’È_>ùä“àªJâã Ë`ö“wïÞ½ÏÀ•«þÍáýä7ÓØ/`•…ÁuëÖ 3È)¬òàÁÙKG!ð¡dˆŠh]W(s dD™2ex7t@Ì_º.Wây!ÃÍÛéóÃFxÓw=½ÇŽ{Í»víâ%Aß{ï=|ð7nðœÀíh‚Èe8iÒ$¦âíÛ·ùë›7*W;•‘+?év*î9*eððáÃdp̘1à!>;8iU5A¤’è$I”9óÿþ÷¿ø¯Jâãˆ;w €‰ÃQQQ÷.ΟÌp?ç.XZ²d).À8uê”y²hÛ¶m?ÿü3â#]¡ÌÀõäkÛ©S'Oš| ?Ðv‘ñçs+ž¯ÞuûŸÚ¼å'<4øúú^µÀÂ… e‚"i’ Ò<¹ 0((ˆ¨xìØ1À¦M›â­oú z?é Tœ·pË`·nÝRSS <Œ·”A0ÖV‚HeP%ÑI’ˆÁWJâ™,¨$>FÀ”*!Ã}ÝÀ·È­Ÿ¼è4NJMïÕwÏš5Ë’ÃPx¶Õ>ø ::‘ÑðáÃu {çáæÍ›òª.Z´ˆ‰GãÇÇëµÞ«—šñâyÉ36ÿÊWÈž>ºI“&ˆÑ ÜKOOG¤Ã ¢)S¦@!q4Oî2ôë×Ï3YŸzê)¼µfãÎGó“žÀóéW{ ÍÌe°aÆ111xHÇŒ£2¨’èbI4hÌ™ãʨ$>.ÀƒfÃSÝPüô3¥â°Ý~ÒC8Y§nv‰oµjÕ œ–r åȨwïÞ—/_>{öì§Ÿ~ª+”9² âÜñþûïgV¤žüÈâyùÚ=OØ.]»;qÊ î€TB0 ܃¨BZ¹©ÖÏÏìZ¹r¥æÉ]/€LÅk×®qö²x‰’±©è'¯y #¢â(ƒZ[®’诜@CB®JÖ°aCŒ#·nÝ1b„&ˆœ‡ÄÄDƒ#""¨‚°ùÇ_äÉOz350ë+›Õë6¿R&{v Ùqqq¦¤¤ôéÓ‡epêÔ©¿üòKpp°&ˆT],‰yhnš=I%ÑÃa(f'%%ÝÀ3ç.Ï“Ÿôg÷æ9…h2 ‡###y ûråÊíÙ³r:kÖ,«‘QíÚµu ûܼ’‹ÅOš4‰‰GK—.ͼø¯UˆM¹’ñ¼rý^Æ ·mWnüM<œÎm×¾Ðïd¯¹\³fÍXJ¨L <øòåËçÎûì³Ï4Oî ਘ@D%‡?cîò<úÉ+7ÜJEá'qV§Ò2†B‹äZm%ˆTU'‰?þø#K""•Dt@3‡iY.>—–?é^gXp8*öd³­x¡9… À‹<ÛjóæÍ“““AãAƒYŒúõë§“iØÀÀ@Ù±wï^"ÞÑ£Gïgu@|òIfÙö7½¿u„xþä®ÍR<ÏgÍ’ºpÙšú#ÚµkGëGHà•®]»rþgöìÙ¿þú+®R¥J•4Oî<lÓ¦ ûIJtÄÄÄKs„Ÿtö“87œä±ãÉŸ|ÞšçZ»ví àE)ƒÄU[2ؽ{wM©$:I 9s•DOƒe0ûIY\ó½ºF?ŠŸüÉ}›‡¯drx«ÿÞ×ËWäÉ4Ž;f)§r ûÁƒã•'N|ðÁV#£éÓ§+©ì쀨R¥ âÔxœ: Vopˆx^½é†ÍD<ñŒ$Ÿù{éy 4³ä^hh(hÉMµOH¨æÉ'€ðíLEƒžH¹â?é6*Zó“8Uœðæí{߬Re¬³G1¾Ó¼š RIt™$bŒ–9óíÛ·«$z, €‰Ã°L÷Eðˆï';ÄOº…ÃY4¶î'INÇNü¾÷“Ù™,“Ë–-kÉa\W(˲¢oß¾L<ÙQ¸HÑÌAÜAâyíÖÏ®ÜrOÏKðáã f¯¹üÊ+¯lÞ¼ù²|||ð'ˆhÉ'Œé¶Dš'4ü׿þFT4t@ òã@?é*Úö“8mßáâyãöÿœ¿åZ–r ZÊdÑ…,pØ®+”IȈúõëó ~îÜ9¼‹ëFŽ:[<ïÜûÕq›ãÅÖ%,*¥S·>œ š8q¢%÷0è4oÞ\&ˆðüâ_Í“çJ-ñ€ÿþûïØ2ÍZ~îl?yÇ¡Tt¸ŸÄ£‡péê-å^ËS§Žý2Ø­[7M©$ºX _ª$:²ø©§žbSiÁÏ?ÿLÀ˜ïl?éPÿêp?Ir:xø˜Â ƒ{õê…ÁÈždÑ¡C‡Þ~ûm]¡LŸ¯ÃðáÙx²âégJg âNÏŸ~½ë ÍIâ ƒ+°uWhÍw³'(_¾üÆ/X`ûöíôÀR‚(!!°­Æz@˜)€xT‰Šñññ÷EÄ÷fºÀO:Œ‡?9ËOâ1Ää5ZÊ  OŸ>=`À)ƒýõWTT”¬”2¨Óª$:I÷ìÙS£F ®3 UË`âðåË—ï?XÓö‰B…BŽ&;ÝO:’ÃÎò“àðþC±Ÿ~ÙŽ ƒçÎkÉaÈ£L@N!R1äö-Q ‚É+°{÷n"w@|ùå—xý«v]\&ž÷~Îëælñ„™ÁÕ˜³Èc O¹¦YÒA"'ˆ¨ýáÒ¥KrN0†~ÑÓ¨Q#)€ì'ÞÐG$»ÆO:†‡Nö“x$1"|òEÛe/o¹rå¨È´¥ â•ÎC•D§J"øÉ’8a•DgÀj0ùI*7ngsØù~ÒAv¢Ÿ$¯ôÝQ±RUnbBd5Y„ ‰‹…îgMÍ4tèPËÙVûõëW ˆ'‹Ç%âAœ; žþùÌušVnr¡xþöÓÿ}s™xF']?~¶÷¯'²’?… 0`À©S§ÒFBB-k‹]ŽY†<9nDA@<òaœ6mS‘pêÔ©$€¸ì.ó“yãáo®ñ“YT¼´vË>)ƒ~~~éذaU²~|ÙA<ƒ ð±X%ÑÙ’ˆWÚ´iC¡J¢3°eËYHæeq4h€·¾6Ú…~ò7È©óýdtò娤Kã§Í+V¼$¯ù‹AÜRN½½½©RH–lÁ^J·oß¾@¯råÊüÙ;vìÈâIø!³¢p‘#ÇϪxZŠ'ˆ™xqwpÌMšóšË‹/6üdß¾}÷îÝ»{÷8ÜimBŸ‡M . ¨H_¿þþûï}ôQæ21¼ÔOZõ“Q‰—".ŽŸò âêIRæ "îÞµk׎;àI‹J¢k$‘f 3fŒô“*‰Ž‚e0qøúõëxêJÀ‡cκÑOÚËað“ó–mÄ{ùå—%‡{ôèA—WúÉÍ›7Ëžˆ5*-·Ä¸,D"ðH’‡øÉ8ìn?¹mw8Ÿ£ïÏ>@rr2}³ãçç'ý$uèh„¥6nܘý$u@œ9s†pwpŒçøI#=ÉOúí §©¤A?¦"h‰¿øâ ƒŸ,Uª”v@¨$ºLš³Iç™ÒGã/z^~2‹Ãæ'§ü¸”&ÉáO>ù/öéÓGúIš­`Ëâçýë_<ˆsÄ{ï½—¹Ðȉž&žþõ`ó0ñ¤eÅæÏŸú “ÔÇYúIJ¸5j¤ÈW£wïÞLÅ[·ná]???¼^¬xÉ£ñ<ÍO>DEñ“S³£öi¦M›âÅ#FH?IÅ §‚ÌC•DHbpp09F0PúI•D‡ 11Ѳ U!À*þø³6è'yó(?ùQ‹ÏqÅúöí+å” €}||¤Ÿ„½,°À_|ñ…ì€`ñ4t@øí ÷(ñôØfÆÝÁ1Ô'šY7xð`ê€0øIÙ8]P Q1<<œv ü¨Ågžæ'=¶¿»Õçm ˆ‹Lë‚ùûûK?IÓО|òÉ>«$º@ÇŒC——%‘ü¤J¢C`(f €gÎ_íi~Òcû»©ÊÉÞ´i‡……I?Y­Zµ‚Ylè€ðööfâQ"ÊÌ.’rå3qO‹ÍCÄsÔ¸ÌÆ®÷ß_F1Ôg\úIº¶ ŒS*€„çž{.$ àáÉ“'ñî­[·Ê—ÏLqL™¹Ä³ü¤µÍCüäÓϔƃè1G“>|XúÉwÞy‡/~ûöí 2U]#‰ø/^=z´ô“*‰Ž‚¡˜9LËâà¿TyÚ³ü¤9‡Ýç'}6g~ÃX¢D Éa*nÓ¦ô“¶ØÐÏNÄ‹ŒŒ¼ŸÕññÇã­Î=x”xzòä½µë5¢åÃN=@tt4µ€aà–~<ä‹_¹re@¾_}õûIê€8zô¨@ò“;Ÿ9 à)*Ñïܹ³ô“xê¥nÙ²¥ óP%Ñ’˜À“§I?©’èX‡a{hYDITwÁ£ü¤ÇÎgÞµçÀÌùÁZµ’rJÀ .”~R&F ZðСC D<î€xê©§2»HÖl÷$ñ4ÛÜ+ž‡c²; @-fÍróî»ï†‡‡K?ùÚk¯i  œ* WŒ¨ˆç”: `í,ô?iÊCwûI«Hë‚­X±Búɉ'j„J¢+%‘*Tßxã )‰‹UË`âp||üý¬eq¨xÈȉžä'íà°ûüdÅJU©˜9 >“`K?IêsUÙÔID<ÙQ¸p‘#4ˆ{‚xÚ¹p¼›ÄsáŠìÅâS0¦g>¼C†Hñܰaƒv@0Ö®]+O(Q166ö¾è€è?ØÛsüdÎüðÓTa¾xñbé'g̘¡”’™Ià™gž Î÷ãœ={–ep„ $ƒ™Œ.½‚"’]ì'óÀC—úIÀ]»v1ç΋WªW¯~ìØ1é'á!µ"·’¯’øÈ’H”!¥ŸTIÌ#.]ºd̦M›Jc ¢é2(Yôå—_ÒnÅŠ—?mžëýd^åÔ%~ráÊÌI&_zé%Éaºt ~’Ö£/8À7oÞ”KÚ€xœ'Ç …™’““ûí7ú]___ÞëÔo´ïÐ —‰gÞ6׉gµ¬ˆ‰'2ëè«È#¨%ý$-ÒT; À4Ùø ñÜsÏM™2…5ÐRi%t’Áï'Ìt™ŸÌ#]æ'e œ¹@šå(ýäŽ; xD^$qýúõ*‰¹•DZúœºb¥ŸTIÌ hsƻᄏmÛ6Éá'NÜ»w~ÿEŒI{V¬TÕwë>—ùIÈ©Küdëv]¨CÊ)Ô/®]»VúI95D¾/ž7ož,¼g€N:u¢ŸÿóŸÿÈ…>\«óçÏÓ¤U?ýôÓ°aÃ(AT¨P¡î½¿=—ælñtÈæñ ŽH¦i10^3ë¾ÿþ{j‹ŒŒ”~² w@œ9s¦E‹–<,R¤Œ"© ä5ÂˆŠ±±±´ò,çóÖ[oÑžoT®ºj}€³ý¤cxè?Ù¡koK¤uÁ6nÜ(ýd@•DODšœªV­ZDé'µ)̱ùË/¿Ü­[72™O<ñD‡8À†ÿ9uêGF‹-*V¬Xv õe»CÇN:ÛO:ˆÃ®ð“/¼ô .˪U«˜ÃðçT%ý$Ƭ‚P(¿Õb<ûì³ .<›…    ðòL³fÍbâ„k×®ÑÑÒÒÒ>úè#ÚóégJÏœ»Üyâé°Íùâ9qZfÓLN²lÚ´iÒOR‡N쀸yó& ŒœgRN`Ž“¨8nÜ8–Á¯¿þz×®]’ŠxœY/^\¼xq:Âg_¶ <ç$?é@*ºÀO²2}}}©) (ýd½zõ f„Ã%‘ç\RI4—DZž{Ô¨QÒOXItx‘æ#GŽ$ãy—‘‘···ä0®ÿ… 82êÙ³gvap‘¢ƒ‡qžŸt‡î'w8J—ôĉÌá^½zQ°ô“û÷ïÏ÷«B˜ä‚† ‚¡ùÜÃX»v-'ˆÞ{ï½7ñg!..îîÝ»td;•*U¢=k½W×Ï!‡‹§ƒ7'‹g³–™‹ÅƒiÌ:0: 0xI?I:„–<ôöÛo#Ä6ð0>>¾G,ƒƒ b a‡ÒÓÓYÈ28dćûI‡SÑ©~2 KA–¾K—.É•… B|m™ ² ™e6Éßß_RDåF®—^z){Rôš:šG?éd:ÅOÖ|·®A÷ïßOˆÇVúI)€Œò÷(ìJI¼~ý:Ϥ’(%‘fçëÓ§ô“JT¤¯h‡wsHõ¯ýë›o¾ bgÏžýã?(ø1bü݉ä yô“Îæ°Ãýä‘ç¨Ö‘9LËsתU –~2_CâäôSŒ%JÌž=;MàFÒL!óä*TX¼x1îèøñãœÓ8qâÍ–œ9‹Ý›ÕÖoÝ] Ä³{¯o© "Q€ZÀ|}}¥Ÿ¤5J3óq.hÔ¨QVsAÍš5ÃÕ`Ž]¼xñÎ;ø×„‡©©©8'ˆ0¬K*B9AôÝwß± öî78.åbÁñ“±ç¨Ä"$$„yHÓÊã•~’Ö¡&LŸ>=§ÇÝ"‰±±±üwU¥$®ZµJúÉ"‰N*Ò€?„Kd~fddܺuëüùó&ŽŽŽþôÓOéI“&Iã¾\¾|™þnzz:GÏ<ûÜâë ”Ÿœ>'sôJ•*I7iÒ/z{{K?)× ÎÀ&¹ þýûKÊ]¹r…_ü€ÿšK¨Ì“7hÐ €ˆàb±sžÜÇLJøò뇣’r/ž®Ø.že_«€Œá‰YGSQ!fÓ–~Ãz¾ï€°• ªR¥ÊÖ­[™W«Û·oÿõ×_øü‹Ÿñй Êј1cX<Úx(AtáÂ…¶mÛ² Î[´êü¤ 6‡ûÉés—Qš@jºAX-ýäºuëò}„'H"ž•DMNÇÈ’HcqAļ”JšiÈÀlçš½?þøãÚµkæÆíà”&_rÑ™Ž†à Þ«]owà‘ÜûIWÉ©Cýd³3 €{öìÉo)Y¸RúÉo¾ù&߬ a°°3D ØõÃl‚¨G4+àÑ,Pé 2NfРA”$)R¤èïq¹O×lŽÏý‡bi‚áIx0sùòKé'ñ`òtÜù²°:ƒy.ˆ¾X‘°G "È k €«Í ¢)ƒ{FØï'Ý@EGøÉO¿lGÈ<Ä¡‡qïÞ½ÒOJÌž&‰C† QI„‡Ï\§ò㥟„$À¦°<æ5jÔØ¹s§ Ìy"5‰_ý&Ó\N-ZÄÁ×þýû%‡Ož<ÉuÆŒTœ9/VÏ~1 gí÷“®£±Cýdñ¬àÍ›73‡—/_ŽWÊ–- ¿-ý$ yþXbË–-r0Fùòåׯ_þd.È*8AtÞ6pež|Ê”)L<ïr‚Çá© ^~¥ÌÚþ9‹çÍŸ]¹9Pÿ<ó+›AƒI?¹oß¾|Ù¡’è±’NZü ýd¾”Dçi¤¦¦2ë222¸HÃ0œ` yd„á‰çPE8öã?JC:ãÓÑÀç:uêd·³U­¾s_ˆ‰Ÿtà'»÷Î,nÑ¢…”Sª]ñññ‘~ò»ï¾{¬ €íÏGŽáµêìÄåË—Ïç™ jÕªÍ'Dec=çÉ'NœHsŽ*ôÏþß=•–a)žîÚò.žGãÒH'÷ìÙì7n­ð‚GOúI™6Évæ‚(!®@®<}ú´9 ¢©S§²‚‡A¨®¥ V©Z}ÛŽ}Vý¤Û¨˜g?ùMNÈ~rìØ±ù¬B%ÑÃ%qÊ”)–’ˆ±˜ËPówS˜¹I#($ɆkxöìÙ\ÿÎ; ¡9‡¡ç<‡ê;ï¼³qãFÉᤤ$žLòþì³ÏfWr¶ë2ÍÒOºos€Ÿ|£rU|4øjæ°¿¿? &~–~’§ª{ €ñÐÙš~êðáÃéÀE˜;wnPPÕ2!°öœ?~ºÀX?lØ0N 8‰… .PjëLçYºôsKVøHñtï–Gñ\²:³ïæÅ_”ƒ8u@|ÿý÷R5s˜ €¥Ÿ>>– ¢óçÏãu¢ö4pãïµk×Ìé·uëV™'G´EÄ#îœF­\¹O íÙ»ï€äSé¸ïnßY<©bÙ²eÌ:üL-`Ä¥xòÀ` Ï¹ øgæD†’?ˆd322d–Ü ´LA)„°›T?ùöíÛ÷îÝ“ÆÀª ÊÚòo¿ý–5¨(Dˆ4³íG™W7m ð>²Ÿk[ág¤Ÿ\°`¼qi„ý’íbID¬í’ˆá¾ HâóÏ?Ÿ/%ÑIE20‡„RJ‚)3yED=09–9‹-byêg}þé§Ÿ¨¨Ò`>¯P†mÑ¢E’Ãø‹ðô·p|q´g‹–ŸOHõ,çÒO6ú(3>dÈæ0âtJA Z”~òË/¿|Œ €MrA]ºt¨^xÙ?ÿüóƼ4sß¾}4XûûûS!þ¥o¼‹}xPÃ7í—_~^0…L}õÕW!!!D<ræÌJáCaЧ»S²d©é³æ_ÌFÝ»=‚xúí>D¾%V M›6ÔÖ±xÂkÑç}|; ÌsAÌ Ù–m³$ƒ¼®Éš5k 2ˆ(…Ä’W»9«q|s=zT&ˆæÌ™ÃH2È "È`ùòå³ÉjòQL|ªçP1W~²q–<˜yF!3­"Ä~’+OÓû%zE‚#%¿®’èbI¤ic»uë–Ï$1/°ÕÈ()<<\RÎtÓ´YÞ'88NtõõõÅþ²HƒóS§NÙÒgè*ÔÕœÃ8,/a_§N€€ÉaDýüPL™2… ƒ½F|&ýª§p87~22þ|á"E)ΞPÊà¡C‡Xü€ÿBå--ý2¸mÛ6ƒ J*Ú’Áƒ†>Ÿá!T´ßO’úùù1©é†: ö“²L ƒÚã5 ;Dw# PIt™$ÒbÐË—/Ï7’è¤À|ãÆãgk. šªWFFÐ7 ‚ q‘†!0·5­.>Hh.§l€3çŸìÞVƒbŸ;wŽB~DF;väÂàÕë6{‡sã'—­É.–nÞ¼9“œ‚Û7o~, €m­ÔYºté%K–È»lB9Ñã<9þÅ϶rA¶Œ¤Õœ{†<9Îù„@BBçÉA~ΓgöGĦàî»qË•xVÿoMœö˜1cø£QÓ ž;æ!‰'§ËhÚØÇ(dku†6mÚP¹ñ³”AÜz)ƒˆIñƒI.ÈV¬”c‚HÊ „Ì”TÄ_¤¬>>i=X/÷q/så'IÈÈF_{{{3¡ÿԢȀy\¨h¿$Ú2~‹$îØ±#?I",:åÉ;–$ÑyEvæ&­_¿ž¾÷A´.˜‘‘a®Ïýõ×Ý»wÍ##HçÎ92š4i’ä0î,N†2Ÿx‚¸˜¡vÝúC¹™Ã¹ñ“m:t£å‡ä§£`Ä,§àð·ß~ëáÀ&¹ xc¼{ñ8"°œ bDFFÊÿæH9‰ß~û œ¿h p›DuëÖ…°ÈÄ "GÐJ)ZtÔ˜ ¸ûnÛìÏÃÑ)ô} ž\þPƒæ5 ¼HaÙ²eu.èwÞÙ»w¯¼ÑP!“y¡måÌùד³ hg”ÄÆÁµ qp®-‡ Ž1 ƒ\[‡\³fM–ÁÀУ~²s÷>¶0 €_Áp ð…^xÜÓãI”˸»^¡Æð„*‰IÄã†W>üðÃ| ‰N*ÒHJJb†¤¥¥åG(—Þ€ÿ‹·ìŸõ—"#s#²ãÊÞxãÕ«W"#.ÉÆ[T\¨Ð?{öé2Í4¶ßO¾ørœ³Œøð38\­Z5]b+Ô¶m[œ¼á¶8pÀ××7==ÝÎãÿüóÏø\[•ô ~×®]ågÄ…õØ`[+uV­ZuûöíVo(XD_Ú#zGÅ#ŒMÄïbÖcÊ!úرcÇE;€§Ã'—÷§Ä ¢°°° *{ö¬··7O¦Ñ·o_CdÄ_¡bà…Á;÷…z‡­ùÉ!#ÆÐÐ ?c€“ž8q¢® ak¥Î’%K"®¹$pûömš§‚_IJJ"¶˜ˆî)M|« •y®\¹ÂÿEŒCäÄ¿&ñ[‚ùó燇‡_²”yr“Ñœ9s¸?¢ßÀ¡'Ï^\¼å(žÅKd¦°àOø#`P Uk£±ÑÃ; LVghÑ¢M8FÈÈÈÀÎwîܹ|ù2¿ ÍÍ5VDdü¨ÙÁÏÏ ÿ‹ãHVã­;wÚ+±\y~êÔ);yˆ'2hY[n™ Âõë×ç•ŶúïumûÉ‘c¦Ð—§–ˆGLòÐ €Û‘IDDÀÍ5¶ræ—Ä›7o‚ÒôG¡r*‰ü¦OŸNÓX=Ž’è¼" 81æÀ7Àaü›+äQª QÁ9áJø¿`Åû0 `»y®žþ(þºýŽåÊž~úiÜqCdy§j¨€€. þºmÇØäsnæ°5?IÀ£G怫ÁeH7kÖÌ£ €ÍsA’rׯ_—uA?ýô“=¢'UަŸ’”£t4Uñë %ÈIƒ¾e|Ĺ «–´Ç(,µÝ*ÂËѾ}û¤çÇpÀyò^½zñšË³æe.=ïâÍD<}6î¤ÇGž<lèСQE„I.ç/isïÞ=.•üã?p›ø]Œ›k 2(Õ+2pÊÃ@TáTe¬Ä2h+IK&‚‡TSd.ƒ2A¯%o%dDÊ`™2ehϦÍ[IvmûÉZïÕ%ä“Ç “cD¸'©èièP?«£ð_Y0 ¤€dKMMµ•«‡äÂB6ƒÃ‡Ç+Mš4‰zžSŒ«Š Ìþ\ÕºY™ "Ñã<9F[•Ã/š@賌Hu¥10·ò€8a©í9&ˆúôéç/釃ü¤¦V­ZÙ ¢*Õ6oß 2¸r³%ž=ú Â)!.“§MÛ¶mÛ1aÆyrâ,ûsAV{d #&†?™3‡v™?y(È üª$„ŽXÇÆ€-µ„,|Xh²Á\%ˆ 2Ç•],ƒ`lßC’N_v)møI«8hP&9[¶lyìa+VÌc; .‰ts]#‰ð®¸ì*‰–’ˆH /âú?F’èŒÀüwÞÁjÌ­Á–’41~ÊY  \¡ URÝš-}–!›=‘Ñ’%Køãƒ 4Û*‹¾sÇžœÒ|¶ôs –¬v‡-üä¬ù+h §MÀ“'O–öœU!l­ÔY¡B…Í›7_~C.È*(AÄ¿ÍA˜0÷0Žc@¼,À¹ [’­æS‰rø!44TÐ%°4—mç&óä?üðƒL&ÓB. çÉ›6ÿøHt2øà²Íªx–{½-½Ä'Œ‘‹: Ž>Œ5jxf„Éê ½{÷†yã;uãÆëÇ ’<œ3—¹ ~{šóP!ï|ñâE–A’~%RRRìyXÈ\6…”ÁO>ùÊ/©È]·¸b'ˆJ”œ9g‰KyhÍO’–-[Vž05ÝLš4Iòã…Çv@ä'I´Œ’ ¬$®\¹¯”*Uêq‘D'i@²ä]FðbÎaZËI ``` é?ø{Fa@p’w>}ú4ÈÃý`©Ï¶Ša :o gàÀ–+”1Ο?Og‹+Æ‘ÑÛ5jùïv5‡-üdËO¾ ‰÷ùlÖ=ñÄxQ¤ä°'¬ ak¥NPâ/oŠS¨ÉÀ7))iëÖ­ˆ5ìQ¹EÇ¡ø²l¿%°j ¬b÷îÝ2OްKr 3CG›:u*'ˆúô’z ”pÍfÏà#ñ8 ÐLT€„4+c„wèxT催¶6nÜ‹=Âb•>žÒÚ öÜV(íüùóñ1¯ØÀ† ¸^ÂNK°qãF[G‹ŒŒ Εu¯˜âüùó2A„ÈÎPþ*D<ùÀkå+®öõ+\°±xÖû  -½d¨0ÇÉãÊ„ |øá‡RaÜ«~¶Vg(Z´(DÞs@EÄÅöÈ œ§¯¯ïòåËmÝbÛ¼ÇÐÒìÛ·Ï„ØÛ¶mË•1ÀÂóJNسg'ˆ,e066–dÐ êÖ£_dÜi—ñ~rË›د_?ÉC<þòŽã"¸—ŠùLqz*‰RáHCCC=V˜W­ZÁ¦åÝÛ:Uçª úœ#‡<ìuèÐ!((Hr®˜˜´Î;EFÓg/r%‡á'{öÍ,†~ÊÓ£šóõë×KË©é]Ylk¥Î2eÊ€ òšc„âŸqa¹^Â|z^¨+}óB3 Úº¡Ü–£„ÊÑl«W¯¶u4¨4ýE{F%²ØßDÛ% yòY³fE DåË—§=ë7lx(ÄpöâÅ$] ïk¶oßÎ'Fæ7>ü0<¤Âdu†®]»ž›ˆsŽ:o²á©´‡Ã)))\y`¸Œ|,W(«üfµõ[w»HNÏ\«ôffÙù´iÓø¬0XP°ÃUªTqq°I.h̘1ÊÑ•¤Jr~¤âŽBËÅDÜSžu ¸~ýú¯¿þúË/¿X5¶| «Yüuþ]<·oßæç !õ ½-m—–ÀÇÇŒºb7 K2O=—Ü‹eÿu}°¢S¡®=ú=•|îš·³×V¬ÝFÂ.O '‰'Nœ&@: {fçvq.(44TÞe^– ?HÄä1Ú ba¡–CÐL¤«ïܹcÕØòdü¨TÒNÄþ 7ÿ{R„1°%ƒl ì@–AY[ŽŸ 2ˆÇ„DPcN¼¼öz…U¾ÛœÍCøÉ·ÞÎÞñãÇðùçŸ{²S {÷îž–Ü%ÀSÀ’h+Vr$Ξ=Û$‘×èÑ£=PQ¤Ñ§O˜åî?˜v@æœËâ&Bš ?3Ü@¹«W¯"ðÚܸqCš@j®±å¥>S©¤$•Ãx (B7ÿ"@†lˆ¤ìç0œ˜\¡láÂ…†ÈûПKØجå¡c ÎæphDã$ù”ºvíJÀ’Ãte°I.¨[·n¸¡À”3”ÖàuÞGÎÂGyr¨Ïò‘IKKã¡–²:÷¯¿þ‚1yž„Ê z¬r7nÄC‘!€?GÁ/´ýÖ­[ü:þ.7NZjû©S§x\ן‚º-2L1cÆ ;D  [\¼DÉa#Ç&e¶NÚÚvÌÔ“öíÛó™€ÔpH@®Ý£rA •á.Jq¨Ø†w ZJƒ Âα°à:È‚*²wœBuÂÙ³g©¹ á¸JÆl„?¤‚s~Xx®6ÜwP߂ْAÏ;±—  O¸}ïÞ=sÊ©kÍD)þN}Ð$`ÿaçñ0âÄ)@ù\¶iÓFòW€øI+<'=îlIÄ]vª$ÒˆL€¡eIÄib%K"bOÄmÛ¶y”$æ&=ŒRý £°¹T)!Ÿr «¡G†"#ÞáĉL-)€lüh‰m«úl¢ó–_à]Ù°›AŸñœRhÎa|:•tÈœ6ƒŠgʲš¨ë7}¡xÎãð„)³¨VAž Ïœ9Sr4pYð¼yó¬N?U³fMœ‰a,3©›5ˆ'ˆV¬XÁÓOAWÍ-W’#>’¢Çñ| (ÇTÄÈh©ræÚÚ¾Åi³UÀŸ“šœ¾•Œü˜–HMM• ¢aƦԓ "<×tµ_z¹ÌÂ徉g®9c{æÙçð',XÀçÚãp/ôað$ØÀ¨Q£\)}¶Vg(Z´èˆ# wÙ¤Û ƒ©ñø“ Ò72¶„ÅêÑ 2éà©)!wlü`Ë –ƒ¥Ý…Æ2yp<» Ë n ç‚ð·ä§6Ì¥iˆ•¬Â òóó“<Äù[æÌ3g0îØ=âø)gðpü”§AM7@ÉC)€x”\Ü‘ï%‘RFR1bpIüñÇi?Ï‘D'æ[¶l‘wǼ9Ú–‚À<Ë®rP*«úl@€3ä@Dú˜Ë§Ì–>[&‹Xç÷íÛw7 œ«· Ù úŒ™cd4qâD2çˆ;‡……Iã!"™Â×£GìU'J”5vª“8ܤiKšxŸÏ!* &8Éá&Mš¸`U“•:¡xVÃ[s`8°èx&¹ « )îe|Ä“PYZK•3À zòûP:&Ý3·Vó`Vpžóä1¥pÑÑÑü½Éþýû9ATëýºþ{òQrÔ†’ŒËhÕª^ìÓ§OˆÀ† ÜÒa²:C»víâââ¬füÌaЖAŒ’–Âb~(« "’A«–ÀÖ$ê9Ê QÑRNq}lÍÕfˆ•r”ÁöíÛã©—L€Œ³ rμp‘¢CGŒu,±™ žIE6.î€p£$ÚÓ©êTI”9ó+‰pž ‰Î+ÒÈí(lUÉæ*0—h+CÎSüÙC9«:/¿àÀÜ2d³úäZ~LK pãÊŠ+6~üxCd„“§KŠ»À"Vîõ Ë}¶:–ÃщéPi\f ïPpÈÃpv°y.·øê\ÈB®N ">bOÿ‹¸ØþùR˜0üë±±±ƒÎŸ?ϯ@6Í)g=þÅ+W®Pž¡={UÀrí [Æàª)pýöÞʪ*Û~ï{ãÙüÝm·mhj7&PL (&PQ‚Š Q‚ R$ɹ¡@ÀR, "Q2ÉAT$Š€ŠŠÏî£ÿ) –˓nÝ*æk0Š{÷Ù÷œ}Ö™{®uv°yrÜz»¾¨u;a“ j¼nËg‰r<Ô &·?]¨P!Ù,~¥AÛ¶mÕ®¼òJœzœð«1$<„ÎÝ6&º¶¨V_Q~PìÞ½Ûþ7¤$° "û\Èr(¶BÏ\Ÿă ‚ñä¥ ê´KHý,/ÓüpÏž=vl9Ô»c¹f¥AôéÕªUû5A4vj9P}´þ®à}÷Ý·ò·°8|øð~ø!§S”ç,%Jʈ”(”8räÈ\§Ä¤þ´7Uå¸ûÖëàÀ— ¹ª¤Œ,3Ï›7/6~†;P„È [!n_D~vð¼'à÷Üs4lñâÅñCÖ‘$[뎌îè‘E+7%ʇ!Pe,“ýiÜ­[7ëÃèa­'ྣ¹¢êI#Ž©ðÌ¥§§ïܹÓÑt >I ‡äsýRò»¨ B:ªFy¿ÚÄ«£åv„TZƒ}(¢’žÂÀýû÷· ¢¥K—ZÐ<9þíСƒ&ˆ^h×yÓGwî9§Éfñè¸õ'Mš$SÀ–ÿ·ß~»:C:uöœÅÞ½{!3ð0ìh[ r7#Ÿã|BÖ/£¿ün ][øÕWd¨$âS¿ ?ùä“hRÝ8\1¼$°y°`?\·nMA6X?”×¥¶Õ«Wë|@øÏŒw—Æï‡ã&ÿ²þzmO´~±þ€NA]º×=4+·(1äº|a(ט‹”d¥Â9H‰’‡Dì»”ç n¿9ŒkÖ¬qß‚qãÆÍš5+$Ê´¬wÞyÇ í¨ò0À]vH‹hH:ž‚xB6Gè t£ºøxuÁ‚Ö‡ÁÐ¥RÛ+¯¼¢ÓÍž©×øƒÍ»ã÷aÔƒ k×®­¿Ò–Àè׬ÛmqJ–,¹ÇMþ•Ÿß ·Ë•.]ÞèÇN2´æ7Þˆ¨uôT±ß]€*³úŠc@x€*Ñk!¹ÅÞ}÷݈Üž?ñá9ú: ¢^½z9֮Džh‚Hó$—]~ÅЬñ;>;³­Ý´[Ø’cÛ‘'Ÿ|r™ÁÂ… í ˆ±cÇîñ:ôï¾û.!½¹{ý œj»víl.ÈAYâ]iÐŽþ ö[F p€çÀ C.6hGžË]ÇTÊ`à„Æ]Ñ&ˆ@ƒxð­nÛ¶Í3AT³Î³Ë×îˆÇ6i)h·—Con]ñÙgŸõ#@Û¡=z4&L%FäŠÍ›7‡§Ä0±RNP" Ÿã”(ë«×ªU+w)1žÌ¤g`>uêT¿ö×é` ×(‹WëÉð+òéâá¹L¢ )wÅåduVOÀ½£]mbƯ'²Tн{w /§Y†`ŽÂ zá…42jß©g<> »úÚ_†õfeeéo :Tò¥Ë~ u.#Ü<}xÿþýÜ1$ÞñP8–Ÿ5jÔ±HuJHÏÎDa{,º'P–þ÷ðáÃv”¬v^àsM†ò~'†ÚBr;¾B˜&#Ø×­[çW!:0è)¤$@ùcáŸ×ñ;7•»u XhÚ´iò»~µ©ÜE¯Qˆ$@á+V„ñC<5=zôÐâ  ê JG‚¨õ‹6ì8›+^}/.ý-n¼ñƈ¨ÀµD›”¸uëÖ`JÔùÂP¢Ñïׇæ(%âÔ§D“3O0%â¿øpÀ€¹K‰‰Š‰þô§?uéÒ<ÜøxÌe˜Ÿ´9î” Ê€HA§¸d{+#.?eùê¾êwnÁWI`éT|Û!wu*¥ßûP+ ð@Ù‡%¢+‚uƒlI9¶;´ ¢gžyæÌ–Ž—]1äÕqÑúá‚Ó튇EëlÒ¤‰õCÇ ˆ`T€vbîÊE‰ÊòDW•´w9˜AwâI D|(H‰xS„¥'!Cj!-à^~*80…J>¼Å“Ýrh9#r³ç C%eP¥'Ï{ê@ërŽÆ!wxÞ†lv’¸3}xÑ¢EºCŸ‰'ZÞ´i“®T‰§C“EeËß÷ÎÂUÑúðKzŠOÚŸÀØ­Ûñ´—_~y†èÕ7õQ‘çÿüÏÿàߊ+ʶÂa  "ÑÊr²‹œ›åÜá‰'éi|¤’Ÿ;XÎ1 \f[è]Æ­×øÈ&ˆ4µî–vÚ¬ƒÛq-¸"ÏøHsAžš”D—a/3b‚äfûY}½ô;²Ý*"I5iñâúíŸoýôË&›Å[ßFÜ*«Ç,ù-ĈÓ÷„FÌ]¹#? >G› uÐ \EsAnbqqrè@wÎÜ Ò! ñ2ê·ÎóÙgŸ¹Dv]h|‹2ö$u@ [î*Û»ó`v‘^GL–ìA•Q%ˆFmýPvÔî@×/}G™‰Óæ†÷ÃÎÝûã(ü›GŒaýÐn‹’ãìÊE‰Â*ïc£Dx²}ѓӔèH:Ë”X¶lY%Úy‚ɡĎÙ(Q¢„Ã[‚_CÜÁ€ÀÜsŽŒC*¢B<p$}}é˜;R踿–=ßZ—sæ–Ÿ#ò¼gÈæÌõÉuð¼'@&ê6ˆ—eï]ÅÎ;Uc7îâ‹/–’O¥7Z²z[xýâ(ø­ÖŒ;%€>|Ûm·yŽˆ#GŽ„ITZò¼îºë.¼ðBY¦õàÁƒÇC¶tßÒ›ã¿öÛàiYBz¸éRÑ®’žþ+Ão´Â€aÏâ0ZË{ï½§ "ÍáC´sKI.»™èeÚ÷¡6„Û‡ß^µ£³a —é <ªO?ý´æÉû÷ïo7Ü\¿~½u« ¢‹/þk¿Á¯mùäˈ6aê\©ÙV‹ ¶oß~±Á믿n¹hÅŠ{¢ºò¨&÷¹õ¤ìWI9jÔ¨àF³@³èJ¶²x…½Ë¸•Áãë„´<â2¥A%p£u›€92ÒcjámÛ¶i‚Σãs{ ð^÷c+:Ðq™ö}¨æòR øaßB^·$žbKƒsçε>ƒsÖ{áùš ªôhÕÅ«·…qŲåîÔ:•ÿºsðÄOì‰èʣɖJH.E:¾;vÄL‰@r(QFã“…;tè딘(=)kf‚`7mÚއѶ2H`n¿¡•ÈHË«÷áçàg¿92²ì€–„çÛ6W/à ‚ù9€çåEÀ–-[4dsð³ûÉuð¼g¯ôâ‹/ê ÊÖ­[ð[ìÞ½[^ü4:b£‹È¨eÛNë¶}чQF Y––/kÕªe}’;Ìà€DeÄ¡V–hn÷„#O B€vÍ5×HÉŠV]´jë¦xÚu7ü²ò•ñe%Üî…¿ET3 ÅŸ=‰ÇYW{CÔ±Å~’µòƒ,Æ«4hï2Õª nDÿ^ø'ˆÀ¢àRw.á|H¹1AdÇ–$ˆpV¿¿¼ø¯}eùùá ÓX´hQ7öîÝÛú!þ?F+)I‰yq¿â¤Ä+¯¼ÒA‰7ÜpCò)1Qz>¼dÉÑä2.4ªÝâàÁƒQ­2!(»+Ú á!Q p x/æ,–߻ѹú`ž÷œVw(CàÞvDFÇŽ“Ú>üðC¡Jß^&{æb?~¼Z-¬õ,Z´Hn4t»õáG}4ÚÀÑJJ7y¢I,X «n"œÁuáöˆ²yœŒ—sseDC~âT£Z„ >¼aÿÚÐ7ùÍ%˜6+Þå Ô·K|Ѐxl5AôÇ?þ±iÓ¦k Mèy5AÔ¨yÛåë?޸밵÷Þß"#‘@øZC­ZµdăììlËEÓ§OÙñ¢âO·ž:vì(ªôôt´ÿ‰˜€>bÚ´i!u€{g̘àØáW_‘¼"®_…Ñî²!rׯ¶hgä‰0n@íŒ$A4eÊë‡xÊ´‹Ù¾}û¯KûÞRjäøé?„ÕHûå½dƒ ´%À·ß~Ûº¢%ÀòåËï‰á%%)ñ\¦Dyi^¿~ýT ÄêI¡SÙh 8zôhÜ|Þr• ;G&ÀëfÏž z ¿ü~âWÛgŸ}íæ Àr¢òa‰Œ‚Û½›FFè‚Á~Ö‡A¡Ú¶p¼Â… KÉǪՂǺéÁ;¾0a‚Öйsg3¶à·ˆypxIéIž«V­Zºt©¼8€ïATÇà{»wï–¡5IqŒÓ÷Y~ʉ0Â@§Í¢ ƒ¹W25´eË\¢³nG™ðއ+EϱÁ6Ož™™i}OfÝJ|b· ¢]ûmøè°Z×Þ™ÙÃeÄðáÃç´iÓF]â’K.ÙÀŸ![ØSOâ 4H$e¥J•:¯`9ä7ÇÐr8gοÚpJvlyðEá)×(ž#£Ž8¦•dfP°c¬»å©Ÿ—/_pzö  ÁmÛ¶iÛ".¾úê«Ïlzr¥Ù‹ÖYW,|Ùø|Ô¨Q,S¦ÌüßÂ`Ïž=ãtÅyRâ¹L‰¨PfŦ%&\Oâæê‹ûÁƒ÷ÝwÑúðáÇuöV°´‹WìܹӯB´fg ‹Â~µA¸FµÚ*~tÒ¤IrløPB64rÄfÜ¿‹-t1—^zÉAë Ê.]ºØÈhÍæ}êÓß^$5ØcuN„õá#Føí <[Ø<Õ«Wk83f̘|С5ž¤'}™Žþ‚¯êTñ-d°õd/áI.H—½;âeý "sˆ"’:z,lÏЀËôë,¸ÝGžç³ÆàÃ?ÔU;Ý”/_þ̦'×ßôÚ¸éî< C·ŽOÚµk§GdĬY³æ [g„ç¿aBÒ\l i+Äþûßÿ–eÙà~ú9Љ0˜2eŠ›ôPRèZ$.DÄ)ýßÿýž ýäÈ‘#:qÒ^¦_g·G­‡ã·ìezâ•W^± "üœu?Цv—8Ýôäžû+M{w…Ì€€«kytßø‘þ\œUü3 Ü8~üxøa‰áWÖ·mÛ¦ "‘QÒ|öÙg­âyÉ!ŒaÉ Rb0%z¦|ý(Qb%»•‰C{ä:%ÂÙR„sTO¢MF%êº`Á‚ø0æ]³(2b!L`†Á¹z÷á—!ǘ#êî…ý^èþhëÖ­CÈ10¸LÏÈÈîPfƒn|FeyÏž=e48Ê–‘ÀðëÃv[œø;ÞzÛÇ?$y&L°Ù!ðØ·13z[ð‰ý0Ìj6pÐQϬY³ ÈäDEÈõÅaô(T¢±ÆVèçrÖaàçö2Ñ’Òw  …àÞZ ¸³aÜ’6O^®\¹·Þzk•M]zé¥(3lØ0ýV–¢*S¦Ììß"±3 ¢êÇÃèIø!Ø&--M³Cp{£Â¾}û6mÚd?ñLLGµÇÊ†Ý –£GÚ»fñ Y¹BB ˜Ã½Á3ö‡‚ùYDZ4(}·êÑ®ãa ÐÏò2= Ñ-êØò /¼ðÅ_\õ[|üñÇâêYYY2CÜ~+8dÈë‡òæ1'ðÛ^-¥(1|ò*•)QúÐøüi?—iï8¦€%d„Å¡C‡BêÉ;ÊOO½zõÒìÌ5‹ßwïÞh+Ú¥{ø!Ú!RM9$A˜U%ýhP63E“ÊmªŸÃL]tÄJžp$ˆlO­4øòË/ãÛ®]»:ðÏþ3þ°®1sèË£`=™[”¸qãÆ€3ÌiJtÇJñP¢¤ŒôXHh8í‘"”ؼyóÔ¡ÄDéÉÆûéIY½zõêR²I“&ñDè[¶l±J#tpi´Ú[Þ"i ¢Ý![H¹ëŽ÷á ˆ³Üy˜  '¦L™¢â<a}üpâÄ lÐm)€­£@N ¶ƒÒõªñ·c£ÏŽ;ú‘§ì€S»vmÍáÁŒøtGº9¿Þ#Ψr×êÃ/ d@¸ƒÜ,ðFËí` ¿ÚÀíÑîåm‚¶#A4|øpp¸ýDf@ eÿÐ ¥§§;ö›?¾Ÿž„Nœ8Q³C²ƒpœ~Ï‘9†ÑÒ ?À±c˃ûˆ ñ;½]»v}üñÇQžMø›_…`¤h/3ª‘›—.]Ú¯_?û‰ „¨õCˆ ñÏ"ÀൃRJ>0N%âGqu@Î)J”5_ýõԡĘαiÕ_¶„~ê)?=)nœ‘‘¡Ã)>„ïž\ƒÔÌL´ËO¡0‚Ü€-ZžGDìWÛ×_ÀPŸ‹ž={jd©þ´;aÂÈNû‰ FÀn}X¢øœì9ŠRW°£ßÈsýúõ8CÍÉ­ßÅmÛ¶IÙsFa˜<¹­ Ý®Žà¸ :hùéÝ»wûžÈÝÜ.«Ä ;ð«-Zn‡—‹NO;eó䲩'ð•Ì€xÛ:ÊnŸÀŽý”ý®7Nž+)%øòÔ“À’%KŠ/®Ù!yϳâùE#΃_Œ¿.o™ÃÐ î² • ö÷\òI Kv;vTlª.\±qz–ëÕ«'©fOÈ2é;w¶®8xðàœ&@ 1›ë”ˆgAUFÅ6™?%ÂßÎ5J¼êª«RŠãŒ-±xøá‡ô$|x̘12$Z_âña\Zxtû°„ –œeP%z÷´b¿Å+pgýNT^î*?ûÕoŒê2%dÃ]ˆØŒ¨Yw(Ã}éÓ§Ÿã …‚píÖŸxâ‰ì—fw¤†dƒ€òß“¡¼’’˜"fÈΞ2´& é¹óä¸ãZÜ ²\ÆKø ø$ 衇t8eüzüÉ"Oˆ qþš!ÌÁ{2ÆXWÑw£p-7ÏÛµ4õ8ø'’çC†lÛ§¡ÃªT©‚GÆúðÃ?ŒÏ›6m F/ û mÞ¼9G+Ü£§@€nþÄÓíGžx¨á–5jÔЕQA²ƒC<ÀM”d5n40†‘VõÍ7ß(é¡N0Î\Yÿµ¿«.g…®H À$Ià¾éY–“ÕQp6û>Hž ýöã?Ö‰“6>RI i(üW¿ÉK:Çezâ³Ï>“½h%O޾[¼.áçÔ©SñŒèÚe1rbDø…|!! ’rÔ¨Qz®Í©Ù!s´v @Ë£¹âÌ™kmà7e0öÁƒõ¿«V­’5+wÙ! ìåìܹSiPt ¼>©ÛJÂWíµØ9Œò>Ô^¦j G‚H%~îj+Ô¡ì2¨2¸%áiž4(بQ£%K– äGñ%‡ˆƒçS„q‹5—²uëÖ¢DüÜ›·(ÑN(ñ%âÔ¤Äx0þ|‡¤„x~ï½÷üô¤¸qÛ¶mU9r$bÛF*±É¢h;Pu þýø4l`n×½¸DFö‰Ð…U•çUøÉëË~v ƒç52²!Ú­a}Xùup·uôèQ„غÚj‹-TOÊà#Fh`téÒ%§ŒH·™ºˆÂ<7jvèúë¯OHW æðã%Ü "é!Õ þ¸Fˆö`— –Ûý$AÀ´Yǃ©d.]¶Jô¹ž.çw™ž@(ªyrˆ´Ñ£GË^´•+WVWÇ4{öl;bèС9çxaî&Ó!)á`ƒГðC¤f‡222NFJÑ t ¼J,VøyÞåa 4?ô‹’Оª ‚Î]‹ÁÙ4A'´=;9@ÄFƒÐˆå…A³êÏèÍí¾`×^{ížœ'L†'E(¬¥9sܯÄR"N;oQ¢#JòŒ•¢¢ÄÇ{ÌA‰øÃR‡ãœî횎; 'áÃ#GŽ”á”8¢4Lä&Y¤±F´³ Ð/0 ky‹äÉó¼à ÉÏTžÇe" ÙÜsÌÃ$‹P¿;W^yåÀelC‘"E40G%xvnºé¦œ¬³¼=[fæÌ™Žp¦X±b ÿòÐz… –(¯oß¾ažë0 "•ô~ã%¢JIbÄ3ãs|œ Ãíö2ƒsA³nƒ[񾃴ÇÉÿçìF«3fÌpìž+ùŽç–”•*UrHJh’= à+ݧý>ôID©“|DÀ 2H,!…<0L.( ªŒŒ˜ Šx™~ "ݬPü¨o‚ÀçpEY O_·å¨ž ™sN)JLlÎ !Ú¸qc)/Év‘ëqúðñãÇ—-[O²ÈºŠ˜9Ú]‡ˆ†Š­v ¸]Fêâz-?‡ ÙO„'† ¦‘Zä0{ölñáæÍ›çÜ®Q-ÎïÎL:5€<7ŸFff¦&ɳ³³Ãô/a ™øÀŒÂ0¤§@›ƒ=¬¾"8xð ‚¿3„FËíð«øUí4¿ËTbGôhiii½AÔPéJžýë_“0"ª÷Œ3mŸyæ™`= ?|ÿý÷+T¨ å+Uª„hQrq)HƒèÅäµrHÖ­”-ä[´ïCeMx?õ¢ïPbÊ¥Øq_Þ{ï=øá¬Y³ÄŸþùäÌ€ˆá=cªQ"ÜFǙǖ3Ïs”ÃÒIù’ã‘”ŽqDðL¸P°žÐíêžÑ’lhØ’EQ`p²hÕªU áS¾2:,çw’Ñò<ü ŽêW™bÒ^¦M8´.øüœ‘‘ѲeK0¿Ð©øpÙ²e“3ØoJŽÅ®]»á |/+++˜<·lÙA®1€‹uèÿØ€&E* ¢¨HÏ/s¢Â xõN£;uÐ»Ž—ÓáÊd4ÙõÞp‰¨ò`èSPÞÓåô9 }÷ÝwÂ(y¾òÊ+I›yâaqHÊ|Š1@On9=zèŠj …Duå‰Í™£6yQ&V‚wIaÐf€ç„* g?>À±£;*Kvx:¶MrâwçÎ W´zòî»ïN&F›dN5JLxÎ<õ)ò•”ÜCÓöíÛëIÜhN³'ÉvyY¿ëö Imß¾=äòSvc€žŒŠç…Ÿ.\èWx;ªPB6÷éÉs}vpÕêâ'qT҇ѓÎènŠ^x!˜<´êK/½ô»ßýN†Há^wý7¾þúkÝÚ8"éùeN´64‚Äø~ñ‘ä‚tÖbg{2ðdû_´ƒôõÁÜ®“Ñd¿+…^’Ë\°`AðeêZšxm ÖåÐþŸ|ò zpôò”µ×’3"fòDPìðâE‹â‚õ$üÚææ›o–CZ·n*/ÂâÚSsæè:c A­Ê.6è+ ±ˆ¯â’eR2‰Xÿ ò‘¾¢¯ô£A””=,d%4¿ËDm¸À0y0ü~N®o+±£pæÐ-"&z2ÉÃ<ˆ¤D8êÀˆ\‘J´µ)%Ï!Âã†ñ»¤Äø;èšT¯^R'@OŠ£Ie(Ñ\€[&s¥ã÷apBüÉ"­í‹/¾Ð95ºì€vñ ¸A€+Ï \Nß@!û])¾ æyÚDC6ÙGa‡3ábçÍ›g}Xôd=’68¤žô gzè!<ÚÁä¹mÛ6\šroFF†ffâ8G§óƒô¢} ŠBIäcóäº* >wxˆönaÀívu<¶¶B ™û\àd´¼'·[I§²^‡¦ÖŸ¿÷Þ{PVžäi§€åô ˆxÈÓ=ÓöüóÏíµ×‚õ¤¸b«V­t¾MTWžXT(±’]kB?G0eï²#J IƒVøÁ ÀHö¢Äsì£*—)åýb%»dÇŽ;Ž­Ï~_uëÉä`lójS“µÅmŠáÕ!n§L%j¬7¶[³É<,Üúð”æJô‹•Î)JŒGRº‡¦+V M¬'P“¾Gd» ãIx²(ÚÁŽÓP„káѳ!áäÉ“ý\N‡û:DJú½P—ÓU%üŒ:­êÆeÊ$J¿œ¼Ú/d³KxÉ:çB§n=™äÀ!õ¤ø^ZZš;;´páÂ`òP Aƒv¾m¢ºr‘úBnph§Ènм(ñ˹IÌ/>RÒ³‹¨Cp:\Î1{ÂÁíè•Ã5†:í«.\¾g.ÿEÔ‰;‡÷$ω'ÚÍâszDœäé^øBúåˆz·È ™oëfŒÜÊ™;hÐ&ˆp-*üܹ Û?úÅJn´¹ G`î˜=@ƒpf½L•òZ\«uqž{÷î]x~z²zõêI&À˜×iIYJÄ •drbsæñS"b%%ÚÝsÜQRHJÄ¿ç8%Æ÷Šý… -ëIøðöíÛ{õê%ÉvÙœ1Q‰J2„Ùº+b²H ¤ WÑÀÜÝ »‡5:. å<&0ù"À˜;B6‡ÖÅ=RöÔ“I^O ÜKû^tÑE¸ð`òÜ~pQM’KWŽ{‡öù1nœ®"€,Ö±?ú…+ëÉË.»,ÉxäÈ‘xºã”¥DÜÜxræÖyâ¤D‡ó(%¢•”ñàÄ@‰–ùÏqJŒ¸Þ?ÿùÏŽeÙúôéQOÊ€½[n¹E‡g·;hÈs²È ê@~Ž^ܼü” –çÅåàÒpìüìæy½L4¬Í½ËšBާ ç oqø°[O6,É€Ã/¿¦p/šßëСCDò„o }4Á.Ë8ø!€ât×N¿ñQé@Ô†~3 ˹=Ù:Œr;/*IàÇí^IjOЧË:t=8¢ˆäyß}÷éݬ\¹rrÈ3Îýj=_Ö/^W¬'wœšNºrÉmJ“(Ä]N B¢ÓTbqôQÅJJƒð ‡$³¸ÊØ&ÒiAºÍЧcã 9ñ‹‹/Ö“¸)önâV&Á£ ?ó%j ÍàÊDQ¢»•”‘CøÅF‰¸LRbœ€‹:f™uêÔ‰¨'qû ã›5k¦[egg»owŠ$‹@€¸Ñî^8¤;Dê‘4‘#0ÃÏnž×¹îÀÜj]|ŽÁíÃn=ùÔSO%ypl9v4£{8:|/"yî<‘#G^sÍ5vè…ã¦ÇÍœÈÚÎQ]×îÝ»íMt †u*d‹O%=+ ¢ZÏÊÍí8ø´¥'±Ë2ªèAB’§1`À€$xnS½¬)\¸0-¢ž„®[·Î–I”W–~5þùçÑÆJ²Ä® Ib“~9s´¶§cã\ˆúaD=Y¿~}½—_~yrÐ1–/6¤2%Ú\ Î$ÚªÍN‰² )1±”Ϥï{ï½×áÃødÅŠõ$€ÔDe¥J•dG¢Þûh²ŒŠûÂ%À™~5#JŠÖ‡<U®>Xî>|ÎiC6^¡ryäéÃn=™Ì]!⌉Ü—¥K—^¹reDòüè£P¦yóæ2ôB戉øGÛžJtW²©S§†YžWG=zÔ¯N| Ú Ùû@à¾ãŽûÕ†zTü‰–<~ü¸»*ër P4;õ‡$Ïž={Ú›˜„Q-"æecã’óÎ;¯oß¾õäG§1eÊKƒGŽÉ”?ÄýÒœ9ˆ4¼M€ç€N£Š•>ûì3Ñ~ŽÏ£}ŠGÍè® Wg¹·—lý0¢ž´X¯^½ä`¢‘NqJÔI4!sæp]ð)1/RbÒÑ¿¸û~µÉÄœÜI aìævëràOùäùÝ`=éžK1ds°½ Ìe±}4)è4*=Ù¶mÛäŽs,:íð=t :u CžŸºïK.¹DG²é»ž„øIWáé9‚_x¦º<Ó(#ùœ­Ž÷Æ…H@åŽÙ>S!¹Ý®B ‹Wk 6„ËDm«N#*òDi‡~µk×.9Ž÷ã?&áeÍÍ7ß FOâή^½úPDëÉ8ØDÑ M9hP‰E¼ÔÞeé¢åu\­$À½vÐ).ÊzuH¹«t u„C}ºæÉUÈ®%ð=W¡.*Â@¿Bûû½µ« fùä¹´7;ñϨêe P¥J<•aô$šß6nÜXi &JU‚5gîI,ŽþÑ=ÇÐ:º þE0«‹ôZáç–~ÂÀ‘ ²ëBã¬$°ŽýÍ7ß@ÿ@Tˆž„ã 6ìwÞ‰¨'ûõëwùå—»]19/»÷îÝí‚NùŒ5—"9FÉøù ?Rb¥Ä˜á¹Â*ˆ±sçÎa|XÜÍ^¾|y9÷%±‘œASC…ŸÛ‡­´ˆ^$9ø9 0·>lŸËóò"À†lðjϧ •ÀùáàSñaBx^"#Ï͘+Âi›6m*£Ê;vìàÃ={ö¼âŠ+Ü>|ã7&'Á|ÿý÷ ÷=ôDî=W_}5º¤äùÙgŸ |ðA9V¦‰¡…Bÿ/iøŠ0.çv®Îl? # ¬0°'&[ÚÁsàrú¹u¹“'OnÙ²¿¨ä‰.æü£vU~ÁøÀ¯½öZ·Ë!~yíµ×ö$ 91bÍs8ezzºûbñx†Ô“ŸÆ€”ï¼óN4©Ûâ½ËáÝÆ×z8.yõêÕÐH¶þð/ „TõÀƒ‚œ! ОgˆFØ¿ÿ¦M›”zkF’r̘1žzrÆŒèèíÔ»Àžý¤¹brF¬å J´~HJÌ—”<—Ã’d{H= †0kÒ¤‰JSü-‘‘½Ý¹Ø­;ä&;@ÅÆÏŽ'þ i:wîÜcÇŽyž¡ °:E×S¨P!i+Äæ O†Š.]º´g`žœý òê$‡^ô¸×Í€µoß>$yÊ"F¸çž{t¢$Ù ÎÞô„`æÌ™ø¹ðøÃ? õ« ñÑ£G£j1ø•ƒÏ=]ÿEsá©Ä¯‹ã :Tç5ßzë­ðXÏÁBèèÝsUÄåÚµk—œd¸äŸ4Dƒ8ö}n¹åÄt!õ$NßâÁÔ‚ky—(T ØvÑiœ-:#¿ qѾÏõóCG.†W„ÂÍt°úqôøÄsü$¢lÏ\ÐwÜñî»ï&Ó?ÿüó¤ù!)‘”˜"”O²Ý½vаaC4~=)‹{Q£F ŒdºY##Ä[T«­â5kÖøÕ†8=ÚÅppQß~û­gmŽÀb tª>hÐ Ïñ“xHÓÒÒ<ózõê%-µžœÕ <“äwß}7Ú$$yî=É“'—,YRÂ’eÙK¡2úbÖ¬YIOV!@°Œ[  ¢ÚŽ‹‚¯¸þ8tèÐÖ­[µGç«|ˆ(¦ÿþžƒÏ,XðÌ3ÏxºÜO<‘Ì\Pn £êÆvþùç÷îÝ;¤ž?DË·jÕJ]:==]³%Êq2òZ$Ì*|ðU™#ãöÅ„Ó) d¨¤§cÛ\Šá<­+vèÐᢋ.’f©^½:<Ós>ΰaÃt( Å%—\’Ì\FÓ‰:%:æ}“I‰©9r2 ÙîØ J’íˆtBêIñáE‹=ôÐCr¸LÕ‘È(ªR&æ¸g¸ÊûÕ†Jð-|,¤p’¡’ð|·;ómÛ¶ÉBLða¸h:u´“‚€÷›ƒ¯.¼ðBÏÀl+±râĉ;vì€g y‚}âßæÍ›ãÏÉŒ={öôt9tFøÝ=IG..ØëÞF¨V­Úºuë"êI t7h| ®e¿ZQ•?'øuëc~ÂϺëÉ“'ýj“…iΆv’èmm ¸.;ü(®8jԨ뮻NZ£X±b'Nôœß=cÆ wvNt-[¶Lr.Hz´ÜÚ(™”+‘S~ÉöŒŒŒ0zÒm®cÔ ,¨‘QB|øÔ©SaP]Î EðDèb`¶€ñ®xXæÍ›'%…õaÛ¹s§Ð©èÉ_|RZ£víÚ‹/öœß=bĈ¿ýío¹>HC圴}BÁÛî%\€Zµj­_¿Þ<ý€S³!•™b2ñ6~€¾dõ7é!ˆ@¨._á´e+<_Óq2^Â/>‚/-\¸PçBÂW={püš^§äÙ£GÍ!¾C'b'3*yâ<ÝK=H.(i“Ü“¿rwA ÏÕ.»ì2tåzÒx¨+W®¬Áµl‘(U)›jÉàmG‚HrAò|ճÕ7Gú!Xtîܹ4ˆë7nœŒúöíëùþO½ŸžôØ1côÍ…Î|L”ª„#é ´½0¤š#0owœî=“E60wð³õaTˆz@§âàSHD].²T©R“&M²ó»•NÛÊçî 5”sKdD•$GT>|øp7y· S§Nv¦˜ÜÖD掑#dYÎnèHrýþ /•c5>Ò×C²VÛÁƒýrA¸SèߥÇUÃÇn¾ùf¹êâÅ‹CØÉŒJžˆ¡ªT©â™ B/–+.8p i!Lð$÷ò’¨DÓ90"ÐÔ:EB³%JUºD6„“ôË"êÛÀˆ4¨oÌáð+ ¬c÷Ýw’ÂW„×5mÚTº’óÎ;¯qãÆp<;¿[ °OŸ>n/Ss%$HÈnݤĘ)Q7µwP¢DI¤Ä<¸™;ÙŽVmÓ¦[OFøSþÕ™‰R•p*MBâ´­ðƒ{|õÕW>쎌6mÚ¤ üêŠå60·ülsüqäÈñaÑ“´* .  ÏɧëYá^ØîÀÜú°¥ôï¿ÿ^WX7ožäêeYuËÏ–œÑ/X[6lØPsùƒcíünÕ“è˜t¢w* ÒÐQC§NÊõ$¹{D:³mÛ¶ŸF°.œY)4±î'yr·ð p¹€®\Dº´©§Ë!~—Ð[ïjݺµº\ýúõßÿ};™QÉÁ,úçÀµ×^›´}ý¼.—VC„螤#.„›ƒ+âÎêÛ4xx“&Md¶NBT¥Ð Cø9<'xÆ„' Êv`žŽ-kí0qÝrË-úN ºÔÎïV´‹þ9€6Iò”C IRó½!)Qö°#%æQÌœ9Ólž}öYÜ‘h}xûöí;vTUY¤HÜJ¦§Ëžžðá¨ó€d‘(ÉàÀ\¶%µtÚ«W/ Ìú!0·ó»•N'L˜àÞ°)wiäèj“±uåž 5hD-Ðøp?½;òæ1QîçpÅhßPخދ±¹_.H%¦páÂrQ÷ÝwßÂ… ídF%ÏwÞyÇS%yù)?æL©MiÝ]¹›ÑI5jÔhÛ¶m1¸"Xw—72žÍѓƨÖrÓà‘#GÀi¹ ë‡Ë–-«Y³¦æ‚ºté¢óqz²}ûö:žÜ±.tò§æÊ DRbT”À‘Ð)“ó:üÖû…¾ñÆŸÄ𳎫QgddÈSœ Ý"Ú;âàóÝ»wþùçžáþÞ·oŸõa;Hà¿v~·êÉ%K–T¯^ÝoFîænwJ¹¢f¿ˆF¥G ‡ûéFp¿%ÈÎÎŽj*øÄ]NÉæ‚àr[ ¦M›¦+”^}õÕˆ}ô+KžèèÑ\)²üTeN¿wŽ×\sͨQ£bóCPAZZšVGצ#Ìÿ• (žcèÀwß}‡òžUY=€b¢x[µj¥ñ©§žZµj•ÛA€¯½öZÑ¢E=sAxÒ÷ä6RYL’I‰ùh÷ˆJÂêˆÍ‡ÁÃ8\«‚j•½uH§ãƃ[†¿L8<$ŸgUêÃøÏšõaô Ú×@f÷èÑÃú°Õ“mÚ´ñ Ìsw†âÛo¿Í[ÍðáÃwÅŠñãÇßÿýÖý@# q¿/¿üRFÍ›7/â¨~Ý©sçÎ~=¸® ­@§_·n]]~ª]»v[\p/ú—ëËOyŽÔÍ­%Yb›á9s¤Zµj¸#±ù!4hAsDEŠÉÊÊ’5ÖâïÍeZb„æ”E3&L˜Ѓ˺ÐÖÍì”òeËB{ºâœ9sÖ…Þ“À#–WfÑ’I‰ù`De×®]ÝS¿qïÀ‡1ûðܹsÁÆZ-„™,•U)ƒ*§OŸ|uÇ—Ù‹/ÌU%ëÖ­kÙ²¥c†ÛáÃÆ ÓÕøS00ß“òkïûE4wß}÷Ê•+?Š‹-òs¿xzsø‰,-%Sb=D¶Ìš5k~øáO—Ã}Ëm2°ËOÕ©S‘È&/ w(^¼xê,?åÉœyn€ºrÏ­–íÊ籇_sÍ5vÂNBrDè”…e¤_.HË8pÀSIÂ'eÛDÅÛo¿]¦L•ÁP2ž~øÁ4nÜØÝq$ÛÄ`1™o’<¤DRb^ߎ[n¹%;;;f†ÿ7oÞ\]B†Ç¤Ã!uT9BuÏ2nD –K[:µC%ÁÌÖ9 ¤ƒ4*T¨€ÜÓ‡ñ¹®À–jƒ44»í8«ÜŠh<³‚Û4kÖ ÓÎXþA 6GÍ %ÄcÃÁƒ%ÐFg '·Cƒt$øE±´ùÏþSö·Uب¤T©R“'OÞèDÙ+VôS‘[ËOy.H•w§.nÞ¼ÙsäÕm·Ý†{½3À+ ìÐJðªöæ±A·6³4É:cÆ qÑmÛ¶Ù£l²rË:˜cw†-Z ~OWìÓ§g.¨dÉ’IÞ61'NœÈ»IÏy:¤DRb‚ߎZµjÁcöa¨¯—_~YÂOÈÂ8}øë¯¿Ö•Xà´V%j`>}úôÇ[v Ò°Î §ÕmáÌpiO릧§{æ©0HC¢¼5TçH6P_ûöíwÄܲ^½zéË;ÒfãšØ€nZ| 7ºo]~ :ïÙƒK.èCƒÙ³gÛ=Âø¡V¯^ýÜsÏ¥ÚòSn:t(0gff¦{A!àþûïáÄãŠ8JR©C˜P‡Åæ‡è£5ù]¡ñ‰'žX°`§+Ž3Æ3” SS)‘”xNÁo8°aÆWãqcŽ Ò¯¿þzP·¾ý‰ pT¸+œvâĉrû¦M›˜ËPIëœK—.­]»¶}Ñÿ¡ºvíê7H#uó¼›]§yŽdC0bÙpƒjÖ¬©Ùr„ÿpu¸t̽9:kÍÛµR=sAÇ_o°dÉ:.{„­Zµj½pá)¸ü”'sæõzm~ÂÏsÝ|Žˆ2þÞ\—ß&ÌÊÊ÷ÆÜ›+ êúù·=ãèþóŸ2¼SŸÖÙ4ÅŠ{óÍ7=ýpþüù~SseÛļ;ȇ”HJ<§à7„އÈ|#|nÖ¬™¦+´´4aÌ>üóÏ?ëû:Ã/0ÕlÚ´É:ç /¼`·M„W{ú0sm*ÒÐìzžª^Õs?2évq¶Ç‡ 6 0ÀÆ5EŠéÛ·¯¾ô‰ÇŽ-ƒEO:¥ZÚüá‡d¼™¢K—.•<øàƒsçÎýÀ ËOáö¤¾üòËüÇœPPž££¡ 4h°fÍš8]qöìÙ¨G_> Μ936?¶lÙ2cÆŒýû÷Ûm.èÀÖÁàx÷Üsn›Ø³gOO?\¹r%ÛoÊaêä‚$”΃|H‰¤Äs ~ót$ߎøz{Ü@\üðÃëO ³o¢Å÷ß¿|ùòyóæ}ûí·ž> Ù‰µÎ9dÈ]ò^ _õôaø¶n¬–âù_|‘?²ëp¿Ñm·Ý6mÚ´mqcÁ‚M›6Õ±²2Fq 80æ]`ÇáBÖŒ5J£üÿ®õ‚ߺÐ)²ü”c˜n>x·üúûÒK/õ ®[µj…H6~WDWhßl‚ 322bfBOö;qâ„u°+V@Êj.ãOWô[úÆoÌÝu¡ó1û‘I‰ùGŽ ˆŒ Çâ÷áÕ«WwîÜÙŽå(Q¢¤&0Qt*ƒ4¬s¾ýöÛåË—×Aýû÷÷ôap,ž¯Ô¤!øúë¯óîþò~yrÏib:?qk"ðꫯ¢6k (––6vìØÃ‡ÇìrøãóÏ?_m0{öl]ì‘x§NVûÀo0xl*,?eÇê\Xã›o¾Apí9¨Ò±’Xúè#ë`ð¢›nºIêüûßÿ>lØ0O?„êž8);åða?R")1_bíÚµ~‘Q… <¼ëÖ­ëׯ_Ù²e¹PÄé2%<¼ÿðÃ~ø¡uÎŽ;^xá…R'"#ÄGž>·»¤àòS¤ÚŽKÉ ®ÓÒÒ)W^yåÀWxaîܹ Ï1uêÔIA—Û¿?®ý§AÜ¿àò¯{÷èŠS¦Liܸ1ôªý!x‡>úÈÁ~è×V¯^­¶hÑ¢FéëBð\ÎÓ‡ú·¿ýÍsÊa æ‚Î5ö‹á9¤DRbêGFž32eÊŒ5jsB1xðà5jØ…zqº Ì?ÿüsëœÐºÛâŒ>xþùçóÊ ô›Ÿ–ňj0n¢çL1I•9rS¢1|øpP™Í`rq¹ƒ.3x÷Ýwá®RÕ¼yóe>èÒ¥‹g.(¥–Ÿrôà|¡c³ù× «-Zøíè3æÌ™Ó±cGÇN  bÙ) êbýúõÖÁú÷ïŽ[ŠÝ~ûíãÇ÷ôÃ3fÜwß}~Û&¦Ô”CíÁó÷VȤDRâ¹ù-ü+¯~àZ ÷áììlwœž––&§tüøñ÷ß_=sáÂ…ºä)þ…óÃ!=}¢¬›úƒ4dœÆ9û–G³y.”*(^¼ø Aƒ6æÐóB'¨~ûí·ˆÙ—€*5*yâ‰'fÏž½Ô `ão¼1õ—ŸR8p€ãÌ=Rò ®Ï?ÿ|ÐÎ{ï½—p?\»vmŸ>}{ì1ɽüòË»ví²6nÜ8HÍõë×ÏÓ,X ‹þ¥ì¶‰€çÏñ´$)‘”˜_##¿™òê§C‡~›vÅ(CÔ¬ûÌ®X±¹uÎ=zè »ï¾{òäÉž>ŒÏíº[©?Hù¹6ø<ûöíkݺµ_`Ž^ι!g ?±ØÔW\¡•¾þú닽0mÚ4Ï:Spù)Í„shPUé—«„ZƒðC7š~بQ#üD«V­ÔÁfÍš…^[sA 6œ7ož§+vêÔÉ3”‚SuE s<ŽŽ“Ñ#ƒ׬YCJ$%¦¸ªô,¯~@zË–-Ë –GŽ©Î §Õ½'àÌpiOǦ¥¥å­ÀüرcL­{æp?Ï­BÅýÚ´iƒØáÄB*_tS§N_ºôÒK»uë¶È sçÎmР瘊\~J3áv'S"óçÏ÷W à«1cÆ$ÖŸ{î9ÔŒnWÝLw±SÁ-=]ñµ×^³ô¤ì¶‰v÷¹9¼'ž9€›7oNJ$%¦øð¬¬,¿W?p­Úµk#HO¬‹ž„†Tÿ”ˆ.Ú´iÓE>°½óÄ C‡1µ‘B333ý‚šóÏ?ý,áõ ‚T»ð,($à? ½z÷\ûÆoLÍ\ÐþýûóßV#ÉÁÚµkýX“E›_~ùe¿½ä¢…êIõ´›o¾ŸtèÐÁÓ§L™òè£úM9LÁ\ Qc[LJ$%æuŒ;ÖïÕðÐC!N”‹žD¸-.:aÂü÷/ùËŒ3<}xÈ!7Üpƒg`žšƒ4˜3µ…LK`o.µ-8‹à¿èʸ0jÔ¨Ò¥Kç•å§öœÞ²ó»ï¾ãµ8±k×®€ñl‰êÍUOª¿‰ž„Cº]±qãÆž¹ |0§Š’ÌӻǦNì·^%P´hÑŒŒ ¿†I‰¤ÄÔõS¨P¡æÍ›£LBôdVV–8êøñã%Áîöáììì¼²m¢*É'Nðwl˜9sf@PsÞyçU®\yôèÑëb…Ô3ï,úõë'ä9Ïà­·ÞòÌS¥ìòS M¾UL,dô ø¹"bŸöíÛ/^¼86?lذ!*iÑ¢…zèI8¤uEtÓ:’-Å·MT%™7OÌ-JôÜðˆ”HJ̯~€{î¹§W¯^1û°ìÿê«¯Š»"=i}xÖ¬YéééyhÆþýûerúOœØžLpÕUW¡»Ÿ;wîQBŸ{BžÅ‹×O5jô‡?ü!­ ÍW99‡àñlÒ›?úè£C† ‰ÖUOªãÁ EOÊ_ýu ºóĔý{÷;vŒo·s”ƒ{dPb³fÍH‰¤Ä<úêGF?óÌ3 ¢õaÕ“â±cÆŒ=©> Îô¤‘‚9¢!(IæÕî~~zsyå—™™¹64ä¨wÏ¢OŸ>Bžò÷5×\“W–Ÿ:|ø0—òKd0F@ŽH^Ü4mÚtΜ9!ý°Aƒ8êùçŸWW= 'œ2eJ5<§¦æ¶‰'Nœ ’L&%ú ­$%’óÄ«Ÿ¾}ûŒm“ámP€+V¬éâ'‡.>‹Þ½{˲«žjAÖ…Nµø±cǸúJnõæ­[·îÍË—/ߣGåË—û¡êIuEÑ“UªTùË_þâ9å0ÕrAè@} ¢sàº`J¼è¢‹H‰D*cþüù~{àê²iÕªUƒJŒèê'Ňßxã QŒ?þ¸gÍ©6HQùÑ£G¹[S26ÏÈÈîͯºêªZµj7nµ¤Ø¬³èÚµ+þûÿþßÿKñå§öîÝ côWzóóÎ;²S§N .ôôÃúõ닞TWôL¥àºÐøöÛo™$%’‰øñÍ7ßdeeÌ;“à¨jÕªƒ òóá’%K¢Ø°aÃćGމÿþ÷ÿwêÒøòË/¿ÿþ{Få¹Û›Ç5’±„ÂÁVýòíÌÓhÛ¶­çèÜ”Z~ŠY TîÍÑù¿¸wzñÅ5[?=Ù¼ysøáرcývgHm™ÊÓ©R"‘âX»vmzzzÀHÉX>òÈ#}ûö]ºt©õaÑ“¯¼ò |ØocJ Ò8tèÐwß}Ǩ(WiÀ‡QCæ'ÌÈÈãI[~êСCè²Ožùä‹råÚãÃg;½Õ|Ä{¿3)ókв`Á‚z·>P£cö&F£Ñh4Z«Ûf"tcÍšýþù_V_eg¯Àçåîë”ñ憞y1¢œ9s¦MN6î?¥ëÔÍ4F£Ñh´ˆÖeòÆò÷uòÛyüé§ý’¢l?¹Ó›ë üá×eß¾}󙞼÷Þ{õê®(zs¯é[i4ZîÚËo®m6 ;*kýÊìðõË!ø6uð]x°N ˜ÞŽˆþvhIÇ'îãqÞh- Ö¸Û (FèFO•µ|ùv|[á¡®(Y¦òSª¸Š)’Ï– ²3qžlѳßÌm4-w­bÝ–Ñî¼P䆒žU5ê9ÚñI‹L‘Cð+çr#w³¤Göª4êˆVº¸Ð•/ŽxWZ ”×bKê-°Åð·û>jÉÜ€7šFKŽ=^{0ãœ9ëý´Ö#tCŒ×–·þŽ}`wíÚ•oôä²eËì¥õÊ^;hö–»öÈÓ­¢Õ“Wßx«£’Œ¬9Åïºßýù ƒ§É!ø•s¹…/.|š"  Z­tǃÕñ7 K£R½q'{GJêý½·Zº~(?á¸_z³bpÞh- ÖwÚ¦»Ê¾¹xòä)?­Õ£Ç¨ßîM”¿ìšëóå+ïÖ­[ëuý½øm¯ÌÙI£ÑrÝ*?sFo\Røªkn¼5ŒÝõÐŽJ.9­Oð•ãóvCÎÈ üÊ9Þ¼hŠ€bÒ€-úŽÃßhÞˆvó]Xiw_õz~%qS¤ŒTp¿ôf…ôë¼Ñ4Z¬uïYЊM›¾ µÖ¬Ù…2׈ò÷Vyæ×cî½7ßèÉ%JèuU©÷«ó?¢Ñh¹n?{&лö¦[c®ä¯—]åYCÆ+oIåø•s¼yÑ~eZ÷‡hCùoz»þrH‰27x™ŠOøµ¼£¤V®÷Öíyž7+6O:3ßÞÀgŠFË!«×j,´âøñK´ÖÏ?ÿ eÊ”} å¿<Ìžß|óMþC*ǯœãÍ‹¦ð+S±F}ÛzÿÈ~_E gùN:¼4 dÙ¥$Žr—Ôöss£*L£Ñ’oÕè­¸fM„‘2˻߸ÕCg¬·ÒkíÚµù@OnÞ¼Ù^ԸşÐh´T°'êŸÛ²«èùÚ‰‚ñßNƒ'ÞûÈ“(&†_”Ïlø[«qJêQ¥ï~°i‡Áçƒ?ð_ý-Ò¦W–»Î_ÙóÑ3n1{>~GáC”DýÒÖl`Ú^ ´Þ?&¼§>zZ1žWª­¿q””ĹKâÜä[[¹\‚½MŽ›' IùLÑh9a¯ÎØ•XµjkÆŒ5(Ù²S6Ž*u÷¯c­322òžìÛ·¯^Q‰ÛËO]±›F£¥‚¥=wFO^_¼t´Çö9Ósæ¯V¥ð+¥5ô+<äÍ÷<ëÇ!…Nk'7n/÷PÀùàTë.o Äp>Ïwú‡ßùà(Ôi ;Nà×Y–¿-†:ñ!ªµvú晉6>é8‡×Þ^#ç€ó—O俎‚¿’Ïw\'OÀæ3E£å„eMÿ*±AƒW"*®9sÖÿ2Å»ùHUµnã|¶ñ"®B¯¨rÍzo¿¿‡F£¥‚ÕmÔVÌn.í±Ã'/ÆQ0©*Eþû@åšR`àïèWú+øEØåRNðüiT¢Ç¢°U¥ös¶*Ç!úsZ9 KùV]yÐóÑ«ð;Ô` ÈQö@üê·ç¯ìÙŠ¡Ñlµr&Úbj*Ÿ?÷B7©°Ç+“ å¨Ù^¬gåŽËÔò1x‚‹á3E£å„ ÷~ÄÉÝ‚?CÉôÆY8ªM·¡J\wÞyg>Û§vƒV³×ì¥Ñh©`O7>³Íë·”Ž¹’ÂWñ¬að˜Ù¿t¹¢Hïá“í·ø¯ ¤ýªqÛîz”ã+؃QPø#àçÚt,ŸëÁçƒbúmÖ”%ö+üWOUksŸ­»´yÝWa›Î]'ª’“t|~×=Ÿã*ä'ð[žgå®Üó~iãÄà z¬ãh4Z¢làë‹¡{ô˜Qqmß¾ÿ— ¾ë¶üovɱzòùö½æ¯ÛG£ÑRÁžmú¢>›—]Q$¢•¹·¢»’ËNë“›n)íøü•ñ¿ê·®ÿå>°âãµä[œ†»B V¶çißtË™¬ào-õü¹vÝ2ÝGÙž5û®Úós÷ÍÚu÷l^ü´ßùàbÝ_=Q÷9ÏóôljÏåœñÕ¤¹ëÂÜ/Û8ÝÀ¯aýÚ‡F£Åi}_™•˜™ùNDÅuøðq”|ôñ_´Væè·õ¹.X°`>Г×_ÿë"ííºþcñ†ý4-¬~³vQíŠR¬ÄmîJ.»òjϯ^xf[@ðüõŒ™R§¡zýÌæ}wW¨èwÚ-^êqf¦ÏÓÂÿ\ÄZ­=½@¿£`ãÞ^æÙ>Ú¼øi÷Q8y¿&ÕSõ¼@œ§-ŒܧçwSü¾ÒÊ#ÂÝz¬£Ýh4Z¢ìå>¿ìÜ=jÔˆŠëäÉS(Yé‘î8êÍÙ«ìÛôd‘"¿bï5hÔŠMh4Z*ØsÍ_’óò+¯.^ⶈöhÕ4w%—ŸÖ'øÖñùÈIs¥r÷WŽ8 ý0í™ÆîöæÌåîšÃÿ\Tç3täÔà£l#à_ÏæEÍîCŠŸÖ¸Þ€ íjËàò=¥S¯!Žöñ¬Üó~éµGô„r*…i7–@ëÜó-¨Ä3Ö„]( ÃQS笱zò§Ÿ~ÊOzrøèi«·¤Ñh©`[œ‘"7—¼-æJ®8­OÜ5ŒÉž'•ãW<ô,€zô”LÊà§ãü¹ˆ´‰ð[ç# ÷±öCG»y~¥í`/Ðý‰ã´+WK“OÚtèÀ·ž÷K+‰Á"6,F‹Óža4$âœ9ëÈ®ªU{£0Žš>­Õ“ûöíËOzr訩+7 Ñh©`Ï=ÿ«žŒ¹’ËÏêÇç£&ŸM[=ÿ’çžT+†~:Ο‹X@›($P‰ûXû¡Xç^Cçï°2zÚcg.Ú íühÕ4¿[ µ•¿¯R@åž÷K¯=OˆØ°4-NkÝn\x=ùÀQGM›»&ëÉÎ}†-Ùð9FKkpv€_±·Å\‰ŽÇs|ž5qΙ›µó<г€Œ” #ÚÝ*Æùs há2ÃœÒø·—¹EÍŽßz¸J-#êתãÏŽÉ”“éÐcÈ™©â¯OuF=r†Ó|pGî—^{ ž±ai4ZœÖ±Ç4HÄìì!ßw—-ûŽš4{u>?içw·}yàÂõûh4Z*XúÙ ÈÅJ”޹™/ì®aø„3Ó~ñ+žz@=gÞÕN˜ÕiÄös hù¦yÝ×"Ö¼]÷ [éôr|âYò¥îgf6 ÌÊ=}©üíW¹çýÒkÁ"6,F‹ÓºõŸr>αc'Q²âÿ<þCƼõdëÎæ¬ÝK£ÑRÁžiòëú“1W¢ë:>2öŒÌÀ¯xèY úÙ¥rüŽò³Ø~.b¾#&ÇÜDÚ¼¨Ù~þúÔ%²Œä„w?8\W› hd1Ô#ð‹Mή<‰_ ¿ôÚc¸Ìˆ K£Ñâ´ÞCçB%öï?=äzAUª÷µô(P èÉôôt½¢ú-;Ï\µ‡F£¥‚Ùýqb®D÷[q|þÑ¿n›ây gÖgw¢ 8¥žÃ&Ëv[ϼuëÖzE>Yï­•ŸÑh´T°ÚÏ<×ß\:æJTn9>ï?jÖ™]±žkëy _ݦ°Á Ý<¼þì.‡öÀ˜.bÛÏîÏxߣOzøøÙÝÀQÒ³y[tä>ܰ#gžÙ­¿{f]ôI‹ü Ë9è“~§ªÍë¸ãzí1xBĆ¥ÑhqÚà±+Cî·¸fÍ.”|¶qŽz®m|¶ßbff¦^Ñ-·—Ÿ¼ìS– V«ay0¯+^ª÷ëo‡4G%OëüÛ9s¢ý%¥rüŠç¯ûHoÕU;Žº÷‘3â ¿˜Ÿ‹X`ÐÄ÷ ž•¸øuÇQöl- Íë8Jjsö4ý]÷õ: µÙRÍ: ®wÜóÚŸ‡±ˆ K£Ñâ´×ÞÞ•øôÓƒ"*®9sÖÿ²w³‘8ê῾NKKËzrþüùzE…®¸füâOh4Z*Xú/üWôèþêÛ¶’¢ÅJéW—^vþ+Ÿ£˜|ˆ_ñüõ€÷<\ÃÖùpÍ(ƒñ·~ÞaÐĵÅ_ qÆ@{>8”ÁYÙóq…3´GÁP|ˆ¿ÃÜ Û¥î~0¸°ž þ:mUp1½MŽkw|Æ"6,F‹Ó²fnJ|ä‘n×øñKPòùŽ“qT©²(ôíÛ7èÉ]»vÙÎhô{Óh´T°êõbÑ“/˜a+iÑýU+«ð·|Žbò ~Åó׃ àC[­Åß‹•zià„¨j‹¿€ã2-ðyÝç»xÖùw#¶¥ær•jÈ%„¹A ÛÐcñwpaý­àÊå*eôÚCžXT K£Ñâ· §W• yšÝïnâW"Vè8½öð'U»Ñh´8­æ³¯@(._¾=Xq=òH·_f‚O\;xúúÿ=ïw*½víÚõŸ|%JèE=\§Ù°¹;i4F£Ñhaì¹—Þ„P1bnÄÅ‚ÊÝÓåÓÛÿ:J§`Á‚ÿÉ/èÚõ×!ë—]s}æì4F£Ñh´0ÖaØbhÅš5ûh­3Ö Ìϼ‚ò%Ë=üëÄÆôô|£'7oÞl_yw»lÀ¬í4F£Ñh´0vÏý¿ ¡Ü¿ÿ+ÿåG¡@“—§÷™¶áÿûÃù*ºÆŽûŸ|»‹÷COµê=c+F£Ñh4-ŒÕh°ëâÏ?ÿ«\¹ö(ÐiÌêºí3mï›o¾ÉOzÒ®j~Á%…»MÛB£Ñh4F c­‡.’Uƒ Ý*+;{¾}¼î”ü[‰²ª¸î½÷Þÿä/8^y×ÎÞ9{F£Ñh4-Œ=P¹D#¤£CbnõUSðùý•{¡LéJuìÌîŸ~ú)ÿéIˆd«™mÖ§Í„ 4F£Ñh´0öPõþ²÷âÉ“§ìž8w•i×xðâ§{M¶B«uëÖÿÉ€H†TÖËüýŸ/j>jUËqëi4F£Ñh­é«+ï®ÐIRŽ1WætÃj´o ^[LUVŽ9òŸ|Š™3gZå|uÉ{šŽ^G£Ñh4F c †,­ðhO‘‘gÄdÛÉø¼ôã ­ÄêÚµëò5*Uªd¯·h™GŽü€F£Ñh4Òjw÷ñ¦cjd¼•>t9þ{gÍÖV\)R$_Žœ´Øµk×\`¯ú’«‹Uë6%ýµµ4F£Ñh´ðVkÀœ+K”ÿ¯ßbÙ²eÿ9°víÚ 8®ý/—ÿýÒ¿—¤Ñh4F£…±‹¯¾é¿\ÈgâcþüùnIIAAÄŒ¾}ûþçòeË®¿þzÞz‚ ‚ ˆ8qÁœS™IÇ BŽá”AADx4iÒ$¯Ոʬ¬¬®AÄ j\vÙ]uê<Ǧ ‚8™™yŽL½!"i-·æÌYϦ ‚ ‚ ¨' ‚ ‚ êI‚ ‚ ˆÿ¿½;вÜ8Þ9ÿ«˜ jišÚÍ»YVÚr³²=Ën›Úf{¦¥ÞÊ=Ó4QÓÌM…•EE7ö}“}ß×a¤ÿo½wšygeqÀïçüއ ïû2Úœ{¾çyž= z '@O€ž= Г '@O€ž=IO€ž= zô$@O€ž= z '@O€ž= Г '@O€ž= Г '@O€žèIГ '@Oô$èIГ '@OòOzô$èIГ= zô$èI€ž= €vÚ“)))–––vvvjµš=ß“999S¦L¹á/ýúõUÉ? =ÙdOªT*KKË.]ºÜ cذaÎÎÎü3Гú°²²ê×¯ß =÷Üs^^^ücГšœ tƒÑÆŒÊ?)=éåå5bÄÅhüäƒ1!Þ.ö;ÖÞ?d°âŸþyNNÿ°×gOÆÄÄŒ3F1_yé¯û2â½åÙlµdà€[uìҥˌ3T*ÿ¼×OOj-ßÖôð°ûöXg&ø(ÎâÓûô¹Y÷¬ž={ZZZ²­@‡ïÉGýæÃ¿T\¾}Û€[wlY™™àkx’¢ÎÎúv¢…EwÝ+ôë×ÏÊÊŠg€ŽêÕW?íÔ©›nöésóâ32ýŒŸPßc“&Œ73ë¬{µAƒ988ð¯ Бè[¾-‚pÖ´I1¡§²’ü®büÎ:¿÷ökН›6Œm…:CË·?êw<+É¿™ã~Ô~ô¨gõmVɶBí”åÛ£_~öÜ)Çì䀜ûl>Tßf•)))üh/ ,ß~rÄ#ömÍNl¥±Ýºúî»”÷E‰Í*LœOß™g»uMvrPŒÕ*Ë[”¶L<<6«0AjµÚÊʪgÏžº'Ònå²ù9)Am9©±>Kœeaa®¸Y¥x¨lV `:—o‹œ›=ý«ÔXßœ”àk2qág¾ú¹â¶Býúõ³³³ã¿Àµååå5lØ0Å÷+~õҧrSC®ùˆ‡ñÙGï(>È{ï½×ÙÙ™ÿŽm/44tôèÑŠ‘öêËÏ^8–›jR#’x`ú¶b³J€6“““óùçŸëY¾ýè±Ã»sÓÂLv<Üö‹©o[!6«hU*•jÞ¼yŠË·ßuÇoÛ­òÒÃÛÅ8ïß9ôþ)V¥He6«hq—o÷^õóÂöR’š³Ízåmû+n+4cÆ ¶h)ú–o÷°0Ÿ3sjzb`^FDûŸ,çŠ$VÜVÈÒÒ’m…šÃÐòíIG†x¶ë’”G$±ãJ›Uöë×ÏÊÊŠgÀ•2´|û•‚}OægDv°Iˆö™<é333Ý¿ò AƒxVÃÀòí§žxÌÍeo~fT‘Êãߣø×6l˜››Ï} -ß¾ûŽ];6tì’ÔÏ“^ý¢¾Í*ÙV@‹¡åÛ·ô^ýË¢‚¬èëpøí©'Ó·Y%Û H ,ßþnö×™)¡Ù¯çÙe»iðÝw*Vå”)Srrrx €ë–åÛ“¿ü4:ì|Av #Í&«Ÿo¹¥·âf•óæÍc³Jp½1°|û?£_ 8]˜ËhMVjø²¥ó{XX(.Õa§Jp0´|ûÉŸpÝO7ž¤¸€¹³¿ÑÝVÈÙÙ™gèØ ,ß~`è{»ÍE¹qŒ‘áýå¤ šÿ†vvv<Ç@Gepùvë ¿åÆ3ÆOeY~}ýå¼ôÈ~·ô¢'@‡':§_¿~ Ë·{Xü¸`NvZTQnc䔩²/_®+ÎKò?¹éäžÙ}{[Г sssS\¾mff6õ« )ñ!Åy‰Œ‘SZ”^W[SQš~~÷©}sÝ÷~GO€,44ô¹çžS\t3nÌëaAg‹ó’#§¤ ­ö’Z]¡Š :âñûóèIÐ¥¤¤Œ?^±$G>õø9Ï£ªü$Æø¹T]QYVíuæà’ÓûГ S©T3fÌг|û¾ûíTÉŒñ£®T‰ÉHðóq]ãå´ÈÓñGztTjµzÅŠú–ooÞ´ZUÂ?UEeÅ™…Ùqþ'69¸ôÌÅô$èÀ ,ß¶üñûܬ¸’ÂTÆÈ©,/¨¯¯+)L ;·ëÜáågýDO€Lßòí.ffS§LLKŠ]Ä9e%9—ëj+Jó¢ýœÎ»ürþÈÏô$èÀ ,ß~{Ü›‘¡Þ¥EiŒ‘S®Êª«­®®*M?áíºúÂÑUô$èÀ .ß~â·ҢtÆØQeÖÖT‰’L»àb£Ï±µô$èÀ -ß~àþƒŽö¥EŒñS£.WW礆zlós[ï{|= :*Ë·ûÞÒÇÆz]Yq&cüTW–T–å&„Ÿßír“߉ô$èÀ ,ß^¼h~~NrYqcäTU××_.+ξèïxÊ&À}3= :0Ë·¿žúefjL¹*‹1rªÊ ê/×U•%„¹þ5Èc+= :0µZ=fÌÅE7ïŒ{+:Ü¿\•Í9•¥y—ë.UW–¤^<âµ3Øs;= :°¯¢$—1~jkªDIægFGù9†Ÿßvö7z\Ÿ=9âá{+Jòã§F]¡®T©òSb#¼÷†_ØCO€ë¹'G?;ÌçðºÊÒ<¦É©©*©¯¿\^’›áå»?ÒÇžô䣟òÚ¿ØçȺʲ|Fߨ+U¢$Õ•%©1ç¢ýDû9Ò“€ž”{2Øk§—ã‘”UeŒÖTW¨.×Õ֨˳’ƒb/¤'t{2äŒÇž>G¬ÊU¹Uå…Lã7–dâ›øPר #ô$€ž =»ëìe^û–”eV•]çSW[][SU”›q*>Ä5.Ø…žh²'ÃÎÛûº®w·[œ“¨®(¾>§î’úRuEiQFJô™„0·øÐãô$€ñ=~aoà©_¯Ÿ“r½•ä¥êÊúúúʲ‚ŒxߤˆS‰á'éI€«èÉo‡°sö.›''…zTWª®‡¹¤.¯¯¿\]Uš“šå™éAO4§'#}öGøì?±cfð‰_+K ª+K:ê\R—Õ_®«½TŸy15ælJ´= Ð"=åçíð¬Órw»¹…YñÕU¥mªËJ²¦J•Ÿ’w!-ö<= Ðâ=y1àPˆ§í믃Ý:RLЬ½¤.+ÎÌJ L÷¡'›¤Ç]¤¼¼\ñ,é›qqq-r5#ÿ.WúëÀU÷dLàá(¿î»æúº¬/oøôê²v=uu5uµ5¥y9©a™‰þ ¾ô¤1vƒƒ5Œ;ÖÞÞÞÀu–/_.¥â\ñÍ‘#G^Ñ£Òw5#ÿ.Wúë@sz26Ø%.ÄÕ稕»Ý÷Ù‰Aíµ$k«ÿø£^]Y’—•”•HO6¿'u‰NÓxô$×yOÆ…¸ð»«Í×Þ‡Ö”gÕT—·—©½¤®¯¯¯©®(ÊMÈI ÍN ¡'¯º'Gê!5¡|ÓR±ñèIèÉø° áîþn6‡×yÞQš‰Ï¥KUõ«nJ ÓòÒ#sÓÂéÉæô¤?‡Y[[ËU)¾ÈÎÎÖ:@ß;éI®·žLŒôˆ u;ë¸ü˜Í7ÙI!—j*MrÔ¢$/×]*/ÉÉϼ˜ŸEO¶vOJGÊI9vìX#¯OOpöd’ˆ®h¯‹þ‡mûÖûКÒÂ4“ŠIÑ‘uµ—ªÊ‹Šrã ²bèÉ6ëIáÈ‘#òc6r 5= ÀuÛ“)Ϧƞ:µóÕg¾.J‹ÒEÄ]Û¹|¹¶®îRueiI~JQNBaN=ÙÆ=)Œ;V:~âĉšß÷òòZÞ¨¼¼\_OŠcÄ鯬×êIñ?¥·q â‹9sæè¾àndOj^Jºšµµµƒñ°¥¯9zR«'Óâ¼Óã}ƒOmw^/UeFí%uÛÏåºZñW«Q——¤ç&Š¡'¯UOŠT<¾Éõ8ò‰Z_:—¯&ZNœ«¸—‘n‹îIq¼æÂ"cÖ­KÇ‹# Vë·ó5zòŠz2#Á?3)0ÄÃÖyýçU™Y[[Ý6sùò¥?þ¨¿TSUR˜Q$2Rzòõdvv¶TYWÔ“rȉr“núMœ8Qó›úzR>]/¨™—ZIi '5kV~ šWS\·.ývù–¬tR÷Þ,×UO®_1ÛfÝü«ëɬäàì”ÐPÏßDUú8¯ÉЬ«­i͹ôG}}Ý¥ê²â,QºCO^“ž”+K+ ÷¤Dëe⸸8ù§âtÅž”òOëÕmùn¡ÖcÖדš¿H÷®¦xTú*TóÁËÐËËKñÕv®‡ž\úÃ付™wïúèðûüx®Ãž|ãÕ§¥ïwúÇÿÝÒç&Û_®º'ó2¢DÈeÄùúÝxpݧ>Îk³‚D6¤€*Ë Š1;ÎðГí¥'·¬ÔŠ=iÙ‹ÖÕô…œˆLÝtÔדŠÉÚäÕ4ÿ¦| 8€ž”zÒ~Û’Ý埚›wûúË÷›Ó“Y±…9ñE¹‰Ñ>OíšhݧǷ¦Çø^ªiX‹}¥S___W[£®(.Ê%kÌГí¥' ,¸–_nÖ¼y¨¹ÇðÃÐ|ØŠ=)®`Ì&BŠÍÙdˆp½õdø…½Ž¿ýrSÏÿeÌ7vöÀ¿¼OÙ7³'‹ó’Uù)yéQ‘ç¼öYXýÁy§Ia•¥…—/×59¢$Å#WW–ç&ŠD¼¢¡'ÛEOx½X1¥«¸«)ÈKiäßhàRÒÕFê§ø—ººÍ3èØ=áíàãnûÐÐ{ºwë*Öûæ^öÛi~O–¦•e”g•f$„œ¼phÕ!«ÏÜí¾÷´Oñ­*+ª¯¿¬;â1×TWˆÓ¯´$éÉkÒ“šë»5cÏpOê{ãb“=ià‘\iO‰žÀÈý‚fLý¨—ÆJ ó+*ÀµEz²\•SQ’WQš/&#Î?Ôs÷‡Å¢-]¬¿òq^ãw¤ #Vº'Y{I­*HmhÂæ =Ù†=yuûOšBO¾?)Ó|«$=  ' ï?é`ûKß>7wúÇ?¤ƒÍÌ:÷¾¹—͆%-Û“š“ŸxÌßÕúü_.×ÕŠƒó3£[`èÉ6ìI}Ÿc¸' |Þ·ü4‘¯f`!ŒÜ“ò1†{Ò@ÓêCOèÉ&÷3ðÜ;ò‰‡-Ì»i.ÒþÐ}§\wµ@OêU~ê¥ê Ñ-5ôdÛô¤üb·îJ™«^£Ø{Æ|~wˮǡ'¸ºž”ö š7kRO×¾…îÝ»~ðînWÝ“å%¹FôdMu…ˆÀz² zR¾9iàmôí¤ïšº·5¯6gÎųäJÔ¼«©Ø“šoøÔúlq­Ç)½Þ­y =  'ÿ¼Åÿ[ßÒçæ®7v‘ÏýÇ?þÏ¢û’…3[³'#ZpèÉVíIQeò¦ßŠÛø4¹Ÿ¹b9rD1P5ßô¨¸Ä[®PÍÏ»ir?s}ËÌåÜÑz]žžГWúùÝßNù¸gO‹ZYYy5rqq™5s†ã›+îIƒ£ÊK©Q—‹lÙ¡'›Ù“AJDÚ‰ÊRüäÁ+êIÝOŸ1)ÿT|­x5ÝÏ[,//—ËV«ôŒù¼Eݤ”7ÀÔídz@O^iO&„»ÇGûÖÕVW”番ÒÅ”•fV«Kžxâq«U‹ìÉ2U¶áQå%Ó“¦Ö“Æ}¥oUK“Koy#ù;Š'¯ï–_ˆcÄ7ÅŸrê~£¾žüCcYºæÕæÌ™c¸“éI=©Û“"#Ã|êëÉÄúËu…y±EñªÂ$UQ²4å¥Yµ—Ô÷Ý7ļ{÷ïgåÝDO65ª¼$Ñ“"ÿZ|èÉVêI©Á ì.Þä~A¢è4ãÍp Ê=Y^^®Yžš7-u—~èI­Û¡ºCëÞ)=  'õõ¤ß§ºuýÅžLŽ>sùrmAn´Ô“¥ª´²ÒLi*ÊsBCC{öìifÖ¹k×ß{çÍ`ßSŠ=YZœÕäÓ“&Ó“"Ø–$:ÐÀ"k™———t¼Öšé›ÒëÈÒ›0¥£Ι3G_ ÊW“ï.Êg;Vó=“ŠÅ8”/%® _Më{M^ €ë°'“¢N'%D?5bø§ã_½°_÷õnQ†•ùš=YYž'MMu©ÈùâݺuùäãGÚk÷dQf“SœÛГ í×CO´fOÆÆD9ï·ž5íó{îtÌÉZ«'#=*Ë‹jªËJ‹S垬ª,¬V«ÄÔ_®6l˜æ …=zXÜ|S¯ñï;êìðWO6==Y–Ü*CO´fO˜›w³üáëý»× ¾ëöù³'iõdR”g^Ftí%uí¥ªju‰ºªXêÉK5uµêcÇ\»wï¦û4–]ºtyëÍ×öîÞ‘›•XR˜a`Šr{29¨•†žh½žŒ‹–~úÚèg]·¼3ö•§Ÿ|ÄÛc¯fO&G{¥ÆœÏϼXVœ]£þÛÛáj/Uoµ^5øî;,,Ì—6ˆïw13{yÔ [6­MKŠ*)L×¢œÄêª2Q}­7ô$@+õdEYÕÊyæ÷o¿­ÿ–õ‹V,uç·íؼL³'›ü¼E7‡—^|¶[·®7Þx£bXvºv=ó›’Â4­)ÊI 'éIÐ~{2ÌÏÙÅiËÐûöBéܹӤÏßÙk·æáá÷?óÔc']ìŒìIi¿ ¯5+—>0ô¾)Þ®<çå¦*HÓœÂÆžÌL hÍ¡'Z±'ƒ.8çn?æ¥#>t׎U ç}3 ß)“>ó;jdOÊûÅE¬[½üé‘O˜uîÜ­ÛÿÞ`ÙÃÂâ”›³*?Us ³ã««JEòµêГ­Ú“~g~¿à±wÑüÿvïÖUÚÿg§ï8îÙ8þÝ×ûßÚw™å¬+êIU~Š4© á›7®nK33 óqcÞ$Ô“ ~­<ô$@ ÷d\ȱK5•qžrOž9±ÛnÛÏwÞq›tÊ€þ}¿Ÿ=yãZËž{òŸÿ°ßÞÚÈž,ÎמœŒ˜³ž®ºßS˜ר“¾­=ô$@Ëöd„·ƒˆ¨ªò¢ôä0¹'=ŽÙnXè=Z>ñ‘áCW-›g¹`Ú¿î¹ó•—ž ñ9ÞtO^ÉH=Ù{m0ô$@‹öd¤Ïþè€CE9 ª¢l¿3NROwÞîr`ëÆµ‹îòçwêôÑ/?»nåÂ)_~daaþÞÛ¯»»îÓß“IW4…Ù±Õ•%éqÞm2ô$@ ÷d”ŸS´ÿAÑZU¥a'åž<è°ÅqÏÆYÓ¾èÝû¦?Wg›wïí×6¬YòÑc ¸uðÝwìÛµE·'‹r“®hĉ=y¡m†žhž¼pH4UeYaJb„fOîûÍj‡Í/o½öR§Nÿ®ÓÿÖ¾ãß}ÓjõâéßLºÿ¾ÝÚ¯ï†uËþÞ“W6Y1êÊ’´Ø m5ô$@«ôdLàáØ`Qwª¢<ã{åžÜµc­ÍÊÕ+æ?øÀùjææÝßûÚú5K~^6ÿ™‘#zöì±pþ¬¤¸ Âœ„+üL©'Ï·ÙГ­×“q!®iñ>åeª‹‘6Ë=¹móÏÖVK¿™òÙ€þýäkv½ñÆ—G=»~ÍÒ_mÖ¼=æõ¾·ôùàýq»í¶æÄ?RO¦Æœká'Z±'ãB'„»å&••Ÿót‘{rˆŸl6.³Ùøó¬é_{ð~;yîÙ'­Vÿä´oÇœ™ÿùäãÝ»wkKÛ-…ÙñMN~†èI•h¼¶z U{2>ì„HÊÔ¸ e9Ùé‡ì¶oY±cË/;mVî´Ym»mí¶µ«W,|þÙ';uê$ÿІ™=sªË!{·£ ˜)"Óܼûø÷Çí²Ý\§oò3.6ôäÅ3m9ô$@ôd¢È­(ÏìÔÐuy\L¸Ó¾mö¶Vö¶öü¶qÏo›öî²Þ·kóŽmkÇ¿7¦gÏš·+Ÿ9Bô¤×©Cθü¼ì‡Q/>caa>ùËÏ ²cu'?#Z]¡ׯCO´MO&‹úºx¶(7¡´´84èüþ=[÷Ù8îÛêä°í€Ã¯öo?¸ÇAÇÓ¾žtç·ßðw>2ÌrálŸs®Á^·ôéâwº +VkþêIÏ6z -{25ö|F‚™*»²¢<2Ìï¨ó.—ƒvGþ&¾puÞízØÞõð1»l7ýwÊ„áÆj…åˆÇé}óMÁ~ùY1Z“—%z²¡îÚ~èI€6ìÉ´8ïôxߜ԰ò’Üêꪤ„(/÷ƒ'Ží;yÌáäñßå9}òÀ9ÏÃGØ[.œýüsOÉ [·®Á¾§ò3/jM^ºèÉâä¨Ó×`èI€6ïÉŒÿ̤@Q•eÅÙꪊœ¬Ô÷3‡4Gô¤Ïy×@ßaA¡§¬Ö,yãõ—Í»w öuÏό֚¼ôȪŠâ$ñ»®ÉГע'³’ƒ³SBsÓ"J‹2êj«‹ s¢Â}|Îýßœs ô9èq1ül|´wJ|ÀmûùºçeDkÏŸ=yêÚ =ikkë‘#Gþ‹øzâĉ^^^†Ï²··×:kΜ9ÙÙÙú~ÅòåËÅŸâë#GŽÈ'ŠSÄ/ZÞH|ßÀ¯[þ݉+Œ;v°_þuâ븸8ùDqŠøŸü €žlÁžÌI —>¿»¤0­¦º¢²¢,-9:<È+È÷„4a§.†Ÿ‰¾ïߨ“'ÅÁÚ“ÑГî×jèI‚‚DJÝ ‡H,}g‰ TååårP‰*“oŠŒ4dš *Ý`”ÎÒì:ݤ”{RNGé ñù§R[*>Tù!iÝu”O”n0Ê_~„ºI,÷¤ü€å»šún®@O6§'sÓ#µ¦8/Y ËÊŠ’œ¬„¤¸€äxÿûúœÔ=8÷Ïž³_zËýƒZ0){2_ô›© =)ß ÔÚÒ\“¾·V>Kñ WÔ“òæÆ¿>®ïñë¾VNOЂ=y`¯õЇrKðßá±ÉÿÐ’3»¦»mzÇvþÀ·&FŸÏHôoþd%V–æ_ô?`jCOj²··U&­£‘°óñ‹ÒÎBšg‰’Tü`)¥›‡Æ<žòòré`}ö­Û·âWùøÅ÷¥‹+~@9ôäõäªes_}÷­ÓÉ!NÑg¶]q~ïwî['Yu÷·\0##Á¯ù#z²¢4?ÚßɇžôdózrÚ?ûèÛIGb½EOÊ/yOuµzeõÔû‡ÜÓ’=)†)= èÉfõäÖ K}᩽"&·•_òþpÿR ‹î ‘gÓã}›9™‰¢'£D¹™æÐ“€žlFOž=¹ïæþ·ˆŒ\ëã¸âü^1¢'¥—¼EOF¹§Çû4s2ý+JóD¶™ìГ€žlæúîO~ž)2rÁé¢$§»mšêjõɾ%¢'Óâ¼›? ~¢'#}~7á¡'=yõ=éö`¾7O9°J*ɉGV}rèç‘ß}ðÊKÏ´hO:˜òГ€žlÎçãr°¹uè]¯­ýö}§%cÿñÙÕ_è~Ïã{Ób/42âý*Jò"½÷™òГ€žlæç-w¶½oÈ`‹Ûûör›øâ¸³]j셙ƞÌÁfâCOz²9=™s^Œ¨ÊßwmŒ ;-ýÏ™?{R<ÓzГÍëÉs­4ñ¾å%¹ µfúCOzòj{2%æ\+MºÔ“â!µƒ¡'=yµ=Ùj“ç#z2ìÜîö1ô$ '¯¦'Ï´Þ¤Çy——ä„ÛÕ>†žôä•÷d«NZ¬w¹*GtZ{zГ&Ø“¡¢ÓÚË´rOÚX¯ã© :TO¶ò¤Å\hèÉ3¶íhZµ'Wþ4»8/‰g/è(=yºµ'5æ¼èÉiíhZ¹'#NfÇò¡'#O·ö4öd¶(´ö5­Ý“bò3"y€öß“­>©1çÊTÙÁž;ÚÛ´zOŠ)ÊMài ÚqOFœjƒù«'··»iƒž£®TñLí¶'Ûbz²8;øô¯ínÚ¦'ÓbÏ^®«åÉ L°'Z0ż{· +¿Óדm3©EOfÞÖ.§õ{RLNj(Of`‚=ydßÚþ·ö?zÜ+¡öëôäɶ™Ô‹gzÒck;6èI1¥y<Ÿ€©õd„·ƒ»í‹Ïþ[üôÎAŽ9Yÿ½'ÛhR/ž=(¬N³{òà¯ßôêÑÍpOf$øð|&Ø“Òû'}ÿ•YçNf;¯X<]îÉ6›”èÆžôxÛLJ”èÉL‘díz®¨'—Îyç¶þ7ë–¤™Yç9Ó'(Ƥ4uµÕ<«€Éö¤´gÝŠ¹æÝÌ:wþfòGþ‡ãB·ö$‹ž,Ê 8iÝ®ÇÈž´Züé}ƒÜ äí·F9±Ë@LŠQ¤ò¬¦Ó“;­|á™ÇN:oÑÚ/ÈÓÕvØ÷ŠSzßÜkÝŠïãB޵ê$Gy–eŠkïc¸'woœ6òß÷*–ä3O=ªï5n­á€Iõ¤ÍÚyf;™›w[½læßöŸlœu+択'Š¶Ü¿küýŸä¨Ó =ybS{}=yØnÞ«/ W,É!÷Þµwç*cJ’UÞÀ{2ÂÛaïöe· ûú aÞŽ¢'cƒ]å ÷=ôÕçïšuî,ÿΫÜí5ÚR“ÙГ 1Öæï=éæ`ùñÛÏvîüÝ’Ø¿¯ÍúEÆ—¤<õõ—ybÓéÉHŸý¾§~ûϨ‘[P<~pKlðQ­9}tçKÏX˜w›õígá¾uiÎ4öd†ŸÛ†1ö¤×¡Ó&½Ñ½Ûº%Ù§w¯s'_EIòqÞÀ4{RZ³|Ñ7f;‹Y<jã]JíÙ¾i±´¡Ð€þ·¬X<]ñ˜«›¤HÑ“¾¢Ä:Æ_·`æø›{™ë–¤…y÷iS?ñ>pÕ1)¦ª¢ˆ'60Áž¼p蘓µTŒ/>7"ÀË!&ÈEwæÏšdnÞMZª3ë›OõvE“ÑØ“Ç­:ÀXý4yðÊË·'|<Ö×Ó¡9%IOïɘÀÃa>Nãß-݄ܵmyLÐÝ ðÚ7ÖDq@Ã~‰;‹ã=\¶+iäüÕ“ëÚõl_7ýáïV,ÉQ/<ÙäF@ô$h=ééb³lÁT¹'/–fÓêùÒMÈŸ{üÜ ;ùûZ³ÜrÚ½÷Ü!]\ùÛÖeúŽ4<‰§J Ó}Ž­m§sÐvÁ3O U,ÉÇ{ÐÈ€èIÐ{rî´OÅ÷{øþ³Çw6ö¤³<"#ßû•Æ;¾þòýPoGÍŸjÎo[1)ý ‘—Ë-¿õ÷Ü£ï`ÅIŒpo§=ytÏâ÷ßzFßF@¶6ËZ¶$éI`j=áí0uâ;âGææÝ~ÝðãÅg­q°]ùÐÐ{ß-ÙsÓêyºÈãêh=öõD|J¿ëß µœ7圛SäI w/)L÷v]ÝŽæäþ¥_|8JßF@+šÝ%)MuUOl`:=é³ßnËb‘‹â€O?x=äÂþè€CZ³hÞdé€ÇzpÏZÝä9ëf+~ñÙÇå_zï=w|?ó ÷#[ œ•~²¡'®n/3mÒ›ú–o/˜;9:Ð¥õb29ú4Ïj`j=åçäç±{ä àòÐÐ{\÷oŒö?¨5â€OÇ¿.]G|qöøNÝc´Ž_½læF”Þ‡)Ü1hÀ'½'¾¯{°Ô“Ž®2ýYü݇·ÞÒK·$ÍÌ:O™ø~372frRCyVìI©ë¾Ÿ9AúøÅå?~£X‰"5{ø~éM•c^^±°{•â1bNÚüÉû¯I˺Åñÿø®ï);}ë›øP·ÆžüÙtÆmߢ÷Þ|Jqùö]wÜf³~Q—¤4¥y<¥À5ìÉþýzܵL·'#}'èìÞ‰ŸŽ‘Zñ½±£¼\Õw¤Ï)»S?”úSÚÐòǹ_8^k¤žÛqs˜,•J¥›”;6þ õd„ÏïFNàûéS?ñ±‡ï[ÿËlc·½7v”üR¸âYö䡟®ÉlXúÅ}÷ܦ¸èæí·F9±ëÚ–¤˜¤Hw>c˜ZRšuî´eí܆ž¼Âñt±yë?ÏJoªìkŸ…ßMô>¹Ó˜÷üºtêo+r¬±'—¶ñØošöôãCKò™§=ê¸ùš—${N“JÊÑ£GkUÓwÓ> ÷ÞwsÚeË”/Þ–î:šwïúñû¯ºØpu—âªÊO9spI›Í¡ß~~¸bI¹÷®¶ßÈÀ䦇óì&B­Vë&åè—žðÜ~aßUŒ8qéS¿|)ûmK¯â:qÁRO.nƒqÝ=ïñ#;wRØh`ÿ¾×j# }“w¾¾þ2O]`RI9fÌ­Žú×àÛݜև_Ø{Õcµbæ£Ã‡ÈW›òŸÃ{Wz\ðQÑ“^·êœtXøõç£õm´`îd“*I)&kkªxÒ¤¹)¥Æ aç÷4göÛ.óÕgÄ¥þZÓÝÊ„qâ›Mž+õ¤Ó¢Ö›ï¿~릞Ý7š6õãk¾|[ñeîËuµz÷•G‡Ùm³H÷§1A.=¹°¥fßæoF>ö/Å’|ü±Mg# ­Éψdõ h¬¬¬ºtÑ^¥òÀ}w9ÛÿzvWLLà‘â¼äÓû4œ¶Mû?ÿÖ·­Í2Ó,É”‹^eÅ™<@û3bÄÝ•“?ãjG[õäÍ™#¶³>}çi}­üi¶i–¤˜‚¬h–Þ€ŽaÅŠº7*o¾©Ç³> 9û[ëMLàaÑ“¿ÿpÕ3õÓ—nêÙMqùö‚¹“£]L³$3|Ô•*žx #Q¼QÙ°«äÝÿüuý÷!gìZc{2Éã÷ùW1 ¦½Õ¯OÝlfÖyÊÄ÷Mp# i’£O‹¿2Ï7ÐQ)Þ¨žü÷‡vÿÜJ=yÊaÞÍš?¼ëö¾Šo•üð½×Lp# yrRCëj«yš€Ž-%%E÷“t$oŒ~jßöÅÁ^¶-5œzrß÷FÎÖ{èN}<²Ý”K²ºªŒg¸~xyyéîQù׽ʡ›VÎ öÚÙü¹p¨±'ç69{6L~þ‰!ú6Ú»s•É–d~F$% ®[vvvýú)ÄÌ¿îþçâ¹_{îlÎ\ô?Tœ›è¾÷;shû´q£Q\¾}×·Ù¬_dÊ%ÉÇp¨ÕjKKKÝh”?øæ«ÏÞtÙ÷K玫˜hÿƒ=9Gq\›ñɸ'»w5Óý½}z÷Zºð[“]qSMIhR©T+V¬Ðw¯R¸çîÛæÏøø¤Óš ÓÛŸh¿ƒE¹‰'÷ÌÖi^êÕCy# 9Ó'˜æF@Ù)Aåªlž-ú¨Õj;;»AƒÝ ßsO _¾ð+o·-§·79Š=i9ó­Ûúߤ¸ЄǚàF@éqç‹ó’X¸ `> stream xÚµXIsܶ¾ëWðN•‡&@pËMÏ[”Ьç‘|Jr †œÆCRæb•¢?ÿ¾FƒÛˆr*ÉS¹,h½}½`¾ZÂq‡ÿõ~6Ý|°JËÅ¿@(GƾÆÊ‰ƒ8Ž­:³vÖ§3×Úƒüáì?7g¯ß{ŠA–u³³üÀ bÏ }éøAlݤ֯öÛüöö˜Õ«µy68«µ°þøRøöç&«hˆ¨ì]žf«µ" íhõûÍÏgïnξž -ŽnW‘zžµ-Î~ýݵRÐ~¶\GÅ‘u¯wÆÄÇøh]Ÿ?÷í9°P8§béH|ÁìWE®ä-“±&ÊÈwT¤çÒý¤×…g½­ÀüÓ6ëžÏzÂH[3²„ëÄn,Èš Ð…*€¾à©­ù>ßw5ŒäyžíýH6‚ ¼é):¡Obèý›•/ìŒþ¤]™&åöáÇÕZ®Ýdßà¬'GÜæ‡X¨±Òh³?g'ðr§¼Ö"ŠA#Ea–¿¹"œÝr¢{ÿ»’‘]ÑŸû• m Û»$?BÑ×Û:iX’¸»»:°»^ »åÅGþœïÚþäö˜g%]Õò¼Î¶M¿Rﯫ‚&üéVÕ3 1 m}Ç=ßÁë;HÁR¾¢ÏΠǦÍGskRòàÐQ–Œõ×Âs|Ÿ­ðmåðDžb· í$Më¬i2VEvÒ4ù¾ÌR„ŽŠ|û¢ä] ER)¶$Û·y½íЦ…«³†ƒ‹I"mìéèæèÈ(t\?è]óæêãû‹Í%МX ., j²Ï ³¶2‚T% ö<ËwümUÃÀÔwâÐg;(“-¦šâ c] 6ÅÚ`+çe§Ødœ­%’‘ðÿ 6ÉË/ÌsKÖ;$åÞˆ“fm¶móªdò#ÞL¡G§C¿Õ¸5a›—M[wÛ6Kù.m0¬U™·{´©m˜zd€OÛŒ  ”}ï2=7¼X¢æo˜ä…ëǪ.tƈàƒ2åA›}d&õƒ!N‰tþÈ«o3ަŒ [ºi^îy‡¶%¶°æÜuµ¹µÑØŠã9±eK×$æàm3ÝÖ£ÑÙ YÁš/<ØÁÖ“HìX •Á6¾»˜ca¿x°ÉÅùÓZ%¼X_éy‘#yZ¬¼I±òDÂPª¸¨Î¸ °‹b¥ïrÏ8â|!.¥@5éŪî PA°2-…Dê­ï)*`éËïi*c¨£þ/ŠÊØs‚(˜+z³ C{QY×qçÊ"B"G¤šn`ýñŒvÏaYšæ ç))c'Œç ©“ö™PíÊmU x_q@2 «ö`2E”÷%2”Ù¡ŠP†+M˜a›Â},wmŸœ—ïŸòA²>4°9ÅaéÍTJ·Oq®šD&'ч}:úèʬ4+Hã>ò{^u /Ü%uR ‹é­I¿sšJ\ÊŸL‡cSDŽÈnÞ}úüîúf?ë~ç̳¦˜E¾ö©‰rsÏÕÇ&©“¶ÎÎãT’óåÏa4¥>†ñƒ9u0ÇG,ôìv†ÐqÁYº)7l†2H¸ $‚'¢†½¨û:á[têÕ"û:‘ ÚO’áʇÞõ$0d(,¶.´ðÈŸ§ûÊùŒ§£Â)/ 0zE.+^oû àg®š œælS¡›ÌrÓÆ=wÚ0Z²g– Ž¥ÊŸ}O`BÅ©Ñ%Þ·¯ó? ‘r}µ“8WŒªNúŒizó |yïQsr$­éMƒ^FKBÏ9š>ÒGÌú#šk¹‰>ÈM“yò }”<ˆRV栮ᴢ¬WJ`´JX n2ŒÃ}Y¸3ǵÏf¬°)ú¹§qm!Íd@mа+”7=ÇãQ[Œdܱ Ï³]#ÕXê?¾_᢫Íåù* 웋«ëçs©PRitò"0ªéåQƒÓ±ÎS÷zt›¾k© ”…ñ_gt_9ÁØÿp3ð]Ü{aèDò_“ÜÑ«M¨h(iüÈŸë  QÞð´§æfžfM^'hxJ8§ï×.×^ÿ¢óLÉ‹O|O‹wu¥ëÞz:owLâB¥û}|šÒS]i0!Š–ÅŽ˜a@ÚIYÇŠ.ëøêþŠ5›ƒwt%L¢ßÇê™ÊoÚÂ<LyÃú¨QÚ™ ö4¸K¦õ“æ€æ(+O¥‘ü1(Dø/(5Á`ŸaÔèóÊTæ¥u‰rŽùGÿ0KR.¼œÇ Ƚäs}«Wf­ù]ƒš¸/†tÒ÷á¨é½©Ûá?|Ò¶IÝvwcyñÔ~ùê 6—ÈÒúiF#þõ„F›ªÓ¿¼HéÙç©)ÌmÞdň6ɵ;Z(¯ë¥œ+F[¸ŽK9z˜&muLÍÙŠWªÛ biá’òY‘”0hʯZe|ãÜ•Nw¾¢ŽýMUÂÕ¡~ðˆ%XÜš‡·×ÿB+oÎO•l[¦$ÛmUã ‹ë÷óÇ<˜/ýóÄ&›$÷qãoyÃ#Ã¼DÅ,Ìâà€†‰í!igêðŒ&ý†¼C뇾ÙI™ÂFZºÞ¶ÌÛõiÉþs–~‹Äãóê”±G endstream endobj 855 0 obj << /Type /XObject /Subtype /Image /Width 793 /Height 643 /BitsPerComponent 8 /ColorSpace /DeviceRGB /Length 55918 /Filter /FlateDecode >> stream xÚì½ XUÕÿÛóîUïóSô暦•)¥å˜C–áPa?K´,²4r$Sé‰9„C…fŠ3Nˆ8”Y™DFÈ(Óa’ADœÊûÊ«ë®ÎÄaFý~žõôàÞk¯½ö:ö§µßý® ÁP*•>:(//Çøh…LÉÄÄä9½XXX¨T*Œ€–––Ï@³fÍlmm1C Óµk×ç †*+ ñ\Õ111¡1zxƱ±±‚Ô±cÇÍ›7‹IªÑ£GDGGÏš5«iÓ¦šBeii‰*<Ë pèСçÏŸOIIY¼x±Ö*33³ÔÔTŒ6ž2ä$ç3fÌ*•••åææÖ®];Þ5|øpú§¬RDLL̆ Ú´iÃu&OžÌ'Mš¤uÅkkkPà©!55U¶C‡ •*--¥ kÖ¬{›6m:eÊ”€€Y¥ˆððp‘½³eË–+W®ÌÎÎöððxçw4…ª}ûöy<ØÙÙ ÉiݺuhäQ‘‘‘´÷ï¿ÿ:t(íš÷¿_MšÎÕÚ´i³lÙ2Y¥b+ w9r$×yíµ×I¨ìííż–ÌàÁƒƒ‚‚0þx¢‘ß¼3fŒP©´´4Ú›ŸŸß¤IÚåîq96ëèi?“‘¦"çž={d•Š«`ß¾}´‹ëŒ1ââÅ‹ÔÔ‚ ´®8cnnŽgð„RTTÄå̆ „JR…]»v= ;ïÝ?4.[”í{u7îɇŒ9òܹs²J)+X±b… š1cFBBBTT”™™™Ö*›òòr|x²prr’“œ°JEDDÜ¿Ÿ*°üÌøaAX\¶ZYl³¶u›v@5mÚ´àà`Y¥âããCBBH¢DÕºuërrrΜ9Ó¿­T …Ÿž ,,,„Ì 2äòåˬRW¯^}P‘º³uëÖ´kßáÓáJ•fñ Iønúœ&²Ô¦MY¥ˆ„„77·aƉL 'Nœ ¡"­Ò@ebbB‡ÏOr’óùóç •ÊÍÍ¥½žžžcÑÛ´‹ˆWé)g¼B†z@õÊ+¯ìرCV)‚Äl×®]´‹ë|üñÇlksçÎÕ@eii‰*4r‚‚‚dqqq*uçΪ0gÎÚþéø/#r*-»œèñz/nê½÷Þ;{ö¬¬RDbbâÒ¥K9{g³fÍÈ£h#KdMW[qÆÖÖTh´ØØØuéÚµëå Èmbbbhïýû÷ß|óMÚe·ÅÁ•â²tź6m=¹ûöÛo©AY¥ˆðððï¾ûŽ+¼ð þùg^^žB¡èÕ«—¦PQ¯ÜÜÜðI Ò§O!-¬=¬R™™™´7..ŽCÊC¢Ó£®æ^üC¯ZÎYÈOŒ–,Y"«TRçÏŸ4hŸzÀ€äKùùù«W¯nÙ²¥¦P™šš*•J|^h<¨%9···*uãÆ ª°~ýú‡+ë q%1·Å;0ÚtŒ™ Úµk—¬RÉlÛ¶­S§N\gܸq±±±´kæÌ™ÏiÃÊÊ +Π‘@î$,¥E‹!!!¬RüÝßÿ=|øpÚõóÊõÑI¹Õ.ŽÇξÕçQêƒaÆ;wNV©””¥RùÓO?‰*ú9+++((HdMW  ²³³Ãg€GΖ9fÌ¡R©©©´7//“œŸó ‹IÊ«aÙ°q{›¶¨¾ûî;2%¡R‘Îþõ×_‹ªýû÷8;;¿öÚkšBellŒ*4 ååår’óåË— •º~ý:U8pàmùÕ×b“ój¥„ÇeÌš»HP-Z´(..N¨‘––¦P(úöíË]z÷Ýw}}}©3?ÿü³Ö*RA¶>€zÆÍÍMÖ///V©°°0Nr>iÒ$Ú>ÝòǸ”üZ,.Å~üÉ8>i§N¶mÛ&«qíڵ͛7·mÛVLaqÂOñÒŸÚŠ3ÖÖÖ @=cii)„¤_¿~!JÅÇÇ?¨˜³êرãÃ$çN'•©ùµ^ŸpëÝwŸ}ðàÁgΜ‘UŠHLLœ7ožXqfùòå*•ÊÏÏïÝwßպ⌽½=>SÔ]»v*2kÖ,¡R999´÷âÅ‹áZƧÔ]ùkûþ;½Ä}øúë¯éìB¥Ò+ÿôÓO¹ÂK/½tôèÑÂÂÂÐÏšBÕ§OŸ   |²¨k"""d qvv*uûömª°`Á‚‡Ù >ÿ*!­ NË•„¬ÿû™œ¨þ÷¿ÿ]½zU¨TF...={ö䮎5ŠúI¾G5µ®8cnnŽgP§ÈIÎ;tèpéÒ%V©èèèIÎû÷˜¾à÷?w’í\½v½®K@¨ò«o¾T;vìU*³‚µk׊å¿ÿþû´´´„„„ñãÇk  ¢ ÄŠ3¨#LLL„x•"o¡½ÉÉÉ’œG%³J%¦×Gqqó4d(÷jÈ!'Ož”U*++K©TΞ=[PÙÚÚ{xx¼ýöÛZ¨œœœðY v)**’•cãÆB¥ä$çO-*•”^X?Å~çN¨>ýôÓððp¡RDvv6õÖÔÔ”+tïÞýرc$T»wï~á…4…jðàÁ @-âàà L£I“&/^d• {P‘äü£>¢]óZö/•Ê(¬·›¤Zh½œ¨š6m:þüääd¡R„J¥:~üx·nÝD~ÑèèèÜÜÜyóæÉɲ––– @­`nn.ãý÷ß¿T©TJJ í½qãF‹-h×@5•J¦’Y%8"~â¤GTm۶ݺu«¬RDNNÎÊ•+9{'Wzz:9™•Öglmm@€š@.AR!ãçŸ*ÅIÎiû‹:+Sò5U*%³(%«^‹‡_ÈûÃGŠüW®®®²JW¯^1c†XqÆÎÎŽlðÌ™3o½õ–¦PuéÒE¡Pàk€êáãã#«y«Thh('9Ÿ:u*mŸ}zJJJvvö´iÓ´®8cmm*hÀ;8ݲµV ?Ýປú믿ÖT•ª]•Ò:°õOœ¾rݺuB¥JJJ¨ÂƾþÖ§lr^•T*+¯‹_@è¡ïñu :Ô××Wͦ²²²~úé'^q¦U«V«V­*,,¤k6l˜Ögìííñg •J©ÍK0§N2¤q¨ÔSÓù†U)…B!'9÷ðð`•¢/؃Š$çŸ|òÉÕ‚ç.ª†Jeç—6xٳϩ]»G©fΜ™”””ÿobccÇ'L9räÖ­[ÎÎÎô³¦PõéÓÇÇÇÜ ±©ÔƒŠhÃ+C¥ Rµ…………ð„~ýú±J%''?¨HrÞºukÚuÔÕ»z*¥j%-3Á¢ÅM›6ã·ó6lد››Û€ädïEEE«V­Ò@eff–ššŠ?qШT*;;[„N©ýooBBBhzTЧ y+PíÆM5©>H-йªm#ÔÔÂ… ¹)2ÿþú‹z¥GÅñSNBÿ!ºN*úÏ'5¼óZVíC¡C¨YnŸ®NÏŒ·&jÊ£¡õ᳋O$ô1õù-mß¾½0+++¡R´÷äÉ“´½ã‹£“òª©R¥9£„„Çš~ühí˜^½z‘;i ÕŽ;DÕœ9srrrÒÒÒ&Mš¤5€ÊÆÆ+Î@ãQ)ybŠnÁ•ÎZÈ*Åïi¾¨õY¡h­´´TÓÒ¯¥_¥èDZ›Òõf¢è<ý ?Ü$h ^²&ͫ擪 UõÂΩcZÛ§£´ '·ÆŸµÚEéúDtõ¿Þ¾¢$Nò©Oœ8Á*ÂIÎ---iû_}[#•º~3·¡KNÁMUÅ󾃇Ot{­»ø²ÅÄÄäý›ÄÄĹs犪ß~ûíöíÛ.\8p Ö*'''ü­€F¢R$ZëëW)á0"]•|ƒÖœ ­É?¨¨Ùa=*E§5@´¦ÇÍDçIÕîMZ§•´zŽæIå —ûY •ÒU¹}žAÒ¥RjÇʽ¢Ÿe S{‹S¼×Yo_Qyº  H¥âââT$9ç„Kö»jªR… Z$•¢^Q߬—®àé¤LË–-ËÈÈPª°°°Ñ£GóÈ»ºº’Píß¿_ëŠ3ƒ¦qÃ_<hp•‚¡v3Õ¯RZ%A( ¥öÈL–µ Nû©ÕtÙˆ¼v›šÑ.q.]¯òéè\´…êëJ¡9 ¦ë¤Âëä ¯ªJÉqkj£'šâi==+? ¤Ÿu 샕êÓ§èó—_~)TJ¥RÑÞK—.±l\ŽI¯¹Jå–5TÑT)êahTÂç_Näkïܹ³““S® …¢W¯^"ÁÔ•+WJJJH½äwæææbÄM¡Z¿~½Xqæ§Ÿ~¢-ééé_|ñ…Ö*[[[PÀ“¥RznÁBc´Þñu9Œ˜Ñ’EE«wUzZ[3¤óº'Õá„»ª’J‰))=¡ûúV×3J­G5 J988hÞ¼¹¯¯/«”Hr>dÈÚµì—õµ¨RÅ·ê³TªRÔ픬¢U¶¿·mûÿG›Ów,çßЖ3fˆø¨-[¶Ü½{×ÃãwïÞšBÕµkW…B?€ð¤¨”ž‡bâæ.öˆÖt½+'GaéW)C^ëÓÚšÖ""Ê´ÎÅéÿ Q)]ÂcàÀªm4D™J¥ÌÌÌÄÝÔ¨Q¬Rœä<33““œ»ù„Ö¢J]/¾u½¤žŠá*•œY›j1ÕR$Hß´iSŽþþþ#FŒ ¦H¥H¨è )¿)011‰ˆˆÀŸAhü*¥'N[t@®cÈ[S'´ÚˆÒ¹5ºÑlM;¯ê¨Ši®J—®†JÉž+3WUØF¥RååårÀÏÒ¥K…Jq’sž³êñz¯¨«¹µ«R…%TÊëºTU¥èBèrܽƒ~´<_ÿþýOŸ>­ÒàСCݺuã:cǎ土?ýô“Ö*KKKP@½©”®pý*¥' ‘ÿÑߥªª”K6kv¾&R†ç_ª†Jˆæh<)*åææ&_ÈùóçY¥._¾Ì>û쳇&0{a]¨TÑò:-ÕV)º(º´¿vì±Sg™É“'GEEi ÕÊ•+ŒŒ8>jùòå7oÞ$§úè£4¿$­Zµ²³³ÃßC¨•ó-UJ†ÐTê5Ãx²TÊ+zrUŠF1}ûö ¬€TŠ|€ö–””tèÐvíw>SG*U\Jåv]”š«T|ZAd|æ?.âìR¤LK–,ÉÖ 22’DKP:tèþýûgΜ166Ö*ÚHúŠ¿ŠP§*%Þ—W{f§_¥ô<çÒã?µû€¯ª ºk¢RâáZªT5‚¸ž,•êÚµ«¸ËO™2E¨'9ç9«ÖmÚE&äÔJ•”Þ.¹YË¥¶TJ™šOë3òƒGÙ¥ºuëæèè¨)Tï¼óŽH0ð÷ßÿñÇ­ZµÒ*SSS¥R‰¿P*%?ÝÓš JO¶ó*YG¥7n­ïåiµ‘oÁÀ¼šµ¢R†ÄºSÈ0ÅU®RbùžjˆÍ¤Rt7—ïï{÷îe•ºtéÒ½{÷Ĝէ㾬k•ºq³6K­«]rLRÞžƒŠ—_yM¸’¦PíÙ³§sçÎ"ÁTVVÖõë×üñG­Ï…­¬¬ŠŠŠðjW¥Ä æÊ)úUJÏJ+úßÙ׵ܞÖWä´Úˆ¨©§t^ÝO>°&*%œÓð ¯Æ|zƇ’#íå:OJÙÚÚŠÛz‡X¥bcciïíÛ·9/å9ÔƒJ•–Ý©•r£ìN©Ttbî•«¹‹–¬lñ8AúìÙ³SRR²þ mY¼x± úõ×_oݺGö¥5€ Ïû UJLï¨-,bˆJi=DçȯÝé—:¹Y­6¢g fÍK“OW•’MIk>áZbØ«¤R¢ÃºTMWÓ'H¥LLLÄ=ÝÌÌL¨_NTTmoҴ饨´úQ©›·jZJoÕ¹JE]Íñ ¸ò¹ùd‘0aëÖ­YDDDŒ;VÄG¥¦¦Ò* ù‰ªÈç‰?’PC•"£X¸p¡¼ ›Ö'e•f;§ j‹˜È+•¨IŽüÚfœ•.‘Ðe#ò 5šÁKZ—q©¹JÉ«váòÍâꪤR²jڦܾÖlçÕV)BëòÓµNQQ‘|Cÿý÷ß…Jq’s®߉ˆWÕ£JÝ­I©•¢Ñ 1Ùwøô›½ûóè 2äܹs™¸¸¸´mÛ–*ˆÅŽËËËmmmÕ¨ðG ¼ãëzLíÿRu%YªtVŠÿK&V²ÓÓ¦hMøBÒáz֔ѡ$%Z#‘ZšŠXC•R;)]cht­TÕ5øäš©¬š÷jêqµUJž“¤:z\Ö r’ó&MšÐçÅ*Åù$ïÝ»÷á‡>üæ,^YŸ*UV~÷Vµ XÏ*®T…ÅeÛ¬±kÝæQ‚ôiÓ¦ÅÅÅÉ*Eÿä·ÿΜ9sþüywwwúüjÒ¤Iò;}ø# †«”~èî©ëY¥*%¯lˆ›‰d²0ÈÐ.Íù%ýÁÞ²5i¦“Ò<¤æ*õ@oV+×bÖ#?48š®«k誔¼$tõÞˆ¬âDƒ ¨€TêÚµk´7++«E‹´ë´WH}«Ôí{Õ( ¥R¡±Ù^ÁÊo§Íæ‘ìÙ³g†Ä–-[ø{âåå%«”X™°¶¶ÆIÐÏóèT‡êè o³š“Î-îéœT\ Ç͸5– ªC5ż–VíQ»]/ëñ4”˜mãè,Z¯Nt¾ª¯þiž”‘/œÑÀÎkXAvv6OCÉW¤§Ïú[Ó_}X\…¯®9ò3&º@¡RœäÜÑÑñá*r¯t WÕ¿J•S¹S…Ò°*›u)&ëçÕhªÔ„ hã¢E‹d•rrrâµxô‡hXt­¬§ŸJu®JÔ養®«®Þ…>>uÚ~½¡6vôèQV©®ðÕW_Ñv‹é³J¥nß¹û®A¥‘¨”ù¤i4b³fÍJ—à÷øœe•"³’ßàÃ+à‰ÃÚÚZ~öêïïÏ*•˜˜ø@Jr¾cß±T©;w+/G¥:tìÌÖ$<Š~¦-]ºt!q•UjäÈ‘bð-,,ðmž8ä5M¦L™"T*??Ÿöz{{Óö-ŒÂ”Ù «Rwïý­§Ü¹×XTÊÙÕW–‘§¤æÍ›Ç‹÷©©Ôþó1øø6O©©©òÓ½íÛ· •â$çsçΥퟌû²1¨Ô½û:JcR©YV‹iÄ&L˜pMâ7Þ ööö²J­]»V|d;ž8ìììÄ­¼yóæþGÅÄÄ<¨HrÞ¯_?Úe³Æ®‘¨Ô}m¥Q©T¿·‡ÐˆýöÛo£h<9ý¦···¬RˆÎ˜˜˜àÛm\»v­¬Rûö퓟î)•J|!€' …B!'9wssc•âÌ÷îÝûïÿK»~˜·¸ñ©ÔÃþ7B•cöØO?ý”ú˜øøxNr~êÔ)Y¥fΜ)¿k×®ø6Or’ó¾}û^¼x‘U*%%…öæçç7oÞüa¦©Ó~P¥*J£S©-Œxi¡R{÷î¥-o½õ ¬¬R´E ¾••¾ÀGûöíÅÝ|Μ9B¥Š‹‹iïÁƒi{‡;_ŽÍjl*E2õ¨4&•r8äJ#Ö©S§T‰¯¿þš6Λ7OV©Ó§O#É9ðD!Çê8±Jÿý÷ßTáÛo¿¥í_MšÞUªQ†Ï˜µ€FŒÜ)E‚cËe•Z±b…œä¼¼¼_HàÉÂÆÆFÜÍÛ·o±ºÝÇÇÇÓÞâââ.]ºüðC1øæææø6Oƒwó &•ÊÍÍ¥½ôÃÃXô¦MýÃR•J5Ú®—hÄš6m—üNpJ²¤¦RÏ?ÿ<’œO.*•J~º·iÓ&¡Rœä|áÂ…´ýý¦!1YF¥ô•W©k&;6lX²Dß¾}iãÖ­[e•Ú¼y3’œO4r’sOOOV©èèèIÎyÎêçÕ4•jäË›Œ|˜ìtåÊ•I IÎe•š¡u­R$B5/õ£Rsç/¡a?~¼¬R¯¼ò ÏSÉ*µfÍ1þÍš5C’s 1Cwj[[ÛV­ZizÔ‡~xùòå´´4ºéÛØØpzóæÍ---½½½Y¥+¸vígš"V®\Ù¢E Ö°©3ç†ÆfÔ‘J‘ÕV©•0ðê„ÇÐòŠ0$Q²J;V|ffføŠ…BѵkWM‰zã7œ¯ý›ˆˆˆ &p…:•" àèDffæ7ß|Ã5Û´m·aÓöZW)’ŸÚ-uªR/'pRS¡RK–<𧢕UŠÆI΀FŽR©411Ñ”¨¶mÛ®Y³æšnΜ9#‚¢ûöí»oß>V)"88øÊ•+%%%| rƒ>}úp̓‡*NûÔ–J‘öÔE©;•ZûǶ‡ƒ0p`¼ão¿ý&«”œ•P©Tø®Š¢¢"+++­±å³fÍŠŽŽ¾f;vìoù7îôéÓ¬R)ÁÕ«Wo߾ͧ۽{w›6m¸æ·S,/_I® •ª“Rw*õéø/éòçÏŸ/<*$$¤iÅ<›¬RS¦L‰(¾®@£ÂÎÎNkX”‰‰‰Oúc²²²Š‹‹333Óu“””4oÞ<@Ez&TŠƒ222îß¿O'½~ýúœ9sØŒŒZþ²æ·š¨T–:R©F-éÚ …ò1¿ÿþ;ÏSEEEÉ*Õ³gO$9!nnnÆÆÆšõꫯîß¿_ùOIIÉ?ÿüC‡üý÷ßEEEéz!øä“O¸©.]ºlܸ‘U*¤‚ÈÈȼ¼<î@bb¢x¤øzÏ7:_ •"Õ©ëRë*uàȺä_|Q)1nÜ8Ú¸páBY¥NŸ>-4dVøÞ Njjª©©©¦DÙØØÈ^TPPÀóH2wïÞ%Ò/T …¢wïÞÜì!CœY¥.W'¤Ÿ:uŠ3IIItg¯Rã$Biiiú§§È >üðC>i÷îÝ·oßÎ*E„‡‡“?rkþþþ}ûö}ú>b”ÿe­*ÕP¥æ*µjí&º´wß}7V‚ƒÖöíÛ'«ÔÆ‘ähXT*•¹¹¹Öõ_/^œœœœùo®^½ºuëÖcÇŽ˜¿ˆªQe//¯LpvvîÑ£‡xCÐÕÕ•UŠ y S—••q³›6mjÛ¶mE?›ý0w¾21ãÿW©†.5T©£FÓu-_¾\xÔùóçY–"##e•?~¼ø¼LMMñeê@Ò5vìXºY ÃÉÎÎ?sÄøÖ è/‚Ã5¡]TkúûûgŒX•¦I“&~~~¬R¹DZZ¯8STTôý÷ßs‡Ûµ{Á~‡«TרThL:§€8wî\ÌcV¯^M[F'«”œäÜÞÞ_i ÞprrÒÕ¯_?Y¢ÈˆþùçŽ!ÛénîèèHŽ´sçÎÀÀ@±šCÿ¤´‹*P5ª,›)µ)ë™&ñññÄT$WB¥ˆ+W®äääpú²‹#FpÍþÞöô ¡jøR]•²ßý0¼ÜØØ8FbäÈ‘´qíÚµ²J;vLþàRSSñ­êº ×`È—fÏžÍÃÕºuëÅ‹«½—‘‘ÁT¤4\sàà¡'Ý|Hxê®T¨ÔÈ?¦ÓɽruueY"ñ ”øïÿ+>wsssüR†abb¢5,êÏ?ÿÌ“ ¥QKt@†PRR"*¤§§ ¢û5P%$$ìÛ·‡LFn*ÈbCBUXX(ö^½z•3$¨)Esf*ooïÌÌLq'ª"Ó#åËÏÏ»¨ž¿Ò|zX^^~ñâE~éÎHçGQ 7oÞ¤ËdoÔµÿá‡òÐõèÑcïÞ½²M]¹r…šâÓÑ):uêôÈX¾¶ð¿_á"4Üô´BŠòþûïó ¿ùæ›ŽŽŽ²PñóDnM úxÌ8¿à˜Øä¼–Óç8•¨|Ò1cÆðb|~ô©É߇óçÏ'W–––MŸBU3}O%Z=jæÌ™ä$ZM 88˜„Uª@´—êpe=*ÅqS•&¡à¾¾¾º¤3†~¦-b/éþ{ë;wH´DýøøxN<µ«v’4ùŒ7oÞÔúÒ+QÔ$U éèè(æ—äIu4S’ݸqC¾ÌóçÏËqbùùù"…‚§§§J¥•5£²9y»þ‘$TæææòÜ+‚ÓlmmEÕ”s.^NˆLÈ©´|:þK:dÖ¬Y¢MºÚÒ¬Y3wwwO‰>úH|+>øàƒä*‚é)ϦJýþûï#GŽä{«‹‹‹ì$•B¶sêÔ)5ç©4[”P [·n©)О BCCÕœGO¶(†,‹Ã±2±Ì¹ŠŸŸ)ì<ú3'¨)] ©7Åm*ŠÔÔTYõ\5Y¥þQ¥¦.\(¨¬¬¬‚ÿ@5cÆŒG©Ú´[ºb]D¼JiQ‘ÿsÿþý¢µŸþùáìÖˆÿ†Ñ™õë×'WvØ€gM¥6mÚtñâÅÑ£G³MíÚµ«J6¥Ýô«ÔR yzJUáΣ_HQ|}}Õ¦Ë O”¤¦@*ðàÁ˜˜ù’oܸQ©éñÔ™þ¡‹ŠŠúôÓOùCéÒ¥ËÆe› TIIIb©Çë=wì?¯ÒZö9Ÿæp,¹)NË@BuN‚N'+¨Zrµ€Mx6UŠ˜2e oùã?JJJ «ÅÖ­[O:%–™«ÔUHuÜÝÝuµ õmA=(•Êììl] ª-ºgÈÔ SPP ·F£¤ ¦^ÂOÿž9s¦wïÞüA <øðáÃA¡¡¡"€êüùóüpöaZò‘¦®ž!aJ•Z™ñÃÃUöÆ'ZðóóãØrrBw 9Éyß¾}“kl À³©RþþþsçÎåÖÖÖ7nܨ†J) ~F­é—¡à¤ºZ»páUppp0d²K¼ô—‘‘¡ÇôNœ8‘››kÈ(qŽ,ý¦WéeÊ^ºt‰L£Òa\·nXqfòäɲPEGGß¼y“Û´³³kÓ¦ÍÚM›ZLŸís)>4.[”îÆ=iÕÇÒÏœÐÞíßtëÖM|%èk\3ÔÞÇž•"7Xºt)o·°°àU%66–ßn#ŠŒŒÔ<{zzº2§›»ÚLîÄ祦Ä{¤(¤Fâ’(ñúg »T*•lJ²ÉÎsüøñk×®Éݸuë5E¾A‹ BäèXͧ‡‰‰‰"©TTT”Ü º¼¼\Ë—/sB-ù2ÕÈÏÏ9¯Èj8Œ©tlCCCEXÔk¯½ö×_É6¥@õá‡>Ênñr·MÛ._cÇO åC:tè@ÿüóÏ3†$9¯*©©©•†O¥JÑ wçÎÍ›7§½ÆÆÆ111²Šެ@dPÔþöíÛÙyRRRd ?ÑŒ®!ɹqㆨF‡ˆDå¬@Âyè¿ÑÑÑjÎ#ßÇ©q] DÇŠ§‡¤v'NœΣfz",ŠÔ…$Mì¢jT™_î£Ë”Ó­ÓIyæŠpqq!íѼjµËÔŠB¡ O6Œš àùŒîîî¢f“ŠÌœ‹-5:Ä+-žþ7C† ߇‰'&×ôÀï€gS¥ˆÃ‡wéÒ…SN‘`ÈÓDUB(VçÑ•-JpûömYDrž‰¢ÿR‡åy=¡àt"~z¨©@tÂút9¦é‘°‰jt?=$]äªÈÈHÚâää” ÿªÕ.S+«V­TS¦Lñññ‘…ŠŒWPíÞ½[d68v온Ã+Ñ|þùç®ôéÈIΩÏɵóxfU*((ÈÃÃcðàÁ\ÍÆÆ†o÷Õƒnôì#Î EôìÙ“çÁô‘eddüúë¯^.¶»»»ó!‡>%ajjZ“$ç•"æÊ€§’"Ù¦ D÷}]*Eb°zõj~Ô§OŸ”””Jïõ•BÞ²uëV77·ªÞg9²H³A''§°°0ÃÛ¡Cèuu/11‘.³J+++#ÏÔÕ`QQQ•LO×eÊuíÚ•?ÁQ£F¹¸¸ÈBåëë»|ùrú¯ØÂ³Oï¼óÎÉ#–­©v’sýTÕ™€Æ/S"getww×¥RÄÁƒùå¯V­ZÑá·oß.©éééœjûöít¢ª¾êEg'Óä—ò+U òòrºF:ïñãÇuuMïÔ©Sr ¹8,ŠLWƒÔ±*]fnn.u²Òa¤j«V­â²yóæ3gÎ$%¾¨Nh?wî\…Ä–-[䯟Ÿ_r`Ètðdáææ¦fS¯½öÚ¹sçt©THHˆ··wÿþý¹²ÏœÔD¨®\¹ÂÙòkt‘E¢©ÂÂB²~CPí5:Mçá°(5ó)--?gggóšÅÔ ˆž$œä„‡æø´´4]WÊÞhÈeÞ¼y“Æ™ßs4p©Í/¾ø‚?—öíÛÿúë¯ZUŠ_ÉܱcÇñÇÄÄÄðz|Ìo¼‘\7ˆ íÀÓDDD¿&èҥ˱cÇt©Ôå &NœÈ•ÍÍÍoݺE·þ𨔬@†ç!Ü¿¿¬¬LV WWW­ $œ‡T*44Tî]‡‚ß¹sG–C¥RÉo jMÂIG‰Y999â@j„šR›¸£!ÕŸk”®EΑ¥&f•Ž3 Ø AƒÄãîÝ»/HlÚ´‰¶¿ôÒKÇ* 1çwëÄkµ’ä\º2nOMÉ¡2¼ô­“““•"ùõ×_EèTjj*HMP©T¬@)A5¨JKKEk‰‰‰Âš8E€››ûIEAA¨IG©eNøçŸøé!STT$èèÑ£öCÎCƒ#ôœG¾:\„Eq*±‹ ÊÓÓS\¦lz)))üêÉ[ll¬Ü ¹"gN Ë¤kÑ?’t¸ø@ÇŽ{òäIV©¯¿þš¶Lž<ùìÙ³"ÝSVV–üÑ“b%×úS^O.äB"z™iÞ¼9Ý‘õ¨TXXØÞ½{9sQ«V­ÈXÈ.*½ËWŠP R:]U/DÍ訟¬@ IEFF†.çQC‘•ñ#Bú¯šópru­¦'©'¥î…‡‡“Úq.t~äM6=ÍÌ •Šk^^Þ¢E‹DÕìÙ³ýüü^zé%úç¡C‡D¼VNNŽX˜†hÛ¶mr]BBˆß5O+*•ªOŸ>j6egg§G¥ˆ‡}äò|Nµ¡öÙU ‰!WƒÔHV ²oooj'>>Þçѯ@Ô*¯æ<â¡~Ó“§ÎDœsöìY6¹“œÊËÔ iÞØ±cEý—äŠçÁ¨·^^^Ç8p øÄ?ûì³:U©ÂÂBü¢xŠ!1Ãf8¥öºuëô¨TxsçÎmZ±@ ݯù%µ²²²Òšqýúõ .°cœ:uªªAËÔ2 ]-Wõm²»wï’{ˆ¢££óòòÄ?i—®äêZˆÎ.Ž-..&%;qâDjjªÜI­ÉÕ«t™www!Éffft}p …‚Nzøða9Éù¶mÛêT¥°ˆ €§ºƒËÙ™ŸþY¿JEDDЭùå—_æúÖÖÖÔŽ, Õ&33“Ÿ|~~~z^£3D˜¤¤$‡øøxÃÛ¡k¤«ÖÕÉÀÀÀª†Ê“Wèj­°°°ªÂxêLkk´§¶ìííMLL<==i]‹þ·KJJ8Ñ'Uà\LYâŸ$ r¨¼®$œ"/(?²Ôu™YYY@eÈe’wíß¿Ÿ*SËr#r$™$ Ý™3gèrÔTª]»vâó]µjT ¨ElllÔlªC‡GÕ¯RÝÖE´³©©iQQGOÕܦd"1 ½©Òqd‘h-==]¼F'+ì((H˜uID¿S?ÝÜÜΞ=«©R›7o®‡$çP)Ï2NNNjéÐ[´h±aÃý*u¥‚Õ«WSeŽE§»y-NO âù¢ª®8£¦@qqq<±Ã $œçðáü¯@3\í¢dO322Äœ•ìë6µ‹"ƒ)Ð=*œ‡ÜFÔ!eÒ•9§ÎDÍ””‘k”F5$$DäK'IÕä°(úg`` {”•êÕ«—ø@---ëA¥233ñ àD3IñÑGéW©˜ æÍ›'R%ð¼l Õ†ˆgDrÃáÇj¢5R^˜®×ç1PÔœ‡ Ë¯4ÑO heÓ#Ôªyô 8]…§§§~•:xð üi:t¨Tªªï9O t¿¶´´T³©=zÐݹR•Š¥j"¤‰‰ ™?«•é)R ^†pww¯ÒŠ3t]iiiºZ&73$¹“RkœÃ¢ Ÿ:“‡ˆÏ××7 €×‘QÓ<ªL½õñññöö6D¥ä$çFFFÉõ]~•<ËØÛÛóü’:µcÇŽJU*®‚_ý•_î¹§øÑØ­ÚàÚµkü4m×®]—/_6$€ŠÃ¢H9tµxèСÔÔTLJCÁóòòt5èâârýúuÜ´0!!AkSòÔVqqqpp°ŸŸŸá*õî»ïÖ[’s,‚‚‚Z¶l©6=µtéRCTJ©T†„„˜››‹¥Lè.ÿ "Ãä­Z‚Î¥ç5:Aff¦³³3{uXWkñññüôHÿÛ‚ä<¤1<3F²¤«A®@†Vi®QRANþ izâ‰h¨/^¼xáÂÃUêÈ‘#ÿùÏÄÇ·iÓ¦úQ©ª¾ <•¤¦¦ª­ÖÇIè†^©Jä'¤1¯¿þº8P¥Rqx­Ø/Å¢ö€Œˆ¤B„‚ËÚCzCRÇTb#UেԠVÎç#ISÓyÚ-11ñСC"†\׋lQœ•]î¡°ê'}t±UR©£G ›å$çõàQiiiøÝº§Ë·c¦M›60D¥*X°`‘‘'ó´µµ}ð8¼¼6ÈÏϯё`°„ˆurž¬¬,¹>I”E•垴ȯщj¤"‘]‘Ü I‡EQ³Ô¸¼ëÒ¥K¬^¤”j/µ‘¹¹¸¸ˆå’IüøêŒý^XXBjWU•Zºt©œ–“4hPýLIUuEà©ÇÎÎî9 ¦L™rùòeCTêêÕ«$Æ ãƒ‚‚T<ï«-¡ ´{÷n9C¦šóèŠ-WS ˆˆn䨱cÔˆpR#Î:%´GóIâîÝ»¢¹È Å¡ò´Q,ßLÎC*(*ËaQeee4¶tFÒBV)êÉR¥*µyóæ7ß|Sóóªë%Œ†¯ø <;Ðmú…^P»;¿õÖ[§N2D¥+سgOÛ¶mùX333~¿OMcj)Ю]»ø šóTú>š•””øûûo} ]>I‘Úì–žÖԦݲ²²8c9õd~8tè ˆæÔO”%%%‘¦†„„°J999q’Š‘#GêQ)?UM‰jÚ´é¢E‹êÇ£èJñËh¥¨¨ÈÔÔTó6½zõjUŠ êXZZŠ×-,,8€Šg¨j)õSÞR¥hò*qlNNKFF†Ü !Ù¢„ÉÒÈ888J………‰²DQ³¹¹¹ááá¡¡¡¬RdJâkóæÍW¬X¡K¥hTåsyñâzX)FpãÆ ü¦z°³³SË“À³%AAA†¨A7ÜK—.}þùç|l³fͬ¬¬Èx^èv­H?~iiidPºLII©êˆñ´SVVF²'þ)Om•––FEEEDD•²¶¶nݺµ˜ÄsqqÑ+õÛo¿uîÜYS¢^}õU2·äz„†®ªé¹€gÒ$cccÍXô½{÷¨R)xxx|øá‡|x«V­lmm9U- ©T¥¯Ñ ÄK¤ºÜ¿ÿ±cÇ L·~ÿþ}’FR Ívä©­;wîÐàGEFF²Jmß¾½{÷î<2½zõÚ·oŸÖ°sGGÇ¡C‡jJ”‘‘ѲeË’ëú@+Íü1Ó¢™˜>}:É@¥*%Cf2hÐ ‘ÊÞÞþAŃ6ŒZ±©°°0OÒ£@ä<"µ”Ú#BÒñ¶ þtëtÕ»Nz&· ?Ñ£¨Kä{dz¬RTyøðá<­[·^½zµ;—Uêܹs_}õU“&M4?‚‰'ÖOÒ5ª”|„B¡ÐLãÙ»woÚ®G¥´âèè(2PuíÚ•Zxð8réN¹qã†È«I¢vÓ§îíÝ»—CÁI ä9s‚Z7H~8†œ Mkºõ¼¼¼“'Or…Î:ÅÈ•‹‹‹ãââbccY¥¨&Ù)Ûý—¤”ÜI~ƒO¨ÔòåËŸþyM‰"#uuuMnèZðëT•Jebb¢uz***JM¥*…ôãÅ_äLþS‹B%hûöí¬@ä<ÇŽÎ#W¦3ª½ôGõå äŠ"ë¹בs¡{zz’`h•(’+jA¨ÔúõëÅR;}ôùžüŸP©mÛ¶õìÙSs´Û¶m[o¹H ¨ulmm5ïïä»víb•ª¿üò‹È™Ð§O''§Z*j_$ÛêdçQÓ~ÓPT## âÇ‚'Ož$íO322Ô¦¶¸úùÚµkq‡z뭷IJÑ;wî”ßà*åââòñÇkMt0wî\j§¡<*''ß æTtíÚUó^ÿÞ{ïTÕ¦¢££,X „ŠZ¶³³+//g™¹[3¨²Òò•J%ï2$s‚ZHÃÄ 5{÷»xyqTnnnŒ„¯¯¯HEÚ¹lÙ2v.«Ô… ¾ÿþûæÍ›kŽí˜1cH´’ެ¬,¼²Ô¤(ÖÖÖZ_(#/J¨:W®\±µµ}å•WÄ[~Ô>ç¡"ç©¡P•––ÊÿT[P¦Rx–LpíÚ5²¹Mùùà7È¢C¦deeÕ¢E žVš:u*Ù¦üŸP©7vèÐAsHßxã Žìj@è’+M| €ª¢T*95·f8º³³s|µØ¹sç{ï½'òPYXXp¦ôš •àÌ™3d2†_æíÛ·Év´6%OmQ5ꔄ]ÇŽùZ†zòäI±KV©£G2DkXÔªU«’šôôtýùÞPìíí5_îãpôeµP(ãÆM™ššŠ¸ô{5ÆÕÕuëÖ­NNNiii•^]ttôîÝ»÷ï߯ÖI”˜Ú¢Ÿ©©H ê¿HõòË/oÙ²%RR)??¿‰'>§ KKËIt Fff&检ºF¥RYXXh Gß±cG\u¹páù?ã¸t*²—j«ÔíÛ·ƒƒƒ9†œ´ª¤¤DëE‘E8;;sXTll¬Ü‚æú/ÙŽ¨ç . ×Á’%KD†sµõ_Ο?ŸÜ Ônnnš©Ñ‰wß}÷øñã±Õ…¬cùòå"sBûöí---ù©_M&©È Î;Ç ‚‚‚ägh×Ù³gy/—¬)Q*Ö¹råJ˜Ä‚ „ø}þùçdDaÚ ½ìÑ£GcXÿE¿G!ΨgÊËËmll4Wîã¥åüüübkÀ† z÷î-$m³··çýîW—ŒŒ 1õMB%’MQ㢦,Qwî܉‹‹»,±mÛ6ñVcÿþý/kÃÝÝ]kn.##£E‹5`¢5òòòðe ¥R©UH±¦M›F®SÎ;Gˆ,—„¹¹¹B¡àIªê Õ•+W8 :CrEŠ%Wó3tŠôôô‰S§N½ÿþûÜ“:ï…hÃßßúôéºÖiØDÈà 4B^xáMshÑ¢ÅO?ý]3ìííG-šmß¾½••Y\õ„ª¬¬Œo÷îÝZ%Š Ç–ððð˜øàôéÓAÚØ¿¿~ý´&:Ø´iS£’¨´´4ú¼ð¥*•ÊÊÊJë+ÿ=zôغukTmpäÈ‘ &ˆ¨oŽÎ"§ÊÎή†S‰Îß»wO©THìØ±C¬ŽG?Ð?´áââ"2œ7ªõ_´B£dHúw4©©©ZÕ‚0`€³³sdmpéÒ¥•+WŠœN"‹‚­­-ÙK•&£è‡ôôt ²£Q£Fq›Ï?ÿüÂ… ýu`ii©uý—>øÀÏÏ/¹‘QXXˆï'ðD¤5">|xm áéé¹téRjS>E×®]IrÜÜÜþцÜÏ¢¢¢€€€‹ñòòš9s¦‹úæ›o¨‘‹Úøí·ßºtéÒ8×Ñ„ü¶¬¬ _KàÉB¡PôéÓG× Õ–-["jK—.ýñÇŸ~ú©øÝªU+sssr©’=êÖ­[¡¡¡~«W¯nß¾½X²™|ÏO8p ÖDË–-Kn|deeá¡ðäâàà E3†ÊÖÖ6¼¶Ù·oßĉE(±* ׃Šõ_âââ|$vîÜ)”綾^Z·n6\]]©Y­‰¾ûî»Æ°þ‹)))EEEøO:ååå¤LZ_ñã·ü/^VÛ?~|Á‚o¾ù&ŸÈÆÆ&;;Û[ÂÅÅå“O>á½Í›7ÿᇼu0oÞ¼çŸ^³óƒ j$ë¿h¦1Çdð4QTTdgg§k†ªuëÖ3fÌðññ ­¨e:…•••—ĬY³DÐøgŸ}vêÔ)/mlÞ¼ù7ÞÐìp§N¶mÛÖ%*-- ‘QÀSP,\¸áõ׿ ÿb(õIyyy-ê“B¡077766~àÙ k×®fffööö5Ñ*¥RijjŠÁÀ3‹±±±››[5<ŠŽjÖ¬ÀÆÆP6ѪU+ùØÿǨõÐÉË>Yºÿ[û ”§»˜Ù6ueÛ—{©Ù”ƒƒC¥U^^®aþêÛLÞè1mG0 Ê3UÞ?K–¢fÍš)•Jý*ekk+Òmàßト‚‚‚‚‚‚‚òÔ—©½M'n:lñ A F|ò«ù’c´qؤÿÉjdjjªÇ£T*•"õ¢qÿY;ýçì AAAAAAAAyºË”ßο;|)I”\ÆÏv ]ýÿû­lS …B—JYZZÊ5'­>4( ÊÓ]æî 6ʆÜiêÔ? níÛçÅ6õÍ’#swþ§ek!H}úôÑêQEEEò”ÔÓ‰ÿs CAAAAAAAyêËX‹-dM_|±îÎ{Bئ†[>>š*egg'*ü_ÿw“í=–:…£       <Ýeá®À!ï,zï½ÿEG§©ÙÑ÷ßo%›š`¹“ª½Ð¥‡0%333M•êÚµ«¨Ðk¨éŠ#‘((((((((O}ùrÖ.ò¥eËhÚQBBí6bÙr§0³Y+åWùT*•Ú:Åò´Õ´•»×BAA©»B¿eLœS¥òÉ´Å6nãćàwY™·Ù¥Ëë}©,Þímà þqˆšj[4¬ê74 J-–UGÂß}ÿá+{dMZ# ¦Ný“öN_vô—Ã!-Zµ²dgg'W³¶¶»þßv׌FAA©ÓòÑ7s«šh·ëëý4ÛYuø5¥¶qîïÎ|ˆæ®gª|»äÏE[OWú)ÐÀ.sðnÓ± ýLÿÕS_ l¥5g®Þ£ù©ñ)4?GÞn òyñA£ Ô¼ÌûÝ£Íu½”wútU;ÑŽ*¿ûÉ$ñËhbb"WëÓ§Ø5òói¸Ä   ÔiùxÒUU©—ßè§ÖÈø™KÛv좹}þGø:˳9¼+öù¼9däÿÇÞy€GQý_ÿ÷¼% $tRDTDŠ¢ ‚Ò¤#éŠt¤Þkè¡…PB $ ½Ò{OHï½÷^ˆïww`]·ev7»É9ÏyxÂì™»3sîýÌìÜÚ´)D£MGe~Z¸†þîù–g¶žÑs¯‰(IËäßÌ*ø÷WϦ ÆŽ†a zÙÆÛDJ÷îÙ C©ÒÒÊñã÷ýqï9£ J=÷o|EEEœÇIqçtǹ7¬"`–ªçþþ§g¤¿Åñ’-‡yÂtÁŸ û†gúÞkozXš«o^Ú"Š1)3eÑÚF7mjf—1%ÇNÿEtIž ÐŒä¯ÆNX ñîÍ,³Íîh~wgÿº—œœ#âÁ›jj÷¨ÌÞËÖWL‚Þo§ÄA&CCC¦€®î¿ˆõAGåÛ6Q0 KÛóW«½y§À°QÍ^H¯¾ \ÂÁëÏ™…ÓZÚøæ¥M!¬ÌÚ=ç©mCæ¿»Îë5ºG˜ >í—uÌœy…•Q Ù…a– /²~¼›:õ°èwÁ0OEظû!Í2øËï8Ô´yóæ·¬¥Æ™øÝ¤ÙÚöÑ0 KÛ ×îdB÷ÙðQÍ^HovÌ¿„#š/˜…ÓZÚøæ¥M!¬Ìø™‹©À7?NãÙžô¯Àòö]`–¹çâCf^Ò™û¶ü%©ó)÷ÂÝÂÖ Ã°ô|øš-1’šÚ=Ñ(OůºJ³Ì[õ'‡šÆŒÃX°`gâœå›ôc`–¶¯{Ó×>ªÙ aº`þ%œ¸eÌ,œÖ™xþM'7iÌ,4o3æ]æš‘SŒþhê’]8góŠ(Él½UÛr¦Ð–1×ÄY‹à¡¿ÿØñÍ[!¸fçxÖÒõ">VfÉ0 ËÒ[ö<}£çv)Ö#&¤YvœÐäP“ªª*S`È!ÿ^ªÚwÎÀ9†ai{Ù†]Lè>1ª©ó^~dOs‘ßd¹ß@æ¿“~^Â8sç JÑZ˜uQ™³ßoà·ã§ÑBD¬bëÁ‹´@ž¹hù÷­CDÔ‡þ UsWlβõLZ#M_ó×1ú{÷-î…3õ§‰"êsXã-AœoA•ä^8S1¦n¢¯À½"ž%pYþ˜éü{\XyñN­`n’]“)00¾Q”Zºô<•Ô6 zìÁݶ'%%qOÑ5÷1ñH€aXÚþuÓ”úâËÑM×Ð!œf'sº`æ¿›vg \Ò1ãóï‚i"™Êph‡þà_8Õ‡S1*ÌÌuê†Á˜ Ó9si:rÏÂY3/ ?ÈôÍÈ”aVÊ)0uÎRúˆ©g$ž%“©$g½œoA¦éœ/¢vä2§<-6§¶4 ³qh£ñMú”guœ-&lqjHó2S8ß‘gkP .œ [i£æ¬‹ª‡LÁp3¼dåe$þ÷Åð‹yƒÌí§¾4W¯>ý8­–‰‰ITT7JYz'Â0,ÿ¾ùo&tC¿}U×¼QßyêÄ¿ûd–À3ÊsBMŸ>ùŠûSú/3#I]Ó€û£E¿näÌÅ¿ºÝÇ®ü”gu-|˜éœ?8U%ÑTžgÉ4ó)U€{ú‘ wEÌES˜ÅÒ¿ÜëâÞ¼üsqׇçësj¿@ÎtþoÍSgΪù.lq¾E£‡°M+E¦`¸þyîi¤ÌÌ‚FQjï^]*©ùÈæñ͘¯Aéêò¼2ÆÖ/ †axÍ–¿›ô|Îa#Gó/¤/» æÿèÆÃ7=,Ðyþ’ÆÅ¿½A&ªÿé_k_ÕþaÒ fÆ Z†ü«ã™Î¿dÖs–NhðJs üšô_sqoFúF§SÝ„­ŽªÄÿѶ='®‘©?}}›‹¿Î.lq6N£âù:œ-ϳaÓ3f @ª©©k¥Nž|B%Ïݰ¦¹¾5†ûõ1Ü(¥úa?§€†eàõ[÷4 ¥†ü–!}|,ð#­G–"æ"_¹óæ…#T ÎÄ'¯2gÍ_&¬ÚËpVGõ6#SUaŒlýù¿ g¢ˆÅ +ÃÙ¼T7þ¹¨òÂ6Žž±3ÿäl.úúÜ…Çý4ƒY5U£Ñ"â#fº8âù:œ-ϽaßDGäĦ¦•<«ÁÊàOÓçqRyìØ1n”r N…aXÞøç^&wý|L7êûOñ/¤» þòëoy¦ß3°b>aòLkç %s&Î^°œ"MøWÚèê8U¥Eà^ìáÓW]¬°%s6/ÕMØ,7©À2[†¦Ð×ç.IK`ÖÂY”À Ûèþ⬱ÑÃÀÎ3ªÑýð˜~éŸDt´`ÁqPŠyJç‘SÏhÆYóþ £¦¦Æý¨ó>öó MƒaXþcû›¾þ«¯¿möBú³»`þ%Ü7´fNk8£À´f"-V„9eÄ_ˆªŠ(ÀÙDâÔ‡DÕàŸ—{"c §@f®'æ®k2qòLž/(¬ò´f-4 Ïz.\Ør˜éÜkÓâly†…Ùòe„ø(Å¼ÔøØég4ãìùÿ¢Ôš5k¸QJõÃ~®A©0 ËÀ·½ésGŒü¶Ù a®fð/áîã·+¶í8£À´ñp¤U‹¿:UQ€³‰ÄUƒ^î‰ŒÕØ—’¸ëÏãCo¯†]»û”þ«oâÂüwùï«6giÌ6¶pag!â[œ-ð0ÛzÄ5õªÔáSÏhFî«R›7oæ¹WÊ1 †axÝÛ›y†ü¶Ù áÜ{Ã3ýÖ# fá´3 ,0ü-J-]µ‰¦7jñW'¢ª" p6ѸŸfˆS ·þy©n<+bnpš5™°šÙú1•¡í@ÿݾ÷¤°E‘™Û®HŒ9ß‚VѤÀ¹Ý«©€8[†a&:?~Ÿ8(uïž>qÁ”æš1w1÷½RÜ(Õµ{O[ß$†e`γa_nöBÞŒã[ =®]‚fX`ØÛ'°Fá5¥®NDUEøwtÞ¯›½y©nW´÷¸†˜–´È‘'¨$gì!-³„-\ØFøw$`¿¦8[†až2툘·¿ÁwÝšæú’ëa„RÁÁÁÜWÈ-¼a–Wq=WªÙ á<§ˆgºÆÛÇ ÑZÎ(°§J Ý(b¥4oSW'¢ª" p+zñׇû»ð|zVÓ€y‚“è ;mîRN1¦bc'Î]sÚhÌJé¿z>MÚœçJ5õgËÃ0,ÂÓÙCç¹R‡³ÞÖ§qßÙâ¿Ï•ÒÐÐàyÚùÓ—‘Æ 0 KÛÜO;oöB8OÏæ™~‘ë!ØgXàä ÎsÅ…­ñ¯#—9Ï3u"ª*ºç1à7 Î¥cæMŸ2¸y©nÜÓç³QÞè6çl æû²nFÚu\XaæÁéôï÷ìG¬‹ØzÂ6çk6õgËÃ0,ÂÌÓΓ“sÄ|ÚùU=wšëãφr?¢³ªªŠ¥.蘹ÆÁ0,m¯Ø¸‹ëÅyÍ\×»Ûþ3ýÜ]“·¯fÛ%pFa8/°c¿;w®‡¶¡œwµl?tIüÕqª*âË ,Àyûž°¿?]`…9›w½Ú1þ/(¢žüõa¶ðc/Ñ»’Á¹·olÚF¶µ8[†a^þû51ßÁ·jÕeæ|4×ûí”8àäììLŸøïƒvÿ<¬ñøe, ÃÒöÒõoúzÕ~éo1­c½Õ·`C¾m|é¡=3þæL¸va_yÄi &ý¼Dó™'÷GŸÅ|Dˆ³4þªòÌØhú¾œïHQ8Qݨ†œmÈ]UîÍËÌE5dfa–ÆÙP"Ìù²ÌòE”¤¥qŸrWRÌÀL½–&íG†Åôš­w ìíƒE© ÎPÉ»f!W þ󚘬¬,útæÌ™œ)³—ozàð´ý˺ÿkºŽß2æ^ȨqÓ¸?íÝ÷#f:c¦ÐZ®]DMû/r/pððQdúƒ{âU#1—Æ1³ZTS ÐÂyÖÎS%ú㯓ZŠ3˜éTìÍ äkv \»è{.>ä^,÷òÇÏ\¬iÔ¤¥1fhÛŒ— Ý¿ùq7PqDåi#\àŒÅë¸KRÝh!ôý+΢À™—þ]˜Y²è/(â;rPª©G‘8[†a>p‰õ:˜Ã‡‰F©ÀÀx*öó‚³4˲Í8Ø1c˜œ‰:*kÙDÂ0,m_58pýYS-pQ;Ï?˜¿ZLp&2åi-Â*ÐhãÚÖ´Ìi¿¬ýtØ7ôÇò­‡Ï=vmöÒ˜´Ìf µS¨&Tªý!¢0ç+0³Ð¿ô÷ȦҼ[ŽiйDov{SÄ&ñÅ_Q3¶< Ã"|î‘—8Oé44t¥b«ÿ¼G³Œžø3÷ó9™QQQÜçnû®¿¸nÃ0 Ã0Üê=~â¤üüR(µw¯.•Q;czÙ8¨CGeîá{œ2ÜwžÏþ]í²ù+†a†áVï%ko&½xá%âF©ñã÷Q™“¼·žÑå¿çœÿv©Aÿ=oÃ0 Ã0Üê½ý¬9aÒ–-·„¡”‹K8˜µð7w‡—FŽÉ]Œûõ1¤Ý·lN?…a†anÝ>¦ï?ö‡½"~ãc~Ý[³çñqC¿N]zp`IMM»XUU•ªªê¿w¤Ïþõ˜Q0 Ã0 Ãp«÷¢u¬'™kh˜ñsñ}4ö‡=ûu½—í¹Â}Ý)8˜÷iTÇŽã|Ú©K÷}}Á0 Ã0 ·nï¸îD¼4~ü>þ—ñ1o1þeãm*öù蟄ýºÇ(++‹›µ&,Û¾W?†a†a¸Õ{ö þ;¦˜»¤Æþ°g«†ãoÇpc’¡¡¡‡¢/à”yïýv›nØî|èÃ0 Ã0ܺ½UÓåÇ ¬§"œ<ù¤¦¦Ž ÈË+jêÔÃ4eñv]*ÐsÀà_&¥ªZUU%¥¼½½¹‰kÐ7·ëúÁ0 Ã0 ·zÿvÔdÌ{XO5ÿù8óòbòŒ%—þÔö¿â?ï§ÐÐÐñªÍ›7s=oÃf_†a†áVïUêÖã§e аjî†;4qöΫÿ÷~;„]’âÜ1Å=”ôã¯{×ßõa†an þýŠÓŠÓVÌßs÷kssÉÙÙùŸÆdbbÂóÂО›±óæj-/†a†á¶àÇ ?;›‡ˆxž%%Bºººÿƒ ‚ ‚ÞjÍš5ÿ4EÜ™‚ ‚ jËš9s¦è[¤ÊÆÆ†ç¾)‚ ‚ 6¥öíÛ«««ÿÓ\€;vläȑؒAµ) 8pÍš5YYYÿHHÎúâ‹¥dl’ˆþþû"ŠþŦ€ ùÑóçæÌqã6´î¯YTTôÔbFíAѽ{v(ú›‚äG™™Ì Î`S@@)JA”‚€R”‚ (¥ JAP J¥ (A@)JAP ‚  ”‚  A@)(A@)‚€RP ‚  ¥ (A@)JAP ‚€R¥  ¥ JA@)‚€R”‚€RØ”‚  ¥ (AP JAP ‚  ”‚  A@)(AP ‚€R”‚  ¥ (A@)‚€RP ‚€R¥  A@)JA@)‚€R”‚  ¥ JA@)JA”‚€R”‚ (¥ JAP ‚€R”‚  ¥ (AP JAP ‚  ”‚ (A@)(AP ‚€R”‚  A@)(A@)‚€RP ‚€R¥  A@)JAP ‚€R”‚  ¥ JA@)JA”‚€R¥ (¥ JAP ‚€R”‚ (¥ (AP JAP ‚  ”‚ (A@)JAP ‚€R”‚  A@)(A@)‚€RP ‚  ¥  A@)JAP ‚€R¥  ¥ JA@)JA”‚€R¥ (A@)JAP ‚€R”‚ (¥ (AP JAP (A@)(AP ‚€R”‚  A@)(A@)‚€RP ‚€R¥  A@)JAP ‚€R”‚  ¥ JA@)JA”‚€R”JAP JA”‚  ¥ (A@) $'(ecc3iÒ¤.]º¬Y³&)) [‚Þ¥ªªªŽ;6pàÀ!C†hhhб!HPÊÐÐpäÈ‘ªªªjjjYYYØ€DP*88˜ êÿŽ1j6JiiiQCÍ(ú¯®®.¶!µ J9;;Dq³}ûötÊSTT„Í5¥’’’–/_þ?!Â1AME)“!C†Ë}D°%!HÆ(š'yE¦‰ô‘À›1Ê‚$…R†††xÅ`çöõñá.<Á43º7öûopéRè1š?gª·Ë‹ô8/a6†c ‚xQŠ€§­>~评W."2Eè¼Xà¯åAï‚Rüô8Ú°fY°—…ˆ`êë\Á¥cH FŽÜؽ»àÁDHvÓã½Å±þ} ÇΦ¡¶ƒRƒÏWUí/ðêî¶Í¿G9ˆ¨„×];Öw åM AMB©#Võî=X`'5sÚoc1;;Í«'û÷zég:mM̽ÿ÷ÿÞt Ç`ýûWÓã}šjÍ«§pŒAmVÞÞÞŸþ¥À¶zé/³ƒ½­š(â® k— åahhˆmAŠÎå—-[!ìŠùsíftvÇ©‰¸tŒñìmA"èõêÙ]㑌ßwññÃ;{áƒÚ’D ÐûiÂX{‹Gï¨`륿Ì6ÊÃÆÆÛ‚„]16@ïÓOêܾð.ÁLŒtßµcƒŠŠ2.·A  §|`϶ÄHŒ¿wwT°Ó®qŒAmá„W轡ƒŸhI$Pd{ ý™Ó& åáíí}AÜW „ У3ýs§öK*˜Á>6×®À¥ã¶#ô6®[â”™è'Y‡øÚÐ’qŒA­µ­6@¯¿>Z×NK@OùÄá]IQžRÍÔýÛ‡ ŒQÄ#ôè¼>Ä×VªÁt°|ûôãÚW[A0MŒt†‚KÇ2–ˆz‡÷«¥Å䦅·›ÝÇ1Iû„Wè½aCèlM¢öZ a£<4440Ê’Ÿ+Âèõ¸xöHk &YOûšÀÇíâÒ±Ä%|€žÒVÅEz妇·J³Ž±þ8Æ É·ÕBèõÿðŽæ…Ö(j+vl[/l”¬áØ€ZV"èíÙµ%-! µfó¢ú\:–žD Ð[8V ·]nú«Vï‹êGqŒA’’¨zÇ÷¥%¶ú@½ vY½j)Fy@r%ôþذŠÚVLj|À¥c KĽÇ~ûÒþEnFDÛqZbÐá;cÔ-âƒÄ‘¨znˆ‹òiS™ ô±Ÿ5sаg&`”$Ë+BèÍœBj› &5DÔ ¼t]P³%b€Þæ«#C=‘;q|Oë Ï¥cBÓ¶|\‰ 7eòG³‚ìXX|×T—8~(Õ–%b€ÞÞ¿·'Æ &â»$?9??÷ÛÑߥ w¿b l€Þ¢³ƒý7ñ]”_W[¹aÝj ”ˆz#†anüGK“\U^XY^˜åvõÄj TÛ”ˆzkW¯ˆ óDLšÒV'ÖÕVQ¦Â½žL? (5[¢èýð=®4ÕÕU¥Ìø0û½[æ¶e”1@o@ÿ¾Úw4 sâ`ñ]Q–×Ðð:7í•»™ºþß.JµÁ«»ÂèÍž5Í×Ã1ßÅy 5ÕåÔVÇ…X;>9`§¿(5ûаz#†ñÌPqk’«* ËKrÓâ|\^œ¤În÷¦m¥„Ðë¬ræÔ¡¬ÔˆÂœxXL—e¾~]_˜“èïpËÁpŸ½Á^ T<á6@oô¨‘æ&“&¹º²¸¢475ÆÓùÅqƒ½ö÷¥ æ]1>@¯çÍk瑵&™RÙðúunz„·õƒ}ì`¶Q”1@OmÇæ¤¸àÂÜXL—¦Õ×ÕT”æ…y>vzzˆÎRm°­>@¯ß#½ÛˆI“\Q–ßÐГæiyÉñÉAÃý@)¨y:@¯³ÊÑÃ{²Ò"7ñ]Z”ñúu}IAZ³ŽÓÓƒ¬Î®­¢”ˆz+—/Žyå[”›‹é’üÔºÚªªŠ¢˜ ‹—ÏŽ¾4: ”jƒ6@NxÏž:Œ˜4Éå%9 ¯ë‹r“üµ^a (5GÂè)))mùc]r\â&¾K Óëëj¨³ ÷2¤ÎΉÕÙµQ”q Ç”ÉÝœ-‹òañ][S^QšŸåêfzÆùù1 T”‰‰‰À^j«÷íù+9>1ߥEé¯ëkËŠ³Ã<»¼8ÎÊP ’ôƒE 熹!n⻸ ¹®¶Š:»ø0;—'˜Î®m¢”ˆ[8F jijXœ—‹ïêÊ’ªŠâŒx?›«®Æ§8GPªMðŽ3F`¦Ö­ù5&Â1ߥiìÞ☠W“S.Æ'RP³¯{¤Ï¸Ǹ;[!nMr]M3%ÚÝËò’++˜m¥DÝÂ1 ŸÎ½Åùɰø®ª(lhhÈKôwÐr7=ëfr(ÕÖ%t€ÞÏÓý¼“&¸õyuEqâ+GO‹‹n¦g€RPó$ò‘>CŸ?ÕCÜšäêÊ fF‚¿¯íu·7]E)¡ÏX~úhvFlq~ ,¦Ù÷Á¾.ÉO qÕó0?ïnv(ÕÖ”••µyófõíè¯-Íž"&MrMu5×éñ¾¾¶×<ÌϹ›©¥ æ]1öHŸÞ½zÞºq Yk’«*Ѝ³+ÈŠ pºËîìÔÛ,J {Ær{%¥j[S_•¤Âbº¬$ëu}]yIn¤Ÿ±—å%:wJµÁÞcÇŽ <á0 ßãG÷“&™õ”ƒ’ÜÜôÇÛž¬L]JAÍ“ˆGú?²?'3qߥy ìzឆ\][D)ÏXþuŒب@-M€¨¢Ìúºj:qN³÷¶¾êeu(Õ¥¡¡!°­¦^õ3Ç“&¹’}u·8/9ÌÓÀÛZÃËê2P jž„=Ò§½’ÒÖÍëqÅ éW j«Ê c‚,ù:»¶…R"èM2ÉÃÕ¶´0 ×Åu5•Õ•¥i±^þ·|l®¥Ú „ У¶úÀ¾iIHŠøf?Ö¯žN{£üM|m¯³3”‚š#ô/š÷*ÄqßåÅYì+¥É‘.¾¶7uvm¥D ÐûrÄ0+óg¥…é°ø®©.«ª(ÊN tÖñ³¿ékw(ÕÖ$b€Þúµ«â¢ƒñ]^œ]Ï:á-Jsð³×ôµ» ”‚š}Å@ؽñãÆz¸Ú!nMr] 빈‰þNwüXÁl£(%r€^ÿûÚ·J 3`ñ]]QòOCCaN|˜§¿ãm?‡[@©¶&ôæÌžà늘4ÁÅYuµÕ5Uei±^A/µý´€RPó$b€Þ—#†?ÓGÜšdJ%9'5<Ôý‘¿£«³k«(%b€Þ¹³'ò²“ÊŠ2a1M§Ì ¯Ëв¢üM_Þ#DJµ5‰ 7ÊÚâ9bÒ$×ÕTP[êþ0Ðén€ã Ô¼+Âèõº­©¬5ÉÕ•% Åy)¯¼Ÿ¼íìÚ.J üE¯½’Ò.µíéÉ1„°˜®,+xýº¾²¼ !Ü!Øå~³6Pªmžó ¼-jÀ€þ†úºˆI“\[UN*ÈŽ§¶:ˆÉP j®^%îÜYåıƒyÙɈ›ø®*/nx]_VœlôŸÎ®í¢?¢ÿ¶rYBLhyq,¦+Ks_××¢§Æz…¸é»>JµY™˜˜ðžðöîu^ý$bÒ$WW3_‹ ²dgJ(½ã9ïƒöJÛ¶lÌH‰AÜšÒÙå½~]_U^˜éòŸ`¶y”â>´¦MìåîX^œ ‹íÜúºššêòÌÄÀp¯'¡î€Rm\ººº\oÐkwpÿßì¶I×•å… ¯_W”æ'¼r õÐu”‚Þ]IIIÿ ÷Ë‚ˆ0Ä­ Ád_1 Î.=Î'ŒÌG@)a(uóôÖò’XL×ÕTÖV—çeDEú½÷4óx ”‚¸QªWwå¤p$EL³~"¯¯£L¥Äx„{†y¥ )¡”•þE$NlçÕ×US0³SB_ùp||ØóÅ…²¢ìʲ|¸º¢ðõ뺚êò¬äà˜ ‹è@s $>JQ‹à¤mvsc\Òĸ¶º¬¡¡¡¬8;9Ò%&Ð":À (É¥‚]õltvØÜF$ßvv¬§TW–¤'ø±:;V0RÍG©`·‡®/Ô,-H¯*/hÃ.z]_[WS™—jl”‚šRÔb¹êYßÛæjضUPÃz¬ß몊âôxߨ`ëØ K Ô‚(EÝKÃcnOO—ç´å`VW½~]G]Njx\ˆõ›Î(õÎ(â®ïc}ÓôêÚ¼ô¨ªòÂ6èúºšºÚª¢Ü¤Äˆ—ñ¡¶q!6@)¨Ù(âþ(Ôã±ã£ƒ^fåŹm0P,ˆbЫÊN ‰³c (µý?ÁJµJE˜EZ¸<=éøðPiAzMU©âúu}m}]MYQfVRPz¼P j”Š 0åýÌüæánO:Pµ5¬ŸÈ©­.ÌNÈHðO÷JAŠ‹RLú×ñáAOã‹eÅÙŠÝÙ½®£Î®$?-31ðmg”jy”Š ² tÒ1¹º6Æß²¦ºLá\OU[]Y–Ÿ“ö*3)Ý쥠C©h‰`k—''íu÷æ¦E*`¦*êYmuA˜Ps ”‚ZJ±:»`+«›ÔÙ%G¸)bgÇ@TyINNJèÛ`¥ä¥bClèHsÒ?LvR¨Â@T]5óëC~VLvJHVr0P ’”Š ± qydvcC Ýݲâ…j««YmujXVrP je(E]¤¯©­Î.gƒYq tÅ€¾uUyanF$«³û7˜@)ùB©¸P»ø0‡P·Ç·¶ÚÝ+/É«­)—[××UDÕVWå%礽¢f(ÉJÅ…ÚS¦<Í.›^]—úRžEf~"¯,/ÈÏŒÉI ÏN JA­¥˜Î.ÈI×üÆÆ0ýªŠ"ùîìªÿih¨©*-ÌIÈI Ïf:; ”|£TB¸Sb„³—¹†éµuñÁvµ5rçZ‚¨×Ôæ—fäeDå¦G¥ yF©„WN1Vzû*ÌNÃL1'¼Õì¶:/#27-(µz”¢`Ƈ9º¿8g¥õgZŒ¯<“}Å ®¶ª$?õmg”R$”¢F2.ØÖIÿ05þ™ Aµ5•òáj‚(¢¨ò’Ü‚¬X:wJA RìL¹†¹˜ßÜhw¯´0[N2E§$tÂ[WSYœŸšŸ“— ”‚ÚJ1]L ¥­öN7£³yéÑòÒÙÕ¾éìÊŠ²òY]4PJAQŠöHJ´G¸Çë»;œÊJ&6nA³«úÚªò¢ÜÄ‚ìx ¤p(•ížéæcyÃXc5UYaN‹fª†NxÙƒ^³ s ²ã€RPÛD)¦³ vÖ³¸ù‡»ÑÙüŒ˜îìØF¬(Ëg3(Õ P*5Ö‹ÚϯgÖwÿj) "†"8¯®(.ÎM*ÌŽ'¥ E©”ÏÔXï”h/_kM“«kZ¨8Wws˜@±3”‚Ú4J1]ˆ‹¾…f‹U»³c]1ÈIätv@©VƒR´³h—EzÛÜS# Êˆõ#´‘^×Ñ7ª©./ÊK¦¦þ?JA ‹Riq¾é þô¯ŸUvIAºŒ2Å‚(æ„7ž'S@)(ÅîìÂÜ ,47»?;››!«ÎŽõø‘êÊböÏ.<ÁJÉJi¨ïúü³[Ö/nJÑŽ#V‰ö3³×Ýk~sÓ+gåŹ´÷¥âz‚¨†ÚšÊ’ü´‚¬8AJA-ŒR~/Ìž>î«áŸ=¾w¦(•‘™Dí¶¿í“«k] O&…»H+Pu5L[]U^ÄúÕ@P¦€RP«A©›—QgwlÿÍC) &üáîO­îl·Òú36Àº²¬HJÁ|ͺbÐ@É,ÎKL ”¡”¯“®R»÷ib‡í¿>ØÇéQóPŠXjfé#oó«/®¬ò2¹œÀzH¦äLÇk€^Q&ëa Ô¢(µsÛÊöJíhz×.Êj[V6¥¨ÅÎN £c8Ê×ÌÙàe*ôåÃ’‚L ª¡¡þf€^n’ÈL¥ Ö€RÖÏ4>èО&vêôÁ”Ißyäé ÿŽ(U˜“X”—LvFB`¨‹¾ö.cÕ>×S£¼ÙC;ëEºáÍ3–³béhiªRP ¢T˜§áês”•;rÊÐßÛ6­xw”*ÊM*ÎK)ÉOKqð2¹bv}=»é6,ÈŠo,P,ˆâ<öéJA R¡žO«qwv*ÊÇýÆßÍèQª07©(/…:»´XŸ@»{Ö··›ßÜäo};#.°Ñ`2]Eis•©YPJ.P*Ì뉗ƒîWÃwà:•&b×Ö<%”*)H/-Ê$Þ.ÈŒö5s1JQggg¬ùé JìIï¿÷^ï^ÝjH¥J ßtv¹éQžÏ)’†§Øëî ²×I w£Ìò³²¬  +öÝ:; ”¼ 3>t놥ܧÒDì«VÌò4‘J•—ärœ‘øÊó¹‡ñ Í-Ï/®d~°`¿A¯œº :<ÞÑ@)¨eQŠŽWkí!ƒ?æþ±¯g®·4ŽK¥8*)ÈL‰t§›Zo ”•ÖŸ>×óÓcXõ+ÍËËŒ~×L¥ VRÔÙº.š7¥³Ê¿?öuí¢²}óoþV’B)îÎ.-Æ7ÌÕÀÍè¬Ùõõƫݟ©'…»üÃôA%‰Î(%_(áglxÿ|·®9… Ý»uírìÀŸB©¦"1ìez´u ÔbKÄ@)¨ÅQŠyÂÚßæ«pÿØ×©ãŸbñüŽ„PJ°³“C£|L¨ª4¯Ä2”‚ZJ1Ýõ=ÜòôèÞõöµ“B)ÁÁ,ÈŒ‹ ²ËK.)H“\g”’;”Šô7ñs69b÷};~ðÉ Ɔ·Þ¥¨åîœäp:Y$)¥ 9@)j¦ôVš{ç*+w\¾dN¨¯Õ»¢”HSU%( ÔzP*ÒßÔÑ\û³O>jÿöÇ>&˜_5ÔÑòỢ”È`f±²,¹l¥ä¥˜‡!lÛ´’ûTšý{_§Ÿ&Œ ð0o6J‰v6¡TA:k93P ’ ”Š 0÷pxôÅ烸ì{ï½ÿ£LܳµÙ(Õh¦X(%É@¥ V…RÌPï¿ÌŸÆÓÙuêôÁŠ¥sÃýl›R¢ÍB©œDI(%¯(deôP£WÏîœËS]ºt™4iÒ´©SÔþ\ÿÊ­É(E-¿H³Q*uHHÐ@)H>PŠyŸüÚéíS§HC† ™1cúØ1ß=}¤Ù”jÌTUI (µ*”b† ­yªsge¥vo.O©ªªN™2yâÄñ'ìjJ5LB)гä;; ”\¢3>tß®MŸ}ú‰©©iCC}mMy]måë×u×®^½~ù¤äQ*?•%Q¥ 9B©Ø[/§'“Æ¿háBÖ“ëª)SôGXXè.µív%RP j…(EÝ+?‹?Ö-û曑ÎÎÎÔDZ:»ºªääduõ³ÚZ¥‚Rïì€RrŒR´SêëkJKÒ óã&VVäûúúöëû៛ׄú;ŠƒRú-J…HÖ@)H®P*.Ôžp¨¦¦¬° “©’âÔÚÚ õ³g‡ ¬u]]”'Sl”’x €RP+D)êìèØ¦³›’¢T®Î.¹ª²ÐÁÁ¾jï#ÔbÂÜÅA©FÍF©xÉg(Õ¢(eb¤ûÒò¾0”¢¼¢,'?7šŽ«¢‚D:´—•d½÷îÝK¹SÇ9?Oóp6…RÔò7æìä°âü"‰(É¥"|_ÜÐPRu5•…y±”©¢üN ÈÕUÅÇïÔ©c·n]ŽÜá- ¥Ä0UUJA ŠRz÷5}_ê C)VjŠÓ™ÎŽ;˜åe9&&&ݺvQQQþmå/^v¢PJŒ`fÅS¢¥L T  ”—‡ÓÐ!Ÿ]<µS J –sPª´8­¬4“qeE>Ñgˆ÷¨o¾ÒÓ¹)¥èkÔ,”ÊK¦ƒAâJA²D©èóK—Î9|°½é-(UY^Hí3¥JKÒ9™ª««Z°`{hv‡Î*Ê«~]äãÈRâŠÌB)) ()(J9ØÛ ú¸¿î­QŠûº+˜\]uU“ú÷Þ{¯cǦNž`ú\O J‰ãB©¬Xi(Õ(U\˜éïe1cê¸s&±ó¿Î¸¼$·¬4‹¥*ÊóSËO ×(?ånݺž>y(Øßõ?(%† ¥¨|&‹|$n $S”ªª,{¤}þóÏž9ú'?J%G{Pp 8(U^šÍª²¢àõë:UUÕ·£üXíö´)éÞÊJü¥ÄËUU:JA ‰RU¥ŽOF}=lÃêEÁžF<(•îD§9%Åi”â“\__;iÒ$ÎÂ;«¨ ÐïÒù“Qa>ÿ¢”xÁ$”ÊÏŠ•f0R-€R™éI+–/16¼~ôàÖaC?}¢{¥’"]+Jójk+ÊJ28(UUYX]URS]šý¿ÿJ©];jÿ?Ðÿï]úy;—¤‰cJå&Ó‘ ¥ Y¢TNNÖ’E3,tæÌš¸pÎd?gCž×S£W[]A!¢v›A©ÊŠ|:ó¥LÕÕU_¸p'S**ÊJJJÓ§þtëÆ¥Ô„13ÅB)é ()"JæÏœ>ÙÞ\{Û+¾9Ôêù-ž×§ÄxV•ÕT—•²;;¥˜Î®¶¦Ü××—'˜Xj?ø³OΞ>ä%f0Y(•+ýÎ(%k”"Øn×îýý»7<¸4òË/vm_ÍRÌ‹c²Sê+Ké”™5쨶‚N«ëëk˜WZoÙü5õÿãÓÿýßÿ)+wêÞ­Ûúµ«lM ÚE˜RI‰R1P ’-J±šˆú>}tåÐÞÍC‡|úTïÏëŒé ¥(/¹¾Ž¢ºÚJrýÛL•”÷îÝ›ÎGø3Õ±cG%¥vߎþæÊ¥³1‘¢3EU•V Þd ()JQÇ­Ü©ãÅ3ß½yr蟪WãF)æÅ1¹é‘µ5”M¾ÎîŸ)S& ìì(•”Í>ª½ÿÞµÝÝÅFt0Ù(#ýÎ(%S”*/ɹ ~”ùt¸Ñ&On®X:ûÛQ#< ø_gœëC‡çNò2ÖãȲò³b­MO<ÿ÷Þ{ï‚Ô¹³Š²²òŠe‹…foP*Á_JJA2C©Êв/‡¦Oé eÚ:½»ç¿1d÷Ž5Ü(ÅyqLfRPAvü›L±GRÓ¿©q×®œVíÝ«³ vûíép‡ôW?},;#N(JI-P@)HáPªºªl㺕̧ æN5y¢9cÚ¸Eó¦¸?ç1uy™Ño;»L桸yцµFó•r§NƒùÞÿý±sAØÉ¥¢¥ßÙ¥dR‰Q7¯&V§ݺv¾qåÈ™ã;ûõUÕ8€¥D¿8&ÐÇñ÷_—µoß¾³ŠÊÿ„ˆ³ÛšÅy)<ÎN"”JÌHð“’RÌPŠNiýÜŒV.›Ã”7v”Ñã«K™5bøçv¦:MzñSý»£GìС=ó 40%>œ?Sl”ò“f¦€R"¡TMuytˆýñCÛè‡ èÿ¡îõÝ;Ö ú¸¿Î­3<(%úÅ1^®VóæÌTRRRr²ÃîL»º;Ûð“RQÒïì€R-€RA^/lÌîú)Sì·ó]ÿãèáÃ[<»ÓÔ×è._ºHYY¹sgLÕGµwQ^ ¥ s¨q–¢R¬P*ÔÇ$Ðóù…Ó»™Ç›ÓŠÆùƒgOìþx`¿Íë—{›5éuÆQa^7¯]?n,ûFÄŽü4uöôQþLQU¥( ¤€(EÁ4Ò¿òÑ€™ëÆÛ·¬ÒÑRÿzäÐi“tµ{ܤ×g&¿z¤{{ÞÜYíÛ·ÈT”Yþ`JÑìÒïì€R-ƒR~îFž/ ~]6÷Í[-º«yúäá¿~Ô÷×eóüÜŒ›ü:ãÜd “'ëÖüÖ½[7ÎaöÞ{ﱎ®Üdg'…²PŠ–,M¥ Y¢”¯ë“ç¯ òæ eÅÒ9ú÷/QÄú~ØûÔÑâ£çaÉqaš×/MŸú++wâÜ@¥¯w—?S,”’v €R¢”ŸÛSgÛ‡³¦O`JŽùn¤îs{wn¤`nÞ°2Ôײɯ3ÎM¦ ®Xú ÷„víÚ­^µ‚?˜,”J”~g”jI”rµ{tîÔîNì[^Û½ÿþÂyÓïß>·nõ’ûô:z`{Q*‰c·—VÛ·mê£Ú{ÎÏ3’ãB¹?bÌ TÓ8KÏ@)H¶(åéd`g¦óËüéLù^=»ïÙ¹AëúÉ)?ýðé'MžÞnJý›—´h;×çÏÕ½[×kWÔùE¦ªJ=P@)H1QÊ󥡫þÞ˜û:vìðë²y÷µÔ—-™CÝËÇšˆRÿÚÂÄ}¡ë¦ «)§üÁ$”¢hË0˜@)Y µáUÅ‘Áö”r²~ðDOcÈàAo^dÜYeíïK45NLŸ:¾j¯‡ÚWÄD©&™…RÙñ„:Ò6P ’*J…{•¤çç${›0(ålóÐÑJ÷èmœAyC‡|zúØ®ÃûþüdÐGófO ô´¥šš)JI?P@)HQP*+%´¢¬0ÌÏ’ƒRÔÙÝÓ<ݯï›'¹õìÑMíϵW/ùþÛ‘”MS£{b¡TƒYŸ›!Ã`¥dRa^ObClª*Š’ã9(eg~ß䩿ª• :~Йq@ÿÿVÛpêèîáÃ>Ÿ1m¢…¾ÄQŠú : ºR4QŠyE£²¼(ÔßšƒR6¦Ú:·Î~ÿíWœyš0æÒ¹ƒ›Ö­PUí¹sû†Èà—G)Y ()JQg—îT]YáÁA)[3§¯.Z0ãý÷ß{sË'Gl?°gë ,Y4ÛÛÅLâ(EénéÎ(%y”¢óè?Ö.ÎKótzÊ ”•ñ]S#-jü'ÿž3ûèo¾T?¹oÓú_ûõí3ô‹ÁuoG©¦™…RYq´ëe` $m”¢c&>Ô®ª¢8!ÚƒRÏï?¹uüÐöûôbfÿ CûÅ g]R?ôóÌÉÝ»uݸn¥¯»¥p”jšY(%“@¥ EA)êì¢üÍJ 3³ÒãÜ ”²|q×äé­[WO|5â Îì“'ý@Á\µrsþœéÆzÂQªi~ƒR-ÜÙ¥¤‚RÌÓâ|*ÊKü½¬8(õÂàæÓ‡×ŽVûdÐf ï¿÷ÞÌiÏÜ¿yê/†|FLuíÒI>”ŠoªÙ(›ã!¥  1CT€YQnR^vª‹ýcJ=Ó¿n¨§ñëòù¼½äÛ»Wõ«—Ÿ;u`áü™Ýºu]¶xž£J5#Sl”òa¦€R ÓÙ••z»špPêùãOô®îÙ¹©j¯·Ook¿pîŒKê‡Wÿ¶xàGý6H÷îU>”jr0Ù(ÞÒPJŠ(éoj[Y^ÌRúººw.¬]µXEåÍ ¡íÛ÷ýéc{íÛñãßvî¬rhÿθ(¿wA©ü¬XÚï²1P ’J1¯3N÷+/+öv5çF©‡:—5¯œ˜ÀuÉ·WÏî+–ο¡qzõoKôïKç)zÚ7Þ¥d( ¤X(éošðêeueID¨'7J=º…:»EógG1ËQVî8}ê„ógïÚñÇ×#GôèÑí¢úÑôÄwB©Ô°–îì€RÒE)æuÆD5E9öVúÜ(uOóì•ó‡§MÏýHó±ß:vx×M3óçÎìÕ³ÇWù¹M5Õl”ŠI‰v“RÌP**À<>Ü¡ª¼(&2ÀìÙJéÞ¾pGóì=[?ýd ×;Á;-œ7ëæÕ³‡÷«};zdß¾}nh¨g$¿jF¦Ø(å&ÃL¥ EB) fL°Uq^JVF’Ùn”¢Îîüéýã~ÍYÚûï½7aܘógk\81uÊêìöîþ32Ô«Ád£ThKwv@)Y TLUj¬7kèhD ñ“Û”Òº~úÆ•'ïóÝ×ï¿ÿ/P}9bèþ=Ûõîߨ°î×Þ½{~òÉÀÓ'ù9’‰iJeưvºÌ ”‚d…RÌëŒé„´´¤ÈÓÕ’¥4¯ž¢Lm\»òãý9‹ýàƒ3§ÿtóš:1ÕÔÉ:uì¸pÁì{ZÉáâgŠª*Ó@¥ EC)æuÆ™IAÔÙ…{=Ó¿ÁA)¦³Û·{먯Gp/vÌ÷£Nß§sçÊÊe »víòÕWÃ.?ê)~0 ¥²SB[º³JÉ¥bClâáK‹ }½œ˜£ëö3wnž½sSý®æ¹KçÏ=탸¶É€¿þÜdcaxGóâ’_æöQí5ø³O.;âI˜$Úl”ЦÖXvJA²E©ØÛä(÷ò’Üœ¬4K“‡ J½ÍÔ¹»·Îïß³í믆s“'»¡qÆÂäÑá;§L¯Ü©ãÂù³Þ×l4Pd6J¹ÊÒ@)HQŠ:»„WNE¹I%Å….Žfüú©ýS'ç¾z0lèç‡÷«ÙZ>¹rñÄü¹3»wë:ê›/oh¨'Dû7Ì·(Õ²PJv(żá‘ÿÒÂŒ‚üksCÝ;ܽôàîe½{Wô´5j_½ûÒÚß—öìѳ õ9³§_½|ÊÓÕ⑞æâ_æöèÑí»o¿¾xîxDˆg^fŒ@g%…æeD³šbY(É¥˜×³Î‚«Ê¢#‚ i¾Í+P¬Lé\Ó8œŠ34›ôÉ [7¯52¸çêdræäúTY¹Óòe‹ôîk T¥d( ¤˜(Åtv)1ž¥yY©¦Ïty;;kwnœ_ºx÷ÛÐz÷îùËÂ9:w4¼Ü,µn^˜7gsê” ÄTñÑþ‚I(••ÒÒPJÖ(żÎ8#1 ª¢891æÅÓ{\7лaðð¦áCÍ'n=Ñ×zúøÎß;·¨s¯‹@}ëW‰+¯‚]Þ¿¹rù¢ž=»Ÿ>~€‰ßYI!yQ´»el ${”bÞššŸ[R\àëúøÁµÇXbeŠõHë‰þíû÷4V,_Ô¥Kgî£â³Ïíúk³¹¯‡õ¹3‡§O¤¢¢äã$0S¬ÎEæJAŠ‹RL0‰sjªÊ£"‚žÜþ·³{Lêì¶l^óñÀ½¹×®¬ÜiÁ¼Y¹Qü&”ÊM¤}-{¥ –B)æuÆt\Y^XVZànA2yHM1+Sæo2eciH¼´S&´k׎û8éÙ³‡És=™¢ª¶H €RP+@)êìÒãýÊŠ²¨³‹‰ ¶µ4䦵…¡ƒí³Ó'ö/˜?«{÷®ÜkWQQ&”LB©Ì¤ –îì€R-ŒRÌ3‹óS_××f¤%úxØ:Ú9ÚòÒÙ¥ä¥è“€YHF;·Å ”‚Z¥$bªª< (µ”’ˆ ¥h±òÒÙ¥€R@)(”JA@) ”‚£TfR°DL(EÇX µº-o Ô’(%©LQUå#P@)¨5 ”¤‚ÉB©Xoyéì€Rò‚RAñ”¢UËRP‹¢”dÌB)ùP j(%³QÊKž‚ ”je(h.JA­¥Ìå%S@)(õ/JyÊS0R-ŒR‰’2 ¥’‚h·ÊRP  ”3EU•§@¥ F) “P*5ÆSž‚ ”jq” ”R@) ”EJ¥€R’C)‰(”âE)É9+!(3)[92P ’1JIÔTUù P RT”’d0 ¥R¢Ýåµ³JI¥ŽØ>滯Ç~ÿÍþ¿·F9QË/A¥€Rm ¥B}­æÎžB™š1u‚ö­ ’ T:P (”j.JmÙø+ÓÙ=¹7!ÂC²ÁJµe”š>eÜÌß~Ù¡uríÕ£—Nûý(MÅûIÊ„R‰ÔÒÊ—RtPÊÁR¯ß 6ŸÛ¿õæ±Å'·}¥|¨u•_¥ É¡ejâ¸ïœÚÂdеìÙ‰1»—Θ:A"z‹R†òl $o(EÁÜ»sÓè¥Ó8Á$3·Ç†9K¥œä¾³JI¥’"].=Ð{ø ±j‹ç=:0æðÊî_~|Iý`J´‡DL(•çCM«\(I¥¢ƒ¦O?xÆ÷³®nŸqcû×Îÿú«ažNÏ$•)ªª¼ (ÉJQg§¶mmÿï‡N8´jŽÎžïö.íúE½{—%LB©„WŽrßÙ¥¤…RÉQnO^Ÿ;{Š’R»1ß}­wïRr´»¤œ™˜çæùX® ”‚$ú¾˜P§3Çw2è£~}U)YþfÌ¥˹R¢uvwož8þ{•Nô¯ÉÓÛ æ[”’óÎ(%E”JŽr—’Y(ëE»OÎ ”‚$ù:c©ŠÌB)ùP ’K”’^0Y(î 8PJ(%-J¥Æz…2M«<(”’$JI1STUP ’S”’–”RœÎ(%a”¢–_zf£”'5ªòo PJR(%U³PJ”‚ä ¥¤LJ…Ù)^0RC))š…R1ž!T+0P (%”’n¦¨ª ( $o(%EJŇÚ)^0RA©©:3žPʃvœB(”’JI9Sl”ÒSœL¥ ù@))ó-J)Z0R’@)i›P*%Úƒ…(Šb PêÝPJÚ¦ª*R ¤ŒR«WÿŽC(%JIÛ„Rq¡¶ŠLé ÔG JI¥Üi¯)Œ¥ŒR¥…éhRïŒRº d©¢Ô’E³êj*qô¥ä¥l/˜ÒA©~}U+JóÚ J½z)m¿A)—û d©¢T|˜mQ^2šÇV‹RÒÏ ¥+PÒD©_æOK‰v­®,Å ”…RÒ& ¥B¬/˜RB©{'„Û—e¶”¢LÚΈLŽvböš¢XÊ(E.ÈŽE Ù*QJ¦ª*X ¤ŒR¨Ä§ªŠ"Ã@)a(%JņX+lg'y”b:»âüÔÖŽRŽ20 ¥¢\i)–¥R伌4’­ ¥d’)J)Z ¤Rd:®,/Àa ”€R2 & ¥‚­¶³“J‘ sZ1JŇ;ÊÀ,”Št |©­h–:J‘ââ'PJ|”’M¦¨ª (©£9)Òùu}Žd JÉ&˜,” ²RØÎNŠ(E–ç‹ÆïŠR2qF|¥î)œe€R‰N¸c¶U¡”LÌF)Å ” PŠœ•Œ#(Å‹R21¥,¶³“.J¥D»ÊíiŽh”23¼âlyW8JÙËÆl”r¡VTá,”"§Çû44¼Fk©(uÿæQ‘(%#³PJ%”°Ž6ˆRFzç¼t…£”Œ‚ÉF) …í줋Rò|š#¥ztï¢Ü©ãµó{¢µü²1¡TR¤3í)E´ P · + Ji]ÞOÓ¿þ™«µ¶@”’™©ª (Ù TB¸=ôµ”ò°ÓVj÷>õwµÏ D)™“P*&ÈBa;;©£”ÜÞ‚.¥ô‹>ú}Åœ`O#>”’‘Y(áàx[-”¢–¿¾® ¦ü_•Ú²~1}¤¬Üñîµ#|(%»L±PJ1ÅÊ”ôQ ?󵵫RWÏíVîÔ‘>Ú¹í7A(%#³P*Ð\a;;Y TR¤³þ Óè½R^ºS&~GŸü±ÕsM.”²•™Ù(õ’v“‚úQêÅÝí³')¥Èù™Ñh0â^©Ç÷μ=C™âõœ ¥dgªªâêÝQêÖ™Uý?ì&¥È¸0Õ¦î•r¶¼ûÕðÁôéw£†»Ûéq¡”ì‚I(h¦ØÝ; ÔÍ-?ŒúT4JÉçïïbÞv¾oç:¥vïÓ©ôå³{”’¥ß ”ƒ–‚ºÙ(eõp÷æU“;} Ä½›””Ú <ºä“ÕRo;÷qÔ7ökÖ}#>w²Ôa£”L3ÅB)… Ô» ”þµ?&ò¿ÿjåÒÙ8=J1݆Ջ¨@î]Þ=Ë ”,ÍB©3Åîìš…R&Új«ýÐîý÷¸wÓ'÷Ì´8/E©?cÃûç ìGÅÍ›îk&c”J|õÒÏþ–"»É(µgËìn]:þOsfNxtá^YB)æ¶ó]ÛV)µk§¢Üñʹ}²G)T“QÊèö_‹f}û?Aº¯uZ` ð»yD)êìî^?J(EÅ6­]"{”Šò7Uìl6¥lô÷nù}*ÏF›×/ÖÙ•—ä((JEú›ø9Ìž1JØßÖäN,JËÄl”r¢ÆS‘Ý”:¹gɧ{ ló×þ¶0Âß\ØÑ•ãŽ6SPŠÚÌ'ºû~ÈÚ×+ÿîk*³L±QJ¡Õ”2×Ýóûâñ:¶çTÏ]µ®(ù0 $ ”Šô7u·ÓûnÔ*9rÄOÇÇ2 æ[”Räl6¥ön«Ú³30•”ÚíØò›ˆ`f&(.J1·«ßI§Òd"v7£˜`+i;#Þ?1Ü‘vB[”Ò<»~ä°!jÎ̉.¶z"-Æ8‰V,”Š 0÷s}Êœ¡Si^9,ƒ@‘Y(¥ð ¥¶­™Ñ­K'þ@©(w:´÷'&òÙbC²A)æ¶óÝ;Ö°•ŽôG˜¯‰ ‚™Ÿåo¢ðÙ¥ÎúõӪ®x¿4Ì„p{B©?úpܘ‘.VÚ<C°1¾óÝèÌÊDV4Eª&”Jw$Qt‹@©§·wûnˆÀãêûo¿´0Òl¢äó²'PŠ¥ôïžTj÷¾Ú–•¼Ï• ²¢1¿)P²(_ÒÎUµJ4JÞ·BµW'¼›×/ ò|.N #œpT·z”òsÖSîÔqþìIÞzÿyBÕS½Ë_|>ˆ9ÓѾyRÚÁd£”±âSJé\Þ*ìŠÁ´É?ˆsÅ@G…ˆF©¿¶¬`óR—Z'¹PÊ’±æåÃLã?rħz—8Ó%n6J9P³©èˆRfºæÏøNàqõÅO„ÝÅ!ÌÙqh6å¥<ít¾ö}4nì×¾N¸PŠe×§›Ö¾yêÅê•óé¿ÒË ¥?PÂPêÚé Ÿ~ÜG`¦~™?­Ñ^ãmmáªÔÒ…ÓhúÇõ}¡™ ¥ÞäåøÁm*ʬ;WÇÿ0ÊÆø¶ô‚ÉB)¿­´³S7º»gü÷_»bð\ÿj“‚YZ˜®@?ðiidno\³ˆA©ÿßÞ™‡WU¤i¼ÿ˜¦{lmÜXD@AQh¡AY#‹„}“} {B „„°IX„$²Â–°ï7ºmTf´»íyzf˜ïÞ Õ‡sªÎ=w?çæý=ßÃî­³Ü:õU½õÕr”öÑÙ¢™SGþªF JЧgçS噪±¯?#)U~îàzËÛÃ¥ë`Î’ #º×¨ñ/ÚrõlÝgÖ­šïT¹Âf8–à»t,kò¸¬‡²}S«±•v (…ªk6¬0Îdo8Ýj 8T•OýSJe¬ ½Õ‹²oYIª >…Ho5à‹‹™þ裿ùU_FGNÒ:æ…c¹ÔÁá=ú¯7“¤Ô'Н±Û³=fXÿžŠ˜p­‘¹RÇöomÓº9[¸-Kôa÷ v¶Èy¤¬H_y^Jý{9=š0VºŽíZ>¹­ß>êò™ýéúqT›æŸ+µyÝÂGíÜSG Ë|êÆ%õê>m_âñ,ýí)Å¥TaÚ‚ÞÝ^ÖÕ-_mº#m•k…Hoµš+µ7o}ÓQ‚nAí„b‰z:l:º—z:6)u¾(»ò¼eGö¨ù›.úX¹lŽËŽùõ—¬%¥ØL¼Ù3Ʋ]š“Ö, Å®µí›ã›¾ÈÆ”Ÿž9ùBEŽ0™ FRêóÊ鹆-}wlgjÉÖ,œÂ)ei)uõ|á‰Òô¶z('˶k‹ý•3…‘3Ç=Z5¬Ðjˆ%žr(2ºÕ€q¨Cˇè,Œî¾Ð¨¾þ=H)H)Õ´ó˧òÆìÇfçf¬º5‚¼§³cꈪ÷Èlˆþ“eÛõëÆÆÐíõv¸Ìõœ2»”²¼Cß½:,¤¯¬Ã»4æ÷ RªºI)6í-ìðN3È#^H©ê&¥ºvn3K)nÔ…a‡ŒÙüTæPWÏgºË¾>·Õ– ‹]sÌRÊ’Ž¹}cd»ÖM}1°œ”êЮ}Þ¦U³ã¥év)õO#Õû­Žö*ý—3¦ §J^•€ÕöTç³KP+@r׎µ²ÄB³I©+¥gö­±–íÍŠ> “lÍ‚ûS8 ¥,'¥Jv¾_õöùé£?©êžüÓ¨ú}¾a=û@^={U,õê•ð¨oÛÖÍc£Cí='|Ê&¥¬æPdI aÍš6uxïH))¥ÚWªiÛNG½zt8w$KÛ„±7fÚ{:uÜ*'}e· ×Ù%È‹©e´wvœpL›”:›g9Ç,J[нsKYÄÀE3À7éÁÂí-ër¡XeTrX•Niãêhmn'J3¦ŒÌöUàšŠ×9„“R§÷­¶ŠUìJ˜8Ê+k°‚ÕøÊŠ6¶h^µµ9…¶´Ïž1– äuëòú¡’Í:~±-eëÎ(5•þ!ÜèV-äPd;7ÍíÜ®¹°®îÜá5ã{Øb3H)aTêⱬ}‚l[K5¬'l˜¨dajòÈõtœ‹|pøàžÌ‹¹¦Ú•½ÖˆcÚ¥T®…³,oéð¼·è#6CÈøà=&&|õÂ.­-ŽžÆ´iݼ(û}anÛR–R1ce’‰4ú/}¨sÈ-&¥ö®¶„…Oî/›Â5k‚§pàÆÖ+5yü ¾ù­¶À/M'§`!_r:ê&ëx}¿x&é.JÌ®KUý»³'–—lÒ9Ê&¥,âP{2Ëv9x¹é ^êð*íÿç(ØÕd®Ôêe³ÙÖRäAZ¯¹|*oöŒ1¼§£ïbdV¿;°oׇ}õ›H›”:“k Ǭ(JÐÙåÀS‹>¬ÒÇ18íüø4álÑüÅòÝ)WÏ©ìÜáÌq#ú²ó ìû¦0ÊŠ²ÖÐ!JM5{úaÊ[Ÿ]øôÊþS{WšÜŽ«óôo½ºfÁZ{éCJéL;ß¼.æAe°ØïLK wc®ñîì —Oæê;%X7»wŽJME^&LL·j~‡:˜»dÌÛA²=l½ÚáåöçÏΠTW)Eݾ¼ Ìï¨É£vMë;Ô’—±ž5aô_‡ (5Uü¢™Â”ßݺññ™óûfÔôAµü10aÇè ¾ó6›=}4/Þ°jûDeûòÖ3Åeím·¥¼'L¦=júäaÖkÓª™0MJUî?µg¥imcü´f/=çƒ5 x_XÀH)²ã¶R™g=ú[XøI±˜üŽD—,™ÊÈC©GC‡Ä/š!L`“R&v¨£…ñá“ûÉ:¼ çMóC™mø@J‘w\>™Ã"äz;Ó– =ˆ>gŠ‹Eì}ÇŽÉtˆ0MJÎ1³o&,×àÙ§|¶èÃ*}ƒRŠÛŽ­ËYÅ>vDß³‡¶+¿R¦éգÃ~qøE3„ɌۭOmRêäž&´tÝUxu &JYWJ)‹7õ#˜RZ¿rž°üx"‡œ¨QƒªõÅû¼Y˜¹ÆMŸ¢[5§C‘-˜5´–|—ŸÕÕ˜(U=¥7òG6–1}4ù Ð6­[ر]Uô€ºE26n$¥þýôNs:æ†ø©:/-ú°Jǘ”*PÚÙCÛºuiË»]&­¬øƒaƒßbc ”’J#(K¬o6)uyßÉ’SYɶ½ºµöÆ‹*PíW)õP ß±5¾j¶a«f{óÖÉaýʹ,Šõ ÞžëšC‘Ù¤”ÉŠlMì„&’×S‡×gÑ]n7?©ø¿ÿû_”êê$¥r“cûSYè©^§H5ɼ©0sõ@û”u–rñ¼)žØéšcÚ¥Ô³9fvrd§v¯øeчU¦²’R"£jœÊŒ}l¢ÉŽÔø?H’=”6Š5$«† êQ˜¹J–XfURj÷r“XéŽÅÃúuðïLê°¶”yÊäqY×cìð>ô_™;©êícû¶8ëS6)e‡"Û´2ì÷ÍŸ—Ew}ÜáÅ"Žê+¥DF.Æš°ŽíZîÍM”ù¹!¹0Ûí„þ¥¿uËÌ&¥Ne›Ç1K2æ÷êÚÊ‹>¬2þòë_ÿšçÌ‹ëïÍ]¥•R2»t|Gؤ¡¬òÐ'¨bß”q1ÓùKÒTéɱ:'WI©—÷žØïw;œÿÞ´±oÕüͯýµf!)““““óÐû€Þî¡•R:E}On"U׬*^4oŠNʲ]ɤ¸X½mIoÒp^ÄxúРOÑ­šÁ¡Èò·DuzýÙŽ4~éð"$xܹsGY´Z·|éø¾d­”’Ù™CänìØIãÒuR’'Ö­S5›ˆþ  2WtL’RÊ6ƒcرhô.f‹˜vuUHHˆ2‹¨½/oÍÃR*OßÊv%uí܆Uþa#/ÏÖILòiìðÞ¼˜Ñ!¤ÁÖ¯ŒÒ¿„MJ}¸÷Dq¼mNè€ZûâEIY—ŸþYÙ=!úwÔH)>EÁ|„’½Ç!MyæPz\LX¯íùª=ê°„Mz{OîZýKؤ”¿jwFô€žmeÞô”8?:BRGPP²Œ½Ôø¹ûS–R³ se›V¯°hÀ¢y“zñ°A=øª=EAï(›”:™í_ÇÔørч…¦ß¼y³aÆ*5µ?-—R-eíüF êÚkòºëVÌq˜>û ªðÙ³lì/¸{{:‰01I©ëî9^ç/‹‹ý\=ÿ¯Y@HÊrc|UjªW'.¥ :ÔÅcYä L ‘k,Úè0=ùÝ€>]xÕMblÌðÞG÷n¦§ûô£CíÏŽ ÞµÆ/ÅÞu«æûÝ¡’ <*++üqµš:°‰K)ƒ¶ji8ó²W›5IKZì0}vê2òDÖ>> t¡…‰íR*˾ýÎàZ×4gÄÀäþhÕÔµËKwJJ1›6’8P±Y¶0Œªw‡‡P1oÖ8&õé(©”º´çø®e¾·õK'¶lÞHØqîÜÅ_S8Töþõ¤ÉÕÔ›Z_8ºÍ¸”bFBˆ…|™ ’U¿*£ê}̃Ø/¹¤TJùáåÅΜØKVWS‡× u5Ùßþò=ŠquPS Ÿ«s  Ñ))Åz.“Æ`=T$®ŒU’³–ü‘:´k!•R'2ýâ›qïŽjl¦EV|‹“VM=Zó‘¬ÍKm5¿“vtO •1:œ…4Ã&¡O x°pƒð+»”*9¶k©/-scxÇ×_6Õš¡ÝúüºÏ–PS^oqº,ÍŸJKZÔµsÕvß¶zû½w ˜¿mÅÅŠLáWt‡>v(²Å‘Ck?ý¸0ºëû]0´5õ` æ©Ý;׸à˜Ô` Ø *ê¹Ì gÐÁé@Y³HRêʉí>vÌVL1ÄÀ*»ýÜ»w¯eˇ^GH%$fîD’ë.Ø…ŠísÃDz~1g@ïÎTV];Ù­OÏ_¿´ûXÑ{¾±]isû÷lc¶5 ²aˆü÷ßP=š“ÒÒRÕ¼©F êºì¥…ëÉx½Mþuªl«Ë>e“R¾r(²uK'4nT[èS£†õ1I‡—Ù7_}„¢ØC‰ ‘®¹¹aèÄ!UûèÖ|dÌð^äª.;æ]&¥|嘹)³;¶mjÂEZûêÆI«¼ÂI«¦ˆ¡»_8ºý£S;]³•KÞy©IÞ+OÛãÂIH©%Þ¶}™Ñ£u4ó CX]MUUÚ®:Ô‘=P½Í¢¾¶z{X/úÄ…óØ¥ÔØÖ5¡-›5”írPV’j*‡¢ê1Þꩦò,—“ZÉ¥ BùŠªàîoäg$¸p»”ÚæÇܕտçk¦]ô¡²/>.ÿï¿ÿÅBŒÔ”j™ƒmn^“¥ë>:µÃe#ÕµSÕS{²ÖãCv³k*£‡“”ºv±¸¢0Ö{V–³pFHOÓ®Y¾#SÍ-AEE…j@3,؇ºpt[LÔD^o“‡Î 딓ÚnÌ›E–óÁ¬®šË:¼…ÙëÌæS·>?÷?ÿø;JlõQSÚÐÁk¿ùÔÁTw|31a6äŸK?†çg,7~øÝ[×+gxÕ1÷nwü°.ŠÜü¤âç¿Þ³b‹ˆˆPå0õ·nXxåd¶;Vœ½jô°àºµùNôïÕ9qùl‡VI©‚Å^²wg ¨ý”¦p(ë|Œë@¥}²t‹›>µbÉŒàno(vB¨:a09šÃmRÊkU”ùvŸ×…uõ êûwGùtÖOQP«?ÿüóˆ#TE”Z¨¼ôx73sÓ’¡»=Y뱄Çè¿FÚP›”:–î%Ç,Û¹`FHOó/úPÚí›—¬2®'$''G50ALÓïü‘ô+'³Ü´âì•¡ñ?ÛNÝÚQ£ ;9I©O.-Xìq[±pTㆵM¾fAûî!ŒAF¥Mlòš¹î;Yâòˆþ½:ñª»ní'©Û’—'KO·ä ‡:¸sÁø¡]dÑÝ•Ëæ˜Ð¡¾¼zä¯?ÞE­¶$&&ª;Ñ5~>m˜G“|B “g“\ráœÔõó…ßÚ¥Tš§sóª)-¬1 ûúË 9k1::Zû ~÷Ê ÅY+lï0ò¾Ù¤Ôù¢#y Ý´‚ͳ†ônk•5 ÊÅ ßóêü@ª´Ûµk'SÝ÷ü¡­¾ñ)›”rÛ¡ÈÖÆŽy¥I=¡O ÐÜ^¶Rƒz@; ¯z“£}Ûß.ÞàÇ´K©­î;掤™o¶ÅB‹>øÈK`ïêvöìÙ¦M›jÃSÓBú ò·K©Â#y \¶’ôÈqow’­Y0ç>éIBB‚v:bÃçê$¯Žò•”ZàŽm^9©MËçe^ÓFw©cò÷_ cd”––Ö®][žŠš9ÊWR*ÕÇÔ˜sÑmGuXBKŠ]žz¢Öc "Ç_>¾Í{vëÓsWÏÎïš…ë^ëñßXhÍ,Æv͵kׄá©×Z6ÍI[êUŸ¢«»ìPù›Â{vyUXW·|µ©©ö°EǸÀ½{÷„᩺µŸ|?.Ü«ŽIRêã©®9欹ãÞîh­E–á »uãÜÕs‡s¢µ…ï ¨ýÔc–›ÂaÑûçêž²½9¸ã¡]ë¼äS6)å¼CíN‹Ò«,ºkæLjp?<Åz:Û?ˆñ’cÚ¤Ô‘-.øfظn²ˆi}°½ÀX¦çrxJXù·oû»¢Ìø¥{Öþl—R‡r¢ÛšE£^hðŒµÖ,ð× azy5 Oi×w°1ô©!Ζoö¸OÑEr¨ý™Q“FÕ|DÜá]óŽiŠêjL5.‡§BCC…íHÏ®¯—ïJô¸c’”ºtd‹S¾¹dÎàg,1¨>#zúܼysàÀÂ2Ô±Õ–ÄyV¤{ÊìR*ÿÐÎwئ„ mZe“RÆŠlnhoY‡7E×rèPdK"Õ¯û„°ÃkÚ=l™ˆºw÷ˆDôtìÃ1ÍíÑ8&I©‹‡79tÌ”„6-YqÑÇw·¯#%#''G8¦ÌæéÅΛpæ`Ê¥£[]6›”:›W¾c®Ìr“§nm­U@DaíË›Qßßg$-pÇ¡ÈlRJîPd«cF´x¹¾ðúw1íŽ4QÀ«$&& {:Ä‹ë/™ê¦cVI)¹cf­›úVçæ–[ôe¼7+TÖ|dH¿ —ë»”Ê-ߥµ}Û"Æn_ó‘_YkÍŸ®ÿáÛ/P®€×®]Ó¾kF±mBíÈÃË ßwCJE -mõÄö¯5^´s‡×LÛá½}óÞ|ÖÓ‘ ª'j=6jHÂmqnH©¡cîJ}ÇŠƒ¯nœüÏï¾Â8»³‚*%%Eµ©žÙ«0cÙ¥#©Æ¤ÔÇgr˲ç¨,|B÷ß>f¥5 lŒØ¢/¹~áæÍ›¡¡¡ÂUŒÖ-^Š7¡¢d½S>EgÖ:TnrhŸn-d;Ò˜³Ã‹^ ð— JHHEXggæäÁ{v¬pÊ1mRêÐ*ÇÜ›1kâðN²ˆ9}|yõÈݯ¯b •›äääÈæPñXhäôáË.Iuhv)•S–É-6¢ÿ3Oþ›l ‡ ×,ÜúüÜ?ܸp;wîÄÆÆÊ:Âl&Õ[o¶‰™z´d½Ÿ²I)…Cmž1¼_[Ù.ëVÍG¯aô ##C'zÀ:;ÑcHSqL›”*OVú¦NÄÀœ‹>ö8ÁÁÁ¿Ð¥Ní'úöl¿pÊÑÝë.Þ"4&¥fE’­Z0´iã:–X³@µý?Vþçw_a6ðT½˜˜¨_oÛV|¼ü|ȈàôÑ2‡"£³1‡Ú“>mt¬Ã»pÞ4³Å ¨«û—ÿú½`*Š‹‹…Ûí>§ª_{H¿.«ß›~ú@²Ì1IJ](Of¾¹8¢ýºµ,1øòê‘o¾úèÇn!>ìÕŠ„„áÆžêPÕ õ© ؾ'{ùÅÛ¹Ù¤ÔéÉqcÚ·~ÁüS8¾ºqò»Û×± ðj'%$$D'HÅCUAZF† ÛôþœÓ’”>e“R™³çLyKÝ¥¯yêjêçÞ»ûG “síÚµèèh‡Öß™2®/9æÁüÕJÇ´I©²äUó‡¾úò³æ_ôñçÏÎ|ÿͧû˜ÊÊÊÐÐPÁeÕLõÖ-^?"8nÁäü¬ä½;›yÍ­ÏÏQg(àã UNNŽl{7a§¸K‡–SÆöMYI>ÿÜSÂdfØå€:¹_yáûo>C pgçÁLõ£ÆŽsõ’мìÔ.í_5sÄ€ó»Û×€2I,”Š™AM%Ã/ªøâãr^œ°©&ð;wîÜIIIq8˜î]Ûû«Ãû§ëÇoß¼DÚé¯?ÞE ©³3băšJ†}<èÔ|úÓ½Û ›9š˜˜èlà›)L/‘Ýýú*Õð?|ûÅßþò=êy`fJKK#""ŒŒ§«ö°-Ì^ç½Ä|ŠŠŒz"̧ðÔ@ÀSYY™àp>•_}0½Äâä˜÷îþ‘9&v0°n¤³î›´}ll,I}dCUÔ#Ö_KKß’ë!»ðY¨ª¸¸844Tö2FíÚµ‘]ÀnÞ¼IÕ;©¦àà`6…ô -j9¸ÀÙ³gIY){+äYô r?ríÚ5RVÔØ‘c²I/,bpïær€ÀäöíÛQQQ;vl¢€þKÞ¸qù£eРA”?ô¯ñC&MšÔQ}ÿ€ŠŠ ƒ—¦£”&%%±³9û¼„g3þ[P<jI8ýBµ¶?ýô2J Ë1ú×ø!$<~a:'=·ú—¦³)?$Æ¿té’ ?Du6ã¿ÅÙˆ²}g‘(ŽR_Ñß:;¤”¥Ïp™J”LBTTo¸“’’´ èC.¨œÌ‚”Ò‘”í—DPnS&;TSÂ!9H)À_z€Ð™¢Cm¥‘dRÆåÉd”É<Ã+H)ÀÇP#h°½ž4iKéìädH)¤”J¾:L )˜\JUTTãcCTÆW¢¹Ì7²²²Ø…è㓸è®èºIÙ!ôøb:J¦£¼*¥”ÒÈà%´RŠýX‡ÏB%¥(oÙC¤uVç‘RÞ{Lú2Œk<åCwJ²Œò`QwÙƒtrŒ>áOA¿HpYJi¬)±NÃJuµvN56**J[±óÍôUK£j¨ÉPÎ&⢅Í.5üZ<¶¦FÇÒ„ËéC¡òñ¶”º¯~U5ì©d­RJÑãPýá³ÐJ)mÞÒçÂ6]_Jyé1é \…ÊÖBêëOáQ²‹²›dŠKµ(ƒå¹ö¹ ¿¶ób܃Œç9¬°TËŠ4àÕ¬þê{‡­˜²–f(ÛbUzÞÈÊúÝÔƒ`ÔÜh/į%œ¤Ík_T ¿ºrn’ö´|¢¸ï¥”,½þ >åR‡ÏBy6~9í”óÆ¥”—“‘Œ>>YÐUµvUu”Pƒ±l6•à4R$ø¯S=Pg=ÈHŽ‘é—j Ö€Gàí/85sÿá5€ÊW—Pµ¼©•UæüœÊ–””ð[¥Ûæ7Ið–HÅR“1mFŸ°í%êIjŒtÎì)Åo^%)õ¥Tü†)ët–aªZmJ¬ÍX­¤‘I)ï=&‡%Põø” Y[Òøý«ÂnÊèŽ~æ!#ºOJÏ *ÿZ婼¨êç»àAFrLVØ”kre÷ À嘒²kDVñ9T²eûü上L‡¿Õ¯ÿyß\6ìEÈv{Ð×u¼9SîK)¥jIJ)íùÙÐ’P)cÚXyC¯ÊX™”òÒcrY>™Q}+ËXí¯“å%Ðæ¦ O+ŒµºìAú9Ư%,Õ²§ÀeJJJd»G²y²ÖMVÏk[pU[&Œ;©e+ÀY:•?¿Rþ9œ¼ÍæØ²™`ü N©A?J)™<Æ(„+”RÞ{L®I)VÒØ¤wáO–ºœW¸“N™wÙƒôsŒOƒ”uØ»Š°· xÒü5|ZMEŸk{ÍFäos•ZE6JÙ¸(ëy‡Ó«”M•Rø)g¹–-–“R:QpŸÎf¬PJùå1éŒâÉʹ‘…«®å•l6”Ë'”y~Ž)ƒÎFùxj ©ŠVÍSUAð&‰}.C6DÖêÞâ”””È.$ªã-޳ÓBè×ñL°–”ÒYí.Ìs‡ûJ ã„B)åûÇt_3ßQuV›*‡·tÊ­N^é?taaºãAsLµm¾ Ó xÕÜceƒË ¢þªí5óáÄ$ƒ(oÒøÆ•L8ñMÞ¿9¥”Áø†VÿèÜ’pÿ1Syõ1 ÑÎ÷ã;!hãcªùùÑþ@ýp×0J9ÇïPù¡;d\9k§AR9בš¼rY¯ºÝ”R†‰5C²P•—ÚhÙT1âà-£ï¥” ›!TO)ÅD¸lg0ÕØ´·¥@)‡Þ„z[J±‹lÈsÎÀýpÛJÈà íüXe {ÉÚOªþ;Ÿà![°¯?ÂN)‘µ8¼áãÚIµ)´çJ鯹ó¬”Ò™¤ä¬”òÆcrJSi·ëTŠså,##÷é0çeŽ? Y¬Õr*Çè·³7e«²ÅÙ·P¢œ§a$½VQ8{‡ýw>ä§þ!\öåÔmËZ. d’Ò_RŠ·¿ÚK¸¥ºÐÙšU_Jyé1ÏXí¯vzEßjõ¿SRJéúÁ<ÈaŽ)cβˆÚ< \h5‹Ÿ8œ—ζfÒ®@§n¯‘Å\¼žw˜˜š$íšnv“©>üwé´ÑÊ~ºòœ<€ÃCFªÕj ã™Ìî\¶7…ÃÜæï›þÒû¢²t´;ŠýXÕ6,J)úä¿E6íÙãÉHîÒ©S¨dGÉf. s^§\ñÇj¤Gã”É1zpÚ}!Te€g¡J›jfjøÞJN­jg‡óG^½U:?]Å…›ÔilÑ“jq™uaYDOÓ©ŸÃ¢Gž Ç“‘‡èl ä^»dÏ/èqbÛR™áæçÿnu“Ö endstream endobj 900 0 obj << /Length 2946 /Filter /FlateDecode >> stream xÚÍÉvÛ8òî¯Ð-ô›ÃbßÒq÷ë¤3±3‡IçK„gŠT2ŽãŸïÚÀEQÒqz&3ÏÏ&P(…BíðûYèýo³™t_?›U³~²0ñ£"åEâYQ³FÏÖ³ž³ ?;ùåòäáÓ8œ0e³Ëõ,Íü¬ˆgyùiVÌ.W³·Þ™¹º*us:±ø§óÐ áO…©÷ÆêæÅÁÄ{Ö™•>Ga¸È½âôÝå¯'O.OÞŸ„DNدž,ü<ŽgËÝÉÛwÁlc¿Î?)³ÂÜÍ íùÐ.g'ÅSÊaÍÀ/‚"DÒóØÒ|–G±¿H™ò?‚0'*Ü´‡Oã)Ü„Â~Ôµ[]F ¯5KÕšºúùtže‰÷Z/ë ÖJ6]£ç׈¡oOçI{wü‰ØH<`Æox`©*nlt¥Õjî=ñ±Ï_œ¥<±ö8 ¡ÇPÙËò¬ºvƒSÝó0öÓ¤èO›YqžxmÍßvl¸©º¦æ|@ÍÍøtнÆ+¶Vm´…ÛN³Ì{\á•õ™¯@8¦»ÂŠÚ0~bÁ°mÝ£W«Ïhûpšfž*Í ‰:r2µQ¦²- ÇxzE­É>+sw‚ê\üTXærõó=Ìþcâ’Ĺw¦K…àÛž²pìî·Ûº1Ÿ—¡wøÉEjr’ì3`|ÙsHœp`ßÔ­^ è0L¨w;Äï*¡Ivám«v{PYYSm˜WL>1é¶(ŒÀö(@¬ÆÂ.ü·Äü‡O£|†~‘¦ñ<Êý(á[øQóö¡Áâa”zÝ~ÔzuÓÒzyêíU£väÄò‚ÓëÈü"Î`¹ÀO Ñø'—z/‚òú)òôq‡éÜâÁKƒ’Îä&pNâé¶p:…øLÝðü·, `Qù7GC;î¾~v[¦‘À»Ÿxþ`7¡£J[ó¦–Î ;Á9­€´ U2¶®¶ªZjÖCQ»Ÿ¿.ÐÀ„<f¤~$ß#Ïg//`ó.¢·a–wü9ëDB ]ÕÍŽˆ…ví䇟€Ä•»š4T)˜[Éš~ß² Ðd[Õ :@:+Cõš¿da‰ G¦“²¾ ÷9-yÆò·‹f­¹åîš®šÕo  ò®”5KnNhé„`¿ K;ãÜPûŠ;DÙq”¶j64ÉCïìùãW2F™h6öI³¡¡ìõq¦Z#·I›Ç+¢®îDì™AÐ¬Š¬DM{B ‰¼ÂnL)‚Øk9úuÕ1a|D›Ï.뵦øLkþÛöú¬Þ²‹Ì{©Pµâ‚e»»7îïÌfÛwSY¬yÌ0¢n´eCÅ0B¬¯Z؄ՄÀëS4h;g‹6¹/˜bH%``E30‚¯š^êÊÛc×>rÚHCË|nƒÊÕx÷7ÜmôÈ‹Â]rÔøb™ˆF1FwdsºÄž[”uÆ,³ï`ÏÎò¹erÕ#ÕUI.'(ÀvwD´zx뎤ZýêÐÆåp9µOS̰Ծþ>¬Ô>8?ƽ1í–[û  tÀ¸ƒmÄÃÌ2n»à«€ò-¿­]xB ¢ðqPÁ˜ñˆYäzœ‹Í"W¸?f-"§Ä{‘i ð ZU¿•[fÌRÐôÿWA_^¾â!Þž:  ’f©wy ¡dÍ ˆ@l6— ôxî%®¶3v¸q§†™‹C¡±j̺EþæÑ@ÆW²V]2èù~Î7¦MÉÆƒ-ø9!£•ƒÙÛj~TßñLÛ¦®Ì'L±œ6ǑܻÆ@=‰2ï9ìâp,ÆQ^@²DŽf­SWòrärqÜ´2ÁqS¸†c(sˆ\iÕ0„XFËŽÝ 8E½À}¬…늩¬„h*9·q΋ӌX8iÚB™‘€ ´,ô¦žé›?L~¸ä_ÔÛd‘zÿ†X[e– ’ùeÛ”Uk³bP 3çÆ\J j‡WfÓ¹p,  T,?¼6»5 @Ë“ì¶îJY`;l£‡M> a© 2qj_A=†a“HØÝøÁÐ;¼Ó½²ÖÙOÙå.‹–PZ9Ã7DSV,åͶvIâûN÷ƹ½_”G?\.ÎÑA0µ‚¸spkÙŠAç¼2­qVƉÝÐAÀ¢ð ðgOŽ2˜n„L5É=QO Ž )ÿ"Éu§±uI0Ðr¿WšÇØ‘…_ªk|9äe !œ‹‡Ì€"[1«ÄkV»Í/G¶b²žÔl'ªÉty£“ÖÞÇ‹üA*nï'`Ùß‘¯ôûå+L†xÚ‡ìjáÓc­FX^@F¼ “>"¢Ž‘BäµC.N•7”°%t4F‚¢ŸÜ‹©ÇY–WÚNìŠÜÝa<µÉ_Þà7XÄYX22 ´jYÿ¾fäÇßòËó tâY€­pëbTeÂþ è–3ººkž•ÂM6˜?D›*þK"VaÃnW pžú¬d& LÊ<‡ú/—ØJ\M]q €\]W¶fï\I’yo*óQj ㌭ûèjƒPA^^x¿Ô”.À0‹Q@¬¸Íœ–¤°áŒŠ”1”Ð5ˆ]’b‡UŒz¨f|.Ï#¼gÈþ,Nâž=ñ`Qʶ‚K䂯 ¾•d4o5šWõó¸fl  8S½Oœ‚lvD¢pkÑàóök&ƒÓyg4Ö %˜ãänZIUq{l ú£ËŒëzÓ€%UƾÃÒü=Iø®€å÷=+2RùZWšTkƒx¡9îT•±;~½Àxä7³Ö-½€TÓ  Ü1àQYʋǚýû £Ê{ÈÎ=fpzx"I$H¨L‡Áßè-fÈÀŽHdý Ñ[wã}e\LX­Òʤ ƒ WŒÆ¥eìÀñW.zY»Ä^O³øv[[}àÍ$Bq,Üè{ Cüã‹l· ÀX7Å*‘˜î½a>®°ÆÞòÛcÜñø H°zƒº3D#j6’„*­;Ô% @±÷¾Se_ÜG,gU(]%«‚PvL ö]¸Aos)Íû"âì”+ñbòfΡŽÅ¨RPÌ1Â@©“ÐÕb‹|Z¬FÀcoT_Ì% åÊbîž»p ·?õ†/Rw•Ô$Éþ\Étf~Y2ðœ­b±/;š¿±”'iHõ`ª9è¥Ýsc¨¤‡iÀG »z¸w`pd]‚1—™Š7Š@xäš2ø•¬Lf Å |ay‹¯µ|Ãl‚š•ì 9ªêîFH­@ïžš†ªÂÓˆoårÅ=Šrðۨʖ$ÊQ±$­¿–yá)é {Eȶøü*ë“Q@àhûÕt5öH £Âß‘“ uÆ¡$8%Ou®#ð@]‚8í^¦–îÝá/í -›ø‡Áî8t_¯þò¾ñMöà ٫F£š`Șø¤«7}ñ°à‚äbQc_j|ŸÆWœµ¾Ø—JmKñg?ÙW*~.,©H Âá£À¦¨q“GyÀ—‡›) ‚Të!*†ö¨F@BAtšxòBÉÛ—–Cõ:Ä øbíºäe±;Î³Ó s2•4=ÅÇ~Òº[îõæ2NA·ZVž,uÿn&ôz ca›Ûšl^Š¥ô/$u¸w”B{ÝRåªÀûÙí;ö¶¤a ƒKµ‹a =\@Xßµ<Ô(ŽH±M„ἦî)¶[rF‹X;ä>_èJïhuAbNáäuW‘ÖCkù™àó\Á…õºÕ¢Â]ŸÝöÚÖè]ÝŠ*OªàX¬¦vá¼då$÷ÓÑÅ×UÔ}Ÿ\žü ´œTà endstream endobj 915 0 obj << /Length 2791 /Filter /FlateDecode >> stream xÚYÛrÛÈ}×WàÍP­ ã~É›,É^o,[éÊVy÷†ÔD @ɪü|ú6 (Q›JÊ%£§çÞÝsæôð‡xþôg6Å›Nëøð/ b/,'+b¯H‹¢pŒrÖÎ?N|gÕOÞ¯NÞ}ˆ§€ê0uVk'I½´ˆœ, ½$-œUí|w/ôím£Ìé"Ê#&ðNÀI$î·^™7=VÆîÇQ×êtúiºúçê·“ËÕÉ“€ÖLÃǹ—E‘SmO¾ÿé;5Ôýæø^\äÎ#µÜ: {°~gyòlÉaæW$I8_syyÂK¼Ö„‰û¥`mYâöãnRàvfP5ëÖªF£z\軹ø^á¤^¥ìÅK õ¬îºqs;L"·ÑýÀR·ÆoèwЍxy‡(«z–(’±Žbè‰ ÿÔmÍö—Vظܭ($‚µýýš¿§Ket¥XqMhH8wÏš@Ö ë£ØçÄâÐÌM3äÞëéò0j£Ô]#ø–†BEΟ;hSŠJPµ\#3J§xÎèë{¹at‡Xël}?”ŒÛ)º:ö;*f÷HŠÞDv‚£Î·‘Á02·j´âSÍìðÖ G‘™ŽÅŽZøhy &ƒw«[ €™4´ #ûnȱ%·¸•L Å ÿ°0;>)`ÒråÜ`mßG.CYÅ,ðMBèû>KZÚ{ƒÏ¶fÁŠ:¥±[³ŠK4Já üd\nÅheKL¢Ü½w"J1Æè’¿ç±«”x)Xb8i²Ÿp:¨½×VÍá.laÛ[f|܆OÖ]éÊtHЯ²S}¡ø¾.‰Ç Ñd2R¶…¡mh¹Åº¬p¸0ŽÑØ‹<€­ÈØ(Ð6P`cc#46j&ËUÌAE‡.-f÷(kÓÉ<Ô ª{ßVÖvM™[ËŠˆ˜ÛñÀ`ã#pÄÛR7|›GÑDÁ¶BŸÐÝÈ…VYÞ$oû:ø­˜ªÏ™1²ÎÜOS]AK͉1Ï)Ö…ºÕ˜r£r–TcU´UߎöE iÝW±q:+æjFfn4'Âð6K÷„6M^fBJ}Î;zÏ€Ú¦Ûèj¾œÂ.ñõWè¶–ÀQ Mù'8’­B5{û`B– !KÝó_~a¡¬e,)qIýxâá8 ™¼E ªô6eÃUòô³h,¬s»õØÒõË)­ï>ÞiûJ0òl“ÏyÍá}H1êï¢8qå 7NÏcz÷aVÀ2¿¸¼å2  I=Lõ³TP:̯gyªƒˆV/ô’Œ9 Ö«a˜FâWU~”÷ôþÕ¤£¯ã/ñÅo ##BÍì$¡ªùôLÍâ—ÓuPàÃÄ4¾ø¢}Ö­xq“öò‚˜ËUÕ !¯ÜMow²é:8ò(A£sJñ’8˜™‡ >¶Óº“õˆïÔÕôc ØsbYjŸ 5H¯,ë~#¹¢üFdˆ¹Wd¹×áû»ý^®NþiÔ\v endstream endobj 931 0 obj << /Length 2961 /Filter /FlateDecode >> stream xÚÍZYsÜF~×¯à›©*M‹}ðò['*§DZäM¶œ€Fèh¤ˆÆ¿íõâóÍY° "ø“H#TinDžäy´6¸ ~=Š‚kè>;úöâèô-ƒºU\\q"’\i¬DœäÁE¼ _T——µmW:Ó!0Ç+Jø'V2ßv¶}Öa§ φª´Ç+%R…RÿyñãÑ÷Gޤ“GŽË›L¤ZëÍÑ»?£ „¾ƒH˜< >º‘›Úä‡vœ퉬Ҷ¦M¢æ2+-²˜DV TqørÛõE]}ÕlAÄ4‹mI¡+®-JxúCÈHäQ.q5™ˆ\'ÁJƒXÑrßÕ•Ý«,ìO`w¹ aÏ·øZQYD«ª4[‹Ê©eX«4¼#jdW‘<¶ôŸôÛßpWl,MùˆÓ äqw j•ìígllÓ`3d ªŽ:ÊêHjÛ²àK†¿UÛ²AúÇnÚè"XùíK-bÃðSåÖ>‘»»®·›îE‘¢Úbƒnæc¨]-„6‘r2bOi»u[]:ñQ'n¦ÝmÑÛömpßI¬Ã ÔAC“»j³«««»û‹³DUO]E× Û¹}E´#6þ¦€1Zëð²ÚíµoQå¶í`¥Ž(îܰ1tÖéç(ÿ¢¿)ºÝüóÍX¦Ì‚TäiD¦¤ÁÌã,Ð"so˜n6æ=Ó3à*X͆ 2P´w ÔØÙûJ ¾&š %ÙD•lóxZZºÓB;_hÿsDœ³zÎû¢í«í5,$áǪ¿¡x¨ˆNhÙ)(@Ç4Vu}G_ÍýjüIï"öÙÚn˜Ð=?^ÅR†ë¹“éÔ°“¥¡çB® ÖÖ Ïˆ_ í$q[9ñ4èþ¦â.ÉwÖƒ—Æ’Öö~ì· ß~RQ·¶(ÙjÀZ{êvûʦؒtîË9OJÇ AO`ò²éЫ¯ž–ªÖC]´Ïf‚Ö `ˆ$«›};³ƒ>;S0vñ[&¿íeUl)|Ÿ½z{ê D¡Ds&0ð„MüqnÁ;ëß^n™~XÊzØ´e ÅÐåDrGi’"@[Q$uþEtp8j€ñnË¢åá=W6uGßDqTìúÕµE£;#„¯ D’aÉ Œ¬ nT Z˜"‰,F¢S‘¡ãÍM„ÝÆš³‚ÕÒDáȱxÕ.ê·ÐZacºN–ó'Ãuä¦VÁî’v·&êŽêûãLÿâ¬,žd°¸P©^ZÇ/;`§B»={þý—e’@Póù×Iè鸼ŒüÎ7,ÝŶê6OÜ B›áÈõú§Ÿ³ó‡ 4RBAœý¢}›g v.~4uiß¡o˜2}ºØqÀž¼×ûsŽñœŸ¨¿ÅŸYrÕÆuC*ú*õd‘Ȳä!í@,o¯í|Ãz¾a³Ü0:­×ü¦¹ã0tÑ'ªå]Çh鿽9ÎÀ_b쀜ӹU˜\!\C`€Í‚zß[‰XBDp¡n@ímÕ¸ÀÎ+t\åÂkå‚s¹Dþ¯ž9Vfˆ— Éà@´ø¶ƒPk'ÛÓéîäyî(äAÄK#³ŒxÍЗ€»Ê醎®Tøt ":$^ aÒxPhwBë=³{‰¢ wè}¦B8É«cj”šóëA-]— »Á_Ì*‡ Cn,kœ–zjTÌ´âï鲆]ëPï-¤)Q&ƒÝ…[y ¹ÎDuøoD¢^þ ûÁy0ljC-èáÖÍfWÕS75ºfh×Nº¥_ÖYËT‡Õ·ˆ†•ϽYYZöÜ®=ºû @Å»–Ó{7¿#^5̬´}QÕ­ÝÚk{tRÐG;ðí¾/-§ëÄn›ý ÒÄŒ¥¡Eñ)³S!™Ñ÷‹ï¿¥À–Ô~óúgž¾wQ"?ºD‹Àþr°K~5 Þò2­eýó´b¸+Ý‘a·ó2©é$|àÉ© SöNÈV 8š[°Å\M@t 8º†ëœ3úžÔ 0BÍŠakµõ ðD.daáQ÷ŒÛc+öœeqRÆ#*JF¶¼‹èî¸ÚË4Ì iWÛ¢ãÛ¡³Äã:ø|é­ý0ØŽ“2 wW¨®|7†¦Îò•ñu¶³1Píß)Žrè1ùLf·Èé|Úm;ZK4ŽoHc . Eê2.a£Zî^Æ%i´7cZ…4ZýäáàÔœÞ]sýéézyÇ*žvŒ ÈûÊ&:)d¿‘wŒ ÈWºäL…?8 rg?À[Nò\êàc^^Yd~÷rÄ r|K}O¡qÕÔ5Ì) ŒH?ö.<–‘s-‘#šàœõÌ `?‡ YÚH‘˜ YH÷E+ ÚL]±mV¹ú<?òŠÙ¯—éÇêe_Ìíó#ïË£2åÉþ¶Y¹{ßTŽ\¦g¨•‰üœyúD ímgNs¦Ó?嬕Дÿãg lò(ûª³ÞðN ïLµHTè(qºŒj{X]Ï‘K[ˆxÆnÇÉ ó±ˆCÿ3øM·eFö)î¥`£Štñª<’ ßäÿƽTfDçÿ;÷RY&ReÈ0|B6sž§a&…JÕ?}„ÈÆ¤òÉ^³¬´úÅM.Œ ôš ­TD×ÒÑÿf©ur¶<H´ãrBÛ;ø¸W¨Ç1¿¿¦º ¢H ò©µ%¢» ‘I²«7¸Âw’H­ux (ä6ç3ž4—òRø/@\ÑJ²LEYÚG^ ºfc?R†¬³@m38Y¡ HL|Bư 3N™1ôR’Å{›Î’0%ú(…[×Iáš.H¹åáZâ½2——Ü5KZýXƒslÚO»¶ë¿õ!„Û-µ¤#),^]jÐAŽ(¢Ö´ìÇpŠyáÀ áh*Â~8?$!JÌÑ}¦û•6ÉÅjÉõòømÝå¡-Âý8«C]ÖîEJï¿w…mÝ“T¾ì‰¾.¶Ô3ü˜s¥W/H4ÛfóE•æ{(5‰…ŠÇÚãMßž¾¯‡KXNìêÓòf½»MN{d‘&s÷kä_XÜ.¾¹êé-o)òŠÌÜH0–D/R?*¹èTÍ4ðÓPö¿®HžÀ«™áÒå@WÙ]·Öú‰ ávXû‚X'ó×°–p²™Tí§ñÛâ‚máGcŽUµ¾2«÷ÝC °]]¬ÝÜ\’ÃÁ/—0"z1";Ò€(ÓðUÓ[?¸èÇi- ßèI1 .ò}¿ÂÌ…™‚‰à01‰Ã§¤8Íòª\Ó©¨JQÚ–Egìrh§¸ìï¯O1°žúI )Ô8—HéaFVÌÔøB vµ\ì®ÖÔC:êB(IDÙçÊ€)ý\¼ç²ꆖ—tN ª-,;˰mbµžÆá”så7˜äk ¶zãž#H³ÛgüŽÕYÆqÃŽ~_¾¾M|Ò>í?šSûeÚEÑ…Öýô¢Êas,2=œuÿâ77{=ð¿{áτ٬öP0mk§A)DU[z¡=‚Ý‹ëz|ãÃzºÆ2§4ícõ<®B;ÀƒÌE’20aôCìyc¡ÙýŒ$–ŠŒˆu<{6†p¼’ÄÐk±Œ%¾g«ì»Eq.Ëh3ð‹U3·hû(pB7ûÐ  î¨o| ϲý3¥ïFáÿp6šeTÍ“î6×÷%ènš¡.§y™ŸçO bcÇü6í¢¼=ޱ|µö½À©íFØg™+:OåÍÿÇ@ž3Yš¯-ŽšCÅѹOÏíö„œ™ÆUÒг endstream endobj 941 0 obj << /Length 2343 /Filter /FlateDecode >> stream xÚÍÛnÛFö]_Á·¥{̹ñ²oi² R M7öÒ>ÐâÈ"J‘ /qýù=gÎ %J´ãlk¡0ì¹ò̹_fü%à,Û»Éðã» "ø‰¹b"ÓA’)–ÅY–­ ÖÁ¿QpËï?Ü,®ÞJd°,âàfè˜Å™ -˜Ž³à¦>‡oÊÛÛÊ´ËK™Ê`ËKrø£×á:Óþ£ÃE¾ÊÂ,/Esr±üíæÇÅ¿n_ÜâÃGð*e‰”Áj»øü[°öc1•¥Á½Ý¹  ÏèWÁõâe‘œ³Lkqˆ³,Õ„²`ðãB‡?å+À-Ñá‡kj?QSÖ]ŸWUÞ—Mx^½M±,Ê8Âä1Ëd)Lgè+¤’ó°Yc+ˆ¥,¢©ÖT&ïÌŽbåÅ-ô µCgè£b{G3;@L¤áïK­ÃüÎ8Øyk¨S7=}°[øf)’ð+0·°Gè°ß˜Ö¬›ÖC…M£”`¼É»éù· •4t°WÍvWV¦`Hxpéiå’iådþ‹¥¶K®›ª²ÜÓ¸3+ϵEúF¿ ªááðã»EðÙ~ i«“ Tµ%pw¦6m¹¢Á^×`x¢ª!J')ûi¿É{Ú‘ïvUiyK+,“ÈaŠÚOD诇¶55 ¢¯PdB„ݰÛYn5-ž"¸C–2t,dXùDò£vèrÀE$Tx;¸Ï­¬¦»¾¬*Zmj·ǯiP•Û²·$ƒµ)…¯NÂs ‰ô:öÛGåI¼A–Ö¿F\Ý #`Ö›Ÿ¯½Tۯߴ­xùÍ6/kê×ùÖ)EYW¶ÃŽ‘M­2ãɘàÒ[¤rùv™)0óÃõ› ²ÅŸM¿|Ø¡’†¦ÞO]7UÞZ‚aÀùw˜«’±5WlÑ\ùG$ñ5§™½ÕªøXÅC.`ÿíœßˆ5ÎÖÔÏë‚:„Åg4™".9)Ò'Ex ®vO .ób<ÒÍX’`»ÝUfëTÄ4™¯{kKÐEê…›­Ýò=)!ô·ÄºU¯ª¡ð0¬è øjP§ÑÌwê†Ú]kn‡²rèÝ–ÀÃ:oÜ":½^LN)¦4æHÂWëÁêA«­¨']Òõ_ã’œ¼±ÿ¤WÚ};Ê+[Q_Ò’—€°l†•׿™v¤ýw¥‹màwîÌ·ÌB¹hn¼Še ±HÄ*¼·ˆX‡ë¡¶œÌ«²Ghºh¨}À¹f Á=rï”p¦wÛ ¸C×mþ¯‘ŽÈ¿€’µ«_†Û‘ç¸ ìÑ ÿöó TÉlzb·i†ª ÍáÛ¸ç ì]ÛÔ§Fäün²n6“1⛇Œà®b ¼·_X|{¬g˜'L¤Âï¥X‘‰p…øU¨þS¢÷bî0 ÒIÆÃO¦}ò0yr1Û;pšC3Ÿ9-áL¥ÊC@–?b³"× KÒsÒ¾/Å|H;ųÓÆ.dzFÚ¡:—‘œÒnÅ÷“>Oä’š¿¸ý*Î"ý]æë}œE+b‘J(–p§#?Ž\¹”ŒÇ‰w廼…âÉ:\|k¾ àÜ1çç1ä }_Z1@°«}ígQø¾§]xgÑ«¾£cVŠƒ¾qp‡Úo¦‰"7ÛÆõ·©…;é¿´³0=ÝEl(º@>ÂAü‡9ÓºÅR”cCרô)òfí©Ø)]K1:·.ã¿k›³,y°,z3´¢¹xí“…qP›Ë~¨á# AQfó>D¢t{Í"éS‡~œ°¹8쥔µ? ö¨øp<µZI Øo¨)mò3öÞh¼0 ACžú¾¦õ~SºoWîB(ÍìíÏl– Z4&sÈÃS%àô£Q‰ðt“t@³žÍ&AëåøÁ£º)XóÝtÄìë$õU"ô¦2£÷É”(©ÔS^nM×¹›-¼Npy„KèÇbÊ«&#uc6!ê¹£U§®¼AÞ7ûÔ¤.»Ëvz—£ º.óYõmu¹züèZ×7»Ã+[²80‡—0W$cFì†C]OéªDo‡¶þóvèàR©åê²?“ÉlW«—v­PÊ3©Äß&5’ ÚH/DJ𑱿ŸO@‰Î‘€ú@”Óg$]&Œ?™‹r(òtŸ‘r þD^ôlÊçéÁÒ/{qÛ…c$Oÿt^”ΤE"ËX–ÌùTc|á9€«÷ÞôâØßº0ç^•»rÜûÙ¿Ú‰Š4òÓ—„ÈKIÿNT$1‹âì|ö$RVR=Y_öCwg"bÁ´8#íqÌ´­|¤¾<íPïe ?#ñb–ÔO˜Ï§}ž" Ü•/nÁpL’Ê—q¥QCž;u¥JfèJéEp=`^ŽSUÙõ4Go]Ùé MûÛ7ûâO=æl!VI±¿œØèiUŽUÅìew 1NtŠ?PfŽ×§M;{ǪÀrù1HR§Sˆ—Xºó£ôÿ¾ì7ÍàqêƒX3VFÝiñàøýß p&ö…g¡ôë¨W”P§HÓ<}@uá0ǘç¾vÓÍš øûßÒ^¼Š$9|:"ßhäÉsŒtÏ1b,7ʵÛúSÙ­®~YÒ;¢½ÞÐNW8Ó?àN[?b-óè“äÑs>Òq+¨¾Øä™Í·`²ÿÈ9 endstream endobj 958 0 obj << /Length 3233 /Filter /FlateDecode >> stream xÚÍZ[sÜÄ~÷¯ÐÚŠ=–ftå ’ ûTAZi¼+¢•äØüzº§{$íz 9¤ì¢RŽæ>ÝÓ·¯göw/Áô×oª?¼ñZ/€I ™Ç^šG"Oò<÷zíÝxÿ= ¼ t¿9ûòúìòµ ½ºeâ]ßxq"’\yi,EœäÞuåý쿪×ëF÷« •)6«‹Ðá¿X†±ÿ?£ûÏ vFþ›±®ôêBI(ýP­~½þúì«ë³ßÏBKO8-e"UÊ+wg?ÿxô}í"Ê3ó ,€~(7ÞÕÙÉ2õ€5%rI³T"‹‰dÔ…2ö_v»}ÝCݵHÌåëÌ ‘yˆÃDä*ñ.$¬ËÌÆ~mùJüª6C_¯ÇAWÜÑÒWRÿíJf¾î lc>_]ÄQî¯ë¶èïiTÑò4Ó}©iNÙÁAe~¥á8“ ðßÞPû°Õ½>ÜÞ®µ ýû»QÃúún%SÿΟ÷ºézdÙ»p\†JaÄå=.Ĭ.¢0ñͽôî**ñëqóä;š±hš{j\Í©¯‡AóÔÚvuiÙÈåÁ‰?œïÝ[ÞuDî`l[#÷TÞux8Cß¹±µnK7v¥3Âòg,ø·öHR¿@ºø Š¦Æ²0\B&ñ[uÄ¡jÛq{÷K*Ò‚Ô7õ¦­¡!*‹Wä1Eu»ŠŸÛ`^¤›·FCé2¼§ ZáÇþO+°žn¤î}ß­‹uÃ?ààƒ‡Ž¾¿fXnÝšŽ¥ë^ GJb M¬è@@œ¤¤}0jØõ[åƒï¬*ØGxNÆÞë‚—6º$yãø¶@‰¢åà‹è/Eµ¬þðæÌûÙΕ4”­¨g‚þcñÃtŒ|f¼wÍä2q̪µ¤ç}Ý·XQ§n»q³=?u^ó"IäïêÍq êÑéC‹=}üŽ-n— ûNÑêš}T à \†Zª±¯Û •ËÙ\q•úWZ“«ÿ¸ðU*ŽEžI ýØM%þ+}«›n¿ŠA¸ì‹öÅ'œžÌEœ†n¡ÉMDY V¤ŽU -”­Y)åkËL7TÿÖ׫—R<Ñ }уR Îdɇ"cë¿A@“ ûn²÷þܬ ýñîòÛ¢$Ѿ»¢ï—¯W9ê þòêÕåwzÀÏ;8i¯[¬\u ÐehøGÆ@Ä9;’ë-JWJ8 ¦!]$¡AS¥MI¦úõÅm$œzâ}Sk®[] Ȭ0Þ¡úÊÈ'v Ã²ßÏéûz!–˜âbÊdË8U Ô4³ •0|Üõ›qO³»el[*°w·N¢¥¦¢ªV¡?´˜ºµ! ŠÈ„Bµ…hÿã5ÿîêí<ØF^~W°‡ÇŠ5¬®l&Ò_£þXzØãQ„­³.ªÚP¶ôB¯WŒÃ¶ëÅ)û¶¾- –vðþcSQµ©ß³«ÁÙx°ð¤PyU‰“aþMßí¨DaÝXVÒ£mj;=ÎùsZµ×¿u¯™ŒJ;ÉVí@ðtAalXƒ~Ô¯¢êriÿ3L{VT*è3X ìëÒº*hxùâ´ÕÐÛºïÚ•@2z?É µÕÑL2w0nªþÄÁ®3Õ± j›²nFkç’u¿ZI>¼ç~öÀ%ANZ¼s BJȶ¾% ;=¦ívûÂíãZ1lm¤@{ôþœ¬¨ –±<¤ì!Èј cfx Å‚øœ‘_îyÓû-ýÊ £(IbVˆí.TÀ®Í\iàßïàF>ÜrÛLæÇɧú«äó£wûû‘éQ‰@ rÄ6ËëóM¹½\âœéœÆ ©‚¸ßÔVÜŸ :%EDO.:Ø&Ôÿ%:·ëòXÐ_ªDêɦˆ /—F “l2 ¾(Kk¡èØÓcÿŽr„{ªÍ€÷Mœ\G˜·à·A,ñ~Å."a‡`’AYt@,´]Bn7ln¶^’® ì¢LÜ©aüJÑÚÌ<Pø“u££—È}à"øú‘ò¡B†ŒÇåKݘû[ÝìO!ì Aâæ¹ÊhM…¦6œ]u7œ5qø‰áš ÿ| 6¡€¤)!ÜÜqÆ¥ï t€èÖÒp±o1î¹Á9øeVÇ`†ÏE¦"’ñqJDþ®ÒëqÃ^‘‚b¥©Šñn4úfä i“UøÎÐL=H,9´bÏ´°Âè²£ÅÙñá´Jø`º‘± ã¦×Âwàêx{¼Ê 6:·Um>Åy«4a?µP™2Wÿç Ö6“<ŸóV I>j€ºEk¹ %úq&R„Iþäâ„mT’=‰CWÄUÉV{¥Ù^f\VðŠ3‰fÂWŸ1.²·'l8óõL‘ÀÝÀŠo>܅ǃó¡f §ÍÉõ%Õ*9Æ_3œ3Ô_\Xb®=§Á„ä!cééʧîÂ&YÒ›·µ³Ìñæñ.;Ât}­c#^Þ?5ù ²£›®’Ù)÷‚ÞõXÛTŠ”‚©ÜÎ ?ÖrFjSì(ð›.3šcÃæý~Æ£å’)¥¨)5‚MÍÈà°~ î–ºqœ¢'UyHËÀ’$ä"ó^sæ>]?ºœpzfq#§`˜rúL³\6õXf8# ˜½@‹À=é°²Ç:ÝZa6M&„– ‹ÛªÍ_žÖ§Ä`@‹"—ò©¶LC†ÿš,ãH¨T=_–q&"•± âêîw·7Tª(Ä\àõhøÃËðÂô¥à»›îÇS{R ¿ËdôŒEÖ6ÿaBù‰ÜH—ésr«BþÿOjËhå÷ÏÃ=ð™Êø¹S‘æḟžå aúŒ[‘CîÝûªf)_ìé{y[ô—M½¾dÃÿæ‰H³'‡Ý¸ §€ÝaˆÄEÍ—u™H)0\È®j“ÿÄA/C{qù_}S;ô¾üÕÅa2Kïø0„ ʽ„ØD·àN¼û< ÆçA¦ *eºÄxÛëPhpCôÆ)òØ>âe¾ÁT’SIM¥ˆKÑ4.áT’S‰fäP‚ý¢©O,8Ä4D"¥Âò¬Äãhý»n°¿Ü1eÁâj k]SѳóáÃT)#€BËO÷<¨5JÑ Î_›Î^NÓœ–›o~vÞ{zíƒ2eYÀb¶»Þ!¾³ØÿFß‘å õ¯ÑŒ¢ñjf@zW0Ž®4ö·ö^Þ"YÒWꤩx…B½3‘XÛès/7uV(Ø;z»_ë;*K 3šþÞjUo¤¦­hÛùG=·”dÍÑ# ¶¯kÓµ/^œÈ0B!C‘ãÙĉÿºATêÎ; ý5Þ%Òê®}ËãË2z1ãñô“Š%’¼W¦üP ÝîÚÌ6.~Y›¿™IMŒšÆËCvÓ¥fÒ¬ùCÛ›·×§äI,$<¾Ó«X"Ÿ»èù4?zº•Ž C 騴Èc˜ÿÅÈçˆ†ÇºÝ è[$‰‰œŸÆ ÕQ×pÔ²=ôI›p……ÊC ¿“oVVëe–ͬp”eA fïøµÚÊß2³ÖC£%ZfÙáÝö;Æä1Ç|p Ú·;,.•<ËÆ”eü(†«lkþM÷¡¶n-ä1—+Ÿ|½6ìÀ§ssºˆ¡cËÏõK¿~ðåtSü¦È}!Þþ :3 & endstream endobj 846 0 obj << /Type /ObjStm /N 100 /First 873 /Length 2376 /Filter /FlateDecode >> stream xÚÍZmo¹þ®_ÁçÇ%gÈ!ç`Kà^€ ’¸k~Q÷ɰ¥&×_ßg¨µãWi%/‚6¸«%‡óúÌp+« ®¦à"®jŠŽ aÌ.ÁH.e<ÏÅåXp_œ´çÕÕ1ªSÁ=hb 4©9ºH6S&“‘du1'vŒ¡W\Ž®â­(Åž‹‹…°†€°Ú/UüRÀM$™T,I±Ø/ÙE£©¸Èࢨ£D`µ‚8f® Κ‰xKASŒ©ÊŽTŒ89Ž!MjÍŽ‰±³*޹$\Ç9Ú<Õ±${KÅ#ðÄÊØ®FˆÇøQȇØPv‰f]J•'U!B1~T\*bÅ%ãECt9p‚È0{»B¼DNcrÙö§‘\f¸—sŽy#dJì²]@/ ê\’½e)Û$ê$@v ñ‚¬ ~„!Åb’m!Ì#":QJNj£ÉN:PHµDðªµAȘ°:È4BÉlÆ‚JÁ%¶h¶°½RB™#¥À>”1‰Ñ~¨\ñ^6m)©+¶š‚{˜„¡Q]åhšUšÌêÒU3žbç5Û$öƒ´I’™Lf¨š^ŠMkÄ5q50â¦_›•ƒé‰æ¦)l¬ì¶ódüÇ`œc§ÑžgÖÑœmƒF¬6)”íESFØÃþþ¤{ûçùÔuÏf³ùbÒ½Y-ÚýßNgLº_æ'Ó‹wÞÞw¿v/»çïb»™t¯§Ç ÷®fJÑô@·P^ªä5TP=sûû®{㺿ÎßÎ]÷Âýp¹<ºÄ«§ó™Á§=÷óÏü=•œ½˜5'ñÅÜ·z²@Q}Jú0'WlÄñ™ ò,ìÔ&f¯×qñO7¹xáÞUOp¯]÷Ûïÿrm^˜1vUaß³åÙÙû+ÚƒùlѦ=0‹‡ÿ´·*|ˆÚ5èºWóã7SpèºW/\÷vúuáÞßÞô«ÃÓI÷ÓMg‹K3a{ݶv9_^O/[`l?ý}zrzøËü«kÂD8 ö÷êðï:ó¶F×äx‰U-J/¥W£®Æú1öãŠç÷ãè#Fñî&R½‹úâaUjÀýÃ9†ÅC«"Õ¸x½j‚páëUsfOv½j¿‘¶îÙþ~[¡{ÖL¡{ÓýóõKûÿáÓbqþS×ýq¶<òÇóÏþü¬;ùt|þéöƲXòà·ùp"‹žÕ3eªÉ# môá§¹°Éí/1zË=)4â3"‚ÒBy˜•ãÓÅÔ_|8fŽù cRØ7Øî i ެ`ak…}ùòÅœ-ýüâcwÀÿâ“¢kå•C(wN.ÃÎ=ZYÑrò5è Z1¹n¢%I-PH>#¢ ‰z–üc¹A…\-áêÆòr¼º1œÇבò·ýÛÄks¿ü-£¯¢ Bà|¾)š–p/šJMk)w£©”1£d*Ù'€€a_RKßÑ‚%B‚>’<ý0Ÿ/°ÚÔÇ»f$:ÜŒnÒòzx…i¬ëz₈Z yªÛåÃÇõßDƒï×7bGOfÈM1+7Ò(fRï›IÙÎLnH¬l¡Š›´–È€,,™Ç’ï}ÁbÎcNÃ}ÁéÎþUWüZM¶s?J?öh¦öh¦öhF{4£=šQêÇ~>íçÓ~>íçÓ'úó<šÔ[Á+îaõ¥E]C=H¨¨vO¤[sbÕQÎðkØ$vd@°°!›K’™P (%KiFP¡Þõ1}OF,1¯Ê%1È—Œ2 …òZF(ph!³ŠX±„ÌŠ‚JA†51àÎzI¡Œi €|¥r (Ô`²‰óa²Ä’ÄÇ99¹8ü°øqqúyúßùl:C¹Õ²\³·F”#U0íë­…„Çã$£j ˆ¢\¬šH.§egѳ–M^¬#Êk…³¹në W†ƒŠV(ågŒ¨þ®`óöJür±XÇÓöHÉ€3Xâ€âÇN QÛÊ1¦’ÖžVñˆx Új/®0onÇÇ«*Q©>ëפº­[îÁÛy&÷_UÅí„^‘€Uÿ¯I"|Ï:¨ ŠÓÈÑ'Ü‚SÕáÚ²<Ìa8¸E» <@+˜?DDË€Åt ­ÕZÃHCði0-µC²!´$a3»}‹8ÆèNö$˜s«-|ë(a]x4”î£!Þ Ñ ½Ø c¢˜\ZÜÄ\QïY7 Ú­Ð`ý^á‹ÊJnð!W;-„sûÌyr› jv“¶pË´…[>@+p B‹hìíK“!´Ö@¥=ÿ¡2á!Z; ieÇв<ÜÃÂ(ÛF†é‚†DJ€µ$E©Xymà4ŒV¤YúXç »†¨ûß…èÀïBôêô[ˆêOF M\1¶ÜW ¶Ï€’í¿øD´6(ÜýG·8×-Îâ`fûîšö)ÖþX endstream endobj 977 0 obj << /Length 3238 /Filter /FlateDecode >> stream xÚ¥YYsÛF~ׯ@å%àF„0œ~sâ#JÅŽbi7Ù²óC08D+¿~û¤!ÇÉ–KÆÜÝÓç×Ã?åùã_{wÔ}÷Ú©þÅ*ô‚,r’,ô²8Ë2§5ÎÚùùÌwî`úõÙ·7g¯´r2˜bçfíD±gÚI¢À‹â̹)œ÷î‹òö¶2íb©Sío±T®‚ÿ¢@Eî¿;Ó~Ýádè¾ÊÂ,–«ÀUáâ·›Î^Þœýq¦ˆ5¦^¢µ³Úž½ÿÍw ˜ûÁñ½0K=­Ü:Ðö€hWÎõÙ ËAâ(åeQLy´—F̲öàO‘û¦Ö”[˜¶†F¹¿”uÑ,`hßñÀ?ò½Zd¡ëyÌ&0 xjÕlwe•÷eSã].^¥Žò½ÌÏÒU±—éØëzQ&„_4‹ u÷uÕäÅb[°ô–(8µìÚ•×ç­w÷'Î*7¯e™ùØ·ùªçNÙƒŒ?s/…®¦„¸q¤Q¦Dóªiû徬u0Ãd¬¼4 ìÒ~cZÃ4rn(·3¨ÏäÛ´yŃ»äÅîïÆòôÁWae:žF™­›é9K­#OëÌY*íE¡ X…y‘úîª*M#p^'|ó ŽÝÖT9Ž?²Üq¦¹7×üýOÙ ÈN^÷CQ6<ø~ê1ÏW«¦-ÊúŽWõ å6Biè7MÛñŽûš5T™âÎk¥°TÊš»Mו 9êå,°ˆ%ÝÚ?¾.˜ ®)¬·`gè˜!h®[C+B÷ °vÍM¼WOƒß}ó 7^~ܵ¦ë¸ƒWä–)J´Dºoê^µæ¡l†n†*HÔä‘©ý"H\R;öؤMaù›½ 3…,ÿ(<ÈÚ£ü¡í½}yÃ-´ˆ®Ùš¾ÜaZåŠ"¼E ú…Ö=4`Xã}TêÞl´DÃéà²r+6ê¦ç»abMµ½)ìÉdJ[4i0"å’q{s—¼Ä“ånË»µKè’¸šö^ze¿áVmöÄV'ëPâD¤ž¨)×ç¬ÝÛAÖŠÛa3·ºáïÝ·Ìuo é6tâ{™Yï×àÒ*½ßÆ ÞCG.ÑUski·’$buM5P€[ê0/‡vD»B¾î¹ûíPV¯#Ú‚‘ÛLƒæòž—t›f°k:s2< £²åùº§„ër^³ß€Užcäz+ë¼}ä)óQBæ`ª"v¼}_VÏ¢6ÀÐçTÝõM‹¢µ†ƒñ¢N椇˴î s;Ü]̈R§v GÁÓc€ºŽC»æ;äÜAaæ…QxPf ·iKÓy¼ø8Õ-Uy* ™(m³–l÷£¹ËWŸItoo.À@ü”âB¦Æçb ÅsUâ¾½ éPîíH é^qLÅï |À«AÅ T±ñ›^¡þŸý7‰ß`3禋Ñé;»ŠìæJÙGž >, ~:™@ ªÉËtæÞ,ÀGÎaö¢S«‘P‰Ð&ƒ£¹ÐÝG:{àÑÑà¡]¥~ùnaãÏÃrµÛñ*Tá"ßKòâDpGýw¯Ï>Iú>°èÇÖR6}¿{vq±ßï½ÛªiŠnc ¯6ýEaðz›~[1-O'Ú Àˆüt´d4 º¤&§„ ¬á”¶°sùâ%Ë*„|Ÿ5L£el ž}l0Á¥*9 bw[Ö¯áæ¨Gî6kþ¢cRãn…²[qgŽè1†hùn¨y ®‚¦;¤Gá &ÏÏ›1ª2ù Ää÷•lÃÜ4BŽ6gnS#zò}á:{*œ¤ Í8±þ—,ÎE“ô`‘œ_Qš€\J)GÊú@‘®ØÚ ²'÷aË©Ïï)rÍ9æÒ%€Ç{î‚»ÎEÞ `|r jk¸ÌÅåÛW?ÍE'ÚPÕÉI°¹…éó²z*š&>ÐŒO£i(Ñôòê!æ( hcGuZë—…ÉkCg·{ìz³í¸S°>t Ï`cCøAd‡#L[¦Îo I…:†4‡G3ë|¨¨XHÅ­àxˆó¥PaS©d!´ƒXâ.Xå²·C—»/Zá̺©*v7táOb¥Ãm–&€ c¾6™A¨dÖ<1’Ń!h0¬Ã}CK¨<‰;[Ê¡È$~!—>r‹}.ÁÂéð%ÃÞ˜‚9„riÊEU¨}Œûšjƒ”Žà¸\?Ê¢96GÝ ¼ e—(¦+ªˆùÞáì|.~ˆY =yì©PiH Õ³Y0žöGÄ·ƒM@6 }öL͘cñ9Õ“°îÿXR`>râG‚ó¸% ½H…SJŸ% +J¦„&ÑIa0‰#R>Ò<ØtîLÏ ÈèPvh—@éh J>±^ÁÅ& >˜Ý1”gGÅÐRµ&/Ù÷áÒŠ-k, 1+K8€zrÐXz© Ç8àá+‡lymúžSM;~íª©`Jø¢˜!H @áã><¯¶ ¢“PAIŽP[Ž—üh*åþˆŒ£WÖ(á#e×·åí ~‡;MG.­™bçI 3FhK$AèÀ¥h£ö¹šJ”²#Ûî8š »<Æ®—×+ó4´’é<ÃNMÞI’jø+wІ [ ¹ûûÙà‚ìðÌ@!omÓœ¥Pv#%l`4d\†mñVÅ OÉOd“Æñ;:gCýlM©#ï #ç*89†uÏÐÛ²I‘Ž 8‹WÜc‚½l¶ÉpZ‡©x˜²|óN¾ü±v5Pš’€<g¨6!AÝsó8-áˆMŠ£@´§ ÕV´¬ž«»ùNÙ™{qê¾³áeÛÙn ¤r§|êbIâ¥I6HX™¢Daé‘tàÛ <é¥,RòB ¼Ö\HBÄö×YÁýÇ唇R–=’ú%t×UPž*h&NÔ€›¤pt(=ÊÆ`.céam¤eãÐ!+bå4gñ ª™ #(ê¹ôÒòø‚ 6õ­iéÙ‰ÑU·jË Ìê/T"Ç”d=âců)#LRñøZ«dŒÐ‰  ÃZzœy¤÷Q9™2%-d¼ÏíûrÇÓÚå Fªûò²>É—¦ëG>’ƒ^Ð*2³§µ+üFÁiH‹·à—΂oK¯½‰+ÓGoœKá žªæ1ê'‡§¿7ókÓïéÅ;»*_™me‘&‡Wà !j@$½ï›½€¢¸*üáeŽO<>]µÍδ=q.ë$^pøíGŽ–úHJUŽO öa'¥ÇÈ9×iÇxÕ~Á+ã @Ó®áꈦÂLäL¾ŠK¦o ?Ô!Ø—Ÿ¿âÏ\8Б§þÉ}±*ÚZ}ÊÃÖˆ½ Ãe ¡üÞóž"£'bÅû2ê•<оà•^„ÜT"cùúTÆ,ˆr°e«M ¦ì;®ó-£e-œÐú–àq-—þøƒÐ_év ˜¸°0ö«i„Þ~cw^ÛWKD”åÊð0½2å£aË °sú~QŽdh .'©ÜÆ*BÄ C?OiûS ýžŒ?Íà`ÑòÈC)5½üò¢ù'›Ã+B4àŠ‰¸à>FâDQê^—Û]%;ÚA˜±pq¼?]˜(cQ¡1G/IÂ)-=#ä7”m€ä5þR¦v.‚ñ<9yVûļ´Ši´P ©X#ëߨ:B³?R„^œýû"O‚xú`,XVR<ííáPEôžcù²¯ô“Ü}‚lcNë ¦%Õ¼r|Ûkù8Ö&ŒAùKðCX¸6ö’úèG¯À‡Ô¬N ÐW‹$ÐÔ#4+Ss…ŠyÞÝÓ`Áóç2Ô?hßíARÜgÞG\h¿/oÎþ‹› endstream endobj 985 0 obj << /Length 2536 /Filter /FlateDecode >> stream xÚÕÉrÛÈõ®¯@é°Jl¡,íª98š±3›£XLrðøM% P’çëó^¿@ä)—Åî~½¼}Ã'³ ÿ_ߌ¦ïßz¥À¿ˆ+&tèÅZ1i­½Úxï_'wà·'_œ¿‘ÜÓ‘·ÚxaÄ"-½8,Œ´·Ê¼þ÷ùõuaêÅR&Ò‡ØbÉ}BÁCÿß©ÿÖ PùoyfKD\ø<\|\ýtòÃêäÓ ·øðþz•°XJo½;ùð1ð2€ýäLéÄ»·;wŒàã»:yŒ2˜4â,$KBBY2Å`ÈÃÀ¿2m›—7„þaO˜þxyÑJ^Òïó2«’û÷ î;zDHÄù›dø ˜–‘t²P»ÜÀ‘øŸð§:àDûÛgwøÇ8-j“fŸ |o÷Ö·„ŒV0j{ÀÔ‚Û3Ú=ºy–ncº1Åg7¾Í÷n·@DÞФ1ë6¯J›RÒ_m*›ª(*¼ó¾?3ͺÎ÷¸Éö–¥\²P9u°X§x·þ¾¶WÜÜ3\áþõÂrÁB¯ªkZü-ƒÁõ"`1ˆ\x(wÔàÑüýÛx©©®q{ÚÂ_¾Í›jÓZ|"öÓÚ°õït“S 8Έ'@gZÞ6v¢ab™ïI´8¦MsØm·iK£+SßåksißZã³·Pt îCcÞÅ+Q³š6- “±1špÀ >! Eùdχeþ÷$Ÿ²¨Rà®Dû(åª0nqrG)DË à"™yp M]í^}¿ÁªÄPÉ8X$€ŽEpÛ¶ûWçç»&+Ù._×Jƒ­«ÝyV‚Íy“Ý6çû"m7U½;' bq’›œ­ ¾wK›ýˆè‰•E8ìßOËŒ¸Ú¤(’Þ¦Ï-ý¶þ*?¥)(7Ð:-húžY/&¥ÕB@’ö›‡t·/ÌYú„ 8<É;,.^ýÆ¥B3]]Î8P¾P…ÝfRÆ‘XÁÊb¦„¾€ƒåŽbVøoà•@|hš’,ÚÐxD™P&do_SB¸Üâ𢆄œÑõõ¡œ»]‚¹èö¯¬|‡º8ãCA/’$‹0m®ÛŽhÓQÅÐ Oε¾šljÒÝ”AK§„ð‹'~Œ|âX<×p¢.”k¶\"OåOq´ÉçǤ'áÐåÌÙ¯€‹Á”Æ*¢^²_-Žö ãž$¯+"6ÍK ÃÚ9y8žShGfÓd^„, Õדnõ*ò+ÊCL9ÁÍ  âˆÉ°W¹Tí&`y¹™y5Bmî_Í»Lú¡0 E^¬xâäŸåmU?gÁ톳âùãÜùê‡ÿ ÀLÝ€_øH0—9õwp€#eÈ¢Ín!ž «„Äxq ’3y¨ÈK·ônuL3›fÄþ- ¡߉0¢3ÖÙu'È«9JqutSboêúŽBã\(UˆQy ªƒD`ö‹}ãØ•ý)}8NmöÀ/f:H !ÌE8Š¡œ ቘ¿ ÃæÖS±KŽ¢—ìKvQ`â/×pãи¬oéŒK>E…LOÄŸ2.= §ò¹pª¥žXÐ| cpt=BSkP\0ˆ±»ŠgÙùÞ@¶Z·#&!wûCÛ¥M÷½Â@Þ¿Û·RÛ`lyÉìK¯7öB¡—ÎÂàøŽÐ±­\pµ&œL†ì B›ÍŽÆ®l»¹ohÁÖlv¤ú·mµwg×EÞ¥ñ¼Â‹ÈUZyvìà®+·• ÈÆíFó™Ø_ïœ,TÀ‡¯áô9V.PðábÐ…VvZ,±2ÅÉEU–ävlñ¢bÿuCÔÝÀ¨2mó;¼Ýâ1–‡±-íó´7ðëüf‹€v9Áè×ÏSÌl):,jœ/‹tmš§}Çàbœ^Ö]ĨۼwÏùg=¯ódŒ¹TÓMü£º4íò:m¬ÃZ9!Ç.:Ášz”¸K*ú½ßÒÝ[škl„YWÚç"ƒSi– q‘º«Üa ,£uY`U ×YeŽ|Œ'|Œ}›óÖ¨9¥¿¶WþÊÚû’Íâ3ú³ÎvsçÅ,3â!3lU:fȲß ´«²~OÊ]Sú»êꨦ$¬™œ&Ñà°æd|1T…!Ùf÷+á]H÷Ÿð.Ý¥üéÀ>ôaW¦0kçØÞ=ÒØp·\@9J=‡I›i)S­nèØµu>gOÙÂX¾À‚€×Ù n•‹¿ˆð¿ñ£¥#Ò˜ø¶1&°WÒ_»NML)ÿRÂÿùó —_¢EEÕ˜aGßqKêþ™´^×&íÔõ´Ûj"å r0ÊžæsÑ}Ô¯\Æ,‰5–°„«cÃ2üú†å»•ú?íW授oÙ¯AMú•V\®_ ÐUW¤Áxúÿ¨w{WËGW«ÁÕÒµB©å7m€Úøà ß¶÷¸kê¾ùx—K¾TI÷ì>ÒÓî#äƒ&­×ÛIÒâpu¿¬ë<&,“±2lÛÝs=GCzß—®ïÖ;°iµÔµ Uïp^lAþ^†PšEAü¸æø^}© ˜íAÊdìW_ì?&¡ó›I4¦ æ=M0~ºÅ¥˜üÏ“€.Eëgz\PpvûŒ´qÆ'‚V"÷„cÿ&ŽèpPâj5‚FÔx´:¥:¼0q@=ǾªãxEÕ™Òîa\¸ú¶Æ‹ Tý—¦À/r¸p:©> stream xÚm’KsÓ0Çïþ;½ Ï`¡·,nÐB¡\x„áöàTN¢‰cSÛi&ßžU䄆a2ŽöñßÕOZ=§ìüõ« ÷û-´Àðg¸¢Âi°NQgœsÐ×°„oƒ¦o³÷³ìÍGÉÁaZ˜-Ajœ«ÕÆÁÌÜ܄Ţ©û¼¥$¸Í N8þiÁ5ù9Ôý«!&¹Ý_ç…`† ÂMþ0»Ë>̲§Œyø¹½*©•·ÙüÇÜ0ª\ û£r hSäG»Ù_ä ô8£Ž9Ñ-£ a…¤¥NäŠN50/4cäº ¹(É&/+ɸ®£aÉÕ;ï)¥WÉ[ìÆ±k“¤j} ¢¶ÄŸª\XòMõ7aØÄz¼c,ùuÖ†qj3l†9ÄÚn—œe×'£J2}^£) Y…—œúœ‰—»¦‰'.©SPà¢Õ4µßÕ¸n«-*¥”dìâªÈ~]÷Sè;G†èø.íÛ¦«|í§šõ¤\„¶ê“0 cðrB¼œÙD¬ØûžiiðI‰—ƒ‘Ì!–ÁÁ®ßÞs©>}6_°ò¨¿˜£¶TXqRcSþÏñ©1ju …ÀWÊMêÿÎ:n“0Ã(Û.ž{?Ûa¬š¦ö—ŧßî+ËÏ endstream endobj 1021 0 obj << /Length 3342 /Filter /FlateDecode >> stream xÚ½]“ܶíý~…¦/ÑÍxeQ¢¾îÍMl7}hÜä2yHò [ñvYk¥µ¤½óM§ÿ½ø¢VÒÊö%z<^Š  à}ðTŽÿ»Ý¬ûã[¯ñBø—*DEâe…Š´( ¯3Þ½÷Ï«ÐÛÁðÛ«¿Þ^½|+¯€á(õnï½$ Ò"ö²$ ’´ðn+ïWÿ;{wW›îzç± ×å+øI"•ø?÷¦û¦ÇAí¿=ÙÊ\o¢0U‘¯²ëßoÿ~õúöêÕ"~ÔH^çAÇÞöpõëï¡WÁØß½0ÐEî=æÁƒïø‡ïÚûéjÁr”y Z¬ÓhÊsyÂ,kàNE‰ÿæºÐ¾)‡SgÅ,ñÿöÃu¬ü_n@æ^¾É=EX($¤Ò ˆSoí$bJ·{‹3‹ÔïÍv°mÃ-|D¹?”¶‘aÛÜ·Ý¡<£”w ‰ÜoOƒ›? ¶Ùqçtäöá:Ìζ'!sV6tî…uÐxGþO¶ÙÖÙzD¦Êeó6N‰–½,«ÊT€Ç~g¶„Èü¡¾VþÓ5lî ±Èq¬}ZúM;ðÇ¢élÛñ3{Óôö—5À¥Ö h¬ 7ß|<’*€S·øÐò[œ¹/›̦ Á­UA‘$´µ!lF¨(—m ”lì»Îü*ý‘7µ2µÙ±ê?³«abçéQM§CŸùFxÉ݃q\ÚþÀ d$œºnqô±—êàOË€ ÀtBq ¬hú[˜„¿©X—}owÍ_ «íØÁÎ^o‡iU;Ãà{aÛØõNÚ#-QáÝ“æqÔ¡5èã”ÿØvï{7qMp'8$ž «švp'ôí5dü,iµ¡ÜîÉÚ*rÃàZšjAûBg+t':ƒëŒÑ"Ç–i ꎥÙ†ŒõxŸO÷y6G‰vu~³2Í`‡'£V'ÃzU38m*Mh¹ÝîI”¶—ù%£OÏýáÇüXá­ ýæ:Ë|‡a>–x _àU"kŽx{d»]ÛåöTÃNè°ðïDqø}êÝ1§‘'n‘I¢g…ý}°[7`ìqÚPSÇÈ´ï­L$ç&ÍBRœÐξ=õC{ j@ÿïñÁöÂák$ÿáŒØã¶†ÑÐûî5;nD«ÌÈçŠôåÖy Š,¸Å&[8›\´3<’^LÃ@6^tú§»~ÛYFâ†ÑavMY3Îäà1€ÏÀ™LNwÖ¨VD÷DjuTi¼Í @©Ÿ ¦Rßb8„¾3Uëáì cÀôÚÄþ ˆÇŽB ‚àÜ8é”ðw°%ß ‰ü[3Œ…N•CßÖÖp¸¹$û jÓì†=ì‚{ƒ ;Õ"šhLg$„Wͧƒ92iÅ“h3ÓDâA €2<͸çN†ê¦ºËon^ÆÏ9Òœ‰¼™ƒgzÜ9”M¹£p0î8 ¡Tn'蜷%I5œöc®ƒPÞ;Äùº/8™éItR)²íV|Ý£­kŽYÝ Å¸õ¥ÎxÞ‹y`ËöŠaò¸y½ÈÀ¢&‡„xg‡4G–>òW6ç€]BíùÚLiTv¶5hr, ¤ Ï(”š ˜ZKÑtár¢1EC¸KÇâ Î3J#'9Ù—Wp˜+ËÄA¦£e&.|öj_Ƽä'Ë‚0L–bËyøÓrs¢M½Ž[0‡ŒÚeÚÇj³­ÁÌðP&þ¿Ÿ¹}Ïggu£Ó8ÐÉ×T+ fË®Aàc‹nå{‹¯"».€»ô+ÊžÄA‘©Qxç¸Q|™ã4€kó+Z¸ɆÿçqIqÊû¿{¤8È?â‘ܪS]ÌBŒ,Ò¨ð´ï¢dû_Qj‘Ñ%ÍÎ4¦£8:m|+D‹xFåJR)G™‹8ÐAì@—ŸÊ¦×ƒâ||\.囥¶."àK‡Ö ýSS›^¸›ÝHDtŒqªÁ½åb^rqÎy6ߟ€ÙOÓ+Ìݰ)K ¬Þµö‡yM‰BÑcÿ±s3/À2€HÕ¼"y9,Š›$ ·.¤¨–ªùFºó°×n\8£$7Þî7x»ÃÅÞ™DºYñF8æèëb%–þ"2бšÓ‘ŽAô$žƒÑ]Çœ`Um&–Í"^B˜èR+Ȫ{Î;[ŒCvŠÈá) Ré“p,Æ0*¬±¶2SþtÉ:©þ¹ÌN G«¦Ât„4ˆqå‡yj"j Ǧ¡-tž«ŠøËªPN”²ñùˆS þ¬ <-*¡"€ÛF5²U·ÍNˆðɃcÌšÈ1öƒ¤L£’ufY€¾ãòEè¢X¥fG:ôõ‡º“pÙ<ñ~ÆUlux áXz~‡±b{‘  ŽðÌøPEl›»f©ô,2Õ¼þ²æóD4Ÿë¥æzt0¨"íܺ¶g¼;\XgK Z"×Br=Ù"Èl9¹Í¹ì€mÉ3.ì`—I0r@®Nõ€6Âñz/ëPŒmm›÷›O)¿frÛ²¦5fæìÔ#*q§p)ÅÙÜ¿¯’Mª7D½RÕAøÄ‡žAg[ÁÞ¹"&¡¢½¦™u[ZGèþéº-\¹ÎýŸL‡Š˜,7ãÛúTq½º@*ˆ?}¥ÈUÙ3ûQ6fU¤@¬n»Wê”uO•ê¶àXÞÕ†Á\¾Î±œFmÓ6›~–Ê®ŒÏ}æ¿B#9š#Õ}A<+WÁs/Ÿ«üð–Í…ý®äCM‹îËf%IåGJæc÷dDl[\Ž¥Â\ø­lc7VŸ‹3ˆØ™Ÿ>ReÅ@+˜aá(ù·ŠVŒüŒTã¬ZºÓ¶/Ïe©é~_„Åéó…?W¾ö¡{3ÊÙ¨Ên!YòcSe¸iÍAT?EÌ’§îÁÏ™4TÇ Ý—áGó:!~: BwjйR/¥ÃC~\Ùñ®äc³Zl¤#*â*V=Ø-yS¬ûÊñfn~ß0t¬.e*.-?6"9>€¾±»àY> VHè±qᩨlœÎ 1\ަVkç ;ý±¶"…¨SJÜ17—¡¢¡ÛõfMG {Qؽy™¤@*—½ÔyŽV¡^puo1#šÎÈÝ ²£ˆA¼ ZÌŒ/g^ú" Sbz”T4»y"OG³(Oñ‹ìÖÝYxD*•Ex±u ÿ¤bylŠÈ?Es$°×8 § Üa§/¯<'[1,šø NtÍp»;;teGIAê ²üÂ}<ÿUËßòšÓÄ#2„‹‡É4ÐJ!y°½e¡;–B/gä#‡YM=äE’ÁpÛÔ‚ßAX ·–¨†¬ðç"ÀTLq ¸Ói=™VgÎVTÐï1Rê8FË›N¥D* %Œ´X ¥phåúÆ÷GGĚΕÜÏÓéE88Èù'lkûýÑ•’•¿µ÷OŒ=‰Ôi…™gcy2ü¨ØBŒÝx6î¡ ÐÿäEˆnt35 Ä ðKÌŸ*êoð˜ë²ñbðÉ;·ò€ê -Æ÷ëªež6ÓÇ¡äÙoå}#L‚"…m{8p¦°ÊîÌI%“ú;tNl½Ê?³(²¶w'F_ÜuøözڞίœÞÄ—û’˜¾X9Y¤™žù¹ö)ïg? _%ÅÙæ‹V‹éÑŠâK+ŠÅŠðÖ@m6¯ ¾Uòé½=!är%Ñ™‡ö22Ç=˜<ëÚA²I*^æJ8"ŽZI@\Ìxšÿ!̺៳œÕ«5e\kÒÊ?Ãÿ€±ŽX½”c¶–dN˜ ³’qÞÌßjµd7ààí'âÿAÆ”ŸÂý Ôc“jÚz 9{§™º¼ü“¦åÎR€éÊ®}}{õ_{öú endstream endobj 1041 0 obj << /Length 2650 /Filter /FlateDecode >> stream xÚYYÜ6~ï_!ä% -‹uí›w}$A°vœÙ v8»[°ZjKjOùó[ut÷‹Å`F$«X,¿:Èùâ© œ~ûýªûá­×z!ü¤JQ‘xY¡ƒ"-ŠÂë­·ó~Ý„ÞÈo7½ß¼x+¯r”z÷;/Iƒ´ˆ½,‰‚$-¼ûÊû迪Ûßmã<öaàn«|’H%þ?Û? QûoÏueï¶Q˜ªÈWùÝï÷?o^ßo¾lé£&ñ:²8öÊãæãï¡Wíg/ t‘{Äyô €þÐn¼ß6³ÊÏ}Ý JÇA‘D^K„E„K|ÙIf1q,šDB¾TS?ViæŽôâ§£ö^u°ô¯W‹lÝ*ÛÅ2dÌÜSaP„…Bcª" âvé ÉÙ˜oêý¹Åqìë¿ …àâå,Y’Á:Äÿ¾¿K”o?…Jÿ³’ܯlcqloƺkq,ó?…IHŒÝy¤“¾šx0_ëî܃¢ã¸´Û‹7Qæ)»íÀê[•çV‰·Õ @ c-GpÞ*Jü¶1w±òŸÖ}½á4(âÔ€™5Oý UÌb8š¦áfkÇ»(÷ñO×~`hÍô0”ÁFîãîe_‘ßöÂ}è†Q覭¸ÑÓöÚ,Sú;°·Ë®mm9Zá;ù„>˜£½©Ÿíþh[qç`(Ù¬ŠƒD‹«ü‰›ûçá ›yâÎkX¡G‘ÔÐy¢h°ëùk<5hÞî‚Jᛲ´ÃÀäXæÔ·$ºqú~ª“¿?Ô ©E€Rô»`3ß¶õJ1#3øh@DÙ8¡”¦%s„lˆ„íÐ[S"×TxòáøžûU-ç¢ür;Aè@eUáÿ؉åy>ï(‹üÆô{7> ŒÄ£“Õ±cÐɰ±8vì~­ 7+"}è&Í€ÙÍ<q™s[—ìk‹º'›F`vä†i`k¤™ÁÉOB?¤;:Ú¡†xŠÖ‘ÿ®e:ÃÂ…›6H©E¸[í<ØÝ¹‘™ó .ÊFQ­ ÚóüÀ‡ÚÑÏ'ÁM?Ê"¼ùf¬Oiêö3ˆúŸ·ì1tG‰nÎð¸ãŠ‡ØºìÎm¡áæhÀͱ-""D ø[^öO$3~óÔ‡ÓÁÙyæï¬9¸B§Ûñ— #—;è“-aþx0ãÄúÄ-#ư¦g&#“L9ȸ=‡$!îúîx±èì/ß “aöÞ…®_kû<]îv×ÑÃÂ$~ÅámY“f0búÞ´{»20H!¾p.˜M ¹‚DùŽ 2âÉ5µóÔ¥¬ò<¶ÈŠðíí—3œn…°†#}7É>kh"¬„aÊ»4+Êa#Õ±nëaUQý(+®¢²¡ý†öC‡.y ¡~ÈÂ`ž‚ŒX3ÔP =vÌ}4­ÙËÚ]+W?þíý×”¦3G‹ˆF„cd¬ì©¡øõ䘑K0‚gƒƒ ÃLè¥û[v § ºÅ`BÈcÖj°Kc'“Ùx œ>SäyÞ§~{é<'{éìvœÂq¦F:Z égLO@¤íã;2-] )‘0€Xtl9Lö8;cûÙ¶/Jo¡Àð_O)E ÃóÎÂâsO)r•ø'f­fç(†â—àŠ)x‘±°_;#KsÎíPj½l0ç=ì9%yõy¿³B –uZ@«_ëd®T~& é,®”Ë3µŒÈaªª&¿W˜ªhh¹2ö¯"„Î’içèÜ#8µ²NØc=¸5Ê…Š™±ž«Ü,9¤O%• Bè”–Ï#˜ö‰™[¹äú÷‘8>A œ3.TÂk÷†1¬phÎ…7טN}wêk3ZG¹A¡ªª‡Ó·T`¤ö{®á­(ÀA#™#Ž]ÚýYlw'¤kCÜ8ƼÐÇÉ`jðIîs+8Hã÷Á TåTÐФ§û0‘Ù§qÂÒ]É|b¸&Wá$7CòŒÙíΔu»uxÌö08©ž„6Ø·°mÇC(@Cr Ç-bìŽ ,M¶¸î¢)lSq¿^ÿòK‡ÿlß wî”Rþ¿Dîä«Ð!߃¯‘™b%!rÁ€‚+Ù^Më]ÑQ)°k¢Sÿ}ùÆÞÚ^Ë‘:O¦JÐÎ5{žøîû÷w÷L2ܧý6Åè’+íÔÄäZHÑ£NÕÌO'(fùnC"lßt2.5â­fË­®•Á}¢¿­=èÚÃÙŠBnBâRЇškáSƒP©D‚âá„q«§«šò§ÀÒÌUïø;•ŸT¬‡ó\¾cJÙ˜ópQ»TNŒ8P+eŒ–»΃ÂuUMMa”¨`†‰^vã¤ÍŽ/ç Ã bWó24Ö5ñcÍW. ÷x,%™×mÙœ%Ä l‘¦¿ñ · !¦âöâŠÂ|!Ž@Ÿi¹22mÄõ+›h¬’ t/˜®ê˜++™;ICr`fìÚÕ¥;ZÄ{ê—.k¹Sáz1DxFázÝÈÕMÐZ-öleÔ²ˆÇCw£Á0gr•¹•”\TÆf¢<ˆ=²”Â;(E9b…󌹶þr–kÞG¿mÍP+¨[ÊÇ ,Á…\sµˆˆšwÁo$}“ú›ÕBËð¦ùš1è,ÝëÞø}œÜoº˜õãd"^I^½ÛàsVJZ`¯‘Jxg]$¥»”FûÔ\Õ~æ–˜üšïV¬¥äA)DÐÕ#Fcq‹B?–Ö¥K¾›0=þÍð‘uÙýðvã}„ ‘Ÿq¯ÞÖ„°£ˆ´˜#ß¡aô /Ôá</ .\«b0ŸpÇ·èÿGà ‚ƒú¦†ePäjÚVŒaŸžið¨ùÚr+¤¯áòíKº-w—_<Ë— Žf¼x°ÃØ^s Aîbõïïd•)ظGÀ²±Nr÷_š Ú ÁÅ=+ògnü‡7Ïz_Ò1ÅL ¸š= rT®Cqäð-ì<»!Þa¡äÜ@3MUÞ`yœÊ[œv)Hðe»Vƺzª»óÀq*Õõ·ôÁËÞÁst˹J¨Êº#ù.lÒ|:ÉÖßÀcÑØ¦B•&u=Ljˆ ¸Ù˜Ñp‹¢B"ÑæË^yT,i›åÐme™ó«¡›y‚bb93 nìnÒˆà1æªjàòêòur–;å2ÃSqrc¯]&™_ϵΧ×Ol·náõ+:±èÓšÓöñmm¬VºîáÛdG»‡:î¬ýPÒü`ÀÊ3ÿå0œ|.š®ÌG .¡ñçFôž÷QƒGjuÇ>¿3@Cn`lT(„šsz×Ñ„N(ÔL_wÌLv€oe¡ð¥W`䡜ñÑQÐýŸb)ÎH/â¨O:po‚Oÿ‘@.¾áJË—ÚÙ(Ѝ ¬ÕÍÿ̼¾ßüíîIÑ endstream endobj 1015 0 obj << /Type /XObject /Subtype /Image /Width 1524 /Height 878 /BitsPerComponent 8 /ColorSpace /DeviceRGB /Length 83526 /Filter /FlateDecode >> stream xÚìÝ \TÕÿÿñ¿_)ßEóÿ«·¤oYTj¤îá–¸%V*išŠ.)Š .…©HjJŠiJJJZJ¸D©…™Š+äaf)-}¥"[ý<Ýfî½sg¸ƒŽ¾žÏÃÇ8sÏ]çŽsÞÞ9÷Ï?€' 2”ANNŸ$€r–••Y¥J•kØÄßß?$$$444)))??ŸÏ€7ˆ.g“&Mè†ÞÃU=¥¥¥q­PÎBCCIxe—@/¸TÂÃÃù¡ÀcYYY~~~Úžæ¿o¨~O爰Ø×žHÊ¢(ª,õÈŒõF/%Ω»Úô'—n¼#ÎÁ¤¤$>Žî*,, Ðö1o½¯}¿¶Z²‡¢(oÔ£ÓÖ4ì:è•oн€§¸¸˜Ï%€u¢/©íZ6h>tÙ^Š¢¼]ýç¼}{ƒÎ×^[Ñ!Þ â÷Y‹rrrþv›æ[ë [ºó©WöQåÕ0+£y«‰ÁÁѨZõ‡x' €x`EXX˜êN^{]…Aó6ŒYy€¢(¯ÖˆÅ;[¶ž=t袳gÏ?ÿÛ!ÿç®u¸z§°°Ï(€ ‡‹v‡öž°ê EQÞ®®}G÷í;÷üùßÔù8}úËÿøÇÿ9Ü)€‰ÈÈÈ¿nŒUå† +÷LNͦ(Ê«5rÁ»ÁÁÑ-[N8yòkíùxþüo}ûÎrˆw¢¢¢ø¤ñ÷÷W]Èv½GN]û!EQÞ®^Ã^ŽNHHw>%wïÎ |íµ~Úx'''‡+€³ÌÌLmÿqlRFܺCTÙ«ë ‰uî¼W”x`½Õè7xЪ|榭AÓ–µïý”œ¹(ñX,‹ƒn½¦¯ÍnÚl|ppô™3ß鞘}ûνûîÞÿ{íuêÜlÒ¤ ŸWgÚdÝ|GƒÙo¡l©ÐÇG––òøHë­FÎ]ãA«ò™›¬þ“ÜÙð=âùq‹6qè­ÔS37È!”NÌ+.üb«aÓpíNKKã# à @õ;÷‹š·á(eKuê;JîUñÀz«1óÖzЪ|æ&ªÏ˜çÔ»å¦un¹«¡,ñX=)ÊÑwY=$G¯[·ÛèÄFÙR]û•f;âõVO/Ù|ëÝ Eõ:¥ìë0~þZÖÁ¨âR¶« §éƒ8¼tOÓvò%±ò}—Õ¬¹Ù²¤ˆˆ’»hEÍÓž¤ÉÉÉ|p”´´4Õgüç¿*-ÎÈ¥ìªnODÉ+\ªu˜´à סy‡GäÜÄÝ n»»‘œ`À¸Y¼L*.yWpptXXœùé™.&6ùµ ¦m¹:@WTT”ê3Ö»¯åË[>¦ìªîFË+\ªuxzá:סZÍ íˆ?ç¾öîƒ&Ì–‹kؼ=o“?ëÂ`;S¦¤˜ŸžÛ·“õêÿâIsµ—îðÙ‚‚‚T‡1¬ßˆÛò(»êÑ¥ÙŽx`ûÌç¯ÝùdÌ1gQâÑdÏ.Zo×:ˆ%Êlçöz\.ÎdJÔ1¯G§¦¾o~zÊ!wÚ…N}ù­Ãÿüweuª&%%ñÙüýýU‡qÌôE«3SvU¯Ac䎬·Š{i½­Q­´Ové!k/äOêÎÍhÔ‚ŒÚêÎMTt\’ÉrqwÔoÄÀ¤z|188úàÁ.ÏЖ-'ˆ)E“V¡«ÃÂg@ÒæqIo¬}ÿeW=68ZîXñÀz«ç–¼©ÛªzI˜Ó5|P`ýÆrñLõ¿'<÷·|ÐâÜÄóªm›Î=lßdçyEÖ£Í Ž>rä¤Ë34,,NL¹òícãf$iï–Åg@ÈÏÏÿÛýw6ìIÛù)eWõRtˆÖ[=¿,]·•ŒbäŸw6hõô\ùüÂÔmíºôTqú‹«]ÎM<©‚ÑÖ®íMÝzDÍÖa5(‡êØu†Ë›dI}û^H^Ù“¸j‹ölåNè!++KÛ[Ü”õecõ‹+w¬x`½Õ Ét[Õ¨]›ÜuOcçVv-wÄó¹‰gÔ¬¢cçÙ¸½jt×ÒV‡ŽÏGŸ;÷³Ë“tèÐEbÊÅ©»×¿Ÿ«=[srrøho€^­z­·÷åS6Vÿ¡¥ÙŽx`½Õ‹+7趪y1™”jÒêî Æ&sUóÿl‚Ûá¡^r¶bþËÞx£o^ÁÁÑ¢¬œ¤S¦¤\ÈvVí­þß 7©Vœ¼|‚’““ÿÁ£F­w|NÙXÃÆÉ}+Xo•”²I·UÍ›o¹œÜ|‹QC9A½ ûŒæ&Ëi„‰Ó^°qK;vë¥ÞHöÎùЬwö|Ý©ÓT+'é´i¯‰‰ç$fˆ†÷4j¢ösBBŸ`‡lgGÎ)ÊÆݹu ¯u1Ø1™‰%æ¬ÞESf¼ÀqwYéÛŽG÷ì9ËÊIºté;bâYó7‹†÷6nªvull,Ÿ`m¶S½F­]‡¾ l¬'Ÿ*ÍvÄë­–§¾¥ÛªöÅèÆ¨¡îjnÜZ%“z M¨šç33çsЭTÚ;‡‚ƒ£‡]d=ÛyfÆë¢!ÙÀ$Ûñ¯QëýìS”5xøÅëv†·Þjɪͺ­äU7õƒî3j¨;š›š§ºþçÕ´íeÙ:Ñ\,K]4ÉޏÅzs«Û×íÌx>]4 "Ûg;µnÝvà$ec ¼8ÞŽx`½Õ¢”º­Ôp:F u'Psb¦%ˆgzö"ÿj2+++©†îóåp[¯;ò‚ƒ£ÃÂ⬜¤³f½!&ž˜!jÇÛ!Ûª«ø¯J•3öæS6Öï“%Xoµ`ÅÝVòþVwßÓØ¨¡îjnô¬žÓx°bÚyª›m™¬eRîÞ'kAòvѪAÿ²øøx>Á¹¹¹Úì¼¶åû?£ìª¾O–f;âõV Ë7趪Q§ÜuOc£†ºèÎmfâjù¤h²øµwÝÚ(1Ãö]{r”=«;>}þüo.OÒ¡C‰)W~ ZÕªs«:[SSSùÚlgnòÆõ;?¥ìª>C¢åެ·š³,]·UõZ•;46j¨;Ñܺ=6X>o2CçZ½õˆ\ŠÐ®KO±ÇÕ±ëŒààè3g¾sy†öí;WL™¼!G´º®BEu¶fffòñToqh̬5ïBÙUáƒÇÈ+Xo¿$M·• Uë76j¨;ÑÜÔôn­^›Î=d“û[>Èñ-K=òØ…Ä&/ï´Ë34,,NL¹|Ó¡—Òvk“Øüü|>¾%=Ç0Õ[¼çþV«Þ;NÙU=#J³ÿZwÔod^ϯÜ"[ÍX¼^¶͵só/‰bÄ”F‹ÓÀhn¢¢g$©ÕSK7)1z«¸ÜœN=x˜Tï/GyoóöF‹ÓÀhn²ßÌV+ ;¶Äœ­oŽÉzR¢ÆÌH Žž5ë óÓsûö#b²GA4y s¸:OÃÂÂøì(ááõo ¼')ã#Š¢¼ZqÉ;ƒƒ£ûök~n.]úŽ˜lPôJѤÖÕyšÀ@IMMÕþšfД 6£(Ê{•ðæáfÍÇGŸ;÷³É¹)o€>nî[s×gkORn’Ð*..ö÷÷WÝÆšÿ œõÆÁ¹ŽRå½ ë`>äιs?‹ š6¿6{ðÔÅÚlGœ³|p´.Ýé:pü¬´#Ey¯ž|æàà訨¥Fgå¦MûÄÝK7nÓMž!!!|dœ©Îãµ×UþüÚo¢(ÊKõôŠ=ÁÁÑ-[N8{öœî)µTLðäÔuSS÷]{]Euz&%%ñyp–••¥½tçßUn•¸9vMEQ^ª‡ú¼½bÅ»Îçc^Þé ?Èj6îéÕ» }V{nðyЩíBV«sÇø•{&¥fSå>oKppt§NS/Ý‘íôˆ\*&g¢:+CCCù¤).. ÑÆ;5n«?|á–ñ¯¤(ÊÕ¾[|ppôøñÉÚ3QŽ´Ó´Ù¸¨%»ºž«=%ÓÒÒø¤˜(,, Ôö%+þ³R‰‹G¯ÜOQ”í¹àÝ¦ÍÆGÏšõ†<·o?Ò²åñL¯èWŸZ¶ë¦›oW'cPPŸQ—òóó«T©rÍß5}tøÐ%;G$ï£(ÊÞ Y-œÕ³ç,ù¸s¿DñÒ-ºpÑÀ999ñÎ?¯¿¡õ€§#_ÞKQ”½Õ;öÍ­'ËT§I³qaÖ‹'Åé¦=¹hà–ÂÂÂÐÐÐkœüû†ê­ú?ÝûùÍKöPec=>gëc3JϬæ}ÆÿïuÔyççç—››ËçÀ]±±±×ø¿Zu† }pt¢¨³6öKÚMQTÙ«íˆyÛ9œnÉÉÉ|<“••åpó,å)**Š"@effÑËÊYBBŸ?»dddDFFúûûÓã¼­J•*™™™|ì¼!'''&&&$$ÄÏÏ>8`¯ÀÀÀ„„„‚‚>j壸¸8W¢øø¤;ïì9`À3ìŠr“ŸŸÏG °Å¦Mû‚ƒ£§M{]àsÈv|Ù€ï"Ûð]d;¾‹lÀw‘íø.²ßE¶|WAAA&/ËÍÍåÓÈvl”””êïï €ráçç’P\\ÌGíx,''§I“&t´K% ##ƒÏ" Ûð@rr2=kàrË'í¸%##ƒ5@¼ Û¾(33ÓÏÏOÛ¯¼Þ¿Îƒ¦=·¾ÿâ,Š¢¼Z½çmmÿTÂM·Ôsˆw’““ùt²—Š‹‹µ=ÊzíÂ,Ü1hÉŠ¢Ê¡úÏß.4ï3Þa€en¡d;.ÅÇÇk»“Í» ]¶—¢(o×À¹[;ôš': ¢Zuxö‘¨ñd«¾´çchh(ŸQ@¶`¢  @ûk¬:õ›Ž|eEQÞ®³2š·š(ƒ–-'È \$^ªßúam¼“ššÊ'íéß¿¿êB^{]…þ³Þ³òEQ^­‘Kw·l=Yt†]tîÜÏ²× žÞã_¹l÷¿®¿á¯Kéù¤²]í4y¨ÿ„U)Šòvuí»@ôúö{þüoê|\·n·x²i³q£—ìzhÄLí¥;™™™|^Ù€³„„íE;c—½?%5›¢(¯Ö¨ïÊßaååv8%£¢–Š—zD.“U«s‡:=ÃÃÃù¼²gþþþªóòÐÔµRåíê5ìeÑAHHHw>%óòN—\º3~òÊ}aæio˜UPPÀGíheffjôŸ·îUöê:hb;ï%Xo5úÅ ´*Ÿ¹UûÞOy{W^M]µ¿i³ñ-[N8{öœî‰)/Ý<åõg_Ûç÷¯Jê MNNæS Èv´bbbT·±j­[f¿y„²¥BYz÷êÇGZo5rîZ•ÏÜtkÜ¢M7Ö¨ãÕE\‘5|zšBÙ¼ûÐ¥Ç1q“Оê$ ãS Èv´‚‚‚T·±í£ƒ6¥l©Î}Gɽ*Xo5fÞZZ•ÏÜtë?w5ôö"®Èê1 QôV¬x×èĪÞ6uë5ºä›ésõôü·E×`üødóFDíóÐÐP¾cÙ”m‡À%$º&ñNxx¸š²KøÛò(»êÑ¥ÙŽxàùOœ›"æ,ªïSÏÌ_»Swšg­·wf½òNµ‹—ëˆbѶ/âj¨!c^]ƒ¥Kß1ÿ—ôüùßÄd­B&‰&C'ÏS§j`` _3€l¼-99Ù¹ƒù¿×U¨v{CŠ¢¼Zÿ¨|ƒn¼ct¶jRŽœðÜêÌã”]ÕkйcÅë­â^Zï_+@”C«ûZ¶OŠ?Åãþ£bÅcí!–/-zc—óÜŒÖA-HT—^ÖWOÎP,nnÊóEPFÕØÑ5—ÿž†…ʼn)“ß:¿4]{Äù¦d;àUÚá;¤šw7é6yå€ÅYE•C…ÏÞÔ ´ŸÃi©{Âúùù©iâ’Þx}Ç Ê®zlp´Ü±âõV³–¾©Û*°Aã l4hܦs9AõZ²ÔSÞ9lenâyÕPÌЭջ¿ÕƒSç¯r¹ʤŸ˜/ºžpùOjÏž³Ä”ËÒ³Wo;¦=£­Œ¦ ÛÏ:Œ±Ó´WÔà¥{(Š*‡ê=mc‰¯÷Ÿ¿]<î6ñå ÿ¬¤=ÓÒÒNØüü|íÉö¤íü”²«ú )ÍvÄë­ž_–®ÛêÎ’lG2âOñêòô,ñ¼øS-H{l°Ë¹‰'U°Ó®KÏ2n¦Ñ S&Õ£÷\Ñ5ÈË;íò_Õ¡C‰)®Ú%ZU­^KèÌÌL¾rÙxITT”¶«x_·ÁÖï£(ÊÛ>éæ­.ÜRYV‡ðyC—îydòòÿ½®‚:ÞÉÍÍÕž°›²>£l¬~‘c厬·z!yƒn«»îi,Ÿ¯Q;@LãÐ*2úYõªùÜÄ3bšÒ[ÞÇÎ+ûf­0eR:>+ÎÓ3g¾sù¯ê”))²”D«ú ›¨³555•¯@¶Þ““£í'ÞÚ(dÔŠýEy»ÂÇ¥ÊH§oß¹QQKÛµ›"·é<}äò½íýmTóØØXí9›™™©}õ}ù”Õhi¶#Xo•¸rƒn«zA¥ÙΣÖmX³$±šÌMüµæÅ`gü³ ¶l¦Ñ S&Õ¶ýÓâ$=þ7—ÿ°Šîƒ˜ò¹ß­4ú+ÛINNæ[í€7„……©¯×^Wap†±)(Šòj _ð^Ófã.üÏþÂÍòLÌË;-Ç_ ‹HT¿­þ_#îúûk/ÝÑf;þ5j½{àsÊÆŠ6Nî[ñÀz«¤”Mº­êÝ'Ÿè6”Ô¼ù£¹‰ÇâUù׉Ó^°k3V˜2)ÆZù‡uéÒwÄ”3.ô{4ÙNBBß:€llWPP ”µÅ#CbV¤(ÊÛÕ®Ë ñcÊ”íùxðà Ùy>Û€øÕTGóßý©©©ÚlgGÎ)ÊÆ5wíÌõ‡©²×ƒ}FÞPýfQâõVÃç¼æA«ò™›¶<)àÎ{åÌEÝÜvдetëõìêM›oÙr‚óE;’¼t§÷ð {µú-ê ‰‰q>sýkÔÚvà$ec ¼8ÞŽx`½Õ¢”º­Ôp:F u'Ps»pܧ%ˆgzö"ÿ*¦·e3V˜2)qbŠ3×Ê?¯r¼¸„M¢•v¼² ÛÛio}^ã–À9éG([*ôñ‘r¯ŠÖ[š·ÆƒVå37Yý'/¸±FÝŸŠÔkÒ–ãn±FLOß.¢¢–˜rÔ֯Љ;õûë$ ”dee©'ÿU©rÆÞ|ÊÆzââ}²Ä뭬ؠÛêî’{ ×¬`ÔPw5·Gú v˜ÒÝsw…)“r÷>Yñ Þ­4ä>Y@¶^¤¾p†>6ì…Ç([ªsßQ¥ã öe½UtÂZZ•ÏÜD˜ùŠz·ü箆b¶¢ÚtpÓÅ´G<É¡·RÝû$ˆoâ;†É¹)ï‡÷êžqó×i3´üü|ñªøSûä†ÝŸQ6Vß'K³ñÀz«yË7趺«$©Q;À¨¡îºs‹K,^[LœôÚ»eÜL£¦LêÁŽÏŠóÌ™ï\þó:eJŠ˜òÅ•ˆVµêÜJ¶d;à%………Úîaô¼ÔÄ·>¢l©®O”^k!Xo5wÝ1½¨QϽRöu¿àuÖÁ¤n½»aé¸LqXmõ’]˺²«YóñâۅѲ$ùŸþ#§­Óÿã_•n \PP =yS2rÖð)eWõ-w¬x`½Õœ—Óu[ÝÙàBtS½V€QCÝ ŒæÖí±ÁòyѪŒ›i´ʤzôž+N̼¼Ó.ÿ…:t‘˜2ñÕ]¢U•ÿ»I­iii|ý²°‘ø†©¾mVþ7¾ôv.eW…õ/ÍvăKµ“^|ÃÆu8~–œÛ½ÍÚ9¿:{õŽª5/\½#þäè›×Ìä]V†c]·n·˜ì‰/‹&ÍÚwW§jXX˜œÀÏÏO=9#éõ5ïBÙUáƒÇÈ+Xo¿$M·U`ýÒèÆ¨¡îFs%¦ô`õ¬¯0eR}"ʼnyðà —ÿÂöì9ëÂxéof¿ºõ¨6‰ÍÍÍåëí€âããշ͆ÍÛ-ßú1eW=Ô>9{Åñ¤øSþuâ¼”N=#n¯×HT£í#'Î1š•É:Èyʲ²bbz± ±ÜkwéNpûÅlÇâ ¯ÚŠ¹L|µHM}ßåÚ²å„fÍÇË#®NU??¿‹=Ç0õdçð!¯lË£ìªG.f³VL]´^¶JG?8Z;7yjT«YÇhqºÍMV«ŽÊWE[7Ó|”nEŽK±rþž;÷³˜Lœ¿¢ÉÈg:‡ Û»4iò×;"ÆLKÝþ eWõTšíˆÖ[ͼø ‡Vw”üdCü)·îÜùwé_+`lÜb‹s5|òó]ò1ùy[6Ù¿äw"âO޾y póÿý_Þx(iýníá.((¯ÆÄĨgîmÖné;SvU÷þ£«Ö¬c±¦$®“­ÄùŒh®Û½ÍÛËç§;ÑÜd%¾™­V@w+e¾J·&¿ð¶8+ÇO6?yå­îº>:K4yxàçßTÈvÀ.UªTQ_8Ÿ¿ê'(»ª÷àÒ±XÅë­f/}S·U`ÉP«âOù@Í!«a7ä3 Vmµ2·‘SæªVâ±-ÛÛöbâ$pôÍëÑ’±X­Œ×Ñ·ï…)—¥g‹VÿúweuÔ²²²Ä«IIIê™ü«Ò¢Œ(ŠòvÍNÝke¼¬+Þ“ •,šÜÕ¸…:Ucccùîd;`#‡ûì,yãý7w}JÙU?YšíˆÖ[Í]ž®Ûê΋‘޼9ÎŒÄÕê%ñ¸FíÒ„§]—ž.ç6ú™¹êÊâqÙ·T¬@“TëÆ¡wY÷œ#¾Zœ<ùµË“TÞggÁÊD«;î¾×áÊ·AóüꛎQåíjùÀD—·AŠZ*¦‰Š{sîúìë*TTçiff&_?€lläÐ1\»õÐæ=ù”]Õ/r¬Ü±âõVó_Ù Ûêî{J³ñÀ¹Õs‹RU\c>·±SÔ”âÕ²l`ʦ½b&*V|¨ÇÝJuèø¬ËŽ¡$oƒ>?y»hU¿a‡lG ükÿ?6lEy»z ¸p«¬uëv¹çÏÿÖ²å1MÜêý›£,‹”€lì•››«Ív¶ì?IÙX†“;V<°Þjáʺ­êÝ'Ÿ1~šnÚµo¯Š?Mæ6aZi°#&/•qÕÌ1[·6öª­Ö“ÄW +'é¬Yoˆ)g%f\hõ`WçŸuh‡ÜùO½ûžK;LQ”·kØ´õâÄ:t‘Ñ™»eKÎ…›Üõ˜#&nÔ¦›:ICBBøîd;`¯ÌÌLmÇ<óàç”5hxi¶#XoõÒ«›t[Õ¿˜íˆ tÊ jÝ|‹ÑÜ&MA>ÓÍÄ­zëƒÄ<Ŭ–¬éÖKÌVÎ_¬ Gß¼Ä÷Š–-'X9I—.}GL<}Λ¢Uh×ÎÙŽÃY<üùµ3Þ8DQ”W+öÕýò,>{öœî™;~|²˜`Дק¦î»öºŠ ¶d;P>ÙŽZ|xⱆŒ/÷­x`½ÕË«7ë¶jpoitcÔPw57ùªÊv¶ìε}{ŲT¼óØOò0ª·ÞÿØÊ@¬Rjêûbâ§g¼.v|è¯l'22RMð×Ïâštê»&‡¢(o×C}^çfBBºói{òä×â¥¦ÍÆÅ,Ïê6ôYmúšŸŸÏw Û{eddüu‹¥µv~xв±´ÙŽõVË4ÙŽöyÝ5Ô@ÍM¥:òA—îáÞØä_^£ÄÀ¨6¼{Ôz¶#¿„<3ãuѰ“&Ûéß¿¿š&>>^=íuƯÜ3)5›¢(¯ÖS Þ•—î8Š>eJŠx©GäR1Y»s÷s Û¯Ò^·ó7ÜÄ/e.ÿßd9üäÊúo²äK KÖ¨x'nÞËÞØj5[~öuEÖÖ½ŸYÏväo²&O[ë𛬨¨(5MAAŸŸŸz©Qhïq¯¤(ÊÛÕù±qzFD,pî84m6î©E«M×ÓÒÒøâd;`»œœí×έûOR6ÖÀ‹c)‹Ö[-º8@±C+9–rÍÚ·5Ô@ÍMŠ¢¼]}ŸMoÞj¢üqVXXœŒm;÷K/Õký°ö_Øääd¾uÙxCaa¡ö›gúîO)ëñ'£åެ·š·<]·Õ]££†ºèÎí•Yb2ùüäY/Y_7ÙJü)æ`>ôÚ6ÞFÕ©ë ñÕâÌ™ï\ž¤òn;/®ü@´ª×0ؤŸ¨½ºpGó.O¾¼—¢(oW¿Yï„tš.S­'w¶\<Ùòñ Úó‘[ŸÙx•öËç‚WßY÷Á Ê®ê=¤4Û¬·šýò›º­îlp!º©^+À¨¡îFs4zjéÚµVm9lqÝ‚[=([µíÒCw5[±2¼LêÑÞsÅW‹#GNºoKÛónºåîkþŽ_cÙx[hh¨úþÙsPtÊ»Ç)»ªGDi¶ã_3ÀeMKZ/[‰²•h®ÛíõÉY-Nw£¹‰š³b‹˜X¾:zz’ÅêÔ3B½aèØcÒ¼±ñ§x¬}ž£o^O ]"¾Zˆ/.ÏÐN¦Š)_y'wVòÛÚÞbqq±îô׸l8  ÛoˆŒŒT_Aƒ[wNÞú1eW=2p´ßÿ­“­ÄùŒh®[Ý’è¦ZÍ:F‹ÓÀhnk(Z-Þmq»B{ 4Ú 1ñ*‡Þe|úÂÉK—¾c~zž={NLÖ*d’h2fæRµŸLZ%''Ó¡vd;® ê[hí[—¼KÙU ú¶»Y¬éË2d+ñ@>#škçÖ¢Ã#âÉ{›µ3ZœîFsS%¦—„õ²¾iѳWˆ†UkÖ%Þ9òXµ”y=óâñÕ"*j©ùé¹}û1Ù#¿ šô|r¢:UCCCÍæää4iÒ„ž5p©dddðÈv |8ü‚ãù×÷.|ë#вX3_}‚×ÅŸì ·*aý‡â«E»vSÌOÏ… 7‹É"¢WŠ&w5jáîÅIII¡¡¡,ð??¿„„£_MÈvÀÄ÷Oí૽£âæoýEQޮǟZ.¾],\¸ÙèÄ%óòN_¸ûy›ÉSVìðÄXí² øÈ"Ûd;à --M{éÎÀøÕW¤(Ê«½tWÓfãÄwŒÝ»ÿ6ëùó¿É‹v·jÜŠ¬j¨s3<<œÏ+²@¶º´7J®}g£±)(Šòv=:l™øŽÑ©ÓÔsç~V'cBBºx²eëÉQ/ïnÝgŒ6wÍÉÉáÊl퀮„„m²ãи¨û)Šòj\¾·MçérPåƒOœ9ó vD=1}Ãào_{]uVñIE¶ÈvÀHqq±öÒ^C¿Ùé×ï£(Ê«5x~fë’xG[á1kÄKÿiø€6qÍÊÊⓊlí€ ‡Qwn¨}{ÿ[‡¼¼‡¢(¯VÄÂ]½Òiz‹Ö“;ô~¡÷ôâÉ»BÖžýû÷ç3Šlí€K¡¡¡ÚîäÿÕ®6eåÀ—²(Š*·z>><<œËx€ràïïËíÎÉvÈv Û\åä Iùùùì Àçí`;²€Ï!Û|Ù¶#Ûø²Àw‘í¸Úäååµ(‘˜˜èñLRRRÆŽ+çÓ½{w1«3gÎxo333ãââZ\$‹­°¸žª•˜Å]¤'š[ßQž-ÎúNëã½äñ†;K¼ë® €€¶ne;bé,+**²kÇÚrÔÄL䮾$ïsÑPnñ@¬Œ•Vâ-!±Xg¹æbqÏbÏW–ÝR·„ÃÊ»|“¸|««m÷ö'_A¶ø.²W0Ñ'rŽD—G~ô‰®ó­D'Ëy ;ñ¤ÅØÁ-ééé¢ó¥;tžxÞ¤ç+ê®§ËÞ·Ø Ý­3ïÀz¼8ëä~z㉎­XUÝVî¾ODg_¶­]»…[ÙŽÑÖåÙ»×èÑ5‹¡ŠÚ{r>ùC9¼ÏeT«ÛÊ<ÜÐ}ŸˆgÄá3D<[\YÈw”Ã;ßÊ»Ew•ŠŠŠŒÞêæÛ€lÙ”?™Q8GeÉv´¹‡è Éÿ¸×ö]&nIIIq^œv‰ân÷Mô”MÖÓd%U‡QwëŒâçÁž7Ÿ›gHEûYµ²žÚiwÅeží¨ Jw_½µ\¾mÊó}®{à¬l‚vÛ­nWFrW‘é†r.³¼¼<“Mpë­€lÙ”Ùa±1ÛÑö@úYòGövŽ´I‡yj/2qÞÀ¢¢"ÕP»ž¢•êÀꮤØ!jžÚhˆ™¨Î ó/γHÍ$Ûñøiw¦võ­¬üîF»+<ÈvÄ:Ç™RûA÷@¸ElšÑ¾²£9¿m<Ëv<~ŸkœCCóMPÛ.–«ýšöpëþϳÅÙõ9 =âÚ ¥LÞ0Î?ÜÓž’ÚWµ×Ýyû'fÈvíÀ%ÌvT·H·ï£þC\üiËȪÃhŒ­j¨»ª•C8 í-:w U¼ãü+Ïg‘óO`¬\täÖR=}óÀJ·]î ÕGv7Û±•} #S˜‡.»ùâlÒÆYd;¿ÏU”§û»?5[ç T3tÞjsœ7ÄãÅ•‘<õÖdz1•Âén‚:ǽ‘P Û@¶—C¶“——ç²÷joÿÎeRdÔÙ4ùDµrèJ«žÑn‘=bçõñlq»¢ÚvÐ2 —GÍbd§v ÇãíXLcÊþk,—ÃãX?jj$õö(·÷¹Ú!ºI—ÚF‡7ŒzŸ¥ÞQ’g‹³ë¸;•Ò¸•ò¹ÜÕe4 Ù²°°ˆ—ü¹x`Þ×¶žíÈÛåÈÙõ•TÓd¸QÕá²±÷mÒUT¢F=i2ˆ±nÎå6j봈Nj³ØÕþ~Ä|‡x|€ÄæÈ»Dm¸Ú3&£©¨ã%f¥ö‰ÙŽ[×TˆP¿ÊÑ}?‹)oGetÔtßZÎdŠ% æY¶ãñûÜÊûJ÷-­û6Ö]œ[‘éŸe¾DÍüDÐ šÜºDP…Z&yx·¸¼Á²d;à1Ñép¾·‹èÚˆ'z7òW¿‘S:g;r@‡QIÅ_uû}²×còåFÙŽ¼þD»VÈÅ¥§§»Õçµ’/évB]v]uû¼/NöOånÑm«ºüjX <;@V:׿©…ö^.³wßÚËlÌs£{?¹6j¯A2šF-O—ÙNÝ‹¢ÏÞçVÒ'ÝÇJRç|Ä=^œùáVVFûM.×ùUòRÏ.õ@¶€lìâpE÷ö4ªæ|“b‡ """´3qè{píÑ(%Ú1ŠmÜ-j¶ÚÿˆWë`ÒuužFýŸ¾ÉêNãÙâzÙFõ8ìÆ²ÿæÅú02Î)‡IãÐk¶’í¸õ~p9"ÃþÔž&žÝÁÍdDI]F¥v‹•lÇå[ÅúûÜåO¦±’Š8OãñâÌ·z«­îÝÏÎqbŠEt/!¥º—ú¸ˆeíd;àUÚ›JË+mäóâö¶AÎÕý‘U]‡ðGtyTVL£ºÿ½ùNûòV¬kå²çËW,þǹÏëÙâ¬d;FK÷xš —knrÁŒš­ºÄÅÞlG»ÚÎc\;ç?b2mr¥½ÿ‘•ý,gåîfÎA—²£÷¹•K°tßÕÖ¯ÂÒ®ªÇ‹+c¶#×Äa¡ÚtÚùjFù™æüvu8@ÚdÛèHd;ÈvÀ.æwæ5¹¬Âåx;F½WóÛ-¹ì:ÿŒEôOò¥²3ºí²•A?L²ó_ ™d;n-NMän1‰,lÌvLsp¡†nVñ ùlu.d”í¸õ~°2„²6ÿq^U“{?i‘v“Å“½¤N:í â2Ûñì£÷¹Ëas¼”í¸»8—‡Ûd·èÞý\»ÿ.eÔ}'¨ Ï;Ü{Τ²d;Pvæ÷vè³èÞ¿ÉüÿÊuSFeQ}¥ò¹}°ö" ‡~Ÿ•!mM²óM6ÊvÜ]œgÊ’íX?@οé{Ûè§Iê¦çÚ£`ãXÊVnþõ§«ÛÐk×ÓhC:ûFCNý©¹•¼C.êñ}²<{Ÿ«7•Ia’혿 L²wWöO?ç]ªv‹< ÚÏ=ÑDÐi?ßÔɫޔØ(+‰c­6Ùå˜NÈv퀻Ìï;,©[N;ôF]f;F]0wo’^ÎÝ"mÏÎùÊ"²2 1ØÃbUÅûJ{!„óu,êׂF?™){¶ã2´q8.F¿©‘—Ž˜/HÞWK;´¸îKêˆ;䢶g;æïó«!Û‘Ÿ~α¶„\÷ÂBu™–ÛÖað%çX[mµ[C¾ Û@¶»óâOÑ>`@ýBÁáB—ÙŽÑp"ne;ÚÜ ~Î`Þá%Û±ýiÿ¢ Õïeto~dW¶ã2´1:.e!–et™“ÊQ³V{³—ïó«!Ûѽû¹ö05T—;j‡Ñõ<Îoiw‡@¶€l¬ôn,rèR¹ÌvŒ¢‹A‡vØŠò v´ã¦õø|h,eog;v ïh7\÷®Cöf;VnÑåHÁáȪwšó¨Ñ^Êv¬¼Ï}h,eÏÈŸãy³¨ONu¡šzÆdˆl©™ +€lÙ\1ÙŽööCbÞþonÑAÓÆ&¿Ps+lQçòÉvÜ›ºŒÙ޽ÈáO꺈±cÇ:_H¦^­^½qdäLÇж8¦·—²•,©ÙªôF¼ýœ·Z½Z–Ûj[Ÿ»¶hÓ ëÙŽ6Wñxq“K,ûÈáê@˜Jo}3í ÛÏúÔÚ£ ‡´÷²Õy/Ÿ±)´h˜ß³éOÓ_͘2.“Ý ÁãÅy5Û±ý9l‚ê{–:ºûæwùöðF¶ã<[·‚V·[ïsó‹ˆL’ +×9ïyWÆ·œË{ºY?éÊó;d;Èv@·“åÁu^Êv´¹-ÿAïV‡×åôêr “Þ™nhà2IÐ^¬RöÅy/Ûq÷‰=,VÞüG(åŸíX¹Cœ[{XÛ£/**ó[arAQ9g;î¾ÏÕÄL&V¿0Òê_F«§†ÑÎÙãÅ•ñÝ®;+±æâyów¬óo²¬üÞŠlÙ@¶Þ`åg)²›S>×íhsƒr’BÛᵘ#¹ì„jGLÕ>ï²Ï«ú†Úcáñâ¼”íxp€¬¬žÃo²äm§ŒØò›,£»¿™o‚Q*/;Èw‘ê›\¢¶Bípó«æÊò›,ÞçVœînq™Fª ×›ÝÝÅyÆèîçÚO'“5Ñ=鬤…ºç8²d;PF΃~8S¡„»÷@w7ÛQ¿Ë(Ÿ¾OQQ‘Þ?õF Ñ2ú¯y£.­Ë¾­g‹óF¶ãÙRù¡ÑªÙZŒ§lKÙ­²¹¼UºCŸÝJ>`tZ¹|וÛûÜ<ˆPGÍ!Êн,Gwî™ñlqž‘Ë2š•Ú]F©`Ð(ž2JŸì½á²d;àÜ‘Ñí÷éÞÃȼŸâq¶ã20é½êŽd±ëênoÑ$SHèöïÔ®NOO7Zç+=<^œØr·èÞ‘Ùƒldz¤½a´s¢½¤Äâl]f;VÞnõ²µ×i˜l‚î Øº§•:ÜÖ»ù.³£ëy<~Ÿ«kÆtß]jßÌ*½q~3;_­TöÅ™nÝÝ"—Qª¦ö˜î¹ }?;¬§Ê|tªÙ–ÃOMí Ûpµ}%í¸¸ê¿ªEGIuFtÿ3]uÉE+í€*že;*Á=#s2uíŠõqWTGÒÊâœûbª§)¨=&v‘yL¡vµ˜LM ÝÏF=wÏçncží”å©Î¾X„ö$&sk‹ÙŽË÷ƒ6F°¸PÕm—ÇNuêµ› Ý4í5NâøªØA<ÐÞ‚Ü9©ð8Ûqø]›-ïsíVkïÕ®ÞZºy‘ŠÂä¶Ë}%þÔ£¤{IŒg‹39ܺP¹¼û¹výµgœx^­¡ÑõEº§ªö ‹9[ÌZí Û·hSÙûpÖUwØmò£í=y–í¨>‘sö ÛÑöÑ<ªWtÖLö˜ÉÿËkwšC+ÝkBʲ8{³² ‡æu/òl0ä²g;žÝúÊùØi7A÷“£æsy)Û)ãû\÷ÀY9jÚmwÞW&îÁâÜÍvdJérdlçc§}Æäœ2Ù“sÙ²(;ù?Ë‘Žø«öŸu{»Úœ¶[¤½4E·ßä0A]w8g;òyë¿:‘k‘îl‹ŠŠ´›¯v‚ËáSÒÓÓr¹ób=XœÚFëÙŽÉ>,ËÒ&‡<ÁÊÓ}ÿÔ¨QÛ$Û1ß™<¨¡­ 3.ñŒÑå7F§•ËÃmr4ÍŸCzPö÷¹îuy÷pÝm7ÿ<ñlq&‡[}Ô8ÿ\Îå¡H÷ŒÓ^ÜèÖ&¨K˜ííd;àmò>DòÆX{"îÞµçÊÛc¢+'vš[;Aô|åm²­ïç²,îr{ƒÉMðàþVʦMû‚ƒ£=K¹,ä@FòØYÙq|åô²‰ï¾ÏK¸µ bÛ333ņ‹?Ý:Üž-Î y ¬¯ŒzÇzpªª†üË@"Û|Ù¶»„Ùž!Û|Ù¶#Ûø²Àw‘í`;²€Ï!Û|Ù¶#Ûø²Àw‘í`;²€Ï!Û|Ù¶#Ûø²Àw‘í`;²€Ï!Û|Ù¶#Ûø²Àw‘í`;²€Ï!Û|Ù¶#Ûø²Àw‘í`;²€Ï!Û|Ù¶#Ûø²Àw‘í`;²€Ï!Û|Ù_}3 “í|Ùà»ÈvpKqqqXXØ5¦Zµz0(h0ÙÀ‡í¾‹l·ÄÇÇ_cÁÿüϵ­[?Z\\Ìø²Àw‘íà–k,ó÷÷OMMe§.d;€ï"ÛÀºÂÂÂkÜפI“¬¬,öàrF¶ø.²¬KNNV‰M¥J•–,YrÇwÈ¿¶iÓæ½÷Þ;~üxTTTÅŠžððð‚‚ö!àòD¶ø.²¬ WYM×®]<˜=iÒ¤J•*‰güüüFŒqôèQñ|‡œã*UªÄÇÇ3à2D¶ø.²,*..®R¥Š jfΜ)³aÇŽ}úô‘ÏW«VM¼têÔ©5kÖÜ}÷ÝÎ øòœ––Æþ\VÈvßE¶€E™™™*Ÿ©P¡ÂöíÛU¶“S"--­yóær‚zõê­]»ö‹/¾˜9sæM7Ýäœð„„„ˆ&ìUÀe‚lð]d;X£’™F,¡Ív>,±hÑ¢[n¹ENÖ±cGñê±cdž®;OTTTaa!ûpÉ‘í¾‹l‹U&3fÌ£lçP‰Q£F©Ax¢££?ýôÓíÛ·ëÞ?½J•* ì^À¥E¶ø.²¬ßuµÌ† T¶óÒK/-^¼Ø!Û9|øð{ï½×³gO5ÏÂ… ¿üòËW_}õ¶ÛnsNx322ØÏ€K…lð]d;X‘ r˜5j8p@f;G•,ׯ_åÊ•ÚlG8räÈ믿~ß}÷Ɇ7Þ¸qãéÓ§§NZ¹reç„'44477×WöIQQQœåå幜Off¦l%f¨}^>™˜˜èÖZÍÍⶸ»¸Ëê@8¬¼ø«|þJ:åF¹upXD¶ø.²¬ÐþœªwïÞ*Û9uêTZZZÕªUU8óî»ïj³áèÑ£óçϯY³¦œ¦W¯^999¹¹¹ƒvŽwüüübbb|b±®± nݺgΜ1šèªË)Å µÏ‹†âÉ-Z¸µVFs³¸-î.î²:+/þ*÷ÿå°’¶DLbKå»Â­ƒ À"²Àw‘íàRaa¡ŸŸŸ +^zé%•íü÷¿ÿ¼øâ‹êÕŠ+FFFîß¿_›íÙÙÙÆ “#*_ýõ“&Mߟ·nÝÚ¬Y3ç<Äßß?))ÉW"‹ OJJŠQ¯ŸlÇ–qyf;™™™bMlY ¹Ed;€—í¾‹l—ÒÒÒTFQ©R¥Ý»wËl'''çݺu/=Öw°(9Ù7Þ8{ölm¶s¬ÄŽ;:uê$§¹ùæ›—/_~æÌñgíÚµó   Ñ/¾ü#Ñm×ýeÖØ±ce§^m‘n¼#¦¬[‚l§ŒÂaå»wï.wì¥]=["¦¢¢"ìí^B¶ø.²\êß¿¿êT>øàƒr$™ƒ~úé§²×)o‰µjÝ–ýÇN¿¾éý¦-Zˉ4h°jÕ*m¶óQ‰×^{íž{î‘Ó4oÞ|Û¶m'Ožœ4i’î ùä“iÓ¦ÝtÓMrš‘#GŠ'Ų:vìèÜG®R¥J||ü%„ÇÝlGuöÅŸ2³’íh¯x‘{^^B£ž×ÎJ;7 ‰éeCíÈ-×Ϙd;Ú‘‚å¬233»wï®äpÅ‘vnêzy‹•ߣi¯uQ Õn¸v=ÝÍvÄ|´1ŽX%9íÅQÎñŽš›œFl¾Ü±âOµ+d¤¦=jžÚ›©Y|·8_E¶í ÛÀ]ÉÉɪÓZ½zõý%D¿òðáÃâÕßÿ½Y³fâ¥iñó­d;²ÆMšvãUå }ºB… ⥌̇Žm½v8>ðÉ‘òÇV7ÞxãÔ©SµÙΉ[¶liÕª•ççÍ7ßüöÛoçÌ™£;OHHHnníè^é¡.n1ú…—xÞ|@í¥;Fñˆî…FZ*bÒ^£Ív¬ßóÝâBÕOÛÔªº•í¨´Êè×aÎówÈvŒê²€lÙ—Pqq±ŸŸŸê¤Ï™3Ge;ÿýïÅ‹/¾0~ÎõòµõöömÚ—þØêÎ;ïLIIÑf;Ÿ–HNN¾õÖ[å4:uÊÎÎ/5Jw´“¨¨¨ÂÂÂ+,Û1™¹ºVDwH£Q‹Õ…+Ú9ëÆ#겓Art§ñ`Ï8G+&c‹m”¿‡ò Ûq™VM£²£´Šl Û@¶Àå&##CÅ&*Tعs§Ìv²³³ÿ(Ñ£GñÒБcœøÚãZ¾*-ðÎÒ[µoß~ûöíÚlç³O?ýtåÊî¥îçç7~üøÓ§OgeeµmÛVwž„„„+)Û1¹¯·ÊU´1Ž•î¿ÅlGeG&CĨ¤Hwë÷„r^ëãÒXÏvts-gjõ1ŽÊvŒîxn”áí¾‚lð]d;‰ŒŒT™IÓ¦M÷íÛ'³'NˆWÏ;W£F ,¿‘qôÄ7e¬g¦Í¹ñ¦ÒAx ­ÍvÄ7m±ô>}ú¨Ax–.]zöìÙ5kÖèÞŠ(000##ÃÛû§|²“›†ëfrn櫤b óK_´#6›pÞ jnÖóEýÈËz|a=ÛÑþXÌÊFi×ßeDC¶í Ûàòü–+ÅÄĨlçìÙ³âÕ-[¶\-禪Ç>ýÆ–Ú“óÉ ÈÒAx*W®”íhïHnÂù7Yd;Ù²|E||¼JHn¿ýö}%öïßÿÑG‰WÏŸ?_¿~}ñRâK+ró¿µ½V¤¾xWé <<ðÀ¶mÛ´ÙŽðÉ'ŸÄÄÄÈ‹|®¿þúgžy¦  àý÷ß×½ÔÄßß?))é’g;Ú¨Äz¶c2ÞŽvX;ޱ•î¿JÔXÁæÙŽ»÷º*K¶£îcå|Ÿq³“½êntãr²ÀWí¾‹l]!!!*4hÊvNŸ>-^=räˆçÐǧ?Î?륚»`©„G8pàáÇU¶sªDvvöC=$'¸ùæ›SRR¾ÿþ{ñ§xìœðeeeÙ¸‹ÜÊvTã<¯ÇÙŽŠAçfÈXKÙå-·T[³uu“ÉB»wï.V^¬ªÌ¦<»O–É:ˆä|-²€lÙ>¤°°P›Š$%%©lç§Ÿ~úóâU=÷7ižwò¬WëpÞéQãÕ <Ï<óŒ6Ûù¢Ä† 6l¨z÷;vìøê«¯bcce+áááåŸí¨k`œoåòèFwëÖ@ÍÍèÆåæw-ׯ#*2Ù@97™´Ø’íJd’ϸ•í¨¡ Äœç/ñ›,€lÙ>*99Y…!•*UÚ»w¯Ìv>,^ýý÷ß[·n-^šøôŒ¼“gþ·k×ÜÎ=¬áY±b…6Ûù²Ä¢E‹ªVýë"Ÿ“'Oæåå=üðúƒðÄÆÆ—O¶“’’¢½á”sPcžíÝI\µrxU=¯{éNQQ‘š­öUóxÄ()ÒÎMûª²d;jn•¥¿8‡Wne;*ÚÏë&$jþVæf=Û1¹y:Ù@¶€lÛ…‡‡«| K—.*Û9yò¤xõÌ™3•*U/mû [f;Ÿœ*zýÍw‚6–k’‘‘¡ÍvNŸ>ýÙgŸ1B ÂÿÃ?lݺõ¾ûîÓ„'55Õ®lGw$^Ñ©w¸E{zzºõ»¶mDDDQQ‘zIýKLcô /ùªv‰™™™FYQ<¢ý)™h¢ ¦´sshUÆlG»P‡9¨­s9XIØ¢²#ñ’è>Ú½çp°Êžíˆx Ù@¶€lo«R¥ŠêáΘ1Ce;?üðƒx555U<ÿŸ[ëææŸÕd;ß—O%$¾|ÓÅAxúöí›­²Aô÷ÅÚ†††ªQ ßxã ±ÚË–-«V­šsÂÓ¤I“œœœ2f;Vˆ¾Ñ8æÙNDD„ú R‹ÚÌÇyÀauŸ,ÑP%­œÇð1dX]èb´Î#•1Ûq¹P‡ÌÊÝlçÏ¿ßÞ]w£œGûñ8ÛQ# ¸D¶í ÛÀ^Ú«&*T¨°mÛ6™íˆîäü!&èÓ§xipä(m¶sâÔ÷Ÿ~QNõщ‚‘£'¨Ax&Nœøé§ŸªlG(((X·n]½z¥wÚjß¾ýþýû¿þúëÑ£Gûùù9/‘‘‘ Âã2Û‘c¶ˆ.¿ù-Ÿ\Þ]<ï|ÿ/£°H{ô±cÇ:\8$þª;F±ù ¤´—è8ÌÍá‚"»²!==]w¡âI‡åA¶£»stƒ£²g;j®*c2C¶í ÛÀŠ˜˜Õ mذáÞûöíûä“OÄ«çΫQ£†xé•Õoêd;_–_íÉù¸K·Òátj×®½lÙ2m¶#|õÕW³fÍRƒðŒ3æÔ©SGŽéÒ¥‹s¾J•*ñññîÂsÀ”ÑÈŠŠŠtª#ŸTÉIJJŠèÚwïÞ]üir,‡¹‰uÓGDDŒ;611Ñd•d+“KJÄKbVb>-Z´¬ÌÍ9öq—ØR¹þ‚Ɇ뮼ø«Ëß@©½j>+s3Ÿ@úè#ñê/¿üÒ¨Q£ ã¨Ì~Ñ$Û9yæ‡ò¯¼ü¯¢¢c*Vô“ƒðÌš5K›í|SbÍš5jˆ•®]»;vìË/¿>|¸îh9£F*,,ä-W ²Àw‘í ¢Âððp•íœ>}úÏ’E*T¨ ^Ú“sÂ<Ûù¼àÒÔCyB;Ëõ¯W¯ÞúõëµÙη%f̘!/×ñóó›4iÒÙ³g³³³Û·o¯;ϼyóxWÀÕ€lð]d;(ÅÅÅÚÛH-Z´He;?ýô“˜`îܹâùû‚›ûô[—ÙΩ¯þ{©jÍúÍw׫/·",,ìÈ‘#ÚlçìÙ³}ôÑ€Ô <¯¼òÊ?þ˜––vûí·;'ùä‰'¾ý»cÇŽuïÞ]NP§Nµk×þüóÏkÖ¬ž&Mšˆ=ÆÛ®d;€ï"Û@ŠUÁE½zõ²²²d¶süøqñjQQ‘üÒ›´ü5ϲ‚Ë N~ùíS£ÆÈû¤W­ZuΜ9ß:ÉÈÈhܸ±Ü<ðÀÞ½{ 'Ož¬eZ{+±‚‚Þ<p Û|ÙRPPŠ,"""T¶óí·ßŠWÅ9(ñc_x˜íœ-úêì—CíË>ÖºMéÏ7nœ‘‘áœð,Y²¤jÕªrš!C†œ,Ñ£GÝAxbcc‹‹‹y €O#Û|ÙBAA6¯X¹r¥Êv~ýõW1Á3Ï€«ù_C²À‘í®r¹¹¹Úbݺu2ÛÙ»wïü!&xòÉ'Åó=ÜËÙNá¹b¯–ÇÙŽØ(±i‰KVÖ¬U[î™^½z:tÈ9á™6mZåÊ•Å~~~&LøñÇ=Ú¡CÝAx.á±îÞ½»O\šràÀ¹ÇÊ9ÛIII ­[·nQQŸ ÀUˆlð]d;€«\||¼ D¯vw‰¬¬¬¼¼¼?KÆ!‘÷‡JX˜ì¥lç‡"Q¿x£Êží||òì‡9|Ô¸Š+ŠP¹råI“&ÌûÊ«ÙιE·«lÏvŽ}úÍÑß,5-ðÎzr_µnÝzï޽ΠÏòåËk×.ýWxxøéòwmüüübbbÊguÑNJJŠË‰óòò8`2ØÌ%äÅ]¶s+Û9p‘[‹0ÙF.ÝÈvØÙ>$99YE ÿþ÷¿wíÚ%³#GŽˆWùå—x@¼4yê¬rÈvŠ~:oKûÉ[ÙΑO.ìq“¦Uª|½Ø-+V1bDnnîé¿ûì³Ï&Nœ¨á™9sæÏ?ÿœ­½DJñ÷÷—÷š÷*yÑNݺu^mÑ¢…CXN)'v¾È'..®n íïø"""t¯r3lQÂhtbç Ô3jæFsÈÌÌ«ç°&⣸Éú6šï+d;Èv¸¬ôïß_u;uꤲ/¾øB¼zêÔ© *ˆ—6¿»¿|².k•C¶sèøWìÏ{4¼ŸºOú¢E‹N;ÉÉÉéÖ­›œ&00PvRSSýýýãoh™ý K¾§BÿÏÞ™‡GU¤}{þ‚\ï #â€Ë€: #*àŠ"¾ â:(Šè8‘%*8Q™‰Š,Ê(ƒÊ¦`–¶Î ²²’@èl$é$$él¤!$ð=¦†úʳõéÓÝYðw_}åJNŸSujéN×ÝUOqõÁÏ9räW.rèLùŒ ¶¾Icúü~D‚$…7ß|Ó¡;ÑYFî—ôÏqÀíàv€®E óùçŸs·ÓÜÜLÏþôÓOt|èMÎȯì4·sÖÖjøÑÜÒÚ9n‡j##ß`оcäݬöîºë®2tpàÀtB@@«s›Íæãããáá!·¶2ÛþIcwoæ=¸ºaSeÄ-ÈùæéìYJ-ƒ¢_DUì¤Û9pàý¾`Ávœ_Òÿ™‹º%:“¯É¢ãü&åZÆn9'Nœà¹ã-¸ÜÐá1X~‰–ܫ׾}û˜Û9zô(=ÛÞÞþòË/ÓS¯¿=nGÑí¤çYŽæV,]±vÀÕ×ð`Ô¢ÛÉÍÍe{l…††îß¿ïÞ½ááá!!!Ó§Oç•?vìX·64—!Úf˜-QÜE‹ œ|P#}Én‡¡o'88˜ç%/ae‘C¶[FùÉX–Ünèæx{{s½0zôè„Íf3=[[[;xð`zêÇÍ»;Ùí´œkµ»àУåÜ…®r;GŽW$¤¾6sN¯‡3bĈÓ«W¯¦ƒãÆ‹‰‰ÝÎ7ÞÈ+ßÇÇÇ­ m×Tpï¡(aø<:­©©I1.Ä©Aîp;|âÚ‚)žæ‚ ô—Q-7‹Àíàv—0|øp®fÍšÅÝÛ¹)**ŠŽ÷íÛ/=ßÒ5nç¼®u;iÇËSrʽ>úŒjìþûïÝ΋/¾H?øàÑílذA\åîXÊ:ÝŽÚÆß|…”Ä–ˆð9`âÄ—»¾4L£,jçh—QŸ‰dw†n·tôÙUÔ Û¶mcn'99¹½½N˜;w.æ¹—ºÊíœ;ßv®U×£›¸§þ:jÌÛÛ[t;l·,Ñí¼ûæi(áÖ†æ³n—Sé‘?|‹ö>ãòD\îvxà íH8ÚnGO¥Ù½sÜnèrV®\ÉõÂàÁƒããã™ÛÉÏϧg›››ïºë.zjé7k»Ðíœoµÿè>n§oß~l¦GéeéÈŸþô':(ºV·|Æ”[š{»nGíævìÎxé·ÃÏ¿E^·¢ŒÒ.#Ün¸ Ç1yòd>ž6mw;ÕÕÕôìñãÇ °Ü»w\j~×ºÖ íóº‹ÛY뻋jìúë¯/˜={6|ã7D·c2™ØÎòŒÈÈÈnîvtÎxá ¨ÜŽNàvp;ÀíW*6›M܃ûûï¿çn§µµ•NøòË/éøÝ÷=p4¯¢ËÝÎ…6åG·r;¯ÍœC5öæ›o–Ü|óÍtpõêÕ¢ÛY´h¯yjj‹+Ãítæ¼¾7º6bäg¸Üp;À•„Édâz¡OŸ>±±±ÌídggÓ³­­­'N¤§æ¼ÿI7q;mí¥nævn>‚jlÓ¦M\ìP}2{%ºÇ{ŒWþ”)SÜÝÖ®Z“Õâí¨í¥¸Üp;À•„§§'× =ôP| ¥¥¥ôluuuŸ>}è©]a‡ºÛiÿõ£[¹ýÉT]½{÷>qâDñe˜xâ‰'<(º?üá¼ò}}};¡¹uî“¥æ=ø¦QâþæÄ}ÒùA:_Ûð¸tº=žŠæ¤Ûá7¦¶Ó:n·t-ƒ âzá“O>án§¹¹™žÝ¼yó/–¯»áHnE·r;œîæv¼ÿµœjlÒ¤IÅ?üð/Á¨—.ÝÎêÕ«Å€0‹¥û»=»SqÿC¿ÈUŒÚ…<î±N·#–åĉŠi²=ІݎΩJ¸ÜÐ%$%%‰z!88˜¹6ŒmooŸ1cyÆ[ÝÏíürÿÝÐíLxô—ÀÔ+V¬(ºL~~~ïÞ½é`hh¨èv^}õU^ócǎ휷k*ìz.a§îP²ü*)?.NæCß0ø¬ ·#—B\"©Ý-]"·LŽº‡6LÀíàv€NÆÇLJ©GŒqøðaævÌf3=kµZ‡ BO­óÛÕ ÝNÇ£{¹Äô¢^‡j’»õë×Ó‘{*Vt;Çç•O Ñ9-Î-ŠÚ¢*»Þ#88XÍÃlÙ²…‹y®•è¾…:ý¬ٷC'Púô'WCô ¿ŠÒU%ËÍ|Çvýn‡ÍüÑ/‚p;¸ “;v,§¿þúëÜíX­VzöàÁƒt¼oß~ é…ÝÍí´_¼üèNnç»õÛ¨Æn»í¶B^xzyy‰ngûöí〈ŒŒŒÎiq>F{m”¶Êà!h˜9y°®YäódäRè͆ý®¶öŠ#Þ¹8MHñfèÊ×@¹­²_·€Ûº ‹Å"™þùgævÛÛÛé„?üð—Ð1Oü5íxy·r;ÝvŸ¬©/ý²„mþüù¢Û8p  ÝŽ¨GhÑ™íÎæÏ¨-2Òé=‚ƒƒù<º\Cƒˆ{8|ÊšÛ‘\%¹·ŠŠŠçž{Nž,;S1~·Ã&ÿÈgþàvp;@wÀ××—‚¯ºêªÃÄÇÇçååѳÍÍÍwÝu=õ¯/Wv/·£ôè&nçÚën ó÷÷çbg÷îÝtdÈ!III¢Ûyàxå{zzvf»óeYâ"&ΑÔ¢K –,Yòæ›o>÷Üsô‹b‚І‡Nf—ˆ›O±¬åÑx˜ÀaWŠ‘‚è*=ûàƒ.X°€~Ñ(‚þ22 ¤8·€Ûº)S¦p½ðÄOp·SUUEÏôêÕ‹žŠŒËèVnGñÑÜÎî°CT]ýúõ3 Ì›7¾ôÒK¢Û‰ŒŒduË0™LÜôLY(®œ¾ K§³\IÀíÐsÛðÛÁf³yxxˆAq¹Û9þ<ðŸÿü‡Žß~ç]©9åÝÆíh=ºÜíÌ}ÿª±©S§Šnç¶ÛncÑZD·³|ùr^óÔ ÔÜú<|1–iÀ¶Ù¤~›ÀíÐsÛðÛ!22’ë…^½zEGG3·“••E϶¶¶>ùä“ôÔÌw?è>nÇî£kÝÎÝ÷ý²Ìê?ÿùϩ˰-æ=<<¨bE·óÌ3ÏðÊŸºÊíLýïþSéééÜí|õÕWtäÑGMIIÝΠAƒxå¯]»¶K:‹º£Q°I;X¶Ào¸z.p;~kŸZ~ø!w;ÍÍÍôlqq1 3àê_®XÓånÇ¡G—¸e߬e–¬@`âĉtðË/¿ÝÎO?ý$îåÔ…¦/0uG›´ƒ5kà¿$Ü=¸¿¬V«···¨vìØÁÝN]];-**êŽ;î`'Ü}ïýþ{¢ºÊí´tè‡ïvž}î%ª¨ p±“““Ó»wo:.º×^{×ü¨Q£º°'TTTÜÒ †¶½{pp0ª€ß,p;ô\àv\ñ¬]»V\Dôïß?::š»ÄÄÄâââ .ÐÉíííß~û-[œE¼2ã­ƒ©':Ùí~t²ÛéÛ·³'/³aÃ:rçw9rDt;,º2ÃÇǧkûCEE…Ú¶ã¿eØ&é¨~ËÀíÐsÛp“””4jÔ¨ß)1hР+Vð}²ˆÔÔT¶:Q]]=kÖ,vfß~ý>ýì«Ns;Í-­Î<:Ííl £Ê¹îºëN ¼üòËtðƒ>ÝNxx¸Xót=º!p;ô\àv\‘X,–éÓ§Ë•NïÞ½ßzë­‘#GòˆÊ[·nen'¡ƒcÇŽ566²D222ØBbØ_nß²#ÂÝnÇ%Îq;ïÌùªåå—_ÝÎu×]GýüüD·#®†4h:'tOàvè¹Àí¸Â°Ùl>>>r±óÌ3Ϥ¥¥wðïÿ›/Ôš6mÚÞ½{™ÛIìàäÉ“­­­,Á-[¶\{íµÿݼûé)’rÜäv;´ŒKàv†ýeUȆ N\&((ˆ­wKOOÝΣ>Ê›ÀÓÓ]º'p;ô\àv\IHBë0FTòkŽ?þþûï3 Ô§OŸyóæq·“”””’’RVVÖÞÞNÉž={ö“O>a»hõí÷{¯…‹ÒsË\ëvš]üp«Û‰ˆMc“ ²³³¹ÛùðÃ_fòLŸ>]t;±±±T·¼!L&z)tOàvè¹Àí¸2ÈÈÈ;v¬Üê 8ðûï¿/Q'99ù™gža'2äÛo¿en‡ §Ž=ZSSò(--ågÞxó-?úºÊíÔ7sÇÃ}nç‹e«¨zè¡|ûî»®ZµJt;Tù¼-<<}º¡¡áâÅ‹ìªÆÆÆ²²2 ½“››;{öl–Ô€>úè#îvˆôôt‹Å‚ðÔÖÖΘ1ãòʯkÖþ´Å€Û鄇ËÝÎÆ-{¨È7ÝtSžÀ“O>ÉfòˆngûöíbÓ`¼Ý¸z.p;zyyy“'OV ­³téRQÔÔÔÔ´µµI.ooo¯««ÓžÀsøðáI“&±do½õÖ72·“ÖAvv¶Õje©ÑŸ£GþïŽê÷?—ªßíÔvÖõnçUÏ·©°o½õVîe222Ø,¦èèhÑí¼ûu†Ž® ݸz.p;zV«ÕËËëwJÌœ9óøñã§/SYYyþüy¤Z[[«««Ok8dÈ–þ¤I“"##™Û9ÒÁÉ“'[ZZXj~~~dg¾ñÖ»Ùù%öÝŽµ¥3.t;×^w“ŠÌÝýNG† vìØ1ÑíÜu×]¼¼½½Ñ ;·@Ïn@OaåÊ•Š¡u&L˜pàÀ.d***š››u¦ÙÒÒb±X4ôŽÙlöññáAxÞzë­„„ævŽvPZZÊ‚ð0ïÄÑ ¼æK¾úVÛítþÃ%n'x_ü/Á÷í{\€­M{çwD·-6µú0tgàvè¹Àíèþˆ[S‰üùÏÞ²e‹ÄÆ$$$\¸pAâ/^,((ОÀ“™™9sæL„géÒ¥Üí¤§§geeUVV² <999<ò;ó®»ï Vt;]õpÞí|ôéb*Ú“O>)ºë®»ŽˆnçŸÿü'o©þýû£@7n€ž Ü€î }œ2eŠÜêôë×ï³Ï>+SbÍš5~~~zÒ?}úôöíÛÃÂÂÊt3~üxvwÜqåÂÜ‘‘‘qüøñÆÆF–lhhèÍ7ßÌΜ6ýo9ÿßítõÃI·sPK–,ábgÿþýÌÞP%ˆngâĉ¼½<==Ñ™ ›·@Ïn@÷Äjµz{{{xxÈÅÎßÿþ÷ŒŒ ®\,‹h`8°nݺ5kÖ˜L¦3gΨ¥ßØØ¶¦ƒøøø2ÝlÞ¼yРAìN^xá…¨¨(ævˆÌÌL³Ù|îܹKû³þùçýúõûÅDýþ÷Ÿ,úœ¹®8ávžd‹Î’’’r.óüƒŽL:577—»ÄÄD]™€. ݸz.p;º!k×®åþDäþûïß·o×,MMMtþùóç«««ùq³Ù̼MLL x̸páBbb"ó?»víÊËËÕM}}ýÙ³g%¾HBaaáÇ̼Sß¾}çΛ’’ÂÜ‘••U^^Îöç¢tžþùÿ® »åVÿÀ=–š¦®u;«Öü3ùÞ{ïÍ ?éà·ß~+ºõë×óV£ŠâÛŠ€ÛÀí¸²IJJ5j”ÜêÜpà 7n,¨¯¯g!n8,02?!''' `Íš5?ýôÓÑ£GÙ9'Nœðóócë¶ÒÓÓÅkjjx J¹¡¡¡¢¢¢\¬¬¬_|‘ÝÞµ×^ûí·ßr·C?~œÏJHH¸ýöÛÙ™“Ÿ|:%ýxE‡]éÚ‡·ó×ç§SÞ}÷Ýc—ILLd3yRRR¨ÈÜíxzzŠÁ®Ñ± û·@Ïn@7Áb±LŸ>]nuz÷îýñÇ*J /^lllLRRÒÏ?ÿ¼fÍÿ]»v1ÕÃöÕâçTVVÚl6yjmmmµµµåšDFFŽ3†Ýê=÷Üc2™˜ÛÉîàäÉ“lfñý÷ß³%Z½{{|°ðãÂÓÕåÕ]û(«j<íˆÛ¹zà5tÿ;wîänç믿¦#=ô›ÃÃÝ 0üqݶ)$Üp;€l6}¤T ­ó׿þ5##ƒ‹”ªª*ÍF›öööúúz~Uqqqtt4[„a6›ùS‹¥©©éâÅ‹©QŽ”¯¶áY½z5_DöꫯÆÇÇg ÐçdvÛV«uöìÙ—g"ýiƒŸYUc×>ô»m»"Ù %±hÔ@tð“O>á¶'+++,,ìwz XE Ü`€€€ÅÐ:wß}whhh…@yy¹C)·¶¶ÖÔÔðËO:•——'&(_Õ¥Assseee…:'Nœøàƒxž>ú(û×X,„'##cܸqÿ]¯ôˆO;]ÕÐeÝngö¼…̶‰…b“M&?’••µ`ÁÞŽW_}5¾ €žÂðɸ@?cÇŽ•[k®¹fíÚµryâççÅ—8Ùåĉj*&33óøñãÝpuuµÙl®ÐäÈ‘#Ï<ó +È7Þ¸fÍš,ʱ¦¦†¥¶mÛ6*);söÜ÷sN”–V6tÉC§Û9ênºÕ•+Wòâlܸ‘Ž 2$ë×ÜsÏ=¼5½¼¼ÐÕÜ Ü€ÎÇb±Ìš5K1´Îœ9sŠŠŠµÉÎ;׬Y³aƤ¤$µx;Œ3gΘL&:™.Q“0”XVVf÷†[ZZ:´nݺììì 9’jܸqAAA¢úàAxl6ÛÂ… Y,â×üñ›ÿ¬)µ4tþCÛ9˜œÃ(55•„5âk¯½–)pøðaV"¾p7p;:›Í¶lÙ2­QÂäÉ“SSS-—©ªªjiiijjª¬¬äY`ä­[·ž:uJQÂÄÆÆ²ÝÏM&“Ùlæ×R:uuuüÏÒÒÒ}ûö±3ÃÂÂ4¦¥§§³L·mÛ&&h—•+W²’öîÝû7Þˆ OQQÑùóç)}úåé§Ÿf•0úî{ƒÂ¢J,õü°ëv–|ýóTb† F7nܘ!°|ùrÞ¦T|Å ÕÀ…Àíè4L&“¸}gĈ»wï%Œ߸½½ÝjµŠN&&&†F¦ù>ãDZZÚ† èø–-[233EÍB)°Ð:,?~òäIÊš.¡ããã%ÓÊÊÊéÙŸþ911QL9wî\sssUU•†Þ¡ôß{ï=yæÓO?§¸deeUTT° <‘‘‘·Ür ;ó™¿NMË""‚EÝLNNNxöÙgyËNŸ>ÝnÀ@^^ÞäÉ“Cë|õÕWŠF‚š“!bccsss·nÝÊö7—HºV’ZKK‹èd233·lÙÂ%E'455………±ôcbbJKKÅ EgÏžåIÑÝ644hOàILLœ4i+ò°aÃ6lØ žœœ„gÉ’%—÷Iï=ÿƒäV•[;í¡æv2òÊúöû=ÝUDD¿íO?ý”Ž<ùä“G~ ‹®ÌðõõEçp7p;ÜŠÕjõòòRÜhõí·ß>qâDåejkkåF‚Íf«®®æ—p'ÃØ¿ii)–ÎliiQKêâÅ‹MMMUUUüüøøx6ígëÖ­l^О={ ø t²Ú†é.\¨«««ÔdçÎlñÈ#DGG‹K™òóó›››/u#š3g;màÀkV­ÞXXfí´‡¢Ûñó¢›:t¨xÃ<ð\±bEšÕ›ØÄØH €Ûà>xÀ ÿ÷ÿ¯SÂH¸xñ"[ %:™FB[[›ÕjåïÝ»—¯êÍL]]vgâܹsgΜÑ6<Ÿþ9«“^½z½óÎ;)))¢0¡`‚+//ï±Çûož»îÙ¼ß|º®sr·3ãwè6þö·¿ñû¤Û¦û§ƒû÷ïOxíµ×x+O˜0/€Nn€;ˆŒŒ>|¸ÜêüùÏö÷÷—èŽèèè’’‡ÒÏÏÏW“'………µµµ¥vþüyÑÉTTTð?kjjXÐc=ÈÕ“œœœœ™3g² 0`À²eËÄx5,R[˜A5ÆÎœøøSqI™§:Ü‹»·sÓÍ¿úñÇùM~óÍ7täÞ{ïMù5b<%*^Ü×RTT4eʹÕùýï¿xñâ*%Øææ!!!z–ðTVV²H;U*?~|ݺu‡²;͆ÑÔÔž’’¢–à¾}ûÌf³C•pìØ±*{ÄÅÅ?žUÎwܱiÓ&ÑðP uuu,µÿûß<Ï;³½Žæ”ÖºûÁÝNôátʺoß¾bÌd0ùý÷ßO0™Lb‹çååáåÐ ÀípV«ÕÛÛÛÃÃC.v^{í5QwÔÖÖÒÉüÏ¢¢¢   ¶YÕ¡C‡ÔvÍnjjŠŽŽf¡uöîÝ«æL(5???10².\HHH`¡u4ÜSO’=¹Ô0›Í[·n¥¨ÒǶmÛø\—Ç|ÿþýGxª®9sæôîÝ›áù|É¿O–ÔºûÁÜÎÇÿü’Ý›xc  ƒ›7oNøè£x‹S¡ðŠèàv¸„µk×4Hnuxà˜˜®2Μ9ÃCë°è4â|æd222$&99™:Þ¹sç‰'D=ÒÔÔÔÖÖÆ#3,ËÁƒ™´ ,++“ßpnn.eIJ;zô¨˜ µþgIIIHHsJê‰Êb2™˜¡¢Ü«tsúôéÏ?ÿœ9±¾}ûÎ;7))I)………,OQQÑSO=Å*ö/·Ý¾%0øDInç¾±ã(»Ï>ûŒß5ùãÿ˜økÆŽËÛÝËË / ¸=‚¤¤¤Q£FÉ­Î 7ܰiÓ¦jææfI|cúóìÙ³gΜáçp‡Ã › CGüüü233Å­V«¸ðª­­­¾¾ž?[ZZʜ̾}ûšššØi|U׺uëâââX0gFmm-­sîÜ9ú“?•ŸŸ¯¦žl6ÛáÇYF”#å˯¢¢QÛÛÛ©ìb1åäææN›6Uݵ×^ûÍ7߈z‡r¬¨¨`AxbccGŒÁÎ|lÒ“1IùƬål²8¡èí·ß¦#/½ôR‚ÀØ™ ú/ ¸Ý‹Å2}út¹Õ¡1þ¢E‹NŸ>ÍÅE}}}[[›Z:ííí üä²²²¨¨(¦J˜ÕQ”0çÎSLíüùó'³}ûvJdÆ ÉÉÉ|U—¢„Ñ£žØlŸ€€ÿ9##ƒñ÷÷§¼D]C…b6†!QOŠPÁÇŒêñî»ï¦4dggóD?üðÃÀÙ™3Þ˜•šeÎ+ªqùã‡õ›Y8 ñ6èO:øÝwßÅ ,[¶Œw€þýû«Ínp;º4r÷ññQ ­óÜsÏåää(΄Ѧµµµ®®Ž_xêÔ©={öè”0äN&55•&aŽ?.•¦¦&QÂH §EõË|mÚ´‰ÍäINN–L(b«¨äHÔ“"” _à6uêÔˆjåĉTºKAx>üðC6[¦o¿ß{/ú2·ðŒkϽð‹»{ûí·yîûöí£#ÔôtW‡žxâ Þ¦L™‚×@§·ÀQCëÜsÏ=‘‘‘g ¿ÁÂæðNŸ>-&ØØØ¨!a$Й”¿¶¼¼üÀÉÉÉb‚õõõ:·Ó¢Ó¬V+¿°¤¤$88xݺu”&¥ÌkL(iii©©©9£¥¹`Á„çƒ>Hû5ÅÅÅLY,–矞5ÁM7ßò£o  ÝÎu×ß@ÉþüóÏ<_:òè£ú5,º2ã‡~hnnÆÔ€În€~¬V«/—sÍ5×üøãrA·aÆ#GŽèLßl6oÚ´©¤¤DÍxVVV:tÃGUK-77×QÿÐÐÐ 10ü÷šš»ŠDèL„GƒÌÌL¶Û8Ûyê»ï¾õNzzºÅba²+!!á®»îbgÞ;fÜîÐØãæj'”¥6`À1Ó &°ÐÊqkÖ¬ûCrr²ù2¥¥¥Ty¨%à*àvèÇÓÓSZgþüùeeeŠjâØ±c,02N£Ì·A—ÌÕa‹ª¢££y`d5X|cJ-""B-5zÊ!õDgÒùj©QwïÞíz*//§*:c°°°‘#G² ¿ÿþûwìØ‘*••UWWÇܼy3Â3í•×â’rrNU~Ìž·Òyúé§y^ñññ½zõ¢ƒ{öì9 ðÚk¯ñ.1zôh³………ÕÕÕz&5žÎ‰'Ø >'Óa‰TTTtóÛ6vËŽ~vNvîHÙXQƒ:_÷U‚›p¾3³Ú¶û¿ÏÝÏÑ"nîÎ|ù/éÀ@\yÀíø0tèPQì<ùä“ééé5šÐ31|q}}½\Â8p€`2™JJJøµµµµÍÍÍV«•9uêÔ®]»x`dµåT|sú´¦voL=mݺÕl6kœî* €å«–ZYY+ELLŒÝßt¾}ûèäƒÖèã?ÿù_ ÷òË/S.¢áÉËËcsèçÇ̃ðx-øôHN鱂*;GÝM‰¬X±‚ç²jÕ*:rçwÆþš?ÿùϼWÌ›7Ϭ u /\PkÊ{ûƒ>H=á–[n1–&½!<÷Üst9ëQ·t@#/7A’Ë‘ŠðÃ?h_L§‰÷InÙ²ÅîkÿÍ7ß”dGGìŽaeçP=èl5Ã5FÈZ“_EéØS®2ÐÁèÁƒº¡,ÜÑ» wfÖ:„áu0cêÍXŒ5·á윑],#±*ØËM//»k_­Àíp¡ÛñððˆŒŒÔé%¸“Y·nÝáÇùJ(¾ÉÔÖ­[;&^"Æ7¦ókkkùSYYY,ˆ±ÜÉ”——ïØ±ƒI˜ÄÄD1AߘáѯžèßHΤóùµuuu---t‚Cê‰ò}ÞéäÂÂBñ&ÅbÊ¡“,XÀêÀ€ÿøÇ?R~MII ÛÌb±ð¹4×^wÃÖøeT9ôH8z’®íÕ«•š§Ï¶E›5kVŒÀ¶mÛDãGÕeÖAuuµþÐI {ÂÆ/òo¥q;¼‡ËQÌËIhlû;u¨ .¤§Ô®¢û×úKg,;ýл"»1»­f¬Æ¨h¬W8_Pós¨Œt¿Óa3é¦ÎÌkÏ˜åØ²e‹FÇÓpj¼:Ä–ãŽìœõ(I‹k´G±-˜Bt뫸®u;LïìØ±£F7Üɰ¥øL‰„QŒoÌ¢Óðsª««Ù’+J!((èÌ™346‰ˆˆP”0µµµ’¸:”¾èd M&“D=ñU]Lœ:uJLP ­CgÖÕÕÉ‹I?Ož<)æKò§è4±Ô mmmõ¤Hjjêã?ΚàÖ[o]»v­¨wh¼`±XXvG½ÿþûÿézÌ[v„g¬Ôùøbù/Stîºë.1ñÁƒÓAªÑíxyyñ.qýõ×›uS\\Œ <=Zì°Fw¡ÛáÃv6bËØÌ>uá qøFÙñ éè8`*Ž(E½@õÀ®b¦‹§´¼lƒÎÒÎ΀:Ðn5Ã5ÆÓg³ Îâ\GÝÎ-öp¡Ûqag}š·#Vïx„˜lpp°ö…¼Ô|bkjß°ØÜîËÎ%_ÒÅW„ò¶àŽTRvñâü«¸®u;ü“φ êêêjõqæÌ™Ã‡³Y+ÄþýûËËËù³V«U{Ãô¶¶¶ÆÆF~>]Æ’bÆd2‰9jÄ7>wîåÈÏÌÎÎæê)..ŽM(¢#t\LPqÃt¶ë:¯±˜{öì©ê€méNé)¶£/µdÃô .444h×$¥6|øpÖ?ü0õBœ–#_{Âň¼¼tò¥@†³Óo<Äi­f¸ÆxW‘ÍytŠ·j¸*ÔªÚ®êÌÁÁÁvçŠhÃm’<;º7=FN^yDü†åiòìÛÎXvÎÃZJò Ò9MËòUu®ÔÀípÞí|üñÇsçÎe¿ÿë_ÿ%‰]ÊËËãââN:ÅÔÕÕéßdªµµµ¾¾ž_{òäÉÀÀÀ­[·æä䈹466²Jh8¹„¡L%F›u#322r€ÄeQ¾6›M­ÔçÏŸ·[«_}õUÿþýÙâ©3f:tH4<ùùù---—:f}öÙg}ûöýåÌ޽ߙóaJVqF¾EãÑ·_?:YTF³gÏþ%Dó´iûÂÂÂXte†¯¯¯Ùq, ôÜŸç 6à56ÚRƒ›µ¯ÑÕ†¨üBÅa&½ÊK¡}ÿ¼Ò$ã>ÃÙélDÉê5\cÚöF»€ò3ù—» ·à(®êÌܘ–,˜ŒÝŽ'!s¡zHTŽj *úFn?$•l8;'Q 3ųs(ì¯j»Ó™ìF¦n@'»Ã‡òÉ'ìÏùó狾ÅQ233Õ#«!Z 555Úóì:™¤¤$¹„Ñ™š¢z"èñ&›››íœ¹xñbKK‹ö´¨¢¢¢·Þz‹áY¼xqò¯)..fŽËjµþÿ3¯¾fÙ7kÓó-Š7ï¦s,¦ÃöX_¾|ù>qÓ´ÜÜ\³! wàvxUµ)(jƒP'ò›ã('íŽ1OàFMŒ¨`,;»°P±üÅK™Úm5c5Æ'Ãh„âѳâF &ìd°nmså’‰a®êÌ}~ ç2y2›åâ(‡bsXtµ¸páBJJ [3¦–Zvv6‹ÀC÷f×¢˜ÍæmÛ¶Ñùùùùj Ò³¾¾¾yyyzjéÌ™3ôQ\C=Qaé:MgµÛl6*ˆÅb±[¼&NœHU$ª–††–&ÝÀM7ÝÄΜðè䨔#¹ü1ô¦_ö4_½z5¿vÑ¢Etdܸq‘¿†oËN|ýõ×fçàQ A'£½=d€£¶ ?½5vGrô›kíEüæ]»‘–Û‡KÃÉ0 Ã,СC‡Ø¶æ 1)Q=íØ±£¼¼\CÂÄÅÅñÐ:j%¥›çêÉîR¯ÌÌL*Oõ£§©ò¿øâ „‡ÆDtK‰T3TW,ñ¥K—ò <ž3çÄ&积ٟ®/|ì±Çè ··w„€¸ ‘œœlvnŸ@gŠÑäðoºÅ©⸆:3ü‰²Ÿt %(n£¶WŽ"ô׎7â·ÃËâ|5‘"¢(dôH¹ÿ1œÝÁ¾¼òw;Š5¦³ïé™°ÁåkÝÓ•‹‘¢yg¯é¢b·3‹eä·ä&·£Ä[çB9y¯Ö³ÖLî gç¤ÛQÜýüÒ¯#DQ‰!žØîWê‰7½0Ù[%AÕë|'tº€ÄI·“°{÷n¶Gö¨Q£N:Eƒt«ãÐðï~ôèQ.aØ&SëÖ­‹‹‹«ªªâçS.<¾ñÅ‹m6[}}=699™Mò‘8Q„……Y,~ ]Îâ·µµ577óãtß“KQ=eff²¼¶nÝš››+ª¥¥åüùób…PýpõD*þ.--ݾ};sYiiib‚b1åœ}úÌš5+þ×äåå±J`>Åg‡ ¾’˜?>ï 4»”ââb¼Ü:>CÀÀR=nGÍHè›ó‘/§Ä‘‘[õŽZ”!¸c5¦hBø/|ƋܜðÍÓåK\åvø8ÝÑv1€ÎÎÌ£FKæ2¹Ðíð”éå/ΡÅÔoÁí°…oò¦§úaÁÁÔt_©*Þ /”Fwâí®34@ç¸#FDFFª¹â믿fqzGUXX(ª Ãñ <:á³n©©©qhßm‰“)//ÏÉÉ<{ö¬þÙ‚/~mnnîŽ;RRRÄ5&i¨'ENž<ùì³Ï²æ2dÈ7ß|# j»ÒÒÒ¥K—Ò³ï½÷?¾sçN¶Èn÷îÝÁcÇŽåaêÔ©fWÓÜÜŒWœ»¿k~PÅx¤vÝŽÆÌØØ\ÿªão»š‚—Z#¤Œ;âí8š]ç¸=5¦_°H¶+’v‡ÛáfC;@;ö¶VìÌ\ÈÇþ.t;¸^ ȳӎޣáv4¬†Ûq4;ç›ÀX}ʧ{‰nGM ÑÿM—¼TœÇËËK4€>«¨¹”””ÀÀ@¦ƒú÷ïOŸv4‹NNž<É¢Ó”––:tç,<ÁÝ»wÇÅÅÙݬJËDDD¨Ý^^^žZ`d5šššŠ‹‹Õ¬®®v(5„G»###GŽÉZp̘1Û¶m OLLÌ—_~ËÌ›7Îüë_ÿ$°cÇ~™±nÝ:—»ì‡Þ™nG']ëvÄ@=.ŸºÃg‰h‡<íA±”ÝívtÖ˜CzíåÁ„]îvtÆ}r“Û‘wfŨÑàvDSáüÆUKÙÉú7}]¦LôäÜ— @Ãm¶¹6gРA;wîTs;DLLÌý÷ßÏÃï°08 F9sæLll,ßߊŠÑ åΈqÂÃÃY äôôtík›››Y|ãM›6©Ý%¢_=µµµQý¬_¿ž®RKò¢òêŸÁRPP°oß>=5ùÝwßñ <Ó¦McS°=z4ããã³G`ùòå¼ôîÝ;77×ìøhÀÝnG{ÞŽ|—ó.q;—\´:F iEM¡q&ŸY¡1ÄwÌqhL'?Çpvîv;úkLòµâ–ÓÉ{¦NxÝÚæ¦ñ¸¤3‹›˜+"y©êÜþLܤñ.¤eKQˆçpé¡ñ å*Ÿc8;g^òδ©\O9³¾ KÈËËWfW]u•¯¯¯šÛIMMMKK{ùå—yø³gÏ67778Aqqñîݻ׬Y³~ýzÊWÿ¬ÆùóçE¿”ͶÍÚ¶m[aa¡š„aû›•––Š7#–¥²²2**Jz*((Ø´iÛŠ£VÒÐÐP¾'—v”¡šššàà`üGg5ž>}záÂ…<Ïܹsåb'22’ÍÏ ØÝAHHÕÒ¬Y³x?~¼Ù=ÔÖÖâ×9nÇ€¸bÜŽ¸&Èîx™O0мfÄ•5üÎ5,„|Üg8;·º‡jLòij{Oë™Q¦ ²:ßíèÄ…ëzßì–Z±sê銯cÙ†µ¾á¤ºÃÔ#ç)**â»)1úôéãçç§ávˆ¥K—2K0jÔ(JÁf³58GNN×#ùùùááIÕÕÕ>|˜F–8.aè'å(ÞÀÙ³g™o¹pá‚hx´ÕSUUÕž={س¤¬ù…lÃt‰zâÅTSO”~\\Jááá•••’›Ô®ÆãÇ?þøãüáU«Vðññ¡ããÆÛÕAff&›K#ú½Å‹»É픕•áåæVt~×Ü9n‡ÆYlûžÎt;j»Þ83:S¼I>5BÍ$¨ eç>·ãhÑŸ5«Æ`_^vê z@93oGÿ([O Ó Smð‘¾ÎLõ£=kÎØ¼:݉F)º»‘s¯âo)·§XóƲ3 »Å#ë{:ÛN\3hln@×bµZG%ê^½z}ûí·n‡>¾úûû_{íµ,üNdd$[!Õèt”#›Q³sçNGCp°íÈyjUUUlž s2§OŸf†Ò§\Ø>éŒææfy|ãÖÖV±8Ççê)++ëRǪ.¾ Œ2²X,üdºPÜ«ëâÅ‹çΓ“©§àààšš~fzz:+þŽ; ÅÊᦷµµ‰ÅT„’å¾î¡‡¢Ô˜Ûyâ‰'èÈ»ï¾C·Á2¥6›þàÁƒf·áP¤kà(bЭ«ùpR<ÇånGÏnÔ®·#j »“7ôB‡ovǼ\þHˆ±ìÜäv Ô¿DcŽ/»N_á|¼=‹€ä]]ctµyG®ê̆ãíðPrS!¶©]©6M»Cò‚¤?Îά2ÕjÞnÛñ}êåvZ»jeàŠþ-éÀUQ()wï+Goü¶5Þ±_Ñü*ýŸIèŒeG?úFÆXv:q¨Õè¶—\F \’ˆ ;X'à’VcõæPçtGsÓ¿6ýÿ©°t¾£Äpv†aßæ¸°nY/5Vöî w&L˜ Ñ;_|ñ…†Û!âââî¹çv¾——WKK‹ÍfktŽªªªˆˆæL"##Ý_‰Íºá©lß¾oGMé«I ŠN†¹—mÛ¶±_(qÊB¼ªEƒÑÞÞNõ£X̃æççSšÌegg‹ ò EêI‘+V°xJÔ”ûÛßÂÃÃûôéCR«ñ[ÊËË£§x£ßvÛmfwB5€Kî~[Óé$ã-œŒ¹>UøØ=Á˜×rH숲B±Æ4<ÊßêÕF‹Îdçr·c¬ÆÄ«ÿ{Š1™uþ{uÞíð`;zl’]Ê{&ƒ¸¼3v;¼ÿ¨Ý¼x‚b©õ—Æ”?ym(¾áHÚÚpvÆ>Öj$¥¿í$ÇîMê_@÷Gñ½ÈU›Н5÷í+GE¯ÿ¥#ôRÕ†Ó?\É…ô§Ýÿ&ôÁµ¸º688XûBcÙ9úÑn«Q°‰ òÓþBT,¸wBcŒ}ÌÐóUJÿmåuÅZÍQã'î¢;šûÒåy×’†£W‡¶r¡²©Ë’²Û½cÙ9éuåUÁg›k VÅ®®§ìÝ›Í6yòdI-Z¤ávŽ=šžžþú믳“‡ž‘‘áü¢°°pÇŽlš eªF[ Å¡[ -..Ö#aì:™èèh&a(Y‰„¡“RO¼˜l~Q||¼8¡ˆªQ#þ°D=)RVV6wî\¾ÔŽ~:”]Îæ5íÞ½{Ĉ¼¹çÍ›çV·ãh¸l`@/ó÷RùGþ?E>ãVA~•1·#JyšâNÍò÷y¾„Gÿ¿>Îb{˜‰Íê’ÎlÌíh47ï?’©w’¸\ň–C¼P[Çñ·¶“¦~mb8;VpÅ4{«µÁˆþ¶“D_#’ª»þï€ sŠïÀ.t;üÝÉM/qƇlâµ/Üåê ƒ&Îz•g§a9Œeç¨÷°Ûjâû°bìÚrÅ«2TâÛ¯!¼Nœï½âçjy©5º–vR.ñ:›[»á4Š Þ°CÍm,;'a%]W¼5Û‚°t¾«w9žžž’"Ïœ9SÛí›7o¾úê«édeË–]¼x±¥¥¥ÉiŽ;Æ#Sú„áQL¶¶¶¶¡¡Á¡ÔØJ(žBYY%ÂÿT\Õ¥­žè~yfffDDDee¥x“tŽNõ¤VLNFFÆÃ?ÌZsÖ¬Yl5™ÉdÚ³gU¬ØÖ»vír«Û¡2âs”»‘|ä ÷z×’|O$ã_Ró71þáÄp,eɰ&’;QüÄOÐùþ/ß ü£ËNea/Å`jŸÓøÐ׳øÍŽÚG#cÙ‰û.9/Lœ¬11\ U+¯ G?£Úí`vûƒ EŠE[A¢ wfcnG£¹%ŸµXǓܼâ§>L,‚ø}œÚg1.4«+±àjFËXv¼fûƒbO`5šÞnÛÑ/jsÌÄ~"/Õoóè¶h¼»Ê툯Aw¸ñ±ø>,N­QüÒ„ßÄuâUŠ’Yü*¾‡‹o•Šo)Ʋ30Ò×+Lr'—~½i¦üf‚ƒƒ?FŠWéTbRŽv0þ€Î8~®Ò†b]±YOŽÞ¿øoÚy·£¿¹ym‹/Igóg(ÙmnÃÙ¹¤¥$·$6ŸòïÂįùÄgÅÉH=höáåå%ùl?}útm·“‘‘qøðágŸ}–?a‹ÅÒÚÚ* cÔÖÖ:tˆE§1™LUUUŽ:¹eª¬¬¤“’’tN²Ùl t¾ÚMRÙÿœ™™©–݆cL=‰ð%]T{>>>TzÑ1·3gÎÞÊ4»—¯)joãj#w(¸’™‡ü]Ë™}²4îDcê²£nGœ®`ìKµû”|PÔþnB2ïÔ@idçZ·ã|i|âè×]âvÄြ¼ŠËuf—»þÉVíæ5>oh\¨= _q±ŸôåÂìu;:w??‹:T~b÷Bàväÿ,\îvø×%jóÔæÊj¯»T \&yOšâKž¦áìt"Y£ÑjÚÿ_4V^kܤþ $óïŽpôÜ-8ßÙ4ô’¾xŠêÏy3 ¿¹/iÆP[•|Is>¿ØÜò‘±ìœ„÷[Řõqå¾¼¢¹êYoõlC%‘ûï¿?::ZÃídvðÕW_õíÛ—X6™L®šÀSYYÉ#³è4Žî“ÎVB‰¾ˆ·±ëd²²²ØÜ! ·³oß>ÿYz:}ú4 ¤–Ú©S§Xügꉊ)—EtœG¢† |èE·#~ðž:u*ÜΕýKâ{Äp5­Ýt»„~ò±ªÝhŠzN`·Á Äµ?½ð°~:Å>n§=÷I¿Ðç@==–r§R¼ží–ÎXv¼Œ:Qj7ŠKjL,8/‚i vûÝþ`·eu¶â×7NvfµO¶Ú¡>õ4·øg÷o÷.^ȯ¢Ð‰R¦ö•d§ÿHgv¼f[SÞØL9_vó•n޾T%]ÝX£ð[s;’i3nr;Ú1Á. áñÕ¢*¾œÕ‚¥k»¤…ÌXv:‡¢¢‚¶ëXx[¨ý¿V a§?™Ý(ìLö>ìò1²öÀÜØ«C­Pú÷qÛ×I·ãhsk‡y¼¤¾c‚öj›]ÎÎ%N’,o ‡T’Ýeþ.ßä·Óðõõ•è¡C‡îرCÛídeeÅÄÄŒ7Ž]âééiµZ/\¸pöìÙf§1›ÍÌŠlذ2u¨8/^d+¡8T í=¹è =Å•T¼–Eæž9s†FŽU‹ÿÜÐÐÆN£ZR+fee%+¦]õÔÖÖ–œœÌ&5åä䈉œ;wŽ/骯¯ŽŽ—¸ÀÀÀÿýßÿåí»jÕ*¸€žû n×·;êvt&+Y¥Ë¿èw¹Û±»û¤ÚpÒîS1e»±pÕ¶Ñ4–žq¨¸0‡Gµëv4Nàó'ÅÆâßkØnªm-xê¹U8$O¨³þ¬Vçü‹ Õ)6.{!8ãv 47¯5¡¸¯¥m¥½Å¤CÙ¹ªÝ%j”‹&‡¶çÓ£Ë ìÄ×}ôއ‡‡¨wúöí»bÅ m·CdggÏŸ?¿wïÞ,ÀrRR‹HÜì ¸“ñ÷÷/**rÔðˆN¦®®ŽÚ…É–¨¨(îdè—½{÷²ã‡¦Óø%gÏžå¡uØJ(þÝ WO’øÏ¢„Ù³gOii©X"Z‡-aÓ¯žòóóÙ„¢mÛ¶ÑkPôN<¤3¥LÍ!w;_|ñoYj,jD¸€ ;Äx#gJ¶ËÑ^ÊÇG|%”·c`'6óSû{yù`MÏÐUqjwèêÚì.ÙÛIAŒÕÃ>cÛì³a©Æ:\E·cí‰I¼Xå°²8¿“‚š8Ò¾sùal‘Ú«ÍçÙ­ŸÍ™Œ5·Ý;T´‘zöóR´‘Ʋ»dh'y1%-È_SÅ»î‰Ñ’"))iРA’ <ï½÷ž]·C„„„ >œ]âããs©cm”K&ðˆN&,,Ì@`dQ4•––îÙ³‡;‚I˜àààòòr¹„‘¤ÖÚÚ*Šê„)®ž¸„Ù¼ysnn®˜ Íf·Öb[_ÙUOUUU&“‰ÝpZZš¢w¢¤Nž<¹¯5·óôÓOó63fŒÙýÀí¸µWŠKTÔ¾ÉÇnŠÛk¢å;Dëq;ŽFÛӃ✡¯¡8'¢èË»0»KöÂã°±°8ÀùÉ0ünõ/ã!t´çñé+:oÕÑþ ± £X:½$Z§‘†Ãó°©#NFÛs´¹í.!TSyÜÔiÔ¤|i’áì.ÚIA"dä}OR9t›r£gó‡¦úô8,ËØ±c%Ò¤I‰‰‰ÚnçØ±ctÂÌ™3Ù%”HRR[uÖP ÒK†íN7c OKK O-//oóæÍL¤lÛ¶íäÉ“b^çÎÓØßœ9~²Õj=|ø0DÌê°ø9lŸtÝ­Z8¶õ•¼˜L=qÛSSSÃOwK?sæLlllTT”¶Û¹æškÄÍî;ÁíP_ÂG/7‰‹} KÅm¤Äo½Ùü >$—‡º’˜"iŠ¥)FHV¥ªEXí|·£¾UÏ">ØÇûzܯ7^Û†³»¤#ô±bîθG;Ó=¨¬á“(¸.p­Ûáék˜q£RÞŸ Ñ^jï,À·RRÓYÜuð6uÒí8ÚÜ:§`É{µž2üV¹1œ“n‡Ý‰K Å2bïu·P÷pÇ&_Íf›5k–DïÜzë­¡¡¡Ún'§¶C:áååeµZ%ú¸“ñõõ¥L*—D4566&w SÂèt2‘‘‘¢„iiiѳaº†zÚ³gÏéÓ§EïÄgÑŸtÿ111ÑÑÑÚnG²QÎÁƒ;ÁíP=àÓ€ ÷×–?«±ÝÝx;jÃ|GwoÔãvÝIÁ.âX^œàlïÙ!·ÃÇ¡†³»äøN Nº~«vS`«áÄ•zz¤ŠhNt.ÓÓÄÙYv'Øû‰ç–³‰Ao4ìÍ´ëv\ÛÜãvxYœq;Žî¤ ¯‰”w|Ó?›Q\t)ÙÚL㪞ËÚµkY1üΦM›ìºãÇÓ o½õ»jРAr}aæd´£Ó¨ÑÜÜœ››«–rII‰£ÓÚÚÚD5$ZBqU—†zb ¾Äbæåå)z'ú%??ŸÞbccõ¸¿ÿýï¼o¾ùfs§àèê9 Çœh KÕ¶1Òãv\²å›b)kÀGëòqŸäÛyGÝŽv)4ÜŽ£ÙÀ·Ã ‹u¬§A9г $w%)š c)ëÙ\ÛîV_vœd°Ï¢k¸/yM:KÙ°ÛÑÎNÍíh7†Ûq4;—¼ûI^\¢×eó\FbçÄ~+¾éñÞ´’£éJÒ;òð;½zõúä“OìºÜÂÃÃGŽÉ.œ·£¸ûù¥_O,”Ïößää9’®BéˆK_¯˜ÿ ‹eÔ¨Q’éI/¼ðBJJŠ]·“×ÁgŸ}Ö¯_?ºÊÃÃÃÇLJŦŸ.1<%%%lãòõë×'''«-§:uê‹„C? ÔR£§ØivLmmmHHË—~WK©§ððp»3X¨B:Ä¢(Kimmå“(ÔÔÔÇ;äv¶mÛ&6Ÿ¿¿ç¸ýs–€]øWÌC*µ0§zÜŽÚP·Ûºm±·£-v ì$Nh‘tBà´®r;|†Œv$d=ëŒôC.ž Abç)Áí¸Ãí°w?ŦgÁÁÔtŸØ#*AÑí(:@6\;ÐtÃf³MŸ>]¢w† f2™ô¸üüü„„„矞]8tèÐÈÈÈKK´\ex(G¾5Õ©S§Ä›ç›L±ÌÔFâd˜¶¶6¶Š¬¯¯g‘ ]Eé°¨ ±CI‰…*++sWSOl‰ÙöíÛKJJøåbhóçÏS%SMÒí9ävüüüƌî_¿~#vÊËËñ À…ˆcL ã¨Øu;C°îév‚ƒƒµÅÎ%¥0°¹ÃñvÍ®sÜŽhf oýÌŽ˜µ<˜°;ÜŽÝ fîP ’¬Å™Nò¨Ñ]îv´­—F¼Ýç5ÜŽ£Ù9KÍØ¶Vò°áâ{©]—xå퓾råJ‰ÞéÝ»÷¢E‹ô¸PMÞtÓMìÚ)S¦X,æUl® ¹¹™+“ÉTUUEGÄÓëêêøÉçΓÄ7noo?þ½sçNª~²ãwH•PTT”žžN݉¹ÀÀ@®Ô† òóÏ?+ºÝ»ws­*™®3kÖ¬ŒŒ sgAŽO_®…Ä´·7Ræ\n‡‹ím©ó*†±9‡]%ó1Œeç>·#n÷£'Gù$ =#eíùc¼Nøù~Fη£¼ˆmþÅÚŽGävh…%®Qd^E”;b,PŒ£/R~¥¸}˜ž‚Š5o,;ð{PlP>3JÏ«€÷j=KüÔ^ãWIIIC‡•8„o¼q×®]:ÝŽÙl¦g-Z4pà@vù„ Øþãlm” 9vìXhhhmm­þfgg———«%HÏ:ºæHtM"çÏŸçI]¼x‘mƒNõÀÜNllìË/¿Ìê§OŸ>³fÍ¢#ŠñvÞ}÷]:A.v&NœHgš;DQpò røNÁŽî“ÕýÝ-:´¨G{¤¯¶º„ýÔ†uÜ2I¦ßËÎMnÇÀ>μ’5æ38ºóñvšAawJ†|Ìnwku¾ÚNgMvr¼K:Öú©•Q[šñ‚K*Ópv†ß÷Ôî÷Fµ‰p|Ÿz5=¥ÖÕ^ãW$V«U¾VïÞ½ßÿ}n§°:gþüùlŸtf¹¨¨èÒåˆÄ.n†­:tèý©]®²²2Z§¸¸X-ÁÍ›7ûúúRqôT‹êl2™ä鈓è´œœœ¬¬,îv>þøã°jyþùçCCCc)/_¾ü†n[›o¾™nÒܹ”””èŸÑ ñÔÆ­â¾½’ñˆÆ÷ì=Âíˆ^Ë¡=üBÅ[âÃ7µ»Gv|¦‡¼N gçòÁ>ŸzäP[Ø­g^ýÉ:ïvtÎX“‹Å"pÿÆ[–Q ŒlW t¹ÛK-kl¯mó4Þ7Œegv‡v÷ÂS;AÒü&/Ôx_ÁøúúÊ,ßwß}‡²ëvD222^ýuf™ðòòbi]¸pá¼+ ,ØŽT7nd³ƒ%̾}û˜¢·µÆÆF~ykk«˜Zff&‹Õ¼k×®êêjµÊikkKKKcgFGG‹)P¹xhJœnïØ±cÙÙÙÌíüôÓOÆ cUqûí·Ó{ˆâ>YŠÛ%ôë×oÑ¢EæN§¨¨È®:Î+6¿§§4æiˆRèH]èv ÄÔ‹æPiqäN¿ˆ5¦­)DË!ª:®=Ò7–[»¤?è®Îຬŵ«K"šÄ…o┆¦¦&1Ø‘þ OzbÅh÷G˜èXl#±b+ð©rÅÌŸÒo*ìº×6·¼Ôbëp‰¡8‹F¢:£3µM²±ì˜3Q[E¥Øìî~ÎïŸnXÌ‘šU{êšø¬x¡Øè.YSÖƒÈËË“XîÛ·ïÒ¥K5ÜŽ"IIIS§Ne)xxxøøøX­VžôôtfZüýý‹‹‹E Ã÷±2™LÔ²âUlÍ”ä6ùëôKss³¤ZÌf3Ûúœ~RÁEMÄCëÐ/‹%77÷øñãÌíÄÄÄLž<™ÕÀ€è%#î“ÅÝNDDÄßþö7ÉþæŒW^y¥3Cëˆ{c!Ì€»á«$øÚ+B²‘|H%n.ù"¾KÜŽC1uù )›¿KD‡¼Æ4”ŸÒÀ/ëYmɱìf£Ý(òæv(̯øõ±bsh•ŠÎ8ÀýAOhk5¤Ö ’׈ݗ•CÓŸô¸6·bÃéoµàà`²kÜ¡ìxͨ¹µ=¹4¢E‰«øýKŠ ¶4LŒ4./‚KA÷8l6›···üâ¾ûˆ¸»ìÛ·oâĉ,…þýû¯\¹’Òw•áill»êª«äµ=f̘ÐÐPsA5‰ÏZ€8EG¢5h0¢¨V²é=u·ãОDŠ÷IÚ÷±aø‡~oÅÂk\e ;×ö»‡C[8-X°@q÷+:ÙÑmÚ\èv @ÍÃ8K ¦Q|h¼¬]ZÕUnG­áìÆW+»]¹áhvŽº»ŸSÇP|ű·D»ÐÀküŠ'22rРAòé ÔÆŒà [¥ÕÖÖÖê4ÕÕÕ¡¡¡|/òõë×'''³]Èr«#7<œ‚‚6EÇßß?..Ž¥]__ÏÏ­NKK ]’+°bÅŠ«¯¾šö‘G ÷ÉânçÇ1b„¼Ó^ýõëÖ­3wÅ©ÎCö#[¦Dƒ »aKéã%[†³eË>¼e{^kh»'H² ´ÇàG.£³¤t«GA»Æžë€~Ñï(¨ºX=ÓO=õl ;^FúB»Qø³zPË‘ŠI…egE0¶·—Ýþc·áí0’¶c­@ÑS¶ÏšÛp]vÃj¢ÕµÍ­Øpo¾ù&{gÐ_VvºŠ­ãÓyoŽf§Ñšò§øëÎÑ·D‡^ªbWw¦Ñ¯0¬V+_R$rÓM7QtºŠOOOiÙ%†‡9™ððpQˆk¦´ïÁf³%''³U]»ví*++SÔDló:ùÞ{ïe>|øÆÅ}²¸Û¡›|ì±Ç÷7Ÿ7o^nnnŠªª*ô|àJÂd2É'ð°ÍžÒÒÒN8NPPÐSO=ÅÓ™2e óÞ’ù3ÎãèÂ"¶RŒ_^__ŸŸŸ¯¨‰èÌÊÊÊcT„iÓ¦ñðDÿüç?y,eÑíÄÇÇÏž=›N×çÓO?œœlîRØd*ôyà ÃjµzyyÉuÄÕW_½lÙ²|CÄÄļöÚk|·ô±cÇ\ê0ø€G§:tèÚµkm6›K Û}ãÆGŽ#äÈ9wîÜáÇYhI"t!7tcùùù™«W¯¾ñÆÙÍ7Îd2eÊÈÈÈØ³gÏÝwß-¯º.^¼ØÜ ¨®®†Ø~ ,[¶Œmÿ$ óþûïgddäeÉ’%ÇW ¶ìŒÞÉÏÏgÛfmÙ²Ål6+–èØ±cìÿÂÂBE«ÓÞÞ^\\œ.öÀ°¾öÚk¿ùæ›t%<øÊ+¯(†Ö™5kV—ìo®(vб€ß‹E1Æòu×]÷Ýwßw???q¿¶)S¦°…ZLòãìÙ³III,0rPPè1ÊÊÊvìØÁæödddˆW‰“XªªªŽ ÄÅÅyzzöêÕ‹…Ö™;w.¥T‰?üP1´Îøñã÷ïßoîÔÕÕ¡K¿AÔb,9Ò××7Ç BCC§L™ÂgõïßÖ¬Yyyy/^dkµ `µZ#""ت«¸¸8‹Å"þÙØØÈÏCë455edd¤ x{{0€ÝؤI“öîÝ›¦Äºuën½õVyåÜ|óÍT9ænC}}=z2ð›E-Æ2ñ裆††:cxŽ=úå—_Ž9’§9|øðµk×R¦† ÏéÓ§×\&((¨ªªJÑê´¶¶²p@œŸþùöÛogwB¿ÐŸ©J?üðÃò éׯßÂ… ÍÝ‰ÆÆFôa¨ÅX&¦M›vàÀcÎòæ›oòxËÄôéÓM&ÓÅÚ‡Òܽ{·ÙlJBë$ „‡‡Oœ8‘e=`À€Å‹'+qèС3f°µZ^yå•.ßß\¤¨¨¨¹¹]“É4tèPÅ Áï¾ûnBBB¶Ó|ýõ×bœŸAƒy{{óµZ†CëÔÕÕ% yä‘Gļ†j±Xè~l6[jjê•+WþéOâ.è§Ÿ~: Ä¦M›î»ï>ÅÐ:‹/î†V§¸¸øìÙ³èp“ɤ¶Uz¯^½^xá…ÐÐУ®&))iéÒ¥Ï<óLß¾})£ýë_yyy±þþþ>ø ×óÅ_Ä*2uêTÅ›ýõ×322º›Õ),,¬­­Åt¸“ɤ6‡‡˜4i’¿¿ÿ7ðöÛoSúóçϾLPPÐôéÓÅýÍ#""¢• «®ºê*ùÝŽ?~ÿþýÝpºNEE¢ëÀ}8p@-q÷Ýw÷Ýwi.å­·Þ¢”çÍ›u™çŸže÷È#F)ñïÿûæ›o–ß!ôõõíž‹°°:‡¼¼>>yyy¿…°Ùl¾¾¾cÇŽý&·Ür˼yó¶mÛ/ÀÜÎ{ï½g2™~øá‡Ñ£G+îo¾xñân¢tŠ‹‹kjjZ[[Ñó€+“Éäíí=a„þýûËÕŸ5kÖÊ•+8pe×C^^ž———ƦZŒ!C†¼ñÆLò0·3sæÌçž{Nñä×_=##£Ë•NyyymmmKK z;peSTTéãã3eÊÅåEǧ§è:Íb±\‘•0}útíµZlŽÓˆ#è—ÿùŸÿ‘?;~üøýû÷w¹Ï9{ö,bé¿Yl6Û–-[æé驸j©ÿþ&LðöööõõÍÈȸŠo2™¨àŠÓ™4¸þúë×­[×ù2§¬¬¬¢¢¢®®>j$%%ùúúzyyý?öêÞû¸ÏÓ÷Vî{[Ë}Zm:hio©T«—:Ü bKëPª¾-©·NÔX‡Š&Z¬C¥¨¨X‹bEmpŒ©hœãHƒQqhœ@Ôr€0IÞ% þ.÷^{íuvÎIÎ>çûyÖÃNö¸öÎÉY¿¬½Ö°aÃÂ=[¶ÝvÛ¢<릦¦Ñ£GÇ>®µÕV[qƽ0¿ù¢E‹ÚÛÛ—,Y²lÙ²U«V­[·Ž;d¥¹¹yܸq;ì°ƒnl¿ýöÅ}Ö­­­cÇŽýú׿vFU¬©€âÐÑÑQ[[;räHó1¥ÿüÏÿü¾ ¾ØgŸ}ºººJ¡fÏž»óοûÙϴш#š››¹=@aÒ]tlvS2dȤI“Æ/½VJ§BfÏž[^^5aÂ,î P˜¬]tÊÊÊF5sæÌÎÎNµÌ¤I“ôëãÆ+©Ê!Û…ÉÑE'0 –ZLW}«Ôj‰lŸ.:ê[z1µb ÖÙèsþ]tL]]]ÇWKöëׯ±±±4«Žlô‰]tLjaÆ©UÔê¥<3ÙèMɺètvvê-”••ù¯U”Èv@¾õ°‹NÀ‚   ¶ þU_—xÝ’í€<ÉIµbYY™ÚŽÚl¶¡PQ"Û9”Û.:ÍÍÍz³Ã‡'ØÑÈv@Ï壋N@ccc¿~ýÔfGŽÙÕÕEkd; ™¼vÑ P;ÒÛW§æMd; +½ÐE'`Ê”)z/555ÔÙˆÕ›]tjjjôî¦M›Æ…#ÛQz¿‹N@gg§Úc¿~ýfΜÉå°"Û¦>ì¢c¥¦wr¤”"ÛÝÐEÉíP² ­‹ Û ÔÐE§˜íP è¢S¬Èv(btÑ)zd;ºè”²Š]tJÙéEí:tÑ Û è¢+² ]tàF¶@¡¡‹ü‘íP 袃ÈvèCtÑA‘íÐû袃\!Û wÐEù@¶@^ÑEyE¶@ÎÑE½†l€\¡‹zÙ=Aô-² ‹ ٞ袃D¶€]tPÈÈv£‹Ò‚lA¤Ù ÄÑE©F¶(MtÑAne2™–z¸ööö¬¶C¶“sêL:uâFê ueÕ‹ú¢è¯K>ý¶¶¶"þÉ-Ù‹ ¤ ]t+áFîĉõ•8ÞQ[¸‘ÞŽú¢¢¢¢©©É½ÙNnUWWË%ЦNª®©þZ]£Ò¬]'C‡-¾S“ŸÜ’½¸@*ÐE9ÔÐРZ¸áf`³µÍ-"ÔÕÕ9V$ÛÉíŠ׿îÔA¶C¶ —ÑEùàhã÷$Û©¬¬Ô몶s]]äE¥¡¡!j]²ª¨¨ Ѳ™ûº—²½†.:È«|d;ÒW$Üp®««“ç³¢V'ÛÉ!Ý{JÕv{{{øÒ3ÞNQŽ·C¶ºè 7[¸9Ïväi,ëÐ:Ò{'êÉ,²Ò½SIŠÙЇ袃ޗól§½½Ýý´Kìd;9D¶S‚Èv€^Fä\]]ÝСCn¦¾®®®?’ÓÔÔ¤š~ê[ú®«¨¨ÐsdKg›@¶£6«–17kíx#O]©-g8èyº>zÌx˜¶c¶:ÍÊÊÊë¹›ÔwÕ2SG’ æõñëuGb­ZËd2úôãQ²–ªíð¨Dê4Í« ¨åÃý£ôÅÕó”骞¸™Þ‹ìTÖ•W”¨Ñd"uÇpIÖV+š5ì¸-ÍS\ÊØë¸EuFu“á}~ˆd~7©XóY¶À \#ŸÛIß-=º‡·Þcz² wÐEùÐÒÒ5;•júšŠÒ ö , ÛªÖ…Õëc°ÈÑ2•ƒ ô’×·Ýv¨¶£ã u´jɾ£Îݬë*z­¬ 9~=jqÔ‘„;AIשðå ToÔU'iQWêÜÚ_KÖ²ŽÏ3uêTù®ÿ(=j­¨v\sØmŸ:ìvÎËfí!Õy¬­­-jSª’­ÙÌ+(÷ø¢Æö ORïøùнuÕ*r d;@ÎÑEùv¤­§û«è¾f `¶£uW iÆê¿û›} Ì–¾þWúö˜ß@ª•Ûøä?=Évä4åÜuß GXarj†vl߉ðñëNæaºˆI /É€y z æÞÍ-¨#×G«»mè×Õ×QWŒ¦÷õ,ž¬HÔZ²#ë0JV҉ˬáÀa‡/yãÉmlÞuáUÌéÀdyóR†3œ¨lÇÜ‹ìÝ|Ñ‘í„#p )–ùóå>r3g3+VjUÖ%Ûr….:èÒŠ4ÛøšjŒK£/*XpŒ·£˜Ö´Ù‹#Ûl'ê™ýXÊ; 0`Ÿl³-ðð‹™w¾%“yY³Åí~¤ËzîÖ« Û Ä&r ýXÌ£2ç”ô™Q‡'û ?ûõø[Ôu—Ñ¢’¥¬âë¦4u²Í@<(©K¸w„'æ*êöŽªsót‘”5ÛqÔ³§De;ºª;2®ÀOŸùCþy‘ƒ œWÔ5 Üðd;@ÑE½L‰QqH3*Xpd;Qù†µƒô]q­{²GSבí¸'§öiìg•íXÃwÌÈ:9I¶ÙN·Ñ«Ä'ó¼Kõâ2ÙwÔ Ãæ5æðÑŽq­ójÉë±ÝØÌ]û¤Ö¾j±•i]À¼d±—UŽ*6Gò9 ”ÑEžíxê…l'ÙXʽ–íx†6Ò³"«lÇ=(MO²¹ÊvºŽ^þO¥Y3"s²@S8¦³W[³&6Q3‰ë\(œ4&ËvÜs 'Ëv|„³GÚF¶„ÑEiÉvÜýv„ÙY%çÙŽõɯkç‡ÌvÜÇÙûÙŽÏÅ Œ9“8Û1'=Ïv(›pšs»ë5uuuÖ±” 9[º)ªº·­QRx"ªÂÉv|.«ŒÉC¶ø£‹Ò˜íd5Qž²ŸÇ¬³ÿôf¶;”PVP`ù<=“•¬óLâlÇ|(Ùx;æ,ó•••áÎ6þ÷­ºOÔíd>É;°³Úx 'µG“5ñsŒðão'Y¶ãywùWÙJ]tR‰›ÿ9Ïv¤3†£§‡ûh{!Û‘ÁfÝÝQr>–²{f¨Ø˜%«À]ÕîÊÃhú¨dódÉaÇ&þ™¤9Á·{¬$aŽÞc^Çð]!½Œû¸çÉÊ*ÛñK9Ìgú69e²”ºè øt®ÐÝÔ¿fŠœg;±ÑMìÔϽíøÌnfÙ¦QCøJsÞó±¸@æàx G÷QQÐóy²ÂaŽõd{O:jO¶@À¢oÔØ»NŽ\•^%öº˜Û ߉D¦9¾tϳ¨iÂ{Ô—Õ<¤ØÈ‘9ÐP:袃b" Þ¨v¢< hK«3܃%q¶#Y„µg…4<£^Èvº=z•Èqú55Y•&‹:ÀøOY•xH_Žp­&Èvä,ÌËg}Ñ3Û±öö1§YϪKU¸w\©¨þ6Ö#qßÖM™£÷<Û1Sš¨ZµÞ¥òsg­"³kÙŠ]tPÄÌ`!КÖý·6÷Ìq˜k%Îvd^õo ‘4Ì­]#tŸv<`À>ùÎvÌ>á–µ§Z7“Éd{ ÂínU·òÝ@÷ŸÑQÌã ¤7æ–õšm¶uÌ|)«'Ô¬„Ú‚YWæá™9UøºH_sóÅp`uFÖ»Â#ȬµÙÀ´V9Év$ÈŠ½ =ëÖ vÈvPd袃R`6ëôTÑ72Û¤ÖDÅ\KOÝÃlÇü–Þ©ú¯9°mT> ‡ºí¶CóítéCRÿUÇiNÌdÍ |Ò ITÂÛ †çÈ·æuÔÏ^)æœPÖ*«lÇìÜîl#Õå9<Ž9ÐÜæ1ËØÈÃ3©ÃÀèWcNÈ%•ã¾å<ï ÍœÐ*‡ÙNàÈ­7Œµ‡[à‡]¯eV,ÙŠ]tP‚Ý!¢Fk1³fk·'ÙŽþ®uöjµý¨ ör¶£óëAêå=;¨Ž_?9eÝlÔC4ž-ñÀ”â&Õ®·>úäŸí¸;̘[sü㸵!FwôzQ7^×úÀ”£r¬·\¶w…ÎE­Ãe÷$ÛqŸl`t¬À6­?ìæð×d;H)ºèªe'ÒêXU;ÚS444èUÌÁxÕvtÿ‡¨‡’bhooW»6Ä=Z‹ú®ÚÚÑGùáóÏvô18¶»€ž_[Æš¶NØU¶#ûõÙ¦ª=}„>;U×1P¥î£•Þ2±;U÷@lEÉw\tÇݨ+Ym_b(Ù`x pµŒ®ÀÀºî}éÊ‘U***¢á‰=Ù––YF~|¬ÙNìŒ]@là&t¹I-#7ƒ¬’ÕºèÅ$Û±” GìèH»ØÉ¿d….:@Q"ÛAŸÐOÒ9zµµµe5â+ºèEl}"6º‘Ñü'‚ 袔²ôíÔ#›CT555I°C§À]t€ÒD¶ƒ¾˜à,0ºL‚FEntÑJ\z³ŠŠ pÓ«½½½²²2<)¹zE½î9;P‚è¢@¤7ÛA1iii™:uªž¾:@ºè#Û€Gd;PȦM›Fd;PÈ:::jjjè¢ Ù@z‘í¤Ù@z‘í¤Ù@z‘í¤Ù@z‘í `e2™–Í äÚÚÚ êxr«Ðj»'ššš&n¦¾.úk×ÃX¿¨~âÒø‘ºÃrŽl«¢¢b‹ØÞÞ^‡4tèP} ÙNb±ÙŽÈH’^ýØ&ÙÐM¶€4„ Òˆ ?hÐÞÞ^]]­Ú}7S_«WÓl555é6£¹ŠÚ£uaõºžV;jSævôsd™LÆœŒÛ "äEu„Ãp¶¦¶ŸÕÉZ×RûÕ«$ÈvÌSˆ:}kEI5¶µµÉZº›Vxs´^½A™[M}¡_‘…Ã×®¡¡AæI·§:Y öy%½˜Ô¡c˪ZÌŠÒ'¸7²¥Î.PKÖ][³¨ûÓü±RGhn_ÔÅ•­é ßá˧ïyÒJ®y<’üÈû€O?9òí½I«‘$GæÌrÇjEsj­À,ØÖ¦¨t²®îÛà蕵)ÕP•GÌ L}´êŨ#:lݰ O»Vx~pYEµ¸d;æ)XÆú$î]£ÖUÇ8q³á︠j³«ãX2êÚ©†¿¬eˆMêÊ'ˆº‚>õï]Z5448n{õÝØlÇ’¨š‰Ú¾º·­w¦ì"00ŽyQÌOz[˜Ç£7«š|;°L±Ží 0IóÓü«½ôÇpt‘Fœj#ËëeE%ÐΕ¥î$#«˜zúÀDe;ì˜{—]G ¢_7Ó‡¡û9Dƒn±š ÈÁ›'k­(óÔd­@Ú Û‘-覷: ÇÞ»jš}¬ÙN¸¿J ½ ?Ã"­àpOÙc Qo¶Óçlv:JíXÓ$µ‹¨~/f? µŒ<•&ᛃ„C*yF/*5²¶÷£r9ëía^Ó¬frôì’Ú׿y¹­=ˆbë?|'X³©¬²©gë•l?°kóá)µb 1#»Àý™íTìþc/B6€lÈ+ih‡ÛkÒŒµŽ "AMTXw7 ­Mi-èN8±-wkG#aö¬ˆÊv¢Fe±&ÒâŽj®ÊŠæfhf +Ì9ɺ£“:³Ç”ut ÉÖÃêZƒ¯ÙNwèÙ+9ìp_¯ÄÙNl8)ñNT„ÅÞ áAȳÊvÜ?q݃œ›ÙŽuE¹vÝå#ÛÈv€ÞçhÞFõ¬hÈúX“»­mm_‡[î>S´Gu_q·å£¶ìŽ’[çQƒºÈîd;Ž8B®šÙýF˜¨P"v䟨ÊI–혹Š9QV]hÜ{‰}¨°;:°Š½¯¢îý¬“ªŠÙŽ<äèèñ"7•YQ±AEÍoE¶í ¸›“îð!0jÏÏù”}&X·Ü}&ÝŽZ&6Á°vFòñXjCêA^É*ò¬CG®%ýUÌæ¿»Òä6p>ãî”U¶Óýù®DɆ¾qïÅs0ð¬FøIp½ü³Gºð¤µGœ£‡Ù[d;(æ“8-6Ž!hÂ3.éÑ_Õ’Q]JÂS;釰=+Â-wékáÈLdGÖlÇ‘!„0;E ~ÚËÚ¨Ï*ýp¡c‚'kK_‚ëÁ˜1‹Ï9šIœí˜·_VFå0Û‰MELòàXV”¶cŽäŽ[c#²€lÅÊä$–µ=5-¸Ž¬‰còqs¶eGËÝ'3qg’,ÛñÈvÜÙBâlÇg¢¢Ùާ\e;f<˜ài,Ç^üCÿ¸&« ¨'ÙŽ²€lè6FáðÕOF½®çh‡6QÝKêêêÔ·¬!O *œlÇݧEH§4f;žçh>Lדl'0Y˜Ï3z¹Ív²êŠÓkÙŽÏ%0"#ÛÈvP²¤-YWW×Mœ‰“Dµ”Õ¦ÔbŽyºTs^?+«žÍqŒ·ãÿÖ=ÞN²l'ÛÑ`úü™,ózyf; Ú쉳™Î¬ÇÛ)Ìg²|†®Ê*r!ÛrŽl…@†Ï Ì%=GDÉd2ÒPõ¥6jlŸpË]ÆÒqäQ“>'Èvº Û1_U‚üÁçcÃw¶ã9–²ÿîÜ©K÷çŸT{—ü0‡ódùÌožó±”ÛÚÚôÙŽ™ñN ² OÌÁU<Eéþ|¿YË Xt³4¼Õ*t¬Å1f‹jEštÉ:Ôë8ZÁ‰³îÍ¢&ˆw [d†“MÇL&c¦^>uåïDÝ áBÙf;îŸs@§œd;›Óý@Ù@¶€¡Ú†º÷‚çø±f“S ´.ÕvTóY&¬zU FGÃ\}K÷ñ‡•¨ƒQ¯ëFmMÏ¢®—‘æsT”{â± ¨s—A¡ådcÇ,R ÈZfýÄž;}ÒÏ …7ë¸èŽ¡’…žÈ>pub·Îg§v-·£Ædÿ®;zËúPU…„7¾jŽ3ò¨%õµuÐf©³æ¥*¢ÆdVǦV4F¢¶ï³5÷ªžuåè>`±õìØQà*óf ²‰Y;K‡Ø®G€|#ÛzH÷dpŒ ’`›;Ùô-² ‡ÜãÉYE9SÙô9² ‡d.¡¡C‡š£²èamd(רapÒˆlúÙÐsæDEæèŽ)·ŠÙô9² '¬SE«W***Š²ÇŽ¦S¬¢|Ü Ò‚lÈ¡–––ºººÀèäÙ@z‘í¤Ù@z‘í¤Ù@z‘í¤Ù@z‘í¤Ù ´´´LÜL}í¹V{{{]]]¶k™»S«·µµù¯ØÔÔ¤WT_¨½ç¶ô–óZcêd§NªVQÿfUc¦††½…´Ü]9¹jz ™L&O©êsèС>Kêsñ¹IôÂÙþ€È ÙJ™jhWVV8p‹ÏS¯TWW»WT­àÀŠê¿±Ùˆjê†w§6›ð¨ã ïN|›öz›yª±†††¡C‡ÖR¯ÔÕÕeuœª¢ôÞÕºY­¨.Í@o>G¬L&®+}Õ²MxÔ*zõü%$úê¸/¢Ü'ŠûV·^nŸ í d©f²Ùî–v½™<¸ãëZ޼EZèáÕŽf»ÙLö<ÈdUáÎvטãÄÝ5樊ÙÎÞz^«æM’í娫«“íä/ÛÑÇæîcž”#¥Éáåàƒl%KÚ›ª!o6iUSZ¾eí¿!ñ‚ÙÃ\ËÚìmhhÖ®tVÑÝ`äuë7ÕÕÕáãT_Èaô°“‰™Ø¸³d5&'¨™ØsTE‚øE?sä&í¾ËÌ ¤®—Ûg;j3ÉS¶£ŽÐçÌ*Šºd9¼Ü<‘í 4I/kD`6¨=dÅp÷³÷Kø¡ùV¸y.íýð6u£;ê8¥­í“Mfâè^’ós¤g¡@Uä°Ã’I‚£žw,‘ž6Öƒ”ËíqTTT˜g§lG’;$ t|Š:x¹Üá‘ä zæZ<‘í 4I5ÐŒ+hé;Ò³ýhùJc?*7ˆŠ8$°¦7ÒXNÐuGd¦:îFw²sgSfvá~(“ÉèaŽr›íHo“œlVò ëI© ôÜ—ÜNRKyÊvt•:†§6ï4G¶#_Ôäy¹d…l¥)6ÊPèpܧUnÝrlÛ\:2œØãÔ1BTÖÅ™Y}!#߯f;ÙÖ˜~Ê1ˆnT 3.µÄc);Hpä™9´lµ€ zR™ÝÆà6êbI-å#Û‘»Ú1 ·¾=Ô¿r•­×Ëz$¸Ü²B¶€Ò¤çev «•TĶL­aKl[^úE˜^|¢¤¨PH†—±ö2ÇêÑÇ›í$«±XîŽIšôzÒ˸³UiúÄýû2É1¸‡ÙQ×(09šžQ+*Šš¯<¶sK N1#‘¨lG‚>ëpß÷Ðí1E𬹳¹c£¶æs¹d‹lpç fD -SGï‰M¤.myGèa Fä™CTG÷ð8:ú0Ï"6ÛIVcnÒaÆÑïHjO¢ weJMzž‹ç 0æ0ÎaY½ì²)°;§t{d;r×…#÷н¹SYÔÁÈÓj:5rg;ÝÎçÑ|.7€ÈvwÕì`Îm-wéAáÙ¡%Ü—ÃçÙx Q‰úØz¾=Év²ØYƒ¬âÈFäÀ¤Ln³ÇØ¿áÊÔHSS“~&Ë ||v']¿ù†Ä)rÝóší8f?—`Mî®ØlÇœÎܦçåÙàhËò¬²iüöN¶ظjV맨‘…5BÉmYà µ°ùp“£ûŠlÖLNÜÙN&“™¸Yìa»'´ äÖØÊs úq6sŒ£¨[H:·˜ŒÍvt­*áˆÆ}'¸g?×]zÌ*6Ûéþütç2¿¼Ïå ÙÕZwÆð @ÙŽ;mpd;Ž()Ù(7a=Év5ušf7˜¨î+2Cz ›GÇRöék;7zì@ÙÙÃõàÕQ»“ÁmÌjÉßXÊú쬕)]ŒÌ£õ¼™ÍxÇi$$1»%Ķy­%|‚y|¦‡‹¶“UuoŒ­Ü‹Ee;ž’e;þ£è$oG…»_JT¶ã©çÙŽ®çpÿ™À¬^±äæôÌÁ|~ˆd…l¥LÔžs÷ø<ebꑈ&0´Nl°à3UÄ&ÙÖXìüàæ¹ëÆ~&“™è$u"¯$‹5<{ãÄ^=W»Ú”ÐçAmSk‹Þ¢ÖŒ$؉êÉ AúÂ\ÀŠèg—CÝÆÆQÙNOjLŽ3pâª&ÍɶüŸÐqg;:9q±ì3“õ¨šÇ©V·Îf®^7«ËÜTCCƒ|Ë?߈ÍvÔ¦¢ÆX¶Þ Q³ŸÇrg;ÝŸïܸ¦ìXN‰‘í Iœ’ÕP±fóÜÈwèFÒ`wô'1ÇË ¬åèÂaæ*áÝEõ‡É¶›;Ûéa™'>…l‚ŽÍvbÇXN0<²ûÂ#O]ErVýŽb³9ÞJMSSSYYŸPú÷ï?eÊ>äJGccc¿~ýø €b2iÒ$>êJAsss Øù¿}ñë?Øeç+) …B¡P(”´”oî0ä‹ÿþ¥@¼S[[Ë~@qëèèèß¿¿ùëïÛ;9xü¬cÿÖL¡P( …B¡¤«9åÁ{ˆwšššøØ(b£F2ñm¿×A'\÷ …B¡P( …’–rì•|úŒ_5µâ”F]ö zeÏÃO3?â4¨««‹Oþ€¢ÔÚÚjþÖÛn§=NªK¡P( …B¡¤¥Œº¨q¯ŸœU^^%åà?ܨ^ßåÀcxP ,¿ïþã+_3푱7>K¡P( …B¡¤¢T^ҸǞg”—Wsõôé÷O˜0KÇ;‡žz£úîÖÛý@>ëöë×YÑŧ±±Ñü[Æ~¿;댛Z( …B¡P(”T”ªç>¾¼¼êœsêÖ¬Y§?âΞ=W½²Çžgœpé}ÇLœa~Ü­©©¡ (2#FŒßt_ÿÎögÍxŽB¡P( …BIKùíéuååU#FL\¾|•ù)W÷ÞÙ÷  Õ2?Þ÷ùÄ[VVFPL,X`þã×cÆŸwK+…B¡P( …’ŠrÎŒy?ùùÙååU>:?ðAwùòUp¾úÖØ¿>râåõæ‡Þúúz€¢1nܸϞ>þ/×Ìœ{Áí/P(JOʹ75¹dfVåÔ+ÿé¿}½ŠÚ Uí¾ ûþöUärÄV²ÿå%¯„WìÉmÀ…¦P(>å¤Iw——WuÔeÖϺW]uúî¯ü‹Zò»;î&Ÿ{GŽICP4 $¿ãö:èÈIw¾H¡P(=,ûñ‡-²4à‡?¶nê÷®¼ròäYzµ—R®ä?]ÿðøO;øÕïÿ¤jékߨ®jêݺÆÔ׎åe±Ø%嘋©¯Ã×Q–Lpp¡)ŠgùÕÿ^^^^5{ö\ëgÝ>Z¾qÔ3'Ìhyú%æˆÊL†(²ÆL¬½´á% …Béaùå‘§f›í|w‡]ùã´Ù?²Oøõ±—ߪWQ{)åþÚ7¿£ªÂ±Œª=UKÿ³ßoÔ×ja]iŽU*N8Û¼"Ž%åú«%/ê]®—\¬·šB¡ø”?ßòÜ{Y^^iÇ4fÌÕjS'Ý}ÑmóþÏ·”÷œÆÆFš€"P[[+¿Ýþý?¾ü—Ù/S(JÏËAGojûoýÍï|o‡]|ÊýldëYúVàõê+65ùÕ^J¼zUU8ÓxʤÔתzc+mç=ö5c–ŸÿæwQKª‹¢—Ñw\/¹Xžw‚yp¡)ŠO9uâ]zÞsÇ'Þ;–9ìØ«Ôòßßiwy£=z4Í@5j”üv²_ÅÕ÷¾B¡P(=/¿:f¬~cù¯wI¼‘m6fá-Œ»ò6½qµ—¯^UQËŒ½èµ€ªCýßQÕëU﹯»Â÷üÅÁQ5XR6.×E•ó§ßk½XÉî½Í)w´ð3E¡P¢ÊÑ'M//¯š9ó1Ç'Þöö%j™}~q¾ZþÀ#Núì9ÐhŠ€9ØÎïϺìÚû_¥P(”ž—£6…ßÿÑ®‰7²Í·¾cÝÂÙSo×W{)ñêUUµÌþ‡kÖÞä™ëúTÿZ—¯š|£Þæ±g^üã½öÕKªµÂKJýû\ܬ¦P(”å€ËË«æÍ{Ãý¡wß}ÏQ‹ýõ®νús³euttÐ"¤ZWW—ù«íÏo¬}°B¡Pz^>ö4ýÆ2ðG»&ÞÈ×7fá-Ô\}§Þ¸ÚK‰W¯ª wí™U¤_Q&ÕÞ^~ø¡•ê[j™)·Á ëª ágŠB¡XËäé”—WsN]ìçÞÙ³çª%+Oš®Öª8r´¼÷Ž9’F ÕÌI²ö9ðÎy‹B¡PrRŽ:¡Z¿·ìðß»%ÞÈ7·`ÝÂåÿçg}·0qê ó»ê¿zEE-i~넪ñ²Và[ªì÷ÿÓßU_8vwzÍåúuùBUS{ ¬.ß |kÚ¬‡å[æÖG®©ÞðY˜ÇÞ¦Ú”>‹Àë{üô×U5ê]¨}Y*¼qëõ’ÚKp'Ⱥc P()^ñé“V&ÌŠýÜ;oÞjÉß¾F­uêÙ—È›ö°aÃhŠ&Û9ì˜1÷>³€B¡PrRŽSmæ!±eÏa¿oDg;þ÷nׯ¼ñ³°å¼K§‡Wüů×ßU‡Þ rÑ´™ÖÃÞñ¿7õ–™~Û#ÖÝUŸ?ź¢l9°G]ÔZú»sQgíXË<‘Ïo­^uláµô«C ëà#~o­kU[_ÔǬ¾uÓ=Ïø\/³öboƒ¨ U? …rÞÅõååUÓ§ßû¹wþü…jÉø\­uÚ¹“å­iÈ!4 ©6bÄù½vÔïÇ>øìB …BÉI9öÄ3¶ÈÆïÞÈ·¶ý®õ[Wÿãn½–ZÀº÷q6e)ê0äÅK¯™¥_ÜkØ/¢û”3'èe=òxÿÝÉ¡ªoiœþníMÖÓ”µ¢6µ¢T¯:¶ðZê࣪TÎÅz‚êôÍ…Õ‡uQ¢¾%®Y×¼Ž …b–³ÆßZ^^5sæc±Ÿ{ÛÛ—¨%G<Éü  0€F Õ† &¿×Ž?å>÷6…B¡ä¤wÒ¦ðáÛÛ}w§Á»Ç–GÞˆZWmA}7ðúµ7ÏÖ+°€: yñð£¿(uõMá-ÇîNUýë^ÀÜÂ×Þ»Ù¨-Kõªc ¯²ÓÆLF¯ç‘Hͨӷîåì ¯ÔuãÖë%µ{'ìý³_ø\G …B1Ë©gÜP^^5{öÜØÏ½Ë—¯RK?`¼ùL¶(²lçO.òùw( %'åø“ÏÔï-;ÿx÷ÄÑYAx ×ϸwS(}ò™Ö­ ¨íÈ!9Šþ»sªc©"õ-ÇñèuáuÍû²~KêÁ<Áð+?¨b¤~åô³.Ü4Àòu·zV‚l$ÁàSó ¥ÄËÉc¯//¯š3çUŸ¾jIUÔZêMÌì7H£jC† ù,ÛÙ­‹( %'ÅÌvoD²‚Àë×͸GšüÖ­ HnãCíÚwŽCu, UäIFx]óE]νðŠÀñÊiã.0×½ëÁ}luزµŸü|¸cãÖJÚKp'øÔ<…B)ñrÂIË6ÛQk]9ý²@QöÛ9©ê¼Gæ½M¡P(9)•›çÙiðî‰7"Ïø^¿æ¦M꨽XW´. ŸTÒŒ-Cö ÿÝ9Õ±@e–­ýãΦðºêØ;:`ħÃ/›Ç(j;æéœuÁ›¦Üºö–ðÂj;úo»ÿÙØÓ´~Wj/ÁàSó ¥Ä˲&K­u¹ñLVYY@ª9ÒKù¹ ) %'åwcÎA€oDÆæ ¼~Õæ!vÕ^¬+ZøÑælG}7«ÃˆÝãP H96[½ásÑ;:ùŒ ž;|ãT\êë’¿iTêÉÓfýýöM¡PÔÆ­• µ—àNð©y …Râ%Û±”üÕ…j­ó'_Ëx;€¢aÎþÛãN½çé·( %'åèÑÕ2ëwâÈœÚ×ÿr橱Õ^¬+ZøÍæé¿£ÖŠ*±»sªc‹®ž‘¸Š¤zÕ±™¯_{ëÃzªñºÙO;Vßcó<æ±G®¶£P{S=~Óη>ì_ R{ NÓ§æ)J‰—ó.º3«9Ð;ârµÖiç^"Ÿ D£jãÆ“ßk5ú®§Þ¤P(”œ”#O¨Òï-?Üy·ÄÑYAx —ý½Ao\íź¢uÓλ,ö.œ:CíT-0ä§ûûïÎq¨ŽjÿÙ¬_TÿÎzh¾cEµ–*æ2R½êØÂÕ®VqW¬® µ˜Z]ƒÏ©í{Ðaî[+Aj/ÁàSó ¥ÄËWÜS^^uñÅ·Ç~î7ï µäQÇMUk>ãù 5O¡PJ¼L¾þ±òòª1c®ŽýÜ{ÇsÔ’'ÿñÓwÈ=~¼­7ŽF ÕZ[[ÍOì×7¾ø‡Û( ¥çåÊÓ¶ÈÞ„iwšùÁvý,øÖwÔõëj1ý¢Ú‹uïŽ~úËCÌmpX¥ZF½¨¾–×Ϻ¼ÎskRôêr„þ Œ>k²y<êHÔ^ÔQ™ÇÞ¯:Bs-UÔvô‹êkŸ dÖîC÷s/,£¾¸òÖ'³:G©=GåDŸš§P(%^®º½¥¼¼ª²òÊØÏ½W]õéÓ[§üi†Zk»ïÿPÞgΜI£jf«ªfZýõü‹B¡Pz^~ó»$ÙÎyWÝanä”ñW݈8Ô×úuµ˜~Eíźw÷êEs³¦?ÚõÌÉÿÈjkºè ªÕ,8M“zýˆ“ϵnp |écÛ{ø!îc0ËqülQõµ{aÙ—{ãÖs”Úó<°lkžB¡”x¹öÞ—÷Üë̽÷þãš5ëÜŸ{Ï<³¶¼¼êܿܧÖú¿_ÚJÞ›››iÒ®¬¬L~µSõç¿Ý÷*…B¡ô¼T]rãˆQc³-WÖÏ lgÂõûrì÷wÜUõ…^@ý«—W{±î=vKf<þ¿'«7»Í·¾£þýñžû{æÅɶ¦Š^@m3ñjïêäxTQ «ãtT²Z@¯¢þ=ñü«ôºŽ]XÉZíQWSí%vƒÚó?°¬jžB¡P1±¼¼jþü…î½ûî{ŽZì²Ysÿ|ãCf6ÞÙÙI‹vÇ—_mCö­˜zÏ+ …B¡P(JZÊQ'M//¯š9ó1Ç'Þöö%j™½z–Z~äIŸf6xð`š€"0mÚ4ùíöïÿñå)w¿D¡P( …B¡¤¥üab}yyÕØ±ÓŸxõ@Ê}¥Zþû;í.Ÿ~ÇŽKsP,X`öJ=mÊm“ïšO¡P( …B¡¤¢Lœ5oCî,_¾*êï˜1W:IÖõnžó¾¸¥|ô­¯¯§9(ƒ–_p?ýMåŸï|‘B¡P( …BIK9ðÐÉååU³gϵ~Öýè£å{ïýÇ=ö÷6Œ† httt|n"Ý?\tî¬V …B¡P( %åì›çýäçg——WÍ›÷Fàƒîš5ë8àüOȺô¾Sþzù¡wæÌ™4ÅdĈòkîëßÙ~ÜÍó( …B¡P(”´”ßžVW^^uØa¯Y³Îü”{ñÅ·«×÷=èBµÌîÃ+ŸxËÊʺººhŠI}}½ùWŒ}wVU] …B¡P( …’ŠrÚ s²oMyyÕ9çÔÉGÜG¯^Q帋î=êÂæÇÝqãÆÑsDåÿû•¯÷—ûþpó …B¡P(J*ʨ?ߣ“œ±c§Ïž=wÊ”ýߊÑ׫ïn½Ýä³n¿~ý:::øü(>æß2¶Ûiÿþ …B¡P( …’–rÄùwíõ“³t¤£Ë¯O¸N½¾Ëǘtkjjøð(Væ¨;Êö<ð÷ÓŸ¦P( …B¡PÒRŽ™òð¯O¾a¿C&ÿ¿ã§1ñõʇ5?â4ˆ‘vE¬£££ÿþæï¾oí8¤âüY£®i¦P( …B¡PÒU~{ùƒßßãÀ->¯©©‰ý€âÖÜÜܯ_?ó×ßþí‹_¸ËÎTR( …B¡P(i)ßÜaÈÿýK`§¶¶–ü€RÐØØˆw€´›4iõ¥£©©©¬¬Œ(ýû÷Ÿ2e ò¥¦³³sܸq|@ª1‚Ï¥Lýlll¬©©>|ø0H³í·ßy«­¶UÿRP Ô'Øúúú ð‘(Ó§ß_^^¥þ¥*R‡l ½ÈvÒ‹l ½ÈvÒ‹l ½ÈvÒ‹l ½ÈvÒ‹l ½ÈvÒ‹l ½ÈvÒ‹l ½ÈvÒ‹l ½ÈvÒ‹l ½ÈvÒ‹l ½ÈvÒ‹l ½ÈvÒ‹l ½ÈvÒ‹l ½ÈvÒ‹l ½ÈvÒ‹l ½ÈvÒ‹l ½ÈvÒ‹l ½ÈvÒ‹l ½ÈvÒ‹l ½ÈvÒ‹l ½ÈvÒ‹l ½ÈvÒ‹l ½ÈvÒ‹l ½ÈvÒ‹l ½ÈvÒ‹l ½ÈvÒ‹l ½ÈvÒ‹l ½²ÍvºººfÎœÙØØHÕô¹¬²iÓ¦•••m±Ñ Aƒêëë©@€>ä™íÔ××4h‹!C†455Q}"6Ûinn6lØNÇomm¥2z™#ÛY°`Áˆ#¶ð6jÔ(µ U Ðk¬ÙNGGÇØ±c­Î.ƒw¼µî¯×]=éÛßúFø»ýúõS+ªÕ©X€^Èv:;;kjjúõëÎm¾ý­o\wõ¤w^{JJÍŸþ°õÖ_ /Ù¿µ‘®®.ª ¯ÌlgÊ”)2 –ië­¿Zsö©ï¼>'\ÞxéÑÓN©Üj«/…×R›R¤†òGg;'žX3`À€p>³å–_<ý”ÊWæ=øîëÍŽ¢8nÔájáðÔfgΜI=äCuõä/}éÖ¡uŽúíoZ›ïy÷§=‹Zø°ƒ´njðàÁL•C¯¾újÔ4XÃ÷ûéc÷ßòÞO'(Üýµºu³Ã† cªt€êèè=z´}¬ÿèöÓÞ{󙵑=Êw±îbĈL•€c¬m¿ý믙üÞ›ssXÔ¿ÿ_¬ ÏèÑ£™*À_Ô4XÛlýÕñçœÞþÖ³y*S.©ÙÆ6Uz¿~ýjjj:;;¹4õõõQÓ`Uzü¿žoj«%¯eÁ«sÆŸsúV[}9| ýû÷Ÿ2eJWW—  ©©iÈ!Ö§¢Ž>âàæÞß± ¥×JÛ M§Œe*½¬¬¬¶¶–ë ¹¦ÁÚØÝѱ`^Ÿ”æ>pô‡DM•^__ϵ¥Ì1 Ö®?ÞéŽY×v,|®ÏËÜ'gßÿgQS¥755q@©qNƒõÍÚk/_¼°µ ÊC÷ÎÚsÈnQS¥·¶¶rM@‰ˆžëkÎ;cñÛÏl™qãU?Úa{kÂ3jÔ(¦JÅ-z¬-«OýÚKO¼¿èùÂ/›zѶßþ¦uªô±cÇ2U:(>Ži°Ž9òÐùó~Ñ é*Ôœ±ÍÖ_³N•^SSÃTé 88¦Áúå/~þdSÃû8ÒòÚËOUŸ6æ+[}Ù:Uú´iÓ¸ú ½Ó`í¹Çîõ·^ŸÞTÇ,óŸ{äøãŽÜrË-ç9`À¦J©ã˜kà÷¿{ãuùàùEVæ5ß?òÐ_[ƒ¬Áƒ3U:H…®®®)S¦ôïßß: ÖäIç}ðîKE\¹ÿöŸjMx†ÎTé Íœ9Ó: ÖW¶úò§ŸøÎ›óŠ;Ø‘R[í®»ü·5á9rä‚ ¸U@AijjÜš`0|Ÿçž~ðÃ÷^)å2ù¢šm¶±L•Þ¯_¿šššÎÎNn!Ð':::FeMuöÚóïžõaû«UÞ]ðü9:=jªô)S¦tuuq;€^ÓÙÙ9nܸˆi°¾÷Ú©uü‹(o¶Í=õ”ã­S¥<˜xô×4XÛ|íÒ‹Ï'Ãq—W^xò¯×^}}=wÈ«Èi°¾²Õ™Õ'·¿ýâ’ÅmŸòô“ø¹AŠjkk¹Á@ž8¦Á}ü¨W_|jÉâ×(žåã®_¿vÅÇïï6xÙÈ+×4X¿Ü¯õÙG—,~âY:?X°nmתK_j¾åþ›ªvþá¶d; OÓ` ݳü{o_úþϲì÷֬^ѵbéÏß÷ð-g?pód; O\Ó` ü¯º¦‘ÕdUV¯Z¶rù‡‹ÚžzôŽ Í÷àŒ?’í€|pNƒµõå“/èüàMŠY•ù(ÓÙñþ¢çÜsÙ÷œýЬ?‘í€ZHñ,Ë—¾»~ÝêÕ+—½öÜìÇïšøXýd; O\Ó`í5äÁûêÉj²(K­[³rõªe _}lÎìKŸhø3ÙÈÇ4X;í´ÃÍu×~¼ämŠY³:³jÅ’ö·æ=sÿ•OÞ}É“ÿ¼ˆläƒc¬¯o³õÕS/ûxÉ"ŠÙ8¹ù¼ûòsM×Ϲ粧fO&ÛyR[[[VVfëüsǽßþÆÇKÞ¡x–U™6lødÙ‡o¿øÔ̧¯h¾w ÙÈ“ÆÆFë4Xý¶ÜòÄ1ǽ³à•åKߥx–•Ë?ØðÉú•Ë?|õÙ»ž¹ÿ¯Oßw%ÙÈ“ÖÖÖaÆYL>ä7¿~éùf²ÿ²bÙâõë×v­ì|kþCÏ>8mîW‘í€×t=ÙÈ·ÚÚÚÏOƒõ•ñ5g´øíËS<Ëê•Ë6lødygûk­÷¼ðÄ?žüF²Ð;Ìlg»om½èÍWW,{ŸâYV­Xºá“õ]+:ßzé៺ù…'o"Û½ÉÌvïø½Çn¹pù’÷V~ü>Å]º2K>Y¿níê•ï¼ÞüRó-óçÌ$Û½ÏÌvv¼ýãw^ôi¼³´}åò(å£OÖ¯]Óµ|ñÛ/¾òÌí/?}+Ùè+lg^ÓõOÔ_¼1ÞéX¹üCJ ¬[»zíš•µÿëµçf¿2÷N²@”¶¶¶––õ/U ÜÔ©S‡ÚTTTLܬ®®®½½Ýs;æG õµ~Q}7«£ª¬¬ÔÇì\²Ý]‘e;Ï=Zûø“šfœÿñG‹Ve>¢è²níª5]+–}¸ðÍøWKëÏÖ“íäú1¸‘ú¢ LUà½eàf9Ù…Úx‚­©wZ½–ú‚_Lf5ª–u7«~—UWWËý©oQõ+#öw\SS“úÅd®åy¥ô/&YQ—ÚTìZ‰wçIýZÿ 8Ž$p juŸ]ÈEÔ§à³VÔ›I¶ŸrøŽ¡Þ±Ã*’]âÛÀ§A±…‡ØO¤²ós¸úZ¿˜í‡RõiGï4Ù¹”TãÈší´>vã“ —>ô?u.^¸*³¤ÄËÚÕ+6lذbÙâ…¯>öÚs³ÛæÝM¶“WêÂ|÷(¨?yë–Z qÒ/æ*Ûáí+‡ÕøÒCªY­¯µõwœ£m®VŒZËqxê[r•••îãL°»¬.ë‚5a‹úT Ö:ýgl×rÿ\ôIJ,þ£U‚³K|ûä0ÛQ?Èv -Ûyþ‰ºgî»ê®+[¼ð…®KJ³¬Yõñ† Ÿ¬^¹ì½7Ÿ}ýùÆ×Zï%ÛéªÝª~}š±d;d;½“íèÛRÚàºWj ¹mý'—F-©6¢W”ÃS/ZÓËL&#[–Ýé®8d»KV·îÀÄÜ©tå5OÁz0扫/T '>3%î“lgêÔ©ŸåÄg—øöȶA¡ÿÞ¦>l˜Ÿå¢>~XŸÉ"ÛéÛlç…'ož÷ðuÿ¼êøE¯<ÙµbiI•5«>þäÓy°º¿ý›/>øÆ ÷“íôr~¢XÈaf’«w<%ð„ÙNÑg;fJþ&ýdÔU <£~£Éí8i­[cùn ÃQ‘ß§ µïÎS Ï‰cSfÄ8’L&#ýyÂ[0S-iý–çVž‡š?ú4Í+˜ììß~ɲÇbêóF‚?º‘íôy¶óâS3Ÿ¼îÞ¿üú¼{W¯ì,²lÃ'ëÖ®Y¹dño½üÈ[ó"ÛéMªå¢ÏqêÔ©Òf)ð!°ÈvŠ>Û‘,"êV”†y`YÑúG ùnàeõ+Òñ‹UZúáï&Û'ujg‚¿÷£"¦Àç•ä!&õo úp¬å¸"fß§¾zgÚN|v‰o?€œg;Ûžt#Û)„lgþœ[^|jÖ}µUsg_µòãW¯\VÄå“uk×­]½ì£·½öÔ‚W%Ûé«&¹þ´»…K¶ÃÛW¯e;±—8*oq¯(k~'Jªõ”4ö!@²ÝÅR+š#çH_ܨLùÝíøÉ•s4ïXý“ã‰3ϼ·¡¡Aó(çtm›×"ñÙ%¾ýò”íÈÇÏžÃálG½â3÷V q¤–TËëŸó}GjSê,ä¹ ÿ ÔŠz­B› Õ'Ûy©ùÖ—Ÿ¹ý‰;/ºoúØÞm+ÊTgýÚÕëÖ®Î,[üÞ›sßþ× _}Œl§÷…Çh•zTOyüÓ±ÙL&£—±þ­\½9è©g4ÕìrÌ;£·“UƒZ¿õé!5Ìi£Þ o_ú±V½¢c-Ÿ·/óLÕ1$ž^'P™j;jkr„>ÛTbÖ¹ç£Ú²¹/U-ŽFÙŽÏ=¾-ݳ¶YÓ ù•ç3Êzó˜ §u-I ÌËxwÝ›§êŽú1‡ˆÑuîLô,ZîYÛ¬w¬Ú»þa ?næŸË˜6:ŠÍv÷ƒã[î“ ÆÜo²³K|ûä/Û1?o>˜É¾Qc)‡g ÑÃ3Z?úš£ðÔê¿Ö?ù¹?4ª’·¶:õ¨úŒô]Y¥¯&cía¶óÊÜ;Ÿ{ôÆ»þRùÊœ;V¯ú¸hʺµ«»»7t­XÚ±ð¹E¯ÍYÔö$ÙN_ ÿÙ:ö/Ý>™D-£ßv¢æQÕÈõqQ»ˆz+·/մΧc­ ÷Û—: 릒͙®ÏH¿-‡Ï.ªê$ˆš$(êý\î kMF½ŸGe;òk%A?+ÇáY×rQL¬Ç›ævwŽ_ÍrݱôÏ»<÷äÙÅÈZÛrË…wç®1Y ‡g—íí×l'jy÷r|Ô 4aÂ[ ÿùX>ì(ކOg;¯<{×Ësë¾éœ¦ã3ËÞ_Óµ<ÕeÝšU6lP_|øî+ï¾ñÌ;¯7“íô-iÒš­w;WÆçɶ¯‚ùæ0Ô`þ´†ß ²Êv$˜ ìÅôÊÛ—ùE`Åðû­ãíKª(°5Ï µ£êSÞ–eºŸÀc;Ž‹u^QóÅ WcxwùÈväv2ßÞ}‚YQ‚GŸvºuòd»óI*ÌT'«lÇ'ÇðüGîÇ~å‡NúÆôI¶cý¼çg—Õí×l'ês”;Û‘F|L2gë$3¿êš£A†ûY_—iºa~T3ÿîèemž©LZªC(¨™,²Ív^mù翞›ýì×Ö_ñ»EÿjNiª³vÍŠ ŸŽ˜¼zéûo¶¿Õòޛϒíô¹¨Á@$1ˆú ¸gøc¶zäEk˜`Æ>‰³ó}#œýš±O õÈ1SFMõöeΰèÎav¡Éªw#TQÛŒ:k™Â)¼–9ؾcâ$µz 0«1pvŽlGÂù\ݺ橙×Ë'l _8Ï>á».Ùîä§,ö)ªf;rá<¯‚ªUó6ˆ:A¹æ ›í8îùVxîÓï0¹=»lo?€ÂÌv/„?¦š£ðße”Ũcèuü%ZZ[­™ŸíŸÅ ?Ûik½÷å§ëï½öß:qùÒ÷֬Τ§¬Ü°aýúuk>^ònÇÂçÛ¬š3ŠfõQÇÚt cèþœuk±Ÿölçµçï{ý…ûŸ}àow]qìü'nY³zEá—O>ù4ÕYùñ¼óÒâ·_ Û)î4iþX£™N+œ[]ÑÁ‹O8¶¹”8ÛQVýèPÔlÕú¶N¦cÝšÏDc &šw_ŽnÛG>o¤Ö/*‹M{-Ûqô8ò™òÌ‘í¸ãG¶“Õîz9Ûqô=sßlro¨µ¬ÃøÈ¸-û$ÛÑ;uŒõíÙ%¸ý 0Ûñi‚Y{ÂGý Ìúô‡õC¯twÞZZÆ6ìa¶óÆüÕ×Ý:ñ¾é§½¿pþÚ5+ ³|²~­*«V,]ÒñÚï¼ôþ¢ùd;Å=f²´Ú¢Þ ¢z,Èul#+çÙŽÿ›§5ÛqdÂîqtÍ­ù4ä¼SÅžox§Ø1±[ŒÙëNÈ­ïlÇìdåùl'ìx®«.®žŽÊL[}øå.¿…ÿ©{?ÛÑWÐçÏ:žg—ìö(ÀlÇñ)T}á¿Øº?â†?[?ôšc}´D!&Ì­yö«/‚lçÍ—~ë妗šo¿ûêçÞsõò¥•ê¬_¿vÝÚÕkºV,ýà­Ûÿõá{¯í wK<¶œ´îOüS=£±ú1L‡—ÃlG¹Úš:BÝk(j௾}™='FË6›2'˜öÌ‹<#…ðmàslÖx*ßÙŽ9‹™{èÄÙŽ{\ÜÔe; ‚GæwOïg;º’³ÝcÔÙ%¾ý 0ÛÉvdHëC÷=lù°f;=ü–lgÁ+-|õ‰gî½úÎ)ÇÌ»zféâukWõmY¿~u÷† ëÖt-_úî’Ž×?êh#Û)Læx¿#8æ®êŽxöJžHŠÊWÕ~u’㘦¼‡ÙŽ:0Ir¢öbÍvúöí˧]ŸU_ ÉÝPyK/æóLYw&JÌŒ)-륜ïlÇœ/²'1‹Ä8æ³Wú¶‰êîÒûÙŽ¾ ¦¬²ž]âÛ ¯ÙN²9ÐÉvÒ’í¼ÝöÔÂWŸ|úž©õWÓüÏ¿|¼äuk»ú¢¬ÙðéˆÉk3Ë/}ÿMUÈv ™´è{AèôÀìØ5Ýs mÄJêG^•ÓólÇ|Î"0÷·ú–{,åܾ} ô“¿lÇ3i‘~˜z1ÿçÅz3Û ÄŽÑQ|Ž!…öZ¶£>Pµx ÛYôZó;¯?³¨­ù¹‡®¯¿bÔÆ„çÝuëV÷ZÙ°aÃ'ë×­øøý%‹ßø¬í°pãËÑF‹<'<×¹£;9ãpEE…õÂ:‘VOÆR6§¿Ñušý bÇÛÉáÛWnó ½wG·„p:á9bsá?“%·™OLá3Ü“õ8cÏÚ=æR¶»Ëk¶c&·9ùm¸ÕÍ))sÛ?­'wH⽸;Veuûä/Û‘žóáQŽ·cýÓ|lãÈÚ‡ß=ÞN¶c±G¶sßíWÞ<ýÂÙλoÌ}ï­–öϵ>rCý£æÔ_úÞkÏ®_·&¯eÆO>Y¿våò–n s…l§0Ik%ö=D~Ø£Fz1[ÄòœWøPþПàiÿl'v–çÄÙŽõI%ëÖ¤ÆüçÀÊI»><–²žûA•dÙŽuÖõ|d;Ù¶¬Ãy£OL×h´êžì.ÙÎÿoïNન÷ÿ÷øßÄR0×2­Ô̲}/+ošeÙÍ~Iv[mµÍÓ\Ê2[ÕÒRK\Ê‘D…@sW\A@E@„# Š(› ²Zþ¦¾wšíÌ9ày=ŸG;g¶3 ÃÌû|çûU†¨Vþ†JŸKúí6]N7Û1o¦}Þ³VOhòGÖ=G9ñév€{f;â2O;±y¶cr£;ŠŠÝfÄ5’rÉæ͘lCQQ‘èiù\Êv‚ýÇy{7ññnzÇ­×íX?ß¹lçhÆžœÌ„„-AkýG†û½¹wÛ’âÇÏœ)wmU=€UY^Z\Xpì@þÑýºE¶ãž”Mã̧TŽ‘­û«-‡Øl6í#ZýR‹[Bç²£ŽÅtχFc •£;xŸù0&ýKk³8t_oòÑ´c [yÎHwœt±7LZoêîI—g;Ê;k‹Q¿î—vcº³ö'ÔÝÃ5Y]-e;Ê`ÇâOÁÊ—)b‹‰e÷·#¯NwÛjòéœ8üj)ÛQ^™„……9”íHKº•ë~]«¼ª7º[ѽ0Ö½9R~Åo”‰uÇ@÷Ülç—ûýë_ÿOz½Ñùÿº¸MË ¹ß:íËÚ{üð¾,[ÔŽðŸ–Mz©ªOj¬<.y ëÏ?ÏTV”••ž*8ž–wÔf^d;îF÷vÞî}“QËñÛ*:ºÑÍ4ì¶!‘NP5ìKÙn”¡lÄh”íEOºáîéK¹£”@Ü€[o `Þ$Éèg*æÒžÿU[¢ü©ÙmÖeÔÔµÙŽ´dóG­Ç\ºYµLñ§M÷6ù­qnuµ‘íˆ\Ñ¡Î~Å\FKÝ[a¼î³ùdw8?G?Ó‡€k³é"SÙm©î„y¶£;—r PÕÕŽùØ F×WFm¡ÅÆë~FåˆÊËés ÛÙ>­ùEÞâ]Ÿ¦ï¼ñLM²Ü#)yÙûós$E.[7T¸ß›±+gä¤ÇÿñG¥Sõ‡´ýå§Oä¦çe§X)²w#ZÚ˜4,Ñý%5Ê‚D›=“û å]§îùJù‡êÙb¶cþØ—tצì¤]1)ßÒn¿ÑƒiF§/±‡u·D$'Ö)v™ÊÓ²jKÌoö•[¢j°dv)W§z×(Û‘›Y:Ú§®ÝÀÍˆÈ µ{Ø<¶2ê›Nù–6[szuÒ¢ä}b±eóÀD¸9šEˆµ»Zù×Öú(Tæ›j~<ˆ·´ß.éî1ù 7IªûtN~Nd;òà/ZªabŒ®¯ì¶Û‘ïeÄ5¿r¨í]¡òæHšL\K³+ûuT]ÄÝ)/S¥%‹+Uéueÿ®ª‹®s£¿àyß^ܦe£óÿ%Opá…Ü|ã51›×0Û)8v°ðxúÑô¸ÄªgµF,øÜŽå?e&GU”—þñÇ+%myeEéɼÌÜ#ÉÙŽqôÐî=£²c+wXÒo´t¨”‡DWžs´¿¿ÖûÛ™°ÜÓˆèn]´)2ZOI›$o¡rô.í»I7ʹÄÒ¤MRFîuÈ£êÃDZ¦üÑ”çCÝS½rŸXßшE^¬ÜñµrOê®Î(Û±ò¸œÉØkLû÷HyPÉOï*4£†LʦÒ2µÇ€ÑSçVg·±«C‰r`,»{LµFe«9郋ßó·Ó›j~<=›i´ÇìŽ~îħ«ááàh¶cep “‹FólGº U~S¬¼³0ùÆSú¯ò*Wu?¢½14¹9R~¡¦¼¾R^¤]1zú8Y‘kçÞqëuÞM›ˆÉZ¶¸(`Ö·5ÏvNä:™ŸuªàH~NZòŽÐMA_.ø|dèÉ;Âr³RþüóÝ’¶¹jpóÂlÇS²÷¢ì?Çú\æíèΚ~3.(ÃaÝ3•øýUýj[Ïv”÷æZÒ¶éÎ(N_ÊçXU ¹öNÓ|xí€ïÏÌæ7ËFƒ×›Ü`šŒwoÒÝ®ª1•vuÚf.ÌvL¶Y÷§c}ÿ›÷0lr”š‡N¬ÎµÙŽÉKK·Ó`ó·s‡kd;òôæmŸýt5?ü,f;æß"IWò×£ÊvÄ‹¢sT+·$Ò”â ,åWÉbÈcÝNJÅ6è.Vºw.±´—dÊvAÚ8ȉû&wËvä1Ї z¾EófbÊf>Þ¯½ÔßUÙΩ£E'ŽŸÊ=YpÔ»2z…ßêÙ¾é·!`tüÆ€Ì䨒SùÕÁΟgÎTŸ<–{$YZšóE¶ã†.·î³þxÅÙê/¾E³@ÝLj¤ßSù]ó;,ù”"BZùÒ–ˆeÊ#ÚH”¹ü¢*5’_ÔÞ”‰“†rr{“M•_”W!?ЪœÝè|"·è›µÝQj?¯´£›-Þ,K‹í3徕>±Í÷¼Ý?b.¹åƒQ #ïÕ”ûŽÖýy™d;Ý-3JU;Êä/‘’´O´‡•¿)Ž®N|F‹-¸tTïZdÔk“òƒ‹¿ÝF59½©æÇƒø Ú]§ÝcrXm%3tèÓ¹äðp7Òõ•tù$7cvhF¹5»ô_ë}J˜,JÚù›}'n‹<4ÛIŠ^4÷ÛKÚ´jtþùòÄMš\pYû¶s¿wY¶sò¸ªíÛ·qÁ¦ /–Ot¦²¬¤(?7;åøá¤šÙ4'–Ú^E {ôuíÖpctB8·…Îm‰´®šŸÉë‹s†¤YœÛW.ù«Wï{Ì#þÔ9±©çÆ…<(ÛÙ½1ðÎÛnP>ŸÕÌÇ»Û]·lYä‚lǸNŸÊ;SYq\Zˆ‹Šlpm¶¨/e;òèCß{Yù|VUÂÓÌûåžLˆYUƒl'ǤNŸÊ=SY~,+ÑeE¶8‹lÜŠÙNÊî‹LjݪEc//1oãÆ^­Z6ÿrôÐZÌv¤å¸®Èvçí€[q.۱ŭLŒóµ§›ùx_pÁC† ˆˆ÷AaKæ8œí˜Öé“ÇÏT–çŠwm‘íN Û·ât¶#¾'vݙʲҒ‚S'Ÿ,Ì”þ[Vv*&&¦GîÓg9ÛÉ6¯â“ÇÈvÈvà&ÈvÀ­ØÍvRãטd;•å%…yóާHÿ-ÌO“«èä‘ÊŠÒë®»®e‹æc>jÛ»ÝN¶Sm^Å'ª²£{\^d;€£vVcppæÙN|äÒ»ï¾ëÇïFe;Òrs’älçDAÆ©YrŸ:×¼yó&^xQ3ŸŸjWÔ:ãlÇNŸÈ©Îvâ\^d;À£™g;);ÃËîÕãîgž|8nÛbm¶“›m+9ÿ¿lçäáâS9§‹ŽIUVz2((H^òùçŸß´i“‡ì±zy°*Û9™Øn=SY^•ÃÔF‘íe7Û)ÈÏûm±ß¨o^}UÇKüTÙÎÄuŧޗ•:Y!²’Óy¥%R9Sѯ_?åhé5kÖªe‹×^yaݪ¿³ûõw¶³«VŠlx,»ÙαcG{5úâÓwLêrU‡Q¾®ÊvîÝp,+©²¢´¢¼¸´´°¤8¯ät^Yi¡ô¿••¥[·nmÚ´Éy5kæããóÜ3O.˜}"/˼NTg;i;k©Èv€‡²›íäÉïö~ðÞð%3žê÷È¿ï½=vËe¶“–‘‘¼5÷HJщ£eÅÊåÿñǿǷ½äâfÍ|ÎÓ#½~Á<ܻלY~9GROäejëTAö™Ê²#ck¯Èv€'²›íT”Ÿž>eŒwSi‚KÛ¶™6yÌø¯>¼ü²¶³'(³ô}›3’·²mÏÜ••}ø@Ì‘´Ê1Ð]øË·ßâãíý¯ýK7äñ‘Þón:fôÈy‡TuªàÙÙв’íÄï]>û†ëºÈ“½þÊS‹ü¸ñú«ûö鱨b¶#µeõ°!ï´m{‰~Èããí½pþ/…¹‡”u²:Û‘–Y›E¶<Ålg×ö¥Ñ›}ºÿ£ò”7ÝpÍ‚Ù?üÚÅmZ ~ç¥äÝk,f;b ô˜íë?ýQ‡+.oÚ´iãÆ^b¤ÿ6õûÂÜ e,8\íD×j‘íãP¶³mâ¯Ç|à]Ý7rÓ¦M^{é©Eó~xª_Ÿ6­[þôý‡²ÂãérÅïÚ:îëÏ®îÒù /lÖ̧×g¤Æ‹wå:™ŸUYQ–•º£–‹l†vþ-;;›½pæÙξ˜ÐÊŠ²”øõ"Û‰Xµ`á܉]¯¹Rž¥}»K>þÖÔI_t»ëÖ«®ì°ê·y³‚ãiªJÙ0¦öu©NägVg;Qµ]d;õ’™t1Öýo ¨—-;v¬´%bçKÿ–¶Y~Qþwmï__ßsì´#}"ù£ÕïfdggË›!ý4ͧ”Ž=é T–~~~üùàÙNÂö Ôø5¥Å…©±"ÛYÿ»XðŒ§|ûˆoº¡ëı£>ùî—·ðœïîÈ•ö³ciÖëD^u¶³?²¶‹l§^²ó,“n«ÃÂÂêró¤[xí6Èü¿µšíÈ«èÞ½»‡þp#""¤×î"éE±'ë7b’÷°I¶c³Ùä­Õ=kï§.Ìv#'E/+ÌÍÈ;~hÇæ¥r¶³ê·ÙË—þ|¸|ˆ´GzÑf³ñw€ûg;{£‚“¢—>S\T°+j¥ÈvB~¶$ð§aƒ_kݺ¥¼„fͼŸîß÷‡ïÆ<óÔã-[6âñGV„.Ðf;ù9ªÂ\9ÛÙV7E¶S/ÙŽù~@@€ò.»Ž³é¿Òm¾òõˆˆù6_õ:ÙŽ6>i˜W^zúÊNWt½æªy³üg¶ãXæfTV”JÙVWE¶ãvÙÎÙ¿ûŸ‘'®³ÞNä5ÖËý;ÙNí`žíˆdO·m1;MwxP¶³/ö·äáUyKnöÚ"ÛY0çÿ™&Žuûm7Š¥ùøx?Ùï?“'~9rø»wÜvs›6­¦N$=1?'ÕѪÎvJ¥l­³"ÛqÃl笢±DÝt/\¿é ÙN->|¸¼ö€€“lÇîþ——S—I#P/Äc ë½RÈcÐ8:×Ùêî¤Y¤•ºðÞJ^¦£‹•n¤YêkXŸÚÎvRv¯ÈJÝQtª0a÷6e¶ó³ß¸iS¾~ÐËíÛµËlrá…½ê1íÇñ~?ŽïÕ³û%·yûW6­Ï;šj½ ŽWe;É[ê°ÈvÜ1Ûqêv[\üöÉCkI¿¼ÚæÒ+ÒB|}}åi¤ÛsÝ_m›Í&-PÜûË+×RTT¤ü_å+&g-1•'¹¬d;ÒJAþ,Ò‡ÒýȺ{I>a*÷ƒ•Æ'ÊY¤Ý(Ö¥úPòÞч´‘ªU«²izÕ§0Ú±“n*#ý¸Ež#ö°sÙŽ8í³x¨ªº?•¯ä¥×ÍoÜtç2ºÔÃ×*Ö+’ß5¹M{ðÐÝ*ùöP»%Ò ˆî¢ä!}å¶ÊÝ¿§Mç²[Üʉë s3N,Ø´>T™íLÿñ›é?Žúþë7ßtrïõ¼ÿÞI¿Zè?íí7_¾ªs§¶m/® yÖ…åeï·[ÇÒ«³ÍuYd;ž’íˆ%Hÿ {t›÷螗䥩~OM†FRm‰6²èžèŒ‚)ç²°°0Ý4Ñ[¹—¤yu÷ƒÉùY:‘êžœu£½'ö•ÈvŠŠŠT?2óÑ݇ÚhHþòažíœU<“¥û®ø˜Œ–€s’r í07F×äªHD5—îM‡<ü…¯öNÍî-€WõŽò^ÃâöË ýWuŸRïƒüÖ^¶³ÏêÔø5‡öGž.Ê;’•¾$ðçYÓÆÏžþíœßÍ™1qî̉sþ~âøÑô¸·Q£Fÿ[Åm7úhðªå¿/š5äý7¯¾ºs»vmßzãåˆu¿åfÛŒªàXZU¶³oS]ÙŽf;¢)ˆ2´Kï ÊhWy^êþ7eÿÌÊ;t9­U%Æ2“lG´ Ñæ%Þ²>p¶I¶#©>ŽÉ S»—ÄŒvÏ´Ê!¥´s‰õŠ„Dµ÷Ä®Óf;ÚŠr.m0^ÃlG>?‹þsìf;â|®›ÿÓ—2ÎaâÆAºV> ÝÚˆ‹víu²¸Â—þ¡LZ”íg´mfÄ—ªÊj¥é凡ÄíƒÑC ºßÉ*o|”UI[%² íż²gN¹!ü܇y;¥s Û9¸îàÞ GÅW”ŸNØ´ÀoÁœI æL ˜;%ÀÿÇ…ó¦Îó›5óûgŸ~¢yófbE^^ìõﯾø(rËŠUË}<òýk»v¹¬ý¥#†½—›¢­‚c++JÓ«ó–º,²·Êv”R+CåäÓ‹ôŠô «üíSþòªN".Іe’®u&£\šî)Îzß,FkW&Hª¥Ioi“ݽ¤zW„Ú¦Éê”™v™vûÛÑ=çÛl6ñ®¶W%¹m§h$é1&»øv³å¦Jk”¶S~"L¹»h´€s’I#v1ì¬ê]»_ÅŠ«kUåÇÚþ+Ä•¼îƒTâ]åU½ÝïÖÅ%½ê^@ùí³g]ê»$ÛIKŠÈHÞZx<ýäɂћ/œ8=xÑŒ%A?/ úeéâYËÏ^<çýw_¿²SåÍ ——WŸ‡{}ÿÝ牻7o¿þºk~[º ÷HŠª rª³¤u\d;î“í(S Õ”b F7év›XˆS*Œu"ÛQž ęǹ. Ön‰L•Ò(÷’îŒ"þR½kôº6Þq"ÛÑæiªó°«3iWˆèO»OÌ;Ì‘~Žº°I{†²Ð³ù"YÛɰ¸l6ê¯XÜš©î¼ÄŒF½›lŒn«£èF{ƒ`ô¥¼û7Ô©¥l'}ßæŒä­‡ÆÈ9Q˜·;fóoKf‡-¾Ô?òÖ·ß,6 Y3ŸÐ%óŽÞ§ªü£©ÕÙΆz(²:ÌvìR=)i7qâ÷ZD8—íœU4 Tv;ãèÉAwíVÆfÒÑî^Ò :Ì[?ª¢$'²£VŽ®$]l‰*б›í({p’þ¢‰g²”-y<.ϺŠÝcJw& ׎ƒ¯¯ïNcºÍlìÞ²‰¶ýªËoåà¼Ú”I~®ÊˆhÛ£œ×nß> *ÛÉJ>| æè¡ø¢9åe¥‡³Fm]±n™²6oܲ<6jõžë7oùb̈‡êa–í”—¦%®¯—"Û©ßlGŽGäqºu¿”½›¼+êdD÷É#§³³ÿì’ݹa²u×®l"hòq´çFó½dtèž*ÎáŽf;&§nf;⯀öƒ›g;ÊGô¹œrpFë}(ÄhL[ù{O“,È åm‚|iíª?µPݸö[æs#Û9’¶3;}wΡø“‡ÏTVäçݹy¹²b#Wï‰]Ÿ´g“mïö4[ô=Ýn žw,+IUyG÷W–—”ÖU/E¶S'ÙŽn¦j¥?ó;ôšü^×$ÛQöüìÜPJæÙŽÅfN÷’ÑV†ù6Z²›d;bCGóކÎÖN¿@€[ ‡ÁÕí£@y©_ÛÙŽøÞYÄJFyÈvj#Û9š±''3áXÖÞy‡ÊËŠOŸÌ8¸wOìÆØÈUrí‰]—´'¶w[šmGu¶ã/M¬ª¼£¶ªl'am}ÙNÝd;5\‚Ýl§‹®Êv”í:œëbÝ<ÛébMÏvD›"ÝfN⯃ô×J~Eã8ý(pN†<ÒEµ*äQ>»$®ÿ¥Ëì(n%ÛOZ‰®uD³"U“唕-QöÉI¶c'ÛÉL”+ÿhjIQ~eEyñ©‚ÇRö%lMصáÙÎâ¹bbQyÙUÙ΄5õVd;žŸí8Ñx¦&ÙŽª«Öît˜à\¶ãéÏd9úÝØÕ;‚Óí¶8‡I—ÊÊ~)E×ÊïU]¦•lG{›`4—²¿G·„lÇ<ÛÉÉLTUÁ±´ª§²ütñ‰£‡S¤Ä¬ÎvBÏÕNœ+g;ñ«ë±Èv<4Û±2ғ˳ ¬æÜ)Nwíbiކ Îe;µÚ—rÝd;æíšT ÄW³ñÉvp.)**’.㥫\£aÄ‚¸`¶xg']BËc”8‘íˆ1ˆª™\Š‹{@“.‘¥¥…ÐnÇÁlǰ Ž,)Ê?SYQrúä}÷u Y¸ÉsºIàæÄµ®ù£ ÊÛq `4—ønTum=Û‘×+áÝâ‰ɨ £›D²“lçè¡øÖñ¿²•õ[d;ší(ómì\TT¤XÜnºbžíˆ@@µ(»ù’Ålç¬â(ݦØr*G³åYQï(ƒ“lG•;íH£íô¸–²ó?Ò¾5úÜ”÷Ò¯¸¹°ÙlâîF{Å®üE9—tE-ÞÒÞ^YÏv”Wéæý‚*;’6X4Α– îÚ¤õªî Û1Ëvj\Çï«(/Ù÷{ýÙŽf;ÊÄC>cøùùÉ=¢K¿ï&#•;šíˆ¬CÛ>GÙžÇb.a²vå S:MÉϫʣå0Ng;gÿÙ#±´ÆîÕ”ûMwFÕ>—ˆjÈvê¬Ò÷m.+9»n†çVM²áo=Ú⢦ç)èf;tª @d½/åÁS»^ÝIšì¡ºÅnY²Ϫ:«ô}›ª³éž[Îe;_{òòv­ÎÓœ3A7ׇۡÆÉŠÛülÿG¥)[·j¼`òþ¸UuSéIUÙNÌÚi]e;S¿yåæë:œ§çù§Ó väª,/ᨠápb t¿F7ó©zDè½·^HˆþÍ·²¶+-)¢*ÛYãçÑe1Û š>¸û×è¦:wßyÓòài&ÁŽT…¹Õ4æÙÎÆðOûöÞ´âÕèÛ×-¼ëŽå<“ÆdÛý{­VÚÞe%'£×Lõô2ÏvBæŒü¿‡ïÐMu®íÚÙè9,UådÆsTÐp˜g;sü>“^÷ñnúÓ„‘ÊlÇV]“Ælݪ…4Á-7v]<ÿ{Û߯»¼Òön¨ÊvVOõô2ÊvV~öÊ3x5:_›ê\Öî’)FYIuäÊ´m娠á°ûLVà¬oZ·j.½ûÒs}ã¶We;»VˆŠ yïÍç{yI<öÈýÛÖ(ßuUL¬Êvª‚‘s þ™íl\úÍûkÙÂG›ê´iÝâÓ‘o%ņ[väúãL%6 „•þv¢Öù?Øã.i‚®Wwú}éô”]ËUµaùœ‡zv“&hæÓôÃ÷_ŽZ¦¦&õW¶³êÇs¢þ—í|1âùK/n¡Mu7ö|ݧz­Ö­Z|øÞKF“9Tª³•“ÏZà7ü¶›®ÒMuz÷ºwMجš¤:d;44ŽŽ¾'r‰ïãJ_Ùñ²_ý'$ï ÓVLÄ¢QlßîâªÇ‹¼¼žíßg}ø,Ý)-Ö„uÕÙÎ$®ÿѽ{Üj4¸ùÒ…SjžêíÐИg;± &|õ2Û‘kìçƒåÆ9¾}{mYí/^W•4Y׫;É °çÝóf~c4¥y¥&¬-+9ùûZkƒ¿yæ‰û½¼t†ÁêÜéòSƸ*Õ!Û ¡1Ïv¦Œ&½~ó ]Öþ6½:Û µeµÿî^5BºOÓ¡ï¾·=Xù®²æÍüºû=µWézu§ïNj޸ÐhbÝJMXã¡ÙΦÐï>ÿ°wÓ u‡Áúîëa®MuÈvhhì>“5dÐsr€3uâGûbBU5oÆ×rËœö—^NVRô²1½ÙØ«‘Tc?{O7±Y±ø§;o»¾zx¬Fýú> ›©j÷Ö_šð‘4±Üògè; ³ðïܹ§ÿw·ëuSûï»cyð´ÚNuäÊÏI娠ᰘíì^*×òÅ?vêØ^šøÑÞ÷E­Ÿ/^WÖFÊ ¤û=·úÏøRw2mηkköuÛž•ÕÙηîYáó?ýσ·ë¦:×ví8gBݤ:t¶@d5ÛÙ±DÔ®-‹ú=ÖSš¾u«æ¿¢|KY³Ç>Úû¾¿Ÿ·êøÍgïMi·lq+KOŸØ6ÞÝjÕ¢Ïôï©;¸ùeí.qùàæv+}_íРXÍv45sò'­[5—GHœ5Vw©Ö„L{Ú··Ü©Ž4ýAÏG­ó7šØ¨l»¯ÎvƹOmXòÕûónzîàæŸŽ|«ŽS¹ s38¤hP”ÙŽw“E³>×f;‰QÁºµssà ÿ•s›§}{G¬øÅhÊÈuþC=/gA’^÷ßùÙÈ7L¦W•œílùmœ›Ô¨ÁOµ4Ü|ð µ: v€R\\œ2ðñn4ûKM¶cVkBüzÝgõ¼M‡ zÎdÊ›~3zP÷n·üoôÛ®9äei æ«°í^Q•턎­÷š8æå..ÕíZçÕ¾u0 ½(•nݺ©âi‡ÿ#Û±P3&êÔ¡ªeé¿Ò¿Í'Ž\;÷›O=úнÿ½KÇ!ƒž š¤;½mWU¶³9ô›z¬9“Þ½å†Nº©Nï^÷nZ=¿S©&®=SYÆÁ @TXXxË-·(à /¯FÓ¾!g; ‘¿Z¯=çã]5”ù}Ýnžòí0»ÓÇn &{â±ò\’Ñ#j'KÙµ¼ôtáæ¯ë¥ÏöﻯÕMuî¾ó¦:ÜܼNäer$Ð`•––öéÓG™Z4öj4yüЪlÇÁÚ>ã‰ÿôä´»´Íèc#X™qŽßgƒ^ë<ï[í[);볯ê¸BçŽüoß{Œ7Ÿ;ãwHu¤:ž•È1 @§w$ƒ^ëïD¼#'<Ò¼rçÉ>ÞM¾øÄê¥?9·(‘ílZöeÕŠ£^yº§î0X—µ»ä»¯‡¹Iª#Õá;èBœ­Žwž}öYU”Ñëßwl[=;~Û"'*fãüÑÃ_kwiyQ}º'à篜XNrlXu¶óEÝÔ{¯öiÙÜ[w¬OG¾•î>ÁNZÒ†Êò] ¼òÊ+ªL£S‡v¿NŒßètM?ôŽ[ÿê²æš.F ~qÕ’)ÖgOŽý­ôtaÄÒ/j»¾ùlÛ‹›kSƽÞøL} nnì”çsĕɓ'«Â ï&“Ç Ý³uaMjñܱÿ÷èýbl¬NÚ½ýê“¡ 'Øq_lhu¶óyíÕä/_¾ªc[Ý®uú?Ñ»~77z‹;ÀHDDDóæê,¯ xkÁÌÏ÷l pIMû~ÄûõjÝò"yáíÚ¶žýÓ'ÚÉþÊv‚?sm-ýehŸž7ë¦:·ÜÔ5pÎ7LuÒ’6œ>•ËÁ ¬(--}ûí·µÑÇ«/ô^?'nËWÕ‚c^øï#wÜzí¤±hßMŠ ©ÎvF»ªÂý‡÷ì.¯Fçk?ZçN—Ϙ2Æ Sù9¬3•e–À!3f̸àõh௸tÁŒ1.ŒwLª:Û)ذøÓš×ª…½þܺƒ›·iÝâ«Ñï»gªs0qm~Î~EàœäädíóY5àY7;nóüZ­¤èeÕÙÎ'5¬‘ƒú¶lÞTwpóÁƒ¸ÕàæÊÊNßY^VÌAjhüøñÚ<­Z^ôɇ/ïÞ<¯öjoôÒÒâ‚õ¿~ât}9ì©ËÛµÒÜüÕ¾î6¸¹¨ô}E…ÙxÀUŒð\sÕ~>ܽɿ6jïŽ%ÕÙÎ('jê×/Ý|ݺ&÷íÓcÓêùî™êH•Ÿ³ÿ3•rÀåtðHî½ëÆ Ù_ÖF¶SR\°.èc‡jîoÜwÇÕº©ÎÝwÞ´÷-šõÅ®ˆ¹®ªÄ¨àªlgÑGkñô÷ú>t«î¶]Ûµ³{n.R’â|Ž.P7"""tѪnÃsÃ/“GSóJŒZ\팴[¡³?x±ÿ}ºƒ›_Öî’)F‘ꨵmÛV7á¹æª+¾ùÚ®sjR‰‘UÙÎÚÀ&µbÞз_ìåݤ±îàæŸŽ|Ëm‡Á"Õõ®´´ôóÏ?oÞ¼¹nÂÓ®më÷Þè¾èÛg;Q ‘¿Vg;Ãê“÷ú^Òæ"Ýa°à¶Ã`ådÆ“ê÷QXX8~üx£6<’¯»rÔa?îÜ0Ëz%lÿµ¤8ÍÂaÚšøéÓ;\¬»®çŸ~,jcF:™¶­'ò2 ¸§ÒÒRÿŽ;žgìáî;úÍØ ³¬”n¶3}ì‹7]{¹îÂ{÷º× 7OKÚ{$©¼¬˜#x„ÐÐP£ž–…{î¼þÃwžüù³Ø ¿UÂö ’¢üÕÊ5òë=º]c4¸ùÒ…SÜ-ÒÉÉŒ/*Ìæxž(**êí·ß6êŠGhÕ²YßGîý|ÄË«ƒ'Æ®ÿYY ÛUe; †M}Ó÷‘Ût‡Áº¶kçSƸO¤“•™Ÿ³¿ôt!87=ûì³çYЪe³{î¼þ—úþ8~ðªà‰ñÛäfðíf4 Öw_s‡<çPÊæãY‰E…Ùô¥ÎU………3fÌèÙ³çy–µnÙü’Kt:Lnæã=üƒWëqpóLÛÖœÌøüœÔ’â|òР½ýöÛæ½.ëjÜØëÕ¾u6¸yZÒ†#i1RÏJÌÏI-ÌÍ`ìr!99yòäÉ}úô¹à‚ ì;/x.ý`rIq~ÔŸþÁOÀº¸¸¸   ?þ¸gÏžª˜ûôé#½Ë.ðééé¡¡¡3fÌ ÕpÚÿP£Wã endstream endobj 1047 0 obj << /Length 1673 /Filter /FlateDecode >> stream xÚWKsÛ8 ¾ûWèVy&fE‘Ô£{ÚmÓL:;³ÓÄ=µ=(2ms«‡CÉuòï (Yvœm'ã˜@âõ ΢ñc7'Û»›  "øK¸dq®‚4—,Oò<¬ÖÁçYl€}3ûk9{ûQð vœËu –ä"HUÌT’ËUð5ü`*mç ‘‰°ù‚‡þ©˜«ðK§í›™2¼Ù›•ž/â(áqÈóù÷å§Ùõrö8ãÎ>^/3– ”õìë÷(XïS1™gÁÁIÖ¬Øë*¸ŸM~í{ÐÀ¥`¹Š©r–¤U<ÎX– %ÄdéX"IXF{Á99ook|hAóç:ƒ’ÅD‹‹eðˆåQÎ1–±ÈY¦)Æ“˜bùÑlöB$„Õ; $@LOÉ”¥*=Nþn®x¨«âލ,\é]Õ>׺é]lσpfÀ"° .ÀÞh0áag!Ü'eZ¸z§ás|„T…‡­)‘¿E~ê¦,vݾ*zÝщ¢YÑ¢ÓÍÊÓú­®I¾o§÷‚`I³$¼ $¸žópoá }MQ¿m;MËZw]±ø ~.¸`Jzp:{hðöà’ìq«v¤ Rö'Ú¡-–D"¼7Mù‚G{«Kmˆ‚ˆ÷—¯Úý_¹CéÔpoÈ`-DTäyhzOÆ‹öß=@•¸{q³³íŽö¶z¾ädÙ6ß".:ýXP ã8ìö;:ÚÚž8Ý~L ÊÙN&%¦ƒ·Z{)]ö¦mEÐ3è“b+™nïnfÁW§H1€ü èC„ëÖÒ•+ݦêhS ƒiØî«&±ÅýÑ£ÂÙA‡¶Ð+ðß¶ð,Z)“Lž›ŠçLB†ú©¨w•/ëíKÔ Šy8µQ­Æi]"WPüP` 8†N–$¤X2gy¬Â?W+ 0€ ¡¦¢°ØYW>yr×™Mµ<<ì½|òʔϤ爛yÂr‘€Îˆ©\’ÎQS¬$iÂÅQS¬ÄD¤¤'š…Ô˜FûƒÛÂ/<.AÔm­>XÓ÷´…‹Ö=&9˧å£7\ÑÔE§W8ɳð¶'r¹·õC‹ˆ;Òº­ª)*ìÅàæR‘wýÖø¬Õ¦S¶õ»ÓÌ‚0°!&1K”ÏgçÙWQ¾¯Œ·€@PV Sé1ˆz}CAfjWÙ@û©¨˜>=AQ&YI©T¤Â—ðSóEÆ­·>þµõ‹²$€E1“ãØ¶"¦3 ¾'Nœk¶³/âÎè°½—¬L×, ø~¨ ×J~,ëÕºá «ÿ…¢WØå¢,4kÏw–<ÿ8æ#û¼&[Ó`Ðôš.ÆäCÑ'e¼rnH„­¥ØNZ)Э6”F?ø»-¼œTãƒ{l*pˆnpUà–qì!žÈ**«‹Õ3Ýæš=.@³¡ZªIÌaqïH¾ª,1Ú5 ã®(˜ëñ7rhMâÕ¢W/ZÉÅhÝOi‘œ„& ¸Þ"|ۑǶã+Å‹ 4#*Ã4ÂCàøÅÆöÓ´û§ `z› 5!…ûžèøàó&`oÕCì©:º_f#|qìŒõ}…Î{$EÒ?Kœ½¦;œ„G€¸Wn°^‚á•ïëék ?á~#èé/ƒ.cyŠÇŽhfí_vcO^~G Êa>Ðfkˆ5ÜàŸ÷ÿü}ûþvIÄáuywýùËõý’65=Èñ™í¶ê……½5º›>•¥ÐkÀ´úq¯ý Ì `Æ\–S8¼ªÜO‡œš °Ý¬1^vÈ+ˆ—EÓ´=­'ïý|ıÖÃõclPêµk¬´(>ûe’ Þ9å­?|ôîì9Ü™ÚT…Ÿc;>ÌŒµmëaŸao<‡´Ò³ð‚3þ¥5ýérQõíK¿s¯—³ÿ*ÈW° endstream endobj 1032 0 obj << /Type /XObject /Subtype /Image /Width 1019 /Height 865 /BitsPerComponent 8 /ColorSpace /DeviceRGB /Length 81014 /Filter /FlateDecode >> stream xÚì½yTUÕÿÿßï®õä“siR¦RY┚f¨¥äÛ ëíe‘¦’%ñÆ!RKÞZ’š¡¥b¦á¡((  ¢È<Ê<#ó(2Žù{y_¹Û;q™©žuërÎ>ûì½ÏõØç¾öÞ÷ï@›’œœliii¦GGÇúúz49ÈäMLLkˆ^½z¹ºº¢¹økáããó˜ÎŒ=:$$À_++«Ç‰¥¥eQQš€Ž±±±0y===úð¯ýëå—_þôÓOmll¦L™¢êüFFFì ##k¼——W``àܹsùמ={nذáêÕ«nnnÏ?ÿ¼ªöSgÁÃÃÍ@ÇÄÁÁAØû Aƒ¢¢¢¢Æ¿òÊ+¼ðàÁ$ü¹¹¹$ÿÝ»wWÕ~333ê8 1èh« o_´h‘þ;vìxúé§ù¨¹¹9MHHX²d‰¾¾¾ªö[YYUVV¢Iè ŸËÆ¾oß>%áUðÅ_P‚N:ÙÚÚfddÈ=9°ßÑÑ @GÀÙÙY¸:)}”Uá‹‹óóó›5k§ìѣǎ;òòò<øì³Ïªj¿‰‰‰š€öeΜ9ÂÒßzë-!üdøAAA²ðW®\9räÈÈ‘#9ýˆ#Nž<™ŸŸoooohh¨ªýæææÉÉÉhdÚ…úúz###áç6l¿|ùrÚóꫯz{{ËÂOÄÇÇoÛ¶íÉ'Ÿä³,,,¨_@b¿páBµ3öÛØØ °€¶' @h¹žžý*„ßÝÝûúúúóçÏ ’…Ÿ dbèn—.]V­Z•••8fÌUçïÕ«—““€¶ÄÆÆF8ùðáÃ###YøSSSéhvv6Ô%ºuë¶fÍYøáO:•Ó<õÔS¿ýö[aa!ýìÛ·¯ªö›ššRŸÍ@Û`bb"lÜÖÖVQQ½té’b$¯ák“ÌÅPܽ{÷ÊŸ¨ÀÕÕuÈ!œfìØ±çÏŸ§ÎªU«Ôö[XXÐQ4>­ Y·ìá'OžÂ_WWG –-[Fû§YÌ O,pÚç>ÐäN9qâijgÏÊŸ¤`Ë–-ݺuã4}ôQjjj\\܇~¨êü:u²³³«¯¯Ç] •pttnll©€l?>>žŽÞ¾}{Ĉtè»ÍN‰…¼Ù}ó}×n=8°ÿ“O> ‘…?99966vÑ¢E"°ݺuEEE§N>|¸ÚÀ~WWWÜZyÙ¬÷Þ{OÿÕ«WéhVV K‰L*ýj¹ðs=…ÒwëÖí›o¾‘…ŸHIIñóó{ýõ×ùô¸¸¸ïÚµ«GªÚ?zôhê8àvЂTVVvêÔIX7Ù¸þªª*J°iÓ¦#y_~%*¹Huóò 7{ØÿôÓOïÞ½[~"55õàÁƒÏ=÷œˆ ¢®ÄòåËùý¿sæÌá€æãêê*/°{ùòeþ˜˜˜{ ¦OŸN‡–Ú®ŠN)Ò´í>plÐsö7îôéÓ²ðiiiÿûßÿºwïÎi/^L{âãã-,,Ôö¯]»ý–ï4ù3©©©gÉû·oßÎûU$M¹é^—¿ëͲ´´¦=yò䈈¾A™™™t´ªªŠ'äôð¾“R¤}[m¿‘û‰?ü0<<\~"**ŠTŸôìÙsÓ¦M%%%ÞÞÞƒVÕ~cccü54Ê]ÛæB x¬!(ÍŒ3´è79'§T*ö¸qãøôFISn:Ö¥±—û !/°»víZ!üåååtÔÍÍö?ñdߨÔb]¶K©ó-åXCCï¾úJþtgÏž?~<_ñÅ_$«/--ݼy³ÚÀ~33³˜˜üñh‡¼š<¹Í¬Uá,X°Âß^„„„È÷Âßß_ÿíÛ·)Á'Ÿ|Bû?°\—V¬ûæwùŠù¿ÿŒÕyæ™göìÙ# †ggçþýûsš©S§FEEÑ!kkkµýVVVìÐBÓ$¹ù¿|ùrµ±=ÜûÐîüäœ@ø[µk×Ê ìF( ¶JNN¦£uuuÆÆÆthï!+é%Ýõ~ÉôÏI8ÇæÌYø3¬Y³†×äêÔ©Ó_|Aû£££Åн2FFFìèP¯%V¿¦¦†<_èœîáoALMMÅ-øì³Ï„ðÒѰ°°#y »D&䯧—4mÛäøK·îÆêXZZFEEÉŸ••ûþûï‹ÀþÝ»w—••yzzªýžÈÄÄÄÇÇÑ_øáüt K&„¿ÍPZ`÷СCBøoܸA ¾úê+Úÿæ´ ¥ÍÙ¢ó–X¯ý«W¯–…Ÿ ’œ>}zôèÑ\’#Fœ9s¦¼¼üÛo¿íÒ¥‹ªö›››ówM Á9dRSSuœg¦±™óQ½W.Iƒ§è.É”Uc‹ÑáeãøŸ¦ ¿(sc…_—šê(üM{*¸äÍiêæàää$ºwïÞááá,üW®\¡£wïÞåUq¿ÛôSbfió·ÀЄ©Ófðåú÷ïïìì, ?‘““³{÷î>}úpšwÞy'))‰ÒXYY©ýaccSYY‰YhÐÓÆ)`aòI‚§äŸde ,à è3¥?qâ„Úœ)1åèô€€€3fˆsy‚º¢ÈYé(¨eúµ%Qug(g9`ž+K;USÒéœOƒy¶¬ðh)IË ¿¸,êÚ…_õŽÐOy°Ò;v‘›h j4ÑzòÑQø›ùTÈïöù‹‰6~ò=<ªå.«þy*äÂ+•§ ã_{íµp$üééét´ºººk×®Šv/¤ä”·Þ‘ôï·þ ìïÓ§ÏîÝ»eáÏS°cÇŽîÝ»sšùóçóJ^ü±ªówêÔÉÎÎýÐäj£„@jZJØ»’aji-r~_x¯*Ì"‚EÓÛ`-=M¯©ð oG~Mí ZO¾¡ ÞhMM¡¶úÍ*Úþ•¾<Á>óõ×_ á/++££žžž´ÿÉ>}ÉÉSi»ZѪ›§Ï…—GåÂŒ=ÚÇÇGþüüüÌÌL[[[þ: K—.k×®-..¾xñ¢Úè¬^½z999។7!üé¹m±%¤.·ûÚа öÛÙÙeddá'¨ñÉó_xá.ü믿NÅ...¦”òdÁœ9sŠŠŠð€ðkò@9d€VT3Ñ$üšÞc7(üºÔN÷¡»m üÚ £ÚVòtLšÎÍ._QKV-þT´b‰+â“O>ÂOFMGéí×××MÉ—…?#ïZÛl!Ñ)sç},û÷ìÙ# ?³qãÆ=þœçgÉ’%¹¹¹iiiï¾û®ÚÀ~êàP/ÿî¿vá×…Ö~]"RdAm¬ðëBë ¿H¯6ê¾e…_K‘š ü-ûT´ EEErñöîÝ+„Ÿص··ЯMLÎ.SþÌü¶Û¼ÎŽóçŸÉ˜1cÎ;' ?Õ"55uéÒ¥"°ßÁÁ¡ªªÊ××wäÈ‘jû]]]ñ€ðk:*Oh©Õà–~r]¬[S2í¯cíÔ7h¾ð‹2+…»w|áoñ§¢mpvvܵk×0dûqqq÷ ìš™™Ñ¡µë7«þ¬üʶÜví9Ô§ïŸýóæÍ‹ÂOGDDLœ8Q„'>}ºººú·ß~ÓØƒÿ{„_õhŸú …ô´¸6JøœH³±1üÚ-]K ¿(‰<¢VKV-þT´ B€ÿýï áÏÉÉ¡£ùùù¼Àîù‹Ñê…¿ 2»m·”¬â•_­ý«V­’…Ÿ())quuOÝ[o½•——gkk«6°ßÊÊ ý„¿QJœššª:[K+ ¿öñžbêN¥é"5F—™jjj;ÂTwá—§Uú¡ÉÂ/F.˱å•vµÛ¸R kŸ¥§eŸŠ6 ¾¾ÞÈÈH¨ïÆ…ð_¿~ýþÃ÷ÿ&ÏNÊ*Ó"ü9…×Ûx‹ˆM}ÿÃù\ìgŸ}ÖÅÅE~¢´´týúõ¼&yþ²e˨󒘘8mÚ4Uç§Fذaûÿý†æÏúÇ´^HÏ}iÖ-ï¨5Íú¨©0 Î'/®Kç¶Æ,=¢RªekpZNM3[ªG´ÁùW5ͽ£vg+=m€¼è›žžÞÅ‹Yø©}xÝÿüç?†ÁZ¯hPø¯µÃæyêüÐá†èO˜0!""B~"##cñâÅœ gÏž[·n¥N¥··÷K/½¤ªýýúõ;~ü8þ ÿpá“R’¤i—s£hš,ür¬»Ú³Äë}-oò•ÞÕk_1VöCísÎ7Aø)g±B–ꊴº?]EuZ¹ÀjsÓt¯Ea”ŽªþVz*Ú9 =44”…_,°Û»wo:äâîÓ ðçUµ×¶eëÎî=zòTBK—.ÍÍÍÂ_¦ $$dÒ¤I\Í—_~Ùßß¿¶¶–äŸßÿ+1eÊ”äädü3þ±Â/« yš’ ¯SUÖþûÒ ùF•äþ£ËþF*P{¢R#Ð%„ºëþz_~:Ku+µ§Òì@j3oPøY§å. uy RÍ“:2⫆åkŠÞi§¢ Ø%ùÂÏ ìúøøÐþnÝ{$f–ê"üyÅí¶%¦æ~¶ô¿\‘=züòË/²ð—+ ûòÔSø9sffffAAÁgŸ}¦v2%jÊÊJüKþ™Â¯$™dkãÈÖªª¬­!ü²gj*‰ÚŠˆ—ÿÙ“E Œ¦<;:U÷Ù>)¥¦¨˜gé-¬Z`Õ%9†_SMÕ¾®×®ßâOEk“œœ,7¾‡‡‡~y]‹wçè.üù%Õí¸]Š4›ø:Wgøðáþþþ²ðdø_ýµì_½zuEEELLÌo¼¡6°ßÑÑÿ€¦ðßW¼]Wë±´Sõzë ?U[ÊSËØ[¹§ š³ün\©v ¶L„ŸõX{κLË©T)-=yZNù› e¥6fIûøÜ–}*Z9|=TÙ~bbâ}ÅxÞ_|‘mÞúKã„¿´·=û]ú>œºÓÒÒ2##£üQ’’’h¿˜ÿþýuuutƒ ¤zïLLL|||ð¿ø›9?¡ ®rEJY°`ÒëJ¤¦¦*Ïè~” £å¨Ú’è2‘eÈA5t®ÚúRuè(eHÙr²æ4©&tŸóGí­á¦™p™u)°R“R¿€t½ÁÖÅnƒ§¢µá ö™?üP~~>MIIá¨øèôF AiûoYy¥¶+¾Ò×ïÄ‹p}ûí·å*\¸paìØ±\ýQ£FQÝIû7mÚ¤6°ßÜÜ<;;ÿÀ_…ÊÊJYhwìØ!„ŸØÝ°aí9ê•„ŒÒÆ aYMGØb3̧þ9 çàÁƒ===ËTؽ{w=8Í¢E‹r,\¸PÕù;uêdgg‡À~ð—ÀÕÕU¨lçÎCBBXøcccï+Ø|˜ö?ýÌ€øô’æIE;oBø©TIiyó>úsqÞ¾}ûîß¿¿TŸáÇsš×^{-..Ždýúõrs ,,,ŠŠŠð,€Ž†¼À.qþüyþððp^`wîܹ¦3]lÝ|á/½v£½6%á§²Q }|ƒÄâ¼'N *QaÓ¦M"°ßÚÚšöäææÎš5Km`ÿÚµkëëëñP€ŽƒPÖaÆ…( áç鉪ªªxݽ‡O“çÿ Ú'· +TáðáÃÔ#Q@ùùùååå_~ù¥ÚÀ~++«ÊÊJ<~ µ‘Ø?~|°þ¬¬,:ZZZÊ ìzøµªðWÕ¶ðֲŸ˜Y–YºrõzÃ?çýüóÏSRRTµÕªU†††bBþ7n$&&N™2Em`¿££#ž@ЪÈa'«W¯ÂÏïŸ:DûŸx²oljqk õ[-¶µŽðÇg”^ŽJ›ùÞGÜ\=zôعsg 111óæÍý...÷îÝóöö–ç>Ð΀€<‡ 5 ±—åóäÉ“,üaaa¼À.¿ÿÿ£…m#ü5u-±µ¦ðS Ä¥•¸yú¾8d¸X§ìܹsªÚO;ÇŒ#&äç¸}GGG###ÕÅyáüh_ÈF¾S ¤%Û·oçýh¢¿(k×®Úù /\¾|™…_,°Û¯_?:´ãW—6þÚºÛÍÛÚBø©5bRж8uíöçâ¼óæÍ#¥ÏWaÏž=}ûöå±ºÜæ•••666JÎO7O#ÚRzÖ%·7ní0`@)$îTc155Î9þ|!ü¼ÀnPPí×Ó׋ËiKá¿Qßô­-…?:¥($6Ûráçz§î´··Wu~[[[î\SPQQQ^^®ôÝŠ³³3žF@ø5@%é ýŽ¿EEE²sîÛ·O?/°»zõê“ÒL2'¹mc᯻y§ [Û TradRáÉs¡cÆMSw*½êçe˶lÙrþüù³gÏz{{{yymݺUn|,Å €Ž)ü3fÌ  }‹×¡¾hø áìì,/°{YÙ~||<­««=z4²ß°µ]„¿¾‘[; DbAxBÁV§Cæç9räHÞC¢££9JŸT_þ9sæˆÆ§vÆÓ€Ž)üÓ°°°ÎIŸ…ð“¦ÒѬ¬,^`÷ü¥¸vþ›·h»«ãÖ„ß; †gìÌÈÈÂÿã?ÒΉ'úùùÉÂ?hÐ ðÂáo=”ØuppÂ_[[K ~úé'ÚÿâáÑÉEí%ü·nßÕeë Âÿõ·Ü~̘1¹<¿½½½,üãy°ð.Z›ÔÔÔH………­!ü‘iò¹"¤GþBAÕùEnœFŒ~ÒgQ`*¤\0‚ÓóWXLbbbä.ÒÑ£GYøCBBxÝ… Òþ·fÌî8ÂïÞòv÷ÞJøß›·×2È‘èÓ§íܽ{·,üëׯ—ר­¯¯Ç €‡ÕšàøláÏ"¤¿QÂâÄ aûªqûjóW*•Úî€èD(½ä¿þÆãàà !¤€„?11ñ¾bÝÁƒÓ¡~þ­c ÿ·Ž'üÆO?K-öûï¿ Û'ç=FFF—.]’…êÔ©¢ñÍÍÍñ4 Å¯÷UÍY“Þ7Jø…·«Û‘s“¿DÐÞ aDOÂßLÌÌÌ„s~üñÇBøyù§ððp^`78&»C ¿‚û´u4á?y.”WÚMMMÂÿå—_ÒÎÙ³g+ Ïž=Eã;99ái@‹Cš­#SSSCNNý1ºVwá/,,Ô¤å ¦ÂO—†ð·•••r<Ï®]»„ðß¼y“ØÛÛ?˜^rÜRÙŽ&üT¼(ü¶_>h±É“'gKðÈÜÍ›7Ë¿sçN¹ñ)H´8«uŸ'Swá?xð Úa¿º¨»(˜¦i|4‰=„¿QÈ ìvîÜ™t”…?66ö¾bÝñãÇÓ!»o¾ï€ÂÏt4á§Î»½°ý¸¸8Ñ'É—…ÿƒ>ojjЧ­Aƒoà›#ü"å­ç‘; z;„¿E˜3gŽhÿ7ß|Snn.ÍÌÌä9dNœ íhÂß1íÇdë)&Û ËzȦM›8jîòå˲ð¿ôÒKX`á×S__odd$ÚßÞÞ^uu5%صk׃©ãM^O,èPÂßa§åüáçߨņš%ñŸÿü‡v®\¹R~ùá Á €¿®ðϘ1ã;¨©©ð·%òŒ¬zzz>>>,üááá÷ ìò ¨Ÿ,±íPÂß‘ÞzkÆlj1kkëL CCCžc_þ+VˆÆïÕ«žF´B•fÅlYáWš§Qƒð·666Â9‡zI ZZ-))éÝ»÷ƒÙcœÝ;Žð“ÕkÙÚ]øŸx²/µ˜»»»°}ÚÓ¯_¿ÐÐPYø'L˜€vЈE¬4M†s_ñ-Y´x«»ðGFFjŸóS$ƒð· &&&Â9—.]*„¿¼¼œŽzzzÒ~ð„‚"üºlí(ü.ç©Åºwïž!aeeE;.\( ¿OçÎE㻺ºâi@+±}ûvíÓÝ‹¨&ÿ})dHÓd;<-'áoK²³³åò#Gްðó»K–,¡ýÿ~{Vþ›$óºlí'ü‹>[F-öî»ïÊÂ߿ڹoß>YøüñGyÝÊÊJ<h=„“«}Ó.¾+g5Jøµ,‰«”¿R£™Â¯e>OÀ8:: ç|ê©§.^¼ÈÂÏ ì^¿~§ŽüÒ0ϳ¡í.üõ·³µ“ðù^?KØ>¹=/°$ ?u Dã›™™ái@«"Ož)¯‡[SS£V×%ü”‰˜x“ÈC………"ÕAÍ~Ê>>,ü—ÐYwîÜá¶mÛÖµkW>ëýE¦¶‰ð7wk3á7PL¶æÌ!ü;wî¤=#GŽŒŠŠ’…_îsÙÙÙááÍ¡¾¾~íÚµ$öª¶ÿþûïGDD$$$ð„<Äã?N}1!üÁÁÁdª" «¼¼\¤40ì²fݦÖþÚÚ@ø=pŒÚäÉ'ŸL•xçwh§­­­,üÔ¥’o–éphWWW¥p}±Ì–§§çU‰‹/Nž<™¾ð »wïfá'BBBbccÅÔ‘qqqãÇÿ3"å¹Á‡Ý}ZEø[tkmáÿxÑRj>úHþnݺÑÎãÇËÂooo/î‚‘‘QÐ4ÈÒy^M%ºwïþóÏ?_ÕÀþýûûõëÇ)_ýu///~‚|5%%¥¾¾žówqqyâ‰'8åÔi3.†%¶¬ð·ìÖÚÂoü̳ÔHyˆ››/°K}%Yøß|óM,° šCQQ™¤ªêëëëÛØØ¤¥¥]ÕJzzúÚµkŒŒ8°Á‚,üDXX¥¹{÷î}E°ÐêÕ«) GøØ®\—ZÐ"Âß[ë ¿·7o\\œþÏ?ÿœ•^Iø±À.h2dàìêJL™2…´3÷!yyy¹š‰‰‰“µvíÚuݺuBø ʪ¤¤„/šŸŸ?}útNùLÿ{ö»5Sø[ok%á_m¿‘¿I‘xî¹çhç®]»dáWš3 ìÝñðð066VUý^xÁÍÍM˜³IÊ,j”ð·ÍֲŸ+&ÛÂOÍÎïü¯\¹" ¿A888àÑÚ©¬¬´±±yLŸ}öYbbbÞCÈêÅx[Ujjj8ÈG™™™vvv<·')=eÄÂM§s`?iñâÅ{=¶íÜ«£ð·åւ¿s+¯Ÿ•$1iÒ$VzYø=<<äDý<À@ ŽŽŽjÃõÍÌÌ„«“Šë²ôؽ{÷ÈÕó´Bî:sæL¾JïÞ½úé'~‚œ–䶬¬Œs£_ÇŒÃ)Gç}þ’váoû­¥„æ{q÷JØ~LL ¿ó÷óó“…_îšãšðññ111QUýgŸ}öàÁƒJ–N&¯{Îد]ûéêC† á+’Õ»»»³ðÑÑÑÉÉÉ¢qäÈ‘îÝ»sÊ>œŸ˜š«VøÛkkáâɾT;—ćüòË/´ç¥—^JHH…ذaâN‘üã1ªdgg[XX¨ª¾¡¡¡½½}¾ ¤Ü§NCk„lßÃÃ#_~üñGØ?wîÜ .°ð111YYYØ___oggÇo¼ »t±_ÿ½’ð—\k¿­ÙÂä¤Ç8%JÌž=›v®X±B~???n,° ÔRYY)¢è•˜7o9¶Z-'Ûß¹s篿þ¬4\W‰ºº:’Ò òu#%%ÅÖÖVö/[¶L?W\\üÇPæäÿbÁ©¿äîéýÿ »nÍþ/–¯¦Q,AâÉ'Ÿä9öeáß¼y³¼À®–ñàˆ“““x.3f̘³gÏ /,,¬®®®­­-**;#""öíÛGO?SSSÕæOFúÛo¿QÒÔøøxÙêKKKµkxxø[o½%BÓ·oßΫ 11QÌ6ïëëûì³ÏrJ‹ÿ¹’”Q\^Óî[s„ä¨W¨.$óÂöÝÝÝYé“’’dáŸ6mš¸ksæÌÁ# ˜Ñ£G«ª~ß¾}÷îÝ[ Á³ëóYô¡ªªŠüŸåååüú믤ôd¤Ôùçä丸¸Ð~þË—/Ë’êß¼y“Òܾ}»¼¼¼@+nnnƒ â²M˜0áôéÓ,üq 222nܸÁW$=644TLÝÙiÕšÿåä—)"|ÚqkšðG§s}ƒƒƒãÂ#sçÎK=Yø»ví*î³³3l@Z>gÎUÕ×××·µµÍÊʲM6NN®šÃÝ»weQÏÌÌôööæ óçÏS/àĉôy×®]¾¾¾dþ"%]º¶¶V)·úúúââbíÚ/ÖùÕÓÓ›?þ¥K—Xø¯(ÈÍÍå°"ÊŸŽ>ì¹ãÒvëÖmÍš5BøÉ‡É©0Ø<|øð?¿˜øzàåH²îvÜ+üo¿;‡çÛ¶O5âvCBBx ÿ¢E‹°À.`ÈÀUUŸÜØËË«ð!EEE555lκP[[K½qzTTÔ±cÇHG %***xñ,íðŒý…Z!õ³¶MJË#ñn¯­QÂo`Ø…Š}âÄ Q¯õë×ÓžW_}U®, ¿v"¨+‡‡àŸILLŒ™™™ªê÷èÑÃÑÑQÕ¨•vvvnn®&E/((hTn·oß.++Ó®ýGsssÙ„E`?Éÿ²eËxÖÊî=zîØõ‰w{m: ¿³ËƒesŸxâ ¹FTGÚioo'áíí-ßMºËxÔþiYYY© ×ÿüóÏSRRT]šäYu®&ȨOžœŸŸÏýÉÉÉ“&MâŠ>Òó´o®B¿Û~ÓEø—X¯ rΜ9ST„êe``@;ÏŸ?+±zõj,° ðOÆÑÑ‘}X sssrÈ¢‡””””——‹_³³³Ùáy®&Q'— Úµk%;zôhnnn‘~ÿýwJ³gÏžèèhíNMMåy>}||Št#>>þ“O>ý7n”_ì÷ööSw~ðáüȸTÒï¶ß~“çS ©D-öîÝK{úõëó(¯¼òЏ§ÔßÁðÏ„ÙÄÄDUõÉx;&l¹¸¸¸ººšÒÖ××—––ŠC‰‰‰BÔ#""”òOJJâÙõÉÏIãe¯¨¨¸uëeK™‹¡¡¡œÞÅÅåêÕ«ª¦4îîî¼’×… x>†JUYY©]ûé”×^{ëøÒK/¹¹¹Éo©´×¯_ç:~÷Ýw¼´–H̢Ρ;nnnlægΜÉÉÉid3W‚E]¤LOO?~ü8OÑùò刈ˆ={öЯ¿ÿþ{RRR±„Ú9<ÉØ©[Q¬*íªU«xÞQkkë°°09 &//W 1b·Ïè1ãN»˜EÞf›áŸôÆT*ÏêÕ«EOŸ>Í ìRç+RB¬Aü`qa <ÿoœœœÄËm™‰'Éf.Ö¥ÕÎ;w***ĉYYY,êªf.¯Ã« %QŽŽæX}^‡—TVή«vµ/†gì/ÖJBB¬Y³¸žxâ‰üQvþ+W®P.óáÇ{ôèÁ)çÎû84&%3ÿZm*“œÏQ:$ù¢´Ë—/§=3f̈xªØø'`jjªªú}ûö%”58==]GÛÔ××SAÎAw3×.ê………~~~¹¹¹b§RPöþȵk×´kÿ¹sçFÅ­ñÊ+¯xxxÈÚŸ˜˜XUUÅu\³f ›¶¡a—åvß$fe·Áö¨ðïvvãÅärò×7n —8tè|¯u™O üå ͳ°°PUý.]º¬^½šDºäQÂÂÂÔŽÀÕDYYI2‰q‰N:•ŸŸ¯{ÉÒyÚµ¤¥¥Q Q-pëÖ-þÚB ŽŽŽâ»¹sçR/Cúš‘‘Á] jÌ p²>}žrúõ Ùxl²ð81]ýã?Å£ÒêééÑNêÖ…Iˆ‰‰Ä#¿€¿ä¨k×®åHu%æÌ™¯V}“““9`þСC™™™Úó'Ãä-ÂÏa9§OŸ®©©i°Ì<±ÏÑ£G5åFËý}麻wïspp =ãÆ }”Áƒc]€¿+®®®jÃõ‡îíí-,·´´´¶¶–<¶ªªJìÌËË;wîœêT92b -õ âââds¦¬®]»&‹´KªIÔÙÌy†O²zMZžššÊ3íß¿Ÿ>kiê_P/ƒkA½˜Ý ž>}ºX¦ê矖'½‰¥4œÿ±cÇúöíË)ß™ùÞåÈdròVÝHøOû†pD.̵±± –ðòò’ï{HHþ(þÚ=ZUõ{ôèñË/¿(™¹<ööíÛšDýâÅ‹"lþêÕ«Ô›`3¿|ù²œ¡®_WWWVV&Q§€_õ«Š:™ùÙ³gÙÌ©£AÝ ¹?rãÆ ì;‹ŠŠxF ²îââb¥ >õ,ÄÄ>J¶OYÉÕT Ùò!CD`?ý* ¶Øÿí·ßòŒýV%¶Yy%µ 5§¼•6~Û•_ÓµÈðåòtíÚ•vÒM¹,!/°K]?ü]ü ¶²²RU}rÑ+VH—>„ŒWÓ@Z’Øòòr‘266–Eý·ß~‹‰‰!õ«ëæçç‹dtŠêb» UGö¿òÊ+œrÈп÷IÎ.kÙ-<.ƒ§ ’»‹-¢=óæÍ»$áçç'/°ëáá¿€¿.¤sÆÆÆªª?xð`:¤»™«ŠzUU•’¨+™9%PZ‡WäÛ²¨S—:déÔ•à™6…™“Ò7ØQõÐÐPì'<==srräZkïàð bÚ_õ‡……M™2…[uàÀÔ¡çºŽŽ¦4œÛéÓ§û÷ïÏ)§¾5ãbXbRVYKm?lÛÍ£0ä«Syh'Uü¢ÄæÍ›±À.À߀äädsssµáú¤|e’””äåå¥v®&Hů\¹R¦„„§Ê\»vMΡ  @|æ¯tï¨WWWËY]¸pê(ç_SS£c†/T¦•cÇŽ™˜˜p Ož<™º?²x'&&ŠùB©ñE`ÿëÑIy‰™¥Íß,ÞCy.\¸P\ôäÉ“¬ô~~~o¿ý¶xÆŸ]XXÈ¡\êô€öµ}µ1<‹/ÎÈÈPõU’awÑeNKRe___JO­I€ÝÝÝûí7ÊVG£¦ë:tHSn”§§'}н233SRR4eH]•ƾ٦N‡vç§nÅÿþ÷?ØOîM•’µ?==¿¡ îçŸ~*û¿ÝøSBFi37ʇr;|ø°¸œÝƒ¯¦N½ð(½{÷ÏÃúõë3%++‹ºrÔ=ùtdxöu™‰'kñÕøøxRnЪEÔ###Å@ZòCM¹Ñµxª7772a-EMKKãp}M¹‘ºsLN@@@ƒ¢N:Í#vIzµ÷GbbbtiLºâ¥K—´ôGd¨«Eª/û¿ýö[y}[j½¼¼<Žt¢”tS8¥Ésƒ;ìŸQÒ´í°»7eB&/_k̘1<†7@‚šZ~*35]QQ¡cPhcHó„Ôýë_ÿrrr*× uöù#GŽ(‰:I è*ËgUUUÝQ@ÄÎüü|1oŸŸŸêÒZÅÅÅb -™'f®]»FšM?ÅžÔÔT1¿&Qg3çŽÆ‰'¨âô âW^2˜’¹ºº^½zUKKÒµx]½\g¨¯½öš.A9È*NyŠûåÀþ‰o¼yæBä•ô’ÆnŸ.]þ`ÂÿwÞ— âv=ê/!:#ÄóÏ?ŸÙYYY ôm/ü„‘‘™¼Ž²ZXXÈ;„··7‰zYY¿3WkæJSÜЯšD],­EyR€/AfNÊ-›¹×§ŸôYu¡ßª¢.¹¸¸$''Ë5ª®®¾§€>Èý1Ã?uL®_¿®Ô†òš$ðr­)ñÍ›7é§ö–”8#§Æ “ˆçûï+û»uëÆýó[E¦Å¥•è¾ zîÁ²¹›6m™oݺ•ö¼øâ‹~bjj*ž kkëLÝ ®Ÿ¦™Z@» Ïž=ÙùÉouG••åááÁ’/¬X鹦´ª¢N *ÖÀ à·ëªf^[[+Ï®ÏÐÚ/÷GÄÒZ,êÂÌét!9C:ªdªô«,êîîî\Mê‰þˆøn‚M®5õ r£Ïr5ÕöžV¯^Ý©S'^wÉ’%Ôwµ?--MöÛØØð„™ÝºõXm¿16µX—Í÷ò5 çLý ÚùÅ_øJP¯MîrP–ŽàU?@‡þ7ð„-䱤¬:“pèÐ!777òRy¿Z3W+ê┢¢¢ .°¨³™ËrP–ÜîÞ½[]]-Òçææž8qbçC([Êœ.!P5µÌáI‡H_Eâ+W®ˆ¹D!yµ/¹¼°¯jï†ökoÆÔÔÔY³fñíèÝ»÷ÆC%ÂÃé:Üž¤Öbn¥AÏ ÞsðxƒÂ¿Îa%=z´œ'Ì¥ŽÕy‰+Vˆ§ÂÐÐ0³ñP c0/@þ‹/~ðÁüëÞ½{e×mšoSUÔCBBd3§Â¨®{¥ J)>%%…ú#<ÂT»™kõ²²²ÀÀ@Ñ¡.€œ!UAûðU¥jªÅÏÏoÔ¨Q|† FÝ(YÑ£¢¢ÊËË97’ó矞SNxÝÜÃûRLJ‘¦P2‘Õø›sbff&žŠwß}7³IÀù:¦ð_ºtÉÊÊŠ÷lذáúõëM³}Ÿ .è>§%õ‚ƒƒ ÕæVPP@¢Û¨ª‘mR¯ASñJKK5±Œ’¨Sy¨?Bò/ö¨iR6Ø™¢>…ìŸ={6¹}ˆD||¼ݼuëVì'æ~¸00<5:¹Hi Í10x0«ÿñãÇE& , =³fÍ:+áååe`` žŠmÛ¶e68?@Çþ   U«VñN;;;Ëk‡ÛîÙ³GQONNvvv¦ôyyyjs£ýtôðá䑺ԋ„üÈ‘#gΜÑT<:Äul(ê¹PÿESñ¨Ÿ"ûuïàPD{æää,_¾œû;wîlccò(iiiÜËàÀ~žo‡Ä~™Ýÿ¢’ åm÷>w:Ô¯_?ùôÁƒŒáݲeˉM›6‰GB__?&&&³Àù:¦ð,–––7nÜh‚óÇÆÆò\-¢ÎfÎ]RPùôëׯ‹Ïåååòt=Z–Ö"‡'“ç”T Me#{W«ê³ððaíý‘ýû÷§§§ëÒ씌SkëÒŒñññÓ§Oç{DÆþã?K„††ÒÕE`¿X×ø™gÚ}82©·¹>˜fsÞ¼yâÄsçÎñxcÇŽùHXXXˆGbÔ¨Q™Í¦Që €6þË—/oÙ²…Ÿ$ô»²²²±ÎO¢NyŠïe÷“Íœd¾¸¸XœEâ´¤âÕÕÕòo1#•P)^ˆ‡……‰e¼Hªå’PŸåÖ­[r'"11‘× pvvÖ$êä«Ô[áp}ê¿ÈVUU©­æñãÇÅäùªP P®‚R†Ú¡¶2dߩѣG»ººÊÚÏk‡ñ%èŠI5ÇŒ›pôT`DbAï'ûÒ¯Û·o§¬^½šöŒ;ÖûQD±f͚̖ ®®kPø‰ýû÷wîܙޒCfddåV6ž¢¢¢“'O’åþòË/”3©¾XЊþêÕ«rbÕ9ì%ñÉ'Ÿˆç¡ÿþ™-Ýü¹tLá 9þü°aÃ8™££#™deS‰ˆˆ 饜u1sÝE]3W‚ã…Ä)YYYÇŽý’v-f®½?ÂÕdÃ?¬@¬ ¬ÔÁQ;|€®B×ÒÞŒ‘‘‘S¦Lá;2`À€íÛ·ËÎF­Á¥-((04|0?ÏêÕ«EJO{xòQ^zé%ñ}ZSn‘‘‘b ±Ž”””P]´·!•Ñ¢E|üq{{ûKš¡;È·ZÉCâ7ÞÁ´iÓ2[**þèÚ~?,0`ÀÉ“'5 xx¸ŸŸßðáÃEH?ÃW51iÏÑ£GuuŽxY“os U­¶¶VÓ‰$Þ¼Ú×áÃ‡é¢šÊÆ#på´˜9>v옦ÜÈ·y qnnnƒU£ÂûûûSúôôt]š‘nÖk¯½&:n»víR+ü<æwúôéÇ%®\¹"?›6mj áץ֠ʼn‰‰QrþÞ½{»»»k~"""bîܹœØÂÂâÚµkÕßdÊÊÊXnuµp`¿ÈÜR¬çEeVŠ"í$忣TA¹t]ÊêæÍ›r&22’»šD]˜9qþüyêtˆs)¥þ%à”§NÒôÆ› ,:AÔãÐÒQÅÍÍÍØØX Äöôô¼ø(C‡¥Ck×®=¦ ((ˆ  ?Í\`W ¼Âhc’““…%Š)÷íÛ§EøIƒ7lØÀ!ý&&&”ÇÕ7Òiž*G­¨7ˆ’¨_¹r…E]¬+f×Wkæ·nÝYq¼Ü ä¹:eQ—ÍœJž““#WG„ëS'BîQ2®&eH½*¥x!±¦žYÎútE*§ö¯TJJJÖ¬YÃÁZ;w^¼x±¯¯/Û¾··7ß2ú\PPÀýòË/[v]MPñðçÐ.dgg‹)_rE2O-ÂO7>ñÄN‚J:Jf[Ý<Ùx8 i \M°¨‹¬x \õßÿ??~œ”[¾"õÔŽ'åx!‘¬¨¨ÈËËKˆzJJ •;Tf9CµsxÞ¾}»¦¦Fµšbü•öĉœ?›~‰ù«¹šÜ»ÑÙõìÙ³ùVöêÕë»ï¾£›9•“J+Žjš]_­¨ËÕyRQ©Àr!寔ªIå×Þ’£Gæ»C7÷å—_¦œ•öìÙ³tQù¦Ÿ;w®õ„???híëüfffJοnÝ:-­ÀÚÚšcEŒ©ƒÐ"¯úÉó½½½YƒýýýuŸ*GˆºüF=''G6s¥wæ Â4jRe*¡.f®]ÔE5ÉùSRR”ú# Ne©ÔQËzõê%îirr2E÷Ž:SÇŽ£nš8Ô§OŸÌV“s´/äÕæææ=Ê×_­]øcbb~ÿý÷§Ÿ~šÓ¯]»–ßf×4›ììl1—.ÔØê„«ÍÖÏÏrnTVäÉš Y\\L?•õ‰ªªªDùùùr†¤úÂ@Õ$í×T<:TZZjggשS'êÐ]½zõĉ,ü<Œ—ùøã[[øÛq­üÖW,°«]ø JðþûïsúÑ£G“Qó«þæk||¼˜E³±¢ÎýJòšZ¦Ê‘ÉËË£ëîß¿_Sñ222~ùåþjC—"ñðáØØXMz{{7jüUî…Ú¬ä 999¾¾¾'OžÂOÝ´V]`WêËàï  #`cc£äücÆŒñóóÓ"ü± H¤»uë&Fò¶Ô«þŠŠ 1—|µ kàÞ¸qC~£.FȪN•£dæVDW×ò†ŸƒðhL¢Ëq-’’’4eÈýrr]ª™’’Bí¬Ú‘¿&¸}û6uǨ.^^^²ðËóóR‘ üÿxRccã#GŽhþ¸¸8rÚ±cÇÊ#yÙ·k› ©5¸vQ×Ä;wäb¤¦¦²¨«.õK ý‹‚‚¹·nݺwïudÄžªªªK.­v qbb¢øž‚ÔWΰ^øµ¬¬Lt45U³°°ðèÑ£ïD7EœNu#¨ÃE}ŸÓ§O« ÿ„ Z{]?@GÆÕÕ•gtlÞ¼Y»ð_Qðí·ßêëë‹‘¼ZSÛ7 Q§ 5ªFT ŽxQKýò;s6sê(™¹<ì”´_IÔÕ4Ödæ„ü^©[DÕä5ÂT«)¯öåççGו;#¢„´ÿüùógΜÑ$üÿ÷ÿ×Ú ìBø:8äÃò/Œ­­mƒÂOn9dÈ1’—˜œ–”¯E´ŸÌ™E¬8//¯±Ú¯$ê¤ÍìÏb^ª¸&3WBIÔ³³³E&Ô8äÛÂÌyUbñþöíÛª¹ÑNùºÔÈb©_‡‹ ]Kmg„2§òŸ;wîìÙ³š„ÿûï¿—ïihh(„àŸIQQ‘˜Î]0yòdRJíÂO$$$|òÉ'|Љ‰ ™';í– ²²òÂ… ¬Ó$´$½ª‰:I²Èz *¿‡WÛ¹yó¦Újržô“V$àž”¨TRRUáüùóÚ…_¬ÌE :4³MPÛÇí)¥•••’ó4ˆ²AáOLLtqqyæ™gÄ„?ÔƒPrÚæPXXÈ¢þË/¿„††6jBK®šœ[II‰îf®‹¨ËfNP‚Wûb8^H®&‰:^àõ|•:#tuJàï﯋ð‹iT kkë6°ý¬¬,ü)td•œßÀÀ`ÿþý ?‘””dkkËQýFFF”Õ}ÅëhRÖÑþäääðÛïÔÔTkD))½¦±W¯^¤Ó÷Ž¢mí'–gÂdI¦Ÿbn:JiäSHõE„Ì;wä’ÄÄÄðhYUQfN ¨îªïá•ú2Ô¿3‘„WUU)µ-í¡ýœ€ž$Yœ+¦|¨‡ÜXá···ïÓ§|ã¨äm#ü^ÚÕ•¹ôõõ¿øâ ]„?555--íĉâË333:Jz̲Ý"ÐEYÔ©'BÒ.‚ü鳜ŒÒRª•„ßö3äáäÕ¼‹º0sÚI‡èW‘˜T_In)ºŠHPPPàááÁçŠx!úIŸùt”Òˆôrg„ÌŸš7444$$¤Q¿wïÞáÇ+ݲ¶Y`—(**Ÿ À_òÒ.]º(9äÈ‘#É9u~"==}ݺu¤tb§ND„,ÛÍAu]Ì\ %Qkàþ¢€>Я´S¾"uX4MìC×¢+Š”Ô¢BÆ.ú&´_mg„NÏÈÈWÀÂïêêúúë¯÷ë×ÏÛÛ[‹ð»»»Ïœ9SOOï1víÚÕ6¯÷kjjð÷ðWDí,ýÛ¶mÓQøIbÉ]ß}÷]>×ÈȈWéjAí'''V5së¨$ê¼´A”¾)hpO¥¯0jkkÃÂÂ8ʈ~Òg^BK©3Bg•””DEEEFF²ð“Ïøá‡ìð½{÷Ö"üK—.•WÔŒ5ªm&ç!rrrtŸÝt@T•òí·ß&GÕEø ÒBÑwèÕ«—““Ó}Å;vÒþ›-MLLLcëXUU¥)·ºº:g×/Wª²²’Š~Š=rg¤¦¦æÊ•+ÑÑÑBøíììºvíÊ 5kÖ¬3gΨ é¡>×sÏ=§z_úôéÓf/ö™FMm :&!!!ÆÆÆª#yIãu~^›ÉÙÙùùçŸçÓ)CûCkZPøwîÜIËÉÉÑ¥jµµµ$ÕTM¹QÝ)îKýòðaÙðr¸>}¦&Š¥î ?5ÎÀż¦®®®jcø=:aÂUÕ×××_±bEÛí ®^½Ú¨Þè°ÁªÎÞCü÷¿ÿÕQøÛ¶m“ɘšš’Dz'·”ö“óL8^^^ZÌ<,,ŒÃõIé5åF*Îý”¸Á¹h¨vº_^^.g"‡ë“óÅÇÇÇÅűðŸ?~Ê”)Ü ½{÷Þºu«ÚA»gÏžýè£Ô†ëO›6-444³mÉÎÎÖ=t ü%pvvVÉ;dÈK—.é.üÌš5kºwïÎ9˜››skóá…tYû©l¤ÜJ¡âíÛ·ÕRÉåsIb9ÖHìá$uKŸÕ¶Lii©§§'¥Ù»woxxx]]8]î&\¿~=111!!…Ÿ:‹/f‡700øì³ÏÈðÕÎÒóí·ßöêÕKUõ‡êîîžÙædee5veað—€ôXu$¯¾¾¾­­­&áש¯µµ5OãCÌ™3';;û?þh)í¢NN‚-Ìœ ™_Ú“WËfN’/¨ÈÅ d¤ñ”HbO™ˆdòj_ô”^î;ˆêtP•“’’„ð;::ŠEÊÞzë­³gÏʳôá§‹ª®†FPwiÓ¦M™íÄ7ð·ðw¥¾¾ÞÎÎNUAŸ{î9777Yøu!**jñâÅÔeàL,--©OÁ¾-¿fo2ÑÑÑ,êT6___6ó3gÎÈf®ô^Àïˆ4tŠìö<@˜3÷ðð(,,”ûBõ)çÜÜܤ‡ðScäÈ‘\ß_|qÿþýò,=Bø©jÃõ­¬¬èÒíeûªkŠ€¿d¼jƒL>úè#r×´Frùòå÷Þ{OdB¢Ë±ý÷îÝ#å¾Ý22Ri/u ¼½½¹S@…¯­­U«ú´ÿÊ•+Q_}õ•pøÿüç?Ô¡ˆRǾ}û^|ñEÕ¶êÓ§Ï®]»2;×®]ÃS d4 æ500X²dItttbS ¤Dx¿‘‘‘••UHH¿ð¿ÛTH×y®ƒòÒZ7oÞ¤ly^OOϲ²2‘˜.$bxxôn¤õwÈÅ>|¸‹‹K¤:Ξ=;yòdµSn®X±‚:8Äö1'Ð ³ÚÁ¼¤ëß|óMB3ˆŠŠÚ¼yó¸qãDžt!áßnܸ! ÿرcÂÿ322ädBõéC~~~¸„pø®]»R ÃÕ´páBµáúÓ¦M Íì0TWWã1Ú!WÌË#X·mÛß<Ξ=ûé§Ÿ>ñÄòþ®®®M~á_YYÉ1<{÷๔Tÿ¾â+ :öK—.}òÉ'ìðô“>Óž0ulÚ´©wïÞª­1tèPww÷Ž£úYYYXKèHvv¶ÚbäÈ‘‡ºÒlœœœÞ~ûmѳàPŸ˜˜6ÿÆRXXXSS#~•U¿®®.666DbãÆ"\ÿ7Þ8uêTˆ:80lØ0ÕèÞ½;õ2;¹¹¹·o߯s é·¹¹¹ZíŸ8q¢O\³ Z³fÍ AƒäPGGG1«Oå¿{÷nZZZ°Äþýû…Ã0`ûöíÁê8wîœX]W)\Ÿ{%ÊöKJJäZÐ(LMMÕjÿÌ™3ýüüâZOOOÊMŒíåÕ»lllüýýu79\¿°°0HâäÉ“œóã?¾|ùò X[[wîÜYµ²o¼ñF```‡Rý¬¬¬ëׯãÍÇÕÕ• \ÓKïK—.ŶßÿýôéÓ Ä%ŒŒŒ,--©uuuhFµªªŠ£ôK—.?kÖ,ŸKêøá‡úõë§ZÇþýû;;;gv0rrrêëëñd€–‚ôÒÑѱK—.ªJ¬§§÷þûïŸ>}:¦åøõ×_)Oyx/ðurrÊÊÊR«ú·nÝâõ³›7o~ꩧĪX‡º¨Ž#G޼úꫪõ244\³fMfÇ£°°a< 5¨¬¬\»v­Úi|ˆéÓ§»ººF·(Ç_ºt©ÒrW¦¦¦TŒììl.Ù/ið‰¼üòËœ¸W¯^›6mº ŽS§NÍ;Wí”›´¿£…ësÝ<‡ U)**²²²zL¯¼òÊîÝ»£ZšsçÎÙÛÛ›™™ ?722¢Â”––úKœ»víꀪŸ““ƒiö@»PTTDš­)Èç‰'žøê«¯‚ƒƒ#[Îß÷!ÞÞÞýû÷çÏ=÷)½¯:Ž92aµ£­­­“’’:` OEE…øËAjmiiÙ©S'MÚß¹sç3füúë¯!Ï=õúõõ×_ç_.\øÿþßÿS½Öøñã; ê×ÕÕáQ]*++œœLLL´¼ðïׯßÊ•+ÏŸ?¯»ð{=„…Ò¤Iööö}úôQͼÿþÎÎÎmž’’¨>ø;A®neeedd¤ÅüÇ¿bÅ Òø`Ípʱ¶¶æÈ|ÕÜ ×¬YÓÑ^éWWWß»wÏø[R__ïììÛ×Ò¾F2«V‘2½ë•aËRŸ¬à¦¿2?yyªFÔãåžµòظµiEQEQT¾×˜Õ'›¼>F‚ýîÝ–'çŸ<ù¥L—gežƒ¦ê?åV\È‹ìììråÊ©áÔØ¯ç„ ŸREQEQQAá‰ÚÉ<¦ÁL¦Ë³2ϸ5Ç/÷”Jh¤V8,))IÿþqÈÜ­S6Ÿ¡(Ê¢¼» zò™¿åªªÖknÚT䚣SúÏX«-"k¡«)ç,㸵³ÚöíöjMõºÇÛ ÛF—R%÷?”¶“M?Þ×ÈtyÖ§ýT™³¡ow¾º‹|¤ÆÒs¯TŸ±å,EQÆòé>(·7FþÕZ¦í§ž¹N[Dž-±=2i©ôŒtƒÍÙj\Âþ¿·èàÀàì2$ú© ÏY{4õ ¢o©XQ«ŽKžoÜxä/¿Ü3 f2]ž•y&,O÷þUÃwá07·‡_ ñ}'4vÛgE«uà`õJ)_á9{ªZýæ¼P¥–,.?-¦]¯µ,k)™ÝûVÈ­¤+lNU£l/?´çvpv:Uÿ’iÖ>HZÒ^Ï7:ÐÃTI«A““$̇†.¶‘ÍÆŽ])óôÜ$óÿïÓÕK&!!à ¤¥¥éß9Ž[¸=nÇyŠ¢ŒÕæíßm¯\µ–ÃhÁÉØÂˆÙ´Æe-%¼{¥+lNUÎò|¶_ßû-‹§Þ?O=+édªD•ÏyæÚˆgÚY=ß™#ó{¶hϵzG±±±j¹>ûÂÂÓ)Š2-¿ ‰ôŪµnäéŠÏ™¶0zîÆ¿ÌƒBKx÷JW0Øœªœ]ú{pÓö–oÙž¡fƒt2U¢Ê»u”„ù ¾¶Ïnܸýûù›•ùß6EEµråÊ‘]á€5Šz·_ºûsŠ¢L«C!Ú+å¥×j;ÜÈ_ï~c ãçmÒ—µ”ðî•®`°9U968e?ø“ÍŒ¶_ò“N¦JNÅo=­ÀŸcBÓ.È·)mò’ú“1²²²ˆ¯È-ý v;÷¶bߊ¢L«cðƒDúòkµX|büf)×û GZÐþ9}ù.õ¬Ö¸¬E›2jFíFoÈœR­:šµ2ÇUÈ"2§¶ˆ,ûö ñsÖd{{mO“ÇÒ¸¶.Y\¿Ij­ñ¦ovÔ—ölÌ#»£-"%Uãú’‰²"YµÖ²"mÕ¹ê^Y—Úwm]ùÞcú¥TWèÅ1ÕJ:P¿;Ò¾êiDšÒÏ,ÏÊ6è·§ ºú§Ì¬cÆ££m¼¬B;42Ũ°QÒ¦Œv)óh/ÛóPT1«é ‡$Æ÷í;?Ç„6bD‚Ì9÷÷f©ÒeTZKMM%¾"/ߨ8.61å"EQ¦åßk¨öJy¥ZÜ.;ea’éUJTSjYKØä®•ÜŒ37kÕÉZû²ˆ4e\DÚ‘MÑV!Ïöc±ˆÅ ³Vî6m\&ÊS¦Ëôº½MwÙ¸¦ é;ûÖZ 2ÝZ#ô˜Ô¸ØU¦KÉN%ì<­õ˜ÅðІ֫¾þ½ŒGVÍ/ÂôYkœÛ]PcLØ9ÆÔ˜·`£‹,*~ãÏjÛ †E•„Š|/Ybüĉkí8éz«Ì9.f»,õÜ‹¯ª`||<ñ¹’­ÿ³dÛÆC_ReZ]{Ó^)îÕëävÙé‹·a½,Õ°¹¯z‘†††’`‘+úÿèWïJÛòñ%Š¢L«û»ÿ«Õë8ÜH…gÝL[˜¹t«þÅ(ë2]µ˜¿v¯þ©IqkÔS}†FZ<õê ТAµ%ÚOϦÞ2³lƒ_×ÞòÀ8C ßÎ ¤ªeeEoÕ7~¦¾Ùµ{Ïj‹hK韒dʃ‹16õ¶Ö½²ö÷§´cºï²ê)‹uå±ÇŒû5zÚBõ”ñàê̦ºWJºNÿ””¾3eNÕ¬~)‡wA1­Y‹gÕ¡‘gõÇZ¿ ±OòRj;-v¢Šw…_+1^Â|Ž!mÓ¦#2§Ì/K† W¯ú   ,rÅâšœ;Ž^¦(ÊZ½¦QÕur,ï¶hYKžµ˜>{ÙÃ[«ÈŠŒ Ö÷j©=Û7l‚~º4e:]«)Ÿ©Ü¾rûQã–ü~ÉD¯–¦û«f0ÝÕ‹ËÌ6–ÒïHXä,Ó¥+ì?(ÖúÓbßóÞcjóL÷kêü‡ ÜbcôÃÆ¸kª7„4bñl‡n½M‡„c» c¦ ZcjAÓ‘éX©qbzì(ª×Ð1«%ÆK˜Ï1¤mßþûý¹ú |_–2nºzýzyy‘`‘+)))jü”.]f÷ñ+EY«}‡çê6»¯yÔ56RñÙçMŸš·b›¶”Ì`ºöÃ'j3Èf¨‰K7¦ØX—Vº÷Ñæ‘Œ["fį5]PÍ k1>«6ØbÕÚRòsíÎã¦ÍÊê\Ì«¥i÷JËöµº­ÎŸ³XZÓo‰Ã=–ã~ù´õ7mYí—ÅþZèŽ1Ó«V~þêu4*ê=~±P%­zö™/1^Â|Ž!íìÙ+2g—î³d©±Sæ>ü^»; ¹’˜˜¨ü‡Ó®Qe­ú ¡½Xª×¬ëp#ZÖ5¶ðþšZã]Þ~×tA5ƒl†š(íh}ýdºµRÛž-ÉË ú.Êq{Äš-ŒËÊžÚߟÑï-ÑÿUEZnòºÏð(}Ëúr¬Çæ,^§–²¶%²FÓá¡ökܤ÷l *ýa- ƒîس1Ý’m~xcw³¡¨b_]cs¼ë–F»÷V‡ŽSõ¿…„›› ¹’ðð:*}ôéWEY+}šu¸’-¦/Y³Se*ÓMgPÙϲj{¶$/3¨.²“ì”qYýD{jÜäÙê„ÅþvyçÝ­{Oêgv¬Çô±<·×ö~Ùn9ºccÌží,µå²UrÔø•B•ÌêÜ%Fb¼„y;ÿ›­&ÈRsß_OàG~}ÂàÔUŠ¢¬U¯?N¥¨æQ×áFÔi0Ó­~pÖ„¬ÅtAÓÔ -öœb$eÏ–äeÕEvnì”qYýD;kÓîOdqÙcò—)c&½—ÇSÛfíèØè1Ûûe»åü=èŽ1{̱¤ýf;pˆ)ªØT—ÀYvžÒ£þN3d©I3ø‘/çðÿõ™J{>¹BQ”µêÙïá÷+nD}i×búü?¾)k1]Ðt†×þQòl~mI^fP]dm/ìé^öEÕºäãácßl篾qüà&# Öæ¥Çdqm)iÙÚ< ›RL‡‡íý²Ýcù{Ðcö,˜ãzÕá—Žâ— U’«w¿ãI·óK»ÝgÉRÃ#b8‡ùø{¢ìÎcEY«wú†© :܈ºŒ¤Åô9Ë\ùPÖbº é -ÿ¸ÚI¿áòkKò2CXd¬¶= ¼Z:ܽ²§ùr¼ÆÇ,VW•ŽÊK-Þ°?ÇC?5>ÑtÛû¥ž5=îù{Ðcö,h{¥ê(äå…CQŦúK°ó*=œ•9ßô¾,5dÜ ®Ò‡¥§§ë?ûàÈeŠ¢¬U໲Y•unD ?Æf-}©d-¦ šÎðî° .†ß´¥µ5ƯÝ'«“¥,Z¶¶%y™AÖ¥®9o£dkÛwí-Û³~ßgÆî•=µ³3'Ç­‘¥¤5éÓÆN[dqÈî1ueûåÛŽš.õF›Î¦ÃÃö~©gM{þtÇÆ˜= Z+YP¥}é~‡P”ÔðˆuãæÒ´ëð÷š Ku Là‡Ã,î´»"ùÔ¦Ã_ReZ]û<¼Ó®Ã>^ §ÿ*UzÐü=£Öœ¢(Š¢,jàüÝÞAáõ|ß®ôЇ”êŸpœ¢(Š¢(ŠÊ÷ê÷þQŸ€YÚçüª¼;ÅÈô7ÎÐ ËÇû( 3ùų¯Õ÷ýcEQEQTU»~K½ZEIÔ—ŸòX¦ø^òÿt'ópö> ôr=â…ºot™±½çÂTŠ¢(Š¢(ª «yßi¥ÿü8çAJOO×{W”þïÇ«·ö£(Š¢(Š¢ ¨÷œX¡Š§ÅUƒ‚‚H§(iii...À£ãããC.EÁINN¶øœ…ÆÏÏS÷Qí‘‘ÆË  0¹ººrÞ> SJJJhh¨——¯>€‚ãæææç盕•E ï´K^Ó ð ð ð ð ð ð ð~~~~~~€À€ÀÀ1iii~~~^^^ÙÙÙ~ xÈÊÊ ù“Ž««kbb"(êbccË•+÷'3^^^iii~ (JIIñððøSNBCC³²²ü@Q‘™™éççgÌöeÊ”©Y³¦qz¹råâãã ü€“ËÎÎŽˆˆpqq1¦ú6mÚ;vìòåË ,¨T©’qÔÔT?àœ’’’ÜÜÜŒI¾J•*kÖ¬¹¬“žž>xðà2eÊgÈÌÌ$ðÎC¼1½—-[vܸqV?~ÜÛÛÛô Ÿèèè¼_º“ÀäQVVVxx¸é·q»uëvúô錜$&&V®\Ù¸¸»»{rr2xT\]]Y½fÍš;vìÈÈqãÆ•-[ÖØ”º’bbbÊ—/o\‘§§§ý7ç%ðvJNNvww7&ðÊ•+/_¾üJ8sæLß¾}M¿bÏ>~ G¦·Í-[¶ìÈ‘#ó~mûöíkÚ´©é¥;ccc ü€ÃlÜ6·mÛ¶'Nœ¸ZX-Zdíæ¼)))~ ·’’’L/¹Y¥J•-[¶\-t_|ñEhhh®nÎKàŒÒÓÓ½¼¼LÏá™>>¦—Ü ÿªXHII1½¬¨=7çЍììl‰ô¦·ÍíÔ©Ó©S§¾*^V®\izs^www7犢ÄÄDÓKnÖªUkëÖ­_S_~ù¥¼Ç1=ÃÇÏÏ3|P ¤¥¥yzzš^r3::úz =Ю];Ó›óFDDXÜœ(*²²²BBBL¯Qß«W¯óçÏ_/I6lØPµjUÓ›ó&%%1ZP´ÄÆÆš^r³~ýú¸^REFFšÞœ×ËËK»9/àäRRRLo›ûôÓO/Y²äëO‚}ïÞ½Mÿðš••Å€s²qÛÜ¡C‡^¾|™´¯ìÞ½»~ýúƾruug,À©h·Í5½ä¦Ï±cÇnÀŒdû§Ÿ~š›óÀ™%''»¹¹™Þ6wõêÕ¤zÛ222 `zéΠ  .Ý €G(==ÝÚmsGM˜·ß±cÇš5kfzsÞèèhF YVVVxx¸é7Oýýý?ýôS2¼V¯^ýâ‹/šÞœ799™Q€Â‘`zÛÜÚµkoß¾=ypåʕѣG›^ºÓÏÏ/##ƒá€‚“ššjzÛܧŸ~zÚ´iÄõürúôi‰÷Üœ…FR¨µÛæ8ðÂ… ¤ô|·}ûvӛ󺺺rs^ä#k·ÍmÖ¬ÙáÇIæjÚ´iÖnΛ––Æà@^¤¤¤¸»»Óæ³Ï>›ð Å… úôéÃÍy222LO#/S¦LXXØÕ«WÉá…lïÞ½ 40½t'7ç€ý²³³#""Lo›ûæ›ož9s†ìý-X°Àôæ¼Üœ9JII1½äæ‹/¾¸yófò¶3¸zõêÀMoÎÀÍy`MFF†ñƒý¿üå/QQQßÂÉœ8qâÍ7ß´vs^.Ý £ÄÄD‹ôøÎ;ïœ={–tí´ä½ôÒKÜœöHHH°È½zõ:wî¹ÚÉ3æ/ù‹1öûøøps^˜þÇ{L"2aÂBµ“;{öl@@€éÍyÃÃÃ9ÃßÕÕuÕªUõêÕS§ˆlܸñ;8·äääÚµk›Þœ711‘@à×GÄC÷͘1C]·ÇÛÛûèÑ£äj''‡ÌôÒžžžÜœ€ÀoøÅ¾}ûÞ}÷ÝÇ\;Edذa_~ù%¹Ú™]¼xQ™éÍyCBB¸9/_øß÷Á´jÕJ=O®vrüqÆ M/ÝË€ ðëÿG÷-Z´¨jÕªÚ<õêÕÛ³gÏM8·åË—[»9oJJ ÀÀ¯üß7a„'Ÿ|R›³sçÎéééäjgvýúõáÇss^¿_ìÞ½;00°téÒêÒ_ý5ÑÚ™:uJ”eqéNnÎ @à·üGîÛ¼ys“&M´EÜÜÜV¯^M®vrëÖ­3½9¯>nÎ @à·ü©÷ÅÆÆ>÷ÜsÚ‚-[¶<~üø-8·qãÆY»9ozz:¯¿>ð‹£G†††>ñÄÚâ ¸|ù2¹Ú™?>((ÈÚÍy¹t'ß"ð‹½{÷vèÐAµðÞ{܇~X§NÓ›óÊxàE@à×þc÷­ZµªvíÚZ;5jÔØ±c¹ÚÉÍ;×ÚÍyåàòÒ(á‡}døß7cÆ ý¥;/\¸pNìòåË¡¡¡ÖnÎË¥;JZà¯WoØoŒ‰Ym-ðòÉ'2[ïÞ½µKwº¸¸Œ3Fr#ÑÚ™ÉAlÞ¼97ç ðKà_ºô@Ïžó;t˜¸ti’ià×ìÚµËËËK5›˜˜H®vr+W®üÛßþfŒýîîîÜœ äþ5kŽ-[v|âÄ}~~³‚‚flÜø¡ià?qߢE‹^yå­ñ¦M›JƒäjgvãÆ#F˜Þœ×ÏÏ3|JBà—´/w*&ætÿþ»š7Ÿ2hPÜž=MÿÉûF¥.Ý9pàÀ+W®|'öù矷nÝÚôÒÜœ xþøø“RZàŒ<7räçÛ5š0aB™~qðàÁ®]»ª3çM›F®vr|ðµ›ó&%%ñÂ(®öì4­Tà0àËž=¿lÙrCƒ“gÍJ4 ü§î“ Ø AuføŽ;ÈÕNnòäÉÜœ DþiÓΨR?88ÃßÿZ›6_4j´²mÛ Ë—`øÓî‹­P¡‚¶Æ¶mÛž9s†\íägøôèÑÃôÒ¡¡¡Üœ ˜þ¨¨ÏTYþví¾nÞüÛ .Ô­ß½û´-[öšþO?ýôرcƒ ÒNìwqq ûæ›o²àÄöìÙcíæ¼ñññ¼ŽŠMà7î¼¾Ìÿ­5~¨Rål­Z3žwøpª1ðköíÛçãã£V½lÙ2rµ“›7o7ç(Þ?,ì‚E™þ—_¾[¡ÂO/¿¼yøðÖÿéûV­ZU½zumêÕ«'«#W;³+W®„††º¸¸cPP—î(êðà‹e#𻹗•÷À/Ž9¬ÝõIr£¼øÎmãÆÖnΛœœÌ‹  (þ   ÓÊ{à?{ß®]»5j¤rcRR¹Ú™}óÍ7¦gøøùùeddð(Z_‚½µÊ—ÀÿÙ} .|þùçµ­jÙ²å‰'ˆÖÎìÂ… o½õ7ç(¿}ûëÖ*ÿ¹ûÂÃÃÕ¥;‡~íÚ5¢µ3Û¾}{µjÕL/ÝÉÍyŠJà÷õ½a£ò7ðŸ?^¶Äßß_mÞÂ… ÉÕN.::Úôæ¼^^^ÜœÀɯ^36œçåuV‚½µÊßÀ¯IJJªQ£†ºtçþýûÿ'víÚµž={rs^€"ø9²dÉæ&Ö¯ÿ~£F_6n|ÓXøÓï›9s¦ºtgçÎ/^¼H´vf2rêÖ­kzéNnÎ à´_¤¦¦Î›·¾M›È¿ÿ}}:_Õ©ó½EPàÿüóÏeþè/Ýùí·ß­ÙÒ¥Kÿú׿c¿‡‡7çpÚÀ/þxêÔûk×þ Fo$äë«€¿fÿþý-Z´Ð¶ÙÍÍmíÚµäj'?ÃgÈ!¦—î àæ¼ÎøÅÑ£G÷ï?¹´mÛ Õªí~å•,Éùª .ð_¸oåÊ•¯¾úªºt§´Nìĉêmšñæ¼\ºÀ9¿8vìØž=ÃÃÕ®íî~ÔÍíG­ :ðqߘ1cÊ–-«mÿÀ¯_¿N´vf›7oææ¼E.ð‹ãÇøaJ¿~³kÕšñ §%íNà¿xñ¢´¤vaΜ9äjgöÝwßEFFš^ºÓÇÇÇInÎ{Š\5r÷î]Ó¥´‰2†ó¥5;÷%·«+ZJÂ>à _|òÉ'II{zôˆ©V-î™g.Nà×ìÚµ«^½zê ¡~ø!ÑÚ™É!ëØ±£éÍyÃÃÃí>ÿdÅK:íÛ·_¹r¥v&Ož¬-e‘ÒeY™Ø¨Q£\m•µÖìÜ—Ü®®h¥ýb¿8Uà×$&î ˆ®UkR¡þ/ï[°`A¥J•´Ýñ÷÷¿téÒ]8±ýû÷W¯^Ýô漉‰‰Nø$dZKà~?Å8ðka_ºt«Tþþ“'OÏŸŸd-ðK—ùGŒ¡]ºÓÅÅeìØ±7oÞ$Z;³÷Þ{Ï©nΫü¬ÐB»úØß4„ø üûÀòùø·lIiÚtT‹7"w›~qùòeÙ¤6mÚ¨ýZ¿~=¹Ú™]¿~½ÿþ¦×ð)üëvª)ÉÜÆlqqq*ö˃7nXÌ`í¬{?¿íÀß¡ã´Ùïî0§[·éÉÉ™~ÍæÍ›kÖ¬©í]Ó¦Me›‰ÖÎLÆXãÆ-2áŸÛcgà׿T™¿}ûöv¶Oà'ð@à·øýÞš¾(ñôÌ„ôЉ7oÓ¿\jê)ÓÀŸqŸ$¥òåËkû8hР7nüguïÞ=IøåÊ•SÃR†¨Ó~±uëVµ©v^%†ÀOà€Ào;ðû¶‘´/ipÌõŽ>nÐ4jòäÕÖÿ•+W¤ý¾}ûª³DbbbˆÖÎæ—_~QòAƒE%ð‹öíÛkóë§§¤¤L¾ïîݻֿÌ#‹Ûså‹À/ÿÔ¾J äAXX˜ñœ";ð¾)­µ¸¸83 Ùlí±=‹;DË›#µãÒoÆ÷JöoUŽû(ë•Uè[³ÖÕòöM¿ƒ¶;Áž]€ÀïXàoå7sÒ¢‹RZàï9é»ö£î4x}ƶm‡¬~Íþýû½¼¼ÔžvíÚEÌv?ýôÓ¿ÿýom@Êc9L¯¼òJ ü’MçÏñK»jA ¦g©Ö$‹Ê²¦— 5&XÛaXæ×ûØž«ióËÆÈ[ ‹µçØQÚ.Èœï-Ö«ϹÝ*û(o‚ÔÛ1k Z¼5Èñý‘:jÒü(r¿téÒ£FrþÀß²í¬‘s®hõ0ð¿§þ3gΟ:õ™ià¿zߊ+*W®¬ír»ví¤åâÉÎÎþ׿þ¥ Åß~ûM†Ç²eË/^\´¿¤J- æ*ð«L+ÙRûÄ888X?ÑZàW‹ËüÚ‚úüo‘ùm„aýÛ µ úÖL¯>¤­]¥híÓrã_7l~‹Åõ_yv`«lì£~)ÉçÆÖŒ[®º×ô/&ÿùã:6fÀÙ¨O´”7ß|sïÞ½Îøß𕜯Ê"ðOŸ¾¶Y“3f¬»pá¢ià¿víÚÅ‹ÃÃÃË–-«]ºsĈ·oß&~²{÷î©q(‡iíÚµK—.]²dI‘ ü*%Zd{ÛßøÉöîŸè¢žÕN}1¶¦%[‹´©>o·ØfkaX¿"ãßd«¬EhýÆ«-”_#ö¤_‹]ÐN›‘·nÝš—­²¶juÖþºaÚcª'­}€ïØW0x„²³³}||Œç$'';gà?v,ÍÏ/ªU—µo˨¯•Eàï5eRÏH_ß Ë–í4 ü⫯¾’M T§3­X±‚^8ô§ëß¼ysçÎË—/—`_Ò¿é§âêÊ?Öþ^ c\PZ3¾‰°†Õgìo+l·–ãÆÛø­}<îØVYÛÇ?«WŸó뵿×X¼é°}“eœ0󇆆ZdþaÆ9gà×î´;gÎÆÖ­#}ºmí<úF—ˆï-¿¤ýÓ11Ç…h9Ðß?zçÎM¿æƒ>¨U«–¶×žžž²/?¡ÀüüóÏêt}x2º$8É[­øsy!,,#8øcŸŽ½<{¿ûîœ#GÒLÿõûæÏŸÿôÓOkûÞ§Oyw@8ÏwúÓõå(¯[·nõêÕ%6ðÛ8'D}Œ¬«ú/íÚÞ ýf›†a{¾šj-~ç˜Éí ü¦!Üá­r천ònËZàWgûX¼·Ro7ì¿çÎ&((¨þ/îûôÓÏ""–Kì¯ßd’ üÓÞrqð`) ü7|}o5h°µzóöí'Ùü_ýõåË— P¦LíÒ“&M"¢çýéúÒÕÛ·o_»víš5kJrà·qJŒi‚Ußxµq¶¼1ÁÚhJk­‘u¦;•—3ØmßJÀá­²'ðK§ÉlòNJµO5Ƭ}7ÙÚéý¶/Ú ?¿v›ÝO>9=fÌÒ'ÎhF›þõµÒÿŪµ|}'hÿÒ¥ ÓÀ/$Ⱦ¨/5¸»»oÛ¶-yð믿ªöÃ?Ûü6N5±ømlIn¿ 9ðçv«l~u³;wP£¾, Ïöyùëþ<~¡î´+V‹ž×Û·×Êø›z…8ÿÔ©s¦_³iÓ¦_|Q늖-[ÊvÝsë—_~Q§ëÿüóÏrÄ¥W7nÜXü¿c×áw†Àoû³tEºþ#ÿ„߸Uö\‰HÐöíÛ˺äYk§ôüGw~‘:{GMáòûÿ#ü ;º4èw¤y»o¼½µ²üõê ‹œºµùQQ«?ÿüKÓÀ¯™0a‚þÒß|ó 1ÞNêt}y ‡iÇŽIIIÅ5ð[»Ó®íÀoãmÞê³=mjúú„¹s“22®š~!«ëÝ»·ºt§ÄÑŸaÓo¿ý¦FTffæ¾}û¶nݺeË–âøÕù<ÆS»þÒ®iôµ–M3êòö¥ÝBüo•í}” ¾{÷®í÷G¶ß€hWàäòû€âøüñaÆÑÀ¯ÝfwÕª]ò§Õ|ëJ‹À?{Å9©I‹.‹¹Ð&p}›6W­Úýµu»wï®_¿¾ºt§¼"Øýúë¯êžüã26¶oß¾mÛ¶âøÕÇû6îkí²œÖÚ4~P¯oÍÚ)%ƳP¬…aý—¬…am;µ“gôó\àwx«lÿÃÆ8¦ßJ6nô§ê[‹»P䝯/ÿßÍ;·ˆ~‘‘‘1o^Rûö“&WóÓþ©K.HIà9çJŸèo:‡ÕÐ{î‚|m“dÑgŸ}Vëÿk×®òõïÝ»'+99yçÎÅ;ðK T§y˜^¹%Ço™fQé.Û÷µv¡õ6AO¨o¼eíbAêŠ4§\àwx«l~kMé¿#l{{d—µÍ×uÅ€dxã%,š4i"9­ˆ~qîÜ…˜˜õÌSl\†VZàïñ½Wçí³fmÔÎçÏȸzÝ i|èСêÒ’~øá‡õÕéúBºwÿþý~øa± ü'ÌÈq—(¨ÿB¨éiç9~ã'ÆÒWêYyl- J²Õgþ»w覆QÜž/´#±º€ñL~ǶÊtõߤ6®ÎâŠ@Ön›«áòû€âDrµº(¥^éÒ¥wïÞ]ÿ•?¨À?,öš*càoê5rРøS§ÎY‹ý²íÚµÓzÆÍÍMBì/%’þtýÛ·oËØ³g ’bøí!yÒÚ—Ls<‡_ÅT톰jŠiÜUWéQ7{•yd¢üT!YX|¥ÔÆ%+õiVµfûL~Ƕ*Ç/íʲ҂ÖÉú¦Ôl|MX¿^.¿(N$­¹»»³Í“O>9qâÄ¢ø_}t§¾{%竲üòŽ`ÔÒ˜f­FDE­¾pá’µØ/ÁµjÕªêÒ²ñ%'êß»wOÃóÏþSŽãþýû÷íÛW¢¿GmÜ+ÇËrʾ¯oí„ üwïÞÕ¿5Ðìo¼€ŒíkÔëÿ `Ü ÓóÕ :ð;°UÖöQ¦›v”6§¤wuç\»£þtÂù<€b)66¶\¹rÆÿ+_{í5‰dE7ðŸ<ùÙÈ‘Kš¾1­C¿#oO¸%¥þ™37hWæÿý[½i³§œÒynh#ß!sæl¾|ùÊWVL™2¥|ùòZÏ <øÛo¿-öi_º¾ôöÁƒ%;§À/‰z²M²Í¶#«FºE›ßâ+¨ÚDíãbí‹Ú½_ågXX˜µwª5õI¸Zª}ûöÖNJQûbãÛ¦²¬´ ZÓ.bim3rlÍÉãVÙÞG™¨nÑ+?¥·õÔ«cjm“Ô» .¿(®233CBBL?"{ã7vìØQÿµû:5pàüÆ-ç¶î{¦ý¨;?ò\¤Ôà‹ƒ»ž{»Éô·}}'¬\¹ËZæ—MíÕ«—ºtç¼yóŠkÔן®/ÑKÞô:t¨ø~@Q_æòû€âMRº———é‰ýýúõ;|øpQ üšää#={Æ6nõ~cßeøµ‰øÃ.„IIà¼èýwK <úÆÇo½f„^ÕK{÷îýµÑŸ®ÿüCÜÇ,‡žÀâËïJ lnnnÆØÿÌ3ÏLŸ>½ˆ~ÍÆ)SUž—Àœ¬ÕƒÀÿ}*ó}Ô;$»VªTIéÎbõÕ9êÑcVaÕGuš1c6åïa÷¯â&ÿš¿ÿ×^¯ÇÕnß©Vï´´sÖÚ‘=íÛ·o™2e¤[Ê•+7kÖ,g‹úêt}yðÝwßIÿËá ð@#™ÖÏÏÏôÄþ®]»J&|„?ïÖ¯ßçï=o^’øƒš‡JÔ×Jÿw^^?Ô¨ñnîò”ív$!{{{kÝâîî. ÙÙÎá¹sçŽt¦t¾?,Hðóðð0fþ'Ÿ|rôèÑE7ð[|æß³éÝU|,ÿ¢EÛÞ{oã_|i­…eË–U®\Yëy—$›ýÛ#¢úÙÙÙ×®]“î•®&ðÀ†øøøråÊc¿¤8Ér…ø Âöí‡ö¿Øªí __­Tà—§d†#Þh3¶Õë#vØhgìØ±êÒááá?þøc!§}u¼äñ·ß~+}(ýIà€=²²²BCCMÏðiÖ¬™DÁ¢øÅŒë|}'¼_ÿ­Ìî_ŧEàŸ7lÚ¡IÓÃÚ†ùûGkMI'tëÖM]ºSpáD}ýéúßÿ½l‰t¹%ÑÑÇÇǘùË”)rüøñ ü…àÌ™ó‘‘+$öo¨å#i_~yjøðÅ ûFœ2åBXXJ×>Áúöé3{ß¾cÖš’H\¯^=­g<==%ZBÔÿÏýKnfdd|ù?#ÙÏÝÝÝûŸzê©iÓ¦ÑÀ¯9yò¬ÄûnµzîzÉSø÷™>z´þŒà྾ÖoÕ­N¯ØØ 6šš={¶ºt§¼úúë¯ÿ•ßÔùù矿úê«‹~8,::ÚôÄþêÕ«¯Zµ*¿ÿ#±oß±þýãêÕ¶mÛ!ù§þ„δkøhÿVƒ_¾\Í×w‚ívd— ¤.Ý9eÊ”|úÚéú_XGà€Ã233CBBLOì÷ññ‘ÐXD¿ŠýÚ üËÛõ¾¨•1ð¾3kíÚ=ÖÚIMM}ã7Ô¥;%6ç%êëO׿}û¶tÔ›üÈ#I^^^ÆÌÿÄO„††J°t,ð;°°E ›ªkø¨Àߺu¤6C½zútíÖmzròGÖYµjÕ«¯¾ªÞ Io8õÿsÿtýK—.}n?òN⟫««1öW¬XqöìÙE:ðïÝ{´sç)Ãôø¬©÷w^^RÆÀ¿t}Ú¸é)>m¦÷ï—šzÊZS'NÔ_ºóöíÛ¹=‡';;ûêÕ«é¹Dà@ÞIˆˆ(kŒýuëÖ•pXD¿fÅŠdIøQuü/{üý‡5,ÿ¼Õgg¯87iÑÅ a)›MŒˆXþÉ'§MÛ‘¤¤.Ý)‘øß6©î½wï^ffæy‡ø_$”˜žØïïï/ñÒvàwrññ[$çO¯î÷é˵ä6QÿÔ%¤$ð‹½Ö'úŸ·wÕ÷ŠÞºõ€µv$B7iÒD]ºSò¶í´ûömé¨sy@à@>JMM•kzbxxxÑ üâܹô9s6¶l9Nø#ã/i¥þNcðê¼}Ú´DÛMÍŸ?¿bÅŠZÏÈ»¤7n£þÝ»w/^¼øY~p’À?gÎý}PtIä3=±ÿ…^X´h‘Eà/ZN:³{÷í±~ÉùªTàŸ:u<»fͮѣ—?þ©i;gΜ6l˜vb¿véÎììl­÷~þù猌Œ3ùÊÿôéÓ/_¾|ûöm^ Å@VVVxx¸é‰ý7– YD¿žþ>.öŸvC+‹À/?ÛŒmÑnäÌ™ë>ûì¼i ¶[·n­îÒõÛo¿Ý¸qãLp’À¯Ý›,33Sÿ}d]~~~ÆÌ_¦L™>}ú?~üó¢lþü$?¿¨6o'½q­ç¤ï¤Tà—gåç»'OIÞ1*¬Iû!Ë–í°ÖÎÌ™3¥Oš4iröìÙO ’“~qíÚµ{÷îñ($FzxxcÿSO=Y¤3ÿÉ“§%Ø·nÙ²ûŽŽ£oYþw&›rvJØ…°·÷n2¬w×®Óvì8dlDr²ö‡O ˜ó~!oþùg^ÅFlll¹r匱ßÝÝ]RbzQ&±âÄû›wÝ#?:zµL”Ÿ]¢GŽN-?8#Ø÷†oý¼ë—`±¸ì¾øO<ç üâÊ•+| 8ÉÊÊ 5½tgóæÍ%véØôè) óõê Sßoú ¾—úJi¿Á­U/þ~UOkÿd¡pžÀ/¾þúkýµ‰P HÄõññ1=±¿ÿþŸ~úi‘Žý‡?yò´ø[Å„^ ÔÊžÀ¢°BàŸ5kV‹-J•*e;ð‹›7oò¢(~$Iº¹¹™žØs¾è“ÀïñûûªTà·˜sÙ²eZàÿ¤hàïØ±£>êkfÏž}ÉŠü‘W@ñ“mzb5‹tà?tèXß¾sê÷êÓäpk¯ï¼¤r üÇ QÁþ‘#Gh¥J•duÖÿõë×y9W™™™!!!¦'öûùùI =W”mÞ¼¯k×iu‡¼]ólƒ?ÔпÅ>ÞôÄ~77·9sæœx.\¨þmÂÚµk;vìhúç__ߣG^*?üðƒù"+++<<ÜôÄ~//¯>øàQþ ]ß¾}M/¹Y³fÍ7^*,œ½€|—‘‘áããc̺¥K— Ú¿ÿ'…eÁ‚ZàßZˆ&OžüüóÏw¿|ùòQQQ— Ñ•+W~ûí7$ Brr²»»»1÷>ùä“ááá…ø·Š„„„Æ›ž®Rp—Ü´æÇd @ÅÆÆ–+WΘ_~ùå¥K—/`ñññZàO*`ëׯ÷÷÷/Uª”qO›4i²{÷îK…î»ï¾cø dee…††š~wÕÛÛ;99¹ÿæ‚4tèPÓ75•+WNHH¸ô(\¿~ýßÿþ7c…&==ÝËËËôÄþ^½z>|øXPSÁˆ‰‰©Zµªq§Ê–-;vìØKÈÕ«W9uDRRR™2eMOìŸ4iRÁþ ùmñâÅÞÞÞÖî8Vh—Ü4ÊÈÈàªûx„êÖüì³MÏ©U«ÖÊ•+?ðwëÖí±Ç3n½zõ¶mÛvéѹ|ùòÏ?ÿÌÀ#T¯Þ0©ÌÌÌÓOÈ;tè°cÇŽ£ùaþüùÒ`ƒ Öå“Q£FU¬XÑô’› ,¸ô¨ýóŸÿd€À¿ö855ÕÓÓÓ˜ŸŸxâ‰~ýú:t(¿ÿÚ<›5kV5L/¹9hРóçÏ?Ú¨ùòå;wî0ºàT_“˜˜èêêjÌÒÏ<óLllljÌ›7O ü‰y°dÉ’7ß|Óô¾¾¾ðt}ýyû?ýôC ÎøEvvvDD„‹‹‹1T{zz®]»6£zöìiúuƒ*Uªlܸñ’¸zõ*çíÀÉ¿&33ÓÏÏÏô³tÿÝ»wÉ¥¸¸8-ð¯Î½±cÇ>÷Üs¦§ëGEE]rׯ_ç œ(*_“’’âááaLÚ?þøàÁƒ ü«rcÞ¼yµk×6=]?$$$--ÍIÒ¾¼?âîZ(r_ozbÿsÏ='1þcû¨À¿Ò>K—.mß¾}©R¥ŒëmÒ¤ÉîÝ»$ê_¾|9++‹±€¢ø…dÚððpÓû%~oܸÑþÀ¿ÂýúõûË_þb\WåÊ•.9ëׯÿúë¯ $õÀ¯IOO÷ññ1æðÒ¥Kîڵ˞À¿Ü¦¨¨(IõÆU”-[vøðá—œÉíÛ·9Å)ðk’““ÝÝÝ™üÿ÷ÃÂÂ>²bîܹZà_fÅìÙ³›5kfú5á®]»:Ã%7•k×®egg3~P,¿&66Öô"™U«V]¸p¡ÀŸ`°hÑ¢Ž;þùÏ6¶V¯^½mÛ¶9OÔ¿råÊ?üÀû(öÿ?÷Oì 5ýL¾yóæ[·n=¬3gÎ-ð/ý¿† òÌ3Ϙ^rsöìÙÎõ322d‰ú(9_“––æååezb=öíÛgø—üaÒ¤I¯½öšé%7 tþüyç‰úßÿý¿þõ/ J`à×$%%¹¹¹™žØ?yòäC‡Íž=[ ü‹/–Ç-Z´0ýÓ€¯¯¯óœ®ýúõüãD}øEvvvtt´é‰ý5kÖ1b„ø»wïnzÉÍ*Uª¬Y³ÆINÔ¿uë×Ûß(333 àOV<öØc¦§ëGEE=òœõêÕï¾ûîîÝ» ømKMMõôôü“BBBÒÒÒáI;7oÞ”ÿÛo¿1@àÏ•ÄÄDWWWkQ¿I“&»wï.ÌlãÆ[·n}ÿý÷?þøãO?ýÄÉù ðçQvvvDD„‹‹‹>ê»»»'''Óÿ@QüšŒŒ íÄ~WW×èèhz(N ðø??????@à@à@à@à@à@à@àüüüüüü ð ð ð ð ð ð ð~~~~~~€À€À€À€À€À€À€À€©(^^}µ³ýÀIddd8Qø²³³#""<<<þ€V®\9??¿ÔÔTR( Grr²««+/=€B”••EEŠˆˆàµ𨸹¹q’ NBB‚éÀ{êùª}©EQEQ•¿õßeŸ4Íü|΂””d1ØÊ?ÿšÏÐyA R)Š¢(Š¢¨*ÿéÛkûõý¥Jëc˜‡‡Gvv6ù(33Óâ¼ýFÝGô^|”¢(Š¢(Š* êw¨ëÄmòSw‹Ùñä³/ëÃXhh(ùHF”~€Õm׫ßÒcEQEQTATŸøÃ-ÚOÕn "%{Ç ŠÝùÄSϨ<æââ’––FLE¾±¤Oû/×ó´ìŠ¢(Š¢(ª êݹš´¯Eý¾}çkdŠLŠù@n——IùÂÏÏO«ÿ*U:$n×°•'(Š¢(Š¢¨‚(ïÓ$áwî<íÆÛ’Änݺ8ó÷ÏùÛEYv¼qçúOb¹8?òåì}5¨š _}’¢(Š¢(Š*ˆ _û{¶o1VKûÉü­ZEÊônÃW‡-KýKù *›W‘GáááO{ì‰ð•GÇ®=EQEQEå{^}¢Éëc$Øoß~Ü"’íÞöû‰=¯‘yÞ ­?“?33“È ‡eggë/ÎS¿u· >¥(Š¢(Š¢ ¢úMÙ&©>0p¦i0ÓNìé¹iÜšcÿUªŒJhÑÑѤV8ÌâÚûcÖOÙt†¢(‹jÛk´Û«5sUušw°³ñ¡s·i‹ÈZèjªW¯‰KrõÒ ¨bY>÷¯Ì³{·ùµw´ùe™³¡owý5ùI­pXHHˆK{¥úô-g)Š2–O÷A¹¾1ú«µŒí¼;iéß[t°˜8hæ:mYKIîä¦~AÒ 6',¿>£óepÊ‹ÂÚKƒ¢JHM\u\ò|ãÆ#ïÜùÉ4˜ýòË=yVæ‘9L[­ÿo…³zà07775Zvé»í3Š¢ŒÕ:ppnÿ UjY4âùFÓéCc×k‹ÈZJf÷öŸ’P¾ÂsÒÒ 6§ª©ŽËˆÍ—Á©Ó—E•œ49I»§l6vìJ™§ä&™ÿ¿{Bý·’@p…222ôù$|îæ¸ç)Š2V›·Ü™®rÕZ#fo°§Æ/Úiш–i¥‹é2³Ö¸¬¥„w¯tƒÍ©*¿g}ï·Ôÿ5Æ—E•œòï9OÂ|bâAñlûößÿ Ðñ92õúÍÕk'((ˆì ÄÆÆªQôä_+.ø0¢(Ójô ‘¾Xµ¶Ã<]ñ9ÓFÏݨ5.k)áÝ+]Á`sªÊûàœ°$YƼþÃ¥¼¼ˆ(ª¨—wë( ó.|m#žÝ¸q[æiÞ2Ræïôî(õÚquu%»Â¡¡¡j5ôn¿d÷çE™V‡C´WÊK¯Õv¸‘¿ÞüÆÆÏÛ¤5.k)áÝ+]Á`sªÊãà”¥´a¯|k/Š*!5ëiíþ_~¹g;¡iä—ù#âÿÏÅU²²²ˆ¯È-5„Ú¿=`ž E™VÇà‰ôå×j;܈ëý´clabüf­qY‹6eÎúÞ4^þ)5jÖJ{—EdNmYvúò]öo˜¶.+’ÆCFÍЗv6+û¥-"%íé^Û³Ù(µï9®+=¦ï ;iŸH#Ҕų² ¹Úž¼t™Ùž1fœ¹ðš¦ov\´=ÍÚK€¢JHMO8$1>8xNŽ mĈ™3*~¯,Uªtn¹‹¼pwwxAÎq±kR.ReZþ½†j¯”WªÕÉí²“&¹Vr“zøgÙûÿ¬ÛØ[Í M—µÌßxD¦ëgÖæa­}YÄ«U'‹E´M»ÊtmduÚ¶éWd1ƒ<öõïeÜ™h»»ŒÛcºÚΪ™µÇR²avv¯é¾Ë™ž=&µtçiãRj§,Ž©¾´^6y´o­g®Ümñ¬ÈÇ]PƒPhc,Ç££6ÞâÐh£ÂžÒ–•M’}·˜Â¯ªdVä{É¿_~gâÚÚ´ieÎq1Ûe©ç^|•ïí"/ô¿í'ÇoÜpèKŠ¢L«KïaÚ+ŽzÜ.;mñÓËø¨¦Ô ¯·îôÌùJ<óãœlƒiãúÙ´¥ôSŽi\J›¡m@/ÙÓM2Î`Üž¿7ñ6Ý_}›Æí‘}´6³žì—=}k±yë2=XŽõØ¢¤#6–RÎbÚ°‘§‚‡DZ[t²~“lw—û Æ˜{Ùê•èݶ³qAYD{6,r–~z}¯–6–’fUn7Ýmc6¦|fmSM·VJVgº^ÕK¦Kéwdêü5¦ Ê6ÛP¬íÔ¢õûLŸu¬Ç¤Ûmì—kuø,fPûeoúTÜŠmÚR2Öçl¬]¨‰‰;k ÊOk›íÓÖÿÁõí'Ä·Ä8Ý8ÃŒøµÆgÕ[ì‹í¥¤duþÏjëoºƒÒ²ýÅöîwìÞGšÕï Ã=&»i{¿þÂ-:Dí—éxPÏšnê«|9èú1f{„ëW§_Ðbºceí%@Q%¤B½/1^Â|Ž!íäÉ/eÎ^ýÈRÃÆÇ<üj— ~× •öŸ¼JQ”µ À_Í£®±‘J{Þô©«¶ÛXJ?ƒl†š8hd”6±s`k›=kÑ:mžFÍZ·D~Z[ÐÎô¼bsŠí½°Ñ²ê^ÙSûŠÖ”håçoÏüŽõ؆]ŸäØ£¢Þ3Ýwµ_úg|Ötûó÷ ç8ÆÔR›jº—µ—E•êÙg¾Äx ó9†´³g¯Èœ]ºÏ’¥FD> üîîî$XäJbb¢>ðN»FQ”µê3`„öb©^³îûkväXk¶06¢¥iÁbºÌ¯5îë`ºv5ƒl†šØäu5ÑÚfÌY¼N…Uã–XLt`ý¾ EeÃlôŒ,¢µ¼eÏ c÷Ê ­AiY¶Á´çóÒcªóeqk-«y,®ÚBÙ0Û¯?¬tÐc6¦;VÖ^UBªk`¬Äx ó9†4íÞ[:N•¥äE­~×¹¹¹‘`‘+ /òP¡ÒÇŸ~EQ”µzWønäÙ?ÒŽÅô¥kvjËZLüÿì½xÅþÿŸß_{¯ \éHû*MAEA@Dš(ˆ* H0éz@J@!”„žP„ Ò{ï9é½'Àÿ“ Œã9{6'ÉIÞ¯çóäIvggwg7»¯Ù‘LÀÌYChÕšlIuÌô[h§T—'j£ÇêKî,Mß{äœR⪕ß6uGG¦Ää÷K>gíôªcš,¨•â%‰‰“¶“Æ“Ìk(ü_|¹Ž–¢«„hë ¿½G4P?=k}ñnϪœ oÏ 4ýÐé§­&h-’ J&x·g%ÜV­É–T'ÁO•lõD;¥º¬8QÃX½q×ÀÏ>çÍ{”V‰V­Äø¶©;:2%&¿_ò9k÷ WíÓdA­ü /ILúag¥žðOÐßFKý±×´҆¿eë¶Ö¢„º˜>ïï¯/«œ ÿbQiú¾gßEÒZ$”LÀ¿$]±Þ˜TšlIuð"šðý¬Ên_Viz¥‚Êዯ¿åóoTÏZ¹U§Ä(1ß/u«¦UH–˜ü~ñ¹’Ç]»½jç˜& jå_xIbæ¼¶ágíê¿“–úÕp;„hEøÿ«£kå‰@ ÔÅÔ¹w8YåLÞxÖ'¡Òô?MŸö|Hk‘\P2Aÿg=ÃüºÖX[[Ró~}Ú;åçc¾­rñÒžVÿ`9oûÍwwO¿W§ÄxáË”†º4òûÅçJwíôªcš,¨Ýx±c¶Æ½ô89RJJOK-þmzéUÆÓÓS|vÅ)@¨‹f?u³wÞï]åLX'äª9ì<öÔ©h-’ J&à›4ü«‰êÖxÎÆ’ÑâšlIuð¤Yò%¹i¯™Òöð}Qš.´k”xö’u”›dš¥tȪ\b¼g{uK}6ü–R‰ÉïŸ+yܵ{ЫvŽi² Vþˆ—$~5W2[íôªcš,¨•â%‰eëÎi8Ò®©© ¥\üÛZjì÷s¸­éééÁ`Ae…ã¾ógíC„dèÿ´øiÈïö®r&Ìvè§Òt£C,sZ‹ä‚êô8Bf«h).¢†»N©n‰Ì¾T-/%šKkW]ŠÒKî_P] È—§äº†ŒzjéÓ1¬f‰¸èħÏ_½]\ÄÔÊ›ï”LHn¡ü^k÷ WùãÓ«sæk~^!/vü¾ãiüÖ­*44ªPÊå/ÒR}2œ_dV¬X}•¥[·nüúqѺS¶!B2&Îxêf­Úvìún/ cû‰Ûb&­ž™XïO†S†S²é\z:šÒŒÅ’kW—`ïyGž'­nîÊm|:¥ä³9A)C6‹Q·¿UN@SxAÑ6Ж°é´m|–êRT|©Qgˆ Ê¥”\;í2Ÿ¥•ã[Èm[DÌSò´¡#(sRIwíô*ŸcT˜·%ørÍ]½ód•ÿ*<¯ˆ;6í¿C¿~ý™ ÒPÊÕÛ®ÒRmÚ¿Éÿ ÍÍÍ¡¯ ²èééñSh”þ,ë`!ßL_ô¯Êc¸ï’˜É /Æ‹s[¾ÑM§dO?/¾Hrí2 hå#æÉ‚Oé5`¸j†,Aç½ÔíouÐD™í¡¹F&·”1>ë ¦‘)ŠJ­‹~W:U.1™s€¶aáúý’ËòET7Cœ+¹³Ú=èÕ9ÇÄB–?+*Œ Ï+âÅŽm'œHãøaG…†6wnÙ˜¼ëþºCK‰ÿ€žžžÐWPY ø)ôAÿ¡‡o"É;Í Å*kö^PÊç“‘ß´x&fô ›HÉXzZ‹äÚåìµt³åДÉ?ÿ&™!ËíƒÃÔío5°âRÝžÏÇOW—áüµ‰‹È¤Ôp]T&ÛÍïI.R…c±t›)[E§½Ø¡ÄrP:@ü´Q=Ĺ’‡U»½:çØÆ£V´§|]ô{•ÿ*<¯ˆ;\÷ë?`ÙÀË‹ŠJä ÒðïµôÞpäºø?^PP}•El÷Õ w[z@ j:Vüyž¢&²5Ør|ÌTúeíáu¾›´ ´%´=´Uî/[¤ ÏüvÞšiK·j^¶Ú*1Z)»RVµ.ÕÎA7:u·†Î[⥊/¾ÞTáØ[ÁÁñ”fèçk)ýøY+¸ªõìÙî ªßQϣ㻯ù#BŒñsÖü°dËÒ]çÔ%2îǧ}W.Ù‚âB 2ñý¼Ã$ó¦¦62zfn~—Ò|3åOJÿv¯O¸§À]AÕ Ú"?‘FèÏÛqÙ@ büß;Ò²Y›†Çí$Ð,ùÁbñ×IæçÎÝWaþ,¶žw¥ACîiWP5 ÿîz¢ÍÿuÛbáƒ@ 1éMcɆSKŸ³Ûo(Ê @ÈÇæ ž÷_F>Ÿšš-)fÙÙù.§4ëÍNÿ}¿Ø###â ª†Òx»ó¶ŸÛpÁ@ <–¶iÚº=»HÒ/ŸŒ™:lòŠ^CÇŠÓ)Ê @T_ŽÿCf¼]Öžç«I;)åÛ}†pCëׯ¬h«UÏûƒÇü~Ö@ bÌ42kßíuý¯Ò¬ŸwY¢”„&1{ÓRú/¿\+ÙWM§¹”fñÁ;¯¼Ú€_gŒ¡¬ :Ð)ÄO':µ~Ùg½ÊÌ@ J1fÞÆ®}Ö®kÏ×[µ§ _Þ¬GQ2¢R1lôF²úÇoI>Þ§¹”æ3ý\Ï5j„9A5ÉÈÈ éï[FNþõÔC@ DMÄŒò‡üJýsFE%±î÷§ý~iÞ_·þGýóí2mÚ4ñõôwN˜>@ @ÔDŒžº·ìaþ°5NNdbîîa¬1Ï“Œiî;Gc€] u"##Ňü­Þê1÷Ã|7@ „Öc·¶³çü<†ŽÙLÓǯ9&Ú¾¾¾>Lh ±βÁÓû Ÿ}Ä@ QCñÕ¬#‡ýNªO?GÿtpÖAçñ†'y5j¤P( ©@[tìØQtþ7?þ½±õôƒÎ@ ˆšŽ üç5QÆÐ9Ð:žžžMš4O³ë60eõèU¦Sö9!@ ´ú;n0ØÛ±÷0¥.GŽ ;5•••ؘÔ>dûèŠÀù`ûTÀÀ@:ÓðïP›4iÒíöAmbaa¡¯¯ß­[7ü÷Ô5 ?I{«V­T}^W÷µKæ„ùÚņ8z8^™0îKɧý={ö´²²BÙ€ð@}~uÒuU‡oذÁOÓ¾õx;6ÄI »›æŸ$©ýƒvvvF ¨CíÔ P( ü€—Jø%;áa|=z˜³ýŸP'uqåüáû~(¹¬žž]lQÎj™‚‚‚~ýúɀ֯ߧ={΄ð^xá§k]Û¶ïI^ Ião]=æ¬IÙ¿µûÛ%ó™3gzïP›ýKþßÿ{eàÀ¯Ñ×àE…®o3gΡkê°ûÛ]NÛæRÙØ¹õ·vm[«fبQ£+VàŠ  v¨ðñ¾R_sû÷ïG¡^$d:áiѼ©ñ¿Å‡»V9"î¯]³ˆò‘ì´ŸÖ‹Þ;Ô( …â_•§gÏžvvv(=À €úNxtVþúsD€C|¸[õ#ÐÓfñ™’½wâA €š¾Óñ›NÓ¦MÍÌÌÞ}÷]ögÿþý­¬¬BBB–/_Þ°aCɯÏÐ ðü"Ó ÏÌé“‚¼l"Ü´^®V”³äƒ”nݺYXXà Ð:$íüvóÕW_¹»»{xx‘ü³‰S¦Lq/g̘1’ÍP ñ>ð|!× ÏW#\ï]IˆxPsAùÓZÔôÐïOhuqŒø;v0á'\]]gÏžÍì7nÜxåÊ•¡¡¡–––~ø¡äûhsss”' þ©¯¯/)ÛýûõºsÝLù°v‚ÖEk”Ü’‘#GR• @õ±³³ã÷— 8;;sá÷,çÎ;tßa Ú·oäÈ‘ØØØ¿þú«yóæ’¦0¬  Þ’‘‘a`` >åø»žwºšߣˆt¯ý¸h~ˆÖ.©ýÓ¦M£ê €ê@÷¾¿mõïÏšîˆÂïUÎÉ“'ß{ïi¯ÔC† ¡jBXXØ¢E‹$öëëë£a? ^!ß Ï®mk‘u&w´kÛF²Ù$]¨qQPe:vìÈo++W®T'üÞå¬Y³¦Y³f,ñÌ™3(þŽæõuð4ÖÕY½|At°Kb”G=‰­›V©ë½ÓÐÐö¨,â åÊ•+\øwìØAzïêê* ¿££ãŒ3xÃþµkׯÅÅ?¾{÷îªw(ªM Ç @"Ó Ï¬ßûÞKŒö¬oâºÔ`6UF$¿–266Æa 9â»$ç>dÂïççÇž†µiÓ†n.¢ð¾¾¾·nÝ:t([°sçΧNŠß²eK‹-TïPƒƧg€ZF¦½1#:ÞHŠöªÏâ{Ÿª$’Í&érNhˆx7œ6mþ¸¸8ggg2y6«wïÞçÎ…Ÿ J‰‰I·nÝxÃ~—ÀÀÀùóçKÞ¡æÌ™ƒ6¨€Z@®ž{ÛXKŠñ~^Â×ÝFÂ×êF?´²²Âá CFF†xï8xð þœœJ°fÍ1Á„ lmmEá'üýý—/_®££Ã¾,[°`APP««ëgŸ}&Ù/£5zYS× Oî]ÍOì{ŽT_ ª¤|ñùIíÇ+T2ˆì’±?,‡lßËËëQ9½{÷¦Y+~ßò³ÁJ]–ì—_~¡d¢ðdøS¦LaYµlÙrË–- §OŸîÔ©“äP’x*Ð.²ð4Û½sCR¬ÏóçŽöÿø#éFJzzè½€*Ó¦Mã7‹Ñ£Gsለ ¹III 4 Y7ïz>ð§Ÿß|ûKܦM›?þøCþ€r®_¿>pàÀ§Ózô¸xñ¢B¡X¿~½®®®ä˜28 ­<¾P× Ïš±a“c}_˜0=²»G÷n’Ú–“”…mÚ´‰ jj*Í=|ø0M÷ý^x˜]²îÕ§?[äý÷ß?}ú´(üåЂo¾ù&èäííí„sÔ¨QŽŽŽ¢ðþþþ .dï7n¼fÍšØØX[[ÛH¾‰Þ¿?Žà‰l'<¿­Z镚ˆàaom1 u½wâq ¼$ˆ_ºMš4‰ LL Í `-óÝ|c¼C’*¿®Ú £Û˜->þ|___.üa常¸Œ=š­º}ûö¦¦¦)))‡jÑ¢…꽩_¿~ÎÎÎ8^¼´ÈtÂ3gæÔð`·TEB2._<Ñ£ûÛ’]"ã¼€ž‚‚±ìþýû¹ðgggS‚?þø£ìÛ·AC|B“ªŽî!ßO›Å2oÞ¼¹±±±(üáå\¼xñƒ>xú‘Ý€vvvqqq¿þú«äwgúúúèY€— ¹NxôFy¸Ù¦*‚Æáý;Û·{C©qvÀ ………8À®ƒƒ~º½²v?ûì3šõÛúm¾aÉUŽ+·?4„÷ÀsêÔ)Qø#ÊùóÏ?©FÀÒüøã4= `ìØ±’ û ÑÅ/2ð 2ÈþÎå´Ä„æQ—±dÑB?¼TˆìŽ1ÂÍÍ ?Ùøa€Ý[öî~aÉÕŒÇÎüß[Ùº†noo/ ?ÝÖƒ‚‚æÎËöoܸ155õæÍ›½{÷–lØonnŽ#À‹ŠL'<ïöxûÊ¥“°÷JE^vrvz¼"Ês÷†~x©¿}ûý÷ß¹ð³vMMM˺q{§‡x²¶bùš¿öÏ™3ÇÓÓ“ ?åààðù石Mêҥ˹sçÒÒÒ>¬®a?å€ãÀ‹„L'<íÛ½qä qzR(BóÈÍT<~Tšžî|ÃøÖ©¥ÛVM€ðÀ˃³³³xÙ·²²âÂ_\\L &NœHÓgÎù% "E‹áê6eúlÞ°Æ ¢ðÑÑÑgÏžíÞ½ûÓ÷C‡º¸¸PɆýTq@Ã~^ ÔvÂÓXwÓ†ÕŠÿô¤0„†‘•ó¨´8'#Á󮉵ùòÛ§…ðÀˆ¡¡áßãÔôèáVÙ~@@ÍÍËËkÓ¦ Í25· ŒLÑz\¿ã4tÄ—líï¼ó޹¹¹(üDLLÌæÍ›yÃ~²}Jàåå5jÔ(ɱ㌌а€ç™Nx Ή õLOGh™©Ñ%Źnmήºsf%„^NÄ{ëO?ýÄ…?>>žæÞ»w¯ìK^ÝÆA‘©5'Ì/¿ýNþƒƒƒ(ü„¿¿?mKвeË;v¤§§_¹råÝwßUƒŽ;bIž;d:ᙬ?>ØÏ5#9¡ad¦F•åäe„ûZÛ_Zosn „^Z”Ø=yò$þ¼¼Àn¯^½hÖŽ?“ð‡D§Õt<ô˜=ïiýæÍ›oÚ´Iþ¸rN:Õ©Óßøz{{GEEQAÒ 0ˆ$õ…BAÿ¤’ÿ¼ïöx皥yfJ$Bó(ÈKÏÍLLŒöv±Úu÷Òû‹ë üħjãÆãÂO MsÃÃß°ë΄?4¦6ÂÞÉsøçOöwïÞýìÙ³¢ðÇ—³nÝ:]]]Ö!ÿ¢E‹i³‡ &Ù°ßØØÇ€zEAA¡¡¡t'<íÛ=¼'35 ¡yäå¤<~ü(=)ÂÃþØ=ËÍ÷,6Bø{åíîO›èþùçÎÎ΢ð'$$M™2…7ì?zô(mö… ºt颪ݺu³²²ÂA >°ÿ~uðmü=1>$35¡aäf&>zTš›•äçtÆáÊÖû— ü8$Àüjß Aƒû÷ï3áøð!`—õ„¿hÙeá­½X¿yGóæ-ø7Å\ø …BqçÎþýû³}úô¡?³²²ŒŒŒ7n¬ª#GŽDÃ~ê ª}KŒÝ°á"ƒy1~Yi1 #'#¡´¤(?7=ÄóºÓµíŽW·Aø(1gÎqì*×rHøCCCinff¦ŽŽͺfí¤$üá±éáqµžQs~~Ú°_WWwíÚµ¢ð‰‰‰&&&íÚµcû2~üxÚ…ØØØ3fH¶ ^±böPË8;;«ë„ç»IBÝ!𕈌¸’â‚Âü¬¨À»®·ö8]ß á IÇŽùÕ~Ù²e\øSRRhî™3ghúmÛD¤¨ D\FD|­Æ=ï#Ÿö½ß©S§ .ˆÂOÄÄĬ^½š=ØoÔ¨ÑÊ•+“““¨*­ZµÚ¿?Îj™Nx† ìp÷fvz,Bó(.Ì-ÌÏNˆpxçËÍÝÎV» ü$ñôô¯ö\øÙ»ìñø”g«þÈø:ó WßyÖ°äÈ‘ÞÞÞ\ø“ÊñóóÓ××g :tè`nnž““C?Û·o¯*ï¿ÿ¾Nj™NxÞ{·ûõ+ç³ÓãšGQ~V^NjJB×Ýãn·öºÞÜá ƒ8Àn—.]\\\˜ðóvÙóÿãf–2•Y'±iËÎæ-Z²„–,YÍ…?¹++«Þ½{³½4h££cJJʺuë$öýõב‘‘8%Ð"²ð´;vd_vz77×ÖÖ¶OŸ>ª6Ò²eK333œTÉ6<6\l° .*8'CÐ0ò²S•äDøÙzÚó°; á 9â»M›6u)‡lßËˋ斖–~üñÇ4kãj(ü±uGLN³>ÄìÙ³CCC¹ðiii_~ùt$¯®]»ZZZR½æøñãdøªfÒ¯_?gggœ$T Õf<ßOþ6<Ø;7SÐ8’•ægŇ?ðºgêy÷8„@e៵£FâÂÏš²ÇÅÅ5hЀfÙ»øi.üqIÙuá1É‹—®lذká³mÛ6.üœË—/÷èуíõˆ#<==©.°jÕ*qô1‘B¡À©@eÿ†âtÿNnf"Bó().(*ÌMŠñõw9ï}ÿ$„@(((Á­_¿ž ?`wÿþýe}hôìåž\)áO®ãpq÷ùÅh¶_äö7oÞLUaûöí¼aÿ‚ È꩚3aÂɆý†††hØ@•…ïÆy¹YI £¸0¯0?;-1,𥯣™Ãi?€ªagg'°kmmÍ„ÿÁƒl€Ý¯¾úŠfÍ]øk„?!%§ÎãôÙK:wa;8vìXÿ”öË/¿ð†ýÛ¶mËÏÏ···ï½÷Tµ¿cÇŽ8m¨‚ðo[õÇí£yYÉù(ÊÏÉËNÉNó¾éç|Ö×é „@u?©ûðÃ™ð‡„„ÐÜììì¦M›Ò¬óWm«&üŠú«Ö¬Ó-qãÆkÖ¬‰‹‹SÒ~!C†ðùoݺUPPðçŸJ6ì·!üjsss~yíµ×ìíí™ð³þgJKK?ýôSšµfÝZþÔÌüÚŒ …Ÿ6;">ãÀ‘“mÛ¶gE1uêTŸÄ½zõjÞ°ÿ÷ßÏÎÎöõõýüóÏ%öã Bá÷q:C¿\ùkv¸ç¼Œ>Š s?~T—©ˆôˆô·ð³ð¨Q¦M›Æ/ïÆ srrbÂñD`×Êî¡v…?-«–BsáK÷S,X´ŒõÆOb¿~ýúD¨"@ÕÞ°ÿôéÓ%%%×®]“lØß­[74ì Bá÷u>çãtîæ‘EΗó²R ó2_È(.È~üèû27*ð^T€=„@- 6D_½z5~Ö"娱c4½ëÛ=¼C’´.üéY5•þ°ØtÚLJÃF|ÉʤS§Nfff îܹӫW/–æÓO?}øðaNNΦM›$öëééEFFâd~á÷s¹àïzÑáò¶›‡ ’bü ó³^¨(Ìyü¨´´¸0=)"&Ø1:è>„@í °Kܾ}› ¿««+`wòäÉ4}ú¬5"üÙ5U~Ú©à¨Ôg.¿ùVgþ)®›››ªöïß¿¿E‹¼Cþ¸rxÇ>"5Z±bö¿¼ð<°ð¼{âòÞYN_ÛTZRR\æâ áP›‚òkû|àT pp0ÍÍÊÊjݺ5Í:ròRÍ fNaMDõ…Ÿö.02eÅš:ºY?EK–,‰ŒŒLø'4…¦³V@Mš4Ù¼ysnn®»»;ûöA‰V­ZQ'€ðËàÃË,mN­±3[—“™TTýüFiiQiIQnV’"Ú;.Ì-.Ô –éÙ³§8b,þäädškccCÓutu½‚kTø³rµZ~ÚÓ».~'Oå]w;v,A//¯¯¿þšwÈéÒ¥GÑOqc»N?áW'üAîWƒ=®?¸}Èb×áÞ6E…9Ï]”––äe$Çù'DºÇG<„ð¨}"##Åk»™™~6ÀîÂ… iú˜±ßÖ´ðgçRi+´.üþáÉ~aɧÏßx¯çÓFûýû÷·¶¶VÕþ«W¯ò†ý#GŽô÷÷ÏËËÛ¼y³Øñ)G___¡Pà<~uÂâeàjyÛdÙ«ÓaÏ‹ê“ç?~ü¸¨07M’í¥ˆò„ð¨+öïßÏ/ì­[·vttdÂïëëKsóóó?üðCšµeÇþZþœ¼"­Dv^M ¿ohY ¬ß²»Y³§ögΜ¯Â–-[xÃ~ƒôôtª ÞK6ì711Á© üê„?ÔûV˜µ—Ý Ë]Ó½lLs³’‹‹rëoç?~üˆ ¤•ë—ãá¯}Xÿ ’<|k¶*[Š2§³‰{÷î­ÔV©ËMÃ}©ìê€3räH±.ü±±±4—T–ͺç\;Ÿ›_ÝÈɯqá÷I¼ÿ øÇYOÇÛÒÕÕ%½Wu~*½ùóçó†ýlì]ggç~ýú©j?žó¿¼ð‡ûÚDøÙ:Xl·Ü==ÜÛ¶¸(¯þE©þ£Ò✠EJ|`rœ?„¿® Ÿÿ—tîÜyÆŒ êò!Íf))Cq:-H?ùä“Jm•ºÜ4Ü—Ê®b;“;vpáÏÍÍåW§Þ}ú{)jMøó Š«¹ùŵ#üTT&—®ßïÿÉg¬ôºwï~åÊ•8Èð›7oN ÌÍÍyÉÓï­Zµï;è±@ø5þÈûPÏ›wN¬´9±:!Ü£¸(¿ž‰þ£Ò’¼œÔôÄÐÔ„`ÿs!ü\ûOž< ἨXXXð+^ƒ ììì˜ð»»»ÓÜ’’’Q£FѬ‹WÕ²ðçW)j_ø=î Û÷kýF;VŒ_ýµ§§§(üáááì!ÿÙ³goß¾}óæÍëׯSÕ`Μ9¼ð;v숳@ø5~’äè _‡37-´9¹ZîYR\P‡Aª_Ö·~^fFrdZbXš"Â_„ŸÌ\²aÏÒ¥KÉŸ™·3$ŸRv.Âx~Ø8p c9$üä¨4799YGG‡f]ºq¿¶…¿°¤ QWÂÿ0 ÁÁ#â§y‹”‹}÷îÝcè&Bß}÷]QøÙǼs$œÂ_)á qŠ uñw:ãÐ/u¥ýJKJK ‹ r2S¢ÒÃ( üõPøe’“EóÕ¼ç4?à9BlU²jÕ*.üld(fªmÞh礨}á/ (ªDÔ­ð»ùÇ»úÅoøã/Uáÿá‡ÊÞ’,X ÿ… 4hÀ ßÊʪ²ÇnÆŒŸ”£Éwgõ‡½{÷²ÍÖüë3¾ˆcÇŽåëè\•i…«”Xbìv_©íËŸ¶¡RKñÕÑâ~­?ùs|øÃ—KV‡ HûãCÜÈÀk!=*~òäqqQ~fjLZbè?Âÿü?ƒ;¿æF áäW~ʤžÔ]…ä/ãš_7xD•}QµûHBB‚æý©.UáSɽÓúyR›%@`hhÈ/éÝ»wwpp`Âô¤|€Ý:ЬC¦êPø‹Š5Šz"ü­Û”µä·´´ä¶oeeESZ¶lI7Qø‡*vŽT…ÃáWG¥>¾ƒð×á¿ouèßÿ.k÷ïF ßïÑÅåΉª ¿"Ú;1Æ—f9_ÙuqçNÛãC”–k1ž ‰ÆÆÆ¢ðïÙ³§ú=ð¿œÂ/“Œ.éâ# _1Cøëƒð{Ý?µ{ËÒÿ5ÑásutþûóLýj ª"4-1œÛõú^Ë?§_ß?ßÛöDjBXT¿´´8?'-51$%!HÓ€ð?W¯Îå…_|æÌŸ?ˆ"%Õä¹ñú¥g rƒ%èw ¯Ü]Åm Äg ªË×γeir_…Ð}M\£ºoŸÅS´ße±¬TwMÜkþ„m'åOyÊ_Ky¥‡ðµ_bÔ-&&&?O{ýu‡rÈö}||ž”°Ëžÿn2®'Â_úè±rÔ3áÿð£©ÄHæ¹í³ëU£FHòEáŸ$òÅã’â‚‚¼Ì4E( |eÂÿ< ¿ÒEµBá—|’ÏŸ+=®(ª>É¿|ù²dMAÝuCL¯º ü¡ºj½CÜxÍ;&bÏUز’X^gQÚ5~Y–쬀¸ºjÛq¾ üž­äãž­hïµ_bÔ9zzzü_é‹/¾àÂCsÃÃÃY2·îyÕáôϨWÂoãR6$qÆ ©ÆõŒíÛ·ÓÄÜ»wOþnݺñÂ744¬9á§Y¼›J]£øøïlzMî­{÷îÕd‘š~ñ½¼&_„© ?/4ùž”„ŸRRú w_᧬xùS©jþ5-È–ª·7UØK“µÉû=ºê Í{Ÿ;a¬áÏJ‹ËÎHÈÉLLŽ ôw¼pûøróz6'×øÞ5u/ÌÏ~üø‘´ÁE…9É)ñU ÿË ü’—²œœ®ŽêžðË7òíWÝuƒß*üpIÉ¥å7^“RUÊ_‚Ø£o1[~M–¹èI–•(ü’÷/Ö‘ º‘̳öK €ºEi€ÝÍ›7ságìîÞ½»¬ëø÷?$•­WÂÏ©oÂÿû&cö¸>J૯¾býŠÂonn.ÞL===kBø•>"«ðS2~“Rj Ï/Ô’Ÿ’±G:’-3Ùºj_øÅ’QZ…ä:¢ð‹ß…‰ßdIj¿(üª…@J¶,•~Z‘ºò—¼ß±çQlèþ%.X??%Ó°[Îy?MÔÑù/O©«óßYÓ'ú?¸®-áÏÍJæpßãöQÒþ Û&_ß?ßåêŸáÞ¶´©%Å´{5Âÿb ¿Læ’O˜Õù¤ê#t1gÉë†dJMr{¢¾q{…ðv2’OÈ5/MÒhrÕ•¯eˆ·¡:)1êÖu `—D” ?ûÿåìΜ·¸þ Ùö×Cá­7‘JlÙ²e‘Ï ÒÕ-kŸ@ª, ÿ’%K´2À®Œð‹ÖÚùòŸ’=Qù¨JuA¥;Õ$W$.¢ªµµ üêÒË÷Ò#š¶&%Æ…_lª´`¥>¾«°üUo—<7%ۗщçBøý]/šÛúúÿóÄ 4hÜXg÷k´.üb$FùºXƹäe§$Çúi% ü/¶ðË\”$Ÿ?kÒ¿†ÂÏó—¯ÝËëkun=ìyÈÞ½{åX²T5)+¾×2;È/¿JDx“*ñug]•uˆ¿˜÷íÛ÷þýûLøù»M›6¥Y§/Þ®‡Â_õNøutÊÜþÎ;\øÙ“ü.]ºPÁŠÂß¿­ °«NøÅÃDE¤ /ÔªÏùÅϑċ']Ï%ß«ò)õ{Ö¨ÓÔZ~u7zyáç7¾/✪×y¥ÊŽø<_ìCi7Õ ?¬Äª byŠ/k”Þ³ˆ{Êò¤ÄtÇ”ïªî¹þ€nvf=ßí&6ïyí¿ÿy§[§ë—ŽTSøs2“d"1Ê7+=.‰¹ºVÂÿâ ¿LÍZòŸå&¿Iª×v™¬”¶¨Â£¸ýU5LòÑߺpI¾ˆTz"¿â&iò•ä“|u;XW%@Ò±cG~J/Y²„ ?`—}ÕÒ´Y‹þñõMøÿn_[Ÿ„ÿàñ TbmÛ¶˜>}:MüùçŸEá¿víš8À®………v…Ÿ?ÁP÷_ÝÇSòRÍŸ?©°‡ž¡Ò³”ú,ü’}Ô5…_õ6'~¦‰ð«ûÄOé+ÓÆõ¹º· #íþZ¿„_*ê‰ðwéÖŸÅmßÚÚš¦4iÒÄÙÙYþÑ£GóÂ9rduŽ£êMAoän¯É‚ÁåTánû¼¿L«NÉÎßä{„{"¼ks–,n2Í4ÏíÅ~Ö-çòų:wzËÒÒòñãÇÅE¹%Åù•lذ~çÖß+%üÙ ù(þÔ˜DÊJ›á¯ïÂÏÿ£•þ «Ü†_²µ‰&mø¹¯òZ¼¼ðWჭë+]•ú.àÆ*·~×Pø•z •é8´^•µÀàÁƒù¿äwß}Ç…?))‰æººº²vÜ#ê•ð×Û·®Z»²9Ÿ±fÍvÁQþ–-[òÂß¿¿v…_CýSUnM¤Wóg>¬[KuéÔ[á—ÙÕ'HO4ë‡_Ãïx{ÖS$|¬IÉÜž‹ö<Õ~òäÒҢ쬸ôÔP™éùé·oßnÞ¬é²Åó‚}îk&üÄ3á÷Òn@øë³ðs9W­ÂWYø%‡‚å¹Éô“¬áuCà ¾dÍ¢šúZamE¼¢ª>bR%''Gõɉ惤°K(+1™®Ã öÉÈȯä»wïæÂ_TTD iúÇŸ vó‹¯7Â_AÔ­ð¯4ÜB%6|øðp¾}ûÒÄ-[¶ˆÂðàA±ð###µ+üò«>OæWÑ*H¸ø`‡é=vP²KÉçBø+;v+ùMÒðÆ-?N½jÙ*ÜŸ á·8gb{í˜:áOO ÏËIJM"ÕÏH‹ÈLb‘›“daaѸ±îþóïï'óÀé–œð§ÇW‰Q>™©ÑäçZ½~™û*ì–S]k:ùq{ÕUÒùe\L ÎTù*Ô½gd»ZÑWÞ€G½«^-ÕÆ%š,²¡o«p}ã…Æû+SwÐk¿Ä¨+Äv_{í5Q&üÞÞÞOÊØ4hÍZþ›Qý~M¢…¿ÿ'ŸQ‰mݺ5ì 6¤‰¶¶¶¢ðO™2…~Ïž=«y(U…_C—V½ŠVMøÙw[’F*vVYûÂ_µn9!üu.üN6ïtë¼mÃ"Iá'/ÈO矛“À¢ ?ƒuŠõÊ+¯ü÷¿ÿ6dÕÕ3’Ÿ•_a” J”"ÒCëᯇÂOŠ(vÆ¥jï¼%ùb´Â^ $™×¥4Wð«»Ìª¾=Ô¤M¨°gK¾FÕ&£ê>.S7Zb¥®o¼|ïIµ_bÔúúúâ»\ø•Ø={ž~%¢N„ßÅ+ªA¹ÛÛÛÛsáßµk»2¸ººŠÂÿÎ;ïT€]MžðË7ðPÕ×*H¸xc¢_hcè+2[‡mø+Õ—o§ÌëæZ~:‚5àEþÌô„NW?ö‰ÞèÏ\mO) ˜unVrN¶Bþ¼Ü¥%…âÅMWW§s§7÷ìÚìùá× Hø)}B™Ÿk= üu#ü’Ÿd²—’âžJ/X¡ð³K®ø'¦­ú$Y~š+®Qì9Yé®îr*^‡•ºSf£ø©«ÈTG_Å„•²­ð9êÅJCDéŠ]©ë_µü§UuRbÔ Mš4“ ?`—• ë6íêÃG»•Š:þ½‡Ì¨¸Þ~ûíPqãÆ•½%Y¾\þ‹/Š—#š®uá¯Ñ6üJm,Å »äíº~ñi’&mq5¹§HŽíRa~¾%6»åÏ”dF¢ÔðeÍs-ü q‘“ô'\2ÿó÷Uóº¿ÓéŒÉJÂp7/;¥¸8/'+ž A~zaAVQaNtt”ÒÛÿþ÷? 4ø¨÷;·m pÏJ‹Õ$Ê„?9*!½&Â_û¯ao¶Q‘~>`{î¡T‰Pýæ½ôˆn©´”ä¨|šا´JÕŠêë«ø½_ÒU_˜ŠB.YV2{­ÉõMܪ ›è×r‰PË( ñ ‰ý7¸ðgff²dW¯^íÚµ+Kóñ'Ÿ]¸v¯®„¿ QûÂ?^¿¬•΂ DáçìŠÂOþÏ ¿U«VÕ? ’ÝrÖ\/=ì™Ì«Ân<ùå·–…_æm…#íVø ^¬Ú¨ö¤¡„æmq+lÖË*\ü“ÞXøÜ Á«+–Ì4;¾½ç{o/^0Uþp_›?ÛÄŸÂüìGJJK IþKJ JK‹èÏ'OÏ3[WWGUçþ]N‡öí [áæl—™#å™ñ°&Â_„Ÿ5>¤ÿDùŠv…ÝrÒtÕVyêjb·œJÝÚ¨6b×DøÙ\]¯øJ£"jK_Å—Jˆc*!ŽH(ßuÕ®oémqf契£öïåxÇLþÈ{’䨗一gßá–÷®Ÿ™˜ª¹nyzØAÿýï^yåÕ»ù+ÿßÿ§£óZëV-güøƒ‡“ŒðLJ?¨¡€ðצóË áÐtYPªh‹™ó‹]|èßuð.ߘ—œ®–äùtÑ–Ù$¶”LßÈ´,åÀš*±–2‰+ÌMÃâå£*\£xEe»ÌÊJ¾¶¥TÈòÐÚ%Tý)1j q\]‘öíÛoÛ¶÷ÒC¸¹¹±Î9‰ääd6V,uwÑ®Z~’öêD­ ÿ‹;å­…uCfÏžM§N* ÿ;w´5À®¼ð‹¼Ê´«ô‰«²†#íòg#’­^Eñ®á§›ˆø±ä£ò GÚU]Šn4êÆ2?ôS-j^bJÛ\áH»’û(¾ƒ–¬>¼Ÿ›•è`´~‘ÎkeCë¾þ¿Æ{vþ¶ií¢¶o´2ÞºRIø£ƒdFÚuw¹3å»o5jÔ¸üu›$ë^³<›™­‰‘$üñán5~ZÄÓÓSìrŸÓ¼yóE‹ñv;<þ<~Çr|}}³³³Y&ä«}úôa)ßëÙëä¹5-ü¤ëÕÚþ…‹WQ±Œ7Nþ·ß~› °+ ÿîÝ»µ5À®¼ð‹ÖÙ{RþÈHìŒBÒ*Ź\niqÉÐĵˆ J ”>žR×7f„_l/*¢ôfV]½ Â'üJï£Å¯ÉT¿n_Ùˆ#+•€Ò³>uÂ/~z Tþ´ÙâWr’¹½HÂïátñÜ)ãÎ:°dßOúúÜÉ]ôîѽËÕó5~Þ-ç93ý‰ãtttHïU/†Ú·ËH‰RŠÄHïô¤ð¸0× ?€j“‘‘a`` zwkذáܹs}||¢ÊÙ¸q#û†·AƒßÿýÍ›7™ð;•CîZ\\ÌͧY³f,“‰“¦Ú9ûÕð“¨k+jAø{÷éO²sçÎàgØÚÚ2¥'Õ…„ Ú`·Bá¢òy”R÷øê>³U•XqAÞz_UPÕ%–lå^áפËJ™lå…_l_ªZbêÊŠ~Šu¥2Q}[]©ï”2T­t¼¨ÂïvÿœÝMÓ¯G a)»uyóÐ_ׯù¥c‡7¾›ø•Û½Kš ÿÓn9“£®Zœ™>íû¦¯¿.6òøÉÇ4K) ü~¨ÿ‹]ñpL2ýOüüü¨ À¼þúë¿þú+~2UòÕ¸¸¸GQ¶yyyK–,aíRtt/_³AëÂOŠ®Ý¨Qá¿ÿ ˜Õ¡û$Mi¥,M¶DuuОҖTø¡ÏGIøùDÕ‘d¶“í;“p¥BSWbâê$;DÊÉÉá~(m†äÞñÜ^<áw´5»{ëäšås_ûïÊJ¼úêØ1#ŽØ2}Êø6­[ü¾rA%…?’Ç=Ûë ~žÕºUËzê-ÎbQ.üa±¡Î5~UÂÊʪ[·nªªÿÖ[o™ššF«çîݻÇçjqøða&ü„‹‹‹»»{jj*[Ehhèˆ#XÊÿ{«ó!“³ZþšˆšþõFe­túôé$0pà@š¸}ûvQøOŸ>­Åv+ûˆ‰}DV©¯h)Z„$³ÂOÛh.¥¡””^ó¯¥ê3TP´/¬KüJ-ÈÊAó+,ÖÈ‹ô™˜¼ðdžºäexÞæÂosãø‘}›Þü¿vl‘&uœ2~ß®u#† lݪʼn#;5þ¤ˆJE™ð'†‘×t@øT rH===UÕ×ÕÕýý÷ߣ5ÃÜܼC‡§íf‡ víÚ5&ü‰«¿¿?ÿRžjo¾ù&K9tÄ—6Õþš‹þ1ã¾¥Ý_¼x1·}ooï†Ïá…Μ9Z`€Uø}œÎ„xYäeD…ºsá¿uå˜ÅÙ¿¾ÑûüÕW_}ÚÛ@»6K ~Úðû’Ý»~>üÓ[WOi]øÓCcBœj< ü4###cÅŠJ]n>ýØíûïýüübž‘M?cÔJÞ°ÆŒ÷îÝcÂO¸¹¹EDDð†ý›6mb]w’å.0XæšðR ¿ŽncÚ÷ëׯ>ƒuÌÒ§O2Qø?øà~Pè`á¤~uÂïë|ÎßÍ‚¬;-%ÖÑæ,þë—YžÛ¿÷ºz½Ëïýá{[6¬˜ýÓwmßhÝý.§ïU'üiI•‹2áW„’×B@øTˆ‰‰‰Ø8œóñÇ[YYq‹‹ËÊÊzüø1-B?éwš"£ý$«wÈÙ´é† ¸ð …‚5ìŸ2eʳÎZì?|²*Â_ó¡uá?zòË P€5ÿ^ºt©(üÖÖÖâ¡‘éŸ? ¿ŸË׋±¡.y¹Yœ®sá¿h¶÷ì‰ÝËÍjݪËáÕW^9üÓ-ëWÌù釷»unûF›]Û׫Xe£\øCb‚j! üdpvvîׯŸªê·mÛöðáâ½§§§—––*-NShzŒ,wîÜ4h˶GGeÂÿ ŸŒŒ –ýÉb÷ýøk{·Jm…v…úì´³TÙ `;wNþ5kÖð£Ó¤IœºÂ¯‰ð<° ïÍÏM ö…ÿÔ±&ÿøvü¨ÿûékÍ7j4ð“¾×._½|á€þ5n¬»zÅ¢Ð@·êª"„T¼vÂ@…B¡¯¯/Ù忢E‹ÂÂÂbŸ‘””TTT$“Uqqqrrr¬,¦¦¦ü%¸q㬬¬˜ð³QçBBBòóóYnÇoÞ¼9K9}æ\Ÿ hM„¿6C‹Âßõí´›‡â¶éRÙ3*+___Qøù×ÐÚ`€—Dø^r¿Jî‘–tûú)QøÿµyëÆŸôÿèo6ûö2\³xñ¦¯¿Ù¢y³Ù3§z¸Ù“óW6 ü~¨C ŒŒŒ$›ë3ÆÃÃ[zBBB^^ž†ÙRJJ/ãüT‰X¾|9[¯ŽŽÎÏ?ÿìèèȄ߽œ˜˜Ö°ŸõÿÏ>\mޢ妭;å…¿öC+ÂÓþ!«a‘Õsá§b¡‰“&M…ÿþýûì3†¹¹9Ncᯔð{\ q.*Ì òw¿tæþýnܳsÝâ…3ß{÷m1Û÷Þ}gů Líùiúw-[6ë­Žׯòp³#‡×0Ê„?!(*ðní„@9;vTUý?üðòåËJ~îææV©Ì?~*ÿ¨Ÿ vüøñl¥­[·Þ¾};~ªkâ&&&²†ý´Ÿ}öÙÓÍëõÑåëw$…¿®¢ú¿fýeÝ ê/ðþûïÓÄNj¿ÿ~q€]Þ ¿æÂâeæcªÍÎLwuºÃ„ÿÀžM÷n>¸×èÐ_[Œ6¬øtÐǯ¾ú ϼcÇö¿ÌŸeuõÌÁ¿¶Oøæ«Ö­ZvéüÖö-ë¼SBä£Løãƒ¢îÖb@øàe‡ÔqðàÁªªß¼ys##£8BBBöíÛwòäIrxMò'™?sæÌµk×â4àÆ}úôaЫW/333&üm'yovv6ËöêÕ«o½õÖÓÁyõ¿óô …¿n£šÂ?`Ð6¶)·ý»wï2¥÷òò…_l|E'3€ðWMøC½o‘óGÞÏN‹KKMºqÙìØ?Ln39¸ýø¡Çï4=²ëÀŸ[&~óUãÆº|ÿû_“Ñ£FìÚ±ÁñîÕ“¦ÿæ«fÍ^ïóÑÛ¶¬õ÷rLI– E¤wJ|P$Ixm„^VX Éæú?ÿüs@@÷ðÄÄDþ{LLŒÍHû-,,RRRÔåOrNž¿¯‡89|ø0oØ?yòdÒ]&üoxxxaaá“ò6HëÖ­ÓÕ-»ÿê6n¼jͺ¨ø’íúUþ‡~1¬ÍÒ­[·üž±qãF6xQø[·nÍš±±1Niᯎð‡ûÚDøÙÆG<,ÈËŒŠ¾xöðéãš™î1;±×üä¾3'÷Ÿ9µÿÌéƒsgOëØ±½¸®¦¯ÿoœÞ¨ÃûwúyÞ=qlïdýqÍ›7ݸv%‰½j("½Râ#ýíj7 üð2B~ÈúÃWbðàÁÎÎÎܽ Ennî“ò/pÉíÅçüdûdòdþ$äüÓZFII‰““«œ;w.00/Ÿ••EyRÎ2ÎO‹,Z´ˆ7ì_ºt)~‚Œ—òa½Q>ãÆcß©s³³—©9uUþýGÍiGºuëæ'0tèPš¸eËQø/\¸PWìð d€}Tà=2óÜÜlŸ—/»`~ðâ™Ã—ιtöÈ¥sÇ,ΙXœ?¾iýÊO~Ü Á«âJ›5}]¢žÙ‰};þ0ÔŸ8–Ä^5Hø“ã"ÈÀk9 üð2aeeE>©ªú:u:uêT¼™9k6Ï)(( Áæ |||Nž|øPÌ055•ê,åLùÇËâææöÕW_=k4Ûñ¯¿þâÂOøûûó÷ ŽŽŽ½zõb)?2ÜÕÃ?¡\¹ë6ª ü'M¥]˜;w®ï3¨ Ù3[[[Úe.üóçÏçÇŽ(Nl´(üÑA±¡.Yiqyy9á¡þ·­Î]³8qÍòĵ˧®_>}ýŠ š¾aír½1_4mú?qí::¯ÑÄäø@Õ(þ¸ÒïÚ?¼ DFFêé驪¾®®îÚµkÕ™¹?f#êòÄ÷îÝ;|ø0¾™™Ù… Øc›ØØXž&))‰µÃQ‚ÖBë’×~KKKöÉ*1`À &ü>å„„„äää°ÜöìÙúîlذÑü…‹#b“I¹ë6*+ümÞhGÛúôi.üT™¢)]»veOû¹ðó Ø &„?&ĉœ?!Â=35¦°° >6ÂÙáæm«³ÖVç¬oþvÖì/»8Þ0=öçߣÍÓæˆ_Ab¯åÂïáw§öÂ/6ä„’]nþðÃÜ®%Í\‰ÒÒÒ´´4¾TTTÔ7XsýË—/‡‡‡óY¼Q ´FªÈkÿŽ;X¤† NŸ>ÝÁÁÁG€ê2l³iOçÍ›÷ô»ã-ÿ:x,ެ»£2Âáª-kÂ$îÚ÷ßO.\È«$üTÉbý1À.5*üqanñá"=Hû‹‹òÓR}½œîÙZŠÁ„ßÃÍÚ×Ó.Ð÷þ­gF ÿ´ì œ¿j0á÷½Sá€þ ¬Hÿþý­­­HÎ?~¬yÎäØÉÉÉ|qª8 Šª6 ’êTÝHPOpp0뎾¬­l³fkÖ¬ñù'´ý¬a?mÉ!Cž—Óà-ïº Í…ß`iÙ°¹_ýµ¸SmÚ´aÏüùþ-[¶`€]jSøQ^ŠhïôäÈ¢‚œÜܬ°oçû×y¸8Üðpµöõ° ô¹è¼}«¡þ½¤XÕPDx%Çú‡Óêê" üðâáììܯ_?UÕo׮ݱcÇTúäÉ“êó¨vóæMu~îêêJŠ^© ¦êCxxx‚,´…#FŒ`;Òµk×£Gz øûû§¦¦²Ü.^¼H{ÊRþ4kžpLlù@]µ ÿG}Цnݺ•¥%Szï2fÌ ° @í bŒoR¬_ZbXAnFqqQJRlHà×Û,|=l}î…:mßú{¹ðû© ?ý$ñ®«€ðÀ ƒB¡;i»Ü\²dIdd¤¤KŸ9s†}KÚ,ŸJJ ë¥çüùóêÌÜÖÖ–\¸p6¦Â ÎÏÏ¿wï¥WzG Ž³gÏ’í³2dˆ•••èüaAAÁš5kXë]ÝÆ›·“{×IT(ü.ž¡ìQ†ïÈ/¿üÂØõú'`·²PÝó“rf̘!N§?iâØ±cQD~ …ŸGr|`Vz|QanIqQZJ|D¨§¯§]€Ï½ÐráÿvÂ×bbeÂãFk¬£€ðÀ )®‘‘‘ds}===rHÅ3’““)qvvvbb"ŸH¶É¾À%£Ž‹‹Sgæ¬ËÍ+W®PÝ/Kù¤¦¦ò?ÃÃÃY¥€°¶¶æŸÖªâááAµ 6ž-¥ÐÚSÞ°Μ9nnn¢öÓ¶±êÆ÷îïZ^µŽNȬå¨Pø7ýñ'm^ïÞ½Å] ?iâîÝ»=èa€ÝÊòðáCVb¤÷âtú“&vîܹ窱¨w<Âï£ÉñYéqeæ_R”™®ˆ‹öÛ¾õ·rá—HüLøoÖU@øày‡»cÇŽªªß«W¯k×®qONJJÊÍÍåÍõKKKIùܘ˜˜[·nIŠ:7sÖŒèÞ”k?O•ªJð锌Ó"GŽqvvVj/mffFsIbíííÅ ©îPXXHÛI[+ãü”ÿO?ýÄöoÙ²E|NÎLÅ6ÌÎήG,刑£\}¢Ê=¼ÖB^øõ¾Ñgçò¿ÿ>ÛZúÅCàÇÄ»/˜ðoÚ´©s98Rõ]ø£}d"9. +-®¨ ÷èÑ#“õ¿‘LS.ü>¡´Òº ?<—xzz’û©ª~‹-¶nÝ*²ºi‹ŠŠÄçó!!!çÏŸç¢ÆÌœ„ßÉÉIÉÌÙƒtU%”Da5…ãdz†ýTA¸rå «VXYY‰o hÁ¼¼<žë±_þQ?Éü AƒØ.¿÷Þ{'NœµßÏÏ7ìß±cœ·aÆsçxF‘‡×ZÈ¿ŽncÚ*ª²ñÍ^¿~=M8pàÃ"Ö錌ŒpòWGøëI“žúó¢Â//üÆCçÛçL¤ç– ¿7)wÝ„ž/Èœ $›ë/X°€ì:ñééé~›ŸŸŸœœÌñðð`£hñÞõcbbø\J©4Æ®už˜¤ÅY[ ª;°_¨NÄÓêçääHöT\\œ–––(ËÉ“';tèÀvÿóÏ?¿sçŽØ†VÄ:¥ã£V5oÞbƒÑΈ¸ŒZ Iá?nVöqn›6mÄ f_æ®X±âÕ’Ä£ˆê=Âÿ|”·"Â+1Ú;ÄóF]„žŒY#v%† Br(šyAA†y’o“u“{³eîÞ½Kž!Úµ:3W‚ªTÑàKQ&–––ìQ?Õ&Ä 5©°öB2νvíZV& 4X¸p¡«««hÑQQQTwxR> Ù¨Q£xÃ~³óWHÅk'T…朲s¿ûî;qSÙ—¹T\n‹-âG¹cÇŽø€ðƒZ~mD„gb´Wˆçµ:?Ô¬¬¬ºu릪ú:u233SÒ`{{{É/pe_ ¨JµÌ¸’°ûyAAATàª6 ’¯°öB2Úïçç7aÂÓ{J›6mvìØ!¶÷òòR(¬]“­­-oØ?üóQöÎ^dãµJÂßí²mØ»w/ßÈC‡Ñ”:¸þ“?ükü#<)ÿÜõäÉ“›Ê¡2”ì ¶:ÂOËR¶,ÿÊŽqFéù†ÑvBøŸ_áOˆòÔJð“ö{\«á€úKdd¤žžžªê7nÜxÆ IR°Öø×¯_×DÔ©jpöìÙãÇ'©ÁßßÿÈ‘#<Ðpƒ H{HVÕexëÖ­ððpÍK ¤¤ÄÓÓ3©"(Û¾}û²ÂéÝ»·¹¹¹¨ý¾¾¾ééé,C’±æÍ›³vP³ç¸ûE×tpá¿s߃½pqqQú2wæÌ™.ÖÖÖ`W©Z:vìXòd¥ÿš¨¤ýꄟ-®Î´©ÁT\„/]ºT2=Ë}@'•Ò†±YJÚÏÖ.¦Á×»õTøµÏ„ÿj}?ÔC222V¬X!ÙåæÔ©SCBB¸ë¦–Ãÿ d}ì8pÀÑÑQ]˪P¥€µØ¿yó¦:‘¦û÷Ô©SŠ:Õ ¨v@‰e„ŸÕG,,,RRR4q„ê&&&\\Eú÷ïoccÃý699™wqC¿ÐŸ|i$uú ôÌœ*ìCZªPAtfò“ÒÒRÖ°ŸÁ:ÆaéÕ‰:Õ¨FÀVG«3$»NKKㆆ†^ºt‰U4îÝ»§Îcùh_´^Z{’ÆÄÆÆ®\¹’U”ttt–,YâþO"""Tö¿ùVç#¦ç‚IËk.Ê…à§Chuk×®åÛsõêU¦ôöööN|Û}}ý—üÙ>We²kþÂ][Q&ü‘A´öú~¨'8;;÷ë×OUõÛµkgjjš, ú!-û—'`íù™¨_¼x‘þdîÄ+d›b†™™™¬{뱟ω‰!5e¢~ÿþ}.êdæìË\Z­Ž}5Ì Ï/,,dÉòóóSSSù,^Aðôô÷‚5 b+¢œ£¢¢øR´.ª×jòäÉvvv¢o³fQtV­ZÅžÀëè6^±fc@DŠvãÛï¦Qæ³fÍâkwrrjРM¼víÚ}ï¿ÿì2Nž<)óxŸ¾øyl¥„_¾6¡äöâ×Á|¢º69êÄÂ_¯„ùâÙýú|ðqßW,àaþ@‹¡÷Hˆt¤ ¨Gá€:ÀÂÂBM•Ó»wo++«°°° û®—uNhh¨øgNNŽŒ™+A)³³³ù²ñññdÎdþb†dæn!‰zzzº¸a.\ Û¿uëå̧kXÁaí…RÔ¾téRÞ°_i|+‚÷دP(ÆÇöï9`ªEá£m;Ê–êJ|½Û¶•}ÃûÑGÝû'â×ëׯ§¬Ô¡‘àíá÷îÝ«á"š ? ¼Ø,Gü-€ØÂŸç¦®N=þ@÷›Ÿ~ÒgÌ ý…û×ÿ¸keï‰Ã?îÛ«ÌùÃÜ´$üñÜ.Õ¯€ð@-Bz-Ù‡´ê8::úâÅ‹št•áÄê2$wª¬”RCi“øï$ð¾zPªÝ°öB2¸ººŽ1‚r—.]8 :¿‡‡ï±ßÑÑ‘÷ÿQ߯Úú‡'W3(VÝW:zôhšøË/¿Ü8{ö¬x>ÜþÿÛ;ï°¨®mß?^Ðw£†X[b‹H jcyr5܈%ƨ±;XIÅhÄŽ51XAQéE¤÷Þ^©‚ ‚Q¼É[ÌÖ}·gÎ 30 ƒ¬ß·>>˜ÙgŸ2üö™µ×ö÷ÏŒ†È•é<¿&ÍÞHoðÓ–2¦ý4ëí(ü*.ü{vnüvÕ§ôÐó‰7Í#ìLüÏÍ;e¬Xç%ü.ª(ü‚ JD¼ìá‘esÛçD´ãî KF^–c ôÖ,.ÎSH”ðç'€`«Z ð#‚( N&®®nrròC©”””и¼¢Î–¸–ОnûèÑ£§OŸ‚ÍÒG233I©G$%%I:Nv"mvv¶¤c£ã‘fEÌÜÑÑ‘ìWRot<Ôì bÐÀÏχ……=” uuu²Ö?ü{a=® ¹¶ðu×®]¤`N÷ïoßx·(-·¢1A»irî¡C‡è^`¼CØ ~‰'ÒwÅÊ•+ó¥R^^^__ÂßJᇧe€}+¢ðwtáïÓ»§S\€Onœ]jàoq®ûC¯nõùm‰ÃÿíóNrô­âÜØÖþô8'• ~Aöþ=zDFFÊ(«`ÝD˜Ùš–ð=™K Ïr̼¶¶–$«üõ×_à‡ ÿô©èèhêó¤T~$…} 4c;|üøñóçÏIb?;!â-IÔáxœ4 ,++“>!aï±±±¼ùBð ÞÏ)=„Ÿfõ¬ö86ð‹O·Äoq®lVÏjƒEŠþ’¼8PkÕ ~A% ¿¶¶6|íÚµ«££#õ#Ù¥Kk‘êúð}¶ººZz‰"ê´½P($¢~N5sÚLÊDZØYT—ššJl¾‚*Óïáqö`Ü!¾¦uÞÓtuu%+ê’åzyÏúÙ³gloÐ?ø¿ô+iooO_Ž3fx{{³fž’’Šô/ЀHË9óF¥Þɾßl@Kh¿aÃÚ'삼⾾¾ _}õ}WÀ‘äËIee¥ì3;2ÖágÈ%ütU/IåôAòiÑ$ñ²œ(üWø ×|?gÃ2ð|ó»ý¡WÁö!¶úüöÙªY"án} ð£ð#‚°Âúôé… ’ï/]º$»óEEE ŠðUF3—EÔyͼ٤R”üƒ"""È]}ø ß“J›’ÌœCcc#+êp‚0Àœ³nhhtÖ°/ö4Åo::ºYµÕ´³³ƒöYYYRÆ#ÐFÆÄÈôaa)ãÙWƒœøp³—ÑÆÆ¦oß¾ôÆ2\"VûSSSkjjHŸpC‡%-g~=×/üNbF ÍOÉä\º-|ß4@5Êçu† Fß[¶lÉotºñsŸ´œõp¢Óây>dtp’pàGò8oÿð"’É¿œþa+Þù¼Ò{“ÞàðáÃtGð ýÌQ¾ðf†ß°=3{–n—.j:Ç^½x¼0+BQQ–ŸTœ“e§Ò Òœ8q¢[·n𸞞ž,j*Naa¡›››Q§fnmm}çÎvÛÚÚZ°âêêjú4 ¥rÀ333yO”›æØÃˆãþýûtsvŽ¢“¸ÐžN†•dæ¤%l"éLÁŸÉiBãfWƒS€öÅÅŲ\F8‹Ý»wwíÚ^ xEŒŒŒBCC£`\CgF9r„&ö¯Ý°-*Y˜^æéG&°’¤ŽÍ›7{3À±ÿa˜“ßjàE|ó~qÀ築h‹ãàöÐ--ËÓÖ'H©„(Gø 3#Ú(š„?':5òºŠ ?‚ H»TTÔÕ«W‰ókiiWËOFFYZ‹ujæ É Òdþ,¡¦¦†N¤%ïô)hFE“/š 6KTF÷îÝ£[Áa“‰´/^¼xòä }F1žžžÐþüùó¼¢NÍ\ dgg³'õôéSpl8TÞÓ„ y¯6\Ã7néÃpyÙ³†ŽôË›““C§T÷ë×ïäÉ“¬óÇÆÆÂ)“!4þï€Þï™î= ßO™2…Ý:!…åo1lܸ±Ùv奠  3¬Æ‹ ð·NøÛ*@ø‹r¢A§U?PøAÚEøA Áu‰öíÛ/­n´>ˆ:Íöñòòë7sÎA‚¨ƒ`³¢²KkQ3åñf÷[WWÇ™H òÉŠ:˜€uJ3'ÕõÙá Ð*àPဩ¨ƒÀÃ%"§ ›³ã8HrÌþþþœ³&÷çI!Pé—188x̘1äõÒÑѱ··bˆ§)4wïÞ¥‰ý„Ý»wÓ–W®\!Ë.x½Îøñãiû%K–ä+§r Hç~aFXÛ ? ?‚ H³Â€Ž9’l_eo¹ËEEE¸.‘^pì¼¼<Î=sé%n8¢›“¥~ d-¶CplIÙþQÀêI¾ŒG¨™‡††Â1‹›9ލƒrÓÓ„®`+¸†çÏŸ‡]\\ ؃¯§Ùì¨ ^)šØ¿hÑ"???VûaØB“”ÜÜ܆ BZ:;;Ó6†††ðÈwß}w“]`F@ùŠCJÞ‚ ð·­ðgGÝ£ê ÒnÂ>þ|ZºÄûqK …ÉÉÉì#RÌ\’HC·Q/ ͦBYrHHÅ~ºUee%ýèÁÝÝýÞ½{ìAJ©®O€S i9ô4aì@Ç#pdå,Šôç4Å)**211¡‰ý[¶l‰|ÌÌL’ÎOfe²ÏŽ;BîäOš4ÉýuhšP‹Ø•NII þÆ!(ü\áoã Äí0›m,üOk*ð­‹ Hg„V]]ãüÄy…ðððÐÐÐ ·ˆÁÿŸ={VÓ ¾él…B6™ŸÌ!”$ü "~úé'ÒxÚ´iUUUuuu5­#55•T×s.((ëHb?¯¨ûøø°¢=S3'+ÕRàˆ„766²Ú/EÔ©™Ÿ?>,,ìÁƒtÃÚÚÚgÏžÁx„ý"11‘œ&˜<ïü…††R‘Â>`ã0”à¤ô˘””ôÕW_ÑÏk¬¬¬ÂNŸ>MþEÀé»î::: \`WðNÃ_7…ÿ•ð*!Pøy…âÑý\|#Ò _KK‹ãü/^”"ü ®.\ )ý0^€fÏŸ?òäIm+¨®®)%®+} \^HÅ~Úˆº««+u8쇒վ Ø üH[òV WgO‡ŽGlmm‰¨s̼¼¼œ=ð|Z—†ÌÀ¥OÁ®éiræ/¤¤¤Ðá@zz:Û!­á § Ú/ýJ™ÒAœ®®.þ¥K—Â#0 ¢ `L¡ðv%!{E&y³…?/-P Ñ$üaIÁ—:Z´¹ðCÔ?}„ocA: ÛçWSS;yò¤áOJJ91bIé777'wÚk[˜3tKÌŒº‰ý¬¨ƒ6ƒ<Ó ™Ð3ÇÌé¾âpD.Qdd$u'''úyDVVÇÌy ûÀƒ¬¨ÓÓ$ùB0ˆ ëðÂ8‹,òE€QŒxþO³Ã+ðùƒÒÄ~"ù~ø!üèææFO0//]`·OŸ>ùm‰ìóä ~¥Di^¢Hø/v¸P‚ð 3B^4þ‰ïdA:¡ó³µ‰(îÙ³GŠðð-©££KæÒ¶*À¤ˆ½\'Ki¨¨ƒB»ººBŸ²˜¹Œ¢NÌœí×Ì9466²¢NO“XQQÁ~ô eMÎiò>¿nÝ:šØOØ%c¨‡z{{»¸¸Lœ8‘¾âß~ûm› ?ìÑÎ ü‚“!^$ ¿¿r„_˜št¡F› ?DiA<¾“é„€ Λ7ﯳcÇ)Ÿ,âèÑ£$½|R €$ƒN?i5°;2»¬¸¸¸X®s‘r ¤À¾\½‘Ä~ÚƒP(¬¬¬¤?ÂS²¬öE!ùBòYɽ{÷ØÙ¤ –&%&&fêÔ©äÕ\¼x1ôîææƒ ¸°ì»çÎkSá—4AÞ0áïÝK½{··O[ìà~¥…HøC@ž;b(Aø1™AÎ §>?°bÅ éÂûöíÀÀÀI“&‘öÐCuu5Gk[Æ£GBBBxgàÊÉxçôyÿþ}¹*A'1"$$ ˆä‘š››+©7JÈ»Lïir#`øzzz¡¡¡žžžîîîDø÷ìÙÓv 슃üýB:ƒð_¿xœ¿éçbýÛQŽí)üé!‰ç:b(GøóÓü1±AN‹©©)Çùg̘!EøïˆØºu+x#É«¨[ý%%%tÊ-tÛlæ 0^öþ< "h~³¢fnkk ###%YMŽP–”•ŠŠ Rú^Royyyd¢±Œ§I¦óŽG`ÌE?&€ýz{{ß¼y“~ZÒ˜2eJ~ƒÂtáO¾`£;µ)_NScÈ-ç³ÿþ;¾J ‘ð'XuØh•ð»\Ø+꬙A3Võiº~cc#üHŸÊÎÎf‹ü³û}ñâ;Ô«¡üùçŸp`œñ=M0sÞÓ,..¦óšá… ÛÂu¦ À¦¥¥ùøøx{{‹ ÿ‰'Ø(ü¢XáOsX[ <šÍŸó¯´8% ÁÝàxÿ?:pÈ/ü&F³zª¿ý1ôõ¦ò ?ÄÓ\ANMHHg)^rß^ºð§Š°¶¶îÝ»7™É Rú·ânõƒûûû˲./$ãö"JÍ›š¹««kQQÇÌ9iÅ?8 ¢}’9ªB¡ÐÞÞ^ÜÌ9÷áÿ~U”=MnÐÓdÇ#tœQUU%>®`Dà'B’ð/Z´ˆ¾¦Ÿ|òI~ÛƒÂtBáÏHp‹±ŸõÕh9tð¾nçsn{+'DÂﶇ<ÂÀ仿ÿ>V.û&=ÁS’ð—äÅâ[ANŽø²\¤~#˜­táOKKƒ6´ìžž^yy9)&Y§ œœèÒZ-H쯯¯§½ÁYÜbæ™™™ì¾8fÎsR>¤¢NTŸ˜yuu5mÃÞ‡ÀîxO®sll,]›¬¢¢‚6cÓõÉfÒ…_CCC ì²À ¡N(üdÒ®ù¾»¨©A¬[¹0!Ü)û¶w[~Z`8s‡„ÿì‘ÕZŸæU}}½©¡¾W%©> ÌêAá-×9jÔ(éÂWÄáÇIÑN²>ôNËÊvk€þé¸Íf¼‹‹:x2í <9444**ª¶¶V3—.êÅÅÅDÔÁÌËÊÊØc–¥†gcc#{‰èi’¹Æ999¼ƒ8…Áp#00Pºðsòµœ• ü÷ïßÇß&¤3ÿAý¿ÔÑ ½u‰S–ÓÇõüÄÏFÁ&½{½ þ´i”æ%ˆ„ÿ·ŽR…ÿÚo[¾œ¨É«úÚFßt<Û¬ê“h¨«Æw5‚ `ffÆùsÚ¿@Ь𧧧‡‡‡ýõ×d+MMÍ¿E÷Øâüàçt®\«;-Ã0ARÏ%%% Þr]%’ØOᨾŒÕõyÇ#pš0IHHàŒ€óƒQÃ… –Eø7oÞ¬´v)áZöH§þ­Fß‹¬^ýŠÕ*üYÉ^$~?±„Œ¥épõ8}\á!þ€8ß3=x…ßÝf×ܯ&òªþǚì­ɨúX«A„ƒ››[×®]9«ñš››7+ü".\¸0tèPZ«Ÿdø€ÓÖ+‚ÊÊJ’ÙÀøBR©8ìK—.Kê3::ÚÆÆ&;;[ÆëzïääG"©CxV®Å§Hm"ޮؑȃ"##ÃÂÂdþ/¿üRi ìRäm TøS£oXYþLJñ¯5˜ÿRø™H‰qÙ´îû.¢eïf}5%Òß–Ó@!QšÛ$ü±MÂÜÑã5á÷ì[¹XWMíÄU`ÿ÷OÛ%—ꓨ,NÃw5‚ +ɃsS%—.]*‹ðgffB›M›6‘ZýêêêVVV¿J†Qˆö¸$ã]ÒYЉ´Ð ORo¹¹¹´"tQ•õõõ%ÃGIê4oV}ášt}ññ›®ý$%%EDDÀGváwtt|ûí·•¶À.E®õˆ¤C ZŒcè­KÆ}*º“?‚WéáÁMÓiª©¦þ£Å ª¬Ï©7 ˆð‡ºݲfN··ÿW\õûô~w÷ŽõRfæJâÜh|W#‚°TWWO›6óÇvôèÑ ™Í ?•• :yòdZ·Ì –Ì¢U‰‰‰DÔÁêKJJ؃¯©©ã%âúøñcº™\ÀùÐ@3ÒtZ\Ô©™Ót}öHà¤Ø±Ì½{÷è Ü„„I³òòòHÆ>|…AÝœð$msrr¢¢¢"##å~@0{öle.°K(,ÄOÌ‘Î%üdÒî—‹j¿ýûñŸ3=ÅãêùÚM}èÿÞ®ŸÖćx›µ @øóRýcD¶üÄËû½ßS\õ»tQÛb´,9ʹeªOâ^V¾«AÄ144¯Òoaa!‹ðg‹°´´ìÓ§ÙÖØØÆD¶ˆ=up]øŒŽŽ¦©þååål{ðg6»žƧϖ––’E¸._¾ÌŠ:˜9Y$ F`æl‡ì}xè\>EWËŸhLWû‚ã„£%¥;؜ãQ4Wø7lØðî»ï²¯šØ%È5·AÞáÏHp»asŒ$í¯X2çN´Sf¢‡xìúi5?@³@Ï‹¼ÍäŠ&áOñ‹ñ¶ìèaypýð¡xÓõ—,œ,hê£ð#‚HÇÊÊŠ$ç°Ì;,TáÏÉÉIJJ200 öíÛW ü-ºgÎêqk«'÷óÁŸ©csÌüùóç’&ÒrŽŽ™® 'E×á‹‹£fΑs ùƒ€¨“ÑYZ z]§ëðVUUñF`ÃÄÄDØ#~èÄÃãYá?qâ@Á—E9—eÎ)üàÞñ!ö“¿GÒ{Àÿ%)ú³-š/W*ÿzæd)-åþ“7lß6nôG¼ª?cú²ÔÛDáGi=111šššâÕ{®_¿.‹ðçŠpvv¦¥þuttH j?uq3öì™”êúTÔÁ·é&°9tBò…ÈzX¬™ÃK¯êÃùà€.õK>; Ëu …BÞ à{¸z ñññDø/^¼øé§MÂÚÚÚR„ßÞÞ~êÔ©âÿ.{ôèqðàAåØ>'± AÞlá_øÍ c£%Tø3ÜI˜þ´šLÔ™÷µ¡sâʹC_~>Žt„ㇷIj)=@øsS|£oèˆáb½{Êç#%ÕÛt¾~JQªÂ " ÕÕÕô.=‹‘‘‘ŒÂŸ'ÂÄÄ”®ÒE¦Üío=¤Ì>ýäY®…ºÈýyº9tUZZÊî‚“Ô¬öÓ lllîܹÃ!ŒÀ7EEEÉÉɉ‰‰Dø½½½çÏŸO®UÏž=?Î+ü7oÞ\¶l™šH0¸‹ÑèëÃ!_YÔÔÔào Òy„’Îx|¸Oü/‹„ÿ¿žÿõÌ/EußÚ¸vÑí(GN^N¿£?ìb@¿÷V|?ÛÕƼÑ$üw|¢½Žw¬¸yÍlÑÜÉŠª·)ceGà»A¤YÀWßyçÎç1cÆøùùÉ(ü …`¼[·n¥iB0Ž …¿ÊW iii¾¾¾rU‰„£å> œ”¼W öÎöJL¿g#UUUpY`øC„7n$ ™Ë—/‡áÍáß·o']Ÿ0vìXå,³E±ÙORäMþÔè«WÌ#¥ø/œþ%#Þ•ë£$uLþ·_wŠ7 îc½ö‡ù¤Âç+óׇͥlBƒ”ׯ%ü¬Z2CR‹ƒÛÚBõ±,'‚ ˆ\€×éèèˆÏä=|ø°ŒÂ_ "..nÕªUdó®]»“Šýì=öÖ ?Iì‡}5{«¿²² ÚJêÐÖÖÖÞÞ^ÆB4ÐüÜÍÍM¼öc‚úúz¸h)))TøÏœ9Ó¯_?šû$x'íÂyÁP‹ç?fŸ>§OŸÎW.ð‚ʲ&‚¼aŸãhóÇ~"êk~˜Ÿï*{MדÆt¹~‚· +VÍÿ „Ÿì6„áA)›”á¿ùk‡ˆ-kæôz·;Oòa÷n­©·)cÔVaÚ!‚ ˆˆ/È |óÍ7 ÖÍ ? 諾¾>Ù\]]º%e|@‰Ÿ)82÷Ê•+°;Þsa'ÒúúúÖÖÖJê->>žÌÀ½yó¦ôõda¬{$²=°s‡áaìp÷îÝÔÔT"ü0:øâ‹/ÈÕ8<«ú4ãú„ÃÈÈÈHOO'Â>¿téRúqÉÆé¤]ŽðoÚ´©[·n<µ,fÌ€±@~{€©ûH'þô¸¦øqÃRRoó̱äNx9œ&ã@wêÄ+Vûy›‰oµaÍÂ!ƒL÷)oƒ&á¿}+ÒÓBeã·Ãë‡íÏ›®ÿíÜ ©·‰3vAÚŽêêêÅ‹óÞêAå³\¿~][[›Þßa&Ú¯»ý ê·nÝb—ÖS%å79fNUŸ=SÎè†Äê¯\¹’–ö2)¼×ÛÛ›Œ@ÑÙO Ø„¢'OžÀhÆDTø÷ìÙCÓõ,XàççÇVé¡Âüøñ?üPüj6ÌÞÞ>¿þI‚tá§awéÉÞY¾X?&à*ûÛæß3&‘>55úe#o3Ù£$§Iø#<ª`XŸÚ¢=NCR½M?‹ÊQ}LàGi=¼3y{ôèannN„_.@˜?þøcªý–––  ßàÌÏ[ͽ{÷ˆ¨ȺW`àl)3O‰öSRRRHÞôJ>D€aEUUmCVõ%›ƒùƒ!g0Àæ´ÞégŸ}vãÆ ¶J~ðy:â\d,ä·øþG:½ð;±pEwêD’„#’y'Þðsûcáü™]ÔÞ"-7,… %5–MŸìáa®Rátq‡îä1’êmÚ]>¦LÕ'ñ´ÿ^!‚´ŠÌÌLñ™¼€–––¯¯oŽü=z”. ¥®®njjJ¦ô*Dû‰¨sÌ\ºê³°Çƒº°/h9 (èSìÇÐsIIÉ]???]]Ý—Ù¹½{[XX°Uz¨ð,_¾œ·äæÊ•+Û%]ŸRVV&c…Ry“…Ÿ/N[˜ è×G”Õ?Üîâá»šÅØ-! €ü/üf†³í1I%ÅKáw?¢"áa³káìIjjÿÃóqä¬NíU¾êCçFãûAD!˜››‹ßêïҥ˺uëRSS³åçìÙ³'N¤•| `dÁQn… Wéο_-ÔE7¯¬¬„A„¤±ÃÇÓÀ猌HURø ߃޳Uz¨ðïܹ³W¯^<÷Ç´µýýýóÛ¿`NäþìÐß;>¼y㘸ðKŠÄ0;£Õß‘{øsgM ñº ¥å¡=† @çç‚ù[Ÿ5“Ò9 üÙÉ7ÃÝ·{:î_¹xz··»òÖÛ<°gs»¨>ÞÞGQ8åååzzzâí‡zñâŬáææöÍ7ßЮæÍ›GVé%éý ÁÝÝ=""B|®$êêêüüüx»b5Æééé) ½{÷¦ëŽѧXá·¶¶ÖÐàI|8pà¹sçòÛ´}¤“ÀYm°ßÞ^Ç_þhéáçòûô)š&óv{ÛØèûÄÐëR[ÿn¶|Ñ×ýE M`¤púèvé»hþ¤›án‡Û7¶Îí©Î_osûÖ•m]ooï#‚(ñ>d2/xuf‹€ ×®]K'·jii±³z[ ™l{ùòe°né§öâÅ‹¸¸8’ÃÃé„M×þüyvvö[[ÛÑ£G“ƒ1bÄ¥K—îˆÂ0sæLÞt}“ŒŒŒv·ý²²2´}¤“  Ìqþ[Ž'©ðËV'w ÔT¦¾ž:º­ÙöŽW­^ 9üå®»¨½¥÷¯/ ÞÆ üYIžanÛ+™.éûž:o½Í•˾QN½M¼½ Ò.TWW›ššŠÿ `—èj ÛÐí€ØY½¤t?øvkœd›Ôç%%ü‹³äääYºð5++‹WõáØ<™~Á‚ä€{õêõóÏ?'ó»~ýzº1‹¾¾><›¯™øöF:³ó÷êùŽƒõa¹„ŸÄV£ï»w{›hÿÁÝF ¡×šÝÄ×å·[WL÷ ÙJ¢ð'z†¹T~œ>°êÚ½Þ&çAi_À¢y'óN˜0œ9½üúë¯tY’Þïããó·è†ÿ‹–RWWA øx{{×ÖÖÒ©¬¬tww§ëö’J›V€«ªª’bbb6oÞL?•€ƒ Mâãĉ¼éúcÇŽuvvÎW Ø% ¤3;÷nÿ¼vþ@j”@Þö´Z½|.lNrõV} ȸ¡¯óÞ§DÂïêz@™qéƉc‡óªþ”IŸÝt<« ªQ’û×_ø‰$‚ ˆ2°´´ŸÌÛ´ôŒ®îÍ›7ï¶;;»ÿûß´Cø§lffÿAÂ[lþ< nÆ–NF~~~0  -ÙÌ–úúú”””†3gÎôëרçŸîää”ÀœÂøñãyæ¸õésúôé|•. ¾“‘NKuuµ––Ökù*joí1Y•eß‚ˆ¹j²e9ÉÕ‡~æ~=ÅÝþx˺‚(ɉËJtuÙ¯œp½l¢÷cyU_k´f»Ô۔Œ\ZAD™”——Ï›7÷ÄÂ… Á¨[£ý°ùÞ½{‡ Bûœ6mšMCCC‹µ?//ïÚµk´b?Y‡—U}zc¿±±1'''žÁÑÑ ŸŽAÀÛãùðññ™?>_âkCCÃö-¹ÉF=øFÐù9Î|7ï_ñÁWS"í[û6>ˆt5I{Ìåßö´ “&áOpuÞ×ÖáuÕt¾ŽÚ[<õ6ö¿½êmJ‰ú§¸, ‚ H;ŠËùdœ*®‘‘QtttZë°³³ƒáM¡QWW700ˆ‰‰iÙ ÿgÏž%$$‚ÔÔTöq6]¿´´4–! €.= ‡±aÆX Óã|mõÉ3ÂÂÂTGõ jjjð­‹ Äù§M›Æùc÷q:•i×âÏŸ>ù³—59{ª7OWdþ²nŸ™àâlÖvá'ؽv©®jÖÛä‚ô œ¨‹ ÒŽ444HÊðéÝ»÷Ž;R[ XúÁƒ'L˜À¦ú˜››“ §ÿilºþãÇaG1 pðݺu£õˆ¼¼¼bø€Ó4hÏ’4ÆÙÛÛç«÷îÝƒ× ß´Â£un-‚nÿ¼tf÷ˆë­ ·ëÇ–.Ôëß—ÖäüçœO±<òc³¾~§½m?®ÕS½o½Í-FËÚ·Þ¦¤¼}ÌäAQ‘efff¼iú÷ïJœ¢|||V­ZEëÞ:::ÐyFF†¼æÏªþŸþyûöí(†ßÿ}øðátší•+W¢øpvvæÂÜ£G={öä«÷ïßÇò›‹@ `×ä"¬Z6;.ÈúNĵV†Ûu ÕßÐTŸ¦šœº:G÷m”Ô9F‚[°Ó^…Ç“…è-©Þ¦ŠááÄò,œ¥‹ ¢R”——ò&ö=š·R}Ë8{ö,g90MMMccãàà`YÌŸÚ>|Ÿ››Éàää4yòdÒgÏž=÷íÛɇ¯¯ï²eËÔÔÔÄÏtåÊ•*•®O€¾?D ðk+ž 8úÓ@×ï„_SHx;Zšl^úÙØiîo³&áw vüEqÒl…Ö§ƒxÿ8ëëM õ½ª‚ª_ô¤º ß™‚ ªIff¦¤ù¼“&MWW”öGDD=ztΜ9lò<Éóõõõ‰A¾¯¬¬ g W'_á{x$œmÛ¶ÁX@üì´µµýýýUMõ áRàÛAš…7¥_Mí­-ëÞ·U`ºÿ¶×Ú“‡·ò>+~— Ç= K£IF¨~½MñµtŸýùß“‚ *NHHoº Y—vÿþý·ÊÅ‹—.]Ú¿vG0î°²²*((àØ~MMM\\\ÃÞ½{©Ãëê꺹¹…ñ½}òÉ'<-·‘‰‰IFF†ª©¾P(Ä4iðçBSS“çVÿºïâ.)Eøƒ~nqxXÿôý¼Ï%ÕÛD™0çç"‚tP¬¬¬úöíË«ýÝ»w_·n¿¿’¢>÷íÛ7mÚ4’¥³wï^Ðà`ggçÙ³gÓtýü1˜__ß~ø7]___,*xc¿¢¢oì#Hkhhhà½Õß«ç;ûL×$‡]i»(ɉMs ¼±«á}ÍÄhÅ¿$ÕÛܽc½Êªþ½¬°ºZ\ A¤Ãÿ÷´±±‘t·túÛo¿õôôLl`@»Øºukà+¼½½×¬YCKn.^¼ØÝÝ=ýû÷óUÆŽ ãTý¢¢"ÌØGEÁ{«¿)/ñ£/œÚ™jÓQ’›ë(0•7L gõT[R½Íä(gÌáAA”ƒ›››¤Ü~`æÌ™vvv eíÚµÐó–-[^A×Òš0a‚µµuçÎ3f Ï]²>}Ž;¦‚ª_PP€9<Ò7+xoõ_Låb{8)ÔZ±Q,þ©ìqÄtá°Aïó¤ÊÖÛ$QYœ†9<‚ o*!!!’*ù#GŽÜ»woddd¼" Âï÷ŠÑ£Gsaqqq™5koº¾¡¡¡ –Ü$5ö1‡AÚŽÌÌLN)`Ê´/Ç]9»;)ÄZQ!~Çû²Ä™ËÇ|ò!ï͘þ…jÖÛDÕGéT…BÞåºHzÿüùó%ü¾¯ ÂìØ1_1Ö¯_OS}^û×9cFXX˜jªþŸþ‰ï%Q>>>¼>Àx­'nJ ¹Üúá¿ëèo¿Cz\;½þ‹Ï†óŒö„Ñ*[oUA¤sR^^njjúÎ;ïHºá?xðà;wƵˆ5kÖ@'›7oöy~ †ƒ~ðÁâ{6l˜ ª>‚ KKKuuuþ?Vö3Û±*1ørk¢IøcüíL$ųôuµ$ÕÛ´¶:„ª ‚¨&ÕÕÕðoTR12±wÖ¬Y§NŠ•*ü·^1jÔ(xäèÑ£äGkkëñãÇóÌtëÑcÏž=*¨ú•••øžAvü{ellܵkWÞ?V½z¾óíìiö̃/µ DÂÃßn»x¸^ܼ|þ’êmZܦ²xª*ò_4â Aä%@R®,¡_¿~FFF^^^1²±zõjØjÓ¦M7_A„ÿÈ‘#7nÜX°`oÉÍ•+Wª`º>ª>‚¨”ö›››K¹MÑ¿o¯u+f{ÚM º({€ð§Eß𻾛6[ —M{÷þ"<»w¬OOðT5Ï/Hª,Nk¨Ãb‚ ?B¡ÐÔÔTÊÒ¦uá§L9pà@hhh´T¨ð{¾‚ÿܹsß}÷]žôWmm¨Z±ÍÇã´\QAHÍaI¹ý¯êjj¼ÌÉæ`BÐÅfC$ü¿k?ÑØµqÖû½{ðUPSÍz›¥ñµU%XiA‘@@«hJJõóß½{·ŸŸ_«V­"ÂïñŠaÆñv5pàÀsçΩŽç>|øðùóçø6@ÕÇÍÍmÚ´iÿJ¿¾½¾=õðîµÁî§/ð~ßk?A2™?lPÞ®–,œ¥Rõ6óÓüË o?~X„Yú‚ HË(//777—´n{s~ûöížžž‘ Dø7nÜÿŽmll¾üòKÞ’›&&&*RQ¿²²²®®_wép…B33³fÿX5Ýöÿx¨Áb½3æ[|MÜ*ÄÝþ9~ŒÆÚåú‡~^ãxí¬Þ¿>—ToÓùú)UÈØyPš^[U‚ópA¶£¼¼ÜÒÒRKK«Ù£Ã‡'xºwïÎ;.pvvVÉÇü|ySÒg$5ËǚìNím¯\0üG÷sÀðÿ¬¯ÅAQ¾ù[YYI¯êÃKŸ>}Ž;¦|à …eee(ùÒ ¹}û¶¹¹¹¼¯úô~W õ6‰Õ“[÷îçVUä×?}ñŸX AQª««mll/^,©26›®ohh¨„’›àöUUUOŸ>­¯Ç‰l‚4ÑÐÐàææˆ¤OòUWW‡4Æ+† ‚ âÿI xSgçÍ›' ñ*!¢:dffÂ_-333===2Û·k×®¦¦¦ÕÕXÁAAš!$$ÄÐÐü…ÿ¤>>>xMDøïl½ endstream endobj 1062 0 obj << /Length 1892 /Filter /FlateDecode >> stream xÚWK“Û6 ¾ûWhz)=«’Hê‘K'Í«›™¾¶Ûé!ÉA–h›]YrD:›í¯/@@¶¼»i;;+’ €Àþ¥qrú·Ëë·Q%ð—§*Î*•Š«¼ªªh4Ñ&úm‘D[`¿]üp³øîL£ ØYÝl"Çy%£Bg±Î«è¦Þ‹Wv½î̸\ÉR P/W©HᣳT‹?œ¿uÈTâíѶf¹Ê’<ÍD–,?Þ¼[¼¾Y|Z¤Ážô$^•q!eÔìï?&Q ¼wQ«ªŒîÂÎ}óì‡yý¾8›üµqҺ㬨"¥‹XÁ@ŧEœk•”aÇlX2ßda­2ŸYß]íóèÕª{¤d5iYÍÔg–QšÄUR¥èÌLåq þWRÆÜ%xóÝGp’”RäÏÑE9?¦Š¸ÐhGØÿ²vÍR§¢FÏJ]Šq©3aºúÞÿ~Í!lYep»<+ÀdÉ.ã Ñû•Nñ‹ß™ñÎ:ó BYja70RÔ]G“a"¬qƒ–ðùŒCtçÍÁÑtSÛα ì*B)wÎn{ÞXÓ0Ö};ì™Ô¶£qÌøÐa4’T}añã2´_ w<p{½iy;[¾ ÷dœ'<¢chòÄÍÎ"†“n¹Fëw{ZNd^N‘¶A£dRˆ~èWÞì1/& êñžåÑ-Ì$¾çÃÓE µR2WþRc?øÿT] PË*Wán«4+™Ã(c­8ƒÙ)ÏÖÄ„<DšÆ•Ö‚$§Tq–J:¦bWJ3-®‡£·ýdZ4C–Œko‡ž!œÎÑ6‘%±®ø.«\ÔcröÕ:½ úWG{Z?Ð8Ô´™U:"ڞƫ×7op–‹5âëžæ51Ýp ”Y"ÖGOÄ€VBESwDÛŽÃñÀÚ6$b˜ß›OxÇ‚6Ç“„5xj=¶öïšcPdq’s `ÁS+©r<+Ø–ŠÕç=e#”pú/°²Ï—ט£B&²V|$9-fC½ñ´²¬½”;¼Cíˆ\¯1ÕzÓ"ü v_ñ±;‹iŽ;€ ½º¢äFþá¸î@ ¢4;˜œ´,”…_¿Á@¼¤EË÷=îÙ‹¬ñ%Þ‹1ø,¹D¬§|ÄnLí¹`ªS‰EÀ~^jPç™n¾x†žü©øƒt[¼œÔb4 [ÓÝ/á]{FäW?¾üõsNs”gÓ>ÕÚ–’o²¸7´ªi GãçžÆ$2KëhÈ)µäãÔ ºlÙ¾?åÚÓ)4dJ4°ŠnV”6C¬¡ïîivi_¦O§[ÓYªä#8Ù¥Äâ3»Áyw’[fü£cýXD&¹/ZVã­ °€T'ÎÞ4ÈÙÕ=pž‚FÀu¥ÄÏÆnwxpÍ%ÉAëšÙ‹ €Ôñêÿ̸´|”qà\xMÅŸ;Û’åwµ'ËêŦk%8fo±~¨¤ÖÓ™õ¡w|Іà‹ãsÞÄUÆv¬qËÝš4Ü:6媟{‹ËΡ7Ç®Ÿ_^ö@&a[ë”7§O¶×/@ožÂó} ¬Özò4@8X™g¢üJ¨ÒŽX¡gÀɄ؈<zãQ»Ât ÒY…À yŸSµ {q ``xf´6è9,Uܰ›dÊ'ØeÁ¬€iY„3Ü‚”áÐÕ µ JŠŸ†ÑÌkgxªV@à‡Ü°=öÞž•CÅvx$sÛýDù÷4]*‹DMy£ ©ª§ ÕТÒJtS›z_dã]p4ç@áÒ™í­HÀ‚äÒp®3ÁÏX‰0pÜàϦì§tÅÅÉ˸øëˆÙ†±X9 §Ø¹•?}8¹ºT hn*ü&\Ðö6¬÷uj(¤èlëþGbÉ'ëE»·ð¼z×0rj¾Leˆ&˜ºA¿£ÙÕ¯ŸÎÊé¡ZˆNöv‹@ Õ –àI;Òæ^geÀÀ½"¡(w;µ¼éÓѸ«Ò³^CK>80µtÏ!8E)>¤Rý8aW;ÐxEÃ9Í ¸è~ÿ f<Ðó®Ùó®1PüŽOBòÏß €]ïî–³µ¦Á}0»¸à%xέ:„o€2>Cÿ­ÿ&~ò÷ÿë›Å?ࣕ endstream endobj 1035 0 obj << /Type /XObject /Subtype /Image /Width 847 /Height 1178 /BitsPerComponent 8 /ColorSpace /DeviceRGB /Length 75307 /Filter /FlateDecode >> stream xÚì XUÕþ÷û?ï{Õ÷¹Þëf¦Þ(MQ+-s.#s@s*Ë0Sɧ¡àjŠf†š†3` ¡äQAP™„Ã|@†Ã< Žùþdéú/ÏÙçp˜úý<ëá9ì½öÚk­³±Ok¯µ~4)J¥ÒO3¹¹¹è"€§[[Ûj¢´´}ðtA תU«t M›6¤…è1€§ggçjƒ±±±ŸŸú à©ÀÌÌŒ‹Ü?þñöÁÀÀ oß¾Cª144TW>SSS¥R‰ÞÐs:vìÈnåʕ۷oùå—Ù¯“&MºZÍ_|¡î{­Zµ²´´ÄD>½%((Hô·3gÎDDD/]ºÔÀÀ€Ýš5k’’’<<<Þ}÷]uå#W´··GOè!VVV\ÛºuëQ\.÷ññ111a§^}õÕdddÐÏöíÛ«+ß!CÈÑŸz…±±16333QöˆÈÈÈ#GŽôë×e:t¨§§grròòåË[¶l©®|3gÎÄŽ|z‚R©Umÿþýê²GDEEmݺµ]»v,ÛìÙ³Yž‰'JNä³²²ªªªB÷4/vvv\Ò Â«‘”=",,ìÛo¿ez­[·¶¶¶ÎÊÊrss8p äD>gggô0@3bjjÊõlìØ±\ö|||fÍšµÿ~Qö¢«ñòò=z4»¤gÏžG%åûõ×_%'ò9’Œý ÐôTUU‰3¬¬¬¸ì€&ÃÜÜœËØ Aƒ®^½ÊdïÚµkªÇýøÖÊlFßwß}§"{qqqdw¤y,ÏK/½´eË–œœWW×>}ú¨+_·nÝÈ0ÑóM©×°Å‹sÙËÏϧ³>>>t¼m»åc?žÄ²uïÞ}ç΢ìñññgÏž6lËÓ·o_’=R¾ÿþ÷¿’qÖLLL ú ñË墀‘žqÙ»}û6eX²d o:=,.›Òa§3oö´êöí·ß¦ü¢ìäoû÷ïÿÏþÃò|üñÇ¡¡¡‰‰‰|ÜO ÄYh$ÄÀ:ubpÉôHÞèì½{÷Þ|óM:õËo‡¯Æçð´ù»¶í:°«¦OŸ~éÒ%Qöˆ„„„5kÖ°½V­Z‘1¦¥¥]¾|yÔ¨Q’ùlmmñ]48C† áÒõÙgŸqÙËÎΦ³©©©t¼EË–CÂ9b ŠTÎ_´ÒÀÀMä[¾|¹\.e £2ùD¾½{÷æåå999õèÑC]ùŒŒŒüüüð4¥¥¥¢níÚµ‹Ë^yy9eضmë÷"¹’ÉûrÔÔ™³Ùå;wþí·ßDÙK¬æôéÓƒfyÞzë­sçÎedd¬[·®uëÖêÊgjjªT*ñÕÔ{{{nY-Z´ d²Igï߿϶OYµfƒ|?KR·xñâèèh.{DrrrPPÐøñãÙM_}õUGGÇ‚‚úÙ¥Kuå2dåÇ—P[üüüD­òôôd²qïÞ=Êðå—_Òñ¹ –F_˯Uò Œ™þÙ£÷³íÚµ³µµeHIIquu0`ËóþûïSe²²²V¯^-gmæÌ™ˆ³P+,,,¸MõíÛ7¬’½ÄÄÄBàŒCGeÑIùuHÇÝ. >š•oll|âÄ QöˆÔÔÔ;w¶oßžå133£Sqqq“'O–œÈgee…8k:"Θ7o—=8#44ôáž*†­¯ÆeÆ$Ô9Ùþ³ûk=Ù]Æ$Ê‘ðí·ßò‰|?ýôSQQ‘§§ç[o½%9‘ÏÙÙ߀v”J¥(Q‡æ²Çg¬]»öaü‹ñ“cS ꟾ_¿‘Oä[ºti||<—=e5cÇŽe•éÕ«—‹‹ )ß:tè 9‘O.—ãKЄ­­-w§¶mÛ†††2Ù‹}P8cРAtjÓÏ»âR $Ë“fÏYÀîØ¾}û7в—VÍŸþùÆo°‘L|O.—7N2Κ &òˆ”––¶jÕŠ+Ó¶mÛ¸ì±À;wî|¸=ò¡ eac¤ý.ÿy<‘oìØ±—/_eˆ;w.³¶}ûö’’777¨W…nݺÉd2|­ ggg1pF@@“½ˆˆ–aâĉtjÅw?$(‹/YÿôK»öØD¾o¿ý6::šË^F5~~~|’4d”ÄO2Κ‰‰‰B¡À— `ffÆéÝwß ­†d¥-//g3dîÓŠ5…E§Ìÿv›’×¾}ûM›6‰²—YÍÑ£G{ôèÁjûÉ'ŸDEE‘’¾ ………â¬à9G œñý÷ßsÙ+..¦³nnnt¼ó+]”}ìZzqc'¿@ùãùEÙ˪ÆÚÚÚÐÐm¸GuÎËË£:3Fr"Ÿ­­-¾e<Ÿ¨Î8uꓽððp8cáÂ…ƒVÌ2ã²—”Ñ騋Ûë}Þäz©ž¢ìeggËåòÙ³gó‰|‡º~ýº««k¯^½Ô•ÏÈÈÈÃÃ_7ž7¬¬¬Ä¥ !!!LöèìíÛ·™;íwpe/9³¤iÒ†ÍÛÛ·´·Þ7ß|ÇeÈÉÉñöö~ï½÷X†·ß~›~%å³±±‘œÈgjjÊÞM<'súꫯ¸ìåååÑÙ«W¯²‘ Y*²—ÒTI§4_ôho=CCCkkkQöˆÜÜ\{{û.]º°VÌš5ëZ5_ýµdœ5KKKLäÀó€Jà ;;;.{·nÝ¢ dV74;N¡,T•½,J¥M–‚å‰ã'MaõìÑ£ÇÑ£GEÙ#ÒÓÓ×­[Çœ°M›6Tó‚‚‚€€€aÆIÆY£ÆâÀ³ ÷ƒjÈô¢££TÎ`oH7ýü›¤ì¥f—*›6<ã=`࣠¹£Fò÷÷ç²—WMLLŒ©©)ËеkW''§òòrúùꫯª+_ÿþýýüüðàYÅÄÄ„›Ï'Ÿ|Âe/==Î’G±ÀÞþz"{,íúýPûvä[¼xqbb"—½üj<<¬‡ìììDÙ+¨fÿþý:>~„ ’qÖlll0‘O#bàŒN:WC¦§P(èì­[·Ø ØN;ÇZÉ^vAó§3úôíÇš6nܸˆˆßKII177çîíÚµ«²²ÒÓÓ³_¿~êÊ×­[7™L†OC† ÷á²—““Cg£££ÙÆ&AIµ•½œÂ }H[¶í`ou©«W¯ÎÊÊ*|’+W®Œ=šo¸G²GÊGâ'9‘oäÈ‘LƒôŸÜÜ\ÑdöìÙÃe½µÜ¼yóÃP³ƒß‹M.¨ƒìåêGJLΚ·`kc‡ ÕpqqéÙ³'Ë3qâÄ´´´¼¼¼Å‹¿ ………â¬@ÿ±··çóâ‹/^ºt‰É^ddäƒêÀcÇŽ¥Sß­ÛXgÙË+º¡)·¨ÂÛ/ðÝ¡"¦ :Ô××·@õë×ó‰|ô™ŒŽº‚u‚úD>[[[hÐ –gĈ±±±›6m’œÈGrˆ8kh.lllÄÀW®\a²ÿ :pÆÀéÔ†-;\öJʪ?ÕZö¨!Ԝ㧼Œ¼ÅºeÔ¨Q—/_ÎUcÇŽ:t`y–-[VXX˜™™9cÆ É‰|VVVˆ³€¦gäÈ‘ÜI&OžÌe/;;›Î&&&¶hÑ‚N\Ml Ù+-oÜTgÙ£FQÓ¬ú¥]ûG:·dÉê ߣ#tœOäûõ×_ïÝ»8xð`ɉ|ÎÎÎxäÐd”––Š6²eË.{•••”aûöítü­wÞ‹º–×H²w½âV#¥úË5042yö× xÐ [[Û5BBBLLLø†{çÎ#å;vìÙºò 2„ºÏšggg.!-Z´¸xñ"“½ˆˆˆÕ3ÆO§–®\ר²Wv£áSCÉž"µ{ö|àÛƒí¶7hР3gΨ+Ÿ««kŸ>}ø†{)))7oÞüñÇ[µj¥®|fff˜È€Æ†”CqºR É^ZZ-**b3d-{å7n7`jpÙ£&Ç$ìøÝ¿ÕýòË/åry¶ÖÖÖ†††|ýââb²¾I“&IÆY³±±ÁD>4âêÑÕ«WsÙg¼Ü¹Kdb^£ËÞÍÛ ”Oö¢“òCc2̯jQ=I¤nÍš5ê¾§P(æÍ›Ççéýþûïÿý·¯¯¯±±±dœ5Ý@c 8ÃÕÕ•ÉœÁŒeêÌÙM&{7*ë›[ö¢®åSo¸û†úàÑ$½=z=zT]ù.]º4jÔ(þV—õ¹úD>333<hp,--¹oôìÙ300ÉÞµk×TÎèÕ«ÚsÀ© eïÎͪº'º¼idOž˜‘ûÛ~§nÿéÁu.(((K ¶³M›6mx·—––Š=Ù@#addÄ}ã믿æ²ÇgЇ‡«6Z¶ ‰JkbÙ«¬SjzÙ Wä^ÏY´|­! º±hÑ¢””QöÖ¬YC§¦M›æãããåååááqöìÙÓ§Oó ú[[[<hX”J¥8¸´{÷n.{wïÞ¥ ëׯ¸ŸðyBnSËÞ­»UµLtIsÉ^X\ŽÇEùxÓé¬'---3Þ}÷]:hmm-ÊÞž={ÄÎÇœ=48vvv\6^|ñÅÀjÈôbccTÎ2dÈCKÙ¼£ydïvíRóÊ^hlvHlöÀ·z‰7½¸¸8ÖÃ$x¢ìÍž=[\ § ߘ7n—½¬¬,:›žžÎgx_Žj.Ù»uçžNéö=}=Ÿ {“K¶œñ˜Ý»wÓÁ¡C‡úúúв׷o_Þù–––xаTUU‰;ýZ[[sÙc3˜¥ô6ê¡ÈmFÙ»­CÒÙûá'[ê±wß}7C`Ú´itpÅŠ¢ì¹¸¸ˆïpýüüð@ a‘Édbà OOO&{ááátöþýûS¦L¡Só­lfÙ»{ïÎÝûZ’þÈ›³÷ý÷ß§ °Ý•EÙ³°°÷UÆÓ€G œ1`À€€€&{l¥@qqq§N蔃ó™f—½»wïß½'ôJöØ‚\’:nzlïÕW_½xñ¢({ÇǦ+hTÄ}}—.]ÊeÎ8sæ oÛ®Cx|Ž>ÈÞ½{÷ïÝÿ[%é•ìÙÙ»R½òÊ+â°ÞÂ… éàܹsEÙ;}úô?ÿùOÞùÎÎÎxа‰sÆNœ8Ád/$$„Θ?>Ÿ`:Cdïþý¿Å¤o²÷Õ7‹Ù^…i¯½öÜ¿¿({[·nå=ߪU«ÒÒR<hX¬¬¬¸otìØ1 ’½ÄÄD:[^^ÎÖŠþ²ë°^ɇ>ê›ìõ2êC=æèèÈMº”éÜ… DÙ355å?räH<hpØzŒéÓ§sÙËÏϧ³,pÆ•¥¾ÉU~è›ì¹a›®$$$(óÃ?ÐÁ?þøòåË¢ì½ôÒKœ€Æ#77W|‡»k×..{wîÜ¡ 6l ãƒÞ~÷j\Žþìé£ìYþ¸…zlìØ±J#FÐAQöŽ9‚ÀhTìííÅÀ.\`²ý :pÆ|@§–o­o²wÿïÿMz%{ï¾?ŠzìçŸN}ŒB¡hÙ²%twweÏÜÜ3ШˆsÆÆŒC*Âd/##ãAuà 2@:uú|°^ɞޮƽ"W¶¨ö:.{{÷î¥#o½õÖ•+WDÙëׯg@ƒ0yòä÷¥XµjÕ¦Ç\½zUÇræÎ+¤_é ªU•YvïÞ]« Ùí6yþéB²òuî PTg¬]»–ËÞ7(ƒƒƒïÖ½Gh\¶þÈž>ï³·kÿ1ê±7Þx#U`êÔ©tÐÂÂB”½S§N±tœõ§gÏž/èe#뫱Òñ ýÊ®­U•È-ÙMµßQv;B;Õ7$+_ç®h H8õ¡M†‡‡‡ø'@¿2Ù {P8cæÌ™tü«oë—ìiHú {ŸÎ˜Íö*Lhß¾=üóÏ?EÙ[·ng@ËCÅå {ωìUTT°ê=W²'Î0`ÀåjHö’““3ìì]õGöîhMÍ.{/wîB=æêêÊM>Ó‘®]»‹²÷ÑGñÎ'©Æ?ÔÐ ²÷Ç\•‚þûÎ=D‹ïI¾Æ…ìÕ³òzòW¯›ŒnݺñÇ~Μ9\öJJJ謗—700 ‰ÍÖÙÓ!5£ì9É|¨Ç “–.]Jg̘¡"{l2$ÃÞÞÿP@ƒÈžvA"Ùàÿöª]Ù{Ú+ÿÊžB¡Ç´:Äd„„ÎX´høö»ú"{:§æ’½%+ÖR}úé§¢ì½þúëtþyeï×_;3 idOÅ÷tœ/ Ùƒì=¥ØØØˆ3üýý™ì‘ÒÙ»wï®ZµŠíÛàÑ¿Î7³ìÕ25‹ì zç=¶7rÒcÈîXàŒÀÀ@Qö>ûì3΀f‘½Õïjk5¸§"{999üñG+|ÕÕ‚½M&èr*¤>¾D§ØB¢VKüXÍégÝd‰/mÖtÓ:Ëu•É §¦Õj%2eÖ¥7ž7Ù³··'Áã¾1iÒ$.{ááádz,›]Û¶mYžOg̾’Ð\²W‡ÔIJw)4‘Πä²ÇBߎ3&,,L”½W_}•w>Y7þ•€¦”=ò¾8W½Be—QöV­Z¥²„~•œŠ&ª}g ²«è.’ʧݗÈÓTŠb¥QÅ4™-o‘x!Ô]¨¨ êK`$—6kZ Á:VÒ²¨ȺÕ˧¢$Í—FèZ®îZ¾V~‹žyV­/((HŒÆøæ›o¸ì„††æææ²ü………ß~û-Û$ÄÀÀpÕš M/{uNM){Ö6;¨‹|M€mIMÏ’({þù§Øùl(@“Éž–üÚWã’“¨Ø‚–€\öD“Q¹Š‹î²Ç+ YÉU'¬4¶êDňtì[EÔ~ÓÚ®Æe榥|õAH^ÒÔ±*÷¢Ï’벟=Ù#c[©HB–rôèQ¾Ï^```dddYY»V.—6ŒåìýzŸƒœl2Ù«gj2Ù›8yuÎÊ•+¹éÅÄİÀçÎeoñâżۻu놢 ée;‰ÊÙ“5¢ÏüÖ*æÀ„1yòd>’ÆV§j’.M²Ç§WÑ%¢ùùùñÑ-ußã¦Ê}•êIùu|…-ú­xÓÓ§OK6¼V²—““à ¡‰#âX"ÝK²cYj ¤’[QQAWQýÙ)êI¶F›Ž?3UUUVVVâþÉœ &lܸ‘¿Ò>}º§§'“=‚ä$!!áÖ­[¬œ'NtïÞå4ùÄÔ70¦±e¯ARÓÈž¡!u õ—½ƒÒ‘~ýú…‡‡‹²gllÌûßÂÂÿD@3ÊžŠ~Ô({ê/IE$µM”=Éèšê éKâ«gÉ6r+ÓT𦠵 ý¦|PNlx­dOûäIÉòU:VòB^•QÁgxΞL&·X7Ö£SiÕÄÆÆ._¾œÙà‹/¾¸téR.{DHHHzzú½{÷¨´›7o®]»ÖÀÀ€ÍO³Xµ.<.³‘d¯ÁRãËÞ?NR‡tîÜ9Q€­ÂX¹r¥({œO©ìi ã¢%Ú…8%97k©ÈŒ¤/ir9ÝKÓ}«ÝoÊ2ÐùÎt—=M®UÇJ^Å_Újk}–dO.—9R]óÚ·oOÍLWÃßßìØ±â05“½ jÈXŠŠŠXÉ&L`9;¿Òe×^Ç—½O*{sæ/yj䫯DÙ#÷£ƒŽŽŽ¢ìY[[‹3ªªªðO4<-²§iEGð¸Zh ª+Y²¤/ÕèE5–V‡á~SMk‡ÙëÑMUÒ²ø8š––ÔØ±švÆæW=Û²—››+FÇà´lÙráÂ…111éšqvvîÝ»7Ë?|øð¿þú‹É^p5qqqü7ufÿþýuøˆÑî>WJö)5žìõ~½/uÂ#“ɘÎEFFв÷ñÇ#p<²§]´ÔeLµàÓðÄ‘+u_"y_§jBrŒW^Ëf/º7J÷Ž­Qöø;\¶ZY2 -«i¬RSÏ?K²gccCŽ¡nz}ôQ```ºnP?°BZ´h1{ölooo&{!Õ$''ß¹s‡Ýî×_m×®»Åüo—…E§ÔSö55†ìó c"ÅeoÅŠtð³Ï>S‘=¾• gÀÓ%{Z"êj—=-U’|á¨îK*k=jD½´Úî­ËZ=eO}-ÔÊ¢ŸmÙóðð022Rï¢×^{ÍÅÅ%ã1™™™eeeåååYYYš‰_¸p!+å‡~à²J=–ÍbmÏ›7ål׾Ö_v×YöJÊ95‚ì­³~´™žBàwÞ¡ƒ»víeïÀœú {uØz²Ùk^È.LLLÔ;ÇÐÐÐÊÊJT¸ÂÂB¶Ô‚ %%%Z¹|ùòðáÃ…ÒèÛ÷СCLö22=VZLL ßÁÏxà[®§Ï×^öš"5¸ì 6šš¼yófnzÔ9,pFPP({âGœÍ%{Ú7UnpÙÓ2Y®¶²G§®ê€¸£ˆþËÞü¡K£žgÙ+--µ°°Ô`R‹ØØX®m¹¹¹|‘;wîäççkW>GGÇ®]»²b?üðC&{uéÍ7XiÎÎÎlañù—sB䉺Ë^“¥”½Ð˜ ¶™ž··wücØï°aÃH€EÙ÷{Dà h.Ùãÿë­¾t¢nsöøÂRñB]Ô‚×DBísöjÛ3u–½ºÍÙ«ó >g¯¶±Ûž7Ù³³³£ž‰£FôØd>†B.cš¨¬¬¤l™šIII±²²âùæÍ›Èd ŸIKKcùªªª¾ÿþ{¦@††­°Þ\³ì5mj@Ùûý 35ÓÈÈ(^`ܸqtÐÚÚZ”=¶dƒ#—Ëñ34½ì‘8ñÌêš¡]ö4­qà»õŠKj\Gð@ÃrWí«qµ¬³Ø½{7%k‘=]nÊÆHÙ^͵•=>ª©¥¨!|ùÆs({Ô½âÞ¼œW^yåàÁƒÜв²²®_¿ÎfÖÕÈßÿ]VVF—hQ>R—o¾ù†Oäã_Ax5QQQyyyìvô`𕧯õèåò×Y-²×ô©¡doÚg_Q.\÷˜ˆˆ¶¡¯¯¯({ß}÷g@óÊÉ·É·“Ú·^Ñ$ |J ·ƒ“ŒÔÀß&ëqŒßBÓF%t Þ ê[¯ÔMötÜgOÔfÝeO®Ô$“\%·^y†eO©TšššJNϳ´´LNNÝŒ#))©Vå§§§§¦¦fjÅÇÇgðàÁ쾃 rrrb²Q &+ÍÛÛû7Þx´øãñò˜$uÙk®Ô ²÷rç.Ô4ê.{t¤k×®ôY”=1$±¹¹9þe€¦”=Ò 1}Ü4O»ìI’àûÅ©\¥=Ѓ¨*ŒÚ#hhzï©éÝt}dOÜ÷¸Q#hHŠ·6WÒ¢ë,{µš…ØÄTUU‘ÎIF=ûòË/åry–.\øý÷ße2Yaaaå———Ÿ?žò_»v-K8À_"O:•®e²'¯†´³²²’•¼uëVÃêhb-[¶Z±z2«Ë^ó¦zÊÞq· Ô(ƒ8Ù³gÓÁ ˆ²(ÎðððÀ¿Ìв÷¾=«—vjš'V«Ø¸¤‹âÊ;•…ê!\¹^ÒÝy}Ôç ÖW%’¬W]bë#{ž ÈKîćàÄ ÀÚ7 | [l\º—£bæ*ª\gÙãc‰¬L:«oq¬œ%§ç 8ÐËË‹ õO^^ÿU¡P¸ººþ^ ‰·/îÞ½{åÊ’7ÊF7R*•Yº‘ššºfÍæŸäÈ ÛÌ™3%£ž­X±"555û1EEE<¤ãþýû$iô½ó<þþþlìîèÑ£ÉÉÉ”‡\N&“Ñ‘½{÷úøø¤¥¥ñÌyyyâè9dqqq¶V<<ÿÜõ믿fù8©©©l"_nnî¬Y³xÐ G'Wò®fI5ÊÞÂ¥«ŽCN›&6„Î8yòd¤Àºuë8xnñðð022R×¼=z899å>&//ìÞ½{¥¥¥ü`FF_m¡IÒâããÉÊØô<\’’’ÂÂBþ+ùÛŸþÉVæ±ÍñÔ!±$½dÙÈÙruæÚµk‹-b­k×®Ýúõ룞„ò°‰|W®\4hУ &Ÿ†D§ç\oâT£ì½Ñ—ªGýÀëÏ#víÚUþ$dìœ<‡( ɨg6l5‰O\4qç΢¢"Q¢Øj IãVvàÀ+c»ç±l7nÜÈÏÏç§Â˜:88¨¬z&™ôôôdnéææ¦T*ùUT•Ã&òiW>¹±cDz–öîÝûàÁƒâ Xll,5ÝîСCl{––-[}»xytBzZµƒ5YÒ"{Þþl”2$$„Wž½…Ÿ={v¸}#lÉgÏ$oš¢žÍ›7‹«™¦U•••¢¤EDD°÷°ô3>>ÞÛÛ›Y™——WFF†Š•©¥"iÙÙÙ.\`¯}]]]é $I ‰a!D£kU\´¸¸X»ò8q‚Oä#ãõññ•z€RRG­ZµŠÉRû~Úò+ XS&M²gµq{É.V›µˆzéªÀ®]»8x®°³³“ŒzöÞ{ï‘óä=¦  @Sh3ÎßÿMRDþÆ.ÉÉɹtéS2‚„*!!!O@ÅÊT £+))á™SSSO:ÅŠbyøðá±@ʯémï­[· ó4C úßÿþ—MäkѢł ¨pñí'_n¬T*?ùäÖKoôyÓéÄr°&K’²7fìÃíbÖ­[ÇkëîîÎtެ8LàÓO?Eà à9ÁÏÏÏØØX]óºtébooÏ-ˆäMÇÝól"¿<--ÍÓÓ3""BG+S—4òL~all¬““ÓÞ½{/\¸@zÆ‹/‚µ¸({G¬Eù¨üo¾ù†õCÛ¶m·lÙ"ú^TTß‘Ï××·oß¾,çð‘cÎû…¤d–4MR‘½HEl$ÁãUe«0Æú$/¿ü2gÏ<¹¹¹¦¦¦êš×ºuk’„ôôtÿqssÓeI,‡®ŠŒŒÔ$Tqqq:š—4ÑÙ(Ÿè¢¤pº»èýû÷¯_¿ž§•‹/>œõÉ›o¾éèè!ÃwäÛ½{7³6ç›o#â”ÉÕ2ÖØI”½ýö.l¡XIð÷çŸ`K68J¥ À3FUU••••äô¼™3g’Æä«AnÆV[Ö(iT¾ŸŸå§Ÿù8qâÄÑ£GSRRt¬sXX˜“““¦Ò¨z2™ŒÛ—.Í*Šüš8vìÁ=qâDoooѦ¨6ÛDtåÊ•llÍаõ:«MdbM¸ìÍœeF·^°`¯[ppp‹-è §§g°´$Œñçñ#r¹œO“Ó˜¬ŒÍÐ#7£lš$Ф‘­¶¨QÒHI YZdMäó÷÷¯q¹‰™››e É×ÌÌ̵k×ò8kK–, ·¦¦¦²0¹¹¹S¦LaýùŸ×ztðƒ”ŸIT—4netG___’.~-ù!ULtѨ¨(æ„t÷èèhÉ  pÉþøãððp-V¦ÂíÛ·Édxþ„„Û‚äŠ[Yrr²he7oÞ”\4A锤¤9;;3+#_’´2u%o³ìããC"š——Çvx¦[øûû³=dÔ"•=Uš) U¿ ÿüóÏÉxEËâù¨ó׬YÃ&ò¶^ñÝúÈ„,…²°ÁÓ;C†Ò-6oÞÌë@JG^z饀'6lÌÌÌð<ÕÈd²nݺ©k^ß¾}é”.VV£¤‘.’ùHZ™–ÝólÛdIIcV&XRR¢>ä(Bg)ÏíÚ5WWWV+“ ÏÈÈ[­eÏ@:%6SÒÚ•+Wò‰|+V¬¸ú$âD¾É“'³žïüJ—ßö:ÆW‡6k¨™Ì sþüùtdÆŒ—.\¸À–l0èÀßð”¢P(FŽ)9=oÛ¶m…O¢eµ…&IcÑÍlGòE°vI£KøåIII$-™™™üHQQQ;9sªªªŠ‹‹ùµ‘‘‘d}T¬XÉŠŠŠ]”ÍW,Ô •?qâDÖ·äÕ»ví÷.&¦ŽâùÞ}÷]–óíÁCÿ:ã—RØ iÛÎýì²xë7ß|“îܹó’}õâ|ª5á3€§›¤X¶lYrr²º±H®¶Ð›žwîÜ9Mþãåå¥Ëö,Ê,Ú¯UóIÒØË’ Öj?Ê|ýúuíÊwöìÙþýû³N&£;qâ„è]ÑÑÑd³¬´ãÇwîÜ™åœñùW—‚cãR ê™L?I¥-Z´ˆßÑÓÓ“Îðññ¹(À½ôáÐǧdddÔJªÐ\øùù©kÞèÑ£¯\¹¢ÉUNŸ>-ÎpÓ¢=|)+ÝE‹ì±ÕºHßV%==]²4:ÎV[dggëÒ|ºäÔ©SZ\”NI®üÕÞꬬ¬ÂšØ±cŸÈ÷ÕW_]¸pA Z¡P(nÞ¼ù zìÑÚÚÚÀÀ€Mä³Xµ><.36¹ Î‰ ¡¢H#ù½~üñG:2fÌ¿'éÔ©$6nܘ"…R©$ë«• )±··5¯gÏždJE5A*–Ä>^Ój M¡effj*°¨¨¨V.zçβ²2í}HMæ1M>üðCú.‚¨Çø‚™LÖ½{w–sä“3>!áŠ1E*[Tb;yò$/áÛo¿¥#Ó§O÷pssc/ˆ;wîL©ð=@eÅE7n;~øðáµDò"avïÞ½TšIËÈÈ`/F<Èô@¶Àöرc5J_4AÐOŸW[h‚*åÊjˆ=zô¨äÊ_MP+¼½½kìÆ¼¼¼ 6ð‰|¤g—.]•O¡PðÍ7mÚÄ<¼ÎlÞb¿„«ñ9,íÚŒm­#^;pà@:¸eË­[·Š3äryJýÀü=@?e/00ðË/¿d§6oÞ\^^^‡ñ½èèhGGGÒ*ºi‰º•ñEçÏŸÏÉÉá’!ܾ}›ÍpãCgT=¶ÚB“¤q+c‹&ÒÒÒÄʈÊJ÷â‹J.^¼¨eÛ䤤$ª<[*¢ed¹¨d3UàSkqQ§OŸÎ¾‹N:‘ž]y¥RÉ<³¸¸˜ïšÒ¶]Ë·„ÅåPútÆl:2wî\~ u8z{NÀÔÔ”?ƒN©7<ì/ôMöˆeË–±³æææd¥µ‡ôƒ‡ÒàÛ&3+Û·os¶Eƒ4Ô‹¿½wï9!?›››{öìYII#+cbyôèÑøøx±7nÜ`‹H IùøqÊÆwb‰ŒŒTéœüüü“'O²ÁIê6+A…PQtwª-?¬}whÊOËZM­ ¶ˆ­&ÖÞ“¾¾¾d_ìë8p 5Vô½ÐÐP2XÞ~øá£½ûŒúØÙ»vêÜ…>ïÞ½›çß°a:t¨û“ð¸ÄúõëSš ée¬€þ‹Ï2 2¤  @ÔÝ%ÍÃÕÅÄĨX™ä¢ 6ÃgKNNæ#i$iÜÊȵ¨Î*V¦2¬D©IÒþüóÏŒŒ 6äxáÂV[777+]”möÂÏRMø…ôAÜšMJ¤ãÎÎΉ‰‰’­Vi¦$ÜÇLMM©ztþÚ”ÌïÝG¼øâ‹bNöš~ùòågHkk8Cw¨]øsôSö‚‚‚öìÙÃ&ƒuëÖ-<<¼Æ1(MpIS+£2µOxS—´°°0¶m2¬ÅÊTP—4ºœ•CÞÈÜOÝÊ*++%]”j.öIzz:›¯Hå„„„êF2¹¥:‹ª·Z½™êäåå­[·®U«VLáÌÍÍŸD¡Pð=j¶mÛÖ¶m[ÊIv'æ¡ é ££ã”xíµ×RŽÔÔT÷á@ÓË!“ÉzõêÅ–è’‘ö\¯+QQQdeüWöJTÇ ³]Pøµ,¶Å©S§”J¥x F­ÆÒH´***øUT“4ê²2±@þ"X ì1¿$66–½V&öíÛÇ‚ÇéØj•fJríÚµ‰'²ï®k×®Û·o /.--™$ ‡ammÍÏþöÛoì*·'éׯÈ!S”¢¢"üÅÍ({ÄÊ•+5É^pp0© Ÿ faaqçÎë ^[ `ù$K+,,Ô]%%$JÅÊt__ÀÇål¾¢»»{vv¶XI-CŽ*Í$ÉÔÞ{ýû÷çë)Ž;&*_hh(yuÇŽIÑ===ùñ/¾ø‚òÏ™3ç´€“““ø0Я +{äÒµÚõ‡L€½ äh’="$$dÑ¢Eös9’Œ¨§ì±Á4íKb%a3ÜÔÇ»Ø~}:ÂMDEEiª)._ø #ÉÉÉšJ£¿yófý›©Â®]»øD>¶ož¨|ÔÃ'NœtíÚ•rÒU2%K–ðÇÀÐÐ0¥À6,@Óceeõ“-h‘½ÐÐÐmÛ¶±)|FFF,`kY=P(ÇŽc3Ü"""j[ÿ[·n‰¥edd°w¤75J9![4A÷ÕT=æ¢7nܨ±2tGº¯£££¦Ò’’’jÕLrQÒ`-Õãdff®^½šOä#s»¬ª! œAN>æôéÓüqƒÎÐBVVþâ}ð=>™_RöòÜœA&“±7¡õJf’FâÇ–Äê›áÆ‹*,,ôõõå+%%Y_C!Ö¤¢þ+)ÊñãÇÙ¼;êM3÷è.t/vSoooMͤû2½¤f¦¦¦jo9ë]dþÑG±/±gÏž»víR—=6‚GÙþz ¹}AAÛº¹Agho €¦DeòÛhÅÏÏO“ì………ÑYD•t‘Í£«ï‰’vöìÙÚ¾òc3ÜÄ!¾S§N©Kšhet;º)¿¤¼¼œÏ÷£ô+?Í$Mý1•Lå³ÝóH Ù6#œªªªû÷ïÓO~¤¤¤„Œ‹å?}ú´ä|Eò@6ÚI·£[‹Þ¼ySl¦$Ôp¾éʰaèVþl³>úÊ\]]Ï;———Gw¤o³ag € o8;;«Ìß0`Àùóç5ÉÞÕj>ÿüs¾çýwœ¬¦¼~dffrI ¬ÃD>rN^‰·¦ØØXnet º‘xß[·n©,`«-x†ÒÒR¾%òÉ“'óóóñ5˜•‰ªìÓBŸÉÓøYºœÅt#Äf’û±øt#ºÛž…AŽÇ÷iQi¦$Û¶mãqÖfÍšE·#Óóññ¡_é u‹B¡à¼xñ↠œ¡ æ–h<<’4gM÷Õ\ÒÈÜÄÒ®\¹ÂÞ‡²÷§T x–Lr÷¼%íž§ÝÊT ãt–ç$Wd…P3£¢¢Èú˜LÒ-èFb%Õ—«7S¬¬,¾ìâßÿþ·¥¥åO?ýÄtŽë%eóôô|å•Wuêi<Éž™™Y#Τ¶_"¥R©â{láª&Ù“W³gÏžvíÚ±@vvvllE½!­bÑo÷íÛGw¯mà­;wî¨k§——ב#G¨¥º÷ɱcÇ4Õ0//O&“ÕjwhÊ|íÚ5MÖ!¾˜–®f"JzI_ÊÞ½{©í§OŸæ²×§Oq£ÅÆ–½òòrü‰ÍNnn. ³ÅiÑ¢Å÷߯]ö"##/_¾lbbÂ.¡¥¥¥’®UâããÙëN’´¤¤¤Z5‡ÍpK£ª²wÄš–ÄŠVÆMh‘=6üxéÒ¥•PÊF™4H>V«ùŠlÏ@õrÄu"ÔtÇ3gθ¹¹qÙ£Îdïv)pdÐ[ÈÓ† ¢²%Ë”)S´ËµaöñrÇŽ=<<ذÒzSVVÆW1Èd2¶$VwØ.(¼´ÂÂB¾ÚBRÒ¸•±E”_¬ÌíÛ·ÙF( Ò]v‡ŽŽŽæ; *•JM-å.Zc3Å=Ũn|lN6HM8{ö¬Šì-_¾\ œAFÝØ²‡8€þ@¶cjjªâ{ƒ òõõÕ.{„§§g¿~ýx,]*Š ñÕQÒ¨&µÝž…¨²²’—FÆÅe‰LL´26HgU¬L n«Ò(Ò`&iNNN™™™â}éW¶¬ƒ2P6ñ*6=OE‰©™.\àÍTŸêFGøÎ„~~~%%%üZ1žo^^}¤Ü’²7jÔ(þÍŽ?>¥ñÁV{€¾¡b£S§N$3Úed)&&†4¯eË–,¶eh¨!>I«Cœ5Ò!q\.66–©ùX\\ß…Z§ne*E©4Šd†Ô‹ïÍ6:¦ìù›heT•u"*.š‘‘Áæ+R3ù|EúIŸ™UÒYÊÃó‹ëD***üýý½¼¼´ÈÞ?ÿùOþµþüóÏ=àùD}Ëå-ZüòË/5ÊqìØ±îÝ»³U–––äEÌgn6\ÒH>u_mÁ%½Še”––òØô“>Ó~–*¬}õ.5ŠšÆóçääðE%|+æÌÌL±ò$œšðÒ½Ä.R(GŽaó©Ÿùg:Îó°h\e©ÿ½½½ÏŸ?¯Eö6lØ ~§8¯qýG}Kbþüù5Êùeøæ›oØ%T‰[«?¢¤‘ÆÔjIìƒêùl·nÝâ¥åçç_¼x‘~êheºHšŠ•ºìÓBÄ.*//f£yô“>³¡UD”®"éõõõ½páB²7eÊ”¦ œ!RÛ×îh2H«x<\¹té’vÙ‹«ÆÙÙ™Çl511ÉÍÍU­ú@zÆ^•’õ]¹r¥VFAuSs©CqHÇé`TTTÔjO¶Ž˜_N*F?%E”ÅtóóóÓQö:wîÌ¿ÇÕ«W7ìi‰W}ÀÂÂBÅ÷z÷îíîî^£ìÅW³bÅ CCCöV×ÆÆæÁã • Ajj*Ÿn'®¶Ð_ÊJj*³V!<¨!äZ2™LSi$¢¤^µÚX˜:6;;[½¨Û·osÍ£ûFDDu_¼xQGÙÛ¿¿ø%RÎ&0=„Kž ìììØ² q×åè"{ …" àƒ>`‘œ°W–• Ù›Èçââ¢IÒH·xlò¢ëׯk*4‰e«QÒè¾ì5+]¢©´àà`6üVãŸR©trrRwQ6ï‘å¹ÿ>IuéåË—k%{sçÎå_ß+¯¼Ò4Ãzyyyøóž ‚‚‚^zé%•!¾¯¿þ:$$¤FÙK¨†¼ˆ¿F433ËÍÍe¯,Ä÷HÞH{$%4‰orâĉôôtõá2•ÁFÊÃIÒÈÖÔ%[KÊ'H-º{÷®Xuß:99Y²{ËÊÊÜÝÝYý©!ÜE©qH~~þ•+Wk+{VVV:thÊÀXŠ ~yfffdd¤X ú‹à•CE‘3“¤•––òƒâxcYYå!ä²gaañâ‹/r=Ö4²GýÚk¯©kÞ+¯¼²wïÞ”¦"--­V½ }ƒÜI}Wâ›o¾‰ˆˆÐEö˜øûûO:•]Ë‚nÿ°×© +{îîîº,‰å°w¸šJËÎΦÊתÇHb‹ŠŠ$K‡éWê42=êF&{$i½zõb]4pà@É9{...êû"†††«W¯nšW·q^"ž^<<<ÔWéöïßÿìÙ³:Ê^j5”ìØ±ìò6mÚØØØ°p` ¨|l¹ë‘#GjÜü„0$$dß¾}”YSiT•vêÔ)­†noo£RŽ8|øõ×_ç›0Ëd²T¾ëׯ{zzJJ·2ˆˆÍcb¦R ’7¶ò—.‘Ëå*}"îäL7¥[ó Å·Éd¡Ô?$Æ\ö¶lÙÒ®];ÖcÇŽ¥kÅÕ¸\öè¦ê3'‰öíÛïܹ3¥9 A|4àY…T„Ãcm¬X±B]öjÄÖÖ–o‰………š›;wîåË—ÅÕ¸\ö¨á]»vUïØ×^{­É‚bhâæÍ›xò€ç‡ÜÜ\É!>r¶ƒ&Ö >—d’‰íË'ްÕÖ¶Ve/—9ä%%%’Ãlz^´€]÷îÝY£†êéé)®Æå²wüøqõXul[•õë×§47åååxæ€çõY|Ä|P'Ž92lØ0^)¥\.'åcïvëOii©ƒƒCLLŒîÍd«*Ô‹"ÍãÃô9555JàÔ©Sdw¬ä{¿ÿþ;?%ÊžŸŸµQr[•9sæ4×ô<˜UUU–––ê u Ö¬Y£¨+îîî“'OæÅš˜˜X>x<¯>”••ñ…5FwÍÊÊrqq¡ÌÁÁÁ*åpÍ£yyy‘—/_þúë¯Yå©V¯^)ÉuQÛ¶m%£ž?¾Ù5ôõÆxÈ@z&ù²ÿþ'OžŒ¯+þþþ‹-âÓùØ ¶ó½{÷êì{$0|µ…———äl4:H§øô<º„_®2=/***B`íÚµÜߦNzéÒ¥){÷îÝìQÏ´ T*kû¾Ï6db­[·V˜3fóÄÕR£ü‘ïÓÒ¦M33³   ön÷^]),,õŽ>ЯtmÎLÙø%¢æÝºu‹t4\ÀÁÁûÛ AƒœœœÂ¥8þüG}¤'QÏ´˜ÖÞ@M 7Z¶l¹páB2´Øz°sçÎ÷ߟ—idddccÃqÔ ²ggg¶ Û †íÖB锘“¿·%å£Sažžž<\§N¶mÛ&E``à¼yóô'ê™–“±Ÿ´ iáF»ví¾ûúáååeaañòË/óbMMMÉÍê3Ð'—ËÙD>,CRóˆüüüP€€îo,ê •‚ Prz^sE=ÓDVVL5¢iáAž¶sçΘzcgg7iÒ$~‹6mÚ˜››+ f}µ¥²²òr5ô5¯¢¢""""X`ëÖ­:uâ;»»»KqäÈ‘êUÔ3Mäææ"t‡äì)úõëwèСèz¸~ýzq ‘>“–””ÔÍúÔ5ïöíÛ±±±A¢¿õíÛ÷ÀARx{{Ožq[•ôôô@//¯3f°òÛ¶m»zõê@ ègÔ3MAo±ðõÄÏÏOr{bâĉ>>>‘ Ä–-[F%–odddaaÁðjG¬pQQQÀ“pkÑ¢Å_|áéé ÅöíÛõ6ê™:ÙÙÙÚcèŽL&ëÖ­›º‘>M:ÕÝÝ]Þ@øûû“õ}ôÑGâX_ÇŽÍÌÌœ+++µ˜ÞÍ›7CCCývîÜùꫯò?î/§³zõLZ<“hplmmÉ»$GùHÏŽ9"oPöìÙC&).àekxíììrrrDÍ»{÷n||ü%¾|oÛ¶m—¤ M5k–>G=SßIÑ1ÐxTUUYYYInÂL¼õÖ[Û·ohhNž<¹dÉ•Ð#GŽ|ðxzžŸ€——×çŸÎüíÅ_\´h‘Ÿ–/_þïÿ[2êÙ™3gôp@///¯nÐäææZXXHîÐBtëÖÍÚÚ:¼8þüš5kHóØ¢££ýýý}Ö¯_Ïým„ nnn¾RìÞ½û7ÞÐç¨g*dddH†‡hTå³´´lÓ¦¤òµmÛvÅŠ~~~Wön÷ĉ>ùí·ß^ýuÛwß¾}>R?~\eßVE¢ž‰¤¦¦²íhð¼ Y(--Õ2—ÏÀÀÀÌÌÌÓÓ3¬Aa»"“ìyW#“ÉØ€ÞK/½dmmí-…»»û—_~©ÿQÏTvK¾sçž1èööö’ÑÖØ¢]ª;w†6LöŽ?îUÍ‘#Gè×ýë_gΜñ’ÂÊÊŠ[[[¿òÊ+’QÏìííõMó²²²°I2ž HÒ´ô½øâ‹“'OÞ½{÷•š`²wôèQ·jfllÜP¦'—ËÅ’ÿ3pÄûP$$$$$$$$¤ÆH‹4í—ÁƒWŠiÒ¼ýtjØgËE+³µµm - My™ÿ÷-æÿæ¹üHRc¤ _í&»ûàƒõçÏËsrŠ/1ß›náHgÛ¿Ú‹‹YÇŽ«ªªêiz …BÈÑ_¬üîh8Rc$³O’× ö}ZZ>÷1²>:øî{«Úú˜mrÝÌÎήgë½Ø¦í÷G‚×9G !!!!!!!!5xZsôêðÑëÈëΞ UQ²õëÿ ã>ßAÙz¿5ª¡fîUUU‰Û­Œœfn}< ©1Ò‚ §Èè¾ür»º••ö=]cdfuPÜ“Ëåu–=;;;±(ËC~ú+ I%ÍÝpèÃÏ—Ô*MøfŽ…ÿx,ˆ]BwAW#={iáÏÎì Ÿºl³Åonè¤ç<™LÞ"9¬ÇذáO:;k©=åìÔ½774ssóYšÑ{Àû[e1HHHêé£YKk»ùy·×ª—³Ñ9„ŠR9¸ôv‰ú©ç*}µf×ê=gñ°=K_ =Òí:©îÛwȘ£W‘žÏdåÄÖeܾ}WRÌÂÓ)è±V”yÂ×ßýïSºu«ó;Ü6mÚðr¦~ûã¯n±HHHêiÜ—Ëj+{ÝߨRÈ”ëÚ¿ÜUýøŠ_³Kè.Ïg÷Z;ú½ùîêê ®Ë‹â :{ ¦ƒÂÄoÖ° Š^ ,_- ËE…«µ'|öŠ7%Ÿø£%vì)K £=TˆF{FM˜aJã•Í6·ïïÿÿߺtÓgÍÕ² ò g#)[¬"úI-QË;{Å.ªQ6šáŠRK¯¶DÙf½SËKÇn8R\S£!ê”îw•i Xª±Ãžr·½¸¤½”«zÍ÷øÐ`0˜eö222xÞç_xiáË©©ïPöfù¨NCsó®Ü}–²“؇,ýd¿ÁL_¼‰Ú²Ÿ]{¡ƒ$JÃ?šé…²pjo%f¹¢æ®lÜ™çJ0ì‘fáÕ±¼”€^èe&àí¡ÚíqêÔ‹Ÿå¹Htœg3q&OOm¦¡à­¥,lphÐŒ,¯‹²SË¥uñ?n¬GŽ˜¬_Ô<–‹:ÂK.>€ì,ÂÚ)V6ò¬T ;+m¤¬%Ô6ž—g‘5F™‹-`ÊÈòò¾S{¤ÃEËÔhˆjäí]ˆ¿-P…Òà‘ÉFÅ•>¿r5nÞöé?€ááf™½ÔÔTž÷õ7klɺAš<}Ø›å㺠ãS7Õ‚Õ{•…¼õ¶-+AvœÒó7#]»ïœô,ýÊ2ÑóVJO¹õÂs)«>KxVVÝÒ-GÙqþB»=tV­=aÓ’ØqJ@É”Ýdé'¯K6¼Ê\j¢XiMZ¶Sžå#Ó¶s/ËGŒº©Ñ/ªB:\ÒSô+?E… Ëž•Nºl-ñ2e]“5†z*aaFÞqªTmå›>5jï o6W”`ñÚ}ÊŒ=žXj†²@ú¹rÛ1a³›:¶c§%”ÕÉŽ Û#,Y­=µŸ|”EÄk#• þÈ«S¯‘îBØee É+Ÿ\($Ì(LPç‰U0ªÚÂêŒ&àCd"Tˆ2¯ô )JÛ¸¿Ek—ÿkùž^ƒýßöë1Þ6µÑИ\V£tð…íöZ8&žª!mŒÑVK {jL|;4‰ø U}þ(Všéfo€÷\Ê9³XÌ^£¦Ž{O\ƒ HMƒžÜ¹ô‰}#Ý…ð{ödÇ—oe…S-ÂŒÂüޝ^žCé¸QYXÑ|ˆšµjgJ{¶¼ ÌK%ëØ5;އF}AõVWx¡ö]Ý-±ÑA“µGCcrYtJ˜…·GØká˜ð»Mi?µÜôVK`áÔhH»ûT.ÅîÙ»{÷¾Q“¶kWΣ{öS.é={æš½øøø§ÿ6pØ‘Ašø3‰µíê.äñӏп.ÛüôáVQFa*çés£æ4C_uF<}Ò¶ßÝÃK%[8S‹×í£Tûé¾ÁtÄ’ãÕ˜zµ4¬Æ‡ÀŠrñö{-“§OÚ÷«%Ð=5”ž¼ŽîCP¹”k÷³Ðð YN¹ú yú4®‡‡‡î­W>­ï€Ýo ÈÄ}ötbtŸ=ªE˜Q˜€7I¶£š2o±Tg4?¨=DÂíÚto榑žo鯩{Äøö€jY|ü#5öÙSËÈ[hú˜ð,²e{ô)·y4:Âj ôMÑ3Ú}*—êõhëÓ÷Ù _M¹ºº{ëÞzEjöÞ­õqú¡Ë©IACw! t«UšÑêôM)ï퉀 òª¡~)fÅÆ Ÿ¹•rÕúØžÿ‘‰7ËìHocž¾tGZæ%‚„ê5x{§ØÔ°¥×&jñöÓÒBlž|LÓ©) 7ÌX¾‹§×ü¸°vµañËŸÞµÛ¡ç¼u‡¥§þõivŠ^˜Ršå ¨¿¼T)µŸ¢¶Q ùJ›*^–‹Ê7eRx]²¾“x]²¾ë1ilP I”¥á£˜•Ò^Ks±鬰ý¼:aù˜ÈÎòãÊñ÷?·¤£û SJ3½:³¦FÚ;z!gZöüµVö ò­Ñ dá †FMšŸßÃk€Óï§\ÿxá%þ®ÏÈÈx`&U«VåÙGGÎ[ºç"ABõðû7󉜿AZHƒfm¥gߨþ;NÉ?Úà=VX»F‚a!Ó¥~øI½œ½æ‰¥Yž€NÉj—5‰^øE%ÊrÅ-Ù):ÏQ“ŒNJèÌåÊŠduɦ@߈ §Ošž/*Jš…~•N´Lì¬rÈ–œòlËö=´» k†viÚ ôMl%˜>;T¾5.rY¸øøMFš§çLJ9sù‘ÄÇ¥oÀ‚‚sÍžƒƒÏÞÝ{Ü¢]_C$”Û@=foâ¼õÒB¦¦ì¨õäó}رã”ìñƒÇ k×N8}™´XiùÍ]zÌÛtʬÒ,O0sÕ—õ?o+õj' ‚°Ìv=½¥)Õª6±ïµA­.sGLº (Ô®°ZÔ¤Ö³',·A¶NdKNx¶ïȉ¦ƒÂ¡Ó.M;¾©á+Amœé,þ°@M“f>ÜPÅw¾¶=ûí·?(YÓσn??~öjþÞ©Zµêóñòòz·I›ÄŒ\‚„úbÃÉÐ9ëÌ•°¨±qK»ð#Ñ ~¥§ZÔ`4AÄ¢ *³mwïj7 Ã'ƦÔ]šå ¨vjµ„ÚC­¢ÔBíA¦, ý4šXÖ6¤¦×eîˆÉº&›_šJö‡”Ê‘U¡±´Ïò%§Ñ¶–>o×ݾ©½gtëK {jø8S#iœé§éã AåO³ÓÏ‹kÞ<Ø”•ÛwJY\>½sÃÁÁA‡Ù“>û\¥Ê³ÒOÍÝv‚ ’jbÒ¶©Ë÷k$èÜÿñ.X=}Ã0\i¨m‡(2r/ÞÒ°gK—î¥4ž#’)}­OŸ†þñóóÓaödÏh Ÿš:kó9‚ Hªw?®ÿÚ[ï4°¿¢¡‰[1\i¨ïð$2rÉÉ;5왯ïü‡;*Çn™jÈú¿J•¹OËÌÌ|  ém{N¾qÏBAR5rêÆþH¶ë7ZyÖuèxvÖö£ú+‚´8g7¹^½âÔŒÙÝ»÷)A“σbÖî:››´*Uªé3{Ò¹/V}uêú3ATƒ£ó¿“ ۸ѯçH=ÇDܸ5?EÇ1VikòšSÍZ†j|“k0 ³Ý¼æRâ?k­;*®”ÜÜ\é7¹ñkNCARu5µÚ›5Õ»¦S”£A)r¾ˆì\TÔ*¡1suúð‰Ýè-I{þï¹Êº·S–A^‘õ¯†­&NAA2IÜeßÊõ›š$ö“½¦ƒt ãA‰ Xt„=“›ŸOfɶnͦS­\")Y+QÅò.#==]ú/êÀè•Ái'!‚ 5 ˜²‚„q€ HŸ:{ÎQn¸w÷î}'§0:Þ70ÍIÖóU«é‰«„¼¢ /𵚎[v‚ ‚ * N>ÒÂ)œ|]XØòß~ûƒ9=5ù[%¨ß®ôB\NN΋‰—–Ùj@Ȩ%ÙAAPIh`\†CÓ@öd®¯ïü"èu §ICçfzD­øûs•¸+suu}PÙÙÙñb©Šnû.>AA•„ÄílÖjy<¦Ö£}±¯_ÜÆ_}Sz·^nnîƒb"##Czq¯Ò?^t›¸lpÒQ‚ ‚ ¨„Ôgʶޑ[<§ï¦×}gl«öö‡R?ò Xñññ‘–ÿ÷ç*}Ú®¿9$fAAA%'‡ÞA•þß R'foooáC¸B\\\”[Hý³F­7jÕƒ ‚ ‚Š]¯¾[[é¾ììì ”d …~”¶¶¶yyyJ ò{!!!g€ÒÇÃã  àAÉ“››‹K|¥†ƒƒCFFƃR'+++111Ê þþAÕ«7±³k¡Xñññ™™™ùù÷7öwuŠ¡€Ù0{fÀì˜=³³`öÌ€Ù0{fÀìÀì˜=³`öÌ€Ù€Ù0{fÀì˜=³`ö`öÌ€Ù0{fÀìÀìÁìÀì˜= F^^^HHˆOff&Ì@¹¡¨¨ˆl^•*UþöWWׂ‚˜=€²ŽÁ`°±±ù›ò~áááäaöÊ"999ŽŽŽÓÄÖÖ6==f  QXXèçç§´v•+W~íµ×”Ç]\\rssaö¬ŸÄÄĪU«*]Ë–-þøã 6ä™ yBggge9ä!ÉIÂì”2¹¹¹...Âïm§L™’§ ƒÁðþûï+Ë$?I®f (,,”…Ãàx{{õÕWW-cÒ¤Iä•…»ºº’!„Ù(9ÔÂa888lß¾ýj1qüøñ¾}ûZtfÀtrrrÈÑ) Øk¯½6wîÜ«%@zzz½zõ„Û³˜tfÀ …Û W®\Ù××÷âÅ‹WK’3fƒn8::jÝ€Ù0J||¼p[òZ‡¾V*œ={vøðá ~~~jA7`ö4ÈÌÌT ‡±téÒk¥Î¾}ûÈa ¿ÕMLL„Ù0pÁÁÁ—.]ºöìHJJÝ _* º³ ƒ…Ãn«Ò¥K—'N\³Èmúùù ƒnGåA7`ö¤dddØÚÚ Ãalܸñš•Aγ]»vjA7ȵÂì04ÂaDGG_·bV¯^­t#-m Ì*8á0 tîܹëeððpaЪUm0˨˜¨…ÃhÒ¤IFFÆõ2ÅÉ“'ûõë§ìËßÿþäfM ºP>Ї‘p½ÌBµ~ýúÂíYÈÙbÞPî)((P ‡1bĈo¿ýöFÙgÞ¼yjA7Èåb  ¼¢#++ëF9âüùóä]…Û³hÝ(£dffÚÙÙ)Ï|°|ùòåêµ0è9^aÐ €2GAA«««p[•ÐÐÐË—/ß,ï¬X±âí·ßÝ 7ˆ€2JQQQxx¸p[•®]»æääܬ0§%gk4è@Y!==]£víÚ›7o¾Y!!K.W9&ä‡YÐ ,X?á0bccoUxÖ­[GŽW9>ä322°~`µ°p1dÈ2pzœˆˆaÐ òÉ4PXK°6RSS…á0š6mº{÷î| à믿îß¿¿ð[]òÌØžVBVV–0Æë¯¿ž’’S§ 9á  è¬pþþþyyyðr&’˜˜HÞX9’ä¢tϵp...ÇŽƒÓñ­îÈ‘#…Û³£Æ·º(54Âa¬\¹²XÀ—_~ÙªU+aÐ r×X{(QòòòÔÂaŒ?V­¸ Ï, ºAA7Ph„Ãpww?sæ ZñrõêUòÏÂouÉo#芑ôôtá¶* 4غu+ŒYÉA.Zx)•\7yoÝ€…äææ::: ·U‰‹‹» J… 6|òÉ' äñJ ƒÂÂB???a8Œ¡C‡^¼x¬”!wýòË/#è,'11Q-Æ¡C‡à»žä±Éi 8‚nÀ4Âa¤¦¦ÂnY{öì!×- ºAs„5 5rrr”ÏÛV®\9 àúõëßkbáÂ…jA7ȱc1@ILLŒÌ9´oßþĉpVÖ 9ðÑ£G«ÝÀö,.5 ÿüç?SRR੬rã­[·Ý ÷ŽU ¡Ù{þùçÙ‹Æïß¿žÊÊ1 µjÕÝÈÈÈÀÚ€Ììµoß~Ô¨Q/¼ðûuðàÁ.\øX17nÜ nÏâêêš——‡ÀìIÍÞÁƒ·oßÎ#8T­Z566žÊÊ9w›‚nÀ³G|ùå—)))õêÕã_ ®[·žÊÊÉÈÈݰ±±AÐ fOfö¯¼ò ;ëì윓“OeåLŸ>]ø­®££#‚n0{2³wèС}ûöy{{WªT‰}-pùòå;ÀŠùöÛo‡ & ºáç燠ÌžÔì‡Þ¼ys‹-ø×‚)))ðTVNffæçŸ.üV711+€Ù“š=FBBßë£qãÆ»w²r’’’t€Ù3ÑìyDPPßžÅÓÓ377žÊš¹yóæ˜1c„A7¼¼¼t€Ù“™½¬¬¬Ý»w{xxðíY¢¢¢òóóï+æÔ©SmÚ´Q ºíY˜=©Ù#Ž=ºzõj–×ÖÖvýúõðTVM‚n0{&š=Æ´iÓÞ|óMVB»ví²³³á©¬™[·nMœ8Q¸=‹‹‹ ‚n0{2³wìØ1J9bĈ_|‘•påÊØ*kæÂ… ½{÷Ý Á·º@Å4{[·îš=";;;##ÃÙÙ™ïïñÅ_ÜÖÍÎ;6l(ÜžÅ`0àÝT(³·rå–Æý}|â·mÛ#4{ÄñãÇSRR>ýôSV`ݺu÷ìÙOeå̘1C¸=‹££cNNÞ#@1{Ë–mêÙ36*jm»v‘&$ïÛwPhöTlµjÕX±½zõºxñ"<•5såÊÝ*¸ÙëÞ=võ꣋õñYÞªUxlì²C‡ŽÍÞ‰'233½¼¼xœµ¨¨¨‚‚Ø*k†¬»0èFÕªUt¨fÏÍ-nÉ’lRB©ɓO¸»§::NNNÞ 4{ÄÉ“'·lÙÒ´iS¾=‹Á`øX7Ë—/~«koo @ù6{®®qII'Hdöâ⾊ˆ8?rä —w÷è5k2„f8uêTBB9=VKË–-)<•5SPP, ºááá @y5{;O›=;‡‰™½€€‹#G~ëîžÕ¢ÅŒ!Cfíܹ_hö£GæÛ³Œ5êêÕ«°UÖÌéÓ§;vì(ÜžA7€riö:uš6cÆ&©ÙóòÊsw¿Þ¶íÁ&M¢CB’8,4{999{öìéÙ³'¿löìÙðTVÎÚµk…A7lmmt(gf¯C‡é“'Ÿã’™½NòÛ´ÉoÜ8ã³Ï&O›¶âèÑl¥Ù#NŸ>½zõê:uêðíY¶mÛOeåLš4I-èFnn.ÞG@ù0{..3&N¼ •Âì}׸ñ½ºuoש³®~ýØ””MB³Çˆ‹‹{õÕWYÕ]ºt¹téR!°b.^¼Ø§Oµ Øž(f¯]»ÁÁ_K¥bö~|ÿýŸkÖ¼U§ÎìyóÖª™½3gÎdggûúú²È3L˜0áöíÛ°UÖÌîÝ»t(¯f¯mÛ™cÆ|#“šÙ{ë­_Þ?#*j‰†Ù#¾úê«;v´nÝš{†%K–ÀSY9³fÍnÏâàà€ @Ù5{mÚÌôõ½¬”…f8{ölJJŠßž…ê…§²f®^½êëë+ ºáããƒou€²höZµšE¾N(ËÍ#88˜oÏ2tèÐëׯÿ¬˜ìììfÍš ƒnÄÇÇãý”-³çè8«OŸkB—Ù;wî\VVVÿþý¹g˜>}:<••“––öÆoƒndffâ]”³×¼y¼›ÛM5—Ù#Ο?¿uëÖÏ>ûŒ5ÌÎÎ.==žÊš¹}ûvHHH•*U”–ÏÕÕA7€2aöš5û‚†ŠÑì.\˜;wnõêÕùö,t ¶Êš¡©T ºA+ A7k6{[¶ìjß~RË–[o9;ߪØÍAYÆÇ·g üî»ï~V̶mÛ>üðCaÐôôt¼éë4{ÄŽû‚‚88DþùÁæÍïUìfÈÍÍ¥ÆðKF666K—.…§²rbbbt([fïÈ#¶mÛãëûEãÆÓ>û,›¬R%aöˆ¯¿þzõêÕööö¬µ7Þ·o<•5séÒ%oooáö,ºX­ÙËzĺu;¼¼¦7j4§^½säîd*!³G\¼x1""‚ÇY:tè7ß|[eÍìÙ³§Q£F ©©©xÖiöŽ>bÅŠ-îîÑ $òÉ•>ºÏU¢f8~üø°aÃøö,“'O¾¬›ÄÄDáö,´œðN¬ÓìÇŽKNÞÐ¥Kd:«Þ{ï¶­íÏL%jöˆK—.íØ±£E‹|{–M›6ÁSY37nÜ7nœZÐ lÏX­Ù#²³³gÍ2´o?é£6U¯þ9½R0{Ä7ß|³xñâ÷Þ{u¡]»vTl•5sâÄ '''ÝÊœÙ#²²ŽMº”,_­Z;_{íçÒ1{e x饗øö,7oÞ„­²fV®\Y³fM¥å³³³ËÈÈ(Oo±Z*4“0uêTZÒ¦”ãææ&=H¿²ãf5‰ü6ËEõš•‘WG%”×?‰e¢™™™ƒ ¢•×5{ùòåøD”‚Ù;þˆOœ¸¸C‡ð:uf—ŽÙ#¾ýö[jUŸ>}øÍÿsçÎý7°bîܹªt#//¯Ü˜½¿™}^kX>V}¾K²ÀÄ:Ì«Ñ\³Çã —c³gý}¤u¢¶„¨ñåxjVeöúƒ³oß¡ÀÀ))›Š×ì:õÕáÃ'„f¸|ùòºuëêÕ«Ç·gÙ¿?l•5C³Ö©S§rtƒ›=µK|Ò^k\P‚كٓ6]Í›úˆAƒI—™Ñ«Ä˜½â2{ÄÉG¯Ù‹]Ù¸±ÿ¤IK²³O Íqåʕٳg¿öÚk¬_îîît¶ÊšÙ¾}»0膋‹K¹1{jæŽý°fë 0{ÖìÑ|©ýS@o"~ÅOö”E³7& utÁ©Ýä¸8Ã… _ ÍAY|}}YœµªU«N™2åÎ;°UÖLll¬2è­™òmö¸ã)Mÿ°†Ù«Pf­£— \Ü”u³ç;fY’áLÌ‚3}†®nÑ:*%e«ÐìyyyÔ ggg›uÍš5?+æúõë>>>R³—™™YÌÞƒGwÝó^›x³=Ì^Å1{|Ö4þÐ7³˜=k3{ƒG­˜½ìüÌÔܰ„¼áS.µí¾´W¯è-[ ÍqõêÕU«V½ÿþû|{jl•µQTTôßÿþ—-ËŠiöˆAƒñ‡5”Ÿõ„ìŠÌì‘Edij?á+3{ùùùô‚å¢ì>Ó¨bEQãYiä=4¦šÇ{DYË駉3΄wœÕ˜@EYÒ*£}¤¼|¸vãœr¨ÿýï §L8¦¬ ê£Ñg¨ù÷¼0{€²nöúû¦$}C"³7fÆÍþ‘w;¼Ô¬Y†ÙcLš4‰mÏBŒ=š>`±¬_~ù寿þb ò·ß~£…TaÍ}ô󛲄å¨= AÖ‚»)ä´Í³²\tdÓ¦Mæ!éc²GD…†‡•ÆÎÊ2+ÞzÁ²Ð'ëk•° 4&ÏVËê¥?/ü[W£Ëìk³4×0{Ýf¯fÍš+V¬°~³×gèj²yLÌì¹…ÞoÜØß¨Ù»víUÁ?Øö,ÿÏ”?ÿü“¯Fšå´´´äää kö4Òk›=é †Æ€Ò/¹»“å~•¬a„”EIKÞfÆÍžÌ¦šâ|xø—é3,º[¥ì#+m¡²4¥ßãOL¨­aáâõf¼ñeý](^âãã¥'_xáú³cåf¯»÷:òx\2³7bDÂÀ³öíËš=âúõëMš4a]¶··ßµkLWéóûï¿óuXPP°iÓ¦”””E‹Up³Ç?¯e@Ãì /UIŸø]ßãNIX·O”]ö•¨š’>*Ë"}€TvIJÖxr>T,y*Sœïë#uް­†‹«UÒ>òËtB,õÒ)à^Nù¥¼´…ÊqÖo†¹÷pÊ=ô![µjUÙ¿Æ´Z³·råÎm¦ºþrhÌm&™Ùóòš9<¶§sÐØ± ²³ÏÍqãÆ òÒíY(% Xéð믿òÛó裖>£—.]ššš ³§Ûì ÿzTvVjöÈÚ)ÛÀ¯~Ë\¢ÐqK£öàwVj¥)—éfOí²˜å­’öÑèƒ|Ä„³&t_Ü@ªYAs„¯4Ùþ<ðàÑwgööö2¿G»Öiöèók×®#ÇÏmÙ~ŽÛ¨œÞá?dfoõ„ig££—pkî½òüù‹B³GPúqãÆ±íYªT©2qâÄ~øáPb͓ޞGëaåʕ˖-ƒÙ³Ðì©™îR¤@zYL»Ù²B#Ä/ i<Ù¡]šÐpš~eO㢙%­’ö‘F}i«v Níf9n5®ZæLã*.pŠŠŠ¼¼¼¤Ÿ°ãÇ·Z³ÇØ´i?ùº–’;¼$3{FO<q1 à›~ýZ÷ïÒxäüù¿ùæ²ÒìÝ|µªk×®|{–µkו•ÒÛó®\¹²aÆ´´4ú¤ƒÙ³Ðìi|(ܯƒÔ0BÏ##%e+yÒØ?PÍÞW_]ˆŒ\Þ©Säª&]ï6mJ’™=§¶á)kr&Ï9Ò¥g‚·wü—_æÍƒÜÈÛo¿ÍƤk×®Tã¯@“?þøƒ¯¨ÂÂBZ?›6mÚ¸q#Ìž)f»åµ}fß&|@CÃ'ð–h?¼`bœˆR6{–·JøŠÆ]ŽÚf{xæî˜UÓ½½wzT‚åOò*²Ù«W¯ÞÚµkË¢Ùc4N:´¨GÃaŸ:Þÿè#©ÙkÓ6|^ÚÙÙËÎG$^zÄÑ9Îß?éܹK·T ÒBCCYœµ*UªLš4éÇ„©Sòûï¿óÛóèWšë­[·nÙ²fÏD³G¥Ñkí­WÔ°òKRÒ‹HÜ)iìðfú¶$¼ƒA`=BC¶äÌžå­R{ŨÓn+A8•:œžŽ§˜@¶Û^¥J•úõë·cÇŽ²hö‡Ÿ9rÞÀz^ó?váf¯•SDìâ‹$2{þñׇÆÜî8øp“–S23OÜR‡ZÞ«W/gmÅŠpwR¸Íû믿h"vîܹ}ûv˜=ÓÍuS{«4m³§v×–Ð J݋Рq‹(sƒB³Ç퇚uTÛÛ¹DÍž…­2ë«ji| £í±d{=iŒ 8=€>d¡Ó¯¼òJ```5{,\ÚîÝGÉé 6‡™=Ç6‘dó˜˜Ùëöcó.+–/ßyÓ›7o®_¿>ê2lžôö¼ï¿ÿþË/¿¤222`öL1{´’iøw¦F7ŽÓ—¦4j†Gúü• ‹^!µ²Á7JLé9©p5GZ¢fÏÂVIûÈ¿ Z,ªH: j·áI Ñ×kím`:ôkcc£´|µk×NJJ*£f…Ï`›*“ÙkÑ:’<—Ìì]¼x¹}ç° 6kX¾yóæñ8kÆ »~ýúoéíyôéIs½{÷î]»vÁì Ížð9PÙlƒÚí{ö¸o¡ábû¿iDR“–¥Ÿ”žÇ–Õð-jOªò{ÒX Yi„ô ÖâÝUØ”Û-i•Z”v›Ü‰'ð¢LÙEê u»Ë¨ÙcáÒΜÉý¼ùø!á¹#âò™dfïÔ©ó­Ú){\WµjĈ,ÎÛž¥BÙ<éíyô+MǾ}ûöìÙ³§aö´1ú­½õŠÔØuÜ)ÑØJˆá*=è¤{¾ ›¡ü¾¸¤Íž%­’õ‘ç+„œý³cô’ô‘^«ÚÄ…„Gt¦CæÊÅÅEù7¤R¥Jô—íÀeÔìëÖevêٮ׊>ã¯õ¼KâfïÆdöZwž3;pï¤v#ü¼½ã`#CÞS^mžôö¼{÷îÑD}è3ºŒš=¹87·) c{Ù_ùLföÆö6::wüøìþCü‡õë7}ûöÃjå?~ÜÙÙ™ ‹­­í¶mÛ¬ÙéIoÏËÏϧ ¢™‚Ù@ nÀ^(€2MVV¿EMv#Ÿ¿¿Ù5{,èÆüùÉò}<ߥNhOnöü]ƒÈé‘ò ºéæv¨‰óÐ^cÇ. ôjE‘·ùøãÙȸ¸¸P­Öæ=x´­ 8Í ÌƒAgí_ÿúWRRÒ³5{rîÜ×Ó§¯nÖ,(-mýºdÉöÀ~ìi]föî6mzÿ£:uŠÌÎ>£]Ô”)SØö,Dppð;w¬í{ÛŸþ™ŸffRŠŠŠÂÃÃ…qÖZµjEŸûeÔì1rrγdö‚ÚŽ¸êéɤ4{kÖìݵ+K­ê²··7ßžeþüùÏÐæIwÏûí·ßnÞ¼I#LC ³5Èϸºº 㬠8¼Aiš½’ 5u›‹!OÕ}(nöŽ;M œÕÖ1hìØìW!dŠZ¶lÉFÆÞÞžŒÓŸ¥Ÿ²¿þúëîÝ»4z4ž0{0ú€&#Œ³U¦ÍY8²scš:Ú¢Ã÷ŽŽ$¥Ù[>kñˆWGÿ©SÓΞÍU+jÁ‚5jÔ`#ãááqóæÍÒ±yÒÛó~úé§«W¯ÒÐÑÂìÀ,…7òÕ©S‡>ßKÎì•«Wïqw kØç¢}ãëÖefïèÑ:åå5smpôÙèèsãfwֹ阄„ jåPïyœµèèèŸþ¹tlÞ/¿ürãÆoŸ³†„„·gqqqÙ»wo5{ŒÔÔmnnS¦Õq½^«¶Ôì¥û†äŽ1 ધç7ºÄ~æAg÷î=¦VÙ§N:ñíYÈ•è÷¶¿ÿþ{~~þ7 `ö òdí”~¯råʾ¾¾Ç/£føúëK Èò5kÄÍÞæ~ߌC"³—ß©Ó ®¬í˜¬]¡zõ걑qtt¤ø«˜àA¯ïܹÃ|˜=è† €Òò½úꫳgÏ.³÷¬8sæ|JÊVöšÌÞöƒøãºÌ쭯݊ÌÍͽ±ìĉ¯ÔŠŠ‹‹ãqÖüüüîÝ»g‰Í“~oûã?’¥¼¨ Ì,$>>^g­Q£Fk×®-£fO ™½ûÜtsc’™½¬¬S-[†:µ Ÿ6mYDa d®|||xœµùóç[hó~ùå—¼¼¼¯MfRPP@fFx#_¯^½È<è0{ÖCJÊVW×ÉÉÍzÝrlÍ×ef/ ‰Î’ÙsrO6œw<™=Ï«ž®uùln=†®Y³[Íìå”0Veöˆ‚‚¼5€òy þT‚,ÎÚÌ™3sË8ii;\]';|>!=}ýJfoàf¿1bë>4{ùþÐÐn_:.ËÍÌÞÉRÁzÌqïÞ=¼/€rFbb¢0ÎZݺuÉ9”uË—œ¼éäÉ3ÌìõØ>ÈóIlÝÇfïpc ³w¢´(³G³ìîînÔì?ÿü3Þ@9£°°ÐÏÏO¸=K‡Èx\(û<|wg·'±u¥fO–rêÔ©Ôqã¥EI›½þýû¿üò˲™¥,B³wåÊ•?ÿüo  ü‘››ëââ"¼‘oìØ±999eÚì%%mìØ1¢Ù|Ç[­ÅÖ5jö²K‘’3{ãÆSÎi5¨§—U¸{÷.Þ@y…ì„ÒT¯^}Μ9çË2ÇçDF.%Ë×hy—†bë’Ùëߺ,7{ÇJ—2{­Zµ’MeÛ¶m8pY“_ýï #¼‘¯Q£Fd-Ê´å;räDHHrî¾íh¦möŽ–:%aöš5kƧ¯^½z”ñ² ܾ}ï |SPPàãã#¼‘ÏÝÝýÀeÚò8pÔ×wNÃöÃ5Ì^V©SÒfoôèÑ—Mæ÷ßÇ»(÷äää8:: 㬟+ãlß~pÙ²m²ƒS¦LafïȳÀzÌÞ?ü€õTÒÓÓmmm•–ïÝwß]°`Á¹ò7{‡ŸVbönݺ…•TŠŠŠÂÃÃ…qÖÈNlÞ¼ùly›½CÏ+1{ö`*ä‚„7òyzz9r¤Ü˜=ww÷/ŸÅeö-Z$}¶Ú\³wÿþ}¬y ’••åàà Œ³öUgòäÉÌì|¦Xnö†.ÛKÙ\³‡Ûö€ŠLjjªÒòÙÙÙ-^¼¸˜½ÏKÌ^ddä| œšiÓ¦™eö¾ÿþ{¬s "SXX"¼‘¯uëÖäLΔA¢¢¢˜ÙÛÿ¬Ñaö,XТE á÷ì¼l&XäÈËËsuuÆYóööÎÎÎ.£f/Ó 0Ý쥥¥õîÝûùçŸWNDãÆMÜKä@ r&öööÂùâââÊ¢ÙÛk˜bö‚‚‚^{í5åàÓÁ \Ö˵k×°° %>>^g­N:Ë–-;]([foîܹõêÕ^V=zô… .[@~~>–4dúùù osqq!ëR&Ì^¯^½v[J³·råÊÎ; ǹS§NG½l1ß}÷Ö3„äææ’µÆY=zô±cÇr¬•ÈÈHë7{ÇÞž÷ñǯ[·îr1qçάdh@æDº©/ç­·Þš5k–•›½V3{±±±ï½÷žðö¼É“'_.V°ÏŒRTT#¼‘¯aƃᔕÁÌÞ+céÒ¥Mš4ÞžçããC6õrqóŸÿü ¦PPP@†DxƒY=8`…f/ÃjØ´iSß¾}+Uª¤½-ZìÚµër påÊ•ÿþ÷¿Xº0œœGGGá|þþþ'­nö¶[ÁÁÁÿüç?•ƒöþû罹¦^.1nß¾ ¤§§ ã¬ÙÚÚÎ;×JÌ^Ïž=·=kfΜ)¼ãñ¥—^ »\ÂÜ¿kú(** ÆYkÚ´éúõë­Áìm}v,_¾¼}ûöÂo½ûôéS·ç)¿ÃýóÏ?±P` BKãåå•™™yâY@.”™½-Ï2º (Þ¨g:øñDZ>P,dee988(½MµjÕBCCŸ¡ÙÛ\êDDD¼þúëÊ¡¨Q£†%QÏ8ÏœÄÄDá|~ø!ùœã¥7{›J‘yóæÕ¯_¿„¢ž™E^^¾À@IPXX"¼‘ÏÑÑqÇŽ¥lö6– iii%õÌ,~þùg,E”yyy®®®JçS©R¥!C†:t(»„™4i3{é%ðö¼zõêcÔ3Óùþûï±P dff w©V­Ú”)SJÇìm(I¢¢¢Þ}÷ÝÒ‰zf"7oÞÄ.Ê(Mâãã…qÖ>ùä“Å‹+&NœÈâz¬/¨åŸ}öYiF=3…k×®ýñÇXr(e ‡ ñQ»¥mûöí%göÖ7ƒ¡W¯^Ï=÷œ0êÙ.?#òòò~ýõW,6<òóïÕ©3ð7>ÆY>|ø—_~Yfom±âçç'¼JYÒQÏLÙ?ù—_~Á2À34{û»ºNÍÈȰµµUú¥7ß|3..îh1ÁÍÞšbbÚ´iµjÕzVQÏðø-ÊŠÙ{ð(ÎZLLŒðYýúõ—-[VŒfo•Å,X° mÛ¶Ï0êà l™=FAAøF>ww÷Ý»wgY@XX3{ ÛéááñüãÙF=Óþöößÿþ7V¬Ðì1rrr„qÖ^xá??? Í^÷îÝWê%88ø­·ÞzæQÏ´ŸÈ(**ÂÒ€5›=†Á`ÆY{çwfÍšuÄ|&L˜ÀÌ^šùLŸ>½nݺÂmUK3êvY@ù0{ÝÈ.Œ³æàà°~ýz}fo…9$%%¹¸¸XOÔ35nݺõ×_aQ  ™=FAA‡‡‡0Κ§§çÎ;›7{ËMfàÀ/¿ü²õD=SãÞ½{ˆ‘€2jöYYYöööÂ8kf™½e&Z³fMaÔ³iÓ¦YÍ»zõ*6Ó@90{ŒÄÄDá|µjÕJHH0Ñì-ÕdΜ9 4°¶¨gB¾ÿþ{|u €òdö<г"¼‘ÏÉÉióæÍ‡T?~<¥éÖ­Û’““]]]…QÏÚ¶mû £ž ŸºÅžÉ(—fAn‡Œ™ðF>ooï}ûöi˜½T>>>ÂÛóžyÔ3å6zwïÞýóÏ?±~PŽÍ###ÃÎÎNéÐ^y啈ˆˆ/ÿnöRþJ),ÄJ¢žIÍ@…2{ŒøøxaœµÚµk/X°@iö?aÖ¬YŽŽŽÂmUhm·ça=TL³÷àÑ|~~~BÛÖµk×7>>%êôlmm1ÈÏ//¯’pz………Êkzï7騍çç± AAP±«•OlÝŽƒ^¶yGæÁBBBŠÝìÉĨjóNçEƒ’ŽBAA%­†Ý†ÿý¹JR3–ššZŒNÏ`0H õíÎÙã³èAATê7ykÇó۸ƶ÷Lp]GG:ú}!õ{666………Åõø-•ÆKþÇËÕúOß425‚ ‚ * õ»¼qc©:{ϧãŽýC¤×ßüüüŠÅì…„üO±]ÆL»ì8AATê;~ 3xññ›Nžüvéҽ͛Ó¯nC“èìû þçκ¼¼¼â½¬÷n¦A+NBAA%¡Ñó4iHÖÎ`8ÀýØ‘#¹Ìþ Ë¿åÿ$_æZ~qOv·Þ XÃxÃ)‚ ‚ ¨$Ô}È2u¾¾óe–,>~wê4…Ò|Ö¾ôν¢¢"KÌžƒƒ/íû¦á«s ‚ ‚ ’PHJ»¬—ŸOfÉ~ûí"èÔ˜/vû/Ü#½g0t;½ÜÜ\iQ½ÆÆMYw‚ ™&­È>Í`–üæl6½|–…jÁPCåRÁÉ{Ù"§ ¨‚«ÿ¸edç‚‚Ä{ª$'盧]ûͦ”}Öš;4GGGÝf/&&†—óÿžqÊšã±é_A$S»¾£ÍÝüÜö£z¢†N^,;2jÆ*–…j©àã0o [yšš ){9u{õÍš¤Çûz=zÝÂÕ+Êp£ ULµiEvîäÉo…ÆìîÝût¶IÓ èu9Þ“ùgJ•*UtïÁ"ÝH¹Q×™›ÏA¤TÏ1æš½w?®/+$$që§MÚ(µ†e¡Z*ì{‡Í¥‘©È#Pþ¦¦Ï¸ØWßzGí B§håcx¡Š¦ˆÔÃïÊs Óðf¾¾ó~“»…Òÿ¿ç_´pƒe²ˆdy!ƒÃæÌÙz‚ ¥:õlö^{ë÷>®oŠš8w—òÚ£>:%;øÅc³GµTÌáÅ”¿©21¸ÔiâäéKE‘zú„Ñ[€¿›¦,ÛA†*”†­ #µJÞ­_„Òôº€Ò×qhÃßJ:Ì^zz:/á¹J•goÊ™Ÿq‚ ¥º ð{-ºv}Ý…¼^ýa !sÖ>Þâr€_Å^Œ@ù›Zç,cÓvÝ•gí›:±³ôƒ U(õ0‡ŒÜ®]9öìêÕï(sÇÉ”¾Ç°§;!W­ZÕ½”ë5uJÞù5AB¹y}üÄú' tÂÌž²„°„õ¬pª¥b/F œMMÀôeÚï—„§ØÛ~b¡ ¥VmÂÈÈ‘ÓvhNN“%l<»l¯…»+{xxðìÎÝ,Ùs‚ ¡º{?6{~Ò@w!o<útS–1+œj©˜Ã‹(gSÃß/ž£&©¥¡7KCU`œ¡ ¢ùé§Þ°ÇðóK¦”ÑÉû)×s•*s·–‘‘a®Ù³··çÙŽ\±ïABõ4޽Sþõisó.Úvš²“ljØ>ܳ†-ûuÀèp–`ò‚ÇŸ§t~0k¹c‡ž”Œ‰jdǶRJsñò…‰IT{­Ì"M°ö°´=¤Ž½ÑÁbiUA)©@6 ›µ•VmЍ%”]VW1¶P; «ˆò²–+{Çú†Næe7%‘ºÏÏÒëËviwœJHY¨ íEH/Xäu ûnÉÔ°!ÑÚVKCgYÉi ¨œ)nÑ~á^ÊJæÍÛF)'LßB¹Þùà#îÖÍ5{U«VåÙC§/^}à‚„òòØìÙ}ÚÐܼ1Ié§yQ<ÕÒÙc°Zâ/Vì–?rÂŒ7ÙHa.*\™…¥WVGÇe Ô §ƒtÊòöð•AÇM[ºŠ«…\Ñ 4†‚2JPÚ;:¸tÇ–@™—U׺cOáYªTØš8µ.|ÖÜYcÒ ט…ScT|@Ô‚ÊŸb“ö’… [nÔ¡±Ýöü ”«Qó¶ü b–Ó+((¾¬=°áÐe‚„ê;ÔŸ½S>ªÓÐܼ †=”‹Ä?ÁÙ¯Nz±Óoâ§x-T#©q gþ&V=fâLi–‹$­ŽÊ—åbñÂéWv„7I™ kï!¬=¼‘ôbñ¦, Û3d\„ppè¸Ñš»’碖󺤃»°XFŒŽ(g‡ÆD:ì§rÙ°NIÛI?¥¥Q9ì,µ\vVV %àgYYc”K…¯1>8¼¼ã²Œ–LYs‡?/PÅQdü6£â2¶nÍ~¸ûJhåêÖχ¿I]]]Í2{yyyR³·ùÈ‚Ôä9,€½S>®ÛPw!o½m+,aVÊfþN¤4SVJÏÒ¯,#A)¥§Wíå§Æ…Ï’;Ì?R­Í<×ûª†ðŠ–n9ªL@åÈZËÏÊNénÞSDå°“ É­Ïa]º[Èê"Úvî%;EG¤Ó'\6¬Ì5{Ï ‡‘åƒO¢”¼FY;y#…瑵S{QO¿$Zµ×ò©1qî„ã AåXa1ÈÂ%'ï4jÒvíÊ¡”CF-¢\¾“uÇÑÈÌÌ”š½Œcy©i€ïÓOíêoÛUSÇvÊBª?úp¯]·¡ìøœ¥O?ˆÃg$+3¶ëâÎÎR3¤Ç©áqeÆá‘Ê–<ŒÙÑÅ]˜‘'–ÏÎÊú¢»=|Ô2j4R9žü,©XZÈû+œVRí'Ö…j.:¾aÿyµºèlÚ¶cjKNÖT>5q‰íÆ,Z»O¸Æ„ÕÖ˜¾©Ñ–´ãÊa r¬àˆÕdá †FMÚÉ“ßRÊ~çP®q§ó÷¯ƒƒƒn³÷Jµ×öœ¸ Aš¼‡š>ãûFÊBª×|Wxjþò-?ûj¾+¬=$ê±Ù f( TËEZ²!SØ–‘ ÂŒ¼ä5;²Í-VG{øÈ:¨-^eWž¶\_ ›µzlg.\%ÌEÇ…3È—Mû®î‹J¸Z„cÂ+¢&©uaTPÔãç}<‡š¾Æx.Ùè› ÑPð·‰ÚxBPyÕè€T²p[·f5i/Þ¢”ýfQ®ÈIOqÚÚšeö222x^›·j8u‚ 5 ÄÞ,5j¾û©}#£êèê¡,¤Æ#§AgeǓҶ±Â•§d ¨üàì¤ÕÚ¹¤•ÒO£u$VmI{„4ªæ­\ø¤xôF…h§×ÝB££¡–†/a¿´Ï Ç„ºit V¤ïWvSßÓ=5j¢÷ÿÜ™0å üa*šFø-& wäH®Q“–ŸRºtˆ”þízhØllÌ2{©©©OŸùz«Æá37 RÓ°Q?—ëÔk¤»·ùe )†ío$Ì(LÀ›DÅR™jzûÉE<*ÄhK,I`I{ŒŽ€P«6à¥ñª[¶v:eóÞ““hV ©(££Á„~ kLX¼F£=Â^ Ç„ÚÀס†x7-\cº§F¨NnOÞ¤èÙø«U@õñŒ' wòä·¦ø4JÙ¾C$å¢? Ò?tºÍžÍ[5æ\‡ HMCF>5{º ©ñÄ3ÈŽ'¯|rñdd0£0o’‰P!F[bIKÚctÔD¹·‘Rã‘ ›ò…pÍj!o›öÔ³fP½Â¥UžöZ8&ÂΪ!mŒ¾5fÉÔHµóp.o9µJ6/Tq4À{®‰fïþý_Ø•=Ê5;yµn³'ûwï‰k©iäö*Ý…ð{ödÇ—oe…S-Œ¼IT,•iTK7dm‰% ,iÑÐÖ¬…«{y¥z«ÿï…>v³œ…-ämÓžz:ËJ.*DcQ {-V kŒQ5kÕÎÂ5fùÔ°ø¼Ð áP@P‘_ãîßÖįq;u™ÂþÄé¾gOú€ÆoÖØ™Aš¼ž<ù‰}CÝ…°ç(•%$,{üÀ#Õ"Ì(LÀ›¤–KGK,I`I{ŒŽ€‰2l?ÿ¹c»ê’]M舅-d¥ÑOsÓ𩃋JØá˜Ð€khÉ«%°pj(;Ÿ j{º áûìÉŽ‘úøó”jf&ˆ™·Rw“ÔZbIKÚctÌÕº}O÷©kÒ²…-d¥ŸË¶& ã¦Qk‰% ,iÑPÊoâL*„J3:h¼‘º[È#V¨ÕÅ—å§Æhä+¿'á?4¦fòÜ•¬ -œ-\cú¦†ižaèAˆ¿!Dš4m³‰›*³ƒG&S.Ÿý›*JÍÞ+v®=ø-ABõòøsÙ®NCÝ…p§!;—¼‘Nµ3ª%øìIè«Ö{ 3vy•R*[¢Ñ} t·‡wP-£RsÒvkÏȨ°™Ê2õµ0)ýŸ;jªrv¤ÑÍ„ËF™KzV8ïj“Îë46BØ»'Τu¯1S#k†¹!¨+bÖVÃ¥­_„RŽ I£\{|œÚÃã™ØØØðìã&Ï_™y ‚ ¡Ü? ÿ¯OL]¸ÁDÉ ±yô1M?Ãâ—KSJV8Õ"¬]-ÁÌå»lž|ô;vè)Ëå5&œ¿Áe5²\ÔµþêK »=¼ƒ”}þºÃ&N Õ®VÈ["­Kw ;¹â->~:?N¯yì¬pÙ(ƒô¬pÞÕ&]ÚHz-ËE¶D÷Ó75¼klµ›õ6 r¬i‹÷“… J5êÐ’“w>Œ;Á@¹ê~Ö‚¿ëCBBÌ5{<{ÏÁþK÷\„ H¨Þcÿf>‘ó7H ùð“OŸŠªþýÊŽS2vjÖ®‘`XÈti™-Û÷ 4í{ ¢×ü¸2;Ë ”îúÚà d¹XF£“BÃ"ÍÅê"5hÖ–W–£»…²écb¿òé§pÙÈV‚쬰:I§6K[B§4tPڅЙËM,ÍhS#m‰¹o*Çš–z,Ü AsŒ:´¸¸u”2tÚfÊõæÛïñ÷‹Á`0×ìùøøðìŸ;»-Þõ5ABu¨ÇìMš·^ZȨÈùÒAzÍŽS2v„jÖ®@V¬:ÞwäDe–¾Ö' ÔúkIí!µëé-M©QµéuQ™:r©µ5R–‘×"¾ld+AvV8­Ú“NÕº@mš¾Ì¬Ò´˜;5Ñ);,y›@P9VÒöódáš76êÐ<=gRʘÅl=#}¿äää˜köbbbxöjoT_‘ APãâ–vàg®fo8)+'rQFÛîÞÔn@¢,ýdé©aíFÆÙ7u¢b_¯þ+ßcøÄ¸´ƒÂĬ4J Všå ÌjÓððyŸ·ëÎSá¦Ï•ÌëbÕÑØj×¥¯…²Å@%ðô¯?²^Tˆ0¥r%HÏ §Õè¤SÕÔ`ÖrÖê5IßÒN`ÖÔð¢t¿M ¨«Cשäâ.^¼¥aÏ~ûíJCš·å\pü*©Ù+**2×ìI·Ú{x-=e×Ümç!‚ ³4ûq0£÷k×Çh@¤¡ÞC‹[¿þˆÑ}WÚwJéÛ÷Î}š½½ý]T­Z•Ò{Ì”øÍç ‚ ©:zŽyí­wÞû¸þøÄ­Â݇M`E)%† ‚ ž’NFÎÏ/YÛ͛·íá&{£R(}õ÷ì,y:ƒáååÅ ©Ý¸õ´g!‚ ©\‡Ž¼‹S7åÙ)«Ž½úÖãÛççoÅpA¤¡)«N6ù<¨yóàû÷Qóf®®¿ê œ³;4i§ôØÌÌL}fÏ`0ðBþï¹Ê—šºþ AIJhoµ7k²¿“Í» _ù©žc¢ßù¨;Õ°Æ ‚ £êÐcšFд‹oÑÙ–­Ã(eÇܤU©REÇ {|keÊ΋r¹æ4A$U·QSŸ>ÎöfM.~°¦]=ŒA¦hXÔF²sžž3…Æ,*jõ¾ˆR¾Zý]þGÆÕÕõH7`©ö–m˜áA$“çĤ5jõŠMMÙÎ!t¤•ûŒA&jüŠ-ZO G·ÿY™%ËϿ׼yp“¦‹Ž ŒZ*ýS“‘‘a‰ÙËÉÉ‘–ÖmìÌà´“AR#æí0eE‹^#H|'™±cA¹ê˜Ff¯C‡Ù{¾¾óéxÇ>ñ”¦VCG˟ÕB…ðŸ¹ÚèÅGÆ-;AA»üR³ÛE²ÇrûíiÔŒÏ[„Ž\p¨Ë˜Ò qñññ–›=éco3î8`ô’l‚ ‚ ¨$4hÆ.òuäî\]§&'ï4hÛH¹oغɇ^zõͧA·mlt?š!ÃÑñéÕ¿?W©ãØ/|ƒ ‚ ‚JBâv6wšÄ<É¡i`ï‰è¸Ý礗àRSS999ÒÇrÉï¹M\68é(AAT”xÄ}ÒÆ.¾)½&¬8÷ ùÄÉCêô+áááÒòÉï}êÒßsî¯YAAPÉÉ-b•͇õ¥N¬J•*¹¹¹Ši@ nùÞ¨U‚ ‚ *!ý³F-™#§gáv+¸¸¸ü <; 㨨($$ƒ PúØØØ”Ü5=ÙóÒçs@‰R¥J•ÂÂÂ¥U—™™å ;»ÖÕ«7ñ÷ÂP¬ÄÄĬ¬¬Š WשûççßÃPÀì˜=³`öÌ€Ù€Ù0{fÀì˜=³`ö`öÌ€Ù0{fÀìÀì€%'''33³  f >OVfV´Xd™¸”h¦”K˜¦`©¤™(.˜©äЦâŽ;i(î¸ãŽ[¢¢âŽâ‚ŠŠ¨ˆ+à:îãÞÿ›§Nç™93 Ã6ï×õ½¼`æœûÜsÎ>ΜsßO-Z488Øh4öœ„:‰v… z꿹ººFEEöœ—Ä9—§,óôôLII!ì8—ÄÄD rOÙ P¡B9ñ©.a Û  oæŸÛŠfÍš…‡‡—+WÎü©âÅ‹GDDö™6‰mæYNÞªU«NþeĈ/¼ð‚ùbñññ„=G#!ÍÝÝÝ<¿I¨;vìI3û÷ï÷÷÷×ý`7 À`0öAZZšnl{öÙgÛ·oàÀËÖ¯__½zuóu‹-FØÈ[!!!ÌÌÓšD8 r)¶™4iRÉ’%Íqss‹%ì侘˜WWWó„&±mÆŒ)™tôèÑ=z<ûì³æ úøøØ7éaÀ½¼¼¼t?·•À&±-Å^qqq_}õ•îð,vLºAØÈ‰[AAAºÃªHHÛ½{÷©ì0þüÒ¥K›oÂÅÅ%S“nöl©;†3‰g§²[¿~ýŠ)¢;éFbb"a »XšC˜D²S9æàÁƒÍš5³4éF†Ã³ö¬S¦ÃÐ Ob˜„±S9oõêÕöMºAذ",,ÌÒtQQQ§sׯ¿þª;醻»»¥I7{ºbcc-M‡!¡ëtIHHøá‡t‡gñ÷÷7ÿT—°`"--Í××WwX ZÇŽ;×6nÜèáá¡;éFHHaÀ’àà`Ýé0$\mß¾ý´#™9sæ[o½¥;éFLL a@+**Jw: T³fÍ:ãŽ?¨;<‹2éa %%Ew: Q¥$Pql{÷î­_¿¾îð,¥K×þè£Î„=P0Y™Câ“„¨3ÎcÙ²eï¿ÿ¾Þ¥†EæÎ]ȱMDD„î°*™$8qNC‡Íâ¤Î.>>^÷nV‰I–Î:¹Ã‡·nÝÚîI7œ—D€€Ýé0$ IL:›_¬Y³¦råÊvLºà¤ÂÂÂt‡U‘P$Ñèl~4~üøÌNºàtbccÝÜÜt§Ã8t._KNNîСƒí“n8‘´´4Ýé0$I:W0HÜõôô´eÒ §`4­L‡!áç\Á3gΜ·ß~Û|‡¸ººª“n8>KÓaHÔ‘Às¾`ëÕ«—îð,^^^iiiœ<À‘%&&ê~^)ñFBÎy<߸qcÝáY‚‚‚ŒF#'p4ƒ!00Pw: 6oÈx&V®\Y¾|yóÝåââɇ¥é0*T¨ ‘&– 6ìÅ_dÒ à˜âããÝÝÝͳЉ1d9[=z´M›6ºcM3éÈ+Büýýu#ŠD 0¤¸LÙ²eK•*Ut'Ýç|¹)$$DwX‰+[·nMƒ½$×é~ªëîîˉrZLLŒîtQ$¨Ö²îÔ©S]»vµ4éó€be: 'QÈiÙèÀLºr‡Ñh ÒVEI\\Ù,‡,Y²„I7@ŽŠŒŒtqqÑcÞ¼yéÈyü׿þŤ {YšC‚ÇÏ?ÿLËMlÑ¢“n€l¡L‡¡;¬J“&M$x¾òÄo¿ýV¡B&ÝYni: $®<7vìX&ÝöÑýÜV¢Åˆ#.Àa;v¬S§NLº2%>>Þ<&Ý€°göÄöíÛCCCK•*¥,V½zuYàÛäÉ“u'Ýððð`Ò {&aOѹsççž{NY¸M›6ÉÉÉd*GvâÄ 9dºÃ³0é„=“°·cÇŽuëÖ5iÒDßcøðád*'GÍÒ¤aaaü@ØÓ†=;þüòåË«ã{¬ZµŠLåà,XÀ¤öl {ŠáÇ¿üòËʺõë×ß¿ÿe8°óçÏ÷íÛWwx&Ý€°gövîÜ)K¶nÝZž¥[·n©©©Ä*GväÈ&Ý€°gcØ»víZ½zuíÚµÕFÂÃÃÉTnÍš5LºaÏÆ°'âââ¦OŸþÎ;ï(MUªT)::šLåàFŤöÔ°× ÁÀ  i[·n× {b÷îÝÏ?ÿ¼:ù„I7 ì-X°s„-ÍšoØpàœ9+uÞسgÏâÅ‹«T©¢^ ¶téR2•ƒ›2e “nPÀÃÞìÙq3fÄ……ííÓgÓ—_Žôõ¹bE´nØ{÷îýõ×_K”(¡´ÿÅ_È2d*G–ššÀ¤ذ7mÚn) {£F4èPëÖÑÕ«êÚuÂúõ[tÞˆíرcáÂ…ÕáYN:ulÿþý5jÔО…I7Èßa/4tŸRJØëÙóhçÎǽ½WV­:xÀ€ðØØ]æaOìÛ·/::º~ýúê†ÆŽK¦rp‹-*Uª”yässscÒ òkØ Ù¯”6ìùù¥4jt¼FÅuêô3&B7ì‰øøøY³f}øá‡êð,6l S9¸~ýúéÏâããää¿°7th‚Zڰפə ÎþùÉÊ•ç|ýõ ™3Wè†=±ÿþaÆ+VLÙhãÆ“’’ÈTŽìèÑ£M›6µ4éóŸÂ^ÿþ‡µeöjÔ¸P¥Êe7·¤ &¶j5zÙ²õºaOHã­ZµRnÌ0hРôôtXtttÅŠ™t€üö$Ý™”yØ+[öÚ;ïÜ|óÍnn£FŽœ«öÄ$$¨Ã»¹¸¸DDD©ܘ1ct‡gñôôdÒ òAØûé§c&e)ì•(qç•WŽ~÷Ýp+aO}ÒÓÓ‰UŽlñâÅï¼ó“nà´a¯Gk×N·TÙöŽ<­ÎÓ*=œ?þu8¶àà`&ÝÀÃÞ¬YË6X¥ÊÔêÕ{x\Ô­l{"11qæÌ™®®®J?«W¯¾cÇ2•#;vìX«V­˜tç {;ž?~a:ý*WžS¥Êi‰væ•aOÑ«W¯"EŠ(½mÛ¶íÙ³g‰UŽlýúõê½6Lº€³„½Ø'Fš+‘¯bÅ%åÊ¥•+gÐVÎ…½£GÆÅŵhÑB}›häÈ‘d*7aÂÝáY˜tG{bÛ¶ƒÏÈW®Üê2e®|ðÁuµr.쉤¤¤¨¨¨J•*©o­Y³æØÙ³g»té¤8WØÛùDLÌÖ>}¦Jä{ÿý˜·Þº¥Vކ=qìØ± &¼òÊ+Jç4h ««Ùž={j֬ɤC,Æ=±½ÐÐPíƒò­òx¦ºtóæMµ™ZQÝœ´_—3¾F¥Ïùø Èå°·ë‰õë·tí:¡bÅÁ¥JíyõÕÛR¹ö„,ܱcGux–îÝ»_¼x‘XåÈæÍ›÷Úk¯™G>ww÷2éF©R¥žÊˆ,ãíím=z)íT­ZUû 2‡<•©.I¼T¶›Ù”¨N™gc@uFN÷¥ŸÊ¹‘ €< {qO¬]»©mÛråF½újb±bws!ìBzU¯^=õUÌœ9“LåÈ$÷êÕKwÒ ÿ|?é†-aOåççGØ#ìqP8NØÛýDdd´d¼2eÆ¿ùæºÜ {âĉ‹/.]º´òZ*Uª´iÓ¦›p`rÈÔˆn2|¨žŠrp#""¦M›6eÊÂ^ÖÞ¥wÃäqó÷Ž´II÷=%õ…¥Íi_‹)-]œ–ak¶ˆiûKÈz¯´¯Qw7ê&.“£¦¶f~ñ¤ÚoÆ!ì°‘Á`0™Èà™gžéر£Ã†½ß~ÛòégÛ%vžª”IØ1bþ×õú4¨Ù34t©¥°'¤ý:(ó¬)ó\¹r…ô•kîß¿¯ž„ééé+W®œ1cÆôéÓ {Ùö,…õ-)mæÑ~j½Û&×›é¡ ¯L˰5ówÞl{¾ifw¯LŽ—òáx†‰Ë䨩×RšgNõsö,ÞÏKØ`.22RÒŽÉuÅ£Fr̰'fÎ\]·nOŸM{Ÿþ~Àe)“°7°Ý-ƒGômÔÓÛ{ðÂ…tÃÞÙ'äUxxx(/ÙÅÅeÑ¢EwÃîÞ½«^žwëÖ­M›6Íš5kæÌ™„½l {V>T?ÍÔ®hË8{jÑ&ó ¤¶oý³Hë­Ù‘vÔ— û®`¶ôÊöì$««oý™ïRK=Ñ= „=Ù%%%E{ÿ£hÙ²¥Ã†=eqãKä«ÝtÅ×=ÓMÂÞ}†MìÝ{ûwm:U÷oÙr̦M{tÞ8wîÜœ9sÞ~ûmuxé‘,‡bžzyÞÇåpÏŸ?öìÙ„½l{ÖƒyØÐÞÊš©·ªÌƒöãÔRVYj;+Ö¬çÕ¬÷ÊÊñ’&Ë+C¦h±ÔÝ€Õw\ͯ´$ìÈ.F£Q}Ë)ÂÞ±cÇN>}”áYD@@À•+WeõXHê»páÂ1 {À>F£QþjëγöÉ'ŸH<È–°—W6lØ»O¾–°7ãëöêíºJØ;þ~ùzõ¨ [j'66¶iÓ¦êëçç'ÂIÞ–„½Ùžß«÷ꚇ½J•ºz{ž??ÚR *Uª¤ì777ÉQYŒy¿?™õ,99ù¨ { ‹bccÝÝÝÍ#_±bÅúõëg_ØsÇGø}â¿£Få^])%ìÕ­Û_Y@ÂÞ¸)1šŽõõµÍR;!!!ÚáYΟ?oßç¶÷îÝ;{öìQ›ö@¶×½ÏÕÕUþî;oØë7Úçãï+~òdfÝŠ&aorÄñs~°¹VÝ‘Ê翺íHâêØ±£2}/}ZoÆèÑ ¬4%¡è½÷ÞSöŒ‡‡Ç¾}û,ż›7o*ï f‘ƒ„½¾}ûò3@>£;ÏZ±bÅFí¤aOŸ0|xÄ?üª†½>¡)J)aïÛ «WÉ2J>Œ‹Ûo©©Þ½{«Ã³øûû_½zUóîÞ½+É9!û8BØëÔ©Ó¥K—´³~ç¢;ÏZÙ²e%hÞó’°×yÔ9µÔ°7lØé&_ïÛwPwuI\-Z´P‡g‘õû_“Û*ñ,{9BØKNN–{ûöm~@È C@@€îç]år•2[«~öY/“uׯ_¯„½}9ϡŸçÿ¤¥¥ùûûë^È÷ý÷ßÇÅÅ9uäÛº5®k×IS¦,WÂÞW#;øý5·®öÞ»ñ^¥J]-…½½¹"×ÂÞØ±c_}õUëaOp¿ùO||¼‡‡‡yÞ+\¸p``à‘|AÂ^Í1­¼Õ¹u5aÏdIIVJØÛ“[r:ì…††Ö¯_ÿÿø‡öàZ {)))ŒÇ@¾¡;ÏÚ›o¾9yòdg{“'/«òퟯ÷®ý×ܺ†½Ý¹(çÂÞ„ ^{í5óÃ:qâÄd .^¼Èù’Ñh Òg­jÕª’1œ:ï-]º¡E‹QÿÔ⣃Õ*>™[×zØ‹ËE9ö:uêd~4[¶l™lÕÝ»wùq ¿JKKóññÑg­uëÖ’I;³Ù³W7h0°\ß&¥O¹)aÏd‰UJØÛ™ër"ìÉ!Óį¿þZZNÎHzz:?äo±±±îîîºó¬õë×ï°“›g>Š„ WWWÝ ùFŒ‘ÏÂÞÖ¼ã aÏ`0pÎP…„„èγöá‡Ι3ç ““L¥„½-y*ëaoÚ´i^^^O?ý´Ýa{r(° C@@€î•+WîÍkÒ%ì­v}ûö}饗Ì÷Õ[o½žœ“ÒÒÒ8]€}RRRtçY{æ™g|}}ccc!ìý–§~ýõ×2eÊèÎzÖ½{÷äœwãÆ NTQQQº·<ÿüóC‡Ý“GV¬X¡„½•ydþüùuêÔÉÞYÏ2ëÌ™3|† ²EHHˆîýðáCN0à aOù6&&ÆÍÍMwžµ=zÄfÍÒ¥K•°7?k&NœX«V­¼õ,Ã÷ôh8`ØS„……/^Ü1zôhÝkÿgÖ3õÝ}ñâÅ7nR¬ØEмZ¥Ê'ì Ž <<<1117cžl±xñâO ·HðË…È—––æééÉÞÈ}…  ɹ¤g0ÜÜÜØÏy(((('’žÑhtww7ÙÖJ–úà‹æeëúQEQEQ9Q.kþ_‘çM2XXXX¶‡=í&d£5Úo5)–¢(Š¢(ŠÊÑú.$úCÏïMò^TTT6&=iMÛxáb/7¶¬ÝÔ]EQEQTN”ïèhïŽ3j}3ªÁÓ¿¾VñhÙW›Ç\\\ŒFcv}€ëêꪶüì? 7ºðÇð8Š¢(Š¢(*'ªY¿H÷*Ý+UêªÖ×fÊã•¿éï…„„h›ý¼E`ÀÌÝEQEQTNT‹A+”€×£GøºuñÇ/V¾mÔy¦<ûò[e´7禥¥e=칸¸¨m¾øú;Ýçì¡(Š¢(Š¢r¢:OÞöég?K´ Y®†±%KvÈ#•«to²¾ÅyÙûæ^dd¤¶A¿àˆÞóöQEQEQ9Qü§H®kÞ|ô½{´‘làÀùòø—MFË2×iªf³âÅ‹gyŽH/µµ’¥Êô[OQEQEåDõ™··ò“Kõ’’ΛD²7î|úiOy*à×?Œù¯÷â"##íNz‰‰‰Ú¦ê·í3hñŠ¢LªïœØö#"2UÇ­°½}eÙ »šÊߥœêìª WËÀˆ?â\À ·Q,—g½[ü*K–*÷‰šÐ¼¼¼²åÖŒÿ}úÙÁ w‹ól?É•ˆ(AQm¤E‘cW¦(ʼê}ÿgØ{¡Äëo–.oK¹×þÚ¤‘žü¥“§LïöËŸaO¶R0w/{  9óÕ"v,U`«}ßäúô™m%žÍœ¹A–ù¶íDYþ½ UÕœæëë›ÅY3ž~æÙÑ‹vMX}„¢(óªß"@ùIyëýòv7òâ“°gÞBà¸E^4Û" `î^ö@þ>4ÒˆœöðUâuv,U`«Q‹?Þµ[µ*ÎJ"ßò+…*˜5|ê&‰p~~ãl,åX~¹RÖ*ñÚ›jZ ÏlØ+Z´¨ºz¯Ól:NQ”nù´þ3ì¹–©˜Ùuƒ'GêÞ®«6¥. [ùªIkK ÿ2{nû?þ<êå’.–Ö’ÆÍWQ–7ßœ>™ {)))Ú°·bÇIŠ¢,UóvÝ”Ÿ”Òe+ÚÝH‰W]t[3}…ú“(Ë §}V¾UV²¤ö©°ùÔ§º1i¶]×–ú¬®%䥩š¹r§ùÒŽIoÕgMž²»?êP;cKI;Ê3Ù-RÞMÛènËî*Ûµ¾jlò”<¢=|º§ÒæÂ ‡tw£ò¬ºó¥dIu‹&ýT;©ûÂÕΘôÓú9&›PŸ•]”õC“á!ãW U0«OðR‰pS¦¬Í0¤­[/K¶é8UÖjß}úêáá‘©°« {Q»R(вT-ÚÿýWû•W]2¬*_˜7òÊ“?îï—­hòø¸™ÿ!5Å|Å/ê7ùs0ÌöÝ´ËVt7_ñ‡îÌ{òÇœõ›è®¨. Ûr÷þμcòZìîº,­h¥“æûS}V*[z¨¾^ÝÃ*õþ_ÁL¶¨{ÚÈãK7¶´-yvîo»,r&]UÍð°뙺h£î9¦»¢¥s̾Cc©”¾™ì%Š*8Õ³ÿƒìÍœ¹!öwï Y²E›ñ²V—¾#ÕŸ_ww÷L…½˜˜uÝç ‰Þ}Š¢(KÕê‡î™š>ã·ÌyåÕ7tŸš0kå_ôßÐÝzàÀ?ÆtüAKkI…/‰Ñí²â×ú.‰Ñ]QmyAT\f›µ£?ê0yÖKÝœ¬nþ¬nÏíëá'EÄQçë®%ëAõ´©Ó ‰•“J÷lÑÝ'ꆤK–^BÇ•e}×ÖösL]ËäØwh,•¼RëûŸ¢òwuìžá {Ú¡ö|¾#kõòëßqº¸Ø=¢rñ%7í;MQ”¥jÝáÏ¿Ë%_{£ŒÛGV]¯&æÈºÒ‚øËäÖ×ÒnTþÍðA;Ðn:+ýÑ}Ö§Ÿ}¡”&ß·•F¬/ow3Ü––QOÝ×eýYÝ}"/3Ã5;2ÆüeÚwŽÙ}h,U™'aÏúž¤¨|\?L³2+®ù ¹õêÖþî²c\åððpuÝ×ßx{ûþ³EYªv?öP~X>,÷‘ݼú$˜·0}Þê?/û±‡îŠº ¨]’f¥MK¥lTH#ö$+ d¥?îÝš¿|³ÚšºéêŸ{vé5xÅú½Vb¦z(Me¸7Ô"ÿên1têB+ýÑ}ÕºûDú ž‡VJ}™Y<Çì>4–Jé›É^¢¨‚SM›‡H„Û»÷D†!íÞ½L¢ñåYK~hÑÙöŠ—(¹5þ EQ–ª­&ìÙÝHÉ¿2ƒÉãSçý¦4.[Ñ]QwµK6’F2ìIVÈJ2Ü–JVT³VÉ'q®ïà_tb¦z¨öÍú¡Wº!ÛÕÝ¢öÅš?«ûªu÷‰î‹µDÛûα¬Û÷EœÊlØóür€¬5nʻÞÉǸ÷ž¦(ÊRùýõ‰[·ìnDýèÓäñ‰sþü¤L¶¢»¢î~™üdyÖÒ˜ {’•²ÒŸ ÷€õ3yAãæme»%ÿû>ñ¥W“,öPí›õC¯~@©{ÚH#VN*ÝW­»O”­(ɰª~öEϱ¬[öEœú¡s¦?ÆU~ÅÙý1®ö—^.¹6îEQ–Ê·ýß×ÒÛ݈zƒ†Éã¡]/[Ñ]QwµK–Ö²£'YY +ýÉpØX«ãz ùÄã õ!d±‡êm™]FÝ¢¼@+'•nt÷É…=ݳ²‡--]‡FÛë{’¢òqýØ5s7h4ùnŒ¬4r²Ý7hhÞømçIŠ¢,Õ÷þÝÔÁFìn¤Ä_C…˜<>vÆŸ£[ÈVtWÔ]`Ø„yvwÉRO²²@Vú“áÈl-Ž9¤Ž@RÙã‹,öPy±òïìU;uÇÕetOyVN*ÝW­»O6kcߎ²ïËöCóþ_ãìñ+…*˜Õ#óC¯ÈZ?õñ÷L7®®YTyÙödŠ¢,ÕwíþžAÃîF”<`ÞÂèéËÿœ¢º]WÝu_«Œùë¬lT™ø@»Œ¥žde¬ô'Ã=`^?õ-Hkî4µ“v÷°f½ÆÖ»§ž²®îãÒ+ké6«»OäUgx~2 ·,à^½vÏ1û•RfÐ0ÙKUpªßÈ6ª¬Ì ÑúÇ)²–U6™.í—9km9AQ”n}ÛæÏ¿Ë®V´»uF-“LJOùs*+يøø¯©¯>¯ÛHwÅú>΂*Kš÷ÄÊk±o»û£¾@K+š×¸¹ÑÖHÇ>£ÍÛ´¯‡“#w¨ÇNºj~t´³›éž6ækiŸÕ=î–ºº-¿Ÿúë¾׿&8Ó®h÷9fÇ¡±R®M—Ưª`Vÿ1¶N—¶dÉY²cà\Y«n£¿§Kóòòú=“Š-ª®ÞuЄˆ˜ãEéV“¿&…·LÅ¡“"m,“FŠ?ù3-ÿö ™£}\–T—­ènÝÒcf¯+þןþϾld²VËÎAê¸É•µäµXz½ö-`wÔ(«‡-ÞaãA‘­[Ú–4¨öD»-»{X¯Ikµ‡zR—¯Õ•guOó“Aû¬îq·tе”¯MÖ’¥Û»Ï1ûõCfÒ7Š*85rÚf‰p}úÌÎ0¡M™²V–ìüs„¬U±j­¿çû ÌlØswwWWoÜºë¬ IEéÖ7~?=•yÖjyçƒ §‚W^—o•Çe1åAÙŠîÖ­,àßk¤¶Íêu¾‘e¾lì'_«›¯¥<«vÀ¼ì^À¾þ¨ *k)+fxPd·h×R¶%U¡j-õqóvìî¡ÉáSJùVÝ¢ü«{Ú˜œ &ÏênÎÊA—>k{"—eäAíKè5f¶­e¸€‡ÆR)ûÐd/QTÁ©á[$ÂùùË0¡…„,—%{\!k½üÚ›êvDDDfÞ¯¯ïߟ×ó™¶î(EQºÕ°¥=a¯ßø%ÚF:˜ð’æÏ±|­<.‹)ÈVt·n}“fµäñf?ö5_EY¾Ô,½Þ¬,`G¤¾hÔJ»¤•MÛ¾-iÓŽµ,õPé¤ÉŠêVtwˆzÚ˜œ &ÏêVë]´ô¤=FÎÊTkÖ°ïÐèV©'aO=ó)ª Õ„å$ÂÕ¬Ù'ÄּùhYr𤘉«hããã3ö‚ƒƒÿyþ-׉k)ŠÒ­.#f6ð ÈlÜkÒ΀iQµ¾iõöû¤ä eùWY^¶¢»õ jÙc¸[•šÒ싯¼®´ïÓ¡ïðy[tVZ“,µ–õ2Õ¥~è?þ“/¾V–Æm?:Ò²º-es²o­o˾šœ Ò‚ºü‹O¢—4¢»¤ù™ }V÷°fxÐeÓÒa¥çÊK—#]²ï²¾€Ý‡ÆüH)[áW U`«vÝA’â’’Î[QùÓO{Êbc#ü<>Rö CfÞÉè+¦G‡þv„¢(ŠÊTõ»Hù-úÖûåÙEY©&­Æg8Ôž2È^­/Éò_6í æ477·ß3Ïh4jïÑø6`pÈÊCEQ”¶ê6ïüB‰×ß,]¾÷ÄUº |íÿ³ò[T–dwQe¥:ô_’á=ÊÝ>m&Êò¯¿[VÍi¿ÛÅÇÇGm¤âç F,K (Š¢´åÕ¶÷Ÿã±Ôlhþìàù»Š•øóò¹îV±»(вRçü1€Þ§Ÿö¼wïõ öºŒŽ0w‡öØÈÈHûÂ^xx¸ÚH¡8÷Ð%)Š¢(µzMÝðü˯)¿'?mà+ߪO5î<Ôå½rþ¹FCöEQ–§÷0ÉrëÖÅ[™·jõ^ƒÆ7hÛçïV¨Ñh´/ì Y]mª^›Ÿ,ÚOQEi«aÇ!êïI ~j©¾æZ޽DQ”-åaeeП¦Ê’Å]ÞUÉxzzþžÚOr_ry·Ïü}EQ”I5ï7ùÝ>ûOñ×L†:‘G>óéÀþ¡(ÊÆê=wOµÏ–D—pÊ$’]¾|C¹·ó¸ m†EdËg¸ŠØØXmk 8w/EQe^?Ž_ë;xNõƤ¾j?¨í¨¥ìŠ¢2[ß´›"‰®qãá&Wîõè.×k"˼SÑCÍf...¿g™››ÛßÿK-áÒyúŽ®³÷PEQEQÙ^§î¨V3ÈdžÜˆˆ?&S«\¥ûã66î=IûF\HHHÖÞö6 Q­i—N3vSEQEQ9Q¾C“h'Õ¾ý„™37HêS¾mÜeŽ<ûÂkïü=+bñâvßšaežÜÿyú™Æýgÿ0}EQEQ•Õ¬ÿ²OªõR2žRºÍ“ÇËÙBû\XXØïÙ$>>^Ûò3ÿ(ì3,²Í”EQEQTN”ïØM »Ì­ß~ºwçYߊ–G*7 Ðæ1ûfͰ" à¿óÞsU[ôñKQEQEåh5ývåº&÷ûÇÇÇgoØ3žžž&[)òÒëo¹×ýðK?Š¢(Š¢(*'ªDi÷gþï9“ þ{¼§½3¹/88ø÷c0¼¼¼ØÉ¹¯hÑ¢Ù2ÖJ†¢¢¢Š/ÎÈ5^^^iii¿ç¢ØØØ°°0d¤H‘W¥Ø ³‚‚‚"##SRR~‡SFÈa?ö@Øa„=ö@Ø ì€°Â{ 쀰Âa„=ö@Øa„=Â{ 쀰Â{ ìö@Øa„=ö@Ø ìö{ 쀰Â{ ìö@Øa„=ö@Øa€°Â{ 쀰Âa„½ÄÄÄððð””v@~ {ð¼¼¼žúK@@@ZZ;ÀÙÞ„:‰vO™)T¨PPPÁ``78cØ3çŠ-ú”eòlHHˆ,ÉÎp¢°V¼xñ§lãââÎþpü°éêêjžèž}ö™Ÿ:¶ŠY3·ù·^º‘ÏÍÍMÖe¯8fØ‹õððÐ rðöm_qöØv¥bcQ³šî’ÒBLL ûÀqžÉͶZ_Ôª³6âìñæµ|єʕÊë®%­%&&²‡ò6ì•/ï¯{³­(ïöÁ¢9ãϵ^s¦…¼ÿ^)Ý|}}¡ OÆW^©ü?ÿó¬yH{µäËSÆŸ;±ÓöÿË YKw„ “ŒÐ›BBBto¶}ñ…çûÿpþÄNûJÖ•tGh b„€œéââ¢{³m—N­ãןOÞ••’¤"E ›oB⥄L@Nˆ‰‰qww׿ٶiÃøQç“㲫¤µ6-¿•©;(#´d£ÄÄDK7ÛzÖöؽ(õä][V4ù¦ž¥Aù¡ ‹ÒÒÒüýýuãV…reÏ›”zrONWôªyŸU¯biP¾øøx@f †   B… éÝl["|Ò¨´”=¹YK"&I¼´4(_JJ ‡ ÀFVn¶Ø·kZÊÞ¼ªðI£ß~ËE7ò0(€uVn¶íÐ.éàæ´Sûò¼~Õ_w„–B… 1(€9+7Û¶höÍÁÝëÓOÅ;NNÚõsÏNÿÒ¡¥hÑ¢!!! Ê °r³m/>Û¶12ýô~Ǭ¤„­hõì³ÏêÊÎÁ™µ›m˹`ê…3û¿ö®oñ]#K#´0((€¬ßl;cJÈ…3œ«ö숪óÅç–FhaP>PpX¾Ù¶Ø  ÎtÞÚ°fa•ÊY¡…Aù@þfùfÛg»ýÔþØáíNôÔŠ˜öÁû®º‘Ï××—Aù@þcífÛæ틹x6!ŸÕ¤ñ#^-YBw„–€€Fhùƒµ›m=klß´òâ¹Cù¸õïùâ ÅtGh b„༬Þl[6rQxþŽyjMÞ۽˺ƒò/^<$$„S8k7Û¾úÊÌiã.?\Ðêpüævm¾×”ÏÅÅ%""‚Ó8‹7Û¾XlpÿÀKçäÚ·3Ú§±·¥Aù¡82+7ÛvïÚáÄѸK©‰”TLtä—ž5, ÊÇ-ÀÑX¹ÙÖ÷{Ÿ#¶]N;J™Ôò%³*V(«»Ó˜j 8+7Û~éY3vëjBõšZêí7ÍoÜàÔyËÊͶ+¸­X:ûJzec…Ž ~饗´û ä+7Û¾öê+³Ã'\I?FÙ^Æ[Wo]¿°`v(aä9Ë7Û¾0dàÏWÒS¶—d¼Ç]8{hÛŠ#{7"쀳gäuóz¬Ó°òŠ•›m[¶hz4!–ðf{]¿ræáƒ»Æ[†ƒÛ欟ß+:¢'aä+7ÛÖ­S+nû:ÃÅdÊÆºv9åÁ}ãí—ŽïÚ¸°Ï†?ö@^±z³m¹•‘ó OR¶×ý»7· §ŽlÚºHx³½nݸ Ül›°=bëòa[— %쀼båfÛüýŽ%î¹~å4ecݼžöèáý;7¯ݳlûÊ‘ÛV '쀼båfÛz_~‘¿ãú•3”uÓúðÁÝ»w®Ÿ<´aÇocv¬EØyÅÊͶU?©¼~íòëWÎR¶×ƒ{wŒ·®ž;±+nmhìê_{ ¯X¹ÙöRoÏ›=õÆÕs”íuÏxã®ñFúéñ›¦ïZûëΨ±„=W¬Ül2:˜ä–©º{ûÚãÇ Sn›=!n](aäK7Ûþë_Ezõìr)ýäMÃyÊÆ2ÞºüøÑÛ†Ô£{–ïÙ0i÷ú‰„=WRRRÜÜÜt/Ïëо͉¤ýZ(ëö‹>0Þ¾vòÐú}1S÷nœBØyËÃÃCçfÛºž‡ÄÝ4¤Q6Öíë>¸wÏxóìñØøÍ3â7M'ìG`r/ƧU«lŒþíÖµtÊöRÆT¹pæàÁíóöo™IØŽC!õëqëÚÊöº÷öý»·.§&%Æ-=¸mî­³ {ÀaÃÞàN_^>Ÿxûú*ú÷æï߸z>ißo ;æ'lŸGØöÆï´ì×Ö—SÞ¾q‘²T÷î\üøÑí—N&¬?¼sѡ؅„=àaoÒ˜;׆.ÿ3ï]¢LÊxËðèÑûw®Ÿ=¶#1né‘]K{À¹ÂÞÞMÓw­›ùK‹‹çŽÜ¹y™Rêîí«>¸ïNÚ©ýG÷®8ºga8iØÛ·yF\ôÄeãüÎ%í¼sóJ/ÃÃ÷Ü»s95éø¨¤}+ {ÀÙÃ^ü–Y{cÂWNh|Ïjã­+¶Þ7Þ¿{ëÚ¥Ó'­?¾?êXüo„=?ÂÞþ­sâ·Ì‰šþS|ôtã­«­Ü»ýûïo]K?´íÄÁu'¬!ì€|öl›wpÇüý·,rëÚ·'„º÷ÖãÇ· ç“wŸ<´!9!š°òqØKˆ]¸}ŘuÓ{\>wôîíkù¸îo<~ôèÞÝ[Î$œ:²)åp a„°whç¢=ë§,ÛêøÞ¨ü™ôþˆyÜ¿{%íøé£[O%n!ì€öïZrh×’µ3ºo_:ò†!íîëù¦$å=|p÷úå3çŽï:“´° fØ;²;2qÏò+Ç.ç—ž²ÿžñ†³×Ç÷Ü7Þº–žzrï¹ã;Ï‹%ì€öŽî]™°}þŠñí¶.pâ˜÷dè<ã­«Î&œOÞ}îDaö”°—´ï·cû£6Íø[Øé§Þ»{Ó‰êÁ}ããÇ%ï]NKJ;Ÿš²—°{æaïøµ ;®ï»â—WRïݽåàõàþ‰yö S.œ9˜~z?aö¬„=IAÉ ëw­]6¶Õ‘Ø¥÷ïÝrÔ’˜÷èáƒ{7®ž¿xîð…³‡{y"))©ªCþ*‹ÙØŽ,¬}ÜÛÛ[ôóóËT¯¤¥µ ·kBÙœü˯@þ{'m”¯7͸.¼ç…S ÷ïÝv¨zôè¡ä¼Û7.^I;vé|"a/íÙ³ç)ÛHˆš={v†íH8Ô>^ªT)eÝLõJQZ“f3µ¢²9ù—_#€|öRŽl’€txÇ¢Ua?l]8ôòù£îßÉózüèÄ<ãmÃÕ '%é]NM"ì9KØSXzް@ž„½ÓG·IÚ±?fÖÊÐvO"_ÒƒûÆ<©'CçÝ»g¼qíÒ©«’¯¤Ÿ ì9TØ“€´GOLLL·nÝ”e%ïYú—°@.„½³ÇwJv:°yîÊñþ[ •ˆõàÁÝ\«Gîÿþûãû÷n_»|öŒ§aÏÁžõ%%ã©/Ö$Ñe˜¾{ØöæLd_Ø;Ÿ¼çüɽ·FHäÛ1 åইîål=| 1ï჻7®ž»’~Ü´{Nö´yÏö4EØ Saï£ò¥ ?÷‹ý{îÔ!ö…½ÔSñi§Ž]ºqnÐ’1ÍlœuýÊù‡ïe{=‰y÷nÒ$ÔY*žs…½›7oªŸçZ¹YÃJØKJJ Íð_ó°£Ü,_d1ìI›êÆ™ “JÏ­wÀ\jjªì+õ¾f·(k©/Ù–»¡µ+*keöFfÇÙcPÃÞÖ¨ÉÏ<ý´òø¿‹ hßÌî°—~&áÂÙÃçŽïŽ[3iÙØ–›"¦$l~ôð~¶ÔãÇäß[7.^I?v9-ÉZöœ*ì‰nݺ©7çš´Sê +7hx{{›ßá«›´aO’’öŠA¥«Ò ;ž4kÒ”²°¥O¥ÕW¤¼:í*¶ì+‰[ò’u·h²—LÒšŸŸŸùZ–ö•ºçÍ÷•2ò¬•ì§lN˜ø\Þc@ØÛ¿uÎ{ï¼ñôÿþòÔsÿüGÙ2ïÆÅ̳;ì]<Ÿx)UB×ñ¤Ý«%ï­m»{õÄ3‰;=z`_=þcì¼ûwn^ù#極¥{Îö,-ŸáݸB]Q¡î:ÝŒ¡<¥fKóµt?¶öÔ趦{׉²€ôA»®ŸJK¸RÛ/¥a}‹æ)Ã}¥îyóT,=—T¦~Ù·CsyaO {qg~Púíÿû¿Bêÿù÷¿Ì•Űw%=ùê…“©)ûn‰ˆ™´0¸ÑŽÈÑÉû×o_ÿcL<êÉDw·¯]I;qéüÑÌaϙžú]hß,²öÔ¿øË—/×¾¥>eòž•öÔ "Ë+OI j›æƒ'g˜[LÞ“€¤>e‡ÔÖÔ·¥cÖÇ4ߢÉ‘ôeé£pyêS²s´»Wû›ºÍ òea%n¥>aýÝNÙºá-÷÷ö´wã¶÷û¦ðsÿT—)\øŸ­š7ÌzØ3\:uíò™ëWÎ.Ÿ9·jÛÒ‹G6Ý0»OÂæˆô”ƒ’å?~¤[Òç{Ɔ‹)’Üì(ž“†=íå[†=ùâæÍ›&M©oÜ™Ä6mØ3ÿÄSŠLR¢n°Q[³ôþ’š^t[SV4ï¼õ·õ¬¼ý¥¾ÛfòªÕ¹­¿égé=UK+ªÍê~ ¬ûlîï1 왽2wêÿü»ˆºØ?þ¯Ð{ï¾¹cÃül {7 ©7¯¥ßº~ñÖK§lÛ=mÝŒž ‡5Z3å§}릥$l¹iHScÞý{ÿ¿½û€jêüÿ8Þs~ UÁU­ˆ¶NµîZ­Vm±XÜ⪵ÔYnÅbÅ`¨€(2dQ†@ز÷ÞÙÄÝÿÿ צ×ä&HB€Ïë|OÂMé=§ïÞ›ûÜ:òÀò¢”f b¯íÇ¿c;œ€á»&6ȳ1æ cñ+C!ŸMø«Qxß ~kP“¯s]¹Ðà!¸ÿ£] M=ôƒô÷°ÁcwRõŽ ö×Ù ó±;z8ý”n÷n]îÝ(ÊØûtг£¬íN¹þ½!âáµ÷ïß>«, ©ÖüAìµíØð䜃{ôÏüsbOÀ‚~*…þEÎA6ÁòÙ„D?ö(äš„Â|¸Ž“môC‚œw^À/Èïá4ýßZ‹¼cˆ=‹*oÛ¸R^þ¿Sº¤ýú|ù…µùEQÄ^™€)ËO|^]T^˜$’AìµíØ ŒÇ„Yg:“Èu8‹76èçL£øòÙ„G¿ô˜<ù+)+Æ#o\ÛS—²ò»› ïKjð("½¨¹¸1þÖ-õŽ öÜAÃööùž=ºÑÕU^îûÉãƒ}ìš{‚çI^â³ê¢²ÂD‘ b¯íÆž€•FLQ±'ø%q>6F¼±Áu­GƒxŸ­ÉW’r]‘ʹ¦•¤ïB(¼ À{ÞdÎÁ:ú!AÎáG˜”ð;€Øp»´È»qc”åºtþ$ùºÊinÔÈLðWìU’Bá ö¤?öš¶ôJûŒ=ê(µÒïâJ,±Æý ï;Ãu¸± ±G-½bxöPÏÝdee¨­­Íb±\]]·jjZ˜5:öjJ;ö* ž§å ö¤=ö,ª, ö|Mb±G^C”x_|óÓ¥¤¤„TïËôgæü:$½õ:…Œ=ÎÉYÎgùr•†w ±'àÞ¸1!N÷]ß¿S÷²êYMÁógE¯_=%ýCãwC]ác¯ÁAìµÏØãwÝA“?³Ç¹F€„Â|fOÈ 8‘#à#m‚„hÓ…ü/ボÏì5ùÊ_Á±ÇõëXFÚÞ1€v{)‘.b¯¼(…Ô]UEzuefMe65ϪóÞ¾}¹yó&y¹.Û5×ÅGù6{Õ% ‰=²qi^œ¨±'½±ÇÉÞU>š|5.ãr"üÎ0Ò• {Bþ‚ÔB(¢:NERŠºŸ,¿µæ8¿5çíâüÊ‹<çò&ÄõC©wœÀûéÁyÇ{ôØ;tPk×Ö5üb¯º,û勲Êò4vìUå<ZÈ™wo_®\¹RVVF^Nnþ¼ÙÁ,wþ±WÜà<ÉKxZ™OÚLäƒØ“ÎØ£ßÉ‹÷´lƒëì1®ØFêEð2ȼ÷ÈàÚ€ë•^5ŽëÞô£mŒoB“Ó…±`_?çíâjã·\¿·EøØãüšœûqðûÕ$ÿŽ öè±Wû¬l×¶õ£G óv1æ½¼´ ÷ï^<²W{/ž—Ô>B†Dà‡ï>ÞwCNîÛ‰cïܺÊ{ ;ö*òJscD>ˆ=i‹=Ò!¤^è7Gð<übñQœ(â:œE¿F€w:ú½$¸ºHp:’¯3žæwk³&§ §…¼ýÀçL.¿w˜±œ…½ÿûôvfÖ”ü;€Ø£Ç^yi¾ã=“;&§‡) <¯¯Å{¤‚Ê ß½­{ö´€{/k+^ÕU“yûæ…³³ó§‹´È÷ìÙcýšßÝœ­{d{fâÄžäcúo4/®k È_yOüýŸ§q¹îKr… ¼wRãwo\òOú]byó¦Á{ã’o‘Gq‘~§WÞDiNºÐŸ–~|þ‹s·¤/ÅL×oÍÆŠ=Îõ5‚!¶È;€ØãÄ^IQî?þ¸LýOW“ŸU¦ª/˜ÿØ‘{Ù‰>%¹1o^½xóú ¼—µåTì‘¿’ùçŸ'Nà]?¡[7Ò}ò‹γ²0}ZYØà°c¯<¯$'ZƒØk‘Økp¹’ü>„ÖàÕ¸ôx $ã±#ÎÕ¸ôO r=Pø›qÕ ã³‘ïòFlsÒ…^nü~¢àÃwŒâ=¯Ý¨Ø£¿*~§È[ê@ìqb¯¢¬pî\5ò­úÙܹphߦ¡ƒ¿¶½s{ÔíÒ*KÒkŸ–½}SÇý_‡ˆàoF*“¶cüoz×®ò:t˜­ªbfr%?;éieãÔÇ^.©21 bOb±§Ôòßnú±ÁÏÃ{œ/ÒÏ ®Gê@Õl®®®\kÐÑòÆçüž–7bù­ C=UƒQÄùÕ¸~eú±²&<Šñ¬+¿w^@ÂQÛ sÙ¯„ß1Äç3{‘!÷GF¾+#ÓQkçºÛ7ÏŒ­LþÀ{‚o—æëé¸`Þ/:}þ¿ÿý±úäåådeeV,[ü¤8ãie>× öÚFìI)F'$Z¬©Â/&Iœ°X,ƓȹT–÷bRñu~"u4êòÛæÿÖ­ë@ì备ùßûmż:¾ŸxÏÂpùµáÃ;X^2ö¨¥W’ãBöîÞª Ð§K—.$íx“¯C‡³TfÖTäs͓܄ê²v’‰o{Ð^c/&Ô1"ÈîÌI-99ö-ÒzôèváŒöYýÔÍŸóS¸¿ƒ±ÇYz%.*ð”ÞÑ_Eª¯S§Nô×@¾XS‘Ç5Orã«Ë²‹²ÂÅ8ˆ=hß±ʲ±»k8Ryµñ‚y*¦çvm]£Ø·Ï=›Òã|„=öÒ+å¹d⣃.žÓýÍÈNõºuízþì ê[ôù{ä™Å9ˆ=ho±÷¬ª¨8/Ž{Þ–ž®¦ê U©í»wïúçÚ7¯è/˜«¢Ø÷Ë›WN {Õå¹ôIKЏpNÏÛÉëëÔÔÇ^VaæcñbÚYì%G8’Þ«x’âHÅžŸÇ/·[Gníѽë¿'^ûikm>«wp¸QÊÆxºY{vì=É,Ì÷ ö ]Å^ɘÇv%9Ñ/kkbÃpbïÓM+ó‹óçüÄyìø±#õïÓÚùçWýû®X:ßû¾µÀØkÜØ«*Í$%&Aì@{‹½¤0û¬xïW/Ÿf¦„sbÏÅÎØÑúÊų‡G(¥Þ±cU•éÎþ¥ñ›zÿ~}•†²ºs•1ö;ˆ=Ĉ5ö’ÃS£ÝjÊs+žøzXrbÏÖâ’å­‹;·®éÖUž³bÞâ³ NÞ¡¹näˆa _^º WC‹½¬Æ‰½ÊÒŒüô`I bÚeì¥D:§F¹eGÖ¾xâïB½Û7 Œ/œ?G¥c‡ÔSuêôùÏ*ÓÏèÖ;v`ú´É½{}qäÐÞ¬´ÈúØkô|Œ½´ É bÚmì¥EßÏNôyõ²&+#ÞÍÁ„{¦×N_¿¬\gψáCéÏ9íûI'u_1P_<·G÷nkWÿæêhI’¯QÃŽ½’tvƒIl{Ð^c/=æAFœGEqÚógÕQa~ôØ»f¤wí’¾®Îžï'OìØ±ç™ÇŽ¥shƒí­íÛ6?÷ìÙ£¾úîV–f3õ±—–— ¹Aì@û޽Ìx¯ÜÿgUEÕUåž÷mHì™\;czí¬©±Ùõsf7Î_ûÔO3§é׎õ ðuY¾tÁÊêÅi¼ó1ö’YÄ ö¨ØËK ,H}Z‘ÿ²öyBl¨›ã-g;S{3W‡[®Ž·Ýï¸9Y¹eziËæ5C‡ âª>ÕŸgþºbÑòe Ë‹Sy‡Ä^yqJN²Ÿ¤±ˆ½c/?-˜ô^INô‹§O^¿®ËÊHôõrð¸oéáníénãùàãx{ز9Úß39°ûÄ cé/`Á¼ÙåE)¼Ã޽¢’^’Ä öè±W˜V”Qšû¬ºøý»7%E¹ƒ=ý¼ü¼ÿ{Áþ®a!£Ã½Y>ާô«þ<£¡ØK&?«%±ˆ=îØ+ÎŽ*Ή.ÍZYðîí뚪²¤¸7ú„?ŒóNŒa¥&e¥>Ö;v`ùÒ…e…ɼSšCÅÞ£Ä öc¯$/–º7nMEÞ›×µ/kŸådÆG‡?ŠyHMt˜WbŒ_jB`Vjèù³GW._\V˜Ä;ìØ+LÊ&?®%±ˆ=Á±G5[Õ“¬Wµ5ÿ|xÿ¬¦¼ 79)Ö?>ÊGÈØ#ÿÌ¢º«E±ˆ=þ±Ç55ùuµÕ¤ú^<¯*)ÊÈH ˬ½_—/âݘ ;ö Iqµà ö±Ç'öøMuynÝ‹ªïßÕ½|våïs+W,fÜŒŠ½LR\-8ˆ=@ì1ÆžS]–mkc±~­ãwëc/äVËb{¼±'üäeD0+'Ž$_FìÖÄ ö>½¼8LNl}ì=hñAìbO,±——ãÞâƒØÄÞ±—+’!±G’/ÝZ->ˆ=@ìqb/F$S{±éÑnÒ0ˆ=@ìQ±'ª¡b/ -iÄ öD{¹1iä§KË ö ÝÇžè¦4›Š=éÄ´«ØK󱵸l{÷ {EÙ‘"œÒ옒ÜèTò¤g{ÐnbÏÉæÚ×Ù0jÀØá{È_<{Tô±—EúJª±í!öÂýú+¹[\w:îg£µþ• ìÞËŠÕØ+ΉJ‰p”®Aì@;ˆ½õ,Ýqô€kZˆy¬Çé «ýÞ×7¸ô;äî-£Â¬p‘L ‰½ì(WÒ6ˆ=hó±7Ryè]/gÌp«ŸËáN:¾¦šî†sŒvŒ1,+)°03¬ùS{‘ÉáR7ˆ=hë±×¿ŸÂm×´ûdÿQ÷OYíò¸ü‡Ó)…o‡™^;+ÊØ#/Cú±m;öF*=çhj•àcëAbïB¨upoÔo*[7¯.ÈxÜü©½ˆä0;)Ä´íØû}Å‚ßm½îD†”Þé «ãþwvy\žº}Ùò%ó 2B›?$öŠ²Â“ÛJç ö  Çž»ÃÍ~J©ÆÓñ5Ýï}”™išK4~S/Hmþ°c/3<)ôžtbÚpìå$ùÍžõòÛ¨ÌÓt7Üàjð‡Ó©A?Ž?Z'?=¤ùS{a‰¡6Ò;ˆ=h»±î>å»ñ ¶“ÆûÕþ8™éGW¡”Ÿ,’Aì!ö c/7Å?!âáø±£z*õSZòÃ׿L$íâkŸŸ,’!±W˜–@‚Jš±m7öòRóRƒœï]ß½mÝÑC;Òã|É_E5%ÙÑ…IMIù ö MÇž¸†Ä^AFh|°¥´bÚhì妊o>Æ^Ð]éÄ´ÍØK ßÔÇ^H|…ôbÚhì‰qر—L:ªU bÚXìå$û‹uJ²{ˆ=hÁØc‰uHìå§Å˜·šsìýóÏìº ¹Øó|Œ=óÖ3â½âœˆïßaï Ä^v’¯¸§8+:/-(†¼¶V4⌽¬ÏÂÌÐ÷ï^c±Ç^¢¯¸‡{©1,³V5â=2ùiïÞÔa1Ǟا>öH>µ®wìQ½‡ó¹ ¾ØËJ|$)ΊÊK íÔêFܱGæIA¶3¿v¬×ÝÉ×.ìHÅ^Fœ§Ä¦>öü"·ÒiNì¹ßÙ«±dª\gÙc¯4/û34!ö’ÂìÃ|,~ø~<ÙfìèáN7êcOróoì]k¥ÓäØÓ\=«g÷.Ÿ}ª¿bÆØ#óºî9vihBìQhìݾZVF¦«|Ã3Ú±{9I¾ÞW[ó4.öNì[¦Ð»Ûg³·õÏåÿ.µ§Ë޽O'ØÛbå²9ìkdd6­]áw›fNqfdv‚7)¥60œØc9žÞ²zŽ\—N¼™×»WGv46ó¨)Ê Ã^ н¤0{k³ÓÔR{kV-ŒìíÆ5¶·Ï=œlÐë‹ÇiònМù7öŒÚÀP±§³û×/zÈóf^Wy¹šÉ‘nM+=2ùiØ« ±±—îîg9}ê²™ò°Á®¥F¹ñÎ…SûIìQÉ·wûê– ãf{Yñ^¶9û×z¥Áý×TY§¡.øb[Ĉ/ö¨ 4íÝ +##/ßå”îNòWÞ‰`Y“mú)~IØ]¹TÍÇÍ„qKáçߨ»ØªÇäâ® c˜/¶¯6ÓßóN33±=OÇËQVÿÅ^¤ g+Cê:Üï&~CþL}‘w.èk)D=ó¬'ß¹®ÇoˇÄ^f¼û£n­so™ñýhÆÌ›I8*äØÇîøDš—óµ?VÎ#YH}ÞoëŸËý˜45ö܃\OKÏxXë®X8ñbÛ!ƒ¾26:*áÌ#“èýþÝkìÒÀ/öön[É{üæÀî5òrìS™1ÉËé*¿ÍB™ïÖ\E}ÞOV¦ãÕi'v‘/ xf®!±—ãèrJÆÇîĺ•³äº|Λy½{õ8{RKò™GMi^,ögࢬ¬LÏ•cÚ„=2,÷›+ÔU©ŠÓܰ<*ÀJÀÆzG¶*+ äü,’ˆä+ä„‹½û.ú->Z[õ䳦ʾ]ëĺ¦Jƒóºî9ögàbhhÈÕ-û¶¯ú$öBm+½1£”¨sµ'v Þ˜uÿÆ_ûÿüaÊ8Úº+#ÉW¼¯ð{;ö¢ÝõZpôµÿº_oÆ5UÖi¨K`MÖ€¦Y»v-WÀl^§Î‰=áçÈþ Ô¹ZoFg´Ü>ÄÛ줎¦ÚÏS©uWˆiSÆ2nIb/-Ú-Àùd‹Ì¥“ëGûŠñ*Œ¥‹T%¶¦ŠàOë½y]‹=øÑÖÖæÊ˜-ë–°c/ĦQâe¦ñë*Þûö&ùɲæF§µÍI†ñ»ìØ‹r p:!á¹{yçôÉ#3oÆ´oïÛ]mñÌ£¦öYöaLWW—«gÔ~þ^ÈTã?7cÍõKåå:³Wh‘ëLþL¾Ò„çù4ö\üKlœÌö«ý4ž1óF(±23’ÌÃr+ ¼Ó§Os…Íp¥ö—⃭›0~wŽì[¯Ø·7uùÆ¢¹3\¬Î7í©Š2Â%{î‡V©O—éȰ¦JÅ>-²¦Š€)ΉÀ~ Â377ç*y¹Îf—Ä[5yÎÛ>fÔПʛ<öÄáÍÁž&z{©‘.,‡cb/›#ÛÖªñ[SEçÀf©Ê<ê~Þ¿ÃN âììܽ{w®ÚÙ¿óæôRŒ*Ó¿ýoÝ•éßÙ·Þ×íªÐ±çÌrÐßܶ¨gw9Æ5Uvjj´øÅ¶Œ—ߢô iRSS¹Ößc„oÖ÷A7ã‚,›3>®Wu´ÖM›<†ó´ßޱ‡ÆC{Cú{öGÅ1guV ¨Àøñ¼uêÒp±-ïµ·5yØK 9jjj/^Ì?½zv»z~\ÐÝæOÇ3Ƕ©ÍšÂYwe¸Ò€‡71nLb/%ÒÉÏþ/ÑÎÍsÇÀ˜yª*Sý=ïH[æQ§n_½¬Áþ "Á{‰.±pÎôÀ‡×c-D5õw‘çü¢g7E…^Œ°c/ÂÑÏÆúêö& g̼ɓÆHÏš*8u âÆø>fÆGEØ{‚‡{Ꮎ¶:Íû»–ÎýŽßš*·Œõ¤3ópêħ´´TMMá#m¿ÏdpGÜ#’Øs½¥µzÙtÆ‹mû+ö9{RK:3LInÔ»7uØ@¬ÌÍÍñÞ»&&à¶X§(#,9ÜÁçÞá&æêŸ{vïÂx±­ÎÍÉ‘nÒ™yùi/ŸW`ßÉàwˆoøÐ¯oiÇøßÓ¥“س÷¹w¨ s\k©Bïn¼¯YVVfˆ_¥pMÎyÛª'™ÿüó{Hã!>bêw£,NÅø›‹|رfÿÈF»Qsþ¯UCôaüxÞªó¤pMœ·)QZZÊ»0 eÚ´û6Ѭ["œBvìÙ=²9(ä\?³nÒØÁüÖTñr5‘ÚÌ+Ή¨«­ÂÒ€Åb7ޱ©~QùîöUh–™HæcìYhp,/mž=ãÆ—4nŒ²•™4ÍC怲±±QP`¾ÅÄqÃ/œØígÖÌ!±—ôØÖÛj¿€q2Ù¹Dm¢LǼ/cÈ ¯ŒŽJmæ•æÅ¾®{Ž ¤Ö«W¯tuu?ÿüsÆäøµ‚îu,·¿£üL›6‚cÏýöžõ¿Îë,Ëû£{÷êqâȩͼ'ñÈ<h-JKKµµµ¯Ý ÌVùîÔ‘MM‹½ÄÐ{^–ûxGk“ZnÌkªìÔÔÎ5U ÒƒžV¼÷û ´:555†††üNìòr—.˜i~ùP”¯‰óoìiÑGwÏ¢¯{2®©²NC] ×TÉIö­(NÆ¡<hÌÍÍ•••?㯯¤úôlôs5Šô½)`êcÏÆóî^jŒt3â+Æçœ¯6ÓßóŽ´­˜Wšû¢¦»´=ÎÎÎ+W®ü¬!£G ^»RíÖeíHŸ›¼S{Öžw÷˜œ]3uâÆg˜1íÛûvW¥ê\meIîíAMM±±ñ”)S¬>y¹ÎÇ[³Ríèþ5–7ŽDøÜ CbåvmžÊƇŒP"%kªPñžV`IdhŸrssuuuø™Ð¾1há+Ãá;€½zõÊÙÙy÷îÝ‚¯æ ]l+{`ߎœôhR\âž§•uµU¸±€Häææ’ðÓÕÕUSSc<Õ»eË–ÒÒR¼QmÀ«W¯X,–¡¡¡n=’‚xO •úS·ep endstream endobj 971 0 obj << /Type /ObjStm /N 100 /First 921 /Length 2049 /Filter /FlateDecode >> stream xÚÍYÛnG}çWô£ýžîªê[ phc`ƒ¶Hâø"G–‰#£(»_¿§šb¬ mµ(f7†…î™9Suººn=,ÑgJôF™œ1°ñLÅø0C¾`Œ†ð¬ÄdØ%ŒÙpð‹á&%D#Œ÷S4AÅ%2Ø’ØdÖÏr1¡q)@¼'o’Ç]PéÉ•IŽxÔ%âe§w0  S“He㋇’ì@Öéoˆt3§Êð*…Ì“’±’¤«eC¹‚&ÁU~” ÈÈ)ºš9*£²UWa]?ÀÀ±÷PQ&!M X29ؤÀF$0^‘H­Z`%†YAÃa#A) 9½ã1Ss;ðäà²Î <À¼˜AzPƒ.G®ñj Ig›ƒ¾ê!65®‡¸"UøTÛ8èuæÉ± uáXß#Á¥ fØÄ(J Ö””«äl¤P•B0ÛàÕÜcÔE›@N‘`V‰žêÆy5[`ñO ³ô^†›°j"8…èž:\bÍÕA !T“à2D§÷@+$ÖîrÕÁÐVªŽ&Â= Càx””•¨›)Ï‚±:c&ÕÀ|¨Ö„sFüÓY61{•+˜•jWÁ¥Ú•Mr ž’\QêAý–•<5ù\ïGTï fÕÀ~Í^ J‡J÷Ä©2Ä_ uKð ÅP&“îó®`ymºúV°¾'ÁÛ.‹Ë³³÷“¯¾ú<–m‚ÿ´`9;›À¤ ËfmRrÖÃÚ°XZn”²ÕtÓ„±97bÙ[†—4a}²éôpXŒæàÀt‡¬¾Ö/Âï“¿–pßBЬçpå «__ 'Õ”üÚ@\÷Ãr˜½éGóÎt?|shº·ý£ùSÓÛ_ôx0ýÐOº—ÐÚ/ÆRbU2é^÷«ár9ëW5Ö[ßõóÓé×Ã檈H©Ð{¨™.ñ.pn{±X õ®¦på¢)\Ç;ª+nÒ}=,çý²Êtï»o»WÝK\À›ß+‹èS$‘}CÐ}@2a‘ÌB„ù²2xsy4Bd÷ÏÓÅoÝ‹ƒƒª {1O‡E÷¦û×ëWú÷ìd/¾ìº««+{t6 óÕI?·‹~ìæýïú7»¸°'ãùÙsÐÜ‘)¨1Ò¼%ä%än+Ø+öÙŸw¢úa>œõv6œßॅðÑ£Bõ¨”²Í´%na×Þ—Öt¥ XDW68¯ÛÒ„èö¡ K…,2u”Õrý´ÈúL·Âl×ÈÊá^deÞ9²ä:²ÊzDX¬Gw=úëq½šÚ¼<%}BƆõcVi¯Ó²–68\–vÇ>ŸžžÃ—«áè—gÓñ—ç'§«áx¼ÂBíì?OPì¶`ÑË[=;4a©Ø\¸  䆨† èmb£\‚›S›\ÉH)mK“ˆ”ïsV¼¥Fó"2-ΣmXluh³s°žÛ¬ )JJ]Ê©V¼&,Ô˜Û8ø¢-a›pF¶¹ ‡ þº(æ„!g‹vS—ôÉÆ’¯Û{\\ÈpŸÒ2¡kÉw{¦úQâ1MÓGÔï­IäøóYd;رuO²îÎf#ßl¾ìØkÖO>ë&Òóf"›IÜLÒf’?Óh64Z~n4±Ø;Eòˆ,o8%ë`«ˆ?9ÙÚLÌNÑG,gŒvê“ÝÄ£™šŠ týáíGeÔï}Út„ò—2¹Ó`1`O¼Æ¯~=EÖaAöqÎÒ'˜¼ûs4Â{$B"HÚÊ$µ†¶2Þ ·ç¶RX]éÿ¾vÒõþø9j!Ø>‰èf[ùÈþø$D¼áƒ”ŒdÚùD›Q}oò©y†Ü#2Ø-ðCl 8Ælq j šXò­XÔIßÈB²GÈ·‚±mI””¹Q0×ï¡,Å:‘F0Ü(Åø·údèl)7¼{¹áM•áM•áø´šr;4}Т¿%«¿Ly8œ ]:2—“EÞc®À Y+6„´›Ö_Nšùàuë÷˜Û¼ ®ƒ®“S0œ¥Ú+Õa+ãÓ—8Ç{ùJ“¯n‚IÐΣý (vžÊè?SE±úÑùÑ=×͈¸7?~ô«ZE%¼:¯¿(…χ `ˆ—‡Mº6Òö­Ý»îÇͦã¼ÏpÑOɰBrýÍç7ÍrbC’Æp)ûsÏêG©&NÖC†~BÖŸ6Q&(4F‹Ü÷ÔøO½VûDôÿ>ÉûÐ7N«ÁK˜2‘ZÁö4ˆ‚u[ÍÛÁ8ÐHjÃÖÜÕ(×Ã%6‚qjNüxýy˜öàkõ·<ºÝ<äëeŸg,ÏT€²žp’ñ"¶ ™PÑÿôÁf¾œ_,‡Ë±ÿb¸ÐÐÚÕzX7x endstream endobj 1074 0 obj << /Length 2632 /Filter /FlateDecode >> stream xÚÕZKoÜF¾ëWÙC(ÀÓî'›ÔÍqÇ9x½²p|à {4„9¤Lr, ‹ýï[ÕÕäÒ(Ž † a?ª_Õ_U}MöÇH0>þ·×³ìå˨Ž8ü%B3™™ÈfšeI–eQë¢mô¯3]Cõ˳®Îžþ¤D”AµL¢«md–d*²F2“dÑU½‹,×ëʵç+•ª`ç+ ø1R˜ø×εßwX©ã—‡²pç+É!c)Îß_ýröâêìã™ðóc÷:eV©h³?{÷žGÔýq¦³4ºõ’ûÒ æé*z{vœòlêi$8Ëx&pê–3‹°R±ÔÐÌ5óSÚDïV†óøU ³ÍT¼oÖeå0­cWŸË4þT¶M½§tÿä|¥y:‘RqÝÀâÒ¸påwyAÍû† n±e^ö”Û6-U_>£‚¼.(Ñï\˜D×çmOR?þüüͧ„ŠÝç vµËëkúN¤ŽŸU+\M$Ët´‚‡Ña‡ú]s¸ÞAË$‰wM×w”Üä5%Z÷ñພ2~2ð\ãw”î\]”õ5fL|Ùz¿ÝPñ¶©ÊMÙç}Ù„¾~ç†_¾…_ñ„ ú]zÞçÓ.›½ë˽ s©› äUÔ´žøÅðùBr”V*ný|FƒüÞà£êÃÍß?KÈWå¾ìƒt³¥²]ƒ n©pŸ×ÃÔ Êk@ù]¸£ú¼ =çUÚI»"È5ôì2<ª`âœ)e£•[ -àêlÄubAÕ0i,n¨{G±›¶óÚw NÃEœS)aµÎ;’K±»Ã¹ˆi'°€ÀÖ½Nšnèø<ý[tÓì%šD¬ø=#‰ßâRmãW=u4*¥£a,²–UPDÂ2•Ìw²ƒizDi‘ù=Ñ"_y|c nðX]Ö š½ÇŒlƒ‰bÍ G¹9Ty‹Ö¨yŒ¦…³)A~ÓÔ¿s¡¯m€*GÃf^¥ð(Ü6?T=Õy„ùNAå8|…ËW§ Ù5u¾&GhƇ=þ®HÌ ¡ºÐM‰ÓÚP¥³#à ’I¡‰Ð ¤Êj :­I´*ëè ”ˆ¯veèhëòþÐIÛ<ôVÖ˜ë[tZ6.†,kû‰Õr–2q‰Óy. ©hzp1:`-»¥¼_ &6UðCmÚPRö¡7ÐŒK±ï‡ƒŠíuáûÿA©ÛrØ}Î÷7ÕQ‚öœr˜„ªÐý[çpYÝä4F„U†ðP4›§¡Ë§¸&×®ün0èyKÍgF$³Ò@/ä¬`Ù'Æ‚I¡¡é^=ýWA!|OázÀDLjbÚf¥´‚Fv¾…¯›Þ]œAYfí8?’6é}Èv5ƒ„÷á˜ÈonZؼñEH(¨âÎgü£¹ñÛ²ª(µÁ>¨…žý=1lfß>#/…à¼ãAâÙëgä}Œf–góµÏC†Ö&Ìyו×ä|!÷ÀN±°¹ k‡4X#kuð ƒüq…ÖfGj„U›CÛøWwTtè†vRKJøÅÄë¿]=dH:I˜þb2Å€þÜcHj“~‰=äC” =I ‚óó?ß5ÔÅ01… í'æª4HîQŒK lWo._üôê7B$i [_ïpL§*CAÚ~¬™rš8>GEqÂ8Ø]@ñó£êa$ ÀBƒóÁÀü<÷¢°gÞq‚HNf=`@À¬È€Ü«ÐUA¤Ï…fsŸ†%MÛM)G oâ¡ÿc|*Ã*ÍÆ†˜‚º€gÔ~:sTm`dr˜ Ö¾ˆTô§rˆ*ƒÜ*­$°È,ú&OŽyÔïq=t„ÜŸ`ƒ](:ú]/àé¦ ‡Åµ }ì›Ö"õ0w’÷yƬ“*9FG§‡+À¬wX„¶]h<(EÛIQHË@Ÿˆ•yf§½ñqŒ_¨­TªóйG >G`¥q?éÉSPÊŸX_àÈ3cXû°l˜astYwú8 •ä3v•NHfg† ¢p°6"ÚHe©ñèá&T9P-š8as‰Eù#±rGjNGôa†ù@pòcÃqð Um›±7ú=òœˆ©OˆzàVôwž+ÕfQ4þx^;-f{êÜ üšIp®àU±|8c*ð¸ÖŸ§Í/Ž0HžF3mÕ9ïÇÛ?=Ú—%ÌG§òÕƒe‡-ÿŸ×MofÜg0,%,ýœ©4ñ ¢@”!®Ei¤Aå‘¶cÑÎÛSÉ{Œé/UÖ)˜h«™H“¿Z_ï'œ%p]nä]2øïm¾ ›ûëwü;Jÿ{™íÒ–ñ4]péF0aÔ àD+Cº(Z×yêçñÜ6{Jõžlcê¦iªe”£@ *[@9 ؼ¶0 e ÊÙT —E± 2–¥K,×JÀ@i©7š–ëwÕ¯VrÎ/.ž&z™Uó„i½àC‘áœþg‘%*8Ť0‰oÉ'³gJËokΉa6SË9SÇÔÔÌÙÂ@Û1Mo¼[ œ sFÁûr@ô˺Ê«rëßC/ƒR8¼É%-QÁÀŠíÕîs¿Úá{àà‚ÄE±N/Äņç‹5ç›%}±R°úl e¤’éÄD`kÌšl%wSÜäh/ÍCm3§¤¡ÑøÚø¸E´' Ú,¨=™1)&/Âh©x¦„`&K4#aX’ˆ%š„Eqm¿©à Sí?Ò.dš2“È9Ó~æŽmð¤ë»‰åv£I—þ0fðƒfÉü[¿“ÖÞâ·Îe a¡R/©^kóƒÌÕè#;|×UnËAQû¦ú$Z·iö{Wƒ½¢£ LÏu^·e1x[8õm¹é]±ŒFe*ËÔ(88Ï4Z»þ¶i?taoü •ùŒ˜,±ç™f)_ðK Zýxh0š»J ©º³ RÔüÊÏ'ï§[Ьú»¯ ؼ¶üª[_¾¯ 2fˆ¼_ïñv~ai¼µ¡&×]¾ïŽ6¦×Iðb|N÷4 Ê—õäv‰Âû*6vm¸¯áß„è*ª¿Ìq1»`<> stream xÚÕ]oÛFòÝ¿‚È=Dëý^RÀ=Ü¥iš>4¹Ä ¤} Å•L”"’Šã;Ü¿™¥,ÙJ6Q'H8;»œÝùžYê}"ßÿëÖGÃ7/’&áð× Ídn—k–Û<Ï“Î'«äßgÇÓïög¸°9wÙŠÿy¾ÉddÔsž‹C›kSÖ’Íüm67Ò¤Ï?›míi°¬+ß n›UµÞuÅPµ ¡VUí‡+ç]»<Ã¥Á’R\§¬Òæ–á?´Ä¾©–m¦˜äj:-ÛÌ1iÝ‘–n–íf³×íª­ëöºjÖ4¬«&ÀÐÒ³ÿ½Ú˜A·‰hß”û·~冫ÃNXØýmDmÛëqì¤X{xELc(6gÖL)t§˜ ¥77 »ð\?.¿ÐÀŒ™PEžòÈ-=þmtSEÿ(ýå.ZùÆ÷=Xn?eÎ8·ÊD)Æ ¡Ôíz^û¾&γiX†iã—ér‚tª‰–;ù¹>\Uý§¢y·‹ ¼_vÕ6¾Šînâºjßè|¿m›>ŽFŠ_úêƒ/'1“eL™l:áš\2-U Ýzrþ¡èÎëêò¼¤úúÊ÷-Þ¼IZò×Ä~)øŽÉ„ ÔÃÚ6`8Ôx88”…/Cué?aír†+–Eð+O£êÞ$«¦l»8…ÇÃËÁ8$žÆ"!¼Û­2ʤn·„ä? ꫲe‰s(½ª#pÛAÀ1&ÝÏö¨$‡g7é´AÔ.‹ƒMQÓ²ÀáP K°à~t÷@¿ òÁ²$n^ü>£"<ˆ;,ª‹¥Gƒý¾°òÎãÜhuq–1þß|&žžb3ú&®—P Vh8>'suPËʼn a.kOK‚„s/Õqv} á[+ÕJ¤Ï£ in€ê{}Et €è"Ù® ZÅUq‡ ƒëæà j4)ÜëŸäl¨éétCÖqC£CSÆñ¸*Òìû Ø|J?L½‰ ¼(C/ 8°aß?¥_:\_ù†°1Î;E0ÁGáj*Ç·Áß )¢ÛúàÌ!´ß/Xê\ Üà±T%äB,Æ!LÄP² 打ÀW\¿Ìl³¬þÜÔZQ³1uÁI¡éÃíšê}´4õ0oV®#”zBã!ŽCÃi“¥DâFQTW}€bÞ̺©„ v|îÛXøÛS!Z#8úÛ`ÞŽ"+LdȺo©ddž0«¶‰Ô”Ý÷»úCWH¹¼_àV„Ûø®ZÒ»Ø>Þö*'ý“®%8–ÿˆ;øD³Æ–u©uú2$\S”%ôðAÇÚÜÇÓ€ÄÐÔ;Ž$ î¿Æ®Qˆô ž–Œ'¦¸jÁèâq÷]¿_áOûd]S®ŠRSQT‹¯¸£‘»M&¾õ öÄÎæ™_èˆ1$§»S“Ð!ð|ü…ÝO÷ó‘)hm'dWdH»¿ÀWa¡qTêQ}Ðð„Ô9Å·`¨Ià5çg–u¸é™PEZ²LMqÁí$Ù†P±³Û¶¿Šœ‹Ey™-Äbqnõ4œc«•Ù ­ ²›?vµÿ•, ܲËÿ8ØIæ&T Þöyÿ»šÐ&~`ÛU%A`¥\. µ¸Ô‹¥Y”åÂOói8)¨l:¡ä’¹ñ3Ô±L,û"í®ûBÙ^..½Ÿ&¹:Ãx–O'—CÓ§äâŽä2§ºõ®p øóôq &úEˆd:9YÃ,?)§,þh*ñ¡0éý²óC]T‹×‘¬íÖOŽnèÆ'0÷ômÇ÷ endstream endobj 1152 0 obj << /Length 2882 /Filter /FlateDecode >> stream xÚÕ]sÛ¸ñÝ¿‚Í=”ž±pø ø¡·»ø’ó=$mì´Ih²8¦H…¤ì¸þ÷îb‰T˜»\¦áL‰¸–‹ýÂb±àÇ@0~øßÞšo^uÀá_,"&3$YIJ8˲ 5Á:øûî`øåÙÏ7g?¾P"È`XÆÁÍ:Ð1‹3$Z2gÁM¼ /ËÛÛÊ´ç •ª&`ç  øÑRèðmgÚ¿v8…/÷eaÎ’ÇB†R¸ùíì—›³gÂò#䣔%J«íÙ»<(`ì·€³(KƒG‹¹ fÀ?ÀUp}vd™³,? ù¸ãÍË?ù9_"cIª‘/ì÷<ÅtDÊû&NHÍ2ÐÏ31Ô³T æ³jþU×ST¨ˆ™í0®˜J“oç{r%§vS_c·¡.Ò¡*Åb™ çLê”tq]nË*G—‹uX•]OÐ*¯ ¸'KBãz›ú=Ñݾ5õ¬÷êª*M}.Ó°§Õ* m°õxŽo? hÚ @MÔõd®¼»QÂn¿B‡¸ïúfKp³;a_6uwÂHoº¾¬ïÐÄÁ´˜©žäWVâݾÝPiØt^Ž’$lêêé–0¨E|P÷ÖÐìy]v[ê²ÓDIŠE…óØî~Äh Ù9®l£^ÂhÍÊ”Võ”§nzêx²£®Qnw•Ù¢ž€º),gÊqt×V>>–Œ³”ñ7¨Ùç¬$<|¬@¤@¦#–==Í'Ò€iË­3E^Ñ @¿1‚né%ÚSX¬%hÍǽéú’~”TDðÌØa˜+k€¬Ù`«¡ÛF Wž‚´VÊ× a¾&Ì‘/<æH+~6¥ThDEÞ#]ogê‚ +4" _*ý³ïhpkº.¿3³F˜ò±WMo<ż§·<´’$4³Í{ë®ÄÞšP/ß^].@}ÀãSåü 6yG½+Ä_¼3C…êð½PÑTiP©ŸžÚ½÷éM[8†Ú­TÛ@Ë•-Rûö+Í.¾wŒŒUÊÒ4ûS1ò{îi±”Lh1ßž™“"&—ûÁ†ÕžAŒ^¥í¾ž—I+sËÅ’ÅqBâ–ëC«–:|fú Fð¿g]gšq­f=Në,cB¸-»Ìç2Lóè-äw]‚ô•i=£aɸpQÿòÁ› FV„˪"ˆ¶ í̪\—Æ5ýFƒðC^íÍ<¶Õ‹øœzÒ)‹’ñ†Œ"‹H°1ŸàbÉå2WËÛh¹ÒË¢Xš™ü=‚YÇ3ê$‚âSJ‰ È‹¢…\ƒ’ƒjŠÛt)–ËÂäÅòÖ˜y"½– S<™Q3J0•È)Í$#Í,èÄrªžþ.†·ð7ª@)‰NgT•HX*Õ”ªRpúÖ&˜v«ì̪5}•—-3ŸrO{W8utlI8¾„µóTç[ÌÇlûÕõaØêsB>>¡’·49ÊŽNš¤®lkvè…qDÕi¬ºpnÛ–Æ¡X·zìÅ,êÞïèI‹Ó’_DfŒz V´UrŸ—]cXüõx¶ôäi ¶ \>¢ÝU[:™ŠáåCôíOdrÃñ•tDü!æîfÄT>½üXNÄl±4Îü5ÎUílE‹‹s + i×54BçÄÎ;ëáèT[7H7,8¸iº¤;}ë¸Ä¡ûè&™‰†¡.(^ùç«49(ÑÆi-XÊõXjÑ3Œd9bŽl@c×ÚèñPÞÔŽùk(…E ¾\þGîZ…ô[}ùúÉç'±ÏObñpÛ :ž\ÀëÛ¦<±ÓvP`†žApBç×2_”-]»Œg£¦MX ¹Ê«ŠnŠE¸“5­e ·àššêî‘âUïÈT…Öαãén»~'¯T=Xªö‹ ìÀ8d}%E8$«w±ÝÎrtùl˜åKÀΫUSmÝ©YBa–TÙ>vŽÌ`-$iwу… ›•U ÂâÈFêØH±…TnÖ×xpè¾t®7Ö\ãÜ ²Ö ºÜ”>èáØ4'û£9=/^ô°&ÔÙÑ„v—tÆw ì'2²¼4²Ÿ>JØÜöv1!¼ÞÛe–qfÉòœÚpj«8æ™÷ƒ ÌhhC#b‚êµùä´žX”#Ñ­7Œþ‹ø1l%~gâîÍAò6N£#ŸR\øa¯ºCÆÝõ6°Ï8²ïú©p2J\–ãè½€#W-k{£cÙì$Â/4·ß å.ýC $«°÷ES#®½ß¹@Õº«mîÓd„h+â2,Yô²£ž°|(,çÂŽ›×5y X ‹Æ†pÖ<­­‹áÓ~Yb‰m s[hÛo3´¦\žæÓÊÀ:p)í  l—ϰm¡ƒ¶ÝCí‹W×ωÂÏW¯.OngnÖÇÈœÛãTʳðè<°Ð(-¼Ãw6û×D¹Ó>¶ehx ­‹}3 râÕþðå‡;y¡ˆNº5,ÇÊXÂ$0KEKúJâÁΖµ.oñ<™Ñч€šXs15ùD†§*zÒn“œÄyA!tj¶–éÝlä>þ#tÌx'ÃÄq[îÜYÙ\tåR.·½ãêš ÃHiCI^÷•ÈÁ³o9OV×Âù¥”L g ù+OÄŠÐ}(ǾŠm«kx ìð tâÁ™¯#TúzJ?ã²).ã•h”²Ëld4ÐÝuÖÉp=:±}4=|kƒâ¶>¨Ñtê$ª`M¢½¦üÇj8´v‰—•ÿ×mYå·Þ0GJÝXãþùËÍÙVYÓš endstream endobj 1069 0 obj << /Type /ObjStm /N 100 /First 981 /Length 1588 /Filter /FlateDecode >> stream xÚ½X[oTG ~ß_1å9ã{.U„ÄEi‘Z5"T¢E<ä²Ð´4‹6Aÿ}?{ %éÙ` ª‰ó±Çþ<öJ2B ”j Tæ@=«†CÎB ¹UH(¤ŠZC©¦i“iR`Ñ—”ž(´Dª‘Ðy¨PC¬B £˜¦‡ÑM£OYtõ¥éJ/©Gê UÓÁhN ËëkÙ,v4 W±6K7¼ãb:,ÏMu6$«nÀ†TÓá±’ú;`£J… uv»‡«JøÑ†éðZ/¦ƒÞM#CG 6FÓ-`œÈtR5] A[@BI’ê’Âx6]Ó˜®‡\ÊûàäÒXƒƒ•YTJ#dÑaåF&aå&6+÷d:¬Ü¹o›û0VÅtXehˆãP’æž2A²•°bù \ i>(s(–ä’˜ä°|Pn¡X>KË2Šåƒ°™bù –Šå[+•LcUÔD±–LcíUkÃt0Ö‹é`¬g@²2²êÍ2š†” ”% på¨G´,õ¨ôK‹5yÁ™cv‚)EÏ.£Æ!Õ î%rræ¯Ô»8“‚&Kò‚9Ç&Nf uÇìÌv!T@õ‚NNrR#÷¥zÁMb"'52Îd°Ô FÓä¤FFi—ê¤FÎ)vrR.'Ý)6rRƒzŠTÔ ŠßΜ ®£žê>pQ¼¤Ã¤i‡»ŒvÍÙIÑ­M|vÎèÀéö¾ú‰~ªuq³Ÿêú¥ýTï_ÕOÉ®ú)®Q§àÒjLô1‰G½Ša¢Õd¶¡^\_àeôЈŽw³ê|ïî£×ÁŸè£³à¼£ŒgÁ´£ŒgÁIËØ ®}Gςێ2ž×e< æù2žÅ–e< ¦e< N;Êx,cGÏ‚ÛLïc6Ä½Õ ÆÀÒš\07e'5KmNjanÊNjðhQš“¸rcRpº¡W¡ÎÅ ÆÙºœ(ꇘPU³Cò,U5†3t¸€GfgèUå…¢¨Š3„šêÉYS¸WFý㣤Zrf¯HâëŒuÃëmòÆÝô‹Ú¤Ì´IùŠ6É[¯ísÎ{¡] 㿼‘fKcÇté³ë÷´‘PŠÞ=ú­ßS2•úqÿü:OëÐè\Å>“Fýê•;<¬ÿ§#µEýÐyå86@‡Üïôc—aú' GÚvÞ­9ÁÍR¿ã‚ìÛ\¼ß‹meº¿·g¦û6ÍL‡ÓÏOëÿo~ÛlÞ|;Moß¾g'qµ~5]¬^nÞ‚pÓñÙùé3|ÎÌ#s3O‹e ¸<澗̓GlUœàŒSfv晣IÔêÜ  œ3³3ϸK”ꌆ´Œ+¢,=²×ehÌÎ> stream xÚµXKoÜ8¾ûWs°Q¤^¾%ñ$ð 2‰sÊÌAn±ÝBÔR[;ž_¿õ ÕRw;Éf±6lQd‰õäWU¼÷¤§¿înñúñ­×x!ü&R‹(½4×"Oò<÷:ã­½¿ÎBï–ßž½º9{ñFI/‡å(ñnÖ^œˆ$W^G"Nrï¦ô¾øWÕímmºó@eÊâ<¾„q$cÿsoºß{\ÔþÛ±*Íy…‰ŒüHŸÿsóçÙ7g÷g’ä‘Óö:©RÞj{öåŸÐ+aíO/:ϼG¢Üz0 ?ŒkïÓÙ^ä瞎ƒÔJäqœr‘0‹û3‘ÆJÁ~D Z…"¢×Hæ"šV^\oS諭q‹`ƃ,™y2y˜K´¤² TÖ‰QĦ|SÝXH)å§—h°¿š¦S1Flú÷Ÿ€8ÎüÏ»óXúe1~ÿ;ŒÃséÓ¬éÖm·5DÀ«·Oü×<˜h%¹â9ÛHÈÜ$•èXD2eQ”Xìá} â0ô_·Íß¡ÔV+™Í‚EæÄÿ<Ê|÷>´Lôˆ“m÷•g«†gûÔ[5Ïn¨JÐÒ`À]Àt$ýJˆ?­`³M1Ø Þ`U4<±ëZäð@шnSv¦ïq+Ó3=˜Íʵ±Ò¯êÊ4øéГºžWk°ˆ±¶ÇáfSá÷¹òù©ý‚_K³.Æzà9?…9[‡`Š–‰Æ¦&)f5¯ª¶a²Máv®Ó™’ö¡6Žc?˜Ý\”)Ê'^.Û­”D±ÿ/¾žƒ(† {tª.Õ²æ„ÀkpŒjÞ¦š–Ÿä$Tá7¦øJþ}²-™Œ< ‹hWŽñh`€"O]Œs 0Æš‰Á˜@(ªØÑ¢¹js‰&)èà JK&Õ'ãõÊà ª—æ~]õÚ5?9`PPlj_Tu!ÍÓM±¥èImØÎ?YD;¼»&AœIÿ]Áæ³ßó!Jí9çØÛ‰5xq¬ë'~»‹ºÂLù\–í¶`/¨Ifp†wx‚4ÄhQ¯Úz+Ì·b»¡Ví±â‚iàÙ{GÒ^›¶fûµM TOçb…"—°LñO °('{ SßŦ ÄÎܦ·Òñ9†Y†K\x@¬Z]?÷6¤/.Úu®ïËæ·åÖÅ ùm*óà|Cg¢êÄ—ñ–œÔîÓ<&€;ClxKÚÝ÷‘bʹ0Ú7ßÌjÌbk8Náâ8¥"„$>75ì–|³LN4t§Šei‡ óÆ y ?ÖMÉ¢|¸ùH™„fǽ{§¼?Ùó?ô¦^WèÀŠÉF¨8ÿ±mˆ%H7…äÓi‰úëõB+å×f8i‹Ý94+žr&þiý’_Q@üw+ ›ó¼“Rn!“=—?Vïx˽ËÇùéA€ ”J¥bPH¦ÖYïÛÁÁ§„Q6~aeQ³¨kÊÍ”’Ê%Þ3ìV„ÂYÀzFþËõð Ô"‚år–Í-ï¦|ÑvG`MJHIৈö›v¬!Û; 6‹¤Dê?VÍ]®sÁÃÇMµÂ76…6¨Mï`Ä%Ù«'€Q $šS¸e7›ªazpÑ«$â5%‡ÀÞ)E^:¸^ó3™IÜxyøõ¬~ƒ—þ½&,XF,¸‚aì­I´óúƒ»iÌÊaî×±S[³Úéä\­SL ö£þyÛ(Ï¡¢ GWýmå §o†Xéw<{ýá!¡êQAgøãŒB7Á"ßûqÇnh»WHb»æ©½R$±Š,Ô§d,¤…äm7ÆÐìú§IiœŠ’ ÔµYoÆÊeý@G! 'Š«ú¦(š@¤é.°NÕVRdqâH9-‚2iû׃åÑóÓ¤ï+*…p ->©HÑPš—(³ò™«(ˆ‘ÂæºÁž{ }BÆ@«¼qìö|9qã0ˆ OL3¶O̒Ϫv<ÜÒÆiºÚ,`2¼ÒÚ5C˜º)ÏÝà9jí'ûê:î$R+1.dÀ4´(&I].·S¹€4Çy°æ㣔N–¸`Eãž,Ö->¬[‡§Ó¹”Ø‚.9ÓˆÜó¦Ý·œøøödŽÍp 4¶8ïzq%T–Ò¼!ÿ!GyÌ*–<Œ¯Ô÷®~šÛ)å¾D&Ù¡ÚÖð¿¬7ß²,©³s("èÿɧXŠ%X‡A \†ò²¼Í.åå¥ü_|F"ÍäÿݧÀ&Ïþ+—ÜF¸K©csÉTB3¨]Îl—qèÿÁ _B½‚}ýþŠ_{°ctyp%Î- ¼2®H €!g7˜‰Oxª{ nïz¦`„YÛƒ]¡ëZQ³Ygï©i@òëO Âkþô«#8’":è1èVD’Øf¥n-Þ”ü-š·ö¯‹L×På3ŸžúÁPBZîÛ.x>%Õ¸¥«P£YöD>ewé¿©(ªÈ^`À/Q¢»t‰c[áZ¢]ÑÙ•0@Ç/̰zq[Ai‡}iÉ÷´rì Híûoã­iLWPù¤}+õ2ûã'èÆŒÅ&ÝD‰²¾¢™žgLƒW%Ob_…7¦ Ú&xH¸›B2ÊWHb¯^hŽ07•Ë-Oü ÉÌîHaéé†iÖÅïù5vŠš‰ùNÀqˆë ½Bñ½ßHT»DÝï•0c%ħ³ØñEìo‹ÝRrÃr=É1 ¡rîà»ÎÐ5}mSrêJç§'u§ýÐr_ ãÓ5V1@J¼o ÷–8>𣞗ÖG7Uš·©˜%&ÂðĦ:I¨—×TTf‰ÿ£‹ @ã…àPT5ª¨¡äãR¡^Üš¢acÀ E:<‡MKFú²êÜu(”žlqªAá‚éRE¦Æ 2ôƒz8uÛ¬ Ñ«l2œ¨Br®^^Ò¥ò¶j l;ƒ= Ð`¬Çr;é>zmˆÖ4+z |©ÿ®hFˆÄcÓe±“© VÌþI&ð>zÎ ÛÏËÛ)¥ÉŽ É=*`30Ì+]wí…ã¾XÛvÝá©ÒÍjìªÁöá¸dq£rÈ…TèE\{¨Ì#ÕÖ »Cc¾ ¼Ú·°úÊ $ó v‚X HÑËë=Ž"qòZ²ÿ\yy endstream endobj 1148 0 obj << /Type /XObject /Subtype /Image /Width 1195 /Height 609 /BitsPerComponent 8 /ColorSpace /DeviceRGB /Length 56470 /Filter /FlateDecode >> stream xÚìÝyXTuÿÿñû/àº~|S̵(7nMÅÔ0³BM¥²”Ûn£EE½UÌ\ŠÒÄ\"³BMÃ%Å E\Ødß”}ß÷UEÍß[>ù¹>Í™†}Ô×ãšË Ïœ9sΙ¡Ëggù<|Ï"}}ý)Ñ«W/kkk™L†ðDswwÿ—¨ííí±»ž\ÿR›‘‘‘——vÀ§¡¡AÅɟʘ™™åææbï|øå—_f/|ï½÷"""rrr–/_®ðÂ@+++\е,--y¦M:õÚµk,³³³©ûºuëÆžúüóÏCBBÄ$IIIß|ó e#»îê/55•JÐÌÌLÚ€úúúvvv¸0 «P—ñF³µµåxóæMzÖÑÑQ<>¸nÝ:¹$T|sçÎeóôìÙó§Ÿ~*))qss6l˜4 ©+±Û4\zzú%¶=¶gÏšMõrhö*¹9ÍÍÍiâÂ… [´VÊ–¦æ¶´ôíž2bÑ_y666Ò K–,ytdð½ô`ó¼üòË;wî0¹É… h²y^}õÕóçÏSR RJ3ÐÔÔ455¿S‹Òà_ê¡8~ü¸²åP'²ÙhâôAƒ±×¶h­”-MÍmiéÛ=elmmù§6zôèkM¨þÒÒÒèYj@6@üîý'¢“‹;Ÿ>òï»}Ž;öôéÓb¦49pà@ß¾}Ù<3gÎŒ§Ö^´h‘ÂµµL&ÃoÀ€Œ²ƒk@ÍÁnóÂ,[¶Œ`II =KÓµ´µÃbr¯%—°Ç;º÷øû ÞìÙ³¯^½*`jjj\\ÜêÕ«õôôØ…k×®ÍËË ž8q¢Â íííñË ±H¥vM‘€€ú×>ë8 ¨ì¤M`'ËÍÍ[ÌÉɉ`}}=ͰeË–G§kN6»žR">Âcs/[£Õt·O]]ݯ¾ú*&&† IKK ùôÓOù…ûöí+++svv8p 4ŒŒ¼¼¼ð+ ™¨zNê>þo{Ê=5—ìdücêÝ»wtt4 ÀÄÄDzöÁƒo¾ù&=µéÇ×SK¥ßàø-þ¾÷Kß¾}ÿýw1 þ¹sçLLLØ~ÛëØ§o¶( ‹1IRRÒŠ+Øñݺu[¿~}AAÁ•+WÆ/ÍÀ^½z988à7àI @²víZ…‘Ee4¨‰Š›À˜››Kï,ª°§Ä¤Ò¯@d«J«ÑŠd+)·4EÙ­l‹X'Š/Tÿh'óòòâ+©¥¥Ê0&&æÁƒ4ÃÌ™3é)«åkãÒËÔyD&ä¯\³^Wïѹzzz«W¯NHHà˜Ù$<<|úôéìM_|ñÅ£GVTTПýû÷—f ±±±&4Pù›½ (NnÐc< ¤ùÒxoJ_%­<ÕÈW@áÒÞÙ†Í@ë ¾V“O1µ²²â+ùÎ;ïD7¡ÝB±FÏÖ××wïÞýÑ?u)>£\ýÇ•ÐÄÿ~ú÷¹=zôøí·ßÄÌjâææ6jÔ(6ÏäÉ“©= 7lØ ðÂ@ ‹ÒÒRüöhxò,"â9œªw“‡‡›^RR"ÞUFî¨_Ï@6„¡%ðeš››«€¼àäŽ9R{ò§¤GÙñ?iZ1Õã!v-6À³qãF€ô¬ŸŸß£‚3è™YÞŠÇ)Ï+cMÆóy§N0»É–-[ø…T£4=99Yzä—]hkkÛÐЀßA€'"ÅÖk6é‡ÚÚZ¹Eñ|r)' ý,÷*ŠA¾X±æ” _š²#w¼å:”¿ Í ]yMÃøã¨”yÞ½{—fX¾|9MŸñ‹ÄÌòV?výq„_8}úô°°01srrâââ–.]Ê/ ܺuë7¼½½ÇŒ£ðÂ@üøàƒØØXZ™¯¿þš”cee… ž‚T_Ò£oêŒÈÎÛ* @JH~–é5å¤K{²P&“‰1uøða€uuu4ÃÏ?ÿühϼ3)%§²üÂh™ìMGuæÌ1I~~þÆõôôØuÖÖÖ4•àûï¿/m@}}};;;\ðD ô:>é ˆÕÆ–¦z•ø…{üU,J}âú·nû.áèèÈ7¡{÷îQM¨þâââèÙLœ8‘žúöû­©¹•íþ8pÄõ•+>üðCzk1IRR¿çÏ /¼ð믿VUUyzz²³R庻»ãw Ë°uÃ@ ;š……ß„éÓ§ó¤£gËË˵´´è©+Á1i¹7:èAu©÷øÂÀ¥K—&$$ð,h`jjÊV’ÒÏ××—2bPá…4gll,~Cº0U ¯"ŽÛÞÉHëpM Ò•×ülhhÐ××çé´uëV€2™Œfpuu¥é¯ ”žw£CÑ ÙóXñ iç‹XØäĉ|ŒøY³f¥§§S'Z[[+ìqšÎ6:?ùùŸr·giõ5€üœb$ªs  š7á×*ê]Õüä×Q--­Ë—/³¼~ýúƒh†/¾øâÑa–®¢FËÈ¿ÙÑoÿˆ·M'³õ:t(å§€EEEÙÙÙß~û-¿0ð›o¾)++£ž°±°°àHyEÏfee±§"㲤˜S$Ë)îÔ‡³Ûù¡Ã†óó9iUy–5ILLœ9s&ïYggç[·nÑŸ/¾ø¢ô;9räH…§€²Ô* ñ¨™²d3Kt{Øt§\ú)+J¾4úÙÃÃCîx$Qᶨ¸rPî€&[ e£T¨^š&Éd:::|[þøã€lDzãƒcMÞLÉ©T€¹Å]ðØúÓo=ÿ¾0pùòåyyy<Ë›xyy±—ä­·Þ¢O¶¢¢bÓ¦M / œ1c½¿Ëš†*’þ1¿gÏã;( ÕãÇ(<µEh ´4…·ý|⸸¸ðÒÕÕ bȆPðàÁ‡~øèÎ0ë6¨À¼’êÎ$¤å/]þ[óž={:88ˆXÑä÷ßç.[¶¬¨¨(++ëã?VxaàÆð+O+KKKAS¦L‰ˆˆ`˜““CÏVWWSÒS|ÃT`~i×<üƒ£L'¾ËÖüøñ—/_°²²’ŠoÕªUìÂ@}}ýíÛ·×ÕÕùûû¿þúëÒ |á…œñ­€§5ÏŸï¿ÿžàÍ›7éÙ“'OÒô¾ýú'gW6€e5]õ8èèÔ¯ÿß—ø-^¼8##ƒ ¹qãFLLÌûï¿Ïf2dˆ»»;eà‘#G¨ø¤hbbŽïÛ<{ö¬4/^¼8zôh6Ï;3˜˜xëÖ­­[·*¼0‚±´´_3Ц¦¦¼V.\Èe ;>¨­­•˜ßÎXS_UÓÐÑz—`VamÎqWÏW â·v‰ŠŠ*•عs'¿0pÕªU•••………sçÎUxa UvCC¾ljºvíÚ &æææâômÛ¶±é4öRKÉd21U<ÈðÎ;l÷Òô7ßšŸQÖþx«AÖ‘V mTzþo7nÕÕëÆúwÍš5yyyr ˜žž¾bÅ ~a௿þzïÞ½…º¸¸à+ f²HO˜0A.Ùô.À€€Z·'«Cy¡tïÞ=¬ Õ_\\=ÛØØøÎ;ïÐSë7m︬®½Ó¶`ZÞà¨äO>·äCEÐî’ ŒŠŠ233ã^ºtéþýûNNNT|Ò 7ní^ü:<ѸgÏ éб°°àmòþûïóÌÏϧg µ´´è©KþÑ€5uíüh¯LÍ}´¥În^#ÿ¾èoüøñAAA%nnnÆ ãgfggß¾}{ãÆ:::Ò ´´´Ä…­À€€€mMjkk»põ4ç@¤úÄû–üðÃ<kjjh†?ÿüóÑí._—^ÖÑx«ýí€ÉÙIY[·ïêað÷E‹-JKK“f íC===> àÍ›7‹‹‹g̘!m@Úóvvv¸0 E¨!žÄ¤væ=¢¥¥åããÃ0::úA“O?ý”žš¿xE'`íí»íò¸uûn`bfyèõŒKVð3Búé§b‰ÔÔTÊC~Ýßüñ×_ùûûK3ÐÐÐ066¿ÝÀŽfmmÍKdÔ¨Q¡¡¡,3226ݦwïÞî sìLç`]}[µõ€´h?¸{…Œk"ÛoÆ ;þ¼4'NœÈÌÍÍ¥]êàà ½0P__Ÿv5~ÁàÙ°víÚ QL•””¨€µµµ×š([8-ŠhnnÎNo¤bxîôôtZý)]1ZÂñãÇ•½„fc«Gó¨^ÍaddÄ3dåÊ•<+**èY???𮫫›VÚ‰ØØ–Gç í Ú'¿îqìÓ·?Û{3f̈-’8qâ„ÍàèèÈö9µžÜ…,ž…ô£¶’ž7hÐ J*uPõ¡·… Ò¢¤Ë§…ðʱ•aoA¯U¸bÒ—HixRtˆkëææÆðÞ½{4%!MÿÈü“Î ÀÛ ­~trƤ–†Çæ.þrVÓ0zzzß~ûmvv¶\²K}||ÒÒÒRSSSRR’’’¾þúkñ þ;Ï‚ãÇ‹aÅòd‡ükEò4S¸p…Cò”{­X‘ô³´’l Bþì1.¡½½=ߢ޽{‡6¡ú£<¡gëêê^{í5zÊîW‡NÀzzܹ×ÒG—àõ”’kÉ%Þ±ïLþ{ˆ7Þx£PpêÔ)šøâ‹/^¹rÅ×××ÛÛûâÅ‹žžžo½õ–xGPü§žz%%%<š.\(>ÅÆ|çgT¶.©Ëøür'”ò—лÈÝ;T<œG?‹'‹ÒÏÊVøáx  ©©)ßÒÙ³gó,**¢g“““ÙSQé€ wî5ÜmÉ£K0:¹82©øëïíhw 8P ÀeË–ÑÄ Èàÿûÿï|ŒÏ~‚¥4¦ 7¨ä¹×¢äÇ•Ý1†¿JîÝy*|!_+*Á':e2™xÚï¿ÿΰ¾¾žfغu+MýúxÊœ. À;wïßiTï¡8wá£Öûßÿþ' õ M §V¬þ® ðn£Z ÀÁFF?vìXÁcTÓ,ñ|||ÄüøãùÎ755Å à©—žžÞÒ1Z€Ê2Maë‰/T8Qúª'=---yƒ¼ûî»!!!,Ùí(+**¨ é©3ƒº6ï=PùД<çA»K[[;33“ ­­-M|ï½÷Äìׯßùöööø¯<õø¹” Ïÿlcò9)Ó¶)ÇŠû”õÝS€âhtß}÷Àššš‡O íÓ·ÿõÔ’.À{÷•>4'¿Ùøí±iÓ¦å ØU–ôÅððáÃâÍWSSSñ_xêñ\¢:.Õ$®Ã³€áááâæS•°ŒŒŒ|ÐdÞ¼y4ý³¹‹4$ï+zhT¾1áјï¿üò ¯¿ŒŒ í¦á!<==Å\¼x1ß󆆆øO Û1©áY @vj"3lذ&€ll ™LöÒK/ÑSû¸iJ>øëÁ?€¡19l(@Úy8p€¦Œ;6((H ÀáÇóommÿÀ³`Ïž=€ê_`øL ±±1oùóçó,//§gi:MXl®F §i¸{ÿ ÚcC‡Í°;½¬ZµJ @777---¾óÅAFžbê4ýó˜:‘ælé]@ùƒªoól`nn®xþçáÇyÞ»wfX³fÍ£»SN6»–R¢aøhý50g}2‡µ^®ÀÀÀ€&:99‰øí·ßò=¯¯¯ßÐЀÿÀ3¢ÙFã²%­¸ (a§5*[>¡—‹ó<õèèèȤW¯^ÁÁÁ,“’’èÙºººqãÆÑS¶Ûì50ÿÒÈìÝ·?í±³gÏòú£ŸiÊ /¼@;V À)S¦ðoaaÿÀ³£Ù¡úä ±EÈã‘ÞEáÂ)úDØöÔðóúfΜÉ„~æXTTDÏfee±s½c5-)ÿ~hR:Ÿñ£Ý¥§§'þ[µjMœ={¶\²Á5*qüGž|$Š)éQ3^p|œˆ ? TáHµµµ|¼?¹gÛ€k×®ÕØ}ÞÐР££Ãä—_~áX__O3ìÚµ‹¦¿:òµèäb @¼ Ìò¯¾£=öñÇçFEwïÞ-àŽ;Ä“oe2þ#Ï^yÔSô3ý;™"îøñã¼ÎÄÖkQ>|<˜ »œP ñ6”^Øê”{;¢‡½¼¼øJjiiQ•°ŒŽŽ¦g?øàzjÑ—«5+5xˆÑcÇÓ£pæõIS(´Åœ3gßù¦¦¦øõ€g¹¥¨¡Ä«óZ€,Êxë5»ü6àCáÂÖÞà´ÓXYYñÕ311 nB‘BÙBÏ–——wïÞž:áæ«Q¨±Á_Lc;3666û±Ÿþ™¦Lž<9<<\ Àðogg‡ß}x6Ñ?ÍÍÍÙ||ä>i=Q¬±#kr'mîÙ³‡MWx¿—’’vÈO\8; ¨,HéYeWªžÞ‹oˆÂMèr†††¼AÖ¬Y𪪊ž=yò$MïÞà *©Xc°™G×à¿8°”ΰ;½lÙ²E @'''ñ¤¦¦â@ÅM;Ûeáâý^ž5±±±bƒœ:uŠ`XX؃&ìhìô³5'Õyta~hþ »ê3ë±äädí¦Aá===Å´¶¶æ{ž2¿éСìììxƒ 4ˆÂ„ ;%“Ɇ FOý¼ëO @µ]€ººz´Ç|||x²#}ƒŽŒŒpìØ±|çS âÛÊÔÔ”7Èüùóy–——Ó³ì©WG¼vØé|—`ÃÝ–<º"=C»«oß¾™KKKš¸lÙ21©ÙàŒ——¾ÐqÄñ߉ƒƒÀ7n°yŽ=ÊnCf}2Ç'(®«°þν–>:?—,[C;êÓO?zñ'à–-[øž×ÑÑihhÀ:eȸqãÄú£ jÂ0""¢°°ðÁƒ4óíÛ·—-[ÆWéêê­ùö‡ÎÀV?:9‡=:cöÏ?ÿÌxÌÛÛ›¦èëë_»vM @333¾ógΜ‰ï$´»ÒÒR …C` 6ÌÁÁß”P³Ü¼y“½033óÝwßýûŽ%¯ Ü{йÓ"®-N À‹W¢hçhkk'&&ò\³æÑ1AÚçrøüóÏó=ïèèˆo&´£††[[[iú½õÖ[/½ôûyòäÉ,C›$%%ÕÕÕ±…œ={öå—_fsN|÷=¯€èŽÀvytN®ß´v er†ÀÄÄ„ / …¶¸ÿ©Êñý€öâîîÞ«W/iú5ŠžÊËË£T¡<Ô××§‰ZZZ ,ð÷÷gÖ$''§±±‘-mýúõºººìh×Òk¯%vPÞjj·vytBN|÷ÑY›6mJ,::šígv8•àüùóùG0nÜ8|? ]ÄÆÆŠ·úä ~ùå—ü¢™¿øâ 6CïÞ½íììxR¹PÎðcUEEEsæÌasö0è¹kßÑŽÀö}thF&äk5 öGáÌð·ß~£)&L +à AƒøAÝo)´Åš•••4ý´µµ¿üòËÄÄÄ|%.^¼øúë¯óC„GeH"""âãã«««Ù[³9Çš¼yÁ/¬°#€{ÿt¦ðïÿ;M`nnNmllÄ<}ú´øqÐSø®@[ØÙÙ±ó9åL›6-444_ àgRÈ\¸p ¡¡ºá#888ôèуÍ9wUtBv{`‡<:.?Ÿ·˜6ùòåbêé=žv€ß}÷ÿ8 ñ]€Vóòò222’¦ß€\]] +,,”ÉdÅÅÅÊeeeÙØØ°ûÆ<÷ÜsK—.åH¢¢¢¨ïß¿OoJ‹Z¹r¥vÓ9zzÝ~ØöK°ã€}úö§m?zôhêcô3My饗âããÅ|ë­·ø‡bee…o,´E‡8º§§§gkk+–]ee% ·¿þú«¦¦†bPER¼|øá‡lQ”3;wîäHbbbÊÊÊØ $%%ñë ÿ=l¸Û9ßÖ`Ç?Ú=Ïy‡4 ’¨›*X´hM\¼x±€lDE†jß[h™Lfmm­pt¿… R—ñš+--½sçŽÜËïÝ»GIX ’»»ûÈ‘#Ù2ßxã WWW€ÑMè-nݺŖæáá1`À6çôþ›Þ‚ì¬Gûàª5ëÙ‰²)‚W^y…ñ' ½½=ÿhtttøi´êpppP8ă©©i@@@ác%%%|8?…( ËÊÊ Uúõ×_ù{}úé§W®\ax­IvvöÝ»w69¸iÓ&6T„ž^·¯¿µMÏ-S';óÑŽ8Ædæ –––¥¥e`` @—››Ë. ”Éd_~ù%[áž=_p8àȰëm @]½n´EnnnIíÚµ‹¦¼þúë)))b¾úê«ü#³µµÅ÷ 7nœ4ý öîÝ+æØÍ›7ïß¿ßÐÐPVVÆ'R†PNÁƒª««‹Uò÷÷ûí·Ùê >üرc,ã›P Éd2¶477·þýû³9çZ.LË**iJ°®}´"—®XK›0{öìDA=hâ©S§h'ód·…azõê…/6ˆ(¾øÙ•rf̘Áî·ÉPåÕ××+\ˆ\¸^¹reß¾}”{®®®~~~,ýΜ9“––&.°¶¶–³566Þ¸qCu?~ÜÐÐtpùòe€ M²³³o߾ͶnË–-ìZ9½nÝ6mù‰ú«Ë- @£¿ÊîçÉëïôéÓ4å…^`GyšššòÏÒÒ_oàÜÝÝyF‰† æææÆk«¤¤äÖ­[ÒRSnTaüÂ@굘˜±àªªªTÁÎ/UÑ€¹¹¹›6mbéJ‰gee• (((`§¡RiΚ5‹mÚÀAƒO»_,¢ ëÂGKÐçêu¶ÑÑÑ|Ó–.]J-,,xRFFF²Qúpñ "w´ˆëÙ³çO?ýT"¨¨¨`#­¼¼œ¿<)))44T\`ee%¥¢:‹¢ä¬­­¥|+QŽjhΜ9låûôé³sçN±©ŒheXºúûû󤘽7=61“B¬«êàÖí»i…ß|óMq»FŒA÷íÛǧPÊÎÎf×0RSê²Ùúõñ £µX—<š À˜”Bv#.ßÍ›7Ӕɓ'ÇýSŸ>}øêàà€o;À3‹ ÂÈÈHš~tvv.}¬¬¬ìVúM)..¾zõ*¹ÏÍͦ(\>å!»ùçñãÇ)FJåååügª°3gΰ ýýý•ÝU†°!àÙ ‰‰‰¥êÉÏÏÿöÛoÙöººº«V­Šÿ'Z,;š;a„¿Ç—Ÿø®pT~iug?š À#Îî´z/¿ü²¸ l„‹7Æ ¨©Å577ßy€gµ€™™™4ýôôô6oÞ,Ö“L&ã—ûÑUUUü)Z%$ 7???1ÜèY C>ºŸ¸ÀÊÊÊ;wî<||a ŸN…ȤfŒ‰‰‘[áÚÚZoooö^žžžôÖbKÖÕÕÑ ¼O¢`üðÃÙfR=íÝ»W¾öÏ :v8LÎܹsÓÓÓ¥¥&‡&ÒS|¶äää“'OR—ýùçŸÑÑÑ”|ˆêi©‰‹bwtÃj‘XtvvÎÏÏØtixx8-œ&ÒÑÛ‰YWSSÃoJ}J[§úh ÅãÈ‘#Ùö¾ùæ›îîîb¦¤¤TWW³8ݰaÃßCEèuû~ӹŲÎ|¨À¾ýcH;„¯6ýLS|ýŸÆŒÃ?\úÐñåx¦888ð âDãÇ¿|ùrÙcTjlÈ<hš¿äÚµkìlOæôéÓiiie±ÔäÐt 7>g^^žx°ïÈ‘#ì°`dd¤¸Àªª*…w¡¹{÷î7ÊT²··çûáóÏ? ÏœÌÌÌdwˤ`üøãÙlÚ÷牜"Y§=à¿0v"«¸ÂìN/Ë–-»&?bú+¾ÿÏú÷¿±±±4ýú÷ïïèè(Æ‘:£û14eaII ½ õÕ‡:¥¦:ܨ©"Ùå~W®\)((àO);4)ª¯¯ûT*##cÍš5üÂÀõë×ÇþSQQ;÷5<<œJ3ycÂyŸ@J³ÎyHÐfÃVZiÓ¦‰«ÊîôrèС(ÁÆù§¬¯¯_€gAii©………4ýºuëFÕ“ŸŸ/fQdd$…O‹–Oó+‹,JBvF¥ú(Ü***øbbbrrrÄC“uuuê÷)»q wS§Ne;dÈ!¯¡‹§wdKsrrâ~6g~xLÕY'<äðõqoÒ lÚ´‰¯äÙ³gYâEþÓ”)Søgmii‰_€§[CCƒ­­­ÂËýfΜÉn{"çÒ¥KüñÇåË—kkk›]>ÍCsÒüåJäææ>|866Výu¦™#""”-0**ª¥}š‘‘QÞ777~7Ô‰'^¸pAÌ@>b »0¨§×m­Í÷I™%hýàŸÅ.K ”»ÓË'Ÿ|! b·…a\\\ðëð£ó+¼ÜoôèÑTy¼}***nܸÁÿšššÊïèB¡âÔMz–ݘÅÙÙYYXåçç³y\]]› 7š™Ö™fP¶@Ö§/^T§Oe2¯°\=?ýôQKKËÒÒòêÕ«â UÄ .\Èvfß~/þqà8ZG?XþºûûÅ£¿ÒÄü1\°wï^þ‰ëèèЮÀoÀS)66vܸqÒôëÙ³çþýûÅäa7fù믿nß¾M%ȧSA°;º=z4;;[nù4åĉìÆ,4§¸Àªªª;wîÐbù”ÂÂB___vGeáFé)v¹Ÿ¿¿?½„¿¼²²RaŸÒœ¡¡¡Êú”J-((ˆæ¡9Ïž=[®6ª<>|÷îÝ7mÚ$w_MZ7va íäñãdz9_÷¦ë9ŸôG™ÖqGhþñ£Sy/^Ìׇ*•r•&úùù… æÌ™Ã?wSSSüR<}JKK­¬¬¤é§­­½råJŠ—ŠÇd2Ycc£øZ*A 7>CQQµk¨sçÎQˆÑ<ô'ýÌGl§yøü”iâYháôüÙ¬¬, 1i¸ÑôW^j4 ½»Üõ)ý•?EáÃû4==]Ú¿ìÙ#GŽ$$$ThiŨ7+TŠˆˆxçwØ®>|8-GlÀ¸¸8¶7È™3gúõëÇæüàCóèÊ´Ž{ô0xt¢³³3_™ü‘gúO†††üÓ···Ç¯ÀÓ¤¡¡ÁÎÎŽÁ(ç½÷Þ£RKʨ\¸ååå±p#çÏŸg?HKMáY( éíøœ”cüÐaJVj4QZj|ôyÞ§b¸•••]½z••#Uýõ¡péŸþDùüUUUbðRxŠ›©““Ϩ©S§úøøˆƒ,ÐÊߺu‹íù-[¶° )´—­ú:.­85÷F»?Nžõ¦·èÓ§¸lhû5kÖ„NŸ>-~rssñ ðÔðòòøp¯¾úª»»»ô˜Z³ Tn KMÙè~ ½½©xü.44”]ÈJþ*.P®ÔäÈ…õ)?"éêêÊ~ðöö.((ƒ·¾¾^Í”***úá‡ø…‹/ û‹BøîÝ»›Ž½~ùå—l·÷0èù뮩9•íûX¶j-œŠO\v§Úö`»- cdd„_€§Cjjª™™™Â!vìØQ)(..–;¦¦;ñ’úˆ/úÈIO"UÞšRQ\¿&ôŸ¨úФˆš‹:‘¿0%%ÅÙÙ™ÒÏÍÍ-33S\ÉfƒWº™R´“-ZÄ/ ¤-/ ¤9'MšÄæ9jŒË¯”œÊözÐi±â»ïÛ·¦¼øâ‹Aÿ4jÔ(þMX¾|y³c&€æ³±±ù—"K–,ÉÊÊ’«ê…'NHïè¢Lmmí¥K—¨­”eÑùóç[toÉ{÷îÉÕ™(//OÍÑýx¸Õ×׋ᖖ–&.Pz© <¸uëV¥J”«&&&üNªNNNbRWTT°¥Ñž0`›óý鿾ד³+ÚøŒHbG!CCCù›ZZZÒÄÏ?ÿ£LÍÇ¡ãgYfŠ §·£‰[¶lëï·ß~¿´£²ÕSPP æx kpøðá쇃R¼ÜTOii)J•ZVV–8•šŠ!(ܨ¼øÌT‘<Üø15 q·nÝRvcªqÍåú”&­j`` …ŸÊ‘š”ëSŠP>Oqq±¯¯¯Ø§ô^´ál U3µŸ™ÖA.xå6S¡;wò -,,._¾,–Zrr2¿0æìÑ£»0ðóy‹ƒ£ÓãÒËš}Мô’yóæñeRØjiiÑD77·Ëzwþ­011Én!ÚüfhxΟ?Ÿý¶mÛ6Ê¢›jËÍͽpá‚\©ÕÔÔ¨y‡¹p£åP¸Q©Qa5[jÒp£äTÖ§Í–šê>¥¶¥VbÉŽ ž8q"))IÜjÊ4eÁ+·™ wãÚµkù…ÖÖÖÿ”™™É/ \µjË7]½nk¿Ý›V¦úѧoš™Ö™/mûöílœG¿zñÅù·bݺuÙ-Çïe €ÁÁÁß}÷û+õE³­T·L‹Ö„*L|; 7¹R£zRÿ³û÷ïߺu‹¿œååå•––¦f©©Ó§€ááá- ^6¢½ê]?mÚ4ö) `cüùŽ;&žÿéëë›Ý*h@Í@ò믿²CK–––•••U­ræÌé]Tˆ‹‹£ù•-íÚµkW®\áç@ªƒ¢/==]ÙUÜqTY¸Qßñ—߸q£¬¬Œÿ•ÒµÙC“Ò>U½Ïž=kddÄ>š·ß~›þ.ˆ‰‰ágZúùù³9Ç¿5ñÌÅàë©¥r5ßn¦g§L™".¤wïÞ4ÑÁÁÁ[À“~ýúe·@ó0$$ä÷ßî¹çØý!Ù¸–¢…°³.› 7*5v¥žŠd^¿~½Ù¢c—ûÑ«”-ðèÑ£ê÷é½{÷ÂÂÂÜÝÝÛ±OsrršÝÛ·o×××g÷h;w.µžXpÉÉÉuuulŽŽŽìÂ@òÙÜE‘i×RJøcôëãiú† økÙ‘¾^xÁëŸÆŒ#~%²Û  ùHŽ9ÂpܸqâÑ.õÑ¿ÿù‘‘‘ÒÓ#©˜øY®^½*wLíöíÛ2™ŒO‰ŠŠbwtqrrR6Ô;+5vŽuaa¡²uã÷oawtQ±‹RSS©­hNOOÏfûTáfÊác¦¥¥©³óòòøQ¹îÝ»¯_¿>ìŸho° Ö­[÷÷…ºz˾ú.4&7:¹„þÔÒÖ¦‰´·ù«.\HSfÍšuIpîÜ9örÆÙÙ9»Ínݺ…_4 ÀÐÐPj(v– ±±qVVVMM¬åù ð<ÜX©íß¿Ÿ¦»»»‰/á—û=xð€e S^^ÎGšðððê—½½©¸@v'RzSŠ>1??ŸÞšæ§Õ •‘†½ÝÙ³gYÙEDDˆ ¤]Q__O•ʧDGG³>¥wÏÌÌT¸·©4½¼¼Øú{{{ÓòùËÅE)DùÎ;ï°Ojذaê˜HÙûÑG±9{÷í¿c÷!z°W‰/¡¿ÒÄíÛ·_lذôôôRRRÚ€¹¹¹ÊîÚ š€” çÏŸ4h=«¯¯ïïïO ÓŠ¼yó&-˜£p‹‹‹c¥vâÄ J ¹R“Æ¥™ø¾<ÜÈÕ«W©ù15z‹   v¿P†ŠO®ìîܹ#–,­P 7z;^š¾¾¾¥¥¥b©‰}J(ö)¿ã(•#ýUÜ„ÈÈH>ú<Õ´¸ÕìN¤r›©‹‹‹¡¡!û¼Þ}÷]OOÏPE"ÍÃÞ‘ö[PWWþ\°`Ÿ“^Ȇ}¤õ¼  eòïÔ)S²Û í@ü®h~??¿·ß~›ÍcooOù#kªJ VUÒcjTjìì³;räŸgýúõlÐùóÿôüóÏóïÃÏ?ÿœÝ~p"(À€ìž!sçÎåc”SÔP¤T·JVV½EEEŸ¢¢Ô¤hNqiì°Ú©S§h±âtuÆŒ`ç—ò—PÁ™3gRoŠèëëûÕW_ùùùñ)¿ÿþ;û¬ÏýÓ€ø7aåʕ퀸 kÑ¿ÉÙÕd¥ÄéÓ§• ¹råÊèÑ£ù%ìÖš5­EAÄF‚Ø¿?½#åX‹ÖÿîÝ»rïN!CKsttLKKköå111ìr?e«—™™Én\sãÆ uÖ§  àäÉ“´Xe ¤ÕkÑfRßQŸ6»ËËË7lØ ££CÊsÏ=·dÉú˜‚•˜={6Íö¿ÿýÏ]@)~ èCÉîêK€ŽËo,ù÷ؽ{S@) À¨¨¨èèèO?ý”_xûöíºººš6 ÎbWÌÑû&%%µhýÙ]Ä¢¤Æaw†¡’-))Qøªœœ'''>xŸ¸2ì G¦²²òâÅ‹ì:>ÕáF¥ÆnqCoššªlKYíÒfÆÅÅ©Þ.z/zGZÚÑ£GÕß,îÈK/½ôË/¿( @v¸pÇŽg‹ß³gÿôë×/»c¨ÙÑÐqrssåð¹çž;r䈊$?þø#¿$– VXë\»v ¡"Ü”aòE•••ñpóòò¯>£ñðð`OùûûSâñWñ³°/ùt*Þ§Òpã¥F3PßÑš‹u§‰Ø§ü.£*6“”ÁnG£¬Oòööæ@˜˜˜œ8q"H@¥éݺuskB{€1sæLþéöÙg€EEEøuèrTÔqbRÜýöÛo*zÍÙÙ™2À. dÝt« ¨Î(I†›:hè%|i999l|@ .ZmzŠ—Ú¹sç Å·¾{÷®ÜÒhЏ9¼OOžœÍoccSßäVÛP^±Kù(ÖZtG…á–ÀqrrJKK“+5e7f¡éâæPŸRC±„¤pã¥FûA\ Õ™Â!”õ)ÛÌêêjZ&[IÊCŠD>'mŽôê9¹Í”***Z·n¿0pùòå,ówîÜÉXYY¹iÓ&þ¡S ¦¤¤t\RÆâw @444˜™™ýëŸ6lØ "¯_¿NO}öÙglæqãÆ¥¦¦R\´ñP ¡Lc—éQ¾eff¶hCØ…ráFË‘;¦Öìè~ ÍCÙ"íSv)-\,5é‘Äõ)%!…¡¸îܹ£¢OÅÍT(99yÚ´iìÓ8p ;k—öImpæÌ™©S§ò{Ê”)Ù©ªª ¿hšÃÒÒR®—.]ª"cšìÝ»·G4³ŽŽ ;vVÛfÔžìŠ9ww÷òòòm;ñRÙ’[1ð#9õiQQ‘¸@¥& 7šY\“£G&&&Š ¤¸Sç„IÕ›Éxxx±OÓÔÔ”^O»ôìÙ³€/¼ðÿ¬þùç @  i¬¬¬äpîܹª066688øÍ7ßdó›™™Éd²ÆÆF1šZ§¢¢‚_1çïïߊ oß¾-],u%­¶úˡ⣠T¶’´¨–Þ¸†RHEœ¶×f2wïޥ괷·§úsuuõôôr:thvCh&¹444ôððP€ñññ#FŒàw†ihh`‡Û.%%娱c”NÎÎÎ͆›vâ%_TUUU@@;°HA¤pˆ:^jäÒ¥K•••üå·oߦ¶â-((ûTÅ¥…ô,;©•æW¶™ôFlu6“f ÙØH…âBhõøjÜ»w>—‹/^¸pA.Ì?ß•+W"žYŽŽŽâDWWwß¾}ª$$$,]º”½ÄØØ855• l{ÖÔÔðÑ”…› r«Q\\̆¤ŠC½³cj|À>Š,qøå~ìÄKiŸÒŸÒpã¥F{•æ”ÆZKû”&ÒSl僃ƒé%i=©¹¼¼¼(`¥xøðañÃussC<ËÂÃÃùˆrÜêÕ«› @âääôòË/³;Ã888ÐÒ(LÄbjµÊÊJ*ÖG<ÜÔ$néééüŽ£´ÚYYY¬ã说âûJoÌB…u÷î]±OiÉõ©Xj”™4x$Q3BYŸÊm&ý@eÓišM§„U¤²\¾|9ÿL ²;@ÃåææÊ O¦N¦:©†fΜÉï C‹b§bÞnyyy|0>z»m­«QæÖ­[ì?¦&“Éø â•RnâFQññAý(»ø˜ï4]\éè~ ½½Ÿ-##ƒõ)­^l¶ž4‘žâ³Ñ ð8¥Ÿ)Ïýüü|š( @þΚ5«°¨¨¿P®¡¡ÁÂÂB®‡îëë«:“šìÞ½›ÝFGGÇÖÖ––FC¶KÒÛ±;ºœ­úôEZªN6³Šä}ªÎkØíh¤}*^îwïÞ=Ú·ÁÁÁAAA- Àž={òoË–-€êý !“ÉLMMåpĈTê`ZZZhhè[o½ÅljøøäÉvqíÚ5>ˆCII‰¸òÔ T|¬Ô<<<èYñ…ìŽ.|ÊÍ›7ù](¯âe×!R¯ÑÖɧÛVìS7®¡Ø¤îã7~á/§EñSRÿúë¯ââbÚ“!!!- @+++ñ³£vBýåååáwà emm-×€ººº›7oV'Ó›Pݰ×ZZZRW²3BÚCMMÍÕ«WY¸y{{³p£7e¥æì윙™)Î/žQÉ:‘2?[PPÀÂíСCÑÑÑüH;‰”•Zdd$*‚/P}úPn¨€$33“"…5H?°{„ʃk z 6¶;Å•—XjÍÞäSa¸±3HÙ)¦b©É§“’k[±Oùè󴣯)ý——ÅðìÙ³¬éLLLT ‡‡ÇçŸ.úÀ}öÙgS´—ðËðÉd–––Ò¸Xºt©š˜ÕäçŸæg„šššÆÆÆò l»Û·o—••‰ST—š4Ü(ùkiQÞÞÞ´Eâi5HEÈ_HÛîììL H5ÍF dÄÈ7oÞŒ‰‰¹ví Àààà¹s粦c7bU€¶¶¶ÿ÷ÿ'ýtFåææ–ÝYZ:6h2¹"ÈÈ‘#ÏŸ?¯fR&г«V­ÒÓÓc/Ÿ9sfnnn;f ———§ìŽ.ÊP‚•””([ ­|K÷½»¸êh…qJIHM9ÌpëÖ­Ý»wg»èÝwßõôôTx à¾}ûFŒ!M?ªì]»vew"úÕomx"”––Ž7Nzg˜mÛ¶©€9Mâââ,XÀ¯.´¶¶f#²+òÚ+Ù]ØqFÕh~Ê+š?11QÙÝÝÝ¥wtQ†z–:Žæ—.‡Ý†”ÍFÛK»%>>žv @GGÇádzÝ2xðàƒ*¼ ÌéÓ§ÅaþÄß­¬¬hQYlP üv<•lmm¥éñþûïGFF6€¢ˆˆˆY³f±—ëèèÐbÙmBÅS1ÛB¼#¨Š øY¨ªäN"ÑÖ±«›êÞ‹]î'€â]Ci3ËËË“’’X^¾|ù£>b{£{÷îß|ó ¿ Œ\.[¶ì¹çž“~S¦LéœáäÔÖÖâ—à)Fabhh( =zô8pà€ŠTÈÇLJʅ-¡W¯^ööö J÷îÝ»Ûfõõõ´ªìŽ.çÏŸ¿yó¦¸EEEìÆ¡Ô‰´Úâ Ùå~¬FùÄ’’6x»šOz#PZ>½ ›ÂíÖ­[üµâÌ4Þ.99™`TTÔÊ•+uuuÙå~–––W®\ïÊpÇŽ/¾ø¢4ý @’ݨÙñëðÔSvgsss ¹lÖéÓ§MLLØ(-ùhí’ÕÕÕl@nwîÜ©©©¹té/56ž;O?¹1#Øýaø ´Eìß‘#Gèg6-“"ôôô¤äó‹—û±k ©þRRRXîܹ³OŸ>lÃÇïææ&Þ”à‰'øþééémذ!»‹TVVâàÙA¥&½3 U‰]‹9tèпÿýož ìÚÀ¶g`aa!Ò¼xñ¢XjrÇéä°{ò‹Ôhl!”lkì$RvNaKÒEEE)‚ .L˜0mìË/¿¼wï^ñ. <}||¾øâ …C<ÌŸ?¿“/÷•––âûð¬IMM•Þ†÷çííÑrööö}ûöåcÇÛÚÚ²[ÄP‚5¶Y||< •`~~¾8Þì},YŠò—ð‹ìn3”oâÅÈ•••Iʺ9sæð[è¬[·ŽßF.¿þúk~;P‘‰‰‰¯¯ovס˜Åm?žYvvvÒCÚÚÚË—/OHHHo¹½{÷¾þúëü1–––Tš›ŽÄµ±kkkÅ¿¶h¸@iR Q©‰Ë#ÖÕÕ%''' ¨éØå~döìÙþþþâ]@yRQk:úsÉ’%4%F;;;…—û5ŠÖ*[”––¢þ@¡ððp…7‡;v¬³³srìØ±cäÈ‘âå”m9 XWWÄîèrõêÕÛ·oó ¡Ÿi {ŠÞ¨¦¦Faúѯ ~üñGÞtÓ¦Móõõ½®íÑ£GKw”Á®]»²5»¾Õ ‚›ÃÉ“'Sµ%9òþûïóÒ{åææ²¼ß*åååü0ßµk×îܹC²ƒƒ4žåsÒ[ð ¢ÌÈȈ>|xøðálÅLVÄÛÛ{Ö¬YÒ£­­meeÕå—ûqÊŽŠÈQvsvÌ«W¯&µ½ÜÚÚúå—_æË¤÷rttlhhhufee?~üÇègš"ÎÀÓ~(..ŽxyyMŸ>­I÷îÝmll¢”X¶l¿ªQ4eÊ”ÀÀÀlqãÆ |‡ E”ÝF[[{éÒ¥aaa‰mãää4cÆ Z@ÐÊÊ*<<œ]!ØRwïÞŽŽ>tèPdd$ žøã[T]]MóD>üå—_²¦ÓÒÒš7oÞåË—#Ù¹s§¡¡¡tW :” %¯9hñÕ€Vhhh°··WxF(uÓ×_M=•Ð6´„-[¶Œ1‚/ÙÈȈޔ]Âö  Ä+àhCâããÃÛ·oïÝ»7{ÇqãÆ}úðwÑÑÑ¡ˆstt,))‘K¿»wïR? víÚ5pà@öBccãC‡*B]9yòd…—û­[·Ns†xàŠŠŠîÝ»‡o#t*&ê)…ؽ{÷µk×RUÅ´+—%K– 2D|¯qãÆåææÒú¹"›nâĉ§OŸ¾¢Èþýû‡*]aƒ]»vi`úåååÕÖÖâËšÀÝÝ]ÙµdêÔ©NNNÑíŠàìÙ³ý[ºt){»ìÞ½ÛOWW×éÓ§+ãÞÊÊJ/÷#7nܵÐÊîJF½mÛ¶ÐÐÐö @ŸÇ(3iй¹¹"çÏŸ_°`¿¨hÊ”)˜~ÅÅÅwîÜÁ÷ 4Vjjª¥¥¥² ÔÕÕýÏþsêÔ©¨¶Ù¸q# @ïǨãhÊš5k¼%¶nÝÚ¿éÊ :ÔÙÙYÓ¯¨¨£<À“¢´´ÔÚÚZGGGY <ø›o¾¹|ùrd«|ÿý÷,½c¸zõj/ÁÆŒ£pˆ‡-[¶h`ú•”” ýàÿ³w'`Q•ûÇ»~ÿÊ%[4s)Úi±(-ÍÔ¨\È,±LÉÔpÇÅÜÈ ×ÈwÜqEwpEEDEpTvaÓ÷ÿÀ±óÎ;sfÙàû¹îË Ï<çÌáÌçvfžP¥¦¦:;;ë›,Tš(æ›o¾Y¹råɇ$ÀüqϿڵk'– >\ú«‡‡G—.]ï´oß¾aaa&8Égvv6ç €JM­V»»»·lÙò1ý^|ñÅ!C†ìÞ½;Ð8ãÇ—  ÷¿¤‹¹;::Нýõ×gžyF÷^Ú¶m{àÀS«~‰‰‰|Ö@ëäädàA¡]»vÿüóŸŸ_€AãÆ“ à®Ið‡~xõÕWu7Û¸qcQBMª÷]½z5999??Ÿ@¦R©ììì ÔÀ5jˆ&8yòäýû÷û+‘ àεnÝZqSuêÔ5j”é\âA´àÛ·oónOÕJBB‚‹‹‹……ÅcµmÛVÔ=­&(@///=züßÿýŸîº={öüðÑ#GîÚµëĉcÇŽKºuë6|øðºuë*öôô4…×ûDïKOO/((àIjjª›››µµõcÅyã7¤9?Ÿ}öYÝ[ëÕ«7þüG^úÒÒÒ˜ÚŠm‚îîî¶¶¶=$33³¡C‡>’ûݸqƒÒ%¦V«¥ébŠ}w¨Ð¾}û£GV@×»víZ|||rr²¨{ÙÙÙLã eËËËËÞÞ¾ví:ºÕÏÊÊÊ××—CUÉéÓ—ß~»û»ï¶‘.&(þtssã°@•,€-ZŒ2d ‡(€ € (€ € (€@P@@P@@ (€ € €épuuµ²²jÙ²¥»»;GP Jòòò²°°xLƒ¥¥¥XÈ‘@¨2|}}[¶lù˜â&1€£(€P©EEEÙÚÚ>f1,,,Œ#(€Pé$$$888(v½¬Þ}÷í7o²··åè T ©©©ÎÎÎæææºý®q£W.q¹~Ñ_D|!þª;F¬èèè(6‘@0e®®® 4Эuõê=çTý¼ºÿðâ­¬¬¸Z @Å34Éç‡ïynr»sªÄ9à½^ôGÅ[[[sµ@€Ša`’Ï&_\µtÖ͘ 2‰h‘Ÿ¶h¦ï¢\-P \é›ä³~½ç&%¨Ì³zé¬×_³P¬ŽŽŽ <(€eKß$ŸuêÔ1là…ð#ñW‚Ë/®3ë+]-ÂÜÜÜÙÙ™‹ ” “|ì×3üÔþø+!ب€Éãÿ}Sñ¢®®®\4P ÄÂÂÂlll”'ùì`tÜ;!öt':Âï!öŠW‹hР»»; ÀCIHH°··W¬~­Z6ß½}mBlè#LDÐÁ>?wÓwµ///A@€b¥¦¦:99)NòùúkîËç$Æ…šH‚OìþºÃú®ÁEôQ«Õ®®®uëÖUœäsÆôq‰WÃL0{v¬kÕ²¹¾«EDEEñÈ hR©TŠ“|>]§öHG‡kOݺnÊQ­]üÞ;o)Ö@{{{®(€ðŸ¢I>­¬¬«Ó þ½Îž>|ëZDeɲE3š4n¨xµGGG®(€ª-“|~ÝñËŸJTý43ÕyTýzÏ+^-ÂÅÅ…«E €jÅÐ$ŸŸ~¼wç†[×ÏTê\Œô9|ÈÓJ lР››ç ¨ò LòùÆë¯¬]9ÿöõ³U&çB}èmff¦ûÍZXXpµ@PUœäóùY.nß8[%s:p×._ë»h W‹@UŒI>Gýùëõ˜Ó·oœ«Ú9²ßóKëÖŠ5ÐÆÆ&,,Œ“PTv&ù<°Ï¹°£·oFVŸxy®iöÑŠGÃÎÎ.66–PTF&ùìdóUèÉwnFVϬ]µà×_Q<2ŽŽŽ\4PT"&ùü¬Õ'>Þª;ñçɬœë×W¾Z„³³3 @&Îà$Ÿ¯®[½()>ŠÈ¹>aìŸú®¡R©8£€ 24ÉgýçgϘ””p(&&:h؃¯È©(€LŠþI>ëŒñû͸3I ÑÄpÎGøÿÔã{­èììÌÙ(€L„¾I>ÍÌÌÙGñON¼HŒLzRܹsg_z© P˜“|~oûMX°/…Îø¤Þ¾’Ÿ§ÎÎJ9°ùý·)€€ÀTÄÆÆÚÙÙ)V¿Ö­Z=¼+åÖ%bdÒîÄäæd©³R.…ûÚü×þ #(€€À¤¦¦:::*NòÙô½··ªV§ÜºLŒONvÚÝŒÛ×¢ýý¶M:¸iÌ£(€€à‘S«Õ...z&ù¬·hÁÌ”Û1ÄøÜÍLÊLM¸uíŒÿîÙ‡6=¤r¢ SàîîÞ A…I>Ÿ®ã<~tâõ¨ÔÛWˆ‘ÉJ¿uÿ^AêíØàƒKŽxL8¼eP˜}“|Ü/îrxê+ÄÈd¦Åß»—Ÿ™–xÆ£Ÿç$ß­)€€À„……Y[[+ÎôòC×oÏ„O»KŒLFòõ‚üÜì̤¨`¯£^Sý¶O¡ S`h’ÏÏZ÷Û›–GŒMʵüyrßü»þ9¾Ó…(€9“|¾P¿Þ’EsÒ“¯ãSx}‡ôÛ·oDZê¿{Ö ï™@@` Lò9i‚Ó­øK:ã“™tÿþ½Ô;qgü7îu Ø3‡(€L¾I>ÍÍÌ~2àzldFÊubdîfܾ¯ànƨ`¯“ûœô™G@¦ÀÀ$ŸÝ¾ïr.<0#å12Yi‰yê¬Ô˜3ƒ,>µP˜“|¶iý鉣2Rnc“–Ÿ—“«Î¼~1 ôÈŠàƒn@@` Lòù~Ów·{nÌL'Æ'?/[T¿Ä«áÇÖ>¼<äÐR  0jµZñã~/Ô¯¿tñ¼ÌÔb|òÔY9ÙiIñÑç7‡ú®:}d%P˜ÝI>';MJŒËJK FFô¾û÷ï¥']»²3üØÚ°£î@@`jÜÝÝåZafVã·!ƒn^ÎJK$F&;+åþ½{w3’bΊ8±!âø:  0ýXÿ¹ÚqçŽf¥ß"Æ$;3ù^A~^NÖÕègTgü7Q@e)€/¾ðœ×ü¾‰±áwÓoƒIºW—«ÎH¼yÒã\à  ¨\°aƒç‚.ݹp@blÄÝŒ;D1ùy9y¹wïÜŒŠ>í}þ”'PTÒxÚwUð¡å…0.";óÑL~ÞÝ\ufÚ¸Ëû¢‚½Îm§ €J]CýÜC¯Ü± ì™#Ù™ID$/çîýû÷3ÓãÎûEŸö¾²“(€ªF ;º6Ôo힥¿Eú{fg&Wçä¨3îß¿'¾¸q9èbØÞ‹¡»)€€ ŠÀðcë#Nl<°vô©Ý‹ÕY)Õ0¹Ùé÷ïäåd%Æ…_ŽØ)|PTáxÆ_utëtßM“3’ãÕY©Õ$9Ùé÷îåçç©ïÄG_9{(æÌA  ¨ðlÀ–ÀÝó­—š“s7µÊç^A^^nvÚ¸¸¨cW"P@µ*€ç=‚­Ø1¿_LØ¡œ»iU5y9ùy9)7o\>u4ö¼PTÃxî”çÿÍûVý¸kÞÝŒ¤œìôªÑûþóŸûÙYÉñ±§¯EŸ¸zá8PTç)úNðÿsö­p¼}-²jT?éú9Ù·oD^¿xíbPP¥²+üøÆ]‹ŸÜž«Î¨¼ÉËͺÿ^~ž:%ñò͘à—OQP«^ÝuÚûÈÆ ¾›&''\ÎÍɬl¹{ÿ~AA~nzòõøØÐø+!@@@ÔW£E ÷ 9¸rçÂá‡×dg¥V–öwï^~A~^Vú­[×Î$Ä…SИx)bÿÅð}Ç·ÏÜîÚçjäñ¼Ü,Sν‚¼‚üÜì¬ä;7£n];›x5‚(€ €h|¼|ö`̹Ãѧ÷ì_=ÒoÓä”Ƽܻ¦–‚Âê—“£ÎH¹sçæùÛ×ÏQPKV¯DúÆž?î»~×¢A§÷¯ÈHIÌËÍ6…äçþçþýüÜì´¤kI Ñwâ/P(€°ô0.êxìùc'w/Üîú‹¨™)·òóÔ.¹÷ïß035!åVLrâ%  –a¼ííbàÕ þ§ö,òšgÿˆj`Îýû÷îäg¥ßJI¼,…@Pðú¥“7.]¿t*ÈÇMÔÀÐý+Ó“oäçT@Šª_ÞÝ̤”[…¥O3@ @ÔWƒŽ¬ùá»/?xï+¦— Þ¼"êÕ͘à}˼æõõSM‰=ëWŸ[N¹¯ðÒ~ê¬ÔÂ7|&\Ò €PõÀ)c›››‰åÏÔ­=dÀ%+€¢d%^=sëú¹¨S;}7MÚ6·wÄ‘uéÉñ…3s–Q ?ê—W4ÉçíØ¤„‹úC @å¸dÎèÚµž’nzòIóš¾yêÈÆÀÛ7Îß¹y!þòéàýËwÌïWô‚à1õÝ´{÷òK‘{â[È˽›v'.)>ºØP(€Pßg­[7«YóIyÀ³Ï<½vÙôÒ@ÑÂ’/¥ÜйtÚçèæ©ž³~MðbˆOFJüCV¿±óùy9iI× kñ¡P  žI`†9üôLÝÚò˜:µköëݵô0õvlÚ«iI×/‡ ðš»cAÿ}+†Ÿ=ªJN¸|ÿ~áˆÝ.ÈÏÍH¹yçfÔÇ@(€zgݸbzýzÏ>ñøÿ“†=õ¤ù«¯4ñ?´©L `zÊ͌Ԅ̴[7cBC®Ú»ì~<¼~¼(ƒ7/–®é ‘ûyYi‰Iñ…U®d¡P  Ë@ZÛü£wkÕ|J\÷éÚ®3þ*Ø•~[JzrüÕóÇC¬5P”Á}+†ï]št#ZT¿»wîÄ_¸}#²T¡  wÀá¿õ~¦ny¼èƒ¯½ÒÄsãÂ2*€Ê¹rΫØÕ$QýÄvÊ"@@¤Àb/¿Ù}Ö õŸ{âñÇ5>Xë‹¶-ƒŽy•²ŽØU±‘2 (7¾¾¾âµµµµ˜°fÍZÔ©Ó¤aÃ79€)pttÕ,66ÖÔ `TÈ® £[>nÖTsvÐÂw„Ö­3ì·¾Ïø–´&Na¼v¶ CÊœ¥¥åc()ÑSSSMªJ—˜0fHÚµÿwfñ¬¯cÇ}hµbÉŒ’Àâ"v5ñÚ™² (;jµÚÞÞžßØ¥× A___S+€Ã}NŸØÖ£[§®]m ò òsòr³Ä¿ÿê°u£ÛCÀbSX¯F”m(€@Y±µµåw5@Y177 4µx)bZÒÕÜÜ̔䘔¤KRÒÓ®ååÝuqùû¥& ]gM2®Æ›¢^¶¡eB÷µ¿§¼ü^ÇÞmûOé0|!„B1œl‡X4o÷ÿž¨¡ù„ªnݺaaa\#Om[´`–˜Ÿ›rçbÒí ©I1i)qrrÔi“&MªYó©ÚµkñÛÅÈ@CЈˆ]Mˆ +óPRrssÓüMUã©Z-»;ö_H!„B*?LÞÜøÝ–šÏ¬,,,ÔjuEÀ !»fÏžñþ{ozo™¯X³³RDÝ“ `FúÌŒx)yyÙÒëff5žzêÉîݺ„ž<¬XIaŒ -óPÒHHHhР|fþ¿'jØŽ]5xå)B!„bL~½ùëÞ‹Úw›Ýõ5}]ˆ%MÞûT³–ù3ÿb  :;sýÊMß}súÄßu `\ô‰ü|uJrŒ\³2ïfÝɾ›tï^æ“Ú5ŸjýY‹K]®ÿoL¾aLÄ®ÆK}­ÌCJÊÁÁAóÔwÎÿÝ=ˆB!„›ßVž´±›Û¢Å9Ÿµýë—黇,?ÑȲ™æ‡ËöÚÅÀ[·~ü¾ãïU¿þ¼S‡6A¾*ÍxùìAÑ¡òóÔ9ê´Œô›RÕ/Gš£NÝpáÂ…Zª]«–™™Y›ÖŸ.Y8ûjLdzòucRX¯œ.ŸP’ ÓüÑ~ÿˆ¯ &„B!ÆÄæÇÙ¢ôµk7^¥:êçwvÈ%⯟¶5hÎÁþsvi~ÐÖÖ¶‚ `á»O_n´eýÜIãÿx©IÃ-kgkÀ˜s‡¯Dú&'^ÎË;w/¿ ?'?/» _]P+þ*îÂÒòÍÚµjêÎlS³fM3³Mß{gîì¿Ï„¤%]3±›¢©•S(€@éæ~©ùôs¿.Þ?jC!„B)6?Ù,ê^›6c¢£oJϬrsóGv ¿ê)ÊàË/5q™æ|5æœÞ\~¡ûé?sssùœl×{äØM¡„B!¤Ø8­ióå8Ñõ¶m Ð|~•‘‘Ý©Ó$±¼×¨M£×ž¬Y÷9ù¹–££c…À¼Ü»AÇö:þ×£z^'·ÝM[~%Žá1…í©áËÎk|¿?ûºÇüÝ‘„GžWÿ-€õ¾,¾6&ÝÆknaä<i û ÓÚ¸X"Ý$ÆTÏÃ[¯¨‰ƒf`Œt”¤1S×ùI«ˆ?õ·lü)?4š; ïA‘—y&hžÒYd`O!¥M—é¢ßDx®%½ tÜâÃÿl9©ù?6¾¾¾PÏlÍènVjdØA¹úìX¹jÉß->þ@^÷‹¶-g»Œö{¿ ê °· ô)óXØÎ* @À µZ­9ÿçïS—/Ù{žòÈóÚ» àw¿8–l N ¶êÛ‚X"Ý$ÆTÏÃ[¿¨£‰ƒ\ìCÐš«“VìU/U1¬UÇÌò÷Ï#57.âº-D<ºˆ<¸g‚ØUÅmBÊ*ó¶‡KWÈÍÍ7øn«bر*±JãW-åç]NNNSÏzD‡ïÍÎLŽ».@oÏeÛ7/ž4þ†/Ö—VêIón]¿ž7˹[×NuêÔîÞíÛc‡¶+Àä[1›Âí_!¡Æ~ð©Zµ—x‡¯ØEyäyý½fÒfW{Ç’maü"O}[K¤›Ä˜êyxë7*lsâ ;F>D­mÔºž¿M0ð‰µä#/V1üàsüå«Äg!¤ü2eÙÑìú÷_`øé–4hûb•v]ûÈO½lll*¬žM'h{RÂÅÔäÄc‡6ËpëÆªµ®?Ûuyê©'¥¼Pÿùþ¿ô˜?kR϶/Ô¯÷ÅçŸmß²J»&^~ØÀ `€J¥’OÅ—^{{ÍÁhBˆ)äÍ;Âý†—l “–l×·±äÁ‹YK¶WÏÃûBQ¹Y߀AN³ Ÿ5zYk‰Ðì³ö¶Ùöënòך«ëŽÔw«¾«Äg!¤üòçdOÑì\]w~º%} °]ÇIb•!cçÊO½,,,*¸žÞq5Ú?+3-8`Ÿf\·jÎ⹓۶n!oª~½ç~êÞeî¬ICíoùÖë/¿ÔxÁÜé¥,€¢—UX(€€>NNNò©Ø¬u» G.BL!o5}P»÷ÿóa×7w½Xë›îý¥-4oÝ^üUD,—ˆ¯¥›¦.Ý.þ:ä¯YbLƒÆRÄ]‹%ÅÞ…æ*"Ö~”·¯¸?Ò72{ÝyE±Šø«ÖiÄ>È[ãËjVî —îH (¼Wc 鯿 uÖ)V—æBy-Ý{(RiWÅŠÒ_¥oP3â˜Ë‹âQ;©¹\~°Jp&ˆïKóÀBÊ<ö¿.×½þ»"éŠðb•éËwj~ °â `TÈ®‹û³Òo_¹tÆ{ÛJ¹º/¹lÑßúõõ×,ä Ö©]«s§ö®³§ü=å/ë¶­ê×{~Úä±1ѧ“.=l(€@˜;;;ùT´ýyð–£—!¦˦ͥL»>ìºbÅù!åMÉœçoø¤MÅÁb¹¾íë[EøÖn€¾ýy±±Å¼ ^ll¡9¾Ÿ£³æ€µû"Êu\–{)G[k›Ò~J»§õ ˆ›–nÐÿå7?J7Iý}ÜlÍoPñÑѺI^.vRqy Îy‡ù"¤œÒg°[±3Àü;ç^á\1+v„n8xNó÷OTTTÅÀ ¢…í½}3*#=åtÐ͸xÞÔ…s'ìûÓ+/ÿ·­<ñÄãm[·\4ßeÙ’Ù]¾µ©U³fëV-Îû'&:$)ᢑ»*JYE†(²²²’OÅÁ#¦l?~™b yûýðçA#vÝÃ'‰Õå-ˆçÿÒ_Åri€Ø¦|“ôg‹¶ÄBy­Â+Ùý4ÀÀމµÚuþQZK|!7;ñµÖ*ÒÝI÷"¯+eÕŽÝòþˆÐ,Œ¥ßŸE›*­}ä[¥Ý“#v@ZqØ„9Z»!ÝØ”ôW±¢´D|#úvXÜ‹îQf­Ü¡¸¼g‚t_bOø"¤œòcÏÂé=OŸ¾\ì3®!C–ˆ‘+·‹µ½üšü›ÍÇÇçQÀ‹á>W"ýÒ“¯§$ßÞ¿×C*€KN.[ä²|ñ?N£~ûðƒ÷4ëj‹O>úgÚ¸ý{6OqóµÍWµkÕ´nÛj¡«KÌ…à¤øhÃ),€çVd(€€" ‹ÿ>¹š¾hÓ®€+„SÈ;<¨ ½,Ùæ®Þ¥o b‰üƒ/îh­÷IÍ[˜üà‰D ­ÛÛ]^Ëãð9Í›ÄFä}[0pwÒ¯1~üŒåÆì|§eµ?"bSÒZЇN:ºw'öüÁ|,=j.wÛ|X÷PK÷®»é®u—ËA­ù‚à‹ ^°ïÝc‡çšóÇ–,˜ÑíûÎM7 =yøÎÍ º),€‘¾  Kó§xÙÆ½‡‚ã!¦÷¬>~ìaôûu”Ö–¬óÖw“X"Ýôu—Š÷.–KÄFä…Ý{ Ò·A9­­;Jcæ,ݬ{wâVŵŠÝy³e²?"š¼"Šƒ¬¸–t«Ö*š‹PìB±úƒÉ[z ’þ1zŠâþhÍïQsy±t¿Å#„”a>ûl´¨uÆ<ã’.8s‘X«cçneXʪƞ?zõ‚ZÒµ»YÁ'}·©–mÛ¼|û–•^[Vyy¬Þ±Õ]½žkÿÔªes­ß?¯¾òÒ¿ö?´ÏãÓ–Íwx®½s3J7bW ëXŇhP«Õš?¼›wûû…^%„˜Bšþ[¿ôŠøºØ sšªµ…åwK[ðÛ(­›Ä}7i ÑÝ%Í…Z»¡»eãï®böGDU±PlAw•yË·H‡ÝðžˆaZ[kóEG­ÁÒrÍM‰1ú6®ø=j./öLøÆ¶‡âY¤ï{!„”>¢Óuê4ɘ']+VìƒÇOõkÙ|÷c^ ¾ `\Ôñ«Ñþ7cB²Òoß½›yîÌ©=»6ìöZ·{Çú=;7ìÙµqÏ®M">»U¢åM?¢ÝWmkÔ¨¡ùdòùçžõò\{ûf”n  ¸£ŠÐ«ù3ë¹7Ð?ü:!Äòþ‡ÚÍàßG—l «7íÕ·±DºIŒQ\Wq@“¢:#ˆ}3yL)ï®üöG^Wk¡”ž¿ Öw“âQ]´ÒCZ2qú|ÅQÜ×®C§‹½_}A^^‚3AÞ~ )xŽÎÖvº1Oº¶m ƒ'NÛ*Vì¤QíííM­^»xýÒÉ„¸ˆ¬ô[¹9êØËçÞyÈÇãо­š9zØ+à˜wP€ëìÉ=~üîùçŸ+¼lDÚ^[×ܾq^7EðÐ#Ð_=ö »F1…ÈÍeàï£K¶…›öèÛÂÀ;…£¸®â€Æÿ.cˆý/åÝ•ßþÈëj-Ô¼i¸ÓT}VkÝolí¤WÙ¼†hþïëã§ÍݸÃÏÀcªï ÈËKp&Hg‘Ø7~ )ì9záa à„©[ÅŠ_W†xãrÐÍ+!‰W#2Rãïä'Æ_ 9yèØ‘š‘ `xȡȿèHÿm«^Í¢¨FêFìjŒ¸¯G  ç3€›¼ýœ¾J1…ÈïoìÿÛ¨’maé†Ýú¶ÐÿßwŠ1Šë* —1oIídÛ£”wW~û#¯+–kÝÑÖýÁÒMë¶ûê;°­ÿ}§áM‰ˆH{(ÝûÐ1S |›ú‚¼¼g‚üP~ )§ˆN×®Ýxãßêì²M¬eóí¦ù@ÝšžxõLzÊ‚üœÔ”ÛçÏžb-ÍY@+K”J\ê¸Üœ¬Üœì[ W£Î†ž: b|¼|æÀ# ø—æu]oÚx…b ‘¯a×Çadɶ0Ï}—¾-ˆ%f2qߥ¸®ây—ô­¥/%»»òÛù:€ZË?ý¼°£uø¶»u—mypÕ?‡“G8Ï5üû³CÑ• ÅÝÉw*îâ¡‚¼¼g‚|@~ )§<ìe æ,?$ÖÒ¼ ‹‹K¥(€‰×Îʹ‘ŸŸ§ÎËUß¹uõRÔ©sá¾Έ)*€Û·¬Ö,§°Š»{t¡ºpÚ¢M;üc!¦·ßÐnz Q²-ÌY½SßÄ’#X½Sq]Åí:?¸êºmÏúîTÜ$ê†ØyÍ;-ÙÝ•ßþˆH]L,×/->qŽác+ ; íƒø«¾‘bSÒNޱLZkП“ê ÈËKp&Hg‘Ý#„”2ßwŸeä…à‡ Y"F.Xw\¬õÖ»šÔ…à+€ ¹!3-!?/'7';éöÕk±áEp•â`±«—"ö=ÊP"-[þ÷ÿ Ž˜²õØeBˆ)ÄòßøÓÀ%ÛÂŒ;¤-|ùÍZ7‰m>¸FùŠŠë*˜4ãƒ+ÿ6¶P\q¹W€¸I#—òîÊoD¤åâOÝ#¦µP1⊑â1’¶óIÛËc¤‹½z¨ƒ //Á™ EÆ|G„’¥[Ï9¢Ö>}¹Øg\ýû/#—m kÕ}¶žüìËÇǧr@ƒIŠÎJ»%šàçmÛxy¬QSXÅ=>ÒPÁÞÞ^>¿îf¿É÷!ÄòVÓ°sÓ—yÍ-ˆ¿J[hÐØb‰g€æM=ü)ݤµJ±¬;ý(os¼ëÍ›Ä]Èûüq›erwå´?" ŠJ™ÖZâP‹…b­b_ÇÎÖüµý0gcJéõ Ó÷=ÊËÅ%;‹ Ü)!¤”±ÿu¹¨uQÅ>ã²µ.F.ݺÒû´æ/¨¨(Ó/€ W#ŒÌæ Ëã.)ÞTT÷>ÚPÁÅÅE>›~ÜfíáhBˆ)äÍ÷š=ö^hô²ÖFÄù&‘Ï¿î&-ïÖ¸´|²ÛvÅ{70@sÇÄ×b¤H³Öí5ïkÙî0#·öHöGk-1@üU^(V/öÑ™ïqBÞ~ákvk÷,ï¼ ?ÆòrcvLñÛÔ=1!e•þCW‰Z·m[@±Ï¸Ú´#FŠU¦.Û!ÿN077/ýs¹Š(€q¥ØÕÂþõÈCDµ§R©äSñù­:pb y£DPk#ì§9@lSZþ}ßbââmŠ÷nx@›núöá£ÏÚÏÝ|ü¡¶Vñû#òÇä%š N|-†IKôíƒV4 ¦á‘bƒòžµNß0}ߣ¼\|Q²³¨Ø=$„”8#¦y‰Z7c†§á§[ÑÑ7ŰŽßL« ;Gþ`eeUI `¤¨î~ô¡¢Ú Ó|²4}í¡¥û¢!@âÀJ»$©bx€Šýå冿Ãg?P„”S¦»û‹f×»÷ÃO·vïÃìú/«Øô(?ï²³³3ýV&),Ââ~M!@TojµÚÜÜ\>{ Ÿ¾pÏyB!„Rlæí<Ûê³Ñ¢Üåææxº%]â׉b•¿*?ïruu­ °lRT½M"@T{¶¶¶òÙøÉW¶®Þç!„Bˆ1ù¶èJ„;Ìø¥G&¬Ú¯ùΫ°°°jU/œÞe*¡¢zÓü½ñLý†3wœ%„B!Ƥÿ˜M…ånüzÃüü«ñbð×½å']eþD®Ì àÍ+§Ë*…0d§é„ˆê,!!Aó?£LY5}[!„B)6ãV~ °M›1úÞºbÅ~1 [71øÅWÞúïdìí+C,³À¦ ª9ÍËÁ[~üÅdpB!„bLÚ;MT<•ê¨îS,Ñ ;uš$ný}Æž!3·hþ—»———©À˜2ŒØÕ(qï& xè?QÃqéÁñ›C !„BH±4m§¨xÝ»ÏÐ}P´BqS»o§‰aÍÚÿ÷š5 4P«Õ&Uí^ßá«6µŸ­ûîÛoÌ1AÀ1Áe˜¢¸Ý¤BDu&~‰_Dò9Ùܦ瘧 !„Bˆ1ù¼½³(z‹ïÑ|~wKºþ{ÿ);_|àñ'jÈϵ\\\Êã¿ñK\7­q}åí7þ˜;q’÷òËœ-Û}Òý‡Î…°ì"vµ°p™Z(€¨Æ5ß–Ð{Ú¦ëC!„BH±é7m—(z"~~g¥gVÙ½{ÏKlºÏ^of-?Ë277OHH0©øŽåë‹w­ßxæÐÂSÛ'û­æ³°Åà.½{~ýò©²JQÜfr¡¢‹Õ¼ `ƒ×š]L!„BŒI—Ë¥8c†çŠû¥þµm7qÈ’ã]F,ÐüovGGÇrú OÉ àow‹×_=|%tk¤ß²o—ãGXÚç̧-ìÛµþú¥Se’ÂxÊÓCDu&NEÍßNÍ¿0dÕ)B!„bL¾¼Rê€R¾øfjÿyGzÍØQûù5?ýW†/ÿ•IÜä>÷ƒ–ÍEÜyÁß=ÌgN€Ç¸Ã+‡ìvm7}àGVï]¿t²L"v5òäV“ Õú“€š°u¯ÑWœ$„B!ƤÏìƒ]‡­ûnÈêw XðËüƒµŸ{QóÉ•››[ùMåW²è¹qá[¼»5Òoã™C¢Êïí¹eJ:µ.=zíb`éST=L3@Tg¾¾¾ý¯—¬Úö˜¹Û~i !„B1>­ÿdç4ŸVY[[—ù“·ÒÀ°ÀOÕ®%ªß²oÑþæxh¾ Ôg纲*€¢g™l(€¨Î4ÈžåÝÞøˆB!„­ê'XYY¥¦¦š`Œ9wøÃÞºbºè}"“ýÖŽ;¼RÀ!»]ë4zÞwŸêÚÅ€Ò‡H„)sqqy eÄ¢l?úW¶Ð}ÙŒ×?i*õ¾a> Eõé¿sæ“uk‡øïºí_úˆ]=°Ù„C¯º×­[—_×¥dccSNíï?ew!øŸ{tùò÷Rïë½ýï['·ѽc»6W£O”IŠ  Ê”CÄo*~i”Œ………——W…}x§40öüÑn]¿~鳦¢÷µ™Øç½~ßyû ÿÃ[¯^8Q&),€þ›L9@@sfWWWg¥`iùe£FŸŽ1šCÕè}±±±<{C) `\Ôñ…s&uhצå'þlg{&È'îÂñ²ŠØÕ3bL;@@Y±µÞ¢ÅˆøødÀd `ù¥¨n0ñP@@µ)€ÇÊ/bW#ޝ¯ ¡(€€ª_Ë5@ P¨>P«Ê €¨ÂðJ¤_¹†H &SË7bWÃŽ®©<)ß8qâN] ðh à¹#å¢è^‰R®ÐñwûüÜlÎ^ Pñ0æÜ‘òNaô[]‰R®pè^W/ÍÉÎà ^Ë=bWE¥ª\)×xù̾+‘‡ÕwS9‡€@ÅÀ³‡* @Ý(sö(€TX¼|öPDìjaŸªt)ç(rõÂÑ{ùœÉ@ Ü à™ƒ“¢¸¢ò¥ü  HB\g2P(eôß¿j¨ÝõÀ±«!¢LUÆ”ÉH¹ÁÉ @JSW-š –¿òr#Ïõ³ `…¥¨.«”©sö@nNç3P(q<㯚6nHíZ5Íj<1fx¿G[ƒE“ª¤)ÿ(’x-‚ó(€”¦ž Øâ½ÙÕòM 1 õ§ùªþ[Ã÷UX àA·Ê›RÀ¡}ÛÕzÊÌpŒ9{  ?‡S(€”¦ž ô8}\Õç§ÎbÌóÏ=³eíl©VdŠ à’Ê›ÀI~ߤá³ý¯q£ë@‘¤ø œÒ@ ”Pšfù‚‰µk×#üsÅÀ K*sºÎ™øóï¼ô˜Ž:µkùí[«XcÏûÞ¿³(€”¾žÞq|ÿÚšZŠÁVM-ým¼¶·bRTWê_׸ùìã·SÒö³æûw®PlRÒ’®qV€’À€«u¯øûàžE/EÕ1ÔþÌ)¯è°=屫¢@Uö[·¯ù]‡fŠÕïmË×6®ši úI¹}ý,g5P(At›ã$–wïÚþôqÕÿ\"tÏ–µsÞ~ëUqë«W.š"–”kŠ àÂÊpφq=¿oSã‰Çu«_ã†/Ì›ùW±ÕOÊõKœÕ@ 0ØwÝ—m?7Y¾i±Ûc¡\åü5r`¢O¶iÕìðîUš7•m ྕ=ŠððÖ©ôÿ¦VMsÝêWïùgôÍ÷b | (€” JŸœ8z Y'D¦;-,€§½5ä·Ù®Û×bu³5Ùw‹ܦ5 L"võä¾ùU!ÿ[Çû±Aýgt«Ÿ™Y¡Cz…ú{>lûQßMåÄ %+€ç=<×Ï~Å¢‘Ó©CÑøt Ú–5³?hú–tˆ9*—è3¯jD*€s&xãÕ†Š÷ëÛ«kàU ªŸ”Œ”œØ@ ÄðÜ)ÏÐ[ºvþRúÐßf÷YQ!»tãü×Q‹Þ2úêßÎÃÇ”,bWEuªY·häGM_S¬~í¿l¥ï@ PaPšfÎß#k×®iV£ÆŸ¿÷‰ Ù©› ßM}z~'].P”ÁßÙß¿FqäC¥°îu­ìÙî>¡í§M«_‹ß÷Ü0¯”Õ@ʰFïØ³u‘ônÏOš½'¾Ž*Z¨• #ÿú³£ëKŸ ìÚùK}#ŒØÕ€=s+o¼7LîÑ¥­¾ë;¬v›V&Õ@J\÷y.øø£w–ºŽ•  ”0ö?ˆf'ÖêóÓ·§Žl”oÒÊìé#¤¶(Æ…³þÒ7ÒpŠ àœÊ˜Óú÷ìP«æ“Š“|Θ:¢ «(€”¸îÜ4çùçꊛüÒ5ôÄ–óA^šÙí±¨õ§Š[k×®é4¼ŸÖ­šQ­žÑ©Cké^½X_tÆí毛¸{v¥Ë°]ž{¦¶nõ«S»Ö¸Ñƒ#ƒw•yû£€’À3þ*_ïe­[Z‰[?xï̓;—žÚ®•åó'Hoõ´|ó•5nStÈ«÷ù©³Ô(¥&ØãûކW‘#vÕ÷¬J—ñ¿¼ø‚òõú÷(ÙõŒLNv'6P(A”>èøëÏf5ž¨]»æ¬iFm×Jè‰-Ãë%ˆ|õy‹£>«uÇhfÓêD”jcÑ\1u¥&h`•Âè=³RdÑ߃õ]ßá‡.íKs}cr%ò0g5P(M›œ»׺FÇu«ßk¯4q›7±Âª eT·jÆ{˼W^.|ߦøÓ}É$­[5‡Ù~c-}6°Ñ‹õÆ8Ú\£o°á@“Êá­S÷éX«¦¹âõ¦Œÿ£‚«ŸÈõKœÒ@À˜øÜ³O+À³ŠíøKíZ5ÅŠ_¶ýxÿöÅú†ùî^>¤ÿÒäŸb|÷®íW/vÖ7X_ àŽ¿M'#º<«çúC‡ô*§ë;›¬ô[œÒ@@///ÍþÒñËONXnd”Ê(tÒÄ/ýû؆ݨo¤¸iÂè _¬'Ï÷"Vœ?c”ñðØŽé¦éýüRãzŠ×wèÛ«k¹^ß—ÿ€@i¨Õê h™VŸ4=upåÿÀâ²qÅ´÷ß}Cªu3§ 3>>Zð­7^>±oÅC@ÿ«ú÷î"mA4;Q Ykß¶…ãGõÿø£wÄZ£‡õÑ[·O­øx­Ó¥ãÇŠÕïmË×*òú†/þžŸ›m²g—¯¯¯»»»³³³µµµ““?n@˜B¬[·®VÜç¹ °>dÄZ½z|-Mþùüsu‡9Øùï_U‚íhFì¡ßö)™ÝëÇöü¾M'®ïиá ófþe ÕOÊÝŒ;&r¥¦¦Šºçææ&Šž¨{Zï.,,,øY À„……iuÀÚµžZµp|ĉM%ȉ}+Eõ{þÙºÒÛ;´mç³u~É6%RX·M®˜Ø<á÷¾6ú®ï0nô`Ó©~"ɉ—Õ “ êž‹‹‹£££¨{Z'LÜdooïìì,‹†ÈP&Û…QC{GœØXâL;ø­7^–6õe›æKæŒ.ÁF  ç¤ ˆÓo¶ ê×Uœäsè^p’OÅ$Ä…Uع+œèq¢Ói½gX"jÖ=± ?S@˜x´´´ÔzboÓîÓ #kJSEïû¬Å®ñlÝ.Úºº ¨èëé\®™1îç×-(¾†Õ·W×À#*“ª~"·¯Ÿ½ÿ^yŸqqq/½ô’âa‘êžèƒ...¢î%$$ðã@@¥“ššjkk«õlÿ­7^Þ»Õ5üø†ÒÄkÃÌŸ»Û¼òrCù-¦6_}úϤßNv7¼baÜ:±œ²bÖ «w-;Nû/[=òë;è&æìŒ”s2DGGËGãÿþïÿÞzë­nݺy{{S÷€¨JœµÚèkSÆ ?¾¾ôñÚ0cèàîò[CÍj<ñE›fb㧯V/öçÈÖ ežMKþhýÉ[ŠÕ¯ÅÇï{n˜gjÕOäZôñÜœ¬Š<þþûoÅOö¹ººò&O ª Ý©A…ÏZ¼hÇ¢ðcëË${=\ÇèÛüÃWÙ­PqXaô˜P†ñ\>ü‡oZ軾Ãj·i&Xý*ìmŸºT*•ô¡¿/¾øBëÕa+++ggç°°0~^€¨ìbccÅ3|Ý—'ÿ50ìØº2̱½KWÌÿKü©x«Ø“ÃãË$;ÝGöù±­¾I>gLašÕ¯"ßö©ï¤hoo¯V«E%_hþÿ€………ƒƒƒ¯¯/?5@T^âÙ¾“““n]jõIÓC^ ÂŽ®­€À-ãJŸ_iÿlÝZºßKڵƼË4Û_|lˆ)\ê]³Ê Eã½O´?ù`ŠV(ˆ†(Î~|€¨ŒÄó|Ýëz?÷ìÓ#ïztMyGìÀ¡ÍcK“É#º5¨÷´âõú÷0µë;ȹzá¨é\ç]: ¤Wýlmmµú]XX˜³³³ÖëÅb˜»»;3ÆP餦¦ÚÛÛëv(‹—^œ3mh¨ßšòKQü«d™3ñç×,^Pü¸ß]Ú›àõä÷|&'^z$Ÿø3L¾X¤âk|±±±®®®ÖÖÖš‡ºeË–baTT?G@T">>>º/ Í­,U+'‡ú¹—G  Êéa³ìŸ¾ðª¾ë;ìß¹Â4«Ÿé¼ç³ÄPþwww;;;Í«Æ[ZZ:991i P•…¾—…Ž_¶ðÞ<ó´ß겸Ӄª1ÆgÇŸ7UÜC«÷-7®ši²Õïú¥“zϧ(ý?€•••8 %ÑËËKœ3šÿu ¾vppËù  RT­·ùɾµùlÓŠI§}W—U à¦1ÆÄk¥ã÷_7¯ñÄãº{õÚ+MÜæM4åê—•~«±±±ÒÜ/Æt@Y`` £££Ö¤1vvv*•ÊøP‹³³³øË¡”+///Í'óÿ;Mè{ g ?í»ªôwt`ÓhÃÙ½öÏ~vmk=e¦x}‡)ãÿ0ÙêwóJP¥xÕÏp|Ø™^¢¢¢\\\´&±±±qsscÒ0¾ŠÒ§ùÿ±âkj  \©ÕjñL^÷’ñ’7_Éyt¿#«J“¸q” í×þÙº5¯ï0tH/“½¾ƒ¨~ÙY•ûí=¢ZZZJ×_—` ¢î‰Ò'ªŸÖõåÅIŤ1(€†ÛÚÚ*þã+–—ìw2Æ?wttÔWk×zê‡o­Ý 9²²Ûß¿a¤bœ‡Û6iø¬âõúöêjš×w¸yøÎÍÈÜœ¬ªñЧ¦¦J/䕸ÊÛQ©TvvvZ×—çÿ› €¨ûoîcÅqppà=€òî...ŠÓ„J6xnPŸowmü'äð ãSTGheÖ¸îï¿ÝDñ^:Û|î·o­iNï™™_%w¹–ÉËv^^^ây‹Ö¤1öööb9×—P  øèìì¬ï¿[u™››;99ñ!k@¹ÿ<¹»»ëûlà¿o mòç¯Ý7.›|xy±),€ëÿ”³r†}«f¯+n¶ígͽ=›àõÜSnÅäçTíîß²eKiR—2¼ÊƒØ”xê"½ËT~2cgg'N0žÏ¨nÐÍÍMñ¿XëÕ{ÖyìÐËgˆ?ëÔ©¥;@üfvqqá?ÐåÍËËKßL¡²çž­Ó¹c«éãîó˜|h¹bĦö­.¢Z4è›/ßWÜÎÛ–¯™ÚõâcCRïÄU™·zSü¥ò•m”DEE¹ººJSs®±Ï¹¨òPü{ªù_ašŸwþG¿Èý×/úK_‹%b¹î`QÝÝÝ9¶€ò&žŸ»¸¸(þË¥ý²àkMìíl¦°Õ}rð¡erÄF<—éÑùcÅë;4nøÂ¼™™Î‹}wnFf¥ßºÿ^5|¬5;`9Má’ žÀhÍ{`eeåììÌõåT½¨5ɧ¦Þ?u ð¾q)@7bùûŠk‰޹+ bˆççZì2¬ÙoþôýWNÃzºººÖÔs}‡q£›Âdž¢ô¥%]«>/öÓËûÿ™Å©T*{{{­IcÄ9æëëË ²@+«66ÿ}´ißÖoÿæ— 'Ðo»©¸…–-[ò«PaÄóvñ,Ýð‡ 33«1tH¯G2ÉgÌÙ¢ñ%'^ÌLÏÉÎàÑTTÁoËOc´Î(Ñ E7gŸyPé$$$¼öZ+Åþ>²zoëÆ%7.Ÿ4>û½×}Úâ#å"icÃ{'Iú`—øÈÜÜÜøö7°ßOa§|D +ï$Å_HN¼”r+&;+Y$?7›‡Ìĉg2ÎÎÎZ×—·µµuwwg.t¦ÏÀ$ŸM¿¸j錛1'KÏMKÞ}çMÅUíííù05 âùøøˆõ¬­­ ¼G”+ÛÂHâ>>„¯¯¯Önd}~þ!üÔ¾ø+Á周(Q-ëÔ©­xµWWWPe:::jMcgg§R©ø¯o#**JëŠ6ÿ›¥ƒõ±ƒžñWBÊ;Â}öë©xÑ@ñRüJäaUì ˜‹‹‹î¤1nnn|@9¿^”¯ôaÓmªe ±!™ˆ ý=º}«¸?â×#ï‘Uòù˜(}Ò 5ŸùˆzXNW´P ¥¦¦:;;+N|ݤqC÷esbO?ª?´Í¦ƒòç­­­ù>¨ªOÏT*•æ4ì–––ŽŽŽ<ÿP®®®ú&ùœ2qdb\¨)dûæå­Z6×77ÿ!ª0///­IcìííÅr€‡úe¢ù¡cÍI>G:Ž>s,1.̤â¾|î{ï¼¥XÅoEÞ!ª¶°°0'''ÍIÚÍÍÍíììÜÝÝ™4€&ùü¥×gB%^ 7ÙÌŸ=¥Iㆊ ¿ùíª¼¨¨(WWW­§sÖÖÖnnn\_€Ö¯ }“|~Ýñ˾;n]‹0ý\»4ÕyÔÓJW‹¨[·®‹‹‹Z­æ±U^BB‚»»»Ö³;+++ggg®/ðûAï$Ÿ½ïµeU¥¨~š¹xîÄÈáfffŠ tssãAÕ„Z­V©Töööš“ÆXXX8::úúúr|€jÅð$ŸkVλuýLåÍÙÐ#ƒôR,¶–––|8T7¢ñ988h]_^tCÑy—PåéŸäóù©Î£+uõÓLHà>Ûïlk`Ë–-ù/P ………9;;k^_ÞÜÜÜÖÖÖÝÝÙó€ªGÿ$Ÿf£†¹pûúÙ*–#û¶~öéÇŠ5ÐÆÆ†w€ê)66ÖÕÕÕÚÚZë?ÉÅB&ªC“|öî~.ÌïösU8^[Ýß{×RñÛ·³³ã·¨¶RSSÝÝÝÅ3"ÍYZZ:99ñ_å@edh’O›¯üý¼«võÓÌÚ•ó›4i¤xµGGGÞöª3µZíååeoo¯u}yŽ`ú LòÙü£vx®¹s3²fÖ?ë×^ñjÎÎÎ\4 00ÐÑÑQkÒ;;;•JÅ“%Àšä³I£µ«Þ‰?_s#6lüØáŠ lР««+Óaü§è½d...𓯶¶¶nnn¼{ 0z'ù¬ÿü´É݉"R._<°âE-,,T*ç€DÔ=Qúlll´®//ê¡(‰à‘00Éçè¿ÇD%%\ Z9qâ§]ß(ëààÀI )55U¥RÙÙÙi^_ÞÒÒÒÑÑ100ãT “|Ú÷±‡¢g8Ç÷v²i§;9 §€>^^^Z“ÆØÛÛ‹å œ˜ä³Ó×íNžðINŒ&Fæ ÏÖÏ?o«y 9Á˜C“|6³Úµ}}râEb|rÔÙY)~>ë(€L‡I>_jÒh½û’äÄKÄø¨³R²Òo_¿è·mò:×@&Bÿ$Ÿõ¦O—rë21>w3nß¿wïöÈ€=³l}`ãH @fffˆ«`àÖõë×O/²hÑ¢èèh#÷PlÍÀàb÷Öxe¸)àa˜äsÌÈ¡±C)tÆ'#寽{éI×B}WÚü×AÕ €DÔ1ÅϽñÆ]»võõõÕmIÒ€;w*nð"Z GŽ)jÝEëÖ­‹-\Ò݉‘ú(Þ]É”lSñññâ»ãDB‰˜ä³ï/=£ÏL½CŒLFÊõ‚üõÝÔ3þ›ŽxŒ?¼e@·Š®7ý_ýû÷…KîkëׯW,€b@ff¦15JlP/Š’x®+¶°hÑ"qÒBÃ/šx;/V1°{€&ùü¦S‡ €ƒ©w®#“ž|-?O-ªßåˆ}¾ž“ŽlHÐWÅŸúnÒêhrD³+¶F‰uõµE©Š&Xy `±»(24Égó½w¨RïÄã“—{7;3éjÔ±ã;]ü¶M¦” *v4©òH]Iñ Z5jÑ¢Eb˜â›$ããã‹í\¥,€Å¾ÅTôS±ÅnJßÇ ïžØ2*„C“|¾ÔxãºåiIqÄøäd§çÜM»|Êgþ1¯iG·O¥”¸êv4¹òHÍN÷¥=­ñ¾¾¾*’1Îó(€_ÿ£óFPó²ˆ&(Ê‘ü=}S‰–²êö,é»^Ô·‡ö\šÎE~¨£! ßcÈÿ’Þjà8£*10ÉçÇÍ?Ú³kkFÊ b|òsÕê¬Ô›1Á!‡–žÚ¿PÞP®Tº•Gë Æ_LAzõP00AJÉ  îûK)€Ò'µŽ´Pþ„ ô…¨{½{MÀ*Ïà$ŸM6­_•‘r“Ÿ\uf®:ãÖµ3áÇÖ\t`1 ü  < ¨ü‰6ÅF¦ùFP­z5räHWú“Þ0i ÉW¨€¨µ\¾T½ØI±Y©ûPy¾EºCDU¢’Ïúÿü=)3õ&1>9ÙéÙ™ÉiwâÎl9¼,øÐR @y@­éSþ£ÿ%9©.‰?µj”ôŠ˜¾Ï¾ûúã ¾¤¨øÁ=ÅàIPz©Qók}w$oY«²i½“Sß[@u(Õ¯j‹µ´´Tœäó¯1#nÄ]ÈL'FF•zÿþ½ÌÔ„ !;B}W>²‚PPž½S³¾é+€òAµ™Ô˜ô½‡Sq¦MÅ1Š—’—^@Ôü¡ncýOÑÕÞ¥ÙGKœDšTÞs“É.€úV”ª±n3EÕ`oo¯Ûþôë‘•–@ŒLvÆ{÷ ²³RbÎ ;º&Ìo5 <  èDòÛEI ¥Wôt»ŒåÉŸéÓ,€Ò›BåkÇK/‰F&îEjvÞ *‘®Ç'퉼ºèŒò[45/¸ };‚<§¸Už˜Ek—ä%rÕÕ}PÞ¸XKž»F.€bOä«NÈ/)j‘‹*—¨Â¬­­5›Å·ß|t"+-‘™ìŒÛ÷ òrs²®_ Œ8¾>üØZ @ù@EÒõ͵Æž•E.eš E3’*˜¼YùëbÛŸD45Í—57¥õfKéÛ‘/ê'_á]ëD±–Ö¼.òd/ºßKë"ÒRÉÕ,Åò·&Ík^bž ÁW“8t@·¬´[ÄèÜ)ÈÏÉËÉJ¼q.pË™)€åÇ××wº}m%33Sñy’øøxiuÅ;-¬õ¿Ä×uQ<±eq§¢”I«‹/ßN)¿£Uz‰PŒeMñޤKJ[“¾Ý=ËuïNk˜ô-‹úÖ•·jRGôëxîø–»é·H±ÉËÍÎUg$'\Œ ö:°ù¬ÿ& Œg̬2@¹@çÑ}÷¬øãbðî»·‰¾äådæÜMKO¾~)Â'òÔÖs'=(€ ¢2ÀÓ¾«÷®*:`vÆ¢•ÜìŒû÷ïÝÍHŠ=ï¼ý|Ð6 (€¨Ô0ÔoÍÞ•ÃÎUeg&)9wÓîß+ÈÉN¿qùä…Ó».„ì  ”Pqî â `رu×9윛™z+;3¹:'çnê½{ùù¹Ù·®¹¶':Ô› ŠÀðãŽzþí»iRFòMuÖÿoïN ¢¬÷?Žßsn¡©(Z&i%fšf‹-ZšÙÍ›Fÿº5´rK—Ó K½”)殩¸P¸‰8.èˆˆË  "û& û€ #‹«þðè¯Çg›a€aF>¯ó=‚g†h˜7Ïò+i“s½®¶º¦Jµ %#.(ýRî׌=·[}l}Ðö9%Úô¶Vµ5•5ÕzÝÕ,MRð帠˱@€û‰ØÅ䙥Ÿìõš Þ‘N§Ÿ¨¼¼\b3ö%è™k¶Ó…›¤éõúøøx??¿Å‹/¸‹uu5µ5UׯådFå]ŽD6ê%“ØÉ2 òE¥RIÜówlÎ òš‡¹«Æ.ˆ#xoÆ-X(<5ÑjãïàcïI4æ@P±¤÷cððNzÒO³ÆÓëõ …ÂÅÅÅÎÎŽ¾´spppssÃS 0%úHêÅcgý–Éç¤[kúÕV“ô«¸^X˜›Ÿ•ŸqØôäsrrB€µ áåå%¶ßnôM‰A  Ág$ºÐäç.zð†nšѼÿíL;꣠ ÀÈ+»´q®®®¤þè+:R…¤ •J%éD|Úl¦Å\ Þyhí„K§wܬ(©ª,·–©­­®©Öë+J®ä%j³b 4€¦½d"¯aFá\¬@앬(ÙáÆYîýL¢R© Úô=€ÌÂ>>>=|9‹sb#yy¿ô§srrâÜŠ¼GìÈò!rŸÌw‰¼Í¾ ]ØBâ(Yòé˜møßÒnü3%îlL>ÊÄ8¹7z„-y'2À111œ‹ÆÈd2¹\®Õjñýiƒ˜HÊ(ôàʃž_g%†VUVXøÔÔTÞºu«R_VRx¹('®0;ØB/™È/Vò«Vºÿ~‹‹ @ú´Æ9¶óLB7;T,i<’ Zâ€+ºßPØ.K‰[‘Ç)XŽÌH¾´þØ_—ÁãCègäÜ9ùW‰Õ1?ó«ü“sì ¹ @£h4OOOv5ä_É;qј6€¤R£ŽžØþSðîßJ¯eWWݰÀ©­Ñ“ô«©Ö_¿–}%/éJnÐ /™È/kú€,, Xl²Mú™Dú@P‰«€²/òIIzÇ\£ÐCX™ý}ô`NöšƒügBþUIìÝpüÉ|ˆ~-ôàæþén8±‡*¸û sŽ9ÿñó¿ÛôW{ß³/?ÿ¦Ñétr¹\&“µoßžþ_9`Àww÷˜˜|ÚNf&œÑ$_Rí<´nR\°oEé5 ª¿j’~uuµ5庂k©W󓀿|ÉÄþK8¬:é”Á”>T"ÙW›aâHžK›ƒ´€ø;%É#üºØï—x¨ü½iì‹áðweÒß œ#i9¡Ç®9z}TÁÞ$_MÎw›ÔìO‡+?4^¯W*•...ìõå\]]ðýi#˜•’™xö\ý¡ãIÞ(+®©¾ÙºCÒ¯¶¶úFùµ’ÂËÅÚt`«¼dû­M~3+mI =]Åà•EÙHOaÐSQL@æ®ØAâoòäó1/-èc 7Ár]m*oK*½é—€]~-Šü?èææÆ¹hŒ³³³B¡ÀEcîûÌ"é”–™vh•r-Í@½ù‡”_]m¾¢DW”IêØŠ/™èD‚/-$.#vâ‰àåè½ñÿ~N-ÿµ–tÒ+yuSúàÉì?;ãµ@ ÀÛâ‚J ƒäó$ø,D§llJÔœX¦IY!¶ØžAþ36Á64x‡bÛlXh^ÉÉÉË–-xöUï˜íñÚ   Ø Æ ;²ÈçÒ—Wšø[½(ŠØ5<9OÝÒ¿’@ƒwÎùƒ=Q‘}؆1)ÊþÙŠÐ_ Ò_,4;FC¢ÏÑÑ‘³¾¼§§'Ö—·ð<æ¯_gO:¼g ˜—q!?3:'U­>¼öÀêqGÖ]ÉIª­©j¹©««©®ºY¥¯¸~5›ä€õ’I:O!¯ Ä–?fïqã¿(¢E&}í>þ‹Á3_Äöir<>Ô@Û ÀÛ"‚6*ÙHŰ¯yÒØó—9G&Ð?p >G±Wü‘@ïŠýµHn*‰Æü^0ø`ØßÓN€fÄ\4ÆÙÙ™sÑ777µZï਑CÚµ³éØñ!—/ÿcZhb´Ù±äŸ—‚}ŽmšqÌ{zZÔñ›%µµUÍ:5·o×_䳬8·X›&6@ë @Á÷hšqRŽ}¹9éW>ì¿‹½lËLé{c?xDÀý€ì i€·…59$$Ù‡4ê¶‚{™ûáüE‹³n‚A @ú—4ú,J÷ôqžÞÙO­Æ@X,¥Réêêʾh y›¼‡¼ßË ÀîteÞßá¡öú÷ ›€…9ñE¹‰¤¼²’CCýVXó5³C°®¶ºéCÒü³¬$ŸôÁAZK6ö áOô ¯ÜØG ¾l3f™*Á{3æÁ€õ Í.±V @þ ‚ÈìÝc–’7¦é˜pp#ùô*Uœs¥ù_=^ûB7Æ ý¶Ðo&Ý[Êù°ŸZy$üC@ñœ `iÔjµ››g}yggg¹\®ÓéðýiÝœ1å ÛNþ¾žOÛÍë=š€W R®iÓ®æ§Ä‡î9¾Ùí°×·Ž{jbëêjL&ý*J‹®‘»5n€Ö€‚Wzá¼c¿v2ø[ž¼F’x…#xí>‰c«ï>x#¿3`](vl€Áë s @z'FžÙGÿêeÚnDFAA———àZ bWø4þeð»ÊùkžØ‰~MyjEX¸äädOOOÎEc½½½±¾|k`ì¹ÝKæO{¸[º­mDZÎÄE(›€Å…—KŠ2uW²´šKñ!{‚äsü~ÿ2âÈzM|Hu•¾®®Öàܺu«¶¦êFÙU¦é5@«@‰C(_kó[žÿêBâ®èâÅbø_”É‹€å?›±Ï‰3æII¬×œœœ°±‡˜€©©©bëßÑ2é·ÂÈìüìF ý¾©Hô¦1!_ÿ¡@k¡ÕjIôÉd2ÎEc<<Ó÷ÈþMÍ€œÉMŒ;»;dßÒ‹'·×TëuW2¯ä%6à Í€b«K ÄŸyé`oÓ‡€6öÌ €• àÕEH ‘göeRÄ"72oó0à?ɰ7`Ö3U©TQwqlÔ9q4ÖÈ­8Eg/|ÃþÙ§+rnE6c/–Êù¶€´ì >ó³/|ÊùmÂgöz‹@€ûFLLŒ»»;ç¢12™L.—c}ù–À¤óÊc~z«øggÛN¿ÌžÚ””ž‚Œ‹¥EEä~šm€-€ì×üëÚI ÄK/!v|8Í:ö_˜_¶Ñh•x ä³0/?p(À}€Ì¡‰äséOŒÀÛ÷*v˜y’8™Ù_iÂ×KV¬.ɧãwûV‚«ŠEh£Pì4±ïžØ:†‚p¿Òjµr¹\&“qÖ—www‰‰Á÷§ÙYbñ¼v]:³w>ôPû>²×Ç«%0®Ø¢H^/±/•É?ëÄàBð‚¿Íék'NQJ/Ï>ÿ…ý7|ƒ Á‹D?û†@ëBž—¢$5ö~Ä®±Éaäý“¶"OAäù„<Ý‘çòO#W 4ònIpŸÌ‚dcòHÈó0yCbÿ#óÕ¹ƒ²±ß=&|üä14ê?%X½^¯T*]\\8quu 0Ïc ÀÓÓÓºNK4-ÓbÂO+Æüûζ E]]Í­[·üüöOûî[uð¡Æ N+=—£+®’dkÞA61ù¯—È/bæûÑ þv6€œ‹¹Ý¾÷„αXìÏÈiC‰ &ˆ =#F°Ùg¾>x €™‘×nnnœ‹Æ8;;“NiÑ:cbŠ‘5 É˜Hâ(+#©ºª¼¼L«+Î(¹–NÞ¨®¾éããó¯‘Ãývo62Ëthhä* b‡<”Ä\AúDzotOó7jö‘KüƒnÑÊcßûò ü°E´ºäädÎúò2™ÌÛÛ»%.Ãì´¢”Àøó‡ã"Š`~ƅꪊkEIÅWÓtÅ™tnT\Q*•>ÚݾG÷µ«f§GI`¾Á!X~]Kz­ÙØBhð,ƒË@°ÌÈ=˜’‚gˆðOB¼mèÌöµßùg¾ðwk",‡F£!ÑGºŒ³¾¼§§gó®/OÙóHÂJ§ÓY{÷÷}nÐ@¿¿ `aN\¥þ: ÀR]vYi37o+ rŸ;v°³ëòýw“bB°´$ßà -'™ƒ<% Œ9õƒ9„ÓJåååÌ;™“AÈ]9991×y#ÿ”¸B8sotæ0TæV$ýÄΡ_‹ØÌi/ôZsÌU_øû9 •Xer¹ÜÙÙ™sÑ777µZÝ\±É4 LËo@é,ÊM;{üùçúÏün,?Iݬ()ÕeÑ,/+¸Q^ÄLmž|Ÿ™{n×ÎÆÖ¶Ó‡¼xt7˜úÔiI¬µÄ Ú¥RéêêjooO_W“·É{ÈûÛN Àí[7:¶Ýe¬lİ—BOìà`VrH•¾\³äzI @ò¯•z]UeiV–†ÚD—ÎîÖu¢ËWG”{0ט)¸U®+(ÐD·Ä ÚµZíææÆY_ÞÙÙY.—›œoZ­–9÷Ü­%/Mh0,XððÃv×/ð\ñs¿¾½·lXÀ@ÒGšÄà’¢Ìêª5Õ7++K+o’ô+«ÿ×ý­[u&LèðÐCü³¨ºtélkkûчïûîÜzýZ®ôÜ Ą̀– @Û”œœìééɹhŒ£££··· G⑹+‹m@ƒø×Ž-ÌG¿þò£C{þúêóßNø,>ÒŸ`fÂMRpnzÄ•¼ä²’‚Ê›¥ SV©/«Ò—_-Ìš?÷ÇnݺÚvê$x=Îmxà1£GmÛâU˜Ÿ~ýZH–•äçg\h±A´]Z­–DŸL&ã\4fÙ²eºhŒå7 Á¼’Ÿ2Ëm¢ÍƒdƒAŸÞ½cõÄñŸèÿÔ‰C[ؘE¢‰¤Sj˜ØBð›þXÕïé§Hî‰]7ÒÖ¶S×®v¡Áׯesˆ0½^¯P(œ9ëË»¹¹y­?Ò€ÌÕGííícbb¬1cÔ·o\ò˜}w²M§Ž~™=ÅkõüÇ{ÙOûqLø!#Y"ø”ÿÄñ_ÚÛ÷ ¹÷ÏþS(muW³9“ŸN04Z‹¨€€WWWöúò¤é\\\”J¥ôªä£L’Š´´42/„î?ydÛkC^`¶=jøþÝë'|ýi¯ž=ÍŸi|Òe ·ž5szï'Ÿèرc»v6ì³/uW²8ƒD´qîîÆÈd2‰‹ÆXl€jÕž ]ßLøŒÙ¸«]ç™ßOÜìµøQo8<ÙK¹Ç»Q¨»¢a&6:té¢yýûõ}衇ºté¼jÅBú!:ùéJ‹órÓ#Zv€ N£Ñxzz²ŠYž¼SðŒ?¦¬"sÓ#oV”Ä]8BðLÀ_ëVÍíj×…¹É ý–þöÓ¢ù3û>Õû?ï¿vØÈ,¹Â”„ÈKÑ!ü÷“iÀÜÜtuËŒ Õjår¹L&ã¬/ïááÁÙßgi (€qá{4Égõ7ËRâ‚iÙ¾ßgÝ›o¼Jo8ê­a«—ÿòí¤/y¸ëÌï']N 5€&sÒÂ[|€`4½^¯T*Iåq.ãêêJ‹¼Í4`ÓWœ7CÆ«÷¦D©(½’ŸDðøÁ-þû½ÎssèÝ‹¹m‡‡ÚË>³jùÜ÷ßõp·®?Îø&&2H<35õx-‡Ô™&P©Tnnnì‹Æ*$m¨P(æÎ˼G.—[~&DìOŒ<@"®ìúÕðà4(þØç³~âןvèpg©÷>â:ù«E f¿÷îÛݺÙ}ýÕ§çÃøX\˜Ñ¨¹€çÌ0@hŠäädÎúòô2­Û€Æ`ÒyeVrHyiq\´Š€¾ò5ÞëŽõ½ŸÞOör÷ùïËç9þÑ#w{ïÝQÊ};î ÀÆ Àë×rêÓÌ<ƒ€&Óh4ÞÞÞÌå@ÙÜÝÝ­"“£üÓ.–•äçe§9¸™à_[~ßúç²¹ÿ›Þïé¿wwvëfGÐ{ÃòÓ'?;°ÿ~Omö^Mðš6½±“Ÿvþúµìì”P3 š@«ÕªTªeË–¹ºº’æj×®ûõ|=¬%S¢¤^åßP‚ÆN}^Í®_jÐlƒãh4’{...¤°Ø—å,A6?~üùóç­+Ób2Uå:핼ãþ>4ÿ\·È{ýbï K]¿׿ßSôž|ðÁ1£ÿµÅ{ÍŽ­ë§NqyºoŸÇì{T‡^+H38 ˜••|Ö|ƒ#rO°õìììȇ\]]—-[F6ÖjµòàMÀôØ@RF™ÑUúòÔ¤K¾;Öoõ^±Í{Åö+·oZ%ß¼Z¾yÍÂù³Þ|c(ûû0ìõWqÿáı½û÷l›ùÇ'ú8<9û§éá!W RÅ& À¤`s:ÎÙÙY,÷ìííɇÜÝÝ===Iî‘-ö ib’>ÊL8sM›v]W}!”d ÏvOùº];ÖïÚ±Á÷/¯Ý;ÿøÓkÅGÿqìØ±ýD66¾3jäâ…?Gœ;~X¹sÚwû>Õ»o_‡ÍÞ«¯¤ð‡ îІ™™·–x`/óG2ÊÃÃC.—“÷ëõz+úBš%5IÁ9iá׋su%WCÎÙ·Û{¿bã~Å&¿=›ìÝr`ß¶ƒû¶ïݽiê·.O<Þ“2666ï½;jõʉ—B6¬]úư¡WóSøs7Ϙy€@P­V[ûWÑ\Xá””sš‹úº’⢨H•¿ßöÃäGî8¢ÜyTésô™]Çü}·nZ3~Ü罟|œ]4íÚÙ öê+/¿x%?™?yi‘$É'2û àþѼ˜–“¦.ÊK¼Y^|óFErbôÉ€½'Žï :¾7(àï9äªòWúÉšé:à™§éxnЀ+yIüiÀÌÌ„Sæ %0÷rd^ƅœøŠÒ+UUúlMJøÙãÁ§²‡`DØñèÈ ¸‹gBT‡zÌ~v`ÿ†Lä À’¢Lò¹Ze€€”ÀüÌèMLQnBùõÂêªÊ+…¹±Ñ!á!GéDœ;}&).$=)|Ï.ïáÆå&ò'/•`FFüÉV 1 fÍš5bĈ~w‘·É{Èû¥o5iÒ$ö­œœœ|||Ķ_Ò@¥R1oÓOäååEnÅ|455UâÓ1Û~ òNã?ùŒä~È?ÉÛþþþô†ä&xV€6€ÚìØÂœx’¥%y5ÕúŠr]vfbl”*JH&:âD\ô餸³éIaw0?w|ºÖ A$Hû^—¼_,èH+‰ÝŠd àM˜íIy‘Ûò? ó6)J±ÇIoÅ„E ®QŸÙžü“Ôç& Ð&ðî”fÜ,/®©®"%˜Ÿ“š.þâ™{µ1¼Ôˆ’ÂË—cO´Þ EÑ+â’V"ñµä.qô“JâÜŠlIoE¶dnÂNBÒVbHï™ÙéF£y›üSì¡ n@ê~Rfÿñó ½Oæ Á‡ Ц?%E™õ%XSUVz­ /írj¤¢!7¾€­8@1L ‘ü!%ÅùÝãÆÉ"///\ü[Ñ6äïËcï1$F ”9P“ÞPpŸ UÎîEºïÿéÈMhßqöë±÷’2€lÞ І0NbtW³nV”ÔÕÕ1ü5ÁmH^N¿تƒ&½ç‹žO'Øqb¹DóŠ“]ô†‚ÇyŠ%§+ÙŸ”¦¨ØA§ôÈR±lÄ.?@Þ€ÆMltèÔ)?Ô€é$ÁZw€(¸/ïvÃuW•iœ.ã\S… ØyvG ~ˆvœÄž;érN'hÓ˜ÛôÉ%¨MO‹9ÞÚƒÀ>#ôš`²ÑãBé1œ|¤ï÷¯<Ëܧ`—Ñy‚E)q‡ì/ý¥Ñ4øõ´¥¼ÔôiÀ4Ò_­>@ÁXã\Ì“¹® I0Á5ØOJ wÅï5‰£.Ég܆‰8ò!öC"íF?‹Ä#¡_»Xé™x À‚¬f˜ÜTu}^<Úêƒ$¶ŒVœK²ˆ-¸ ¶ C£P¬õoHÐH@@Àæ˜Üõ5m*‰/K •JŬãÀ_Ý}Í#÷28ç €ôhOÚkôŒBNйbVŠ //6ËÔ`AjjôaK A$µH»±KÆWSΞ3r­=Ι}b±FЄ+y"È À暆LI‰ö·”A§¼¼œæÝ—gÌE`š€tŇÔÔTzV àÊÆ\ÀV@òÙ-e€wøøø0—I«9þ^6zˆ¦DÇ1+°›vèmÖEDg5Xèî£ô÷÷—h=æÁ°ïÀ{0#ª¹†àÕü”ä ‡,i€÷¤–X”ÑÜcÙ%¶ˆÝoÈéJ#Þ½ ¨X©Ñe#Äî“„¡àåh€Ð–ðBè!·éÉìÜêÉ`3NnJøÕüää JK 7ÖøÇXFEEÑÖcï>£Wel@z'?¯Œ@ö§à/ÿ'øøÉœu+˜‘‚)Š€6€;6¯ìÙç‰÷&ñ/YïWŸ4°ÒÅÓy—Ï7×Ü Àó-j€üÊ#o|[Ò€}~ÒÊ£+È“›w²¯Ã?hÓø¤§þñ—„~üäa3Ÿ½\çHT ´ÙŒ ö³¼çŽˆ£›¢Ž, õ´Q¶ÖmØk¯4c6` .K Ãßߟ¿ô;îoE"KìVœîLÀÛw4òœA‰Õ ?ÚfºNþïw?ÿ) X¾oîé­Sz&ûì“r/G6ËäÌKJŠô³´A²yyy‘æb.™Â\5…¤“Ä®·Û ûéÈ­˜3õèU_8«õqš‘;sƒ$$³½`K n?iÒ$Îã'm(öÅ2wŽçhSø©Ìñ—U‹Ng^ÜŸ¼!òàoÁý°aÜÁ¥{÷<¼37=¢é““~%/‘Ô–ÚN¾5bè¢mkýSÂH2;gmœä¿rÀ§#g~?¹9< Ë ´œ8î“qs¦’ôÛu„ ³pêQϳÿûî;#sÒÔÍ0Éa$IjYæ  àºß2f$é¾Õáû–…ú’ú›{zëì cNöÚË9iáÍ0$sÈ#±ÈA@ ÀäèÀÇ{ÙÏ>¸ž¦ß¦õ|ççñï¾32;5¬éC°(7¡¾³,v€Ð03áÌb0’é¾Iþ+ÉŒ;¸´ÿûÃæÿ2£ù0>>\a¹ƒ€¶€š¤`·i}ø¦ÓÆÙ_ìÿÍiϼ¡s>éÅAi±g²SÎ5}ê0'žD–%ÚHf%‡ÌÿyÆã½³{ºg»v6o½ùZÜùÀ¬”sÍ2 ækу€6€YÉ¡d”{6¦^:ͼÝ\““t®>ÏùZø  Í`K Àœ¸Øs»,}€ÐP“t¶å&›`v,É+Ë ›€—È£²‚AÀ}€-8 x‰´•U îãÌLTµèd'…f]ºtv‡U €M @mVLÌY¹ÕL `åÍ2üè@ë` Ï ÞnEÓ¢˜t£ì*~zÀ̘‘pº¥‡ À‹¤ª¬hZ2/Ç’,×àÌ€ñ§[z²Cµš‹$©¬kZ4™)+ÉÃÏ0˜'/ÇŸ2Ã,Ð\Œ>³ÕڦŌþ†?Æ`ŽŒ;i†ÉN )ÐD“ž²º1Cf§œ­«­ÁO2´|šcê03:úôf«3 mV ~’ ‰èøÎðžu÷ݺD0ÓcƒÌ3YõEbÊÇ HFw5 ?ÌД\»ü'ÛNɇf~7V(O˜gîà©Ö8æ ÀŒø ÚšJü<€É¾çÄA¯ŸëO>:bØKçU»ï @3 Àų̈ LLYã49=Ü>”@2%Eøy€¦`¼zotÈîÉãÈ<Üuçæ¥L¦] 4ÛÔ`Æ… '½­vL@ïe.C^ìó{  &IuëV~¤ )È\fóºù¶¶õ‡ƒNŸòeCšo²Ï6àŸÖ;&à¾3Ƽõü?xïÙC0É`ixh–L:¯ =±cè+õI2øùa§|ÓbŽ›g²Hž' eÕc|–Ïúäÿ†Ú<ø¿þúöyâȾ?Ä07=?ÒÐ,È\fú”/ÉÆm;.˜;=5渦>/Ÿ?Â˪ǘ<¡øõ›¯þÝ©c{~úu¤ëÂ_¿K?:¸ ˜€s~øús§ÑÑ!»9Ë@øl^Þ«gr“ϤþêSÅÆfú·_ƪ²?Ú\Ã`DC@YûppãÊï^zî©ùÀñ­àÀ¿ŒO?f´Y1ø©Ó0^½÷ÈÞµ}z‘ þoÌ›çƒ÷44à=³wǪÏ<Ŭ±zélþMœ¬„à¼ôˆˆ€u÷ÁÐÜí=ûÍ× ¦ßÈ7^•¸Ò‹ôh’Tø©“0!bÿÅÐ=_|ü.Ù¦WÏG÷îø=%ú0ü<• ÙæÅçŸÙ²aà6¦ ÀÜôˆútº/æ¨ïoNÿ7\0ýèë»m¥iéG?ÕДd.³zé,[ÛŽíll~œþur”?Ϋvýå‡Ì‰O9<¾ÔcÆ¥ðý‚[6j4õ¨V÷´ö9¹餯޵±y@pu¿µ+nbú! ¹´Ø©Ã[^|þ²ñ›Ã_=±C°×Èû¿qù„Y5þ‘‡»NûÖYlËFà볇Vº}+ëÔñ!ÁõæÎ™Ò,釓p›×ü•  ˜tᙘ°}_ÿ÷?Ì…_¦}ãLþ•y?gÈûÝœÔë±G™->ut¿—à–Gœ›~lµ•ÎÂÿ}¬G7Á‹|Θ:¶QùD@ ਑CÈûeïÿ+âÔΆü{ÛW¼ø|ÿ†}|v«–üÄþgÈG™-‰Ã^"ÿÚÐŒJãG¯²Ò\³ð›~Oõ<ÝoÂX'õEó¦LÀ Á>½_¿A‡^w­©oÀ{gÉüïI’ †¾òœàtvx/ú÷[¯ÑÏEÞ&·<½Kâ&tH椅…ýÝŠfÇú™/=ßW0ýFnÂúFNnz8~ªÀ„dÎ\SÃÂŽünã·í—wFL¿×†¼à·km ¥3× RðS &`BÄþ£{×èß§aÏÝЈS;#p†l0bØKd[ÛŽ3¿{1tö;Y2o:¹7¦ rÿóÿ÷­àÆLž;²ÒÂçðÎyŸô¦ØúÛ½·hú1SQZ„ŸjhJ&Fú] U|ññ˜ú¥{t÷¶¥ä=üÙ´v.³d<ÉÀÉãÎß*¸{ÈÝþ¾x¦ìƒ·˜xPð& xîÜá;gü–Lüï;bù\±è'3¤3uµ5ø©€¦`B„3ëVÌaÖwpûî+úNöD‡(ϛ֧÷+ŸÈÞÛoç*Á-€Ù©çB/·Ìù~òݺÚòÓ¯³m§¹s¦$^8l¶úà €Ðø÷œPþùâsýÚtÿ¹€óQ:×Îòò ;'ú½º™¿ 3~;WÊÞ¿ó)z=Ö}þœoÔ'åb‹&Ž À¥–3ë—LôÌ‚§û}òÑèZßAz2âƒjk*ñ# Æ`ÿ§Ÿ>âÅÀxõ>ÁQÝLê¯a÷IFõÛòÄÁ?Æ}ñ>ŒÄ¨‘Cÿú¹¹ØöœÉ¬ÀCK,a¶yNíåþbë;œðßbþôÃõ?Àîîîì„yæé'Ïý“€Rã»eñ€~ä¶=ë¾nÅ,‰-ÃOnŸã6~ÈËÏþ½ÄËÏΛ3ùÄA/éOQ€É!!Ê%­;‡äîïzY0ý¿0ÀwÛÊÖJ?ìþchµZ;;;vËô´䨾5`ø^cfÞìÉ̾¯>¬X#½qxÐöÅs§Ž9äï5 ú9Ìùaü‰^‚Û“ÌJ9«\ÜZslׯŸýg¸ÍƒðÓ¯oŸ'¼×ÎoÅôÃî?0^LLŒ½½=§ï÷dÐø Úö¹Óhæß¾kË"ƒ7¹ì³ráŒÞ‹‰GÒƒgŽläoÖ€gÏ\dþ9¹×ãÛ±£;ul/¸¾ÃÂ_¿oõô#““zëV~’ÀÆÁÁáÞì~ÈwU\˜¢±³oÇòQ#_eîä…AýÍu5ò†Û¼æ‰mœwš`ðÁ…f÷éNÝì: ®ï0cêXs®ï 1™‰§kªnâgšÒ€¶:x.û16l· à·î3Ù;Ìž‡wÌÿÙ[‚ë;<Þ³ÇÚ•?[Zú‘ÉM¯ª¬À(4#µZÍY‚xãµNù{] õi–ñ\êöá{o>Ò­ËÝ«†>yz;³ÌØSšÄ3göÍkÆ ôýyÚø1bë;Ì3ÅÓ9ì+>@KÐjµ¯¿þ:§l;uøíçobBv6ãlY÷ó§zûÍW"Omã4ãNþÚ\óëNöÝí/ò9cêX‹ºÈ'ûsrwwç·Òð¡ÏŸR®9û—†`fÂéÓ{ç6}–ÿìü´CÁÓý&ŒuRŸQX掿MûóP«Õ àï œûãx3à/M™M+&½øloÁô=j¸¥­ï@G“¤ÂŽ?03Nçâ⯧gž~Òë÷Ÿ.žÝÑrÃà©=¿˜6»6L{{ø³‚é÷Úüv­µÌô#s­ ¥®¶?{Ð*øW†©_+pðÅÖß.Ë[b2bOfÆŸ:¥poììóþþ“÷†ˆ­ï°Ý{±Å¦_Þåý ~Þ u‰í $>tqòàÚ–ÀŒøS'îÆÏ±³Æ}2¢Sá‹|®Xô“ŦŸ&I¥»š…3°jµšPÂÆæÁO?ü×ÅÊhÕö暌K$OžÜý?#gê¸w³ëÈlm;Í3%ñÂaKN?¬ò–I¡PJ¼;jèî-ѪmMŸ»8Çà,øÑ©G÷.‚ë;¸NúÂ2×w@ú€µÐëõíÛ·ÌÀW?³~ų̀3Ûš2õä;[b~ÿÕyàÓ=Ã'¶Øõ~`u´Z­Ø‰„Óö?Nûâ„ßê¨3[M˜»8Kp¼—~=äÅ>bë;œðßb±—y)+ÉCú€•Òh4®®®b{ë—òœÇœ *ÿuQ§·?—‚.Ç8±ë'ÎìùÃuÌÈA‚Ÿhð |·­´Ì]~Å…iXÕî:ÎÃÃCìÜ@æB1cÞòûÂïÂþ¼pz‹Á¹Ì À›§;9¾bóàü;ïÛç ïµó-0ý sbo”]ÅÜôz½\.wppø‡¤aCM›ü±ï¦yNo›úŒ=èó#™ÃÛgLø|D§í×wXøë÷}ñAÚ¬˜ë×r°ž;´*•ÊÅÅÅÎÎNºîÖyÌÛCR|%E7+Šq1O :N¡P¸ºº> stream xÚÕZMo7½ëW¹T:hÄ™á§s+ÒÍ¡@ç”æ°–VΫ]y%'u‹þ÷ÎîJŽlù£ ʆ`‘KR¾7ÙGÈç A_ý5g×ß«Jiy94@Ñ* DcTM®æêí@«3™>üz2˜¼fTQ¦É©“¹²\då-uQÌÔÇá«âô´Ì›Ñ˜ÅŒÆ8Dy³„vøa•7¿¬ÚI3<¾(fùhLÚ! ÉŽ>¼üv28`·¼úzÀ3«ébðñ“V3™{£4˜Ô×nåBIdÿÒ/ÕûÁ·-ßÕn- aˆ–ÄR×›8€·lºßzÝ„a Ô=F «™Éï‹ ^Õb÷íž…ñÖÄxÇFÇdP¨!êˆ-“¤å«½UÖ8@¢žÊ×ÅÙE# 1ó0µüÿ¼û1ãe‹^ õÔÿñ^Û0ü°YβuÞ?ÿ©­–!æÍ¼ny7ÛO^öí´,òj- ±óÃq•ºz“º>ðîøVÏYAe­m!·ã[/1pð]tíºêA Û•·˜aðf/@ø¾ùßÖ^¹·ÍÊÍðî–‰’˜¶àe§é(Ѽ¿A $AË‘¦KÙP+>[´‰&û=«ƒÉ΂vœÐ1¢n‘Bëj£4^äe‹e™‹ÄX¼HY[Ù"XAœì²µ`ýæ´¾\nXdR]šDÊ^®f6!fC 7e´“‰û>O„œ LXˆ˜˜M´geY_,ûû–‡“, .% h 2îò°n²j5ßäC1A±Ý`BiÍåVK»Lœ_äÜ®‘‘ÇC«± Ϫv‘×@Óù޼ æNU¹“ÏúY½ÈŠj¼ZæÓb^LÓx²m49 žo’²«©çuæiÀ†ÇW`÷€70HTEQ E51ƒã´¢šÐ¦ç%ªIŸPT“v`y_Tk¸ïEP,dÍ2Kª¸1ˆ”Pq£\>c8¨âFo}BÅ>‚á¸'¹›ü˘´Ö‰ô¶Üù!PJÜrŸÝºúéèm4È'ÔÛh Ø> stream xÚìyTVÕ÷ï?/°Ö›È›bÎaq5 Sô3•Ê®xí Î7Ŝȡ(½b™Y¡¦á¢)8¡L 2(“‚È<ϳ‚‚¢æû“_îµ{&æü~ÖY®‡}öÙgï}ÎÃâã~àiÄÎÎÎÈÈèjèÚµ«­­mYY: Ú4nnnÿÐ2Dt´]¬­­ÿ¡5¦¦¦žžžè4hsTWWk˜ü©KKËŒŒ ô´!üýý…ÖéééÍœ9ÓÐÐ?~ü®]»Ž=úÙgŸ); @[ÁÖÖV8ݰaî^½:oÞ<’AJ騱#Y^rr²§§çÈ‘#UîãèèˆnÝÇÄÄDØÜ²eËH#k9þü„ 8½W¯^{öìÉÎΦ{ö쩬fffþþþèLÐYd;}ú´À¨Zþøã!C†ðÙ·ß~›,/55ÕÎÎN___Y­­­ Ы ƒ888}311¹Z‹,€×jYµjUçÎ9ÛçŸGþõ¯©\hoo_]]¾ÂÂÂB¸ÛÌ™3Õ `tttppðœ9sxà¯cÇŽkÖ¬ÉÍÍõððxå•WT. <|ø0ºt„²²2am»víèëë{äÈY‰ëׯ{yy½ýöÛœ¿ÿþ‡" ܱc‡±±±²Ž92$$ý ­ÎáÇ…¬uèÐáòåË,€d|fff”8jÔ(777Y‰˜˜˜}ûöõéÓ‡/|÷ÝwCCCÓÓÓ.\¨ra  @ë2sæL¡iãÇ¿rå `ZZy_ÇŽùÔ§Ÿ~, ûõ×_“6òº?²¿„„2AKKKe422Ú¸q#@kA^&ÍÞÞ^àÍ›7鬓““<>¸bÅ $Èø¦OŸÎyºtéòÃ?äç绺º4HYMLLÈ+Ñíè8III¯«aöoßNÙ4—Cyø*…œ“'O¦Ä9sæÔ«VêJÓ²-õ½];Ãßß_¶3úQ`MM e˜7oÞã‘Áw'ÑÁyúôé³eËYãj9sæ õ'çy饗NŸ>MH2HJ¨¬ øN ³üC;H<¨®òDÎFÊéýû÷çkëU+u¥iÙ–úÞ®aoo/žÚ°aîÔBö—˜˜HgÉ9@ü¶]‡"âòö¹œüò_»}Ž1âøñã²Æ×²{÷î=zp++«èèhríÏ?ÿ\å{bkk[VV†omZuƒk@Ý·ya,X 0??ŸÎFEEQºž¾þåÈŒ+qù||¿Ù±Sç¿õ¦NzñâEY®]»¶téRCCC^¸|ùòÌÌÌ   1cƨ\èàà€/:+€djWTáïïOí³Çip@u“6!€-LFF†ìbÎÎÎB«ªª(úuëO×ky5>_>B¢2æ.X¦W»Ûg‡¾üòËÈÈH!€DbbbppðÇ,îܹ³°°ÐÅÅ¥_¿~Êhjjêé鉯º)€šs’÷‰¿íI÷´,ØÂ8::ŠÇÔ­[·ˆˆÀ˜˜:ûðáÃÑ£GÓ©5ßo¹šP |øEhý×Þ/=zôøõ×_e$HðO:ennÎy†~þüyÒÀµk׊ÍEe,--ÉIñE m  ì€Úd†¶ r°†)S¦ÌÊÊ¢³EEEzzztÊ78:2±@ÝqØíüðWGq!¯¾úª›››,€Drr²ƒƒƒˆ?cÆ LJ¤Êh```gg‡…´-¬¨¨sA5l£Aɶoß^ç΢ÊèïïÏ[’Ò‡F eœÖK0¹æ*ÐêTWW“m óÚ¶m›@ö¯={öPú`³aQI…u¿ìpêÞ£emm, »hÑ"Žß±cÇ•+Wfgg_¸paÔ¨QÊصkWGGG|ãh+H,_¾\¥d‘õ¯EÃ&0“'OVÞYT¥OÉH¦)¯@äªR5 €\I…:PŠº­Ü"öDùBí@[OOOQI==½K—.±FFF>|ø2XYYÑ)›…˯%js„]ÏZ¼leÃÇs; —.]zýúu!€)µ„„„Lœ8‘oÚ»wïÓ¿½zõRÖ@333]6h €Úä¯sPN®ÿ„(&ŠÒ„o*_¥lyšPT@ei*w¶á TùZ]žbjcc#*ùÖ[oEÔBÝB²Fg«ªª:uêô¸Ã‹N.Òþ¸p)æ?ÿ5·³sçοüò‹,€©µ¸ºº:”óŒ;–Ü3''gÕªU*Z[[àÛ€Ž  Ð"BžÃ©Y…7¹»»sz~~¾¼«ŒÂ¨(Mh ‡0 ¨QæäÉ“µ@ap cŽäžâ”ò¨"ßHüK¨bšã!¶.àY½zµÀââb:ëëëûØàŒ»\O)jÀqÌãÂóQb ïØ±c²¦Õ²nÝ:±0l”Òãââ”G~ya ½½}uu5¾ƒ´ ”]¯N¤ E‰>•“>+\E2(Š•mNŠÒÔÜ TðPqÊ \y]ƒü È”…Þ»w2,\¸Ò'ýÛ:&¥¨ÁÇÖßö‹…'N¼|ù²,€ééé×®]›?¾X¸~ýú7nxyy >\åÂÀÇãk@;@u£fb|MŒñi£lTšòÔMu¨Òë,M›ÊëöööB¬ ÎOgkjjL§¶:ˆM-nÌq5.çë•ëxa ‰ÞâÅ‹ãââ„AAAãÇ•9zô(iàž={ºt颬#GŽ Á—€ö!€ ƒ€òN,¢4 •KV)€IIIÚ,ÜSYÏ:+¯SF ¥úüóÏ…²Y“²¯EÆçÄ¥7þJ™>kßÎØØxëÖ­²™™™GŽéÛ·/çyÿý÷£¢¢¨2_}õ*`ccƒ…´Ô _þþþÊ£oÚÄäy›òСJ$…³L¯¨G¹´¶%€eee²LíÛ·O`ee%eøñÇ÷Ì[oǧ—4áqÆ÷2•É7:tè‰'d$²²²V¯^mhhÈëþlmm)™à{ï½§ì€FFF7nÄÂ@Ú´*¯ãS®€lm\šæ*‰…{⎊ҹþ ‹bß*899‰&têÔ)¼²¿k×®ÑÙ‡Ž3†N}ó¿õ %M~ìÞô…¾½|ðÝZ@"66VìùóÜsÏýüóÏ¥¥¥<+U777|7hulX`scmm-š0qâD!€$bt¶¨¨HOON]ŠL̸ÑL٥ᓅóçÏ¿~ýºÀìZüýý-,,¸’¤~>>>¤$ƒ*RΨ¨(|ChEÔ^ƒªŒÛÞÂHu¸¢Ê•×}¬®®622ê´~ýz!€eee”áèÑ£”þBßþI™7šõˆ¸ž6c¶XH/ `N-‡1â§L™’””Džhkk«ÒÇ)›hyó?¶gið@±§,‰Ú¬Ôr±Pe¨wm«û(ÖQzzzçÏŸg¼zõêÇ)ÃgŸ}öxg˜ùKÈÑ’³n6÷áåú¦ÅX®ÏÀI?eÌÍÍMKKûæ›oÄÂÀ¯¿þº°°*~?pìŸÿZâ7a„˗/ $òòò¢¢¢¦OŸ.îÝ»÷Ö­[®®® PÖ@SSSOOO|ah¤œbøOyJgqUÆà«¨¨Piˆ¢4…ñÊäšÔÐÝÝ]eibMeÝ@!J_~ù¥Àââb:Hé ;&dÜ`Lɦ£´e޵ßÿllÜ….X° ..N A"ïëë;jÔ(®üˆ#èGÒÀ7vìØQY---ðµ ù0))iΜ9B£T Q¨ò*1ü§0?SÞ¹E9 PQ…Hu(J£ü*ç”Šå„ ›Õ´ ÌÈÈéÔ©SBïÞ½K–.]úX¥?´–05»45§…ŽÈ¸ ›¶ûÏØØ˜äN@¢  ÀÉÉIlC/CrrrvvöìÙ³•ÐÀÀÀÎÎ hŒ²é(# N8ù`}P˜”ƒó÷÷ÚEg+**Ô ó±èÑ¿tJTIÁ×Ô  ¬xt-]%´ñàÁƒâ”òUmBDG=ÿüóaµýÅÆÆÒÙšššaÆѩŸ¶îVÀ´œÒ´Ü–;B®³|Ÿë9hÐ WWWY‰¬¬,zÐì‰;v\³fMQQQpp°x@2]»vuttÄ÷€  fȆæÌ™£`jZ ýa/+˜,•*GåÄ. òªC… •7uÑ €²ª,Î*‹m›@X°¶¶HzEgSSSùTصTeLÏ-KÏkÑÃÅõôÀAƒÅ|NªªÀÂZbbb¬¬¬„Ϻ¸¸Ü¾}›þíÝ»·ò;ùòË/«œZ P'€ýë‚ H5S'€œYYyÐíQí„OõSg”¢4úìîî®0$$ªl‹†•ƒ š\ uQ*4—¦ ”••ˆ¶üöÛoB¹cy|p„ùèøô•˜‘× Çú~1îò×ÂÀ… fff ,ªÅÓÓ“.‰7Þxƒžlqqñš5kT. œ4i]Žï2ºY$ý1¿}ûv ñÔ‰êÁƒýýýUN@­T•¦rÛÏ6ÇáÇ…uèÐ!00C¨?|øðƒ>x¼3ÌŠU03ÿVË׳æ/ü’kÞ¥KGGGY‹kùõ×_ÅÂÀ äææ¦¦¦~øá‡*®^½ººº_1@{eæÌ™B‚ÆÊ˜žžNgoݺEVH§Îø\Ö,€Y­sø…[Œy‡ë?jÔ¨óçÏËXRRBÆ·dÉ^hdd´iÓ¦ÊÊJ??¿W_}UYŸ{î9¼€v 9‘ПÿýïBoÞ¼Ig9Bé=zöŠK+©S³ Ë[ëØãäܳ×_KüæÎ›œœ,¸qãFddä{ï½Ç^|ñE777ÒÀýû÷“ñ)k ¹¹yHHÞ @{‚4G___Àˆˆˆ>>ž¿ýö[y¤`æÌ™Xh7ØÛÛ ßyå•WBk!äPéwîÜáñN.nÚ `nÑíV<¢bR,ßÈ-z饗N:%P°~ýzÞ †¼ãƒ òRGŒŒŒ6n܈…€v€™™™C |ÑgÞfój|N½0¯¸•W·³ýúàvMž<™üNÁÓÒÒlllD@ÀmÛ¶UUUyyy 2DYÉ‚ÝÜÜð¶Ú.²æüñÇBïÞ½ûèÉøàÛãÞM+®¯æëÀñݺ kGúÈaÿ÷¿ÿååå)h`HHÈØ±cE@@@Ò@’A• -,,xgThs8:: »éÖ­Ù `tt4­©©yíµ×èÔúMÛ"€%:pDÇ¥NŸ9‡ÛØ«W¯£G–(A‰"¶ãÔ©S333 —/_þUØÚÚ–••áå´-¬¬¬„×Lžä]1ç/ZÞH,¢£´õI©VñÉ9 }É­îҥ˶mÛŠ•ðóó=z´H¸yóf9`¢ÀÒÒ’wLEìI¼ùæ›!µ¦¥¥ÑÙ[·nuêÔ‰Nó¸Ðx,.½ÓZ‡‚Rݨ†þAcÞá¶6ìܹsEJìß¿Ÿ QD–ÏÎΦÄE‹); tðǬX±Bà7èìÙ³g)½³q—ë)EM"€%e­p¨Àì‚ò¬ü[»ö9÷ìÕ›{`ÆŒ111 HÒ·|ùr}}}^÷·aÆòòòððpòee ìÚµ«££#Þ+€®%Ëˉ'XÉnút¦AÝ¥<nii)ž;wîÁƒÎÎÎd|Ê8räHê^|hÓ¸}ûvñÐzamm-Üä½÷Þ˜••EgsrrôôôèÔ9¿ˆfÀòÊ&>šJ2·ÔÅÕóe³¿ý5*000_ WW×Aƒ‰Y£iiiwîÜY½zµ²Μ9 h€úûûo¨¥¢¢¢«§;‘ÚS]]-ï[òÝwß ,//§ ¿ÿþûãí._èw-©°¹ðvÓM.€qiű©Åë7mílü×¢¿Ï?ÿ<11QY© E@À›7oæååMš4IÙ©ç7n܈…ÔKu„¶(€äÎÂGôôô¼½½Y#""ÖòñÇÓ©Ysµ€Vܹ×$Çí;÷šIcRŠ.]Mž=o‘˜úÃ?ä)‘@z(ÖýýöÛoþù§ŸŸŸ™™™²š˜˜DEEáÛ °¹±µµ&2tèÐK—.±&''?ªÝ¦[·nw†ùãDË`eUcŠªæ@êê7ÏàQoŒá~4hÐéÓ§•50 `̘1" `FFu©£££òÂ@###êj|ÁÀÓƒ¿¿ÿòåË_ÉT~~¾–XQQq¥u…SQTàäÉ“¹pº‘†ðÜIIITý«\1*áàÁƒê.¡l\=Ê£¹>ºƒ©©©ÐÅ‹ ,..¦³¾¾¾”Þ¡ƒaTbA `McŽ–@ê ꓟ·;uïÑ‹{oÒ¤IQQQ¹J:tÈØØ˜2899qŸ“ëÙÙÙ), d=àiP?r+å©qýû÷'¥ÒF5½Í™3‡ŠR.Ÿ –'Õá[е*+æîî®|‰2:î€$rm]]]…Þ¿Ÿ2Rú¿&Ô’x§º¦ÁG `dBAHTÆÜ/–éÕ†044üæ›oÒÒÒ—z{{'&&&$$ÄÇÇÇÆÆ~õÕWò ~€§ƒÊb%F…²É!ÿ €BÍT®2t @…ke‹¤Ï²H‰»wï–P¼*-;À€§M£•÷{.ÆÓ/y®^(†ÿTnÛ¢P•¸}ûví¯jsxøðaá Ï<󌟟 àÕ«WélMMÍûï¿O§-ý¶ð^V‡ŽàÓÇQàÿøãì'M³ây{{Ëøá‡ŠÎ·°°À¯ÐîIJJªoL‡z  :MSézò…*•¯jë8sæLá ï¼óNpp0 oGY\\LVH§Nœ l]¬¹ÿPã¡+xÊ;”ºK__?%%E ½½=%¾ûî»þþþ²öìÙSt¾ƒƒ~€v˜K©rþg#Pä$MÛ 1J(ö©ó»v&€r4ºo¿ýV`yyù£'h»÷èu5!¿Õðþµ‡îà׫ ›0aB–¯²¤CÀ}ûöÉ›¯&$$à·h÷]¢Í'€Z"×áiÀ¹ùd%,€aaak™1c¥2ýsÀªÀ×^óý§Ÿ~ö—œœ¬_ÂÃÃCÀ¹s犞711Á¯lBì¯O›òÔDfРAÁµrl‹²²²çŸžNíÚïª+øðχ?tJ/E¦s(@êÆÌ'ìÞ½›RFŒ( ààÁƒEçÛÚÚâWxؾ}{  ö Ÿ*4332kÖ,!€EEEt6 €ÒÉh.Geè” tM·í:D=6pàÀL ÞéeÉ’%²ºººêéé‰Î—ƒŒÐŽÑÆÑèÏcòDÊYß]@E„AÍ›À<˜‘‘!ÏÿÜ·oŸÀû÷ïS†eË–=Þr¬å•ø|ÀÇõ×AœòÑ4v½ cccJtvv–ð›o¾=oddT]]_à)¡NGy ¤»€<­Q]ù].çi÷èää$¤k×®AAA,€±±±t¶²²räÈ‘tÊ~ƒƒ àŸ:)€Ýzô¢;yò¤°?úL)Ï=÷u¬,€ãÆomm_àé¡ÎP} †X/òHwQY8IŸÊ@„@Ÿ×gee%„> ÌÍÍ¥³©©©¯®®600òÓO? ¬ªª¢ [·n¥ô—^~%".OçP'7Yøå·Ôc~øaºÄСC)qÛ¶m²nÞ¼Yž|[VV†_à©BXù}¦¿“Iâ<(ìLv½z à£'ÁìÄ%¼œ An¨¼±Á¨p;B‡===E%õôôÈJX#""èlMMÍûï¿O§>ÿb©n  ‡6bõ‰³°¿°°0J!ÑpÚ´i¢ó-,,ðõO³*C%¯Î«¯²” ׫³üF à#iáa}78m1lllDõÌÍ̓j!I!m¡³EEE:u¢S‡\}tJu6üŰDį̂¨¨´'üøã”2vìØYûöí+:ãÆøî€§úóxòäÉ’ODîS¶'’5YS˜´¹}ûvNW¹ßK~~>ùÉ…ó€ :!¥³êVjÎ@÷ QÙ„VÇÄÄD8ȲeË„–––ÒÙ#GŽPz§ÎÆá±y:#€u­+€ßÿäÈ*&Á;½¬[·N@gggù?ðÅ@æMR¸¼ßËÓFTT”ì ÇŽc¼|ùòÃZx4v⤩º#€Ú­(€LþˆW}¦>!..N¿6(¼‡‡‡,€¶¶¶¢çIÃñM4+7nÒ¿@*++4húqëï:"€Z­&€:Ry{{ 䑾„……É8bÄÑù$ƒxÍŠ………pY³f ,**¢³ÙÙÙ|ê¥!¯ìs>ÝêX}¯>Gkàî'¨»zôè‘"1sæLJ\°`,€dˆ\ƒñôôÄÛh>äøï„£££À7npžð&0Ä”¦y^k-¬º{¿¾GË à¼˨£>þøcYÉ9ÆŸ,€ëÖ­=o``P]]ІŒ9R¶?rÀZXCCCsrr>|H™ïܹ³`Á®êÐÁpÙ7ßµ¼6øha|ÑôñŒÙßÿ=ù ^^^”bddtåÊY---Eç[YYá49ÖÖÖ*C` 4ÈÑÑQìJ³Ü¼y“/LIIyçwþÚ±ä…~;ö¸´˜’Ä5æh1<{!œ:G__?&&Fà²eÇ©ÏðÙgŸ=ïää„7ЄTWWÛÛÛ(«ßo¼ñüóÏóç±cǺ»»³^ª%66¶²²’ 9yòdŸ>}8ç˜wÞõôhnl’£epåšMÔ-¤ÉÉæææ^@m¹ÿÉÊñ~š 77·®]»*«ßСCéTff&© é¡‘‘%êééÍž=ÛÏÏðr-ééé555\ÚÊ•+;tèÀ£]ó-¿—ÓLx»ÖÝšähóÎãYkÖ¬IzBDD÷3§ œ5k–x#GŽÄû h¢¢¢ä­>ÆÆÆ?ýôSÖߡ̟}ögèÖ­ÛÆ…’¹Îˆ±ªÜÜÜiÓ¦qÎÎÆ]¶î<ÐØ´G³ `Øõ,½Ú`$ÎBùåJyýõשceìß¿¿xäÝxK„dÍÆÆFYýôõõ¿øâ‹˜˜˜,5œ={öÕW_C„`$BCC£££oݺŷ 433ãœ#ÌGŸñ½Ü„ØGó àŽß]¨þùÏ&JLž<™íììd<~ü¸ü8èÞU@cظq#ÏçT`„ —.]ÊÒ‚Ý»w‹Y£$2gΜa$HdÈnDäGGÇÎ;sÎé³m"®§5…6ËÑ|øéŒ¹Ôü… Êhhø8(::ZÀ7ÞxC<¼±€@Ò!G—ÚÛÛËfWRRÂâö矖——“ jÐ@’—>ø€‹"Ù²e‹@"22²°°++ÖþsÐ`×S> Àæ?š\Oy×Iì ñùçŸSâܹse àˆŠ Ù:Þ[@½(++³µµUÝoΜ9äeÂæ îÞ½«pùýû÷I ³5âææöòË/s™¯½öÚÑ£GY#j¡[ܾ}›KswwïÛ·/çœø¯‡E%ÕC[êhZ\²l%O”—xá…8ÆŸ,€âшi´  ŽŽŽ*C)£PlÉ£ p¸ù(jé† „ýùúú²âQ·ÈÈÛÂ0–––x{ZB~'6á”éÙ³çï¿ÿ.¬-77÷Ö­[>Ô¦L’DRE ˜°téR^HŠggg'ðêÕ«d:yyy<¿´  @øNß~¸¸jÀ–?šD/]MæÅäwBííí)åý÷߉‰‘°[·nâ1‘¹ãÔIFF†•••Êå~dd©©©²²]¿~½^…“*’3j ?~<ßtÀ€»víb$"##ÉzJJJ¸´K—.½òÊ+ J¾ýŽp„Jl­£ñø£Ã®ÇQ0FŒˆ“xýõ×)ñ—_~‘ðàÁƒò⇈7 êêj±3§Ó¦M#ÑÈUâ·ß~;räY›6åWUUùøø;v,W Ž=úâ‹/Ч§OŸf$¨&‰‰‰\쯿þjll\…Ð`Á⥠)9²¶îÑHœôokj×—_~)ìšÏc‚¤É²þ÷¿ÿËÌÌ /3@‡V¹Üï•W^ñööV§iîîî¿ÕræÌ±U‹JÂÃÃ÷ìÙC9é’\­1õôôfΜÀH\»v-##ƒ–••}ñÅ\á.]žsÜíÄØúGã°ƒaGj‘««kì¶nÝJ)¯¾új||¼,€/½ô’xdöööxŸ* 9r¤²úïØ±CÖ±›7o>x𠺺º°°P$’†<’Ùíܹ388øþýû 姤¤âüÅK¤­4TŸ£†ôèÑ#V‚gç._¾\@2tùÁÑÅ[ P   ÀÚÚZYýôõõ—.]šžžž÷25kTVVÒå"Cxxø¾}ûÈòè߸¸8ÎCW¹¹¹ñ!IJff¦ÈOÖ&â<|øðÖ­[yñóó{óÍ7¹zƒþã?X£k!*++ãÒ\]]{õêÅ9§Ïœ“˜š›_«`­{4@ç/ZNM˜:ujŒDçÎ)ñرcÔÉBy[¦k×®x±2$_bv¥“&Mâý6²¼ªª*•…(ˆ[NNÎ… vîÜIºwôèQ___V¿'N$&&ÊVTTð˜LMMÍ74kàÁƒMLLD¤ƒóçϳ^¯%--íÎ;ܺuëÖñZ9ÃŽ׬ûü«Õú  é?_âý<…ý?~œRž{î9 haa!ßÌ™3ñznnnB£d äêê*l+??ÿöíÛʦ¦YÜÈÂÄÂ@òµÈÈHÙàJKK5ÇŒàù¥0##cÍš5¬®¤x666ááá×%²³³y*™æ”)S¸iýú8îv6—,¬ú ÷Å«ÜÀˆˆÑ´ùóçS¢µµµPBÀ°°0ŽŠÈÐÃÅ F‹]ºtùá‡ò%Š‹‹9âž–¸‰Ëccc/]º$XRRBª¨MQ¤œ¤oùê!š6mW¾{÷î[¶l‘̈*Ãêêçç'6H±|wbTL ‰XkÚ àúMۨ£G–Û5dÈJܹs§H!ܳgxŽbb-à©¥¬¬ÌÖÖVår¿… &&&*Ö©S§BBB”wtQ)ÛÅ‹Õùù`jjj½*|ïÞ½ôôô|xzzš››sCFŒqìØ1Y—âããËË˹´;vr¨ˆ/—Û¥fåÔŽoùCK;î]ªíªU«DsÈdYñÂÃã%>ýôSñ4---ñªð”ãàà r¹ß˜1cUºoÞ²ÿþ¤¤$Í…“$ïܹ“2«35rI*Ê1Ü5·oß>º*_ öîÝ+Xüç?ÿ¹pá‚ìGiii¼†‘˜T—³õìÕ{“3¹X«u `d|/`$à Y»v-¥Œ;öÚßéÞ½»x ŽŽŽxÛxj!ƒ055UV¿~ýú¹¸¸<¡°°ðv-ôSòòò.^¼È‘û\]])Eeù¤‡¼ùçÁƒIF $ŠŠŠÄg²°'NðÂ@???u»ÊžƒJÄÄÄhGVVÖ7ß|Ã!ì;tè°dÉ’è¿CÅòhfTTÔ믿þW|ù1ïø…gÜjé£.ÜïâFÕëÓ§ÜŽp±zõê( rjù±fddàà)„\ÀÒÒRYý ×®]+ÛSYY™XîGJKKÅ)*„’ÅÍ××W7:Kb(¢ûÉ–””ܽ{÷Ñ“…" ‘’3FFF*T¸¢¢ÂËË‹ïåááA·–]²²²’2?U ã|ÀÍ${Ú±c‡kÞãŠÍž-*/vz¡Ç)±hÑ"ñdÉôñÚð´ABgggÇÃa LŸ>=))IÙÔ D:%²ÅÅÅ9r„¼ì÷߈ˆ !ÈG”MM.Šwt‘Ål‘]\\²²²ÕN" ¡Â)‘nD·“µ®¼¼\lJ~J­Ó<HòøòË/s{Gíææ&k`||ü­[·XNW­ZõW¨ÃŽÿ[ó}F^YK°GÏÇq ©CDµé3¥ 0àêß>|¸x¸ôÐñòðTáèè(ÄÉŒ5êüùó…O Sãy  ”M\råÊžíÉ?~<11±PB65(ÄMäÌÌÌ”ûöïßÏÂaaar¥¥¥*w¡¹wïÞ7 5âàà úáÓO? ”gN¦¤¤ðn™$Œ~ø!gëÛ¯ÿÎߥ疵ءRÏø^扬r…y§— \‘ð÷÷—1ýˆ÷€§úûßÌÌLYýzõêåää$Ë‘6ÑýÊFZ'.ÌÏϧ»¯‘}hcjšÅü‘,’—û]¸p!;;[œR74)SUU%û©2ÉÉÉË–- W®\õwrssyîkHHˆJ3íõÓÞ¤f-s(  ÝªõT &ÈUå^öîÝ.±zõjñ”ŒŒðài   ÀÚÚZYý:vìHÖ“••%kQXX‰O½Ê§üê$‹”gTj‰[qq±(!222==]𬬬ÔÞOyã Ü?ž;äÅ_ܽ{·¼†.::šîÈ¥9;;‹…ŸL›™HvÖ‡‚¾:r4U`Íš5¢’'OždÅ û;ãÆÏzæÌ™ø"о©®®¶··W¹ÜÏÊÊŠ·=Qàܹs¿ýöÛùóç+**ê,ŸòPNÊ_¤†ŒŒŒ}ûöEEEi_gʪ®ÀðððúúirrrQ]¸ººŠÝPÇŒsæÌYEÄ@^È ;.·û_lJ> ZsBãSyYb@@€ÂN/}ôQ¨D`` o Ã>|_Ú1ô7¿Êå~Æ #ËîS\\|ãÆ ñcBB‚ØÑ…DbÇŽâ‰PWà@»$**jäÈ‘Êê×¥K—]»vÉÊóüùçŸwîÜ!éd¼£ËÒÒÒʧ”C‡ñÆ,”S.°´´ôîÝ»T¬HÉÉÉñññá]Ô‰%Ò)^îçççG—ˆËKJJTú)å¼té’:?%S ¤<”óäÉ“EZC–'ÂÁwêÔiÍš5 ûjRÝxa uò¨Q£8ç«#G=åôXÓšïx,€“?|<•wîܹ¢>d©¤«”èëë{YbÚ´iâ¹[XXàK@û£  ÀÆÆFYýôõõ/^LòRü„²²²ššùZ2A7‘!77—\ŒêÔ©S$b”‡þ¥Ï"b;åùIÓäY¨pº…8›ššJ"¦,nô~¦FÙÄ%t/^îÇ~J?ŠS$>ÂO“’’”ý—Ïîß¿ÿúõëÅÔ@ªùf±FBCCßzë-îºÁƒS9²^»v{ƒ8qâDÏž=9çûLŽˆ'Mk¾£³ñãEˆ...¢2ßÿ=dz¸ôwLLLÄÓwppÀW€öDuuõÆy£ï¾û.™‚lj<•Q% â–™™ÉâFœ>}š?(› šÊYH év"'é˜:Œ¯…M•MMDŸ~*‹[aaáÅ‹ÙÉÂèÇGÒ$Òßÿ=00EþÒÒRYxI<åfªÄÙÙYhÔøñã½½½å TùÛ·osϯ[·Ž’h/Xòյļ„ŒM~9éE·èÞ½»\ m¿lÙ²`‰ãÇË/@FF¾ ´<==åÁK/½äææ¦<¦VgêÄM¥©©‹îÇÐíè¦òøÝ¥K—xa ›ý(¨`j (ˆù©‘>ÞÅÅ…ÔÏÕÕ5%%E®d«ÜLe¨“?ÿüs±0:6BB^H9ß~ûmÎùòÐá‡OxƧ—4ÕAR±òÝwîÜI)½{÷ü;C‡oÂÂ… 댙€Ž nZ#ù ƒƒƒ¿¿ÿSÛ9vvvÿPżyóRSS,†|áСCÊ;º¨£¢¢âܹsäVê´èôéÓõÚ[òþýû v&“™™©et?!nUUU²¸%&&Ê*O"ÕÀÇoß¾]¢ÒUsss±“ª³³³¬dÇÅÅÅ\õLß¾}9ç{'û\K+näË£—.]79s&%~úé§gÏžåP ©qZ-YYYùùù¼K~±]¦  €DÏÞÞÞÊÊJÄk“¡D:E<==)óÓÐ'$¿ÊýðöÛo_¾|Y¥¿Ê)ìè¢ÁÔDˆ È;ºi3lÇËýÈ(Õ•vñâÅzù)oGCR£®À:›©,¼111%uA­Á5þýïÓû.+¶9Ý´iÏÏ$û¯ÍâÈ”ØÔâë7m£¢^{í5ùv  ÄíÛ·_”X½zµx ©çÓ” Ý&wÖã‚|ÐÑÑÑÆÆÆÂÂBÙƒŒŒŒ(ÝÎÎÎÉÉ©^QÈÛ 3?û÷ïôèÑÉÍ͹¨·äääð›ÑÑÑòå·nÝ*--?ÒYÎÉ;º¨«g^^Þ±cÇØ#""ÔÕJÓÒO©Úôô¹$€ê ÔÜL•ÂK6wC òóóW®\i``@ÝNŠ·`Á‚àà`ÙËRSSyrlYYÙüùóÅÂÀÿ­ý1&¥¨aÇÛãÞ¥B¾üòKqwwwŽñçååå'!¿'NLÓHQQ@›#!!ÁÍÍÍÞÞž¼OeôóÞ½{=ZË%fmÙ|õôô´”"))‰WÌ‘¸Év\XXxâÄ Þ˜…¼‰·OaÈûx«^1wóæMN§<”“Ç ÉòÈõäò$R±ƒ(é§(J gÁ Uú))žÊ‡uõêUYž"·‹n'ûiLLŒØqTÃá¥l «™ÄÄÄ©S§rÿ›˜˜lÙ²%L‚T—šÃÛãg )3ýçK{¹]O)ª×›ÝÁ°#]Nv,nñõ×_S •|áïð°#óã?¦i=ŽzÍ¿@§(++#•°¶¶îÓ§Ïÿù?ÿGü=|òäÉv)€<äî¿Ap†Ã‡“‘8°yy{{+˜ZUU•‚pÄ@•âFÆG"Æcj<¢§lj ³pà ÙOy?O=YÜäèó”®04ɳü”~JÍÌÊÊ’[!bR=É7óóó„W¡™*9{öìË/¿Ìàµ×^£šËIyøv¾¾¾ük¦î;ïzúGD'jyì=x’5S.œnG‰ëÖ­“íï—_~‘ß ê¨4íÈÎÎnOÿ=žè/Þ7Ž9Ryp„ í©¥²<˜?ìÙ³‡äå¦vˆPzlj©©©r25 !HÜȼDf²H!nbL‡\àíÛ·ÕmÌBö!×\ÁOY0©ª$n"™#M*ø)I¨È“——çãã#û)Ý‹Î)dÍä>"3ÕAAxš©’-[¶ˆqgkkëóçÏ˦'RÎÎ;óÂÀOgÌ ŠHº–TXçA9é’3fˆ2Ilõôô(ÑÕÕõ¼Ý]¼æææiõ„Ú‚ß!@Ç! M˜9s¦ÂäOÒÀ±cÇòg{{ûvÖjYgÍš%B¿mذ:ä¦Ödddœ9sFÁÔÊË˵Ü!DAܨ7252¬:MMYÜH9Õùi¦¦ÙOÉmÉ•Ø"yLðСC±±±r«IÓÔ ¯B3UvãòåËÅÂ@[[Ûп“’’".Y²„õ­ƒaÇå߬J,Ô|tïÑ‹2SEi›6mâ8¾§wïÞâ­X±bEZý{™ S¨ì#$$¤?³y“|ÂÉÉ©ý5_Aƒ‚‚¾ýö[þ‘ü¢ÎA+Í.S¯š…É·#qS05²'í—˜=xðàöíÛâr*ÊÓÓ311QKSÓÆOICBBê+¼Ñ^s×EGGO˜0ŸÂ€de#"""òòò”š¼Ðoû—ÈĕǙ á,•¢¨÷ߟcüyKüñÇòwÁÇÇ'­AÀ€Ž a°dP,£?ûy.œåo—]¡,€ÄÏ?ÿÌCKÔE%%%¥ âĉÊ;ºhàÚµk”_]iW®\¹p႘© $}IIIê Ô°ã¨:q#¿—߸q£°°PüHêZçФ²ŸjîÀ“'OŠ`%o¾ù&ý")fZúúúš™™qÎQoŒ9q6èjB±웵tvܸqr!ݺu£DGGG/ 1 LôìÙ3­À@+Rç`Ÿ‚$òØŠ‘‘‘§§g{í•ü믿>óÌ3¼?$ÀÕ*„g]Ö)ndjÔÿ¼ROƒòÂÀ«W¯ÖÙ(Ò1^îGW©+ðÀÚûéýû÷/_¾ìææÖ„~“žž^g7nÚ´‰Þ@Þ£uúôéäz²ÁÅÅÅUVVrNNN¼0ødúçþa‰WâóÅ1ìÕQ”¾jÕ*q-ô=÷Üsžgøðáò+‘Ö8à€ %Ñr°Où*R¡¿½Ûk@ÍHìß¿ŸúJíÒúû_„„ SžIÆ$6f¹xñ¢Â˜Ú;wèAˆ”ððpÞÑÅÙÙY]¨w65^ñG·ÎÉÉQW7± ï袡‹È­(§‡‡G~ª²™ ˆ˜†‰‰‰Útcff¦•ëÔ©ÓÊ•+/ÿê ^X]]½bÅŠ¿v0\ðå·—"3"âòé_=}}J¤ÞWÍ™3‡R¦L™rNâÔ©S|9ãââ’Öhnß¾_D Y©×`Ÿ<õÎÄĤ¾ ÙÚ“^ºt‰Šg ’§¦¦–———ÕŸ˜˜^ˆ›Ú®]»(ÝÍÍ-77W¾D,÷{øð!k STT$"M¸»»+„z¦F7¢›ÊòN¤tS’‘˜••E·¦üT ªŒ²¸ÑíNž<Éf*H]QUUE–*R"""ØOéî)))*{›LÓÓÓ“ëïååEå‹Ëå¢TBŽùÖ[oñ“4hО={d$;I{ÿõ¯qÎn=zmÞ¶—¾J¾„~¤ÄM›6•Xµj•x ããã/€ô%R·k+ ¦aƒ} D÷±ò´{û«SINŸ>Ý¿ õóó#…i€Þ¼y“Jã9·k×®±©:tˆCÁÔ”eÔL¾¯7ââÅ‹d‹bLnÈû…2d| fw÷î]Ùd©P7º0MŸ‚‚ÙÔd?% ”ýTì8JæH?ÊM ÑçɦåVóN¤ ÍT ½áü~ï¼óއ‡Ç% ’DñŸÔ"¶`‡†ôïìÙ³ENº·R=ÏHP™â}7n\ZAˆ_P IhÌ`ŸrQ¼ÞŠJ«×…íX __ß7ß|“ó888þ”5²R ¶*å1525žÇ¨Ž{÷î©7F$¨pÙÔ(3¹žÊ¢È¶¨bÐý”팄ˆšÌŸOœ8‘žž®`jʇ’±Êâ–››Kz%¯$¯1 £££5 ¯B3•),,\·nXHZçïï/k`\\Õ“KsvvîÞ½;?»ýû÷‹<+W®ä ó§ÿγÏ>+Þ‡ü1­éÀDPÐ`šd°OOOOŽ¿fiiIvð”ô¤6È{†LŸ>]Ä('©!I¹Õ RSSéÅÅÅ"Eƒ©)C9åÒxXíØ±cT¬œ®MÌž_*.!y$Õeq#_‹• T94)Cö*÷Irr2ïlåȭVšÔÐLe¨ü¹sçò!k£×>øïºrùôbóâAù,ô-_¾ÜCbóæÍò·‰ ½ 033¿¸@½hÂÁ>èr¶?*ê©êRYû÷ïO² NIÖ¯_Ï;„˜™™ÑŸô¤· 9QVVV½ê¬ n7oÞ” $ Ó2ºÃ/Åår™T æ¡I âFE999‘[åååÕWxI`åfªÄÏÏÏÜÜœßСCé^²åÑ#£ûR"ýðÃE:]ÅÛûÐ)w z"JKkjĆ¥¨£9ûpttä2mmmŸ¶îµ··—{•P†……~ü¸:$.\¸0lØ0±$·Ö,o($D b×®]tÇúN¾½wïžÂÝId¨4''§ÄÄÄ:/ŒŒäå~ꪗ’’Â×ܸqC›údgg9r„ŠUW U¯^Í$¿#?­³‹ŠŠV­ZÅ£ØÏ<ó̼yóè1©aêÔ©”í¿ÿý¯›Y¤üÐCIk´KížìSÀÆÆ†oA¾ð4»¶ØXò¯ØݺQ‡¨Àðððˆˆˆ?þX, ¼sçNeeey# ÏâstßØØØzÕŸwt‘’‡w†!“ÍÏÏWyUzzº³³³Þ'W†W82%%%gÏžåu|šÅL·¸¡['$$¨k)Û.5óÚµkšÛE÷¢;RiоYîˆçŸþ§Ÿ~R)€üýÚ¼yó‰'DGGoß¾]¼={öLk´ôhо¤eûþºæOžžžOù#ÈÈÈPpÀgžyfÿþýøþûïÅ’@*A¶°†qåÊ¡AÜÔÁ EQ………BÜèùÊ«ÏÈAÜÝÝù”ŸŸ)ž¸JlÌÂ/E:™‹ðSeq¦FÈï¨ær£îÖ"û©ØeTC3E¤ ÞŽFŸªÄËËK€077?tèP ýHé;vt­…z€¿bVVVâéòÉ'Í$€¹¹¹øðÒòƒ} ØÚÚòB6R<~"äqò³ ¹ûå—_4 ùš‹‹ Gà%ìM·Ù)‰JqÓª]"JKOOçø€$\Tm:%LíÔ©S999ò­ïÝ»§P¥ÈÍ~zäȺ–ó‰Ä””¹@9fG §ŠŠŠÎŸ?¯²™¤„$†\gê|ÁáòÚF…fªdÛ¶mâËõŸÿüçܹs,€‹-¢”÷ߟ\5;;›oJuÓ×מZ”ÖlÔk‹Цi•Á>•ØÛÛ“ï´€i¶-”7e\»v­$|||Ìùíììªj¹Ý8H¯x)ÉZ½vtQ)nׯ_gGcœLMÝÆ,”.7‡ü”Š’ÄM˜õƒ\ Ù™Êêü”›yëÖ-*“+IzH’(rRs”WÏ)4S™ÜÜÜ+Vˆ… . `Íß²e‹(°¤¤dÍš5â¡“ ÆÇÇ7Ÿ’Æâ»оµ¢uû€öTWW[ZZþãï¬ZµJƒ^½z•N}òÉ'â±&$$\4r( Mãez¤o)))õj/ T7*GaL­Îè~ å!mQöSžDJ…˦¦<’X/?%%$1”ûáîÝ»üTn¦Jâââ&L˜ÀO§_¿~-  ˆA 80­™´E0Ø÷4àèè¨à€&&&îîîš0::šäbÈ!bg˜êêj l<ñññüñ©“‹‹Kâ¦O¼E•––úûûóÀ" ‘ÊuÂÔˆsçΕ””ˆËïܹCn%~ÌÎΖýTÃÒB:Ë“Z)¿ºfÒ86ͤ ”#Ê…PõD5îß¿OÏåìÙ³gΜQÀˆç»xñb `°ïiÃÉÉI@tèÐaçΚ¸~ýúüùóù33³„„ l¼–——‹hêÄM ÕÈËËã°€T êÇÔDÀ>’,¹b¹O¼TöSúWYÜ„©Q¯RNeY«¯ŸR"âÊÑ%BNÅ&ŸTOr.OOOXeÜ·oŸüp]]]!€O9ì{Ê QxôÄÒ¥Kë@ÂÙÙ¹OŸ>¼3Œ££#•Fb"Sƒ)))!£a? â¦% â–””$v¥j§¦¦²ÇÑÔ@ù¾Ê³aÝ»wOöSê1?•M4“òÈ#‰rÌu~ªÐLú@?r:e lÊrJ°Ez{{«À… ŠgjllœÖü@t öAFF†B˜xbüøñ—/_Ö,€111dCVVVbg*ЧbÞi 233E0>º]½EÕ`enß¾ÊC~bLÞs‘AžQ© ‰›Ü(2>Ô´KÄ|§t¹þÊÑýºÝNdKNNf?¥êEÕÂõ¤D:%²Q„œÒgÒs___ïZÔ  ¹¹¹x S¦LiÌÍÍÅ @GÀ`PGuuµµµµ‚<ØÇÇG³ÆÖ²mÛ6ÞÆÀÀÀÞÞžJ#Ç¡›Dév¼£Ë‘#Grrrê« âvᲤ¢¢"mLMYÜäF ?¥é³\ 61#d?%"""„ŸÒúQ¥œ’’R+Ο?¯Y;Æa™;w¶€Ö7–hr0Ø´„ÞìÔ©ÓêÀ¸¸¸€€€É“'óU¦¦¦¤$ÊŽÓ`è- ≗¤9åååõjWVV–º’‹‹‹å)šÚ@ùåñ;rR¹@–߆ù)5ób-òФ,§¤Wþþþ~~~ÚàêÕ«ÅsÔ××oÄï€Vƒ} a¸¹¹uìØQ~gôôôÖ¬YS§¤d‹/¼ð_hmm]PPÀk誚’5žÀyùòem<+??ÿèÑ£Ô(ueòðbRR’–ýCîIž•žž®®Àúú)µ‚¼IeQݳUVVFDDek/€|ðxˆo¾ùfZ‹Pßø† 1`°4ž„„SSS…¡ÀO?ýTL¨eéÒ¥¼¹¨‘‘½žLžl $ù:räoá¢AÜÈD¼¼¼xFehh¨†Òx`ñøñãš§/RýÉ:9³~ªÍÆ5¼²ŸÊËýîß¿O}X/ìÒ¥‹x|ëÖ­kÔ~ô4 öæx©,,,pÈ!dÚ`bbâ¥K—Þxã '"$$äѓɓM•+WD‡üü|¹òä d|ljîîîtV¾°¦¦†wt)7oÞ;º^©âÆò:Dò5jÂ8ì¶²Ÿjظ†d“¼Olü".§¢Ä”Ô?ÿü3//z288¸¾hcc#?;º°ì/33߀fƒ} ¹±µµUpÀ:¬]»VLª…ìÆØØ˜¯¥7“^KžZÝ”——_¼x‘ÅÍËË‹Ånʦæââ’’’"ç—gT²'’гÙÙÙ,n{÷#Y<‰”M-,,ŒCEˆåq:ù^ôõäjе cR " ©\ii©¸Š 5¼uëVxx8‰s}ð§Ÿ~³p™¶Ìð_}ƒ6Í`°´0Ê‘â‰I“&‘•h#€ÉÉÉ”gÞ¼y|¡‘‘ø¨v+˦ÒÀ‚‚ƒã°“©]½zUÎ#ϨT€œKÖ@!nTÕ_L"U05ºDy®#žý”ÄMÁO©|LJqssËËËS)§T8u)Éfhh( U‰¯Niû£^— Á`°èÔÛH¯¢²\ÌŸ?_KL­åÇ3B-,,ø5f l}:;oĪNíííÿßÿûÊOgèС®®®i-E}cs€Gì: ½ "ˆ—_~ùôéÓZ i]²d‰¡¡!_nee•‘‘Ñ„(ÈÌÌT·£‹:HÁòóóÕH•¯oÑÝåèû«RNI I¢é»/pýúõ:uâ.zçw<<Ý…3¸Ý¾}[\+g¦tº]\\ `xxøâÅ‹;tèÀËýè÷Ã… ä]@…nÞ¼¹wïÞÊê×·o_jHZk€ÿªPƒ} ]þo†Êa&OžL¢ €urüøqsss.ÔRD‹h ¼uët`q»{÷nyyù¹sç„©q;vìwèííýÙgŸ© ñ0kÖ¬^î'SPP€÷ƒ}ài#!!AygŽ÷çåå•\zôè!bÇÛÛÛó1¤`5&::šL0++KN§ÂëÜÇ’UT\"y·Ò7¹@y±¤¤$V‚´nÚ´ib +VˆM`𫯾Ûʘ››ûøø¤µ$³ØöO-ì€^uå¡@}}ý… ^¿~=©þìØ±ãÕW_[ÄÐ÷‹LóQíH\#°¢¢Bþ±^á•5TˆLM.SF¬¬¬Œ‹‹‹‘ §ãå~ÄÔ©Sýüüä]@…’Q0@Yýzöì¹sçδV…ÜYÃP)@{ƒ}ÈXZZ*;Ë /¼ðÇ$677·É“'‹¢¬¬¬üýý=Y—×$PaaaÚ å¤ü*‹’]’~LNNŽ– §{ñŹ!Ç?vì˜8%  ——×øñãU.÷[±bE|||ëÚ_vv65o;ž0Ø€f<==¾bs˜ððð„4}út1pfffF_ÃGOv‰i$$€ ;ºh€ ˆrR~…Bä¤T«œœœkçÎ3fŒØ+ÕÁÁášôÛ#44tîܹ*—ûMœ8‘Φµ6¹¹¹ ;ä´K0Ø@½þŸÄÎÎNÙb8d||C £bÅò@ŽÁËã€" ««kqq±ÊFQú©S§x¹_DD„|¹ìDÔöH ²¶Y³f±ÓÑ¿óæÍ£”HUÐo•Ëý†JµJÓ `hßÄb°€¢rs˜#F¸¸¸Ä5‚Í›7¿üòËòò@ÒÀÆ VVVòŽ./^¼sçŽh}¦>E7*//W©~TBLLÌU‰ï¿ÿ^8Ý„ |||®ª‚zcذaÊell¼uëÖ4Ý€÷áÁ[ €öûhBTnCŒ;–„¨1¸ÿþ÷Þ{OhbbB÷ÊÈÈ`|Ð ŠŠŠÄ0ß•+WîÞ½Kÿòà ¥ÓY‘“n!„ˆL0999Bbß¾}ƒæŠ 0€~ŒP…——×”)S”;G__ßÆÆ¦Õ—û ÔŠ´Q0Ø@ó¡nsÞóâÅ‹±€.·µµíÓ§(“îåääT]]Ý` LMM=xðàoO Ï”"gêGòòòÂ%<=='NœÈ5éÔ©“]¸,X V5ÊŒ7. Mg¸qãÞa´0Ø@‹¡ns}}ýùóç_¾|9¦q8;;Oš4‰JmllBBBx…`}¹wï^DDÄÞ½{ÃÂÂ8@¼ø-ºuëå {BPPÐ_|ÁN§§§7cÆŒóçχ©bË–-&&&Ê]1pà@%¯;Pñê MƒÁ>Z‹êêj•3BÉ›¾úê+ò©ëƒJX·nÝ!CDɦ¦¦tS^Âö°È+à¨!ÑÑÑ!›6mêÖ­›øeräÈ‘UPºÊu‘†††«V­Ò)õËÌ̬ªªÂK €6 ûÐÿ„±³³Cu2Ý»w_»vmtSpêÔ©Ù³gwîÜYnaaA&˜žžÞöÇD/I¸¸¸ˆ_,Ï?ÿüÏ?ÿ|IÞÞÞÓ¦MS9vÖ¬Yô J§ì///¡ÞÐÿÎÄ`ºIAAJ!zñÅwìØq­‰øá‡V ššš’FFFjc‚ Ëý‚%¼¼¼¦NÊe>óÌ3‹/VÃòåËŸ}öYå–¾ùæ›>>>i:ÆÍ›7ñ~  Á>Ú VVV*5pøðá*¦7Œ   µk×’ Ê#ükÁÍÍ­ªªêOUˆzÞ¾}›Wù -ZDÒÇåPÜÝ݃T±mÛ¶þýû+·®gÏž;wîÔ5õËÈȨ¬¬Äk ݃}´]BBB,,,Tj ‰‰Éwß}Õ¤ìØ±ãÃ?ìÞ½»¸‹Iœ““S~~¾‚úÝ»wü1@bëÖ­ýúõã ÍÌÌöîÝ  òʱcǪ\î·bÅ Ý ñ ÈÍͽÿ>ÞFè2ì Ý@ÆD>¥R;uê´|ùr²ªÈ&…~KÌ›7ïÅ_Tø_£ŒŒ ªÏÇI‹ü%(ÿ믿ÎÙž}öÙuëÖù«ÂÛÛ{ÆŒzzzÊ ™2eJhh¨®©_zzzii)â¼@7©®®¦?mllöQÇ`í'''•Ñ"x§Ð¹sçúøø\mjNŸ>ýÍ7ߌ5ŠoD¿^JJJü$¼¼¼>þøcv:ñ@)~ªXµj•Êå~C‡uuuMÓ= jjjðâ@×ÈÊÊ:~üøW_}e!ñïÿû‡~¸páBEEº€ö¤¦¦¦*5ükÊ”)Wš{{{ºÅG}tABvº1cÆÐ/¢ ªØµk×À•+lll¼uëVT¿ÌÌLüæènnnêÖãÇwvvŽhRX§Nêû„ùóçóíúöí»mÛ6_U=ztâĉ*cÜÛØØèàr?âÆrP{ÐüýýÕíJ 6lÆ —þ?{÷ʏ<ç÷¿QŘ¢!–„tRLH4Ñ5ÜÄBŒ‰˜5F vMQŒ56¬!VìØ±‚"ŠŠŠ  €""*@éE:Þÿ £s÷îÎ.+,¸È÷sžãÁÙwf‡Ý÷qvßñó3l<ô€¨™bI·nÝ)ñôô0`€<¨ª:?~ܫ߭[·òòò8®­ÈÈH[[[m5ÐÔÔôûï¿wss ¬˜©S§Jðà¢Ç‰%£G>¨aÖ¬YM›6ÕÜ™wß}×ÅÅÅ«ßÍ›7¹ÊU/**Jóƒ'b¡îñÚ>©!–k»U¬8ûŸ‡Ú=m·ê¸»rÐý€š„„;;;mMð­·Þ?~¼··÷™r™2eŠT½ àŸþé¥bõêÕ-Z´P¼ÄÃÌ™3°úÅÇÇSýxTäYÄÕ¼ùæ›ÿL+Ž*nM”;q«øSu¡¨{š÷"¶?fÌ=wO[T¼»r·?ß—Ë–-£65YZZš½½½¶ÉB¥‰b¾ù曵kמ~HRüñÇ÷?о}{±dÔ¨QÒ_ÝÜܺvíªx§ýû÷ 1ÂI>srr8fxäPt1ùô\·nÝÄBQФš¦V¾ä*§X»4™(GÒ¦ÄfEW[}PÜ´PtÌj]Å7¥c÷Ô¹¹¹ÎÎÎj—UóÒK/ >|ß¾}ú™m(-ѬºÒAîtò݉/¤%Ò'(¥&+=bª+JÛ)óÓŽo¶¶¶:¦ •|ôÑGâWÊÞ½{O:5qâD±¤{÷î£Fª_¿¾â`wwwc8ß'z_FFFQQO4ÕºþçÁy.y€êxñ*E­4)¾'Sz«§|¦LüUT3=Ë`9  ZÛ’ëž\T¥ýQ# Qþ^¤SŸ¢Ä©ÞÜyuìžô™Gµ N¥…b›o@ —––æäädeeõDYįiÎÏçž{NóÖ ,^¼ø‘—¾ôôt¦v æÀÿh|HPÛ‡òD÷‘ßr)¿¶Kʬå;¨¶ÙeË–©–2Å%J›’  èzb‰æ'ø´•þªyÂT"¶S¾kLxŒ› ³³³Í©víÚ#FŒx$÷»yó&¥€^ÕÞZæ´œbEé]‘òë ; ¨Ø fÏRàE[Ó= ¨¸UtX錧Ž(0XƒŽÉpÔd¹¹¹Òt1e¾;TèСÃñãÇ« ë]¿~=>>>%%EÔ½œœ¦ñ F@ÝozT}#¨þ×e/-äÙUeÔQôÔÖUQ:k©:‹î(íŽ7tq¼ÐÁÃÃÃÖÖÖÔ´žæ/KKK"P©Pú(œîø•7‚ª52ñrEºþ»¶Xæy1iËÚ¶`À(íŒê[@åOŠí‹ÎTê®ÃÒþ 80X Ž7e:{öê;ïôxï½¶ÒÅÅŸNNN<,   æeÜÇËoU»´ŸâT*ªÊ,€R¥R›SEmgT'WQÜ ´{òn(ŽQ+†ÚЧî¨ûb‚lô,€-[Ž>|¨Ê(Í¢Ö•´—Þ*Ñœ–SqLiûºß*WKÍ%°Nõ&éîÔÞ(%ÕRyäKjŽ‘»›´eµkês>Tqé|"“À c(€¢ÚÈoS½L¾zfwÓQåU4¯(½1Rô ©‰ÕåkC”ù©i³¢@‰=‘Þ‡)Í$#_ƒOu°ü¾M¹‚I5Sµ|É¥Rþ.¤1šgU7¾gÏÍÏJgHÅêjï«Ë“ÛÈטà2(€À  "q“h=Šã  T¬4'‘Ëš|)@ùk=;‘êNª^KBóêêÒö¥YFå¹F¥i9U‡ÉçòTǨ]B®{òÑ¥¯åv)mG"ß…ÔmßTÁ…àP€1Î÷©‘ç<Ñ6^í½‘j·jžÔIÜÔ­[·6¥tÌ £Ø¦Ô¿$âkÅ=”ߺ)Ĵݑؠ(eÒΈž+­¢:Xl_ zwb¤ÚõEXJõ»–7.¨Ý@ƒàr{(€@ P€@ € €ê¥°°022rß¾}‹-š¦bíÚµ'OžLHHà! ¨ÖDéstt´¶¶V½(¼™™™­­­««kZZP@õ•››ëáá1lØ0sssÕÞgii9a„" €jMñd_ýúõ{õêåììÌ›<€ª5Ý'ûxˆ€ª5Nö<Æ8Ù@ðxãdPÀcŒ“}@7Nö<Æ8Ù@ðxãdPÀcŒ“}@€šÃÑÑQ¼ÐmÕª•³³3jNö‡@âáá¡vÊÃÂÂB,ä‘Á㊓} €ÈÇǧU«VOh!nx”ðØàd€ Æ¾¶±±yBbXHHª)Nö(€j²„„ñbX±ë}lùÞ{Ix“­­mLL ª Nö(€j¸´´4{{{Í~פñKkW8ܸì'"¾Õ#V´³³á‘„qâd€GGG333ÍZ× ÁóöGHÕO5b¡¸Is|ýúõE‹¯´yHa$8Ù €Ls’OIíÚµþücàų‡o^ñWLô_1 ^½ºšëŠ.)^róØâQád€jtLòÙ·w·€}7¯”™‹çŽ êßS´E͈×Þ®®®<Ψ2œìP@ñu²¶I>­;|á{hûÍ«§*¾=~øFqƒ–––\-•‡“} h£k’ÏÞwwqº}¦Ü9ì¹YôGÅ[YYqµö?18Ù €6:&ùlÚä¥u+çÝŠ4HD‹ü¬esm äj(7Nö(€ m“|6lðüôÉ£â¯<ëWÎ{ãusÅhggÇ è“} èIÛ$ŸõꙎ9øRè±økA•ǹö •®abbbooÏE¡ 'û@x(:&ù< wè™Cñׂ« 1‘þÓ'ÿ)ú¦âE¹h dœìPàa…„„¨½„þï$Ÿ­Oz&Äœ­âD…ùþ1ÜVñjfffâµ=ÏZÅÉ>Ê'!!ÁÖÖV±úµnÕbß® 1çaÂôû¹»¶«EˆÀ3Xsp²@€rKKK›0a‚â$Ÿo¼nî¼zAbì9#IЩ}_wü·¶«EpÑÀÇ'û@¨ø‹jGGÇúõë+Nò9gö¤Ä¸#ÌþÝ›Z·j¡íj‘‘‘<³ Nö(€`®®®Š“|>SÏtŒÝ°ë—ÏÜŽ 5æ¸n\þþ»o+Ö@[[[ªAµþ Nö(€`(>>>âµ´bu2°OøÙ£·¯‡U—¬Z6§i“FŠW‹°³³ãjÕ'û@0,“|~ÝéË`¯jTýT3Ó~lÃ/(^-ÂÁÁ«E-Nö(€PtMòùÙ'öl¹}ã|µÎå¿1£†?£tÑ@333'''ŽãÁÉ>*‰ŽI>ß|ãÕkß¹þØäÂ9Ÿ¡ƒúÖ®][ó›577çj'û@¨ì—ÜÚ'ù|ažÃ”;7ÃËœ 8Ô­ë×Ú.ÈÕ"ª'û@¨:&ùûç¯7¢ÏÞ¹yáñαCî_ZµQ¬¢„„„pTÞÿ2vvvG7IKKspp¨âJËÉ>(€ªžŽI>?oý©—§kRüE2ïû† •¯aoo_­/(zŸ………ø^Ä7RwÇÉ>(€ “|¾¶iý²äøH"çVL蔉j»Z„««ku<D“NÀYZZV^åd@®I>¾0δä„KD1ÑQ#ÿ¢xµˆjWdBBB¤cÀÊʪ2Ú'û xä´OòYoÜèßoÅžONˆ"ºs1Ìï§žß«=€UóJCñòò’NþŠ‚–››kÀÿ[àd@Æ@Û$Ÿµk×6Ä6ò¼_Jâe¢g2’c/\ùå¦Õ±:;;KíÏÖÖÖ äd@ÆCÇ$ŸßÛ|äC¡Ó?iw®äæd§†ûoûàêWœœ¤ž0aBE¶ÃÉ>(€ŒMLLL¯^½«_›Ö-Ý›zû Ñ3éIÑùyٹ٩WB½¼·ýuhËèjWÅNJ{ëààP¾-p² #”––fgg§8Ég³÷ßÙáº>õöU¢òrÒïfÞ¹åç»sÚ—ñ‡·Ž­vP¾Þ‡hjµ"'û 0Zâ広ƒƒ–I>,[27õN4Ñ?w³’³Òn_?ï·o¾÷¶‰Þ®ª]‡„ØI///=×âd@FN¼2733S˜äó™zö“Ç%ÞˆL»sè™ìŒÛ÷Š‹ÒîÄYqÌmÊÑ퓪cLKK³²²’º›O™U‘“}P?///m“|: öjhZÒ5¢g²Òã‹‹ ³ÒÏûmõuŸæ³cj5-€¢ýIG…™™YHHˆ¶aœì€ º/ì¥S<š~èöíùs'Ó“bˆžÉL¹QT˜Ÿ“•äqÜc¦ï®Õ·ÆÄÄH'òÄŸâkµ[9Ù@õ¢k’ÏÏ[ô=žKôMêõ‚ܼ»é×.xûyÎ;±{vµ.€!!!Ò›E¡S=…ÇÉ>(€ª“|¾ë¾}czrÑ?ùyYy97¯ž>}pñ©½ÿœÜãP­  4 •••8T8Ù@5¥c’Ï6X±lAFÊu¢J®ïqçÎ͈ ï•~ûæòœ[Ý  ———ô?mÛ¶7o'û ¨¦tLò9mÊ„ÛñW(tú''+ù޽ⴤØó~[8úï_ðÀÕ«WKûS·n]Nö@PMi›äÓ¤ví_‡º‘™zƒè™»™wîÝÍLŠ ò8}pÉi¯EG\¾|¹ê±!:  'û ¨FtLòÙýû®B2So=“žXTT›}þHàáåg-{Œ  ÄÌÌL?b÷<<<"##ù€À8é˜ä³m›ÏN?œ™z‹è›ô„‚¼üܬ—ýÏ[tÄéñ+€''§aÆiû±ÜÎÎNŒá¡P“|~Ðì½]î[³Òâ‰þ),ÈÕ/1.,ôĦ³GW{¯|Œ  šÈÈH±{¢÷)~€ÔÒÒ²W¯^¢9ŠŸ>(€ªRnn®âÇý^lØpåòEYi Dÿäfçå¤'ÇG]ØvÎgÝÙckkZÔü¿QôDÝ¥Oñ0377·¶¶ßŸ€  xyyiNò9Ý~brblvzÑ3¢÷Ý»Wœ‘|ýRðžÐCŽ;S8;;ÛÙÙYYY©žt6l?ŒPT6ñj\~^»v­ß†¹•žHôLNvê½ââ»™ÉѼÃNm ;¹‰¨¿˜˜///ñí0c @U\>o{áxvÆm¢Or²RŠ‹ ò²ã¢N…û»ž÷s¡ €êR_zñyÅýcBïfÜ!:“\\TŸ›™qÚíBÀv  ¨^°‘ÙóGVîY:(1&ìnfQLaA^Aþݤ[‘Qg=/žq§ €jZÏú¬ ò^]ÒcÃr²’ˆj îæçf¥'Å^ ;äq1pPTëxÎ×9øèÚÝKÆœ?–“•LD òîÞ»w/+=1ö¢oÔYÏKÁ{(€€àñ(€!Ç7žóݸåo~î9Y)59y¹™÷î‹/n^ ¼ràò¹}@@ð˜ÀЛÃNm=¼qÜ™}Ës³Sk`òs2îäe'Ɔ^ ;t%ô P<Æð¼Ÿëñ³}\¦g¦Äçf§Õäådä&ÅG] ÷Ž>„(€jB ÷ß°o±÷¦Ii‰ÑywÓûäç¤'ÅÆFž¸qŒ(€jT¼àä½f÷âÑ!ÞywÓ×ääe¦ÞºyõLläñ˜‹¾@@P à…3îçý¶\÷gÀÞEw3“ór2§ˆÞ÷ŸÿÜËÉN‰9{=êTÜ¥“@@P“ `„è;A»ýö,8¸ÆîÎõˆÇ£úI×wÈËɼs3âÆ•€ë—ý)€€€(ÀÈཡ'·î]6ôbÀ®üÜÌꛂüì{÷Š rS¯ÞŠºyõ PPÕ à¥sû"ÏzÛ:ÅÇezJÂÕü¼¬ê–»÷îæg¤Üˆ9-˜(€(€Ú `”¨B¡^ÁGÖîY:(ô膜ì´êÒþŠ‹ ‹ ²3nß¾~>!6”(€(€úÀ+a‡.‡<¹kî.Ç~q' ò³9ÅEE…ù9Ù)I·"o_OŒ £ @Ô¿^ ?}áhÔÙý‡Öñu™žš]רRTRýòòr3SoG'ݺxçÆ  R `ù ൟ˜‹ÇC}6ï]6äì¡5™©‰ù9Æ¢ÂüÿÜ»W˜Ÿ“ž|=9!*)þ€P+^c#OÆ\ªÌP(€PÛg­Ú4¯Sç)yÀsÏ>³qÕìŠ@ÑÂR¯¤Þ޾rÖëø¶™îó~Mðr°WfjüCV¿"±ó…yéÉ×Kjþ¡P  –I`FûéÙú¦ò˜z¦uôíVñ˜v'&=).=ùÆÕÐ#þ w/xpͨðã®) WïÝ+Ò±ÛE…ù™©·’nE>|(€@€¨uЭkf7lðÜ“ÿúÒ°§Ÿ2yíÕ¦~Þ.)€©·2Ó²Òoߊ>wîȺ«þpûçÇ£›'‹2xëÊYéš*¹WTTž˜_RåÊ  ê¸ D€÷Æ¿W·ÎÓòàúϘ:ÎùË€0;㎔Œ”ø¸‹'Ï^'j (ƒ׌ :°2ùf”¨~w3“’â/ݹQ¡PP˺à¨ßú>[¿ž<^ôÁ×_mê¾u©  rnE_ðÛ!v5YT?±C„(€@€Xæ…à·9Ï{±áóOþë_*Ÿ ¬ûïv­OxT°êŽØU±ƒ…TqˆÚØØXŒXóæ-ëÕkÚ¨Ñ[<€1°³³Õ,&&ÆØ `dðÞÀãÛ?iÞLuvÐ’w„Ö¯7ò·þ—Ïû”·&êNI¼nÀPƒóòò²°°xå%š`ZZšQ@é2SƯgZ÷_f†¯ú:uêøñG–kVÌ)O,+bW¯Ÿ7d(€€áäææÚÚÚò âÌÌÌ|||Œ­^õ:{jgÏî»u³)**(*Ì+ÈÏ_„……ýþë°[ª–™’fØPC±±±áw5€¡˜˜˜[¼v(=9.??+5%:5ùŠ”Œôëwþ~¹i#ÇyÓô+€ñe¦´†6@À 4Ïý=cöÊûú¶8£ã¨e„B!Dw>¶nÞ¢ýÿ{²–ê ªúõ뇄„TqŒ8³sÙ’y: `a~NjÒåä;—Ò’£ÓScåäå¦O›6­N§MMëŽýÛåˆ]Pˆ]Mˆ 1x(€@999©þ¦ªõtÝV=ì® „B!•¦okò^+ÕWVæææ¹¹¹UY/ï?Îï¿å¹}±bÌÉNuO.€™7³2ã¥äHçj×®õôÓOõèÞõÜ飊PŸ”À˜s¨ˆ„„333ùÈüOÖ²™¸nèÚ3„B!DŸü8nÛ×}—uè>¿Ûú;Kš¾ÿ™j4ø+ÿ2 `nNÖæµsš½÷Öì©¿kÀبS……¹©)ÑrÌÎL¼›$’s7¹¸¸HõÅa:O·ù¼åš•Ž ×/þ·¦ÜÔ'bW㥾fðPò6l˜ê/¨ïþ\ü»s !„B)3¿­=mÝkaË–£å|Þî¯_fï¾úTc‹æª4ìµ!Ê,€·o'üø}§Ãžëº|ýEçŽm}\U àÕð#¢Cäæå¦gfÜ’  ¨~y¹iy¹¢.]ºTíÃA¦uëÖ®]»m›ÏV,‘‘rCŸ”Àkg+'@ ±þq¾(}íÛOvu=îë>|ø ñ×ÏZ²àÈÀ{U?hccSŰäݧ¯4Þ¾yá´É¼Ü´ÑöóU `ô…£×"|R¯äçæäæå‹¿Š»°°xË´nÍ™mêÔ©S»v­fï¿»pþßçÏù§'_×±[¢©UR(€@Åæ~©óÌó¿.?4vK0!„B)3?ß&ê^۶㣢nI¯¬òó Çs ¿ê2sôÆÀÖßQ­N< Xf̹›õÁûo•ÌíPëÉ1vv¹.{Çâõ!ý{¨À˜‹Çc#OÞ¸r&)>*#åfféÜžY%Wpˆ¿}=|Õòyo¾ñZ½z¦Šsœ>õÔS¢ ¾òrS‡YöqÑ´Àè Ê xØOÿ™˜˜ÈÇdû¾c&ºœ#„B!efÂæà¶_N]oçNÕ×W™™9;OËûŒu·ñtúÏ˯µìì쪬äß <áÖ»giL›ÖÍw»-ïß÷‹·^Ûë¶B­ÆEù]¿ íBð^žÛ;|õEíÚµMMë*6ÁÚµk5nôRTDpÉÇÿ7¥0°òBŠƒƒƒ|@þëÉZãן°ßB!„BÊÌ/ã]DËëÛwæK,_ßpqÓ—_Oþè>TõÒð†šTŸvÚ#ØÏ}î¬Ñuë>-†=÷ì3Žs&Îÿ{ü«æMz÷èrÚw‡žPº D|Ü…µ«wlÿoÍs‚¢þ=kjZR¬ZÄ®ŠŽV©¡úSßé£wéFy´¹dï𹮕)[ôܸ)­Âã¬;]ýÕ¾÷?_,?z>°eŽ·æ¨Ú³¦íIQÝæÃzî6!¤‚éøí,ÑòD×S|•%Š¡¸õ7Ïñkª%WW×*.€gŽoÛ±uñ»oHƒêÑeûæEƒôhÜèÅq£ë_åË@¤Ý‰Ý²qu×o;‹&øÌ3õ䊅â&µ”@±ÙÊ (ßô/¿ÎÙòÇyBÈ£ù;=ñ:ýϯظî'E^^ŽÃ@ºñ]ðEHåeòº“¢ßÙØÌÖöBkçN1 [ßÅ%¿%Z~)ÿ´ÚÚÚV}¼ K;šxË| ÚÿÐ_uaÚšŠã¥GU kÝé‡û³üý³AÇHÕ‹8î O‡æ3".Ç‘ vUq›„CeÑ®Péêùù…:ßmµG >ÑU¬Òä5 ùuׄ ª¦^p‹ =“•{5T.€žî«vm[>mò^j(­þôS&Ý»}½hž}÷nëÕ3íÑýÛÞ» `Êíè‡MIŒò«’P}?øt]Óž¡kEByÞx¿¹ôƒÙÍÖ®|[˜¼Ì]ÛÄé&1¦f>¼ —´9ñ —9F~ˆÚX߯u½›¢ã)kɼXE÷“«Ïã/?Yå>!•—«Ž‰f7pàÝ/·¤¹@{Ú.«´ïÖO~éemm]eð‚h:»’.§¥$žðÞ&À[—¸ntü¹W×§Ÿ~JÚÈ‹ _øKÏÅó¦õîióbÃÿþâó]ÛשÀÄ«›ÒxªjBtpuu•Å—_gÑ(Bˆ1ä­á‡£Ê·…i+viÛ‚XrÿdÖŠ]5óá}±´Ü‰YÛ€!敼 jüŠÚ¡ùçtl³Ý×Ýå¯UWשíVmOV¹BHååÏéî¢Ù9:îÑýrKú`ûNÓÄ*Ã'.”_z™››Wq¼´;.Ê/;+=Èÿ jÜ´nÁò…ÓÛµi)oªaƒçêÑuá¼i#~hñö¯¼ÜdÉÂÙ,€¢—UY(€€6&LÅæmÚo9v™b y»ÙýØcàŸ»î¤…›ÅZßô(m¡E›â¯"b¹4@|-Ý4så.ñ×áÍcÌš˜Kw-–”yª«ˆXuþQÞ¾âþHßÈüM‡åÅ*â¯j¤ýû oYŒ7Ôþ¬Ý*Ý‘Pr®&æÒ_a¯6R¬.=tª åµ4w@ì¡ôJ»*V”þ*}ƒª¹ü¼(>Jb'U—ËOV9Žñ}©>°„ƒÇö×Õš×W$]^¬2{õÕV}Œ Þ{9ìPvÆkWÎ{î\+@ç•sW-ûû¯±¿¾ñº¹¼Áz¦u»tîà8Æß3þ²j׺aƒfMŸu69áÊÆH„‘èÕ«—|(ÚüìºbÅù!åMÉìoù´mGÅÁb¹¶ík[Eø¶× mûóRóE[¿ÔÄ\uü;{Õ†Uêþ8¬öP&mµmJû)ížÚ“"nZ¹Ë_mü—ßü(Ý$ýõ÷IóU¿AÅgGí&y¹ØIÅåå8äæŠJJ¿¡NeÎó`ν’¹bÖì>·åÈÕß?‘‘‘U_/‰ràέÈ̌ԳÇT àòE3—.œ>¸ÿO¯¾òß¶òä“ÿjצղÅ«VÌïú­uÝ:uÚ´n¹tÑ?ÑQÁÉ —õŒØUQʪ2@@‘¥¥¥|(=c×É«„cÈ;Ü/€?ý°ë5M¬.oA¼þ—þ*–KÄ6囤?[¶ë(ŠÈk•\Éî§A:vL¬Õ¾ËÒZâ ¹Ù‰¯ÕV‘îNºy])ëvûk÷Gì€ja¬øþ,s9¢øÈ¨í³&Ý*íž±ÒŠ#§,PÛ éîĦ¤¿Š¥%âѶÃâ^4%aÞÚÝŠËËq$H÷%ö„(B*)?ö.™ÞóìÙ«e¾â>|…¹vgX«ñ+¯Ë¿Ù¼¼¼U¼êu-Â7#åFjÊCܤ¸rélñçªe«—ÿ3aìo}ø¾j]mùéÇÿÌšthÿ¶öã¿¶þÊ´n«v­—::D_ JŽÒ’xñxU†(27ÿï‹«ÙË\öú_#„CÞýð~Mè;tLù¶°pý^m[Kä|qG=O«Þ:tôôû/$šš«­ØáÛòZnG/¨Þ$6"ï³Ø‚Ž»“~Õˆñ“ç¬Ögä;5ÔþˆˆMIk)>tÒ# ywbÏïÏÇÒ{°êr§mG5jéÞ57"ݵærùAOœâòr Úöb¨týÞAÔºøø”2_qÙÙ­#—n:)Öjöq+ù—ž¨o°^ ;t5üÈ«gr³Ó®]‰tÝ´ÜyÕ¼ «çoX½`ãš…×:nZ·Øqδ/­Ú<ùä“ò½¼øbƒºuY·zQÀÉýóæØwýÖÚÔ´ngëö¢ ^½”¥±«¢‘Uq(€€&Õk@Ìqrõ:C1†¼÷ ¼4nj®O~>Fm K6Þ/€š7‰%òÆ·î?£yï›Þÿ¯!±yáÚÇäµvùFh®%6%­(þ|¨»S ¸eÃî¼Añ ëxðøy°¶=Q[QÞÕÝ«kþj•÷¹Ów=µ=ªQ{pt§µU'ÅoDóÛ'„*¾ž.j]rrf™¯¸fÌØV2]Ìš£b­Ÿ}!¿úrrrzä0úÂÑk>wn^ÌÊÊ8rzÛæe[7,qÙ¸ÔeÓ2×Í+¶mvÚ¶eåú5Ž?õú¾~ýgTO¾dö¢mßž»Ý7\ ;±bÉœîßwiڤѹÓG“n]ÒLIŒð©âPMª?Å«¶ðŠ%„CÞ·ü䉇1à×±j[X±ÉSÛMb‰tÓ×]{*Þ»X. ‘öè3DÛå´±ê$Y°r›æÝ‰[×*säÍdD7}U,²âZÒ­j«¨>/b@™ Åê÷'oé3D^øÇ¸Šû£ú ¨~ªËˤùí(î!Ä€ùüóq¢ÖéóŠKºàÜe^b­N]º°ªÆ\<wÉ/=ùúÝìÌ Ó>;]Wíܶz×öµÛ×y¸­ß½ÃY½=îíþÒºU µß?¯½úò¿ô>èöY«»Ý7&ÝŠÔŒØÕ’:Võ¡*rssUx·íóó=G1†4{P›¼üªøºÌŒœ0Sm «·î“¶0è·±j7‰%ÚnR 6¢¹Kª Õ"vCsËúß]ÕìˆxTÅB±ÍU­Þ.=ìº÷D SÛZÛwR,-WÝ”£mãŠß£êò2„olz*EÚ¾BHÅ#:]çÎÓôyѵfÍ!1xòL7±–õw?ðZð,€±‘'ã¢ünEggܹ{7ëÂù3û÷nÙç±ißîÍû÷lÙ¿wëþ½."^û\EË›:ytû¯ÚÕªUKõÅä Ï?çá¾ñέHÍ”@qGU  "&&FõgÖý@€_è Bˆ1äƒî·›¡¿+ßÖ»ж±DºIŒQ\Wq@ÓÒ:#ˆ}ÓyLï®òöG^Wm¡”Þ¿ Õv“⣺l­›´dêìÅŠO¢¸¯½Þg˼_m‚¼¼G‚¼ü@Rñ<!:Íl}^tíÜé/OµC¬ØY¥ÚÚÚ[¼~9àÆ•Ó ±aÙ·óórc®^<~t·—›÷Áª9~ÔÃÿ„g ¿—ãüé=üî…ž/¹lD=Sîܼ¨™ÒèýB´@·ýþ'B®BŒ!rsüû¸òmaË~m[ü Sˆ1Šë*hò péCìï®òöG^Wm¡êM£&ÌÔöÀª­ûM/é,›Ç‘`µ‘£œœxW¡£¸®â¹péó–ÔÎ6=+xw•·?òºb¹Úí8$Ý´i—¶¶Íƒ·qêÞ”ˆØˆ´‡Ò½?SÇ·©íA——ãHßÊ!•ÑéÚ·Ÿ¬ÿ[@ívе¬¿ýÑ8?¨YãcÎ%Ć&ÆÏH½YT˜—–zçbøéÓ§öË ô;t$"Ô'ê©kQ§?kÕÜÃÍùö š))€ç<ªPŸiÏ©C±„cˆ< Œíð±åÛ²“ÀhnA,¹)ºMžŠë*¦F>ìž”ïî*oäuѬ¶ü·±3Êܦ4FÚ×Ò¦º÷Ræ}^:#¶k{äåå8äI`ø"¤’bõï‰zN3gŽ»ùÏR/±–ê, Õ¥J%.-)6?/;?/çvB\dxÀ¹3‡Eô/€WÏ~d¡¨^Ða¹Ë¾€k„cˆ| »~ÃÆ”o ‹œ÷jÛ‚Xr&罊ë*wIÛZÚR¾»«¼ý‘¯¨¶ü³/J:ZÇo{èXwÕöûWý6zúhû…ºv,½R¡¸;ùNÅ]<Ôƒ //Ç‘ _(B*){ˆ«½ÅZª×tpp¨0ñz¸œ¤ø¨Ì´øÂ‚Ü‚üܤÛqW"Ï\õ¹táTtiܵ}½ê`9%PÜÝ£ Ð,€³–¹ìö‹&„CÞùà~»é3ttù¶°`ým[Kî_Œ`ýÅu´ïrÿªë6½k»Sq“¨bçUï´|wWyû#"u1±\m¼´|ÔÔº[i˜ØiÄ_µ›’vrâœUÒZCþœöP‚¼¼G‚téØ=BHó}yz^~øðbä’M'ÅZo¿÷‘Q]^¿¨¤øKYé …yùy9Éwâ®Ç„–ÀuŠƒÅ®^ ;ø(CJµjõßÿƒW!Æ·›Ý/€]zš½ÊCϨnAüUÚ‚Yóîþª7õô§t“Ú*e°êü£¼ÍÉŽ[Tow!ïó'm;äî*iDÌJK™ÚZâ¡ ÅZe>;¿Nœ¯újÛ‘öú<•Ò=j¦í{”—‹/Êwé¸SBHcûëjQëüý#Ë|Åec3[Œ\¹ëÜZϳª¿@"##¿&Ä…é™m[VÇ^T¼©´x´¡‚ƒƒƒ|(6û¤íÆ£Q„cÈ[ï7â!½Øøµˆ%òM"_|Ý]ZÞ}à(iùt§]Š÷®c€êމ¯ÅH‘æm:¨Þת}!zní‘ìÚZb€ø«¼P¬^æ³³Øí”¼ý’své,ï¼ ?úòr}vLñÛÔ<0!†ÊÀëD­Û¹Ó¿ÌW\mÛŽ#Å*3Wí–'˜˜˜Tüµ\UÀذŠGìjIÿzä¡¢Æsuu•Å^l¼îð%Bˆ1äÍr@µtúq€ê±Miù÷ýïwŠ©Ëw*Þ»îm­»kÛ‡?ï°pÛɇÚZÕïÈÓW¨68ñµ&-ѶjQ-˜ºGŠ Êw4nÞ&mô}òrñEùŽ¢2÷Rå!jÝœ9îº_nEEÝÃ:}3S¬2tâùw‚¥¥e5)€HiÜ÷èCD¢úbiöFï•# !<½~›ÒÕÖîa£¹_§-ÿ¼Óo¼×\DðçÜÒøÅgï½ÌÓ×yuè>@l³aãWDÄâ^ÄZåÛZïÚ*"⋾v3¥uõ|‚Ä+í’x¦Ê¬ã *ó{”—ëþvtEü@RI™íì'š]ß¾ t¿ÜÚ·/P ë5p¹Xźç`ùuW¯^½Œ¿ÆÇ„$%EXܯ1„ˆš-77×ÄÄD>ûŒš½tÿEB!„Rfí oýù8Qîòó u¼Ü’®ñëT7±Ê‹M^“_w9::V‡h˜”@O£5ž|4~ú•£çB!„¢O¾-½ÄáÃ!eÎ3yå±)멾ó*$$¤FÀKg÷K(€¨ÙTo<Û°ÑÜÝá„B!DŸ ïRRî&oÖýÀ/¾š,Ý×N~Ñennnðr/€·®5TJ `ðã 5YBB‚êF š±nöÎ0B!„Rf&­/ù`Û¶ãµ½ tÍšCb@÷NbðK¯¾ýß+ÈØÚV‡h°”ÀÝÆ j8ÕËÁ[|òïén¡„B!DŸtøv–¨x®®Ç5_b‰Vعó4qëïsöŸ»]õ¿Ü=<<Œ½F0bW#ŽQ(€à] ÷ýëÉZv+LÞvŽB!„”™!³öˆŠ×£ÇÍ“€¢Š›Ú;K kÞá¿×¬133ËÍÍ5ªè½osǯښ>Wÿ½wÞ\8gŠ(€7£ƒ ˜Ò¸Ë¨BDM&~‰_Dò1Ùº÷ø­g !„Bˆ>ù¢ƒ½(zË—ïW}}{[ºþûÀ{~_~ø_OÖ’_k988TÆã—»ºlp|õ7ÿX8ušçêA«ì-ÚÚã‡.%Ðp»ZR¸Œ-@Ô`vvvªoKè;Ëeôæ`B!„RfÌÚ+Šžˆ¯o¸ôÊ*33§oßb‰ubÀÍ­äWY&&& FUßµxcùÞÍ[Ï{/=³kºïÆ‘^K[íÚ·÷÷7®ž1TJ àN£ 5XLLŒêÍ^o6bC!„BÑ']¯–:àœ9îkÖ’>ú×®ýÔá+Nv½Dõ¿Ùíìì*éƒ<å+€‡=Íßxíèµs;"|W{:œÜ:öðÊ{æ>cnvpïæWÎ$%ðŒ»†ˆšLŠª¿Z|7høº3„B!DŸ|7t­Ô¥üû›™ë3g·é /©~úÏ€§ÿ R]œ~ت…(€{.ù9‡x-ðw›ttíð}ŽígþØòýWN$bW#Nï0ÊPQ£? hnn®ÚÛô7xÍiB!„¢OúÍ?Òmä¦ï†¯ï9u÷ •þ¿,>búüKª/®œœœ*o*¿ò@÷­Kßþð½¾[Ï{‹(¿ ´÷öõêÕ½~üú倊§´ºg(€¨É|||žø_/[¶ë9wŸíÊB!„¢Úü2ù©zÏ«¾¬²²²2ø‹·ŠÀ€=O›ÖÕoU°§h üÝTßêµg“¡  èYF j2Õ_#²^}ïÅ7?&„B!úD­ú –––iiiFX£/ýèÃwG¬™-zŸÈtߓޮpø>Çz_ð9èzý²ÅC¤Â˜988<1777ìGÿ [WÍyãÓfRïéµTT?‘{æ>Uß4Øoo\”_Å#v5Ü›‡Î:ׯ_Ÿ_×dmm]Iíï?†»üÏ=»~ù{O©÷õÝõwÏÓ[îÑ©}Û¸¨SIit5æPñ›jذaüÒ(sss*ûðNE `ÌÅãÝ»}ýòçÍDïk;µßû:½ûΛ~GwÄ]:e”@?cPÆÑÑÑ@XX|Ù¸ñg£Gã¡€š@ô¾˜˜˜*ž½¡‚06òäÒÓ:¶oÛêÓ~îes>Ð+öÒICEìêy±?Æ ÀPllf·l9:>>…‡`´°òRZ·y(€  ÆÀ•±«a'7W‡P@Àã_+5@ P¨9P«ê €xŒ àµßJ @Œ¦VnÄ®†ßP}R¹pêÔ)º@àÑÀ Ç*;¥й¥R  Ýï¶…ù9½@ ê `ô…c•’軾¥R àˆá}â.ÏËÉä U^+=bWE¥ª^©ÔxõüÁkGsï¦q €ª+€áÞU  f‰?L UV¯†{WAÄ®–ô©j—J.€"q—Žr$€J/€çTMJ àšê—Ê/€" ±!É@ ‚Ðïк)cqÖ^WMÄ®‹2USùP$3õ&3P¨H\·lŠXþê+Ý7ÏW,€U–Ò¸ªZ¦J `tøáü¼lŽg PîxÞÏuÖ¤á¦uëÔ®õäøQm Mªš¦ò  Hâõ0Žg P‘î¿Ýs›£Å[æb@›Ï>ôqýo =Xe))€Gœªo*XGôo_÷éÚº `tøá¢Â<i P‘x!ÀíìI×~?uc^xþÙíçK°*SZWTß”»Nûóû¦ž{âM7T³Š$Ç_â ,€Ò$0«—L55­#Fþ>ôçª/€‡WTçyhã‡Í,Ä`Ëf~Þ[/‡¨š”ÀåÕ:úÀ ŽÃ?ÿäí'”´û¼Å¡=kÛŸ”ôäëÕ@ |ÐÿðzÍëþ>´w驨:£GØž?㲿²#vU¨êž2 வc¾ëØ\±ú½cñúÖusuT?)wn„sT€r@§ÄòÝ:œ=éú?—8·ûÆï¼ýš¸õ5ó&k—ÍK*5¥piuޏˤÞß·­õä¿4«_“F/.šûW™ÕOÊ+þÕ@ 0ÈgÓ—í>7Y¼e¾Ïm©\åü5fp½ÒO¶mÝüè¾uª76%ðà’êÅxtÇÌ?~S·Ž‰fõkðÂ³Úæ{Ñ>@ÊQ¥ÏN7¸v­'EfÛ()€g=Uè»­W÷¯ÅêµkÕbÛ=,`§ÚƒDìê郋‡üoœ8òG³†ÏjV¿ÚµkÞ真ûö?‘Ü»iØ@ |ðB€›ûæù¯š7c:wl+ŸfAÛ¾aþ‡ÍÞ–®±àﱕR½=‘ à‚éƒÞ|­‘âÇýú÷ép̵ÕOJfêMl PîxáŒû¹SÛ»uùRúÐß6çy‘Á{5cÿ×pQKß2úÚßö#Ç”/bWDuz,²iÙ˜›½®Xý:|ÙZÛ%(€@ Ê  4 Ì‚¿Ç˜šÖ©]«ÖŸ¿÷‹ Þ£™@—~½¿“.(ÊàoCz<´AqäC¥¤p¬îÙå<¥ÝgÍ«_ËO>pß²¨‚Õ@ X#ƒvïß±Lz·ç§Íß_G–.TKà±­ý9°ñK ¥Ïvëò¥¶‘zFìªÿþ…Õ7ž[¦÷ìÚNÛõÖ;Í2Hõ£€rÀƒîK>ùøÝ•Žå(%ÄÏm°í¢Ù‰µúýôí™c[å›Ô2öh©-J…q鼿´ÔÒ¸ :æ°Û¬½;Ö­ó”â$ŸsfŽ6`õ£€rÀ=. ^x¾¾¸iÐ/ÝÎÚ~1ÐC5ûÜ–µùì#q«©i £¨Ýª×õs:wl#ÝK㗊θkËBã5SR÷ͯv9¸ëóÏšjV¿z¦u'´×àí@ÊWÏû¹úx®jÓÊRÜúáûoÙ³òbà.µ¬^ê·>b€ØÈW_´<îµ^sŒj\Öÿ#š TK犩/5A«”@ϹÕ"Ëþªíú?tíP‘ë;è“kG9ª€@E à…3î.ë¤ÊfÓåßçNn‹8³S-ǬëÜ¡Mé¬/OöëÕåðn'Í1jÙ¹yþ _ºIW”š`I T)võ”ç\#ób»–ÍßÖv}‡C{ÖTjõ“’ÂQ @*X#θŸöÞØ¹Ãçb¤¨lû¶/Ž(]¨– NÓ-Þ2—6(»¬û[q˜ZÄÖ~Ôã“ß[2wœâ€’¸wŽÑfÇÚ ¿j¡Xý,?°ØºnnT?)iI±Õ@ B𴻜YS~«]ëI»_V]®çÓ¿úâSi³¾ÿÖ¼™£´Ô3bWOîùÇãåbßã»6µjýK³ú½þjS§ES«¬úñ@ ` ¸C5žÛ½úJÉû6ÅŸÎ+¦©Ýª:Ìæ+é³_j0ÞÎ6àÈmƒu§´:UŽî˜9´_§ºuL¯ï0còU\ýDn\ñç úÀçŸ{F±†¸)fœÝ/¦u눿l÷É¡]˵ óÙ·zøÀ¥É?ÅøÝ:¬_n¯m°¶”ÀÝOFëúœ–ë;ŒÞ§’®ïPf²3nsHm<<p’OÅ$ĆpЀŠt@ µúcÝþ³Àc*REïû¼å‡÷¯ñ\ý®Û9:Œz¨èãn_©™3éç7ÌÍ?î׿O·€c®FUýDîÜ¿w¯˜#(€TDZZšZ zûÍWìp =¹¥"ñØ2÷çÖ¯¾ÒH~‹©õWŸý3í·3Gu¯XRwL­¤¬™7Äò=sÅê×áËÖüúš‰?œ™z“(€н½½Z}mÆÄ!¡'7W<[æŒÚC~khíZOþ»ms±ñ3G×+ŽûslǃÇeÅm>}[±úµüä÷-‹Œ­ú‰\:™Ÿ—Íñ @ KsjPáó–xï^zb³ArÀÍqÒèþ->º•=Ñ ‡•@·)ŒûêQ?|ÓRÛõÖ;Í2ÂêÇÛ>€@¥Š‰‰±´´Ô<8ý¯Á!'60'¬\³ø/ñ§â­bOŽºM6Hö8é÷c;m“|Ι9Ú8«oû U 77w„ šu©õ§Í¼=–„ßX))€Û'U<¿þÒá¹úu5¿—z¦u'´×8Û_|L0—z UÆÇÇÇÌL}’ÌçŸ{fÌï½ÏßPÙ;à½mbE2}tw³Ï(^ßaØÀžÆv}9q—Žsw PõÒÒÒlmm5;”ùË/-˜5âœï†ÊKiü«|Y0õç×Í_Tü¸ß];áõä÷|¦$^á@àòòòÒ<(´°´p];ýœ¯se¤¤ºNxجú§ÿ'¾¦íú‡ö¬1ÎêÇ{>@€ñÐv*PèôeKÏmsÏú®7lÄq¯¶,Öñ‹fŠ{hùÅÖus¶úݸâÏ{>@€± ±²²R,YßZî²fÚYŸõ†JIt¯O<ÖÚ}ÿu‹ZOþKs¯^µ©Ó¢©Æ\ý²3ns\ÊQ½¼¼ìííxè•ÊÃÃÃÜÜ\±¶þôý¥sFõYWñˆ;:ì2Nwömüs@¯vuŸ®­x}‡“ÿ0ÚêwëZ gýå+€¢ô©þ¬øš¨T¹¹¹š—Œ—¼õÆËöã[W‘”À­cudÄ€ÏÕ¯£x}‡ÃûíõDõËÉæí=€òÀ˜˜Å|Årq+# ò$$$ØÙÙi«¦uŸþá[+çeƒ­-GÄöm£ûQ6M=§x}‡þ}ºçõ®EMº‘Ÿ—Ía(G”þÍ}¢,Æ #y0•'--ÍÁÁAqšPI#³ç‡ôûvïÖ‚®Ñ?¥p´ZæMêñÁ;M屢õ¾7çôžYiñ'€òÀÜÜ\{{{mÿݪÉÄÄd„ â_gR@åÿ<9;;kûlàƒ·†6ýó×[WM :ººÌ”ÀÍÊY;Ƕuó77ÛîóžnËðzî©·£‹ ó86å.€NNNŠÿÅÚ ÁsöG\ ?&þ¬W¯®æQÄ¿Î<°€Jåáá¡m¦PÙóÏÕëÒ©õìIƒºÍò^­±©ƒ›G‰¸.òÍ—(nç‹×íúñ1ÁiI±¼ÕPÁ(þ=µ°°Pü¼Ã¨?DºqÙOŠøZ,Ë5‹òèììÌc ¨l111Šÿr©Ÿ|½©m/ëÙ“ípžä½JŽØˆûÊá=»|¢x}‡&^\4÷/ã9Ù—t+";ãö½{Å<õ€ @µI>Uõý©[ˆ¿çÍ+þšËÙöT\Küs,ê$0  „„„ 6LÇ'Õ4ÿ𭟾ÿjÂÈÞŽŽŽu´\ßaÒ¸¡Æ0™§(}éÉ×9Ù0T´´lmÝYñßGëí|m»y%@w|w‰‘Š[hÕª•3 j¸ººŠ&¨ûC‚ºÕ®]kÄð>d’Ïèðâñ¥$^ÎJ‹ÏËÉäÙVBBÂ믷VüçïcË÷wl]qóêiýsÈsÓg-?V.’ÖÖ!!!<à€*éèè(þ211Ñ¿ý ðSÈ/ÑÂ*;Éñ—R¯¤ÞŽÎÉN)ÌÏá)T“|6mòÒº•snEŸ._Ü]V¼÷î[ŠÿªÚÚÚrÑ@@ÕóòòÿêYYYéx(W¶<®´MòÙ°ÁóÓ&º}¦âY·r®(’ŠW‹°³³ã¢€G%--ÍÇÇÇÁÁ¡W¯^–––âDQýxd“|Ž9øRèÑøkÌ?3'ˆR©xµ{{{.•ÁÇǧU«VŠozé÷ó¡gÆ_ ªŒÄDú‰jY¯ž©âÕ"yjÀP"##mll”çféhuâˆ{üµàÊÎ¥PŸÁz+^4ÐÜÜÜÕÕ•§ *"!!aذaÊ×?ú¨ÙN×U 1ÁU™°ÀC=»«¸?–––^^^†ústtÔ6É猩ccÏCvm[ݺU mqGFFò<€æææŠ“|ޱuþDblˆQÅyõÂ÷ß}[±6Œ«E€&“|þÒçÇóÁÞ‰q¡F›Åóg4mÒHñ¢&Làj Ñ1Éç×¾<å³ûöõ0ãÏõ+3íÇ>£tµˆúõë;88äææò\¨±tMòùñÛ×U‹ê§šËN5¬víÚŠ trrâIPÓèžäsÃÚE·oœ¯¾ ?wlÈ >ŠÅÖÂÂÂÃÃ@ ¡}’ÏfÚ«ÖÕO5Ám¾³V¬­ZµòññáHðÓ>Égí±£†_‰ð¿s#ü1˱ƒ;>ÿìÅhmmÂQà1£k’Ͼ=.„øÞ¹yá1ŽÇç÷ß³Püö{õêÃà1 k’Oë¯ü|=ïê§šk7mÚXñjvvv\4@õ¥c’ϸÛ}CÒ­ˆ˜yÿLmØðÅ«EØÛÛsÑ@Õ‹®I>›6Þ¸~iRüÅšœ›1!“'ŽR¼h ™™™££# P-hä³á ³¦ÿ•I¤\½8tp?ŋ𛛻ººr,0Z:&ù7ú÷è¨Àä„KD-ÃNýÔ³›âe‡ ÆAÀØè˜äÓ¶_/Ñq(zºpò@gëöš“Ãph0:&ùìüuûÓ§¼R£ˆž9âµã‹/Ú©>†`Œ®I>›[îݵ9%ñ2Ñ?y¹™9Ù©¾^›(€Œ‡ŽI>_nÚx³óŠ”Ä+Dÿäf§fgܹq%ÀwçôMŽƒ(€Œ„öI>Ìž9)õöU¢îfÞ¹W\|çf„ÿþù‡]ÆÞ:†Àè˜äsü˜1—ÏQèôOfêÍâ⢌äëç|Özoûëˆëx c c’Ïþ¿ôŽºp:íN4Ñ3™©7Š órï¦÷s9æ6ùèöI@Æ@Ç$Ÿßtîè$-éÑ3)× rEõ»vÐÇ}Ú±S)€Œ®I>[|ä¹Û5-)†èŸ‚ü»9YÉq‘'NîqðÝ9Àèšäóå&[7­NOŽ%ú'/'#ïnú­è 3^‹OxÌ:¾k&€1Ð6Éç‹ 8ÌššžGôOîÝ´Ì´ø”„+AÞ+Oîùçäî¿)€Œ¶I>Mjמ0ÎîúµðŒ”8¢gJ¯ïP”‘r#ÜÏÅÏsÞ©½s(€ŒŽI>ôïs9òlFÊu¢g²2Š‹ r²S£ÎyXè¿€1Ð1Ég—΂Nûd¤Ü z&+-¡¨0//'3æ¢ÏéƒK¼Q“|~Òâãý{wd¦Þ$ú§0?77;íVtP°÷Ê3‡–R“|6uÙ¼.3õÑ?ù¹Yù¹™·¯Ÿ=±)èÈŠÀÃË)€ŒöI>þó÷´¬´[Dÿäådäd¥¤'ņûo >º*È{%€1ˆ‰‰±°°Pœäó¯ñ£oÆ^ÊJ‹'z&7;í޽⬴„KÁ»Ïù¬;{l €ñ°µµÕlƒô‹Ž ËNO z&'3©¸¸(';5:Ü;äø†ßõ@ÆÆÊÊJµY|ûÍ×çOe§'=““y§¸¨ ?/ûÆå€°“›COl¤0þ8bP÷ìôÛDï$æäe'Æ…]Ø~þÔV €êRGètáäö»·I™)ÈÏÉÏÍLI¸äî¿-ÜÏ… @ûqý÷¯ùãrо»™wˆ¶äeåÝMÏH¹q%Ì+âÌŽ §Ý(€ªc<ë³þÀš¢æd&µäçdÞ»W|739æ¢OdЮ‹;)€ªu<ç»áÀÚ‘ç»æd%)ywÓïåådܼzúÒÙ½—‚wS<0äĦ#›&øïY˜•v;'+¥&'ïnZqqaa~Îíëç/‡ì:çIð˜ÀГ[Ž»ÿíã2-3åVnvjLzqQAa~nRü¥è󇯄zQ<®0ì”KÀþ%‡×KM¸RÓÚ_Qa^aAnZRlÌEß«ç_ ;H€Ç‰Ïl%Ë–- ~ >>^ÿíˆõ¹_ù޲²²t Û¼yó˜1cÚ<Э[7±JTTO R àyÿmÁG×ì^Üÿv\xÞÿoïNÀ¢ª÷Ž÷<·ÐTÜÊ4­ÔL³l/+ÍìæM³·nI«·45­4ͲÔ,sÉ­4w)Ü5qA5\@MAeßd_]Y—÷'O§9 Ã6òý<¿Ç‡ gÎ 4w˜/g»SFt_QaAþùŒähŸø°ƒq¡@¸ùˆžº¥<ˈ%Í\››[¹÷+V(-,So…ò2j"͹*€¡~›‚½Ü–|îãréÂù›xŠ‹.\½zµ° ;#!(1Â3!܃€º€Ê4è5åbÆÛõÊ @Ñwê•(??vìXþ j.Ãü·„úm9àøƒÇ†ŸòÎg^º˜{“Mñ%‘~WŠ/œN KŠ:’éE@ @iŸÚСC•Ù¥×€&!)nUé·•ïK$žrôôtGGGe²P£°5â¨kÀžß] N‹=vóÔߥü«W.—fežJ‰ñKŽö!åççj©è‘)byé†&Ÿ—>YîŸÐÍ\›™ßKEïÀÍ€¢ª %'›æ>õ–Dã4Ó @‘xÒ— ¶6šD"ÿ5€‘na¾›w:Œ8y`mQa^mŸ+WJ.—?—œ˜z*€¬Ð[&½ƒe$â-Ї‡‡Áz¤¿c›¼ïy¤UqcæÚÌÿ^*zwêNJ/Mrµ©7ð)·$š³#¨^Êë)w÷Ny Æ/³TKFíŒ>þça—ŸÝ׌ÏJ­­éw¹X¤_ÁùÌÌ¤à´øÀ´¸£`ÕPÍÎÎŽPÛP°··×Ûî¦ 7yMƒAË Àr_‘䀕~í’wÞ°À­¤=4ª÷¿]åöúHOO7óÌ®@ª0æÄž“žë¶/ròàÚ‹ÙE—òkË\¾\\R\XX}&5<#ñDzÂq°ro™Ä{˜ZLNV ÷ΊP‹Pn&—{P¾’xxx”»#hÕ·Jžptt¬èîëÒQ„&6ŠÏˆÏßÉ­Ägôöü_ë”~JâcåMä [ì%+îNZFýsí¦>0Ó`mbañU)ÆÅÚä=lÅ'É@`%06x¯(#ïms¶-ø81Ü»èR•OIÉ¥«W¯^*ÌËÎygNå5Õ¯„ê³’J”›áÔRú’ü½È;‡Hë—7Ãé=TÍ”¿P¤cÌÕ_ýÓ–5(·ýIÛ"yþ «€ña‡"?ªfoŠïHŽM“Ÿ¶2¨•wÇ™Ÿ€Õ€‰‘^ñᇔî:Hdà…¼¬’â‹7vDú]¾\|!ÿ\v橬ŒXð†¼eÒû­-~KWÚ2@ùp•rÏ,ª @ù ‰|(J%PZ•ò1üM^¼£¾#é­…üÄM¸\P§ðšáŽ Æ‚/;&{NšÄ xA«Äî‹òV9½—PùX9u=é½èé´h°IQYsšFþÞ•Ê?L½ýTåâ6Y§ü-°Éj(E:EûćyúlŸëºPÎÀBË(¿+—K ²sNÇ‹ú#oà[&y"Í·'Ñ;ðDóôòÚÔ?—­ú½–qÊg 0óì¦òƒ(ÿìÌ{ à5ýAP"òGz Ò|’w§¬hÔœ^¦ìY¡·ŒÞ–Aõ+¶zÍ6,w…z˔۰@VK&Çø¥œ HŒôöu›ïºppˆç† ùÙ%%—,3W®\¾\R|ébnΙ„,Ñ}ò€7è-“¼?æfõP~¯"ÒIÚ¬¦ü“¸Þò ¥ÃUÄ­”'>09gA*|‘ƒrmêo_~ðʳÞIËóÞ¨ƒ¨·#¨9¨Œ,ñbrêËr¯4að·8ù¤(zçð4yé6þû•q–»r“?èÉ**wÛ0'E•ß rGùWƒñ7  €Gýñ㸡;6ίD¦ÆK‹JŽöóÛ±pë¼þ;Iޏ\RTssåJIqÑނóg“D´ª·Lƨyðˆx¥wùcå7õ›"¹ÈŒÏݧ~¢yä‹Þ6M“/GõÔͼ¦³#h…PITŒòœ'=~ÙdÏù\š¯QÊ+þW¥ü^Œw75ˆDs~/”û`”?“Êu9{õìZ¯žMÆ·þð¿• Àô„IÁâß“žŽ.ý§Ã¨˜ÀÝ ²/_.ªÖ)¹v­ô$ŸyY)Y1zCÖ®ÔðÆ”'º1'å‹üÔ·–šü”/­æ<õ. ¼&€ù8úól5¿Ú´‰íòÅSª€gÓ£ÎeÄœM‹ õÞ¸{ù×;ì?;¶Û!3!øÊ•’JŒ”~¹§Ï‰Õš7`m @Í3½˜¼S¾w*÷·¼xdðGóÜ}ûVi®M~ðfþdÔ®ÔÛ7 Üó ›ìª€òJÌ<²Oþ«Wå6#JÒÓÓííí5¯• w†OóPåþTMþš§w _U^Z @¨hÙ0sòÈ;š7‘°µm8 ÿ!þ®U À¬ÌSÙ§ãsÎ$f$œ õÚè¾f¼Ë¯úï\œêU\TxåÊårçêÕ«—KŠ.䕚®BCÖŠ4Ø…Ró½–9¿åÕï. V%_¼Xú›ªôE Xÿ«™ò˜8s^”ôzÍÎÎN3+º A%0::Zïúwò™òÂÌìÒ¼w3Pþ¹y”1èMsN#¾;õ9B @¨D†ønܱq~Û{ï®_¿ž´L½z6;´õøsmÕðü¹äܬԼìtñ?#ý]½·Ì%èé<-ô°sfBHIñ¥«W¯¨æêåËÅ ²²J·$FTb@  |¶·  Á[ƒj«è9ŒÐ PPy}õÿÁÍ @厠šÇÍ]Sla,w£›ˆsšHfoo/-¯·fÍÜ“ïBo/Sé¨=I%P>èohƒ=Zå—e½‹ºJw*aP¨z†úm òÚðZïmÊK6oÖdÆä¯ª+óÏgäž.È=“›•âqÜ}•ûšï6ÿòžøW|œꕟ“)Ò¯¸èâ¥Â¼¬ŒØÒˆ«Ê€ @ù׺æi[¬9{˜AùM€ÀM€Êoj.iN^S쪀Êó®4 H$ùeÊÌý3•WRÐܨ¹Ã§z³  ½ƒ"Í @y òшz7Qþ!Qó·ƒÞJ*€Òe ~™úU“ƶïÚ¨áCvعeY5 É¤D„ÞàµyÖñý«KŠ sÎÄŸI ¯†!-€zW6@ƒ?óÊ@¹LMìZÑ#k@ – æÙED ‰WåiRô.Dnf^Sí` ~‘Q. ]ÏÔÃÃ#ð:“ Vè˜89ÖÄ­LŽaT^øFù *W4¹•XLy±T“‹ù(—]¹¯üÊŸšü6Q†³òz‹ T=#ŽºþéòÛÝ­ZÜzë­Ê ìÿîÁ»ª€çOLFÜñ ¹gD¸U×€– @½ý?Ë @s¥©ÐI`4wpªôI`@àf @sˆÑ¬¿  ÉŽ še’Kǘx)«Ðù?•5'½ZJ»1(?©>øZ¹ï«æ­Ä&ÍU¡Tþ‘°ÜL3©cõãWo% êèì·µw¯î¢ûä[Ýzë¿Û6úa܈ª ñ¤Ç/È=}Z¬§Ú†¬ñT¾ßPŸ×Î8 Vn|½3¨ËY§ü ³æÛ69Z ƒ¸éí»€7qJ»&Šÿ›_šÁü¼öÏAõv3¯B#KÛ++ñýŠ€Õ«KqwêŽSÞJóêzZ¡Ô;L@ï§§wCÍÇO@µ tˆ“F7mÒX¹)ðöÛë·¼ëÎMŽö5€!Õ8` x¿¤ZÍßÎå ÉÉÜ®ýó€“}±”÷hÒ†'LÐ @ùˆÍTù¢ùà @Ü|¼WÄQb\DqQ~~^FNV\ö¹XñAqñEGGÇ÷ìî²a¹™˜—S΀V€f^%Ao·¢rw•w ’ÎÆ`| Š¼6yKŸô7jåžKêƒ;nÉ•§\›òô ê°%PÛ0ôèŽÿmz˜w¬¸¨àÜ鈬³19Yñò\(8ãêêz×]-Zµl±pî´¤Ø@ÃL+wDæŸÏ½VíCÖP–{”J¹—P&˜™zH%5Q„x­¼#w”ç~Wù¢Þ¬I ¶àn7§Gº<ä²îWÍÌL¹Tx^ÀÜœ¤¼ÜTi.^ÌrvvëlذAÓ¦M¾übXØ /ÍÌÍN+w@ë @i'Obsý'1i¥üü|é“ÒÁ bUvvvÒyÞÄ¿g—Ö&/ í†*ÝJ¤ŸÞ"ò÷¢·€tØ‹|®9é¬/êí&¾êé7$O§„ùÞýè#Æ|1@€¢Œ.dçæ$ʘŸ—~!ÿ´4—K û÷ï/­¹^=[ÛFo¾ñêÞ]›MÐŒ) Àœ k51 P ÀÕ+—øsõàýzt{Ò{ßZ“LŒô**Ì/¼˜}>;Q@ñ?/æ]ÊMLL¨_¿¾²\š4n|GófŸ þh§ëƲL1gÒOæç¤§'ÕÄ€@)§NzÇM—.žº`ö÷;´]±dª2E%„{fŸŽ/.ºPR|ñÒ¥ÜKEúå•þϒ«W¯ 2¤Áí·«¢jÒ¤±­­í[o¾î´nåùs)ÆóWÆÖÄ€@)ÿX»BúêǾµ}ãoÏ>óègCÞ p“0>ìPB„gJ¬ÿ™ÔȼìôKsË&ïRa^QaþÙÌÄÉ¿iÞ¼™m£FšçÓhÜØöÖ[oíӻתö™i±çÏ%«G`^vZZܱv&-jì×ŸØØÜ&èòÐÖÎûdл;Ý¿oû e&Šhéí£w!øe¿ÍíøÀý"÷ôÎikÛ¨Y³¦Þž{ΟK2`™<á·mõÒ™w·j!–iÔ°Áã>·Ÿ7ùž6­† xû„ïv3Pº „ç·O}تUK‘{ÿú׿´2Ð6çl’ɤŊLV£C EóÞ²çªçº>&-Ù»W÷-ùøÝ6­[NŸ<Æü”/qÔçàØ1£ÚÞwoÆ ëÕ³‘CýúõsÎ$š H°dúylôr_ÿé÷¤…›5m<æËO–ÛÏx¥× íîkãºÑ¡B˜s&Ašà ïYÓ'uêØáöÛooÒ¤ñÜÙÓä/É“{,7+5%Ö¿f‡P‡0%6àbAvȱrÚóÇ¢¹›5m"ݤËCgýôíôÉc:Üßö¿¯¿è³ÃÌÌ>c:Qa'ƒ¼ÔŸS€))±~5; €:€!¾"^Ì‹ ñ”Ð}çê-Ž‹^|áù†½^ê6ï—>úáw4óåÐSáÞå`EF Àäß@ÀP¿MQA; rϤ%Eȸ{Û ·-Ó&}Ý®mé¶ n¯ßïÍ>s™øúk½îhÞì›ÑŸžp×À¸ MižKuf!Ôå óß°UD\Þù³¾ž[åÜêüÛfÇÅŸ|ünƒ]ê½å]wöÑô©ã^{õåæÍ›~üÑ»G}ö¨0+3®Bs=X`@`ÄQ×ÄH¯üܬ e:­™ï°hZï^/Èëi{_›Áßÿõ—IýßëÎ;š¿öj/×Íkÿ€€çÏ%—¦™e†Pç02Ð-æäÞ¼ì´Ô¤èÛ–ËøÇŠ_WþþóÄïFu| ¼¶æÍ›ŠtXòËèQÃ~¨S§Ž÷/w˜'ð\FlE'-æèùsIIQÞè´3úøŸ™I! ò|Ü•è°dæ’ù? üH?yMÛö{óµß—Ìž9ý‡{<ßò®Ã?ìyÀ­¬ÍÒ<›Tz©A‹ €, À˜{âÃ=òs2Îd¦îvs”ð÷EÓÏpX2køg;u¼_^óm·ÝÖ§÷¿W8Ì_»rñˆÏ?СýÝ­ZŠôóÚ{.=¦Ü) ÀÄÄÈÖx=cƒ÷Š2J**ÌŽ8é´vñJ‡Ù«f¯^:gõ²¹k–Ï[³|þ´Éc_|áYe¹t{þ™&|µïÏM[6®óÕçíÚÝÛ¾Ý}ã¾åëµçlz´Þ¤JáiÉ!€Ê}vè\FÌùœ¬ cÞ"W/p\³hýÚÅë×.qúÃ~úß~·ŸýÖû6lØ@¾#›Û^éÕsÆ´ïýìÞáºnäŸt¸¿m‡í–;Ì;›¥€9gD‘Yx@ I&Dx&ÇøžÏJÉÉ>ëuhçæ [œ—nq^æ²qùÖM+¶n^µmóêM–ølð½÷´V†ŒÍk¯öš7gjøI¯% g½ÐíÙ³iQê¹€‡,< P€¥'N‰:’žp¼ðBNvÖéÀ7—Õ;¶®Ù¹míN×u»\wm³þO7§•Ëæø~ÛûîQM½z6Ý»=óôSŸI‹TOjL€@qG¨€IÑ>É1~§SÃ/æg]¼P´Ϧ}»7ºïÞä¾çï9äîâíáæê²æÛ1Ã;?ø€üéÒùLj„zÊ0>>ì€å‡@`Ê©€Ô¸c™É¡¹gŠŠ “¢|ïö<°M9"ý}v¸‡?äå±}Ú”q?Ô©,ÃÕ#0ût¼¸¯2 Ð8ÓâƒÒNœN Ë?ŸY\téLfJp—¯×.yüìòw :âá»q½C÷n]O§„«'5Z`\\èþ2 9ÒÓÓÇŽÛ£GŽ×‰ÅgÄço5tèPå­ìììõ–ŸYÆÃÃCúX¾#{{{q+é«ÑÑÑw'-£yâ“æ?~qb=â_ñ±›››|Cq^UPg0#)839Td`nvjIqaA~NR|xp G ß^1AþûB‚F„Žð¹€aêù+ÅÝ݈!Ë%ÒI´Ï-ZÄçõ‚N´’Þ­DjÞDZ^”—¸­ú^¤EQê=NùVR¸ÉEÁUèñKË‹Eý™ÜÄ @€:€×';3îb~VIq‘(Á´äèÈÐ#¡Çý# Ë“íŸyêTð¾7 .¹•D|ͼNDœü€E%™ÜJ,)ßJ,)ÝD™„¢­ôP^³´ÑMŽ>écñ¯ÞCÕ\@ÔŸ|§Ò&<õãW7 €ò:¥46P§P=Ù§ãKK°¤(/÷\zjÌ©èç²Ô\øzî½Cê‘RHä()“/É[ÜL²ÈÞÞ^.õ­ä6ToËSn1&¨´£¦|CÍmvr¨šl^”·ý©ïNÜDî;“ízÊ-†â†ÒËH»§u8C &çlâÅ‚ì+WJöîÙÑ£ûsšËˆÌÊ<{rï P›ñ–/ùx:ÍŽÓË%9¯L²K¾¡æ~žz‰gÒ•Ê;•STo§SyÏR½ld“À yä=âóO4¿T€±"Án쀨¹-ïZÙyW*”i&]frN9õ޳3Ø TóKrÇl¹3¾¡Éá„@ÀÄàªOŠÀŒØ˜»oô€”Gä‰^ÓÌ@%y¿PyN5ÑwšÛ×Ê=ÊO¬S³Ëä yšEi°Bå7¨üÖä,÷ûêRž¬ú”`Œè¯> f¬™œÌS:¯‹H0Ík((wž4 ¯JÝk{]Š{Ô\FŠ8ñ%åCí&ß‹Á#‘¿;e±ÊG>òPÀôÄj˜”h¿Ò<¾ë†¨Iï2 RX™œ’Eï‚ zWa¨P굞æ å4°œ¬ŽI‰ò;—-âˆÔãáá!]ÇA}u?å9[ÌÜ(19NМ”÷ö”{M>¢Ð$EÍÜ(SîVJ€Tàñj™ÒLŽÚa C–+==]¤–h7e ÊñU•£ç̼֞ɑ}z±&`%ÎäI€4 Àêš²ŒŠ r³–!Í“ŸŸ/çž¼-Ïœ“ÀT1å+>DGGËGj^9œ“À€ o@Š{·–!ÿâèè(&E¯æÔ[Ùä]4 :Nº{åv½¦8‰èØ2z·Qº¹¹´žô`”k @þ#ã«kDžM‹Š<¶Ýš†üGjéE™œ{Ê prvé]DOÞnhÒ•f ¼ù„¢z¥&_6Bo" 5OGC .à1ïí_úD̺• ¤¬ÆI‰ò=›yÌÕš†45õ>–rë)7ŸÉgeÑl@yNu^™€Ê»P_þOóñ‹L®[!mˆÔLQu6×.ŸÓºý½¯ ûà߃ûµ}æá.uŠ8~0õÔÑêš¿ðè6«P]yâ‘o3Ë(O£nC¹òä+È‹›ˆO*Ï£ÞiÓü”ýS_Âøñ‹‡-=~åå*LöD%Pg0ÀÓ¥Õ=­×úïZ¸ógo§qîKû-üºÛsOWc–`„.kPâææ¦¾ôƒ2î4o%"KïV&ÜU"¯]¿  ™Ç \Póñ€¨›8|Øÿ¾øþ›=±kNì™ç»yâÁ•#v-xvd¿÷Þy#åT@µL²ÀÔˆˆkPÉÞÞ^4—tÊé¬)" 6½]+ÛN'n%©'ŸõÅäj}&Í(è9hB$¤´¼fKj.?tèP“Ç/ÚPVÎkêT¾Û¯ïs§Œ?¾%ÜsIÀ¶Ÿ<ÿøjÏ’Ûf5nÛrïŽu)±þUŸäHß3©á¢¶¬p@u'_êñìôU Ý¢|DJǹ/ê6§ó»=Ç|9¬:P< ë@Ý ÀO¾3pü‘~ËwŠ‘6ŽØµ Ç¸ÿ½úJÏä¿j˜H€"µ¬s@u$ýúc×>=E÷ÍóÝü³·“¨¿‰WŽs_ÚgÚ°nÏ=•ã[ #0%,L<«@ ÀÈ ½÷´i5nÛb9ý¾Ú³dÄ®¯|?èÕWz&EûT}DžN +í,«@Àø°C3¦|óÄ=¥îê6GÌÀm³:½Þmò£«/CC}­w@u#"<¿9¤Ë›/Ú-÷Á–Ÿì6NzvüûO>Þ%&øPRÔ‘ªOi&‡ŠÈ²æ!Ô‘LŒôšüýè{ÚÜÝôÖõêÙ¼ôâs!G÷&F©–) À'«@ ÀÄHo1®—FŸ<(}\]“q¤48Yù€êLÖÔˆÌL >²ÞÚ‡P0!âpÍM’À¤`‘WÖ? °êxR<ªZ0 €›>kpÊð¤h«Z1 €›8ãÃ=jt’"¼3Ož<¼¶V €¬Jf$ž8qxM­™ÀKóxê¸1XÃóWz®®ES£ê~!ï,Ï^À¸°ƒ5=RUU‹¦&ðTÈ^Ñ€ù9é<X4CÖô$…{g$IU»¦FPš¼ìTžÃ,€§BX`D¦':´²¶M ˜Â 9<X"Cö[`’½Ò‚DOÕº±@&E¾r¹„g2€š@KLiÆ\^ëÆ(&#ñÏdU À¾¯to}w §•3506ØÝ2“X€"¦jãX ÅäœMäÉ  *¸ð—om5_óÅ­Üg™ù+,­c™Œ u¿\r‰ç3€J`ˆïÆ}Û줓øjnOõØðϴЈL‹<&ÅTmœ*à”¯ß4@1Ù§ãx>¨J†úm òÚ0lXàÎ;š­[>K À˜“{-6¥wìØ~‡Z;•@‡Ÿw}¼ý-ÿ¤€ W¯^á)  *(fù¢É¶¶¥»ƒŽúüò´Ü$†. ÀßkïT"7/Ýç¥GoQ¹§uKÍÃ¥áTKFuõÞ·öÙ§K“ä‰G;ûpŠ9±Û2“&ð¨h¨Z=æàŽ5cßù¿gmn»U]Úß»sóoz˜ëËS@µ t˜QŸ(nlÛpêÄQÑ'v[`JðÔÑ£ûìkõ˜€ûœüô£ÿ4jX_~-îl6íÇ/õÒON r8þ«ß·ëäµÁä2ŽËiÓº¥¸ÉCÞ/>Ÿ©Ñ˜z*@Tmãœ0ª_ó¦Ôéר¶ÑèÂí(·þÄäžæY  8tà[âóíÛ¶Ùê8W€»Ä„øoûöËAõllį¿ÚÓg¿£ôùš˜¿pïâÚ>z8sÂG÷µi¡N¿zõl† °;îãbNúI“•˳@%0ÄwãŒGÔ³¹MÌ” Ã¥Œ Ú%ÏwGQ¥©bc3곃ý¶)¿Z]# Y@Õö1 À¥s¾xò‘ûoÑòFß—<÷þa~úI“‘x‚g5€Ê`¨ß¦›¶o×F,ð}^<ê¹±¬ÿ1›ÖÎ}èÁû¥ëDÌ›5N½@'1Ì35ÖßÏ¢›`äÜà0îÅç»h¦_Ïž18Ó‹ñ$Dxð¬Pé óßrÜ{ão¿*–iÓú®Mk Ú¡ž©ß(–yüÑW,™ª¹LåF`J¬i:ݳËé'»ÿë®™~uîà´jNåÒOžÕª€ÒI`æÍkkÛ°žÍ7£>Ž tSÏQ ø¦t`àýíî™5eôIß-šKVhJÐÏo÷‚Ú>û·ÌúÑ«66·j^Ýoáœï«˜~ €ê @Ñbv¬xüÑÅÂ/vÊ{ßZÍ^Ÿÿtð;ÒUãï¼£ÙÈÏúë-YÁœ_{çðö9_Ö¯QÃÛ5¯ï0qüçÕ’~ €Jà*ûÉs¦}%`ıíbNølþøÿ•Nü2òÓþâJŸ7ñù ß ms÷]Ò’voôÚµÅ^sÉr'!Ô3%Æ×÷Ïyµt¦}7àî–Í5Oò9zÄ€ ä“PCØ«gWñù~¯ÿÛÿÀº²ü{œWÏ~üÑNeÛøšÎù­òK&#¾*-)ôèö¤øŸeÍèjþ$„zÔÒœ?íÓŽ÷·Ñ<ÜoÈ;¿CÎÕ›~ €Jà1OÇ·^/] }»6ÛÖÏ/mÀÎÌÉ_Š <ûô#š ȳÖaú^zN¾/ñ±¸mÀÁõ7‘G`rŒÏ®_kѬ]<æÉG;h¦_ï^Ý+q}3'%Ö—g5€J t àŒI#¥KNžðyøÑm&ãÐqØ ·ÅWÅ>xûÕÃ{V«—‘ÇÝméwc>éúô#òŠÅjoU€Ñ>>;­ã²ê‡Wz>¡™~Ïu}ÌeýÂJ?iÎ¥Gñ¬Pé óß²kÓâÎÚ—m¹{ÖÿÀºð€­&#èÑíI±€­mÃ1_ 8î½Q½ŒrÄJfN%Ö&•£ Ö?ù»Ï4–ðÈÎ9V>;ÖMzÿ­õ®ï°ÚaF¦Ÿ4¹§yV¨J†¸÷vþàí>¥—¼û® «f‰Ï¨gÙ‰Ò%ãEdwx÷JÍÅ”#VûëŒ1ýÞx¹ì·iÞ¤,Ù1ÛjçËÌOþ÷ŠÞI>gOÿÖé'Í•Ë%<«T%Ãü]¤Y4{¼t}‡¯¿øHþ¤r‚¼œgLÙ¾í_g>é÷úË.ëæj.iþˆLŠ>â½ãëœ/‡½Ñ¼™­:ýÛ6š8þóðc;,V :ðïÙçúûãt*Ûi³Ýšß§š|Už¥ 'v}ªË_ú=ÕeÑìqzK–; ¡‡’¢¼½Ý~¶¶™õýÀVw5Ó¼¾Ãð¡TûõʬÌžÒª€~›M&è°Ó×#>´mTº)ðµÞ/xîZ®^F—usú½þ×]´¹»ÅäñŸúí_£·°Þ$„H8ËzfñÌa]¼Wóp¿wÞê]C×w0ž¸P÷Ë%—xJ0';=p¯çN{u†úmÖ]ËEý•]çý6у‡ô–Ü·í·¼.£Ð«g×?~!n®·¼ÉÄ— —×ö™Ö0«Œzî©Nz×wØç¶ÂòéÇù?˜c„ Ê„yðûïú]€Fã´bFçŽíÄm[ßÝbÑì±Kúî_=þëA]Ÿzøïk@<õð¤ñÃöm³7¾‹ÒŒôòrycgûš ¯õzJ3ýžx¬³Óª97*ýØüÀM›6U¶LëVwþ¹yþßè»Éœ™4n˜´¯ÇóOìpžo¼°¯ûêGôêÙõïk@tl7þ«Aû¶Úk./01Òë°ëŒ5®ÿñ½ÿv·¹íVuúuh¯ÃÂÉ70ýØüÀ|'NœhÕª•IîÞ²@ @óÇÇ}Õûv½¥5ô}¥ûúÓ˽É1OÇ9ÓF¿õúKR<Š<´s©z±²<|xÛtËÏþMS>лQÃúš×w˜öã—7<ýÄ$G{_½z…g2s$$$´k×îŸ Øb»ÓÜçŠÎ浿ôêùŒ´’Ǻtœ>q¸™7\e?Ioáøƒ"=·M³ðLe×¼i#Íë;Œ1À’×w0˜øðƒ%Ey¨JÚ6j°àço‚}6Tbö¸,z¯ß+ÒžwÞÑô«áýì[Y¹U‰) ÀOÏ­?Ylf|÷¿ûÚÜ©y}‡!ì,}ƒ)È=ͳ@%ð‰'ž0IžáŸ¼|dCåæÈÞ•"ýîlÞTÚ½S$áv§¹•XÏõœjùýçaOti§y¦—7ú¾ä¹÷ëI¿² ÿÅò¼P9999ê|æÉ‡Žì]|Ä©Ò3í‡ÏìØö¯vl;nôÀ=[šs€ ž.SktþX4ªÇ³5Ó¯ç ÏìÜü›U¥Ÿ˜³iáógi ~9Àuýœro|0!ÜÃcËäš­+¾y³ÏÓšé÷Pç7öúzÇýåç¤ó\P-ê×ÿÇ©/E¸Mûá³*6 ˜€ƒk~™:²ïºÙ6j ­¹}ÛÖǼmP‚RÚ2¹ÚgÇÚñƒÞ{Ióú÷´n¹pÎ÷Ö–~bRb}‹.ðPüüüL.!¼ðÜcÜìOz;VË,˜õõ›¯½xgó&×Ïú@ÀÁÕêÅâƒ$„:´yR5Î^§ïGê£w}‡‰ã?·Âô“vûäŠjBFFÆóÏ?oÒG¶üôý§'¼ÖUã¬Xôý»oõzùŧ¬R5î¯ü±ºæÇ¯ìZµhªy’ÏÑ#XÕI>Ùí€%M˜0AÝJÝŸ}ô€ëâ‡ÿ°ÀˆŒ;xpÓĪÏ/ß÷ ]KÍÃý† °ó;älþÒÙí€eøùùuîÜY½)pâ7ƒ,€?Te–ÍúøÃm5Ó¯w¯îÖv}y"<ØðÀÂrrr¬®§¸Ïþ×o^[s#à?TnÖ/ùr÷‡5Óï¹®¹¬_hé'æ\zÔ•Ë%<÷Ü{öìQŸ¦ôZOtv^ùÓqÏ551qÁûãCpžPÑÙìðå;¯uÕ»¾Ãj‡V›~©§ü /äð|pcém ÞìÛcÿ¶…5€q¡ö;O0þ\7và;=5Ð>ÉçìéßZmú%DxäœMäiÀzøùù©O*ØØÜöî›ÿÞé<'ÈcuuMÜI€û÷oøÎÌ1ð?Í›6T?¶Æ¶&Žÿ<üØkN?®òÀ:9;;kî*¼ÚëÙ +¦y¬ªú\ÀñåÎÔoìZ¶h¢y}‡áC?°Îë;~j‹ÂÂÂ)S¦Ô¯__3Ÿ~âÁÅ¿Œ <´ª*S€!îîNã æ×û?ô@kÍÇðÎ[½­öú¤€Z'##CïÀ@¡Ý}­¾ùÁ>—y‡VVb®àXÍq˜õq×ÇÛë]ßaŸÛ «=ÍK^v*é –JHH>|¸ÞÖÀÒËÇw}dÊø!n‹®0âNºŸ Ù·oý·&³ñ·á}zvѼ£'ëì´jŽunòËÊŒáªîn999S¦LÑ;6P:QLŸ—»þ:í Ÿ=¿;¸¢Ü9¥ À­ËGÙõ}Úæ¶[Õ+ïÐþ^‡…“­0ý2“ƒ/äåéàæSXX¸fÍšvíÚÝb¨[×.#‡½í´lÒ±ƒËõ¦4ƒ÷íuüFÌŽÕ£‡¼ß£Qƒzš×w˜öã—V}q¡î‰'ΟKæzîêÁƒ7mÚÔ¸ïhÞ¸ÏË]§Œ´eÍOÇ,SNYîÝ»nÌ·ŸöiÖDûú£G °žë;$G{ŸKb{€º©°°ÐÙÙ¹_¿~·˜ÁÆæ¶§ï4¨ß‡m^ó“@‡“ï½»¹æõ† °³†ë;$EÎLÎËN½\r‰ÿÜp­ì|¡š‘¯¨7ú¾ä¹÷¸™O_ö鸋YœÌ äää8;;>¼ÜãÕz¾ðÌÎÍ¿Yìz iñG3OdeÆŠÉÏIÅÇ>¨œÈÈÈ ôëׯÜC{ìѽ{vˆ«éaON¨i ®®®S¦LéÛ·¯òZíÚµsvvæç7«œœ2ü(U÷ÿÒn^ endstream endobj 1231 0 obj << /Length 2184 /Filter /FlateDecode >> stream xÚÝZmÛ6þ¾¿B( Tb–ï/)p@Š»,Ré]âhûAkk×ÂÚ’+ÉënîÏßCÉöÚÉn‹.Ó^Œ¬ø&qæ!9œyÈ_2Fèø¿½9ʾ»ÌêŒÂO3I¸S™q’8íœËÚ2»ÎþuA³¨¾¼øvvñõkÁ2Õ\g³ëLi¢ÈŒâDi—ÍÙùß«««UÙN¦ÂŠ: “)ËüQœ©üß]Ù~ÕùJ™_n«E9™rªϹžü<ûîⳋ_.X‡Ÿ—–!²ùúâÇŸi¶€ºï2J¤³Ù.´\g& ?¤WÙû‹"ÛŒQâ¨c^d#ˆæ.3\«PâoËU3á6ßX†çE;ay‰éò×b½Y•^`ÃòæŸ=¶æ&o°à'Ê$´z9™*Nóë¦ÝùE»Àꢎ‰¶¼óo•mWbÁ‡¦. ¥lþºj»Kc¯˜Ù´eWÖþµ>бÜK ²DæMí¥¸Ù¶¥2›2MœÐðDÉ86uÓ®‹¼àx¾hÖEUCçš¹üU‡…E퟇@a¿,Û˜¬ºXµ÷˜Ý´A¤;Ï6 °êƒ~Ñ«MâgɼYc³eÓõ/&SIu¾[VsÿÑ%¾·,¢HœRúò%ã"¨E* €§-$çùÛ¦÷óI+¹è1u†i‹™EƒÏº µ:ƒÑñ-î¼üÃË V® (Ý«Õ=Ö‚ ºí ³Ï•¡}ßV~Âø/ü7v;, ŸÙU«Õ¡4„­:,)¶=ŒJ_ÍC—°~È¡Òqº¾ñ³Dœ€%Ȭaˆ¼”>ý`4„[…á…g‡X» `ùòÛ*ÌTH…©uëb³Œªú&¶ ÒûW r€Ìg01UÕØ•ò%8Çýâ†U˜eã°CÇï.Ï.m$,Yî—¿/–º š`¢Öûã= -ÏtcˆeŒø”‘yrg·<Gƒí4'ZÇÉÿ»ÕFÎ-âØ¡"Lœcß…%8†(lJ:L´&œÛ”˜ Ñ“@L4•6X*GTÊ_7•wÀ²+ËÛt°@ ¦K ôld4ö£Ìh>ÖU]­·ëX`J‡Špàù¤E ‹šNM®Àùa ôd6wèÏ-cÐòö½Ïm¬ITgÜ „ªCðMFÕÁ£\‡E8D&QØk(-O§0åðå<Ìþ3ƒÁæTå_¼.n£ÉCºÓÛΦ>hŸY#ŸéË®ïÈi²’8‘0‘ÖçÎÅ niše! ƒ :a8""Rž„#èYq+Ô°-:Ri Pý‹„ñˆ„øÞºŇV‰3ˆ¼‚“)Ó–_¿[-ˆz¤ynîÄw£±›'“'C¯1µRRB‡˜ý}9oEåì!GéòM$mYÞE®ÃV™‚’´Ø<Ò“Y;0²Pà ¯ª¾ñ¼¨pȵA{è5|LXüî×wôÉÝ ²y…Œë^ø\±Z ü(O âÇIµÑ¤h=1WxêSˆ|†¢Ó±îx[Ü1ÂáËpR}­%6Žü)Öu›b^†ïñ@û2Ïú†#ؾ á3tlyÏ]ï¹LLxÝO¬Ì_xhh¤|-Ò§žoÝ ï/Ï–‡ñŒÜ(J¤isÔÕ¼¨›Ú󦘭‹u‰©Û‰ò —ûUyÄ@? õHkOÛHkOÓž’°ARçËðí>ö%‘—éc_rDû‚@ý}îxJÉ@ûÇHûL$`%ÒÇ¡?dZ!u†>ž‚€³Ø¿N%bã‘1†ôc|Žf?âå,ÎðÇ2òÇbXN±á§ÉcÉcñ’ÇÂ@ÏžÛþ ‹ÇQòXhAŒfév3¡aûäz # p7õ‹öȹ‰n_µ*“lëB¹d Yt;!7æ³1ÌBÀS'tglφۇ.W.8uÌØÑ©chŸÆ§Âlö‡»·Ï»r©#J'tÉC7ëpå¢ùõ©UUÇ%{U®š&‡Ên³ªúX#»~×ÄAÞÆ÷úX°)nbÉ®ê—Ã×וwÀ¹J1À!”%ôñõ®ëoré DŒFD,'R§`Ô­Yýi¢DäÓÃY‹Wö©Ð!(ìúuÑõeKÊ ©Ë>õ ×Á3“nqɳüÑ5Z\5wå_|*E„NIÜÃNE âApaÏҋʧ?ãâ’ËR2ô\*b­ø(CrÈõzÎ-á:)*‚ˆHâ¡§}äˆKÐñ4cÛ—éŽþ8“$É‘f‰îÍ1ðû;åâ{Ÿ/*”fXJX¨"\Äðgp}a99æŸ6á”Ó…9xZ“ø ‹I¨É? ÆÙßœº’r1MÓÞ¦bZ~ä6Õ§=º§ùzI “:í},¦ØùûXüá},.@BRé£]3’>ŠgÆÓÖLˆ´—·`u—·ÌpA¬a*ÿçì]> stream xÚ­X]oTG }ß_1íËÜÛóá*B  ¨H­Š•h£<@²¥ié.J…þû{) À¥<$ë{î¹c_Ï{æÖÚ{*©Ö>’4ûIýZSe®¦!-9PX%®†´’¸;¢Iz_Áè©6d¤µNMêäYS-ÝîM¿2ͲË&fÙ?U³@&qž§é¼ ˜àÀ.yØÀà UsHÜ—â²Dñü(Ã, <šyT <Ô†S§»PPætn¨»°(ñW*%Q!2 ï^ºc”¨VÇVsL¢â˜%Kë°Ô±‘ˆÙ± kÂ!H²÷«ð!–VŒš¨YªÃSëŽÁG/ŽÁGoŽÁGWÇàcˆcð1&ø@†hÃ>”Œ‡„‘vÇ0‰ÅrEİl9,u¬aŠÅ±k:6ãE,W˜w>–Xž‰1^óHAáæ‘2Æk)ÅÝ#eŒ×=R¤„;6ay¤¬‰§M-̳3|HM¬&d Vã½>XÕ1IRık:Ö“Tv êvÌ$öª° Vê†!Háj>Z…Õ£$b&8ÇàCÔ1øhì|´é|tr >ú°9oð1ªåÓ(£Ûœwø˜ž«Ó4IX2Õ1øPq >t:ÖS+ìØ€åšDà­º&±R[uMB> òY¬–ûéKªbm?JË“_~M­çŽØ[‘ ±¤Í«/NWwî|’,Zò (yŒŒ%$wÎšŠ‘[ÉöÖ!2V.X§!2êSf †Q+R9½C>Únvéà -G\ÓÀšô§Ž0[S¾¿˜©cªßÜ`Üx3ö–’©Ã.0Üòðr{v¼Þ¥“´<¼”–Çë×»ôÖÓã¿_®qãéóõj¹¯ëÍîÊj¢{Y-ÖWÛW—gë«})tìÇõùÅÓ»Û×éÄHõd(ÂÑÓK<:ÜÆžx¸Ùl1ÚIòÒmñxéÞXõf¼ˆ?²Zîn/Ï×—>~9]¾_,÷p|j!áeP|²—yY­ÜtK#Ms¯Æ;~õl‡1—.6.‡îa9<Û]l7Ëñòó£ö÷Íï»ÝËï–åúú:_\åíåóåjûÛî/³<»Øœ‹ø¾,DaÎÃÚÌ›fœmñÿÿ¿<¨Ö :oxÙ[(nëÞãrïó+ÅäZzCë͵>ÆÌ“n[r7Éd± V7ËÓ¨Ÿaÿ[jͳKŒŒ:šIƒ\FµÒèÀEsé1.ÚeF“ rMJ#c3„ˆ{¨¢|´ˆ¼SjÐGÑ-ßV”'?=ûÃÄdÃ=øËö72?]n@C…¹÷Ù²£ôaÙÑ+;Dûút3;Zÿƒo’Ñѳ5ÇkPë­lU‚d¬¼N1®hE« Fa ;HFÇÔ SˆƒdîyŽ`20jfjA2ÙA2úp¦[·z{—ïcÉ]3NA2Ô׆É‚ÍF0ÍL3K4l5”ƒÊàR3Ï 2¬O†Œb¦T¶¸yp”ŒNkG¼-°sP8åä2ƒÊÀñ,Û>>DFÍC*å> GɽåðÀ2KP•'LP8®d;QÅȨ ö"ëÌvŠ q'¶9Ú¾ZKü° ÚÉ´¯Òmû~Äiÿ‹» £Ã]ð]ò>y} ”ß¶`o'ÏÜg’!ÑÊÑ0ÚëœA2[× ™$K”[KÖ`.šÚA°É“ó ’GÁ–ƒdü‰Æ,œ«¶ ™°=’(¹ö\4¨ŒV(7 *CæÌªAeÈhY¢³Í(¸móÌØxófƒq™Ì7û¾Ì‹}_ fƒÉ¾¯DÉÕ¾¯DSW¬eƸ4­c ë˜Á…BÍ:fpIÐ1g”Ìh™\UTÑ2gPTÐ29( t;ÔÛ 40Óñz[»ÄëmEq×[„®·QooHãù o¡ endstream endobj 1285 0 obj << /Length 3250 /Filter /FlateDecode >> stream xÚÍÛrÛÆõ]_ÁñK¡™r ìâšL;vœÆ®kÑi’鬈%‰ ´¬túï=·…HŠIí(b"„ݳ×söÜwšD*ÿºå^õí‹I3 á7b¥‹d’±*Ò¢(&›,&ÿ8 'Kh~qöåììñsM hÖéd¶˜$©J 3É­’´˜ÌÊÉ÷Á³êò²vÝùÔä&€Ôù4 "ø—è( Þõ®ûKqðb[•î|ªÃ4ÒÎΜ}söÕìì§³ˆöÓǹʌ™Ì×gßÿNJhûfª¸È'×Ôs=²‚ýC¹ž\œÝn9TÅd2þÌ÷o_|BÏ»ûŠ •å î á~‘QIÌÄûM;a2ëIð°ˆv鬂õˆÌŸŸOêê¹TWãÒ¥«Ûk.úÆ~SWƒ€yÝr¡ÜʸA»Èu5¬üìëj°CÕ6tL¿']y˜*mÒ’@&Œ˜¶ÀàðþÆ_­ªMªl·±'!UZh•æÙ H•g*Õ°^ª@à™Rofo…wº¶Rîƒ]oj§æíZ÷¬P‘ÉOÇ&in”ÍÿA{Ù¾w´§X§wH0£ pÐo¦×ÑUŠäPa›QضæÈ$ œZ$õu;¸ÏŸç»}M¢ÂÄÀLl’¼Æ"¯1±!×U‰ôÅâ-}ÿÊ€jÁ½‡•tþ抽Ó•í9ü{®³Àɰ!×çÔFã‘-zYÁ®sÜ@,¡xûû¸NXA¥iÎhÄ ”"Ò( ƒ 7ßÒ4`dŸ={}q„Qª P¡`_URˆÕøÊvuEÆöqk©a÷ŒB×ú=CÊ–»5íÀ…MÇÈ’ÕF@›¨ß†,Z™·Dw"Si׃+Ç&˜­Î# lŸÛ½¬ê½YVV™ÄÎ5\µ% ,]ɵŠä`2õxŠÔž¡Ê•åÒ0 ^âöóŒW„/o¨íûê’Î@ÄØÔ?Í¥ÿ á¶ãÚvôU³äâìâå .ý&á윛Î6½“´RÃEµlìgÖC—X%CÀå‡0ŠÂw(}ß>Ç¥Ÿêº+L€ˆî'â2Iú ŽÉ Þ®¤I%èÒÚ VjÍ6¡`J† +;0Œ³ ëÇä·5¤ÎÕZ¦í]ÓWCõ^L õºµÒÞÀ÷ç „çu%=8ÖÄ…B4!ÇŽn^¡esÒÑ®Û-æ»–]l!›Í”öFÑ-f| „™}Œ<ìÆÊ)îìv/¿bCœ %°´›ŠIwo˜RÉ$d¯ÒGÆP>jìŸKÿ,XYIà±%†œ£cg$C'kŽ€U×6ÕÏ@†#ö\,;u¼¢èÑ„”wÒyNXâ·sèH ’Y@19œË9­ Á]y={Ã>젥ͶóÉ+'‹|yÃM¥[Øm=€c£‹Œ ŒÃ“û­Àé§þô<.eÂPÆÁ^ÁãQǰq¦ÈhtáÀ3(‰ƒùRÏÁ“£¬Œ!§ ›Ûr‰[Îâˆèû@ûŒ&VÖLÊrä:Rн*¬R£q>aÂm‚Ó»8É(;çJÊ~d±.V˜ é¸Ed`˹ÁಿšD‚n*±×–˜ÃT(@D|º^ÒsNÊga3¥8áK²€ÐΚþ`^pKö¹NÂ%³c:L؉eàÛÔvgv,³%ºÃ Šß¶ÍÒãá àŽ¢Í.wœàÁ?ÎeŸPv¹•£¦rÍ\öÈ{2äœ-O4ÓgºáÒ¸îºõ%ô£€I—Õ{ð‰É€VVÞ>†õ¬d¯QH€¿g~—kû¡ZcÓv}ĉ·Þñ¦Á%ûå#[±w¾“÷•¤ôÓ$1‰äó½ÔPöhÌ´A§¦F?Ÿ”Àú-+†[ lç¯&ÆÓ‘Ûˆ~œŠGt0}ÛXP…,¦Ç‚¬'Í› Ÿ)¥«Š1è@ù<Š0GC&–»è$ÜÝPlÀ,‰$2ÑÆÔ‘ó>AŒÎc•Þ½þ½g*ÿÄÁC1:‹Tx’KÝqÁDEþV÷OÄè$ê„®»N#•† FdžrÀ§£DœÓýãÄh*.Oˆº‰UÆŒºèEDôÞ‰0Ež'} oïµiÜdh\YÃ2Y¨$l‹ŠL¥™­§÷¤ ‰  °q@],:¶ð…^”RÞ2 oG½ã O¸ÆÕG¯qyx  —аè½/ˆyBö”ú}äè6‘!×’ØÃé/ç|)„EW3v ±›åBÞ÷1ÇýBzRïtt³‰1þà6½‡GP^BDì}i}{'Ž•²mÜ~3ûú«Ê-‡ôäÒÚ®äÞÈOàGŽÇ5ÒÔÉÈ®—ÁØ÷Íì­ï>„ØY|±mÆ‹ÙCœ7]ë#Zî½}V‰Rñí;úÓ|û>:ÛÉø€Ç–åŽÛïÞ¾’÷áCSâïö¡,)û‰ùØ?è䵆ÄŽzÂñ€o·jæõ¶ôÑ]¹À÷†žGlåù6AavŸ:(`Ó…úeéxBHeÇ„™¼!€/³ó½+L®t0²ËRˆ«{†ú€È >Y&N}W9éâC: w2yc“a¾¨¾îéf B¿í°¿¥v1øž)m3Ì_VôÌãqÔ- IÞ+ ÙW Õº‚(©(‚ïH àÛ$Âx[—\¶ußr„8f7Ü´“ÙæŸYpkB}ÀÄÐâûp&úÎç´ýÍÀõ®ˆòµé°Æ]3è€ßŠÐ…J“ñÙÀ˜ªù+Ÿ ±3,TÉ‚U°ƒýÇ# »ôæÊÄ“ô:CoX»ÈHJQ®‚ô_ï'*Ö–a ‹%“0°Öç@·¶chÉ Î6K'­ÄíÀ˜WR·ýá=ZŸ4+”ÖùC»4¹Vq”þiÂO8 4ûÝ]Ї}b¡UdNøÀ"U‘¿öÿØpùÀnûcR|¬ endstream endobj 1313 0 obj << /Length 2747 /Filter /FlateDecode >> stream xÚÕZëܶÿ~…à/Ñ^ž(’z4ЋÏvÏç-Z;(t+î®l=Ö¢äó¶ÈÿÞ¥Ý=oÒÄpÔØ†Oäpø˜ß<Éó;³`ü×®º—O½Ú àoÄ% SåÅ©di”¦©×joéýpx+~zòíõÉéÁ½†ÃÈ»^z*bQ*¼X…LE©w{¯üóâö¶Ôíl.áÃl6ç>‡*äÊ¿1ºýÊà ôŸöE®gó0ˆxè‡ÉìÇëg'¯OÞp{>./ á-ª“W?^cϼ€É4ñî,gåA›Áù¡]zW'»#,õ¼ñH~H¸|ú8?>OYœ(<Ò‡3pÁ”$ð>é$sèq )Gœã˜ ν8 ö³0½hu7›«PùÒ«<ÿ®~ó×°Yßò§*zúOõlõÍ7¾¶ ~NŽ*(ˆX(¢ ’8!‘•«¦-ºuE`¬«l1¯r5èQ²(‰'}Ü0bào$úO §Œ‹äs ù»:g)¦’tBÅD)‹” Å0ÆÈ_*hº5ÆCì.šzY¬ú6늦&R³Á¶qÆ«[ Sø4j…°ˆôËR«H ðO¨U ©M¹˜ûï¦Ö.âêYµ)5kÚÕ"ýg…œ%Ÿ€$d2R°aÊ‚ "ºíÆPe¦ÓíDá‡s&ÒpB™¹bRÅ$ó²(¥Ÿn²n}Ú5§Û¦oOÑpp¢$«Ò˜%RLˆBÀI¶lîæý&Ï:=Ø»ý¼Õ[jœŸ¿¸zÍ…ü×ÍËó³ëÇ—_y¢¥,^'DG% *ÙGç]¯Ûí8Y½†8`±”ÓÅGK–é¤åˆR1ã©ú¢ò–’‚E2šP12f1ç%®€Ñ_î¾ »eùØY±‰XÖn²I³š°yOè½B2…ÿϬ¦xÒ%ʰCøËjAÈÒtJ‚˜‘ø2²šLR&')w:2…¥a‡?VV“±bÖü2Æ.Wóÿ4„QÕÿ¢Rš” ¤þpB½À}5‰¢_¾acü2ƒæ¿Ë­û¨%\øG…—`"‰?‹£ÛD´ÍþS¨ø5O¡ûø&jPš„©'á¦ÆÎì/§0ŠüEfð‰6ŠýfI”¬ž…‰¿%â¦mnK]™‡ÐM3ã~©3ƒO¾šØ[½DÕ`³k`P®ØßCå®âÎf7þöâÅ9°§‘ŸÒçl¦¸ŸWE]˜®ÅvÖ5- ]b×®ßza?4ô<«û¬¤ý„å)\¢dØÎôW¯¢˜`<¸·Œ~!¥Vš†Ž~¤÷ c°ön! ’Óoîf6„‚##-ðsŒºÅmï`.³nú2§Q‡ d‹ESmÀƒ->@¸+º5ñtšxp ìÔ|£D¤Øl‚‡1( DØ«¦rsÀÇŽÊ¢«A7‹²Ï5âTõç/h¨7Ùj°\ül“UØÚìoøK;wÖAÊåèS,öyövæ° Àvzë—A8¨Z >¸òCl¦þݺ HIóZ8qe v0Œ<¤…#Q*³ë6ô]´ÚF];jýˆwmÑ9>²z¹A¯ìM]¢Í¿¯u} |Ÿ¢ÝáÛ×nhÛýá;î´õÀù®žµ5.ÝPžúEGwEYRk 1æpM°<½q|ý.µ¸µ—mSQ+5͇H|°ò^L<& n zržõh9+öß’)9é¡U6.þY9 G÷ˆžÞ:í Ô+åÖ…(q£ bªjc(vX «:}Ÿµ§p€Ó#¹\)Æ>pæE ñª«”ÿÃÚÜNxøy¬=LkÓÁÚ‘¶Åñ¦§ÎÚÕc»)mÓSžÂY»€ áð†j 1ˆ!’lÎæÌ-Ù˜Î:ßW2þ‘'ë 2Û¸¡qáðPë@꬈‚eÌó¸!N´¢¸S5¦¢Î…g ‹åvH©™KNT½¡UØòã0¥fH癵Ƶó8 9»·k›´(LÚÂ`màÊN$ 9e·Ô#aÌ×CBÿ7Ät¨sÙìêÐÒY1ħŠ\h74+oÜÊ ê>Ü33¤VÅj uÔµå6^oFJç–|Ì÷$,áè|µq/IûÞ|`=LWT76Yû°­Œ+³Œ!emG-,)ñk -lP¸Aæý Bª@ùÐ!®bøº äÏ®¨´ëSÁ:;‹yNK ;ƒ 9±eÇŽs<ûÂpú9 Ñ¥¡Þ&³Þöv¦ è®Ð7bøgËmX†˜fôÂy7ò#Œ{×$@=$Ç2Nñ ë.È‘åy«ÛÑ¢…Óè@àB ! Y×èEHÃ7„£ p=ˆÇË"Ú'L9¦^Çx€‡ós|Y°Á?¼wn¤ô.h` bÓ¢@ÀÚ ô¤[CýŸ;OáþŽ7çŸ5>³4‘ÛÞ©hyŠ,\µkÙ+¾‹¨G·%“‰ØCë½!„ì…/–´Ç=5#©Õ”îê+ûºt€(VÚI°@Žab6œŽ"]I ÑïÂ2M 774jz¨ŒYöèƒ*‰üïñ)é®0n¶;ån~0Ô vëb¼E$CÃEmÃpþÕ±»ª«3jƒeNAAÌVˆT?/¾·ì ¾¹þ K²hü^]Î8çþßžØÏÙÅwÌÑñþƒ W‘»k!Ñ–ö½®ž3‡kî Ù ¢6'Úßü¡” M›Ïe÷cÀ˜×Úáž<ä@\ååõå0:.B5ùäßTz«OÉO.ô„qì^$ q³¯å0NèùöÓ¿ÎísQ²›Frš²°/@¯EØq0˜½l¹œ½¡Z†óÂ5F£Æ\¢Ý9ÆÐGˆbæNfÃ1¶ñڋÆn…T÷£1ª vz4zFØ-Yvö¦æOG«OŽÿ=FìŠÊ½¨þÏ Ï)dÎ]x&…#CUî7.áÜþîH‘—Ø!pÔ‹ú@ÛÃ÷ñõÉÿ^ë endstream endobj 1339 0 obj << /Length 2293 /Filter /FlateDecode >> stream xÚÕksÛFî»'ýpÔL´Ý7I'ã9§VgZ§‘ëܵý@K´ÍF"’²Ï÷ë‹]€²$»m.±7i2‰À}X`ñX|ˆã«ÍÅÆçø0ª"­ÐLf&J2Í2›eYÔÑyôv‡GÐ}¸óâtçÛ—JDtKžGÆ2›©(1’›E§Óèçø <;›Í`¨RÃl0±€ÿŒ&~×Í?ZשãÃe9-CÉ­±Ì¿ž¾Þî|رZ^§,Q*šÌw~þ•GSè{q¦³4ºö#çÀ ðxìl¡œF‚³Œg¡œ*ÀÞF‰T,5ˆqw X(‘ÆçõlVd_—Õ6ÿÍç‹Yñ¾¤€‘e‹í–Esƒàd “ø²˜¸‰ïÛ~¥*ŸÓâ¿ånÀMU0Z“Mê¹ëÊâ¼Ã!9þ‹®Ü؂֜†ð9É»bJi‚äœïî Ç9 w(3šŽ!ŸN›¢mûГºq“-áð½YÀšI\`Ó>üAènxÛåÕ4ï‡7kS‘,ߨֳ+ä|•••ü«ñëèÇ+‹¡Ë Øö++[ ŒÝGÅ´t;(åW„…ë~.NW @n¥×˜æÅ ÆÀ~ œTµìp58qØ ¤Y®Ë†‰â¸ñþñÉO£±cž‰OFß½9ÞÅ)›Òd\Mfk­ã“‚¶£ƒÆ=g5‘ræ‘*HÒ<Ù+yŒøúúC ʘŠÁR™â>¿p‘lMÛÀ Á«#Gtš­a/ŽŽšÔ¬§/–MÞ•5ÍϼxÔNT­ š«øuE+tM^ DÜ:õ> p@ÓúqÒëGéÏÆ­VMXâLA’û®†–Ë{Õó»ÑøóÆ«ˆ_ÂkÏð>!¹¾,šÂñ^%ñén'}BÄóüý€d\Üê®Ü G¢¡}^{dj‹É²ñJWVÙQwyqé…?ÏV 9îqARŠTbˆhŽƒ: IM€Tÿ¹Åh©«Ù Nñ ¸O»Q”&EÓå(Ô:†ó¸ Y«Ïñ—´®×¯½Ð\à‘Ò¼ºÂÓs°SÿƒWß¡ÚÂÈu­"Ý…Q´,í妣þAö”ròª˜V„íêP`øOr L¸¡'8î¨Ò˜Ð§ëÈë0]>°ë¯,ǧ§ØÒy™@ö»¨,‹¢Õ`ê6Ƈ÷Zgú0`a\{oMSiâ­àšIùëú‘÷l“€bÊmC¦þÌ}ôn=ò.>\0aÍ6Ù$hŸL7ú 7ëjCäB¡¨ÚåÂåGÛÇ£qß›4Òl8JM&˜¥ëzÏi‘3æÎ˜¬™ìǧ:ÑŒÛT')à!"Ùt¾žl¸2¸®›óMȵ&À„ŽŽñï€[Ž›„á™åÌ€Á Ç3«™IåJTÀV~úEfLðØ÷˜ÛEÉìÿºÇú]ÿÐ1O³°¦Ñ 8É'ŽOÇAí†Q’qnßÊ0‘靯n‘2mBꈄSÊ/a8¸ö~8RyʲD~aË¡Á|)l¦{×àŽåBr’°”gIN!¤K4’¬˜d.Yòi%+–åÍ"gax6Kô+´MÁàPº&µwœï;`QNòfºî_bˆá@ˆ€1±$öa¼­=ôðÇmc¤úl·Ì»~ƒVN›èÞ<®»â¾t ØQnTŸQh{Ó]b&ë69ÓQ*ü‚rFOÖâô'^û¼†ë»+wOÐÕ˜{Ÿ¥í6V§$Ôº2ÝLPa–Åeʪ ÈšßÈì÷¸-ÑöÈQ°›„Ò·ù´â÷²®>ÇùÑ`©î.4ÎU¥_ï£ÀP PÓU–ANš~%Ôî·Wyó ^wþ8ðÏÞ9ð_¿åwÒÌ«*Äm¨À²#ò(5°C‚¾·‡ÐAyˆ@ÆÀÌn÷~e¬Kǹ ȺB˜>SA¬sY@âǺz^/«©ÏáX8°r9aRˆü{N+.fõY>C¸^¸y»K®FSVÝdÆ9UÚ¡0S§´ÜdÆaÝ‘O^µ×E³†t Ή I:xZnR>ÜÛ{5Ú?Ÿ?öÂ0©§ÉÂÛw£ñ¿Ÿ’Æty·ì…äøÍh<~3¦®rJÍ`Š… Ã=àSʺêJ@•ˆMöÏò‹ž%è6Ésüm(1ØäÏÖ˜IƒqŸã¶ß¾z3>:½3øààÈ=ØíO2 «9bŸyToF¦–%!Ó2ƒ@)Q›â'~âìîs룚„ðA˜€Q¿L&ûDdz;î†{¯#[À‡ó<¤É˜}øüÇ㊯¶,äå&!Ì}¢—Þ?*xüS–€¡ˆT–™>épŸèŠ4ãô–#lÊ·¤Û Wìî: ‹Dꊕþ^BÍ Ó"` yÆt’lIuo\¿€`‹ b~ÐõÔg}uÍÖmÌ5/Ó¬ÝÌÇ'@PÎÞÏ–g~Æb&ã(’”)¡ÿV’-¬fIÈz¸pXºíl`åž»rÞ{ðæm1 s|F0² D—ÉtË/?ÿµr«)òQ.þ§¯`á¾P ³6à›¢Ð‚%j+ÎûéÕè˜Øñƒ+ sÀë%ÅÿRã/Ø/•î µb[˜PNHÍ„è« ™2‘nqè‡J¦ýgD‘Ûäªl…²Ÿ‘Q‚ƒG¯^p»dý Akg®ú²&šY¦½Ñÿg2)¾2¤*~W½¯êñõ@ÄVC¿(¿=8nïy·0¶Ñ07¹Ÿ/\„äñ´8Ï—³ÎW(ËÍÚaè½­uÄÚá «¡§].¨<¶é°ç¥{ï ðë2oq`Žß³Ò—zÒX_a®ò·¥…/}Y²›áß"ÀŠÇlíÝ×jw§›Ã&³²Àúᶯ&$Â×ß<^,Ý6ÖWñú¬¦¡mÙ0É=º…+HU wE¢޽Ýe5¥Åž²k± +Qi|_ÜÜ¿÷X÷zRMWs™z…vÜž„ó"( œu½9iNÕ+m?¥êчåÖ |û_КßÔÀ@ß endstream endobj 1275 0 obj << /Type /ObjStm /N 100 /First 984 /Length 1617 /Filter /FlateDecode >> stream xÚÍX[oTG ~ß_1åeÎÌØžK!PZ¤VB„Jm£<@XhT´‹’ ÿ¾Ÿ}H`.»ëãóí_gsi9¤K+E)ô¡¿2ˆ‚§Ö@tE”h50Ùš¤V%zhÉVÐk[Œ÷I—–žCÎU_ö‘)+…E\Y)”d¸JŒ‡Gx,R*«øÔn,¬oDP1Šf<¼í )ë{54Ž\”‚²a†JJÆë ØxÔ0ËR(™ÚlcÀ¨J)Æ#PÍp8ÊÆP5+UCa;3v@P^„m´™õDÀu±#@êÈ)PVû(s UJ@±®ÈÔ0^ Äf_î ì43¤ˆÙW E̾’Œ2^UU‡Z2t41t´a<èèf)DQïÆƒŽAƃŽŸÃú8µž2¨j<ÄMÎ:-œÅx¸$à (¶¡¾£Œ¥zxÙ³©e|Â[é¢W2×&PÁܲ.b•[ÕctîI þä.ƃä>Œ7 èæœ¿$2^ÕŒGAeД\'AJUPb<„üì"<Êì" ÌE5aR¢BfUè˜]s.‚„¾Ì.Bb … ³‹*tÌ.‚2»¨BÇ좳‹¹2»~—ÑŒG¡ÂE‹½½Åô aK éý8Lþõ74Ūvæ !¿ºxõêxq÷î'Á£FÕëÂvŠš‹.l±Á7°ëÕ&ìí…éñÕ¶è =¡™Æv{¥aÑôèl}r¸Ü„£0=zp¦'Ë·›ðNÞ“ÿ^/ñâéËåbºÙËÕæ\SÔ/¦ÇËóõÅÙÉò|N[ãý¾|~úôÞúm8R%9ÜF9†¢§gX­å°ÏÀýÕj iGs=T{¬^ýŠ—DOWD¾"æ-}`¬‰]L‡Ï6öüÛéêßÅto}ö|yf&¥ãé×éátt¬»8Áþk‰Ãb¤DAœµ•CFŽÒ+Pûv®‡aúeýdà•ŸNN7Ëxöâu]îèa~¡Ù®ìw5Gà^”àÖbêö9rç­vœ_<;ÇÒÓõ*j\î4e×äwº9µØQ‰¯”£ÃDü¼W~¹ÛÌ´¿·g ¦}S>N<~¨ŸŸþÙl^ÿÞ•m(è9¦¤­†£D£à`êwq™•LL[ïK¦XÉİ;:ÉÇõõx®¯Šüp‚ ETEV³ÍÝÆEme>0ãL»S²D `$¦˜«Ä’šŒ ç4™…"W/ELçWQªƒ† Œé;êpä÷ؼ, >ñz»Ô1ª8ÁÜc§· ¡Ê&ö‘×<œûÛ9ßl|÷|sm¦ù`ØÊš¿jØ¡L ;:‚é°£w›_t„Ÿ‰t9ãèEf÷DóùR‹©;&T,+¹:gã$uÔÆ#hûú÷åtÃèÛ5Ù}5bÔà qшö}sÓ£L¨¨pM܃Y0b¸Ʋc.ÔyìýH†RÛ·¹QÔÛ•A¸‡Å’ocDœxÝ"Í@½l»ÛåMðgÚåVðŽv¹»«]nïl—[ÁZŽ9Á¨GU¼`üæmt+][Äyµ £|à,úœ¬)c"t‚qŽz÷ãZá \ëcqîO¸Å–¡!hj¹:CC ÆöìãÚ”ª34xP”ì n˜aª34¸V»³ºÀ4à@߬½â!á¾®×Òø¸×R»]¯½¾qê·(j7ÀW ¤÷Ìê£Ò·áãÞµmøÞ†Õ?!jwb›Þ/³Œ”(nɸ¤æ•Œv„Œ;ñhN0Ô4ïÉ1†ÓÞØ ®H‰"N0ºÒÈ^30îh:¹Àh¢¨SΘ£Ž¨ÎÎh¦VP§œîFuGrF31Û¿g>0áÆàô6eŒ®Þ £Ä‘¼AWFB¶:XZ‹Åt¥R¬Þ +(³7è RP¼åöÆä-t%ÈÍ)8ŠÜK$oUÌHÁî> stream xÚÕZK“Û6¾Ï¯`9SU#ï‡[³q9W%Ÿ²9P$4bL‘2)yìlí߯K#jäØÉnàššÒ @4úëF£ì÷AøøïfÍŸ_}áOލ…2iŒ)F[¬‹Ÿ®pqÝ/¯þq{õýŒº©,n×…HV(A‘¦¸mŠ_Ê›vµêì¸X2ÍJ €KRø'(åÛÉŽÏ'×ÉË—‡¶±‹%Å’Ð’áů·?^ýóöêýñë!Çé¹Fб¢Þ^ýò+.èû±Àˆ]Üû‘ÛêÖõ®xsu¶d]Œ 6ätÉ”!-Чak÷íÖºeqUV]7,¨.ïC³îZÛ»öþy½ª¼ï]C–Ͱ­Ú>tôLür-Ê7vüàÆy$ ¯€ShÆ9úa*ïúSb•§ôi¿iû»ødïér8ÄñÓ¡vC6'¯¡.p¹ß¸ŽC$Ðî'( °$ ¥Ó·þõwîEÈxùìm¿ a‘+ÆÊÜ Ÿn^?C~"‘ar>ÓíÆŽ0Ǧ¬Re²Ü‹v¬ºØSïÛ¡Ÿ\ÜTû4nŒC»¾}¥€î²±ñÑ¡OÅim¡ÕN¡mmÛ0i"Š”· P²!RúaÂïÇ¥&ËS“Vv»ýè '¼\N–„¥%E¸ˆ‡K¹%(`:Ø$ôTåHq ¢ðWumwû¥Ÿ¤¿ï—ë÷M^›)*!ÊmÃôÖ°sH†…x¸\%è† ‹h¬ã°·MèKƒÓØ6(±×Um’2]ÞØÀ¢í§p *R„Ì…=D½­ºjóa!$l•ƒ½N=áù¶ò®|#ìƒðä¸] þ ƒÕžT¡ØU#tÁRÝ2¹x Ç0Ö~¬¶»Î¾ðæà*Šã?°ló?¿¼hP¤0`é¨3(îy2 1­¼Ñ;± _¦F>&#)âúÜl±?2[_MìË#/Ç«!;ç:Šù/³NzÁÆJnÆ:hPëÔn±T”Ïì~ƒŸ…ú¿¿RŒ_¿®‹gÃÿ߬ÿ½â"°H.2Š‹R¤pÜðßñTÓÔÞõ±Þ4£&w‚¹æz¶¡§U|VwðB‰b°ÉŽ$Hs "2€ØÌ¨¿ÂàKfàVÁF  @»»aè·cüâÅ÷’çáZÁ hT> M–4pýŸ<]æŠ!)õ]>a?†¯¨ï9 Pbñ´BÎ)8cèùDB}^•ׇ®ûªï`××­m.kv ކ1¿—Á©FFÈŒ°1†0%3ÜúaÜÿU<ËÖí8í¯ÓÉWýù¹Ç«€Ö¡N^¸ î hò€HâXe‘ÄxTŸ*‚¶³5(]}Á+;yóöÕMœ0=ñ´¦5bXç;˜¡ˆ)öøDðw¾¾FB‘)¤fŠ#%r"|t… PÔHÓ‰ünW‡®í-:==ÿË™——'Œ` %Jrb!¢*ï*Û}š ®ÀoÉ „ HÑèõßWÓæ³@à€欶T¬84YÃ1嫵Ȅ㈚¦QÑ!ù}˜í—LF>q"FMÑïÏ®©»vÚçQ f•9Aæ 16|ðìðío¶ÎÄ=H‘Œ—Ê”¤ôü›™q?Ù  ãÉíÙÙ÷W—°tŸ.$òé ¡ˆÈŒß4(‘ˆ²ù7 :Cìôþ¼ê?#6ä¸yneˆ†f„ S$õükûŸ`Š77«Czg·;ªf¼™¸t6ÖëöcŒµŠä™hƒ“3ù äö®F{é$Ø´}º »³½«taö ‚U5%DÓpþMîú±,¾É-;Qü¸§õ­„…Œ¢ù3õ8ÿ/¥ÿ*ÐzЪÑ®Ë#@Χìi a¤ϸßG†™?—rmª×êïN=td¤–*÷0Q=âqOô —¤ã9Ì‘Z, µ}Õ/)÷ãàÒMËæPÇ|U|dW†Tj7*µ]~™ËZ™²`cb®»Ž0ñP{岈‰©¿D•1M¦Zu6t9Š®+åƧ[o‘}ÿÆgÈ!uoÕ]#fx¹þ.ÞÅÔöwŒ:æÔº÷qAÊãHJ—€lTùz·•ûr¤Yy2nc^óÃtéå3‘Söm5½s ²2~pŸÕ+Ãi„=U(0EO®wX‡ÒG®âù²q²6–1‹8¤œ»A>1z˜l¤1$Z¡pôª¾qÞ§»šZ—ô.˜)_Ez!»]:÷ Ì]{)ûÔdýÙûvò¹ÃŠ96l©3„ ô_]&…¿ endstream endobj 1422 0 obj << /Length 2168 /Filter /FlateDecode >> stream xÚÍZÝoäDÏ_aåå<ÒM¯ûËí^ÄCX`„9ÝðàØŒ…Çžµ=›]!þwªºÚ3žÉÀÂ8+´qwu—»¾ºêWÞDœ%»ÝÝÁôû×Q%ð_ÊVGÆ*fSkmÔ¹è6úïEÝÁòë‹Ï®/^|)ydaY¤Ñõm¤S–Z-˜Nmt]F?ÆŸW77µëK™É`‹%9üÑ‚ëø½ëþÕ㢊_o«Ò-–"I¹ˆ%_ü|ýõÅ×o.¸—‡ï^¯2f¤ŒŠõÅ?'Q k_G S6‹îýÎucòøŽ~¸89‹xÂlbùTd!Y¦Iâ¢ÎûÞ¡PVÆ«|!²ø-þqDqo¶yCoºö&¿©êjÀõ÷´ÞÞÒâ ¨LUsGô÷¬ÚÞ5`‚Tˆø?-RîÂÄŽèˆsX¹.–ƒ""‰ø~²ÜÐóª\ðx]5U?tùÐvD½Ç—Âø;ôhN°Á’K¦UðÍÐÂF‘ƾªh–…ë{;rzÜUo½¸ M7 ¢‰[¯h[Í>á<2 PJ²jÆÓ.‹ºr$'ƒ .Ãá}OgU>¸òðýeõSÂ%XdÊŸ—e·ÓaCò){vÊ_. :Én:vïòõ¦vÿ^,OâWíz³\XË›’_}·¼F&W»ÍªmQa¸!¯{šä P¨õ¦rï@w¢TMàXÖ>_‡Ñ7WßÒàzÜl‡£½;™&ª„è]£¶þ©|±uë£ÞlR’'3ò¤ÄàÔDy£ž¨{Ëò/¼`í(¢îWUíh‰kd5µ rL$’ãµ%’A"–m‡Hàƒ¡;%yާÌÊôÐ}_5¸vv%: ‡CKÏ ]¹ÞE‡_Byqð Boºð Ãn2ÄÐRE>TmÁ ¬;ŽòliÏ^1œáÞnœƒP=:®8:®ØçÃ*lº@€ ºËSú’Å•_ÃÒÁ¤…•JÃʪðbà:8ŒRÐNïµs MòºóÐJ"úâÏj*WBSFÆ×«*¼(äèoÙªªë¯‡$PlᎇûÛà_<äU}ê†V!R÷.Ävï T–.´¯D“¼Ü"cÔÏ­˜aXt¸N‚×¥ðfh Œ8²Fv`GzñA½½!¦m¸r_ä;Ãr~àe?xµ€º%ÕatëêI¾ ÇLɼ-¤8*/0_£Íé–Á,Ü{š”c³ô–Ä·¯Â:Ô`Jë£ mƒ w[´Þ$Ö'þ8:ïj(‹5¹«/ZºÄ£‚ò*$œ•–£ÞàÒ©íý¶:¤í_BFª«_ÆJâOÕ¿ô8E»?i ß¿>‰$¤0Ò’@úˆ$“™ñhg>|¸óá1F0%Ô1`‘X}Ú‡w>”Gk–fÔ.üÛz'Е֖Í):üõÛy] _õÂ'Ý_éÐÇ xÒõJ0.Í 6°†YaáÀ”‰D„"ÅjYÝ’þ?%:¡‘¿{ëš²í–ýÆ Ë.}ú)=¹€Ôžàáó ҨβƒE –jI†úí)·[h°8?ûí†cþÚÝÏüæÄH–bÈ$–A3D–ø?¡~¡’øc˜èP•ÛÁ… ¡iãÆãJ$ag‚Z ñóÝ»L7c”îX€§”á)X‘ ƒyŽ‚õt¹Ø‰­¸¡ãGÄ è… Nó†Ö¡qh×¾è!uª`~¸úUŽpwâ eÙ¿   (r íÑáeéí‹›U€tÆc¶›M;lHNÀ•±ê혔¡u€A™ûÂõ.€#9GòÉŽ`÷}ä}‹|D@>Wcg‡¨§1 í¶~$Ôß „‡ >Ûª°p“{ÑqèÝÏœ£Q¦³}ûx+4·IŒGõH#·~4 u aR©Þ£tÏ”7ã¾&´é^² Äç~m§‡÷Ej»Cl°t3~€ñ6 2m÷¬[Þ{4 ] /w‡_Òv*¸0ÊzÉ0ëËI »öý©LSÀþ%‚i'3Óóf™lä“odHæÁk2eçÀ¬€õTG@û®øŠ$I^¾|‘ªytÕŠ)efÔUÆãbWŽßŸÂå󨮖ÙѦTøu[<mJiÀ†gOBpŠágA›Rp&Mø+üçp õ&4ðásÏ4§«I™zÛÔï»ü}!äõVö¿qÎÎß$H®§¸þ(Ї€®T¥|Æ{–@µú™ª‡È$³œÏ—QEåʤÏQ=„¸JÅŒº(W®ˆh|xf\ÎÖ"…ze²§—¡%ñìŸ"ñ˜Tè³µId!æ}«,Ewé·u˜Ðïa;‘¾%Ò¾ñEòf™¿¤ÉvøÏW/¾ûœ¦“vÏW¤$þaüùÔtÎþ yª;fÚÖÉr(ÁÃß’ÿä›÷ô÷4uôËèSê“€S¤9`€R:ýx¾QskY&ÌŒ79‘€<òåì5Šg)&›/os þUAãM‹_`PÛy«‡6ˈ9µ6)3V~½×–qcç qžJ&”úkÅê‰:*ÍÒ¼Ÿ7óHhü³¡1—)ã*ÔÍMù ™‡Cû/gDŒ\¦í^ãÉ'KæQ<æ?›SqüEG™âµknÓYt¶œ))çSÙjÿæ=º5†e™šïZgœÙ>¥3ÀîÊšsã?8%¥Ï«·/8~þ®Áw¥ endstream endobj 1452 0 obj << /Length 1957 /Filter /FlateDecode >> stream xÚÕZ[oܶ~÷¯úr´@–%9¼èCŽë-Š:'öéKÛyW»º–6’6ýï^´7;k§3‚¬(’æp†? 9ó&c„®ÿ·ó××/³:£øO1A¸•™¶‚Xe­ÍÚ2›eÿ;¡Ù›_žü÷òäÛÀ2‹Í\e—³L*¢,dZr"•Í.§ÙoùÕÕÕ¢lGc0£2³œáäLæÿïÊö?kùËU5-GcNã9ðÑ—?œ]ž¼9a~>l=¼0Dd“›“ßþ ÙÛ~Ê(Ödï|Ï› ËçåEvqr{ÊŒK-Ûž3bd˜² šÎIš?ïºj^Wõ<(0q³_Te=ž÷]¨ì›ðœ–¿S&êrô™,Š®+;§Ç·/̶L¦ˆ•¡ªDÚ(ôÔõ®f‚(0y³D[˜¼l‹¾i$°yÑ–¡qÕy)X5kÚPUlÍë'~–8@šý$ÝáѹÑu^N*7çÉð78.P4?]µm`ña„Ú=Ã>‚ºõ±<.©hµ mZo'êºtJgãAODŠˆ‡Y³X4nØwqªŸßÒµ¢7v-źïJf_í¸BÿZï°±øKiWañÏÞ¬ŠÅh,¹Dx‡õ~à>|Jw.¶ÂM µFê` âSŠ õŇº/Þµ¿ ß©¤¡tö~Ù²PüþûM_÷ci,–h‘Ð@ù–š vì3_4Wˆ”$šsEXJh%\FÖµj—M·«{[ö«¶îÂË7}»*¿ åjv 2¥ÛPÝ6l’˜Œq¢ûÜ6{Tâ“ÖjyBâ£@˜ÔaŸ×Ó°Hç)iO‰ÚA:lKc‰¢æ´wÚÔÓª¯š:¹ ´nHÍ€R3bmB ”Z*Í @) B&T]á Ú#8ðªé¯?IÞyÞ/‰e… ÆÊ¯‹)*SJD *<ÎÛ/àJ¦‰¶:áàŒÅÿQ6í—æI*&¡­¨Á'<ž–â3¡¯(¬ ZÁ¥½–pHAS Ê‹¾­êy÷dÛB¡%5S Pèåð„¦”H¥ŸSrN¬Lxò\ÊôL¹ƒ‘‹ðèVWoŽÄ9Û\‹RK_C‚•ÄH‘Ž#ù–ÅsÅÅî¢%eI0œMx¢£èÛ$¹‡Ü½{Çgíõ´|Ë‹²žG«dL Ê-UBsiN gO€)AJÂi£HK¸ædJË9Dëö¶ìV‹~¿±ˆ5åÛb±*œ™Æ¨‚%žQ@H¢y4êFí®/|Tl½É¢or]´Å¤/ÛØ4k››=s^•óªvѼgw¦ªWkûÏR7„Ñ”–N˜ŽGžm2ÚöŽ'*Î;ìçÄ„ËæGý¡ÛÚ‰k†«}ØU}ú–Hÿe×á†ìBÅ_¡GÇz;’*/ÚªÀá·{°üÝu5qá×ëðÚº ·,'QþzM‹U‡›…^Ͳ߈š5+wGçڃŒ—…ø§û)ûálØ™«¾.C}W¶o}ÿF®b\•Žáj<óÖó¥hóýÜšÑç1YþÉ[÷(ëiÓŽÝxîeBÊzo´Ý ?§xŽq IÂå:p7Šf—í²­:_¹¯Zݸ߫òxóº~μ®úÜ›÷בaR1¢¾Žî»NîÛþêòÇó_n§V- U&ã2cÕ!à~=` ÛÛ0Ú\R?”²ñÜöëÙ/?œ¿¾#¥Ýv…<ðäJpe¹+õ½x%„ƒ–Ý…VÀe€Æ6tñu­¹r@›È™ïE¬_®ǽ½~á¶Ú)“Ïé#УâNŸ1gD twÀüö=1ÀÁvV »K~;Zéñ2Â]é Œë2.¾%péÀ£á(ÈPE“~(¥ÅaÈt˜4UŸE®4Äj³+7@&˜k@–7èðh·ahŠ—2O1!ç>:bD¢î)èÈç6….¥$™ƒú\¬cÖ'kÝHJ²{8ˆBq-ÖÝês­wÅžþüübÍAœœOâ =@©Ç”¸P÷ÓÇò.ÿ‘„â ®æ#qM‡Vù4?†Ëk¸>f©ÜMÖÌ¥¸¹‡r„ů#ÿr…D‡ä®Ü¯³Db€p¯›hÿ ÔÞGìNÞùT˜|(‘Ã&3RÄÌȳ÷ÅÍ28‡&~Yð[rºÆÏ8.j¨Ý$ñ=,2Ž¦Ë‚NǤû!rŒàíö3J …'“ìgÒ]¿—ô6`Ú¡ÌÃL¯ÎN7o¥ÉTrYm). ­Æóžug43ä5Üýäz<\/onÞ<Å"½ÞÝàØÝ[ ÅRw].œL™$ExtÕÿ>bw#©úè¹¼ÐOÐÇê‡ç?`zhm endstream endobj 1375 0 obj << /Type /ObjStm /N 100 /First 971 /Length 1220 /Filter /FlateDecode >> stream xÚ¥XÍnœ7 ¼ïSè ´%ÀÈ¡ |+¤9´5rÒEQ ° ÛÒ·ïFÚ¸ÞL|ñò›O”È!—òd—6ÚäÙDñÁÞv<º·¹8ŒÝhMk4& c6öD¨ÉL„›X"Òt؆6ÕD¬éŽ…—7“Xy­f+‘ÝœC÷@öl‹¡¶,n{&"m«båXlŒ„àzä¦76;rÛ{µ9YÂÚ°°ù)A&’°°#²Ä(ŽœXRËG9àI >dçð¡œ|èJ FÅÍ9,øð¹Â‚·ÄðgÄðÚR† k'[’{%¶ N ñ¾b“&eJ –f#ŠÈ ¾ <¶H§À‘I$ixUv¬†’rŠV$žÉ(!85ÏÕ°ˆÇ¾ "OP­Œ ,pÒÚ‰ÁÙŽüJìs¯Ä¬ñàÄ–'¶OJlòŒt(+"(i‘&Fy„ìYX;yÚ8Á‚Y‰Á‡Rbð¡±eš!F¶L¤b=‡Àf¼°ØáB±ðZÁ7Äçaaáí‰yƒr[°,± é‡$Ä, QB¶Ca$†Ê >L•˜ÂòäY“È!,øˆGXð¡31øP gŸÀ¬”|ØN >œípqq8¾lW¨á…Š~ÝŽ?ýüKSë–™ŸÝáýúã‡o/^ü?yŒ®p÷ˆ|ys}ß..ÚñBp¨7ߺD1ã´6GÕŽÏœXáøêöæý§ûvÕŽ¯^^¶ã›Ó§ûö÷âoþüã„/Þýv:¿‡£Óõý]=÷v8¾>ÝÝ|¼}º{b?œ~ýýÝw7ŸÚUx4’úŽÞÝâí¨ø‡—¿<+‚þÏY5Ïê¾úBŸæù!0f³+ÄR$s‡ ‹dÙ=:DÌÖ ¬‘‰º*y쎲/qÑÖ»ÍY$/êQ95²­®è™5²JßV%£ ¢×Èä=~…jä)Ë¡C¹¥!Ë;Í¢4кY•l£ÏY”ÚS¯ª®*J=³G7«‘‡öME2:yg/Jƒ³¥Á¦¼( Vô^*Jý¸O/Æ™IºU›ÏÙc(‘i{W*Jƒ÷]]ØGQ¢FÆçZU² ßrQD»û*JÃV'.Jƒõ˜oKdL€}rQӵ몒 —‹Ò˜²º¬bç@4Dž7@´>ýYÓ=™bà+M1Ýÿk:ˆA¬<<&þ¥E£Þ5®:~ˆÎÕÌy2”]¤*t­³HFK‡\kdŒèÿÅP`r>?ûœ'£´8Ü,1u¹CG•¬1tƒÁ“ÑÿËdíãÜÅYòÀˆIE2n}»É.]ªZ&ìÙxUÉÞãêV#îkC7÷è,U²[÷],”‰éüIûO2¦sÛŤ Ÿw\ÞŠdL纫dLçCŠÄtþ¤Á|]—þæÆ¬g³>£1ë×4f} gÁåj×Ȇ› ncU2jJ©HÆè³ÉTŠdŒ>kTÉ> stream xÚÕYoÜÆù]¿bá>„¬1çà1ò ZkW©#;’â¤Hò@íŽ$Â\rCr-«Eÿ{¿cx­V¶ÛB aÅ9¿™ï>ÈßgR„ý¯¾štO_ÌÊY±4BÙh–X#ll­Õnv9ûa/œ]Áô‹½¿Ÿï=y®åÌ´Šgç—³(±Õ³$R"Šíì|9û%8Ê/. WïèTp€Ø?„‘’Qðcãêoœ4Á‹M¾tû*Œ¥ ´Þÿíü»½ùùÞï{’î#{ð&‰Ö³Åjï—ßÂÙæ¾›…ÂØtvC+W3h ¸?´‹ÙÙÞpåÉÕÓ™ … ­_]i‘F|ógEîÊ}•-ÜO†ÁÜ- \Q•W ´?Ÿ½ž?+²Ææ—þÙÒ€ j÷ûÆ5ÊÊ5Mv帳¨ø€,/;×~êÍ>Ð˕˪æþÙš_俆Ò,x°Z·9€ öMÞ^oÁXfmÆ-ÜãŠ%Òp µˆŒgP^.ŠÍ2/¯`¥Ö~34dÔf_M[ûi<\ ‚#cau<6Ÿ­Ö…‡ xËÓýcLð¬Z!®y™ùKÃ\N¸æÎáÉo¬<®uÖú(À¨Ù¬ÿ";8}±SRâ4ø ’‚ãTh¡Ó„¤y,=¡[¹ã+¢Än ¤þ@~òi_y÷>‰©¹ƒ¶çÓŸÆ›õ]íК8Qã‘Ú´ VˆHEÁ¹+Üúº*ݳaì?ŸÈÖO¿æNˆ,Ø0õ”ˆ†jÇ \Q”XeíâúÍbük…øãÞ‚¨$Þ‘†4k·`lhêÛoù)•6°Ar/+—œ{a°ÆÓdU¢Yá(m¿YŽZ‰Äè”FcE¦Ìƒÿ~Žù0 ˜uóÇDQô‡ÌÇGýY¢E¬ì ³P2Þaœõ4ίN¿°m–xÚè«WZý×±Í!ÈT? 6„àù׳ÍQ a˜Ê³Í‘·¨äW°Í£ý?šæ(‰„Kù`ÂQ’P‰ú|Ó%xùµGT(íg[f•̤6ŠÔ˜&à>T0"…p[óçï[W—YÖ6‰‚fQçë E©Öˆ¢]ô­BYŸ±œT­{Ê‹'Î@ø®C‹Î6k6áU )‰²6¸¤# ןÃÍ3€:°¦T& I«ËÕ»‹¬(ÜÒ_OO®gÁñ(ÙZVm~y ›T2ÁirÍxJ¤¤-7è2nínê¼íÏEåÁ+†"ò>“ÝÂÂeƒ,Ó€³B‚P®s–bâI¶Ò^g@J0ë5å8&TÁºv˜/½ç) ¼°Ñá€K‡†'覮v›°ÃÈŒÍözŒpf„t=FÐ:¿~¹Ÿšà_Ü%j™p*ý2ð'2ki×?ÎÏιƒ&³t7Ü Ö‚ø»%zÿÇkŸÎOæ?q¡L¤ãóÞîàŠ Û3†×k^{:9?<›ßL#°d¶Éñpî·'‘ öUXòR1Qh0òÔîÇð†IWÂ">¡) Ag2‰d’ -Uçîu:Võîí-å–hSÕþŒËª(FJÚñ n|Ñ ¬Ê.H=M†›šÂMèf~mLÁ˜{ï›®F;€kÞæk/@KÉlí_å¹rxÁwx„H½™ŸâAçÇgóû¼Ã.§Ã8 öþ=£LÄŒ‚±m‹ChI(”…ÛŠw°ÞÁü•ÁåÈ䨎Æ&êh ë[’ëêÝ#y$ÿ@˜-Õj•9…J{ƒ-Ò?Žy`œ‡b‚ÜS8ˆŒÝëÓùs^‚V¢78 ð¥«ëî´"¿t˜W°ý¡CJ?EÞœ¾<>ÚN¡cÞæ#‡|ÉÝ1t̪Œ^p\ÂÜ‹GÜÃô¯ìÁEcîÁ¢vü3ñ/1¾§<¨Òoßæ žë9ÇÌÁ]>±ç§é!c[o»Æ„åWM¸‡Þ]C«½¦HØù…ãô{Ö1ç8=f/ç'¼„Ò¡¡æ§®¼j¯9»›…úýÌ{“DwÄcæã‚1{€ ‘ìÊJIOçÿï9b9v&àí#p4ìU¼¤‰ìJN‰/9%1%¨»ÓΞdz¨ºp'ïž%?×uu…b(¸Ìój¼–ELŽ,¹ô(<G¸„J;U0ú9(þük$Ý»+è,&_fØàèÇûµÆbÁ^èv¿7Ú»=|DmމjKÇvTŽrŸ1AkȘ 38.ãm¶^½>?~uòìcl+t†›³ý-­Ä¡!ç÷Üò)×ÀŽ^áÔO/Oþy×Yje¨äLZ# ðg%$¼"Ö)RFUbǹI( ¾Røçâ+Í4™ž{üœÕ† œó3¦ {lW">Ð7~žò-\ÇF¬,òò­÷âÈ2k>¨™†Pdˆf¼YyË:N,©øÖ²ýŠÊ(Üaœû—d.Ã`‘ò^€”·¼gúyŽ D7`Ûüß]•‡=FJ÷ûS¹(¼]Y1øiWØWV–c~€V+3zw+-ÝÆ±5Ü}„”"’Qw‚ø\îªûG¨¾îO…¢_ éV‡H¶i«U™hVtTêJ78M•G"YoˆÐ)WE ‚÷ ´«çÒÔãàˆ×£“ÝŠH ¨Ë8úÃï•?&БÅW)’F $™¤ÐÄR$z«œ´õÑXœtuWÈ[|mÜüÄÿ']<'ãº!ô¶*§°“ ¶¾^—Nêu2 yxCNß•}íë2]­â­ÌÀ_'ëÎ÷uxJ¨vØðþ{4ÏY®vaP›/ý —stà4—aqü—¿Ë»7 hžk—5ôFá>³|N^ÇÇÚ¥-ñ¸>7C þx§èk%”ÔŸT·´¶[vUTYq×#­èuI—+LÜYÿÕ^µó&Šhk>Q c0ëq·9ÎYpwðÄ”€'~úoo%æYú«û!¥Zýu¾ý¡Q=Üëv )rìÍôß&&t2ðÕ?1H­õ~îbµ¡œháýä]V?)ò‹'K~ÙôÄó›ë!C..ýâߺ|à‹T¡åK"ÒZȶܓ´³HØ$¡¹c :ŠïäãX Ý@÷h– džB ð†ëÛiè èkzù¸¢Â¶4øi‰Å¦æÞ¥sË Ìmð–Gøm˜»,‡Pìõ÷9²Á}V 0oɵl¸ã߫ޙp$+Š,¨‡ô @LÊõÛO`ÞÿÇ­wÝ endstream endobj 1508 0 obj << /Length 3209 /Filter /FlateDecode >> stream xÚÕÙnÜÖõ]_A á†wáÖ7G^â ®RYAP8y †Ô !. ɱlý÷žrDrO[ï=w=Ë=ëüî(Ïÿ·ÛY÷òµS;>ü •õt8Qb½$L’ÄisçÆùû™ïlaøõÙwWgß¾2ÊI`X‡ÎÕ„^˜' ´„‰s•9ïÝÅõu™·«µ‰ x«µrü ´ ÜŸ»¼ý¦ÃAë¾ÞY¾Zk?TÚ5võÛÕg/¯Î~?St5noc/2ÆÙTgïó Æ~p|Ï&±sO3+ÚÜÚ¥óîìpeßKgü˜Ï—¯?cæÃ{©Ä‹âï…ðáÊxeâý¡›0™µ£î'jJgm<8È\ܤ ^ 7ïw>·þI4ü3‘^ä‡zÚ„'À;Òž B ´ï_ âéI í…qt:æ†IèÁCb$ÿõDo'ž9¾·ñ 󇯽xˆqô&ÍSÞä”:r”ò’?"ˆ`óˆIÊ”‡é¾Ì7Mý«¯ìvߦ}ÑÔH¤o_ÅSbªÐK@4A©xA"O墯—bbå¾øþü§!¶}wSy½Ò±Ûw<Øæ›¼ø€™Ýïò¢•ÉóƒŸ418á§­¬©›~XQU+¹ûz¥ÜbƒJ–B»ÞòÌû¢ß çXÖƒzä+´Üßó‹quÖz"†„Þ(WD0©Êñ˜–»ùÇ»¢Í;P¿ŠÜ772i‡±[ç=î|šö–#šp!!1ÃqÖ.­·yÇ€kPÛpÄMÓÊvý.í×@ú„Ö-T¥¸þÓa)“Fö]~³/y ¨Ö5•lºI;8÷ç(÷ L°,TØo`¡!,Ž˜Åèv;̤ݧmÏKÛ‰`­ˆO„8ŒÜµ aJüË;Ù¦nˆtˆe@„Ú»èèTVaÓb¸RQ– ¿RÀ‡îÕ ì£à‘fY‹»OPÙíwj ^ìj…‡Ë’ w ¹ÛÀíMÞÊÔ)>9O¨ò‡EWytÐ’,½*Ú®‡#l¨æÄš€…ܚɇWH•A¦q€(S§bÌÈá73Ù&ïïîH(š¶/x«`†ƒ0ÁÌ bn}-²ÅÇÖî@z<†‰bX|:—/Ï/þöêÍëŸ/_®Ÿ¯t螟¿üéjI­˜Øó£˜Ã6ˆ˜œˆ†X8Í$`¸ì0ýÝÅoÎß,íø "“a^H¥[z³6Qîù1XÌs9ü@Š<ë”v$Î^¾üéÇU¹ÿX8ÂO™àˆœ¼÷ý «ƒÖMÞ¦uÖT¥èñm^ç@í<“ÁéCZߢ*é×µ*¾áIµgƒ#é:< Q÷ŠŠ»Eâ6¸Ý=)Ôp¢? ÑÔ¬@”•Í›cæqƒpEHœ¢­¯Dža n‰ðücZݕä®ÛW(¢Ø¯|1 µÈMº/{îã†à6d !¨7ý8ô¨‡”–HìL××e>çŠóÒs/6/õi¯ «Š‡¹Ã£€C²¼…X¸Xœ«^\ƒ@HøŒr³@ál/Ê¿)½ñÄ ý#­þbßÒ4ø)äð¬÷w Þ:/‰à$Ìi~ìósÇV‰Z*͸S @Ð_y¬ØÍÒ>Å[Ï€ TÇÍV¸u6xÌŽ=‘[ßåì=ÑÎpXžM¶ÿ{UÚ³ÿ’/°YTJþ±èzÁÖ>”p’Ø}S㨙(¤Fä“®ÃeòV|ÞÉe-©fü éìà·å,™zLØÓ™º|0©ÇW?œ#:µl†›g§§LžI¶¤oºý5xóè5„`æÑÓ·¾’GçÏC ëk7ãhf€Žìxñ Í¾ÏØþaïa؃DDZá(ÓŠ¨³E7ÈZ/²O7EA\,tíÙlˆñÖO'ɰ´¨WwäÆs§e\á„}'ÐÁý\ãN]ÍÇäùÌKòŽþ¨?ÕwÐ…,(N=òÓ‰’_Xö(º4B&ìÂÊë”Ô¶‹^¸ºq™‰§¬hWJ=Jøs¼FêmÆÁü®_fWŽ®_±&X\ÆN4’ v·Ñœ^¿äÛó{…Þ„|æ ’ͲòK…!´4¥oáé –ùtØ©âP¸&Ï5c8½«á\ÙŸŒ(5nø»¤q^šbqÀçC¯øÙB¸–{[Ô46yĺïdü]Nöc–ÍË8ó=ßáÿ§cÝË×gÎ{’\멈gK"…à{ÃV$Œû´(ÙÊ(?›=<k»8vo(,ÀþŒå†Ïå~»¦•©£­7È¥ý’6Ú¥G¡Lz1%Ó³¹•ùeq;$_†'\tý‚D˜‹¨üðk§ÂL¤A#ÙÏJ…}Í´´ R¤'Ë\š<-™Ë¿p&š4rïÜ0`Íöô±EâqS°p €lÐÑÈú]BJr‹èœ"÷k¬ö|?>!mHa«æ úéfƒÚ—( Nƒ»Ž!’ýÓqÿº¯,Rô„üR±—DV¢ P kòÈÁ_–à“0ÎWÞIŠ2ãygu0¡A›ß•©<ת© u±9 îš/u:äu¢¼8 'È“ƒ€y8Ä>+¶yׯwUºYWYpDÖÓ¡þ¿z¸:×F™ò-„€$Šþë%Tm#O…æt%T¢=­ã“–P5„jˆÕé¸k"/Œ’//¡jãµ¢¯í9â1V‡_§ˆª`¥Õv(¢*_ª¨¯V‰uLH á)CîÛgü½àÏ5¥{°uÓ6·.!f Ì´Ÿgp}ÞöEGiAèôÝ ²°”’€`ä9U’„6Bjb‚ªx) 0)]ò|]⬣Çâ ŽßÐÛ‚RпCça®¤Øä²W¨,‘;æÝ‹’¢ÇGsœªŒ!š©o1dOb÷-Í/ͳŽÀJË;üÕ×!' ‚Éš þÛ´N·yMÅ{U¤\YvÇÀI6Šº„¨Â"fŽaØÇa`“ÊÇt>všk¤ož YN½@³ëÓž«´ØcjI„Ž¿ 휌‘¨àdAÙøÙ LžS¸Å.ãl=`JMΫC«‘Š+4¦npœŠKWéÕçDO*³µœ^ÑÊý®¡œ,Îä-.îC##:rѺT¶‚Þ?)vwDíîoÏDŽ´18ªÇm†ì†üšjŠÒÝ*ÙØq¸]œð0B/‚kÒÉ8£…­´?"_Z2ˆJC¥EsÚ4±ã/°=æ¶°SInDÆ¡÷˜UXHDY°ùñ¡fØ\SŠéÓšROéZRG2iš[¡›?T0]ˆq;*“ø‰›^wRúGQ¢ŠŽdTqt–/TþPáÂuÝ-ƒ8›‚s†å&÷d+˜Òqâ*߸œd¡˜9ºã_OLF”Aa‹ŒSLaÿæ…´)"=“œUæX™ ÷Ìž»ž@d£Çèÿ•A=´Ÿñ¯û˜ž‘Ó32=adò3€÷#|€L~tÓñˆljÜËçü=”qa””Úüˆt#{A°Ü´™X4)ìȆüÌ bI"5§Úägž”³\ýâú;%”%aE?ºà& üb-6?O«Ï%vìEÁøcƒªèP£˵^™Ó¥rø\~øEÕðs±Þ–o)úS¾ù^?Vlò…À ¬ÃÆ‹ÁÌñcÞ3Ô8Ó[)™pÑr xW éÇ#‘{XÑü’¼!¸Ì¡¶_Ûù‹YõÿLÖL¹ÐWñ§É“r†cÚ;lÔ¨•ÞæooÒ!‰ØÈÒ·Ï.¸Áö[ìÈbkpd± ެ7³ËÃ$ãßÙ?☠endstream endobj 1530 0 obj << /Length 3679 /Filter /FlateDecode >> stream xÚ½ÙnÜFò]_1Ø}XàaØÝd“4°^¯m(ˆ,DRv±Hò@ {4„gH…‡,öß·.^#Êp[$vWõQ]]wë·•òƒá·¾›u¯Þ¬ÊU?V…¾N£Uœ†~jÓ4]Õnµ[ýx¬îýæì7gß½6j•ZÛÕÍnYߦfGÚlººÉW?{ÿ,no®^oLb<ØÀ_o”§àO¤UäýÔ¸úo "CïMWän½ÑUÚ3Ñú×›ïÏ^Ýœýv¦ˆ5,&~lÌj{<ûù×`•îûUà‡i²ú@#+hû@?´«ë³‘äÀOW«áœ|¸zó;F>¤K¥~œDHÂ{”ñ£™÷‡(a6ë•xª)Ÿµña?bsuë>mêls[´ qîkuñëkc¿öi¿é ÙTû6‰Ÿî†lj}о¢b—mA¾#y®ÝÜúï“\–S_™ä k_EveãëÀÈÁ³§9¤ü(IŸð6õm$‡¬îÛ¢*ùRó²Ù€a{fïIö60éŠ5|UòÁÿ÷…g\¤L9PJ¹ñ hé&|q›$R§Ã|‰Ç˜2#Yâ…g§Dþ]´ûªk×›0P`’Á™ÅÞÄ.Ø•8ÄüôTì2øÃZ'^Õrî6ÅñþðIڮ̑ÇpfJ€Ž@Þ‘bÚúúò‡ó—ç7Db¼åü;¢.] ièB™n‚¡ÛãƒC÷ B]·èc_äìë¶hÜÑ1cXà> Ö¨c÷g|±/ew¶ù,M ;Jùi„9ôwó©û21‚;Vq½¼|ûúüꂘ#rvç–l¹\‰ü(³öòP jx¹kÝY„bÇßûÚ½/ªN Û“)ÀeÅúÛfØÜ’*.JÑKÆÄ[ˆÈJ&5{Ätió ›Jžq_Wâ8k”N‹7•wŽ;m%ã8êE:hTÄW´&2¨x†> x[gÍþÙgä´ª·è8%R¯#:q3X·d )(ŽÅ!“ŽãËg÷Í— QõÎeRÓ±œ"ý@JÖ8¤2 (µË0ª µ>ì©7X)œ‚“Ýf(Ö„Bç„ ^Ûmq÷w² ]#Ź+]¾$³²¶“)ÇLÔŽ(æ¨TÇÉh”þ~ Ö>;yBÙ‡-íÜð´¦:9c[Npt¡H9Çyõ±_¤âÃ%§´ÝNHëšG‚pƤN£×§‘P^ ãDyÄVC éƒm;±Õ €rVîpÏwÎ<~AžGBQ½[3÷hÀžãiãŸÊ¹UÉÚÍŒl]È”!âR]-RO2š"¶™ ¬;iäìl7S@xYÕGö䯣•4é4"š+'åH1…îž‚ÒèΉÚMäm›†a¨¸ýmá`Œ¡HšçklRŽÒ™(iàЛׅ+&mÛú°¹ÍHÊß5Pc†weîdÂ쉺¢{6 ½‹là<’cAijNÙŠ6»vÄO„Où8†Øã$ Q]“õç “5á!‡bçÚâèé>ÞpB¸%[ô²«kÙs¸¯%RòŠii¸Ût÷}]`­ú1âðaöù !Ž\$ ð—G­ öJ¿@ iÊ<ÖÑ1$Ý&œè?xYPmYh„a3‘BäTjQ1œ"lpLލÁ"¸÷€„ä KRœô»¤°óáÀ–}ÀmY׸ù¦"}x=+ .:¢¾õÁ¬íøeµŸŽùÂó?QE4:¸4ùÖUDc”oÃøwU¿åk†Q˜Õ>aÙרÄOc)ûþ•KÝ?•Ûê^Ë]%#ìB,/(Dø…”äž[(ú:‹]|Šr¹ ”ÿõ®>ö òCÝ'ÑpþMô?.ò:á*Ì·ybl ¿nárb«Ó•N”Ÿ3¦al¹À!|1ÔtÛl4€VlQÄÞò4¶~˜ß°ÏÁöÑe¥2Ëñ50±“Ñìl’X= "ã.Wh(Þ‡½£Ø£¡s#Áû¶À`ŽR›ØL#8ê’»Œ1H’”îPÝ[ŠH.3ê]f¬%}ljü¹+ú›º gïžñ;'‘Ø—vØËVø"ÅY÷÷™s ÑWü+ï0ìsÀœÈïfï–+nã¢:w¦!gãdL[%,räB8 ÄDŸ¦\u‡A³šÆì‹1Q˜Á˜§ÖŽá“èá<;ANawÂ)ì"§ÿhàâ“ÇP)jºÛÒµ þË„>„æCÙžf5ÛØL2çÔ;ˆ#‡xgÛ ]’SôÕ]OÇö5=m!T«?1ˆò"À­‹5 o‚”¢Ì ¥¼vÌByù=·T¡¥ìÌJ¹Ã³”Žº€SVÜ:ºåŒ'·ÊËfÙ(f€¬˜øeÁOg¶ºµÀQGðʱ=r™4(Tì°Ó×èïJ抳QÞèÓ°4š‰@›Ï8í ’Ø:a»$³ºí7_²mÖb¡Äk¶"Âha#|AÓù¡ R”pÐOûw!Ý¿)Þ9B0•Êd],Ä Äô.b®^“&@¬áIm:è …FûZò"¤è\ö+då%ǃx¸…³NÝøÊž« ¨8Ü–q·l"ö°•r 4I Ódz‘ÉÉE2 ON…–”óþ]“æö;³TûœŸ³;мf4‰äB«ÚÉlþ”U`=ëwý´¬]<2û00¹:Ôóü6yþü;£t¿Æ›CAýˆüUÚ»äš=;büJŠ Þí^F ^^¬×ùÕŠÖ#ß8paÈqkµÛÈòõ&¦Â¦’êü`WÑGôÕêí–ŸgæÍ¢>HNß¿ÇF&úqHoQ°-¤À±Ï¦Ç,Ý‹ý´Ò;ri×rÐŒßSe1cÝÓÑÌL+£é;Kð±©ÁqÏp>°#ÖöHˆîOJíqB‹’×”w°ƒáâ6TºÑ}L†KMƒ“å]0c°ÃŒ!Ú+(Œ‰™1YÖÓiô…¾¬®ŽcÒÏï0ûêÐ;MQ¥Ç<× T ܶåfv¸«j`Ó‘»dM,ß1æ*1 Qó£~¬†GýÉÄA¤ =ø$ŠðÔÄ¥$èRhÚ®'ã i¸©ä½Îõˆþ‘õñp¶(—ÿq’óE‘ÔÍð‚ÉQožÍ¤ÃkNŽ6Ìja ©ê@NßɧŽxyO éì“Ì^èd­ñ)†“AJ{H§êÙ0¦µÐ)bí'§¯yÃQúŠŠ¡ 7žï+ Nµ7NzšaàÛª½, ˜ÕQ¢D<ÆÿùˆSq}¯¬xÀì²¹&_6Æ(oxåÐùØ8U]!4¯,—š”žƒdØ&Ô‚uO$6¹¨«Ç™È¾$H ¹LcíõD¦iY™m6p[q•ŠÊ|¸§€€žŠ6í:©÷êGÄ8Ô¡Ž/쟕c«grÌ~> ô±^;&á"ùnÓÌ¢Ôhtêt ÀÈlC]Æð# »œOQ5=󑬈„'„zˆ–PoŒãzIT/кt:éWä’þ§YJÐ_Ýœýƒkà endstream endobj 1547 0 obj << /Length 2980 /Filter /FlateDecode >> stream xÚÍ]oÜ6òÝ¿BèKµ€WII”öåàÆNê"M[Û¹Ã!̓¼¢½Bv%Gq‚þù›á µÒZqœ r8ñ’Ã!9œï½÷Dÿ›ÛÉôâ…Wy!üKDÈ,ötY’e™×ïÆûó(ônaùÅÑÏWG?=WÂË`Y&ÞÕ'A’)OÇ2ˆ“Ì»*¼7þiy}½5Íb©RåÃÁb)|b)bÿukš[\Œü}Y˜ÅR†‰¾Jo¯~=:»:z$,=b8>J­”·Þ½yz¬ýê…A”¥Þ½ÅÜy0€~o½Ë£’SO„AfbL²TAÅõ Ð+¿Û˜Ê–~«º£Á}ÙmÊj@£ÁОú5üÕ~½mšúE}°·1-cVAþ ãðÚ‚Ì:ï[sp.°èÚã‰8=$j“#¡ÄTu»¡ñ»ªÆ•û­)nÝ 5ò³*ˆ#XÞw›º)»¼+é¬í'@W@œ¯}žt›¼s#ð¼ÁƒUÄ$äÃ"Žý|[.„_À+E€þô\jOˆ ‹c‰"€û%HTKº? „õ2ö«¯ËmÙ-”€kíΉìDd*Ýagí~¶-M…d2‰üu^Ñ ß¶5®­„ ¯×»»xB3”+ÚþŽ¥ÔØ“”S7´´-«w¼/ÚäÕ-V˜Î¬»²®@É#)ü« /”D’© w“3†cA£Z» šIÞõ0lÜ!­×Ò=…Æ*»cFÁ%Ÿ`gx¿ÐSfÄÂ걌C?‹$HWÓ/QN«÷S1>ïÛÕ{Íj§+sO»˜+ÊQ¯Ô˜|ÏàsóõºnвºÝ>Fc LjIØ`ã#iGQHð*! ú÷WÏÏ/~›Q‹¥Ãœ¨õδm~Ë ŠÔ“~Z»*o´˜ÝµZ÷MÃ:CؘmAXyQ€93fÉ¿mWn·´Þ·Äjו»ƒ#â‚wO4 ŦñÒä­yߛ橆q9x¼ à®!©Z§«dâc¬ç‚•»ÆüŠè£á V®ˆXƒÉ74\×âÜöMŽzOˆõ]j SÞh¹ ÈäѰdÞ¢DÒ¿¬w¦+w¼ž»²*ÛåC}wÒìྺ±º¨ý]NŠo'÷8Î÷¥YU¬ë./+—ØÝŽi–qºz›[å¤õµiöÈ[ä5rEjé›àÖjnvÂor&„=‹µ]>÷(Àxš"G³.‘{k:eùd‘ÛïI=a”èRI÷…!lÐûxޢзµmy[¡™• BéÇ¥GD!p/*|µJÁ§•|ÛξÓùÀ²ÝÑ·¼Î·[wÓH[íü î!¤ô_c2ž^¼8‚wKAx½òÖR¡ýW`:3±ëô—g|H%þ]Þt庼t! Ã(Dh¢¶CæâÔJq8#Ï^X+¦ÁÕI”øç]K m¦m¯êâ]Mâ sJÆC6[|S´‚œ( /çÕ@ÏÚpÈ{Û(ombbÈ™FÙU8¶è– æc¾»³&%w,ÍœÃrµ€?5!¹×Ò,§’ølô ™À ¹#oZÇÏØÀñ̘< înf¡¯°ÞΛ³lˆ™6à¥1å8èP­­a× þnȃ†iþ2sW‚¯kÀóœ·Æ &]? §‰¿BnëÎãx¼ß÷0…aq0¸æœÇëq(ƒ9Ȧ֠PJ£‹Á’?ÍGŒiš$ÅÄG’|ø6" ­"ËPÊ 2–#cƒ@ÀÕ Ê %縀Փýò¶s–ãÐ"Ó0Há¢ði‰@J‘ŽVÝÌ…/Nb‡S@ö?sL%‰oÉ:‡€”žàØe3>°›!ß Àzç4q'¬6iö^Zqºˆ¼ƒÍ'šZ§ Î[ZXbÊö‰P¾}‹‘dŽ}"ÒpHb–%ÜÑüüùɳ³™×C"“ŠÔa£¤‰ŠûM¹Fùo˜jÎ/››|m˜¾MÝÛ4Eï9a'øhBéø…L«vW20J[–ÉD ä#– ®àóü‹iÌ8#ЬÁTªFÔq¶-[®¬2bý@i“ED¶Z#ü%ŽÑ@Iè°u,ôÕ$DØ‚tœ ©„:/Ýs«Ñóç <¸H©FÅŠ}·s/>ˆ]JÄéØDíƒONO/{¦Öˆ³ÑS1ÔRH³AfLfoA«6ÔÁÒ€¥Œ`vl`ròkbˆ3âæ T=JÔXÕíóàŽ{›p#бË*p”iz œ9ÙBÝwÁã\”:ZM9i}”åäéëóÓG9)ÀKª¥iMÇú2XrÑ‚êXŽ‹Ö:çïtì ÎØœ:bþâAmU“8ekWNy”=üÀ {0Ƈ.Ïž]>Æ¡TƒcÏ94É‹ë‚sgÍ‹R8ª1¥Éh&#›¢r ä—ÞŠš&S_x*S:Õ„¶{ºYe ºñS!†­++W5A¾¼¯%Çg’K€­Ah8äѵœšÿÌÐÂÜäý–+Fás©E#ÄÞ•L*Á÷'I¤ò ‚Æ pn¹ÎÛn¨mƒÂŠ€µ ãHO…rµ+éÒ“(Ú§'¨ãû˜s`Œs¹ÜWÓûªOq¥5‡5Tž6­¥Ì* ”Òìú5½álHˆ§nV¬ˆÄmøzJº`E†aa¢8äò%ó¼á-`Æ(a溗˜@i•a÷á®S©•jÛaµ+¿|ƒÃœ¹”‚÷A“T=Ö$}òm_Æ|HO±åÁ«Y½þëgS ZÎ4t%8(éꂪ¤å¨âìËe_¦Û„ !£Æ¡“û7H:Që©ï.é$ ÂP~•¤Ý­Ÿm‹kÈ–eæÉ( â,{Üvä`;ß쪘‘kÈ]b8êCŒºqÓ¸„¾¶bï¸Û°c?l›Ìí¢ªK워UeÐß_„‘ Uÿ7Æ*cô?´V™A¼É¾ÖZ)Ã!Øj(Vü׬Òb•ËU¡-$]ÅÑ*ŒV¹ZÉè[”‰Tú»+\AÉò­ö<í$óá"ƒ¼M Ý䈻ɗ]Þ™-e:ö?ðo‹à›~K3êøÀàüä˜W‹ ÒL'zÛ'v£¹‹…WK_LÈvÍÇ»m^V¼ÄõäJhÊ ÊÊjm\>lóü}cˆZœxÞè)6(Fpz ÌúÖ-g(ç'´<ì²) G/œmÛôîû¨ðå ÆvÝ”\ˆ?ÒþzÝöPͶPø6ªl™©Ñ#pö ùŽÀëÜÖ÷8t ª®–Ù¹ïY9:n„úLöpN›í)®Á ·I"%üó}²Í¸ž&E]ýØ}¾Wï¾<¼úë`NêI}à8&äábËT{±Vfˆ&³û<_Õ9üÖãºÆôñfª>}G_[~è‰[ÍÓVÆä˜È£}[úÛFÜáiû*­Zö÷‰½r‘ÎôÊgº¯Ü_|¯µ5¨ë¯"àF]üGYõkËLfL's¶%4Å2à‰¤Ç(?þº§‡Àªã©¡B<—ƒ}=RÍEI ¡œØWs<¡ýRª#Llú5(³†áhlišZÀÔA†-¬û]ãF\çlvuè©sóY»¾8†4Ê^W3 4~¹‘ñP~í/5 ~cËÍ‚Bþô+yéH€BX#« ‘8T”X$¡ÀîZßñ·)®=Bêóqÿá¼XÍ}ë•"1t.yþìüj¾Aªö}–ã¹³’@µ÷ÉéB&þ?‘®³‹…ÖþÕùå\ßRjÈɾxìп8ûóõÙåq¨¡Ž2Ÿ9jÅ*ÐI> stream xÚÍZÝoÜ6÷_!àN¼¬ø%J}Ë5u{0®±‹Ã!̓¼â®…h%GÒÆ Šûßo†Cj¥õÚÍ%õ&0¼"‡_Ãáó›!ßGœ%ã·že_¿Šš(¿”+&r™\±<Íó<êl´Š~9I¢5¿:ùÇÕÉw/%r(itµŠtÊÒ\FF ¦Ó<º*£7ñóêúº¶ÝéBf2†Øé‚Ç~´à:þµ·Ýß{,Tñ«mUÚÓ…HR.biNß^ýtòâêäý wüð±{•1#e´Üœ¼y›D%”ý%LåYtçjn"H3àÒuty²cyŸuž°<Éù”w!Y¦‰õ~([Û¾w¬„¶ß½Ìfí8ã 9tMþ8]¨<ïnlƒ©,n›ú#Ñn‹®ØØÁv=å‹ÎRbÙ6¿%\­·§G†2‚òmoªD"X¢³Q'žX3`_Ñ嫴·¤ç½óÒ‹¾"§’g´ÍP¶&^VÅ®Í*ÌøfCò‘è+Âæ+ÊChv)ó8x ›¢™x útý™WÀÙÙš+èÄýŠC>–f\>Ö;'½Þ-©û æ¶n*ÀÄ2ÏÖ r„ݧÁ Ba®—>/ãÜψ¶¿›CP ì§§oi±¸gÞ§ÃÛÍåIÇK’3“ȹ芠óˆö½Ây/ÄÜïWÊ–ÞyøÙÚ[ï/x7aS5Þ=n ïCÜ[R)gK Í]„dâIª±wèaà`ŸoãTš0ugÿÕ6N¥ É\3î…R)xUGDÚJ) í¯ä^( Ëz”=hÀ§R_ݽPöó‘·ÂøªÐÓ³òé瘤Lf‡II˜ýÝ ™ p«Žè_È<· ýrÿBf¹sBŸøìÅa”‘Oâ_HüzïÃ~*£ Êã¢vÐ(Þ¸õ}u][" ¾¨òQiÊykoâa^+Ä©c4¥H-è³»´q¥#¨GÌSÏV€ˆØÀ™P×AÿŽ;EžÝèóû$!|rõÊÒÝÝ8Ü{ÈtØ-¹Æ»aB`S4®á~\ Üsň¡òt ¡³uá¼*ÌÜóQ°ÃÝ•F—38iÙÚ…oeüüâ’^ÂÖ¤ˆ¦ï¶jV®Ç^\]² G vêl‚Ü SÐM"—¡Š÷24b;ôú JŽ%ôž¸Û¿vÓ \¤Ð%âê]ˆ‡÷pP“>"e×u{í®& =Š Qaª)¨;iB`Kg;øHÙÖ‹¡pÊ@£ÉÁºÊ™C1ºÃhûÎ`äñÖG  ' úŒ¼Éà~ ´“ ÜD?9´“ úv  ¦“#B;‰]åȱÈ5ˉgeÞ|À³{÷æO=×L€ËrD+² è0ö(3N3–¥Gœ°¡›sÿÂá(S„ó]¾ ǵI¿:|Šƒo"ޏ¸JƒsòÀW!3çÝ=±}Áa´QO_…Ì$.Û%«ïbd:÷ñ»4ØãCkù½kfĆZMM±  {°4 s9(Ú íÚâ ‡]DücëßÈ@Ÿ9T’¾ôy‚-ø~ÈÅÑ®«Æ¶€o:Ï.àL».jö0&ýцpRâKþ6»ÝÜÖvð…uÕßï=…š¿¡|(ã`m]¿ > yäé”ä ùôéWñ¿ééÇØQÆ8'‘6GÈ.ާö®ô±lL}¿ÅÅNÜK$ž?#>²òc…¢ù«ªÖß´Ûº¤ò1·™Iœ^ÿ0®öÂ…?ÌÀØ1¾Ã ÃÞŽ’fÛÔX°WDZ1µÿšFÁHÿämBËíà#üs‡bê-î‚‹„­À6ó»Òà ŒŒÉl²ÀÈÁ¯n;•Š ƒ#Z~à†q{ ðÀÐÙð¨Љ „LAɃn¡§&íY‹jˆYšAO•ÝNFê¥ZÏ”ë{ÏìžøHÿJéÞXi¼ ꎗXD/<η²Ôsê©úн(dB˜ƒóð¢gaTXó # f®™ŸùxSòÙVU2xêX2Ê30Ÿ Ùs7wrçã±î <{ö)ÃUƒëCÿóœ‡éÊ0&€eáú Ó; >øjs”j=ÞM|¾?&ֳǷ~J/8æ[ßßÖ¹·V3›5µ>“Ç^E]·ãSÑñbcÏšùÑr¯ endstream endobj 1485 0 obj << /Type /ObjStm /N 100 /First 970 /Length 1605 /Filter /FlateDecode >> stream xÚ½YËn\7 ÝÏWhÙnt%>ôŒyÀM’,ÒY$Τ0x ?€ôï{H{?4‰ì]™—s®HQä!u¥JH!KÕ jKèþ\CfW´k7¡"ÐR æÀÙÔ ‚$^Aà ÒL#A:AД‹iZ(Ù…ª[€½V Ós蹚@¡×pÈ)¹ †’Öîx'u×a™,ŽÃcn¶j‡Uâ ï£ê*¸Ædª„q)&áQ²ëÜ;5‰lîc96¤—!Á–ý]€»$!$ÉüÑŒ˜dI&eHÍu„€‘Ê"‡8CÅÎÁ„"pÄÅuH’dz@R×UHÝu-Šë°Š6Ó‘›»¢R]c•\µÀFв«`¬©Ã`¬'ߌu±]ÀENj:ª8Q; E™³í› R±_™Kr@²ÃP {ôípYÅßÅ*j!, »ªAªƒ±J¦C´¸w¿¶ì:,Òݬd¤R˜ÀšB‰.ND؃Œ€ˆ§¨"ˤ „¹â…Rð£erµÓRéĶìCþšI‹ìtÖm ?dœ©PØŒÃjÐÔÌÎ7—$عeB©–ìYaP-l2$2O®cHÅâ„“Öš\‡Uª:®@òØ! ÚIJ±4H–ÈŠ Óî‰\a£[&+öX’g2 •ä™\õ”ójooµ< È匂~–7ü ë± †„jLëñù§OoW}œ9J™sï±#3çÀ­D$ǶRlØêX{DöO‚E£eà8sZ'ƒX€£&N)ö4ŒV#*j[9¶tã@ö7Çgao/,ûH¨Šjñ—öÁÄÈÕ eÚÌö€—–'›ÃWë³p–ÏöÃòzýù,|Yïõ¿ÿ¬ñû¿Ö«å)Ö^Ÿ£w{µ¼\ŸnÎO×®«ºß׎Þ=Ù|f¤ Úk§·0ôîo(—/?>>Þ`µƒ‹aþÜ0ë€Õòêüý™?ÿvtü÷jy²9ù°>ñÅÓÛåùòëòô ûƒùsˆµ˜QÜÜRlÙ©$6p,w‰‰Ì—Ç£Waùeóz៞ÜlÎ`någ‹ËÕØ£+|½^ľ6$íèP¯/ m%Ðh]j\ r«L‚ #¹f}Έažƒh›ŒòXû.n5í¨àCDLès`J1÷> ÆËäùu|o{¨stwdQ´Öùå¾ì#ck®Û_@7å’VöÑ3ÌåCǃlaЇòC|{‹/l,¹/_؈fþø„ö€ÄA9Ç ¿¸u' bF’€@RŽhÖCâ8=Š—6ÇQÀ:WÉã®Î`¹â ¦«È6*H6>[z“ª-V­Cg@`'A¨ù&Ù„;Mc×ÁÛ~‡FU0º“NbsŠ<*ƒ¸ ’Nº ¢‰<špÆ`TctÑ2š-†`)1ÕY0S´Ñ~ ³9vœ4 M õ­îçÀÈ#žÍ#*kkŽD“'ˆé=ö6Š¡ MîmÖî†3Ü»›o¯±òWî½7©rºMªÔîOªT’K½@ìêɨ×ÒœSí"GFgº›K¿Ò©F4>ºEcÔï@c×Àߣ±x°;il.½D»Î"‘x\úxÚqWÆHÜæÀÆLMh<¦±xDc3¶£¦®UÞ½ Lêí½I¾œZ„¶où±Ú»1:`ޱ¸¨Ú¬Ñ$^|¢@MõöÍÑASzÐ! ؾmdt@d6É>‘Æ$ú½!†Î&óÓ9†q¸#ZÊ•ôòMG°}@G¸GûbøÅÅ_ûx7ãIår‹¥Ü¯·TD ¢I,αõ<&ÐVJÓ`ôã$“`A¬¸Ì‚ÁžÜ&Á8•[×Ó‰kÖî›Õ|oQÜŸtòþ¤õ6éöþ¤ú¼“›K EÐbíãyC¢}ã!jÿg‘¥;š ú_±ÝQ‚z›©wòÃEïruÒÁ¥…jÌ£§c0¼}ô‚3(}xµqmÞ<ãÂixµ1MÛ?%¦ÀR(–:‹°ääþWä>»?±9pvbsàðê4c¤: ftBžM ¶<ºzëü¹ëQ endstream endobj 1587 0 obj << /Length 2462 /Filter /FlateDecode >> stream xÚ½Y[Û¸~Ÿ_¡·j€±F¢nVßv›M0‹¤h3Stld‰¶‰•¥„’g2ÍŸï¹QÛÝl¶HdD’‡çú‘þèEA8þ·»E÷í+¯õBø—EI ŠÔË‹$(²¢(<«½­÷Ï«ÐÛÁð««®n_Æ‘WÀ°Ê¼‡­—fAVÄ^žª Í ï¡öÞù/ÌfÓh{½Š×±׫ÈàOª¢ÔÿW¯í_zLüWGSëë• ³HùñúúýÃÏW?=\}¼ŠHžh\>Yy{ÕáêÝûЫaìg/ ’bí=çÁƒvòC»ñî¯&‘OE ‹h.»ŠƒuÊ¢÷C9èF÷ýÍP’4núíËõ|j–YÃÍú §‰cÿaoð\qâWÝáZ­ýiËÁt-ó`ì·ÝÀ\eÓtÈö„tœl¸v%[®h:ÊNÅ5å$ÎA=yô $¾}©r/Š‚"M *;­T¨Hñ~I¥à‘Jý{m¯ãÈ'ÉS¿¬k 'àNUV8¶7íŽ×^œ!Ê‚"Î`å0H ±Ø?¬~4Ýæ'*œ\/Q‘ÿHRÚÎ#Ãeß›]«ké1›-ÛNÏ$' v¶–É‘?ìµ›K>^§ ¶iJØê´àÐk¿ã¿Í å÷ÊJ‘ß—GôVîTQ¤‰„PÕÝâ^N}«+mø<5SêëÈ7¿†Q¬1º,ô¨1MR3©€_ƒfahÏCƒ9h¦Ù¡ì›–Wþ¶³LïZ ñ›çÊ¿keî^¦‚‚i¼°ì56ýV?1ÇAó¦ekús‚ëä°=\Ú°ð–UW+F‰?tü=”,#÷z<ïn‰‚`å ö޵L­¹F±¿ÓCï¦1šÃΤ9â6°ã·F½$à¬w²¢þ ¢$'÷…œ5óßDe%] b P(åW×iä—Õ¿èúY„*qSöœC-Y³%~Ô.D)b]Ó!±Q6»ÎšaàñcJÆ Îz^pƒJ0X)Šd “D@$+ºïÈq"Œ³}Eÿ¹?œå¹p‘çÀ«r1ži˜ð™ÀÍóßËmÜtÊ1[Ø1Êeëh½0=ö?XÒÐ#ÔžšY÷†E»Ak„ÈHʃaøÆ÷¯aš€Í_¬ZZ™Ö Ð?`RÈýμåz¦-à\¦ X?¦üA&p†º<ù¾®E^ب½Ps+Yýñ¨{Þ>=ü ¶Å.jÎ×#‰\Òˆ¢™pi dÝK¸áð¢dÔ3~Á™»“1²¼™Ø¸~·@iS¦Ä¹£1òÑHßEŒîh~kµ^(Ý‘»Ãi´QBÒÒ!¾ÆJ韶’Ê\uÊ–õG¡ƒBšíÐlÎPÀ47TRˆ~€nÜ·ç/y.6fq„ÝÉtÁιņÐêNÅ®GmVƒ³K5˜œcf*QTcÚßV sBæfõw’îJ¶ A£c3˜ªì‡E²C︑Œ·Ÿj0£§]ÛY}’]¦‘¤Ø>4zÐç^€ËßÅÔ˜EÆäTsZ+¦3 I&,òßz´;÷Њ¤¯ ™µš>‹YJ­vŠƒÚ7Øg©“¬ç‚g™& Xž±^óÜP¾„æ¥Ò¿8Z„þts4CÏ ýIWG¼•à9 t¤†êùEc‰ã½EÈt´óTuht6Œž‰îÜ4KZx–J ¤~àXžäJ^Õ¶-E Ón>ð ê Û§#ÊÞB,_Þ€M_s[´…Õ j×°¾æŽŸ¸Û?C?ô˜ÕB*lÏL/­¬HÂÖÜžoÇTÍ Š0ˆŠ“Þ>–ö¶1›[§Ús³i°Îs7¡6p5í$yØá(ö¿ \¬‹‚¬¤Žx!zÍâ®s´vrÝ<™­IÝ©L¤Yz:ø´×tjh‚›¸ ìrÔa¥ä±?æx¨b×\Â$q0RZÐnYËvÓú¥kôZ01™ŸÍrç ùh§[˜0ॊQâß›¶Ò®rhˆ®^ôæÁgy|ëÊÑt‘+»™væÛˆ,:wMçXRc\™¥hÉШ¬ù0]ûe¿sôßµÍó_7%‚¿ÇYòÿ ÷iÏÕß¶»7;°v‹-àóVCèg1´yàÁ‚ ¹%8« û>~ª®E;íŽvÆÏ–£O väÊ” óE2”•$ažÃ‰%xd5:ó½øû½ËÉxÆ|Ôë‰DßÌt|·-+=jYtúŒŸtÔrÏÔPJEX {cæÃÙ=OÀD£HCBǺ@¯'?ÄAN] f•Ð+1Ò“€nã†uxleÏ^âwæg€áb q?!ƒ7©ÑG¾ùµg¦áÀWF'pÀÏüá··D%‚|!µ•C¹‘W”¢woÆ''!¥—¦~a&ÁD…*/š2ìßt[Ä‘'¸ö_àaq«Kú$O×ý÷T¾‚í÷Zb?Uûð¹';V¥š(£ã¡õA4DɈã#G*7Bl,Âú¤³†*fÔ4wð,U’'–;aZa íüϽ.èv:3U…”Þ’$#ÌŒ}îÀÕ\ŒŒ¹}†±œŒÏ3”'¦ü£€.@÷Ñîºxç…kȀϷn93tÖügD?—à^¾„{wsÉ¢* é‡ߒ7%¯Æñh|¡ö‘n^ÓÖ4Óç ³AF‰Ø72¾|FJ¬ƒD¶¥œ ]ZŽ–;ôèMÙ Öi$Å÷”=A½|i_Œfò†È'}Á÷GDzü?Ç_cæÝ·¯®`¦Ê‘”÷è"EŽˆ„W2”Gtùâ//!7÷eÏ v¸p×ê'k†ÁuÙ–¸„°·ãS"Î=?L?À”ÒÖ_u´ôìd8=ç¾PSÇŒNÏÉ9='»7°ƒ`Îm:G€¿òº©?ÁÙÈÆ‚º¦Ÿ¦°@Ì^ÆÛ’d÷°xÁî—àÇg‰v¢àäx«4$Ì"W D¡”S2v?ógúõ:Tà[¢Ó ÐÁ[í4ŸÛ!Jd?‘@ã¡^î´[Ä yÃ5™²%öù©RŠ\‚$ÍARùg•âîØ0pbˆÝå«ýÜ ûѲúæç&r£Ùª mžüF ˆ”˜¬­ÇHã÷z6_EA,ðtËlÚ—¦sߟ®þ X§„¿ endstream endobj 1594 0 obj << /Length 3325 /Filter /FlateDecode >> stream xÚ½ZmoÜ6þî_!à>T¼Š(Roù–ÆiâöÚÞ9‡\?È+zWˆVÚHÚ8¾àþû͵ÒZm‡Æ0lRCj8Î<|Hù£§‚püí6³Çë×^ã…ð“(Dy쥹 ò$Ïs¯³Þ÷÷³ÐÛ@óë³ïoΞý •—Cs”x7w^œI®½4Ž‚8ɽ›Ò{ï_V··µíÎW:Ó> œ¯”¯àO©Ø×Ûî»ÿúP•ö|…‰Š|ŸÿvóãÙ«›³gŠìQ£z“©ÖÞzwöþ·Ð+¡íG/ Lžy÷ÔsçA=û¡^{oÏŽ&ÏLÏ<y˜+4= ƒ&‘F:Èb¶< È÷Ž÷~‡¡m×mó¯P™Í¡CkaV?Ù¬ÿÅaØÚæ<Êü¡ZCÕ6ÜaßµC‹UÝÖ,úÂoŒÞAYØï©WÛ =‹ºÉh…;»>R[4U¿“—«fmY)z9$ã=¥ƒÜx+(b# rýX¥‰béã¡êlÏOö\Íb%ña¥>áÔÐZlØØÆ‚~#ñ QS4e»ãúêþÀ÷¸îÛså[¬È GKªf#¢ºö*iú7h N&œOdT¯uîW=—5XÔqõƒõ8˜-Qù·ø‚ôgƒ:nÓ¹ñh?ãâa)ó¯îÜ wü"ùÝ<8Xôñ`ûÁ=uýÀ/­Û£ï:tä4ÕÕ¦šÍZ‚ò¸ ˜5¹ß´¨;Mq°èÚÍÁrµm,¸0†ÚÍ–üµIä8÷ì¸åÐ[éóæçØçåêç˘%eµ9ô¤-µe¬-㻺¦Òö뮺…ˆLÙÉåÒV NWûoíšCQkãG*ˆYÜÞqùž3à‰SD­éã5æ§Ÿ$¬ÿÛI ¯$¢(0š-ЋY~ië‚£} aåùrzçÙ£ôÑ.®~B=9½û¾‚¬g½IJì ¡öOU?ê^£ëêê˜7”Üv_ [®I*ô<Å1½»­¹­4Ò‰7kPµ°`wûy° ®3®HÌ»iå=ìü÷ŽÔ,Aqµ«êá:㜨$ü€Jéö‚“Ê,Z30‰öoHçt™F]¹ Î‡þ½å•—qqM©_ùé<zÇZ¶³2òÒ‘Bïj@ÒÇþU×4xDi†½]a.D¼ÌNû÷Û¶–ê4cPSœcBÖ¸‚Õ!´C 5ª…󈞲ú(„sAšÁh4Šƒgê9£ÿ1Pãº;…|z‹œ®¼à¥ä©À.Ù¡m׳¥ä¾ç,·÷C×6öŠsW4éU'£Peó¹Sò>G¸OgÉ}Á<É÷·o^¨Y™©4iœ,ô…cc¡ºXyó3xO^[Xx'Vnaà‰´5…¼ÃRꥂ ú1‡5÷s©RÙÕóQÑXîè^(ªq¼VFã´Ýª•>xþà6æBšØÎæÅí09ºEþ¹Û×v')C CØÉípÕ5†Ã:2 $ŽPo¨ÈÙ‰;ÑfÂ]!ö„ž1Eµ–WfG x¾|wu¹šm^ ¼­ˆ•Èp/±I\øCNӌ˅àÿqk2®]]ò[ÊÇ­bB$ˆ«<°ö#y“I…!üµëa|½ê¤:ßø( ó1‚Èdl?$m¢{†¢¶«þí@z=^9‘Ky Iö\n«Í–Î_Fùœ±ýŒDa:UnãœtçÓKK‘…5"Ï! r,Q²„y àQ¥8ÊýžÃѼ=HCÑpG"š÷DòŠ,¢hƒ>äXxI‹ ðÛCÇ’ »4Ö–=®=p B~R{7{Ÿ…eÛ|'Ã}h˜¯pÃ=;ã´AQÒ²G\,Åá±?!ã áÎÝÀN"¤mj ªBȬhgû^¶QÇ* oÕ0QR¸¨z¶¯1H,wøa×îkšÓÃnÂH5“Lí×í —$ +ù=­ºQ!hÁ6l´ t1Š:ÁµD ¡Ng%T»ŽˆÒIé¥'ú”FzhŠ]µF´…S6²lÞ٢鹃ÜÊ(aÛ(šÝÊL‡u(1‹SAõ9øDx-Aˆ8•cÞÃÆVͰ'h*ƒJ;ÍœÖÚrŸ9WÕò>ßÉLÇo;néìÚV|8*1)ͯ¤‹xãФš+8¹@Ÿ0–8SÊ‚öl¨Xˆ_¼£Y ÕNð7––rˆCõ…˜eŽh æBüE7ô¿W7Wä¼B¾‘X?Üö̱¡a;¬ G¿·üÂw¡,Üi‰,|Lצ°n‹J´™Ÿ3ØhºÑ£1|¢,HSãØ¸J¼ÃU1^ˆ‚…ç:"·à•¦ä”ð˜fÊ Î%mèÚ2!±¤UÅÊém ˆŠa(Æ“$ ª†ËË7/ÿö)™´\td ¯>—v f#•‘ø|%šö°€Õú Tí‘Á]Xw,]·‡º”j±ð®e‰.nׯ^þúËW¯ß]¿ZpV–:W'¤M2î†ÇjQ4›enhÁòŽ. ªjiã;' !Ýîˆ&™Ç3l˜ö•m|XšœŽ8©¦^¿úåÕ?&dÀiâzaΠbZËÜ  pH̳ÓÃ0MóASP!î@kÀ§‹›ó ö –ÃFÂ5¢ û‘¡ãa–cDᆩ(jh “3¸B\©kJyÍÜÏåõôxM…Ø<£*ˆl ¨s5|GL8÷o‹¾ZsußÁ§ÚÓ(t\9wÛ@(×ÅX™m¡”J+/\02Ô§®áò8•ÕdØBWu9v_Zú< "5ž°à$‘Ð]ÙãÕ×Y B=®>]£ÑV§Ž7üxv t¤æ¾™Ø­S:m¥“Ó8 £ ÔC&ÚÄ/R¼¼X¦÷ÄW¡`=âd‰c¹øÆéçPÉãô2߃B× (ão ð¦Å£iB>S=Ù'RÜ'>bùx°ÄÁßòl8¡ôñIÊëPîÕÃÌÝ_€D7Ed˜ŽW ¡»®§xÖ“OÐöH"~P%7Žø*ä9K<'°³Âtœ´;Y]H&õb©è%VËàHbò‰¬eU2gµ Ásø£”Yzˆ€]ì,/‰ Ç/A“Ëï’[޼Ÿ±Jò U#2!¹[uçHu 3–® ¢ ‹r×(1îŽÔ¯®Û#Á/ÝW$‰±¿XÞ1”Áï¯nŒ¦mì‚!ìY:Þ”‹· *ˆ²hÜHZ8·¶ `ÌBçPÕ'óºr¹™E6úäÔ¹•†‰Œ{ðq~ÂFŸ·Ü¢Âëdá(Ó ]xõ"ç^(ý<Þ¯jùèAšé2†ÒVlr”»C«¯ h±¤‘(’ e?bG–_­–‚ôxëwòMvÆ'Ð~.víÈÄ„AêG§øÙ·Z:^<—KÖÜóÆ?tÍ:\¿^üt®R„)}:G¹ûL®)ˆðóþô[ùWGp=†Iƒ(Q§_èõ}¡ÿŸGûzÏÇö¯ˆ£GÓ–•ü¿çÍÿÍ€Á h‚8“‹¿àù?¦•µ] zÇ‚càÇ%‰üÊUò#£ û…eÿ©Þ[Œ¢næ « ÔùéäL7û1ý·ú±Bp_}àÏcßÞ Z&ŠŸÐ : ÌÔÓ˜Áø·Ÿ»Êƒ ¸ûÓÍ=Âï"j2yú~‹×8{f«í®X¯veü4>à¦éŸíƒoŠ|y§öìé– N™‰äný®X ¬ÁÒ…\ûò$K•æA=Å´Ó(Pqâe¨šv—kEß?åd“8HÒü &›§AŒɲ‘› }ë9 Cõ¼¼Íž«çÏŸ%æIf4\=Å®tF+U¹[«ÿ̾G»Œü/ QM endstream endobj 1611 0 obj << /Length 2168 /Filter /FlateDecode >> stream xÚÕZÝsã¶÷_Á™>„š©PâÈÛ5¹s“4ý¸s:ih¶XS¤¤Îñtú¿w Ê’¬Nܸf}ss&°€€Ýß~`äÇŒ³b÷¿¿>è¾?ÏÚ¬€†+&¼Î¬WÌï}Ö‡ì*ûëY‘]ÃðùÙï/Î~÷NòÌð0ÙÅU¦ 3^fV ¦Ï.ªìÇüëúò² ýb)Ìa¶XòœÃ-¸ÎBÿÅ€ƒ*?ßÖUX,Ea¸ÈU±øéâÛ³·gÏxä‡ï–WŽY)³ÕæìÇŸŠ¬‚±o³‚)ï²»8s“A›ÿÐn²g,ÌgÙîH~Hxþ_Ì|Ì÷Ì:|!}âK¦÷«8!˜EÆ^x¾³ ö‹0ÿ+ÂõË«ž”&½#Æ%“Îþz¾On£½=Ö›|ŠÞö±pûPXÉŒð™- &´#,.Ö5š””9=U^¶Ô?—›Û&PgÕÔ¡]›©ßµ/¸ºÞöåXwí—Ï@Ô8ωú’ˆÂVÅ=Ñ—ôcÁ”›ÏŒ¿ç’Ôþ›ÅR MjhóŠKzÜÕãšZ}¸mÊ{jßöÝV¨oꇶ„pU=Q÷O—夕Á,ÄÕùà2†9£®r;®—(~·êš D­Ë›p?ʃçþ¯1xY3—šÙ‚Ϩ7 '‹ÑfNA[ÃmXÕWu[wŒ{Vë²­‡ ›GµB0®çÄI&¸9Àéͧ²nЧ]†/©ÝvmøíDnÁÚz50 Qˆá‚c÷ßJæ^{Í -?+׎3]¨ù¦~H¡£Â6a\wUòñª¾ø\oÊÕrSéyôf,óúóŠÔZ+¦ 3£Þ´c*ùY}U®RÔÝÔúç<ºRTsÈm1ÄØŠDÁ“à噘)H Îö”W.ÛªÛ4iµkœö§uPä{(\â>- ›ë{jÞ¡'œM¡n¯OÙ$”BÄÎ$ÿòÇ…µùßN¤’c™G)­Ì/Ëè7ÔCÁgIƒ;Fí—©9c„¼ëLj†ííŽF”+4š}dg G&xaÂdM°Ãô„§Äíï¨Æ}Á æ•<ĉ0UöQÀÒ.6`§l&ûŠÝhQðL…”ôLNHƒdõi1»[ìÓX.›m+Óü’S×mZ!üZ,ÄX;fHyŒÑãÍ)¯÷U{´X€ºðxµÔ§NcDLèãzU=¬Ê¾JCd‘ö¦ˆƒô2jHñ Ž”CÎC…0 ž¿õÔmÙ4‘'Ä[¹´3øþºÛ6i«rµ ·G‹Ù=ˆ(›)¨žèß¿A¾Z~ÿµFà¦n5ª>µê%PcÑHØ!µ.S¸Åö‘ù"éá`²§TH?‘°xá¦l¨sì{⤇ÃÓÛ :‡1Ì8¸Ì›ŠnÒ;’¦žR—èþ õsÞ|¨(¼ñ/]ÛÀ™u§}5o>„ÓZç+E…ƒPîô“^|ßêG"ÙÞ~öâõº°œ9;ãu°°:çÒ> Sà@ ø<²kǤ˜Ó@Œ—3¯êUPŠY;'Ê1'_ǵ·‘ 9£ðR3áÜkºBÜ2cÕgu…, Ÿ˜ñ«Q8Æýÿý ™{(JìŒWÈÜ+6½›žé™[Ë 1ã 2wœEÊso9~÷"_<ÍÂmœt/òɤo,%0vm_¤vv¹.ÞJî N•OöL%x bîKVzRž³‡zS7eOÔ;Ü¡Œéùs\®,ã3 ¯fñz\.Á)܌ߪp g…V.Þ …þõf¸\lηÄßðúU%y¼0Lù³|Ž·gÚ¼Š$Ïã=õŒ ®‡ó«°¯)ųbÔŒY®“Léà ?¾þ©‚bžïyèMÝgõe„`ÂÏùA‹aR?!«=Êí^Lh endstream endobj 1648 0 obj << /Length 2343 /Filter /FlateDecode >> stream xÚÕÙnÜFò]_AdDžûfûͯƒ‹å'o¨™–†ÑcYXì¿oUW“ŽGA|ˆQ hØguÝ]ÝÕ· gÙø¿½žT{“4I†+&œN¬SÌç\²õÉUòï“,¹†î7'?^œœÿ,yâ [˜äâ*ц'«ÓÆ%«äCúº¼¼¬üöl!s™ÂìlÁS?Zp¾ïüö´ÃN•¾Ù•+¶™á"Uüì÷‹_N~º8¹=á>‚W9³R&ËúäÃïY²‚¾_’Œ)—'wad@™þP®’w'(gÌ%Éø”O~{ó#?Ç‹;fsxaû€—L+bÞWaBl ‡öÌq䳌kÉ`½ÀæeUtÀG-túßÀ¹ïIêQ)d† if ÖYæ„öfLfœÈÝ´mEÔŠ,ã/W—ùKþòå¹Q³Ðnœ`&·sHÚ2É9,hXÑþ¿yh´Žq™Ï@ã°`.™Èä—Ñxs Ì:D\2 ûj¼®âô¡’Æ í³"ŸH[2šn´ƒ‰QÓ>¿Ù¢ÿä6-ð“§u»õÔpµ«ª{j¼òE¿ÛúuøOE½©ü ¨ žvÞ#C9ÏsÍòL6a©U»<óºóeUú¦_»~½ØúeÛ\-nü=Ú`.$¸|-HW„pž(g"OûH@³:†ÈBI › OQ¿>Ç6Š~û%øX¡§øH™"DÇã.´e>Áe˜»9Ëyô¯Šq0E˜Åu–¾öUq&Ez?ã°}½Ì€VhéËeÑ—ms/n˜§ ›ÓNÅ¡N÷#b¢I ‚ˆÜ B;0±ëvµïhP¿.zj†ÁA-p&lÚ­ R h¼9 ÷ìÀ&Séźíü´‡j5®¸ë"ÔKØ‘ZØÕµµ_·8úŽʦ닪òAª ½HÞ¾ kD4â4Ñ D¶YEdál#"Å—Z—ïP‘´Êæ:r!ÂmwN{1Ž€_"¼uÑ”] T–¥ž]GŒÀ€°å&v×EÀmWaAß²Ý ÷g<ÅñHhF$Fݸ Höɨ mïßýÕˆƒnâß/ƒî%Ç6FLJëYc…dM%O…‡µ•F¹’žÊ]ßÑ㨲9fuB–Y;ÉùÇb{^•—ç+BàüÕ«WÇTÂå£Ó(Áa©{ôSÀØ„ ÁÌ4n2YH3ˆ§\ŠzYµÈ€;¬h2s¶¸ò}QVµ¢bãzhßÒ÷Ú7~[ôž†ÍÁæ•ßä{êØ³­¿úþ4B'Ñ(’O¿ŽMQÙmÚ¬°¯ìØÑ¡á¯A|`°húDï+ÞÀ„»²_ƒFi1 Z”+ªgŸTÆ3ØQ3XkPí· õu;2 ª-‹à4,m;…:™•æS;…rd«4¢)jO}dõRå?W€_utWRY:ë-DO¿ˆ9¢’‹aÊ„9„/Xߦ*–ž ¯ì©é¸AXtü_n9ã9ÄÈ-ÂÆî¬˜8 ®"ƒ8êìþ6°¢Æ£[Wû.j£-ǃ@Û8?2½.?ý“·¾¨ê´!ß­ËQp0²ì†P`¡ÈÑâwU—àH{0—rØDâm]” {|ø©õ D](z¥š÷öκ@”Æ5 ¥ˆ¾f4åí.JÕ -R©½0 FO¡ÖAK(j,mHç ÔQÿݸÁF瞮Ɠ+‚ôr{§4§è ûÈ=æäÿÕ•Ôæ¦Ciø®Ú&nFOMÒ˜¤LÒ˜$Ô×í®Š};8Bh4¾ë)âú-}w]ò¹"âJQÑ‘Á>¸ ìK(· º!ÒBø^ñQ5@í©AèQ~ñô,ŠC AëËoþ•ÎXþÔ±¿Ò`ÏyþEÁÿSÞ<(i™Ð|¾³šRΥѓýƒât` €<4,èƒêtj„T£YޝJHf³9Y",³ÆÄ­O)›mÛ·Ëážb`Ã,Äz\‹‰Ç»Bn÷ˆŽ)p¤X#GŠ¥èHç`ˆtðÍäŒ É2fL>a„!÷DyÝ6  xÑYˆÏ%Ë´šxp¶ N {Ä×¾_·«x?¹*¯Ak8Þ-ꕞ‡-ßýnöI½ºÔxäg”›Y¼d,¯BÌŒòÙesÞ,K%ôóÝ£Ke˜²ñ¾­,æ!/—´Q¸R0'Ä·_¯J¡[Obá*Ƹ'¹_•™c2^4¿çÓ„Ž2Ä¥ÛáÈ…GÇëwe]VÅö[‚T˜;"îIy˜¡~Ûg¦Š4gƨD䎩|¥Ò5òs‰R…å,·3F©³òyD©BçLŠ9õÁ°0ó,‚2¡³vNâl8Ò>§ LH΄˜1*˜eÊóãÇ”þè˜òÃ< á–;c¤.gVº Cnwåvp„|²3Ÿø{çÜeL[3Ÿ¨¸S̨¿<8çÖÂÁΜóœ³Ðò—¼ráFB°kç{åÂÐâ9¼ráÊJù|¯\8^«:9ç+. “Öý½\°“Ïèy„a¹Óß~rÄ̱Rò©=¸Œ¡sÆw?:ò °)]Ä‚ÓáPˆ´mbC±Z•xv ù|Óû ó_·xÂĽ6¤°øÞQ”¦Ô˜¡œ˜à{Y¨ômHî@‰òw”\b?/(x|Í!Çsd×ùHH ÂÀe[S*®)gr0R0#¦ ELž‘˜i\–x†^F cÖª‹¤^Уè×M&bb|KÅ"Žó›‚òõXûÃ<²ä‚›!/{\YÔÅfßpÈ×äÌ 3 ϦÔ!sǤ”/ ]ª„s|#a¿Rú€aÇÓ͈_n¾"Ý,ä£Ï/”ÉP/ñªÂá{ˆ:0Zæô:Fº!Uéï*Ot·áðncS…”ªáéÛ~ÚYDþSì qô~’×¥UÙDÐpÒîÊ®ò‚ògBM2á„Ù˜ã}ýþíkj¸j«áylj”˜ì¦g㙆ld[/þì¼Ék ¼ÛibâÙ¢ÃÕϱìò4Kyà9ÀïýÇ‹‹ endstream endobj 1580 0 obj << /Type /ObjStm /N 100 /First 977 /Length 1463 /Filter /FlateDecode >> stream xÚÅX]k\G }ß_1íCgg$fL ¸-´â<´5~pœM1 ÞâHÿ}´iÇw[91-˜µîÙ3’f¤‘t·¶.©¤ÚzKÒ쿦éÏ=Uv`¤: išˆ š¸*Ö8B©M1S纂0ÒPÅJN³VüïiBAK1ucBr“ÅNN•Ê4 Ú˜»aX!Ý”Oð´´OhÒæßâ£2 uÁ£Ñúthš€Ô,x ê&9†ÇÙãD¥:&ÐÒÕbvðAµU“:$÷¢ œ›£0D„]³’ˆ»º‰Üe­ÐÜê4 š›:ÍPšµùZhVÛâ`©‹cÒ0Œ y°aT!uÇ`c’c°1Õ1I\ªc Rë°A,ßô„ ævÏ¥‘˜Ø1|KÃ0.‰™ ã ©;F‰¥:ÆÔ1kEaiÂͪx&œ:«“`C‡c°ÑÙ0|Á½&°1È1ØêlLËؘ-X;-ØŠ‹g‹"y„v¼™„-µ•$bÑV8$"Ž$K7;kil1Ý!H88˜ÀzQuL“ô*»“ÞIFq Ɔ¦06,ï'"“ƒ±9ãÔ Y\öVºmûkµ:¦Ôb¥=5*Ž Hžp£‘çC/ †H4ö|@Ò6ñ|è°!vUéÖÑêà`µ~–Žq];îõ‹´þéç_RÓ¬¸[\97,¾¸yûödõèÑ?“Kɹ"ÓÐl#wÊ#·™íVÝ"n/®ÓÁAZ"G;.”¯:ÉŽ'ãx¢òþðPüÖÏ/·gG›ëtœÖÏŸ¦õËÍ»ëôAùË?~ßà‹Ó_7«õSÚ\\_YErßV뛫íÍåÙæjW¹ûqóúüôÉö]:6#vÿQ€N`èô«­ˆÎññÅÅÚŽwÅÓüñâù^`>qÄ—¬ÖG7¯®ýù‡ó‹ßVë'ÛË×›K7WNÖß­¿_?ÅTž˜‡gØŠk¶Û_yf«cµçfuOF.ƒA{ì'x”Ößn_nðÕÙùõ&¿¾<}sýÍééé×vVâJ«%W»1;Wš¹b%üß\¹|sÆ\ÛÃ9"p ¡Z¶ÚÕÍ96[–q/7<[ÑÿÎÖæÙÚûȧ|7µo‘w©­ƒó”# qîãVì¯D½¨‡PåÞ ú{í‹·­àðêM¹{õ&}ÁÕ“÷7nÖ½q¨kŒ£ŽgŸNúÌÃöžuü‡iŽ6‘;f7$6Úòœ0Р†åVäþ™>ù™~‹¼Ë±Î’:uˆŒƒ×#7;ó¨fn5[f†ÈµkfnQòÈ•ƒ§y%Û€#ÃçÂÁ Â…,Q.Yõ©A2*8OŠ‘§æ!A.J Í`Dtæ.ò¿OZërdóé½ÊÑG[µ‡ðíºMþëvugÆÈ:)Wr‘"JAò(Y*ÉŠQ ’gT¥ -¾k”L(ŒáÓ¨”mX‘ñî™mБGËMƒ´ŠW‚1i 걦ò$œEjæ‚ø5Ž“ 3ƒÆD«›zË“ƒÁ&4!Q2ÙÁÁÓ n™F03ˆ*¦¾`fà%2× ·N¼H0ژݳ”( ‹J0ÚÖ°ì»cá%ãNÇýìÚ~yù¢¹¹úÇqUX°ÿÖ(Ü „ 3ŠŒÍI½/Ž«W7¯ìëÏ·yÉöÓ±Õ~*Š7Vé÷h¬KdÌS‹¥h‰kãÔâ…Z +æ©Þ(H¦‘¹É‚ÆZ4LÆ ¯Á ŠÔ=-{‰L-[ƒä*hÙÁJ)Ù~U ‘oGµ£Í÷´ì%²–å–½Äû%-˜È¡L&ïë¬ÒïÑY—È{;ëyog]"ïí¬Kä½u‰¼·³.‘÷uÖîþκDx»›‘ÿóÌ» endstream endobj 1683 0 obj << /Length 3145 /Filter /FlateDecode >> stream xÚÕÙ’ÛÆñ}¿UyY%˜ßdYVdDz#­S•²ý€%†$jA€@­6©ü{º§{pp±Š|,ãØ¥ÅLOcú˜>üÙ~Ðÿkv“éÛW^åð$´/ÓЋSí§Qš¦^c¼­÷·«ÀÛÁò««Ï¯¯>ûR /…ey×[/Œü(U^J?ŒRï:÷~X|QÜÜ”¦Y®T¢@À_®ÄBÀŸPŠpñ}kš?·¸¨¯NEn–+DB.´\þtýÕÕË뫟¯„åGôÛëÄ•ò6‡«~ ¼Ö¾ò_§‰wg1Œ}àÆ¥÷îj`9ðSÏëÿ€äSÀÛW3Ô¤ò“‰!Øm¬|•ÄV!¿hw‡9C%ö•œË¤>&Ó'Sû5R ˆs±…òCþz¹Éd¤»§A*Æ6Ö¦¢ˆlæOËU(ÃÅ‹úp0U×Ò¬í²¦+ªÍîŠnO#FÎCƒbWÕÉ}k?¿§’æl1J#Ìý‚z ?S=½«ÏT`ÇeQ™ö2ªH”/õ{«âIÍ<ŠR? ÕåŽ/Š•‹„Ž/ÖXr¨u ×A´âu¬ƒô^ð!èt»½Ì ÂSú‚Úˆ_¸DÚÐëívݬ7ùÚlAë$^Gá:ë›M¯“ìf“›m|¢Næ%•p ñSGu$“‚³þ’¨î¨ž%ÙåIá+!IyÚ±¯!«Š0˜¦Üç˜oOK±èp°‡©– ¦Å&늺"¬ïšºƒ(¢äbS—¨ØÏ¾LÆ4Eä§*ò 9ûaª‰æõ¾ÀÌ-õÂ=3|¨ÅÁ ©ÍR&‹}VíV»}Ö‚y¿”ñ¢.ß#ŠÉiy ¬55ã²¶³Ø÷Lë(äuehtƒïÞÓø›‚‰•4ÿºÆéþÉÊÍ?O·Pth-¯;Z§Þ²1wMÑu¦šì *ðVNjô€…^‚¶êƒ¹…B%ß4§]V¶·MQ‡2M¬¾[T‚!8ä®*Ïšœ4 µËDµP-I8l»ÿó¥Œß_ÿeæ Tä'P‰0b}¤ÓÃíQ$›/-E±ø1Æê Fü}lÏþ‹Éž‡)X3ì› ~çSè*ƒÃhhOñ®§Ö¦e]KƒOøŽªºZ}L+‘¦¾BÒ´Nÿ»*ÔdÚ©âÙÜžà$Qì0¾~ùW/ß¼|û|Gp„` ß¾™³òФßžÛüNŠáÀà¿%Ä%`ôå›ë×/€D¼¸~d%Áu§'Øúdk2Ný$S°‹¥Ñ";Y}ƒmŽàGr\€£ã:⽇jš_n»¦Ær/˜Í°A¶ËŠªíhr0m›í Mºìp´;›Î,@ ðêŒß»¡%šœZëÅøRýÐuœ4g2à»qŠvDh( 44ÿ18ªÂ7à¾a´Ë‚_'«xnê >-&.Ú ÚV²òÖ¬¥^Ó³,vEW˜«„™‰`Cì÷n{æz`йa«Sžÿ¾ØàJ-xß6£)ŠI2j­y_¥§Ú4Ë=À ‹,,¢u„Fèjd $2€x‡Ý©qvøVv'æ²4#… Ý^NTí\|$½h‚kZ0‡x~ÄK3I˜çæXÖ½jÕ¢ÝC!›ÓøÖêê¾¥™eßÜS Ãñ™þµÕ¿Åî+ƒ*Ñ¢˜$Ûx1ްe ®@”µ ™Ä]—eÛ?!€Î¿ÍÐ+0…!iMÓSÇyå"ºÉ[„ Ê{Z³©A·ö †:—¥¥A;–RdS .í½nÛJZÂs±¼ìmCaA=ÙG#¢j‘l|Aøá§²+Ž°ßŒŒÎ “ œÆÍ #Lè… {×Ï Ú3™=^‹Ägãã©qü3¤ÞÒ3³6q1ñôeÀ&¦Óx‚TíýŽóó©hŒ#ÙW5жKÓ®Aâ4´Ê™´WR æES"o*fÅg—IiCâ Ä(»¬Þ}÷z&—h°¸T )Ðîx·ÇJ(†2ÏNÁÓ­xá ¢ä ­éãjG¬ø„ü;•¡ŒÖa4X ; Xcü€Êm2zÿ`¦•JËÔ*crÃÂnë†7YK)¨K`)+§z»ƒ m,ˆ•…ówV¸´ÇšGGrjov‰âõ>¶`x-°JdÊY˜ÐqSxƒ‚! R~O Ë=òÚÆQ\< Âʵ¤ 6¸/@é-ÉÒÈH8Zæ¨fòÁ\øÇ8ÌzSÜØ~«#+P·³T¨¿šÛöav:þ¼ÆÛ™öÂnˆskœ8G"™jÒ“]à³)¶÷ü=Ê¢åMÐ ñl³1ÇÎðŽy±3-y} •œ—WÐÓ@‡Ô[6 «ƒéöõ2õ·3®Aa,û‚ Ù@³…Çz:’Fcnˆ;ˆPv3(¸”¨±nñ¨f¢"Ì5:•ú`@âéT,$X_ᄊ YÛÄŒ¦¿2°Pl`•´¾wêÎ6ŸÄ}˜“U"Õ¬s0²cÂjl¨BhÁ[ÙƒC¢§–WðÐ,øsQëÅ|P^»¯OeNãANì3²ÐЧ5=‡²‚ñÆáçÄ!î<V ¾Ë³(ŒZš¬å!e9»ÿáP3Í‘X—B­±1¹+ZÇã|Lž­¢ÁsèDÑù¶ì÷›o+[ÄI5ÍRr <®·¨¯•,® ‘Vòy!Ô…x ¥ÌB ®_–.IC#)Mãâ€ÆÅÒ2Ñ6ÈK X»9Î[S9WšzŸ†.S‰¾Ë|÷í__¿x}=ãt uåËPLâñ"H$Õ¦<åf–F¤ýp”â¨{¯x¤écñ é ¤W‘ãÉ$rX9­dX?ñ˜Â{ƒ:VZá`ˆ0Ç ¢žMŒ u¼Œ‚”5JÛþSŠ  [ŒÏRœ QQÌňv×£š_»@ƒ#ëÔíe˲rãÜÚb›z=gG°ÍcSPE?¼Ä«U~Nóý2VyÿF×3[쪬O·R$‹wã3^Çñ2‘|g€£ÛŠïhn=?ašD„ Ÿã¾çà Æã(lIÀ1ô÷iͦ1Œç¤gÁš åºÐX<’†øš“hξÏÄþ^düý%îö–nÞ½œKcx’œ›º ûHö*Ô6$ÇTkÛÔ»*iCõ ÷Wd¡ê­±w¦2Ðû94P¡ë˜`@e>âöjR¨¦ |ŽáY ñ&mc Ò[?‹4Q;œv— Ï(+AIBå5=͇lÓaÓƒ~;dÄ–gÂu„Û[±á•³>PÃàŸø™ÐæË- †Jð¬;ÛÚŽÏUkfj¼þ²‘X²q‡„ã±m ÇÃ\·áÝîàpŸ …éN:» ³§8e™-§-öê¢ë)‡£@’=¸(@ &8´¼•¤mGš›ëö¸¡Ôu2§Ö/ G¶ÊÝTê÷•‹;ÊVæ¸àPÍ E‘môl£õû³3üA4?dÎ%`ÂMM†Ùò5=g.­\-ƒƒb*qrÌlDÓµ_ƒmí-·„˜€÷¢nnSí‰I{£Ö´xêkVŠAPʾ±¢ßÈ–Õö ˆ»/vûD¾S3œ8ÒÆf!æ¶š‚ró…ïÑE@B„—V X+ÞÒ›Ü^‘}¼×§ê*køv)³· ö©¦¥á–†¯ÅðèŠyô¢é9—nÇòÁ%Õ£W]j¨±à…’Œ¹¾u ö]—mç@hèòýw&)¡Ô‘ÉSg‚ãòã_øé)?«JÌjqz¹‰R„~ õ¨c´÷âöJ?æüEì_QEûú‚Ÿ”%T˜: G²7æXfüýZ&PDUl.#{¢ü$¹àÏFDû©ϯ òÖ;V=«ý!Û¬Ú}&ÃèÙ삘òð2:‹ÁS•ø¿úÝ„€gœ\ðg/" üDÇtÎÅ6Û¸_ºtû€FÿºÌaihzÕ%¼;–>hƾLù#Ev!eêGÉ"”òcW4üû7ä[!#ÐÖ“ÿ®Éèô·ÿ®cÒþÅÊdê ‰0þH‘sþeðÓŠ¨ònéW OP礩“>žTíôS²Ë?D™“€±éørn’Ã~þÇENŒ?dH.ø³GÈ7‘üCÔ8aê }AÑ#È8BMD·}kN‹É'e÷Æÿ}FèÆ endstream endobj 1706 0 obj << /Length 2812 /Filter /FlateDecode >> stream xÚÍZKsÛF¾ëWà°Uk£æ ¨Êo²v’݃7V*o1±&  %kÿ}»§OA1mKª”ËÂÌ`8Ý=ýúºÉgI÷¿¾M~m£þ®˜Ètd3Å2“eYT»è*úÇI]Ãë×'¹89{%y”Áka¢‹«Hf2Y-˜6YtQDïâïËË˵«§2•1`‹Ssø£×ñ/«¿ið¥Š_ÊÂ-NEb¸ˆ•\üvñÓÉ_/N>œpÏïŽW)³RFËÍɻߒ¨€w?E SYÝú›Æ ø‡ñ:z{Ò³œ°,Šº? ùxáçן±ó>_Mò˜¤1Éw3—ÁAñZÓe(3 Žë$þ›»£Ìwí¶®Î÷eµÅ»:{•á†e„!õ1…c¾wë|!Òøÿ8LšÅâTç‡ýÊmqu_.éDX·q¾ ºŒ;Üma÷‚ÇK<(÷Ãösµûp(kGÛOiY»=Íß{êw´s_Ñâ%$iÏ.Á\Ëqaãf•×°ÂF§­|Á½|á=¸õT€ÍS)U ã@3õSÓ‹|»ð·0Ú´\—á6˜'6GëÕ4Pá)ÊÄ._âöÎl¼Ë˰^]ÑJ Í;ª0qóýªvŽ>þÏD'­06®hñª ‹‘6ÃiùNîÕCÊ„sx{"Wkׄ½u ³u®p (é» ¯‡öß»ò`Q9ZbŽ%+»¶°,5lÝoùòåéÛ7?Θ«JX’µÛ¾¥SoWew­0]V$T^nZ‘âô²ÜÓ¸=:ð£X É[·<Ô垮ʯ¼Áq^ç·'™Æ?n ÷1ÜLÿKW^¯ì_P¼­žÒ¿þíÊÕnÎzeÊ”ŸR ªJ ªÊ@¢‹0žXñòá€äÃQðL‹ž YÃW–´‘¤qœB‘bô˜†×‡¤Q³Òt)Ãsêòš"i d%ŒMÇwLù&˜Ù0íá°)0y Öµ¤vÀ-läÞz¡9ø-üY‚óÏ …”êãZGÒB ë¡mæîl/í~v“×gëòò¬ ±Ï‹È=íîëvåc¨Û-ù2L€>Â=ü½¤hú‘¦ a¦n ]'&D›MÁGíHp@§ßš 4aÔÓ„IK€ï¯¥Ç£ž~ÛÜÏâ!Æ^ø»ƒh³¦Ï5K·Íë²¢}Œ…ç®v;Xméä´wqyP÷‘SÂôüyssîœjÃPCÁU0“€ï ÁàƒÄ+gã=ïNu’Ä/§™Au¹eVãà·,ãòƒ"à\!Ò©ûÌX8“ yL<´f¯jè9È»0% yæ~†q—íÏá6$0EØ3¸°°PœB…>¶9×,ë2$~_†€ÙÒ´ÂCI»Y}‚âm‚ ÀoþJy÷ü1Ê€×c,¢Z߀ÁÒË ƒ®Šô¯‡Êö a8ä*ïX$½[w[ÿé ­Q™E‡ÏdâžV•åf糸”Ãâ­—2öœm‰”ñ´S]QÌÍp¶ ¼s¡›3Ñã¾³ÂÝœjØ[mæ¢_ʬèbØù—4YRð c"L™}sÈr&¼KGD±$M·ÅHw-–'ém·ü(ìÊð©ØOÐk ‚×(nH]¢†'˜Š–W/FÚö‹ÕÕ‹6L]f¹QZ,éÅeó‚ÓhY¶ûR|ò>Õ“«_)Æü,õO:l£+¹‚MX® yÆ’¶«,ŽI"ÕØÎòI&fÇfs„hɉ"=Rè Q¤7j~à ¤Ù›²:4wüŽ>¸Ï¤®AJ¡>OKL¬`*Œ:˜ Rß–ë5­v±'¾ô  :çUÓ¸":¦ú•›¾Â3Ñ”)Ÿè• “Gi òŒ·Í•«›‡‚±ÊŽÐ‘€ÊóSñ8€i³ÂïYº}CÁ„šýåa`Ó¶HÄwMåë£f‚ ŸØ8@Û^g-`Žwìš…,o@J9ikmòrýç7¯ß €e³Ü…ÑÊ“ßïšÐ˜ÂfjÕ¿.ß–-âÛ–`G¦ˆ]Ûµ-güdh'BR­Ú·ÍM‚¡ðz¿§þëû¶œØjDÛPŸ³š¾õyHEÑWÉAV°£0bbp|”[a?+™?Žñ¤Yç÷óÕCΨšÒé±Õ”5Y/&ÀÛºÚŒ=VÏÞýÛ® w?Å꿯-ŽùX×&¸¶ô±® +º”i«C!£¦ß3À¸9M¼n‰}®®uÛ”rPíŠÓW÷0 f«+&Ýb”Š®ƒN§½Vdÿ3„døÃˆÎgÇßÏ€3*)¾¨åÂZÞ5üïªÃD¨§‹;ÂAJªûuãmal/*5FL…ƒ’yíŠvÖ,é;=—»4©¾uM(©iÊËu(J£í¯G\°VлÿoÉ”úéÏÑ⡆٠Ðàãö –ý‰Iœ endstream endobj 1731 0 obj << /Length 3057 /Filter /FlateDecode >> stream xÚÍÙrÛÈñ]_·€Uâsá𛳲o¥vkmmòà݈)”I‚@K®ü|ú˜ÁA‚”¼.§"—ÅAwc¦§ïnês EÔý¯×£Ç÷oƒ]Á¿X¡2$™YœeYPÁ*øí* Ö€~{õ÷Û«o´ 2@«8¸]6q¦ƒÄ*aã,¸]ÛòînSÔ³¹NuˆÙ\†~Y%mø{SÔki·‡rYÌæ*Š¥ ™ýyûóÕëÛ«ÏW’ø‘Ýö&‰ÖÁb{õñÏ(Xîç &Kƒ¢Ü°À?¬7Á‡«#–UH)2kÕg¥Ej™e#d JeÃ׋bß–Õ®y9›Û( ÷À« é>‰ ›²ØÍкçj÷G$ÍúPçø^áÅ›4‘È¢Lâq2™Ž¸¥°™;ïÕfƒ¯«“× ¸Ïë|[´EÝðó‘ŠÇŠXcØ›™JÃßn~œdH^¼hïݢɷô?­ªÚv‡Ó]`Ÿ¶¹F…¨°kЖå QD x(=ª.Eù7(ðÞÁÜ_Uja³æFkä†V&\VÛ¼Ü1tç :ÌwKFŸ¼¡Ã›_>0Œ‡$Ù¦ÜÁ½¶$ «¦)ïH\¢ãñ}¾Y±(W_æ>w{³÷¤ ª¦-‡M^3¢×÷ÎN• ÀŠÃÌð–.<4÷Õa³dë¼#~ ~ØÝ-ÃFáë|‚&;âm»qŸKFî ɨ*`]¶Žôæ÷w7×þlxÅáßÛª%»a‰dD–…P› ?Í‘p«ŠDºÈ7ŒÎ—˺hÇûí}ÙL)y[,pËû|W6d²Š/Ÿ°Óا0 ag3ÈJRÁV´Å~f9h)Y*-®aDtêÀ‡³rF$­ßdb¢8¼;´Ž£vÌÙ0lÀc=“lV~šVdöÒ™=äfê>2Ñ"IŒ?€¥àæˆ]È‘*éîÖ¯¢ðÃaï ¾vì®|1Z‰,ÑcÉ;¨9¸Ž¬ ¢ï¾.Pn{bÔ¼Ï]`v¾\88(¾pñ݇þHÇïqûŸäùØý¡ðÙ€D·ðÊºŠ táÿ V4ÃÇ÷o¯‚ô’ZHÅô®"pvhÚSJÒ_zêZ.¼6‚?.(º€¬2¡¤îJŠÌ•ÿše&,vËÊÕg´Â8ƒ-8HdÏ,"ú:+Ê öí}\&Gg9w¬Œ8¼%Ãc8<–ÞrQ ìÇè8|Õ0g @»|M'®×EÃ¥ƒ4>T-ïÀD¥ã¥­þl‚ýŸÍgç“lm“á0„¤}b$l‘sÜ8¦åg,£:J6ë¢Þ×eSÌË%ÖQx“ŒîÊ¥T6HbI:ÈN€Y’'ìȦáѱK»¶øû®÷$@T+þ„5ï$<ùþY´TG F°÷æÀòN¼€aõ0s×)”NÞI#—Íã9dhÎ@Ÿ"{%¡ŒTÂ+òL î%’a”1™t6q{_x2 %ÄæàX¡;Fé€Ñá).§Mܹ—«„ ðAú¤“Òð–”ˈUιÍΡ‡öÏÊWF}ÁŠ܈AR¶xt€·ùnÇõ¡Lðš–®Ù¸wjwöبɤv[ÞbñÈϘÈÕ:8è«¡Ÿ‰cSQ I«‰ C‡&­øÆ˜Côaë¥ ˜Yt¿(d4§z/“b£cï…pßgiÅõ‡ƒfëé<åÄ1ZÄÐŽµxúR‹÷ìÓž¦<å'† d’ãk;åüå{s=Ry,E ™« źôŽc!{|aGlöP]qŽN;ggùåÆpŸ¯[8%±Ù7éÖŸ:”ÛÈø¡:ŠU“£$‹íß÷TnDj\¹DXb}jxÅyAü1ˆuIJQ‚¼æÀ6ª¢®†USPóú¼í¸*Ƈ>>*ß&Âʵۘ›€´l¸‡?É”® ˜L9 šªº2Z`ˆÄO´\YnµÄ Ì—y›3€¯„44n¨X†Ô­#°ÂtB›wyÌ¿‡ÜãjQQ•±t„h§Íç „ ò1±r|RÞèÙšÊNäz˜tŸ5Α¯6-¤Ÿ5°¶vÐ o«Ý5GL,䌒6 ç#MÅ—Q|¯ˆÈ֡ƽ"bH‡M[î™VŽ’Rô¥UÕÏ«]…•ÆT0¼!é"ûå,²µà;vrð=‘_§J¤±þÑÑA§±€âëÿ&òC›* qÿï"¿†Põå_ˆü×Ri3·q’ R9ü|Æc+2õÃó†Ü }ÑÉÚd"n]ïè§…Üyæ›uE1µ½ß2¤ë¹q¨œÃ—»õ5ÃîËn¾¢êHxî"8Î&!ÄÀæ׿öƒš[r$õ»Î¨%ÿäzeß3¯ªÍ¦BÔCórÔ³‚åD#Ÿ‡6zý¹²ÂF.@’IŽ^·´ô1ŧÊx0àåçºø|À¾ŽŸ\ºL8]Æ]Ü£”V.ÈY’Š =96[¥((ô[Ê“Ce•HÀ$WÅÓ¨-ú1ïDìƒÚ45Ý„¦O§q—N“±ÊCµ:) ¯CC…–»?J±pšˆu:ަ4ëA½¹ôcF³ï#Kèf ]SŒS†“bàÄšÌPhÆxEðØD“ó_3ݺj{ò..[‹Sý\)aåw˜ hkTY)«‰K?á"«A¢®÷‡á-ñ ¼%:!_T¦Î:ˆ¶Úm¾NÚ‰ÊÀâ­ Õ©;S!iMµI™©9y×úškÌc_¶1fK7sÃS¨–[Q¥kFõØ3L- ö¬Žï™f"•éew°iX‚üÎx„¦WÛÈ(yüOVÉ Ãõ¦lZÏUo|œj^`ªyÁ©æ9Võ‚¤!Õwš™¶z•œ™¹¨d½ƒYî*‡öÿä1öȽìð†4C‰?~ìƒ2myK§8:s¨8k:Åí>4$«ð‹—s¬WƒößsÓ 1±¿ði½S¹³ÖÉ8ú¿£"6vElrZºÆ®t‡ß¿0-1qѸž‡.Þ¿ˆ©O XqEÛ~/ƒátßÀ°å®ÒáÛÚM©P;ˆtøÈbÇMI§¸ð%þÙ!á¡)–¨=…Ów«d^¼Ê,Ô_‡FkqÂ)»Èiz¸/eñÀ«ö¾tô«"oIZHˆ3A7WʆS©ŒØašÜ½Ø‚Éò·k2ã> ŽÝ¸My•9Fá­þËM2€(üiØÅâMòI“r¾1Ot"²äB8鲑Mžš@C^LõT`ñó|jÑžI”½ëúvhÍd<º$až–;rZ(•Çßq¢+â8½3Cš­_:™ˆc—ÿ pUøë™ÔÝ•M'"júŒÔ“DœÊLv£)‡¤º2ÑA¤žúfHZ‘ZùDÑ”^(š2Oqå¿ù¥<'.«ÄH%LzíŸT ýÙv-Õ£SðuÕëg*QBµ/Oï>¯ÈÒ“wUuÓ¨× >4]&b¢sZ1"~"uËKJ±Q<ÅÔH)¾HM­0Ð:Žçè—Eh€1Á¡'ê§ gŠ‹ä,‡g+ Wkã¼¹¯•ÜW+î¯<&¿¡¾ÈñLs|ø$Ûàð0=êñ.ò„yJ ¥3Ïø›Í“hæüyø¢½&1œ•^´WXs¢_ƒEótÑài'¬±]Ò´ƒ/§܇D5Xü¨èrï… ž³#¢c/â/–Á΢ãêÈŠic2X,6ϬŒÐb/û”‰£³j‘蓦++¶X<º8²VÄvÖšø&¾fb²V¤ Šl*¡‘*Ñô“Q®[Ò‰é\ï1 . –κÉÔ¾ÝüýçëÛ«ÿÀÖé endstream endobj 1745 0 obj << /Length 3103 /Filter /FlateDecode >> stream xÚ¥ÛrÛ6öÝ_¡·¥f-–xí[[§©;l›8Ó‡´”IS¤BRN=ýù=7ð"Ë^o:Tœû þ¼ý`ø×îfÓ÷oõ"€ÿ’0òU/Ò<òó$ÏóEkÛÅoWÁbà·Wßß]}ó£9€U²¸Û.âÄOr½HcåÇI¾¸+Ÿ¼»^W¦]®t¦=¸À_®B/„ÿÅ*Œ½iÿÕ!0òÞžli–+$¡ò¢xùçÝÏWoî®>_…„O8e~ªõbs¸úôg°(öó"ð£<[|¡‡Œ}ÀÆÕâÃÕÊÙ" ü<ÈCD9Õ~¢òEª´ŸÅŒñwU¿oN»ýr…¡×ï‹Gʳ¯ա銞çµyXªÌCq[mLiÊk˜èг²‡¿UÞè˼¦ë,0E.h´iê?‚0ÚZl*kjZ5bÌ\ ¼®A§Ž£MÑ9 ìô øEbR aˆ]#:ì@‚9K9 ì–¹r‚Íà7È•3„BL.Æ­)ÊG?®=z‘þ(‰óÌûý—ïÞG*Àß—¶d{@T²í¦8¸›†¸´±…pϼ±€ÃªÄƒÈéP –pæ#¯Ê½ÊÖ÷pÀ ‰«He‡ʲlM Ť vªLZq?-\ºgÊ;† ’àv[Û6¼:ù8÷îåLؼå š£Lm7¢í¸Ì~7¢Îñ©¼»%$g /“‚4íý%Š‹¶9ñ=1È—’…ïŠòa'‚R_ì ’ehw¸£6_xp`KÃÓ}!GˆÞšš§"ÖVvŸ6¦r¹œø‰¼ÇÝ?D¼"ªÝ±hÓ0÷n]²¦Xã"ˆzƒK"†g΄,nÌ!l·Èh=÷X8_ÓAf_ ÛlƒŒäœ“@q‹•­ÂzL‹6s”Õ’Í’\ÁjþFàøÛS]“/¥ÃfN)Œ’Q~|ývÍ5»jH•'¾ôHæ¦Oü<ùø]ü÷¾rßÌtážøüH¹QÓ¢Íå.¯A÷ƒ3‘*OÀ ŒìBŸ®sˆEd-ÖåwL™NzËðÁ3'Zy·µ|LzG—9eº~š0#\R ¼[øcÙFÌæ,½æÄÙ}#â—ý›9ÀýyÌ!êÉÉ©,ybÄ€ü;,ñ¹8’L¦µNÅÀagÏÑNÀÔ)6ÀÄRÜ€C vö¨€¿ïÑXèú½Ü6úYr†J8XÇî‰5?j‚1ôëÄÀMQó ³’A“7ĕґ:q¾V|ÂN›O`*²Ä:i…uCßÛÚ&3e@Õ‹@õºî$×l›ªbƒÅ#ŸÍÐù‚È»ogØbp–7é$‚¼)òÃ4å/“éÙGó\‹†Î|¿ç$ ™îüËFØ&©ãy˜„ ˜äqDÅÊÍn%×ì÷$âr¬Kýž%f%˜­”òƒ4újLi{ñYjºK…~fn驸‰§Î*Iü¤!{ŠšºXWBùÔLWc@z‘¶<Ii¡Mm™Í©7³:LíÛKô¦ÊO!½—/Kî ¬˜nÈV VAHxáLþÂ3oºè¥Cí[;Øz‹ù½˜À[ƒfYò„$ºlŒ œß…g± ½P˜²£<»ïG‰0Tã¦&¥æiUó´3 $eçT÷Ü¥q†¥$âþCÑÎé¾^õ¿ŠÛV àÂÕ~Ç¢-ur¿©Ìµë­ 7º 6¡ý4ì„lzkw¬1lÑ8:/˜Mû* ÏÍfíÜˤósEX¤¼È¥S?O² ™L ..EC:ÎÝ$ÛU9Ç6¦Ñ8sÅ)1ãBƒÕȼLÄï­DHå}ñü¯u:÷ß”¦d®ŸÌPCNRÓkÎ- ŽÙªîèÖ=ÇP˜Pj¬¡8›¤Æ¸~15F@3¿XISÃW”rKgKC5¦îo¥šlà ¿×õ0à+ì—„úI#{u+äbè¤ÎHübgdH8€¶©ˆ^ìÒ‰‡ÞH(½‘_±Ëævj¥R»~ ·Ï`ƒkŸ¥X­ÀüQàØ¥Á.I;mžtøým ˜?L"YÀIý˜H­(½ë®oOÜÉA e¡ðÛ¬ûÂÊÑS÷{ÒÁ/Ž®¡¨ò¹ŒËCs '7ï>¸#ç½¼K§>›‘SL*„#qº þqœdÞmÏ`+B8ë–#Hº Žñ®=–ö=ÊŽMv<лB Þ¹¶¬¨p@ÐøOUºC'+8ay͈˜ åb9¼vh廪}Q2`jÒZ9ó|äY±Ûa·`¬PØçlìJ‘·*:×y¿u~¯ª©r8Ü]0™Lù¡R³0• K, ù¢‘†L -âUœå̧,”ÆÓ“÷¹¾•’v%ƒo~úáׇÄQäTPŽÄ~˜€Î|¤sÆ´fc&%b ‘ Gz±“e©ƒ¡^ °Èu.ö{qÛ¥²²û©}ÃâqðmT;ÞÝp§h"v/2î^Ð2:YÔ;#ØÚ¡}±é7oÇhb2hœž†Þ{»Û% 0iIÒä U´8š¿§„¤lR¶ÒW®[HÇ3?É-⛸BvÑì=ñ+¼~LýVÜ¡ëÙàõØ/D‹ NîYŸ¦›.5Š{g®ö»ñ7œ´_“|´ ålnª’ŸÈ/"ªhŽY/‘aÇvˆ0˜°Í#€Ó†H¹XA,…)u_FL"ÆDM0 ]Ò«Ó"\GÚµ@ÎιïpºØD‚º,NË%Ãúg/ÏU»ªYS‹g" h¶ãÎgrÞH篮 '8Œ} øÍð’ƒ)Þ¹!"¼]þäu ¶ýðÉŽÕ+eg=bü?“ •D€–ž+åVê, ò^LlÆG%‰Í ¾jÓ~äávóñö†Gýù#f7 mëuï:wà ݃W+µ–ÄxÝøDÖS“ú80¾ÚmÏÞ|'ÍõºXž}¬íç“Üv[JÉLÏ¡¦Å¤êåöÊ ÐN *ä_StÌÇRŠº á‰=ÿUUp^2l„ý›wâÃ8e~4û›aÒ5‡¦×ÜÊüdÉCêÖè—g®'ÞÌc\åùæÔŽ2p˜@{à2íÜw}·Ù4m9ô‘8+ˆøRyi¼O¯ª ¼óÄÝûóÚÉúÉ߈ÖL_zg Ÿ•î÷ÍÝÕåóæ\ endstream endobj 1751 0 obj << /Length 3317 /Filter /FlateDecode >> stream xÚÕÛŽÛÆõ}¿BhB!+š3¼ ¹oní¸ 7u7Š4”8’XS¤LR^/Œþ{Ïm(rÅuâ&Y 0֜˙3ç>sÎèýBùÁð×î&Ý·¯õ"€‰Š|Å “E~–dY¶híb»øûU°ØÁô««?Ý^=û&T‹ ¦u²¸Ý.âÄO²pabíÇI¶¸-?z/Êõº²ír¦¡øË•òük{ßw¶ýªÃÉÈ{u* »\é QÚ‹’åO·ß^½¼½z¥ˆ5 Rß„ábs¸úñ§`QÀÜ·‹À²tqG‡´} ÚÕâWg’§¤ÎÀÏ‚L!í&ôƒØ,Œý4fÒÿ(CT¸eϾIÇK¸ 3Ý/uêÝÔ6"øhüd€'lÓ½mmÙÉ4 Km¼5,3žmTñ¢O ÓïËŽ^|ÿúñHê­óÎ<ÙÔ\p×––qìå½ ¼¼ óÞàæ)m4· ˜w]¹«1,hPÀãJ…~‰R«¼Ý‘NÃÐÛ4‡c^—¶ÍFQì½Ì7ˆtϳ–,Ü*¯hhQäuûæT rÈK¦ ¿4Röƒ58~'£Ý1ßXßòЩ.ߟ¬,*DÆ%è-²-Ð3ÕÝTß+ÑÞJƒ±ªä7Ð82}¨ñª¬ßË+ä½Ê ”d!:FèO Í:ÆÖ1q#ãP#r@Ä«£ñœ"ò¢hm×9àê~ GB fÃгbÞÏ7›¦-ÊzzK2Ô4}»#Û↻?²< 2ðŸÁ€1î¾}uÈâ‰Ø`à§ëå*P—Œ‡Œ¾­ƒ9غ öG «„9þàk/ÖáÞòSÜ ïÊ+× õÊ‚5¦±òn÷¹ þƒ&zcù$~&S#?¶d~À°±NÀR›®ÇV†› íÕ–6%ã×Ê{Ý3ä>—%Mmem4'޿Ѱ_´ÄáÝšÝå~bô¥ )Ky`jÅ¢)¢àðû®f7᳉H$¦l›ÖÎcÍ7ý)¯ÀNF.¶±ÆZˆ9µc¨µçA¾±Á‚G:Óž\îsw˜Åµa.¢Fœ–(-ïåFLx¥'E“åƒGÐV#ÓǾxHSËÂ[D'dMĦd&ôL¼WÈñÔËýöõˆrÿíÄ ÀÆšªâØ?Ø/„+᧬ÝõÂÎ9™Ö±¯•ž:™rÝÎ;Yê™8ÙÜ ²Åbøîã¸ÌÝáã(¡‹ÜáqÜÝ×C?L åãKûÏîà g¶@\¤ áçR…_¼ÛÏC^ÒjH–’‡l‹]üÏ|ÿ¾4«Ì”ù­iælb‘nCHÁ¢T±©ýnM:†û–£Üåƒ[{óR†¶ü%çÀ†x6×¶jî~¡µþrNfí:ˆý4yJa~à OÈU P·ªú'á<Ê´ªôé8²¢E(f2Ç:žØQ:Œ¸|Œ“fùzSا‘ŠI}“dO(•Tûi}F*poyÎ8^ôÿU¤ƒKŽŸõ„ÊŠcß„R{(·TÞ@=Ù~pëÓÓè*L}õÛ+k†q£}'‹(‚oêÏŸ†Iù±yJ&5ìf²9ò”ܰîVm?ØöiWÊtø„f­b?HSfü?¿â–†®¿ó-·IÃø‹n‰såôA=9D3Ì”'Ëâ‡=I¡Â´Šoì*ž)w}%.ž¤úÀ_Td\²9hMò ª©¨Ìeï !)+`ÍO”F¥õvÓ󴔹ަCZƒsCŽÿh±ì¢¾m²s}û\b^¹šµI‰öknž+:TIâÁ"ïsFD(N˜áøpcgT¤+n–+Iæ””Õ ¼k(²A¨WëRÐKžiw¶½žKÜø6+J°t$ùÆíùáH9Œæ¼“G:“â ÎQIVäÜ@ò…8x·nÆ@I!¢lƒ6oï¹[ÙzG™¹æjtœÜ˜ô&Ëo˜ªÍMa/™˜áöÌV˜§,fÉç|Q›š,Ž5š? Ñä—r?‹|.WJÁ/ìú´Ûù?£—ƒ¾\—È>T’nbokóþ¦8“†:ËÓgñ´z£ 0³Äw,Ú¶‘T¼ÍyhcJn ¶”Ú £\¼5CUž/hmQv›ÿ-3ᤊálXp|XÆà[mÙœd`\«äš‚¡oe!¿Y=îa=1(·¤À¶À±åö‹¿üù» ·Á-ÄÅ7MÅCÄU¨3œƒ p Õ·9Ź+¹²pqTj8°5XJKuÑÐ{Þ92ìt_sÞ·ì;[ ¹E#ñ‰»X›±¹i}WCÊ1réT{ù0‡uFšBWÂIJ¼¬0òé,$-ðx¿/±š²x,SScË:.Ñckª™ê~²ƒF.[-[Ýð—Rn±F°}}}d3ä ƒC\Õ¦XýŽyª²ÅXîP5`<ûü(8Hû0"å5€b6±å,ˆ‹íÎT`â §†àB³ur8"Ö À¢thèK(4þ‘µÊþµìÚ Ip¤ì›V°Øƒ–l1Ǥâ}α»i»s--âZZ€J6 +kúžD™Löìé®Ìw†fØ´2s®H’ ±‘eÌ¿œžÈA׳eAË*ZÛìKÁ|ùž²ÉéyKCx›ñÿ¡æ*êqhyKoƒ¸nÃZlž§ªçvYó7gDÀÝ‚ÚöTñð`~N60ÆJ¦Y4inâ…”oÄOjFuÏŽq³#ÐþrùÌì.WC™_1”GžoÐé¾’ ±Áò\sæ˜dXoMKG »Óç$ Áà:Ë|»¦[ôNu%ï dïy4o‡’¶TKÍ¥.¨dM’0" KâÑøÌgz¨'Ò¡×£[G¨v„rG\œžÀÂðèAA£èH—Ø–×*íÔ†MÖY]4B¬3l¤LœÐBy@Ã/€ÔÚÛR0ÍÙu‹Q¹-ÌEcæ$Î^¼8kÜØ’)—×’\Våü)ÜAËûÒ=Tº÷Éõ#Tã‹^?R?UÑùúáãNTàcÉ Å„{UüÓ$´©¿ðÞi‚§}ÇœÐô?LãŒ쭮ǰÞ¤ð6¬Ær–c–Žže s¬€ö‚Û¥œëüáô1 ÚzxL{ûò¯Ï—Æxÿ\}³ÄúéÛ¥ ´÷à Óià3¼LXt¯6QÄ)îÔÎ7ÑH`Û‚î IšÐ;*Žq>Q!¿ü@Ö„97"Ïnƒ§¡qBÁY|•º™cV›Ô“Ø]Ö¬æe gØjöù0Îü8ž]šŽ›äô‹•¹] ôЭi {•߯œŒ.w1=;NvqO’X(KÕ…“!Šé(a¶¼žñý‚Bi¤ø4Μe¨‡pÊ<†_’¸U„˜5 ›¶¯Ã°Mûq-:ü°ánÄ5w[;82îP0|ú¼æó6ªìdü1LÏ•‡gd3ü m_¹Ä ”1­’æ™D„‰KÊêòk¸þY9ÌàÙѸϧ@¢)Q¶løfÀò0!¨We½rV m½Épü>ú›‚!ðÉý{s’èE?ô‚s»ò)J>ÿìEÿt¾ž}qˆ~<ƒ u×·§MÏ¿ÖhÊ]Å`ËÏð3f­²ò·ìËœ'=¿½K¤ß>‚>ìúK½Æ¨ôÂ7£€NüæÛž‚‹Ib>˜‰‘oA:éG\‹OÝ(HÎ?*Çbðk:BŒÄÄ£‹Áª9”ñHÖpú@”ü"¹F™¹`vÈ«¾Ù‘n{PòkpO„TõÔ31p¹¡0@ÔåÀ Ü(Ñë¤÷+~Ò5qß—·WÿDÆm¶ endstream endobj 1769 0 obj << /Length 3010 /Filter /FlateDecode >> stream xÚÍZëoÜ6ÿî¿B¸ûP-àeÄ—(ú[Ú¸iŠ Mm÷EÚòŠk Ý•¶’6qPÜÿ~3Rû°òèÝ^‚dù93þf†Ãßβñ_wwP½zž4Is®˜°:1V1›[k“Î%Ëädz,¹ƒîçg_ßœ=ùVòÄB·È“›e¢s–[™-˜ÎmrS%oÒgõííÊu³¹,d °Ùœ§þÓ‚ëô§Þu_õØ©ÒçÛºr³¹Èr.Ref¿Þ|vysöû÷ôðqzU0#e²XŸ½ù5K*èû>ɘ²EòÎ\'Pf@?”WÉõÙÉEÂ3f3Ë÷I’š(®¢§¿o·«O+ª6mh¿Mꨲí],i«Ó 5ݹÆuåêj6O‡ûº'æÈyÛÀŒ¿d\Ým»r¨Ûðͦìʵ¢œê ’¶Y½×Y5¾÷ݽ ŸU®\ÕÍ]h®‡û@áöîî=ʘžsÉ´ ›Ñ¹U9Eú¾G꤂©j g1†ð[ T–ÍWï˦Z9X®VÔØnÕXî*×õTÞtíS¤®šŠR*ý¦mzØ×ŽFiÈCŽ¡£¤ŸÊ!íÄ ZºrØvŽy^xά̺®×õª sL©Hˆ~N”wã*ª.Û‘–ÀèàÛ™§<Ð|í`ÃH~˜Ëë|Rm;$È‚# ÷JrÎŒ(@òžÀ«Ë—OgƤ?ϯ.qÿ_¿¤”Ð(ø„ÇOHPÊÄ7liÎpì9Jzí€xúU¹~ÑÕaS°¡]Ò/²7A÷“¨¸XÝ€¼–åb¦yêæu5é@7ì1…eBåñÓQÜ=-X®GqR}Ñ6¤ðåŽÈ_2õnáðœg€<ôÏ íW¯žŸ%oüGš††³ À,œæM¥ÂUÔpà°âHiF‚Æ;û§)B50S± v¾/:8ˆ¢``’' U2 Áu–¾j›¹[o†™i8î/ž>†?^–)™ä `TÇø'÷ðO2“ïÐ/õ¾š™¹2VÈ —WO H¼ÿ@®`ÜÀKÆòè³é‚!³vXjp#êò‡Q[Tltë"±¯¡¾Î-\ý–?4—¡¹¬*í+Wt¡µwMÕO)¸(€%SÐÒ)IÊÜ0¥ó$6à¼\’Ré#IžwËeÂÏ%”%ùXz0€ï€„Œ¦Cdd:€åÀÞ³(Ÿ Ã5 5h·o@½Ý%$*•9TõªÝCsü’p-`KÈ[³Xm«öš=:®±WÛö€=Øçf'õ§Ïž]Ml·å"ë··Þf·;jʰä}P—`3Ž¡[‚ …;@¦œå Âx’P¹IôT Åª/V+³…×J¬ ÷eß·kJ#´…ª–¦Uï#(ÐR/¸-µ!£Øva®C3é›P®ò)º%Ûßδ»[Wæ É£DD·ã-ÁøGõ^KÍ è¨¶¤Ö_¢÷ZZ–ÖÏÅÁ(|Xïç € \¡ÃÍ -ïñ›Þ Ç²”¦HßͼÀ~Üþ®Ý"¸cO8P1‚W¹FL(lZ‘9_¬jØKä@£B 6š*uÓÝ–6ÚÏÚÒJ»#€HQ2)k #>­î–©LîŒmäcÒ4Ï•A ÑGZ;±‘96cÀyÍa¼ù¢}4’eBø©2U|dÁ’Z?‚/ô—¾8?ô¹ÖuS¯Ëà2º‡r½‰Žd4¾çÔ襼ϒ\ÑÚÑ1ëãq/‡‹`•m’Œÿy»¼ß–y*bÐZ³¼ÈQNØ£Ma|T³"|z…8rb°ðæ£æäQ`òÙ«}zäczXkiŽÙÊõ?óMJ$&¢(­@Á’²ƒWéмl ÷•þøÌ]ü|ª&÷\-]'`‰ ÖR°\ËÀxyR^¹oО€W@q°A° ˜™,8:Á7; §‡ ÿ„ŒfÚGJ'gT†YÅO§¾ÊBd‘wþ?§áb^iùé°I™ÂûüŠÇiÊ!üÊÔ_mLp‘É?eLâªGtÂçM[»‹Ê‹¾îZ CßÖU¸WRQõŸl:‘ò@A"ºæ0pè§\…pSã£Du|>8jbÝ;jPØÝ­ÁÏ£†^]K¿ú…Rð›}àY#uþ6Ë÷²½Õ6,¹ˆíuX¹&£IˆÅ˜ÎÇë’ë^¾øæÅÍÏöf îÖ°pyçzïÉôÆß²õš(‘3°M‡7e¸…Ø9ª¡*  Ä[ÁpU†×Z«UëÖ±©OÎpùð%Γ´``ì_®ï ØLòÿÆy’‡ýѧ(Y€“ÊIþI„?&—yI súéÜï[×Té7nQ/Á‹öµ½Ãº¬Nåx›bm~BI0WQT£›)µbJ¿6†IÎaAðk¹ø;ÜL‰…ö.µmÄ´“<ô¾ÃþGd¿¨n‹‹Ê•ÕÅ­sË‹ ê9Fbk{ÂÝ—àÿryJ/M7Æž’GnX‘—aSTóŒ‰Sà=8ÛÆ€ÍÀæÁép}¨Ø%ü¹¸x’«“ð/Šœ™ŒŸn¯…͘ÉóSê³0’q-Ngªð*¸ùò¨Cä„¥ÿj/ —±¹ú⨣8ºbÌÑ…Æß ð_{W¤•[–ÛÕpNµƒ¸êïjJ;sLÁRÓpßÆâ¾‡Õº™LÁæÚB~–¯¤<òàifŸ†)m^HLW6ýº†eEr¾³Ü%ƒüéòúfòŽ\ið%Ž®~(Î) ”é((-ÚM ²½ÔBÛ—«žÚ–]»ž$ ÂoaÆûë§Ïf"Oÿuy53yzóâúr‚…É'F™»1J‰ ûRI?ý˜SG)JWþÊ_ùãè¶C'Îó´‡õ! A ÔŽÂ3|”ÚµBRL„,|<£¦ÑƒØå³Ê¦zJQ!ö­üÐ6&Ç&5 í±PŸÞ\Ð{>fÆÂ½÷fåÊÞÅ(.¦!ÄÀ‘4»ÜA_÷Ã|ÝVnjsàøÊñr¾ª;ÌdÓ†„t´0 çÌj@?¯oYnÆèJŽ7 ïÀ]>lpka»ê5ì”ot|”ñÉÀ?œô›ÓÌÒ˜^‡ Ç<€?è%0FÝî!fÆü’¾sE]qIFIþ¯>)gíbÎ8£Ä¡æ^é žâPe³íâùpÔòì»o^¿ÍÃ4íj‹Ô“–M=6©Æ+ ­CB;Mñ¡}Píµ¢R‡Pèwe7f;4é6Ò³¢q”Þ„öƽ ‹€oÛ³Ïxðä[^$à8£GÕÔ€&B€y°:øxâxßâáËùÞøWmG b©‹¼øLçfÑ®aŸªÈí«nhȰDƒ?ÏñEF®™GÇ߬øOÃ1Faì¶\s™>­(ÚÐ' q{´ù[¡y(›…›¨¹@j*.ÊmL¼ã´«¾¥öÝÍ‹ß1 Øgÿ¿yH’˜TY—Ħ¯`&xâÖ^nóì}LEÌ\b]îÝóì®Å0ÇÖ€ä?7âè…¾NjýøÅv 4¢àÑ#-EM§?{,ÞÒ×ãCñ"j/Oîsv8gÙ5øòíóDtaGy kÀjú—Mݯ{jóÆqMÛÌû¸);/„La¢ô=uŽ£ªº/áVôq¼ ó=äJxó"ÆŒ2ö¸?¡/`Êu˜ýüœoäÌý€aDÿ Þ£Vñô}ØË Ú5Ö¶ý0±a›U¹ˆ;P7» ˜Ï8íòþÐ@|ŽÕv“‚‡¸»¾D¬ü±ùF#‚öpå"úܘrM-&£íÇ\FC”’³—†æ6ÑXÆ¿ÍýÓ‹¹h³‡WÀNÀPå.†ß£T‘Ùã¢D8­¡²)»¡^lW¥d!Ágº­£’º(rGUØ7›†A¯ïQy´IŸ1šg²qü ‚ù/! endstream endobj 1678 0 obj << /Type /ObjStm /N 100 /First 970 /Length 1740 /Filter /FlateDecode >> stream xÚ½YËn\7 ÝÏWhÙn4¢øò€›-4Y´ ²HœIa4ðޤßCú}Êö´€ºœsEŠ"H YÓTY³$êÿ[þ,–ˆ]ÐkªŸŒÄÂ.)I:ù@’ÕÀh²æouKt…AKÍBÒS/©«K0}šjéiH(îQô”2ID5dx$óÉl«²†‘®ÃÞ²‘¯¥ù#ûjZ¹Â!ƒÁR`dZÙe>™ü‘¡£ÌÜ[|Š™uáµa.ƒòZÒˆ0Òê#8ªŒ1\&î7ÿí!‚+Ì0j *¨%ˆBÖ1²ÀT…\†5WQ—U¨Ð2̧2¨Ð2IÕ8dЫj²V :àÍÚ}/[…¶aî˜ÁävÃ&u{Jâê>jÌž£2MÌ2¼À¡¡z0„NÃݵ'ná(˜Ã=Å=É™£x$!u6]ªïWJ"â«ÀÑî: \b¡X˜4k«ŠyoÕ…A¸q(#\‚‚oÜ$øEI†zÒ“acTâShV±IR¥)Fê» '¨y¸4L¯ËQÌb=:’¶ˆ„´¶î2£¤½† :z t ßiøI‡ù–„i] ³¢ê Áævò‡‹Û„}1· &šzä7LiTð°µXv£„ìóe·ŠQDb¹UW­ÖÏÓdnCBÿ’Ö¿þö;#—¬eø!ùôéíêñãoƒ•óÀÿ9°”Œ-ÜlOÓ£Gi}Àä|pöÖ¶¯Ã)gpçc¼´~y²=|µ9MoÒúåóƒ´~½ùzš.ç{ý÷_|ðîÍjý soŽO?{³¿¿Zÿ²ù¼ýrr¸ù|–Ô!ûyóáèÝÓí×ôÆÜØF} EïNð6Ö à“ãã-f{sFpnOœ®éäjýêËûÓxþéèøÏÕúéöäÃæ$´”·ëë×Ïð+Þºa‡X²#ƒ6$–‘$‰²‰‡ŠB®À= g½J붯· ¾þîðèt“O>2òó{÷Ð=-¡x¸°D5;c"_²G|׬F$ ¶pÙŽÏ_ÞûÞ>Úg¬qtÕž‹^¯„…FX´ÖsãÜŒ¡ðY jr·ÎkËžcs`,‘QsàRr§I0¸\mrÖ8;1Ι²4™×j¹¤'Á=ëbb/Is‘Y3 l“›‚1™7ìà˜Ü2ì Ln ª€ì§Ð)St̹Û䦌’™êd„b³­>„kñ'·í!ÄÛpd]'^/9¦ˆeÉuâõªëA|»Ër¨ø²Â8Æ ªY)zk8_á¼v+ËS<|ß¼<œæ·]ð¿5Äð˜WNb ÁShŒª9{=4îœkáI°l: +MzNÀßd“6³ñ 8áàÕðÜÌÌÙhÒ pJîÝ&ÁVsí}ŒZ‹d É\uÎf/øçf&Ô1291áÈ‘ñ@ÊòVä&ὤñÃØŒé&›Õq6«mŸlF8´Eɋ콩ï+ò‡Œ°LTmš‘õ«q¹«í€ÿ¥j[kk(jl,ÝëÓ1 T±4f”¼´˜‹`Ëãº7n‰]À¼ÿæq{-Â÷º¢7CWø¡ÛÏ: oàÏ—’óæÈ»÷ó] ê>íz.pY+-Z<´&÷/‚³ñDÀ[îyì¯k(ý°¿f–ÕoAÈ¢ã5$K­úÿÛãe Æiê_ŸL™±@œÙI¶Î^×\e•úñjÉx+Ý›{lÜäk÷ç“sî1½Ø^kÃ>2ø§ì_âytvÁ†ûòÉuy¦ïï8'tí¢(Ms´ÚH¨BQ€uþ¶mV0ª¸·žEœÔà ñZq·lÆ‹Ûí)Ômn^ãû÷RóT¸¾8Å)Ûb'¶V/ZeÌ‚½nšY,×r%íþ¬5${ endstream endobj 1795 0 obj << /Length 3055 /Filter /FlateDecode >> stream xÚÕ]sÛÆñ]¿‚mÎHßЛc'®“6ã:Êä!ÉÑ8ŠW Íh:ýïݯA‰rš4æ4ã±p·w¸ýÞ[ìòýL…Ñø¿¿;š¾{=kgüËUÆU6+ª4¬òªªf½™­fÿ¸ˆfw°üúâóÛ‹ë/5«`9Îg·«Y–‡y•ÌŠ,³¼šÝÖ³‚Wv±hL?¿JÊ$áüJ þd±Ê‚ïÓ6àb¼ÞÙÚ̯â(Wq–óŸn¿ºøâöâý…"zÔx|Z†E’Ì–›‹~Šf5¬}5‹Â´*g{Ú¹™Á8úaÜ̾½xJ²ŠÂ*ªÔ”æ8 ËŒI¾ÓITY|kúó$< oç‰ Ì\ýªë7ÈŒn—†×6<ã¸Ú¯¿,§xTVI>ö¬D߯M Ãý®mm{‡“(°Ôühnx 1Ä%`¸„gn=Gjh߀”ÆQŠ{{³ï­3¯Z'ƒÕ®ixTûÚé…ä#ï?ðÎndÁ­M/C;Lˆ‹‚%¾±ÖíŦ* n×Ú!û³+ϱJÂ,kXùfÙm®„µí;°vv‰€$èXœ 2gÔÎá¥Ýÿʽì]ñÎec mr/X9½Ñý¢ÛšaãiV<9m«‰«{Ügœ§óñ,øó¬àv?F*_zJšCt,€µ½[£¤RÔL†,&ȺÃ÷ö 0ù`µ3望­lb]>@|¥mä¦êHs¸º$›ÑÀÓ„k \÷ĆÔb¼ÌÖwÉËâÀé±UÀÂF#âÝãØ¸+Ø9¿LÚE3qoöÊ”-ÃØ€ÔʪAÔ—£`¸£ñÒí>#k€]M7˜£¡ÑgHüŸ f£ÃîÝà‘¯­Ð¶2Ú±xmt«®iX)ùq ‚ Äôî†.?¸º…“ÝÂÿ5¶_Þù„ž EÙc®E]¿™mNâ CÅ!$l ™_eq|oø¹×­ã)èhýìøI†Ïû'ûøÎÅQ×ò³éîî$öü®´ÊøY‹•ù\˜›Ž?Û>½ö¢$„oÜ3J"*ÂX|wÂöqL¼«³0ž–U˜gùÊlÓ"UTœOYi…ª»µ+íÍÓ¸uÄ£GYy Ù~yÆ‹"L”„€8N˜ñe£‡á¬ì¦UEÕØ­à戫Yš%aT¤â•]'×fEê¦^”77×yzΓ ®ö3ê9©Bà”ÿ÷yXŒÜÖgÌjÓ8 «âWòx’réqœ|êo9DSÄɯú–óX§Â8*x ø3:|'%¥:)°Ô+_Ú<ѽ”O¹A;;à‡°©°·nÍ#,'÷|#-zÏ¿ü͆_ÜUlõ%€Ô\W€»Iݳö‡ÀŠl× ÚöÝÊ ƒíZ*—‚3zŒgeŒ v0#¡§6Ó㥜p,Âë­À„!*Bh?U:<´F°Þµsk_VÓRAÚ36)TÝxyÜ€cãT—NÚ±´/^Ô5|… cï"wÓTü5`¢ÃQmkÚšø¦sh¶;·\Ñ*Æ:žx Ÿ©ABÅg¬Ûë]¦(b±3‹¤X;y‹}µ–½]ð5ÃxÊu;™¼û'/yBÒB¸?Ó &ÜÏ|¤Q÷zå4Þ×µŸIhà"]‰ÆKìÚFćáN樕Û`…d~°rßv¸¶ç¥=vq4ycçê,9üHè¨ÈÈõÜ$ÙE¯Ú»Ž}€‡Òò Ëdy°Ò›;;p,‹2q*XÞîÖr$×kYZ©±MÂAþA8ûµå`)«^[è\ä⠣îQ·`×Rµ; þ¦>¢©£3Šõs;æPQMXkR æj~2Fm)ôâ)æYhÛèゲûmᵊá.]ï›Ý"\v›pÛ\×ëåöC~]wËë_]9B¦¶$FT¿L•qƒ ¯‹„x¸éÁ´¦@:¼›‘€Ÿ(hÐ1cŒÄ›Æ­oÁmŒneè[`¤«±,P#¨ãàÍÛ¹ìÀã$¶(¶lv‡÷¹9æ ”Oî ›¤[Wn fR¼<îß)ñ‹ìòY_B€!EçY€‡¿Ei¿x÷âïß2Ì¿•VS‹¦ËStižOm™7ô¦ÑÎ#@ á.GäÊûèŽÀF™ª±ˆ+mGd§,dÁxO©î1© ¾J,~ÙØR%jŽ‚Ò%\ý²#Q)$‡ Xù\JaH¢ø†£Ýèè0óªÃñÂw^ñ³Ò»Æ –±ƒKkûµ¤‘ÓÉp ‹$½ób]xŠëi§t£¹•º3,, w¬±Kïs¯Oê’Nƒ),rœœw²mc—–s3J¦ï}¿µ÷ÝãçæsÓøŸaĨ—ž¥˜îáÏ :½2PeäG`C?¸ÉBë™\BtÌÈ}k•”tó65zÛR‰úh?Û®½L…; U¿z>Ùò}iüµÂ0~JÇùT”0;%ÌuÓ~£’?ÿ³“\ô5ðDÒ0ˆaÀA~|ÑÈ JÌuà[Ÿ¨`ÈååI<æÕ{ò‹r§˜ú[Ÿ<öæý΂ cBô¼þ¿=ógÖQ&˜faßÙ¤<I \úO3y,f&c²÷4ÅzØXþ—N™…ªøäþ² “üÿ§Ïit~ÆN_‘ÁÃwùéü íø0*ÏX·ÌãP¥Ù¡è k ñÓo ÿºÿû£ endstream endobj 1821 0 obj << /Length 2550 /Filter /FlateDecode >> stream xÚÕZYoÛH~÷¯ f–¢û`7™·LâI<˜I2¶g‹Lh±%¡H…¤ìƒýï[ÕÕ¤,‰ÙÍ1á"0lõY]WUÕò»€³hømVÝËgADð£¹b"“*–ê4MƒÆËà·³(XÁô³³¯Ïþ$y´ÐÁõ2ˆ5Ó© L,X¬Óà:^‡O‹››Ò6³¹Ld°Ùœ‡þÄ‚Çáï­mþÞ⤠ŸíŠÜÎæ"Ò\„*½¹þùìüúìÝwüð¼J˜‘2XlÎ^¿‰‚æ~"¦Ò$¸s+7´ðí2¸:Û³±4†? ùáÀå³ÏXyÊO™Ibä Ç{¸d±"å}'¤fpR~_ÏB28Ï©¹¬WóÒÞÚr6E&N{¥¸£–ˆ4RÿÕS+éT0˜ï‹g“2.“éŸm¶¥E«NÅLÔE´ò‘[Û°E]-iñi $!Þùµ°èˆ«Õ®Éº¢® ‹‘2Ä‘Ò>ú ÝÇ©a¤“oªú(b†'Ÿ¥úoãb9i2á]‰“„EÊãÁߎìþÍ¡!6±Ê)Å5 àVÿ³Å>“D|W™W¬àÞI9¡™”qwЙɾßÚ¦ØØªËÊiL$°„QŠ+¡„QéÞ+7uîsÍv]7Ý4Rs,câïË1#,cô„–‚pjⓊ ‚)sd•`)ô}•œÊ` c¦Hu9Ü&b #ÈX'ûèhi,b’ …ÕXÄø<¯$lª§VA 3Muê…ŧµØWlÛÆ.mcóyY,mq‚dçb"KK¬n&”]bqãe¿ÍÊâDðd"Á¡j‘)ÿ¾0(2 D>¡µ8‡!Ÿo.ʬm§ 2ÅÇk1¸F0k80a26§O)”`Oã˜2šNÉ ¥NK"Ÿ­nëÚ×"Šø#'–KhÀùèÑét  ãSÂ’4œ‰8ò]IÆ’i5á7 àÙÌDé׿+É8e™oý¸Ç(:æ«Þ• @Q†ˆ˜îSa€ÅälÎy…—vSw–¾êz¼ëjh‰“W¢ÓW%(?RHiç@7N=ÝóÛ™HBÛ|‘)ÈÉH† T@\˜0ïG».[àŽµmýŽš>ûõöŽeQ½}€Í4,:ÚàÆ]ë{ÖÖÿ¼é²¢: $ÈÍxhñû¼ÖšU95øÙÎ6­; ÉÕ e潸Þ]é[ÂçO^ÝjÔœ´¦Fæ§ ýÅQËþOèŠHɇ'¼'/_ütqù눢ã0:í×t£ÄX ©³_sõò—‹'×c´8‹T¿lcÛ6[Ù–Íæ:2áEEl/²ÖyCÖKÙÔ7Ei©]‘¹E©ˆ“=`¢hiÓ31˜ýgQи \F­Õ¡¹u¼7´ÑBÖ™;Î4Z…u·v_ÇÂØé& îMGýÆ95hœi„c œsY7Ö_t»¬,?øÞàŒhs7Ô³ÂvE5\Ðß蜨ÃT†×kTƒâ:´ï;[µŽ?ì‚{Ì@-·E>x_¿nK|¹'<ŸMÜT»ÛÒ>)¸‘%ú6M«Ô«{ŽEÏÊS :-ý)hIÅMØ üm,QȪ¢ÝÐPÖØ1ñºuÝÔ»ÕÚ)JÊ0/ÚÅ®m-ZFª°*j¾ö Xå~ áß¾ è…¡u³`äÁ'mt§Kþ›EòÅ›U(ÒãÍo˜Ó×}hð@x½Æÿ ¿-r›ùVKŸÝ:ë°^_-üªEYxÛSÿ…wEG¥ód»¦9ØSzôq>ð/a—µÙ 7¹ Ç×Ñ-Ý.›ï{ÈhQ]‘u`ç "Üa|ù4Â/1ôGÆ(ÅÌ@øó+? þã¯Ïå̘ðúâê|ì ƒóÿ7ÝËóß~?¿ÅK1~X‡h4B " TjOìÕ/ÈÛ¿FÈÉ„¥2Dƒö8\V«ðy–¼sÑÓÇPg¨G­©¥µ}·s€´Â¾‡²4±kwÎØÐ¬·hc„h¡ÓÞ½àú{,VkyhˬlîLfíÛ–ZËñh£a›ä½/Î/ž=ÿñååÕˆÀe&rÐq"lj¯lã%¥³B&ˆ.H"SpŽ6R{? MxYTžß²hûK¢‘9š³Э(³Å`ÚGnrl‰n˜j£¸k ÛÜ¡!•-Vkœ¹ñÐLÑÂÍtÞˆ†ßÎÄóð#ú3^ºû¯¢ôàþ+È;V$N‘¸8XTK¼Îþz+8¥èú5¶ê×Ðõ›ŸÚáT¶ò“# ÀÙ=´mOY %àƒý9­­òvÌ!æ#ø_“%â£,Ï”æ”!³!ÆÁˆ‹`Â{;6 ¥Ãˆ„s‘(¼’É04ḷ•ñ9Iíò:¥âƒ+„´0Í+=Ý —ÒávŸ‰€ —÷üµ%¿ñb˜Öûí—„Ÿ$"™‡¬ò$‹ã J>I”d\é#º›•x¿’pÇ(Ü#ö}îW–Fh3}üŽ`ÞswßqÝÛÊ©öÎr”R‹WàêÃe‚úR§GiÞÒ m(‡Á†Eû´/öоøIh ¯ÇÎ3SPs"Àyù}{ûY³²š ÍøOfgpž7Ť]ÇMn†+ÛGÓ~t×pQJŽÂ´ñikÛ3žucé“ÓÀBió•u9sÞ­}> ™\W”%5=Ô @.jeK´ ë²Qø¬Ëœ2î’ª©ÅõA}sá³ñ¾´£ìcJ¶òYü vŽ9”iZ¶òéXî¶T»ºŒ‰Iž0¸¨›û·`ïK¢CýçAµðÿ~åÑà¸M©#¦A¹:ük&v€ú.»U)ä2úpLÑyàH[/»!æbæKû»Ö–K´’¡J×™?Ú¡“ÂÀ³A|¢ ´*Yç·ßÝš–üêK&õˆ‚‡ú´îíÇSª¶ÞØ5Ù=™ Ì%_µ©WøÙ5ÅjåÂöØCš¹‡yp d±Æ»²¤%í¢)¶~³Ýꎖ+Ô±ÕG lD ç5”="+þp˜_”»Üæu/|ÒC@£œG|c|ãÖ8Cšva«¬)j“Tt–aö0nj*q"Ã;…#PvÅ¢Øfì‘äýÐŽkö/ Ø[û”WЈ3që™ö9à¸ñšl[äspMáÓ…ÃG@ð_RÕÉûÍùõÙ7ÐÝ endstream endobj 1857 0 obj << /Length 1251 /Filter /FlateDecode >> stream xÚÕZMsÛ6½ëW`ÒCé™hƒ],¾|ì´ñLnMSšƒ,Q2g$Ò¡ä¤3ü÷.EZ?j»u½²ä±H°oì>ñ³A°»ÿvqíãûS+({3C9gÓ–fn~Y³ê“ÑO§£7oš,ÕÌéÜø!;=ÙœÎÌÇâçêìlY¶Gc—\!ÀÑ ”7Oè‹ë²ýqÝUrqrYÍÊ£1Ù€Tx{ôéôÝè—ÓÑçníÁ]÷œ :g¦«ÑÇOÖ̤î±À9™¯Û–+#÷ öËýÒü6ºar2h!ÛŒÉÑA l"9H¾·øí‘XÚ,—Í¥âkU/Ä&Ï…XZ•ëþ¾™e˜²ýÒµ,[˜6õPñ»E^^µž•«¦^oÚɦ|-%Ñç}ß]µ/Ü®ÿ¡ŸákÓIÝßœÉEʇҦî:_\¶å¬/Ù4}?U=mÚÕÐjY•u×Û¦ÿ<éûh.7Ý´š1È.ÈÕç©ÍyYu<9WPwá¢.«Åy×K÷íX4í/l™‘)4f÷&Nt½àýÉ܉A掺®øŠ&.Å­{}ÇÕÃ\µ¼í!ÖRºé!î>yôh·¼:oÂ&ÿ?ãî }ïλi–õàþ¡ó¬wzòżiû›¾ËèãM¼“ûHXs¢x¹ ý,,›ÅxY~)—=ò¤ÙgÙCIrµäãßWM·§n¹>oÚjöÙ)¢æ ɦõE[Î˶¬§nÒÁìðöÎöTÌÏ»-¡É^‘'"ˆv8nÊ?.äD]•õf²Ô¡Èz°ÙE>£Xô(òÙËØSTÍ'W«èU¹9·¯úû?Uèò1BÎñ°è ÌI®€r–F0G7pØóƒÉZм…$‰\ßå"ÜÃ.'뵪Gº(‡«Z ”Ðãq@{Ñ4CèBÖâñì,£¼ŽßÖAߥHŠTS„†ö›B±‚<ÔŽÃ9È‘JмX 1 f;¹¨fãi³ZU›aïQaŠ“$xÞ顿pˆ0/ëj:Yoî\sü!C°‡m²\­gE΂Ä!Úl.6US÷”me³­šqA’—0øzWàä¥F)x«Œ3¸Ê¿=AÒa—ešÓsk:Ý0ã¿Òt®F}‚ÓR ñÙÁ‘€óþÅVŒ$ƒEEgD¹&z¤`¥“Ò»œÁ†¤8 léÜõ*—¼¤Y²K|âýêU."dEgwQNBçï–«t(ç0V¨ë˜!EEýØqÚþJ²¹Ê9GtXa„•_Gë¹t§\…ªr•³ DŠá­³ (åûR’! UÁOÙBˆ^?e†ÈûÍC)F@ µF)ˆu1("Æ=‰vä-XŠzªy›éU»~Qj©väpTÔ툭tí4u;™PÈ”kZÉøÒA™ŒÙËY«çI(ùWÊþñúÍ ÀíG¿ÁDr+F§Ø=TÂáéÆ$óüìå`”t:;eƒ‡|ûY„ÿ\È’ºã‹pГ ®ˆËÉìÓµ tâÆÌŠ™º¢»Óx`‘üöM=ÌP¹¯ŒX¶w‰ø+ÚQS[B+ÇPÀ'–¨ÿ°߈('”b¬=`p÷eðšŒ[œjèåð¡þF vÿa$w endstream endobj 1789 0 obj << /Type /ObjStm /N 100 /First 972 /Length 1608 /Filter /FlateDecode >> stream xÚ­XÛnG}߯èGx §»ºª/‘…ÄENP a"%±ü`Ö ¬lv­õ:¿Ï©6Ìâ2áoMq¦ûTuÝzb)ì‚‹¥ˆcÑßìZ..&qÄÕÅÚÕuDsTTuŠª©Ñ%i*ãÀ3É1w ;n¬‚8I]“Ô®).Ör¹tEu%*$W²jðf ªQJ3VnÑE Yu†€B£D¹5è¥)¹2wVÊà{ô1•âh;$,W)Ì %H¹ë@¢ÅŽÃc“®ÃM—ª¡8 ¬àß„Ú=ƒbR^#ؤR„ç(9ÊPQ®Ø"’£; ú$E%†·;Ÿëi€úG%8šr‰*eGY ФKÕ¥ n¨D.aAìéÑUb—R_RÊJž²Kõ]*¤ë°Šô•q.Iô+¼„³U]Â)çÔuØ#Wœs…¥©P×a%HأƮÃ5wöè'Yö9c©Ôôœ*Na£¶á‡ªv0B)¦ˆ=àaFL¨ÁDÔqˆVÊ]—§Øu’t]Eô…®k!°@@v÷A%IaÀ2"[^(¤Tà.EC‡ÅêaH Us×T ]RMºN#¼›÷º1j×'1öÈR7þ—Ñ ¤‘Œfàde4›ËhFINF3àWQ3 aÑ,%£HU‘g{{³á©;Ä&)ý þõ·“ì3âIù,É­.ÏÎŽf~›GºÁA¼ˆÌ|@.ÙÀÜ|óMàÔŠ×<2‚a ŽÚ®âÍ, ì3ƒ¥zA%°™}ËÆL)zd‹×(¶{-ú&0µ€ÌFp€7Òm4Jò„vCð¨Û7ÁûëÕÖíí¹a¥ª€dk¿ºŒ¼eÔ+Mç«ršå㲿 ÛÇ”S;«‡æjo’ýqšyú€]‡ç›õü`±u‡nxþtß /¶î¡—ÿž/ðÇo³á È-VÛ -ïÙlx±¸X_næ‹‹±äwÝï‹“åñãõw¨Ä2¢}îoð6€”Gà£ÕjÕÇæ¨|zo¼F{¿ Ò_™ ×›“Ŧ¯ކ_†gÃ<À§GJicˆ‚çÜ?¢&¥Æm ¿Õ‡˜;¸|µÅ’ÃoËÕéðho¯o0<šo—ëÕp0üñâ™þ»÷v»=ÿi^-W'1øåÅܯ7o†÷ËÓåðëâø>È}'?®>£²‚”'­ØDžQÑíðLw&xzvùÊÏ×ïüùÙpòv~þONÖóaÁ«Å]_}7ßð‰o$8.ë¨S|Dˆc°Bâ+ÿŒ2T€{ÔãöÀ ?¯_®ÂþÞ|¹]øÍë9RYî»ÏLzF4¾–>ÒÓó™×VþuúܹV{ULà“¯“5m :“Åd &6°TÔ‡Éb2.‚Pµ‚3ªe6ºN¸ø†ú`ÃÏ:nÙÀȺJFl(ÞzØÜ’/dÓÒ‡Îm´V‹íûõæô‚B ? ¡q!Ì>±áàƒÞhoas¼]Ï¿¤¢¤[s» þØÁ0î·f:˜±˜TRˆ6pnÙ!#¸bv ÉÎmú¾6 Æïä}mÌ„ûšÑ‚‹’N“¶•CôÒ¬+£¶‚Q(¸e#8ߨGÚÎ1×Á qÄÆ Óvn> stream xÚÕY[Û¶~ß_!ô¥2PsyIißz9 Z´ç é}Hò µèµpdÉ•äÝ Îï7$åËÆ’4P/ÖâeHÎ73œ‹üG"?ü÷÷gÝ—/’6áø3"c²Ð‰-2V˜¢(’Þ%ëä—+žÜcúÅÕ7·W×ß+‘˜–&¹]'Ú0S¨ÄjÉ´)’Û*y•~WßÝ5®_,U®RÀK‘ |i)túÛàú/šÌÒûºr‹¥äFÈT‹Å›Û¯þu{õÇ•ðüˆÃöYάRÉj{õê O*Ìý˜p–yòè)· Ú ü£Ý$¿^Yæ¬H’ß¼|ñ”ïò% fsM|ÑøÄƒPLgAxÅI³LÆy!HÎF°<³‰•Šáe›Â0\¬ÿÿó`´*ÿÔ?ë%4F33êÅÌhôÒíÆºkƒaVí°„w{ ßwÁP×󨮘«9ŃÏÞGëêûÍ]×Ϥ!ð4¾: H|fÊ7fÎt^†È¨õ‡]âËŒkˆY=ç\1ŸôÑŒ_Puëð\»rÜ÷n@*’e:ý~ä£kšn!múX·÷jÕµ¯¹Èbš lýùoÃ]ñ'`<òZ¶‘³§r»kÜÍßÑ5‡„ƒ>«®…`¶ø UNG® ͸VóÝM] Ú‰<ØcÓÝ/·¥£ä¬†M׳8$ ¦á>çCëc®N¨÷àbj•ÏÙXVhýÊ2´ÎXÆÍŒjÒT6hÉ=í\_o];–Í<Ê8êŒ9Ñf(9eLõ{·íF·,÷c—±÷çRÙ@çÒÔá\¿xÜ”c/{m7†¹a¿ » ·#@žÊoövÛõŽŠ:2ÖÔCܫ޻ïúÎ"u…õÀ™,'hÑJ=´uGå‡.Rì4v=î‰HçlåеT…h)ÒÆ@u,.Ð!ØÖ—èì·Þ7¡7ÍÓ¡Ûº®¾@ÂO#}¹¢ýþÊŒø" ‚¢Q ²¡¨ÒBóF äÌî=wü°ó½‹lŽç!ós°M9ºa ¥ÏÕS®¼*}ýæµá‹¦±nšÐÜ„ŠéL 1Õ'­Îq,X”§&.dÎr‘-–Ñ;f¡yús¹Ûô¹‚ÊUrOïi–‡µpFǵèÉô‘ÄE¼ÓU{ôtO£k`êÀD]6£ëÉÊhxu(v¿Œë£yǶ&Ð4ü¸qmX_¹ÆÝ—ã´Ã)+ÊÛ#õnåê õŠýµAþУ+ãöæ` U»ì¸’ÂD=†§WÊÐ=žL½¨QL£DÚ7qψ&t*X=îïþà4¼5`E7n gG?ôñÈ ×S.1 ææÀGùÀ-¨N9Ó3ƒ‹³[^2ɨ|\±‰w_÷óôß]¿õwö}Ëv¸«= …âÚ.0\¶±AºïÛiÃpÁqí¢-6 B·"qÜDK> Fª ,N„g~ '®ë§²ª.Ø-êd¡²iLç®Ë,Çõ@ø9“ÌÙæ°°K› f”ž6'Áq Ÿè½ªÄ­$„¾-SÿÂe?ÄÞÁ¨C#‹·iœ­Ûð$/âþ6u}pS4PÕ°f¸Ë·á ×\óèÌÔÞÞNϺ$N™!¨Ë ÀõCÙ_7õÝu•zñ2šå<ŠJOéO5½Dú)Xéþ)8¨É?­ö}òK :ð{ÝVÞË>è o†YŒ0ÞÙ—Öü ÍôÓM™¼4á­aÝÔhŒ¿¤™oÅ{;Iäí¢ÀÕj[*ýé·¸-ù{hÁŸû~¾òkâÕägq5Œ'nŠô»_—?Õ£ £¯bŠ…TÅÿÛþ»H~°­Œ¿çÄ”#oâ9$=|~Ü#Z¹Áñ‚BÓ \œ ŠœŒµÁ‰¦ó> D…¶B.h¦ƒûè,14zÑ ísϵéÎÔÈÎNOd–,³Ÿ endstream endobj 1934 0 obj << /Length 2033 /Filter /FlateDecode >> stream xÚÍ]oÜDð=¿ÂâŸD¶ÞO{yƒAÇ´(.ªš³g×ó½3³3o΢ñ»=yýå"¨ƒþ®˜°:ˆ­bÖXkƒ¶®ƒŸÏ¢` Ëg__ž½øNòÀ²0Áåu  3V±L\æÁá7åÕUU´›s™È°Í99üÑ‚ëð·®h?ïpQ…‡2/6ç"2\„Zlþ¼üáìÛ˳·gÜñÃGô*a±”A¶;ûãÏ(Èaí‡ bÊ&Á­Û¹ à™ÿð\¿žÍXq¢IeÄ”g!Y¢‰e Üq¡Ã_‹öÝFòÐqë0kê×WÛC›öeS#ƒ/¾K1YŽÈ¸aVšà\~-›Ã"ÂÂbqÀuÀUØõM[äæ)HqBBƒ9’ÄqØAÒë~Œa 4å÷"Ùª‘;‚ýM±DT¬’ñÃEŸ½È½!R‰ãæHDG?vøpG´ºû®/v¬p4í)Ù¡m ÷Ièƒs©mpÎ%Óʱþ^Öyƒ›nQYR†ºÒ næe[d Åû ø#nÑâœY­Å#°e‚KomÆ{gÍ ‹îC¶˜¶ÞS^Îm©x4ªYqfiMWàØqè¡U³-³´ªîéµÛWeOß’âúÆ/û0û¯^s©: uŸÑöþ&íi1mGŠUD6•Sd’0 f<'Ûh‚Äú ³V Û¿ô2 ¯ÑvH§¸Kwûª {) ±ÎӉͼ,E{fèu ä4LŠÀwp[·'-ëŽ û Ê’î ´-|ëÀQØè!§Tÿzv’`±Ž[N›œÇ @RÚ¸- Zô„[R:‡hv§Œ'^SèCSQ™Ñûœ@±ˆ °Ö»ëàWJ ø%œ€f·KëÜ;¶3&‚;¯­¬DA3:ñqý89b’cõÒ!¢‘¶?·'¦Æ#‘°"æp$èPè(¼¨š«´¢ðMX¤‹Gžo½âïñX2öCÄ“^e鯈/‚æEV¥>JH&عXáòD p¿äÈ'l$:Ý !9%$€j´(‘D_U]3e·ó8¯^œÇÒN½ ÛáÙk «(8îÞ!P/¸:ò‚/^pòB ï .tO€Û²ª Ðá¡£oU˜zBé€ù:=T=½¼ÛhX¨ä~æD/Ü5D/Ç ¡Sp꫊BoYo—@wïòÝ—.oƒ[ÁøJŒSÀ/‹™] È$±ÂÌŽð!‹K&“ØU“Tþq ÃÎ2šIˆV³B~¨€x4µï|ÈOÄ„ž‹íõûŸå¦úì$­Îš 6Ôgt¨Î_œñÏÌ’™•Õ,ŠÍzò*kW|HK>ȯ+s™†:d=™ qØ× T»n]yMÌlœ¬(/T¡‘sSBëõÿ,e>w\B*±ýWai :»’MÔ3à–’ñÄó»ðùýûz }R¥ I8uØGî9Ó\Ÿf˜n c(ÖEUÉ-‚šö Oj,((…‘áíM9ý®»iUNÏLJ PוY1.ÁÊ==ã̱ôk=î»…týº¿o€|N¬6&øï{ˉŸr¦/ê^Í%Çrl^ CIVúboZ‰ÀkU¾Ùø2k½›²{JFÅšß$ü¹=WZ8„Æþo2*ÜÖ—b…è3„ cýñ*ÉÈPfLQwš5"¯„€¨“5e7šˆÀNö÷ëȨQ è¹³KÌ¢HRCvoþ„„¦µ¢Ì2™ÜpW¯ $$+õŠ~,|&ûë)—ÇÀ_òìÈÄ*~r­pÚÇ“p ±Œ8S‘÷õ¦}‚2¤…HÅÏ­ ¸¡2Ažò¿È>"Ž]7z5Ïx¹0òAö©»«¢]å´B¹Å¬²+Êl  =Üu²ŽÐèTv½,4„|£>eÖÒà\d=‘€¸þTIGN_ÑE̤1OO<‚[Pܳ÷ÎdeÎå³$IÇÞÝo]ta4%3rœ=,°g¸…Ãö¼¨›»± .W5ΰ/Øß…K2Ýþ0»²áZZç‹#¹˜Ã½]/°4ÆßSÖ€ÑÕSpSìGîðòê®°þæÚ2?m‰@j6myå$Ö†uC¿USo© °¢È;zìýò¤ƒlâΪÆu‘e…%(¦¦Ç®¬·•ßÔxdys¸`oÄ:>㮸ˊ}Oï';øAàˆÚ …k‚—44ñª^h/;ÛÂ…XÌ'F§gð‘ð¦÷›i<†›Þ•mpãŸXÖq@ê¡ã^š¯ˆ°+úÞ@8~Bï=ÉÞ†Mëñû‰SšÀSJtS¬q¢!9M4g°Z.Î’\ã ¥þÆq„¹<¯ÑÇ~Žôýœ¯ò¼-ºŽ:9.€Òtýñ³_úoµ¤V…¦9 üМÛ*îmœÄлW¤öãí”Û:…k¹0ÀàØLÑ‘ ¿ïÇã\‡ŽuÔ0~‚.[±¸qÍ”vJzA{ÿcgÒ‹‚ØO[Td'Ó[xÙ·4S,s7ºy-üfUéÛJ8b1Ɔ?ÕnÈ _ySà¶£Æü÷{7ñ¤i§Ãã¦ÆsºÄ¥Ïí0¼Bz£õ‰‘ä©«é!î]SºÑ¶œŽ³ž¡ó4‹ß}þÖ? endstream endobj 1957 0 obj << /Length 1705 /Filter /FlateDecode >> stream xÚÍZKsÛ6¾ëWðVj¦D°xð­Ô“\š:ê)Í–h‰SŠT(9v¦ÓÿÞŃ"¥(8Š0¶Ç"û–û} ùC„îÿºåÁíÍuÒ$ÂŒLr#ˆQƘ¤+“»ä M–øøzòólòâ7‰ÁÇL%³»D*¢ OrɈT&™-’wé¯Õím]vÓŒkž¢2Í ü dúç¶ì~ØÚ‡"½¾¯å4cTK%Ÿ¾Ÿ½ž¼œM>LÀÙ{ñB“œód¾ž¼{O“>{P"ŒNÜÈu‚m‚öc»NÞN“)1I²ÿ@Ï;n®Ohcœhi•Ùî^0'\çnAž$½yBKN(×Ç>ñÿó髵}‹×€Ê)» œHa¾Ýo2,Aé†Ç FWÊÇ̼.¶[·ÿßÓÉS±¤Œ"®ý¤”h~þÇGÍ £<‚ ƒ˜2T˜¦òÑ^fífWµM¤=U†(Óßœ“´÷·X,º=Þ´mÇ]¼ñBX)J Oïÿ~¥§-g¸nù¥s«Ucð•{JníµŽC×·\1“(®ˆÌC¨ÿä·ÑŒêtƒH¦ÓÖÖ¾oQþEA4eÒͲôÍöÎ_w«Ð¨Üþˆ÷ÀÓ‡U5Ÿ²<]ùÇó¢ñ[T§n’IñM«–M¹²Ú#™óº*›)Ú³Û" ®ÒW»âtZšäUÝë$E Wxõæ\o;‡sïA)vܵuÝZ¥U³ì»ºu±Û^:ÀˆR—þòÙÀ²4†èˆï:å4÷›ìRZ&™L×UÓç¹uñšQ²ÔÒqËh+ 5¢ ÿl‚Ï/6]yW=žÉR3\a¸t$[5Ü«9+ "ß?±F’’¼Ï‚’ÈïAÒôMçRÈ£gÿžÖ9®¿·˜ 9ÃTƒKw”[ûÃ(‘X€8©³Uas•aieEH]ÊÂûòÃ}õq*UZÔ!»ù~—‰ì¸}VÆÎÞlb üýf°;e]. KZ0U*0>UZ ­WRTM´˜‚͘ÚéØn*;íЈ^xæì¬;_̦Eg“'º´l}Ò”Ògsì>Þ Vú{?Hez‰õÔïMýÉ?óÀ´Èú¥Ài~7¬Ø…ïØ]±.wex|ÀÉ>8íz÷~ȪìJ§ÆÛo…ô¬£éÀ]·£ˆ ‹‡tÎDb{ g!†0H6¿ô{&ŒD²Ï1DŽˆ‘óxùRØjƒ2¼éÃ,4%‘“E$ÂÂÚĬårYšË>æ9áÇÂVb¿›zà{9w¹[Åñk"™Šè»`@°w>ø:r?‹é>ÄäyÄðf†PÁίó‚4êâ©Õä^Í÷§8Ü`Ñ«å@qd 8³©Qi¹öl¦íŠî“g8í3þ­ÌGPp8i¯Œí509f>¶ß’7®7ÁÞlÓ1ÛØ9»mêíM*-qPB;ÞãæðÛà?°±â#¹_æ9½._¾î<dzÕo*ÚžíËYsX¢Ž+^³¯xýÉ‘þô%°—lÒ­Ü5Çþ»mêMX[)þd'{ê„ÃuÒ–: 6D ÉŒ'RÈn‡7ãB%„Lß )‰Â¡½jæi“8 Mü{Ó&α<á/O8—˜rͳ¡MktÄóoÎQ"œ !f¡&³àTÊYGÕÀ†(Ap„äªÛþ8À÷þ²E5u? µº¯iÝcë™EU#·ý¨¶ÉêªùÛÚ’‹ôUã{‘{vâ„ZäÜ(Øãk¡¼ôí¡te¥¢?V½UÁüyeWÅ­4öZµ¾µ¶ó?ùvON@ïTÉïØ(æ?gfˆfÏ眙.¡:â93hC@†SÖ¦|Üe+A£“Ö¬½ËŠ,Di €I>xÒ ¹$ŠŠ˜Ç sbL¼oJA1BepÑí%d#ŠÅe!ˆ]È$©¹Ì¢»Ìž Dô™ bd ³„8^òJñ_9€!K¤ùù¤ ÐF#/þ?Fs¬8‡´_ÿœäHS endstream endobj 1907 0 obj << /Type /ObjStm /N 100 /First 963 /Length 1340 /Filter /FlateDecode >> stream xÚ¥XME ½Ï¯¨#\<årUI«HùÐHQ’í!lí ÍF ÿžçš»I 9ÌŒÛóÚvÙ®×®æÑG©…GŸÅ~G-3®Ö¥|-‘¥±"}iZQ^/êKÓ‹Õ¶ƒ0`ni`wV›…fri0AŠËA‹w ÁJç¥i¥ûÒxuizMay޳LfV„ sÕ¥Bе/.Y$$ødï!!á¥sH _£A§µîx2‚ÔXñ Ç7Ðì÷2ìyäd2ìuY:ÜÛ;‡¦âk2þ¾tã½£Éaª1|H˜Ÿ¡.R-pRêX:dšuéjîK×ýu›8$·z­aimK7!Í Z‹˜Á€ãOC¤ÃCC~¥ÒµK¤léWè(» ¬N ˆ¨xäOf™¶¬ÃÄœáiѪ…Hcé&:#j;QreWPm•• ¬V%ª; :­K§ÚÒ¤9àý¨¶*lè/[%68k«Äg§5œÖ€ŽS÷±²\´óÒÁGo7ŒŒº– Õ°(½Îåtnä ¶ºjƒ–6^µA!Wm\ŠÉª V`²jƒbÖRƒäKçÅŒ£Öh9³p„>ÅžX°Ø¶`±ífè°£Ì5tè$ó±tpÖeéଢ¨‚h¸ÙCòº;;Ûí•çhaÇN~RößÿðciNŽme^‰ÑvWo_¿¾ØÝ»÷Ï`é„.O‚µRä!fübÓäÀU‰5†ŽIÁ&9pwªèîØ…ldÁ6(¶D¬L™ ÓÀÆÊë Érc#SOf|@Ù6ïä–ì iFu&;C¬R³dg€#)*f¥àÊÌMñ„Êah2uÜ+Õšì Æ¯µdg° ÙçÀ2)ÛÌÌ'«ÍUH< ƒ:';£·™ëüxuSÎÎÊþ4ÕA™ë¦óQ~’ñ ƒ® Ü´|}¼|z¸)ÏËþñ£ó²vxwSþ²÷ì÷ßøãÅ/‡Ýþ!l®nÞÄCãþÝþÉáÍñíõåáÍ驺tß^¾zñàø®<'ŽÕô)pôâwÇÔQOÀûWWGX{~:"žÜ.ÀnÿôíO7ëúÛWW¿îöŽ×/×Ëx½Ø½ÿfÿè"â¹ÄJU„(ê$xº È5¦±úžÀÝ_9zZö_Ÿ 2üÅå«›]ÿ|éªöe$æVòc:ú;ùí”ü>hÈF×Þ¿¯”vÂ|’‹Òob¹’VÎ}:õ&IðPBÞ’`Ÿä- Æ/WK‚±Àá- rO֤ИG<5O°u¡šLskƒ,±Åèœ+“ölÜÑÌÉúµj$=Y?›•ºdÁ(,Y¬†%“Ó¹ÌUޢǻ¼‰ÍÞqÀù,ÞTû˜7UþoÞ^+&Æ<1ÝÿILFcë ¹ÆÖ¢8<¤À˜ïA É0š™¦Á,ž%$±Œ°ÙR[à`„­nlJºÙÙ`JÕ- ̳ɚhÇgìè'KÖD(of¨m²(2Zƒó`ædQb¼o['¿M0¤rŒùÞ²Œù>^¦¤ÀŒ æCêýÝ¢«OθÀÈéüy¤ÖúǤÖÚÿ'µ;£î¿‘ÚÖ\üIRÛãü¿þ-0śޏbtá$ØGÇ!!¹@ïJ}stÙsL 3 ƈ¨’Ç;‹¡9póº}$ÜÛì= FÌ#™:‹±V“©³kG6æk-‰ÅÁ4^€åÀè#µäúpzÁIãVMþO½ endstream endobj 1990 0 obj << /Length 1923 /Filter /FlateDecode >> stream xÚÍš[sÛ¶€ßõ+8})5S!¸ƒP§/7íLæœÈyòÉEB'’¨’TÏ™þ÷³ €²|Ië1žÄ&nv~ðî#ôøÓ]Ýʾ?Ïv…šI­ʌ•ÄjkmÖ¹l•ý{B³+¨>Ÿü|1yõF°ÌB5×ÙÅ*Sšh+2£8QÚfuv™Ÿ5ËåÆuÓ™(DéŒå ~)ÎTþ¡wÝ÷=VÊüüÐÔn:ãT3ž+9ýxñÛä—‹ÉæåaÇîeAŒYµ\~¤Y u¿e”H[dŸ}ËmiòCz“-&÷Ef”XjÙ©Ì\B‘aÄ€„LÑüõ¦q»©àù4è«v)ž;”ïÕ›â´/¦‰:ˆ²±³…ëþœò"G€9ór³i§ÜäŸû¯Ý(“»fwòÕ¡ÚmHïˮܺÁu¾­ÎÛ]ì#VÃ;ž­Û~E˲oz0± Î…Â…«†¦ÝõÞ¢æ8üœúÓìûóIvéß„¡u4\,/wõc;Ñ`FA¦0×ü~O:_µÝ¨ÿP6e³Ñ‚L%ã ºX»4‘Æ ™ëÎŲ­{mч²vžëÑüJ祷À|:3ÔägÞžÍÀT®þÚÙÚmÛÁÍš:¼¶±Ëª«Ãx¨¸¯Ú4»O3˜A­*7¡ÖwV/„ÍßLa)·ã$ã´¢bô¶Jýõ¥Ê/°–„È+«Ü…Ì2¨2èymn³ìøË[ý´ìþÐfÑZQhÜ,X>n …Æoè“ÝñÏ#Œ-ÆeäÝ=)þnO>z´ny_8‚ aîªçà›õçàüÐ𴔇é­ðЀ©8¬ï®*LQ:?ùÿÈ9}¼Œξ°„EB3HXYJ3ü7Ž\ÁçÀ&ÐÑ"ƒ-)¨ :^–u §L¦˜SÊæõ²˜³ùücí',¥òpBs¿m—ûέš/÷u¥eõ*,YBý)'†FýÛ=~UXM EP”dšªÂ¦ô©¦<¦†N<¡¦FMMД’FKeˆµ"ÝѬ4'TAË¿ž€JI0׳#SÀNûbõÛÁ€ƒzvå¤&”‹ÃKŠ#(è„«Q (°û¼t‚â˜U3ú…2Ê© 2;dˆ ÉQ1Ä ž™|ÄX,OXŠÔ ^2ÉÔM ŒÒ"3ˆ—ÂL>w´H©¿A’é™Ij$‰„Šj •™¤D˜H‡R!Lè´È$…$2 ,ˆÁð)È$s=;Uà0\ÉÄÈ$²ƒ|vå8'ÒðƒL’"(¨„«‘(ܦøIÿÇH̯\AçsÆ…œ+½ZÍWÎs[.«${TXD‹„ ),¢K‰O @˜t§­( øËÀ'¡£Јü¥àÜZˆ)õWH"=> T‘…DªéùIp$‹„Šr •ŸÈQ$Ä〒ØŸ‚O‚0׳ƒ÷´'àÓ×ÌÜhbuqãa.¢‡ùwwý®å׺á9Ì-!Ùçb¼”õ¡B/&Vô‡}ð“¶ÝJ¼ÖW¹ê€ÎUaD~ön ?`k“×倎U¬:ôÞQ•‹·ç!µu¸.wM¿%p4k–/š]»ÖS–7±ƒOÞ~í¿îõu_¢K·‚ø2Úð¼qB¦Üô±]¥!Õ 'Õ¨Q™÷'NxŸoWÞmü´eò9ôÀþnyg±»>á€øô$aÉ endstream endobj 2032 0 obj << /Length 3595 /Filter /FlateDecode >> stream xÚµÙrÛFò]_Á·€U"`púÍW§rx-m%[N bHNh’•ýùík@‚ËU[* sôôL÷ô=ú´ò]oømö“îû7«jåÁOì‡nE«$ Ý,βlÕèÕnõ¯ oµ‡é7/®/¾ÿAù« ¦ƒxu½[E±gj•DÅÙêºX}p^™››R7ëJ•¸ëïøð' üÈùw«›ïZœ 7½)ôzx±8Q´þëú§‹×ן.|:? S7Qjµ=^|øË[0÷ÓÊsÃ,]ÝäqmÎíruuq>²çf«Õð(Ÿ¼³°[ Ü4ÂÍpØ"V®JbÈ“°[È…]×Séœ&õM_½Û·PíÃæž?'ÛWnfßN7‹L°ì™—ùc™iSqÌ2óÛ©3uõk~qˆ‚È©©¿¹ÍË^“XüóŽ‹‚ãÅnTü¿ïÒK\ßWOºK»ëìkUì!¿â$uSà$ñën­§n>n Ó0dý÷?¤“µLТÿ‚Ö)åüéE^»­O x©£Ÿ­7a9û²¾ÉK˜ò]ë5hoþq0-/¬+Ð9å ÜTG:Žã;þ¶]cª=·»u8÷¸Gâh—÷x¥ÿôü°²èî7Ð kBhÑÛ®nî×`ÜYSžl˜°MvOä•õ~Sê[äŒ.e ˜/sÅ÷¸GœrE%¸ ™+Ð0wzO|M²xL?¼[ÂÒÜê­¤`B*p®”vüív¾Þsã¨Û6ßëÖžî@ÊlQ®¯âÕF´—è¼]G±“—¦€¥±ï4yµGt±ç˜–‡vÍ6;rÇç9dË-Þ¥†k¡‘O½Ñ²„»]Íðé>µðþ˜L¸îV 7Q˯зPtº^ËYòFw¬ia¡ËR<”ïXôâ§ZžêŸïÄoʸ`Zâ´÷-0X–!Ëè~Š[ҵǎT¼>êf¯«í=ø@ß pâ98·nô…ƒ/Ó™-ËŠ‡„¥iêfñpêw’¥¦ùÄ8õk ÈôW‚£o«]MŒ_ .¯€9¡ï9)B¾".ÜÀuö{áwœ$Î˾i4KiyÏàƒ³Q‚[ì[ÒÉП2ûŠ!ðÖ±›^"ÇàJdÚçi9 0Lúx›Øo€Û cˆ]Ý0 \K§_6ʲF\w‚^z|†…+Œº±]_mQV¾Õƒmë²nÚG­n O: xƒ¥€wîÃàB–²!’ØU‚ÞÀ ‚&OÃÓÐ7‡¾†"Z%:C ÆzŽSWÂHJ ˆy È:;4è¢{#C¬<È¿¢)™-äRÁyGPØXw=—J"_D·h[˜ÑÕöa=Á¾œ ù)M‡ç½G¯$›<Óñšã(Q@Ô¾CƒÃwå‘R•vcù{GmÀ!+¸u€=JOQsòT¡uÜnû_k½ 2?.y•‘ÕÄJ½Úü†lr–DÏ @–²“,îšÈÀ­¨A€ Ç|º oA!z8èMkþ~<„È\ÏÇÂ-å´é,{‹¼àAöÙœ6š„ØG© Ò­Áë²ëð¼~Éj:4µ(ˈP10î(7£½-è™mÐÒ‘cß…Pg–¶P± ’/L£$æÒëÿòBhÃtø-Fš–’—ÀœZ”L—¥G}¬)W´3z ž!²àË¢dICãPºrÑž²(îYË $ùzÉ.\-Xš$¶oŒn¿!*m;ˆ‘Jô$‰“ïú¡?'0xÄ)š—H¢Ì²\žÓ]sçžæ;LÔ ¦m)Ô&D,éX6Æ´K°cK “"§°–+LÔ‡@§¶¾,8€lúŠF¾gvQw»f»¦hÆÌ‚»òAkâÝkYwB{ÚP…ÏÇ`LPjH­u‰>ÛÁQŒx³Ô©Ð¼Ñ’¢¾¶z1Ú©¥(¬GDŸ¹8×÷vb©àÖY}׃·ùäçm ©ïíÚ&PŠ#7ØäM¥ÆÏbl[±Ù–9KÙL¸@Õ¹þv¹„)†<,±]¾ù*•A:bü±€,ðÝÀÒ«Ó:~cì1džWZ*|WšB)½z+þM¸,zî¾s±ú@Œ A‹&jFHUY…ªçùSaÄ”ÂÔ|«7¦ØÔM¡-qúœ$JÆœ$  ðTƒ“i‘“×±?HâÁ 6<$ºPl㎃“ÙÚm,_Τî¤ÊM¨L½Ñ;±‚ó{Áºx8š *0vÑpw\[À€3‰,TÝ,!ÍIÏRUC"´,Å#Yç|Æ©«|ª|לoŽÂàØaÚ¥­a}ðu¼Pc) Ð\®¹V…ÈG~»+m2”W‚@cð5Ña%KN† ®>žæ·Ùû×PhBª¯ÌßÃ'°™ïnt™“Ãä`?óš Ì1ÊÆEèÐI †0Ðô¢JAïâájÞ¿þùùèø2`Ô¿ÇÆëw?/p6‰\a”%…6# ™¡µ¾1]“Spg!MÄdÔÇJ³˜ ^pÈma‚´h ‘šRÏYˆ3°Æ]ó,¸výui‹ß¤|þpŽ%v$¡›¦ƒ8›Š¯Í ]çC.D©{fÂ@ îœË¥s¾è ×ã÷FÂ+g㉑Nθi6ènCg+óûÍH˜fgÄlß Â7ÏR饨wäF)À7/Ûš['y`hd-«AÈÉ>®©Ú®é·÷† mÃ} EÖG–¥1H#7 ¢§°?/°üçãwõ^ÃF zÿÏÞÏ`RÆár¨\/š%FœÓAhmê2ï8» _åÊœhîÃþ¢|Ä S † Û ò³€†»äN} ™p¯+Ýä%¡Bs#æ ¡„J?ÎE5Àr€…#¶èƒí»ƒ^,Î:/ÙìÄžT ðÅ„öò83(J ãdÌÃrŠÈÀ½î˜jÄ_ìÍù‹ Ýš˜Žâ|w"«Žvr»yIÌH¤‚H] sþ oméà“‰Äb k\* Ê>‡´¥¹…Ôú’­ÂäÁ[Qì?¼éô4n†–ÆMe:¡Ðß2ž[‹Â/LòÞdÀØM-‹ý¾¾¾ø\I‡k endstream endobj 2047 0 obj << /Length 3456 /Filter /FlateDecode >> stream xÚÍZ[oÜÆ~ׯØ>• xÎ ¯~KkÅpP¤©­4(’¸Ý‘VMÑž`-–ô,R˜.YÙÙ:gÎá½—AêHˆú>?àØr ò!(¦ø](ö®’^TÀ®ðà&öÞí¹•UKû¼ª{¸¶Q  Ò6t•ÛïB' {$x'¶¯«æ#ÉuYvÓÖ¶.ÇÓ]ÜáHb˜yï¯ÿö% í¾Â[üýýV)å}!ÒÒÕy$1Þ’À€ ™…Œ•¯ƒÄIJ¾mìÀeB? Çalòî·¤?%oYZ<}S¡n8ÆÇÆû¦íNy]?lÁc ÑBåÝÑ"àœ[µv8rµÝó‡cÛ[¹È( Ä•Å~…K’äÃ`OwÒ?̈=¸ŠÑ Úæöë÷U]s©ìP!L˜NƒïrÚñ#‰+‰AxßË™³™ Ræ´wd¨\dËYl“ƒ3-é8æ™SPiÆlqhg¢\DD’+‰6šÿœô•[…ü¶„GòÞÉèÓ|POŠÂ‡à3é•+—¢F Ttâ„üÎ#ÕjÏ\9ºEOŽ×6õƒ+YwH§”´tÕ,긆²«ˆ}”MoÏrôJ¾kêŒ|¯O--{“nÈ‘út4^e˽9Wï» µ ÇÊÉÉBïxIl<٥Ȧµå` nƒë¹cp37Gr8¸\Ï£rW¤¡ÉO²T?äƒíÁVFiäýûìî_º$‰¹ ÐÝ’ÝÐ}Ej¥"?£ôýé·»”¾èª»á9Obb?L²™'1qöØ“À‚âIDó#°Ü+x„Y< @€U±›4ÂžŽ›ÄæâxqJ<2Ià5¨'G\Ïß\fñõVk‰ÚA‰AšÌ-ÀJYTÅxÉ+ª‹’…ËUÄÌ8õú–O…¢wàþê4‹ÜyOlGuËzئ—Á /•sµèÁ ½B=Ö€ˆ‘"g6i8 þÁQ#m~–%{J”î«Cƒfè‚|ù,e> \¿ Âˆ©ÊÀ?é ÀŸý§²Ù•eÓïÜõŸE÷-†3å64+¹ÍÖ‡s¹MÖca†ß±*B•^ÂïØ:2ŠÙó÷Í7dÎܸÕÐ'›¬`Žˆí[7Î + (Ø;ÆñPønâ­3!ÂÅð÷p1þ#\—F ”È`,Fϰ1…#˜x£éhÎÅ„cŒÓ ¼àd¢ÒGLæMC5°éÁÆ‘«2ïøR™³ttè7è¤P¬äò­;Vˆ1ÄÍÈø€„ž½<‹áçÏì‚ÂŒ]Üp²‚ Áf4UOv†ðˆö¾¬ëïu?‚^QRDQ’À¼s OÏ©ªá@ EÛŒ(‹» ˆO%¾JGzuiØOÓq•syi ÅL»1yS^<òMMƒž:θ#B3B „¼y#÷µD’¾ùv…°@–ߘ•r-T Á¼ØÂ xÊàñ©•`‘ôß1"€Ag–Ka"4<¡·mÓN`Ctøæ¯ß¢ðúÎäþh-º¼öü,ZHRà’Yèkz!§b¢•®êì±®fNW§8í@ù-Ò(:µq†PUÐÙÍ>/à֤ư§êmÑ6e…ÔB]gÁıwÕƒJäÕ-#˜Ø+êjŒ”±‡\/*/[Bêš“Ü@-6Œd- —à=G4 ÀÑtÌç}·:hYÃÁL[Ôyçbé§qË\>Éö¹³/^B§õ) •Ÿ…¿*õq)­‡© †ò8mÒºP™;öö+ûv2É ™dœp+Ñ–søîÛÏ1—Fx°žŸÊ|5椰Ü×y|b0GÇ@äxeÙ&Xˆf°¶Í£mFñŒ.ÃLy:Ôëò6}ýú £5ÀƾKZÎT]‹ ]ù6ÔTbò®“Ä‹}d‹Ñ97…ɼJ¼–‹›s‰¯§¤!EÓs.ù‚dtñš(u€ZNy%i&ªÍÒ2¬DÐ2Ë1ß°qèr¸o\ðl¶üP˜é#¦_eŒ“>ð-0÷.ã$›Y†ß˜…Bt©I„‰†Gc4¥'2•œ“ÅäRŽmíÜHÞ\+nªG¸/JÌ6¿›q "×ãÄs9 ./ä‹L~ÂÕ`O‡¯Ý¾öM`ÖàÁ,ÁC ¥!ß=µ”ÉüÌŒ‹—²XÆ7ñˆDºO/°eÂÏZ 0 ¹EK4®ûdÈÀàEä¯0+E“hsÄ J ŽeѾ8Pb‹­l®yÂÙd‹°i|Á–`ë˜ß†áŹ#ÕÀæö•]XС±è,F \ɹ³±÷RŸ0ÀS¾þÌ5’)ÄÒEŽØÝû;‘ȨønäŽsè»_äe˜úY:ç¥ .8XKÞ6ÜëÅü‰ÃS;vª`ÍNÌÙ©‚ɵ`å±k1A6º,;vâLÇN(3;¡0±S‘³&;±c†O‚di„J[ÛC.‡Å”“c1R#)–!æofoHì _ U07'Or6´Hl)}‰µföl5à &™©1S/˜©çÌÔ—˜ICD7¡<2S͘©3õœ™š™©…™PÀT8{(a§J}“­’Y]Þ=,³r¡¸—¹þ>¥^€«ýyØÛ»ç¸ ;ˆç «/¥}B•]FÐ"è/5kô—ms~Ÿ`û*uICÉÑΖq“ýÍ“CZ’CÔÈŸâLG°BÆ~’EK~šc™ &¹8+û3ú’áHÁQ6KYa„IÔŠ€U¦×€‡~\оU³Ç‡¾;âÀ\^´ÝžòàÇ8.îiå­l} "{_• %Ö¸¦®Nç•¡L®åœ°óZm÷±5P‹Â$üôìÂÎ ‡©€¿ç`½µˆ?7µ[²MA’XÏPÚ)ð)Æ,-öóÁ (à :)‘‚”2æäý/"¶3½xqüôXÝWOÍNÝA·FuŸÁ=#ú.àŽ›XÝÊÿÄÇ/ ²àYö@ô¦xþµZûj•å»àecµz°}…·Ô,1ËqIõ«ÙË4ö4 ´.ëDÞµuo͸çâgP/Ht0+jeŒ€¨¸äDÞøÍe9Œ`|;ué?'"Œ¶ 4EzN%ª×òÖP#LÝÛ#öÌ3 Xïla%\ê¹¥·òÌž×—²@££Ñ@~ùf«c%×ï· hÚ»×0s"2=ÿÊã2Ú‚>r˜1 ~‹C¬–Ÿw{¹×”ß6蔂•I›¨ .¹?VŽ;&Ã'9ÔŒ,œÞ,¡|¬GK~M݌ع ¤Ym3‰}ÐØÕ}Ë-bqÙ B1í²Q³pF}:`êr&äôÑ Züý‘(ÚÚ(pö? gæK•öµŽW|¹FÆ<Ç—8óãlÍÞGÌ”TIQÊ9 ^>É<ÐéRùcu'+M9+\ Ø`yÇÔØÆd€¸ó¶–MZr@.ºÃ^ez™ÿ ÷UÙZ Á.e1gßçøÿÜTEÞ?ŸG }³@þÉxiýÈ&™ô±MÂqâîe„³J3{Åjúµí7 \Ï üþÛ”ò ƒß쇜û˜› áÑå`ØÇ†}P#˜0ñÕâ3d­¦ÌN‡#B¡¼=qó¾7mÞ?ðxz%Áy¬¶•¨ýDHñ»>vWòeÁê Êb~ ޼?7ÂÀ³nLî¾x3šÄF¦t0¯KgÁŸsŒ«N?2XðÜ}¯o®þ ÆT|™ endstream endobj 2059 0 obj << /Length 3272 /Filter /FlateDecode >> stream xÚÍZ[“Û¶~ß_ÁéK¹3CAú­­3ÓNožœJûFØï[ÐåãƒLèú-¯Wö|Ø'õsš$nd±@‹Èš6 Œ1ž0³×iÖg¯~|óJ.5ö?Ó:°R|lÀZþQ­?Gcç±Mô³ ;2Ê_ §ß£šv}3Œ+„&VÖO¦fÒ¤ÈCßPW}ÞäkYÑ)ô;´µB¡p¨í ˆ1&ô£ÛžºzägR—ì@BÆXóï÷…´°ƒ.Ì€Nž@`pŸ9¢¿´ ¦åX{CǪœ`aÖXa?G‹ŸCtg¥ƒ   †=9R\c]r€³ZQöOΓ=ŵO6lõt—±Á+Ô+×émÛ“m1^ Ê5™n£´õQÕ!‚fI]_Iy1Šÿ 3ÇWUÜ¢—à]ï?I#ˆ2î#*CJ®)Êh3‰ÄvUàodt?3nÏ\fceÁ,Ã$Òy 2 G-…£Ðã­k†QëWL†P‘ô\í$½ô‹T[Ž_ÐȧÕóu®‡Z@©Ë+Œ³ŠÈKÐ}FúÆ¡‡9ÉRhb°Ûóyê1 6ô²³{tï&ß.-‘ä¢9GërÜ’%)ª€Iš7¤`¼<~\a]+4H’Â$)HÞ¥Ç|¦aœDöo¼ÀÏ/PƒøÃ ®êfßö-Üñú8ŒŸÈ0ÚôÌ(E…h¸ެÆq³Ø'I Î&Ak O&ü7$Ç&H£éÂöBÒX¦]™å<óŽÝalÉ|Ý•¤‚·¨¶Œ_¼øí/Â&Æ´¼ Åï¤æÉ¢5hNûÃ9‹0µû–Td˜X=ÛÁÏ6 lþÛ=e²*QF-¦ê±UÐf  ºzšæ¼cq™*À±":(Mî0ËL¥¢Ý±C´;7C¤¸uty ô „©w1U+³‡¾44דgXéq:®f»A–B%¥-/òVH&¸žh ß)Í=¹à 4T#ý<£äY_ù´ÙbÌ̧D—ÔCAz¼ X¾Ðؤ͔ön²ò~¶½Q¤ŸXNX$­Š<.ë«^((dZ›øoË+¢mäUE0DGÜ2kUñѼZõ¾];½½ZEÑü‡4kغuñÐ)’™±‰­J|èÄvmU’k}/-=Æ/›Ÿ^ÁS>^¦Š²¸|OÍÃ÷TYz~O}öjŸ¦|Ì/U?Ú¶ˆï‹÷ÍÏÕÙ2‘\%6/aÅ2àˆnPÞ&3q–¦êes_¾¬ï×Í˗ܸºÚ·ÿþˆ¤uš”…úê’Ö*I?OÐ~ÑO= gYšdp”t„o$9ÔJNI^ÁÏ×j6â:ŸC¢ÃH÷ìã7NQ/x°õì>SÙ›PÙ7«ç+}m“"[(}°úWiy?à€¯Xù£æçmÿÚªì#`JoL¹°Æz€¾ìlLy¶8ÙËÎ…uëì’– õäùWL€7¿¥cÀ% çúlòÈ¥çœ(Ѽ•ŒÄg='ÙËéRôþ ÷é¿dQ<œ endstream endobj 2074 0 obj << /Length 3136 /Filter /FlateDecode >> stream xÚíZKsܸ¾ëWÌm©ª.@|ä–¬ÑVe³±åÊÁë5ƒÑ0Ë!µ$Dz*>ÝèIp&cY{É!eKÄ£ 4Ð_?©ßW2ãOwtß½]5+ÿR©ã¤0«¬Ðq‘E±êìj·úÇ•XÝÃôÛ«¿Ü^ýðFÉUÓIººÝ­L§…Ze&‰MZ¬n·«Ñ«êî®¶ÝõZå*‚ â뵌$ü2‰4чÞvßõ8©£·Çjk¯×‰He™üúÓíOW¯o¯~¿’Ž9.¯ó8Sjµ9\}ü$V[˜ûi%b]ä«GGyXA;þ¡]¯Þ_M,/Y—".D!ç¼'*Î ±~+þ¥ÞäóØÒàŽößp£¢_…ý¦}€cä‘ýÓõZé7uÙ÷ß#A ×0ñÎW öÞ]¬Òòód¢+›{ÿÖÖîÊc=¸žŽdõ‡72_eq‘ â0S±”ÅJÅ…ai(¦Sb~)cºžþ*„ Ò|A)Œ?³„ÓJ§*ºÝW=ñøùÚ¤QY-u·öW!ucy¶Ü t˜$zD$ì¯eT47T‹{®àrò8Ï#©b£™¥M]Yº¸½,‹zÿ~{¬·8”GýPv<ÛÙÆ>Ró¡kÝ}olß»:I£×_Ê ¿ù……,­‚×3åfc»åñî‰`S64vGrd~Xª› Ol·¼Õ?÷–©íé¦t^Ôݤš®n‹ØQzvß1ÅžÒAÙY¯î›¶CƱ³iµlýt °‰˜µ˜‹6ð–)ëAòmzpœéAæpn´™ô HQ2Òƒi>„;¬Ò²ÙÀ‰lš`=à•¼œÕ€ŒS‘S’LŸ¨@a¼ ßsÈC€Y¯0ó¸w؇Á9öÓ8°¯2=Vu-é!ƒö`»{Ûlž¨ÛÙ»ªÙR{RíÑƪ§sš’õ=ìʪF¥1€WVžðëºNPðœ4Æ-ì4æ Àþ 4GýÁÎ9ýTþ ë6çû#ÞÿÇ4æóu k×Õv]W;ëeûß4(Kã Ì´ð¸[º9¹¡²t!rá)’,a&—rT\é¢ê®•1ÏP ež£:ElŒZjŽN4kr÷PvåÁžÙ™æ`—¥^mIS˜•!¶Æ w’lw$çaÏ÷p~º–u¹Ýv€v뼉ƒœŽnv4Ç&ð[‚ô{FÌh:šŠv]{ Ö@:$ãòj¡נ€î¡³;ÛˆŸ:)Àå@—E¼¼Bœ^¾ÀWN¦Ÿ'#ð`¥¯}ÿs€—$êyÀËtr ¼ n¿'çØËÅ {6m 04!ØèÊ”à°3è%A¯`Ï!ô 1BÏÁNì`ÜãÞq°ƒ¡s°ƒi†]ưŠ}5p‹TŒ¸peö 0èðCýÐè,ÖúP~Y×¶ì/B‚=‘ÏÀÞ) U:bªÛ•çþqHh•Mt>&»ˆ8‘IŸ%ˆgÆÉl<œ*|”Gœá »#Þ˜ã}‹‡x¤ÉAçɇ€è,[Èj2dÎ"‘ÕN¼YÄf džÎÛ>o”Ð>ú8ÜyÍå狜ó¥ÎþËn†5R%hû.y=Ãfs±+}Fì:âFuÆùA„À''ŠÀóÕ‡›WÔª«~à·g9¬Û´õ’.KÈæ’m¿Žúöàô›-¤¡ª’ŒlêÚ]®0pïh<7ÏßÖȃ€‰nð–¯ t%u‘‚œá€‘’º“kqw !øÛWØA¿§ßiÚÁïî#+ítcm7P\|ü8­KT„˜å»“[O2¢qa2ÀÜUc°®8:‡”e}âp'y)'¯—€ŽLÔºmê§KhK³8WjŽ6ˆ'NÐf@ïF´åòm8?¡ V ÀWz´AË£-—3´á{ fª#àŒÉ=àfa:\^ÑO-A†%=90€ŒÁN`+lè¦Ùæ”Ô­¯iéò w˜ƒgˆ›ÐiŠ€œ’e5D2ŒFa -É’3GÎKz ñœ»*fÒy&xu¶ó9¨¡øì?™ýûªm<ÛÑ!¸g`¡Üº(œË)C¢m̳œžΠБq <2ŽÌOªSˆBGÚÉaŸ;й ±æ…DSì¸O²§×߬HÛ®}X›jSöÃE» Þon¶µHÏ(RñNÝÞ•5ã=MetÓ5䨶+k¼œDÍ®o ¢ÐMGê‹87´ãëT¶Â*΃S£p.Î nAÇñ,¼ ß'*”Kpï-;™÷à=qæ9fÌ­¤ãþ/Ìå>ðÛÚkŒÌŠ+X‹ö®¼õ/©…`ˆ‚ƒ]¨ëCëF¶_©‰dq–gA”¨ÎE‰&tn&Õ –| ˜‡ôLG;` IõWí¥”©½3à08 ÷ëû3ñÆ.ÄÃåFà9Œä(ÊF•Ö‹J»3蒉Ɩ GË’€%·@×ÖüÂÞ‚Ãô‹-¥Q”@’9ïXèéé“Ö3ÿ2EÛpïmÕ»Ñøœ»õ¾)’œUí=P’~•1ñs!}hå5h΀þñ¯ÿòÿú2þâ?ûøïìLÝ×þ:/A_&±.’y\gÄ)ôÓ, ¡Ÿ¾|‹ôÛªóX‡‹"ôÒÌ 1L;BF낱žE¾OA.’•Ã`.Â7 AáhTp¹‰¹¨¿{ýãß~sóöû×g*5ykȨøÜgaøˆI.×C„?±þÐOpõÎ`³úÁÈÌî;† UMeFì2æp»ºž[š?tðº¬&è†I͉ýàÀŒv_ ‘\Õ~¡Š|»oÆs(ü¾{o ø¥…7N¾"ÛW†þûY`ÊåPw9º½$HSÆÕ-2  )©VZ74|~së—ToJ|å~)>N>ÝÞ¼Á‘ÌLBÌ8é¥q¢ôÙ2žÿ¬PÒ'k0B·ø-j2”pÃႃݟ©_Má@ø%2ø<6ÛŽ¦XÀ_¸å]^`ý²e&ó’Ä”ª‰Ë;JÆZpJÍÇ-òNF‹è=Ü[X\ïém¾µÔ„j8u7a±vJ åt+¥â> stream xÚ½ZMo7½Ï¯à1¹°Éb±Š\ìNìí»+ø`ËãDH  ¤1œý÷ûªF-YÒH¢¬–qØÕäc}¾â8w­!…ÜUWû«¡§PR ¹øw š ô@d3øFj3-‡’}†BŸ)S]aÀXÍfj Ü]¦‡ª6¨%hñGšf{$!§,Rî!gl„9Åþlb"Œ7K¦+%¬Þm$¶X/!Kv1ƨú>4ùV?UÇrÚ}ÎÎã'ëØ§Ùa’ ãlM+ŒÈðø\ÁGm6â@Ù¿&<ÈìsÀ»Ï)T|Ô|J+dsIEm.ç@œöÀ‰ˆÅçðQ“«{ÔšÏ7¯Ýçð!ìsØCšÏaQ-f|Sµ)ÂÍ>A¶IÅ„-zö9la:ÇvzŒ ÖÄ ¹É]ñ K³Å‰ÔÄ$”RMøZØ1•›Æ.bÞ‘ Ö¢äïb=›c¼ÛÄ” 5pÚz`èÆä4°™#þùç›ÕwßÝ-LÖN=&Ù0‰Ä §ÍŸ…)BûcÂð˜Gad­QÿcÂBÑ\gL˜[¬iÐ(ˆÌhóW„_lN¶áà L/²šëî­Ý}ið^ò1^š~9ݽZoÃa˜~ùáE˜^¯ÿÞ†‹õ^ÿï¯5¼ým½š¾ÇÚë“í™åK_k5½\Ÿm>ž­ÏvÙÂçþµ~üöùæïphB/ÕNo°ÑÛS¼ U×ó—Ÿœl°Úá®/»AÛØëÀùŒúà4_d5½úønëßÿy|òÇjz¾9}¿>uéÍôÓôóôýaö/†ù§eê±bmT‡˜-áÔ;².‚36RÈ=s=¾ Ó›×›3|söñÝ^>ÞœD޹}kú[ŒRìåK…ë"¼ïÅr §Æ3Ý hÔ¹/T¤†—PéˆE¾”X¬¼ÕK—7‡ò3MÏ|‡é™ï?½š~}ù³ýûæ÷íö¯LÓ§OŸâñÙQÜœþ6m>l?ÁøÓ»ã“÷ß~9DD]·ºÚ"!­w³ÜZ46Ö§8`TÃ{iÔœZì(á"çÈÐ(Ò½ãÞkÒ£ãí:ž~8*`RŸ›Ò@ëŸ%€ê @µ™{ìÉW„wÙB‘-ª×°HC¾Ö¹æAaüí{³ò>a.±ìÍÊû„ÐmoVÞ' c€Z {%®^IdPØ+É +´Ñ Cσ¢Å´> stream xÚÍÛrÛ¶òÝ_¡·R“ˆ%ðÖ·¶nrÜ9ãqcçä!íEB§¼($ÇíÏŸ]삉uÝ´6™„ `,°÷…>¬„ë ÿÚûYóÍëU½òào(”ë'Á*J”›„I’¬Z½Ú­~¸ðV÷0üúâ›»‹/_I±J`ØWw»Uºa"WQà»A˜¬îòÕ{ç²ØnKÝ®72–là®7Âð_à‹ÀyÛéö‹•óúXäz½ñ½PøN¬ºûþâ»»‹ÂÐ#†åUìFR®²êâýOÞ*‡±ïWž«’xõ`0«À.Ðp¹º½I>%]xnâ%bJ»/Ý8 Ò›C_45Qž7UZÔ†&»È—¯â鱪pK3÷W8H8?z×eÍZ±£¿Zo”8°´zÝîÒL¿„¡H8=v="^Äx¡ÝRNYt=£æz—Ëž«›ZÃ.îU‰Ø¹Ûmm©G˜ú”sìtN=»¦% kê=¡îmQßãùV› rU(V!Ý@1aÜ rpž¡S5-÷X2®ÓJw@§’‘ó°/²5gO²²ÐtðŽpS»Pë¬GÒ°YÔp–0QΫ5\¼ÝO£Ü|Z '­:Tš>Þ­ØñbÃ6_ð>û¦ë‘.Z® Ü÷§Ìóæ§MË"ÓnõX¦[WJ«C©Ý¬©hæŒëB†®'Ëö´†CH ½èñ+$%­ñz ¹£Ñ¾¡/œÜšfýUBÄ®HB»ø¶Ù>&ßsýÈ·Óð‚¼d (KkÚ¼+`GêlõtÔp_FÊUqDš`èÅKîé›.^¢ŒÜ(j—h‹\ ‹ƒB 2ø®è÷͑׶â„0± ¡QLuþrNŒ¹âæXæÔܧØþˆ7Îs‰ú¥Ÿ:vDz\ÞŒ ºÔ¸Y­yIR|P °„ â3QyO6,'ý‹Ð N›o^_Z43Ðñ“{bLææ4x(á ¶Tøç©^Kßé0 ×RÀY…Ó>eŸ„ç¹£ ‚}’A²`Ÿ’ðÌ>É0œØ§/ÍaϼÕJuèY%Ã`j£qb£ßg…Û8ç;ç¡¢U¥ºùÈwÍo~œšn ]$BØ& €ÄÔív_ßÝ`î ‚ö£í YÂ¹Öæ(9Mû3¡ÞϾi$e±¤®gò^œñžØYrÍçÀÄãd¯2ö~ ¨{¬Ù¾Â!º¨;V]Š×d4F:Qæ­¤4¤Òé÷šêá:b¾èÜ§Ý ÖdUH?û¯–:˜TDÒ=j–:Ѭq×çÞ¤ú«ÕiÜü‚Þí ÕI"7öü™êDSÕ‰H’Œ´‹õñÔG˜­qgƒ"g*#f*#”se$;d‘‰Z©éº‚¥›­ L,%àY<7𓹌0 ~â±ÇŽÑcûÉ'~±F¡ <Ë©gkŽC°‘­j‘×p)×M¯-NÚ[Ȯڠ çe²ßÁF­ÝªÙvM©íB)cý|V¥ÉÅâr‚¸‘/)„‰S|°Omºë dš;C‰òCuJXã‘ÏLé/&X-Ïy·†ÐÖènf÷€k hb:­«Ž@ä'~ɶij¤[ˆ0£>¦É+€+C×RçîXgxÄôÌ'ì¦ÀçôBæ¼EUÜâE>\7dH‰{Ø;msRîLc»â8=Ð\áÏ‚rŸ;=™DçA9j޹Š1(G¼4gçËdˆÊwT_ÄšEå¾s 3HÒaÒU]ôEÊ’äœ8DyæåªÇ‚+2«!ˆ†\æ$ÇèÒº!ôlÍžÐqâ~°‹’Dn5\ߣ©ò|ÇDàDr^ì퀤ð'À=VEmæPGG7ÐQë>‚L^aÞŠò CPÚöEVRÎÜ©ür`z·×Ôùþl”ö:+9]YÞ¢O3=½.õaO›C3ˆi‹¯ ±A¦'ÁjæEŠã NÙõm±=²/õUÄG…¹®=Ã7— ñ´®3=§Ú2áÊzÝ 0é„òUÃÞðØ¥÷ìT FüŸÉ…®nК¸4ôŠ,K•ö„ÒìØíîí¤AmÐÓv4šÿ)þÚüû¹µð”+gÁ«Nuî¿â4ç,¹^^oH®C1&×á,¹Nfj ¶½0nl¼|içÁ c—Q!øÚk¦ Æ‚Ž\O…'q¦Í¨B¬sÒS£ÍÀÞ©ÍÀÁ›“XP>Ûfàádà|KqXT†­+ø.  ›@ro"=õÙD”@˜F—d<0¶¬ ˨éUxË—0H¥£ÌÛ«fVÊÄ”Cà*‚ øÔ¬êW Úÿ„ƒÃìëÌÁÞ‰ƒã‰ŒÎCÓÀ‹G'‡«Ù´.’ãí°Cz‚øÓhÜ×y&BK ŸÖ½…3™þmW…Ǹ¾ºÅ…Ñ1E¿*0aÂæÛºø´Ù¦&GÂv÷Øõº"8×]q_ÛKÁDSÀkm.›û‚AcÔ±å=§dc}ƒÑOJ½$ÎD zÀͺ÷x9 ǺBξÐáa¯)`—ŽÑ þˆÉ5‡µ Pé å4ÜAÁ¿IËZ‚Ò,kŽ³Ù»¶©x¬æ¸—Àô±¡- …нΰJÈßÿœ7âïÐÏq'Rø µ2ódNDçîDª± Y…3w‚)õÄ@˜v}–aÃ乚˜Øq¢&KÎc¦&xû$&&Ïß’‡¢fÇž2Cf£1ß=²)ª`’¬0'ëWýlA9æ"¦wR’£u(¬£òÀÜô²¥¾êçQÍ¢ø¨T|^Œ¶÷wÊi¡•Ì_)=—!±Z@ª}&CbšZDcj¸KVký³è$<'\f&NØ1§Ä ½x.N7呹ÂõÂJ–rl€²eÝieSHSqeNÎ’ê¹Ofé…Û£s…ðÏ=÷‰Ô¨…ÑyAV™ô´åÊõ¢hjyb¹”¨…R¾œúk%F†Å°xQ=_““OÔÄ!úÔ]ƒ|ÝÚêŒyXf´¤/‡ #31Ƚ§–Ý€e™Ç¤€–8þâó÷_`Êb§M-ó©×¿4)œðU øŠœ˜&)Arž¤(ynëÚdÄKÖŒ;ag‚Y 33„æ›ÔÄ8°{ÇkeØF±Ûh v\þçÛ›!uΓzìˆ]¸ýY¶ ±"!`“%Ÿ<ä6°€Rùß–À¬íM)Ûlæ4Ïkêò3Y~ÕÙÚw ºé ŸMFÈ<1Î â–ÿZ®˜±Ay™}ƒæè'îz]ÈσèÄ—b¶=¿#Å]ë©^@a"#FRߢíͱ7J¯Ñ”žÉD‚9khô«¸ÛWSMºH)'„´úPr예ÉKëÒ™†²,Åð¬Ûh–…/>@DjòtŠç ¥sµ£ñÉ¥Q@i8)æ.}þCÆôžÝ>}ìB÷šû!ÓÝ1áïhUôÁ<ã#°kʲ"Ýxx*@øÂ?\^S«ähÂ$Æä(F4˜³óë™ì‘¡…/þTâ‘ÀÇ´,ÐŽêŧµ!E¡ßm€v£¬¨Ø&†*J¦f´Øò¯xpbdpêÙSW¢è†/ß^]rŸí ¼]§:•¦·Ì"ÙŠº ^``ªÐY.G>×+„‹U…\®áßjó÷¬õŒú+÷lÑÏð4i–éC¿9Ö?× þXä¡ÞüžÃ8_³—n±ÔÂe_-xÁèàq8>€ù$¶Á‰òàÈ`»_ÒÛõôYû‘P¦^…óKè¬S€Ö)kjÉM˜_>Í Þü´ÍüZnR·V¦¦^LaYÚ*_N#ÃÚ¼Àþ0( SÀÀ®!¶&…è¨woŸK ÊÄ\™6G>·ñE$4D@Qƒ‚òOðÎ~¯øÝÝÅÿ4ܤº endstream endobj 2111 0 obj << /Length 3505 /Filter /FlateDecode >> stream xÚ½ْܶñ}¿bÊ/áVih‚/¿)’­ÈåJÅÒºò û;ƒ™aÄ!W<´ÚäçÓxÌp/9QmíF£oâÓJùÁðßìgÍwoVÕ*€¿X?Ì¢U’?‹³,[5vµ[ýz¬ö0üæâ¯Wßÿ¤Õ*ƒá0^]íVQìÇ™^%QèGq¶ºÚ®>x¯‹ëëÒ6—kjð/×ÊSð…*ò~kmó—÷¦/¶ör± ½8¸üãê狯.>](¢G èMê'Z¯6Ç‹«-Œý¼ |“¥«[‚<®àÝúá½\½¿8!9]©ÀÏ‚L!É©êãUj?˜âŸ.ÃÔûõõߪ8õê›®¨«–Ý!ïømSWÖåEÅÕ¥òò#nÎp2ÎË/}õ±ªqÞ­Ìêj‡X €ŸÀ6À¨È¤Þ˲äÔ»e¨Ï—QäåeoÛÙ‰pû÷ û/»éàM½@VÂþ×Jû‘‘s#Б&ÈÖVˆ7 ½èhx Ê–;wM}ä¾üŒè,‹VVfâ…#Þ|³±7#ɉ]wsÜÚÛ”…eF2’ÒØRO/áIO¸Œga¯„U0^÷pPìçæä ¶RÉ^Zl'žÝ¿ʸnë#3Bô0A¼šq›3âHÔ¡çPÀ$ÚI'lÛÛÊ6ygOt·ŽŒºâ]ŠvºI‘Ú|»mlK»Ì“¥Á¸xG츔°4ö^êbC’c ÉnžáGc?õí·Û•"/y°íš¢ÚóûMÞöŽ^9@,²´²íÒ ÔéÃ@œ1‘÷ÞZî~ÂLŠˆf!CÅÿ Ú¯ióÝ›‹Õšaü˜Eù©ÛÈÖ`ÜŸ’)›?L4Äìø[²!Ñ~D³ö\:ĉ½!Œâ@ÿ¿ !.Qг ¡[õ±, 2‘Ÿ©™÷O…É êû¼lè-ä?Oü³v @ ÜòÀàö`¨£VBO àŒX0ÆéÖ`àƒý²fÿÕ9\Cüµ¸àbÀå–7:R;¤&ž˜rØ×ÜAÌz{IžtË3‘4|æü˜þ®´$ßÎpb¬Ü` ¼ö‡PóöŸcé"Zž;Q]7sag£ §K-†/Ì%hòD|«wü”–‚æ Ô‚v|Gíaép?惸Užü@U22ÍÅ ØjSÖî/lkˆŽš¢3cê†û¶uϼêëα°›ŽnC?'„Ž–ChÊyžˆÆx‘¯ý08Áô'âoª%ä»®y(oâp‰ŽÄ‘#'Ù<C1êeÊz)Q{bq Áâ€ìˆómÅÏ×}^®ßwùA>rß/¦ta ¹ªí†p¼n>¶²Æ4F°!ÐÅÙ¤Pù8¬(ÎE0ÐYÔî}&Šq ÞüíLf^¿_óúgöUeKLùÂÌ{Å«&”Ãà^n"qX{¸J¡¼úÚÕ;ÀôUl…ø<`0gÓÈ!9´_þtõŽA)‡çÎÆk¦(Џ"zI?ä ˜¿ Špu =ŠâQ¢ˆmXâqÎp'9íú²¼ãžOpD“Ô>ž¤öÑtÇl àÉUÈÆÎ‘*¼‡×7µùÐ,ª¥ }x’y¡9ÕŸ?þ¤U¶Ø.uˆ> ~ë¦}H2À6ª“QÑybébb§™÷ãkŠ£È<¦žˆggóE™h×ðåpß_ö$úéDòIö÷ëšÁªš @븧â9§û0e—šD_•Sß)fÏÑÀÕ(Q·$èIæ'Y4ôÐ,ûžû²¾ÎKŒQLræ0€¼lí.ïËN†ªºrú‘¨Dl‰ Ù~àª977M¿)HU oR’Á1Ž÷p •u7RšÁ"|΄„M R\lÞ7‘IuSü›´ê{l‰Ž1ò%\$=,¹«| ]xæY”œ×¬qüó%šd®YG˜‹N~A%42k­wÈ«é„S†Wôb Qêg™q[[æwaîðí!L‡¦@“š[•Æ‚IÚèŠ1£Z@b8€±áòPù¡•­|5yŒÎ¹’¦vI j7÷5¤v ªV»íƒî%U¾23­S±¸‘©Ö)5Ñ:½ u0jži‚(ûxà —sM™vªJ˜óÊl ±cb q@Ò@=Tœ¥ŽFOûiÎ…äH ØuaQ4é):ˆƒŒ¡z6„á@yttLh€¡Û¢,¹oÐþbww.ÛçnyàÊ ab´¥NÁ%ñ;P;Ym!ná¯2ä¸`GÒäî@~“wÇ_õnÑŽ(Š->Ë—ÈZò.gùÀ”ž–o£ ëÿò$#“¸&$¨ÐÁ,¦ž€Rø† Åðau÷ÍÙ Å\×2ƒGÃwí-YF„á'-ÚpÏ´†Míb‹™…‰2°•Dˆ¡bv :Kâ…uîQ:x˜¤ äûÐ0Í‘‘Œd,fC¾hdãÈRõçmlâ'£‰-ö¶íÖ7eÎñîi<‘úI˜<Ûá˜oÖÇm´d]#xM¿ a{ÈÕÆLù±Ž¿cÈ‘ú Nhÿ&ÎÝK´Œ<Š¿yìÇq|Å "O@ÊKîq^ ˜¼ìô'=Šþ÷¢‚šžGu9ÃæîÁR@J7&¥€l!wÁpjp,:8©Ë@<: ΄s(z?Xdu᪓¨ ›L¿düÐo+œšk-ós—ðàÈIx×öòÕ—>uIhðªo±W¥|?ë8±A@î˜]'àObüRoJ{;c·‹6$4‘¯Çë>#ƒUŠžkÈæê øuޏ˜¾Ñj˜h3•ÄÅ°ëØ°üàER ýYl0R'áßÒæÁ¦Ó0 —˜Ø…'p Óè_ObþAƨŸÁî^¦E&h‡HEEéL†–Эr¶@Ú‰Ó³r \ëB‚ ÒlFÉzy :ÿÛÕßDPãwˆóo¾‚È92 M m)úÂ^,5á3 ª´5yu"©…€ÅçÐ’yŠÄS|¡ì žxA&Œ#’RŒb¨êxà%åR›ïÉìÌÈRuìÞ6õÍDˆ±<ÿX d~0T•¤äNG &¯[oʼm«Ê¦ÉTsnŠ£Ô™b¤ƒ:©£àDŽ‘ƒñvNu$p— hr ¸ÞGhv ss¦.Ô†M1VN]È8¹o„å×P™™&1+ÖÚ(WY4ò z–®g¨Éõ 8ÏóãRZ×]ï‹ûØÐeµ„5Fòé8ä[ ŽŒ<öù£Ê«1Þ<ü%+˜Tt wßÔýLLx/<³^ü ƒ›g¥Åük¸ŒÄñ7ô9õnúr›TKþâ1 ·J Tô£ÑÜïÆL¢Æ’CµTçœÂ‚áyÆ¡ÁoÀ>Á ñ{k÷ÝóñÆÓãmy|8jmÑh:§æDRiœÎ’˜†R7€Þçç`‚ñÏËÐÍex©Çr|ó¹°·²-¾h÷ëE~諳;I»OP ©’AQidá"ýrƒÅU¾±ôìbúìBÅ=×ÁÀIñô:˜"O3M}] iÎKÇZIÞ«ç7í éîN Aö ±³‹Y¨Ã`9ûM'@ókWÔwñú_ËõùÒÕyqEG(ð úä޼/sùHé˜Å°°LÐÌï†mOopý/nªô¾+€OF‚/9ƒ¹§F¦—kdîùãÕűYç endstream endobj 2121 0 obj << /Length 2191 /Filter /FlateDecode >> stream xÚµXYoÜF~Ÿ_Á·pž›ÍÓ@²Ž-(X,°‘òää"93„yÈ<, ûç·.^3ÊHÙ@0äé®î®.V}uõWK+gúk«é¯×Vm9ð/Оrcß cOÅAÇV›[{ë?Ç:ÀòõæŸw›«OF[1,»u··ü@±±BßU~[w™õÙþ¹¸¿/óv»3‘±áµÝi[þ«}û·.oèpѳ¯‡"Ë·;× ´kzûÇÝ/›w›¯Mò艽©Ð+­6Ÿÿp¬ Ö~±åÅ‘õH;+ Æ ä‡qiÝnf‘OE׎ŠX/ewŠ|ý¡Íw´÷$^}Š–ÇL bã øïvç…±ý»ã;]Ú<ÀÇDvþ~» M`§e‘×[ ô°¬A Q¤í»-h%ù‚ä¼ãÃMóà!i“*ïQw8íIÏ£N§Š7ž›¤¥ÙÐõa½pUæõ¡?2±nú¤/šZä¸éñ#­]¬?¶vÚ(ßu×·CÚÃ5 öÄmyÞ7üÛæ¼Ú¹lD)ÃIÊŒ©³”8Û7Â%#j=îšuòyƵosáz›§(vÇ6¼ò_ˆ0^N½ÞXŸé„§t´² Ð“:{=_¥ÝçØ,>¡OвS'hY£ 4¢ÜÐÀ/¸ˆXÃ_¶ð…ùÓ%˜¹žrß3ÌŒöÎaæß>”Í}R Ä<­ Æça8ÃJp¼@Nm´é mHýB–~âI 'ÇێżN==âÆ¦Í˜¸ñžÁ„ð‡þ}¯ ´Ó6OúœÇ ÿL"àä±@d/VOÄΘ:Jêº"©0ŠŒÊ’G÷Ì€'C7²`ƒÃàîöæšGEÍ¿?ÿû–¿ñåˆÜÉu7÷zÙ߬ʲÁËIÂ#Øx¥€{\B=c§ÈcØj»-‰âÙ÷m’’I`UL£5O‡Þœð´Îy0Û&3P`ϳ?” Ç<šr¥á+yH¦†Õ=ˆÄŸNŸÂ{'á§Û»¼*Ò¦ÄÈó—¥ËýÅp*ßõ–~â=޽0>:J좣xä(!Åb<ÉžƒÉS¼U\Æ)Ærè̪D½G¾OrD˜Îª °O®ð»ývAJÒå·Ëë´aô壯Ikd„o[?°“r¥fÏäþ˜O W€!0¸‘“… ¬‚ïMú¦4Âaò¡5–Ö8™¢ü_±½$ã¤<4-8yuÉü~¤|.Í:çæ÷uxb~ß÷NS1ždóÀ“ÑPñ,iC%ù‰)âz0¢O &,ýV'@.¼q ƒ(l˜A@&7Z¹Ç&ÐNw¶ Àä‰)d׈a!üÌöqOì‹#ŸLâsÞõ4[OH2ÇÄî¢YÇ,’Ñ:´b$’åþs`9ö‡)˜µxgh÷a–‡ºáïmÚþùè¸Âó Òc•¤»*óÿœí‡ì_ 1>¸Þbn>a\}aÜøbx’ †ƒ‚õž¨°Â"¸Q £rô<Î u„ŽþYÅãc’â¦#¯JÃ}Å¡Nú¡Íp¡ŠÃð onŽZ/2žJ Ð}ñ³©¨IÕ £ÏàfŒ=Hï‹*çQS S)aÆ[°æKJÞ¶TÌx[¸¬Oh‹Ð ™%jX}<“ bQÁ3èyúÞwè™p×wôªp¹š Â@ÛÔYGŽìØ7{^­Šó¨el÷ÉPö« Æ0¥° {ŒãÈ ° öwGÙœœe›%Cù‚DŒzV\–úù<× ží°#qrƒAàû†ÝéϽ(Rô\Ä|Da“§AÒTÌC‰Ûs˜–èùI×ñôëð*Û¯íø’•Ïi첸ÂQ~,`ü)ËŠ á\À"ó¶c~6 ü±|ƒQgàdŽÓ¹Óç$íälE—À!r_:‘pêD^ÙC„؈„g ÈÈÞN O¼RDο'ÕC™¿ÔZLJò•¤OQ¹Çd„K‰™e⛟G5o©°éŠÃÛEÁ„ùª”O!£'E}I./?x#¹„ù*üwýÔz—´('x3m1ó•¶~üñ…æ0ßHæ½fjœÿD_A5ýVâ0ó•Éšö’8àQ콑8Â|ì)Ü©oÔØ×YÓî0Ká$UùEÀkqZ¿™¼Â}¥¿—†Ò2¹(2T¦Þ›IÌÌ_¡aâø¢vµòÃèÍ´ËÜ_¡]öeͺ0þ{ª½ú䆖Ö*ö}W4ÊL¡òQ®6c¾6˜­)¿µ §¦÷=ƒ ±©1 †–Þ ™8f¤W¦ê±§q)¼JÞ¤9¦,ý!ÙA& MFŠ(Ý95]G3ªŽÂ±M@¦œó¿?¶ï¥äX7R–Áê½K <¡:cå]ÏM›Ëån‚‚c'í·|äê¥Jj4Ñ(ð;é{¹@«Ë&‘rªk†v|E¡;Vʲè*¹xm¾½—úË]ÇÛHysGòß½Æ0êù8·¡fÆ’â<ÊÆ°ôNK:3•tùûøÝ^SK­íÛ‚h¯ƒÄ ÕÌ`ÆqÓ}Î$|òÃ_4Þ1ê¦×B67m‚®N5õÁÜJµ{y£r»KÛâž[…Œi…È0…g¬D‹ØÿÊû„?Ú´¨GcIž6UÅUàó°€ï¨%¯ÞÏM¤ícBu°3I=byÏÏl°-31”Y)62 ¤mš÷GçõcΜßÄ0z,Úä_ˆ{e?Ò–:œH´ýÝ8I…‘†·C½èß¹W—Tå:‘ ã“,ˆ[Ђ سŒz¬ñ‰±m*^pÇyÿ^;Εv=y¥hÊQØÉKè´ƳåÝ¢”ׂɽäÕ ,¦WryN}¿ŠÎãïÇ»Íÿ˜ÏÜ  endstream endobj 2126 0 obj << /Length 1860 /Filter /FlateDecode >> stream xÚÍZÝÜ4¿¿"x%Öõ÷ǽ¥!A'ÊCn×w5›,I¶¥BüïŒ=Î^öî ´ô\Tõü™ÿ<{æ—ý­â”ÿ×'ÍŸžW]ÅàŸáŠ ¯+ëõÆ{_ ¡ºª~ã "ÏÍ6¬Ö‚.ˆ«_/¾;ûæâì·3žÖÃâ•£VÊj³;ûåWVma컊Qå]õ&ÍÜUP§°~¨·Õ‹³Û%3ê«êøŸvüôümBR§£²Ø= –T:›6佤Ï3Ðb)“î.&ùw˜þµ¶AÍA9ãwasIµòŽ]FT Ý3Ï—>Þ&AŸùlµÖBð×a ›¾»JÎð1?äXÆ ¾[4cÔñ º¹ª7‡é†•Aì$L–Clœ¥ÂXDüGŒÆS£K`4ð3…¤–;ĸiëq,ƒJÎTAœ†Q>ó…l©àfѺFk©ä‚b÷}ßâû)cç眱õ\+t@ ;o šXJÊ,Gü–ÁÈ5UÚ<’¸§‹¼ƇW.(ƒ÷á‘C…¨F š*ÌZïDn÷7C;N¹“¸šÂí‘׌|ó{½Û·#5qïçä¢Ù…þ0¥óíÉ3·”Ç õÒTð‚PíÊ{÷ùJ8’¢A.ÉxÓÚ-Ö/!ð³$`nü—Œ«ëÃòðÔÇRmha³ AÆ=<"7M|b“gú²Ž×+mHݸåM@›¶ ]”8š*iÉÅM“'‡#h\m\ü›<–[G©°ÕzF½ïõnœ†Ãf‚™ÖÏêÉí´(‡Ð…7X}É4»ày8"ŽÜ¬·Û!Œc; Xi:,9Ãr×$‡)DP`Tòmž±©ÇdDFú«ØãÈ~è!@ß_@ÓsR¯²pØ¢«ãÑpÉÔàC ¡ž¾1A¸Ž¥\*ÇHàà¨S‚ê gÕm›·4jÂÙû!\…äqFÛ\…ø<Ž uwp ±ëjèwØ#–i-v±–¸ßqªÀ&xà0æ¥Ô]Ö“}¦Ù.ÁÎæ¼]„„u&O5ÇZ´hŒ‚±#Yxpd[G|oW ES‚<ýáË÷Ê}=Ô»0ÍÍYWÝŽY$˜.Î yÓ6 “äû“åõû‡-ï»S ‡1½W‹ÅíêW¸í ¾uÙø¸TG_•2 +]ß­³wΓÚzJj`´ßÇEŒØX<Þw1äÓ“Ëd—X$»Ðÿp+ˆå!ã|ìÃXy¸<¬øßämÊ ê¤*w{*g¨óþ“æm "|átAÐáKýéÒ6¥5µÒ¬=uŒ— õád„HÄ–‹u„úBçX?޿Ѥ†²¨xÈÿB+µlF+­/…b|æJ¢…ŸëÖÎAÅúö*ใ|N38ãTK_p ˜¦†åHüuŒnîàÐ×ΨB÷0õñKÙÙ²–ce¤UT)^§uT3Sò¨Ï@”ce¤QÔkóNZæ‰+äà ֣DAãjN³%ùˆÆ©õ>}Ô(X F…*H…J¡¨d9 Æd]rÛk ‡O\THUÆx,–ºàF@—5÷÷áôª±¢Ð%#¼¤\ ”…·Tð@& ç©Õî±óרÆk÷8d¢ÐŽ:» åCd¢Ìdâ÷Í®™šî¿×»þЭ¤H<ÌJlUì?2`ÿÀ9æ›þËn汤žù¼óH•¸S:Ftd¬öH,öÄ=øæ²'\0ìÀ"U¿"s˜jHMaˆÙa¢f<ù6Kãð›'·ê`‘XAÌ&^16;$‹ÞI.žÐ‰š#Ÿe9Õ‰Rú®B½©sŸÆbÉ'ÆfdÀbå¸PǵAåz¨—ª–bÃ,–=(w^ÉÔOuwÃ;òlVEÖ,‰hƇ¸§ûô®½Ýyw¾}‹µd(O(R˜›CååIãØ\w‰4Ó–‘`Œ­²p˜•ä¨ìÂA²8ä«­!c˜°Ù\8à¢`ãg*zv¡îr5Qž÷iÔ´ ”Ÿð€±ý,ïxêÙ½óh“8 g$bî¾0FÞ4Ó Ž,ááÌYJ‹>?Ù¶Fã E¾Î=NˆÕ6ळgF0v·Œ“6zòóóÿpFrH!Œ}Fr¿Òÿo(>³¿ÙsÈ(¸´Ÿ”âãbhQ4¤Ú¹OÇñAØB½-ÈärÈ-˜,ú9ŸCn¡DÁðܘ¿ËE£®wõïë6¤bѼºq¹‡È¨à‡|È8¨W|4L÷ —A‰i]Éæù õ×Ío³-‚Ù jmA¶Óê”(ÍtYO…(ˆ2þtÍË¢¿>ÒÔX_ðÇG*µ°ãÝWV”9­´€û¿ìø;¶9}»Gîq•¡ßIFaùÎÊ endstream endobj 2166 0 obj << /Length 1908 /Filter /FlateDecode >> stream xÚÍšKsÛ6€ïþœé¡ÔL„oÒ·vÒ¦é¡Ô9tÚh²PS¤BRv2þ÷îb!Y²Ýi“Tp'ïÅ.b?®ÞfœûÿÃÕQöõË¬Ë øg¸b¢Ò™­«LUUÙà²eöãY‘]Aõ˳//Ξ-yVAµ0ÙÅ2Ó†™JfV ¦M•]4Ù/ù yÙºa6—¥ÌA›ÍyÎá\çoF7|>b¥Ê_n}ãfsQ.r#g¿]|{öÕÅÙÛ3æÃ÷ë’Y)³Åúì—ߊ¬ºo³‚©ªÌnCËuió‡t›ýtv7å‚UY¶ÿš¼~ù-΋WÌ–ç…å»9pÉ´"ã}ÔLÈÌ"ãP^Tíl,+ ‘Y!È fþ3˜ë¿ÔïQÓ† i¨¸·iÁdÁ?LÇÇg.X s¼7sÉdi?~∑¬Påý½)ÿÍÞ¼w¬ÃXÁ™B3É"®‹ü«wõzÓ::Dê|6לço:¿¨Ç‰ŽÝ¢_¯gRä[,œ|ß¡!Ÿ]Êà†U°²pü˜®IùÆ .œNeóuGÓæÿµàÊ5T¸Üï·¡‰ÉMN¸‚™¼êÆÉÕ UõKê0n`”2w‹ƒaLÞúµŸÆgu¶û™CM˜9ˆ½›y(Wý¶/iÄ8þv3Gå²ùNÜ›ñŒì~˜‚ÜÒäuÐÍ 73…çUîe@}ëA—ŽÒ}|Š¢(ÎϹ*Ö4ƒGÐÞ:ÿ®Ÿµ›VõD©Æ-ëm;QsR«öË´ûø'ß¶1¹S® µTõ@/´½RùÏ3Xõ~ ݤDIe¾ B¤ÊW5fwÚbý´ ² îÎôP|7Ì´¬å{j¶è;\½«í0ãd²†ZÓÀsoNz·Cßa~rò^ÀùøsŒ·’1§>Ɔ[x[|Ø1>åÕb Î8çéÞ»°…·ñÜ|¯¡ÃªºÁê/“\6º´àF$TZWœO•nû«yën\KÊÛ4*[Å .ªlKVXK*{<œ¤®›VE xnF&ÔØ(¦EIÿ‘FGw(•Ì1ÔŠl¼ö/u\׃K+‰æÞÌ&¡K¬¥eJDÍm ÷W=Áõ/yJ=ÑõO»‰Ñõ7)\k™„»N£ë/£ë¿éûöhÏã³HóšR•`–Ût ¬*0)R²ã¦L÷*V¥š”ŸwÊj0?µWˆbª±RàpɺÓÑŽt÷ºÞøfŽpä§b¹èÄ]/_™òÀ}D¥ŒÍuGµ{œ¢Ò¶EXŠ·[¿@'þ|ãã9„$Àæ5eo±u ÷T0õô²Naƽ £®êî* Ý5ë»v×[„áú‡p·£ 5ÀJ}åÀ”´ù+Ä0U`xÂô‘Ar;ºå¶Õˆ,¼È;7!‘á:vºõÓŠêW®Æú›÷”mûºÙ ê¨-\²q|¿Œ%­wÄ=”oz²m¼ëc9pÝ&À5˜…J†Û>{ ùjè¼ _Քȧ!® eƒÆð5ÃM•ÿ0¸%°|·pÇMF7Å!zz®ëwžxqM‘-ÇÑ_¶±óÍL«¶Ûú¶È…ÖT±ªã°5>øì×mÞÕï®ÎqV`§i'ôzFvyDÓC#ŠŠ6>Çk¿¡í3ë7«°¢²ù²bÙ±XT7‘P'?ƢݢÜrèהЖB÷`[…/(‹N‡Í¯qÏbÁàÞnÝ8í¤–ÆÍùño9‰p Ä©ßrî_!ÿ7è+ª„€ tù¤è+‘”J¨´æàvTOˆ¾Q¡Ò UFT0OG¾™A%ü–.*ž’$2CeÒyÍ™ÁD‡#×ö½KƒƒiA%¤02ðgô7—} &¸Ÿ“hüP• µF~025ì £™yJ:¡ž¦øT)O®Ð‚ñt¬/@,7úoXÿ9ç"Ö²„«Ÿ'\Y%@BÒ®D'üª.DÅ c>ò…àaª'öQLÉåi0ŸWP´Ûèˆùæ1Ì7ó¿X,b<c¸†p§Ç¿‹Þ~Ѭ}çÇ 0¿bˆ6`~”ºÖ-&O4ƒÌ‚…@û3Œ@˜Ú Õ>ö9âY¨$h´š±€"‰ ‘TŽ‘F›©šü×B·+ñ9FT!Çc°øûn7B ätí‚‹±ï XëÙßãÿد±«=œæ b ’—³cC÷nÓú…Ÿ‚ú6ðâ¥ošèµôBZÕÃRÏċʣ^—mM~¨›¶:ÿé(æ½ /Þ¼z"Þ%¥©tÀ¯ ãñǽÒú¦‹€Ów!Zƒ´ˆ»l%#BÁíªo݃h®ŠbbÅ[Œhë-}s?ž¬Ã¨•Ýv‘h@L¶îü7÷_ }êÃÍ%<ùÿ‡n9B€M!@ñ'¥[X …M¨4bÁ}ž‚õlÂ/ëˆJ¤tÁ÷"¡ï®•ÜõGÏß&ôüÑñWIôûe øýÕñÏLš­o(…?Ãg¸Ï01¸ßÁiq±:ÜóYåžšý¹A+ endstream endobj 2097 0 obj << /Type /ObjStm /N 100 /First 985 /Length 1945 /Filter /FlateDecode >> stream xÚ½Z]o\·}ß_ÁÇö¡\狌I ·Z °ýÖðƒ#o ¡©¶d í¯ïî^Ų-ÝêEžåÎåœ;œ3\×Ò%•T‹Sª*!xâ¦!´¤•CèÉ,tZI­ÄWR—BMßCâD•,$IÄÊHšHúxÒYm!y"·±IKÔKh±@ eûu|ä2$l*Ïv(Kü!‚žzØè€á»t¨tRO\4ôJILø‰3Çö¥&×8±ÑГÄ~xBñú±KRØ7°V“Þ'©ÕBH>Ö4 ÓXÃØ0$O"%Öð "kµ$Q‘X÷6ö+-I«5l@êvkM_pÅpœRǹ0¾ªáx¢ ¾„º&åá”êI¥Sx@9ÌWèi#À»« èLôØÏtfH:ÃjÐ;·[iëðL]‹ c=ℸ%+\Â¥ ÏBÅâ…!$‹·n«q¢$ IÇš@ç#šŒ‡wÄ µ±æÉ„ÇlˆwØØ€°¦°¡zÀhFc 6LqüÀ#¸Âæ>‹æÃS cÇŒµ6Ö`¬× cÝÇZO^(¼Œø÷báy8Éã!UHÃ?Æz¼8yå…wÄ^Hž\»4HÇ Ü®Ø%^Ùulâ0¡섳q“±ÖÆL`¿ð„ûXƒ‰VÇšA²±chóâÅfûö?ÿÞ¥íwþ±Ûl¿Ý_\ï.®¯"=ÿz³}½»Úº<Û]Rk¬ýu÷ñüÃ7ûŸÓ»’Æb·ú~ƒM.ñ4Cñë‹‹=v{w(X:”Ž£Ð¡…VaQFé8 ¼²º¶ËÎmÙ¹-;÷eç~Øùý櫯>{ûs³}óé‡ëñù/çÿÜl¿Ù_~Ü]Žw,ï·Úþyû->`ƒ÷á–³ëô¦ÍZ6„Eç,ŠîÙ¾N/^¤í›´ýãþí>m_¦ß_ïòågŒóû}‚ýU °—Ü:Æ5G`°·Ì„XÊFýA$8¨²ўÿ°š \!N¹÷Èâ–‹?DPÖ‚†‘=Šõ,(AxÍlQŠà€üu$/?üxý‡ëóíþ»¿Ø­)3ꌪæõ¸z®è!j’;=£g”G¢Ì™QTð/J¹ÔÌýDÔVãc…JF§E7«ÙшPùrP‰BÙõa0êåŠGƒ#PtGQˆ\#hQFÅ4[Fp³][p$ÑçÑ­¸jF{|F `e﹣ˡ™"XA}Z˽@R´b´Öž $ƒá’Ö}„©çOF¿y. ÒJ&´".ž èeŽFB—›ögDn•k°„©£³3'z}B?•Á«"ÕÍ`2`çš ‡ºäà»øæaŸ}=$hÂXð >Ÿk{8>Ä‹<7¾@±`ŒHÈ[× 8¡ÿȽ@®>ýp…gÏ÷Yò-:ðEé0o½NÛïÿöwt ‚ v-7°÷‹O?ýtC_^°½_q0Î%Ú¾7µz”¨Ùþà¡íw—û³7;€ç{ù*mßî~¾þ’}I‰èŒ™å7“Á¾Ðº¾0µ~dj1ŒZ„º¼²ºö4Zwû<Á¼Ñ•ü†ÛUp« GP«>ò@Ÿˆü΢ø•hÀ‚>a1°Š"ûi,ºŒÚYÀ»,Ì=3†£SX~ƒ]DýŠÎ©#Éã:MŽ$ÞÚ&ÒšÚŠPì@ù(Ý©8åvVSý²‰ÅýÛT»«lCÙªb€ì'”çn˜Ã1S5´Š9ezUžTŸˆ[¢)emžãé ]èi-»ÞÓ²i²eSå/[v\f[í±eDzbÏ}Å$èàØ„…¼ÃUŽêÕœŸ7!Ä1a°Þ€‰†×§À<”OuO­6.YâÂPbˆvƒA ”öÈR:¢·>&=ëÝô” ̇SºÁ¨ê½©|2¡©ôGç€;ùÿ-¡ìnBUy\BÝzq}ŒûõŽ—œ1Ù'•Q#›æ”㺠µlNձѤ²¡:V›|AsÎH¸IeÈn“Þ0 =©ËÑiNY1ˆ²LºY@Ydrg¸9~ßšÛ3Bë“θ™g!£ú´2é —«NºY0by™U¦žéÞö}ŸrAr™SæR¦“Þˆ«v-“Èq׫³ÊJYÊdž0ƒùèdhp̳Uƒ ÌgrµžËlј•&Ï„T(“Ê8“øÙqN9.Û¤çgRxÒs€eV·‚:ÊdRQ\œ÷É7Ì endstream endobj 2205 0 obj << /Length 1897 /Filter /FlateDecode >> stream xÚÕZmoÛ6þž_!`(¢ 3Ãã;ìÆµY ìú ûШlS±[Ùr%¹Y1ì¿ïø"ÇIŒbmmÐ:Qä=¼;2ï t÷¿»¼ñøâ¼X¬,´Ä*kmѹ¢.~;¢Å%¾>?úéâèô)‡Ââk¦Š‹ºŠ(Ë -‘Êóâeùór:m\w2ᆗ89™@ øK2å½ëŽ{ÿR”çÛåÜLUÀJ%N^_°ë^¢9/f«£—¯i1ÇwÏ J„5ÅUh¹*°NP¬7ÅïG×*Sb‹b÷ ‘ß¼8ÿŒ–wõK´‘^//uN¤ˆä}‘&‘fVÊ©ϳքšq‚ãš;÷Ö͆ɬYºõ€„J&Ë7o(þÆQZÍ]UUÇÇÖ¯ÉÃÁ)¢Š0®2R"N!rhéÙ«'©B#§§±\lj å:–ûàºÞҶ›»îûXŸn‡ñ›X^µÝ»ždáPYF”Ñ8- GT×n$qdëí¶OØ«X Ýrö.Úà&JJY¡ 'ŒòÈÀ?y0*I¤±0î´DɼÑ!Pž#–@Eĸ¬«YZÛnX@ÄÜ CÊX Ë•Éü"ø@@ÆÅÉ,–*bœ5UßçÁ @¸eq‚$Bêœs)­&Fð|þZQ@QÂXÍfn3LÚuó1.ÓÚ™à·é·u}V;1=ƒj:ËÃ…ñqoF.¤1„K¹Ø´mIˆÁKí(ŒÕºÎÀ¦D ‘Ïâ¥ÄP›Ó%I© X™o‡– SŸñ°âôÓ;1'cÅ/ÖûÀ0§FßN²øI²n凸`Œˆ1Ì’„ù HZ>ù«ZmóA}†  üuÛ Ë$åqãwaë?}jn„±ŠXÌ9pµi“ïÿ±íöri%ö8,–½¯a<ßGɺ¢`Ö®VíÃ~f…t½¬vW±Õ³Ôôá¢:a¦üà¹(éÜû­ë7mûífãk˜G¤®ëÀ‡X_ùwxÂÀ Oø¸]Ga»vQ€ Óåà:ßI5ó¹³ ±w1áz“•·rmfY‰:G5Ã3W­ã‹):hï¥íúq¹í|=´±Üönìh„ eW5Q˜ÔÆl^p(ÿ\¸õ(ÇÔ7âsÕ¿ëc­n“"£Õ|Þ¹¾GÎ9¥ 2ŠÛ:é±U¼žq´«IZ¢1´óG>O Œ»åú2>ÏÀVœG²°&Ò‚FîùC¬½¢’`Ò*¤AìÉGH—`¨©¾Ÿá]!ßò0‘æò&?øÓ”’>B\@îâ Š©‡ñN±ù¼ï!Ϲ•8Ë‘sk1H9èw1éòÎ}FEyR-nüÒáAI”HÉfÓ^NЉ¹”qê<•!”‹Œ5FÖ^C^µótØ/|”ž5æSâë_=ìŠ4¤ùfJÈCG¶éþ&ÏQ†ò¸Ïæ­pûºàè=…LNç"Vt>4\f¸ÎÐïŽQ»>ëÊ£ffÌ7µ ™ÁH1ËíIš"ŸA™ñö$Àù ÓÝrŽãWF@*O&Å~Ò:.Á> stream xÚÕÛnÛÈõÝ_Al–â çÂÒoÛf“fQlÛÄE’} $J"B‘ IÙ1Šþ{ÏeF¦.ΦECÀâ™9g.ç~Î ý9’"9üïÖGÃwo¢&JàŸ•F¨<\nDnó<º2ZE¿J¢5 ß\ýñöêåk-£ÐÊF·«(µÂæ:r©©Í£Ûeô!~UÍçuÙÍ®u¦c8@Ì®e,áWªdÿ£/»{DšøÍ¾Z–³k•X©b›Î~»ýåêçÛ«ÏW’葇íM&œÖÑb{õá·$Zî—(&Ï¢{š¹ /€~è×Ñû«s’e"ò$—cš•YÊ$§ú@¡L“øç/ÅvW—Lav3»N¥Œß•u1Ó*~`®úýn=·Ý€T¿|OVäÚFÀ˜HsÄí Öµ³k“¨x]ØÑñ¶íJîUͪíf2Þ¢°ŠzUÛôŒ+æ £,n÷/ïå.Úæc"Ízß,zP•Ä}éwîË‚I¸ ¨›ÿ;´‚ñðÝ›«èíFÀ“½xP¡MUüšx¨ëväÜWÍ:œÐÝ!uŽã‚p³è:ÈDj‘o)壨aõ—]]TMÏ£ Ÿƒ<Zî{?—%Å=R–äñí¦ì<®ò;ô(Év{X±m‡ÓÕ<¼¯†MèÕ5ŸØ—ÍÒ“Õ,Š]¿¯‹¡ôe1Ü#ëÈerÂß°»WˆjpÖPv«bQ Ô߈sD0Îyž„äghmxJ³¼°Ýuå¡íŽÄMKúrï‘Åi¢FÝÍÒ4.ê} ã/åð£'¡þ%²åPôt4J„¨««’Oõs÷=À®‡ «À hòÚ€]—Ë®ìûÒÏ+XØŽ½`ËVØ‘éãøÕ¯ïý^›c°ñOuß\:ÿ…éã'Œ'ÆOtNê,Ú(gu´Íò Œ×&hD|BЪ±Oø0ñ+Y©1ÄX ¿ðÿzØ´ûõ†álTØ;²êy ZÆŒ‡ãР +üÞ~þ©«Ò,„Ô%ƧâeÕ1tàì‚×®ºvëwÙÆ“Î^·$´;’‚àJ¶šyj°ãý%;c AìœØkÚ;lÏ1ÕÒÁ dÛYüöpyžÁ1¸Sùщ1æ@^ýàW·çG0¤+?ïËÞ³ý¤ ‘há¡aï‘ _WÍ'îABôZC-„U>Dêœ<¡—æáG©ÍátyS6ò”‡³'ѨÆKÀ(ý*òZ< Mg3£4ä)=ä&œï2Ëž:Ls ¬ C…Q&Þ „"A è°Nšø-#·ÁSp †ˆ¡Ú–~!iáMã`d´óÚÃÈv¡ÝÝò7,(³*3ÊhÑÆÆ½'àqóÞŸѶk™â oA^…+ÚKLâ6º»f…·ûŽœKÉL#ßC8Á÷ ™r4Ñ»¢N¢I?ïÉhò~t¶²yð!è ݃ï´ÜŽÈÁaÕ,Ú-ex‘]P Ãæ{ tÉ‘¡ßZ ·kWaÛ³ÄÐ㌤ã·4;ó!g¬ŠªFý©L1ËOÇ2c0¯¢ÁT†“y †µáDÁAg\Ôy¹J,c¿”Ü1µ”¦BÎX/y"§+y¢Z@ln"9І‰EÀ?ª ^‚ˆ¡|'CÐGÈ(zr¹úê¾–r‘KÒÔ†¸¯¨Ú2†‹(to `Ÿ@š:wÞÊ^,·eÝV(Ìï#À¨Î¡ZÑl}œ¨SNÔ.$êU ò«)@Qäœ7¥ß„ÄøªfÖ>ÐT_ë,B¼À/*¤’j馶ޟµÅ”+5 c½“\Vb·l´!C¥Ÿ¸,Is•ç öû˜¤ ÕA8ð  ï+¦VKX J›‹«‚*¡G¡'Ž…p.*p¯+¶&O2 GËK D£XÔEßs÷˜p„ áå`®¹/j?õ¡)¶Õ‚]ѬýtSšûXŸáЗ"š‹kl×ãÒ—Ë €ÎC$§5~ÏWþÓßî,÷Ùa¬AÆÄ%ÎÞKàvl ‹`n€!sÇÊjß5׌â*¸¨_ðpN‰ñ–Œzr¡´‡(]¬±Zx"€þu…S±ìÛwtù€~5ø–hÈÈ"ÜÈ"Å1> ƒã‚1¾ž¥tÃCQTó˜C‹vÕîæË.Œ`@o÷{vuO!“|jƒ®é7ä{Gæñdôì¡ÒÄ8gà&ü˜ta°ƒ88¨–„–&Ç×@Ÿ×–äÚ+€<õ%;‚.{i»ÂЕd®´(MvNâÈŠ¼"ñ˜OzOÇ.ÚYœasaઠɼnוWÅ(*—ÀÍ…¿UäQtøE÷Š1n—Þ3ŒÉE’äøžððv¡Ü0èÍeô€ñû'„™çǤJÈÜ>›è¯=›|ói¿?óœ cO¹ö:ùŸÙæuá…Çè\¤Ê°ºÿéB¥d¤e'À6WߨÀo§è¢ª•@Ôt<«TäÎG¯ŠoOÈ7Ö’ûÿš†ó$ÚNÁºuàM*2R ƒÏ’áòõÀìRœ‚c‘Iõÿæø»ú¤Î¤PVO§%(…VkéåKVÑ-Õ¯§vÊKý0œ‚?³àŠ…{¨fyÀɃ{å4:¶à2;¡üœÎÈo·áÄÈ£eyWù½—Üâ>•A|ø!‚ôÇ“Ï÷ð uq¦FH;¥8ÓL(•‹sSÜ•GF¶®Ûy®¯ýª¾5Õ¿8Â"Û*™ƆkÃt•&\sxžD & ¦ ÔaÏÜ;¸å‘ðB¡†ýyY·ADX=³‡¨À×lj$¦€k'”˜–Bjé«RýA®U’È›å<»‘ðssóÒdÓY•îY¥1•ã7ÉlB¥%F$ZŸÚ9}…"CÍÍý! ã›lzWÕÃy` g1Š-€ša¥«Ì #óç¥t§Dfóé”®ޘͱÒÿR¦¼áö§ãe(¿xî‡Î/úþêLs¨²&”ŒÅËk¸vœYò\ÖÑ—ˆiø7)TIòy™³VPŠL©4m…ÊÜæ¬NÌyߌKÔñ_z8P-OK ­|^¯øKÑ÷׸q¹ /2 *áô‰ôÎMŸ¾»O"€$Régeò2—"u–û2O…Õù&¯/GðMùeò.]&5aÝ.3%’ü©ž|1Ê¥Z*k´•Z«•NðG&2³Y²Ê3M#k„qöyÙy å&Ô&Ü£ó\ùÔühº§?©ÐnŠjÜÁARFÒHaŒgw×¶õÅ ”¼>¬¦y–ø—†jÂˉ„+l–ûËÉ¿§á¨PnÂZ\J#´ñµxøË7z¹júk~å?1‚™$/Æ£i^…s+&)K‚"’D¸ðG§Óè>ÓBfϫֶ9”j:­8 ½üUFMš¡I² ï6Ò¸¯|“ gùhþQI [ endstream endobj 2200 0 obj << /Type /ObjStm /N 100 /First 969 /Length 1336 /Filter /FlateDecode >> stream xÚ­XËŠ\7Ý÷Wh™ltUª‡$ ~0I c{‘dðÂ&˜˜î0pþ>§ªÛ1íPÆÙÌèVŸ«RÕ9¥’n§1K+Æ*"ø?[™«°ÌBÏTü7 zé=,\º…E SX´°†ÅŠ4Þa00ÛpË,²ºVQvËjE}.ZT¬‡¥Sô2( \†DÊlaÑ2•0ñ2,ÏÜ2ÊòÁ, À`jÝ—a‚ÑÀ2{È4FV¨+ùh`äsôA† ïòÔ]ïÔ ##¹ õQ/¤=lŒ‘… 3…M1Ò°ÁÇhaƒ!a›ž¿°ÁÇdݱ6§›0'¢wX‡³5†À… ën6Ïr ›Gªa³S‚0B†:ǯfCžŽ™=Ž™‘JÌÌð!13ÇÆÌζÆÌ>•®°Á‡IØàÃfØàc°û`øÃWà‰ø0‚iaƒÕÜÖàciØ ˜SD éËm`žcábÐÝÀ@°’Á4„t9C$ìΚ@žLbµlÁ$y“6.<9lp;GØ ÔÕÃgË܇B«-˜Tˆµ“P³P0‰µ“X†P0 mÊ)áÆ•ˆYN ‡<ä”pC9 áða^¸ÁÇ)á¨!Qñ,T"z1|Ø |Œ6ø8%²”S–LãÝÅÅn{T® AE=?)ÛÏ¿üZÔª¡˜´sE®woß>ßÝ»÷ßXj•‘µX–ÕbÎUkG”)0«Œ4%Á³¢à“`“ªšÌdXDœó¨Ðp JV2Ëì”XŒ­NJRÒ'W×pl«Jò‡úªnÏ¥W£,¸Q¥ž$›X«Í4ü%¹&çO’œ¸’œ8’Ä:}+IŸ³'Ÿ°wy<Ü–‹‹²]¢âýýÒ%ÚÃÄfuz˜Å°ßù/m¯¯žîoËUÙ?º,Û³ý»Ûò~¾gþ±Ç/~Ûﶇ˜{¸½ñ->&ÞmOö7Ç»ëWû›SSÛOû×o^<8¾+WîРܱús8zq·Ñâú øQtÞÕ?D§ÝÀ0Ï©âßàS*ˆæµ’`ß<5‰u¢åÀæ›§ö$Ø©nœƒkÓ,Ø+µIŒJUMfÃúÂæiI0iMhØVK‚uÎÊç6ü³à!u¶¤4”‘ KfCÚ¬2’¤uTk2urõópñÈÝöôîåm<ÿøæðûn{p¼~½¿/íùöýöÃöðŠâÁö !Ån„[nÍp¿ˆá$hHy;î~¤ñiÙ¾;>;°ðÍÍÝ˼üæx¨Rû·ž£ÿe-"hôØFM—qûªþyÃΛó³+ù°+}¼œPŒ|ÉYEÎU>×΀±SV¿C&Á(ù!I0£ä{ÜQòC“`´:é–óBêF2u..ÿ²ƒf“£Õù'–XObÑz»Ós·ï³`´»Æœ{»“™㪾8) ow<“Òè²êä¤4¼Ýõ™”Fï8_qŒvG3É ·;ÿ‚“O?_%±ØT’Ò •ºVRÞîD²à>°K&¥A„3–$¥Aèc%¥1qÄËn¡Õ¿¾Çþ2H : endstream endobj 2282 0 obj << /Length 1762 /Filter /FlateDecode >> stream xÚÕZKsã6¾ûW°’ÃRU£6oè–ÝÍLmn™8•Ã$Z„,VdQ!){\©ýïÛ @E»*“Ì`ËrYxÝýu£Ñhê·þ»»“æûwŶ`ô§Qwª0N‚Óι¢óŪøþŠw4üîêŸ7W×oކ¹.nV…Ò (Œâ ´+nêâCùïæövã»Ù\XQ˜Í±DúRUùcï»ôaP–ïöMígsÎ4òRëÙ/7ß]}{sõÛŽüàayiÁQ,ï¯>üŠšÆ¾+Hg‹Çqæ}Au þ©¾)~¸úƒe®(_$ùiÇûwŸ0ó’/t`¬ |…þ‰ dï qòwxf¸ÐŸ›çh¼@êgƒmhŒq‰`mãúz6W\•7릵Îoª'Œõj9ì«ÍæiÙu¾÷Û!ͬb±õÃcÛýú¦šíçs‚÷œ-jÇA[“?í4Ðþ:Åo·~ê›eµ‰­Ú?4K„gBlW-õ|«®½‡ ýãÉ—kôëv¿©óÀi °á´8§p®«bdw›övB·ªk²ÃÉû¾¹Ûú:¶Úm,› äå¦!ƒ¯ªe³½KcÛÁwÔá! Z².# ÚVâ|Oûò½dXcýÖoÚ £¡6ñäúý-môLÑéÅDNȈ02!‹’F©9c¸¨oí‚Óg±¸–6ÂÒaúªŽ1Í)F‘˜QgÜQ©ÏÍÜw“ã˜*"/Ü®’Iïü²Y=]:†y“¶Ä²¥®íGçˆ UJW΀•"£ÒR—9UúOÓ‘‰‹X~s  þcÚÎýÐmçP§²!vϲ„²šKSþ*Æu ¿å_åÀ00R¾.{VЩŒJÓ\¿`ÎüÌœ÷ÛãP'¨ø.ÜꢣªÏC ÁÓ±b¡, —´Ìx‘QÒ€Á³‹Ì¥å+ÆYæÌë²xÔÄ]Æp_qFø &/ž÷àkÿ1¿gœË‰ £R‹—8û(¹Q¹–B£|%Xø C«-[9ZY ‘Ö|eñ©4 2Þ(¤ 99•¹ÜTÓ…ë÷< ÒœbÁ¸1 ÈK­Ab:Èvm»yöú„ó³ŽÕ*Ò‚e<£öéku‚ã¿yd ¸Ê)£p¤úŠ·»¡™zÛÏ{ß=L±ÉAç dìÍq ó à ˉ*0Ú~šöŸå)¤Ç‹ˆJ€°æ¯3þ,…ê<›/þL6ÿìEÄ%ÂjpS¦@€›Í+¿ýXÝï6>¾xpáÜG,ÿUõ˪öñUE¸¸Ì/ŸÆ0öú­=¦Bዺ ÇÊ¥NÌeK&ËXR±íª~˜)MÍeˆ–ÃÝðf(ïö],fs­LùŸ!Íïûý½O‹ÄÔv蓊3nË!Žô~['Šu5T±RhapdŸæ>áêà¼|\7ËбŽóüvYíúý¦ü(`1ŸdJã"%Œ!ÖëXYµÝcX¥êiaìaJ Êaþ&ia‡qÿF“ )Íú“4Ï-rúiNŸîâÄŸ™bÕjˆMrŒM€3dlGR›€·Â÷6:à$fQÖtZ. ‹2¨©ë“²Mzø Š›‚„DZSèÜS˜Ûû´`T,5CLËlÓüÞ“]Ô±³Ýú‘–‰¯¾¹o6U—¦–Óò£þd›ô¨“·.ßÎȸۀÓe퇪ÙÄõC»ºÍI¾v?ÄöAà4NrR©Ê;¿õÝsxh4ª,Û(XgxÝç‡ý.6㓺ÜUÝÐ,I']0Ú{½÷q„¤剎‹Àøo¢Sù£I.¥ø0> ÇÉÉœIÆo6}{ÌÅÄÒŸ§p†Ÿ òŒØ\ö­-hs¶]ç{–쀔8f÷BGàúÀÄôÜ…øëîZ0:h”ûÒîZ°i5Ÿä®¿ddÍ­ŽùŽWî8p“|ý×é^8Æ@ÊÌQ}Ð:£ÌÆ‚áÉA6Á·¼¬Í"²F@Ì©g­M ¢óÜ›¸4 tÆ šÓQ¨y ¢^þúaç*Ï…†ÓÔ\X`æÅ4õxgœ"F©eFsæw9…Øûuý—ZåÓ :Š)Äóž•gQ3ž&hX‹9=+j \gü• ‰¿ð¬OLT fÌ #6V¼ì[y&Á…Ô³­(p‘¿I?^Ã\épäŠäË).w í”íà‡4[&q‘Ó žQZÔ€âÿ•J'ñϘIGÆAÙ‹L:í]¶Xp6•L‰sK7M“1¶˜09C$ƒ yÆÜ°Q ígH kŠ¢…úÒ©¢ÂÅßJ Ÿ—ÿ‰ÒÝl endstream endobj 2327 0 obj << /Length 3972 /Filter /FlateDecode >> stream xÚ½ÉrÜÆõί˜J+@ `nе”\)—,Q•ƒíCsÐ3Dˆ(,¢è¯ÏÛË”T®8biÐýz{[¿ ø¸ ý`üßÝw¯7õ&€?Æ~”'›4ý\çy¾iíæ°ùå"ØaøõÅ?¯/~x¥ÂMÑÞ\6‰öu®6iù‰Î7×ÅæWïEysSÙör«2åÁþå6ôBøI¢0ñ>t¶}Öá`ì½ÊÂ^n£@‡‘§ÓË߯ºxy}ññ"$|Âqû8óS¥6ûÓů¿›Æ~Ú~œg›šyÚ@Ûü¡]mÞ_|‰røy‡sœ#åg £œøÊ@1Lïågsº¯,£»Ëm†Þ‹ÇÚœÊ=Sõâç÷<ü[¯.Uäýòâgh‡H¯²ùq¡ös¥7@¥ŸärÞûáþèμ¦í/·q”z‡¦ÅF†ç\†ž9!ÓJhíŒ'âļ°0½íxèá~ŒtLk [p¯¬yѧKø±mW6\üà.ü1ù¤º¾ÂÞãé "ò[ÆÇ¡µ²Ÿ`ËÛd^kB•3›­#:T~‹^t ì+`›Ž½ªì`'•ÀN|ވ˧ËD{¦¬Ì ±ÀÀs$›C7˜ªzäeÝm3TÜCàdî1®má£ØRï¥Ù#^·¼ ·ãy{S3è†Ø)ÐÖ2!ÍI.8ÏÈ:Ûö¦”µ¦(`EG$KbIœIì½øðæ…ÏÍßÚš[ÈØ†›rb’x¦gé°ìøÙÝ3iû‰²p/¥#)ÀðCYUÜrÜK&î!¸§C”gE68­©­ÛÇ·€Zh‘c“¸ÛNößW%`Œb–Sº;A ¹²Bô+œ 7&©=¥¼£íÔßiBI âʼn÷¦æÁCSU îðPÖGY¾Šˆ¯(ßýao†ª¬­/3ü}szÆ;ó ñ™,ù€–§|EnQ„»]q“íࢺªÜ»#½´Õü4Éè0|ž)ŽrŠ ÚQ6ŒdPd\ãþOí;“ÎŒ10CGV‚7±q8ᯘƒ¯˜1sèɹ¥‰w»\5÷|qpøXÔÃfìÝß¶¦COt潟Ì# ²õKÂÒ_:“Þ0஬‹Ž—‘±»Ìú)Øë9üãYè›hiÚ<Û´/jªOÀ«µ ÀF! ÂÑX*’›J"woÈÑÑÀ¨ÈÐ~{ýŽgá¹­e¥m;Ùbv(™Îéw'áÙxŒÌq¾ ‡öM=9%\3Þ–'ð`õ>Ûýª¹B$K¹éAãbpseB[·«c΂é=<ò¤pÑy"j†÷4ü(ìÁ UÏÑ£[¶ÌeÓÊê7ïÇ]ØéUƒå®XÍpæ™°ÓÝ•2°@gt/Wš¾·§û5»@¼ÉRO¶rz—¥s–`wÁΔ ±?Á. ÇC~ð™Ózˉ{“ã ‚¥¤«‡é,°6A£µû†47ðƒü?´L]œoQYñ‚„ƊЧ3FÛ(—E©éÅnaä±1™Z45಄4‡Mµ÷KrTâ†ðIæýÍ–ƒ+>iÁ€ 5蛞§Ü»è&ôZ‰  aôÈÓ‡…¬ž²Ù×D½ÊPü¥#ïÞ´pÕØ¢é¹MQLéݪ3cì¸/BP ®íøiä”–,þg9ÝÖGÒ3h“Iƒ§yKË#Es2•Žãæãfp*OÚèÇ4¨´ód5“×Q Y⌑νòàÐrÏŽdˆCb—u,«Yž>Øí~ þ pG ¸i—¡£K¡2=óná$üÑÐɱsÒ×´;ðŸþ‹üò^û¦½7¤¿±÷8Ưª â¥!#ŒÎŦ’‘¢@'Š¾Ïœ.9]E/œF.*À5 Êî¥G„cãÃd~yÅÉr<`ê²;ùœS©hžT)øZcšHEÝmïÛ¦oöMµ’ƒ¥©‡ãì3ëÄqà6ÖÀª [˜KÚ’&ã¾ G ¶ÆÚS’b°A,!vÁÜæ¼êÄ’­Ë½q¡CwŠ®´D!¢™ž’vsáýK9<°²ÿè?:î£ÈV8‡¹£(î×òÔÔ³È͹ZÛfä±›Ñï×v‰B?§p–p¾ ð7Í´›cêÇo"ã‹„òÄO²x©¬¿…*~Φ#¯<]Bîõí#ƒèΓ$ƒ/Þò¾¼¡›kX¾9@.Eá@À)ŽÊÞ0:Ú©~yÄõo/!·ò¹÷ÜŠ;anja«²[S”ûY–-»/O¶ú6mÝôK„õEÙ1ôd>—' yÙá•é¡SA[~®d˜:9%†6ëçŠ÷bïF¦T7ˆt‘àœ—;§ë†Óè†÷t%ÒÅ•0 ¢<Íܽéçnv¢/S뜒 Pʦ'`Ù‘X¾é)ábÕösÏ-ÐÃPq{.J讋2Œ#_«Ä‰sƒ-És–~ž«}€×g¼"H8á “EÐY謥’âü ®YÄÅz¶Û4j-6DðXy œÕ©ØD!êC éñš3P¡Ÿ¥£ys Y%²ù`ÛUnC;×MÁׂZtÕÎ…‰ŸÇÑšª© ª UžFWm\ásµ 8Àç?VµGÇ~&Ðì÷ö¾ßõ]Ý<Ô[T¦UŠ2ãh7!QÐT`Q½>®+±Öàpíö¶6mÙ Âh©43gY—Ä]QøIš,™!^LEt˜ ]¥¤Ÿ1.ˆ¤x¢` Õù$8ù±©kÄ:D³è»cÀÉŒ‘oȵ%ÚŸ“…±dCv^E‹}¯Å,F¢“!%)`ROÅ.ƒìýŠ§ß «kx »@`ÏYAà”|ˆ5]ÉÕL%>ž…½g<Ên'YnøÑZSÉ~¶YÖ´wDb¹>1KËwݕвä`0«¥*ÌÊØLƒ 1sÙ Œ|A½Æb.é äOÖΠ Å vÍ®N…«^˜¼º(qŠyL °œÝ•Çz¶M?ñ ¯3͆ÝW@Â(:‡—;˜õ8÷ºædXj?;cÔ“&"ãàYM{™H‹±Ð™ÈZc¸zÉ¥v6ƒF¼i½ôä*@–ÁIO†Wâ.;§+zª|ë%=ÖüR$¦« 3$FŠqî]#»n9ÁF\2§z»sDËô´È@tÆD®¾*ïˆJÒ  ÁäÙ–¼’†d¥¨%µ¤ ù+™<ɦ‘ÚŠb%H¼ÛòDrv5„-Lh²æƒä̈%_c9o®= iÏ·s#­%7Ò‰—pÿLˆ8" ªÜ—T…Yû¡må2"û´Ìj©šñ‹ ®‰Â.djÍ¥Mع,dñ¢<Êæ—«eϲGä/&;amÍ#Á¸ƒ¦'së˜ y:“ÖÔ7%уÖ0“(öE™±é¢ l~;­ý]CÙþzÜlbâ#JÙÊEd‘VlXhÿ¾-÷ÂÚØYø¾mªÊÊ©gÆ´“Ã5MwÔåc›+,’7óhíÅ ‚YÝq.ζP‡-N@ €‘û¨3¹y•O&‚Ç ;ÝèªpZYw½5Ä8º2x.ep˜m¸‹ÖPàwÅž=¡™†r{ÆN4SÉ­eˆC?Óœ[EYt»²º‘uΘzoeŸÏ\xªÐ{ÆÐÑ‹G¹÷ör¦ °2â)†RkÜTú®:æpâ qEÎóW]*sÈ4j¦¼ŸÅ$/ƧX'›ºìE†i|…¹šqÇñŽÛ‹^šàWPÈ=zçÛà›˜’_?®¶”ƒ—9™‚_?gþ“Œ̲X!—"iHJ³ÑÓCó¶!ç_„Xý!µ%¿ÞóœéÈ<›1!ÏÈøÃе›jî¹aˆ’ì|YºÆ¹R°î§†ŸË¢0¤\›gR®ídµ¬+ûUb%™8+?«QˆÐB\áöJ@D/¾]‡5•Û®\,3(ŽôÙµjè¦î§ËêÂÕ·­•@‹kšÄqÏ»EØ×5Õà’`ŠWhreçŒÙlOĞðõÀW—ŠgßÐËEŒJNH°ÁMrɨû†{ÇLºöL–CtÝ‹?‡VŒÑíH옓hd,ܪl|Ÿ#hšûñõ‚Å·[_Ú£JÊnÙ‚›ªÀ± &´+½jª§vÜš9sèÁû5HxkÁaX`ì#ÄÀ£÷\;¯*ôŠ^>µ9ipÙú“e8‰$W“pIñÇÑ]à$þr€ÖµI!¬dº°’)X£7ìy>ú5|²áïyïŽÆ±$ë(¶üBhg#oåAV¬5á-Ü>¥¹Ü,Éés ¬«¡š'q ×[H*jøÑBV0M¸XšTGQùÈZ†JU?ìáNǦ ‚GÏ/޲³Ãg9Cñ7eöE°Û§&ÛÙ,Üíü”Aïíj ?S+©c%)Š"R\|Ê_9>Ó~fßy?ŽÎ4wŸÂ[èL¤ÞꙑŸÅã™Hñ(Þ†Û`‹oâ-R¼EŠ¿q‹¨V$Ë×lÔžº,Æå+>*Îråg*ÓURÄu¯8 ?Ž’a²g”b_oZWÉqï2›rª³ÄÎoªÙ‡t'Ì£±¨9«ù °5†Ýî¸y;Ã}h©¬L´_“6›ñ§=n–€w¯W¿A ¹Qšã7ˆwß*_e)}'9ûèðÛ'¸™+Ç(?Öéù§ŽêkŸ:~÷ißžù>¹öSuN´hÍŸ¦š?ÊŒV>ÊÄ’lšÇ¬ç.×o}åá;å÷ý­I:S>Üüÿ1É©tîkþÿ¤”*xè…þÕtϱSÙO¶âfkê£Ýq;ÄXñåÉ‚ ­÷n3½°7ÃÑ}=û—‹Aýÿ˜¥?ŒSÇ,¢Ðí.OÀò¿É’ª endstream endobj 2337 0 obj << /Length 1611 /Filter /FlateDecode >> stream xÚÕZKoÛF¾ëWí!6`Möýð±pk4‡MœSšE®l&)“’§èïP\J¢l·h›Ž!—‰;ßÌÎ~ßìÞ&Øö¿¹¾½Lª„áŸá „׉õ ¼ñÞ'MHæÉ¯–\ãíËÉW“×?Ižx¼-Lr5O´ãebµm|r•'N.ŠÙ¬ ÍéT:y‚/€Ó)?áø¡×'ïÛмj»›êär]äát*˜áâĸÓWo&?^Mn'|Ó¾ýyåÀJ™d‹É‡,ÉñÞ›„ò.¹ß<¹H° Øl—É»É®Ë |’l?Ðòñ…·—ÿàÉÇýâ¬Ó]¿ºëC¸­zðþUOz˜EÂñ:ó|g!ß·¹¬¯§e¸ åéT }Ò£÷-Í}ÒÌ€æ[[ü¿zÉxÆY:/oGDï¦ï{÷\ÔÕ«UßDÇõùºŒÎËÓU ñŸ±¸t„X8 ‚É]È.ênÈwF·7u³¢±ÚhÐÎWÔbJeÒz œ©QÔ¾ 1f—M½ª³:†ëªîu]YÏã›xa^—e}_T1ÒïÒrÚóþd/ÏâãÙÐJ«šH§ BPNŒ:fì<¯ÚéIÄ‚ÆnSºâÇ58顳¸¥íáhc¿øå]ßz¿Üäë>„‹E¨×q”üÆ4+ª¾½hñŒ“8W{ NIB ÇKv/ªG0pÆá®#¬ò¨¢Z[V):gi«À1?Šêv²bþsož7¡mÇ™|ìH×ï:2¿Ÿ÷g1ø×mȇ|ßìßk Ürom8t¢§ƒq~›WÓMàÀŒñós¢A¯$u\L\KÌ2q-p™x1O³¸ß…Õ û®oÿNã.nÐHw\îb¼' šY`FŽRUÚ¶Åu5ÊT!·yS/ÞYÄkY‰_ ñ¨r —4ˆ øüi zo'a+«ÂXkArޝëŠL‘8/ë/o2l>sç˜g_Ec¹ 5't´1 xœjþ ±Q9$ â¨Ò“’„&ÔJzŒÍ±>@9wW 'ISYg骨«1…Ú*å¬,Bµ"JY‚ƒe„BA Ö¸qB/Ûú1J÷ÅP CRy˜ÔG$k@pd‹ä{mvF'sÀ5!•W\€àT>ÂQDñµX·«1K¿KË"Ê,ù_Dêî«i–…åêIh[ ÁVz†iº¤+»7ı]/w¶#ùû á Ĩ8¾t˜>.Ž/OäqtƒBZÚòç³2¦Ú":/¯éP ©ÒMÍ]j ^[ÂPÖ˜OÄòžùáKºX–2äÐ$((˜0+–…§ ËŲêùXî–ŒbÙævy}^ ˜ÃÐn 3”V€1:ˆ ‰úã XÉÒ×0[—E`FÙØ?1&N.´Î%%F·Qã|NCù7@" ”m%ʃQܧíͳ@°/ˆD·JĔ̂Ð3…§2WL¨Ù\á#0®)ñ‘XŒ“¯õh¼™Ì(c(Mt¬ç.Ò2«ËÅ ˜ÍxNj6sàRÂC^ÀÛÜs@1Fh6÷”ŒºãSúP½„ÕÖ‚ãŽÒjéÎÅ /ª´IZ[q£@˜ãÚßÄ5CAGo¹V`z~ü~+† c^µÉÕ;ˆzÕ>’Y;‘6a+@†]R%ß²hiö½qi‘šb¬89–l4ó7áSȈŒÇñi¡€â‚qfd=Y߆AhÖ Í^ê`=3ívÏ Êž.\Ð&F:&¹ŒÑbb„Ø~!ºÛ#x€X?wàÒ”7¼-WQ)ƒvãUùŸ`Š5Ù°c+].·¡5þSu¥v=Ÿ_H0v¼%\Zqv³Ûvb5‚¸¸®ê&<5 ÜÕPTºUh¶{w˜¥ÛRÃlp¸¸uöØ/R­6”ÐǵOEƒ³„KEÚƒD¢xÓuõ¹ªï«é®¤ÆUöº¹î½7t#Ñ’2Îß endstream endobj 2277 0 obj << /Type /ObjStm /N 100 /First 979 /Length 1314 /Filter /FlateDecode >> stream xÚ­XMo7 ½ï¯Ð±½h$R¢$ÀÄH[ ‚涆޳(Œ»…?€ôß÷‘Û¢N*l›‹—óö¨!Ÿ¸oLT8¤@ÔsèúÙz Ô5‹CYƒ*‹5Ônˆ¡ªA Òl™Z®;#4Qd$,¬¬Ñ«!ú0„Ã(†”0º!5äÄ ¢fX 9“a‘¬>F4qJˆjÑ(#†QÈ\ cDݰraã4ãR ,ø²ŠAH&)EÈR C²–ôÖŒd­(–‘¬ ì³aHÖ»aXoaH6ša¨\ʆ5DÂÈ‘Q߬Õfý"WF¤Oš‡b¤%.†Ñ©´ˆô’ ÓE›5w¥0!GMá IiÇ¢A© !… ¸+ÆHѺa¸«SýsõnÅÐË‘-#âP¬’Yðè!E±’6««B¤’`<kH[‚• «W2LUâarÔbrÔ=1(,ºq®È!ª ®ÈÑÈ0äh¢¸›2*rtSFEŽnʨÈ1L9†)=.‰µåØZI¦ É¡d«°"«†àP6¬ 2iH EE†HéyÁÞY­PûRØ0ä(][Ž’”ªÝᆵ)¯!‡dÃCÄ0äh& ?ŽXíò4|t?6|4ø,¿1wÛÛÇwvýýíá×Ýöâx÷~gYÒÕöíöÝöò2Û…nìTj8Ë*ÍX!šÒJL+Ì%RÉà=·b½ Û7Ç‹cØÎÃW÷ïîqóíñAúZkôEöRkMFL8©=ÅŒ†S˜–;ù{3 Û)O·s.mz[Wüéç`8´Öc§>\­Ér"s‹Œâ#GLk7§¨“ÙE–!±¡?>rçH8z>²Œ(ÕKÆgƼ÷‘‹jÊY !íº8ɹF '9å8’“\{:}d¨>²äHÎ童ŖҨ8ªYœÒ¨zš²—œZį±ŒkvJ³:qJc?â‡ÆI®»xÉ<¢z™ªÑœÕ€©Š‰²—\1œ¥ƒGŒÔ¼dLºFÎ:“Ô˜›³tTsï %î(óTÁØÅJÎSGs’a7cq6Æ5öîl e§4xô(Î]p‡™#§4¸åX›—\aæÈ) üDÅÒœÒ`†™#§4Шÿò‘æ-9É4¶S Âa;›BÂpØNiPÁÀ%§4ˆ%&ïÂú¿gK(õ8ºSy`Ü>µÁ‡"­ endstream endobj 2393 0 obj << /Length 2055 /Filter /FlateDecode >> stream xÚÕZÝoã6Ï_!ì=œ Ä,‡ßÌãÝ¥‹Üu“ö¥íƒlɉÛòJÎÇâpÿûÍ”g]4»i˜[tk’CŠœßÌê—0¾û¿¿>h~x_¬ ŽÿPLx]X¯˜7Þû¢oŠEñã /®±ûýÉß®N¾û^Bá±[˜âjQhÃŒ—…Õ‚iã‹«ºø¥üG;›-›~2•N–¸›L¡üÑtùÓÐô¨S•ïoÛº™L7 Jã'¿]ýpr~uòñ‚>°›^9f¥,æ«“_~ãE}?œ)ïŠû0rU`¡þX_—'{•9óE±ûA䇂ï¿`äçzgÖiÒ‹ä£ ™VÑx_¥I4³(åÜÃc; Ép½`æÿsýñ¬G †I´ÞÅ%“Î~½ÞG—ÑÞ>õ›|Žßž„Üç¶0£Ë` Í$Š1м<¨V›ec àl2ÕåÏoÊf]wýtØ`Ÿ(›yû+5‘z±^týªÚ¶Ý:>ÙmB­üÝ÷ÊKS`Ü":¸ØâC^”íK\A¸²†v4AѶ‹å¼[Ó²×·(ûÔWÇ=3ÅÍq7¶ Ûg÷ ”›¾#ñ][ãCé™8pˆsÚj-q‘F¸Pq ¸-àåe»ž Þ4¨â-¦#ÄÊbEÊ*°åº‹%*KE½#Þ½E©SõÕªÙ6ýpŠép2uµä U³žàCÛ¤[‡~S~¼m·i5œP7dFÒØëò<>Õô›¾F•Ht»¢ßYÔ¤UZ𞺚år'%˜<L ý'ŽÚÄ`,¨”d›$Ø ædLl¶Û¡Y¦1ó* gѱ±swßÔˆ@K…¡»¶7É›X_tËeG ß·ëë8_ã'-‚4§,놦\§Vgnãº)nƒ ¸°qÁcÌ£Sï‚]BalM¥”¥RPQ¥tyP£ìn¢uY-oS3XE’Uªm’Œ‹"¼°PÆ8ǵ^pN|\ú×>¦ SÖ}Ñ1õš¯í=s ò½V —(21"þ‚1*tI'QÓ3ŒÞÅ3ø|޹Z;ƒÉ‡ÈZ{t±N —ÝõtÙÜ5ËÞål³*'dk˜ãvyÕQþEˆ7=žÝC“·ö ¼ÌˆÛH&´‹¸ÛE5O ß5ÛxëÿÉ]if”ÊÝXƹÀ1Eåé°Ÿ/«aÈ W Æ}ŽÙZ&ו†AÚÓ›®KÛYpÎÏÎ`ËE¦ ¢4]-®_v;x!FN9¸ý³1¾êÛ•²¥l>¿(¯™qðvýyÌÛ)e'Á˜?Q=ä‘T™¥sІµ‹¶©c³J{¸ŠÅMó0l{Ês¸\áNsŸ__Ñ|˜7éž÷ØLwOmH‰ë”2ÞiÌ<óØÃ(&•ÿ¶¶€æ,§µbÎèƒ p#6Ôãý4…ú§õ¶zˆõvŒóåеewÛ ‹c¥Å¤2šI¾ÃÍô¬xwÓwt³žâ¿j‚wyL$$&ðmÅ>´ÈèVúª öÀ­á^Mô[_Ù·›M×oÇÜÿ¾3i#Ôuß C/K%—-Æ93Æ}ùFð”áÁY=s˜í屓ŒkõMíi<Ó\çó§´8õá¸Ä»v_-?ó'f9 Ñð;Ѽ[Uãw ú̸ÍôRZ3¯3&õÒpÆÅs“™Ï¢©ç§yŒ¡S<‡1Àj&”Æ S6]q¥{ÕŸñù¯3!Ž9ms"Ç›´âùœw ™ä.ß§ žáùñrÊK^#¼ö·d ‚x1ãuÀ7áñi„/Þ#­KÁO‚⮺Uk}äg°6§ "”M ]„Á#2qJtàÒ€šXÙô;¦ƒ„»—ÄüþÐ=ó”†ãaŒ½Ÿb#0I¿1´ô‡1~§{àTâj˜×_§ìqò©9=¼º—‚ sD7ì»›h˜Š!¶£UhtâLj²ŠÕØNª­ëp¡1†Â‡îoð5„}7Q<â@ì‚#æËö`Ùû6pK8øâO±¹Ä#Jùرኧ;/ÿõÏ‹¿_\a50ãô8.29O'›*‡‡óÝ>œÿøÓùåÑ9SÚs®0›¬®‰bÓœ—Äïhq€’Ú%ÕºõòÕ  ,ž)1$Rµc9¤rdîš!ä¶IÊjBˆ{V*¶wü掰ÝÏÖÅÖ¯\ó–ê¶Ž±”PØdÝ¡^B+Ü Ü1ßp|pgòÝëv¢‰±ÃŸ9yYvõˆq­gVï·Ö)aàåì6­MHµ‘ÅAd‘Y„¦ù)x£–ÎÎêw~Ä=°=¢¦B˜£ºµIµègªõͼi£;¢Bä€~Hãù)X[*ÉøZuÏ îyËÄ4Ÿ%Òp;RO‰P5tœ=à.ªVT#vd§OiÈ@óv·Ë:Nº'b±QÅ! ¤Šµj†qÌ´(mB}à%t¥€¦•¯ýŽALüßð•x»eƪ|IÀ¬ôoÊW ®ðEŸñow üÒ•à9^ãL>Äà3 Þš®‹W1a3âvÀ‚äÍéJ0ï[Y¸`NY\ÐâÔâèJPï9n7o Úà{\îÿ†íùJoZ>£¯)ÅR*'_ B0'¿©¯uÀ1]sÑ-ô7WJßvJ©ÕTëPPÍæy>ÉÑ­Xfü#©½7/ÿ ášY½v®ˆ«h%_ò=âiù?[@õó endstream endobj 2433 0 obj << /Length 2985 /Filter /FlateDecode >> stream xÚÕZ[ÛÆ~ß_A¤¡k23œáúàÖ—:’ÔvN(‰Ò¡È IÙÙýï=—ŠÜ•£h ‹]Íõ̹|çÌ9£ý5RBŽ¿ÝqÖ}ý2j" ?©2Bç6r¹yšçyÔ•Ñ!úûŒŽ0ýòæ/oo¾z‘¨(‡iFo‘MEš'‘³ZØ4Þî£wñ³j»­ËnµN²$†Äj­b¬V6þ¡/»/{œ4ñËsµ/Wk-S¥c'W?¿ýúæùÛ›_oñ£Fò&.I¢ÝéæÝÏ2ÚÃÜב&Ï¢´òA[ÿЮ£77YVRä2WSžu"2Ë,[‘¥Eeeüü·âtW—Ì¢Ò›ÕÚ*¿Jt¤ÚÕUÙàÀÀ«vmó“Tf¥âã¹+PÞ¡j”ç«Ùôl•ŠjÁ²ãÁªY_“ìÐv§€%8ÿ@4 Á¤¦iulS—¡üyö1Kg*®¼¹+=—ýÀª±S2±Û¢ç‰g?¼zÆ-P‚T©72ÙH³‘v#Ót™í€"ÍØ½"ÈÌ}4Àq@øÀ˜¨¢<þIZÙ3VZÒ¡ð¼‚Ķú'¯b«!pí¡:q ƒˆñA… íw]ygðT8ä8 60T~¼®%Òò¤˜}XF÷Ž ­ÿ¼õ3ûòPœk?ë©A°÷ÑÅh¿ò“UÏ;vç.8%E:˜jÚáJŒó¢†Ä@cZÒòç<1 ‘cùÖúPS}$AÆëÃ+D1œšëC]ôÁQ‚V6ø©)ªC×£²[_. žØ}Õ“ †åtqkコŒ+átŽ~ÔR$×B@âÀzÞ‘ƒ¤äÊwwuµ%ì¹?´Á7=ÉŠÕ^v‡‚cƒ áù¡³C"¸§@‚,…àÖ6žô˜Ýx²b€ƒ÷ýoÛÒÊ4dt ½M;Ÿ% 0Û…K‰U˜ÆcÊ›bÈqtÝb§¯Ž Gìâ‚2œ‹»¡%›#Åâ0„Ã0B"2,&qºÁ¡ØV5$QhÎO!p©qO—Êðqoö©zwB½R¡0¯R®íùq•ƒ˜]‰ÓæJqa­H±¢µ¯çÐ3@r´õ,'6(7¿¬k;º_aþ¼‚Œƒ$uˆå@Å/êʺ*ÈiáöøœÀŽ×D0ß’qæŠFºrPIºr#ø`iNÁz(‹=æ|*¥|Ggs£ã·ÄäÀŸk+HkøêÌ1‘‚Ôƒ`€=°DÝpÄÅo{ÀxQ‰@ÓöD˜:÷œÃqЃ׋O `zšØášÝ¼zða­ÝœÓ˜lrª‘aÍä[S[AßÛ ½’C¨:ŠZ852C§ïypè @\J·$ «¼¯á$e!Ó§:?¿¸Ù®íö¡í)ŽpBêS A¨î‡Ð±rW·pÿùAWbW—rZ´±qŒ…qäjÒgÇØèƒëJÄ…÷¡dæCüبÑ%žótÎúõ‹ÜCß½^)©Á©{’3Â$aÛ\;EŸ§e2 ÍJ÷;rÄ£å¡Ú„6yMÛý‚‚›b,ܬ@Ò¤ÄÎkÃ>9„ÖVÀ]ñ@ac‰Õzà0‰qñ‡Û²¹`gîâ0}qqèt¢à+ Ìèj‚˜‹ßNM 㣕ۦä•m`ÁÍ¢öV.x½úóÿ”;w]űbw (åoC ù‡Ãùû»OÊ®c•ÏóêwñÏ!)ëÿG®fL:ã€X}xfÙ`¼Ã„þ1½æqvL4±CÏ'¤˜ÁoÊ“V]ÑùU@kwlO³oØGú±¤@§à•x4¾J¨øHÕ©Ž _—’2åü‡r?mèµÂo/zOˆM†»û3·<þ!´±M€HÍ-Êç` ¤æ…mJ[-òû¡çþ¹ðŒ "}xWBäwTº`Ú:{ÕÁ#e¢˜ÙÞ–UÇÍQ‰T’ÓԽߎ•Œ†Ú“2o¨í®… ­µHòä6¾}~-H˜Td™ « 'ì‹cé¹ p¾¨Oƒ¬Ä‘ ðÀ÷±n·TÌ\dð1 Í!d00yNÈ0>;ÖÒìjHdüªñ+.†…ž7=´.aÂùr¯ž‘áU°Eù6ÊٳŖ3_îð•­ÊŸÎ6:‚+YàTõèY¤G!v¶t +N° e)aN¸Êœ©rHÈ£hüCAa:aáÚcs’)¡SzlÆñ𰜈$sô >y]þãÂÊ+ÇÀcÕÃ7íä÷Þ´?ù´?^ù˜ŸÔ ‡=Ûëû¿–›ßßõ•÷÷Ä)áÓdÊ?Aª­-Ù»ìšñ-øé]µµ5B¥K m¡®ÐùLèñû†‹¸j¨.où8t¨êrÃÍ»Pc³Õ…_¾ˆúŒ}ÙÕgŒHGÈ,"¢vB¦é‚"&J((§yå­ÏÙ%¶|¹ýă¦=yø0 ü"~òö3ûê€ï=-Ó‡n&]øCÂw‹hõ¨ÜÿZ»ÿ×@©süú3[Ò 3SD|Ó9ÝÃN]¾/koò¢9†¡09~~*»cÙìî1×]g8ô¬ÜžT^-abÈe„Q ªKçR˜,Y2Hh§E–æ ÊèðuȰŒu{\O -#²Í°öY9®±p¨­dr‘%éÌqŸµÍ—>ƒÝü¥~®½íöø`½ˆù yˆ^PI*4$Ð#bOí>¤<·m7,#µ1]òy¡VZ¡t² ¥d.Tæ“¬Š¿@3}Q·ò nÿks©\ ëÌge.å2!õ)±s"Q*R™2ÄuÑ÷‹Z(…"Ö-‘çNäP7©4Ò>;¾k[7µ”j³ßfµÙ|•šed·0©Ý‚–†b5Ͻìÿ^FÆŽvŸW~®ðÿút¶ ] DÌrŸpÞí×Ë{!ð¤]¾ *# %¾âˆÑ,“Šæ©pÉ‚ÂK)\øßM¾.›#~w€â/z²nhµÂ3'´I— > stream xÚÕZK“㶾ϯ`U‘ª–m¼¬Ú‹kíµ}J6ã“íEA#V(Q¦8Ç•ÿžiG¬wœÝN­¦†@ t âׂ;þw'ïÞÛ‚áŸá „×…õ ¼ñÞC(VÅßoXq‡Åoo¾¾½ùê[É Å·«B0^V ÐÆ·Ëâ§Ù›v±èÂ0/¥“3ìæ%Ÿq¼hÁõìÇ}þº…jöö¾]†y)˜ábfùü—Ûn¾¹½ùõ†OãáÇæ•+eÑln~ú…K,û¡` ¼+§š›Ó€ãÇtWüãæýø¢8^PòÓŒwo_Pór\܃u:Ž+æÆÀ%h•ÀûS#I0‹‚c>ó<âl,0& +$`Ìýnlûí¼ÔBÏ–Û}‰¸>DÔã³`ŒWË…«xU%X?%WUÄ i¡À,Éø,úMÝætxª7».@ÓoHP0^€q–ã àâ»Dá!l—ýPîw¡IÚXWŠ’=Õø{Å…T¥Ä'Æ™ ÆzàÒ}jh>ëú6FƒvžPƃÑ2©ó/IqQ…mÝ¥‡]=Ô›0†aŸžW}^ñM׆í˜Òí¸N©7?~ÿ&¥«Ð$0Q1Y1U1C£tô LRˆs¦€Ï1Y¢«ù¿"!ú+B zd]Åï4" ¤ ŠÈè-xá±C²š$c½\a¿¿âÿ„¤Ÿs^ŠÏ5(m“ø»!¬Ú§3éëE³¬ª¯Œ"@㸜’„0ŽYöÃ`š~»„d `Ñþ‹ ©4!Ú9Ú½€V‘LS„ËÀ*EˆˆUà˜ 5ZàïUÊ›’Æ<1ýh Ò¸' '´á ²ýü7ˆJ‚Qæ‹bZ2`žÔk©€qÂÇu»¿dzûuße^3„&´!¯ú°ªï»ñÒÖÛå¹]xE£yn/Gˆ¢`ØÃ)Š‹û$íj†#Ž&¡Ý®zX˜ï)aax7§!Æ×ýeÀ€‘Å&ϸzȳªnš°CžA?3ÍØS4”p6»¸¨¦l¬C³ÿ œEI°•Ǧù‡#'†Îÿ™RÁ…•T˜tZ1UKAÃÉ”Õ@ Š[ƒ¤Q‡2‰aÔ¡ŒÅÍGð Ž¿RÛ¼ËÂ$#Ò¹rH|¡Ö1Êw†”G(©AhñEñ%8X& õ"4XãNLýßÎ6š:ÏÞE8Ј‰d¶¨÷‡äašaÓ¡<¹¼H”Îp­ä÷—6þ M½Ä¥W`a¤ c–Ò®KÇiCg×¥ÓÀÿƒÝ¤¨æŠNÏ?6B,mÿà«J?@Þ•†´ÚãK?ÜÑ £%xM”Ií€ Aéä/Ú¼/ÊÉIaÀiBÊ)1:÷B}b'×µÛ–]ß¾»ì‰Ú,É ä¤Õ—^î„Up¬B#ˆ±]Ecÿ„÷È`(±`œ `„3H2HÖ*•°æÃ6>ê&ÝÃWRƒQ?´[\RýưÉ>© +ÀÂh¡+,¥¡Úç‘Á¡C#[÷2¯C qÁÒЀ9ûç~µ/ôù ù1€žƒážca%¤L’ök,u³Çx¶iŸ²ú¸¹8%Vñ®f»y‰ ôxu³¾KeÉóÌ5º”¸ð`^:¦fïÂÝ}WéµÉÇÆÇÜðcÛu©è.ä.²? ¹ÆjÀÕ8ÕQTgQr^¼§I4I÷žÈ ™¾ –R‰iœî8N’²|ö]’>Ž#Ë|î –¤mĘÊ_ÛñZWlQ±¦bËŠ…Š­ïDÙbÍI¶˜ˆÎ:áhEU-êÅc‹ t¤é’qW[` Ù$KÈÛ9ŸõcJ/RI×G­ÆºcŸ êI’ßÒCÓof\ÝÝ‘Äj—I‰³¥ÎÍîêal›¤ÃXý,ÏÐ`É]ˆS&ôùqŽX-éqÖúªÀmj4 «º‰'ç¼›(K¼?®Û&®ã£Í bAxŠ»¶í±^¬Tç²eˆrnѸG‰Äìû\éýÛËvßÜï'‚›Í‹ N¦±ÏÀÔê¤Ç˜:¨+µÃ_Ç Ð\}¯ÅôtE²ø; ˆwÙµ«0¶›ðq`ø"=í+ÇDZ9]û¬VÜT…ÿÁ„q«‘Ø»ÏmÂÐÜ¢›7/2aŸ“¨sÃAYOçsx§Ù÷Ýùæá‘sÅlšÀÂ1àNÑO=)ÿ§/¯òA:`ð&5ݶj<ût}c91Ü@sÖ@s†n6ÄãLšŸ™gAŽò?ú¤¯ endstream endobj 2389 0 obj << /Type /ObjStm /N 100 /First 973 /Length 1362 /Filter /FlateDecode >> stream xÚ­X]\5 }Ÿ_‘GxñMlÇI¤U¥~h ¤ªí°êC»Њjí‡Tþ=Ç®J·0EÞÂËŒï™scÇvb{Xf-µ°ÌV´û7—ÏRš ¥Í@ðÄXáÈ(Ò™Eú‚€7´ÊŽeqÑÑ€,-Ýü§Õ‹5-2¸Xp—•QÕ…Q†2ËX¬2ˆÖZ& €ÐÊⵃûF 0°¶ ÁÂjâR/­Õé’Aê H+°Yk` Òt¬UlSk Ò˜PѸ4åÀ C-xÐÑ[`ÐÑ{`Ða°t˜šKÐa«¹CcèîBeè˜Ü¡ƒ¡cŽÀ c5ßCÇrר»¹ÖÀ°@ÕÀ¤”·pã£ÍðT²?ªÀ aöøòÝ?=¬x2<ˆáHò GºµÓƒ²Uƒ²ÕÃãZŽi-RaVm‘ÊÈ…p$<,دK7‡#‘ZÂáHxI$©È G*ÒÇã –ùcØ-º\G‡Ž.AGŸîpDVÌ=¢0Ml£f¾¿À cÖÀ cöÀ c.Œ`å¥:@†n¶°»« ¹ÜÜMjV°À$üÀžxß‹ì†C<ÕS–=õÕ7 +ërCpÂ$0èè‘:Œƒ‹„ÃN`Ð1,0蘑xMg$„ŸØ —ÀUkwr²Ûž”3CÙ~V¶ú§l!Çf£‰C}yûöíË݃ÿN¶I‚TÉ‘»Ò˜Y²6b8!GæA†Û&GnJ8ÀIr­Ô‘·)òT‘ü)îBP>åž.oÊÉIÙN‘WÙxéuZ·§W‡óçû›rV¶§ONËöbÿî¦üµÆ‹?~ßã‡W¿îwÛc¬·¿¼¹öc/þþn{¶¿>Ü^ï¯ß_ý°sñêÑá]9s%†[m,~ E¯®ð¶_ÖÄ»;µýqGýýŽÆ¤ÉÇüú ùÃöùí"Ûê„«4In0ç7I¤é•«Ðª–#÷UIz–<ŒüöÉ‘MˆûL’uѨI?w1jY“™ÉP s亨Z’¬ˆvoÉâr£e’$ã¶ò#ã¶š–L Ô7ò'GÆm5,égØKÜ’©šBfÉÔ@WFhx’dÜW=i…X¥šŒŸ¨‘ÁY˜'WFoCsf¹8MæFC’~ã:)ëã¶”L“¾ð2]W–lƒº&‡n˜ÖJ©¦•¼}Ë‘×ÜJž’Ö„Dû}+äv:‹øEÙÚ**ÿ,ÞÞ«tn//Xí¬D·íöD³íÂßôs·=¿}}Ïß_\þ¶Û®Þì¯BK}¹}»}·=>kñà†cK]”. kÓ@U6ôÊ& íÎïaxîyÙ¾9¼88þ«ëÛ××xùâpIè‰æ×î¤/4£ËcZaóÞ=úE> ¡¯¥©ã¨1ç7{ºúå\—¶»–x‚ø°’î7>%è7`ȱ:xŒŒ™–:÷,¹“ðL’%wD’³6ÃÓ–]8R¢%Éh‘|–Ê‘«¢N’18¢–$-Ò:6i%£Eò¿!rd´HS,IF‹Ä3™t´Q)²dôHm&#ˆñŸL’©Ñ&S6õ} ëšL èÖÊ’Ñ"©&Sú¹’©áh25| +™è0¶go|Yª\}¦Bý/“žÚ‘re_>é©Ýçæµ{LzGÉŒúГ܆ «¶¡¡ql*'ɱáô(y|®(#[#Nî¯+&¬–L oœš%S£3&¬–%×Aõîpú'æÒ" endstream endobj 2517 0 obj << /Length 1708 /Filter /FlateDecode >> stream xÚÝZIoÜ6¾ûWé¡2àyæ¾øÖ´IÐÚÄ=¥9È3œ±äHòRýï}©Y]ÄN:LÜ1,‘ÛÛH>~ÔÇŒYý·‹­ì›WYüST³2ÓV€UÖÚ¬uÙ<ûíˆd ,~uôüüèô%§™Åb¦²óy&(Ë3-He³óYö.ÿ©¼¸¨\{<á†ç8OhNñ!•ùïk¿ï|¡È_]—3w_Ô‚6Òóåé#”ƒAyŸÅIP3Ë(Ò‰¥›zfp¼AÍêút¯÷*”*਽Æ9p£?Ÿï{‡‘VïÚ?Än;.·¯ eÐKñ=(CÊÑǨ$ù‹»byU¹àc”ŸO$¥ù¯­ûƒPqüræ*·(ú²©½O_šÍmËU†Ž‰ì‹0º¹j³9æu~{ÌLÞ´ºýx]ö.ÔìÊeYm ÷M ÖM»,ª.f³Öu±á¢-jßU_Ö œ7øa¶,ë²ëÛ¢oÚqtÏJíb£+œB8:>uÞTVÔ3/X6e‰N9È‚SðÆâ'© 2¿jŸ½ÁÙØ” 혟·ÍÒ§DÞ_}¬³Ÿr«¤ÉŸ»yÓºPáºC)¶û }¬µw‚Æs´VÑÅV­+f!Õ¹éh ôBô—á_\gѳwC¿h¨EزùUé‚b­ 8“¦Mí™[\·Ñ¢œóÜ­œˆ‹¼<¦y’¨¢i[^ R»Y¨[Æ6bØw¦À½‡çÏŸÙ¸.£½í¡g¶â({ÜÌ>äJ¬ÐœûRn!VTƒýç;\`˜f•k½iþ@>œ£ûL-­#hB¡ G’ BWÍb²lüöíeÇù=-q'‘Û( SØ-÷AýSjZ°t¶’×¢ƒ­Êy1†zæúKò,¤ÿJc.iZþ´Ì%$(!˜KQœÃÄH’Ø­õ¤¿Œ6›7UÕÜ{©ÏVå°óûdYc\p=í7 Ø¸ oPÄbWL/CjêwÃ>õ9beBMrTm)§yy7êrTÐe•xÕ Ñ‹O¾Kãî²¥¯!½,—1¹p‰tH jK%Ô!c8ÝR"ÃßÙ}ŒÁçgg§V¥ÑñQ¿N¨ bϧAW³É´*º.åú),ŒèHl5Xfq ’²•Ä~~|ÂÎN I£ ­Áì\¨ CÁ*¾RFåêE—ÑD./”.lB™•Aã¹÷œa©ÿ¥‘WHia)À¨ÊŸ³µ§³4Òr L¦ˆâqêp\Ô… ø~$ˆô…22ŽÑ }R! @ÍQ™0b}¥úËÁ=Ah% øa¬‡÷¸–ÀÕ¶'îÅöDÄö~¹®ú2’ù&xõ0lïçÞcgj„y|2‚[]W^øn™!µ/Ñ·@]p—§÷—EhMíÖ½èDvâß:ïb?{Dê2´™„Jç}Èß–UêáÑÚ•¯ E»ñ][T°<ž&×u¡B]t]Ñþ9mþ\KÇ)ßàÑçvFO»-ûX:œW|¢+–1vËŸÑy γÇ1Õ‡bÏž×M¿5À¨õ¡×Æ¿ÆÝw0+‘AîÚÏÛá̬8 ƒwqÌ·näîQ 6ØC·ÑÃáDÁ‰ØÀ89‘[±/½šü°h›ëzê”õÜÁ¾ÒÀ¥qÊÁ |«}h‰khÒ÷Ñâ.9ôÊ'29.‰œ¨C/Jœùk!ñÍà’œàÎ'uº]„ ûªÀ$³1é„f·NÍ¿60‰K+(iŸT˜Ãn® 1d¦4P-¾\’ R=-cq$‰µ"øÁî Zíœ IsØÇ#ÅŠËH¦wŽ‚:•¸Ä€¥<¡¸”Õ&b­›cP5›TåÜõå2ÎK®IO­øBîÔZ,JSTå®èš¥Ý GT<©¥ˆ*L%Äõ©fÀù®ßÜ”ãF?£oF û@ƒJš&ì©4 M©“#ÔTP *E‹>@qϦBã#B½‚§%!äììT˜4R3bš„Fæ”á);Jõ´"ZJHjÚ…Füÿîn‚”7m–áÛŸÔ°Í ÜÝúvoi5Çp"al®5£qG«„‘á¢6l˜á ÁŸ)Ñ ƒx<ÐZ®·ô⯮Îî{ìèeïß(Ò?bv‰! endstream endobj 2562 0 obj << /Length 1490 /Filter /FlateDecode >> stream xÚÕZÛrÛ6}×WpÒ‡Ò3ŒÅâê7·Mœ¤—™&êSšZ‚%ÎH”BÉN<þ{tI¬vœÄ‚#y$»g àÐï `|ómÇe_]MÁéOƒd©Â8Éœvέ/®Š?z¼SõEïÇAïôBá¨ZèbpU(Í´ÃÂ(Á”vÅ`T¼)®//§¾=é£Å’`'}(~”Uþ¹ôí÷ËP)Ë‹ëzäOú‚k¥Á“·ƒ—½§ƒÞ»töÀ¦{i™A,†³Þ›·¼QÝË‚3élñ¾k9+èš‘ýt=-^÷¶&sæŠbóCž\ðêâ3ZÞµ 3V»BùÚ@¦dï‹,‰0‹¨œ;8k`VšÂd4^óbÔN«%A©„*ÿîÀ{Ho÷‚k&PgpØæ„#„9Cóù4:,ès¶ïçìÔò,`h'˜¶&ÚiF3m@Ÿ³}?ùÀ0ŽÚŒ`Xd‚㌩oÆ«I„Ãé<>kÅ”u}ÖŽi•|À6öÇ_Zå9æô—.“¿b;ñEÑÒ“Á]cZÒ.ªÒòþOmõÚǃ¡â²P1©ÌçÅe/ÚÜ2ÎïðdHÛȾwAÓæº„÷¡KŸ0½»`(Ci„B1d ˆØâåÓÕl1õ‘Ø:£É P¾hªáª¾9AQúHgsJEI¼p<}fw‡Í± "„L¹4^ûp£Ãré©§y³Lø“Ý×Dl¶YB¦xÓÝ¡™¥=)¶O~¥šªÝ¿"Åün'¢¼š·Ñ²:9)l™l NRn”²þÃbZ5U0ŸÈ°X&k¯ªYºº¤[Lé'Õ %7uì\”“j¹­§|³ÕhäGñ2Böý5~i*tøÝŽ–µì+ž\…´ô»ƒ?¹ ?ëÉ=äR£À’:ßR£qJH|÷»;ŠÛpÞ\eÙ §ÝÀ™£Ú ¤&¥É"éˆõAbáÓù˜˜çO<Üf “$¾`=®0iÉ0 ™Ú Hä wL+´ïÏæqã9|ŒgG!4L(È!I<Ò6__UC'Ñ¿šð'95¤@f¸8®p  D¾³'N!±àì'Oè(å˜CŒ ÂU’s¦µMç Ûc'ÎùÙÙ©–y¼¶È¸’ù‚LtޏœµcŠ«|ëêúÔjMX™Csâ0 Æa^Í!JfwôœÞ«çtÒs¿újéß]ûööžòíœ:@M*dQµÕÊÇiÒ8«z„Ém,VÓi'hèº C,WꪂæAC½4©E0¡öËuóqÕŽêf³´2ÕãfÝé¤Ö/—ë¶UìÁ”‹ ÿâ ?„:(I™I%Ho½DBì4U2h£Éb†hzèn|ÝÆ±e¹šÇšåõbѵœ·«uÉ0ø>‰í¦d‹6¸±>ùl’2i`j˜4ð=µ+íºG#&íJ=ŽüªªðŸÕ/ŸÂqÒÌöÐ3C8êÑéoF-Šp4¢2r\a)ÚB>’Zš–‹ã::’öšŒr^(dZ¨GÔŠ5ãÇ%!˜Ôx…ÐL ó (Z5™ÌGøæL¢¹Õpè+zHw7ùƒû Žˆ‡–Gõˆ‚%ø #1«˜5î‘ÔhË„VùÔPŠø¸â TàÆ:cŒ•eÆBNñˆòg<=©˜@ñõê ÐX‡¦˜agÜaÄpRvFíˆ/³W|™$¾>úǪóëÕ„t ÒQÃj­ î¡È^t„—õ2¦‹î½ÓœDÓe7"EÝÂwM,ؾLÚi(\'Øêu£­™”©È̵ºi­kk;iƒå‹&õ4é졾|ôý‡PåóßÎÃ]?õ_??'Ä‹²÷õtºG•]/×j¬{‘†áå_J#‚%‡ë€ìªg´ù§×xI†ýâocÕ…o|»i*ËßçÍ0 ·µ"¼È³eÔ’±„Ö­d•Ý®‚¼Û•f딞öÆæ> stream xÚÅX[kœ7}ß_¡ÇöEŸf¤I`¹à¶ÐBHüÐÖä!—¥˜†Ýâ ¤ÿ¾gf;ß6ÓbÚ³Úñ‘f4×£å6j*‰Ûh©‰}Jšþ]UôDÃ%#1»d&î&°’I&¥*ÓœZi,jjÍ%8XH’êM2\Ò“²KFÒî’™:A"¥¤®Í”Fq §!8YJMcº¤¥Ù“‡K`s©.‚Ñ¥»l$"®¶šXi‡¥Dì§v°ï%ÈZ( N$]LVu.¶jp‚ú ^(Åÿ‹mEàóN™&2,5ƒ1a5\Æp[u¬àn*6V?ØZÕq ËÈef£¸l|•Ùè·õ£Üä ê׭С~Ý ÍOö®.ÃQƒªæÿY\e³9 Êæt¥ºF\¯XBL+«n*ZM•éÖ²Ê0$Q­îÛ¦X‰Ë:V³6Rm~ ¨¬žIb.t»E,ºÝY C¹B‡@‡ªË £“ã £‹ËÔÜÏ ±[á~‚èÖiÞéÈFõ#µCÄqûVý¾ê)Z C-÷ÍK‚H4±xŠjjjq¤LSw$Ìh݉¯­[Æ ¡ ÷d'¬üäŽ*ðdEÉ &Tt(›îH$:’Ùa¨ˆÒÍ¼Ž’ Ë,é+7~@>¹lb%&ƒeÈ“ B55—1VclNN6˳tŽìfô‹´üü˯I4«•â¬Ùrxwóþý«Í£Gî3O8"VÍ U ç¡Qpy³äŽðÄÀÄÙÒ6®sd ZQ‡dBåÇÀ²åL ,#t’¸µÜW1p-yr05ŒÊ ‚K̓ƒ`t£Œvw̓A¡Þ3OŠ‚g.3è:RÉÖùb`¡8aØüO’—IEQ‚¦€¾ ­Y—ÕÌuþ+çXQý\Er¨¢>Ð_WJù.ø¶ä*:÷œ1°NÌ1‘ ˜gæÂAp¥\J ‚‘ä-l¦Í, ¦M•(Óf” ŸÁ*38Yl Z‚AyÏ5™9+Q\0ó4Æ3.[·‹fžÖ X1ó(˜M0ó4˜­¡yRÌè°ô³>á 7*Íl‡˜É{Z \::AÐ ¼ö¼%ÅÀ£šƒAÁ4ãa£3*ƒÂèð¥ƒÂ¬Y¢}‘ñ˜=X¯4mÚFÁÃæa0Ü„™Zƒ1!¼ú¦a*s ¦¡;눚ATa› Æá¦ÆÄŒ¨Á̹·Ÿªþ2yØ—LÎÿ:™ÐêûdRú-u”ñq1’CøZô{{…ç &&*P±é=ÊMêÑ% lã“AŒAÔÐz¿fÐ'ÞÆåál±G³ýÃÓH‡ýü$˜]ø„QÔ(@"ë¤Mé¶;௑¶50˜ç –À ÅÀ:ñÚ‚øO©A°Î¬ã“V©ã¸q zÃlY¥Ž+`ð†½aœ­õSÔŠ£o |”à­€¼5ðQ‚·>JðÖÀG Þø(Á[ß'x+Oœ endstream endobj 2606 0 obj << /Length 1809 /Filter /FlateDecode >> stream xÚÕZKoÛF¾ûWí¡Möýð­Eš4E/ÝSÒM®d¢©T\£èïìC~(j›Ôõ&!í{g¾™ÙÝ™‘ßÈÍg\ßk¾zQôÁ?E0+ mXe­-FW¬ŠŸOH±Æá'ߟ<}Îiaq˜©â|UHÊòBKRÙâ¼)^—ÏÚ‹‹Î‹%7¼D°XÒ’â—dT–¿Lnüfòƒ¢|±k·X2¢(+µXüzþãÉ÷ç'oOhà‡Þl/ h΋zsòúWR48öcA@XS\…™›ë€üc½+ÎNnY&`‹âæ ‘ßïxõâ5ÆÁHOÌwï7æÀù¨Ý÷3PÑ@¸9ÄÄÿ ÓSû/¨)'ô6å …ý︣ɰw·ÄÒ»6ƒÖÆ•Š6óõb)™,Ñ6Þ¹ê¡_cø?3,e íþß UQÊp`„çS”2˜ÒQQÕn¾\nÇaê¡‹JkÒyÏ¢0eAÉœà5MÍð£ÛvÕu„¾z”DßÖyÀcI‰È^ ûk=€ß¸ùrh¦½â×nš——›ª^N—•¤,>6RfƒÀ’Ý3·»vtM̓šY D}YW• ¤Î¨)j½Œ¨ªvUÕ.ª­–ÄÚy”E(²–¸ÖÀ)E‚¬N6ZwÕ4å„+.M¸Vƒe¶–`<ÂÝû—ˆBNO)!Ë}-!µCl>uKmÀhñÿ™£¢èä;ÊRIàL~Ä£ŒK²âíÏKi€höQþüžêAxuDLPÉ A¹5OQIÊï¯6ÛÎÅxŠšS<”–¯\W-8+¯c6í¶[¬±rçØsÕΗqÍ®ÿ­üÜ«>µ½oÍnô×ç²m¼èŸ>7w¹¢ ,Wž26©è|k‡ÅRHV®Ýì+ý£ÑÅ®¶_ 㦚ۡŸbOu‘Ÿ)‡]š;zž™ö<û&ÆoëÝ=Á^Ã0@pqxr>ª¬ýP² ”qøè¨·Û&j­xax''#ÛœBÊ—}djxÂ(¤v ¤{]rj½!’|Í )sHñɇ¬]îEœØâíávÈ ÆÖœË²cyµ@Õøì6ÞSá\”óe•æ ’qÒ%‡ÞÉ¥á ?zëQ/7Í6mì­{¯z” ¶ü!6ý—{¾½‚Fâ¿@y’‰iظ¸E]M.ív‡³ÔƒŽu½&Ân”)_†[pO:ÓõT5›@ÏÅ•7¥*¢œb×<ø’–U]»íûnÁáô &ìܸiªÖ5œ¾ò†MZÛïEq³Ø[,ž#Rz Λ¼nÓUl®\5ïânÕu{r뛋›!Ø_ã> stream xÚÕÛ’Û¶õ}¿‚ã<„;ã…‰Aê-ub×™´iíÍôÁõ%bWS¤LR¾L§ÿÞs%J«Øë¤Ë¦ëñ8Îçû.’"Ùÿïnº/ŸGM”À¿T¡r¹Üˆ<Íó<ê|týý"‰naøùÅŸ®/ž<Ó2ÊaX¥ÑõMdS‘æ:rV ›æÑu½Ž¿¯–ËÚw—W:Ó1l .¯d,á—UÒÆ¿ô¾û¶ÇA?ßU¥¿¼RI*Uììå›ë/~¸¾xw!‰¹Go2á´ŽV›‹×o’¨„±£D˜<‹>ÐÌMmôC»Ž^]Ü%Y&"Or9¥Yi‘Y&Ù -T$J›Ä?|,6ÛÚ3‰*Y\^Y)ã§»~h7ÌT»ª¶é‘Þ'ϲ)n™Š\§°$l¿òÝûK•Å$mâM½OØÑñ؇!î¬Ú柉4·»Î— Z^SÔ}Ëm×âò÷$9Z„éaGk‡õˆ¾®|ƒ‹‡tbŒÒÂÐ+¿Â•¤l‚ÿ;4•i÷åó‹è5-0‚Õ5Ê™À&¾i;FXú¡¨j؇1æQ´ÿE8§ÀzNëi®D–Ô:ÂG k¡3G–9Qó—wgžÙ&I¦NKθî½Û—gÞ¥ÇåB{ʶÔšü·óÍŽ Î8Bšia$ÛjuS¬À$¬²ñ#?¬“GÜþ×=Õx²Î*<µÂåé œ§RdÆÁ†¹ÈÒÀúª.ú~Vv!h* âáÙuJH›Â†©ÐR1»Û¶­™[•$rQ.³ÅâIjæá\«à_ó)Ú(áÒÀù¿çáQY!Íœ<ª\(©™G>X¿ÒXn”pÜr ž¨E¡K³XÙEY.|1T¤„ƒ1ŸQ*ÒŠ45礒r£(ËΞ¿÷¹X”¾(Kïof‘ŒQ$vFÁ$¤='w$˜«ºê‡»Ò)àçñ°„Ÿy$•Aò‘ÈùDe³ ²Ûôœ¨2nôCW5·áÜìýªóC]TðœJж»}4l Z5_ò`‰L¿.²ž¥õ wЦ<-àXy´&®…N-'=f"“fb5ê³Vój·l|Ðbé!ký*C¹¦Ús[¡F¡U: üØ‘ÂØüÕvoyl*ÄѶ9™Þï–=’ ö†a€“ÕЇÉ|†ø€eS4Å-*Ç–¡ ƪQøýŸŸþí}¶Ø5–«RÅ?ùáÛqßï6ŸÑù°.PF6G†ØÐ^SéÍH’&È ónÂ<˜µ#vœ,hÛyTúG4ú4©P‡5ÀR¶ÅŠßQÅCÅèXm2‹œÈ]BjÓê1(È4DòÀ çå§ê…ò8Ë¢«É¼‰¸‘r/Ø¥ÐM”Žéw¬wf/ȨZåÇì"ŠdKÐ"'ØŒö #sÔîžP0¸üÔ›jŰ®hn=ÃÑXhÚ„VaC« xVEØ€­YÈÒÑhc¶š|X>¬+º™A×B†‚áo™Hþ]³»Výę̀Àf¼t!Nµ™èZNoTôdÖéÇ<{¼ Ù_·ì%ˆ‘¯;Þ8A”]ÖaEˆ. %IOÔ©Ãe‘²i p”Å”èœ\³ù)”tÇñÛgÀª`ï„æ‡°Äå¤ú†!p€›]Í0¢’p­Ãì©­Ð@Ëð·MËÛOÿ°në@NOÁ $¨ò$öŒ¤§·»Ûõ19l ý¯»=ËÊhÀ¼¡hd´Ü‡*£õ!Œ\ÂA ¹FªpM ëF©0%4#’Þ×|¤ÿX#Ñ8«ó+_½§\' Ý+äì-±v¸éðÒ'u¾7‚ÑAÆÚ<&V<2XPLqh"§#Û¥1ã´Ñºhª~Ó3 bûÚQ£J‚,µ;ôÁ5ºÊ|‚¸1þ£”ûNõôŒW9$¢JƒÄˆÌ§?ÿõÙ‹—9“ XH"“tœ·#â#ƒÉ¸ŠöAZ‹@MÎ(“Ôžœÿl~UqMÉ›‡°ÒÜRÆÇ/ÎKI40ZðçÝÎ÷cj`QFɸsÀHN]òú£4À†ø¡ X··c¶ŠðUÛA¸Ãõƒ7'•ó ‚Ým]¬üY‡kZŒÂ‰<ˆ2DlLû”û`cY5%ˆ ôè 7 –Ôdñ‹›=¨ ØŠ±¡N±<(-šÈŸ‰áb·¦ðù;Ppa»ä21>YÖÑaóÍ9¶Çã|“vÕq“Oi”š´'‰9ò˜´¶Íp§f‡ÉCxWª‚ž`Ê$Ã)y.Ù>ŒÌQ¦{`ÑŒ± ѪÂþ‡Ô€IoÉ3¡¹fÉýú?eÚ`‘eŽ cÆ0`ŽÃvEsšŒ•!ßëÃ3[š¹Ù¿¸…I'N;JŸ1\MÓg _´ü ÌbŸާïo¿aQøHkÝCß°(k…ã÷«?Ä{šÒ¹H’l¾+1e´H\¸ˆÿ- ì N•yî‘•²ÂØ|FvU.¬2wÞñùpÎç4%¥Èÿë·ÂjšˆÔs¼w:'´”‘J”0*ÄoX9×X.SküR¤Äƶó7ÕGns2Š­ñò»àœV>@0ÅšEÕ23"“r>ÁÉ Ò+nvÇÜôôEd®×Sé¤P©úÿ²të„“zF¥R8—ýžö¥1BÞ}Ìøc«H'Däë(w"W9`6"uù}£Q¸Ð¡ÀTtÁÿ0ãåYÅp7h |%øðz—Ž*©ùd¨¤ßüƒ÷wìØY~:‘âx¿N¥ÔdÁ$ ™Î(˜Ä ›É_ý[Œ×y: ïþ¹¤›/ôåF$zÖ¿uq©0rÆ ;K„Éôïsv¨ë‡®‡`¥Ï{óé÷?œ6ó² endstream endobj 2674 0 obj << /Length 2821 /Filter /FlateDecode >> stream xÚ•ÛrÛ6öÝ_ÁÙ—P3 €w½åâ¤îtšn£<ì¦y€HÊbK‘ IÅööç÷ÜH‘¶¬ÝN&&pœûúæhOÿÛ»Ùô·Ní(øéÀ3ièÄià¥Qš¦N[8[çŸWʹƒåWoÖW?¼÷µ“²‰œõÖ #/J}'F©³Î/î»r³©Šv±ôß… ¼ÅR»þ„F‡îç®h_u¸¸Že^,–FEÚ¸q´øºþéêf}õíJ=zD$^ìûN¶¿úòU99¬ýä(/Hçžvî{@?Œ+çÓÕ’Mìk~™)ÍÆ÷’IŽ€:mB÷mUõÂ×nÆ¡›5õïJwÇÖöeS#?¼O­¼T¥‘éÈKýÈYÀƶޕÀ I}·+2:G“¼è²¶ÜÀ$q Ù0ÊŠw·ß¸Ø^ÃõJ»mQY<òº­sdD&,ô2G Ã5ÚR r€•Oߎ¶-x㦵žûsab·è»°ºéŠšžµòê,ö´ï…è÷û"Œ\[‹n7¨ÄÝa¶oZ$3LÝ/Œ¨±ÕW$Â(÷uÕm d1ƒ¼‘¤ß½m™ œç¶cAûj*i)Ð[Z%*þ8£ ßS¾6 7ŸÃ¥ÑXÂK¨B°ñ®7Bgak!ù5š–¿o<þþŠÜÙ)ûXò0 Ù®X–uWÔ]9Hâšål’ÄÓ`Î$h1Ê®AS1îíÖf°´ƒã×Ù Ží–ç-l»}¿ÐZy€ûí /"Ù<êA';9ÒÙ}A"Š{`Þœ¬°YþázdX/T•l€E{¢¢”à,úzBÛÍúGEܪ¹=‘Œ|ìð­ ‘I ¶ì·£# ‹ÅÙnÑÆH²x/)]]{i’«ÃM&õŒöÅÍ=-ŽþÎö–]¼Gw<À±\òpå…iÀˆÞJ\€SAJNW!¡r ý²–+ûæORv½Ü€ ä("ð´õâã°Â2Ôž(!Ð &/Zô\´ æ“,´6g Z$~-oíŒ(Ci¯v-!TüX´B:êáE§ß7ƒ–²f¿oj4ßÜcGT¼§H%÷AhÀ`>DaÊ™¢^ c舑ßþú=âtaó¼-ºîÉá™>âÈ‹O¾û_.€ À°ÀȉVÑu×¼\xwÈn¸F)µÊ7ÉJ¯Vyaó•HºØ^$x)·2Ùâ ¾YnÊž ÏAÄ{ˆš”×ÀN}ð¶â"ûNÀ=HIsNº¾eû^@ñdý¶¬#¢÷]Z;îQýÈø\Ëü~µñƒð2kBÆL#BÅâýØÓñL ÃGâaÜlùkÛ (¤ì[‹ !”‚vrQOaEU Û’¦àÂøyâkù›7ÇÍûvÔ»HÙÈ»ŽÞýØ}ÕS`#„òµ:áèÝ+Úš@\1@nUŽ2s/˜(¤›« où±¶×Ë ïÈy¬–©øÏŒ{QØ·#g`Ú@A§ ;š}Ùù3{ÌD²iDýpYÛ&öLìϵýîóí;6c3l»%ŠcÆeNçGþÔ BL180' M:[ÞÑõ¶íÙR`Û}Ùï®ÁpTbšH˧3Žœ©{[óöS¥ “ï vª·™—xê7Ê„ZÐZÈh;æÈYF¡§Ò¹~·M»·èÑ©rï)—w<)A‘œ|Ú†|-?fEõOÆ®á=Ì6 òò®ì©ÄM¡¦ƒŒ`{2ìã:—s8Κª©¯±„ ,8ìÊÚÕf³Ê²U,Jȃ¼SJ÷R$žÉ­èHA Q¥Ù8‚˜¡¿càh_89Õ[Žé¸™5ƒË`q$!U Éù¦’3˜”…8œþ®BuR7îµEŽÿºùDí£rùxÍ 5EÁÏ7ÇÁ¸¯þ4o£n¾š’¢ïÞ [±»“Õ-Áã÷|Œ‚Æ@‚Œ„7rïwTØÂV rnS®àìà \)n/p¹¶˜å¹9âÆoæþT P›ÐY.Pyº±ÚÅÄyàføL{pŠ ³&ÁH“ð)kþf_°ÞQ5øw58Ø6Ç–Gá£òÃ~Äu®ÜïJ. xÊ$w¬ÝÿÉ\‹ ŠŒbßÜr ›0Ìï j@ÎpÇ5xL.‚‰­ðMGÒöF>›@¤AŽiy{}Í^¦ÉørǵðHY(… r6Ç U)&€SxÀãyÞ? 0·õp^ v¡¯cëÈí\ÓðWíëfp}”øù¢bçÍ•?¾b€©e©úòPÉZ ½jA¡v+‡ûí‡f­“ä3eÑÁÉq¡‚êB’WÙ®§åLíšÂið$ÂqÄ!Wá1 or“Èíy[Ö º$&Ì`îi*9ÏZ8žµpÌÁvsüp4²ZUBØ…ì4æqÄy1©Œ…3ÖAìëŠÃ ˆ»ê­ŠZÜûÅÐKââÔxƒà”v=Öü8žE~zgÕ+nß5G~ ÐÓ'=ù5:„J·]f÷^žþê"/§¯Ä®FþŽ ¸¼—cÍí“rˆÞZÏ&ßÓnpÌÞØ=>Še<ÌŸ¼‡ïÍúê¿F܆ú endstream endobj 2599 0 obj << /Type /ObjStm /N 100 /First 965 /Length 1472 /Filter /FlateDecode >> stream xÚÅX]o[7 }÷¯ÐãöPYü(A~ Û€ (Ö>l ú¦î¬³Çº¿C9]Ûône×{±yé#‘")ò\sí’JâÚ5iõïšFI28‘Ìç–¨O€%fu¡'nÃ…‘„\ã ªk%-º‚ÀIuj$é˜MU¦¦&7¡¥ÆSc©™ÀfKFؼ¶’¬ ¬”šºN¡¤ÑË %"µ¹±K–H…Ô!ÕâÒ€4\G%QU×Öúù am“©H6ušÈØmP…Ô¦n~¸½ªK°ÑÇÔÁÆP×1l „Cá'™*‚dî(ÃGb?…Pë0ádš:ØA(]j‰¥LB-:uø1u°¨â:÷[»ë6*OlTÄðrâˆE÷ÇÊ„áW«Sc6¦ÆŽAöÝûÌ®'jÌ _lðs:ßcµÏ¸~>ØnwØíì8ÓÜŸ9Ón„£‡·™KVë§×/óùûËío«õÃÝþåf?Í•çëo×ß­Ñ|p/p6´Òìm¶ÎÞ B‡'ª¹TêÁŒÙÓ´þf÷l—ò¯®®_\aéån›q©¾öP݉'˜QÙ;ü'wůì§\yçMÍ’ûúSQLæ9{ðш¼S†‡AwÆûîx¹:YyW®u–«¾tw?kÛ-²Œ ˜-ªA0f€´ct ‚fúdl’àÅÀ YiÁh4Å7±"h¾Ó@ó‚KEó ºQ}ƱÁ^GK£h,øn V÷B…r—`0”zæ ^²IÐ ”©GÁfÙ p Ü4—¼TR FQðžr2zðžKvª—‘Y†À<ærðRqE4F0ŒæÙEÁ8àf/[Ùß²b`ã>SãÜ5˜A¼Mf„/–šMƒé&ÆTÁ RÁÌÒñ¿ ] @ú%Hnxò[Aî’©a ">Ñ÷IAˆ<+FäSùÓ¨~ å(‰Þ§à:„„TŒâŠ±æ”¨ø›îzˤãâò°É/÷ç¯÷ö›ßw‡Í½óëÃîb·}uwThÈdõ:0`"‚;ó½­÷O·øˆ éçp!ý.´n±­£×èΊ‚؆FÜ¢`| q¬œ­EÁ˜èþÏR Œªô?2b`gï‹”sŒêA· ôM8x@íºLoty„uQ°“È ¬Î"£n°³È`˜™œEFÁÅYd0'ÔEsB†·œèu¥FÙ–þvX+˜!GÁhÍ‚$3 愊¡Å¯ë ÝwsöÖÆ‹O7yû‹¤~ó÷ÆǦcãÏÇïŸû­s¡žýøS={ŒQŸë"Õ^‹”Ìtƒð–"· ñ?$‹ ØRæ ò#üü1p¬ endstream endobj 2682 0 obj << /Length 2386 /Filter /FlateDecode >> stream xÚÍÛnÜÆõ]_Aä¥`MçΙ¾©Uã* 'VÅÔîìŠ(—”I®.(šoï9s†{óÚíˆ i8·s¿Žü>Œo~ºåÞôç×Y“qøg…fÒ›¬ðšyë½Ïº-²ŸNx¶„í×'¿:ùë÷Jd¶¥Í®™±Ìz•F2c}v5Ï®ó‹êæ¦Ýé™r*ìôLä~)LþKº¿ô¸©ó×ëjNÏ$·BæEqúîꇓ^¼?‘±¯+”Êf«“ëw<›ÃÞgÚ»ì!ž\eðÍ€~ø®³·'[’9óY¶ùœï/üüú6©˜3ˆ —GÀŠ)WD|ôñä,ãÊò¤>ÅÓ³±} ×sqȶPÌhÿå|“ÉÈ  {îŮ̀µ)kÉfªE9K0ÒäU3„§gM¹ Ñ&þHÆÙ—õ– OÈ;ç̉Äû§áÑ)&¹š€G †Í% ,˜´EÒïF©íÝPµM? ÏÖ3k¦ä¹P¬Žx¾<Ÿ–Y×2k9cÐ/çó.ôý´kÈ:ÆLç¶VÃ(‰áÿ=“Å£„+’s/büœ3bÝ•…ÛX¸•>³$¹L–Þv_# !™%*_TÂ@V7š|k<Ø€p/WL8õ©|»^Ý„n×5ÎÄ‚q2îƒT Ô”×’q᧠Ȧ°Œ;ý-3®1ŽébB–-¤e¾IÂ5Ú$)&dÚ ïì·K¸F ¦Š ëdP-ÓªøúŒk Ûò/ßÔé ÆêɸFæôhê ´ÍÞåÃm ºì¹¥/òYÙcË^A—Í5D‚SYä› *]¾^áï8îrºåòyhÚ!ô4©â±tg\šŸP„üHx~ㆷévõº™‡GXÐñk¥òËa¤'Q›Ò¤½ʪ sš-ºv…ú=4 ¥€DÁST»û½¦c{":Ó…a7ÙY²Åxéû‘8YGº^ÅiZ± ‚{û{µ8‚¼]˜ !ûWI‹Ðz„Ò.ÖBqìÛU*j`Q á¡x2œ‹YÛ,ªå1¤ž9·!®mPûˆæ©ªgÇÐxåñ–³úê\N³šz‚_&”û—Aæ îz¹/s„Õïó#š3%LÞ.p´d­¸°g’´’ŒÆÑÓQ°EZ¿-ñ=žO'‡–Žl¬ C3«Û­ ·ª†VûªYÖÖ¢b`œ·ë0äqùý­>‘|™V#a1¶ìžˆ¦~мó}¦#:«ò_ÉGZ$öAX™GW|‚ÕøºB·,xþ: tæP°„rì êhIi ¶UQŽXû;¸5B l ¼%óïj’謬é\†h¬ø«íþ³Lb ùŽí²¶3»q@I@7kïHò(l)ó1ÅÝèëøÚ!•ÁdMš/d…­¦ë« °’à• T$4Ô5ÍhUŽyï(-j—¹¥¥¬ûö#T±cú¼º ¨qaUįôÎM˜ ](‡ˆS%Êp¤½yX”ëz µûScý:*6Ñ ac±ÖQýð=1xV#é°=ݦ3—ç I3§­zg?”É,"”1ˆ].!?9‘*DË$“ wa8wHʬ.»2š*À9%„e^Y€ÁÅo /Ì4’ÜÆ(wgëÓŠˆ}ø¸Üä¢ºŠ¦ùD›ç}ŸL·ŠÜDçÔäœ\l±ÐP·ËŠl&á¸.ܤùXx›e°!LFÊÒbHËÑrc¸ß5”ŠŒÏ“vÀߊVÐiék±nfI'ÐoIbÃrbö)Òá•u5”7õx-„°»h!ÇÌÓ‡@@Þ’ï¦Ê*ŒøSPÕ²BÍ’]ÇÛ¨tMÇSÁAÉLŒÔmkèxž|>¶Ñ&ÉbÃüÕ1÷I1J«–›üòͽūjO¾0¡ µ‹CmqÐ4v}Ö†[ùô Žf6Žf6Ž{4"£ÉknÊlišÄ®£uÁ¼Ý}ŒCÝùªí‡cl—uŒX1_=a<ÖÜ硜áü y_üë$øžÕU²Vš'н:Ly°ËÙP?ÑÁ¶ ôÝvcYó}\{ˆ·ÐëÓ M¶çur÷(©¢kxŒSuM¥ .a¶Jáæño_Q–+(!„’/]–Cˆd„åOñô¥3NM×F)ÖV§Çºª¤wŸëª¬æï&éWŒ+=!Ã:fï§|í‘Î3íÌt¯Òï”iÓ¾|Hè¶0NÇ«ãßîÕCZ ñhJn­eÚˆ}ŽSe¶“í_˜k ¥¢*¦óYi$,ý]‘Ú€ø^:§ «ý‹<õH陣k_^`ãbÒÆ1¾¦ÀH>€•/ÎŽ¼ë¼¢ç—‡Ûj¬ ðà<ÄNtÖU©¥I`«ùX"cÝ5–ç]µ q‰õ3U&‰ŠËs–>Ò‘XÏâGŸªâYˆµb$§JÛTïàצµ‚š—kÀ0´«Xg¯½±è%‘äPÌõÕ’JE˜•Ï2>’ŸG¾öeÓÓ´MÝ@U\|¨†[úŠOXšc'»4XZ•cO“>vÚñÌpK-'OE`ˆ%,ì–³q?QÞб‘f’¹È©ßùÑþôƒfðÍ-l{˜|^oP>Ú¼­ÔnU SU ËC» ø8õÜþS¥þóêÔÛüœþWÐA¤{Fÿyu ­k¼Í£`ÕðŠì¯íèýöÎ)–&–\êÁ`,iX…Z (±êW´”Šÿ ¯VÐF“Øü¹±wŽÊ¸±xNàgmƒÊ_®Wq1¶øxmŸÐÚû¦qЦiò·£‹~™ºUêÿÔý\Å餸hy_üpo2*íMêsqEä¡Ë(­ñi5=/ÔøÃµå¶Ú‚¥¤<³«˜×¡LÝ ßk© Iïw0nÕ “f.Ñï(Â@þ=Zý ü¸ææa(«š:B‘“BØ»~–ªrw¨¢wØÌñ"‰Þõ0î5”® ÖT!òh|t?ëDÀ¬\S~ä27ñcL ôþÿ«6‘qA¹êvFIàL?R>vî¤Øœñ8d0à {P©E†õ.¼_‡>å˜ßmÍ4>öfÊöÔ4Ž ­ÿ3hC endstream endobj 2711 0 obj << /Length 2318 /Filter /FlateDecode >> stream xÚÍZKsÜ6¾ëWðfN•!ž$rsâK¹¬×VjŽÔ Gà g(“)ª­ýïÛnrÈѬãGĤTt³_h_úI‘ ¿Íí¤ûöu´øqÒåm”z#¼óÞGMm¢]$Ñ-__üp}ñÝOZFÈÊE×›È:ἎR«„u>º^GïãWåÍMU4‹¥Ît Äb)c ¬’6þ¥-š-MüúP®‹ÅR%Nª8Í®¾øÇõÅÇ 쑃x“‰Tëhµ»xÿ!‰Ö@û9J„ñYô8w´Øí*zwq49>І?àùtàíë3Ú”™Ee8Ü ÖBgiÈIï9ÏhIE¢³SŸô§|úlm_ãµ剂¼¢ÑýBeña‡o`ïË⢹$Êö\áð–º°7Þ®ü5‘¦hIX·íÅßåMW®nDyóJPãjÚêŽÚ;R´"IkÖWv¬·¬*bdƒ¨“ºz™¼Ê«ê'‚±äÄ çm[Þî Xºµ¯}K㮸 »¿Í޾¦At ¾¶ÄÝvhýþ–øÊnKãRàFÄ×Û¢)ˆ¸ËQÊ#Ñ"¥&ŒJ6ŒÕ{zóŠÖ:=˜Y3_Ï_²ÍÍ&_¬üêå9wMlÒ(]ëø]±}ãGá7¥Ü(g¼?îä<·³‚W“I(ªg¯&s"QÙÔã¹Ñ«q™0rFôjR%Lú' Wã,„ïÙÑ+ªQêyЫ1€2ÎùÆ[Ξ¨H0´ÑÃÏÂh¾_Ó0ÀÕº û<Œni«#Ê.ß÷èzœl='c? tÛº-hpØä™©E´²„Y*VwD‚@oŠÀÛkD :# L€FÎ 9r !âaÝ"pi$*/¦öÚÕ›{G´aùÇN}†ÑRADŠdÆ^Ìû­? ˆ`¤Iãî«G¦Åµ«šñúš¨ý:¨«œùÓ„Á;gÆÉ} ] $r¦õ1C·&35MUkDl4XûIXj°Ô1,}Ó=¿.5\*Á}ɸSžàRÅÅΈ>Æ¥r„K%ãR™Žq©ìq)4îØn (¦§˜³®¦r¦Ò‚+`*˜Â{9uGÀT0%c?þ_„JÀ4ë©Çt@¦z‚LÍ)2ÕO‘©iömÈð¢0Î?÷*©­Φh ~Æ“E­3á3;>ˆú €©VRètF`ª•FÏ Lu’ŠLÍLµ”ÇMšÏçĥʡÒq© ZOžÇÑ,©Òóe¯ÊŒH³ìÛ¡¨JSˆØ³×ÿ¨ÆjûÍP@3ä´·Vƒa àÓº !¬_ﺼ+*‚+©Wõw·ÛñDùŒ³+Ä‚Êɘ÷W:飡uM[sKÝ€×”KPQ8ÌKV2A©ñàýä“ßs–à]ªïYè˜é‰E§îy®ÿXÌoa³ »sݬÛK<òrñª* ‹~ôÀVÞþF bç†Úáˆ4P{,ˆ<Þ(ˆîH‚s É“—”xXž”œ¢ã0gÉp¸ ­ãùtÚ‚"Œ' HiÂì@{X·ú!Œ¨ap¢ãX^`gT^$ ÷“ÏÍ¡5ɃKž=º†OÓz×G½²ðO{¿ûIfQ*|š$@À·è-ÇM΀Of;ƒ%ÐDËûÉŒ“¡6;´TÛ@ì @Éd&€1'Ä+íáxÕ ãUÙ¬;ðs¿*Bq9…þúÉÓ‡Ê$œf‹x &œ±FZˆøtÀ2Á %‡Àð ð¶¨ò…–arahwwˆ‹!Ýg–¿´ù-¦næãzCÏ€|±Ñ t<~m©_ò“hÜ—myS1÷¦©w'޹ú‚_¥8Õ˜ôú*Pazø¦C©øÇñ—‹òòý n®‹®Xq»dÃËž-I;ʃ}¹Ê±î~R%ðúw_b…a5{ J¸É໥<×eûV]˜x«†«™¾^°zZuØDÓe͆/c4Dùîè‹_õ‰Ž H^Ÿ–ØŸh™,(-ü¯¶ò^æTIu X eÛ™Ò÷Ð ØÏ5WÂïŠáx?Xø%÷9:6Ons¸–júš vŠëlÔݯqN ê_¸£*ìqÇ~‹‰‚s[¿„OÈ™OmÉÒ{aŒ¶ä°KYX¢Òð/<Î ‰«”,=q¼(ZX¼Àf„´—¦,áȆ¥6š1hÀ|z¼á+k¦$PíËå[tæGIC|Zi–70Ááê3ýЙŒ‚Ü€D¥q? èP0C/$ ³¯—eŽi(1 Kæ€XBŽgÉaGÎ|ÇÂzUP°C‘[•̰ j'2¤1(}BèˆmWÞn‘Ð œ…¸-q²£Å×Ó_vA¹³¦ÁPƒH—CwÙlB>9ì[Ói?}BüãÒ—4 endstream endobj 2741 0 obj << /Length 3276 /Filter /FlateDecode >> stream xÚ­ZKsÜ6¾ëWLe¡EHú¦bG©]ÇkkkY(4b…CŽIŽ-Õþùíøm'qÊeh¼ºÝ_wcü~úÁð·ÝϺo^nêMLûQ¦7Iû™É²lÓÚÍÝæ_gÁfÃ/Ïþ~svñB…› †#³¹¹Ûhã›LmùÚd››ÝæW謁½­l{¾U©òàÿ|z!ü££P{ÿîlûm‡ƒ±÷òTîìù6 LyIvþîæç³oÎÞŸ…ÄO8l§~¢Ô¦8œýú.Øì`ìçMàÇYºùH3hûÀ?´«ÍÛ³ËQ² C?Ó:šò)?Õ̲ñ5ðFÚû¡9l}®B¯ïŸ‹é& ü,ÈB\?Sf,û:“Ų$JqÉV©ØË[‹ ååUÕàÀGüÇ¢vt·Â£‰|„d™ à`‚Ô»î—g§tvâÎ>Vyae ¦û{»z= p]'\ؾ¸Ø1–_¬ð³£ØWÚ†Ê×±`ÿ®lmÑ7í#šDêÑÁ?JÒâéIÝc×Û „ÜoZþ2"FÄ5ŠSÛŽ„•½ÿSžî4ºÝô€O ½_jÙ²¹“`¡gWîéØÐkíûì?0O¼î@rPÉLÊbjIÂðžãš$õž=kN°¿ Ñ‘ðe±g¾aÒ©Ë÷Äð ÎêÝœCàlx,/pæ}i?HáÍÊî™\|y8Vn·‡#‡‚µkVxÍYò;.ñÁ•Ü\¶vâÒÌý•PR BöZ:,$€å€$3åõ Y†ÞÞöØÐß™’ïv­í:¦¢ê‰jEÜ;y8¯wLhQÙu]Ö{î³µõ¶½ÃG/VÿÙ´rÄL¨ìl%GËE&žôû¶´Ïd6ƒ‰ÛÛu~ž­YÈмë·E~Ìo &‚9WAœ ÛH±w€FïKwN¹' ƒ…Ž¿É^NcHÎ{&VÎd’aÊ-COyNhê=º`ö ¡/OÝ ²•G^w°yÝMåLìïñ(Kf.eé( ¢/ã7?õÍvg{p[BLœxhž(ïƒ.[ N®·õTã8§?ÕxǶêÐIH9ñT98‡Ø‡Y(öïstNƒ”ë×baËi ;#ñÚN”e†”ƨ…½\¨ý½ƒ’²EŠ–Ë¡9| i:"¤FªCjœ»Ô`¾È€E;n"ƒ?" ÜÛ¶¶ý„‡z7N®D žŸøí8uf]ݪÅöÀ×þÞ_‹³Á2À&.Y&#PvÚ{cï,`va¿bcÞI¬ [ {SÒàµC\çeÝ Ʊsâñªì$-a\WÞ1o!Ô‚˜’³¹R">ÏȲí2ŸÀÁ²sÅ;ÆÂG«yŒÐ³ü<ä£)}L'Žh»–‰£µòÞ6" ÃÆÎ"5I]6Vns¨AbÞIëê§^€Œðœâ&…N+2žœÁÛ]ØÔHÞ¼Às Ž ¬BØÔÜÚ5´_q:Œ˜ä_9É„“ÿ&XyN»o^žÁ¦z–‹á.¸yd"ÏúUaì]_ò®£÷B§9"ï4C{¿ ‹0}j ´ˆ< V¢xP`)È„{ÝÉ·¶sÂæýi7­ø}èmÝÁ†xj:¸„›1½ÉåE‰„:¤Ó5nÛ¦g¨,šŠIx9¢(ÆP†»<ð;[ íá2á¢I&XÂúq¹¬zQÖóP}£†S2ÇWò‡'Éϧ0s}+£œçW„BƒðÌ“L,e':¶;P"Å@àäö$«à4º]ÚPT¸Çö NÜ'LGºæ®êpähE®Fœ¢@i‚‰Âu„cµA?å¸R‰^q«tX8J^óæJA­¼“ ÁÌ ÇX){àV¥ 1œ˜1-áõcb¬üÈܵrP׃@‡×€„™ÄSøš2 Û‚´%E±Ø{k)‹‰ Q¸Zê‹NÛ?Zø9íC¶ã&äeÕÉ9×53"õ ™²”øBå3SnÀÊMx"rÕ5¼dTs0Ws %JZ¸»ïx ÊÛ½m×£dNw‹ûÎÝÝ]~ªz¦Ž[ÑedÞ Êå[µ90”Àdx¼h¹·ùŽ7£H3G'ã †®^½•3l+7Ì}ö'i×xI”hàX^H#­ ‰ó¼ÁîxtYq%:õ0a}€=¾´*³@BO6@ÿZçrbQ#1iæo± ¼òš²WpIƒ3{±YgÁÃäw‹HŸØ„;]–߯š‹ï`ñÔ»câ‡s­aäd¹ËWB×ÍÖ9ù7ˆ@O†ÉAñÛq Äܰå÷ ¹R ŽÙ8±N!R,ž'*eñËó‹'î˜E6g´.¶x|^î<˜¾»p° ¨ñG‚ì Á—iáçA Ì’Å o™öSûJ'¸‚¥ï\‰£…‰»l ›x_”e˜¢>ù #ŠB_ÅfŠ¥pÚâ7 5ù C‘î úåbÆož 3ÚÊ(¹ŠW—#ß×;¹÷²¢fà]väçeîêðÌÞÀ{ÕÔ[H\q’·<á’ólÛI6Ž/FÙZ^nÁ*o[»•j!ž´š›É8* ª˜ÑÈ/}&Üpr ¤²“)ÜÔ}ä‡0Â2Œ¡ç´v‚ý ¡Üõšš“K\5äÕ@«âê¢ÊûS+ÀŒ3°¨;üíeÅêߺ·6£Áò)Ý ÷Ç=¹c,OÙ8Ê_ƒawtÈoeŸ-•¯0ÌWœ;€#ªTƒ‹R|5fÁ$‚F€-gØfš_êi~ #\7=$0W„—“7SÆ.…úZn޳yPŠŒ¼þ`kP­'%ÉÉeFîìÑ&“©±3öÁÓbjƒ8:0ÀNÃ1#îÔPÇ©Iå&ÈLSå{Æ÷‚³8 HYN®yy}%À$†ú®þiØ ÷ºÄqqj9Ä ·ñÓão8l{~¦p±rò‹¯­ÍÝ›Im?2«éeÎF?7 h«?ÚÑ×€¶{düܱŸ¤jƒÈ¦“äë€;õ0=ÜJ%©<~ajz9ò]Oћ¢7R2bJpco}H¿Äß8Ða8m@œÐ8ÌÊoÁ?”†Ç~f3GaW8~™o_:ò~Ì NÓø³qœ!Gy3¨6y|êàTk:¸ Ô·ŒµAæ°†fÇK¬…kõ©_tr.›–A«#`‹ò/Ö$•u)û¯‰Öü— *‡Ãáà¿Æùoâq"ÊþkÒ¡Å5ÎcÊ DòرÄ—z®+%ÄC‘ áYf‘€þ¼Ëþ"ï&ÌxÕôã‹ë`Þ3‘ÿ˜PöØw®¦$ý@«AØÜ>}áqwò¹f ™(û÷N5úMðs “ùI<T=ÍuÌyp²Í'U뀣ð@µI?ã¯Âûabp§(”*ûõÕÈõõS¤ÁËzŠ4©¤^Øx=¼7bïÊVvŸ»ÇE´ÄÌ È‚57# Áƒ‹€™…×Ñ+x¼ùÜ8ÑRûÀS‡OàDË«)6ÜC(TÙpÀ`ÇÙ‡’´Éã«ÿ·BcíîíÌMÎ}ájÿ ÀŸ6 endstream endobj 2752 0 obj << /Length 3614 /Filter /FlateDecode >> stream xÚµZYoÜF~ׯàÛR€‡&Ù<õæX‰ã`³ñZZ$€“Ù3C˜Ç˜‡ûß·®æp(FŽ, ‹ÝUÅ>ªëøº8Ÿ,Ïq§ÿÝþ¬ûþÕX.ü‹¼ÀñÓЊÓÀI£4M­N[;ëß®µö›‹on/^~§<+¶Y·;+Œœ(UVúN¥Öma}°¯Ëí¶ÒÝåF%ʆ œËg{ð'ô½ÐþO¯»ôÈ ì7cYèËïFžo'îåo·?\|{{ñé£õxÓðAâÄJYy}ñá7×*€÷ƒå:AšX÷$Y[Ðv`ýЮ¬›‹Å’ËsÔM=\r¢`õ‘ûÊIB^ñÛÖ“*»Æ•f—~b?2á@»K?¶5Sچ݇²m²ŠÉeƒ‚ƒÞÓ¾}̺¬Öw•=²…þÕõ‚F÷Ì›òÓ(C ðœn(Q̼þ«ºo_½½†§ç°ðÛ³vmUµ8ù=þÑs·¼ P(haã)' ätò±«pwJÙÛ.ËQî#íoè_0¹øy_V¸;Øy§³A3µÑ÷ÜxwÍÌ>op†¤!φÕA`ßh¿Ñ9ê©§³uÁÚøŒF8ï¾sa} ñ"Çw—3$†²³¦ø³£(;p¼Å°´9 yf°Ç<}Ç'€¡ŸJ jQè:‰ 1P"=ˆ=Gž¥•ÄÌg‘ñó3É•iÇõŸÄc5Ç2õÿôlŸ—|º¾›DËmË~õ¾9Ýù+É# `†p$6¡¢qàãw~ü÷¯œ¥‚9øÿ}– ÎîKÎÒÌú¹Á Da"Iv·trõBrÑäÊÎÑ¥0tH¦ æ™*™2•ÉKý"1‚Ð);Á[™¾,1…%©°ŽE“‡ç’ŠŠœ ï”T0¦YR‰)©DðäÍ’Ib‡×§èoahü@2 RÌDc/ `*Avqþ~)ïcºÇ'f ¤÷¢VÈ¡8LsÊDx„²Y~2BU°ô–_眒‚™¤s’ÍD‡õc†Æ"ùͼJ‰I×ÇÁØNÄH Ç\:®ç† ÒШt°+Xð\óÃ1Të=Lv z`¢¹v´n™ççD3`(KHà‹ð­sÃ-êòn:žøÌh¡·ëÚ[¡=b„í1[Íj–êÚVñ‚/Út¥b6 /eXýðì‹ÀôdÄ*®³²áƒæÙÃ(fŸÌ¢ŸdWuÝ’2C…YÏVêG©½…Qîø9t‡5‚VÏ …Vš5{¡ž¯†0Z#Ï\grºMçLìô§Lµ–ƒ03‡²—yÆ¡Ýôº’@#ÖšÈ"_¯Þ«é”„³ì”Dà}¶­(ª%¡Da ³1!‰‚? Âùµ¨svf.·†‚ëóè8ü(P&óìLe„)r=û–öˆ`çõ´CÄëÇÚÞv”ýÔ”Â0ŽÂzÇŽgi{Ÿ!…Ï¿pEÿÒk>b²ÄñþŽ›~Õî7•¾Ã¤«gã®ën:¼ž·n`#‹p? ¼ð¢Üp½E gÑ^žG_Ï·9>t|{l)ÈH¸ äU2ÃŽŸàGÂo÷ܨ_d{ R°ºƒ€1H¦žŠÎ-àî2Œì¬*%=‹ûaJæ äqŒ@˜"ªöHÁųN8xž ªr¥ìàÙÉ™|bä½ù6ÉÎLÅ€Çí¡íµ‘¢ÕZÖB¬[†ÇºbD$´ãÂA4ÓTϬ‘CѪ ”Ráè{P @e½4`J:öÈöpßÖºÛë&ÄKmÁGÆ«JwÃDtm…Ä×ÀÄœmE„¥ëÚn&òõ3ÙR‡Ay&!ë_- ¦gcÅT>lv-)~¶¹ÐTo“{® à5)a‹þ½uGql¿»N"&Ÿ ½pÏı§<xçúžb ºA@7yÁÙ1¶ÇlY èKúx˜Ø<¬»;ƒ‘Bq eàT ±1ñkÊ+'¨Í‘p(Ól˜’¾2b4à¢Ï‹.gÁBùOïq®ÖPÚ›(e‚ŒpBiÞó(ÍLjݰ ®õï%g3éJ¡×›åèLî@½b¤99BÄN-"¨c_©HtT…•Ëgµ:Atv+^üÑR›q –¡70˜7˜ã\îÊ5ëtw¦â„¨;p‰í4Ý0±wcUI0Z^ö"ÓÊXS´ˆÏN†•™+IW•ˆ–‘œ‚ž,Þ˜¦S$ÇF¡wÙXáZZâZÎ_4PİYP9eÉÛhÔ²R¹œçpU_õÜ«Q=Øf³ÁÖ¤ì;“ËŠÓÂWü‘ô¯¤/Ë·hŸ. †âðX#]äÀëMáh¸EB•¥¤3T„äÙR˜‹Æ"8ÏL‹jd¦!ƒÝƒ.™Fðh`°”¬šæÃ[3 Te]ë¨ Ñp0ÒÍ»ÉBÜp>7váàÑ,]Àb ë˜'²x.dM[F2‡I©Ì»–]ÙLdk„1dn*ò¸¼G*ã®Ù* دm"cp îÕÑÚš\3µ(³}P¢ õÞT[q—ó„v_p^€®dóa¨tðúcÏ*6)1=B=߿溴–Ó›°Mq?Âõ¬DÔ!o;¶£œªÃÀE®»!d»œ]U°;6Åh¾ûéæí/ÜäÔ""h?ÿ“|@ÇRûÇ,gæO7üüå?¿¹¹æÆ.«Ëê‘Qöùè°aJ2¼8ô| +G2 ª¦Ž `ûÊÀ›·UÛ={¿cG%Éàõ×ï2‡ÁL9,‘Ï$ü²€^SÈ3F£ù+’¿€¾Éú–„h•ø ½0÷sd®Ú``&šê#20·qéÈ…ûC¸¸Ê‘N(ŸBæà+VgÃHÈR ì"]™¨EsG7˜r=®bkæÉR¡Õé¬È¶%^¸©ÂE¥šè•HðçWÀ®³›8Ũ”ʰÌ?2ê@2–»bBæ§°êB)\q+w»~<ÊÅ1½Y)‹OÄ¥Ô‚f×ܳZ~À&_¹"Þ¤þ>û| €¨°Î/7eDDù°évù¦i7Xû°ò‡U#/pâèì»m­|·äƒf ;`ËF¹ø 8ƒWÙ¨¡±fÔ@žu+ÑCÏôRÓM†y¥ îÊK×3–ÄN.¾Ã6ž˹0·ÌŽrÉ öO•›ZTL' ýÉ?àå¬(˜(Ei&Ég7– dTYéFËÏ)4k$KqS&ÊKÏO˜fÊZ|UYÍ ¬i`€uš øœálb%^j¿—ƒ'.å:xêS¢ø€$º‚„3àr>“Ô ­÷TMãö«Bn¥dó©Š´¶þªa{ñ²€ñì'õ}ûØ!†@ÿT[‰á]¿ì<ެϕ° tÉ|ì{†)ÿ éÛqÏß÷—å—€~OÒ1¿ÐCV’Oóp¦Ôx6j&ÖN‡”ú<§Ê|×>Ї›»’B‰ì .¨š…¦_,7Ý,ý045€ž~FB:9¶áô‘ê«ÀqÐqß#éµ'Å<Œ0 þ Y‰°¤ÜE-apn¾È£7r‚û¨¹-‡.ëJBªÀâ U‹ß­ž¢t’ýH€YËtœÚL7eŸ«7H{x‹pSûU…>±~90Ÿ  ]¤}‚¤tÒ[3œ‰ÇÇëS¤pŽ©‡_¡š Jò –hE€qÐh3«.kÂEÆ? p Zªá¬>‰58' R"2g< ô\×–Þ©<šK¼â‘u6]mÞbùXŠ©u­°º¢¬‹1Åø´XëÊžL>è•ûQÀf‡ûÄÎ6c ‰äÂÉâ‘—õýXÍ‹¡x·øü±Íú¤f)OYà ÇÏeÄŒTóºùáE­ãëüÇG¸å© MÎŽ$€ÆàPë`@®ÿxA–¼¯3ÊRà ß·ü™2Q3±²‘µqµYö¨™)ÐZ}kh”Õ7ržj:A…þb†çš 7K)ôžV~OxWæ"gÂBfªZO~—ðííÅÿÛbü endstream endobj 2766 0 obj << /Length 3798 /Filter /FlateDecode >> stream xÚ­ZIsܶ¾ëWÌíqª< î¾9–ã8UÙd¹rHr †‰e.‚´¬zþõ.£‘òìry!v4½|ݘ6ʦýíªzõvÓnø“¨È×y¼IóÈÏ“<Ï7½Ù6¿_›[è~{ñýõÅw?„j“C·N6ׇMœøInÒXûq’o®ËÍŸÞeusS›~» ³Ðƒ üíNy þ‹µŠ½Öôÿ±ØyoǪ4Û¥½Lmÿ¾þéâÍõÅ?ŠèQÓòQæ§a¸Ù7þlJèûiøQžmîid³²ôC¹Þ¼¿8!9Û¨Àσ\!ÉYÔ'›T‡~3ÅE[A@Ã}U×XR^1 ¦9ÜŸª­òºþt%ÑL7NØí¼ìR.yªr¸ hk;ôÕ~Øõ‡ý®ívý6†uÇéÜEqè¼ÄêVTû $HV&¦q⽇»®ç­Ã]Ó˜¶´\/n‹ªµÃ|¶Ä…H°§ñ 3îºñöÎ' s¢A¢¼ Xáë4„¯öƒ8䉰(ÔžyØõÅî¦ìÉ«C¤ÊuêÎð_ddàýÄÝwr§/·»$ϼۺ»)jèRpÒLGÞU7¶x *N{U~Ú’ •5pl¬ –ûö…û`#¸§KãAD,•äâ¡Tµ‡®o¸|?µ~¬P²°Ô˜‡Qˆ˜…¢#—?¾þíSÃtì ªö—Ò‹Þps»ÚÆPªêl÷w-wƒ ~Ä{U¹÷3m£ƒÔZmv©&oóW êT7«ž8ø¹h‹[S"ßxM9ì2˜º¶ëF £,{cíD)Ú½ù+PÑg#3P¾YxàÄx™+á¹á«A@A¾€ç¦äÚhIªÃ8ð,š¹¡Ìa„{©¹Ÿ¹†&.ýW>X¦@Òã'N »{rì_Á6ô¯»LJšy|z\]ÎLE:3ÒÑá`n9ÁcÞŽ}1Tx t€ã 6* ÝÙWÜ9‰*W`'£5'æM‰‡‚áßÃ~8/ÃIJb3qKg±‡²ŠÍ²ïá)º¤eõêíì¦Ò•²AËß`œ@¿A÷Äm:® Ž‹èɽwïaAãkÙwº@ìh»éI„i8ìƒ5OƒÕ¦Ø5³@CA·­AÒ'Ê{×r3[v(”æPŒõÀ•¦#ªJéÃ{¾¿3íyóª|MÆlÜš$üÎféÄÅ\ r“*Ëû7ÖLÖEé¶§ŽÈÐÛוXž >§Ú<ä@ŽB†ŸÈ«QøúD‹f¹Ë´×LyÕÀ-w…tÙ#;%ºá ×†Ý VJ™Ñº5 &`à$é²TEµÁËÈï äô o5¸.•é/å-œŽÜ$da9‚@ïÚºrtOÜ„.á&PG¶ºpǦvh!†`„ѧ.0ø@S±_@niÇ(\½âoöl$W2èé±i?¸Â¾ëK6_Z0ŽVó‚n/¸ Yäf‹×Ev•- ¼k7x–l¨TB[r¥û÷#•úJ¥_Èý›¶°¦²hÅ©FQä½iÁ <:Ý9ýdF,ÿ¿J,™Tª9‚®Øs«‡©„Ó¸˜^}2;PyX½4gVN´¨x†?Ï•LƒÌ®Šù|d¤ÒWˆ 4€Yz¬$~† °¢åžV`%Ìò5X‰‚Ô{U×Á 4”:ôŒã3­A”t©nA‰]S à;¬¬âC&–`[ Cl×H鮺½«vç—c˜’CÔ±·ò"ñŽh IìlÓ4;"ì—P…ÄEy×h»;îiŠ[qú„l¨q_›¢ç–ÉÛ7«… v5€vyØ1•L|‚;ØÕéhL´Àv ^–õæ¬úg„¤ä‰ƒœ€C•m‡*|_›’‚óz8ô Æ Õ€L‡A̺Þ:PrÚtb#lp–˜kdÝù‰Ç®Ü…×;¹š„IêHY"’`e ÁÙy^±? Cçß ]ŒÀ5n!×€gS£‰˜yVг¾8F@”¹;}Ñ<D—¬¢ƒ8:Þx÷Ê)ŒeCwK·h¹é®ÃFÀî]5•%ØnÇ›ûÞi2ãt´ìå¡ä`O%#Þ½zuyy%Û¿w& Nà Çzœ +Ù£G;’d#›@‰k&~““g= ™K;v®,¼]É-‡¾kd ÏÃH„Ã$n¾G/O%ñ¹V›öv¸#‰ˆ½¶ÉËE2Ÿ 0ꨃQZ‡1<`‡$ÊÕ)a0b¦º!®Q/Ë›ì¥zùRº/¹‹²Lp2C îŠp”\Ò›DB’K®œ¡}Ie”„âó±´€íÜ03kKz¿K"n$qIä:±P¹øÑ_AǸ!…Û’0å X°RtŽŽ¦ÁE ÔƒHK€ pÔ2>;Ñóù‚ Dž΀d¢»ð}Ê¢B{g‚¦Å0ÒZD'´^ËߢuÆ*” )zBFgöÅa‚® Y_{ÞpŸ°%Š(ƒè'öÙÐŒµš--¯Èð{cX²ß›½ÃÝÿQÑ@®ð÷4²ú ³wSµånèvNöŸ1}9†ñÒô©œ2d‘N?E%*2å vÊÕÀ£Jc÷}% +Ëm,›°Ô¤~ÜÊNk/ì¼w{jè€Á]C‡É‰À¹(ì¤/._7:Zã$³˜h?Nî«5¦$ú‘Ýc[‹A[ä԰㮘Í0·4]oœ eƒHÉ“ÉsaeWsظw¦ue1Ù¼„¨½2‡Ð4ð9iíέ,›YQŸ=[û¯„Þ4T±ڛóâûJg q“ô±'ŒŒŒN±7â〛¨®å¹i’LHáV¦™õ(½.A€å9ÃgMÐeàÛ$õ³ø$·ˆ®(ÑÞ­x„–«+Ê‘êP9Û•Hˆ”<‰•±K,ŠQ’,–‰ûg¬ŽÎ?ˆ¢/0;}¨<Ó·k{ƒ¤³½¿ÀÞÀxÌ[¨•A'ó~óS–­Ýûn’¹g£ SÉÒª^ˆ\Ê.”WOª2 $$œ!éf1ÛM©mL,¢G7y+œ·SÎ;v“HÖ’·œ’•N ±|ãH 9R¿8ôÁW®Å¯yû0ʽË_Þsá‹UIî0¯°"憤lã y®çhn40žÓ¸õHuŒÏXÔôJÔ€¢TM¢6ìçrû¬gjN–œYbÑlZe,Ï­¢¡˜O¾-Ý9z”fñ<èá)rô⥘09ý8f­œ[, ²ôò7.®â „ùa˜=•-FcÛW»¢ ôv»ÒJ¿Šª¶/@³`Ê%BƒdqМ/7éÍb V˜øúõo’”d¼ ‹}pH¾•Ú`Šû?-epKáJa³3ÑRŸ(«Î+kî”5›Ìò-!è™4–û:æOÀYÏÀ­I >ÆYÞ¦´¾(,hmÿVž+ñîDõ {uGŠœ$ëˆ#‘t*¯óYÉ2µASÉ&ZV¡t€³`¾u­5ŃóµÙÓ«6 6ƒÇFÁãAÂWÏ!¥}°ƒäâÍÊÍgÅhñ}îüGN€]"Ö äÓ㎭JG°¼bžH%P&OÐZ3I˜vä8@Ï7`¹c~Ѽ,°3Saü*؆ñüBNÙO³)¨ÅÄègX‘31˜Ú¤k#d Yü±õ‹ÄüìDüiÃ:£!æ¦4z”¯ÑDõ¿v ð*RK$Ÿ‡g|¨ˆ¦ÄžŸ ó¥_ËÓ_.áw¹L?-Ê#Dî2{[ÅÃ#Ù¸Ãbx´2À¹K^`iq¥üˆúYrâÜçWÅÜëÇ– •|gŽQuzàs/“2ŒSª«\¥çC*= X°“Ù$¥d?HR±Y^)s¯tNç›Í(ñ¡óŒ4ez?£'œãHoäÈ8ˆ‹éÂð5Ôò·A^Ã(?ióy_¶šbZhºêÙ-Q›³¡Uq¨e~®ÁÆÕ*éí çÖÀŸ4EécÔž Æ4›‚Š–Ê³¿Qñã*Œò*‚28ÊÈA¦ƒRÖ¦pï1ù1,Eî5aZ4ÃE¹eÊ/Òª}'›:êø="öÀãŽ}­¾&Ÿßvô€öÐt£ÝUía‡Ñ¶±Ï‚¥s?R+´žùñ…ëÿÄ‘sÜ0lJËN* Ø_·àϼ`u2/ð×ÑÚ#AÙ‰cä*)?­f?Ê/<@U´~`>8í/ðÎ$³¤øµ9‹ÏØ’³L®zÀ`ñÏO²Ø®‰Ü1ŒÀÒ­iMÏ)ÚØa Ѧï¸UiDŠù‘öA¿þ"#4IO£›»ø€;J:áÏËï.ùG5ØBºC)X˜€4¿ÇqܬAŠšÓ%$ÑiBôjÉòàW¤¼ý(j¹K׸ÁâpÚ ¥´jJ) Gع'çè¾ûå‡ÝÕ›ß?¼y}.ÏìF¯_Ðù·öÙh“´=6j‡`yIlA/˶„¢ÇùÁg_ŒÖ-¼ nI~ %™ÉQ’7–çìü@m­ëîûæúâæo endstream endobj 2775 0 obj << /Length 3972 /Filter /FlateDecode >> stream xÚµZYsÛF~ׯà[À*fpú-kI.me•²$¯œ<€ÄDhŒ¢òŸß¾;¶w·\çè¹zúøºŸ¾ëõÿ›Ý¤zÿfQ-<øù«Òp§›Fiš.³Ø.Þ^x‹t¿¹øÇãÅÏ7Ú_¤Ð­¢ÅãvFn”êE*7ŒÒÅc¾øà\ëuišåJ'ÚÜåÊw|ø*?tÞµ¦ù©ÅÎÀys*r³\)/ò•“¨åÿ¼¸~¼øtáÓ~ü~ú qc­›ÃŇ?¼E}ÿ\xn&‹'¢<, ìÂþ¡\..†-ŸoÝ÷ÜÔKýñÞ•v“·^TÙ¦+þ\jå˜Õ¡†]*vˆû²ý|“Œ'I|7 "è¡ñŸ—«@Îï^èµ›úGKój¹Š‚ÈÙ•õ:+¡Ë†À‰œÇ}Ñ2ý1k²ƒégX=dK÷Œ•ÐYÃ$±c¸rlLk*ì혴–!ÙšÚc§£Éc˜ÜpOn¶Ù©r» ’ã­ðT.p± 7Šõbåk7 ä.ïêæ•%îÅãs=Ýkºgn˜¼N¤Ì‹6!Èñ¸Ü²)‹açPïšÂ´R¬yÂuQåÜKr¡à!¦ÙfKž›ß=?¨Ln·! Ô¶ïNMÖuEgò¦§ÁþÒ‡àœÎíÇ¥N{Úàx(ßs²®3‡cÇ]Û¬(ÛK(C¿ì?v¤¯1|½uӵܒUükš†®gã¥Îù²ÐrûéH›PÎmÅ m}0L¹ÉZKUÈR…, ¶m¬e’nŸuã“örWY´²²væ„2oŠL˜¦c+‹ 21+¡ˆFIÇ(UÕuëê#o»¬CeÇä¼ß›Š[»½áBÁÚle›È®°¹Ãª˜^ZôS¦e¹Z¢h%òù‘DgÌ Gç虸2'À½á¢û‹†F<BçÁHKk6Ö¦]xà²ùŒž|\½s±ø@À‘{·Eí³%.An:4nî™o›zH8¾«Ð%(LK`mK WømÞ1J\ÿÌ;F3Þ1ôμc¨×c£6d^¡ÐkV`3]sÚtä  N®~ë5OÞ–Á&+eº3oÁ£ŽX&‹)Ô,·äÏMνãÕÝ0!Äûid~®¿˜]‡Š|5væõö†å ü>Š(ø1´ˆØDÊ ¿G’¾Þ"bYûÙEØpÆZHŽ ™˜ãOBY¸…ÌR5æÓɴȶ6¸Œ[~+s&žçÈ’-öb Ì¿åÒ*lÈ‹5,ËøëS·ï;û,çr¦šLýÌTÙnH§í ¶B9ò×8?¸KÙèm'{d‘÷³Æ4ëÌ)÷Yƒf+ñÅXù½Ð ™óJ§–­ï´"¿›oÚÈTv8ÛŒ XArÀ=ü“„vdá\~[ò©f…hòdjxt[ ¤z¬c`JÝP¥VÉnïnV÷×oß]?<2õ®*×÷CK+ö¤Ýw£ 8“áºâçè™7âÈÅ"Ñ ÇËÔûLúyŠ¬Ú‘ÇB|q_ìö" MÈ÷ò°'²Ø4n$B„8ؘö w4fcz‰!èÒÎ=3ÒN„¯"f¼ê· Í#„`}zAÑe­StjÍH:tMÌ«@ wýì»yL]æÜ8‹]`UÂ.@¸#¡ÙaòñLÜþ2l '%è±6€å½}9OÔC¤-iuhË@€5x"®Aà;–÷›¡²=÷  “ÏÄ‘äÚ ½¿ »øV˜~<[Ë#^èÙÌéXëüÞì²²º‰FM¼s2 ßnIô·ëÏŒªù xYÕ«Ï—Õ,„x5,@‡6ÛÙ€KØ[#†E j7£Jh¸V‰¸ÞX ³æØôVé‚àtÊŒ‰kÐÁޮ޴Ýá/WK²£Ä^ß/c°N·×3çŠR×O};Š®H‹µ’èëmñXlJ!ܨ+sj¾Ôjü— F/¨ñÑ•«xŠjÚÅq%òÓ¾†ibízQ:Á4Š1 ²qM,Q¿>ú•óp:ŠgoÙðöç„- ]_÷àéõow7·÷ÿš¶ÔM‚ôLØZž»W%Ü$i=·36RpÂõî‘èµÝà{ðé^/EÎ"¸ˆÄÿrÜ¥Î÷Y ¬|ÉYÅ‘;¸Ÿ¯ pc¬,¸˜¶,ªXJÜsãàW¸Nþ~s¶O e¶À8‡ã}Iœ‹æõ {)ŠØ Û“&"Å ñ4ô~æ®Êù´J©)Ÿ0´jÛ•ÌP !‚Lj0Ft,O»ë?´_£…¨ŒPmÐQˆ…àÖ^O Ïè˜!B;Çv•Æ®ç%ß$K#Æg[ÊIá"`º¬éxb˸M#›h'ë®893I[[?ÆÀ B¨’@ TKÃé Hb[Ÿ0å\#›Ž’=[--„zF¨ò¬ËÖ0EîÎ;ÐnoãX×!úãAËÏ œrA zÁë·-ù,^4«DÒ±'ÛX =¡™¯>•¹pÅ ÁsDS¶O93§Â/Yi4þ7][÷'횬jEÛ Š•Ï‰&Xç—XlNe†Ð"H¥€éEX«‚ß`#,l"/¨ä”á±:…-œìRá4Uf§bñØs0ÍUíªzˆ|[v%ÇÆü9ÁΤap‰hçOd`´Cb‰ù´od5/œŸŠ|Õa®÷ùH±ìWCY0IƒçÿÌ—Ì‘,AýÁê:žZý@§Œü'¶<<" MŸýÚ_ÊR€0R‹ s¡óíöúnÒvm³‡Ç¦h…üîD™[Y¯Y‘cš»6‘ÛÂ2™/­œØ´ÒÆ=~.$ °v•ÈžEÎþz% :],ú?£Ç ¤'k‰vÓ(Zh?@ëãã¶±ï‚Ò-Às&1=Ž_ÓþvK9³ P`ÀÙž¿áÉÒýÞ7¯ö÷”/÷ãùnè«ócË5ýð¹ùQ=G AšJB0»#ßó|É Ñ™bA.VLeÅjUk”î³æ"wÿ‹ W) kðeÿç Çe´ ¾ëÂçm§ù+™q°#ÌËʪP"ì×_¾>½45¹ˆ(†s÷àîkWà+pÉû+Š“4[oòØå§ "Éd½Øö†}Æ7dßN¬¡?»N2¼52šR“ðKâX °^žåêzA”æ‚.>¡ÃêìBرmê—(ƒ›Å &»Ýâ=6IÜÂ)Ÿ&ôEñ«$}•­_mrî@@´‡+Èͦ8`ª©¬Qe<-èâñ7kÖ€Õæ™G—¦Úu{FM3VóG_C(q þ‰ƒ¹×Nò·ÛOyµj¿š;HÆaØgþ bô3âÁE†©<,"ŠŒE¢ÜŠLlêk«*n#1l#,( ÔäI,Ñ÷ØÚ#N®,£:d/vЃ|=,×áYÖ‘2C€¥ &ï+-ÿÞàaÞ^ÝqmÈ,Ê·“ÁQ?8f­€–ÊìꮈÈ*ôW6OÝ-¿{ÔÇy1\«á¾!Á+`ß“ÕyÍXžeL²s˜…dô&ÛÇš“SDEWÁ2Íaè% E®àÃ7I´ãGg²ìüÁãYœ“`gº©[F%¥!cŽááúAA¤Åëê'Ì‚pícEÏGOVJ²Î– Ì›q€è@0$ç/ç˜óÌQqŸüI2‡œ¦^ñ5³¿…‘´4®¸}æ6Ð?ï«êß<\&ñXQ1}ÿòá2òÏ?‰ÀW"ßÁ¸;ö•MXµ1ø²zŒ„‰í‹ –ñEK”¶ƒßq|Ç6ÌÂ{",Û—ÐVžt|7ò žž¤À{‰Ž8Wg•1+£Ü,é£êûhàd`((ü 㩱É2þ ‚F¦¡¼K+ëÓó˜™êø ÍÎÇÊÚ¿äÌÉÁ€g‰Tà¼=eåð4žü µï@Ÿñš;â5v²ê¨Àgjüìäòñ) üO]ɬl•$¿µ‚õ‰mB-ÚKJÑä*p–ÆÎlmIÑÌ)m,¬RÕA¦ˆZÈø¨Teø¥{É£)÷€äØ¡ùüÑÏàñIHƱö±¢²Ï §Š¬< ƒ ƒ„ {™uö¿a¨ýĈI§Éôú(6E±½¡ô_°0%ú K2v@&oîøÄ/" 4½HëÔ±m£ͨYºÜL˪lða'Cbú;ðL x&z gRûpÎÊ7MvP  ðPt_…5áL>óÐsŸyáÙ—D6?ꉙlù )Ö,ùà#î(#hž¤ÍpнÐ(F‹a_¨†1M/ÅöíM4åúç|CPvSG¸Båc3vëÜFv@¾s` õ> stream xÚÅZ]o\¹ }Ÿ_¡ÇÝ]‰¤(©p·Ènàî-°HR ­‰3›5ÖõŽnûë{È™ ü1³#Û·.Ç™÷Š¢Ès(jH[)V YÔ„¨gZ.&ôPšé45‹ jé&”Ð’hhâ#5´. -tö‘z3žBNdCxNÕÇ(äœ}Œ!©IÈ”|¬@*>ó¨ûX ™EÂ&4j°]­C‚½T&+$&a²¢>†É4û&ÓÒLÂdö˜ÔªLZ[³%àZRÏ&%ø(•d•a!$¼ˆ™LÿIu Ê%W“0aQ3o&3OZ@ªë5A2s„`€ÙÚ|Rófl¶5•°7| ÿuõ1œ² ¤Rƒ ÁÛ˜ $q5…Ô]­&ö±©ùXX„q‚„U^Ä E3_C*¾ì_ƒ@½ØÊ­¸æïÝü„‘Ì.• TÍc¬X¦­É\°í¢ø£â¢öƒM—Êö¡cÄ‘ØÞà᤹ûa}Iînž¶é¡RØ|[±‰¯3ICÑd“ÂÅþ O4 ò _k"Æp˜R²1Ì­d¹PKäz˜RÙB¬ÂN¢¢1dóÂOj~†ÔRÀŸè¡goØzÅp#ÜlzðeõìªØ@<ïzÈ*µí­HêqS)תE†6¤šD…ƒZöµÕ»Í˜² ·ÅÑÑbzóïOË0ýøîãr1}·º¸Z^\}¶<$$ú«Åôjùyu}yºô±´ûóòÃÙ»oW¿†P„Ríôv—\âiÄ/RÌ_\\¬ð¶“5b`h¡m…îÂÛÅ7ßܰȟ]L¯¯ß_ùç?]ü²˜¾]]~X^ú¼éíôýôÃôÝIöfêéU8áNÑP€k‚,‘¬Q±`î)"ž¡÷"…éu˜þ¸z³ ÓËðÕçë÷öÏŸ­.¢FŠòu€5³”+ŌʽEå®± )çÈÿ{´D0á(€!ƒ 6(ŒtÐ zŠAÀÇ›åPñ ¸M±6‹ÏÈD;9=»ZÆËŸN9vÓŠ—á„Öõ*LýÛßCÁBAµ6,¬†‹ëóó·û•u­Ì€eL™jìÀé1åŒ%©*§‘¶cÊÀˆ4T®=Æ”5EÞ r®1r•5Œ)'ŽàÖ1e`uDd *W õƘ²2wp»‹´ØÛà ÁyÐfð.€£Œ*KÌ}06˜RTŒ NØî>Ô9–A“ <3¦¨e4à2…ã-cïî,íäèXtŒªÆª3ê1Ü4m>€ÏÕ‰Ó`iúñruúz „¿¾<Ó›å¯Wwiî.ñÖœï¯O%^+Af­ÝmN¾5ôö’&ÙoTÃÈ@I¢¹E-õ9èä¶AÒR$+Ÿ ¼•¦± ¢…2ø7ï4èûŸV«+L·Œú? ZàbC]œ[vâÇÑ$–´Ÿh7n‘ÛN±Xµ“Å0»ÝV>Àn;•÷±ÛNå}ì¶Sy»íRÞËn;•÷±Û.åÒ-"ߌ‹² @v*# ˆ]WÈ*ÔQå *¤A×IG¤ÕÁZž$t$‰’½#àn®ß­l$+ƒÊl$;è:¦…]ǨÎÛhlJ{œ•ñ;uSÎ3)‡¼ 'ÐXÎ8ip{ mMÇ€k3l´Z~èÓxOvðòÇ÷xiCwÌ[A¶BÙ ú4&¼sŽ)ÀK „XŠÿÙú8ÒäÚ~û,ùÌÈüžˆ¾¾C2åíÖÛÊÞ(Œb¸PF9ÓÕîO$Ž5enÅ Ü zŸTÏ e‹ûe‹ûe‹û¥o„Í~´hÎr•@ ¶bb*~3‚X…bªOˆÞ‡ãK/~ȱ.([‰ˆƒãŒ+\PŒTdIæ,ÉòlÄ’ Tü`ÕÄï2£Õ¬nÏÈQ€¿÷³[,„º€Jj6‹òaÖ9!«ó»kÔ­Ø-køÙu+ ü¦ýYM)v[dõ¼waMå5C¡”8lK›³Œ@ô¦âí=»DÛ7ঔëKʽ^˼ŽÀàÍ£ü˜XË}L¬üxLÔí9]·P¨[(¬[(¬[(¬4guL yÍ Ok@äW¢Š-,u Œ(ÍG¬vQïÖ·Îö‰hßAºÃÈT§9¡ UÍ#Hn%g]w÷íôÞó@²ÓŒÅDð€wö"öõd–}}õ{=pW,5É|†ˆ ¶¯YÊÛ×PÍTû6‘u`ÉÆÍå9 endstream endobj 2787 0 obj << /Length 3619 /Filter /FlateDecode >> stream xÚÝZKsÜ6¾ëWÌ-T•Åø@nÞÈñ*µ•8¶²989P3 G!9’]ùóÛ/àˆÒÊ©=m¹d¼ÁF£ûëæÏ•ŽÕø×ÝΚï߮ڕ‚™¶qâÒUîlì2çܪ«VÛÕOgju ÃoÏþq}öõwF¯ 'Ùêz»J³8sf•§Iœfnu½Y}Œ.ë››¦êÎ/La"ø@|~¡# ÿ¥‰N£ŸûªûªÇA½=Ö›êü"Q™N¢ÂœÿvýýÙ›ë³?Ï4Ñ£ÇímçÆ¬Öû³¿©Õƾ_©Øºbõ@3÷+¨Ç@?Ô›Õ‡³‰äSÒµŠr:¤=1q‘2éǶ^—ý@„ø•_W„«¬M4ÿ/8œéW•ª~}¸ƒ£QõÍù…5iT·çÐ*<}w®£m¹¦:LÖ1N)¢ësàPùΫzÞêÐV\¹¡ÍüS•-wß•]¹¯†ªó[ìdþ¦Ú–ÇfàÆýyšFes”±Z6Wã"îÉ¢ÃÝPdëéÏ£jTÖçH©¶@0cu¡óX«J§V.ºÞÂÂ<‰ÖM]ña¹ÝïÇfƒu8yõç±êeÀ³—Wö{\DBto»Ãžk ö‰¹?GÊðÐiê¢+ù0ó:nÓ©hëi¿=vÕFö:ðVeÓp«nÖÃ+:ž:9’hmôP7 Öà’6‘{0ƒ¾}õÐs¥«î€/=²<Ï¢«§ù-­R)М1Ú~¿9›*Oذãýz¼¬ 0zwW—szƒSŠ¬Ã‘ºªïIðŒq퇪ÄS8Ø–;ý±l¸ºG¶açfÀñ³C|¢(sýaŠ“Ü@ à å«w]µ­:¸— º<“Õýsúz­³$T¸Â=V¸4ÍG…ëPÓDË2mi¬ojºB§ø¤Ðr»»§&^þ|uÙûIB¡sR>˜ Ê—yåƒf-”«¸(Ü\ЪýÝ€t}FaÓÜæ¢œn?޵M…òÜVý+hg*zØÕk\·ãáIzÆž§âúÈqÙÿ—È- EŽ·i7D,ܤ ïÀd:vFûKøðã¿®¾½ºæ™³ËžƒxÉ´=ð³¼­„dwæƒØBÏ1?…ûÀÃXÝ”7œFê–K‚k‹¨a\£¤â@[ ¬WˆœÝÜÉz‡5¸fºCK,qÚ³ö–äÄhwÕºª™2”øž{Y!Aîšj‰_Vå±ó)Œx}yždÑ¿qƒ7ïÏs¸â«o¸wá×…j*\Ä›7‰chÂÓ1Žà¹IÄPôw»±ÚO°Å ‹›ŒLÇŽ½LP#àÄ[¿¡lw¢Àv DqE´Tú¦wõDMµ³lâØ:dvŽæYê#7l˜¸[Î ÇBk`òè‡Á"ÌvåÀ“¶pÐ7Ln{:Y&+›~so›†§]E0í3 ´Â¡æ3/& ªÛÛF(x/¸ƒõÁ.œºÔjX'Ø+Ü|dÔÅãHi7T›WÜysæ 6\šÁí²Ýð€ðjÓñ ÑU{2Ìg™Û‹ì´_禫~¯ÖÃK±”P x=ùT`™7¬ì_,œ,’íæÐ] Òacý¬xª8 ¥3Çñ±tjCÒ™ŸJ'°ï—›ìb3p;“É)¦»Àá-Š(Íã‚ù„sÛCÆÈ®¹srrËéC⑲¡5±IO\vök´ÌCÙO‹ya¯G‡¡ò`{×ÉÆÙÔq$ðFw^Ì5Ÿ—LÏû´Õ"Ž–Ëß ÂŠMž &ø+A²Ý|M  ‡ƒÓ.§Qëš—„Ë9dÂÚcm‚Î9HŸ ZÅ£ÛªŽ46ì‹‚@­»ì|Ö¤–òEÑÃ3«ÿå˜y ›ïßž­>Òk7ƒ&8üß@¼ký¾%*¶© Í/·Ç1ËÕk$…òÝ¥è&ÔOM0N£¤TBg "2ñÇ`à©ÜM»–wõè©â’*l‘¹‚¹¥ô*ŠP3†b02™ohLæ…+‹ }€‘}LØ×Å*]®ˆ]œq­W&v©Ì62ͨ­ZÇy–?˜ø«RjÁÁ‡™£}ÑüaöØ â)©>Ý‘óâ» ïÐW¼ß9V3÷7ë{ð üÒÑÕ/й_c¡‚ ·ƒyà;ƒÚPïeß *bË ~ÜÜ­õI6”yªhêÚê«ä`H¬'$ÇÅÛL\Å%X…–¼kè)¹# h‘±ÄQö\Œž †¯×ƒä-ôŒEÐôn‡ ý  ­#$»¯7ÕÆ ÷Œ~*~ ¿û媚|™ª ÜÏU53¬ªµ—¬ª17Nuç‘®B%ÔUÌ_íàzJÉRÍ!Ò/’© îçVa‹ÓV†®Îš“«É½žÚÐ͆ÆËôT‰–o–ô5MÀÏ^¤¯*·/ÒWñJj,À „1!+TZÍ) ,'¥µVY×bžžu3e„Ñ]í3Øbq‡Y׉ß'B&mרç$¯º¦’z‚£º“ØÄ”òšØìˆ6?ÉNŽéñºUð‘ºÛª]æfWÝÔ­l7*þ†ì(öQú˜æ1D̦õ=÷l˺!™g Í}NmžÐô¸ÁÂÅohä%ô tø g–98š cüÍ"–)Sè0tXÿ%ó7Á"õ‘L† ãzsÑÔÛŠ®å¹8&‹síð°©:‰‘y Ù‚%‡€üHA¾ú'Á’ÜQèm,¡uˆ%X ß:nÉm¶.œÃÎÖÑæDC¾)\¯7bk\lm6—Ý‘ ÀÙÔßjgÂwfr&ü৘?ÀC£#‡±ˆ€‘Éæ×.'P.ANb«Š—aŽU/Å—L˜3ÒìÉa; Î#Çî<Ôr9¢ñ3É\œèåD…™<8~µb6ðdòà~h4¼‹\`¼å¶\ Âr’F½&å¡&å>7‡Ëå[%hš&P„q¹r™ºƒ”)|¢Œ.ØnQ¨ž=—úN‹8S™¿Ž÷o~úù͇ÅÌw'lÏSßýQumÁï7ÙS/$/Ñu­tœÌÞ#]¾ ë¤½¤°ÏÞ!â²nø÷—Yìˆo+¹Ž‚ðñGÑÏYâ•Ö¼H+ŠôÅžóÈ]-Áˆó%tÔa”]z™"õp¡ì’ðÐ×,=ñ-˜á?¹Šð¥aiì@‘ÆEÚf.é"5œÈ•_€ñѯÄnÉEà²^¶ábò¡päÙf.0àÀíT‘gœ!Ùœ5{¬ UOñ\öŸâ üúÔ<â gœ¤Ù­+<’SÞª ‚½+ü¹ãŒ+&MÇÎyš‡7”cçüzÎùuìóëØöùu¬ûüú…ý˜eOçiüAŦíƒtûóР»fØðØ@¡Z~:µîqüúœ ¹HÐòÐBÈBÎÙøfŠ£²fö£Ü–µ6UÁ ºÃ„æÄµÏý躂 ›ÉoÝ‚ºì%éiaE)¿•À{Ãöå¸ò(M³O^1Ù“'Yôš=`›à«ßÐÕ÷Àðf¸G=Éï#¦zþŒŠI^†‚)wæ©l¤*±M¨ÿÔhTmû’l¸/ø×s·ÜÕ®Þq/^+«Ø~]Wïî-Ob¥Ù÷™€'LßIb~ÿ¥ŸUàôÑ‚IþÕDËãæ‚:‰ITQާ©½s%¬Y8±¨O¡$?ˆµé÷"Ðe}Ì\uù­HÁ™(æi!ðW¯Ø½»0¹<’g(Ô"ùŽÌ)5{I*T@ð¤ïôÕÑ•€ÖòíÎŽ"Øâí‰itÉË3oãœÁåÇe£ü4•øÛßHPÌ@‡Eñ°)lœ;‹9ŠÇX“9³ˆ5…ÎO±×OXƒ-¯6Í}"zK™b mÇ;îÂë|Ù'~¶Ëc›üÝKˆyà.îÙˆ@Ϩ”NB g¥¯çNÒTò‘f?ÓÀ!Žnlײ°­Ö,}Žx¿ É}‡Ñ—'«úTâ“„|…âh\=âÐWý’îýÐ’ƒd#!4HB2ó’Xåã/8ÀË_Wñþ3Àd,ߌנr þ™É§Ç˜“‡¾2pI?Æ(EÔ¹‹( öñae=,Q¤µ‹óéÑøæpó2‚ ‘ÙxO¾qXiM¬Ns"=¾ô|fp#§«Œµ âæ"ë\^ˆè\¢*u1ÎØý¥Æ×·áô“ˆ/ káÚe‹‘þ™ §^¡¹ó&QU@ý±—Ží‘Plác"jàIâß²Åè^É/ÂóoÌ´Áøk%B«­÷›$ÎǪžu›ú*ÌÕÙÆ< œe€Ÿy4Húæ2Èj¸iÿW¸éË7×gÿTŸ'í endstream endobj 2804 0 obj << /Length 3326 /Filter /FlateDecode >> stream xÚÅZK“Û6¾Ï¯Ð-TÅbø_¹­ãØ;©”ãÍLvÙ0"4bY$e’²3»~û”8ÎÄöV*åh€@£Ñ¯ónúÁø¯»Ÿu~µjVü—†ÊŠd•Ê/Ò¢(VYíVÿ¸ V÷0üêêùíÕ7/ãpUÀp”®nw«$õÓ"^eIä'i±º-W¿z/ª»»ƒéÖ›8=ØÀ_oB/„ÿ%Q˜x¿ô¦ûªÇAå½:U¥Yo¢ #/Wëßn¸úþöêÝUHü„ãò*÷³8^më«_ V%Œý° |Uä«4³^AÛþ¡}XÝ\M,Ÿ³~¡Ë{ûy¬·Ç¡jæ¼YÇ‘77Àïûuzfz±h×üæeî®0BKýVÉRïßAôÛö§Ì=óíz“ÀRU³†Þ`ºÞ˜‚ˆ’Ly·kŠ~‹ƒE”e‘>ðjº,;ÓËСê!÷ü{Ô® ¬k×ÛW22 ¾+aËP5°fµÉ"¿³Õ&ŒýDÉVÍ®íjÍߨ ôô¸9 Ò_Cïý:½«ƒ†ëfòëÛ7Ü ¡á1ºxIUæ½6>à‡m÷§p`P [cÃ0ñM×-ÉkÛx¹_Yî ¬ü/Cv»?¿º¶ÃÙõá7þ¥À\ÓÏñ|ƒÀ;õ9(¹‡ç™CU’R0—OÿÐlñ4û®mªžäô ,2¯§…3OÜØ·ýÐc3Çk'Ò°7LhF™ä,ú@Ët™kÂ¥2 8?ÒE yÑœª¶“Ì’VQá]ïxlTfe!.„Ò‹Nn+TS>s*öP¡‚ű÷¡ÂãıòX wzÊ̓P¦LµwÏtÒN kîîEû‘[¥¼¢%OBᬧ޸º¸rÿÌFçFÜûQÃ/x¬pÁìQ¢›ÿ´ù˜©™Ÿ‘kêi²`êA±lê*ð~»><ðÇš}Æf]ÜŸýÐUÍ=¶ó–OözIó«”5:Réw`]'$6ƒÙä?‰Š¹Jã¹ñØx-aè]£¶à} ¶À}ðmßWdì8D6CÍû5ëRìZŠæ_98´˜'±S·ÒrÓqpè;ÝÀP)g‹“ÑIôU ¥ãÎîÔlÙL*r”r»'xC¤¾áNÞcá¾›–½,o0ðÖº+ÿ”h= y°_P݆S£â1=cf§e·m­ŒNGväðå¹ë›ðtèN‡Ïtj}õ'p 8·0RŽsSIä:7ºÅЗæËX&+ Ä2±ƒep Ë`o O* %<Y&»X×»¹ G`𺩆Šá 9´´ÎŒá EX}sý™d‡úÄ«W °×£‹…e4wÁÎÑÝïxÉ{øfÛ࿹G]ÉbÆ?- ·¬vv‚fSŠ·7]]5ô ¯Ð³@ÄÙ¨À]B×¹ÐÆxêã¶@ÂCµ­Žšoš‚•n÷¦§¡»̯šíáTÊÇ×öÚôß÷¸àÛ-Ķþ·k”Ëé€a¡¬4O/+ mw'ÁN8 ϺÀy;¹_ÇÊzµÙ»sÇÒ ÿ$uý†{Ä0¢XƒÄ L;¦ÌæZ,à#ÞÌGNlQQAÎ-gçVÌPQÁŽ & ãý,”•Ó9Oó’p­Å³´;ë†%ú‘o¶v?ºžx„üŸ²ÒÏÂXé²;*ÛZ³»~<ŸR~""á†lÝTGqs<;Y±­XVwXhÄs †ÖO ãX0Zî#LÄõ«ÚÇH˜l6]›]òÊ;Éö®ùâëœYp,âR™CÖû€"˺´ãô;Î.í¾wìzºDLgÝyBåYæÒàèvʃà¹dÑE\Àï"ZdŸuˆ¾ãß).à7¶œŠC¨Hø;…µgì*+ÎM69n æÚ?½nÔ˜ÌIGÞɪë×øÎ—d슧¬ÚÂe ä%N-i£Š"ÒFfï‹­ÑûªÀ"8¤e-Í?“÷±¦í§ŽëM™áýIÝä1puæœYÖEÏ”ò/ô̇jgì;åcª˜'àÖÒY%e)Sê‘JŠk¨ý ![0®µ ¶æîâîy.­O¨«¾¯šûqec­}§!Q™W®Æ¹¤ Iîq® Ï5%L…@P–-wÑ"¢"W' ¼øûwoÞ§L<«Í"©ä>ün;'̓7´ä$HàÕÑýîàœ{*<"]ÂÒ¸ >Á@ÊBÏÃ…w‡Ò›v8ãn p½¿”Ëüh¯y‡S±‰r²04Æ>q„ÈÚ`nÊ{ßT@äW¯1ûîQ†¿i -ò36Ò*Âí¡Å¥”ßÄ©÷üçÑÝa‚9pß}Ç£}+» å.;ñË:*·Ey”xÆ,<¤Vò+«B RIs<åÒ9 SÂÙ•šðýArËjÇ“¨†jÓZ÷;‰Õ~¾8[_(rÉ)ÊÓ0æÅHçó‚mN*¹pµÃB¼p;æýMü¥ýÞ …©òU:{Ol6Db¤èo²åŒH)¾/Їô'Ù˜ØôL•§WDüæxhm©F^œôas3hR¢·<çÇŠ[aTw[\m„ípê„úDQF—¢DÅ„ôm¦írÚ犀!¹­8óü˜©¹­6äbvY1¥>Ä^Ül„uœujCîà;wC˜YÓßãÍõ¢D7F‚Œ–JCÿÀ«ëßÍ­:³ô÷ßήÓþ~{õ?{À endstream endobj 2812 0 obj << /Length 2936 /Filter /FlateDecode >> stream xÚÅZÝsܶ×_ÁÉKyL AúÍŽ×Ij«‘<éŒêˆÓqÌ#ÏéöŸï.à‘'F²ÜTL`,‹ýø-¤gÑøÓ]Ϻ¿¾š ‚)—,Γ@å’åižçA§ƒmð³(¸†ágÏ.Ïÿ(xÃpœ—Û IYš‹@%1KÒ<¸,ƒ·áóêêªÖÝj-2Âlµæ!‡ÿ’˜'᣻¿”á‹¡*õjG)Ã,Yý~ùÓÙ—g蕇ìeÆ”Áföö÷((aì§ b2Ï‚Ovæ>€6ù¡]gG‘#–Áøœ|NøõÅd·LÀ¹Ò@Å‚e n†d©8’‚‰LY…Ü‹»Ÿ¹°‹b‘ÈNÏ$¦gr[gúêݾåÔ6øé±¹`‰Ì¿ýÜd2qÜó(çh3㆒ øZ›i}Õ6«u'a3ì¯Ð|°½¦ÏN6}W5×ÖDþL=ÌÌÍI–æ)‹~@UDËøª(Ê²ÓÆ¬ßë/ŸÚ®œF-ð#ñpjI3ÅâT}ZêÊô£†4giòjP‚)žÝ®r¹q<¤Ë@¤æ‘|@¥¤ã>ãÜËe:ýaЦ‰¢ ù1IP=2gü5&óTJœ³(JP)B°Hñ{Ä“ÿB7Ë'N¤dÿkhÛdü~ÐÂï:Ub¶¤Ã°aîRÕ§î¿IÎÃf«pدâ,¼D—…¨O(µ©®›¢×†ú^ï _ƒÓç‹ÁˆàGÏÅ1Ð;~¬ã²jÅCCÍéßq!ÝÊïæŒÜB'Cáöyœ>¦x£pêµ³<{4·¸ˆ(=1Š8Ï-+Eá¦ÝD1úPtpÎ’º4§´[¢¼<‡­l˱Ӟ½ÞãaÉod×Ðg>ˆ¦Åß¹YM9=MB‡-øT›BH:‰¸~Ž`7p«¿/¥ /´¦…zc¯’üìÊþ(²Õc,5xk™IFßHÆf[\Lln 9V¾>¹;L1ô»õ¡kûĈáê3³U9SPÒD´ößp„X†ï¢$2,KÚèM…úÉjÂ÷ºn¯ŠMGª°G5}9aº ¤l7¡ÔÛb¨{7Ô´ÆÔ¤¸ /wÖÚ ~ÐW¢‚±»é†MUÔDC“ÙëÞ: Œõ»¢§ãöݬí}®±ÀŠã¹Vï".ѯ’H‚/VxG]ÔRÛUÿ*ðŠcO[oë«MáÌrj:ªÑ’*Ço0º„£ä‰ ŸÖu‹k­Ý }ãøÇU~Q´?ÄÍ|I£NŸ Ä§!X¦\ù‹@eÑ´ÙmÁ=CÓOz´Ä(ƒð#ýŒR×Å].p’`~9¿•ÓZ¦ÈÄO\eÓ6Ûêzè4üÎY70Jàî”wÌYÌãQLWß%橇™û{W'.féÛ¶#Ž¥î‹ª6w¸Wéoº˜êŽÜ®4·y]Æ—S¯Ò{]{t(™zs~#øÍ*ƒXD‘ÊÐBбB&Ó‹.ÆB c,N(6}Ç—Ìg¹c€Ó–æHñžÕ¿:ñ4ò;9Η Ñ¿®êªêšZ$Íßv힨FwíÉ:{Õ"|¹¥~Ga8ògŠ]ŠŠÞ(¡f9ö QlÇ$¤•ŸÐ 1Kzi\vŠf½E¸Ü9:FXÓQušç›pH ¨LŽÚÐDp’s'ùtÈEJ¢‚ëãÖ"Ïm"2¦ï ±iTÁ~ÑéÅp+ÅÒ£ã|{8IY"²£Ÿ^cš<ÔEÕ,°ƒp¡buov»}±YïËd)–$ÐÌœÍ®à ¬sÎR‘ÜÊÀh®–„–q,˜òtþíL“ôÏg*²?”4›p]Çþ Z߯?áñBßO%Yww3 vŒmñôËmá, žè-„S#€QŒF€QnBz08á`píÀHèÂ#f஘]’ŸBö!¿¸œe»ó@‹ph ³’³èИá@›¶O2ü~è:dë/„JíÁÅÂF2† IJ¦Fµ?Ôz¯mu,—c‰L 6’wÅpícJûª´¿o€W (ì&;Pó„Ýö# ZËÓÜÙO:³ŸCÕéòÖd1¨„¦XÌ’±ò°mJ² È„‚“ü& †9”N(´µ.;7›b˜y4,S†áF¦ˆWLpîhe8©ÚÒ¨M ؘ&Z;ÁŒÉš'ÙÜŠF¬€W[&€l'X@ÓhÕ]oAÈ ûo8Á’îi­Va„“ÊIÞâ,ûßÜ‚àÌÛä’|Èx{–Øôß;[ÄQ³k‡šÞÖP\óü¦ï@òÓ®ü÷eÄ1ZH'&Å ‹º†ÈÛ¢6úƳ¯ï]ÛÈÅ×¼P&„‚ûLT¦Îê·VcBåXÒéê£U vÉÌío £9ÞT#TWÖ¾q±cÈò£èuå1ú?,1}ÛyF³Œ¤r*PBâÖèSA¹íGQñ‚k}œBÇMY.Ò$ pÿöžN „"áä²!+²»”¸8çöW-μ,ºÇuuõø+ׂL:úƒ¶;}ñòŸ´•ùv´7DÇ}!§>£&A;‡Pf__Ð×-ÄÜjûÏ.žS4ÂŽ£º ÀpA°ßi¬Zâ(x~bÏÓã»à…ßߪ¦¤' |<êÉãðÇÊ–"0§¯3Ô4}ÑõÔK«~Gâêe>>l Û®´'¡f×lñQ$†*Ffó¼.³F³[V»b"ÓúøwØ{’•h[D¾~ðzÙ`tPƒ‡¶ÔÚ¶Z„Ö`,¯4CLIfÓU¶¨Å…ÎÁ 9F(ã†,ú†ÁœæW·Ži§÷-ÞùÂ<@B“3¤'™u&%d·ËóWK‰òè°.‘á`Äj÷…5hûË…ñÖ‘ªÞG2Œf>ºomq -k×h{ã.jBpŸw9øëlå¥uùØ©‹.¸§–©s¼VP“E»ù‰Z›:±X Ò™üZG<>8¡M°ÐÝEäœáÈÚ½œ¡x6Xc£¥/Ej[°d‰Ç?|X¶#÷ä Á÷#úî\í8CfD:'ŸJüœò¹ì‘cøÙ=í9nÊrC³Þhuó&¥²3å'§À4:¹3(1æ°”«nC¥Ô_.&¡KØœ ë“âšñæÜžÖG2ÝÛüz›Pk·Ãìéâ~Ry?:\µË’x¿¼¾>ö5úýÏß*â7)nTI74TÊ,Iø+JÿæÕ«—¯^Ì4)Åôß.Ïþ"¬³Û endstream endobj 2825 0 obj << /Length 2316 /Filter /FlateDecode >> stream xÚÍZߓ۶~¿¿‚3}(5S!øE¸·ô»É´™ÖVž’<ð$œÄ1EÊ$u¶§“ÿ½»Ø%¥;˵×¼ŒÇ'`,öÄ~K¾I”Óÿnû úòEÒ$þ9e…öY’{+¼óÞ']Hî’]Éd Í/®þººúæ¹Q‰‡fí’Õ]’9á¼IòL‹ÌùdµI~NŸU··uèKS˜&‹¥JüÉ´ÊÒŸúÐý¹ÇF›¾8V›°Xjé”N ·øuõÃÕw««7W*Ú£&õ¶¹1Ézõó¯2Ù@Û‰ÖÉÛØsŸ@Y€ýP®“WW'“š:¥ðÒ+´=7Bfy’k#ŠŒLÿEª„ŠÐ{7í8ŒI÷ §Ç…Jë¡Z—=âå–uy(a1¨ò‹Ì$Ì•[ªÿã§¿/`‰Vßß|ûjE"ViÓ> Ð]=2æ!€%›³ÔZhi„]¹ÐEzÐHëÓºj^/ë(~Ÿ‘¶HËͦ }ϸT¤Ã®lHæHpGaìÙ6[j@ôîâq]xs¬º° ®Ý@Â~×ë —_Wž¹®I×plšP³‚²áŽ÷U7Ë1ª¥2"ãݬ´eÝ]¹ý¸œqÙŒÉaÙxUN}¿¿[,­q„¹=Re•c?PíØ*<ûÛÍ?ï•Ûfü寖õÇ5"ÛQí¡)$Ãy»«ÖØ2vã¦èXèºÝÃ"m†ö¤XCØÆç„7Ž–Âò¡»5ÃǦðîPWëjuô°=èëêŽ%¼»PªhW.Šr"L-Ü7ÚuÛ€ËZè·=våPµ ÉQXˆâ3çÌ…a—5œvW4' ¡a •Éô»wåþÏ<^ôõb™)•>ûñ©yxx•´™g¹!cÎ,Q2}¸ (ª¸éÐ…ûª="j˜§?Þöa}X±¼¤Ÿ=ŒRiµ/kªG—‰í(ßPyÔÌcº@½%œË;îΛ²[Úƒ{²u]ÙØ%x´ˆ;Ä*n@Q¤û6îp‘§èjÑö·½Ü£G£ˆ¶ £ÿ£üjh£붦æû·TÇ£hŽ"½k;’–<Ñé¹…’â–±MvDœóÊM]:_ŸãRä%ž ö¯ÙŽ.Ùöì”Û¶¬GWîItèщa›y²¸ÜЃw¡nQúöš¾Â'Éô.܇‚—/.Þs™sÂÀµ ÷ÊÇ;ÍX‰xŸ_lŸœaìya/2Ðøè:5ÿí:ýìÙ>ÝóC{ z€øjÞáß ›n|}~ä§ùà<(>ò‚g„ÎÒ5úÐ Àuî>s?ߢ‹[m¼0RÍÚ‚9]·Ûå¾ÅØ ±ÃµÛ ó Ö™È³9Qk/ åN¨ëpj‚ÏYap¦g„ O{í8¬©0Þ ¸aØI*ý{àiffîr!a…3©E®8(¨Êy@™PzÏÒ^¨‘iµºÜpS7M¿juñú,ÀsqöŒm›g0ÿí .Yë XÁük_²8qÿÛ%{‘³ªK‹ar¡µ:Å¿æRük8þ]UûЇž9ÇXÀ<Fk3†cŸ/{Ú=DX88—ƒ5Æ*Ÿ‚U · ¾é*ⱟbâHm} ¦.F¿ B×#I)dzF𢢀“6ajEÎ1Òr}2db—ùyä &2ÝòãÑ2„­{Œ÷´#ÝÚi`ͯŽâl˜XµÔ½r¦eúªjð!Œc"—žÐ%ƒÚ1ðXÙ©5j¹¯ДzZìÃpâi§Uä:wÃpŒ=×cc϶©yð¸V` °²0-× ‘6Sàâ§„JÆâ=Åýð[ŽhfΉsf`Çœ8®’7é« µï«ín êÁ³‡òõY–aO%^tž<°¯6ü"ƒøü8\ÔÄ£ªmÓvçš?Ì%7‚s5L¼jéà°<_ÀŸ¶æÈ?z¶UÈ”ùZeÐëbkOU®QG´…eÿš ‘E ž86ÑØ62¦X‰ù(Œ~ƒsHÿ´ÄÑ>­ø'i•öp°(7€GH˜(7‰út*h)åõµºÖ׆z°Ùèi¾H+îv®ÔËs¥yJ»Ð„·$b-ñØ@µ¥“剒£ÄHªï ûq»bºe¥Xqµ9‰înb|SpTˆÎ¿ªrlGÛÄ”zo¦ÓÔWãâGŽx¢£nô3(Åê ìù,Rr¨`Z9còO?Náï¡ w¡ ¬šhv̱Öö8I6GòÓªÚ\Z VdRM4ôÈ.æ8Ék.=.l‡—µ6]aÏÝ‚@6>IKÎŽîJ&ÙôÄ)›íÈ©Ç4¦åK„{£Å\úFa®OíKß(+¼þÃk8hBf¾ Í@®mþ¤ÌZV83#h]À ¾xZf­!—…5Äãj<ïO¬u–‹ÌÌHA dîÉyµ¶FøÂÍG9µ-\tœ6V„5Þ…³À5RÝ™®±"“#\Mp1š™.\§E1'\às>Óã[" "–ø¶9¡7n.ôndS̈^æÂJCèï1z=×3AW…yá烮<¾÷¶SºlÆG˜Ê„ 3@Ís‘¬-a’™ÜDŸÆs=²”Y; ¿jÆ]vNä#‰ýmŒÖCd0cÆ[eFhé¾<5¨,¾ž°_›%à4>3_œ,}Íâ´O”öÀ@ÜôŽÓVs~ ôR¿*ÊP€$²Rúà£' ²¯Øröuê8qo¬Æôæ·¦\Jùmoü^áLUUQÎ¥›*ß¿'–\¾;·c43(ã›÷°ùxfnO™cFªj§\M3’f“vå° Ýøž·äÂLµ§7À‡ó…ë’¿8U] ”z£¤µYúýpþbØÐçÅéóÔÙÄ‹µY‡/a±J:aôWO]+éE¦²? õZäy1ßóÄCfõ“’ØÜ ­ÿï¿ê.¹L¸ÜÏ·Kâ%kŸœŽeZ¨9’ 9Ì“9œUo_>äbn °÷?¦w[º endstream endobj 2855 0 obj << /Length 1518 /Filter /FlateDecode >> stream xÚÕZ_oÜ6 ϧ0°‡ù€#ê¿òÖamÐ{X›=µ}pît‰·»sj;ÍŠbß}”ä»&i†µMC4r’hYä)ÒöÛ Aìÿû³ÃÇÕ¶ôgQƒ ¦rAC°!„ªÕªúý@Tgtùøà瓃Ãg «@—¥­NV•±`ƒªœ‘`l¨N–Õ«ú—öôtûÙ\yU˜Í±Fú1MýÇû‡tQ×Ç—í2ÎæRX”µw³7'¿<=9x{€YÜ/¯=8¥ªÅæàÕQ-éÚ¯•|u•gn*êÉOýuõòà£ÈBUíùM‹ã/˜ù©\Ày“äJô ¨À袼¯’¤¨YVHt0éÙI@c©Q@ü²šOäln¤©¥"kî[B½Ó ‚Tö[£}P Ù ÁzÇg!,7µM1Ñáai_Æí²ôþ¼ÆÒk¶¥›‹ñ}é>ÂbOë òËžÖ€ñÑž6€5ê¦=?ü—YwÆ$ æöªÏK¯ÛÆÒy-Œh¶ï*££#ãtórÙÇaà±=l¡8ôHèœ&†Pè¢GV¤ÊÓAÁ¸a4…fŠÑÿð@”t^k|\ŽŒ*HF» mܽyÕ¾û\OŽ<;Ü^+F_H$wÓ—3pÃاï5ÚC¼Ã{Ù¡+"0&çFi@+Yý-¡y\I¶BðŒv„eM²oÝ9\ÄE»jetÑôÍ&ޱç9Àµ 5c2®-úŽð°3À…©ñKO¬¦œü¢«Ø÷q9_·«8¶›iÏ(ËôE[IÙ2šÛZÐh9ÞÖ¼`Lï5´ÞòbT¤‘*´k‰àcꬥg=sÙõ]Ew Bh4£»£‰áÎòŒ1È« Á ÃæUbᾓ(¯<‚0Œy½òP"gTÖån|ÑD9ãx1Á¸Gå•@a‡Ñ.ZƒvêqWâJZð†1 WTÿ©ÿ§ç Ù„U!gÄFÊ}/‰¹ rÆÄ\ ^²¾+ÞRr€|¡AÒ±&æ’X[ËQ|ìZpÒ}Æ;%·”õIÎD^éÝ× ~'íôíï)Ôç|OqëS;”¡øIPAÏæˆFÔOÿn6ëX¾üÐGäÛˆõo]ˇ"ãy:R/?ÅI“®½&<|æoÄ AÙj.˜0Ð'Ûn<ÏŸ¤·é…qÑZÔ‹u·3éë±\½šIWw—ëeêzÝþ•±\»Òv§cÓnË YH»#}Ð2L³¦WíkZ"ÝFëQ…±šaÝ,ÒôI¬OÎãûi±~b¸ Z´é'úÐn1a®æ;˜ÓÎÍ0Çó6±!Õ1c»¸\7 sð™«Ï\›E,S¶Ífê-ºr• M·4m ±,ièùXˆûµgsšÝ C{šMFËg½Ð¥åÔîÉŒ %q¸J?Ó”Üo’.Þï=kû᯲°¯‡XÔVF2«@ðSˆ|¾œÌØfVIaë'ÃÐeqm3¶]ÆGû-Õ‰)ÃHSV]_ˆÃyשbLæö3W,÷¶ÓÂM™´m³–‰0iù:ŸiεŠ4Q³\6B쳆6D;\‡º³ssQlªSç2謧Ԟz4¥ÙtI«’Ö[t›M’8QwúÏÀ¡[•Ic\¯ÉjXŸ•ñûwiZrŸÌê¼w½vb?9Q6Pïèûm‡1.÷´¼î&»÷´â$Tvï,zQÜ#^¢¥Ó̺‡Ž—˜â¥1_/2¿GCùz¾Žrp~Êï(iYÞ#О^±œê¨!AkEIêzÝÍ7ÝrJIsáA- ÁäD-X¯?¢^ÇwqÍùzQËC…=? ¨¦#¦-‡g)KW­à,¿©‘©¹u D¢H0þãûsŒ^Cp’£ ”c…è´T|û×ÐÞß¿ø°žTõേM•¿¹Oéq»ý‚»Âõ endstream endobj 2779 0 obj << /Type /ObjStm /N 100 /First 983 /Length 1848 /Filter /FlateDecode >> stream xÚ½YÑn\E }߯˜Gx`vì±=c©ª­ H U´@Õ‡6ݢȢd+_Ïñd%Íf3iW‘ª®××÷ÚkŸ±o¸5N%qk–H†Ðu ¡'®CSñ_hº¥j=„’´ % SëBOÎeA“lz©‰Êå5H•=$77z"+qÕK¢&qÕ !ô'.žAE$.W¸p\9¥-žçqçáBW u<±”T‰ãB¡T9"èø!U"‚^RDÐ W•l]ÃoÖW{ª# ^2„h>2™G+EíÌ=°‚ [©C'úÐijÄCgöà²ñÀz¶±ÑâÑ£Åòå?­Òòë³³õf±|ñáíf|ÿáôì÷Åò›õù»Õù«‚Ö/¯—ß-¿_>yEãËbùÓêd“^¡èÙÐDøDHZ=+JßY›ÀîëôèQZ¾HËo×/×iù4}qñáín>]ŸeÉöezüxËÓô Ðxø)-þåW` Z$“±gþøãõíÆ6Œ+µ\QÑÃÆ½fGú+yŽ<]3~¶>ÛŒ¨Ÿý :îz†Âoe´@Ô{û…SÀ ¾à Ëççë“+$'-Ÿ?}––/WoÒÿ¿Ì÷ó7¿­Ë'p´:Û\Áµ¸?Òz±þp~²:½Ôý¸zwúæ›õßiTÂÐ> ¤öù›sÜ C$|Ž*^ÀñàÞˆgpïV¸Œý£@>¹ð•r¯çîÑ·5G»€2Xøî“_­ü}ƒÁ!p%&ɽረ–9X˜ˆ£J”í æät³ÊçïOªº/± <Å  ‚ KÖÑÑø{Å1 ¶Ÿê…û"l´±½RRðÔѰ܋ÜÀršŸŽåºƒ°ìß ¾ƒ¹ï`î¼vwùî.×`;¡í„¾¶OŽ`+ÐçõÍG!Î„í¹–” fê@l;ˆ.µ©µ †Ö9ÇôQIsAï˜Sföƒ‘àäÓãEBÒrÁècÈE‰³Íã{Œ{.v {ß¿y¿ùjsúçêßõÙꈩ .³¢Y€²–1s"@ÉJí!Sc%WÌjž1ŽHb^T†ŽÃ„ÂVüv™ E‰3¥Åö˜ðQ¹ƒÚêQÉÞP âœ1ÙÄŸÕÒB¹É¦$NÇ/fŽù0R¢1jc¬zÀ”D°#¤Ú;"²§3V¬-û½\»÷#¤_²JÅÈ âê—¬RüFú‘ 6¦bÇdŠ¥ '³Æ´ïp¡Œ„:5v)à3Љcú‰ÝSÀw½=`$X’sì€ØTDÎ&¦ä¶ÃÕ>✧Çz_r,Šœšš,W#±ZJle – >1W`uˆ%œÐLtW$òñÌ/2Ž3³}òüE|sþ¢27uæç¯x¹±…úNðcî•ÁÜXt±0æèT°™Å …nYÌï^%>ëÀ½ ƒ1½©ŒÂb™£ÆË  R'–šv¼P*6*¥ñÖ K €3€´xã”]&ÒršDó«õuãËÕºUdµ?l¼]­ãðAüsÆ8K«Ù¤1Z5¦ )cë-³µIãV1SôIc gd“Ù0A y.Í [[sÆ&õZ§¸åÊrw`9äXGÚÍåð“ùˆõ&q½]Íßã ÑuãË”`ì8ˆ§Œ±¾gCn挱ïËô“ñ¹¿Aö Žl›5f¿¥Aö“ÝÒ ûŒ ßÒ {Œ£×þÙgŒ-°ö:g\ ]å2k¯¤&³k1Ëd6ó¶ùd6¸aÄ‘Él°QžŒ˜1Z(úX”&¹dWž4.-K™¬yÍñ®}θ—ñ®dÎØ ³Ä¬qéYûdIƒbõÉl8™´Å Á>™8ÌMdŽì¯¾Ö»FöGxŧ{(]?ƒÒõ>”®²g2{¸Os oÒ6ª¾·at_u|©È¤±pV̆á`)Å&Á»ñ¾9ã‚©¶L+x·jŸ4n· ­ûŒÁ»<ùû'V£Ih(ˆ—l â¾™3ñ›„†xûÍœqóì6 ñ M¦N”s¿:îÿ=õ‡ endstream endobj 2902 0 obj << /Length 1753 /Filter /FlateDecode >> stream xÚÍZKsÛ6¾ûWp¦‡RÓÅû‘[š¤N3=4‰{Jr %Hâ˜"‚Š“vúß»x~Hi’zŒd<ÀÀÝXß®ô® OÿýúÆãËÓ¢-0üIÂ5¢P†##1Eo‹Uñâkh>=ùåìäç_) 4SYœ­ !‘4¬P‚"!Mq¶,^—OêóóÆö³9Ó¬h6'%A‰(ÿt¶ÿÑùF^žîë¥Í)–„–ZÏÞž=?yzvòî„{Èôz®‘b¬XlO^¿ÅÅÚžq£‹ËÐs[@ýPoŠW'·LÖÁÈ`C¼ÉŠ!IM¡(CZD‹µÝ°ñs…ËËÕeå?>FA=Ärèbél»Œµ®µ±òÛ£±r¾OëvFÊ…GÞ@e¿L‡UQCzYµ\öÖ¹ø°QÐ4¸éɘB-xùÊöï}‡ÑÔíu3‡ê"´¥§ÝNoñïìüìs"‘aJ†O ¶èZ ÑWCÝJÆXù ¼œÖ.¨Våø¼û½6=Ƀ( àCçnk}—i^½ðɳǼ—±^owÝÚÖ¿qj]l˜ùÁ5Ìܺíúô®aÓ9»M…‚ÏÀâÅôî}Sðòô¨W‡#ýSyñè@ 1­‚ã_ó¢Ï+{ú.fˆP}ÛwÙùîkû|ÏCÔZ‚rrvò‡ÿ; ôúF›¦vªH;í‡Ù\PQ.šÚ¶Ç[}á~¹EG—ZQ¤yNÐ ö–tÓ­çÛλÛtýµ0pžÓŒ¨%ì¡®P7ö½m"l‘2Hq–27Hc!׫j‘Vù²^Õ8Vÿ΃œQD³{@.˜‚B‰¨HWH]eÅJ°jЏ…¤)œ°ŽWv¤X lr"Å™¨0 É|î+Œ $"ý'F¥1*ßá$`Q±¤_‡ñ¸åL½oªäµhØe_C•F­·"”#sÁ¢8щ4@ΉÀåÓ•g£1"á#¤|±¯3FË‹ÅQyƒ _ï'Ž Â½«=¿o×ññeµ«—óE·ÝÖáz¿vŒÄ›b$à˜fÜ^R»XV±\Á¶véii?,˜C|Ê 7u1J„›*<G7Žð!‹‹}|´(eˆ'¢¬òAZè7MŒU¢lë{—^\5.iwûÝ´(oX”ô7—h²TÁð8øf05lêˬª "—ëîðÀƒî·p-÷¾¹Öˆ1óÝ.\$qF6ËÜR}ÓÀ… °ÈÈg¹IÔŸµÃ†ä¤xœs$0ËÇ8‡+A&"s×{ÔmÄ4ŠŒ4Îf„ÉÏ’(ıÈ’Ä“Sw»x…ûU]¶nîïÛçÁ}ÎQfÜÍ'%w'€c̽ß9 FJ}? Il˜_1@yŒÊÄ_ Õ`›š ¤Èßú´\ÚÏQ»D‚G:¢!\µñáíƒw.­§[œGºåå¶Š¹U:2)¨Õ©ñ²nš(é·jT¨¡×‘ò¸ÉüÎs³hëüÓÙä‰"c\ÚÚÁúÑ= v¾ò ò§˜-†Nm Td 7­ Œ‘•¿Û!|Qà›œÛS ~™²ÜS½šæÙ÷ ˆpH€GÉÒ´ÆE©º8ÍÐP'#«øØtëXñÁÖ&ODòºâð%šc]œá«yåÉ4î"‘u®>oœàZ~œ½>Ìå3Û§þ#Ǭ ¦ÏšwI¥6öá6>#®‡ûÞ÷ŒpDÌ÷“$§.(™1_ þ…•ß”kRÍ! 6Õp;)y4]¬ó@Vàd2'dŧêØ÷«=œY@C©IƘ‚JŒ´JÔúêÞÊ‚Õg}$ψ•+Ĩ9?á<ˆ©AŠˆŒˆCãâæ‰ )Ð"3æŠ)0;ʾyø@1 9qcP¬ÉàÝÖÓš ‰ö¬]åM C„ÑCÐí°Ë¹ÚD $ˆÎ\$ô7ê­ÿåì’·$þ×GqK‰0ㇸ]wÁ¹n· ˆ?º;çgèÉœi[oë¬ç9¡¸BNàT@à&ϹâX!¥rº:D±š©£Àʹä†#J3fµAÕú¸3®¸ÆHªŒ4\s¤˜¹{ÞS)˜?uï¿TpË»d=o—ÿ5}b endstream endobj 2943 0 obj << /Length 2722 /Filter /FlateDecode >> stream xÚÕËrÛ8òî¯`Í–ªŠ1DnÙx’™9d“Ø9%9Ðd±B‰6IÙqmí¿o?J”åIvfÃ-WÊQ£ñê7lÜDR$Ã_{5j¾m¢þeR‹Ôš(·ZØÌZµ.ZFïN’è º_ŸüãâäçWJFºÓ,ºXF&™UQnRa2],¢ñYuyY»vvª Ãbv*c ÿ™TšøCçÚ¿wØ©ã×Ûjáf§i’É4.ììóÅï'¿\œÜœH¢GËëBäJEóõÉÇÏI´€¾ß£Dh[Dw4r,€~€ëèüä!É26±rŸæT‰Â0É™€ €Bi’ø—¯åúºvLaþ|vj¤ŒÏî7庚3Ogoι÷Sb’W3•ÆïÎÞ,‘Ÿ_û›ÉLX•EÀ£0Ö (Qñ¼®Üf–qÏíªãßò’h¨oðWÇíLÆeyÀÖuúIËm]òžÞl.ëêS"µ[ðˆE³.« ÃÀ ­ó ›6®„i¥©Ã#ïVÀ-PµS…Ý3غ®©ogÆì‘ºíªÍJ!: ŒK%Œ–ñævRy¿Xö$[7wÕ-Σf·ö…V ¨2{FÍË ×`9EìÚeÓ®Êàöåñ¢ìÛ64zîÛÙ5€|É¢ÏãñÊy\’l¿p–çî’ÆÞ3v'Cä6óyWõ«f‹«*EÓ š¾nÝÒµ­ÛÌIæZÇ¿ºÖq_Zë$B`®l+èo„;î$»€ßy³AM_mÃB#“ꘅ2 0{ÂÆqe÷å99!Øo ÿA¼#Þ¿>ê¦YfDn3tSÄ—TB9…’=¿üöaä‘m a } ÔEƒïÞíÛ#ÒÁ/Õù!ÛÞ þ4ß¹Ò#‘+ƒ_%%ÛÚßÀ–SÃ:ïØÂò;5øýÕµ.Aâÿc¦¬¢R#¤.&TTjE*ÕHQç®gBRßÌ›š[è£øÛlœ–¾cå˦®›;Š“Ø¼-k8žsc»¸~æ‡ÏTnî§±)áh³JU‘eš¥ºXlºÓ±(A“0n€ÓÄ<)0…&‘ÓéÊ$†Ù¡t ÑЇk>«É„«µ£Ó˜baÞ‚ðº IÖ×m&PP¹‰ÌöŒz$†"I¦áÛäB'éÓ2j‰¼šPW:V#£ÞnæÍz GðÑ`]W!¬‡89ØÜ£¼ \VýxÈDW:%zBé)-T¸+zé5×}Õx/_Þ,6§Ý¤"€»JnÌ„"€Û`‘²êæê´v·Î^ù4'JÀ­ûI¹¹.¬ÈÌ„i¶¶Jä©O³«eüÕõ«„¡M¢,gB&S2^$BæéÈCáj8®ƒLµ\,Z×uÓÈ"K…1S¤ðyNw,ÁÆ©Oá«r&µIbŸ–w*#t6¡*+Àø¾e£t®Ld𩄬`ŠÜ:O…4lh„ͽöOPÌ;×ÞºvÆ“ô)—©Ðiv„qþÈ9ÓÊjQÈt:¦ìPäùC¦1_š†åBŠ4SO*,©,¹œ0»U¹yn¿—ügto¶e]-+üN¿gÂó7æp Æï9軪®Ã´É®ÆÊh!³)²eÐ]wQe NàÿáëXœðpSZ‹l|¿¼o¶þCoéÙ/뮾$ÞR! «jwm>!úCàÖ]•íb¸¡†ÂÄbÏÆ&‘m JΦ”­’BªÝÇó¦­Š}Ê}í]+| F4íÕ4AÞeþ¤Âlj±$<á—u•h‘(þýjV©Í„)ä®Yá6yñ_•¬Â¦û²•–s7¥p[ÓÚôoX8´\ž*¶ÍË+¨Z&㺠tññÐÚãÉ x~éUáׯWqÅÔÁ•¯§â2ãè÷.òîì ·.CÝ`. øÏëÝ6ïÝÍÖÁ,f2^0ìÖ×=O´˜¼·™É¼ c©8“T¿EdçKÄó])°D-ü~ôfò§¿œUºk‚Ba™ñ8¯À|Æú±Lãs§3*Aó‚[ÞŽ˜3açX!Æâ60Fì#MXrÍ©äJc‚ ‹¾u/=‘WyVöмž ªêÒ‚×°¼ßº ÓzÌ)N³Ö!æÃ¼–*Ê||ªp÷]Ž ©aÍCzR¡¦®xÈð°Àò©²É`‰3çe¿Y Üã‚~$I¸j7È…@׎ÓÒ«m· ¦Š%ƒ#\}àí°Šà%æù49"QÂèýWA”—¡°b%Ê`ÖŽ2²ªÏÓ;X¶ÞNaÐx“<ösÙ„ÝúGžírãµÎïÙ¹°ìn–'-ó¤åDÚž,ÂU°år~³©ý«ƒ%¾Ä/¸×SÐN< ߉lü+‚ag|Ãà_ =×Ux‡Â"ᘇþÜikɆM’øŒ1ÞZ»®¢§#ˆ¢l}Ùà¬>ÌAS-¼©Ò²XFBÀ'ĸƒÇ”ü³ªövØiŒÕê±#ãÈuuµòq|_~™±„°³ \ñÚÍã ,¹jَó‡äeÃzˆãBCvÔþÑî¹YD?G”ñ4ñ¨ZNµÊâ‹Y–Àã:Gf‹tþ)Íĉèqsî[5]žÝH_÷*¤¿ôT^—-töümáÐ éžÂ¶Òõ-‡|¥é=ÌÈÂ3"éþ3„g<Å/•èbÃK®šm½x`´zÇŽ_èq“¼¸Cá4ìÐ#ÖàØXë¸}Ç>æ¸åõí-¶s"˜;h¹Ý³.@&¢Rðƒ°q“Ú\d™Ñ)`?|@–&daôÁ‰æ ¥éü¾©ñ¼ÐN–©¬‚k”…ˆ I-ÍN’ØØvΣÙ[$Æãõ9ßnª¹·dD³N¢".#¿Ê ¿¨kòY¤_øvŒ/p»lÝ11AÀ£ªžgÜõ_×åBióìØ:9æ]~@??¶H 7ödÐGÓ[_FÆø§HŒÁ'©ô ~8öS\]³fð›©=0оõ1;<ÚÚR$P&þpö6<óžB¹‚’5³,«º{æ{ûà|èÍîpéÇ[\¼Ä0ðvVh¤1çbׂgíž—íŽj+SÂÅȨCûˆM§Båƒjùú¡u{1eô}q$§uùµb³Ä§lÒÒ«†ÊC«C$‡Mø Ü?ü ÿBbò8?×í°DØ¡ë¶kŽnÐbÉ÷„v]àCÌ–‚2…cKG"vRèF"3Ô#A5Ã5(²êH3ÝãîMƒï(ÒC>í}ƒâC‚é'g¥]çƒ0bÇO)Cb‰{O)Á°R+‡zu³ºžg ±»@JÕÕ€]dµˆÓð¤ì)€ÆïÖMb–h×?<]}Ûm$}Ù°Æ7$f_¬ l/›’¥pÇGG¬ÊŸ< D ˆ I.Ž ŸÎ™®0ºõk`¶2­(GYÕÃu$}Eð³Iò0–Ožö c!d¡ƒàŒ&Ê™]Ã#ªå1c8ûõåÛÛ Ò–‘kÉ&ó˜ŸÒÙƒÖlµŸmx çx€bgÌ.£ä¶×†­ÃÅfAöä§ú°Ð.ó…FÙ÷xw#·ƒ¦ÏAaEv@"Ã1-¾õ>àr0ÎcC˜ó9*xg.ÉpÃÿ)ʨ½ endstream endobj 2975 0 obj << /Length 2532 /Filter /FlateDecode >> stream xÚÕ]oÜ6òÝ¿B¸{8-`óDR$žõ+AŠ¢@ç^Ò<Ð+Ú«‹Vrôa'(î¿ß ‡ÒîzשÓ4ê /ÉáóÁ!93⻄³lþïnš¿OŸÌH™¬·g¯ßdI }?$Ëm‘ÜÌmuüC½N^ž=`¹HxÆlf9²l$ÓÂ&FHV(âøÅ°ºÈs•V=–:uußä¸+Ò¶ï+‰:‡ØuÝvëzI«j𧉍O€g+˜åçï~"p{;TmC=4›N3j¶•”f ž¾ô‘Äë œ –‹þ ®â~ó—çg ׄ¥È›™[š¨\ñÔ㊠®‚jEîüëʪ¹‰ =N”\pͬÔPJ¦ò¸À[ïÀdˆìaO»Y c­Q5+XÔ¸ÊÒïß»í-j—¾øju¡8O_4+)ÒÁw×níÉdª¦ôï}O³,ÝČȘ²9QxÕ®®?¬`à9Œ9j´½›RÈ´q[6'Dê:O•Î_û®ó%aà: ô Ç~ z&U©g /¨”7l2êG•bùc¬díjjÝyG³~Û6_ãj‡Á ƒ»•0©ï"…þC?øíãš&C” ¼Û®EÎî`à ЧcS½=õ‰Ç-þ^^Âöƒ×÷‘¹Ê AVy_ êöncb«j®£ÖPh¥Ò1ê6ô‚x5͘¿f<Çe¢fPLüPóaNÀBá­Æm†’f$cÜ{¸ç¤Éî4i8­ t:Kª… …]§Œ±G&öc,x@Y §`]ëf&`%Ô„¸n·[×Dú¿f*û‘¤ßCƒ7 ÿ)Šœ0¼ØQ¼ÓD³º~‚j®ÛLØ 2¥tú¯Ãºß}RO]CmO[ —«ÈÒû îè5Z؆lJš{hT¥ß¶M?t`0NÊtÓâ{j¥C9ö¡÷x;Éy‡~Ï$›$óO8•öp.:Ò5HÎ5žèžNoÉda­³w„ÿ> ó˜1/^òcÇ“©ý>æ?ÊBÉùC±ãêüa¹é^>0¾IYÆ´‰‡ñßÉüÖuå›­Ûæú‰ øtŽN-µ*$Ë´XNhUÆ…!¡ëöæbÛ¢›²÷›¶–‘Z[¦¸\Pjpl”)vR×þÎ×$¶ZFd¥À1ÌYƒ÷#¢ÈO$n(~[Fê\°œ/!µ6,ËÔ,7ñ0¯Ü2B‚SWhµàÒJîÉøŸÏ¸gÀ@YÅ—¾hŒ6æ“.š‰êƒàêXà¶0©vµ=åPÛèPÿkž–oʶ»èoÑËLý:¸kkò®)øxªw‘‘´Ññ°Ç^€‚Ã%Ü'HæfìbGIqàE¸o‚q8Àõo©b“¡â‘ƒÔî‰êžŒr€ŸJM¿®‡M;Þl"…Ÿ˜pS¥iw³'N äλa¿ª QS6È …>GˆM1D Ô˜8Ö˜ˆ À2¸X°©â¼Sh¸6ø~ Z‹‚Q¢hRSlWh Û¨gUsìm_J2S3%™åÔ5AÁ) $°ŽŽµÁXÀk9c„õÆ䢈Ý[úæ¦j¼ï"!ržJÔÄ< è³£¾ÝDfš(O]¹­š€]ï8ËA_ÁFÚnëê‰n¹/ñ´¸Àyuqjí/ÉV„ÅÐbc¬K,81ä‚Ä=AhUxÑ!š–}ö¡ç”å㘵k¡óºõº3w2@Cš!# }@Û|.³ôYÕMã)„k«µ‡# ‡øÅ@TÜ£6ÿï1Œ7–ö!VÂ>ÄJ´G³g¦ÁOÛ@8H±Ž<8;¤aBÍÑËθ Xa…Z…Ÿw¸‚Ø8'ΡL„lOœ‹Œ™‰‘5ú¨YŒÂP'B§/=lÇ’º• ڗ¦ˆkpRì‡ ')PHËìƒ0j–њݞ€º+)"áîq!Ç]Pp €¦±1‡šŸ"­Û® ÑÀæ@×Lû±£ŽÞç(™L¯Æ!â¶‘ƒõ0†M”npxFJ…{¿+ ã@;ÊÔfì k|pÌÒbR¡)§x]£t¥§6-P;gÊ£øG2MÌ-ÌÜvä>· ED)…·FccR7ôÅÓ8‚ÙM óu6‡Ì§ŽŠ£ýÝeѯ»½Å³¿b¼œ§5o‡Ár{58LúaoéûŠÒJÐqå6Žò6m÷9á²ךöK»1RLšÿxYæœ-PÈ\1“©¿4\–àj#WË ®6WúdàX,#2ÏA¸3’…ÌŽ”Û].v”tÚ“à'±L.B¬„‹0@ʲó}¿ˆ DaXž/±ÇaàH&à1•‹†ÏÂHVØ?]È/zö ¾`È/tÎr~`šÓ…íL RžšÆ©] -å^ò†6“à€äçï)uW»t5±òÑ÷N{Ÿgxvêû ÏâšWMµ&n@"d@|,ºÿ]&Òùvÿ›Jnc~¬KjÖÕÛUÌÝçô±Ë9Ku7•øŒ¢=zÊáç>?xØÀø° j»‡M#ÀÁ+‘²éOí9x7¶Ã”ƒæÖuo?ò¾ÌuíH/nŠ£×'ÂgYø<ª—ÿ€ô{ýÚ‡-Ü»ðÊÊÊÂÂD!•¶"›jlŠI>× Õz¬]wH™¾RðtbÀ¦8“ÛîMû›¾»TaS¤¿ì>r¹·Xûó¦ÞÿR’ŒÒ endstream endobj 2899 0 obj << /Type /ObjStm /N 100 /First 969 /Length 1322 /Filter /FlateDecode >> stream xÚ½XKk7Ýß_¡e»Ñ'ÍC# äÛB !ö¢­ñÂunKhð-Žé¿ï™qibÇ”q(]„;ßñ‘FÍèhBÓVi…ælEÔ{YñM¥s\:80¤‰€G £pÄ k ³H“ŒUDÁd²ÿ¸(ЋúTsQ—aH±ˆŒ2[ V¦úÄk–¹Q.K¸Ðj½ôFaa©º[k ·´ lÀÒÀ {kMXØ‚µúŽVo¥ ;†a]¦ó:¢¡|¨ù¦0ÉèêœÑÜ‚3kÁ™i`æñ Φ4wgÆEp¶¸õ],Âò 4Ã"‚5Ãöz Ÿ]Ãø¾~2¬¹à‚f!æÀ@açû!ñIÇ s ŸÚƒÕÀ0l´Àü¨%°á‡> >“Út¬yÊD|„nC¿®Â͹°4î €Ð05_Џ¥~hˆ>Ó YÄq¤2aÍ È!@Ž!˜,± íȶ8p%X#0.PÚwÉ·¡°†j]#K–ÚšæÈ™/š%Û¨.T9òàÊšÜàUg›I2Jº’d¢êJ#·U{rºp½'ÉŠ`Œd0dZ•ÎYò‚œ$×,†5§—1¨öž%ãRÔ‘<@a­­'ÏD¨COr\¼S*Q2Üq'eÉX²%넽\³ËÀc§.Ë’ âš½5ð ­Ó’gBq¥ä™@Jjzb‚¶&“Ow(O²¦Ð@y’ç‡~Ê“\ZH$ÉJUf23:Ϻ8KƳ’g23zïur23ðªD¿™’ÖjzGf¿XZѬ|&­Ò'­ÛÓ««f;»m™|=÷Üa·¼ÿå&¾¿sõûn{v¸~½¿ŽÉÛùöíöÝöp~îë¹ÄNÈ(Þ>­ÞI£o¬Ñe îЂ‚÷4btR¶o§‡‚uùæf_¯½DÃ!_{`> ¾Ð#”ÿùo1g©óAùz€<ðØl:³dHîèI2~¹S’,Ü‘%“ë'ÉÝõK’äæú¥9²Nׯ‘$›ëW–< _#yÜŠ[ØÿÓ#GFnðHæ†âžÉ3ÑfPÆdj •®FYòlµ[r‚kxP25/¬fÉÔðî^)™ÞÝ/Ë’ÑÝ %SûûiÉÔðöž)™ÞÞ›%SÃÛûl˜½»ÙEp‡@'3Û{½Ÿ ÿ“&™~®IÆ_®IÒþKMT®àN0t2Þ' _Œ×³!¼ÈžÇk’É#4É䞥Ö8IîRU>©Ë¿•¢$ endstream endobj 3005 0 obj << /Length 2309 /Filter /FlateDecode >> stream xÚÕZÝo7÷_±è=tD ¿¹ì[.mƒ= ×:O¹>¬%ÊZxµ«ì‡e£¸ÿý†®$ÛÊ%=WL#~Ìr8CÎpæG~È¡û¿îúAõ×7Y“Qø§™$ܪÌXI¬¶ÖfËVÙ?/hv Ýo.þ~yñòGÁ2 Ý\g—«Li¢­ÈŒâDi›].³÷ù÷ÕÕUíºÙ\"d6g9ƒÿg*×»îÛÞwÊüÍX-ÝlΩf<·löûåO?\^|¸`a>l?¼,ˆ"[l.ÞÿN³%ôý”Q"m‘íå&ƒ2ùC¹Î~»x4å"c”XjÙñ”¹ …—ußÂŒ4Íw3nòv¬—X­«›/r‡µ!±¼\,ÜvÀ¶wMµ(û;ífãéGß8Tmƒ4Õ »AòÛ0\‡íý¸Ý‚ôEÞvCIЖâ:¨éhJeã?œ¨ÊºŽäͪí6{V,N‘æWa\ç5 j˜3A”ŒËS·××äãVæ·Ué *ÿ¹ Æ;lïï{ îeé6mÓ’‚å—3XÓrRŠïnÚÁáGú°tZÄÊηͷÒû™™éã6Jäèb“— |GS¸ŸfÌÃò{«—mÕÄyîªaÇžçú´ô¾kZÒ«b^;\“ÚK(eþ/ªè»~ß{"ˆ<çý"=ööë¸[ <);퀕°,ðk^àïn]-¼ŽÖXõÒøß¸af%6,ݪë8ÈíLÆêÑÁ Æ»:Ëöÿ]?løõÍIsÒ…&ŒÌÉ·O¦#ˆ(L0ù#ûù4‡‰òK”±­Vü7«ýlnŸ¦|:ÃI!ŸˆwÇÿ,7:E~ÂÅh£¡IãÆû›·k•/êÊ5Y´Íê3Wðógtr­•ŸÎ ­a)³÷5óMë}¼—=z•$bKEŒ Å––´8ˆ ~Åû/·J#²à„Y™Pd¡ WѯV«r—ù›ŸÛEEÕ¹K¯Û¦q R}ƒ ¤Ñ 5H•@+ÚJy¦9'†F­ŒStà¾w}‘©"Ô¦™Z¢›ƒ€"…ŒÊ2F§“QYXZ!!Öšt­ N¨æ(俟a(#aªç0<—‚þ¹câú(£9¡ )§1AФ ̧0LÑü‡»r³õq«Oaû¬›±ü—â2&ï0íYºÚ]c\Z|”0 „Î ï! và𣬻vã£cˆ×>6Ã…úûœÉ·ÄŒãõÛÚ~v[¹Ý ߯!iüt®Ç.fž.DÍ@÷a¬†È ¯¼,>öõvÀþ*òêPv!Y€ZˆÌ¡·Ç)¸Eµº=«‡ÒÄ#ÎÜä‡1}8>Ÿ„÷»8j7Êâ:×ÈÌg6ð«m¾Ý«Õ×j 3ùo!múÏ–¸gañßÁ u¨ÂvÊÞ‡¡$Á|sÚ ¾Æ| Y]•!‰¸¹îÚ±ÙOjId\>´‘YUKAUu‰“‡oQSô£“Çz ÞÈP¢$ýgŠbM®ˆ L<‘Æš‰Åç £qyjT –n(«ºÇJ‰©\;X?No}ýÑ $Ç ²#ô7X@µbùHiã¤4Ÿ:Q™»Ív=‘ÌOéïXÍ>mò ŒÌPˆ®Ýà |¾ÛÎË—§Ì•›È|òõ8õ“‡¬ÖWÆÞ-Ÿ“ŸIȦüÜîS‚ûüŠÒ3© BUÂ]j˜™ù¢é™”’(šRhY¥‹§A»Ö4id.t*™.„“âbf÷!ܼ4ùe®È‚¯ -Ë%HiBvÉ ‘4aÈ.9#2nýíòSª»ªîÒh‚zXV'4 A6gÏy%¥Dj{v¯ l4ðsƒÞGœDs›A@Kòv8'1ð„Ó¾÷±O_]Á‰]ÇónB7—áTn" öSùS¸¬ã÷eWnDyì »+ÆþnXý(P¾ûî«!@$‹j:çjHÑnׯâ6!³éÌGhId!¿è!*$äg Ód¡ IÈ'g¨?BSž `<`®é ! ˜:œ Ee«›Ø=´`,þzPDPk`(+£”¦—jÂ9O(.4ñ"Gqy*q¹åD‘n'CºKŒ(þÜ¡ÿL%Œ'„çyé|aŸØp£@YúÜG©gc…>K`Õ%ÊÆíýz©!Äàt¹~ˆ—É&ïÚq˜pŒEÁï/ßÏNÒ´×,êr;‡h@øÂ-\uë/×O@Æã€&‚óAiÜöCçÊÍSže€œ 0tÕ4Þ0¡&ãÐΟ‚iü¨v /Zá¯ÇÃmw³gS¨Úæ®>àh"ðÁÄ®ˆp_Ð ,<üÖ³€„…JÙEÊqûoâ½ƦµÆ|QáZd¾8ÚÖqU»Hïña˜¼òê|} ä™’3¼,âu¾Ã—PÔ,ìî×O÷ý~}CÌÙDàfŸ2°<®–olÚá€äǸ2o¯†²j¦ˆa¨ðr@çoWñ²=…Ìe}Ýv ΫËÓþ|!ÑÝ`­Š¸U|DÑ‹Ï^P^€=mØ»aöä:¬¤ž!,Êq¢¹Ãû×E^å<Ž`%ôìé'±piާÍÛa¶'ŸnŠøÝ'ØAKÖóñA9µ‡§¾ÒßTñ¡Œ[zƒ{qjGTIW Uyœ§¸»m]-ªazá8õ¸q]9Ääå±á„‘ÎÞÏ×·½w'°EÁ$xµ=¸¸lwM]57sp ö—>v ÕþìH9,¸šFxN2Ĭ"Tœ=5e0.çæ«I†XÁˆL˜ ±B…û’¹ƒÇþõ\λNJžztÆ…R‘êáÃ<¿ÝòâÊ»ªŽ¯®¦‡,à?â¥~¹ g ÂeuÝZ5{W‘dá%%…LøÐ‡I Mæ‰óŠ žÍûȘƒËžŠiÃ0n·âÿË `vF&Ì3áþüØ ^} ü åöÖuGXG’•¤”°$¯Yö %áú‹ƒ;ü$yàK‰a{h'…„›Q›é÷P­þ €~mLÏLKŸóO¿ÿ£Öræ endstream endobj 3045 0 obj << /Length 1692 /Filter /FlateDecode >> stream xÚÕZ[oÛ6~÷¯º‡É@Mó~ÉÛ†nÅö0tmö0´}P,:æ*Ë®$'5Šý÷^ìØi»¦ËÂÖb‘‡¤xî<Ÿ¤·Axÿß]uŸ?-Úß$Q# e82ÒSt¶˜¿pq ÃOG?ž¦?3R¦²8ŸB"iX¡EBšâ¼.^–OÜÅEc»ñ„iVÂhÿuôÓùèíˆ~Èþö\#ÅX1[Ž^¾ÆE c¿q£‹ë0sY@ÿÐnŠ£–X×ÁÈ`C<ëŠ!IM¡(CZDΙ'XÙŽ©.Wß!e½ŠÄv5ÄÆµ­Zÿ›(^â1)ƒÐ¾?¤%ýºqC¼Ë°°‘¶îì+Lø;ÛÇj3¬–ÕàfUÓlÇ ±Ç@g¤téÞ.Í[ƒž€©¾w ÜÃmn8ìÓõ³¶Ý±ëTign¾uí¥W1˜*bB$2L•!Á“µ«Ö>ŠÓÔÆ ÂÚÛ'L«‚%uiSº¨ÛÍ«™cmµ´à’àò·Õ`w ª!®.ÝäÚ5Mlu¶­£™òÙ“H[Ú™¿õ¢j]¿ŒC›Þ6¶ï½Æ0-7­ïÄÉ{ úiUã5ãɰ ‘¼dÅ$ s$y?ëÜÚóÆX¹ö Tì QNhÔ°óe5Ø4¾ó'Ã&B· ŠŸyç¶¼îÃÂU¯‰Ã.N_ùÞu‹B€²‹bÿÑzLxþô£A"µD lAâ黀`ˆiù0*>»ÃnæG¶1H(s;Ù¿ÅâwûüÌùQiþØÉ¢ÿYî˜êè¡çï7„pÁ2:Ëw㉠¢œ5ζš­Úù-xwŽ>jka SÓÿ[è‡5Hq–ÑPÜ õ‘¡ögÓÕb»_¬6MÛ!ÓbÌß¾ÙÙ™uW6Í€$>w!…ûžiuÃŽpÝæqF1<£J™DT¤DYƒ˜kßL¢6&Χü¤›ããá•@@j.N+°@؈Œ†Ã‘ãœõ§?ƒ»Û[û‚"º÷ê*Tf¾³ ‡Ôέc\¤#òp œËuco…Gû C@k2Ÿ.…°9®‚ÓO¯ªnÚ¸‹iÓÌ4f˜Éºž„T‚úEž˜J!cÔIÅ„q®3ÚQj$; Šú7±1_u‡¾œàjwtØaóXR`¤É¨áÁ_ÒŠ‹Uü^âÐzŸGp¦Ë‘!!TD³àqØ!Ƚ®óÈè±gFÓR…´LX÷ï{@ A|öÐPÃo# ý"¨qWØ/0GT%s?»n’–‹„aûØUml\nc§xpµ_` P]ša¢Ÿæ–®©ºØ¹ ¬8÷„*mQÕuѦî+,pom2þUTÞMTW¼„¬”H#§'¹A¨Çþf¦´ïf6ÀÙÀV•ZKÏŦܺIœ<—Ðøð¡@r™~S½‹6àv¯¡^ö„~³N):@Æ÷³\ƒåƒ{×^:òÍ€Y.Á”$cAÏ/Ê|U0ËCTf,†¹€”ŸN¸fu9iì•m¢ì:ÄÌ EäI•gœJ@ËlÎ0¢Œ|õB„ ’ª• y!aCØXÓ(ø9‰²óœÌ„¥Î(.fˆìÂñœFq©Ê%®ÌI…"S™ŒÉ”D˜‰}i,4Æë Û&Ê_›>á*='°Ëõ°ÍgOò˜ShÄ)9-srg0ÉhO®CmwdÏ÷Ÿ2kµ7`¸^»a±{ì™2²¯W«vû8öÎΦ(ä>g±=#ˆQšA†"Ø1êѨnj‚û³ŒC ÒLp¼§ŒŸQ~RL àU%òÙ…Ž3w äöS‘\í^wø×Än–=r©RˆP‘/r©&ˆ˜£ÀeÆä¬¾Ðgg)}%%JžG$V2£I…$'9› Œ0=­GÓ”IÄUÆš˜r ·f÷ì/9¢o-½• ª®ZÚÁvyÞéPJ‘¡&cBtk ÿ0#äÁ˜¨$2ˆK°P­ ÷æü@^Ûu¶ž4nn·LNÃd&FŒ€ú"Ÿµ `\mDδG4EpêäK!ÄÄeV¥ÿLï´¾J!B ¢3ÖÒĺÃõƒÖliiý dr ’ŒgŒm.`c}—ÚªºŒ9žP°“<ñŸqó­$y‘`‹|â? Êšÿ0 êŒå;ñŸ‰¬å»Vˆ3•ï-€ÿ¸Óû¿²Ö4õЯaÊÍ}ÞWß¾þ†nô‹ endstream endobj 2999 0 obj << /Type /ObjStm /N 100 /First 970 /Length 1350 /Filter /FlateDecode >> stream xÚÅXËŠ\G Ý÷WÔ2ÙÔ-•¤* ?˜$€±½H2xáGLÌt˜8Ÿ#‰Í¤ÔÄÍ´úô¹%Õ‘Jª;}M+­ô5Wŧµ²ü»Q! ²@¸ô®E Ÿ3)LAÑÂ#Q¤éÆÄjX‘œUTÁêjŽ,*ƒéeÌ@¸LZnH™CÜÐb-QL+¯Ylbe‰ œY|qì€ 5FL­I!êÓ­V¨À°iaaC*Ë­QhÀ¬YhJÛÁ2XØÂÆ 7Â*6#¬²z`XeÀ ‡S`!ä¦a; aj§ÒIÜ- X¶à÷’ÁšŠo›»cX½ópÌŸ ¬ÃRs Î;€g*¾I$¥ë >OøÀîû°Ààc†>ætÌe7rŒáÃF`ð±Z`ð±4°ÈA`¾+ là¹ÆÄ!4šÁCàC>†ÒûöYýWÁ2}ÁŸBúF)Xe†ž© ("¶æ˜âYçyh¶ƒ¡)|xí²ë/-”T¯ÆPÎ…BIˆ(¤¡à{ø@éJ‚k9’s` Ë“"Ò= W$”ð¡¡äð’%|ŒPÎeh‡¡ä„Jb™|X(9áÃBIÔ›¬|¬Ø,ê5Ë`©+‰òQj´;;ÛmOÊÎà@?+ÛÏ¿üZtÔS5HªŸÝËÛ÷ï_î<øwrkuÀgЬ6«µyrUDž#V½xsdU DŽÜ¤*ÎoŠŒÂ­¢iòª8”I²h-™æ^I“Ia²ê˜#7­~,R侨jË’ç¬K“IA«¨h9®¶j#KæY9›môå:G–L­vtÿÃ¢Ž‘, ÌJ”, ~Ä|/Ûç‡Ë›rvV¶stø‰¥â©s+»»³Ño ­ïã.®¨Á ÛӫÛçû›rQ¶§OÎËöbÿá¦ü½ø‹?ÿØã‡W¿íwÛc8Ú_Þ\{Ç/»íÙþúp{õf}7ûiÿöÝ«G‡åÂ=äc®þŽ^]áioùíŽøðòò€Õ.dzû£qû½@â‘ÝöüöõM|ÿñÝåï»íÑáêíþ*ܵ—Û÷ÛÛã Š/áì­ãhHƒFZý*ѽ=a¡Ÿ×Á ÞÃðyÙ¾;¼8dà›ëÛ××xøÝá²J¥o]¬¯ ªÃç8:~eÜH¨kµ5£U5“/†ò)­(þz‘øáý,"fë'G$ŸG„ ŽËÙ§ Ö¨à9-Ö¾_î÷ÈÇ“YõKC޼º·&ÉsÔÕF’<¸ú¥&G–UíHÛ ÷o‰Âø[Ib j•ÿ1„å”!,LJðPN’¿8„å”!,§ a9eË)CXNÂr–S†ð1²¡¹yw9N˜~”L *šË$Y0ý(IÄ<úÈ’1Òz22ñŽ8“9¼ pR ¼"fƒ` 4NæOŸ–ÌŸ4¿î'Cf[U-™¿‘ø¿ûrdܸIJdܸ'“͸q±%6ãÆeœL 7Ã-#Y} nY²Q¥,wà%S’¥ÑqÛJ–FŒ ù¬4þªÃK¶ endstream endobj 3094 0 obj << /Length 2197 /Filter /FlateDecode >> stream xÚÕZ[oÜ6~÷¯Ò‡j€ Ë«(í[6i.ÒÅÆîS¶²DÏIލ±ûß÷j2ã™4Ù:R±(ÞÎ…‡ä÷ÑûD0¾û?¬^ß¼Hº„ÿLh& “ØB³"+Š"\r•üûŒ'+h~qöÏ‹³Ÿž+‘Ð,³äâ*1Ë •X#™ÉŠä¢NަϚËËK•«°ÅR¤þ)Lú›wÃuúbÛÔn±”<2-Ôâ÷‹_Î~¾8{&‚>b7½Î™U*©Ú³·¿ó¤†¶_Ît‘'·¡g›@™þPÞ$çgÇ* Î ^ˆ}¥b¹!•3–3!AEaxú󇲽Þ8RQÈ,–FˆôUç?’QmO™‚î ñOÏóýÙEÆ •%`3EœþÙvhºŒ±yÚõC[n°lÓþŒÏS7”cÓwqò"½]»ŽºV›ŠÐa¤÷Ò¿óTºê‡XÕM3íÍp¹êžæ÷“è‘z®r¸(ÍB¤7 iSGšØ~5ô-ÕŒëØ«v³ºF!ÐŒO–“½B1£cT=8°lP ~ úhXâä•ï‚@O5]OϲBý!R²œ§ ðqlKQW,î»#Ì»4qe°ünxÃ\˜H Ã¨ºÇaQÿ(°«?Û´Õa"Õ÷QNUn6®>‰à‡¶·äsŒk¥Tº.=.i)ÂÚ* KìmÓz[¹”ÖÚ¤ç.õ.8%ì û”þ[ܾû¯o^œ%oܰ{õŽÁêUŒ(¸£ëj´»»×°›²+É÷$§H’ÝŸ i¿dÚŸYfœ°=±zÚŠŠ©Ü†#do?~YÀÔóXŠ…-¯ó»§€ú³Sà«¥}¹ç±>F1+Ä]³c0üe»éÄ’'N¬ÌXfmmúkú$÷v˜µ# ƒ†(®ïܸÈ? QËÏëC Ú‡A*M«PÑÐp;VT=@Y¡W[ÒŽZ±f;ìÌ€žèØ0MÕ6þÄ`5!g}k`W[Oº©Σ“Ù) ü²ßùÙ à©GnÒ·nlÚ‰'Œë2"üfÇ&°žøAé]„쎭"Ïn6ÔD•ÍäêO"Bóˆþ½'_5å8ÁýÛfpçýþƒÕq-¢ }ÒRn–§,ÞD‹!”ïr?ªkÂ3#lœWè—55VÍPm[ðgBÑNÎaíR{íÓx%ú…ËÀ3ˆ~ÀkY×pdœÇ×q ˜Œq ¨'Ž…Úex¾Ç8 w]rèJâ%!"Š.ªîqnjxò¼xèsS87±}/ÜDk NžïšÓž|GMBTºùȉ–9+Š©˜V€–Í÷@NàV<9’Ϲ€—ù¼äDsÁòB͸¾ð±±÷Çmp€·ÌCŸ?(Æ’˜oÛ‚B³Ÿ*Õ'q›Ž¸í üd;"¶‚KylªrJh}v‹À©¦K’§§ëJ²f*OŸîçJÐ…kKeU¹ëXûòõìótyþò ¨*1—)òOÕ¯Ÿ™8AÎÁ¼’ÏáJ†Òd±—ÿ.U/ÎYL ¦æ Q8U™=ÛÜð#YÞöÀçû®©æ±]X–Ëé‚”€_óCãßo›kAóÅÝ“¶À¬£«0™/Í>óôzp7M¿µÕÁ@¹Tj¥äpìrËØÇ¯1»§ìý4ï.y‹é}ßÔ˜±Ó==¯Ãëq–Ûé¬ï±ïX®0a- ~G9Pv(Aö¹Œ7}ýÃSߴͦŒ/ŽÒÀôK~¾€cÒW]ì¿­°ÏšÞ0_ެI°-âÇ?<\Yû8åî— |+ëz9p|©Ë±¼ „¦@—qÎ0¿ úXI„å¼oVá—Ši6ò—H½wqÚ¶Ä‘O¥Šc&ï[z¹Y€…妡ïgtúêŠêé'ƒð­MüÇ÷©ÐĆqh\lÃÃgµ Dê±î}”ÍŸ²Ô—¤hhÚztRˆ\¥öCWÁ†æ1bÿõëóWo^Ÿˆo@Îv×­”,Ç/¯X®ô¡#È@RCŽt©ûîÇ‘*)Žc(Ðè ±¯S*Ww´"ä*½¿ @®\?+¢XPæðó5hþµÝĶð³U?Š_›a-„ýH!ôˆjbPãr4-옸-¼›;®¡…UqÅõ´ý ð.ÃáƒSÄ…®_ÆÊ£U÷Ûë82þvut þ?JÓ/ endstream endobj 3126 0 obj << /Length 1877 /Filter /FlateDecode >> stream xÚÕZYoÛ8~ϯÚ‡•šå}ø-Û4A‹b·É>µ}-:*K®$·)ûßwx8±£W6Ikxˆ39ä|çcF¾üëÎwŠoN²&Ãð+ GÔˆLŽŒ4ÆdÍæÙß8;‡æ“ƒßÏž3’h¦2;›gB"iX¦EBšì¬ÌÞæGÕtZÛn4fšå Æ$'ð!(ù?½í~ë]#ÏOÖUiGcŠ%¡¹á£÷g¼<;øx@¼=ärx®‘b,›-Þ¾ÇY mdq£³Ï¾ç2ý ×ÙéÁ•É™,»üä»oNöh£ iᔹêÍÀ 1­ü„üÐ蛞{´(„™¾Ž‰} ÓwkûÔ”cr6aHpóó¸ƒËÐ F7ØmŸocRŸy: *òY]Ùf@³¶™{g¸KÄûK‰Àwïô½.”Ô QÌÒ-”Ô Q©ÂBÕíùxÙº]ëÖ«_´Ýf¥¤AR¤D­RD_¡®í'[Ø* dxÌB–‘Í)Þ¨Vc·«n™.‡"ÄãÚ‹Ô ŒeÂ%b aEÂUób7¢8Hÿ¦Y,"*p aSPhð‡¼H0C%\],Q4€üï;1î³\€©7ÃÚ]S§EóCf£õ£¼9žH$Òp2…$ç//Šåª¶B1¿'ÄóÊqißaÂ[òùêðÕ‘›ÅçÇz[‘È0™ïDè®×pÚ.íP--0Sªi^ îIò*–×½¯ë mhÛ( µýÊ=s;«\í,tñ„KÛŒ }ðͶësªò³E1ÄQU7"y1,öš›Y»\¶Í3(šO×±»S§ò¶ï+ Û~0 ƒUðrï gã Êè®å`gΈES}\» d,Ÿ9v^4¡0 B0—Aš·ŽÍ3îÛAé°Å¢,A_ç& Ôº‡ëý üêð&™§Q ™€3Œ(ò5·†£Ø¥Óx'ÙYAª$bJÃPôjü> úÛÕPµMfhfq¬:¿dß²”ÃÜiMîÂRNFßµô¯£–¢ÛìvJa“‘{ßîT ẽ¹± ÁW&¼±šÐ_{cáF A×…kˆ£2!wçZ"Lõ –ôÄѤ')y—qÂÓñ$®(âÊ\ò$•P–­àHK‘­ÐÈЈ6œ¦qÙôc Ÿ Š&Î b$%p.àt߃»]U“3UHÉ„wÎҌܞsÊ=˜ûŽ—NPú~è13ŽOð-z¬öÒcéñÑéøÏj°ë¦q¹ ';tx|öÆÓ¥opå¨î6–£‘>Ç«H¾,FÀ ¿„ªk]Û'ŸÙuUôqYuE`™í¸ãàªhî Μ"ˆGë¢ÒéPxÞú!#.€l›2Pð¶ L;@×­ÏE|ÏGmgôÐ?sÓ€óâ+¬y—ÚoHq9óÛ艰¢þO/¹*‚À 4¤·7+ 5ïoÃù‡À"ï݇0S)N–è<øéÎÆ Àhñ˜£bIbÐ}ÎdÒŒ à iJ‚$S´ºH‹ùÐ)ýΕ¹B¡)–ÑÚyxú£%ô[¶C”/]ß#žU>]gSiRçÔpIM¶i(h`vr›@M †Õ¹÷¯â¨!5w¨©0.@[Zï Ô*êë~h—!6ÇüÀw¦°^„ ¦sŸ!’1¡$!ÞÖ6H!s5ý‡ øÄŽfQ+ÕÊi…Èìûœ¼sTðbGjÚXÓ¯W1êvƒ‹Œ®nêŒøäÒ΋u=ÄÕñÈ¡ªkO>WÍyÔÞ6.²Æ’7›¾_ ϳ-Üœ”Üma‡ÒUx”®fY4‘©¸Rœ]0MQ’Ö} x97yomèqjgþDøžï5á»åý8љۋ¶¾›'Wm/VuÑxfxíÂÏ9ßœ,®ªÿP~.ðµYð‰½¢9ü„ç}]/ü õ—ÀTàLó” Ä«ïè¡› ±ðÒg÷BÓc­mÑ[—Üsy¾ÛЊ ‚ ýïdÌa\ñ`è ÑÏ ÍÑKà(3<¦Ÿ¦NN+š®υ篧gDÂIpóNyÌ…HŽ4çIéá Qö¨r„1$uBÚL˜BŠï&‰Ï.;ésUG Ø[÷­„—Vp³œW6·Yè§¢^Û4Kë¾§` ™7¡#o2oÂEö"˜L0l2å“™˜”åÄ&òw,‘Ð)'ª$Wû&EÆ{IYv¶ÞD1LM9Õ2™”¶('SkÓœô†!ÌXº‰1ð0zß¼¨y×տ޶=9ü<Û®˜ÂO’‰RŽý'Ìÿë-J¸;Q:ž6Cçy·“½uv¨‹ªC6ÜFPÛ?IôïM@å׿û |U¦[LPËÅ7#ÉNf"“Ùv,‰o›€S5pXÁÂoÞïWÐÉö;W—Í–îta& endstream endobj 3166 0 obj << /Length 954 /Filter /FlateDecode >> stream xÚ½˜MsÛ6†ïú˜\JM‡,¾‘[Ú&žÉ­¶zrs %Hæ”"’JÝvòß»$(;–™™Ä‰1I@ûìï.ñ!ð»w»{ðóüŒÕŒÓË á5³^7Þ{Ö¶e¿/8ÛÑðÙâ—Õâå[‰ÌÓ°0lµeÚ€ñ’Y-@ÏVv™ýV^]U¡]æÒÉŒ€eŽÒ‡¨³?ºÐþÔ ƒ*;;”›°Ì7(2¯—ïWïoV‹ íÁ»é•+%[ï—ï9ÛÐØ;ÆAyÇþ¯Ü3jÙOíŠ],îMæà»û ò‡çgßpåc»Ðƒuz°kè?Ú€´ŠÎ{’%ÑÍ‚!õsƒŸÎ³B­7º¹¹é˦^æZè •ëp;zñGbÏF„Ò$$§.Éq]óØ(6›6t]|ãgÓáo€6Ù>>ÀÏ«²ëÓøÀz@éúÀI\Îù@ÄF×·e½ûJúy&Mn>E’ )ÖO&š]ÅëS5“_£f'Bü™“Žs+R™è$”i“don‹ýM¢ò¢{E.CÌÎþéCÔêׇ¾¡–ÈÖMý'Gµ;´ÅèerèË·îóÕЀ§íOÒ ÚO‚ôkU†z)\ÖÓ$Zeå òZfÅÕ¸*µÆéiä°Ä¬²ÂÔno( ¸,´å~š¢¨ŽC}¨»1ÔÃ?ã 4g÷Wll›66Nm/oGºêŸ%!SÒ\gaZô"¬pLòûø¶1”÷?)ìrü%Gòm¼~ŠÃ8¢F#¨›åG·L›`tË&ôEYuð·¥öœÂg¿/¹.ü7ݘϙ^µ£$ãE…¹ó3ÑêióTÍ.ß7C}2JËuÓ¦ÑUmX%R[Ò nï©«ð1TÛ¥AÖ”J|JdC©D»ˆLê…g$¸JétB\Eu*Ÿô(jb^Ø“fnÓKÜÿðBùyÕYgFIPQ‰S‰[n‹õ$=/BÍ_ÄöiÂÅéÐ',o5÷@z‘Ry¥B*¯AãTÃêr]P¥ Ø4ÀÖ‚ó vå¼™)Ø7u—w¡ýÚ4àf¨‰}Bpã@Ñ Á›}QÖi 5‡”±Ö œ™9š¨Ë´±––2;&W¿ž2ÞBRŽ Á…kÌ,øÏICN¶¡NI>œ“¢ýy˜KOß\&$çŒqÉ{ªŸó›:¤ávô ªU:nzÎDÿ˜»*·a`OƒmûÜçÃ22.óÔƒµÓïÿèÍ>Š endstream endobj 3090 0 obj << /Type /ObjStm /N 100 /First 972 /Length 1441 /Filter /FlateDecode >> stream xÚ­X[”7 }Ÿ_‘Çö%_â$Ò ‰‹¶­ÔJx ]ñË´ZíT{‘è¿ï±¦­ <¿³'‰c;¾¬´ÙJ+Ò&íþËeÅ·’´Ð ¤æ@¬ðd¡@f dm²‘¦RT¶%¥+AP.fË*³…ÐËÒU:6]K°BMâOÒ l"lAºj­0jÉÔ%†¾-°Ð\±/Ö @êBï†Ãº†Ãú ‡ó¦ ö0 › ráÔÑ#r“†S§šKX1ÝrD8l¹é¶¡5ƒÉ6 †[Ð,ìH ’Û¸ÁÆÍ1&·v+]°€—[yqaÑ Á !ëF.Ia[nÆŠ)G0Ž˜3x8b±ÛBpÄމ»…Ã]š&3@r«öÀ\Ÿ°£à¦v„VÂsl·f0$Ìè.Tv̵հ£ózØÑ×÷°#‚a3 ‡nÚ]b¸…ÛwL¿£3&»¹=¶æ ‡-r Ö’[tõ(l!ª[wZgHËwÒP‡$JÓè½(K`iolB²À°³’cp—jwÌüå4w‹áŒîW!ÆÎÝã— ;›yÔ¾:Â0ˆ.i2ì¼FððZÄ4žV?8÷ëûÁ–9ø.ì¬y¬Ï¹99Ùl•3<5Å“~R¶Ïþ¥t«†7ÈlÕÙåí›7/6÷îý;™¤ª&É´VˆÏyZE@$Ƀë@&È‘ûªŒ¨È‘µã7K®e92Íš½^ëÕcóùtySNNÊöÑ8bÕéDîäw2žèD̽û`|´øÀÛÇWûó§»›rV¶–í³ÝÛ›ò÷æÏþüc‡?¼üm·Ù>ÄA»Ë›kÏ+¡Ûfûdw½¿½:ß]rM`?í^_¼|°[ÎüË_à —WXíi½ˆ÷//÷Øíìé]ŸÈô.|t~07Û§·¯nâûÇ‹Ëß7Ûû«×»«8¥½Ø~¿ýaûðŒâÃ;Ç•Xµ.¤R‘ÐÙJÈ6µ^ ÝÃ=-ÛïöÏövÿæúöÕ5Ö^ì/«V¦oÝF_EÅ ñ ©£W¤¤­žaæ¨x° ]Ú‡ºD„ "ÞGHcÖÉÇÀò!œTðºš"£C_N’ÁÒ=IaI2\ŠÌ”$K«6’Ö0‚'x&ÉMjIÓõÕ*ZŒWW=štpQ/ªô¤KÔZõò•#+~[Òh+•’.QBµ¤Kd,¼•,ÎîkæÉœõJmIÿ ƒ’Jð\Õ„’äaÕ[íÙ¸zGš#ë¬k&#ƒéK’‘ÁLuÎ,¹!š%F´Âg22hReI:}^¥»‚L}_VïÜÏ­±R>©±Þ$~nõ¾?j¬·ý_Tc1Ô|P×0T´°hÐG¨oH¡HJèrQlgG ÛùÅÍ®^ýzn"úõ*,&“( Ì\c”@>GÎHO«%ª}ÿ¸ÀúД.°wÉÿQ`’yÔE=I&­>_äÈ­ÕII²¡!aK^Ыq,Ý%{²¤5Ì+'¹^€%É^€8IÆŒ2‘4f«¼å:¦+Iowï9é@ÅtÕ³:+¦«ÆI*¦+IzsâkŽŒéJ²Zx…•¤1¤·¼åÐK¡jj’,^5“D/Œª™Uƒ¼j&ÈhËM%I†él®,:¯äC¡Eh[“ï•Ce%u&CÕ¤S¨£¬¤SH0whÒ)(½•V–L˜;4éÁ5j[ÉØŸ˜:4[OZª‡¹Ó·¼oh>»m±#m‹}AÛbò5ÿ#Ð’#& cxO½ËBâÁµ…1°Ê?6 w&q”ÞOZû?­‚kÞÄJ’YêÑÔsŒ‹XDg”#Û¤sl¢> stream xÚÍZ[oãÆ~÷¯à[( âr†^ö­M6Û Š¦ÝºŠ$´8’ˆR¤CRëAÿ{¿3ç %ÊÊn²Íº…asîç:ç6þ1PQ<ÿ»E÷íë  büd*ti‚¼L£2+Ë2l° þv;L¿¾ùãíÍ‹¯”˜ÖYp» LeeäFG&+ƒÛ:ø.ü²¹»kí°Z'E@´Z«PáÑÊ„ÿíðÙH“iøúØÔvµÖq¦tXf«n¿¾yu{óãrø¨ùø´ˆò$ 6‡›ï~ˆƒs_q”–EðàV´#àvüýæe -I3}޳N¢Â0Ê9°SÚ„om[­>¿Ü„›¾û>Véî8TSÓw„ß‹¯Š@ÅQ—ŠÎRYT&Y°Ö8Þh>Ì¢ wH–>9Ä 6#Ç©l-c Ñ &íĸÃþáÌíl2é4ñK jkç³ÝwÚÛk@LÅeê7¾°ÓæEÍR|qL^D©žW×Í`7 CÈý>6ñŸ 8þ$D>Ž“=Œ˜Q<Ðtj€¶ÂIe°VIdRQ‡j’„›ã0XwÎDéæ зMW÷´äaäÁ‘tí.bìIþ**qò!.è“}¤Dø¯Ûþ®jYò㦿GK…ö}B#®¹c^½#4,sÁ„ý½—5´¨’ÆTk¸SÛM[‰ìÈÇ„;à°R¡C##4ˆBEç¡ÅE2i~! ÅK¨‰­Ë:Œ8V4¾1‚Ø–E°óÄÎÈÊ‚ª”úNŽìþ ª,7Ï€ ±‘¨ì¶Úо¼…„[׸à ÷B…é'7‹•ûjâuƒ­Æ¾«îZÙwhºæàôçÀî²à«¥+5~ŽÁ2«q ´Û1˜¾ky†éAã¶÷ǶpÖÉ­©wäÅL˜ñn´Ž%Юƒ3«}ëEYé^9%«ƒå¡šïSDÏÁ<Ò¢‰o:2B²•’ÕåƒfèL#ßœÃgäXÛIÑ9ÓDG‰c7V;>±%{éL3àÁü^d9ðöõUãm`\rZo÷†:‰’"wæÌZ‚_yL•ù‘¼ÏGüjh^ùŸò„L.È–+óÑt³ ^o˜ª(‰•ÜFºÑdZDÖ鿝ä¯GìªÈáZ3H÷ùh×9 ºÐþóóÐ,Tò4fyÇÅÚ[Ûùb“Œ½ÂÓ2‹LQ<£pã8ÊL„ÿû¿°Di™€ƒêS["“þ&;äaž³bqá>!NJyÅ©8&¢>–PÈòOΊ\!Æ6ÿ7F95&Rêu75e¤Šä‰Q;;<Ï}…_ ÜìùhNM”%ésãqLã³Ùâ4ÑQ\¤ÿ{[ Ÿ>£ŸMU™Äü¦ap\$ŸÜþŒ.ô'1ÆIi¢½ãÅÃÞ.]ÊÂ9ÊZЭ…Ka°+‹”ÎÞ‡œTžÌø<…¯’í|‰@¿½3¥ªÄï2ÍAs²)µ„ ˜YâRúßh–E9Üõhs‘Õ€áµíUJúÚqþ…aÎt¤fx²uNv!4É7ñWr£Á§éóá8aú̃ñës·Éùà²s¾™«žÇGI™AXËœGcqZ„uéWêrP7rÊÐбݦíG¿ÄÕ 0:"Éu93Æ\ŽŽ±º?röGÁóT,±?mì½|XN°`SœKMÊÜÍ ,#T™Á´¥çÙªakçgOÝxOùù‡Ê0§ì7‘ì÷›“}_škž^´ö÷+dÎ\{Aw_I¢^I}ÈÕu|î›B¢Rlºš™ç´®ûÜ'ËÛêØÊ®w+j²¼òu‚±?Ø©9XI¤«¶e^;LeÍPu;. ̦ÆÕVÏÈë,ZGƈ·iûݺµïV‰m{±½¸¨é¥qé«t?S5‹«sÂèæËÕ:MŒÔ‚ˆ@•‡éôãrWƒܪ³Áͧa.¥=ø’ë/ŽtErwƒïT˜þÄŠ–»î¦ªTn*vF¡‚ ["‚S„·{9ŒÏÀÖ¦æË…tS]Ö£é**Ä]ôÃíÐxDñqãÕÁ;\°G_žT|ñ-N«¾´wÇ«2œ|.˜`rßìöl+”·41á¿ã T¦Ä2#G;/³ÜoS\`sÐÃGû•šT=WØ¡HMÛrë~ AáÀ¨’e²¼kÀ0Ñ'µ:Õ~A£àw’…FɹFNaLšœiTiD£p-Ï×PéèîdÍIŸhûm#•_Ïò2Yhà²ns{EeÎ Ùó丗ú^¡Ïnt1ßh´ê#ýwË.ôGdø‘¬< iõ^~šˆž$Îø DŸð3Mõ?uùô†bœ>%Ps0ãètB‹cÀI÷ƒÝ4£•#NV ¹LGÖ›å2`ã9Û±˜Ù;ìAÄ›ßt‚ä^jŰñª¸(ñ xB¦(<.ÖØgÖÍ¢œeŒEuå ÇA¯¥ˆÜ8g”çì]YYö//GnnûáÀÅæÂß–þ¡©§½Ü¶4Qá[»‘+¸¤Q,PU×´©ž×,îœáE]hËÈ­¦c)8ÏLŒµfŽPÇùPwR³zž:‡ƒýÀ0ÏKh¹“ýNþxP{+Mòq ]³ž]~?M­íì†hþ×8—ð—ê>lП¾øë»L¼ýqbbŸ>ð9[,“ð`aCæÃn›zݵ¯\7&*Ž£ÜäçÖ$¿fuzfM`/­ ¥°Ò‚}¬êa¶“ó78²÷_hœqf½q¼¨2í3’/­wž†÷-è:œž÷è¼- ¤W)Rë…ÄX…Y¤à rÊíüD~CžÆ?hþù­8~CÇ!P3q,8=Ž&çœÕ™Šr=?«¾}õç?¬`þ¹þjEÑêÛ•Šuøí•pµˆ‘òùmÊ‚[5Ü5ÓP¹àµp/m°”Jðóhª‘¿%KVÜ:ÆÉüÆHmçRCDge|Éob¿»²%Å¥¯à‡¾• ÷(ç<OÙ¡£"3ž._ýX:‰<åƒ)áç ¿ám'›3´¹ãeã'D™> stream xÚ­ZYoä6~÷¯hìËÊ@ZEêò[®™d‘d³‹Å$rKv QKޤ±~ë¢Dªå™‹Gâ!²ŠõÕÉþm§Âhþ¼æ›×»nÁ¿T™0.’]V˜°H‹¢Ø õî~÷¯«h÷ï¯>¿½úô•V»†ãtw{¿KÒ0-ô.Kâ0I‹Ýmµ{|ÙÜݵõp½×¹`ƒðz¯ÿ%±J‚ŸÆzøûˆƒ&x}nªúzG©Šƒ"»þåöW_Ý^ýv¥ˆ5/oò0Ózw8]½ý%ÚU0ö]š"ß=ÑÌÓÞC ÞÛÝW ÉkÒUQ¡\Úcæ “~h›º»Öq01õ§k­‚s;5‡rœˆ<»Þ§¯rw­¼€52¡eþ <™"ø9J¢ñÐ?B+ê›ë½‰tÐt×Кêá¾<ÔŸÀPšÂnÐõì΋ƒ;jõü[—Ì­êû(’Y÷e;Ö°âo mœDÁ¡?Ê®âá|˜FnV, ýP·%팜íö)È07»½ÒabD– µÚfœàdàÝ}Ç}m†oåGtnËÛÈcfyä®û^ÆøˆñxµS=ŽåC-+5*;Èî'œ?‹>óý9R:ŠonÔMÌG€s˪`Ép%-_ôû8 ãLÃxVé¶ðÏî‡àý è³<Ô¾è‹LDß’ø3+<×â×Qr)þ8µlÈ Gè0ÖõïRè•éêJPä0¸ º]à‡‚|Jºü‚ bIDjÁÁܹ„Ø"ag^)„ÑCƒÄ¸“ÏzâM÷kXWBIî È•ù÷u9‡šÜ J:žË¶jÏc]ù{ú®«$G”Çé ®ÇV°Ê¼gÁóhaøPOÇzø˜c÷!eÍá ç–@õQ£RèPÁB ²ŒÊ.Jª.ŠÑxúÈœ£?õŽàèÛ£ 1˜/Ó‚ûòù•/ÀÂnXØô•&anôËÀJ ž ø¿j‚…ô ËC}¨›wøa-óÈ Á³ìœå<Ë#FÁÙ¤h·x±A6]Y˜$¦]¯qs¥‘ž(¹¹¦ºÑvÙ ]ƒŒ@Ýú¾Ÿê-œMÇ’V.¬á„7~æ¬ÑA>ÔƒÌ\´ ÇmÂ]ÅÅYë•YëUK/$+¼÷üUÏÏ’'Q, }ˆcŒŠIß4¤MYæÃÏÓ‰Jƒo&‰Ú%\çhßs±Éƒ‡º«‡rÚÄ’‚\).ìy6¯p²‚X’…Y>ã©D™S®‘OÈÃцbo>[‘¦{`²ÄÞº4Š;ÂùZ%L…y¼!Ÿ$‚a”¥«#ÙÙ‚¿Áàš·îf÷[¯6•ÁžŸU=²ÑºžŽ k ê#yòðÖÔ ›ØÛÍCÓ „ºû¡?¡y‚Pô›‰ç[Âá3‹›²å! eÃé\g[’+´N#GÜNç‘O"Š”fΩO"s O&^昖›#%ÞøÆÆ»è¸2q}<9Êæ(—`6{B úa:r÷ɲ×w„ Þ¸ô‚„dïLhž!½•kŸ¿—ö97ÁCÛß•-ÚYœÖq NØ*ià\Ç&쮋 ûüøÔL,B²Á‰ðAÓX±÷<8ÊÃM<`|_X…‰ˆh²4R^“ûòú©«È¦C„Ñ,úá„êŠMË(Ø\6ŽI42¨XaÒ‚B¦‘çÛ”f‡8ZJr‹ïuw(Çs †¤’Qʬx=Ñzì&3A±àpC×¾<¤Ž&Ž%åÀ·eG4»Ôåži 1Σx?äg+Z‰à½Èÿˆ‹)Â4Ë}Ã[3·HÖ{«çÓhIÆ| ߨÜã©Í »Ÿš¶å7rüM-ž$`Ë•'¡œj‹¡,,Òôñ£—pÍò£ ÅX~„Ôµ@Óò8ÁÈ5…Ôù qÒbübq¡¬g+°ŠAö¦@Núq›XàÈäñŸ¦öÝuñt{ž7êyëÙ+š(uË‘ œ¦Òñ:Ÿ•\Z\!¹6t4¿ÁÚ$‹UÖ~R¾^-)¿døxJÏüýeª>¯q,A¶ýS–s:£'†À|_OÁðWÑ*·,uÅÖ}yf³ñlQÁ 9@Øš¤H r,ªû Aÿ ÑÐ÷dkø2Æî~ž½´ § 𠩦œ]æ¬{ûÂ[j,óB4n­é¹|hÏ•<’:da¢W+VL”£x0!7Ç©ØÕõÜ®Ëñ™{(N°H§¯z~"؆SÓÉ Ov±œ ¤p [Ki§a˜€ºSqsp¦S›XÙ-Q÷Àr~Ýã‘T >ášìêߥý\yÌàRfžu‡©`…+df#ÆIàP ×1ù3:xÒÚÒu”¥+P )Ù8â^+¼gà+¿eþÚ Úu û7“O]?ù,ÍJ;4ï8 MEõSEÄؤ‚R[ãki_–Z4bžoÉ´äЖ»áx˜£˜/EX }œí=¦Ö@¤h÷á‹ê¥o7KlµwÉø3E Ù çoœúéc)l‘…ºÐî@êÝþHù_iŠ‘Ðúc˜çå;)ÅõsõG¹ù*îp‹¨Û3©4—Œ úbÈF4­çƒ—>à’î*fNwû LþÊâ/6 Â`Ê @ å¾o[GÃDNwÖÍ¡\¹‹är¦šÍÝ’°‹ìñÐj›ç?͈!Çdö »FUŽG~£Ò¥Òfÿ7©/¹’ÙÇú½j∈Ñ] « cAÿÄÊÃt&ýáR&Çs‚l¯µ4U¼Ø[Œ-&&Ê8(™º¢¢QAƒ÷¥½ts«gnrd¤ ¤ƒ·¿«¨dUý ~ùËJ„ÌâIüˆîäI˜{ºƒFûBw’B;ùE|yeŠfÅÁ ‹âàSè‰2Wq°ÉØs"Ôt‡¦‰ó²ŠC_¬î¬>àíÓÕ,ö7R­œJNïP¨Y&¶ —åqÏD>Jç~†70›‰+Áef”B'¡ÔÚç¢YÊÍ}fßçF„ÒÛ㚤—oÑlÙÓ+åÏÅ4$€èµ‡&ˆ.Ñ%ÏŸ Nï褵’mÓýº§{7A&ù?dÔ“0M¼Ä7Ú¸ÒOŠÔf¾ÌÄfî3õ€YøÀ,,0 ˜…ÌB€Y8À,¸üØ6+ÓÄ·rÑg«Ü—lj 0Ç2ñrÓ„…”¯°ó²>c¸ðJÏßi‚â-´Ï2v3´ Æ~´¸S2TÂ즒1šØÆTðYòþÝgÈÙ>cPæ"0¦¤ÓPrÈMÎ`¨Üú§ÖÐÏGÇQâ*RÀ¾¯óè& Cof”sšX7üuc‘Ù2²ÌXñëÏ{,¸áDУ„¥²hø‚¹ËO †ï.0.å¬Û`:0jê0Â9D®V5/âtìr1ÉÂo¾úö3´Žÿ¹ü•˜NT!à.3aTÄë_‰içWbš¤n#F¿ óïÖ‚«ßeš‚bîôÏ7×J©àßLËrœ* 9Vv¨ÎãÂêw9ë)¨ gÈÔÅn¼kU¼×øîU<ªl—ÚŒþ+Ü«h)p!mŒÀö«¾õ.Õ%&ýì~ªå]Uí?™£Þga`¨·ƒÜÑûØ-u{Eq§Âî»û„ƒøQS”b endstream endobj 3220 0 obj << /Length 2349 /Filter /FlateDecode >> stream xÚÍÛrÛ¶òÝ_ÁÉy(u¦Fp%¿¥›¶“Þl÷ÌœIû@KÄ1E:$Çs¦ÿÞ],¨›•&íIèŒÇ"°X,vØÈ׉`|óß.öº/’:áð— ͤ3‰uš¹Ì9—´>™'¿œðdÃ/N¾º:yú‰ƒa™%WóÄd,s*±F2“¹äj–¼JŸ—×וo'§*W),À&§"ðc¤0é¯o¿èpP§/ÖåÌON%Ï„L]>ùýêû“ó«“×'"ð#6äuάRÉtuòêwžÌ`ìû„3íòä.`®h3àÚUryrÀržÎwY¶ŠeÒ%V*–âø»˜0"-;z¾)û¢Â&Oû&Õó¦]Q$x3‘yêÛ/Ùôné[Ocýr Òúª@¬û€:#àÊw]±ˆ¸w8RlЧ¾²pAcZØôù·_ÿ<n2˜!+@ª;\iÝ•õ‚Ø-k¤Ðûv^Lý)*49s*ƒ§bFÇ=*Åó´¹í˦Æõ”M¯EöÔÈ\_þÆ…{É]ºBкë©w +³ÔY×åëµt²ô§ôqWvql£ˆHü®¬*YøHkÚÔó âñ¬DÞ@«5 ½ûùƒ¾òt³Ìmu$æû²ÎÛf… uqã€é8µ\¦?6½§¡~Y/Zò¨W„¡’ð¹£xìÖMĬ½xJðyMˆ4\TU B-ꀀ»²_FFî»Þ¯Z’¦iËöþv žù·Ðm…UßìŠÏqAë7kT«ÍÒ2Z:"ê…¥}UÞÔM°‚HâÙË—°rã‡bJ›Ã¬v°bÒªMø}v•sLæ*:‹©F¸‹j%˜ŸöVÕÊ0.óýU/Î_>›@nòßË#k[Ç´ý(ë\2«$~öãó#iÏwE`°9¦²/Ï/&Œñ?ð GRÍ2köÏ$…÷ª/ÁÊÐ…»àÅÀ¹¡gv:D#ðŠË³3q&c<ʤŽa'Ð9 SC †Ætמ¢<|÷‚>¢^G ÇöÌÏ @ŽKþr§)þÞ„=PGcAk3;‚Ù*ÍÑlU4=´npÒÛhþQ¾Ö΂õèN­=+Ÿ¯3>#>AQrŒðÚ¥—>’ìüÃH83’uú·˜Ãïv/^œ$¯Âà ¯%ô˜ÇàHÊ0mZXö–BJ=‹áRí丰 ~`tX¬Á‘´%Ä“K’ÍOàj|Kè†`¬,t„É;œþ܆¢c'ƒÿ æ‘e@ò/íéAÝðÁ«½ó!?:MžŠæ?–›Ê²½ø?,¨$ËŒ¢­þD?iBà¼ßäUà£[-À+7¢ÌÂ1Ác~R5‹ÓÊ¿ñÉž#2P›Ž(17`Ï;¯,«Q`pgm?ŠÐ:‡TR'´v’q½XIÉJL>[ÿGn«Á¡ˆÏ,,aÁœi#;ºitÑ(ïjP°{AtdœåZޏó™%ü1ŽŒÚ2éÔˆ2Bn¥L~ìt‹QO·RÃêO7T¤9yZHûÇ=ÝPŸ gFT€ÔLšáš®®òðJå6\òqçðÔfÄ# (¼þ–Ugj$“êÜ—ÑÆþ­ÜrXõà:ý¡.”,7;w,òØ‹Œw,¿ÖÁ0ž®&Jn«Š»r WßÒÑÕ·âi¬º®¼Æep(\Ã3Ômˆ³®£!"t§b tê®÷Åìi¬ºræ#åfN±Ž£ÎA!„x‚án„§ßL@Ô¦ªè²"”vPƒ„ oÀŽ÷jï¾i)†™ÈFnvnàsºY 7àÔ¥›blí­PB­‡ É9‡:X*ênË7 ³‚VZÆÙEÕ5Ô:Ô/’ C:¨®]OûµÍýöq~çë£%­¯§Åíº¢«)ÅÕ g¸s§é ì#`¯¾ãÛ›RlÛ‹x$W” êÀáNç¾è×á*æPmËÄ–øÐ´Y‘‰eÄ®ýÛžZtá¿)qŠS¼qø Ê7؈:¨zSº¡øçžDqΤùÔŽD¡#QùgS¤Êb‘ 9Ëøˆ)­ÌË2û¸UªÔãfL© ä"ô2U*É 1‘—*Û~ð”©RäÌ™óY)=ŒX¥Jn¤í#ŠÈéeÉcW©ÂaºlÇ;ÜP2'ÅgS¥ ›3ÅóK¦¬|¨€MòˆmŽ<Š2ͬS YÎr©½Tæ‚)Žg÷Â&­þÿku¡-hP~ê[è\±ø4µº€ªS©Õ!GjukõÐADhø‚Jöxpº÷•ìQáßzú ¾WÃgQ7øå ubEŒïIõðMÂûr§­°*i,²yëÉùÎ[O8|ë‰ úœ WŠ;ˆá;ŠRq¹&>—~3Ä–éÃþÁW N†âoø² º{7XÙ8¬ŒP ãsçÃz’Zï'¾­†ñû„,ªæ:|ˆk oÁ±C>Íè,¾ÿÖŠ§Ï¨¼‡ÑÝ{ƒ#UúÎtPKÓ‹p¥öeëh9¤‚Y©íIøâçö¶mèÕ÷™8Û«{‡'˜ÛŸB;zH endstream endobj 3249 0 obj << /Length 1492 /Filter /FlateDecode >> stream xÚÝZKSG¾ëWl%‡¬ª¬fº{žS±©ò-69a„´‚­,–„1•ÊOv%clhpŠ«™]MÏ×óM¿f?fó™m5ßíÓÂÈŸG ”\’…äSJż*&ÅŸ=SÉí½Þïû½7ŒE’Ûä‹ýIá<øÄEpΧb\”Ô‡‡M5ï8r) ?ÀåŸ#tå_‹jþÛ"ß´åÞY=®ú2©L©ÿqÿmïõ~ïSWóÁÍð6B`.F'½ƒ¦˽·…›bq¾zò¤ï ó—ïMñ¾w9e©(6ÿùvÇ»½[¤CtYXî^ÌÀ1¬ò Ñ×OÞ"%€áx Ó7KûÔ( ^‡ ΦïÇÝR† =™„W9#lcï[ÎüÚ8rå¼j†0šM'+.<&àÛxå“¡®"fc b‡¹ž GU‹»Z›öÛ?:À#Vî…å†D`ò¡.às¶ïÉY³¬GÃŲm^T øÞ±ÞÊûÀ0¶ øW£\ÑXEŒÞ®½À6»I•ÝV¼‘sŠì¶"˜n’ûlz…ÚdŒÙݵÎë耒LÍ+.>3˜€ªGÖEŒ˜@‚˜ÛŽª7(S Š7Rè>jêjº|VóíbvQO.Xânå§ËjžWP[Ü({[x°MÒ£¼ b°šÛÚy”XA¢wÀänÛÕ¬¹« " "©Bîåìj¶?¢8‘ÿÊ®Fàd©bâÈ‚áa»úÖ™£ÄõôäÉrcÉ>(Y^K½V»¸© Äη‰°ý¢3åë/ÓӦjKvW8XR[ÖȉjŸ©¼XíŒ7ñê¸è!±/²ª.u¦sÿx¶¡¬ÅrÙ§Xž÷)”³¶CòÝíÑÙ|¸ìcYϦmîldïIƒä¡ù¼ZœöùwÓq7T7Âò¸ûÕ+j¿¬&(^,~i;ª5šÜ8Ïò$>×㪩îd.ªÑ2O ¥„¨võ ír]6e±ŠƒÕÄvB[¹YkZÐB|(ßWU¾S ÖéÝÊÄÌ¥º&Gºm9™åR“ÜWËaÝd@¹U}¸Ãé0ËXÀP\@ã“SÜZ ÎØS²$ÞÈ+ºaË‘ñ®zЪ=¸ÒÝÙhmse3 ‹â™ÖF©™ šêsÕ´£d#>ÉGEÈÆ®Š¼È'³q‰MΚF´li@|ôðúI7*™"59ðl·öéIµX ²«Ê­óºé¨z¸^ÀÙü|8_9›ÜÌ._—Çu÷“MðÕNõôèz,ªB/~G1coÁD÷ì%3¶lÐÈ=:_°“àˆý7„Ñšrgç†íßfݽ¤ÊÁÒŠŒãvwq—u4ˉT’ñŸ6ˆ@ ¶bØÚŸw%ýª(‰ÝáÃãéøò£fv8ìÌÁp<–V'™dL ¦Qq+ƒeÕ ?›œ¹ØŸÊ]Q"  x*AÉszö¢-…œ"ðHÒÆÄD÷y¶ ía=o &eƒI:zò0x½*ùdñf욥D%lÊK]£Ü>¾ø`œ™uFcqZêI=j[M=ý{ÐÌFW7¶> stream xÚ­XËn\7 ÝÏWhÙn4ER`Èn ´@dÑÖð"q¦…Ñ`¦ðHÿ¾‡·‰Ç·)cp^ú\‰/R·Õ.©¤V»&û¿§éÏ#տЙì_«£$"6¡&R×~¹¦¥&®áÄ…W$1»ëNÇô$Í5#ÉpÍLJ¦QNÚM3[êâBM£7$ÕRð†tÒV¢„Fñ§ÊfÂTHXPÔ\û NA‚jjT $U“°W×$q]KUJ]AbHì:ì!0FàoÕæËáµ€PÅrŽ&‘I=áÉ_ÖŽ5Æ"ðˆÚPÛa&âfûWHba¥ª«Ø"‹ôi Ãlš Î"-4-ÌdÛ&á±t[ÄÓRmW²”©9Aº7 "Câ8{mº˜M² £LÂãÞ(‹ #x‚T7ñØ5K±;Ö°™VÛÂêC=v™^‡ÍºÇf·>]‡Í†Aˆ±Ù°EÉöžf-Y g/&5TOuÕ‘–•X!ï”IÉÍ&T,71§ØÊ×£ «­i.³wž÷æ:lÑ»ë°Å ‚‚U†ºÎе:®C×!ú¥¸nBr×´@r×PRÝ5%Hîš¶$û𣰅º… Å*Í3„J³×Pþž ì-ì RlÆž œˆ…‹/³n…èŽwl¦ÝuجSY­Ö/Ò ö°óü*­þåW`²Nh¨Ìíõ‡§«'O¾ Ö–Íé˜gî(æ¸iFbX¢Œ" ‚ËÌEƒ`¤5 rš'òëÈ >Œ…ó€>æš[‚©ç®Á8ÃÞl|—’Uƒ¥ÑFϵ”Æñn{•ŽŽÒú<ÓëÍ[Ç8šgjÿ0’â,™Œ—Ö//vg¯7Wé$­_¾8Në7›WéßõÞüõçxûûfµ~޵7Û«Kãh¶÷WëW›ËÝõÅÙærÏÛ®ûióþüí³ÝÇtb**¡O:ÅFo/ð6•Ëøt»Ýaµ“};2{¶uÀjýúúÝ•?ÿx¾ýcµ~¶»x¿¹ðÅËéúûõëçxÀ§fÏ<meà ʄ†vÊÖMäØ yêzÖßíÞìâûÍÙùÕ&_üvÖPßZT>=Bý)ôâ¡ï}äAKI½Þç©7ââ^«•8Ű2)[£¥åÂ= †ÉÄÚÑ)5¶£#Q° ÚO.Ñ•¹S¶vËÌ6€ÅÀ(=mÁœp£\¢ l‚8‡; ³ƒqû `ÞZDTë°É+DTÛ! Ø4eöø”w#Œ‡Cõ‡ˆµf #œa š ù`6@ˆ1ª,RÃåõ;ûÁëç»m–Ü2Î#*ÖŽ³ƒ¡Uí$Þ’m"Æ’µ|™ª0‚ÍÇ3„ÐK0šbÜÖÎŒsƒŽ(F±­æÑ‚ ä ÿÂ&£µ`Û¬¹Ž`Zü­¯ ò4 endstream endobj 3300 0 obj << /Length 2521 /Filter /FlateDecode >> stream xÚÕZKsÜ6¾ëW°²‡pª<^Hß¼ëØI©¬­­=Ø>PCÎ +R&9ÖªRûßÓnŽ8Ò8ëX•-•D  ¢_@·>FJÈÃo·9ê¾y5‘„§¬ÐYùÌŠÌeYue´Žþy&£ ¼~}ö÷ó³ï^eðZ»è|%N¸ÌD>Ñ"qYt^Dïâ—ÕÅE]v‹¥IM Äb©b­’ø_}Ù}ÛãK¿ÞWE¹Xj)•”‹ç?}~öñLÔa~› oL´Ú½û £ÞýIa³4º #w´(í:z{v#³Yþ€êÇ„7¯ÿÄÈ»r©Lø4A¹>Ê ŒH,Yï«$!;ëH]fjjhmð vþo0×ÿžõ¤A•¬wKp#Lê¿^î“l’Ìßö›ù¿ÝÂÜ][¸Ô +5à +À˜JdüýòÝe]Æ’ç‹e¢`­ìû宪Žu`»ï^¥ÓiAÖ̸à2³l`¼—ñ°-©!… Kêue]æ}ù {Yœ±)¯¨±.óaßá‡.‹W¸ òº†KlDÞÄÒ)Š>Üæ=5.€ìi|ÙÐyQ”,©$±ñ¿·%Ë·ª+hÂõû²)zú ow^·Ývó.̪žCK#È8@€¥ý ‡–Z<1ŽÌkš"LÛÓW È8I^vë|U.+£½ª¶a-3¸ v*WÕúzÎe6WÛj…SliT]5¿²„$™'Õ m‹6ÇÚ_ÐÄhO ®l»jS5à®kêw媬H·‚G4à«]üvT½Ô{A(¡Pãd]Ér·MQ5"¢Jøì÷£è4ô#bà)úm»¯™_Õ¬ê}ˆ–øñ–}¾+Ç÷ €ÊĈ'”<˜T'8><ÉDÐèÊË:õ²:þ¡E¹®pÖrâUíŸ2²€rpJ n;f€kpǨ̑q¾÷˜ÐÈu^Õ=KÓÒ³hGéòåa°Ioºß¹–—ð ì2ì–ÝkŒCŒïб8bâ­¾$ÒºkwÔ"k ê&%¨Ã‹UÞ|ËÍpZðø)D¡{yž‘íúÇξE Ö "Þ UÄôBK¾)ExwjÉÿ jÆôSCAï2½_ƒ’COÄKõ#óºŠr2þ…)½‹ßKeC(„vÞŒœ¡Óï«!'q}r¼ÞPËÔ9Ùsœ„'@‚“PJKÐ á$ñš¤Å{âÓ´L82,§B™‚€›=Æ¥9T€©$I\ýQ솰 ÁU×P«èÀÉ!f=@ÒŽÈ"j^í¦„w¸Ç‰$#ž”ÙcŸH’D EŸ/>‘<æ 21VX7ß21©H4‡Æ¿ä8ž^‹UÛ¬¿Ð_.ÐIOÃ+SjF5Üg¼#ëv³¬ËOeMº§ó¨,½0NϨ²RÂj£ò®Å5†}¦fÑÚfpYQf>­mæEêSÒz´²|¬sÂ+;£ƒ¼Þó¶SÑÙ1 »‡¤Öoó8+1B¹9îíÎÚðŽŽ¸Ó¢º»}=T«¼¨{M”Ç×ßd ðŒÛ޵F¸Tý¹ÄÅ=uÔNHçgÔÑH¡Œ>n5+¸•‰Jg7fyRVÒ$¨ƒ»ÉGºSùHÇùÈ7x­5:¾¦ÛUjè #vH>¬œ/ËS¾Üw4Å#Þê©Ýò ½ ¼%Úô8Á—r…Ф *Þó‹s_õx%â’8'¹óÁŒÔ.Ü`¦ Ó‹…vq8fÃß;™}“I°šŒQ‚ŽMŸó€À&ýùfVHkÂTÖò&óò‡ür—+n Ú™‡àj5ì¡2=æú6ìíý ¯ÁŽ›Àõ–mó^&òÕ+™<®žè(66º]¿¤<†r«íñuj¸yEîù|‚çE=lÛýf‹‰4Î÷Ðë¨]P ýŠÝeÀÜûª(yTÈ,A+ÃLH ”u¹ÉÇL3ú¶Þ3¶¬³!Ó€ã+ž8¯û–Z·R>az~U5ýÐíW<ãž8 úlÎæ(¡bµbªœ“H,ày°J¦Â(u°ê`•ƒ€›eæ^ØQ‡2Ø1q.ŸÙ?B¬V‰ÐR?[­àòoý1Û7 Ð3'xÛ$„·…¸ Ëäˆ÷ ä½óB‚yª„χažb–ås,xÜ KÈ«‘‰ðî˜éç„…Ù= ï¥q0Dh „pˆÏ"ŠkJ ÄÇh°ôJÇçÛœéa)Âóã¾JZK÷m8(Lóä°òq)Qš± å$s ¡Z§;NR2hý˜ì »¼9¬àžÀÔM¹(m¨~€ðÛ¼_åO:©Ñ[4%Û}<æ'£Ç¢oo“õù¦DÖ£5?4_-`3n™UQ\3o Òp:ÔÒ‚Uñ'·ìB^k{ùp¨îÁ‡x~'f‡ mз¤&zK%•ÉÆ ľd‹¿ã£1üz:Ýtáš$4ŒO.@ø NåσÂXe‘1fý}¼Mª È˜uÆw¼X5fŒ·AâOUÛ=;^µ>=ìyã½×&.Þ7Õ ×þéŽÇèxø.¤ÏG®ž„Q¡*‚Pw.þ¹ÐÃë&ÆÖ®‰rSÞÀÞeÞÁˆñÆA£b9u/ªŠò!Cr\W©úºÌÖÒZUÆÁè¨$(ø ÷¨Œ­ñuTÍ onãHŒ‚ìÒú”W6¾›(ÝC Úì!b ÚŽ»ÊëºSÂK5¾3¼lº¿LÞ§°íëùÔÇÌ®òOž‚wV89cÉÛçw Ì—<öi¸Xâòµé÷ÛÏßSûuá endstream endobj 3334 0 obj << /Length 3195 /Filter /FlateDecode >> stream xÚÕZëoÜÆÿ®¿âŠ¢0è6\¾©onì8Ò&ueEâ¹'â‘g.ϊоóÚ=R:?Ä‚Ä}gfg~3³Ôû•V¡ÿoÝ7¯Vý*„ŸL'**ÓU^&ªÌʲ\fµYýë,\ÝÀô«³¿_}ó]¬W%LGÙêj³J3••ñ*O#•fåêªYý¼h¯¯;3ž¯ã"àê|­ ÒH§Á[kÆg'“àÕ¾mÌù: Ã8t¨Ïß]ýpöòêìý™&†´§Ÿ*ãU½=ûå]¸j`î‡U¨’²XÝÓÊí Ú €v·ú÷ÙSžu¨Ê°Ôs¦£X)óœ«DåÀ¢NÃàåoÕv×f1¿<_§Z?í¦vè- Õö Ädî]ŸÇQðÀ˧[ãé*™¾ù®˜¿_gªŒ³È­ÒR¸:Šàa×ÖU×!­°d8ÊÝêÆôØÜlmÚçQä*,‚-êÙX -¯ÙŒÃ–çjœëÚsX€-&d/`R'éëjg÷ÌVÍ Ef+/ïnXÓ7B}Ê=²P͹ì*E´vdG…ZX­à:Vi"Ör…«£\C YÒ4-ÊXuÜg‰- “¤Á Ч÷EØ97(Xl÷;VÄ0NV†ŒØ#‚ÂÁm%ï­«žIâÙä™sfšKòc瀽¤ÇËÍÒf;LtfËM I g1ÌЖÿÁëò0òN}ÃÀŒT”ÇðÔªp!ÜÔðo‡õh@åp„Ÿ´ ‰08Æ`N\fÁ1ÖZ^çQg(Tã(ÛÛ¾“®3e^EˆÃ¤·¸a†¸0ŽgغfD¸s,0¶%Neù#? Ö4Æ9!àÏ ±gEö(ÙÇBcÌžŒ•¸OМ’ ìW£L7=·ØŸ!·œÇ®÷e¥ãÁÇ=øY#$QS'Ã"09ˆÉË?´Ëd‰‹<a£\†\è6Ì1¹t˜©zC– CvïA·LfáQ@ƒLd„d nK˜ˆs­¬­®;áÏí‚p„法v”åI8Zb;^OGñ Õë@ÎÐÚ–ã© þà^q†P‹#?·,>X*R Â-™ŸŒ‹'Yž”Uzi³3V ënàQ:Æ<¸ó¸tZ†%ñÚCÚ ¨‰&?º–à8î7зtº•Š÷WŒÃ~â¾$!Tù`ÿÏqû·¼»jðrfä"Š“°Â¥›0½ƒ$»n¥jTª8)Žd;X¦,#o&ùA&ù¶8CQÖÚšpEnxô-=“3V3dø”™{Îô Åw]T2iÌÛäucv’Õ$T¼EMM{ ´.³<Dh3]c¸Ä*.rúR4ûêòù7¸•G^Sª(|ò­'þÔ·ž/~ÛçW>姈T’eÅ–ÓûÝrów©èÈw©¨ÈTËõx7ܬ;óÁ€!¦Q_x~_ÎÏѓΠUêü„"ç‘*‹è òvÀƒ(1˜ø8Fê4UPÞüÑR]ãL ]Õå O*IUQÄ|Rå#z‹AbéÄ] ØØ ]7ÜSPÄ. «L`üà„ÏØÄ´áa9k§j’tûÆSzôÍèkÛET¨(;¥ŽãHv/tì’-ló•¶@ç£ÙáE=TJùA·Àب‡~òGƒqŸ¡¾ £Ë0¾ “Ó¨P'*N¨A]¨¼xt÷´VÖ:ü-Ô!„›S)"ÔJçúO…1ºÈ¡°=áééR« rŠS`Œq~ò²¾•1‰ÃMäW· '*Ìãê9/”Ž—z®ìW¦W2VýXŸÌ5g¼¾®«únR–;: /\K?%p¹Ó¨4 UR¥Y¢Ò¢x <¨.ÿaÐë4sq2]$™*óäÏ=q¬’(=áùŹr5Ùcä™ùEkEåN’ômu÷qÄq× ~Ú£á„P£KUä'¬it„¼õB±m?Ãèûj¤ÿê"~ùãóÿ®¿ûéÍDŸòOmê4º 3G',~´ÆêVKVææQU—××—u}Ù4—Æ\n6'ÑF©<ÿsÕDy© e?Ýù±ŠÊÏTD0žæ'“q°q,ªi2ÛÝôq¡µÉÓÆ¯î+ÅW¶Œ,UY~ª(+Už,‹"©w€Oår8¯Ë.Õ&Ýaò!U¾ÚÜ8`¢‹Åƒ¢ŸÉ»ð&ò$JN#ÈÐN§cxh÷ñËž’÷¹ËTl¿¦Wln~"r W·ÆÊúÿlÐ=¨ä?ó†ßò$Fûévhì_ß(Ütô ÞH¤ endstream endobj 3359 0 obj << /Length 823 /Filter /FlateDecode >> stream xÚÕXÉnÛ0½û+ôP¨§Ü—»Í­‰‹Ò‰²…ÈR"É ‚¢ÿ^Ú”ìHqƒ&H Ä‚ÅRgÞ,êÀ»µè±'3T ì.I8P#2Œ4Ơʢ}a´póчùèýFqÃT¢yŠ„iR‚‚Ít6þ”]\ä¶šL™fc·L¦dLÜMP"Æßk[½­7ƒ|<[g‰L)ÆL ¦“óùñèó|t="[Èîý\ƒb Å«ÑÙ9F‰;F¸Ñèvûä 9œŽÎÑéh/3ƒÐîæTïwœÌžðäC¹ˆ¥ÅF®M'a ¸GïY’xœ)"®rhÊÀ­·Å¹¼j²²˜Lã<+.§ytç`ß`ø’J´–@™|i½ÿ«­¤¡ µ g+i$¸ÀðÆzãí4_ZOTÖYË“õ²\çIgǺ±­M;ÛÚfI<•­Ò(nß‘–U×—«¬Xx.Î3[4›ÛpM¥iC¿Êa: ÆšŬ‡ñÇ­þ­ú-ȉM£uÞ´ˆÛ¢Å»YÚ¬êÕ2¥oWnNGu?)@h?i@Š¿lïZ{ŸûFq·`Bq©cê”@0÷ŠûˆXܳw¶Ón;{] •º2“€6£Æµ²ì?–]ºtÙð6ª’]ìÅsZ•«.â£fMßyþ*·QÝú”$ƒ‡¦YÆfh@T‰.TÕÛ¬Yzê&Ê×-&ÂýZ¨êr—>»ŒZÝØª›œçžº,ÊÛ¶oi+;˜ßÏÓQ7—EaãÆ&a2®0 4gáÆÄuµp÷¼krÅõ¦Øgá¶¡50¡½â¿Ãè¨0(Î_UVB1B rP¥fmXvmÔ…¹ ÏafÏmúSÖµMúÅTe£xy0qŠuÎ@rZ®@r¨º¢!«+Á0`£^Wé¤Óá³ Ø­Ð?®î +[×ÑÂöOfÍ>Nú'³æ±ýqPaþħ)GGäˆ9†„q LÁ˜ðb×Êö¤ñ¡ n® pð¨Å{5áOÛÿK.’*DL«ç ~p*Éð›û—oniÿ~AV endstream endobj 3296 0 obj << /Type /ObjStm /N 100 /First 970 /Length 1424 /Filter /FlateDecode >> stream xÚ­X[o\E ~ß_1ð2g|›‹UêE$ª6@”‡.(¢Ê¢\¤òïùÞïØÛãË 7M% 7KjþYÓ˜Ï-‘LFOÔ'g$fçà‰›s:%!u‚“ØpB’݀Ф:9;&¦&“ÉiÉúäôTyrFªÍ9ÐÜÈ9ƒR«“é—n ÉÖGsŽ¥¡°€µ¥Ñݰ1•:)XO®D áLN1¨ + Š”&Ë)«Ni"+´e tò*¨1qWeòàÚ'Ê; ¨æ<¥N“e½§ c@¨¸«hX‚Žû vrÑ « ú„G2yT›<÷=;ÿ˜Ý5~(v+@1(›<5T°&V<Õ':L&:¬M¿BG…ÁÂJ®ÁëÕ„ðÀ«þ®DÒœrŸ7YÈ;úû¯-¾8ýc»YžCööâúÊ{Ú”µY^m¯v7—gÛ«}ƒ˜¼Ÿ¶oÎOŸíÞ¥cUœ¦ >¢ÓK¼ *Ô>½¸ØAÚñ¾ »=Ÿ¨€Íòúæ·ëùüãùÅŸ›åÙîòÍör /'Ë÷ËËs<Üž3œDÂÞüN2…â‰{Œˆ¦•»)O§‹^§å»ÝÑ.ÁÁßœ_oóåïgÞr¿u¿Üö=D|ô½í}ßzî¼–³wÀÿJZFû‰+*”U %˜GÁpC‹J–ž-fÍ£Õ ˜(kÔuèv¹·wÍ>“ÄÀ­äÖ‚AA;Ï,A¬JöÉ/FÑÁØR£GÁ(;E‚6cPÉ(ð10“åQjܲO;1pQ´`L0,çt3Æî\Âà*Ù(èfÒ®cR Æ„Ð÷{´† ßBàahÁø¡t"„i2øbàüuÑÏ:ŽOá_Ûq¼L¸=ssÙRÞô˜ÍS:ºNó.û†¹<û6[ &Qµ{»‘V·»ÑÃ,!CaB§ÅššãyŽr‚Ko¨dÿcÉúx–È<0…cq‚(U5wŒSª~£å^C°)–Ç3ĘP|‰äì;¶ óFÒû'\Žñé¤à«qxR¸ ~?)(Æ÷câʼÖ×ÀÙr b±Óc±£ ¸1;‚m`±“ X±Ëô(X8{‘ˆ »ÌÚš» .†Þ_c`òÄéÁhRÃ*‰±š[F y-Á<‚ Y£XlæCƒ©A„mfScx b»dÿ/„Å^ÞTC ìNÏúØÌ¾ºgÙø¼gYû²žuûtÖ¿ ºXï!«`DzõЬa=Ð…b`_pšqì¡.#ÖÕ¢`|ÒÚ/%«`E° 7ÐÝsY›WÁ°]Á…0yÁ(YÖ~)Y·ÿj> stream xÚ]RKo£0¾ûWÌmÍ×OÀÇ­v©·MÙSÚ'EâÑ`¢ªÿ~Ç¢l…ŒÇóøæ›Çã·3ÿ{îw0Ç/šIk ·šÙÌZ “ƒü!ÎhÞ‘Ç’<<)Í2ƒò&c™UÉLf¡là@µÇcç¦$U…¢˜€%© F Cÿz7ýðÁ¨éîÚ6.I%ç*§‚«ä­|&¿Kr!b!$nøº`¹RP÷äðÆ¡AÛ3p¦mŸ‹g(3,å^È7Î2¬MéLÞ“–Š&r.ž†îÝåêü<ö¹¡õ8¼r¡ÏשšÛqüž œYnEÀ³*ƒT"¼‘ì[ðÊ wC" :·s¸¾¢þê]¥ÓæÚ¹Ê‡àé ƒDÔ5#v(§ÎÇç0ηð(|'¹&ºs{o¬¢?».¨%ý¨¦ªw³›V´jZAüf)¨«Û‰Ä°TH·ê„bF¯ã=n%(LF;ö}54i×&‚Niê?Û¹Žï ­ }q.yWoÍ$÷/ž<¬åýs¿#pX4q5¶™.z½¶ 7Wm‡‰î¶÷é¯ú»m endstream endobj 3392 0 obj << /Length 3442 /Filter /FlateDecode >> stream xÚ¥YIsÛF¾ëWpæb¨Ê„±/¹¤”Ør”J2Ž,Õœš@“ìÈh@Šÿý¼­¢=™šrYìõu÷[¿÷ðyúÁô¿ßuo߯ÚUÿ²0ñ£2]åeâ—YY–«^¯¶«ß/‚Õ¦ß_üpwñæ:W%LGÙên»J3?+ãUžF~š•«»zõÉ{k6›F÷—븈=8À¿\‡^Ò(L½{«ûW'ïýhj}¹Ž‚ ν0H.ÿ¼ûùâÝÝÅç‹.Nô“ÂÏãxU.>ý¬j˜ûyøIY¬žiåamífõñâäÎQ¾‚·ÅI-/Å~‘òK¸^¥Þõe™x½þ<êö2½¡ù7ÍSïÊ>`_×Üý}Ôv0]kñÆo®‹UøeP†H=Ìü2ÎVëL#&ÿ±ƒW^×Âö0òÔv þ„±gZ3ÕðøÌ9è<]F¹§{kÜ®çK ¡,ïëu£•ÕõkìfÞVëz£*ÜòÀ«·}wà¥ãeèY”£ÜëêkÓîÜAiê©Þt£åasrŽT?гq¢Ã÷®Öî‰a짉H]=>ÒµêAàI’À£ Ü8޽n‹¿ –Ïÿ¨ûÌO•ɪ;èÍÐÖxïл½éxj§n˜·»a¸¼PµºÂ3|–ª@è—iJ*€|J? c¿Šüè)ePü3bŽ?Ï &óûwçõ! 8‘–ü{RüÂÌ­zýù[³šhá}ÛÉxÕµa²‰E(ÁnD~ñ¬M XÖš];ÏÔu¯­ÕV´Äv<~#dU+G£ýŠ ìðqÚÞ¼„𾳃ýþÖò>°b?†Ð+¯¾ÆˆÒñáfx%¯Tø“ÌR‡¡ƒ±c[ƒîªE=¥›ÞÛŸ~üð”ð’ǾC©?:ÕN¬M,SƒqtU¯¸eyÑ üÀ׋rïÙ {Vò8öãèDÉk½Ucƒ,K ñÚÂiîlXŠÌÇÍÅ––l0|=À›Ò°ô!/4êiGm@÷á!1Û¯h y%XgZþ½ùð” ½ÛI3`ü%p©3ZÀòevûí,Z{”Äü•çpHâžðþBeùhé\lÞ g¢<ô®jxø²ÁX}7X^úG·Wð7äþ¸¨v¤±„Ôб­ÜâbÀWQI› Y4ô-xäFôw°¬îÍ?¡RS’XX áC| –£çK"Ö˜nŒtËm76€úÈnw{!ÚÖÜ8¶_$·×¦ç¹Ù”qÇ#èõcoÔ á1!QóóØû­´;L ®u,I‰d]áó÷ª5@’zä2±ÇFi· ‚)'.`À8ÙYFGƒn <}Pκp'¥æqÅ##ëìЫv§Ñœ’ÜÛŒÏã½_É=8 À G´]GÄ…º3B;h5¹ÌE4 ]ÿÀ‚> >gE}ˆ€E òƒâ¹Ô9åœTX7Ð}Û±IO=tæqtæöì C†ö¼ £‚Ç{»ÿ’å­Ühô­œ,ûzè­†‘ D™/I•…“)Œß^ù{´Ê0«@íæ+mž\,Â5ÎâÈdR€}ôŽžíTµ+L .¡7«D.ö]pdz@oèHë`S×Ôd™w˜Æn¯ñ?òj¸ä¶ÃçH¡&U¾ä`/”¬Ö"´øX ¤V‘“¸WS ë~[­ÛnÝ_¦È' /eXbž6!®Úôˆ™O| q(Á3@WŽX4õŒ£)9 _äÿ9¦‘Ëîíû‹Õ'ÒBH¯x±¤`@ìÿ×GЙ œõïp½ëÍδäü ½ž´+#NçÌéœtÌS¤Îúí¹B 95ÒE®‹{ÍL“D¦I§á³Ûà–ä¹µ³FGtÏ32MÂÂÊäD¦"‹HN>âÊßwùa™9¢-ùògƃz¸”Ä»/±Áº(Éiƒ‘†£ '£î¢ÃkŠ :=ÀÑÐßñnŒÖD½ãß(ì ;Y)“NacÒØGš‘#åC‡éÂÄyÚÒ'ÖË*…ábZxEŽE| +–-‰¿E[*=,8¾È™÷òµ$´ü+â…Öü!«Ä„"Jûê8ýåŽþkÐm­]2-sJ¬,˜ßX– ·8´ÛrAš¤E˜}3R¥¬Â4 nBù|4¤åñ¹×9LcͦÑKPK’•@¬Üg¦^ÊÛqEg» #`ÍÕôp!Ú2–ÆþJˆÏwŒwþÊÚ Ü6€Žü4ú§ÙC l‘j P‡¡ÕâíÉŒU*´@Å» ÜÓ·¹Ù~âd =Ü·½^e•|œ[Ø7}”ëÝ<út)e¯£;òq(Ñ·žåäôÖ¿üÂòô‹AðÅw>Me™Ð‹ã0ÅÁ 1ÅÆÔ–W4’ÿ>°ëÈ(¸¢,:î1¼êBõðƒüå Oßò¯„¥‰Œâ‚à °|¼ ¼> stream xÚ¥ZYsÛF~ׯÀ>ªaÜG^RŠ%{™JâDÒ®7åÍ ɉA€Á!FùõÛ×€Ek•J¥Îô\==Ý_Ðï–ç¸ã¿v3ëÞ½·jË…ÿb/tü,²’,t²8Ë2«UÖÚúùµ60üþâÛ‡‹7ïÏÊ`Ø­‡µÅNœVùNgÖCi}²oôjU©ör¤ 8— Ïöà‘ïEö¿:Õ~Õá`h¿t©.¾ë‰í¹Ñå¯ß]Ü>\ü~áCÞ¸˜:IXÅîâÓ¯®UÂØw–ë„YjhæÎ‚¶€veÝ_œðœZžëdnæ!ÏiìÇVâN1Ëû¼¸ôSû3þOõÿu#`7p=»iù·UUŽcO4¡d"Ls÷À}b+%óò²¤– ƒ^¨*™©kþ½»ýþúîýËânôáîÒó<û#îT×å…‡ƒÄ ´¶ºãÝ8½Ì~C7äUõ4Ž%Àèç+ì&öjè™ÞoU«P¢ †…8Q(ï“y„®]äÂBÏ>lUÍDÝ …ެ¿ê‘™8²ßé¶ëñŒÐ·õšç•†e0¯çµÃ¸ß¾Õ—QlçÅ©?zUwº©e ð6ÌBÏÜz@uÙ^z¶â™ ^„7ij¡1î”s­Q^kƒÊ=Ò˵Òöøpp¿¶gÊPkÝÇ›âVßæð’qÁ½ƒ®*n­h¹2ÛB€ÞºmvÜš‰ú›ªYå²j <8èÙucøèt½áfZãÙŸUCg°rrGQ\ÙWvN›„6è†Cs õAX`aŽëù¼äö bTÊ®W9J(É®™X6|>~¸FÅz˨JÉSà<'>nï‰WˆÓ‰ÕÇswL‚ëÀ]rÜói|‹ØÜö~ás£ØÉ‚xþÎKTÝ ¶wM×sËhv±>ɼ]<}»ÈV¿¨©mòV±Ý7<~”t'ÔΆ k‹0òÁ\eϦ&Û>äx²Fj2G‘.XØ´Û~–ÞyvºßžSõ£þú©ÇàãôÛ\ZE^scňŮ©ñXº@¬ÓÈ?öÑJKf§¬“ 1¡ÇÄù-m08^A¶H{0§Â_³QhÞÆü}ß¾QÝ^÷ÊðxæºÝ«hv ¬W¬ûç8B:ÁXÞ±aèݾR;ygR4´šuo&u&»Nêøg6_ PM‘ß0´ïìX˜Åÿt°ÓîÝû ëm:^ʳÅ;=$é¼z“È Ï¾M‚/޶BžzâöŒåø‰®åøó×<3=™»1ì{â̓ìH3E¡4S:¦Üø~ùvùÀqiW ÖàXò2U×ë¦Ý‘’0!gUoȃAÿú§ÿûö}æÃòþöÍÝíOß_BTñ Ot®»C€êáÏÕd§;t9¢"ìAÚ€¶è_iA- ~½ñ«Ð£Íwºïå©#{)óúí¸‚7X ›o^¹ëÄðK<]ŸyS#òk4£à…4¹¸Ó LlBîѰ±óÄ¡AË“ ´¿ /G–h ‡g\ °%(~Ô0å€#û¶aÔV- ‘Ùb O½.;&!DⲕÞlñ y>aåFwECg°ÆÈŽ)?ÞPˆÅï:iÎß­TV]ß}ƒÙß*PD„0¥f§Îò§Ç˜[óŽix’ ôt]TC‰jн›¾×N/™*“&€ÀšÅ¨ïztê8©U|ô6_°y;\àÛÑäñ,vPž1™ŽLÞ7•.t¯{=("Z7’wäåAq7Š 9Æ7r}r~¹îÏ mMaxìO*Ê €r†$_—Âs¯;µ›˜\*‚Øj¹æy¬ØÒ²!Gb84{ü ÎØ9ò¾5Ï1®šÿ´ªoµêdÅ .at£ÙÛÊYÃ^¶aô? íJŽûT'ÂQ±—ˆò#”?9*?ÒPŸŒ’ãìVíÁ¦G Md@áH'ùÌ24Š Á\C°=ÉÄ©0 I%Å3t˜ô[™úü¥Î¼´èw*b6±ÖÃìÜÈÅïÄç뺄è¢W¦Ç¦‚¡H¥ÅÝ‹%è&¼ÚÒ6ºiÿ¿óô_rž‰zÑ3çz±jR‚­f/Av[ÍÁ]áID‰T% èI°ÀÔljý' öW"lÓ`ã–R¼zóQÃmsŒ5‰‡v¶ÈÀryó×1™ŠvŒ¤@àÂá‘$?ùtë+ñ‡¶©ÿ®sL LF‘ŠR‡päÒ2rÃøƒYz/á90 Õê€ ÄH…i97l”¥ÆgÈeÜ g›wÁqò¼iÔô@Qzp ˜îÊÐiÛœSIæö²±FŽŸ'QŠÊ)+Žƒ  ,ZlÅc]üæ­îLÄ4¸þ"hí¦X×8ªO‹fŸPQà‰ˆGÀµÒÆ%ÎÖ¨ÓP¬%>‚…9ÄV›šÓµ€áuØ \µ­o¨ ußÌ}þ#@sŸï#ú£Å̧wa "œq!Ø—j/ð,†Ý$«;Fz&†G仚u¡˜$S7‚3¨,2jäÀä3÷æLõ\¢ú€öG–‘ BªÞ ØßðS2ã%Ó$²@R_ô#K£Ê°Ýx=žå7M+rÜ‘i:Ù–7›îåÍ ç°†~;®ÝY<‰×ùbv> Œ‚ðÿE¡ö=Ç=®Á? 6<û=TÃóÌÝ9\ÏÅESÞpH×L¸¥`-3‘1O™c)í'çìDâzÍžihΕ̃$¢xƒ¨óøìí •&ÆáÝ^³ Oò%FZ¤™II#7Jðk Å ’R±T”U=Õ`Š–~–:ahÐòƒÑå©Ë$©=ÙÄw\plî4âB;R}®«ó %l "ð_™RFá˜R.ÅçÙ„hfLC£Ö5ˆMú&Â8€föm3Hø;Œõ²À^«¼Z#š k FSbÁ²Ú_rU áŸ}Uôr"ç{ž¹è{<7Íøü4•`„s–üï(A:88Ç·°¨ÍQú¤/©І»S{  O“Ø“u«–ÀòЩ×oÙ•¦â’·NnÇÄþ$;ÑÅžÄÐi6I@åfð<;îë&ÐaGûC(jjƒÊ°Ì9)¦yWcüáÓŸ:Œ=a6gþ¥©›eðÔ¦2ÀO G·ú”„Ò­@°xŠ/Ê%Òy.‡0öìëIê!€ékÕvós%nΦ•¼ ¢€¼J\ ²¢Ç0=°¥f²2µ6§àë öÌ=#VÍFα$‡œKi ”Hã%üþ@0æ «t-×Ý©6¨Š¡=¦´TÝ›u‘"U½oƒ˜Y ª‘{Dz©»¡ " AGÌíÓ—# JCÒN™™ ±¦ÔÏåO ¡ÁAœ´"®Æ>‰<#7ÝXöž)]¡EQõ±“ùµB…O*ëAgÍ6M%CÏ%<½äŸ“tsä ƒC†ôçÙï‰ »ðž\ý€ư€ñ¼í$§Òoxv¹™Ucøƒß´ì‹}°3ùâ-³”cÔ¸*A$ÆHÉwÍ0Ý¿eá‰ü“’Ü8"¡Á—rf=oÄ’Ü>OSÖ&Jûo¿”mÉ%%ùã!›¹€(ôKæ¢#®®ùWÄ9½Gà¤æyËq$áid’îãæÊË?]NeÌ£ûQ”.P_>ˆÈù¹1›êì;š/TÁø©ƒ¡À|M<ûémͱåkQ2:g s0æQÊ^&™Šßçwj¹ñ?ÖLhWÝŽéR$”>+Eéd¯NUÀg’ÚÿðÌÆi ã&cq$á 7êÛŒ®_Hu:PÄ’« ÓI>z{N2wV]»M_q…Éþ“|jÑóügé,%éSµ|8Æ:~ Ú€Yõø yË‘ Úó¯± áxñM˜âg&ÉÄcG8熓–t ÇØ9ŸÁÀˆü¹69Á€†|’¼¿(¯AÃvÝ™ÐÒdè²Ç"JÎeóøÙŸÌ$VpÞƒ (ûêõŒeó{ûpñ?NÒ endstream endobj 3412 0 obj << /Length 2975 /Filter /FlateDecode >> stream xÚÍYoÕÆú=¿ÂÊK©1žñ)·¢lM( zÕöabÏÉqñ†—Ðýó÷[f||ÂÒ"¢ ‘Y=óíÛœ÷Žðüù½3|ýÌiþÅ"ôd9IzYœe™Ókgå¼:ðkX~vðóåÁƒ§p2X–±s¹r¢Ø‹³ÀI"éEqæ\ÎïîãòêªÒýÑq.\à WÀŸHŠÈ}3èþ‡C÷ÙTúèXú~¸Âþ¼üõàÉåÁûA‰ùü0õ’ pòúà÷?}§€µ_ß ³ÔÙÐÎÚ¾@¿r.nÁœ:Â÷2?K˜eृüñH¦n;Taà6ZØ“nÛh>L¤{vñˆU5´¼X@ _éòiÛÚ,éÜ‹JâIXTž–ý€ ¦™Û®¸UUŒý€° >Í5¯äX`ÓÔ  Œ\ÂÈáQ o×Úl`Ì ‡˜q¤Ú¿&;ÓUªl¸[k…÷Vz 0úC®;³qDžT(ÂÈ<¼#ÈÝÔw$\í€*(Cè5uè"YEì^®u¯y¥4;7  `¡jlJ`õ–Ö™øŽ8‰–kÑçȾp˦¸ì¨C­9‡t§gnêÛ i‡ýqmï7¾2ŽÐ S5òÒã­Í`»‚Vr“Í4j{YvVôrÔ+YxІ£ÑlÔû²2²·µÐ¤Úˆ?íÑýÈìAéíH§¼/)•L¶:»_©"|–ć«/•!¨C£®*’: æ‹„°Ì‘Újy\#Ø6… Ñ|·fÛEß-U¿Y©²¸;¶¼eÐÌá¾~òêÍ“‹KÔÄÚaP×z ^³âW_ÒBF‰µ0ú²Š`6(—kVcº¡UÜt€ºGv@o˰<ö®Þ(óÝy¥*ër$3 TóµêÔUYÁÝ'Pé[Ô`’S»ŸuV²˜À&âA‹ì ^5A¯°{€@³>ú‰d¹4$QÙ|aoõ ŒPò.=ˆ/|žÝâè¤@ò'Æv~mA¹ OJ™cÑæ7z÷ÔN=Ÿ/ØN¾¹xˆß>;3©‘´zMÜÆëÎqH³ Ìû4mAr €ÌP¥@L"¬0>HñZ59Ñ–ÏÎobî SglS?ò 8î\±ró `†4U« öÂ5‡­z&0ò½"é`¸ƒ‘ÛÎøõ3 ÈäRì €¥”VîÖãØÇ7tªŽÃ(LL¾-˜0½ã«`\#&Ž-„œƒk Ri …i‚Ú]haËZXFÁöóŲ³Ï<~ya>á­…Í•µfƒ 1ÚPﳎœ¤”`8-Ø‚óŒy#mÍÆF„öÈí`äE^šffŒ¸ìúå£sóiS ðÌ1ÒA¶SÛlˆ¾!»£hboôEî8/½.™><ýCG¹UÑX|"í8Çn>ØÒ#¦¬7à נ9OêÐÎ ÂÃaZÞk©…!Øã§Žö¼¦?¨º«(TŒÓð]K)mÀ€ÞB£š%æÆ¿Oƒ±SðƒÍYµ²ÙbaÌ2F鯆aªçu7Ê7wR¥… æ+«Ñæ•ʤ_Ò÷Å šÁ«ôDœœˆCdë‰ñzCó‡\är|ä¾’ ê…2Ä’ÎÛòAàiBuE áë7Ø{®‰à\y»r|©rqçÛ¾¾óSxÂÔK“è6ÚFÆÿ1Þ\’{Ê,`¼,d!jô8¬QT#÷8çV7«ÔUän̼;p{ÙD^ ã{Ä?€hÄXÿ0Î÷‹°^’Ü'Â2òÒPì`¬Š‚;ý„¦{ªõéa±Î!-›Cž,Êþ-}C)í)Ú¿ ÏTm®ªìü)øXž‚Lcló¶:Šî~Èé§ž„àóþÈ)¤'3ùwÈÙNゞ0ú7Tf¡'éýT IÜ‘ E3Ü™œ½®ÛQ—Ýé!{+몾ÁKÉL÷Å÷öRx Pûï8){é­§½“À‹eæHp´¾H¾œ8Å·‹DAˆ¥¶aòš2 ìÓ±ö³£°HDZ£i„ñLä¾Ôã2IB`|®òwû€€?ö8¢ö\ B†©ÝC¡‡Q‘ûÛ9·Ù” ^$÷Þz~:C^Ïá§pÿòˆ‹¡ ð©5”h±¼bR`•;Õ6¥Œ—º®23ŒL¸5¶¦ aÃ* K™*”)†s¦¸È[¹jg]Ù¡­·3Î çò§/Ö ïR½ögFüÜr9Œj§æ1A¸S><‹TzXÜE ¦³ÀsŽ™¹Š`ÊÛ©©ú˜/¸Í9\£8}1ËÜÔŸûXrÃoÐÙ% Lüvn˜&?ýŸ¼æªvìc$Ä¥Ûô!Ř”ˆØ=yãelMæiâ|JÈóñªÜ/ôJQ™¿À´Û^ÿ¥s3Gé ÛùúßmaY¤Å)͘xmMÙ’MJ—WåÀ™Mâ#H9ìÉ,>Ew‰u|<2´í9azk7ÏaÞ‹-Vê×vhÙs›M˜}{­¸÷ˆJœ QŒ+çÂ=䥒“tݯTŽÉS˜$÷0™sWX‰±•T&U˜ØÄg>Zµÿý J¥¿%sI⥱üÞ>A¤`h¢Mâ"âÐ Dpq‚ˆS/H’O2—9z§Ñ m8P¨Ž<Ÿ·$uØg©ÃH]Ã5‡ö¨ >9µþ "⌾»HÄÂ2ú>q‚„GâÎÖ‹ÛÏ­ÖgÝzŸíõj¢'Bz‹mM¥˜2Ú×°7g=SGý/±_y’2ø´Jd¾©’bV¨·}ÿ‡Á®eÅ» KðöI·1kSgöP% :ýÔlßuKó¨k¼DfLÑy´5ž}Ï%й¹â 5Ñ7´öôñôG[·e;&Âë^øôKß½(±.…gHWc`Óè‘GÄBhßž==ã^®ú‚{õüX3ðĸnsJ¯ßO •µá»½èeK,Îö>ÊÜ‚×Ùw0z¯å‹®,LÛ2Žl¥n-ïªéúÚFTs¸†å,t.ö7¶pFï0³¡—ûû‚Þ|þ?¾Q5xàO䥭ƒ…‹ÈKå9Ð’g;þ‘…ñYkühL®›ÒÞ½ãÔvKnµêßÍ/‚0¯†ùÉ™æëÀò0g¿(ó¾ÚÕø¹× ¶"-°D¾}MÓÅO;OV¶£øÐüJ endstream endobj 3424 0 obj << /Length 469 /Filter /FlateDecode >> stream xÚeRÉnÛ0½ë+æ ¨.’Hö–¢‘œÚFAA²EÛBmÉ‘¨þûEÚ‰Q"gy3|³¼§ìò›+õ÷:`ø•<§Â LNMiŒÁÂ~% 6è^$ߪäö^r0è%Tk(JZ ª´( T ¼ïír¹³CšI- >@ÓŒŽG!xAžG;܌ޙ“ÅÔ66ÍcRÎTúZ=&?ªä-á3!~ÉŸkª¤„Õ>yyeРï͆ãŒÜÊ @yOÉÿœ9£†îI+IKa@ Iu8ß}õoßÞëÏ8^RÁf™!ÏݺÜÔÕÎîN)²ÿ‚E°‚üi»¦O…&G¬JMt¸ÚYU¤ë]0ŒÓဒ&˜&åÄú¶4sòñÖa§r)ÉC0bÖ9î’`[{ØûŒ ×îm»¦.ºìè"ƒ>š>1Õ‘ürr¾pȤ¤¼qI‹<²]#ˆc%.܇£àçægÈ q[¼c½ÒÝχà«Çs }oû)j¡€alû.ZšÞÓÂ'ìÍG”s{ ú¦Ý›Ï&ØVÞ¿­»•=³Arµ ÊÇ""òØîvQJçü 6Ç7€]—~5T‰3Ñt^ÎóVo\Ö¬ãÑ. endstream endobj 3431 0 obj << /Length 3599 /Filter /FlateDecode >> stream xÚZY“Û6~Ÿ_¡ÚSUš7E¿ùHl'qì'•J%y HHB†‡ žLöÏo_ )Æ{TÊa£4@£ûëÖ|^…~0ý3û“æOoVÝ*€ÿ²0ñ£"]åEâYQ+£V»Õ?¯‚Õºß\½¼¹zöm® 莲ÕÍn•f~VÄ«<ü4+V7õê7ïµÞneÖ×ñ&ö`}z!ü/ÂÔûÙ*óÄbgâ½u­Ö×QĹ›õ7ß]}ssõù*$…ÂI~²ñó8^UíÕo«ú¾[~RlVw4²]íÀnVŸ®ÎtŽòì-N²h©tû›”uÐ/ŒRï½¶•jš²SýˆZæ©7ôG]YÔ…~‘¦$(X]G‰Ÿ§¡â‡"æ­¶CoîyÒf=EP„8'Ìü"Î`bà§ErvbQ‘yGÓ¯¯ÓÌûSUsîÖQî•–v(Í jlÌ̶´ÏϽᠬþgÞ3}³†ëèaäßÜ~oÆ}ÙØ[-¢ºZø¥Q·Ìû¤€z /ÐÈÈÌë;þ¾ê[ì8ˆW‡½®®ÝöÂØO1ˆO•V]…½‰¼]YͰŽ6¤0H|ßÔegqáMèýÜé/¨º2VŸŒÝq?íEUØsèú¦ßß# -I/ûáÀÃËq8ôÆrcoÊz,ùè@„–e­:ªEI[dxtŒÀG£)t28.äƒÂ¸Õ€7)Tîèâ8žo(޼ -ü?û­õiê¥Cz=Ýíad˜L×Ã{q׉ü;£ô[…'Cܪl•Œíe¾òÊaP¶'Ýá&áF1³4"¤G&ó^¿}õñKÆlÝÕŠ¨…ÙÇo¼ÄQ_Ö),¯›lTN°ÇNòÈëúN1…WŠ_Xµeê…†´Ü ,ËÓ`«5“ðLŽra Ü~‚·¿Éï'µS|’$µ?—~‡ª9ñ¥¬¢E-«›æþùú:BïéSÙþâ²ÝþŽã¶Ñö@º¤ü"ðkûÑTj×›½ò;50ó@‹¥™ÛË@WKÃÇã‘-ÊÈX¸åŽéZñchzî–Õ2öûï¿ajé;àÈ“;rTr4—¶2Ýq¾¹pǾïÿ6Í ïSσÞñç wŒú0§V¸óšbcD‘ù^Ï|{èǦ~Llɼú…&0ÈM‡Ë{ø§kÆG(fƒpNÐX<Ú]ٲÇá¯Þ¸¹0zgÐáá€×$hÞ4"¢šV2ëžðÙS#ͦØm<î >•uC. Ÿz;Ÿ¡W³¢µ ÙõÓÁmèà€£º~ܘÞ%ÜA·ŽÂ ‚SóB†ìšÖÞ×C._c@žÓ]Qßð‚îReÀ¤[w­þ‚HxÒ[û ¶•¨(HMôçpfo{œMAPñr¬Z&F†Ãk6 %³éThUÙ=<¯rk Ïõ”[pûà¤jQâÝ¢OcË·@ކÆWƒ„¬æ^Teç§jæ‹u\xŠt1~Ò@¢µº…Fˆ:$‘÷½RG/¿­ÆØ„”¼7 ð}F™'öyËL×¹›F&°ÀÈÒÉÀCÄïǃÿÚgÒc vG{³2 XAÙ²S>$\µ±ˆdÖÞ¨rh.î¼Ñ­ð¬Y…¤ù²"Y¯ÀÄ`Çe50Rãaè Bt¬T·÷ö?á1q7“0£­à—ür(Ǫ¶Kd@ÖW1²H(⎠ü j´BœŠû¤ýÓDÒщ"€¡7°õ€u8 Ãñù³g·Í¸õ«¾õͳúP9Mèö|3Iì‡'î0+"ïÝŽ5½'‹¹!Á¨ÑÎc<qêP³ëÇ®–ã)#€zÍqùEŸ…ÉF•V±íG2Á Ã`° o¼—ãþo»ô™ñ/éwã-·¥w‹psÏô`Jr¦·|Éh¡÷v ¸ÚrûôvHÌÿw;à }ø÷•ÛÙò>ʯÞOšøYœ..ß5^PLNŸr•‡Ê <»}‚Ó­nt)ÙÖFè‹|ñÀ»eîdÇ}tH-¾é}÷DFŠË0L§`grÀ?TóÀ9!6ï+/‘D3æw1xý-Úi2™°$…¬ÜÈúÎÒroïD‰¼o-\ 9ç:•u3#§˜T]|¸þjÞÇ~;kƒ/(Ö1Ù›š¶ $:ÛCÛ’A‰Ë­;*0¥‹ÎT ­´æðˆ˜€y5¼®öl–¶Ÿº!Ÿ££•‘Îb«fö 1*À÷&Š 2z8Ðk¼”þ=´ÂÇìæ…ÀŽ8I<Þ½:Zn–ü‘ð¡ ø›²¢†}'u¿$YZTÀb7œáàjfˆ/#Ͻ·ÒÅÇÕ\üx„ШËÁÍ”µ¶’€£˜ÆWhé%¨â±WMR²dé¡2Ã&KÈ#53yÜY"¸ ›Î(4«„…ë“ü™‹ü/›™lÏ@´'¥ÔLìÖt*êÁéöƒ‘3Î]­Ù¿“Þ£ª`»?¢¸²y<\¢çrÇ\ øÇ “F£myœÄušÁU¾HEøÎNì.{ ìX­î™Ía#EŒ²qålˆtn®å"á£vú­†Í•¬,ËÓ„IS‡Û€àÍMÅ!•NK¥ª2j ‘K+)—ãe~%©¿™’´×¸@øã‡› ‰øà¢ÜXyIJ¾¨BÇ%\Ý2ÈÏýBËÎiñƒHÃ÷óˆI!)Oó³\`´÷’¹ôŒÊ/ ±ƒ%8½KΣ!Œd”QV`Ï—ËÃɶ,ÿ0”sÏò»[?göæL‰~Ž=®k_êŽ@`â½§÷”­[àÏ\±¥ƒÃ9üiúAFÛ‹0¼ Vö£œk†ø;NZ(NEË­r²–p9n1*R#[3sNªí³´A”;æ¸Ó“Æè70ÏÃ|ö ÙWqÕô‘ *| >X UŽMûº˜2 JÀŠÞHe{O°;Ûà<¸9·‰$‚@¦$›ERªŒ=åèȸ;ôLLH‹æž•u"¶$Ø^rö"J¼èda©wÜÒTX Q€§³u2f} ”†¹)áŽÓ`úòã àçxûùT¸ƒVŠ…ýj(~›’UàSBåºÈÑÈR’5§áÂu[•4Z“ÝC{ZDüT8;áTÂy:ÛÜÈ3$ñ”IàøË¥ÎAh!‰YFV_4ÿøPDK–Œ ÏÜhäüÃÝ™RÆ(N:9)Î_8¬wØ 2층•ÑÛ©J½TN’ëÈ=\ÜÎ}³7‹¿ FÑ?\¼)é×àÓxbûVbþéT2&¹1ŠG'Ç}åÀü"Fj{È’éÉÌý"ùxК2Ý<ŤÆ.êËn §"À…0¦±§SúðãkÀL¿^BqæçÅ„(DçËR4ÎB@.?óº*÷TDÉÑL?˜#Ç¥q@²â‰ü5ÁCy ‚‡)'°.#Í—Ù ~‚Ü6éé™Õ¹‹nñwgJœ°ÿ²¸»?ĘÐ0hˆÆ÷?ï©4˜Òj%£f?ªí¹Í ˆ‰5嚆~²Å ¿.>z~V÷Ã¥¢¬B?ÛÈnk‘õ•‚q’øÑT.ÆÂ8àÉ÷X1p™ÂTèŠS—wfK%S®áaØônàü> stream xÚ¥Y[sÓH~ϯÐÎËÈUXÑý2oá`†%¡¨-fd«m7‘%£–Éþù=·–-“ujØ¢ˆúzúô¹~}üÕ <üß­'Ý—Nãøð/ b/,'+b¯H‹¢p:嬜ùΦ/Ïž^Ÿ¿Œ§€é0u®WN’zi9YzIZ8וóÙ}®‹Zu³y”G.àÍæÀŸ$ ÷£Qݯ'c÷rЕšÍCß27ð‹Ù_×oÎ^\Ÿ}= ˆ¡`¤ç^EÎr{öù/ß©`îã{q‘;·´rë@Ûƒ @»v®Îö<û^+C—ãÍ'ýr§Ü |¯ð‹ï”Gp½ÔÉÂÈ˾Òfænßï~;?¿©‡…·l·Þ®>_®õ|¡›óm©ëmÙœ×ÚôºYµç•ˆï32"_’àÁqó0óÂ,‚/È0Hù@!0¯Ô·Yºªž:b8!%ÌÐÖÿ l}÷zSöÐÊ ¹â1mxD7³0s{ÕTªâ‘ÒðŠ’?·xßÿÜñ@»âupñ-îfÛèeÙë¶á Ðcîª7Ñv¥dfÇ3í®VO`¤ÜÛM+Çu@Gq»WKܶA²u}‡væqáEyễÈKb±/ä>w¿áŸ¶þ†Üà-b°-˜¡o¿QܰzàŽ¢=ªnw[E4z0Í´ðÝ×+^qG4î”Y·ºY áVÚ¢Mï€ù®E˜ðgZŽÊF„‰[Ü"Ò/¡ÄQênË›*f€ãQþôò=«5(öÌb§lšvh–Š{Z–lT§<¤^¸ÿž3ÚÕÛQµÐY«qu½ÃÕ±ï^Ô¦R«‡Nëä ¾»#ÙP[vüéñwlædM0²d ÙÊžX'£(ŽÛ†·üé'þFÝ!·Oþ×ý)|…u§Êþ°#xÂýFË”Ø<´x$#^pOKÖÈ+žÚÕ%I)´ò-ëÙdžÝ–^O2 ÝOÈ£ZÌÙ{Õ­F*µnnÀ6~c§}$9Ÿ‰Ü‰óN…ùh铨|/вi¤yÚöÕH†Â0SZ5N–{§æA#£ì‰Iê+%œÍÃm3 é%Ex`zð]– ñ¥Õ¬–TQ«rtì‘âÕv(cd¤Œ \Ë9yrÖŒÑ+r{½‚·h½Æ¶æ ¤^™e»2ªÑŠ#&‰" o?j>Š™OX2ö hö]YiŒ“eͨ¶ù¢4 ù¨x¬Üíº¶d{ÈÕùË0s‚À+’$Äê / "f4Ãö L0Ð77Ø1ÌTÜ×P`kô&éÂ^7ô½¤ˆ™ÞkØ–|³v¨+îÖÚ†$ì‘oÀרFæ)ÜÉ,²ÁÒ2åÏ—ƒ)d†t„ÚBž&äÀ|0Øêv Éiƒ&”î'ÝoØé$µE‡Ïò¨ñ#óMÛÿ¨^Éç’¬D&¹IÔHAu'qÂëÈ%çÝ—3k¸¨<þ¬†ºæí}`Œò&|ÅœúN/†¾íÌ^h”|³¯_ýñáŠg0ŠÖÊ;JûSä€6‘x‰/:| aù†Íü S{gnô)ØPd^‡°!LÝWŠ£+xô2Ç‚Ñ5p¬Þ¶XSˆµŒÚYJ»¸|¯]Š •›£.a¥ìÔUpá¨íz#¡ü€„$LÒ,)4Ãò£xx¨Q£·6 S·ì‰±»j»uÛ÷„K"Œ%! Ýp²jz%º…;mNëáA÷¦½W+ÖÆ§YBºo4:dù:Écµ(—dîÛ;þŽ|A›ùú•;f°>óM›¶C§ P•< hªÝ£²JhÉ$ya’‹%ÂÀóWÏÞs‹âs™>uÙ­íéfÙîFãÃß]Ù‰Ó% ’ð(¦ZghF”Zínxpדp•cðÄQй<‰µ1œˀ.ò(GIÀVïßc=íBöÈsZ7üë“u¯…9´z\¼8 f¾ÚV 61üÄ‹òd’ãMkƒ~­{Héç -Ï xƒqÆ”7¬<_I¤/¹Æ†Å‚]Ý–•j1h›)mügƒQI€ÁXÅ"l-µ\«ŸP,fÊÖÜ‹rW/ÝŠn_ââòéw$*6œäÍBðíËa½±µ“B4 ß=˜§çhÉêâiy̦Ӓb†’-÷0:!ЂЎƒÙÛ9µàÆÎº-¬ÖJè•RiõÆ^‘g?‚ @@ÊK!øö†Ü¹p_÷8ÀÞÌÞp/ˆëØ.h[pŸ–›=Ð{ŽŒ¹MwD€øÆ±]IáZäìDa3ÎM®ÂƒT÷Ë`£³<•y¨ŠX“ÅQ†n°•—Hžô8B5l qÆõnµ‚M¥(3–&k@ EËí$qþ³»¿3÷}k  ¢½á$Æ+/ ãI2M“©…e8ß8òÚ·% \,"ÎwûÓöH8ÿ‘ZÄ#fØÙØ7Ãò"“‘#oÙjîÙÑ1½ }òú4‡'ipü“†×“ÔkN±pÛVþv²?w J‡½þÛO6ýE]Ú‚øó¡£ ES=ò\)’xR**öÅ`h3—I.–•ö—3ÝÛßí)ÃŽs𾡷NðC'Á‚¯1ãzö‹Cò\_¯ÖXó]óìVMÉK}©°o].E^š‹Þ˜Áš»p-Ö1Md®T4&NQƾ(å=øÃë‹ë³ÿöØäÓ endstream endobj 3442 0 obj << /Length 492 /Filter /FlateDecode >> stream xÚ}SQ”0~çWôÍ’H¯¥-ÐW£·æãébbrÞ»tÝ¥w\Íýy†]ÁC 3ß ÓoækŸ‰`üúújå~Þ–px¡Xl4Ib&1ÆoÉ| 8© ¼ ÞäÁÍ­Ä@8NH~ :a‰‘$Õ1Ó‰!yIèÛf·;ZF2“6`a$¨€Ž…¦_:ë_ucPÑÍД6ŒbÎeJ…àác~¼Ëƒç@L„ĵ¾ÊX*%ÙŸ‚‡GNJˆÝΔÉÈyÊ<°4ö‘lƒ¿œÿå.83܈%ùX²L#÷ûPÆÔö3ùû¦+üDêRåæ6[VH3@‹ãÏ/ð—”ô½WEë¢CÀÛ'h2£Î÷¶Dèèú9蘽ªî5BE;gÇÎaÔzÛ"øä]Å~Âèæ߸P¿lsVJÓ¼.Úà¬i¯;fâQ º‰dÑ{1±÷í~tëb°ÿ@š‚ðÙr±™)Œä8íbu3èJç±Y¾8-ÔBk)=£s§™] ¹áÅ[¾2\qM‰À©#ÐïÎ7ýXë7Â8q`V[®ê4m5öJ"ͧ‹ É´šõ…ÎJ#5V™…Á}ÁhÇÌád½:L«-W‚KÚÛnÚpJ¸J^Z8àk/+\Ž?ì/ê¿ endstream endobj 3457 0 obj << /Length 1054 /Filter /FlateDecode >> stream xÚ•VÁrÛ6½ë+p+5ÁHÄ1­eÕ™i›8ÊÉ“MBkŠ”A0žü}wP¦\·“Œ,» <¼wýD8eç¯Ý_˜wÒŸœgThI”ΨεÖIJ#ŸŒì!¼Yüº]\ݤœh‹œlwDæ4×)QRP™k²­É}rÝ<<´Æ.Wi‘&p]®xÂáG .“/ƒ±¿ Ì’ÍØÔf¹Œ¥*áœ/¿n?,ÖÛÅÓ‚{BüŒŸT¥)©Ž‹û¯ŒÔû@ÍtAžýÊ#9…`Þ’Ï‹Wœ…"[šåbNZ¤´3G~\Èä}µLyòØõ8<·¦Þ›£é–©HÜ€ô®n ÂÕLs„â9ÕiNVÐ¥XïGwè1}©’ç¥PI?¶u0Ûæq)ŠÄ U$®Þ²ÂUx&Ä™!°ëÛ¶ÇØsÓíƒëda“Ì“¿M冸½«Äö¶<M ¸CéBdO'¸g b‰«Å"©úÏuÆx4pƒlÉjJ§TfñG4„@ü4M¬Li+8 '‹¤ T›o>å¶?áEâIaE¿ ÜÁ„ÉKÝ€1ô;ç3Ç¥KΨִ¥3XXÑQV®ùÖ¸Æ Ôgd•qZè'$½y*­kʶýÌyÒx…aØ1îÓ@¼èìÛf8„ÀM× ÎÆe˜5®ú *äߘ®2!æ³ÃÉïÍþ€óu=V¥kúÈjìVS~óGRû{“:Þ&LÖ£íaSvÁugö€S¶Áºö×÷ÖÃàÍzwìêw`æ2ÙXÀ€{‹Ñ?{èi)Dòñ¯Û eÜÿ‰c+–É+¦aæ[™Q]*¶*ªÎ…}·YûÙan´‘úm`blgÜ[É®»}Óc¡)h8'öú4‚„ÌDgð›‚~(Ô§ͤN£w Vx»4˦ÈÕíQ“ëåÓ“§°–«3©€ª¨ša2ÐS^ïQ’ %Ô —³Ë”ø´Ÿæ2äŒ46â¯ùGÅ„Õ,a «@-jÅOLxÓ…N¸«Lpš ˜HÉ(/ ÜáöB£À¢$C­OˆJ/ùK›£äL¢œa5ºà M?£²¦ô‡Æä<–ƒ›0 ä‡&úK÷£…ç©lr_ùj:Çßúãi<ŸÖÑËcׄn. òƒN¹úI¾òËjl]P’7Š}’Éu Šo{8xt»„W¨·ç¦æÜ.Åò¶ÛõöøŸ´ýÚ¦'oê²ÃÎ/]4ÄMÌâBÞ·˜¢ ¯†®oûý÷×.{Ø¿þu(y My¦ÈeRNš†ÊR@1êT´àÐæ"8á8þLÿp Õ­ÿ¯sNEè&ÿ›È9Zöº{^ÿUºI£ endstream endobj 3445 0 obj << /Type /XObject /Subtype /Image /Width 621 /Height 178 /BitsPerComponent 8 /ColorSpace /DeviceRGB /Length 13083 /Filter /FlateDecode >> stream xÚí xÕÝÿ‚€ Þÿûo% õm\ž÷mßêÓ´O_-­­´ÿ·RëBÔª¸A-•ˆ Om­÷mm]ªˆÈf‰ì«„%,!@XD€ìKvY„°Èîÿ7w’ÉdΙ™3gæÞÌ ßÏsŸrçÞ;gæ|æwÎ_,ÞR²zÎàÉž9ÿœù]_öË×£ÃㄞìihðjOhP¶'4 (Û”í Êö„FÀžÊö„FÀžÐ(|{B£`Oh0Sºunÿ¹‰¶'4  ©Ùóý¹™÷JŽ=¡QMÁžÛȞř f·¼Ány]+Ð(àjÏó2;fÞ¨-·%©2…F¤Ž=䜗ùàöë·Ø¯Þ¬/'Sh@*Øs~æC°ÿ÷/M æÒØ2…F„מƒæg>œÇþçmM æâ SçI‘)4 \öÜ~ wð‚ÌG>d¿yG+äP£(È´Cbe ‘=Ên}G+¿iX“iÀ>…F4ª=æ)É|lëØW+·ÅM¦Ÿ6’L¡QcÏfvùˆý¶_]y—u|ׯL->M¼L¡QɳgYÜž9±ß½Çn‹—zšejñ©?™&2¡ {æ-Ê||8»½¿&Psñ Ó¾!”)4 ‘ö\œÙõcvÇûZ!‡š‹™ÞL}ÏŽFoÏgvÁîÀî0Êû²2½MU¦'ôB£’gÏC¹C—d>1‚Ý5Ýi”že*NUešà„^h€/{–Çíùä(ÖiVî¤iÔ(M]¦Ð(?°ìÁZéd™Z|ª,ÓÍŽFøÓèxQ–éß2mÌÙ1Ð(_½{ˆV²‡ÔûÔL->õ=;檇$T¦Ð(_½çƒZ“ZdšœLUgÇ´vT¯s:;àW£zq‘©áÓ@eê8;fÒüÒ‰óJ:;&:| ®ê½7¯Þ¤d:(™Ú'ôþ¬çè½{÷íÙ³÷Šì÷—Ð͇FøÓ¨QüÈ4èÙ1“¬Ý·ï+2içצ&nv 4 À—Fÿa“&S_³cn{yÒW_í'Òç—îT›sùýÚÝ7Àyv 4 À¯Fõb'SO;;&rßà/Ö—ï߀züø úzOò4;æÆ?ÿg~qþ´O/¿³Ÿó°)4 z–i¢fÇôΛàÀAÒèÁƒ‡jjjèCVì?¹w°ëì˜ï?þáËÌ™·lͦÍ[¦~ùï¹æ E?þ×uÞ7T+>eÜì˜ï2ŒìI¥ræÌãs–n?hÚ%¼^¦ÿþHÞ½¯NzkTIÉŠu[·mß²uÛæ-[§Ìÿâò»Þ“™@£F F¦ê³c®Þ~èÐ×dÒ#G*-•"Ó÷&.ë5¨¨×À¢çÎ?wÕ’•Ë+v”•Wl/+ß¶½Œ4JeúÂÕ—wê/9;àK£÷c÷u’©Å§‰œÓgØÂ¯¿>üµÆáêêjþÓž=[µgï¾]»÷ìܹkÇÎ];v’F©Ðû¾ÚìØñÏ7íÜ3P>¡à[£Ã<Ë4³cn~iâ‘#G>B=yòÔù8ü¦˜ô›oN=zìèÑ£•Gž>}ºêÜ9ýŸ*OœÎúã(O ½ÑKq P×è™LÚX2øÝÇówì=xäH%i”I¡(éÒΤB*OœÉzztƒ$ ™B£|i´ópͤzñ/S¥Ù1‘ÎyK¾¬Ð¢ËÊJ2éÙ³gÏ;çɤuõ¼w 4 À¯Fõ")çÓÌŽùn×?]·óرãz?í©S§Îž9[UUuNC3©.Sço‘õÌho{ÇÜ T£I“©ivÌ›±gÿ‘ãÇOF;öÍ7ßœ:uúÌé3dRBw©–Ú}…œ¾EòËÝ[d ð¥Ñóµ¢ S³c¾ûÄÈ ‹6ŸíjÒüâ {ǘe¹ ×u>ô±V*Ó:Ÿfþaô°¹9¡…š§Ï*ɘ¤ÏÊÊ£GkhÒ“®&-ùrŸØt™†S£¥¥¥%òGðóZ»Ï@¿qøûÊÊÊ’ °¼ }rËÐ)œÒ‚‚‚h4šÝÁDnnn¿~ýœ¿—|y:Nò+HzÑ$àY£¨5©³L Ÿ*É4çýó×î&’ɉgÏœ%E’8Ö&Š9R7éÑ:“Ö¥µ&å’ŽŽœ8y Ïß®¦šOéQjáG$‘7ˆåµd¯ŸÞÎrÌÌLg/°  ïn>,}rËxjêésrr\ß”¾½‘üéMÅ Ÿ^4‰¨hT/žd*7;&ûÍ¢ü[(ú¤ø‘ÜGá$‰´H=xð•C‡´‹êLZYgÒ¸JOÔuïZ“Žè0Õ9ï+ìÃË4:jyªh” è)9­4ÅnÂàï„M£gQìéé­ILœú© RvãV×p >2R+È´Þ§ÙoÍ-XQQùMíÂòz7,i”´HÒÔwÝ¿ÿÀM&­J«ïà&mÛ{Dmï^¦©¥QùvÒg+m' M„J£d>X“ÿ®Ae£W]ˆ-ïqh€à4:ªÖ¤f™>U•i‡ha¿ÂuŽÓ[Äíùõî={wíÞ³gÏÞ½{÷‰LZ”’Kå‡JõþÝÚ¡ÒaEëU6b%ô¦œF³²²ÝJ“Dâµðk4??ßçg “ìlÒT¬ h€DiôÑQq“:ÊÔâS/‘é­Ñ©ãæ•VìØ¹sç®»v MJ¥V¥_[¢RqÒÑ+£–Ë/wï,ÓèèÓ(!Óñè§•vÖzv¨Q{xWÚý%½»:|x ±éÔé‰4zÆ)Ïîú0WåB£$C£zñ*S/ ½]û­ÝT¶£Î¤»ëLJ…LªËôÐ!ËP©mÒ‘¦Q{ÇØÉ45*“Êâ§•v~w’‘Êe¦úy6/Ïûó—§üîï3zç/™ºtSÙ®¯ÌIGO)i°›’LSH£1›lRaÜ¡ÐJ[:-c‹|w¢§uçªQÞ/B÷ÉÀ?KÈk4Éd·U« h€`4ªe™ÊÍŽ‰t£¿cuuõæ-[·lݦ›”ÂÒÂ¥ë~ú§)2ËÝß;¡ûàÓ—o!“®Ý¾×icS9™FǦ’F)ì.Ë7 ­´åÈ–F˜Ï>òñ%T£ü…QO½£– 2:W±‚ÔBrh€4Úmë:!8™ÚÎŽÉQ+,Š'7mÞb˜ô¹¼ù {Ç\ñhþC}çÞý«ž®»„;Ë4:öóðkÔ<¾&Ì&åSY¼¶Ò|† ŸZÃÎ:¬ó“Lò£°ï˜Œ„f±T9b•¬ »'%ù09 ‚FF£z1ËÔð©O™š|Zqð„þŽeå7m&“Î_ñå÷ŸŸèi…^‹Lßm›Õù‡ ·wêé5É4%4jéWέ°¤²xm¥-½‘ÂŒúä×KòÕ«Fí*Èò7>+Hi*T4 @u©Ù§J2ÍùàSýíN>½~ÃÆ 7 (Xvùã£Ô–»7ÊkßùiÁ¥i¾ö6óá²2û45*“Êâ©•æ'z;E…‘šäÜÌTÑ(*„ÂR« sl˜ˆ NØq® h€4úÄD­x•©ÇÙ1F(ºk÷žuë7ôRìFÛ“F?kžžßög­;õ÷*Ókoé=ãݼ”ÓhL"•ÅS+Í÷èÚ%yòï+¹Ú^’5àØ¨LŠ‘|R IA£ Ñ''i%™ÚÌŽÉÉ[ª¿×Ù³g—|¾¦Ó›…A-wohtk7÷Ò«oº¹—Ñßë,Óûíë9×þâí+¾µôõ·RQ£®©,žZi˘šÃRr|{.™›d*gê¥Ñ`+ˆ_{P¾‚œ„FL£f™Z|êG¦qŸ¡èº­ÿÙkR€{ÇtûÁ=¤ÑÅ—h¥²ºYúëßiÿÝ[ÿ&–iܧ­îìwkÖý$P½¤¨Fcö©,z¼#ßJÛ­/g×»¨¶î\’'¼x]Âkÿph+(æqa@h€4úÔä&µ“©jBoNÞ2ýJwÎè1>°½câ>íœõi´¸Eš®Q*Û.ʘҪmÌojß½•ÞÍ['Óv·FøÞ­†@© jóí¯ý+E5³Ie®¨ãÐJóy)999póošÐ]ªe4*ÜfÔ몿ÂÀ\r1@O¤w8'³‚ŒFõ’™ê¡(94Ò}Bà{ǼvU{‹Fõ²°yÚÀË4Q¾Üöº?fþ7³=©ô¿ì[“[¶]Ø<½âoo§®FíRYÈ ò­´°©÷„Lè—èÅýl‘æ÷I.MŸÐ .TA£ Ñ?|RoR5™Ú'ôF§|Io‘¿¸,Ò}b"öޱÓèN–ñ%Ë(jž–é·ß½¼@ÅZÒ<}þ%éÅ—¤oÿ{ k4f“ÊBÑŠd+-Œãp]w.Ñå׳UØÍM~ŒµÉT4 @0Õ‹Y¦Ÿ*É4òô¤Ê“gÉ¡‰Û;ÆN£T¶³Œe|vQƲ‹3æ7O/l‘6£E­=ç]’>·Eúœé³Z¦o}-µ5j—Êb‰1íZi~95\3c­Q¾çÓuãlaInÛ­PA–3Ñd·0 4 @ Z¦ýŠ6ç/)KèÞ1ï¦ýÈÈÔåËÊ‹2–4K_Ô,}aóôÍkíYÔ"}vËô™-Óg´L›Þ*msŠk4f“Ê"©-a ¯€ëºs‰Ö¨°?Ö<ÁÄú3¾ïÔ¡/4iä¿Ëݹ‚ QÐh÷)Z‘—©Ü올Wçä/)OôÞ1äPncº=‹/‰Û3~Æí9µ•öÂO.MÛð”רLc+l¥ùõåd’…ìüë¼î\¢5­Ü®}®&:Ôù5™ ‚F@£,¨5©šLE³c"øè¯_LôÞ1Wvz×Y£TèŸæÔÙsF«´idÏVš=']š6±uÚøÖm×ý#…3u ìRYœ[iÞ;òÙ­ük÷I‚F…©nR‡Þ]ú'™Å›@ ¿4 @05J@24ì¿;½òR¢÷޹éW½un¸8ÃN£[.ÊÐíIáç”KÓ&×Ùs\ë¶cÚ´Õ¦íš6ÆlRYZi~¨§œ¡â¾$hÔ¹û”Î!…rôZýCÒô¿vI°®1l*ˆ(=Up¨—ÿRÂy²Îxqà‚ÐèÓ LjœJËô÷o?8½u—»¯3i·~¯któE¶¥RÜB³'…Ÿêì9ºMÛ‘mÚ~|Ù•Ã/»ruSѨ]*‹]+Í/wãu†Ä9!9µëÚõ:ŒèšxÜ($ߣ+_A2ã¶.û@ÕèTͤ’2u›ÓåµUsذ:$a¹ûþi?.ˆq:8”Êú‹3(üÛº=?ª+MF£ÎM"ßôñÁ‘d6ŽŸDêð9“¦Qú~LJŸLÇiŠVÏB£¤Ñ©¾dZçÓ[^þßssÙ¹"ÖéÕÞ>Vè•’iÚÝýgµLŸÑ*m^ R™ÔºíˆËÚæ7hÓÓhÌ>•ÅÒôñ[ÈoyæÜmhç ¤iTÙú´IU5™ ‚F@£=¦Õ2Íêýö¡Y­I£‡ [ûZ·AnvL—=67>ueu³ W~Ö<ý#N MR£v©,–¦Ÿe©°æP vIÖ¨Þ‰*–Ò_zZ<0Ñä¿ËÝ®‚,o€FŸ™®«LE>µ—iÖŸÞ94»õ¹yì\1›œ£×Ù1^÷޹ìg^zÍ‚æéÅ-Ò·3w–±ŒmRI£Ôfš“:<5¡$2×´Ëñ ¯†:–ãØ}Tå4úKËk=ù޾}$ 3Étæ¡Iú™~Cö¤Uøî©RAüÙ³|Tþb€¢F}È4òÌÈ•S®®žÏÎQYÀºô}ÆÓì™>™ÕeéÅ‹›¥/o–îêP½ÌjÙ6…4 e4úìt­x•iO#ÏŽÒZª°ê…ì|Ëì=8¡ËÝ·»wÀÂ׬ˆ¯ò·U"Õˆ‹3 Q ÐèŒxQ‘iä¹Ñ+§^MöÔ4ZÂÎoa®T\·AzvÌäûÉ–±Še¬‘v¨^Æ´†F­Ñç µb–é³R2ô½jÚÕÕ‹Yõ"-­ÙÈb{YþÌ_ËÏŽQ6}óºN›XÆz–±–e”{Ôè’KÒ Q Ѩ³L ŸÖÉTsèô«k–°ÒèbV³Is(•Üáݼ­ƒäE¦÷ýâ…rm¥Üv›YÆ6–±SÛ̓F·\”X£=g60©„L#¹cV^Só)ÓÊv~s­C©txã5•z%dJo$Ú®BÛ­]kWÿyGü—’JÞª-4 ÀU.Õ‹œL#Ï]5óšše¬f©¦Q³C©DrG+¬Ûà:;æ¾_¼h¨pËØÊÚm‡¥†O-J•Ÿ@ p¡²_lw‡Ø ñ®O,wV½IyŸÖÊ´Ö§Y}¯l^ÛšåLÓè2-§ÈìP*òSMå‡Mïûe½C+XÆÆxÙÄ26ÇËN©ºO…J-cÐ(ÏìÌŠme±òÌØÑüXu¥U£zqiܧÙoýåȧmj>cZY.phņ¶ÞÖA’é}¿|É`9Ëø2^ÖųŒ¨l0)u‹(Jå{}-ýºÐ(wN•FkÖ°óXl[$¶/'v¼68eÏÏÒŠ›L£Ã>ÿ9£R³‚ÕÐå,¶ÇªÑ’e7¨¬Ðk/Óèõ™ÉÕñRŸê²&ž¬k(uƒU© |jVêò†ýºÐ()öçœß¨’çW²óëØùM,¶%Û›“ýÞ«‘>“dÚáõ7V_£½ê M£çWkk,Äv 4ZYÖF~Ý×½cúþÇÝf‡~~QÆç,ã‹xYŸ7j(umÃ(uCÃŽ_‹R·4ì×…FHQUÛÆjJµpR³!i‘‚Óõ,¶‘Å6°ÒÅ×þ,:⑜A/txóM*¹yxwLvùâ¶š7WÅÿžÊ—ñ8t'‹í›4òÂX~vŒW™^ÑeÔìÿ{£áÐñ‹–^¬ýwùEŸ]”±¢N©ºOy¥®k¨T£×WWêTS¿nÊi´²²R_U_'Ö ''‡~©ïLíõ˜úé æm¬égú ý¾  Àë}®ÂêiÅÚ¨’§ÚX׼ƻ~f²³³é8;“òëâ*Tw¢«FÇuUƒŠŠ ?K»œ.`:±–ÍW¸ymaþ «ÁïzcÁ|£Ñõ`\Õj [®1×Ïãz]%è[uñÐõFMªŸR½®õ«Ú¨háéå—€öt ð§Nåꥀts¼WV7éq3–²ókãñéúxYwå—ñ_®‰ÿëêx)†’C+XlGI÷XMš“—ë²tƒ›Lpoÿu-®3úåÅ ›§/j–¾¸Yú’féŸ>µQªîÓRÇ^ßEÍÓRQ£t ð{PÚ!³Å³~ ÛmÝeÙÉÚÓ(>÷ñ´ŠÚ¾¢®í¹äî0_Íò-\ßT¹j¨aW®»}H´®¶áŽëaùÓ%Äüv’/ñtL¯WÝ’j›ïèð{-¹Þ/aøÖ —´q[9l^/¼2ÍMùÑÑ$fèÝ-¯¥ûK9 %?j]»†FWÕYrMÜžë–õÚpª6«e‹mg±²†&åÒʲ6‘Ç*/w߯ú˜k?o–>ï’ôù—¤/hž^Ò<]óisͧV¥>)U÷©Y©kYzji”.™Õ“¹èâôt=ëW¬ŒS]£Â–-™MfÕxzîJ„F© ”8$Ìsx„BŸD-25w2H6難QR˜§Z¶ììüõ%›þÁXýùç@•Ö€Ô0éÚ:“®×zzµþ^m•iY¾[ã&-ãRΤ¥«¯Éúû{^W轢똾߻Ç<±¥ä’ô9-Ò‹Z¤Ïm‘^|‰æS«R Ÿ •ê8:îÒ”Ñ(]E מÃB÷»üFœÂ­9][ŒÔÕ¨×3ã`zu _5Ê%Ë„´Áj”¾¯Ð#’*¡È‡Eñ‘ði!Õ5êé¹ÔõS H EuN•PPY³:>iÅlR# åMº¹Î¤Â€t—8&}uØC‘^ã$eúƒûÌþÖæÝXfµL+l•>³eú¬–ÚÞܳ[X•jøÔªÔ‹ÓuŸ:¤Õ­¯r*ûήqSh¸„YMR£÷»¾?©eŒÒY"^5HÕ¸šÔOµ®Q##e–~˜Ð ÅÓîí®OÈõ˜ZõóÄnwñgÀµ/%ÈPTgw–.ohÒUœIÍ©³Iw IÏ—k>ò²_ÿ³³L»ÝÜÓ<úE³ô‚KÓ¦¶J›/Ó[¥Íh•Vز^©ºO…J]hUªí@ê’‹ÓïQ‡+ÐÈ0)‰£Óßí°]dawêcư¾~L‡ÈÈÒÓÒ)‘@h1¾+•~#ÌC ßÐɧ“à)jPsŠ×ªq>ÛjO_‰Ð(} a¦p#u:Ïú·–L¶výI&Û8ËQ?ÿv•åél8ŒÔÐ…§bÄ*=]Gá[+ßG’-_Ï#2î ý€t©Óme~ž&y -ù[ÛW(ªs´Ÿ®Š›t…ã ©I V8eíj2]¯-X½ˆÍŸtCß¡wuy;·Ãÿþ3³÷P]¦W<1~B»¤Î¥—ß@? ½ú¶î7=ÙùgOtnÿÄM·G¯¿û­_ÿ¦ÏƒíŸx°}·?ÿGÇaßþæS‘R5ŸŠ”ªûT8:¯å5O^ç;¾üÖÄát¨]däšê£ç— ÿ‰®[á ëíFïe"9¤5ê5"p89tfäSX}jT˜ÐÍîÐRÑgó_5^{ºÔ(ÿáÉ’þs_íjSþµ’W”ð1@¦_ݨ>çºPKÃV® î#×X›jYfø€þF\‘¼x¢Kþ´ø EõD£²¸à–s]»«$ºv·ÊvíÖËt«Yɪ—ÔnKªmð=ŸšÝæégžn÷;ò³cÚ>2ô‰?T¢¶J›)TjO…©Úýâö_¾h¬x-XB‡ ##Ÿµ/¼méj”i¸„O•7Z*jÔÓ¬F±j¼³Ai”«R[l\ ßE>̱T™Êô±‡V£ô àõ‰ÝgW†Ý™OH(ZׯKÔ4êÚµ»NºkW4ÿÅêÓrV³^›»úɸŸFzI$ôŠdzõýýG_qõÔVµ¿uJuH÷~ð£ÛÿaÙ;&:5Œ¶·êt9É7\ÂÀÇ.êIEúLæ÷£ÑF¬¯¹FAi”?Ž‚5]£Â!Éw±´íÂùM^Ÿ+B¢QúØüwñÙ·#Ó%.ttBBQ¯s5®Š¯0¿Ü~þËZÇ®]³IÝRsöQöûqÙÕÔmvLû»ÞÒ‡PõbøÔn •|:$í'maÝ>¦ë„èÔõ)Š:Eª…¢ž@a‹a÷© Qyú¯á$«F8Æç`´ 4ÊY(ÏåoD*_6|°F§ÑLH4*< d~±s@*üÌ–¶4ÈN“¤?­_w©M×®Ìü]»T JÚG^/Ü;Æ«LgëÆÕ&“òJ5¤LÿI›.#„›†P£üåá¿êù;T~Çá vÝ#MC£>×ç‘ÔhãV µçÂá»F/q•_¢ hÔR_zBïV¯ç$$åãDŸQ€üY¾/ß–ù´v¶”Üw~k|ßíe"“òó_üuíjAè€WÜ76•–i·Ÿ?·‹µ+n‘Æ›´¶ÔõúŽ»üê¶åÙmÄBòI˜ íªó#™ZëÇ7¡v®iõyÚ%5ÊWBß—p(J¦jôÕÕ„¹FÂ'·Äuêª%Õ4®Fé)Œò¯2®4þbðô,ò—b°£ÞžR‹gƒÿ$šþ4.•èÚU˜ÿbB¶ô™èº›'™^õÈ0}©@[Ö•ë;½î°[tZè4ÊßJ>›¾ÓOy]ò³5#ɵ&üh4¡U#lBù¿±ËgÖZâRŒôV.¨q«ÆJ1’yôâãò½ žî0h”OÐõx HĆ¢†F+´-Ϙ4襴 tà_e6bÈôY™.½ü†øþ¡Níöãù½cìÅ6mC¨*ç ü™Mù–\‰+5j7ÃHŸÉ˜ òošäªÑ›Y»ï·BNx±›zI¿÷?Ž–Ò­ªÖÉcén2?8ñ¡œ§Çª0h” °“ÁSãfù$ ŠwÄ5º‚Õ,ñÒµëei£’å?Œüi2{~v]1íŦ&Ó†>íû½{I£ ìûuó¾ý_­í¼±iØ4Ê7SþÇŒø›Kù©LòPÂÅ"ä±@ ûuÍ—½p†hT¸î±L²1†[Æ ùŠïäP£2÷‘Lw‡B¾±Ï€T×%uŠÖTj²ÛaÒèR‘IU»v+·µÉÕõšS_„2µøÔ£L»ÝÜÓXõHÜ›ý¦Ë®¦OM›FùÁÿeÊ%ôêkÚÏlÉeýä!‡EÍ>N߈hÔO4Ú”:u--žÌæžvâHr4*Ó©ki er4­Þa½w…·K‚FéÓÒéòÔ>ó¡·ðå|-H.ñtÁjÔ9±!!¡è±¨–F»[[êV[ÞV7ébIå—6*]~]Ö›°ÞÅuM’L'|çWüìÑÑ‘«[?1Îu…^]¦á×h"ÆF•§¨å±P{^âËÓxà;¼È7}ô—Ô¦9ÇJv‘‚šF•ÓÕª†ÿáÄs$tuýéÅ¡I”Œ,ªQɽYy,’…³Ô¾µ²Feî#™Dn… IµýîíÒD…¢û"ú ÕËØ¹ùu&•éÚµ™ÿ’?£cä•i¬Ï<Ö{žfR™ÖûÔ›Lû~ÿ÷¤ÑÏš7È2êü³'å—»Îhúå»(•ÏøÇé&3áŵãÑ.V²K¢PÓh€U#ì0T(,~O¨F§zÒ³{z‘éŸ 6S—´Ü8ÀùÄ:<Íò÷¬Ì£o£Ox^<ÉѨ§éÏ~9’S»JüVv®˜›g H±šÅç¿l`¹÷`}æ›Ê¼¸O}ÊTvvL¯›º[’uµPô©ñ6³M2ÎØ* {ÕW³ò2à|{"“ôÞ4jôi oUá˜Ú„åy£V]®QÒ4j4ŒÂO"“r¬F)ìâëÝkM tèâVë]£üMÌûª\jÙìu|(z¦ÄXYèܧìÜ\M£õ©Í ©]×î‘Umròú4t¨H¦½’©(¡·Û/Ÿ·$ëvþù“Rë …U£ÂÇ9Ÿ;#ðjVËBÞ#«´©jÔ®‚„qŸÚò a¨ç}ú’¦Q§»ö©>oT¸»¨°Þíà×Hï`°k]á['ùþÊñt–üh”¿ ²–ï,Ý¡5ëYÕv®ˆ3é"éù/kYÖy6u•©áS¿2mï»^ùx¾§½c¦Qa{˜ˆí]Ô,ÿ„Ü„5*ßI.ÓõÔ$¿Ò»dÕ{EtÅ'Y£Â;ÂõM±ü‚Pè’•%\ôØJO5Êß^Ÿ •5ê¿åqçx´¶;w«*bU³µÿjwížóص›3¤›Cåeª>;Fר1çå¹Þãuï˜ha¸4-c"?qLþQ¡óÿ`vÏ™M[£’É<ÊKÓ‡¤j„‘Ãz°‰C!Ÿ9n£)¹ê‚ä*g\} ÃvO9áÕhU©Ñ[½‚UÍŒktŽÉ¤n]»æù/S¦ß,íPï2õ’Ð{Uבf^Ùu„×åîC¨Qá„tŸ×ƒZϘóê=Ê·ÂÖgÕ8 ÉW0Rd« ÿu´ °cÇ5Ó@P«áüÅàQá—õ4FRÖTÖwçnfgg°ªBV5«Ö¤^»v,kùË4ï5Ët^€2Õ5:³eÚk×Þ¢°Ü}´psØ4*¼U}Ž ›DùlCá˺š/´N]ac%Ù»ûä§ «Æá„{ª™™³Ò©«ðhˆFíž'‡ÿ„šÎã;!ÙoTxÙÈ·6!Õ¨‘»“ÃÎNgg ã©aR£kWbþKÎà>ª H¦ gÇè-n‘vSö?ŒÎ Fc6›_П½„Ód6£;‘Aœ/›°F…9ÂS!ß(W0s8ÀªqžÕžªå™'tizáíéð”kù{ù1áÞáר0±™I/™FžÌ7ºs«²³SÙÙi&“:wí.¶ví–—¤ùvhÀ³ctŽùÖõj{Ç„S£v©Þ†8ܰÔîÑ­Gà ×n> >ÏÚîhvKž: =E5êï Ÿ(ì†2å[»ü“0TݺFþ5J_ÁµQ¾»Ú Ê5*Ô„ÝÓ ¿–‚§±oO»‡D£—ÌÚ‰¡ÓhU©¶Ø‚>$º†™ÂÎÔiTïÚißµ+ZÚ¨ËÀ>j4€Ù1®ú5iôÉŸwW[î>œ¹­Iñ ÝŒæ'¨Q5_~òó›^Bw¨¾> Ýìš9܈•ÙàÉîóè·9=„è›@™w?¡¦[8ˆé° §ÖÀSÕ8ä«$¢j„¹FA­^H§ÏL§—Ž£?ÆÐùÔ¿¦äÞmÉרݓݖj~ªâ/  'y£4?#úæ‰ÆU­×8] ‹­15jÝÊÎLeg>‰ktªÉ¤^ºvËæ¥%À¡~gÇè½âé)jËÝGgn‰…™‘)OÍ)=:7‰2Èù˜OÿlÈl&» /lIo„RžèW?$º€žÀNOdg&ÅRä\×nU‘íÒF‡KÚDþ<-ñõ<;†4Ú±ÓëÊË݇\£úã¨Ì6Rž¦˜ÑÕ%³«¦ä8ݨQ™t¯`WØnܪqÈ5JŽFõùüwã/fý Z.fÿß1V—§¤vò-/”Éß¶;-^%ÿvYÁʵà}$Ó‚ñWµ^ézvŸr½ûlyj1¥ßÁN’@Gi&=3¯Cõn±Ö#/O[9û:M öó_VN¿®ñšØ½cRK£Ëál£;÷Ô'ìävviNͧG 2TÖ¿òΗÇjÓµÛsph4!{ÇDgC£âÍ5zf;³$§æ„{H«ë)úI—óÛmç¿dFÇ„F£ïÐ0­VT]Ö¡z_‰äët1E^™VYÞ¦z¥ kweÁu!sh{ÇDgoõ:FjîþÌØ)©MuVÒÒÌ7°GX5ÀÞ1Ñ9Ð(\Øè+þQ9Uxµá# HµH¶ÔÚµ›ùê˜pkÔ×r÷Ð(\ÐèÓ[gk?(a–Q~qÇú€4nÒ/&_— •ÃË€ —šJM § üÃì ýûj+6¬¨_Úè¯Cº¤šF½ÍމmÇu(U¥šIýaPŦ´óåõKýðïy©©QÙÙ1Ð(€5Ú¯ð^mÞmÕúƒÓÚ¤²C¥r Qj4ë_yZ¢ÑZ- öQÇ&¡Q'™F‹Êp J£µýº;µý_{§O#ø.w6{¦PûoRd V£µýº‹Xæ_iªË sÙSSØ£ãX— ìÉOX÷©¬Ç öÌ öü­aŸ-dÏÎdœ¦•§ üÌŽ‰Î…F©ÑìþF-[–æÍMgÝ>Ñòv K#“Ž×dš3‘=/]'±n“µòÄ'ìÉ)šmI£dUr¢Rp V£TH£ùÅ^FÉžÙ±ÛóØyì÷³®“µŽYe{ö˜®ù‘¼,©Ñ?Leݧi2¥×¾àÍãѹ師тÅ7çäKŒ’ÂîÎ~÷A­FïüÝ9”Ý5”uÆÉ«)O/$>½èúÓ — •ggjݶݧjý´ô¿Ý&Õ¹2þ*wÆMJ¯}zºVHâÏÍÒÖ)"«¾4LæŽí‘ùZÝÀ( Nw–$N`e÷ækºüívÛÍ¡BRÉÆîþˆÝ=\S-½„ …«÷QÁ:Ô4úB‘¬¯ŸŸ£ù‘¼iÑhÏYÚAȘT<öîB£רæ#’æã“âÒ¯I Yò7µrë ­tÌ~;X]£9؋Ŋ¿ôB 6)%Rêc¼FÆ.ç°§gh†}p´¯hô‘š©ýçôÒA|ä5A£’ªQKé:Y½S÷þìá1ZG±|¿.¯Ñîñ¡Õž³ Q©§Q*wh”,©M™¬iîÙ™Z±¤éÝÅ]ÆkóC;Ò~¦¸RÞ§$Ðg µ¡U#ň^þüŒH1æL¬Õ(Ù󑱚ڔ{Y)¨Ô’ˆ¦hI¹$V#S·>)·@bdÉÔ}n¦æÓ¥Ò Q¯QŠ=UVr,/k1,ù‘”êu‹¶êQaíbG¤æçgkbÕSyõ½]èàqÉB£Y£I(=gkŠTÓèsq“j¥N¦u…F\ÕKéê}¡HØÇ €F]4š; c£.h¾T¬9T¨Q’¦^¢Ñ^s¸p5ª§ïÖΠ)¬åÚ–~OÿJê|nfƒ±QúåKÅÐ(€ N£d@Rg¯"Å•_(ªÝ¨”JÃÉ8Ð(€ " ¤ôž§¤¦˜bM]Ð(4 …F\8”î=^°þ %ûãµYýV@£€J¶Éÿb)¦Ã«"¯.‚Fe*OU‘Xû-Ù•3a‰üPqøTÓè†F„Ò½Ç~àÌ7–B£€2F?pî´-aî†F¤‡O‘XÃÖ HQÂÐ h2˜û“3ÑÐT1ús&lHP?04 àÂÁXp)¨~`hÀ…Œ¾à’r?04 èmô~`™‰6Ð(à€yá}¾> stream xÚì½÷W[gº÷= ¨ ‰Þ{ï½ ¢÷¦Þ»@Ñ{5Œ1`p'ÇŽ“a;Ž=ñ8žÄg2ã9Ïx½9Y99ëœ÷Ìó¼¿Ú諒Bhcl_Ÿu--!¤½ï¶ïï}Ýõ7¿A…¢ËjÍŒ qurr˜/‹•›œ\œ“ÓÛÛk±X0¡AdGæææÄÕÕ‰!!nÎΛ•t‹¹¹ddô·µaŠ!‚ Ȧ§§³âã½éô-êé¶a[>ò÷oÑé0ÝAÄÁ•+W’#"n)¨§‡““§““—““÷†yºoÒV§ÍdÂÔCAàùóç©ÑÑ›•ÔÓÏÉ9ÀÉ9Й´aðÞßÉÙ—ø¯Ç†ªr8(©‚ ò›ß++IÏÔpBý u¦„;S")QI|B+|ÇkCRッï߿Ɉ ‚¼Ï,ÎÍù²Ù®„Ëé>)¡¤ 1j…šH¥%oXñI´3%‚PUðU½ Iu§P* 0%A÷™ü´4Ò3õ!ÜÒ0§PS¨´t*-“FϦÑsˆ×L*-JK¤P#ÿÔ}ÓܤPOÏ¥¥%LLAäýäóÏ?tuu#†D1÷”44ŸÎ(d0 FñšG£ÇS©¾NÎÛçú‚‹*«¯ÇôDAÞOªø|o:݃3 Ý$¦<”´”ɬd±ª˦ÓwPR‡¥FD<þ“Ay©/-%Ó bT4aCLÁ!­`±jÙì&6»†ÅJ¦Ò@L‰É½Î›'÷n¶ÄÐÐo¿ý“Ay?õ”pNÀ9q¦¤ݼ:£‚Él`³Ålv%“K ˜Fnšß@¨ªû/÷|H ?=>ŽIŠ ‚¼‡”ääx99:9GsÀ9ͧۻyëØl›]Â`ÄN+ø§©T¨m1Å7’PU?'gM’ëïoQ©0IA÷Ó?%;{£œ)ITZ1lZÉb5²Ùyt:(lÚÆÄ$>Q@·OI‚ÆËjs“à59$d´»“AyUWû893‘’ é,b0ªX¬\BL3¨4ÐÐ>©e±jX¬ &S@gäÒèà«ÂOà‡^äü^'§´ðð[·na’"‚ ï!ü¤$m‹žfÒèà~¦}¿åÄ@ªÄÅEîâ"sq±Ù ¬Å |sóBT'§Ü% Ay?¹¾²ÊálÖÓt-Ü™ïL÷à™‚˜*\\LN+—ÓÂåè8 ›]ÍbÒé„‹HŒ¢z;9«jê0=A÷“çÏŸ RRã§)T»¯ ^g…šG·wüJ1íær‡]¹ƒ®Üv.GãâÒÈf—0™Ù4z…âLñqrŠõðì21=A÷“LBg€†‚8»òF:SR(Ô:£†Å’»¸X¹Ó7דnÜ.×ÀáÙì2&Øx 5Ô¾=¾³ !7s@AÞsJÓÒÀÍ !FBý‰µ3Éj>QÍbÉ\\š¹œWî´+w•ÛÅåê9œ&6»tÃ?=MððµX0A÷œ/>þ83(ˆ\ü¯áÄ®ƒ<½œÉWTËá´qí]¾\®…ÃQ¸¸Ô³XöiKTZ …Ãbkqç^A!°ÈdÉ^>äv‚à«Æ:S2‰’jX,1›­vq·TÇáȉÁSÐÙ||ØX:£>7{zAÄA‹XœDœÚALOr,Gm`³…Ä^¾u,ˆi‘J¡¦r]Eùù(¦‚ ²…¥™™ªÔÔx¶K$±/¹‚†Og3˜eLf)þ™C6•–H¥EDtét(¦‚ ²#«««KÓÓUI)<ÿ€8 5ѾˆÆ¾ë`:•òšÂb×$%Ùd²µµ5L+Ay)à{þñömmyy ›“@g6¤§_9}úù?bÊ ‚ ‚ ‚ ‚ ‚ ‚ ²ÿøÇ?®ž;×¢×[Tªå……ÿüÇ?0MŽ3OŸ>ýôãÇûûUÉøððƒ»wŸ={†É‚ ò¦ø÷‡Ë Ò¢£½èto&^oR£¢Êóò¾üòË·:‚ûÛß´ææì‚’l~iPöɧŸ¾ÕÑyþü¹I£á§§û²ÙÞ ˜'äñ&Äã =ýôÔ–jA£duuµ®¤ÄÃq%NÓÞÍ9œ àÒÜÜ[§; ++U ’¸´œ¨¤ŒÍVPZi´¶­¯¯¿]1‚[´ÚØ  ½óËBɈµY­ÜŽAäõkÕhL Ù\»AULœ©íA¼q'>qüªñî¶¶·HzÔææ”ìü-Jê°˜”¬²Ú¦+W®¼-1:}úti~>¸¢?ëæFf9²ls~ùs8õ¥¥Sè«"‚¼N$55¾¾…ÚØËÉɇØFÞoÃÈ]p=‰Ššüf¤¯¯Z$z+Z £%.5g71uXIMãÂÂÂñÑå™™üôôÍùåMdP€“s aD–ù89{nRU£ŒÇ[]]Å ò:éíöós8¤ š~Än·ÁΔgJè†Á{ò Ñ͵t´¿ÿÈÈÈ1ààØtzžà¥b œ©4XŽù~ƒ<~V–…Bf™q]°“s(±Aq$að&ŒÈÁ¢ähy1²ÆF,ó‚ ‡ÎÜÜ\FL Y3{ÚR§@B=¡BŽ"v»% ÞD5YKûoª¥3ââŽóÈ#¨OE½x?bJZf~ÉÅ‹s–‰kjžqœ>µ”™—–[–šÃ‡÷™ùÅJ½¹{ptbæÔ‰¹…‘©“mÝRµ_V›’e×SÙ1ÕÓšÒÒ@77²s>ÐÉ9ŠèæÍ¡ÑALk˜,Q%‡£åp4..eLf(…â¾û¢Ô`gã#€ r(åä¸Îi1f •s•b )()ø8b6»œÉŠ¢Pý6Ö_xm[ØHêi~JÊñŒãØÔÉâªúò:aE½^u•Ät~qå·~tóãõËk¿š[°vöÖ‹ ¸öU3Õ Ç3.V£Ñ1rìäëLI‡ü¢3* 1U»¸´p8Fèüó'mùäæöû>ÂGAäPÈKM} œÓøa¸b&³še¯Ÿe.. ­Ä#6-Áðߘ‰´YOKŽ«º´tÙhíiMr¹I¦.«mÒ7·ƒg búðá×ùË_ïÞûòÜÅ+}#21§°4:)Co=¦ûT´›Ídg¯/ÑÙ Y–E£1˜µ,{f™95›•H¥:ò+œXå`o9mñU]]ûÞží8AŽ9)‘‘à¿#§‰ÄÑB:£bÃ3Í¡Ñcœ) „ßšB¬Â€ïK0¹ªô´ 9ùxÆñùóç£'f[»û­]}¹Eö H¦VÛôÜx¦ ¦ÿxòäáÃ?‹:8~B¡3óŠÊ3ò‹®^½z<ãb˃§aÄL¤l¢³·žÅVº¸Ô3™ñ{§}‘_)Ä í8r~¯3eó’0_«¬ ACŸšêCÌD²wöRi9vg‡QÃbÕ³X©T¸?ijŽ}º ½€NϧÛWa€ ª Ut!©n;ÝgdÛh~rëÖäì<Èelj¶ ¢Vkn: zïÞ—à¢~vëó¥Õ ݃£•>3¿X¦2Ûý:››·è)ø§Å f‹Å§3@:Sˆ{‘_Ĭì,b¡S ±Äió’™ÔAC¡,7—Þ@gçHÂëç\Q)1k´Ç•;äÊíw傪Úç½°ÙdýCì.jFXØÜ[rê³gÏÀQýü‹?¬\¼ûìmɲ*€ìòõ%–Ìl ¤’íh퀆ڸÜAW»up¹:§‰Í¿ÕÞX¢PC‰._/:ݤVcùG9D$ååä¶u±ª/áõD½…„³êÙÆåŒºrϸ¹N¹r»ˆúœÖ¢Ë—ôw‚(ye%¦äÑ0ØÙêááºq¦¨j8ÑÊ£Ó+™L‰‹K3—3àÊ=åæ:çæ M h‰Ùì ¦}5‘BñõrrN ?ægè ‚¼u¬­­åFF…«JÝ ="¶°ã3µ,–ÂÅ|ÒaWîI7×qW.8>Z§Í.f02 =…æGÇ\ÆóJކ²2ÍmÃK%ûçyt:ˆ¦˜èœvs=áæÚçÊ5]ôåLf.¡§_ÞtúPg'&#‚ È¡3=8˜àåíµ±#‚Kͧѫ ~f³ Dÿa—ÛÉåZ81WH·/œ±¯²ñðkoÇ4©‘ÃÑq8r¨œÙì²ÎÃTÏn­SïèY_[ËŒ‹#'&ÓɈéÕ,–ˆØxZA`*øÚEtz•@£ffZ,L@A×GÁâíL ‰F.*¹µ†Å¯ªexy-g2óéŒ$*-ÓÇoÈdÚÁ{zþ|yù"¿¼Ze0ç—TØú†ã¾ë䫯¾*«®Ï”VÖÎ//ÿý÷Û¿sóæÍ¬øx/Í—èR°ï•D¥ Œ*ÖϧÌ4bZHg@)ˆÅª†††0yA^7[UZZ‡µqXî‹S5™ £äfTZ—[“–Ö¹m‚((©µ«WPQ—‘_MÒ ¯©¹…9‚2±ùê­[Ç'¦ÔÿûãÿßO?={öìXeAgßPE0‹_’ž Ÿž›™_ (Óš~úé§­^êúzuII„···³s¨³s"Ñ«yTBäX!ƒí¢@*5!4T+á$A£š^­¶*%UG¥×“J¡‚°Ú7ƒaŠªKKëÕhÖ·-ÕüöÛo«¥ñ›NåÞl1)Y%U‹‹çß¼ë÷Á=ùYúP_¹'GáÅ‘¸1ûùÙ *éØ;w„JmRVÞn XTQÛ50°=¿ºººª‚Ô¨¨6ÛÇÉ9”B‰ PàÕÏÙ9Î×/%2Ò¤ÑLá$A7¤ª£ËÜðð¹'†¬ÖѶ¶ ssó½½§{zvôqàÃ’êzÒ'ÝÃråŸ|þùŒ×¢F¡ðºP„lçÍ&ugõäe@“àMìÑ£Gµñ¥ ˜Í/éèÙñ ×®]³(•K§Ouuµ 3ããsssÚ††û÷ïcyFy[ÄW©7¿T Hã—׬¿¡mˆædM7†]@]("0Õn ­òjKOxxãÆ ›\cŒÞGê *ëîÞ½‹¥AäÝcae%);?jr“œihn=ú@^éë°{¦lg1—&ucÈ<˜rO¼‘¸ÑAXá_ð:RQtôƒŒ Y%ûMÀ”,…Ö„¥AäÝC¬ÒíæœÂçqi9±©Ù¿tQk^³úù¹v1u¥€*|\T~\µ¿+¼OÄ„ž‚Bý×z{8lFkÛº=móJ*=z„AäCPV»£$eå•T7V5JŠ*ëÒy…àX‘Ÿ'gçõÕ‘ŽT>yòDâ+æRA:•¾M€›.ÄKæ­ ö{³%®4gcDÕ…r±»ãˆ°F$ß1ãR³³ KóK*³ø%‰™<‡°¦ò ¥Z\CŠ òNž&¹²c‹ è›ÛZ»úZl=“µN$Ïæ—ÆŠ’]07·p”¼½|J q§ƒgª tÓ‡û˜cáUåïªôã‡2/¨-)©'eGœ†RÕöLç ¥j•Á&QéËë„y‡¤êZpO*AwMO¡æOÌà%eæÅ½»eµM¶¾¡©¹…ÓK+³§—ÇN­¶¡,%§€ðO G§Ž2ç¬F]¨¯Ì“©òãêC½, ¦aÞš wx5„û‚¯ªp“{±D\»—:Z^|ÄiXÕ ŽOÏ%'±)Y¹‚2­ÙÚ502<9otÍmÕ’´\>©§ý¸-‚ È»¦§¥Õ E•u%Õ `…å5UâöžÙ…¥¯ß¼uûÎ'¿ûtùÜÅþÑI¥ÞRPZEìðÀÿâ‹/Ž2_\ºdŒ ”{³5n†pm°‡&ÐÝå×–Ñ‘eM 1„ù€ÔJ=BçKÝmGœ††æAE-™€ðLml›:söÜÚÕÁ–ÏÁŸjcsQE-4W@p55XöAÞ1F'EJD¥«ôU™Öêyáò÷ï?øî»ïþíßþ|ã£O¦fO­¥5 )ÙG<éùóG¦È ROÉ^]¨—5)´Ÿ2\žÓ•›`‰ ÔyȼX îù#ßÞÖÔj*´€`õ¢Z¡ÌÚÙ;wæìÇŸüþáïÁàÍìÂ2|>>ø°l1— zªõnM ë¤Våuç&4“zêÉlK{räËc×oÝ2wtC* ÍYü’‰²£wpiåÂ;w¿#øüÎÝÅ•óí=ƒõ%´F Y‚;"‚¼{@Ý>{f©od"»°4#¯H¨ÐØú†æ—VÀ«ºwïËÏn}~îâ•¡‰iµ±¥°¼&'˜Ÿ_>ú@>¼q£5)ZLLåµ;ªA昀Žô¨Î¬Ø¶”pc„¯ÊßUì½hzÇ嬮®BrS/¨¨KÎʯÉ[»úæW~·þÙ7ß<ûÝï>=u欵³üÓ ž ½»K‚ È;ɃßLž<•ÁKHÏ'Tkn활;söìùKgΞ;1ÛÜÑÓ U˜jM-o*ë'N4'„ƒžJÜéJ_Ž6ØÃágŠò7„û+hN4V¿)¿ïx8={:-·0.-§¸ªZ Ë«¯}øØÒêøSk¶BƒD¬Ò½© ¦A#à›o¾91;ŸUP¢YÝ$Õ˜ZÚºû»FÀW5Zíー⠙Æôf;*/ŽŒŒWk=ežÄ®þ®ê7¥¿kWNòªÅð÷þê›o¦OžÊ,(ÎÈÔ‰ä¦V¸üã3s`ðþ,®ªÉ5+++XØAÞmþþ÷ÿç£×[:ºËjšÀK‡T¤Ð‚’–× ‹+ë{GŽÃ¨„áË/ÌHê­ á]¹)m)1ŸŸ;·~<ŽØ~òäÉúúgÖŽîòÚ&T…ά³´ê,mB¹¶´¦ÑØf³à°)‚ Èû¨ÕŸÿö·›Ÿ¬_XûíðätÿÈD{wÿÐÄJzm Ôí·ÃW‡.õØ.èõïØdˆÎÕqÛ’Euu¨⸠WÝ_]Ýãûýë_?ýìÎÊ…µ®þ‘ŽžîÁÑöî¾GOŸbéBAvšS ‰1*XêÎr¦ õëHK¸ÒÑñnÄñþÍÕ’CD hc‹`‘ ÕÚÏϾ95…eAù•,‚ ÈAùᇠáWº‚S]¨—)Êßk?óü8ÐPÇÑi`S ‡¼ñ;èè¹9Ý@Kf‡:ºU:Üš3Õ[zãFÏáÞåÃÉ•¿»ÔÓWˆš):Àho0x07ë)Ø.œÅR ‚”Ÿ]kIŒG{ƒ¿fŽhI 5„û¨Ý5Aîê7…ýŒo:©5Ú ¯Ã½ûÌ@¥Yäghp76x€ÁC½GŸ9ý³k‡95È*ug’'Äéˆâšãƒí8D0ÐMéÇ‘¹3’úÙ™3X*AƒòðÆ kb¤Ì“¥ pµÄi‰ŽPsL@K|°)ÚDGîÍ&½TkBÄ!Þúò‹Yègnôl•x·Ë|À¬boS#¨ªÇXÇažz£ö÷æ žÆ_pN!ŽÆH_ˆ ÝõIµ¡zzûÜ2– Aä <}úÔî/÷b+ªóÞ€—Ú™ÛÇO±eD#ý”þ\Rnæ’C¼õpÏÜäÙ!óéQûhƒú5mRoc£»¾Þ½E|måÐz}/õj‚<ÁÑÖºëB¼Tþ®úpï¶Ôˆ`7/¡9>Ú äH±ˆK»½| K‚ ò •ÚýSWx•y0A\šã‚û ’'jù 7 ­àºJí»Ös'ê*ë¦à~Z„>mRŸ>MÀ¨)lÔÑ¥ô‡?-B/ÐS}½Çh'ÿÐîõý÷¦¨`ðOíqô`‚7 Ω-3f¼¦`°8£5)üqhQ€žZ“¢® á*TAäUX¶hµ!ÞrO–Ð…"ug¨\MQþéQÝ9ñí©†p¥ŸÝ?íÈHzöøñ!ê©Yèm“ûéƒGLàŸŽC‡!Ý*?‹Ð$u¢·ôã8'iTx»H\éb.8qÕ«5)¬+'¾3+†8¾üS&ük¼²Ë‚ òÊœ”5(¼9öý÷¸Tâ@Rwc„¯9Ú~zš:ÀMæÅÒ{Ÿ×òi¤ƒæäN…_¯: Ké7n‰œïÉëÊUµ{©bÿe‡x/ïöôx‡"t±/ü±wù†yAÁQÕ{€ÂBC¢;'_CA~%“Uª7‘ EâJ³ïxàÇÑWxoŽ ¾l³úFÚd>à‚žN4G-Î÷òFMaíRŸn]ì³g‡¼çüO?ýÔ‘ž ó`Š9T1Ÿ™Œ ˆ©Â›ÝÃK¿†›#!‚ ‡ÁÙSWv²1"PéçF ¤z"F+·—–^ÇíÀgëÈ14¸ƒC:¨ šhŽ/µOЭ¸r¶ýuÜñÑ£GsJ¡%.Tê'÷²ïŒd÷7Ç×}ÿÖný„ ‚C@ã>?¾+7ÙÔ_”ýøÁƒ×z»û÷Ç;xݺÈ™O·Ò¯G8jMûäÒëôôéÓ‹Ö֤Ȗ¸°%£ú¾† ‚¼iñýû_o}±¾üO¾y勬®®^]´\¿ØõÉ•³SâG^qó‡‡çF[² ž=†¤‘vÞ£G÷0Ac®¤ggTÚ8“ÐÇ,ô55ùô™S?X¶½¹ðü¿]º}ƒ}b°Á¾ÜÆn6uôÚÙÌ,AäØŠéL_¥Ièklð05y˜›<áÕÐànú­Îéq_£ý‡g°9ÓÐ`‰UìÝ*ñ†WxÂÚ®Šºóñ f‚ r ùÃí«,«MêÓ©ðëRúÙ¾-b/T«,äÆJÏ‡çÆ•aS£w³È˦ðëSôk»•~Í"OÒQî/Ã,CAŽ!c6¾©Ñ£]æ â5¬Ò‡tÈ|Œd/ëâ”ìˆÃ3МaiòMÐŽ™Ã´A ô ÷dxÚ•˜e‚ È1d²§¼Ñµÿ¨1tÌþ ¸¨­bocƒ]R[2Ž8<Óýåž^)lØ6¤ÔCÈ}–Œ ž˜e‚ È1dª§¸Uêݯ 6„ŽC'[bÆ- ª-"ûֻཱུ¿ÜƳJìûƒ²ƒ¤Îv¦Ÿ´¥CÚ¤Þž‘vf‚ r ïàƒžv+ý{Tþ“-ÑKCÅó=¹ä>†÷…)ɇç/oØ”Áí2ŸN…ïDsÔÒ`ÑBÁ˜9¼Cæcjò>3)Ä,CAŽ!ßüáz—&¾O ÂwÜyª'üÁaCp«ÄÛ¦ŽZ¿:wôAºpJczµK}†õÁSÖ¸Ikì .Â3МþèÑ#Ì2Aäx²8%´J­bï>MÀˆ1T¬[ágS…^;÷ÆÖ{.ÏÈ;Õ¡rÿ^µÚ¿W<Ù™ÿì§Ÿ0³AcËóçÏ׿MCÍ©½ú¨c4ØXkæÚÙ–7¤o¿úp¶¿dyªi¶¿èã‹Ã˜M‚ ÈÛ¢ªyøé' ÃëÑo〠‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ï<ÏŸ?ÿôÓOÇûû»[[¯]¸ðã?âDýóäÉ““ã'óRòAk³h,¯é^Vs[g[ÜSþµráÂ…VKG{³muuSã¥Ho×`‹©ujl Sy?yúô©¤¶¶J õôŒ Šö÷ôõ óôÌOMm(+{üø1¦Ò@MkP7çeòùÙ‚¤èÔ„ÈdÒšjÅ÷ïßwÔ© pý䘴…S ïsÊ///7VˆWN¿ÆSí¬f$ubTÊøjÄKøüóÏó3ù\Â:1¦ÆK¹wïÏr‘¼×Ö‹nËŽm³'N ë¤kkkoQú˜äò„ÐP?6ÛÕÉiGó¤ÓC½¼ÄUU˜é»‰iCµ¤Í!£“4È^“ž5f¸>hwGs×{›òƒ%/³ ->êðVCëkº‹J¢&ssbõô%\¼x•ÔÓÆÜ'ó%|ÿý÷e… YY)¹"l~l£µ¹5;•—–ÉÏ.?þþá‡ò32¼ŒÍêéæääN˜aŽÏ=¨ÔŒ¸¸CC˜ÑÛò½=1:êÜô|µL;39£–ª% ’òÂ:›ÍöšnŠz äeóM³¦õõô-âŸÿ™‘˜M­ô„,ôV¶ÀKÏw<Ý '{/ܽ›7Ó¢£Ýœêéääåääíäì³að>ôØVør´¿oÇÁ6åƒrÜ»ZZ ^y/jõÎö#»/ê)più’°V\È+ÕIúmý¨§¨§oSïŠÅ¢–jKò˪JëlÖnL-,Ì.ÔV4å—Êšã¶cíŸ^[X1%OwBF}œœ)AΔ`gJȆÁû@gŠ!¬U ê¶¼|šÍéÓ7¦gO *jkš¤ubEYm¿¬flræÎ;ïR¦?~ü¸LPH^fÁØðäòée‡-Î/ŽŽŽ’_»páB›¥£¯gð sZæçç»m½“£3"Íáuf|.®’iÉA½¶æŽÍ7›œut2ÏÏÌÔ–•Ń /ÚG.Æg;Û:¯\¹²[¬;:Fйs‹‹+§Ož^\\ÜòõõõKs—øüª¡ž¡ÅS‹[ vvá,ü\T-Z_„/¿¦ÖÎíÛ·ëëë! ÛÃvY»ªøU×®]ÛÒäƒ?ûmãð¹XIêi­oËÏONœ„n¿£¢^ÑÕ5pjú$ΖŸÀ'ð¹E 9iÙ{Z\jºoZ,ÖLM/,œ…äjooßþHä²¼²É‘Éí‰ %pvv¡ÃÒ¡Óé>|øÒäzòäÉHLjF¢xÁ·'Übpp¼ªJ ùµ%¹††ì¹<==››fw+ªJk¶g÷èè+6åÙž^Z ˜³»l s ¾^ñðÆÃ=šîdÛ^Z#…òÕõY³qÈÄ—º\d¨NŒžØ*¸<†P´àRÛ‹Öþ!o¡*à©ßž#K§— lÀå䥷Øx½í½ÍÝJf«¡u?%Š*­T;99»ýRö'k~ɨ2ÂwîÜyº÷¥ eÙ ùÜ\jjjjŸÉõ|rófMt°gp·Ü„ÈÂø¾þè¥×a"s’zq~eËs433oŽDºíþ,áñ<¨TWÂ'õ!”Ô3Ü™éL‰r¦ÄM¼p¦„n¨ª×†¤æ§¦îQÂõÛ{‹*ꢓ3£’26|RTY729³Ï»suV*œ×(†J 4ŠÓZÙg'O+W |… zûÈ)iõUM¤€Ê…JrúÐ@Ï|ØgÏžç•Á3’²”JødzüTzbÖn·#-)&U%×’?ÏIåÁ'¼Œ‚%ÚÝ»wÉ»l÷2à94¨ %e‚¼RPsÇM+Kªß¹qãa›©­¤ ¼¼¨*-!sïÐBš”ñ+Ê +»Úû^!g{{{•Be[[ÛöBØßÝ_YTUQTÂÛ; YÉ9ÅÕDºaøÓŸþ”™œ³÷!ÔrãŽ-=Õeõ•ÅÕ¹›ºªv³ÂÜ¢²Âr³¶yutkkmm­ÝÒY ɯØ<½­¦¼ÞÑR:}út»µ³(¯´BP™Ÿ±÷½ò3 !Tu• cc;&òØØ˜Rª†;ý2[wK®rAUSµèÄðiGÜEÒ—F‚qÐ,îïïWˆTe‚JH®—,'-2Ü™™‘™íåÁÖÚSƯ„Œ~i¶æ¤åÙKNqÍ@÷ÀŽ׫ŒÅðäï*ReqMYaEwG÷ö:..mR©¥êíUôÔàTö[ð^r ò âg ZÍíÛ›µd˶·s¨º¬Ê@NZþËŠ´½dÂÞjîX›ZÛ྾‘Æ*!Tz™…ûÉqÈ¥T30°µÞƒŠ±»µ»8¿Ì^€ã~.À¥ürH^ò;mú6Q½lddd{{¾»£¿ ?äæFŸùncyQ5Ñ `Û17ûÛúµ2miAùKËX^F¤aEQMOkÏãk/š.ÀÕÕSPIðIÃõŒ£P)Ôd*-eÃ’(Ôx 5†PU\ÿ Iõ¢ÓµâÐ!ïTú–ÄŒ¼-JºÙRy…2qï' Z3’zsl˜Ø•.d;“&âÒ ‘AcÕ%÷×ÖÞ =uÌïä–ŸÌÍ ‰þÓO?ç—“?è²Hhô¦ïC¡dMvñýŸÿùŸÔ¸t²Ú?P=võêõô»žBÛüùÒÒ•êÒÚ‹TÅ-¨«lLŽI}é³¶ÅàŽJ‰ú é•-üV[ôÓ¦³xàQ•‰/mxl7x®¥Mrr Òþð‡— 14]byG…D“qð;‚\‚J.,ü<<´:µZ[Þ˜›¾ýËðMÒͼ¾r½ª¤fÇ)p/©[Ró´ ÖÂ`ÐZøÙE½Ñ$(Å!«YI“üåµkÖÁôÔ¨¶äeò_!`Ð*˜˜ØüÊ„ŠÍ•ö~Ëdb–R¬ÜÒ§455[˜Sô E«¶¢áÖ­¯7_JX+IŽMËHÊÖ( ¿h%vöBZôð`”OOOÿB¶,«P¼Zɬ-¯_ÛTÓBÝnÑ·d½¬5²cÀJøåKÓKŽKÍÍÍÁƒ–¶S;Ꜿ¾>òvµe ðÛúʦͫ!H’F¤Û+Ô0FyK œš: M‘ƒ^*->³¾²ñæÍ›pµœ„WbTÄ4˜ÐÊXg Hg•–I¥eÓ蹄åÐèYTZ:• Žj1–꘡”µ£gª5·Å¥çî!¦¤¥dغû÷ðpgÅ Rw¦]F](`"â•TU‰+£3+åÎÊKú0¿ûîë>Kª®ÖÕ*yx÷ÊëÖS~N‘L¬lª;LX#´ltŒ–žBÕ‹šªÄ¢Z‰½ F§@k|óMÁÀE"ûX]OuffRNCµ°§£ß¢³Àk+»,/†q…u’–9¼˜žŽ¾S›¨Fº%¤UÆÎ¶žÒBðÂRÇ'÷âòÅ¥eQ5é1}ÿý÷??#ãSdå™—Y”Wb³vYí¢†Â¶èÛÀ--*(‡/“i1ZÉëˆëíß©«h$c¤S·ü¼±¢ñÆðM)R!Ýø¼âÎÖîNk§D¨Ø1Ö*±ª§£*+ÒQ‚Š ZÎŽ’JNoƒÊ¼¢¨²¯sðEà«ì?|N ª“­šì”Üò¢ªîÎ>ã¶°‘&)Ám1´ x/J`nZ^O{#­&æ@&”b-„M£Ðïx5†ÕÒ®S™sEÀý'ûOžíN‰/k”uµöBI(É/‡ê—ü‰L(ßGðÅ^TÑÉ›¯"^)ùØò2ø*©¦«µ ²~LjCNÁ#ÖX-rt‰ÀC·ùa×) d» â®.< P2!l;—L™=÷«Êjá'[æm–ŸgTöu÷‘=!&ù™üS»ÍÚ½[ÀB»¾JE”Œ äŽãRV£•|^àRPÉôØzÚ-í’z‰= êdøWN®”VÚÇJj¾úê+Ço!HdŒ %åݶ^x`w¬aà‚p£6ÈÍœb²&„🜚ÿ¹…puÝ‘›¼L>„°§³oÇÂÏ‘­½rŠ¢£a&—¨ÛÛÛC<<Üí¦N¤˜‚[šB()FçÓE F1að¦Î‘ v¶+é–E4îTêÙÙÙ-ÀÒ•+9‚Ò—Š)i¼âŠùùùÇ^5R‰TÌ¥IÜèRw†Ìƒ ¯WºˆC%Õ‘ Ár|zRfU„½tõîºÏyÈdOùÇ7^Ÿž–îCÔÓÍG:\=ýßÿýßT¢Z€uX»vþë_ÿJÞ1#)g¸obŸ7½sçNmyË6¯ô€zZµ]OË‹^ôÈEÊ-ã›{ŒÐi•Æ-¾ö>ç#Á-ªKjÉúG§4ìs±6$ ´4^´=Ró7ºÊo-ÈYµL·ãb+{»H.Ȉ6S›Å²¯=Cn_¾]²Q{w·ÿ<û¥Y×üÂù-«ßgZÙUxh‚ô¹Åmmý¯c>’†˜!`WÆzéµkw÷9\ÞÝÒlWá’ü2GÊT ªÈK5›­û,“ȲÖceq­ãs¹XE AanÑ>W=CyAw(Ñþçþ\P ½Ø¢§÷nßs¸ÿ^øpŸ?·t.=>‹ìÞüòö—ŽXÔEîkÖ5ï³dÂÕÌ:ë u.ªq|XY\ó"Gê$ûŸ3Ð;L¶ý½öKm<¡p©ÝBåÐS¸¯COíþ`ê‹VÖný·;<Ýk÷Åõ/Æ# ³‹Ÿ«:r<0+§ö•›OÖŸèµRR³Rrm6Wbø›á„g b ~h>Ý®¡åLf5‹UKèi<•jøxçÇÿÔHƒQèkhp77yX„žÆF»ªÖ{œè-ƒæ%êé«éé×_K–=(Ï»]máÔYÛHeJF‡‹$kTüz=ÖŠÉXg¥ñö©‡_>|Ña¶9‚/ÕÓQËhqžÝ¡(Ê/ûàƒ ÍÆˆd.yG›ÖÆÏrpõêÕÕÓÓ… ¾®ÖÇàvÒÆÑjúy^“Ãu=ÐD¯âûÈ~x=9‚ס§ŽÎö›Þ<ДƒœÔ<2÷óòòÈA­ÈK}óÍ7û¿Ùh!ê|éÏY¦Ð‘B6¨– {\á ºys}o=]<½H~nïR¬¶¼žx<ó¦Ç_tùB‹‚ôñ sŠþøÇ?îÿRçÏŸßèÛLr4ª„v?.=¿½½wÿ—Òjµd‘(É+ûî»ïÈF#T¸”ÕjÝ퇻é)/£€ Ûì6‡n ž$.­ãénkîxÑÂ+;Pn: gL` ÙÓBŒ™&Q¨™4zƒQJ(i›-b³›Øì|:=Bï5š˜ªäLñqrvߤ§‚ÌÌ-XU£d7éLÌÌKã&fð6ORÊâ—n¯™O)e¤[*÷bƒŒjÝu!žºP/x#ódŠ6z}ÁÚÓ“vhöÏk¬ŠpÐÐv™wʯWíß©ðmyêëÝõ^—ùÐð÷GO¡EJŽŠnéþŸO{/©§*™ö@ÉíÃÄ(£*½žBH&Nfjîþ/õàÁÇP×ôTT$ÊMÍ'®ü믿ÞÿS"_ŒDÃãIÞ±¤¤„ì.å—ï¶èi ¿Œ¸]éíÛ·âñéÉÛµÚÏlöÆpØèÐÄdKWB$½&=L"öÙg_H賓s_ÌÙ¦§úÓŸö©òÂ*‡ƒìøÐ¬mÞPÀ¤–ðr€æìÙó{ëéé¹Óä‡ù@·¨¯l²—¥TÞØàùIRÒ‹4äçýû¿ÿûþ/µ¼¼¼EO×çÖë*ì ~¶`ttzÿ—²Ùlàh“Í?ROWWW«KkÉΙ™™é)<‡žnŸ§´íÖNòWe…•ÛõTR/{µÂÉKN¶;§„DÆc¦yà™b 2*wqib±ì#§£¨ð¾ÂE,ŸIux©‘>>›om¡”þv1MÈà•× %*½H¡­jgóKcS²ÈUÖmo„÷ñsAOåž,SPRc¤Ÿ96Pæ­ðfË<˜ö.ß ImMŽÝAOOô îmRï~Mà¸%jÜÙ¥ð³½À]Ií6&ï³ õô×è©B¢þð Ô×½zZ”Wúñµ÷k£Æx|ôt¤olÿ!___/Ê/==½zù J©Ãw@=uèiAvÑïÿûý'ãââânzšŸÅŸššÝÿ¥¦§§É ?爛 ²²¼œ‚ˆµ0àœfQi… F‹ÕÈfË\\j™¬\b¶œ°&þ̦ѓI…z9ö!¤P6W;?üðCLJV|Zi šàЦñ*cs×ÀHßȼšZmRU® ,†ðRyEå–žž-A.€sªðqÑy˜"ýZBôá>ê@7m°¸¨J_¨*)©Rwæö˜ö[ÒÀ9µ)|GMaSÖ„aCè >¨Gåß"ò2Ô»´çîrÔÓõ43)§”_±sÌoy«õâ•ÆþcMö=…*÷YVPNŽÖž x%ûXIAyJ\:êé==xÉ,ÛMO᱂r{€Kå—“ãD爛¦§ûltö¦PiàŠ‚tÖ°XB6»„Á„?tF“ÙÀf ƒ7UÄXj6á¥F QÉ^_*usµµ7eAi¿¬^såù%•FkÇè‰Ù¥• ç/­-®œ:inë¬ÊR² @O +j·kÐhE‘Ô¡ç4Ô˨ ñÔ¹›£ýAX›cáCT ±ˆÆ¸=¦ã6©§Ú aCðt{Òlgú˜9¼Sá Ÿ´d¡žž¾šA8ª›Þ^=}e㥼q=}5ËËàëeúת§¯˜¤ù¨§=}eËÏ*Ü¢§¯l…¹ÅäCú.éiJD„¯“s(±cC*1§<ÐZ6œÐt*O§ƒ˜ŠØl•‹‹ÃS»¸ÀŸÕ,V!_ˆ&\TráLú/ç#Ù·Ï2µ€ûÙ$SÃku“T®5õN®^¸|ëÖû|ðÙ­ÏÏž¿Ô;<.ÓAmÁ{-®ªß>A¨=# ÉkŒðµ¥G÷¦vçÄ[â‚@^á BJ_~öö˜^8m24zZÅ^2Ÿcèé^ÞòpédKL·ÒÏÔè13X‰ã§G §¹éùñIµÊ’ê¹¹Õ·WOÓ³Ó2k^¨ïŶØoPOsRóòäØ4³¡ys8_‡žBú4`©ñ]­?Ï™A=M‹Ï|…’YÅŸžØ¢§éñ™©ñY½TfrvgÛ‹ctÞ%=m,.Þ¢§¥Lf1û<У‘Å µr9=\.X+—£ápšØìR#‡J‹§Øgü’ûúVäæn™ Ð;H*x©Ú`rbÒ aÝö˜>¼qº×œ¦¯w·Š½´SÖØm‰ ¬6¹o‡*âÓKc¨§G §ôʼÕó‘¶ó¶ÌGÚ7>iGPO:i;¯<i;ï’ž.LNúQ¨!zJÎ8Šp¦$R¨ ­L¦˜Í6q8}®Ün®Ón®ý®\3—#qq©d2óèöQÔpg (²¯3¥’·u1Â'Ÿ>06Õ72QTYÇ/«Ñ˜Z@=?¸zý«¯þô·¿ýíÁƒ‡W>¸6<9£26”V%gôì²ù^/]æÉ"ן*|9ú0ï¶ä°®ìØŽô(S´¿*ÀUêΰĆ聯[»tqÆFÏv©O¯Ú¿OЩðëT‡ÿv¥çÐëó}ê©cáö©™Sû¿øãÇK ^ü°ËÚuP=ý¯ÿú/RÝà)>ž^¼¸FîXQXy =ž˜&﨔jÞ=µX,üœ3.îÝ»÷véiZ‹sF—ž:VÍÿþ÷·å¥QOMj‹c§©ã¯§yyyäz(~n9vùÊ\»v­¾²‘g/|7ô´½Å¶±Ä¸úÕôtee%;22˜?M&æ÷’ Q7ë©™Ãss=åæ:àʵ줧\×?ÿùÏ[î5À…µß¶vöÆ¥fgñKÄJ]×ÀÈüâ ¸¨¿[ÿìÚ‡:sÖÖ7$Rh³ù%ubÙn•üŸ?ý´9>Bèâ N¨Ìƒ©pI/Õá« rWx»hƒ½—-†=âûõ­«3•ªH«Ä¿Mt²¿ìæoG^G}¾O=µZÈô—6*ö"j{{Yx²SrE¢ƒê)E¬›™Þ§¤Ú·Î*È)²&ùôô_ü1%6ƒv¬ÉžÇAO××׫KëÈ`´Z:Íýëéo66lSKµ¿~êû!ê©´I±qŸùWÎy8D=…Œ&w'¨T. à±7¢§SSSäN#ða›¥íפ!dA ±h49&ͨ¶üš9>zjÔ¹y “Jz ï›JKƒ Ÿ4B p¶ŸF¼Ï!ú~…l¶ŽÃéàr]ífãrõŽˆÍ.c2Á™…¯Á—À9ÍÉÙñFà‡.ž=/¨¨MÌà•Õ4jLÖîÁÑÉÙÓ³§—&gçá½ÚØRZÓXRÕ0´çQªM ¶¦DKݙࢂ¤Ú·tð·¥*|\Ì1! É~Ï x}õù>õ´£¥ƒôøì?–7XŒV£Úº¸xªâÏÉ7ÆÆÆDÕ¢VK{~Ö‹%«Jk· 4ïSO52Y`xéù¹NX/íïì¿xñÚçÛXY¹Òni7( r‘’ìì…jäúé)$5ù@½ΚEgÑ)-peˆ&ÄëêÕ›×.^;¿x~y~yffallz¨gÂ33>óÊûl=ݼ /½ Ùh­,©„ª ¢üùîܺukó®¤oJOmV™Ýé‰YÂ:‰R¤Ü­„lf·=mQO ZK á¢f'çÊ„*™H¥åêÕ«{lÇ‚tˆzúéõOóˆ}àí{Òæ—YVqƒâ¥y ¼=…’IîmB®s’ÙTÛÞKCûÃ?l¿¾Vm ·mÌLÊ6i,âF9ÔT/½Ô?ÿùÏc«§§&O‘;É@n½ 7«%/M¨Í³.Cœ¬”j?8Æ™Ü?˜Ø()ƒJ0µ,–ÔÅ4´™k7xÖS|3©´X⸙xOÏ bËâ¼qãc±…'(¯¨ɵ&£ÕÖÜÑ ¯r©¸ª¾A¢Ù=ܾô c)¿Â±.不0”–[õÖ-õù¿=ü7²uúÒ%-£}£Â:‘ ·xÿsé«Jê^-ý!0ÄSõþÏÿq|Hî`‘ÔH¢§^ìþ—”»¹x·˜ZÉÏ'Çöš†qiî’F®+Tí3Áj˶ºZmqÔKIAÙ“¯v~L Z«"ÚHPS=xðxÿìl{Q¥t4wné¯îí„Zk³LìmÐ>7î´è{q0Ѝ^üë.û~¼¶~е¬-öSz›j¥[®C6Qà:žæçÈæe]Uã–MŽLÖW5ñÊ^z„ÜÖ‡ú—zZDÌŽ ¶­þy¿».}@~Ù¢?Øfn¢z qÞAþ¹¥s[Õ:…tdÿkÙRã3þû¿ÿ{û-À7kÍP‰‘«÷y°Îƒ»6_¼?²ë¸Ø¾?ç»EçúõëÄ6¿ÐFúöÛoÉ?~Ln°—•”àé†âúbjVnññ‚ܬ«hðJ_a£ …’&“\ùâM¬HuÌø-b0+X¬jÂ*ìž)“G§§ÎiQ•©ºŸ(€ª~z÷îƒ_ߺsï“Oo÷öŽHIß %-:+ŸL¬ÞOÇ2”E½byáÜðÀ¨Ni¨-o,T;¬¢¤FÒ |vz~f|fnnn·k‚wŬ¦¼aÇž™í\¾|yxxxáÔ’ÍÚ¥©A¿6ßþT‰5=}ËgÎY,–ݶa—4ÈছwSß#YúúúæN,ŒNA4«ËëªKëjDÒF98eF•¹ÅÐÚÚÒÑÕÞÛ×9xbâ$ˆÑ«¥?8 ÐTÐýò ²©±)È‘†ª&òð—ýg%ªÖMgjssàã×U6,N-¾ô J]Ö®¥…¥Ž¶N…Pµ%7[}eãÂìÂö+(%j|‹¾m·¬·{”J#´y Úƒ ,.,,T•ÖV—ÔN NíX2-–®³‹çûG¶—Ì-ÖbjÛ±€ë!o’Cø[-­‡õˆA¥¡R©–N¯ t©ez(K»… RÛÖ¶Ã1£-¦vÈVù¶“×öæîÝ»ue —™É™ÝJøääì©“ ­–(9ÐÈÙ#ÅŠˆ@O¯]ûègéüàƒâ‚2hÉÜ»yos¸®²±ª¸z|`ü@ e1XàYhª•ìxÐ*ÔdÉ„f•L¨Ø£d¿†ºG÷v l¶þÅÓg{ì'þhö¸XOWÿöÓ]ujhá—+ö¬3á_r‘ª”_Ïøæ¯AjC4¡˜(7ÁÙÑ,Ê+õÜñ^S½S§¦OÍœ˜³šÛ¡Þ#F`¼ŒüÍzJ^¡]¦ˆsáø:9{Ø›y±ˆ&™Ø4 Tµ€n7qj[ …çL‰g»ˆø‚CßRþÝPÕ7rÓ£¿ï±:Ì} ½r8w»ÚQF|?÷zµðMDÞ–Brdqʼ€Øs/9:mKxÇyål:†)ÿ+ƒzˆO÷aþååerOË”¸ô-ÿ±ÚøQ‘4z “s!©‘Δ8¢ï7…°dâñ8PØ à¥ò7‚ ï=à6V6ê–ÝÌ¢³L OÌŸ˜ÕÉc UBLºã)ʽssjtêÔ‰SõÕM…¹/N“×KwìNÑVVóCÃÓÜ=¢ˆMzcÁ%,ŽBÍtsç y¼_¹| Aäavb6=!kÿmIѩ傪ëׯcÒC,F+y@í~s3&µ´°â£>Úí‚÷ïßµZå|~sC“BP,+,lil” m*Õæ™“‚ ÈøÈ”c¦ëÞó£ sKø¹E:µùÖ­[˜nÇLïXÚ°wn r‹ ²FåÒ¥K˜n‚ ¿žk׮锺KÇnf1´Jj%•Å•Pñ¾EÚï'Ož<ш5{妶UX/­,®‡|ßÿ†<‚ ‚ ‚ ‚ ‚ ‚ ‚ È{ÈóçÏÿõ¯ïŸ={v¬‚ôüñÙ³Ÿp‚ rüùúë«sõmŠ0«<´Y0Õ[zeÉúfƒtûöÒdW±UÚ&k–Mõ”~xys A9¶üðï»õñ†O}½»¡Þ]OX‹4èâ™7&©·®žìÖ'èë=~$IÐåÅVÌ/Aäx2Üškhð07y¶ˆ½¬ox57z’’zî”ñèÃóüùóSŠ¡Á}‡ ÉB¾X_Æ,CAŽÿpÙØèÙ,òêTøöªýû4ÝJ¿f¡éNõ”}.Ìé^$ÛFº”¾ ­¤—:Ó_‰¹† ‚7º´±–&OP®]à˜)lP zÚ!ó!õ«YxôÆ»æ BtA ¿V‰7x¬¤Nu4æ‚ rìôTe{8j 6„ŽšÂ'𣇠!6™¯±Ñ£UúÓO?qf«[ˆ !V±÷ .h¦#ôkÊ×£öoûž™’}ݿ٥ o•xÛ¾ãæÓSÝÙ£¦Ðv™Yè3?Þ€¹† ‚CÎÎH@:Íà*|‡ !cæpÖv©osê;wÞHVgå¦&OxpœÇLᣦ°^»¾{O÷—­®®b–!‚ ÇçÏŸŸ;¡´¤JüÀ´ÉýlŠ€™ž¢gÏ~xå >~üøÉ“'¿¦¯øü¼º[Õ.÷·É}m ÿNeЙI!f‚ rÌù¯ÿz|i^Û­ mNûöOŸ¼²’®-¶uä÷[ÒZ2ûL)—[=zôÊAººÒÚ©>5TýäÉ£—Þ3AyMŽç¬Z6+ijIˆÐyW•NÕ–=¸víõÝñ♫,D¿±£˜Iè=Ù]òý÷¯ëÀÙ»×®Íúø¹7†Ê×u¼ºäD}õ·ßÞÆÜGA…µ©Þ®ì•Ÿ›íì0—¦ó›“ _‡7÷ÑÅi ±ÁÃÒäÙ"ò37yÜ ž'z_˾‹Jes|„Ô±9ŽRw†%6lѤÅ2€ ‚üJ–Äâ–„H¡ Å.1.‡ öâO¶³ÌƒÕ/È9tIê.26zXÅÞ ß•?X«Ô>/µ]vèûžµh•ÞÜ2º-Žš@Ï“RoEA^ÇÛÒìÊâB‘¸ÒÁ_“y0Áà üI*ŽÌƒ='k:Ä›‚:7‹ý­b¯n•ß >xÄÚ£ h—ù4‹ì›0xÔF¨ª?)©Ó}‡Ç>~6D¤4ts>.2/–Ø•Fz©¶Ì$œ§„ ‚¼š®µ&F×fSu€«6ØSê¥ ñRù»Â‡¢QøÎIaý!Þº[Õ©ðІŽ["ç{ys]Y ©mR“ЧߔzX7ztïžÒ× ¦J{Ý^Ä1Ø Ž‚©<§4,‚ ȵæÎKl88¡àµÐèüÍÑ`š pâ@a¥žL1—JÊÍDÝaúŒsƒ•r_ðF»”~ã–¨3üùžÜQch»ÔǦ‰~úôÑ¡ÝH)TøpɃ&ÐÍæmŠ0„ûBež, ´8T‡¤~±vK‚ rP>š™±Ä‡KÁqóãêB<Í1–Ø pÜÀ?m?¼T¹Kĵ;q- ‘‡xë;wVú †wpHuA–¨qKDŸ& ]8;\{ˆ7’yØ{težLˆ ¸¥æ˜@C„/«6ØCä¿Õ!©¿›ŸÅR ‚”/®\iIŒ7Màj÷1EùƒÄ#|­‰¡m)á-ñÁ ª*?»s'tq¯>ä½å?¼Ü5ÜšÕ,òŸ´Káשðë3ÆÌ–î fOz¼Ü“-÷b«Á9 ÷Õ‡zCMQ~ÖÄæø pWUþ\Ç"š¯~{K‚ rP?~¬ õÔ>ªâ©ôå€OÚ’Ò“—4PœÑ•o‰ TºËÀEåP敲CÀÚÚÔµ‹]ó#UCÍ ¿]íX9©;ô[üñúuM—›­ t‡h*ý8ÐrhO‹ì¤õä%¶$ƒ£ - ‘ Eéãzãô8– Aä˜Õ‚\*ý^Œ0êB¼¬Ia 5ãµüÞüäæø`M®>"àúXïÛAðvmYIàŸ*|87:è©1Ò×–3V?XœÑšª ñ´÷i»P¬ÉÑÏqÿ|A䕸lå¤9&XêfŸÊ ²êiŽ ¹éÎMèH2FúO'óbæ¾½q\Ò«ÔîbŒh3xZC:³b!‚æ˜u ›Ìƒ©òw¿ÔkÃò€ ‚¼2WºÛµ!>Bg‰;œ˜dŠò·Äš"ý@^~Ü^Æ··/¿Õq<­+¼9Ðf7ÜÇP/ˆ1ÂGä «ôáŒUáâSAä×Kjsb„Ä•fŸëëËŸT讲ªzõó³o¾½ §µr}¨/ÄѾ«ƒ‹}Ï bKcTÀDu)Š)‚ ²Ïž=»uëîâêê/¿ü׿þµÇ7o]]<¥[“£lY‰`ñ¶ôø3Íýû÷ß™ÔXëìœU7LJud$@-ñ¡'«—-–=~‰væìyCkÇò¹sùË?PvAÞ7F&g«%IYùÉYùäkBF^yÈÖÓ¿‡(À¿¾»ÿÞÅ‹?}ûí»ªöÌïÞ…hîÁžÁ±‘,!ƒ©—ž›”•—˜‘'¨¨37w ª"‚¼¬¯¯«ÍI™¼¨¤Œí“’Y+”_¼xó‡óÏ7o— ºrRåžl©³=-¾=-ñÖÙ³o\­À%—¨ô‰»$`trfaEÝÍ›7±¤!‚¼ÃZ ÛQ6[~iÕÕ«·Þ ‡8-®3„ùm>Štã@RÖP ÿöÌÌ› ÛÚÚZ½DþÒ,(«Z^^Æò† ò®¢6´D¿L H«ÉÁ“}#œ6(}]G‘й40Ǥ".­##i¥ï œžB/ÕÁÝO *ênܸEAäÝãüùóé¼Â¨ýéilZv[ïØ¢áÊp.ؾ<4”<ŠTîųHêF'·Ò»ÒÇ*K޾ãwýÞ½ý'`\Z޹£ K‚ È»‡BoÞ÷Úþ¯Š:ÑÑr¸”~(¹G½}ÝŠ¿«:À ÞÈ š J_Ž&Ð]êe÷Ñ…z¶þ鯉«.”µÞö#NÀ&™jgW”HÀÂòš\AYrV¾CUs Ë:§°à!‚¼K<þÌ[à&÷f“½¾ƒe…Gœ†¼¢ 2“‰5§à×óŠ+ -}#ãÓs`}ÃãF«­V$w ³ ej,{‚ ïÏž=+¯‚û r VTY¯æ¶.PÒó—Ö>¼ññÚÕçÎ,wöHÕ†\A™]Os >üóQòÓ++†È@PLM€›½›7ÄÓ~i´{j¤-3æÿoïÌŸÚºÎ>þþ%ºû½ºZ@€1;ˆ „X³‰EìûŽÌn08¸€1v\/q€³Õ‰‰›´¥Í›à´ubâ¸ÔÓ­ÛüàNgÞ¾ýê÷¹çZTµ“¼}ßÁŽlžÏœ¹#„˜Ñ=çr¾çûœsž3‘o‚QmQN\}ãØÄ3®ÃÞ‘± ê ®®ÊºÒªzð¤0¹²ñÆõ÷Þ‡/àGxÓ]Óë³ÄÛÑÏ‚ È Æ±ù“m=ƒí}à˜µMp?¹²þú[ÛÛ¿øõ¯óé§;ï^ÿÑ©—/ 9H±:¬ù%Ïx9ÍÃÝÝs´ª§=$}î@œi<+nÁ•½T]0—ŸáK»Úa;Ãäõñág] ‹m½CPp­¬k®oé?¶páòk?Ýúù;w¡üä§??ùµñcóuÍYŽÂ"wõæ‡⃇ ò‚qمñÙ…î¡£Å5#‹+ko]»~ûöçØÝýòËß~ðã­³.LÌ€KÍÎkhé|ö_ò¬×Ó.w‡i[õì7êi¨0•›q{û·¾{cìØu|±¡­ÛšW\ãmÃ܃‚ /»»ÿõýW^=¹z¶Ð] rÐÖ;xüäÊkWßüèã›_|ñë[·>»öçN‚?µ:Š.\¹òì¿ä­±ÌÄVÓ"«'®~M¼·7:äbßw õ÷îÝ»peý¥•µâŠZ°Ÿ`BÁŠ‚!ýñO~¶³s ¼€†7k›Úí…e³'–ð©Cy!ÙúÏí“+k)V‡ÅQäijœ=uöüÆo_ïý·¯]?wéÊÌ‚µÿÎòºß|õÕ£éñ-ZºÍÀ)»f¢C†Ö#õF_éïzø­Ç¾ìüÜâòÒé—¡À‹¸ûFo{Ï“'Ù©íuvuÕžšZl³•Ølά,h/gffÅrñÔ©ÍÍM|ªAž1óÓÓÎŒŒ8“I¯Ñ|m‰1ó-–ù©©Ç\’rٽ߿ùÖ;í=ƒUõÍmÝ ¡à³º‡| ­]žÆ~ßäw•¹÷±ïùé»o.º WªN7V-Uº.ötIº¡?ýéO×7oôUÔ6Ö5wtô ƒ'í: 2Z^Óà›™{òOΟ?_[Zšc¤é¯m/x?Çl[__ÇÇAä°½½]átƆ„<Ö!üå1U­((Ø~béÎßþö·_þòÓ×ߺ6³pr|v¡t¢otÜ79wíÚ5¬á‡¯¾úêöí;7ÞÿÉÜɕщc݃>ßÔÜÐÑ©?þøÉûz{Ócc õ¿¶W(ËÚRSO85Œ òT™-±ÙŒ ³×'‡@'¬Ñ˜4š01‘7þ¾>ì²Û_þ†3ÎÀþýïÿë_ÿŠuûÿöÑàš¿eªÔ70pH–÷ÚËHZç±ö h/(©ÑÑ­­X·‚ O‰­­­2»]Sé„Ã5šCê°†Š¢èhב*‚tÔF,Ñípìîîb>cƇ‡#µÚ½‘¨'´Käí-íF>£ªª92òÂéÓX‚ OÃU»\ê웑ôÌÐ-CoGÑ DÑfRàE"EÇSt ôÒAdW•Ô#……XÏ’ážžhƒASù€tÆ’ÖIô·—Úd ä}ø-|fo”+„Aö¥ùù£QO,L¸Ò3Sq¤+N¥™tšÉ¤ )Y4“A3i4“LzéâUM¤K ]˜žÆš|6ܽ{מšêüP‡)*–Èh E§´—…¼†wRh&‰ŒŽà“ájø—¢š«ª°&Aöל[­jçLÄTÑJPLÎl†ÍeXËåù‹asÖ°ð%ŠHýs…ÙÙÏ‘å¯zãÆÞ^_Koïúúæó¯îôzÃEÑ@" ‡‰Pš‰’ZHëØÚ ^C Z6V¬+XÔ½¨/ØÛ›7oâó ²_Üûì³(Žˆ©&Š Áæd1,H§“åŠ8ÞÅó¥<_F®ÅïÃgLOlʈ7™..=I{@I'¦çÜÕõ®J½¨,·ÀUVU—_V5ttêìÙ+ÏÅ÷Ï1›Õ0o¤†RÅ?9däSÈñ%í¯óYüiEžØDSãráó ²_t44èÉL¨Ú9ƒ˜ZhDzfèBµ(Öˆb­(º!“a£(ʰ¸%°Œ ùÍ.¬®VÕ7§œl¾W’-ö‚²Êï0wÓ¿ÉââbJd¤QY}¤„yU1 ºYÂñå<_åo¯*A……ÁOø7´—ÕlÆçAd¿pfdH¤7†Ì™fúÅ (i½$5IR³$KM#Óp‰d}ËÞÌiàžÇÜää`¾Óåå³ù¥•êyÜßT²ìE݃¾`–Ô6¬¥‰H˜7‡D *¡N½’Ô"I5‚Í(3ÝêÌi”æÑÌi žÖj÷»ßá¿‚ ȾPêp¨æŒLEg§£Ši£$µ1-`¹F1Ap÷šFT5šìÂ0èi¹Ó´·ùÑG•×z¿EI÷ŠÕY¼ô ;jƒ¹ñqbN5±dšÛB¼.NÓzQ%íÐjËyÁFæ¾Éä)“All,Y’ §±Ãå3gð_Ad_ÈMM #f'‘D¡.æ”0oƒ$µKR£(æ³lé±Ky®EÊ*TÕL$uÏ¥ÂÕ•“´·Ù?2öíÎ4°TÔx¿6Aq00ÚÓ8þÉ!Á„rž÷øÅÔÅqjì·Ô?å î5›fR‰Qp©àOÛð_Ad_p¤¥©Á^ÕìäsZ#Š`K«yÁI”´JëD ¶^”j±Œò9$5‘~Cöô4;;8ïqs󓲪SLÕréÕ«Áy/GûúLã;H'™3õJ’—DŠ”áè!í¥V”*4”7…$yØ[K¥Õz««ñ_Ad_(ÏËSW¶¤øƒ½nž¯Å2²”l(hk,÷Ë2\Û´ZÐVT˦‘(¢Ú?ƒªVæåç=64´eäæ­nfØ %åŽbw–½0ÐÀ–×zƒó^æ§§Ã4šh21šE3ydæT]€ä ‘„JAÑÖN­¶O–¡À‹FI:C –ƒÏ'(õÑZ߃áôž£Š ²?8ÓÒõ:ärž;“I3`N¡n’$PÒI<«“§uò0‘ÔjA,dYTµÕhlIIÁy/}oíI%M±:Š*jZ»ºF[{k¼mNWEjvžúÛ¦ŽÞ༗VçËêi)Ï—ó‚•ÄêaT/Iݲ|T–é”â“å.e$–r|.Ù8 ÞVÍè› Ë˜(Ad¿jk{ÌŸ:9.‘ìš)"æ´C«“åE½îŒ^·¬×¤öÊr½(¹”¢²â7’du×hÆ{ƒTƒÎœ»B U-©VGZ޳º±ulæøÂÒêâ©3s‹ËÃã3mÝy%ªKméìÎ{¹té’%::PO‹9eéuEç‘ñO³V cžy½î´^·ª××ë†dE$¤JB¾¡$žŸœŒYAö‹;wî˜!{ó§`ab(*¢Áï@G]+Šàn&eyE¯ûA’ .ìjƒ$-‚›‰žBÿœº~î\jÐ^+tW»*ëJ«ê\•žBw•§¹crîÄ™ï_Úxã‡o_»~eãï~$µ¦±5Ë^zÚÐÚœ÷¢ä³ÊÈøçú1–K¦•Üé4íT‚½B«V žô%½î¢AÁ ?¡×Èr³$Ü4’(ÚëÍÔãó ²ýs‰Å¢ú蟣(åø˜xâO 9¾ZÛIÿ Ý2H*¸ÔIÜ-Ëu¢TàOi(·5xó NO/´õ 6wõ·tõ7uôVÖ7÷N,¯%ýä“_íì|þᇃ¤‚K…9ŠÝ §e5AÛd}uu ’6¬ïM¡™NUýiñ§`Hçtº%½RfuºAYöJRy€? ƒñÁøÙ‡âó ²ŸöíÌ™4SX¼’lRÙÅ‚ß!ý3tÂ’ÔC$\êY•f§R ”õ-JJÐÓ SØòÂBÐÞàÝ»@+G§f}SsÕ­ïÈÄÌÙó¯|ðã­/¿üívwARA[Oé-(«Lµ:Þ~÷GA=ÊÌŒ¥•]¥ê‘1‡5T2Eç2¬‹S6Îtï) ­0"ªEuüc&'¸¤v`>|A§Ð?{Ýî8ŽÛ[©{˜dÈf”)ÔJA‘Tè“»´Z訛”Ü;¢‹¬þM%ë{X®©¤4ÈgâT¹<:s<Ó^à®i<:µúò…Í÷ÞßÙ¹’ú‹_üêê›?\XZíèÎsU€][[ æÛ™Ê5ÁHFÝ©A¶£f’/ êD©U«í$¥•,Frs<ŒŽ2èGÇ홓ïß¿O>‚ Ⱦ³¹¹Ye³E³¬º“"œ¬PJ%–§HI T ÊŽ PÒ#¼NÇÁ²Ð9'Rt"ËyŽ­­­ ¿Á¯¾úêêÛïx;zÔ<½ ›àX/]Y¿þÞûàRß~góÌùWÆÍ×·t:K,®¬“ëL3Õ#hᥡÌdÖ›¤·ªH{A©ÄR²XMÁzjŠžñùð™GyJ,û|Õ6[,Ë…’â!byR‰KÍ#—s|I¶“À˜*s2ËÕ;œÇ.npgggãõ·Êk³ì…U -ý£Ç—Á¥ž½ðÊòÚ¹©ã/µõ UÔŒNL?/«^Ç;;3Œ!ád}u˜FóhQIòP@Ú J>ÇÛX6‹fRȦü˜ØÉîn|ÚAž¶Kmw»-¡&5}ú!ÿ &餗¶’#ª3Hæ:è·maán7üÉstƒùË_>Úþdjv¡¼¦$\êÐØÔÈÄÌ€o²ÖÛïøffž¯-$K““E‰‰1eYY˜”HFAY¤½¬ê‘âd3T:/É̺¸¸ˆÏ9‚ È3ÔdýÒ¥šœ‹Ñ˜@ÑqÄ¥&M!5[Hh½Ý¾±¶ö<î^„ïüå—¿ÿÑû?½tecüØBïðØÀèÄèä±ñ™…žÇ&ÛÚØè­¬)ŠO¤²¨LY$f&í¥6Y ÃÖfY|--A>)Œ òBrÿþý©ŽŽÚì즼ü#©éÕé™­‹eª½ýEJªóÂ$4€¹qõª+)©¥ ÈcÉ.7'{íŽf§³ÆbùôæM|žAAAAAAAAäiðçßü¦Ôá(s8²“’L<¯×hâBBÜyyöôô·66°~Aä[xøðáÚÚ(i¤,ëIN¡'‹‘¦­fóHW×­[·°ÆAä16|¾æªªØÇÔà/o†²lInî@K Ö‚ ‚ì±µµUœ“NB»|(Ixk"9úÔb"§T5-&æÄÌ Ö‚ ‚¨ÉÏË©ºÑ"*RCE‘“@Õr˜¢‘‹êñgªcM‰Š:qâV ‚ ‚ vw›8Nõ¤&’‘8J=cŽ$QLò—DêÑAfð[PÛP5LQy™™wïÞÅjDA2üã#"T1 Óh"Iz5q*EgÐL–¿¤“$ÿf¢³1ä„ô0"©&žïmnÆšDA2eN'xL#9Îõ0EÇ©gåÐŒ…asÖÎr–Ë#WÃæ0Ê¡f ª1ÊDN@S'R“""vvv°2AƒÉƒÃà $Ì«Š)ØÒLšÝTs-áyÏ—’k±rH(Ÿ }b XÔöÆF¬OAä`2ÒÝ}H’BÈœ©êLALÁ–æ³h¹ T‰b(ÖŠ¢[2ö0E©«|ŸÜ—ê²Ù°>Aƒ‰;?ß@¦MÕ#¶Óýb †”Ô#I^RÊx~•ô¯3§ÆÕÓäÈÈæX7Aù?á­ª Q¶ÆhÔH¯…„y]_) ’Ô*IÍ’TÈrÙ “Ã0Ù4c¡™4²ÖT5< ɼ°&%]»v «A9€T„j4‡5T‚ßœq|Ï׉"ˆi“(峬“åŠ9D¶„ãA[í, ªšL$5,0·Ctôäà V)‚ rñ¸\j°7‰ÌœÚt³Z¼’T+V•W¡VëED~UÆñù,g%á_â¿?Í@=EA*mµµáMŒ?Ø V´ŒçA=ðB6ñªU‚ÚÚ©ÕöÊr,·iµu¢äæ…<–Ë ™8bQ d.Õ–ðÁ›ob•"‚ ÒÜÜŠ ÔS7Ïóxð+AAþƒ,Lô4¤—jôg IÍf˜GÍpÊù2,gc•#Û’):™a+32oß¾µ‡ ‚ ’êkn.Œ‹c˜CJ=X\9 •¢A@­Œ’¼7‹äïM¡ècH{ié­[·°ÞAäINÍÌt¸ÊJ“”p.™HM"»SÁ«¦‘«3<ÂcÉžíöù|X]‚ ò-\[[{eeÅëpºÍMv{³#¯&#«<)éâÒÒ¹©)<— AäÅæ€Œ-o endstream endobj 3461 0 obj << /Type /XObject /Subtype /Image /Width 624 /Height 230 /BitsPerComponent 8 /ColorSpace /DeviceGray /Length 8375 /Filter /FlateDecode >> stream xÚíÝy@eð]n¹Að<oQðÈï#554ÉR‹,´2Ó4íx+ó¶Ì2ÊÊ´4•òJÍ4E$ïûAaa÷ygwfwgfgpvØÕÚý~þ±–™gfŸç·3ó<ó Å#äÑï› B);2³®ƒÀšÜ§hˆ^î’`äXQÍue„íŸÎȰ^¸%ž{½‘+`%.;‰‰Œ(ä XÇi¼‘£>Ȱ†&yáF4³3` ŸAk"kÀò¯ Ç›zò,/¡L8ÞÈJdXÜ,‘p#ǽ9`q«ÅâíF 2,n“X¼åÔBæ€Å­‹·ô dXÜ|±xKóCæ€Å ®‰·mÎȰ¸†Y"ñ–„¼ËsøN8Üî…#oÀ º=Œ·µhî«X/n·"cÀ*j^4 ·’1Ȱ’ö&¯ìUs‘-`-Q§¸áVô¢2¬§ÖÒVWËQW«rl¹,K×­\Súë`wäXC»qÓ§?°²àؾý:ÿ‹¦ü¨7 ®©+ ƾv<÷Jõ ÷¯9U ¹ºcæ½=)¶Š‰¸ ü1£¸¬¼¬ðæç±([ã3—ÕnV¼ÐW~Jʦ;Êuí!—&¸ÉOÅ)!Í8X_Ü3{Ùe«Ü÷'ZË”Ä|C˜|#{¤³Ç'åœóÉ}}6mH‡kü÷žW¢eFî„bV*?xËKÅk ÿ|Êæâ=¬Íh|Á´_ǹƲ’j™Î™;dº¬÷Y.«Ô&ç£JD9Ù·BýÖ¶Êyúrä ÒÊô—sBãJÎ'Ý„mÄPµP¼•‘Ó¢r‡—Ê8‰vƒ’² Ž'„Çr1?­h“¹CdœÐáó)ŠFYÙ‚6"êÔ2ê¨Ãø‰$›ŸFµý"'´ee æˆSžn~Z£ùiüj~ DÎ'olÁ÷bñöùi=ÁŸQu­ùiô;ŸÌF(,pB¬|›ŸV­ ^Ï™ŸÆ bçSØ…e΋•ï?æ§å°Ž×ˆ!cªšébçSÖ…eþ+ß2kuÓÞ;OF{ï$±ó)Æ{{[ð“Xùþ('µçXƒì5»åô) v>÷š °l¹~ú¦œÔœ¦fÅ/ÿIÖDƒ EÎç,FDØ‚hpñjd¶¯vMÖumRŸ}Y^|x‰·5(+[àtZ¤¹Kn÷µj‘“—¬x+>@î M>Ÿñ(+›0A¸|'<®ó©wMð|öc¨¾mpÿ]°xß,öÏ• œO)^ŸÚŠ–·M‹÷vËÇw>n[L)+^C9ÙŒ„ “e$çùÔØkÒ;êÜMmHw^—³sÝèÏw*®•÷#9‡ÚÑq1ÌŒ#þ[¸“O¾…wõ6%d k|VÉŠ:ºìÊTMÁ‰ifÎhïTËÜøˆþꚊ”g›L?6º%^fõŒ:ÒW7[ki»ì²î©I}ñƒ6téz­ÓÇ`ÅQsšökÏ?y'ýòæ,]_ííûúØúƒî7®¬5åÝ­”úîDL m·c~ô÷å ýîáƒFv ¶ÈTºJ¿vÇD{uùxïÙÓß&VG®é÷A•vž¢Ï,°D¸ÏŒóT­T“: }Û@¤Æú–~®†«½ªšVÀ.¦[±«r„¼ª2¶ÈVqj¬j¬_Є-2Y»ª¶”î ¬VaMòL-äÌÅVéÛ{G×Jk§ÕN²Óºˆ0áÁí54·’hë±ã~Ñ©¤J:“GæsÒjŽÜ“'üKR'º¥ŒžüM|šxîèÒ~È]à ¼Â‰‘•¢va^ôkÖˆ¶ÓõR£»<¤JÉí¥6CtCÃ|™ÙMÅ6iÃé•©n€Ü 8½Ë[‰mælx÷®*¶;§3çߘ«L5fMØ*#>Æn%#EÓJd·‡L@Þ‚€ñÆ¥M/W2‚ꔡw¯øgãŒ[êÍnÈZò3Z“Ú¦’­^Ô‡ÒJÚÕ¼¾c^V¨6b4=ˆˆúæVypaq¥óŽ»3ïªîTÚM×噃÷Õ$ïð³îÈV£¬ßî‰È‡M]ãcê:Xqða«sT‹èôD3¼Zé\Zu%èÖod”À[xç÷ž;27ù².vƒÎ—ýÙUêö~tͼW£u #Ü&ÓE#¤SpئŸÅÃKÁ|áúuqo†JÚ¾ci•J;7ßÐ7UÒö3 Ûÿ†Ì³ýdæ"ÎÆ™áŽ"óÀl; ñ³BÒö“ ¯¾EæÙÞ2s¥­Ð\ýÚO!óÀluõSØŸ“Ø¢6îe©Ùê‚Ìó £{±¥Kî.ùJ†š‚Ͻu ƒÃ;ïäÝÙ&½ùV2nnR{dÈäÚ*ÔÙ`Ü‚ÃÔñT>Š#…µîÚ3®^¥ÛÔž=õñŒ]œždõiÀûÍ·óŽWÕº|xðJVÎÍ¿>dí1ž“ögi;»®t-ÉE¤Ü*CwzÈu¯Í0kçvý[ä°Õ‹Ô?¶­5±ŽÍ:Ö“}qŠ?`_U~zœU/,ž_1ãý’+·ÕDmW[î¨nw¯t‹w ™díPˆÈ&ç­} ÷ßJ ?±búOå”] —·«Ç§Åì1ƪ­9Í_b¹?»[³ˆF•¯Cn¥x›B}¿Yvo ² Iµbè‡TN—wáÝÅ[^R“Ê_PÁÁÑR35;í dˆ„í¬o!û2÷†ÙE¼9|pçÂX+¦y"ãG?9;zo#&N³_³{Äœ|tÛân/å}’ô¥ÄP‡|iÿý|ã{8(Âc·Í›ÚÍb[P·Ý˜™ü7]½^Ò?‡¹ú×oÓþêN¾5›¶×íݺŽ_¥Í9x6mGoÛ.¼¦·î¥ ‹ýŠ%º[é¦ Pz†·Ñ}Ó¶a ãÔÎÕ뵌Ž`Ô‚>lLdÃödcnþ!­¢éƒ´o^“®y·•GnÐ')ÐÁ½FXký.†g$Ÿà¦Q̉Dz±.nú=b"ý® n5BÛÐIvhY§:ë9†úvM ß®ëÛ)=Â"c˜Üi`,zGßà–Ñ1Ü'7GŸàæú3kÈ®rV«ÖF—JL›Æô);ÌU›ÆÙd(*ÇGèËŸf ç(>_]2#!ÀÌgF_ÃZ–º(“ŠÜ?»î&%AжŒgR>Rázž\â¦iÙ£û¿Ä=™ÚóÛ ýa þöJkqßt3¹¡ÔèL­Ž«Ï°ž"JέïL•C8k²Í T E-?]È^˜nïxzl™ûÐoióíwê°C·^5N'Kòþz7‚9Ûº3÷e²î%)ï†RE¹•àY~t„Í;œÍÚ¥ð¯¹ô€^ç._žgåJQêÊæ»ÎØϸGaÚç=éço—Èfº-”õ^coPqû—Dæºä»"•õí4Ù{ÆÑ#~[¼œ=mPÞÁ}é46^Ó>~_¢R¨íOYϯ/²Ö·*LYÖ†9³àÙ‡Xß%?uMw* ›ç„)ÿM68{´1wÕX}öyw™ñFÕO×Ò—ûg¯ã„„+"‹XO“£¾·H¯[LNiÿ­¹ùB›©PÚQÁÿ%/óÿ9¦íƒâ8»ˆ¿íƒ÷Üá¬ÌPOV¸Ì+äoU±I[÷ù’©ôü顨þÉa3Çè.î¢I¾žo­pøŠõÿÿð~Co™ì’¢½B½ÿ€ÿyákº}£Òø(ûZOÃT…]uU¤Kü 4èî . Mò â mi:M5‰ ÍîšÚ³ø€9‹«Õž5ßk Å}iãüWugÖ‰¿l))ýÌÇaÄôëVcŸSNœáz›¤ÿ\µ–uŸ­ÙgȀЇÅ[Γñ”¸…h¼9µ‰ÿ…¨j7‹®VY¼QewÿóçÅ÷¨¥[ :ëëÉOöŒ§ ˜º§‚Üã=K2´ qe¤t紡̶=ŸLú±””¢~}ñ[ùD÷a'Å8y°{úˆÞLŠ}Æ}QD*&Pß~–†”|?•Ú½‘R9OC²¿LÄl“0âÄÜÕN7r3ïëÏü¥çðù— Ùîªèúl>¹¥û,Ž—Y­ïÍñ…ãúéwùÞMB¾¤‚wdyðý‹úïÖsØ«»ËHY<µGõ¿©Òÿß³˜£?=s'«µiÍ&DûüæzhRéÃ$ÙüòÛ„ü ½}=[AJ~1"AÿíÆYLʵ»$”òýoŒÖïÒ{ÌÒêé†úÃèr¢Ú5mx¯ø¦Š€[äŒö¢7QEŠ¿™2„9³^Ãg$—“팺A©Ôuð½ñÌ×OýÚ^*0?¸/oåtƒdÍkœOÿög2¦¿1¨Õ ×¼ñWʉ:}¾Gåñ–®OD4Þxõñxó/ ù}˜KDXÉlϹ=UûhøÌçèx[AÈÎ4NÎoò=¯¾àú©˜ÄÙÊq*õ¨AÝASˆ:‘y rK!ús뵓)Ô¿Ó¨èâÎ7Ð4“dWV_XBE§ýSsŸdR©GÈ4ÎÓ¨ÛÿYEýÛOE.p‚ÖuÒR¤=È:Þb¨R æ$Ù²˜d4 ®b'ˆ*‘ûí’ùšú‡:Ø\îÃú Ùç¦pÞEýA¿GÀm’FÅ›ÃÏ„Lä\¤Ý×PaEý;\MÎpFwº½TF Ÿ$"èå—gð.«ã˜4ÙZ–éç|Ž¾Úª—»<ªxk[FþÒ—uOùÙ´õc†p¼ýD4OpÿЃÜxó¼GnðÆÃ†ò«³Â/\×?é{Ü%×yQ%½H÷ø³Ž¹í'ªú•ÅUyïÊ«_&ª8÷»R÷'dÔ y9MÊ»ã*àÏxG¹@ ÚR·Óbr•7ÙKBvR›J x‹Óúç“¿}ÔŽÜxs?JH]îÆ#©ß$uI¦~À¯óÊžºõ¿/oºÇq%%çíôl0ç‘åC:¹zYú+^¯GoUd¿á7XN¾ãl!3…ãmQwæþ!ŠyãÁŠ7ïbr¹&w« Bv;+üó5ôñ–E®ñŠm!‹©_þ&BòjCɉ·=„ð*Pž§¡ã׸ڇ_¨^7mO<@*úãms{å±xËÐ^ÉùŸÞ§[¹›Ò©}`øàÓ㉷â›\÷«oåw¸)¦›o÷¸{ß*}x¼erw¹­²b¼ |;:ÞÔé¼³P[*ÞvŠÅÛí5Ê—ÿé-:V6s>¼D§öŽq"ÇÇo¦LÖ63Þüà(=ÞLåÕ~H¼™Ê·Z¼ øNoþp·H¼­‹·]cpïÓãtsçœw0/ý ÇsÓóÛµu|K‚ªo›ù)®ˆVH·dþޟ骵•ÅÛþ.kŸVX+ÞòM¾Ýòöºx+ÝÊÿÃê^J‹ÄÛ4±xÛ¨«/lä}ºŒn9oÃiãcÚ<~×ORS÷_R_PÅúS]“Y_xèûSÓúãÑÔ˜ ®i}©»X Þ"ÕÂᦣۢ;÷&U¬Ï-¬Óô±Ðम±¿Ò?œx[MÈ^õÿ!øñæ}“Üã½ÅèTBþæÅ[Ý€f¹xóÌ%W‚dÇ›ò B›o»‰1/Þ¨*Ñþ°öRVºoï™Ý9(¬žÙë/S‚«ÆnzÎývqz`h®¼Ï|¡ÿ‘ ÖÒ€Þ³R9’¥Ntgê-¿·j¸ò÷kÌ3=þ r+P÷üYÊ{0oJÈ^%]õmüu$ä>ÀÓ7·§øê_Ò^'çy³²Oe¦étŠßQÀÍV¦×Mƒ ÝÓ§PÀ Læ6”¶Ó}¾›hx®»¨™¹ËZ|vÛ¤›‡ö8ID3‚ŽËÿñrœäêßoZ ÷Ûå2#…ÜÇ)%¦KTyœ#· סê—É /êao?Qùr“ïGÈZ]øD®O7‰,êº:Ö¤™©b>ç®èúİžu-3ªA9dÓ(ö Ø5°ç¤×Þ~‡²`îôQm|õ<ë>`¿öWz5œôúÝvs¦ö aªNó6°Wrp¬=áµùóç½9gÖôW’¦Žõ5=~ïÍÏjµáu^¯§·6è^]†¬þ„õ¨ôl4øå7tÇÕz;’>Nâ¦'õ_B9jÓÓ¼‡à嫘Ág®µâž§¿Ž¾ï–ã”M¢ƒÜj%¼0{¾~célï¶a&¯MÓ{Þ†vúo9ò•7 çøÎYRуú¸öò´7×>ç3ˆÛüŠ“«œo·ÀXvëÿÒc’cèžtC67<*ŸÞ8Pû½¾žÂ;3¿ÅëZ0gV£ýÓ¯Î5¤òÎ%m¼)”#x}DŠg[sV,‰4•JK¦f²ƒRü/J3«”qîJ äšHAi¤4”u'£´HÙ)Íýúu/‘rú’|ˆÕ?U}*Aÿ!Nõ›ëµì8pá9Cü¿êÌ: ^rI×™Kw:9‡î([pl²Šð?¥÷Y‹¨Õý—œÙPï9-ÙPµpn6rÁªÕ‹ž‰ÄšUÿ5O²;‡•ÞÚ;ÉïßrfcÙmm¥7wMôEiý÷¹vì§—Ð¥yÝÑŒ´nŒgÖ¹yg”è9Õð0o÷ /%² dñ›qøÒ™5ͤïPëÝSWÓV‡#ç@†Àýº–—»C¤î–¦knNCÞùôã·îJ¼Â¹ÒwEAæ¹Ú¨øÝ6¢¯¡_Ì[È=0×dc1i½˜ŒC ÷"÷À\³ ásRÚlŸv8ˆÜs 3¼§Ý.mÖ)óÖƒ`ñÓ÷#.#m‡zú>í%¨ ‚Œ óüÿ£Ô9'2s¶.Ç’‚`>åÀ+*¢)X!ðŠAéê&tu]E*Y¼û$Žx[ lòîï‡Ö÷è£å0~(k0;^mA¥Z¼²~ó‡ƒ*ßjà]ݸ¸O+ïEìÝ÷ãm߾ߋ‹ƒ˜+ru}çÓ†U¶èA3¬¼ÒfÝzøNÙï1ÈWTó7}‹FñÌJù× ï­â2 £üQ[!®›ë:?)º™£auu?ÑêÝ`MzØy ¦ú³çHõÛÌ'Û°ÑhÑ´V³G­s@æ‚Éu‹3¿ªº·è††GTÅ6 ºÎN«ƒaÁDuîš: D7\dX®ºØ&¹S¢wBî_-î =«Ä“Y=«H¼#fwqÌÈ]0©^åÄÈ"ñ-Óµá”>J¼Û;@Gä.˜TOãÄȨJ6uâõ%ã+knx—3US rL¼È¾ Þ¬Òt)Êy‹ðœbUOgU-­v¹¬Y«Û"oA¨VyÓn[ªúÚóYÃÒ²…“ÑüÂÇÌc^²¢ê-fO3Õkc± çÕªS ãT·~ã·§^ý{MKLºTïÅŸO¥þ:#Äx¿î˜Šk=k±úF~q^ú޾†'zg‹ÍÈàìícì#µ)½XUœ}d.wöÊi~{Õf3öóŸy8'÷ìG­ÌˆK÷w‹ô†¿×CÎÛ%çuì5%Ïß©Œg^DTZä½=šÎYiƒÔûÜ g§7%+ƒ¿–\{俽ñà_ßî5–T]à®9^Ò±Ry‡*Áû³•%µ¦¹àTj[H:ÔçüC ûíÎHî2­d¥´Ý^`/ô´[Z\/ÞVã-ªýñ=͉|‰Ïð>¬ \®Ä0®G8‡º‰Ü·Cqeì x]êÛг†ªÇI½NEç±4œƒË›p³æà?çÿX;¶6ÓÄØ'’T,“žÿú"m›¯êtéûô7¾aP}D÷vRºw}{שK'˜ÝÍ¿¶§ñZÂãyŸ5Ñ]Ì”ñ§ég8õõÉæôRFL[ùõ’>fEI‡ô‚²ê«Ï0·ó)©ú7êCª¡€lJµ$Nؽ$º€ýžúîø…´/?‚ö~÷¾«œ>ñm"3V+ö0û½˜ê›0”‘ ñZÍ[º|µ¾õù†÷£: ¥‡¡ûåÐl^•õ ^9Ø·5üþŠUnñ„Ü矹Œ^q¶B™dnÔnÊã;¡F7LχuAIÙHU!O xIæc{©äò½Ðùh^EIÙÆåm´Jv3˜cõ:uäß{<<Ÿôš(+[P$o9þòÒsé¹ñ|AÑõß^”_ Ÿú”•-EDŒ•\íÍL]W“6@Ö²æu‘óÙƒ²²+Åâm™œÔž06œå•3TµƒFä|®c%[pP,Þ’e$æµ›Bn;IŒ;Ÿ¼Ö(,ðXù¦ÈHìyÎ B²_F#Æ4±óyÐ…eΈ•oªùiyç¥k~IbçSÚ…eö‰•ï>óÓ /㥱Èü4ž½Ÿ¢_œ-X.V¾ËÍO«7?íæ§U!r>7‚PX6`¤ÛCÆZàxM¬=ý0m_ÈíKƨ•AüD¶˜Ÿ†ÃZ‘öÞ©(+[ \%\¾+e\N–òY ㄺ”žÏŒÚ² ¡™{_ïy˜wMê #§/ñ¾Þ¦/pSU¦Å«š"kËñÜQ„ɲf^mpE Þ¢O¹­p]nÚßr™¼þîEÉ;¡Þ9&áv=Êm‡ç§¼ÁÍåËäÎùz”5ô)¹5Êüþä)x—eSW¸)œÎzAþ¼àuú‹å©îò0ÚãÜÜ7b†.{† ]]hhYY¯*S;E}~¹TS°wl•iðœtÞ0p_‚3JÈæT±ü÷Ô”½K‡ûZ 1 6pŽ}ó§ÿü±yjÊÀVø'nL½“yí×7±®)X›²Þ*C»JÅѾhÇkry–3ÏRÅ×èÓÖ㶄ߟü^{‚Õ,2í þW0²¬c°@¿&ÍFÌkVáwIpÔèä Xà ቎`9S°Ï4áqª8ä X^G‘y½ÈGȰ¼)bãX÷»!sÀâ–ŠÅەȰ¸bñvMp`y_ˆÅ[â ,ï}±x»äÌ‹{FlÔ½Xo ,¯užH¼-@Þ€å9‹L\…¼+/> stream xÚÍÜmˆ]Õ¹ðdfœÉ›M&:Më½ñ%uêMhã[“h_b‡T¯_B”/±ÆÖÑ(ãᦂikj¡©×B£)r)‚\ä Rn¡·ú¡Ð퇀 *–ZDR¨Êý­óŸÙ9sÎ$3sbJ‡ÅaÏ>k¯õ<ÿçÿ¼¬µ÷>ƒVƒ§²íرi÷î ^üâ‹ý¯½Výú×Õ‡VúSuøpio¿]}òIõÁÕ/Y½þzuäHõñÇ¥ýùÏå|ÝŽ­~÷»êW¿ªÞx£zþùêÑÝ]ß¹oöÖ­‹·m»Ôøƒ§X…SÔ¶lYIŠ|÷»Eµwß-šÂ„¦Ôß³gäÌ/~Q=ûlù÷–[ P÷ÜSP‚Û]wUï½WýñÕŠŸõÖ[Õ·ªßü¦ ²kWÇ¿?ûYÁÖh®río[8Ðûàƒƒ7Ýtý?2>hóøã‹_xá4Ó”.ðç§?­x úÛß*tºé¦¢5L¾ô¥ò-­Ÿy¦€yÛm¥ÝkXþú×êÑG«¡¡Ò''õm޼ùfµfMùDÅÿ¸L¡!Ûï_ù—¿“gûö¶ûG€è¡‡þüç3˜•RHB`R£ÀE‹ï¿ºúª"?pV­*šÂ2çWTÖ †6(ž|ò˜»qÏÛ·¸¶n-×:s饅9 kÓ­[WæB?¦›3ÆÉ—^*Ý^~¹`îÚçžëb2}L´ýáùgoy¤ûÕW+Ht$ç 7?¢ù)^‡Zs%݈J_ÂJÞô…/¦q"†rU`ABÒŽÛ.]:B­o~sä È@ÞŒ>õÄ"#$è±uá—¿<c9æËº9ö•p÷Ê+ÕÎ}9E}ëž~z™Ë¤$D~Ÿ¢ IB~_„_ ˆ‚ÐÐŒŽ!ã[¢jþ—3¬ïZð 0š-1J#sL z:˜Î·b”ñuåÒ'Èçý¨`Ø|:cL'Q˜L†c.g^àB£±û§â¤¢Ðþý !@þ¸í¨Oæà`Þ`rß}E† GHò;éDJ¤Ò׿¸Ü±¯L#Ÿ?y~ú=άB:ê gúÂ{ ÀLèA$ Ú¾2Ÿ|«mÜXfñ-ãrXˆéàì"Œc}„ß²uÌ´wߢÈ&›Ðˆlª8 ;s˜·¹ŽÃš‚%ùmÀ%iÈCM‘–<Ä#çæ-³ØQÜxúé=÷~{Û¡C/ýÏèß›oþ_{ËWuíA—M›ÝqÇYÛ·wƼÑÝõÔõ OkitÜ\À^†5 3áF5‰‘‚]xS°JRCu³˜‘‹qÅÕ‰Ó õ‘ê߸mÅŠ¥óæ>}zÕÓSõ÷Ï`zN±øŸ«å˻̙SŽÅmÇ:ôõõ.™dí¤Û’Á¡¡>%+ó!6ˆðP:jÐHð§/@~_Q'*ã$¨ƒ®lvLÉ2 å5¢°†Îµ %‹ùt!{ùLi-z˜Q ³qãªÉ¨€==Ý@èë+à°©Pc|ó Í'êš+žåßXÇIê7@穦o$ç4å8IÍ´OD¶–>Èã Å H:OŸÇ›—qr•Ï@Dlrd—§û„’ƒD0Jq®IÊ)¼ðùÜçJÜ0»PcP“-‘0-5ƒV×Z9öUÊK´'‰¸m@îv÷ÝÝS­ÒñYNH ¶dRʲN22š%™%K02˜ý+kÏs¹ÂÌ®b2€À'Eöofž¸ysïT3ì¡C³ŒÆy©6o^¤^¹tÐâJ¼’F<OHØY–¤ †3 « n|S‚0¬Yp):‘Çù\uÖYs¶‡N‘*™#Ü9<³³"Dàâþd`2\ò‰•&eàùe–àÚkv [# tAÕ‹èžEÇábLŒ<`ä°!Ušnv)@ çJ$í¦M«®Ùp•ˆ´lÙÙ¦ºŽŽ#Ë’ÉÇÃJ-nX{_³3ÖMˆÀ%ê3ùˆ[u”èÄ‘¡!¹Y’ˆ(!–ª .¦‰xÅû€Ð|-R H¬8)*~4~-i\þ‚󔤒M„&.JS³NdŠôáò"9!YÖyÇa°ÈUÉËñŽÅçüÓÉÔØBœõ;]ª3Ï,Päµx7­¹§¥.© ©Úrá…}Á+|Sð¤VdDfC@Xs€®ÒPgBb/J§z×@êf4/†¤Î𠆶âÃÿú¤E¶°H P œ V«W÷ÐÃM¤q„côŠ«ú|šW4“¯ÇÄyÒHO-ldqð ;,kdŒmTDÝh<% y1L̰ˆ6 ÊRS1kj Ÿ£S”F)gtS-^£”˅厷×(¬– +Ÿâ¦¡‡ÒVÌýÕñò¬;›*ùýü›°1¹âÝðŸ;·{J´E •L€@È´®®éA,ÜAÓ!gÒLª[޹à<<ÜßVø`ÝMµÄOE”IñŠRæM“‰0_u1Éa³sถ`³²‹)?y ƒ9ð! ó! 炼a…&öMl¯ƒ¹ƒœISÒè#RéLª¯ Ì bÀæÀŽ Y[5§­–楸Âs£9ƒèm@ˆÕÑ©ei6áV9ù(A/± J Êe0Vãº!3™×z$ÿŠÃp¡„wNÝœìš 'sqÎÞÜœ©kÔæ SC‚N¶bAn"Œ¥>ÅKÑ5*@KCò‡Wy\nœÄFmª+MÑb¦TmkYÉ,ð7~#Èwµ\uÍ5½Ypá6"¹K¨Ü¬¦š­Ü_x¶úá=¥ýàë¥=ñ/¥Ý}~õ=ë—óæõ®êÜ¡›?¿æj¡5«ã‹/ïC‰¬z$ˆæ1AªÖåª"g—Íõi5ΈB8)•À3£Á‡)y·“–¨SÅŠ‚Lv>9/ $%q¢X‡lÍæêÊ}V5È)EÈöø½–Wº¦ÿï´êª:ZUŸŒ×{ú¦­niÕ²Û« o6ø¯iÓ]è²ñÈI‰*”UKebAÔ¢Ôü3­=i!ÅèX@qC¾ ÂP¨ì¬ ÁFƒ$= æ)q¹˜Ø•­«Ž€JKxÄcw Áa°>ï7ðÑk‡«r¦«%3TöM²M»ìþéç_+¢ 9OÿL/±Ù1°$i VÁÁÓ'ls;à €Ô!vË%“O¯*Cúqgd*"ÓàB™ÀªóG5¤>¢“–UÕ¶+ >¡>Ø~Z!ç-C®úäÑ&^¡Pڋο¶wÎBõùææÛK.Žº¼áR‰®‚†ÜaåuêR³‡—$'Z’'þ±ÎJÇÀä̱ˆ p ©Lgj~ÉàVû—qý+¼ˆ™D…UÔçw¨ùÜÔSð¼|ÖÓ|ë ?ªyuÕ¿iWî&€¥Z³«õÛ5»`•ͨ`¥Fb»„#fµ:[´h¡y”øZTp ¤èæ“?:HåÐV0wm¸Ê"Ž 2©Ž€Æ÷qÏ·úäÚä»`u¸Žq.?§8£ÆpÀ¿ñ*÷î1$5$—œ9pž€¬l¹¾ÆêС—P˼ÈéBæi¡Ä¾Æ§”âžTˆ«úª^]±nˆÉ}¸9¥ c@Ú:Ð8 Û–õN•p<ÂxÂù„„Ù.ÀÿÂPcPX½ÓˆíÑÙ‹ç)€MU-[Ðhà’<éÁXf!¸Ô¥ÁŠI‚‚ ቇ̤åŽù#°¾cC±šæBÿB5û`%ϲ ]\®N’5þg;‘½€ÙNªv…° Ô¸Áˆ!$ÄŒOgp˜FÂWb;õ¡aŧÒÌ®œ3_K*ÑÖRaÍ«žžnË'ûûgpùòîlMÄ/RZÓ\&MìFb°ÎT·›4,Íö ñŠÝ!i¹p8%DûµÍX aÈ@ªø/MÉ™cŠÿbKJ¬Ôí܇ë¹*Q]ÈÊM½ðœâ.7 #6óŠÀ@`õÌ…H•¨•:üÙ"cnÃ2Vv?hަϔ€²„L°B€Ø%ÞgœìŠÔ»Oã&ŽÔ¢2ÝáV°5¿¯xä鉬†ÄöÄmt:\×íËnϳÙT7#H‚ÒÐ6»‚ÜWxµ`Awêö`…lŠ-¹!n™cR¦ñ¯å-ÓP>I¾:´¨V·²Î"V`1×ó™ÍvÈ ­¼Æ¿Ö¼K¾ØÕØ¡º^Êgǰ"*‘7Êr„1ÎÃ7æ¤ÄMJE~æ¿m,_½3Z·«¬T›yB é >T†018$Æ,KW!¸ÕX‰„àŽÕ¨eב#ebã¸Êµ)®’˜€œ-›ê-KHšÖPgóʰÀ¡f6{‹Á’­¨Àd$W1Z?‚…|0¼ú¨±X†ØáÑúRú˜´T€Uó°ì3\v¿j<Ì¡PfvÿÂ-ìJrj¬ûãOY¨“dœ’uÌ>C£ˆÎ=·‡å1QQÙ”Uo½UVe™ÓT·›4¡ÖW”¡´ @k¾•æßFb*º4nQuXˆjy -X¡kf÷X02Ç]î)ÐÕ!–‡Uò@EU–9PúaÃw|Å”z¦Âq-›zšÖƒkvqC ,\±R^S”¾÷^A̹;,òC²lmaà¨Âê÷ ]Â:‰œ©®³!"~Á:¾?•[ÿÏÆ,|xþÓËŒ†Í6²jÁlÉàÀÛoo¢s» \°J¼ V‚³x¥rÐH›Å™SQX *Ží3ŒÝÙ›?p¦r˪vÅÊœ®Ä(çG÷ãù„XiÀaš>(óº$N—G(‰4Õô×¾……H~XhÏkò„†ÐšÈl"Z¤'D0¦^ͳ45¯²¿'t§%Úgƒ4~÷ÎØ}Ñ`u¬5öÆi¯ê}†âƒ'T§~X·9¼d…Ø^"vÐD H‘7À³Õc"¡ ¾sÍÙ—-;»ÎƒáÎÀdJ ¯z×?5ùÆ['‰;F…†%XúóÊ`uåWgˆ'e'j¼FÇ–ó럈7AK ÛÏ;©lËã»'Þ6Zó”NVO‚- :H|'nY•ps™ \¢è¬ø¦:zõ¤c°Ý‘ki HøPÞoùJeUûã÷û¥ŸŒæPÇñå:Ä'ÄjïÞù¹œÇùRqe%{’OG´ßÿÊf²Ü‘­.Yû{žì•Ùk¢ÓÇ`µ¾«§eË·Ñ`(¾a¬åI¡SÓWxUc…½vÙE Çâ§Sœ$Vb£¤0Slä`C¶eŽ·ôè¬É§õÝ+)\R¸L£ ª_/B¶<`SóªÄ^i½‘ÙŸ_suq&»Á…xAoõÎR[žm3V¹‘‘]ß<’ÌšTÁ*¨+‹ˆ;î8ËB·kë§:szíÛ7ßN¦å¦LfÁŸ”"øìÀ,uÌ×”Ç(=†WâÕš]¹¹gƒ‰Æ—ÉŸÅ`vZiôš{Úìf¬„)øPMªÑ]1Ö|³Ì±o[°:th–ôí¤j'[ÇõÛj'™5KTD%ɧõÆ×VÌ¡ E$ìüÙˆ¨o›"výØÕVª FU‰`ê"•˜)mùònC‰Nõ™+Ö-@ªæx•zµ”èT¶h¾U¶ ›;ey®Æjã§×æprÏž"RÎÀzÙ3WžCæ§‚2‹â™*MÙÂøLÓØ ê–¬}%K¦fÐ~òüÈb6ëµqè”aœ®å| VqC,“ѨŽöÍÄ ¯ÈS/ÐjG£”Í(`!gnÜäYLŸ—d¨ÎîJ´´ä-ï³P—,äM$÷a¯óqüz:A;ï¯Q¼øàx­ÆjÌù+w·Ä+Å<§ûÏÿ(ì•b#¶7w€^hÜü°¢L™ÙT\5wC[\ðG¼ÊªVÐGH¾ûd€ºæšÞl°XrâÉk¯ïÎîtnÜÈ’y\œÌë'Ó„mÉ»rgªµ­{âVcK¬v¬R£rò1Õ¸-ÛÜÁâPôm¾½¾zõ%y娹™jø` ô9<\ž÷V®çqbÕ) )râ"íxámÞ2KôÎ7‰êŒÅ‚ÜJu0TºÃu’‚ë· ò.LîL•ÕÖÆçÕš]-X}2ºG!Bò”ÃcñoÞÓ¤rKU) ¨g43¨éòºž›7÷6?¶a_ñqYŒ{NõÎ œë`˜ÜÁ¹•Ö¾ºPÍK”×]7ò È£«Öö—@¤Ð²|¤« ãU ƒ¬»›«…„2FÌ íe•ôúµ¡jûöî±Οò^išØÍ7:'lH‹ÈâC^î#É ²ª´P©Ì ØåìÅó¬÷OÿLoÞžÍJÕX¼|em¹E•[ðÇx•;òkv)Àò˜G;V >¨to^eܦà>í|twW^àšüƒÜªžÛ¸C½jòÅgñéÕÚµ³&¹\bÄcâ<ŠfFrB8U Úƒ Vyû»xåŠá¥+fŽ`µaŸ¯\âÂtkÊŠFPJqUíÐ{ø†*/e¬^Ý“âó;÷Ífb‡ç‚Ï”ž=“I© Æ2÷$ï¢ à)8'¿®µDû¼È ÁD16ÔØ.΃ ´PbåµèÄ(¾)™–›¡Ën÷‰~R¬ÚyßæåDpÁ P?øúˆ!ð±"æ!RžŠ7ÑŸ3¥7„z"O&sçKŸÜKšê“H,˜Wnó>¯õr:É1ó8(¸`rË­]²w{ä‘naP¬Ã¡ÍÊÓ/«w¶ó*϶ñAÈçX9š¥ÁË/(%Æš¢°7÷¯ŸðÝÃö½S.@…ºT;q›;·¼nIÍVIوȖZîªç|¢ ]öî[ uuÞJHðo¼ˆ×•Íóöú*eÃáF•¥eŸ0/MËËuE'ÂË Â+a‡÷=öؼ½{ç?÷\׫¯ö<ùdÏþý -÷Û[¶¬T?C>Ýo2nÈLzæ6“Ù'åPˆ9°WrÏ#:V4-Å?pþë¿ûJ:àƒ÷lëáS²á裡ãÆö©£¸^ö dÿæg³±H…ŸyÃQ>JéŽäy5•ErW‚Éòî30ë g`aeÅ Ò¬²ÅÛ c>)áÄS8hY¼çξ<ñ.Ó‘2aÈʃ¤2~¶A˜>ûöuåMùØËhy;ÂÇ)Þ}·LíS¥ä#G×>¾¸~{Wtâ&FÛžîÐ͹“b>¥ÅÑQ" œ¼»Õò<ÌÓOïÙºu1vg¨ñàŸ–û’ÙÊ­g˜Hm4ºí¶Â¨¼ûÏЉ¢yjÚôÊ;qœ—¡Ë“ º'¼waêèïZ Ñòƒ-&Âm¤ Ïì‘°ùɈàa¨2=¸@šwÌu¶¤½÷ÛÛäVA¾ÞMÒ?oýÀMã˜7ÎxüÞòsÞ}kÙRêÁY'>¥OÞôñIfçI’,“wј<¤ÊôYPƒ(ÞçÅÛÔÛ@ËÏA4n¯¯š°`pbótƒ£–âbyf ˜ÑQŠÏ4DÔˆa¢> stream xÚí˜e\”ÛºÀ¤I¤aPJ¤)%)i)GJ¤C¥º$E$¥É”næzö¾*{Ÿ}cï{?œõåýÍ;ïzþk=ëÉ|} ¾5?3Pß1þnù?BýÄø»å‹ƒúeãï–ÿŸ8ß?ÿ;)ßþð+³…9Î:¾©‹¯ 9†2­òïÐëwÔ10€ZÚW­ôûø‹>ðsÛø¶üÅ»ïË—߆|sÆ×_ÏöµßÞÿáÏŸÑÖŸmö?ýù½þqtΟŒö+ øËí˼Žmq?Šßð¶ãƱŸa~$?|ÃÙ¾Åø±Ä‡úéÈôÓIýGóéÿ{àïg~=õ0ÿŒ_bÏß &¿žúç?O~²ùÇ ÷?où«u÷/Ž‘ð…Ñw"ÿJÈ7»µß †Ÿa§åü@Mr Ä¿eãŸ8òã¶Î¿´¶úiÓ:VeþóŒã^6üp>ÿëjàïg ~9ã¸?[ÔÏ2Plj$džü›o|+}|ù}\Æç¿=ŽHükÆ™ñ—ŽèÏ¿þæ»Ôì#ý©ÜúW7X?êô€¯T€¯3Žk[_/›þBÞ¿ïã úWÁÅøÎ²÷˜w}ßRþO•o÷Ï1P¿˜ñŸºÊ_„øÖ½àX•å߯}÷DZÓÝŸ¼ð{SðñXÇùüGPÇùü; ?Lüwüwüsã5îïO íïO±d8÷ëþr—ÄØÝ-8N#¿–â¶ŸgÌ]·§ânWð éí)ÌHvïF׈M×d_ÌŸœk©„Î2—¾<ÈU´ö ©šëUC}=™ò–°Ø˜óáÅ‘ˆñb%w%# ÄE¤Dƒ$Mš%1±I×ö iƒó8Ä|fpü÷¯ØwÒ´Ó±@,e÷S)€¬º;ËÕPÉÖÖ·6cI×Ýp/ 1×a¼`Dƒ 55)œ¥¥¢§}„¢ð؆×Á<¤q@¾‚MW†æ\Bç–ι;Ê Œbm´²$í¯4e½1÷•ãúÄ.AÅi£±Ó|㺖Lãæ9L’wæaE\c†B’’%ZA‰qrkX­LeLݵÜ!ûbâ bl+hPsDjŽ‹\(/'Çi]!ZTHêã¢$·ÑÅÁóáþ‚$ ¡Åè]茺 øÂbiÓ$ýÉ"|.®¦å*ìŒí–’Nеž™8Çyx˜HT •Å”tqÑÔiÏ9ëPL/mö¹å%—k-1H\.ø©ºý'³¯a¸fçƒÙõõÛ[ôN° hHþ¾¼Ó款û f\Üåz5µ eB×5Í»D^ߟ¯„˜Ì6Ò‘“¿ ˜šÒδ¼…[ 1.¼h×ߨh@Kb".wÞ ñƇêÇkoù@ +<ü;N© ~¦Ò-çÅÈÉ»¹Eör_äQ?íú]ŸÎìÇÜn'ÙžèS§Ù,­ Z)®7,³žt\ò#M¥/"àããv *ååëË͈}Ä|ò´ C‰Ý»M[Ü`‘VëóBbû´€º¿MÔÔ! .¾iÖ”’‹è"Û :ÂE ä+/)Þ\›J” Œ¤ ÓÜÚ*3¹hOt†‡ç¹AøVÊp`þ¬JC3 ©¿­kdãÔR¸m7Û£ Á#@™ÛqɦW„VB»zÃ#W¯$1Xwn?K¨;§P×Õš…¡vÉ—2DÛIÛ³nçl5µEã<ÃT1´Nõêñ¼%vò£®Éµ€™vÇÚôô™{Ô"GtærÕø^±gyÕ®ª/7ÏG_àõåÏ% `‚¶^KóA=$%‡¶ØöÊrõÛL]¡Šä½?Ù€©S¦·­@ù>æóŽà7q«·ÆœˆÎÌÏ×°€àÒz6žÖa>ͱ…Æ¥ÉÍ¢âØ„[=t¢k„I³tVƒ Ѭîî`{vujÐÑU¹E¥àqVχ<Í{ oF‹¥j\W"áï]ìíõæ{Ô)­ù #ö,Æ9¯­Ý\~¾Eé`?ÍÌ û…‘Jè¡æ¬cËeÃßàhÕ>ÜaÐÅmŒå».óø<“–;Vý LD®Ï*”éh'RÕm^¾NÝD­•!l”J¶löP¢)T0ˆ#$êÈÁ5JѲ\²îgÓeÐCã±*ž&@¨XˆM"aÌ~n­a’À²Ûfcë¨\7 £ù,BëjýåvƒXu‚Æ_L¶.Aªn¸• ¯Ô”G÷Œ”ÇÊ:® AÐÏSñ˜í¦„¡Él €ølUK-Û3E#1Xêvíž‚Á«)£#b ¾'q „Èj>ÈøÄÉvÊ‘têwô,rš¸³î^­9Û\ë< šoHJy*//™ìIV6ú(â'¯ž@¸´¶7k÷\9OL$\üâL ÈÅjÜó’Vg<óØ»ÎP¦•¹Èr¥âZ±jIùÄkË*|“2è„EV@ûå^Ú¹Å9[œË¾¢¾5KÖEóÛÖi¬¼aæ £wÂZ^}vדDî@¢þ!g¼(VýñÅ—èØîä2ý ¸¼ç|w¢Ä[[e¬¿;~ –Í#‹ê9Û¦6 »*U:¬éhÈTûÉ“"zh ¡Ù­¶ÏòFÜ1ž“›^Ó×í’Ú|@8|¢ÄwÕçhÇЙå#1´½Yôªââ©J)³É† kéKv’ypýé[Ö¾~%Ú…Ïì„b#¦éxD“9\‡·ƒÛHeø2zgF<%ÎEÈ8íkz™j±Òé› étþYFoÖˆm^*x›“­Ø¾£K!ëáð:4ž;wî9ÕîØõ‘ cM é{ýTXW|*à£PYmmb}ãÞTý Èð=Ù¾ëIÌj7ÌS±è¢ ÄFÄÞ}̶œŽÐ+£™…MÞ••dc/÷ijt•±)Šw!bzñ«jh&\¬;2˜†;>ÍÞšFÐ_1Í8ÂßÍ¥ÖÍÌ.[gÔcn·ûØMüZ#LíÑ;ß›.$H˜¨PÍlÍÑó'd"‘”·/ˆ-aWbÅS5úH¡Ï*¢sEbhú•™[Ë÷.dE¸4]O¨l.[&Ýa^á›]¬³­ÓœfVÔ½ee|²†«5Dü‘!ŒØììû²Öt d|#´ÚÚ9¥©oÄÄã'gÅÎdX§1ß”ƒ‘‹Ã¸¼ˆO+1Z ÓòÕWHò1‡ÞFŽ©8®U¢1úГîC|f…]5hj\¨lS=ž‰øPä5µ¥;äVT^%·wB¶ eÇKgvõÖ9‘t9û…•Z½å‹ï{~4°éöc‡0¶›¢« 5G¿ó¾á8by œË¹ nÅtëÏÏkŒµ ªë_ˆyj×1~w>2JçÁü€=¿<µð‘X(å ˆ§¿òàIÀä>ÅI–ësW…Að³¶ÆY ’xEƲú„ä ¡–[™/…ʳvº»zyM:Gx¯N7þ!G¾ÄˆËÑ€?|ð_¿tËAá^€Ý‹ÆÉË ÕõôØ“>ÒÒÚ5®3ôynÅÖD˜«KiÌÑÜjÉàîÜѱu×ônoH©ýõ-þ‹c@#{Ö·c“2cŸu5x!yê(ÂÈgÃò"—>O¿pã¿™»S"¢¤ ÞqÜooEiÌLé<„•©N“pl. Û+:h!Ü:#ât_{Ÿ×,ÏÌÙ­Dò|ÞÀ ÚDZIwõ-,hÑ ‡}š-ݦ-ήÈk¦0,ÞYÙæf¬—:“‰e·‹íM5ʞ㫦à•_ºå—·ÓfÑ×÷üìŠÂæš0eåΡòô\%}Ô¡ø#ÂÑá.ñãÏÆàÆN2Xdð(6¨¤EúÆ KQY£½¤ªªœªíC§(u…—Ñ9{äห…ÉZØÅÂÊ„]Ê2ê:V—ìªv·‚ÜE&³„wG !¯+wï_˜5ó+›ê ½G¤*¬>Âý%°0B/Bßìt'[< ÀÇ ºìÖ4—þÊy4àeC¿X@Ë›P•£+¦hŽáübú«lv»³ˆ+”c×vÓ{nDÜ'hIKoÙ’®žÔÚ¸_;²ï™ôt¡<';áùEsâŠu},s2º°ÛEžÖ«ëË.õ cÒÑCc´ï8©´ÆQs)!R÷…»•ö–*hRLè>Ja„s³ \ýç$»µzo=³t¶,¡•Ÿ½©JƽÜÅ#õ .Ó+üÀ9!‡)a¶­QÔ«3æã &)½âÃOW+˜žž'ii1ødá/Uˆ"žÂ_DZÚ¬‡/±ö@ñ%Íìj}eÁ"õ§zêóäš4.W¹ÍÖé%$/(-"ï˜t&ð¨y»)5¶a-ý›±zBuØJ2äÈpoµ¨6) ’È,åõ¯#”Öõ2·&i¨¶j;É:o)¸÷÷cFxÒu/2!nß±Ý"è¡ZpY9ü\;ºŸbtC/4Tu¢Œ<ë{±4­¼=’ 2² f—Ô~Ã^³Í35Õ9ß–%w­“ûøñ‡0‰ø4Ï=õœ«D^Ñåär CEEPï(×*‹±÷"-ãJ¤Q*Ëùùˆš«Š·ÊÙ¡µÁïä{cz¦Áykk/çĤL ÜB¦¡ÞÒÙ{Ì·él7 ;L°*oS³;a·6V™Ÿh+±_3 Ælî°Å]žóêb±¡úâTá¬Ô :¨Â9üÂl±ðdGLÙJÉéPëá"§$ÄëSEV(˜Å¹²ÚMnÄÍFŠÆ ªÑüxÁ­…w¿+6¦f˜Ùð|ü—ÆYÜK­`ó’â(·¹ÿg’°×kשsmVbIØ8lã5ÔN_ u>½àœ:ó.i‹À/¼“ˆZx_Ó( LÂYêXlžRbãj1wèdÕ"žŽ ^—bf¼þg3+©•ÝÅIUI¼Fl\¯ŒÛcÐW,UdÑbi³Ð E¼wuU­ÞF\.B­ˆÃü$´uŠñÈ5Þâ˱l@ì̽ž9¿iô“‹Zîäáw"·†æ«4Õ’ESú›q(ÓÌq²Ç·¿¼’.n«ˆÍLY-÷XŒ ×Y >Í­²´¥J ŒçÚ}$•ÀÊšCn²$sÜ p=ôèMÜæe„Wô8©Ò_º"ö ¡OðÂÝ E…Kg…ÿé;ñOùñô(†ZÁè¢2DçÀY̱L¦³Ä²VŒž‡Aº—?`tš‚»f½Øa«‡ieiåÛ(ìYF)© —eˆé±Ç%ÄlãMlêwÒO¦§o›NĽž5ªU§œnV4”¼¥˜p£õ–µÓÍ¥.1hDxÖãP0="TRV5a°Ú‚ÅoéG((Õ.4Ñêm¹8©z¿Ÿõ[¬eÎ'/ÌS³îN»| §îrQ"¨XMr˜$Ü £å⻩Ši‰ÜÔF4µš4sìkÇ_†FŽdbK24«ÍÉ’ ÈÝâ°]šé`§$uM¯9¨ßO“ê¢%!‹IÏ<èÂç뻺¶f{Ço ÛÍJT㰂ళˎl*‹³úèNž¶jüá`¡RûåêÞñ9ë:Ö*ՅЕÝÜêt{ Ávlƒ#­H]÷TF$§ùÝCn-N0Q2¾ˆþðäx-4„ôfÙ£\›ð\ZpN”lLðÁ&“Fö­uµôÅÈóSk×gŸƒ§ÅRCén\>u/ÊØVN_&w I0/ër-y{þÃ“Ú á$Ç£þòûè­Ì…n0}äl,¶”ËÀa%3Ê Ë(ñ\ UW_ÅÖ—†Èá¼µYáÏå1:œ•ƒÔ|6=cr–²`µ´BtÆÌâÀÞDîÕ€ðâ¢B4å™²ÔææüÌüC¨“Ó^×Á¹!è¬GöÂÙÃh³‹ÓÜ0â7^0¸VÛ] ¬…‹x¾Üù¹d²g*I…hVÅÁå0=¬ è‚;[Ø4BZÈy8¿²SÛ€ÊëŠEÖ­¤$š¼{/óæÏpko¯nîSEäô“$B ªõßÀ‹§oRR(ê-½£Ó¼M–—iÜàÐLó™=ƒ3äK½ÈèÕ¯NÜÄDSX›MŒ$ã\"çî´/)sníßd’†®îÆÛjUÝ*ñ–|Q•Μp›ÐúÔĩ肇8ÿ»ù)Œl0˜Y06¦ì´™¹+ÿA·´¤®År{Œ®€¤TŒBq©ÕÌg€Kçáðýå`ÅÖ}ZÎ[þ·=½Y.ËÑ5„åïøHTÇå³ú«lð)=Kzø¾ùàÙ¥…jmb5/ì\È™S…Ecã)µÁÓ¦Z 4¨í–ø"ª‡Ì‚(AÝ6z²²ñÛ6rÉ)b‹‡ ãÊájÛ[›|¦ææ{¶…&áó#•³&Á4ãÝûÉ[””¢a¤gàÃü§¨¦tí©©?vè¬/Ǻy,ÓgZ„µï›<ŽþW³.ûR{ÅÖ.¸QäâC3…®Ðúþw•òÎã¥w\Îîè3ãO¯ÕRôÜÃ'dõgGl- ·Dì«¢;oO>Úª^ïqÌñT)+Öטâ­ô6âf1aïdõçx[²ê/®(´³7V•-#Ÿ`rÅj¬õÌÔ‹øŸkiooþ[.꼬t)yÉ Ö O2SÄ}uuu¯µ¹OÚà•S,Ј©KÎgavL€šª‰I€&%w¹(.Íô÷÷‹¼r}Ü·@¡²¸U‘ä²;"[q¦s™Ž30)b?èEÏÐèéó"£m {íÄZjÆŽ§cšë‡Êf,¬æÙwÑ_uœþ°÷¹ä Tž¿Y\¢)‰¾ˆ­%A7bmÓ—Æì¶Ñç/»<õÿDšjcÞ¶¦3€—«)Ô—RôÛÊi/"*Sç­/Ñýa\RC“áÅöÊ£I¢úwÇž7ûõÕ û v@Çm*«ÜTÿÛŽ>«½§ðŸÀ*NNwjj N(YZ< ï7–±@+óî ¤L¤TŽS´à*êµNö™C’ÚŒïUÂ%²¢+uÅåh™ŒBëϼoý­}æõ-wLXÃX“Luh¢j¨nØ$ž‚®Õõì¬%-…ôY™J78}®KÀ8½êªòRôè\µ…s`Š1›PëFI»•m܆ð·7ÌÈ:â©;2Ï'÷8Òù<öœk”<I*~>ïUSuuk ¶çÒŒ7>Å2ŒóMŠeX”¶sB«»Ü÷ìŒßê~½PÊÁù_;o;è!¡šnk˜ç~7š¬ç…kð§>š €Œ‹K›>»ƒpÒ®Ö®¼ú¯Kùß.=úz½=o”¤ äfi(5–C™Ôá\øx›óúFe« ™§¤ ö‡ê=±]Ãb³·å®›-è–[~x&ØìúL%Ä~õêji#ž9gÓéÜ»@Óhšh»Ñ¢Ã–êâÔrÃ}[s®\ë¶|•âçõÅ’®C½v4ÇÛŸNK|1Tò<Ž×âí@¡CÝ*ÚŠ>[.óÌ}=oh*~^ήÄ$ ìCêLßΜTÁ¤ó]¢MEœµ²2TY~íádýºÅ¥‡X\µ ¡x¼ïë åU—mÕ ¸-â…k7ñpœZ9&ØÚïÜ2ÆÄiºÐÀ^ñ¹ ÀÏå£=¤¡Ý×6͇Ûljnûyb*„pZÝÛ[ºæ÷„–(Ä·û<ä‹ñ^½ægáŠöÕã®ZYÛˆÅO6àwÏ€î„âÄ i`(ã§ÏÈ£¸Ó¶&Í"J”ªã˜gÎ,3ð?=%¤´áOæšk§yÝ‚ªàlܰb¬Ÿ·66wíU¹Á`I9CmíQòyäóJ€0±•u\Ã*Ö ò,F¬`M¬8xÅm†Èë\“¨%Uxžå¨F¦ïzƒÃ­¥ÏVž Cj£Mb°é¼5ªëßbM’óùûÂÈå "à/ÞI`i•FŒ‡s× Vùµfjh$?7ÉMN6‚…e Îà”Ž5Å­"gìòu•ÎñéªêRç>ŸŠªÀÇñ¼V\)FžƒžˆA,yÔ÷es½{¨üS+IÄÏûVÄZ ÛÝvŽ_S vFrM+&ì.kZÕô™VºoÆT˜|ò‰ÜÛŽœC»Xæ/‰Í|=§%È­NÝïB’Zu®Wñi?ÔÓ®gà´Ý>éÑGpå•«&âÃHK÷ÊËLì´Kn$, #ïI¨3Eä)å¤+ºšš&ALäd˜˜µyV!à~ïŦêúª±HoÅb+ %îÍŒP&ËÐûP·¨ðaP¨Þ•<»m¡Íæñžq ƒ”êy=Ôr#œŸ»R?·D³«ôÄå\ žµó$zÀ6?\¾q¾Rñ¼Wƒ‚™::!…1\ueŒîFïY'ˆ5µjdÞ“Å%2GB+zeÉö¬(¸hŒå¨Ôé9?}™ñ?ŽäÅ endstream endobj 3449 0 obj << /Type /XObject /Subtype /Image /Width 828 /Height 272 /BitsPerComponent 8 /Length 69666 /ColorSpace /DeviceCMYK /Decode [1 0 1 0 1 0 1 0] /Filter /DCTDecode >> stream ÿØÿàJFIF,,ÿáèExifMM*bj(1r2އi¤Ð-ÆÀ'-ÆÀ'Adobe Photoshop CS3 Windows2008:09:16 14:10:05 ÿÿ < &(. ²HHÿØÿàJFIFHHÿí Adobe_CMÿîAdobed€ÿÛ„            ÿÀ5 "ÿÝ ÿÄ?   3!1AQa"q2‘¡±B#$RÁb34r‚ÑC%’Sðáñcs5¢²ƒ&D“TdE£t6ÒUâeò³„ÃÓuãóF'”¤…´•ÄÔäô¥µÅÕåõVfv†–¦¶ÆÖæö7GWgw‡—§·Ç×ç÷5!1AQaq"2‘¡±B#ÁRÑð3$bár‚’CScs4ñ%¢²ƒ&5ÂÒD“T£dEU6teâò³„ÃÓuãóF”¤…´•ÄÔäô¥µÅÕåõVfv†–¦¶ÆÖæö'7GWgw‡—§·ÇÿÚ ?õT’Uú†QÃÀÉË õ=O´0¡Û_·æîÚ’› .g¥ýkÍÌû/¯†ÚŽe9 ÜØn;qÁúæ.#ìõ]›üíL}£ý¶þeoñ†çÜÇdb1˜¿gnE»,{®kN zÕ¶1®¦¼k^ï²ú_jûGøKÒIOh’ä®úãÔ±+{sð±èÈuX¹4m½ÖVÚ²¯n ¾Õ`¡»,IJÆ=þ—©^C?™þmXéÿZz†oRÄÃû Ë±Ù‘{Þ2 h{òéf͸~uØÜZŸÚ6tû,®ïæ½_R´”ô©.:ñƒöžžü¼l!“crꥸÔZ,±Ø÷Wöº¯kZßé~‹mgØ>Ÿ¯O¥ê- ¾µ‹ñpr¨¥–ÕŸÔŸÓë{l–šÚ솳1Ž ;ýJñ}OOþùÄ”ô).C3ëëðþÐë°¿EE9nõEžÑv=ù˜x”_,“3ÝÓÞÊîÿ¹VÓ³ôµ«­úÇÔ²s®éØ8t»&»²ZÓuÎef¬_²5ï.e¹·Ýn}u²½»+þwÔÿ’ž‰sgü`tŽÔ­é¹8ùV]FÒçTÚËö¶Öí6_[¾‹ÿqŸ¯‚ÛkiÃ,«+ì?cµÏÑîÌû+ïdzÛú<œ\|ß´×[}O´ÓMÿè¬\OøÁÿÅvwŸüõZ±ÊbŽL†2ۆسä0‡w·¯ÿÇW Ü\ßó*ÿÞ”¿ñÕè÷7üÊ¿÷¥yzJ÷Üpö?kOï™|>ÇÔ?ñÕè÷7üÊ¿÷¥/üuzýÅÍÿ2¯ýé^w›Ó‡‰’ûkµ¹Œ/k+'sb×îo³ôo©ßÛDÊÄé·u*q:Eî}7zläÀ,wèݻ۹¬s½ÿõÅÁÊš Hĉž1ÅÁdðÏŠ_¢Èsgáôþ—¯å}ÿ^ÿqsÌ«ÿzRÿÇW Ü\ßó*ÿÞ•æÙ؇ 2ÜW=¶š]·Ô®K]àæÏòP‘äùyDJ6D€×¡Y.k,I ‹êükt û.nšý ¿÷¥v÷·#¬†sö‡r†áº%|úÿ ï^ùÒ¿ä¼?øŠ¿ê«sx!ˆDÂõ'rØå³K'i[?ÿÐõ œŠqqìÉÈx®šš_cÏ`9áV»;¦dcdWè¤S»&»ZêȪÃmev5–5–ú7µO«a¿?¦dáÖàÇß[˜×:`;úeÿ1ÛÖu:ÂñêVÖeÒÌl çYkšÊ­ºæ>‹®ý%¶YVUµ~Ÿù«=+?I]~…©MSÓ~¥¿øOiu8O 1öd´»ü–ú1^÷úöQs™û?옮~5ïý[ÒVGüÖQkCëîõkÚ,hÒÆôxµ‚éWkz}”ÞÚ¿Ð>¿QE¿W2jÉûe9 u͵ù e»ÜÍλ"ïM¡Ïw£]¸ÙÖÓo§ÿj*ÅËô¿CèØjº³4fgÊ/m/Ȫºm;í{ë4Ùm´ßVKœ.Èöd;ÔÆÈýýoÔõ[…õ%´;)£Ð¶ˆö€âÁKn³g®ö{q÷gúþžUî­öåúŸ¦õQ¬é_Tú‰-5×cíÊÈsö<ämô:…&ÊžË[êUéåcîô/®¿ÒVôÖý_Í5fcWuC©Vúr aÝ[ûÜ]F®mŽv6O¥²ÏÑÕ{>ÑúoRÊnú³”ç=ôæ Ç(ÚOÓ½×·&¿w·')øïwý©Ùÿq©IIq°>©ç ,Ū‹[’êóqzp},jo£l6¿²5Ôcþó?D¼ãü`ÿâ»;áOþz­zE; 9¹8ײê˜o ªàZ[^GÙ,±­u-ÛíÈÃºßæÿíOüé<ßü`ÿâ»;áOþz­\ä??Ý?œZüßó_PóÊÞGMªœ¦æc‹m¯n3È¿éo|=žÝí¯û¢¨®òþ”:xƯôVÝ”=H'Ó-{öûkÜê¿wú:ÿ¯å@DA”xŒgíJù¸¸£ÿA¥ˆ€I±`<|^ („é$¥cmâ_ÓªÃË«'Û“kZ1nYs·4=¿ÈüÕQ[éy®À˃™B¦ÕÚÐæ{ÿFÿk¶{íU\w8º’LàÖ†·üÕA'¡á— ¸Œø‡pJÇþK†0‡þÉ" !¨±b¸kÓûÜ_¤ÁÿAß½ó¥ÉxñÿÔ5xþƒ¾{çJÿ’ðÿâ+ÿ¨j©ñ–e³É~ŸÑÿÑõUÈd?¨}›+ì¯Í9å/´‚o,‡dý‡ÑÿG‘ê}ìŸaý'Ù=Oø%פ’žq¿oõñ©Ç²÷cçík­粟³\ûòwÝ“7ÕûCÿdcœÿç*ýFËʦžn[ò=Áã3pÉ|Zj¨µ·³ =Õ;Ôõ}µþ«¿ùµÕ$’ž<;©»¦±Ù®êÇ#ª±ÆæÖ/6Qì¡ín?é]{iOýìïW#ô¿©ØŽúzæ._ÙŹ6‹©û6öÙ].É»*Úr½[¿œwKǪ¼{.é.õ1ýUÔ¤’ž3ö¸ÙUÝfmwÙŽÚŽìsZú0[}´±ÿªzµÚ짾͟iûG¬®zS*áöïµ2Æg²‹= .¦§T1™¾úF5£õK¯¯¹ÿ ¹öczž§¨ºt’SÏu::­™^Ìo[ôxe¸{-µŸ¥5]ý†–â[g¨êÿHïÒ2ÏúÚ…¹G/3í==Ù¦^K××]‚¼wzØÖ¶á_§MÏ·Óõ_üÖvË=ÿf²¥Ò$’žN›zƒ«©À掠êð]]‚àpiÊûmGõM¿Ï7;Õý5à¿Zû"â?Æþ+³¾ÿçª×±¯(úóѺÎWÖœËñp2o¥â­¶×SÞÃV×m{[ír·È2›5é;ùŃšã /PòJÖTÎÀ«"œ[63-žÃŰæûqÞÿ§ôÑ¿æïÖü«Ìÿ¶,ÿÈ%ÿ7~°ÿå^gý±gþAhÏÚœxgÃ(èxeÃ!éõE£剸‰Üy4âãb^/ªÿ¶4¸U^âöËæ·ü”ÿê¿Ò¦=+2¼êpr˜píÈ,Úo­ÈØ÷C]í÷{ÿÑ?ùß¡b'üÜúÁ¯ù+3^AgþA'£}j˳ÕÉéù×Yw¾› $6v~näÀd({°:NäG¯ŠGõ<#äô~’ólûr-Gô¯l,ÊÌé?né8ù ·ó²ç×;^;[ŽÝ»šÿ~Ïç?á©YËCþnýaÿʼÏûbÏü‚_ówëþUæÛäQÆ1ÂÍÇŽTrLpÄåœb!Ç>Òá‚ÙŒ’ýp–;ðÇ÷\×ý| ÷Εÿ%áÿÄWÿPÕâú»õ‡k¿Éyœðä¶tÖ=;ikÛMaÍ"!­–¸*¼üŒ(ƒ©Ù³ÉÆCŽÁnÿÿÒõT—Ê©$§ê¤—Ê©$§ê¤—Ê©$§ê¤—Ê©$§ê¤—Ê©$§ê¤—Ê©$§ê¤—Ê©$§ê¤—Ê©$§ê¤—Ê©$§ê¤—Ê©$§ÿÙÿíôPhotoshop 3.08BIM/8BIM%ׄž ':ue€·ÕtÕ¥ù²8BIM/JÀ$HHÐ@dÀ°'jpg ü8BIMí,,8BIM&?€8BIM 8BIM8BIMó 8BIM 8BIM' 8BIMõH/fflff/ff¡™š2Z5-8BIMøpÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿèÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿèÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿèÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿè8BIM@@8BIM8BIM?<UEang<nullboundsObjcRct1Top longLeftlongBtomlongRghtlong<slicesVlLsObjcslicesliceIDlonggroupIDlongoriginenum ESliceOrigin autoGeneratedTypeenum ESliceTypeImg boundsObjcRct1Top longLeftlongBtomlongRghtlong<urlTEXTnullTEXTMsgeTEXTaltTagTEXTcellTextIsHTMLboolcellTextTEXT horzAlignenumESliceHorzAligndefault vertAlignenumESliceVertAligndefault bgColorTypeenumESliceBGColorTypeNone topOutsetlong leftOutsetlong bottomOutsetlong rightOutsetlong8BIM( ?ð8BIM8BIM8BIM Π5àc` ²ÿØÿàJFIFHHÿí Adobe_CMÿîAdobed€ÿÛ„            ÿÀ5 "ÿÝ ÿÄ?   3!1AQa"q2‘¡±B#$RÁb34r‚ÑC%’Sðáñcs5¢²ƒ&D“TdE£t6ÒUâeò³„ÃÓuãóF'”¤…´•ÄÔäô¥µÅÕåõVfv†–¦¶ÆÖæö7GWgw‡—§·Ç×ç÷5!1AQaq"2‘¡±B#ÁRÑð3$bár‚’CScs4ñ%¢²ƒ&5ÂÒD“T£dEU6teâò³„ÃÓuãóF”¤…´•ÄÔäô¥µÅÕåõVfv†–¦¶ÆÖæö'7GWgw‡—§·ÇÿÚ ?õT’Uú†QÃÀÉË õ=O´0¡Û_·æîÚ’› .g¥ýkÍÌû/¯†ÚŽe9 ÜØn;qÁúæ.#ìõ]›üíL}£ý¶þeoñ†çÜÇdb1˜¿gnE»,{®kN zÕ¶1®¦¼k^ï²ú_jûGøKÒIOh’ä®úãÔ±+{sð±èÈuX¹4m½ÖVÚ²¯n ¾Õ`¡»,IJÆ=þ—©^C?™þmXéÿZz†oRÄÃû Ë±Ù‘{Þ2 h{òéf͸~uØÜZŸÚ6tû,®ïæ½_R´”ô©.:ñƒöžžü¼l!“crꥸÔZ,±Ø÷Wöº¯kZßé~‹mgØ>Ÿ¯O¥ê- ¾µ‹ñpr¨¥–ÕŸÔŸÓë{l–šÚ솳1Ž ;ýJñ}OOþùÄ”ô).C3ëëðþÐë°¿EE9nõEžÑv=ù˜x”_,“3ÝÓÞÊîÿ¹VÓ³ôµ«­úÇÔ²s®éØ8t»&»²ZÓuÎef¬_²5ï.e¹·Ýn}u²½»+þwÔÿ’ž‰sgü`tŽÔ­é¹8ùV]FÒçTÚËö¶Öí6_[¾‹ÿqŸ¯‚ÛkiÃ,«+ì?cµÏÑîÌû+ïdzÛú<œ\|ß´×[}O´ÓMÿè¬\OøÁÿÅvwŸüõZ±ÊbŽL†2ۆسä0‡w·¯ÿÇW Ü\ßó*ÿÞ”¿ñÕè÷7üÊ¿÷¥yzJ÷Üpö?kOï™|>ÇÔ?ñÕè÷7üÊ¿÷¥/üuzýÅÍÿ2¯ýé^w›Ó‡‰’ûkµ¹Œ/k+'sb×îo³ôo©ßÛDÊÄé·u*q:Eî}7zläÀ,wèݻ۹¬s½ÿõÅÁÊš Hĉž1ÅÁdðÏŠ_¢Èsgáôþ—¯å}ÿ^ÿqsÌ«ÿzRÿÇW Ü\ßó*ÿÞ•æÙ؇ 2ÜW=¶š]·Ô®K]àæÏòP‘äùyDJ6D€×¡Y.k,I ‹êükt û.nšý ¿÷¥v÷·#¬†sö‡r†áº%|úÿ ï^ùÒ¿ä¼?øŠ¿ê«sx!ˆDÂõ'rØå³K'i[?ÿÐõ œŠqqìÉÈx®šš_cÏ`9áV»;¦dcdWè¤S»&»ZêȪÃmev5–5–ú7µO«a¿?¦dáÖàÇß[˜×:`;úeÿ1ÛÖu:ÂñêVÖeÒÌl çYkšÊ­ºæ>‹®ý%¶YVUµ~Ÿù«=+?I]~…©MSÓ~¥¿øOiu8O 1öd´»ü–ú1^÷úöQs™û?옮~5ïý[ÒVGüÖQkCëîõkÚ,hÒÆôxµ‚éWkz}”ÞÚ¿Ð>¿QE¿W2jÉûe9 u͵ù e»ÜÍλ"ïM¡Ïw£]¸ÙÖÓo§ÿj*ÅËô¿CèØjº³4fgÊ/m/Ȫºm;í{ë4Ùm´ßVKœ.Èöd;ÔÆÈýýoÔõ[…õ%´;)£Ð¶ˆö€âÁKn³g®ö{q÷gúþžUî­öåúŸ¦õQ¬é_Tú‰-5×cíÊÈsö<ämô:…&ÊžË[êUéåcîô/®¿ÒVôÖý_Í5fcWuC©Vúr aÝ[ûÜ]F®mŽv6O¥²ÏÑÕ{>ÑúoRÊnú³”ç=ôæ Ç(ÚOÓ½×·&¿w·')øïwý©Ùÿq©IIq°>©ç ,Ū‹[’êóqzp},jo£l6¿²5Ôcþó?D¼ãü`ÿâ»;áOþz­zE; 9¹8ײê˜o ªàZ[^GÙ,±­u-ÛíÈÃºßæÿíOüé<ßü`ÿâ»;áOþz­\ä??Ý?œZüßó_PóÊÞGMªœ¦æc‹m¯n3È¿éo|=žÝí¯û¢¨®òþ”:xƯôVÝ”=H'Ó-{öûkÜê¿wú:ÿ¯å@DA”xŒgíJù¸¸£ÿA¥ˆ€I±`<|^ („é$¥cmâ_ÓªÃË«'Û“kZ1nYs·4=¿ÈüÕQ[éy®À˃™B¦ÕÚÐæ{ÿFÿk¶{íU\w8º’LàÖ†·üÕA'¡á— ¸Œø‡pJÇþK†0‡þÉ" !¨±b¸kÓûÜ_¤ÁÿAß½ó¥ÉxñÿÔ5xþƒ¾{çJÿ’ðÿâ+ÿ¨j©ñ–e³É~ŸÑÿÑõUÈd?¨}›+ì¯Í9å/´‚o,‡dý‡ÑÿG‘ê}ìŸaý'Ù=Oø%פ’žq¿oõñ©Ç²÷cçík­粟³\ûòwÝ“7ÕûCÿdcœÿç*ýFËʦžn[ò=Áã3pÉ|Zj¨µ·³ =Õ;Ôõ}µþ«¿ùµÕ$’ž<;©»¦±Ù®êÇ#ª±ÆæÖ/6Qì¡ín?é]{iOýìïW#ô¿©ØŽúzæ._ÙŹ6‹©û6öÙ].É»*Úr½[¿œwKǪ¼{.é.õ1ýUÔ¤’ž3ö¸ÙUÝfmwÙŽÚŽìsZú0[}´±ÿªzµÚ짾͟iûG¬®zS*áöïµ2Æg²‹= .¦§T1™¾úF5£õK¯¯¹ÿ ¹öczž§¨ºt’SÏu::­™^Ìo[ôxe¸{-µŸ¥5]ý†–â[g¨êÿHïÒ2ÏúÚ…¹G/3í==Ù¦^K××]‚¼wzØÖ¶á_§MÏ·Óõ_üÖvË=ÿf²¥Ò$’žN›zƒ«©À掠êð]]‚àpiÊûmGõM¿Ï7;Õý5à¿Zû"â?Æþ+³¾ÿçª×±¯(úóѺÎWÖœËñp2o¥â­¶×SÞÃV×m{[ír·È2›5é;ùŃšã /PòJÖTÎÀ«"œ[63-žÃŰæûqÞÿ§ôÑ¿æïÖü«Ìÿ¶,ÿÈ%ÿ7~°ÿå^gý±gþAhÏÚœxgÃ(èxeÃ!éõE£剸‰Üy4âãb^/ªÿ¶4¸U^âöËæ·ü”ÿê¿Ò¦=+2¼êpr˜píÈ,Úo­ÈØ÷C]í÷{ÿÑ?ùß¡b'üÜúÁ¯ù+3^AgþA'£}j˳ÕÉéù×Yw¾› $6v~näÀd({°:NäG¯ŠGõ<#äô~’ólûr-Gô¯l,ÊÌé?né8ù ·ó²ç×;^;[ŽÝ»šÿ~Ïç?á©YËCþnýaÿʼÏûbÏü‚_ówëþUæÛäQÆ1ÂÍÇŽTrLpÄåœb!Ç>Òá‚ÙŒ’ýp–;ðÇ÷\×ý| ÷Εÿ%áÿÄWÿPÕâú»õ‡k¿Éyœðä¶tÖ=;ikÛMaÍ"!­–¸*¼üŒ(ƒ©Ù³ÉÆCŽÁnÿÿÒõT—Ê©$§ê¤—Ê©$§ê¤—Ê©$§ê¤—Ê©$§ê¤—Ê©$§ê¤—Ê©$§ê¤—Ê©$§ê¤—Ê©$§ê¤—Ê©$§ê¤—Ê©$§ÿÙ8BIM!UAdobe PhotoshopAdobe Photoshop CS38BIMÿá¨http://ns.adobe.com/xap/1.0/ ÿîAdobed@ÿÛ„      ÿÀ<ÿÝhÿÄ¢  s!1AQa"q2‘¡±B#ÁRÑá3bð$r‚ñ%C4S’¢²csÂ5D'“£³6TdtÃÒâ&ƒ „”EF¤´VÓU(òãóÄÔäôeu…•¥µÅÕåõfv†–¦¶ÆÖæö7GWgw‡—§·Ç×ç÷8HXhxˆ˜¨¸ÈØèø)9IYiy‰™©¹ÉÙéù*:JZjzŠšªºÊÚêúm!1AQa"q‘2¡±ðÁÑá#BRbrñ3$4C‚’S%¢c²ÂsÒ5âDƒT“ &6E'dtU7ò£³Ã()Óã󄔤´ÄÔäôeu…•¥µÅÕåõFVfv†–¦¶ÆÖæöGWgw‡—§·Ç×ç÷8HXhxˆ˜¨¸ÈØèø9IYiy‰™©¹ÉÙéù*:JZjzŠšªºÊÚêúÿÚ?üÿâ¯ßÌØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»?ÿÐüÿâ¯ßÌØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»?ÿÑüÿâ¯ßÌØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«²éŠ»+vlUÙ±WfÅ]›vlUÙ±WfÅ]›vlUÙ±WfÅ]›vlUÙ±WfÅ]›vlUÙ±WfÅ]›vlUÙ±WfÅ]›vlUÙ±WfÅ]›vlUÙ±WfÅ]›vlUÙ±WfÅ]›vlUÙ±WeÓvV*ìØ«³b®ÍŠ»6*ìÿÒüÿâ¯ßÌØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³í—üûëòOò‹óò"ó^óÇåÇ—ü׬§šu UÕ5;n'G«$|ÝIâ¥ØïŸ.Á‹ÚžÕìÞÛtºœ˜¡áDðÆF"É•šv}ìÖƒOŸJe’‘â;‘}³Üô+_óŽ_ùdüÿp«ù£<§ý{Aÿ)Ù¿ÓËõ½ò>ýJ? ìßô+_óŽ_ùdüÿp«ù£ô}íü§fÿO/Ö¿Èú?õ(üƒ³ЭÎ9å“òwý­ÿæŒÑ÷´ò›ý<¿Zÿ#èÿÔ£òÍÿBµÿ8åÿ–OÉß÷ ·ÿš1ÿGÞÐÊvoôòýkü£ÿRÈ;7ý ×üã—þY?'Ü*ßþhÇý{Aÿ)Ù¿ÓËõ¯ò>ýJ? ìßô+_óŽ_ùdüÿp«ù£ô}íü§fÿO/Ö¿Èú?õ(üƒ³ЭÎ9å“òwý­ÿæŒÑ÷´ò›ý<¿Zÿ#èÿÔ£òÍÿBµÿ8åÿ–OÉß÷ ·ÿš1ÿGÞÐÊvoôòýkü£ÿRÈ;7ý ×üã—þY?'Ü*ßþhÇý{Aÿ)Ù¿ÓËõ¯ò>ýJ? ìßô+_óŽ_ùdüÿp«ù£ô}íü§fÿO/Ö¿Èú?õ(üƒ³ЭÎ9å“òwý­ÿæŒÑ÷´ò›ý<¿Zÿ#èÿÔ£òÍÿBµÿ8åÿ–OÉß÷ ·ÿš1ÿGÞÐÊvoôòýkü£ÿRÈ;7ý ×üã—þY?'Ü*ßþhÇý{Aÿ)Ù¿ÓËõ¯ò>ýJ? ìßô+_óŽ_ùdüÿp«ù£ô}íü§fÿO/Ö¿Èú?õ(üƒ³ЭÎ9å“òwý­ÿæŒÑ÷´ò›ý<¿Zÿ#èÿÔ£òÍÿBµÿ8åÿ–OÉß÷ ·ÿš1ÿGÞÐÊvoôòýkü£ÿRÈ;7ý ×üã—þY?'Ü*ßþhÇý{Aÿ)Ù¿ÓËõ¯ò>ýJ? ìßô+_óŽ_ùdüÿp«ù£ô}íü§fÿO/Ö¿Èú?õ(üƒ³ЭÎ9å“òwý­ÿæŒÑ÷´ò›ý<¿Zÿ#èÿÔ£òÍÿBµÿ8åÿ–OÉß÷ ·ÿš1ÿGÞÐÊvoôòýkü£ÿRÈ;7ý ×üã—þY?'Ü*ßþhÇý{Aÿ)Ù¿ÓËõ¯ò>ýJ? ìßô+_óŽ_ùdüÿp«ù£ô}íü§fÿO/Ö¿Èú?õ(üƒ³ЭÎ9å“òwý­ÿæŒÑ÷´ò›ý<¿Zÿ#èÿÔ£òÍÿBµÿ8åÿ–OÉß÷ ·ÿš1ÿGÞÐÊvoôòýkü£ÿRÈ;7ý ×üã—þY?'Ü*ßþhÇý{Aÿ)Ù¿ÓËõ¯ò>ýJ? ìßô+_óŽ_ùdüÿp«ù£ô}íü§fÿO/Ö¿Èú?õ(üƒ³ЭÎ9å“òwý­ÿæŒÑ÷´ò›ý<¿Zÿ#èÿÔ£òÍÿBµÿ8åÿ–OÉß÷ ·ÿš1ÿGÞÐÊvoôòýkü£ÿRÈ;7ý ×üã—þY?'Ü*ßþhÇý{Aÿ)Ù¿ÓËõ¯ò>ýJ? ìßô+_óŽ_ùdüÿp«ù£ô}íü§fÿO/Ö¿Èú?õ(üƒ³ЭÎ9å“òwý­ÿæŒÑ÷´ò›ý<¿Zÿ#èÿÔ£òÍÿBµÿ8åÿ–OÉß÷ ·ÿš1ÿGÞÐÊvoôòýkü£ÿRÈ;7ý ×üã—þY?'Ü*ßþhÇý{Aÿ)Ù¿ÓËõ¯ò>ýJ? ìßô+_óŽ_ùdüÿp«ù£ô}íü§fÿO/Ö¿Èú?õ(üƒ³ЭÎ9å“òwý­ÿæŒÑ÷´ò›ý<¿Zÿ#èÿÔ£òÍÿBµÿ8åÿ–OÉß÷ ·ÿš1ÿGÞÐÊvoôòýkü£ÿRÈ;7ý ×üã—þY?'Ü*ßþhÇý{Aÿ)Ù¿ÓËõ¯ò>ýJ? ìßô+_óŽ_ùdüÿp«ù£ô}íü§fÿO/Ö¿Èú?õ(üƒ³ЭÎ9å“òwý­ÿæŒÑ÷´ò›ý<¿Zÿ#èÿÔ£òÏÿÎz~G~Oy þq÷Qó’ÿ-|½å}r=sL‚=WM°†Þq²0tŠ  Æzwüý«ínÑíØáÕjre‡‡3Ã), Cígéði ±ãŒMÀv|8Ϫß>vlUÙ±WfÅ]›vÿÓüÿâ¯ßÌØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³ôÿ>ÊÿÖr¾ÿÀÇSÿ¨{<ø÷þŸóGþ÷S}+Ù?ñ3ýc÷gÐìñ§¦vlUÙ±WfÅ]›vlUÙ±WfÅ]›vlUÙ±WfÅ]›vlUÙ±WfÅ]›vlUÙ±WfÅ]›vlUÙ±WfÅ]›vlUÙ±WfÅ]›vlUÙ±WfÅ]›vlUÙ±WfÅ]›vlUÙ±Wg‚¿çä_úÌš§þ:Güœ|õÏø ÎGø\þàóžÕ‰ëgç“>Ë|ÉÙ±WfÅ]›vlUÙÿÔüÿâ¯ßÌØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³ôÿ>ÊÿÖr¾ÿÀÇSÿ¨{<ø÷þŸóGþ÷S}+Ù?ñ3ýc÷gÐìñ§¦vlUÙ±WfÅ]›vlUÙ±WfÅ]›vlUÙ±WfÅ]›vlUÙ±WfÅ]›vlUÙ±WfÅ]›vlUÙ±WfÅ]›vlUÙ±WfÅ]›vlUÙ±WfÅ]›vlUÙ±WfÅ]›vlUÙ±Wg‚¿çä_úÌš§þ:Güœ|õÏø ÎGø\þàóžÕ‰ëgç“>Ë|ÉÙ±WfÅ]›vlUÙÿÕüÿâ¯ßÌØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«U¦lUÕÍŠ·›vlUªæÅ]\Ø«y±V«›usb­æÅ]›vlUÙ±WfÅ]›vlUÙ±WfÅ]›vlUÙ±WfÅ]›vlUÙ±WfÅ]›vlUÙ±WfÅ]›vlUÙ±V«›o6*ìØ«³b®ÍŠ»6*ìØ«³ôÿ>ÊÿÖr¾ÿÀÇSÿ¨{<ø÷þŸóGþ÷S}+Ù?ñ3ýc÷gÐìñ§¦vlUÙ±WfÅ]›vlUÙ±WfÅ]›vlUÙ±WfÅ]›vlUÙ±WfÅ]›vlUÙ±Wg4»üÏÐm?6tŸÊI wUòåϘc¶Á!¸Hc„ n΢Wù'¸ÏGÒÿÀÓ´uÆgö®#ü¯”ŠëxóÏÔ?Jÿƒ<¿©ë¿¢ý_Cë?£­d¹ô}^pçéñåÁ©ZÐôÍŠ¿ ¿è¹¿û+¿ø{Þƒ6*×ý;ÿewÿoûÐfÅ_«ÿóŒ¿ó’ô1ŸóÚwç¯ø7üúCô¿üêߤHpýq4ï_Õm«êzUþëá­7¦lUùáù)ÿ?†ÿ•Ãù¹ùqùYÿBíþÿ•æ  ôïø»ëTúì«­õаúœ9W¨µñ±WívlUùÿ9Gÿ?[ÿ¡küöóÏä§ü¨_ñ§ø/ôgüì¿âŸÑßYý#¥Új_ï/è‹®>µÃûÖ¯[Vƒb¯Ð(¿<â?ó‹ÑÎJÏå—Žü­_ÌɼØvU:'é–°[à ‚@ýØ”Ä+ö¸³›~7ê_óüIåGÿœm¶·YkÏ5¼Ìâ¿ ¤zTA :Š·Ï6*˜ùoþ‰_$^oÿœwh4ÇaêÞhþcÏ÷¥½ÆŸÈOüeLØ«õÿþqçþrWò£þr{É'Îÿ•zÌ·–Ö’‹m{A¿ˆ[jz]Ë)e†òÜ4K(ª²;£oÅÚ†›f¿šß›—¿’^IÕ0ÿ3¼Émåo*éV{éù;Ë3×Ó··†0ÒM+x¢)c¹è ~,~dÏîtë}RæËò›òB]WI…È·×üÓ©ýVYÔ¿P´Š^Ån ÜUE)›Nÿ*?çöQÕµkM/ó“ò†óÉúuĉÞlòåÿéH¡å±yl&† B)ܘ呸ôBEb¯ÚŸ%yßʘÞVѼëä]~ÏÍ>Tó ¸¹ÑµÛ OJš¡•VR+¬3b¯ÍïùÌïùù\_ó‰_™öß•Ð~N¿Ÿu ­×[ÓëÃK†5¼’â$ODi÷låL?Ö¹±WÆÏñ<Æ%ŒÏÿ8ç¦É °2Ç™¦Fe¯ÄŽšÁI SO Ø«íßùÆOùú‡äüä™ôŸËÿ0hšåŸuù–ÛA±Õ."½Ò¯î¤`±Z[ê1¬$M!4U–Ã*³;ÍŠ¾žÿœ¼ÿœ‘ÿ¡Uüš½üÛÿ>§ªØiŸáÿÒ?¢ù}uÙ=O¬ýVîœ)Zz{øŒØ«ò‡þ‹ÿ²»ÿ‡·ýè3b®ÿ¢æÿì®ÿáíÿzØ«÷wÊzïø£Ê¾Zó7Õ~£þ"Ò¬õ?©sõ}­À“z~§åÇ+ÄWÀfÅ_ÿÎoÿÎméó†zï¥ò@üÃ×¼ùwocåïÒ¿¢=+K‘®.ŒÿS½¯&‰ðäO/†‡b¯Ž%çñÚ_æ·æÏåï妳ù þ ±óæ¹i¡Š?ÅbüZM|âwks¤Z‡ 3"ŸÞ­'zPìUû]›|ÿ9Ïÿ9ÏÿB]ÿ*»þAwü¬¯ùY_¦ÿéwúê_¡¾¡ÿ.Þ¯«õïòxñý®[lUåŸó‡ßóô/,ÎR~jʧֿ,¿åUëz–qyå+§×LG©\ÚV{0?GYzn *š°`Œ64®Å_¤_˜^lÿùÏyú‡é_ðg—õ=wô_«è}gôu¬—>«ÂNý><¸µ+Z™±Wæüâüý3þ†ó·ËŸ“Ÿò¢¿Àÿâ MFëüGþ'ý'èýBÒ[®?VýiËŸ§Æ¾ ¥k¿LØ«õ»6*øÃþskþróþ„ëÈTóÏü«ßùX¿â0 ô_éoÑ…mg¹õ½_©Þóþç­kµ3b¬þpsþsgþ‡7JüÅÔÿåYÿÊ·ÿÝé¶¾‡éŸÓ[ý —Ë—Ôl}>…)F­{S}о¯üØó×üªÿÊÏ̿̿ѧ?å]ùSYó?è__êß\ýc5ïÕýN_KÕô¸óàÜk^-Ó6*üÁÿœ\ÿŸ­ÿÐÊ~{yòSþT/ø/üiúOþv_ñOé«~ŽÒîõ/÷—ôE¯>UáýêÓ—-éC±W¿ÿÎsÿÎsÿЗÊ®ÿ]ÿ++þVWé¿ú]þ†ú—èo¨Ë…÷«êý{üž<k–Ûygüá÷üý Ë󔟚Ÿò©õ¯Ë/ùUzÞ¥§\^yJéõßÓêW6ƒÕžÌÑÖ^›ˆʦ¬# +±Wéæ›?À~@óÇž~¡úWüåýO]ýêúYýk%Ï£êð“‡?O.-JÖ‡¦lUùƒÿ8Ÿÿ?Lÿ¡Ÿüíòçäçü¨¯ð?ø‚ÓQºÿÿ‰ÿIú?P´–ëÕ¿DÚrçéñ¯¨)ZïÓ6*õÿùÎ?ùÏ_ú-WòëLÿ•Sÿ+#ü}i©]zÿ§CýSô{Û§?£ï½N~½kU¥;×mнþpßþrþ†Ûò’çóOüÿ*ÿêþ`½Ð¿A~“ý+Ëê‘[Ëë}cê¶tåëÓ§µ:ší±Vcÿ9 ÿ95ùEÿ8Ãå(¼Ýù¯æÓã¿w‡Ëþ_²ë:¦©=ÿƒ§üäÿ„ÃýÔßJöOüLÿXýÁÙô;1q_ñÈqH_‡ @ôÎÁö—[ÚÓôiÄqƒ¼Ì|6õwćg¶óâ÷·vlUØAæ¯3i>LòÖ»æÍzf·Ñü»c>¡©J‹ÍÄP!v¿´Æ”¹Û7ÞËû7­ö“µtÝ•¡ˆ–£U–±‚hq̈Ž#Ò"îG ¸ú½T4¸¥—&Ñ€$ûƒ°ê¢¹†+ˆ$Y HfCUtaU`GPA®isažË@c(’;FÄЂß ‚ìW+K³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÏÏÈ¿õ™5Oütù8ùëŸðÿœŽð¹ýÁç=ªÿ?ÖÏÏ&}–ù“³b®ÍŠ»6*ìØ«³ÿ×üÿâ¯ßÌØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«È?ç!?òA~xæ¿ó7ýÒ®sb¯äGþpwÈPüÑÿœªüŸòŸ´H¼Çå1ê7°ëz,ÒKOZmÔèáxÜQãVÙ‡LØ«úmÿ¢oÿÎÿå„Ò¿î!«ÿÙnlUô—+¼…ù9ùM«y òÏ˰ùSÊ^ªM§èI4ÑÅ%ÊË4Ä<òJ甎NíøfÅ_ÈüáOþµÇüã—þl þ¢Ó6*þ×3b¯ä þ~ÿ­Ùùçÿ‚Ïþ#NlUûýÿʲ¯þʯþ)±WóÅÿ>âòŸ•|óÿ9›ù7å;ykJó‡–5Oñé?.kvpj7‡—u9âõ­®RHŸ„‘«¯%4e 7æÅ_²ßóòÏùÄÏùƽþq{Îß™^Yüµò¿å‡œüŽúl¾\Õ<µ§Ûhët÷Z„²ZOof°Å?©ÌA*]J†ˆ*v*øSþ|¯©yŽùÈÿÌ-&Á¥o,ê@¹¹ó ;ú{mJÅl¥=½Eõ¥Tö^MºÓb¯"ÿŸ£ÿÎEk?œŸó’>fò®¡ òäµäþZÑ4¤f>©nDzµÜˆv2}aZ{$kJU«±Wë'üà§üû«ò_ÉŸ“ÞOóßçåþ“ùù—çÝ.Û[Ô-|Ígý–“o}žÞÆ+ •x}Hãuõ]з©PP3b¯œ¿çç¿ó€Ÿ–>Mü³½ÿœƒü’ò½¿’'ò­Í¬˜OÒ£1é·7s-²^Û[-VÞHe’0ë¬f2ÎB²ûygüù«þrYÐÿ3üÇÿ8ñ«ê\y[Ï:}ιå+\²Úë:r .&Š·ªí%X—ß6*òÏùü…?èmôÊå¿Ñ¿ê/PÍŠ¿Sÿçÿççÿ0?ç ?'5:þGyÌúï˜4GôϘõ/éójwôäažüÃõžJŠXIUElUüüÿÎe~Wy_òþr—ó[òçòæîxü³å-RÎ.·®ÒMf/lmun³T¹6²NbV$·ÁñÕ9±WîüüÌÚÇçÙ?—ró ºkþm²òµ®$‚Ž//ì㸸 Z$†»–lUùåÿ>¤üü üþüÀü×Ò?7ü“mç]7Ëþ^²¼Ñíngº€A<·f7u6³BMTSrFlUûÿDßÿœ%ÿË ¥ûxjßö[›}£¦i¶:.›§húe¸´Ót«h¬ôûU$ˆ q ,I!U@ÜæÅ_Êßüý§óRo̯ùË;¯%irµî—ùO¤XùnÊÞÜú‹&¥t>¿zè§Ôåp0ñŠ”­k±WϿ󙟑wŸó‹?žú_“ôÂtÿ«ù[ÊÚæy ø¾´š|6÷— ãbͨÚ\=FÕÍŠ¿­ßȯÌÛOÎOÉ¿Ë/ÍOMGž<¹aª^AªÁy,+õ»z÷ôg÷\Ø«ñgþÿ®»ÿƒ·ýØ3b¯Å6ÇÏÿ“ò~Oþshï&“&³<žaò˜"¨»Ðµ9-¥Œž…¢–gOä‘+³fÅ_Ö…‡çŸ—ÿç#ç¼óùµ pƒüEùgæE×´”j?U·Òîb¾´mÉ9•¸¡hÊ=>!›>ÿóêOùͿ˟ûey‹þé79±Wõ»›~0ÿÏí?òA~TæÀ_û¥_fÅ^ÿ>:ÿ”Wþr'þÚ¾\ÿ“†lUú¿ÿ9cÿ¬±ÿ9-ÿš«Î_÷C¼ÍŠ¿˜ùõÇþ·gägþ ßøŒjÙ±Wßÿóüïýußü¿îÁ›~,i¶>üŸ“òó›Gy4™5™äó<Á%EÞ…©Ém,dô-°+:$‰]›6*þ´,?<ü¿ÿ9ÿ85çŸÍ­„â/Ë?2.½¤£Téú­¾—sõ£nHÌ­Àµ FQéñ Ø«ù÷ÿŸP Îmþ\ÿÛ+Ì_÷I¹Íо¿ÿŸâÿÊSÿ8íÿl¯2Éý?6*úëþ|é<6ßóˆ:½ÅÄ‹ yó[’yœñTD³°,Äž€›~ÿÎJ~sùÏþrûþr7Xó4-q©3ëQù{ò·Ë•b-´Ö¸ú¾™i7Ùyy‡’€r•ݨ+LØ«úZüƒÿŸsÎ3þPyLò÷™,¼·ù¥ç íü[ç3é°êsvê=Siâʶ±)Ú1V fg,Çb¯Çùú?üá“?çu*þm~Qi¯¡þ^ùæþM#]ò¨g–ÛJÕÄFâhòaÔqÊÞ›ðø${}«ÿ>lÿœ€Ö|íùuçoÈÏ3ê2j?•m¨ù*k‡/ ѵ‘%´‰>¬è íð‰B…T Š¿?ç:,_SÿœÛüôÓRAš‡œþ¬’™RŽô®lUèÿó„ž`ÿœ+ÿœ­¼ò·æ>å½[R—È¿›Úl§à²’–ŠýÈ_ô;Ƚ aix‚XfÅ_¨ÿóûIçÿ)ž7çädu ‚•|Av9±UßóäÏü_šÿù°þéV9±Wìö~€¿çÙ_úÎWßøêõgŸÿÁÓþrÿÂaþêo¥{'þ&¬~àìúž4ôÎÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®Â0jòhZ=þ¯¨kí§Äfm'JŽ9o&UûBä’ ìOÜEˆoØ=•Õ×bÒKQ‹L2K‡ÄÌe 0'—‰8Æf'n#ÝÌÆ ÈS¨Ìpã32®‘ÞGÜ îù;< ù•ÿ9åùi?“|ç¡ycOó=‡.tëÍ;JÖ1[ [Ù¡)úÁd11åN5¨¥3îÏøË ûW‹·;?[ÚytY;>9±eÉáå–O HÉPýÐŒ†HŽ⪕ÛÀöŸ·šCƒ&4˜3Š^g=»þZ›þYC·¿à‰í6>ÚìiãÇ‚0Î2ÎX̲c$Fc†â¼FޫÇÙ?k´ý›¥85F¤Lh^ǘæ:Ùø»>›þVþii›: ó6ƒåí{GÐ¥+ú6ÿ[µŽÑoTÖ¯l«4Œè´ût dš~lÁ;þ:¿øöòn»W¥Ï©âCO’YNµG)0„c3üË3\ã§ö_jôqø¸á8Ç¡‹Ý¹ÛÏ—u»:ny«³vq¿ùÈ/5ÃäÏÉ¯Ì aíÖöæm*]3I°dýb÷R¥¬b"ÔýìÊJÐÔžÁÿOe§í'·=—£8áñÍ’wÁááÓþÿ4¸ìp~‘ZtÞÐêÆ›A–ug†€çr—¤ ë¹äìù!cÿ89ùÝ{ù{/Fmm¬m=¯§ršœ¶¼K¡ýÚIÒ± EkF¢ÕÍoü¶Ç°oi£ØÞ,ç§úe¬ˆ½4rÝíë–>|YãhŽ(’>Ga»Fz_€—>â#î¿èóøìv}KÿœVóGø›ò7ÉqÏeú/Wò¤å¯0iF/BK{Í)Œ ²ÅE(î$`@¡móóþZ‡ÙŸäOø öŒ±äñ°k$5x2qqÇ&PñA„ìñB33ÇAØÓê~Êê¼~ÎÇc†P¨ÃmÇBE‹³ÑóóÑ; ?˜ß˜6–ž]›ÍŸ—õ½wI³$êO¡ÛGw-¬`TÍ,M,oéŽì ñêÔçwÿÏ`³ûkÚqìÍ6«M§Ï“û±©œ±G,¿™ ˆN}üÐóï—<‡ùa§Ë«yóÌSK—´ènà±’I"†I¤ ss,GHãcVqá×lØ«îú'7üüSÿ-–«ÿ…Ÿ—ÿï3›FŸó޾Ió¯åßüâ?‘<‹ù‡a&›ç.y2{/1iòÜÃzñ\„˜”7òM†„nŽÃß6*þRÿç vÿœ·ÿœs>˜ýE¦lUý­×6*þ@ÿçèßúÝžf¿õ,ÿâ1¤æÅ_¿ì¬¿óë2¬ ²ÿÎ+Q”ìAHèsb¯å‡òRüäÑÿ5ü©©Î?ǪËù¹mõïð”z%¢__žv yèÛɪÿè†nUCE©Ú•ÍŠ½'þr[ó7þrã;Ÿå_ùÊMoÎÐ^iÜotï*ùšÖM.¨(·pØ­àsBÊ%M*9uÍŠ¿¢¿ùöå·üãç•¿çí¼ëù#ª^y§Uó¬Ëæ/š5ˆ#µÕR±QËM–Ö7•-£·õ¹",’rzž£†S›0žPêÿŸœPjƺ¤>wó jDõúÂêW -hûUí›rÚMÎw¥i—ZCÇ&“si ºcÄ8ÆÖî¢(((¥¦lUòÿüçMÎmÿ8ÿ9.¨QmŸÉz„1ú€õ‰”Gl>~³ ù±WóSÿ>ȵÔn¿ç8#ΛÉd¶Ÿ\žêP nš¡ër BPW©`+¾lUíóùýk}3ÿ5þÿQz†lUäß•óñïùÊ?ʿʯ-þHþ[?—ì4¯.ZÏiåýMtc{«¢ÜM-Ñ`f’X]•¥%k ÷Ø« ÿœqÿœÿœÿœ¬üÈO9~hhÞ`ò‘µ­Qõ_?~dyž-¯õ/VS-À°Šè,·NK/–b@FØ«öþ~Ç¥éú'üá΋¤Ú%†•¤yƒË–ZmŒ[$6öîÑÅöUPlUüçþA~B~|þ}êúþ‘ùåÛŸ1júœWšô6ÚµŽ’c·–ON6/}wh¯WÚŠI±W×_ÿŸwÏÃ,õÝòóò×TŽÎÖþÚk—>qÐÒUgmü¨½º2j”þ`iôËrvM'^çuQZš^GvÍOæ\Ø«Âÿçùßúë¿ø;݃6*Á+¿ççÿœ˜ÿŸWi±è¶&ûóò‹Ì¾e×?.’{ˆÖWPÓV€–úÔlJ¹•" #6*ùçþ}Íÿ9'”¤üåÿœuó%ô«ä¿Ï/'kñèó ¶Þb‹Jœ!‹–Á¯-ÔÃÜ´‹æÅRùõþ¶ßåÏý²¼Åÿt›œØ«úÝÍŠ¿¿çö`ŸÈÊ’ üÁ@O¹Ò¯©ú³b¯>ÿŸíå_ùÈŸûkysþLj±Wê÷üå‡þ²Ïüä·þj¯9Ýó6*þa?ç× Çþs¯ò8€HAæbÄváTTý&™±Wß¿óüïýußü¿îÁ›`¿•ßóóÿÎLÏ«´Øô[}ùùEæ_2럗I=Äk?«¨i«@K}j6%ÜÊ‘ Л|óÿ>æÿœ€“ÊR~rÿÎ:ù’úUò_ç—“µøôHy…[o1E¥NÅË`×–êaîZEsb©üúƒÿ[oòçþÙ^bÿºMÎlUõÿüÿþRŸùÇoûey“þOéù±W¹϶"Ô.?çÜŸpi$Vkß;ǦSsõ†Ñ-„[Pþѳb¯ÄùÃÙôëoùÊÏùÇ9õW,ÓóËu–QTYN£…ŽÆ”©¯AÔÒ•ÍŠ¿¶¼Ø«ò¿þ q§Aÿ8‚ñ^”7žuÑ!ÒC ÍÀK©)ì}“è®lUùÏÿ>PµÔ_þr/ó:ö._¢mÿ.na¾¥xýfm_MkzšR¼"–•>9±WÆŸó÷“ØÎj~}_[0K›/84öì@ ÊÿÖr¾ÿÀÇSÿ¨{<ø÷þŸóGþ÷S}+Ù?ñ3ýc÷gÐìñ§¦vlUÙ±WfÅ]›vlUÙ±WfÅ]›vlUÙ±WfÅ]›vlUÙòoþs÷Ëú­ùƒùsåÏ&ùIo¿3üÉ÷:´ºlLo.íÙÖ 4x£ÚF-¿ ¨^¼z~©ÿËv÷hö³]­Ú=±®8ûK(CË 0âÈÉžQœþ€#<>ˆžJwÃÅÏɽ¿ÓãɪË;Ï0I¡¹£°çÈïÜœò›òª÷òÇþr#òãÊ¿ŸB ¦ë÷koig¨ñžÊk‹˜ÊZ:<.ÐNá‘] 2ŠÑ‡L÷ø*ÿÁGOí¿ü {[µ=†í;ͦÆg)b¸f†@ñ`€Ãz™:}f}8˜Å9@d‰„¸I ÂUõD ‰ÚÀ=Ê•X·÷`œÇ¶NÀÐYÚ[Iw5µ¬6ó_Ê'¾–8ÕZiB,Aä Ìjw¢Ðeùµ™³FÉ9J8ãÃI"23áˆ?Lxå)P¡Å)K™,D#HNçÌò³ðv ÌvNÍ…]Ÿ?ç"?,Çæüä×™<ù#äxÚêÊ+d×`Ó§iõçOZêêfvÛ…2¬mN+Ézc_ÚÏùgßø$dàO¤í¿m{Hˆd”Λ՗ÀððáÆ9s“Á,¾9ðLn1Àpøw´]™ùÎמ -À\<¸¹ÊG¤yÑä,w—d÷þpÊ_–¿<<×åÌ¿&­—榋Ï+Z3êYMk(ݘÙäIÒP„£qc^þ[WÚÍ_mÿÀÿCÚÞÍöÉÙyóxzC‡42Æñx²±N„ñHÄäˆË(LJ?Ø}0vŽL:œu–1¸ñs‰zédAîýŸa³ò5ö'fÅ]›vlUÙ±WfÅ]›vlUÙ±WfÅ]›vlUÙ±WfÅ]ž ÿŸ‘ë2jŸøéòqó×?à%ÿ9?ásûƒÎ{Uþ$¬ŸžLû-ó'fÅ]›vlUÙ±WgÿÑüÿâ¯ßÌØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«Çÿç!Oü€?Ïü×þfÿºUÎlUü{ÿÎ þkù_ò7þr?ò»óWΑßKå'_]ÜjÑé°¬÷E&°¹¶_J7xÃr­jÃjæÅ_ÐOýGþqþ­¿˜÷´ÿ¼†lUö×üãoüä·å×üåG‘µ_Ì/Ë(5‹}F×gòíÚëVÑÚÜ»{[[·*‘Í8)éÝ¥*Ö»m¾Å_ÉOæÿ‘üßÿ8ƒÿ9Mªépéíaª~UùÊ0ù âåÃwciz·ÚEÒšüi$hœ¨v`ÈO%lØ«úÑ¿çïóˆ·žD‡ÌÚÆ«æÍij²^~\ æâøÜ«ÅÚ(±uæ(®ó¥A•wb¯ç§ÌWž}ÿœÖÿœ¦Õ¯|¿¢ñçWšXéZDU‘,m‰¬àÝÙÚDYŠ3šfÅ_Öüä/—l<¡ÿ8cùãå+Ó<¯ù-æm#Nö¾¯eåÛ›x«NüPfÅ_Íüúçÿ[«ò7ÿmÿðXÕ³b¯Øoùü‡åTmÿœnÐÿ2­l]gòŸÌ–Ò\j!y‰.»§išÝî—ue4 ³Þ¬‘Zév²³}U%)ÆAFâhßdìUñWüúgógþUÏüåŽå›Û¦‡EüÜÒo<³tŒÀD/P ë ¬e·0¯üe÷ÍŠ¾ÆÿŸæÿë®ÿàíÿv Ø«ëïùôFßó†Ú%v§šµïù<™±Wä?üü¿þqÂÿþqŸþr&Óó7ÈË£y+ó2õüÏå;Ë1é'^·™f½µˆ®ÉÂf[ˆh ü~èœØ«ÿŸP Îm~\+ÌTöé¹ÍŠ¿­ÌØ«óßþ~wù1­~sÿÎ'y®ÓË:|Ú¿˜ÿ/µ+?:i:M¸/-ÀÓÒk{ÅìËgu;ª€K b3b¯Âoù÷üæ7—ç?1üÛŸ¬ïgü¹üʱ³µóêÆóMyZÊëÑ,¦HÔ\Ì’*üT`ʯثôþs¯þ~sùçŸÈÏ6~SþDjú‡œõÿÌkEÒµ0I¦Ýéö:v›+)¼R/ã·–I¥Œ”,e@,Åþ±W€ÿÏš?$uß0~qù›óÖ÷O–(~_iZ.ª:•Žã[Ô–5x£$Q½6ÉO³êG_µ›z÷üÿ7ÿ]tx¿îÁ›}}ÿ>ˆÛþpÛD®ÔóV½ÿ'“6*ü‡ÿŸ—ÿÎ8_ÿÎ3ÿÎDÚ~fù9to%~f^¿™ü§yf=1¤ëÖó,×¶±Ù8LËq _‚Ý›cóêOùͯ˃ã¥yŠƒþÝ79±W×ÿóüA_4ÿÎ;x~Šó'üŸÓób¯¯?çÎ*ÿ8‹ª$ŠÏÚÒ²0¨ ÚiõwÍŠ¿ ¿ç0ÿç¼×ÿ8—ÿ9­h6ÐÝiÞZ¸ÔÌ”žgƒ’¬ºiŸÕ·L ¤öMH¤† ¡éÁЊ¿q¿!ÿçïófò”ßžµÿå·æ.™e>a‰t«ÝBÃR»Ž5\X>Áfj·§2§xò`¶Å_•_óñùÎm;þrËÌ^Yò·åí•ö™ùOä)gº²›PQί©N¢6¼’[ÒŽ(ÁHTžTwg¡`‰±Wëoüúþqƒ]üü×0¼õ¥K£yãó’kK¸´{¤xîltK%“ê)ÊÿÖr¾ÿÀÇSÿ¨{<ø÷þŸóGþ÷S}+Ù?ñ3ýc÷gÐìñ§¦vlUÙ±WfÅ]›vlUÙ±WfÅ]›vlUÙ±Wb76ÖvóÝÞ\GiimKsu3ˆãU݈ Ü“—i´Ùu9c‹ Lç2#ÄJR;Æ#rIä62˜ˆ$šؾRÉÙ±WdRÓÉW²óf­ç˜´˜_ÍšÌÚ]ë’ÖIÖÖ –ð³WÒŽ£“*P3µNu:¿m;[SØØ;Yä48%)ÇôÀå™&Yfx™7ጧf01¡w‰æ–qÞHeÖ‡AÜ:íÌ»/ÍþJòÏž´µÒ<Ï¥E©[C2]XÊÌַ1QÜ[J>(¤Cº²šýÁ쟶}­ì¶¬êû3<±NQ0˜Ã.9m©¯ênæúöæF’Yî&j³’Îh+E …Pu>ÓûgÚÞÒÊ¥’lPƱàÃŽ"ÇŠÓ#ÄkŠrõÎR™2q4º:n/4dL¤zÊGrIëú9 ›WòO–u¿0ysÍwú\Mæo)É#è:ìÌ 4oЙ…â‘$`ÈÕ]ùS Éöϵ»3³u}•ƒ4†X"3a>¬s0”g ðŸ§$'˜ä èp’`eæÐáË–e\>™u(q—évJó–rÝ›vµ»µ½‹×³¹ŽêrEêÄÁלNÑȵZŠ«©SàA‘©ÒfÓOƒ4 %@Ô¦âhô”HïEŒf&.&ÇêØ»f;'fÅ]›vlUÙ±WfÅ]›vlUÙ±WfÅ]›vx+þ~Eÿ¬ÉªàC¤ÉÇÏ\ÿ€—üäpÿ…Ïî9íWø‘þ°v~y3ì·Ì›vlUÙ±WfÅ]ŸÿÒüÿâ¯ßÌØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«ó—•´ÿ;ùGÍ^KÕf¸·ÒüߣßhšÅ£*\%¾¡nöÒ´,é"‡ !*YXÔØ«ò—þˆ«ÿ8³ÿS÷æ¯ýÅtOûÁæÅ]ÿDTÿœYÿ©ûóWþâºýàób¯»¿çÿç¼ÿ8›ä_òëòçWóµ¢k^`¸óÕ×™.-nn–êæÖÒÑÑÎÖÍa,ЀPš–ø¨@Yÿ9ÿ8•ùÿ9A¥ÚY~kyS뺮•E¡y¿N”Ùêö(Ä’‘\¨<’¤ŸNUxëñp®ù±WçkÏ’¿#©ê§æïž×E¯ûÀWL7TÞƒë"Ô%}ýØ«ïßùÇ?ùÃ?È?ùÅÛ{©?,<ªçÌš„F OÏ:Ì¢ûYžA0‹‚ˆ°ÆJ‚É "±°$›{¿æ’t¯Ì¯ ùãòë]¸»´Ñ<ÿåýOËšÍÕƒ¤wQÚê¶²YÎöï*J‹"¤¤©d` *¤m›|#ù ÿ>¿ü‚ÿœwüØò§ç’¼ßùªyŸÉÿ^ýc­ßéSØIúBÂãO—ÖŽÛJ¶”Ò;–+ÆEø€­EAØ«íïÍoË?,þr~\yËò»ÎI;ùkÎúdÚ^¨öŒ‰sÊ*“[¼‰",±8Y²0  •#lØ«âoÈ?ùöGäwüãæ—ÿ6¼çÏÌ[1y}.áŽÃVÔ4™¬.a¼·’ÞX®bƒH‚F^2rdR)®Ù±WÞ^ròW”¿0üµªù;Ï]°óW•õÈL®‡©B·ó%j*Ž XVe`H Ø«ò§Ïßóæ?ùÆï1êsê^Kówœ?.á¹»hpÜ[êv0©ý˜>·¹ìç|Ø«8ü¥ÿŸGÎ+þ[ê¶Zï™#×ÿ6µ'Yb°ó=ÌJõ”ccg A_Ø™äCÝNlUú{igiaikccm••”Iœ±E Q(TŽ4PUT6*ø;þr[þ}Ïù%ÿ9Où‹æoæš|ñ£kÖú=¶ˆ–ž]¾Ómí ½¤“JŒRïM»“™3µO:R”6*úŸòOò‹Ëß•¾Qü¤ò…ö§©yoÉvó[iwºÄÍ}"Oq-ËžÞxÉ1Œkµ>y±W©æÅ^ÿ9ÿ8õä¿ùÉßËK¯Ê¿>êzÖ‘åë½BÓR’ó@šÚÞôKfţ£âIß÷uð#6*üùÿ¢*ÿÎ,ÿÔýù«ÿq]þðy±WÑçwÿûóW~¿îWDÿ¼lUôæ×üû§òkó“òóò[òÃÌþuóý‡•¿"´wѼ£—¨iÉr’Go\_™´¹–I¸[(U¨£‘ÍŠ½“þq{þqOò×þq+Éšç’-¯uÍZËÌZÃkZ¦«æí®/žcVë{K[HÄH±UG ‚Ìjk¶Å_DêZmޱ§_é:²^麥´¶š”¢©4¡ŽHØw ¬AÍŠ¿,ü¡ÿ>€ÿœqò7›¼³ç.þb~iÚkþQÕìõ½sªèÅc»°. &š(jAZ0>ù±WÓó•¿ó…?•Ÿó˜?à/ùYzÿš´?ùW¥?Bÿ†n¬m½_ÒßSõþ±õÛÞ\~¤œ8ñ¥ZµÚ›z?üã—üãÏ’ÿç¿--*üƒªkz¿—­5 ½J;Í~{k‹Ó-ãµ¶µˆ#oÝ×ĜتïùȯùÇoËÏùÉïË[¿ÊÿÌ”¿‹F–öÛR°Õ´™bƒQ°¼µcÆ{YgŠâ5fÞ&åŽÃcB6*ù‹þqóþ}™ùÿ8Ùù¥¢þmù;}Õ|É¡[ÞÛZYk·ú\ö,·Öïm!’;].ÖBBHJÒA¿Z³b¯Ñ<Ø«TÍŠ¿4ÿ;¿çÕó‹ßœZíÿšôÛMgò§Ì:œ¯q¨·”¦‚-:âw?§ÜÁj·ÐµÌ6鎳iš×œg†ö;IÔÔKoe6öÁ”УrüŰóõÔµk=+QÒb³ŽVUB°$úDò*ÑFÍ#|Ø«ôÚ™±WÂó“óïÈùÊ¿:i˜|Ô<Óå¯3éúbi77¾V»±µÐDì𛥼±¼ ñseV^'‰âÕ ¼v*õùÅÏùÅËÏùį(yƒÉ—טõ­/ÌšÁÖ¯®<Éqisp—Þ+nµš„ã4*Mk¿lØ«éÌýϲ¿õœ¯¿ð1ÔÿêÏ>=ÿƒ§üäÿ„ÃýÔßJöOüLÿXýÁÙô;”›$a|¸¤#~ë.ÏÿÎcþ~ùÿ%5o.ùÏÚ™5Ï7^Úé²Ã¡êv·³AfÜ\JâÞG*¬!Ÿlû/þY þÑGÛܡۗªÒé´XòfSƒ.dË^(DåŒD¥årð÷óâ½²íý7ò|±àËÊdGÓ!"2v'º¾.ÎÑùUÿ9!ù_æOË%ë^hüÍò®‹æ[Í&ÜyƒLÔµ‹K˜ï¢_Jà¼3JŽ¡¤Fe¨ÝH=3Æÿà£ÿ,ííwbûSÚ:>Ìì}v£G óð2bÓfËŽXdxñpä„%ÂQŒ¨í! w;®Êö“GŸIŽyscŒÌG2ˆ<\ŽÄß?±Ùßt?0h>gÓaÖ<µ­Øy‡H¸.°jšmÌWvÎc%\,°³!*A‡cžÛ]ƒÚ=‡ª–´tùtÙã\XóBX²Gˆ\nd,n,n7wø5óÄ¢z‚ù‡a¾j[›vlUÙ±WfÅ]›vlUÙ±WfÅ]›vlUØ_ªêúVƒ§]êúæ§i£i6 ê_j—ÓGoo TRK)TQRI͇eöN³µuPÒh°äÏŸ!¨cÇdÉ3Ρ)è-y³C ç!ŽdšÞK³‹yÓþr7òƒË¾Qó6»¦~gyK\Ôô2êëMѬu« ›‹»˜âc ÃÌÌÎà.ÃðÏdö;þYçÛnØí­‡SØÚý>Ù±Ã&\š\øñâÇ)<“œà#Â7+'§{¤ÖûG¡Ã‚y#›¥’œI&¶Ô»<¹ÿ8MùÿåH,µ,~cyóGÐ5_/ëWiÓkºµ“\ÚêLn˜¡¹‘=B· 1jVœ—ÄgÓ_òÙßð팞Ö`í/g{3Q©Á©ÓB3l3 ytàaCeÀ„Bë‹‚ut^_ØŸh0±jrÆ2ŒqHFĽ]H¿WûóÞ^Zóß’<ænÇ“üå¡ù¬Ø7ÃFÔm¯ýõáê}^Gãʆ•ëŸ {Gì?´Íð×ìýNľL|5ÅÁâÆË|ÉÙ±WfÅ]›vlUÙÿÓüÿâ¯ßÌØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³ôÿ>ÊÿÖr¾ÿÀÇSÿ¨{<ø÷þŸóGþ÷S}+Ù?ñ3ýc÷gÐìñ§¦vlUÙ±WfÅ]›vlUÙ±WfÅ]›vlUÙó_”¼µç ûË^mÑmuí QN7z}ÒrSÖŽ¤Q‘תºÊwè}–ö«µ}—í }¥Ù:‰éµ8Æp4|Á¥ r”$% ¥6qµzL:¬gh‰Dô?Ÿ>çgÀ?ùÈßË?,þX~pëþCòEýæ¯ad-¤× $šÚ{¸ÄßTŸÞðGZ5߉©ïü³Çü;[ÛŸb4½»ÛX±àËÌqDðÃ$1HãñŒeýߣ+§Š$FB1ðhû3ƒ_->dsæ ߇ϧÜìëŸó…’ÿ—Ÿ›Þpóžz’mCü#­õ‡•GÁo|²»£Éq"že"`•A@Ü…IZ©òùlÏø1{MÿÎÄÒG°Äq~vY1ÏSõdÂb#(ÇHáÉ:ÈxŒ D¸f6þÄö.—´sÌç³á€DzKÌõ¡¶Ýo»ggÛ«;;M>ÒÚÂÂÖ+8’;;tX¢Š(ÀTHÑ@UU€@3ñkW«Í«Í<ùç,™2HÊS‘2”å#r”¤lÊR;’M“ÍöøB0ˆŒ@lä‚s“³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»$qʨ²E"•’6«+ AêÉãÉ,r‰ ƒ`ˆ#‘ nÏŒÿó’ÿ–_–¯–|Áä¨ÎƒªyÒ{·¾ò•¸_¨Ç¸B÷0'X9<ª¼Àwà‰öþX‹þ ~Ö{q¤Öh;dNqˆje~<¥“ˆGIrÍQ„¥âÞ ¼C>0cã>Ýv.A8dÁé–Bn#éÚ·ÍÜòåÝTìóä‡åþ…çßÍï'y Ï—Ú•¯ÜúW a.šš—ìzä*«qo´ ;çÒ¿ðjö÷´=”ö+_Û½‰§>š"N0Æ<“"_‚ ¥(qGè2±G˜ì>ÏÇ«×cÁœ˜ÆGãÊÀß—+ß›³ôäÏ$ySò÷@³òÇ“t;mE²º´¶Zjd•ÍZGjnîKç?}±ö×¶}¯í,¥Û™êu9ÊgéDzaÿ #ôÐz-!‹ Db:ÓÞ|ÎîÉ^rÎ[³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÏÏÈ¿õ™5Oütù8ùëŸðÿœŽð¹ýÁç=ªÿ?ÖÏÏ&}–ù“³b®ÍŠ»6*ìØ«³ÿÔüÿâ¯ßÌØ«³b®ÍŠ»6*Õsb­æÅZ¯öæÅ]Q÷fÅ[ÍŠ´M3b®®lUÕþÌØ««›o6*ìØ«UÍŠº¹±WW6*êæÅ]\Ø««½3b­æÅZ®lU¼Ø«Y±WTfÅ[ÍŠµ\Ø«y±V«›læÅ]›j¹±WW6*ÞlUªæÅ[ÍŠµ\Ø«y±V«Û6*ìØ««í›usb®®lUÕüzfÅ]\Ø«y±V«LØ«y±V«½3b­æÅZ'6*êæÅ[ÍŠ»6*ìØ«³b®ÏÐüû+ÿYÊûÿOþ¡ìóãßø:ÎAøL?ÝMô¯dÿÄÏõÜŸC³Æž™Ù±WfÅ]›vlUÙ±WfÅ]›vlUÙ±Wf®Îù{ùäï$y¯Ìߘ·‘2~bù³Q»Ô/üÑw­ªÝ;7Õ¬#«cDn.ëq¢möÿþݹí?chýžÄ+Ù:,8ñCOzq<]Lö9rJC„ŽÞ0â¹ËEÙýƒKšz“ëÍ2I‘é}":6ï=õ³²­? ü£ ~lÙþnù-ÊšÍÔ7v~rÒmcRÕ­î’¥Œ`¨†U™#² 7ÉK70uðví®Öö3'²}°9§„±äÒä™ýö—&#T'DåÄqK.! ú¡Æ8&! °ì u£Y‡Ñ"˜LÁòènŽu¸³nÎëž ï]›vlUÙ±WfÅ]›vlUÙ±WfÅ]›vlUÙ±WfÅ]œ?_ü‡òœÿ4`üÎóÂ4O¡XÛØy?Ë—(>¡b"f™î$ФO3Ë! ¸â /ÂYU‡µöü»kÙ¿deì×bÊGQ–yuYàŸˆG'@áÅpˆ"¹HËÖ#)BZ=G`àÕk«?¬ÄŸ¦=I#øž»ë¢ì¿ÍÈ&þiÜi`ž! ùûË^y_ÎöhÕ¼Ö²‰¡YÀ+ëÄAàÆ£~ „“‘ÿgü»sØLYôåùŽÌÕÂxõL„øY!–'CŒïàå0$qÄ/O‰ ‘ˆŠö·`àטä>œ° Æc˜ Ø¿ç è~;;p­v4Ü óÅÏ=àv^vlUÙ±WfÅ]›vlUÙ±WfÅ]›vlUÙà¯ùùþ³&©ÿ‘ÿ'=sþ_ó‘Ãþ?¸<çµ_âGúÁÙùäϲß2vlUÙ±WfÅ]›vÿÕüÿâ¯ßÌØ«³b®ÍŠ»6*üŒÿœäÿœæÿœƒÿœÿœü¸ü‹ü”òO“|ßqù‰åÍïIµó¥ü׳뾯¦Cm¶úŒ*Žmâ Ívfb^”¦ÅX§ý OüþÿaòÿþEËÿVlUößüâGæüå§Ÿtïºï›~ŸæÅ_óñoù˯ÌùÄ_%þ\ùòßDòÖ·}æýnëMÔ¢ó-µåÌIÂeh…å›-Ô³0§lØ«ë}[ó TÒÿ µ?Í©ZO­éß—óù·ôum^ê-)¯ý*s.#.8ý¢iÞ»æÅ_Ÿ“?óšŸóòÏùÊ=#Xó7ä—åå|¾YÐ5Óoõ Û²ÝzqÌ e¿×܈äVä‘ß­veZÇüüCþrïþq«Ìz‡üægüã.Ÿ¦yGVmaów“Ý“•,ðÌoµ+™¸+?¡ë@ßê9±Wì’¼çå¿Ì?(ùsÏ>OÕ"Ö¼±æ½> OCÔá? ¶÷IU…hÊwVXÍŠ¾ ÿœ¼ÿŸ†ùKþqßÌV•—þU¸üäüôÕý8àò^šì`Óä¹êéxÖé4Ï<¼ƒ%´IÍ—vhÃ!}оqšóù=ZÏügeù#ä+Md70y*Q§ÇpПˆ‚ãXúÒ° öE}©Æ»нþq›þ~mÿ1£ü‰ÿœ˜ü½oÈÿÍÙ¯#Ó4ùn Ónµ  g5½åg²–R@‹›È’5%lUú©­^ɦèú®¥¬’éösÜÆ^,ÑFÎ¥6$fÅ_„_’ßóóñ¿ùÊ„ó5Çäoåå}Æ›å­×Z¼—Õ¶xZí\Á C[C!qµR*;‘PÅYæ½ÿ?ÿœÊÿœfÖ4eÿœÄÿœcÒíü•ªÜ 8<ßäéŠ` ,“ý{R³–fUgXH…~Í 6*ýü¹üÁòŸæ¿‘¼­ùä}Mu)ùÃO‹QÑoÀ*Z)6)"ÒHØt;«‚§q›~~MÏÆ¿çâó_âOùSŸŸ–žxÿýOüEõk=Bßêß_õþ­Ëë^c‡—©õi)Æ´ã½6ÍŠ½¿þ†#þNÿóˆß—àÿÆ9ñªÍŠ¿]ü“{æMGÉžQÔ<å§C£ù¾ÿE°¸óV‘m´6º”¶ñ½ÜÖI~æ,£ãm‡Ún¹±WÏŸó™ÿó‘Î/ÿÎ?ù³óSL¶Óõ4ZÏe¥ù7IÕku¨ßN¨T†HdeŽ,ÅUÔ„TuÍŠ¾ZÿŸ}Îwþ`ÎPù»ó+òëó‹Ë>^òü©§Zk^_°Ðmo,ý{Fó׊úòíùDó[TI7;~§æÅ_Œÿó¿óñÎùÅOùÈ #òÛÊPòw˜|¡7—´½sS}bÛPmIÍÍÍÌsŠŽü0 áàZâÆ§Û6*ýXü¬üÍòŸçå甿3¼}úCËrÓãÔ4ÉZ‚HùUd‚eRÁe†@Ñȵ<]Hí›yŸü坿ï™?!ÿç¿37<¡e¦j^còe­Î—c¬E4Ö24÷ÖöÌ&Ky­ä#„ÄŽ2.ôí¶lU,ÿœ3üëóWüäOüãgå¿çtý+Kó7œ?L~“±Ñ"ž ý¬_iñz1ÜÏs(¬VÊ[”ñEØ«éüØ«ñÿþrËþs£þrSò×þr“Kÿœgü‚ü»òg›u¿0XiÒhâ¹úÍÍåüO!dý%§ÛF†ÆCO›JuÏÏ/ùû—å¶›qæ_4Î8yÎÚ’™u+M··ñÆL6öÓÜ9jþÄÒ›ßb¯¬ç ¿ç9|ÿ9¢ëvÖz,¾GüÆòŒqËæ$ÜÜ¥Èh$b‹yc8XÚhyÑ_”jѱ À†Fmо~ÿœóÿœâüöÿœpüêü°ü§üœòw“üÕ?æ&‹kqk˜­/¦º“R»Ô¦±†d¶Ô¬cUbˆ1±$–§MаúŸùüoùÄoËÿù/þ5Y±WÙß󈿘¿ó˜~ÿ•…ÿC_ùEåÿÊ¿Ñ_¢À_ •—ëþ¿×?Hzܵ]N¾§oÇì}³ö¿gb¯Yÿœ‚ÿœü©ÿœeòKyãóS]:u¤îÖú‰j¢}KT¹Uä`³·ªó ɘª%AvZŠìUù‡¦Î~ÿÎqþ´Ú§üâ·üâ-«ù*IšßOóOšÚi⸡)É.ÞïH³WRAe(NŒHß6*œEÿ9Gÿ?Kü¸»ÓäüÔÿœ;мۡ<ñÅtÞXg{ %p¡žçLÔµˆ¡Eä*íoÅ@%º›~®~hy£RòGåæ'´È-¦Õü£åm_[°µ¹%³ÜØYKsH¢vBñ€Ô*HèFlUñ×üûÃþr·óþrÛòÇÎÞuüÇѼ»¢jž[óAÑ,mü·owmnöâÊÚ甫yyxÅùLECJm]ób¯qÿœÿœ¤ü±ÿœTòó¯æì—ºƒ½·”üŸbѶ¥«Ý(’vcŒ0ieo…]‘b¯Íþrþ~…ÿ9d<åùÿ8ûåÏËÿË›À'òýþ¾a7Ø)>«wkõ”`j$†ÕPÓív;PÓÿçäó’_ó>wѼ“ÿ9Ëù–´­]Ê[yßËQ:+ÎxÂÜÞÙ߈ËQmæ•Hÿ•5ÿ*Ó@ò®¹ÿ+üEúoüOk}sé~ˆýè}_êwÖ\y}uùòåZ-8ï]Š¿Oób®ÍŠ»?@_óì¯ýg+ïü u?ú‡³Ïàéÿ9á0ÿu7Ò½“ÿ?Ö?pv}ÏzgfÅ]›vlUÙ±WfÅ]›vlUÙ±WfÅ]› »6vlUÙ±WfÅ]›vlUÙ±WfÅ]›vlUÙ±WfÅ]›vlUÙ±WfÅ]›üÆ*ìØUÙ°+³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÏÏÈ¿õ™5Oütù8ùëŸðÿœŽð¹ýÁç=ªÿ?ÖÏÏ&}–ù“³b®ÍŠ»6*ìØ«³ÿÖüÿâ¯ßÌØ«³b®ÍŠ»6*üÿœúÿä¦Îç9ÿÄßQÍŠ¿GLتÚo›~ùÿ“iç_–£ÿˆ”y±WïölUøƒÿ?¼ÿÉWùÿ^£ÿP#6*ýógþ±™¿óJÞÿâ:ù±Wçÿüù3ÿ$æ·þlÿºUŽlUôüý[YòN›ÿ8gùƒaæÉíÿJë·ÚE·‘-$+õ‰uhïàŸ•¸$ÇmÌäºùëC±V5ÿ8æmsþqëþ}‘¡~`ù¶Ù¾·å(ù“ͺ‘v Ásy}}¥Bz7^¬L§ùd³b¯™?çÐ_”ßãÍKóoþrçó·™¼÷«ù†ëDòî¹ûÉ£ºž4¼Ö/—ÚIÍÔqZ¢T1±Wîå<Ù±Wã?üþ/òFóäöÿ9 ¤Ù-§?,5-;^ÕbøãCÔ§ñ¬¥EY ½–¨â$“ÄSb¯³?ç?7õ?Ï?ùÃ#þak·/yæK¿*ßé^f¼”“%ÅþgÓ§¹ž­pmýf¦Õ~Ý3b¯Îßùñßü¢¿ó‘?öÕòçü˜Ô3b¯ÑùøJùU¿ç >ÿÅâßôzùt¶˜n8íª‹ˆ¿Fp¯íýoÒãMë›xgüúuµÿœ8ÑΪd6æÍtùh=x‹/V0ü+ÛëB~ë›|…ÿ>3ÿ×¢ßoùÒiÿsüØ«÷÷¦lUÕÍŠ¿ ?ç纽ïç·üä_üãüá¿–îË SU·Öüæ‘KjRýV$ukK(®§"•á =ÆlU‡~}EüáÿüýòóOO…4ËŸÍûM6ÇVHG Xmîa_/ß#×µ»GoxÔñ_q›@#6*ü ÿœ¸ò×–¼ëÿ?Xü—òWœtóªù_ΞI·òþ·d( ÕmµË6*Çì²ú܃ Ô€Ãp3b¨oùÁ/Ìï3ÿÎÎLyãþpkóPeò¿˜õ²ß–ºåÀ1ÁúNåTÙI f¢Ã«AÀñ¸ ›3Hsb¯Ñïùùþ±'çßý²´ÿû«YfÅXÿüúãÿXOò3ÿoüIõlØ«ïüØ«ð ó÷ÿ“#ù+ÿ‚çýB\æÅ_¿D…±¢V'°ùæÅ_ÏÇüàÍ®›çùùÏüäŸ?*8ÉùYc™¤¼Õì–¶ ¨ê,K¥S…ÅÊ<ð€hÉ+°¦lUÿ?-?õŸ?ó‡ó«ÿâS.lUûû›Zzüób¯ç3ʺBÿÏÇ?çãrŸÏM6©ùù,/WOÐF·^‘v,ìíù-8þ‘ºss7íùÆB»E:]•ž›¦YA¦éÚ|)oa§ÛF°Ã1¨XãŽ4UT é›EæÅ^Cÿ9 ÿ’ óÃÿ5ÿ™¿î•s›~`Ï“?òA~kæÀmÿíÕc›|äÖ)ÿ9×ÿ?N×<»æúë_•‘³ê1‡‹Z¾åi–Ñ“Y/5YQ¥Ûã‰øWeÍŠ¿¢x¢Ž(ãŠ$E„Ž%UUEtl)›xüåä7—ç#ÿ%<ëù_®ÙÃ-æ¥e-Ï”µ { jÞ6k¤r P²Q^Ÿj6tèÙ±Wåçüùoóo[Ôü¡ù±ù¯Ï3Çù}}m®ùZÚbÅ­ ÔÞhµ UdD¸…d ?nYlU䙿•þZüíÿŸ¯ÿÎA~Oy¦?÷ùä”Ò­oB67±ù3J¼³½U$U­æ·Yw µsb¯XÿŸc~|yŸò£Ï¾sÿœüí‘´Ï2yCR¿ÿ•h×$ñBÏ=ö™µ9G*“yl@£)—Š1›}ÿ?xÿÖ5Ö¿ð*ÐäóæÅ_PÎÿë#ÿÎ9æ¿Ðÿê3b¯?çïÿ›íäùÇ 7òÇK¹+æ/έr;êqß>“¥²^^2ño?Õ¢ Ä„ØìUñüçüãþ¹ÿ8¯ùGÿ8-ùµåH#²ó_ä¬>_óEä`•]lL|Å ºÍñ¿­zó¾lUý y ÎzGæ/‘üŸçï/¹“Có®‹c®i,Ärú½ýº\F+€Gc›~Ïó¿õ×ðvÿ»lUûý›vlUÙúÿŸeë9_àc©ÿÔ=ž|{ÿOùÈ#ÿ ‡û©¾•ìŸø™þ±ûƒ³èvxÓÓ;6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìóÏç§çu§å¯ùGa;ÄÏiOÕýZ~ïKb¸œWqéKq ;=³ßÿà#ÿ|ßðCÑvîx _gèe—_«SÅÇ‹qñ1âÏ=H=,s½»ÛqììšxŸò™(ÿW‘?cö»= žôNÍ]›vlUÙ±WfÅ]›vlUÙ±WfÅ]›vlUÙ±WfÅ]›vlUÙ°«³Îß“¿žŸ™Þ~üìò”RÆÑþ_ë±Zèl€VÈD-¦`GÛîÚVåü®ƒqLú þ ¿ðÍì?³žÎö´¢Aí-,§šÿ‡7_ÁzlØcÃüüY o;ØÝ¹~§S„’˜úµGßꌾ;=Ÿ>=³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÏÏÈ¿õ™5Oütù8ùëŸðÿœŽð¹ýÁç=ªÿ?ÖÏÏ&}–ù“³b®ÍŠ»6*ìØ«³ÿ×üÿâ¯ßÌØ«³b®ÍŠ»6*þs¿çè>N‹óþ~ÿ8Ñù}>§q¢Áç¿.ù7ËÓk6”7‹ªy³U´7‚@ç“’ûŒØ«é?ú#•ö%0?ä\õS6*ýÿœRÿœiÓÿç?.õŸËí7ÏÇŸ Ö<ÇqæÖuµE¸‰î--- ˜pQh{±ÍŠ¿'¼ˆ _óû_9¬€£8Ô +lHo(ÆËJø®ãÛ6*ýýÍŠ¿?ç÷„Ê­üŽZŽGÍZ‰½ˆ©ÍŠ¿HüãÿÎù¦£h¥‹ò^ù%‰ÁVV_.¸ ƒ¸ æÅ_ƒ_óîÿÈßùÊÍ/Ë:ëßó’?ò¥ü¹§y Ùë£,¿Z½ú•´ŸYª+û·Dÿc›K¿4¼‡ç¿ùÇùÊË=cþ~$Ú‡üäW寻3ÿ‡üÑúnöëK†(ç‡ë­œ±eµæ’Md4BàѶ*ý¼ÿœùÓÛVÿœ#üõ·òɉ­SÊÞÙ›2=¨YÜÛ\Êb1¾ŸÕãjSj“›xüùçVÓõùÄ6±µ’·Zu«MQ6ªË$v·Hv$ÐÇ:n†lUú¨3b¯ÿçç:Ο£ÿÎ~u}yÀ}V-NÓá4¬—ëEB׺ª³Ÿe=ób¯/ÿŸch·šWüà™wt¥#ó ÞkÔlýȹžÒ¿KÛµ=³b¯Éïù÷&§ÿ9«¥h¿š×?ó‰¾^ò—™´ç½Òc󵇙žÝ&1ÝI`in­6 $ G=FÝÆÅ_wù›þp·þs·þrïWÑmÿç.8¼¿ä¿Ë &ñoOü¤i}P¬pÅ Û™83"Í<óêx£AØ«öòëòûÊŸ•^GòÇåבô´Ñ¼©åôýOSȬqî]ÜîòHÄ»±Ý˜–;œØ«ùgÿŸvÿÎi_ó–ßò¸IþeyƒòïþUÿøÐý¨ß\ý+úK—­Í—û¯©Ž4þfÍŠ¿K¿èþUÿØ•üÀÿ‘pÕLØ«öjI#†7–WX¢‰KI+ªª¢¤’v Ø«ùlü¡ÿœËüžÒ¿ç=?7¿ç+?8F»©iwgT´ü¬‡G²ŠêhcOL²’Q,ð ¥ÆÑšug'ç±VSÿ?ÿœÓÿœmÿœ´ü´ò^ä /5Ú~`y^{½.çYÓmíí›N½€Å}’;¹™Yž;w > w¨Ø«÷?þpÏó—þWÏüãGå?æ-Ìþ¾¹y£¦™æ¶f«[Kcczì7#Ö’*ƒ¿\Ø«óþr[ùüüãGý²tù;ªæÅ_@ÏÓÿç'üâü±·üëò‹ÿÊÕüš¶{©~¦¤]jZ lgž(9´¶m[ˆhvª¨,ë›x®­ÿ9Hç*¿çÖŸ·º¼ÂãóKÈ:F›£þcÚGC$ÒC¨Ù¼:§‰u 3± D”…k›}“ÿ>¸ÿÖüŒÿÁ›ÿ}[6*ûÿ6*þn¿ç6ü·ç_7ÿÏѼåŸËŸ7€üñ­iþ^·òßœ8³~¹6Ó‘7šFÃ6*Î?ç)?ç¿çâúOå7™õcþrr÷ó“ɺ=…Åçœü—¦_^i—WtHd¸?W¤wq¤jY¢g©§ÂŽvÍŠ¾áÿŸ[ù£ò#ÌßóŽßòü‘u­QúŸæŽ-É¿¾ŸT†ŠòkÙ$š)ãnQ!cøãQð1;| ÿ?dòÌ~tÿœÇÿœdòt×Ói‘y³EÑ´iu;zzÖëæ‹s4u ä‚NCÜfÅ_CÿÑü«ÿ±-ùÿ"àÿª™±WÞ¿ó‰ÿó‹ºwüâ§“<Çäí7Ïš×æ^bÖŽ³&§­„Y¡co¿¢œ‡EËæsb¯È¯ùó,ÇËÿ_ó’^GלŸ6¦•i%Â˼§ôN£=µñ%¾*‰nc¯¿\Ø«÷³ó ÏÎZ|ñ§þ]jÖšæ÷—õ;"k·èÖËY–ÖDÓîn¡¹ WÁŠ@@?}“±Wáüä·›¿çëóŠÿ—P~fþ`ÿÎMùYÐgÖ-´D´òö¥\]ýbî9¥Š]ù^Ñ8Tó­i±ÍŠ¿K4?9ù—óþ}ó?ž¼ã©~˜óW›$5 SÌ:¯£ ¿Ö.ît)¤–OFÝ"‰91&ˆŠ`3b¯¿çÉ¿ù 5¼?å`?ýÒ¬sb¯ÿŸfJ|¹ÿ?ÿœ¥ò¦¾æ?0Ígæ»jÈMd¸±ó-·Ö3ÑËߦáI4¦lUýŒØªœ²G<²È±E—’F P*I' fÅ_Ï?üú /ñ'üä¿üäߟ´´'Ëòér¤OÆ”ý1¬›«P|+«íí›gÚ6ÿóü_6 Òª?ü@¬³b¬×þ~±ÿ8Õ­,>]ÿœÇü¢Y´¯Ì/Êɬäó½Öž \=•œ¨Ö:²…SÊKY W÷4&‰ûaŸó–Ÿó‘ZgüåGüûÌË£ƒÌžfдïÌ]Þ¬4Ý^Ön‚xG7¨’ÅSö$E'•FlUú{ÿ8Uÿ¬ÿ8åÿšÿC§ý"&lUøÿ9·ÿ9 ù{¬ÿÏǼ7æ<º…÷åüãÖiªYiPGu-Æ¡e]VåR $‰[ãEk0,>^û{GüåÏüüþq'þr7þqëóò¢ÒÃÎðëºåŠ\ùNîëHµH¡Õ¬%K«2ò ç($b7`¤„fØôÍŠ¾‘ÿŸ@þrÿÊÁÿœh¹üº¿ŸÕ×?%õ‰4ÅRy;i:£I{a#á!¸…Ge~о`ÿŸçë®ÿàíÿv Ø«÷û6*ìØ«³ôÿ>ÊÿÖr¾ÿÀÇSÿ¨{<ø÷þŸóGþ÷S}+Ù?ñ3ýc÷gÐìñ§¦vlUÙ±WfÅ]›vlUÙ±WfÅ]›vp?ÎýóÞm/ôÏ䇜mlu[‰¸ò†£ee,W´Þ¶÷3ÆLrv¤Àíñ'vÿ€¯kÿÀï¯ò~Úö|ò`É/N«\Ñ–ønr¬˜úÞ8ø‘ßÓ’ÀÜÃÚFz€H ©{¤FÇß·¹Ùñó—ó?óGó#Ì‘Çù­u#ëþTi_£d´ŽÉ­]e&dxcD£óÙ‰ØÙûUÿÿø{#ìge™{-4ºÃÞ É,Ã(1ŽIÊWâ¯Q=KáݳښÍn_ð³ê…ƨF·ßaÕÙïùÇ=Îc~v=­òyÆ×˾@²qï›ït{)Káhí¢y*(ÌHE5äy|'á/ùhb?àÿ(ÏÐOUÚ™4Øõ9£qog™qïq€sÃÆ;ÿguݽڕ/CØÈÆ;×Híê=çêoggÓËX¤‚ÖÚ ®d½š’9o&²LÊ F¨€±ÜñP<ù§ªË¹g8@cŒ¤H„xŒ` ±™™LˆòR”¨z¤Nï§À&üûþ[|‹å ›vlUÙ±WfÅ]›vlUÙ±WfÅ]›vlUÙ±WfÅ]Œ‘K£¢ÈÑ3)E¡e¨§!ÈQÔTdñÈF@‘º>Fˆ;ù|ÐE»>nÎEy»þrÿòOë~dÒ¼ékæŸËŸQU5ôÑôñsaê¸HÒú!Y‚‰pcJ„f Ÿ¢ŸòÏžÊÀKþ ¼ªìùèûZ‰8N§QáçáR–žg%šˆ2–)â äŒ%7ͽ£ÕöïeÞHdÃüîÜo—¯…•€ìù¿ùSùŸù•ùyçÖ?.oåló*)£úº_Ix×sÆâ1 ªáÝåEã·*ô럢_ðQÿ§²¾ØvÑûCŠ?‘ÒøÎá¡(™™ÀdžÇ)qoÃùä7ìžÓÕèóñéï'éåÅÅdmF÷%Ùöÿò/Hÿœ€ýº÷çœm¥½»Š¶~IÓ쬣[Pßµwu Uie¸¯vnƒñ_þ Ý­ÿo̱: Ç%êÕåËšG-tÇ$ê8ÿ§–«~Ÿ¯*tä¾9±Wíwý·üâGþÄoåÿýÇ-?ê¦lUå_óßó:‘?ç üûùƒäý~ÓT_Ì­"/.~_ëVR‰!»o0©ˆÜ[L†‡…™štaü™±WœÿÏ­?"´o"ÿÎ&ySÌîk?˜5o®üÙ{%í´rJ–“0¶Ó‘ÔŸM­­Òu2ß6*û‡ó7òsÉ™—^xü½Ôt:ÒÏΚö%ìV‰-ÍäO Pñ3R:3b¯Ç¯ù󇿫å]sóóþqwÍßèZ÷•u9<ŧéNjÑ\ÚʺF·OòI­îXæÅ[ÿœ–üxùÆŸûdèò{UÍŠ¿vʆÔìÊzS6*þ^ç6ÿ'õïùÂ?ͯÌéüc$ßó”žWÕô˜4Û`½Ô¥.šÂ” Õ/)aÛýçfI"B6*ýŠÿŸ\ÿë ~FÿàÍÿ‰>­›}ý›~~~ÿòd%¿ð\ÿ¨KŒØ«÷éÑ7Pèà«¡ |Ø«ùýÿŸoüƒÿœêÿœ›ÿœl¹f´ÒµOÒQù~$zíåûö—N!OwÓï%’½‡Ï6*‡ÿŸ¡jšv‡ÿ9Íÿ8“­k°éšNkåÛÝSQ¹q6ööþfšIe‘ÛeTE%‰è3b¯ÖïúoùÄýˆßËÿûŽZÍy±W¢~]þ|~L~nÞêZwå懖üû£À—:¥¦‡¨Cy%¼NÜI&bª[`NlUøƒÿ9wù_ù«ÿ85ÿ9cüæ§äï—¤×ÿ,üÕ¨ËçkÕþ­ks©ž­ûF¬a†ùØË ÅJ¤Ì9"Ø«ô¿ò‡þ~7ÿ8•ùµ¡Xj/ù­¤þ\kSF?JycηhÓÚMJ²}få’ÖQàÑÊÀŽ´j¨Ø«âOùúÿüäOäGæ'üãž—äËÿÍß*yïÍ'Îzf t¯.ê–ú©[[{[Å–W’ÍåB™TnÝM|Ø«ìoÊïþF^„)¿ü¨ ¿ð_—6*ùþ|›ÿ’ ó[ÿ6SþáV9±W‰Ît~Y~cÎ ÿÎXysþsŸòŸF“Wònµ¨Åwçk8csog4"ÆþÚñ”?§§ ’Ÿ³;µ(Â>[~§þOÿÎuÿÎ.þrùfÓ_Ñ¿6¼¿å{ù!Y5?)y§PµÑõK)6æ ܨ$ M=HYãéño›|Yÿ9åÿ?ü»ƒÈ÷äwü㯙cüÐüÔüɼ¼ú§•‰Ô,ôë[ñèL-î­ù-ÅÜÊæ(RܹV%˜«*+ìUôOüû‡þq_Qÿœ`ü‹ô|ßn¶ÿ™Ÿ™7QëÞuµ-`‹K-1™vf¶Ff d‘Ae sb¯Š4aOùþ/›?í•þ VY±Wî~©¦iÚÞ›¨hú½Œ:ž“«[Me©é·(²Áqo:åŠXØÊèÅXˆ9±Wògÿ9mùeæßùÂÏ3~yþAÙ­ÕçäÇçÕ¶™­þ_\ÈÅ 'V†òQÈ¡žÍ={i݃Ç!2ŒØ«úÿœwóæ‘ù]ÿ8 ùUù®·Èß”v:åúV"Yi¢oMzüR  ’@¦lUðüúòÞo>Oùÿÿ97çý:c]óî¾ú=õÜ êóK'émbdYCTK4öâ½F&´Ø«öÓü)åoú–´¯¢Îù£6*üÿœYÿ¬BÿŸŸ~g~DÎ?FùóN[Ý7˶Ð,WŠ5½©3"h)·7`@¦ÛdóüÑ_úÚoÿ)·ýØ3b¯ÕÿúoùÄýˆßËÿûŽZÍy±VmäùÈßÈÍMuü±ùoù¹å_|÷ÄqG †(JÉ3Df.""yktZ®ÐÇI€}r¹Hý1Œ{ýäØsÂìó_Ÿ?çß·Þ]òÞ‹®þRy®ëTóç—./íu¼w÷0¿ª²Ù0ÚÝÕ€ ’3)UÁ©o£}†ÿ–õÓöÇjj4>Õèa‡³5DÂÅÅ’X1Ìpj<Ð1³<˜á ‚eÃŽQ1Œ9ü¥‡g¤Èe–›¡ÄF÷æžàly»>•ùCX¼ó•|»­ê:tÚF¥ªiÖ×:ž‘sÃ-­ÓƦx9ehä䦾ùÇíodàìŽØÕè´ùcŸÓ†<°œ2â>HÊ$ÄŒá®ÿƒéz<Ò͆1‘v ÖãàvvHóžr]›vlUÙ±WfÅ]›vlUÙ±WfÅ]ž ÿŸ‘ë2jŸøéòqó×?à%ÿ9?ásûƒÎ{Uþ$¬ŸžLû-ó'fÅ]›vlUÙ±WgÿÑüÿâ¯ßÌØ«³b®ÍŠ»6*ùƒó¯þpÏþq³þr#ÍVvüâü¸ÿyŸKÒ¢Ñ,5?ÓÆŸéØA<÷1Ãéi÷ÖÑšKs#r*[â¡4 мþ‰qÿ8)ÿ–3ÿo3ÿÞ[6*÷ÈïùÅÈ/ùÆë¯1^þKyüsæÈ­ óŸ¥5]GëÚ4 ÓQ¼º ÄÊû ×zí›{›ü™å?Ì.ê~Qó¿—tÿ5ùcY‹ÑÕ4-RÞ;›i–¡‡(äUXV«À‚ÍŠ¾ÔçÓ¿ó…wú©Ô¢ò±¦@ÌYôkMQ„’I§«4’¨ß¢ÈÃ6*û#ò‡òòòB›ËŸ”>AÒü¦]”mA¬Ñ亻hê#k»ÉÞ[‹‚œˆS,ŒEM)\Ø«ÐüÃåý'Í^_×<¯¯ZýBó&Ÿs¥ëV>¤‘zö—‘4ÇêDÈëÉŠ£A6*óÉ?ùǯÊùÇMVò¿äß”Áú¹¨ST±úþ¡¨ú·f$€Éêj77.¿j(¬jҵ͊½ Î~Mò׿”üÅäo9iQë¾UófŸ>—¯é2³Æ··(c•9ÄÉ"ÌŒ¬¦…H Ø«ü—ü†üªÿœzòµï’ÿ'ü²þRòÆ¡©I«ÝiM¨êЛɢŠ%WÔnn]9$( «Ú´©5تyù—ùMùkùÇå×ò§æ’´Ÿ«úE|‰­ÃiÌ·è$ó¤m(kðòišâ‚¿ïêí×®lUö·åWä¯åO䆀|±ùOä=#ÈÚ;•k¨´è)5Ó¨¢Éwråç¸p6+³SjÓ6*ô{»H/­nl®“Õ¶»‰á¸Ž¤rI« ©T ×6*ñÈïùÆoÉùÆë_1Y~Kù'ükæÉm§ó_¤µ-GëZ,‹ ®£utSˆ•¾Á®õ Íнàl)›vlUðýãþpSoù½?ïæó?ýå³b®ÿ¢\ÿÎ öüÿÛÌÿ÷–ÍŠ½¯Ïóˆó_™—Cü¢óŸ¤Ö?.¿,Ò$òO–F³¬ÛGf €ÛDZ[k覒"T4ÎäTïRk±W¾è‘åmDòÇ—ì“LÐ|¹am¥èšlEŠ[ÚYİÁ —,Ä$hT“¶lU6 é›|ñåïùÅÈ/*~rjßó\òèÍ­v[Éõ4ÛꚨK‰5)tÒX³d}Zò#ѧ?íüY±TÃÌ¿óŒß’>oüàò×çߘ¼•úGócÉñ[Áåß5þ’Ô¡ú¼v¦V„}N¤µ~&wÝâbk½h)±W¼fÅ^WùÃù'ù]ùùåò'æç” ó•ä:‚iÒÏsjñÝ[×Ó–+‹9`ž6™IGRÊj¬Aتiù[ù[äOÉo"h_–Ÿ–šøkÉ>Zú×è]ëWWž×.¥¼Ÿ÷÷’Ï3ršwo‰Í+AE н6*ùÿ_ÿœ\üŠóGç.‹ÿ9®ùëß›¾]ú·èo6þ“Ôâô~¨?èq]¥£qW#â„×½sb¯¦lUóÝÏüâ¯ä-×çtó‘ÒyÓüç·t‘<駪@Å’Ëôp/gÚZ=m¿tÜ¡<—íTæÅRÏÎßùÃßùÇOùȽIóGç'åßøÇ]Ðôñ¥éwߥõ}?Ò´¼þŸ§§^Û#|r1«)méZ›xÇýãþpSÿ,gþÞgÿ¼¶lUíÿ’óˆÿóóŽ:¦¹­~L~_ÿƒu?2ZGc¬Üþ–ÕµZŸÔDã¨Þ\ªÑ·ª€}ób¯¡îìí5 K› ëh¯lo"x/,çE’)b‘J¼r#¬¬¤‚¡fÅ_ùßþ}Áÿ8açÛûWTü‘Ó´FåËÉ?—¯5  Y¹5-,.a¶ÿŒ_,تß(Ï·?ç ü™qæŸù¦j÷qÓ”ºýÆüI#•µýÔÖýèi¯|Ø«ë»ß%ùZÿÉ·¿—Òhv¶ÞKÔ4‰t ü¹b¿R¶]6xÙía[c…=&*¾™R£ì‘A›yÿäŸüã×åü㦫y_òoÊ?àý\Ô©ªXýPÔ}[³@dõ5›—_‚5V µiZæÅ^³©éznµ§^éΟm«i:œm©i—°¤ö÷J¥dŠh¤ ŽŒ¦…XFlUð?çÖßó†rÔ¥ÕGå¥Ï”î®_Ô¹‹Ëº­í•³]–Õ¤’‡ù1"lØ«Û?%?ç ÿçÿç/?K~X~WiÚ_˜ø•k¿yµMQ¬!º¾’g€2š0„ aÔØ«éúfÅ^üã7ä¿çßüäŒ^JáùÑ}†ëΤµ#É‚i`}DÝ1þ‹Ç´=¹}¯‹6*÷zfÅ^)ùÛÿ8éù1ÿ9£húç7’ óž›åûÆ¿ÑQ®ïl&·ã1¹K‹ í¦âëNH_‹¤©*¤lU«þ@~Sk¿“PÎ>ê~W’_Ê+}6ËG‹ÊqjZŒXéòE-´ö”¼!Z©3UÀ£–ƒ±Tóò£òòóòCÉgåÏåw—#ò¯“ty.f°Òâæì¬—s<ó;Ü^K<òw;»µQT±W£Ó6*ùãóþqGò óGó?ÊÿœÞwòéOÌß%ýCü5æ»}SUÓå·m.åï,ØÅcyo ÎX4ˆÄŠ)%@b¨Ï?ùſȟùÉOð¿ü®¯#?Á^ÿ ¹=SNú·é«ýkþ9·v¼ùýV/·Êœ~T×b¯ÿ¢\Î åŒÿÛÌÿ÷–ÍŠ½còoþp§þq—þqûÍÒùëò‹òÓü%æ©´ù´¹5OÓ:Õým.9%Ò¿¾¹‹âhׇ!MŽç6*úŸ?@_óì¯ýg+ïü u?ú‡³Ïàéÿ9á0ÿu7Ò½“ÿ?Ö?pv}ÏzgfÅ]›vlUÙ±WfÅ]›vlUÙ±WfÅ]› «³`WfÅ]›vlUÙ±WfÅ]›vlUÙ±WfÅ]›vlUÙ±WfÅ]›vlUÙ±WfÅ]›vlUÙ±WfÅ]›vlUÙ±WfÅ]›vlUÙà¯ùùþ³&©ÿ‘ÿ'=sþ_ó‘Ãþ?¸<çµ_âGúÁÙùäϲß2vlUÙ±WfÅ]›vÿÒüÿâ¯ßÌØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³ôÿ>ÊÿÖr¾ÿÀÇSÿ¨{<ø÷þŸóGþ÷S}+Ù?ñ3ýc÷gÐìñ§¦vlUÙ±WfÅ]›vlUÙ±WfÅ]›vlUÙ±Wa™üË£y;Ëú¿š<Ãx¶.‡l÷Z…ÛôXÐvñ$ÐÜ‘›Ïf½œ×{GÚX;3AŒäÔj&!޲?  $ô–V§›²ä5‹%Øz jàŒÒ[7»/»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìùcÌú'œtxµï/^®¡¤ÏqumÚ}—{;‰-e§°’&7ÞÒ{5¯öw[-hc8³Ææby›sBÿÌÉãéuXõ8üLfâIýRb~Ðìf…ÈvlUÙ±WfÅ]›vlUÙ±WfÅ]›vlUÙ±Wg‚¿çä_úÌš§þ:Güœ|õÏø ÎGø\þàóžÕ‰ëgç“>Ë|ÉÙ±WfÅ]›vlUÙÿÓüÿâ¯ßÌØ«³b®ÍŠ»6*ìØ«³b­W6*êæÅ[ÍŠµ\Ø«y±V‰öÍŠº¹±Vób­›usb­æÅ]›vlUÙ±WfÅZ®lUÕû¼sb®®lUÕÍŠº¹±WW6*êæÅ]_lØ«y±V«í›u~ìØ««›o6*Õsb®®lU¼Ø«UÍŠº¹±Vób®Íе\Ø««›o6*Õsb®®lUºæÅ]›j»Ó6*êæÅ]\Ø««›usb®®lUÕÍŠº¹±Vób®ÏÐüû+ÿYÊûÿOþ¡ìóãßø:ÎAøL?ÝMô¯dÿÄÏõÜŸC³Æž™Ù±WfÅ]›vlUÙ±WfÅ]›vlUÙ±Wg<üÉüÊÑ+4æo1éºÅÞ‡ ¨_éVmz- ‰.$CÓ™AØ‘Q^ÿþ_ð9×ûwÚ?ɽ›O L‡¢²Œ>)þn#!Ã9æ_ÄH V»´»Ogâñr õ1Uïî|Ÿ7ç*ÿç.¿/ÿ3¿+%ò7åÝÖ¥-浩Zu®íZÙ>£lZ~!‰5-2E°ì~ŠË.Ë'{Kì?¶í¿h!„cÓáÉàðd%ãä¬v@€Å,»÷‘^^oí_µú]~‹ÀÓ™\¤8¬W¤o÷€ìê¿”ÿóœÿ•ZwåÏ’´<]ë æí/LƒOÖ-:Ë-¨ôPêÔc*¢¹§sLòïø)ÿË{c¬ö£´u}‹Nt³O..,£Œ2ŸÀÄHÇ)Jÿ† ÛµìŸn´PÒc†s/1нÆ×ñæì÷—–uøüÑ¡ØkÐ階‘o¨§«–­nm.Õ ¢´1/z€Àvφ½¤ìöheÐÏ6òÄjSÁ1——Q€pιFã|‰{Í6 gÆ2˜ƒÒBË§ÅØ}š'!Ù±WfÅ]›vlUÙ±WfÅ]›vlUÙ±WfÅ]…zÞ©úJ¾ÕŽŸ}ª­„FVÓôØ~±w*Ž¢AØ øÏ`NÙ³ìnÌþSÖbÒø¸ðœ’áãË/IåÇ:"½¸¥ér"6EYòøP3£*蟀êìñžç»ÛÍÃ1ˆËÄ¢" kÕÒýÅÙçùÄ_ùÊß$~Sy[ògæ-Ö¢«®ú‡—çµ¶k¯Ý]F¢xqã$e÷ê\çÑòÖ?òË}¿ÿh´Ý±ìô0’tãq9Œ^¬R>Åø¡> ¹ QÛwœöCÚ½?gi¥‡ROÕq¡{cæ/âìúaù]ù³åßÍÝ&mÊšv³‡pƒVÔìšÎ–ß—Õ̆²…¥ (âÕ®Ùù½ÿÏøv§üu±Ðv®]9Ô‘rLJ(Íîÿ¹ÙÔ3ÌÝ£³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÏÏÈ¿õ™5Oütù8ùëŸðÿœŽð¹ýÁç=ªÿ?ÖÏÏ&}–ù“³b®ÍŠ»6*ìØ«³ÿÔüÿâ¯ßÌØ«³b®ÍŠ»6*ìØ«åÿùÌÿÌß7þMÎ1þlþfy ú-7ÍÞUÓí'Ño§‚;˜ã’kûkv&)•‘¾ [¨"¹±Wå§üã÷ýþr«òÏGüÜò÷üåO•|­åmbæú *ÆçJ±·½gröÒú±Yh%8òŒð&W4ì*sb¬ïÍzçüýãþqËO›ÍZÖ¡äÏùÉO(èéêêvº]„3]Ei»Aii£_HÜEXÆ&#í5T›}£ÿ8eÿ9Éù{ÿ9 jPéš|žMüÉò¼Íæ¿!]L³‘°E¼±œ*}bܹ Ä¢´lBºÑ£gØ«ÉÿçèßóŸ›ÿóŽŸ”_—¾hü›ówø;]×<àº^©}õ ?PõmŸu?§éê6÷1¯Çšª†Ú•¥sb¯ü£åŸùü—<©å8èÿó~E]#ÍšM–³¥­ÆŸ¡$ÂÚþ¸ˆHƒËl¸8¨Ð÷ÍŠ¾¢ÿœgò_üüCüÒµ¿ÿœ›üÛòŸœ+WM¼K½G¶Ó"¹kÖQõW k¢ØÉÅZµýímOùÊï,OæuO¬*,Š -Jú"6Ñ—>Ô(¿µMób©‡üãoüüKó?Aüà‹þq›þskÊyó{È´½Îñ@–PËy9ãnš„Q»[”¹$®­ˆˆÕ~$È6*ýUüßó©å/Ê_Í5ès-¶·å(ëz¶pè²,wVVO ²8*À:A=ób¯ÂßùÆ;ÿÏÌç3¼­æO;y;þrƒË¾NÑ<³­>‘-ö‘§ÛNn®h‹e¢IÊ%ITò–­vîv*μÿÿ9!ÿ?ÿœÔt-oþr.,~}þSj—±ØÍæm*mB59 u¼´³±{yÝA*×V²+ÁKi±Wíåæ/–7?/¼¡ù—äÛ¦¼òÏtÈ5M&IYQ&_Š)T $N :ÔÑ•…sb¯ç£þqŸþ~Qÿ9#¬ÎJþ]i›˜Ñù‹òWÏ>lºòÁ¶}H²‰ZîYÈ—V¶P\(·–êÙÜ»‘Àž}j6*þ”‡LØ«áïùøOüäv±ÿ8Ñÿ8å®y·Ê¤zWæ'˜õ ?/ù êH ¹ônçc5ÅÇÕîHÜEk ¤sF^|9 ÷Ø«æÏùõ¯üäÿç×üä ïçþ‡ùõçó>±ù{?—ÓD¶“MÓtË‹V»mR+ôdÓ­­ƒ…{X䤩ï¾lU ÿ?Yÿœ¢üõÿœlÿ• ÿ*SÏ?à¿ñŸø§üKþã4½Gë?£¿D}Wþ:V—\8}j_îø×—ÅZ-6*Ê´ÿŸÑÿìBþ_ÿÒ‡ÿŒÎlUõ?ü┿ç><¿ç?1ÜÿÎYþgùgÏ>MŸE1yoOÐíôèf‡SúÄDJæÏIÓØ¯¢$ZaR>î6*üÿÿœüÿœâÿœüÿœ¯>Iü°ó’Åä]Fѵ»¿$¾¥ÝÇt‚6¹¾Ine³’ñ#’8Û›$ªQjÊV•ÍŠ¿gÿ#ÿ8¼§ù÷ùYäÿÍ%ÏÏEóeŠÜ5£0i¬®˜î¬ç¥?yªÑ·cNCá æÅ^/ÿ9ëù£ç¿ÉùÄÿÍoÌÏËMwü5ço-~‚ý ­}VÖóÑúæ»§ÙÏû‹È§…¹Ã;¯Ä†•¨£FÅ_1hžsÿœäüòÿœ%ÿœ|üÀüˆóî›çG˜ï.î¿0|Ç©Yè°Gw§Eq¨[ª¬Ú¡ÿuš½k±WË›^`ÿŸÄ~J~]ù›óCÏ?›Þ^·ò§” ŠãX–ÎÃÊ—„šxíÓ„K£‚Çœ«]úfÅR¿É<Ïß?ç ¿.ôŸÍ˯ΠçÊšÔ÷vö3_éÞTµœ½”ïo/(›G$QÐÓÇ6*ýFÿœ9Ò?ç347Ï‹ÿ9…æ­/Ìú”÷6È’i‘éQˆ`TŸëÿEÙÚ),Æ:s Ójo]оÑ6*þy¬ç!ÿçâÿó–ßóß‘‘?z>‡mùoæ?6ͤiúÞ Çoo¢èúðÒánF»šGA<@ f–bzìUïŸò­?çô4ßþròÿþ´?üfsb¯Ñ?&?çW“¿ç&»üâó%Ž·ùÛåï+ë7žbó.›¸µ’úºšÖHâŽÖÚ1#ÐjS±WÇóë?ùÈïÎùÈÿ ~jkœÞrÿê~[óŽ‹sú;NÓ½y­LŽœtëkej¶õ`O¾lUúŸ›~@y¿þró×KÿŸ¤ycþqÎÇÏ>‡äÖ£õ/®y;ôf˜Üýo.½óÿ¦µ¡¼œÚaáövÍŠ½þ~ùõù±ÿ8ïùå:þNy¯ü!æmSóOÑ/õ?¨Øjì&Òµ[™!ôµ {˜Ö²ÛDÜ‚†h b©wüû{þs+Yÿœ”òF¿äÍKåÏOËy¤>f2[Ãc&§§K3,W‚ÒáHÞ?WR#cC-Å_¦®lUù3ÿ>îÿœ˜üîüõüÞÿœ ò¿æ§¿ÅåÞ¡o“lFé¶_Sïõ}K–©c÷¬Ý+ÔšìU†ÿÏÅ?ç(ç%¿*ç ?&?&ÿ!|÷cä¡ù™¥iéõ‹½3O½¤u Zm>'’[ÛK‘€—4 ›M[òþ~ãl‡T·ÿœÀò%ƳV‘´é,a6|Þ¼•yùm’”'ˆ0€ )ǨثÍïç:ÿç4¿ç|×¢èóš”–kò±0·µüÆòÄqC4¤T»ÛÏo ±–EP[êòGo!¼•sb¯Ù¯Ëÿ?yKóGÉ~[üÁò&³˜<£æ»4¾Ñ5h*Hž «+ÈèÀ££Èà«ÀŒØ«2ÏÐüû+ÿYÊûÿOþ¡ìóãßø:ÎAøL?ÝMô¯dÿÄÏõÜŸC³Æž™Ù±WfÅ]›vlUÙ±WfÅ]›vlUÙ±Wc$Ž9Qâ•H¤R²Fã’²‘B;FOIBBQ$l±uÉÍÙð›óïòÆ8ÎHy·È‘FyÛO1G¨izeÕo}5’îZÈË´k#úd¨v¥F~áÀ+þ Y=ÿn‡·=¸í!—ˆÃ&mòœWI3¼Ôg›U¸Ó£o¬ÝÛ)H-RX"½’I9zs¢q©õGþX·ûj=Ú¹»KZcØÚ>ãŽR< õ„¿—öÕóýÕîsb¯ÑêfÅ_ÎOçî‰oÿ8ÿ?Lü­ó·‘‘t?+~ljF¯®iQ-’ßÌW²éä*•U£2=Ê©?#´ïÈïÉ?Püæò-ý‘|»o}eqæ-2)¡š-2Ý$ŽHÞà2²° ‚*Ù±W¾y_ó?ò×Ï—’¿0¼³çû8~±wc¢jÖz„ÑCÈ'¨ñÛK#*ò`*E*i›~$ÏÝü§ªþXþlÿÎ9ÎWyFÛÓÕ´[èt­JôU#†‡rº¶“ê;™TÜ)=xÆâ”Ø«÷/ÉžkÒ|óå*ù×A”O¡ù¿H±Ö´yÁ5µü q ¨$£Ž™±Wàßæè?ó˜ßóõŸ(~[ ý#ùwùðC®Ãñ=»G 7éTL½kùÁÈêæÅ_UÿÏä*çtÝ«ÿ!FÚŸòé¨fÅ^ßÿ8{ùáù-¡ÿÎ,ÿÎ?èú׿ÿ’t}[Mò.o¨éw¾`Ó­îmæŽÕÇ,R\+£)؆ŒØ«ë-~kþVùÓQm#Éß™^Vóf¬µËiz6³er!BHa·™ßˆ,4 ¨ÍŠ¿çó?ù4ÿç?íïÿQÚflUûý›|µÿ9«ù©©~KÎ-~t~bh—g¯išÔ4 èÿ¼·¿Ö."Òín#ÿ*n–AÚ«¾ÕÍŠ¾!ÿŸ7þNé~WüÖÿ8O4þjkwvöº³-d]H“ê±À¬j@k´¸w¥9|ûæÅ_°TÍŠ¿ÿçó¿“ZN·ùCäÏÏ Í^BÖàÐõ]E‰%ÑõA'‘‡_FícàÛÔzèv*ú¿òûó>ÿóþ}Ç7æ&­toµ­kòs_¶×¯Ùƒ5Æ¡¦iךuäÌT‘ÊIíˆìM6é›|­ÿ>MÿÉù®?ó 7ýÒ¬sb¯¡¿çê^nò——ç ÿ1ô1ÜÛ WÎw:F™äý2R=k‹øµ+kÂÑ¿¹† $b6R¿bªóïKmkÈ?óï!jzÙšÆk}ÌÞbÓãu<ಟP¿½¶uV؉#"eìCØ«ðÉŸ”Oæïù÷WæO掙`Ã]ü¥üâµ¾mZ$o[ôeÞ™ces:ïðOso)¡øB“Ó|Ø«ú{ÿœWüá‡óçþqïò«óLH²jdÐáO1*ÐÕ¬‹Yê*EúÌ2®üh{æÅ_˜?ó•×’ÎOÿÏÇ?çç,ßy3ò]áó7æ*¥á•V»Žz%^Ö XŸ²ó2ìsb©?üûù,¿ç0ÿç9|¾‹º\kW÷)kN(²óô@"ÔQëm¶“›dóíïýb_ÈOûejÛÚ÷6*ïùùþ±/çßý²´ÿû«YfÅ^ÿ> ÿÖ%ü¸ÿ¶¯˜¿î¯s›~S6*ÞlUüúÿÎ êoüýþsJ}FúßO›ók™R$,|ï§¡œZi›~ôÿŠü­ÿS.•ÿIÍy±V;ù©$s~T~cˬ±Kå=aã‘eekˆ ˆ9±Wä'üùÿ%_ç‡þzwý@œØ«öû6*üó÷ÿ&×É_öîÿÄJLØ«èùý_þ²Ïójé_÷D×3b¯Žç#<·ç/ùÅ<Î1ÿÎ{~Séæ- ÏžZòÜ™:-ÂÙõt›¬ÚÎB"Ôí¾.$¬Ñ´¿l¦lUý~W~eyOóƒòûÊ™~GÔ¥å8éñßé“ì9í$(-ÂXd ‰_…Ô¯lØ«ñƒþ}'ÿ“÷þsWþÚÖŸ÷UÕ³b¬þ~]ÿ­õÿ8oÿ‚¿þ%2fÅ_¿”ÍŠ¼wóÿòsË¿Ÿ”zü©ó5´SZy§Lš:éÀ-e¨"—²¼ˆx¼qãB¦ªH;~FÿÏ”¿25©´ÎïÉmjy ·“ïì5ÿ/ØÈjÖíëÚêQŠšª‰-¡`§&sÔï±Wî éŸ /ùöWþ³•÷þ:ŸýCÙçÇ¿ðtÿœ‚?𘺛é^Éÿ‰Ÿë¸7ŸC³Æž™Ù±WfÅ]›vlUÙ±WfÅ]›vlUÙ±WfÅ]Ï'~_ùOÈqj«å­&;;­~úmOÌ£|ww÷—4²Íq1øœ–r@û+Z(;k½½íŸj§€öŽs8i±G cÓ‹q†Í¥¤>oòêÍ Ž»îç’Þxž)-®þö*? ­^,*´Þ¯gû{Û.ÄÕv3h5F2žz¡˜åÇ.0»Ééᔡ\p&3NNÏÃ<ñÔþò7R芣Þ=üŽáÙ3Î9ÍvlUØ”3ÃqÍo*OXØ2’ „TlE[— ðÈÃ$Ld:G}ÆÇ¼ HÆîÅr¤»6*ìØ«³b®ÍŠ»6*ìØ«±9eŠ¥žyaC$Ó9 ¨Š*Y˜ìrrÌX§–bR‘,’v¹$ò”„EžNÅ2´»6*ì†Eä*Gçk¿ÌY4¨îüãsg›µqûÉ-lâ H-k´JÌîÌTrbÇ‘"€v}¼í‰ö=ŸŽsφIe8£éŽ\Ò¯Þæ­òJ1Œ#/L DŒ¥,1ÙøF êLo!g¤{‡w[ï·eùãÈ>UüÄÑ¿By¯KMBÞ)VçNºÍ•Ôf±ÜÚÌ¿R¡Ü2ŸcU$`ö+Û¾Øö;]ùÞËÌqÌÄÂqú±æÅ-§‹63éÉŽCœd?¥ 5ÝŸ‡[ƒ,ls¬OCл& PZÓ¹ê~ìäI²æ»/»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìðWüü‹ÿY“TÿÀ‡Hÿ“ž¹ÿ/ùÈáÿ ŸÜsÚ¯ñ#ý`ìüògÙo™;6*ìØ«³b®ÍŠ»?ÿÖüÿâ¯ßÌØ«³b®ÍŠ»6*ìØ«âùùþ±/ççý²´ÿû«YfÅXüúÿX“òãþÚ¾bÿº½ÎlUú;\Ø«ùâÿœÿuüÜÿŸ•ÿÎ9þVù|}nóËËå-3_ôõmäºÕ¦Õ.Y¾Ðc›ìÖ•4;fÅ_@ÏìÿòA~TæÀ_û¥_fÅSïÊOùõWüâOœ*,¼Ý­hþf}gÍ^SÑuYáÖåŽ3s}c ÄÅ' ¹ í›}‡ÿ8ñÿ8?ùÿ8¿æ}oÍß•:~³g¬ùƒK:F¢ú–¥%ìfÔÍÅ@œK¾lU)ÿŸƒþQ'ç'üâ_æÎƒ ¸¸Öü±¦Ÿ7yd„ç"Þh@ݲD£öç·Y`ñ“6*ùWþ}éÿ97§é?óï¿4y£Ì“­Õ×üãDåäÈ—6¶ÑOLŒxÒ?=ób¬#þ|çùi©jç7üäç›ë{æÍ v]LÔç_ßI }{T¸W©%n®æEoò ÍнWþ#·üâFšïÿÑ¿êPÍŠ¼Ëþq³þ}ƒÿ8«ùŸùù=ù‰æ­'Ì“y“ΞSÓ5r[mfXak›«u’CaQÈì3b¯¶ÿ ¿ç?ç?çüó7æ冮Zy’m.ãHyuNKÈ~­s$RH=6P9r…h®lUù¥ÿ?™ÿɧÿ8¡ÿoúŽÓ3b¯ßìØ«óÿþ~ƒåëï1Îþp¦ž-ÆúV’Z—‚ÓW³{‚MEEÊBwû?HØ«ÿŸOyŸM׿ç ?/t›)K¿$êþaÑõ„VäRâmVçTPƒa¾ŒÓéï›~’fÅ_—?ó÷¿5éÚüáþ§¡ÝJ‚ûÎþiÑt½*Û=´­¨Èáz•T´ žƒñ±TwüãW–o¼¥ÿ>«²ÒµÞ9îÿ)¼å­F®(} mu]RÜŠ±ŠéHñ±Wå·üû¿ò‹þs Ïß–>vÖÿç?ç ´ÏÊmÓÍÇ_òö§nfK‹Áeo'Ö›;À Õ:ðõÍŠ¾ÿòïüúã^óÿ´Ï?ÎaÎDkߟSéMŸ”bÚØˆùr15̳»¤.@-¼Pî>ÙÍŠ¿C?ç å´òüãGç|ÚMªé¶>Wü²ó+é–V [¬Xè×&(à AE@ŽÂ‚™±Wæüú¿ò×GüÆÿœ üßü¿×_ÕÒ3<Ûæm7Pøw…/4]2Ç’oö“€‘H¡ òÍŠ±ùôÿæÛþWy[þrsò+ó2äiw?‘z…ÿ›o cÉà¶³Y먼ŠÑ-å³»RŸØ«+ÿŸPùOXüÆóOüäWüæ?-Ûôÿ柘®ô/K!þîÝÉ1zm q ‹-6Ûb¬þpUßGÿŸ¢Îkh’É.¨|ퟅ‹Ÿ5ÙL‘¨'z%ÃWýZôÍŠ¤ßóüÝ¿èWðvÿ»lUöýþpÛþ¬¾jÿ¸ìßóFlUô÷üãüâäßüâ¯øËþU%–«gþ;ýúôûÞòýõ¯«ú|Ôp§Ö䯎Þ±Wææ¿ÿ&òxÚ¦ËþèzŽlUõgüüãþq0ÿÎBþN;ù?N3~l~QÃq©è+þÿRÒéê_éÛYè‚hE æ¥UŽlUñ&­ÿ9Gsÿ9?ÿ>©üíÐüÃ~/ÿ6¿* ò¶›çOQÿ}e˜4Ù-5V.jÍ408”Ö¦TsAÍFlUú]ÿ>ÞÿÖ%ü„ÿ¶V¡ÿukÜØ«¿çä?úÄ¿ŸŸöÊÓÿî­e›`óéÿýbOËûjù‹þê÷9±WèölUÙ±WòåùKÿ8ÁäùË/ùøüåçåÏæ.¯æ DÑ|Áçÿ2ZÝyrâÖÚé®­¼Û š#½Ý¥âÊ^9 5 ñPv*ýÿ¢*ÿÎ,ÿÔýù©ÿqMþðy±Wé½äûo)~Bë>@Ð ÕõŸ–|ƒqåý®Yæh¬´¶µƒÕdXÐÈÁJª‚zÓ6*üšÿŸ!O ü²üô¶)¸‹Ìúd²ÂÄ©%“„b<£ò9±Wîsb¯ÀO9)Ô?ç÷^S‚Ì­ÄÖkd×Q©ŒEäÉ.•{ˆ¾*xfÅ^ûÿ?«ÿÖXòþm]+þèzælUö¯–ÿ*¼§ùÛÿ8qùù[çkO­y{Î?•þ]²ºe§«¿¢í^ ¨Ié$ªÈ‡§%ÛlØ«ò³þ}ëù¡æÿùÄßùÈß=Î þsÞzf­«Jß—ºŒ¥„VtY 6Ř…·Õ­¸É­D¼V‚I6*Ê?çÓ¶·?óÿó›ÖWIéÝYëvð\ÇPÜdVÕÕ…A ÐŽÙ±V-ÿ?/ÿÖúÿœ7ÿÁ_ÿ™sb¯ßìØªAæ¯1é^NòϘüÝ®\ ]ʺ]汬]1Gkc ÜLä’ˆNç6*üÿŸ(ù{RÕ|Ëÿ9ùwnÖö7+¤é6Ò.ÐÉss5ÝíÊ%A5…V.§`ã¯mŠ¿ Ó?@_óì¯ýg+ïü u?ú‡³Ïàéÿ9á0ÿu7Ò½“ÿ?Ö?pv}ÏzgfÅ]›vlUÙ±WfÅ]›vlUÙ±WfÅ]›vlUÙ±Wa~©«izŒÚžµ©Zém·¬j7³%¼ó`«ÎY ¨«O\ÏìÎÊÖv¦¢:mçÍ;á†8Ë$å@“Ã#@hrµåÍ Q2œ„@êM™vr?>þ|~\ySÉ^jó&ŸçŸ.뎋¥]]iºU®©i<×71ÆÆV8åf%äâ»ùëÂÿÀ;ÚŽßííggìÝ^ Yóã†L“Á–ÇŽR$Ì¥Á)nzS¨×öö“O§É’9a#’$šØlz—g›?ç <ü¿}ùK>ƒç¿:iš^»åbî(_W¾†Úk‹KÖúâHwBÿ½–UÚ´{gÑòÙðí-/¶‘×vgæÍ¦Õéñ’0bžHcË„x…cŒ¸w 2Þ¸Œ¥æó^Åvî)èN<ù"% ¨€H—ª÷ç¹ø;=¿¡ù·Ê¾f7Ë~fÒ¼Âlø›±¦^Ávb^<ýn<¨i^¹ñgm{+Û‰À{GGŸMÇ|>6)â⪾1â«WV÷5˜sß…8ιð~çdƒ4C³b®ÍŠ»6*ìØ«°‹\ó?–¼±y“Ì:g—áºb–²êWpÚ,Œ¢¥PÌè€z Ýö/³]«Ûr”;;K›S(d0ãžSy bTKhϪŀ’q÷>÷gŽ¿ç0ÿ<<¥§~GùƒGòœ4k\óŒÐèi—ou$VÓ%ÔŽ°» m'»ŒúóþYþµ¬ÿ‚—WÚÚ ø4ÚËPNl91FY!QÃ™Æ Ìeœr€:c“ÆûcÛ˜!ÙÓ†‘”²T}$Gyré@‹³¬þN~}yÍŸ•ÞF×¼Ãç½Móæ“ kÖwú¬öÜ.ã–EqÎHÙ…GB:õÏ+ÿ‚÷üý¡ìk»KCÙý™ªË¥ÇžG ±àËÒ‰"fZŽâ»g‡ö·bëû#9Óë°dÓå °–9Ñäxf¨ô5EßaÏ4x±ÈHw‚ù‡a¦k]›vlUÙ±WfÅ]›vlUÙ±WfÅ]›vlUÙ±WfÅ]ž ÿŸ‘ë2jŸøéòqó×?à%ÿ9?ásûƒÎ{Uþ$¬ŸžLû-ó'fÅ]›vlUÙ±Wgÿ×üÿâ¯ßÌØ«³b®ÍŠ»6*ìØ«âùùþ±7çØÿµVŸÿuk,Ø«á¿ù÷Wüæ§üãä÷üâ¿“/¿2¿6,¼©ç RÖdÔ´[›JF.õ î!a$6’DᣑOÂÆ #6*õ?ÎùûwäΟfÞ\ÿœqÐõ¿Ï?̽f¶¾X¶ƒK½³ÓVé eKˆâ½œ©¡CÇB=DØæÅR?ù÷×üá¿æ†‘ùæ_ùËïùÊæOÎ9=äþ[òÕò »°:•EÖ¡v‰QÏaiéDYYC©±T·þgÿ’ ò£ÿ6ÿÝ*û6*Îÿ(?ççßó‡>Qü¥ü®ò¦»ù©Ûk~Xòމ¤ëÉ j’¬wVVÁ: Ü«t"ªH=³b¯£?(ÿçá󋞘^_ü®ü¹ó®¡«ùËÌÿ[ý §Ï¢ê6‘Éõ+I¯g¬ÓÀ‘¯`vÜïJ ÈÍŠ¾Ó’8æâ•X¥R’ÄÀ2²°¡ æÅ_Ç¿ç ówüã7œç-ç|»cs6‘ùæ ÛL¶‹JÚm•ãjš:¢­K=Äp«סéLØ«ú¤ÿœvü¦³üüü±ü§³à[Éš½¦§4t)6£%n5 –€m-Ô²¸ùæÅ_Ïäõ‘ôÑÿ™F§ý"j±Vÿ8Íÿ?(ÿœGüµÿœ{üšü¿ówŸ5+3ù;Ê:^“¯YG¡js¤WV¶ë¨²ÅnÈà0꤃›}Oùqÿ?ÿœNü×óÇ–¿.¼“ç­GQó_›¯ÃC±—DÔ­ÒYÙKie·TM”îÄ Ø«ó‹þKw‡æ?üâÝýÓzvÖPësÜ8ˆHï4ÖbÜÐ Ø«îú*ÿüá/þ\}Wÿ Ý_þɳb¯Jüµÿœ³ÿœ\ÿœË—ο’~Hóß›ÛVò¦¡/š´[½*úÂ94yš->ê’ÝCMâ(×zއ6*ü‰ü»ógæ¯üú[ó×ÍQüÄòÞ­ç?ùÆïÌ[ÀÚ_˜lU¸XIú¾¡hX¬Bò(IŽâÙÚ2â^+Š¿R$ÿŸ¢ÎGåïÓëù¾óIés]4Mcô‰’ŸÜúMf5v©pŸåS|Ø«óÌù¡ÿ?mÿœ„ò¼ºO–5!ÿÎ-~XÜI ÚÝè„:=Û™±>¡x±¤kFAј° ϱWîWçn“¦ùþq³ósBѬâÓ´}òÓ_°Ò´øG ¶¶Ñ犑{*"€†lUù¥ÿ>MÛò óXx~`?ýÒ¬sb¯ÙÞ»æÅ_'Îuj_¢çÿç!î¶>§’õ 3ɸ½ª-k_Þì;ôÍŠ¼ þ})cõOùÂï'\z¾§éO0y‚ç‡pã|ðq­M¹å]ºÓß6*ü¹ÿŸ”ùkÍßóÿó•ž{óåä-i¥ÿÎVyôÍFt%fké µÕíFæI¤´Šf¥w›èÍŠ¿¿ç¿(-¿!!+¿)áŽ4»òž‡z쑤º­Ï+­JU55Wº–V]öRlUùù[Ë¿óøÿÏm1’Þ3®Ùë€"ü56–:)JUÈZ¶Çö¾lU,ÿŸæïÿB¹ÛþSoû°fÅ_pÑWÿç òãê¿øNêÿöM›{äwüç7üã‡üäWœåòåO›¯µÏ3Á¦Ï«Ieq¤ßÙ'Õmž8äVæÒ¡¥]«S›~o~kÿòhÿ'Oýªl¿î‡¨æÅ_»™±Wóÿ?ü…׿çÿ4<íçÏË»Cä¿üäö›y¤ëúLA’ÚËT’hµ ìÏ„æÝ/-ÆÂ‚H”C]Š¿fçÛßúÄ¿ŸöÊÔ?î­{›wüü‡ÿX—óïþÙZýÕ¬³b¯?ÿŸPmÿ8Kùp:ÿ¹_1Ý^ç6*ýÍŠ´M3b¯À/ùÀm¿çé¿óš~ÿò±ÿñ7Óób¯ßá›Xè’+$ˆt` ŠAêlUüÜ~[ù¿]ÿŸUÿÎ[~bySó ˺ïä漄èþ`²…Ÿ…¼ÒK¦Þ[ÔªM-šÜ¼0‚s,+ðØ«ôËÎóõùÃ?,yZã_Ñ¿1î<÷ªý\É¥ùOGÒu(¯.d ¤l÷¶ÖðÁ¹2ºÐVŽÙ±WÉŸóî/Êß̯ΟùÈ/ÌÏùÏ?Í}]ÏÍÆú/Ë>d‘EÃßñ…§µigµ³³ŒZÆä~𱡬m›zgüþ«ùÅŸ ŠÿåUҿfÅ_£ÿó{þA~Gÿæ¿òÏýÒ­³b¯Ïÿùú7üâö¥ù‹ä]+þr'òÊ)lÿ7¿"Ñun,Awº-¤¿Zc_÷u„€ÜDzñõWv(Å_3ÿÏ›üÑyçoͯùËo:jÇo¨y¾M+[¾·†¾œsjú¥ÌŠ•Þ¤ {fÅR/ùú~¿¤ùWþskþqSÍýßÔ4/-éú«­_py}K?2O<òzq+»qD&ФžÀœØ«ô—RÿŸ™ÿÎi¶Mzÿž6·€‚ÖÏGÖ§™É"ØT|ڃČثó§þr þrßóƒþ~ Ïüã¿üá÷å˜òûXº†ÌÌ=V!j³@Ž®"¸™Hl­j¢Få!š`,kVŽMŠ¿]?ç?ç|½ÿ8·ù/åÏʽèj·öï&¥æÿ1ÄgRÕî‚ýbà'좄X¢¤Fˆ–©;}%Ÿ /ùöWþ³•÷þ:ŸýCÙçÇ¿ðtÿœ‚?𘺛é^Éÿ‰Ÿë¸;>‡g=3³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«°=妡isak õäOåÂ,±K€«££XEdi5y´y¡Ÿå&9 Fq&2„¢n2Œ…ÈÁÁäÆpŒâc!`ó‘÷»>+ÿÎlþD~^þPëZÖ|‘s&˜|é-ãÍäßï!¶[oL¼Öî[”q³J¯ñ²òÆ?ðqö›þzf¶ 3~B8ÀÕ}3ÈrqpãË8g1rFW‰)qŸöÛ°t½›’ÀkÄ¿GAU¸îòùm³³Îßÿ—zæ—æ¿•|…æMfãËún¹,«-Õ¼jÓ;C Î C!â(BŠÄ5  tÏ ¿àåÿÐöØÝonönžœÚxĈȑ'8ãñ$#êœqñ ÊP¸ƒë[Îvgcí n=>Y‰^ãžÂëÊëžþçgèÈŸ—ÞOü´òý·–<“¡ÛèZE¶æ(EdšN†Yåj¼®{³’{t?½¸ö÷¶ýµí)öŸmjg¨Ï>²>˜G¤1ÀT1Àt„Ï2Iú AÙø48†,ˆû|ÉæO™vL³s]›vx¿[üùúüæO–ÿ+Håãå¹4‹ërikwüu\ø±Šb_!ö/cÀ3ó_ð ÕûOá…~r9á/â:,¥˜Ñ2fË.øâ‰è/?opvô4·èàá?×—¨}€‹³Úæ3ã§´vl ìŒyÃɾWóöƒ{å8h¶Úö‡~?Ò,nV 0¯#aFG^ªêCÇ:_d½°ídûGiöF¢zmN?¦p5·XÈoÂ_Å ƒ ¤ ‹¬ÑáÖc8³DJ'¡ül|óà7üä—åw—?(¿6µŸ"ùSW¹ÖtûH-n}+¥Sqi%ÜbeµwJ ÆÈÁ¸­C ª*x?å?à›ÚŸðBö3OÛ«‚2ÎY!p'ÃËRà9£}Î3‰€0$J |ÚNËÅÙºÙ`Å# ;ó¿žÕóvtßùÃOÉ"~sùÏ^ÏÓMoå;kkø<© 1 E$‘£‘¥™X:Ç ©BÜÇÄ)CæßòØ?ðhö‹þÝ…¥—bbŒg­œñL½_—1ˆ”D1a,™Œ§qˆÇ/D‰;?c;MÚš‰øäÔ<<¸½ç ®»ù»>âizV™¡éÖzF§ÛéZ^ŸÃc§ZF°Á kÑ4(Ùø¥Ú}©«í=VM^³,ófË#)䜌ç9r”¤I'̾㋠1@BF#ðvÌÇfÅ]›vlUÙ±WfÅ]›vlUÙ±WfÅ]›vlUÙ±Wg‚¿çä_úÌš§þ:Güœ|õÏø ÎGø\þàóžÕ‰ëgç“>Ë|ÉÙ±WfÅ]›vlUÙÿÐüÿâ¯ßÌØ«³b®ÍŠ»6*ìØªIæ?,ùsÎ:.¡å¯7hoš|¹« ‹TÐ5{Ho¬®QX8I­îãPhÊwæÅ^ sÿ8iÿ8›ur÷RÿÎ8~\¤ŽT²CåÝ>þ¤QB¨:oE߯\Ø«Ö<ùSù_ùt/¿-ü­äEuòöe¥†’Aú¤1V¤“›g´ÍаÏ;~[þ^~eéöšOæ?ü»çý.Âãëv:o™4»MVÞŽ,ž¬q^E*+ñf^@V„ŒØ«ÌÿèS¿ç?ö*¿ðÐÿì6*È<­ÿ8õùämvÇÍ>Jüü¿ò™´¿Wôg˜´O-iZ}ý·¯Á/£smm©Î9‹ «;›zý3b¯4Ö¿%¿'<ÉæËO?y‹òŸÉºÿž¬&¶¸²ó¦£ é÷Z´2ÙkY#¾šZªc!ê”iLØ«Ó3b¬OÎ^Bò7æ6¾_üÁòf…ç½.í4O0éÖÚ¥˜¸ˆ2¤¢ ¸åš‡`•šuÍŠ¼¯þ…;þqgÿa§ò«ÿÝþÈób©Æÿ8ßÿ8ñåMgOó•¿!.¼µæ"Q>“®é^VÒlï-e$7[$‘µ ÝXØ«$óÏåå?ætºtÿ™_–RüŸGI#Òfó6‰a«=ªLTʰ5ä2˜Ã”^AiZ ôÍŠ°OúïùÅŸý†ŸÊ¯ü#t?û#ÍŠ²ÿ%~H~KþZê·ïåÏå’¼­ÝÚ=…Ö±å½NÒ®¤´‘ã•íÞ{8"vž$b¤Ð•SJ›fÚÿ—<¿æÍ&ïAóN‡§ù—CÔ%þ‹ªÚÅyi:ƒZKêè⣡±WÎQÿÎÎ"E«iç|Šo ‡ô_Hí*)·ÔÙM½6ééÓ6*ú_KÒt½O³Òt]:×HÒ´è– 2Ê··‚%û)Q…DQØLتýGN°Õì/´­VÊßSÒõ;ym5-6î$š ‹y¤°Ë•ÑÔ•e`AØ«òOå¿åç妟w¤þ\yËŸ—ú]ýÇÖï´ß-éVšU¼×?ZH¬â‰Yø¨^DV€Ù±Vi›H¼Éå-ùËE¿ò×›ü¿¦ù«Ëšª,z§—õ‹Ho¬nQdUšÚá7ÕXSBë›Sò·”¼«ä}ÃÊÞJòÖ•äÿ,é~¯èÏ.è–Piöþ¼¯<¾µ²Gs–Fvâ¢¬ÅŽäœØª†¿äŸ&ù®óEÔ|Ñå-Ìz‡–æ7>]¾Õ,-ï&°™š7i-dž7hX´HIB UOa›dôÍŠ° ÊoÊËO;Où—kùkå[oÌ{ž_XüÀ‹F±MnNp‹v稬"àòˆzf¯ºü=6ÍŠ»Ï?”ß•Ÿš¢ÿåeþZùWóô¯úüM£XêÿSúϧëý_ëËéz¾’sãN\V½lUçÿô)ßó‹?û ?•_øFèöG›ežMü‹ü’üºÕÛÌ—¿“¾Gò&¼öïhúß—|½¦éwfÞB¬ð™í-ârŒQIZÐ<3b©Åßågå•ÿ,ÿ2/¿.¼±{ù‰§"ÇaçÙô‹)5¨Q¢U‹PhÂŽÊ~„އ6*Ï3b¬[ÎFòWæŽÞ]ó÷“ôOÛÓfšYîP’.$yd4 sN>óì×ü;gÙ?c¥ìß`ÿ‚KQ–yuZ˜ŸßäâÇŠ[xŽ8 ”IÈfeÃ,`ËŸÕ{?‡Y­­G¬DÿêL¿œlû«ôØŸæ§üãÇ”0õÏ:ZÇåOÌÏ*]Úßè>mµi$²‘dŠØT¨š?€-I£en5S?øÿË@vײObjIÖv>³Ly´Ó—ÓÑ1œôó"GOQ•QÇ9o(ñTâ;WÙÜÌ‘ÏFhc!ýÀþ!öއ£³ÐyàoBìØ«³Æ?ó’¿~aó&­y÷òãó/]ò6¿§[M}«éW½‡I¼HÈ쪒ÒÚN*MTp'í(%Ÿ>Äÿ–qÿƒ·fv.«OØ^Ñv>›´4¹gx²þ[ õxe9pÄ(^£å3âÄ}Æñ~Òö\ð–£MšXæ$qH@×ÇÒ}Û}îψòkºÜú¸óÚÅôºð.—[{‰ZðO%–/ÍH5j)Ÿ´Xû³ñh¿! >(éxL<Œ<±(xuÁÁ+76l>"sä9Îv6—E >IáϨ:lÔNxäa8ᨃYñf(ÇÂÜKÙ}–ì,Þ5Zœó™Œx¥ÂÜqoê>\‡[v{Ó>{×fÅ]ž}òüã×”ü±çŸ3~jùƒ‡›?1üÍ©\ßnæ?Üé±LÇÒ¶°‰‹pô¢ ªÄ¹b •Ï{öçþݳ۞Ïhý—Ð^‹²4˜a‹ÂõêeëË©˜‹ÄÉÅ“Âb‰±9DMçôÏ`Á©ž¯'¯4äMžQ¾B#Èm|ýÃgcì¿çü¥å¿ÍÛÍï#*ùWR¹ŠêÓÎ:²c©At„™5 †Q2Ç!*8·בç‘ÖÁ÷¶»kج¾ÉvÙ:Ì0–9ésLÞ}4ñKé37ââ8¥“©ãã30ˆÆ°ö{ pÖ`ôH‚'ôÈ.†è÷å{»;þx3Ð;6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìðWüü‹ÿY“TÿÀ‡Hÿ“ž¹ÿ/ùÈáÿ ŸÜsÚ¯ñ#ý`ìüògÙo™;6*ìØ«³b®ÍŠ»?ÿÑüÿâ¯ßÌØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³ôÿ>ÊÿÖr¾ÿÀÇSÿ¨{<ø÷þŸóGþ÷S}+Ù?ñ3ýc÷gÐìñ§¦vlUÙ±WfÅ]›vlUÙ±WfÅ]›vlUÙ±WfÅ]›vlUÙ±WfÃjìØÙ±Wg%üðò·šüõùiæ$y:{{WÍé•uªÝ¹Xm,'qõÙYT~PUw,â´Zœõoø {OØþË{W¤í®×Œò`ÑfŽ8 ž\ð‰ü¼"O¦˜Ã$§-„1Ê®\1:ŽÜÒæÕé'ƒ Y=$žB'ê>~›çÜìá–?ó‚ÿ’vÿ—’y.êÊæ÷^ž“Mù‚[†¤.Â!¼iäG£B¤S‘góÛu¿òÛžßföœvÎ,ǦÄhªôÇ ðÌí9åÛûûø1“‰ÑCØ^ÏŽ—À ™ãþ+òèô~{îììóÞEóWååå·åçšnàÕ?Âw×VÞ_×-Ú‚óL–O¬@ï<¢t2´eN"ŒFùäŸðzöß±ý¸öš~Ðvd%‡ó˜ñÏ>ðêc $c!éɈG(˜¢xÏbAˆÜ{? Í Ò>R%ÀHŒ‡ñG˜÷u^]]·<]Þ;6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìðWüü‹ÿY“TÿÀ‡Hÿ“ž¹ÿ/ùÈáÿ ŸÜsÚ¯ñ#ý`ìüògÙo™;6*ìØ«³b®ÍŠ»?ÿÒüÿâ¯ßÌØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³ôÿ>ÊÿÖr¾ÿÀÇSÿ¨{<ø÷þŸóGþ÷S}+Ù?ñ3ýc÷gÐìñ§¦vlUÙ±WfÅ]›vlUÙ±WfÅ]›vlUÙ±WfÅ]›vlUÙ±WfÅ]›vlUÙ±WfÅ]› Ó³`WfÅ]›vlUÙ±WfÅ]›vlUÙ±WfÅ]›vlUÙ±WfÅ]›vlUÙ±WfÅ]ž ÿŸ‘ë2jŸøéòqó×?à%ÿ9?ásûƒÎ{Uþ$¬ŸžLû-ó'fÅ]›vlUÙ±WgÿÓüÿâ¯ßÌØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³ôÿ>ÊÿÖr¾ÿÀÇSÿ¨{<ø÷þŸóGþ÷S}+Ù?ñ3ýc÷gÐìñ§¦vlUÙ±WfÅ]›vlUÙ±WfÅ]›vlUÙ±WfÅ]›vlUÙ±WfÅ]›vlUÙ±WfÅ]›vlUÙ±WfÅ]›vlUÙ±WfÅ]›vlUÙ±WfÅ]›vlUÙ±WfÅ]›vlUÙ±Wg‚¿çä_úÌš§þ:Güœ|õÏø ÎGø\þàóžÕ‰ëgç“>Ë|ÉÙ±WfÅ]›vlUÙÿÔüÿâ¯ßÌØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³ôÿ>ÊÿÖr¾ÿÀÇSÿ¨{<ø÷þŸóGþ÷S}'Ù?ñ3ýc÷gÐìñ§§vlUÙ±WfÅ]›vlUÙ±WfÅ]›vlUÙ±WfÅ]›vlUÙ±WfÅ]›vlUÙ±WfÅ]›vlUÙ±WfÅ]›vlUÙ±WfÅ]›vlUÙ±WfÅ]›vlUÙ±WfÅ]›vlUÙ±Wg‚¿çä?ú̺§þ:Güœ|õÏø ÎGø\þàóžÕ‰ëgç“>Ë|ÉÙ±WfÅ]›vlUÙÿÕüÿâ¯ßÌØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«²C¥ù·ÍZ%±³Ñ¼Ëªé6ĕÖÊö{x˵nºŠNaçìí6¢\YqBg¾QüÈl†l<‹°ÃþV'æýO^aÿ¸ßýTÊ?‘t?êÿÒGõ3üÖ_çËæ]›þV'æýO^aÿ¸ßýTÃü‹¡ÿPÇþ’?©5—ùòù—fÿ•‰ùÿSטî'wÿU1þEÐÿ¨cÿIÔ¿šËüù|˳ÊÄüÀÿ©ëÌ?÷»ÿª˜ÿ"èÔ1ÿ¤ê_Íeþ|¾eÙ¿åb~`Ôõæû‰ÝÿÕL‘t?êÿÒGõ/æ²ÿ>_2ìßò±?0?êzóýÄîÿê¦?Ⱥõ é#ú—óYŸ/™voùXŸ˜õ=y‡þâwõSä]ú†?ô‘ýKù¬¿Ï—Ì»7ü¬OÌúž¼Ãÿq;¿ú©ò.‡ýCúHþ¥üÖ_çËæ]›þV'æýO^aÿ¸ßýTÇùCþ¡ý$Rþk/óåó.Íÿ+óþ§¯0ÿÜNïþªcü‹¡ÿPÇþ’?©5—ùòù—fÿ•‰ùÿSטî'wÿU1þEÐÿ¨cÿIÔ¿šËüù|˳ÊÄüÀÿ©ëÌ?÷»ÿª˜ÿ"èÔ1ÿ¤ê_Íeþ|¾eÙ¿åb~`Ôõæû‰ÝÿÕL‘t?êÿÒGõ/æ²ÿ>_2ìßò±?0?êzóýÄîÿê¦?Ⱥõ é#ú—óYŸ/™voùXŸ˜õ=y‡þâwõSä]ú†?ô‘ýKù¬¿Ï—Ì»7ü¬OÌúž¼Ãÿq;¿ú©ò.‡ýCúHþ¥üÖ_çËæ]›þV'æýO^aÿ¸ßýTÇùCþ¡ý$Rþk/óåó.Íÿ+óþ§¯0ÿÜNïþªcü‹¡ÿPÇþ’?©5—ùòù—fÿ•‰ùÿSטî'wÿU1þEÐÿ¨cÿIÔ¿šËüù|˳ÊÄüÀÿ©ëÌ?÷»ÿª˜ÿ"èÔ1ÿ¤ê_Íeþ|¾eÙ¿åb~`Ôõæû‰ÝÿÕL‘t?êÿÒGõ/æ²ÿ>_2ìßò±?0?êzóýÄîÿê¦?Ⱥõ é#ú—óYŸ/™voùXŸ˜õ=y‡þâwõSä]ú†?ô‘ýKù¬¿Ï—Ì»7ü¬OÌúž¼Ãÿq;¿ú©ò.‡ýCúHþ¥üÖ_çËæ]›þV'æýO^aÿ¸ßýTÇùCþ¡ý$Rþk/óåó.Íÿ+óþ§¯0ÿÜNïþªcü‹¡ÿPÇþ’?©5—ùòù—fÿ•‰ùÿSטî'wÿU1þEÐÿ¨cÿIÔ¿šËüù|˳ÊÄüÀÿ©ëÌ?÷»ÿª˜ÿ"èÔ1ÿ¤ê_Íeþ|¾eÙ¿åb~`Ôõæû‰ÝÿÕL‘t?êÿÒGõ/æ²ÿ>_2ìßò±?0?êzóýÄîÿê¦?Ⱥõ é#ú—óYŸ/™voùXŸ˜õ=y‡þâwõSä]ú†?ô‘ýKù¬¿Ï—Ì»7ü¬OÌúž¼Ãÿq;¿ú©ò.‡ýCúHþ¥üÖ_çËæ]›þV'æýO^aÿ¸ßýTÇùCþ¡ý$Rþk/óåó.Íÿ+óþ§¯0ÿÜNïþªcü‹¡ÿPÇþ’?©5—ùòù—fÿ•‰ùÿSטî'wÿU1þEÐÿ¨cÿIÔ¿šËüù|˳ÊÄüÀÿ©ëÌ?÷»ÿª˜ÿ"èÔ1ÿ¤ê_Íeþ|¾eÙ¿åb~`Ôõæû‰ÝÿÕL‘t?êÿÒGõ/æ²ÿ>_2ìßò±?0?êzóýÄîÿê¦?Ⱥõ é#ú—óYŸ/™voùXŸ˜õ=y‡þâwõSä]ú†?ô‘ýKù¬¿Ï—Ì»j^oóf³jlu3êÚ­“0v´¼½žx‹/Ù%$v¶Ëpvn—¸ñâ„eÞ"ù€ÆyòLT¤H÷—dw3Z›vlUÙ±WfÅ]ŸÿÖüÿâ¯ßÌØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»?ÿ×üÿâ¯ßÌØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»?ÿÐüÿâ¯ßÌØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»?ÿÙ endstream endobj 3453 0 obj << /Type /XObject /Subtype /Image /Width 120 /Height 120 /BitsPerComponent 8 /ColorSpace /DeviceRGB /SMask 3463 0 R /Length 1344 /Filter /FlateDecode >> stream xÚíÝ‹OSWpÿŸ%Û+Â(Ð*´Z^&:ÛB¡¥O 86`@• 8X#â6H”­QP“aœ¸)1*肸ÉuT ò†™±d°v# ôör«È¾ßüBHÓžsøÜöÜsJ1{rcP~¨m+8oIçHµ5DaˆÖm—hy©]»õ%˜$)vj\ššC¿Ó%|5¾ÙjgLz¨Ò•lóêLȽ}ç£ã¼Ôôì\^™32ÉJG%Y-EÇfç^òÕøf«ñÉ™¶Ž+añÙ^éžLÈ‹¼¦èPCx¢‰©Ì¹eÎÅ-®î;A±™Ëž%+³|9Ýùé¸ðÛuAe=MÔxx¢ÙþYÝÖv¾üÓmšáÌ9#£Ç›Ïi앉ºƒÉúOÍk¾;ÎAS(~õ/3ú©Ø_PXQ¿ê:,ËVü…>¿jäÅg„¡awzÎ!n½³©ü2§Öî`nmüáLÈ´-¢ÉYžçX¢Óþ=A‹“ítɪë°.Ó‡Qš§ÏÝœ>yöžh×Þ½—He‰J¶1þp¦ÎîÙnE‡‰ÎAãcœŸ ìjßäë à¼~G´r£‡!-}*º Ý0: άœI,nß=ÆRuz‘O•šU¯-ôœôáìµ#Z…ž>÷·.nöÞ*Œpfã¢0œl½°i×Ïp†3œá g8ÃÎp†3œá g8ÃÎp†3œá g8ûÃÙp : ZGƒô©„J£He{{oœ—ÓÞyÝÙ|¶¡µÃ§j<}ñè‰3Ì÷êÂÙOŸšÈ2àìï<~AýÂÎp†3œá g8ÃÎp†3œá g8ÃÎp†3œáÌoÜÓ;cÒáÌ2·þõû«·._ëõ©ºnÜm븪4™e2óª>k¨Ÿ*(63,>›ù™Ép^?x]œá g8ÃÎp†3œá g8ÃÎp†3œá g8ÃÎp†3œá g8Ãù]tÖç~?r¿ &ƒ¯¢/½ä Égfú<êî¹wóî/|Uï½×Å—_Bgÿå÷Ááå·~ÃÙùíÑ`€Tg8ÃÎp†3œá g8ÃÎp†3œá g8ÃÎp~ײŒ©™?6óÐ3wàÃ&g¡Ü0=;ǹ5÷Ø$a­ ‹Ïnu]âÖE÷­¾y–WgêÂQÛR{ÊUs²í­WÝ)WÙ‘&Ïw¬{œE ¦J^£‹[kå5ß°ùäHµEŸ_õeÓÙêú3> ,·Ô)Jôþ½Ò’{„ÊBƒ UßzÑ0h0ÆGpodx¯·¶VISs"ÕV:¾\ºP¯èb-gÔ›ù^iœ·€ó¶•)Aü8ÃΜ7gþèk¯ endstream endobj 3463 0 obj << /Type /XObject /Subtype /Image /Width 120 /Height 120 /BitsPerComponent 8 /ColorSpace /DeviceGray /Length 616 /Filter /FlateDecode >> stream xÚí›Ëj†ÝˆàÊMî™\½´Á ­%©šhŒ­µjš¢B+‚"AQqQp!D7ºí tçkøºqã6ÇÿL£HW.†‚õûàÐdšÉ³ú8“1Ût¶9†o´ô¼xñâÅ‹/^¼xñâÅ‹/^¼xñâÅ‹/^¼xñâÅ‹/^¼xñâÅ‹/^¼xñâÅ‹/^¼xÿEoøPNóÁûxþ†ÙvûÓÞXÌÇâV‹'ìt"idÊ.§36›ÉX?l1—³»AÎZ©”]L¥­£ÿu5W4—ô~JÇ'tÞ T³_ßWúcNU«ßž»¸Ú0ßí~ðàª*¼ŽiÎ(Ħph7³Y»£xëéïùÔ¯¨ËZOQ· ñ¸óÏLëxK!wNçúwx îÅ[YS¯V¿p±Ôë-PdùæÌ7hÉõ-Ût&†ÚuÛäh#w#„Aw?Ÿ·‡…‚=Ð,éu?ÈÙŒ>wAçÕqc£-œÇÛnM³Vû²¶ºº“« W¹ƒñøpcÀÍ(à:2ß¾y ÝV¼y´=Õ¼,ì…æ±^ßSÄÝRìù­ÕÉäúîP,þ;àê•ÊÚp8ÜÁÕˆ€w++ûÆ …ﮕN‡!V×økß¾ù¶í‰‚íU©ho5o4rtÌãÎ#¯©óý{ŽŒn£ú&n¡ÓyÆ•ˆ3ÛÞ¬Õ>ûoàŽkÎ*Àü!¿ :þ&.aíð÷pA¸ióíÛk…ÛÇrÉÞ—‹¶¬€è˜ßZ½¦€óNŽÎŽÏç,ÎÍW¸Ò°µù ›ß; endstream endobj 3454 0 obj << /Type /XObject /Subtype /Image /Width 215 /Height 198 /BitsPerComponent 8 /ColorSpace /DeviceRGB /SMask 3464 0 R /Length 34554 /Filter /FlateDecode >> stream xÚì½sY–ïù¾ÅÛx3íÊÈ‹ž ÷ÂÂÒ{ï=Aï½÷Þ{Rt¢å)JUòå»§{æÅnìÆ~ƒ=7o"‘™)uôTwU'€‰›¿üsϽù?þǧǧǧǧǧǧù¨¯¯û[Þ¾´´øi ?=>þ‘‘–”–gocfkq=˜çâãjuëÚ•ÞΦ²dl¥IÃÏ$È9« ?x½ùÕðÐ@O»µ<59á7ÿò?9V–ŸöÓã¢Ga~ŽDàéæ`® vÏuÑ¥y­ô„!ë[î’ÞÛìžš¹úùª*+@ÐΟÜyþðýù¶Óµ°ûëÈΦîn¼¾÷à`ùɃƒõÕ¥±±Ñ[ׯ yÍ YéIòP¡‡Sb|Ô§aÿô­óvwts´àzšÇÊ9ëCòµÙZ¿lµO¶Ú‹ðöŽ+€¥ÁþG[Kóo§¤Äx1×d2ŽuVFj^n6ú¯À¤"iü ñ‡ÅA|`òí«ó¥™¾hu°«ýí ž'Håììì§3òßäÑÝÙ!ò÷p¶ŠQ8µéx›cáKýaÚëõA=½a[#qO÷€½™©ñؘh RKQx¤Øº$νªBw0£›o ™¬·çsÛóǹçD8ƒU¦xupÕBËŽBît½d±5t±-4)VS_S¾Ü)o¥k½œÍ0ÇG‡ß½þèx±©&“çç&äûTêJ>¦²HÓÆúúÒ¼Tàc[˜æ¾Ð/½3©ØW#ò¢d·•ñ’‡Û­ß|µ÷àøÎÆêRMuèpâï锨W¸Ð²Ð’n?¬ ‚翾¿2WlÚ¥ÈíRx ¼q¨.Þr´Þ·ÔºÔ!Á¿Õ•§yFÊÜÍn\…ß:r¬á8A!wwv–§ëk«dÒP,¤ŸÎà¯ýQ[Seci~å³ßzº9¿}óê?þxþý›»ß¿ÞöhûìÑÁñáæÂÜ,œz X,Â'ÝßË)+>¤&Ã{´Z¸Ð‚(œæCzг5N€™¯›ÝãÓƒÙZÉ…V ¯*óÁñ‘ pÖðQX—Ú‡àèÁ݃ê$¸µû·—¥¸)$NÁ||W?ÿýÄØ,„{óêgíÍŸNå¯ñ‘žçéjÂIsÚ[TWËY¡˜Õ-©Ø/XàQ’Ê-Oõì*ã  ²ØJá‡Ä­>¸5›ÛšíŒ%†û@b2S-™©ƒM†FO‚ÕHêS}Ћë$u*øC+ãMó„*ÂdžRÎw„h$V @D ²¼¶0 ""ð·†7ÂzÿöY”&0Ðß!Xðé´þZ¡€¯UO‹`v845ÖqoI½>—"4¿ñYFZêÝí¹éÄa9Ä‘NTBˆ ¡ã,{ºx–L ­<Î#+=õh®iºB#Ü1!˜uöøain²Ðý†Ð4x>Cî€-*ÈÆÙâðzG;ÎPoÆžÂ@„"–D‡sí!•E p™¨¡“ê‘pV1‡kcòÒ,O@ÑÎÆ Püá»çƳR\ì¬o|òÑ¿´Â/ÜncIy´q¸¥=ØÐê ¼F»Ä‡Û¨´‚“SÉHr„»½Åwß¼îÈëÕ‚.KöÈ‹vQ ,Sö1Á6ÑU&z6-YþcåBäp+Å€Ö”N4Y.ÚŸïµ¶0ƒ¬r[$î`{ vz°½µ^Tϱ¶zw~Ò[^—ê0Ã'GKl ‰Ž ±ÉriÎõë,áí.vÂAf$GÀEâ ½9¾5¼=­Ü™UnL†—f{:Ø¢œ’¦ggÿòLJÕ:­ÍÎŽO(þ2ðSØm­¨Nö"w"ŽîD€ ΄¦Å9®,ôÂYÓ§lÏ(AU@[pA²€Pž™­¥ùãGúšsj2½;‹°\p- ífü€=0¹¯ÙöPÙè¢ÚÉÎ:'+S˳ ò¢L%ñ§¢Í0ççuû:Ê|Á¢?¼=?Û›ÜìÏ„´ëáT¸£0 ³¹>0%!2Àý$)½U|Rb¿3§Ú]PÕ•úg{ÄiQæâdo —ÀãÇ÷¦&»x\¯O(þ£Vf×d!6€ß½ƒ¨“ý¨ãÝHB#@³RC}p²ju‰ $óýÒê<ï$}¢Ú¾(Ù­½44§.Ç^prtøüxÚÕ$€b¬~kÃýA;ØZ—$„k\++t[}¥cAcù„è­0h¬((M‹ÒíÙžŠ¾•õ­+ðsLdhæ£û'_?{ðöl÷ÝÙîÖÚ<<ßYÁ€Zd5Ñ(®ÏóÍŒrJPÚeÆ87ûÍõ…b1ÜWAz­´½3¯\’7TúK‚l1 ½==QÚ‰ñÑOsÓ·G¤Vniö]‰×É~ä½»Q„‘BB'úµõµUp‚*‹5ÉQÉ‘% A¸*ˆ§EVûd-…ÜTµƒùõû§§ç‡SÆNž®ô®ÍOâNšV<˜ȵ$ùÚÛXžß]Í,4Ìd\¤ZWZ<^,œ(N–‰šR}ƒ9r¾+==¿þåçK3#D|(…`¨:²¤µ~8å¥>i ;Î%IkŸ“èÒ]Ï1é—çyÝ]ÓÀ…vx'âd¿`x°N¥”öÛEɾ%ÇÚÜÞÖæ!?ëcb|ˆc}-%Á±»•à„/>Ú‰€ó²»QáÀ±ÉJ éiàƒ†€’Ñ`8ZDFŒ¦E IÓ8ζTðÃö¶–gS‹-‘÷×úNw–ûzpÕð“¸ÝÍ'0ËŒälÌnœÝ;ÎæÓm,G0’+èJã»G»‘0N” AQjðïgf$Åp¬,,n|ùÈ7_?€”|¬N‡„Ї}2}Åe(pðRµè¸)Q©1ŽBîMPÂgúv·ñlNVFxFŠgŸ÷ê«5±àÇêË”¤èO¨üLOGH~»Zø•e>@M£6ÕÜþÞz`&\²1Î B)z4ˆdpPŽ'æVºÃâÂ8¨$ØÚWhyóóJ]ùWçOŽöPù–¾P_y¢d0©_j°Á[?*4`}eq(3füáLô+xASQ*|ÂrsREÂ;O8¬,Î…„}º=òeË›Ÿ‡ß¾|ɲZh F‰!™¡0#Ãõ徉‰1x»¿¯[uY|q‡ÍU%í7ïŸ/NË2’Ë ½ìmn}æ¿ö¡+/psº9=²8ƒ|Lˆ!ìid¤8æx,/ɈRoÍ)÷–Ôp¾HqRÌ”ÁÙÖà4µ#. ‚#nÏ øÝ¿þ š>³³Q‡pÓ"%ùj—ÞlÀaLÛaü¶¡ŒÀä ¤ µ)ƒiK„_<_φš* ¹é|xgŠÃ¾ö@hª5^‚ÃÏÃ?ÿø¶.?t¼AdR AÏ ¶67 FYp[]ðxŸ$=Ñ9=Éy¸Wã v}r¿|DS à r nùÏ•ÆFØAÒ±³¦Ž‹°ÛÝЀ n.+Šò<â£ì‡ûÄ÷î´4ÕÀÙ©ÖÅë ¼ö—Õ ƒÉS¾˜ ÂYî*å5çú¡|¤9d¾1¸­4ÊÉÞNÈukomùéí„pà@ æ j£½RDv?Ì[•ÆCàw8Ý=Â3X*~Õž 3ÑÛÚçƒ4.bçFºÀɦ HyÐ K šãë) ò±ñ¿y÷jz Š!†Dš|voã<Ù«í·×ñPX¸¥…a×ã ”[99pþôã \§‹“2ˆOšª¹Ÿ$ñoØZ^ém@Æ£ W=ŒíäpH\¤]Q®ÇæŠ|ñ½£Hç'Óœ ywUl_*l¬“ôÈ{Ëêð`‹ƒu da02‘SXžGó’÷ï€0înj”aV»ëj´õy…«ã5p%ŸXúkp. òk«uçÇ•ÀPCÈ—ïøÁ…¿·©Á¾x{k‚@µR²µ·6#O‹w¼»ª1òÅdJBÉàr§TdIÉà@5êrYªu.ð= _ŸA8äŒ.pªÖx¦ø%!äúD~'{wúê({º½xoÓËÝu~fj®³ Þʉ9œi-‚¿ŽSÁa1éLˆ!\ M!¥ î·¯ ’ ûïŸmo.Á·ãù¹·*¨Â5‚pIÝVËë‘€"w"ÐhD%Çû@4»¿Ó£”Y5Tùg$9„¨b°«åøx8~âêãp²Ìoݸyõ3T[‹Bµµ§ONîîm®ÔÃU½ÈÇéS¨]V…kÔ þ³Ã¡û+zMúb"%c¥¶¨EÁÔ¤ØâülT“щ@£† ø|Äá¯ÎP’…\0àþTüf+’÷æÇÕJE°DLõ²â\•l°±‚ˆt釗OŸí-mŒu8;Ø7•çRÁ¡±ÎÓÊÅñî*±ƒµù-øK³[ýÍ)ôÂ5U0ÜšU¤Å9âB ¸]¸$§ÇP÷×?¼€ÿÂ¥êçyµ ËAˆ8Ôö¶ 8V×>Ñõ‘ó›Ÿ×”úÂOôK¢Õ¶ÎöDUÖNëÉñáŸÿýÅû·[ÙYi$QÅ™ çšÌ‹ÁÕ‰r£\°/îoÈE28\<€:FRA:èn þðê â@ðÂIN•Êäncn·OùyK„¢²Ägr0†±¡Òœ\à0Â~W=Ý>!Çzñ}¬oÿ~k^Y¯óƒ±Eb¸f7¾üÌcstxxw÷ä¿R±`P''ÂBÔjØQP“áMö»&¸9r¬¿{ÿç&†fBHÄ aA?@dœý¬¥lÛU\iPå²±^ \æƒmÂïkVfW?áq¿¯ûÕ ÷hçμ¤ ,Èt_›•C˜/[Y§ ,ÌrA8X×Ày™ÉMqõv3GËÙ„hqå×/Î~zwÿ`±¢GX“åãR—…”'7-[ƒVk“½›Óüúr©€p4W€Š{e1ð²ñ®¦z­—Ùõ+ ³wǺ ð·Û¡òmWú¶‡û¤ûr²33æ*óÛdÞah]çl_'¸fpÖµ%*Exo<Ò™TÄFåš,T3ÈæeÅÊqpÛÛVŸ©p„ÈÛ¤Èí•| Hšž7ºÊxµ#âÚC0ðö|• ×…eÃUšÇé/_tÿðíæ7oï 4!½† äÛ÷áRÂ@Áuù^ÙI.BîM[ËëŸ ò¿ CÑ×,@£ºŠÆçî:‚puZžžà„o Â]ÂøØ™©a Bän6µ(+¡ÕgÚ+yñ*Ž—«5±.eÖ÷OO¾{ót~jžÉOÓ¢Å#õÁPÅ¡> SbÓ“Qa01@íenuëÚñáÁb}D€B…€Wèä`c}85Ò*õ.–¢¦…õöšNµoâ¼4% ì“yƒà‘ §ušéÑ~Ôj†rœÓÃ=FµhºÖЬ› üóã\ãÃíb娑{wgg~(muDFAx~¿óÛ7›ës'Ç[ óh¾;';“Þ¢VQ"[Ÿ‡ìläw6Ò!„¡í–ˆy·D¼›«ÿ Œ×ع;~±9£€¬–!’Á¹I£´þpc7•Å>!ø¦¶Z^jŒcJ”CN’Kunßšé ®Ï÷‹ ÷ÀSÃðo…N÷Í×mõ›„p4µÁ´V'Ãi¨6˜`“#t„÷¾~ùõbmÈ`[¸Ok˜wK(R¿+ðCN” $ àlVx‹ͺâxHOúÐLÊ n 5fge:ØZW¥+!þ”ºÂձѓd ÂX)å&=xòNV”ìæÀ±þöý«Ã½ùýݵùÙi¼BÃ&ù¥% k+Ãýâé±Pœ»Qî׫A Y€oÍ*¤BsµÔú¿'‡@ ß÷†«ÝçpQ£‡ áö¢ ´.‡pqF©²¤/VÃŒ.m¤„úYcV‘p®=Ü1% 'G‡ï_ÖöÖ–ù餄2ï©·Üß«´¤. ø¨úºº~T¥™#¼,„‰«} X›2ÂGrTÉQxñ›—ç”;^ë‰y¼Ó°½xgsDR"Bkí¹ÞN|·¨ˆˆ‰ dýdL¸¬ÆÝ­É±ŽaQ® HqžÇÔhHkc,è$Q*4@CÄš„<@äã¿Ož" € .Ïñª-öEÕ#ï,*!}Ã% ÂÉ¡à¸H»ª2ŸÒ"4Yöôa)\õð ÂÓâé8§Oî³Æ!U¢Š•Àž´·±„“¾¹±îìh¯’K!&¤Cȳ½ÚËíŽFåA•·½V©xùðÃ0g›`ˆ­\Pï«R,Òp]ú›ÏR4òÑÅÔ0ÀäHEoJJLrˆæ®BròNʵ‡«à»¯OŸÝÛZYœŸìQÈóuÏKà·•p{¤Ãò¢Twô•ÛY‰ ŒRCwq2 gÇ›+Êî6¾Z!€èjáã BH¥Çû$Æ‚tˆ3œEËÛ_þÓX^V`uë7S½!Qá¶@‹IÛëxýmB á@§wÍu6ó7؇pF „«†Cˆ³ãË!\éC!ÜÑ4gG$&¨•ºJ.úŒÉP ±ž--¶„âNBBý´Äið‚ÃÍÎnv¨#Ï Mp€¦¡í8¾zvº86’Ž9¬’º[ݼöôñ£¡\D¬ZV­+ƒ,c(-|¹«´0:8ÀòÚÑ‘?}÷ͳ£Í5ìm9–fñJqi¤[_^ ð_™­…kŠj¤!5Îs%!Ô¯%VÜÐgL¨–B„J9eiœ‚pǨò‰ äÈ!AfˆC:„‹$„ „¥Yžð'„\óÖÆ>W‡Û ýÒµ1y”Ü AÎ \—¥Æ:¦Æ9*C-ï,(q±ÚáÃܱÂçÝŠ Ü@²;Z™sÇ婞¨ós½7"ëØUšh¥tt ׫A»Úâý¢¹Vö–¨%pºzúêñé>QµÎâÛC²üý»7؉ûy{Žw·N ¡0I«èˆñ›ìn^™órwûâ÷¿EÞ–ï—έ‹ó¢BwLB¸îxqFNAˆf´ÏñÜ1!Y¬^תeÖùéniqŽ}-A A€3’å°0(…Ñsæü³%)ž.¶íCõ‚S@2¨‡ðè`ÌPŸaBˆš”â÷‘;FŸÊÅ­UhÐæÑy©)ôi.çÂèn€zü¸±¶äãzÂ3€09ÂÜ1@8Ù-¸,Ûsc*»cá²<2ÎMÀÑàò>!†F3÷N6XËÞUS¹‰¿çÜä€aï#",\n>Zh:škzº;¹5?Ÿüôdr‡G'`ONïžîo.ÏÏÏÎR›Ï@ÎRZZââä@Ÿ)ƒÿ&%Ä÷w¶=<ºûðøîÑÁÞéá>üP[Yα¶|òðôíùý×v^?ÜyýhçÅñ2üQøÓ£ðÞÇ‹p]`_Œ×:i$VÔZ'€p¨Å«o^lÑSãCÜÞ¿Yœï}ñ!D3Îá !vÇÃí"8#-Hf•2¡9½)¨hȯBk³ÏçzC†Á¦ ’ ,†¥Y ûô˜lkVAAx—!»^½8-#<Î&cÍ‹r}X8„²ÑÇw¾~´ ÿï£%Æ€ø8ÉR‰Œ˜eþž.r¾—„ë&ô’ñ°y*EJi0Ä{Ä+ÿüz M¥T$ÆFE†‡øº: Ý‚xþx]@~^.îï:9:|rÿàɃƒßÜÿ櫽Íå¡G»m‡KùÔæH(7yrÈJq @¸¿¥EîAH h¶×òP@¸‚®}CL8¯áì µ »kù †!ü]'›/~Õz¹ÚµéPûǤ"RfSâb8? …kŠ Q„CpØV#CBÈ Mvs= „ËŸ¾ =,<Ù,x~èÙƒå³GÀ[~~Èp*Ø''†—­q*ŠvkÉòoÎðk!J4{;㸻µõÖF{Që='ŠT;‹Sxê64(ýè $Û˜ßêloù¢¾ÖÊ ÝÓ'¿zxÔ_±eeš<éJkZO¯1Ù§)Å·9Í·6Ùí;§v’ó̯~þ‡h•ÄÇÕ†~„ÞC®”¯¿:{ýõCR ??»ßù`¿„›†¶jj☂ðˆ!sâ®wª>CA'e}\q; ¨ µ^‘Á‰ ¤òWJàèp¯T`W1@ØXìççvµ«†—3êQ§C¨C4,à#LAÈÊMö65(;þj—Ú‡…÷vÒž?ì|þtåÞj,3èdj,¾®™o²áá„[䎬¬ô„ˆ dÞðF4…§ç°.AˆW¾ß]š€ì…Jqc”wP`@keqI’ÞR uB¥¼W/G*ÒbxÖV7¯ð¹~ÀÌw¯Î³SâZ¨}iXKœªò"àíë}±”/îÑöVñ¥fhá`'­Ü—"ÓÚ ^  yú³§‡ùÓþÙ|ù¼{sEYUî{„4_l ¡¾>ƒ!D±ô ÚB*”o§â W2¡¨ÊõRÊD¿RGŒ‚™ñðâ4O§/W‡eh© Bz•rBCÉú’ÜdrgÇ{@àÃ{o¾}ödm}u–šlåù»¦Ä•fyµár¦<²¿ÚŸüìîînE‘¡~ÍÅas:jÚÿöÕ9êg 8¬÷·ª[QcCv¼º=ÑT±µª8R«ž(V¥K=EÅ2g;+ó¾ÿn£«ráD!ÇËm*xóê—ëkOîLÒV¾ÃŸÆR) Õí²ÂèòCAH„Jž×uMˆÕÊ `x¯9\¿¿:GÜZ0Ó&0«Êõqn‚!¤d ÂÞ&Ao³€>ob27Áaá츥“oŸx¨üëÀ!6•ˆúÛ…ý™Ü„a©_š D5“ïÞ?‡=Þ ê,áu4fûæD8£W5¹)«Õmà¹.72=Ì!Mê û ;#)ÂSä~)b;°Ìp䈫óRR„vÇë@Ñ`cyŠÈNêqÛÖÒüÅùYQt†kÁwº––’xãê—ð⌴Ôó³§Ç»ë¡~IR;¼g&üiQ€; ÔYÌë*åÑ·_è«ô× ¨uv¥…qp‰m¦Å™MíΪzr8¤¹Ž›á- v¥˜DMãCC_=ðÇï/Þb„dלï¥lðÅlƒA9^aóÁlwȯ«b³²4#å›ÁU îxy0,IcWB¦G†qHq4ÙUH ¿zÚõÕùêݽõ¬Ì <àqÑ¢†š0 jàÓ ãnA„S’î‘ç¢[*EÎh™ÖŠ˜ü8W¼=fGa@G—tÊuhoÌò8ŽõoÎA¸væ²33ìm­kÓ¤(DÔoÌ•¥®«,‡x¯Há!ßÞh=jNÈÄ lìm,ÿóO?t䆵WÂqöÔäôå&slÌ®e¥§¾yõòíÓÝ•ŽèùÆà‘Ê ©­ób]ਠÜ´ÁV™1Ni‘޾®Wàà!¡k«D »fzŒ‹3xW(ø·(×cj$$?‹OTÎQZ42Ôd2 Äs%l á”E„ÙÀUg°2Ç;?Ñ5)NókÐÆìËÂd·¬Xgp‚ †Åiî87AßkZi2,©É;zXøô´îÕ‹¥ãÃÊÕ†‡q‹òÐDêááÞ‡aiN>5RYêS˜…¦› 2ÜÓâÁgµV„íB,† * -õ~NöœßÞÇ]àI§Lk$žŽ¨©fjbþF\ç…\3±;  Ø]¨aœiÊÆ‚³FË3zPØœ0Jè¤U)Ž÷·áeµ%Ù”- ÊR:Yß¾©1ê;Û]ëQ… Û7•0l…„*3ȃL) •«ÕÅÂGu6ǣɎxG4±žè\YâÓÝÆŸÅBD€PWšP¡+Á[÷l¯ªM„ºR¿é&„¤DP6•øƒmއCT'ÔÁêó_p±¸_k(ôÛEûo$ªíg{BH‡Jã°pª/¸®ÄO!)†û¥s3x–b¼¼Lqgvr(¸ºÌ—àpvºµ8Ï£Zç b¸¹¤`L¬°÷ÁÁ)#€ïî+@ É{F FÁagM.щ͹ww»./²#“;Q*$£Äbar\d_[’°úÔ+ûêÁÞY±ëlIDjr"µ-!ÙÆ_+™¨#¶ºõeVFê›×/º ¨0±)Üxxd˜ ^ܤ —47ÖÐdåÅ»š©ÑОvAu¹o\”]bŒ½Jníhg37ÝuI@ˆ!\“•åx™õ‰‹ZÃåÇ3Ö"æ{_wuüÜ#òÆÿ jø1¾Ü—N·Hi¹‰>,,Ëñ\•Q%k aw“45!¨¾BÔÓ̯(òŽÕr@è ³Ý«¹5e¾M5hAÇwß<&÷ÉdV­qÁ‚_Y†ÁLAº³ƒAjý¾w ºsDSÈjWôìZ‡­ q·7‡sº»³óÓÛ³µ® 4°þš ¥ù¦d $XC"Úyøõà ý~˜óuêpÙ•Ï~?33}4Û4oqR#¡6[@{V׋s£\l̯s}}b££_>\é;ÂÁ #F3hCaD[E£<¸cØxO”Às2$ðÊé±|IÊX­ ÄÉÛK*z@H•©Á]*±hÀ1€#k£Ìn4|´Ydqã7s3c¿è9bW»¼W4Œ„E~ > æŸRÙ8,L‰v@ÕÂ%²ff0´¾Ü\*¸ð­0†x± U¨ÞXTp}8xG>j«LvÁ)†pBñ,8e”\¿|D_Š9ÜŸ¯ËÉÊð:ËÔºŽW!}°¸y<8±_ÖùýÕ^ð¤}í H$„ÁnÍá'×úŠÒSá-Äz½³'—Z£ˆ;=é·û ÝÍd¸£Ç·ím-?}ÿöÑn9E2ކ+9Ò¾V—1ç1¤$4d-óDQñ^d¤F†}1%ƒÛË*@]78ñ5v´[BU á63 DÒ1¡X w† A†® Þ/ûË¡[]òrºÞD¡Ò8x\¨¹$,±G†1h¹® £PÃ̑ӓœw"A Éù>N “#¨»HøºÛTwçs±SƮΠ8V6U'¦ßI'-ÜP„(íÍ›™akiñîù)и޷UCÍ9[;#eKSChuŽu™l¦Jε°·¶øöÍ9¾í^YL6 B,Ú—âì`WU–7Ù,‰”:â­á¾ûðh%O‘ä$¹ÀÁ ùþ³S݆¶™ d¾»Çfm¹ÏP£6òÅ3C¡0¼¨a)Ƽ<× Ò·‹B! ×x8¸3pjB8¹Ijû憊_&„îNVýÕ| BîÊlo6„41\—w×óÕ¡VÒ óÚbßéþ–G6Α±‚ÂY€ˆÈÎææÉñáƒãt¶ÞaŠ!ÑÜ…z'ôûWÃR}ûõ>nñÚ‰ëé@ku[uñ(>Ôoæï)ñuS'ËÛ7±pQsîŸ<>=€gêjkðN5yÉš±r!v¾@o\˜ dă0ï,&ÝŒÐ(ÀV¢ÉšL@èoèöôñ»ë¨,“å9Б†ê~Ûõ—É áèš×{rÚÊ®Q³òb½/†/ÍöøÝHŽr€§Ã8 Dë…÷× `Ä@U0„p¨7¾ø·_ ë«K¡f(¤DQ X¢Ên©?Œ!æp®/´ºÀë®ã¦¹“]Ö‹ŒWÖÔ ½j6n%¦ð²Ò¼!eþæí¼ 1Ć4§ '÷wÁ1, ›¹£í†&væ«c¢"àÔ7)‘_î0ÜÚ ß\,Gë„U±«*¤r¶5ßG.pSˆ¼½É¹¶ À€¬HÞ@ _›Eä|àÉ‘‡ƒZ¸Úl¸‘S§dp¦;JFp(X•çmcqr–?þønb @èßX§£jƒ—È`YqTeEùÂDØE) «›çÅ)Qëáp"ði.çâÙº-„pµ¡Ötsã\~åÁ©V á ! oAÒWeŸ&ií³\&:%”G†Ëp×D—õEUkíöª”Ïž@dˆæï^>£6Q§vò§÷üc§\–íIß­«(Õ]Äpo¸ÊN\è eÞäNJIbN„3VE>×§¿³ßR"F$uä=£”’ɱ!4B»ç,¼Þ $÷•¡†Ãoß¿ÞèÅÓ"S£]ðÌPK‹@|®Éc”Nö6f­ÍÍð²ãzªg†¾]áÉ @߉±.´u{¾XŸ’¬2:gð˜„t_<Ô,Lа‡ÓÔYˆ"y=„™1Î3ÁX^Ðg2'›+¿D$’;‚Cy{YªÒÀµ3ŠÄ"Û$ ú^wŒrd{³:j™9<1ÜÙħúr2yà‘²îiBËPpk\lAfʇ›“±·‰{ ÏMöîùNpH¦*äýñf†Ý:5àºÚ—6+9 SJ¼Aëð½e=êfÇ9‘Îø³yÑ. ¶oÎ¨m¦· ‹@\“Aý–¢ë_~æíéþ§ŸÞ==­3áˆi2¸8…:‹ŽöûÑVÌ“2È윩)öngb·Â%®Š’ݰ b+Ò½ ²“9ò|ú*ùk}2²È0(OPÚ-õICq'ÀýÑ=2áü€´4Ëø™á1èN;ÃÉáJ ·51å”Ër½ÐL=ÁáѦ®¼$ßÚü–å­«ÿñ»çÛ“ xC2U¡$±Cš¦rÄwoèj@>špÓø6Ü”Å+Ñ:òyâ5(ökESþWàc=24¸¹: ÜÛ’OVc†IgÁ"†bf8^™Øšíîì|ÿnÓàˆ™I1|Ùî¶hˆHŸ” z·ô2¨1îœ™ì ®)ôeçÅz_ BV‡ÐW+ІXc±ÔÀXYßþÕ®½¯†¬ ”‰ünÂ1bNzä1F¡çÈÝþÌ%'ìô„&†EÞk³áôæ.Ò%';“.†Tk é” Ëó¼p’r¸QA *\²<5Þ.ñv5¿üæõËG»mäÓ%±Kâ{¸1dpc0k#7l-¤UçMøÉ6ò¦ÆàÓcÃ8ä­»Ã6fZpô8Ð^B¦o#ˆê'ÉQ™éIºï¡­å•ªJÝŸÿýŃã cG ƒ—ÕÒTƒfýFp&dÐÈã¼¥l¬¼˜òÅÛWfy }oÖæù†¨O–¨´k®ÿE¤É®g¯ŽOAXŸçh–GU åxêÄžÐé©™ÖRÈ…ìÁV+ü¼?“ûüÞüÞöžø–‡6—ˆ)ÿ‹çk¾ÿœrÁäNÔó*ßÏõ !¨ñPuZd5T„=òp½P—á‰ÓƒG 7Y0Ds£÷Z›C¼«qÇue©“½-ºÂ~$#8ܼ˜ÞØPíhg³>Ÿ†O âp™<TŸ‚ÙÞPÈ m-®;Ù¡] ÷ÑMsž=Úi}¸MÚñx’É>ÙÃ;­`sƒ…ÄËŽW–Ð~2Äæ69I! 1®D"6ÎKöÍÊH}õt–þÅÉënE³¹€&òæ§êq³VaŽ+Yœ‘AˆØÑÖ‚8$Ú§s25­- ä†3•xÃfmðb„ph¨EX]àÃJIHGÃéåApÄàé¨ë± Î5?ÎÕÑòœž8Û|'ã̵…`¼Ú¦KóéUkºG¦§']5ƒMBã~†KÄoØe€é”CD¨µæ‡o6éžFjZ¢¯=üšÑ[Ó‹Mè. T±©ÄOèO¢9ÖÔýJ¨¹j‘ý&&>®™qAíeø‹¥¸±.@øðÕ™­ÅÕ³³ÇËI¤ ^$®¸´i<mzj&„N)³2¨§e6_‡ï_ÏÃË8V«£8»}Hñ·ÎNp1™’`¤ „ÓnGA'½6Û‡ëzõX«q¶·Š—s¨hµ‡\¨H/^˜žL(JÒ=ðM¥éý ì4™>²ªë‘`Åœ2¶·6Î×cÝC³!j¥¤¾*tr8„\ ®Ï—É:ö[éÑQ€ŸWEYnG¯(Å]onÈ’–á@Lϲoˆ@ŠRÝYeü}k }‚øþ?¼»K¹`Ü!ÓÖŒvûß]Ï&ãÀ½Èêr_vU'‡#Ã'wÑM…ŸãïBôËž"¹X N^˜’Ð˃!#,鬘]ÿì¡å?Põ’ÃÞ0|¥PCb¨OO’´öè\Ó; ébhªf¢Ûi1ºBNù›÷Ï¥?¼W… Ü¿£­&òå-ÃŒ*隉(5Á}°à¡ÀêË#!Ò+H4†úí)£“ÙX„V¦¬/ R¿…Ã[’4ƒAÈš‚ î‚Ï„‡?1Õ, {=œîR:¿8­CwIžÕQ{Õ:_cѪÈ…‰0ŽÕõî®È»ÏNëpap{Q¥+ð2éˆ/’Aˆ“"ìMËàCÁtéžc"Sã¹ýcn0:Ø£ZQµ !Dªu9>ô‚á%b˜ïb‡éŠ!â°¿5 ¤ºЄ2“CCžŸUtTăû;Ñ‘¥ÅÙUå¾@ Ïïz|”}U™„Žja–»"ÔrÐU8eº|¯ò<¯2°/¼C¶øXuogdOÀPDâÔ¤g’a¨¹úp ÿL‡ß‹‘ÆøµVÀŸ€?”ãȱ2q~@wIaŒ“ƒ]Uj„ƒ„CUɬŠó=Tr«¢<øos-jœ=Ÿ ÙXÇAÈ`§èæµ/òór©ŒøE,^:â š¨Á+­Ë 28Æ”AýTœÖá:ayš'%ƒ+D5 1Ç7!Jñ÷‡ïëÚ]HÖÄôB˜:Ù$&!ìgzd#1DJˆ ×z1d× ™KãG»%©q޵¥¾ÄYóŠQs€"HÓP¯{±²Ÿá^‘Åí+7¯^©¯«>=,Â~™tjz=¡6iÙd6™`ÏE¬‚\›BÝ€÷÷šÑœ픑ÎÚÈð®YôkŠhƒñ0|£yv“†Zæ áå‹Ç]ûIQ‘ˆÉývh‰Uw»`j4dsIA8ÒÕÌG – ï›—…z'ø¼Ã»ëºBo|M…‰ÍǺ%˲ýå‹òvuWu \;”A B ¶J“A@‡ÔêÖçÿ_LMHQÅ1µØ §'ÃÙžâ4F¤Dœ8,¥YžeÙžr±ˆFjŒc^ª+(n„ƒáÅ;ì±²>IypTÅãúÙXÞ¿üìì1ÎS2RœïÑêØx¢AïšM£X’ÙÜXƒw4¸0BC LÒ,\¸´0ŽKJúœ ¾…é™ "f›Ek ¾y÷ðñ¶“‰;ÚGáë{a ð#½0µ°¾cÞ˜’íçe}gc'\à)ðŽ[0b`ÑJÛ²\/ÃÜW8˜î> /ÙµE‹~ƒšJüMGƒ4\ë#!¤Ë .àÿý=òÊâ´ZhIBHÃ8âðèSx‰aƒ 4ݾ88Ä’ H™MI¦Gup8Ù¼kÊ)G«lË×tOv ¬­Îß]Wæ ûs²3ÿã?~lo-¥×±©ⱉâÄ–ÅóJ`x{­°“hX!¾ ×4:–„Ek…ÓÃÔaãÜ®é– â°'Æiìl¬ào­ÌGÓš˜Cx'¢¯•wÖ²æ¹)•ŒÛ9âÉp °EÇ-ÉB{,ä$¸ 1Ïðh*õï®æç'¹}Œ ¢ÊL¼ëD£Ø ƒ„ Ù>Y×Y! ê*á-µ…ÒÅp¢AհÄp¤QÔPèye¢Ú>"ÔZ)¶ÌOr@­et\›ÊPÀ@‰`Û4‡û›I  ‰gj'RHÒïôò¿ÿóÝ“û%i’hŒâPwÚ®íN*ü!ÐÒ¯ÑN«±E(Ñ~ Ô¡bÑCïe-‰ßÙýºµQÜ ööÍc–RSÃ@àPg"t·VP9qt°‚=9Bí®`ÒÓò– úº^S–ë gj´IdRáä¶rÁ(©ILW{ó¿kšs ÏÔÓŰ¹À¿»,ªÕL6KÚJ¸QN` J»ŠL¯¾jÁRŸ‹¡¾va´Šž¡• Ë0úŠ ½õ¬¬8 ©â!îpèjá;;˜;ÚY$üñ1¹,…Õ‹ÂÜë>)^97ÝÏ/•lêóM2àgYJ| N½¿¿—ÞôìQßîö"Ư¤@Á^vºwG{ËËݬ>U|TâNr:p±Dhdé©qT2B?B|Õ°3â zø©¤¸(Í’Á¾ZAe–œ508}m¥Ü© U™™kµY¦ùbÜ×áÁù»nänû¹B½æÅº€Â5N†‚מ þBW¨‰Èp$ÄÐx6Ù¡˜Ì”‰5òûôi‡Ø7A„oˆ 6e…^rÚZ^Á(þøÃ‹7/Ç.Bq}>œ¨¼µâp‘>FžnSÖ\“—›cP<âÒ€d³ž÷Ù㙡A´ŒÅcU˜'ü°ÿÝ\Emù?ýð‚.€'ú pw]ƒ›xé+GºÛ ásÀ3I_“ÁýB&3b“‹:qRŒ–v²¦H\èí­ä$¸Å‡ÛÁi…ó;×'ã°d`ˆã õvü}¬¯*ÍÔ8RmKpcu¢²$gëÏÒ4Žè ÛCVé‘¡©šaQŠ»ñDž‘SfgÊ´5ò §³á<®-”²ó½$b¹»¡ý¼É»<¼|ùì/~øôA) Eä Û›S*t%”0ÒÛD±‘L2 xCwy8­#8Œ¦Ù×Ï&ïlNã]¼¹®ÍʽM!ü#þ.Ãó'õ$~ô4„(~âï‚ Ü\Œƒš­7Ià>ÄŽtŠ/ɈûáD ßdjŠ„ Îw„ÀùM×:Ú[ü¾,Ùc¼^DÉ À0Z-”þ} ”‰¹#•A DÓfuº·*È2Må0P!ˆ #fO¨ fdÈš@ITÙÓÊ5FË .™q¾C*tx É(O1ÔÓ“œ©åÀºZùZ"VÄ7aüæýó¾ÝD4TxÞk+}”e若ˆtˆ$«(B7¶xñ´ ^pºŸöþõ<Þ8$ {^H1¡‹¢gX„7—Q…ÝÖ€Ÿ!„«€¾z.-9:*Rsè¦$⑱éPД#&!LqmO‘УA2)WšÚ1VÊ©Éð&{,[BýÜlþ>šªçD:džÚV§yS‘a^Œ ½f¸bB ³É™1NŒÚ5Ã)³×&c7¦ÂËr<+Øp ¢¼öVéñá!³Ž­ZR®™Bbs-××Ë€Óº»³óïz÷èÁ4`óüiEˆRfEI(–M £:¾}ÿoÓ„3ލˆ¾®°½-=*ù¥œ/áᢠo–M}¾û Ô,­ÅÎM}†UˆïŒ3Ü!b‡‚ô…í¦Z¶:*x Ò1[éµÁš,ï®R–Ášto !7Êeª^ qÚßB;³ß)ù\,†ÂÎbâ.½Bºš*×@zR”¬ŸÙ7锃CbkT²35“bˆ×Lq¸ºòÙJEî(ÊõÀnÚÇËC£VQÛƒ=¸ïüì왑ÍÍNP/£zìmnCÈ×Ý&ØßÒÆGÙ“àÑ¥‰ö¿€8p,þò§‡ÇFª‹[ñÝp@º»;jï^L Úû·C„î–e’@SŽC¶—˜vÄ}at„S –&yPÑ `ÐQ ñ½ê{áçߟad [à~/¡ÅÛ`ÀÎÞ2sÅ †Ìr ¤Éä2(Fw #S¦‚CjO¥±Š6—sHÍë¡~cZˆHnu¸C·=’FG{«ÔdM”Ö[´ÖßÛÃÉä~¿\·hâØò²Ð’º'æ ÔD©pÌì1Ã?t³ì“ãÃÓ»i´,¹`tƒN"mi@«D÷Ö™Ù:ƒÀÝE´·.’³’cG¼IkÙšé &—2ÑË2¦dêã¥/vÀKo’ÃíÂCöñÄG*jÓ¼I‡$„yQ.3MÖ U®ae(!k…±[ˆ‰àPIBhT<¤8Ü_eVäh’ˆ 4ÊVXÞï† g5áìERÀ wL tïR[š•ÓÛtêÐ{÷#/c ÿv":›ù‘ZÅûWóô §ØkóhüÜTýåb/Œ×·šLFŒ¨ù‘Â$7ÓŽ˜9SŒ“bÈ ¶–iÛüüwi ðv4¬j¤‰!Dxic6ù‚ ¥>ß dtׇFâ½y•i—ÙÒCD±ò‚‘­°UÑyqkk%ŒØØ Q†Åfhðáý5ä{M²GÄ~ôðogUͱºþþÝs:dg]«UË2Ó“]‚FܘÉ(1™Mƒ¨÷¢|„9SŒR€h– ¢mÍšB|œ-~þ¬Äz¾¡žÃT•cåR§ WÜt[°‰ÆÁ¡Ãw¸UD/šæÐØ5¯êu— 0¨Â…›k£,7¶™ÂßJé„ ð± ö˜©-ü+Îåv´µœÖÑ AºïÑAt›‰ýRCÁ|ùBaˆðÝÁh*/#PŸ^êˆiÕéX©­~€PLÞ"€ëü³+¡»ÍçŒ%ÞÍä[PBj£A Mf(ý²‚D7fßõGp8ƒî5Ù-ÁE“êÛŒCD Õ ËJXè(Ñr¡Çýz7Mzje˜¡=ƒÑy;ÞÓßÏ‹†œá½;4öLá‡Õo~L éÉwïèåñÆêú:Ë?’@"™ÈÜT2b²{¹ã 1}’Ž€Òáé K e ÅÏ›H¼oê÷¸¦‹aªÒÁx"ï"§œådT¾f‡&’e€^Äfsxiˆ¨+ðÂ’h E’Æ‘^d¸d^@ ñ¬IÑîe–'Ãw6¤¨S†Y²|.=:~¤óÝÔ†Š]!=ÁG‹^£ GÓ‘tlªK^”¦–¥ÃŠ‹[eäø¼PËgL8b½ ‚׫N÷†Œ˜%ƒà%‹cÜ sÓ>ðt…£BšæDºOä]ä”ñÖIÅá¤C¼cäÇrHsÍ+“2rþw]s ŠÍõ1Cƒ=ôÙŠIšHš°¸(ÑÜ̽ŠHÖ'/a†>¤† ÿìÌ´—ÏF0mMÅh:r½ÔXs"ÌitÁÒ¼ aLŽ€oÒ[}Œ#ÆùÚëAH#Øe¨L£‘þ|æ¤ÅE»Ñ6ü Æ›®tpKâÝéy¦²žÃ‚7݆$)‡äÒ<æ¤}>…ês`¹æÑn‰.ß‹°¡˜+»³9M #å©ñ„ƒ¥ ,JƒièÏ ïϳhMOGµ½ˆ¦’ß¾:‚CC¡`•. àGˆwýk „ÓÏËEŽx¹CJŸ¤«R½h2[ƒw€¤ï ӑÏeÍ¡ÀT:KÐ=bºÊÈ›t`ó´ÿB#±‚¯Œ,Ñ-^a'å™eF;Av†VP¢5•h [e¶7C¾÷ ¼zh¢CB_ÇAõ90\3MÑ„~—ذP9Ë*­‹Æu£ö\c4¶-¶x¨‡áqõÆÎ0Jؓ㺷_Í=\][™Õ•—£[W(e[³ ¼³´ $4p²'áÇ X`¥u¨ÊC÷0"̽(•°wm¨µ”oƒ C â@0|. Vψp,Oõì.ì.C'Žž³ ƒ1!6T>¢ß]Ýû€ëô3Vi”bï™ý6¤u(mËå6dúH|n‡øßœHg•Àòw°¼h—æ<ŠÃ¹Ö`¬‡¡Ü۬ʡ‰$…í—ÃÃæô:ö6‡&\3Ž„bZÂr1Š$ OkŒlÛ4a:=„ôþ.x`Šž?ì|y6òÓ·wÜ[ݹƒ¦žq¯¾_F~¦ÔÛÝr{kû_Ô;dœ¹`zE:,Èüã½0•ŒÄ»6åûé l.ðG{ì+µÅ] ©J¥ÀÎ2œk/û/Ûó¸`4Dxˆ½nþ|Þüüe©œ¢DÖÉavQb›lS}ºp˜nGÏ” ‡ ††ÊáÇq¸‰î‘çn¨ÛÐ9¤‡ˆFUD|sy0*¦2´C¯0‹Û«F­ªëúã"ɲñ>‰£çÅógO±žÜ¥~†Ä™¾oƒ3q_x0;›ÛJ¿š²Ð¾Áò¸ ‡à|;;;Nw ѳDÛ#1"•†  öC×¥{t@ éPÐh†nªV JŸ žE–ÚI`„øØ_Y_]ü™ t4ÿÃ@1ŸCÊ)[‹S™²±S6 KQ˜ÓÊ—sXÒë‡ô~›K%Ý_¬]DOX é3]éÚH’,ï0t’æ»i6Þ+¹èîÆ@Z´&0RåVš+„À¯­–iûÖœ’Ê|éÙÇtˆÇòÝýÁ#¢žg¦ªŒ™7açÂ" i !34áˆõ»y;31!ƒc:a˜ŸÙÏW¯yÜœ©6Ü;e8€d¹=£lø!„¦fR.çа,…Yºa-õeH""ê|hçÎ #‹FFyçRëA‚“5Œß«·}ú*:{Ìä;_óŸm–‹Þ¦üÏÿÌ! àw•æßU˜¿jrùªÕãi—rÁôY9jÁÈG¨O‡±#þHÑŽÜú-å)G )°Qéú³Bh¸9-C‘xÝd—¯Mph¨B’¨`_Ρ¾nƒVŒ1K7'‰¬öŠ—Ñh—w"y­Lʈ½¹V¨g §Q§!?ùbö ±ß‚Š.¤Ãba‹Ž+š';¡ÿ‚Ÿ@#}BdgT†q}›ýûoËÍ·ùQ>jñ;îw€ñ·úB D–¢L„Y¤j2 ´V\“hØF^O àQñóCH»IæAH+_‡TåZÅžIù0‡rjY •ªq¨—D&ŠBvÎB·hÜc.£#–mª™,]hèþ_»£ €WØëò‹’¾EÚÇi aI¦ýÉÑ„zÄ›+¢‚;!ƒ×ÿPrÆm¦#¸"Ók/å:¼ŒÒU°?~öméíoJoïµm·‹O 9Èüy`[-BŠ@*¤j2ó $„$µ$à+ ~6ç§Ç„øFL§,¦ ¤M£P½ ÆI ZÐ%ýk94l³FŸÚ£»fS’¸{ÀðÎØôXñch$€¤Ö›°šÏ÷;dÌR<–îÑÙc&¿tÞ:øˆ™²47c)ìnÿ9ý·ûZô–íAi_µÀd˜ª²A¬âOîLu®ˆàêT°3 ¬þ9ïß¶á„>/·ªs~Zæt¯Â³7Æf¯’»X+¤Ë àQ uMKŠûy ¥ d9ea]°‰9å ‚Cj5Ê_Å!±"€™2_蚉3ª¡„4mÈ ç™ ÐiÔ‰v`XR›°e'·¶ªdÏÄ{?Àk³:0XÙªØêÈ,x¦;„ÅXz xá‹ ¤²ÂçÚE/(ô@/˜)ðTò-:C?Ñõ<¤ôëbë…j!B‚` ¬ sùÙ ¼1]!&ÅÆa”ÈšU¾¾œC¡QöÅ’(&¹Q©ÊC†$šBï‹ÅˆgU— #3tÄe:Ó:id 1²¾îf/w·¾{Æz/<Óìék/&!L°7‚Ð gÁ•9Þ,xø·Ð[^WÛ} „ºÎå/Ív3ù[ø+Xr¿Ë¿‚ ,õõ¾B®ð+º®þïr‡ÿÝoL„‡z§œfgˬâ›m1’e‡ä}Ž˜“)ÆÍ6 ‰~l¹qÖüAñT¾~#A(2iT²¶ÛB­òt‘¼ÔòÓ¥øçäx•B.{y~Ž,ħ­­•îsM²GŸIP\gAø¼ÑèŽ7yÒqÒqÔÎÿ0„ÚAXs„ð+åü­Ë%/Ñê%bžÿß¹ªË ,×CH ³”N´Ê¡Ãù Š6!£ˆm’CÖ )bQ=DdqHF‰¬"nÂaÄŠôÌ…Iãö,ÈYt¿W–—XJl ÇÆ ³¼¬äèîfAn2Úä°>'DÌ{ôà<:{ôí7'M@(rÿ’þ$¨ ‚pÝ£ö~ÎkÝ> ¡Æöo„Óµ_êÝœæ{ù+á°ÿïîh *p¬€×þ¿EBèvc 4â0Káh\Á¾¨h"Y“)¦8d…ˆ¨ q€5›–D&Џ ‡‘¶\Dã´Ñî—³úÝV?ÎZt\k 3j<úû IùËOgðQ<Ÿ·¯¿b§gOIŸøÀÅgwû/X$°N! )¨¨Î Êf¥—yd‡Û¿ïË œÄÒ‚ÃL!»‚m"8d­`r¸ô!é­°¦%ñ‰f0ÁAÓ3:SLõLâµ-¦m–iÄ“òÐ@úúùx=}|ÔQÅóóñ~ûõËç²Ø3L½M¬¨žUåƒ3uÐ#Âuúó,Uù¶ô6Éü8W–7ÿ¦ä6…‹˜‘{^}Rî´^+¸- ü볊XÏË_† ï†m>ÆeS[_ü[†Ì!‚o•!wˆ Ëc<šÓýb%¶ì ö¥æD:““)&9d.  õc»²ª7¤$šðÎ ñvúúX1ü#hD@R iXVp‰`Î(·f2ûš#µª°`úº¹8½|ñ”Ï xú訽I7;3y¼žw {T –T`F‡‚.VÿçüÃ_\lM¥±ìàUߢn§ËúÕnÂÕö<Ô§W™ä‰Ïã!„w%ý&B`uù˰´š é××E† ½&J…“e"C°‘hosšŸÈãf¤Ð,Ijñ!ä)ÉavY*§,µSQŒ[[·-uõb%>·Øu›6²BDtÛ2£l…%‰&QDMÚu2m¡‡‹ÑÈd2RfCbIIwßM•qø57Öäç:plr²2z[‹Ó=ì96ÔZšÝvsvêhos´ãjUÊ‘‘aHXâã÷7Ù£ú¯X‚>°ôä]…5îFå™Ñe„Î!–ÎbÊÞB<+g á뜫ű¨G ›Øë&‹pšÆ¾Ë¿Ñ”âû7BˆEõÿ[7½Õ¡Ð× A¨çPŠ€CÐCúL ÖÃñ ak6A˜Ã… *G딣EÍ\ç«ÀaŠÂ$·¿ª‚,Á 2A¦o¤„A«ÉòÆ –Ýåî×PlVÁª’~Š}µ‚>€žA3hdj£aA榤Ù@[deyþ@WÅÚT)~ff ¡«½ab´ÏÛÃýö râ‹ßÿ6X,žž™kÚXì>ZÍc‚§goœvx£áR>BºXgüDçÜ[ų·ø=::„صõ%ÚÂ`1ABÉuÚ‚}o¥*$¾·!é*PmZÆ Ex~Á.žç]iJöe=Ù ö3Î/ÊJ¨(âÿÍ1 ¡«åD‰àPDçA˜æÇšI¹Ä/‡&ë‡t×<^'ÂýØ`ÝÈ„€b]¶H"2¼:@¿FDGRž™4Y‚Òßn)Ae§[ÐnÉDX*ÍÒÜ#¤Öa3ÃŒÍòÆo’´ö o%—Zd˜MnV²“½]QA~IQ¡­µå—ø5ª¢ ARb|¸L* ˆ‰Ž:?{TœæŽq$úÃ-nüæòºÜ@Š|e]º'K!»‚âå¤ÑoadB ñj‘HgÖ¯ÞÞ4tÈmZÆÆù\1ö“}X8Q[–QB‡‰¢öлxm±']¤ „¤ÿ×Jüðn–£N¿Óxíù›õ<²„ÂMEi_äA8Qš!„ÈìJ€±)£°ò+Ï?;Xa¸»XÊrØ_¡g“ØJ6x5¯ðÆõ處DY˜Äa(Þ9S& ùñR:u"ÈgCÎZe™çÍ{÷J¼Îå¥Å÷rüÅË•w®,üÓóâ5Ü5r‘êBçþk時>w õø—ËÂ2n›Ó áBŠX¨Ï@HÆpÿ1ý?ç’ÿ<Ÿ~︅ðtS& álcÞî ¤]Y¼ ­$/ñîB)Ëa›/#”< Çá`mvh\N!*»ˆ¸ì!Q—`¢ò9˜F$Å$¸gX>¹²)ß!;+ó¯ÿñÅK—+­æ?~ö)%wõÒË@Yö¤"üjOZØlÛÛÛ~ð“Õ!”¢à­7:Âßæã¥B}¥‚C’:~gÕÁBxs ½¤žRÝî œ·ðƒvËJ:tw¡8üÁ¢!áp¬Ö(Kb«r8Ùl’/8 gš…0œÀáZgÅàm£Õh )4€&“´ÊìÐÓQ=6:rñD|«®ÊóÎOÞ`©ÃàÝ ^X`H•*„Ä`}pÞ)„…;Xf¤B}uÿ3r‹óY···ÂBÁwŽ™îΗ.Ê8¬³§‰qЇT{¢ÙDb”ʦ9|ûŒï÷kÆ_mØl–J`Û‹žÐÊ%rP %¥Õoä#GY&Å FN¦zÛX?~g“|×_Rü¾úŸºxÁùGÁ6ÖnBãb,Ÿœ²^YÁþr4‘5ÜÊŠó%„†¤Ãèìÿ}¥s²»5,„°'ªCSÊÒ¸,9Ï„ ‡£5ÆÛ ÅJ¾@s¸Q~¬ÏraÒÉbºˆ>Mma©àýjL¸‡_,k?˜ÊüÑ|œ•P”GЄ”0Ò}­"Òª}|µTh;gÚ,æ¼Ï>¾/-ÀÛß×!xÒ$8òà >ªÌ‰B] aïå«{,ð\oÍ»ØÏÉt¹]BØŸËД‘„¢õ-'ªb“„h\’H(ÂîÖúé:Ëár{þÙÁ")NQçð„3¡,d¦%±«B‡œ°>÷Īȿ-Äÿü´8üÉ…2šCÅÐ_¯9$Œ4| )&oÖ¡ &lîÿòó_Ð÷÷tÓÔqÀ£ØéÝÁ >q¬hW-A¸)¬[Å0pÿÁ6©CøöJ¤êÓ#eF’Tú!J•Ø/?ÿl^zôÍ)/âsàŽ—8P !¨„Ûn‰BÚQdË„TR…°e'GÕ¦.6›Ÿ#8¼5ë‹,Å)|ƒ.âs«¥M&*T – Mó¥—zAÚ¥šX®Hþ}!á³ã9¿>m“¡x¥f´5›i9 ¯‡"k.œ‘4òÝåAÂëªàíPvSô"Ì6ÊD¼ýç\ ៧ãÙÒÖ·NyÑ]%½L&lBw<¡#.ž;IÑÊT?,„¦Œägg‹ÂV·v¤*û挗pØæÉ ãeùø²ÿy9‡Õ1d–ÂÒ’xuÁ«ž"{·?ž+’ð[HŽëÝóÅÀ!I!+]©ØL_•u:’²Ú¡²‡oø»2ê0x÷®†. áãYlÝ›‚þçÔ>nU*B**CØ’ýù|Æýe{Ì „ J5 lðQ ¬*vœé±‡ÏÍ•œîµŠ­íR«¹É¥EyTç@sØQšI‡*!ÓDQ½*ERìoÜ4¹óV¼Q’HþiMò¯Èº)g2¸t¤œÏð‚ÿËý.¦îZhõiI@©ÍÊ‹^XI7¡0 ð9‹Ó<Rp~܉îð;=q«]–±:#4¡hj¥Œ=æŒÏ[ÂC»‘ê}Bú"àJ^½pvÀ¯v¦˜p(´ù’õN‹]ÛäÒÌ4ä^uò9¤LóxC]‚H›fiiõ<­:„/MšX÷ Å/¿>S"‰€d™KÈBpÖÜÂÆèiè» Š‡Ø“.’SyµÄ&›k3E¢<ïžj™Ø¯“ëBR”%ôW fô#O MÈîC !hIz縄‹¥ÚK·Ócå.µ˜ÏôÙ.Ž8Ã6o´™¦Ü­q—THsXïLçd³å’øƒõ²….Îüˆ5÷A¸¿÷ý#; G ¥o®÷ÔêØ™ò$×s€É·/ùß`²ãªe؈Ø"êBoJ’Zð½]êÉW¯5gEẄ…;6ǽ=8Ûœ½Éóz¯ y€„ªCH£Å^ÌCA(¸…Óňà CŽézñɸH"p×ßW®ï«Ð¯tlŽØ ‡cõ9´‹(™f$‰·VŠÑÏœµ~¯Ñ§yý¬¿Ò–¬áËZö7Ò‰näIÒ9É/W3D… ®¦È)‚&~÷ ¯ñÀ[p˜RBÒM«ÍºH üéq×…I'Â@ÖbsCø»¡¨6_F= ¼4æ„Þä@Ø#ƒ°Z#bƒÂº2á1BØÝR¿Ü’Ïrþ¡˜·AãËÓ|nÈ¿¨¿B­ÈÛ^œ¹Ú-Ìxv¥›fJ¹IþWÎ m•Èú+/3‰Æûgܤ2šÒwIm9„3 –ð'ˆäû#É¢H^©yØ&–ŸBõ×Ù¶-k⪼Áå°¸E/›"„ÐÉ…4ð䀭½4“UBÁ„-— žU w!*²•BãG‡¶kê€PÎ!@ÊÊ9D."Hâ8âïüC°ÎŸ®ô‰FÓ|»ùü„óò¬‡pè4Å!ÏÜ!—(s§'ø<JûÛ||…=ý¢„âH´Û¯6CmM˜˜¦‹}†ˆ$Y$ðþVóþ¦Úë\¨˜FÖã"Z~-^µtyìä#%WÂAH«7 :Ì—²5záxŸÅÝ„^#=]ɰ[6Ï}Ò̇˜`EÉÃ/…·0Oµå®þè¼°¬7êˆßÏ‹s.VU8RÔ„t)Õ¬‹A˼Î3ÒœseÀHç$9hQM¬üQ¢ŽO\Ší¢ø¶Âò¢”‡…ôûOú“§Z8/îÿ\ þëL,M teX¥x EëB¨^à %jNwÞ™ò ‡§z ·[¤PEJeÿ@fšËBÕ_Ê mÉK¤SXDÌ6%,—ÝY®cܘÃÂÊívvÂNC(Öv N5 ¼–T¿-$T8R±žõH‚ŸCÒtV _:_ñŸs1BNr=ö¡Ik*Õª!Ç€'­‰ÊÖÀUýa"–ö1È“µà‰V* ¥û'K&“~RgkeÃÕÙì ýµ(ýB)³§!È~tE‹<é£9¼1áé)Ñ=7[ÂrÈšfˆVPÔŒ$‘ Ö]Øï– /bg”Úú×ôâ.^šuAkÎA¿ý“‘ØÆb-y¹Íwò5­„¤»ß›Ëv›ÐñB»ðIMÖ3dàÎò癄íEÏö¢ûÕáÌæühqöÝs»Èô.d²*>iÃFð"º*³¦ÚsÑCD†B›IOà½3n¤utã%-PÏ†ê „’û…”ryN@€pCøÙH´ßŠwû÷¥ÙŸIî?*$ÿuoÞ)tܼЉЕ;#‚͘æBH"G%í²ùì–"]ìΨç6ÅaO±îòˆ ¥ïòLóhqgÊ#y‰”$ÊP¼±àC?á3ÑbÌB=ïäWüò˜U,„8Sq{­˜•J±^‘ébÐ:ýÑï‘¿¯Hïk¹Å€nÈï׌ˆLð‚ÐØ Ï¥k˜q Ð|<'¸//ÔÎU^[ò:sCÑÓÆrá×íÂE!'Æ0pÿ+­8)­Ôú—éÄßÏhߟ5—äîBö‘ò˜ëÂnùé1Õ)çzŠ$Ov.6šC!³²i>Ñm=;XDG+H%ëÌÏóo”Ó·š¬Ö($ú¦|± ùh-ÿþ©bNzçœX=»³„kAÿ1³³â…Þx¾òì$V`̾v,ž= rçh‡M\½jÓ/ñööi¯°ïZîÏNØ¥Ë $þ$<¬ÛE" é ^ôšÒ.Lº:ó<é¹ZÁ"\˜p"‡öïS‡Ê,,„B.‚ãø-—‚ VÔ+F¾œ’A7>DKŽ|]®/Ͷ84·Ç}kÍÅ9‰çz‹ÀElvhé8¤M3-‰­¤ðFŠV‚³\Ëêœél¡ï‹'„%éTҪä7²wæõ³~q–Á9lÍg 2 Ût@JPq »æäíc%éqû‘®“-9⤰Ð$ôàÌ“¡™˜Ï­• K¯¸Òs5B˜ ø½:]ÀpÁ·”}^ZòÍ4æÎ4䆅°Ø”¶2µ³DHŸ(„°RcoyoûvFIlvh&ªŒk­"‡ª’Ø[–…8\ëƒK©RmK ý]"³7;4 l°ƒ_›( +§ t¥:• _ @Ý+k%ÒÈ/ÊIŠ2üÈ(pp„d¡§ëL Ðçì‹Íæžb“övgì§C±Ví•k†‡WZh:’ñ¸Ï^Ü ;Úø° bØj q8æm²kˆi&(BÔ¼=䜬6U[Sá—ÂO&¶º´’uVA±4? E ÷—]ð°·û2pÍÒ\þj·¥½$“Œ¹(”qjÚåÉ väŽëRrM$2" ¢hþšðÝe“$¨ªŠ¹äy…W0¾TÀ.M0þl6ƒÆï§óÖf?™·‘a82"ˆÀl‰Á˜)†N®Zh0Ÿî²MVç€CeË „¢Žx%çjsW›ó‡$‘¸=욬1µ8µÐìi—G]tÀ‚Ò‰ÅÚ¢4ÖÅY‘Îd6¨#‰î€ÓhÒDãѨc>2*}cÑ÷°q „¨*s‚h£Ï Fµˆ‘e÷aÖÚ6º5aßò§Ù4ä3ÓKü½´äƒxuÂc×Çsî“Dò¯Ó±ŸÎd=˜±µ¸´ÇÚ-¤/¦jLÐ5‚?%t–`Å}·ÕïìòdB‡6ilGÙsÕz•^ ¡áo¯-qªŽåÓáw¡ †-Và ŠpÍRÔÌ¢^âqO™Þ—“·b¸ÂpºÇÆI'P©6"Ëøñ¼ <Ñ[ˆ~Ýçóôð_Y.ÞY•E:ÉV%]µàaë9LkG„KgãNÉm=Q6)©ÂN,?í”Ñ’Ô°ÀƒEæ®Ð+.V3—7pºÁÄ…À%ýªçPQVìb“:B¨Ê›"Mt¢H—A÷MTÏuÙ Co’6âM>rz„kãç…#a!„ËþôTç“€PXÞ?åÈÍaÄ!@xmÈMGÍ’—(r@Q¨y˜)¾<âŸhf’Vfƒ«|sÚ+¡¸ÔŠ—#øÍ\Éö3sën/Æöú½›QÒÉ´ˆâš¹dÄ5L9;uH€0Ð{qˆ“. 3Ìäy¹Ò–ÉJøÛEœI…»2Èø³áh0Á¤(t{ÈuµÏ",{8uô“IÝ{“y?÷Ð}Uù)·‚øA«6§œ=qLú,w‡üÿµjdézrÚ L]Ü à0€âÙNÛ@‰^ò•$±Ù©E9œ+£îã–ž’,hÀät½i¦Þ„„å/3IlÙ¹zLGK Fh<{#Ùk4² µÞÜ}‚{¹Ï”@ìGU=h=óÐ ²™©C u!æ ˆÓ¢Mž‚K5 ot:ÂêËã•Ew;}™J*úÛCAôU[R$‘Cï !ý»Ñf«É}sL´qceÙ±‡÷Gè$ pÅ.;§þxÆþ„ „-õÈÁÆÂt‰Ã&›†ŽV¸’8ä7löÙe9yfTq¶¯âø÷ÉÃÄ]Tª !m…MtÏë%{ú„t£Y_ïL…üѱ’7Ö8z…D -h Þå‹e-€ñÇ@»``¿B‹6y^ô&±»Ù ±È3ùÕ|®ŠS±ÕnTƒ0hSŽìGå—œП›p?ïƒ=é×ÕízCB½ëC½þÒ È_éu‡Ëõæbý‰‹Ä!×:7Û5;#YìÌ XSˆa{0gƒÈe¤*›¾3dfÜŸfÒÀH$^›ô°©±Zc_¹¾ÎžÖæÃýþÉxʹa»(•«2¥¥h~€@T9LvûùRA¾Âð1ÙoŒA_iÎBü|<C_ZFx¬¦UÒwhuMú¿¾šŠ ÷ –¸*úZËÑ©Êõù¤ôè¶4äÑiäÆÝµU—zÆÊŒ×=ðµÙµ~S²ä%†$‘²ÎkÍÐ8i Åá 2¿œ1™ž®3±7Ø Ãý§˜Ò¢Ù":ÒÎ1/Ýøãx, *´À2,4„䤯u§Ð&’ä:ØApç’¢÷©„Þþl á®,L×LçUY|ƒ@X”«”ÐVd!þ÷úx2Â[D£Üúxõî[K6Ç;¥œäcÉÝmšø˜ënàp½ÉbLŠóCН »Ñ ‹âB#žñôÑŒæD±¡²ÆÀZÜè¤ÏABš£ûØÝÔǵ<)è+¯ôf°‚Ó‹!ìå@HµÑ©Kîp˜ ÂÀý7&Gqƒëÿ=ñ}è>õ !ú±ðþèÎõOOu>Oò¡¶Û;Wmš£‡î ]0ÐB´ÒçBJ( ™íqyÌ"WÅ“…ÈZ}9•¾âåÑ0Å{îdÖ^CÿþjN°×l¼#é$);aò“ú±\ߨ’‡¥f3¼&µxáDU$&"g´eÖò=\gÅÔÞ+™`„.PÙáR‹éÑ!DÃè’É~ "Y]â+Í&ö{õ3•&ðg«L7†<,ŠD¯6å‡bÅëc¢«-¢gx¾*ù£iqüQº"•Å$‘ØkWÊ÷ñjiK>iȽF®g’ØøôTUÇ’æ'©9œªLBŸ¼Ü“Áº¯4„*Å~´9†_Í.Í.½N~,Üù‹=•»w¦Jóˆ¢T©}…Ð87+Cª“|¨ÒÁ]åóöëýîË=ÎÊÜd°Î³×›-È:_t bˆÂg9Š’0®µZj ÓÄõ¦‹•<"Ò¹k“Uz°;w?ž²7—û⢠[Ÿí/béZnÃòx«9YÝ#.ÖÝ ˜×œ´h8òr½‘I¿sæ]ŽTFaå÷’ Ü´!Â/„*cÓÕ™ûOÜ@/§{á+BîÂon.= O2+!z§ß ö{³Ž7‡Ð¼zE’Ùædrx( Y ÇØ]¬K=²_ Â{]É*ëmÒ®5h…”R$>š5ޛǃ¼ÿœÚ¦Ëã;ÝqìnN ¶Ñ3Úà€x *ffƒ\ÉñvK$Út±è\ÜË)\v-Ôæ)ùw+áùÊVyÝÎt:ÀÂÿ{¶Œ !k„'W—¼ú„>7 èÕÇë ^îu!çªM+ ùœLj ´!¿agÔC/à4Eòî€>úY_œŠ5AÏ2m¯A€%¶ãX~>Ÿà¼j°Õ­e1k¨æKNGáfwx?ÒÙtø}vÍ9Ql´kKÞ_ æO*Ô¥?¤GÃ'Í¡*A„ ìB¦B524 „úÍìèsv•$•: b ¾^ ‡†øC@`¯S’x $Pìvmu:*LÉ!w±×Í¥QHéÔæIÚH±e‰Ç@8¡­4æ¤'šKÿìrg? µÒ@ ü½*?%?=&ö PÖcÚÿNëþ¦¢tÔ# l€ß‰VátðPø²ÔÇ…ÿ}ã¿ýë¥S,rJoÛT‚0/ǨTWÃ}ÑXäo»{šeØcýÝq‡ömÔ[6,å9IS¥9W»]ÐF|!‚ÚhGhÜîv6ZÒe–ZÈNg†ÄdH',é˜&c•â° ¯0’oae›LyØC«wšÒ‡czzl7áaœî”¥û9£TÙmΤ¡$4„è것>\E}úŠylà°ÁzµÓ9Uj×jò¯v¹ápN¼ß®KV‡HèÝ!ÿCAˆbö»´½æ.´È_ý¥ÛOzËHŠvë¯t8Å‹mözsª>þÐRU¨¢ÐŠ iØod 2ÙáÈ@")³Ý œ œñTmœ¯È.ô|—=…7/oÞòoÿœÜ¬¡õþóuѨ\áó±d í3ȸ»Rö©CH|6ÚmSz/' ¡’ÖI q bÕ}ÎH^°øD7­ Ü˜$phõÖŒ£ÆsÍ…W»œ\!”ÞlµÑò¨$´{_' Nˆ'™Áz#â6¾…Ž#6æt Ì\‰øé° ïÇê1„oµÁ©Â±xÂÁBêl£p8_žÛZ¨íqèÚ µkÕæŠ!¡l°ö¹t!y¤]GHɇäH%ÌóEýÞ,Eby ö¿Üãäÿ/u.éNµÒ‘Å„í(ÄÂe÷ºŽÕå£ÞÿEw4»d8-ȻՀ§öÿ÷{/·n³ÍF¨“µn Ø­ÊÐ;ÉQûPØŒ¯Q3k‹ ;‚¶kÉœ&¥edTʽÐÒ•^¹ø‚¶[×®¦ÇEƒ$ž©·º3ãHA(žm,$žm*ôèâ !c€ 2)’1:‰3Äg¯[¬¸m bæ¦ÆžKº !3¤Ž4råäWœk¶xõå9Â(ç¥SVÜ!\ãÆï…Ÿô›#P)¶¤ˆZimLD !;#þI¦S}“!¤%q¦$§.7õr›Pi –ºÍª-L?R“›r‚h#i]|&ëóÓ®)I%ÏŽCàs‹BYã’ÆikØl±µÛ´WåàQ/üÐü†ü4}ü!xâz왆xQmIûþc¨¼»‘(é*›¼…N vVRï‹mvðxá!œ^«þN|ÕJs]G:ôÃYIQûõÚ´Öæ&Ò‰ ƒÜP‚%!D›ã»€Í ¥ËlØq@vfÊ· B²™zCb ôË6 HZ°G@.4Ñ I Ý ó §±äYðP«ÏOÅ”ª6ˆ˜¸Ç‘$Njpvðf+MÉ tÒ#à‰!XàúÉo_«ãt}¡;#.->–{—ÔÃ"J?ºs]ý%#B¨RpÈB85Ô«^Þÿ­€lF}nJìéºB@Q¢q½¦@f¯ƒ&[bR‡.'1ª³(CÒIÀ’ Ó FPd³Óy£÷G¡ƒÓÁƒç%ÔÙµ±C.½xí2ð¤Ÿ;Lø² x—?–à—«Ó¼Xœ\eÁI";—‡—¯o=}'û:¿3J(ú²ÓV+ÌÛ-¡µ:º‹2çJMH!“ëµÃ$äÙ†B‚%4p&¥?¡* ´:sÚ$‚¶X‘û“/ AD6éÈä°[ì„·rpê‚ çjÛgê­ðX‘ ~ ¨­Tš¡a„GâΓéòèk®5¥.—çMûŒfM"sóôÉoÚmT‡d‡rÁRÛ´‰-t:t}mN ù‹D&Ý$fº«Ê­%?þ'{L8Ñf½Í¥#'´gÁßMÚTxR¾ÝÛ…÷8VëE+úîA¸‹ ¤:º¾03E{(¤ XUß!ò=ùÂÔ#öŒ$«>#ߨ_˜žøÖݽטä䄸]Ùºž?ð`ËÑd¦‚Õ,Êšò·íRë²f„S¹¯ÌûNq¥Ì G;ëЧƒKgéimÚX?öÝ»{>ÞíÖµ«C½]µeÅÀLc©àÑ%Ç{sõ`7¥6P”EZ™>QúÐiÐäf¤jŽÖzîÂhpœÓßEäØmãĺTbMÖò’œ=÷¶§ >÷¬’¥W»ýá­=÷¶§ì@Jt D³©é¯Æö ÜÛžŠJc…äÕÆ{îmOy£'è}> stream xÚíÝOneÆñߨãñŸ–pÎÀ8(à¹B«ªlØÂ†°B°k¤nP…Ò*j(öƒÔʉ{l¿óμ߯TEнïÇ?cËãIQ¨õ7 ñìËT&MGfH¾Lgæ©$Li²D J¦Ôyª†SGY¢z•©ã,Qý¸$C—rå©ÊêRÖM¹\’¥K2„©¯||ÞÚålÚÄW_Ïc¹\5Üz<ŽËË«˜N›;dzßÅãGkÓj™d7oÞÅ´™õs›}üðÓ¯ñúêmüõ÷?gí¡™ÔñûË?Ö_ï¡úìó/?¼q¼\®âúz×ëá–ö~rUU77þæoݳS›ZçP«•>ìcµZ¿‡õú›}lïáÓO>úbï¼ùϛӘ„KC1FU4MMÔy×åiÏ¢©àªû¾yqqñ„›†#˜01`âÎA ˜01`bÀ ˜01`bÀÄ€‰fÀÄ€‰wW3mŽ:’þ«ÓÓþå·øóõÕÍ©¡ç4®GñêÕåÍ9ß4 ?ÿæûøq=äcO0ßy˜©ª˜Lêâ)Ï€Ÿ~\qC%è_Ѝ endstream endobj 3487 0 obj << /Length 2181 /Filter /FlateDecode >> stream xÚ­YÛrÛ6}÷WpúRj¦bI¼õÍŽ|‘SËŠ¨¤ÓqòÀH°Í E:¤èÆýúîbŠ’¨šr;™DÀÄ圽"ß Ç²›¿åÃVwviä† |‡[näAÄ­È¢È(…qo|8±¾<9›ŸüzÁ#‚a×7æ÷†ç[~ÄŒÀs-ÏŒùÒ¸3Géׯ™(C26°CÇtàÏu<óc%ÊŸ+äæe.Å`èÚ6 LÇq_æ×'çó“ï'Ž<Ó¬ÏC+`ÌX¬Nî¾ØÆÆ® ÛâQhü%g® h[phgF|²sf70ànŒûnûÐ.³BÎ<÷¢ùBTò úã_/Bñ­ÈŽüÐ6†.,ã¹ôÑóek¶q7ôlÛ¼I³¬úe0ä<2G–j|vÓÕS÷å®oNÄzà†æ_øOQ~#á<]©áiY¬ @&4E†"Ïül{v<™OáסIŸ°(«´ÈIÀiæ}QR<}æjhú$Lò%5nãñO¿Ð¬Ðt „µc«?“ÃugHäžøk3{çî¦\Ëp|+ Œ¡Ã,+…ŸÏ/àŒ1óv±.¾Ê{I‰E¾µ½ÔP­áº–£–¸s;¡ž"Ö§ôG:pLÇÃëž[óÇbU¹ìûæŸÖL|{Ä£¯E©d×ÖYQçKÕC‚F/9¬“¬p!\qØ…æÇ'yâ%Ž­å.fšÓïúQPcT¬†æ$Y)iüR­ÅŠÚÈâh‚êãt„‡<Å{ÍÏ‘êþ!š3EÃü}z`o“qúT¦YÃBЃÖŸ&}k]ÖËžp®ˆ ”¬ó¤ZgÉ7(Sj‰ƒgÖð "ËÒüaÝ|# H,põRo³¦Oß‹jÌñ e’WÉb-…§5ГKêÓE¢å´’, Adk/%‚7D„Üë$‚µ‰¸In`¾P¼¡Ýƒ ÞIŵ5+*º­6³üUøºa`^Y$ˆ¸©´‰:û»Ló\ÀqÀÿ+¨+©è.œ>ÎÓuªàÃþŽ‡Â•¥‡nÆÒGýFÂßÕ$ø4WG‰ÇS‹5‘Èè3¼YœÝÈ×83×goñG×u.È.v·ì^'ì3 šcŽJp:Ú"fž/倫¼ Ü2OVé‚dWEµ¦Ö»"ÿl;ü¡† ¥VQï`Œ;HߎcäÐQ$]ÊÕ;試Q£¦Œ9jmÔ¶¼®³—C˜b ïŸß ª$‹\©’ážJr[{˜r&§:ûŠìo’*ç­°…a…mÔ¶„Sz[\e H’ÝÂÌ'ü°¢>ág•4ŽѶÔ³]&•o‰Ç*œ£ åñ6Ðrú@btÐéÃ5æ¾-”tj—óoä…š½ “½ØÂ|"2[×cæ;%½B¥Neüƒð)]ó“|_¥yB¾™*9‰Ì5#.ê€¦Ž¤}3vÎÀÂŽ1jK³C¼):Ã\.Q?Q/Jµ úüý$M“@E¦ßø}Æ5 ^äCÂ~BÔ—Œ°“Œ[K¥’2I®ò¿&뛩 ÊUaaÝä‡ÓR ÁüPI¢V~ì4‰eckØ![ÃÖž­µSÙ@§²~chR÷» èY¦ŠÊ›MøŒ½¹9 ±jÇÌ^Lh"¢ƒ!Áã gØÇ‹" (lÙãÞ>j8£Ð¸cGâ.k…ìôØê\dÇë´–ò(~pæoŽ(mày ´xÞxÇ>Œ!riä¹­²Ç5dï™Êkȉ·bkbëŠlWQ´¥ÇR‚><]ê4±±>¢Ô²ÃÅ +=­ieö€%ïƒew-+5”-®Òç¡óòD—3€ë~) ãn¿Òn€·s½g 2‘—õ¹ƒÉ8V…-ÌÝ÷#¼í‰x <V\'"s ²àBû¼v‡f"}%Y ’ÿ‡I„Qøº/Ò!ЙñQ,º-ÂÿsZ ¨Ãp#Ûßk¨NÓ\Io”ô÷¤TõGJx“TÖZئz±ăZw“ÃbQ—©Ôõå˜~I /kU«m-:ßë´ÃCL®TEW½©*ãöëQ«²R•Hš¯ìpŽäsõd“'‰tLP¿ÌåÇBQ®ä¯á‹3Ô‚Íל’^ìɰ½ef œ‰ûRTÔQïI°<IÉv Aú|„cRõ(w¹ûÇ4‘·|¶?ïõÑj~Ø7aù¾©Iw\£X‹ÎG?¾±öã[ <ó4Xlÿñí=¾±®\‡µ`f:Yáq0wà×hmà“Zâ«BØzUèuw}+«.X¥Uuaƒv./GÎDÖÞòôAèÔžFWÅZ Ç#õ(¡:Þ‘¢òù{ëklR%êc%º1Gì#s|„œÓ Mná7¹…ßÔ£0Þ Cþ~­ïëZÓoj}¿£Dųt4ô/¤:;\«¨Á@ðb©Ò0õl)-T>[ê'5ïÃh²©Rçmãv›¿Î[gEä÷PÝîêtnM’r-d(ºÎ­IQ.WIùM þ°ðY^ûÉFÀË7¯¬¸ÈÒU¢¿§„'}xÜd­’%˜:J«¹7ª]^H|¯Ç±êĵu‘ŸêÍ|G¼ÇG&ÿâ-Bß9Æ[Äâi}  z€{›GÌ E†š:·®Ó|%R5º©C='0uº^Q÷t¹,7º±í…åãüQš‰[nÀêgriæKú E4’}£·žKÿ÷"B(lä{1©™Lç<&ókõáû2­sRY`–*2.^hÎùX»RïZÐ'-…F vì6°ãưkSÓü`pTšÑJ™yÄ׫ÈÞ,èßóùÉ?öì¾ endstream endobj 3379 0 obj << /Type /ObjStm /N 100 /First 980 /Length 2593 /Filter /FlateDecode >> stream xÚÍZÛr7}×Wà1~0Ý@JIÊ—²×U›Ú”í­Ê®ãÚ¢(Jæ†â¨HÊvöë÷4È‘uµHÎd×13=@£/§1ð>%ãŒ÷)›ñ“)zÙPÌÚp†!ƒF0’'&ë 2Ñé“‚F®"b’÷h$““×;Ù‹Uºb§]oÿCÝ C‹>ÓV ÚŠP€ê=AKê=¼ .ø%(9Ò{ÉPÎ:VɆW¹b ä ½‡0Zd8i‹ ³¶¼áìj+.R[˜4±×1`\Âk´åT!IzCFVåq? ¦£]êTð ÿ$m¡„aЂ©ö#úT#è«Ù«v:ÑœU;†Ú…õã²$½CAÿzÏà UwŽ&° ã?Z‚‚‡œ÷õ)œÄa NpÕ§KðŠèÃŒ±Eå³x“aÝPœÞÑF„ŒG<”¢êÂ/Ñ‚&RÐiq6‘³ {ïM Õ x#J¬%ÄC`#ø‹9ׇÁÄR5 „¢ÚÂ0D:ƒàЪ¯FQ;Ö§5¸ CYà)¬,jªñFÊ*Ñ_ÑÃtM"5ZÀeb ã€N-¡Ö·¢IÑë`®ÉG ëåµE L£`RÙkNÄ@ŽUQ¸9KÒ{ˆ.DªW]œØª¶€•ËÚˆåJÂx­H ±$¦d®rȶRt´¤‰Bu– ™â|u-’\ÈSЉœ„ÚDnº¬øäJÒ^5Õˆ0ÃÃæ¹y‡\ÎHíצùõÿ„k¬ ñ";+°þüb6{ðã_vÉ:„Ç5áí|eMóÂì×o½Àd3 l~Y´ã7“•ygš_ž¿0ÍÛÉ畹ìãíç<Nšgèo2_-"¼¾мž,Û‹Åx²\ƒL½÷óäx:zÚ~6ïtRè=-ð¶ Æµà“ù¼EoïÖÐ¥úܶ 4o.ŽVõú¯ÓùïÍÓvqÝ@¤èQôŒ 9'«±…xG‚øûÁeq2›£ÀL©Àf@`, ¢ðÆÞ†Ø –?ŒÏ?JóhoÕ8«w¨S LÏbÅ@³Ùt¹Z6ÇÓ££ÙdÑGA0Zf¨•P`1þºbK/ ±~=>šÎ›³Ñtv6šW§ó“¶Sz+¨'”¶éàÓ 2€ºPÉÛaVÅVí÷«íÙ²ÿöÝhõÛ£+Ø_?TÁ`ŒJØ­VŒ•M+1NŸüÎ6ýôé“.Ƕ]œ6Ëödõ pYóÑõuOëê­Ö½{Ö…¡—ºM2µÞw)Ðòý~,Ø)Jr´T×*ŠŠÖŬƒ WTh/·Ì¦ó‹Ï§€ˆê›¡ˆÈuá ·(€ ,a[ SòÛ {A=”·•Ʋ¥0b¾l©1Örë·í—£Íw1§;…Q%páí„ °Á!n+¬Ly÷|ºÆ¹®”ÛÃd‡Û™Æ¼[¦]8û€dïyºcFeìàMª;j}@„†(;C«E´OÎ <PWù û/:5¥Áÿ‚×Âf·¨n¢šñqêô&Ày·À]~ ÒºS˜jœ¼pdð. [  ú·&„@I¡g©54x¹0>l—0Á—Û ³)·txÓȽ2([¤˜¤«¯nŸz„K,úÉEnþF‰fàY™›@{ ~½Ó¢¿Ø,ñOÕúññä㤠Ý\8¡«ô'Õ©x’ÿ­êë\Š»€E¼¥ 8’{­½{§W¸ƒË·[z]^ ÿ÷ ïØ¨‰qGÀx¹h/Î×ß{nH܈Ý~Mìökb·_#—wø*¶¬qÝ7ñíb4_žëÐã?LóìMó|òq:ž¼~ùÔ4¯Ìjq1Ù3¹3ʲ\?©Ù”¿ä6X©äws—]6=·óÉJ“d2oÎí¿1TïBWÈc O†(YýX(ÊB\ü&TÔ}ƒìH¿Çý™¡Ä½»šJR×èH£t˜Ÿ:„Oæ§n>uÄ2u+EêzN]Ï©ë9u=§®çÜõœ»žs×óúSôÞL5:¬àœHP.FoÚ&—­¤Ý™ÓªmgK;¬Nê&чÕÙ¬YœŒÙy×c‹ü™ë1 Ýœ‘º1#R£̓éH^úlƒFý¬¨g…lE ÂVO ƒÈ…2˜’9Ä`»ñvD AŠ:o‹_Žƒ)éY|Ÿ:$[݉Q÷,u •ÜGAˆò`:zêaHÝåÖe+:o£žÍW©‡ŽDUPDz¿Žisz@²­gÏÀØaety°Ìö±ôÉN•–ec6”|Ýù£mIƒ))Þ÷Ÿ5wòE«Éõ&jUÒÁ¢†S2HÿÔö)€¦øËÔöMÇÃ)™ú€$+(êñ9®Ûtº}iKÝOP~¸˜Ì%÷p7 zÞ²Øäôp)xž®Ôó#e°Ü®OHvÞf[œ\z›Sç,oVÝÞÄ”ëÉ¡€Dzͼ2dêäÀ£à¨çr¸wµÑéñ\€&¶ 0€>ŸÕ©F¡dD!3zJ¶Ã-Ø ®¡·Ÿ I‘ÜŸ6yÿ÷é¨Ç&ö'‰ ”GuŒ ¤gê k€î4 Ž=ò…P›{ÝxÕÃ`ˆIüêÁ5 6Ép)]ݬ4ó•æÄ?û endstream endobj 3498 0 obj << /Length 1832 /Filter /FlateDecode >> stream xÚXÉrÛ8½ë+X¾ Uer®âQ^c'v<¶&©‰“$AG\´#ýt£Aв¤Ä™JÙní½‡îf¾ÌvÚ9ßjÞ_¹áÀ¿ù¶FûvÆqlHaÌŒ¿zŽ1‡áËÞɨ÷ç…ÇŒ†ÝÐÍŒ ´ÃØ3¢Àµƒ06FSãÑÀ‚ 6¿ˆ|~Ü·Bš'ºëSnY¤/ª;0ßëî÷Iž .µóµî=‘/ÅKÑwæs¹LôàWæùgïNïžBrº)G—55‡sæØUQ×ù‹¢ñÿ^‹R}\UI‘Ó-ìPr „ YßjßÃíXhÇ‘a1Ï|ÍÞý®}êDZÿ Îëy¾yuÞgæÏt†î|«Jd8u „LÅ¿ç™Àm´½Ž¥7uA2,lpg{qGÜܳ‹›35n ÆÞÝÛðB-žOÉxÐÃÈ$Y]ø±ýAð•ë·¢ø¨6ÖÀ;VÀ¡ÇÕùèâXc.˜³_Ø ×Ý àM4«%P‹+»p ûLY©[×ög%À7R¿ætˆóªÒ.ÿØ„жB¥æ©PMð:ˆ‰ rH*(K|:VJÂ3±J•$×™ÈqBUÒÀ)ŸÔv_Ý=ù‡H>ÿ±àuù;/w+í– ÇÅ"ÙÉÄÈe¢;>Ûgb¢mdà4MD“5ÜØ‡ËæKëƒN-:Dcÿp:•¢,©Ah’è¿,~'8@ƒSìÅûpÂéY7MÔàyo á^ð>%åBÁPÃj0È3­>ô¨‡=¤Wp¶¼€U(£fBŠ|"Ú(Lxw˜¿Ïd|¼íöMz…O›Âä-šðö7%‡ÏÜV€¡ Ë„r=Ô¹¶ñÍ‹CȾí²Yw;Ï¢×ÖG xßµâL]ð)OfÞ\]PÿgœyLNB„%'³É‰ã%ÄDT3+KfÝŒ(ñ V¡¶·o·Þ{h¢Â ŒÍ£cäh¿gö†·×|ĵQÓó7QSú;¯©šn” îî¬$·ºU‚··J8ù¯ët}HEΫ”ï¹¾àð+Þ ](Óþí¨`¼à%)jHñc”d‚œw¾"°³ýÀå0:uRwã1Œ%zæ ñQ à K½#í0¸…¬C"9$!%žWåÈÆ‚F4œìäåb¬žÚyó(Ûõoó÷|Ôû‰{í$ endstream endobj 3512 0 obj << /Length1 2484 /Length2 20637 /Length3 0 /Length 22061 /Filter /FlateDecode >> stream xÚŒøP]]ÖŠâ»»»Kpnww ®Aw'h`Áƒkpww‡{Òýu'ý¿WuoQ{L[cÚÚ» $UVc5s0J9Ø»2²2±ðÄÅ´YY,,ìL,,l””êV®¶ÀÿÈ(5Î.Vö|Yˆ;]A2 cW¡¢ƒ=@ÎÍÀÊ`åâcåæca°±°ðþÇÐÁ™ aìnePdÈ9Ø](Žœ­,,]Açüç@cJ `åååfø—;@ÔèlejlP4vµÚN45¶¨9˜Z]½þ'€¥««#3³‡‡“± “ƒ³…-ÀÃÊÕ  t:»Í¿S(ÛÿI  niåòo…šƒ¹«‡±3ØZ™í]@.nöf@gèt€š¬à½#Ðþ߯ ÿ6`üS+ëÃýãý;•ý¿œMMìí½¬ì-æV¶@À{)&WOW€±½ÙoCc[¿±»±•­± Èà_ÔR¢*cP†ÿäçbêlåèêÂäbeû;Gæßa@e–´7w°³Ú»º üæ'aå 4ÕÝ‹ùŸæÚØ;xØûü™[Ù›™ÿNÃÌÍ‘YÃÞÊÉ (+ñ H„ðGftp²°°psñ€N §©%óïÔ½ÿR²þƒrðóqtp˜ƒÒúY™A|\ŒÝWg7 ŸÏߊÿE¬¬3+SW€ ÐÂÊáOthþo 꿳•'@—4~¬–ß?ÿ}ÒM˜™ƒ½­×óµ˜YJTAJò=ý?)ÿW)&æà ðaää0²q²XY¹8Ü ¿ÿ£llõ¿|eíͼÿ¦ ªÓ(»ÿ34ÿ,-àc)9€& ù3èz,œ,¦ _¬ÿŸÇý_.ÿÿ¦üw”ÿ×Aÿ¿Œ¤Ülmÿ¥§ù·ÁÿÞØÎÊÖë Ð亹‚¶@Ñ´ öÿ×T øïÕs°5û¿:YWcÐ.ˆÚ[Øþ·ŒV.RVž@3e+WSËË¿å¿ÍÖʨìàbõûj0²²°üh»Lm@ׇ h&ÿ¥‚–ç”´7u0û½el ;;{!€š BœVÐ:š=ÿ5Åf&{W ”œÀÜÁáwG¹8Ì¢¿EÿF\f±?ˆÀ,þñ˜%þ ^³ä7 hüþ V³ôÄ`–ùƒØ̲€Yîq‘ÿƒ@\þ Å?ÄEéqyÿ_Äâ¢ü¸¨üA .ªˆ‹Úâ¢þ¸hüA .šˆ‹Öâ¢ý_Ä ÒÿA Éâiú_Ä Ò™:Ø‚ÿ Ço‰ÝÿßÁlöeüÄêßÃøß®üÖ;¹¶è (eó?ð7²úý7tÿ+äo½ƒ›ó_þ ‹¿ ˆ£åÆ *Yz9Zíÿ²É¬þ‚ ’ÖAP}lþ‚ "üMT!»?t1ÿ‰Ì rµ-Å_zPºÈ€œþG JÆñÌôº³·šÿ©ë?Rçÿ)$ˆµ#èvrøS|P!mÝ\þŠ’8ý²ƒ*ãäæà 43±ýß`ì¼ÿhþWÌÊ òø«Ò¬ Âý‰ÎùÝÿª,'ÈÜôVø/!P=\l],ÿ ¢ýçÐmËìjé ü«½ ¸z8üåŠáöµÃý/"îñ×쀼=ÿ‚ ð^APµ½ÿEò:ÿû¨ÿ¹±LÝœAåvý×;týÿë#ôš",Ì9˜ò´®ûØ~_+JàÁ¸3&8M¹£õ™–ÑgÁù»Û# l mÍ—à5ç[Ñ”¡´å-Iš‘E’Ÿ£–ØðÖ$•¶'ßgÃOª“;m¿&púÇ Dëûˆà ÕEv}_œ|5ƒl [À;å(sÜxP”ó1ï=z¥=ëûÊ—FÂævTvk¸äŸË§c5bô‚Jf(óL²fqÉ`\‰àè0Î=Qgnn§1rÆßHä>Ñ#øDzù謳Å=Ìz¯Tª³¹táQàéàAÞ`ŒLRùˆí§Ê½›÷)-ŽYœÏ掌\üØ›8+¯‰G毌ëü±ŒQ03P¡“¢+ÇÃ4ÓÙVÓt\ @EMRçJY*mžTM>Tj˜EhððBN¤–¨ nFÿ½›¸ëøT£“Î71—5voÌŽøVs³#ËŸëù†¹ÂxRZ:Ål•|Qé=ÎÔ¨ZžŸ¤êKlC¡nß[Sñ£5¤u¸o±«Þ*_/¢'Ï;å±'å†ý¤³“—¢ÎË!ÝÆZ¬ì 4ÃÞˆ­ W¶Wö¤&î‹ ²lïÄPN*²xå>¯±ÌbÙ¹j@hM¨<ši“Nö £L¿duœ” /©œbsœU£ebõ§£˜Ò 'F …¿móœfó9ð5kà»J$éèÚ¥07N/ïÌq¤Á5Ú^s &Îâì¸*øS‘he„Vz(óZ`(Ãu;Yn¨fŒåâtY»WOÒ†žé»|uR%{™¨%Nžv5§<¼@ëÈ(Ëœr–ʸ“”˯{Êà'XŸdRò?* Ôœ®u‚S£7œ„³žnØDp}ýà.¿Oò¨ç—®p®â' ™(+:ŠøÀkÜk¸JMu(%ÑÌ+M®ÙVô ân5äúI’Ð×»¢S'ß*“?[é+Ò{yfžG<²s¸I´2ÑEîŽ9a!²Šì‚¬w®Ç©Cüt“;¶œˆˆRRÈbZÛ¬¡jĤ¯}…ltÇ03£F1<|Ú ­A—¶ø°ß>Êæ_ ëzT@àoŽ˜ÂSéì•àM–åt¬Ö"¹˜É¥ŠÓ¨q¾Ñ¹ìî#OM©›ñΈ¯F£‡.êÆ¢Hµ¨cm{6G…ÕÛOe9€ç>!6V7@§ÉxVxgNþ“ÔÎc•­¼Íþ§ó…oôÛ¤:Ɖlr’þ„O…v‰ÑÛ#G“tŠfSåö’¯ò=›Ø¡ÅrƒÇ•‰M—Tm6"bRe‰¹5œ™0y‚-=×qQÄn¼Ïà :ÝÃêéIÞ$"&ƒšÊ6 [q[þS%u©}žžQ¾JôǾ}”Í•–.[<{Þ0;ýöó †#æÅÒ"½\øºôA’QäýßbóÞÓ ×1Iw¦nWÏ8ì2ø³DÉî¶ù5Å~fáLŒ@9Ľúñ„Ø€bA’2ù-œF dkûY2/,íp¤e‰&ß{ªö¼ˆ76BûVYí= Çh`X˜žµ1G&-n=ÂÅa“_ égš-.YÞ])Ï;¢¦ÈmÈÒÄÓHùý¦¶eýgãMÄÞjâ2Íf_bK¹ ²RG\ûºHô –õ'´sm-f ‡¿Û$ê ƒr^¸æ¡>kZ[ç–ÉÉm3ïƒm îm¢EwFhÝlšŠ«Ï‘š«(ʇÔñÏßKCˆÖ`‚B–ŒoÛ`Ïö›}Z¤ö–lJb~ª$}Öõõ¬¶ïw"o$W·jeB»¶º×šg¾°Ú¡ –7ZÊÎëE[x!xó;°àëüT‡Z™$Rø=FhN¦&°²ûèéá¬lÉΞw„5ý‘1ün'÷ »L-¼ò¤ùÒž«57"{ŸâŠ×¦wñÇ]† aóf‘ÝGU,e1+¡«í‰£¢³ã%÷M©Y=QK›¯Ÿ›ª¡×Ѿð@‘À@¤CÑÁtöE*É⫸—ðr@x·½ErÌßÙ¡ìyh‰$²×Lô²aßÎF5h,vn~=¬Ò½gK‹ny)Ä]ò6a‡fÙBüyÈ«®YëÓ^o(s–m®ÛÄ´ØÜDN‹#zæˆQºlw=Fà´ u sJØU’&3¨Y¼&×NÊpsâÈoäà´,pk+ÜzO¡®çœÕËxì±É‚$q?ÆÚñ~µB½+Eí™óÕUÍØø*Ä$‹ù±<˹ùÉͲÚÒ‹tËFó§Ú`5w¸,⽺報zÒ ÖŠÃÑPÐÝÇ8šj$-3 Ù{Á3ýÇét4EßièŒOfr÷zÊUQ*¤½Q›9ÌhÐ֔ⷿùáØ>èEôm«y4ÒïÁÏÎEÏÇïošÛ·t;vž74À»JÂKA½þáZÒ‡×ÜbMÙ&<-“ÚÈséŠeµßbª0~•lbX!8Æ­ަp>+CÊõß^a½Ê@ì™Ï€à0c¨1˜æ*Ú1ÏbPîr+õ=¯¶iWåiån¼&²BŒ€‰hú t~¬ÿ’¥4•O(ÒVk‰±ŸeT£+&ޱʠ@9c§Aø¥}³A ØNGQKbïà¹Á.@»é¹Ò¤èÐÍ×íŽy ýl®ÁÇñ[—§cÝr•øø±þSŒE[8‰EÚšÃê22)%‘>VW»edQYÛ2ÍL€íf¿e>§¾ókH~ `£a=ýû{\݉ˆÄ1C=á8-ןƒ¡Ìü-±Hd»ª„Uv+=Õ9™´Õ·eX™’qz΃Z¬HÝÓ“‰ÉE˜`^[s‘ ´b#Qçz"‹A1ãrÂvI'§…ä×<s“Û¨“9M„ÆÏ¼ÜH[…ߺ&|ª†J21*tH mâéÎÚœÀƒ3q³· ZEå¹"A)ˆƒ[L!ðÙ›ÈÁG<*´ö:Åã'8ïYsôòB–+©jÖË¡îUq±×/ìë(7Æk1?ô§¸ ºÎ¤/AE¼ãèÿ½%àD¦å*¦ÇŸ'Zz­ÿ\PM\wC`Ž;äáåå+ƒ•çs¦á#`Û9büªxAý ¬#ýÔei¾å×:ªád{ïÓØ¬ÔXtoZ”{¢Jø5jÎ+:>Dâcu6e¶i $yá€cbZÔÏ÷»ÐÈ@ˆ©ÈOáÔÆ j¬—ãÀpÀn¢²‹îÁa¨WƒGCrcˆ?¼øyQ¢ÿ¦j¢Q;Á‹5YýÂ`¥¼M,² ç»È/ò!åÖ?Ÿ%Ã.LÔiOQkPsÉbÃê…=VÜŸê7|)Þ1q&щL»/!XÝGŒ;‚5˜ômê9ÃÇò¢ˆVüX×xp§/†©QßnK£/%ZâˆÇJ%|ðŠfòŸZèÏ¡ îÔ(Mñ[ГÝÁp&É~~'gA€”ÕµÁ·»$!Œ‹_6 H„¥É¼ÄGïfJ=&âŒÕVE2b^zü^êËkTͳŽ½Ù»(…!A¥<âk8ûÊ4T™›èn|¸®¶“ÆÏ­A9bù¥€$&ftêjSè/Ù³ƒÚ¨!£ŠÜ?J&•~x¢Vî»ì5~ææ¿£‚nYaÓéΡ ;]˜ Ž}€!¯Õ:–ÅsQšÐÃŽþ„>ûáÙà×'Æ¥¿ÏD~ˆ³ILWŸ´¬*° §>‚{„”Vàû|Ñ䨜ž6ž)¡ yò¯¢ !”øG|1eΕÙ¯ 'Ž¡³;hbäž@ÂÉVË`;{ £»è“Lpp"æïŒ˜mgÞEkå:Ô-ER@›;EsøÖMЬŽt¹ W–'™\'$ØŽvñ‹ç¼)Š"!;Çl'šŠœ…dÒá>ÙÕM·aZetäIRc€”·ï§Éj‚ ¦‡äÛÕ}eÍÂ1Wk…Ö|,b¦ <òI½¥§-UA ÂÜuÚ©¿˜å¦àºTCþ›^‹>ÃvÀôWg M)Š­Ô]_Ôîç…ØÅ_F…ˆ_Õ„)¿YùþŒ~põÓ…»Ã1x àV|ø2ÅýÎeh¾?x­i²Üƒcm>´ËŒÙäTÂ_—¶æÖ‚£$}ÿeEš ŒÙQ)¤‡5…h¿ªÝ5i<<×qÿéë¡ÇÏC1̾h¼2°€…ɤ,mËšTg+ND ºp9øöÕÛkÎv†öí…¬°t~#Ÿ‡9¾Òµ¢aç0•~ ·ÀVf ‘æG˜µµç´Î‡'€þõîìfé£Ô |®CÏy_ZYöö¾´ª×°ú"÷¥€äÒÙæk—S¤–¿xCþƒÝ¼+Á=à“å#Ò.‹Ð[1ÿfg|s3Åö…ÁD®Ç/LDROËÉ…à9”àÉÒ?ÞµbYw0PâhP©U–³ ¦ÄT|V«µèÐÛúÖó•~´2 EoÉÃŽE:TÒ üéÚ¾odè:ïó™™øÈ\ÿí±toGmA`aŸ¹hC"n^YýÙÐI²E¢SU¡>ø5Pþ—…ï‚„VUzôô5³²R=ŒÁD ;‹üÍvÐAïËr3­ß4dµÜ¢Ùç#Ï…a‡E…¸ ›x#7ƒ|Vêl¶0ÜXÛØ8mînJÇ*Ò#Ê2+9xCkEjKó;lYmÓ,å»_þ‘ͬ€‚8ãËàmƒ¢>Žì!.¢édZk¢÷Å‹ÆØ€^cd¯—XƒÜŠ)*^̵´È¸½ ÊüNÍRAáä1È¥Wk‘Je_B›[œŽ©×ã0?:í—¿ä‹­KÒ¯LõüÓyºD¶º?³7X·ì°e…S¦€ór+Sxû'ôtGAÙ)üPPÚâ½óŠ<ªïÆ ;†ÏÓÂŒ“h<ÓJ0 ÎÍñ¶gÕ˜s¨Þ²•ŸÅMj·´Œ Ãy£ªzÀ錸Ñ:m¬û1oQnàØ-·ÔŽ×2÷”±×Ñ%†û=ahyà¦{á’(çÒzvTôfzGÌ'¢ýçÌ3¾|oÆ’ë­¨” ÕYꘕ— š2í¾;¤ÙÈׯHÀeÊÚ'™9hAf—Á‰ -“‹¿éTæ¾OL!ÿI¯JÿÍTc£‚H]}œ&›–¤éYRÞÀl‰²¡‹ìòU-šI¾¯<‡Ê—Û)ÜcVúïWæc6źfä¤R^ǯW[»).'6=Ù°€õ´˜Öe°ÑÎãB²cvÚ^„\Dp%î}9îz¨™ Vî²9ùo:I~ܵ‡áQ\t#JbÌ!Ua*Jœw^Ýï"ʵµÒ5jýÄËFHFfYtî—™S1 êýš;»ZÐcî=\jÐÎÇ®æJt?ý±!møº˜û»X*gºÉ7D¯FÜÒCHÛw4.Yƒ";tѧJ«YÚÔÿbsuÒ£Ö pæu¼jøj}ÿó³ê|“ÀÙàr¤eΙ¹¹¢û]¦l÷²ÑÖª|vB§š 2¹|ê;]*¤ùJÜÝkÓ>¤\<èK~L³4¨uk›ý¢ Ôô„<"^^*jGnÃègÉãÚÞ¯Ùv ìžóבVò¤±U.nщfÑõ ‚θâ_µ…¯lÛCRF4´Ì¼V–8åPê'÷m–XŽ&ïÕZÛ,ÕVä[¶ci¿aCÎ?–ãG¦4Ú~3Ùp9'¨}õ?â“õi0¢¨9¾ÎÎ ÕçþTýaÕ¢Rˆ·ìnb€¶ìžX±ÊuqŽAíÜÂÎP¿1—%4ªúQzX{öÞ»~Ÿ^Ú7.ÏÜ0ÑY_RúÓÒš±ÓÒ—8‹„;øYýFEû‚·48wšZ‰:æ†ëE“ ô€ƒèy³Í³Õ*þ%éLaac¹šê¨¯^ûKUoÍvþëFu:l1û¾ÑÐ>Û¢r¦i*ª÷…HNöf4«¨K_¼Ò/›o$FÔËåÄã¡–¯d½U—¯¦‰”Ÿë^ æ“Ñæ#‡=û¿ˆ‹´½Æ$):Ž èÆÇ²Œ —¾ø!tÔ¯ãéCËTuómî-úÆKbß°°C&ß%C‡v’•;¡|5™;¯íX[„§ÛzÀ{=v¾;^¸ð­æãkFÓ„VJ{ß­á2´,crn,]#!ƒRsBÁEÁáªÐÞˆV#gÞˆÐ.{ª$‹+>÷ũјI>¡¿ I(P<Ñ Á6Ž›:ÛÎ< ‘ªÁa˜µo£Œ/t×êu*´ }ǨÙ®{¨4ž“!ÂÊ{:Æ>õÓ¡É›yG ŒÉÞ.d¹ gT~mçñäù«²n½S?ÉOÎÉaCnþd~½p¶ŽÇ±½¢).&T¦°÷ä9ÊêbXV‰G£Ç6¼¥³Ý¡Ã4½Œ -|·²ItÄÏŠipkjâ9@Fe_wL}æA—pbHêï º_AÕeWDºÞpéucÆ/ïþ¦ŽÄ¿wšøÔ„*ά/!ñÕe¶i¶PåYWÐ;ðu¸H9N^\Ã)Ñ&,9d‹|KxϦ¥™VþâäIšP•¸v@K™„Lõ÷y‰ÖkÛòØôá\íQäYú ½ÈXý¬úŠ’ú€ðõ»˜Â¥Ó ã6¹ O/ÿ¼A7ÇÆ|_äVaγZ¼7 ]Z—%3,ò¸š‰õ Åž dâtÉN•#Œ4W¦s®=üã¹¼X#¿rèvò<·ÆsÞ[Í'5;3ë™:ŒGªñCIÝ ŠÈߊî°å`4og U¡X(ÉØ½_ø\Qžk‚ §œÛûí‰Ä¡g e!ehñãÄ{,«¥~ÙÒ^žlU µR/¶Ã-zûXÒ¤$ÊêëÕËhÃøLª tm§i¿ø—×!e±†ýèô΄£Yî¢[ð¢>Æ ˆHs¥b&ùéBÒý >'7ž]Ɔԡ‘•ùÈé3þw[hÈ «™Í¸ï/М$ñeÏ&YÈ<Ô z°Q:¡Ê‘ÌSlè\ÐFúå‚ñNÚó¿t˜ãÏÒ™:¡¼÷#øêÿ£ CŸ¾ÙX^Ù’‡ÁÝL‚¬7=ç•û3zd_— évà(Œžíâ1üÉÏqzÍ‹yì%t!ä™—úÉ঩•Œµå]B•Z}6è„ôïîù*Ȳ£Åb›ÂÎæ+µÒ74ÂÛ½ÂaÆWç¡§0¦QY&¢ÄHž˜=ÅF<{ÒŽ]~WJ5[v¬P‹«ú,&€º‰ØÛ-þš•š‘²é¶ÀŸ0Sݲ9¼`F¸q–9'£„Qín!Ú·{Ÿ>½kQì9¥Ýã𘃩é§WÕºôíÌÌ`õ%ú;ÂGÍ-T&È4ðÕiýÂòayâÎNtoøžÌ¸DG+BU†¡¸Œ|¯v…˜yáÐAq¾~‹ƒ#å`‘ºàŒ¬?-ð@… uÝÞ[Â8ÙåÒ+7ªqó<…—ËÞn‹²~% ÇÚóG‡¤‡æx:¥{¨YÔŒ˜7¬d 㥡ºc>Ö 3ržˆp™{ëÛd@:\eIOItc|6_Fl`ªàt/—y`‚<š$l0J´¹46k´D°ÎÖ¨AéGûé í˨qþùk «é!É«)27¥Å–šfüþ‡¢,#— f5Ÿgt|ç­ƒ aׯíq6oo™èÇ\܆7I!4îœ|µh½Øå0ú3‰þ«;çYB2¡¯w‡ -|X5‚=­>øò½¢mNU©¾ò¹G”éÉ„ZrfÈÛ|׳êÄÙo‡šíc†oµ)q˜Þ&–­L‚q˜Éi¹5·\d&»Ôá¼Ä%+D¹°©•ê¿Æ„·“þ‚T4–Èü‚óKE¡°lNn@£ÛŠwïÈ-±¾Øáû}” &*™5RF’_ÈHô©{ÖDe‰KM¸w=Ÿ§¹ôO’øXcC…h>“ÛÀ*¶Ã|oˆñÕH€X7?y ñ]û¤íYîuÆH854náMȯ QŠZä’„ÿ¶äOû¢K1w¯dZ$ê’)ŒƒûéüõŽ4¸¶ÒAÍ;—¯éY÷z¨ ³¨oÊm›ŠÇ|ÔR0›†}åîü~§!üd`ÙßùÛf‡å˱O²H{Ìæ‚aÞ/>3ÏÈ•³ØÒ¨là””¾çë“ã.»m2W”èd嫼9­ îÆY_‡]¨¤ð¬i¶ Ån/Áo³q$Šð9挄E4Ä&¸¯>‰XeQ,øÑØøègAêÉP> |þuZê/Ua/{DVþ„š‰„{Ä„+üü´"«xÀK˜w ÅÊ~6#ûÝLu!1´ñá&=;žIË)ðnvòU»è¨Å“ÕNB>HÅ0? üš¦~âùv½[o“V|¯½Š:R{`cSÎVM†…c\ˆ§-3ƒ‡QâÓîˤb$~ï–Ý‚|/çÜ6ºW$ U7¸2ܯÜÛŸ&ï¢W‚9¼¼_|ÑM;Å Mà í«£Î­ykiWÍ©Ïñ•[¸—ŽäÞ ÔI<þ¥ô®c ÷ïaN}¡â·žÞ“sœÑåo—íP€­¯Æä)R8ª[ušsºþ¢¡ާ`8jÕË”¤<.t—'3¤†—– ²…áî’-,A!=Ü^lÑA:þðáæ9ôA”÷‹E8mÀìQŽ%’³æ÷7_knæÑÖŽJàð,ÍD˜Ð_?§q¿ÔD›ë26×Cu¡ñ}è‚v TÐÓæ(´Wr`1+Õë¨Ò[2ÕT`Ä-Jô`Häó•v«–ñ 8‚˲†< G™Ö„U§e¥×qÚ)GV™ˆ3'•È8Ò©%·%ÜÖК)P=¡žØ’ž brK n5™ÆÂµO§—Ik½´8¸©=Ô{¸y[c–Æ?ÊË8B­DA¨ÝÊeÀ­J{ÚF"Û\àbK;^x œ¬¨ Jê¶°ôy܉_vš’4ä¸O3#öãÜOèl«Ž5nåX½ûaðËx”`û çìtê7Hë%,xY·ñC8|ܹëZi–ôÕsœ/.ÕäΠû…¬¶YÎé#–fÍ¥L¡-CX‡•]‚a6÷“ü\Ï+…LÅQÄ;K¿•¦gòíÅÉo´©ð]¢JKH'Ô¹~ïâÑ´|¬>Ön‰æ^^¬šs©å÷]¨çÝ׉B¨GI¶Sk…–ÂuÜm^Hql(Š ÁA+1u™lf”éâÅXáP­~&OZñŒy}MÐô¯É%ÀvÛägýyýIY¿átr;Í­#ä@¶Dú²öH{Qèç[P+-¹Ò§ïÛjç¿Ô Ä©¾›!á$—N§¡é6|ª”µ>cûzþe ¾ Ígêñb1Gö¤sF5üji!Ì/S>š¸™ ‘b(À§…¡a ·!O«–~dœÑ!>„}O d/%G2_å Y*#”p ·Õ¢§G|ÛÃù5TMÅC¾ÇQYã†f`T;§ZjÕ‹Ò¨wõ.xU[à 9¹vp•»bén¥æíǘÐä:«2óL0d¤m¡ûV-£$î&;®E²F$¿ Oä&ª¯vx7^6X«n `3-)¼£:ÜÖ¼¨OÑõËP¤Ì—q¶J |™ìÉ©ÞS¢b·/º†DΘÌûß{ð%ÚØ5vx„ç^–ð%1Æò¦âÄs÷ù4ØÃ»Î¬,=ÒMyïáEÚÌ%’Ž’GN\îãÈüê[zãá»î¤Ü¬{o<ýÒÓœšñêQÉ¿2B(‡ ô†b3zèyÜݤMF¨ Vp§Émr^ß;ïr½ß{ú*žŽ ²~kÔ K%è`Lœ ‘scÒC6Àë¼|2Õiá|ÂM–¬Ì!¨òÁÂãP ɬ95Ÿq_ÛT’*|Í·Hf¥,ù4ð‹îO =ƒÄf'½RùáüƒŒ1ó9‡*¯§6eò”òU´n¹É:¼Ôo‹õM9ô°Ôg/+çeô–çR —^I)QY¿¯Cs!q»¸h¬¨’¢”Í­÷,»ý÷­ƒ^ü|XÉ»}·™Æ’²wur†[ c0s毉ßEÂ*.EiEcjr¢ç-n‚í¹!×S¨ ÉúX}"Z¾ãø a|þ¡r‡¯øElÞ&O$³Ý Æ+ÈÙy–a‹“œ­×¡bœTb¥NåÈaä-Ïs@laL6j:“Òn£6Ýæ;`-ð³ˆgpžcˆ1ß½¥§-»/ tÖܵ*?P¼º0›juî@jœX'³S™R)Ó<×3ÃaµÀ5üv ÎAµÏ7o=%d5Ý%Lß²IÐgm8莙»/ ®¦c¯q$¸ßøþyz‘^¶Éä8ˆØné !îçCš F’]RŽcØb¥ê`üÞåö›£¯F« ôÈÇk_î¦ hƒßé£ ´*[ °pcË“ÐN¼Äðˆ–›X‹ý^ÄüšHÇ›+(† y;:§¾¾öÌæ¦«q/ÒPî7³\½zlœ™F“³zзzÀgª[l ¸›KÁºè<Z+O©ËkNœ\|¢• aûjo0á¹j:òãÄÅJ’ö¦º-8ã­ÄÞ¡7zÏ»+œšºóÈ06‡áàºÃÁqYBQóØe­æX‘¬^uãe¯î›€(R&d'±0îø•jôöÚ CûÙh!̱>ÜZÑÆž_ЈâZ6í,ÙUWBXä­Š¿JOÂ"bY€î½ã½XÕ¥—¡š¶Å¹X訾ŽÞçqÊ‘ Ÿ[Ÿ xºZa7ÏVë$K·H-vGÊ…Ñé)õvÀb§`§aÐÐE(p´‘³‰» –ý9ù–D9¾5ã5žÓšù¨ÏˆK!&M©è’Àc¿gzu˜šY&b\/Лšì§’þ5pÔ¡”²@Ñ¥‚ëïðT‚ú¾7›ËÈÈ¥ó„¤×¸¼Õ_Oj ·˜ö+H Õü5þ ºŽufI*’72¾Ç) kqMðæ´h&x•—Ç °{›ŽŽM§%'@&Q›4‚1…–SÞ}Ú>TðòйmwÁéUr)£i†::!Wc㥶GUkA:KöÔ.ÛïöiÒ•GLœ¿Ô`’;ª‘^ï›ñ‹û˜£…ª†þNì€Ê[kioÓWs&’ÏŒsX“ëÂéò¼ËÇ€ë“eûC{Ò¦DYS¡Éw§íÉõ ßàg~0¯ ³z©êrT™‚öQqHk *sl¯‡ZTEfÕèÄÒË®Ú8xбx=½y²v*Gë ¢°©]ÎÉÚ2¼OžBÈJ/¼›M«„”v’ÒǶl¢~6u·èy–§T\.s0ØRxƒÔº­„wÕèÒ‘bÙnøk&¡R ›Â7P¢©f<ÇɾþôÛ˜tX,Õ§Êçì|f¨ºú¹ÏnŠ –"üL0I[ãÙ³N¾ÙRûzücêö£“óBã˜í…'dAb¤â7ÓD/'™B³ÜЌڤÕ‰ü)çé3¢/ôÕ†É ùIñ3®y:É„‘Œñ¼5Ó¸0§XÃÔËŸÙ «ë—Å=üÏõ’Ø¿®¦»ð¬ÄAyJÒ'„ª`ÐÀ¢d•“®òè@ˆy’дM À:¥7÷ÔGÐÓÒxn,kqp¥ø½ñF½”lÕ¥.ÜÐêd}¯# l!ûöÍöÔY–d~縓Òé-õ&•ÑbÝzQlô¹¡•}à>ô:Ä–p~5û œLñ‰¢Àà>“žQ¤Ðè4ðvÇšäGÖáÚGË€S·/p…Í"l½6S|LS“q3ïZì*²Æ·É¿©æ»YmÇÙ}wQ;e‘oæœwøŽb7R´Õ¡Kƒ\n{“tŸÑƒ;¼<ÊÍÂnb©ÛÛÊf-ü)¡Éà+&\×qÿ>-ôÛFå²¶}ô<‡ë½·>Œ÷rþ¹Ö·Ÿ± ”Åc%7Œ»7Ñ";bl)Å#[kR%à‡—›¥T¦(¿šŽ‚‚ýá†N?žä˜ýêTôŒ ý¨§§Ö©SÒ‘šOP¶M^ÜÆ¯¯wã„}yôHáLá›´´¥²b±N¼æê&Iñ=©arÛ!×Ö­®¹Øcη¢a¡ ÝÀ©tÇ>i¸nXŠ3<® ¨ ¶²8½,áà!mÊl$ !rŸìŠÅÚ¹Ö*3Á #Õ³“ì_žç…ÓÓV2¸wª; åêX[õŽô²Q Uj¡³ˆÑgfˆ£]áZØé£j<‚$dŒûéyl‡iß“”ò!¶HÕÝ/n’¨6£Y@+«fšE/ìÃg[10ìø}>UÏ,TÇ­ÍvœoC´Ø&æ[âÌøùž‘dÒ…'}q ’äÇ«Ô`"0ʸ™3ñöâ¢ÎÏø%<MzR²nÑJÍX¡J?êyÑ{ 52•°c8 /¢Ú_½ú~9»„Ù¦½I7C]d}¹xÄ£™ß2ŒˆÄVãŒt%Ï iŸ%jçl?#$?í úDµ‰óø8¶4µYj\X.°OØë¨(°[¾TŠ.ƒ'XtÃ2Y]‘L½½]SJ[ kñ•™:]˜i»)i]x`U’¸XVÊ;.Ý+æÚ"c™´Çðã„îÓ^fÄ”¾hH½pZºòÄ… æ*­É»®î8L[¾òé 9 [¼ö-šZ^>‹f"D4u\/ì•ÙöžºyĈÕÆ\Ÿ§Î9¼•pÙpÒ—ºN:p'Ö[nò)”ă5l¦Ûÿøö!I.Jüˆ0Ž–Tà›`’ž‡3C =Ð$Ü©Ö>½Bõ¡kBt~õ¼Bf¦M…eóÁ›Ú=¶o0‡6 ,ü'÷æìàî§s§½}ñ#í³³ÉŒ·Ê[ºá–8eÈDÝ É2D뢅5îkõÇÀpj•º_¯U±LÙÛÉ|ŒˆIÕ5QH6kU7\£`¥§(7¿æ^ð–Èêu³áÌĨ×Lz~Ä)ߘÂòAZÓóÎxÀ÷&2󶢋T1¡ÒÅJ,‹¯ «Í‚Z_ ûèOIõŽÄ=+l-¶úÓ×F9 ®wÕŸ7¿iw}@|Ÿ…;†nF¶Sî,않¡éÖÆ½œ»8LôÞ)e3 ëŠO$¢âmU3cHûÆa‚ÌŽ­:Gš¿v_šgs(?2±?i‹,ä1ir²Ý`ìçrOt–ôÎG+n³ª”éåø÷jSOÔÛq8q8ÈæFˆÝ.GcM;Ùѡׯ5’y6r±)ªU;·wú]ÖÀɶÓA¾ði§sòJ›¦Û=™Ñ«Sg²LñR›…ûk‚2æJÀüúl~¼qÜÐ^›vJýFøK¦úµÄi£ÕƒáõÉï=\>ïß›ùgó/1é%•±À^I££gwá7Ød%e äo¹NŒg)\ÂS<£áX{WôSÇ.õÎbE—^ÛUÞ•r¢Œ°_¡Ãö`Y˜ž²Ã=4"³êÈB2¥ƒ¤rµð]‰ƒ0¢T/ª5¨oÎ'Tp“MƒÑñF™[ú!ÓQ©no×[rš¾pœ¯÷\Ù)R$³$8'OŰì~áQ0ÀÅbÕ~ÆÅÈ[+‹)@qcQtåŠfr^H ¡°ç úm5]®æË=`ht1C¿2mo*H†sI~á›F‡ó£›HÁw~RKf¼‡½î 54gÈü²=ãev ©ËASŠ«Ó GñF':ÂA±‘y*<“#¼ù>4Zâž*üñŠÜÖú€â±(i.ÑÐyÚ­]RÞȺ”ÚÀ žPI~ÜŒïà,Ø8+£Ë!B{ÈÊhI²Ù/µ0rŒh†ûÃx^séSÇØ°,öäú–Îñs‰žçª¡Ó„§aï¬Lá)ŒZ¶ñÕ‚<AQÆ×WÎ/C³V]Ò X#úOê‡)‚ƒvñˆ¸oÔØOв„5è‰Oœi»œžŒ^È"4Ò_¬)m ¥v1{¼9zÚQöa¢„MaÁÈêD©?QóÔ0F¥pÈ!a1¸øöÐì8ƒ:Æöe_»žˆig¼ß‰ÀwI„ŽèþP@_´öj!æ ÷TvF^Ó†•÷î^åE :Äy]BÍyX×A,ú(áªa¿§ªÙÖÅ™d&‹Í¿§±'+"—Q§‹$4œy5´n×Iá«¡Ò4%o /x’¿2ñ̆BŠ~â^;¡…Ô©Ð=ò!¼_aÿ`Z}‹:Giçð!¦±Ó.{9$oH1Ôõ1ˆà{A‚ÂBÙ˜æÝA «þ`Ž&54Óã/0ª(ìRBý¶¤GÙæU@£¸aõ…u[–Ç“ ·ƒf¶,ÝÊ“®Zÿ<À²ÉÃñ:¥Ò ß÷8/¶ébUI’" ÝÝÄÙI äÁ ¦Óÿ.÷¡ /`Óbmmz—FòC­çS]XÍ¡«³Íã ºC‡6¿’÷hÃè÷-ƒrM5IS{šAcóQ6_ ±÷\”GÑpã»Au“0`FÒé)Ee…a™­¹C3mTû‰e1–¼ Z¨—«×=‘÷!3ÕËÖÒNVÄìòÒ>âD¥Í¥š?Š–Î½ê7L´°‡néËÔÌRÏQÈj2í¤=t^Ó£ØqýðMÚ¸?ØJmVÖ¯ ¡›ÇßôÐ^uÍ9¥=b)qu\áÃÊÌý_‰¡óý7œÖBòŽáŸl¿Â'N!?×Ìëÿôœ­–öÓ;ª³êÊõÑ~óûs*öÁŒTœ(Šå«1ãNIôü%:v5Œìò€ÓµËÂ*-Áí Ãäµ-ÄÐÐf<~ˆÞXLΧ«ôÑ(ô± «n–jÚj‡ÖkÅÆBä9yÍ©¤Y"–|Å ºÝãN4wÇ)Á±Ù䤣 Ü{Bo'Žk2 /Wæ 92Ì_eɳ®%xÌÌ3ËŧZtxÑüÖñd'¥ÖúÙÍú`~,@ßœÆIv½v:ÃßG±#ÀðVz˜r†÷ªõ´;߸û ÀgXt?iD¤ŒwŽìùºM"*y°û÷‘2+P<¿}¸ Ìk¨[¼ lxî¸ ÍÐgQÁ>M{Ûã eÉy¹ë¬\OT}•vXógXL^£ëzx§~ùÛËz&¿3Å*ˆû94«Jþ'¯ïÓ8• ôð™O7Õw,öÏ“ÃB¨JÎz5öæjtªðsßn¾Ít½ ‹ÔºU<H¥Ú䨰F¤ÅuÕ"!¥¼"¨X£D° i+jõ—U fÂ/î‹áŸ³¹BOàPBØÐšljëÏãâ¯çšem31p’ñ„™B§º‘yÌpy­QØ=kðeš‚m<Ù“ÏOtF¥¼C½å§ô6Ïjõ¡k5ê£O’ ¸Ê0á´5fÑy•³V t2ÄaïXÃZ¸N±Eæ&í»]ŸÑ ÿîÃòd­x.?§%v:á§þ’'ƒPô¼Zgy(Ž¥¢yzîö~5{01‰[¤Ê!lB[S¶w$KÇ>Ø3tÄeš¥pkö‹R”jqëZÍOCäX)ãT¶s­ˆ 9ú›: º%3eqµ‡EFŸ¹¶t†Ì½cg¶dRª2jØÞ§õ°ñ®L-\ ޳*…V²oOyÎìŒè'™)©ÄFÃʨÕÈ “ˆØ²¹d¤õCÈ'v†{ñ¤Ønÿ’¼¯ËA¹ÍlHôFeÃJüYiƒ´Y‰¨—tò-âÂ.qjqü«ü;ž8c¹&ÓV}îãnC½±¼ÕlN¸€:‰×–´Ôb6y½QA£ÓC·4Œ­]©/ÏÎ]øô/11w½Ö• a9œéY8ýkåÓCãÊü¢ÈÜù@Î|ÿA„?NÁ÷GKºm*ß–íÄ\¹/Dø½näzL¯ŠÇlL¬²Þ±†{,eë45áêiߪ¤œl¤ï·öªŒp£Ò½©oÉ}b÷ÁO w~ŒPƸ£¶fò'ñh)?ÚZ¶sL'ð¿s$ìù¶ªðÓ&tR[{;·®aPŒk¨@x¹#.ýÁaŽ¥3§05Àî%“Fð•M¥’ëîý¯/Ëqù1ŠÖ[È–Ÿž¯¡{Êò\òä« y³Àh&¨zvéëºä2íQOŒ®¶?Fq1g|h=éÒÜ'P0èw‹çÚ"h åê¯úUC~Î|Ì šB:=ØÇla4¡|ÃÝùæ9SÔ™K·­áíYpdßn“7ýœ. Á.%™´-2¢œÇªz¼ø#bj”jý‘×ÝLj÷n`®Ã ùÞšÉ7"¸eaŽ|g3”˜¹hsI6…"b§Õâ;(8ùÚÚÞbé{*÷°­•!…Éž?ùJJ%]ÅïBï–`=Ëjò=TŒZé“®W UWÎ31£d&Ë#Œø¹®}¼‹ÏQ èêÛcâRâ^½>œ2í¤ñwÿlê ßžÏéš €)Ûèòã˜ö’!¯D26 uç:Vþ_Iá{S Æ|’Ì8‘nZø„¬U²NQ|áåC‹'¡û¹2$X[G B¨3²lO–×uÄiCC[^\ú{˜tAjpˆ-ÒD ¡d<ÕŠÝü:¬"ºõO£Þ.…ÍòrîvÈ€ðYÜtuD–ËhAª®·b7>È÷(2cH)a–ÝW¹žÏl_ _+wÇ äªdpâ«;¬d˜•ž±fyýÙĆ£žîeZ&®'” £rõR "³‚öâ g¼Bª Ä=´¤ôÛ¸µu4©)˜ˆ2i²ÍQ½щÌ|KîY–R $ ¹o%C‹·ýúÁWòXmç­Ò@×ÈÒ «Þrgö¥þÐDQ‚õÆ–Ô¾nƒ‡ ùëx~«j…úížÕ_+àLC4ÿÿ v‰ëï#ù´wJ­U™+no˜éÍ#Æ‡ÝÆÃ ë›FG/]GÑh®=â¨ö‰ù×H&á]Î;9X#8AÇó Ç¼D<ü#Æ3Þ¦—¯Ä_ŽàqPG¼ˆú x“„°yôè‘]õƒãçÅ]ʬÌ)¬ù–?bqBÓqæ®ö s—>ì­?ú[«q€clCn–ééO Œ_ö¼ÜWÌ4Ú83í{±%pñôá‹HUÂÎÄEÔ¾ûMÌĪ©Âö¦n9é‹uÿCÕÙVn$Þ 8Î11¾QUI·úí¼£‘kFŸ–ay×…ØÄmh‰FåÑŸÍ2AQü¡ÖZK©“Ñî?%‹¢~Ôw.­Ò9QëK¾`é{Fæñrš´ú#+Þ}÷Šd³`ËÊ7§ÿ“zy°N€Gt”~1äÕÙOÕø# 71"‘^…òŽêš ôÝÄ£}w$mn¥Ts´^Ê}áÆÙ˜ôÛç5 »*íâHç¨v,ÚÇû f &(éù1Íãbø™®A¢ØÂ* µ.fŒ†'ÿÉVÏ“|Rž×½" ¨¦#ªÃYife Â6Æ€Êos­ûŽ?zÍnPi-º·E,uÚ±)ÑÎV=®Ô™IïÞ‹Lz¯šSïr H"WKÁ)¦bqȦ‚|‡|ÛÕ {Má+…±¹[…J%Ó_¿úª‘uÓŠ&ÆÇK>Þï™MŒ¾ ûfGrD¹2nŠÐ¶.ufõf7°¼û4}rÆ& Fx¡»µóK¦)ýRÄ¡õGoÛQ5ã mÁ©ËÚšÂÓ˜°?{ÊÿOˆbÀh ‚2 ¶1Û‚"K­z9¼cå`‹I÷«goŸïÑo—Ù…(”´Í¬‚¡€žü¶îõÛæ·Òi×0z:µîÎzì“iøšÈÓ{ŰVó¤5¨`Ô|áPMÞ/Xš’:^˜“{:š8°Q•.=pIÓPï^>tL$"·äXK‰þ¹·§‘‘äò¶[k‚õ8Õ>3¿·üsgš˜n2˜¿Œf› ÒÍøâ +¶~Ù ê;âáA,|¡½Zò±‹µÌk€Ë!oÊ£öw÷ulíšØ×‚"œ‚¬YNZ§¾ëóÉ&™Fæftžè^Ò&*ÉHeù‘ïÜp7À€Ïˆž&¾ªX$ö“É_><¦}ý÷È» .uƒÞM’Ä(®®UMÀºí›f=”£k/ÇKS)ÝÈ» NF]½åCËw×ràé¦ÒÖ•zÝ&éÒÝÁMþê QLgOl èo0eÓSuNe-†X²"ˬ¿²Ót`u«óT{6ƒî9°¡_Èl+Þ%]ó×{µð,ið-¸¹ D/Õ$¾ÞésÔ}‚Ë¥Y‚Rûæ“+*$&°¿ïC83‘t’ý/kØ%Z(`%‘ªZp(‚¤=j <¤E;΀bnÿÅÚny[@ÿäî»gËKd£sÈõ¢=áâÆuÿ…~ÏÍç‡ùR}΢`~¾÷áH°á'ìïï±²?%ñ#Ää˜2Ó<·Sí'Y¹û:aŒb ÿr<#ZY¼„ˆãI4÷ÜŒô¦³Íâo Üb Ôm‡3—ä§o„5“xÔ®q?Ì I¾m"Ê5rOŠÙò~-ãˆ:Ï•?Òè`òqel'h ý…¹U$üï6§]ÔJ£æ]ÑL.¼fµ9à%t“‡’ÉÁÙ¤VšjØHúÁ¡ZÛì¾%9-Ór Xw6ä¹é„¯)®omŽ)Åö;@¼Ç—Kåú<ÞïËlùeizˆTAé,Z׋¤êŒóqõ Òú–|GÏZ‘×ûeq7»î[èˆ!Z¬¡t¸¶­@póŒ%ÆD.ØPî èõ|N0l<îaLo“Ù[3¦¿v¡=À Å„hÎÝî?åJê´õ`hä5@/2œïû‹M[°ºÈU­‰g¸³ñ¥øsgšØ»}Í]”úýïJ!ô¡Cä°$´6øo<£?fPæöã¦æÅ†·zg{Œ¿dÝO!Ǻ;…í=Cm]ÓŽÓÊ®y:a@Ì[ÁöI„ùHU¨=e°î„êˆ'h6üûì8‚4ϾE‚èwD•×ÝæwAÜŠð³%wEú®½s> (ª»âT) Ega†rL“-dŒcCyf·¤Ÿ»&¦7Æ© %ÒKtFÛW`¬^>[ßHÓbPvH `ƒœ uÆ>‰@ž‘ c½-«qº˜{{Ýò>G{_ (Êæ¼ÏPý:è€Àþÿ¯õ±Æ-âÇusÜәă=¿2éžFåÿvA©‚ËØ.§’þqª»y¥ì6¯EEzXà£o~LâÿF¢uǃ¯™Y®Âp؃cqo`„¦.Ì&ZŸƒOÅúrñc²?°N.Öd׿Dn¶U&*X°àãcZ’æJCç§å·±IÁOÚ\ÀVsÍóþGÜ[ØT†¥Pª8Í6NË´þÁ³[Ìvê'Ü4Çú]“̵õí]‡«ÌÞ0ˆÌÑOwB ü½Uáp膟qe,ò“’«¯ráé.Ò| YÜï[ƒK)—Q¿ Åìp+N°ï n¡OBÁÞ"™QÌ3æÐ¤|­¦+¸¨.åh''75ÚBeãS€>ÁÙDU݇5Ööf@î3Ù¦a±¸Â%‘„¹cìŸÃÌ—‘,Y¶Gf·MLÑ“1y ÿ\e-iBß§FÎ@þQŸ<þ®±vïOBвÏ’¢AZá9pÃK\Ô¾ YW »•K£Tkî£wEWófŸyôZ&4d¸ÏÙ¢™Ü¤±-ò´ßºoë¥}ãV¼ÁMûcXh„âÁ'¢¬”ùý.^»‹«PЧ)‘Ë"È™^ܵ"_¦ Ü„»iµ=:~ U^Ó¡AwÞeõ¹¶B¤•)OïÄr•µN€eaÓŽY²v|êËC±ÃDWì¼M¶.YÌaWh~Úuz¶ÌëMÙˆT/Tt5ì߀7ˆSÒ¶Uw÷ÖÝø]£·€ªŒ­­BSÆ|‘v¨À¬{0kŽÊ*P<,OöTeOúZ£of¡²–xÆö±óØWÇ"Ý.Þ&4舛Ȧ²@ Ñ.íZÔˆÖ>ò%uç0Ç;'Ô“ïgûŸÏ6ŸBY…,H"±Q¿t»GG´ûW¿edIu'aÓXn!œUìN¥Ý6µ¸’ÉTM4Ò`¸uø›†Gâ}dƒÇ—©PûöâÍTGO¥.èYy±©Z”éÝÁ˜¼W,³àý’ŸdDZø²jÔ"W\Q6w¬4£Øê“DøýÙ“*9!¯Æ8Ía <5“•<Á££ƒƒpȇä6à<Íø¡rcøÝߊ2‚’{–¨‰@Ÿ^`'š’‘”C~¢äÛ úÓ¸RýŠÅÄöãí+PàÞ,ø‚D»y8ñî Ëäaqà¹üdˆƒÛ{ØÇø ›Éa%>3¶Æ‰/!‡Á2£À‘fïVçsLÕÊÙD^Ž”æu½çÙûg±”w³&1ó܃„—Vé+@ñ^óÂÿÇáq…6Ÿ•cðo©¯†ëU®¨<)ݺ¦òŠש_ƒcC5öA5c›˜ˆiö»AÊŽŠVU—ãRð¬S<Ö!Æ(4™Žø†Â„6³çòÊ#cO€ûO¼ÀÞåÞX®ø ŠqqZCmÔï¿c« «,´á‹©Ù¨­áînÞY· iñ£sHTHK4fšúC+¨¸{X€@Á‘Xj“âôË¿‰­›!ê±™BçŒ3í+¢hdfü°‹•ÐHF$~Q˜VÞ¶ºW…B•Ù[!ó9Néj‡µ¼EgëX;ƒ7èAþžÓ}ÂðwÙ“eDÔÁ•pªPÚ™ Í‚òz„‡‹Ô:Šìåy᛹E}iÜ‹¬1P¾þÝ …npR~¨Ñ# ¹!‘+…ƒ§X"—á%À¤ X/ûzY®wyꮢù¸H“s£mÉHo§Ì4šl-\’Àç?RAÈðB=M(“¢†h8\woB]É0þ3·Qà,"+Y46 cZ.× …´‡ú“=†¾!žË­æiÒLÕöÔÝC$”O*pðþU»)mËÈ÷µRVýÎÕ4{®§"RÅ_rû–W‡uÇ{âϰBÆE4ŸW¥»Èâ]˜³¨øJ­såÅ9*ɨ Övlð¬ÄöïÚút‘Ö%óÀ#ò_[e7¥‡>&‰X)j[ÙÙÞ45úwX³æŒRÍÂ죅¶’¡ï,ã1êF-/˜¾±½ÁÍ¢¥¨ä•¸ñŽþŽ~ï.׉ÚLˆešo_P+°a†ù`0î]deŽäF2ÈÖ&™#™÷[íº.:@ë¬>’2A-&ñJ~¹•ܲŠÎ–WŸ $J“ü¹å:)KùÄ9>^™)û+sNT  çÛIk¿“‘ã¥Àü„t¤±/†ö·B¶"{vx_soyPÔ‡uº ¬”bEÎS}ÃÀ#A™‰\ÖLQk7!®ã­Ù;2·èɦóYw±7ò¬µÁÛ&å*vAÛ;¤.»d)½—h›¬/ÞVš³2ÇÕ*Àó–K“ʨE87««¶L²›/)ìï ?½$dÕë˜VÐ ÀŽêÒ£‚zyx½fzA©Q×Þ_Ç5‚É[Èò›¼bWÅ3#ÿȵÄ“ÖûN>áZìϬÂUéßÕ”RO%ÙCA²t#Lýá¢q³#…Àw7Ÿ‰R[‚lºèˆ7ã$Èd°X§øPª†–!çUˆ¨\ÿÙ¢:ýòNÁK¦øÇåÏŸ„sìãCåÏW@£¬'}þszKa/­ °ŽãätQê³>ž–dI5²Ã®z¹±¤÷dZɤÓùQÔÆ$yWÍOþ<~Š `Ü–4’Œ"®kjóñ8 \J¨á6%.'œç$t8Ô[o?XÚ…Ë©N¨ÛžÖKŸ<}ã¾7…­—ë÷u]âEÝyvˆ $ʹ¶SFV†"6+/I¶«ÒxÒ«E‰È2”£#J»%²n=ÏMɳíŽPŒ£}”Ïk¯éALÔî®§4ÏÓ–½Ï,èîrÉÉ’Úç˜ sª­Vy-=½¿#µ*Ǹ݄«¥C¸Hw‘mÇëkcÈöãQ$Þû@Fxí| ¤À/*÷¹®xÁ}ÃäÎÃo¶.B¶I¨NÞ£¨¿·y@>c//!@³QS}wB³B{a┸˜ƒl¹ LÏ8~rű^qÑòÿ-QàãœB Ü=ÇâD ª[<„Ø•9 8ïô0Bu~„Â呚ÌXd­ðƒKaª+¬üœÇ·³Ãp4è/} ¯9×p¯ ÷•Áš½2Z‚>7áØÖ«ÙmxÈ ý‘%“!xºó¬œ!àx¬zÅ=1ãG”IíBéšWî:öÐ]6>©9~W$¹b ;ªi«ñFZÚ7¼fÒÚåG¦Šù‡ììì}d%&ßÊmJû=?HI‡éNÿ215ÊÙõjë‚êžôÆ/kËCÑ”ùÁ*›³.óEZì‹}å$µP ³í£ä#SÒ1 …C“T·Í)æB|k¿ r…yqWö³˜ô·mW³_}[Ï3ktÝEÜ¢¬½<^pÒþ?†ÛKÌŠPÆ–;Q"Í»öŸ%Þ¼ùK—RD5üpÿŒÂo§êå†e:g”N…öÊnkÎ'¡j˜Ã,¨ájaÄNßµ‘$„>`=xöB·ºôo‹ýS8‘f«-µ$.×`W4!—Y,² ®2]yú¿I‚C4ùIÀ¸ac;öxLõ{€3oàÊ‘à‡*©¨8xfPîÛÜ辂 Dk›åP`ôv㎇—~Œ£RÇæÂžQ ¡}O¬˜£öÕËrÓ’û-yHÅô̶ŸpEoÙ%¥Ü(_'‡q;èÿË[/a®«jISì=x)ý5óò*€v¥*¨§er%àµzº K3¥þne9€ŠCM½äÓšIHT‰Ýy°y¯å¢PB.e„×Õõ$™«Ígª`% ñÚ—¨ƒÛNI•T‡UóNÁqˆq1¥Œî ;{{."þ²ï:ŸPLOh®d‘ËqDM€â÷m wýÐÜQ'ŸíRÒaÏtŠ <@ï”B?Ùê88¾ÈîkÔï_–Tý¢PëjÁ¶ÇžøºqÛ[ÕôãÃõeê^µ¡ôI·v¶œ~í~h™ Žÿ~˜¢ã_§'r¹¤“BÑÏS¿ÂÚÓêÂ-ÙtGãYx)â}í$gSú;¬ ¢‘> stream xÚŒ÷PÚÒ€‹âîÁ% îîîîNpwÜÝ=Hp'¸»C Hpw×w‡Ë–s’ó¿WuoQóµw¯^k 2"E:!{#Sq{;g:&zFn€ˆœ°&3€‘‘…ž‘‘ŽŒLÕÒÙÆô?r82uS “¥½÷"@SCçw™¨¡ó»¡œ½@ÚÅÀÄ`bçfâàfd032rýÇÐÈ 5tµ4ÈѤííLàÈDì<€–æÎïyþó@iL`âââ ýÛ dk ´46´È:[˜Ú¾g46´¨Ø[š:{üOJ^ ggn777zC['z{ 9?-ÀÍÒÙ lêd t55üÕ2@ÞÐÖôßÖèáȪ–Nÿ(TìÍœÝ ¦€w¥±©Ó»‹‹‰)ðž "% Pp0µûÇXöZÀ¿Ã0Ñ3ý7ܿ޲´ûÛÙÐØØÞÖÁÐÎÃÒÎ`fic P—¥wvw¦Ú™üehhãdÿîoèjhichônðwé†q!%€á{‡ÿöçd ´tpv¢w²´ù«G†¿Â¼YÌÎDÄÞÖÖÔÎÙ î¯úD-¦Æïs÷`ø÷p­íìÝì¼þCf–v&fµaââÀ fgéèb*%ú¯Í»î·ÌÜÔÀÆÈÈÈÁÎ0u˜º[0ü•@ÕÃÁôo%Ó_â÷|¼ìfïm˜úXš™¾ÿór2t58]L}¼þTü/Á11L,F¦æ–vp¿£¿‹MÍþá÷óZº´ß× Àø×Ï?é¾o˜‰½Çoó¿˜AACA\^žæß–ÿ«¶wxѱ±è˜Ù˜LL,\6F€ÏÿÆQ4´ü·Æß¾Rvfö®Ê}ŸÓJvýw(ÿ½ T€ÿ%oÿ¾¹¦Êß‹®ÃÈÆhüþ‹éÿóºÿíòÿoËÿŠòÿºèÿ·"q›¿õ”ÿüÿè m-m<þµxß\ç÷[ gÿ~ìþ¯©†é?WWØÞÆäÿꤜ ßÍÇhé$nénj¢héllñϺü#Wûë¢ÙXÚ™*Ú;Yþõ´è˜ÿîýv[¿?Nï;ù·ÊôýòüoJ1;c{“¿n3;À4ô€c|_%f66€Óûu41uÿ{‹ ôvöÎï.€÷æ|fö@¸¿N” À ô—èb0ÿ&ƒÈoâ0ˆþ&.ƒØ‰ƒÀ þ›˜ ¿‰À ù›X R¿é=ŸìozÏ'÷›ÞóÉÿ¦÷| ÿ%Î÷|Š¿é=ŸÒozϧü›Þó©ü&Vƒêozï]í7½×¢þ›ÞkÑøMïµhþ—¸Þu†¿é]gô›Þë4þ/±½ëŒímÞ÷?VÖ¿$¶¶¿ýÿ:u“?ð½ÓßÞ«úgá~¼7hößÍÍþÀ¿”–¿ÝYþB×?âý¥·wþîÝÄü|/Ðâw¹ï#²ðp°0µûÃâ]fù¾OÃú|oÙæ|Ÿ‡íž÷ú;Û»«Ýûšÿ¡ïÆþwöwgûÿQ¿Wïð[ýÌáý ÌÎÆÔì÷|X™þ•ÿgl¬ïƒtxoìÿõû÷7ƒãøÞúƒazïÓéw­‘©ëƒ`{7wz¥ÿ›á½'C'‹?B¼'ý]ÂûëÇàl4ýã4Þ;pv³ÿÃá=†Ëø>L×?ð}nõ»·ûøÞã|Ÿ•çïâÞ#yšÿIõ?/ˆ± ð}XοñïÏËøï/mSSwSc¸¥y{cž`«ºàŽû!<7º½q¾²=T*:¯%`§Ë#t2UufàðV(yøÊêŽåà2á‹×QktX[¢Rû“÷³~‚òÔ^;Üâ$æÀDá‘PýwX|:UÁ}ïGoõkðVÐni²\GN$Åü÷nýîõßËVFCç÷”ö«ÙeàŸË¦ébÔ¢uŠgÉòŒ²æ°‰¡œé`¨ÑÎÝ‘gongÐr&Þ¥hà|ŽcXм´6™cæ<×*T™zpHq´° ÀoÐF§È½„S¤±¼J¾ÆI‡F}5#ЛoæïD6td­%ê^â-™ØÁþ© R†¼3g¬´M&<üÓF%§ -·ž£xú…I¿ÎI©ëàÓ3ªr6$0`í|¢È–Ö÷Ùæcð ¥T×aØaÊû"NþÀw.ßiІÏo~‚ ‹ÌFyÎÚ½^†îˆ']`÷>v0ÙÚתŸNøU'Að‡I 0Yåð@œdk T¡½Yóƒâ•ÆLÉXÖnHw{"½õÉg ,ëñî?"€m.8ªî¹/š”i›NŦ[qK÷ÚAŒÈ­s&¿¿ŸÛù­… rVHàÒFÅ©·T.T±ù® ¾+ÖÃLÅ£dk¾Ûhu¬Ï€Ë…À!vàVq{(¾FÞ8O%ËçbQ;8=$:¾”×Ö«8¥WìƒÝÜBÙÓ3 ·KW2î©F=¶ò‘¥âÀ÷vG²È +ÈsO‰lnºi~kŒ>i ÃØ½­ ³ÀûK.ez ¯o$ûb:›ÌÊlz=è ç3ªDg#(UðSEb$÷B5ú°q>(¦0bi‡”ú\À äü^®Æ[k†².bc&W?¤–V­·1–}pXm|Àp ”Žm¨|À±FÅAàå§•ô­Ò+Uã¯öEE[÷¥‚àÂJ‘È¡Cצ™˜ ƒúÂ|ßo›n¹ÿ0žÅ¬M.=¾þίU~:º.0;ƹ­¨j{Ebk*ªx=•^ÎÞ†—ôÀõÕ•ÏB¬G_“rÀ#>Tþ>š’ ·øË„mž7]“µ ²íQÜ9‚¦HTØGéÛØò®fÅY]Í1yHJã4çÐ\,ê^€®d¥›ù#‰ªÆ¦mD"B0PGš­ýò Äié†d?¡#H(Ø}×;+àäÜrf" kÙ<‚ƒ¦~¸³/€-E;NY‹”×"WdÝ-µ“ðâ‰UQèC’›…Q·Ÿä‹¥˜Op`£6r‘í±ç]²2Æ=)ÁÌ3¸¶X.«×‡~Oe‡ŸHt°í%†úRû‰¶‰e¦f—-þÚŽÍÅ0ôYó"Œ.øjùwÇäe{+´BS°ntÄ4¬õ¤ëEüÓ­…©|$U¦‚2Ô`bÕÎúÃtÒIƒðFãaWZ&qç¥a)ñuQqýüîò'¥ùë;qNà_³Z%dý—Š,ø¯rfìc®gŽrK²p{@–¥yÎ¥itláÆ ñ¥qžØ±|³Æù;oÀE %0îÕî<Z°»y !óò­W¹údŒ"+‚ˆmÀLSGz; -|96“ ¹®d" ¨Œ)NT±{(ü¾ãKã§JªKݨcyN„ñ =f™ùÃq$ÕV S0ëÌ ÷ VyEò¹°”Pgw3lÅÚ"µ­ uåEñÔRÂÓ“;`”ÿ¥ì˜~K´BÍ1ì"«Ð1Îgä7æ{ú¬¿& û"(%ÀËvQ ¯ŠàéTÜpâã"k"·è_ÖEÌ‘-Ó5~zwÐ~¹ºÆé¡ˆòº¼Œ/ôÎu5 úø^4Ÿ%oi?Y†4½à6­@ËâW—ž2½æÔ—%ŠÕ¾9£ü‘XôM±ÉÔ¸ºœù8!ˆ,àÙCTG®U…Krñ\)¦c. hv-Q¬÷¬ÃÆ–L²³äŠ¡òi¢ ãSfW¥H¿Á×®5­RWó‰–“¼€ÃqÀ„ôõËZ2¼ž3ƒZÀ¢ÇD·_w?v1ÌUk‹’ŒÕßHˆ†h‡ »=®é¯e­ ‡¥d\Ë`:SdAÅϲoFqÞ·$ÄìÝ21H²„Šš#žFH_s´B§ï|ÞN¨È°de̘‘ת¶7”ò³ jñÕt ¦o@¿œèKåòVhUkLþ6ŠÍ:É“„u®©@º$ª‡î'—Z¸t›“›]ÖÆŸ-ž¥Æ²Na‰˜÷ªÒPÚÜ®ã¸Ï!ûÑò÷QrÔmˆ5ò–g§²fWfâ³ Åð £Iö(ã£ú†cD¹«ˆÛ¿œuo<u:±2 +Ö“”Ò€¬…G‡G˜r%)˜s  ân~Cg¦l±º—~ Z=Šc†@cš¾«†ã ƒ‡‘Çe)èÀñ¾ÃMc –E­Þ±Hø©‚âP¤/çÅÙõ éñƒÅMçÎSäÒe´@ø¯û¯Šßw¹É)¨ÆW‹:I§Ž(áµ5<öyAÃ>tª®w5_3W©ã$TÉ;mLÇ>]"ûu‘ -[D_®â/Ðn]ñçì‡á^Ùÿ”ù²L,™5Q4‹œ h)gF)Qã ®¥l:k'̘º¬4fR”Z‹ßº£·ÉUšµ'³Ê)Ql€c:m÷4b®ªÕð_—£±•in4£%^e`ñ-è¯æyºMáÈgàè­ä±§;P&óÜß´KÁ—n´Û}cbüùÍ¢]Yœ«&GuÁ+ž2Ÿ<õœt#$Þ{äÚ¢÷îí&Nîͪçº$aï˜,^ K=øm9\b{ȵ9JÀ@…{óˆ[ÚÔAy`´iùÞo›+£$:wd÷Ó¶ÝЗ¦ÊëÁu°Ø#ô™Í®­ù Î_¤Ý$Ħ0“|hsÖðfëfÁy)qÑ9#ðUh¥ Šnxb\Å7¤òíÁ˼ù/%oáÄVšíšNà/r@ÜÅ_bÕ ÇYs²ÏćDÇÔfØ4D jB ?ÀhXÐzvÜ9R.ØIðºß ‰®"ùÂwH†><½À'»aEå·0$nHtׯ’$ïtJu Œ¶væHo|]Tcñ _qï¸by3ì?«¡ü:Z⨢Ïe+ÝÁnÚQ–¤Õqc«}Ø!'pGe2ß/>ªpLµNæK =ަh1u„ÆTw¬IjŸU¥ïŠ‚·©¸ NXþlr;˜ö y1Iû6rŠBæôcÃ7CÜô!â~F—2ölŽ{ïÒ¹­P`êÃêªWHîÞŽDÎ|6Œ`÷@žMÅãw'Ã}ÎÃ¥.‰¶iõH³ökiÔŽ¼Õ®£¢Q)P^ƒÖÓX:Ó]º«#L( Ò†Þw[ö MÖ.gn(/Õ_<@Ä¥¯;ô50DoMì÷‘¢^oÀ™à÷HWÐ…ì`ý‚ö̽\k$v«®ÌÔ4­~þ`DD&c/ÎhboˆÛvŒó6š³nÆ*¡7Zaý™Òë oŒ{&­ñu]—ÎTºyÑ7yÄ8`N£6çyÔbøÎ‰m<ß/òq@¿Ñ)#{@¥+ë€ÖйÄôöbjøÚJÖp)΂ólŽR”S´Ež/糸R2Ä’#j=da£“t1á߸๳lÂÓï:À€³ןJ3¶¾‘Ϙº'´3Èt]À˜£bNO^Iû¼KJr‚Èþ0åõzó\~°]Õ¤#îz£v¬Aßíos Gæ©mÞ0‹rbÅî[„&?‹±Jüù³žµHÝ™rÛ*þ+!Õ$™]“Æœx¦ºJšG¥ß0úìï•–cçIé2¡¥T~Hé×‘Õ j÷ ²ïºOe)Tׄ–9  Î¬Z)ê ³º¶{ê3 Ë O‰þU7Tæ –¯­p—dt`Òj¹Úf5ªš³ ô¸!Æa˜Q0já´wgœrù¬¿ða=¹¸wFë·¬^m®7Š×±$ˆüŸsaŒüÝ/ÛwôïÚ¿ŽÈöµôçÀ{”‡–%Õ\O°!O) 2x™)‰\ø”›üèZ¸õ]ÜÖÿ$ªgmÉ™Š¿i6S,°o>ñï–›¡Ñ£ ME:e×gXÑð²X>fˆ˜Jÿ5juP¯â3ýz"æ ?å9×´¹5o…[²^ïë™!ëå(¤¢þd‹miþÖ ÌRMÖ•ÅnàF¼£ÂÉh·Þƒ<Ÿ¶ૺmzĽËh1n3÷‹¸à>PÐòÙáh9: Ö`F`£‹DÕœÒ"±ã,{_ªáÖi3–zÝ·Œîí{]ë×ãG¾/·MV‡våMêªXÅNH|&yƒ =£óOªŠ¢x³ó›¹Ù+Žd¨X›)»t9·=MÞLxïaÄîû¼–óu7lf’öÜÞ#“ìëy ¬’5E³ÖÀ _©`±Ø"ÛëÙ‹t×ʈj#ÚoÚéîe[C(ŸB›S7ø²XÍ=„,#ÜEB"q¾š4úû©]Ê$»Bêýκ‘¢ë&ˆ] D°óŒþÛÔ.+ž×F»X5©5xGåÀOS'_ëä#kršÈ®¦pÌa@.‡pÕ4É-ÆÂÙ㺮7g5Æ™kõ–±ïãA‘<%ªOž–ò¹Óãå//fú*oÄKüOôæ·¸Âìp/CGÂÉŸ‡L4OãÑob[5Å|@j3OBBöM5ÐÚõsll”J?°¿@YÚ—|ç­Çe™M{Ö]Û–'Ã\W‚ÒsÇ^ ŠêóÊ «ŒæÎ·æ GüÄ»HÇ.©m–ò.J†Ëñ[Ψ6“)µ´v/ÄzöÚ6¶àgX—ê}mO¬á” èŠüšw€í’µGN)ËËÏZÅ{eôº¯½ºXù¼DMT£€>ï 3mIŒ2›ÕP–•€ÚažHßPÅgAŸ^ŠÛShM¦Ât®ºÙícROªg{[qžq‚HÌi£L@2k(öôçÐÔÎE@‰…þi‚¦AÁÞ.-Tò$q#ÍpOê+BKÔ°í“‹¸ã!'S/Ô¬Å}›‹ÓÕ‹˜`ïƒ>Z%®”·Î¥™Ø¬h¡9¾¿ìÚú’®V`YÊY޽|ÖÀ®«w—t.5Ú×Q‘ä‚B®ÌÛ»q¹ÝD|ÆM~ä;žvC^ùºÔ¨ ›"‹'ÏU/áËGc8Þi˜Çð¸ÚNÙ÷× þcæ ÈUfÑ21´O°]`×9M/ãË»:➺íâa(Or¡dŒÅ9i÷@š¢­ÿ5ð[eÛ«[h„šv¯œÉÁÉ‘RWÚëºYCôd£÷Úɹî¡\Ou3{ÂÍó¶žÜ·i' “ÖYübv¢:²2ë› ´é;v½˜e}5Di¼~˜hH°WÕy0A•£Ck²BÊHÕ‘ôŸrL°ÌÑ1QPX‰íÇ…R¤¯–Ðð ’·1xè}AãDeæ@GVíµ¾Nò¸¹_ua=Ó`°Mþö£{ï‹Øf“ó&º–«.K”ÜÜ9ûÝâÄEö÷.¢?©MYÕ–¯XÌt0 Ëf«éë!Âuª\<[l×µÛmžqñxm?v3Q:&Xr)i˜áK®£ƒÓ®©Ž2tÑŸ"œS¢ØR!@‘©dlÒåô´m0ZüÇ>‡ôîbvABôû0ì¯hbA»=Øì0 GTù@ÂS&5©¸:ï'_~×S²-;4Ü#«:Ó­n¥£Ó•BŸ?kŠGÔàr0ïÓµ•Í%©h8)šòÿeP —áF‘%á&à{÷`áÇÂôkdkæœ\Ù‰œ§÷mß{Šð¢Ø…°ß=Z«’TH> xÚ(ŠDv½ô¦¥¦»U˜GHª™K–"eªÃŽý¹’º^9Ö/ßŬ-S Û"Ò/øÓÉYœj6Q!S•Ì‚"=â0¿ºíÑT*Тûb»öî¡7Ø‹ìüØE'Å¡nB›®±ƒ­À׀刉ßaãÄð¨ÒêÉÄ^u|ðWù¢îf7Œ´öÐkÍšö¡¿à`79‰8§å¬WFob4h°Û´)M]±Ms§pžIf†ë‡3þ]áRèxf‡­ÚÄX˜WØV †Õ©u˦NÖA¯¬ŒP*‘¯+ ì³ Ð¦dõæL#ÒPCá‚&— «ÍÀ¤w •®¤œ´m®oÂ=¤à =Ÿ'ÖÝû—+´0wäÅ>a¹<˜£C =CEo:ÑÅŸ;@„ øÄÍÀêöåêÕO24b'Ø–:GÀã—|zpX·x)ÛÄ=›„ÝÚSZçÕý[ï¹å¶ördë’?÷<ŸDñîÃ͹$VT‘yÊÏ~!×·¡©úmLëõ†Fbèã ÉþWxê«èWxÊØ ªgE!3—NÉQ«: &HöÙŠéÎV̉éôæ/Õì¢PäZð)uù"¹“kíßZ•@¨G‰ÉÕ±²®î€†ã š§}ÁÚãQ¥ÂsëË܃ø?[«¸~+†Á ™F ¯V«ùÌ;Vf!ZÕ‚¡FÕV¾î·y«ÞOå·IfQ)ä[-8Ùå×»xÈ’q¨®Î3Ú:ÄN÷ß+ÌÒô›„Pâm´~ήt ïû†ÁCú`FŒ¾¦UË…–¼(±„*u‰s…£Ldz¬¨¾ý0"dPc~Š3o(x‘íq?KbìÌ…-ŠYâŠìt‰0A¤DºÓF%B0> ™ñÍཞ* “GØV1RÐ"ˆDêá.l®\=ÌE#ûU9,ªsŽp8é41û·½"{,Vx{47ퟶ#'Ÿ‡÷<¥žUL³&2^qH¿}D̉*ïqÇU΄Í÷n$$õ¦Lÿ­V¢ˆë€ñ‡—©Yƒ çÎê¬è˨v[Ë8¸"‰Þ…‡pí`ä}@X°œ']×2•gQªm ‘èœd°_Ï"=$ßrܰ,v¥Ë K73¶ °œÕ·VÛù?ÍËÑiªð+šßÕÀÍôêíÁõB.wÁìŽä-çû¹sR&GþØ9Úw HŒºxôDËw6(z¦~#\ñäRÏEõ>®o 2Q([¼Õù˜:tݾʬŒ¾F*«O2Ù+·Á:"•Í*MSw³>™å=Õ'ëЪÆ×u.3Cò*š 1óz,vü“jw e ¥Ka>)2ÃEýðòeÊ0±ôšˆ9)}ÅÙ'ªVЬ^t§II“’@åF=xšÔ£åÚÎ`ôT–SŒz&iZ ÔM]wîZõHÜõkóõ˜m%^½ ÕÈðïþ'´ÊYŠpËý>×W•_hîÜ'9޾ûnU´!ÚuØ-”øYc„ã8AG¼¥nÜæ"BµÜÙ!ÂßO÷Ï(ÈØËe.]ô=„¿"::“±"&(›ö5¡ÒWõö”cŸ}}Öœ½¿ò|zâªVÄAÔp¸ï?“Ö‡ïªÝRÞj[ìÍ'A62ë#,ËÑS CÉZû`\ÝÅŃ'’»?p´¥–²Z»wG#ibÊÈáT ´Ä;ƒˆ;ʘûõ MKÀ|Š\VeÊGª¨°d²øÈ™˜ú¹¶Qš”«*uP ¦9 ~U+˜bò²¶_";«žàAèŽfØì~8ùb–0Oª ½íV''9uÐÊ’ÅÞÎuðK»¯ [ñ›±YFï.Èb̘zÎ)íÈãOʼГ°äY™Ísa4‘!ðÑWOcŸc??ÝfÎXœˆ?ŸúŠ3–§:õŽôBÐTôIû£ãŒõNè$qm×.šÄXTÍ+=ÐgV… d)–øÌ¨†BÍK§æå#ab„EB¢T±ŠGÎ êÚ8£5êOU?[gÂ,z:1ç\b»NI½ñÁÂjÕ_<'l›*ï~G¦m;ÐüSÞ<2£ƒÂ%¯ý¡v[x.=l¨Ôˆ[Ƥ<)q3ÔÍCöJ MÔ†@·™ z3oî›ýX ­RøiêL«Nœ×DDÅÎjq „y•4ìô§oú¤¦™;( üö`³¼eÏ.c~74‡zˆ56.ΧÞ8øHç£J.ß )}là¨.þ‚˜£Â&F•èÝ~¼IÔ½o..×ðºéGê ûÈ ¡b–:/UÚˆ²qðEXÞm ²ÂeLÍî#¼Á½j"îèÑtàf|íTvÊr`ágEtóPšÒêåOAoêM: ½ûã¡H8Ž#\R®?ßb°²—ð¾•ù8Ü£;‚­6¦ß:4ÚqŸ"!]ØáÍ9¸@5‰qXÙäµu:zŒ¼îYÀá†X‹™ÎƒÛnj¢ ³cŒçk<1ÀE»£2ë¸ù:!ù¦ cb?2â=¹ûmYQ›ÌŽêÔ`6ÂÅÊ|ô€(›¤*ëπפ×dz@’´¾‹1{ŸÓó"¼0µ‘ÃKbOÃŒzå(Ù^ÎвÚZ)‘*Í·múÝÑØáªôU®vì~*Ö›»«³LZ€okö“ Al«öc[{ñÕto¶Etþøþß ç7}°/JÁš¨±ÕWñ¦Ñ†‚ß@<ÅÓh@±¯$òs¥ñ|Ú< Aso¾™™ˆÓ 7ö‹g?ñHi‡ãã½QgŒHÌ¿¬·žti4Ä2¢¨™µJFÒGÈAÌ©| ö»/&c;t&Ø>ÓŒãÌ‹z&Í3£žnëJŽŒÑSç_u3ÝÀç4`±‰ag,Ô²½ö&hûƒÒÀ§ßÉ™²Pü`K*߬Y”+Óö¼—' P¡ßZãDò—µ0/“êïÌ©À'·zñcÍ]@Çs2.ø©¨Ú¿ ÎÛÏ/ëðö¸ñ!¹%Vm€¯m}„븞½ùeM “ç#[1ÁŠÁöÀ'²£™|þh–ˆ¥ÁNªzã*‹7´f‘Æõ$fÇŒŸž²u„× 9Ùjù@Ž.ÃÁuž ô Í–ê¿B'‘TFB¦ž­‡ÄˆðpVG©_g]½D˜PŒ›Í+ñ¨N$ãûK‡„ퟚ 8?õ‰”JX®:)P¸D¿`E:€ˆr×fßÇØxäÂû’p ØB §Õøû-ùAµÒù„X8ܲ‚té€1[òÈ¢Y¹Cã_y•~Õ?#j+,•f@î}{š§œW3Ñï^ƒd¢Ë\å(-õ‚*c‰¢L6ÓÈt§î†gƒz.¡6Ÿyaä„ìOà„÷žµR3är:ÅÌž¨B¦‡(isnó̸밶e™ë¢ˆòS|ÿSTÀR‘œà-Ò˜˜’¯õælc“‡Å·Xk-ÈÉïTngéèòÎ÷`6¬íºÐ'NÖ‘Ž/éä:Iöµø"YuØmd)W1þz[o%T+ø¤iF w‹½/œÇLùwÙæî]Aêâ.ì–Ç ¤<¿ÕØ"à‘¹÷J!°^3‚m\übõ3#'Çec{aËUâ:îf‚¨Mç\ ™{üäu'Ë#ï—#Ó–Z4þ棖 ¾Ó‡ãä³[ˆí¹i>X¬ <3û.Žì,)ÚNyN—ù¯ùɲqðUÉ3LÉãËö'1tØ(TN©Lx†Îß-œDv±yž´ÆæßvÉ„ÎCmF5aAÌHª¢i>ÃoÜ(çÎó.V^ZXùì9Þí75®–fjκ W²JúšˆÆ“L}Eo.Wäxe•  QämÓÉ&w•A,[Ÿ•Ü5t\B|éñä“áöÃï;òÓÇ㙌Uæ»NÕpÜ$ØU1þLÄ_Y5 )®¤TïIà›=wiÈwÅZöˆ(³¸™àÒRÄx¸š×¡ÛC¬?£Â##P$ õE„ îâlî ©ÀK“Ŭo­ò¹r©´‡ØRß%²,+]ýSŒ™¥ÝZo‡v »×&!ØO&çÛ’§»‚ãÖr@cyi«ÃC¥t[×ì_§7“+šŸ¦$ªQbÕŬ¿Ã>©þââK¨›qÌ”·ï…­È†è-ÕÊꦧÀÚÎk‰º³æa$mʷȇaP¾ûFcA ‘ë¶É’´“Y¨‡•&RöS¼ú® RaÍ(äO¯:Tî³6ªÂdRt¨?âŠú<¹‚¨ø©èÅ:ºªÍqƒÌ¿HioçÃAd;j«TT=ûv‡pÈçšÂðœ´wšM„6Bê`È,_éFn²~ „¶ `ˆdš•­ÍìÔuªÙVJ(¡Éä^Â{Áõî³ÚYǯ2¹%§X ›„_äªý¦³hT #'Á?® mŽýs…;8 5^ˆY¾Òœ K™÷óÉ$Û HL{°P˜PîÅ(ûÔÅž÷$âîCaøxLŠQî‰94ŒIد˜Ïè!+þBÉßPBáS¾7n¹°Ê ô¾Y0 ©Î(¬» áEuÃøÓ»ËdX ?éõL¥|9YIJ¸?AŽzSWŠd//c%Ð9Zj~Qo4Ñ‹ÆÖOälÆR{ºnW@šíœÞœH; …yÓÿ†º?EôiÝ•kËjˆžcpO“^!·‘’RØ;º4;\ê×P¤Õ¹¾nØ<£¬¾›}\L'êÖ¨BÈ/çéC;l.ÕŠõÛ‘1Ðüý²b5ÎqFÕaoÇKs öjœ³ Á{lÈØ07]jÏa©®c«ðw°æ 5¿@Ó€Tå;µÓBbËã(ŸÉ\¦£¾@[nq‹}K#D€KWâ¶ Ë:©ªÖÒë_2½pAÌ#®*òð@ǹË:±+.ýÅbáüq&ŒQ°…ãp06|Én«Ã¯ –Â)úK—§Ññ¶Œá,Ð5“sœŸ7ÝFr¹°ÖN¯ ž8M’EnyE”£qŠß'äà­ªã3±tw—0Èø%_ðW =*RÈ´úvMQÃË4#ãUŸÃ>,)A|¶¡ x0¤©ñ¸ÃÊl“}·Ž¸ÆZNf³º‰j¦vH‡€p¬½»UîWÅç]µOƒÑ)[±CC¸qŽj¢TÖ” ˆ±Þø“dÑ©.B)‹Ø® šæ#Œ¾ ~—á&ïþüeV춇»±:´i÷bK¹[ưånÅìMC1=ÕgüÜ¿KäÃêžÙØ*N.ŠíX:XÉÀ ¿F…Õy…ÐçJ¹Sñ”_­á°bƒ¡ˆµ%Ü4Rãhµo€ÅÛº ô ðF(8½hÑ´œ­‚OË~FO Îö/‡R57ŠÇVƒ¼RK¯Vãf…‹{š, ‚®a|Íö‡XMRç8à‹Ã)œ#ܰx2nÇFÂmÚ½­1?SH¿/óåz;*ë‚kå¡ÎBÄ«D»l^q[^%§ÀÔ]ò 2}àð¢FϪ±ákãÃJ꩜›FKŽˆH»b=ÌiákgJDm%LAgK¸çwŸñ]ö’ÑVcÓ¯(â9: þ,èK×’>¢·NÂÝëþ• `YRwqßY)ôM1ˆåå•ZËé3ר"aÏð„ßQˆºe‘åK"W$…òLÿ¨ã;.È þ³ŒYó¨vÌ`èŠEdìIæ{1ÎN{þ#4S%ä©›k«ÅóÔØNÞ­†¤¯CNƺA!‘~Ûý1¿„âpÀÑ—j2¡Ñ lp”_ÂgeGü“~ñÂ*¶Û¢æe Ø“´(|WPv¥üy‚fÇ<‘ÞR ^œ_ŒÂF,ýÙiSùkã·ÛÔÐTÀ—y¨±”Éun¹uL(Ŀ۬C+[‰îXÇæÍMyÁoEôyÛÂb Už”‡£/{Æ•¥Zt¡h› yMJ/Jö•/ˆÐçBf!ñ98ˆWûĸiàÙ'»Á³Ë^èC ¦ìŠu?0%ËÇ3ë×¶FÐ?½@o£^‡Ð8ÅË´¢š>@ö†zz©]o–W_C«ÂsÐ%ƒ‡y…ã\W òcjâú)¡#ÛQòúø×24i9žŸ¶s9ãÅ5Y9L®šÕ„Ѐ¿ú%-âWI¸7‘ØìY')¿‚Ìö¹ç˜Õ+º èÞ£¯0f­g`ÉŒr7ei¶µ§ ˜9¶,<ûaqBRÍ…_^êòYÅõŽÃ}ÞÜ6.'í-+Miêk½Ý2÷¶#©©_§SƘ3'Q} †‚±etIk ®=ÍB]«—鹦û„µÛOjÐ|!ÓÓaƒz<ë¶Pé´=…9ר§TJÝa¶Õfæ#JYþš›æò®-–ÞÂTÝ"jFV”¯ÏÑ­ðáJëG%õ«j'µ_s³[WûˆfÎ)a™65¦’¾C³¥Zd–7kt K‹E\:`9á†ò£R5’¤OÕo Œ£Ý«HÌüxu–N?Úóì‚!󾕀”jôµ$ük@t™ í³OÑã å™ÊH°ÑÚ˜êLñ˜ø) j.Ýu;ÊÀGüNs„ÞYYÔ9רeHåyA©hÞŒL«Û+-ÀÇ[Rò‰‹Œ bêèÁQ6BäƒÓÛuŠÐÊî ”¬b‚“—n÷Ë<2Þt1]Uq—ØoYuôed_ãÖGCpñ™MŒHâ3¡®W:y8‡:ݵ¥pä8p¿£ôõ--—à€ÌŸ£–ÊLÜ¿lüäŸÅb¸‹ÿs7"‹LípÖ¼&28¦%Dü7a—Ê\ä[æùÈP…cbó_<âêÐ]sË Èç¾,£Æ?(Ùʾb|v‹LßͶv— ÞòRfj£<1ðê„Wt,‡|Jr"ì›Dwy;Œ–±-·œLÐ1ý³™Ó|Ø>\¨J˸"xÑFB ~¡¢p¤]U­#j~hQæ}Û"µÛÛ#“"2¼aŠR¾ŠÄ¨ÌTƒÐs º~5 ñQŒš0é3G{¥ˆûºÑ‰ˆb³Ûpµâ7yëUØÿEåg«ð[´®· îÉ©Áî•­?&£™$6"(Y[¡ãŠX•—ú'³‡aJ–n“&•а P UXoŒjCAx)™ÿ.Ð,ƒèªú[F«¥G©Ü&§ª*­^¶îk•ÖHЦ7#­©¶¦êÇGEÝ_Å0 ësîãeùç#0þüc•ølW7ÇœBÙq”ÕXHÚ©¬­Ï€ÅçcªsùE¢/FûН·ˆÐÄ—ä)åÝ©íƒàîìÑ.É@Á¥Á‘ Vv“wáìGª¤sᡉ\H_¤¤•‘¼©idã°¾ˆ1S}.ÛU`) fö«4À;°S®»z$ùõ´ÙD¹K—ê8éA<-ÿ&ìq›Ç;l€º- ¾ R#ÝwßhÄé0ÜغªæÈÙY—ÕÒ8¼é.ä¶}iy…Iw£‡¯Ža‰5¿EQˆ·ýâÑ;!”WÞâÿh݉2TÑê#ðÉš½æ)Z%"ãaZP×ûIÛ‡<ì£þ…}¼+D¨RTXV Zžå“àÓü2Á÷Ê®gJ”³?»3%)žÅkØŽdK™ÎcÌ ?’ëõ3g°¯9ýi€ÑÐ –ÂÌ@Û©†¹¼úñÝa9!6gÀ/I/‘šie Ð˜&÷Os¢P<ߺqÈ÷+':ÚÚÇU÷´™4AøÙtclxâ!|J·Î¢+‡ßâË\n—>ùjõY‡»w㉽²6Ñxh(pÂ}Ï I¤„¥a³‰žk½¥§ fÉ¥.¡{_ˆbØI.†B[×Wë ·ÀÄ~JÛçÒS¥ôÁûV­Ó-?o7Ùt‰dlTÛLØ_ßÓ‰6 ž5•"F¼vVÀªíü… ÝJ¨+­Æ—GE°š~,-n΄ñ֚… ¢ŸTM-óB„1RäÂ_*wløŠŠþ|Åä´P¾Ôµ±Š}€6Ó/q]á»!4µŽÐ Þw:à.CvœÁ[ÍÛXÉß ‡ø>ÿÑb¾»ØUá&ŠÆc'Ë´6‘àÔµ=)È7ßj¸Ž‡Å~çéç!{ °àq0îõèÛNü¼”÷KdÓöunýiQ¾KŠM/#¼]%ø $®uàj’x%ïU›©T³õn¤îY`¬zm¾¥ˆ-"dŒà¤¬cgYÙç®WŠÐí7˜Îæ÷r…õQ¢øÝÁª*…§ÐœwxÄv2¾¿v^ê×>õ÷[H$¯n„ƒY`<`¨KˆP¸dâ­TãhºóVA(°Vhˆ¼[‘¿L½)mÂm O’¡-¹ûžçô–—¡šU%"†Ø¿ÿ˜ê_¬ ŽH!ÄïÝçóѵµGüftðM(öȸy‡Z¦ÈJua”õÌÊžšU!(§?¹M¯²%³,V—¥è¼…+zBbTß¿šk0O¡bršjÄ Á9@â¶1©‡Ät€¶tB˜¹KÊ•» š4ù¶‚hrÆy’"¥á…pŒA°’Fàá쾫*ð—DšXÄá U\Û`úØÌŽùLOaaãjfh@nî–ýãm]Á À…{L¾ÀL;°|4ï¬PxÈé¹cx·þ3݇ÃwAws™\‡{Y¥_šr¦<.¿%Ë»O.åHö4ˆøkÒkŒó²ùp¤•hº– œ©òW8NÏhò}Žô•­ ,88·Å6ŽúE¯åJ²•ñ»:Y>¡>öôϯ~Bl•â@”o¶,p4Α)¯‹F™wuP»™åsÍu8ºF›;]–×L/–78nØjÒ.¢®>`4©‚ä§)àNqxŸpMñx–yS( Süê›çÕ&0¹½ot4iœR&¢#h³<®·*¼h§(Íü„Ö£~íI¨È¼!@±4swC±mBÈBS,œ’^q.!cIe`ÑõWÓ^ ÷¦¹O×âXØŠýHY©n£Ìí[£ù5U‡ö†*³º¹9G /UxfjÝïuÊÆŠ •ˆ—H¸JÇÃÀj»Y‹`5:L¯q# ‰µ^Œ›ƒæ’Ý>ˆEÂ&šv‹tFrR.›Àʱeà·3:N°ó#inØö›?ÿŸ€÷bAHñk§ÕF¿GË‹e};O#_¤µÉD€ÊÏægzôŠ%Ììw“Ú‰iÅøoÄ@oŽÉÇ&«ò® û]W¡}Ó39nzíeEô™[äÍ$&.’Ç€|tJööƒoÏÐÿj×âH5SÒg˜˜è 'ËøFK}žOÐ&Ú»ú³ÂXË:õ'ÀQ§ 8,£‹ÄJwkʱ¦ÌÕ“ýâm„ÁB‚-;$†¡†’ŸE4—-n§íUÄÁ£aˆ"­¸vpv'B-î¯îíÙ Týç }¾½NŸÂ‚hñtÕú_~¹¾µ¶òýuù¤@ªf©Õ’ªÖºcqÉ…„›]ÄlÖÒùbr›Eù‡®œö+Î]üöé nÛP• a L %_! vŸÚò×=­ú0צ²Ñ|yZ ùA‡;%ñ›Ø¾õE‹J˜ é ³x§‡KéÌÀC‡qgÙ©\qñ¹r€¤ð™ç\3^JJm®ˆAÀ¶HRÑ7A}ï)˜H–Q›E4à*‚ǯŸZ±©@quã;ypº*ß. "ÿÓœÀ(­Ï—c‚Nñq‹úWº²êõ|ñd-X×òý«"½˜y0DNíCˆn05ý$ÇS>°Œ–äeÞ£ø‚¢ÖØàwÀ{&Ó«¥tÑÕZBRdø %›iHÅÛo%ý¨QP’f°„æå-Tûžð Ežv˜RgЬ)¸ÝäÖõ¦?˜ëLÓÝ®Š‹é¬4ekŽpˆ½|Æç°ÖGz áÊŠ—‘Õ(N2q§â‹ej¨ŸCÒ/¢bŒ ôõƒW•"Kyý…†;2’È2BLX7P»ÌK÷ ^fÞ…"D5C*/õ?ÙîÓ`éÖÞÔ¹ˆ¼²û”%|‹Žñã€Æ[ªaTÌ ¢5 Ç‹‚Sñµ/ÂŽ¨¥'mìÖX”P+Äâ·Ã©^B¸îºÇéͺÖæzF’¼í«(±Aþðl>H^éT?š‡]è”ìzS3Œ;Ýì ¹ƒyæðÆ !qÓà±PÆ‘¥óÓ³>}’o¡ëg§`¶^ÐÖô÷ÜÔNHA˜ù‰C']ï›Ð›¾O5³Ôòÿº§g‘æðPãi·§WÀ{ Ñ äþA…V-ïz‰‰1ª'í±÷ä­Ü±_×ãˆ>þ›ÏQ¿¹uÞYÀv²c4.ŠiÉð@àPqôGŸœ·g_[uÈŲ£Js²‰†ÔÌÊ6aÿ74Yr qîªÇ0“)EŸ±·]ΔêåYjµ5¼aV¾꺡º‡ˆ°Æ’×{E†¿¥!0j—Kü CííK²¼-7̈]½'² TãÈfÐÆNP‘µûyVÀ éÜ[©´Ñ‡¥î´P‡!óË®£â4M7S‰æÖ\hõ@‡–Á@5¹tVŽÞ:Y—`!²ÌudÇ·o]úÈ÷ý÷eQ­ÃÆ}Í'f* Û¼pUú,Ì×ÍNâXªCòø¢UǘFûö}T˜/«ŸrùÊå©âßÙ€{ˆ kF„Ý” Âþ°†U‘;pœ¾Ð­xZÿ«_Þ ñâ&®”®sç6£ØiûlÔ…vo! „ø Sl ~{ΕQk%þƒ8γ)’¾Î-Š—òP§'Ÿª´äƒ(4¦éÌîÙ"þF¿áV³z§cÿèå„&­ø<¡®Åy2‡û²ù‡‘§3;îëyRV§ØkôëÔÙ;è J¾d[—#¡Èg 0µ¹St†,U€z8È8ï{îR –ºý´vM¹‹Ì xÌ>®õöܤô!#–ûÀ³k4ŒßüX'}˜ Hh .u¼1e¶‹žß’¥¿ í¦B®ô4ŸôdNÔ?ç™-šà›“«©÷ñmg/—ð1Õà7¹3Åv•ÙN»gIˆ[ij‰Mœs¨ç\Yþsõ[Ó‹÷¤Úù%=¨n`‘_ºë9‹ÌØ„üÐ#XCÛš-rEYÒgì0ëV°GÉ^V'µôd?Sâϰ¯+Q%‡Íc ·àÈÎôìžà«h†Ü²6=×õ\£ÿ«Ž^è.íÒÊœi„=ˆ¨oŽ“¹?æÇC`Ÿ4€ü‚Ñ\®Õ¨Ç\ª—iª;½ ”Æ Þä%÷ÏÅ¢¸ëjí‹Ö³þLÐ~z{’¹~"}5V³dë­u=Ôß½r3ôÚïÉ‹CCËsüÄ ÍUWš ͳqö‘·K²ÿÁG2Ðð;àU±eg_} 3t÷Z*wGèz3MSç4 °«W%]É韼•Æv GušCÖ‘JÛ 4-|Ÿ^& œŸòýIoæzâ‚ÈO!ñ=ÀƒŒ«ÞýÌÄPY‹l!ëø}g+²Zîð> áfŠß0ßš³¤y5Kmî3~¾Š%™dÑÓ Ë®E<“gWÈáöËc¬PÒq±àd§«É4­ÂŒÕµ‡¼ó%âNžÍñwºÏõ0¹b4eè]?Ì vX‰¸€dë/p ¶‚ Kƒß×F·R˜|ë# ¿ƒHÀ‡Ëq[å“¢•kAÚÀE)cñÇîæ£Ž?Gà—e¨·±”xhÙ&Ë«bçsC@ =šØË_6ÍDe%ýûA3Ëxá³ò(fìTîËÇöº,½`·á½‹í9eÌÿ—>OÈÖ¼ÉtCNGÀ߯âd*̨´žWbƒã+’“’V*Ý>AX-w-ºÖ½4|ÎÝú°¹AÀ±7ˆ U¸‰ÿþ Á@ôAŽifÛΧ…i0%GÆ€"w…¡ !BÍaL_7\VÊ)ßKz¸j%/ÏPSä/= ½Î€©ÔàŽUúI?H„8 S•«²d[Ž–¼Œ§ÿ@Ç o»%³Ë©Üå#ïåx¯M/Gü6¢‰ « endstream endobj 3516 0 obj << /Length1 1423 /Length2 1620 /Length3 0 /Length 2525 /Filter /FlateDecode >> stream xÚT TSgŒE   e«þ Röä%@h‘]‘UÑ<àAò^ÈFAP¡D¬ Ê¢(*((‘bé ‚(—¶*b‘*J«ÎK·™sfNÎyy÷Þïnÿÿ}ÏÂŒlïÎÁba ÙSHx2|CB(€ Q‰!ˆˆ ¿ -Â`ÁPúOÌá>/–G20ø‰¹€â(4:Å™A€ A.³@L@^,  ðÃPXH´ðÄø2Ÿ Â;+¶5 ¸¸8Û©Ó; l ,QÌÃ;²Y\Œ±X$û¨„ÕÊ‘ˆO'“SRRH,ž„ â]­í@ "JA°H`P- XÈôEã0à2=-~L³KfH`5#kðq­ ç. ¬ÞS=r‚Øøƒò^òßx®ªò¿©þéH>b.W °šAü€ÅC¸²N^±Ãå€~ ‡§åË€9ˆ˜÷iÔWÄÂáŽÆã¤¶§8’ Çi?"ôA¤0‡‰ˆØ jŽL»CUŠã"(ÌÄ„ˆê#ƒ'AÐ'1\fì$üC"Ä©©Á¸Š>në²1ŽJnT'` ,ÂEur¯×%–ªÉ È$á)_Qâ0Qu³4'@vW¹Ô–³ û¾³–C€Ì|oá±`µõÑl±@€ëQM|ºY[-~–Âlb_/Æ^‘•XŸÕøòŒ»IŠý@—C+-ôÅ[ñRGb>Wã!iΆIÕ&Žå,ßSêÅìHp­"0Ù&ÞùÎ)I.M¤yºzÛuç¬Ùaü”tve]{l¾U÷¿ VãÂ<ý‡‡=emkž™|aáêÙ©œéoùêeäàPr ¦É’“•5 ‡z­] ¦¶Ž®á¦¯£kþÜ~Ñ JÜš³W˯Yqý•¥_¤–âé¤^M“½—=tœ¶üœ½š(ª‹5‰¨v¦_ìl¦N%4ù»]Ô¸dwtg™åà¸ÝÑöɾµ„¢tsóOLŽÆçÊFß~Y0®úUGo Y>Ù˜óÚ¶ûf‘izÇ¢ñ¨h‡ê!j¸õÒŸßÌ|³±&Lº)ͧr˜¤©jN+sÇæÛÚ5|íL±Ök7 „'ïÕº›nú–¤\UvÌÔÅDS·ñžË–Ÿ(êæ›5-w,s×¾”kŸm×u¶èDÎ(u¾2§6‚à³¾¼ê€ŒtFêÚÏ¿Ü2Ya!y{ãøÜÜ`AtG[uîÂÒ†v›ñJË¿/S´ÍsAÂrOŽ¢Þ[ñHz³¹ò¯cs6Á–ã—MOÆ¥f~±ÇVw—ñŠ£3F#¯[Wt¼ýþuÁãžÊ·gΗ;î?ßù$â[»< ²ì‡ð‚ýÂZL=÷aOl¬ ¶ÙDÓÖQú&.;î»ëYžÕdæb‰BÁaçî1Kå’ù½?$kL}äŠÀž<Û¹mšh‡šÎù¶‰¶¿ÔïpâL€nßAz<§yŸ¶‚ùæm¨ºüó»ôÌÊÝÂ’”uFâ-¶Œö Âö_|2Zî¹YŽº ÁéšÅí6‡[Ö0GiFvלòh)-¿þ¨¸NO©Ÿ#úëAH¼¥×¯UÈׄ¤ç›5wº;Lj³ÞU7ÁN¯1ãõƒÏ Ÿ*Cúö-N¿:8a°o«©\ý¼Úk%÷Hö-yy?þÂþ„--U w• Jæž> ó:Ä<°É òˆ–yÒ† >½[·¯7ô¯êóÿj‹ 'Mš•/;dµ»áP&퀲»4”ÊêSÆö^Ó/›\‡m´WkÒ9åÇŠ’Ü!‡J·Jëåõ6§¿\ή8f&ºï1¸zª%K±MV G´öë·ë„ ìÜ™•J„ŽnÒI R,¾êÏt#Ýòo LÇê(ê[Â>Ã`ÛÞñÑvÿÜGënŸÈüe‰†…ë!ÓôQ~Á¢ mwÏ^v…´Ä¶¿a$º¬£q¤k¤vÕöЬ¼¦äSÌëÑoê6?ú¼?¢ãÔEÇ’k¨]Uv®ÉÙm;®,N_Ý×·¿4¿ðvNð⛊¿Í¹z0.ïVƒéêô ÷ÓîNt_¨CmmÎÖ•ÃN-óÆWɯ}VÃ]ÕGéL?lû‡FõSŽÁCvÒ@¾V\º¹¼gé BëËæzµ—”îFŽdƒ4ÛuýÏ„‡_øf<ìL=hc³C4g£¤›—:öÆõÐ5½E…?[?¼cåÃÛoˆ£?=Þ÷ðÞ–K¡ãþKûÝvfDœÔ¿no`ügçðM‹FÚÖ;¾:®¯‡_1® Ð0}A5¦©ûÈÓØ—S )–ê³’‡~§åmx4i’ŠÑb°Ьñì7ÙiEZ⹉c/ #e&‹G¶0Éu'ºÚn5Öp–&ßšê:¹_aÓ·QrßÙZ‹fÁ‹*¹Wg£kêÕxæNÈÔi'Ç@ƒâQUfÙ¡??¨­ºÓ±©_LÁ¶)¡V–>ÝŽs¿E„õzumæhÊ_y¯½Zsݰ°¡´-H0÷{×—2{þ¹®2~]ÐÅCûÊâQÉ€·^s†Q/–˜uwe”¤•zÒT£ef~@Q„ֲ¢³æ¶áqÑ?>>6·Ç¿fGåÉMúMª”9Ü}#ÿ,3§ç¾©­G¿ÀJäpA -‰÷U¤;vè·>7ò­‹½ã¨1Ná\.XóÝ®ÇH׎Ô>7È<ÜÈëÎ*ëYPʾì˜xå‰çn_-<÷dðraêëßE¹»I2±Æ†Ý‹ï'þ²»9êÛöÈÌßÖÅ0^EÏ9| ½Û‹êÇìòk4.®¿a¼°[ö,yïÒãÙ“Oæ­á(½Qž÷`' ˆµ¨§ÆÂE^J£˜í&š—TP!ûÒNºåŽs'¾s“¦äñ ‚í„#SÿJ1ßï endstream endobj 3518 0 obj << /Length1 2785 /Length2 24053 /Length3 0 /Length 25610 /Filter /FlateDecode >> stream xÚŒöPœéó ãî>¸»»»;—w ‚w—‚wwwnÁ%¸ÜÉîþ6Ùÿ÷UÝ[T sºûé>ýôé÷*2U &1 G3 ´£ƒ3+?@BIÀÊÊÁÌÊÊŽHE¥ r³þcF¤Òº¸‚øÿpšºm’¦nà8%G€¼»€ÀÆÍÏÆÃÏÊ `geåû_ £ ?@ÒÔdPbÈ;:]©$¼]@VÖnà2ÿû  5§°ñññ0þu ft™›:”LݬöàŠæ¦v GsÐÍû?)h­ÝÜœøYX<==™Mí]™]¬„éž 7k€:Ðèâ´üj ljü»3fD*€¦5Èõo»†£¥›§© 6ØÌ®àî@¸8@CN âtø;XñïFÀ?w`cfû7Ý?§%9üuØÔÜÜÑÞÉÔÁä`°Ù*ÒŠÌn^nŒS‹_¦v®Žàó¦¦ ;S3pÀ_ÌMÒbjSpƒÿ´çjîrrsevÙýj‘åWð-K9XH8ÚÛÜ\ñ“¹ÍÁ×îÍò÷dm=|ÿ–  Ë_MX¸;±h9€œÝr’ÿ„€Mˆ¿mV@7+++è z™[³üJ¯éíüËÉöË îÀÏ×ÉÑ ` n貂ÿ!úºšzn.î@?ß?ÿEˆll ¹À hr@ülZþÁÃwyôYÁÚc°þúû÷›!X^ŽvÞ¿Ãÿš/‹¶¸”Š’<Ãßÿëwôø2q²˜Ø¹Xl¿DÆþâ÷ß4ª¦ hüqVÎÁÒÀ÷7[ð5ý±Ç? ýg9èÿÍ¥ìV-@û[ä¬\¬æà¶ÿÏRÿëÈÿ?…ÿÊòÿ&òÿKHÚÝÎî/7í_þÿ·©=ÈÎûŸ°hÝÝÀ  ä^‡ÿªü{i•€ wûÿë•s3/‚˜ƒ•Ý¿×r•y-TAnæÖ«åo»Ö¯-³9U]A¿+&ðhþ¼Zæ¶àG‡+X’¹€àÍùoI)sG‹_+ÆÎÅ 0uq1õFŒ¸¾là]´zý%b ³ƒ£øÜžÀÒÑñ×D¹¹,b¿L#n‹øoÄ`‘øx,’¿€Eê_Äà `‘þØ,2¿;€Eö7â°ÈýFœùßÌEá7sQüÀ\”~#0åßÌEå_Ä æ¢ú¹¨ýF`.꿘‹Æoæ¢ù¹hýF`.Ú¿˜‹Îoæ¢û¹èý‹øÀ\ÞüFàs¦ÿ"6p¤©9Xj¿ýàLf¿˜¹™‹©¹-ü^²tûmçø×þ÷nýë'4ÿq“™;Úuõ? 'ç/‹½ýÀ‚c±ø‚Kþ¦Ö ð?ØØÁ)€ö¦®ÖØÀ|À²üÓÆý+³;x™ÿgáøäengjÿG5ð0,CðË? ç/ú£ ÿ†\¿ Ço²l¿ ¿ëqý wtwù£8ÀêÎÿ›0'xÚÖÞNÖ@‡?"À¶?곂oÃæž¥í|Ûv@ð(~wÊ&cojîòÇ,ØÀOh–ß œÍ¼ïøÁ×áø›8ŸãÜà”N¿ÝàdNà׸ÄÂÉöõ¿2á×rº€_ׄrÿe9þ'ø¾œìÜ]ÿ¨ ¶8ÿžñ/ätýëÑõ¯ÙÝ€fvÿáÂÁùÛñèðýãù¯™í—þx¿¹p¹íAÿ8ׯ ÇCä'q¿Gÿm Ü»«ÝäËnýwYð ŠÅÍÚøÇ€ïÖÍÓñàî@ðä=þ€`fž¨|ÚëNïý_—ÏoràL>@—¿Kýç!oîî£Û_¯aðªýÿõ£ ôš#.Î9š ÛT·Ü~#ôdÚš¦ÚÑI¡cò]tiu¿GO¤«Ìx¿ær-–8Ø…¶²%EûSt‰ôÉ÷°±>´)^­ùáí£ñ'õÉfÄ… œ¾ñ‚C±š^âWDLš¢»oŸœßjÚB7B¶ËSå8»ó¢¨æaÞzöÈxÕô–.|˜ÛQÛ­äV@z,bŠÒŠ4,ž¡Ê5ËœÅ#‡sc"F Ç8óBùy=‘=þB*ÿ‰Ñï(Š£Ð÷Í:{ôݬÏêMv×|Jü7xÄÐ?1F&©}Å÷“äqç}?®ô-x5 ’f#3&¯0¡1ï³§W‚Ô#ê»«Ðæ¦Ku~ÌýC£&P ¬› *e9[/Ça–,ñ&UŒÛäZ8ï§,䔓éÞ™¯ 7xïmsÇ—Ï|¢]®ÕË•¯F¶}Á4º_8 ÒÃwm±¿y]V&n„}à¨}wVî&>½¡Éœû±M= »ÃU%UF,ªèfk¶û•ű¦¸™}} ªŽ¦ÐýÖhGÑ£'c©œ$Má¢R¯Â`èÛEÃÉÂnü¯¢8Ö°W·ªÜÒB¼Î@[¦ÊØ]†¦0n¬×>&'ÔмͣðY‡èžŸÝ"žÜ¢ôµ+7(æìipE¦BÛ}¢&›ß H»\¢ ¶ oø®å)V»DT•>Ó\;§€oå`Å;’”Ðd|W,dÀz™‹Ï²Ùôɽ'iªp5¨þŽõS0¤LÈ C’rMR$LëÇ«‰ÝGîÄì)/™\5‡þ2´pümP%Õ\BÙü$¢";n•~VúÕVá;:²HËÝ÷æûè[‚³4XÕ1IçꘪR¹dÁLüUè4èëÏb(ò¨•̰‹=Õòcòn¥Ôݾ°?­­¿[Èø>h}ö='x­ü ¡®îë×t‘A|‘Kž¤C$ã‘XýĶK^/UAN¶YâK!·ñ[Yˆ%TdîÔÆ?w¶އ4- XPN­¬[yõä´ßµ7Éܳ¿9 •Ášói€ASÓ.§ §™~ºñ\SÞ×ÓšÊGì¾]óÖ5â² %ù;¥l=Ö/#1¾Ükx s·Ý(—lçÁ4r|¡è„LÍ)=漃tŒ¸2C ¾¦aoÄe²ZIˆ½—iQÂh>t³«°Nk'WpË©RRÚ=Üi`ŠÇ]×ïÀ;œŽFÜö à+ŒÌS³SY%˜Uú„ÞÈà§2º;ú+}aïÁóùî—š:ÃMŸÖL_„ÜÛ…\6ùÂ×>öyM¤'_!ÇœoxüfÃàÌ*Û­œZ¤d+z¼çêÁNóг5~·…2ÇBÙ@¢!½`lIåzn\´P‡Ý‹tŸ×™LÑbªb‹ÐñЛM›%r@\H´êêþ˜Œ5®S/×ÑçŽòønâ¦?€ª§¼}rÛsãû»¡ci÷ ÂøIDÎzÕ}?WÜþD—¿Ž a!É¡dÀ›ûæ}ÇÒw±4òç`·Ÿù~à ÐÄmÓŽ<µÈ=Z+ß×Îùn«`PRØ =Ìgí±aAuEÔäJG?ì{Dëuf?”ã”Û¯˜Q±.¦ÀÒß›¤Â÷䯝ųXþìδk¥R•bÏå'Ñ£ÓWdÙ,Å9áÂ,•ÈË_»É´¨ðî@¢¥hZÐ…u†‹#Gˆ€HæõU_pŒCïìÑÄ¥Ý6Ö9ƒ2{~§ðÖQ Ésn:Y}í™èS+²÷¶Òþ w@YN•Që©[)‚¨ Ûa.K&„ô9iÂ7oŠÔ-sT%¥ù ™Þ7O«úÐö_^š|Æ#¥ßÁ½Â°+½+#ï’®Â,h‹ÇèˆùíiÓŬh ,ƒðsO¿Ÿªcà4à¶6KGõC—¶ªf2ï·*ÂLxÝÂáëéj‡¡ãö_^©åT"kª¾üôʹC1Æ9=/¹¼³Ž¿oˆwÇ9 Ž4a°ó%@¸ªÝÌÅ‹ZârsÈ®©šzLúàkbÍÅê{SÆFB_ºÝ…Q£ÄÐoæðAÀwµtäU`¹ξ¶¶ÀBnËhØ4 2F… ³JÖ:ˆ±…—·lŽ$è¨ûCˆU¶Ðº(¹ôú½‚ô­f®ÙCʧ6íÀh;Z;«ŠÎÌ%³©ò¨U²†ýÒÙ¤Ùaƒ§;SN56ܯ#þ€2¾Mgí†â‘B@œ«‘íqž«EtºŠÏ§Nøòü½þ9"Å,|Ãhô³R¤ðÂ¼Ò eɶ%>J9EÐ3u¼Ø‚ᆃ·7d¨ü«i•º A…W;‡ª£*ÑbbxCâß}Ÿ²Ë£Þ«»ÕÛ™¯¥YƒÐY𨠢îÈc T<ãc§±€^§Ü_™etI òö÷øˆÉÎfs@"z3_èçx5n®º±‰¹——f¾vgÖçÌ×X`7óL`0¸•œ( ð¬‰$GªW‘zÉSÉHü·Ëxœ <½ð1ô6eV¹¤*FWöã±1ˆ²W“dên6ÎhIÄ^ÛÕcNž°™¬ðº3_º3œl-’ß_ œ1¾ó¬¤Btl®\Ëñ‚`Mq}>7€¡Ã&í5~2³Ÿ¼°z¶ÿUç¥íý³n }2“ÜÂÇ/¹ØÉã¢9“øÃ§Ôë…ÞÏÌ.â|)±ô$Ê%Øî{ÜJ-D)n>óBLØ*‡ÎD(|…Ì™Èïø1o(}O ‡´©|^)°¾Qhñü¥ëá2®íq¾%\°¯(7q«3³Úµ£ˆO°N&YBÊ$Dû Ïz½u°‡ [-~LºÐQµµgs=èeil+ù$GË*ß<ßÑ›(W¾PH“­rä#—%;~å„£×éŸý õ¤¢p–A¯3ŒˆuVC¨Ù9=1Jì|v)gØuN1«=WCúŽTøÌ^òwÈUв1‡Fuºé¥1 WYŠL¼K#Õª^… &¨%vJÓ—®€4qΣö”ׯùJ&A4¨4k”›xb*ÔSçŽô] Óô~öbë9ýZªˆ^FÜ,è…ªÞ_!ŽICjIå]>GžM+uÌ¢ÊFÒT× C¾QC•[\w£Êß~IÊèÐÿLÇÓCÝö˜c=æùº ÿ@ffÙ´ë›f÷9®Ë»™µTc‡DhyÅ\$Ú$QÄ꽜á‰4Äò:eb_麵å3#Ût³ï]?üqŽM+ó –M ´r!{}Ã0<6O×Všvó8ã¯ØR(ßaºØ‹½œ¸&buõ]^8¼Yƒ¦Om*¹rýy明e&êûÉ{ LB‚4Â×YçÝ›oG§$»¬¸HëfN!V®ª)”L“וc3éÔŠ‚Ní0 ¨v˜¯ß6ú§×òîß3ö$}c°ë÷ñþìDºa\-îS1šýáŠ]Äc¦êÇeËÏùÐn]HÓ|2^üÙ{ĤåP<+ÏE2xD„[žéWz¢Þ†þç!ÙP©åwvŽâs_â_‘&ez±ÞíׇK'¼½ºvR"µfªöÞòVÕ‹3@6$ûíxÇZe’9,4=Lrñ+®ÅËÇÝÛ Yòé2}¸[¶¤±Ôcs.å[¾R'avùfñ§Ë:Wè“ðoV´W%^ØjŒ(nÂú›¼£ñ2®½ ü¤ê”|†ÜXÔa÷öÞt :üpÁ›®kÏŠ=êâFÄêâ¦ví‡^5Æ9óz™üÕ\JÅ•0k»'ËX§áð˜ÑÍå¨u„ï>?°Ø„¬÷.æ’ù}7I89”¤Ö! (ÝžSÓm¤„“]+ÞCq“+(oyõn`–yQè\tÁ»Ì% ÍøêÈa%° ¹MåqËML–IÙ!)"YÖø;Ž‘qȲV\N_Œ@” É׉ãÏ â¡ßϸ=ß:WH+?5 'ìÛµ«9}ú@P–÷nš®ã÷̻ºÂ –(x |š×F?ù·Ý`ä«lD`y•ÕIÑ²Ê Œ5a/«9CE—ô'ØjÒ4že¡ d Æ::,l»ºÙ)J°Åëö¸F ’?Í÷8OŠlGLø°Ih0t嫲uû“¡4ØG‘8Êä“”–†‚íhϧë(Hš€ƒj;,öNÊ\ <:OÀð·tÝË ßMÃe“Ê×ß4NWrºGiùµ÷öìu_}†ÃÒL’ 'é%ý€¸#›”C˜ÑÛù<¯@µo^(UÙpDò.$¾8"gH Çv ¸œnB·FÑWû h]ªÇ´óÞ_ÃåÙÛ”  ¤ª'S2;!@ÂEdS2‰«"Ê·º6IK€x›ñI)³;¨~PRÖ&4mËÛû½×Jâ.s—ðÒÄ\eeî¸mrÅ’]uR%…àÞRÚ× `,åä¶´OºI}½HÞ–œ9„¨†,u’à lKÜ ÐÂ30Sú=‘Á–vU)Gï¥i¹™·wËÿù4V–9Y¾×lÒ{³q¥ç¹,–~kIé‡ÃEý[ä2%Ièå{4–J®“ð3¤º:ZO~×uõ z=uQFH3óT6£ýd²m§*²/ƒ£Ñ¤Æwß"öC«Ç.Þ}Ú”oðÈE©4\¡@¤\„/E]¦‘° äJ ÖÀ{"n>þÚy._Ž—ù*ÍôKmVªØ;óðvŽ:µJ´1p.õÅË&óz¾6Ë&oí <ˆ+LšhäìržÞ­W‘íÔ>æþœVí:òMȃ“ªL9s2Ý7B \°>T±…6ɬ?Ißrº½]Îëî½Bér‘´z™èŽhégîÜÍÀÕéíOö´j8›yOxÛq„¢ÅXÙæ–C· â—½ÈiS éY¦­0ªKk·=;OÀáqß_ïa’áÛ8ïñ Ê I—}c@£uì±ÐA‚<á³e„·>,åM ¬¹ÙðC¯B÷p]¤ÅK>î‡iš#ø†´5/+ºh9ôdÛ Î|˜þóɃ& ßžƒfTc«K²ydÑÎû‘''ïµÞÏ9‰šò^ûƒ:£o•2î\Æ2éð·u‹lE¨n,‘3HÏëQ#›gˆëœ«ØÊÂŒ$…ýœàv-K­ø¬)‰ï?÷BŠž*Ý™,M5Ê(\ p•Áxö6Ãl˹8ŸŠ}æ°{¿¦‡rÿеºÝ}Ñ:yz4…¡ç‚v@,ùóš?&jÉ‚^½z/æ†þú©4–‹n³É´´`°ÉzsœO¦ØýAcO!?½GS¡ÄT—rÛÓj0þ›Jþ&”W¡sP¾7ŒmÒK‹ —bq©\‡yß[k’ÊO>’›˜Zã]±žÍzQ ­O_ÞðîõŒôf°µ_ÔÙ½[vöCš¸ßŠB¼…ùrDŠ=·¶_›Ög´ÄMxÂ’å=ù`bz–‹Q4€®_9Žf2Õ6"••ßåIÐ {dJBø:×gt¡hŒ‹ág3ôuoPô!?|ǯ÷êî©Î7XøÔ‡P×èVz_”J;‘7%>—‰C {¼Ç¤NLŠ“ÔùЧ &“ÚÏT]&Iy'«íƒ®¥"MÃÍ}Féã°çžÔ†6>+›Y†0,·´}Îr$µX¬õªÅgòÒê‡Õ¨évt¬{­tÎdª`7¦î½÷jCé— ¨{ú¨«ëN]vîXÎϲi£yéóiFΊ@ÇꌭãKÿ×7…qq<ÂGt}—©²±YPMŸËÅxÈ|%?¨ ²°»=)õö_ݹî<ØòÉé^ÅYæ—dLBo¾Œ?=0`.éJ'¡ 0ÿØ ë˜è&§—_ÖàAéXÒ#©D Ú‡=µYF&¦žZÛ—ÍP¶ÖÞØŒ€±„!ô3I9w‡’Û£Zƒ@Sý#Å2^…bò çXñÉžH:Ä8ÍõÑM÷Ý;i\ mÅ9F†=Wì/2ÏëF, %εÝ0ƒ×Ö‘½¨_îîÞ|ñ –,q}ÍqÄHKÏÞWZ¶¡Ô±6ÙVj ~™Ï|ñß®kKÊϾMnjÒEõ›,–p ÀíÓØG²Ä{‚JÉKPõ€ 'ŸnQ¸ž¦û¤™S"}so°Gðtc4ML$úªãíu€¤AÏ{dY÷îµÞ§‰šL5Ž3/ІhRŽKRþR3ôãeª7ùOð,ÂC¹*/'Ä.Ú߻𽠿6µÓmžfwÖØeÞAs9¶¡éïåNH  1*S¦Á•„T)«uÊ]ÈÎŒ^Mvˆhò‹.HŸâî)¿ Ákèv®²V ~¡k¶^×™ƒ lå´l”–¬·ŽYf^¨Ñ„¢3Ò€d" qðô{bD {£Ü …=!yUyƒ¤‡¥ ¬óéš¹>ãh™2@ü¶àvüü¬·Áeƒ+íoœîÕ­•õ6‚F7®®?4XFUk[É€45xoåZø‘PÛøjPx¶ˆ^ŽÕgºÎ€Üwá”Ckɧï|Ð}[:Ãzd± ä§êÚç!:©Ø0^Ô÷Z…÷žtgV˜áÃØÎ3üë6…•+ØaÖðÎýH…-®ŽÈL¢qˆ Ð2<1[äåoÕ&B¡vKïwo.|\߆¼÷ËïQœ­ÕÀ /ä°,µo)îã8™;Ó@bïÂÿ4§_cQ¿ÿ(Ÿa°RƒCRNtc~´„ðx‡únح͆m²/]lÏå9»¢c²âDÞ£‹Qô-ä«‹ÚñDíï±±ˆ)éjÁµú+ßµ:uù‰`Þ/-‹˜3\S­W½:Vn^×àâûpÔYUšEÞ=דQcµ¯yвºmdV¢Ó‹·L[MO ˆô„ûr»O‡¿b„¥LæRÞ­çS(Xø×%Y@ÌBN‚Є%,БÉÉíc0lw:òž¡ÀI@?¨À„?¿ªS¨±£1Z!V*CÔƒÓ³r[315"uʾ0!«ÊÓ‰[Ir¬·­3ÈT-=ˆ!¥ôiÞ0m@üãf6%„á9;• Zãî¦ÿ.´µÑÉÖÁÈÑ×wùýKý¾ENž“ÁÄ {ÐRG>—øQ-_Ÿa?n ÃK!Uã­cœÀuš€5M'µBeuýâðÇ‚'îRf‹¾rQ²½ùä}1#‚ Ü=¤Š‰z*·•‘¹fØ] †NdýÌ\òákÛ1Yq ³iVDR™;$)èR’Tåä)é쎫m ÇÛ;ë^ÉoH‰zY5‡ÍÄ‘€mÆk} jäWßz³!@ÙoŸŸ/µnkA)8™"(*Â6H*Ã6KçÄ£ŒO2ä›ã%ö‰“")‰dmNóÎNêfG&¯Q§—ºá’#4·Dm ˜LìÔ"UyuÚ‰áÄú="ëS ÞÔд¶Ö±'=Á¬èÛ“ÐòÁLþ Ì|Óü|E¹¨SGí‰Nû¾>P4òSË2Š|ýOï6Q…<.ÆöÌꟀÂHS6òÍõ]TÉèöª¸¸Ó™k”ða£Åëȉšã™í#IuØî)sóèX“¦ì=„ZPõ~ýžÁI“ÅhÈiŸ éc~ø°s–˜ß\÷+rRž³/KWÁ•z .˜l~^ç¡CùRfܽøš5KnâòtáMP³ecJå*WÛéºÁþ±Û‰¿¶òP õ aLþ3Öf5‡vú öœTÄ–‡Ô.Ÿù×Úø—íéžwÚÚëZa¿¬žz`kdkOùõÜŠÃÙ}°•£Íí55ÁÌ1å~ëÔÈu¤XÈõñå0>Åpz£ôd‘ãÍ¥­~ýóñVÁ]Ð+§d{êwšk‰æ²aÌàYjeÇ> Æ‚Ùñ"át'7}O¥ÐÔª ‚aÿº ËU9BÇ*¯¾¹†ÛÏã?×±Hm—ëo0Æâ¿lFo¶ï}5¼iTCzÉ3±ì¥¡r«ZÆÖ«ý”.æè‚ rÍ'fvõš(s¸Ãiùtê /[Mªþ1YŽé„yDèŽg&OÔÊ›Qʺ""P[{º’IJÌáë5W€¾’Ý1cjÊgbÛÈŠ×)71@Îp‚Åèº"Êâ$¥sƒ‹Eu¡͸óòÐ ¤€óÚ>ÏLÁ>°Z[SêÕ‹50~Jz¾7n§K†É.-Žù†4¼Oõí¹t¸0À=^ÿ£”Ê.ÿêÖP*‹t²> ÿ&˜¿Áú@ñ­P“n GÖçØ0ÁÆó¥:¾ò¼Öq]á‡^íÜÿm?Jù¼X´jc+ É¥!ùï(kÁ÷Άì]ßåh”T>œ=Ø}Ç‘°”Ÿx¨é<Æ.:ë¹}Fœoh„¥”C“5q6¶½lªìnäw›æ9u´f9à!EO! ^ãÁ&º^EÐ.,Ïáã·“5¿GaÆ5Åñ÷âE—âðžô¦šÖh¶â2j“h_oß¹Îcâœû4v²pÏ35¬êÉú«smËÇiãkPjy!(¶¼Ógþ¹ªŽxW 0¯˜ÐG:[<Ò– ïÝçÑíäCñ—Ýó¿’ã Ø1é:kg|iw¬+öúi¥ö|ò-&DLJ^mlµÁò¿iúªa¢½@ì|‰¯+‚Ìz7¸B)ú²”“Ó¦$%fYÊzªjLéHVι¬òõ”dðó¹&Ô?¹Í 2›yçØ‚ëxK¼Uè­ÄG ÔK( ©¸»ÉOd’xñÙ#ºê"®©$vWö–»hQq "ÝN^¨t–ìfâQ½ìh¯Ê Ýùço¶ø’öò-}«ÑòÐë]òÐõYx ±•ÑG¥D†eaõWèy3ÊF·åZ¾oû4ÅU«{Úß:ô–ÈK‹o}\ñö K0-ݰçÈŒ<¼¨>ÇñâÉ÷»hÝÏ·ñ4ˆÃ2¾ù˜Uù äI:ðÔ]ȱ­"6¨”=½Àœ4cíïÍÝóº#~¸QÙfHJl.í'5àfOwÔ’Ï%Ã:HIÑ«UÜ:ÿa*²d?NÜ-Ô¯k›4['‘îxÖq’ý1^ó1"ämL+Ev}®lèrMÀqç”-;7Ö.Á ©Õ’©é@äÀ A;§¯<¯úV“Ã2 ÜdŠd€<ßáÀYXcäü¢Ç ¤Il½:|7ådï¤_? ¦îûˆöþþ‚v¥ë¹õ,/· ç)Þ L[ïz’–óÿÝÛ÷RÅÚíߘf7kbûÒ*¹$4ð…ñ™ey@›iÄ´…0ÕS+L­‚šOpxF7ù4sO»¯{Ðöšõ×ô´“møv¯e/¬¡æ<Žœ˜ë¼™ r‚U¤ä_ª3ŽõªÍȹâkRq 'ýºM]nïïÅð+ƒ¶o€ÆôúˆðÇÃø*®tÁÓæª¿t«§àâH2°ßŠöÈ1(;q^™ihöDožE:g õºxÇø×Èmú“€áš“v»ºø9±'yÍQùÛϺþY1ZÓ]¶k>¨·nâÙ¾þÑœŽ;]-'B(¢½Oí…ÚšÂeb´ÆáK/æoŠcs ªŒ–EOQýì|ÔÜÕd8ü¼ÕÓˈ¨Ý`hÔ;ø^²t_± çí>вÞfÎàÐ2åÕJ™÷CSU¸¤¶‹Ûst•=Õææd§ç"Cè<”@Ú_ d¿£x+ge¾r¨Å_·M|x™Ð%äè·ã—¢Þõdß:;úSX|×Î0×Uó½5 x¢¥BêŽ6ï<‡Œ×>#eö$ͯšI·½~/žjNï•­âO@TŽÄާ µç–æ ìc†Q¿´ŸXZp”lñA¸×!‘°ZÅí¾p²yÂêò‡mtï…(ˆu:E€ŽÞ#¨m Jæ4#ZuÿoæÝÜI•¾ÅI¦­”2ðâî7£I]ãŠ|œE‰»ˆÏGÑ9WÁ#òé\`æÁ,bæGÆÁ†æŽlÄžpLOªJuK¥‘OºYÍÁô.×2Ù“–ž5I­7=V= ôÔ6§QQ3ê|"àI´ÿYc`k7Xg©~&ß“yׂV™ç:¥3 Üð;XÊ"]o6¹H±VöÊj]^Š›qjïx.|á½i‚M…7ºCX1)¶¸è’H(ëb‡á3tC~^¼Y‹e©õ öb ¦qM^ÚÅÑ#*ç%RÖàÌÖ×DñS˜Ð.ZœoŽ’#…€’´D©¯õ(ÊF'½¤ø„Á6èµü-5´ýÀæ ~ÇêšõîcÃ…âø-^?«³@ÊGÙû6"ÚÙI¿ÛõHt÷îp²éÌVÿ«b ­öšŸ¥4“(g2ŠAŒc©ÏÙ'oS¨†|È`YhÇ8yÅŒ†?vÂÐÛCe‡È¬Q„ü}^7Ç%-m(^X7QéuTëDºâÇ×Nœ¡Ü'¦«ÖˆEki`ÃLä|¡êÝ-Ô¯Cø¦Iߟas–ú†¡ý½Ú—b¥Á•ÓÇ·ÔìK‡W&„SÏ JÝt)ÖuhìC“÷#½‰Æ‡J˜IÎ%¹¾èh: ×~/ýsâoðÍ—o±ç°ÎòCÒ#Vz š®€Zp}pÃJ¥?jÐv†è´RmÄž§qÝõ6|©ç½ÌZg5X†Ó×úHV}âY)mgýÃᢈâ¯ÅšÜ¸@—¢ÛEïØ8¢àTf[=J#×8ÛV…Ê×LHÞÕÇ}t~?r M¢GúQ“¢¢YU$ÝG¨…Ãý(?ÈÍøez nHÜm&»li\ þ;ë0Î,óD¦wÂ;)fQW½¥Å!?àýô¾‹GÍZ8·»…¶î“é vIÌ/rŸÈ½VAý˜\ü¹™©¡ÍÓ+ÞÖ7ý`ßS³¶ÄLtšN¢3u†"ö®UÃÆ ×qO Ÿ°‘0ùFÞ]Ç´Á$‹£ã­øÝãL†<óì1Zc(ú…a=ún.W뮦#ý\`ƒÅg1›KR5ËÄÜgá¾mÆ#¾.ãCF èò‘YŸ"ê:–…b’eÕ\š“û låÇ í£ èÂj•´‡š<Þú¥Ø$Em7tÜ:ñ’ÒÇÂ=íÒvý!mrªÐ³Mëú$ÙµVõŽ2â.~hg’CÓÀªHΠ›Š¦9äçZ5.êEˆõLˆ­/+Ê^ ‰–tk[KÊXq?a\qPíjaÉD©ð&/‡é2l?]ʆ1Ü©ëºC¿pæË‚>Ì.fƒÑ¡…}6숗W=Ù*›”¾1´¡Ìæ'£DöhÇLqn;k}‚é®ÙÖ§¢Aâ¶µè»Ã—ôa*œif(½|:ý¨s!Ñ>Q7÷‚ç{©ê7»šO@š[(•bÑÞ}«v¦”l›‡USa’rmf>UÞoÏÞ}óTmJÂ9ò†uUG,Á÷ p=’ â, ¾óP ì- ©- Ïm饂¨å;°ß7ddmO‘JïÅìçµ3- 0ö !´Hª{]†[$T_c„çÎ9E–Å_jT?ÛÖÌ+Ù°šavå„|Þü8Œ uil“zDœÞÇð­X©Ž*Ua†A¹©] F6B™Fö-6#(¼™ñ]"–‰Ñq²Ú¨VÒ¦yŽíDćü ºµu!ÈPG2`ӵ׸Ó˜]F¢vÆö~PNÖ*+ÏVœ„p'Ý,hÿB7(ô`x’)(?´Pñ‚(þòD[Çwàõ6ͽ¥VXgòë{ˆEÂÉ<änõ’7͆WâF |óŸ‡^äy8Ÿ Få´ü³×,¬dÊv¿ ~s¸á)Ç&Ö|ˆ¿F|qãèá–Zò¦0U…Áƒ»C1¨+ÍEÎC5Šê,§º„˜à‡i$($JÈéê”ÀaŽùùLÍ0H •““pTZàÕµ]b€mR‡ wJ¿ÙÞ§A·ßs»ŸvùŠþU™4CÉ-_=ˆØ¿+§ ÈaŒ‰ïŠN m[WL"[õ˜ƒûG€÷L"Ý'‰:gµ@ï³àtƼʯr8Ö“Ñ} …¨¢Ñ¾$žË†Q7ÉÍ”c0Ž„¸_éºÇp¿ùQµ ÏPÒå\²º cp3™CѾª\€Íóe…†ÄÎÅÐ:…žoS’C3°s»¤ ›¢ô¶Ð,»¸°ÜÇÆV逎àóÏ«{'À‹x1°Ï”,oŸ•ô©ŽL»JáušK]FzèÅWî¸~]—Ñ6Õõ5vXˆ;³@+ñÌ…všEZ£µèw[ì|-9ë7:ñþÜ…‹ŽƒûÙ‚ÝKK•¥áfú©cï Å'aYw–Ìõ†ÃV '©‹P§³d_ìWâÇJ† û5h\Û¾ÞÂ]Ì&vÒ:Æ$qx]A­ñ¨º`µBe¸“BhÉŽ»9«âȃ4ẙG.™º×oìÃOéN÷]F¶£Õ˜3âÞQÖ92´ ûÌ ¸æK¼4v䊣[a8Îbq§‡Q$¶`ípJEÒQ„CqsÝ| ÇEu‰DEıZ8¥ìåÖ»Gò’Çí""t1à¬q]¶Ðzm·Tì u‚qk[ 2‚^Eµi3Ú$¬{ÙüZÐÍÐ’êŽË50[5‚þô))ì|!q‡sÏÙÕ¹dpÁÍX JÊ—¬á‹|g#{þt«\»p‘ægQò§7­ìÎNAß#RW:µÛBŒÇ+¥ZA }3hw;¶ž ´ûäWGÐ5¦(x._Ð1%VµVâ›Sª‘£¿•¼S·#$]2æÉ·!a}¬uæ.ÅSɲ—fÖ ,™nê­ÁW9_ù`ýA±L}ܹºn@ÄÖ¹ðçÔ4­øµžîºá6ÔÄ6‚BfÍL‡ÿsKsYãÛ™zÛÛ±DP#ã¦$é 3¿1W †ñ”Ç+ƒ‡d? 9ø`(BÐO]Ùº%ÔñØ•õs‰Þ[tO¥ÅQ$—öYñС{ ƒ¬l-R¸f“Å`|#¤ÒqÑÍöÆ/ÔŽÓo¶ƒ¬M£“]¦ÝÃàu:”ÎÔŸ™ÝW'qáìm†™Ð«]í¯ö”âGé.Y Àü,¦‚¾ŸµW8œZ´_¿Æm\±Ñ3LyhÄψ…ë’l–„“°êPv÷r÷Ãò$¥'ºcÞ Ò\v°ñ§e²l˜Îu±¿¾ ¸&[(¯C+:9$÷ÜÇÿùÇ8»éQêúºhfö‘¾ÈH%œL‚ɧT†š!É]b¦z¶.…N–™›ÐeBÙ®±$î ßoÐì§x~ÓhΪ3)Õéûð'g¶Œ/aÈðԨ깭Ä'"Ó235ƒOoÏ”8•òΊ'Æ$ÖAN«ïßßT 4´Ý,§ˆ––®îüØì—ù_¹óyçD¶éö½wÐØ˜ºÃè í•G/»˜–¨öÍålU± 5ÁYçsb¨b¹õûYo]™ðÉí\6tÔz#¼¾Ÿ8¡¼ýÇaþ$!°òRW[6PE¾€y…iéâú°N„ž]›õ!=*­I5OŽªÙÃ&‡¶$‘dÜÑ}Zqé¶‹š&8¶úõˆâ{ªACK)ŸgYüå”á7vW*2GÓ vŽKµzQ¼±]žðG‡šžÚ 3ïËíª…!t:^! /U´‰Bü’¡­9˜hÞ-TÊVuouò„$À¯ðô¦™QTܤÄÝã37í•lKµ4ƒ$3ϹÏVµ]­EFO3ÑØ?±=—a?íNV þ´©8Bhxí+0³¼èo‡‘õC-×5é½ß‡A#f®@ŒõÝpKÁ}g¥-c¸zsJBäH<ò<\J>}ïˈ¶ÙtǰTëïaoêÔÌnSØ Bð*‰íËèvéÃYÍ»an ¸ö›átëô»ry2šÇ!Éi9dýx>òͳlçQ•ΜŠîÍs)äàóbœ‰Â‘rÖn­2Íê ˆ÷ì¿¢¥à$§d÷ãðüÉÆç±~2ˆL®º Á_•ˆÛ|”Õ«< 9ØÍh9†—)YÍ–•?í®S½PÝ@FY$ª˜W0­Ñùú“ŸÃöÌ5ýÔÙ55¸J;ªúªÝáuÍ'”ôNóÈw¹ú̾ІnÀ÷Oª£ðf–5^_aÍÚ>~¦™aµ{¡‡‘J¼¶¼rª‰¤GráßMÇ)*ݰKˆŒÞa£ Û~öGˆ^{{SÀˆ‘³éþí¾¿R0ï‰Ë½DÇðFÊl3¦Æs¦Uß,Ã6V`q™OC™¢T'°@!oÑþq;bá%æ°ÊgñM$.Ê"5a3¼‹CDùšËÿ‘',«I:¸’ŒMÜcoDq.Nlü½äþhLÝmÓ´0ã2qu®$=ù6+§y&ÅNéö ’„ÀªÖªIüà¸S­ë#D­‰Ñ˜^-ÆËÖ3á°Â4š6÷Ôw`oàiMu£¬deJÒâ¤ôGu2.ÀƒšìðnªiÓüVÉÖ×ü¶*§ÙW3ݾÃïxÒð ±+…A¨.ï(Ï‚`ªuäã>Ð)×Q´<ÍAG ²™R+agf%eñDŠÌhýÒó‰Z§o<§uGÔÄÈÉë”RÛ›¿ˆS7ý`™Œ{‰†˜ŒäëwmQ“Ö¶"b”gXœïþ‡³Ë}V:)Jcýc&ŽÖ¿l ˜5—ÓdÇgÆ,Y½Ö-¨} ýªý" Qw4—÷b¬Ñ@ ™c~(åäL¥ŸŒ»å á#í †s«Š£\§¼ßÑmsßÊ-'YN Éë¼<«§¨C ÷Ö†Åz-ì:͇HG¦Gâ%c—3¨ônÓŠ_Œ[!Ì `ëj÷éçÔ»lñLÐÙJm4cSŽüÒ¨ÁñFôwJyåS•ž¯‚)!¤-›9ý¸œ3}³/hž¬×¸›è¯ˆËà"·¡0Ej’Ù%póqFQ-=çÄÐCXñ˜D¹ºâá´GQ:/¨7Œ .j¢æçÉß'¿‰n¿d:£.h Á¶÷nûX«q:Ê£”Ê‹} IN vIÏiš«þH‰3ˆ<æzÓZ&IÀWí–2e±“›ªÞ¿ÜžÀB²Y™÷S(÷ó DÁi„í³ÞöÐÛw§LA›äÙ–Ë+O§Ù;ÁÞ8‘:Nv> òXŒ)±Îa,š©zZ¢—?—“ñ¸Và–.ÅÆÕycEb'b²2_ÚK|$$-Îcñ…К?˜Ì#$ЬÿÔ¢÷,õs27èðŸ÷§²‡›Ôè\ý2²“áºþBf d&(ð¼¡Ä œþ‘3P˜&,ÎYDÛ'ô]è3OoˆñÃT“.`‡ýhøŒÛÉý;@1ÀÙ0¸µyÅžcµ?Ξ[cüHN\.Â_³½O•€‹„‚ÑnfK nú ( F“ˆ8‹U£âƒÓ}Î?$¹²DlvÑS3?âcÏ7.~WŽ9ŸÀ7ä÷0‘ͶTóµ“R~”Í`Yô•SC\ËNC5?¶ðƒ<ºô Dez§Õmùø¢M¦º•J}g©êþCøÇù´awk üU˜) ¥wSœýSÏ­òû(vÞ÷±·…ƒ xÖ¥3dIBüÇuä=FÉæ¯n$Vù*‘ˆ ŒÞW7Ä;ã¡ÛYï"v>û]®4 –-¦äÄØ¯e½ÑI˜` 'Žwo¢J µ5⢖oNÀ¨IºAⵄ1šê“èxaþ:—Â+Éß¡g5e~|³@Bb‘Žde0J‰í¬…wR#7Ê^ A±VS!Aæß¸ÎVÿÉp,àÝ=6L%„#§E5v‚ué{—ã{b„¾_dr)”Ûé,â“sâ2÷¤æzÈ]’RNü1mÔ‰QX»Ñ¹VªPým,7óùûÕŠ¬í¶D’]z(¾ÖXÞGÜÕÇ,ƒ‰¶¨øG§vŒ_nÍh–&MªL’9JƃšŒÏ)=›+ûëJ7œìÖI_ÏIÍ1KI“°ÚõýÌ~ˆÀ—8¹š2TÑM tŒèwÝ|bú¾ªnÄòIÀ?—³1÷+¡p¥ÙÊ©·lˆ'Ø)‡<íÆ¤Çz[ŒøÙfD÷Aßž,<ÓpÉÊÔ ñGy¶qÊ{èu7 =ny6ôÄìV™ª[ì&ãñª oÓK‹Éëêª7p‡X§™–9&7 Í"_>Ž ÅWº‡ÀŸu}5Ÿ+KÊ.`Ïoƒû©‰¬x|`»«ã%t+;ѼíŠ:1»Ø^q«º¼¬ÄÏiK½èRŸ;7æðÞ±«P:.õT‘7± TôíÌ=åx¾ZÚ$|1æ1JTÞ J]üi§wèÖ®ÎÎd¦{‡Œ‚»,0%"=µÐÎ9)”€Ç1ÜÆ½«ÔUä*êtS˜òå¥êÖwNü‰gD5øõ£rPJ¥ý¦eñw:˜éŽlÕØþ̓Õ,¶ÓÓ³R/´AŸ#G¿Ë¶œ°ákÒ´ÁðtŽ;|ˆ€þø2¨Ô™ê6æ¦Ñg1Ã%.É:r1àþn¯R÷D2¢™r£öÀá•z~O錮êçç6ž/!î©’as–Sk§ïÇõvY†Olµž ®¡áá”ì ”‰0°ßΗ½vÓž¨ûÉFu0m®H½%¬¡Ôìçm™­©ø°>»UR¬v(2¾h!qaíu'ß<ý‚‚¸*EÅä!Áyî Ùùî6j–r¢ÂLñ›ìiù‰]Ò/ÄpNSéÓ*8½LÈ/(þ¸yÍvb{„pAŸrÞ ;ö¦o~Û”viö*[€úÝ]â¤:HhüÈÒ¦$¨Ç~‹Ú°ÈD 5À£{.²ôNäõ­Ý;fÖ„¬ŠOºTðjYeÜY†kg”ú~]úåÊš_°úkñöÒ·BïcŸØÖͦ+ÙÒ¾ÝË”Iî3ƒ)É«º9k˜6ú²Q Üá–9{"£ŒXz]Êæ ÁÓtCÙvðHlaÊ#ÒcäœëÊÏëÈyöš±ö莽íÈî…xܨÉP͵šÍÏU”} ßl…¾f,ý¨1Ï|è}_îw k Œà×ï øŠš¼ÎxY9‡dÖmž€Ñî«!±“]-yî‘lJÿÆeØX³é§Wúä;K ßPþ„j.©A^;NPG¶ #Åv÷Þ¬íÅn` uçY¹ ?1ÐDÈ{7ZcP‘§dÑ ½}ê_…i²VŽ?öá]Á¬Ñý®ÉL["‰ „C Q²yÈV‡z/¼°•BW‰Þ•OÄÅ8ûá£Ðón’ìy¢¤AF D)o ûtG½L‡®X‡UÔá´¸:!ÐA/zw½<æû=§›9 Â÷i‹…_²‡Âw¼mtÓ³Šý´dD™$¢ÂïE£ó/IŠê# “KN¢%$`,å lD=Ði.(ìAœ/†‘ñÆK'ÕcÙ+uƒÏV&é±Í¢Íg²ªñGªR™˜¢´ÌªZ±”YÚ6”afû\-Â]‡º‚#†µ}ÕQëBç`êQØäE×>…~¡o‚K¸™Ëí–²r-ôÍgÜ8hËùÎ:á®y}›ãôN—A{³ºšÜX&t3tÆ%,™Òí“1ÉBdûÖH+²Â§ yÜ“öA+NV˜ ñùN鯈“}—Þa”9^«èáõQ´Z©gô+3ç£{´Æ›>¶KF]®®?°Ñ×m>F¹¸‰o]ÁáÚ…xúÛŠLZV^ñ÷ÍXSî‹&H˜:\mý Ó„@7ŽÆ”®·ì—Ü8X× ;·ÎÚ¤¦"ŒÑ¯±¤Ò&ô}kù4üIeþjnê³Ýȱåð%<Ü’x3.û+!Jz«CFíxGšÚk$4i‚ÇÅj=Jƒ¤Çh5„³»mìÿ'$"ÛÝo¹àÏRôǯ#%Y­‡¥ Ðh®—µ61jP>jT˜ü*þkQïâžFŒ²]ÿ³•šD_hµA»ƒ—òh£–¦üÚK;Á ضs"Cò÷3zÅö±¤ˆº²Í·UŸÐ?±ë’gWŒ{˜ÚKÊFmºP³þCWO°ü¡ÒW@C.…9#X`áÞ(dÀªFGíkÓù^rœ4lÕÒ±ëÛ9_û™óóž¥-±Îi‡9fCS_hÖ×!@~W*øºP‡ùøó øK!ˆœañJÝmü˜h6élÃÉ…w>Qúh”·t LÞ’Þ;4oµ£±qîÙ!ÍÝc­”xÆØhâךÜ@žY({áÀû§¢e+¼Ð̲ÓHßÜ"Ì(AÈ…?´‡ˆyÆ}øBšª¨å]òY"–üè—Yþе&d‡qqC&;ñ¡6‚ ùJò<,¼ÑÖåñ/ÿˆSà5 ZÖá…ŸÔd(Å‘ôÒ„=+?FHxÁUK´ž. ÁÂÇ ¹•4ñIŽb|§y#M2®Æ°ì¿¯û~Y!£%”GÈ;õæ6äù’­ Á¨8f¢h.a_|r—{,ò 4ªÎÆ7™‹Ï¯ÿî¬Ï©Ü4ª 3 ê³;š´‘˜¼‹Œq¶Qwˆ ð=8¦Œc6XÞ1³J¼’õrVà˜le2R,^C[ É\¼__i-×$F=Ð|&ÿi…m¤¶ŽNêàÃâ!»çaÐk±`G8ÅÜq«¿ïÞ:s¸Æ eau†²²}$ :³Ë_hšôÁ¾óQìa´Ä`Öyúÿ[=¶§O"JéCRq‰0§ û/¹,9••ÆNÓõªƒ—wèùÉ’²pm‡á§÷ò:AXÚ‡•kK =ô3ƒ¸ÿÆ›w¯£é;b¨ô“¯‹ÑÁ¦í@¢ƒýÅS{ãšOÿ‹H •˜İ 2y(³½´š·™œUø7y0F>/)Êe¬•êš+ãÕ7q¨ÜÝeäÕ!>ažs?€ë:Vÿov(|uM;Öï+tCŒH¥ ÈëEˆ®1È» Xq"d2ÒWo1 ß'{ЫÎy"ÿ]ì¡•‹DŒüÑEc“^ /AxÇœ Œ¥†=’lSô÷Ë‹)BVk¥ÅÃLΉ¾Ü'@YÙ±M÷¨†v0ö¿Þ?ëV—@õËú+ä\ØÜÕÉèì¶žz]1rnd–WÊ W‡ÆÝ@X‘7ŠTÞî§-Kt*}¸b=5heyÅÅ™¶.r°@È×+ž¢w³l†g½( ©öÉŒ^_~ó•fO•"l°„Å)yÖFgœpÜ ö¶ÀÊ\•ø˜ÍšxrèMùé³ø4¯ð·Ðús£ øÁàýŸ98ò¦#‘b ».&þ$¥fÜØA§G)E*ÃØÑߌlJŽ$ÿÓ™WvÈZÒ=ìºñü¡jØÍäP ÎäX‰ëzh¥>ÇK¼ó½,£ËZà À„QО_P°Ëš…¦VðGyÄŽš+@Ë®VkÿKoæzÖ¿äk9§•,me[²©©.Š4ò:è¯ÏVº+lâèEƒ¸o‰hòEåAw9™ü‰k¦D9Ó¦Ä X@\¶[¢–ͲÜQVKìïoÚó̇1fîÂ5°¨Ä7›zÚœ†Ý]9Ðò—š=žœÌ9<¼¡ƒž_Epú+geÉòô¨×ªä¨©töx¨ %¿~+ #Hhv…eÏa'ðˈ¦“Ê FÐ'/¤Ç^ƒ @äÅÁô`â}+“ªTÜ‚Yt"A¼…LùÏ(|é´Fo¨ôt ýuö¥:mÞ;ëߟƒ¹3>_ŸtìÚT·š\«Š¼OÅ–‰Â¯9 Rec¾¹ÂI(A ëÞ^›5.í5Mh¿æèN°˜Ù0’,Ã]þSM¼XTW]9ð˜ø 5‡û‰ôuéRzü¡Ž.ºBlŽ÷÷™0äCUf:ÆU²ÅÌÁ—xI„„#ÃTQ¯h!èHþ{HûRô)ëÃy8¶÷è¾Ì» #½xm0áÚQgª3‡äi·|[‚úW¸ÿ5ýŸ:ï üžmÐ Õ 0ñ‹ƒØ® þ µºq…tI=`Vóˆ)!l%ŠM¹Ã‰Bf6ÿN ‚MŸv²Ü§6ºÚ'0Yoȼû0äæ­K²å–ëæ”­·­÷K]¦‘‡#Ù’ý@àF”a Ý=ŠWŠ0¸>•” ¾í˜T…ì ®–Í\GÂEÒà0âÀŸÑ±_aùõ¬bHù“oègOÇÍÏý«Æ±˜£b¨Åõœ\"*^ôœ¼ò*t;L¿Wîr<¡ÁЊvÓØ” %ÐZù›çAƒïÕ‹›o™õ×»œ_ŽÛ¤Y}°#ÈsYZˆ£ êâʇë’]þ1 ×­ÜlVä”­^ÄMΞè›n‚©r°è6 ¥rxAn­©Š¤aÆ£DØœ ›— 9•3PÖÍ^À€öíù':/Ÿö0w½0ÂU5[÷Ø»‹8,V•üÆ™S„ ˆŠ–1@Ü× °'—t£•¢ø £¦î®ÇbhÉá•nñ`Ïw1:Â/>ºÎçlãPõð‡/<õ^¡R”q&3¨„ô`Rf+*ÿ\/èaw a[›!_=w¬dž§ ÊÀ=ÁEœ­â$¹KN@7R XÜRkQx88H§ð…½+å {±7ϑÌ »f]gÞÔsºÛ.×'ü„×dþéKHV¥-`BcŠ(“û:Â6žÔμ:êÀûc¿:S78@^›z¶:$ÙP&Ök<¬«YÔ°18R›ý‹Ñjø…Ø+dã„öœ [ËX£mo«X[*yob®Ëà¥Y4ûéè3~BËãå&[yspê=mìåï„ðˆ}àð1Só/Jotçº ÍB’ùDb61NØÈ \|šÞŒg¶¢‹€\ƒ¨'µÖwV_PBcÝ‘vZg~ú: u÷µèkJyš¹ŠèVPÝAØ@B{ÔE-qOCÍ{Û|¤¡ü:é‰;Rm¨Iù;Æ}_3½›9˜ ¼RSë\$Ý(¼ßßzY§¶:¶ÃëÆ3ÀiáÑ¡Ä÷CG$á–±„!”¿¹I„ƒ…{{iOTD—m”—¡e©KÍ«^a]Õ¦«âýòЋ63G¡.T úÍZ#¹Ý¯pßÖj$wáÐUm zÞØ|™`‘ub&åB q¥cÌ N‘žƒÿµ‰Œ$£ÖØ@ÐHÝ*gà­Ï¢¯±Ð: ‘?±'‚J#_·m­xp*jÕÓl>€´h¨ÑšÝF×y¹¼ª?…0m÷× ?¨¾ìLÁ.×ß@«ʈÿ¥ßoWi ¬÷ùáY\¬dÑKê\×hJÍçŽ?H!Ò<|}EÀ¸Ö@®Ú>;!ˆÌ¾Š—,¸ÝïaC¥}øÞ[ìÜÓ:ó i0VðÆY3­Ï$- ºã9aÈp屢—Zµ!*¤ØÞÞkÜ÷jˆÏ·5ƒ{™ÆÔ:ô9Ù¶)Rµá{/oê gâÆŽJp2&yù_7'à–tÆò¾_4Ù·'§X©„œ.¨…•în {Ã<É›øööI¿OK›*©9—ñÂáÔ ÷¨”Lîç d›´ƒ€[`âUð¿­ÚÀ‡£Ë®ú±ò.œƒ“dÞp{°q™Œ.m °Æ„ѦFçWð(©s#Ó‡ú¿±+Ê ÅGÒaqŽ® Îüý31L2~ð€F¶VïíbÞfþwA½Fvå*ŸŽ•0~ Œ\C@¸“ü ŠlŸVxÎ%N9µÝ!§ÔþÊå”ÙIý®uüÞÿ?¨\ 7&ê<ùK_¸?°E±õþgÚø=_-Ìü-2†£Ÿk0ð“YÒ•øø8ðGëIåˬ6Áµð&;4ΣÙÚŸˆðlüïîúÒ†ª6ëO¥ì Ü+_`lDóøèžïû­ž]¾ïäX~,û‰¦–oU߯iÚf:uýÖsæ Ü(¯ÇûÜy³õ’9ŒÐ`¹¤5 OÛ⮆c•xÚ9å`¹Çnu>qÙÐ WϰsˆØJZ G&å4J, -…ìZ6ú%!ÏbQ¥h™gQ*ÈàhÀïãˆMðGÁ—"FðÂ÷âk Kú$BIz£•v¹A7<˜' °Y’/ÿ~ÛH…BúûŸ2ä£>ý5¦ça"ƒŠ‡*ÿŠí©ýªVж´UbKû»¢ËôôO}ïV¸fàIo×;‰‘Els¥x¥Î¢Œ…WÕ^%¾šš·‰‚Õ^hñ½s%@ñ7qQÐòµeLZ®îkÃÑÉPTʵ;½Ÿ¿ñRйŽ; ’Ft¦Á$d×:†±•¯IÑÑusÔŽ?Ï,ã æ8r/¼š¿çg‰Ÿ‡£–yþ_Ðn É„üfúÊq(˜dǯ!°K¤³“ýùÑŽ™zãÝ·•pg+õ O¯$Ä'‹èó¢^ÍcëñôüHöã®j^'›Á±<ñÚ‰žŠ.ê&@'¨¤?ÙHÒ ztf㢑8¢ìô. 8"¨O‡7»åhöÙïÏÂå«âç*¹Trãß^ÐûuJ=ÌýÄ#œq"¤ Òï"tm|†òè¹lÝM¼ç©éÛ-°;„­ñ’ÖÔZª¥.Âc¿êX0‘ýêe³ùKy³jÇj†ùe•7éñèo£ ™SXéïºOu#P(­å}É× æ~‹•=iºÜ*FïyýÅÏ[“½½çÏ®MÒa¹üYZOÊóv*FÏKzRŠ$‹Òe“æá6¡X$9¶ CãÁ¢E’‘_t&ÝZÍ léù2²Ñ"id=i¨çƒÇ³rßàÖîù¤_ŒÚ4üÖ(õâaîp] IGÉ¿ò9 MÀøƒìud>4Úª¼Lw3ùÉx(šØˆY•°Á67ÊI m+6àì!÷ÍYmB×v•ƒ¿°g\—oÛ÷Eö F¼e/†ˆ{qœþÞ*:i9¾«»‹sUõÁáÂÂÊLÝÔûÿo~`0Tuá¿ &4¼òËÐWpIôW›+ຠ¨vçGÒ+#ÊÈ;&_eÜ[Wq€&¦„pþóû¥€±ùøðÒ2ãÏ)~]dïÒXÙü3}5Ô²’ê1²±´üŽ2¾hØÂ‹À9çW÷w¼~8X>çÏ®„%g½W«†j–&à »Ñ|ûHeNüÔ —k>;â©0<ÂHv§JbÕ¯6B#¼´F@Ì®­L„ÌenS.Gû¬ìE‚ʇº||þÇósZú£â~/.NÉb¼É=ƒJ¿nT^” Ýj=‹_¯„¤{1?  añþg;|gJ³#Ú\–o×"»ù2’_ø 7J-˜„8é #½VÅ1-½Á柊’çç)'r"䎱ø6Zž`ã±Àioq×hB÷Úlý×g]EÞùñ£©HÔhþغ•v½v”½y sGµ=0ù¬&Î%N0‡dpdÖ —no&ÿçÉõVZ—ÿ %&i3ÖËOB¸Á`½àð=F·Oñ ¢­FÕT ((!/&8s–‘ØâLù¿‡jptõ­EºåȾ³C…“9É}v“ýÕÇ…^k!‡ut­ðvœHåArü V‘ðVZ©áIƒ P‚ŸŸÏL¹ÎK¢5Ç?q$ÛQY|ªßÅ›)ZþNTý˜€M½r`Áš“ ®3 ¥@2BØ÷¾]‰ÿŸ‹f .fÔˆÎUÈÄb‡+‘è£0¨¶ñý%§ ÿ¢s8gŠ u·²á£Ð/q6’i]‘Ò þðyÊ÷Á/<|È£Pl¬baˆCËz §X/s¿Iãm¬oh¦oóU¾PšËcïDTfïä(OÖ ˆ·œüˆí‘Iáû:'AGI S%-≶?‡—fÚ=<;˜‹Š‘Vb¦ÿö¥vÏ´žs½=ªOžãJ¹ ˆáˆ g&x=•ã VŒçL}Í\×µƒl€Ë4Ö½ jl»ö{ÙÅKht´ÁKv«:q¹ÒmzdÉ}›ô—v8BI†Wɽ<¥Í:T;&ÈB q^<¶’Êm?é¿çÉ»e—lÝ™Mds‹îYÀt–ŒÎ쌆ºmd(5 î‹é^°3­Ý‹ÉÛÂ6ޝæ‡Ë8õY¾Áì©íÄ®ŒŒ:jÄò¿A® Z6ñL\-²ã2 ÚUHvå›”57½ÌxØPÇKÅC†¼ ‚ˆ}R(½ï¸<úo/{ú±‹9¿–N•œYM-10iZ±ƒbUT3c,”Hv}±Ý+LL>W+ž¾J-)kC)5°•º m™…òb^ µ¶w„«YºÍØÙnvA4J”3ɹ< ”ò“—òï—ÈõC7ÂIñŽf¤ýÜŸem²ˆ>’óN?ŸãkÂLœ7JGJr_úÂ‰ÖØu÷m{}Ê•7õw&u´Ò){Í¡Œ²,îeúî4„tí€i‰¦ ¬©8 »þÛ`ðˆè"O+'*.Lh:K µSð`í&%,,“l–BáÜ:§·3…3%YV! úWHÒžuÛ§kÂ[U}MFo’i¥wáöÞ±ü¸Ãb¼ ZûŽ^H›ƒâÌ– žSÀ»¡°é“)dʪ7פWÒaàTdÔ¶›'ÛÃày¯T;›À\Ú/néB O‰a,?Û4úEÓ=·r ,:-H$n=¿àúPl endstream endobj 3520 0 obj << /Length1 1660 /Length2 9458 /Length3 0 /Length 10536 /Filter /FlateDecode >> stream xÚ´Tê6, Ò-2Hww· Ý¢4Ã0Ä Cw‡„twJwŠtJH·t£tŠðá9çžsîýÿµ¾oÍZ3³÷~v?û¥£V×b“²€šå¡8;§0@FE“‹ÀÉÉÃÎÉÉAG§ †ÛÿRcÐéaŽ`(Dø_Ðþ¨“5…?âT €’“-€‹ÀÅ/Ì% ÌÉ àæäú Èš:ƒ-*ì%(èˆA'µwƒAVðÇ4ÿù `4gp °þá²ÂÀ榀Š)Ü h÷˜ÑÜÔ 5ánÿ‚QÔ ·æàpqqa7µsd‡Â@âL¬0Ü   tœ€ß TMí€vÆŽAж;þ©×‚ZÂ]La@À£Âl„8>z8A,€0Àcr€–¢2@Íù¬ü'€ð×l\ì\‡ûËûw 0ägSss¨½)Ä ,Á¶@€š¼2;ÜÎ 0…XüšÚ:BýMMÁ¶¦f€?*7ÈKiLü«=GsØîÈî¶ýÝ"Çï0S–ƒXÈ@í쀸#ÆïúdÁ0 ùãØÝ8þܬ êñøK°C,,7aádÏ¡;8eÿ‚<ª0þÑ€p''§€/躚[qü¯ífüÃÈõ[ýØ—‡=Ô`ùØÐ l |üÁðp4uà0' —Ç¿ ÿ-apq,Àæp€†`üýQ ´üS~\> ì xËùÈ=.çïÏßÿ ée…غýÿc¿òÊJêÒ ,vü·MZê ð`ãá°qóq„|œ¯ÿŽ¢n þ« Î\!–P€ÐŸÅ>Né?;ÿµÆ¿nƒ ðß±T¡¤ÿáø;N>NóÇ/®ÿg¦ÿáòÿGðßQþoÿß‚älmÿ03þaÿÿ˜MíÀ¶n9ëä¿ ôñ ÿ Õþy³*@ °“ÝÿZá¦w Ùþ=F°£<Øh¡†›[ýI–?õ:¿Ì ªCÁ¿_'çÿØ/ËÜæñåp|dä&àãáüwJ9ˆ9Ôâ÷…qóñLa0S7 ÎG"qóñ<¸OÑèú‡ì(üÑðØžÀ Ãø½Q‡ÊoÕ’ /€CûoIèÑfú·ÄõÈ>àßâc6Ž?gñ·†Àa vþËãQú[äåpX¹Ù[=>'ÿ uà‰mþ% 8lÿ% 8ìþI÷ˆ…<ÎèûãYq@ÿI÷ˆ†þ—ù±9Ø¿ÄÇÔŽÿDãpÀ] ÿ2?†wú'Øc%î@ØŸöÿZ€¹ öøýq"ÛùüÇ{ºÍ1æg æ"Ö5Ÿ®«¤(\ضFÅ&é¶ô’™Ø<æamN·ÏP˜*ÓýW`—R ƒ]¸KrŒ’ T¿<šëPCZâ4ZzÞÇhŽoµbÌ}%îË?ªí¥DΦ-¹íùËÁS×Ï©¡]‰.ÛÁIð™z.ÁµK‚kmoÉâpðÌ–Æv%ÿkÌ»’ ¶Hˆw~ESt9fÓ¤/Qàl”hÌøÇ®8S—“øYcTJ1,^‡‘<«ÜQ7ÓîËeÚÜŽd´d¤”HøÃãôÒ»‰J$³Å+°á¤iâ¶‘5»x.Û]F÷-UÍkØÞ©=ݘ0#)¡âûˆ•–W±vEÔ±(¼ÇKJ+®Š§Ífެj±à5[Z>ML¡­ÎÛ¬Z÷]TF¢}æM+¢„Z*H7_%BV-ý³Ð¼-Pÿ]$É·wýæËCË„õMBÏLä(›Û|×Aé5.~{ËÚÔƒK®ŠS'Jî¡Î{̶„ÇçæiоöíG ;2#„ºúz±Ýª–„,YLŠ÷ĵ”N—BÍÈä‘4 é©ÙÍ<õê˜ýƆ5[˜Li•»­½.ס½û„%:%R•åÙ‚éxùè¯P££nCÖFœˆ¾® Ë~ÃYS ºg Î=Ó+ï:ù|vd˜ÇÆ)Ê^Ò’ÆÁRµ'0ÈTû |4™ÅGa$T×Mx/\ôº…Ùó‡<†àƒGw`!Ä·dFŽu…,ó§Ã'Dñ6kN£$׃ÄÞ{ýî½ï>{AaŸÀdXƒ"dnƒê𦧹ˆÄâÕsKö;/¸ü´t«¼¢û… ;¾•˜žYpZõÌzøøˆÚ¡Ls»|ÎJ¼ & ñõy#ù'=Á¸ xN!¤àoåá=öýlŠI”Gkœ;È¢½Q©ûÉ ‰ò æ÷ítA¢. \ÙŽ~gFª²Îy ™¸éì =uZO®G?òc‰Ý'Ó~²gh½S9§b ^lŒøáüK}ÒÊ—F”K‘FÍxËq9¿µg@þ äTÕ½ñØlÕz‘Ž|ý›sü;ËN½”É•áv#šž›ßÃÄÞrÆ 'Œäjì5üôè„R¥tì]«*jÙÙ³“Õº©Å$®iúÀæöà¡×X)8{IK]ÉôÄi¼ˆ==SLI÷ù,äav= BüksŠ(¹¦‚[ ²éˆã/©ô9óN†šRoXöÇ,– ¥÷ '°%úcAE¦n GR…5ãF›%&(ÑBÄ©|ì{à–€ˆÏJÈ®•XÂyÛKcGo¼4wÆ@ý[BÞ•_÷à{¶:·DîÔ%† !0‰ŸÌ–T+מ¦/ÇsåÎ:ûÚ%‘[±ð 6iÞî»Àï á½yj—âÝß6”2#j¥²˜2G“KCÞö £´–¦Rê„u‹ýBv;Š$å» ²?nÒÌÒ¹j:% ïçüÔRLðÁŸ!‘m5íc AÂ8\ñAÊ•y8vz D¥‰DúÊWëÉóRÍNÝ'ßuV}%¨m #UæËƹAj»‹ì„AÚ=q¤· .cq>LÍH2h+Ù‰ºf„Fë6i™/”DÊ̱1T;â™Ï°ç#žwæ¯Î{¦ÅNu¿ÕÉ0©XÉÝ}6Xl;å³Ç?a•Êü{~¥þkÖ‡T«Î:ç©ë¶ŸÔ=é˜tû›žÙ·Ì–fPâã‹Ñ2ÅØ)#>WŠêvL4¦Ì®‰MAv‹ò™'÷ôÐôÏäï©ËJ’NаV¼"Gõ# ñHæN"ÿUkJvWD‡õ,)À‹)ùð„hŸ—1öù'v1„€*“Ì +û²‰ ×ç}¯à‰÷Ãx 3—Oú¢ÌléÔͲÊ?÷a^ ˆD"( 7¥Ú²{F ª…õõ-5}92Á‡ç[½´>žÓWvtˆâÚmc6Ukh{0§ ª7’*ðF§Q=: r AÊs¥ï½È'L‹”¦%Û!(úy3÷/¬8µ³ §þõd™™÷tä½o´/4Ï#úÉ­'ždAg¸(UJ ^Ê÷Ñ,OŽã„Õîë9†M®$v&³&£¶ˆž ò6EÕ•*a< ”Æz?<@[úÆtºêºTŒˆ“XQ#žìLô›JÒOgOÑïü¨S ó›’ðHýàñµÁh{E’rº*ÆúçÎ CÛ^\uB¶¥R•¯*|¨ø ðÐ ã:qYRoW«mcÎù‰Îɾò,™Ø0kc50V|4ÌìÆáçÓœc{ÛÉ(W~(¥DÍã(Œ d–ÊÝ_ÊÆB6¸/s¬S°«3ÿZrÂξx#ŽÒ:yš.®ÑBßL‘ØïZ±u0ÜìI~Öl#S\eé Ç6Ÿð+€ß! ŠÊœlÏÂ~ ²¶5Ȇ½°‚SDJðsÀçOæÝè)äS¨]D/¨Žž}¯j•gW™|æAúqM$UŠrk[!áÜCðFu”E)©o£’ —Ÿ>›ö0íçQL7ü}{œ«±*$yÀ¹u»öfæ“‹Ò]úR¼Á­©,÷êÞ h¨PÇðÔK#’ò_MÜ|×Oj£^œÏ.r¦³–Õ?Áv鑼¼fª‡ ä)—H¯»x¶ÚðNN÷ªýJլƔ¤úSRk?‰á 9gM~pc¦@eP´ƒ7MV[¨Ò%ùçÅ+ORl›jºfwSÝYP·ib"ħù„¦Ö3Ÿd£øµo mg“hUôÊZØÌu“ÇšÑVÝêžô—Áy½¬ø€1ß^©†Âz^•+°ª5¢ò3¬­áÙæÖR§a>«ªí“.иš>ARÓÎDÓÝbkel¤Vªo4øì¦¿‚ÞVLmXé>»$9ËÞàûñ†‹ï{Ø“1¶è8Yå:>cØü«­½rQ%Ç ØN‘?î.h¤R.î½+ Ìb¿=±Ã5{Jê—ùAoòPËXNîÝ‹eÆ@fáÌkh¤…Ihn®”Ê­ºY`D0$?&d¯þ4Ö¦¾ ¬ÏD?8 ,N*ÇÙM4ã³ gV“Cçû€]­£muK¶lëÜ.ÔJaÌ„p3E6Lk/“–Úw@‰Ë2ÌØ¤…>ýiAý§îûX5ûœ¡~¸¹ŒIËtö:gZTOo… _Ù)Æ^†½ØP.¥TL&,òJ‚øI±!ˆ„œ}TÔš©^nø»Ê›}¦/Ƽ󔟽^¿É©d©·˜72ÿ¦ûž¿ŸSΠÎ:ð‹€Œ© |‰ô¨QÕ–OfñAð )À‚Ò|÷ÌÛ}I®«6IªN¹Ÿˆ²êâ-Ù@ZBÅ‹ÅC£&È|‡)æ›q¢ëœ\šÕ ‰Nû‡‘¸î_kðú bÊÅjc.À§É XGÁVìkÜ„ä©!Ë\CL[¸Ì"Ž{óÏãé§æ¡NEû듈ç¬ôÓ~ {TUïÈûÊ?,m~ÍåR–®*çQÚ¬A¨?î8»ï>i¢´'!á$>ÕRÂÇ‹y-` ,ûÒ4/áÜr[‘«ø¹Ä”5¼›aPP˜ƒ1B1S!'kåÉP=xÿS²dlÑ–œš°KÀuºk朵ß±Ð:ŸÊV¡ö-÷nÅÏÔO û`x@Õv}U{©°D^GC3P ‹H6eáˆ+¢²…Ša{Ó¹D4á¯\®7ýñ§›&1(º 'ôrrˆY~ 渤Ïf® ±d“úSjØLúçiŸV–«8¯ îSî{ÖÑ;öDŒbUðëS÷€h c!oã\ð6ý ŒóQIÐ)(ÕU‘qÐa<”ûÙ†èrk :bhõó~ìNÄ!®*Û0ÚÎËßÒZÈjïÌàÞ`Mt[÷4®úÇ=ÕØwä„\Ì´[{¥QÝ?¬Í¤ÔQ×§rƒŽógîù‹qWGÌPÍaÉTͧ‹1zä\Ï|¤^®@ôs‡O¸êZyƒ 1~¯);Õd؈U¥>®‰ ‘€øÄ¾ë¹Ž 3"»úÕõ<,dÊù¼¨ê\€ ’àz©fÏ(FÉÆÇ&‡µ—¦PµSû} Dü†ìûÒÐ ¡Až°½·#f^N›€{ÀN,Š^Øã1%æì?è¥~a¹Û¿‹Ü®•N¯Gä¡K1ó¤eÑø»äÙjOQ=GRŠž9†öWÜ_–[Œ`-VË ŠnËFeÑù|Qs÷©Ÿ.³‘¼9–:ÅvT“/ÊÝ‘w"¹]··õq|z,š¼ósÝ>UØëã9v\Ôw or/û¢Î üó")ÃBg<·ñ…èQÓÛzŸ}³„ à¬5øj|ò†4²”ùÂ4ð·¾s¼ Gl{Nú6ÎßWMÓ XDr'¾¥Ð3†Yàþä¶ÒZýK%«µÞŽ_<±æB…“@öaëµµ-Fpx*OõÒ1™,6ð€<Œ¾‡kâÔ#H]ÃGK^kþ´øFG'åNmHÄÛk±§ ïÚB<0|€mèÙpâ 6¨å3*2‚­ÎÔ¹àWx ^íK :w±Úb'N¢DJüš I—CuKÃ!Îvß6kIè.nº[³j' ËÄÔe¼ï–Œ¹—ú§l~]Ðô!bfc‘ ¯#Ú85,;9Zb.ÑÃR‘­¥e©µÖ=¹£â俊DÎ|€ùò_(X¹bò¶IHžWaz_´¨).ó¼eEÅÈëÖ0ØBYÚ©‰Ñ%y —0­ ÄŒs4õY+’Ó“pWƵÚ^Vð}-©*™q@˜|eYÙ³¹|Àý­*¿ <ËG¦{žKà>>Â[ ðþ»à—Æï¾Õ!¹|6ÞÓÂ÷m².ö/KE¬Oª¤žÞ–£šhi¾kxóôY5û„‹ê*É/™ê›-7‚RïoN¯höŸ© ÔœqV8I^`‚Dvã8U,É=æbÊóP¢ÇEh¹¼‚Ø{ÉVs~G½=8w»Ø4µÌð-N—â‘»Œb×ÄÍ’~†°‚¼å—„l>¦ã©vZÌÒ¬CI[› ûPAùð«n‡Ïd8!uucêØ&Â'A.44wŒ#®‘®:«`F ([¹J%Û‹yOã ¤pN½güRç¤×6Yà=\·¡«¨²Qiɼ’ÈßE„:l¾S±`$š”®É7âÌæRÁ¼¥‚3zs–È寛[ˆ‘ØÌõW’¶ Ê&Ë8 Ô,DD{l¾¢©ãµÂd BȦõzÂüÌ65»Ô6B(yÍèu˜Fz¶M¬Ž¢©’”¨^^íord?šcâáqÏ–êŠvDÄ’‹ñ…Dô‡(|6VH5u¾sxÅVñeö²cF·Ø‘#§jx}ø)É¥O>—ÒhÉGæÈÙªöÊoS{"™ÍA’sÞv6–ÎÅ2‚ËCýÁØØBÚö’ÑFxÃ}HEÙ`ûÆRî† åÒZš|ûìFb É&MÃÎ+‰…·vAö4‡®yIœ¬O]¶% îµ§iKhŠëNªÒ¯pj£HzuõJˆ"¨õù§€©ú­g>^Ž×n#©ß½„¸Â¾·qvl:Î'‡ö \9!‡mŸ“ìT9öç)`»…¾Ë'‘9Uz’ÍäG¿Òa§FGñt#{¸5õÝS©öίçö2eÙyÊEøJÒÍœ—xišÞ7yvü"QåèÎêëL •w[ê¤t85–†tÑjp?Ÿèæ­ R[ËOR6¨ë9øâƒ3YAkõT^ ’¡Æc5ÈÏôéwŠ™inFg}«R#f~²äÐ~àÞ§|”Îpw~zdòÜPf¯ßМe××o<¢%°™9`覾bK…‚³ùSðUÎ컑{hÕâYÔ™]‹.ÆGÖí·ŸÎPòægLzaQ ŸçGÅX²Ù÷àÆõ¬ ¾…]êL g_‹2aÌ“xk¼zAö³´Ù˜Ïu<(Ù"ŠÇý¥Ã(ÎYÁä Ù)¹¦&jÞaÉÈ9ßÖFyöÈ‘&»[h×ö9Î<'T4oÙL"(V+±>Šðo«Üzöfuƒ¼O}¯ÞœJÞVÛž2B?Í? LùÈSlåp]â›:gY|#|ìÏ-jõm £eõ¨s30›_˜q« ˱·Â˜³³×+`ÍE}WÁf©Ý$9ˆ~Â;M¢”l·$¹É5¿´.¤”® ë±;m!.Ò#õ¸"XeÃü¹¡¶gϸgŠûªžJ¸ÖŽXÕ‡8¤3Â2yÀ„MÚMÚ}O$p*’u7²gúšJ*oF>cΦŽÃìÝÅÆn³âòÕö b#&RŽþ7ü³ Ùê©ý³Ÿ6׎‰¹Vâ ©&A1Y¦‘Õ«½­éÔ+‚›Åq0êôl”ýÆ%S2B6ëo /Ÿ.Ç|¤ï ·rºxBßöB !˜7Â?rŠî6JÈü:ÖKÆ—ß°z×Kn~]Ô¯"vt&Là>qzú<"+‰åeܦ/EáBS@‰îú«ð”Ø‹²úH.……¬«W®áëop>íi׌L”"8~`ë¶×Š@)픩­ÉvÆðGrš£jNz¸ËT#…´H¸©µhͰo³¬jӘܙ¼œø¡÷ÙĤÛpK¥‰oÑ?0ªYÞ%Ót³Ä ÛKdºYK-Ç1¸†˜I«[ˆVnMD±NRãtç8OoÙÍa*QÇT3‹VTshÕ t!Š© yéS¾]ÔäY»•âfQ °8x¹îüDž]î"öí;NÎ褪ª¿,åFו)QDž'þñëq¾‰÷ì|Œ¯×n‰&ÅYPƒXx[ݦ%‹‰¾!gD}•žþñö UÓ§ø ô2J6“;¼ˆ„°ø˜“‘ê‚"6Ïšº*0~t Z<ëÈ«R— yVKyäwF:vöËSlxG† éÉ€Ohæîe]4„kË €q_jf¬úÒ@nì6 ¿©U!ÞÏ“ºt¹¨91«ö_?³yâjž‘ò ›7Õ)TöªËA°Š{0 ç$wôôtÖg:í<7€ÝO+…e€D’§-<æ]ϸaG†™ÞJu®ê·ûy"Ó–ÑŸl£—!­“r²‘Xuö¨»20ᓪ3J¼­©C ܧby›Obv ׇ3ôê)ˆ=^ÄØÉèÌ5Š4jÀï)62ÞV„¬”àãY÷¥Öy¾AÒà¥Ø–%2ŽÍý nnÝʹ°‘QXÑ0ƒ Ôó•«¿™hïúÿ@Vú5‘8..‡ü6A-rJèÙ¹Š1Sv¼×¡/7Þ¿ëô©£r”áµUâ¾D/ÃØüqIC~.X¼3õ¢Æþ£ï‹öGÝb­É©}üSóý&ªgGOºV»ÿsç$¾ŸÁú&ÒªE#©]ä1A?ËÊôo«Âý€v®|ËÖÇ„’aÍ…Ÿ{Ìzf/8ºk\õ¨öåƒ6zyl,ì“ÐlãÈM‘ {íÞ…›óËÁä½ê?O—ƒÑÀȼ/Ã*­âùE¨ ™T-ƒeå FébðI"탖Uø¢ÞG.qï/czŽö±Ìª{4…q°}xgßÚ±&xÿ}ÖáWŒÍWü¯wÜqûç6?´¼5hÉIf-Í ¨Q?õZú^®J×%¾ ®îdŠ<)EÊ4¦Ó«ýRe´Ù%‰e d|wÁ"§ÜGáQÒˆ÷¤&=Þ¢õÛ1<-¬–vQ&üi{Šì2̫ژèï·NÍóñú,Wùìhì6øî­Î ÂI“,?Éz# qímòô•«§gp£[+ ú„|Öø„MçGc¸¸SDzÍ(zö ¿_ƒó|z±®aÒûÈ"c£ ʨ J8[¤Ù?`Èh˜Paöi”£M¹q®ªÜü=¡”féRK(£ÀÁ¦ ûim©u¯é Ë“ƒå½Ocøú×á&8h„s))ŠD¼Ÿ‡‹æIÃl¨¼í*i€6‹Éq]­“DÕ z+ODH PìÌl…B–ÄFIß}&‘K14 ':ãЧÏO?(¬ Ù`µÖJ¥ŸcÐ4éždD¤8”§*f¾¸6¯0‹:ÞÌREˆ¼64þ%@óÑ0uõLúe™äW29Wn¿ø,£û³3®}®‹Á1/Jœé›Tç‰IÜ'ÆÝY·„ø‡uã<«/µXD˜Šo^§—‰Ü$à-=ûŽº9ï|~N”³ùÝÎŒ?Ò¥À8×…Œ°¨µÐØÓEuÅæ[]£(½w¸ú#¹1“ßHæÞøŽüðˆJ |É+r’‡ò°zŠß¹•jôj"_^öm[@oÕÆpǟɼEÁîâÍ“$]Ê¥üxªþ%Éx÷¢›t§Râ­™E8šŠK… é¾ÊèZ­®Ï>ÇGIæ°ÊqtŠ…Á<6|O‹8³úíÍU⩳ú·?¯ Öš¯-Ü¥g @¤9ÑwsEJ7ž?®e"“'.ÇÛ.r~·žÁñ¸U¤ÉEö¿¯bO×D WÙÓ4†lÙÒ°Ò”B©Šަ7HçbÃPÈ”QbVÚÝ?õ"ˆE~TU¸âuF÷ä°)HkɶFvI‹ïnñ7òÑŽ‡"=X––§5«ZÜ[f¾“×¾$°Œ¾¢ú£]×Þ~szlj™û“¬Iæ”1‘êj“¢Œât|”Ûlâr–ló1bᨩY›&væ›Çƒ 0È;Ýgj’ ïJÖ)¿oØ`6;Ú%ñÂöÒ‘ˆcÅÓ™&¸ú¾Ó)FD\98ìuUhà¯x y™E=$î.1“_¯ áÕ„3tŒŒDê–vŒ;bH{U7N)é$kÕ:zä‹×mW{gãhËá®8›I¨îµmQ¤5™«ÚÅþºµ=!ªëÜ+ç4t¿ÝÔ÷1)ŽB __ê†kb®9:ÝèqÁ«^<)YÝ qŠr”4\å÷aߢ¬‹Þ䆮Hˆ¬ÉqÐá%zäˆØPÉ/D¸Åd§R> ÙŽRð~IÈÿKé½p™ožb–—uÐNôd G=‘Õ•õ€ä­÷˜9ÙkÂtÙ*#Üc¼&¦‘q†ñR¼™º(1ß £bS?Ÿ‰åyEƲüPßÈ5+’DÌué·¡§ë†ìÉHÑO,Ðpþšxí±su$l°–µÎ¶;óEU©_Ë$Bí cÉZkaè:ÍÈ ý&}F6v~T Ìây¼2ž'¾kmYA/b5^¦èµ°Çý{mº¾‘e½p#k§¿?ûrc=U÷ë!ù‘±×ßL¿”Å-X³®E„¾ Cb!ªp}Ç+¤”h\L¡ÆíØ× ¦[BìJ¶–ƒ¯~Ž˜‰öa™O»í‚­¬ñ¼"‰¢Fo¢ U sLÅónõæfv£ ÈïüŒ¸8þ¬í‹áD“}þÕnüªØÛcKɰ·L!ï9>UÏìòÀ”è—q¦†'Ë+¡.ŽívDI_Œ½ïR‡i'ÀÁ8(òYf¼¾þ~Ój“S'²‹7&ßùSÓà?4LJ³è‡J7¡XE±m]\¼D\\¬(Íå!*Ïç®ÀŒÒé®vòEñ9%ŒÿA"ÙΊ_#àý.s—‡m£°ŽU>û[0@ì‰>Öë²®Cû$ް)Ñ8ø‡¼¡»§Mñ2±ËШðûåÀÏØuõòÄÙ¸ÂzƒïyÁ¢úçÖ/9¶´Ž“Mã>òÔžª7ͽݕš^_TÒG#ØDMIðû˜Ž•²Ð/*¤Üò›€¶Û¸©jÕyŠŠÌbÜÕ$joêµÍÉMì2õ‰]g —¹:­ªÌ]"#LEϲíݽ8lh¨9Ÿ·‘ñp Œ/ªˆaéø>âì¡lG#㱺'Ì…ü¸Cç;¼0¥vr<¬\ð `aÂѬ ò§±PløØ¿g8O© ,•·œ¥rmßóžøTmíú“Hפ˜‘Ëü¡ª3¹$R¸T%ž:y;_BøEŸè>­³j̤výdÇüèªu8œ~˜Ý·ve »Ž‚~^ÆWh}'£_Dk´›ÕþcüTP•&Ï׌uÍÚe-›©w6Ó4ZHd±Û¨†26d¡Þõ´ýëÀ¤Ï;Ÿ©5)ýu”(Ô&PU¯äÍoÛkR©g`rå³ÓþmÌå׈ õêÎŒFÏëò5[c݇_é«ÿlYÐò3 “.ŠìmˆäŠ$gÙSî5+ƒ,:™vé Ð?P"YØž62ù®I»s|]ãÃè&Æñîö߈˜á´à€^*6* –%,Žžù+ü"Îr¶)F–3Ì¡ÑDfzåüòé9‹ÄF*Q´©ò9Ïr û9_Ü,œK0Õ;n…ßÖÏAÇõƒ4þÓƒT* ¬ºÓ†ÁjXîfžéú*)”6JNµ Q` E2 c%{é[rL%k"‹.ž¨fòÞûƒ4zS: ˆ¾4¦2ì R–uÑòôˆŒ" ‹'˜’uÿ‡˜Éx-ùþOɳ›ºnz*5eZ´s3´eœ7¸â !© “½fá–V!Mg,¤H—^’ý•Òz¸0OH²oe$gfñÞEÊùR‚BãÓ—«m”ÿRM¨ endstream endobj 3522 0 obj << /Length1 1685 /Length2 9433 /Length3 0 /Length 10522 /Filter /FlateDecode >> stream xÚ¶PØ. Á%xp,Áàîî6ÀƒÌàÜ-xp‡ àÜÝ=÷àî„Gv÷îî½ÿ_õ^M3_÷×}ºO} ZJe5f13¨ H qbfgaãH(ª²óØØ8YØØ8PiiÕÁN6 ¿Ì¨´š G0Âÿ/‚„èôl“:=ó¡€¼³ €Àþ–Ÿ‡Ÿ ÀÁÆÆ÷"Ô t›YòPÈ•Vjçî¶°tz>æ??t¦ôv>>¦?Âb¶ °)P:Y‚lŸO4ÚÔ ¦`“û¥ ´tr²ãgeuuueÚ:²@,„é™®`'K€*Èäà2ün ´ýÙ *-@Ýìø§] jîä tž 6`SÄñ9Âbr<P“{xo‚üI~÷' ð×ÝØYØÿN÷WôïD`ÈÁ@SS¨­â†XÌÁ6 À{éw,NnNL Äì7hã}ŽºÁ6@“g•Òb*àsƒµçhê¶srdqÛün‘õwšç[–‚˜I@mmA'GÔßõI‚@¦Ï×îÎúçd­!PWˆç_À 13ÿÝ„™³«lï ’“ü‹òlBýÇfrp³±±ñðq@ö›©%ëïôêîv ?œì¿ÍÏxyÚAíæÏM€¼Àæ ç/TOG  àäà òòü·ã¿*;;À lê0Y€!¨ÿd6ƒÌÿÄÏÃw»ôØžµÇ`ûýùû—Á³¼Ì ÷èÌ—UNFF\BœñÏŽÿö‰‹Cݞ̜œfn67€‡‹àõßY”࿪`û'TbðýYìó-ý§`—¿æO÷×nÐþ;—ôY´ Ý?×gãf3}þÃþÿ¬ô?Bþÿþ;ËÿMãÿ[´³Ínº?üÿ7ÐlãþáY³ÎNÏúW„>oä©Z ?wVdv¶ý_¯œðyÄ 6_#ØQì2S;™Zþ)–?í¿—Ì )CÁ¿_3;Ûÿøž7ËÔúùåp|Vä.Ðóâü÷‘RS¨Ùï ãà~ :8ÝQÙž…ÄÁÍ ðd^E3Û°²@ NÏ!€çö¼æPÔß}Ë`•ømúñX%ÿF<VÙ¿/€UùÄ `Õøñ=gþƒž³˜ü~wÅjö/È`ý98Ÿ!Ä èhù/ʳÍâ_ðù,ð¿àsz›àó2±BÿŸ‹¶ûròXí¡Ïóüclÿ°¸¬ÿ‚Ï'8þ ¹ŸŽÏË÷û-€õßÁÏÝ:ÿ >×ãòü¯É˜:;8<¿MìÎsƒÿÁ<„ Èõû,ÔT Ъ*°ù¦BŒÄ•ykThŠvK+™žÙó»C‹óR"}yºÿŠÃ•Xâ@'Öâ†Ý¥èÅ£çþ·¤Æx•¦ûF±ª[M¨óãø½cùûbÕ=d(¤Ìê¢Ûí?húYÃ}ƒm“§Í¶wæÅPÎŽqí–q«î)ù1<»¥²]þVí¡d’9J#R߯pš6Ç$c† щ™ ™çÄ súòj 'kì‰B>–Õë Š³ÀSw•ããíŒÇR©:‡c; ‘.!Ü%ÎðÄkOñÝOòsžEŸ#°X†8rå3 ÂPçå)é ·|»<­F:$®VÃ_»‚[†¶¯}½‘O<¤›%j#¶µ‚tdÜ:„mUH¡ Ø,¦/°t¯Ú>ÜÌ8ÊO¦âƒM|_³µ. ÿøÊ! •Ž_S7³$Æ‹ÉÙMm>¿£õÄ"Wª'Ì¡‹·V\[coEyJ$Qf!7 á‡r O+æRZÇv’°q„òYsN”†­¿àM䬴ºâúý˜fA‘¢ì‹5ê͹ w]™–ÓÓHJõ íµ¤k/ k{¾ Y‚ƒ—ø±—že¬bž¡7Â7ÁªA‡·xŸ:_ohÍì]rùí^1¸­[N6¯p…Ԓɹ~²{9'˜)É;{¢Ã©I°ë’Ú7ñõQŽœå!è:¾ªQe (ÝUÇô°²×רÕpʤ^=CaÒ‡l¼Ì2¨nŽHòö›ÎìŽTN•FT¾dö!ïS i»Zdüµo c–ptAõˆ*^ðÄVÆ7ƒÞ‡tj­“¸´ÓH  ·Ç­\ L¦Ï"eqp6Ys´“6¦ì¸#gkQYÞœÞ{´à&¥’pÑî•Kc#jþM 2‘¶üLøÆ¤Ó™Î­ðƒ¡m6쥑[÷ªìÏÖøÊŠ—û¢ùfÛb‡¼Eùà5Ôq,¢ÁÛï,\ȣ؀¢ niÆæÖ3\¦ÿz0üSÈå;³ðÀK><œ¾oѤS¬ƒyâ¡-5B(\¨Ù§ó®à“9rÙ—…—©øJ!ÀK)3óãˆð\GÂŒÉed\¬1fOwÃD•F¼„ [RL _× )ŸUtþ–Ý ÔÄü톋¯.¥=Œä\³çÍ}Eï·W}}Êh“¢µÊ¥[ ‚å*Æ.zHnßbODŒ:ºRŽ%Èâ¼gàSœ¤zQ™ã"ŽyùµgM˜Þ¼ðÄÀËl":L|¡šü«’Å™0‹+k%éäL*¦¨æõj3ȧ8—Ð0¶ Ç“7 H;Vj¤PaôS ˆ')n°aÕJ lûQ£úƒÐE~Ô(ºoÉÙÃã˜i¾…c=“?˧Åø Ƙ” ›ã³€òƒd=gÚ©è'Ù âIÒq'<ë ÑÌLsN;}EÉ#dŒ1) ½'kÌ’JfÝQÛ} YvQé÷Âhhçêo *ë&Ù> -,Ôò©Î⢯ÍuDÄÎȈµ\a`Ææ 4%¹jé¨w.÷lø9Qž}˜µìgDb`šxœçÃÔ¶tçþâcÊI[€m™zH²ÌcÅôÞm*¤þr1YÝ9´a¡U¡KE%Ñë͹¶œFL´7AÑK߸ÙÄŽâÇÞÉFhÓ•Ýâ‰âžŸKÂ=¤d±wæ@+$ĬÙ¿y:²t`ÓÙ=°/­Ôg(~З‰<(²H®‚쨼SÚZýZ•Œ{vA¶tWÿCÌ!þézª«Ïw‹!·7@+MaH2X=å ZõB ÌøÐù¢úLÀqÒ¦õ "Ï\×4sÎç_íp¿jß›§‰ÓWÂiLH˜Kñ²T¿”Óbó\^ï“™þ|”°‹R‹+^y>$Ž«JdGmÙ´„ˆ±×¶®`´rÙ¦xqõýƒ†dørÊ—™†‘C†žï'“Ên¶­™ä{¯Ö"xÇXµÕ‰^ñ´¨г:ã¡»Þhsø]{k jFT ¯-%Á{g5m t u"½Ý<öVò™ 1¹V…\öÓŠ{øe“&ÍK¸¡i°êÚqmï/AáM¸H¾'ê7$ˆú…õÅ™ hv£{¥±òÜÜ_*-<àxbü,ddËBÇ$èü>~Ÿº_¨ baΑ\%B! ãm’”_þ®k2_í#3íFðþuÓœÐ@Nï†Ð*vïÜØÞKw¤RÐMCiÛÅ0¡¼£@ ¿»»ÄÈÂTëa–«ãû-ÉÏtlE„K\¢ÚB¾œ¦gMOK¼UC5[ÈÖT7Ò³ÙM¦x¸®-Ì O‰úoàòbWa4 aTÛÖ9ï³/ußüt†RÙÄîÙ ~R T¬N7C5Niéà«„mpŽsT×y°”Ë[õ!· 20[êüŠÎ…‡ƒ[6~Yr!ô+ïÛU¦ó7íQ!Uèù´q!ÒÎrÆWÍÛâc\Va:žï™o¬v䈙ÂhÀ[Ð]®û‰ÎV–…©aŽ|zQ­²¼7J_6‚hÃÏâ‚Ù„¤èKè•“¾ëåYÙÔ0̪-Áœßö¹6§ëÄáÇÙ¨hM»3<‚èi0à{ö´wpÞÆ§ïäïõ[ ÞV –‡KÞ)é“1«¶vƒÒ3ÊÆJ½1ß+ÄàKý°Ø}Åò0ѽÅz]`X{Æ“)„†¬`x*-м«óBTh‚ÆÂ¼ ÅŒéæA~í­6Y ;«àM‹[ݦö“DjVƒâQˆö» ªváâä¥8Viðp’¢+·‘΄¿}~B Å­)”`¹-ÈʤQu¢iÌ8;é Õ¨—a v\`¸[~»Ú›ïîYÇx's¯#º! [NÍV¾g*…j³‡‡5§´£Çò•Ó]Kgr^ïÚ£ÃÔôZËî,RWv㋸èÞu“%ì•E$áf±–Rð°eÙ$YiŽ…6NVäî™Ü;”x|º~h&»ýÄ\jHˆ šõëwXR¬´‚ZË…Ö5Ö¦PLDÆoUÙ¼ô–xÒ¦rH}Ê×ô¿Õ¸‚ »Ï]9'Ô³×4Ö8dpá§|†úåv(ÞÛ_ê$~/[4B»À˜Hµ!NOá)xkÄ¡(¤EðZÁ‡æÃøÜ榑ï%GÂ0骕P'^l”0¥•ãf} |£`ef+±Ê>ê<[çE¨ªP—Ü8w‰Þ7 ÛŽÍ¢k—HÖÛX=í¤ðàŸ)r.*ñ)8̹†µ;,íôÍñBúÊéù¥ õ§îôµX(u è¡"z­m´ãñ?"¨ÂÎ Þèá6£?Ê<Þá&òß;š¶K!n% õ¸£~€Ñ}zOĸúux“A”›jD)ìì• Ï·Èg¹V̧’Œ“ùü†ÿD†¯4$Öã¡·CRï\1Î-ùÀ‰­áò0ˆY÷VTM!º¢Sa“2îïsH¶æÈkSØ ñг—&;YÏ‚ ŠV]âl>ñLºüÐQÀñ?\$Hºý…æÎ²ÕñkÚœX3o†±a•½ÎÏ?÷;íy–V¬](Ž'›ªÙ h*ÕG~†ž÷Ñl?åA EñõþJ*$Ö«_ö‚µ³}m¯tÜE2V‹†¾·*–<à¹0o,–Ë &™Iàüê“DDj4Ñ£l¾ÈèQeŒHдûä!–8!ÐÕªLà ÆMr×/«9o7»m¸H5– á“k‚GžÊ½Öc•ˆ½¶Ây/BC™Å­-o‡·÷dúµ”i“‡æ^‰/9îÚÈKIÓÔžkÎ1±õjA×Ä]€’ Æ]®OkSµ! ³wš+â:Àèjf¶u#Qxø1àdçmuFÚæeÑ lÏa¶ Ë¦ ƒ×ÕDŸ4½KG'Ûủ”dê}Q\^&»Ó•iàÑæà0’&tluêõ´ ñFHÆ0oA4Øeê²Þ¡†õK/>*‰ìõ ¼1!3‚«Ó›qyykêª.0âa5¢Z¶`Á§8 xU¿ ‰hD 76Ÿ$[—iÔˆêÖûQÀ÷ူ9ã?–Û5Õ×ÛÕ.–¦L§Å’/Û‚ŸPØXkÇ9+ƒ ò)vOm§˜¡Ìv¿5<0ÁßíjW¹óÝR§ÃNìÚ†!’T•J)€Œª ³%J]YÌåt0>oÄ—?bC3t£>9SÏò8>8)tå1Âõ'ÝöÒKÒó#ßÊýŽåV˜H›<Ðãj=B¶S…ùªx'¡0$ÁþkYâ²Xp÷Lªê«Ü€Tï~¾–è` µ&ÅöÊÆË¾ÀŒ]yY¼$¼þ Ab™÷\VfeÍÕf¼’¤[úÊkàŽú/œëüIÊuIýJ9ÁÏ¡³¸LdC§R.„Å˰դ\Wü…~ ÐX=-k½asÿå»)‰Ð•c…heœc@†¡í¦^‡:ÜtmóÐû¤+ ¾Â¤S¢uM÷„‰dŸº~Öùଠ.õæÞK|Có¡ã–ó~ý“»ÐÊEKtÎ̃‹n¼Ô{8ÄÆ°‹5X9Ÿ˜æ‘?ϵ'8Ö¿²ÚóÕY׬V€HèÌ\+DTLƒ¿H6øßœ¯w «½ %`»PJ/š@”©ý¶ªäîG'EQk&-(Ø«»¶{ù¡GÝyÐÜD«(ÜÌt£ð©Ç/¼ððGøÁKå–„Áéëò%‰ìn|›¼•oL6lŠš!¨aÊCäØXtsµÉwxŽG”K¬°èëí*ï·Ìæ$¿2EJõ•ãÜ~¼ÀÓ@@¨å„Ö|T„AO‚ÉØ§œ~Уª…GÙ—ƒ=g¢¾˜ §ºÊú¹0Õ*–e©ö8ðnÍ®+-ÚmeÝí‹Z”­+æ¨ÕaÑÆk¦,ËÚZhB·°{}î î6Ó*V]1:æˆu€˜b'Jå¼_üƒŠ5vºß»¤‡m±Yõ¢CWò.—L€ÉöêI£·oÕ"Ù4g­bUDZ‡ÏÊJM¾Lye%@š¤ƒ£å·…K+°ïà, CZ³ÊøKJ.+ù6Nî°âü„J°Ñ¢Ö6IÂ~}l¯Ð³œùsÆ@·ëòkj£‡¾WæFtî{½Íš3éÁÙ™oZô\u‚"¾ÑD»K=²£>ÁŠDqÅL¦ôl›¡ŒY=’¯zÃV.ˆrR½_­–§œ úG¶Ü$kìU\Í‹ì>µH—üh¸-¡¦“}ç5Þ)t$NNiüpJ˜×jþä÷žjûÙ%ìÓ*¬¦ Â?ú™Y0e»pTV÷ˆ3p*ÌO"­|Ã}+B„¢Wc¢ÅWM‡?2ϼŸ/k5¦ÕCžCWuv—k#BÁØ©iÍÿ0ÂÌ“ÚБ- “Ñ÷‚UüÊX *4­þÆØv­ÈEˆh—²yÕW(…V ®PÇ4f‹ÓhFÄxï!P£*šàªŠ]GHò²Ü,E¾f7 ¦N#  _B¬¼øÕ»þÝ€àq.„A†rW#iŸ°¾ø ˜‡[2­r o‚5šúÕP=mª½ËÊül´¬CsYØò†ýè5À&·>Í&A¬¤Šùj*l$3crp‡Ìß-çž@¶•˜ ¡¬“0œ>¿Žn/KOEËO®¨M̶†µxÏ1-ggüa8nwÉþAo¬ìtÊÍ«q²,~Ž\©ÃÎ×…™5sçâƒùáƒí—åªÛ»1K³ Ñå’+¾ë+]€ÿ4šºöëÐì¤bþÈàB¾ÀØý:Ï”±fD5[­êí$_nªˆG)—ï[¡Ôwt¤ –§9éÝêí6êXòÚu|)-dòaÞIw\â¡§öýÅŒÉîÖyæDý þ‡Þ™åö”*¯Žìyý•›ÚOÑ.å—ÜGöÊãúL)“þ,ÅG``WÉ”Xx˜ÐþôKÆ ÿ™¯ ìW^we„Ž‘»SL»M4ËÆ^ç¼xê#ð•Æ4Oj\@.–âôrˆÁwÙšo6½ö’ h½™Hx ´µæ·†oGò¢$ o%)êíò ’¾2€Âj4¡*/¤‹†ß#ëñ¼¸³´€]O~8©R{éégД°6‚cÌ×_'vAñN”ä 5Ëhà2p¯17Ý”²¶ >ç„­dŽ6É7?#™Üîü!N‘êðNMמðÌ6A«"9]”zb>ö—n‡2žX 2|pÖV¯A] €¯S¸¬f/∷GõäYµĬ•ÍHÝ …‰xm«7Geˆ:3:Iû,¨jPhN)+zè(?Ö6"Ñ}ÕFÑ ÏUðãW¼sέԴó¥ÜùüìÂ+ …à_¨ÇÁ‡£q_Ђ›ð‡;óÁÜ/ã.Þ ;ý˜d}?^£ƒó”ºÍá^¤Á…¼àÕM³ïaçÿãßÊDJø |¿m3f¾ª”ÃŽ´%¨`·»¢Töõž´ä|8Úê'ãJ%Šu–è'‰öä‹WºÁ(‰† («Ýj™ )8‚H ¤Ò…ë€âÏëJsdŠÝÂZ*¶.XÍ…SZwÔþ¹2‘4œ!+UÛãiRË×ÛŠÒú0É*Ót=j˜iÕÇp´Âh'í}ŸŸÂx Ó©¦ý,a¶íp7§VS;‘áí+î{X÷R- ø²$ÒIxFÜW@ –jCCÙNç_•©­5t”‡ ¹h\«¼ˆ×8Ås=ødIó’Ò𠨣Oôv+¹€ÌéJ>ÌnÛ£üø©Šæ9’+™ð—£ é7û¾ÂÜÕmYu€lÌ/¾ÑgÜë;ÃÞù‡l߸[ûßô½ÎR(™>õsPÈäêþ¨†<ÖpÙ¿$dX©Ì9b_î'M2´£$tskMö¡E¿‡Âœÿ€u¥f>Ù€ñ²tbÖ3~XlE1“iˆ€H+aªŠæýòñX¸‡ˆs‚Íô‹ì€£þ†Wx¶JÌPNîM8Î}*‘ËwÄîikœ¹ì´—®SŸø6iAvIz9$©3»”öìêŠi•c:S;áéµ-O_å’üiÑKüêr’¼Ë4u¶W «úVàvÔë·eÓ©û¶ßh›w³[iø>aEjá[5å ïr(›²&>4>m‹—rœ|±cßX (sFë3î\Eçê„Xœ:c9£W÷tì¯gfË*«ëºâÊç fÙmÄ®}}ús§Ý”œPM^^¤;wÙS ~-e@gÙzó³Š3Úèâ&1Yx+I¤w”rŽfÎ{Åâ²HL?,BoÚ¾{ÉuÂ}û1sýÈÏÜÅ‚§ñÊj{õýö/c;Ôm®5"Lâ´ë³ö LöîéÄØ¥8ghbY@C’v>Ê©I…9rj¬Jãü9¼æaKr ç¸ÔƒrcgSÖ·™„"$„G’ØZöd•€YËMV±™¶„UˆÅ•Â۞ȷt• 7ç)‹Þ^ï/o¾ £†·QÄ,23ì'3=X€ÄóXMCÍ_#>ñË’±<aÕ%Q­~(#ì—·Ì;q÷o—XzÕìë\“Ò§ÌNqÜæSáá¶çu™=>ã{x¦õsíÀ~{&£Œ¬;SŸ-E>ø›5$†[©w)¨qßó%äh;¤ºÙ"¯«Øê½Yõj9Ù4'L¿ò¢›Ù¥Ðn¾5ü:’FEKâ<]Y"n9¯dêÛŒóQ.ØZ«SHð¢\šUµÀÝ;m:rýo£4¸Ø$ÌÁ™cLíÅëâf£« ™ „ò?6ýLÔ =é±O‹^•LÛ#bA´z޳¤®Šan 7³šš4o,ôÜ °~F•lÝ%­U NðÉç7b5Ö,¬À[ÕÍ×tddàÍìœïào4§g­…á9Ç2²XV#~þ¨+ÆØœé„îôհܵ=.ŠiVß\ìà¤n¸Þn9,¦¨NuRf–ïzRòq(-ªIÄ(«Ì0`¢e‰ØVlähâ>y’â]¯ðÝ{BÓÚé–r½vcìó(ìD£’·¡õò±#ÝŽ÷Œè‘ŸÞ-ïb‡ êùø,©¡¨2“É$²D9¯óñ¡róq-‘ÑöþÀ‘Šõ¾+¡ ŒJAY‡¢R‘0lp‰ÔÞ'Õa.ÄÚ,¦'ÃnP*9 Dë8p—¤¾°ÂvÓÖ]E6N³ÖÒYÔGÒ³»¬!úk»D¨©†rO”ss\#)%£íÔw—ÇgÁÙ›g'+ž²8½ÚfÓÿˆjÃ_Wîà•^yï\*KÙª,Ÿ3“Æ{§O©0›'x¼ö–á‚LŸLc¥Q¦˜P8E «‹’øûN3K«¨Bq`½¶¨¥UUG]‡ÔS0oN¼8Pl¬¼•‹dÍÝ^Ç´$YíêN⥓7­û ”™Yø‡ÄÚšÇ|¤™©Çz«ú4‹K%'áë}i-ÅÎU7é(—ªõFŸ”*Ï›œâˆÈp¨[c•©©§ˆ´&o@êś혰¯n’çYZêäîáë??H…¤Cý æ×xÚ¥bè¯/åÛ&H^@U 3#Q‚µä‚›Áøî'`¢‡I&bÀìZ]¶lI1R]Áe‘©JÛbÌŠØw>Ñ&-“D69‚ï'¶«CŽ‹Ï¤‡Ø +g²½»É Ì£ûf»CdR1:m5‰ÍÚwßžˆþÊ*Tƒíp"‰Ã~ûJfaa¢"Šbï} –nºNwJ#v|ÇÊ­ä»; 7› U™¶%_þÈé;› í-;»vè§²¢L´–ós:ñ«þï×]ŒÌ×á÷‡ îá/¡ìM=l4BceD!øœ;Ÿ†Š+/ÛyBÔXbý3´©Fß+q׬å Z×±[œ(Ôì€Ç·,„nÂ)°ìšc` }m;Ï$¸®*eg69_#Æ ·Ýrïã¤D›‹”¸× è%ƒ“/Î?[“ùè]5q _j߸!Iº“—ž„¿£Ø¦Y¨¾Í/ù’À§ø€Fá/d*SS/ŽÓ¨S‰ ³Å×ÉKŸ }È®4bIÑ0äAN< ¡ÿãša³Ø#¯ž‡™¶zÀŒÓ.$Ù9Ž,¶óšÞ ·´?->ÚC¼ ã) ¢¬÷ !ÑX”ãgUþ%JRÁ /¨üÈ™¨tn@¬¶KÆÂ7,‰ÎAü'#¦ïO¦x”íC_Á©]ù×Ãðègl$f[>±ràsW‚ˆ›4ÎzƉóšÁ¦É¸WI²Öèó©uœ ±ó9Ý5ÂE@‘sf_<ŒN¥ã•tõlż–(qe§lÖ-}Õ¾v9Àĸ;|QÖçÇ^‹«È¡úáD`¸ã/rÑÄœí•_“b BQŸe­íMö­ÜéÀú•j‹žŽÙ@ñã³¥‰ÚDýÈII·ª/Òª%l=Ͳ`}]©ŽR´sÂq‹ÎjÎ#w¬ŠFR\'Áö­Äæ„–O³jyãÉOмfò‡v%Mvku¸lbÁ Ñý«®XÀá£õç•YÄâÆ–¶‹/&* FÔ‹î Ùû°A^º‰‹nò±„| q]Gþ¶:z7tw¹yœ“;%˜«û>K99lã Ó°¤v«ux'5ÉØkaÄ´UJRKýû¸HÛdžb4#^‡ãŠ9C+›·2–P²À îBJ’q¢öÜ&nW¶³ƒÆí[eâ1­]y¶•ÚaNŸlÑQtÃÆuÓL€ÝæEÄë„«j¥%ó¹ýjUzÚ8ã§eù,žwXŒñ @¾¬.HHFvfUájѱíî^ÔþÜ–ñ ~`#èzlÏÓ• wD¾—Ý×åÓ·ŸSŽ};J‘»¿þÔ»w²/EÚ˜ÿ‚À¯°£4¶2¾ËôÆßx®]±·gžî®íñ›þLÈÈLøêY@ŸÝv›pÓP‚n‚<¼©,Q‹ü×ÄŠ5üáŠFuÆž¯Ž{ÚjJîgúË'ýØùZ¿÷*™½¾böÉø~sÁ-…KF&Ÿ”\µ‰ñf‰5 ¥bYžiÝ¿ ´uSœ·w TS3Ý{ãz§YnT1yU¶sÆù•}iŽfPëV.‰4¶dòÛx4Á¶”ä.¼ ø%Þ±"N’û>IZ©&̬Ë`•…„þ3ÿâ0©þ4äa1Ñæ;=x1™eéY¶»±qi×mÝKO·x›“†¡­Ÿþ®÷óœ3·‘l'‡6ÔUu§ýFÝÎ^;{ þnËK¬OÓ°T£}?=é‘neäèÚE¸Ïj¼¾+)Ó(f„TôÂ,%žÐ‘ø ®¾°»6Ë!ÒG_Ú·PA‚ú!eÓø8$5~eÚ¿b¤ø é—@¶úÃ$‹úp'ÚýXÚ)/{ÀÉD¾í\it^*˜,¹¢g‹EŸ†ä×_ýÙUcäÓ]ÿlw€k GšéݺúkHË 6ž;j)ÿ Så§Xe±šÜÍ:ûX*²7W,W,CÃ;qEëyt‰RsäÏ­bþ‘gª6)Wiyåkíj~åïÁ+{BÈ A/h¬Û›çß ¼ÓÑå¥ÖÆ™ö™táYh£5MGq¾:(âô6iÞz núøE°"Ü~ˆ´LóKWŒòlY)]¦Ùí%‘šœ“`BÞ»`ðÓõÍËWý£Dá–]•#vËtß,}•ÙüæÆÈ´S¶ú|%ñöwÚoQ¢É‹XkEÜÒÌvÌ~¥ªáµLõ]æçË>( ¶‘³•1Z‰G1„¬LQS•+ü,ŽmƒùÊñR(B*Op ² 9y+OaüYGþ3)eÈxŽiÅ̲t¯»l\ iâ²9vM;'XUÂØÑ|9Š¢‡E›r}­¯h˜^{^$9Áj†6£%8Ïž²îîì GQ­í¼n¾Vuœ2V°8‘l2­ñWþzHGƒÏÎëË,âŽúe3G`hNã:¥_ v_Êsìõ«uj´Ÿ°½™rjj³­ ø*|÷‹ªÆä³n©X¯fÌW´ zןµÌqïF ç<‰ÌD‚à9´•ìʘªNü󠿪ˆîbP&!oI<†“ÓênE)ç›ü探" endstream endobj 3524 0 obj << /Length1 1441 /Length2 6841 /Length3 0 /Length 7823 /Filter /FlateDecode >> stream xÚwTj×." C7ÌÐ-ÝR’ŒÀ  Ý%ˆ´ˆ´„tˆ4HHIw‡RÒHHü£žïœÿ|÷®uïšµfÞýìxw<û]kXu xåìa¶`eÁ âJ´ôE@  (@ÀÊjA¸€ÿ ¬Æ`¸•ø_z8ØÂm(3- îé @" Q  ŠÿÇ—(ÚxAìZ|uìAÀªsóC¨[þspØq@ââ¢<¿Ýr®`8ÄÎ вA8]Q7ÚÙ¸ `v0Âç_!8¤œ7 ~~ooo>W>ÜQ†“à A8ôÁ`¸Øð«\€¶+øwa|¬C'ˆÇØæ€ð¶ƒ(Àb†z <¡ö`8u7À@M ã†þ1ÖücÀø«5èïpyÿ þv¶±³ƒ¹ºÙ@} PG€Ä ÐQÖäC <¨ý/CÊ߯Ëâbc‹2ø¸ @YN`ƒªï¯ê<ìà7„ŸÄåW…ü¿Â š¬µW€¹º‚¡‚_ù)Bà`;T×}øÕ ó†úý9;@ ö¿J°÷tã7‚BÜ=ÁjŠY  ‚0G0 EÅÄ`wiçÄÿ+¸¡ø·ô Fåàçs8 J@À¨?/0÷øýoÅ¿%`±ClÁŽ(Á?ÑQ0ØáŒš<‚˜QÄ€¿>Ÿ,Qܲ‡A]|þ1ÿ=\~-=Cm=Sîßÿ­’—‡!~¼@¯€0‰ DQ‡€Gѵü•ð_5¨ þ'YT—þ“°×_Óçøk18ÿŽ¥ C1 àø‡à@a ê ôÿMóß.ÿ7vÿŠòÿ øç£ìéâò[ËñKýhm\!.>éQ|õD ¸¯Cmô¿MMÀÖU lñtýo­ÂµrPG—¿›ñP† Áöº„ÓªüÁ~-˜  Ö…y@~=(^ø_:ÔVÙ9£ «À¨¥ù÷•JP;˜ý¯íØÀá6>¨£$a€µ†ö`äoøù 0Ê€*/àƒüš§° €ß‚¢, ý ˜'üo@HÀz¸þ1ð{ ˆù· ð#œààÿeD!Þ°ßò¿’µó„ÃQ«ú›L¨Jþ#ÿ~À`$ØŽ`~f'þ¤6¼õ¼ZŽÎ›w}Dz’uÝ$“×oÞæyIŒ›ÊY•º ÿ!—:Ðuwé‹Ç©ìõßNSnTs²^ËOÿ+«Dýñõ‚¹1ÊÞÑ‚¹·=ðïóÊnø_»û‡8c6¡¿WgÍu÷#ÖÍ';÷þ ‚|ÛSº89³®·Q%¢AxU:ÁûÌ(Î"¤xŠ5Ï6kšš ÁûëÞ’dêôÇ作Ñ[õDn‚€Ýg‚…~fkñÓ¾Ëå†4,4fÔ0Oï ³ùÉo¦©SÍú½)\…½˜¦lþäšrÙäð]×Ö?‡o=fc•à ¡æÇ$W‹[mVMr-fLÂÊ:XR_Eª‰6Ùzðè$Anu\Dk±Ê'‹7lÉïïQ>ÞYݯáÝV’!,FHªàÆI­KºJtãŸê¤ÞÍÿdÀ¥ó°[¼5wtuþÓÚ‹“ê{9çq ã÷yo¢°–àœ{|©ÅÐ4=L3J)„îªÕnÀ™Á(â¾u‚M÷µíŧM)$î Õ‘äøå®¤fŠ–¢››tœyU¬–-> ’Uû¨džjfŸ\§dD&hÓŠ]:¾ÚÐà Øê.¸»á©À›››S7Dûsj ÑåÎxò‡g ËÖÁñšž‚ÃË$k-”Š#Øx\$Ó }%Âômã/×=¦Æ5ÃŒhœ©]UËî(»/:|4cÙ<9¨˜ð¹´Ñ(0„tY¨Ô‰òœE¶'9ªlòû£ãHì²iCƒXÔ”ô6ö}®¾­„ ÝOÉ”¸ù°¥L»}Yæ[¼š¤í+z„5(øôËȰ-Ðs#ËVR¹TŒCWÙÖ\Ñ€5ÉGú&Òʨb–5–ž]]ªyùc£âM‚*Oä7QëÓ´gVfR‡dŽY‡fï¯w†‡ïÕ•¦ƒqVsr‚‚¦sBÝS£ùqž°›+–ñé¼yú5*‚SNˆa®32Zbu’ÕðÀS…Gä˜ê颌I)ÈçxùÃËO¶õe'æý]mÑBø[G}C«5òè­°J+1 <ì3 Q½Ã—¢“›•šÎ'K÷wƒbˆ³`v˜‘MÛûXº èãáwsI¥s¨32>ÊÄ‘‘k³MØÜµYìq H¾Pò)Ñû>7áˆfÕÒJ¬YäšU’œy;¦ÐK“_eótæ#\¼üžÝ©ÉǠƃôîŸXÈhµpe‡„T…Exи¯aèrƒév5+;/cIsëðyÃdâ[ø¢¨Þs㔵rhÁÝÀÁiKì-³ë8Òü½äH® Œ@QÂM¦l’\¼ç qvsgÞ€yÅO¯üL³ |­jïus+ŠM‹ô,i­ß%–`õji3Žá$Sžv~zä½%q°ñV_2Q‘1G™Ìmé˜X½Mf6E>qCt óð.MÞÔ3 áÌl‹­ì·yúYî±MŸ— ²÷Ù‡AÕÐV+èÇù@´—±4û ·KA±ˆŒ*YOEËïLh´R‹F ´;dU(dÏA€*® χ¡aTÓB1li–;ßÒ«ì‡o•ƒ—Ü\·ÉpîU‘85æNÖætÒ°xZT©ÛãŠqwä*Iw<й…6 '²N.>œ¨šÉQùh.×­8ʹø}â9NbÀv˜Ô³wœ»¬n· ЬîpçqØQø#6œÄö¾z;¬§ R§šuÂ$•Õ0 òô^~Ó¸äÅp8}Òzº÷bÉw·¥!o|Œ~ ¹³{åô%΃{+™Æˆ7³Ša•ÄâÃ5ÇýNiEs{NÙ«V,Dði'ó›ù¤­ùrÒÂÚ,o¨Az/œ+HœÊ6>Üó¿_ÔÆiÖo·¿D1Û+:*ÒñcÈ»€ì9倭ZEäÆˆä;éÀeò`¼˜1xã6W륆×ÿÂG,5ðkFvTÄ%¹Õw×)E±¾ÆhøVõÀ[§XoO«Î/Ó"]æ”õIÒõñÆ}–÷M˲¶T4÷ls>å×ÐOi òKï-c—bæÅØ¢[…ßÖ 6Ã?¦ 7?ͽw@nȤݙN¯Óɺ$¥¨î Ähþ%t~.+ÞúbÀ ËáÈ?à“þe¾S,%N ')Ž'Åw¯;«J,Fe/Û-bß™HîÄeÓNh+°ÌoÄ&Tè:?ìöiñ¹Šh&“Âþ±¼r0˜ä.­ Â8 Jk”µŸï¬Án<鉅Êñú¯ÆØ‚¬}+jž êÒ‹®Ì,îæóõÁ÷Kîä~íóxÿ’éí6•¥¾ÏË—/ÙàýŠÀ»NšÓœÛå¾"ZÒŸ_Ý0±7éèl¦Ýô¢úï'ÀÊrwò$ Zjv­%é裉õÚ‹©nüP­4ûAB&Ï̲SI÷Q˜sïóù¥ÌáKe˧c±>iP'ÿûCöxT¸8cüïÙn¾uèVÊ‹¿S¸Elj\¬lã?g¥þtÆ#žƒ‹N:ªƒ§±;ù]“:} Ëë>¹*O¹ÌD|ÄIÜ}‘º &nÅÞÆc¸“¦”%®·È†z—ú;ñoë‹ïö(‚ΞH1ò»”½~Ñõuû½0mojM‡ã­1zR>Õ:>ùJ¦˜Z¶Æ¨ÅIæ®ÃUVqädB@€aÚöÅòO2ñ¬ûŠ[ƒv“âûyéàYšˆ,ïïúQb¢ËŒµ#Õ°D¤&j[DÊ@ù|í]†óÎÕGŽýøÌòoYG(èÅ." R!ŸsRšRvO® ‰TRRERDoî‚^Hé3ÍÔÆZ\Mz:Ûþ»WŠÜý¢IVÉ™üZóiY›p}qÔüåá*Û‘Ñöuý#HÅÁçDí–*;Ï‘÷ð¯{j/,ÕÞ¬VFZìí1©ÅWâlxåxàã$¹›ºeâŒêZÞ ûßbúÃubЃÑíì¶äÇÏ4Œýgsw"…ÎV€ 6OÜ>íx ˆÉõn¶d½øFüexûÝmž)†ïîäŽfÝú·;o‡«>`@÷—÷”küX{‘˜tJØVw*2¹¬Ç4uºv úR4ÞW¨|xàáTêªþº‹U˜f¹*it¿È^΋LŠæÉZe{h-6¯ Vöw‰Ui yÓíò×¼Òµô]0\A\AR™<ðý²§¸ëþ® Ïš÷‚¤ëØ0ý¼ýðlß‚,g­‰Õ÷œ;ïÒºLlù“¬d·½Y^Ð!m?=Ý 2çØ„zíÀQ=qÓ«Ã}Œƒ,YšR¶Œ ëCnå]<¶UÜì÷´¼É­S$su|÷†X#_+íÚ5A‹ùš@Ÿ bËôUP]kfÙ8ËXînEð~ä ]¯‘HÓK†õ— ýÏUž“«½h°þààìNg ‹hÄ6cËbOì’þŠ'X>e‹¥Vìxß([/ \Ñß{]"×V…þ57àÏUñç7J  ^¯Ý“™„Ëû­ª‰Ð;RÊ¢SXüÜbÇUï-òv:ùÞf>‡Y8?*À£·ævWbqß{Ý;L+â](_QètÓyEXsDùcç m¤¢åpŽ=U7¾©p9òòAÿ6V”¹YàLhJñ׈ö—nÏmDÄBäÏ”ßðP«Ä‹ÚìQuã˜Î,%ýÜAÜ'êÂŒþ¡äe'#@iÂüF°øm®ÅRaƒK¤FéêõjìèRg»é Y˜G.«ÂNóÊ~‰¤AvØâ4˼ç„`éôY "ubBzó™‘Ö!Ô\ÞŠ¢_ Í ó±,Ô3ý¡æ…¢‰ùÐMܲFÚ3 •Ùµ>UäÁ$RŽèò1¶žÙOnVrüç;1\~T£O§à}U|s.SŸÍÀuH_ÐÆûšNW´dÀg¦=ÆÍ‹Þ¹ØpahÖPŸ›µGmï ¡v‰1¦fÚá¼N™ਲ²†–¥Û+ðЀ•̿ޖµúËÍõ‹ü]m6D¯„ µ’ÎGSuõ}uìÛ‚$³øäÒ­[yU^F´@ŸÖ ·é¡§åè_rã×fªì¿‘úòo\® ¬=¡H,àêàx Ž®ûª‡…½ª Bî«áy}Ý`)’©¾çÄ6](PÈòñtóFRûÙƒtñJqC©¶©œ¯4¶1_GôçˆSš«ù¥ë^ʄц ë{Ú±qì•Rþ˜.•ze‘ÖææHøm ^#±Z¬XùÚ±lsÀ&¹{¤¥ù`ä®"z¨ýë2:ØîËÍO~‹-[ ›™x8。<&º¹ä•¾¯0Òâ2%g¸õ£ÆÃ¿HZLx5˧âö|?6âPðêÅô~¨:‹ÿqˆ¦˜S@D|¿œ k¾|ª¤›dÞ$A+›äVž'ÐÊY9νV×ð’$‡xücÍ2bH(¡á¬„8ADMÕ±¦4Õ?­µÝ û`áR1¤™äd‡±seËO\ªà¼mœq³¢ˆï™K,Â̽¸E-ÃÅ.ß놼¥¼Çáè#ìb{ÕøÓ¯½—Ьm„A/†(®˜õÎþÔ-ÖÄ‘W3Á¶0Çíì'Å¢/‡£~±Þx¿o¤£\ãÙ»ª"iq#åâOa”o›ª¯‹è¦U ?wÂÜâáì XÊ;ÜDFmƒK,çõ}#Íd4„MN’óøcjèy¸!#i¡ô0Åó~£¶ j¥² åF˜$pá&øÁÁÕʼnEWÝ1Z¦Aæ¾ÔÞËj"òxCauF.Úó uª *Ùb­ Qf1¶™]Þ¢â‹\ŸèåñW+'É Õ*á5†+ÓSáÆA¸'÷ÎÊ^|ç6A«10§ÕÙv¤HÔuµÙâ!-ãN1£î¼.>4ÜÍ‹t>÷9½«/ÅBH1üu9ÿ“À­ ÛÄFÊœ9éB…©ÜûÕŸ´GˆÄ)Eë™Kk?~ìÕŠ==Í\2¬éxX'ïKq4«?>Ü”›¯G^ë[V2kyÌ#¶ÔpçàdRWV7ü%1~„ oß @_\ë}ðºoÅúqð:§ IBÆžVëÜBÕŠl\$]×­1;nR!ǤGõ¥äÚ ÿªŽŽaÎt6î£ qkzìð;W,º&ó`Óý°ÃÅqi%Ö©Zšx7{ÅÂe×ß~ì’™–Ÿš("kßÍbûvDi¤pc!Õ(Œ ¼qk$NN´šqs]Çg…¯JMÛ™ó.>77f4i]åXsõåϾÿB…¸ f†».|fWšÃXF2ò‹S—'¸}Å üÒ¡OÆßRgsTàÎ~äà¡Ì(Ò ð&Ü’ÉS†Úå‚×åš|éŒÇôé.)>¨½lÙž«å6tî€Q‰W¦/J¬˜X\D{%ðÝÅð –¦HÙèírŽOûËöÑç}P„ãß1¥;ïÚÐÕÁíYµÆ,*ÇdTÖÍYnh1k†ÜQ%‚Ã`‹rÆ? Úð_x¶…( :¥ž˜wLÌrÓòì”ÕÎtÓSSó bâé~b]bÁ&Se¿ê©QÀ!å¿WwS›ˆu'î*¿sÚŸ'ßKºi?`+2“A!º43ÓÇZÄ”X—«qãä9f2|¥C —•Ü&d—ÚhÖ18”¯g´—ÃÅÙ©°4auì°[7Ì=Ê\É©/±Çº•ÑŠèlz¬ý$h¸Ó\{Z65—ËìÝ’ÌNNK¢ß˜$«–ëóCÖy+Ü{^ŸÈ4ÉÐk^ç£X¦ÞÏÃat˜7X÷¶¿ðò¡Þžr§•Lv¥Sè Þ¿âê! h,q3¡LþLŽt^©Uð×DI½¬UÒ-åb˜]eÛðuÚxMҡت½LÁ—ðãc˜ ­bŸÙág‚ð¦[3Èݑ횳Õä§ŒŸ¹æRô†½àZ@øÂ3CΦl¹í¶¹O .•5¡ñw z˜שYèí…[²´î¯ÙDß=Å¡?÷\ÒñŒ¨¡YÈýºµuUvt³)6¾­ÈþìÉâÅü½›^¬W2n×Aw™“;=%dÚ¬G‰™¬ä³`ÐFoíö„£>ü ¯Gá¶О‹þ‘}ý;ÂX8vš~t‡n®²"@>.B¤ùãï0ÓîC÷ +„SÌÜ pž%ù$ªÇŸ%0µ{Ô±È;êÒ oÇ¢r£OW‹á‰ÓÅJB¹¾r›+Ä&ÏáC_Y­gTçÝÌšÏܤür`AÝ|~ߘÙKOßzj‘nÆÖ¬u§ö`™‡:«ùuÛkÊi'õáØbÞïFò+?$’k´´õÌšñè )+p_NN0”Ò’7, p³iXƒk·™W#V¯t‚É„, 06«"åa½C_2”Ë Ÿ¿Á@˺^XŒEnRç¤Çšq³u)5je¨;ø£lj¯æŽÐâ£M« U≀â±ûÍeº¥nîK·¹›ñYÛªÝÌÌVè-«“xn¾Zô”ÑŸSb¥ºœt Š7t¹a(Š\So—®êÇ•à›b£A†És§ Ú^½©{í‰n€±ºÀJX”žÅ5[CÚŒ à8œ–Ÿ4öa-ug6oÀ`0kkXP¸Ø¶/5®ÌZ  í»ù¿‰ÅœoÉ*¶ôzl?\S. É“ÌÁòë‰>×›‹1¾wNÊ±Ž¹ŸÀ‰w¬ ‰Ñ`ê×s'ª›Ð™ªÕâIøúS⧯©mrãC†hî¶;Ð;§¾Óë¾Z.â¶ßä”—î/¯i1œBä f„Ìö­ñé.)jæcvÏ#{Î÷E)v&O>yù/¶T%)¥^êtưœ1<Ú¦š´'Õ^WÛ½6‡îú ö-wiô¼TDIÄmÔ•«Šø)¸9ød>uà§œìÖâÛ×?úòÄŽšÍ³ƒ[•2ƈ«MÒY>Ü©¿s–Ìãß#ƒ»Á Š~jDëg(Éf§Øì#ीP§îÞ¨&Ò鄳o„[õlqÕGª>&xŸÌýÙ¬ÀS@ªÛ^`ìÅl9Õ‘*È´Èî&ÿ‚åÇ;ù‹‚¬d@f^x¼ÑÛO*Ò*ÝyŽŽ¯^ñQOL§“‰^V¦ù’¹Lù|íg–jÊó¯Z¤î^(3 ŠÚsS’V)é]1š”ÀÏ· d^¤^#™LGAj›¥Ü˜ˆ#ÐRñ‘¦•*õ”Žj’„¨ß> stream xÚvTj×.Hw#È€R’C‡HwI* 1ÀÀ03C·H7H‡„4Ò!Ý]JHKI§ü£žïœÿ|÷®uïšµfÞýìx÷~÷³÷¦§ºÜ2V0 " Šäòð‰ä4tD||<||üø,,z`$ôÅg1Á`Tüéåà s$ “7G¢Ì4`P€ª3…Å"â||~>>±ÿÂàâys°@ƒ  ƒ‚ø,r0Gw8ØÆ‰ºå?G»%(&&ÂõÛ ゃ-Í¡ s¤-Èu£¥9  ³ƒîÿ Áþ؉tçåuuuå1w@ðÀà6O8¸®`¤-@„Á]@V€_å4Í@¿ ãÁgèÙ‚`]˜5ÒÕ ØE œ¡V 8u7@WE å‚þ1VÿcÀøëi@àßáþòþ ýílni sp4‡ºƒ¡6k0ÐRTçAº!¹æP«_†æ åoîb†˜[  ~'nP”ј£êû«:„%ìˆDð À_òþ ƒzd¨•ÌÁE"ðå'†ƒ,Q¯îÎû»­öP˜+ÔóÏÙ µ²þU‚•³#¯>ìä R‘ÿËáÿƒÙ€!>>>1 ä¹YÚòþ ®çîú­ü £ò÷öt„9¬Q%€¼ÁÖ Ô¾'ÂÜ@ÂAÞžÿ[ño X-‘ ŠÿOt ²þ#£:»ŒùPÄø~}þ>™ ¸eƒBÜÿ1ÿÝ\^Y¹§ª†Êœ¿ þ[%+ sxr ¸ù…ø@>>€êàýï(OÍÁeÁ÷¯ Ôû“,ê•þ“°Ë_Ýgÿk08ÿŽ¥ C1`ÿ‡à/ø„ø,Q_Àÿošÿvù¿±ûW”ÿÁÿ;Egä·–ý—úÿК;€!îéQ|uF¢¸¯CMô¿MŸþŒ«È ììðßZ¤9jd 6¿ŒP»¬ž‚‘–¶¨ò×ÿ5`0ô†ÿZ(n ßéPSeiZ«@¨¡ù÷• PK˜Õ¯éâ˜Ãáæîø¨£$!€'5†V ·ß ðò@aH” Už7ÀÇÿÕO!¯5EYúàG0gøß€ €µ¸þ‘QŽgÄ?‚^Š©Ë@/Òú_1ùPˆ+쟢^üð¯r,ápÔ0ÿ¦ªÖÿÈ¿7ä²ÄŸ†YJ¼¶«|Ýt^!Cçʽ6,9Á²ö,™ƒÛsÞì|IŒ“ÀQžþj~*“Ð×NºðMýDzŽñÆó{}5NpC¼vã•×µY¬ÎØZ#þçQêî‘wßeªºðè¹õ¤×½nœ¼ üí1êÑ[UY²œœE‰ŸæPœ»v*¹UuÏM¯i¯— «\sGêG¼ð/˜dɶȘ¢aÆFr3à>"?p#™<9 ;r˨ˉï½)çi´Äu1åñ¥Tñ‰ö!­ Æ ùà«§ìf¢êÝϼEø`Òuóвà d“ÝcMSç¾uhÊÊ2"ÎNKËA©±Ø çPÀ‡-˜q° ºè¦r(RoàÒŠßjAD*‰Í:lƪ’›Âë íO“ü2’ªëʼ‘änÕ\ŸT\TÃ: Ñ2wúKL°ñ¯$v}ŠkS¨62”Wà e<ñAv·Ø§¼Oû®Þܪ§Ðö Eêž«°!,¾Ò5æÎøø&Ña{=mÅpL Ö´Ô¢ª{_&3TpròA¶Â û[3‡žmlþˆ©‰ÛDvoî \ŸœÊ‹áßÐÚÝ•Úx¢œÞÌ<È¢Ù(!Êfq4‡«„MiÔ‘ð)Þ¢Çj‰È¼ó°¬î á8|Ïœtú‘UÛùu9@‘"î}ÿ¶\`õ9~,ƒ†Ë9F!‹’æAËL×]®ñüf^Ÿ—£¡gÌi;ªX¤1Zü¢s1`l@·‰ŠÒ+ËÕfk‘ÕI¿üÁCþ™¡{±s¹ÞzâŸÝDEÒGx¬nT” Ô‹U䢶ø¯©f=mÌ«…èÕýz¦\Ù|0%µêÕi,mΟ®|Øv‰û 8æqIÅBúªøœì5Èë&D+‰wÂb/ œ6¸åóÕö¶^‰¿ÑJœi}]gèdpãc²OAßãÞqXÄŒ,”ÜHŒ¥#)óÖ²šéSnÜwx`=$X1ÙÀÁì­šö4¿oÓ†´´‰\Q<ÞJ%ÞÿšãH”d€Vë}áYSðØ˜ŒŠ^¬ªeXüdhJƒüy¹Q ½ßÃÓ¯@¡¸}ô%ŸzœM£L´;ôEs #»ù$ï¸õåÛÆ¤î Wï½fÃݹ  iÉ­_)¤0 áÔ™¥óUºqÌt—¿K¯<ââæéèGn©N™stmÚloù2N~¯“*¯NqKCÓ†]=l,5É¹Ó %Ñ$­A1˜»+«¹XªÔòü$ZL² #€=}?«ÛÔ®û|^ËØþûiD´Mñ2½­ãˆâƒ¾)­TìAߘ5X]æÀ‘³ÓÐ~n»úh›Í QÍ'/íò,ûì«:‹×aëSΆ6ôH§²‡Iß>ÞiZ©™â15dý<DûJ'†xòŽèb £±%¶a ¿\ԮŃVeb~K.‰Ö8q]•ª¥;Ô±y(!ß”8@—9JÊË®Ê0pä5;Ö†«”_°9µ›þrÉ^l®r:€òäžs즷WŒ“‹ÛBÀµ^ìY̹Èíy1Ùîw©åÜzúº¼ŸCE÷ôÝoô/?!g®ê¢B˜]'ð n˜ # ã‚7¨™°'µÒÁ3¿V½X’9r„?ŒqzSø‚dÀ’b:¿s´2Þ؅طa1AtvV]ýÂ#ÌÜÉ›6Íî?¼‡m`¼…¯lt“y¦V~áz’Ýçë̲gV™ªHdJЀ!™»Š»I™0™Ñ$dÝœÌÂ=3_ÛZ¥ó¤i%LãÎ0 Rúx §óq}°¼úšfiÏ#w}5^~,0™âä]¾-Nƒ«0‚&¥àØrbCM(IvÔ6·É`qÊÇ8Zᤧ…n¢Žý¯ŸRf0í|¬{¼Sc(þD#*!VÂøÖM½¡%Åë4ÐúN ^߈Ÿ+&¹_öÀkÌÝáŒ[pˆ›kàG:u â©Û³KâÈæ’摎ˆºçL‘ÂNÜѯ5HØö(n²»¢ç™=Ý\G ·¾*º¹I˜iéçä·Ì¦»v"ké ý.Ø))ì˜9z¦{j§Ü9öR?úöS'âx–%¬<9¦–qemïâr –nF;ëã<ª,Ù¼³,~éŸ'ñ˜ñê7~ÞJŸèó´!NGVÁS»ªUÚšS-Ó&à‡<=G—Hù@Ó¤ÊÎNƈÔy¢c·‡Éw9­!Ç«nq±´Ùë"må’+´@]á'tpªK º`€àÒ"ŸÉ-QRîÐó”@¹ü¯ ŒÛmxü´¾XÝ fˆ[!gùRÓK6©o‹x7v 'êóMœ¶Ë“,Š&vŠ»¸Íñ³Ú ÎÖ,ní›ì̸èè²ìp'C'Zgt“áe›žÙN4šwŽ"Yñ9eâ4gµe¨¬Ð›vƒ¦¦ ~øïkÛ³{Q¶›ùêæòöœ‰šÇ\ô²°Áæ\˜õù£˜Jw ìl…´¥¢²‹9ÖÃlXU³î1P’ùMp-õÌÛéšP±öwFõn?šï{žú(*\ >ÔµÖ|C‘äédDWΆ!ݳd…y…0ÔyÞ0«uÊç ßv¥âM "çõ £IÞ>÷´iBÚÌD¤ßÑëwµðæÉX6<¥@+’i{!È ¡9áYÍ(x»›})tRºúI½¼mV’É@ˆ‡ %ÃŽ®¶|Å@çôjU7ã›Î¥d&±ŸxKRÝÌÛ_Ë€›fÖo–ô&U1VòÇJƒÄ#£·‘¯¿¶e…‘*Á"@gø Q3ò\2w#Gɓۻ$¨ÖttÑ®´w¤àªø‰-ˆ3f•+Ž„ÖÞãeyÉå@]RÎÜ!]×]ZAÑ’4ž@ކ¾¬Çä^­L½¥ÆÞ1Cªf”P9õ¤´á¨gf¿±wî•u¯|ÀY\QTÞQ7ÿnѯx³š’ú#àd­›à™c… ‡v$ÙŒ5'zÀÑÖŸt Y–"1ü"f!âTT|›Ë3¤²RòC•D!€ßøÙ{ùOù.‘…F±¶S:6U¿¯™g£kW€Ç#@»$ñ1(ç –R×L×WÕ…/ñS éË+E•[=å¥heúÀ—qh§©.é- ß‹Ö$Y&xÌ×ÝÑÕ‚¢CËÜ5d/ LͺÎöî.ÌBæå=ð§ èØïõ-£½Öö"b.lèý4QÛ Cc)`Ï:Ñ4«š•E(è0Ltdüù“q|¯­×° C:…Ðêâ ¾˜jModýýÞ“©é |¾2â©oomWiÛÌðé]¡Ë­ž[MÚ2µXPŒ‚¢z%›xåÄ¢‹ â£X˜o—AÆmíš_“ 8{0îÀ‹ozï q[«²ê–;4륖ð5Þöîm±Uô›Õp§ê±b:Ƚpq\f8/ª)O1›¦U!"»åq–ѸÛ-ø~ )}½™çœš³þÒpq’º·±_ævÙïšÛé´\ú)ú½Òàþ;‘®R‡Ê;ß ¶ë„Åž$L\Š(Ý“Iš¢i—y~}Ÿ)e01 ™ËåøôT/þ+dø-µM¦„ÊÏæÅ¶©æ”yÙ‰é y÷ÑJBõ'ø _¸º-ó§Û¼¶ðïyLJc­I^nTPÖ ¹QY¨íñ_ïÝi »2]Û3}v†©/c òÞMÛDõ`OAuКW]‡¿€Ð.íkqõ$TúŽ"Édª +••WC'j¡Y˜õ5h²gèæìÉNR×?S>ž¡ {@Tê× (uãÅ"­¥Žû* 5ÝêÓŠƒ5MAñŽS‘Ñ­ëëm.ÂwE|yäï2‚+ºüÅ~y¡èSo+ÍÛþ]o7€¤ˆÑ¡wyOzõV¦‰ebþw¦i;ŸâH)oVJR‹çï’ëœfÀ áw1(Übn†£/®Œ„§òŽErªäÖ8ÅÕb'·Cã?,_|ñQ´ÂÔ´)â* 7¬³œbÄ¡ Íø¾ù¸3?òuµk>è¾Ru÷ëv eÈ ¿k³kw½¸ôCæ P±MÛ: ˆ¹ÔÕž ö"a[º½)mƒñÎÜ{W}iD*½æhÕ KÝvBkUÐÁo¦÷ ÒªÙª*qïÔéªù‡¢ƒÌ_7Q÷äì’OÕeßÑLŒÙZuàé‹Mð~óÊ>ž0iÖ3#§þÂzï¡YZ)u $0åʃbXiFiÙ­g“÷N(seM~¹âÙ «°ê1×£ØÈò»ŸOIfÌþ€Íˆ/𳯨É}¡ñï-ïÊsÞ¥9Qk~Y\1àÜ…57Àà=Mw¾t5W@Ff6@˜ü¼_Å”,ßdÖ£G\Ú}J¡.`{Ò±]ã&‰ä¹oKY(i‹­‘ëþ\jYM2rÚåvÉÎxþDæJPGu¡9Xç¼’ð™èô¾ÞÞ nŒd!zƒ°)À %ù织•ØÆôqÖ1«Ã»Ó;‰—ÒÆˆi{4ß3A{ÕÆiÞ÷ºZÅ#PCÕ̽÷Öö<<ÙUXt‘o>þÄJ_{„¢z­¶7ç…ÉÞ’mq•£˜®ô ö±Þ±3kiV*%ûÊSnUvma|P¯º.Z@s òˆ™• Íox8£”ü<’õáO¥‹½üh©—fҷŬ^.AÄ4 8çŸ:2_œfëêâ*ä«Ãì7ynB:Ç43é"Y¥_¢“Žë¦Fˆ€rNªTõŽ„S'Õ$X¦§ù~7gô@ ÃÐ[Ð[š÷˜ü,Äð d×dÏî¸*ÆHy¹—ÊN†ÝX,kl°’èAÏn8¢Gã,òe´\ÃU-úÛ«ä³O»Û‚éòí°ß(ŠV}‰±¾‡‰gl¿ïù2àÙÀõLð9ëHø]ê-käOfEê§¢û^”qœ>šþ-󜒲¾¡Ôdg®ÖÇ8gO„®–G3,–øÊÌ¥ª¨†³E{rË@*ÚJì;<(Ó®»/ÄheÅwÏY€³˜qZÎÒ¿øÄh‚x,|Ò Ø*Ûi"±NR³œE¤r¿¢aÌ»%ü‹Óö‘ç£ã˜·5L8Z¦}B[DùŸ„»';Ub#R¸»Ý¤îLÌ÷G#Æ[ùÑšBñ"4é£åf-“9sÁë¾i9œ}ç%sP2g樓·ï"öì M”oÞÈ”ì3ÃÈÄõ­_x Z+êƒ ”Ç?ÖuÿøÂB¿Ïcü´¥ÛèÓSa¨Zݬqå ÿMpøbó;¾c·÷^1z§´†{ç#fµûéË¥ÌΪùßäóë„^ !Ç@Ñ—/¢é˜jZ+Κ~7áiÜRÑjAJCBÖ:-Þ©hõ–SŒ~áøl²³ç“¹Ù'ñä~M0JŸM_xúxº£ ’Svά»yjÊ©æì2y!#¡òu|V²æuǽ; ¥Bï™Îy¼€ÙóqõÄVr©Ø€n$¡ÆêM:vYr  bíE´»’²,û0Ã+s³µÌ¸ª¬ySRèÉê‹þ¼A½è²9·ô¡‹ü‚}ÌûŠÞ}UK/S¿Ux$»åPD¿àJóÅ’«¯Â–ëíãÖn,?9ï/ª f%¸_mµê áF>ˆJ:ÒEÔErŽâÛ³4w÷.O_ÍlvÀÖÞªVdø·ÆT¾ª ió_%î?£]Ã9SÞIzïÿr›L×+á„ÍœŠIÄøtÚˆÕGÖEM,@ÐÓg¨œMáÍ]Èêiþâ— Y1Ba›ö0¨. «÷î ¢zšèý|3£QJbD¹§|‘á©Ö#A³‰!Lm÷P €?'°=à ßû«ÿ‰ÄÐð Ýdˆš‚ti?Ë]ì®wÚÌ“8«_vY äŠBKãÒ¨‚Æ×ëÝw™B$ø¨ ì^ò1Ö&l³_ˆU.¬\[á1¼á“ˆŽNä5Fï ?zòÀ ¶be’¡õ䶤7GÉmIÃy¾Í3ˆÔW}ªïÇ7Åhåñ´>6º[âñ×q”õË?ö‡×bœ¯¾ ëò»®}÷”Þ˶@k£ÛÕ4C3®µ®"RAÇ×_°2ý&üc¿wHÙÂt„Ü_K}IqÉê¬3ú)ÍV½ÇùÉÁ=YhUú¾¸cæ8U×Á®S£þK÷!|þ%ÜìŸ>´¬ÒCÕšH‰€ˆ¬Ÿç’ÃÑs'°ïm­†œÅjÝóiþÑaŠ]È@NÞZ{?ß ®LH‡˜@;k5ia eä­ûU'k]é üìàjÎ\—çÛ ßåø/1TÞgï`û¼=¾g‡¨U:.PÎ!{0Ìùå›kzV*¯™çsÍ£ ƒaõ­Oz*R†½ëé´ÎöÂŒÝð%›Âó7ÁxÔH'É Ò ÉòŸR—΂>¶"ævJ·E®èÓ‰Aïr§R*n,D?{‰luønn›Q$w¢Ëö|äG<‘Þ…¶b}]›¦ƒ–Ͷ¾¼¢ i²R“×´Ìb,_õæëö|ÐÈ*R%(¶ø~pâçÉÐù·çJïµôouË ÄŠ2ÙRY#è,KD7·Á1/@š_‘©ýÏ‹‡I3[Ñ<,–#OÖ¡U ÝKokç½h—娴,nLGT(×Þ¬ˆ‡ð‡“yÃÔ¹Tð­ >Ð Áu^§À¶HCë~Ä;̪—ªNÊüü‚¡‘òúåÑB®VÅ<œ†3d²ëxÜàCMù³æ$)æƒAâJ¬/‚ëäz= ´DÃNtÕ;>'\Òu;ìÞ; Ø4ÝÞ(~üê›êÕçºûbÂÄ’&,ß}å³²wJíèîÏtoeÿšëÉå*ÎáÙ¹ô@ –cã„<ÂûôKóÏÁæè˜L){ ÝœJë«ìÞòI‰orÐ\]6ãµ”‘Îdôb9›"^ƦÚà]¸qxV|Þ,4ˆ¡±,Ä á$8¨Õ05Ø™°)'¢GÓËyáõ$U0™½âxß;ÖŒ½¬ØJŸrÿóLH M?€@ä{oˆËÌhµÎ8cÔÝ >F­Æ#!«íY[Íz"WÞ*E—É3 —=…‰ŸKÀ0æÊlç§P{œõÝH¢ê‘ò~ ± GÿãÔÄ#ìŽó:Y¼¤hE ™è„ÊΧßGccjEYª•汊‹W ¡9ŽïiøâÂxIžë “è¶Ò W¨|íÅjè²Zó*´|˜Ö3´...y3§¤ºÒòÑÛf"‰Mlº¢Ðyü•¬%wá…àò‡åXæ9F…õõÂU{¿šÌ,fØnÞ©öôw¡¼-µìáXE¶-eï@;Âf™qAè僒NæžÙ±†w×ÄW*ÃÔÑð]ï¨)¤Tâqg dE)‡ä=¶¯¡¢ùmz¹\ÇÉêI‚Õ!Î3L¡Z.£¢–²“¼:Oß«0d [._D/ÑU»ÿÀa·¦úpÊrlMÄ4v/!¯Ó¥ªpoeŪÞ+oP¿EoXéQ;?¦Ub]@Îõ?±-:±Sב†ö‹Û¯XZ\D¼Ê£$ É[Ÿ®N4”Ð:}æ“*Ö3H%ù¾_7ËC6T²7´áû=ãP›6 dl’87·ŸÂWÖQkõý9w†*^¾^e}7 ÕÃî)ŒÑzFÕÈŽ¨Füíl}¿e ‘Ÿ¾‡³qŸýï]K|Ð ¢´`Bù}l{,®Ü˜ìª ;c<ù¶Ÿ9Ó«!³éÈ¿€Xt'8@#©)%WŚˤˆìeÙEE ?3°»_j¯]ýN˜+4éõþ‰wäÐ*“Ý\>¨GŸ£¹¸£¬y–¤»‰^M_[`àøˆŽ7µê‚#ˆ4T·ka ¸ßúîo&Â*-Ÿ“C'R¦5bgm@í¸‚ºaÈ´#ÖwØÍ‘¹ƒÝÕSMçº`9y*ÝÏÕ錔Fí ΗŒ°v’“ÁÏüg _5¯Šø]U¨Šµ¿+¬Žpo3˜Í)ü4T¤¢“ä†N$ åÿ¹‹èOΉ†+E‘§„Ó©÷\½¤·'!˜¿«çpcšöyVд&K1YD²J ÇÀ`>ðŠðh£~ÌtÉîÀÍe¤.ï% ©ä‰›tùðð,³ÐÏ"OÓ±¸}Õ¼ñÏ®ÃÇ‘\èªè¬»µ']F^SŒ¶Œ‡Ç¯\Ÿi/µoÌÛÕ¿N­¾€ÈÖQg`pJó$8/§7ZÜK&xÐî¾»oº <ëx"v7v5g{Iß ÏOiFš„_Qü ˜'¿ ¯¼@/9$Þ‰5 4—æœà² Ëî0£í¥•Ç”ö/îf/ê|õ]¸ýŽq˜|Ü3ªNÖmÑÌí·[ A ‘`N?„h~‰µèÀÖêßÖåã¶aªÜ„⿾p·’/\6–°ÙFýåÈÜè¤)²öJGwÕÑZw|/0/2:ºyù&Â[zk*ÜZ©œÚà s¨w7ꤒŠR%b—¨Úr¹=dïV¿5¹`è%å°í-Úè*ëÙ×':˜½X gßOüäÞèö^8+lðŠþzÄØnR£ÎæöÅpÂ&“þp~ÆÝ-j¼œ—É |{¢³_KyßûGø±‡,W6nI{{/ÝÀý78Ø©«~Í éÙc™V/ëç¯qñµÄÛNÕú‡9i?3~òÜ Ù÷>}k ÌÕ!ꋦÃô)‘³3<ŸPëyó>= ìùrU×çn£ë Ƹ‘Ãrï~‘*«*¢w'à žßÚ?kØ#âu…Ç}p½Ó&S·ºpþ(®×è endstream endobj 3528 0 obj << /Length1 2026 /Length2 15312 /Length3 0 /Length 16555 /Filter /FlateDecode >> stream xÚ÷Pœ[³ ã®Á}pwwwwwww‚—à hàîîÁÝ‚ûeïý/ûœÿ¯º·¦ŠyŸ¶õt¯î~rb%Uza3 „ƒ½+=3@T^…ÀÄÄÊÀÄÄGN®fåj üG G®tv±r°çù—^Ôhìú!3vý0“w°ȸÙ˜YÌ<ÌœN45¶¨:˜Z]½þW*>KWWGFFc;g j:€‡•«%@ètvšþJ `lü;18r€š¥•Ë?bUsWcg àC`ke ´wùpp³7:>ΨJËöÿËýc@øOiÌ Ìÿ ÷ï¿YÙÿílljê`çhlïeeo0·²%ä\=]éÆöfÛº8|ø»[Ù›|üMÜ !¬ 0þÈï?Ù¹˜:[9ºº0¸XÙþ•!ã_a>Š,no&ê`g´wuû‹Ÿ˜•3Ðô£ê^Œ_«½ƒ‡½Ï?ÏæVöfæ¥`ææÈ¨noåä”ûŇîÌè `gbbâäf@OSKÆ¿‚«y9ÿV2ÿ%þàïçãèà0ÿHègeüø‚óq1v\Ý€~>ÿVüoÇÌ 0³2u˜-¬ìáþDÿÍÿÁ7ïlå Ðeúhéô–™ƒ½­×ó¿/—QZZTV]›öï„ÿ«qðøÐ³rèYØ™ÌL¬Î¿ÿEÉØê?,˜þøJÛ›;¸ÿ!ûQ¥ÿ!ìþŸÛ§úÏ`Pþw,‡Ž¨þ4¸;“éÇæÿÏmþ·Ëÿ¿îþ+ÊÿKƒÿ_>n¶¶k©þRÿÿhí¬l½þ£ÿèW7×Þ—wø˜ûÿkª üg\åfVnvÿW+íjü1Âö¶ÿ-¢•‹„•'ÐLÉÊÕÔòŸVùG®þ×€ÙZÙ•\¬þZ(zf&¦ÿ£û˜*S›¥áòÑ«€Có¿·7u0ûkºXØ9ÆÎÎÆ^pWüØ>Ìchôü»ƒŒ ö®.€ôüæÎpÝ';€Qø/Ñ?ˆÀ(úqÅþ‹8YŒRëG³ýA– ÿE\LF¥?èÃOåúðSýƒØŒj€Q㿈ûƒ‹ñôq‚ÉÄ `4ý/bûˆò±fìþXÿUIF³Af#ð¿ð£PŒÿ\ヒæà_Èê=ë_Ðø/ó‰Å¿àË?t>Jjéåhù±2ÿX|Ȭþ?r³ùüHÎö_ð#;»?ù#—…úXŒû°ýx­üKýÁÝñú#UÇsøW1>ÞUŒNÿ‚äÿ?˜ºüIýCéò±…þ¨?þ©ÛÇ43ºZ:ÿUÛ²®ÿrøHÕí_ð#U÷ÁúÿªûG<¯?ä?l½Îÿû_]oêæìü±óÿÞJ#ñ?øï è 4…[úå`Êb]ÒöP%ŒçA¿7Á?K¾§™FMï³äÜîö„L]™´á|'œ<܃²º#Nu+´LôêsÒ\Ö’¨Üúìûb¯2½× ·8…90Yp"\ÛO‹O¯&´ïûêä«hÞ Ú)Cžë䯅¤ôíÁ£OÒ³¶¿te,ôמò~%‡,üKé }Œz´^`ñyžIö<6 ”+= ͧKOä¹Û»ÙO9“ïD2ñ´p~§1¬…>:›,±óÞkåj,.]8d8:ØෟƦ)|DSd°|J W=›ù ‰réRWéQY2+­T¢ì{«ÝÇ–:˜ws“!”xh»‰Õ?Ñ I1*[ £Ð\«Ym€‡æ"kmwÝæÖ©øËÜ3µï€yNâÄjÄoãkZ<]¬y92ãgñiÒ²˜Ö[Ïæ8š/X¯Ò¸§ 6cš†kìÕ1Å+š:·©šwŠ/þ«úIJ$žC½ƒ‹ÓÎn§2s…Ñ‚ãË'2ÙXN àW"ùÓæH”|,ñ&ñ» øªPÞ˜ÙŒÍ6ûÆíÛÃJ$ÖW= «Ø®›~ºŸ–I1Ru÷ã÷ ‘ á¡Ï®¾£ iCŸ-¡ß7?»L¡N¹ù¯.@0†sɉDYh}âyb#“ÑÔú>¯†ÚPg7V‰=#°ŠÎD&Eª§´£áC‰yŒ>^%2~íMžŽL(ÏçwKRey¿qo]›v«fWÿ]äÕv_ê&+wT\]7DG"¨æ‡‘òµÑú4ÖꃅGB:µÐY~@Æÿ/ÊóÖâŒ-TVë¼1Χ{) ¼ö>1#1dŸóˆì­nï*MQHþ¹4_P/sŠ O=bûGlŒ7yÄ<®¬‚ÌK¢Q_YÁŒß/Mަï}¹ØÂ01Jx( GÑ™$‘œF­m«‰nó pùªçZB¿i¬fûèÞ<¥W²hIRºàá\™yÉlƒ†ÆÞÉû±y¿žIóDh¿û-,n}~À ¨®)RQ5È-ÄœU­O7“¸=ª‚¦êðÏ®Á®»C"Ejîú²†^¾ÒRº(B5-O-Ôƒš³¿3¾KäA¿•Æã³ç% BÖdÇóA9âW4[Œfm wüÞ×"°ãòzL²èßò†$¦[­_cLr»lħånpóK(Æ×K{AN:Î6¸Äš -((3NÍr—óáç Í]t#…¤Ûñ.³¹}56ņðt® î\ƒ‘AíjûêF‚†Š-+v«„â2ÝfúèÍg£fÛ#ˆ“µ¥Oü¼–¾°"ÐØ¼¾ó6H³Øb’”?ûÅš_Ÿ¹: IÚŽû‰ØèY‡"O=CU;KyÔˆº7T»ÐyˆÀ$Y$x­Îä9e¸ÚÏ)˜ äé§`t>¨'°W–•òŸðÌ@ÌÓÿÀ[›ó&$â@ŽÏƆ°XýD¡¼S¥#­[ϧ™l$Ø@ÖûÝÁÍŽxW©tâäLŒ?øz")Õýmud÷v»¯{³¹z¬$ CáÐMG§A0YNÅQùìw[¾åÃÏ@¼kÞ½Ó} Õjýøœ½Ÿ°Ï`(&k8_Œ[ahÅÆJå_— x)–íÝ,46KÖòÀù]rh* 8ôj¾ƒW~Ǻ6ÞHOiËí¶ÞÄRÑóq‡Tq¼«ºÚ£ò½ØðÀç…Ǩ#›«j¶yÖÇ·òRM7Å—hÏЙP+@…MÍ´Þ@³Ë2åÐÌ eodÎÎ_ce@mcbüÎ{¼H–í~v’.{šÌÜ;²+è¾Ñ¨x¹¤&‘ð˜0žÕ ´Ó…GdŸ Ð|ÌK–6üÓ8ÎÝÃ>Âl dQwÿ ZCÀFWî‡è2à h–™l Å6ϰè²hâŸÊ?‰~­í (/lt$EÏýrÛЗâ@neõ–ܮƅÓãNGNáñH"M¢ä& n‹0SdŸéwñí(g{p§4ÿzÁíæÐ2oÕë²”Aз̯‚ŸIb¸„«{CAc£;Öeß>YÖUiέ:í÷¬Riþ8¶ÊmÂeËt‰3\ïÈ.#)g<6¡Û™^Å,…Ú9ôÎøv²·ß¡Ôc‘o[ÿ€³ÂeØ )Ybm=é)*¡VÞ—¯IÒÆìŽŸM‘š¨%ä'•¤Y\ü½eØ5’ÛÆÂâê~}ÚevM–ÀŽ ÞÏS÷v˜AGÔbM8çq¥œhìü†Û}’PŒjÚÌ’{’Ž0ÊAvšmê³`§Ð}. “°Oü¢K "©ÊÎJy{Tà›Ü{IV&áË\Äðu „/Õx*‹À&1ML` %n$ùadžB Ò/N|°¹ïލˆ¿5Ñ:™¡Û‡Aà|ä–xh«z_ ¯iÁ{ÇSRn›xÔcGï ©O,ò¯¹./úƒZ3#(ûIÏê—žœO´ª‡®êF¯ AsùÉȇ®>€J£aªõ —h£ˆnÙ½®³7„ˆ˜vî—Ž~Ñ Õ‰–}˜UyepR±öൿ˜W3«‘–T$+îBóèËrëmäA¥é"{а p{þœ‚ª~ŒJ›ëV§SÃ7*Š–Sx:È­ºá3ÜóÆQ3Âf•W[3ÚÊ ë#õâû"‰¢ºc†ï°]mžLÍýSå$Ñ3>nƒIXýzŒ×Õ¯ÐëXë\ó~3çÇïe÷íNMnÊ‘93ÑKÎŒÖr“WmÑôÂUë‚B!N·UíýTGÆ· ¤e\^›¸|lRÔê½ÒO \ 6u£q}ã*Ï·¾¼7ÞP´R™c…ºxºßÄV÷,"cœ¾¹tà†éix95 LÓô òÑöKîñrt0ÙŸ~‘¥LŽ©Êû™ ßÏc)<Ê—ÞÎŽ—·?/Èl#ƒ>Bl]+ m7¼ >~rWbÒ“ \o³ÇôÏ;gºÍñ¯a£ÜŸYë’lê2‡)Äf{µâ.+ײt(kÏÀdSš­ñžÓažZÒ:ß™¸|aú\3ìQ5Ø«#XÆÊ6:gÒ-UÑO F§°oˆtò…Ù÷SOä—šê &µáõÁ-N+ ¥ö›ßqá)6ÎoùYV£û™³©oX ¼àeKF¢ŸÆ­†Ìnmºéé½¢ X³pr‚ Ä»‘Ÿ(£,{rÞ²µ 계Oµeò@›Œ8ýä]úöjú»·Ó}H#<,r7îµ®d #ñ`ü‚Ý}v"—LeùäLu3Pr,à¢úì+†Vø“1˜T¦q5Z¾ß3‹¶Ÿb ¿ÔLí3C^¼eö@¬M7.šG_3m.ÜD27´.{ºcë¶€o‚j3…Æ÷W¾fBQÐS†¢’ï„Çåm§ qÏkE?í.·T?·‚YG [4éVh>+ÿìñ2ìäÀ‘Íe0Âò1ò <@‰ó¼®‚3´¨±Ðë—nt8'Ê¬Ž g·ë#Ïâßû2uáC0°ªYy{œBïžA:ù¤*Üî?¿mÖ¾~×JÞ#òSÆj‰‚AN#Mp•DŸ8Dë ο”F÷ké1¢L—¯ÿÖ9IôÅäyóü`¯bƒU_«çá¶è†ÅYR+›Ÿ!™ÂÁ¶ ›)aäž² ±‘<@[àiB£UÁá4pp1*äÆv` Æú?¯çEô[_ÅMæH+ò5Ô±äµkM뢹Œ>Î*˜ÛŸUj+gæ.Ƴ,íþ!mfa >õÇ…¤1Ë#õ7¿›ç¦pzyÚȉ5“ZGÛ•xv¤Îjncµv˜8¡_Ôe½„Ÿr‰;P Í(¹açk8±õ8ßIùyÄ#.¸Âˆ+ªßš¥‚Ý\~.P²òö ž}Oý¦²¯àJeÿU™¤ aWù½Åè“pj”ª§Éð…8âÍLF¦"•LìZÓMë0´drÈ ¥±© ½Õõ ¨G*÷dƒ~• ic;ä éxùåçøJ(šØ¼%i.hJÓVùð©ÿÊol¡hÓÄh¢Ÿ_&àÙv£ˆO÷83)EU&jxB õ¨®%5ª¥!Fê-Yǃ‹+‘™“ ƒ—°óàÂæ;gCn†”#\LÜ[á\ñ§{ÛúȼÎùOè·}"ËÅ:‰V¥DÊÞZÆG{v×ö‚ -¦í~=BªöaI<*⡈wÛsÎö¯ŸªoÄFª'›/­}_hGBžò|­°+líí]ž3L…,+P1>Á_xذÇéž ™çÛ®tßHÞ`yM8<ܼ-Zp=&?BïGÁ´mhùƹYÆØ'Òh}S¯\=‡M0~uÏØ‚%Rhü*÷+E_y×\c S§{êf寯±Sìt½è‘ ![|!ûÄ>Af <Éû‹Èçjßôþ=•"GsXm‰Ñd)4´.$\ú`8"š ƒŽ~~º$26Hï“=$››K|wÁp5qo¦ -C U’uµµNñ޹Äqó5—º4íTx|UÌs#î,”ÔåÚ0è(DÇ÷S¾þ‘’EA±éÀ¹ýÊÇ»Œ=ؽNÌŒw‘AIAÌ.’:’€×nñUlê¡O3ý"»ž<Æ[Ç_Ìa*£Ä(R ñøÞ¨9oß3Rä([Èg ™Ÿ;ÕÀ·~rpƒ{9JD6ýîØD¹ÔÛ õ÷—Sh¥žé¿Ð؇Œ[Oº­½ TdZ#y®Ê˸‰˜Åè%÷ÿ¸DêóÈx?òºõV aM ŽÏ£5Ö¾&!Õø¡ÞáÁ&Ù³–B5±µõ­v±û– ÌŒO³ªÎÑ2”ýhéôŒä‰EßìP>V¹j|sy#å¼úŽVº\Bdœù›& ]Öì°‹Î#9wp[£Ø.·.οíZxúmŽúìÁWz×+«0 1O îû×waò˜ &{k LX_,«ž>r)^?ìå\©ŽµˆÕ©×½)„ ʼn͖ۯc—€7‹EMÈ5\q]",ðO¼sÔXOjÚÁÝLntðXráÐj©ë£±§±÷½Ä¶Žà“T_Ud(Ø"fŠ÷&¼Ũš·_’Å›)PgÍT&R ÜgÇŸ¤A&nbXœ†å㾑„Ë`:ÞãmÔ~j³‹ë‘[ðä>a¦‚·ññ4P‚¹]¸˜›ÑZ³P¥Á?“ÒJ¹7éRDþ@…(¼¶Ô1T,Ù+ÐP&ýv,ÃÛWŽS: ÊŠâı(«¨lþcd öeT¥„¯ú)íåY©ÉlªÏrE&¿=(`µ‡Œ%3´,¤í ƒVÀÙ[‚Ê™6ï]öštÓ°"¼>Âçzg£¨ãi4S¤í’àSf6t ³é¯à  Ø]Ž—7B{+£fÚÛ«ŒÃ±à5zˆ±«‡Ž}õÝ¡eŠ“G¼ҋ‰†d7³Õ]×lBiͲ>Ùs»¢ŠSY-ÙœJíë•>Ïâ V—¨š:Û¨ÿ±ØÊaêÚGuÝ5JØU ¥lwäGmg ÛŠVw„ÖÒnÕÀì¼¹jŸFD¥üí" u±®³«v¢ãă1Éç¸õº þe³#\š•w’-ÖbëÆ…®zj/;»;½{åÌLÙa¿Í&œàô‹¡*m°WhBUÑ—+ŸE¼K"±BtYVð~z|o4JÑ/_ÏÂéâMˆñ I™kË Oû¿:üÂb:[a0ψe±¿5u ‹úi±Æ^éUš BX`}OÓ”âÀp”¢÷¤z¾u‡»·§-ívê…­åR!ˆO8Æü «óz*ާ@ò§YåhÉ™ŒE)䓽œË®ˆ“öˆ¾5Nr½ù›¶È²óIläYÈío«ìÑköGÕh¨²nÑÚš\'¸ pnnO )”¾Ê¬·h5xX‹ —b‹ê/†}ÚM5R£šº š’ŸŠÎã <ðÌô5m’Æ($Z&mÐ,iýŠ´|€¥8GôA5jm*ã wY8BÂêV„é¼±˜g¡ððµEžìš]çjƒØ}ù"n—R„·/9ÓNB!4b OÚi†(³| Ò&¢W@ÝóØf¡©b}ò ‚¢¡Ïx¤²œQDÙsÇO‡C*ÖñY6,™{øÁ5k‡8*ÞÓüæ¨G)ÔÖÂk‰”ža&"Jf|•;…3±t³ÄȽyîó{v‹ð2ÄñÕ4|?«UkÀ†zÀøåǸý´tWTX·ž„Yh‚ÍNH¶ÝA$8`Åot/ó&fu‚Äðvzˆ,±1¢ó}‰>]ʰÏD1°SÉn=aÌ ÐB‡Ó²µzÍ •`¬CfÇN‰ÌŸëj5µ%ݖн F'G$Å_ÇÓûþ¸UÑwæ€5#CµŽ¹/óø ÄÍi©ˆ9£"g0b¸ûèÚ•g„}5þíð®.ΞyÏ€lï=½TÉÞüLjÿh·‹¾®Xö¶ŠíÑã¡èF£0ø€dâi™þ®‘?×Í].ÕãÄUÅ2\0‰Êzõ}â÷ï…€ùÌ›ïÁ ªP´CXBÈí‘ñz}Óú]Ù&šyÄßÖ —0Œ{Ï™ÌãÚlãÖì[gáÄÅbê¡Ey®ª® P÷æN•Q øówAâѷDz5ëñÀ1¹|ãíDÕy•]ßðv²uFêl”~BµȨóÕWf#ÚåÃÐN.žc9ìî=‰ Äœ†F_kAüÀèFRá»/ʃ–^£í·¶Š.”oGß^ˆaˆåõÃÚPù˜ÍôL|ÂJ+ÂĦøä´QàUs‚.¶ç¸ûdŽäﬣþ ɶç·DüÿdïV®¿,ú9ÝjüTÈH-˜óá%8ªä «Ç™3À×|ª!áÍ/À¶ ³‹iäÞvø+½áˆòPZašŽýî§Ü˜¼8!÷„e¡J©äõyJÍ[ØßÕîÙöîN‰œØ*íwœÝ(§%övŽZ(1Õ‰Î'OÅ-\3Å6 9kæ=rªR2åù“ZVÝnÈ’wI{/~o*×#õ”îôrK¿K´ Ã­(VOª{Ù¾ßêÃdÉg)[f¼.!D_QYõ°¥•Ð-9Pè¡B²ÆøÝvc¹÷a¢ÒS%<Õ"'·ï~㇬K,qùþ…[Â˽qÜÕ¸ô—›\¥ˆ˜ü[fûrSÍ#ÁçýÝ{ŸÄä`¹(VލüÕzÙYg*˜äsGûiôl™¬~huߤBq^Îí 9Ýñ§g4e²òP ·™êæñ¤Y/ºßõ ¸:­”ö¯Gš'ÜÖy Ãž]åA¥YŸ‰y˜s÷Ä­5ÓÄV!µÝݳ#êÐ^RÇÄÏ—V4‡÷¨]ÓW;}݂엇L!<›KüA´›‡ˆ†¿jË ¨Tƒ^¶•øD匭ä°8¦^ð·|SúìØx ¾ 7£ìˆGÆ´ Ðy¾žkã)_ü¦g×pÍ%r¯>/C.Xó“ŸsW<ÈEÇ«üi­´P&›à¹¯Òs +½§¸ßJ¨2òƲ ٦®3JðŒyæÖ[í“XÈîçdøÄôÖ2ˆ¡L_T°%ì âqH…I+ŸfL­Cyr,pÀû¢z#Ù²Äåù;7Fuç„X¢!ô¡ –1W«!­wöpjHÕ·ÜkŒ­ÿårïfJ`l9"Hcd¡ ‡ã’eÛgïµUH.w„¶E”†öm~8JiY{$<¦gï{!teÅuŽ÷øõ]¾Èù$ÃNئ ÿЄ" tÅ7No'FoÍ)3H•´/’â¦M^¤ó¤b§y%¯}þ¼>±}¤NýÈ./‹Ÿ¬éƒšd"ùá„Ç©Ï9vIÁЛª¹fV3°V h^OùÎm²_’³ÄTO_ € „#«I=[GgïÞ¹ßõ7k¹Í~®ßrÅÓRø®±|"‚²H6tT¾Äl¬q­ìç™ú•ÇjŠæ½3`Òv¥éP“Þk¶|ÆÑ}×õúÖ’­ËG(T8+Ö=_Gi5|¿[šaúò©@Ë´šzu:¢…‡RêyC±Ça202úùæ÷„ÃMFb¯®Ct°a/æÔMI F_þf°ÿÛc3˜Të ͱ©?€ÑÿÄ&Ì'ÞÙ»uénœ…º>Ø(¡XL­Û©nB$y›´üpG;ÓtÐi#ÙóW¢ÚÃsø7ýÉB¸e‰×b~ñBà©×<â"þD Õemô»¦ :²íúüžt­›8d„:ª`nü¹D!¬³•·íÙÙ¸RV+Í!µ×<HNüñ·¤»;[SH”˜BÑóª&ªè ° =¹}⽘øóRì*þ»_<$òðá,ìmÑyaÁRÕ/í©é<Ëw{(±×6 °ÞI 1W0s”ìBi-¡3SZp½½A ,+xûYÏ ê.)õÃ3MæÞ«Ýt˜?Œì? ïcÙ5íµFvñιL*úöC?}w-Ü|yã×·žR·•Í‘x‘ä;ÀÂ"Êï“^®íÏ7å!¸„%ò“Ô!³Ò±‡‰Œ&þVØ"×Se¨‚äÖóÄŠþ¬:ÅŠP#蟲óó ×ۈžOž¼RÊò“hRTWãU­8^™¼Óà`2 Ѥ»äÄ^oxaý¥ÝÜÎt†r× <ý5P8ÑÈd n¿€ŽšîZ€ŸVª”ñT^B-„–„@©Õ™ÇžéÂVVJ6ï©îü{ÐP7<¶›ã­hîv^‰B:ˆt4ú;Æñr²ºç¦êå€t:» ò8Ž+¬¿ÚÅ$qGó;qØ;ö Y¾ÅÁìI8‹+Õ©UêAÁW^÷o­CJ„,ª;ˆ„¼ûï;Эž‚¯j9ø¯nh¼@b¢ì@V¤ç©^®Ó2ÕÁBï2U+wõÄŠD hßJ=¥n‡idPu‘5ª5Ž˜Ùs;ñd4é÷!H9Œ›¿ïaøMzkpÖ††±`%ï~­ ßÎU-ÕI—îm”u Ã\yCð+Ër.ÏoU•’ 9+:„–¢îø­œÿnA¡öåáטt™ß`&¦cn^9Å$YÎ@M\šápô€˜¨-ç}­dºxÛ‘‚m$éïh({ÞÜ×ÇSgÃ_FÔÞ:ûO'/Ñ( kDló;žŒ7aäYr(¢ù¡ N’ܼ#'cÕˆüê„Yªƒs-):ŸbFǸ jâ³²”Ø¢eT`ŽnO­œ;eF271iæâèš"»êhoz(;ý¤KÒíÈÛ.sßgâºñ¤ØÖ+ yª*P³ÈÁEƒ‚Øe9äÎo¹2Þ1ÐÖ¥ɇ-£ðù¬àèw8¦~ð5{Aü-MËz$ЊT[­I¾°ÁÉÑö’Pk¼œ¨’;ó öªíæýù\³2éÉEã¨eåÃÚ$Ý\¯¥¤ILçrCÒŽ•Ò|-SŠAÜF._KY hÚv·ôI¡ `- ó9—F\0Š ‡ŸÔ›œ_GîtñîoªÆ•òB/ññI|®Æ <àW1î˜{h¤y¬Øø¤Ðñydš$x5ðî‹×,MX+ͤ#§9;J¥ïš&> _Êä¼°ud¾ÊÝÅJ!ë}C‚&Ã…yN¦n8 ³“Yt‡ÕÓ{{¦¥ØE€¢ÿù²•¹y½B§VN­ªæõ{³ 2…+þsÍ€oT肆r‡'r†4+¡Ò™In‰©IaPÈo>ÔEcÂ3nð{êÎÍúZŸ q³!¦rÌ\¡ÇwUKB àÝ@— ÚxÍÔɇF§ÎKCÞ`¾DÖŹ.áÙ:ÂÁ) ©ó..¢áƒÄw<+yîVVqpÊ?ufÅLÔuf¢ä¤QEáËоþüDH±”`Uþž vi+Åýãº~Á<ÐBÁ5É4G<oãæ±’Î׃¸3.Y ¨àœ¼HÂdÜê !»´þ¤covO °5wm©ê’¿Ð%`Ùˆ,îfvÒN¨Ÿ}ª?Ñ®K?_ PÓšx1ãePo½h\¬Jôú,0ZZþfUð[ÎÚ’qßfŽÐ¶9(6„ï²âŠ‚"Gæ»H‹æš½‡EήÇÙ«v´Nx.àŸ¡è¡Š±$ÚïÜù•´(±…±Ë‚+Â%ÜA/}2+:Ÿ"’X£Ò\•”5)‡ŒÂ}S7 °bÏq …”Y1Õ\ "üÝ8Ùµ´8´Ü+[-ïjé‘×ÍáçÒì’ÎÕ9_ÉäE¬”¯Ôªk«ÎÁ¨üJ)#¿£›ÃA¦Éô9ĘuZOBE[D·wËÍg2²Ýðñ,­sòË·™’K5"u>¹êUšÛ‡ÀV*"VpOÆôð/¶6@ÈÒçRlA›¤Kk¤àÐ_§€wçÜBpäÓ}ì¢TËÖ}hüdwרÊÄŸvfbI¹Yo¶¹z˜Ä—¡FÐÐíþ{«6!ñç„#ƒ±OtHÎ&šæ$òjô¥P¨š¦ïªJÐИfº)ÉgÈ®y‡E+L½ñ¯õfŸ{ƒBSè;´þóÀÒYÖ+P¿rcË, Q]½/-H¹àsÄHm‰¦f§¢GözÓ;?5C$’žEÙ]~£fÈ›€òCy|å,¢(4…ЦªIô‹gæ\-裢¯š8`V})cºål\|ñTœ-VTæ°±¾éÜïb÷‰ÉÁ^´~¨+ZÑëgÝd#±ß¶9ˆ Ù¹Ú‰‘ºdVv]×5.ò%âr)ó.ödê›wí²b¨ÙòáÆ¸­ E¼ÍdB,57Y¾W]¸© ¯{Ä躗¸LÕ@ ê°€]÷Ãç‰}IâTNÄb’<…Ž‚8wI^ÀÒ¢ë¶CŽʃž!s±3…еÉç ù•g!ÚITZW|Ñ,<‘áõri£ÉAµßØŽ&ôûAì"®É9æC.sWv ¿˜è>Ç·H·ÿsæÄï}ãŒáÓ3ñ÷vÎ5>¥á†M̹o"¸$}dbÃÇîçÔCÃE ¹ƒƒ!⩼ÒVà;κØXW:©Ë²ÈöÛNŸæüK˜¼®¾î^CQ½ñ´*0êcaeÌlÛÖŒóÈN Ñv^&}î9 —…™Â¥¬M¨H ½C‡¼:r83à ,x Ùp=JQÛƒÕ<YùڭȤѕb§üƒŽîb¦ô²K“×Õͨ3‹JÍ•CøWŒCÌt鄵ÎdKbéÖçÊ_—"’ÌØ¯Ð¢lùÕŽPÛŸ‰?G‹è‘p%'‰{·•!²9j´R§áj…á%mŠäÏ8Ðy2ʼnñŠœê`¬AÅ€ù4+€“/ÂÇaåO˜„Þ⯊߸¿Â¾’•6£\Èn*ÔI¯IÑR ÒN^¨jÖîè×Z¯Ê»ÀX@2ÌètØÀó¼aÁVã DHlˆ-ì¥YèÀJì ý¨ƒ9wÆp˜sÀBTK!çˆÆR·ŸsçÍaÚ¥«¦Dxê*ÎÅŸcçm¶¤<ÔÒÁV£3·o×. @ŠU§dÅ^7 K»°’  ú?ü3ìw\±áƳÝǕթ9¨Ôƒ£TÍ㼩wê-!+DiY‚“Nô†r.6g…C 7:S~/6BóÔ<þé-¶×_¦ÍÌ{z» ÇÍãÅò§n F‹í®—ü|ñB‡_%#P¶µƒ^àèf¼ ^º\˜6ã©{¢=K°·ôJÈ©IØ6Ø=ßúùâçò¤8D”99wS5_ó{ºõæ—-¼<®( zÀH¥N#«sNš$èÙAC|Q"£ÕÀQÊÌS7ˆ;Ðq{ã!ï·íTdU.jyµb°UZ½=šå;>úrb^Ÿ¢;Å„çÙp2 ÜŸ6t(NëÇÚ;rFýÂ:k±ŸSêš .Í]ÌÛWÇÙÞ.ËKŽM¢ï+«kÌÆš›,-w ‡K·{‡¨¼EìÅ[¼xI½«ï¥ËbÕé»8Z3¿ì1·ñ¨óŽ‚ï"+WÁ@¬Í ÍØ~|ü†k—JLºy_¹“?޳Yr}õbsR¬É+ܧÂ¥bq.*²‰ ¼’Âݬ¶ú>DMKU+B‰Qôk…ºt²  -¥n[¾ÆaÉ67Þ·­w‘Ñ'ø©ìvkë’føeˆS`Ú Üüº-äÔ4b€, ›®ÍŒØn(?Üa›²¬d´|¬zþ>Xžð Ÿþº‚‚¾IŒ[Pl;Džú™¾<=/Úýuïn¿£p‹Rl³º“Dܳ‰©«-¼œó-œ@z%ƒ’Kñ¶ ´=EOæžüS ˜:GßeOv.]à²Òß_µU·œøãñ‡‰Úøì'(,R„~Cðaúðg´˜En'bÛz~*˜ÝÚüK0¦2PX¾œ;é0l Grêx„ʦSÆ©î­-¼Ñí=ÙnÌTO]¿ñ ›•(¦ÈCŠ6E²+Y}~…ØHD!¹»>{Rý'w|žLÇ®Ý4­p‰2í¢}“´.%kˆ[Á¦n.bˆSƒ]p}Ø7†ôlÛrŒ÷"Ï»ÇÕ‹`NXU¬N‚¬'Öù“IºÀ}¸/ñ%1ý€x‰qFîò±_ðgýz«×nè²ãT?ì°+Ÿ+Z%Kû–¯‰1†›V„ëì†1û=Ð/å~ˆÄ°ŠÆª¾¸óXU]Vi yå{¢6ÏÚ2xQ²¡§v¦~j0¿AˆïU%í[¤ñöƒ)7O³Wå{|ô‘ d‰_7?†ƒki©¤÷0]qŸÓ>ÜéRRDmðI͆Q¨6GÂzVЇ2û!oÙKU÷&éZéœO±µjî¦ÐÚFLSØÈz{±\(¹–B:= ³$–gV%A®%ç}S±Ìûó6¾—P' ÍLMPsÍ÷!?X5K¢'x¹Úò¤~‘œSŒ&'|!•Dï ÊÖ¼ðÉrP@k¸¿{µý‰Â BsfX×iŠk±°šW3‰?m(T²œÅœ»bâëS}ˆãðh0œCŒv®:‹>‰çÙÆ(GTåþ ¾|ß„s¼êª\ ]¢‡±ýH¸Úäï&ÊKEÄ·‰˜‚›ñœ:Ë…ÉCUkç´µ/%±Û½ÃI Z¡d+žÆ¤Z¾Ë¶Œ²OœRuåR½ ¿»Ål³™\ç"¶ÜAVÝÌ(Yâ;ÝfLyzx\8E¾ä!Éwìø Ï‚NÖó ÊËS-›´ÄcîXœ{¿›=G‹T¹ågä`Í ¦êUÔßéS­ƒ |º¯ùbûºxƒ¦{Kˆ›B¦_ËN¶^õ4PAÕÅ‘ídLlgò܃Vûr3¼qšJ»½¡gu|û¢1êO¥þÙ>3Rª¥ÏŒIÏ!AÔþÒÚâú+uOÞ>Á‰R|Æy9¸=ñ3@€¼)`uÔ“Ôƒ!h­ç[¬o:™¤ï¦ãhÂÖó:¦Íä²*ɯ¤àAŽ¢!¦Áq=øJ'ÄÔÓÓrµiw68ÉÉþè°oa¯ð÷šÅ¬§'™” ÕDdiû°Å1­…އÁySÓh¶¼<:ªÏÎûà°4p—ÚÆÆ%ŠØØ[öò¸¢WöêÖánß#“ƒ‘)‘{’cNi£9^„ujØïxcg{ìÁ}!¸oY8v¦™Þ"ÁEzcÖÕ-¹^}æoôÆø2‡ßÒlŒ¡¿¾Yâåe.žùЇø®=yŠÔÛ­vb\”@ç›"­% ôk·nÃN9œnÌ}qÿ2r÷Í=•bE„a¥à™ÍlL©EõŒ:E“¸ $©¶¾0$Æ’€…™·ëЖþQ¡Òt*%­”¼ö¬–¢JÒÏ›oå‰*+p Ršï¬0-”cJºTVá©mOÕe£SÆ'¬¢LáMNïÀ=õ¼ Á±ö9åM—JÝUˆ:6­ÃoÈhtT—ÓBuò]€{¡»þ•—‡r¡¯aÙ\Ò§s8VOnK{–^{›ÓÊ3tî ¾Füßê0¸;¿Ñ³»]9‹Ëº­©}Åt@¶LåQ}¿bO¾þ†TfÊœÈÆ P0'ÂÎ……ؤF_CN:„Ù†€—ß?QjWRxcË¿É? <Šqöd*ŽùÍÎ¥jÊSeð-žÅŠk^ØÝ°V„$lJ1§ßNÖµ®_7ì ªçšÒ£úPÎŒvÊ=XUæßpwMù8:uñ¦ç¾ÒXÏT/…Æ—€] R‘è¦àk•‚ÊûŶŒ• ɸ‰#sm{…ëœBŸU3VšÉ`š‘TöÈ—°Òà©5;l&]2—D¤ú˜Û÷áÌ,åÓ¿DËÀŽè†ðäBÃ>®D÷¦ð{ø–/j/ íÇY1ãÚZê°ðoع(û°&•^ ¯¯G²@ÅÕÇñMëäq „!1PÛ½=F«YY'¬›š[E=+ˆ@˜Ð¦Vý<ôç×b«°O<øf Ó’×|•&T£oÕ©S¢˜ñM7s/f£ãHatMÔVÁ+å=·Q(f®eA›tO2ÏžÓE¹ f5¸y@(y+á…kFæø dÐ!æ{Qkp¸oÃp%8û¹ûÃfª«ÉèQ×ÎQ‹>á—¼¨9Ís]¹€=?=vžYR^¾C¤˜•Ô7ecáƒ-D~¯Ù‘)ûB@¿Pó#d£ÐK…0 RT*,˜?#v"œ5Uþ°v~7ú{zÄ|šÌK¥/ˆ íÇéda÷>‘A¬¡ot—[¥bÂÌﻑLòHHîN}ü]:*Ý—F↳‰¡3¸ñ#½;ö¢[¥ej¸’K[á{Éò§â‰žKÜŠq6¯u5ñ!âi…;‹Võ°‹+“Êßùцø¤|OmÃÜ$®¨òqš;äZ·„8kûZ7%Ö”Í Fa!®¥û8”Áò¼hÉCF“à S‰/"­9©Á¹­í…É_;aJAQ±×úK¹|C›Ýˆ ,fgT¥­\ïѼ í˜pPxÓï7/ã݇à} æãÌ}õ(òk~bÑû'«EüŽW[C}€êÏ¡mëQønÒ‰ZÒÁîà+wn V¯¨ŠL\™ ÿø‡g‚Іç˜r5†Ús  3A²¢d¿g½Ì­O!}ÝêaL¤%ã³&ž¥Ç°pë½udz×L¦¹”àÐìõ=8ü…õ­Jõ™€7\CO«ÿ¤ž£lÝ<Š6$ëÆ³ ™A- GB<Üê Èú|ª ñU¼ÒT &j¶[þ–’i5.ͨŽ“^Ee–ŠCm`ý¥5‚ó\÷Œ÷åÈ”Z¿Æ0‘â§<=SÄ-ÇKº:èrÔ«`-`ÞªN¬…¢I5N!%Yà "µ¡ÀôµÿÊiÁE-#Ù¹«é·¯<²b¡wó[s‡¿y­[Ùjj°e¶„Ež¦ªÚkx‹$:ûø"¿(€ó; £ÞôH±Ã,x"¢høÕIÒ“ Ûîœ=˜ l@î&tJ‘ùÏ6f îzäóí4wnÃòÈeóäHÀaw}é±ÍÚêN8+6“ʈ“rÜÄWÐ žSEçö9Àï]©$ÖñŠìÀz"Ï;údWƒøHÐMͰϙcâDDX¶þrùV¦Ûî^Ÿš" ƒ,h+«;ùûŸyGÅ­'J˜hi»ý,usT·rkØ98+‹QÒÌÔ;ôð“!;†Zž¼úBÄßO~5¼iOÞŒÿe ؉‘'kÛ¼Cëp(yeC³ÂBhƒöç#B[ãgV`òí:dR¨¦Üv‘¦þ¼$~-ãXç9´v`¾Í}3Ï’.B>6t”Æž®wî´Ét^aï\ÑFonyRxNZGºÖ4 þãþNúºgþ'2/kÝ"òS8&ÍTÝR³ó–ÆñBÔ,C§ÍMªs w ü¸ð̶ÄÐH ^tøÜÓ½21"Õ/P‡”Cœ)ÝÔë\Q‰\pèóÞ ©»ëŒöSÙúÝ=o0¡BðÌü à#A·¹û¿„8¹­Nä]O›:Ä{nbCȉå^ÐcTñÊÁÊûbÅ(‹ýƒ!Ó©ZT°zçLÖí대ŒcϧË›‰@?:ðêõ÷Kþ´íÜð!ñõ—<—cÚ[I^zûüMñ›ì÷ÍòÅå A(O:)BœÚ”b×Çøb×”4OÚrÓ;¦G©·ˆ«¶pC!Ô¯h7ü§ÈÏ…š›«Þ,6bg•€ì¥]©q]ú/ã­Ïüóç_öÃô²‚î±{iqÄ2i¾ÌËTvJ†.R…—¾eŽïÀDo à ÚfìYAΟã7r¿¶ã‚À“{ y]ò@ôA‚G?´v=”µH(ñ1™ÛI}æ{ËN»"Èʼn»ü’@5—P©Ž3ç;›Æ)‚»‹3NÍ&æh¢!Ïm8—ÓÍÜ3.:ï.ñÙá]Fú¤àéqFX§µ5áföw&uîsØžP ¯;Óч†—5¶/®üj:ý,Tê ,Ív˜ ;JžÁŒßò×Z;Ϥ{lƵ’§¹ÛãZsÞÑk¿%»_ÿvNb÷Wqo/s7»ç6ƒŒb’J†¢å=ê9œvEò °Ù~æ¨àMløì4-‰ÐDϪ©æý;ø ð#ùgjBjŸÇdp5¨¡.‡Å©¦ë¤êÁILˆïÔjV¦ò£„­G“ƒÐˆ/Å|ÃŒnç1 ðhvÒó `‡#¼`AnÒZ¦Œ™®6y‘* ,€oÁ å ÚžÙ˜´¢a’Ûµ¥‡¡¸Í ³’£ÕþWÂZLÑï;Å}ƒÈ¥Qygø_&Ev¯JÔ`"§a<Ö°ªB›…ã×GM«8 ;`|š˜¢®HÉ Q›@Òüìê‚(Ÿ¡ù|ÙU[tœuû»Û¥ËÍEØ™n©ð=2!µßý毓^9kaK§sÏ×ʺOìŠ;œÐìs¾œ‘Ä–H˜­’™bû$¯r‘ÏkÿôåÈÂGCŸÊ° Nss ‹“)ð¼ÐÕÐ=¡«s:O[ï&£e¤–o€G¨ú¾ n`^A4Øqï[kŠäŸ šRkÁåûÿ¿°2ò endstream endobj 3530 0 obj << /Length1 1439 /Length2 6366 /Length3 0 /Length 7359 /Filter /FlateDecode >> stream xÚxT“ÛÒ6Ò¤JQz@zMèEz“!„’ÐAª4‘ÒAéH)Ò¤KW&Jo*È=ž{ï¹ÿ¿Ö÷­¬•¼û™gfÏìyf'+Üà»Â*Ž(˜& ‰‰åjúw-@@(.Š‘qs›À±Øß8· £rÿÁPCà X¦Áâˆú($@Ç ‰@Rr i9  ÊþMD¡åêo¸#@_ ƒBÂ0dÜj(?4ÜÙ‹ÛçïG”’••úíPq‡¡áP ÁºÀÜq;B!À]Ãúý#ßm,ÖCNTÔÇÇGâŽA¡ù…>p¬ À†¡½aŽ€_% î°?¥‰qL\à˜¿ wQNXÀ8†Äà\¼Ž04·;à®¶ÀІü‹¬÷Aðçp пÂýñþŽüí BQî¤é p‚#`CM=¬/VA:þ"BÎâ # 8ÂïÔ!M#WáŸú0P4Ü‹ÁÀ¿jýwÌHG5”»; ‰ÅýÊOކAqçî'ú§¹nH”2àï•éèô« G/QS$ÜÓ ¦­þ‡ƒƒÈþ9ðI ¬””$óÀ|¡.¢¿60ñó€ý6þ†q5x <N¸2`Ap'îƒ,ñ†°h/XPÀþ¹"Žp(às†#ÉþÜþZãú†û¬€8ùÀ_¯=ÙàæˆB"üþMÿÝbQKu°†‰àŸ’ÿeTUEù„Åd²R@’HKK‚þ ÿÉã?|µ‘N(€ì_éâÎéÿh€ïÏ€ðþË…S. À÷o¡[%PÜèÿ,÷ß.ÿ?•ÿŠò¿ ý¿3ÒôB ~Ûùþ"ü?vˆ;á÷‡S®7ú(Ü, ÿ›zö×èêÃá^îÿmÕÆBpÓ ‚tÆ)Z$!”ø ‡c4á¾0G0 uùK5ᦿæ GÂÀ( ü× ƒóÿˆ2¨îÁà¤ùÛÃÍÐ?÷Õ@BQŽ¿†MLR A£!~d¸^ãV’€n*a¾¿Å A¢°8®Æ € Mö«±b’Qˆ‡å óôÂ5güƒ€RQúߎè€;LÜ$ü ¢îp¤æ7ð¬ ^h4nDË—òßëß÷ æ ƒ’ÍM£ ò®µ­gÕ*Ì>ÂëÃDKËí1‰½Ñ’Xž™§.zÄYZžªöŽ/n=Ï–FŽO2 ìžøZwæ„.¦ßÉÃâiô®ªî ç|;êt†±9¢˜œG¥ǬÒì%±RÙ[Zñ¦Ü›> Ý%¾QùéùE;fÃRv à(:¡æHgÆ>RÉmßÂhÁÁµŒ´°¦Ž¿Ž¶Êð2Ñ6½À?Umcüæ·jŸ9øáÛœ¾ÞÇ⇺ÝUR/"iéüu8r‡’ûé“rt^bðxT%OÔJÓ9 Ý#y ì¥Lô½Jê÷jp6P ½fxÿm£WJrZ!·kñÅn-Ûä›(Åͦä¡êÇ\ªÜUŽx'ƒ{U∼nB6Q]ûÂ¥þ$ª¸äÔB¾1Žø~¸¸í§±›gö²’@b6i ™þÏT¥À6!§{óç·Ó´LÜ´`m×e¯¡[B"_ŸõÂËÍÙSÇŸ›Þ´vEí£¸vYé'BÍÛ²¶z6“^jKž¼£1ÐÂÖèΠ:ìør&ƒór Á¯Úµä-•egÇ8ÌÄ©òMhfLô6ð2 H-䨄LRSҺ햲VÎWH½}ªÖ¤&¼¿0¶EÝh;ºfõšQ×·«¶‰è}Q1[ݼvKûb^¬D"¼q+ñü³ªÅDè¾ôôbžêOÓ`;Ú’ûÖyN~ÄÝ8nØË3W©‹¶DĤvL¯Ú={ËÚfÙÏ’ñzl»»7mÃ÷NÃ÷Â}Z‡A-¹~ΈBDyc‚d‹Ú‡>úS«>ˆ^ëq ºë­Sãñ7rÕ©¼ÄZ¨‡íçƒ=ežªê€ëT¼³dÅW_è‡ðÈ’G›«S|•¹Nk›FŠà¹85’­!”tç ¶¬¸6ÅÒÔ}×òØ?éfù@ÛRÃ"ªÓï=%( Ó”ùá ÿQÔÜPêŸ ª£f÷þÖ†Í=Ofõ0ýf¢h ‰¥â£È&š‹„©·æ`}½ ±U;±æk/šKQwÒÈ@7|'é6y;Z½_¡(ÎN¾ß3`g5ÎÒH=,ÚÉlN˜Ä?þÁ“ºš`×¼d°Ö£Á7vU²iæ:½ ŒBP¨ÙŠ ºøH"X¼¦Pá‚N£7sô·vØë‚NJ,PÅhÎݶÁÆŸlÊÜ#רßÁ‹#tË &â9´¯ÅÕNÖþظùÕ˜æ§vòž|fÇÛƒŒ~/e¾[eX·Å´“×LŸæ®~ýj_×,A¤µÉøV0?ŸÀ&ß¹§RÒõbE¾ŽcÞlqì'…ZË ]¸ªîñ‚wKîv²RW]*»|jNÂÐ{E¡ˆ¾ÕâòvkÎòoiY7Æw®z«¥Íæ©»1RN*Û åö3 åPµ¹]gxäà„ØPÑ>Ûâ—ÕeúÌeÑ9jÜñwãƒžŠ‡ûþHd‹ݾ;h Ö®s Ð)Æ0= ß¶¨jÍßÝöîLµÊoþ1ËÖ¤Çm˜¯¼•y'<2åúíE0o¼Î³¡…`ï¤)¡>®zNÓb}¥ãº-¥åéioÊ™ `&hU‹*Eù¹A²¤í¾xZŒÉzŒSK$€ÉϨ(*¼Ù?¢ž¢(=ùi‚›òi„ùóïÉÆþÏhŽœ¾DÙÒ¨»¼?¾½V™¹¢š6´9ôýuß\.F̉WíÈoq¥Ú®¿r²RÙÊ&“Rƒd’öä gütE7ú\ÂÍPáÆÎÏråiS@rÉ{„Ð0JãáâOnøï2(¥I< ¬æ9ˆ¶O¿¿™ý"%Ã…Z*éÒ0ڻˮ˜ÈøËÛ:ÙÄ»[ð‡‘Ç)ig"ói3Zê´µS¾°Î2ýsGßš÷,›¬¹M(j®ƒ9nöý r÷¡U–çL=z”2£¯çA‡ŽFQtsø±Ùzw ßµè¾?>jÌåÏøJì™+8³µðKë~U˜—}…ŒÖNÿmÜ…½°r1ðºÑ3ïqÎhÍØI)önÉÀs*G¥5æô„´|áázNÝ î5X¼ÞÑœ½ýY5¨.ý‹[ÝB7ñ’ñßüÔ¨­Ø,75_åübÛ=â^ÜÕD {8jòÍv©£Ñz ý‹ˆ|¿'´) óÞì×÷ï'>ÏcëIÕh€Æ¿«#HÖïÛš}qÂʰ…}@p~–9V«ÿâm°»Á©%D^´M±Kœ—kÓÊW¹‘ø:.U0p£šo­Ùlê`)V«¤!¦ëÄ|Îg·£ðC‹3€·Lb(Ò\PÄ×q³;­&rÑ_ô}]ãœÿ„^·eD`sŒú¶> aªoË@ÆX&˻ߛŽTú—£*H¢ëÞ,3Î6©¬¥6w¶aí5#w.ò­ðLB}1#ú¬À1õOa°Ò„"§¢v<·ù¨›lgw@üÒ$% pÎGcÝ{a\@ÖÙŸ¡õåÝfJðŽë×cü6dúz; /]ýL²…v7˜¹÷z¼ÌèYüÖYm1é(ioöuKÖYÿ«¯ÖM¢ÕƒE{°÷[’z3"¯£XvËÆõ¡G§´æ£\«LwtOh}]ó[DH…ˆ†Ï@ÕÓµäÝÚÙu½=#KñÐÓF°0uÜzØÆ{{Ì¢m‰&¼ =£ŒË“мõØ1êà9*>=ÀF­L‘ë'&©¿3ÇX´À3T ÞäUרwÂ?Bw† ‡_ ezu}Œœ?<òÈÙÒR†‰LÇF?éÚª!×3‹¹üæòüÌ‚¡°á¦Ûá,²O|UjWiôÎÌ´æñú¤7žm˜“Œ/é'bž@À21\Éð‰¥À$¯èĤ›WàV^þ6ÖõCpy 3è£L«’u™Ý3æe¤ôžÑnÿˆÉ›:µÍ³æÏ™ ºÄ±Ú~Àžög"„“·bz­Rn=g W¿¥ñ.,ÙãJS ¼äkÍb†÷ÚpÒq)¼öœf‚ÀI6\ ŠyÛ\îkû†bk–œÀð¢«þð#únÙdH²«¼ ký+`)ÿؼJ²swµ®Àf¨¹nþ‚Y#¯ÿœåÑ[Öy~RäîÉ赺)“ÖTšîÌĽ‘%J­½Ã/¶êð’ «¢}9Ìí'ï›Äº8èM£¾fã¥ß"ú&i±å4n»é  :=ŸT¸ŒËÂýžé’4 w}Ædɳŭ­§± :{¨„U u*º–‹IÒ¨ „Ig"OÞK¯jx<ËB,òET³„™y yXŽ5ÎYn‰Åádñ‘»01vP‚CžÂÖ¦Ý=wu¢PõÊÕ5+é¡—vû›*ÁâÅ+Fô_:TÙÌŽïsíËj´0$º*=´Q”~àsµÊŽJRü´Ps×y²£Nâ‰jæçµìm•’òëËmžµ£ûCTìK¯Ç%ˆcÙ¢ž'Ží‚*ÁN7ß‘V MßíÍ“:^m½Êòý¼Ø*éC§·ýGòÖ†šnwûžjq]æ1GnŽŠå7\{›ú²äÆûÑvÍáÌThuMVR˜ÂÍN7®° µ•‰‰nøõÄË´ð)ÏÍ=Ìò§€6µ)wðh»?ÎýðLÑœã{ì`PyÁ@yï’sÂLíÎç³'2ïÜnL%]½íw–càEI%Þ,,ië)êÛÃÇÔöD#Äj©›ÜT´m¢øoèŸQ7Þ-øti‘>‡l` {DD”™0ÅS"`ÏÚŸÄ{UÆ£Z¹yÎór ðöÒHïóǧílãL;Õ×/7çÊS¡”/Boçß÷ãu߯ÜÎ4ý*ëÁa׎_lÔ:ÿu·È [«~oùj†"%~oÉðkW›úëÈ#qsE|¥9õƒ³WÚ¬0ìVâ'~†Z‰=Ã{9й³ÚE‘ î³Ò|fó<„¼9‘~Ëñi€F2ý`a÷CŸÐ9ÆåL.z³å &lΉ¿—›—ÄV=á>Ô©)ÿ{õ+5Â{éʇCG?ÄŸœ<ö`GU=M1ú”Cè°\B/êqt¥áè)‹IŠg»æ¸ ¡ÝÏ)šää­Ñ;âËwÝøùÛS¹D¡î‡«Vpé·£ õ[9Ïx.<ÍCL® ±·™§âÜEI”JÅÜùs‡FŽ›«vÒ–W Îünñ­VÙsÏ”1Ss´±åˆy0K¾ÍÇNªå‚Sè‡{K{VØñygC]–GFϸ¾sÕ*Ð1} ›ÉQÚtT‡òSÛˆ—1¥SnN±Láq èÝaéfÊüR˜+¯æøl9ãêÚ£±Dçz‘§IÃDÝ }€aŦíhñž®¨Y§·xð¾à?!ú™cÇžESÀ_3Å×ü=»°áš¾~ YC]…gŸ7OcÕà©ÚÒº¸^£ž%¦ÎÇìÄ€im­>ç>~ò¢4ßôáãͯ¦g`ÎWº#‘‘‚å­í0iZ%`9_Ú Ü‘™9K¯^ÞÙX¶ó:Ÿ…¶pb¾ò뮼ýýÆ'•1’;rõ•O—-î°:€RV^Ýéhò ï7¶µÏb¤"{Ê¥Yò.ýŽúÜ¡“’Ç!±ßøãf:ð"·¦Â«°®þ>Õ(¢“¹“|-ÝY°KÝ}ƒz«&BíA»Íè5’}ÿÅ 'Ò ÒÛ“é©qç¡Wì%pßÊ iÞÖ‹å\öAƤDTaÄóÁÖ%!4+bnN#”—Ž´ø“`êÍúCïåÍŽã`Ý…{9ú“‹âJ3 Jõm¾ÉÝc”§£ñfO|@qÕ|Eþj„*{2iL±9m‚xY[^)Ãäy4@äÚK Ã6Á‰©ÍZex²Â¸yìÏkÉ’õ¯cCÐ!úXE?…ªHÕP5‚öû¶mØ^ftM>‚·ñ¬·(íüèŠõñélÞ‹^(þVx>8…G‹¥Â?ñÒò—×u–˜?Ä&ÿÒ‹ŸóKü÷÷wÓÒ»¼Û†öÏ¿ªÝ¯SêÐ %š¬É)e*R TÜ Â?|¯k4däœ,WØ =À|YÜ ÷EéØ,Ï”q¼õ9—2ü ô07»5,I³_`¶2TZ'XASø²âÅësVéØ:SLXVåtiŸßÆú`O ±I^œšä¹ÚyÅ”¨‡Zò-WBÔã8žÀꄆŽX’ûi´ÊÖferoRäWé{¯/ñ¹ÞÀ‡¯.(F ;Ù6#6½FøoïÝ|`8›ÄíN)÷,þÅ>©±Uû± ”Ám×[ŸH~ò†mô´‚^ÐÎR¾–b§Ú`­ü:Í'7 K¨Q:y¹Jk™)Á¦íEXÚûùyWé­r\ŽIE*`ŠrÂÉݧho¤ô±àÍê¡—zdNJ eÐOÈEŒ¬ÈÅtñ« &oU¨`°F‡ ù€dQ4Böؼ¬8†t>&ÕÖÜSê¦Î&Ý55öQºŠ©¹[~,7”V u»÷Ý­° ´ ȼŠ7¼v—µˆ!‡Š¾ë¶iqíŒÁ‚ŒÊÑu3C)N¥Hžy‹™é }ËkžæH/+¨!]³o°FD’é'ÐksçÞüD4ŠñZßuî«™xúBG&oƇø‘Dé'?Ù}P´Ç_2925zÀO¤5•P7G{\ÁT²+‡/8³;STcŸÄôÎwãåUm KSÄ¿u¨^¯ ÷B¾"àz¹¤ÝG¹y™ggHûiÿŽŒ=ƒëõ’}X°,½‘hOáº~,$Wi¶³`s¢ºá õ¶ËMl‘Ã~éÅ—W›åv›b·ÇφÓû ©·±,]eÕV£95ÑŒ:ù?K •Ÿsë'i‡-~¡À5Ìz…GNY35‹:¬Žwê›iÒ%/GÝ´×ÅîÉ*:¥•¾Põ4‹c£Ë/[ò]Ë"‹º9‹ë?ï&N“åõXÑOêźäáÇ[\§¯ãŸEIJ»Ñ/ýL¹ÅL|'ÙO¨Âw$ðS…ñÝ)¼“{[S—fu-jöêðŽKñµfK©±›ðÜ…Ç]î ß³¼ž@I0¢s“÷eõé BÉÚ{ƒõ'uD™\ ×™¡äx-§Ûn,FË¡»(36Äi»>þÍÙó§,°ÆI£OÞƒSáç tF$ÛM ³3¥6´ºKjøí`Ëþú I±GrF@ÓR‰¶Ô µtÝ 5QŸê'îtÄåïï¾ãª4úÁ6®¦w\p”ÔÄà›áCú±½ˆõfÓböUŠûœk)ŠÃ‘òö„T½äÞ?¸ÏØç«L¬v ÓD6{a0üXN­Ç¦L®–ʉ"üb÷±Þ¾Sr^ŽFI ^–~vtµ&Žœ)eÏ7: #mfU¾y¥|W¥ÌkÕ¨;ÔuÙ ‰;£œ²ùœ•}lœŠÌ2‡º¬6ƒïoÅ4¿}a³¥R÷® í_1Ìöž¨bi»âMNæÿ}ݤiñûpîí“ì+VÙþ~£ÉS\„0Pł۔äcGc•m{¾Þʉ Wýî)vìG¯)~OªÚðSþÔ{Ùlºüä÷_ Ýwäû¡éû·ýT¤K<¾ -ûW•K£Þí¥‘;æ.´y­mZãu ãâÌ>åõÚ ¤çP\ÿ¬t£»õ™íTeêMþ©Lဗ† ÍÕ†ÓßŨKºê©|ß|Þ"a6ê%9öQuKZi½¸{ñ*7›s¦ ‘í°â/ß\“¡í7e­1sµsh3Æ]â¦OþR™H¹ Æóú©xZ¢{0{÷ôS7kèÿgQãþ³Å¹×eœ7żÈ24`É’g‚=sÕ˜bËC^&ºšæâ¯7¢j™Ž÷«ï"®ç¹öž™ü‰½ñ¨CVîs‹Ðêú[ÐåÇFlœ¯ž2hl ­ÂÌÄ&hôo hùé„Cu ýfŸËM0™Î‰7)€¢gÞ¤pRuÝkynxñu¿tŸ«Ä£ˆ©è¥û80kÕ@ii¸—åí›ë„ä:D A§(YhÓÕ¢¤üʉþB|u{z,kȉfb¿ã.Ÿõöúžk¡…{tmZPFþLö—A¤qÀîÎ;™(¢E÷íÂøÞÁymDØ%©-ƒ®‰;åö´rÉx€Ü‹¯’Åǃx}˜Â9åD“†³„œµÚ"R½‰nÙ CøÏv˸R‰ÁÅŸÙöTu¨­vê€d¯Z!Z²c´\òSrçZsf}k‚"4s¹x$è­D¿&˜¾*EïÞ<´ó¢4<' endstream endobj 3532 0 obj << /Length1 2304 /Length2 19940 /Length3 0 /Length 21293 /Filter /FlateDecode >> stream xÚŒöPZÖ€‹âîN°ÆÝÝÝÝ%84î4àî4¸÷àÁƒ;w'8—3gfræ¯êÞ¢ ú[¾ö^k7”¤*ꌢ掦@)G#+ @\QC–•ÀÂÂÎĆ@I©a ²þGŽ@©tqµvtàû‡…¸ Ðô.“0½*::äÜì¬ìV.>Vn> ï ]ø&îÖæE&€œ£ÐRÜÑÉËÅÚÒ ôžç?4f´V^^n†¹Dí.Öf&EÐþ=£™‰@ÝÑÌòúŸ4V 3³‡‡“‰½+“£‹¥-ÀÃdPº]Üæ€¿Z(™ØÿÝ%@ÃÊÚõo…º£ÈÃÄxØY›\ß]ÜÌ.€÷ìuY€²Ðáoc…¿ ÿ>+ëÃýÛû¯@Öÿr613s´w2qð²v°XXÛÊR L OÀÄÁü/C;WÇwwk;Ówƒ•nU˜¼wøïþ\Í\¬@®L®ÖvõÈüW˜÷c–t0w´·:€\þªOÂÚhö~î^Ìÿ¾\[GŸÿ…µƒ¹Å_m˜»91k:X;»e%þmó.Bø#³‚œ,,,¹n ÷-Pt|߇ÿkª ü{uæÖnöÿW+ 2yßQË÷‰fdå`báø[ní*eí 4W±™Yý=5Ë5ÿÚ7;k Š£«õ_/Ì» Ëÿѽ/™™íû+âú>šÿRßwèóJ:˜9šÿµllœ\/„÷»~'N€ëûVš=ÿ5Ìf&Gл à½G?€…£ Â_ËÅ `ýKô7q˜Åþ7€Yüñ˜%þ/€Yò¿ÄÍ`–úC¬fé?Ä`–ùCìfÙ?ôž]þ½gWøCïÙÿÐ{v¥?ôž]ù¿Äóž]å½gWýCïÙÕþÐ{võ?Ä`ÖøCïµhþ¡÷Z´þÐ{-Úè½?ô^‹î‰÷ÝÒä½[šþ¡wK³ÿç»ÎÌÑîýâÿ#áàøKboÿÇÿ¯‰`6ÿ¾÷ü¾7gñÿ"ëhß›µü¾G·ú“ë½[+/'+ Ã?,ÞeÿôoÅöø^¯Ý?ð½û?øþð0ÿ Åùîêð>¿ÿпWîø|¯ÕéO1ïÎNï_Hv@ Ð)ë¿¥¿$ÿ¿ßŒÓûûáøsyÿ>fvþ/²¿wêìæš›Úý¯/;ï¿5ÿ+fe}÷pù¾„ëŸfÞ•®ïòõ{œß7“äñÏÞÞ›wû¾Ÿ›û?ð½ÜÙ»÷?B³½÷ìõ§ÕwWo Ëß±ÿgíÍÜ\Þô¯÷ùýMøÿë ôš!,Í;šñÛÔ·ß׈x0îN°q ^EÞÀiïHâ»ï«Š <\³D-ŠvÏîE=lb³•¾5Ûêà°Ønø¦Gñá,5´C[˜n3øNa>»*¸±íÉwué³;˜[✷¨ {܈ÌÐâ28_îÎeJ PµTý®´:‡¥n:aB‚˜ˆ‰‚ÅãáaG‚îÍꨫ™í”¥p½™8M"’:|Heãü5¸\În½•Npt„ì$“u$ô堗냼ñ`†r§Wï)ž&ð¦=ø3©ë˜º09¶ìÎÔ•ÌÕNŒ¬še‹ÌÐ&ä@¤øf<ÙÅ&¼èWOSê_†üt]¥ß#—R4мÙ9©Ë{+*¤1¥àûᥦO‚똾¢Ëû*ÔŽL'j¸¦dϤ1Œfb6©¨_û,°N›ÁF¹ÄZ3ˆumû«åÄÀÚ,Ø­N‚j5 ÛûPe)IQ#/ŸˆÉµ }¹&ÏÆ¤y­ó°ÓÆž˜Û©™[‡1™ÁjÏð‡úÌsçY¯ûµG£Œ¤Ãûçz#rjMÜÈœL ÕSKKðò-÷›Âü@Wm[">øT)eSº3·ÙƲA¾+ù®èÓÖ3/­Û„£aoÁõáxÞϵ'Öo™©vÙÚio!Dšµc ‘ˆ~“yÎ1†f !"ßR|ÂëG¹z?oGÊ©wÕ•÷×»ßR$×ßXדQ\Ö)G#äg|ÕZRM>[;€c»ªøÆÎUîV^::aì‡Qçö© ®ìqåvA*ïm×n_-ù¸¢`)¬“)ÆÕÌpÅöÿ6diâ¤æã²“Ïy³dò$Ë_ËÓ&²éúJõtª¹+§tXüýÒ`а0ðYôh(&çtÜ?ÐiG»Æ«@½.9TÁ[é¼jò(b0!áÖúÉ áó V1Ý{_f±Kc 5åÖ¦8E8·ÿ‰h+ÆaNÁª²ªøI„ã‡Fœ†ÝÆ¢êÜgUiºGU»½8Qòð*nmOíˆ[ Eªz’™ D'-o|R²ªŒ¤d97^“¨Üݤ‹u>»\v@âO`¾¼ÓiÌ-ÍRû†ä¡g^cÍ~Þ«•¾GFOAÃ9‡âË”¬öû,ÖxQúc¶çä"¡"¯+UÓ7ž3%àBÓ eÒËWT8ïÄ9v)QÊc‘xÛÜØŸ$›×?Í™ * r,¯û?²Þ  è?EPn$9LjÓaqºÉâlPý\7/…/´Ð®iU¤=@w±³‘ÜB˜^–å@k¡@4N« P¾-«jD> J6~9´ÚÔq•%«ß¦ÜGMO#›¶:kxkŒÕâæÆ¨²"ÏM!'H‡Õ˜œŒÌ!A)ˆƒ[fÏ~WS{aÏ_ñS4ó3î½JM(|ùœ.]V­Ïl5íàb0ïYÏKžmkã—05@ñðu§y¨ëμlJkË ª©¬@·Tè‚®$:‘c"bÔʘϒ@Õ2£pߤ´™:ÌKÖJ^.AwI1TÞž…ñËËK?PÊ« V(‰æãEŸ­*êqÃ|9]lûa>í{FX'_¬°zš 9[ó-x;›å—h}i>ö[êWY•¥~U“´Zý>ùDLØî@êtVàgÝÖmç,C]˜( Áöx‹’ÚW·,ªšŒ Êy×·È$³Ä¹eï`ÔN©7¯8F3ëÃR[Òrbý(?äÓ¯ ´Býª›ì"ÝAšÒêà­sé³7Ë>h0i´ô.¯ÚpÄŸüB!nÀƒ˜ÿí«Ú~“äÊMÃ¥¶UC?Øâx‡·¶ìb^—÷JýÁžÂ„/™¸d‡ŸØ^Ö@GÑaK;•Óµ{‡*ŸÛüŽzñÙOî]wó G°œú@¾4“zd¯@}X|]<ž³€ën]ÏÅäd5Î'\óÑnÌ ö„^§bA‡Â04—H ;‚BÝþ‡ÓöàKÞyJœÏáð ‘P~^3ŒR°1“‚¡b][ø—|åÊ#¡¤U£üaºÆ³dS–Ä›HbŽÙè 7*©Ê(N‚<îš*ß<û&ñ¹òªQÿ[  ;îö£¹©îÊDì1o›b¸jÌD ³ÖœyýV8ÜZ/ý«Øþ*võƒ6>Uìåyà*¡ì­S¶èm ¦]k Aº¦ïàêε°]Ó¶T›m^šj7d[Lo¥%@Qf¤aY¢p¼ØäöucæÍ+|nØ0ãõ\KÃÿ-­võôèfŒqñþw%î€Úíçñ#—Ê*Õ”–™Ó¢Š9s:{ÂMžÄQÖ­÷é{šBçŸóW)´¼ÐLwk'à¥3a!›°*@15x4Y›„†¬ËTV¼þ&a4¶ü€ [e±F‹ ‘T')êÿ† Ì”u“Ä r–"°DœáLïqå-Oˆk@! ¸™’Öué ¤˜ÏÛœ½VØé¸ÇêàI²â;¶!²†Ï’Ø5# ã±%dº?³;­îEõµóEGO@*«g®¸_Íà§N§aS1€ßrø=S;{`§ß/þ¼°ÉW²EíË8ãè‚=Ï Ü•(I&¢?IFLŽ×±/§¡ç¦Ü÷³äs¦8|/ p¯Š£#5 À?;5ѳAŒ}Ú<Ÿìr¡å—ão͘ß”ck<úéeÀÄú· F ̦fÙßÓ/=ÂPìñÆ}¶ìÞ<¢·•Éö±ný³î â»6ækw›Á‰·M#…‘Тßå}J?[`‚ý¤VÍuøáZ~DžyD íOP~7Q,5ëËõ?fÎ?#¼45%ö—§ÇÎÌds^¯°°@W Œ Fë1††"Cp8ÀR@]pdŽ ¥öˆÙG„ûfH§™ŸlRWZ”áØtù¹E„’’ŒjwƆOÛ@Ä|Ä¢_lùÝiùZŽøò|ÔIZgÙ€@mÑ'ì\ïÑZÈ’Ï×›{ý¾¥‚ž†Èe {¡ý¥û…ÁûËÀwÔTW 4ì^q5%+iJ!ØPnSM}¨6™“Ûä3 ÙþÆDÍ…µtcÛåù¹SD<ŒÑ0»Ô´õ¦fÈR5.Â8÷™ëBµ«"›Û(ù}.aqOº¹!è•X¦º€¹Í÷|™DÓÿ1²ïS©4zŒ«;±ú$Û DKÂmæ ¼zA˜yÔë»x#M0âܦžï#’$$s ­²i^t›ñ³½Æ›¸74¢7LÎ_Í% à¹QU籪ӥôŸÒ¶fw[g>…Ùð¾%jß ^ÀÑp °ÜÅE­(Qi8ó¼x…xŽEyxPYGï Qjʇ#"òÔ(#‰º G¥%çn´ÍAl·&hÙº Ú¹›®O€CðŒøÖ ÷éwQú\ü,­¢¢ò&”…Åκ­AÑ~ÔêP´Ö9×* _›I¤–ðKDj¿•¾}>È Z(ø¢èOi7Ñ¢² %ïšË›WeÝ1vθÏ,ÐåÛëé]Ûò$¼sÙ\/ K_›Ž8è{ý;;#vù„Dü5˜ç—Z¨tÞbgGŠÖòV4bD4‚Bø=*_—Íâ=«)÷nŸ)ÙÄ™<òÎý†ƒ\³M4ôº¸5Ùy1ž3¦ÀM½ãèGDE˜ŒÚÄY’6Ìb¦Ái¿i¿LÿxÞŸp#ä¤3€„Åã}Vú5Ó@5[í·ÜLžM·Š0Ïý*¸ÆìûØ(^¤Ã–0;ªÓMê!švB`;SÕa«Âc_Ñ*$\qp]2ØÕc gnÜÚï’ïÒGÚ Š¡H›]‰\X<­UPWBæì•\§$%_àúŽ,Ž'ÍZÖ¦À)UÍ«B´`Þ®ò}È+Í.ÎJZÑ×}61ÂýѰVu°¥̯˜»>Áé z…P´?Om´|í _X¬58ö°¶ï9èS-É»Û2+VlžÎµJ”‘­@–¸U×=é^€1b­Ê\PÊLÂYD$øa ‘…lÏsÆÓóJNýÄ`Óè‡kÞo¸ˆUnýZ?‡Y5s|õÌòA0LàBd³žMcа ²s®ÄÂ0†g‹=¤û¢â˯»b¯fÏcóÝgæ°<ÏW€’MË¡ùVì=õšÌ‚oتNÎB{úøP¹g!0µSPXj{“4s‘AíµÌðÓæã+ìYûPUUûøs©íJ à´–g0U„š8ßy/Ówòä/JyxÒŠæ0CïÖ‘ ܪqwŒâ^ÀOþtF7 ¯q®4|ZwÑŒÓ\IÚCBȆ 5ðMô9‰»Ò¯Ö>¨W…k "ê|Ð4ݘ]‘ªšþ%ñ² ¶Jy@LÙ‹èzß÷ “&Hqu&½ª{Sc‡Âo_Ž?¾¤ÚÑ`oåmŒ~üPŸg¢ÙžRºx^ûâ)ò+:óƒu©ï¡ÉæZE1Žl9±|ù§×o¨M½ ‚6›Nü̯žÌ2S.½µ=*/ö%…bò{w¶WÝ9Xmg£K ú”µëa¨ÒóïóN¤gØH²LŸ †'£šëó¸Ýø •À'-Ž@éYUËG™$&R›„š?Ú-ªJªf—,Ä”+›%[ÕÊtéXÃֹΨÚL…½ê‡Ì&~Û÷ä"Ü!}’µhx<Nò9×Í*ž!ðׯ ¤àWÚ41Ü·”, Ù}†ji*Gá³P| ‘‘;¤¹+¹‘”ôªX‚Öž¬Át–(KÌûD’Ký&»ûÙõ+A”̽ÕZÁwñð2R¢_Ó»Úê ÂêY§/£q„–)žºíj/ÄE×RH¡™Ó¥”ÙðîOåŽalð j`æcé?:§ ³F=©8C®ý»u_.ýû™võ¶¿]4¥îH(n¶q$¼³~Ì7(®t1[\ólã\Òø­ØôE‚Nñ–ž–¨T¹ù)„ Ý­ÀJ™m]Òptj0rü{¢™öàÄ—¨¡#JKô£Ò¯ã‹ndé–t/Fõ=£¸ÇÀkQÊ-½&3º9jÃ!0º* )Õœ¨:J!j`ÏgìÍC«KõU“õcWkïoxîj_¯âÄC©žŒŒÃuQ®Gã“Y­·üÎ:‘ N™‰¶RÐâ5½M}¾Ãm#îV0Qp\«Ï¦ØÅ/eÐr²¯“Õ¥ÿ°¢œ •¡üp§°Úm)ó„…5.¸‰’YM—ðlÊZ§ úÍa°mslÿ-î¾~çº3ŽÈóÍ䔌’ QnĘÌúí‡/Ôj ËežÇ»¤±(i%{ð´øN¾•ŒØðÇKHZÁ¬ë‚ƒ4GñyEn†<¢’¯ÈÍˆŠ’î Ñ4§ä. -à2*Müƒ8ß%¢> ãŽâ †ðY8ñ±vQÂ#*m¤‰¨/WhÕÂê…ÙeG÷¹ïè† í |;ޏ5ñ†AFi]Ùè.ÃÀNIŠ÷îm£NÖ`¹iZj¨nÚžQ_åx]˜Ú{ܧjnY¹…¹"ËÀÁÛ›ÏðCÙÆ\sŽ#k(ôJXëïójfd¼lètcÄ鎆Îòám^ Ñ€qIk_†›bæ®ëk¾ ËaŠÌjÀ¢Nç CÇD!àe4Ö?e©…õ¹Ëíü ¨Å™‘)/Ó«ïbXUV&·b*Å᪯ë,Òº$5b[õsh\Þ¦ Q-¢®>ÜÖR´# ¥'ïâP½”ç4wðÚ)ìÕ[™ªã ï-áxkê©~7„ƒ™§ ÛÖúÔºo3ÀG81ŠÚ_î#O W/?½wÉNž±D ý“#‹ FÁq*;%…M.íÉ|ÍÛ0Öð×Ðô¸©·€äUVa•.‚­|¼, ÿÁË™û*Jíú»L`^”¹„c¶ÂóîØ§zx–3Líu›=?Ân^JÁ*pvóa¼ánêÇŸaßÕçã;q*ÇBAb°MR"¿A«H”©-ü×)´èE½TN6 å|6“áM÷‡ §t-nxj4Ü3ˆžYú”¯ní`ºýû"ë3öD_cnCé”àåÁOÔ¥R©Änîy4´ƒî1û¶)åµÒ76”þ2O± ¬HdæQT¡Å¯ó×àó¼":î”ýF7mÝ[¦¬^¬µæ¼üîd»%P"̨›#tAqb§Zj ¾Ql#y8ÐéÛe’d˜¼5}²“•qáz‚ H !èjòr*[¦Åotí¤ÂŸÝüÇÄ^±G‘;š×+ÿ¤?ú’ƒŸºýq³\Ÿ3¿y¡$Líe¾3—H¥®L# ž¸%ºø°õ [i¶N˜&•Y¥=ù–/†ÅüBA*µí£úéZÏDJ9•Œ:ÏÄFäü29~¦><­;dLIÌ^|ˆñ^Æø«;dªû›múzYÚo¬ØùAÖ#níZD¨¤†\ˆ<tš€iœ)„±ºpòàæ? ,aóô˜ÀÜ(üÃ`¹œOYÁ(å¼+Ôµ÷ %ìÞõ ;H—èS.šïFÞóL¤wŬ÷j­©ëúöнiÑ··áØÎd5Êt'>“L„{ g«žcê(o AMÊþP÷Å9ŒUø1Ös¢îkõ  A™Gÿµ´˜wŸœž½Õ€÷:E‡j^xL«[ú²Ý»Ú-zü´5ˆˆ¤‘Ôý¸ÿ°àVp_¶7yï÷Ð Mi%„ ³_ÿË ½™^î§&äW¯ï5p e#ý'Ø`{k$yp†¢,³©] …ç–|‚\Ë9®Œß‡&àè||4Wííh¤GÍKÁ‡þA:(’Ëžã7í¿wëuçϘÅÓÚðÓ"Mû³¯·Â³¸0<íF5*Àøwã'‘ylÆ‚«¾}µpoTá”lpå_-öGŒŸc9aÉï ÔÀp¶ÎÙ²&ØËNÚ·Åå?dÍr·EEœÓÖ€Ÿ¶õM›>3éZ žk òKì†ð–#M´—¸‰#¯´<ùQÐÓ9Ü¿aÃ?^jž…øÕb]’“MT£^ZUš~lõz{ømáIÒø¹G¡%è¼:˜c©bÏ[¡+ƒh¶MæÃ.ŒwÉæ[· Оt z*¥Ê^šå»å!]WÈz¾êÔLø䧆°ˆ4öÄë+ÝÖɟКýˆÎdH ™6·PTéàH?ã@"ËHC‹ŸÚôÜÅ6ùhÁ>~Ük1 œµ·y¸1¯qyD„¯IóN/cVÿL¸SœÙÏêØJÿ:ê•ch<ÌRWÇ”ÆÎ¼S-fºÝ#¾ß¯Ì¢€E0#Œ¹¾d‡³ú¶ƒÔêÿ‚H”Rfc™Ü˜, Åè(Tª¦IÚÄCòä[s(eËoñ'u½O€ç×~ËP¬ƒì!oQå¨ .´øÒT¹e¨ç)ùfÚ·Í10U™¬Œ&aïºò¨B&w«w;ÃZÉdBÑ18Á«—×£.„í4xaÍÅÑýýËÕ®ï¶|×È÷a=2ÖqVZ  &×E¼yÕcy¬¿€çO»ˆKji”·™ ûc’ÑB··i>"¾õ诽AÛ•‚q$Ä<ßlÕ;{Çu¹Á›x‰‰„÷R¨hÀR?v „›ÔžQèZ;Hc–XhVH öîØ žŠ Øo8± 3Ñ(ÇÁeü¦Ç¶Ý)i¢JU¥—v¥ HôãHŠVêù§x‚üw_ñ¸]Ì©ðz'&žæˆÀ¡¨¤c.wuî¯þ‡ÁÒÛuçuJ²hRU {TbP»ÀžB'qÔþò êú\¨7?ÇÁšmdjBéÈ£õS†ù¬bOAбN\½eRk‡/Ш(&¾z^§K[ÝI„‡z®ù37#†…öÑÎzð휾^®ÀYÊIÿZÇ.ê/¼ rTöROvÊõ?YÓÑ5÷W>K;û u‘}þÚ³ý¶,ðQ»Ôx,v Ä1OŽ|rkoÖ(fŠjðT¥¥Ð‚"÷ä6F-v ð&¬RäÊÄB‘bžããqN½W—ZAdãÌlûHÁ©–# ú¡À‚©%]µº8/zˆGè%áiÞS4BšçšÈÞV{¯_¤(]~ÚuØé*¾¦ä|'ì*k}é;$UB t—Ó8 ªÒ„J™’›ò¦^¿ÿƒ: ÚãU4ò’k1¼™ ¶ãQ]a†ÁUŸµ¦÷Œ“ž ø üâ6þY”ÂÀ5Ñ@VT£èVMHG@bä¡Ä+cñR°Ì,¢r[ÃLjք¬¾\sCÿK ºÄ ¿¹»q~ЦÜ¡|Ø£;š% |^‰9Bj µ ‰ y8°ô[ÿ0º¼=š¢ªae@z€Älúbß<ÙlÇQ¿Þ? þ“© d¢´²ûl§]V­KÈg°Û,Ü)b¦æßÀÐ2ÏgûJH½_Ž»È ûÉûÕwkXüšË-ªB‡.‡Vî]— Õò²oÞ§ºçOÞr­û×)koÉ'ijé_~’-TyÀˆ÷ÃÛ¹*½ o§Žâo€N°lן_Œ…û|?+1ä|j5¶ ZY:=2æ.ǵ¬!€¿1<÷¤Ø{ÎÚTò>bøV¼«%FÌoD¢‚M‘…þÍËOV)•À%YËåãEðј9uwŽk|àÅ6#Câ.OšœþˆØ‚O²,?Ë7O—ËêóÑ™¯ÒQâ9Üôc[§†:é¹ó[µþý­©Î€Ê€oœ^ºñÑdkqÙ0 ½¦ÝwOÓ "g•ÛÍ;bFøV^ÌÚ¸M^£ïíF;6IÕëí…Ô OÏ„–½ò™È[ñn³-†11¹*áJD(·¨Î†ßIÈw¦Lîå”-­6æÒ”E´S¥‘²ø_Ÿ¦p P[·§b.€_TÍÌÖ²$á±`õ[1s—ÑÅp‹Ý8~€ôÁù nŸÕùÐÏ07"(dQ¦™ßæÙÿPW¡zRKdU×Ó«;.ÝqÛ¢RüˆWGµ6ñ‘"} äãИEß4Öóðú yÖJ˃E Þ„u¹QiZ÷Ÿ½æW›a‹ÉËñŰh’6{BKdÔem~lR5æ_‰w ÎKzˆ^f¡4|vÁ(ôŠ:qGYjLç%rÔ»¡5ºÚ¥Äð”’{²7˜\o0#q[@"„§›PLJ'Ó¤ñ¯ÏèŒb…=ßý%‰q~~çJìBzœ»²+±ÙQ'ñ¼ÔÄŠí )%ø‘pakoSUÖêλFòÃ#Èél4++.óï/—­©úf‚ðq „žŸ¨–p÷î_õ²¡˜=a ó6§’ã+§— ¬DÄgQŸì r쬠-ä/2®ô:>8Ü®•1\›qÿc´V,`bGªfቕH:ý5Z‘\˜NÜôÍ’ó‰-A‹LL”Y“Ÿ'I!ã•\CÞ4o~á{[ªtÚŽWn~{S˱åIõ§”æè_9‹@YtÀRƲ5õ”½ß6òwj¼fÆ ¥ñž>F 9¬L… ¦Pì|ÉC”¡&>IÆofoÜåLp¸4GÚØØÜùî8"P#)]GtD­ÄîÞÖm³M ÌHYÌ™¨aU<mD­ù‰°þÁš@S`Î (Z„‚>¯zwCÏj‡±Î§užM9pôãÍj?Ÿ•ÜÙeܳž—Fí™næ9D­7FºÆ–†|®@ç«ÀôçÛŸÿõAVí*§M8tØÒjµ¶V°²ê|‰iµ\ï—0×9ne¸Ó×ÏFGÚ" 1—HÓO<³ÏO·­[³pÁ‹NÓb¬_H/šTĆÑP6ÍÕTÝÂ¥IÙ|ò½£ÂkQÏŒàž81$Ìá”ëVÚÿPÞ² 6߯¥skçÔå];å­TÝiG¸eý,e ^8&ùX|ÍjH½V ×€a8&ÞŸ˜|DøeþÛö&S0öau9ñ )Ä=Þ!11ÑUò¨´ ©ᡜYtÀ²ñ۠擇Îúî ¦âóQ@I Í[b` ètáCð ”ub ÖÆ~nY_@éóç"¦H°´Ç.«Ùßë0k\Í?[ùÜ´ì^ÔÀÝå}#t‡7"JáÖ1/rÚ0$39ù‘O„{7Þ/G®v¦hàªKZ;ºy>º \yúYø£à‚9à2–‘È`/œkXð›AG>)àâëdYûe‡Ú7àR~L&8JÂÙÃz®×MN0DikÓ!cV|ÕRTóÛë´ÑEíaž¢YÀƒiwtQÚ+»ú3Y‡¡5ûOñùy,üHn¢rý>ÒŸ›yE¾;й;ÌQͦPù Zp (IV|ϪvàÝÔ½g;¨>èqB˜Ròçv¬S®p6cÜ*äù’Öžï¶–sµÀ^äÚO‚!¯6'ðÖÝÀÌYÂ" Ö¤à–¨ÃÂø ';h–µŠ”Ú¿°Ì±ÈØ[ÖÓaîØô*~2Ë$(ÜGÝ7Õ€Æ9‰¿ø(FÔ\²“?Ö¢<Í[ìS#õ-¾£CRò ™C¦®¡Ê³@¤Bæ­–`É •Œ8#Ò—ýQÓø’08AÈ$wÅå±m4jš"î4Lfp:Ñy[ÍÀ =9E‚ZüýºK[Ïb<#„ ¿›œvAýØž¶>/yKW1Ã"ÀGÅ?¡¬ÆÉsàF]2Ù“[Œ©yÔµórf¤¡<€x°’Ï sØ@‚–sâ‘‹ ˜¬Ï–þöptÅo&Ó{ŽÙµƒ©æRÔ÷[¨YGÊ‚M!ëk÷Ù’ÃB±Õ¬U!޼=¯%e¾íQ²©,’é²Ò¡Ã¦÷G¢ï®æ¡"‡9‘ç¡zÂ>‹©Ú:ú×gûWîà°ƒå.­„.w-†æ#~/“·rÝ5™3–#ÿœ£IÁ[7ð¨*’•†Sfv×1¨®v­¦P†u³àÛÇ„öUïëÜ^ò¨Vþ}@ŒÝÁ[ûj¿ð‡ŽÓoI*ÇDUoÁÓtŸóÏ^ìµ–[Ï=ìSûœZTz,öJF'?±W´_Ü}£ú¨Å¯I1ÉEfó{³÷àD¦Æx  }ztôõ´¯½Yçõ1Ð+qi½sãËo;<Â#l[9£á¤Î²¢ƒ·qZ¦ã{ ›ROa/¸ÒÝÓïÕ4€5ŽæO>7Ê®×íE`™¿>SÑμrqƒžú¦PVùe^ÎŒŽŸø55 ‘…\ÎðѼOVFŒL³º”‘ôM†·0GE‡Ù1›kúD-¥]k³I½ç ÊgdQ÷"¬Šq±ª¾ãO·y¶ ¾Æ~œ@…Þ‡ø8ïX˜mý@„7­ÌQè×ôÍËmô ‹ö¬ÎÅ™Œb¹ªGO5'SìÝ}ŽsyTK¶*Ü”Ôr))[[P¡g¸Ž2M©Ó¯âCcu$¥~oAGl ŽÔÁW<ï¦È,®ÖN~esrWÉèÞ—ÂÔ"0ÓD¿CuÕPd+ÖZ¥ýÌ)8v¬ß)çA`e ä‹U“â¨Ä´¦Ý¥ ²B— TbW‰YâpŸf‘H<°8oÙäDé©„çxáד§‰Ù³}è©•ª„ÎOb)ðŠ…g–k“†w·8׿èÕ qÏ|ËTµʵ@ªž2D…6îÚHúªš_Ý6&Bœ;^ª>rÇ5MKGñú!öÇÇI¤à‹ªO§<â)G›¹ˆ¶$ûŒ+¦ÚÐu‡¨ÙD¤n<,®S¨4=§´Õ´qQÁZ F¦.º¿ê9ô±{3+ltRÁ×øQìÌq}åØŸÛG¸&˜*˜ðx‰{‰F…,µô„Šü…—“I“ó¶š¾+Íqe­w/uŠðt¯}Ã@,þåëð ¡ìF—c9£Å®³Û®æ2öŠEK0†KŨ0AH›í1WÆ6Ïï0#ð¶­7Ij¬õÙ?áæ§k9"Ç·é—MR6š—¨RTÏÔ—ð&ÿ/D{—ù­SG#úî{§´,®ϼ-D1̤Ž»ÉÛ«ˆaÏœ§ÈaT_—¿HÚyž$œ—  éè!¾Tôö0tA^™ì¶xý(‹2D¯…nÁfe…ÚÛrJzg‰Œf…¿Xvð03øÀŸF¯|B»)¯üç$™MJý2âJi,âÏçlì°€ÚfU„/âœøÁ0÷Wªg›âk·|]àÇ%4¤ÍßxüH6Ø/`Àvüºà~|@‹¨Úk‚s^¯¯ãV9çZÁýå`ôe|uû1ÏÙ¯_ç ê0ÙŒW…‡{ÕÙøþ†ÈÈ5{äÞ¡­x$@’{l_ªaCn)‘HÙ²Jªîž†‚óUÔNÝ#ËuÒÓXæ½›v´ë—wm‰‰¹ŽE ô[R…‰ÊQÕŽÃz{çCo2P;É­+7>RäBq ÒJ³i›*š¨X$£,N)˜[£"ïæm Fö¥• "2&‘3vF/I®ë,ãqªåeNõñ3i€ò¶úÿë7æþ·[ óʤ!•‚’ˆ˜ž*…4JÂÊ^2rAqÃõA ñ,è8Eºâwò5íâÌ}ßhÀ–¾µº¸——(¹Á¢*z¶×sV:‡[Lxúg=[©M”¥xËÇ·ùïë$ý'¢«3(‹ß+kÏéÙg¶¢0 JíŒÁ;J=êÇ:Œ 7õ-ö¿ŠAø-vÁW†k?·Úª­ ,ó¯³mxt°‡­×)½D‰}émú\ér‚t1Ç[ xJu°._Ì…\T¦ÆÎö ö•èÚÛ6ÃaF.àø·Ä¿BîÜ¡EÊYœ7™7دÕ×vÄFË6T2³»ïüë³ ãU~îB—ÃûÏLÓWÅV··ÜÒôèªÑ­.Ë9*tá$Š­«¨œoWN£^j朥þ† ô‚éŸé(šHk÷4a¯ïgŠ0à|$ŸÖ¡°/_•:„ñÛëbùŽ|˜{íÈèp@±›]qC|ôñÆ?×äA¿väÐl ²A‡Ô(íåKñå£ptÀèÂ×­Z /”Ôh¥²hþñ93/Óo\Ø]ÕÁ»IìØÅ9÷ڴ߯§È8¿)v˜²úÜÔÍ[ Œ¨úóÍQŸŽa©oÒgŸÉ‹NÝ¿¡/¹dE Kì§Ø x!¥ -·‰9©êfÄž"u`ÚžQuòlÈ»@Ï=‡ƒ§Ë†”€g+‰;™ä¾"ž®‡×rÓE|Χøšã+ÒüuÆ®)`!z^l_~:Î[ým¸Éµ_.œÇ0ùàŸ–ùêËK_©%Œ þ¶_râÖ$Ù˜âé±3ú‹¸¡©²©5óÖ ½ñœ\3/‰ë8 .u4ØE™Ð¹.mX¥–RÕŒ¼´P2SƒHÀUÀY+P”›«Ÿ3ñÄÎg®9NúW3V—ãæ°Hüìïb\ãÜ/—gŒêŒáÄ/M>§I×¼®qÝÄ6Ù!¬ Ï!³9]ªA‘ÎXB¥½Öà»O®adQt«[$Ò "á'’ o±Î,–}› ,˜+!/ïø˜! 0|F¥Ÿ1>ËE?"3«wøú> ®‰c¦ƒSÿ“9KMGé¹'GÅ2uZâ{›­T¯0záVÕ×ÜñPÕHÓ‚²bm†”K)žŸ]1i%¯âÐã;…‡9\ľr—…¼¬ÞãåÍ@3ØáåIêŒ}ç/&ŒÅàIax3R°W¤ù56£d1Y,3 ´q~î¢!%Ø´«+§•ùâSÀ!k/|TÃ81Qðþ¢‡ÕöBaûÈÔlÅšËõgª™ÊÐ'UÆ¿¼é3=1Õ86È>?5 ÝV/e$•ÝÛ$.³(ˆk‚Y«7ý°,?ýÚn‡)¶UDåÏñ69e±«mµß¶.põ#Dŧï9ðòZÌrÄ6i“ó Ô²]"ÙU—µAÕ87vñ@#ÁP ylRŽòý{q˜áw›]ÿ…ªñ«xI¹øŸ?Õý4¥Pè›ÓCë•‘YÀ’!Tq/¢h"ú"ýJg®\¾¨ñE"ë® MÕpˆ-±É ÉC–{i—ÎÙm8ù0!’bÔÂ*blÌ:KáÃ%ýUu_“ÄFep°ÏîzlN6.¢/ýnu–¡ ?:íâyk¡*Cð ›Ì°> é¡MývŒG!Wìϧ†”£úe®Â– d1TS­=bo+³Ž–'röœ†zŸ¿ö*✠Á‘9wbèaôÇ·ú"}~ÝÅ(V3›öIú˜y( '‘õ×—”àkÀš×®wóL]Å´£y•ð/FºÙ×¼Ò}ሽ\ÄÔŒÖ-GšQQ£«¤×UÈb‹1VÏ7Iþ¾“Ss}¥%±¡Œ8B$¿øßé²_‡Ž'|]Bôúâø¤ÜùBüß8PrÁj•he%1›«Dܺª÷jîÆúÒ>ë6ã…h-›xÜQ•·Œáí—ÀÝÁéœG‹Ÿïà|Bè=+{8p#­• P 2EMÝø”ÈX. ¤¸ôÍÛVg7›-’¨¾ÊK•} ñÑd—Ÿ[Åî‰XâÏTZÏQh9F͹C r<ðYÃh1+ùøá£ížm…;lœnRòŽëµ«`„34BØ2¬î÷:Er2sUÎäÇyØ‘@Ç;ÖŒŽŸÚ_?De·¡Y4ÏòÓÃ90>1âô¹Êø¿±eržÞ˜©S»à.Â/iÇ8qhâÌxø¨ê]›•([ ?ÍÔ5MTøC6´µ˜â¾öûŠb̆Á,,ý?’mîG­ ÇC1I°þ2Ó¼vF±““JÒ‹j‡ã hܯïLƦF§PîöÛ`.Ô¹³oöÈõ æ¯XPñy»§e,ˆ b½‡³¨aêÍDÛÙ¼'L¶¸ó»Ù¢èzbN Ö~øÆíϰnl•ÃÊàÍjØ„†$‰AuPÞµ?ŠšJí˜ÑØ[ÿ"ILС‰½Ôg Š}±AK€ÎcæŠtÀŠ+)¿¬Løë Ŧ¿]ì ïÒ}ãþ¥]÷,â¿Jïbß¡ðÉ\ R¼n=šúð¯Cv T"V^õ0 kÃu¡åKá<ÔrîOƒ3x¾E–­êÊ™(Âb'¬ô5Ë® ç]ÞšcÝÃmõí¹¦Uîȳ#ôaU¦´Žã½u”;Иù,Ù÷=°@° ÚéÝ6ܸ]Ç øaÈ"D@¤¦s̪öÀ›]x˜'QjƒYŽGõá±aÆêRr=3ܰfXàÃt|žR'*¯{¥‘Žèj§€ç’3Çc‚D×Â#+†ò x( ãí%„ö›ÓÓ´ÂO¿4:X&óëN§tØÄך™ÌÝ0]LOB¼ínr,6Ã_¨ Òñ̆„Q~ÈóDëªdĦüGfxä G„·Áj¼-ÎbaSUu!\ÇFµí³.[P  ø†vïyãáï^þsÛ…Xtõ}ݵªx9 äqª|jh¨_•™ÕqBËxkòœvGÖYz·¥ZÂ-êŽp!ÃMb°N¨•uôUbÃUãD°Sq"TNncpbØ'»£œªð=.ì¬a=Žzñ::š¨;ü$·q‘R”¦W¶Ú&vEF¸­:ËVêèþ:–š7ŽŸZu%PÜÉZa¡·VG¼zöɺ‡rUr=úøÆPç}õhßGÇ®´’´ØLH% Xd5õ€šǰ¥Îˆ]D¾¹ºÕ$Be•ÏGßgÏ?û ‘‰¸dwN,‘Ô¯$¨u›)QG þƒŸ\…Ð"/üÔˆóq;÷Iõ´ÎÉQäÍxx€.ˆ¡BK0ªÞl/«ôEIÉÓ÷2“Ø|.ƒ†-“ËYR¤c7͑Üm°ô|ؼìkÉ­½œ%NW¢*þ@ò/bF@¤‹ãDŒí´_ ,"+G¦A@k/×ov‡à×DF­ÄZ‡ieúÎå'™ráO~ÜíݧöÞUžÖŒýüÁ…fàÒQi Ë¿ï1‡Iݳê§Q³`ÒÌâ¼6-3ޤö—øÕß1hJ¡®Ó׉j'„`v–g¸7 °»ªvƒ•Ï4ƒHÀ‡, $~Q¤ ¬Cç–£²ö9f†4Ñnù¥a;%™~dÞ*Â7bI?ex_ŒHÄíº«š„;Âôãðå樥ÕGy x:gyˆœÑ£@ô¦ìÃ&aÄ•¨”faU8Õ}03™aŠTÐëSScX†/îm…µù‡ÒoÓÎtÄ6 6ÿ€vE¬·³Û##”7U³ ÅFƒ½;ñCØÐ^–Ö•&ãØÚfõ䫉÷Ƙ٥ì$ èñ"ðŒGh›¢C¦‡vv¦u¹¨¿½¸Ê‹‡¨§OÚëš9±p+–ûHgâ±*po0Wp°ŽÕ[óŠ.N?͈‹rÀ µ¥ÉÊEž¿—zð<­)o«gæVÓddÿ<<¤,µ£ÿòaí‘!”—Á-µfÞ:°d6Dn¥¤š€ýDš¼y…m¶r´7v¿4»Âü…Ÿƒ@Ê5ñ¯XJhSÎ#ª.Ý)Ô¼;—™ªI}­XÇA/ò¥z¬6±*îà|͉ègJ6”‘Þ´6Ý­Ü‚a3ÂZ‰2@í{ц”/¬“@p:lùGpÜÁ6ºœ's% —÷þƒK2Bgl[Â1_;å^ËCµÔzjÅB*¯ñJöÊlyh‹^HÄ~ì69Œþžíø†ÿðGý9Èo,pLŽ›©.âX ð¯ L¦Ýæ/°<—ø¦ãê0~슨l¯A¤`ć]æ>ö&¼ôþJ¯FcÅk¢•]ÇLy VH Ü€/¨Ã’)ÏsûBï8@e΢jMVÝ‚2¦’ŠÅí&¡äÎ[S€Ë¯é7.XÂi¬Æ“•·9²ïpVÜ/zZ˜svꢆ =Ž+Mò+M8÷æ}_¿+9VÀêŸñ3Aé)pßKÎI ÃL†€§ëÊ1q3üb5P˜ û8GÐG*þ“êÈ8jÏpLfÀ6LSäàîžÝNéí¾Ž€Dk¶±é ¶åÿù–9vSeh X,Å95‹Xøõõ1ÙK8K]®pÈÛâKS§´§r†ó[u3­ã¹'À¼sRõØ)   ®8©~¬”­Ítp†ørÍÑ:Ó»úp¤Ä°Bwj+#Vêf1·ZÊ4#šÔ؃é©a› ývNæÁ5n3¸©8§~à±-O žÓ(~ÃQÕâ™ü4æîmqýWAßjüÝ>Ú`/ñ°s¯9ë쨹´OÂ!¢”¦ÙRÛ›PúÂßOlP^EÞ|ß·ªwäjªËԺɪQ2Í¢ÿ÷‹‘ùÀª¶ »QQ@˜=b6zwüV×5+õkï« ½—P‡BÁNÓw¬ß^…(j*“ pA¾m^Œ(u¼qó¨§Z Ø?ÃtÁi$ 8 š¤Èé&ß*æ [¹Ñ©×#ÄaâP5Š}H£ò»B:–¢69,Ôä/=O8ÑîÌGwÂRÅmP¾úf•SèZ÷QƒÛv ²_ëÎA§Â/ò¶š@FVÍ–ì·«„‚ù4ÏØ) Ṹ<ÍÔÄ3£µPÝbMå-!¬‚-hR¾ †§ËÜpÁ duÛ‰ö\°V·êÁüç1ê5(÷ÙÝ'E̬äÕî"©#}®‚2€•tœÏ8DˆÝI žôÔðM´¢Ë+´ÍTI¸¹Í¬*¶…¾þí9XÖnÎ1 ¸l`æä§*˜˜uÝLe¦h{©?á®D;ñªÓú·L+¼€è‚¦éZX¼ÿú<.”8xw ÕMDçAëÀ¨?=oHŒÒϸ®´=ìåº3<(hGÝWœœ:24‚{;‰G‡¡y÷ѺÉÒl¯G"¿Ï7æéñlßBkbê!Ô_‚‹v°óµö¨ 0“E=™•oÖZÛx|-†ŠB0c ´aÒ]Ójеc¦Ö:^!\?ýÚŠ‹žŠáæ¯+agòwå¶t_ôyüIS,{k#o)É;ä"ê$»8[u]j”‹Îl‰«íRJ V¬;±xȹb‘?Á¢Â/Œä^¡¤iÿUÙŒìm[ÚÐ@ˆ‘'^ÏúøT6]ÓHy›˜ö%#³\Ås†Ò>I:-h«–oÓÃëXs¬*ª¡˜?zXÅX3êæt“¢â=kb'yüzÆU¯ö˲‚G&}l»ölIH+9᪘DÚc [·¶5û7tÜÊвwBJá)È6Œ‘D4 Ô7¨O)ðµr,yfmÙ$˜ã>Îî´‰_~ûO—ôŒéš¹÷¨)³å¸#@œœ2 ¸[AôÁìœjEo`×€*Ù9”vyžì¨cÞžšnxiƒÜΊ¹Xòq1$z0¿¦xs[ð_¥¥¡‰Òî½P•[ˆR+ÉzÏxçó¯zy!Ô$ëç6-q}G³ã›õ\I‰ 4»”]e†Ì²¾w—JcZGïëbe%8–o;ú‡¾ü÷ĆçeļV›ßFçò;¸©Ö⇿å¦ð?„ÿÉMnãoŒþ…@tàÿ·Wö®mé® gz‹x{ð”ét]v4§‡Ëlo¥cßYxS«ßjŸ?Urj¬˜ ‹Ý ªcl¯‡gœx¿?„±9µ#öNsèÂñyE˜z,|\ž¶"w™­Ø~CÜWëR¬<ÚÉôäU–ö] ÝaȨMZÄZoÅôzZÄzÇeYÂ?Bׂàcj¸j¨_5j3AÐNž?Uëþ>èïêöA ü“S@ÿÝ3̘»H¶¹e¥ÞTR[š5ÛÝ­¶µ…‹›^oZôës¡‚úJþBæ¾Ó¡xǦ"ó_Ðq|kñ3Öñ±æ¯ÏJîð–Í:F/¼ì-%—¿GÇ!ŠÖ-gAã£vNk<1_(Œ§k‚Mf”*"¡—ƒzüÙV$·£ÔäÚ‰áK f3hœT/UM ж©ÜB@vøˆç¸éyXœsÜ!Iít2ØPŒeAñ¬@]úúcZý¼Õ5´¿ŒžW'ÑŸ->uÙNÇÛFv…D?'a]—Jñˆ|±y†Àå¿§QL0E¡¾ êøÐöÐ9@ÕÈŒŽx5ÎÕŠdÌét%GYVW »–¸"Ñ¡¹Œ¿µ;ÆíG¼¢Ž'¶»F«£gÛò¡Û•­IÒ•ChQ„Põˆú—ƒFtQAÇ+Šss0mãÚs^B´¢¸r–HÝè5!’} @±Ú3ß? ¼Zu<{¶º‹!D3¼ø çér?k" G¬v Ÿ8~pài °j7^È1tej¶ª~…Õ„¨%›ùZË­ò4Q-] ôóÁO9ì `î·¬f‡­*z`¾áM®Õü÷‹ü2¼x‡Âl¶v¤êõ9Á7CÔ¸Õ|ë¡’Í}€ãÚ'ölhRçžù6d”ˆlæµç‹+lÃöBfîâÃohÌÄ|˜£ºôÍe xò–•Y¢0¶‘ l¦"ÐŽÍä1ûRœ.«¤~÷§À1¦o´Ò¸åÍd¿ºDôþ{ñ9,CëÄr^•0QÔÓ8Œ鞆”Ø1þU"dŽ÷H”b+ká ý;Ø#¿pÇv%ƒÑQJ½œú‰iÅ’è-‘yFÇ”‹ QbËú‡•E®€f$ì=u‡°•1ÊIóÙ´ã?¬ra„ßDÔa¤˜>ôv+Oo³“É’ ‰Ý¥Â^Çݺ‹ÐÅY )öq·¤SÏÁÉyg&E`£`ªï!³ùZÿNìƒþéÅ_!2‚é;a²ÕêëËßk›weœ‡ÇšÞöAœ€LyuG‚n¼v{¼‰ðÀ>š¾p …8'‰L endstream endobj 3534 0 obj << /Length1 2854 /Length2 20593 /Length3 0 /Length 22204 /Filter /FlateDecode >> stream xÚŒ÷P\i׊"Aƒ Ö¸»»»»§ÆÝ=wwIî,¸»{ ¸[° §33ß$óß[uNuÝÏz—<Ëö»¡ QVc1³7JÚÛ¹0°02óÄÔÕY˜ÌÌlŒÌ̬ˆê àÿ䈚@'g½ïbN@c°LÜØ¬¨`ouµ°°X8yY¸x™™¬ÌÌ<ÿS´wâˆ»Ì ŒY{; 3"…˜½ƒ§ÈÂÒç?Ô¦4.ú¿Ì"¶@'©±@ÁØÅh ŽhjlP³7]<ÿ゚ßÒÅÅ—‰ÉÝÝÑØÖ™ÑÞÉB†àr±¨Nn@3À¯”ŠÆ¶ÀRcD¤¨[‚œÿ>P³7wq7vÀ)ÐÎlâjgt€£ÔdäJ@»¿•åÿV üS #Ë¿îþ±þåd÷—±±©©½­ƒ±'ÈÎ`²”$å]<\èÆvf¿mœíÁöÆnÆ c°Â_Ô’"*cp†ÿäçlêrpqftÙüÊ‘é—p™%ìÌÄìmmv.Έ¿ø‰ƒœ€¦àº{2ýÓ\k;{w;ïÿ!s™ù¯4Ì\˜4ì@Ž®@ñtÀ"Äß2   €ƒ™™™›t=L-™~P÷tþuÈòK ÎÁ×ÛÁÞ`Nè 2‚¿½Ý€'W ¯÷ŸÿEˆ,,3© Àh²Cüí,šÿÁýwyô˜ÁãÇ`þõù÷—>xÂÌìíl<«ÿÕb&M--EEQºRþ÷PTÔÞàÍÀ``ecp°q8y8¾ÿõ¢l ú‡Å–2væöž¿É‚«ô?ÂnÿLõ?ëAø¯/E{ðÜÔ¿Çü3³)øËÿçaÿËäÿߌÿòòÿ:æÿ—‘¤«Í_çÔ+üÿœÛ‚l<ÿÑÏ­« xìÁ›`÷Uµ€/®Ð äjûOe\ŒÁ» bgaóo!AÎ’  ™2ÈÅÔò¯Ùø[¬ñkÏl@v@e{gЯ' €…™ùÿœ—ËÔüôpä_G@ðîü7¢„©½Ù¯%cåà;9{"2ƒ'‰•ƒàÍÞF3 Ç_C `b´³w›ÀÙùÌíµ”“À$òKô7â0‰þF\&±ßˆÀ$þñ˜$þE\Ì&É߈À$õ±˜¤#6“ÌoÄ`’ýÀ\ä~#0ùßÌEá7sQüÀ\”þEÜ`.Ê¿˜‹Êoæ¢ú¹¨ýF`.꿘‹Æoæ¢ù¹hýF`.Ú¿˜‹Î¿ˆÌE÷7Ûÿ‹XXÁNMAàîÛ˜ÿ•³³þƒälý»Ü`rÆ.¿=cšüF` cSkgcgË?üƒÓ3q26ÚÍ]þsü#þ{5ÿuÂò·Øèò}¶åÿÇœ©é¿ˆÌÈÔÞ<ÆÿæÁþKbkûGÆàùf2û²ó7³·±1vúCÌâw)ÀÍüOPÎ_玮àçÄ¿^ÀüÀómclû‡pAÌ{k˜ƒÜþpûëØÞõϰ`‹ßAÀç¿®qàŸ*àt~—\DKOK Ý`è&oõ7ßú®×ï$8Á…±ùµæ¿ÏÁÕý##ðóœéw(°/;ðãáwÀ¡í\mM~=˜-þ ¾i˜ì“û´ÿÊ…œ¨Ãïcp ðë€ÝúÏÎòô¿Ýß"L@'ðµÿ‡*ç_2ýﳃ ë`ãúGbàW&&ÇßnÀUutµwš™ü®øvú[ø"l<ÿHÿK„…ìâ>±€Kñ;ØÈh úïhrüÒºýÑ<°gð…û/opzÿgXÀ¬~‡_eL.–NÀ?¦ \>wû? À>\'Žù×»•³©½ÓŸ=‚ÛLØýe;õø‚£zþÁýóúÍìÉ èô7ƒÿ\¦®Nàºüuƒoÿá¿^Ë€@ )âÒ¼½)_°UmpÛ]µ¾;ÃθÀ ÅŽV ƒ÷’S»ë= \2MUVкÓHòP7Úê–õµð2ñ“÷Qs=\hK¢JëƒÏ£a¼êÔN+ââ$vÿDÁ‘H]!ƒºð®Ï“£f 5t3d‡,Ež£+7ŠòÇ7wî½Ru}¥+£!ó;*»Uœr¯K§¢5¢ÞÍRä›dÏá’º0ÂÓbœ{ Î^ßÌ`äN¼ËÆÓ!úG³}öÖÝ`ù9çµV®Îê܉Gާ‹K}1:Eé-ºŸ"‹³à]\µ.°ÃLñ>ÚGì3ÒAr«'/ƒÃlã´Ä#5JîÛZǨ݃„µ£fä@[ëp„²€Kgîî.)õQéKa¯Áî`(Âm˜™‚[,œ¢§÷î÷¥W×:G×rG'µz^Ãz曈›X«M¢kâO¡Ž¾˜ °W»Ü>V™%ä5Þ=VÇ3»jíýe§®(ˆpÉé¨ho 2¹(†â¯kÞ°¿C¨âi5@x×E£7„·,©±Âèx±ûÌ~’?ª›Æ-÷àåîNÐài“4Q(Ãa‚ÑDle¢‹U…’AŸÈ•[0?T*WÃ{G&,»bV)<Õ*y 9¦ºwÛeXšÿ`†NfAW{$д/xñjV7;ÔØÿKSªA„â5f„4‡Óò¿nmÁ~A~h_"$6¾ÄØg½‘qʼh™×Ýìûs·7ÈQÛ°)¨¸–ÖæMaŠzYØ¢C×U’ÝBªér%uúácqüj3ÊA_:_PcË? \—nêô$.éW“ù¥êÎté.z{ VEÕ†Ö jQŠëÅÏ@dRb4ì´Ìñ‘ò´~Pöýéû5~½£gÊøzÞŠÑði<:oyDš¸aÍn7Úàð®ß=vhF¡i†ÖÃöËö®Ne*æ¨àñ*2£ÓΛò8sofñNNᲽ܃l>ýC¦ª¯–>“ŒwEª"¯¾ UËÍBÛfÙܬRj­àD® x5}<²•ì}»vVF˜]ŸÚ¿<—>Ä')ç'ƒò™K[KdUáAI%‚‘/f-.Jz˜¢]“Ãç[›p—ƒ¹kÕ§£}-±àZFÜö‰c Õa%NT¦­ð{~„û±$ËA¥=šÙR:}vŽýÜUïÙ]§½'%#g'›µMÏerzh8eùST}–åUzÄ“¬ïÏ´K„PäˆfýŸ"ÈÊ>d†ó¢‘å]”ÐÄ”øhLõ—E™ãÀþ,{#ÞPàr‡6k–Ú]”'Pž™Å1ö£ÍŸ¿±àÔŠ«‹â$ü’нùfr*lD bÒ1ì­Æê¤äAÍm\3K’‹ÄDÐtÓÚGaä©8,x=Ÿj% T…R²“³/» ±ƒá ²H¢ hY,Üo÷X;óÙ™ ór¿°u—m¾«æòZ1ö:œb!8  obÜH?ÿ)á¤CÕ2Xz{È&iê/`gõ•u³}vÞs?Î)úñntŸ-À$WF?4+¢ËóK-oÌè6²ù|~ÉêadâÎáEáC±¹Å1E‡Cþ?è‚X‰ˆšÊ»$v®vŽìYmW ˜IÅ-þr12…¿YÇ:1Þ¹ëKt+Y :Wl?ÝòÆàÕû®ÔSÝÂ\Ø×GK/TÉq!(JÞS’iá=Æß3µî&ø8Ö² ”mEféò4†½Ö†?%dšb‡â±¨£ æ*»!R¾­®Þê:,׿UUÍ,û,öÊ Šã‰‡ìJää;ЀèùÞêÍ¡pB-oµÕ.=t(ijhŸT)ƒS¨z~Hò¶(àj°(½u6tñ%šÿx™i¦ëEë’ÎÆ}‰Ñ™ ú”D=urÅ ¬mú=ák9*T¹Íd*Á\ô,‰ eEz^…}ï56)VUaÎw¹B çsØÚÑT+û×þ’ØŒŽ–i=0·:ø¹—6AÆ¥Åî£KŠ•cEFW› <5°Û†˜²Ó&î$›©H£mνÃêÓIâÐ&AC¼ZŽ$úþ þ|÷ÖD£—ý‚’WpQT;ÝF–°ÝHêê±2evÒá@›íÆèíc —1·=yFk7ó[i7 kªb"‡°ujWe:,Í»7eáySåÅLÇJ÷0êˆF”ÇÞÁÔ¸r}¼ŒbÇ 19žÒ} oÜ6%gÙ= 9ˆÂvbó–Z#2zé¯rŠÌ6m8¨LFLÖéS¤oJ‰ÕûÜ}ßínu{¥.aà]Ljšjæ’ ¾^uY<Ìš1AC1ÂÙŸøÑö¶§`|oùŠ:ÜÄt¸i@d9­õµG ƒ8¦N9óy;鬰Eh$@GÊiñÅCóÁ¸Ì€À(6˜^.¢~XfépËU€Ô~\±Š#Ñ|õã½5‡Àa?e¦Nþ1ˆhÉýGȈN1nvˆ›XU¤2ÐkKòUÍ·è#É÷›²pJ$eÏ^ýù=Ÿ$i¸?‰d¹Ñ¥ŽÛ.&ÁWV ¼÷Â4Ú%ñyö¯0¦­3ÛÓx÷ ކÑE†ÀÒ1~á9Œˆ–:Ïñ4 ¥& Jp/Xk@¡­Ÿx0vƒ µ7€GÉ¥QÍ'úœÃ‰úG³CÿâóÃ"7Üz²V£¸|_{[Œ÷ê‰Q-fâ ™{¾ÏB0²”ì‹SSÖ¾4ÕW]òàð%ˆôE…ñî肘Ø~]´Ñ°Èx~®uï*y‡oè=·š4o0¾ï[¯²½>NW·/x³óelÒ}q¬önuÂéÒÐ}á‘(ÍŸ•ªüîÏγ,¸adçøuŒ)¨à»ßŠÇfJ¬ÚŸ,sâ…r¡Ní F×AQs)‰GFw-¾‡éöô8ŸEå­­å¼áxÌá-,é!m|Ê(Ûð¦qQi?Í’ß„v¸‘­6 si›øõ4•AP5Aa†Ú}QDLg‰ÊØ+ÔúÖ_ö W¼ô¢¹ŠT’¦è KÇó²ŒÊÎ…é)…J=Õý¼¾Ž\ˆÜÝAZá5¼‰b¯Ôm˜äSnªûLà%Z°û^¸I7@„xíëÏ aãO@”|¡¸=AÒq¬dÈ—!8Îg§Yó8áê…¢õ6¯Þ,EóhD¨.à*ç‘—H.’¯òú>_ë…bT;)øúùb(/ŽÉÃV½¤Y†è8Ѽ¬*5$§ƒ:í ;IVô”§„•BÃ5ôë øª“a…7eÊ"dýæñê¤æQ¤¯„€·©ÏÚE” ª_{%Ž^ë³Ê†ôBp¾Bº²¤á¦Åb5F3“’H‚ÓÂÖpî‚Ö¤Àß ­Í éÕβNÎIŽÕäû¨Å¿ÎbµÚäâÜ{"ÿÊ^„¬®¯ì•Èïл竻ªìÛ7ó®] \ø6HÔSo© Œ13&vTŰ|£ymö€ùžìǰ ì_k€²>FûPÃE3¶*dÇsòã~r‹ 4}é PfvbàÍ–‰hîÄøàã·ÏêŠÔDηµ³w|-ÒHˆvýßaMYÃÖ«<ˆµÇa1óXH„x7°¾£7§ì a»õl` Q4OÝ&[G¨uõ¼2rc|Ãë–4©÷âÇHÐV ÷àƒ{•‚9Ý®½\ â„MÞ#Dö!€<êMû׌œV0(:÷QdŽa1bñb—› Ñá‘YÔÕÌ`® pwtÈO?ÑtW\Oõâ.ðÂD`Ÿv$£ë¿¾SÅП””©T·ö8Ï´²0É‘N4ƒg¤æEìÚ<+Ë"`Œš„J¥(ppì(½Äö/48ðò _ö6H3ÕwÊÜä´¯l ih¾ÎüVî"¨¾*ö4±HVâ›tÜ ÔçþIŽéù¥I4Ì^Þ 9À[À¼³±œœ y×çK{ýžâ'm$ Æ}齋™óGìL1HE/ÓÆÖŒ¢‡ )¿1ÿÅî/9@À!k$á¬YdÄ–¾‰³UÇ ï΄±–H}iº ;.âT!‡ëº€,‘úå}E¢t$w±Î÷&l»/o&'¼kQÛîîás\^¦}•“\z±>ÉzÔ%s/ Ψ¬|gÄyç=läºö¢‡†OÜPtEqÐÌÖûø«ûÝœ“]Pˆ¢,qÃásäÄeúSžd…uyíë:˜Ë¯JV©ío+×—wéêá´€oç&Kæ4S#iJïÒR~tmÀ•Ê^èh^Œdr×w²t=Áš‘Éʳ` ½Q¨zCÚ—iR4ªÒ…BpöµÙÜ´ir&ש¾½ê5¿…_ôYj<‡N•Ü„@ ÚÎ…þ‘¢pXA€!Çœ´óFÐÃõ*Vÿ!ÓåfK䨵&Ášë®Å¶ÒS~äü)š/»MòdÒŽðϪC%™õf.¼Ì &ï8ƒW^ž fNc¸Èæøùí£Ä÷\²ëSówÁ 3·õjÙ%[T¹oñ½¼ñšL>ϘZ+›ÀûõB,"2ç×t÷ÜŽyáoÉÌT#«¿ÿ©ZJ>Cÿ™(¨ø˜)o_¢àx3R" –»«.}àQÁ]ã6ë˜=uq¹—>kTªc´ÞL \Ôס‹v¼Rˆ/ mÊökÁïôZmáÿ樱+6)’ªó)?W\¿edÝÖ5;dœóÁWéO‚QݤA}®Ù/Ý-Bócý)^l=>»êi,!vAídÃáùwäûÙÔ­.ʬf-]êŸÁ‡“ÒòC»¡ã\fJ=Ÿv‡ƒµ"CŒã/ñªV+prxq(à܈hIøGa‰Ò<6­xeÞÁ¤õsD[έ¡2¼KŒø¹-Od2‹ÕE_e¡dGÅ5ô8XZQI‚óVb6„Šðù 6 t+$kØŸ n?Àf x¦ü†ë'iþ¸I€ú´p © ~’»Ã¸U&V✥6ËmÕuñ$L½A¡#*ÿõÙÿû.©Î×Á@n4Ã8ãqƒ×øÄ†f©t6eê¤ÞD ÎjC7'M¥ì!ðqæ°){¹A¥–ï×-˜Ò=Zó«§Núg4X….-ÄN1UË0É}udàäô‚~ö…ѹI;SU%†S¶ñßj©Cî$Ä!o…¹Œ+…%(÷gØŒÆÞ¨{Ó¾cV=FD1(º¼“§˜‡T+Ü”ê€÷rò,^Ÿ¤]_ƒ¼üí§x’±"쎠q †SûBâœ0ÞO³¯¥©]I{nU˜uP‡-Y@¬^qsUº&SeÔ‹sÙŠv<7ásÆì¤­md@Æ ŸDE•üa¯~–´O…ZbwuMh€ìz°®£èün„°¾hg¯º³µµÔfåºÿgú`ð¶ø2XûgÄî9°à´«ƒ„ 2^TGÝ-íì2l/¶z¾ºqÚxXPXnÙ”9Væ¬Enaëìó¹v¡!KK>+È<Š÷zñÝÙ–éû…ê¼ø²b/eZ•‘’TµÕ3Zâ=ÅœÅX“7VC¡%˜Pîí®†}EиÌë¸lŸ ;l{ ™ö×ýU.®ê\ͯ6?"^PÉ (¾úغ)4ôÆÑªô"q8æ(c¦–.§1_c`ŠpÒéãfk '¥ôd’ϼ­ŒO—S-Æ©Ÿ¼¡—²NÏüߨË,¤ º{ëëüª<”` ä6¿ÍâátmèÜë|I$½û’DŽ)dÞÄE”ºœ±î‹Þœ =²m¿¶Çö˜EµI§þèÃuí—ëqÇ#ù5av8ŒéŠ8z––Ú‚·„@äQtAÇ#LøÀÔê 2ÝuÛ– pG4Õõiì„!Ô›"E,Ïß¿ž&½…x¨ÝøÚÏ÷–ÍG$ÞKò»ûÜ¢ôpšì÷¢œ¿LЬ"½t%¡ž‹>>¬\U÷Ðõæ‰ ŽOB¤9Z;>|s•2œ§ÑPIÚPTïÌ"öå~^9û²Fáy«ˆÐ¸¿•=tÓÞˆÁ±¹F©b°A©g:rÄ›øùÝ'ð°>trᙈø~ÌMûY^{V‰sï ʈ—xbö¢ª¾£>¾˜¨ë‚Û"J’üZŠ>ùeTÁÈÓWê°0 gXˆÆ4aæÛ”Œ®ïr¯I¸E‡Ûcl ‡W‘ ì¯‰&°æ\ÃÜ嚂ՄƘuùK Û. rì% ¾ÏŸ%!ók‡™å ü6šèHP¾nðÛJ5»E{Z0óÕ“±ž¼«Ž—Ë4"©9£‰Ê¨7EÍͺ]b,÷ò‰T[­ÝlÈ}*@·ÇÌŽçíˆ*SNö[Ò÷*auén^{™}ïÏaKì±FÅ£À“Û´¡2Mª*cs,"¤nÚïcØù­~‘ ;bbWÃ+“®™§I2ð3ÇÕÄ*w¡º§=‡‘ôff øI YÈ«9䓾) £Ë0>cÏ%ÉœB°„š‘eaÈòœR¦ËÄB «LôYĬ7šÒ¶Š¢CÒW`­JjÙ™…(øN¨ê¸¦›(C7U¸eì™ Z(XsèÚ÷Ú¯ançÖ½Ÿ6Ï öÃY?‘êœ}\l8 £ÏEË+OÛ²°Ò‡’à~Ó$–»hd¦Èdä[„º7¾yÀÊ ‚.¾wA fÒëÞòá+\‡Ð7vâÜšÓ¾FÖúBÕ&¡„}®r®cT¼g$k(ZµAdY4ëxqð†‰„oˆñrb¿ƒ¶·C^á¶|àl/Ó¤#©PA/ÕØÛÄ^.Sf×nJ#Øþ ¾ûœá%[B×\´O¼êWGB!ôó2ªûÔ]Hµûy{™yÍw½p+ú yu‹ÁÈh=ÃuÝÃc«‚ÊOÏIUÅTŠÜî¨ apt¼nQˆäÁÐ_fJÏJü¿'z`óMè ÅÕÙ"ÝÖŒ÷£/ÏÎJHMœ7@Ž‚ô½ouí† {Š3Ùv»£€“£ÔŸk,úí ±ÚäǪ?›^ržWËïaªr© 7eyM­JÙ ƒÌYxÙÄÄâø”Ð†ÝHùý±ëD„x:fCfp½1ïïFZ#o(}åwí\³ ýq?³¯äjênÐ1~4ü`rXLîrSÇrÈØè;4?0Óe:õXå½]ÆÏŸév|»úe{Ôkþ*”ÿþõÄEÊàä§5žQ'Øo¸ ¤Y&A.éÃiäž“¥óùšÇ}­ÜîùéYÁOk[ÌÐ9è×þÄÊ¢ MZ´„ºbCý™J9‡jGÌusƱ8-Aãó-°;jÁ5ãÉ· ¾\áAð³ýØK ]™´8_dÄ*c½Y›CD"ÒÖuûê¶á*ñœ”â©¥à_¿µKÃàÜ"Æl‹ýÈÚâX7AR¼­%&¢r—ïFF†Ü¡Ç¨µ"M>€Ðr«óT71wËl.øI@I?" Wòmª±MJ/ÈüÃI/eb‰r§Ç—zJ ÜŒô—£‚X5êHjÞ¾ož/ ƒüð^pþÕ”~}þžŒ[¥§òÕÒ£YÔŒt z‹×”û6ß”%„égž”ªm$5îc ïìx”¹lrYvk,çæs*r'ºL—Œ§Ð].š`šu[ÊHy­Q•Yä-y®DšŠ:‹›€¦À…ñcñ¤Œam/æ€04‰Ì'ÚMDÔj…á› ^.‚ªk«·¶™iÐH¥$ T…¯:0Ùš=0{ñùõœ§Ûe¯NÃóðŽìâÖ Ò[†xs R¼{x$ûš0§ F¹§ÖD·\ø—µÈŽê´œWØ|»Ñwýô'Ež¦üÎb$[;­_¦¦FÙûÂ(f˜½ßœ…î/ÑvüÄU$ñšòšsÌ5Ûª•HÀÿ(é »ß½GK¦ýLÌd7ÞùK/«mZÒúãQ¨Jê^Q^‘V/ð=µ9Ò )ü}YÄϯ'»è4ŽIš—¨$RùòŵD ;ÃäP‘ÇnÓ™ç3¿AÞVª5A9us[aOñå9ªOWe*ÎjÊÊ⨔8IŸ=—š®±bFš_µ[–WÈMWDh°Ö0s &Šð¹tÛ– `*Íd›Ô—~QMû"ÜøÔ©|~6v´Ÿ»ñs„ˆ£)sã…hUóCò?½…ÈÈ¢ïûÔ»ªà3×r¿¤´V1¨¶ “ý5Ð?î [ªo–quÕ'æ'›£þÒ~åýV¨Ægè~Z Èí%·«Ÿ  ë%Ȥ¹œ}¯µÐ'êëIK[[›/MqoŸCËÉr5GyCñ‹€œ €½%æ«yÛÊÔ‰d†ôƲhµÞû¨“&Ô¦}íªÖoTküØèu,IZЂKWl•cIƒµ íØ4Ÿ×ÓR°¯òÐ’%K&Ý”HŽÒfR,â´äÎ2ñaÌ—9¢f¾¦"¬áõ¥Êf˜TÈÛ?·³í< “/epÓÕ_3_F¢FkŸïŠØÿ\üP9Ž“²‹)µöSMà±&¨ŒûÃ8Šôe$&NÑ•cÂG€*_äA°¼„*]õå æ³JÃpÉÇ-…oåÜuÅ%–ZÛúL\êéÎ5í'¶¦ebwŽ­–“nAj°kÎôt»æ¥@ñ¸Ø1acñà¦O·î¼ÌŸÇrI½§²x=Ìh26\+ÞáÅߦúä”m,¬òÍ/-9»°9U‹+bN¹ ™ŸðfÆåù!j¯l:ÍÎQ8LÎâÉs=Ka覆}Í_…·ã#6ß™xÛíÁL™SqÚlÕXÝÆ124Ýß!®t ‘A0kåø=ØoƒyÁ0˜Î-My:~h‰þ=¥Lå~õˆ´ÿÆXJ‚`0>û% 4Êø ·²©ç]y-ÕGþ–tÉ@&¶àJ…¸äÓfË•} s¾!»¤Ø}bÆöŒëXÀ¶þÈAÄ:æ¹êUo-O4L û ë¸ãœž;ìšku­u#ÞmQû¼d¨JubÒZâ·oˆtx¼uB–\ŒtÅ^À»¤ÌHËØ¤ã•õ6ìÁd’‘½ܦÎãÒ›åa¾Þ¬Šˆcê¹i¨F%KÇ=È©[Wnë“A#•ye† ‘Ê*:½FüBFª¹†þÄ[ΙÉ2ùÙœ 9e˜²¤-ÝC½bó¥z=‹OC‘Œ¯çUî±£½ZÛ­@©xi›=Ú'}´¹§B ‡ ¯ŠÝÜÄËäƒ“Û Ç ‰j¯»ü³ãÌ5Ç’×DáaPêSƒ^ Ç(D7‚Ò“”ªåohz…›Ýè׺úÄíŸØ¾Rù"8˜[rÚòŽ OµkxŒÅ˜ÐW,´¦n¯(èX Ë>O|XÀÕÚfï.îŽý˜Vˆvžåç¶Ð6àäð¦±Ê3šª¹N³@úâ8kèkô‘E{óû¾á“¾HHcG-OaÒº(—ì960¥¶IU›‰ÎD{ïä‹Ô‚[¤m¤Õ™ I¤õªÅ©ÔXpÚ†xJp¸Ð V :"›2‘Y¾Ý°*¡ïíÏZŸQWÉÄý‚›š6!h åÃ@N¨fé$™×¾’ì?í¨EtÇZßî†è")Õc© ‘*#’¥0ÉžÀª½¯‚˜ :À ôæ¯4;áGŠX‚VzÅŽÊõ~s"J]R…AþƒE‘-[DîIak¼Œ.µÇú±ÙÿŸ†STf´ž™zœRó^[îßã×3¾éÞç…¼z¡”-g+®Iq™žOík>×]›ñ¯,)N´¹J?;ôÆ¡`,TÂËZéÑP…ï0·t“ùŠKˆq4AjNÂKòÍh²Ïg^'±{ÝÈI€Ú®îi1§£U#)>€´SÐ…¶ñª.¥EÇëM”ê˜_/6¼¥@Ù¹“ø©>ÏN6 œ×Û׬2ƲÕû,ÀTQ¡ª­óyQÉ®J¼Ø…Q¦Ójå At”¥Zÿ‡uÌŠXܱΑJøî°xØóC‡Å/Õ?W "g=£8 H/ù}o·Í­uÞ™ýÔ5Ns€pBˆ;5á`æ-;$&榧Ë ïP<΢/û“&Ó—éšiõÖ!Ü»µq–gù­˜qA·C¤EY82=¼yëþ¹°»è)a»1¢qVS‚¬÷1ÞÉרHR«¾§æ:I³N3S0Ç>¹—ðhqIl‡sÕî.ÍEÛÈvýCá»} 7æ:6 ´K™·'‰*|a4Kg¥Ü¶ˆ1…)ô þG|x‹™I1!Ç B-œR”2Ï®j6.PÖ/¨1c6µÔªu|î öQmÕ2d•ÜË—ÉZŠ_ça!jsËin²s0#DŸÚ?2ø¤3P—‰f`Ø×´K+\˜É£‘æará[E§¢[¡ö Ôï @bŽÅÎ\8›ç™îŸí”ã Š&îØ»/w¿ÅÈmr‚lö€l™ïÓ¥¾ozaœ 0`mç#ëv¿]y¯—îxŠÂ·‚Ë·Eì>yŠA<¹ööÓbÆmî#‡¤„ð·rè‡7Xš*TE8Ukë3µœ \§‚ö9¦!gÁX (áæŠ…ŒÎôrj&"‘;*GøØàÚét`¦­;ú5#c0¢ ¨™³ŸRÏÊKüùîë~è¶.;û/ÝȨi¸‡ÄØ+ÑVGäâæž g„¾ç[Õ­\_uÐI#1ð`º M^W¬Jlž°P5¦A‚<³ð9C$žÑ ßÙÌoü¨¡öÏ z$Ú ‰Ý"O.€¾ØiCúI('»ìºá™˜ÉÑöEÝŒó¼Äø0€âõ‚`ñÁ›&Á6â!eŠH5".'ÓM{è3EÍø”VÜD?,l¯Kä,L’ƆšpAÈ-$jÛýIšÍmS¡;SAž/Íø¡ZòŽlÁè]‚›Ú«aßSΣ ðóêN]¬ySƒB».iøé=³!ì«z‚ÚWv·„c¶~8ÔdhèUt)â:›útÉóª&I³¯o®·4N:[B­Öõã?.J2ؼ¤}™·ao´€­Bc#Fäñ²ðߪ÷U_2ĶÃ/¶øÁtô …•9 ÷:ú î!_OE.Dôánƒq—x ¢iÊ9zs—[;/ÉIbîYi€¤`ÉjUn$Ó¡dðAš/sŠs¿>¤VÎø¡äê¡ Y{ò¨$(Jî;tLß•äü‰yݽ»ï'LäÕÐÜ,h{^¿‡†¯C·\ŸóÓMá?l$w³Û8Äc3\½×ë¿ —ó^žáÖœ± ɹmÅÓeïçá9§æ«Î‡o?öÚï`nYú'^ìù—ò…ÂéÞV«¦I0«n"‰-|—¡r©âϺà<&E†jAÒ¼µ ÞWƒzê ºL)¯Å™…¿&Ÿ n“kwÜ^I«K·Žðþ€šÆh®Œ wš4 ;ðév\Ì­:sÿ,q™æóô›±ˆ+ñÔM7£¢¯gȼO3_ïÂ%Q·j2`΂é;/Ã{Î’˜ª™eq†þŒ¦Ü…Q½ÓäÓâ“ÉIeÚ ¬´ëAÞ©ÀEª:šÄAjºWZ»·õý£úrÆš wî‡bs?n» ;«X©{'ª_-Ïnà!ÒëȲw:ÄJùÔ¬lfË ÛQúOúë ï¸ïÒ–wl§ MHÄè¬ßñ—²ÿX+3Ú@ÊÚžŽ%¯dÍÆhÛ1u+¤ö,&.ð ÕúrGBµó4•öÕž°7Ò•¶v[šÖ5Ù±áyºÈÆ]åÊ%Kšp+”ñ?o‹BPäý)ÜYßÊЉi‰Hcïó›³z %î„ð9=[4‘·#ŒM$mùž“zãÎÑ'A¾º åÈŸ;ÅÔhTÉ(2C—½;&ûqây ÑBVq?ˆÀ:jÀ&2æé¦êœÜÆ7°^Z®½!]‰^¯Uñ»ÀýtLÇa7>³ä¿’öZ[¯d²“œ‘Ê'nÂû`]à)=þKõ0©oµ-U•9I„TÍUríåôùóK¥G°VK¬®afhÅ*áN6¦Ú –Õè+ %ñöè5á¤=^šAšUôÅL'š¬ÎµÚ±ýA¿M~yˆ¨ìi°J(ìšÎpä±” s¨Y‘íÐ_ßQQÖ1ÁýT{xÈ–îDt±êò7_–Šb)áFV]næ‹} Ü öÕœ¦^¼äOò{I ·· Ð"ú/ןÿüY´zh¡ˆ¸?Ž1ù²Öjf¥cÌÇ£šú ±TYÿäm`ßyq½)“ßµ“‚úYOûÎÃ*¼·¶'W"òj9“`G‹ |\,.·-OÄ„?¢un2ü±?w‚âÉ}„ï—½ôbeü°†š@ì˜ý`„Žs£+ìÎ&©ãïKQß,]6‘åNar»g©‚¥¼ÄÒ¦lq—#øÊ‘òz'j_ ð&’kðƘö'½³©m*–;«}Y`òLgj§Z²báM‹ âÎòÃs*aÁOBÏI~ ;ã­ïL©”·6écÚåX rŽOóòîdnã˜+AÑUWQ]¸DŽÙ’¼ðM¿-Ôá¼&<¸žÙ\ƒgÍOFj½‰L¿8M.@ÃyJZ/w{Òþ™ÊµÂTõ)Ïg>Y•Fƒf0üÓ í;"Ò…J¥ð›9‰:ì•K6=ú̸—Ï+>îv/Q rÖ^5nz£½¯ÂéÊy+UÃNûR ¾ãµ}‚Ùî{þˆ6ƒ”ŸÁ^mÛ°~¼ñw˜B–°Ú>'sí¶ ã9Ñcí–èžÑ˜C¹¼¼ÓàʹqÓ|¯q§ïƒ€’çûò‡ŠÎÒ¯§¡¢00büɽ©9<¼!¬D­á.€Ò!¶6" ö»Oñ](˜†²^J8tc·¹'ÞsuBÓ½4¥1‡<}Bçæav½¯6OšW¹2H$mÀ¬™¬& Àga‚Ù£Ó˜‡ŽŸ†{âiuø11u”³d­?¾A¸ùÕ™ª·aÁVìA0F½Ã BJÈ)N¸ÑÁHòìP°¨¤ð••ucò´}Oœ•Ÿ†ªÃGyxÐg©ÂØÐ|vô]„+@¯¼{ÌóÎ’ —öp3Ã…Þl`æÓÏq  X",,ìü<é+ÔOp¸~^Ϩê (êáÚ¶%4Þ°©R5x´}DÏìŒ)vÅ{„=ó ø¹`²Pò×BˆL½.~~Ãl–3{Ác¹„cLþaj£ú?Ech-¿зœ‰$^²o' $£§Šs9¥ðùt¸1@ë´ âýSŽ `–e‚ª©ÏKÕÙËšú€,“ú’^i'¢·CDþôZC=o¥QE·ke¸œò/LÖ³a‡4¥Ï“(eIµ!Þƒ§ìæ ÞŽ‰öÊåÝУž!â >E~h°°ÎÙR¼a>¨ÅÞ…aŒvop*&µ£ædåXU”Ûó±4ã*ç! ^r¢í:Ì]l–m ½Ç<ïÖ÷Êw§Å¶š:œ'Ü‹·[¥×$¾ò<×j˜9/•'éº|("çW?¿mˆB•·ú‘¦×å§áÍ-–aymn2)I±¯t?’$Î.brwŒ€i4[³sI²‚ô}¾ùf¶K¨*»“HH¶øF§t‹­5™ln %g-Ša¤â#ž’÷„Wåæô¤í®€¤3ÿ•òd÷>‚ á c4Lc˜îÊÛA¢;§ݮɫB þÞ é‹Ìâœ$Â1_¥ 4Ë(w»#•› º%[„¶\áüȀ̮\ùš¯JoõxÏòaÈERûl~|Yz!N+` H†È†¨M( àûL#@ñÝcH?ÅÎõ˜¡àÕkËoß*èX]±GØzPŠÅIîÂõ=¿émš.†ÃåÄ®¶'¾Ð@qÖ63\‹ö}g ̳3ÓÞÙ#]*©!‘âfzyã¹R¡¾ÈÏH°87 –â¯`–¸ázzc …‹e†³#}A„"OW^‡H– ofiˆ‡yïw}žgš½k·Nžã0bÚâÑÏÚ€!’I d-¤û\[Ò‚1“­®ú(­D¢yΉS56äñéüf߸œ½>hw¢ââ±Ó ÐÁn×Ff¼èÝ„q•0(þéë|Ï[Ä 4±ž•p.rž„ãû¢™JwÍîmÃÅ-?¼€w/(Ù.GcçXXAÇÞEâ$LO»ÅedSÓ+ûÜ‹ ŢɋTxDã,~+ T J#|΃§$ÏÔž4>[,OœìÀÊÑmä"†Ò¤^qs:â{ø!»‰«®!s¢P¯¿yÝ)ƒ~N7¥´¹7ªaЙ•)Bé,ó¥Q±K¾ú|ÅWhÉT¿Ž83"Y;.ÍOÃbG Qk'…Ùex”c¯˜oÞA·w>y¾yÕú önÂòVÇý”`ƒ0šÑŠò­|½^=ÎuÔþÁÞ¨Bø¢'c˜óé‚l1Ñ^¶•alÕ¶e¶»Ä®ªÛsÂHíÇ ö+àÍæž,ÔÖg÷ÜÁÈÕŒØ`+³b@Ww1EâÖ÷Ggˆ&@šuEÝ·+3¬ç&©Þªë‰ÉŠöŒ—`lLdáÆqmJ/Ɉp'ãIˆè-Ô¦†x_Jkn³Þù×y”ªC¹Ú­$ªmBäå7¬ž%o×Q†˜\™”eYªµ½M)´1&i7½0íŸðí¼éNÎä~Ôà«öŠ’Ó’ì^᳟Þ> ÐÀ°ÀŠr?¸ø5nrÛgz\‰ð~Av³†Äü)õ í›ðÙŸë q>­ýx›(¦ç´ ùεñj¶EJ¢^#hã “îÌ)î̬“sðµwò×¾;û±¯Äb òEù~%èu£jµóÞÇÊyüod×õ¶ÃI¶ãHÎOºMaÈ­zŠ3Šc¾ËõskeÀøN-Šú^Ìk5É Ù>ܳ{>„0££e¤MWÆ„³eO?1=èëq§?3„"˜gFGªÃöO±ÝTï|–;C%±ÑKlOÈuIWŒN—KqŒY÷}wʆÓ}Q«bÿLÐKVÈ·ú¥ô“ð¨x®—öš™ìûâxN: ÌN'à‚„„òM€Y‰TÑ;ùZBG;Æ7eK®ÐRí§ PÔ®a·.ÍÂ/óH£™3§æ}bŸìnˆÆmÙš¯êFy–MÖa`YBwW9ѽÂDô ]o†ci[OGWŒûö/iF“ó·àÔô"°œ”›²/Hä9_¯ ÷À~›¾jæ7”äp‰à»q1r$Æè>úVÛþü¦O3^QòHoòãcÜ6€hôÈN#å‘l·£$PÁÀê!§_Ùùpë0ÙgxŠÑaUýãGkÂN· ¶ÏÔ=Á[.¹#ËP¹š®÷…eñúœVÏÖÊaÃ2••ñíèåÓ–t½È—u¹n æ0ƒŽ BY† F_Ó”Åy.9÷eJ F¨•&àCJ‚Ñ?½¢Ö´D\/J¹QÃÄ(N›å8Ûʸöt!d| =ÈtG¬¤à÷ Ïœ¨yb¨Ë±±ãkÈåtEÁ©—xƒæ„~}€šÖg?4 ZU‰Ë­Š˜–ŸY*0å׸ ¨HNèlù%#¢-ˆ´%~}=EgAb”$Mñ"Ô¾»Ü/“HAÁœÁ΋*$Cþd4Áî§‘ÅxuŸãokäkÇv3W}yúñÓ›7=ÆwaÓO\>çúø>§§ÛÄ/šéûÜ4“|oŽâ^0ìý Þî†EÁâ­¢Ww0Ï g­kUòŠ'XÐn2œy¿°iï\ÚUH”ü 5»>FÔwŠ54ÛžWË÷ŽÑLUË&ÍÎ=áfÈ©šÚ«&}>VJrñôÕš̸ý$°|ó,’Óó%äàÖúñîOi¶Õx&ڵ¾b¯Ô¹¾ Œî§ ;‚©üV)®ÀsIõAG6ÿêˆ0 T&%9.¶üSmD^v1ß]þB²J`nF¶.À$DGÀ$V¨À¡ýš¡ß» o.Kê­ÒÓ7nš=NÑ÷ªUé༠>á!gh’˜õ±ô>4F5øK×Ýi}ot쎽™€Yˆ Ø|æW/Ɇà =ùa%yQ³‹­(’©Îþä’/‘üèsVËcïÎâŒÜµÀ{Â$ç¶ |¡K±d°qv°°8¥Á 0"$u¨  Ú<ÿ¬Ñéãj€âŽõG^aM:ljN|Sƒ•2r¿‚Qš2eÍÀ…´w #„P(BÑü`W^Øp/¦õ€µQhkyè£k'A¨¿ ¦GÚœµÿñ`Ùµ#lU@÷@ª{NXB<+ŽL²íä„ËÒ±rÙȸy_ÓCWXɵ^7dŽÝ´ÕÚ/x:~³}è» KÒ¢û âbz Éâ±ÀÝ—tnw¤Æw(/ÂP€O‡1u÷þ!¶^2ý ‡þMêÒK[2Ío'+†Ò'ëÈ(?Ã?ˆ’%ÚÃúêªð÷>ƒ¯yR#µñÙ©,\]þ#š]?AÂUw×­7TkSj3cgUiz„½H‰xó_[©¶k*ñ"C{ÊŠ¤t& ?.0TãA6a#mör÷7Ë(7[¼ÀÆ.H§šfYe[W‹©Û.üõZ¤º1—=ùkgH œ‰R[s©óŠ»pìóÍ :taʈßÞ)êˆq"±¯‘ú5 a\±*oæmuî8ÑX’—9à·Qå«îÇCbð³Ä[¬ò2žb¿ÿ¤í<[åjBJ–îó“r V Øž~ìgCÈAÖ¢ oY…‹”ëž ¨>%ôH¾~î;m½4ò!’òSÿ6ZA¤TlþÑEä²6.…­öZ‡ÅK­VkwbíâP-¼ƒ½ì2[·Jm2„ÿãu¹Ýjì£ é½&ýÐ/nªÇª6‰je'EKÔn1PïrlŠœGW‹Zǃ´*>mû{Q’äE“úl×ý£õd§œI!ÉO$ŒR‰_ËÌ%X¼JšKN[†šriºÀ­ün=Ïww!¬Ü›íø™úc_ƒ×žE†ãWG=ô'¹ÛÚ’­µÞ‡XÉö‡£É ¼0ß ]Ž·õï]ä>fW­ß`‹´¤Ž‹Ï¸£ë 0éžù“fjv¡¬øÇ¬ÏÉÙj½Ó j!:áZ—`sE/X’ÓÓz—zÐÓn,ñ…#ûÙhX&§ !–¸™®‚Èà;ˆ£ÕrVht¡&æÀ, °£B¯W«óxûÝ ËáóH‰®NÅ,FMEÕlóG8ŽDÅ´Y©§7~ \žÄ¾t¸U²\PN÷² ”éÖŠ­©=ëó¶ªÁš7ûGv#CdüzÝx \ÉSËšè$te÷Í*Qi#m lÌT‹åÿOÄ;ë¨Xåã—ø1£²‹¾Y¾f¸ŸÅŒ€1åqŒœçÙ™+¼éбþ½ºðâ+Þׯ_ pÿ”`&3oWXC Á¬çc®8@ÁèOü†Âõ΀ü£"E42ÞáP| -†êÜAÔV©¤Þ²V2ÿ xhWº”Ïb}]’fß×{YVyFÑ@~ýÒ³òðºë]d¸M&Óów9ˆ=Žf˰¢(üš*bØB¶¾zgmmšZÔŠcÚ`j®Hd} ‚FPý8n¥¬s©æ"¬Œ:ÎQÆ= ‹-ª¥tŽ£ª¿"ñkp…¾X£ÍåÆ:+­SRÝ{–EãìøHFÚ°èÕÝ™õùç^Bã}ŽSԬʣV•#õUÓ/*Q>ëS÷Ÿ Å/Ë|C­ »eÚÓî‘)¤”OxL=¿†s¿ËÝÊó‡--T¥9õy/îí…¿îoöšluÍÈ¥Q LH*LjÑ[ªzÐãYÇW©-_"äiítšÎK‘·gc'66­«b8¯ËÜ‹…–³ý3ߔ͂üAèâžIÍ(æ|0-CÓl¢Wäœ(ý´<ÿIWè>í Em¦+Ò»†.êxQãW+Á¿æmþœ/“…›ÛîÁLYº•;Æñ‡ÀÉÎà§w²&¤Y÷ÁQð…ò§™Å=é!ÁjpŠ‹†Æ³›=sŸú VL0"Qr$8›fmU²H…™¬*HšÄ™HÔ”f¤ôÉ£ò@‡—½ßQè÷UŠí~‡©ölLü¢­‚ò j[¨¶nœWmÃ$GM­¡eT®ƒ ùÞ1%pøO´±°‡¹qü·ì$4xT¹0ªOìþ'ÑGHUƒÇ(+§‡V_õ|tq;øÀ“Íuwåžk¨ÍèIµ®Ó+Vµï¹û†› 6:)?LLk€‚J<š„Ïá=Å~ÄݸÄc_½ÞV!øžÏݧ{ QßOo:¹Pþˆƒqwïj{†›/_›+CŽÃÁjh©¡"ÚW»?µ#6ô£Q%"…–Ï–Ô^M`dº}#mË^ËBV½É™‚oè§Ê Ø£ åª–Ø ­ ¹6‚΢Áý—´W™Æ§¾‡äõØu¢¡Ä]º¡ñÌ‘ ¿ò&Øùâ~±sÅiµƒE±ètü †¶Å˜S›):.'ÅÃbz#Ú²å<÷gQ”»)Þ7ü¦à®jÍØH¢MHx”¥¶märl£Ÿ÷“ïÃïĬn¡ÌÒÎÿTk,"Œë‚9Þ[Én$B ¨›]Ã?[‹ö/ã_ýÙD´G6 ~•Yó¡š}D˪ܫ¨:.ƒñ?.lØÙ©PýÂC£Ëƒí¼§†ž}¹JèmHfI5QÃÕ­èÇýúPSÉ ¦Ô8<w^™D{ž1ñ—:ʦ5+6)RkA!ú³É©¼¦ë…m©¦é¼—ΜÛ0À_N#Bð®×· ¹=ÀÔ’jë:³«wúC~µP@¬˜+_®ã¤.0¹6µ€‰ùÉYjî³sQén'ÌM¹–ò:š]è0º¢ßÑý;ˆx¹aóŸ>Xá´d‘ï²²­uÊÂ,rì§\¹/è–ù…ô:H@5Qâé-†4ÓáSVg¦’á碑’G`Ô¶OÙ³²öŒ8ÍI)Kµ!°›3Þ$ÃKØê…¤·»ÍWxoç9 rž×~–üš›ìb ‚…-Áäff÷ š«JGïR(uІSJ²¾ CPŠój Y_îáE ”œHü¼ónŠöà8[S ÛNlìdܧ1Eã|ã»°_Ö^ÉD`,Ó«\ˆðd߈z¢Ü£^á¢1™…JúÒê¡GÕ°û¼Åg 5ZsNJ›€w$ãô-ø S^Sà§Â±Í}_ªV6#š$ÒÕ\,â¿rÔeÏtéV¡H¬ý`{9oY—J—(Ý’zõñ$_BÒìÿMfg*mCßj¡`´éAõS /Û±D;c ü­ÃX¤dVG|œmpcû^RÀ¬¸ëQ9˜Ð¨`’ýBóypä|mj»‹oO$*ö½}ó‡éñ¹Ÿ)–ô·ÓµnF÷n-c«£–´Ùf Ÿ¸×ïù/¸n’µŸ½”±ÅzÿuŒC „¨‰®QQì!gZp°YyD'7VqŽòóF¾5!W÷<²8Þvl‘fÔT‡«ÌRÊ…eoq„2) °º.¿ÛáxJ³ßóÍ] Ñ(ZãbˆÍÍQî¹’íö-ýìîÄIWõöª+ÕŸsÁÔxÿ¥bŽt…â0^:÷8ô+| ª¾‘*ØÙžÍÄÜ\=Z-wë1¥Ž èUú\áÞ§÷ö¡<©ÇdÖ{hæ"©(›×©R™ûÙXžB›0’ ³<é•sÈ'”e±ä¹P$’â§ à@âù^‰MâDû"(ÄÞDaÏP@ðdžMÞdW3üÔãÔ‹QGPIÁ®"„ð+ÑÞÇ`ßäâWŠš$¯¡Î«fX7Šã½[k}Ù?Î_ûÒB1€Ý”÷OLàœ Né -2+ÐÖ|ŸæPiÛÉ ›Õ×*8–àjÿ Kôð ô—¿!åvn ãÿ ‰”!A=í/^Ò)ÃUt>Ƕ)ÇWµ\ ÉNÍçÉïñɘðŽ+À ÛËP×øˆ wQˆb½~ëM& {`¤(ô^pŽyåcH¿’ DW†¢¾š@s”G|Ä€G¸ZÇEƒpý^{•¨VôQâsÞã át´ç zŸ›3V£|”ÕôbÑicekݨË'WõÄïN,’ML³b ÛÚ˃•j¿ŽáÔí_{Ÿ°8Tk¿b|Ò–±;ÇnL`ç†!ÈDúw‡w%5­I&­ÏŸ;FÊõ©”wÈþÞ1™Ê‡ªJóàžÓ¼\üOl¬õ¦r¤ÐPLª O\P«°Ú©ÿ“•ýÓ(%3%/ €ëÀ/™ VÕò¦9#.÷‡ 1—8¿zº–ÝfMs;Lõ£RNÁ%!ƒÉÚ‹<ô߈Şåê£~ƒ ®¡0Z¤•»‚JOêˇã)ŽÎäzë¥ åãïŸáÕÕRë ø”J øjÒs¼Í*~€ŸàF·]â¼À(&»©H«¨ƒWiWIEÕŒÍÛ~.}ÈÁeÔsqüEܬ™HËMÔ§¯E€/gVT7m˜üû}Y]qC'A&êz4çåPWͰd6ç0<áø }vŸo.&Yn é{ö‘fP‰eG¸òHÝÅß&Bp<þ›X>ÁÍìÁü˜Í¶80"ª]eÊ_g)I•ó‰yskñ”m`$ƒa¶FÇ8]ØoŠ‘Ùßù—ŸØzì ºŽh÷ìfŸþÛ™à–¥2…³?^@èÂp_ºTn¾‘ðÐ 8‘ IXY )ðZ—̘5üL z;ÍЖ™É.È;3Eyn:îŽþ#+¸ÚM÷,b%…CVwìÖÅ­{Ô&Ž:bÔ©ñ]ü>;/!§LØr¤PÁR=¹DРÍ!QÆ|²œI›fÿ« ?¬>ªMŽ»&â NŸ••0äy Íêó¡@¹À˜¬wÌ!äÏ´tÔ ‰ß)ˆê"„ˆWÝqCÕ“TÌ­ZQû'ìyɨ>èË4³ëœ0ýýøOKNÉã8¬÷î?Rd;±3V„?9xåLBë:µºªã,•¡°ÇtõÇ9Ø—@t›øÍV­¡"¬:-¥ 5äuZËD†„Àê¸XÒVÖ'Û½ê+f7<Ò¥¯…®Hc|?¡„¢Ìî×Ýde Â]`Û0¾ H˜y ü/—¨‡fWOïÑ“‘þ_‰sJ—›éA8\3)ߺöýà¦áÒ$$y´lµÅÝÄgk“¨• ¿:û!qVDÏÎq v¸Ú¢¾ûCI[îì Y-´É¸pü‡†eé¬ìø Dñ!¾®’ Ù⥎à$=BC¤o@`‚x0ÏÍç÷´‰Pàeû§÷95}ʨ:A"ïÍøI6Ü€4}ý/¥QFKFLðºÉiJ{˜]¦Å*2Å‹ÌKY]v;€£LïùÖš L<y‚¬69ZÍb³§[÷ºñÛ’®Û£"<ºCw?äÃç¹\xdÜÈW?zlÈÚîŸOnÂËëk~)€ ÝÊ"µñ5›Ø9äŒL¾ ¸›=@*À×­ªÅø~ Ч,‘uÞÇ}êÙ-»´fŸØ;Ï(K Vfžì;€›$b”£OЍ‘§ÊšÝ¤»Ûw­oXs³ÃRz-4‹Ú2>Æ…Ÿ}Ï´§~á]£âW&Uà Ý)€µiSa«¶ò¤ÖÁˆ»ªC$î©–Áv6b*›AœÐ5ÅaIq4ÓãI£›´ý¼æÖwÓŠsQÚO®SE?}Ò$ë½8]¾™*-œÈ>JâyÑ´U$Ò$ÎòÁç¦rÎÙ[…f޹ƒ4ÀV¸éþh"0¸ô@€í¤˜¹ÇŽ~;‹ÍqzOI,ÚÀÖÓ D( ŽÞ'bjÖ´Ô Šn£Ø‚dóFž¿c¯ÓD»"ø !Ô~­,¹ù€àO/ð¡ŽÌ“‘̦òéãÚì¯ °%RàÍ5ÚGêÖÛîæ“eF”aú{Jt!Xãðª3ÞC”Æê8ÞœSg PEIé´•d0!Y®Æå1.ÑDÕ´»nÍâb Ænk”ü­?kŽÄy(gw·?®÷iø„æ¹ÏEÞ\µ†dÑ¢ÙžêWCNT÷sQë—G'uÂ˧âsçŽ|WáEß^€Å,>A«ɿЩA±9ôÉ[ãå¢XrèƒiÖ»ïi`¡óhï­¯ÑN3û\Bù޳$^f½B¡óo„ùê³Ç—[µ&%8AÇó(¤e>ÙAIÙ*sœa¿_È!ôf?²†·³­ûBDÚV‘õ†åDÆÁ¸ —1óá”[qNFHŸÝd®vÉ£7øàñS="ós¤\ÑóR¼u¯ZL"–S§37uÍw¥&<-Äùhô#ß•§|}v€­}Tùæ s¼ ÿ Ò¾ÏYtäÔÛ– "ì7œiµX­ Àï×[pW™·Ä %ç²#.РÙŒ0ÿxU¾ö_"KøU]í(Fcó^ìM»:ùÑmWÑÝhÌû][ ÎÙÊó$¾Ð5Ê w§n¸±ýjÍ9dkOîöNÒîHæŠ×A €`<†„“ëÙ¸ T4ºööB?þ¶bý9ÊñRì ÖIï)Eô*e­æ½Ku¾?˜Ûž‚U6õ]Òã–ãúý­à!•T+Ú²÷d¹J¤ÜÄ\¬üB¢¾ß—õ»f%Ì©žº&•W 0àŠÚЉÿ‘ç§a°íä^(‡ï-^EKVÖØL—?KÝ)¯Ö@KóBv„£”Ƈ² endstream endobj 3490 0 obj << /Type /ObjStm /N 100 /First 986 /Length 4362 /Filter /FlateDecode >> stream xÚí[[sÉ’~÷¯èÇsbƒ®®{Õq"0`Æ ·†!x¶°µ#[IžÃœ_¿_fVK-É2-Ùû¶V)»:+ï•™ÕrßTM•[9_i-àJÛ&bð€C¥SS¥à+cè:V&äÊ41TV»*k]YŸqÃT®qÚ{Pr4‘*—]e]Ê•·4ïDä]Lª¬Áò@ütSE*íM¨b°•n"8b½q€· â«”#¨aÈ‘€ä ®Ó4¥I`O©´ƒx€@&XbtÌ<sà9h  欇^:ºƒÔe†rèÒz¶4óóXæ,l­I¨–\ n:V)…H9.žÑU†EÁrÊ´¡ÍâLcIÃBkSd×MvD‰¬¢)–R¤y¸>‚¥6œ"Xjc@UGÄ…6ÎøƒE´ñ0e€XÚ„d!¿úo¥æ“ÉxV†óoõdz¦Îçc5ýv‚šïþ ÷“Ñ™ù² ÉÕ¨lØ×ȈhYB5Šâ}ɈÜ÷—ÑÀ¨2Hª±ÎÔ+‘!¨˜´•îMH4eû ©)×¢Z! kä]ª™µ¦‚l\R{_Bkí„ô¹ÎØ>†Ú!}#ßãUJ(Wö…¼KHFÄ":+4Ü5z.´}MíÑøjô ÷&$ Ñ’s_ŽÜç¥GˆØ­æ¦J°‚\ ‹äÞäžÈÅwè‡Bư=‘»¹ÒÝ„Ûäºé‹LÍGN=Þ­ÎÆôD¦î£¯.¸:æž”¦˜ú![ô5þÆz2úßµ¡~"õ*¡}«æg:¥ÜÓç ¨E]Ñý´’Ñ ‰y>ã4Uç­cŒ¨"8g‡:µ3ÎÔñœëvm6èÕpq¦L qE˜vá.¦ËX˜tï‚aX¡v—±+›ŒÂ Çu¨%£ÌˆêÊ-”F® |/àq kÂx–Œlly5}¼"“M„ެÊ2ŠM°®P<qœCJ\™ L¼k†MxÅH \üÆP½Ž¿£îÆhÍb-1å¾ã&è[W-îˆóˆ¨ ZCÞ[G`%ˆsÆNFÏ‚Z`Ébß”b¤(4< LÏ'Ö¡>£n€î˧ÿ²Dy¸y¶å·œé /¯»6¼ÕD_0QTcº€\FªÏžJ`ƒU5†bNÆŽÂ-愸QF_“¿y÷Së *Ù*RˆƒÐAÚ ‰bF” PåÉ@Êd#i 5,@<ãYƒŠY¡{€Ø‰ö z°¸¢ê cÇd4Ý ck}Ë&’‘C‰Òg ƒxæ’&)3­¡Ì}où.Sß6&Tz2H•“ÎQ¤ŸŒ#‰~° ËlØ5ÂÁkâ–´2v™?㸆$–Q(vïòazAí6IûŒ…fg^]™‰Ž]kt5ò.p¾?ñ·ä‰ŽivÅë™F™¯ðº®ÜwžäpX‘Š—–÷ÄB—±i(ê,g?³§\'#=¡ç\tÉúkŸ¤%çl“ÙÖ¶!ãpµòÜÐ3t²a–*V¨Bï†kó"lºXÎU™c—B² o’nÛ§¬^HQ¤¥§ìe”Ñ.éÄõ”õB-ÎTQ(ëª#¹¡2Çζ­ÌæÎ›Uoø‹P'Ù˜Qà$ÎcÃ'ÂHÔ\c­¥…)xŒl/‘¨ê75P_Õ‰:™Œ'—/.êT “VÃ?¯cõM}áﯡú6¹žª3u®Îÿ¾:^ª‘úõ‡« u©.G—C5QŒWêŠ~h¿Íš2µ«át49UWãë™úSýy=™O¿Žå_ 8U35þò³Ñw5fçj®æçÓáPÍÿ=Q×ê/õoõ]ý­þ£þ3œNþ)¶>ÁB¨üü€xõ–íÎ{ýñõÑ«Wâ<³Åy–œ§asJ~÷á¼&ïà¼ý—Ýæµ}öç]½âvñÊó£O_Ò–:~ÿ~ËžÒ^±üëý$ÛqŠÖ+N¡Ë…SŒ1«Ny@Iܺ^±zÕ+ǰÿ»5•Â.*}8|úúås¨ôv[’pMIô?H·Ç™íg·*´[Žø¤~G¸ N®çCÝ×éàäáœC¥À,[ÓÈÅ)…ËðR¾8© ¿ŸŒ%P9RK°ŽoÉ2ƒ“)è÷ \2ÐFÒÎø·Ð6û𲤢‹‘¨u‡ðO»ÄÊÑ‹çoŸq¬lÉIè’8'å”î'TüÖPy‰0,ó ¹èl#‘,½A{lZÁ4»XáøÙ³ÃLJl…¸Å VvLvhf\îm¿Å Þv­Ðt­@›å'lŒ_9ërdK0ŸÁcè~µ6“9…Åš v*O/yÿê—Odƒp³ L›44ýl~‘ìÖHXÖr4ë׆ÿšŽ;%ûÃÇožú‰tL[ÜÜvOô?Â÷¡c =u䤱¢èMQ½S8>~üó¯ìѼEÛÜjkÃýhën)×ÇHûoJÊÿ°è+6:ŠÑbûov‹\¼Ò/ðXO’ßdÄäïOž¿yúF|÷i[550c¦ÿý¥ãÑ/Í›î`ÆNƒàš­†\]M'ߥ°}LÕ×k–¹º]^ÏVµ;åÀ·/~yöúg(úþx›¢Ö·À¸»ÄK·J;4·· 7÷¨K·5¤?jFo/Øu«Ey#âìN‰øÃǯ^Q1ÚÚ>pÒÒ?cß¡!ý?ìÞf'£Ñ|4>${ÍþPƒ9µsèड¡fn¸hëŠI{w{§“ñ±¿zv\¶y“ÈÙt8€›Þx8›-ãàòúâëp:]î×êIŒ°ìóvïì®/O!ÆÉd:¼µÉ³[ÊÞâ¿ò*ž„+³!ÿ‹ÓÆÃƒ•”75øÿtFÓÙœ" ¢–ðÅ`q«£ÓùùL^ÿØY€õð†~C½]€¸»g½ âºÔ­.$ ¬¶ Ù]€µ“Ùûü¸.ÿ¼G¬vûëü^çïºêkjŽüõú¯õÙü7"Ðæý»ö×zwþ«=îûøs]ö~Åúfwî«Ýç÷Øsv+w»‡íWºÁ îù›_wÙïaúõ>j]»{M—ºü÷È~ëíÍ»‹ü{­¬o°}Ö®°bôÖÆŒ^Û¸¦N`ù½½Å”ΪÏÁË‹Qž^Òo,üd÷WÉÉÉs@~Ù‹I YˆÄòå;Ëù*KoŠãt³?“,V9ÊË2¹¼V¢)ô#]S€»ðÁêPÈ]€(FBË_f´oQyOVº¼ƒ\WD7­V¶8L[› ïà"íŠÃµkE§—Lð­K^ ×ÃN¬â +ï[zå½&íË{>:è¢gp‡^ÃÜŸU”½YéØ0ºbÀèÛ™òp•»«ÔF½üÆ@n•ɶ¨—·RÞŸ•i$=V¦ EÓøT€Ц)oL­›;°ÒE+¾¡¦)Œk¤ïÀÊš¢Œµ-PÞ3ζ@ù/|S‚÷f•VXù²sM(ña‚kÖ€!œ¸£WYEW }K¯5`ŒÅn±ì“¤”ïÉ*•ìc’)„SÉîü†·®0G·?+ÛßÛÆµ@ûª^(¶ «ó´²¦ì"k¤!àRJ±¶l0keìÉʦòÞ¡]¼‰(¥€ngLûJ¢ýaXø.«¼ÂÊÙbçZ¾e•Z ÿ0¡Û®6i‹ÊJåŽm]l«_›~)‰Þ5ߟ¿Ÿ. ´ì`~7]²P»•u1¿•Þòú_wàýÔ endstream endobj 3541 0 obj << /Type /ObjStm /N 100 /First 888 /Length 1838 /Filter /FlateDecode >> stream xÚ…™ËŠ$GE÷ùñ¢Üíá!˜Í 3bÐNh!P!„$º[Bó÷s=ãaaŽ¥kÑU‘™æ×ÌŽ¹ÇÍŽbå¶¥•û–SÃ…¤-×ñŽÐF"[Ѽqâ­HݸüæMð¯`…&ÅoÝ´eüÆ?­Bu«¹o…xkø¬àºõŠßºõŠu9#Óø Õ-g¨—D[&j›ö†‹žp![É/²=´• ±ˆiŸkEpA¥Z\™pàÆ¼)VæžP_Apo(PÛF ¨ÊF¹ FÓFDúP)qÊÛ³a®ˆE #X :Œà‚f•\Э‚«"5Ñ3iFð3iF0’>4+Fƒœ¹n‚™2¢¦ÖqÔ\t4È"ÖŒà:ÆQƒy$•1$}ä‘TÐ ¤‚yt*hPFRAƒ’i «à¢# ŠÞ rà‡Œw‘ Š´þ4(%ám4ˆ4ci¥à”†!hP:¥‘?¾TG-ƒˆŒZx0Báí‰/=xŒë(|°VÖŠ¹s3K£Ë1³†.AD«"xàk<Ô±Á‚M– ”eì2ü°™(#¬ 5óبeÀFðhŽ ÁϤôܯx¬KéyŒh+ò  ¥QðØß?Æþ(…¬ µ¬òcŠ•°‚Ð`¥ŠÄU®cƒ X‚Ñ`UÔKh°â<¾üòñöÝÿ~ßÞ¾ýñç÷O·o~ûã×Ïh÷7>¾ËqÓößÇÛ??üôiûžÆéÀkˆáô=/f4.8í¡ûÞz^ Ú¸øáñÕW¯réËT,8Û³:g¾ÂìŸY1ßó¢‘Òþøüˇ_‡Ø?>|üôy“=û¿~Äõ¸ß<_yèZúáó/ïcvûÇ_cž}¿´6ŽÏ¾ýøþçó†5^ùåÒl¹.—Ó¾üíßïYU“˜˜Xvb×ê]k§0¯N×j®ËÕz¯dŸþ¤µO`×â¥V¾k…u±¦k«5XM˜Ö€³+å˜Ö±#®:÷=qô|ì‰/dÎis ig’#eÔ/Ùr]®vs hÙæ9ÖÚW‡•d#ŸÖ{;¹AgwÖ¹³#ÏŽ§œÉæ•d•sxè½è@$6±äĆKß´ö{™_­½Ÿ«µ—åj¹W’(ÒRÓ¢¥Vºi½¨+_Z­­´ZqZhµjZ²Ô"§•"-6­%ízŸÜY¥×ªÆ¾¾`¬ŽhW£]'Úç®9*I÷z¶ïÔcçN­sCi«$Å¡Fc(6†"K-7†¡ØJеöÕ%¯^Ëêü ‘ÛõîÌ_u>I^#‹ï—ª6.õã’êº×¨_µ9H[­7æ 6‘¥–›CX—Ø$­´ØME¢©°M…ËRˉm^Òfw+âèVÄÆž–ìɱçˆ={Z²wï¬rÒ2ö´dŸ{ŠØgcŸ—ì³cOûlìó’}vìsÄ>û´dŸû±OÆ>-Ù'Ç>GìÍt5­ØKwìSÀ^Ì‚¥—¥–cY°˜K§¥Ö½D,fÁÒVìÅY°D,fÁÒd©EN+EZlZ/Øï«#Ó3]™L÷ºÙ÷óã¿KÍÝìÕßìsŸ³Ø&sž³¸9ÔhæÁ2yð¤å> stream xÚ…ZM$· ½Ï¯¨ãöa½©OÀ0$ 0‚$7ÇÆxÖdwÚ˜éM‚üú¬ª–¨bkötSõøž$Jê…·@òK‚b^<ú‹ 82‡º ô7.˜ýõKˆä‡y‰lG¤näuÉâ’3÷Ká>/•Û=.Þ9Zé ..ÞS8ƳŸ¯‰>Tr¬@ "µ—²øêƒ/añ1Ðÿ 9'O1ŒO•,ø Y9öIô_eŸDΕ}"!wìÃÐ=ûÆèÒ(#P¶)rš@]‘ù@r梠#çÄR3dŠá=9OΞœ+µ{Gεft™-Ž9¬ E@ Bèo!‚Ê‚Hð(9dR)7Œ€ ¥†‘ì4&¢Šà ø@yañe¡´°”ºPVXé u Žì„'0VJ)ø’ȸ” 4 Jk]Ä%æBbbj–h\ʅȦ¿ä—.‘ûПBQ˜ÿP 7}Ф>!£Oi‰ÒJ3"”ô@Ÿ A À6™+#Á¬Œ%Fšh$<š;ùÍ¢€œ~ K"GþĉSAyf<.È4Uh */}iæQ@úDTÐÜ“O~É•éŠ4§‰2— 4ûèQžñQ ¥DñKKuYüxÆ’~ô©,5‚ø‘x9°_vK­‰ý²'e}a<# êÌó<9qÉ ý3Ïu‡âx®DΕ†#">|ÿýç<_¿<ÑìJ´ÿöðéwô×=¿>½\eI®ß_Ÿþ-ë•¿ýðƒê ·ÞDˤ7)ß~|ú/µÉ0Æ"†o±¢këm!!Ro½½ê]¡‚Èúϯo׆ò/ç·†òÓï/ß(ÌGGt·CÖx÷AÖ!ƒ•mh¼œöö=àP­XM¬v¬­·…ïgÌ)vI6æv”+sÊ{ÌaÓ gZAíGÜRB5 ÏBE PМ…R‚€%4A|„òJ°ÔñM?QÇïß¶PÖñv¯i÷–³ròi—§½ÕÞ¢Ú5ªLc¹>–‰Ëù=–¯e‹«}Ë Û×Üb;ÖÖÛY½±õv©JQå~!ÝP® ico_Hq±ÔÛˆ%ÍF ݈{*C¨ØBÁ,T¯ÈžÊª)’Ë$TN*T0Bå&H³P BYêä¦Nž©“zuvŒ:Tj´§íIÑž-ÚS£=ÍhOŠödÑžíqF{T´'‹öØh3ÚQ‡²hö¨i¿õ^c+§Ð˜iÚ[Q-ªC£:À4–âÚÆÕ¸ÆbÇÚz[ôb£gôzj×mÛ(v”²QìïEGl*à ‚W¹ƒ•-4 M{+ÐRš ÓXJWSÁ;ÖÖÛRÁ7üTµ· V” 8WÁ7ül rj òÖäš$n¶9¥ˆ·qM7Û‚T-Þ1¡n‚Ôɤ ñŽPju¸ÚÊl] §á¡Óå°U=ßKÖªª®ÁIfa(­%x/$2œUÝZÉ*®îÙÓnÕÛVn‡j«Â¨bk¡i¥v¨´:LO›Ug[™ª¬ª«VYmUu(ª±×m¯©«R;Qj?WÙ‡¥Vi‡B«Ã÷l[e¶U١Ȫ0ªÆZ%¶UØ¡ÀªyiUÔVPãt‚CÏ÷¾nVÖb?¿S™íY­õúYaU¹Vn‡j«{ö|[¥¶UڡЪ0ªèZhZÉ*®Ó“ ò[ʨbÙÝjèPBÙúý:*Õ°Ÿëa:×[‘jlP—+ë–×nw;ªÚj–ÖVYÃý(úBe“Z]ºEUJƒö¶§X!¶Ó±ÈnCßÑj+½>E½€Øòüxþúô¶üôá—Ç¿ž_¯'~}dßåß>_.×—Ëõé;ZJŽ£NTÜòhÅ×Áƒs8ñyGs<ñLþLPŸ¿>_8ÊùçwkL§òúz³|øóõé+£®%÷G–ª,ì³ v gUkoY3r#F5ôÍõ€pmC¡‹§õΔÄzSfÓ:ßvS“ŠUÙocßÜlxœsés'•ɳ {$bê‘€•—ä¾¾ÀÁ©yÝÁ&<­;Ïî+<Åž:žbOO1ö&ái­6› Yngc‹§›“ …¦ÔŠBSêGE¡)©Q…¦ÔOEš²òâÔ}¶™ã±onwà%éßS‡Ì¿Ùw¦"&•DSŸD`žz¥ƒŸdƒ»- r³Á&*ªY˜¨X{ Š©'*ÈV¢mmÄ+¼ILö’à±onwàeé¯à1Qú¹ª˜z^"ÕS‰(ù•«3y1E\>57\éß•xØ^Ö̆~Іž¢Ê†-Æã3ícçëËùo“¾¬k逎‡½ ¥ý—×óçëÇóù,r¹nœµåõé+mžÏß®—ÇËËgŽ^—oätùíú|y‘5S.×ç¯Oÿ»¼ØIMbŠ;ÚyW­èïf!Àt‡»Y¤Š+·;ÚËËõüxe ÛŸŸýöº,(ðYS›r)Ú$ÅrýÒB»hΤ[‹œ-BU¡åp4εjjR6÷öËÛõËóÛõùå×ï>ò™ѰËi!lÃ2º`ëvб$k$žDi_oº ¸i/Yº‰çF²¡n fÀÈMñPiXÝÞI7¤T,‚yÎCªfEšL •¯ÞJ—¶÷ÖP,lç€ûÙ¥Ó±Û<;2DkHV(G +”s¶šX¡bçÀ 0{1Éã4=ÆzèöNz¬P1ç ß_ ˜âqEƒÛ®šx“õæÔä» T3q¾³@?Ï.ŸŽÝæÙñÅj°Äã TS!¾A5'4_5Ð9³Wâ&o­r¾ô [_Tî¦ÇXÝÞI¯pÜýª§›x_wÁÊ'u-Nø‚.Yñøº„®ZÙñµ ·×øûÙ•Ó±Û<;9søý8 ›¸Æn?íŒM¬ÐöÛÚØÄ m?ŽM¬Ö\çkn—³»é1ÖC·wÒc…¼Éh*fiÇ—9gáä²Û? ›X!0%ßÛâ|åI»Í³ãË“ÍX!(&VÙÄ ¡¹¼ø¾Gç%³‰I~>7ë¡Û<=¹ðWk É-2€µ†øÀb«ÀLjV>¼€¹×ÓúoPg™Ž*ïä%/…FVòÌV±–×&´*<:a0 ËÛZëPž 0N“·IëAJµË®äÊóT {–+_$X"Ê›U°6¾˜…yN£Pï,/yÏ ÖÉCžµB1X—×­`M%yä Öl–ËF¨Æ,O^ÑO³Âñ,‰ï%×K©%ˆ<‡E“\$ b•+®‘0ß­Ò(Oe1¹iRã2¼s‚\ßÏ’1Û×g´lìØÛkš‘”<ª%ë%oÉ:<Ê[Â> stream xÚ…\Ë®%· ÜÏWô2gáq‹Ôƒ AE¶ `Ø^d&ÿ±Ø€'Wu¤Í që°Åb©Õ$¥mîûÒf÷%Eã¢\U,.äêµÄ…^Öz\Ô«ÜX»ŠÀ~•ê@ÇUF‘¸²«xÕOóÊç]GÜÖçýë]ãª\ÒWr‰µWó'·‡>•¸³·ùÆÛÃïÆUïDmºÙdŽá~Õ:}Ô~ßW¥ÆÕ$áÕâJ®V&•y¥W«¿«Wë¿k×ô»ÅU¿ú$Wãꪸ²«·>>Í+¿úð¸K¹¯q«r iw\É5jD£ÏÛÄ O7ÆŒA\µËÊ_J¿¬Þ°—uøWì2³>ǘ7õ"á‹Ü—kÛIՃ¼’ËMêTáîá „ 2ƒ2/§"wüuJrû©Éí|jZŠÜ>GŸ—Ãë=/;â£e^z‰!T¦¼¥E„tŽ& êS³"ñ³y ý;þ:G›ÚÅh:G›âA£iëSŸ®s4øA£Mýâ¾sf•)`ŒVçhÓ›p}¬L ƒÐÔgN¬CÔ9Úw˜£=*Ö9Z‹[jD²Ì™ØæhuŽ6EŠ!¦6e:whs´Þ Ѽã$\b´¢2î£M®e5}*£AÄ9ûÊ5œl1»}ÀlŽfrǼhs4«f}Žf½ù>G3¿ñ×9šÅ_çh®#<ës4 4/çhnprJ*÷=ð×1/,æó&wÓà6o>‡°ù8Ýîqßi S¢pr̪Tø0ºùäaêÌ!eŽŒ¿¶KâÏq9G›Ods4 õæåMlȧŸ~úôãßþùû¯_¯üå·¯ß~ûòõÛ—?þýù‡f¯ˆI™‹Æß¯ÿGˆ­HÅ,&¿_*AÊDlj°"ˆbü_>ýø×/¿ùÆ|ühô˧Ÿ~KªkÜtйW i8£;ùFx2Ÿ˜‰°zÝÒ /?íi9nJâ;BÝŠ8 ÄE|ÎÖ $#ÂêsúíHùk1Ú’7eÃ…"îŒÖTd>ZdÒŽH!Z „©8<ÝÒ /?miY(R×ÁìŽÁ:qÝ %ÈTDJaˆ"$xVѱ#õñ±š6{N-îÙ˜!H¬C+‚ÌGŸ !È|z‚“*€[tKª½>ÚlIy"ì¡òDo†„ ñb\‘D¬‚ÔÂl"¬UÛŽUxùÑhO+i7‹a(ÒhtC‘¦Œp(ÒÆŸZýñßßÿõë>ÿP>Ï ¹Ö¸™y‹miõ×jÅx}ÿƒXÓntHŒiF1æ‹•-V†U`…b ˜Ž<^ O4;n­tØŒGÝ€5Šáùùnv~‡!:ƒFGq–«–ÓðÀR ˜SÁ.9w)+7L*0*˜4`B±L÷4ÃãÕðDsàÖT01`T0q`T0LY£ÐfôÑÌ,Ç‹XâA1w<'FÃŽyntžcšf¹Ñ a’[߬¯ÕlO š4ºðä3.>Z¹,Isn)¸«QL9Å*îyoiÂçÕðD´áÖ…‹÷Š Åðf¡K“F—,(&.Yx¿HÔë{šíE ÷4Kj;ç`ˆÖå¦ °Â1V(Víß%…¼LÊQÑE{Q:nV)6€qe X§˜c^RQ9ñ\•£¢ò(ª…‹U(˜‚*Å šTŠA4iCÐe¿ 4,OL!šðC41ŠA4qŠA4eWS4šçiÆŽæ¯<^ ÷45C¯‹Ðë B¯F1„Nb]å!@èhIÿÁãÕpO³ft+s©ftÛM1„§Š!2d…‚0ìÜvÛAî.ƒÜ}ŸØ¦Ï«å‰)¦K¯t\èÝÅ wïƒÞéÝSošøõŒÝ!ókëBÔ QÏÐw ¡§\ÏÐÓ ®gèhÑ9’&M³FÒô½œ}]ˆÆ‘æHš4KI“fi#iÒìw<4Yèì¡é šãÞ'¸c¥iGššƒVˆšƒVˆšãVŠu`,tš£p 4Ëþíi+M?Òô¤I34Oš4Có¤Éòb¤ã¥°„03ÓRXž”Ùt)²gé Ër\k3Ÿ·îtX´ XšT²¯S„³D›€¥I%3…¥I%3E·9BYZžh¢MÀ²WTS Ð€?Wô ¥örÚkµ;D褰1A](u4HXÞž H¬HËv×Ä ÅðØì ”²ä°ÛSÌš}¼ñ}zÊäS,™ Š%£Xú²MHŸ¤«Íœ>2è’Õß`9`É"ãûÇ?±L‘.<™"ÿ™"[Ùö.ËZmÂpO33l+ÜÝÌ)o £ó2Sd£ó2S]£jfÚh5ëªf;½EJfFÕ̬Ӕ»‹Ð+³FS¥BÀJÍ’ÙŸé6ÃKWÃ=ÍžÅ‚ÕÆÇÅÀµsÁ¯ƒ‚À”cY£XFv/h_›°éû T—¶˜Ûbz?ëã~Ö V9éý¬C8ˆ‡™íÌi~M7Á7Tñ8moAÉ÷tzþ Nóµy÷·ƊÀ¶ö4¿©Ó›2šÕ)ýrNï\ó:“ üvŸØö3=±èg\?_öÆ/èg\?~ÆõèÇ*!ÍÏëôð]–’ïëôüækJ¿ ÕüÄNég¡šßØ)ý.Tï|/u DâÍC‹@ôÓD^vGay¢Š8v>…Σ€ tÄ€.Ù% ¶›¥%ç·Ûç2ƒË)ÏÕ’¡wîR„ž~ý©hÄ*ýúSÑ•Túõ§¢‘ª…íU4DõùDó-Ͳä¹zÜ_R4ë”~á©hÈ(ýŒSå SSÓ]¶ù¦™L(=Û©™MèátgúL,÷L3QzÂS5ÃP8†0°U5ÃÀjTÕœ ¬FUÍ™°ßlz\^-OD1“Øv“" PzW‘(=«5%eU˜ÖŒkåkÍØí+´ôx5ÜÓ¬zV¡iÍг Mk†žUhZ3t¬BÓš¡cšÖ ݾBÓõø# ÷4³¡C÷@5:tT³¡CwA5;2tT³#C7œ5;2φó[šmù6 †'šˆ<;ý¨Ù´)lCAû£X†À)†°ŠO³³Ršh.“öx&PdzüÑÜ}<ËMׯ³|Ñ÷gž T^óä™@åEOž œàþ %gõ|&P³UX ¬ÙH¢'t<ê4ŠÁaZ©f#‰×pÙHzЏ QyÃM, GK­ã²Uh¥bÏL¡9²=3ÅÞX"êVL—ºÛÎ…·=3æØöÌ4ÖÂÑÙ²8*4E¶,Ž M‘³QWÆž¬‘ üø–f£¯ Î5*N5Ÿ)ÎD' žƒóÄ;TkëwZ0<ÑÄ¥¥Z6ú ;³£VØ>fG­Ðô9;jÂÒçšm(³Ë[hõ´òÖìc˽k–ÉÂrïš%˜°ïêêý!ó£fÙ"¬=_óĉŠnß0uýÏ3ÒrO4k"a'Hj5"ÜaaÍûšE°æ}Í¢FXó¾fQ#ûÏBÒãÕðDÓ›ëÀÈ„®YK Kÿª<º°ä§æ!‹ rK}ÿ¤Ï«ážhVaÂòΚU˜°#HUR3ÖÚ¯’𱤲JjÆ’Ê*ôýÿAP×üzÜȯ’š±œ´fA)í ÍXFUŸ‚RúKˆÆº+5[¶¬ªËJ¤Çîš-êyóÆG†p¬ÁR³N•Æ]†Ç,¡ªY§Jãb¼¶mŒ=>¯–'¦˜h,!«Y§ ëª×¬S…eT5ëTaUÍ:UX’\ë3SÆ8ýØ-JË=ÑúÌ´ñfdÈÆ^ìµ>3ÍÞðpìÝ ”c)bͪ\öÿ½Äãöjy" ÷î0üÜ_Ì– ×,Ë…5ík–å²ïÙ§Ç«á‰&&Kñj–åÂúе=Шí™(þƪ±95ÿßÕ[T—%©—¤l%ˆñs‚ò8äüËéiƒÜ,¥¯Ù ý™›ôx5<ÑÄlaGnjK¹Ù‘›š-¥Y`~©Êš€5¿ÜœàKØL—´¡+µš¥ÉivF”u}kvF”u}kžGQÖõ­ørsbN±ž{E×ó(0ÍÿáA© endstream endobj 3680 0 obj << /Type /ObjStm /N 100 /First 1049 /Length 4315 /Filter /FlateDecode >> stream xÚ…\½Î-¹ÌïSt¸'ØqKI0ü ›.&XðlàŸ÷_©(88ª+6z¾:”T,µHQê+æñ¼X/O™õiÖæƒ<þjOHÌ}Jq›Oö”VðsŠiOý)}üd<ÅSK±bñŽVÛü[ŒöÕg»QŸÚ_üm4ð žP­Ì§ñŸm45žFG^|>ÿ‹6‡ýiÅ€ÆÓ$â‡Ì16«ãoþ–§ufo}ôÌÆ“<*“†¿íQ­:ŸôQÏßÙ£ÑñäÕRçS¬ ~™öÑGyŸÁ*ÏøŸÏ§ú¸´i11šÃßÚãs,EŸþbTÅž^5’LoOýé^ç¨J<=šŽ>Ƹy-Óáe>Õ'¬Ì±Ty¢O¼¶§¼¯â‡CÑÉl±E^-øëäõÖæãÐä ­Æ¯Ä;z’w—2M椎ÇnsP£ŸRߎŒÞjÙÅðI©Z'c½UŸÂú°-5f£7)³ÑÛpÎìmWdxtüµÞ¤Ûôãp\i/†> Ò,Ç KS™,Fã¥ùœÞæl‹üíèMS§6zÓªÞtÌÂÑ›ŽÞ´ûü«ŽÞì…c‚–u6¦2',†®£7s¸\GocN᣷!ÁtŸŽÞÆððƒÑ›Ù0GoÞûœÃ[¥xrŒ´ æ môÖ.±Ñ[÷9©}¼TÃýÃh¦DoÍhr<6Ÿ] ™JÌ +sL%Bæl¼Lïà1z-ÖWæ+æ>^§×0HïÓÐjJè2^¼>¯ÚpSÇt<Ž×a>ÚxœúG¡ømêø3~;z«þãüñ‡?ÿïï¿ýãùŸÿøÛ?þùÿúý/¿ýý—ÿ,Í~éŸGd¼ïóßÏ7À*Áü—Ì9öNpLb ²rËŠVûÄ~ýñ‡ÿúëïý'ónøë?ýéçDýAÓA»mÒK1V(fÀ¸ƒ˜P N¯þ‰&F¼ÞhB³±”ìÝöÔLœcЬaÙ~b ÑZç ÜÞâB5>ÌòÌuüºéË{†pZ8å´rÒ©pÚiã ¼oåÈ6ÇMLotágá~®Ï8¡ ùŒªhÖ8¡ ùŒO§ ÷›]ØÖ³¼’…|Ƨ\…|öW@> B>çS¦B>çSž¸‘Õ±¼‘¨ç\=zÎÕ¨ç\=Á˜«'PÏù /ð¾û…í71½Ò…|Îåð£j\´Ù¸ 1#÷ &Dk7¦ö!–7¢˜Où?°·Â± Ì(&Àœb X§˜»Íßm!ž†Gš:™Œ\”ŒVUFò©+À¸]æ`b Ø‘%¼ÛÝHêl¹¼´WV(æÀ*Å:0¡Xk «p¸_Hêg·»¬«P¹*ä*T® ¹ •«B®B媋%eŠ•tlVÞ3Ëú~ˆá&ôªT¯ ½*Õ«B¯JõªÐ«R½zQ<žùÚ¥}ˆá…¥@°JV©` £¥š@’—¾péK] ¾õLQö—Òo !ÇKå€/SãÍ•—©oXʪ4 A)Dl-eç ¢Û¶vGжBBl-„,e·µ²ŒÝÖRÆv[KY †a(rœª9àÍîB<„ò ¡4ÀB( J“‘¥–Ó©•3?ùìfz˜‹,3ñœolâk¾ÙK1Ø·ƒLÆ»ƒ§s#ðsŠß9€_÷b¾æÛEøšolák¾™Q Z±-€¯ÐÉv¾B§“ß7a~݃y¾J}›±Ó©^;ꕱÓy›Ð‹¥þ¾b§·3Ëú!v7’ЫS¿gèìÔï:{P zõH*% Žz㨟Ýî•NI0T:#AP©cÀO©_0•¸¥çûõÌï›Þ4;Ò‹Õ.y#§p(ƒ Kä#…ˆy]Y»ë»q| ã;‡Ù‰ÜøÁd $ * j€*ƒÐ>k!û— Í~Uÿ~Â/»Û –\ÞYípb`Oò̉~壒 N  ÙàÄ Ø©$»F¼Þh:šÚí|ŸD^Š°Â°œ”%h‘J1x\äÂÒ?ÄðÂë» ë» P¡¤,”$”,TIY.BÖ}¾^u„Œ…Ê+U"’,¼Ö|éHÂ4 8“$á‚ÃŽ9xŽu3;Ò«ém’WYuå@;ƒr Á ôE Ú‚²zÊNs¬›Ù‘žä´ )MmI”º'„—‰””';ãvð É'ÇëÉ9ÞÝîȱ­Åd’ƒcI&918‡”’'†iOò½‰aÞ“|ob˜ø~ mËNÓðB¾UêÛ\üœê•‹ŸS½ I†”s•ú4çj?S¬ŸÝìB0ç*•jUbZ½Rͪ¦ôB!83Þ3¿ï‰ª×È¿j¢ó¶ëò,t ¡„"É`]UM!Ù`]UM‰ãë¨{ä×kä_EQaéä*Š ©–ÕUR›ªY•N½ƒÉßXƸʚí-–þ!†–ˆüíåC`T0ììÚKÃÞ¬½T0ìÍK~VY³½~¦¹EÞhv4MCU´½T0LÙN=€ªh+T0”5[¡¯Êš­Ô Ëþ!†–Á .+T0`… &¬PÁ‚úŠ<~NårÄ»á&+T0¬#²Ä2Ò)I¬"rÄ*Ð)E,ýÆ0>»Ý… VR£¨Yüml÷”¥ÏÆ6OY¼llïä«Á`”÷Ìï›ÞíšKÍZJc[£¬¥4¶ýÉ2Dc[”¾ª ʾŒAÙ×qµÙî·ÀìH/Ö@‰G#ƒrcwÖ<)úÖ¬y4r¤\³æÑØ6‡©:n÷ÒÆí(uü Bk¬K¬lxY9^g²CÁÞ%HOعDÓ3µ¯ÜF.{ž #”¬5’´N’’ÄÄ`gÜzï‚ÛijÊ÷ÌL³#Á7Ó¬FöÃ|!ûˆ‰As²˜D'ûˆ‰AuR7žd÷Óü\#Þ /4áZ¥®Í4Ë©\™f9•+ó$çmB.wŠÁãÞÏ,ë‡ØÝHB/§ze–Õ©^¬ÒÁb¬Jg:SÚú²÷ÂP?»Ý…!&–щ…yet^aZ‘M¿d¡´‘ô[²&×:µ‚Ãz;óûʽav¤—¤F¶J’¤FvJ’¤F6J"«AcP6è Ê´~‡ ˜éeaFÉ~F² ¤.¹—W²‘ÜËk¡ * Ú :eÛ9ÖÍìH/·ÞJÒiY[o%¥qÉ ’L[r¯¡$Ñ]ÔAIý(ßv™f~é·`]:è½ ê€ ƒQ6“Z%I­dR«RÏô¾#ýí8_2#VÖ%œMMÉã|:Pø‹$š’ÇùJîHfßz¼°)Ûq>ÌŽô2uW’LJæÑJÊ· Ú%j™ˆu  ÌdJAa;øm—E¥e"¦$$´ úJBB˧$$´ yJ²·–!OIòÖÊÆ)?˱nfGzeqè¬Ëä ’œµ[9ež9ØÝîH0ì‘ÀÖ2Ì l-TŒ”ÙZ¨©²µ<1Rd:Es¬›Ù…^G»Îº @D‰LŒ„¼¶NhŒ·uBc•ÛÁÑõÂð«„–vGŠ™š Â-S#A¸ejb…²‡‚$޶LMŒÄÑ–'VOß¶NÀìB ’ Üò˜ÁHÒÒ2×±Ú”Bƒà/r:Þ2Ÿ1¹Ðû–O/¥—–É‘òQË|Ƅ҃³IÀo™Ï ø-ó#¿e>crÊÉr¬›Ù‘ÞºÞi,@¯ëFn(µL¢ŒT¤ZæAF…–y‘ªSË<ÈÚ)+[£Ýì. ¡R£$ )å·vƒ:%•ÈåÅü:p@Ê 8LíÌï+ë¼~à—_Ëvu o“½w~Ý7 `üENóÛ¾Qæð—åÛ*Ÿ×ûò ¹Ñ.Q/³NcÉT_³š”dÖG}ãvP‰å ùIßÀüLñ«v}ÿ /¿Dh§è“àçCê ‚º,±ë©.KìzªëÇtûª fz˜¤`—ŸÝ ˆ¨›#ç'ù™P1r~’_ #×4ó#¡b=Îô¾DÜDÖÄÜðDŒ ²²"ÂYV5w8û¬ÍËûÅHeGs—bqL=ã;4ÀìDLs‹cAG_’ãs}—;ŒA˜{¤b¤Y—3rø­¹1ò÷´í˱nfGz¹1r’XknŒœ$Öš#é@P0h2wRgÒ¼EæåôÖé¶1‚Ù…^G»”C"ó/wpNRÍÝ“dNÛ‚ÈtÈ<Ï¥é}½u0;Ò³Õ.™f„½Eëã'áD3@;‰Ýš1Ö•v†ù § ƒÝÌŽü2@;‰ÝšÚIìÖ ÐNb·f€v»5c¬“2‡fŒõã¥-Ý.jëí¢¶fÈs²ðk†<'¡[3ä9‰Üš!ÏIàÖ yN6û‹Þ)&èò`v¤—ÊÉY‰f„rr¿J3B99KÐ 2NÎ4ÏN\OÐ<;õ~:Ó̱nfz˜K$6k¼:‰Íx ‚Ì?ËØædñ·uÚI}ÀÖQhû™Þ×Ú’v'~¶R;YÊm¤v²–Û: í…’Ä”Ú$Z|i‹hðxKk w³»PT4\YŸH䀃: ePÚ§‹epïDzYŽu3;Ò[)tR)° ü³XþNbœeàï•ZÁ—$üYþ~,*­Ánv‚P‚\¿±Œü”V,#'¥ËÈßIcBp&Ù¶O vÇ}»m×ÏÓîȰ®—lÜ'¡ÈÎ}bPŠÜ™¤"2&­È‘‰ÁÝí´Ô¬ï†7š«QMà¡€„:ü…ò}¡ôÁþxui v³»„ëÈ÷ªu¡Ô1SIÉ2íÆ!ÌT²óìü=3üž©r©²f*9™„"»ß‰A)’M R‘4hbЊäAƒ»ý¸âÈ>Så:SeÍT’HM z‘cËŒnÔ;pŽQçÀ7F}×X»PìŸÝîÂ~5êW¸•Ôh,0ºQ·À+¤Fc¹gê$E´u„Ñ¥ Û>I»#ÁuÒƒ÷ È|[Ÿ¨tR~°õ‘I'7Kl}dÒI ÁÖG&=NÙéñnx£ µHÂÖ7*T!,Ojz§€:uøwÊô÷|Öh7» CøŽ\<¶<çérõN©c¦’™å¾³Ìu]K‰r!ø=S¯_„Øú"$ÈŸ­/B‚œ¨Ùú"$HÃÖ!Q8IFY¢»cÊöBìöïÎXg)AYgËÏóD*X~ž'RÁòó<‘Š—ú³²3?ùìfz—’fù&È¥['RÁR÷> stream xÚ…\ÍÎä¶¼ïSè˜ ›dwó0üA¹>ØÁ"0u‚¬ýþaõiGÃò¦%Š]]-²›â|Rj8Â!¥¦#%ñ 9T³_è‘só ;jK~‘#®Ê%á®zDSÜÖŽXŠ£-)„ø©_ÅþTÜ×Ԁʑr)~¥Gj!ú•“úU¿Yð¼Öo±ñ¼zH÷µCƒÿ3šL>P­ÑÛÒ¡Åí«¡“h‚nzX´æWv˜ŒûòayÜW«Š«zäPįڑ%øU G6Ñ>FŒG.méÈͽQ£%ErÔ£¨¿²£äb~•î· –£÷Z*–ýªÕª·¥pÔ~K#Å£õ)-\ÉÑ,øÝ9­®ìh-ûSºccˆÝ‹ý² ºCü²+²9ÑÔ% µø Ýi1†Öú@û¥à^IýÒ`’H¿t‰û¥1…èæ‰õËnÒGëWn–ôÑR hí£¥&èÖG“˜½Uûh"ÍúhÚG“ ?uGGîÖ>š†âFjMSC·>ZÜÐGÓbîò>zÔVqéÑ–¢ê1Ò±>šåœûhv´ZÑÚGë’úÃúcbNãÞ>ZÖàO°>Zîà—}´\¢s³>Z®Ÿ]¡ÑAp¯wlnCÐGë}cúä>ZÉÙÚã¤;2ùss­‡¯l‡bn/vmÜgÝ[±ÓÆsûhu„eíb-þòÕÒGëo_í£uoÅà¨Î*¶„€ì1ÛCÀß,:öÈ@k­UDIÉþ6\–~™À¢ë˜‚g\Z¿,ɬþæ¶Ô>ýðçïÿöó—Ï_üéß_ÿí/¿|þßw)ö]zô'÷˜ ÇßHƒPf* Ê€*ƒ  æÐOŸ¾ÿë¯_~ýÚ:uûéÓ?.èÕ‡{+ÌCæï" Ä H$€”A Èd€òš^}ÌÝ–ô²{Ôƒ YU §´*Ã)}z$œƒà”(+z°u궤W†G£²!áÑh ‚Sbfœ ƒà”HüU‡SR\у­S·%½:<šM 8%)ƒà”DœÒ™!°kÙVäê뛷ㆾ¨Í£‰…ê@%€90k ƒSžýWã é‚ÕL*îX%<6’€ìPd @™A ˆøCÆX©1cIX±ƒ­S·%=†JdCÂPI 2@  HTƒ* Õl9lº-ééð¨ëPpL ÅÐOy?H¡bp§ŠÁŸ¶šS†Ás¿IÈa‰:↠[•Ú S52c) Ò«lÚcî·!ˆÀQec"pÔÔ‘wÐFX˜Ra‘…bè7¦¬÷ ˃ô[2´3¨ØœgCB3p£G´p© ‚„¶JÊNc§~‚06&$Ì‘AM÷#—ë =… a ƒ3KZ|U0ïæÑ‘$ö¢‚ %Š2Jc”(™Aðe) ‚/Ë2@ó4æÝ<š‡…„çÈ{1D!Ñ"ÅЯÑ~© ƒàçªk‚í1w[yg¬Æ†„H53"Õ ˆT+ƒ R¥Î„ŸÛr™ŸòNt[Òùl$5ŸC.RŠbX¤X–(&À„b l)aÖÁº]ëXKÈ:–eŠ`…bX¥XÖ†n¶!i¹ß†$^€Fy †¥n”b¸QðK „[B]ó“ÇÜmC.%…jõLJ‘Bˆa C?áýÃ,Çmg ‹¬)¾N5è·äØÎ7€åÈíŒa–$·3†%S ZI¡ÄbYp;cX–+þ°x ß&êÛ½”ê• —R½ž©ô™‹ÔÏ‚¿“®9¦ÇÜmÃZ%ª¤JT*(•¨R*Q¡ © ñ^İc÷2Ó´Má wD¶±Gw$DÌÌÚ(Ü)¨B0ï†~¶šg&åF·%»p¾ùÖè %’¬:†X"Ùªcˆ’®:†€ e…cˆˆåÖÅiñÜqG•‹"[6ïõÎxw3•k¼»™Ê<ÞÝÜ6,ëƒtܰL¬PÁ+T°Á ,A°BKŒ¤ôŽÁãÅÖ4“ØŒ~;’PŠåféŒEã€VlÅI#MòÁ1¨Åæ¢ñL$nHÚcî·!‰$SŒÊ…$SŒÊ…$SŒÊ…,QŒÊ…,QÈž¸cpørSü´x ½2Õ I¦dª’LÉT/d‰’©^ð€ÐnÈe]„ ƒçŽ–H2%SÁdJ¦‚!É”LC–(™ †,Q2}C%J kš2¿˜’·4!X¡‚!É”Â=Á  ,…C¬ÐWY¢¬‹aðÜqÃI¦*’L)T0$™R¨`H¥PÁFšXé+2Òĺ™4=HÇMV©`#ˬT0Êd䉕 6òÄJ_‘‘'Ö¼aY¤ã†¥A°J3V©`šš ½”ê¹”¾ p·¦5G“ÇÜoCZ)Ñj·VÉH”åæ2Ò ¼_V)&À6ëÈkê*ÛÔUF²¡äŽc,R,K+À¸ã*0¥X¶œzdN^e·¡ÜÆiÔ·È4R½/h¤z!_ÐHŸ‰wƒÕ®ãhŒ†°æ˜s· Ch¨V*P© T JA¨@…‚N¬2§f4mè½fuºÛR>Ü(ÛÄU”U_ã Š²âkTQV{ƒ*ÊJ¯qPEÓ2D‡±S¿ A(Á¶ÆÇAe{ãã Š’]ÿ6ª(ùâÓ΃*ʪ–ó Šj^3|]þ·UÚyPEYÍcç§œ”bU‹S«Z윢XÕbçµÞÒ™O«ŒŽ;š‹=vÎp¬6guT¨wÆeT¯1EÕyLQV6,ëƒtܰDE¤FCE¤FCE¤™S`™S`™»_ž­:-ž;îhB°L©ÀB=€ŠH K”4ZhX¢¤Q–ëÛ(i´È†e{Ž–¨ˆ´Ð°DE¤… †ŠH  %*J-ÜuðxikšÓ¾¹m÷Íǹ6ª%*"­T0TDZ©`(i´RÁPÒh¥J]FÏýv$¡W¥z¡ ÒJõBA¤•ê…ŠF+Õ VêU˜¢aCÒs¿ IÔCÚ¨\¨‡´Q¹Pi£r¡ ÑFåBA£¾ (hty^ç´x ½ÕË W£zôjT/ƒ^ê…á”z£éf½´ü˜ûm8ÂT¥^‡¥lßuá4–ížG8}G8eÂ㦅ÍìúºRæÝ¾ù8Âi’0@Æ  (3¨* ª€*ƒ å¬š§ù&ïöÍÇNc¹÷y„ÓØžúy„Ó„÷ƒJl«±Œ<ÑØ®Vy¢ÉrN-Ó¾yÙî›—‘e9Yå¤byö8Œj‰Dy€«>ÆyR[WeÞ4/» uœFµDI ÞXõ1N£«>ÆiTcåÚ8Pj,o:”š–5Á×Yý–Ï㨦|Tè¤ÜXÅ Œó8ª±ãv^Ï–Þ$×ñ³-z›ØÚzWçº2ûD’?éã£éÙ&Þög›zÛG-p¶uÏ˵?¶eo‹÷ûŠ·Í‹ô7 ¾ÝøÎÌê›ïBC[ynóãÞïrÊ•NŸmî>½;Þ^ΊŽùÍ—,ÂOÄýv£ÍÈ«7ƒü¼v»Çº[nÆøovë- ü·ÿaÎV¿ |Ý÷Ƹ‚ãÄ7Kêÿ%㹩¡éÙ–N ÄçPð®ËüìЄSÓåÀåñí6nœ¯]”Û#ý`t´[“ŸˆŽõùEð%*Æ[TúÊÓ-|AŠiþæw}ÝöÆÌ¡©\Ê­Áu}ˆMî¨k‹}49wSŸkäë6nœo‚Å«ðMî( ·ÝQWu1šÜQvÓÚw¨¢Ý‚Ó7¦ü_ˆPóäŠ;©ïÌsGÙÇÇM4uëê;Õs|–Ìw˜bÖgK|c)æÛ¬äûI±„Âko·qã|Ï)–[¬øÞK,úüîùQ,v»ËuWÛw„bi·ŽÎ½¦DÍó±¯Û¸yÝ”ªÏžó-“Xoó–ïíÄvóá’È­#þɽãø$‘gow½± ÿ+AžeÄÞÌ}òÀ–L¸­.؉ åf/Œáæºþ¨j|¶³Ë¸ws]Æ/%o>Éã¿Üšð«²ô¼|dü,ßšpœ7ÜlÃáWåÓ‰}ÝöÆ<œG­Ï®Ëãhã³ë2>âË­ ŸßÛóÐûÕòüVìÎ%ÿ5òu7®`¯0߯@ÆŸ-)£¤x¦PÜQ9<û®¸£²Þšœ{~³RøØ×moÌsGå›ïŠ;ªÜÔ.î¨r[ÙúMõ¶tTwT¹-0Õ¹—̧“r-cõÝ2VÝQ¥<ÇJuG•úì»êŽªáù¨î¨z[ÿª;ª¦Û³œ{5wõZÆê»e¬º£Z¸âŽjú¬voi·d³¹£ÚUóü)Ü^ŠæéSxóRÔkkï–±æ¹S¸­ÍSÎû Ú<㼿 ÍÎxïèùfºEDóü1%>Ûµkkï–±æ¹æõ“¯Ÿÿùû¯ÿùíÏž¿—lýjLžÔßïô奥»5§üÒèÁ'º Ï7N†~`ˆÂûs;ÁM™&O:_š…/†wï^ >Úº{mþ„ú4üÓo­ì‚äðB¿3Ìo¾þñËE~&ÍHI»¯vFڱ佳ÛcôåîÙøgǶæQðó¼,!?U½#âHeˆzH¤ Áyçù´ð«…¯]V”pYŒ å/g#íÝ6ÒÞÖY03#í}ÜyµµìµËŠŠ ‡’¡Ü³i8¦ÓŒµ#9† G¥ÏòÀ,+mÆÿßyí´b4þÎõÿ-îòØÆOg+µÞ³ÚJ­Ç?“‹ ÿ]dÁkX9õÚ¿S'zõÌh?yfÈø Cpâ-1d^Ój¹×šÖØ[¥"1bFâçÀL.ü˜©… ˜‰•Q@/I¹…¯Öœ<4„… ÊDŒúoÆi¬ªðIˆDŽ—œ9ò[Få1õYÂgSM³Ýø0z®»Ý µBŸ s$€Ï†™á‹k^Í{°ïµýàL endstream endobj 3973 0 obj << /Author()/Title()/Subject()/Creator(LaTeX with hyperref package)/Producer(pdfTeX-1.40.15)/Keywords() /CreationDate (D:20150809162658+02'00') /ModDate (D:20150809162658+02'00') /Trapped /False /PTEX.Fullbanner (This is pdfTeX, Version 3.14159265-2.6-1.40.15 (TeX Live 2015/dev/Debian) kpathsea version 6.2.1dev) >> endobj 3882 0 obj << /Type /ObjStm /N 91 /First 925 /Length 2893 /Filter /FlateDecode >> stream xÚ›Én$¹†ïz ­Ã”¸Æ x.†Wx9sèéÑ4ô†–úà·w³~Y•I²ä¾ìŒ$#þ`d~™ÕE$…ŠH 9ªj¨¥ù ö­ÕRÒ~HBª•|¤!‘úùCÒ*>J!çØnl”C®Í—U[Ÿc·Öµù*>-§ì#[ªR?f8ùÊj'+õ•5ÔhÓŠÆjÚF)Ô¬|c£jõ•5–P[Î>2ä*4¶P¹²(T¡è#U™|$¡Eí34´ÜWI1´’ÝGJ¡ÕšÌ‡ÙZëÖ±¯œjhÜ禚ns)PÌÅG(•~LåÖ×Ó@…=‚UO®æˆb58±ýÓFÅ2_ºµK®ûÈ-p$9Sà$}œ=‰š%pMý˜nÙ•˜ª+)07÷Qr`!ª”À*¾r©A¢o€ZÂ$' P’= CjíçIÖúy„º[^X\[MÁjȦl»ã9¨%XæÔG5˜ÊþØêî£zYõ]°íÑÖ3iå£ÝoÕ`áù±ƒº¥bÌjN,')¦a+6ÌÙEY–S,Å×l͆µ§ÝbN±q?×*8r싉{ö¬@Sô:²z³"¶…ý\ 2¥TÌ[*}#ȼ¥ÚshešRÓ>ͼ%Ný¨_/›˹]:}_ȼåX<2ËaÊ©×)›·lÉ7oœ}XÊÍ÷ßßÜýå͇ûÇðïß=~ýåñþíÓç':ñ­u±ëöïáÒ nàƒOéÖÊ6 Ù m`(nСšasþóÍÝŸ><<âÛÏùùæ‡f‚ÔÃ#»žöÎÔÃ#»€Ž ,³Ï†ÿÙÊ©úzœfF[“ÛÌhë².ÄõX‡ó† /O²ÔI™ynfä‘Ñäô LÚ¦æìfšMUŽuj®n–‘êCüãéW´÷³LŸßì‡1äâ³ÝNfæìæ:5»À*s¯‡l·™Ù§¸Ö ãùW{iešIh=FÎS³ÇÈ ÔË#éÌêÕ‘ËÌZÜÊ×Ôo†Ó¯Š'¯œTÒ8‚­¸‹Î¬}-3«G_yfu¿mè×ÞS.rM9 ê~›}E¸ŸäÛ¦y€—„ÒÌjnKŒ3kskYÉ­2³Ú ºl×â\ø9úáìWw1‘–=óþŒ5´ö{A)yjf&™š}6Ïgg7Óuír;™~U¼e[$Ncð•¹|ßZ™ ô½Õ¹@ßÜYQ™ÙŸb¼¦Ó0žÿš¨{i³ |Ê4Ä}²NͶÁ5•©9»™gfß™úùz;žþ õ¾½uº½¾»uº»¾¹mº¹¾·mš8¿æhZuêÖz]y½Ͼ"œ¶Ëº–áθÕ7¦ðÌjcÍÖÌZÝÚfÖæVY-¥µ•µðsôÃÙW…K.“à¥ß±Zâ©ÙŸÎó|¶?£ç65û“zÖ©ÙŸ×ËUõ2Tß§¿F~s's¶­Î²›çÅÍsV×­•™Ù‹NÚ+ä·ÛñôWÈ÷Ò•i€^º:ÏKW§™óÄÅiâZ<Ï??/Û cP0@ípEm뺢·O÷§/¿½-%éÀ o¼!ð¦ç!:$ñyñ¦îëýãÓû‡Ç§‡ïNߥ8PEÐ@Ð@Ð@È%!$:tA—ë<x„‚†FfQ_¤\®¯;£cbbb䘔ĕòWH‚Ü B„"´òGg}¿~øåþ‹§øeWõì*äYR«H­"(͇/×{—ñå øTHRHRHRdW—ÊÒgìï .•Ó ±ç8ö1Hd ué³ß}/]Àìì“Îø°aÀˆ+Å¥Ï %/¥4È-%¨JP• êüЈ+ÑÊgJ‡Üú˲6p Y ²de¤;#°¼,"÷@{¯r8ÍЕ¡+CWF¾3ËË*JýaàâPNC¥º tè*HxA`eYFîáà5j×?¶œ„®] /¬.ëÈìo ™Gµ[!«BV…,“LªË:Ê|¨Ý2*]Ж@[ª~øImYEåP¹%T¾øRƒ&°”ÀRjË*騲½lpž}BHLQ*¨DË2¼÷)£ Ž 8&‚* •€Tâe9TPí/4NAd‘‰! X%`•xYBu{¯sy¬ žæT&P™ºÀV[IÊÒiëï©.õ–èàh& ™y_ |%Ñ¥ÓÞU]j"|‚Î:“BøJà+i[ùl[ƒöò®À™gRˆ^xåã3úåúû‹EO' 43ÐÌç·²6h¼ò¨{hç|*‚Õ (AÐÊ@+§UýäþbåâHó;þÁ%¸Ìà2'HX`å´ªw°»! ïî *3¨Ìš€UV9¯Šçxs/ñ”ëÀ%4Éœ¡ Pe@•˪xÜÁ®^˨^Df™ 4© ¤rYUO9Ôk-ƒ»Ç s…$•T®«ê©eó©ÃŒ0ft¯ ž2xÊuU<õ°“-®I°˜ÁbF/ËÀ)§ÜVµÓÒþ^×t”U ˜bF[Ë€)¦L«Ò±õwY¥ì—ÌÁ%HÌ 1£µe°”ÁR¦U鸃½Ï:¼€Ä 3š[J(e^;ØÝˆG{ 38Ìho e€”yU=Äû½ä6ò(3\EeY=pÛ{”a½‚À 3:\C åe‡+yÏ=á1øËà/£¿e ”P^ö·rxÀ“Q§ÉÀ¯¿‚îV€PBeÙÝÊ¡ÑÔè/Ñ÷.üðWÐÜ *`¨,›[w>ë‘! ,hn@T–Í­;Ø1Dóè9K€`‚½­€¢ŠÊ²·uGŸõx÷0XÀ`Ak+À¨£²lmÝÁîî£up•,`° ±`T€QY6¶¾þî=¶S9>k ,€° ¯€TRYöµî`÷°¥4x¼PX@aA[+ ©€¤²lk•öw*þùô蚀aA[+@©¥²lkÝ_(Ÿß¼»· XÐÏ *€¨ûÙóƒW°â ˆ+h_Ð@SŽíë¶®ÂÇ£VXA³*@¤‘rlV·uû·ó‹ÿÑí DUМ  (€¢ ~Òp^:_þ¯^|Âö…ðRAO*À¡ 9Yýü¯Ž>ï~"¯À©§‚¦T€DEô[~¡¶ÿÑ\ƒ«® zSlmßô{‰ÝÄg×ÐÀŠÊ·|¦,€VZh U€V }ù±èʧ`€UVX`5ÅÿëSÀø=®‚¯ ¾*øªà«‚¯zååñà=î𜰠À*«¬°º~yåÏŸ~½¿û×ã=N·‰Ÿï?þØãçOîñ¿»ÞSw endstream endobj 3974 0 obj << /Type /XRef /Index [0 3975] /Size 3975 /W [1 3 1] /Root 3972 0 R /Info 3973 0 R /ID [<1EAD5B5019D2EBBD94AA063B0927201C> <1EAD5B5019D2EBBD94AA063B0927201C>] /Length 9127 /Filter /FlateDecode >> stream xÚ%Üy¬cÿ_×ñ{nçÎ]zÏܹwö}Ÿ;ËåNgß÷}:û¾Ü™ùFþR~ZBÄ ( !J –%FªDøCD­!‚4¤$PÛ˜àÍÅXѲäÈ/?ˆMÅûxûÏsúyw;ç<_ŸÞ9=ïO‡†††þrxhhx(šZú'“O‡‡Ò/WÔV[¡vÙ0ËÔæÔ.ŽÀrµyµ‹†£0¦vLí‚á8L¨åÔÎfaRíªÚ9ÃV¨]S;k8+Õn«1œ†µ‡j§ WÁjµGj§ ×ÀZµÇj' ×ÁzµÏj' 7ÀFµ¯ÔŽn‚ÍKµæ”ZÎp lU[©vÌplW›V›7Ü;ÕfÔŽî‚Ýj«ÔŽî½j«ÕÎÂ>µmj‡ ÷õCjs†aNí²Z ãÁ‡Õ®¨0Œ7:ªöD-^*6ò˜Úkµ}†±ƒK{¾ìÐ2µØŒ88'Õ®«í5Œ»tÄ—•GÔbBÊYµ5j» Cè’éeý8±û†‹j—ÔvF–vad!Q‹C!¼ªû»Ýð\W‹¬Åa¿7ÕNªm5¼·Õ"¡ìÜ]ªµFÕ6ÞƒûjëÕB÷È«íUÛhø©Ež#*á‰ZìÇzçðLí®ZÄì9¼P»§¶Öð%¼R‹œFD_Ûá¡åsYµÕ†oáÚ¤ZÄû=|P‹¹:c¸ÕÖ©ÅÔøŸÕb¾­4\JöPsi²üý!wäÝan5MöæÒd_^ŒÉ¾ÂÐdo.SÛ£f^6Möærµj“†&{sL-˜ÓM“½9¡vCmÂ0î˜T»©‰]¡vKmÌ06h¥Ú+µxy{d-/FX—:æÌòâGµØ4G²¹tˆ—"ÀË Yh®W‹I»Å`s£Z°aCö››ÕfÕâHNs«Úµ!C©k.ÅqôkìbS‰mîT;®öÙPÚ›»Õ«E>šfJs¯Úµ†fYsŸÚY5.›fhó€Ú9µ†fwsNÍÄ^”CÍÃj\.¾34Ù›GÕÞªÉPÓdoSó·øÆÐdo.mîh=£&M“½yRÍÔâ+C“½yZ툚ì6MöæY5Î_šìÍ¥É>6@Mî›&{ó¢ÚAµg†&»Ï«±yDÍUCÍ«jq\žšìÍëj&Ó¢ùÖ4Ù›7ÕbßšìÍ¥É>V‰ý0W›&{ó®šéż¡ÉÞ¼¯¶OÍõÉ¿Ãxðaµj ㎪ÅûÆKÅFS ¿û c«Å±Íˆƒ³tÔ²µåj{ ãÀžV[«»RΪù‹¸¸Û0„.™žœñ¡º»a¸¨æ¯éâNÃÒeµ­jqè"„WÕâ`»á5¸®v^-û ¸©Çy«á-¸­æ¯éb(»wÕ"› ïÁR”' ñAº@^-²¶Ñð!ªíW‹©ñ >«]P[i¸4Ù‡ß/Möí__šìi.„N©%0¬æ/ûâ à ø™ y©áxZ.Â5i8 cjñÉ•5‡ µøK7awÈi.>Íâ!ñ¢Þ2wJmÌ06ȇV.‚/? þw˜óߨÅ冫€£\|ðĦ­™¬ÚÁÅe†ë`=l€°%ZycÈ­Mà¤ê¤¡ê?Uªݱ ¶ÃØ »`7ì½0 û`?€ƒ0‡à0£0Ç ÇᜄSpÎÀY8çá\„Kp®ÀU¸×áÜ„[pîÀ]¸÷á1ÄþnM†¦[q\Ój¼”ÿ3TãõžÀSxÏἄWðÞÀ[xïá,ÀGøŸa)“™Œ³ÊLÎ%—¸g™pÞ˜g‹™qpŽ˜É‚3ÃL Î3Sà,03 Îý2«À_f 8Ïˬgw™ àœ.³ œÉe¶ÀˆÁg||± ùø:!ì?M†æÿWÜ‘I2黸_"C>¾:†||aM†îµôáö?~j(Iþ¢ŽoF’¡ËcèÓ§y¶—yŸkUÿ“ÉùÿiÕYjÕ9{>¾0ˆo¦“¡ßþžx® å}ÜTýG³êÐåý5¨úSu˜òñ½Àº$ù“߈gÄW•©¼Håãå·/ò–¤¼ å)/HyAÊ R^ò‚”¤¼øä7%Ãÿy$ÞÃÿªãàœ¸ê£´êo@ÕwÕ'uÕ‰bÕ>«>T«qÔD//fùÃÉðû/ñR’˜¸¼ å¥./uy©ËK]^êòR——º¼Ôå¥./9yAÊŸH†¿¾2^Oó¢—½¼èåE/‡.HDþ^2ü͘Qy©Ë‹Yþ)H]^Âò–—°¼„å%,/ay ËKX^ÂòrÕŒ0,$™¡o‹³¦[N_3N_3NZ3NZ3NU3NU3NP3NP3Í8œ“Ñá ñ4Ÿ/NA3Î3N3Íl’Y·&îõ™ã¼1ãD1ãô0ÓŒï‚âK“µIf÷d<.¾ Š/$©`¦ßûߌo{ˆoÆw<Ä7ã›â›ñ}ŽOf|‹_ÛH““¸L3¾±ñ â,ÓÌ%™Ã7â-ùu®–q®–q6–q6–ižK2·¿7Â¥Ó¯ŒÓ¯Œ“ŸLót’9úq/µÎ·2β2β2έ2έ2Ψ2Ψ2Σ2ͻɲò›xµÍ|2Ò9C#Ny2Ny2Nˆ2ÍûIæÂoǽ&ާe‡ÂLØz–,û¡ïŽ{9wV”q”qò“qò“qÊ“qÊ“q¢“q¢“V%Çù̲CC.?'#¿õb˜@F`9øŽ§:›Œ´áiuFmÁx2:ññÜ,LB +` VÂ4ÄsWÁjXka¬‡ °6ÁfØ[al‡°vÁnØ{aöÁ~8aŽ@ÎÃÉèš=±õGaŽAâë»_Ú_Õ:¾ ;t|-wèø2îÐ%¸ Wà*\ƒpnÁm¸wá܇‡‡ðžÂ3xžŒžkÇ6¿ðá˜[O’Ñm¿µ—ð ^Ãx ïà=|€øŸà3ˆEÙ«”å < ÂP^ÂPŽ0 'ãC‡’±-¿†2ûe.ËK‰86wÈAYÊrP–ƒ²”å ,e9( MÙ‘,¯KÆ6¬ç CYÊÂP†²0”…¡, ea( CYÊÂP†²0”…¡, ea( CYÊÂP†²0”¥¸|Ä¢,e9(ËAYÊrP–ƒ²”å _ÙÊAÙWMUzúq˜Î'c~9vA"ÊQ–ˆ²D”%¢,e‰(_±(‹EY,ÊbQ‹²X”Å¢,e±(‹EY,ÊbQ–âò°e)?‡È†0”…¡, ea( CYÊÂP†²0”…¡, ea( Cß~ô…¡/ ýL2>û÷¢& ýQ¿þ8ÈA_ú„ö©è$ãË÷Ç3„¡/ }aè C_úrЗƒ¾Ïƒ¾ õ}ôE /}è‹@_ú"оôE /}ç[U‰í³ß'¾O|ß±ïïNÆWŧ^_úrЗƒ¾ôå /}9èËA_úrЗƒ¾ôå /}9èËA_ú>úRܯéÙïÇ—ó{}{ÇïJ2¾õllôE /}è‹@_ú"оôE /}è‹@_ú"оô#„"оôE /}è‹@_ú"оôE /}è‹@ÿ+>”ŒßòÇadá0,Eàðõ.ƒX£0ã0Y˜„VÀ¬„i˜U°ÖÀZXëal„M°¶ÀVØÛaì„]°ö@˜…}°ÀA˜W.Ž$ã'-öí(ƒ‡p NÃ8 çà<\€‹p â2̈‹/× .¹Ü€¸Ðr âòÊpQe!þ¯—>âÐ=HÆ/ý`l•K) ®,<WLž‚/<WG^‚k" ¯á ¼…wð>À|„Oð8wr;ÒJ`2@w‹îÝ-¦[L·˜ne“ñü©xÉ-fZi2~ÿ—¢Æy‹óç-Î[œ·8oqÞâ¼Åy‹îÝ-º[t·èn‘Ü"¹EEk[2þv<^žóç-Î[œ·ènÑÝ¢»Ew‹îÝ­C Ï­#@wkènù:¦[Jw‹·ÖÉdü[þg¼û-ö[ì·Øo±ßb¿Å~‹øñ-â[t·ènÑÝ¢»Å`ëz2^ø±xQö[qùìÄE3ܪqtIn=s)J&n]·| Oà)<ƒçð^Â+x o༇°á\÷Êu’ë$×ù­ó[ç·Îoß:¿õ‰d¢ô“ñ Bë\ÖOÁd2ñôëqµuVë¬ÖY­³ZgµÎjÕ:«õͰ¶µu.ëŽxË:—u.ë\Ö¹¬sYç²ÎeË:—u.ë\Ö¹¬ \Ë:—u-õD#Æ 8Ñ[Á[ý pY?L¼ýÕØ£sÀtÝÀªC\ç·Îoß:¿u~ëüÖù­ó[§¶~)™ø¶-ñRt×CrDªþ¨­S[§¶NmÁúýdâ;þw<—é:Óu¦ë±L×I®“\'¹Nräú'­¡6L/}èïx¼”«ÒÕQ÷C–Á,‡¸w Æa²0 )¬€)X «a†’‰ŸðµúØüt2Ñú…¸µÖÂ:X`#l‚ͰöÂ,ì†UÉÄÏþx•­° ¶ÃØ »`‚=ÉÄ¿ù›ñŒøÿµ[/àp2ñ+ÏãŽ#pæáäà8œ€“p NÃY8Ñws¢ÛæD͈Κký47 ºhnÞ™ù;p´ÈÌ?1óA;ÌücÐ3ÿžÁs½3qè^&¯Ç~¼‚ØÁ7ðÞÃX€aø _yÏ­$ ö+ìWد°_a¿Â~…ý ûö+ìWد°_™â+«@*tW讬K&þàwãÝ—ŠãRq¬*’‰Åwˆ@E*"P Ó¦+LW˜®0]aº"•= *Q©ì‡pæ@*‡î ݺ+tWè®Ð]¡»Bw…î Ý•3Ày…ó çÎ+œW8ïÅÖ_I&þëwÄ-º+LW˜®D—ӕ袻QtW¢Šî ݺ+tWè®Ð] Ýb[y LW˜®0]y tWè®Ð]¡»Bw…î Ý•¯’lÖwZc=¦{&{ÏÑè%ÉÄÿøƒýû=ö{ì÷Øï±ßc¿Ç~ýû=ö{ì÷ÌýžôD '=è‰@Ozf|Ol{f|îÝ=¦{L÷˜î1ÝcºÇtéÓ=¦{L÷˜î™ç=º{t÷èîÑÝ£»GwÁÞÑdâ¿;ÈyîÝ=º{t÷´KTµ†=]=“d—ýp<ƒøñ=â{Ä÷ˆï…xî™ì=¡î uýžÉÞžôD '=è‰@Oz"Оô¢NzÑö&=è‰@Oz"ОôD '=è‰@Oz"ОôD ÷•‚†!Ë`–Ã(Œ%Ù¹r<ø…‰$»²µ,L ˜‚•0 3° VÃX ë`=l€° 6ÃØ Û`;쀰 vÃØ ³°öÃ8spÃÈÁC˜O²6Æ~‡“p NÃ8 çà<\€‹p .ø ×à:Ü€›p nø ÷à><€¸tî0µãÆçïá,ÀGøŸA\o‹@[Ú"ж´E -í1‡ à¼Íy;âÛÄ·‰oß&¾{D|›ø6ñmâÛÄ·‰ooL²—¾+6ƒó6çmÎÛœ·«öæ${ìM<K –(+ÝJ²ß÷‡ñ4BK„–-ÑX¢±Dc‰Æ%K4–à=^@:"Й9èÈAG:rБƒŽtLçŽ0tä¯sÄ¢#±èˆEG,:ætÇœî˜Ósº# sº#4¡éÜÕÇç~’ý“‰Ø*éHG@:Ñ‘ˆŽDtä¥cŠwd£#ÙèÈFG6:²Ñ‘ŽtbÏÍtÄ¢#±è|e † aÈÀ2å0 c0…VÀ¬„i˜U°:™Üx'Þã¬M²ƒoÄp¬‡ °6ÁfØ[al‡° vÃØ ³°öÃAˆ®ûC½öG :ìç!úêsÝô'@ýÓS sþéÐ/ÿôœ‡Kð>ÀÅdrd[ìÌe¸ ×à:Ü€›p nÃñ÷à><€<<„GðžÀSxÏἄWðÞÀ[xïõøÇÑ]H&W®Šíût× kt×è®Ñ]£»FwéÓ5¦kLט®MÝ5ºkt×è®Ñ]£»Fwm5¬I&ˆ7¢¶FmÚšãW[ŸLnëŽLט®1]cºÆtéÚN »FwîÓ5¦kL×Ý5ºkt×è®Ñ]£»FwîÝ5ºkt×bÉݵX(Aw-–GÐ]£»&±µ‹>Aè®]±8aâ¸\N&÷Ÿý ¾F|øñ5âkÄ׈¯_#¾F|øñ5âkÄ׈¯_#¾F|øñ5âkÄ׈¯_#¾F|øZˆ-]9­_û _Ùð!H`2° F`9ŒÂŒ'“w¿+ž‘Â!È&“'~/j+`%Là ¬‚Õ°ÖÂ:Øal†-° ¶ÃØ »`7ì½0 û`?€ƒpŽ‚õ3‡“É‹¿Û7Ç ÇᜄSpÎÀY8 –¿\‚Xôâc©Ë5ˆ.±¢åÄ:–;«W,W™y©Ì<KSfƒ)3OÁ2”™ç`ñÉÌKˆå%Sn½N&oþõØ·`ÉÌ{°²df>$3Ô<¸@mÚµj Ô¨-P[ ¶0¡.\X‘L~ç‹x)V ¤V&“~(j$X-°ZXÔ¨-P[ ¶@ma+ð[ ´@hÐ…ÉäÛ߉µ©jZ5ND Àoß‚C\ØŸL~ë/ăçà0_ ¾ÀtéÓ¦ L˜.0]`º@rä‚%O¦ L˜.0]`ºÀtéÓ…ÀoßnìþídòkGcƒîA,Qâ¼ “8/Är$Î ±‰óB,=â¼ Ž8/Ä2£×öé.0]`ºÀtÁʡݺ tw½y—î.Ý]º»twéîÒÝ¥»Kw—î.Ý]º»twéîšÄ]ëšÉ]λ$wÍä®™Ü]ú0ÿ‰[ñntwÓîºdò»=jìwÙïß%¾K|—ø®‰Ý•¡.«]9èÊAWº&v×ÄîJD—ó.ç]’»>nºLw™î2ÝeºËt—é.Ó]¦»üvÍä.É]’»Ž}÷T2ùý[Êy—î.Ý]º»twéîÒÝ¥»Kw×ìîŠ^×ìî²ß ûtwéîÒÝ¥»Kw×ðªUU‹ýs!åI2Yþ•xsö»ìwÙï²ße¿Ë~—ý.û]ö»&{Wº±ŒLº±xLº±dÌäbX’Lýðå¸KÁ4Éæ2Éä?½µX2¡ù:§i>+¾¬7ÈÅ:/‹êrcÉdõA<Ø„\,ìòû¹XÎeE΂­œ%Ö9Ks`#øßzÎ⬜u¹¥ÿëýËéx)"gÝ]ÎâÀܶdòWŠqÇp:ç tÎÜÏY‹—sU:çë9K sÖMä,®ÌJ&ó»ã¹‡Á‚М‹§9kªsÖçåŽ&“ÿñgâ!Örç¬=Ìù)…ÜÙd²3wø+ž‹ËlV²æ, Í]I&÷:aËÝL&ÿøç†’tÇwFíF’þ‹Ñ¥a÷ßÅÐê³Ü¸—¬øÓŸJVüŸ_;|ç–»žLþѹÆr«Ôrw“ôû~jé~½¼ôà?ÿçCÉÔ÷üxˆ¨äüŒEÎï8äžÂ3x/ÀÕúœ…ó9«ˆsoÀZéœu†¹÷ð|læÂoìV\‹åu±îîa2õ¾5ÞR^ª“É̃~4ÒsYå²Êe•Ëjœy9öÕ5ÉÔOüV<.ÖÝÅ«HVY¨2S>ªq1Û±¯FÿšõƒÕ“ÉÔÿÏUõT2õ߈[§“•×~ nIV>øïqël²ò_ý•¸u.Yù»ËãÖùdzäÇãÖ…dz÷OÇ­‹Éôõzܺ”LïïÇ­ËÉô?Û·®$ÓßlÄ­8ùŽa§c¡µ7‹ÃÉÌÂwÄ0“Ì|Ë:·¾Ä–Ä/”ÄÏbÄÏÄïÄÄÏ”pþ%~"~ùß/ñ3ñ» ñËñóñ»$ñÄ~!ô ¡_ýBè—ø%„øéB¿ú…Ð/„~!ô ¡_â—ý?lb?úCÉÌ·ÿ¬mÖê‰NûV“ëüNûæ¹ÆèTctª1:ÕjŒN5F§£SЩNèT'tª:Õ Æ/{h‡NµC§Ú¡SíЩvèT;tª:Õj‡NµC§Ú¡SíЩvèT;tª:vhmØißd×jFN5F§£SЩNèT'tª:Õ ê„NuB§:¡SЩNèT'tª:Õ ê„NuB§:¡SЩNèT'tª:Õ ê„NãgJôb§}Ë©5A§š SMЩ&èTtª :Õj‚N5A§š SMЩ&èTtª :Õj‚N5A§š SMЩ&èTtª :Õj‚N5A§š SMЩ&èTtª :Õj‚N5A§š W|\ÿ÷ÿhÈ­†!Ë`–Ã(ŒÁ8L@&!…0+af`¬†5°ÖÁzØal†-°¶ÁvØ;aì†=°faì‡pæà†#pæáäà8œ€“p NÃ8 çà<\€‹p .ø ×à:Ü€›p nø ÷à><€<<„GðžÀSxÏἄWðÞÀ[xïá,ÀGøŸøÆ’ø;E|ƒøñ âÄ7ˆoß ¾A|ƒøñ âÄ7ˆoß ¾A|ƒøñ âÄ7ˆoß ¾A|ƒøñ âÄ7ˆoß ¾A|ƒøñ âÄ7ˆoß ¾A|ƒøñ âÄ7ˆoß ¾A|ƒøñ âÄ7ˆoß ¾A|ƒøñ âÄ7ˆoß ¾A|ƒøñ âÄ7ˆoß ¾A|ƒøñ âÄ7ˆoß ¾A|ƒøñ âÄ7ˆoß ¾A|ƒøñ âÄ7ˆoß ¾A|ƒøñ%ñS–Äÿ¬‘S† ,ƒX£0ã0Y˜„VÀ¬„i˜U°ÖÀZXëal„M°¶ÀVØÛaì„]°öÀ^˜…}°ÀA˜ƒCpŽÀQ˜‡cƒãpNÂ)8 gà,œƒóp.Â%¸ Wà*\ƒëpnÂ-¸ wà.܃ûðòðÁcxOá<‡ð^Ákx“ÌüÌw-¹üÅïú¶³{ endstream endobj startxref 1225609 %%EOF dibbler-1.0.1/doc/dibbler-user-config-server.tex0000644000175000017500000016573012420540670016466 00000000000000%% %% Dibbler - a portable DHCPv6 %% %% authors: Tomasz Mrugalski %% Michal Kowalczuk %% %% released under GNU GPL v2 licence %% \newpage \section{Server configuration} \label{server-conf} Server configuration is stored in \verb+server.conf+ file in the \verb+/etc/dibbler+ (Linux systems) or in current (Windows systems) directory. \subsection{Scopes} Configuration file can be logically split into separate ``sections'' that are called \emph{scopes}, for example interface scope contains parameters related to configuration served over a given interface. Some scopes can contain other scopes. Some commands are specific to a given a given scope. \subsubsection{Global scope} \label{server-global-scope} Every option can be declared in a global scope. Global options can be defined here. Also options of a smaller scopes can be defined here -- they will be used as a default values. Configuration file has following syntax: \begin{lstlisting} global-options interface-options class-options interface-declaration \end{lstlisting} \subsubsection{Interface declaration} \label{server-iface-scope} Each network interface, which should be serviced by the server, must be mentioned in the configuration file. Network interface is defined like this: \begin{lstlisting} iface interface-name { interface-options class-options } \end{lstlisting} or \begin{lstlisting} iface number { interface-options class-options } \end{lstlisting} where \verb+interface-name+ denotes name of the interface and \verb+interface-number+ denotes its number. Name no longer needs to be enclosed in single or double quotes (except Windows systems, when interface name contains spaces). Note that virtual interfaces, used to setup relay support are also declared in this way. \subsubsection{Address class scope} \label{server-class-scope} Class is a smallest scope used in the server configuration file. It contains definition of the addresses, which will be provided to clients. Only class scoped parameters can be defined here. Address class is declared as follows: \begin{lstlisting} class { class-options address-pool } \end{lstlisting} Address pool defines range of the addresses, which can be assigned to the clients. It can be defined in one of the following formats: \begin{lstlisting} pool minaddress-maxaddress pool address/prefix \end{lstlisting} \subsubsection{Prefix class scope} \label{server-pd-class-scope} That is an equivalent of address class for a prefix delegation. It contains definition of prefixes that are going to be delegation to clients. Only pd-class scoped parameters can be defined here. Prefix class is declared as follows: \begin{lstlisting} pd-class { pd-pool prefix/length pd-length prefix-length } \end{lstlisting} \subsubsection{Temporary address class scope} \label{server-ta-class-scope} That is an equivalent of address class for temporary addresses. It contains definition of temporary addresses that are going to be assigned to clients that request temporary addresses. Only ta-class scoped parameters can be defined here. Prefix class is declared as follows: \begin{lstlisting} ta-class { pool 2001:db8:1::1-2001:db81:1::ffff } \end{lstlisting} \subsubsection{Routing scope} \label{server-route-scope} Support for routing configuration was added in 0.8.0RC1. It is possible to define routing scope. Each scope represents a single router available on-link. In this scope, routes available via specified link my be defined. \begin{lstlisting} next-hop address-of-a-router { route1-parameters route2-parameters ... } \end{lstlisting} \subsubsection{Client scope} \label{server-scope-client} Server allows defining custom parameters on a per-host basis. See Sections \ref{feature-exceptions} and \ref{example-server-exceptions} for details. There are three types of reservations: DUID-based, remote-id based and link-local based. Following syntax can be used: \begin{lstlisting} client duid 00:00:00:00:00 { [address 2001:db8:1::] [prefix 2001:db8:1::/64] option1 option2 ... } \end{lstlisting} \begin{lstlisting} client remote-id 5-0x01020304 { [address 2001:db8:1::] [prefix 2001:db8:1::/64] option1 option2 ... } \end{lstlisting} \begin{lstlisting} client link-local fe80::1234:56ff:fe78:9abc { [address 2001:db8:1::] [prefix 2001:db8:1::/64] option1 option2 ... } \end{lstlisting} \subsubsection{Key scope} Dibbler 0.8.3 introduced support for secure DNS Updates using TSIG mechanism. Since this key is expected to be also used in DNS server software, syntax is kept very similar to syntax accepted in \href{http://www.isc.org/software/bind}{ISC BIND9} software. Note semicolons at the end of each statement. \begin{lstlisting} key key-name { secret "base64encodedSecretHere=="; algorithm algorithm-type; ... }; \end{lstlisting} \subsection{Server options} So called standard options are defined by the base DHCPv6 specification, a so called RFC 3315 document \cite{rfc3315}. Those options are called standard, because all DHCPv6 implementations, should properly handle them. Each option has a specific scope it belongs to. Standard options are declared in the following way: \begin{lstlisting} OptionName option-value \end{lstlisting} \begin{description} \item[work-dir] -- (scope: global). Takes one parameter of string type. Defines working directory. \item[log-level] -- (scope: global). Takes one integer parameter. Defines verbose level of the log messages. The valid range is from 1 (very quiet) to 8 (very verbose). Those values are modelled after levels used in syslog. These are: 1(Emergency), 2(Alert), 3(Critical), 4(Error), 5 (Warning), 6(Notice), 7(Info) and 8(Debug). Currently Dibbler is using levels 3 to 8, as 1 and 2 are reserved for system wide emergency events. \item[log-name] -- (scope: global). Takes one string parameter. Defines than name, which will be used during logging. \item[log-mode] -- (scope: global). Takes one parameter that can be short, full, precise or syslog. Defines logging mode. In the default, full mode, name, date and time in the h:m:s format will be printed. In short mode, only minutes and seconds will be printed (this mode is useful on terminals with limited width). Precise mode logs information with seconds and microsecond precision. It is a useful as a performance diagnostic tool for finding bottlenecks in the DHCPv6 autoconfiguration process. Syslog works under POSIX systems (Linux, Mac OS X, BSD family) and allows default POSIX logging functions. \item[log-colors] -- (scope: global). Takes one boolean parameter. Defines if logs printed to console should use colors. That feature is used to enhance logs readability. As it makes the log files messy on systems that do not support colors, it is disabled by default. The default is off. \item[cache-size] -- (scope: global). Takes one parameter that specifies cache size in bytes. The default value is 1048576 (1MB). It defines a size of the memory (specified in bytes) which can se used to store cached entries. \item[stateless] -- (scope: global). It may be present or missing. The default is missing. Defines that server should run in stateless mode. In this mode only configuration parameters are defined, not addresses or prefixes. It is mutually exclusive with \emph{class}, \emph{ta-class} and \emph{pd-class}. See Section \ref{feature-stateless-stateful}. \item[interface-id-order] -- (scope: global). Take one parameter that can be one of \verb+before+, \verb+after+ or \verb+omit+. The default is \verb+before+. This parameter defines placement of the interface-id option. During message relaying options can be placed in the \msg{RELAY-REPL} message is arbitrary order. This option has been specified to control that order. \opt{interface-id} option can be placed before or after \opt{relay-message} option. There is also possibility to instruct server to omit the \opt{interface-id} option altogether, but since this violates \cite{rfc3315}, it should not be used. In general, this configuration parameter is only useful when dealing with buggy relays, which can't handle all option orders properly. Consider this parameter a debugging feature. Note: similar parameter is available in the dibbler-relay. \item[experimental] -- (scope: global). Allows enabling experimental features. There are some highly-experimental features present in Dibbler. To make a clear statement about their experimental nature, user is required to acknowledge that fact by putting this statement in its config file. This statement may be present or absent. The default is absent. \item[inactive-mode] -- (scope: global, type: present or missing, default: missing). This enables so called inactive mode. When server begins operation and it detects that required interfaces are not ready, error message is printed and server exits. However, if inactive mode is enabled, server sleeps instead and wait for required interfaces to become operational. That is a useful feature, when using wireless interfaces, which take some time to initialize as associate. \item[accept-leasequery] -- (scope: interface). Takes one boolean parameter that specifies if server should support leasequery \cite{rfc5007} protocol on a given interface. The default value is 0 (leasequery is not supported by default). See Section \ref{feature-leasequery}. %%% TODO bulk-leasequery-accept %%% TODO bulk-leasequery-tcp-port %%% TODO bulk-leasequery-max-conns %%% TODO bulk-leasequery-timeout \item[guess-mode] -- (scope: global, type: present or missing, default: missing). Server tries to match incoming relayed messages based on interface-id first. If that fails, it tries to match based on linkaddr field in the RELAY-FORW message (see \emph{subnet} keyword definition). Normally, when both of those match attempts fail, the server will drop the packet. When guess-mode option is enabled, server will will use first relay defined. It may save the day, if you have only one relay in your network, but it will almost certainly do a wrong thing if you have more than one. This is as its name states: just a guess. Use with caution! \item[script] -- (scope: global). Takes one string parameter that specifies name of a script that will be called every time something important happens in a system, e.g. when address or prefix is assigned, updated or released. See Section \ref{feature-script}. \item[fqdn-ddns-address] -- (scope: global). Takes one parameter that specifies address of DNS server that will be used for DNS Updates. See Section \ref{feature-dns-update}. \item[ddns-protocol] -- (scope: global). Takes one string parameter. Defines protocol that should be used during DNS Update mechanism. Allowed values are \verb+tcp+, \verb+udp+ and \verb+any+. Any means that UDP will be tried first and if it fails, update will be retried over TCP. See Section \ref{feature-dns-update}. \item[ddns-timeout] -- (scope: global). Takes one integer parameter that specifies timeout in milliseconds. Defines how long client should wait for DNS server response during DNS Update before declaring update a failure. See Section \ref{feature-dns-update}. \item[subnet] -- (scope: interface). This definition must be followed by a IPv6 address followed by slash followed prefix length (e.g. 2001:db8::/32). It defines all IPv6 addresses that are valid on a given interface. It is used mainly for matching relayed traffic and responding to confirm messages. Server will not use that whole range to assign addresses. That is specified with \emph{class}, \emph{ta-class} or \emph{pd-class}. \item[class] -- (scope: interface). This definition must be followed by curly braces and creates a new address class scope. See Section \ref{server-class-scope}. \item[pd-class] -- (scope: interface). This definition must be followed by curly braces and creates a new prefix-delegation class scope. See Section \ref{server-pd-class-scope}. \item[ta-class] -- (scope: interface). This definition must be followed by curly braces and creates a new temporary address class scope. See Section \ref{server-ta-class-scope}. \item[next-hop] -- (scope: interface). This definition takes one parameter that defines IPv6 address of a router. Without any further parameters, it conveys an information about default route for bandwidth limited networks. That mode is discouraged, unless there are significant bandwith limitations. It is usually followed by curly braces that create a new route scope. See Section \ref{server-route-scope}. \item[preference] -- (scope: interface, type: 0-255, default: none). Eech server can be configured to a specific preference level. When client receives several \msg{ADVERTISE} messages, it should choose that server, which has the highest preference level. It is also worth noting that client, upon reception of the \msg{ADVERTISE} message with preference set to 255 should skip wait phase for possible other \msg{ADVERTISE} messages. \item[unicast] -- (scope: interface, type: address, default:none). Normally clients sends data to a well known multicast address. This is easy to achieve, but it wastes network resources as all nodes in the network must process such messages and also network load is increased. To prevent this, server might be configured to inform clients about its unicast address, so clients, which accept it, will switch to a unicast communication. \item[rapid-commit] -- (scope: interface, type: boolean, default: 0). This option allows rapid commit procedure to be performed. Note that enabling rapid commit on the server side is not enough. Client must be configured to allow rapid commit, too. \item[iface-max-lease] -- (scope: interface, type: integer, default: $2^{32}-1$). This parameter defines, how many normal addresses can be granted on this interface. \item[client-max-lease] -- (scope: interface, type: interger, default:$2^{32}-1$). This parameter defines, how many addresses one client can get. Main purpose of this parameter is to limit number of used addresses by misbehaving (malicious or restarting) clients. \item[relay] -- (scope: interface). Takes one string or integer parameter that designated interface name or interface index. It is used in relay definition. It specifies name of the physical (or name of another relay, if cascade relaying is used) interface, which is used to receive and transmit relayed data. See \ref{feature-relays} for details of relay deployment and sections \ref{example-server-relay1} and \ref{example-server-relay2} for configuration examples. \item[interface-id] -- (scope: interface, type: integer, default: not defined). Used in relay definition. Each relay interface should have defined its unique identified. It will be sent in the \opt{interface-id} option. Note that this value must be the same as configured in the dibbler-relay. It may be possible to specify this parameter by using a number (option will be 4 bytes long), a string or a hex of arbitrary length (please use the same format as for DUID). See \ref{feature-relays}, \ref{example-server-relay1} and \ref{example-relay} for details. \item[vendor-spec] -- (scope: interface, type: integer-hexstring, regular string or an IPv6 address, default: not defined). This parameter can be used to configure some vendor-specific information option. Since there are no dibbler-specific options, this implementation is flexible. User can specify in the configuration file, how should this option look like. See \ref{example-server-vendor-spec} section for details. It is uncommon, but possible to define several vendor specific options for different vendors. In such case, administrator must specify coma separated list. Each list entry is a vendor (enterprise number), ,,--'' sign and a hex dump (similar to DUID). \item[pool] -- (scope: class). Takes coma separated IPv6 address ranges. Each range is defined as first-address, a dash and a second address. Defines a range of available addresses that will be assigned in specific class. An example pool definition looks like this: \begin{lstlisting} pool 2001:db8:abcd:: - 2001:db8:abcd::ffff \end{lstlisting} It is also possible to use prefix/length notation. \item[pd-pool] -- (scope: pd-class). Takes coma separated IPv6 address ranges. Each range is defined as fist-address, a dash and a second address. Defines a range of available prefixes (only prefixes themselves, not their lengths) that will be assigned in specific class. An example pd-pool definition looks like this: \begin{lstlisting} pd-pool 2001:db8:abcd:: - 2001:db8:abcd::ffff \end{lstlisting} It is also possible to use prefix/length notation. \item[share] -- (scope: class). Defines percentage of clients that a class should handle. This parameter is only useful if there are more then one class defined. See Section \ref{example-server-multiple-classes}. \item[T1] -- (scope: class, type: integer or integer range: default: $2^{32}-1$). This value defines after what time client should start renew process. Exact value or accepted range can be specified. When exact value is defined, client's hints are ignored completely. \item[T2] -- (scope: class, type: integer or integer range, default:$2^{32}-1$). This value defines after what time client will start emergency rebind procedure if renew process fails. Exact value or accepted range can be specified. When exact value is defined, client's hints are ignored completely. \item[valid-lifetime] (scope: class, type: integer or integer range, default:$2^{32}-1$). This parameter defines valid lifetime of the granted addresses. If range is specified, client's hints from that range are accepted. \item[preferred-lifetime] (scope: class, type: integer or integer range, default:$2^{32}-1$). This parameter defines prefered lifetime of the granted addresses. If range is specified, client's hits from that range will be accepted. \item[class-max-lease] -- (scope: interface, type: interger, default:$2^{32}-1$). This parameter defines, how many addresses can be assigned from that class. \item[reject-clients] -- (scope: class, type: address or DUID list, default: none). This parameter is sometimes called black-list. It is a list of a clients, which should not be supported. Clients can be identified by theirs link-local addresses or DUIDs. \item[accept-only] -- (scope: class, type: address or DUID list, default: none). This parameter is sometimes called white-list. It is a list of supported clients. When this list is not defined, by default all clients (except mentioned in reject-clients) are supported. When accept-only list is defined, only client from that list will be supported. \item[drop-unicast] -- (scope: global). In general, clients are supposed to send their messages to multicast, unless the server explicitly allows unicast. \cite{rfc3315} says that packets sent to unicast should be dropped and server must respond with status code set to UseMulticast. That's a bit harsh in author's opinion, so this behavior is not set by default. However, if you want strict RFC compliance, you can enable this by adding drop-unicast in your global scope. \item[addr-params] -- (scope: class). Experimental feature that takes one boolean parameter. It defines prefix length that is configured in addr-params option. See Section \ref{feature-addr-params} for details and warnings. \item[performance-mode] -- (scope: global). Experimental feature that boosts server performance. It takes one integer parameter with 0 or 1 control whether performance mode is to be enabled or disabled. The default is 0 (disabled). Use with caution. See Section \ref{feature-performance-mode} for details and warnings. \item[reconfigure-enabled] -- (scope: global). This directive controls whether server will attempt to send \msg{RECONFIGURE} message at start or not. It takes one integer parameter with allowed values being 0 or 1. The default is 0 (disabled). \item[allow] -- (scope: class). Specifies that clients that belong to a specific client class are allowed to use that address class. Takes one string parameter that defines client class name. See Section \ref{feature-client-class}. \item[deny] -- (scope: class). Specifies that clients that belong to a specific client class are denied use of that address class. Takes one string parameter that defines client class name. See Section \ref{feature-client-class}. \item[option dns-server] -- (scope: interface, type: address list, default: none). This option conveys information about DNS servers available. After retriving this information, clients will be able to resolve domain names into IP (both IPv4 and IPv6) addresses. Defined in \cite{rfc3596}. \item[option domain] -- (scope: interface, type: domain list, default: none). This option is used for configuring one or more domain names, which clients are connected in. For example, if client's hostname is \verb+alice.mylab.example.com+ and it wants to contact \verb+bob.mylab.example.com+, it can simply refer to it as \verb+bob+. Without domain name configured, it would have to use full domain name. Defined in \cite{rfc3596}. \item[option ntp-server] -- (scope: interface, type: address list, default: none). This option defines information about available NTP servers. Network Time Protocol \cite{rfc2030} is a protocol used for time synchronisation, so all hosts in the network has the same proper time set. Defined in \cite{rfc4075}. \item[option time-zone] -- (scope: interface, type: timezone, default: none). It is possible to configure timezone, which is provided by the server. Note that this option is considered obsolete as it is mentioned in draft version only \cite{draft-timezone}. Work on this draft seems to be abandoned as similar functionality is provided by now standard \cite{rfc4075}. \item[option sip-server] -- (scope: interface, type: address list, default: none). Session Initiation Protocol \cite{rfc3263} is an control protocol for creating, modifying, and terminating sessions with one or more participants. These sessions include Internet telephone calls, multimedia distribution, and multimedia conferences. Its most common usage is VoIP. Format of this option is defined in \cite{rfc3319}. \item[option sip-domain] -- (scope: interface, type: domain list, default: none). It is possible to define domain names for Session Initiation Protocol \cite{rfc3263}. Configuration of this parameter will ease usage of domain names in the SIP protocol. Format of this option is defined in \cite{rfc3319}. \item[option nis-server] -- (scope: interface, type: address list, default: none). Network Information Service (NIS) is a Unix-based system designed to use common login and user information on multiple systems, e.g. universities, where students can log on to ther accounts from any host. Its format is defined in \cite{rfc3898}. \item[option nis-domain] -- (scope: interface, type: domain list, default: none). Network Information Service (NIS) can albo specify domain names. It can be configured with this option. It is defined in \cite{rfc3898}. \item[option nis+-server] -- (scope: interface, type: address list, default: none). Network Information Service Plus (NIS+) is an improved version of the NIS protocol. This option is defined in \cite{rfc3898}. \item[option nis+-domain] -- (scope: interface, type: domain list, default: none). Similar to nis-domain, it defines domains for NIS+. This option is defined in \cite{rfc3898}. \item[option lifetime] -- (scope: interface, type: boolean, default: no). Base spec of the DHCPv6 protocol does offers way of refreshing addresses only, but not the options. Lifetime defines, how often client should renew all its options. When defined, lifetime option will be appended to all replies, which server sends to a client. If client does not support it, it should ignore this option. Format of this option is defined in \cite{rfc4242}. \item[option fqdn] -- (scope: interface). Takes 0, 1 or 2 integer parameters that are followed by FQDN list. Additional integer parameters designate fqdn-mode and reverse zone length in DNS Update. FQDN-mode can have 3 values: 2 (both AAAA and PTR record will be updated by server), 1 (server will update PTR only) or 0 (server will not update anything). Reverse zone length is an integer between 0 and 128 and designates reverse zone length. FQDN list is a coma separated list of fully qualified domain names, with possible reservations for DUIDs or addresses. FQDN mechanism is defined in \cite{rfc4704}. See Section \ref{feature-dns-update}. \item[accept-unknown-fqdn] -- (scope: Interface). Takes one integer parameter, possibly followed by second string parameter that designated domain name. It specifies how server should react to incoming FQDN options that contain names that are unknown to the server. Allowed values are 0 (reject), 1 (send other name from allowed list), 2 (accept any name client sends), 3(accept any name client sends, but append specified domain suffix) and 4 (ignore client's hint, generate name based on his address, append domain name). Choices 3 and 4 require additional string parameter that defines domain suffix. See Sections \ref{feature-dns-update} and \label{example-server-fqdn}. \item[option] -- (scope: interface). Takes one integer number followed by several possible parameter combinations. It defines custom option that server may send out to clients. Supported formats are: \begin{lstlisting} option number - DUID option number address-keyword address option number address-list option number string-keyword string \end{lstlisting} Where number is an integer that defined option type, DUID is a hex-formatted string that defines option content, address-keyword is a word ``address'', address is an IPv6 address, address-list is coma separated list of addresses, string-keyword is a word ``string'' and string is any string enclosed in single or double quotes. See Section \ref{feature-custom-options} and \ref{example-server-custom}. \item[option aftr] -- (scope: interface, type: FQDN). In Dual-Stack Lite networks, client may want to configure DS-Lite tunnel. Client may want to obtain information about AFTR (a remote tunnel endpoint). This option conveys a fully qualified domain name of the remote tunnel. This option is defined in \cite{rfc6334}. \item[option neighbors] -- (scope: interface). Experimental feature for Remote Autoconfiguration. Do not use it unless you know exactly what you are doing. Takes coma separated list of addresses. This option requires \emph{experimental} mode to be enabled. See Section \ref{feature-remote-autoconf}. \item[auth-protocol] -- (scope: global, type: string, default: none). This is a crucial parameter that specifies which authorization/authentication protocol is used. Allowed values are: \texttt{none}, \texttt{delayed}, \texttt{reconfigure-key} and \texttt{dibbler}. See section \ref{feature-auth} for details. \item[auth-methods] -- (scope: global, type: string, default: empty). This a coma separated list of one or more methods. The first one on the list will specify the default method, while the others list accepted methods when receiving data from clients. Set it to one or more of the following values to enable authentication on ther server side, using selected method of generating authentication information: \texttt{none}, \texttt{digest-plain}, \texttt{digest-hmac-md5}, \texttt{digest-hmac-sha1}, \texttt{digest-hmac-sha224}, \texttt{digest-hmac-sha256}, \texttt{digest-hmac-sha384}, and \texttt{digest-hmac-sha512}. \item[auth-replay] -- (scope: global, type: string, default: none). Specifies which replay detection methods are supported. Currently two values are implemented: \texttt{none} and \texttt{monotonic}. \item[auth-required] -- (scope: global, type: boolean, default: 0). This parameter specifies if the client is required to authenticate itself. When set to 0, any client authentication failures (invalid signature or lack of \opt{AUTH} option) will result in a warning only. When set to 1, such messages will be dropped. \item[client-class] -- (scope: global). Takes one string parameter that defines name of a client class. Client class name is followed by curly brackets that create client-class scope. Clients can be grouped into classes depending on rules defined in client-class. This can be used together with \verb+allow+ and \verb+deny+ to assign segregate clients into different groups. See Section \ref{feature-client-class} for overview and Section \ref{class-expressions} for list of supported expressions. \item[address] -- (scope: client). Takes one parameter that specifies address. It instructs server to reserve this particular address for defined client. See Sections \ref{feature-exceptions} and \ref{example-server-exceptions} for details. \item[prefix] -- (scope: client). Takes one parameter that specifies prefix using prefix/length notation. It instructs server to reserve specified prefix for defined client. See Sections \ref{feature-exceptions} and \ref{example-server-exceptions} for details. \item[key] -- (scope: global). Take one string parameter that specifies key name. This keyword instructs server to create a key with a specified name. This key will be used for TSIG in DNS Updates. It is followed by curly braces that open up a new key scope. Closing curly brace is followed by a semicolon. \item[secret] -- (scope: key). Takes one string parameter and is followed by a semicolon. That parameter is a base64-encode secret value of the key. It is mandatory if key scope is defined. \item[algorithm] -- (scope: key). Takes one enum argument that is followed by a semicolon. This parameter is mandatory if the key scope is present. It specifies agorithm for the key. Currently the supported value is hmac-md5. \item[fudge] -- (scope: key). Takes one integer parameter that is followed by a semicolon. Each TSIG signature is valid for a specified amount of time only. This optional parameter specifies period in which TSIG is valid, expressed in seconds. If missing, the default value of 300 is used. The allowed values are between 0 and 65535. \end{description} \subsubsection{Client class quantifiers} \label{class-expressions} Additional parameters are used during client class definition. See Section \ref{feature-client-class} for details and examples. \begin{description} \item[match-if] -- (scope: client-class). \item[contain] -- (scope: client-class). \item[substring] -- (scope: client-class). \item[==] -- (scope: client-class). \item[and] -- (scope: client-class). \item[or] -- (scope: client-class). \item[client.vendor-spec.en] -- (scope: client-class). \item[client.vendor-spec.data] -- (scope: client-class). \item[client.vendor-class.en] -- (scope: client-class). \item[client.vendor-class.data] -- (scope: client-class). \end{description} \subsection{Server configuration examples} This subsection contains various examples of the server configuration. If you are interested in additional examples, download source version and look at \verb+*.conf+ files. \subsubsection{Example 1: Simple} In opposite to client, server uses only interfaces described in config file. Let's examine this common situation: server has interface named \emph{eth0} (which is fourth interface in the system) and is supposed to assign addresses from 2000::100/124 class. Simplest config file looks like that: \begin{lstlisting} # server.conf iface eth0 { class { pool 2000::100-2000::10f } } \end{lstlisting} \subsubsection{Example 2: Timeouts} Server should be configured to deliver specific timer values to the clients. This example shows how to instruct client to renew (T1 timer) addresses one in 10 minutes. In case of problems, ask other servers in 15 minutes (T2 timer), that allowe prefered lifetime range is from 30 minutes to 2 hours, and valid lifetime is from 1 hour to 1 day. DNS server parameter is also provided. Lifetime option is used to make clients renew all non-address related options renew once in 2 hours. \begin{lstlisting} # server.conf iface eth0 { T1 600 T2 900 prefered-lifetime 1800-3600 valid-lifetime 3600-86400 class { pool 2000::100/80 } option dns-server 2000::1234 option lifetime 7200 } \end{lstlisting} \subsubsection{Example 3: Limiting amount of addresses} Another example: Server should support 2000::0/120 class on eth0 interface. It should not allow any client to obtain more than 5 addresses and should not grant more then 50 addresses in total. From this specific class only 20 addresses can be assigned. Server preference should be set to 7. This means that this server is more important than all server with preference set to 6 or less. Config file is presented below: \begin{lstlisting} # server.conf iface eth0 { iface-max-lease 50 client-max-lease 5 preference 7 class { class-max-lease 20 pool 2000::1-2000::100 } } \end{lstlisting} \subsubsection{Example 4: Unicast communication} \label{example-server-unicast} Here's modified previous example. Instead of specified limits, unicast communication should be supported and server should listen on 2000::1234 address. Note that default multicast address is still supported. You must have this unicast address already configured on server's interface. \begin{lstlisting} # server.conf log-level 7 iface eth0 { unicast 2000::1234 class { pool 2000::1-2000::100 } } \end{lstlisting} \subsubsection{Example 5: Rapid-commit} This configuration can be called quick. Rapid-commit is a way to shorten exchange to only two messages. It is quite useful in networks with heavy load. In case if client does not support rapid-commit, another trick is used. Preference is set to maximum possible value. 255 has a special meaning: it makes client to skip wait phase for possible advertise messages from other servers and quickly request addresses. \begin{lstlisting} # server.conf log-level 7 iface eth0 { rapid-commit yes preference 255 class { pool 2000::1/112 } } \end{lstlisting} \subsubsection{Example 6: Access control} Administrators can selectively allow certain client to use this server (white-list). On the other hand, some clients could be explicitly forbidden to use this server (black-list). Specific DUIDs, DUID ranges, link-local addresses or the whole address ranges are supported. Here is config file: \begin{lstlisting} # server.conf iface eth0 { class { # duid of the rejected client reject-clients ``00001231200adeaaa'' 2000::2f-2000::20 // it's in reverse order, but it works. // just a trick. } } iface eth1 { class { accept-only fe80::200:39ff:fe4b:1abc pool 2000::fe00-2000::feff } } \end{lstlisting} \subsubsection{Example 7: Multiple classes} \label{example-server-multiple-classes} Although this is not common, a few users have requested support for multiple classes on one interface. Dibbler server can be configured to use several classes. When client asks for an address, one of the classes is being choosen on a random basis. If not specified otherwise, all classes have equal probability of being chosen. However, this behavior can be modified using \verb+share+ parameter. In the following example, server supports 3 classes with different preference level: class 1 has 100, class 2 has 200 and class 3 has 300. This means that class 1 gets $\frac{100}{100+200+300} \approx 16\% $ of all requests, class 2 gets $\frac{200}{100+200+300} \approx 33\% $ and class 3 gets the rest ($\frac{300}{100+200+300}=50\% $). \begin{lstlisting} # server.conf log-level 7 log-mode short iface eth0 { T1 1000 T2 2000 class { share 100 pool 4000::1/80 } class { share 200 pool 2000::1-2000::ff } class { share 300 pool 3000::1234:5678/112 } } \end{lstlisting} \subsubsection{Example 8: Relay support} \label{example-server-relay1} To get more informations about relay configuration, see section \ref{feature-relays}. Following server configuration example explains how to use relays. There is some remote relay with will send encapsulated data over eth1 interface. It is configured to append interface-id option set to 5020 value. Let's allow all clients using this relay some addresses and information about DNS servers. Also see section \ref{example-relay-1} for corresponding relay configuration. Note that although eth1 interface is mentioned in the configuration file, direct traffic from clients located on the eth1 interface will not be supported. In this example, eth1 is used only to support requests relayed from remote link identified with interface-id value ``relay1:en1''. That value is what relay inserts into its packets. I may sometimes not be configurable on hardware relays, so the best approach is to configure your server to match whatever the relay inserts there. Server will try to match incoming packet based on exact match of interface-id value. If that fails, there is another method. Relay sets linkaddr field and server may find a match based on that information. For this mechanism to work, the admin must provide information about valid subnet available on specified link. Note the different between subnet definition (all possible addresses that are valid for a given link) and class definition (the actual dynamic range of addresses that is governed by the DHCPv6 server). Subnet specification is currently optional, but much encouraged. Of course it is possible to support both local and remote traffic. In such case, normal eth1 definition should be present in the server configuration file. Also note that real (physical) interfaces should be specified before logical ones. \begin{lstlisting} # server.conf iface relay1 { relay eth1 // This relay1 actually represents a network that the // physical device relays packets from. The relay device should // have a global address assigned on its client-facing interface. // That address should belong to this subnet. subnet 2001:db8:1111::/48 // There are 3 ways of specifying interface-id content // Way 1: As a text string interface-id "relay1:en1" // Way 2: As unsigned integer coded on 32 bits // interface-id 5020 // Way 3: As a hex string interface-id 0x427531264361332f3000001018680f980000 class { pool 2001:db8:1111::1-2001:db8:1111::ff } option dns-server 2001:db8::100,2001:db8::101 } iface relay2 { relay eth1 // This relay1 actually represents a network that the // physical device relays packets from. The relay device should // have a global address assigned on its client-facing interface. // That address should belong to this subnet. subnet 2001:db8:2222::/48 // There are 3 ways of specifying interface-id content // Way 1: As a text string interface-id "relay1:en2" // Way 2: As unsigned integer coded on 32 bits // interface-id 5020 // Way 3: As a hex string interface-id 0x427531264361332f3000001018680f980000 class { pool 2001:db8:2222::1-2001:db8:2222::ff } option dns-server 2001:db8::100,2001:db8::101 } \end{lstlisting} \subsubsection{Example 9: Cascade 2 relays} \label{example-server-relay2} This is an advanced configuration. It assumes that client sends data to relay1, which encapsulates it and forwards it to relay2, which eventually sends it to the server (after additional encapsulation). It assumes that first relay adds interface-id option set to 6011 and second one adds similar option set to 6021. For details about relays in general and cascade setup in particular, see section \ref{feature-relays}. Also see section \ref{example-relay-cascade} for corresponding relays configuration. \begin{lstlisting} # server.conf iface relay1 { relay eth0 interface-id 6011 } iface relay2 { relay relay1 interface-id 6021 T1 1000 T2 2000 class { pool 6020::20-6020::ff } } \end{lstlisting} \subsubsection{Example 10: Dynamic DNS (FQDN)} \label{example-server-fqdn} Support for Dynamic DNS Updates was added in version 0.5.0RC1. To configure it on the server side, list of available names usually should be defined. Each name can be reserved for a certain address or DUID. When no reservation is specified, it will available to everyone, i.e. the first client asks for FQDN will get this name. In following example, name 'zebuline.example.com' is reserved for address 2001::db8:1::1, kael.example.com is reserved for 2001:db8:1::2 and test.example.com is reserved for client using DUID 00:01:00:00:43:ce:25:b4:00:13:d4:02:4b:f5. Also note that is required to define, which side can perform updates. This is done using single number after ,,option fqdn'' phrase. Server can perform two kinds of DNS Updates: AAAA (forward resolving, i.e. name to address) and PTR (reverse resolving, i.e. address to name). To configure server to execute both updates, specify 2. This is a default behavior. If this value will be skipped, server will attempt to perform both updates. When 1 will be specified, server will update PTR record only and will leave updating AAAA record to the client. When this value is set to 0, server will not perform any updates. The last parameter (64 in the following example) is a prefix length of the reverse domain supported by the DNS server, i.e. if this is set to 64, and 2000::/64 addresses are used, DNS server must support 0.0.0.0.0.0.0.0.0.0.0.0.0.0.2.ip6.arpa. zone. There are several additional parameters that affect DNS Update mechanism. \verb+ddns-protocol+ specifies protocol that should be used for communication with DNS server. Allowed values are \verb+udp+, \verb+tcp+ or \verb+any+. ``Any'' will try to use UDP and if that fails, it will revert to TCP. Second parameter is \verb+ddns-timeout+ that specifies maximum time allowed for DNS server to respond before assuming communication failure. It is specified in milliseconds. The next useful parameter is \verb+fqdn-ddns-address+ that specifies address of DNS server that updates should be performed to. If it is not specified, first DNS address from \verb+option dns-server+ will be used. The last important parameter is +\verb+accept-unknown-fqdn+. In a simplest scenario, server is configured with a list of allowed names. Connecting clients may get only those names. That is convenient case, but it is often not feasible to deploy it in a real network. In real networks, clients usually send out their own names, rather than wait for server to assign them one. In such cases, it is somewhat expected that server will not have complete list of all possible names that clients may send. Thus sooner or later server will likely receive a fqdn name that is unknown to him. This parameter specifies server behavior in such case. There are 5 possible policied currently supported. Each one is identified with an integer between 0 and 4. 0 means that uknown names should be rejected. That policy is useful for strictly controlled networks. 1 means that other available name from list of possible names should be sent instead. This is a compromise between strict control over names and liberal acceptance of clients' names. Policy 2 accept any name that client will send. Names will be sanity checked. Note that mobile and nomadic clients may send names from their home networks. That may be a problem if server attempts to update AAAA records as its DNS server will probably only accept AAAA updates for locally administered domains. As a solution to this problem, policy 3 was implemented. It takes client's hostname (without its domain name), appends local domain name and uses such constructed fully qualified domain name. For example, if client sends \verb+nomad.faraway.org+ while visiting \verb+example.org+, with this policy in place, \verb+nomad.example.org+ will be assigned. The last policy is useful for larger networks. Instead of accepting clients' ideas about their hostnames, dedicated name is generated based on assigned address. For example, client that received \verb+2001:db8:1:0:c7a8:e81:c500:46ce+ address in domain \verb+example.org+ will be assigned a \verb+2001-db8-1-0-c7a8-e81-c500-46ce.example.org+ name. Following config file is a good starting point for tweaking DNS Update enabled server configuration. \begin{lstlisting} # server.conf # Logging level range: 1(Emergency)-8(Debug) # log-level 8 # Don't log full date log-mode short # Set protocol to one of the following values: udp, tcp, any ddns-protocol udp # Sets DDNS Update timeout (in ms) ddns-timeout 1000 # specify address of DNS server to be used for DDNS fqdn-ddns-address 2001::1 iface "eth0" { # assign addresses from this class class { pool 2001:db8:1::/64 } # provide DNS server location to the clients # also server will use this address to perform DNS Update, # so it must be valid and DNS server must accept DNS Updates. option dns-server 2000::1 # provide their domain name option domain example.com # provide fully qualified domain names for clients # note that first, second and third entry is reserved # for a specific address or a DUID option fqdn 1 64 zebuline.example.com - 2000::1, kael.example.com - 2000::2, wash.example.com - 0x0001000043ce25b40013d4024bf5, zoe.example.com, malcolm.example.com, kaylee.example.com, jayne.example.com, inara.example.com # specify what to do with client's names that are not on the list # 0 - reject # 1 - send other name from allowed list # 2 - accept any name client sends # 3 - accept any name client sends, but append specified domain suffix # 4 - ignore client's hint, generate name based on his address, append domain name accept-unknown-fqdn 4 example.org } \end{lstlisting} \subsubsection{Example 11: Vendor-specific Information option} \label{example-server-vendor-spec} It is possible to configure dibbler-server to provide vendor-specific information options. Since there are no dibbler-specific parameters, this implementation is quite flexible. Enterprise number as well as content of the option itself can be configured. In the following example, we define a suboption 1027 for vendor-id 4491. The value of that option is 0x0013. \begin{lstlisting} # server.conf log-level 8 log-mode precise iface "eth1" { class { pool 2000::1-2000::ff } # Vendor-spec option can be specified as a hexstring option vendor-spec 4491-1027-0x0013 # String format syntax is also allowed # option vendor-spec 4491-1028-"this-is-a-string" # The third format supported is IPv6 address # option vendor-spec 4491-1029-2001:db8::1 # Several vendor-specific options can be coma separated option vendor-spec 4491-2-0xfedc, 4491-1027-0a:0b:0c:0d, 4491-1029-2001:db8::1 } \end{lstlisting} In some rare cases, several different options for different vendors may be specifed. In the folloging example 2 different values are defined, depending on which vendor client will specify in \msg{SOLICIT} or \msg{REQUEST} message. If client will only mention that it is interested in any vendor specific into (i.e. did not sent \opt{vendor-spec info} option, but only mentioned in in \opt{option request} option, it will receive first vendor option defined (in the following example, that would be a 1234 and 0002fedc). \begin{lstlisting} # server.conf log-level 8 log-mode precise iface "eth1" { class { pool 2000::1-2000::ff } option vendor-spec 4491-1027-0x0013,1234-5678-0xabcd } \end{lstlisting} \subsubsection{Example 12: Per client configuration} \label{example-server-exceptions} Usually all clients receive the same configuration options, e.g. all clients will use the same DNS server. However, it is possible to specify that particular clients should receive different options than others. Following example set DNS server to 2000::1, domain to example.com and vendor specific information for vendor 5678. However, if requesting client has DUID 00:01:02:03:04:05:06:07:08, it will receive different parameters (second.client.biz domain, 1234::5678:abcd as a DNS server and finally different vendor-specific information). Also client with DUID 0x0001000044e8ef3400085404a324 will receives normal domain and DNS server, but different (vendor=2) vendor specific information. See section \ref{feature-exceptions} for background information. Since 0.8.0RC1, also addresses can be reserverd in this way. Addresses reserved for special clients may be inside or outside of specified pools. If leases are outside of specified pools, timers (t1, t2, prefered and valid lifetimes are set to the default values). It is currently not possible to specify separate timers (t1, t2, preferred or valid lifetimes) on a per-client basis. If reservations are out of pool, timers applicated to the interface will be used. See second example in this section. Note that per client reservation was significantly refactored after 0.8.2, so its stability is not yet confirmed. \textbf{Warning:} Reservation by link-local address is not always reliable and DUID reservations should be used instead, if possible. Typically for directly connected clients (i.e. without using relays) server can obtain client's link local address. For relayed traffic, that information is recorded by the first (closest to the client) relay and stored in \msg{RELAY-FORW}, so in most cases this should work. However, there are two cases when link-local address reservation will fail. The first one is when client is using IPv6 privacy extensions (\cite{rfc4941}). With privacy extensions enabled, client may use its temporary random addresses that are changing over time. Another case when such reservation could fail is when server allows unicast traffic. Once clients get their addresses, they can send \msg{RENEW} messages over unicast, using their global address as a source address. In such case link-local address will not ever be used in the transmission, so the server can get confused. \begin{lstlisting} # server.conf # Example server configuration file: per-client configuaration # # In this example, some clients receive different parameters than others. # Logging level range: 1(Emergency)-8(Debug) # log-level 8 # Don't log full date log-mode short iface "eth0" { class { pool 2001:db8:1::/64 } pd-class { pd-pool 2001:db8:2::/48 pd-length 64 } # common configuration options, provided for all clients option dns-server 2001:db8:1::1 option domain example.com option vendor-spec 5678-2-0xaaaa,1234-3-0x0102 # special parameters for client with DUID 00:01:02:03:04:06 client duid 00:01:02:03:04:06 { address 2001:db8:1::123 prefix 2001:db8:abcd::/64 option domain second.client.biz option dns-server 2001:db8::5678:abcd option vendor-spec 5678-2-0xbbbb, 1234-5-0x222222 } # this client should receive default domain and dns-server, # but different vendor-spec info # Both DUID forms are accepted (0x1234... and 12:34...) client duid 0x0001000044e8ef3400085404a324 { option vendor-spec 1111-57-0x01020304 } # Parameters can be reserved based on remote-id option client remote-id 5-0x01020304 { address 2001:db8:1::0102:0304 option domain our.special.remoteid.client.org } # Parameters can be reserved based on link-local address client link-local fe80::1:2:3:4 { option domain link.local.detected.interop.test.com } } \end{lstlisting} The following example shows out of pool reservation. Regular clients will get addresses from the 2001:db8:123::/64 pool. However, the client with DUID 00:01:00:0a:0b:0c:0d:0e:0f will get an 2002::babe address that does not belong to any configured pool. That particular client with get parameters from the interface on which this exception was defined. In this discussed example, what will be t1=1000, t2=2000, preferred-lifetime=3000 and valid-lifetime=4000. \begin{lstlisting} iface eth0 { t1 1000 t2 2000 preferred-lifetime 3000 valid-lifetime 4000 class { pool 2001:db8:123::/64 } client duid 00:01:00:0a:0b:0c:0d:0e:0f { address 2002::babe } } \end{lstlisting} \subsubsection{Example 13: Prefix delegation} \label{example-server-prefix} Prefix delegation works quite similar to normal address granting. Administrator defines pool and server provides prefixes from that pool. Before using prefix delegation, please read section \ref{feature-prefix}. Client configuration example is described in section \ref{example-client-prefix}. \begin{lstlisting} # server.conf log-mode precise iface "eth0" { # the following lines instruct server to grant each client # prefix for this pool. For example, client might get # 2222:2222:2222:2222:2222:993f::/96 pd-class { pd-pool 2222:2222:2222:2222:2222::/80 pd-length 96 T1 11111 T2 22222 } } \end{lstlisting} \subsubsection{Example 14: Multiple prefixes} \label{example-server-prefixes} It is possible to define more than one pool, so each client will receive several prefixes. It is necessary to define each pool with the same length, i.e. it is not possible to mix different pool lengths. See section \ref{feature-prefix} for prefix delegation background information. Client configuration example is described in section \ref{example-client-prefix}. \begin{lstlisting} # server.conf log-mode precise iface "eth0" { T1 1800 T2 2700 prefered-lifetime 3600 valid-lifetime 7200 # provide addresses from this pool class { pool 5000::/48 } # the following lines instruct server to grant each client # 2 prefixes. For example, client might get # 2222:2222:2222:2222:2222:993f:6485::/96 and # 1111:1111:1111:1111:1111:993f:6485::/96 pd-class { pd-pool 2222:2222:2222:2222:2222::/80 pd-pool 1111:1111:1111:1111:1111::/80 pd-length 96 T1 11111 T2 22222 } } \end{lstlisting} \subsubsection{Example 15: Inactive mode} \label{example-server-inactivemode} See sections \ref{example-client-inactivemode} and \ref{feature-inactive-mode} for inactive mode explanation. The same behavior has been added for server. \begin{lstlisting} #server.conf log-level 8 inactive-mode iface "eth0" { class { pool 2000::/64 } } \end{lstlisting} \subsubsection{Example 16: Leasequery} A separate entity called requestor can send queries regarding assigned addresses and prefixes. Server can be configured to support such lease queries. See section \ref{feature-leasequery} for detailed explanation. \begin{lstlisting} #server.conf log-level 8 iface "eth0" { accept-leasequery class { pool 2000::/64 } } \end{lstlisting} \subsubsection{Example 17: Dibbler Authentication} \label{example-server-auth} It is possible to configure server to require Dibbler authentication. In this example, HMAC-SHA-512 will be used as an authentication method. Key Generation Nonce will have 64 bytes. \begin{lstlisting} # server.conf auth-protocol dibbler auth-replay monotonic auth-methods digest-hmac-sha512 auth-required 1 iface eth0 { class { pool 2000::100-2000::10f } } \end{lstlisting} \subsubsection{Example 18: Relay support with unknown interface-id} \label{example-server-relay3} To get more informations about relay configuration, see section \ref{feature-relays}. In pervious examples (\ref{example-server-relay1}, \ref{example-server-relay2}) it was assumed that interface-id set by relay is known. However, in some cases that is not true. If sysadmin wants to accept relayed messages from any relay, there is a feature called guess mode. It tries to match any relay defined in server.conf instead of exactly checking interface-id value. Since there is only one relay defined, it will be used, regardless of the interface-id value (or even lack of thereof). \begin{lstlisting} # server.conf guess-mode iface relay1 { relay eth1 interface-id 5020 class { pool 2000::1-2000::ff } option dns-server 2000::100,2000::101 } \end{lstlisting} \subsubsection{Example 19: DS-Lite tunnel (AFTR)} Server is able to provide Dual-Stack lite configuration for clients. Both address and name based configurations are supported: \begin{lstlisting} iface "eth0" { class { pool 2001:db8::/64 } option ds-lite 2001:db8:1::ffff option ds-lite sc.example.org } \end{lstlisting} \subsubsection{Example 20: Custom options} \label{example-server-custom} Server may be configured to also provide custom options to the clients. See Section \ref{feature-custom-options} for details. \begin{lstlisting} iface "eth0" { class { pool 2001:db8::/64 } option 145 duid 01:02:a3:b4:c5:dd:ea option 146 address 2001:db8:1::dead:beef option 147 address-list 2001:db8:1::aaaa,2001:db8:1::bbbb option 148 string "secretlair.example.org" } \end{lstlisting} \subsubsection{Example 21: Remote Autoconfiguration} Server does support experimental extension called remote autoconfiguration, as defined in \cite{draft-remote-autoconf}. See Section \ref{feature-remote-autoconf} for details and configuration examples. \subsubsection{Example 21: Subnet declaration} \label{example-server-subnet} Typically a network has only a subset of all its addresses managed by the DHCPv6 server. Let's assume that we have a network that uses 2001:db8::/64 prefix, so there may be $2^{64}$ addresses in it. Usually the server has information about a dynamic range of addresses that it can manage. Let's assume that this pool is defined as 2001:db8::1 to 2001:db8::ff, so the server is responsible for only only 256 addresses. There are two cases where it is useful for the server to know the whole subnet, even though it manages only small subset of it. The first case is subnet selection. When receiving a packet from relay, there are several mechanisms that server uses to find appropriate subnet. One of them is matching based on link-addr field that was set up by the relay. As DHCP relays themselves are never configured with DHCP, the address used by the relay will always be outside of dynamic pool that the server manages, but within the whole subnet that is defined on a given link. The second case is useful when the server tries to respond to \msg{CONFIRM} message. CONFIRM has a special meaning. It is a question whether specified addresses are topologically correct in a given place, not whether the server has bindings for them. If there are 2 servers on a given link and each of them manages their own pool, both can potentially respond to CONFIRM to any clients, even those served by the other server. The server can only do so if they have information about available subnet. \begin{lstlisting} #server.conf iface eth0 { # This is the prefix used on a given link subnet 2001:db8:1::/64 class { # This is the small part of that prefix that is # managed by the DHCPv6 server pool 2001:db8:1::/96 } } \end{lstlisting} dibbler-1.0.1/doc/dibbler-devel-05-sources.dox0000644000175000017500000004513112277722750015740 00000000000000/** * @page srcOverview 5. Source code information This section describes various aspects of Dibbler compilation, usage and internal design. @section srcOptionValues 5.1 Option values and filenames DHCPv6 is a relatively new protocol and additional options are in a specification phase. It means that until standarisation process is over, they do not have any officially assigned numbers. Once standarization process is over (and RFC document is released), this option gets an official number. There's pretty good chance that different implementors may choose diffrent values for those not-yet officialy accepted options. To change those values in Dibbler, you have to modify file \c Misc/DHCPConst.h and recompile server or client. Make sure that you build everything for scratch. Use \c make \c clean in Linux, Mac OS X and BSD and \c Clean \c up \c solution in Windows before you start building a new version. In default build, Dibbler stores all information in the @c /var/lib/dibbler directory (Linux) or in the working directory (Windows). There are multiple files stored in those directories. However, sometimes there is a need to build Dibbler which uses different directory or filename. To do so, simply edit @c Misc/Portable.h file and rebuild everything. @section srcMemoryManagement 5.2 Memory Management using SmartPtr To effectively fight memory leaks, clever mechanism was introduced. Smart pointers are used to point to all dynamic structures, e.g. messages, options or client informations in server database. Smart pointer will free object by itself, when object is no longer needed. When this is happening? When last smart pointer stops pointing at the object. There is a tradeoff: normal pointers (*) should not be mixed with smart pointers. Smart pointer implementation in Dibbler works similar as boost::shared_ptr, but it allows downcasting from derived to base type, using (Ptr*) operator. Smart pointers are implemented as C++ class templates. Template is called @c SPtr. @b Note: It has been renamed. Previous, obsolete name is SmartPtr. Please, do not use it anymore as its definitions was removed. To quickly explain smart pointers usage, here's short code example: @verbatim 1 void foo() { 2 SPtr addr = new TIPv6Addr("ff02::1:2"); 3 SPtr tmp; 4 if (!tmp) cout << "Null pointer" << endl; 5 tmp = addr; 6 std::cout << addr->getPlain(); 7 } @endverbatim What's happened in those lines? - [1] -- Function starts. - [2] -- New TIPv6Addr object is created. Smart Pointer (\c SPtr) is also created to point at this object. Using normal pointer to achive the same goal would look like this: \\ TIPv6Addr * addr = new TIPv6Addr("ff02::1:2"); - [3] -- Another pointer is created. It is equivalent of the classical pointer (TIPv6Addr * tmp), except the benefit of having it assigned the default value of NULL. - [4] -- Simple check if pointer does not point to anything. - [5] -- Smart pointers can be coppied in a easy way. - [6] -- Using object pointed by smart pointer is simple - [7] -- Here magic begins. addr and tmp are local variables, so they are destroyed here. But they are the only smart pointers which access TIPv6Addr object. So they are destroy that object. Object remain in memory as long as there is at least one smart pointer which points to this object. Smart pointers can be easily derefernced. Just add * before them: @verbatim cout << *addr << endl; @endverbatim SmartPtrs are often used to store various objects in a list. Cool part of this solution is that you can hold objects of various derived classes on one list in a very comfortable manner. There is an additional template defined to create and manipulate such lists. It is called TContainer. There's also useful macro defined to use this without typing too much. Here are two examples how to define list of addresses (both mean exactly the same): @verbatim TContainer< SPtr > addrLst; List(TIPv6Addr) addrLst; @endverbatim How to use this list? Oh well, another example: @verbatim 1 List(TIPv6Addr) addrLst; 2 SmartPtr ptr = ...; 3 SmartPtr tmp; 4 addrLst.clear(); 5 addrLst.append(ptr); 6 addrLst.first(); 7 tmp = addrLst.get(); 8 cout << "List contains " << addrLst.count() << " elements" << endl; 9 addrLst.first(); 10 while (tmp = addrLst.get()) 11 cout << *tmp << endl; @endverbatim And here is description what that code does: - [1] -- Address list declaration. - [2,3] -- SmartPtrs declarations. Just to show variable types. - [4] -- List can be cleared. All pointers will be destroyed. If they were only pointers to point to some objects, those objects will be destroyed, too. - [5] -- Append object pointed by ptr to the list. - [6] -- Rewind list to the beginning. - [7] -- Get next object from the list. If list is empty or last element was already got, NULL is returned. - [8] -- An easy way to count elements on the list. - [9] -- Rewind list to the beginning. - [10,11] -- A cute example how to print all addresses on the list. @section srcLogger 5.3 Logging To log various informations, Log(LOGLEVEL) macros are defined. There are eight levels of logging: - \b Emergency -- Used to report system wide emergency. Such conditions could not occur in the DHCPv6 client o server, so this logging level should not be used. Called with: @code Log(Emerg) << "..." << LogEnd @endcode - \b Alert -- Used to alert an administrator about system wide alerts. This logging level should not be used in DHCPv6. Called with @code Log(Alert) << "..." << LogEnd @endcode - \b Critical -- Used in situations critical to the application, e.g. application shutdown. Fatal errors should be logged on this level. Called with @code Log(Crit) << "..." << LogEnd @endcode - \b Error -- Used to report error situations. For example, problems with binding sockets. Called with @code Log(Error) << "..." << LogEnd @endcode - \b Warning -- Used to report RFC violations, e.g. missing required options, invalid parameters and so on. Called with @code Log(Warning) << "..." << LogEnd @endcode - \b Notice -- Used to report normal operations, e.g. address assignement or informations about received options. Called with @code Log(Notice) << "..." << LogEnd @endcode - \b Info -- Used to report detailed information. DHCPv6 protocol knowledge might be needed to understand those messages. Called with @code Log(Info) << "..." << LogEnd @endcode - \b Debug -- Used to report internal informations. Knowledge about Dibbler source code might be needed to understand those messages. Called with @code Log(Debug) << "..." << LogEnd @endcode @section srcNames 5.4 Naming convention To avoid confussion, various prefixes are used in class and variable names. Class types begin with T (e.g. address class would be named TAddr), enumeration types begin with E (e.g. state enumaterion would be names EState). Dibbler is divided into 4 large functional blocks called managers (They are described in the following sections of this document): address maganger, interface manager, Configuration manager, and transmsission manager. Each of them uses different prefix: Addr, Iface, Cfg or Trans. There are also objects shared among them: messages (Msg prefix) and options (Opt prefix). Often there are two derived versions: related to client (Clnt prefix) or related to server (Clnt). Rel prefix is used to denote Relay related classes. Here are examples of some class names: - \b TAddrMgr -- Address manager, common version. - \b TClntAddrMgr -- Address manager, client version. - \b TAddrAddr -- Address representation used in address manager. - \b TSrvIfaceMgr -- Interface manager, server version. - \b TClntIfaceIface -- Interface representation used in client interface manager. - \b TClntMsg -- Message represented on the client side. - \b TClntOptPreference -- Prefernce option used on the client side. - \b TIfaceSocket -- Socket used in the interface manager. - \b TClntCfgAddr -- Address used in the client config manager. Also note that class members start with small letters (e.g. bool TOpt::isValid() ) and class members start with capital letters (e.g. bool TOpt::IsValid ). @section srcParsers 5.5 Configuration file parsers @b Note: Similar approach is used in server, client and relay. In following section when reference to a specific file is needed, client files are used. To find corresponding files related to server and relay, substitute \b Clnt with \b Srv or \b Rel. Dibbler uses standard lexer/parser. Lexer is generated using flex. Parser is generated with bison++ (full source code for bison++ is provided with Dibbler sources). See ClntCfgMgr/ClntParser.y and ClntCfgMgr/ClntLexer.l for details. Make sure that you have flex installed (bison++ is provided with the dibbler source code). To generate parser and lexer code, type: @verbatim make bison (just once, to compile bison++) make parser (each time you modify *.l or *.y files) @endverbatim If you modify *.l or *.y files, pay close attention to output of make parser. In particular, make sure that there are no error messages that the grammar is inconsistent. Please refer to one of many bison tutorials that explain how to solve conflicts. @b Note: When making the configuration parsers you might run into some prototype issues with yyFlexLexer::LexerInput(..) and yyFlexLexer::LexerOutput(..) due to incompatibilities between the 'FlexLex.h' file distributed with dibbler and the Flex on you system. These issuses can for the most parts be solved by simply replacing the 'CfgMgr/FlexLexer.h' distributed with dibbler with the one found on you system. @section srcParsersParsing 5.5.1 Parsing Configuration file reading is done using Flex and bison++ tools. Flex is so called lexer. Its responsibility is to read config file and translate it into stream of tokens. (To be precise, Flex generates lexers, so it should be called lexer generator.) For example, this config file: @verbatim iface eth0 { class { pool 2000::1-2000::9 } } @endverbatim would be translated to following stream of tokens: [IFACE] [STRING:eth0] [{] [CLASS] [{] [POOL] [ADDR:2000::1] [-] [ADDR:2000::9] [}] [}]. This stream of token is then passed to parser. This parser is generated by bison++. Parser checks if that particular sequence of tokens makes sense. In this example, interface object will be created, which contains one class object, which contains one pool. Is is sometimes very useful to define some parameter, usually associated with some level, on higher scope level. For example, if there are 3 classes, instead of defining the same valid-lifetime value on each of them, that parameter may be defined on the interface level or even at the top level. This is important to remember during parsing. Each subsequent element must inherit its parent properties (class object must inherit parameter values defined on the interface level). Config file has various scopes: global, interface, ia, pd and others. In many cases a parameter can be defined in a global scope (e.g. dns-server option) that can be later overridden on a lower level scope (e.g. interface scope). Once the parser works its way through the parsed config file, it creates objects on a stack that represents scopes. That stack can be accesed with SrvParser::ParserOptStack structure. In particular, almost all operations are done on its last element (i.e. the current scope). That last element can be accessed with ParserOptStack.getLast(). The server uses TSrvParsGlobalOpt, TSrvParsIfaceOpt and TSrvParsClassOpt to represent scopes. The idea was to have the ability to properly derive values for options (e.g. defined in global scope and later use its value in interface scope), but that concept was never fully implemented. The stack is then used to set options in various scopes. See TSrvCfgIface::setOptions(), TSrvCfgMgr::setGlobalOptions(), and TSrvCfgAddrClass::setOptions() (and similar for client). To assist in this process, several methods were implemented in SrvParser: SrvParser::EndClassDeclaration(), SrvParser::EndIfaceDeclaration(), SrvParser::EndTAClassDeclaration(), SrvParser::EndPDDeclaration() and similar. For example, in server parser, following methods are called before and after interface definitions. @verbatim void SrvParser::StartIfaceDeclaration() { // create new option (representing this interface) on the parser stack ParserOptStack.append(new TSrvParsGlobalOpt(*ParserOptStack.getLast())); SrvCfgAddrClassLst.clear(); } bool SrvParser::EndIfaceDeclaration() { // create and add new interface to SrvCfgMgr ... // remove last option (representing this interface) from the parser stack ParserOptStack.delLast(); return true; } @endverbatim @section srcParsersUsingValues 5.5.2 Using parsed values Lexer and parser are created in the Client Configuration Manager. See ClntCfgMgr/ClntCfgMgr.cpp. Following code is executed in the ClntCfgMgr constructor. Actual code is much more complicated, but unnecessary lines were removed for a clarification reasons. @verbatim yyFlexLexer lexer(&f,&clog); ClntParser parser(&lexer); result = parser.yyparse(); matchParsedSystemInterfaces(&parser); validateConfig(); @endverbatim f and clog are normal C++ ifstream and ofstrem objects, associated with configuration file or a standard output. Configuration file is passed to the constructor of the entire TDHCPClient object, which is usually located in the main() function. Example mentioned above works as follows: - Read all interfaces from the system (using System API). This is done in Interface Manager and is not important right now. - Create lexer object (it will read configuration file and convert it into stream of tokens) - create parser, which will interpret stream of tokens. - Match interfaces present in system with those specified in the configuration file. - Validate configuration file to check if there are no logical errors, like T1>T2, specified both stateless and request for ia, etc. @section srcParsersEmbeddedConfiguration 5.5.3 Embedded configuration @b Note: This feature applies to the client only. Another way of defining client configuration was introduced in the 0.5.0 release. Instead of reading configuration file, configuration can be hardcoded in the binary file itself. See \b MOD_CLNT_EMBEDDED_CFG flag description in Section @ref compilationModularFeatures. @section srcCodingGuidelines 5.6 Coding guidelines This section describes coding guidelines. They are useful if you happen to develop an extension, rewriting something or messing with Dibbler code in some other way. Note that Dibbler started a long time ago, so parts of those guidelines may seem a bit antiquated. There are many areas of the existing code that do not follow this rules. There may be many reasons for that. I used to accept patches that fail to follow those guidelines. That will not happen anymore. Unless you are providing some extra cool feature, expect your patch to be rejected if you don't follow this rules. Dibbler have some large chunks of code merged. For example, the whole poslib library used to be a separare library. Camel notation is a naming conventions when words are concatenated with first letter of each word (usually except the first one) is capitalized. -# Class names start with T, e.g. TOpt, TMsg. (Yes, yes, I know. Pascal sucks. I was young and dumb, when I started writing Dibbler :) -# Object, function and variables should use prefixes when appropriate. Following are used: - Clnt Srv Rel Req (server, client, relay, requestor) - Cfg Iface Addr Trans (specific managers within the code) - Lst (list) -# Variables and method names follow camel notation. First word is not capitalized in method names and variables. It is capitalized in class names and class variables. e.g. setAddr() -# Class method starts with lower case and follow camel notation, e.g. getAddr(); -# Class variables start with upper case and follow camel notation and are ended with underscore, e.g. int IfaceIndex_; . Note: I recently decided to extend the notation to use underscore at the end, so most of the code does not follow that guideline yet. -# Each new method must be accompanied with doxygen comments. Doxygen comments for method should be placed in cpp files. -# Contributed code must not introduce new warnings from cppcheck. Please check your code before submitting patches. -# Try to use descriptive, but short names. Verb should be mentioned first (getAddr()), not last (do not use addrGet()) -# Please use types defined in stdint.h, e.g. uint8_t, int16_t, uint32_t etc. Current code does not follow this guideline, but it will be refactored eventually. -# Please use uint8_t for any operations involving on-wire format. -# Please use smart pointers (SPtr) when possible. They work the same as boost::shared_ptr, but are better. They have better conversion operators. Also, not requiring 200MB of headers (that's how much latest libboost-dev took on my Debian) is often useful. -# Shared pointers (SPtr) can only be created: from other \c SPtr (automatic conversion) or using new() memory allocator, SPtr = new foo();. -# Lists are operated by methods: i.e. for Addr list, there should be methods \c addAddr(), \c firstAddr(),\c getAddr() etc. -# You can cast between different types of smart pointers, e.g. from SPtr to SPtr. Use conversion to (Ptr*). This is the only case when Ptr* may be used. -# Port-specific files MUST be places in dir named port-PORTNAME. Remember that Dibbler runs on many platforms, so think twice before you use anything OS-specific. Also, if you code something that works on one system only, please provide stub implementations for other OSes. -# Please do not add \c SrvOpt, ClntOpt or RelOpt classes. Options should be common for all components and very simple. Please do not put anything in \c doDuties(). This approach is deprecated and existing code will be cleaned up. Please put all the logic in appropriate managers (CfgMgr, IfaceMgr, TransMgr, etc.) -# Currently Options have Parent parameter that contains pointer to parent message. This may be removed some time in the future. -# There are 4 main managers: \c AddrMgr, \c CfgMgr, \c IfaceMgr and \c TransMgr. You can access each of them at any time using defined macros, e.g. \c ClntCfgMgr(), \c SrvIfaceMgr() and similar. -# Support for googletest was added recently. While not strictly required, googletest-based unit tests for new code is greatly appreciated. Once number of tests for existing code increases, they will become mandatory for contributed code as well. */ dibbler-1.0.1/doc/doxygen.cfg.in0000644000175000017500000017567112277722750013401 00000000000000# Doxyfile 1.6.1 # This file describes the settings to be used by the documentation system # doxygen (www.doxygen.org) for a project # # All text after a hash (#) is considered a comment and will be ignored # The format is: # TAG = value [value, ...] # For lists items can also be appended using: # TAG += value [value, ...] # Values that contain spaces should be placed between quotes (" ") #--------------------------------------------------------------------------- # Project related configuration options #--------------------------------------------------------------------------- # This tag specifies the encoding used for all characters in the config file # that follow. The default is UTF-8 which is also the encoding used for all # text before the first occurrence of this tag. Doxygen uses libiconv (or the # iconv built into libc) for the transcoding. See # http://www.gnu.org/software/libiconv for the list of possible encodings. DOXYFILE_ENCODING = UTF-8 # The PROJECT_NAME tag is a single word (or a sequence of words surrounded # by quotes) that should identify the project. PROJECT_NAME = "Dibbler - a portable DHCPv6" # The PROJECT_NUMBER tag can be used to enter a project or revision number. # This could be handy for archiving the generated documentation or # if some version control system is used. PROJECT_NUMBER = @PACKAGE_VERSION@ # The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) # base path where the generated documentation will be put. # If a relative path is entered, it will be relative to the location # where doxygen was started. If left blank the current directory will be used. OUTPUT_DIRECTORY = . # If the CREATE_SUBDIRS tag is set to YES, then doxygen will create # 4096 sub-directories (in 2 levels) under the output directory of each output # format and will distribute the generated files over these directories. # Enabling this option can be useful when feeding doxygen a huge amount of # source files, where putting all generated files in the same directory would # otherwise cause performance problems for the file system. CREATE_SUBDIRS = YES # The OUTPUT_LANGUAGE tag is used to specify the language in which all # documentation generated by doxygen is written. Doxygen will use this # information to generate all constant output in the proper language. # The default language is English, other supported languages are: # Afrikaans, Arabic, Brazilian, Catalan, Chinese, Chinese-Traditional, # Croatian, Czech, Danish, Dutch, Esperanto, Farsi, Finnish, French, German, # Greek, Hungarian, Italian, Japanese, Japanese-en (Japanese with English # messages), Korean, Korean-en, Lithuanian, Norwegian, Macedonian, Persian, # Polish, Portuguese, Romanian, Russian, Serbian, Serbian-Cyrilic, Slovak, # Slovene, Spanish, Swedish, Ukrainian, and Vietnamese. OUTPUT_LANGUAGE = English # If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will # include brief member descriptions after the members that are listed in # the file and class documentation (similar to JavaDoc). # Set to NO to disable this. BRIEF_MEMBER_DESC = YES # If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend # the brief description of a member or function before the detailed description. # Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the # brief descriptions will be completely suppressed. REPEAT_BRIEF = YES # This tag implements a quasi-intelligent brief description abbreviator # that is used to form the text in various listings. Each string # in this list, if found as the leading text of the brief description, will be # stripped from the text and the result after processing the whole list, is # used as the annotated text. Otherwise, the brief description is used as-is. # If left blank, the following values are used ("$name" is automatically # replaced with the name of the entity): "The $name class" "The $name widget" # "The $name file" "is" "provides" "specifies" "contains" # "represents" "a" "an" "the" ABBREVIATE_BRIEF = "The $name class" \ "The $name widget" \ "The $name file" \ is \ provides \ specifies \ contains \ represents \ a \ an \ the # If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then # Doxygen will generate a detailed section even if there is only a brief # description. ALWAYS_DETAILED_SEC = NO # If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all # inherited members of a class in the documentation of that class as if those # members were ordinary class members. Constructors, destructors and assignment # operators of the base classes will not be shown. INLINE_INHERITED_MEMB = NO # If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full # path before files name in the file list and in the header files. If set # to NO the shortest path that makes the file name unique will be used. FULL_PATH_NAMES = NO # If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag # can be used to strip a user-defined part of the path. Stripping is # only done if one of the specified strings matches the left-hand part of # the path. The tag can be used to show relative paths in the file list. # If left blank the directory from which doxygen is run is used as the # path to strip. STRIP_FROM_PATH = # The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of # the path mentioned in the documentation of a class, which tells # the reader which header file to include in order to use a class. # If left blank only the name of the header file containing the class # definition is used. Otherwise one should specify the include paths that # are normally passed to the compiler using the -I flag. STRIP_FROM_INC_PATH = # If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter # (but less readable) file names. This can be useful is your file systems # doesn't support long names like on DOS, Mac, or CD-ROM. SHORT_NAMES = NO # If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen # will interpret the first line (until the first dot) of a JavaDoc-style # comment as the brief description. If set to NO, the JavaDoc # comments will behave just like regular Qt-style comments # (thus requiring an explicit @brief command for a brief description.) JAVADOC_AUTOBRIEF = NO # If the QT_AUTOBRIEF tag is set to YES then Doxygen will # interpret the first line (until the first dot) of a Qt-style # comment as the brief description. If set to NO, the comments # will behave just like regular Qt-style comments (thus requiring # an explicit \brief command for a brief description.) QT_AUTOBRIEF = NO # The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen # treat a multi-line C++ special comment block (i.e. a block of //! or /// # comments) as a brief description. This used to be the default behaviour. # The new default is to treat a multi-line C++ comment block as a detailed # description. Set this tag to YES if you prefer the old behaviour instead. MULTILINE_CPP_IS_BRIEF = NO # If the INHERIT_DOCS tag is set to YES (the default) then an undocumented # member inherits the documentation from any documented member that it # re-implements. INHERIT_DOCS = YES # If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce # a new page for each member. If set to NO, the documentation of a member will # be part of the file/class/namespace that contains it. SEPARATE_MEMBER_PAGES = NO # The TAB_SIZE tag can be used to set the number of spaces in a tab. # Doxygen uses this value to replace tabs by spaces in code fragments. TAB_SIZE = 4 # This tag can be used to specify a number of aliases that acts # as commands in the documentation. An alias has the form "name=value". # For example adding "sideeffect=\par Side Effects:\n" will allow you to # put the command \sideeffect (or @sideeffect) in the documentation, which # will result in a user-defined paragraph with heading "Side Effects:". # You can put \n's in the value part of an alias to insert newlines. ALIASES = # Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C # sources only. Doxygen will then generate output that is more tailored for C. # For instance, some of the names that are used will be different. The list # of all members will be omitted, etc. OPTIMIZE_OUTPUT_FOR_C = NO # Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java # sources only. Doxygen will then generate output that is more tailored for # Java. For instance, namespaces will be presented as packages, qualified # scopes will look different, etc. OPTIMIZE_OUTPUT_JAVA = NO # Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran # sources only. Doxygen will then generate output that is more tailored for # Fortran. OPTIMIZE_FOR_FORTRAN = NO # Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL # sources. Doxygen will then generate output that is tailored for # VHDL. OPTIMIZE_OUTPUT_VHDL = NO # Doxygen selects the parser to use depending on the extension of the files it parses. # With this tag you can assign which parser to use for a given extension. # Doxygen has a built-in mapping, but you can override or extend it using this tag. # The format is ext=language, where ext is a file extension, and language is one of # the parsers supported by doxygen: IDL, Java, Javascript, C#, C, C++, D, PHP, # Objective-C, Python, Fortran, VHDL, C, C++. For instance to make doxygen treat # .inc files as Fortran files (default is PHP), and .f files as C (default is Fortran), # use: inc=Fortran f=C. Note that for custom extensions you also need to set # FILE_PATTERNS otherwise the files are not read by doxygen. EXTENSION_MAPPING = # If you use STL classes (i.e. std::string, std::vector, etc.) but do not want # to include (a tag file for) the STL sources as input, then you should # set this tag to YES in order to let doxygen match functions declarations and # definitions whose arguments contain STL classes (e.g. func(std::string); v.s. # func(std::string) {}). This also make the inheritance and collaboration # diagrams that involve STL classes more complete and accurate. BUILTIN_STL_SUPPORT = NO # If you use Microsoft's C++/CLI language, you should set this option to YES to # enable parsing support. CPP_CLI_SUPPORT = NO # Set the SIP_SUPPORT tag to YES if your project consists of sip sources only. # Doxygen will parse them like normal C++ but will assume all classes use public # instead of private inheritance when no explicit protection keyword is present. SIP_SUPPORT = NO # For Microsoft's IDL there are propget and propput attributes to indicate getter # and setter methods for a property. Setting this option to YES (the default) # will make doxygen to replace the get and set methods by a property in the # documentation. This will only work if the methods are indeed getting or # setting a simple type. If this is not the case, or you want to show the # methods anyway, you should set this option to NO. IDL_PROPERTY_SUPPORT = YES # If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC # tag is set to YES, then doxygen will reuse the documentation of the first # member in the group (if any) for the other members of the group. By default # all members of a group must be documented explicitly. DISTRIBUTE_GROUP_DOC = NO # Set the SUBGROUPING tag to YES (the default) to allow class member groups of # the same type (for instance a group of public functions) to be put as a # subgroup of that type (e.g. under the Public Functions section). Set it to # NO to prevent subgrouping. Alternatively, this can be done per class using # the \nosubgrouping command. SUBGROUPING = YES # When TYPEDEF_HIDES_STRUCT is enabled, a typedef of a struct, union, or enum # is documented as struct, union, or enum with the name of the typedef. So # typedef struct TypeS {} TypeT, will appear in the documentation as a struct # with name TypeT. When disabled the typedef will appear as a member of a file, # namespace, or class. And the struct will be named TypeS. This can typically # be useful for C code in case the coding convention dictates that all compound # types are typedef'ed and only the typedef is referenced, never the tag name. TYPEDEF_HIDES_STRUCT = NO # The SYMBOL_CACHE_SIZE determines the size of the internal cache use to # determine which symbols to keep in memory and which to flush to disk. # When the cache is full, less often used symbols will be written to disk. # For small to medium size projects (<1000 input files) the default value is # probably good enough. For larger projects a too small cache size can cause # doxygen to be busy swapping symbols to and from disk most of the time # causing a significant performance penality. # If the system has enough physical memory increasing the cache will improve the # performance by keeping more symbols in memory. Note that the value works on # a logarithmic scale so increasing the size by one will rougly double the # memory usage. The cache size is given by this formula: # 2^(16+SYMBOL_CACHE_SIZE). The valid range is 0..9, the default is 0, # corresponding to a cache size of 2^16 = 65536 symbols SYMBOL_CACHE_SIZE = 0 #--------------------------------------------------------------------------- # Build related configuration options #--------------------------------------------------------------------------- # If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in # documentation are documented, even if no documentation was available. # Private class members and static file members will be hidden unless # the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES EXTRACT_ALL = YES # If the EXTRACT_PRIVATE tag is set to YES all private members of a class # will be included in the documentation. EXTRACT_PRIVATE = YES # If the EXTRACT_STATIC tag is set to YES all static members of a file # will be included in the documentation. EXTRACT_STATIC = YES # If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs) # defined locally in source files will be included in the documentation. # If set to NO only classes defined in header files are included. EXTRACT_LOCAL_CLASSES = YES # This flag is only useful for Objective-C code. When set to YES local # methods, which are defined in the implementation section but not in # the interface are included in the documentation. # If set to NO (the default) only methods in the interface are included. EXTRACT_LOCAL_METHODS = YES # If this flag is set to YES, the members of anonymous namespaces will be # extracted and appear in the documentation as a namespace called # 'anonymous_namespace{file}', where file will be replaced with the base # name of the file that contains the anonymous namespace. By default # anonymous namespace are hidden. EXTRACT_ANON_NSPACES = YES # If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all # undocumented members of documented classes, files or namespaces. # If set to NO (the default) these members will be included in the # various overviews, but no documentation section is generated. # This option has no effect if EXTRACT_ALL is enabled. HIDE_UNDOC_MEMBERS = NO # If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all # undocumented classes that are normally visible in the class hierarchy. # If set to NO (the default) these classes will be included in the various # overviews. This option has no effect if EXTRACT_ALL is enabled. HIDE_UNDOC_CLASSES = NO # If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all # friend (class|struct|union) declarations. # If set to NO (the default) these declarations will be included in the # documentation. HIDE_FRIEND_COMPOUNDS = NO # If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any # documentation blocks found inside the body of a function. # If set to NO (the default) these blocks will be appended to the # function's detailed documentation block. HIDE_IN_BODY_DOCS = NO # The INTERNAL_DOCS tag determines if documentation # that is typed after a \internal command is included. If the tag is set # to NO (the default) then the documentation will be excluded. # Set it to YES to include the internal documentation. INTERNAL_DOCS = NO # If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate # file names in lower-case letters. If set to YES upper-case letters are also # allowed. This is useful if you have classes or files whose names only differ # in case and if your file system supports case sensitive file names. Windows # and Mac users are advised to set this option to NO. CASE_SENSE_NAMES = NO # If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen # will show members with their full class and namespace scopes in the # documentation. If set to YES the scope will be hidden. HIDE_SCOPE_NAMES = NO # If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen # will put a list of the files that are included by a file in the documentation # of that file. SHOW_INCLUDE_FILES = YES # If the INLINE_INFO tag is set to YES (the default) then a tag [inline] # is inserted in the documentation for inline members. INLINE_INFO = YES # If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen # will sort the (detailed) documentation of file and class members # alphabetically by member name. If set to NO the members will appear in # declaration order. SORT_MEMBER_DOCS = YES # If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the # brief documentation of file, namespace and class members alphabetically # by member name. If set to NO (the default) the members will appear in # declaration order. SORT_BRIEF_DOCS = YES # If the SORT_MEMBERS_CTORS_1ST tag is set to YES then doxygen # will sort the (brief and detailed) documentation of class members so that # constructors and destructors are listed first. If set to NO (the default) # the constructors will appear in the respective orders defined by # SORT_MEMBER_DOCS and SORT_BRIEF_DOCS. # This tag will be ignored for brief docs if SORT_BRIEF_DOCS is set to NO # and ignored for detailed docs if SORT_MEMBER_DOCS is set to NO. SORT_MEMBERS_CTORS_1ST = YES # If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the # hierarchy of group names into alphabetical order. If set to NO (the default) # the group names will appear in their defined order. SORT_GROUP_NAMES = NO # If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be # sorted by fully-qualified names, including namespaces. If set to # NO (the default), the class list will be sorted only by class name, # not including the namespace part. # Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES. # Note: This option applies only to the class list, not to the # alphabetical list. SORT_BY_SCOPE_NAME = NO # The GENERATE_TODOLIST tag can be used to enable (YES) or # disable (NO) the todo list. This list is created by putting \todo # commands in the documentation. GENERATE_TODOLIST = YES # The GENERATE_TESTLIST tag can be used to enable (YES) or # disable (NO) the test list. This list is created by putting \test # commands in the documentation. GENERATE_TESTLIST = YES # The GENERATE_BUGLIST tag can be used to enable (YES) or # disable (NO) the bug list. This list is created by putting \bug # commands in the documentation. GENERATE_BUGLIST = YES # The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or # disable (NO) the deprecated list. This list is created by putting # \deprecated commands in the documentation. GENERATE_DEPRECATEDLIST= YES # The ENABLED_SECTIONS tag can be used to enable conditional # documentation sections, marked by \if sectionname ... \endif. ENABLED_SECTIONS = # The MAX_INITIALIZER_LINES tag determines the maximum number of lines # the initial value of a variable or define consists of for it to appear in # the documentation. If the initializer consists of more lines than specified # here it will be hidden. Use a value of 0 to hide initializers completely. # The appearance of the initializer of individual variables and defines in the # documentation can be controlled using \showinitializer or \hideinitializer # command in the documentation regardless of this setting. MAX_INITIALIZER_LINES = 30 # Set the SHOW_USED_FILES tag to NO to disable the list of files generated # at the bottom of the documentation of classes and structs. If set to YES the # list will mention the files that were used to generate the documentation. SHOW_USED_FILES = YES # If the sources in your project are distributed over multiple directories # then setting the SHOW_DIRECTORIES tag to YES will show the directory hierarchy # in the documentation. The default is NO. # obsoleted in doxygen 1.8.1.1 #SHOW_DIRECTORIES = YES # Set the SHOW_FILES tag to NO to disable the generation of the Files page. # This will remove the Files entry from the Quick Index and from the # Folder Tree View (if specified). The default is YES. SHOW_FILES = YES # Set the SHOW_NAMESPACES tag to NO to disable the generation of the # Namespaces page. This will remove the Namespaces entry from the Quick Index # and from the Folder Tree View (if specified). The default is YES. SHOW_NAMESPACES = YES # The FILE_VERSION_FILTER tag can be used to specify a program or script that # doxygen should invoke to get the current version for each file (typically from # the version control system). Doxygen will invoke the program by executing (via # popen()) the command , where is the value of # the FILE_VERSION_FILTER tag, and is the name of an input file # provided by doxygen. Whatever the program writes to standard output # is used as the file version. See the manual for examples. FILE_VERSION_FILTER = # The LAYOUT_FILE tag can be used to specify a layout file which will be parsed by # doxygen. The layout file controls the global structure of the generated output files # in an output format independent way. The create the layout file that represents # doxygen's defaults, run doxygen with the -l option. You can optionally specify a # file name after the option, if omitted DoxygenLayout.xml will be used as the name # of the layout file. LAYOUT_FILE = #--------------------------------------------------------------------------- # configuration options related to warning and progress messages #--------------------------------------------------------------------------- # The QUIET tag can be used to turn on/off the messages that are generated # by doxygen. Possible values are YES and NO. If left blank NO is used. QUIET = NO # The WARNINGS tag can be used to turn on/off the warning messages that are # generated by doxygen. Possible values are YES and NO. If left blank # NO is used. WARNINGS = YES # If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings # for undocumented members. If EXTRACT_ALL is set to YES then this flag will # automatically be disabled. WARN_IF_UNDOCUMENTED = YES # If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for # potential errors in the documentation, such as not documenting some # parameters in a documented function, or documenting parameters that # don't exist or using markup commands wrongly. WARN_IF_DOC_ERROR = YES # This WARN_NO_PARAMDOC option can be abled to get warnings for # functions that are documented, but have no documentation for their parameters # or return value. If set to NO (the default) doxygen will only warn about # wrong or incomplete parameter documentation, but not about the absence of # documentation. WARN_NO_PARAMDOC = NO # The WARN_FORMAT tag determines the format of the warning messages that # doxygen can produce. The string should contain the $file, $line, and $text # tags, which will be replaced by the file and line number from which the # warning originated and the warning text. Optionally the format may contain # $version, which will be replaced by the version of the file (if it could # be obtained via FILE_VERSION_FILTER) WARN_FORMAT = "$file:$line: $text" # The WARN_LOGFILE tag can be used to specify a file to which warning # and error messages should be written. If left blank the output is written # to stderr. WARN_LOGFILE = #--------------------------------------------------------------------------- # configuration options related to the input files #--------------------------------------------------------------------------- # The INPUT tag can be used to specify the files and/or directories that contain # documented source files. You may enter file names like "myfile.cpp" or # directories like "/usr/src/myproject". Separate the files or directories # with spaces. INPUT = .. # This tag can be used to specify the character encoding of the source files # that doxygen parses. Internally doxygen uses the UTF-8 encoding, which is # also the default input encoding. Doxygen uses libiconv (or the iconv built # into libc) for the transcoding. See http://www.gnu.org/software/libiconv for # the list of possible encodings. INPUT_ENCODING = UTF-8 # If the value of the INPUT tag contains directories, you can use the # FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp # and *.h) to filter out the source-files in the directories. If left # blank the following patterns are tested: # *.c *.cc *.cxx *.cpp *.c++ *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh *.hxx # *.hpp *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm *.py *.f90 FILE_PATTERNS = *.dox *.cpp *.c *.h # The RECURSIVE tag can be used to turn specify whether or not subdirectories # should be searched for input files as well. Possible values are YES and NO. # If left blank NO is used. RECURSIVE = YES # The EXCLUDE tag can be used to specify files and/or directories that should # excluded from the INPUT source files. This way you can easily exclude a # subdirectory from a directory tree whose root is specified with the INPUT tag. EXCLUDE = ./Port-win32 \ ./Port-winnt2k \ ./tests \ ./dibbler-* \ ./bison++ \ ./poslib # The EXCLUDE_SYMLINKS tag can be used select whether or not files or # directories that are symbolic links (a Unix filesystem feature) are excluded # from the input. EXCLUDE_SYMLINKS = YES # If the value of the INPUT tag contains directories, you can use the # EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude # certain files from those directories. Note that the wildcards are matched # against the file with absolute path, so to exclude all test directories # for example use the pattern */test/* EXCLUDE_PATTERNS = */.svn/* *~ bison++ Port-win32 Port-winnt2k */tests/* dibbler-@PACKAGE_VERSION@ # The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names # (namespaces, classes, functions, etc.) that should be excluded from the # output. The symbol name can be a fully qualified name, a word, or if the # wildcard * is used, a substring. Examples: ANamespace, AClass, # AClass::ANamespace, ANamespace::*Test EXCLUDE_SYMBOLS = # The EXAMPLE_PATH tag can be used to specify one or more files or # directories that contain example code fragments that are included (see # the \include command). EXAMPLE_PATH = ../poslib/examples ../doc/examples # If the value of the EXAMPLE_PATH tag contains directories, you can use the # EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp # and *.h) to filter out the source-files in the directories. If left # blank all files are included. EXAMPLE_PATTERNS = * # If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be # searched for input files to be used with the \include or \dontinclude # commands irrespective of the value of the RECURSIVE tag. # Possible values are YES and NO. If left blank NO is used. EXAMPLE_RECURSIVE = NO # The IMAGE_PATH tag can be used to specify one or more files or # directories that contain image that are included in the documentation (see # the \image command). IMAGE_PATH = # The INPUT_FILTER tag can be used to specify a program that doxygen should # invoke to filter for each input file. Doxygen will invoke the filter program # by executing (via popen()) the command , where # is the value of the INPUT_FILTER tag, and is the name of an # input file. Doxygen will then use the output that the filter program writes # to standard output. If FILTER_PATTERNS is specified, this tag will be # ignored. INPUT_FILTER = "sed \"s/List(\([_A-Za-z0-9]*\))/TContainer< SPtr<\1> >/g\"" # The FILTER_PATTERNS tag can be used to specify filters on a per file pattern # basis. Doxygen will compare the file name with each pattern and apply the # filter if there is a match. The filters are a list of the form: # pattern=filter (like *.cpp=my_cpp_filter). See INPUT_FILTER for further # info on how filters are used. If FILTER_PATTERNS is empty, INPUT_FILTER # is applied to all files. #FILTER_PATTERNS = *Lexer.cpp="sed /s/FLEX_STD/std::/g" FILTER_PATTERNS = # If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using # INPUT_FILTER) will be used to filter the input files when producing source # files to browse (i.e. when SOURCE_BROWSER is set to YES). FILTER_SOURCE_FILES = YES #--------------------------------------------------------------------------- # configuration options related to source browsing #--------------------------------------------------------------------------- # If the SOURCE_BROWSER tag is set to YES then a list of source files will # be generated. Documented entities will be cross-referenced with these sources. # Note: To get rid of all source code in the generated output, make sure also # VERBATIM_HEADERS is set to NO. SOURCE_BROWSER = NO # Setting the INLINE_SOURCES tag to YES will include the body # of functions and classes directly in the documentation. INLINE_SOURCES = NO # Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct # doxygen to hide any special comment blocks from generated source code # fragments. Normal C and C++ comments will always remain visible. STRIP_CODE_COMMENTS = YES # If the REFERENCED_BY_RELATION tag is set to YES # then for each documented function all documented # functions referencing it will be listed. REFERENCED_BY_RELATION = NO # If the REFERENCES_RELATION tag is set to YES # then for each documented function all documented entities # called/used by that function will be listed. REFERENCES_RELATION = NO # If the REFERENCES_LINK_SOURCE tag is set to YES (the default) # and SOURCE_BROWSER tag is set to YES, then the hyperlinks from # functions in REFERENCES_RELATION and REFERENCED_BY_RELATION lists will # link to the source code. Otherwise they will link to the documentation. REFERENCES_LINK_SOURCE = YES # If the USE_HTAGS tag is set to YES then the references to source code # will point to the HTML generated by the htags(1) tool instead of doxygen # built-in source browser. The htags tool is part of GNU's global source # tagging system (see http://www.gnu.org/software/global/global.html). You # will need version 4.8.6 or higher. USE_HTAGS = NO # If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen # will generate a verbatim copy of the header file for each class for # which an include is specified. Set to NO to disable this. VERBATIM_HEADERS = YES #--------------------------------------------------------------------------- # configuration options related to the alphabetical class index #--------------------------------------------------------------------------- # If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index # of all compounds will be generated. Enable this if the project # contains a lot of classes, structs, unions or interfaces. ALPHABETICAL_INDEX = YES # If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then # the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns # in which this list will be split (can be a number in the range [1..20]) COLS_IN_ALPHA_INDEX = 5 # In case all classes in a project start with a common prefix, all # classes will be put under the same header in the alphabetical index. # The IGNORE_PREFIX tag can be used to specify one or more prefixes that # should be ignored while generating the index headers. IGNORE_PREFIX = #--------------------------------------------------------------------------- # configuration options related to the HTML output #--------------------------------------------------------------------------- # If the GENERATE_HTML tag is set to YES (the default) Doxygen will # generate HTML output. GENERATE_HTML = YES # The HTML_OUTPUT tag is used to specify where the HTML docs will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `html' will be used as the default path. HTML_OUTPUT = html # The HTML_FILE_EXTENSION tag can be used to specify the file extension for # each generated HTML page (for example: .htm,.php,.asp). If it is left blank # doxygen will generate files with .html extension. HTML_FILE_EXTENSION = .html # The HTML_HEADER tag can be used to specify a personal HTML header for # each generated HTML page. If it is left blank doxygen will generate a # standard header. HTML_HEADER = # The HTML_FOOTER tag can be used to specify a personal HTML footer for # each generated HTML page. If it is left blank doxygen will generate a # standard footer. HTML_FOOTER = # The HTML_STYLESHEET tag can be used to specify a user-defined cascading # style sheet that is used by each HTML page. It can be used to # fine-tune the look of the HTML output. If the tag is left blank doxygen # will generate a default style sheet. Note that doxygen will try to copy # the style sheet file to the HTML output directory, so don't put your own # stylesheet in the HTML output directory as well, or it will be erased! HTML_STYLESHEET = # If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes, # files or namespaces will be aligned in HTML using tables. If set to # NO a bullet list will be used. # Obsoleted in doxygen 1.8.1.1 #HTML_ALIGN_MEMBERS = YES # If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML # documentation will contain sections that can be hidden and shown after the # page has loaded. For this to work a browser that supports # JavaScript and DHTML is required (for instance Mozilla 1.0+, Firefox # Netscape 6.0+, Internet explorer 5.0+, Konqueror, or Safari). HTML_DYNAMIC_SECTIONS = YES # If the GENERATE_DOCSET tag is set to YES, additional index files # will be generated that can be used as input for Apple's Xcode 3 # integrated development environment, introduced with OSX 10.5 (Leopard). # To create a documentation set, doxygen will generate a Makefile in the # HTML output directory. Running make will produce the docset in that # directory and running "make install" will install the docset in # ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find # it at startup. # See http://developer.apple.com/tools/creatingdocsetswithdoxygen.html for more information. GENERATE_DOCSET = NO # When GENERATE_DOCSET tag is set to YES, this tag determines the name of the # feed. A documentation feed provides an umbrella under which multiple # documentation sets from a single provider (such as a company or product suite) # can be grouped. DOCSET_FEEDNAME = "Doxygen generated docs" # When GENERATE_DOCSET tag is set to YES, this tag specifies a string that # should uniquely identify the documentation set bundle. This should be a # reverse domain-name style string, e.g. com.mycompany.MyDocSet. Doxygen # will append .docset to the name. DOCSET_BUNDLE_ID = org.doxygen.Project # If the GENERATE_HTMLHELP tag is set to YES, additional index files # will be generated that can be used as input for tools like the # Microsoft HTML help workshop to generate a compiled HTML help file (.chm) # of the generated HTML documentation. GENERATE_HTMLHELP = NO # If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can # be used to specify the file name of the resulting .chm file. You # can add a path in front of the file if the result should not be # written to the html output directory. CHM_FILE = # If the GENERATE_HTMLHELP tag is set to YES, the HHC_LOCATION tag can # be used to specify the location (absolute path including file name) of # the HTML help compiler (hhc.exe). If non-empty doxygen will try to run # the HTML help compiler on the generated index.hhp. HHC_LOCATION = # If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag # controls if a separate .chi index file is generated (YES) or that # it should be included in the master .chm file (NO). GENERATE_CHI = NO # If the GENERATE_HTMLHELP tag is set to YES, the CHM_INDEX_ENCODING # is used to encode HtmlHelp index (hhk), content (hhc) and project file # content. CHM_INDEX_ENCODING = # If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag # controls whether a binary table of contents is generated (YES) or a # normal table of contents (NO) in the .chm file. BINARY_TOC = NO # The TOC_EXPAND flag can be set to YES to add extra items for group members # to the contents of the HTML help documentation and to the tree view. TOC_EXPAND = NO # If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and QHP_VIRTUAL_FOLDER # are set, an additional index file will be generated that can be used as input for # Qt's qhelpgenerator to generate a Qt Compressed Help (.qch) of the generated # HTML documentation. GENERATE_QHP = NO # If the QHG_LOCATION tag is specified, the QCH_FILE tag can # be used to specify the file name of the resulting .qch file. # The path specified is relative to the HTML output folder. QCH_FILE = # The QHP_NAMESPACE tag specifies the namespace to use when generating # Qt Help Project output. For more information please see # http://doc.trolltech.com/qthelpproject.html#namespace QHP_NAMESPACE = # The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating # Qt Help Project output. For more information please see # http://doc.trolltech.com/qthelpproject.html#virtual-folders QHP_VIRTUAL_FOLDER = doc # If QHP_CUST_FILTER_NAME is set, it specifies the name of a custom filter to add. # For more information please see # http://doc.trolltech.com/qthelpproject.html#custom-filters QHP_CUST_FILTER_NAME = # The QHP_CUST_FILT_ATTRS tag specifies the list of the attributes of the custom filter to add.For more information please see # Qt Help Project / Custom Filters. QHP_CUST_FILTER_ATTRS = # The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this project's # filter section matches. # Qt Help Project / Filter Attributes. QHP_SECT_FILTER_ATTRS = # If the GENERATE_QHP tag is set to YES, the QHG_LOCATION tag can # be used to specify the location of Qt's qhelpgenerator. # If non-empty doxygen will try to run qhelpgenerator on the generated # .qhp file. QHG_LOCATION = # The DISABLE_INDEX tag can be used to turn on/off the condensed index at # top of each HTML page. The value NO (the default) enables the index and # the value YES disables it. DISABLE_INDEX = NO # This tag can be used to set the number of enum values (range [1..20]) # that doxygen will group on one line in the generated HTML documentation. ENUM_VALUES_PER_LINE = 4 # The GENERATE_TREEVIEW tag is used to specify whether a tree-like index # structure should be generated to display hierarchical information. # If the tag value is set to YES, a side panel will be generated # containing a tree-like index structure (just like the one that # is generated for HTML Help). For this to work a browser that supports # JavaScript, DHTML, CSS and frames is required (i.e. any modern browser). # Windows users are probably better off using the HTML help feature. GENERATE_TREEVIEW = YES # By enabling USE_INLINE_TREES, doxygen will generate the Groups, Directories, # and Class Hierarchy pages using a tree view instead of an ordered list. # Obsoleted in Doxygen 1.8.1.1 #USE_INLINE_TREES = YES # If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be # used to set the initial width (in pixels) of the frame in which the tree # is shown. TREEVIEW_WIDTH = 250 # Use this tag to change the font size of Latex formulas included # as images in the HTML documentation. The default is 10. Note that # when you change the font size after a successful doxygen run you need # to manually remove any form_*.png images from the HTML output directory # to force them to be regenerated. FORMULA_FONTSIZE = 10 # When the SEARCHENGINE tag is enable doxygen will generate a search box # for the HTML output. The underlying search engine uses javascript # and DHTML and should work on any modern browser. Note that when using # HTML help (GENERATE_HTMLHELP) or Qt help (GENERATE_QHP) # there is already a search function so this one should typically # be disabled. SEARCHENGINE = YES #--------------------------------------------------------------------------- # configuration options related to the LaTeX output #--------------------------------------------------------------------------- # If the GENERATE_LATEX tag is set to YES (the default) Doxygen will # generate Latex output. GENERATE_LATEX = NO # The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `latex' will be used as the default path. LATEX_OUTPUT = latex # The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be # invoked. If left blank `latex' will be used as the default command name. LATEX_CMD_NAME = latex # The MAKEINDEX_CMD_NAME tag can be used to specify the command name to # generate index for LaTeX. If left blank `makeindex' will be used as the # default command name. MAKEINDEX_CMD_NAME = makeindex # If the COMPACT_LATEX tag is set to YES Doxygen generates more compact # LaTeX documents. This may be useful for small projects and may help to # save some trees in general. COMPACT_LATEX = NO # The PAPER_TYPE tag can be used to set the paper type that is used # by the printer. Possible values are: a4, a4wide, letter, legal and # executive. If left blank a4wide will be used. PAPER_TYPE = a4wide # The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX # packages that should be included in the LaTeX output. EXTRA_PACKAGES = # The LATEX_HEADER tag can be used to specify a personal LaTeX header for # the generated latex document. The header should contain everything until # the first chapter. If it is left blank doxygen will generate a # standard header. Notice: only use this tag if you know what you are doing! LATEX_HEADER = # If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated # is prepared for conversion to pdf (using ps2pdf). The pdf file will # contain links (just like the HTML output) instead of page references # This makes the output suitable for online browsing using a pdf viewer. PDF_HYPERLINKS = YES # If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of # plain latex in the generated Makefile. Set this option to YES to get a # higher quality PDF documentation. USE_PDFLATEX = YES # If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode. # command to the generated LaTeX files. This will instruct LaTeX to keep # running if errors occur, instead of asking the user for help. # This option is also used when generating formulas in HTML. LATEX_BATCHMODE = NO # If LATEX_HIDE_INDICES is set to YES then doxygen will not # include the index chapters (such as File Index, Compound Index, etc.) # in the output. LATEX_HIDE_INDICES = NO # If LATEX_SOURCE_CODE is set to YES then doxygen will include # source code with syntax highlighting in the LaTeX output. # Note that which sources are shown also depends on other settings # such as SOURCE_BROWSER. LATEX_SOURCE_CODE = NO #--------------------------------------------------------------------------- # configuration options related to the RTF output #--------------------------------------------------------------------------- # If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output # The RTF output is optimized for Word 97 and may not look very pretty with # other RTF readers or editors. GENERATE_RTF = NO # The RTF_OUTPUT tag is used to specify where the RTF docs will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `rtf' will be used as the default path. RTF_OUTPUT = rtf # If the COMPACT_RTF tag is set to YES Doxygen generates more compact # RTF documents. This may be useful for small projects and may help to # save some trees in general. COMPACT_RTF = NO # If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated # will contain hyperlink fields. The RTF file will # contain links (just like the HTML output) instead of page references. # This makes the output suitable for online browsing using WORD or other # programs which support those fields. # Note: wordpad (write) and others do not support links. RTF_HYPERLINKS = NO # Load stylesheet definitions from file. Syntax is similar to doxygen's # config file, i.e. a series of assignments. You only have to provide # replacements, missing definitions are set to their default value. RTF_STYLESHEET_FILE = # Set optional variables used in the generation of an rtf document. # Syntax is similar to doxygen's config file. RTF_EXTENSIONS_FILE = #--------------------------------------------------------------------------- # configuration options related to the man page output #--------------------------------------------------------------------------- # If the GENERATE_MAN tag is set to YES (the default) Doxygen will # generate man pages GENERATE_MAN = NO # The MAN_OUTPUT tag is used to specify where the man pages will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `man' will be used as the default path. MAN_OUTPUT = man # The MAN_EXTENSION tag determines the extension that is added to # the generated man pages (default is the subroutine's section .3) MAN_EXTENSION = .3 # If the MAN_LINKS tag is set to YES and Doxygen generates man output, # then it will generate one additional man file for each entity # documented in the real man page(s). These additional files # only source the real man page, but without them the man command # would be unable to find the correct page. The default is NO. MAN_LINKS = NO #--------------------------------------------------------------------------- # configuration options related to the XML output #--------------------------------------------------------------------------- # If the GENERATE_XML tag is set to YES Doxygen will # generate an XML file that captures the structure of # the code including all documentation. GENERATE_XML = NO # The XML_OUTPUT tag is used to specify where the XML pages will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `xml' will be used as the default path. XML_OUTPUT = xml # The XML_SCHEMA tag can be used to specify an XML schema, # which can be used by a validating XML parser to check the # syntax of the XML files. XML_SCHEMA = # The XML_DTD tag can be used to specify an XML DTD, # which can be used by a validating XML parser to check the # syntax of the XML files. XML_DTD = # If the XML_PROGRAMLISTING tag is set to YES Doxygen will # dump the program listings (including syntax highlighting # and cross-referencing information) to the XML output. Note that # enabling this will significantly increase the size of the XML output. XML_PROGRAMLISTING = YES #--------------------------------------------------------------------------- # configuration options for the AutoGen Definitions output #--------------------------------------------------------------------------- # If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will # generate an AutoGen Definitions (see autogen.sf.net) file # that captures the structure of the code including all # documentation. Note that this feature is still experimental # and incomplete at the moment. GENERATE_AUTOGEN_DEF = NO #--------------------------------------------------------------------------- # configuration options related to the Perl module output #--------------------------------------------------------------------------- # If the GENERATE_PERLMOD tag is set to YES Doxygen will # generate a Perl module file that captures the structure of # the code including all documentation. Note that this # feature is still experimental and incomplete at the # moment. GENERATE_PERLMOD = NO # If the PERLMOD_LATEX tag is set to YES Doxygen will generate # the necessary Makefile rules, Perl scripts and LaTeX code to be able # to generate PDF and DVI output from the Perl module output. PERLMOD_LATEX = NO # If the PERLMOD_PRETTY tag is set to YES the Perl module output will be # nicely formatted so it can be parsed by a human reader. This is useful # if you want to understand what is going on. On the other hand, if this # tag is set to NO the size of the Perl module output will be much smaller # and Perl will parse it just the same. PERLMOD_PRETTY = YES # The names of the make variables in the generated doxyrules.make file # are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. # This is useful so different doxyrules.make files included by the same # Makefile don't overwrite each other's variables. PERLMOD_MAKEVAR_PREFIX = #--------------------------------------------------------------------------- # Configuration options related to the preprocessor #--------------------------------------------------------------------------- # If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will # evaluate all C-preprocessor directives found in the sources and include # files. ENABLE_PREPROCESSING = YES # If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro # names in the source code. If set to NO (the default) only conditional # compilation will be performed. Macro expansion can be done in a controlled # way by setting EXPAND_ONLY_PREDEF to YES. MACRO_EXPANSION = YES # If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES # then the macro expansion is limited to the macros specified with the # PREDEFINED and EXPAND_AS_DEFINED tags. EXPAND_ONLY_PREDEF = NO # If the SEARCH_INCLUDES tag is set to YES (the default) the includes files # in the INCLUDE_PATH (see below) will be search if a #include is found. SEARCH_INCLUDES = YES # The INCLUDE_PATH tag can be used to specify one or more directories that # contain include files that are not input files but should be processed by # the preprocessor. INCLUDE_PATH = # You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard # patterns (like *.h and *.hpp) to filter out the header-files in the # directories. If left blank, the patterns specified with FILE_PATTERNS will # be used. INCLUDE_FILE_PATTERNS = # The PREDEFINED tag can be used to specify one or more macro names that # are defined before the preprocessor is started (similar to the -D option of # gcc). The argument of the tag is a list of macros of the form: name # or name=definition (no spaces). If the definition and the = are # omitted =1 is assumed. To prevent a macro definition from being # undefined via #undef or recursively expanded use the := operator # instead of the = operator. PREDEFINED = # If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then # this tag can be used to specify a list of macro names that should be expanded. # The macro definition that is found in the sources will be used. # Use the PREDEFINED tag if you want to use a different macro definition. EXPAND_AS_DEFINED = # If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then # doxygen's preprocessor will remove all function-like macros that are alone # on a line, have an all uppercase name, and do not end with a semicolon. Such # function macros are typically used for boiler-plate code, and will confuse # the parser if not removed. SKIP_FUNCTION_MACROS = YES #--------------------------------------------------------------------------- # Configuration::additions related to external references #--------------------------------------------------------------------------- # The TAGFILES option can be used to specify one or more tagfiles. # Optionally an initial location of the external documentation # can be added for each tagfile. The format of a tag file without # this location is as follows: # TAGFILES = file1 file2 ... # Adding location for the tag files is done as follows: # TAGFILES = file1=loc1 "file2 = loc2" ... # where "loc1" and "loc2" can be relative or absolute paths or # URLs. If a location is present for each tag, the installdox tool # does not have to be run to correct the links. # Note that each tag file must have a unique name # (where the name does NOT include the path) # If a tag file is not located in the directory in which doxygen # is run, you must also specify the path to the tagfile here. TAGFILES = # When a file name is specified after GENERATE_TAGFILE, doxygen will create # a tag file that is based on the input files it reads. GENERATE_TAGFILE = tag # If the ALLEXTERNALS tag is set to YES all external classes will be listed # in the class index. If set to NO only the inherited external classes # will be listed. ALLEXTERNALS = NO # If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed # in the modules index. If set to NO, only the current project's groups will # be listed. EXTERNAL_GROUPS = YES # The PERL_PATH should be the absolute path and name of the perl script # interpreter (i.e. the result of `which perl'). PERL_PATH = /usr/bin/perl #--------------------------------------------------------------------------- # Configuration options related to the dot tool #--------------------------------------------------------------------------- # If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will # generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base # or super classes. Setting the tag to NO turns the diagrams off. Note that # this option is superseded by the HAVE_DOT option below. This is only a # fallback. It is recommended to install and use dot, since it yields more # powerful graphs. CLASS_DIAGRAMS = YES # You can define message sequence charts within doxygen comments using the \msc # command. Doxygen will then run the mscgen tool (see # http://www.mcternan.me.uk/mscgen/) to produce the chart and insert it in the # documentation. The MSCGEN_PATH tag allows you to specify the directory where # the mscgen tool resides. If left empty the tool is assumed to be found in the # default search path. MSCGEN_PATH = # If set to YES, the inheritance and collaboration graphs will hide # inheritance and usage relations if the target is undocumented # or is not a class. HIDE_UNDOC_RELATIONS = YES # If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is # available from the path. This tool is part of Graphviz, a graph visualization # toolkit from AT&T and Lucent Bell Labs. The other options in this section # have no effect if this option is set to NO (the default) HAVE_DOT = YES # By default doxygen will write a font called FreeSans.ttf to the output # directory and reference it in all dot files that doxygen generates. This # font does not include all possible unicode characters however, so when you need # these (or just want a differently looking font) you can specify the font name # using DOT_FONTNAME. You need need to make sure dot is able to find the font, # which can be done by putting it in a standard location or by setting the # DOTFONTPATH environment variable or by setting DOT_FONTPATH to the directory # containing the font. DOT_FONTNAME = FreeSans # The DOT_FONTSIZE tag can be used to set the size of the font of dot graphs. # The default size is 10pt. DOT_FONTSIZE = 10 # By default doxygen will tell dot to use the output directory to look for the # FreeSans.ttf font (which doxygen will put there itself). If you specify a # different font using DOT_FONTNAME you can set the path where dot # can find it using this tag. DOT_FONTPATH = # If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen # will generate a graph for each documented class showing the direct and # indirect inheritance relations. Setting this tag to YES will force the # the CLASS_DIAGRAMS tag to NO. CLASS_GRAPH = YES # If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen # will generate a graph for each documented class showing the direct and # indirect implementation dependencies (inheritance, containment, and # class references variables) of the class with other documented classes. COLLABORATION_GRAPH = YES # If the GROUP_GRAPHS and HAVE_DOT tags are set to YES then doxygen # will generate a graph for groups, showing the direct groups dependencies GROUP_GRAPHS = YES # If the UML_LOOK tag is set to YES doxygen will generate inheritance and # collaboration diagrams in a style similar to the OMG's Unified Modeling # Language. UML_LOOK = YES # If set to YES, the inheritance and collaboration graphs will show the # relations between templates and their instances. TEMPLATE_RELATIONS = NO # If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT # tags are set to YES then doxygen will generate a graph for each documented # file showing the direct and indirect include dependencies of the file with # other documented files. # Performance trick: disable this to make generation much faster INCLUDE_GRAPH = YES # If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and # HAVE_DOT tags are set to YES then doxygen will generate a graph for each # documented header file showing the documented files that directly or # indirectly include this file. # Performance trick: disable this to make generation much faster INCLUDED_BY_GRAPH = YES # If the CALL_GRAPH and HAVE_DOT options are set to YES then # doxygen will generate a call dependency graph for every global function # or class method. Note that enabling this option will significantly increase # the time of a run. So in most cases it will be better to enable call graphs # for selected functions only using the \callgraph command. CALL_GRAPH = NO # If the CALLER_GRAPH and HAVE_DOT tags are set to YES then # doxygen will generate a caller dependency graph for every global function # or class method. Note that enabling this option will significantly increase # the time of a run. So in most cases it will be better to enable caller # graphs for selected functions only using the \callergraph command. CALLER_GRAPH = NO # If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen # will graphical hierarchy of all classes instead of a textual one. GRAPHICAL_HIERARCHY = YES # If the DIRECTORY_GRAPH, SHOW_DIRECTORIES and HAVE_DOT tags are set to YES # then doxygen will show the dependencies a directory has on other directories # in a graphical way. The dependency relations are determined by the #include # relations between the files in the directories. DIRECTORY_GRAPH = YES # The DOT_IMAGE_FORMAT tag can be used to set the image format of the images # generated by dot. Possible values are png, jpg, or gif # If left blank png will be used. DOT_IMAGE_FORMAT = png # The tag DOT_PATH can be used to specify the path where the dot tool can be # found. If left blank, it is assumed the dot tool can be found in the path. DOT_PATH = # The DOTFILE_DIRS tag can be used to specify one or more directories that # contain dot files that are included in the documentation (see the # \dotfile command). DOTFILE_DIRS = # The DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of # nodes that will be shown in the graph. If the number of nodes in a graph # becomes larger than this value, doxygen will truncate the graph, which is # visualized by representing a node as a red box. Note that doxygen if the # number of direct children of the root node in a graph is already larger than # DOT_GRAPH_MAX_NODES then the graph will not be shown at all. Also note # that the size of a graph can be further restricted by MAX_DOT_GRAPH_DEPTH. DOT_GRAPH_MAX_NODES = 50 # The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the # graphs generated by dot. A depth value of 3 means that only nodes reachable # from the root by following a path via at most 3 edges will be shown. Nodes # that lay further from the root node will be omitted. Note that setting this # option to 1 or 2 may greatly reduce the computation time needed for large # code bases. Also note that the size of a graph can be further restricted by # DOT_GRAPH_MAX_NODES. Using a depth of 0 means no depth restriction. MAX_DOT_GRAPH_DEPTH = 0 # Set the DOT_TRANSPARENT tag to YES to generate images with a transparent # background. This is disabled by default, because dot on Windows does not # seem to support this out of the box. Warning: Depending on the platform used, # enabling this option may lead to badly anti-aliased labels on the edges of # a graph (i.e. they become hard to read). DOT_TRANSPARENT = NO # Set the DOT_MULTI_TARGETS tag to YES allow dot to generate multiple output # files in one run (i.e. multiple -o and -T options on the command line). This # makes dot run faster, but since only newer versions of dot (>1.8.10) # support this, this feature is disabled by default. DOT_MULTI_TARGETS = YES # If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will # generate a legend page explaining the meaning of the various boxes and # arrows in the dot generated graphs. GENERATE_LEGEND = YES # If the DOT_CLEANUP tag is set to YES (the default) Doxygen will # remove the intermediate dot files that are used to generate # the various graphs. DOT_CLEANUP = YES dibbler-1.0.1/doc/dibbler-devel-02-compile.dox0000644000175000017500000003367512277722750015714 00000000000000/** * * @page compilation 2. Compilation * Currently Dibbler supports several operating systems: Linux (2.4, 2.6, 3.0), Windows (NT4, * 2000/XP/2003/Vista/Win7), Mac OS X, FreeBSD, NetBSD, OpenBSD and Solaris 11. * Compilation process is system dependent, so it is described for various systems separately. * @section compilationPosix 2.1 Posix compilation To compile Dibbler or Posix complaint systems, extract sources, and type: @verbatim ./configure make client server relay requestor @endverbatim to build client, server, relay and requestor. Although parser files are generated using flex and bison++ and those generated sources are included, so there is no need to generate them. To generate it if someone wants to generate it by hand instead of using those supplied versions, here are appropriate commands: @verbatim make parser @endverbatim * * to generate client, server and relay parsers. * * There occassionaly might be problem with compilation, when different * flex version is installed in the system. Proper FlexLexer.h is * provided in the SrvCfgMgr and ClntCfgMgr directories. * * @section compilationLinux 2.2 Linux Compilation * Please follow POSIX complilation guidelines (@ref compilationPosix). * * @section compilationMac 2.3 Mac OS X Compilation * Please follow POSIX complilation guidelines (@ref compilationPosix). * * @section compilationBSD 2.4 FreeBSD/NetBSD/OpenBSD Compilation * Please follow POSIX complilation guidelines (@ref compilationPosix). * * @section compilationSol 2.5 Solaris 11 Compilation * Oracle Solaris 11 support is experimental. Please follow POSIX compilation * guidelines (@ref compilationPosix). * * @section autotools 2.6 Autoconf and automake * * Starting with 0.8.1RC1, Dibbler uses autotools. Usually developers do not * have to use it. However, if you add new file, you need to modify Makefile.am. * Also, if you added a new feature or dependency, you need to modify * configure.ac. In such case, following procedure should be used to regenerate * required build system files: * * @verbatim make maintainer-clean autoreconf --install --force @endverbatim * * Make maintainer-clean should remove all files generated by automake and autoconf. * autoreconf should regenerate them. --force is used just in case if there are * any files left and local version of automake or autoconf is older than the version * that was used to generate existing files. * * @section compilationWin32 2.7 Windows XP/2003/Vista/Win7 compilation * To compile Dibbler under modern Windows systems, MS Visual Studio 2008 was * used. Project files are provided in the SVN and source archives. * * Please open solution file Port-win32/dibbler-win32.vs2008.sln in your * Visual Studio 2008, then click Build solution in the Build menu. * * Previously, Dibbler was built in Visual Studio 2003 and 2005. * Project and solution files for those older versions may still be * present in Port-win32 directory, but they may disappear anytime. * Please upgrade to VS 2008 version. * * @section compilationWinNT 2.8 Windows NT4/2000 compilation * Those 2 old Windows operating systems are only partially supported. Note that * even Microsoft does not support IPv6 on those systems. * * @section compilationFlexBison 2.9 Flex and bison++ under Windows * Flex and bison++ tools are not required to successfully build Dibbler. They are * only required, if changes are made to the parsers. Lexer and Parser files * (ClntCfgMgr/ClntLexer.*, ClntCfgMgr/ClntParser.*, SrvCfgMgr/SrvLexer.*, * SrvCfgMgr/SrvParser.*, RelCfgMgr/RelLexer.* and RelCfgMgr/RelParser.*) * are generated by author and located in SVN and * archives. There is no need to generate them. However, if you insist on * doing so, there is an flex and bison binary included in port-win32. Take note that * several modifications are required: * * To generate @c ClntParser.cpp and @c ClntLexer.cpp files, you can use * @c parser.bat. After generation, in file @c ClntLexer.cpp replace: * @code class istream; @endcode with: @code #include using namespace std;@endcode lines. flex binary included is slightly modified. * It generates * * @verbatim #include "FlexLexer.h" @endverbatim * instead of * @verbatim #include @endverbatim * * You should add .\\ to include path if you have problem with missing FlexLexer.h. * Also note that FlexLexer.h is modified (std:: added in several places, * @code @endcode is replaced with @code @endcode etc.) * * @code * %% In file ClntParser.cpp, substitute line (around 1860): * %% ++yyvsp = yylval; with: *++yyvsp = ::yylval; * %% This trick is supposed to fix numerous parser problems. * @endcode * * Keep in mind that author is in no way a flex/bison guru and found this method * in a painful trial-and-error way. Also, it is strongly recommended to get * latest version of Flex/bison++ for Windows. * * @section compilationDebRpm 2.10 DEB and RPM Packages * Older Dibbler version allowed to generate RPM (RadHat, Fedora Core, Mandrake, * PLD and lots of other distributions) and DEB (Debian, Knoppix and * other) packages. They were not maintained at all, so this obsolete * capability was dropped when build system was rewritten to use autotools. * * There is a debian/ branch in GIT repo that contains older version of the * debian scripts. It is *NOT* maintained. Please use scripts from the Debian * repo directly: http://packages.debian.org/source/sid/dibbler and download * dibbler_X.Y.Z-debian.tar.gz. Debian packages are maintained by Bartosz Fenski * (mailto:fenio(at)debian(dot)org) and Michal Zubryk (mailto:michalz(at)zsl(dot)gda(dot)pl). * * @section compilationOpenWrt 2.11 Cross-compilation for OpenWRT * Dibbler is also part of the OpenWRT Linux distribution intended to * address broad range of embedded devices, like LinkSys routers and * access points. * * @section compilationGentoo 2.12 Ebuild script for Gentoo Linux * There is also ebuild script prepared for Gentoo users. It is located * in the Port-linux/gentoo directory. Dibbler is also part of the * Gentoo Linux distribution so make sure that you verify which version * is the latest - provided by Gentoo or in the Dibbler sources. * * Ebuild for Gentoo was created long time ago by author and then submitted * to Gentoo community. Author no longer maintains it, but occasionally * retrieves latest version from Gentoo repositories. * * @section compilationDistros 2.13 Dibbler in Linux distributions * Dibbler is available in several distributions: * * - Debian GNU/Linux -- use standard tools * (apt-get, aptitude) to install dibbler-client, dibbler-server, * dibbler-relay or dibbler-doc packages (e.g. @c apt-get @c install @c dibbler-client) * - Gentoo Linux -- use emerge to * install dibbler (e.g. emerge dibbler). * - OpenWRT * - Ubuntu Linux * - PLD GNU/Linux -- use standard * PLD's poldek tool to install dibbler package. * * @section compilationEnvironment 2.14 Compilation environment * When compilation is being performed in non-standard envrionment, it is a * good idea to examine and modify @c Makefile.inc file. Compiler name, * compilation and link options, used libraries and debugging options can * be modified there. * * @section compilationDefaultValues 2.15 Changing default values * Custom builds might be prepared with different than default * compilation options. Here is a list of features, which can be * customised: * - Default log level -- please modify LOGMODE_DEFAULT define in * @c Mish/Logger.h+. * - @todo - describe remaining parameters * * @section compilationModularFeatures 2.16 Modular features * In the 0.5.0 release, so called \e modular features were * introduced. Those modules features are replaced by parameters * passed to ./configure script in 0.8.1RC1. See output of @verbatim ./configure --help @endverbatim for a list of available parameters. Currently the following features can be enabled (--enable-feature) or disabled (--disable-feature): - \b --enable-debug - This will change compilation flags, so the binaries will include debugging symbols and are easier to debug. This disables -O2 flag and enables -O0 (no optimization) and adds -g (include debugging symbols). - \b --enable-efence - This will link the code with electric fence, a popular memory debugger. Do not use it, unless you are a developer or were explicitely asked to enable it. Make sure that you have efence library installed in your system. - \b --enable-bind-reuse - When creating sockets, it is possible to configure socket options to allow binding the same address/port many times (SO_REUSEADDR flag passed to setsockopt). In certain cases this is convenient, so it is enabled by default. - \b --enable-dst-addr-check - When server receives a packet on a socket, it checks whether the destination address matches the address the socket is bound to. On some systems when there are 2 sockets - one bound to multicast address and second bound to unicast address - the packet is received twice. This check can drop the packet when received over the wrong interface. Disabled by default. Please enable this if you are receiving every packet twice. - \b --enable-resolvconf - Dibbler client may update /etc/resolv.conf to add, change or remove entries for DNS servers and domain names. There may be other processes in your system (e.g. pppd) that may do the same. In some cases this may cause the /etc/resolv.conf to become currupted. To manage such modifications, a tool called resolvconf was developed. If enable-resolvconf is passed, then dibbler will try to use that tool to update /etc/resolv.conf file. If resolvconf is not present if your PATH or support for it has been disabled, dibbler will update /etc/resolv.conf on its own. - \b --enable-dns-update - Dibbler server and client supports FQDN option that informs the client about its hostname. Together with IPv6 address that information can be added to the DNS using DNS Update mechanism. If you are not planning on using that feature, you may disable DNS Updates as it requires additional library called poslib. Disabling DNS Update will make the code smaller. Server will be able to assign FQDNs and client will be able to receive it, but either will be able to update DNS server. - \b --enable-auth - Dibbler implements its own custom authentication and authorization. It is described in section 4.15 of Dibbler User's Guide. If you are not planning on using it and are concerned about binary size, you may consider disabling it. - \b --enable-link-state - Dibbler client running on Linux is able to detect link state changes and act based on those changes, i.e. send CONFIRM messages after reconnecting. There is a slight overhard related to this. If you are not interested in detecting link changes, you may choose to not link this feature into your binary. - \b --enable-remote-autoconf - Dibbler implements remote autoconf mechanism described in (currently expired) draft draft-mrugalski-remote-dhcpv6-01. Enable this functionality only if you read that draft, understand it and plan to use it. * @subsection compilationCross 2.17 Cross-compilation * Since 0.6.1 version, dibbler supports cross-compilation. It was * possible in previous versions, but with considerable amount of work. * * Following description has been provided by * Petr Pisar. Thanks! * * In general, a toolchain has to be specified. * * For autotools compilation driven (e.g. poslib), you need to call the * configure script with @c --chost and @c --cbuild parameters describing * toolchains used for compilation of binaries for platform where dibbler * is supposted to run and for platform where compilation will be * proceeded. configure should derive names of compiler for C (CC), C++ * (CXX), name of binutils (e.g. strip) etc. automatically. * * If you don't use autotools (like dibbler partially) or you want your own * compilers, you need to export this variables manually (CC, CXX). If you * want specify compiler for producing local binaries, use @c CC_FOR_BUILD and * @c CXX_FOR_BUILD. * * Next, if you want to optimize the binaries or to use some non-standard * paths to header files or libraries, you need to export variables CFLAGS * and LDFLAGS for C language and CXXFLAGS and LDFLAGS for C++. These * variables apply for compilation for target platform. If you want tweak * compilation of binaries for local building machine, use * @c CFLAGS_FOR_BUILD, @c LDFLAGS_FOR_BUILD and @c CXXFLAGS_FOR_BUILD. * * If you have all cross-compiled libraries under one directory (lets say * image of root file system), you can use gcc argument --sysroot which * allows to specify alternate directory tree, where all headers and * libraries live. * * Finally, you should tell to make by DESTDIR variable, where you want to * install dibbler. * * For example, the following command can be used to cross-compile dibbler for * mipsel-softfloat-linux-gnu on i586-pc-linux-gnu having MIPS system * installed under /var/tftp/mips32el-linux-gnu and all tool-chain utilities in PATH: * * @verbatim CBUILD=i586-pc-linux-gnu \ CC=mipsel-softfloat-linux-gnu-gcc \ CXX=mipsel-softfloat-linux-gnu-g++ \ CFLAGS='-march=4kc -msoft-float -Os -pipe -fomit-frame-pointer --sysroot=/var/tftp/mips32el-linux-gnu' \ CXXFLAGS='-march=4kc -msoft-float -Os -pipe -fomit-frame-pointer --sysroot=/var/tftp/mips32el-linux-gnu' \ LDFLAGS=--sysroot=/var/tftp/mips32el-linux-gnu \ CHOST=mipsel-softfloat-linux-gnu \ CC_FOR_BUILD=i586-pc-linux-gnu-gcc \ CFLAGS_FOR_BUILD='-march=k6-2 -O2 -pipe -fomit-frame-pointer' \ CXXFLAGS_FOR_BUILD='-march=k6-2 -O2 -pipe -fomit-frame-pointer' \ CXX_FOR_BUILD=i586-pc-linux-gnu-g++ \ LDFLAGS_FOR_BUILD= \ make -j1 @endverbatim * */ dibbler-1.0.1/doc/dibbler-prefixes-router.png0000664000175000017500000032731712233256142016073 00000000000000‰PNG  IHDRônßSsRGB®ÎégAMA± üa cHRMz&€„ú€èu0ê`:˜pœºQ< pHYsÂÂnÐu>ÿyIDATx^ì½ üUÓþÿÿýÿ¾÷âû½Š{‰J)s"®’¡P’)S2DTT*JI’Ò@!%”ˆ2O™*$MJEÈéÞïÿUï¼­»ÇuöÙçœ}öyíǾîéœ5¼×ó½öù|Öëó^ïõÿýßÿýßñ"  ÈœÀW_}µpáÂÌë± À6;ï¼síÚµ‰ƒH€H€H [wx‘ ؘ5kV»ví°(Íög0ë“ üA bÅŠ 4hҤɰaÖ-[fÿ<²$ À–¨R   °$€5gݺu¹'È55jtïÞ}îܹ–Ï&‹‘ @‰ ¸Sâ€Ã' °%0yòdFëäzIÏöIÀA±<”xl¿¤XŽH€H „ PÜ)açsè$@$@ÖÊÊʸê&(-Zp¯–õ× ’ ”"Š;¥èuŽ™H€H #H²³Ã;˜ËÚw©tè©­›õzâÒa³x“ dCàœ;&|ÍÜx¦:á|<\žžA¤ãÉèÉea  (wJÇ×) @7n¬^½º¹ÚÜçÈF—Ü7³Íðwx“ ä‚À¹½Ç~z›ÿ)¿‹[åAÏæÍ›£<ɬC$@$@©&@q'ÕîåàH€H€²&€Å¤¹Â<¤Q‹ö¿Ë›H ×Zõ~ÿCNýË_¶wH<8:[´²þbc$@$@i#@q'måxH€H€b$€L®æÂ²â>µ:Œx³Ó£ïñ&È)ËúM¯ÜGuÝGtÜm·Cú‚é¨ïÄøEǦH€H€R@€âN œÈ! äŠ@³fÍtUù—¿n×æÞ©×Žþ€7 @N t|àÍcÞe§}û¡ëÖmúå—ß®¸âÆÿ÷ÿþbJ<ˆßÁ–É\=ùl—H€H€ŠÅbóí% ÈGØÎM.¼áñÙ¼I€rMàô–ƒ ì´l9²Ž>î·ßþÐÿüÏ?L}§¤çëË€ý @Ò PÜIº‡h @¡´k×NW’;î¼Ë £ß¹iÜÞ$@9%ÐyÐKPvŽ=ö†åË¿6Ÿ}=-[ösè;]ºt)Ô÷û%  D ¸“(wÐ  ¨X±¢Š;']ØùÖ'?äM$kçwxâNYÙ÷wÁÛo/¨]»í_þ²ƒ¿ƒ»}kÐ  (Š;ÏnI€H€’Mà•W^1×›ÞgâG¼³'pz›«xn¼°oíšû§F¨å×~¼­™½´éýp£ ;‰©¸ñ}Ù“%orN½£»AÜY½z½ç7öjÕ¬yáÿå¯úxÖ­[7Ùß%´ŽH€H€òA€âN>(³  ¢#`îÉÚó€Cî~zïX4¹¸³,Ëñ¾ÁÎÆG¨å×~¼­I/­z ª~àáŽCäŸx¿ëÐiöƒ-å’îœ*y”ý¾1FÚ²iëðz-LÔ“'O.ºoL$@$@ñ ¸/O¶F$@$8kYW§^ÒåÞ©ŸðŽ…@Ó–W X¼°oðÚ{ŸŒP˯ýx[C/]{—Ζ •«íuÐárãµ¼èÔ~¼%[ò¼ËC»™8ñm¿ïDôlÉÈsü•÷:@™cåæÍ›SòÕÃa @$w"ac%  TX³fpÃýïv>ïXœ~É6q/ì¼yø³ûÔ<÷yí{Ú×ò+Ùmà6©(#üZë3æUqê5>Ç,†­w’Ì%Ÿ½å©oáèúA{²ä[§uë­giu¹×|HGŽ™êï$ŽH€H€BPÜá!  'ìòÐuãÿþ­ÜÓðŽ‹À™—v¶xW›™¶ÓcЄm¨ò9Ò^xZ²oÍ:Rಮý25µ¤Ê÷ùT›fÍú%!×2Šu¸é‰ÚõNÔç”Ç¢ó{œH€H Ä PÜ)ñ Àá“ xÀùʺh¬uä±ÍXÈ;.g]v°Å‹¸ÚÌ´›‡LŒÑ†Ý÷ز÷ ÿðÄž–´¹ánéîðú25µ¤Êwë·%áNÏžc‚¿•^}uŠßêþ+z 0ƒwpǯ3  (YwJÖõ8 €/Úµk뢱Ù%G½¸ˆw\ν|›¸ƒqµ©í |òÍ+»÷G˸ñ¯ýÛ†NÿfozqgÿZuB» (;ŠblðŠk…j3nÜkÁßM’vç¤&·>ôÜÇÿ»cy}T‡ Æ/5  (YwJÖõ8 €/ägÕãµ·ûÊg¼ã"p~›k…-^Ø·ÙçÁI«TÇí¨e¾yÚù­ñO3”ÿÄ›î^КŸ Ú‘_]ÏÖPëº>Ãü†£Ýppû!—`É /¿ªÍìÙ‹C¿›Ž=ö”¢ãšœ­oРAhE   ´ ¸“VÏr\$@$@Ñ ˜AŸaž|m1ï¸\Ðö:Á‹ömÞ5üiÏZ•¶ª9§·hSãà#¤Þ‘7õúç±ùµ†÷µî §žgo^pIrŒmÆe[¢Ú9÷‚læÍ[úè"/JŽ~~~×;†©£¡É†Vd  H+Š;iõ,ÇE$@$‘À²eËLi`äÔw&¿¹„w\.ºb›¸ƒömÞóðqŠ£–h1òß9¢ËͤÍ!ã^<é´æêÇÛïköåÙÞTeuím .9næº-[n‘:wðã3̧•¢‡¢c  ´ ¸“VÏr\$@$@ Ìš5Ë\.N›µ”wŒ.iw½àÅ ûfï9Õ³VåªÛ‚t:ôwkOߦïà…ù©»5¼£M]×ë^{ÃBKª ž†V/©'Ÿr$›M›~ }tÛ·Š’Œ{{Òk ̧uîܹ¡uY€H€H€RI€âN*ÝÊA‘ D'`žƒ¾{¥*Ï¿·ŒwŒZµß&îà…}³÷Þ&î8jíñ‡¸s÷°qîÖ´VÍÚG˜Ÿ:ZÃ?µn·•Ù[Zòä3Îéí?<áåÐò%^z n›G'jmwÄþ¾KÕwððÚTg  HŠ;éó)GD$@$‘#Gþ™Å£r•—>ø‚wŒZwè*xñ¾Ùac¦yÖÚcϽ¶H'{îå×”¨UûH³€Ù^K\7ö¾ÏޤВ§œ¹MÙ‰½åЮ‹±À ï,…^Ó´é­6OoïÞO pÿÁÓ1ÒCëÔÕ¶¬¬Ì¦:Ë @úPÜIŸO9"  ¬8Ä×ç®à#¶»ÉR/ì›1öYÏZU¶ê2ø¯_SRàÃŽ4 hk§6k!‚±·SK¢eUzÞq_„J­Ê”?^Ó¼y?›§wĈP¸ßÀgAé°#ê)ê^½zÙTg  HŠ;éó)GD$@$SÜ©T¹Ê[­ä#+;mwð¾ÙGÆ=' xG­ªh7~MyÐÖTðlÜÞ=3ãÈ;î™Dµ¹“Ù7K“ ¤“Åtú•£" ˆLÀwªVßçÅ–óŽ‘ÀåäÜÁ ûf‡ŽyFG-M©ã×”gm vï]†ºÍ[^!í#;½UŽ’hVÓ÷ ü3rS%Xñ™×!§Y³>6On¿~PøîÁÓÊ̹ÃmY6ôX†H€H •(î¤Ò­ @tÓ§O×=5+W~ú»ËxÇHàÒ?NË ûfÚvZ–£–œrUóÐ#üšò, ­sQ[­ˆFÄï¦ÕѦ¹`ýK°d¦§e ù*(røŸ •ûöíýÉgM  (fwŠÙ{´H€H ,X`¦bybƇϼ½”w\Z^¹í(t¼°o³ì‘m⎣Vå­âÎA‡á×”gÏÖî°ãÆ ­Ë$@$@$JwRéVŠH€H +¦¸3`ä3“Þ\Â;.]qàÅ û6û?<ųV¥*[$•9¯)Ï~­yA[é% AwGcgΓ^ptZsûA±¤ƒÀ)§ßÉfõêõ¡OoË–PräÔ¹há¯Ûm¯ì+¯¼Z—H€H€H •(î¤Ò­ @VªWß¶VÇ¢±}÷~ã_ûœw\Z´½V–âxaßfßá“=k‰ªRãà#üšò,à×Q™ÆÞ¼N=Olûç±íGÄ’nç\°E²Y´hUèÓ‹Ô<(ùÈ´œü¶)Å.[¶,´. @* PÜI¥[9(  ¬4kÖLWŒ‡þó¸Ç_þŒw\š·Þ&îT¬Rý€ƒëß÷Œž!ýÞñÀ$ñª›– ¼‰FüÌó,à×¹îŽaÒ*jïcG*¡ÃiÐô¼¸0¦² /¿’ÍìÙ‹CŸÞc½%á¶ÁOšâNhE   ´ ¸“VÏr\$@$@Ñ ˜faÓÇÀ'ßzôÅE¼c!pÎåט«ñà×·$â…”DuÓŒÝ÷¨†7÷¯UÇÏ6Ï~­I#Çr®ôЬvwJóÖöñi0ÈEÚÈå†d3mÚ{Áîºu›Pì¸=0Ì6]û*ÜEæY“H€H€ŠœÅ"w Í' È7î°Ãºh¼¸ó­#^XÈ;gµºf·=ªYÞ=O”NñBª ºi†¼yXýF~¶yðkMüô5ÏÑ»tm9–`;ca[ì\{Çd¨68æ<ø™~õÕy(vîÅ÷a¼ÇŸÚBŸSÜåàË€M’ @q ¸S~¢•$@$@y&Тş‹Æ½j:lú§¼I€rJ ÏÈ7¡Ú YrðÃ>bÄ (ÖæºÑ0¦ÊÞ5TÜ)++Ëó·»#  ä ¸“_Ð  À™Êæv›6= š6Ÿ7 @î”=ýñÑõ»A¸Ù´é§€ï9½ë€çLšc>¤<*+A_ 4…H€H ï(îä9;$ (›7o®X±¢.÷Ø»F¿ ³Lý„7 @î4»°,8ít¨W¿[ß'ç´½õSÜÁ3[ _-´‘H€H€rB€âNN°²Q  pïœ~y·~“çñ&È+o™í¦K—~_ H·Œg^PŽ8áLw4h‚ïH€H€" ¸+’ ¤Ÿ@íÚµuõø—¿nwÕ=OÞ1á#Þ$@9"pó¨w Ýà¤s‰åùýÝ®¼uâ­ãÞûË_·×Çsذaéÿ>âI€H€HÀŸÅÎ  ð%0kÖ,sßÇŽ;ïrõàg{ŸË›H Gθè>È7£F½ä~,-ZµeOÖÑ]o;ûÌö·™Ïæš5køEF$@$@¥L€âN){Ÿc' 'Ю];s ¹{µº~§Ç¸9¼I€rAàª{g@ÁiÚôVwðŽ„íœ×núÅ“¨f“&MŸd–   T ¸“j÷rp$@$@Y@–V¤ó0õÊû|Õݛ͛H Ù"N·n#ÍÇW²í l§Ëð·Îºf€ùHNž<9ë @q ¸SÜþ£õ$@$@y °qãÆ5j˜‹Éíÿ·Üy7>pÍè÷y“ ÄN Ý — â@Êé×o‚<௾:‰xðÎù×=Öéá·*칿>HŒ•‡/vA$@$@ '@q'á¢y$@$@‰ °lÙ²wÞÙÔwðºÞ¹WµþfÇ‘ïñ&ˆ—@‹îã!åÈþ¬æÍûÉëS/Œ^<æ4†í$âk‘F $‰Å$yƒ¶ $˜Àܹs«W¯îÐwþw§]^vs»‡ÞåM$/ {=}LÛDÖ©{t×fAûxÜÌga; þʤi$@$@y%@q'¯¸Ù @QÀþ,¤nuè;øçŽ»T:®ÕÍÞólëáïð&ˆ‘ÀÅýg^pǶ'«þEÝþû¯Ûé¸Ã;,X° ¨¿Rh< ÄE€âN\$Ù @©èÕ«—[ß‘wþQe¿Ã›µo|Í`Üçõ{æ’aoó&ÈžÀ‰ï­~ÄIŽçnäÈ‘¥ò¥Ãq’ @Š;a„ø9 ¸Ìš5Ëq„–ŸÜÃ÷I€rA K—.üf"  Pw8H€H€H "W^y)?r±pe›$@ÊÊÊ">´¬F$@$@)%@q'¥Žå°H€H€òE`úôéíÚµ«X±"Wã$@¹&€Cë ªæëáf?$@$@$P4(î«h( @ à8­îÝ»c»ò¼æz‰ËöI ÔÔ¨Q;kÖ¬Iø÷Í#  ‚ ¸Sìì”H€H ý6oÞŒ^é#зï°l~Ùe·¤oh‰ѲeËÒÿ•Á’ @(îdUI€H€H€JÀ´iïuÔu½{?QzCçˆI€H€H€J€âNBC³H€H€H€’I€âN2ýB«H€H€H ” PÜ)eïsì$@$@$@ ¸“12V   È1Š;9ÌæI€H€H€ÒE€âNºüÉÑ @PÜIƒ9   ¼ ¸“7ÔìˆH€H€HÀ’ÅKP,F$@$@$@[PÜá<   HŠ;Ióí!  H4Š;‰v#  ’$@q§$ÝÎA“ D%@q'*9Ö#  ÈŠ;¹"ËvI€H€H€RI€âN*ÝÊA‘ @QÈ@ÜY³fÍ+¼H€rL`Á‚EýBãI€H õ(î¤ÞÅ pqgذaMš4©X±âñ"È vØ¡Aƒeee›7o.ºïL$@©'@q'õ.æI€H€H è‰;sçέ[·n^³ì„HÀƒ@õêÕ§OŸ^t_+4˜H€ÒM€âNºýËÑ‘ @1ðwFŽÉÕ6 @ôêÕ«¿\h3 ¤•Å´z–ã"  â%à-î X kZÚ@$ ¨ïï—,-'HŠ;éó)GD$@$@ÅNÀCÜAºX¤ü0Õ;U¬v|›Þçö™ÔêY¼I€rJàÂ{g6êTVa¯Za ÁtÅþuCûI€H (î¤Ã ¤‰€SÜA×5j˜«ÊZ'µ¸lÈëm†¿Ã›H Z |Uz©Q7óI„äʃ´Òôå˱ /Š;Åë;ZN$@$@i%àwúöík®'kÔ?­ýÃïò&È5ËÌ<ùü{:ê:ÜÇ|Û9]Æ ÇãZÞ`>8·.­ßD Š;Eä,šJ$@$@%Bà?Ä5kÖ˜²ª\¯ó£ïñ&È5ËûM¯Ü¢ì{ì òâŒË‡¢ßƒžmê;ãÆ+‘ï&“H€K€âNb]CÃH€H€H d ü‡¸ÓªU+]Fþå¯Ûµê7áÚÑð&È)Î#Þ>¶áMPsÚ·ºiÓOø2²A$ž »=Ñùá·ÿ¶Ó.ú`b×dÉ~[qà$@$wâšA$@$@$ þwa;uÏhuÃã³y“ äšÀé-AÇiÙrÀ/¿ü¦OæÄ‰oãÍzGw½fø[gt¼Ó ÞAÊs~…‘ ÅÂg×$@$@$@žþwÊÊḚ̂ë~­ç¸9¼I€rJàêA/ÉV¬E‹V9Ñ.]Fà£óÚ€»W;@Ï-ZðëŒH€H €(î>»&  w*V¬¨«ÇÚ Î¸õÉy“ äšÀù‚‚SV6Åý|BîÙ¼Óí¦Ñï5ëÐ[O$ÆBœ¿ÑH€H€ E€âN¡È³_   ?Û"w°ÑÃÜ÷Ñ®ï˜>?â=ÓÛÜXíÀÃpã…}k×Ü?5B-¿öãmͯ—FvÊt˜ö@ÒZòÖÇ߇vƒ°uë6y>¢¼Ó¶çS·=ñÞ+§éÈ‘#ù¥F$@$P(w Ežý’ „ˆ;Ý»w×uãnUöºûéy¼c!ÐäâÎ/ìì<`|„Z~íÇÛšg/]‡NÛµrµL‡i$­%¯º}²äQö{>eýpÚyýA n“æú6kÖŒ_j$@$@…"@q§PäÙ/ @ˆ¸S»vm]7žxn›²©ŸðŽ…À©-¯°xaßàµ÷>¡–_ûñ¶æÙËÞ£Áö Š½äy— †v3jÔK~Ï'Ï’c³ú=9çòÍY›7oæ÷ @APÜ)vvJ$7nÄÎ^¼H€rL`úôéË–-³|ö·lËÂÃiîɺnÀØûŸÏ;§_²MÜÁ ûoþì>5Ç}^ûžöµüJv¸M*ÊÈË~ûŒyvêüÉE––c±c¿ÂÍòå_<®²3뺻Ÿ¹ûÉwÌçϹåCÎb$@$@ñ ¸/O¶F$P,°lĆêÕ«›¿”ò5 @® ì¼óÎ8TgÁ‚Áß[ÄÉ“'«5åÿ¾ëÓðŽ‹À™—v¶xW›™¶ÓcЄÙС×ÝöزK¯3S,/ϸ-[®N:©gð#:nÜk(vùÕ#að^5UÔ]ºt)–ßh' ¤ŒÅ”9”Ã!°!€5£yO®W³lŸHÀAçê@] ØÀ±EÜA$‘VûgƒSž±w\ξìa‹qµ™i;· ™» ÷>ñƱMÎÕi³_­:±w‘é0‹®üÍŸ‡jÓ­ÛÈàŸ¦³g/F±f-îÁ›¶¸B™7iÒÄæÇ0Ë ÄN€âNìHÙ @ ˜ F.¹I€ HË@?}g‹¸ƒ5î´WŒzq︜{ù6q/âjÓlçÆcÐ2î–nøä›ž]Ü6t’ø7.ú=úÂîìຎ½‹\°JZ›W\û(T›#^þYþË/¿¡Øq zÀþö7Ý«j5þKÍ# ´ ¸“VÏr\$@žpN«{)ûßÝn÷ýçM$SÿS~÷Óç÷gþ-⎙M¹Ý w}å3Þq8¿Íµâ ¼°o³Ïƒ“*V©ŽÛQëÈcáMüMµºº^›ž–†NxËÑZó³A;BÝÓÎomi¡6ˆîŒ™Z]X¶Y‚ÅZuÕ+„Ð_#š5냒#Ÿ›×wÄÓã¡Y€H€H (îä‚*Û$H&3ƒ‡ü"ºGͺgÞ4ú²fñ&ÈwO;¤É%‰§]»vîoŒ-âöniÑ>Ã&<õúbÞq¸ íuÂ/ìÛì7âiÏZ59ïã¿'œzž¨T¥ºÜêA¼óÂÇf_~­á}­ˆ32ïŸÇ5¾uàãZů û6K°d‹KB²Á®«ÐäÍ›÷Cɇ§Ìûâ|ó©M©Ú2 D @q'4V!(FÈ ìȳSïü.mG¼Ã›H .ìýÌy7>Õjà«èëÌÚîË™‹A¯Žo•ÿÂÁZf‰‘Sß™üæÞq¸èŠmâ^Ø·yÏÃÛ4µÜ*îˆ"ƒÿâÓG¦ÌB³ø¯v„š]ÐÖì˳5¼©ÊÎI§5··Í³¤ŸÁY6›îêç]8’Í¢E«BÒ·o?%‡<þ€ìV©Š>°82´. ÄN€âNìHÙ @2 às©xä™m;<òo \hÑcBý㶬,÷É-îm?âsnzÛ!õ‘ĹuŽä;ÿ…?þ›Oì´YKyÇHà’v× ^¼°oö¾‘S=ktèqWåªÕQÆÑ`»ënÓOÍÜ­á´ …¯ëu¯½a~%ý ξå·pò)·áA]½z}èÏòž=ÇlwƼ^WØqãÆ…Öe  Ø P܉)$H ¹sçšëÄ}ê4¸zÔû¼I€rM E×q¢é´l9 K—8^¯O8õöμۨ͟gaáñD¦só«ã¿ðÇó¡}á½e¼c$Ъý6q/웘Ø5iïü‡¸S±r•—>ø‚wŒZwè*èñ¾Ùac¦yÖªUûHy<[“{ì¹—ù©Ù^ãSiäÆÞ÷Ù›\ÒÏà¸ÚOe;"ÇÚü ljZ(ygÙ§jˆ;eee6ÕY†H€H ^wâåÉÖH€H`Íš5fbÖcι¢ûØÙ¼I€rMà¤ÓîÀÒ[7̯äi•ÅãU_¼¬ïX3:Çü{ÿagÇŸÂOå*¯Ï]Á;Fm;v¼xaß숱ÏzÖ:ä°-ÚM•=÷š<óÏÖ´€ù©¶vj³¨+-ã…½=¡%ý ­X²^xëó-âk³>6?ËGz …o¾ý)à:åŒm¹´áDGžMS,C$@$=Š;Ù3d $@ 'н{w]$îð·r7Žy÷æ'æò&È)Îe3±îkÚôÖuë69¾"Êʦà£Ó/ºpdC}2î9qŠ£–h7U÷Ü˯)ÏÚš©ð¹·7Ï]ÒÏàlÚLwÝg^žo/îÈ*â–;ž“¦gRÜIøïB4H ý(î¤ßÇ! ”6lô0ɪwêE½Ÿú7 @® œyñ}X÷a߆ûrϱÇÞ€O¯òÊe·>d.í‘KÊ;#w^›³‚wŒÚ^õGäÎUÝì›þø‘;ÿYëà­»®tã×”gmm[4ÐUÝ$~ÿ}lò«öV”ô38–ÆSÙÈóof¹Óóö§€âÄ“ÏÐ'™‘;¥ý{GO$P0w †ž“ ä…€#+k§OÞ9écÞÙh|Qç]*í‰/ì[»ªÿjùµokf/g´íQýÀÃÄTÜ5:±Mï‡í‡É’·ý ÞÑÝ à¸Ãvä¹—à ¯ÚBµÒ^5tUˆ8»mâŽùè"ç΋,ç#ËÿȹƒöÍóŒ¸ÊQKSêø5åY@[CƒÝ{—¡nó–WHû(ooU@I?ƒci<­àÉÄ£kóZrîô)›fΊ;6ôX†H€b'@q'v¤lH QÌÐ+ïU£ÿ”y¼c!Ðäâβ à û¯¾w|„Z~íÇÛšôÒê¦A»V®æØ&²m½Y÷Dû‘–xÉŽ·OÆ¢Çcù}Hæ†{TÓKº(ð5jlwfÍš¥ïþ­\ùéï.ã#Kÿ8- /ì›4jÛiYŽZ5·…޳®üšò, ­sQ[­(%qed˜_¿~Û¹KfzZVßAÏÒ!ÆQè<-+Q¿Ñ Ò!@q§t|Í‘’@i@]!6¹ Ã}ÏÌç S[^-`ñ¾ÁëÊžŒP˯ýx[C/ï|TgËÞŽ¡á>á¬Ë*ü!÷àMûÁ–rɳ.*ƒvƒß1¾väXô>½ÓuàDSM[¶ljýþÏ|wêÛKyÇH å•ÛŽBÇ ûfï}d›¸ã¨uÐVE¦rÕê~Myðl­ÏàmI¶ÑÚ°'^²·Í³¤ŸÁY6›îêO¹ OæêÕëCi@²t”¼ôR¥Ú>úÀRÜ EÇ$@$ wrA•m’ $„ÀÆÍåáu÷Žüܧ¼c!pú¥Û¢-ð¾Á?@yÜWßõ¨}-¿’Ý=%þÍȆ€~÷©y¸4XïäsÌb0[?Š«¯ì‡ŸäŽ®ß ‹>¿=Yòýл÷(Ó¹÷$ äþVNU9Fù¿pÊùôŽ™>wÒKxÇEà¢+®¼xaßfÿ‡¦xÖ:ð-âN¥*Õýšò,à×Ú™´•^PËÞ6Ï’~]dÙlº«Ÿwá<™‹­ ýAÞ¾ýP”üØ[²ó?*è;yòäк,@$@$;Š;±#eƒ$@É!€ß0õ·ÍòßõÁçðŽ‹@³VÛļˆ«ÍLÛéqÿño,6\Þ­Ÿ´vØÑ'¹-¹{ìë»í±e»þ›©¥VþΑoÙœ·3qâÛ(viLJÀçèFgé£Ú¬Y³-âþ·Ã;è»w {jükŸóŽ‹@‹¶× [¼°o³ïðm_©ŽZ5Þ&îø5åYÀ¯54(‚yîÞº°u©•¼¨õ`<™Ø9ú³¼yó~[²¦?=ç±™Ÿ˜Rì‚ Bë² @ì(îÄŽ” ’ $‡@ß¾}õÎÃëŸôÈÌ…¼ã"pöå×[¼ˆ«ÍLÛ¹eè¶í<±ØpxýF2¢¶Ýïö´d¿Zu¤À#ŸÏÔÔ’*ßýî©XñaÇFðW"PìÔfwÎ%Wߪªˆ¾EÜ17U^ճ챗?ãæ­·‰;«T?àà:Á÷=£gH¿·?0Iü„ê¦%¨Ž7Ñ”ŸyžüZC#×Þ1L:B›Ú{„±t¡µ©ÒªÃp<™3fÌ ýYÞ¬Y”|øÙy}†o é¯á”Êк,@$@$;Š;±#eƒ$@É!ТE ]1žvÁ•£_úŒw\ÎýcmˆµÙ{Ø$Üç}hÖº{Ô ¼‰ÿÊ›7Þ;¦ióÖûתƒ»Î1ÚÝØß³ TÿzÚ mÊmc!Ê£#ô;èÉ·<ËÃéβA›NSY¦u燱â7îµÐ¯œÉƒ \âq}T¯³MÜA ¾{j‹+}q︜ó‡:«„^Ü:t’ô‹R ÕMKäÙØ}j~æyðkM9î”s¥/Ô<êà."7›îŠíºnɤúoÚôŠáη Ñù£IÑCŸ  ˆ—Åxy²5 D¨[·®þÂÙúÚÞã^ýœw\Îo³íÿxaßæìêpÔ:`ë®üM5<õ<÷2¿¿¾ÏŽŽüZC±«nºGÁk{ J´‰ÿÆÒZй,Ã?ü?ôÌGÃ&½m:}K¾|•à\t}›åF¼°w\Îju vZÞ=O”~ñBª ºiÉaõÉû~æyðkMüô5ÏÑ=„à.ìÛ)©’7Ý÷@Êå¡Ó?åM$kw{×&iÖ¨Q/¡ØeW„=qŒ>½½zõÊÛÏxvD$@$` ¸Ãù@$VŽÃv†Oxíé·–ðŽ‹ÀÅWnwð¾ÍlËÌà¨%géÈ…×w «mâ5ÎD–N:­¹Ù—gk×ܲMÙA-¼¶·Í¯$ ¨{|cµ-ûSßÂÙÍûcÑ·|ùסß-rØÎ Ño€É5Ó9€“”·ˆ;ŽÓЯ½gì ióy“ äšÀ±Çßzz—.#P¦KŸ§Lšó×í¶×§÷•W^ }òY€H€H (îä‚*Û$HÇÂðÉ™=ûÎ2Þq¸¤ÝõòË<^Ø·9ðÑ©žµjºMÜÁ wkw 'µ ×˜Ÿº[»þÖ2-‰Oí s—3í]t§ºšm|ÆùÙ4X:uO>å¶Ð…¡|EÈièG¾ 8þç&ÊmâJ ‡._ÐaÀÔOx“ äšÀy—m90 Úùý,ÿå—ß1 eúŒ}ÿâ®ýõ!EÆ,fSNÂ/@´H 4 PÜ)M¿sÔ$P p«þ‰3Þ_Î;F—uè*xñ¾Ù!£Ÿñ¬U«ö‘ò~Çn½=[Û£ê^øÿ5?u´vCïmÊŠá#{«]QccÇ–È\fÚ½ky×äy“ äš@‡Þ“ðd"²Îï1ÆYZ[κ;¯?,©s™úè6hÐÀæÉg  \ ¸“ ªl“H nŠ;¯Ìþ‚wŒÚ\µMÜÁ ûf|lš8ÅQëà?ÄðlM TÙs/óS³µ·ß'-£Œ_#öv¢äso|Š6ÑTÙðñM›f¥}X’Q;%X‹>üQßæK`ĈPøöþOƒR“ÓÿL¤ý§¸ãxŒ¯ºçÉ;&|Ä›H §z=ö¾<ÆëÖmò|’‘nÚô|êÖqïýå¯îÉb›/>–!  ¸“#°l–H àÌUaÅÊUÞøpï \ѱ›ˆxaßìCcŸõ¬uÈaÛ´¿¦< hkò©Š;3Þ^`o’eIô¥úΗ^iY«‹=÷ÚB›d¬òý€Ó–Qøæ;ž¨SÎøSÜi׮ݶȪ^½ºz·nÓ‹zŸË›H ×θè><œeeSÜ?Ë‘O Õ;ºk÷GfÙþ6ó¯(Ø]ðŸý4€H€J–Å’u=N©'0}útý³Rå*o~¸‚wŒLqǾه qǬ¥Ú_Sž´5•uäÅigµ°7ɾäý׎ìk•ZÉ©/}b/îÈ/!·Üñ(55ÄV­Zý)îôíÛWŸä¿üu»n£ßé1no œè4hËaXÞq§FïÙs >:¯ÝPí ?“áóôÔÿ^Å’ $œÅ„;ˆæ‘ D&`Fîüc— %¸;&§CÎŶ,Ç®+ÓþàmY² û§4¸¦Ï½åbøÚ~,;¿raaÁÛœùîR{qG¶eÝÔûIǶ¬.]ºü)îàÜ;diU}§N“ »>6›7 @® œzAžÏÖ­™?†e倰NC_kvͶ³ åñœ @ Ô¨QCƒ×Ý1ô‰W?çm®¶xaßæÃ'{Öªqðq§b•ê~Myðk Hy\ O=ÏÒ¼[î{LgËU7Ý㨅wôÓ®}°l³4‹]rÅ0H6³g/}öeŸÇðÉsÊÔm¶$ÌrWFŽtss*ìT±Úq­{Ÿ}ÇÄK†½Í›H §ZÜ;ãÄŽ÷VØ«¦ù¬â57d…~Ó± ä‡Åüpf/$@!ФIý-´y›ëƼô︜×z›¸Sqê¡wïa“¤_¼ ºiÉþµêlwö¨îgžg¿ÖÐHÿQ3КôuÍíÃ,GÝ´yk0ÇŸr^{Ç  ü¯Í÷-[+Ùb—¶É¿`„>õM›ÞŠ’¾° ßÈçÍ#Ât<Ä47}útÇÂ’ÿ$( äÇ }ÎY€H€H ?(îä‡3{!(víÚé/½G5ÉÏ<Ï~­i#hPºkÖª‹ýÀ¯»{*î¶G5ܘ?òè(ì›*Í’·Ü?ªM—.#‚¿[pª2Šsñ} ÔüÊõQEÀ]¸ƒÏ°k«nݺ XÛÒ(Q`F—âß84 (FwŠÑk´™HÀ’€cÇ=O½;ä¹Oy“€%;{í†AOá¿–åYL”MúªÍI'õ ~N‡ yÅZ_7UªsŒ.’%À7rG6lt G–å]jsØ$Hz…ƒ±ðg윴ü1Ìb$@$@y#@q'o¨Ù @þ à÷O3ë…]ú |f>o \8¡ñ–d:ÁfÉQY]ïyî®'ÞùëvÛëÚy“­ÄýBY³f êð*"âì"2˜¦‚ÄÊÿ/1ì‘H€2"@q'#\,L$Ptš5k¦‹Æ#O<óž)óx“ äšÀÅpƒØ¿oŒM›~Bzõ»Ý9~öÅ×ß­)ÔX‰ Ü)º/#¬ÄßB$@$@$#Š;1ÂdS$@ $`f_-·ó®·¿ï¤y“ ä”Àu÷mI»ƒ“Îý¾ä×SÏë3=æÏSí°çCªpåŸÀ¯ÓØL¢¸J6D$@$@ ¸Ã¹@$nرa¦"¸ kYï§>äM$kÇÐòÍìÙ‹=¿aZ¶°%áÎMOvñâ_þú瞬¾}ûRÜI÷wòV鎑;éw2GH$@$owòMœý‘ 䀹3«úAGÜ2~.o \hyÝcoºué~â-Zµåônê9vöÉ—^oîÉ‚Kq'ïß‘yïâNÞ‘³C  ô ¸“~s„$Pò&Ožlï\Þwìcgó&È)ëF¼Uïè®qÞ~{ù%ôË/¿IØÎÅ]ï:jÖ.•«ëãÙ¢E -ÉmYiþ榸“fïrl$@$@"@q§@àÙ- @^ ˜Ç%W=°Îõc>àM$kçvx"NÓ¦·"}²>ðeeSðæ± oêòÐÛ /ºÖ^çÎKq'¯ßŒ…êŒâN¡È³_   ¸“bçrh$@Æz²Ì\CžÒ¾O—Qïó&È)μ{©·Kfe$ßY½z½(;¸/½}jÛAÏÿå¯ÛéƒY»vmó+‹‘;iþ§¸“fïrl$@$@"@q§@àÙ- @^ àpe3xçwÚå’»§\õÈ{¼I€rJ íÀWnÕwÌ»E÷ñètïÃ7%×Y³fQÜÉë×b;£¸S@øìšH€H ­(î¤Õ³ €ƒ€#óÎ.U÷o5hæ½Ã›H §Zyý´66hzû1 o:ùÂû.¼ýtwPƒ³Me§U«VŽ–‘;iþ§¸“fïrl$@$@"@q§@àÙ- @4iÒÄ\Oþ£ê~Íz޾üÁY¼I€òFàâ²™û}ªù$î¼óÎzH–~/PÜ)ÀWdÞº¤¸“7ÔìˆH€H tPÜ)_s¤$@7n¬Q£†¹ªÄëý=ëèKnjÜe0o œhpå]µNnù?åw1ŸÁvØaúôéîo'Š;iþƦ¸“fïrl$@$@"@q§@àÙ- @a,[¶¬zõ?^v=ü' @ž `¿¤çwÅÂ|Eæ§WŠ;ùáÌ^H€H€JŠÅ’r7K$ÐwÜñ;y^в; ÄìŒ9ÒïK‰âNš¿®)î¤Ù» @PÜ)xvK$PH8<«W¯^X[rM$PH€åγc~)PÜ)äWd®û¦¸“kÂlŸH€H  PÜ)A§sÈ$@B!<}ûömÑ¢y ²¼g§¥F bÅŠÐt «:N=÷üF¢¸“æ/jŠ;iö.ÇF$@$P w žÝ’ D' ‰“ ÏEo‚5“M€âN²ý“uw²ãÇÚ$@$@$àA€â§ @Ñ ¸St.ËÔ`Š;™+¦òwŠÉ[´•H€H HPÜ)GÑL  ? PÜIýl ¸“fSÜI³w96 /‹-:fë5xðàȄƌsýõ×K;gušZ½zuäÖB+¾òÊ+}úô‘îpá5FZ `gëÖ­µÚ±©…Ƶ;T·­;“PÆc °Ç¦|4E¸Ã$L‰ƒª]½ú‰½{?ac­”AïX_ßÿ½}ËÁ%cñ‘g!«"ÏsTÔç/`Œxf1·a³XŽ9oùGëÎÆ$Ï2èn¿­—ù)L ,=ÊT×±çú,òØY‘H Ï(îäxþ»£¸“æùë‘âNþX³' ¼À¢È­`E$_}XÛD°µ°ÊrçêÛ–ºCFN™2+OÏÔ€x?@âAEO;C—ß…çè‚Ì‘»³§!ðßà*Ñ„¥2Èx<ÓyqAÚ©Zõ˜ŒÄ?G{z?S«<¡aIï7I,ÕCiô¤‡aïÜÈó\´Z7"¼‰'=ÀÏyûá¾`M$Zwö(Ü%eF9f¾Ílñ$YÐoª=›!°. @± ¸S,žŠl'ÅÈ芠"Å"pM$ˆD@D ·¸c XJDŒ¹<•2 ô]µjwfxÓsý†¥²»¢Ú`¤®=Gç§ïDîΞ†’&ÍAªMˆ<¡RÊÐ^¶3Q$\ÜQʵN¿©åé2sÚØûTKFžçžŽ³‚9v{wGî.³ŠŒÈ@ç©Ê9D.÷—´0“ûÌ~ªg9(V'H&Š;ÉôKŒVQ܉f⚢¸“8—Ð  ˜È&FqÇ\‚:Z²oB¾QãZ™+IG›f˜‰{€øË¼cÚ‰Zº÷4± 23÷§ yͺ:"wgïgS² w";H7Ýj³ÓÇD!rœá‚€K9x:ž'Jbh*8&³¥Ž¦Ýé´‰¹yžÃuœc>AÇŒæFEÓÝž[£u—‘_Ü…•ù虡RƽwÏü0?5#ïl¦z–ƒbu Ä ¸“X×ÄeŸH&±Š;Iô m"ˆƒ@ì⎮‹<?ú'qôk™¹#x”º@õS‹üìÑŠž;w´–C¦1—‹î5¡ê;î]]Ѻ³ô°{ÓMØQFÒ¥¾gËÁŸ:F!(TYË4r'˜‰©YæN hPuŠ`#tØ3„$¶¬Èó\µ<φڬ{€ú¸1êp܉ÜåT÷+&žÃžhá‡*ÃyÓg<ÞðÃ,‡Ïê$@y&@q'ÏÀóßÅü3Ï_wòÇš=‘ ä—@¼âT^ñGÀz2ÂÐ5‰‰ŸTä·Ú Î~¢µš‘.íü’¹È’Ø-]EëΈ™E7£ù­<#;(Ôk¡Ž±(ÀÈ9w‚™¨“}¶Ð9~“Äm¡Ì ÙÝ-r'¯ßák¼éxdc…c«ˆ”æŽI^c–Ūç^Yöü©ÜOÜ‘ÓÏHwÈ…áWØsÑk#0y.zC×®ž:Näî0(!ËS SmN ø©uÊ'²ƒ‚ÝJÕ5€Åœ`~âN¦óÁ ´ >ÄÊŒuÒ”:~„FmF!ùÓÔÑò°„Š;âk\í Ú<·‘Ÿh,@$P¼(î¯ï,-§¸c ª(‹QÜ)J·Ñh(%æÙÒXºèÊ/ÌÃÜ+]ÿÈêE×<õk ÆA]ÿ;VA¡ÈÍ#x…3]̇öe®®ñ5nÙ&¸ÃmltIi.D£uç#,u´,ÅùWPèÚoͬÍê~½xÅÓlw¢kµÜ|LQÌ<Ɇ3ºSŸìßq+9wüÒHÛ„ŒyÎjqÇ=«#w—¥¸#–8§ã‚ƒÜñŒ(7ÝÓÕá SÚÑÇióEÄ2$@)#@q'eu‡âNš]Lq'ÍÞåØH 4 Æóàž€Sœü´SÜñ\¾êÒ.ô¨ °Ör'åÁÕ!0eï¿ÃžCS瘫M]4zn¹ré^GëNZÆúS°h¦ YŠ;rŒ«\Ö‰‡×¡ æ†,i'TÜÉh>ØäQ6 ·©x'TÑÀL0‡Œò¹¥ô¡3Pq'Zˆß<÷Üråðc.ÄÏ ›¿;‚¤‚Ý€Åótô¥ü5tѨ…w3AçÞ×gÁÞ讕ý7[ (.wŠË_¬¥¸ZÑT¡¸S4®¢¡$P’‚$ºhq$ß wPÀSV°ù+½ÃºXÊhóKd—šaŽ?ч®±Ñi@äNpp‡Ÿ¸ã·©D§'™lÄ{9»ðS´ý-éÙç¦BÅ{¿Û†Ö‚O£×è7Çj%ýT ˜$Žp£6Ï~àR2`žë¤ ÐÝÄàç4 r'Óî2²Y^¾ýÜ—b/˜ß{¨¢¢¤ãûM^õŠ´_ë‚Ô² ë’  Š;Åâ©ÈvR܉Œ®*RÜ)'ÑD(aÁÇ =yÚ± wüxº&´ÙÆò¼.2—vîØ"›5v©‰;9âæ•®“ñ³ÒÉ¢ývÍdZV¨j#€Ÿ¾©ß<ðE"C–Ô-Á!K:Á¨ÍÄËè›,xž—‚¸#ß~îdOš‰Ü3´Pµ“ÖœÌp–[×ÖÇ$ ½TFda b$@q§½–‘Íw2ÂUd…)î™Ãh. ”]µb!­û/t“‚#” TÜñK)’‘¸c ÁëçX\¼âU¥)ÓPË!cäN–2·À˜ê¡n™q¯„cŒÜ UmâN,s Có tR!Õ¯¸:ÏKAÜïûmu*š®×€Gó{À/¢G+š‡²4Ëc#$@‰%@q'±®‰Ë0Š;q‘Lb;w’èÚD$ðó¯ÍŽôî:"qBÅ¿ÀK¥ÃL]‘Ÿ\fòT¿%Ÿ{G‰{6%$¡r¦Ó<ÓmYq9Hõs©ìyöŒ(.q' Ÿ”‰ÎsóQ¦lÝåu"éLs§Ž6kÅ(îØÌs›½~¹È¹Í¯#dG¦\4E¿9uà¾'[5µ€ÔBÙO-¶@$dw’ìXl£¸ Æ„6Bq'¡Ž¡Y$@[ $VÜ1!²6ÚÌÞÉX¡™(~™SÐ`F⎮Û-×¥~‘;Áç[ë:<£Õn8‰;ñ:Hç¡gid"YÜeúi¥JG´kw' ø´<ÜòŠgyKßÙO6)©Ò’j¦*ß`ú¹G­ŸêG™öˆòöó<#qÇ”3ÜsØOØ2…•ÈÝE€ U¤ÇÈ9¼Üß:‡C›aF+’ Š;Eá¦lŒ¤¸“ ½¤×¥¸“tÑ>(mºóÛ“e¾ïXBç.rGWïž1b÷˜™Dk¶àÍ_gÔ0O(T:ñ"wR¨…ÚfìrÓ5ph4™ˆ¶D·‘!0ä‰;îf3RZƒõ>?•*8ÝY+8ŒÈÔGG‰ÛD¹ÉGî.Â<—*bgÀ™eÁ-»ŸñŒd_Ëtc‘GÇŠ$@‰%@q'±®‰Ë0Š;q‘Lb;w’èÚD$ðËœ#žÀr$î˜ÂAÀ‡¸|èPvB›Õ€‹€å™§j*%˜á*jFäîBâ.`)îdê «à}(ùwlΉSD¡¾ HË#™.ÚǨBŠò,îd:Ïõ±áL7™‘nºçËO$ÕÔ3fË‘»‹0Ï¥ŠøÔ3F–ãýàëÞ–e³åŠ‘;‘ýÅŠ$wRãJ¿PÜI³‹)î¤Ù» ?›)²Îqo~É…¸c yHKa®x-…¤ÐU¨™6Õœ ¡‹^]šÛ:"wanÚˆ;d£Œ8¶eÉáS~W,Û²ü΀ Ð1ò³Hà È,Ò5|@`ˆŽB5Žàè¹l¶eE˜ç*`P~sÉS•#uàž Ú3í.£Å$PJ܉?Ü£WU"Ó£Ð3M¨¬[3ް‰Ñ9PTS°Tv¤w]f{fòûã¼ßšVGä'‚Dë.¨Pq'šƒT@ô›ÚlÀrÚŽ.¿³9 ÝfvzbºcÑn#ø=V~޳ÙîäY7ò<V"ÔkŽãÌ<sLÃtàŽ¨™hÝE˜ç¨"}ùI®_ ~¹·TôÓ§ür„ÙÑFÄZ$@ÅB€âN±x*²w"£+‚ŠwŠÀI4‘J›@°Àáy’‘ó[¨èÊ6Sq'Tðs”zd”XW“~k<¿î1 ‘ðŒòPÔÈFìh\qÇzDî4$|læx¨¸ÍAæ¹Ñî­:fP‰e"’PqÇf>d´Ì6#5†`ŠSÊÊS7Tw[êY¦¤èçJ üñ›Z™ÎsóœÌ:@÷dVùÆ=™ÝñJjmäî‚Ýí‰E¼ï¨ÞñÜ’fÎg‡ˆ£¢gEm6#)ÙæÉe ""@q§ˆœÍTŠ;ѸG-Š;Åá'ZI%Lk3M[‹U™þ±k-]x†Ò¨TZfR•hâŽJ’7ør¬Ê4XÆ>±®®$mºs/Æte‹J «>eâ©S(jÓ&g¿¥~´î2Õb‚Ål¤«}tan:C›JÌÞw¡âNè|0uËG_×íâ;]Õ›C0‡fF9aþ¨ìˆæIäneÄÏžÐÈÇÖ6i'ËynŽÚ<²]§–§`¤Z.Œ]Xá¿fžlÏ ˜hݸÛ3„*ôtÓ~óÇûj¡_t¡ç£j:n²[-g&‹‘ Š;Åå¯ÖR܉­hªPÜ)WÑP(a¦*!É&t¡(_bž©CLéÇLQMÜÑE‘*M/ÒIèbÞí[s‘Ú£[wÀjÍDä ð—yš£þé—ƒ6ZwñŠ;Ù8üÍê2p ½²ƒ¦²w´…Œúuû΂g”JÀ$qè\¡_?ÑÄ,ç¹§ãôy  g~¥¸ÝpX¸{ž„v—©¸#2epÌ”P¦_‰¦7¢Ì†ðŒ‡N HŠ;éðcÀ((î¤ÙÅwÒì]ŽRD@þ¶ìÐtðOó×îáb¹«Ut±$ë" pð$äY@W€6/ÜâŽÔ²ßx"ƒµ¼<›ÅŸßÍákÖÐ<ÐÖp%b¹_ža¡;£åv§`†–¬\3L–͡ijHæOåÊUýrîHGóA¤\™nAE·È…wüpü«Pw»õ¦ß·Ž:È”³ŸçèÎí8ôzˆ¸ç؃¿Odh™vànýªÁÊM<êz<ž¸Þèç Ï!hSŠ~np($@ ¸“1²b«@q§Ø<–‰½w2¡Å²$@…'€åV°r®QE¦råÊ|ðˆ;8K²,|ðÁ£G6Åè;óæÍ{ê©§Ž<òH©{ÄG<óÌ3«V­ºõÖ[Ë—/ï–xš4i²`Á‚ø¬ÎmKßÿ}Ÿ |äZ´hQ¨Hf$Í A³°¼9xðàÐÌ~­7¢cÉ´»ŒlËQa?ã1a˜£~ Ò¬ Ê1U b ;%ô ¸“>Ÿ:FDq'Í.¦¸“fïrl$@$@ñ0wT]xá…*îàT,äQÞm·ÝäG*Ô™—^zI"wDÜÁhàÀ{챇”9ÿüóæ§mÛ¶n}ç©#¹OQ$â·ýîwöÛo¿Ö­[¯^½ÚÏX«K-4h–AE¼yÌ1ÇdäF¿Ö‚ѱdÚ]F¶å¨°Ÿñ cŽúͨÙX4&ŒTf…cªdd “ ø ¸“ú¹Aq'Í.¦¸“fïrl$@$@1€ÔÍEe ìÃRqç»ï¾C'÷ß¿~ŠÄÉíÚµ{ÿý÷Mqú2+wèÐAÒ*ï´ÓN=zôÀV¯™3g}ôÑnA¤bŊÆ ‹Éü\5c)îÈè°&3fŒ§)w²ôPÂÅÄRAfŠEc¹ŠâN–†ÕI€âNÉΊ;iv=Å4{—c# ˆ‰bsTAšä·ß~[Äàükëuæ™g¢À-Ûâ–’»îºëÝwß­‘;wpf®×_½iÓ¦RfÏ=÷|ä‘GÒ‚ÿV­ZÕ-ñÔ®] ã˜3ª)`Ýî¹=ëú믗U½ÍSßA]”ÁÅÈhNòwÎ:ë,­Ù¸jÅ@„}XªìP܉Ë5l‡¹“ú)Aq'Í.¦¸“fïrl$@$@1hÕª•Ê7–l2wpzÀ²SÆz|âŒ÷ç¯zjÚkõŽi(å9äÇÊŽŠ;Ÿn½žxâ‰C=TÊÔ¯_ÿÅ_\¾|9by<ñ4kÖlÍš51 %ÎfLq' ]¤Ý1—åör·eYz+á{ʲw0gL‰âŽåÄ`1È”ÅL‰]yŠ;Eç² ¦¸“,% (UØ$¥âN¯^½TÜY·nàä,|Zyª|ºZïAï¾÷¶S±N9圃.‘;"î á® ÀGZ¾ôÒK!‚ Y¤w6…¡ßÍ›7'Ê–âŽØ¬úŽ}RŠ;–îN·¸ƒø/}"TâaÎ˹Áb$Š;á*ÆÂwŠÑk¶6Sܱ%År$@$@¥J`Ö¬Y¦ÚòüóÏ«¸ó믿‚ 2é À¹ç_2ûÓÕŽûºî·•+·åT,¤ÚA1¤Ý1Å… ¾÷Þ{W\q…&âéÝ»÷W_}õì³ÏÖ©SÇ-ñ@c7n\rü‘¸éJWæ–Á;nq„žÀå™ÁG\€Î^‘¦lN3» 5 À6lÜ îÔÞxÏ^„j4¹Ä†FäÈ)S¦˜;²õOž‹hÖ&çÙ¡%$Lw’é—­¢¸#ÌÄ5Eq'q.¡A$@$@ #€ÕYpÞ92%Ë‚Ò ,E4Í€ƒ‡³`û~í½E^òg"´¦‘;h–Ö/¿üòI'$½`5;vìXH<<ð€Âe =uëÖ…Þ”H‰;0gfÉ@ Æ´‡[cýË¡˜˜âŽäå1#8КçyØæú JÞe‹^ ¸é…ê#ÈäÈ$§€yÚ ;ÑdDhY£–Pq(ö¾ÓlDæÀÝÇNùóеƒ¶öÍTýøˆûð)þ‹×°2o݆¡kš0ñ³ÇE]‰Z"RܱŸ<,IP܉­¸ªPÜ).ef-ÅÌx±4 @é@Vc]ZãðrwäloüŸn·ýöï|´|ÎÂ5~÷¤çÞ8úØm‰xjÔ¨1jÔ(lËRqKåÏ>û òÁ(}xâ‰o¾ù&ÎY‡ q=Ž r<O¦âÖç*²˜ó(ô´,U…Ü9˜Íõ?4#G¢­. …y‹;fÎ ´5w²wמ”) ¹½ïÂüŒ™Ádóƒƒî<”Öð߀ºŽ=wž]Ø'xÆÄîÅÒûæˆóJ€âN^q¢3Š;… ž¯>)îä‹4û! (J8­Ü\Z#;²Š;?ýô†tÛm·¡@ÓNùpÑW¡÷‡ÆîõG"È7/½ô’DƒëóÏ?Çά *H§;wÆ›Xº#k{…¿óÎ;÷íÛ·€‰x2w€KVûø¯Hcr‹;ªAç’˜) ¢Ñ÷ͦÌÖ4ð奢™½ÅA î˜Ù‚ ISPm¢68bŽÌÖd¼´‚6[Ò ¤²ji§æÀM%Sqí˜:L’A™áQn}G¥"± ðø¯¢Àû°Öô¬¶)¡=rY~¸£¢(îX¢c1ˆF€âN4nET‹âN9+cS)îdŒŒH€H€J‰ÀÈ‘#u\©R%(;"î|üñÇÀðûï¿}ôÑ(лïÀPeG tíÑ{×]wC-„ä á4Åè;HÍsÙe—I¿»ï¾{ÿþý×®]‹ãØkÕªå–xð»8>*ˆO"‹;êÚ‹;ž:*(8d]ÿ{F `O–§*䧨äˆIãU%q|ª­I¨‹ÊOÊÏk©äÙ©ŠMÒ’‘¸T9rŸLož8îØ¿f†/¹+Ø@”é¼¥¸“)1–'ŒPÜÉW1¦¸SŒ^³µ™âŽ-)–# (IæÙUgŸ}¶Š;_|ñx¬Zµj»í¶ÃÓé¯|ðÑg_Ûßo~ðÙåWv–ýV80ëÖ[oÕȈ;‹·^3fÌ8î¸ãä'5rý<ýôÓß|ó „ÏD< 4À>¯<»(oâŽg¬‡†·8¶ùèúï'å1ƒwüôÏP#“³jLfHŽ)îØ„ê8Ü©înSé'#qGå*¿ bîöÅ<wü*ªÙŽáPÜÉóƒÉîH 2Š;‘ÑKEŠ;Åâ©(vR܉BuH€H€Jƒv<á r –°¢âÎwß}ÈyŒOkXëãÏ¿Žp?ÿê'4Ú¶ß Ùv eGÅ%[/„í³Ï>bCÓ¦MÔÝçꫯv‡ðà.]ºlܸ1oÎɸ¢E£E<Ó²ø¥.ÖгeO}Dsåx–‰@F½¦ÚJ@âaX²%Jje$î„ÊUhгŒŠ;~rż=zìˆrD€âNŽÀ&§YŠ;ÉñEü–P܉Ÿ)[$ H éÓ§«†‚d8q Ë¿¶^çw ´ï|ý¼Å_G¾y|2ä!é¨Q£F¯¾úªD³tëuóÍ7—/¿åHuˆMݺuCÄÌBַăD äšÅ\.xûw î‚@q'‡pÙ4 @‘_såêÞ½»Š;PU02äÄÁûPdæ/YËýÎÜÏÛ´Û–ˆq:={öÔȈ;¸–/_þÜsÏÕ­[WL:âˆ#^xá…õë×c¾ÓN;¹£xš4i‚Z¹sB¦â">Ü:Ì >-+@É›¸ãfë~'.qÇ-<…z0š¸c3(Š;¡ðY€ÒD€âNš¼é9Š;iv1Å4{—c# È‚ÀܹsÍÕ/NRqç×_EÃ:t@³ÎmñéÒob¼g¾>çÄÆM¥kdÛAÎlËRqúr9>¼J•*Riž‘J—°ešm\¥r”ˆ'Sq‡d©¸ƒè!=Æ;à…N7%!r'?âŽy0yÀˆÜÛ²B¢¹“Å÷ «’@"PÜI„riÅ\Ò-tÛw íöO$@$P}ûöU•dÿý÷‡²#âΧŸ~ ‹ùåœ`…ƒµ`Ù7±ß£Æ=]ã m‰xŽ?þø_|Q"wDÜÁ…¼ËPmä¼-„íÜrË-kÖ¬yíµ×ÌóªÕþŠ+6,vЙŠ;j›c§UpäN@ÎÍ=l&<¶É¹£2„žMîüšBØi6⎞få>n<´;+·Úâãc37¸-ˆË@Q ¸SÔî³1žâŽ ¥b-Cq§X=G»I€H€rL‡‹«8Ò¦MwÌ=Ï›7ŸB[ùh᪅ËÖåè0h„$âÁuùå—üñÇ*î¬Øz!5Ïgœ!öÜsOÈ6lÀñÚ½é¦víÚHÃ#¶ŒÄb`˜##odqGuÄ鸴µ€3È-*kSyЯ;9N6âŽÆ7tм<Ô§ì·e¡°ß™VæÄ€ƒTöÒ÷)îÄøì°)H&Š;ÉôKŒVQ܉f⚢¸“8—Ð   À>&SAØ‹Š;?þø# ”¸žÖ­¿hùºœÞ/ZÕ±K7‰ÐA"DèH䎈;+·^S§N=üðÃÅ`¬À_ýõ¯¾úªW¯^RËqµhÑ1>±0ÎHÜÑ(÷RÁâÄ·Ð ö{žØ­­ù_|x¹ü¢‚TÀ^$iM¤¥š¸ã—™Èt™C ÉHÜQG˜Š˜c>h®enËŠåIa#$P,(î‹§"ÛIq'2º"¨Hq§œDI€H€òN™nT)W®Ü»ï¾+âbg`Ëï¿ÿÞ°aC¸ñæ; ì|öÅú\ßo}°àÔ3ΓˆgÔ¨Q¦¸óåÖkèС»íög˜b|  #[ßA"H?›7oÎ’«¥¸ùÃbî&CS™2[sè YŠ;f§Ž”ÌÊÊ hÊHÜ1Å#4âÈìcJcge¹-KœSíx·Ÿ*ÙLcÖ%PwR?(î¤ÙÅwÒì]ŽH€H *wÞYÕ;î¸CÅh%hš>Ý{Ÿý,Û²'ëqgÃç+òq— ~¨Â‰xZ¶l‰´;*î@ßúkqºØTÐ&L€Ù?üðî»ïî–xp°:΋ÆI5w³îw ø%Á w è.$4âŒÜY‡¥5TAE1CöL™2“;Is@¦a uѦ­¹7Že)îÀÁ:D«LÅ´o&Þ>ŽA¹3þDw4‹Î ‡g?ý¹cÏŠ%I Š; WŠ;Åå¯Ì¬¥¸“/–& (fÜÄvÛm‡“ªDÜÁú_ÿú\tÑEøÚ¶ÝÕ¦¸³xņ%+ótºxMçknÐD<7Þxã’%K ìˆ¸ƒ Yu&NœX«Ö¶ó¶5j„s¾¾þúëk®¹{²ÜÊK»ví"$â w$u DàƒŸ‚Å|ŠŽL1Bì÷S‹Tܧ P8B‡ðOÏDÅÁÇH™A:&=‘Ì"y>²wÐgÜ£–;‚_"ˆ;žpT ó °Š,î /Ýh&]DÞ¡¸S_Àb! PÜ)$ý¼ôMq'/˜ Ô Åg·$@$@É%€#ÆuDÅPvDÜÁéã0zÓ¦M•+WFGÇ>í!î|¹aI¾îwæ.<íÌm)uªV­ŠØSÜXƒ´ÊýúõÓD<×^{-2õàœ/l4së;VÂ6®LñÈ.¿Ë/²Ã÷G™Î{ŒTìÇ0pOãa°'XÓ¥Ü>ª„¶\–ÈÞ=ô‹ßTÉ”*Ë“ x ¸“ú‰Aq'Í.¦¸“fïrl$@$@‘Ô¨QCµ.]º¨¸óÍ7ß =‰ë)W~§O—~ãw–~¹q骼ÞÓf¼^·Þ1bp½zõpT–Dƒë³Ï>»âŠ+¤vf•••AŸzöÙg9ä·ÄS­ZµÉ“'GÂÆJ$@$@ÅM€âNqûÏÂzŠ;жÅ¢u ' È eË–™’ÇøñãUÜùõ×_Ñ%ähzÚY~âβUó?øðcUªî)–·mÛ1*î`7®·Þzë„Nuž{î9AÜwß};í´“[â9ùä“,X¾l”H€H ©(î$Õ3±ÙEq'6” lˆâNB“H€H€ H-*vTªTéwÞqçÓO?…U?ÿüs:uP ÏÝ÷ˆ;ËW›ÿ{Ѳ¯º\×}ûí·¤Ô)_¾<6dI䎈;k·^Ъ4Íé§Ÿ>þ|$c¾êª«ÜúÞ¹úê«7nÜX@_°k  | ¸“OÚé‹âNA°ç©SŠ;yÍnH€H€Š„ŽW¥¢«¸ƒt6"bbÞ™»8XÜùbÍ·¹?øhÑÉMN•! ¡ò¤I“Lq;Ëpáü/ ØArå=z¬[·Gn!é²[âA"ž{ï½·H\G3I€H€²"@q'+|ÅP™âN1x)ªw¢’c=  @:aó0©¡C‡ª¸óã?bÀ ÀÎ#ª?É7¡âΊ¯¾+Ô=~Ò³5k,?å›5k†$ʹ#âÔ"]vÙeR‰x}ôÑ~øÙvptº[â9à€§ppH$@$P’(î¤ÞíwÒìbŠ;iö.ÇF$@$!¨*mì¸ãŽHN,â·~ˆ–~ÿýwleB.]{ZŠ;+¿ú®€w¯Þ}ËoÐÁ¡é={ö\¹r¥Š;ÐwÖ¯_ÿꫯ֯__†üÏþ 4¬Þ½{{&â9óÌ3‘(C¢,N$@$P4(î«¢Jq'*¹b¨Gq§¼DI€H€òD U«V*î`›”wDÔ€R®\9xfÆ[öâΗ_o*àýég+[^ÚZ…ãÒG%‘;æ5zôè=÷Ü–Œù¼óÎ[ºõjÓ¦;„aM8'ž‰xò4Ù ä—Åüò.@ow =o]RÜÉjvD$@$|+VTE¡.*î|ûí·0~ìØ±ø´r•ªŸ,Y›‘¸³jí¦ÂÞ3^~óð:GÊÐpfÖ¬Y³ú2 Ý|óÍðAäÙ¹ýöÛ7lØ€áwÜqn‰”† –|oÒB  ŒPÜÉW1¦¸SŒ^³µ™âŽ-)–# H;H¦1mÚ4wÞÿýýë_½Äõ´¼ìÊâÎêo¾/ø=løÈÝvÛ]Æxå•W.^¼Xvié…óÎ:ë,)P­Zµ'Ÿ|ò§Ÿ~Â[xí–xêÖ­ biŸ ”Š;©w6Å4»˜âNš½Ë±‘ dB W¯^*aàœ)("î|öÙghæûï¿—ßz‡=òD4qgÍ7ßü^þå7®¾VŽKßm·Ýú÷ïïÐwðÏéÓ§qÄ‚âøãÇ®4ìú馛ÌTÓ Š­Y³&Ì,K$@$Pwê˜øÌ¢¸ËäµDq'y>¡E$@$@…!P»vmÕ,Z·n­âô•ŸbãÒóWFwÖ}ÿÕº’p¿7g~ö|jŽ[â>|8ÔrÅW,ßz!#;„¢t14V·±W  ˜P܉ dr›¡¸“\ßdoÅì²  @ø‰)[ ǰŠ;¿þú+xË-· À N™·xmtqgý_ü^÷ˆ°Gì±'&í»ß¶ƒÏ±ë“O>‘ãÒõÂéZ]»vÕD<÷ÜsÏÏ?ÿŒÄp®–[âA"žqãÆ¥`&p$@$P²(î¤ÞõwÒìbŠ;iö.ÇF$@$`M`äÈ‘*XTªT ÊŽˆ;<ÐDzõê¡Àíýf)î|½á‡µ…»¿†´ô‡¸ƒÏKV¬í~Ó­åËo9.ÇŸËqé‰göìÙ§œrŠÀ©Q£Æ3Ï<#FŒØ}÷mé{L¡§Aƒsçε¦Î‚$@$@ "@q'AÎÈ)wrÃ5­RÜI†h @ 4kÖLEŠSO=UÅ/¿ü–­X±b»í¶C—ßž‡¸óãÚ …¹âÎh_ñÕw|´èÜó/”áã¸tà|íº&OžŒohIÁâβU—®Úx{ß*lˣܩS§E‹}õŸÞÁû‚ yv† ‚œD3gÎ<ôÐCݶq­òW Ù²9æ˜W^y%]&¾'‡¼KÀ²zõêÄKI€rE€âN®È&¦]Š;‰qE ¡¸“¨l’H€H È`‘ uëÖ}ûí·EÜYºt)F²aÆ]vÙžœòR¼âÎúï~ÊǽUE²w–|¹aÎüe­Zo‚8:ôüq=ˆîh8eìÅ_üí·ß €€·ÄÓ¤I“ $dNHTŒ„Ø`t´)S¦äÍÎ>}ú€ $ž¼õÈŽH€’F€âNÒ<»=wbGš )î$È4…H€H @ä×Y¹GFÅ7Â"¤Æû»îºÛGŸ}¯¸³á»Ÿ6|·9×÷ú ÅÅ+7|¾býó/¿sìñ' “:uêL›6 itר±c÷Ýw_)sæ™g.^¼Gªc»–[ßÁ;]ºtž¼–²ß~ûÁ˜ä‡í\ýõ0‚K>q è_ùì”}‘ $‡Åäø"G–PÜÉØD4Kq'n $@$@…#€ SŒ˜8q¢ˆ;ï¾û.6dÁ®+¯¼Î8ûü\ˆ;7mÎé å(š¸óÙë-_7xøè=ªT>çŸþG}ä–xz÷î]¾|y@Þ¢n¸á‡~ÀcHºì–x×SVVV8WÿÂRŠ"8åƒ>zywÆŒƒN!ñ`—VÝÄ®I€ E€âN¡Èç­_Š;yC]€Ž(î:»$ HäýUËZ(;"î`S ÌÄ*WN‰*22GâηßoþöûŸsqC6ÊRÜY¸|݇ ¿¼êê®Ûo¿= @ÄéÑ£ÇòåËX]rÉ%‚‰xÑóûï¿?ûì³È¹ã–x°« 3èTŒ)HïMùB‰;0R‚w–(#ƒY˜H (î¤Ã£ ¸“fSÜI³w96    4P¢eË–*î¬]»µ‘SŸn·ýöï~üEîÄï¾ÿù»b¾¡Å"î,XöͧK¿yíONltŠ€ÂV¬Ç[œÒ*}ôÑR©‹Þzë-œ5vçwz&âÁÙóË–-³ðOlEŠ%l. ¸#™w ñ0³rl3 ‘@ñ ¸S<¾Šh)ÅˆàŠ¢Å¢p$ Èd1CKmDÅ…No¿ýv8úØ>\ôUNÅM?ü¼é‡_âº!Å+îÌ_²ö“Åkylr·Ä1ájذ!v®¹%žGy¤jÕm;¹Z´h±jë%[Û¶quïÞ=?‰x4l;Bç‘ ¯èQ—„wÅ~e$îˆ%Á»- #ƒwbw($b!@q§X<ÙNŠ;‘ÑAEŠ;Eà$šH$@$3#GŽTÅaÇwD°‰ˆ;óæÍCŸ?ÿüóñÇ7ÝÚ/âÎ÷?þ˽éÇ_r$îÌû|KJé®=z—+¿°`¯VÇŽ‘´H½pÊØ7Þ¨‰x¼óÓO?Í™3Ç ’RìØÆ%GÎçô’°Èž½È)à’HXJJa÷ÑQlÁû"h1lbòŒsAƒhV[vwí. ïhã~-@®‚yKðŽŸÞd?Æ`V9u'(,Š;…埇Þ)îärÁº ¸S0ôì˜H€H Zµj¥«ô¦M›ª¸³råJX·bÅŠí¶Ûž}éýüˆ;?üôK–7ä¡\‹;}öÕï/:·Å¶$;8.}èС}ÿ„dƒ#´/’ïÈ&¬qãÆAÍq„ðà\ÏAüÎù–O!ܨ²£ÚІÐè,îø#-éŽ ’-NÒ²çÝôGGŽ 'ed z·£)§Å㲉rʵãØ> @> PÜÉ'í‚ôEq§ ØóÔ)ÅHÇ£â²/çÔóª†ø%¦QM/<ÏÒRÊŽÛTSmÉRÜ‘ê9w  7˜êÞ‘±¸3"‡ŽÑ´\É©_Ø8 @ÒPÜIšGb·‡âNìHÔ Å9ƒ¦ ä—²ùª¾pØa‡AÙqgÉ’%0dýúõ•*UBá£'æYÜùéç_7ÿü[F÷O?ÿ†xŸnÜÝHìâŽ&òË 0œP…ËôB¨å9u'(Š;…"Ÿ·~)îä u:¢¸Sèì’H€H ÊÊÊT_Àö«7ß|SÄ… Â:$TF†`¸sÀ°Š;¿üú{è (!⢜@ ±8eL®ñãÇã=÷Üošâް• 1S9š¿&TÜñ+ âŽ_\ŸqG59ŽÝïR¶¦¥ •mhSܱ¡Ä2$>wÒçSLj(î¤ÙÅwÒì]ŽH€HÀŸ@“&Mt ܼyswÖ®]‹JóçÏǧH"óê{ +îüúÛ¿î_~ÛÚ“qgØÈ V¥JUvð¢C‡xóòË/7ÅÉ“'ËórMŸ>=§ó4{qÇ2æE5 N¨DâWÀ/¡²ßAéf šùšâNN§'ô ¸“>ŸRÜI½Oÿ År6‡J$@$ðœÆmÅ}ÿý÷«¸ó믿¢ÔwÜ‘uþyôì« .îüöû¿ÉwPÄ«å ãÚgŸ}ð&r*›âNÏž=U€€à‹œN̼‰;ùŒÜÑ#Òå t¿ËLÿÌÈœN36Né @q'~ #wÒìbŠ;iö.ÇF$@$àCÁ#ª/ì¸ãŽ/¿ü²ˆ;ü1j@ßiÔ¨ t¼¦GBÄßÿõoçýû–ˆžäˆ;ûר b£FRm<ñ䤦6Å“N:Iá7kÖ,ד4{q'99wüN²aHqdžË@‰ ¸“ú @q'Í.¦¸“fïrl$@$@>Zµj¥ú±Ç eGÄì$B ì⃦̂½žqç_ÿú·yÿž$qgêŒw€kûí·Göâå\¢DœrÊ)¯½öš)îüýïWø#GŽÌÃ$ ÝW,|èÑQæ1ç³ÍãÒõ#”—‘ú>®çp9 øm˲ªÐ»gâçŒÄ5ÌïÀõ­´GÕ>](qçß\Py%ît¿å.kܸ±*;xqüñÇãÍ;ï¼Ów°EËL ³fÍš<̈,Å›3ªT ‘j1~‡[‰anõÇOÜAË:ÈIžèä(t¹Ì‰;–ÁJyð» È'Š;ù¤]¾(î{ž:¥¸“'Ðì†H€H 1fÍšeê S¦LqGâpú%—\‚\Ò6yâΈPx’&î48qKvêþýûã€y¹pèyðæ3ψwŽ8â€5Å5j(|8"?³@e¿}U¡â@5Û±… q=ªì`7“cDª+ábjäS¼=k¡‘;(€ö!©6„Z mšZšUée´;é4tŒj¹ÄþÀiç»/Š;ù&ÎþH€H€ JÇ3éûÿø”w,X»PùðÃG[î(K–¸óû¿AÙq'ä(ôÊ{T±±cǪ¸3qâD¼ƒÝmHodŠ;G}´ÂÇeùœº3ËÜǤ —_Šb‡hZ È+xáÙ {hkPXª˜GPI×îŒY•qç÷_ó½ùí÷Ÿý}ó/¿ýôóo?nþõ‡Ÿ~ýþÇ_6ýøËw?üüí÷?oÜ´yÃw›×ûÓºoúfãk7üøõú¾Z÷Úo¾_ýÍ÷«ÖnúòëM+¾úî‹5ß._ýí²U—®Ú¸äË ‹Wnø|ÅúϾX¿hùº…Ë×-XöͧK¿™¿dí'‹×Îûüë?ÿú£Ï¾úpÑWs®™³`M§kz€Ø9çœcŠ;È¿ƒ7TbŠ;wݵå¸t¹àø"ÏsJs;2 çÙŒ„w'‡m1l'án¢y$#wr69ÍRÜIŽ/â·„âNüLÙ" @R xDõD‘¼øâ‹"î|ôÑG0ù×_mÚ´) ´imrÄ_~ý=ø.¬¸SçŸ[vZA[üÇ%'ÍC¾XSÜ9ýôÓ~“&M 2GüÜĘvŠhñÃvèšDy @q' ÛÅÂòÏmïwrË—­“ $‰oR}ᨣŽzýõ×EÜY±bÌÄά]vÙÆ<õBBÄŸùÝæ.TäÎkï-žsæÌQq§_¿~xçÄO|÷ÝwMq§bÅŠ ذa™’yÇ/­rALJT§¶Ãk‰r !| ¸“OÚé‹âNA°ç©SŠ;yÍnH€H€@@~m• §b©¸ƒ<ʰnùòå’f—]+ÜÑhÁ·emþù7û» Û²ú\É«H¯FáÍ;î¸ÃwFŒ¡äñbÙ²e…š¢_¸O§*”=ÉéWÂvxHVrø`)VçÈzc'Íœ½`õœ…kæ.Ü’eæ£Ï¶dœ™·xí'KÖÎ_²%Í‚eë˜éi¤fñŠ KVnXúåF$¯A $²A:›•_}‡¼6Ènƒ7kÖ}ÿÕú¾Þðrß òàløî'¤ÅùöûÍß}ÿó¦~Fºœ~ú©s~ú÷–4:ÝùϹsÆYçÎiReç“O>Ù~ûíñæ³Ï>kŠ;—^z©Â¯]»vfÁ–n‘pú% · ä”w÷^@ï°k  ¸SXþyèâN ¬ Š;CÏŽI€H€òE›€Ì=AøÙ·óÎ;#ᎊ;o¿ý6Âv~ûí7Xô¯ýëÞ{ï•ýY¸.¼¤-6åYÜLíÎsBåråÊ‹ðÙ×C=„w9ä¼mŠ;’bY®^½zåËóÞý@ßñ;}¼°†¶w9+½°6°w  ¸SXþyèâN ¬ Š;CÏŽI€H€rO9_'bìèkÈ=ýû÷×Ó²Þ|óÍ÷Þ{ODǵvíÚvíÚIáråËßtk¿¼Eî@ ÉæÎÛiY£ÇOœ=öØC•¼¸à‚ ðæµ×^kŠ;ˆâ1]§äÞóìH€H cw2FVl(î›Ç2±—âN&´X–H€H h¬Y³¦E‹nY›†Ú¶m{衇ÊGÈóØcAÙÁõÖÖkÞ¼y›6m’qÎ;Wöªà:àÀZcž|.×Û² Ídçç(ô+;^,PsLqZÞ|ôÑGMqÇÜM­hæ % #@q'õ§¸“fSÜI³w96 (I›7oÆÆÅíVvp÷ûï¿X¸î¹çݫռyóçŸ^ÄlÑÂÁ'£ ¿1cÆT®\YZkrZ³Wf}’£œ;e⺿ûáço¿ÿ }6|·yý·?!¿²ü ×Ï×ëøjÝk¾ù9€ ù€é$©‚–®Ú¸äË ‹Wn@ !$B:¡…Ë×-X¶%»Ðü%k?Y¼vÞç[²}ôÙ– DX@°kÑ×ÓO?w°å ‡g™âNÎR_´jÕª$g%M$@E@€âN8);)îdÇ/Ùµ)î$Û?´ŽH€H 3ãÆs¤×‘Ÿt‡v¤‡/þóš?þ5×\#2ÐŽ;îØ¹sgw°u)c¾üòK¤à?þøc=ä,­råwêÒµçœO¿Œ7¡2ä˜x;Ͻü>P êã?VqáML™âÎË/¿ ¶*îLž<93²4 @¾PÜÉé‚õCq§`èóÐ1Å<@f$@$@y €-TuëÖuGëT¨PáþûïwÈ:æ?ßyçDôHÅjÕª!›2"w îàÂG³gÏ^·nØ¿bÅ -¹×>û 9>®Ó² ÄäâÎ]äNï¾ëØc]h\ÿüç?ñæÀMqðÕ)ÐÑW•‡ÉÀ.H€H€" ¸ZqU¡¸S\þÊÌZŠ;™ñbi  ä@zM~lŠ;ˆ+éС6X(;ú"J8à©~ÜqÇMš4IÄ\áAŒÏ÷ß/CŸ>}z5¤ä‰›¾üæœ,B‡“»;GÛ²žt †ë­·ª¶ƒtÔxò ¢ŸLq[ÞÔ) 4HÞô¡E$@$@ÛPÜIýT ¸“fSÜI³w96 H;„ôíÛI^Ü;'Ÿ|2pk#תU«¾ûî;È@úŽç‹;ï¼SZìK.¹dæÌ™"îà‚x±téRMÄÓ§OŸråÊÉÖ¤N]º}òùêÅ+6,Y¹aé—‘¼)lÈélV~õòÚ » rܬY÷ýWëøzÃÈ}ƒ 8ȃ³á»Ÿr'ëH˹wÞ›÷F±ã8ù\@‡wú£>2ÅJ•*©wÊÊÊÒ>%9> (bwŠØyv¦SܱãTœ¥(î§ßh5 Àÿ!ÖF~ u\5kÖ?~¼j7+W®„¬óïÿ[á$,dÒ x>ýôSÄûH›»ì²K·nÝTܾÙ ‘$âY¿~= )Y¡ÂnÃFŒ‰ î@ßÉõ{Bå‡ÇLÂ÷Þ{oUvð¢iÓ¦ËcŠ;O<ñ„éeË–qâ’ $–Åĺ&.Ã(îÄE2‰íPÜI¢Wh @ H Mš4qË:H¯ƒøS¸AºœßÿÝѤ™ 6‡ð¼ñÆ7–.ößÿ‡~Ê.¶… Y„7nÜ(ÍâŸÈÖ,%ªwÌÌWß³Üì’Ÿ;ÞÓ².nu‹å!„É…„GÇ„XSÜiß¾½º {Ù8¯I€H€’L€âN’½‹mwbÁ˜ÐF(î$Ô14‹H€HÀ‹$•.]º¸e¼Ó¦MdÆAœŽ\_}õÕ/¿ü@¬Ö®]«å=_ )–¥;h=ȶ#âÎùÆ…l>?ýô“tñè£BZ’’—·mÿñÂ/·emüi]ïB¯¼GU CVq¯ñ’Í›7Ïw?üpuV÷îÝ9©I€H€’L€âN’½‹mwbÁ˜ÐF(î$Ô14‹H€HÀE[<Óë Mï+¯¼¢êÌêÕ«øáK~Pg°Í*@âY²dI¯^½4ÂU0XĤ… @’ˆG„'IFSa·Ýûô»78çÔ–<ßÈõóõú¾Z÷Úo¾G dB>   I‚p´tÕÆ%_nX¼rÃç+Ö#Kô¢åë._·`Ù78ô}þ’µŸ,^;ï󯧼ð&ˆ8HizÉö´+¯¼ÒwÅcÊpð‘¥SXŒH€H  (î{>;¥¸“OÚùî‹âN¾‰³?  Ì ˜T™zÁ¾ûî;ḟ4ñå·ß~³ïéx>ÿüóàž?ü‘AÒ5ñ`ó—Š;ȃX I"žO>ù¤aÆRòð:GNyöEÏ„ÊÐY rg/ît»év vLqg=öÀ›ãÆ3Å›o¾YuÌÞ#,I$@$Pw ‚=ŸRÜÉ'í|÷Eq'ßÄÙ @&‚·Y³f¦ #¯Ë—/ܽH쾆Š]BÐklú¦ƒ¤¿Ó¦MólÊñæK/½„SÒÅ€ƒ>½ râ.$ØlÍÒé3Ï<³Ï>ûHÉæ-.š‹Ã´ô´,˜UÐ;ËÈ#:ƒÂaa*î̘1ï@¾SÜiÔ¨‘:®U«V6î`   ¸S@øùéšâN~8¦Š;…áÎ^I€H€Â`—²´ì°Ãne§eË–ÐTyÁ¾*S…ÁöŸxŽÓúæ›oüúMÅp½ùæ›6⎔=ztÅŠŪsÏ=Ç¥‹¸ƒ >ØÆõóÏ?£SÓ~Ûm·A„Ú"Eí´Sž·ÉQè…¿³Ø–õöìÏdßÙ¬Y³£$× 7Ü€wÎ9ç¤àQqçÐKŠe¹Ôæp~N$@$P`w ì€ÜwOq'÷Œ ×űgÏ$@$@¾† ¦Š)îÔ«Wï…^P!éu¾ÿþ{´‚ÜÉÈŽ¬ïCa™2eŠ7·Ñ´ÇÒ6mAzh„ 8{ËTv¾ýöÛüÑ!9¤Ÿ¥K—Þxã"óì8G„Ž\É$–ò†¬‘;؇¥NDÆëžÑ:  Š;E㪨†R܉J®êQÜ)/ÑF ( ÐeZ´Ø¢8.h“A°Œj+¦ ã@ƒìÈØoeŠ2P‹yä¨9cÇŽEœŽh=rº–6ˆtÈØE妌è›õë×è;øÉž:ê(±ùˆ#ŽÀ^0(;¸>Þzá¸t‰-Âuÿý÷Ë.­í·ßáÚ®7.]¹òJao${^™ÉiY»VØ ö?õÔS*îÜ}÷ÝxçØc•Xwd… ×É'ŸŒÇx‘ $œ€ ‰lw%ñkGI’âNšÝNq'ÍÞåØH€H H@XÁﻞéuÎ<óLlwRyå믿–Œ6Áân×£µ–/_Žc¹eÖsÏ=‡M[ú%ˆ/„Dè7Xâ2dˆî#»øâ‹‘ÄGÄ¹ð‹²˜ÝI:t¾U«îùУc!¯ö¶wŸ0f#FÉ„7{ôè¡r„-$3r‹t|‡H€H ù¸‘6ìWŒâþœâNqû/ØzŠ;iö.ÇF$@Å@;§<ÓëÔ©SgN!G/È+ è×_EŒV_¼x1Òë˜ º7v´ÿÃ? ÀǬîx _×^{­&âéÖ­›)‚à5„$IĹª~ýúò#¸Á '½òæû+¿þ®`·uäN‡Î]a0Ôs\’5ñJú&Ä믿^0»îºkÂÿRMóH€H€”"[3úQËÂÅE€âNqù+3k)îdÆ‹¥I€H€â#£nݺî?cî¶ÛnH¨ì–Q%GSé.§PC ¶ NÇOŽA~äˆ mÄ,€œÍˆú ÐwðÑ|púé§Ë öÚk/Ä É.-¹Ð#ô&ióñÇÇH¥d‡N×|²hÅŠ¯¾+ÈýÅšo—¯þvÙªKWm\òå†Å+7|¾býg_¬_´|ÝÂåë,ûæÓ¥ßÌ_²öÐÚu`jYY™YðNµjÕÌ1â5¶§©[»té’d&  ÈŠ;9›ˆf)î$ 4‚H€JŒbXÚµkç–u^§cÇŽØÄä)  Õ ´’‡zit4ó±'9d2F, £ŠŸƒFP`üøñ8 +?R5¿þúëØØ…ø”`qG>ÅY]‡z¨ A:O?ý´)h"ìGëÚµ«$$®°ÛîîºbÍwù¿mÄ×ÞùFÂÔ÷Þ{OÇ"N¼ôÒK%“´\o¼ñ†ŒH.þ8tv± ä‡Åüp.L/w ý’ @©€œÑ·o_IÙ踚4iáº\HsIq:Ø ¥oâl&ÉŽüØca›•›"ª¼üòËr:ôÚh]´³aÃýçŠ+pªº”DŽ˜€€ ª%"ÖÆlP›ò{ )ÄŽË/¿‰xL‰NpÇðâ´ÓN‡Õ9òéi3¡¶äùÜés÷ ªÌ!pÀxñ;ÂÒë®»îRÏbøž™ªKuúsÜ$@$@$PHw I?×}SÜÉ5a¶O$@$  ¶˜‡(©P³f͉'š*Œ™äÙ‘‘‡Øe^zé%ÉŽŒõ¸qôòþûï#®ï3!$¦æ‚äÜtIÄ£!ˆ]£ „øâBPB{ð)ÄèJfƒh9’‘ˆ"T€Êƒö¯ºê*)²ÏÜtÓMf „„ùH"œºµß~ûIÉÓÏ<çýApÉç¼-ëÄF§À0Ä©ýØò†wcèwÞþ¥×gœ¡žÅñgœÿ$@$@$@ !@q'!ŽÈ‰wr‚•’ ü'd2F`Ž;ZIgúõëç©Â8ú‰2P^ªóé§Ÿ"–GŽ9‡FãPaP×Ñ|LQ‚ô qÐ C]B8Äõ@KB˜Rôã?jƒÐŒ¾ûî»à(C7–á#Ú ”)ñàqMÄÓ§OŸ?ŽKßþêkoX¸ô+h.y»ýrîÌ]ðe¹ò;Áx:j9„*¼Ó´iS¤2/I±,×È‘#ù( $„Å„8"'fPÜÉ V6J$@$ð„Ì ¥®[ÖÁ;W\qrc·”\ëׯw«0Øãƒ¬ÆZEEQaf̘F?EIˆ8~®ÀñçPp ñhy¨BøH"ƒ&MšôùçŸkö;7!?Øó¥%=_ ìcÂÕ°aCœÎnîfZ¸p!â€`-t"$’b*ì6pÈÃK¿Ü˜·Û3¡ò£cŸ†1ˆº2 >úè£ñfÿþý0¥¸™¾†÷ù( $„Å„8"'fPÜÉ V6J$@$°•€&qˆ;'œp”KÆÁ¢Œl†2E™©S§Zª0ŽÖ°% „6µ|ùòçŸ^7v™ ´›à,Îhµ°M,Xâ¹í¶Û$ÏvÛmwå•W¾ûbDáB¬ÓI'$Ü;üˆ Sf,Y¹!?·û´¬K.¿f\tÑEj*̆ýx‚2%é…äÊêë ð9   HŠ;ÉñEü–P܉Ÿ)[$ ØšA¦Fî€}÷ÝwìØ±ù1,_|ñEFØçâ§¡,]ºA@µ†ÄƦ(©p´}ì™’ÌÇ6—[{rÛ‰}XmÚ´8»ì² 2L›9k$[dÂ6(“’N>õÕYByÉÃí8 }ï}¶$>|¸Ú9`À¼sä‘GBå1/3§ÆeCŒeH€H€H€òC€âN~8¦Š;…áÎ^I€H ½pöS³fÍܲÎN;ítûí·#âÆ}É爾±ÙÅ­DR {6…7çÏŸÍA8¹<4ÐFœ€VÏ>û, ¿q¨ÉÊÈcóæÍókMßõÕW;î8uðÁ5Ê”xÐb…¤Ó{î¹Gñ\Ù¡ËìO–B|ÉõýÙë-_·pùºߘ ‘IÇLœ,Y“¯¹æ¼©ò[›~GðQFÐX˜H€H€H §(îäo§¸S`°{ HH3Ý»wÇñIne»uL½‘5(¬2ô §Ÿ~Zެ‚(ãwx6TÄøHzlžòSOÐÚ£>jfGöc õç­·Þ’ô:âŽhOŽ“¹üÚ„ „”=0 TÜ‘8^]£]N>ùdìršm\šˆ¸ˆGªƒ-ñÜÖçˆ/¹¾Eܹñæ;Ð)l3 CÀÞ=zô,ãêÖ­›ºƒJÑÔæPH€H€H (î¤Á‹~c ¸“fïrl$@$GÆ «X±¢[ÖAÚ]œ6¥Jv?i’cÉP£!â;¶D”AnÓv¨0‘lÇZ†Ù”N ú uŽdG– Ûš^{í5Qmp–9N4w“À©XèHºƒla6%ÅÔž°e QE"*hO  ‘¨Ð»¥¸ƒb+W®D"Å Ó©S'&¦’‚f’ˆºÕ©§ž*<¨Ö˜ñS}±.‡÷VqçŸu룻[o½UM‚›ðÎî»ïŽSÀÌ«nݺ:E;³]‘ „ ¸ΨxKPÜ)^ßÑr H(µk×vË:U«VÅV#Y¥!#%i6þ‰cÅ!‹hqT”‘Xˆ&‡A>³AH0æÞ+H<ß~û­ÀÉYÏ<óŒˆ2ØZõGºÖ]Pa°7 ÿÔ*)Òô:ОðOýA4~ÚBÞxã é=¢_­…¡a€H ƒ±›Ã4G!¯!65oÞ\0V®\ImL}jÒI"ý^³fM)yRã¦Ï½4 LŽî­’p!3¤ÇœáóÏ?qOz½òÊ+RR.ü3!ó“f Š;iž wÒì]ŽH€rL2-Z´pË:Xä÷ìÙ)*a@sòâg4‹ï¾ûN #ÐfæÌ™¢•ˆ¬ã©Â@|ñlêŒC”yâ‰'РéÆ.OÆF{’xŸqãÆIhÈ.ò¤@¦jƒA‰#—C{rë;x?ꨣi:uÐæÆõñÇkZ¢ÁƒW¨PAJ^ry»÷>Z²`ÙºØïÁŽFûH dšâÍAƒáÈ3½>YgŽóÛ[—ã)ÉæI€H€H€| PÜIóä ¸“fïrl$@$3Xº÷êÕË3½ÎYg…Ó ýsDwÒì]ŽH€â&uÃLš«‹ùÝvÛmøðán©m° A–† ½ba ›ø©Hă9–­¡ Fæ¿Öæ&S;­ÌÖLYb j‚CŠLËQRñ\È1$‡ŽãÂùSØ e*<8:ÊŽ¨]È}søá‡KÉ#ª?ñ™—ç/Y›åFÐT³Ó àMäW†sõBø’N¼€‚WÊ… D ;Ý’½Y’H€H€H wbÁ˜ÐF(î$Ô14‹H€I U«V毱'èꫯF–O…ÇŸËWš¡ÆoX¨®§¡;¢uÌ–e_òæhvd¿%É1"kž{î9?õe¤=A¥By¿Ö IMœ81#í Úë;øtÚ´i‡z¨¯W¯Þ“O>‰]fz}ôÑGØÎ&p6¹&âi~᥯Îúä“Åk#ß:wE§všö… ;Ûm·ÞÄŽ9„,é…£îubvØaªì˜/pæö Ù„5%rîÓ¨ `ç ìãË ŽWQi©Ä³lDzzd³£ VºÃ-ÍÓbѺ³é%Ó–£ƒC3íÈm|ö-؉±Lö“Yh‡þì µ9ˉ—éóÙÝÙ E¡úl½"<Œ¡]$p¢RÜ õZ ¸SÄΣé$@$w1ŦM›"x+~±3sc”Ãj¨0ÐDµÁQâH´5lqBÄ¢oô$â™0a‚fGöÛQ¥Çœ#½~]ó3¹E{BÚfÈ8aô)éׯ5(\2 ýúû7 y ãÐô`€úé}÷ݧ»á.¸àôbJ< ,($ü÷ÆoÔD<]®¿éƒOVÌûüë÷!µëÀÝýû÷׎ˆw9äd2¯}÷ÝW'FçÎ=Å}SBrñJxÓ=Û9æ̇ýöÛ/Úñ…€Ô]¨.“ /paé­µÐZŽî¤G » ƒëbc&Š™vâŸcÆŒ ®\­[·ÖZÒÞ ]3Gë.tøZ,½™œ(ÞTÏÂÑNÖC-KSÍáãgdy¡ {t%ãšÌâ\‘L°hÜ¢=Ñܹ»ÈþB2ÌgP·à+à+Â=v›/‡ÈCȨ"ÅŒpYaŠ;Eæ0šK$@%`Š;Hƒ ;–„Š2¥A@n†Ò£¦ ¯ †ÅlÍLrŒòzôSĪH&c·(ƒX¶ˆ óöÛo› B$B’lbBËú~¨ö5JÏS‡J…òZñ2HƒiO¤ô¸wUˆg14‡éf‹ÂHÄ#?»±[ê†nx÷?/ˆPr*¶ki4Må=ªÞ7ôÑ?ÿ:£û­ÙŸ¡Äé`ÔÚ‰ŽÖ®];HKz=þøã¦ä\ÁâŽ|Š(ûôIõìÜ—€,`Ü:Ùˆ;:ÃÍI¥Z@öÑ@ŽÁ`¹ëîHßÁ@üPùÕ‚ý¦¬cvíIRÛ‰ÖýÜÅ·¢*ÉE#†Ë¬ð¼ˆ¹‡€µÎû¢$lðµã£P6]Ç8™•^4qšcÀÄ P$*<€àî\tgã¿22£ðNO_ˆ†ËTÏfPu)îäl"𥏓7Ð (ŽÈè;PR,õSQFŽ—ÒX‡ ã™äX2Ôh_d×tìçÂÞ%,N°ÍJ÷m™* Gn(,¦(ÑAC¨kjOº± ïC…>e†™éuPB[{‚õÙgŸ™¾Å?E–ÂAÃD‡l>ÐeÚ“'[ÄÑœ|òÉò|ÿý÷6l˜©ð`eG:E¾!lã’’Guô˜'Ÿý賯,ïÞwm ÒA³ñJ•*áMP2Å.]ºè/²UªT±Qv¤ rB3„§H}3±°¿Ç(îèºÍbÁ/;$öA×ó¡.öHÍõºÓcé𾮄=W°¦¾b§H]b'Zð4CW}±b9ºÈÝÙ£PÂEÈÄ´}‰_°'æVÎfàýEÜ‘¸¡€K¿Ê²wbœÌ¦ AÜ1¡éÄ ³Yª¸ašõy„ûLozº@[6Ý»î2šîÂ2Ç3k>~Æí IÑ 9vó+ÅïË!ËQØW§¸cϪøJRÜ)>ŸÑb (SÜÑ_}#iŠÍ¢Œl†Â5cÆ ÄÚhE×à¤ð€ñAþÀYZu‘Fš¡ͲeËLK’#ÿ zÔÂü±mŽTÁrt:ÞÁûfƒžç¦ËáëÊÁ&ÒÓàü/\r²;Æ(`ŽÚqn:´'h=Á<ÑZ5äçøñÇC/Ó Ê†&$!Àí±ÇR²É©Í^|ëã}z£$ÊC¸Ñ6‘Íïì¼óΈå1¯#~Z’_hÝ…2‘|±úðÂ*U—üêF#¦á0~+^M…ãW@ì13 ‡š:|w€¸ª­Å5™5utä„ʪßùM<}b¥*~Ï£gSòäæW Zw\ã¨"ý:æ^4Ú:…ü’ ¡Yt„«°;³(îd?m’ÛÅäú†–‘ @ò¸Åè; Ø ”ÁJD„ »Ÿp}þùç6ƒFt r¾àÜq¿Ž°Z@Z_÷É\#= 2ïø5øÖ[oeª=áð,¿Ö0(£Ö$ (˜*)Çæ,ù±^«V­#F@ŸÒëý÷ß׿™#¾IK|há£&Ì^°Úq·jÛíœþùÚÂÌ™3ñ²,!ÃÑóÆuê©§êú°Q£FÑ”©Åø›ÉŸÓ2XÝaá¡ &ðÚó/Ìx%u¯*r°›åX{£¼ÙlÀI˜¥g'ˆ b€iC((˜! ­€’na%tíŠÖ<—©¡kWÏ–#w'jˆ0ñt¢ÂÄ%ßJ¨b˜à•ìBž¨ƒC6´Š˜'þ 55Óù`n™ >ëëvnôò;é,òdÖ!kø¤˜ß¶¬`w£ºŸˆ©’„cž„ªŠžrd¨ˆ‰ÑEÓLýZ†¿ÔÝî :ÄÇØ”댾.B¿… R€âNA°ç©SŠ;yÍnH€H <ÅÈ >øàŽ;)Mš4ApJqû‰$iŽd¨ñ£Mù}%e6ùu„,9’…¶…Ê(pÞÊc“_ƒøŽpܸ¡páwñí ƒE³i e4„@û‹Õê#H-@dJ<À‚T>Ò) Ø{ï½å×€'6™:óÝ>]­wõ½·m>dÈ­Þ³gO¼S¿~}l43/=ŸÞ}÷ÝÙˆ;¢ïX2a±x Ÿ‰ãدaF|¨´‡ZL×Þg$eú·ë€m º\4mˆ…{ª*@@êÏPe:Æî0ü€L7¢ ;S)ULl†*îFlöªHMVjªæ»±L£S:à §€S$CAOf©®ÉŒåI w‚Ý`’²r¨?¡®ô ¹ ^‘¹'ߦw¢ug’ñÜQ<Ôޱ»'J†Î%é+X/y(@q' ÖÅ‚¡gÇ$@$P„üÄH>ú(öáÇJíÚµ¿úê«PÂ]`åÊ•S§N•Ü4Ìqÿùq=šð'F™- 0²##TGß„R#§qˆ2¢Âˆ Á›¹´ºÙÞTí ɉ±]ËÏuPaKHÓëøA€ñª=…îö†5 åÁdž*à÷îÝ[ñ`Q“p™^ V2„;ï¼Sñ´jÓñåw¾?õÔïˆÆ2+žtÒIx³{÷î8’L/ó8|Š=\YŠ;¨®òS>Åj²þI\V&ú·n3¸Ã\Ø`R‰4 ¿FJü .] ™eMŽ*hÖ<2ï{Ðã ¸¶é¹ébÞÆUºZ6ónx 7ŽÖ< Ðµ«.zUÂÀ;‘»3ëz®6ÝðC“PhžÄ‚kgØ•ºZFÃ+BMÍh>è÷XÀ²ÜL&­óãÕø5wô‡ßÀC'³T4#•ðω;~™¼-÷ʹgµ§pã@á€"wg’‰ îx‚Ž6u\ð;I”–|•a€ž  ÛAø¯J\˜'ºaè“oŠ;ñòLVkòS“ „0Ã4P{²pAÙÁ…KˆU‘£²¡ï Y2VéHò’é…õ¡‘Ž­RòS*Œ5ŠB{´Yô¢IŽ‘¡Z týrƒ„ù8DS…Ax F´ ªK’cä©AZ}eôd.Oí *Œô…ÔÎH=cysÈ>ª=¡¢ç/+V¬xâ‰'Ð Îí¾*³AäŠ6‡é†Œü>ȯ,?åá$Ê1õ`ùâ‹/$¦ u;vì(ëvÙu·î·Ü…¯;î8­æ™ ïYãÂÙXÒ®Ã;,{e-`s\h°U²~—*rkÌÓŽÝË€uoÀÎ]àabœ ú'n90Û”„üâetÇP@Œåw2”Úâ¹RµwM¥´ÈÝa°²—åùb¡ŠI0À೴̺P70@Ùß$߀ãá™Ú6ÔÔŒæƒ*A[ÕTtíøÃƒ>%„ådFa•?Ô¤PqÇÞÝxFК”þî'1²Úb#î¸guäîÀJ"ªD@qOÑà™ n È}®sCÒùÓi€ÑaÒšßZo††ÿdô5­0ÅhÜŠ£–c¦òŸ$@$@$`IÀ-î@ @¦ùe‘#/¿ü2~ ÎTÜ‘òÐ2ä$rl˜‚’"±0ˆëA"· ãø‰‹ 5¦(%H[ÀO0Icaä"‹i!Nìr$9†räePKN4Ç1‘!T…Á›ÐMÌÑJníI‡ Ç B-9fË-fAÓ‘¸‡öäÉ.8ꨣT|4 N/é6(phܸ±éú›nºIKÊ Ï=÷„¼e^x Véܹs,â Ø·R¿]••ºjõËåá·kÆFÜñ”olö¤ÈšÍœ™î|ÉÒ º6s¬uÔB@€¸¬g¹Æ‘»‹0üPÅ$¸M?bžëmÓ³¨ ÉiFaSRÉÒTÓ$›h#óÀ)ÏŒ<¡;Ë2šÌžÙ|CÅ{; OíO» Þ>é¹ãD£ˆ;™vg?jÏ’b¿ãYÖ±Ë,Å t3º1”)F‹ê„K™è˜YŽÅ¾:Å{VÅWñÕ x‘ €äÓÕ_Ê=Åè;ȼ«ùzËÊÊMß1EÄÂà—ã`Æñ3’ Â[´ Upª·Iî ã0 Ê`›˜†ó@9r„yžØñ’†*ˆ‹‘|Ct Ý€!ráŸ0f;"€G†C{2‡é‰šŽ†\5kÖ ™)ñ@êÒÌÓ0 Fâb³XË–-ñfC¼ÓkôèÑæ m„ q‰;Üœ•Ï_(C#JüÎ÷µwüv"„v*‘²Â\a¡•íOu tíXÌÛdZÍ…¸ð˨‡ÐI•b@Ìݯ¬uM‰¯=³>+mÇ&²lLuØc¶c®Û=1JðVõ~; í'3曘äÐãwüÑ—ŸÀá§ù ‡ØÅL» ÕDDsëPên|äÖpÍM¬¦eÖ÷™uÍXž`å+›YÖ¥¸c ŠÅH€H€H årî@/]7ÝF"dDm¬Úµk'›éôB®h€Íbòû®ùiµjÕð&V_P|ôºúê«UÜ©P¡BŒÊšÂñí6þe™, hŒ@pD‰§c#îøI–‹sÕq° 2僜ê;fGnû)îxŠ5òU`• q:x¡1/¨îˆÚAï»CK,çOèÓ¡ õL#ªB[v°œÌš:ÚÍ£¸£-ãñ7s™Ê”ewE-îÈÞ7·ëÁG„ùEçéfUS¦ÑoÏ6e>èw‹§”aRE«Bq'7Ö"  ´0Åš5k"ÐÃ̹cŠ;Ðwpv’$ëE $R1µŒ*T†¢‰x,ájÜg§H¢ìˆ… nÖ!Ê`/#³eDåØ7({¾´:äÂn/³AæØä qhOžƒE"ž3Î8C–aÐkp†½©àÀ}Ø_†Ëøôª«®Òžzê)¼ƒ}vаðÛ¿^uëÖUqçœsΉWÜAkг,]Ìb‘ ˜mÖîÝ`Š¡âNÀ¨£-Îí7þDâøëº§2¥£Hš‹œ;™v@§Ø µÄ …0 ±ÇSv‰`ª§*m'»µ 4 ¦£€çdVÕÀ½ø·T[25åU_3Xí.8aS€¸ ÀlËÊ´»ãÕ*â‚àX!¿öÝ_¦¸ã§ á§§üÐ ³”M]Š;6”X†H€H€ÒO K—.ºž—¿Óâ—M¨ìw R =èAðëŽd;Îæ‚<ðd¨ ‘nIÄãî‚vE…Y¥}áVœå7Ä¿øeGö³š¢TüD|PFÔD<Á„!Ézè¡âGdäA”)ñ ?ÑwÜd=ú&’é ä™gž‰Ø"½ BIf¹°­,vq‡Ç¢gäúh…͉ùhû½.¬¸c&ë‰=xGãDdéås9ñ@  ~í=rwæC¦Š‰%1KT_е½;£°ÙN¦¦zÚ`™û um|g3L³Œ{2{¦ŽÖ*¹wt€˜ù*rYîõówÐTÀFÂx*gJ^Êû‚nÙš;U™)”4’‹¹di³£¸“)1–'  tÀz[ÎØÖ É\Ù!§e¹Åè; êÕ«'å‘‚GRá \%Ú…c³ ;Èö%$»Ñd1–¸Ñ»ìÓ G?Ivä9sæ7ÑD’#ÏŽŸñhÄ^{‚>ØØ…Z~ ¢/Œ×>†§Å¿ð 6l ¤‰xš7o.AXžŽÁ‚ïzõê…ËôÂñ[:¶ß~{ÄÅ.î A=ÍÒ¿,–)ËÈå1+ò¹ƒÑ¹åL‡ìYkZýS|ðÕ5¶"àþæ¹9ÚÍ¢Î]&rw°d¤˜Ø³±Ä½=PQx”™Î’NIS¶ž§,™fÛøÎf˜Ž2ŽÉ¬”_ |åÂ)`yša*¥é¬öË´e¶¦úˆùȨê §e"wg3:¿G^`FkÁ­Oe³Å5š ‘kQ܉ŒŽI€H€H mœbnίGÿøÇ?FŽé'îàH&$Í¹à‚ äS¤àÁÆ%¨6„_„º â2 ”ôkw#Î@rS`úøãa¿œÌ…ícn‡‰ #Çœ#tAC¦aæXÚù¤m´'¨0nP]c8~#Eöb=™+8Óö—!ŠJY²]¹re×®]5O§NÜâD‰ÐA.´Œ 9w@ Y{TÜÁ¡é¹PvÐæúõëÓöü$l<6!~&§FÜ1·….˜5¢!@P2ææ]ÉÈn!rw&𽏓1KÜq"*ߨ”ljø`¹' Õó,îX9Æ­=žß¡£öœœž“ßOÕ2Ÿ…hÝÙÌ.Ï2âýP]/ôÛOå°È±N‘‡¹"ÅÈèX‘H€H€RH‰oôL%ù59zq$“g䎈;¸ÌEd¤àA Pd,5¿bHv£úÈÂ… 3-‰x´å 6@×ìÈŽ€ UaÐz4J%‚ ‚L‰'X{ÂñXˆe )™Ñµ¶)ç¦;´'¦Ÿö„`g™(JD‚Àä02˜óüùóO>ùdý›ðÀ_7.ìà£úõëã0,\Øt&Ñ4¦Àwûí·çHÜÁÉ÷¹•…3%`ù×fÏfcw°ÐÂ/øoé±Gîø}@2têi¤Gø¥wñ[Fë.Ó™€ò–âN¦Ä p‰[’ȺǎÉàÀ‚÷c‰Ü « mf †‹u©a2ƒOÀÕ†L#w W ÿUÑSÜÑùà·Ò³–~¥褞ä£uažK±Áóa”¹gùEd¦×±™Q6e"ʲ"ÅKP,F$@$@¥BGnC£1ÿÀáæÞ{ïÕÓ²PÑ.¸TÜÁ¯ïcÇŽ­\¹2jaoBBd“‚h"_0=JL v‡eš†CN%×Þ!»H¤Œ!°ET´^З–„”ãNr ÕÃDÕž>úè#Ì ÔÒ=eè{Ü´AT4Oì‚ö„°ôS¦hOÏAŽÎ3lé’á# jL’8ÛKR;C2‡éIͪ`wì±Ç¢5QxN9åø«}ûöØ^3¤_øÔt=$ª‰;hÖ>;u©<{±ŽÓLüá8óÛìGדf™ØÅ]±û¥#Õ%Jfú°{b3uŠà”ºfõÐU¨çú-tÑ«êC‰Ö]„ib#îD ¦U¢$tì¡‘S2.Sƒ ØìÒtª;ÎóÒîÖbŸÌ‘sî言„ª™OA¨éŒ¬_èƒà˜‘»‹0Õ¦ß×H¨ïô¸z‡ æ7öCȦ Ålè±nüÃwM´Dåî¦ñ“Måúx9|#¨Ù¿¸ÍCa,^ØÿR‚Òþ°5®î,§lF^ƒÙR—ý"Ü‚g׳„“M±h“ÄÑ£L˜Œ&g°Í1TwãWû=ðx"P>ÓI³£uÙGò÷œÙÂPŠ6öÈ£ˆ«"–ú 4pè;½{÷–£Ð=Åø 1&Gq„ÔBzf<‰,îHEˆ2Hr,¡+ÐŒì3Ô ‰»Qªƒ„Íz*ù‹/¾ˆöýTLOQFÄÄÝÈ 4Ž.Ì!ƒ€§„í |LíI‡ =ÁJhS6vag™Ù †™æ9´'Oæýû÷—œJê.ºè"Ä!& ÿ„פ)˜„}yøHý~ÐAåNÙAË ׌e;žtAâ·®ÖE—c1¦+^·,ºöö, «P? ´@F.VaËïø~­©ZáI,@ÐE¯ûw!¿å"lˆÜ]F4P8Ôkш™µ<zš‰™-¼†š:vM¸c#'…j :3u :WC 8†YÜÑùƒéç)àšÌN=Sêh€ ?7 ³YýÂqø:rw¡¾v‡Ôo_[¨kÜù¿¥‹Ð@ÈPõ'ÂX"T¡¸«xð\`gÿílö$[Œ{PÃÀTÍÕßkñžÕ`±¿9*⟡?N𡢸v‡wð÷Õà­;ûY+?ƒãјH,¨có0ÞñûӇ؀zÜþ¯j:–hL~ϰ¿ìÑù•Ä[7+™$ö: 4n“|1#ƒ-Ý-]»Ý§#XâÁ%zÙœ'øg¨$­»ŒÆî(¬ê1ß×€ó€ ã7Ï©n3ölFo]¨Mš4q<ã={ö wp9‚M.»ì2©…h‘¹sçf©q+ˆ7‘@„–g¨qsÍPzÁÝ®Á+ÆÑš[”B$* šu¨0(ì‡ö¤Ã”#¤²6CŠðe„Ø¡=yê;Ø …ä;âQv°K,”È&¤Ý©Y³¦:giåTÜÉ4gv¼3¼ZÃW´~»3ÑŸ)ð¸c1¦*†»Vè_Ϧ ànÓ<°ÙýcEwñØÿQAZ0fðå˜ ú[Šã÷™à…´ÂpÓN<¶Ú`ÀoËpA¦ÝÉ6ŸÐ_8et¡^‹LLõA Ü!laRL?¿ÐÆT»ß|p§~Øuú¡MÇ/f¦[µ‘l&³§%¡âŽîêò{e‰äÐwÌÜý×qSæ0+ëqú•Ï:Ö,ÁºIäîÄמ¢°ç7ƒÌ¿Åˆ½ïÜ¿¢›Ïˆµ9… û“…âNaù§¡w)<µ€Ðogûñë×SŽÄSnÐUœ)ñøÅ¤¸+šJßÍÀWww2G´îì9ëz°¸c~ï‹$WèØõ»Ï³–å/(2óAû¢¤þu,Y=ÿ*r…vmþbíµû7¡€ͦBÅ‘PÃ…x-t˜Ž ‚i°{’¸;Zw6C(#¿ :¾aLKü&Œ§/ô7Ëì§z–ãʾz«V­coÓ¦_䎈;¸F½ë®»¢"úöíÛºb4ðËP–×¼yó$;2ÚG€LF£“D<ž ³/2×dÔšl†ÒÖ š ý§çÆ®€ö¡=¡ŠVGîDñ ½Ži-ÊØlb‚œä7Lm ŠÛñÇ/nEîdÙP6yòdìSXÓÝHÄ“SqcÌ; G àø•_køÖrü¡Èý=¦¦Ö/1ýå$ô·;¿K$‰‰ÃÏ_ô Ëasýú³ÞýÐ;Æ"a§æ/`~¿§éÚOþ~ƒZæŸvü~ƒÖªo–¿{-Kb !¦4Ü?[ƒ§qè jå„QñKf»ÁtºCýŒ<™£‰;îvü®%Ï1c=ãÒ€2µ<æäü~OScPQX™O±CÜÔñFëNi÷üMÕs&È›®õZð‹23§ºû»Ôoì¾·#W¡¸+n#ðúíl Ñ|-†Y¶,ÅÌÆæl3¸«;ÜQ×o°J¿ÌZž2³ùÔüuÊü®ôüN‰Ö= S² ^íë—©9ptzú‘{ìøõw,sàf-KÍÂl*T˜pÀOAù#@ÀeРgIý1`²’¸'¡ao¿ùK†%¨ãíÝ­´aª> Ž!x«ÁfŒR¨»#w‹§`M÷ùM÷_ÃÌ?ô™ŸšáHÙ{0ËñfT¬ $œŠåιƒI¥âää0>ãŒ3¤"vx! ¢NL #šÐ Éb$C ôÄ›d4ˆ2n™ ÄŽ3Ë€ ¨'ÈÚƒò~CÀØ3M Aǯ5˜§ q,ëО̖uWè!¡2‚‡Ç„‰¸Ó±cGõu… rªì ñL£-‡Ïbp±ùóqÆû~ÞÍ:¨¢ßZ¡¿Ý°µü‚—CóŽñš Ä´æg§ùsÐsšùýI %M´îâw²'ð·Œþt§:KÀoG¡ó!‚¸c.sÆo©m2{N›ÐÈ`wËo¶žSÆü¾P18 mz~¥ÀŒU%Bw™Š;²f ýÕÚü]ÔÁ-xó$´b~~0QÜÉç4÷’kqÇñÓ"vqGÿ`‚/Ïï#ýºt|Íï½ÔZî?猪äþuJe,÷0#wg9ù»`¾ƒÀì¾`bB‚á˜Ú¿Í7¸%-¦âBö“-À¡èNç¶Í:ßÔþÌ_²3”·w7 ËÏoÏD‡àþÕM vdºÛ½´‹Ö]4ZKç­#Æ[ŒÉh&˜»÷Ý_)¦t•¥Íy®.Ç*™W½zõ°ÉL¨ìw Vàêׯ_¹råPÙ^ ĽC²#ãB†šLK—ÍP*y@0Ò7¡¢ Ò'KôP€¸ó /Hhí ©% Ÿ¸³xñbIm©=ahHNäV‹ð¾æu†#Ð/ÎFSÜ1WçœsÅPßÉ3܈é5›ÉìÙ&¶Øì0bãnóþ¡¸#uâaöÚdG³€'œ±¡¬"t§d<§®{&H¬\°–jÎ4ù&ÌôQuLuûg<Ó ¡<ÅÐXå?äNÜqÎÈ¢"£U–«tuê÷•¤Iòz‡Vôü™­ZŒãû%8£ öKE­;’E×lº´ö««R½ßlýû¹ª·ÏCúE¬•/âØÅà•¹ O³Œ.“<ešƒ9ÄS6z§µ™º;8×#ºð›0ú¾ç¯Â*ý8¹»L]ã(ïù§uPFu Ý꯳Â>\<ËÑÅUІCßAºäÁ‘£Ð%¥…¹#⤜Ąö¥.6y!Ú âG 5dyAzY‰x°,£‘BÝÍPzaÁ'sa2C¯‘ô:©YWRGë;ß|ófGÆŽ'¿$ÐØ yE$*Pò£%K†‰~ƒµ'¨?Ø1'aM8dÝlçsé®.dº0‡„ÊqgüøñûÛßÔË87âNF“Š…I€H€H €(î~Ò»–ßÔC÷LÅËf;uõOý±‹;jÀ_c<—¯¡"ˆgË*|üñD~±v¬'£u:É»d5l@äN¨%Bi:Kÿ²á7p¿Õ¾c ÐÆÔÐá» èijQOðtÈ|ö›<ú—`¥,€¶T”¹„ÿ†î9‚»ˆŸáy¼¥nå9‘¢uÁÑŽ*Ò¯CŠU¥ÉòQÒfè‚fƒÿ@—ýpr×ÄäÐ1%Dåà ¦`qúÎ{ºúê«·ß~{ÔE–eļHZâ,Å©®¢ Îb_¶lYF×DÕ™º~Ñ4stIÀEÀúYHºJÞ wÄ$\¡š”)ÁŸÁ™w¯ÖlÖ®ž‹Þе«çâ0rwh- Á¾ª²¬…"4FÖ¥{q=ÅÐéš$Õ5iœø+ÔÔLçƒeÞn÷IaFäwíFnF ð2èB´¤àÈØÝ*UhT‘ù…Š˜¦ûLi,Zw27äÙ÷ŒÅ үÃúÛ‡ØD ö }:UºLÅŠ!ËuP"Éw ë…éa™4ôA+lh 8BÛ¡ïì¿ÿþÈÎ+G¡cGæÜ1Å$‚Á…9(Žâ‚öáÐ/²zT”Œ‚p¡Œ@9”&ˆ/HaƒËR…qôå'Ê pÆTa (鯮kQÆO{Bœ²#+43½Þ„ýÐ}d'XÜq—ƒ4ÕywÀ!#±0 €Š;œÛ˜Çl»¡ú°À6—Cîu~pˆÛ›mY*0ŵ|2óf BFj‹¹hÌHÜÑÈÝÉòR°Xæ UL‚Ÿ5Õ3€Â¬+âÌÍz6ªŠ)„šj?Ìø¬ÐÐ!,G3=JŽ–eG›ªNî€8‘¦ŽV“BÅxÝYmÉHÜQy7rw€–éy &g±Ö¡Êé”p‡1šŠŽ(sߥ> Ž‚^\?“† &itôB žQ£F…Š;óçχúÓ¶m[©ˆ}^ãÆÃØúEd‰GD™àìÈ~¨±§ [¥üºþâ‹/2 B<Ž© ™²z‘ô:–~—DÍÆTGûGzkÉпB58Çj(™©£Õ†Pq'S3´ìÎ/r'XàsãŠÜ]¦£v”û2)ì¢€ìÆ’Ë!ϙߙúðêŒÂ;"2JÌö4é;î<Ûm·]=‚#w î@@Á…œ¾‡z¨`iÒ¤ t ‰AˆJö8‡¨!ûªÙïÈ*šä.~½c·4#ŒÎrÖ!§2”֮]ë× ¨úòË/-[C1¤×AH”»5HNþ†hóõ×_Gô½¸S«V-w–•qAFöcgI   w8=¶=~8 Œ¸ã—w#£Å¹,£;Meǽ_#²Úb3Š"wLeÇfkP`¤¸Ì¯ç=3£°éâŒæOðÜ7Q]£Ûüb $x³Ý/Ÿ7>u K)¼ã.ïHMqÇt_F¢pèw‚ç!è¨e†º#Íïwy]!;¦ ÚѧÛý­jjb mJíÚµJçž{î»ï¾+G¡»·e©¸5×­·ÞZ¾|y´€£¸hY’ ã¿Ùë;h±6r~9ÒÜ ÎÅ/¯ÍâÅ‹%þûùçŸûu¤X¨(i ¤¥_¼ökP´'ˆ\¡1,½FŽñr´†p ÿA;Hă?‰;H*dz‚T~Äû¨¥ÄÎF$@$@ !@q'!Ž(°úGfÏ¥µç—ëÔFÜñ[ëf´8·‘Eââ¬ì˜ ?Ç_ûMJ*rÇTv‚óô‘Ò☄j3š?sCcd‚3@Ûl5²ŸÐ€´AÌm‡|à©„Æ-c[ìÍ`äŽ|ûyº´á&¿`F íû´ŒúmzŠ€š;Üiïµ–„îТE ‡¾sÀà'q»‡]øì³Ï–ªW¯Ž¬4&BQâ’x '‰(ƒÉÐqL†zÔ”¤a†T:‘$DzJßüöÛoß|óMÉŽì)Ê Ú‘ˆCÙASæ b#]Iï~Úb…d—ÎV‡\¥Æ˜éuñ„C ó2w}ôQœ¥îƒÐ–eG%p2Ó$  (RwŠÔq1›m.2ÍÜŸŽ×º¡Àì>TÜ Øš‘Ñâe9LK’V x§vrüà¨_¿>rúBõÀQèrZ–c[–Š;8ne oJžæwÞ¹oß¾£CXÉFèQQrÉÃ?ªÂ8CO1EÈ7qD”yÿý÷±WK^#ÐÆ4ªûÜtèVš$”&ld“xŸ &@ÚÖ]xçÕW_Å~+-l OФ° uEÜ î¿ÿ~ü•"t[t·ÝwßÝ­Ç¡÷<ˆ;K—.õ SJÚ¬¦=$@$@$P(î…›rn¤>  ¼0 J“¸cêÁT×0“€lª™el¢?Üe"waêd¤˜˜q –Ÿ˜ä–ÌÌt<î˜2]“èGR‚_¿Úih…ï"w4«öøÅЩ%‚ƒ\Bí v·ßfL·>«LH¥˜KIƒ‘» ¦_yHCu½ÐÉ£ÏxF²ošÒnS·n]‡d€ƒÏq´–¸}ym ewÜqºKKÎÒŠQâQÆR…qOS”à)G¢u Í`K”©Â@ –0$´ª6Pj°“KñÈ…Ä=@ªÌð’É ¢’Š;÷Þ{oµjÕÀíØc w† rÈ!‡¸ÿxS¡B…æAÙAˆœŠüä²" €›ÅΊ-,·¥xÂJ¸c*;¡:…ÍßÞusÙšMÞ·ˆ¹»óÛ^Ü1•UQÁÅÄЀ2)`c†ƒ‰ýäW2g¥»Ã¤àò~âŽå³BÝ*iy†Ùhž<£uažK±!@× žQúŒ«¸c³åÊæqŽ<¢äTDÄ{7oÞ‹‚#wDÜAZ\<ð@•*U¤äl–“ÐJ †@4Éþ‚ £@(q×ð”ýbZMah8æÜ´Ê±±+ 5Ñ­´îÊ•+‘»±AßDwj! @ŸÂ‘ó˜N"î hH55è;<òˆ§¸3qâDÕUM!T 'dA¥Ê²ƒ^<9Ó•– @ PÜIc‚®Ä‚9ò\ç¤CÜQekËÐ3¼…xè*TUsKQh²]*;"2¢uar„®öÍU±ÄkäUQÜanÛÜKåà82e¢Åܧ…ëB@j´ â;MËÑž&40jE„.¤X´d1:¨Pw{Nc“ªç!bž{¾ð$­»P/û<ª‘S»µZ›]~~ÏxäQ$¶"NIGjd‡Ä³×^{a×OÀ¶,SÜ€³´°{%ÒNƒ ärÙã…¨¢gžy;¡ìy"j)ýlÀ§™n;2Å&³Yè>ÚD%9 DÜÁ–7äÍ>;î¸#4¼ã™P¹}ûö(àÝ5j„CÓó&ë #¦R¶Ÿf,I$@$@–(îX‚Jy1wâ÷€õÀ`ÇJ5⎮N±œ³ýPµÂseè·ÁD×~~»iTfrDEë.ÂÄ ]í£M]ÓÚ‡(ä€( Ý„œØØ^˜~F1¡AîE»ê~Á;ºáÎ’džsî çîB¬ßƒU3¸c>Dî.Ô×îâ/¿=Y:ýâøô¸zG ¡±`~Ïx„!$¿ÊÆݧh!Häšk®ùtë%G¡›9wâ2³àB™«¯¾ZŽKÇ…\ˈ[Áð%-q,Œ‘mPxAƒÁlqÄ•¤×A¶c¿Þ‘ {µ07Ijg¤yv·f†ÿ âž ZÅo¼q—]v,8n ú”gBå»îº«jÕªnYgŸ}ö‘ù”uÐr?ÛÇ4ÙÐc    ¸Ãi°€.H<×Þæñ½Ž¥NÀ_ÚCe‚Ðî5¤åØÞ¯¦°e¯ì }­èi’®ßÜJ̽hÔX÷‚3rwö(¤d¨S4ø(#_„rVbö͆š:v˘5mG Ï©¢œzVßñËŽª 8†qè¨Ý!Z§ÈËyßѺ õµ»€Xè7ßBç¹Á‘xK™x¶ðŒGB±T|àβüÏþ2J¨¸cêˆU¹ì²Ë$×2®.]ºÈqZP Û’ý…¾ä\*$Z–ø ÷yå…^_k›6mÒ~±mÊ´ú‹$lF¤ÒÚµkýœ…ì«’’/¾ø¢ÙÆ…ÑIE4ó^„€ wFŒÃæE­ZµðµãyZÒé\5Å(e‰Ê³¬ƒî Ê…jgÅ2±i' $ŠÅD¹£ÆèÚ¿üa!jࣀH SºÅ\ô†®½C ˜Ddɼò×ö29´ÐdÒéÒ/LbÁ:…)s˜ÒÞ^êGëƒ,–™wƒ¢I2O‚‰9„-sï››éÐLxd¶c£C…· Îói4³›Úœ9sŠjp‡à2ÛÄî?u·¥kP=T܉×Ýb°9jÓ;ªb` îÐ$S6÷{¢d°”­;MärûÎs&ÿ€}mê ln ^3?5+šNÏr?]!ZDê"Ž;Ër¹råî¼ó΀ÈÉ¼ã¸°Û gu‹N±Ã;ôêÕ ñA1J<Øë$R „æèp¡ÂèiV±gM!F¶M9Ì€ôƒGF• Cx;ätü1>¦N¤éuð‹°—MÄ—^z©I“&Ba;xdÌÓ²4rç¹çž»è¢‹ÇœK­ /¼0ŸéuTBBSíDz€X‰H€H€ PÜ gT:%t£~óêë\º¼‘7ÝK8óìpù­Qÿ¼ªÝ„ˆ îˆ –âŽn’2ÿžé÷Ú½h4•71¼ãg†5(j“³ßÆ¥hÝ… 8fx°SÜî@çVâÌ? {αÐTÖ¦µ¡óG©ú9Bí±œ0èÝÔ¡<îxFB+ûH%KqG#U°»Ý_ 6‘;¹w`‰§ãÀ!8¹ßØCÕL»ËTܱ<Ãó—¯ÄàïnˆðŒ'èçAnLÁ9ß+Vt<>P+:v수wì/L?¨*ñ ŠG6jA¼’å…½TÐAôHrsŽ}O´YsÛ”›–H¶J$@$@i&@q'ÍÞ<6¬g°æÄâ ëm9Ž'ôìg¬¬d‡þ†¯ë[9ú: &"´€9i*x.eì£0`ªV±yá‡Tˆa(gÙ‹À%œñ_Îb@FÝé-õ‹`§è§6¸üzÄtÂ`eàBÌÒ6ÿÐù:B w6ß“æWbFª9Õ³qº‘ET»¨tW‘©Aì½÷Þ˜TöÊŽ–D-•x°Q«U«V’n9‰GD()¦ cžJLÞ´ÂôˆD’ˆY™=u"9打õBá#æiY¹#O:é$·¬í¬sç· ¨ìà„¯"š¢4•H€H€Š‘Åbôm&  â&€Jî8ò j…ìÒÊèÂ.§SO=U¥ œ¨%:»#‚&ËpTÏto‘lÓ~!át0Ó M¯ƒ’_}õëè…!4oÞ\…E7ß|³&T֣Рû°:tè€neç´ÓNƒ¢T@Y]K8UqÏWZO$@$@‰'@q'ñ.¢$@$@$FáÁ‰Wn=›úöí $Â…d×^z©šŽ,Î8.J$DÄ@dÉþ‚Š„Œ?ö‰± Û»<ûUYB3áF¯®]»ª^sñÅCÁÑÌÈlתT©’ãA„ŸÂÊ:TvÒøàrL$@$@ %@q'¡Ž¡Y$@$@$P púUíÚµÝÚıÇ‹}F’N8Ó )Н½öZÍPS½zõaÆaWT,…޽QØîgfÉq; g~¿ñÆ’^Ç!î ¢³À0ÈXÐkô2dÈ^{í%Lêׯ('óSyÈI“&Õ©SÇ®B… ·ß~{Áe€¼EŒÙ)…§˜c$ HŠ;Iðm   ’&€P9ʼðÎ5×\ÃÌ+œÑkäxB’i‡j™—³ á#‡g!Ý$ OÏak•”Ae®Ý™²Ä&œ¶Ž¼ÈzM›6í裃+W®<`ÀóS}üpœ¹gzvíÚä˜s·–e§¤ç4O$@$@ù%@q'¿¼Ù €dfñL´¼Ç{ 4G¾ ²˜'ý!ìÕ’sµ¢]Ø–…˜#ÉŽŒZ¦LÉO>ù¤D÷@g1Û7ÃXcx¶qá-¤‚Æç’^§S§Nhß, ¯¯»î:Ïô:ÇwÜŒ3’°6lØÀiN$@$@$OwòI›}‘ ðK´|衇Ž9ÒH„¬W÷îÝwÙe‰ÄiܸñóÏ?o~ª¯q–ùþûïïØÙgŸ}'!²Ì@ÒhÎr   < ¸“gàìŽH€H€H ˆ€_¢eˆ'žx"4šLe³<â_î¸ãHE*‘`ß2ò ÓÈÏÊ•+Ç/ò *ÇSÖÁ!Y“H¯Gy¤V­Zb ^àŸæ§úzÊ”)Ǽ[ÖAêhä]NެK iq~“ äŸÅü3g$@$@$@!ü-CàÀéà8#Ü<2<Âë©S§¶nÝZ“.£Ù-Z n<Ë“é&Nœuì¨û°$½N%× é¢5j$z ÂvÙüT_¿þúë—\r‰l×r\H»SðcÎM]iÙ²e?üðg6 @APÜ)vvJ$@$@$Nj κòÌܾ}û·Þz LJgyÝ}÷Ýf®ŸŠ+b“”n×ÊTâÑòfz$ V¥Ò!ÃxÑkð_h73gÎ4 èëÞ½{ëv-ÂQG…¦Dì¬Zµ I£Ã=Ê$@$@$@¹!@q'7\Ù* @LÊÊÊvß}w·Äƒ¸lJÂÞ¥²¾^z饫¯¾Z G_Ø®•:K¦<¦¬ƒHœ˜J/œ V©R% R O˜0ÁüT_>¼fÍšî!ã˜ó&JÖ1ß|ó ãŒ3ÌŽ˃s¬CôÓO?ɦ­€K Œ§¶¿i\Èy|Øa‡‰^S­Z5sn~ª¯±_ ‰Ÿ=ƒ•:wîŒ6¥ì`+òCçm°#   ?w87H€H€H€ŠƒŽ£ÂWnáïpÀØÄ“³¥™!C†œwÞyPŽ´»vز 4šÕ«W»õ%ˆV¬X\9zá-4%íì¸ãŽ8æÜüT_¿øâ‹W^y% ¸xÚi§%*½ŽL8ô)¢‹cêÐJ  H;Š;i÷0ÇG$@$@é"€„8ž±-Åsýõ׿ûî»8k<®ë‰'ž€æñÈÔ\j×® Vˆ£•G#Â[«UG¯Ž;ª^‰y”ÍOõuÿþý"ä–u:è ±cÇ&*ZGŒY»v-·b¥ëÁâhH€H€Š›Åâö­'  Ò$€l8 4ðŒâ)W®äd)žë5mÚ´=z4lØÐìùžOlÞ¼ÙpŒ—^H´çž{JaˆA#FŒ0?Õ×£Fúç?ÿé™^Gh%PÖÁ±_?þøciÎ:ŽšH€H€K€âNb]CÃH€H€H€B tO‰Q{î¹8UjvÜt¥;ï¼óôÓO‡Š„®o¹å½l\ˆµ9æ˜cÄ*Äã`¿˜ù©¾FzsÎ9ÇÓøË.» ‘GISv–.]º~ýzìð±$   ¸“@§Ð$   @âñ‹âtÒ¸qc¨-8µ*öëŠ+®@û8f éräzúé§[´hasŽ„;ú©ùµþñ¸•¡5cÆŒ¤É:°™†˜a'ƒIÉ¢$@$@$_wòË›½‘ ä†6:ùåâ†R§NAƒ½ëÕ¶m[´ŒC¬°L®³Ï>[ôìÞ?~¼¾o¾¸çž{öÙg·¬ƒ7‘­9²öañH¬ÜÌY¶J$@$@± ¸J6D$@$@$PpØ!…“Ë=÷:áM¤ÈéÞ½ûK/½„ü8Ù_*î¼ðÇuÈ!‡ —o¼Qß1_ 7óÑGí¶­|ùò]»vMÚ1ç"3­[·î_ÿúWÁÝJH€H€H€‚ PÜá !  H$9îÒ¥ /÷KǃÃŘ¥¾£âÎó\"îÜ}÷Ýú޼@z‹/¾X¶k9® /¼0ÇœËyX¿ýö[ÚfÇC$@$@)%@q'¥Žå°H€H€H ä à`ò^½zy1. K¥J•:t耴88==ÂÕ¦M4Ò©S'´ —ˆ;wÝu—¾ƒ7ÜpÃßÿþw·¬sØa‡M˜0!iû°5Ñ:¿ÿþ{ÉO   b"@q§˜¼E[I€H€H€2%€Cʇ † Y~{µð~ݺuqî8"h2ºTÜyöëàƒqGÞ¸ÿþûkÔ¨áî·B… ˆ¢¬“©+YžH€H€HÀÅÎ    ’ 0}úte ñì²Ë.—\r 2ãà°s›«uëÖh­cÇŽ8p].wpPúèÑ£O9åw_Ûo¿=0'-½Î²eË6lØÀÜ:%ñp$@$@)%@q'¥Žå°H€H€H€¼ OYY™g@j15kÖD†cˆ5o^*î ¥Ž\"îàðõ¿ýíone§Q£F¯½öZ¢v@cÓ¦Mÿþ÷¿9YH€H€H€ŠšÅ¢v'  l ôíÛ‰ipŽ82ÔdÛVQÕGlÎÕòKº,Ò Òâ@åAfœ·¼®Ë/¿\"wžþãòÛüuÐA;69²ÎŠ+¾ýö[&Ö)ª KcI€H€H ˆÅÎ  (]Øc˜ ÷pƒ  õŒ7gŠ—dä9r$rîl×ÂGûí·¶S=þøão—ˆ;W]uÕäÉ“ %ÈÝŽ9G6Ÿ„È:Ë—/G²ä_ýµ<Ë1’ @I ¸SRîæ`I€H€HÀIÂD÷îÝ¡éì¼óÎnmï·k×û˜Ú“nv³pzzÀÑZ§ZµjÐtDåqi•Ï:ë,Omè²Ë.›;wnÁ•U«V­_¿þ§Ÿ~J·9:  (ewJÙû; üò ë0"wš5kæ¹Ã©jð  Òµ¤¢–w9x»¤È@H̓ÿû¿ÿëVvŽ;î¸3fPÖAçÇd>TÎRŠH€H€(îpJ xÀ–%ì )rÓxn\B°B{øƒMQIGÄ4aàžM{¸ªT©òÀä_ÖùòË/W¯^C¯(è¤lr8$@$@$`C€âŽ %–!  ØBIˆ¡ã`û4wlKÕªUS‰ ö¦…îØBzd_ÎÃ1çH‡ 9HŠŒÍV¿ýö[*±sP$@$@$@ö(îØ³bI   m ò `‡@™1,p@º!: ÂÖî»WrGî Æ'­ûÔÒíSŽŽH€H€ÒA€âN:üÈQ @Î @¼@Øòј;•þþ÷¿ÿ÷ÿ7ÄŽO<Û¸rnD:˜6í½C¹¬aÃs‘H’AêJ€]4H€H€H t PÜ)]ßsä$@$@$`C@‚tj×®m†« rñÜvÛmò&âVlšJGˆ;Gu]ïÞO¤c8 @ PÜI9  ˆ™€g’Î@ÄÁaR7nDwDÙôs÷ÉnŽâN²ýCëH€H€H  PÜ)E¯sÌ$@$@$àI HÇqQv ñ”LŠ;¥æqŽ—H€H€’O€âNò}D I€H€H ‡l‚tÝ#~G”¤àÉ¡eImšâNR=C»H€H€H t PÜ)]ßsä$@$@¥LÀ>HǤ„”ÉMš4¬ƒsЧOŸ^š)ß9j  H2Š;Iöm#  8 DÒ1»Gª @ÙÁiY¥|>Å8'%Û"  ˆƒÅ8(²   H0hA:ŽAÙ‘³VÙ‘'ÁCωiwr‚•’ dA€âNðX•H€H€’J Ë ǰ–-[V½zu(;ø/^'uÐy²‹âNž@³   kw¬Q± $ž@,A:ŽQ"NÑ:Pv¹#‡ —øEq§Ä'‡O$@$@ $@q'N¡I$@$@$xƒtC-B†(;È£LeGàPÜÉ`v²( @^PÜÉ fvB$@$@qÈEŽÃFœ‡…S± ì´hÑçdÅ=‚bmâN±zŽv“ @z PÜI¯o92  ÔÈiŽƒÖÈ‘#!ëàjÕªUê@f5 Š;Yáce    ¸“¨l’H€H€b%‡ ‡½eee¢ìôêÕ+Ö¡¤¡1Š;ið"Ç@$@$@é"@q']þähH€H€ÒB ŸA:ftDÙ6lXZpÆ9Š;qÒd[$@$@$@q ¸E¶A$@$@1ÈŽÃpdM†¬ƒT;ãÆ‹iLik†âNÚ<Êñ @ñ ¸Sü>äH€H€Šœ@ƒt<É!ÛŽ?/r¨94ŸâNá²i   H(îDÂÆJ$@$@$5‚éd=‚m€âN‰:žÃ&   ¸“`çÐ4  ÔHZNêçc@wòA™} dB€âN&´X–H€H€"`N$l ­Dq'¡Ž¡Y$@$@$PÂ(î”°ó9t  \`N.é²mŠ;…¤Ï¾I€H€H€¼PÜá¼   8 0H'Nš‰l‹âN"ÝB£H€H€H ¤ PÜ)i÷sð$@$@±`N,‹¥Š;Åâ)ÚI$@$@¥C€âNéøš#% ˆ™ƒtbZ$ÍQÜ)GÑL  (!wJÈÙ* @ö¤“=ÃboâN±{ö“ @úPÜIŸO9"  ø 0H'~¦EÛ"Å¢u '  Ô ¸“Z×r`$@$@Y`N–ÓZâNZ=Ëq‘ @ñ ¸S¼¾£å$@$@9!À œ`MQ£wRäL…H€H€RB€âNJÉa dC€A:ÙÐ+µºwJÍã/ $ŸÅäûˆ’ 䊃trE6ÕíRÜIµ{98  (JwŠÒm4šH€H 2éDFÇŠB€âg @ÒPÜIšGh @N0H''XK²QŠ;%évšH€H€M€âN¢ÝCãH€H€²!À lè±®Š;œ$@$@$@I#@q'i¡=$@$@Ù`N¶Y?ÅN   ¤ ¸“4Ð  (¤…ëD"@q'6V"  È!Š;9„˦I€H€rM€A:¹&ÌöÝ(îpV $Ťy„ö „`§Ha PÜ),öN$@$@$à&@q‡³‚H€H 80H§8üTVRÜ)'sˆ$@$@$Pd(î™Ãh. ”é””»‹e°wŠÅS´“H€H€J‡ÅÒñ5GJ$@EC€A:E㪒4”âNIºƒ&  D ¸“h÷Ð8 ( Ò)_ûH)î»i? ¤Åôù”#" b"À bòmÝJ€â' @ÒPÜIšGh ¤ŸƒtÒïãTâNªÝËÁ‘ @Q ¸S”n£Ñ$@$PŒ¤SŒ^K²Íßÿý[¯,\½zuFíPÜɸ»:\0xðà>[/¼€gQFœ"¯Kð’á/Z´(}c×'·d›>ŸrD$@I @q' ^  $@$Z ÒI­kó>0÷*BÀm½"ë;ha¿­—´ƒguÖ+¯¼<8Š;ñ:ÿúë¯Wˆ# ïÀ§ò>Š·»biM˜sÌ1Åb°½úä–¬síY±$ Ø ¸cÏŠ%I€Hàÿoï=À­*®þÿßó5±„ÄFLL4ÑDM4&ÑK¢1jˆú¾ÁhÔ$"Æ»X°¢ˆŠŠÄˆÔKõҤå_zï½ (MA,ÉÁèÊd—ÙûìSîÙç|Î3Ïáœ)k>kö¾{¾gÍ â H'.)òŠЯ_?™âúçYŠ;R§‘ü¯Î;;ìB܉ᴸYĹ~þ&hqq'î0" üû߈;Œ@È ‚trÑZþ›€c’Ÿ¸Ó A£ˆÄ#RŽQôCù\D‡0W îäpJ¨”:ÂxÁÄa!ÃaFU€ÊâN9x™>BÈ#‚tò—ª“üÄâŽF‹ø×¼ˆÐ£K´w 0Mü”²íާ9öÜ)Õ=wX–U€+‹& 2$€¸S†N§Ë€²%@N¶)›@>"wtAVàö:¿¶8‹ÈØÞ‹ÎhâSäßè¬ä(ˆ;¥âIúÄâòÖ@(fé³wJÕ¶œ‹;!â^ð™q'‡ƒ q'‡0ÓRâNZ<…€@º î¤Ë_X @ ÐÒ)4ñ2hO"b$vÆS%/y/ç%ùWåHXLå+³NJ6g1Gek¸gY–T+yìjCotá•Ô;Lq0Çu_{í-'žxEÓ¦ÝcúÊ6[º)‘Aj¤¼ ì»]³‘<bbIÌÖílÆ~SÖcIà–Õ¦¬œWmº`®Vû…¶g"ñŽíé ä÷GHçšÓÊLäŽù¯¶¢jYýDò„툤ç©;¶Lòs3±Û„ÃR‹‹aWJ n¿x†¨9-,@ÌЫÐsé)o Ö>eÜãA"ÍÖÑb#rX®ˆücÌtq'ÁÅK@‘w"‘€@9 H§½žÿ>KNØU2ÑõÌruè9MI>7–j3Y <÷J>÷tKÕ"Ç‘Xj¤çuýüè£ÏŽ/îýB¬•=g~ëþ>Ž~`#ˆd$ac¿ü+ý ³Ä®¼OùÝçÁæiÔ#¥…9Wr:6TÖR{ôˆ¢  Š2vµJ#pÏ&@$/»ÎÀ¥Rj’Y&/òåwlŒëÎì%W‘;â&÷ qž«,2JŒ­ ©è¨ÝØúâN‚{)E „@Üal@(#锑³‹¬«ªAœy~œÓ²Â&ç:É,q'LReÄVl¹$Ì“Å$RÜ [̨w¨ üÒŒi(Î*ÒŸâ¯Ùáwiюѧ0Âa4D10n‘#¥Ô†@q'LHòR©¸_†“Öý⎪Z‘{‡Eî„yPk¶Õն뚤‚]XL™Ä"»Oc nˆ;éöÖCˆ$@N$"2€@X€†Ý´Nùƒ‘;aSÄÀˆ‰šŠÜ ›WNãÕrÇ4^ ÊL>l+\g#ûx | Æa×g¥[ | ]ÈTÜ]FƒJôM¦ÛKGû° *mQ:.ýŠ„¯RÙ€Fª³’Î/îÄá˜'ÒƒRZÍÎ/MŠ•Ôaƒ!Ò#d€ Ć Ò$@Niú5½²C?dòö \¾'r',òÂ-î8&ØùX–åX1äŸÆ«ãÌöý*ŒCf T[ÜA4¶Æäp®šêá`Y–鑯•˜an,Îu#Ý4爛•t4šÍžíìMjt=š”rlní9]K*—:ÅfÇÞÏþQG! ŒV‹ô``ÛeÏ*ƒ(RH²ó¹gd’€@Lˆ;1A‘ €@ ¤“'•¥‰ö¦-f*è~ÙS¾<‰;žu+·Ô¸¸SµÑØŠ0yËÓ/S­{c¿‚) Ø:H”o½­'w¤köé]‰/,‘WìcËlûíOýŽSí¥¶@É&ì@qiE¿Ô˜LÜ 4#=èw"}jöiöˆ;¹-ÒžÄÞ¤  r&€¸SÎÞ§ï€@‰ H§DYºÝˆ¹£Ñv¸JÎÅÀÅ_öáš'Ù†ÊEîÄwÜvúT¾ÅwäŽùÖ³ïLbqÇ>û\Ä…Œ¶³Q2þ€©ù&pCe›ªä±Ïz·E°(ÛZ’´ëQèŠG܉ãVݗǽá´G"r§tïúô ¨ˆ;5&!dO€ ìRCÁÄY©fLÎÅ8+žT[ ÜN¥âŽ;tHYÅÔ€<ùó´,Ë]m˜‹;Ú÷Ä{îØ‡Í‹Fã·‰?neœˆjc/æ«ÜëHåžXžÀkö‡îai‰ÈHwäN̸0pãP3#í)Ø­‰† ”ÄRò&}JŸA:¥ïãíaœíB»žsqGÃ1±nk î莳î€Õ5"÷ôµgþ&PΈœŠgª1ÙŽN&îèz4³J·}‰³Q±_ ‹‰/îhRDâÞ/I‹Ø;øØ~ôGîhœ‘csmÝVd"=˜!ΆÊþk6Î!nÚe"wJô~O· š!€¸S3Üi€@|éÄgE΢%'¼Â>È¿v EÎÅAäÖn"O€.€¸ç(t[ÔˆéwUaÂöñÕù|Ì•q¦]Û¬˜(1À3ŸO îøÕ[뉉"rH•Øì Ýn9,žÅu% ”Ûa¶ªc~qG5‘°³ÉíM¦³w ³{!-·Ú&EjŽ…”’€@|ˆ;ñY‘€@A ¤SPÜ4–g:ã [¬¡kdçÛ·%õ‹g${"kìc¹Ž{È…i‚žQa. #ŒJÍ+¼"=èÈ`[8ýÑX‚Ès±›a¦ƒ!2*-ÿw#Z€ P‚wJЩt H‚tRá&ŒÌ-O@„}t´¼۱Ş͚¬±*qÇ×Y±m‰Ô¶JÅ1R4‚@# ‡˜!*êDc¿Tè  Ð£ ªò ÏÉâ6U™Ø®~Š/î¸CfŒ1Êʱûm¶gh©ÁFÅœakôÂÁ¸fÊ'pÈ…‰;a£Â£êb»›Ùˆ;Ž+Å Â0yQõ¼öØ,ËÊí –Ú 2'€¸Sæ€îC…&@N¡‰Ó^ñÙ îJ+3X™ÊDÚ­SHȆ)b¢LŸ¤¶.)2ƒèÒ´ Ð0–¸O8’o¥¹k¯½åįˆ¹cŒtÔ™Á³mì”ÏíŽãgÏÌß›DÖ)x…q¢„ĤnkMÍþI¾¿Q‘ ÔãŽQáeFYh«¥z–ïI%’ÇT†‘ãGj3p´ˆ(añDvVÔÍ£—O ¸éÁÈ ÒYÏ tXn–Þéõ¥E"›‹3˜É@ˆ; @y'@NÞÓ H Ó • hZDS3ÿâ1K²' •}ÍÔ@ENq§È„y€@Š ¤“bça: î0:j„€YL爒øÝ|§F,¤Q@¨Aˆ;5Ÿ¦!$@N :•.Aà¿ î0"j„@¤v£;¹WÖˆñ4 @ù&€¸“oÂÔ”‚tÊÂÍtû î0jŠ€nQ,:޽M•ìæ£ÊŽä©)óh€jâN §i@ ÝÒI·ÿ°I î$%G¹l xŽ93Ûç©™£Ð²m†ò€ Bˆ;)t&C5J€ ÅOã¨yéw$¸Ãh5 ’ƒ«ä2[Ð1ûìÈ'òyØÉqI[£ ¤†âNj\…¡€@  H§áÓ4Š@zÅb#‰=ÙÙ[GNC—‰ÖɆ$e!”ÄÒð#½€òB€ ¼`¥R¤œâNʈù€ $€¸S‚N¥K€@–:tèpÕUWÕªUËĺ˫víÚõëׯ¨¨Ø¶m[–•SH;Ä´{û!@¥Gq§ô|J ¬´iÓF5:uê4oÞ|TÅðŽ®³IDATæÌ™YÕHa@ ´ î”–?é  @  é C²½N“&MÒÉ!Rª‚@‰@Ü)1‡Ò@€@ @Ü)'Ò@€ Gq§p¬i € xwâq" @ØGq‡@€@±@Ü)6` @EMq§¨Ýƒq€ ²$€¸S–n§Ó€ $%€¸“”å @ÈÄ|‘¥^@€J’âNIº•NA€RMq'ÕîÃx@€ Mq§ÐÄi€ (ˆ;Q„ø€ Xw€ ÄbóHMÚ³cÇŽi_¼jÒ«íÅ‹‹ŠÄžÜšQl´³é]UUU³/^ò^ª*mßÅdÁ¸^®¸˜õI6s‹HÙEB3J‰âN)y“¾@€JƒâNiø17½¸ôÒKÿß¾×ñÇ¿~ýúÜTš]-gŸ}¶±'»jŠ´´ô«z'ú…q“¾Œ¿ 黢•ÿ”Œm¡¼7¬D +†¡)Œi†¹E‰Ù1m&òAq'T©€ l îdC¯¤ÊŠšc´óº÷Þ{‹¡{… ßßÒw<ÊŽ ù¤`âŽD‘4hРhå¿"wúõë'Æk$[QiR…¿`iJq‡Á@€@±@Ü)6Ô˜=­Zµ2Q$E¥8 îÔØ€ˆ×°}¨ (CȬ62‘ …ñ‰%A܉ç®ÿÊ•QQçÎÕÑ1Å &Qi!€¸“Oa' @ | #zªSq‰Ù1³8™ÎÕ8ÒÞ·¥¨t´d¾V@Âg<5Æw…‘’ÁQ…K®&ϱbØs'¾¸£÷"w –Äs(Ý ”Äpbº ;àši›LÑ5Ã,®á•?% îh@GMEs¤TÜÉß Š_sqÇÞPI—mÖ”¯ãwœÈ7Ä|¦~@€2%€¸“)±ÒÌ/šŽwÌ9GºQHüVK“Kž{UâN︓xFŠ;f3#sgÎf妼w3§`É@Ü)WÒ@€@É@Ü)WfÕÊ ³8ÿZO3² ³,Ù‰ŸÙ¬G^ò^>q¶%ú‘™4ÚE¤ÅÀÈçæ|íÀo¥*ÙrÅ®Ç,%“MvM)£UéËþP,ô˜á6ÛT"õgÔÙÀRÒ®á“@ܱ»Ö}?+=§\¾ÁN¡™@-O~iÂÓÇ@ïKô„5yc>ÑÌ~ßÉö½z\z CÅÍyÞ¶É© 5‹×ìq"E¤ãž±‘éõ#½óP ¥*‡OµÁ N»~±?l™¤ÖfˆùG…ß}f<èb+õÍD¥Ð'5GŠAö¥‡”éˆ"º î¤Ë_X @(ˆ;åàåˆ>êÊ•rôä,÷>µRÐ>`K÷[5ÜÎE5DÈÎlÞKÿÖŽ¸Œ°ªd¦ª«Ì<3Lc­|fy˜Ùffë?J-›xû ×"2åN îØ]ð34~K— a±Çã2{æïp¨TëñN˜ëÕ¿ïD}ÐRDZ)á8Ò@ žÆ_!&¸þE¢r {ùÖ®3ÁiYB&¬~Û~ƒUs‘7žÍqt„ˆ¶Šgƃÿec7Õš«É4GÜÑ<î[Gì@Q@Ü)*w`  @Bq‡aðŸEXöïö‘&[¨€bâ 4nB ÊÌÐ3ÑÕ)¥‘Y¨Ñ °|î ù wTÙ±[צun(îØÙŒ&¬CeØ‘LYí j¼ÝÙ@Pv×´”G$ÊhlÌÐÌÜ[ÌS©(PßQqÇxÒÎÚÇ!™ã±ÍËî‚­ïHU&´D¹Éå¥a ïdH¨¦à‰QŸJþ Õc€iÝ.k+Yö³Ý¨…9n ¶ýv6%[FÉTܱ¶ÔØrß`ÕSÔ¹ê>{¤ÙMØ‘m³ù¯­ô‰çqâ-  w € ÄbóH¡í ÒÑ©~ØìW§îþp ð”Ua¿âF神€Ž@@móûÈtÔŽzwŒ¸àY«bË7þe,: ö¯SÓM\Œí?¨KqO—í°£âŽé‚GN’&ÔNOÇíH Éc&íâzUßlįRé2=ÿ`Кý±6¾“v‡‡íÓÈY6ä°V$Òðó·ÝCvêèò„@q*#qG9û¶Ø£õ{š¶×OIA"ckvžñG¬±9ÄÉoB¥äS¡+ôýŽö #ˆ;9I5€ äŒâNÎP¦´"iû'ç: ÜD•šÀŽ›¨[ Йaà\Úˆ & 'rê®æ@ÃìØŠ0q'pÕO˜ž¥Sî°ùª´3تY ZaÇhÄ<qÁè5&ƒG0²c¦·CRq-l=”ZëQ¾ˆ;¶ìbšS³ýÑ^‘dÂÄHuRõ;|ÉÝ\äHБ©2JFâŽûг¹Ù2-î^ê;sãˆ5™Š;‘þ"JƒâNiø‘^@€J‰âN)y3I_T ðÏùÃ"L3Zйc¦ëkt& (:ø§îqNj `qtV¬ «Ù­%yhh¯#7¥ÖæDî8ôõš€£L˜>( Ù ƒ“Lܱ…{3£Œ‚hŒyaâNäºB)¦X…]H‘#Á,w& Ä]çèˆyÑAeƒŠÜæ&ì”+Ä$wLÊ@`Ä @ÅFq§Øe–¡)Fvuºc¿dmËœgïñN˜Cµf¿èàé4­CÈALóÄÞ15›$@ü•û½&¶ÅW6Çž‡’óK“RP!ØäEØÆÌb›´¯‘°ú¥‰ÈÚÜ„³Eòr\hq²ó¸«Š{·"Š•âN±z» @åKq§|}_Â= —(þF•F7é b&€¸SÌÞÁ6@€@y@Ü)O¿§»×&dƱ?H‚½lÒBq'-žÂN@ „ î”°sé @ ¥wR긲6[µ›À•5º&+p‡ã´ƒCÜI»±(ˆ;%àDº@(1ˆ;%æÐ²èŽž($ñ;öÎ,fkÝÑ9r+œ4ÂBÜI£×°(1ˆ;%æPº@(ˆ;%àÄrì‚}p•ÙÈÙ>`ÈœEU’\wJÒ­t HÄtù k!@å@q§¼\š} <1Z´YU’1;Æ‹FÆ*Ég¥9Lé PŠwJÑ«ô € nˆ;éöÖËñç¤ã9 ,€ ü@ÜÉ[j† @ ÄdÜ(@€@™@Ü)SÇÓm@€@@Ü)bç` @ÅGq§ø|‚E€ r'€¸Sî#€þC€ ÄŒp‘€ @Ü)dš€ @ t /é  @ T 'é @!€¸SÌ4@€@w2€EV@€ €¸Ã€ @ Ø î›G°€ ¢&€¸SÔîÁ8@€@Y@Ü)K·Ói@€’@ÜIJŽr€ ä‹âN¾ÈR¯›À´iÓš}ñ’÷1q­_¿¾sçΦ\üRR¹6'Å/^³9ÉVUUeš“7Òzü‚qrššãä´»Qߥ³­Zµ’"òoFÄl«úõëgjˆijgˉ׌wvìØ‘§îϳÏ>ûÒK/¬ßxP:™S\l2g4H"«% à!€¸Ã€ @ Ø î›GJÜÑG4hpüñÇÿ¿ÿ~É'÷Þ{¯£óRP¦Áž‚òßHqDæºþ椪H‰Gìñ7'ÆçÊCb˜0&Ü&&&ŠŒhÎò‰È[uA@R6£‚â)óGãˆl]„ÿèäÃL…9)bÐ%VÄ"­5Þq{©ÄŒy¹‡z »ã\ ‘v’ð@ÜaT@€ PlwŠÍ#¥lÌ“m¹D§ý*@„ɪ/5ļ´”CpÑ)º¿ Ôà˜·Û²ˆ§¹L5Ž@* ·¸“˜˜£ã‚"#‰JQdÚq#<Ò’ã¿™Vî§j’LÝí©Mô/55âŽÃîx»Sq'‡î.å}ƒ@î îäŽ%5A€ ˆ;¹áH-q¨"#3y{N+siý*0‚Cõ;Ã.8ï•X3E—Ê5\ÅÂèç‹n$˜Âd°íƒÕŒ,ÃLlÉÆ-î$#¦÷„{Dó;QQ$ˆÜ1ËŽÜ/ÕP"X"˜-Béèò¸;²É Elé0OâŽXhF¦Û$[d wrèî8|ÈĆ @ÅFq§ØPÜQU4L¾ÑŽÄÙ¹tn7ôy&€¸“gÀT@€@Æw2FFd"µ ™Eûgàq¦å5GNÎ5lÄ#âDÚitɖѽööÌRV·¿u„TDZHÌ,†’²aarX È%õ$ÞPÙ1NT9ŠÜtÆT"=5¯°:• L©Y{*ÎRJùwtT;võ6ÃLþU/:4p Ø”bº;ÙEM)”-IJu=‡ -Ä¢uM©fŽgvl­&U8 £@µ%RÑÈ;´'Ž–¦ é3±Bö~=FR³Ã<ŒXä¸q‡&™â÷d”/ӱݵÙX'~4“ÚàÞjG|ä9"M,‘O‚PÂŽ- o±’éf¤¸#]0½öG߸G‚TyPšác”5·¸£#6LØŠãîÈ1C@ÀCq‡!@€@±@Ü)6”¯=*(ØNM‹JT7Ñ Ì;–üjIjƒCt …po‘c´»‘âNäP$æ.¥!3ŽÈ#¥§*•[ÜQ’17v‰¹Œ½—³½ ŽyŸÑÌŽm›—iÎè)qÄuþ€÷HÊMXYØ‚A]°fd#·¸£*a` TwG32@~ˆ;Œ @€ŠâN±y¤|í ÜØ/Üøé\Zc("ת˜JüÑ=qÖ°håž@•Èý=–g/îdº»³¨6ZÄ!ލa“[qDZ°"²÷Dô ³,ËV|D‰sµè^N=KõUj"#w²w Ï@½R•5]‘âŽ}*œ]gLwÇaH@ÀCq‡!@€@±@Ü)6”©=:—öDd$îè̼0âŽ',HæÕf!•c—\Û»YŠ;aÄüHì‘Ìöú&ÇéTZ­-¸ÅÑ€LÇý1,~cÜÇZ™üöÑiþm­cÖ`Öê¦Ôò&l÷ o±)îªòòk4î‘à>ÝõØ:T¤¸#ÄìCîÍb1yiß³?Œ¬LïJtáw€ ÄbóH9Ú£Óu™ÖzÂ1â( þp›8óaíˆÜql£S9Štdœ®…Uâ æ/¢“|³ I¦úa[AK×LfO\[܉ì©_Ò’&gÉG‘¹[¶øc´G˜npcc‰w2êµÙô.pÁ ÙÖÆ̶¾£«Ø¤ã­_KÜ) B Ü î”›Çé/ @ ø î¿JÜB[§ðODã( å&Š;žPް³´ m¿î+q'ò˜vc¼†k…&eBcDõÛAY¾õtÙôË_¡ê)žx«ü‰;¦?ÊIÏêòÚDŠ;öò+©Ü¹Øñ¿­Ð=ä™âNžS= @@ÜÉrHÀÖ)‡L¹wê-+q'’˜Û;vH‹G_ÐÔR®Ä¸q¯\‹<é,£(JªER³­…é)RžÄ]q旙”µHqG{'x=1Yº¹c¿¡Œ`’0w € ÄbóHÙc aÛ‚DqØópU+Âö<öÀu,Ër¨5¸,+±È¤ò-™ùw¶ëɉ¸ó<ò8§ÑGöÑŸ!p'iÿÖÑZ0OâŽï+u%𷏣v†C¯úNüƒêà¥ÊâN¹yœþB€ŠŸâNñû¨4-Ô9gàísF*×ìiY™ú)Ί3»Î˜Ä☡T•˜[¾É‰¸£  Ü*C®´3ÿùë*‹îþ“'q'ðtµ-Pât‹;º¡RØ6á "fØ^KqÆ y ›â〠b#€¸Sl) {ìe2Žu……*ŽŽýÛëjHà¶µq`„ˆFµ8~R‘"ÎáPwf$îÄ'gy²©| *@àËÞ ×dˆÓŠ'vÁíñ<‰;¶Æa ³‘:z­_eénÓ¨ÑY<Ônþú­­ŽÅY¦Hàáë \I@q‡1@€@±@Ü)6”¾=ö¤Ú!Ùþýtü€T%±"'½áq”]Aã)"_ÜɈ˜´+º•l˜¸£"ŽûM2q'Ò#J,~N²tÙ™â©V©ÆìuöâŽ]þíoËm"¾õîé«.¤òìW¹x*l#÷–8 ¾bv-ޏ“€˜ja{T«Ì!"1gûÙï¹'K¹© Âb£üÂ\ä¶2:NÜÚ=wŒ7 ÿsχ+#áÄ7†œ€€!€¸ÃH€ @ Ø î›GJÖ-Çœ]+·ZሣÑ9­¯YÇæ¾º\+ÐN ‚pæÇ‹‘âN2böÎÁ‹³´ ñ‘½¸£nŠ#'¹] qF~µBõ °=‰Mÿ~7ažÊ‡¸clˆ\Šè1)æiYaÞ´â Kò@q îÄ¡D@€ Iq§´Ë·- x‘É­L¿Ý‹€<º‰Næ=QR§JSz{ŸZ[SPeÇ¿û‰ñ*òÆÞÆÅ-‹HsfËÛ˜gN»Ålˆ©bŒÝq!i¹Gg1@ÜâŽYe^aC\µÇ¡NvYuP²í”âêt;F>×&<ƒANyׯbºF,‰w¤*Óeÿ^<#!ìôÈ›‚[Ü‘âvx—ǧªìˆ1ÉGÚC@@ î0 @(6ˆ;Åæ‘Ò´Gõ”ÈÍb%ƒ?AæçöM’A^:cwD è¼×Tk—rqØÂŠ´â)(Ÿ_dhãw²$fwÜß…ø,1ÅãHqÇ‘Á?îÝ]ð;]^KüGÜQóÅÄnÑÈjñÕ%)îè–Cê…øC½4o7ô ù'€¸“Æ´@€@fw2ãEîdì‰z¤¾8 —„ÀJ;ËS%xAe [!ÁÈÑÑw4xÄ6Xl‹€È­¸“=±ÀŽÅ!~ÌN Š;Ò´87ÐwaÛÖ„ ’Àø÷HŽŒÜÉTÜ1I°š/RÜ‘Ž˜áêg•ÌÝÉ®qJA ¬ »é, @ wRá¦ÔiçŽùr¬1ç ɼڬ특ÒD¦¾2©–"RPJÅ?Â\ê—ü2m6¹5Yôd:Ó*eèÝœ3)D:nºÓ6I‘ýRφÔÈ š./˜ƒ¢ÜçK=fH~éµô=¾»mÔ›a†©ƒ$§'$˜%„òŠ4>°9CÏß'³íîŒ.Ôß_è Nq§àÈi€ ˆ; @€ Ä `‘€ ‚@Ü)f @ T 'é @ t /é  @ €¸SÈ4@€@Fw2ÂEf@€ÊâN¹ú@(>ˆ;Åç,‚ @ ˆ î±s0 € P¦wÊÔñt€ dw’q£ @ù#€¸“?¶Ô @€@ @Ü)A§Ò%@€@Ê î¤Ü˜@€@a î–7­A€ Mq'š9 @€€@Üa0@€ PlwŠÍ#Ø@€@Q@Ü)j÷` @ , Ûé4 @I î$%G9@€òEq'_d©€ ’$€¸S’n¥S€ T@ÜIµû0€ B@Ü)4qÚƒ @ ŠâN!¾‡ @Ć @ÅFq§Ø<‚=€ 5Ä¢vÆA€Ê’âNYºNC€ ”âNRr”ƒ @ _wòE–z!@(Iˆ;%éV:@H5ÄT»ã!@(4ÄB§=@€¢ îDâ{@€ `@Üa8@€ PlwŠÍ#Ø@€@Q@Ü)j÷` @ , Ûé4 @I î$%G9@€òEq'_d©€ ’$€¸S’n¥S€ T@ÜIµû0€ B@Ü)4qÚƒ @ ŠâN!¾‡ @Ć @ÅFq§Ø<‚=€ 5Ä¢vÆA€Ê’âNYºNC€ ”âNRr”ƒ @ _wòE–z!@(Iˆ;%éV:@H5ÄT»ã!@(4ÄB§=@€¢ îDâ{@€ `@Üa8@€ PlwŠÍ#Ø@€@Q@Ü)j÷` @ , Ûé4 @I î$%G9@€òEq'_d©€ ’$€¸S’n¥S€ T@ÜIµû0€ B@Ü)4qÚƒ @ ŠâN!¾‡ @Ć @ÅFq§Ø<‚=€ 5Ä¢vÆA€Ê’âNYºNC€ ”âNRr”ƒ @ _wòE–z!@(Iˆ;%éV:@H5ÄT»ã!@(4ÄB§=@€¢ îDâ{@€ `@Üa8@€ PlwŠÍ#Ø@€@Q@Ü)j÷` @ , Ûé4 @I î$%G9@€òEq'_d©€ ’$€¸S’n¥S€ T@ÜIµû0€ B@Ü)4qÚƒ @ ŠâN!¾‡ @Ć @ÅFq§Ø<‚=€ 5Ä¢vÆA€Ê’âNYºNC€ ”âNRr”ƒ @ _wòE–z!@(Iˆ;%éV:@H5ÄT»ã!@(4ÄB§=@€¢ îDâ{@€ `@Üa8@€ PlwŠÍ#Ø|ذaÃàÁƒ›4iR·nÝsyA€@R'ŸüóC9úØcOJZå @ 3ò[YY¹råÊ|=(S/ÒOq'ý>¤ˆ"°mÛ¶Fý?^€ @H3zõêÉ–Q¿|r$€¸SŽ^§ÏeE ªªªvíÚiþ#Ží€ @øœ@­ZµZ¶lYVÏótq îÄ¡D¤•€¬Ã:à€x€ @€@)hÞ¼yZбù!€¸“®Ô " P]]íQvþçËûùƒŸrq @€ÒBਓêì÷•ƒ<âT‡Šà‰ P,wŠÅØÜÕȳjÿ üöê\öx÷ëÿYM‚ @€@º\Ýrøñg^ìÑwdÿÜ>BSÒKq'½¾Ãr¸Ô¯_ßþã÷ó.¹©Ýd @€ÒBàú—Ç\vO·ß_ÓêÒÛ߬ÿüp1ûÌ+ï¶qO8á„Ý»w3+€„âÃ%H`æÌ™öŸ½ïœ|Æ­¦ @€ õŸ|Ö¯üå/jºìŽŽbüÏ.¾Î~ÐeóœÌÐ¥Dwa£Š›À©§žªóüÚ¡·´uWÇ©$@€ ¤‚@ƒgŸqæ}"ëÜrË«mÛmÚ´»‘xþtgG±ÿðïü@Ÿue‹IG/î© ÖˆâN@Ó  F@NȲ͸àoÞ×e € @© аã”së>.RÎ#tÞ³çó=pàùDŸ›žr]³nöãn“&M ö¤MC(Zˆ;Eë ƒ@BõêÕÓ¿vG~÷‡v›A‚ @€@ZüåžÎ¢ãÔ«×lûö]ö±‰ß9ÿ’'¥#?=ÿr}â­]»vÂçfŠA „ î”3é þýï•+WÚ¿cüá–Ç÷˜I‚ @€@*<Òmú¯Ï{XDœÑ£çzžîEë¹è¢Çä«»^õ*í‡ÞÊÊJ¦(sˆ;e>è~©hÔ¨ÑV xp“Š)OôžM‚ G»TßòlEFéΗûÇoÑÔ,­Ä/R†9…Ïù¹]’º#²º,~NkÊú f3 ptŽ[º nm>@ä›k®y>ð1½uë·åÛ?\ý’Ô|ìNÓçÞ«®ºªÔëé2$€¸“!0²C ¸ ÈyúGî¬K®nþÖ , \ø×;ì_Gã¼?æÄŸ6ú÷¦í=ŸßÖ¢»©PZÉÒÎT¨ýÈÇ»MrtáÿþþP:ì›ßiØj€!&ïù5[dNu]¡¼—‚?jÎ8cÀSG§z|b< Iàÿþü‚È7²ÃNàC÷æÍÛ÷í¼sÓnÓ®ºçY{[eÎD/îi ÖåâNÞÓ FÀ³&ë–fžë7@ K¿¿úΘ“yÍvìI?ó4ú@›?®ó[ÿçw½ÐÓ”’V²´3½Å¥ï‡õ]Aáè‚ÐJ¿¸à’G2hŽ"—Þô°í5GNõï¹—ÖWL©³bŽ»8ŽNïøÄr’ÀS=fœqÖý"ßxvÛ±§åü,ÉpgóO÷šþ¥ýö×;’*R°§n‚@@Ü)B§`èСƒþyûÊ¿4p> €@ö.¹ösqçð£¾û½“~'Õ¹ð2O»RVnPRÖóù½/~.îH+Ù›šÆ¯ pØoÞÞüMÉ#xÍÝÞí”3η%˜óþø·°ÊÅ)&§©Ü¤@©³bŽ{àè4Nl†@á ÜÙ¬¯9þÜñ4ܧÏDÉsÅõ­Å¼ãN>]ïu7ß|sÂghŠA $ éö¨_¿¾þy«sÁ¥¯Z@‚ =ÿ»î.soùþ~–¸¶#öiþ½ÜËT.­$®<Õ¯ ëÈ]O¿)ˆ„¡ÉPÿÞg ´SÏýsÌ1Ì PÎwÊÙûô½ÔØîüýÁç_º@ {õê.î÷ãŸ'®íˆoíUü5<ܪ·y.—VWžê‚ŠWP„uäÂ˯·éµ¨kxÊ¿E¶èh¨^ÿ3?=koä”RþÌÊ?Žs3Êœj§`< PS.ª×L„›éÓ—¹ÓÏ?ÿÉöJßÙ¾ú_gfmذ¡Ôžïéb@Ü‰ŠŒ(n²‡œþp!ožzcp‡á‹I€²'pÙõw›ÛËñ?þyâÚŽÜ'Føkhòê[¦ri%qå©.¨xEXG =‘ùD^Í; õ—ªû§ò•äiÙcüÕ·769olÔŸS[Ã_•ÍHHµ³0È+vƒœµáŽy¿ÿþ"î<Þz„ØóekÛêêêâ~`Ç:ä‘âNáR5 I`æÌ™¶¸ÓeÔ œ¸¢Á=æöòÓži…íÞž%Å%Õþö1Rƒükþ{ÝMLUO¼ö¹¸#Ê~¡ó¹ýI²™$-šÏ©U¯ RDrj©Óξà–[Q{ädж¤È=O¶1EŒ…b‰¼7•kÍòæâ+ȇn“¤¸m¼×þÚåCÉ)M¼R³iÚØ¦Iš3ôžë4L?”̦T`O•¶ä—R&§4ä7[l3ßÚ•+Ùê¬lF‚K‚ à'ðjŸéŽCÐíçjs úÝMzH%G}ç{ú ,Pòñ›¶ PTwŠÊä*+ÿ•*äº^J‚ WÝð¹¸sÂɧeZáS¯ÿWÀ¼>kUšAZ¹äÊl‘ÚÎܲó°À¦¥ˆ2ü¯Óu¡¿ˆ6'oÄ»”æ7Š=·>ü\`åò¡|hOX©Pš“FíRÔO6©S¾’Fí²_ìbòÿæâ?y,y­ÏDc¶À1_©Öã·9ì+ó¹ÇãJ/›‘ `3Eä‡Ê„ÀsoŒ‰ÜMÙ<+›=•ïz¤BÈœþ…D.w­&Mš$˜¦$RNq'åÄ||A yóæ:1øé/ÝgÜ2 œøË ÍíåÄSNË´ÂWº —R’L ßüö1æ¿¿½äO¦ªgÛõÕ¯´iQÒ/}¡ÞÖ›–J´¬d6¥þð礕0ƒµ9­\2›üw>ú¼1Éü×Î u{´fyÓ®ïD ©Á6ØØ#Éî¾ ¥Ä~ùʶÖÀhvÍÆ%¦_™‚ò¯ÇŒî~̘Ñô宿+å©Ù¦á©ÄTîÁ®ùŒ-+@2Eä‡Ê„@‹¶£D²yä‘ΑøN‘œ nm+d.½úf½÷^uÕU‘eÉR%€¸Sªž¥_eGÀ>*ë·_Þâ  œ¸æ¦{ÍsóI?9-q…G½W,ð×ðÂýõ¡\ò4kÕÍnBþk ÊKrÚ_ÝÔðqó¹dð|%Ù.øß+Ì·òÆ.åiîž&/˜oõ¼×¥¸´â)®ßz¾jÓ}¤~e×fŠ«µ~Š×ß SÖTë¯Sª2Ý÷8åŒs~çù\0ÒV CåþRz F‚–õØxDQ(=O¾¸w±UÓ¦Ý#ŸãeÇeÉù·›_w>ü¬þ9÷Üs#Ë’¥Jq§T=K¿ÊŽ€-î\qÝ-ƒ&¯$AÈ ënù\Ü1’Ad:óÜßùÛ5bÁ~ršç«—;þGÜiü\[Áßýß•æ©]̰¿U%åé6Ý”¶LÁ¶½Fi»¹{kXPkö´h2K)S­§/Òë@;µ íÈ?î{ÜnWñŠm~{ŒÁb’ÿ«ËþúwÓ¢‡@ êÀÍòU—·'{êÌoÓ‹aޤš“J%€@Ú 4~¦R$›¶m‡F>ÇÏ»Jr^ùפËw?ÚBÅ:uêD–%J•âN©z–~•zõêé¶kþ~×ð©«H€rBàúܧ·—8o~|êéþv¿uô±RÖÿÕ«˜:%C µš~.¦ˆšá¹×º›Rgû»°>Þ~S“çOWߨy"›“œÆTù·Çà)þÊ;ô©2Õzú¢¥Âì +¨xÅ6Y1>›äÔ¾vPºo×&Öú!‡9E!xú¨-F¿7µ¬íÇœŒO*J†Àƒ÷ɦ¢bLäsüúõ[$g½ËšKßõ/‚ÜšŽ9æ˜È²d€@©@Ü)UÏÒ¯²# a¨ú´}ã팞±š@ 'n¸õsqçÛß9öäSOL×»Òß®”•{””õ|õz׿ÞåÿÊäÔ b†–½òÚ½’‡¼ì=5w®ü\…±kŽlN*1¦Ê¿aôü}yñõî^˜ªkV¼b›¿E1^j–þã·DÉH÷í"ÚÊÃO¾h>W>•úKéEŽ„_ýæwaŽv¸,'ÕJ ô¸ó¾7E²‘ýt"Ÿã·oß%9ë^ô¸tVïÀˆ;‘ÜÈPÚwJÛ¿ô®ŒØâÎCM_?k- €@NÜxÛýF¹8å§§'®ÐˆþÚwd*—V+Ì õ¨Iò>,™<Ò´ÖÙœä 3U+ñgPDò•ÃSP^b†Ö¦eí=m~%y »ƒþOLUÚñK.½Ê|rσOc^i×ÓO>‚V’`$Ä!ŸxtQ( ·ÝÕ^$›‰Æy‚—œ’¤ãr3w3óŠS–<(IŒþ’t+*G²ÆXÿª=ôøóãf®!AÈ [ÜI\¡ŠžÚu{[ÅÀÊ3¨¸c?Ї½—¦µæÈæ$g˜©Z‰?ƒ"Šcä3´6-kh¾}ôÉv†ýîFO˜MپçÛ.©w•¿ˆÆ ™¯~}^]G唞ðÏt$Ä!Ÿiä‡JŒÀM·þ3SqG¼ÜöóØIÄrœÑg‹âÃ%BÀŽÜ¹µaãQÓW“ ä„@ƒ/–eÉ¡Äê2O ¯uù|Y–´Xy`³XI^‘kÄ$ÃÙ¿ùÖÙœä 3U+ñgPD‘때ÁÞªÒÚ´¬Øæ!pQ½½›IÛö{2H=†ƒ¡÷à{Å y½ðz?L©Ç¨9½†Nìf ¥—`$Ä!ŸxtQ( wd¾,K:.w<Ök×®]"Oöt™@ÜÉœ% P”®ºê*ýÃ&*›²Š@ 'þvËç{îÈöº‰+Ô½{=5´þbCei%°òÀ f{`yÉ·™ÙœÔfª6äÏ ˆÂzá0RËúûbºí¾¦Žâ¶1u÷,&ŸæàñÏ·¦nѦû½?W…Â*„ ôŒ„8ä3r%™!Ò#é†Êÿߓᱯë30*å4£ Dq§@ iù&`…þ—î|{Ò  œ¸öæÏB—ÿW¨Gk{jxéÍÏB—V+ÌðÇ/N+fgdsR0ÌT­ÓŸáéW»™©EDŠWl³Í~½çH©PÚêbn%c$;âÛì‚æs)âfnPH6)nl#iwíüK®pWAé% qÈ']„JƒÀ/¾-âÎ3ÏôŽ|ž>}™ä¼æ†VÒñ›ïû|÷1¹­É6‘eÉR%€¸Sªž¥_eG yóæ*îüâWô»Œ@ 'þü÷ÏÅN9-q…ßüö^ÝAþõÔðLÛ¾æÞ%­V–ÁT(¯w?XP¬õ×ÙœTejvt60Ã/~}¡iÿhÏÿ]uƒÉ 9í Š÷öGž·?7öK)7ó×+'{¤]SÿË]‡‡16H~-–3°J/ÁHˆC>ñè¢  Pž}}”H6M›v|Ž—ãÒ%çõ·¶•Ž×ûëÍú \¯^½È²d€@©@Ü)UÏÒ¯²#PYY©ØŽúÎ÷*ª–’ ä„À•7Ücn/?<ù´§þY3yš®½O€mÙÅþJj3•K+Ö†eøÛMô¦'ï=esÑçJ‡´˜Qs’Ù˜* £˜á…ÎÃÌçò’Ö=emk=¯§”©Í“9Ð$m×v8]jShòæÖ‡žË¨ê œ° #“±J%€@ª ´h?F$›[ny5ò9¾OŸ‰’ó¶öþA9ó¼KôÎ&‘ì‘eÉR%€¸Sªž¥_eG`æÌ™ö#{ûÁs:\L‚ =ËÜmß^b¾oÚæ-»éüøçZ°ö·¾+ÿ5ßJ6ó¹´hª#Ã9¿¿Ü®ó¢+H%ò¡Ô¯Ÿ?øBg»ÚÈæ$³)®ú­ Ëpóƒ-l{ıG¬²íñwS,´KIf©Ç|(ïã¸Ïæðó³/pQcäÍË=LJeì£ÒsÀ «0ù8% PÂZ÷ž&’Mƒ/G>Ç·n½w×íuß9îD½‹VTTD–%J•âN©z–~•mÛ¶Ù3®&m*Û[D‚ =?þ-‰¸Ó¸u»éÛõHKs‘÷æ[Éfî]ÒJ ©î Rʮ־ ÿãŸßߢ“§ÎÈæ$¿©PЇ¡sdðtÓ¶GJýõ¶Gë”¶ìœÒ©_ÕÝ«[9l°ë¹áÿl&*ïÝ×¶Ü•öQéÅ4̶$ùìÇ*5@©&ðú ùgžuÿ¯~õÀž=Ÿ¸åï¿¿ƒˆ;¾4DúûÕƒÑ[huuuÙÍè0¾ €¸ÃX€@é¨]»¶þm»®áSÿ²@ { ŸíX¯þ]™¦—+§{šnÚ~ð…—_Ü~.IÞ˜ ò¯©YZ 452Ã³ÝÆþùÖGMµG|ë»òïOÏ<ÿúûŸIV›”2öHaè"3HëbƒÚ#o¤6±Óá É`ŠÈ¿ÿx¬µ)ë°ÁS•zÇÝ“S½)­8ì ì£ú"¾aÚD¤³¨Ô”‹ê5ÕfîÜUîôóÏD²=ß}ÊSGØâ¸üØY:Oöô@ÜÉÙ!PÄêÖ­«Þêœi«· @€ ×ÜÚVT›ŠŠ1Ž'îõë·Hž_ó têª[ÿ³ÿÚ©§žZÄÏ阼@ÜÉ;b€@Á´iÓFůxpËóH€ @H ;šUŠps×]mÏÏf7åË®}Y:uÜɧëÓï]wÝU°§n‚@@Ü)B§`X¹r¥˜zwË^-úÎ%A€ @ šuŸ~ƾmw¶oßö@,Çií=*ë‰Ê¦]'~i¿ýõéWŽŽMø M1”Ä’p#€À$UÿÂóÇO½5‡@€ ´¸øO-D»8pJàþæÍÛEú9ãÌûï6íòÛž`æAPˆ; ”&Mþ³ðø Z‡=Úmòã½f‘ @€ ×?ÜSÄk®y>ð½cÇ‘òíÿ]ý¢ô嘦âιçž[RÏôt™@ÜÉœ% PÄ6lØð_çéÞñô£Ýg’ @€ wþëógúôež‡n9"ý¢‹Û»&ë¹!·¿ò¶ýÐ[QQQÄOè˜B@Ü)eÚ€@! Ô«WOÿÔùÝ6ê:@€ ´øËÝEÁ¹âŠgDͱŸ¢Ÿy¦·|~þ%OJGN¯û}â­]»öîÝ» ù¼M[(Bˆ;EèL‚@Vd39ûwŒóÿö`ÃÎÓH€ @H»ßœòë󛈎óÈ#õ±xôè¹ò‰¤žtÍ“ÝìÇÝFeõôLa”Ä’p#€À°·Uþê×½á¥!w¼9•@€ T¨ÿÔÛFÊ‘cÑeså–-û™ÿ^zs{±ÿðïü@Å8@ö%`6 î0 P‚lÿšñ“ÏøÇ“I€ @H ¿>Ö÷¬_?h4“þpS;1þg]g?èÊq"%ø4O— 9ÄÌ™Qi `ï¼#ÿ~pæÅo;‰@€ ´¸®åÈ?Üöæ—·øßÛþµÙÛböWÞe+;'œp»í¤aj‚… €¸SÊ´ÂðÔZµjÙü¾õ£:—>Ö½þkÕ$@€ ¤‹À_^~ÜÛ·ò¾ªªªðÙ´â$€¸Sœ~Á*ä€@uuµ,B¶ÿþÏ—÷;òøŸrQ @€ÒBਓêì÷•ƒ<ÊN‡rðÄL(ˆ;¥âIú ²ùŽGßñüQä¿€ @HæÍ›óøØw(q­Z»víÔýÁÆ`@€ ø ÈÎ-[¶,ñ'xºÌ îdÎŒHmÛ¶5jÔˆ‡@€ ¤š€œÂÁçi›‹`o î4Í@ Æ ÈBY¥%§EÖ­[÷\^€ÒLà‡?<åCŽ–ÓÜ l‡ ¸ä ¶²²råÊ•5þD(Zˆ;Eë ƒ @ ˜@Û¶Cùˆò/€ @€„âÀ ”@ÜI™Ã0€ <@ÜÉ3`ª‡ @ ×wrM”ú @H7Ätûë!@eHq§ N—!@p@Üax@€ 2ˆ;)sæB€ gˆ;yLõ€ äšâN®‰R @é&€¸“nÿa= @  Óé2 @ˆ; @€RFq'eÃ\@€òLq'Ï€©€ \@ÜÉ5Qêƒ @ ÝwÒí?¬‡ ”!Ä2t:]† @ÀAq‡á@€@Ê î¤Ìa˜ @€@ž îä0ÕC€ kˆ;¹&J}€ ¤›âNºý‡õ€ 2$€¸S†N§Ë€ 8 î0< @HÄ”9 s!@È3Ä<¦z@€rMq'×D©€ t@ÜI·ÿ°€ P†wÊÐét€ Ć @)#€¸“2‡a. @y&€¸“gÀT@€@® îäš(õA€ nˆ;éöÖC€ÊâN:.C€ à €¸Ãð€ @ ewRæ0Ì… @ Ïwò ˜ê!@È5Ä\¥>@€ÒMq'ÝþÃz@€@@Ü)C§Óe@€w€ ¤ŒâNʆ¹€ ä™âNžS= @¹&€¸“k¢Ô@€@º î¤ÛX@(Cˆ;eètº @€€ƒâÀ ”@ÜI™Ã0€ <@ÜÉ3`ª‡ @ ×wrM”ú @H7Ätûë!@eHq§ N—!@p@Üax@€ 2ˆ;)sæB€ gˆ;yLõ€ äšâN®‰R @é&€¸“nÿa= @  Óé2 @ˆ; @€RFq'eÃ\@€òLq'Ï€©€ \@ÜÉ5Qêƒ @ ÝwÒí?¬‡ ”!Ä2t:]† @ÀAq‡á@€@Ê î¤Ìa˜ @€@ž îä0ÕC€ kˆ;¹&J}€ ¤›âNºý‡õ€ 2$€¸S†N§Ë€ 8 î0< @HÄ”9 s!@È3Ä<¦z@€rMq'×D©€ t@ÜI·ÿ°€ P†wÊÐét€ Ć @)#€¸“2‡a. @y&€¸“gÀT@€@® îäš(õA€ nˆ;éöÖC€ÊâN:.C€ à €¸Ãð€ @ ewRæ0Ì… @ Ïwò ˜ê!@È5Ä\¥>@€ÒMq'ÝþÃz@€@@Ü)C§Óe@€w€ ¤ŒâNʆ¹€ ä™âNžS= @¹&€¸“k¢Ô@€@º î¤ÛX@(Cˆ;eètº @€€ƒâÀ ”@ÜI™Ã0€ <@ÜÉ3`ª‡ @ ×wrM”ú @H7Ätûë!@eHq§ N—!@p@Üax@€ 2ˆ;)sæB€ gˆ;yLõ€ äšâN®‰R @é&€¸“nÿa= @  d*îìÞ½»¢¢bðàÁeÈŠ.C€ PwÊÁËô€ PR2wÚ´iS»víÿ·ïu 'TVV– :@€þýoÄF @)#SÜGÔ#ëØ¯:uêTUU¥¬Ï˜ @€ î0: @HHq§ººúÜsÏõË:ö'uëÖ9sfÊz޹€ @ ˆâ〠”pˆ;+W®¬W¯ž[Ö±¿­_¿¾IYÿ1€ ü7ÄF @)#(îlØ°á®»î ”u~vêzv~¥Ý«Í¿ý­oú3pÀRPЧŒæB€ / î0 @H¸³mÛ¶&MšˆFãnDÍMgí’ ššè> @ }Œ¸ó49æ˜cüÍþûïwÏí L¾niµ#I†ê_)™ý5Hµéã‚Å€ ”+Ärõ<ý† ¤–À½÷¶8è €ÝsD¦¹æ/œYýöºe“b&É|ÅeîÔsê©§rbzjdžC€Ê‹âNyù›ÞB€RM`áÂ…a‡aÕ½àœ1C{¼³lR‚4l@')(ñȑꜘžê1ƒñ€ r €¸S^¦€ ÔÓ¬n¾ùæàð~úãÞÝÚ¼³|r–I*9ã—? lB%NLOý¢€ Ò%€¸Sº¾¥g€ ’ à8 ëèo³ýk-ÞY>%‡I*<îû[ùˆè#ê'¦—Ę¢€ R#€¸Sj¥?€ R"vÖ‡úø#÷¬_15O©å³M¤ ¸.'¦‹ÞTJé  @i'€¸“vb? @ 4 TVV††ÕðÎͪZ¿bZ^ÓÊ…E?:äƒýO­ZµDuÚ½{wi¢§W€ ¤âNÚ<†½€ R' gTÕ©S'pï›kÿzÙì)C7¬œV°´xvÕí·Ô<1½víÚ:t(uoÐ?@€R@q'NÂD@€@™p†uá¹ãFôÙ°rz¤ÙS†]û×ËÃNL— £2qÝ„ @ 8 î§_° € P^‡aýü§'÷éþú†U3j°é> @ Àw œæ @ØK ü0¬ýï½ûæ%󯽻fVñ§¶zúèoxbú]wÝʼnéŒu@€ Cq§0œi€ Ï 8úîê?Í>òÝ5³Ó•žhr߇xbz“&M81¡@€@¾ îä›0õC€ ð9ÇaX¿ÿÝyã«ú½»vNJÓ’ùî½û–¯r°_â‘ÓÛ´ià € @ù#€¸“?¶Ô @€Àç‡ayÆé•=Û§TÓñ˜=wƨo¸zÿý÷÷K<Çs '¦s=@€ 'ˆ;yKµ€ ì%à8 ëøãŽíØî¥÷ÖÎ-±4½zèUúCà^˧žz*'¦sa@€ sˆ;9GJ…€ ì% {ÍÈaXµjÕò˲CM‹æß[7¯„Ó¨¡½Ï;÷ì@‰§nݺœ˜ÎE@€@ îä&UA€ ð9ŠŠ Yˆä—6dWšûîùÇÚåÓKXÖ±»VÙ«ÃÏö“@‰çª«®Z¹r%#€ dOq'{†Ô@€ÀȲ#Y|(gÜô÷kçϳéùå–:¶YÖ 2‘ÓeC" @ȆâN6ô( @€ÀÈR#Yp(a\T÷·3& ßô΂rN-žnrÄ'¦pÀrbºlNÄ`‚ @É î$ãF)@€þC@bOêׯ(ëœuæ/è¾iýB’X·rÖ#ÝvbºlQ$1° @€@¦w2%F~@€þC@âM5j$±'~eçøã¾×©C«Í‘<–/žrçí7ž˜.+ÚÐw¸À @È”âN¦ÄÈ@€À^®Ã°Ž8ì¹gCÓqX0{üŸ¯¼Ô/ŠUVV2 @€@Fw2ÂEf@€ö= ëk‡ÜïmëWÏÙ²q1)Iã_rñmTÔ¡C @ȈâNF¸È @(wŽÃ°n¾±þÂ9¶l\BŠIàƒÍ«>ýôã¼{Ú©'hâN¹_cô€ 9ÄÌ™Q€ P–\‡aýþ‚™SGoÙ¸”“À¶÷V~òñî];·Î«î1´KÃSN<q§,¯*: @È ÄÜp¤@€@ p†uö™¿6¨÷Öw—‘bxÓŠ=íܽsë²YCFöxxX×ûwJøÚ¡k€ Â@Ü) gZ ¤’€ë0¬ã¿ßùÍ61 ²ízÿÃí›Ö,ž0ºOÓ†w{q'•FC€ŠŒâN‘9s @ÅAÀyÖá/´xbÛ{ËIñ ìÚ±yǶ ï®™3ñíç%`gD÷‡wŠc¤c @  é @ ·‡a=pß×-ܶi)&Ûßý×gŸn{oÕ´¯Uõj<ªç£ˆ;¹®Ô@€âc€ ÿp†uËM×/ž?eÛ¦•¤˜¶o{ç39 ëýs'v“uX£{?†¸ÃÅ@€@> îäƒ*uB€ÒGÀqÖÅ]8gÆø÷7¯"Å$°}ëºO?ùè£ß_2càØ¾ÍÆT>¸“¾K‹!@é!€¸“_a) @ ?\‡aUgøÊ˜ŠÙöغæ“=ÊÆÉ«Ž™8ð¹qýžBÜÉϰ¥V@€þCq‡Ñ@(_ŽÃ°N>ù¤®_ÿ`ËjR|{>Ú±kç–õ+¦OúòøÏŽïÿ4âNù^]ô€ P@ˆ;„MS€ ¢!à8 ëÈ#µÕólYCŠO`ßçï½·nþŒªörÖ„-wŠf°c @ ô é! @ÀC C‡µk×þ¾××¾vÈc6zwý²¶¬%Å$ gœÿë_Ÿ½¿iõœ “¿X=¨%âW @&€¸S`à4@¨Iƒ>õÔSý²Îûïÿ[nX»rìLŠI@BuäŒó·oZ8µï䡯Lò2âNMnÚ† ”1Ä2v>]‡ r" ‡a{î¹~YG>¹ü˜7«:¦¢A6! §›úéÇ»?ܶbÃÛLÖq§œ.&ú @(:ˆ;Eç ‚ ä–ÀÊ•+¯ºêª@YçWgŸ1aì°ÛÞ!Å%ðþ9ã|Ïîk—VϬj?mÄkˆ;¹®Ô@€@ˆ;  Q€ Í›7?à€üÊÎ)'ÿè­Þ]wl[OŠO@Î8Ygãê9³Çuž>ªÝô‘¯#î¤æJÀP@€@I@Ü)i÷Ò9@(o²Ë/ëyįµ~qǶ ¤øDÓÙµsëÖËæMê9st9 q§¼¯-z@(.ˆ;Åå¬ 䀜Še‹;_ûÚ×oòðæ«eËRL}ø¾†µ}Ûú%3ßž=®Ó¬±wr8D© € œ@ÜÉ F* #[Üùη_³|áÎ÷ß%Å$ ¡:rÖîÛVÌ9gB×Ùã» îã(Ç&@€þýoÄF @ d ØâΩ?úÞ˜Onßò·¼KrؽcËgŸ~òñGÊ®Éóª{ÌX¸S² ƒ ”Ä’p#€ °ÅŸŸúño=½WßÙºþÃíï‘BlþìÓ÷ìÞ.»&/˜Ü{þ¤žˆ;\[€ ?Äâ÷B€ðˆ;Ó«Ú«|fŸ¾³áÃí›H«óñž7¯_´dÆÀSÞBÜI8ì(@  ,^¼xÚ´iòoô•.¦ƒâN:ü„•€j„@«V­Îz]zé¥Í¾xuîÜyýúõnó´ûHÞ›ºåÛŒz× A)%6dTJmÈ´¹ŒZ)¶Ì~qgÆècû4¯êöØ›×ìÚ±™d|òñ®=»w¾¿iÕò9ÃMë·pj%âNþ³\¿Çï{É›üµ’ fc•çÞb>”W‚ ýE¤òµÉíÖ”’791#í•(F™Zç°/ò·ìÞ{ïÕñi†¨üɈüWUU%˜t¨H©˜ž2˜´ ôKªŠìQâæ"k6äϺÿB,k,ñtAŠG6$yÔ‰†sœRþjMÓ™>Dš3ƒ4-Gø*’õ.ñð‹i-ÙÊâN9x™>BHH@Oýiû?1VŽGR­Ç~—÷¦ª˜ÁÚy˜“R™ÎµÔ†L›KÈ®8ŠŠ;3Çtßï¹Ú¶qÕ®[Ê<}üÑÎýë_rrÖª…c$`gñôˆ;y¼r£°ï!Eõ£·™ªy$'óa¦7œ0†Ü¾r2º FyåPÜYÇø:ðoœCz‚a¥æÉWÚ Oq‘K”’5»H ‚¿ù»ö„ ] ë»ù]'° £T ýúg½FdbåÿÕ*Aï¿øž%g9@Ü)/ÓG@ Äwô9&ìñq'¡².&îÌ×yòÖ}_¾aãªÙ»wn)Ï´g×rƹœtþÎò©Kg ^2sâNÖ#.º™¸­ÄÜ7ÜóØèêršq'§8óXYÎÅ3,ÍËÄÝÈË3ßü§ÝdðH%¦ š'Ê—;vìÐK@›3±?îë"YsyBw+&v5˜×îB`ßíŽK!“˜¿ ¶L\#âŽìxd߼K<ü2ò,™ËâN9x™>BHHÀþYL~…ó¿äa×~˜“ÀÇßÀeYDî$ôJ&ÅâÎìñ]§l׿õkŒß½skY%‘u>Û{Öî«g/Ÿ3|Ù졈;™ «¬òšé«Y‘‘Ș¬lú¢°™gzYäÖN"wrâ©ÜŠ;¶Làÿ¦‘22<ë³D¸Ñáá TÑéz î ßzÄM©Dõ~ýúyX%n.&sOLC1±5&OÇEàЈ 6Éi¦_Å\ce‡ÿÔˆ¸cºi{0Y￘n%[Y@Ü)+wÓY@™ˆó,Ï»‘?TúFÜÉ̉r»Å9*fí<蟷->裷•Gzÿ_Ÿ}"»&oÙ¸lÅüQ+æŽ@ÜI4²’™³ LEçÌE¾ âNBgç³XnÅ#†¢NÚ=´`à¯ú­gͲh("䇤S}¿`‘¬¹˜~®yV¥9“0IKÛÒªìÀ%]Ç$ßz”S0°T ýžÀwŒµêÜĽK<übz–leEq§¬ÜMg!dF ¦¸c*Õ§í˜?»!îdæŒD¹#Ź{Ì™Ð}H‡†S¶þðƒM²F©„“¨:rÖû›W¯Y2aå‚ш;‰ÆTV…4nE&Bî)nVÍä´0âNNq榲܊;‘.\ܵ”ço¢Êša ™u¶ïYÒ•¬¹Hâb§½{ŽFã†)&ú·Û!©híMîÌ:&Çb̘‚¯Ä4©Fs{ H™f0ε·âJÜ»ÄÃ/S›É_wÊÁËô€@B‰;ú ë]lÞ/îÈ'fY„û.Ϻ™%J~Sб{¥öÅ~Öô&UI/tiFü­^¥ )¿HB—dX,ޏ3¯ºçüɽǽõô¶wm^·¸$ÅO?þHdïo|gù”Õ‹ÆÉÞɈ;¥d÷oÔªSô°íØu)¨£y 0Ùcäæ`Î?2/™¸:?2õd4£ÃÌMC›0û„Ý <·/³²Õ”u”Šsû²{*6Ä9ã)ìÎlÔz¤6µ0òÜ(ÄfóÆ(5Ûm ÇÆq'Θ±;n†¥¼RE œ¡òûFÎÛm‰3Ð*Ø­7'M˜»Ã®—‘7†¹[11giÉËñÇ4pÄÊj.ÿŠ3Ã!Î8×}mŒd)î8ƃã+71i×èPö˜IÖ»ÄÃ/wdª(Eˆ;¥èUú@ G2w¤M}àö<óÉͳ -¾Øâ޼ײæ9É,n {vä?`B †Ö»Ÿ¥!ÏæA68í4;#˜™']ÝŒ3fàRŽ\QM|qGNþž1ºcß—,˜Øç£]”LMçßÿþ—ì(´aÕŒ5K&®Y<q§0cÏߊÿgùÈߺöؕ‡å1·½0í7ò¹ã·0p¢èø]]æ¨aM˜}…üMèíK¦‚ž›ž#¨Á}û3«rO¿Ã†é‘ÑÊý½ Cgj“»e %††C ;*(ì~&îèŸ)˜é8w˜(î¨Së ítŒ(csn›süi6Í™¿eòP D*&¦` œj¾Š#Ó„]2Z¿Ó˜ë],4­»MuÞþæÂfÔf“Á!oeÚ»L‡_¦Ã›üeBq§LM7!$!©¸–_?w<çkØÓ dú ³#ÝÁ<›Úý?¥:ž5=smþõ‘Ñ£ìÈÓ^à¤1 ý\”ÉHÜY0µïü)•#»ÄÇÈÖádßÞÑCZ•Ô …OÓ‡‘'kÎþ£&FزŽÉSÜqSkÂòãÇB¥ÆþÔˆ¸xºûΨW‡£wa5¿ä7bJ–4Ä’v/ƒ LŰ_ÉÜâŽy¦—™ƒ.d°ÏìG7O'ì_†å[ûWS{KHôiÈó¹>¥™)„½˜ÂþåßFn÷T ŠI’Ù¬Dˆ³l!;·dP:Sqgá´þ‹f œ:ìõÊÿ¶fQuJÅ÷ì”3Î%fgë»Ëׯ˜&'#îd0hò“5lÿ• Â~©þسnGª ¶îãék|qǾoøÅ_[÷ñ¬Ï²o_òÞþÖV™=ŠL˜¸cŸ³ã‰±ƒh2Š/p¨äR§~ëéµää×bì÷ý3[Û!ÀÆèéCÜQu>WÙîší¯8j‹ßqqÄ•Wì?Éš3ÌátòŠ9²wÔqþ?ßNªö0 ÛQGØWG¤¸ãú•¿E71s‡Émï†kØðËÕð¦ž#€¸Sb¥;€rI `âŽcý‚_ޱgGþ_u«EσWØìHç–¿oëtËS›> þªœKdWW2qgñÌAó'Uzýޱ=›mßúΞv¤'}ø¯}úé'{>زnêYëWÎ@ÜÉnå¬tØA?ö^]é¬/p±EÕȨU(<“ºøâNà~±¶ýj¶g:­¶I[~!Ø>ëÚþ6ìö¥µ® ÒÝIÛ s­#€HŠ„m-쾑JA5Õb{?pJoët¶Áq”Ž\]mËó7"pìyuˆ;îˆ*¿¦™¬¹d²wl2ò <;`ÍüLâØ·ÎðèƒÙ˜š ŽËâüéϨwaÆ„ ¿ÄÆS°´ î”¶é ¬FÜ ›xØ‹>Ö‡=ÎgGaMNÒì¹¥¹ST¡:'w–̲töЩÃþÙ÷ÅëçŽë±ç£ÅŸ>ûl¯¬óáï½·vÞÆÕ³w²ºøsZØ}¡©š¸‚CÕòKÀ«WÄpCçØý*Lˆ/îȬU*qDêEÊ1a1Ö縱˜ÇÙÞv»Cg¶2¹ <:làªxa˜]I ,X0qGòÇ©Úâ¸VâŽ;ˆÆ!îdÔ\²ë8±bâˆ> ´Ä3±02$·òÑ‘ì¹K$65SÊ4êØðÛΦ $½‹TvüÃ/û)[ÂwJعt €@¶ #îÄ™ƒÇýĸ$pv¤ÑãŽrk‹ZŸ­².Ÿ¥¸³lîp‰âÓ³Ù¶w¿»jîÇ{>,ÎôÙ§KÚµsë– KDÙywÍ\ĬÇN.+poœ¬Ó¶°[AXÌ‚^Ô‘³,Og²w"é¸ÅG({3][plÄ£æ%¸SùeOgýg9EnŒmÏuí¾k[‰<°òˆ;v˜UØž»îµ9e%îØÊNL1Bœ+¥äeï¨-H=Üõ¯°ÿ/uáÅsMʼn†‹Ù»HeGÚrì0y/"CY@Ü)+wÓY@™(Œ¸ãøSg}öä-Îï¥þùIàDÈÞïÃoäŠùUóª{xõSÞ~uûÖ E¥ï|úéDz·Î9 ë½›Ö/ÚôÎĬGMî+pOÅ#ãàtzïYå)ChOÌÁÆrðŠ—xY–Ÿ‘ÈR›Xhâ†4$!pY–[ˆyû²×kH+a¯ø”l Æ¡¹û£82“Tîql Ô§ò-îØg™…M­ãü%rˆ;î­÷S¹“@Ùñ\D6s[ÒÕ…‚QáÅãÓ˜ê•ö1¬wwÛ8Ã/÷·ij, ˆ;%áF:@ ? #î8~’ œ3.¼÷Ètv¤ÓŽ7âŽ;´>?nÉ Ö\‰;+ŒYµpÜäA¯¾ÕòºéCÛîØºñ“wÕlúôÓþý¯}"{>o]·eÃÒÍ#îd02 ˜ÕÞôW.¢À—^wTàò+]”&°J»FÊQÅug)îˆa*儵(î¸g†ù¾}¹oZwÜÙüj‹ªäîø]„e²ÅYV&Ù•xŒÛ:…#h"ŽÀäw2ÉšK!SÅÄ>52SÕöPu{ÑŸ6þp[‹Ì¦ÑLG$83°wþÖc¿LÍ&™@Ü)GÓM@Id*î„å×ÏíG! î$ñM¼2¹wV/ž°jáøIo·ª|ñºêþ/}°eí'ﮉ´GÎ8—˜ïo”ó°$!îÄ5“K§ô™J¨¶¹F>°—Bø™öç·[4*LÌÌv9æ«lÄ{!‰½­†T._¹7TÎtbï¹ –8¯˜îO îÄѤuÄ4ØCrôk 1[ŒÙe;›G§ÜÿÅäcƒ§˜˜½NÖå°i2呸£ÆÙc8ÒÏ…c+€±iª„ê·‘Md™Á´˜lTä&Sñ‡_–½ x©@Ü)UÏÒ/@9 ©¸£»žµÜâNà.ªÆú‚EîÈUز,ûseªèe¹#âΚ%Õk—N^³¸zƈö•/Öß'ñ¬ûä“ –DÖùìÓOv~ðî–Ëþ“ˆÜÉÁ垯*ü³/Ç$-l›R=5Iï-þðí€}¬²¨Bfç‹Àã´‹;ö)Ýrß“IUöF!a+•â¬åÉ4r'Ù<3ÌߦuG`‚_žˆ¹msñ/ËÒaG§P;¶| €C×8%PJÜ\‚ ;¾¸cK·9ùkè¹pEiØ ú¿HF‡ û«u/`ÌhøÅ·™œeEq§¬ÜMg!dF #qGƒçå˳¢[Üq<þ89; ã|¨ ;ž9Siˆ;Cz¿Üµí“óª{ΟÜ{Á”·Lí»pZÿE3Ê&Êæ´,ÙPÙì¹c–e©¸³nÙ”wVL“ƒÆgŽzS$ž‰•Ͻ³dªœT•×$ªŽìšüáöÍ[EÖÙ°Ô“X–9hk$ƒNW"×MèŶۋ=%Ö¥^þ»‡þÔŸ`AMàœ6p*®‹°Â{N,î.V ¬M‰E8‘ë#'öþ •Õ<÷Z•dâNàáëq¢f2êµdÎtjíý-:C†ð¶Ís@Ž”b2‰¦[E³©¹ôK®nñcÿl¿¸ãŽJ³ƒæLΘ}L–Ít9ð• w¶ ™¿döSªä ‹é  ä2wô9Ï?‹s‹;Ž=‰õQÕÿ«»|ö€¨Ivͳ#ýÐaƒ„囟å×”åä·ÊäŠ*éX–Õ³ÃSôÕƒ:ð´Ÿž4iDÇdâŽ7¾qÍœ9c+†u¸¿«çïµóý÷>ýtOnÓÞ5X²¹ÎÎm[ßYgI`B܉ 5ó½NÂ#ç~öQÙ—¶†‡ˆüá_¥¥Ý‹sQ«4“,rGµ]ÇLÒ½,˯€«ýGøÞ¾4§cócae‹âß©"ÕÄ5è2ÎR#ÕÜmh:<ñ›$s.îØSëȱjœø+‚}™…m*ä^Q(5ø gÓ\‚+?ޏc+;1cÇâüš¢ybJ–qLM@ ¬ˆi.жlz—`øå°STUJwJÉ›ô€@Ž ÄwìG“~ýúyìp‹;ò´¸¯Aà¶R³>Ö‡MWŸŒgGöüaR‘´gP%¹ó÷ëêýÏÿüòœúå/ýχ£â§DîqçݵóÞ[·`íâêIý_îóµ{y–N5Ç“g™D֑ð>’M“ß[!ò;±¡rޝÿ¬« œÏ;jUÍ%06A¯VÝì&PÔˆŒ"‘”þÚŸ¥¸Žd‡1znSzû ”5Cä"/»•0qDgàñÏõs%…ùTKùïÿÆã‘Y‘]a¡¹wµÚSÙ1 ü[£#\»ì©Sÿ´`ÇU“¬¹×q¤b¢Â¢#>Îß®– »pt/aÇ7žj#MMÐý°"æf[âÞ%~9ìU• Ä’q% {qÄyNÕ'ΰ} ÜâN`)û(PÏ“±>Ö>V†=`…­’Pã7ís+ìéS ˆ;#û·®õµƒt–{ðÁþãïWfº,Ëw6½³hóú%²Îü‰}†w|Py¦j³qåìÏ>û$QúL´»þþ¦•›×KÍÑ q'÷·€ìjÔXGh‰Ý‚^¤a1º$ÓŒÛÀy¸=íô›/W±Nã¥&8QôG²¸W~Éä\ïQþÍkì¯üö‡­M »})áÀ›¡J'ñ§ÊBLùøë´oËÑÊ=Û·-ñ,Úu¨]vsq*LÜ1–E*I—#·°ë@…B?a·n¶?mŒ?<$qsR•a∲ûèVLlÅ-#-Ì]~µÑþkÿ,*·©îñ CÅÿóR 13ÈñzzídÔ»ÄÃ/»Û3¥K“âNiú•^AÈ {®%Ïþ—=M’‡ž°Ÿã"#wÌ"v}è·ŒðO íÙ‘ OÀRÜÞÜÑó6;²ŸS¥f}T•Ï¥HسZ ˆ;³ÇwíùæÓ³#‘;fªü•¯ð““8eLø{îŠ;r|Õ¶÷VnX9sîÞåZ÷õnñçI^^³°úã=»eל8IF¯ÂõÁæ5›ÞY˜aZðÞÚyï®™»qõl±MvZ¿bÚ;˧®[6yíÒê5K&®Y<~õ¢q«ŽY¹`ôŠù£V̱|Îðe³‡.5x‰ì4$û M°hZ¿…S+÷®S›Ü{þ¤žóª{ÌX1gB×Ùã»Ì×iÖØŽ3Gw˜QÕ~ú¨vÓG¾>mÄkS‡·™2¬õ䡯Lòò¤Á/Vj9ñíç' l1~À³ãû?=®ßScû6SùÄè>MG÷~¬ªWãQ=ÙãáÝQÑhx·†u½oh—†§œx´ m²˜.'×oW’i4Dä¤ÑÞÆ8ÎK®h¹˜5•ædtY ó(1Å«¢°±·cר"mÂsWôèSb’±Ð>Ã˯„ݾl-@Jimb’­¹Ç\ábŒ}W7u€öý0ðVo3‰o‰†±˜¿ f÷kyÙ‡‘ù› w⬘ó\¶Ò_÷Ëÿ÷ÈT‚È3Ò¤S¡Lv°†ÔéaL“5îêaâVLìã±¢€ï¹Äì¸9é¸^;nw;nenSÝãA‡ºYY 1ó¡CxJл,‡_ßä1 Ø î›G°€@Ð…N;ÃÞÈCRØ")é[Ü‘§yû·b{jø€k°ä_û1×3!ñÿœè˜Ù?š‰Ÿyigýô¥!îÌ™P1qزçÎA~U;û¯­sÛ§cn¨ìwÞß´ZÎJß¾õ-W,œT9ºâñÞ-þ2±òù…“úmZ»HvGL2Zöžq¾m}†šŽj@ˆ;År±÷Љo“;’ΖëŒluØsË2w*½~=—v|qÇžœûïŠb›Ä˜Ú<"”޾쥬v ’Á?Õtܾl¥Éo‰ûÎè…`kåvÍŽ8¬°"†CX”‡'œÊÓ iÎX‘CqÇa³Ÿ§[Õò6G`‹c”†);Æ_¶lg·è œ[qÇþãùlà0ptÜüÌÿv¡7„0b¹wLÇÝÑO™ö.ûá—.2—<Ä’w1„ œ€ù©Öñ’'*y‹üYXë±'-FR‘—¼ÑRõIÑ1'‘å[óhÿ˜lævÝsµ!P„’ɃøŠ;p‚ â'€¸Sü>ÂB@€@B‰;æ(ô»o»Î^¢%Q<‡rÐuýãœ)ƒ³w6îx?4}¸}Ó§ŸìywíÜœ%6TN8^(Ï7TÛÄ@€ P´wŠÖ5@È–@qgÑŒ=:½pØ¡_ß¿ýtžý÷ßïÐoÔzü‘»“FîÄwÖÌy7w‰Ó²²:”/WDçé7 zˆ;©w!€ „H&îÈQès'÷¿ñú+dYÖp×]wUVVÊVDýû÷¿õ·ôëÕ>ãeY²§rxúðƒ÷$rGä˜Ü&ŽB纀@ˆ;  Q€@1@Ü)/` @ /‹;æ(ôYS‡ËVÇ»wmÝþÁº¶­‘?úhû”)SÎ9çìW_z*öž;ë·os%9! qç”Ö8)ñZ^F•B ÄÈ@  î£W° € ‘âŽ(8rºœ–%*›=wdY–Dîqç“=»¶m^¾ù½Eòï¶-+LÚñÁ;Ÿ|¼û¤“NúÆ×k5~èîÅó&¼+{!¯[°éE›×/Ù²qÙÖw—o{oåû›V°eíö­ïlߺÞd£ew$Ð&çIä§õ+¦½³|êºe“×.­^³dâšÅãW/·jᘕ F¯˜?jÅÜËç _6{èÒYƒ—H¯¥ïÓ,šÖoáÔʽ@&÷ž?©ç¼ês'VÌ™Ðuöø.³Çuš5¶ãÌÑfTµŸ>ªÝô‘¯OñÚÔám¦ k=yè+“†¼1ºOÓѽ«êÕxTÏGGöxxD÷‡FT4Þía]ïÚ¥!âNN<•dO@Î÷ሟì1R Â@Ü)X·sûÆw¼+é£ÝTTT˜•D_úÒ—<ð«çÿöœ!zz"w>ز.2Év<"îìbò‘ˆÜÉÛè¢b@€ЇâNñøK @9&)îlݲ¹oVÞwãŽ;f`¯VžeYËæß¹ý=Ùg热«öFîìwv}¸Yvá‘ôé§׫WOwŠ‘7_;äC¿ñõëëÿuøà·Ì²¬8é qgúú•yHˆ;9ST@€@1@Ü)F¯` @ '"Åwßݰÿ~_~ìá[{t~áøã¾ûà=7Ø{³|ÞÈw×ΗMv>Þ³s÷îm»vnqç£ÝÛ俟|²{ܸq³cë;潨<|🯼¼k§vïo^ëNÛ·î‹ÜY1-O‰=wr2–¨€ b&€¸SÌÞÁ6@€@V"Åm[79æ‚ßžÙ¿W›ËëýîWgþ|êØ^fCe#_µjá8ÙRgÇû>þh§mÐgŸ}Úê¥æµR¤œ@•Gž._ß¶iµ>Ø'îˆ`”ÏÄQè%;Èé @ˆ;Œ@€@)ˆ)îLŸÐ{ò˜îW\ö{£ïœòãvj×âž;®?âðCïøÇµ g )îl^¿Äœ–5eˆ&<ðÝï}àî¿ÿ~Ë#ÿmýÊsÛ6­²Ó[×íw$ (iíÒê5K&®Y<~õ¢q«ŽY¹`ôŠù£V̱|Îðe³‡.5xÉÌAKf \<}À¢iýN­\0å­“{ÏŸÔs^u¹+æLè:{|—Ùã:ÍÛqæè3ªÚOÕnúÈ×§xmêð6S†µž<ô•IC^ž4øÅêA-'¾ýü„-Æxv|ÿ§Çõ{jlßfc*ŸݧéèÞUõj<ªç£#{<<¢ûC#* ïöÀ°®÷ íÒÈR¾é @ ÿˆÜÉ?cZ€ ÔŒÄñ#»=ÑøÎƒöm,Û$_íåÝÞ|þòzu?ì/?ר½,ËD³í½•&Íž>î©'ýÁñßÿÊW¾"ûïˆÜ³jélýÖ¼‘µ>ùø£µK'å9!îÔÐ(LC³Ó¾x­_¿> öb# @ÀKq‡1@(YnqgÁ”JQUÍa"wDܩܩË-Nøá÷L¬Í·Ž:²Ñ½7½òÂcu~ñÓã¾÷ÝÁ}ß ÛsÇ#îl}o…'-š7¹sÇ×üŸË'ïoY³OÜ‘Ý|ò›ˆÜ)ü@Íäøð×Ù_¼4hйsç›'-6kÖL Ôà2y/6›ÍûÏ«¸cš)¡]Îa[UUUb¼‘|(ýªqqG4&CØ!î,^¼ØXëåUÚË¡¨ €€@Üa0@€J–@¤¸3wbù“ûÈ8›ß[=iLo‰Üqgpßvzÿó•Ÿú“ÍœçË_þRÝ Ïyá™GþråýÆ×¯ùË'íoŸ–åw–ËÎ;1“ž%âÎ9Š«‰=w :ÚmqÇÂcO­ ©ïhÌŽÌðE0/Ä8CDu±âwTžsˆ;;vìÐ oî½÷^3Tî‘Eý‰Cƒ<€ŠâN1x @y!GÜ™WÝsþäÞŒ³sÇÖéÕƒTÜy«{ë^]_nxÇõ‡ö 3÷>䃮¸ì’çŸi|ååÿûoÔúÃÿþn`e'sº-îlÙ¸<£$'gíwÆ&±¡r^†ZH¥*î¸ã8d]Œ=Í.˜…¦QùWæùv£“bæùžÏsh˜’IiäŽ#¸©Æ#wD‘±—Ú…EîÈb@ žò8Úþ*‡N§*@y%€¸“W¼T@¨IñÅ9jéœa»vn]¶hš‰Ü1âNEÇ–í_{æ—\ Á;f"ô­£j_õ§ÿ}áÙÆõ¯½â{Ç~ç„÷f»—þ[ÜY&gfÅO7$âÎêESS˜ÄiY…“1Å1ÈìAcÆXÁv<1-Öˆ¼‚¸“¿Q¨ê’{Y–J{»hëh$x'ž¢f@ ·wrË“Ú @ED #qgÁÔ¾ §õß+ÊlZ?l`gw:µ¾Ãk϶xêÁŸÿìd]>sðÁý±ÞE-[<~ÿ½·žö³Ÿ~ø¡¯´lþÎʹ[6.Í4íwvK@MÁG¡lŒÆwÄ$ —(ÌÃ5+¯ÔlëÙ€¢Ü‘ÕU&KÂÁâN$SO!¥ÆìB €@™@Ü)ó@÷!$' +ä)?þ¶£æ$óŠ_J¬”ó¥ˆ4šÜâÿ.)­›:3­Væ R¤¦÷ɨû ÄE3Ê‘ä;¶o›3c¼‰Ü1âÎ?[=ÕúÅ'n¿å:‰ÜQ‰ç«_ùÊçŸÓú¥æ­^j~Þ¹gyÄá7ÿ½þèý7oX?m}o¯¸³jáØ¦1+Œ^1ÔŠ¹#–ϾlöÐ¥³/™9hÉŒ‹§X4­ß©•Ê´`rïù“zΫî1wbÅœ ]gï2{\§Yc;ÎÝaFUûé£ÚMùú´¯MÞfʰ֓‡¾2iÈË“¿X=¨åÄ·ŸŸ0°ÅøÏŽïÿô¸~OíÛlLå£û4Ýû±ª^Gõ|td‡GthDE£áÝÖõ¾¡]žrâÑJU¼–‘—‹9sFâŽêžPsL¹é¦9ØÈœgä¸O¤цL™ŸÞ1$C*ÔÉ¿ÙØnEéØÿ•võÇ]K+‰³˜+R\0•.˜¾H§»¬Þ÷,™mqÂOì"‚QñššµS†žjb¤§iϲ,ÉïéE؈UÈq¬ ¬DÜ­‚Ž\–É_Gcت®b¾î° (Oˆ;åéwz @ +ò»½£y˜–OäsG½òˆX*l †žb+OávAÓùÖ±|Ãìâh•™Ú{¸ûeh¿9Ù×DØ‹»ÍdâÎ♃–Í!5Û?Ø:zD¥-î¼úÒ“¯¾ôÔÝ·ßð“SN²žûë3_hÑ´K‡Ö7ßxÝqß?¶ví#öª<Ãûm^¿$2m}wå>qgL!âNV·€Ø…³w´y£¡=fìy|ïKfÕ•G,pdz–¢¥otaÊT*·¸ »J)÷·T!ÕJYÿV88îÏr# ¼9 ÞÿFOe/wD¬ñ¸LÿXn›)C[Ý Ù ·¸#tYV ´›9/öu@F@… €¸SÊ´@ ”Ø'‰õÄž„í^áÑD<¥g¦Z󓯭#˜©šùıY†žƒëùéÞžlÄ´ß ÿz&*R¼È=›XÜY2kˆœ’¾zÉÄwl~gíÊ^]ÿÙ¶uóv¯>ݾÍ3íÛ´xãµoüó¹ÍùÍ9g~ùË_Vïüüg§<øÀƒtïÙ­í]·ßøƒ|ÿ¨£jßô÷몆÷Ý´~qX’CÓ÷Š; F2!îfèf$îh0ˆ­Úh ú­Ž7[ÛµïK&ÔE^zk’7öÝȵöKoqG£BÄ6¡_yr@vˆ;RdDgíŽvÜÃôSÒ‚v7ݲ”Ýœ–R°**yè):¿¸ãwŠíxN–⎹?K&æ(RÜÑû¹‹ÕU˜+…V dOq'{†Ô@ ŒèüJž†í52·Ñ§vÿƒ²>â˱#hüQ3ú³ª†ÕÈ£¿Ô`ÖCéÃ{a†ý*«öKåöº*±JÅ ¿`¤mi€’YúáŽT*†a‘¥¸³lîðåóFnX=ûã=Ι5¹¢S«Ní_èÔþÅÎo¼Ø¹ÃK]Þ|¥ë›­Ú¾öÜUWü¡V­Ctæ¹ß~_þíy¿júØÇ< [£ûo?ñ„ã¿ý­oÞ×ð¶Mëù“œ˜.⎨-N,Ë*À/îØçRÛª]ƒ ?‘O䂵¯>ûâõÜT/KÞ³ZÊ!¯Fî.»6›žÞââoÖº-!yj“¯üR‹1ÃCÉÝ£*† j¼£9í¬'rÇ¡™¯l9ÞsÏAG¿õï¬d¢;å•`Ó%=š]¡EŠ;¶©Ò¢ 0ëËl\„íà.A€@® îäŠ$õ@( *¸ø{«§ÏzâY"ŒÕg}OˆýÓ± }”\K¥ßÚ“œÈ_×õ™Þ35²N׳~NÄó«V-·í½•|°uÚäÑ=º¼Ú³ë«=»µéUñÏÞ¯÷îѶOv}z¶¿ýÖ¾wìwí«ýöÛ¯î…ç=÷L“¹3ÆŒ«êÿ£“~Ø·w§Mï,ò¤­÷‰;óG8!îàžSܱe Ï Dk¡¸")2ÈBoA56¸cËzçI¶tXënH%0LcS ˜Tÿò|ö¹GÁñÃÓ¿lD~AM¾µïù¢è™¿¶‹ãˆ;b€øÑnÒ;˜I¼õO®úE=€2"€¸“.2C(wqÇ<%ûwÖçæ°½unæ™ziÁ°­‹ÆÆõ„i7êT!x¦—:Ý*þPÏÍ•¸³rlˆ3nÝò);Þßøþ¶Í3¦ŒéÛ«]¿ÞoôïÝ¡ÿ[ox«ã€ÊN*;KzýµçoøÛ_;îX[åÙÿýþ÷â %~§²wÇ÷ÞYèIr>—ˆ;+æªÄ†Êy¾¥Ù¢ƒ./ò¼ñL­=×{¤<¤ò„cóÀ{E2qGUlárOÓÛW á Øzœ§§8ER Ü8ìŽg›­Þñ(kqÄÇ~j& 2W£OoøöÏqݽÌ:ÜÀre3õ@È9Äœ#¥B@¥LÀ±ö*°Ûqæ*R0pêå’¤TØ®::cñÄöGV(uªŽcÿf[TüžÎ­¸³zñ„5Kª7®™ûáöM}´kñ™#†ôòv·¡oW Ô]“|8fd¥ÄòÜs×M§ýü'ªòrÈÁ•½Þ|oÝOÚ²aé>qgd $Ä<b[ܱõ¾À÷žÅ’Æ4‡c2dt]Û‘wÉÄiQÍ"Ó—Lò l=Î M#)*îøGƒWµ¤âNXœ£j19} Í£ÅDŠ;ö.N"Üë²,;–'u‚~NR  Rˆ;)ufC¨ö. 2«‘gt™8b×uò :‹ÙÎ ðh9gÓð~Ïó·}F¯bR™IªuX¢Ñ=v@äþ>5㌭æCÜY»tòºeSd#‰âÙóÑîuk—WT5¼DÜ™8vÀÔê!³¦3ò­Çßwáùç¸Ä=»åTòI…c%Ï)î}D.1¹l÷ÏÒ`Ú+rw {.>J,îÏÞêëÅÜÔ[·ƒÝñßÝ”lÌ65ðVé1;p‰«ä‰ŒÜqæäPÜÑ¿þááwìÕa~aNʪl¥ä× %!ä‚âN.(R r"v´­ùåÓC³%gäO÷ö/½æÙÚ¿½±ÝDüŸÈI¦Ç6{ ”éHGJþÄwVL[¿rÆÆÕ³?غîÓO>Þ²yüÙ'Ž`§©‡Ìš:bþ¬Ñ‹çMX±xòu~^ÙóÍw×Î÷¤Í–|²g×rÙ¼¹FÒœáËf]:k𒙃–̸xú€EÓú-œZ¹`Ê[ &÷ž?©ç¼ês'VÌ™Ðuöø.³Çuš5¶ãÌÑfTµŸ>ªÝô‘¯OñÚÔám¦ k=yè+“†¼1ºOÓѽ«êÕxTÏGGöxxD÷‡FT4Þía]ïÚ¥á)'­#P¼Vàq’¿ælñÅ/ªÆÙÓÄ=EÏæºÎFܱ·vß£ÂØºÅÈ[¥gYSd”J`Õ’ÂBlÂT¡âwL]àfâÞlH:˜½òw¡Q3 !€¸Ã0€ Œ HT‹9 ×?‘‡l{žoqGyV]),œ'›I âŽÙsÇ,Ë2‘;FÜÙ°jÖÆ5sÞ];ïýÍ«÷|´óìZ>oÖÔQS'6iÖÔáógU-ž7~ÅâIûÄ’Ù“6oX¼WÜ™3¬¦âNÆ·€Ølq'v¡ÿÊ_Ü1A@î—-Úf#îØ‘&0Ó޹Ũ~|þ½6ZžâŽFÉO þ@'ýë ­Ì·v Ndd¨°#~eêwòCÈÄü±¥f@¥O@Tyªö¨<ò_]^¡âŽÞ³sûÖu«-˜3nÎô‘ÿ%îôxÃä´Óæõ{Åes†ÖX"r'o÷ª‚‰; Âg²wìÓ¾# éºÅLÕ¢dâNÚ—eeúã’˜›Áî]·k…Š!dKq'[‚”‡ ! ÏÊö攺ýýËj¦ âˆ;úãªîïVÊÞs'SKwÜâŽl±ìI[ß]±Wåùdχ;ßß°né²ES–ï‹Üy«ÇþÌ›Œ¸3{H &–eezQÄÌŸoq'ÎyOa¦&wTA–7öû˜LL¶ÀÖµ¶L÷yI&îäuCåì¹#âŽ;ÄÉÄ–jý ¦¸£âQ¦îÈh$€@® îäŠ$õ@(}Ì"SyÌ ;F§ úiÌ©F…‘ûŒ'™¸#G2©d w {óŒNÎlÝÞ>Œ‰tAn°f‘扤˜!Žä­x3=-«âŽ{Ⱥ™°,+/<•B5Jq§FñÓ8 TPé$ìtØÀéŠÎ Âf>aûVÆw¡É)¿Êš=2íua6`ÝA3ðØÉiÏÓüG¡;æ*EëÆ|o¨¼wÏÕ³ã$Qy.¿¬Þøª~þÌ›ÞY¸OÜ\³‰ •ó1Œ îh´‹Æex:"×r °›@Ü ”r&F7ªÔ)Gdx޽½¥–’:ýûeÄw„¼NE"O©eïµiÛïꉜ«­ëó-î¬_53ûôîºù{Å‹!-ž>`Ñ´~ §V.˜òւɽçOê9¯ºÇ܉s&t=¾Ëìqfí8st‡Uí§j7}äëÓF¼6ux›)ÃZOúʤ!/Oübõ –ß~~ÂÀã<;¾ÿÓãú=5¶o³1•OŒîÓttïǪz5ÕóÑ‘=Ñý¡†w{`X×û†vixʉGë ¯íˆÊ԰ˆ;FßÑ›€’tßa2wtm—Ô¸ÂÔŽ©qìþ£­K[ÇñtÇHäGd#îHU"ùéÉ'Ò)\ü7FOµ*ò†Y$âŽGî÷›° ÐL¯òC( ÄÂp¦@%EÀœQâŸrˆnâØ«8¬TØ8F9Šùxm~¢—WØ~@¶dnfÿ4­*´h¿|n*Oó.¹>ëôîZw>\ "² ä ì“Öì¿iHc¶Ê4’Ç|v¿’&4Oœ»£uc­ Õ1wíŽohw*’Rd¡'½–M75ÄRÅÿR\)¢Ú’“áàðxXÅ`ä8첩Aޤ9gÈ٠ĢrÆ@Hyt–Ç}=^*¦é¦TàñX1kÈU6™™$°?W­¦žü‹;3Ö¯Ì6½»vÞ^qgú€"IDîfpæµ¹Ï8„æ¼6Ê÷8ËGCþ:5†¨m(LO¥éc) ›‚q£!@ H î‰#0€ {ywÞY1='iãš¹"î,šÞ¯X˲r?©±H ˆv#±Hލ(*Ò` |Aq‡±@(Yiw¦õ“™"Iì¹S²—ûoníFOyÏÉǰ‡ ¼@ÜÉ+^*‡ Ô$<Š;˧½“£´qõ‰ÜY8­o%6T®ÉaKÛ…#`îî9ÌÞ£:péÂYIK€ ƒâN Hd ¤“@ÅA•o4~莶¯>³véäu˦¬[>5Wiƒˆ;}(Á2E•8-+C«3#`Ÿ&QÓ=@¥Eq§´üIo @ìÅI£{uô·/œÔkþèW&¿õøèŽw~åò7<îûÇÌŸ1bí²ÉÙ§ «fíw&÷.„¸Ãõ@€@* î¤ÂM @HB {q§[‡~vÆ/Æ­žÓoÑ Þi>®ë}Ã^kÐïÙ“¯½ð†úW­]:)û´aÕÌ?Ú9r¯bLDî$w” @ Ðw Mœö @#½¸óì“÷_ðÇKDÙ‘È®sFHðŽ¬Ìºe`Ë?´½ïðÃÍ^Ù‘>w$6¨˲ 6Zi€ äw’³£$ @ È d/î èýÏcN8Nd Ûùç´"îHðŽ¬Ìºæ­§ö¯uàô ×,©Î2­_9C"wæIŒLq&öÜ)òQŽy€ üû߈;Œ@€@ÉÈ^ÜY0}ðW>°ÕÄ>"ëȆʢìȶ;¼#+³¾qü·úöl»fÉÄ,Óú•Ó÷Š;Õ=Š6±¡rÉ^!t € P*wJÅ“ô€ à#½¸³|ÞH9-ë’Û¯1šŽl¸#I"wdeևך8ªÏšÅ³LëWLßóÑι»qâ´,®.@€ŠšâNQ»ã @Ùȉ¸3yLŸC¿SûŽ·^0šŽÄìÈš¬K^½ûûßûî’9U«OÈ2½³bÚ>q§¢˜G¡g3) @€@¾ îä›0õC€jŒ@NÄó«Þ~«ý7üý+Û>(²Î•½¿¤ý}‡žøŽmŸ_½h|öéåS÷Š;ºsBÜ©±ALÀ Ä €¸Y @é$+qgå‚1ƒ*ßøö·¾yÈwüú‰GKÌÎ+Ï?¶jÑøœ¤uûÄ9ºwê:{|—Ùã:ÍÛqæè3ªÚOÕnúÈ×§xmêð6S†µž<ô•IC^ž4øÅêA-'¾ýü„-Æxv|ÿ§Çõ{jlßfc*ŸݧéèÞUõj<ªç£#{<<¢ûC#* ïöÀ°®÷ íÒð”þ_¼ÄkénX @€@@Ü©1ô4 @È7Š;«Ž“$O÷Ž/O×Ïü7'iݲ}âÎø®Ežwò=\©€ Äw££  @ Ø äTÜ»ja^ÒºeSDÜÙ+"r§Ø‡<öA€Ê”âN™:žnC€@9È¡¸³ráØ<¥µ"îìÞ1{\ç4$–e•ÃuC!@é#€¸“>Ÿa1 @ &\Š; ÆÈÎ;ùHk—NÞ'îtJEbϘcl€ ’âN!iÓ @  r'îŒ^¹ _iíÒI"îˆh’–ĆÊÄ4@€@ ˆ;1 ‘€ N¹wä4ôü¥5Kª÷Š;cÞLKBÜIçÕ€Õ€ R&€¸SÊÞ¥o€ PæR$îÌófjRžBoÓê…2·t€ L îdJŒü€ Ôȸ3oÔŠ|¦5‹'JäÎÌÑo¤(ͨj?}T»é#_Ÿ6⵩ÃÛLÖzòÐW& yyÒ૵œøöó¶?àÙñýŸ×况}›©|btŸ¦£{?VÕ«ñ¨žŽìñðˆî¨h4¼ÛúÞ7´KÃSN<úÿ}ñz扆[ß]žšA†¡€ Ä"p&@€òC 'âÎòy#óšV/ž âÎŒÑo¤)åYÜY6gÈæõ‹ò3(¨€ $€¸S‚N¥K€ C âÎÜ‘Ëóœ>wªÚK8LŠR^#wDÜ‘ôÞÚ¹Œd@€ ‡âNJä ¤’@.ÄËçæ7­^<~oäNU»t¥ˆ;¢ïlÙ¸4•#£!@(,ÄÂò¦5@€@ d/î,›;<ßiÕ^qgûôQmÓ—ò¶çމÜ1i×Î-24@€@* î¤Òm @ˆC [qgΰeùO«Û+îŒ|=)O*ÛâÎÊUŸ}úIw“€ ²%€¸S¶®§ã€ PúÜâNûVõÍÃ[4½sþäÞ ¦¼µ`jß…Óú/š1pñÌAKf Y:{èÒÙà V-Ü+îLùÏT¦üœ–e‹;ò~ꙥ?Xé! @Y@ÜÉE!@ÅMÀ-î éýò±ßý–À]ï’ßÌß#HÜ}'ïiÕ±{ÅÿLgÊËQèqGþ»óƒw‹{¬a @5Iq§&éÓ6 @ ¯"—eMöÆï/8Kôïó­·º¶üïÈ Þ)DZµpÌG»·O•˜”¦ám¦ k=yè+“†¼1ºOÓѽ«êÕxTÏGGöxxD÷‡FT4Þía]ïÐáÎï÷pñ‚y=óDC¿¸³véļ*‡ @ ÕwRí>Œ‡ ¸DŠ;s'ö˜Wݳ٣·î¿ß—÷ßo¿&ޢ˲deVaÒÊc>Úµ}êð6éMÙˆ;÷Þôû¯í@UvÂÄvVæR‡ @ÀAq‡á@(Y1ÅÙsg`ÏWNøÁ±¢,œÿ›:SÇöZ2kpÁÒÊ£÷‰;¯¦7%woøÇ£:Ô–uÌû®íŸõGî°óNÉ^¥t € ˆ;¹ H€ ¢$_Ü‘ •gNèyÕe¿qá°C¿Þ³SË%3&­œ¿WÜ}$Õ)£eY¯Úõˆ#iOî •ßjÿÿ]xZ ¬sâ ß[ŠåÑz6®™Í ‡ @~ˆ;Œ @€@Ép‹;í[=*ZÃÁøò³÷˲¬ÿ…>càâ_h~¿ˆ;’áÔ“OèÑñ9ù$Oiż‘{Å!¯¤=…‰;ƒº>ZÿÊßì÷å/ù•ouä‹Ï>èŽÖ±¿]³x\ÉV:@€@w²€GQ@€@qˆ\–յ퓇ZKD‡kÿ|‰ì¹³÷(ôé5Í®~ë¶ÿ"§hI†‹÷ëñÃ:Ûßæêýò¹{ŽÊH ¤ÿ> }Tï'oopñ7¾~°_Ö9ü°¯?|ÿMó§ö¯ì˜œŸ}úIq:¬ƒ @  îÔtš„ †@¤¸#G¡WïðÛs~!ꃜ–õvïWMàI#´?ÿÜ:’Aöâ¹çöëfW÷ñçÉæ“ÏÅÁ/M*…ôbõ –ß~~ÂÀÝ÷—o±7ôÉóÚÿýî¸åêzg*ë˜ü»vn)Ìà¡@€RDq'EÎÂT@€@fâˆ;óª{Êž;î¾^"t$5ìÎEÓ%~Ç›:½Þì{Ç|[tŠouDXžÀ‚‘.Ÿ;B"wª%æ¥4Ò –­žþÇñß;*ì0¬êQÉdSjûÖu™ rC€ PwÊÀÉt€Ê•@|qGöÜy«kK#ß\ú¿¿RU!K´üéÁ{n8xßYZ²Ï=·]–-°lØ‡Ëæìwµ,Ô©Õ½?;å¸@Yç‚óÎÚ¯m6²âN¹^Çô€ Mq'š9 @)%‘¸#*ÏšØK”Ñ&DåéÞáÙ…ÓúùÓ”ªnÞÓ@âw$›Dú\uYÝýÛæŒùá²9Ã÷‰;/¤:½Õá‘ ÎùiØç½»¼˜½¬ƒ¸“Ò˳!@ €¸SÈ4@¨nqgjU§g›Þi–e™Ó²LjÖäžsé%çÒA?÷¼‘l²M‘3~{î/ß|íɰœîÏ—Î&âŽìS“Ò4¬ç“Wþá×ûípÖ÷=ºÍ‹s%ë îÔÌUD«€ 4@ÜIƒ—°€ ˆ€[Üy±yCÑe~òãã‡õ}uŸ¸S©I4‹.<{ïAéx÷­×ÈAZö·öû7_{âì3>X­ç¹f 'ê–9ðó¥s†¦TÜ]ùLƒ¿\xÐ_ < ë™'æVÖAÜItP€ PwÊÂÍt€Ê“@䲬»nù³Qp^iñÀ‚)•žôf›'Llη¾yÄ+-ù3è'{¶’0Õ8~{Î/›5¾}ìàŽ"úÕÒÙ{Å ŸKWºïÖË :ãüƒº÷ο%8ã<¦ÄiYåy-Ók@€€›â#€ P²"Å9 ½kÛf¢Ýˆ.så7c|ùSÞò¤Æn2«´NÿùûtyÞŸA?3ø ɬ<¦ˆ|2¬ßkŽRKfùèÃ÷' h‘–Ôüáë¾ûí½ÄügœÿíêKŸqGÜY>wØ¿þõYÉŽW:@€@Rˆ;IÉQ€ Pôâˆ;²çΤ{Î/Dª8ö˜o ìñòüÉ} ™MìÏÝÿ¸:TÜéÿÌø"N]_½÷WuööÝÿúõY§ èÙ:Ž4“}ž-—fäÐ  @é"€¸“.a- @ 1Åy“{›4 ÇK¼#úÅï/8«zDGýÜ~óÒ³÷‰G^²«C›Ç³ù?ìÚþ©éã*üŸ/ž5hoäNÿ§‹3õïøðE¿ýy ¬sâ ßïÚþÙì%›ø5°áN£Ÿ¬€ r"€¸SNÞ¦¯€ PfâŠ;“zÍû"MÛ­ÞÅ犖qØ¡µZ$âŽh7rPºì¸ìùVÿ;ô­ÖW\zÙXGòßuË_ª‡wËöùâoïwž*ž4²WÓÛ\|Ðøv?ìëßS¤“ Û6­JÝÄ`@€ Cq§0œi€ Plqçàƒ¾Ú­m“£;ÌÓqָγÇw3¡BNËš[Ý30MÓõ–2Â(8U_Ë9qx‘uŒ$¯ó~}ú£÷ÿÝ‘ßSwÆö}ªHÒƒw\þ3Îï¸å꼆å„Û©ë‡&!@é!€¸“_a) @ C3gδcODß©h÷¸OÜ}'4 }«•ˆ5RÉÁx×-väœ6¦Ë“ÜrvSµÅÓvÒýw]'58JÉW‹g Ü+îT6«ñÔ¢ñuÇûÍÀíuäŒó†åwØJ9ñOv@€@y@Ü)/Ó[@(7uêÔñè;­[Üû_‘;¼•Ú¼ðà±ßݻѲü+ïÝù'{ãɇoùýùgþçôãa¨Å Oß+|²Sûn=õÇÇÊ:œwæè!ó±Ì*~Ëçûô“ÊmèÒ_@€â@܉ϊœ€ ôضmÛ©§þ'šFô‹ýöûrëçî3˲æLì?ÝyËŸ%~Gj8«ÎO^|ºadÁ©£;K¶?\|Ž)%¯Gîkà/µhú€ÝnóÖ5’z¼ÖðW¿<1PÖùåé§ìŒs·Ðóþæ5éyX @€@ î6MA€j‚ÀîÝ»ëÖ­këSÓ²ùÝ{Å Ó¨þmþpÑ9&$ç¨o.bÍÔªNq*ißêÑ[®¿¬ç›Oû3/šÖŸ¸Ó´À©òûÿtÉagœ¿ÑæÉø‘5yÍùÞÚ¹51jh€ 4@ÜI“·°€ Œ€_ßQCÔ–8ºŒ?H,\¸Ð¿DKäž½!<ÃÛÍÓ1¯iþä>ûć²L÷ßrÉ7jxÆù·\]TgœÛRÑú•Óö|´3n¥N@€ʇâNùøšžB€\š7oîá9ô_{èžëfŒy3iÞäÞ"îŒèþPâôxÃË>êÐÀ3Îÿvõ¥Åvƹ*;+TíØ¶žA @€²'€¸“=Cj€ ”°ž÷VÏÞ3ct‡|¤y“zíwL^yâÚŸœôÀ]“/©{Îè!óºœ*›ÊeÖgŸ~R"ã†n@€ PÓwjÚ´@(2!<" œù‹“+Ú=žs}GÄ];·¯h”Qzãù¿ŸuÚe_ž~Ê€ž­³Q^òZöS>Úµ½È|Ž9€ ¤›âNºý‡õ€ |ƒÒëÕ«(üoݳºµ}lzÕ¹Js«{îwº=3õxõ¶KÎÿi m'žðýâ<ãܨE"ëìÚ¹%þ¢N@€ÊœâN™º@%PUU¸Ñò¾(ž¿ÞòþéUí³Os«{ìwîL•íî¼æ²³Ï8ÿöQG¾øìƒy¸É¦rd.3@€òJq'¯x©€ zµk׌”‘½x»ÿúé£Úg“æNÜ+î ëzŸ# |ó9ï ¯îï7CÎ8øþ›Šö0,dÔ_t€ ˆ;ið6B€j”ÀîÝ»›4iR«V­@‰ç¨Ú‡Ýö÷Ëúw{zÚ¨v Òœ‰Ý÷‰;÷†¥‡n»äÈÿx–œq^´‡am\3›EX5:li€ PFwÊÈÙt€ mÛ¶É^ËaQ<"¾œ|Ò÷¼ëêª~/MÙ6~š3AÄ-C»4ô§_ñýï¨(ý劋«GUd³T*Oe×,÷þæ5œ„•ÍH£, @™@ÜÉ”ù!@eM@¢x:tèpÌ1Çj.æÃ sz³Gnœ:²mœ(î¼ÚìšSN<:°‰ Î;³Ï8_1ä¦wæïùhgY:@€@ @Ü©!ð4 @H9ÊÊʰí–U”9ãôÝó+ºþóÑ©#_Ks&TìÚ±eHç{LêØò†sêü0ìŒóÞ]^ÌSÄM²jEÓ‘åW;¶­O¹31€ t@ÜI·ÿ°€ P³ª««o¾ùæ°íxT£9ô‡\ò»3›ÜwÝž-¦Žø§æŒï¶WÜétwÅ+7^ú»Ÿ†%gœ·y±q2ý%¥Ö.¸eã’Ýn«Yø´@€ ÄF @9 ‡j]uÕU޵Z¶Ð#=¿ö’—šß1¸g‹Ùã»mÝ´þêK넆õÌ ó!ÐdZçêEcÞ[;W‚tØO'Ã…* @È)Äœâ¤2@€@yM—Û´isî¹çÆQyLžÃ¾QëÈ#vM>äàƒî½óo5xƹl,K®¶l\*û=#è”÷¸¦÷€ b'€¸SìÂ>@€@ ˆÊ#±<²b˽õr ´ÿþûýíêK vƹì›óΊ)’$0G¤œm›Vq„y‡6C€Ê™âN9{Ÿ¾C€ A`áÂ…-[¶¬[·îÑsÍÕ^¹|¡È+Hÿú×g…è?m@€ <@ÜÉ3`ª‡ @À"0sæL‰èiÔ¨‘,ÝòlÃ,ê| -@€ L îdJŒü€ äŒÀÊ•+åHuÙ¦Y'gL©€ ò#ðÿ5gpNµ:IEND®B`‚dibbler-1.0.1/doc/dibbler-devel-03-port.dox0000664000175000017500000001546712233256142015237 00000000000000/** * @page portability 3. Portability Guide * * This section contains guidelines and tips for people intending to port * Dibbler to a new achitecture or system. Before attempting to do so, * please contact Dibbler author * (a href="mailto:thomson(at)klub.com.pl">thomson(at)klub.com.pl) * for help. Substantial support will be provided. * * @section portabilityLowLevel 3.1 Low-level System API * * To port dibbler to a new system, several of the low level functions have to * be implemented. List of those functions is available in Misc/Portable.h * file, in section labeled as: * * @verbatim /* ****************************************************************** */ /* *** interface/socket low level functions ************************* */ /* ****************************************************************** */ @endverbatim * * Here is a description of the function prototypes: * * - @code struct iface * if_list_get() @endcode Returns pointer to a list of iface * structures. Each structure represents a network interface. This structure is * defined in the Misc/Portable.h file. This function should allocate memory * for this list. * * - @code void if_list_release(struct iface * list) @endcode Releases list previously * allocated in the if_list_get() function. * * - @code int ipaddr_add(const char* ifacename, int ifindex, const char* addr, uint pref, uint valid) @endcode * This function adds address specified (in plain text) in addr parameter to * the interface named ifacename with interface index ifindex with preferred * and valid lifetimes set to pref and valid. Note that some systems might * ignore interface name and use ifindex only, or vice versa. * * - @code int ipaddr_del(const char* ifacename, int ifindex, const char* addr)@endcode * Removes address addr (specified in plain text) from the interface ifacename. * * - @code int sock_add(char* ifacename,int ifaceid, char* addr, int port, int thisifaceonly, int reuse) @endcode * Creates socket used to read and write data to * the ifacename/ifaceid interface, bound to address addr (specified in plain * text) and to the port. thisifaceonly parameter specifies if the socket * should be bound to the specific interface (1) or not (0). Some systems (e.g. * Linux) allow to bind socket in a way that the address/port combination can * be bound multiple times. This kind of socket binding allow some advanced * tricks like running both server and client on the same host. This parameter * is specified by @c MOD_CLNT_BIND_REUSE, defined (or not) Makefile.inc. This * function return file descriptor used to reference to a created socket. * * - @code int sock_del(int fd) @endcode -- delete previously created socket. fd is a * file descriptor returned by the sock_add() function. * * - @code int sock_send(int fd, char* addr, char* buf, int buflen, int port, int iface) @endcode * Sends data to addr (defined in packed name)/port, using socket * fs. Send buflen byte starting at buf. Send the data using interface iface. * * - @code int sock_recv(int fd, char* myPlainAddr, char* peerPlainAddr, char* buf, int buflen) @endcode * Receive data from the fd socket. Store destination (my) * address in a memory located at myPlainAddr, store sender's address in a * memory located at peerPlainAddr. The data itself should be stored in a * memory located at buf. buflen is a size of a buffer (to avoid buffer * overflow). This function returns number of bytes received. * * - @code int is_addr_tentative(char* ifacename, int iface, char* plainAddr) @endcode * Returns information if the address plainAddr added to the ifacename/iface * interface is tentative (1) or not (0). It is possible that the Duplicate * Address Detection is not yet complete, so other possible return value is * inconclusive (2). * * Following functions are used to set corresponding parameters, received * from the DHCPv6, in the system: * * @verbatim int dns_add(const char* ifname, int ifindex, const char* addrPlain); int dns_del(const char* ifname, int ifindex, const char* addrPlain); int domain_add(const char* ifname, int ifindex, const char* domain); int domain_del(const char* ifname, int ifindex, const char* domain); int ntp_add(const char* ifname, int ifindex, const char* addrPlain); int ntp_del(const char* ifname, int ifindex, const char* addrPlain); int timezone_set(const char* ifname, int ifindex, const char*timezone); int timezone_del(const char* ifname, int ifindex, const char*timezone); int sipserver_add(const char* ifname, int ifindex, const char*addrPlain); int sipserver_del(const char* ifname, int ifindex, const char*addrPlain); int sipdomain_add(const char* ifname, int ifindex, const char*domain); int sipdomain_del(const char* ifname, int ifindex, const char*domain); int nisserver_add(const char* ifname, int ifindex, const char*addrPlain); int nisserver_del(const char* ifname, int ifindex, const char*addrPlain); int nisdomain_set(const char* ifname, int ifindex, const char*domain); int nisdomain_del(const char* ifname, int ifindex, const char*domain); int nisplusserver_add(const char* ifname, int ifindex, const char*addrPlain); int nisplusserver_del(const char* ifname, int ifindex, const char*addrPlain); int nisplusdomain_set(const char* ifname, int ifindex, const char*domain); int nisplusdomain_del(const char* ifname, int ifindex, const char*domain); @endverbatim * * There are also inet_pton4() (IPv4 address Plain-To-Network), inet_pton6 * (IPv6 address Plain-To-Network), inet_ntop4 (IPv4 address Network-To-Plain) * and inet_ntop6 (IPv6 address Network-To-Plain) functions, which should be * present in the system. If they are not, port-specific part of the dibbler * should provide them. See misc/addrpack.c for implementation used in Windows. * * Also function microsleep(int x) should make current process dormant for x * microseconds. * * An example implementation of those functions, can be found in * Port-linux/lowlevel-linux.c and Port-linux/lowlevel-options-linux.c file. Those * files are specific for a Linux system. * * To fully port Dibbler, also a main() function must be implemented. It should * contain system-specific interface (e.g. registration as a service in Windows * environment or detaching to background in Linux "daemon" mode). * It is also necessary to include following code in the client implementation: * * @verbatim TDHCPClient client(CLNTCONF_FILE); client.run(); @endverbatim * * Where CLNTCONF_FILE is a filename of a client configuration file. Similar * code should be executed in the server implementation: * * @verbatim TDHCPServer srv(SRVCONF_FILE); srv.run(); @endverbatim * * See Port-linux/dibbler-client.cpp and Port-linux/dibbler-server.cpp for * example implementation, specific to a Linux systems. Other implementations * (ports to different systems) are available in their Port-* directories. */ dibbler-1.0.1/doc/logo-pg.png0000664000175000017500000001260712233256142012664 00000000000000‰PNG  IHDRdF XÁ[sRGB®ÎéýPLTE*,þþþ* '  ááâ D‡ %_ÀS§I’E‹D‡B…A‚>~/^,Y=z:t3f*R&H5$LW>F34#4"GIEopn"#  .66?gv"'*.3 >99663311..++))%% Ÿ ÙÙ««™™uu’’¶¶žžNN||¢¢††sskkžžffLLJJ§§ ªª ÀÀ zz ‘‘ jj [[==22¨¨GGLL ŒŒƒƒWW——$$?? ffssyy,, „„"__——/jj"VV§§7HHxx* nn9‚‚I]]4//NN6uuV  33.==8aaZ**'UUPŽŽ‰ªª©"!ž–rl¯¡ –>8:5XL„oP?hN˜m{Q;##3%n@•OS)k&…-; sV“ü÷ðéÞɳýýýÄÄÄ6ˆöKtRNS@æØfbKGDˆH pHYs  šœtIMEÚ 9 tëöIDATXÃ¥Y x[Õ•Öu2¤ž’ͱc§,vtˆI—<í¶ek·vk—ŸöÍ’,ÉÚ-k³V:´Ì@™B§Ó ¤”–)!€BB6;vô:t†$MÇñ’|sŸä„Ør 3s>[ïéêÝû¿³Ÿs/÷thÿÛ/ŠºIm  ùÂN¡HD6O |xÇî}‡pÿ/zo÷-¯0ØT]èÑèúÉÖNš½!Ðeâ²T“\ØAëäüxïøÿ `ÿÏpÚ©œn…/rë‡ò\ \``àê ‡¤óUf³’…P:XÏüþ½ÿÂëÿHckÌ,ž–ªêõ#œ0@ñ­ÈçÒC9µ9 6„:eXÌö ›`—iòdw»è¿Lxûž‹¥z¶‡ÜÉrAá·E¤¢¢`qnaBìB^ÛΈ²ƒ ÚƒGKIЀÊÈ”ÞA"¥—!ülß—#<.dP´|­!"º¿ ª ÜtpÝ]Áv¥BÈ3Äd·k…r¿² ŒA¨£(Ô(MÚíkò§o&¹ý¯ŠxuS…€êÀ¢åí<€hÝ,`å0E*“%WÈŸø§…ô¤JʤӺ:…: Ši,›Y(ôPJ@Í’ô–0N!*„U3´WDÃÓýxD€Z \ {O—ÙAdõ>öÞ¡‰–“W¯^½¥BW¯BÓÞ÷Ö®g5r¹J(iâã+AoŒÚ§0ðe=¢³˜¸¢‡nD®»S+5ñÝ<tðß&,—XD$ÉŒ¿Ø»{â FØâWO–éê“G·„-½ÜN1OM"êÛÂ…¨¤Gèh€¤'ËøÏ\3„}j®œÒäÖˆ +€ÆD Ñ9OïþÂTNNŒ?’ÏíŒÅ‹/Ä3ÅD‰¸ÚN'Þ2‰ºx\aóÝ€(€Cï2€…STá#Õæ}ˆÂ j‚f°™D 쩚3ú¾/–ö¢|ÝŠwI·bc"ÙA$pÁBóÁÍKƒ$ ¸z „@@0aá+ß bºKͫˆô…óþD6ó½[çî–›y M´¯¥¥§XÔÆ¢‡—LáÈì|·ôpdJ}·J¢×‹˜b@Ø›—sêñ¡hj8˜öÆ[&^çॠ¯ýïZÇÖ[&Z <”çDÓ¹êy.“©·:´j§Ýêó{\V—WÉâ*^ZäWi³ÏW0öåbW&\¦×ÆwzÏÑex Í—Ï]2í ÖäpÚ‚áxq8“Íäó¹\:¹\}η–IB#¡ÓQp£-W¯l5—®[ß~‡“²@&Ðçý±w–ðosF’Ùt¡PÉå2©T6)_Èå†JÁßUìì—t0ãNIJïá4ÌÇÿj—9ü¥§/0XXŒáNg£!«^#é$ ÎñH¤N¶ÄÞ ¥1½o•·^{<íèZ{š% 6ö/ÍTWo‹#…yeâ'p¸Í‰€žOG\ƒ@¦`D†N‰ ! ‰ÎspsRËŸXX&V”@÷H\Vëñ*6÷HØ\ø–"iÈ“~¿<òk.7ëGEl5ªà??ùäÌ™óçÏMý÷×¾qÛmÍÍ[îwèì7ro>lkST„?nލŽ5sT$E02¹!o4VÌc¯õ|àe¹X¾tf~nfº¦B+6–©nCccã¦ûZ>I:Äf‹¼¼Ì–I¶Ú3¥Hj ?žÉdKÆX:®Œg¡¤;¸F¾á}t~jîòôôÜÜìå ÈÊ[QC“[½ïøK€ònY%vç°sˆ…´‡2žw—±½în£ËšÈzB¾‘qÜû*k"áC>Ÿ¹TSÿ&£ÿ5 /6@&šV5n¨PÓö6ÛØ• ^³ ‡ƒöíÈ&‡Ì)e–ñ8bM ®x&™½×”T6ÓñŸ×ÔÌO]®¹|1qáòôüÅÉK5+Wc´®ÑÙ´¾|·~;°Œ]¹ú¾Cï9p,QÊF\ñˆ×á ;±jsÂ9”Or…X²PȈ†GG>¯™½è<=55l;=w.â½0W³rÍÚu6´†<Ö„aUc]]ãvðƒ–+·/*SÚt,=”.fKÎP6 ßU òR4n͔¾x2S(ø8–ÀhdÊeñD¦¦ôç.úSæ?ÏO¯øú­õw+Ù,?×Ýa÷n\×9i¹rebÈm*å“^[Äë ŲŽP±Ú„q¿ñÙ=ÆTÖíìÎúb&ô\dz ¾œ÷Üyï©sþLÜéšZñ×·þލw”aG›zÓꯗÅuå–Í9eÔ’²§ûî¢}0ãËùOTƒ xüF¥7œàH3ö "¸ ÈåÉÖáDÿÅφ‹Ÿi!Ÿó+Ö7}oQ˜ÌN÷@ç¾5Û‚\-éRs.1e¹b(â4k«#4:t®ádÐSò% G¯\pfcþ)®4¹Z VçÙùküÂ^5[pRz+·vÃvà‡ '7guÎp$‘Iûƒ¡|²Pʧ«9ÙVTÙZ}¥‚3á²æ+¡‚Ì]<] ›­¡>§Å‹iÏάÜxÓ¥Tö¦s³ÒCW×Þ'®Nœ¼åx¾?áÍGÝyK<îÈgÃñjc)k\„Ây]±ÂHE\S|dÉJy“hÿ¹éµJFÈb±DFvK€á®ƒœ~Þ½óþrCÅD&cLºÅP>ŠºF«@üé̈M› ˜rÁÜB Æ@¦ÎºŠÉ ÅíG3ƒnó䥕·nf»…L¦JøérŒ“´Ò(#¤Åb1;’ɇ©t¶ÎeG–b ú†Š¥Âˆ½fŽàãOÍN™‚}öÚdþg&óŠÙšunªKmò $[5.Æš 'Q­S(}‰-¦ü™h>\‚‹òU #¥x)M¼±B!õèøøØ!Ü8øgç'ãŸNšáDhpêãÉ™š•õ«L|§¹Õ"‹ZÝRú–¤`PKxªN~Àc–º½!_"™Ïä³…¥U î]?„6’©p63âÊP:«;®BNÍ^š›ŸluĽ>ϾV44ºÒþ€ËéP³ïÜÑYx'åHçá€Ín“:¼…dÀ›«ÆÀ½E…(Á@&륽nÝ¥äÊÕN äÒôìÇfs¤¨F?ÇÂýÊu µ¿¥°6‡‰Ó%nÄ<Þy<~ìXÚ¯Áê%M!›Žæ–ñE_[(ă}ÑRf8ƒvÒË‚ÔL}ü‰Ûž ûƒ¨ãôE»Ö×7ÜþüwÚÙt®`síÆ(.çõÚksÑ4*S…œL•[®”K'µ}#>G17R8Úr/Í#§-ˆ‚ }záBpÈmœœúó9…ËéêŽ{îú‡M[aòj Ý‚K¡dc(WHЂ#ËwÔƒ$NA¬áDáÎe/úJ Œ“é¹™™™ùÉù¹šš,3ÖaY¤n6`QØùÅ"°gÅäžî?z“†î·nÔË‘(ƒuå‰кÿÔüZùµÅT¿Ä`ß*äOÜ´/}Äduè9Ál¡ðþqÜ®…Ž|¯aíÕו/kjg+4?W¹Î}Ü_„ò 0]Ãùæ/é~K>£Z?ä)"ÝÁæ Hã‚\šLÆ;Ë7« È¦&kf?žœ›¹ˆ‰ð—Í%àò…Í7ÇØÃB”à Ê´PüG0oÕ¯®P£ý‘û×b7µdæ³r6xv²fȸÑ7КL¢psq©`ÄAãy9DO ÆI]CÃÆÛo[»º!ah\½ºþÎ& ¤f2]´[‡bsˆ¯rh—¡ßÎÀJ(cÂV(ÜÄk5Š*WR áfŒ“†õëÅ<»Ý®g˜Ìsgÿ_a óCF³Íp«’.Ë ?%>¯ k½>O°oPÓ-Ú¢òÌ1U6'È·6Ö7Ôm¹wÓ¦M/ÈWÁÏmµ˜Nj¦'OÅBÿq»5c ·òuH^C*hgÚn¢ }X;Èô¼pØÙî8€Ã=›h‹¢©|-ƒÔL^ئ&ËLF%(sVt:CÉl(J÷GŽßD@·_‘‘D›Ç»møÔ# gÕú‚ Øe]Y'—Nÿ‘Ë’Ån§8Ö±ñ`Æ}!­€j¥ÌRbÛ²¿¦¼C¤/”>Àí¡™ò߃í™üèÆueZ AÊŽR™Ÿ?土ÂnÏ!L¬íøP‘k0êŒÏE[@sW!|LE†jçs†?€:;æ`dûp8%Poª¯Ð'ëË 5Ó³C‘Y,(ÏšZv½½½Î=[ô2ô—XamÒ|ɪª‹ÍÁºã`¦’˜·©ñŸàpA„twCý¸výbÔÌ\¸0WV…­8‰¥õYìrͬó‚, ©Ã¬veôºáÝ‘íÒ&ï»Oº×ÔnݰךµëooZ¹|êc,\Ω òZë,‹;mqOòà?Tç_[p)TA.Jhc-;iã7M·Öö+âºxÎf€ùS<ñW¸C;¶¾¦R¸—4=Ê£÷,.íDªÜâ v¬Ä€Ö6à àwÔiÌMëï–ÔÖÕv÷5V89ÛÍ&/Ÿ¡‚‡ÇFF‹ˆi¾kɶÁQ‰&¿¨(¥Ë—vGLx†Èª>¢E;j¿ûØíO“·mÕsU}…“¹¹S޹¹ótD:Šû ªS4~uÉ›Q¼gÑÀ;ÝêªhcTÛu‡SÂCµrð‰õ|㺊ŸÔ\š=}z~RøÐ›E±û•—Ÿ|êG¯îº¶ýÞR)à,’×(ÇÜ\¬¦#žü#to9 ûw{KmlifîLa­õxQ/V(À Yx@`I^Æÿ·Á¶~Ðݨ'ÀÓˆør0Ý÷3RØÕÕ% öÛàg© íoj7­-{e…“ËógÄQC™}·èurØ^>b ý¨ 0ô<@•8‹±(Ê2Þ¨%CL´[·îû!¶è,-ìРƒÚÑŽïä½ÃÜ&BûollX3ãôÌÜü™?Ò`ßíŸØ-c„B*„è‘=…á"øF‹›ŒòÝÄn¬Tœ¢j³Ñ: •0` bç¨ñ,©ÉõVKó˜)ºìïþç>ÓË9aÏø^е&-* šðÀÔÆ±øÀÌ£ f* ³ñí†50ž÷HÜ$¾µ‡¦09ÒHR ´;%x"Ól¾ÿ󃣎žòiRÞœ óp°y7®d<ÕêXD¤Q¨XHHRÂl§ß°Õx°‡˜€!–†Ù  €Åî–¶µCÈPët< §‘{_;rðy‚ÇêccoðHˆMÂËÒ¯ Ño—·ýö½jQ*Bܶ¢Á_GyÉ&§ !X8‹ÜÁ•?ù FîPÚ­ü6`“ {Þïµ´Œ7CÛ¯jãõ€iê’¦üGK6³÷¿" øD¾±úÏÂØT'…²øÅÝ×yèe©Ôc”Ndz>³£Ç²k/$³ƒÌ, XT4îîev~ÞŽ—ʉ€’ª|Ý^!¤¶§Þ¬N?#Ìn•“ ˜>è”±…‰(¹F<Ë bü¿í¿iÅðc¦…)€ŠäÂyó&O¿ÍmÐ¥u¶ÅEä;l@ÍDzDxñþ/=Ãèz0N`;ô€ÈxûËÎ…ž¢.ÕʽÀ´ãÍÚVÀ ÷ùAÉ=‰Ðu_ÌC1^üªÃ›7¿OE¢äY,XïŠôõ¯<ï‘l¿—ÿ±%£„¥—»(IEND®B`‚dibbler-1.0.1/doc/dibbler-multiple-srv.png0000664000175000017500000020657012233256142015370 00000000000000‰PNG  IHDRƒù P9sRGB®ÎégAMA± üa cHRMz&€„ú€èu0ê`:˜pœºQ< pHYsÂÂnÐu>ÿyIDATx^ì½|Õúÿÿ¿ï½ê½ z;v;( ˆ( ¨(E¤)Š4é]zo¡÷Zè¡—-HHBH¡÷Þ«åþ?»'ÇÝÙÙÙdgwfç3¯yñ »gΜó9ç̼÷9ÏyÎÿ÷¿ÿýï<¨ AR ##ãĉª7/^¼ø]wݤrñ¶T€ PÝ €¥xP*@¯Àõë×K—.­ý¬ªS§ÎñãÇ_6Þ‘ P* _èOÊ”T€ P?*ШQ#=?ú`šêÓ§ÀË·fVT€ P?*@–ò£˜ÌŠ P(X° –i822҇ܙ” P*(ÈRRš÷¡T@¡@RR’~’)1'ˆ )$ TÀT ¥LÕ, °‹]ºt‘„ôÈ# >\š©>ùä“ØØØÔÔÔÆßyçîÈ…ÉA:QÙ¥£°žTÀ ¥¬ÐJ,#9°FOBR­Zµ¶oßž˜˜ØªU«*@BH²T5&«B¬ &ã$½òÊ+Û¶m,Ÿ'±û>„³¹’¥€S‘0cÆŒ×^{M\ûî»ïFEEíÛ·¯}ûöªNT˜Ü¿¿ô`©°¼d)Ë7!+@¬¥€2ÜyÆ %K=z‹ò|ðAAK|ðþ+ìR‚¥pìܹsÀ€ùòåi¾ýö[á«^»vmwȬ]»vt¢²V÷`i©€ KY±ÕXf*`U`+RBÏÌ™3%K]¾|µÂ4ŸL€@uëÖEÜN%K§à„.ÃxÞ{ï½Ý»w?vìXttô;ï¼ãNT À²A«êÅrS*`ÈRVh%–‘ „ŠXš'qçH –ÂŒªøÇ`ò š·íZ³v‘V¨N:I»X «ùpžÊ”)#Ò<÷Üs˜QÁ÷\Z¶”\…Рˆ¼**²T€ ˜K²”¹Úƒ¥¡¡­€rý]… $K8p?}ú4ÂMV®OÚšvtîÒõ¥Ë”H„°œ“&MHI–Úå<ÂÃÃñ•Hóá‡nܸYµlÙRuóÄbàæ3¡ÝÁX;*ÈRA‘7¥vT®K»\ð|’,uîÜ9(‚¥yøü•׊lÛuLžc§Ì{¾Paq QX÷'ìR‚¥à±Ž£k×®Ò‰ >X™™™p´‚û¹Ò4%þF…qìØ¬3 Æ(@–2FWæJ¨€›n`‚#”`)8ÿþûïH.è§áO-·ï:ær¶ïÒ÷|·tœ®sË–-J–ÊÈÈ@$*P”0GÁ‰ ±Nœ8±lÙ²"EЏœ¨"##ÙDT€ P¿(@–ò‹ŒÌ„ Pï Ô©SGbM‰%¶nÝ*Xj÷îݸ¶"xP!Aø¬¥‰éÇÝÏõ ™ß7hr‡“–`…‚yIÚ¥ÀR8`ŽÂÒ¿R¥J‰» ¶Â‚ @Tà*U'*L8ã¼—›)¨ 𠥨A¨Êpç-Z´,uòäI”»€`|JÊ8®q.[“ðAÙl'ª§Ÿ~û"cŽO²p d†¹B|%ˆêÓO?¸Ö´iSU'ªFщ*@=€·¡!ªY*D–Õ¢&SËè”sm‹/–,uóæM¶I“&HðE•ê;2Ox='L[ð‹/‹ ß{ï½åË— »”`){öì騱£ã )€>TÉøéÊÂòúôéC'*“u‡ XF²”ešŠ¥–VSr_® %X ëòP/øKaJ ÂFNö R2AÇ®ýò9¨p|÷ÝwÈPÉRÀ)D¢úþûïE‚‡zhذa§N‚§ÔË/gs˜’¨P*LZZdž P (@– Šì¼)°Ø&O‚‹àÁRØYZÀó ßb.!õPòî“úÏMÛv7jÒJLÞÁ …Í¥] ,•å<°ÛL±bÅÄÝ‹- `Bð…ž={ÂE]ÉRâïòåËcÒÐvÍà S* ÈR¹—R* O—p爨)YêÒ¥KÈ£ÿþà˜wK}˜²çdεq©å+T0O)øK¤$KíucÆŒyì±ÇDšÊ•+#ª0ë‡~pÇ)|‚M¹ùŒ¾¶e**@þG–b' TÀpOYòäɃø‚¥Ä2:„;Çî{Hðk÷þ©Y's|Θ·üÕ׳# `5"Q »”`)l„ ƒS›6m¤þÆ&€pä’ñÓ•\'*Di7\Þ€ Pë+@–²~²TÀô (Ãf"ܹd)Ø«Pvø0‰pç«Ömß™u*—ç€!cóåÏv¢‚³PI²p wÄÝ¿þúkMp¢š:uê™3gfÏžhÜmTªN'*Ó÷/ Y²T€·§!¯ÖÇ)ÃwîÜY²ÔÙ³gQýiÓ¦bžzæ¹´½§ür&î:ܸikéDÕºukøc¤KáÀ>3ð@ã7<•,Yrݺu(̯¿þªêDØÇƒ P*à®Yн‚ Pc€]GiïY³f`)li,Â×®] 4úe×¾Ó~<7ħ}úyeqkxJÁ_JÉRÀ©ƒ><þü" ŒXbG¹ôOYlà`»víèDel_aîTÀ𠥬Ùn,5°Ž†)¡äÍ7ßH –BD(TV«Gy Â#¦ï?í÷sÖ‚¯½QT xñâØUFØ¥KဋzóæÍåæ30›!tçúõëa¬rŸòÃæ3ðý²Žö,) P€,•y*`g·IBIãÆ%KawȲqãF|›7ï½ûÏwŽ;õÑǞŀ³HN²Ô!çHT_|ñ…HðÄOÌ;Û-cò»â;À ËÎmʺS* T€,Åþ@¨€ `¥ž’Eàâ-YêÆ¸qË–-‘ rÕš™Îz¦dmÙöW@›Ýò¶mÛ‘¨`—,uØy {áÂ…EË–-‹¢øRuó™5jp󻳦ÖQ€,e¶bI©€P†;øá‡ãããK¥¦¦¢6ð—*RÄÅ`аñ©ÝÏ}ÆnK¯ùMv$t8Qa;?%K!p(޾}ûʽüñGX°N½J•*î*8Q¡‚Ü|Æ‚“E¦þT€,åO5™ . ”.]Z"pD²Œ@H‰høÖî‰Ðêæm–Œ Pÿ)@–òŸ–̉ P…111JÂX–Ú¶m›w^¯^=$ø¶îžXjÿÑó?§LŸ÷̳Ùó}ûí·ÉÉÉ’¥0µ‡#66öÃ?UE­]»öòåËpSu¢‚5Nìß̃ PV€,Â˪Q`*€W$KÁq{Ë–-‚¥°DÅ‚ÕJÄðœ2s¡K8v!ðgæþm;t‘‘¨0»'ìR‚¥°3ÕüqQÁ¯¾ú*++ ~ë˜ûs7Pá“_~ù…›Ï³/òÞTÀ`ÈR Ìì©€](T¨‹úõëK–áÎá5…oóä½7)ýˆ6K<~!(ç¶äÌ/*})ªßó (YêôéÓ€'¹2œ¨:tèpæÌ,,W®œ;QÁ×jðàÁví ¬7qÈRkà^½z=çáÀöaâÀÔ ö¾Ð®XåÊ•E6Êd˜|â.>颚›×d]|½×œÀSás&E à[`Ï;%OL˜0A²”wÞ¾}{$ø´Belfì•¥¸¬sá²Õ…_~EÔå“O>Áv)°ÀÓ®]»ä^Șæ›2eÊ•+W0¡ Sœ;Q½ð Øé9ÀmÁÛQ*`´d)£ösþx…«N"¸¨DbßVw–ùø 7ª¹y­¹¬‹¯·óšsx*|Τ0¢Àài—ö5â.žò„_¶ì“<ð@J°Üp‰ wÞ«ÿ0,uøÄÅ ž½û…åÐS qZ·n¨ž’¥€Sp¥_·nÝ»ïfÿ|ûí·á+võêÕ~ýú‰¥."Aˆ‰NT€ „†d)‹µ£’¥<¨”nبTkH–ÊeÛœ¥„[wYJîü³Ï>“,…PPÞE7…nIÚ£Ÿ¥Žœ¼Äs×îÃõ6ƒ ;Ì„‡‡ »”ò˜:uªÜ|¦Aƒý€•€˜ßtÇ)Ì ÂŸŒNT¹†¼œ ˜D²”IBo1ä+0¤z žÝ0HT‡*N1Y¹„0A»”ΖðÄRªÂêÌÓÉ‚k"(ãXÂ<#YêâÅ‹¨&V½¡§½úz‘´½§|b©£§.÷\»­Ä»ï‰aCÌQ.8…ÀTmÚ´›Ï $D=Î;‡ê—*Uʨ (0zôh?¶;³¢T ( ¥‚"{Îoê•¥dÖÂ2!ŽE‹é¹%YJJ"É'(ƒËRð’}ö'lc'X  Ò!Üù矎?6m–:vúrÐÏIá:§üpüðÃ0³‰)?y¤¥¥ÁsN$@ ©9sæ\»v Kÿð·;Q½þúë˜Ôß÷˜’ P³)@–2[‹x)~–BFòiîɈår3²”þÞ@–ÒЪN:’ô»Ô –Âö,¸ ñ-áA…s—¬ÍK?}9èç#§[¶nçw¡"pŠ0`€ Ná¿p3/Z´¨B„}‡Å–*U'ªJ•*Áa_dJ*@Ì£Yʱæûà1#å.?|333ANÂN –Â帞µ.VL2Â*&.D¸—jÝôà²jÕª•È hˆ4”Ê“Rʉ‰NÚ—¨f¥,¿¸©{2O…WVy¹PÙŠâ¡v6 ‘›)•j¨®Ö"Èÿuih]]-‰0u%YªY³f’¥0†\.\ˆoyôñÔ¬S9d©3—O˜ãLHL+ÿiö62/¿ü2àɨÆ'¨š4i‚¨]»¶» £]ºtáæ3¹èz¼” G²TptÏñ]}b)¥i ï`åM½úž‹U`.{|¢:](sCh¥«–¼\ÕgK›¥p#Õ¬<­O” ˆ?”ó›(ÀE§àÀ&÷Z#|èBT9ó=GÁTóGMU‰S( ÌŠ.•Úº·ˆ§òëT ÷É@NÊnƒ°L‚¥PJ„;Çî¿HP­æw¹b©³WNûkÁ³ÏeG@@gÛ¹s§ˆ› ={ö4mÚT:Q 8!6lØ€îDˆˆÈ}C0*@¦Y*`RûçF¾²@<¬]¦ù´YJB ^ÌÂ|¢|C»›CdnÊ?\.t)äÐ`)ÜB¾cd”håg’¥@.ï'UÃ’{{(aEµâJWý°”»ªJaqGwë‘d)—k•Í¿•&Vw*ÕŸø§ÿéÈ–yw¸¤K!®†ÑE^=1"·,uîÊÉ žg¯H–‚;<¶ëØU„J3uêÔ q\ˆjûöíˆP%ÄA Sì÷¢ÂÒ?ÕÍgŠ/ÝtèÍ$T€ _²TðÛÀ§øÊR’0\Þ¦Ú,%÷.«ü$£ +—‰6%帘XDüO‘¡ yÂå>n.„¯ä½<-B·Ã½pk¤÷ÂEv˜Á$¸ÜT‚²â¾²”ÒwÍE=™ò‡aÏÝ|(iX9ˆ¿= ‹TÛ×§ž–ãÄð¤–JV¯^]²vµCžð´±uç¡Ü³Ô©sWƒuÂ*æÂR…PéU«×ÕÇ30/‰PéÊŽù˜ ih*%%kÁ^Ê•RÀ5jÝxP*`fÈRfn•²Œ¥\æEQ¤åÆP”Vw&XMÄ[ß´qéUíI  ÕÜ$5ºS ž6–UÐöŽ’÷‰¥$¹çDÙdnž„U½PB§»Ù)X,…¿äÑ‚’¥D¸saµú°ì'){Nú…¥NŸ¿ø§ÊRØë».XýÆ›Ù.çØyÓ¦MîDÕ¿á„B $@ä­jÕª)Õ#AŸ>}èD¥g3 –d©`)ŸÃû†¥4¦„$ǨšO\lE2´i)IEG^Ò ãI#ÕÜur&¦TÀ8ÈRÆikHξ²”´¸¸€ŽùYJ¬ä÷zH•-ÁR^«ƒÖe)8Jo¼ñ@J°€ÍÓÔÃ?Œ¯¦Î^fK]¸|ýÂåFœ ´\²TÆ3;2ŽüôKke ÌÔ¡C̉»;vìi 1Í{‚r-[¶ 1܉ ‚_ yÐ0S*@|Q€,å‹Z&Hë+KÉeó.ÓvÚ,¥1Õ¥a—ÒpÜÎ]Ê×Pݹa)9¿¦ÿ¦9°KiÛíT;—µìRð–ïûºuëJ–áÎ…Õê|îÈÕˆP.ô£GT±Ãë+_uuž*ŽÈ° :lúÅ.¥ÇáåbJØÒÏRr'mÖ´:Káu®|ÍO™2E°JýöÛo¨°Z}Q¹ºÑ,uéÊ ?ž 3ÿ²¶ÍÙ™ujÒôȧžÎŽ»‚JîD5iÒ$©ª"ÐÔÑ£GÏž=ûË/¿¸ã>Á^=ØìÏb3— „Šd)‹µ¤O,%Ý€Ü7QѶKilº¢½tßÓÖ{ª åTqD¦Ô(î‚ò ?n¿°”„Ný×ÏRÒ&‡ž'})Üí•i¼Bªyü¥I¾ã1—SŠ`©´´4ÔÁ¥D€ÊÁ#&€¥._½é—óÒÕ›±Têž“)»O¶îÐ=ÏíPé?ÿüó¾}ûLÊŸ´oß^:QõîÝûÚµkˆ ür'*X­8åg±:‹* ¥,Ö’úYJx@?î¯pm–R½Jyåâ; ûŠ L¨âˆÆ~Ì2gÕ¡zŒj­ÿS¦—°%çé|b)Y`O¬æ)œ©…X ËõåÛ‘$K ƒ(\­ñíwÞŸ| 0,uåÚÍ\ž—¯Ý4š¥’wŸX›RµF¶ƒâ&Œ5ʧð_ÄAÀâ>!/|¤öïßInJ9©*¾…ӺŞh,. ÈRkF¯,¤€¿¹t“ÂãUu²L›¥p¸ìg¢Ü´D¹™ ”,… Ý}­<‘„'QnVãîÀ¤º£ ÊK–R ëRqå†Í²v>±”Ýcw)óW{®19¨m—Bs¨îEí÷NÙ%¥™dРA’¥D¸s!WÑ·ßIÊ8@–ºuåZÎÏÀ°Ô€&á³–¾òZ¡!™®Zµ ±¸\ŽÅ‹çÏŸ äÎÇBs ‹•ß—R*àU²”W‰Ì•@¾ÂñHU]æbù÷|Ò«]Jä“»ÚÉœÝ󔹉4À.Äå³›§}è”SuBnåU27pŒôÖrgÄ\²”ËMQGd(ª ÁT :>±2WîÖŒÚ a]À×Ý9=Çv)¥U™hÌ]ú¥+Ã#'Z_°”, ©>úMÖª}÷@²ÔÕë·®åèÄ…€°@²Tbúñí»Žuéß|1ˆêׯ¹<%Ná¿b –õ!ÞÄÊ•+ñ«víÚrlÂjå—e&T€ ø¤YÊ'¹‚ŸXÉR.Øäò_¼>]¬GÊÒk³”r a=p&rÿJbP^ˆ¯Ü-LÚßJlr)ƒKàQ¯Ü³”‹Íå¦:7fÖ ˆ£´ºä uNÅzmG$Pî-n¤‰bzy:uduŠ+,uðàAä†Yª†ò«ùfÏž­d) •)mnÚ‘×R*cÈR9–ŽR*àPóJòu36ë,µgÏ|+à ŸD–ºyëw¯'xË$,õð#ްRÀ& RøŸ<ùä“ W%K•)SFŠ™VöH*@‚¢Y*(²ó¦T tPno‚pç’¥°;/*¹víZ¼ìóäÉ»=ýXpYêÖohœ7s®ÌÀR³—¬‡b°B)RÍ›7LJØ^Æ…¥î¾ûnÉRX:½Š5¡–R€,e©æba©€É@¬#ù.ÇcÇŽ•,%Â7mÚŸ^¹ºXê·ßÿP?ûÃ<,Õ¸Y{(ï(xîË㥗^‡£GV²Tß¾}•â3î¹É‹c#ÈR6jlV• ø]°°0ù:¿çž{R‚¥vî܉{!¸Ô›o¾‰Xío–úý÷?ÜÏßÌÄRo¾UŠ 8P‚ôÄ'ˆÃ #Ÿ’¥„7º8+ÕïË ©ЩYJ§PLF¨€ŠÊÍL>ùäÉRŒ„ÔâMŸa–úãÏ?þ~­ÌÃRˆ‰€èðP,%%åÀíCDùôÓO7lØ d©Ç{L²‚v²ƒR*,ÈRÁRž÷¥–Wq·a,‘¯ó®]»J–¶q¨Þ€ðm‘·JlÛuÌT,õçí\e*–ê9`+^¼¸)üñþûïãCÌè)Y*<<\9Á‡½¥-ߟX*`YÈR–m:œ [l '_çˆr„uK‰ð—úì³Ïà§æíÍÇRíTfc© •ªA±6mÚÀM°í‰pçØHÉR?üðƒó»/ðþTÀÖ ¥lÝü¬<ÈÊpço¼ñÆÆKíÛ·Ùb<¨ð¾Ÿ»t½ YêÏ?ÍÈRXðŰ9Œd©)S¦à“W_}Â*Y ŸH–jÖ¬YnÚ‘×R*KÈR¹—Sû*P @ù:oÒ¤‰d© .@”éÓ§ãÛ‡}|kÚQ³±Ô°H‰ÓLs|“g.bð‚’ …?¾þúk|ˆ˜J–Zºt)ÃÛwà±ææS€,e¾6a‰¨€À¾ÅJ“`©-[¶üñǨÁwß}‡5k70#K)ÜÏÍã/Õ°qK(x‚aOÂÁûð(Y ®iR|„;‡ãšº ËHBV²TÈ6-+F U K—.òu@J°ü{p_˜¦¤ FOžg.–2qL„ç †b¹)A ö'|y7oÞ¬d©>úHŠ_£F Cš™S*àU²”W‰˜€ P°ÖL¾ÎèH²ÔÉ“'‘/~|‹åý›¶ï3K™6Vç’èx(7ó]»ví½}ˆH§ %–ºÿþû¥ø wÎñI‚®Y*èMÀPë)püøqåßСC%K‰pç­ZµB‚÷?,Ÿ°ó¨iXê÷[¿y<ƒ÷¼k/GÔÓR¥JIÂðèLJ£FR²ÔðáÕâ3ܹõÆKr ¥B®IY!*`¼°…È×9ë­^½Z°Tjj*nŽpçÂjõkÏÁæa)“ïm\ºLy(Ö½{÷¬ÛGbb">áΕ,…]ù¤øÐÙøÖæ¨ð¢YŠ]„ PŸ¨T©’|—)SkõK>|yaõ™Xe¶<&É$,uãæïzÎ`ím¼eÇî|ݺu’¥úõë‡OJ–,¯d©gŸ}VН5ŸP*àoÈRþV”ùQPWÀ%Üyûöí%K]¹rµ‹‹/û—_}sÒŒ%AŸã»~ã7ý絿]½~ëʵ[—¯Ý¼tõæÅ+7.\¾qþÒõs¯Ÿ½xíÌ…k§Ï_=uîêɳWNœ¹rüôåc§/=uéÈÉK‡O\·çÐÙÝÏf8“qàLúþÓ»öNÛ{jgÖ©Ô='SvŸLÞ}bG扤Œã#ÆÍ„\/¾øâÅQ¡B|عsg%KEDD('ø°š2Ô»ëG, YÊÄ"Ró(j×®òu¾páBÉR—.]E9sæ< ’!–÷ª ;‚µ‡ ØÈ×3ð,UëÛ ¡Ì%Jasè¼yq;W®\©d)š’â3ܹyÆKbsÈR6ï¬>ðAE”ñ9ñRGô#€”d)—:zô¨ÈñòåˈÇ-&ûλI‹‰Çaƒ%&y÷É”='S³NÁHSMú¾ÓûÏÀx 90çì=|nß‘ó0ðÀÌcÏ¡aõí ØŽŸ¹|âì•“ç®À>+ÑÙ ×Î]¼ÓÑ…Ë×/^¾qéÊËWo^¹vH”ã3Àv©G}*!F—d)éô…^À†}ú`‹¥Jü¸Û[·n=pà^ÿXJ†÷:>DpÌ:a¿`)x ã8xð ˆ8… þóäɃ”à°z?4Ý–vØ 9>0¿Îøž}ûh©3oП@yÌî)YªbÅŠ²-°”ÒŽ’u¦¦T€,eÊfa¡¨@°ˆŒŒ„k³;E½ôÒK³gÏ!)¬&Cès‘øá‡H–Âä h@CÇqäÈ‘o¾ùF¤Ì—ÿÁCÇúÝ_ ôãßÓÐu|·fŠh`SÉR:d[ª ¬’¥ ­l†;öáý©À_ ¥Ø¨ø›ðp*]º´;EåÏŸsL.¥üï²eˤg4v‡‡‡Ã.–Ÿô”””‹/Š;ÁÜòú믋[¼]üÝÈ¥1þò=÷q¡ïà1Þ~ûÊCÈ8pà@%K)ã£â[̽²ãR*`ÈR&iƒ _8Œcå;Eá“Æ#¦¹HɯÆ'×úU®\»ó –„œ ¢¢‹ªNœ81_¾|âvßÕm´5eoî×ña)Ÿ§q,õE•ê¨~‹-$H%$$`B7%KÕ­[W6 H4øÝ…% Tà¶d)ö*@ „……©ºFÁFsèö.\ÀTüÄýDîF$éD>“,%€ý÷ßÇMÏž=Û¤IyóÞÛ­×ÀÜÄDñw«3OÞ{Qw̨Â(ŽAƒ KUrr²’¥°^R²ÃsÐRS)@–2Us°0T  `i}¡B…ÜÍQÏ<óÌÔ©S%*€0I÷矢ˆüñŒX8…¯€MŸþ¹ÈËý† ‚OpÀî‚cÇŽ§NµEP%9«øbáWæ-ŠÊA|)°ŽÑ§ßãžO›³ â<ú裤ðŒyø›C+Y æ=eÁd„ŽÂ[R*àA²»°¯Ø8¯|yÇ–º.bÁò¡D¥3gÎK’ò¸uëxH›¨`qyíµ×Dþ%J”€ßº`)¸Zã@Ü*!D ¾¨Ÿ”©?V'Âuæôï2š´Be«W¯ä!æ=¡†’¥:uê$ÛS¨öí²¬90¥d)S6 E VV%l#¦á\ŽÚµk§¥¥Á %,Á»yó¦Fq:~Ð2½ê˜·’NT5kÖ\³f`)Ì÷áØ·o° ·@V`87S~mÚwÉÜÂkÜsðM O?îÇ÷‹/£¦ð0“ %¶ÛƒÞiJ–*Uª”l&„û2¸w0{*@|S€,å›^LMB@„)wÙ FÚ°û›„¡cÇŽ‰½ŠõØ1®TD…Ù+xX‹a«>œd©íÛ·Ã1@†©CÜ ù x’Hù̳χϜ§½‡ à&À§_ö6^³ „¯ê.Yê§Ÿ~‡ßÿ½’¥S^î¦>=-Â4T€ L²TÀ¤æ¨@ð€Ÿ F 4Ga[½ &(IþãxÁûTb¢wj¨€ˆó)nýüóÏ;v)°ì<€8w)â§#°‚HYúò1›¶ªîǬ Êyòì•g®?}ûb—@” ;„† 15¹ïèù½GÎacA¸Òcq"¶Ì8p&}ÿiÓBxÒY§R÷œìÑw(ªV²dIXå!×NBÉRp5“Åpç>õI&¦Q€,y*d`õ©Q£†Û„žÃ.Ò¾}û½{÷bižò@ð‚Q£FÍ›7Og#$CbLÞ¹ä£ú_xMa×ÞlN*];Ì–Â# n}õêU¡×СC×Êi¿¹ë§¦-Ò÷þkocloÔ3—,õaÙOP¯Î;KŠŠŠÂ' %8æ+Y ÛËȆƒ[{oO¨€›d)v *â '$U×(ìIv‘¸ƒI=ù7<Ê1—œÂw¼ôw _!H c’–iä5˜À‚ÐúõëKáLÀÄ%6Ÿk×?þ(`âÁ=nòñ3—OÀ,ô3v©m;‰H«V­ÚyûèÙ³'>)[¶,,‚J–R†;Çülˆ÷WV XP²”E¦º€/³ªkÔ›o¾¹xñb%E‰ï@8’ËÏáþ¥5K/u7>R* ÈRš·¡VPR¼xq÷I½|èÿny ö¦púØŽä *™›ëMš4 WMŸ>~T"þ˜2e >ÄWH Ìĺ<"•ò[÷¿±•¯\§öÊ+¯ ¨@ à À9ˆÜpí•ú¶N½Œ¬#˜ò ú™©Úu¢ õêÕƒýIð–*¨Y?i—úùçŸe#2Üy€oGt*@–Ò)“QË( jÔ¨‘ªk^Ì@ iæôéÓz\ªcÉ”˜q[½zõ˜1cO˜ûÓø/>ÄW2n}íÚ5w¥U÷Ò&ªiÓ¦ÉݔᄜKÁ:…Å†Í 9ã_lý›*ýÞ{»öè ” úé«ïù#>ކJ–Âä>yõÕW…¥J²T‘"EdS2ܹe! j3ÈR6kpV7¤gH'$–`#¯Ðã"HKÉ@˜’›?¾pˆW.3Ä\ž˜%Ô˜¥4w¹£&°ºví*¶²-ÕS°”80K(æ‘ôÈ.üò«s#—Ábº ž¾¬ã[²*D-eÕªU«†î\Ò8rÆ ÊvÄf>!ÝY9*`UÈRVm9–› ¸(€­`¤]GùÆ>n˜ëÈx¤ =.9ƒà·$/.MÊ 1§œ%ÔhÜÈR^îò7ñBE”Ìù/[åDzA¹K]ÅJU“R÷À>¬SL„f­AÌáø¯¬×#<‚aœ“‚¥ºuë&›ˆÉ>O¨€9 K™³]X**àƒƒéi+82»S BI!N¦þÀ‹ˆ'úA8éD¥3Oli|ðàA œÂW@ÃbÅŠ ’xë­·æÌ™£$XȰ9 ¸ÝÀ±éÓ”uW»Ž]³žÖåÔ_ê­b=zô5Bíð hILkÊãã?–,Åpç:{“QÀ+@– ¼æ¼#ð›05kÖÌÝ5 Ÿ4hÐÀ¡Ê+îŽäž 't쪋½¹sçzBøJ#VJqêÁÄ…y+8Z¿´YJ|;qâD¹ñ«¯¾‚!J‰‹%ܳpk¹ð±ÇŸ?yÆ¡ãêa©-I{„³âGȺüòË/ø»ë§{q`h±Ž8°$Óoý†Q*àWÈR~•“™Q*&\‹\Ž>øáÅ1&̈Á Vù •@Ò‘\•à–„—½H×(ÄÏ”—c¾³„ò¿øJ8Q!18IÕ÷\¨t‡€ˆ_%sÐþ,Dñ±ÀÀ8Q)‰J:QaæñÝw&¥?(»vcà&À§×¸ç†ŽEñŠ-ª¬þ‹˜TÌŸŠÁ&dË¢úzP5€½·¢Tà/ÈRì TÀz `ÆMl6âr<ûì³3gÎTB KÒ5 ŽäˆV ¿…QG.Çsa ÌÌLïî;0(Y{¼üþûï ¡É±í±ü a6eˆP‚‹¦ÀÄ:qªÖ­[˜“Ë€z‰Jã€G6ìR¢¾O=õÔÈ‘#•&|‹Âˆš"Òâ>ˆ”uü˜’q|ÈS{™J_:¢Ï7mÚT–à‹O@KøCG­Zµdû–.]ÚzÝ”%¦¶Q€,e›¦fECB¬t“ûþ*A Cˆ dOþà%BD4NXŒðþ[Áx‚ž7n(U„¿¹’@Hà$ºä~Bb9Kˆ—-[†òËB¢ʽ“a ¨if_{í5Qq˜ À‚J¢‚ߘˆÏŽ:¶nÝ:;nBÞ{íÚ|ÈSc?¾oß‘ó;U÷6Ž˜¿…$) ,̱1ÈÔ¨de†;½Í…’d©PjMÖ%d˜ù$Ví)l˜(Y öH¯Ê3 AT€,Dñyk* ¥¦¨jÔpø)»p‚ Pp9àý-Óé±NSൃKÜóŸàÕ?tí„›Â)WyÊS‡¸©ÎÜD2Ø·<å&?‡ƒ—ôÄÇFqPr‘¨P¼Ž;J'ªVí~ݹçXÇèSÚ¥VoLDSÞqÇ@/Køý÷ßãÃúõëãCyDGG‹rŠƒáÎ}ê3LL¯Y*ðšóŽTÀ‹xëcç5U×(8ž‹5kâ€kŒ=ò¿˜9’‹éð·§ÛÀ3ƒÒ5ʬ Â8¢zŠ˜^·W,%ʆ[£^;B! ¢’ê¹QIE„À ÂZ ^éÇín¤•Ü|æÑÇž5nXÇèSÌñõ0Åô¬²`"T=ª ¤<„7º8îÜkWa*tÈRAo€ üMøk«ºFÁégùòå à… 5L„ášà¿â+X³Ö¯_/,"QæG%?Ä·ˆž€…oJ"ÁœœÖáD%?Äå0& êòÄ@z„kh@™!¼àA{òÀnŠ”(ŠáÉk Ó”ð¼7ŠŠòj—’ LؼY È<€¨T.+ã>,œ¨bccÁ4"åÛÅß]¸b]&¼šŒ;,Uæ£Oq;e©–,Y"h ä÷y|öÙg’¥`›ä¡TÀä ¥LÞ@,ž€ia„äKTþhIÆ -Éðä²ÿ3Y2f%á…-œ¨0[‡9;=@e†H $<Äe8z‹@ . „«9>ÇÄ"‚ÂÝ[^„A;z`>ÏäW¸µ°`¹O Ât„Kbéîˆûʫ֢š5äÿÑG õ^xá˜|”D…ÈJô*Üâ±Ç)k|]gÓÖ] ƒÎäÌ£bÚŠÉòÀ}Ÿ|òÉ'`;å¡ w¯8V• XS²”5Û¥-`LjÔ¨‘;Eáí‹ Ž0·Htp<1èD˜ŽÜ¡¦#Oþà€!%Á‘\LÒà„$¡ ÐÁz\öN‘¨dP— ¼ŽËÜ O÷RÒ0QØ“ÄjBm¢‚³¹ÜéhµjÕ*,'”î%#QaBMlç‡ÈO-Úüº#ãhú~¬¹óó9nÊlÜâùçŸWC,0ìÓ§BÌËcøpÇT <|]LZ#ƒµ¡ÖP€,evb)CX¼JU·‚¹ ¥¥Gç"80ÌBòBÉ@îÐ#f 5´•ˆ"7xM‰ÝôÄÜôéÓ1m§dÌ*¡Çõ” C‘dVÂî…üq™'PÑTK5”ÕtG+[·nݤUÆ 1‰¦Dì (2Ë p>öø ¡ãÒ÷öïùmÝ9¹dP¸váC8ËLåñÍ7ßHb¸óø¬Z()@– ¥Öd],¦ÀŠ+T·‚yî¹ç„µFðIÒ†—š‹hœòrxÁ¸¥ÌV—YB íÄ¢¼^GðÜ (3Äœ 'èqÉ B’וLÂär–ŸËYBmÔ |O|°ͳ 8QõêÕK´*¨ð·t¢zí¢ˆ«¹kßi@4*ï>`À|òÖ[o•â#H–‚Í dìSÓ[l °¸T $ K…D3²VSæ™òåË»OêÝ{ï½={ötǰ â`“EJ¤÷„ 3d¨g1¼ ”§ aàÑY0‘ p „3d‹`åÊÌ‚úÂõT Xyÿý÷…௼ò f•D%¦EÙ”NTŸV¨¼~Ëδ½§ry.ŠuÌ!æÉ£¼i… ð!æp±V@h5e¯€ë=”Á"u¡tÚ&}j&¦T — ¥r) /§9Q@¤~øá@‰* ÀŸZÌ…ye ÒˆÄ,%|§àïì5¹ôÇZ3O⎰-ᕯS 8•ÃéJ£x0Ëùä'„iAáT®}ÀK®‘DdØ•¡ÆwîÜ)¨aA8€Ãe­qÓÖÛÓïÌ:•ã³Y«NÈ ð¤¼ŒdøpêÔ©%Ÿ~úI²üâH¹@a˜â¼6œÎ¶`2*@r¯Y*÷2*à³.±£Ê”)ƒhxAjûöí‹éÀ@˜_s•â|.œ™Xéen˜Sc‰âá € OþàbͧâÁÜ"î‹y:¸LiÈèA´*áå)7°‚¨&\ˆ¼E½íéaÚÑP| ë"vÊÍgÀ.púV"&CÅn†€9¹ _þû‡MÝs2gç[Åñ°ãž¼dÇ'˜Îƒ¾òxûí·%KÁ…K•¥ä‡˜º¥™Êç±Ç ¨€ ¥ •YRo (çq`~€ME öE‘q ” ¤„¤Qæ&]£à …¹3ùfµÀ‚Ü£qb–pΜ9zÀ4H,/d€6€nÀ&ù!hÑ¢E *Ѓ«êà®D= Wò8QÉjj…‡“Œ•“žN ‘ ;çT«VM´ÂÃ?Ü¿åþ-@COø“afSªxõõ"Óç.OÙsÒ§3vûn ºä]èŸ|õÕWÐD°“ otq —6K‰oÈúçC½uL~O¨@N KåD5^Cr©€‹§Vï t¢°FÆ#¨„¥Grܡǥ¨` ø*É{áÀKf`ñ ìL.Ðãb(‚]DÉ@pôÑ8awÉ[Kè? ôÈXY"•õPJ :_10„ðXÇ(Jé@x¨£p¢Ò–[µ+VL´ö¿CÙ”D…m^p¹¨txæ™gDÊË~²"fkòî:Ï~acDþÊÌ_~Ù±1ß Aƒ”,¥ wŽ0 àc=,…4'æÕ€—ËËË©ÐP€,ÅîA‚ €’¥^|ñEüK÷1̓Îlµô‚xpào|"¯ßh¿\±ææ%™v€ ì"ð`JS¦#Õ¥‚pG™Ð nÝpôÐ “2C°ŽûL%†4™ •‚ÿµ¨£ðƒG”Œ¤KÂÈÄî®Ù"Œ»¶¤`PéD… ãJë*»”tÒGô éDU·a“[3wdžðz~Q¥:Ú·qãÆ’¥P|‚yFÄSÅíäññÇËŽQ®\9 %“Ñ@„‘Ì[R§d)v*”,ãü¥ÄË{§(¡Ä+Ww`Ur¯Q£D…Á@XoïÂ@ ˆä=Q£DnÀ,á’% ŽÜò°‚ÉD0z´(¸0*¶¶7ÁUpÛ¿¿’5j ¬ÔVYa»héDÕ¬Y3åNÃø[éD…8U¢ùÈ÷`Ç®ý’2ŽkŸyœ@ác.óüõ×_ö­?„aLyotq`ÚÑW–BzÈÎù¾ ŒgÞÒö ¥lß(@0P²ÔСC1™…Èœ§`Ññ §\x o}Ÿ*R¨ð2v±ôèŒ%nêÂ@`¬þs1˜é˜äÂ@Â_S{Xp§¬5ìX^QOÏ´Ù~f_|ñ…hx…2DITp—NT˜¦”6¤^,u~&¦þR€,å/%™ðAw–NÕ­[W|>xð`̨rpÀfK•Ø•ÅëXë`¦ÉÓ4AuÍ FÎp™ÂZ9Ob1 ×R)€@2780)s†JbÍÎClç§­ê²eË^{í5ÑÅ‹Ÿ5kæ^å‹t¢Â䣘ŸÅQºLù%«¶§w9þäØq¯råÊ2˜è„ƒ9 ÊËCîü7ÞÈH‰«hÒÙ˜Œ øK²”¿”d>TÀTY ‹ó¹Q|Õ®];˜[rÀR˜üsaÈMÛeJúƒƒ <Ý!.‘¶×Õcî’KÿIÜS†ÈmÁ‚X̯G,+Kõ¼VSy#¸gÁi ¨áUØ~ýúÉÍg¾ýö[ÌÄ)‰ nõð9‡……åË—MvÇwÖiðsL|ƶ]Çäù|¡Âø iäåøŸ ´=Ví)gŸ}Vö tƒÜ°®Eì = 3  ~Q€,å™ ðMO,;¢‰o±w›ˆàëwi±Æ ×o÷’aÙ—ô4Ç;ÞÅÒƒ¹0Ìú‰aƒ¬Gr ôHq,Ls±)ó‡C˜pxk=©& GÜ)=)€²iTÓ%s†ˆ³ zÊ!Ôx“&MD[À“©uëÖ0Ñ)d(#Q!¥°6åÉ“·EÛn[ÓŽá\ï`¬;î€ñO^X½ºÃqY‰ò@K)»– æ’¥p¹ˆ;ʃ P(@– €È¼pU@ƒ¥€S˜ã/f„G‡+Ñ7>˜C>‚E0Kx%@Vrõö!™-æËdàG‰J~CŽ•” ¤„„f@”)e9á…¬È\~Ži>Ir&÷¥|°ÉàRðaRfˆ[ÃØ¦± àDåRM¹1ã)c_k ŽÌÓ«¶˜Ô“®Q0&1B‰S.NT}ô‘hÙ‚O=;tìôν&(L*/ï>6l&å¡'ܹ¯tg5¯nd™T€ øE²”_dd&TÀ7´Y ¯ÞñãÇßsÏ=H†Íáj­dýP¥d ¬8cÇŽvz]É÷õ_ Ø6d2\"C– ’ÐôÁ´— ô(_äÈÜáZ9¶ƒõKÌQz\POºFÏ@iòvH†Äb‰ª© ¼Ž› Û˜Äà<î^k—jªÊ‹™S¹ u©R¥PUb٣蘑”)1뇄AK¦Dð-|‚]QNåQ¢D Ù%jÕªå+6yJà[¿dj*@r¤Y*G²ñ"*;¼²p ö$¬&CJ8î€0”†"ý8…”’ÀîÐã)j”¬ŒUJãŒH.Œ^ø  ´ôhøƒƒÄ¢8” „ JÓ—'èq‘ 3•Ì œ$&Á‹Â‰ ó›˜;Ã'0ƒÁ¦ͽÖ.ÕTU¸GÒ‰ °‰ž’¨€¼Ò‰jâĉ2Àvþ‘ÉĦ4U«VÅ,ž<@¨Êpç(³¿XŠ3}¹¦¼š èU€,¥W)¦£~T@KÁ“ .Ϙ!‰»té"Þ÷9;ð¦Ð#/‡ÍIçþ¸Òª$®•ˆ(,ÊòèÙN,¦“WÁc]:QzJJ™¡×XYbQ^‚ËEhPq€K0 ¨ÌP£Ö.ÕTÕùËøR÷ß×®]ÁmÊáD Ô­†iAå·X ‡Ád¨²<‰ìØmF¸s=ȯ/FœòãÈeVT@U²;‚J–Bd)DÀ—®0`÷°”J„`Ü"}¥J•àú£D‡œq®Âk‘ |ª¹p¢òtG0ŠOïlwž-ÊÌÁ[úÝ}\(Sø­Ã! ;êÈ<•a×®¦È m$bDá(\¸°°„ÉM÷öÞ½{ã[ø˜ËÏ1ý'.Åþ[ò€Wœì9w¤µÌ§æfb*@ô+@–Ò¯SR¿)*Râv…ËßK zöì)¦^ýuÌÙi0Nº¸Àlƒ5ù¾¾h…w‘û]`†Aý!À¢§Òƒ ÕÔŸR‚Ðô”!æì|B=OÕTæ$ÂFŠ¢Ë–- ;“’¨àÂÕ¹sgü+?ö§wÞy{à(¹ƒ ¾ÍY¸smœòš}’‰©€d)v*àj#v,‘f`·PµK‰}Üæ@,ƒË.‡%†–XÙ‡ ƒ…w˜F¿Hˆ…»ƒ¨”wKó0¿æ•àÉ„jâ¾ðòT~z°Ü(É5ÚI¸FÀ$¼àá䩲õT†:è,V;êÔ©V­šh™0»§ÊRbaæ¸qã³8àÄ&öæÇK/½”NÒs‰ŒÕ®³q™Œ PŸ Kù$S*€ æÄº0y`á–}¹øKI–‚5¬™éáG…Ðx÷ë|å«&S2þˆäR´0¹¦d ,OSe = 7PU^ððÚVÒ!¶£¦TƒŽâ*+ ^ðÄ%óD&ÈÊÅtUµƒŽ¢.2@(@Dž̼ê Ã\­hX±”Qãå]ñùO<öÅØ±4åÚa²ÒF9H#Œù³û2/*@n+@–b_ ÁT8¥t—Á y˜/Súž»°@–é>…ŒArs`9ž` `‚8QÁª$ ;°D¤á`-`#‘)q•ˆz0w‰ DqÀÏI2Ðܹs…ë vÂþô(ëŽË¥k”ˆD%¿Å”ÜêÕ«e5•æ.LMŠ€ 7ŽWfXD>¸/€uÑÖ—Ë­X±"¬k§¾þúk4.¶£A¬sö k•$ ÆÊ'é¼DT F(@–2BUæI|P0$]˜Å›“Ax%Ëu|î,/ï)S¦ˆF°lY€^_ó^aK2ì7˜Rô¡Τ.Hæv q€*°ºÍô¸ÜKƒ€eb^ÿº@³î^l{‰ˆ (³Àv"*ºXŽzS¢ž{دäŠÅƒˆÏ)¨~þùgxAÁ"…ÆB¬NéšCšÜ£_åÏŸ_'å,ˆÐ×ez*@t*@–Ò)“Q€¡ ô”& à<¢DLU–Nab«hÑ¢r¾ ´èx%'O À@Vô8’»ˆƒÒL• ùddd(oç z\rsa ˜Ž¤¿¼ ôÈYBF)gÒWL ÌE°Z) )ÂD©.ÕTUœ»”ha©] KJ uL#¾ýö۲ѿüòËœA’Ϋ0™k`fÖTÀÞ ¥ìÝþ¬½i )]gðŠÅ,^¿~ý4X 6p²A€GñÂKÕ`4äæ@4NLK È€ÍÆWÏe”´¤Zäìëš2L>dn¼Ãü/¾r™%ÔhR1(¯Å"A0lT0 *K«º£Ž{¶Õ”¹am¦¤dÂÀ%€`,âÃM1 ª wŽ=ptRQÎ’q?ÓŒu$ K…`£²JU¯peØFa±À:/Ov)ÁRð¸Â»ù©§žéÛµk‡|”Äc¨Â®,bò f©4Ó© îÂ@¢ £ÌTúÛu„ǽ§ZÀ› ö$ý¹!%XÄSn0Þø:&ŒgªâsaÜ=ztéÒ¥áª=1×)Xª{÷îÒ(å÷pçî¼…m§}R‰‰©ЯYJ¿VLI W¼R§NådþÆz=A¬ãÃl8$K!Ð`‡8q!ì[X'<¨r RòBppÊ%''û$ì@bfMx£ '*ð„W‚¹HÜÖ#OžO:ýåaˆtè)7zú«)¼àq¸g¨tÇ}1! ï~%KU¨PA64öKΙµIÿUd)Ÿº.SŸ Kù$S@(àŽSo¾ù&\Ù¾…;WRYʧîÊÄTÀ'ÈR>ÉÅÄT p Ê”K`ô¼•ûotA¬ãƒï¹ð—ßH–NPÀ1/¾ø¢x—ãBl-"œÁýBTbWÁ@îÑ8Dˆ ýÁ•Ü¾Õ '*Y$ˆÈP•$ôˆÛÒ”µ@¥”†7D(€¡KøËC"O}GFñÙe†J×(” )?TÖ'–‚õNâ,ô‡¡fEŸ(g‰1Ýi¿±ÂSÀ)@– œÖ¼ð‹x©+ßÇ‚Š07mÚ4=,…y+-[¶„§.DØ…>}ú `‚cyîD ‹é`1"Õ=‰©¼ (Jé…ÄÊ’€Z”‹é¤†àO5RfŠ®QÈ™+¿B€xáH¦tYÚtƒ L  ä'.Da”ëþ|>°¯, ¢2>'Ä/V¬XÎØÈ׫|ÝQÑ/•™Pû(@–²O[³¦!¥@XX˜Ëdþ‹md09¥m—,µ{÷nж.™*TˆbÊÏ_D%ÑØåÜŸ;ôxr0wa ØoD&óæÍC&zÀF˜ã“´„»Ofáðp’iC2F”ð—ÇWr/gP XP&VºFÁåÚâŽàBÁR(,g^çø™ó•W^qo/£÷3–È¥ûç$¬ ”d©@)ÍûP+€·øC=äò†~õÕW±GŠÆŸd)Ìyá˜4iRþüùE&•*U«ü\8&7–*0ì@b’Îz¼®ªsa Š`.S„8P}P‘‹}KCcÃlc"v9ÊÚØ„ 2CiÜBžà3ÌýSa‘,…HªØ÷¢•)SFƒ¥@~PÕ¢0»×ºuk_ÍK9Kšú»ë1?*@þ¦YŠ‚ XX,t‡Ï“Ë«ïiÄ=÷ä/åÂR@øT!æ‚\$ˆÀžÂ‰Jبr€PNe>>ùAƒ`V‘—#"9¬Jˆ¥ÌPOÔ(ÑÌbQp&ƒm ,…ð§òC%EA¬Dì „›,…ðQrŽõž{îéÚµ«'–‚ªJ7sÙL0`Ó ^ˆã`á.΢S+(@–²B+±ŒT@SÌ÷¹„KöLÛ¹ûž»³p ï]˜[ªV­*Þ÷p¢jÖ¬HX†rSÊ`3ƒ ŸèoU¸F¡<ÑÉõg%R /(q`æ´'ÿ«tº|ù2\Ð`Z“,Õ®]»x@šñ0Õ¨ê{>pàÀÇÜÝ…íb€n93/åì*Hçk˜._Ådz*@ÈRìT ÀÜ|ž\^ÞpHŸ2eŠË:>O,"Á(}ô‘Èç¾ûîƒ[:°ÃÅ2”K´Ky]L'›D.ýxº/<Ð1•†h™zv)P#È=7¥q ¦)Ì÷¤oB°¦Ÿþy¡ v€ Wõ=Ÿ1cÆ»ï¾ëNQðôïÔ©SÎx(ÇW¡A½€Ð#ÓP* ­YŠ=„ „ˆªáÑñRoРh°%b"xb)å h‚%f‰ aB¡ˆ „‘K—cBM¸(i0 æ+bÊe–PY Ì— *¬Ô¼{áÀŽÐ Ê”“z¨&° À7sÁRHüÁ5`”Âü©ô=WÆDÀî{5kÖ¼ãŽ;ÜAªV­Z‰}àB]>…¡‘aÀjP`(@– †ê¼'0LøS»Çó|íµ×ð¹KašÏý€‰EF¢ÂËÈAì7€\pâ‘6A!.o}@,jÂ| ¼— àR Ðp$¢©^G<ô… ŠðyBÔ(™§Òy ñ±`ÆÃĨ`)¤„Ï“À#ü *<)×ñI–êܹóý÷ßïNQ@Ò%K–䨰”› QÃz3¦Tào ¥Ø!¨@¨)Ïqì»çþ^ ÀÐâb—«ù4ðÇ£>*rÃÊ5‰J2ìO‚=0VIèQRÎeéÒ+eðPˆhWeTt¸ƒ0T) t€C’¥ú÷ï/wÝÁfÒ>å:>_ q .ì®6VG,ä;r1 T¨jÖÇÜ ¥ÌÝ>,È©purÁ¡@Ä—òéèÖ­› €ÀëˆàG¢BIdÔM9[§„Ч¥b½¡Ä# <îÅÌ Q°!ÉÉD,ý“É”ÑAñ7ö^eâ€1 ¡%„zØCzüøñÊu|Ò.§«O?ýÔ]d¬hÚ´)òÉU)7×ÂO?§½†×Q*ÈR9Q×PK(ªÀÜœûËþ½÷ރߴO,…ĘöB´tITÈëá¤%hF£ÜÈjàìjʬôPp)8LnVƒ¹B„‡ŠjDó‰x"x„8Ö­['ÃA;á-.}ÏeL°‚ üøãˆà®m… àM•Ê嵈&Å…{–ž,d()@– ¥Öd]¨€«`,ãW]V0ó}>ð"‚Åëé§Ÿyb­òñ¨=¹Á)\‹Ê\ö–ñں‰J°6k”y*§á°x Ѝ„0yòäA¥`XªW¯pS¹ŽO²Ô!C~øawI_zé%áÝÄUöÕ«ŒL@¨€¯ ¥|UŒé©€õ€ÒírÀ'ÛÒaq_Ì|Á¾%2D<*Dø1ÓsOT†`[‚YH¿ÜXš—&UžS· õ[A‹¶GyDÔ `“_)íRØ™¸D‰ª®Q=zô"B‰[:tHK¿nLI¨@. KåR@^N,£B¸/ñÀ'ók"h‚¯VÏU®\Yâ‚°Kçt¼×sy`Üžà›…àR^U†m S„ð»r¹)(JÎyáod<’Ê/ÃA=õÔS#GŽT~+þF8„]@\wŠÂ'Xè”x.è†}ši‘òÚI˜€ ¤YÊ a™-0£˜ŒƒÉ à4nÜ8¥ÿµOÃ@&&ÈpÀ9ëéP¼Ý/9&*0I'ÉÁUˆÛ©ª)0Ö5¤kÂ(oçâry(ñ%oÕª•ò[åß:t±Î•Òa+˜¨¨¨ ›£P4+AÊŒãe²d)Û45+Jn+€]݃¤ƒJ–,9þ|àHÎðÂ,É ò ›˜øÃ›>ÇD„B<± 1¼é•›Ïà«åË—‹¯ÄÞÉò.J¶€Ëܼ Tð“ä‡s€DÊoåßàK¬ãsGÏÀo£AlÂY½› P *@– ¢ø¼5šðIïÒ¥‹û.~à,dƒÍ&g8%®0`<±$‚€Û0½(v÷ƒ™*g"Hã¦ó@T2öp ™Ël•… 0°Á‰Jˆù$×6)RñH•ßÊ¿W®\©£ [Á´nÝ:ˆñ\  Ḃևxc*@n+@–b_ öUF#UbcÕ¯_°¢Œàëß0&!îhU£F ø' 3UΈ æ%] +0–2+i¡Á-à‹ ?0y,Z´èý÷ß„‡…x>å·òo„2Ç|¥§­`‚ïÀ¤Ó¾C—57™d)“5‹C®|›zè!÷™,Ì‚µiÓ±dà€œý£Ô'Ÿ|"óÇÜ¢ãrFTW¯^äÁÍߪý€y`Ãæo¿ýVnƒƒ—2üËñT]£Þxã Dc7ƒk”,·ˆ ø@á ©€GÈRìT€ üOLù©®òC°ì¦ƒP.µk×"ô%ÖÊI¨B˜`Ö¹sç„¥*LJÒ[.SpÛlÉ£{÷îÊ•+·téRå·òo,|óÍ7Uã :ÔT…¥ˆh/öZ*@Ì£YÊýôÓOÊo•7oÞ¾Sîæ¨bÅŠ™d+ÂRš£|ê¥LL‚¥Y*XÊó¾TÀz ÀFæÉF…¹¹† „©7¿È„e†ðˆ’GãÆ¥çø—_~‰hœÊoåßLJ”;E=öØcƒnÂI=D= w”õ†KlcÈR6n|V äHب0ëç2'IÁjÖ¬‰=XT÷fÉñ‡ˆEŽ[4mÚ7ÅQ¥JqSìW3iÒ$ù¹ò¸L¹xµ‹K̶Œ’çΞ=ËýõrÔ1yšd© IÏS«+áÉ3¼R¡B NŽáÉåBÉRØšF¯¾ú*î‚å~òåpÂ">U×(ÌT[ÁHÂôå­[·¬Þ+X~*`CÈR6ltV™ øSð=¬ó|˜Fuó;ýJ–‚ÅK‚¥“]~"ÿèܹ³ê®8&Ü F€Ô‘#G±ÝŸ­Â¼¨ d©ŠÍ[QÐUŽçž"|Ši5D¿÷ ðAÎl¢‡Lš4i,‡`),Ù“Ÿà„iŸ»ùóçÇÝMè[‚;„n¿`ͨ€- KÙ¢™YI*°‹K:uÜQF~ÿtl3Œ°Uª[ k|(YjÙíC,îëÛ·¯ø[ÓT¬XÑýÖØ ó€&Œw@Š LŸä]¨@ K@dÞ‚ ØKén×®'çt;ØØ1?Su§a÷ëÕ«‡«~þùg8B‰C°TïÞ½ñ7Hëî»ïv©R¥J™p+˜'Npsb{ Ö6Ô K…z ³~T x `Ò QË5ÌTˆhP¹reDæŒóvH–B@)q–E!´û-žyæ,64Õ¤"œ9s†ÞåÁë¼30J²”QÊ2_*@„ˆ9‰8Ÿ… Ò€ª‡~îV#FŒÀæzªGݺu…] A¤Ä몚m+XéN:ÅxQT „ K…pã²jTÀ\ `æÞTwÝu—¶C  ìåBT‚¥°$¾VÓ§OGp©ÿ÷ÿþŸ{>Ø"Æ<®Q˜Ë»|ù2ƒE™«²4TÀÈRˆÊ,©𬂧=Z#0• $Lÿ}úé§]»vÅ>0›6m’,…­`°á±;Ea+8N}RV¨“'O^¼x‘Û¿pPû(@–²O[³¦TÀ\ `ÑVØyÚ‘FÒâm–)SF„°R…xÁÝ ;ÃuáÂ…7n˜Kb–† P€(@– ˆÌ¼  žÀ¬6ÚÓv¨RD¼ì*³k×®À›£àH?0ØØ¸"]› P²û fQ–*xJyþ\°­`€MˆuúôésçÎÁ…œðd–îÂrPÓ(@–2MS° T€ ÜV^Gð©ò´5 `+&&†jQ*@L¢YÊ$ ÁbP* ¢ÀСóŸ~ºüo¼#VÿÁ¹ ŒE¥¨ ¦R€,eªæ`a¨ø›ãǯ*V¬%þ¥.T€ PÓ*@–2mÓ°`T€ ü,ÅN@¨€ù K™¿XB*`_ÈRöm{Öœ XG²”uÚŠ%¥öS€,e¿6g©€õ KY¯ÍXb*`ÈRöikÖ” XW²”uÛŽ%§¡¯Y*ôÛ˜5¤ÖW€,eý6d ¨@è*@– ݶeͨ@è(@– ¶dM¨@è)@– ½6e¨@è)@– ½6e¨@è(@– ¶dM¨@è*@– ݶeͨ€õ KY¿ Y*ú ¥B¿YC*`]ÈRÖm;–œ ØG²”}Úš5¥ÖS€,e½6c‰©€ý KÙ¯ÍYc*`ÈRÖi+–” ØW²”}Ûž5§æW€,eþ6b © K±P*`^ÈRæm–Œ PÛ ¥Ø¨0¯d)ó¶ KF¨YŠ}€ Pó+@–2±„T€ Ð.Å>@¨€y K™·mX2*@h—b TÀü ¥ÌßF,! ´K±P*`^ÈRæm–Œ Pڥب0¿d)ó·KH¨íRìT€ ˜W²”yÛ†%£T€v)ö*@̯YÊümÄR*@»û æU€,eÞ¶aɨ ]Š}€ Pó+@–2±„T€ Ð.Å>@¨€y K™·mX2*@h—b TÀü ¥ÌßF,! ´K±P*`^ÈRæm–Œ Pڥب0¿d)ó·KH¨íRìT€ ˜W²”yÛ†%£T€v)ö*@̯YÊümÄR*@»û æU€,eÞ¶aɨ ]Š}€ Pó+@–2±„T€ Ð.Å>@¨€y K™·mX2*@h—b TÀü ¥ÌßF,! ´K±P*`^ÈRæm–Œ Pڥب0¿d)ó·KH¨íRìT€ ˜W²”yÛ†%£T€v)ö*@̯YÊümÄR*@»û æU€,eÞ¶aɨ ]Š}€ Pó+@–2±„T€ Ð.Å>@¨€y K™·mX2*@h—b TÀü ¥ÌßF,! ´K±P*`^ÈRæm–Œ Pڥب0¿d)ó·KH¨íRìT€ ˜W²”yÛ†%£T€v)ö*@̯YÊümÄR*@»û æU€,eÞ¶aɨ ]Š}€ Pó+@–2±„T€ Ð.Å>@¨€y K™·mX2*@h—b TÀü ¥ÌßF,! ´K±P*`^ÈRæm–Œ Pڥب0¿d)ó·KH¨íRìT€ ˜W²”yÛ†%£T€v)ö*@̯YÊümÄR*@»û æU€,eÞ¶aɨ ]Š}€ Pó+@–2±„T€ Ð.Å>@¨€y K™·mX2*@h—b TÀü ¥ÌßF,! ´K±P*`^ÈRæm–Œ Pڥب0¿d)ó·KH¨íRìT€ ˜W²”yÛ†%£T€v)ö*@̯YÊümÄR*@»û æU€,eÞ¶aɨ ]Š}€ Pó+@–2±„T€ Ð.Å>@¨€y K™·mX2*@h—b TÀü ¥ÌßF,! ´K±P*`^ÈRæm–Œ Pڥب0¿d)ó·KH¨€ov©T€ P*ЪՀ_¬†xOÞŠ P*sýúuýŒè¥"##kÔ¨Q¨P¡ð T€ P*@¨€=(X°`¥J•Fí•«´X*==½|ùòöPŒµ¤T€ P*@¨€Š0'­X±BÃLå‘¥pÙ]wÝEQ© T€ P*@ºtéâ §ÔYŠ ÅNC¨ T€ P¥žpJ…¥’’’î»ï>åÅÿÎûÀ»ßvú¼ãÔïFoæI¨ T€ PÐV R—Y¥êuÏÿÔË.49yòdwë”+KÁÁÊÅÍü™·Ê};$ºþ¸-<© T€ P*`+ÞªÒX‰Sp‚7¹ N¹²TŸ>}”×<ûv¹'Æó¤T€ P*@¨@È+PoÈÚòµ†¼[ª}±b-?ü¼wóPåRµÛ*ÑËò´XêøñãJóG i<~S“) <© T€ P*Ú ÔUòƒŽ (åYåçɨu‘ϾSâÂE)qêov©F)“Öî9³ÅÔm<© T€ P*Ú 4WªlPT½zÃΜ¹T _# ê›sšNŒ»ûÞ$#½þúëê,uþüy¥QªhùZmglçI¨ T€ PW b‘À¦jÕúݼù›ä$S˜òk>.¶JóAJ{bÃËdÙ¥ÂÂÂd¢þëŽ_FGwŒHäI¨ T€ PÐV Õ„¸ï´~ï½¶©©\|¡~üqpê«Fã¡ÀCO¾ I !ÑUX ±ÒeŠ—ß-ßuΞT€ P*@¨yª7ž`êÔiš{¼ƒÌÌ£øªÔ‡:Gl¯Ô¸»$%LåÁË\¤Ï¶KÁT¥´\Õï>±×üdžT€ §FY¹ZM|:?¯ß^gyºÌØ,ræXÖV¬ùðÅO¾øÎö× Å¼Š,›LJYO·ð© ±Ì ­sD0ÐP ÇœÄ’ï;î›T#›Ãƒ ß6è4·Û¬„<÷哼„ ½¿±T»víäwÿ}ð‘~ SyR*`¨ÓÔ×€Â_|Ó½H=fÅ#+—Ï›š-2wÿÊÐJ™-óï: k=j©F©D+@ØN“׿{äIü5ÒKa½¦ü¡ç$ÑÊV·poGñ¹ÎCYB6´ÙºËcEšZ!\Î=m³tiT¬†Ú•ü¼¶ª¥K—þKÁ#]~W¦jýÁ‹wò¤TÀP>­ý‹Îw§LöÔKoº©Êó?ò¤ûç-ÏWá.†Ö´™w y¥D()4 éæƒÊuJ Ñ÷šìé—VÓH‰<Ý›@ܽ½ä­õt $–ÅcC›¶²`R zƒ1@¥ñãWyb©K—®Á•ªÄ»múÎIĨ—ãÓ|X·—=LJ ?ånÚwÊðei<©0TÏ¿Íf)¼ñ·žó«;¹I¼ƒŸ)ü¦Ëçm†f³²5´¦Í\Ê )4 )iÊTù^< 5DƒÔH ѧÄG_zÊ\¤”™‹d¸çk%ʪ¶£þž /GÉEž¶mhÓö@ÌB ¼çœà;pà¤'–ÂçÍšGš6ƒ–ŽLü×wJjŠˆˆÈf)l.#?ýÏÝyƬHçI¨€Ñ Tü®™wÏ.’ã{=ø¨Üsè0lžÈwÉqæ–¾PÊ )¯óKüݲ×heæ¢üøP£<¦!=µ@!•™ epºÔÿÒš+ï+E”Óåwí…«”ÿuI)pÉ\Š ›I^%²Â¿9î ªö57¦§6T Nãq€$¬ÔÓ¶KáÛJ•z!å´èôá+åãÀýÜ_J¹uL¯Ñóæ¬ÏâI¨€Ñ ÔlÐRŒÆB¯õõ^}Ç-TŽdù·ÌJ&ø¼F}|¨šøáÇ ¶é=VõÖž.A>¸ ™»\%o×eè $PÞîÃϾ‰Åç¨5>Q->DiUË£q ²mÒqò*O…w)v½f]Eu”×ÊŠ¼ýÞG.%:=ZU_‰¹ä ¬¬ûWB÷Ÿ«f¥Ý7de©|íKLOl®À×õF€0…ç•¥°½ RNX˜8#:MùKJJúÇþýû•M^¼%rÓ^žT€ ­À× ³YêÅW‹úz¯ˆèT\ŽS¾ƒÅ¶è*²8q‘×2A¥š ð!N¤‘¸ƒ?Üoòˆkñ‹«z ŸY¼ÔG2Ï‘«•ÊÛ‰k‘-þÀ‰?p¡H)n*”­P _‰òÈ;"Kθ)å}e-p!>—iöë Yd)diq‰¢)Ë,nŠo]й|.ÛK–׊‚É:ºˆªfîÞâžnêµcHåQ<¯‰™€ Pw¾ª5„ä¾uŒ;Z‰ÍdÆÌŽG&>ü˜d§ÈÈȤ§§+Yjéæ}<©€ß6j%†ÞK¯2y±×sìì5î¥zäq  —¯›×øvÞÚÊø¯¸GŸ‘3•_Uù:›ÜóD²–]Ë2+¯r¹ÝÔ%[Ä·òü-ïˆ?Þ¥À¸ÈP~õkÿqâsÕ«Èÿ*ï…¤¼î÷ù‹ ]ªÏEIÜ3”ŸËâÉZ»”YÞÚ=sOí%káµxjhÜ4–· ¡§À§Ÿ÷!;vÖ«]ªM›ÉH9rÚFˆðÊ›Åå3Ö Áe÷˜• ûyR*êü˜ÍRÊ3~½¨{©uûWçf³Lœ·Öýªßd3Š¡üVdˆg.WáÒ‹Bö!ÈÛ¹|îž3´éæž3rÙºÔÿŸ«^…|¤Œ¨‘2[ù9Êæév¨¦ûW?µî¦zG¡ ª¯*—òCQfÕÌ=µ—ø\ÏáR©¼K; óT 4øø“n ¤›7óÊRÝ»ÏBʾ×£â¯ù‹¥°“ÌßXªÀ#­Ùv' P ^ãÖzÞ2Í˯¿å^ªGŸx Ü¿=m©¸Põ*ä3xlö&3(†Ì¶}÷!âªO*V÷¤€jy;”ÇÓ…¢¨žÌY¹Õ½.òCl=¥‘ò¢lîEB=‰¾ {sR¥R.T_™[Éd‰â¡òsO‚ž¾Ÿë9\ª#•W¶cz/oABFàN¯ …#G.CÊÞaŽGÊ}!l—.]þá˜ç»}€¥6$âI¨@hðs1ò{â)üíõlÞ®‡{©p-rxõ·\¾?s™È¼Ô‡åUë"à¾2Ág•jˆ«”º\½Íý¦^o‡LÄUø×“¶îÙvê™Ívžj!²RÍYÊ‹²yÒMURÕ …2¸ª¯Ì 9ÅdVªÂÊK<µ—¬‚×n°*6]YíÛ óTÀÒ ¬Ýºx„zzX*<| ÿÚc.ªüÉ­¡qéT=ø‘Çâ’ó¤T üÐ$›¥^{ã­ßîq' ¸ç0)b¹xÇã.ª™«&@>â*d«qÊ42g¯·CJOE•™¸'é)J…bÈÜäµÊÅ·KÖl÷šµx½ª8ïX^ˆ Q6ñrjàñ‰¼¯jæžDŸ+勉KèQ^gVLFl¨ÀÒµiúYJìpÜ¥ç\õYÅ¿XªN:c)Ø¥Ö'âI¨@hðS6K½òú[9¾°g¸ç0nF¶] wQÍ\5òd çÀ­eÎ^o‡”žŠ*3qO %ÒS¤A1dnòZå‡âÛfNc’²ü.u¼m:n6¾š¹N Æ·?¸‹)MJâ+¡¡§Ì=‰à’‰þþ Gyý¹1%°›+7íÑÏRÂ.Õ©Ç\¨¤´KaW©ÕÛð¤T Ô½í/—¦ßNú߸ä0jÚñúÇ]T3WM€’ˆ«ªÕnˆ ½ž2g¯·CJOE•™¸'Á-Éka`Ɇ4™›¼esQ@89ÁÊ“ìsV&ˆÂ@¤iÒ¦»Å=+|+\¯pLY#«‰[¨fîIéLækOУ¼¯y2=°•À£÷Þk«gŽoüøUHÜ­ÿBèóñçÙ»Haì;ü¥”ëøþû@þ•ñûyR*äB³Â¯Íñí²×…¹å0<<{Ÿcy—Ú VM€’,p¬ÑóåQàõvÈÍSQåÜüµFïë>•‰ÿZǾØåZq£6]Ã4òTF,]t¬ËSÓD®@D†RO™{A.Ÿôµšz”÷5O¦§¶R L¹_uúžg¯ã¶ú¼ªˆ‰à`)G¼Nűdó>žT€ @ÚŠøR9¾ŒWä’CØíøR¸‹jæª d‘*Ý@£H¸Ö×Û!½§¢Ê¬ÜÈB"¶“OåAbY—Òö9<ÜK[órŸ;„Šd¢`%ÞÿØÓ%"D7Å×lQMìI_Êמൡ}Íé©€ÝøÈAO|©N;÷…MŠDÊøRŽ˜.qÏg¯Ýµ`Ó^žT€ ­€2îyŽï%ƒ‰»ä0àvÜsÜE5sÕ݇;8²õT¤_~$ x·LãõvH驨2Õ2 øˆˆÕªEš¸h3ÒˆS™@Ê‹²)?¯è V®,¼j¶R Q_ Ztõ¤‰¡Ž‹9CÃk¨çIYM_{‚å}͓驀­qÏ8éušOÄ=¾ú<õÜKÒ åXÃwýúu¥]ªÿÄÅsÖïáI¨€Ñ Ôl½·±sw¶:Å>nË¡ï¸ìX'¸‹jæžÈÍìœûè¹–jêÊd¹mK“Že¯·CJÅVtê•UM wâó¤6ÎO0—Kyë5뢬ˆ¨ 'Y”)ey]穙ĽÏá箂>ÔQŠãÜÏ·ž Gy_ódz*`+j|;Tç~|µk;¨ ûñAŸÝq§d'‡¯@¬`AÇøÇÏÂf¬ÝÍ“ P£¨V/›¥ µ£Ñ½—ùSQ Nãq ¤¨¨$¯v)„¡BÊq‹v ™™ÑW üãÇ;Xª|yG0q|V£á”Õ™<©0Z/ë6W¾€uþÝuÔeÁŠ”,§¼ð¡GŸß"™øwQ­ˆF‚†íÈ<‘áó/Á‰?”™³I™­×Û!±ÈYyÖSdîrw—"áÛ_ºvɶï”U.’ÖnÒYTMª¤ÝÄŸT«'s(õIUíIJ„Ú™{ª£ø\gÁ|UÞèžÌü©€¥hÐb )"b½6Ka“${çÝ6¨lË>äÃá¾ûîÃ…–r„ì¼}¼]ú³ «2xR*`´•ëä„¥~1_Y°^W>÷r¶­H¼ŒÅ·H&Æ4î¢Zí­LUf«¤¨÷ÊW¹0Ñ%O¯·Cz ÈÖ“° El|óÝrJ¢’EB†A5Ï«ÖUâ¤@&øÿêi\ˆ /ÇßÚ—ˆœµ+¨!‚d)=S¦Ñ£¼¯y2=°•í:v†_¹6Kmßž…dŸVê qª7j/Å‹Ïf)‡ úíãßwç½bO*@ŒV`È‚mí‡ÍõõT-Uó~S*~× 'þ Dθ‹§ŠxMÐuÂräYîËïŸ-ü&þ¨Ñ¸Sßësœ›¸òÔÎA#îŽ2 $(J…?4‹» ¸ÿâï×ß)‹kì2RgãÊÖñš^¶¦†DÈÄ“úoä^¯íèµðL@ì¬@ßiqzÂuÂp…dßý<Z}ÿSIMÔ™ÍRéééÊ_om‡Í¶4' T€ P*@B^÷ÞoN:sæ’†iªM›ÉHÓ¬×ÂA au’Ô„E|Ù,åâ~þÙ·Í-ÞÉ“ P*@¨ !¯ÀWß'ÍŸ牥à,…ØèHÓ}ÚæÆ½&+ÍOp<ÿ‹¥”.SO¿üV¿ÈTžT€ P*@¨yšô^ NBø(O,µn]*|R¹/¤(ùymÉR¯¿þº¸Äá{ŽC¹“ µµ¢ç¼džT€ P*@¨mºLßZâ6Ó|b‚¯Në]#î¹/Ÿd)Ø¡þÆRˆØY @¿üÒ?ûºËœ$žT€ P*@¨yªÔuÄ4 [änš‚¾*ñNëv“7Wo=X9Á‡]øþÆRøcs¾ÛÇ=÷=Ðvê–Ž‰<© T€ P*Ú 4¶À§(÷ùÄ–Æ_6^(úûß_s|øË¸Sq”ªÞ¤Íôí<© T€ P*ò |V3ÌÝkJxJÁ(Õ8lõ7]§(1)""B±²ý¥Äÿ+Uª$Óýó_w4¾²ùÔ­<© T€ P*Ú 4¹îÝRŽà0Daá (..½lÙNø¤j“ɨ{þ'ž—Œ·(8G©³ÔæÍ›•Ìõô›ï7™œÀ“ P*@¨ !¯À7#‹¿ÓÚßüÓ®b'cœ5ðç [Þ«ù·*ä\éYõ7»¾@O%Ný¢~£‰ñ<© T€ P*ò Ôî³ü½²E«>¯?Uþ¬ùÿû×JO)¥QêoþR‚°à5¥\Ї+ßýºM½q[xR*@¨ TÀ |;xMÍžËDM?o7A Rà"„‘rYîçj—Âב‘‘JÓþÎÿTá›øntO*@¨ T€ ØAJ]"ž-ñ™ ɘRZs|â;ì/ãr1ÿK¨ T€ P;+P§N÷T*s|2‘2Ü”…cÝ© T€ P*P¾|y7)õu|.´µbÅ ß)JI¨ T€ P[)p×]wõéÓGÕ"%>Tñ—R¦‚Á@…Ýûl¥+K¨ T€ P‚ b^Ëò4@Ê;K)/†ã:¯ ¼øb5œ^“1 zhÕjþÕ“˜i¨Œóæ-ÆÀ,Y²~`n¬»œ?^¡tÍñé̂ɔ ˆ Ô„ P¿(0~ü* (üë—ܘ  ~Q›Öa`VªÔË/¹…@&^æøB †®Y*À‚óv¡­Y*´Û—µ³¨d)—†#Kù¹'“¥ü,(³³·d){·?koRÈRd)c»&YÊX}™»Í KÙ¬ÁY]k(@–"KÛSÉRÆêËÜm¦YÊf ÎêZC²YÊØžJ–2V_æn3ÈR6kpV× ¥ÈRÆöT²”±ú2w›)@–²Yƒ³ºÖP€,E–2¶§’¥ŒÕ—¹ÛL²”͜յ†d)²”±=•,e¬¾ÌÝf ¥lÖମ5 K‘¥Œí©d)cõeî6S€,e³gu­¡YŠ,elO%K«/s·™d)›58«k ÈRd)c{*YÊX}™»Í KÙ¬ÁY]k(@–"KÛSÉRÆêËÜm¦YÊf ÎêZC²YÊØžJ–2V_æn3ÈR6kpV× ¥ÈRÆöT²”±ú2w›)@–²Yƒ³ºÖP€,E–2¶§’¥ŒÕ—¹ÛL²”͜յ†d)²”±=•,e¬¾ÌÝf ¥lÖମ5 K‘¥Œí©d)cõeî6S€,e³gu­¡YŠ,elO%K«/s·™d)›58«k ÈRd)c{*YÊX}™»Í KÙ¬ÁY]k(@–"KÛSÉRÆêËÜm¦YÊf ÎêZC²YÊØžJ–2V_æn3ÈR6kpV× ¥ÈRÆöT²”±ú2w›)@–²Yƒ³ºÖP€,E–2¶§’¥ŒÕ—¹ÛL²”͜յ†d)²”±=•,e¬¾ÌÝf ¥lÖମ5 K‘¥Œí©d)cõeî6S€,e³gu­¡YŠ,elO%K«/s·™d)›58«k ÈRd)c{*YÊX}™»Í KÙ¬ÁY]k(@–"KÛSÉRÆêËÜm¦YÊf ÎêZC²YÊØžJ–2V_æn3ÈR6kpV× ¥ÈRÆöT²”±ú2w›)@–²Yƒ³ºÖP€,E–2¶§’¥ŒÕ—¹ÛL²”͜յ†d)²”±=•,e¬¾ÌÝf ¥lÖମ5 K‘¥Œí©d)cõeî6S€,e³gu­¡YŠ,elO%K«/s·™d)›58«k ÈRd)c{*YÊX}™»Í KÙ¬ÁY]k(@–"KÛSÉRÆêËÜm¦YÊf ÎêZC²YÊØžJ–2V_æn3ÈR6kpV× ¥ÈRÆöT²”±ú2w›)@–²Yƒ³ºÖP€,E–2¶§’¥ŒÕ—¹ÛL²”͜յ†d)²”±=•,e¬¾ÌÝf ¥lÖମ5 K‘¥Œí©d)cõeî6S€,e³gu­¡YŠ,elO%K«/s·™d)›58«k ÈRd)c{*YÊX}™»Í KÙ¬ÁY]k(@–"KÛSÉRÆêËÜm¦YÊf ÎêZC²YÊØžJ–2V_æn3ÈR6kpV× ¥ÈRÆöT²”±ú2w›)@–²Yƒ³ºÖP€,E–2¶§’¥ŒÕ—¹ÛL²”͜յ†d)²”±=•,e¬¾ÌÝf ¥lÖମ5 K‘¥Œí©d)cõeî6S€,e³gu­¡YŠ,elO%K«/s·™d)›58«k ÈRd)c{*YÊX}™»Í KÙ¬ÁY]k(@–"KÛSÉRÆêËÜm¦YÊf ÎêZC²YÊØžJ–2V_æn3ÈR6kpV× ¥ÈRÆöT²”±ú2w›)@–²Yƒ³ºÖP€,E–2¶§’¥ŒÕ—¹ÛL²”͜յ†d)²”±=•,e¬¾ÌÝf ¥lÖମ5 K‘¥Œí©d)cõeî6S€,e³gu­¡YŠ,elO%K«/s·™d)›58«k ÈRd)c{*YÊX}™»Í KÙ¬ÁY]k(@–"KÛSÉRÆêËÜm¦YÊf ÎêZC²YÊØžJ–2V_æn3ÈR6kpV× ¥ÈRÆöT²”±ú2w›)@–²Yƒ³ºÖP€,E–2¶§’¥ŒÕ—¹ÛL²”͜յ†d)²”±=•,e¬¾ÌÝf ¥lÖମ5 K‘¥Œí©d)cõeî6S€,e³gu­¡YŠ,elO%K«/s·™d)›58«k ÈRd)c{*YÊX}™»Í KÙ¬ÁY]k(@–"KÛSÉRÆêËÜm¦YÊf ÎêZC²YÊØžêK­X±¢téÒ÷Ýw_:uöïßolɘ;° >±Ôõë×»téR°`ÁB… ………Ῥ1‹L, €¯,ñúë¯(P Y³fÇ·@ },â?|LÏä^ÐÉRIII ¨üýÕNÆNCr¬€~–=z4žÔÊ!…ÿNž<9Ç·æ…T€ xR@?KÅÄÄ€¢”ó®»îÂožóçχ’¼d)?·¦W–‚ý©F.%ÿ’ÌÏ3;;) ‡¥"##aˆò4¦ðØI3Ö• ®€–‚É |ùòž&&dBÉxL–òsŸÓ`)`8,O %O}K~ŽßÓ¡ÔÉü,1³³“Ú,µyófwû®êøB2ü>¶“r¬+0Pm–Â,W¼¾é3ò¡a<&Kù¹·©²ü6úôé wï[ùóÝÿMÍJwÞy‡ûW!ÓÉü,1³³“žX öÝJ•*©cÓ{ÅJ¼ý†êW¸¿•í¤ëJ QÀKÁdЮ];U“Á3O?ùU•OU&&­n<&Kù¹Ÿ¹³ ÛÅCt¦¼yïiײQVjÌáݱ‰±‹C¸“ùYbfg'ÜY ?yaßU}"~ñ¹9ÓF`@áœ6aþ«šŒK=ìÔƒXWCpg)˜ 0¢n2Èÿ@ïn­ÅÀŒY9óã²¥BÏxL–òs?S²–鹸܉+Tý:ÕÓ¶EÞ§Ð`2hÞ¤^Vê:—±¹hÎøÅÞ %ã1YÊÏ=L°”ê2=Ño*V(»yÝü#{â<‹ç†Z'ó³ÄÌÎN H–r_¦'í»];þ²wç:1…ùó?àþà–…Þz";õÖ5h H–r_¦'LIqK4æô‰ƒCÆxL–òs_|ýõ< ¾¤¾jÉÔ#Y›õœÓ'…it²ŒÏáç–`v!¡Xêùç+(ð¸; Á¾ûS£ow%FëP{ÓÖ·hZ¿’ÝóK=BB-V‚ H°Ô+¯Ô~è¡çUmKå˕ڼnž‰4#‡tü1Æc«„N Kù­ç‰ezÿïÿýÓ½o~ñù铆ÉÚâë9rHèd~“˜ÙL,Ó{á…WUÖÕ¾ü,ió2_À«þ÷5<-õÀ<…Ífu©@NÀùêÕkªL˜ Ï›àëÀDú®›iÍw—,•“žärÆ2½ó?Öÿ×£{ãssvíÔùxš¡0'óƒÄÌÂf h,Óû T‰¨%Ór3 ’¶,¯öeOë‰àæh3±Y]* WezÏ>Spâ˜þ¹˜ûvmlÑ´~Þ¼y¬h<&KéíCžÒy^¦—§}ëŸöíÚttoBîÏô¤5-š6°h'˭ļÞN h-Ó{éùy3Gç~4‰¢–L/_î}Oë‰`³“ê¬+ð¢€Æ2=üÔïÛ£¿fÒ– ¾¯i9ã1Y*çCHc™^ƒº53v¬9¶/Á¿çŽøÈÙr,çóJ;) ±L3Ý£‡öôïh¹ÎÞ)^ÄÓz¢ôôt;µëJÔð¼L/OË_ìOßä÷±¿aQõªV2“¥r2x´–é}þQü†ÅÇöm5îDþÖêd9‘˜×ØLÏËôòtëÔbz¬q 9O3 ðKê^´FÅ¥6댬î_ h,ÓÃûñ+ ˜ÑKg”ÿ¨´%ŒÇd)߆Ænzøu»zÙÌãû·æÄ½4:ƒ;ûÖ®L<<í¦ûk“ëd&Çf@á.Ctyü±GTƒQ!”³UÖ¯%yçR@c7=¼z6.ØÀœ1VÃxŒ—²t'KémÝô ¿ôÂÌ)Ãïßøs~Ä8ów2½3ÍÐØM¯zÕÏ“¢? dlîþkKOK=°—zج“Ú±º»éáu³tÁ”ÀLÜqòØAxÕªÚ¨5jtã1YÊûPÑ^¦7d@×ãûƒ{¢“a …i;™w‰™Âf h-Ó{ÿÕË"‚; 2“×·üåUÇD£Ât¤Íš‹Õµ‹ÚËôð¢ îÀÄÝñÂUý©ƒ ‚k<&Ky$ž–éÝ›7OǶMfn9q Ñ$çÐ&ídvy±ž:ÐX¦÷òK/,˜5Î$£ ÅHÙݰn-ÕŸ(Ø.Ãê[±êh+&±‘ÚËôúõê`ž‰×n÷έð V,ã1YÊãhÑX¦×°Þ×™©NL2Ûypw¼ ;™H¬ªg4—é=2fx_³&Qž­±Ë*}ñ±§`TðÌe›S«+ài™x¥U³ðZ1áØÄ+e3ñ˜,¥2 4–éUú¢ü¶Øå'î0ó¹;uc«fî¼óNÕˆgœ¡°úƒÏŠå÷´Lë[Úoæ…²­Y1ûÃÒïzZOÄ¥Vì“,3ÐX¦“Aê¶Õ&˜(!Êiã1YêoJk™^‰¢kVÌ9y(Ù*gêö5 ë}£ÚÉ *Ä >I£€çezw6m\w÷ÎMVP(gäì‰EÞTßÓ¦F&YO˜få]¬®€Æ2½O>þp[Ü L”fÕ—]ñâÅc<&Keez/.1uôÉC)V<·Å­ z'³úC‡åÏ™Ëôj|U1uûZ+(”yÊø!Ï=ó”êƒ;r}=Q΋WÙG­ez%ÞZ¾pºE&ŒžŒÇåË—7ÚxL–úŸæ2½|C÷8y8Åêçš•sÞ)ñ–ú†ÞÆw2û<¤XS¡€Æ2=<ìЭ> Pþþ½;=˜?Ÿj0ª.]º0Ç‚ ÐX¦÷ܳOM™0$f䜉0¨¾ì 5Û¥4–éuj×ìpÖ¶S‡SC挜3)(Ì„ÏÉ ´–é.„2£ ÁóO Oë‰ÂÂŒʠnÆl}U@s™^¾½ ¥‰º„OªwŒeñؾ,åy™Þ?Ô¯½gWÜ©#©!y::Ùã*Áëd¾{¦·¢ZËôdìÈþ!9šP)<+šþTÏÓRüZ³bk²Ì¡¤€Æ2½Ö-~<¼w[¨ŽÍ}~ ˜ñØŽ,¥±L¯rÅO¶o^uêÈÎ?ôé°NJO%ÖEU­ez]ÛÞ»=äÔΤußծƥ ¦R@c™Lè´!?0ñðéÔ>Æc{±”Æ2½wK¼µ6jþ©£iö9ïKìÔ¾¹ê ‚;s†ÂTÏDÓFk™ÞÏõ÷¤o±Ï€BM·o‰ú¤|O¡³žÈ´]… ¤ZËôÊ—AGµÕÀă¨éÏõULj»ëã±]XJ{™ÞìéãNÝeÏ3+=þ—ŸÚÉùὦ€Ö2½j•Ó’6Øs@¡Ö1Q Þ-ñ¶*QUªTÉèõD뼑9ÐX¦‡n¹bI„m&JujW÷w7—q‚BŸ¥´–é=˜oxX¯ÓÇvñLÛ±¡FõÊu2s>qXª+ µL1Ñ 8  Àìã<-õ¨S§ƒQå¸ûñBO h.Ó{:|ÒpL(·aé§Cœ¥4–éýÚ¡ÅÑý;ÎKç)ؼa™F'ãÓŸqíez‹æ…s4¹(0~ô 'T5t¶be¢~Q@k™ÞƒùöíÂé¢ÀÊ%³Þ}Ç£ñ81MB–¥4–é5jðÝÞÌ„3Ç3xª*°rélÕN†²~öÌÄŠ h,Ó+€8š4èÙ½ýƒª£â†NV f+³çezyÛ´üùèdŽMO Ìž9þåÂ/ºÿÔA$*_[9YJk™^¥ÏÖž9žÉÓ«³gNpïd¾v/¦ ’¿rè¦Å}F„,e\ï áœ5"û<ô`þQÃrÄù¤œ¢ð²;{|϶5ãœ/; La8°Kyж|×w6oÖøÐ¾Ïâ©SËÿñûo¤±+aìœøõL– áç²jÕð“·K—.wÝu—;H=ñÄc3¦×Ù—˜L(àvpñÖTo]=+õb—ô'KÙmLù«¾‘}ºþÚîä±=túÀjt¬üÀ2½ÔØÅËΖ,¥mùëš_íNß®_V¦DȨß»ŸÎ{S¢6/·l0YÊ_O@ åV @wŠÂOÞ>½ºp˜ø¤À5§}÷Âé)±37/‹[6ˆ,e¡±`ª¢zŠì“AãFõh2ði`:M·°cGfâR·—ÍXJc™^Ù2¥7­_yéÜažz¸pô·›×n\»txwbonY1”,eªÇh` ãi™ÖíÛ6?¼?MowâÐ;wØßïwüðMß  ç˜"K¦#‡Ú]4–éU­òÅΛ90õ+påÂq§ÉàÒ]ëâWW{ÙÙ†¥4–é½úJáe‹ç"2Oý ÀÆ'¥l™˜5"~•j÷¢¿T¨= •õÑX¦WïûÚ{2’ôw'¦¼ráÄ¼ç÷¦D'DŒ_5‚,ʃÇȺi,Ó{¯d‰MëWq¸ù¤–ÏâewtßÖmkÆ&8¦]YJs™Þã“&Œºtî(Oý ܸzñþ‰hú˜€€'GBô(²”‘F3æ­±L¯Âgå·Å¯×ߘòÒ…ã¿ÝºqóúeØw×NÀêW²”;½ʤ±L&ƒs§s¸ù¤F%Γ‡R“7NC\\ÇËζ,¥±L¯oïn§O쇻O àG3Ü8.Ÿ?Ž ˆíkÇÒÉRVxÀú³ŒšËôŠ,_2Og_b2¡"Óàa}â`ròÆ©Û׌۶z,YÊŸýÕ6yi.Ó{pÌÈ0Ž8Ÿ€0"û\8}pçæY·_v6f©fÍš¹;ãE³&Gd‚ xêTàÚ峨`èÚ•³{S£“ÖMJŒ™@–²ÍSú¯ŠâW¯jó'žxrhÝãûwp@yR–¨[7¯Â¾‹_&iñóÈRVæ,¿ K-™ÙoÅ„æé[r`zRÀa2øßŸÏÉJ^yûeG–òÜ»•v)°Ôöu“¢§¶KŒžxíòižJ„3¬ÓÁ<6cÛÂô„d)s>4ƒ[*–B˜Ö­«Ç-^ÿXÖ6(~»åvû.Öˆ!‚}*ÉRÁí½!|ww–J\7yù„_€S˜. À…—ÝÕËgà`ž¾Uù²#KùÂR‰ë§¬žÑ)v~ÿËçO`Ó+ž7®žûãßàswü@Rfâ’Œí‹ÉR!üÌÍeÕÜY ìmk&,Ñ`Oâ*Ž&¡À­—aß½|á¶›€9*cÛ"²T.;/×V@•¥’Ö‡¯˜ØbÛŠ1˜BWÁ`28²7Áñ²s L²”¾±ån—K%m˜º~~ŸÕS;\:{äú•³6>ÏÃ>昀ÈJ^µ;iYJ_·²o*U–Â#;q}øòñMSÖGØx49ž$7ñýþ¸~õ‘¬øÝIËò€,eßÑÀš{b)¼ìÖFtÙ0»ç• 'í<6o\;“^vˆ`¾gÇòì—YJõÄR;6Nß²|ÄÂ!ߟ>’Ž`6<ìà·[×ÏŸÚ¿/m-æ öìXA–Ò߯l›ÒKíØ8-yÓŒÕÓ:Ä- »rá” ”ƒ¢ëô®Ÿ8¸#+e•s@‘¥l;P]q –ÂËnã«&µ¹xê  &o:L·®Ÿ=±goêjçËŽ,å{ÿÔ`©äM3·¯¸pxý£™ñØÅ>'¶O…3,ö$:˜±A̳R¢ÈR¾÷,›^¡ÍR)±ç÷‰™ÙõÒÙcöP˜2püä½uý̱Ì};W;ÇYʦ$XÕÖf©äØ™ñQ£ñ²;q Õ>5&ìs }½âeG–ò½Ÿj³TJÜ,0ûÒÑ?eÄ/ºqõ|ÈŸ°pÂqf%ìO‹Ù·s YÊ÷>eë+¼²Ç/5©Í™#!? PAüäŲj8˜Hß°?m-YÊÖÃ#x•÷ÊRxÙ%ÆL^<ò‡©ëì00PX¦ŸEìîö²#KùÞS½²Têæ9)qs¢¦´Ý0§×¥sÇà›’'vþ‚Ö/œ<”‚‡>\bÉR¾÷&^ñ·øRˆ‰€u|ð=‡¿”˜ãƒ] ,…8‰k'-Z×ù%4ê…}•ï ¸FáW/Ö‘¥8B‚¥€–ÂË.yãÌåãšÆ/yõâéP›˜uÉF©ãû=¼ìÈR¾÷S=,µs˼´„›— «s|ßXìCét,)úãw<÷1q(3ózd)ßû¯ÈV@] ,…ÅÿVÑáí?QÎcû¹S@(üäÅn0Ç÷o¿=¦ÈR#ÁT@'K‰—ÝÆýVŽovæhfˆ Ì[7@QàßS‡wj¾ìÈR¾÷Uý,µkkdjì¬E#&ÇL ™&œa1[Œ=†ïÞL–ò½ñŠ¿) Ÿ¥N ë·,J?Qœë?o`ï®#i‡c*Ž,Åb|b©][&­Ÿ¶hX½ŒøÅ!ò²sš œæYΗ˜ª“0d)ßû¬O,•¾mQÆö%ëfw_=µ#Â%`F̺'Ü8àvwùü1Ø9d%¥|ï;¼BE_Y*}Ûâ›ç.ñCê†ÙÖM(ù­›ŽYr<¬ÏØ{tïVÌë‘¥8BÌ£€¯,… ¢B` ØàTd鱉•xÙ]sëÒ›7.[îÄ|fô—ìäáÇöow>÷ÉRþîXvÍ/,•KIË×Íê5¹Í©Ã»,7 n:lQ¿;Ögã— ž×d)»vóÖ;,ÃAfÒ²-ËFàew mƒæeAQØôìäÁäÛS¼ìÈRþî«9c©Ý;VÛ×Lï„§ÿ‰ýÉVédØìZL@œ9ž‰ 7ˆcN–òw‡²{~9f©Ý;VîX7 »Íl_5îò…“VS·õ ÇÃúPÊñ;ÈRvf­ŽY /»]ñ WNl3³¶øµÊÀ„ÉMpY§Žîr¼ìþú‘C–2¦æ˜¥ö$¯ÊJ‰NÞ0cɨ·¯åâiùM{þþÛuPœ9Ο>sžûd)c:”ÝsÍ KíIŽÂ˜Š]4háºû’ךv4‰‚‰YòkWÎbÑb%Ÿ8˜L–²{ï7qýsÃRâe—¸fòâá RÖM¿~õ¼™Ç&~ÛüïÏ?1)yîäÞ“‡SOˆ—YÊèΙK–Ú›ºf_ZLÜâ0,ðÎJZ…Å–¦;o¢àtw±7± \bÉRFw*;çŸ{–Ú»sMæöeXâ·fjGø™n@ݼ*~òÞp>¬OÝuêpYÊÎ}ÞuÏ=Ka`f¥¬Þ8¿ï²Ñ?ÎŒ7ãÀtš à³xñÌ¡Û/;²T º§_X ‘cö$­Ä”žþÇö&"4Ÿ9NÌèýŒºrñÔÙã»ñë™,¨neßûø…¥ðûdÿ®õ)g.ÑFßKçN˜c@]Ãoüä…5ê™C˜(?},ƒ,eß¾n©šû…¥œ»q/]9¡ù†9½OÉ0ÉÀ¼u+ûewùüñ3Ž—¦0¥ÕMýÅRˆÉt0cSê¦Yt¶fZÇã{“@ÇA<…½`®œ;jV’¥Õ¡ì~?²ÔŒûwmزtø‚°ï@T—Ï â€úíÖMüäu.}=s¶î"KÙ½¯[ªþ~d)ñ²KŠ _2â‡sz# UP¦sâå÷[W/ŸqÌ,²Tp:¦YêÐî8,„N‹›»|Ü/Á"*@lQY{áÔþs'²p’¥‚Ó·lyWÿ²ÔÁÌØC»7̈‹_>2rH •´ïžÊ9¦ÈR¶ìß–­´ßYJ¼ìv¬›¾ddЈ …—ÃdprŸ|Ù‘¥‚ÓI`)„À¢è]›¬ß DutwØ&'¢Û@Ä›7®ÀÁÏú¿œã Nÿ²Ý]`©Ã{âìÝŠVŒQ%®špñì‘ (çºWü6?yü¤¸¸ )Ìñ »”`©£û¶ÛŸˆ÷Ö•cðf]D÷ý©ë MÎAê˜7øí&6írL¨)²”ýz·…k¬ÍRMUÇË®K»n¿ìœÓ_ꯗ]öÀtÙ9&±¦nœ½llx¦ïÞ¶üÚåóMD!ÁË#Ûux˜d©`tTO,¿fòwü ßþûßw½öòó[ÖLËKa¥4Öø³6/2pí¸ÈAG÷lsDËô߉ŽåX¦wþ˜Ã¶©qÒ÷<Ìn÷Ô`©æ?ÕºëÎ;0¦þ{_žf?ÖÊKá‘}â` Ö¢¦Ç/Š™Ùc*yíÔ‹gùq@Á-*{™Þ©ýšcоçvëÝ®¯K-ŸöŸß…yÏ=ÿ)SºXâ¦Ùˆxž–r ÌC©ûÓÖoœÛsË’¡§íòãÀüýw Lç2½³‡½½ìè{ð¾ªa—ºçîËoïÿoÞ)czäÀ.%Xêäá´SGÓOË„u ‹½fªyçObçæDÇÂÄ• '°FOÏÉu|ï_¶»¡K…õižçžÿˆ1uÏÝÿyí•çÖÎðÕ.%YêÔ‘]èÏDz¶o]5Iœfª ׯ^ÈÍ€úã?Ð`Xì}áô]Šëøl×Á­Za –Ú¸bÜ¿ÿ}§˜ÿüçÿ=\ ß‚a9f)¬žs¼h§¥nˆX>®™ÓLµâÒ¹c¹˜[^vˆì£g`r_º©K íÛ ? e‚¼yîþþ›J¾Îñ¹°ÔL8¶ëÚ¿lA Ÿ%FM8}8Ý×~æXRŠºt*{¢Ït='ãK¡‹Ùë–ÚþR¥K¿€Åqÿï5y€Os|.,…+¼%0 ·gûŠõ³zÌPP•£g·ÃõÛ­v k(ÉáÆøRöêàV­­ö_‡–ßçÍs˜÷Ý›§]óz¾Îñ »”`)ÇÀt¾ìïŽß´`àÂauWŽožº~æ™cY¾¾ì/¿ßž€>LÆDl_Õö=Ÿ>¾Çý÷å•iðxñ…§c£§ë÷—Re©s'÷Á=Oí£{·'¯›¾bB ¬úÞ²dØ¡ôÍ0`“4OÇŒž#ÚòñÝè²¾žŒÕØþe»»yõ=ÿ®f…æèží^¦ˆBrõÒiagòõd|©€vU¯ëøâ¢'Ã_ ^SJfŸ0²‡Nßsm–Âr$ø9¸ÏËʈ_´.¢Ûœ¾_ီ¶wÇê §a‘âüÓáÆqíâ¹ã{Nc‚#G'Y* ÝË~7óÊR©q³&ì’ïûä€ÂàrüDY¡Ç÷Ü+Ka! ®\8‰¨¹‰Ñ—m‚1µfZ'pߨŒÒeL9컘%Ç“:G W1î¹ýº¹õjì•¥Râf­Z0òÙ§Ÿ¸ÓéÔˆã_ÿüçC>0gjXöËΛï¹6K]<—ý²;u$=-v†dDÏJQ“Û&FMÄì<ƬûÀ¼vù,"#æ|`2Vg û©W–JÝ<Kׯ¦ü1 f¯]³bbl¤×u|:Y ¡Éå cÕÎØy›ô_2òÇyj‰9 çnzW0—ÊåÉ=dÙÁìv/=,µsóœõË'zþ)å|_þ|ÿÖÕë:>ý,%<ÓîÚˆG6ßP˜X‡ øÌ‘LG|¿K§1qËE–²['·b}õ°^vÛ7DTù¢Ì½yÿšïûï}y›4ú&më²Û l=®ãÓÉRÊ—ö¢IY?!ÔaHÆäÌÆ¹}°8W¬üEåv`’¥ÙSu²b"DLê÷™ð~ÿïëÒþg혺Yê$¶šw?1s±/e푌-øG¶_N²T ;˜Ý¥DL„ï¿©ˆŸ%Í÷Ýs÷‹/<³dÞX˜¾°”ú˜:q 9}K$Ú.~Pd)»ur+ÖW'K‰˜ƒû´V¾ìð›'ßÿ3´»‡—]vLÝ,¥>0ÏÛ³'qö¥Á2=¿ Lî!°ÎªŸ¥!!fæë¯RÎ÷Ý}÷žyú‰£<Å—ÒËRN‚–<'¤Â@ê` bëìIÇöoG(,Ä:²gËáÝ›eÆÌ؈ºصnZ̾kö¦Fg¥De%¯Ü³cÅî¤e™‰K2¶/ÎØ¶0·âç§m™ fmRcg¦lš‘¼qÚŽ áIë§$­›”3aûÚñÛ֌ݺzLBô¨„¨ñ«†oY1tóò!qËÇ-»dÀ¦Åý6.ê»qaï ‘=×/è±n~·˜y]ÖÎí¼vN§5³;®žÕ>:¢mÔÌ6«¦·Ðá+eK¬{ðF¾*àK!¾TøØ^xL+à_UHŽ_¦_Ê–ÒS¨—ßFFå¡TŒt”M±}±b"¬^<á¹gžALÄùÆk/­^:Õíeç#KiÌsÇ÷‚࿱ÉýøÕO}b)ᧆµ”?¦‘V@|PªÄ¶M‹Ýcuêd)¸Liœ'ÀRg8b+øí$Kª‡Ùì>¾²–^oŠž)å|fcLuhÝØ=V§N–ÒPøÖÁR~MŽI–²YO·Xu}e) ÌäÍó¿¬XÎåe‡T5«}žš°Rñ²ó¥´Ç¦ƒ¥NîóãØáÇ“v)õ!æ£P ,%b"üüÃ×xLËñX¨P¡?þ¨Dñ·gO©Œ{®—¥¼)ÙŸ£Éñ¼¦]Š#Á¼ 䀥DL,´º÷ÞyæTº×ù³û.œ; ÎËßzèÁ<÷Ü]áÓr›bË=dDÜs«Ó_êÜQ¯ç‰)Îúøý¤ï¹ÑÌnùk³TZüüáa}°^ÁÓÞÆC{îônŒ©ógöÊ…?n\¿Ðµk×{î¹ûþûïëÜ¡Åî´Íb÷\Æêô:šD´‹ßG“#ÿÙô=·[ß7u}½²Tø¤‘ñk§{ÚÛØ1j./;åÀ¼rùddd$–´çÍ›ç›Z_n‹[å÷üov)/»sdz°“ÿÇ&YÊèî©ÍRq›Ö¼Tè¹=šc™¨ûÞÆ $€¹d©K_¾tLœ°N§²—?Üsw‘7_ Ÿ8ûñ¹³,Ÿ^OK>€Ç´ßO²”ÑÌnùk³TƶÅö{õå磎RÝÛøÚ•sxRK–‚ÑWŽ)L+TªT cê?ÿþ÷½yóÔþú«Ä-«ÝYÊëh ,eÀ€"KÙ­Ã[¥¾^Y*:jÅÓO=>yT7çËÎuoc¥á#Tù²»qý¼õÿüç?±°½ì‡¥Î —{È(YJÏØÄFˆ,eÄØ¤ï¹±}U›¥.œ;¶5nÉÇeKVªð!˜Ý}oc„»|鸰K‰îuõÊiqâÑ•Æ2ÿ¼yòÜÿ{vu½Ò.Ó”×,…=g0'mÀɘÆv0»åî•¥®_»ÐeocüD!Ûšbay,Îßo©‹/<ôÐCøAâ>¦î¾ûnìFðVÑ7ì¹k»ö˜BÃ2šÄ uŒ)Ú¥l×ùÍ\a=,…hFðñЫոÝ_zñÙ>]›!&‚ËÞÆðS¼uó*ƦÛË ú²Ã¨ÄØ„‹z«M6®[¡=0,•iÔØüëeÇøRþî­Ú,…M]ú÷é,Ò”*Y4rÖˆšÕ>{«È+±«gºïmŒ}°ÑϤ;ùeǦÅÇa®\¾p¦ñôǬ„û ŸÜ ï|wýª>ím|ìÀÎi“Ç|ñù'° ¨BƬûÀK!Ö‰±cóoer?u\,•°qNìÚ™_Wÿ\¤/ôüÓãFöìÞé¸}|]ý‹„ |ÞÛøÔ%‘³êÖùOÙÏ0 èè^§¸œ'ö';XjÏCOîmì§>eëlô³TüúYóf …¿”S5«U˜>i †Ø£<Ô£ss¸Lùº·ñ=)#‡ „:~ÃQd ºš>Î}L9XÊèŽm=ÌUyý,•°avÌÊ©Ÿ|TJŒ âo¿>ylß6Í``6ª_+9~©Ï{Ÿ:€1X³Ú—J ÂwÜñ]íšîÓÁRGv>6ÿÚtœ,å§ŽêK­_5­o–÷8ý^ïø×¿*ñѤ1}ë~÷Õ#?ع}“ƒ›|ØÛøÔ~¸“‹sÃÚeM~j‹T…O?>°'Y~.ÿ,åø™kè¹{óí=íU»¶µ_–™¸$cûâŒmÊíçÜÞîqÆíí§$‰=í³·{ãØî1jDü*ÕíûnÌÞÜîq­c»Glkß>:¢mÔÌ6Øîq@‡¯”-å§Æg6þWÀ'–Š]3sÕ¢‰_VüH4.ö¸lݼþèaÝË|ðγÏŒœ=Ƨ½ÿ/‡3&ŽVñóO¸ÿ¿C÷qPø57v4‰¡ú×#{=¬×ûÓÖîÛ¹zojtVʪ=;0 –ïÆ^„Û—d8¶PDÀ-„0MÛ2gçfl¡‘;3Ù±…êÔ¿m¡ºfܶÕc·FNˆïØBuØ–C7/‹[6(véÀØ%ý7-î»q¶Píµ>²Ç:Ǫ]cæuY;çWç€êÑ.zfçª-˽WXŽ)DoñW`ŽfRÀ'–Š]±~Õô6Íë‹ù¾»ïþ7L“F÷©þU¼ì†êò÷—·=d/»%‘N ÂÖÿîÄá ÷± –‚Û±ác“,å÷ΩÍRØTõúÕ »’¢„] ,µfù”Yáa°K‰ ï»7ï÷ß~52¬ÛGeß{¸ÀƒS' ¾½Ý£Ç9>÷ܧÓÁR'²`72ú$Kù½ƒÙ-Cm–JÝ<þªgNîKÚ »X*fÅÔÕË&wnÿ“\šKUÏ.-:µýù™§Ÿüâ³²Ûc—êÙÛØ§…Ä–2~@‘¥ìÖÿM[_¯,uü`òÕËçR–Â.%X /»ñ#{Â9X¼ìò绿ÙÏßðk±·^ÇØ\8g¼®½}|Ù=–uêpšñc“¾çþîªÚ,•7 +B¯_=`ÏvÉR«OŠœ=²v­Jwÿçßâr¸éµjV¿Gç–/~áãrï¯Z2ÝëÞÆ>=úÁR«£—ágfìÁŒ0ápü†ŽÙ·só7tTVòJçÏhÚ¥üÝÿB.?=ûñÁ•ðÚ•óÉ[—K–Z±pÂÄQ½‹½õš”*>°o‡†uk(¿y“ú»’ÖjïmìÓ€,eøh6{LÑ.r}ÝRòÊRxÙa)‚ûìIÛ$Yj墉³§©RéãýËa ÂQèùg0 Ó¾uã§Ÿzâ«*Ÿm^·ÈËÞÆ¾³ÔÉÃ;16µ^v˳_vƒ±rãY©±3Sãi3gOÂŒvLÂ8 ƪ“00÷ÞÙs½Ã`ÜÍa0žÛyc¦ƒcff[§Á¸UˆËÇ ¢TøÚËþáëþJï•¥ðK:-!ß³§Ç®™ TK-[0náœÑxúc[{™CÑ7_íÓ½mÃz_?öèÃ/½øüŒÉÃU}Ïv)ßNK߃‡rN²”¿º–=óÑÃRØ/+y,¾{3„] ,µdÞØ³FuíØ“bLýçßwU­üÉÀ>?-ÿ!&°`;~ãRO{û:¦,E–²ç@0[­õ°^vé[]:wìø‘=£#ð²K-?.rö¨QCº½öÊ‹òe÷aéw00kת‚Y±ÂGK„gÌC©®ûñùø²ƒ]ÊÁR›ž_vd)ßû¯–Û=žyõÊÅ­qË$KÍŸ9böÔ¡];5{æé'D>ÿúç?Ë—{¿o÷vê×~±Ðs€ª¡»Ÿ<”ú÷½±w£o§“¥vÊÜ€“,å{'â) “¥à„™à-qúÄ¡uQ3$KÍ>,"<ìëÿsÛèûЃùê}W£oö•+–Ç.LÕ«~±zÅa8ÖN‹½s0¦Ð,Mâ.d)›ÓU×'–ÂÞÆ{w®½qíbZr¬°K –š6i0^vU*~ ¯Î²oÇí½}~Ù9XêPJÀƦ‡—íR¾w`ŸXJìm ¬9ödÔ²éJ–?²÷à~Ê•yOܼD±"]:µÖ«âçåÌŸï‡ß%&¬Nùz:Y*ó`ƆÀœd)ßû¯ÈVÀW–ªY©ÑØç+s×¶EsÇJ–š<¦ÿØ‘½á–}ræÍsOå/>1¤w§vÍÞ*úú£><<¬ÏÑ;}PHïd© (܈,Å\|e) L KóøÑý+MQ²^výz¶+ùNQ901!Sªdñ~½;…õïV¶L)¼ìÚ´üyWr\¦“¥’66ÉR~ë–9`)ìÇwh÷fG”Ø´í fv)t¯ÑÃzÜ­[§Åß~ã_ÿúk»˜W_y©]ë&ᓆׯûõCå時=»wHLˆ“é<,u,ÓÑê;é{î·.f¯ŒrÀRbocØ–.]<»~©°K –9¤ÆTƒïk=Uðq9T1ýWþ£F í¨ÂîL÷Ü}wåJŸvô@ªÎ…dh•À&ǰ埽‚Ùj›–{c'¼ìR“âæN.ìRòe×¶eã"o¼¢|‡/V¤{×¶Ç®U½òÿ{ßk¯دۮäXý,…×›*/;Ú¥|ï¿9c),îCL}@÷¥ çâãÖˆî5fx¯±#zÑgÜȾûvúü³rÿùwöB?Ü¥`Á'~ù¹áŠ%cGøêËÏ1ëŒ ´öíºkG,8Iût²TÇ;ÉR¾÷%^rÌRØï@úÆ+O<~xiäTÁR·ÇTßq£úµkýÓ¯½¬°–.9<¬×’ÈiÚ7/óá{Øè©rÅϦNéu@!“¥8 ÈRAU Ç,…—ÝÞkàÚxñ¹u«¹¿ìúôhWöÃ÷”æƒÂ/½ËñÊ¥³è†9ø§yóU˜÷flõ:6o³TÇ&YÊ/=3Ç,%¶{ÄÓÿÒ¹£gÏœ\¾8bòØSÆ œ2nPøøÁá¦N2iÌÀï¿­–?ßò.@õ Ÿ}4dPØõK¦…¬úåç˜`~û­7ôíš¶#UªçñýÉØ6Òë/'c"ø¥‡Ù,“ܰ”ØÛØñ;øú匴¤ˆi#o)Ç€rŒ©‰CÃúuBÉÚYÏ<]°q£ïçÌ¿~Md¯îíñ-‚ž×¨^%|ÒHO Ÿ£Y:šÄÈe¬N› óT77,%^vœ{õÒéãG-œ;Ùõe7qèØáýªUýB¹1&a¾¬\aâØ°¸ KGèÿE…101¨ÊÊØêil‚¥àùè±éú²£]Ê÷ž›K–{#ò xØ—9öøS†Í >sꈈ©#gM5kúèÙ3ƶjÞ¨®¼P½ŠcbbðΤõS'¨U£JþüôìÚÌä~ß¿n¶øà“ñ¥|ïPv¿"÷,…ÁS˜¸xáì¶øõ3¦ 1Å1 c jÚèYÓÇLV³F•ûî»W9¦ž{îé¿4Z±xfü¦å}{uú¨liìΔ¸eê˜r°TÀYÊîÃ#xõÏ=K‰ йyýJzZâÜ™cþzÙݘxÙýبÎS³¶‹á‰-=jV¯Rà»ÚÕ–.œÖü—†­[ü¤:0,•ø±I–Êmßô#Ka‹"Ä ÂW¯^Þ»'-jù쥑áKN]¶hú²E3–-ž)ΨsÂv‡9ôá‡RÞöÏJ_|rêhºû –B44vàOÆ=Ïm³Ùõ~d)±·1~#ÉåK’¶m\‚9ÏbǘZœ=¦V,0µkÓÓØ0U9¦òçÏ9/\uL¡Y?šœwä~|6樮Y /;D3¹|þ8^v™éI+—F¸ÌåK"¢WÎíÙ­]¥ŠŸ<ðÀ•v)°”êÀKa–?(cSñ²£]Ê÷^ë_–{c‹Œ gýñû­£‡÷mÙ´¡W¯˜»zå_gLôüMëm‰]1}Lí¯«>ýÔ“¢Ÿö˜Éýt²TžÂ?ÉR¾÷)[_áw–‚u ûñ8”zõò™›7®ïÉHމ^àSŠ…¿á,·a †UßÞŽ8鈞€…GväÜ)ªcÊÉRAPd)[àUÞï,%^vÇ÷'ÁxŒ—ÝáƒY›b–ºÌu«Ä®_»|Üè° À4%^v–R{Ù9Yj{PÆ&Y*WÝÓ–°‹ýø.œ9øÛÍkçΜHÝ·aíBå)X*1!:5)&=uãªå³>*÷¾Ã.u$Íý,…–ÊÉýørÕÃlv±A,udïVx%‚¨®\8yýúÕ#‡²â¢\ÆX*!nÅŽm«Ó’×e¦ÅŽÕá˜,¥2¦Ð,AMâ¦Y)«œ\.ßxÛ—d8¶ýŠDðR„ƒOÛ2gçflû‘;3Ù±í×Ô¿mûµfܶÕc·FNˆïØökØ–C7/‹[6(véÀØ%ý7-î»q¶ýêµ>²Ç:Ƕ_]Û~ÍùuÍ쎫guˆŽh=³sÛ¯–åÞ+,Ÿ~uêÔ±Y?µ]u b)çËnŒÇÏþý·›§NNÚ¶Þe` –’/»% §¾ñÆ+­[4V˜gí9¶o[°Ææí—íR¾CYJìLJդX—„ýgöîNÞ²i¹òLŒNMŒIOÙ˜•¾y`¿.5¾ª„ÝfÜÏãûÈR_)[Ê÷væRÀP–‚ñOm L.üþÛ­S'¤$mR¨„Ø;¶®NÛ±.sgì¾ÌøÅ‹DΙ¢:¦ÈRd© sÜÆP–óÄÁ”‹gݺy «F2Ó·+&–ƒÈ—ÝÞŒ-Í›6Äz,ÕI– å½ÅEØCFÄ=G¬N„ÜËDÅ:>ᎇ)daö”v)ÅÞÆ;ŠÁoݺyúäáÝé[ã£Ä™š¸6=eCVzÜÀ~,µÓýKáC2ëL^éü½,3qIÆöÅÛ”[gϹ½uöŒÛ[gOIZ7)1fÂöì­³Ç8¶ÎŽ¿Juëì¾³·Îî!·Î^ëØ:?£ÛGG´šÙ[gè@–2Ç#Ù[)ÀRxd‹1rñÜ‘ßn]¿võÒ‘ƒ;wljÇÖè´1™;7íËÜâd©Éªc õÚhrŒbÚ¥¼õ$~ïWÃRÎÍgwÂ|pãÚ¥›7®<~0=u³ËËnoÆææM8YJåe–¬N0ǦãeG»”ï/v)G÷º}båâQ!Œìo¿ÝßúuÐR“¥|{ ¥‚ÖUíuc²”oS,Z§]Jÿ(1”¥ŽíOòË –“eâ±ü“1ôw.;¦4š¥ü2  ÚÆ£É9¢«ÓŽ%Ðu6š¥ü50v©Ý›Í16ÉR¾ôRƒY*AÌrf³B[™àd|)_ú—íÒÏR~P’–2Áhe`ÜsÛ“€WØx–òÏÀt²TœIÆ&íR>ôSë°TRæöÅf8ÉR>t/û%µK™b@aP“¥ì7P]cK±T¬Þt·&}ÏõõUãXêè¾íþ:v©ý‰xàšædÜs}ÝË~© e) (䃖1ÍhrŒkîÇg¿±ÐÊR~˜°KÊŒ5ÏØä:>½ÝÔH–Ú†ÝXýr’¥¸‡ŒÞìt³”F%YŠûñ{¬ôþ³”ß&YŠ1\c"`S!Ç÷b*z;~¹šèÄ…ñóÓ¶Ìݹ™ûñô™hò›ÈRþP˜ÑD£É9´w%,H‹Ÿ—¶eÎÎÍc‘;3ÙÆfêßÂØ¬·mõØ­Ñ£¢FÆ;ÂØ Û²bèæåaqËÅ.»¤ÿ¦Å}7.B›^ë#{¬s„±éêc3çWç—¢#ÚEÏlã cÓ’,eò¡äßâÉR~{Óa`‚¥fl4רüëeÇøRž{¥¿ìRÛ7)þö%Š½Ù®Uã]‰kŽìÝêÇ“,E»”¬Æåæ/–JŽ_öùge0¦>.[j¨þ~M"+²YʸQ`œýÈR?6øZ¼ìzwo³7m“Ç&YÊÖv©Ê”,ÿÍ—MGwÿ~Hû¢ÕÊ•(VÄSY þ:ÁR˜•ÀÏVs´K™ð‘ì"ù…¥¢—†?öô“ú¶k<¢KÕî?=Uü•Møk4‰| “¹F“stÓ.ìþ²÷÷ K¥'®zãµ—ªÿR/»o·.üÉ;å˽ïÀ)ÿ½ìÀRÒ7˜nlf¿ìh—2Ò.5fXw?ú`nÚº±Û–ôÙ8£uÔ˜JCšù§n³Ôü] f:ÉR!ûàÍyÅüÂRøqÒyTÿ)«‡Ç/è¶.ü—Ã_­^Æ¿8åd)3&gaÈR9ïy¼RS¿°T§¶?}Y·–|Ùa`–ùµŽqê6K™ll’¥¼Ž¯ÜÏñëõa³'.ʈœ´bPÜœŽk&ü¸4ì:åëשqxO¼_Îc°KíÝêxÎší¤¿”×f³¹g©õ«f<òø£kö%*ŸÔ[ÔÿÞ‚V.žæ—…LÐ,¦MbtÓ_ÊfC&0Õõ K=öh¹±+•/; Ìg?-Ö¥cs L'K­7ãØt¼ìh—2Ò.•?ßýsã£Wì‰WþŒ®5»û¿óß›· [ åþÌf©-sáëm¶“¾çyZå.¹g©Écú+ý.XÊå÷IÉÖ5?.÷~îG“ÈÁÁRæMÎ"Ñ÷Ü*ÝJåÌ=KíÚ¾âŽ;ïÄÀtyÙUßú±GÎÚ¹Á/cÓÁR»Ö™sl’¥´z|îíRyóÜ33a~Cƒ¥ä4hý‰÷_ÜïW¿t/'K%à!k“,e¥ªñeÍ=KÚ½xÙRPbLÉi>ü>É›7¿ÙN–2ã€"KßIíx‡Ü³TÒæEwç̓_8î/»^|bÎôQ~yÙ9Y*Æœc“,e,Kaޝíø~ (œxî+§ùêÕ©~h÷æÜŸ`©#YñhHsž©q³Rcg¦lš‘¼qšsýö”¤u“c&l_;~Ûš±[WIˆ•5"~Õpçúí!qËÇ9ÖoØ´¸ßÆE}7.ì½!²çú=ÖÍïæX¿=·óÚ9œK¸ÛGG´šÙfÕôV\Çg•ÇîY s|ù)€s9 „¢˜æ[±hjîr€žæM¢TŒ‰`•o•r枥öî\ƒ9¾˦ˆ©|Ù=ÿY‰.šùe`‚¥ö§Å˜vlÞ~Ù!X‰xÙMNüÛËn´ãeçV¢ú²C°ñ²C°’ì—ÝÇË®ƒãe7³­3XI+û®ãkT¿Ö¿Bá‰?YøKá„S^ѺŸ9Y*.÷'YŠ,e•GvîY lÌ›÷Z>I9¦ÀRpC¼ÏÁRá¹PÈ,ŘVS~)§_XêóO?¬Ó³…ËÀÄËîÅ ïvéð‹_&Yʾ,…e¢ õÖ †¡ðÄGÇÂC¿¡_®ò~Û–fÆæþt°Ôžx›ö¤]Ê/<ëgâ–ÂÚØB%‹ˆ¥Sÿ¾/϶ØÅ¹PÈJ›w49†9cuZ0˜©~a©øõóï+ï×(‡½@90 –|uøàn~˜gŽîÞ·s­©Ç¦ãeG»”[çν¿Ô¾´˜a;?ÿ~P8k/è]uæ¯pÇó×sßÉR[ðx5ïI–2Ós3ˆeñ KaL½_òíJ=~c ªúÜnÅ[VCÜN¿<¯o³”‰Y*ˆ8oí–ÂÀlÓ¼!b(ʉ±)|Ïw§Äøel:Yjyßtx “¥Tˆ_Xjÿ®u{·èå§K4«úÅ´öÅ;ÕzàÕ§öép0c“_N°Üú°§„©OúK…â#Ø×:ù‹¥2’¢?*ûÞóûdH“‡7yãçŠo¼V8vÍ\¿ (d‚z™z49;÷ñµû1½'üÅRxÙ5ûéûÇ‹½Tªcí [¿Ý¦Ú_|<|ü  L°ÔÞ«Í>6i—rïgþb)„j5uv½¸óÎ;_?|üÀýuÛ»ýðžÍ)±3L}’¥ø ÿßÿüÅRûw­ÏL^Ó«kËgž~sèY[7-ò×€B>N–2÷€ŠA–âò—~d)¼ìÆèýþ{Åòæ½ÿFÎãÇy›¥Ì=6ÉR†²Ôô–Ú‡9Z“Ÿ\Ç篟uóñ#K4šD¶–2ÿ€âÞÆÖ &+¹Yʸ±é`©Ôh ŒM®ãséá~´KÖ :ÁRX"áø‘jò“1Lö |qüÊRF (ŒS(cöÑ$ûÆ©[z½fܶÕc·FNˆïXz=Ìg$,nÙ XGœ‘þ›÷ݸK¯{­ì±Î±ôº«#ÎÈœ_AF:DG´‹žÙƹôº%×ñ~tñŽþf)£Æ¦`) ŒM²”A,…) ãN'KÅâ©jþ“ñ¥‚ø¸4íýÈRÆ (äì`)+ (²”zu”Á,eèÀt°TÊ*KŒMÆ—úÛ¸ð—] yÆ–ʌݱ¿PÍ2VgþUÀR,ee0K}Uå“ßn^óoO`n¦RÀR,µÂ2o:ƒ÷ãC8˜«—NûÔ‘¬ÌR;×"潡§Ó.µ[è4to㬔•çOð©‡1q`ðK< 0Zv)k (ñûĻԗËÌXãÚ¥ÀtÞ%ð ø‡¥Œ˜»ÔŽå›†îmüØ#íMº|þ˜þca–ÂV¬FŸG³¶#š£Í,t⹿vü¶5c·®ãØ:;jDü*Õ­³ûnÌÞ:»‡Ü:{­cël,ánÑ6jflí²·1X çÙ»õ÷0¦ Œ~a)£ò‡VMbàÉRPûÒÖ\¿z>0ý„w °~a© L°ÔîË-66ÿzÙv¼ìÁJT_vVÒ{CdÏõŽ`%ÝÁJæv^ãxÙup¼ìf¶u+i¥ÜÛ,%^vÎÒÙa¬ËR«÷¦~:X*}=ž¤Ö:f)ô°ÓGÓtö0& Œ~`)ãƬƒ¥¬6 Œf) (ü¾vål`º ïHüÀR˜–JZf¹±yûegKalž;¹WO‡±*Ke¥®Àé`©]ë·¯…¥ÇZ§±v)ì>Ù?õôE¦É¹g© (Üu´ÚhrŽ}ÃæøÄh¹WÌ¿ÿ–›>ÀkM¨@îY*0ÓÁR‰Ë,86ÅËÎ@–ÂØÔc6¶,K¥DgÍÚæd©ñ–; ã~LLÐmÖ<Ïn?°”ñ cÖÉRÖP`)Œ©ã’ÌÓ£X¿(à– ÈÀt²ÔR+ŽÍ°œ½þÎ1)K-гtÜÎ-óÒìÚ™¾mQÆö%™‰ËvïX±'yUVJT`N'K­ÃcÔrgX þ#Y[þüó¿ûðUeTU—ßÐâ¿gŽeòÙÄ{©*à•¥RãfÍßëöO”ÏwÄÍSÌñh@aä¢ðMŽbGNˆïXz=lËŠ¡›—‡Å-»t`ì’þ›÷ݸK¯{­ì±Î±ôº«céõœ_AF:DG´‹žÙK¯Gõªýø#÷Ë1¥ÊRS4M…Ì0÷ÊRxÙÁ¡åµ—ŸG¯x»ÈËW…+æø70ÁRÛYwlæ2&¬‘?¾SäY90eL—WžFxEó²Têæ9˜BnÛ¼.L ø1=¨wká/È3›¥¢ÏP+ž9f©eS[6ªýá=ÿ¹S RwÞy‡*KiÓzÈ<M^=,©-«ÃK–xÃ1ß÷Ê k–NtúKtL9XÊš£I;Ç,5}è¥KR(ü]«Úgü}bò‘•Ëâéa)ñ²«ÿ]t‰|üwê¸ÞÂ_*§ƒ¥¶-²îØÌ1KENhV»Ê;wüëŸÊ±ùÌS«ÌÃ{â<õ³³¦#&õ{ºàc¨g•/ʦÆ/ d÷K!RsB"^Z÷ô9Vgë?»ÿ>‡ÍÙå¨Pþ}ÕîE‡Ù\>mýr¹N–¾ç-~ª}çwäÍs÷à¾m9 p/TÖÊ£ ÏŸíRsÆüRå“·Ü>™4º§ê˜âÔ¹_…2ÑÏRxÙÖ,…ŽÑðû¯<0ÁR˜ú·öØô1VçŠém~ü¶¬‹É@ŒÓFõª{zÙ]¹xRµ_Y€¥°Ž/!fæg—B Ÿ.øøÊȱ»ñc: §“¥ÖàéiåÓ–êÞú«g >¤úÐÿþ›Êi[{ê^‡27šá±eç2øÄRxhΚ<àÑGm]³ê§©ñ 3 p'KYz@ùÀR‹'·þ¶ê{÷Ü}—û˜ÊŸï¿£‡tö4 ð¹Îvî󖨻O,)Ìñ½]ät˜×_)»zFÀæm–²òØô…¥Ú4þ¼@þ{Ý&¦_šþøÆÀ<¶›…YJøž÷éÚ?¦q‚Ù·n˜+¨ÑçѬ­ûRW#2½¥O={ÈŒì]ïõÂU) æ¨u+Ã5ú–øŠèÁ}²ûÊRXz°~¶ø‰¨9¸“Ñ£Iäï`)Ë(]þR?ÕùøþûîqSyóÜӱͿLÄ€òôÈn7ãÝ}UÀW–1Z6­ƒžË1þH‰ ÀØ|GÉ@Œ\Õ¥!&ãûåÇšN`ºoÊèîŠXK3]0qéÈAÄÓVÐÙáŇFœN–ŠÆsÓê§*K-šÜ¾âÇŽ•’îÇ‹…žñäÉáé5pöÄS=ÂìVm–Š]5ñÕÂÏ¡¡áx¿fÚ_1œgëúÙ°õŠnð]­Šø¯£Iäé`)ë(O,5´gýgŸzXuLaɞן¼.ƒ‹û „À(öj—ªV¹:ÌSO>:ú ¿b"Ü~£uíð¬SHðÞ;EV,cÜÀt°TÂü›j/»>sƵ~¯Ø‹ª&ƒyÓ‡èùy#Ó\:wĽg𔥰LttX±~»A*bŽOy&ožÿsÚ˜ïCÌSlŠšê’À/ÿ=º,µeåPËŸ·K­Œèú}²wÜñ·• ¢Ÿa-èþí}êX"1·¿îsßëß¶uÓê[IüD ÓSL%(ÏåóGãyxv·oYß/#È=¨dùÑ$‰0yHÓbo:–µ»øÉ»jÑøŒ)Úzƒ;¦ürw¯,…—]ÏN±V–ãv-ê¹Ì„u³ð GþÔÁ›`©] óCalþýe·8¼Sµ/Þõ—É@ŒbÕ0@æe),Åß[E^† X¿­JKø°léâH¨Z°üÛÉ,•…‡fœbŽoÝ‚¾Mëqÿó¸÷-nž^ رÈ/f’3¼²âK!&ÂØ!ñÔFëÿÔ°¦ê`?¼ë£<ˆX<‹¿ý; ›ƒ¥Bb@I–š7±Ã§eŠª>¬_µÐŒ‰ýs@QâÚzs6Lu•–ÂËnÉ졈¤ˆ^T¦tqUZÂOá“nÐOKÅϱ)^vQ³{Ô­Yîž»ÿí>6±ò£_–9˜G÷%XÉ.%Bn` ¹ùOµ¡^#v³»Ÿác{z^Ì+?ؾEý„˜Õd9ø,••…† ³{ÛÚ?ôWœ@ÙÃÄÊnd)S=©eat²ü¥6¬˜„€â'  ¹ „ñlñó·¹Þ{çÍqúæ`ìxºÑ„ZDÏí]½b)Uû.âÓh/ÓÓó'K™s¬ùT*,…—]â¦ÙßÖüÜi9þ/–ÙªŽ ¼åOÞ]~ÁPõרK¥m™2c󗆕0Àd †­UY þR³&÷RßÖúbGÜ\Lù¹Ÿí[Ô ï$[½x¼j2Ÿ>t²Ô*D7¶ú9²ïOÏ=ý¨êOgD ôÕCõ5@»”OOX¿'ÖÏRb?¾ŸÖƒeܰ.ªƒbãª)•?/#¦Ña£êÝ¥©§¡çÓ˜r²”åÔú…~¬SÁÓOÞîšèA%¯iÈR~&ÏP?K ßóÛ‹Ÿ1ø=£:²0 1xÅ ÿâo UŸÆ jb'Kýÿí]y”UÅž?&c‚EQQq…¨(B³ "«,²/¢l²ƒì Ð4›ì-kwC7ÐìÐì{³È¾¨1Æ%“ÉL$š“8'&19YÎ|ïý𲏷ªî}÷Ýwß}ïýÞ¹§O÷몺U_ý¾ª¯~µmInΞÔGç2p¿óÃÌÍÖR],½plC½gŸ ÁôÆ‚9øFù Å'O)>-šÖ3„Ô¥ -…Ä"ÛßRöY»dä}{4¾,§!)-µûµç·-©ñhùS …Ýþ±Éƒæò7xæpé AÖ,›Nãú¨2G©!éÂ&Êç†å£ë׎,Õ·ê×}Êýa¶Ž ²à3’Ë)_Þîè—ºx¼guºî©z‡²cBH.aty ž˜à`§v͈ÅBTm_7ßMgÕRSˆ›7MƒË q;? „M½3 ß~“4.ÐÆdŸý™<ö5 €£pЙ2ŒøÇ~ÂÎÈ(ñADü‰/ ±®’–Ú=7%v [Æ1jho—q(ì«/ÿË—¦‡ñ†€ËõR¯ôlKƯ´|¸A €Ó¤Ã@ÙÀü7gò`/&N¡­cxŸC¥Ë ±"Z*Eµ«h²î°øw4ä•Éõ¿ÿÍ›1p¬ð ਥà8À¦õ¹Ó‡ÓS`>Øâ7|P71Ô1S ÑÏ}£MËF×{Zš»Èˆ–:³1%¸Y¶-×pØ_;? ZJ9È õùR˜B>±/Ÿœœ5}àÐÎežßfyÎ)êѹ%5åmZ>§ c‰²­x¢È¢jøÀnö”ñÍÕŸ_øô½½ïìžò'wBÛYDlù`‡_;GÕÊcõÃÓ¢¥}N\j)¬—Z±×Ð¥­Òì7äç‚n$¹ÞÞûÊ©Ê`âK˜;cx‹ç³dQ–)c¡"BÎ&dïÀÆ©Ý^j¨;Ì6A³äŠ}öó3io´™P@—Z ÝžM‹‰wèòЯÙéƒÞ,£¡º0üi&&þKYTåL¬ŒõÛ«Ÿ|p¦$üÜ5°­î|Ä\DRå 'ìZ M?žá»Â€ ÊÏCßXž=›‘ä§qƒ§×,{SÌkà+áYÅÂ,eøˆ–zw/n¯ í³$çµG¼Ë®¢ð¿;ÌZŠïKz¯à^KÁÔOì[ ›§! ~W?ä5ÁàT—.˜%.Š! ¢äL¤L6¢¥BL¨c[s†¼ò¢î°ÜIì8¨ð+€r!éfƈ÷Z |¹rª„\ Þ†ü™Já{’\ä>ˆZ}¢åKáA@eøˆ–:]fnæŽïq÷·*]‰Øù¡#²nv-µNÏúÕ3©eïÞ¹%®ßË¿ VðÖÕ¨:cÒ e0÷_^ý4¢¥Níš§ÀxgEB—qØŒKÅÚÂúÞ¥–’ ’J‹fQ’âòÉ7…•7Ü/<·µhž{ú(C¢à!deiüк!oü‡Ùƪ±x±”ïIJ‚îµ”à øHÓyÃv•lÜ\—7¢^퇕]¢w~è«[Ín-…kdlÚq ÀŦ$œ—c@ßœ=\ˆª¨Ÿ€®ÂU[‹æèë¾/×R;gž dzýäŽ/ÖMî2»…ñÂŽøÜøSp«¥l„Spç1=ºwzêèYîã{VÆÊ©ˆ– ›(Ëgøñ£‘¨ìœLðW‹wrÄψ¤àVK©:;h#ê²j×ܽqŽk !(L‡žà'~7Ö%ÑRï¬ 7K Ç5oT~H¤…›ÁìüPj)à LÒ´Ô 7Ü z Z•Ýç\9±æÝ“EïZ÷þ;hkƒî¹tbý€¾¨õÇnÒ²=+ !q š˜¤€]BTäM1$.ÿ Zê“+»OîÌIúsdó›¯uozÓ¿ š@×4°s!ÖM !iÈ2'%%%r‹Óå¥ç¯/|÷ÄÚ÷N¿ÿÎúŸœ.ÁÝÆ³ßµqÚkj‹'égyp{$5Üøàtœ1ÃzâK—œB$M”Í+GÕ{F=äÅÉ4Ï’Ëüb§T:Ñö‹/¾‰ùdÍOìÉ1Ë;»ÓݙÅ ¥€s‚ð§Žhø˜X9êhÀ¿ â–¢9.‰ -õþ;ëÂÀÍ}ë'umß l.b¨a‹UÒ´T¯^½d «\é–=›æ]¯¥6}pÖôܾ'ÆRë?lÀË—N¬3„‡~êÞ©…°3D[4{”ù-uy÷É9É}Föo]±Â÷ìãæïï&﬈i‚³S*$íþ7ß|#O`-­²³lZÊS`q ):äІ?s¸`ÆÄÍŸ¯#öîaÄ2 ïK»6Î7s*¢¥’M¨…c[7‹¬°0ä-X6Ã|ŒÂN©pʯl4lØP¶´«Ýurï²ëµ”1·Í®õDD÷Ã0iÌ+fŠÅpˆ½{’Áô–ˆ–:µ.¹Ü4» ‚Üù«S ¦’4-ÏgÕªU-rjïæùÂ/×”›gÙüq÷Ü]éàçÂY#£l^; ->5‹z‚ì&uˆ2"´ÔÇ—wØ1#YÏŒ±]ïº#ù;Ø)åW«šÐtäi>2ïVÍë ¿”#5(NAH!¶-1GDxð®õ DÛ 5Ö­S‹c»—+#d± ïÝ»nb¯N¾ûµ«¨;+ß¶pÎ8%‘·¤Ø)•PŽ$%ñwß}·B… V9µoy¤³‹ú¥\>s¦ !–=þÈýùK';ÆZ·j:˜Hý#9ÀS|©ŒÕRÅI俨×ÛU¬pS8]ŽN©dj)¼Û.§n®øƒM94ÇÓ3tÀË4é»™>aÚwÇèè$Æ íAb±´ZêÒ®Û§ÿ,šÖ§æ£å—4[Ì«evƒd-ã°tÿûÙIi›ø¥:ìrê¹zO^8¶s|ŽŒ@ ‘Ó—•®ýµ¤‰öm7y¶@I­–J¡oš2¸Os]c!o¢³u)­þüÇß±y§v9Uõ®Û÷mY“–¢¡Nßî­i¨Euå†×¥%óÁGò à~6­–:Y|O‡7Îx£Kµ0íüPRÕñB§¤ù¥ˆ-v9õ½›n,^1-ÒôÇøÛµ F†è0ˆ÷}Úã7‰ n~U†Œø¥.•ß>-ȧhɬg²Ës|“¬ JÛºúçx«Q}»œªûLÓóÝpÁ&é¤FõŸ"SŒ4Üo¾î2‘Íkf],+RbA²‰Þ5yD‡J?ºÎ1@…Âa¶Áv`U<»BBù•%»œª\éÖæ¹ä” VÇ6MHQaè2fH—GD]·¿Ô{'×ÌÍ·gõ ¿Ë„usèO’µÌô«¯¾ªY³¦,`"G÷`÷ð\([;zHw#Ö-êÃX=¤CQ®~zþãK;o{3˜g{þèVÍÊ-•Ä Ê¦3ûëŸýje8Ø¿¿eí<¯ž‰°ë"ðH4Üà×;W{æTDKE(¼há´ÞÕ™téøBð‡„Ôo~õ¾¿fÀ©… ¥ï`Aîol û÷i_~ îM7vëÔTõ–b}IZ*(nn\6<ëéêJb&w燡¿úä”›Ûœ’¯¥”r whÓä±µ˜ïóöÌžúúƒ÷—ßëŽqyþ’‰Ò¹¦¥¦ß–ØgOÑØ.m³Â¼ŒÃba<¶fÚ’»œ‚Ë6Òj{%ÔÑ]o£á&¿/~vëØßxH-ª¥Ë&Jõ¼þ5‰LjØ?8ìà`é*—“nÁC{Í^ÞsÊ—ìÙåìÌò@%Š‚^rÚøþb[Uv“g7æzH-ª¥ÖÀÍíù£Z5+÷vÛ]Ißùaáû/>8ô׿üÑMÕ‡BK‘œ²lvÊCû·,ÄŽnÏ$T£zåÕvKÅ Ú4ŽŠ*· BK}tqGÙÖ)‰{–LÔ«™î°ƒ¤ï\°w$¸.†OætC­¤‡)++³¬x§ºuÌvoÿöXz5qTÑpƒ¡pSÅDRÀ’86QÊ%omT÷QÝw뺅ÁÈ#÷oÁtùßÿö—¤ g  §,S1°Õ§~üÐ;VÅÃ͹Ñ™}dÿGÇìÍ…3Ý'øåÕß=Q˜Pnî^ûFÏŽ RÈe€é—oþô•K«‹–¢ì6ÌÒb¼zñìwˆçÙ±nN׎٘œ¦Ä‘f«æõÌî˜f¹–Ú2¹,1σZWºµ‚½ÑÛ2Ñ+ Ñç©=—Ô C0]«}jÿJGã7˜5uPvãg¥*÷ïÝDsL6¢¥Ã&$»mÕˆ—^xFÙXßwO•`î$v/¡(äï~óiL…ó$8Á¤sçΖ–=¶^92È hùT¸ n©øJ¿àO7}hDK/H7n—Aøw~Èäýü——ÜLí ³ —–B¶pä e© ¢O·Ï-Àîî8Ÿëf÷ïÝVÌýEDh\½‚.qh©Ÿ]ÜqlËdߟYºT«ª^Æ‘”;+Üt¸‡ˆ§!‚lp}y—²ÕF ›7otœl¢è fÃÉ ¢íÆAq·l*˜¡K…òMHðÀ†ñ=;4ÐùwgOéÆÂïŸþð¥/µÌ‰¤" ,°È)tIC^ëè 1ÁA0Q:„z`«.qh©+Ç Á͉ÃÚ§–ËíÀïÿç±ZTè´ €ý–£§`p÷ÜUJ轓ž<û6/ýzWá…ºR&ÑR¶Û<ÉÇgiNŸš”/ä²)‰wV˜{4ú_õy¬¶ÅáÀ½Õ†íuhÝèü‘_…DV/ßµ¼¿·Uƒ_Ê”#ZÊWB!µA=›ê†¼£†öÉaб‹7<ìHbN”ñ?RíÈÎ¥~ý&ô™ð àeÊ-UVà/7g׺ ¶óCÐózÞV‡QKÁ²•˧¾Õì8.ÖÇçÈÎ%oŽë7?g¨2ͨ–ÚvtóD_žõyƒëÖzP·Œ#‰wV˜…N6w¹ø.‰M¿Úe«CnŠ–Mö‘PHjcþ ðçî*“E>}a%2mtÝ·ßNWNo ØÕäòuìâu4×Ì  œˆÇBtLþ”œ0²×ªEã”ÉFµT¾_Ü\1§_Ts€¼¿þÏ žW.†TK‘ÆŽkW=|ߎâY‘ûŒÿD´ÔùmG7MˆóÙ²bhûá½³B×` (ãy½´iÖÑj×®]ÛΩÞ][ž?¼:Bá-7¡Âü)ݾÿåȤ}ëçCuØÌ/ì×ãy½´!”_ÁD¼åR52ì:O?vdÇâ`ˆÕR«ãçæú¥ƒŸ«£½æ2„;?ˆž˜{‰ót·Pk)XêÙ³g«W·žBÕk½ÚÐúGµÔÖ£›Æ{~J Fôx©žnçB8—qmaå/3÷«­ U:¹¹¹ö%‰pPåÍ@«ÕRÞ …¸+f÷­Uó^¥ŠÂ,yhý»™`LBÅ…Peç˜Tªd]D Õ¨Á] fTK­Š‡›f—A8w~Pg‡ <<»£„ …]K!£ÐìJ.œ?¢ç•k÷\ýô܇ç·Ù8ÎÛ3 G“Š"7ÛX>¸“8úHé zªfõ’üi‰#RFY¼± ±6/Ò¬ÁãJUóñêëó縜b >L|·á´L‹[”*,C|kÆ„Zêò±UÞ¸¹¯xt—²Rkç5ð{[e7¿ÐR”i¥ƒ ­*îÜ^:gĕㅉx®~rîÃs[Ž”Œõ™ð:;(ß•*7ý8ì ÌË8¢“zŸòÐ9-›i{¡”*˜k«ì¬ÃÛ&‚PH3¢¥b'ÔÎüaí›×ÒùwÃ<äýïOð¤^†ʯb*T &†:kßž˜ bF´ÔÑ•¸9 GcË ´;?hRÏÃf=C§Œ–*ûôÍ+o+ʹ|¼Àß糨–:\2Öý3oR—ûî¾M9tíÎRè¸rˆ×˜ûÕ¦J:pPÙÏÈ…õbýÕ^­ÏZá/¡qÏ&„Ü[4ªoç†7ÝxƒS·ÞòÃi_ÞÉäòh¬y¹aª!lù„ƒªÿþÊ~¤Y£gm_à;1¡¥.]7§Žlw[ º üšÔ³ØL*i)Ê:Ö϶iÓFid ³žX¹`Ì岿ž¨–Ú|xÃnžå¹½kÕÐ.ãÛr€‹Àþòç?„­5áü†ÀŽ;ì§€bX«Ñ«K‹CÛøE(¤ÑRî…`£û·Ð yq'q8;³0KÓAÕ5¿(…Àñ@Ê¡¸ùbvÝ «¦úḦ–:²Â%7çM|ù¡j•Snç&^°4*Aë€SOK°ÁÛ~ ?UícßûÖôÁ—Ëòã ¥~znó¡ cÌOñ¢×>[~x¿Å¼pMc˜—q$ΰR¨Á⬒ÓS~ö;gÈG…†{wÉìø …ð.GB!ÀÔm«T¾ÙÞXc–<´‡Ù’ŠÂn ž%gNùˆ€n¨y4ê>𡳃–ºxd¹#7—åöªUãžTÜùƒHâ_`ž&s|öbàtûƪf,Ö›2¦÷™Ë.[íù‰h©³›­­{6æ l—ýdjÝY!v.$Hžû؈pR#€™û=N¢Ýl˜õãÂ¥ã=³‰"F´”žPø×܉k¾üõ‡Áï£J-%h†Y?Ý:*j©á1°Ó–Âé®r|¢Zªä`ññLÖê¶[¾¯[ÆÂ;+pí×~•ppCì /¾ø~_ÝP˜VS5}®VÎÄW•.r$D´”D¨m+uzñiÝa çŒ xªÎñu<,ñfHË_à>(,,4¸h´3vX7ˆ*7ÄŒh©Cy27 .ƒpîüH®‡8Ý´Ù+V¦ggg+‡¹âËÛ+ÝܲYœ ýŽí\xñÈJåCZê@ñ²_SCÞðøw1Òž¼àç ÒÃZ¸!€5ޏÄq´Cž~=Z‚˜6Ï•‰ÑRóæŒëðøCw†çÇg??ƒc¥Cµj%µ”°cœÒ•† fÙt°\ýÉôìœ=cü+›‹óZ·¨¯4¬ì\À†Ëì‚ ¬Í⸩0™®;æÍÎ ‹Ô­Ù¯{ËeóF â½wݪäT;À0wÅãt(vA±©§".G;DÀ›+~ˆ9wjÿMëV5¨£¾ )$;?@L8 Âà‚RFFh)Qr¸C1ªv)ªtS„wV¾-YwV`òNØŸ®™Š-]šå«©°çÃq>Ý<ÛŽÿâNâdv€É;8Ÿ žàÐMú4Aš™'YÐh»q]Èfn&qçǵQͧØ$›ŽáÌÒR²áÅúXûÜYÀ2LxàpB# pù"nè“Õ0ñ{Ý €KİaÛÍ”ºÜ|ã0Û­ë&zåq „ƒ¡-qÊM¹8 #Ò`Zk]×TYD\ìü ÁDóéDÌÀ2ð±f3TKÉR€£ú Û¿¡î±› bßGè9)F -€³ ;Œ0&6ï¨ÅA½´D€ Å„ô_˜™Árݽ4$§0oGCóò,±–º®‚°\í;d\V´Ž J ÝCÈ+’³Ç„³gÏBZÉÃ0 ß„3·œ+F CÀä ¤:;H+Z÷B.œ_•!ø[LÖRþâÉ©1Œ#À0Œ@f!ÀZ*³ê›KË0Œ#À0þ"ÀZÊ_<95F€`F€È,XKeV}siF€`FÀ_XKù‹'§Æ0Œ#À0™…k©Ìªo.-#À0Œ#Àø‹k)ñäÔF€`F ³`-•YõÍ¥eF€``-å/žœ#À0Œ#Àd¬¥2«¾¹´Œ#À0Œ#à/¬¥üÅ“ScF€`ÌB€µTfÕ7—–`F€`üE€µ”¿xrjøxšÐ \IDATŒ#À0Œ#Y°–ʬúæÒ2Œ#À0Œ€¿°–òON`F€`2 ÖR™Uß\ZF€`F€ðÖRþâÉ©1Œ#À0Œ@f!ÀZ*³ê›KË0Œ#À0þ"ÀZÊ_<95F€`F€È,XKeV}‡¡´Ÿþù¨Q£²²²î—>ø_~òÉ'aÈaØòжm[àƒŸî3Ö·o_D±ð}εOYY™c‚ôjÄ’C.]º”R޵¾”©9æA”%Ö×9¦ÌF€ðÖR¾Àȉ¸Eý"Ô¿è?èn¿þúk·ÉeF8B ?ÝBDzøÒD@ÝêR¦W#59Ä¥péÒ%÷YBHejŽ)ˆ²Äú:Ç”9#À0¾ ÀZÊ9WÈ<ºUÙk" ,ünèÝ]½)½%NK‘$Bú:™ÂZ*½L‰KÃ0 A€µTB`åDí` Oôܘ$²À—BQÅ4Ÿ•öhÇ£¥;t’ý´²ì RÊ)å¬û¥ÒÞ一Œ#¬¥b‚‹{G@è$Ã2tçn‚yÏDjÆŒGKA÷ º€[&ò ±XK¥¦q®F Q°–J²œ®ŒD¹@;l,ß¡–õΙŒgâ´P•õ«Yx‰*`-•ÉÖÈeg;¬¥Ø*‚@À½–‚§„´”yš b–Šv¤¹Ùæ¹Ø;V\\L/Â/îr!Wˆ‚LꢠbK‚V'TK¡\.o·k)*¬c]XV_[ªDü4ìÑs³örDF œ°– g½¤[®„–rÓ[#°¡gEcmߤ†d±0È‚Zvqê‚Pq:ƒEô ÏW‰Å^øR)ÐÕÑëð.á]£•Ýòú0ÄE ÊÍŒøRéJ´–B†E~,<•È¢ke-…ê°”EY„¿¬¥ìØ¢"”ZÁ¬¥TMƒQîEEÑÌžT2ËæJ‹mÈ/%äI¨Éñ;an¯9º0~»'Ø=ƒ(A7† Â*­ZgÒéÖÀqy2ÖRoA úó&|sv,…zÑ?Ù» Ñaëôè”n0ô7òºlz‘x~±;HaPïhé2ÅÛåõI"MKk…?ÝוÐ.§ítáéÕº3äýŽu!k)ñ: °x·Ó ¥TMfå-Tµ=óº)lËV VJFÈÓIl²9Ñ+MB¡Åbei)³aƒD25ì°ð|½{ærÈE€µTŠV\êe[83¨]†Ê‰iÊ –{n¹Ç•=–ÎLôµºÖ\¤)'XZZ*z/d[x¡ð‹èŠP‹wJž)£9J|CçLŠÚÒ JôF†”;N»5Ī¥Dæ-.(³–"”€¡€Љ2Úgi-Â)ç2°HÐ"|uZ*qÕ¤c—°Ëx@–ÈvKù·8ÞdÿA@_u„ÈP…µØ¥'ež^j±R ZŠRS¶ÎØä¹º|¦^CÆ9fT°–b»yL,îÝè*±ŽJé’{Ë@Ü,D”ÿ]¾²#~ÝÌЦ;ôJ­v‹f‰¤–²ˆQG-e÷{Ñì•Ô¢Šdï…ýDVÑÓ[€Õi©U“†Š¾‹ûPˆTG—•+D´c%ü©Êd•ÞVÏ ’GAvÃïRZµŽ,Á5:ü&F XK3¿äð%ØW; ]…)UˆA* hEnéÌ”ž'Š%z¹®,Ãâwѧʮ)ÇÜ´ÎÝj0‘BLrPi\žýR1i)>йÍêQ«ÔR‰«&oZ ±ÈudÑß:Y)Þâ+¥ç‰’UÚ¼Éè¦}u 2¶X ©!еE>®šçÖ”!¬¥BX)éŸ%ˆ q%Ÿei­Î±¯Frã›®,Vt+¢d}&7ôŽK¬ä¾JV~¢Ë±Ï׸¬Ñ”ÓR:á+«"¹ìŽ•(D€œ²RK%¥šä)Z7ujö‰ ÎQËÀ@~©nE”gðQÉ ³aËnHƒ=¸‹Ã0©‹k©Ô­»4É9t zPrØ]e™È}}¯ûè‘èFðÊ ,ѱÁ…¦{‘èÆä±¸èrb]‚Ò TñKvõ+1W.Û±ÒS¨ÔRÁWòiYóGnTÞSy†Ë`·¬ ZJ§™”ÆÃ Gö ïfÊ>M/.#p ÖRl aAÀ²Yž?óv'–ò‹]šƒÈ3k)DºÝõJ%Wr÷€RK%¨š Ô‚Q¡ÆQï:M ”“ðÁoym`¦.µ”€šŽ¥XÊ95Ï 2k)6rŽ0JÒOdzR¯9ã36XK±Q€|¨·®Í¥|Èݰìr“tº"$+›r¹«|èŽáÌL{hHy¨¦¹ËQÎ^YRùRKÎ[T9ǧë³K·‹^7“H8ˆ´(¥–JP5Èàx†¾²ŠE‘Å!ï–WÈGhÊÿr©¥E Ìî<3ÈlØŽ'°ë¼­A´;üF (XK…tf¿G>„„Ο~Eç#‘)£‹6]·ÐUäA¼B·ÃHô棜-]¾K-…XJ5)φ£¥ä;L Œ”¨šýRˆe?R’BçÀ*WÏ,°+µ”Ðyºsä…ØŠ©šÌ4åRNn*ý©Â*W+¦UÿÊìÉS´´OÌ3ƒÌ†-’Õ­ˆr¤[f7\ú4A€µTšTdø‹!Z|qÊ9ˆLË®JÁ!/IA\¡„äûøѰ[4ët"¨4y/!”™˜Ó‘oͳ‹Çe%âíøEv¹ ©“ŽScö‚ˆw!.-ü—?øR¼Ëà¢sôKQ\q tÞ5‘šÐgÂU#kh{Õë´T‚ªÉ@%ù>;”TT¢å:EK r]ȱd-k·F÷~)YVê”%eɃb2lY‘ËÕÊ[ùÂßDsãA€µT<èqÜØ/¾57`‘ò;,§ûX4ÁãE‰ÈzÎ|F3BÊjÃ.>ìSŽ]ŽÜ÷S‚r²(5ú¥lŠGK¹9ÖA7ýdÖRÈ•ìû±@¤téQAdÝl¯A»óF§¥¨B}¯&³MËrÜRƒä2;Ÿ(Œ¥ÔHÓ>ˆIKɼ0ŸçäAކ-{uŒ­¥àÐŒ@ª!ÀZ*Õj,õóK® ¹ ž*t*Ž‹Óéˆ&Ktü‰¯›-]¢'s Œ>ɾµÑIôØëA”˰»M© •ƒ4ŤÍÒ%‹<»¯|ʹს[uD›R°ßâLß#?ö³²NœQ,*¬å4|o”³Ÿ¢,J`QMfœeß›\‰´ú[WK·þO‰¼.qRádœŽF+ƒÜ6*Î~<é*Ë„µcö8#а–JÅZK‡<£×A׈>M-í‰s7r±)ºØ¸—PDð"h™ÔåJl}²ìLh)š8A„ÚŒékQ‰õé>Û¾W“ùÕT‰±Z ¨zûÆ=÷%õ%d‚DÇhÔI/ /(q"Œ€KXK¹Šƒ1Œ#À0Œ# @€µ›#À0Œ#À0Þ`-å;ŽÉ0Œ#À0Œk)¶F€`F€`¼#ÀZÊ;v“`F€`ÖRlŒ#À0Œ#ÀxG€µ”wì8&#À0Œ#À0¬¥ØF€`F€ðŽk)ïØqLF€`F€`XK± 0Œ#À0Œ#àÿ>Ùa(×6DIEND®B`‚dibbler-1.0.1/doc/dibbler-user-faq.tex0000644000175000017500000002537012304040124014445 00000000000000%% %% $Id: dibbler-user-faq.tex,v 1.11 2007-09-06 23:10:40 thomson Exp $ %% \newpage \section{Frequently Asked Questions} Soon after initial Dibbler version was released, feedback from user regarding various things started to appear. Some of the questions were common enough to get into this section. \subsection{Common Questions} %% Q1 \Q Why client does not configure routing after assigning addresses, so I cannot e.g. ping other hosts? \A It's a common misunderstanding. DHCPv4 provides many configuration parameters to host, with default router address being one of them. Things are done differently in IPv6. Routing configuration is supposed to be conveyed using Router Advertisements (RA) messages, announced periodically by routers. Hosts are supposed to listen to those messages and configure their routing appropriately. Note that this mechanism is completely separate from DHCPv6. It may sound a bit strange, but that's the way it was meant to work. Properly implemented clients are supposed to configure leased address with /128 prefix and learn the actual prefix from RA. As this is incovenient, many clients (with dibbler included) bend the rules and configure received addresses with /64 prefix. Please note that this value is arbitrary chosen and may be improper in many scenarios. \Note This behaviour has changed in the 0.5.0 release. Previous releases configured received address with /128 prefix. To restore old, more RFC conformant behavior, see \emph{strict-rfc-no-routing} directive in the Section \ref{client-cfg-file}. \Note The original pre-0.5.0 behaviour is correct. This was reverted in 1.0.0RC2 release. The \emph{strict-rfc-no-routing} now takes one boolean parameter. Setting it to 1 (which is the default value) makes dibbler to configure addresses with /128 prefix, as expected. Please see \href{http://klub.com.pl/bugzilla3/show_bug.cgi?id=222}{discussion in bug 222} for more details. Setting it to 0 reverts to the behavior that Dibbler was offering between 0.5.0 and 1.0.0RC1, i.e. configuring an address with /64 prefix. Please note that it was chosen (guessed) arbitrarily and in some cases may be completely wrong. Use with caution! There was a proposed solution in a form of \cite{draft-route-option} draft. See section \ref{feature-routing}. Unfortunately, MIF working group in IETF decided to abandon this work. %% Q2 \Q I would like to have the ability to reserve specific addresses for clients with given MAC address. That's a basic and very common feature in DHCPv4 server. Why it is not supported in Dibbler? Are there plans to implement such feature? \A No. It is not and will not be supported. For couple of reason. The first and most important is that DHCPv6 identifies clients based on DUIDs, rathar than MAC addresses. That is a protocol design choice. Of course that does not prevent many users from saying ``I don't care, I want MAC classification anyway!''. So here are more technical reasons why MAC classification is a bad idea. The first technical reason is that Dibbler couldn't be extended, because MAC address is often not available. There are 3 possible ways a server could possibly learn client's MAC address: \begin{enumerate} \item from Ethernet frame. That won't work if traffic goes through relay \item from DUID-LL or DUID-LLT. RFC3315 forbids looking into the DUID. Besides of being a wrong thing to do, that also won't work, because client with a given MAC address can use different DUID type, e.g. DUID-EN or DUID-UUID (or others, I saw on the wire some device with DUID type 14. Strange, uncommon, but valid). \item using source address and extracting MAC from link-local address thaty is based on EUI-64 that contains MAC address. That should be available for direct traffic (simply src address of the UDP packet) or relayed (peer addr field in RELAY-FORW message). This would usually work, but there are cases when it won't. First, if client uses privacy extensions (RFC4941). The other one if client and server support unicast, some traffic will be sent from client global address, not using link-local address at all. \end{enumerate} So instead of doing MAC based reservations, Dibbler supports link-layer address based reservations. In most cases it will be equivalent to MAC reservations. The only case where it won't work will be with unicast, but that can be solved easily (don't use link-layer reservations and unicast together). Despite this shortcoming, link-layer was implemented after Dibbler 0.8.2 was released. See \ref{feature-exceptions} and \ref{example-server-exceptions} sections. %% Q3 \Q Dibbler server receives SOLICIT message, prints information about ADVERTISE/REPLY transmission, but nothing is actually transmitted. Is this a bug? \A Are you sure that your client is behaving properly and responds to Neighbor Discovery (ND) requests? Before any IPv6 packet (that includes DHCPv6 message) is transmitted, recipient reachabity is checked (using Neighbor Discovery protocol \cite{rfc4861}). Server sends Neighbor Solicititation message and waits for client's Neighbor Advertisement. If that is not transmitted, even after 3 retries, server gives up and doesn't transmit IPv6 packet (DHCPv6 reply, that is) at all. Being not able to respond to the Neighbor Discovery packets may indicate invalid client behavior. %% Q4 \Q Dibbler sends some options which have values not recognized by the Ethereal/Wireshark or by other implementations. What's wrong? \A DHCPv6 is a relatively new protocol and additional options are in a specification phase. It means that until standarisation process is over, they do not have any officially assigned numbers. Once standarization process is over (and RFC document is released), this option gets an official number. There's pretty good chance that different implementors may choose diffrent values for those not-yet officialy accepted options. To change those values in Dibbler, you have to modify file misc/DHCPConst.h and recompile server or client. See Developer's Guide, section \emph{Option Values} for details. %% Q5 \Q I can't get (insert your trouble causing feature here) to work. What's wrong? \A Go to the project \href{http://klub.com.pl/dhcpv6/}{homepage} and browse \href{http://klub.com.pl/lists/dibbler/}{list archives}. If your problem was not reported before, please don't hesitate to write to the \href{http://klub.com.pl/cgi-bin/mailman/listinfo/dibbler}{mailing list}. Author prefers to not be contacted directly, but rather over mailing list. The only exception are security reports and confidential disucssions. In such case, please \href{mailto:thomson(at)klub.com.pl}{contact author} directly. %% Q6 \Q Why is feature X not implemented? I need it! \Q The short answer is : We do accept patches. The longer one is more complicated. Dibbler is a hobby project with the only developer having very limited time to dedicate. There are many requests, bugs and missing features and I have to prioritize them. My personal judgement about importance, difficulty, amount of work required and and other factors of specific feature decides on priority, compared to other features. Personal preference plays a role here as well. If you don't want to wait, get your hands dirty and implement it yourself! It is not as difficult as it sounds. Dibbler code is reasonably well documented, so understanding how it works is not that difficult. See Dibbler Developer's Guide for introduction, code overview, architecture etc. You can always as on dibbler-devel mailing list. Finally, if you are disappointed with the pace of progress (or even lack of thereof), there are couple of things you can do. First and foremost, consider alternatives. There is ISC DHCP implementation that supports DHCPv6 \href{http://www.isc.org/software/dhcp}{http://www.isc.org}. It is open source as well, but ISC provides paid support for it, if you need one. ISC also does custom development contracts, should you need it. ISC is a nice non-profit company, so your money will be used for a good cause. \subsection{Linux specific questions} %% Q1 \Q I can't run client and server on the same host. What's wrong? \A First of all, running client and server on the same host is just plain meaningless, except testing purposes only. There is a problem with sockets binding. To work around this problem, consult Developer's Guide, Tip section how to compile Dibbler with certain options. %% Q2 \Q After enabling unicast communication, my client fails to send REQUEST messages. What's wrong? \A This is a problem with certain kernels. My limited test capabilites allowed me to conclude that there's problem with 2.4.20 kernel. Everything works fine with 2.6.0 with USAGI patches. Patched kernels with enhanced IPv6 support can be downloaded from \url{http://www.linux-ipv6.org/}. Please let me know if your kernel works or not. \subsection{Windows specific questions} \Q Dibbler doesn't receive anything on Windows 7 or Windows 8. Is it broken? \A Make sure your firewall allows the traffic through. Dibbler server must be able to receive traffic on UDP port 547. Dibbler client must be able to receive traffic on UDP port 546. If DNS Update mechanism is used, Dibbler must be able to send traffic to TCP and/or UDP port 53 (DNS). There are many ways in which Windows firewall can be configured to allow such traffic. For example, in Windows 8, one can use the following commands (assuming DNS server is located at 2001:db8:1::1"): \begin{lstlisting} netsh -c advfirewall > firewall > add rule name="dhcpv6in" dir=in action=allow localport=547 protocol=udp > add rule name="dhcpv6out" dir=out action=allow localport=547 protocol=udp > add rule name="ddnsout" dir=out action=allow remoteip="2001:db8:1::1" \end{lstlisting} %% Q1 \Q After installing \emph{Advanced Networking Pack} or \emph{Windows XP ServicePack2} my DHCPv6 (or other IPv6 application) stopped working. Is Dibbler compatible with Windows XP SP2? \A Both products (Advanced Networking Pack as well as Service Pack 2 for Windows XP) provide IPv6 firewall. It is configured by default to reject all incoming IPv6 traffic. You have to disable this firewall. To disable firewall on the ``Local Area Connection'' interface, issue following command in a console: \begin{lstlisting} netsh firewall set adapter "Local Area Connection" filter=disable \end{lstlisting} %% Q2 \Q Server or client refuses to create DUID. What's wrong? \A Make sure that you have at least one up and running interface with at least 6 bytes long MAC address. Simple ethernet or WIFI card matches those requirements. Note that network cable must be plugged (or in case of wifi card -- associated with access point), otherwise interface is marked as down. %% Q3 \Q Is Microsoft Windows 8 supported? \A Unfortunately, Windows 8 is not supported yet. I do not have time to run tests on Windows8, but if it provides the same API as previous versions do, there's pretty good chance that Dibbler will work on Windows 8. dibbler-1.0.1/doc/version.tex.in0000644000175000017500000000005112277722750013425 00000000000000\newcommand{\version}{@PACKAGE_VERSION@} dibbler-1.0.1/doc/dibbler-user-features.tex0000664000175000017500000026330012560471634015535 00000000000000\newpage \section{Features HOWTO} This section contains information about setting up various Dibbler features. Since this section was added recently, it is not yet comprehensive. That is expected to change. \subsection{Prefix delegation} \label{feature-prefix} Prefix delegation is a mechanism that allows two routers to delegate (``assign'') prefixes in similar way as server can delegate (``lease'') addresses to hosts. As specified in \cite{rfc3633}: \emph{ The prefix delegation mechanism is intended for simple delegation of prefixes from a delegating router to requesting routers. It is appropriate for situations in which the delegating router does not have knowledge about the topology of the networks to which the requesting router is attached, and the delegating router does not require other information aside from the identity of the requesting router to choose a prefix for delegation. For example, these options would be used by a service provider to assign a prefix to a Customer Premise Equipment (CPE) device acting as a router between the subscriber's internal network and the service provider's core network.} To configure server to provide prefixes, a PD pool and a client prefixes' length must be defined. An example section below assigns 2001:db8::/32 pool to be managed by this server. From this pool, server will assign /48 prefixes to the clients. For example, client can receive prefix 2001:db8:7c34::/48. \begin{lstlisting} pd-class { pd-pool 2001:db8::/32 pd-length 48 } \end{lstlisting} As a general rule, server will provide random prefix to a client, unless client provided a hint. The full prefix assignment algorithm is as follows: \begin{enumerate} \item client didn't provide any hints: one prefix from each pool will be granted \item client has provided hint and that is valid (supported and unused): requested prefix will be granted \item client has provided hint, which belongs to supported pool, but this prefix is used: other prefix from that pool will be asigned \item client has provided hint, but it is invalid (not beloninging to a supported pool, multicast or link-local): see point 1 \end{enumerate} Dibbler implementation supports prefix delegation, as specified in \cite{rfc3633}. Up to and including 0.7.3 version, client was also capable to do non-standard tricks with delegated prefix if it was a host, rather than router. This mode of operation was removed in 0.8.0RC1. Now client behaves the same way, regardless if it is a host or a router. When client receives prefix on one interface (e.g. prefix 2000:1234:7c34::/48 received on eth0) it will generate subprefixes for all other interfaces, which are up, running, non-loopback and multicast capable. In the example depicted on Fig. \ref{fig-prefixes-router}, received prefix was split into 3 prefixes: 2000:1234:7c34:1000::/56 for eth1, 2000:1234:7c34:2000::/56 for eth2 and 2000:1234:7c34:3000::/56 for eth3. Client support for prefix delectation was improved in 0.8.2. Client is now able to handle prefixes of arbitrary lengths (do not have to be divisible by 8 anymore). The only restriction is that prefix must be shorter or equal 120 bits. It is also possible to explicitly specify which interfaces are downlink (i.e. sub-prefixes should be assigned to). \emph{downlink-prefix-ifaces} command may be used to disable interface autoselection and just list downlink interfaces. \begin{figure}[ht] \begin{center} \label{fig-prefixes-router} \includegraphics[width=0.65\textwidth]{dibbler-prefixes-router} \caption{\emph{Prefix delegation (router behaviour)}} \end{center} \end{figure} It is also possible to define multiple prefix pools. See section \ref{example-server-prefix} for simple prefix delegation configuration for server or section \ref{example-server-prefixes} for multiple prefixes configuration. Also section \ref{example-client-prefix} provides information related to client configuration. \subsection{Relays} \label{feature-relays} In small networks, all nodes (server, hosts and routers) are connected to the same network segment -- usually Ethernet segment or a single access point or hotspot. This is very convenient as all clients can reach server directly. However, larger networks usually are connected via routers, so direct communication is not always possible. On the other hand it is useful to have one server, which supports multiple links -- some connected directly and some remotely. \begin{figure}[ht] \begin{center} \includegraphics[width=0.65\textwidth]{dibbler-relay} \caption{\emph{Relay deployment}} \end{center} \end{figure} Very nice feature of the relays is that they appear as actual servers from the client's point of view. Therefore no special arrangement or configuration on the client side is required. On the other hand, from the administrator point of view, it is much easier to manage one DHCPv6 server and deploy several relays than manage several servers on remote links. It is important to understand that relays not simply forward DHCPv6 messages. Each message forwarded from client to the server is encapsulated. Also each message forwarded from server to a client is decapsulated. Therefore additional server configuration is required to deal with encapsulated (i.e. relayed) traffic. There are 2 ways in which server can select apropriate set of addresses, prefixes and other configuration options. The first one is based on addresses. Relay that forwards packets from client-facing interface (e.g. eth0) must set link-addr field in RELAY-FORW message to an address that identifies that link. Please note that this is NOT a link-local address, it is typically a global address that identifies a link. Server can select appropriate set of parameters if the ``subnet'' clause is defined. This recent addition was added after 0.8.3 release and will be included in 0.8.4. The second way to refer to a specific link (i.e. eth0 on the relay may be different link than eth0 on the server), each link is referred to using its unique interface-id. It is essential to use the same indentifier in the relay configuration as well as in the server, so both will refer to the same link using the same number. See section \ref{example-server-relay1} for example how to configure server and section \ref{example-relay-1} for corresponding relay configuration. It is essential to understand that the ``iface relayX'' in the configuration represents a link accessible via a relay, not the relay itself. These are not the same. One obvious example is a relay thay has 2 customer facing interfaces and one for relaying data to the server. This requires two separate ``iface relayX'' defintions in the server.conf file. \begin{figure}[ht] \begin{center} \includegraphics[width=0.4\textwidth]{dibbler-cascade-relays} \caption{\emph{Cascade relays}} \label{fig-cascade-relays} \end{center} \end{figure} In larger networks it is sometimes useful to connect multiple relays. Assuming there are 2 relays connecting server and client. Such scenario is depicted on figure \ref{fig-cascade-relays}. Requests from client are received by relay2, which encapsulates and sends them to relay1. Relay1 further encapsulates those messages and sends them to the server. Since server receives double encapsulated messages, it must be properly configured to support such traffic. See section \ref{example-server-relay2} for details about server configuration and section \ref{example-relay-cascade} for example relays configuration. \subsection{Address and prefix assignment policy} Address and prefix assignment routines has been rewritten after 0.8.1 was released. It currently follows this algorithm: \begin{enumerate} \item Client classification is performed (a class is assigned to a client) \item Client access control is performed (hosts listed on black-list are rejected, if any; if there is white-list defined, host must be on that list, otherwise it is rejected) \item If existing lease this client/ia exists, it is assigned again (e.g. after host reboot) \item Fixed lease is searched (using per-client configuration or so called exception mechanism). If found, this fixed lease is assigned. \item max-client-leases is checked. If client already has maximum number of leases, further leases are declined. \item Server checks if there is cached (i.e. previously assinged, but later released or expired) lease for this client. It is assigned, if possible. \item Server checks if client sent any hints in SOLICIT or REQUEST message. Server tries to assign requested address or prefix. If this lease cannot be assinged for any reason, server tries to assign similar lease (i.e. from the same pool if client's hint was within supporte pool). \item Otherwise, if all of above steps fails, server assigns a random address or prefix from supported pools. \end{enumerate} This algorithm is supported for non-temporary addresses and prefixes. It is not supported for temporary addresses. \subsection{Routing configuration} \label{feature-routing} \textbf{Warning:} Due to objections in IETF by a small, but vocal group of opponents, further standardization process of \cite{draft-route-option} draft in IETF was abandoned. It will not be published as RFC document. Consider this feature a private extension. Until recently, DHCPv6 protocol did not define a way to provision routing configuration information to clients. The only way to deliver this information to hosts was to use Router Advertisment mechanism in Neighbor Discovery protocol \cite{rfc4862}. While that approach works, it brings a number of drawbacks. In particular: \begin{enumerate} \item RA sent by router affects all hosts in a network. There is no way to differentiate this information on a per host basis. There is no way to define additional routing information for specified class of hosts (e.g. one department in a corporate network). \item RA and DHCPv6 configuration has to be consistent. That is very doable, but somewhat problematic, because network configuration has to be specified in several places. Moreover, it does not scale too well. There are routers located in every segment of a network, while there may be just a single DHCPv6 server deployed that serves many links. \item Administrators experienced with IPv4 that are migrating their networks to IPv6 ask this question very frequently: ``How do I configure routing?''. Until recently the proper answer to that question was ``you don't''. \item In mobile environment, mobile nodes had to wait for RA and then start DHCPv6 exchange. Although hosts can request RA by sending Router Solicitation (RS), that may sometimes not work, as routers have upper limits of how many RA they are allowed to sent. \end{enumerate} To solve aforementioned problems, a DHCPv6-based solution was proposed \cite{draft-route-option}. It allows provisioning of IPv6 routing information. In particular, it allows configuration of a default route, any reasonable number of specific routes and routes available on link. This feature was introduced in Dibbler 0.8.1RC1. Both server and client support it. Dibbler sources come with examples config files. See \verb+doc/example/server-route.conf+ and \verb+doc/example/client-route.conf+ for details. \Note This specification is not approved yet. It will change in the future. In particular, IANA have not assigned specific option values yet. Dibbler currently uses 242 for NEXT\_HOP and 243 for RTPREFIX options. Those values will change. \Note Current implementation is a prototype. It does support only one route per router, only one router and only a single route on-link. Although server is able to parse config that defines more than one, it will provision only the first route or router information to a client. That is implementation limitation that will be removed in future releases. That is not a spec limitation. To configure routing on a server side, following config may be used \begin{lstlisting} # Example server configuration file: server-route.conf iface "eth0" { # assign addresses from this pool class { pool 2000::/64 } # router with a single route with infinite lifetime next-hop 2001:db8:1::face:b00c { # replace this with ::/0 to configure default route route 2001:db8:1::/64 } # a single next-hop without any routes defined (i.e. default router) # This simplified mode is recommended only in bandwidth restricted # networks. Please use full mode instead # next-hop 2001:db8:1::cafe # router with 3 routes defined in different ways next-hop 2001:db8:1::dead:beef { # route may have defined a lifetime route 2001:db8:2::/64 lifetime 7200 # lifetime may be infinite # route 2001:db8:3::/64 lifetime infinite } # prefixes available on link directly, not via router route 2001:db8:5::/64 lifetime 3600 } \end{lstlisting} Support on client's side is enabled in a very simple way: \begin{lstlisting} # Example client configuration file: client-route.conf # Uncomment following line to skip confirm sending (after crash or power outage) skip-confirm # 7 = omit debug messages log-level 8 # Uncomment this line to run script every time response is received script "/var/lib/dibbler/client-notify.sh" iface "eth0" { ia option dns-server option domain routing 1 } \end{lstlisting} Two features should be enabled to reasonably use this feature. \verb+routing 1+ instructs client that is should request routing information (NEXT\_HOP and RTPREFIX options). Once such information is sent by the server, client will execute a notify script. Client will run defined script and pass necessary information to it. In particular, it will set OPTION\_NEXT\_HOP, OPTION\_NEXT\_HOP\_RTPREFIX and OPTION\_RTPREFIX variables with contents of received option. Please see scripts/notify-scripts/client-notify.sh for example on how to use that information to configure routing. User is also recommended to read Section \ref{feature-script} about details of running a script and passed variables. \subsection{Custom options} \label{feature-custom-options} Dibbler is the DHCPv6 with support for a very large number of options. However, there are always some new options that are not yet supported. Another case is that vendors sometimes want to develop and validate their private options before formal standarisation process takes place. Starting with 0.8.0RC1, both client and server are able to handle custom options. Even though author tries to implement support for as many options as possible, there are always cases, when that is not enough. Some users may also test out new ideas, before thet get standardized. Currently only several option layouts are supported, but that list is going to be expanded. Server is able to support following extra formats: generic (defined by hex string), IPv6 address, IPv6 address list and string (domain). To define those options, use the following format: \begin{lstlisting} #server.conf iface "eth0" { class { pool 2001:db8:1::/64 } option 145 duid 01:02:a3:b4:c5:dd:ea option 146 address 2001:db8:1::dead:beef option 147 address-list 2001:db8:1::aaaa,2001:db8:1::bbbb option 148 string "secretlair.example.org" } \end{lstlisting} Similar list can be configured for client. However, client can ask for such custom options for testing purposes only, as mechanism for handling those options once received is not yet implemented, as of 0.8.0RC1. Consider it experimental for the time being. Client can request for an option using \opt{ORO} option or even send the option in its messages. Note that in 0.8.2 formatting of DUID-style options has changed. ``hex'' keyword is now required. \begin{lstlisting} #client.conf iface "eth0" { ia # This will send specified option value option 145 hex 01:02:a3:b4:c5:dd:ea option 146 address 2001:db8:1::dead:beef option 147 address-list 2001:db8:1::aaaa,2001:db8:1::bbbb option 148 string "secretlair.example.org" # This will request specific options and interpret responses option 149 hex option 150 address option 151 address-list option 152 string \end{lstlisting} A word of warning: There are no safety checks regarding option codes, so it is possible to transmit already defined options using this feature. Use with caution! \subsection{DNS Update} \label{feature-dns-update} During normal operation, DHCPv6 client receives one or more IPv6 address(es) from DHCPv6 server. If configured to do so, it can also receive information about DNS server addresses. As an additional service, DNS Update (RFC2136, \cite{rfc2136}) can be performed. This feature known as Dynamic DNS, or DNS Update, keeps the DNS entries synced up with DHCP. When client boots, it gets its fully qualified domain name and this name can be used to reach this particular client by other nodes. Details of this mechanism is described in \cite{rfc2136} and \cite{rfc4704}. \Note In this section, we will assume that hostnames will be used from the example.com domain and that addresses will be provided from the 2000::/64 pool. \begin{figure}[ht] \begin{center} \includegraphics[width=0.65\textwidth]{dibbler-fqdn-srv-update} \caption{\emph{DNS Update (performed by server)}} \end{center} \end{figure} There are two types of the DNS Updates. First is a so called forward resolving. It allows to change a node's name into its address, e.g. malcolm.example.com can be translated into 2000::123. Other kind of record, which can be updated is a so called reverse resolving. It allows to obtain full name of a node with know address, e.g. 2000::124 can be translated into zoe.example.com. To configure this feature, following steps must be performed: \begin{enumerate} \item Configure DNS server. DNS server supporting IPv6 and dynamic updates must be configured. One example of such server is an excellent \href{http://www.isc.org/software/bind}{ISC BIND} software. Version used during writing of this documentation was BIND 9.7.2. It is necessary to allow listening on the IPv6 sockets and define that specific domain can be updated. See example below. \item Configure Dibbler server to provide DNS server informations for clients. DNS Updates will be sent to the first DNS server on the list of available servers. \item Configure Dibbler server to work in stateful mode, i.e. that it can provide addresses for the clients. This is a default mode, so unless configuration was altered, this step is already done. Make sure that there is no ,,stateless'' keyword in the \verb+server.conf+ file. \item Define list of the available names in the server configuration file. Make sure to use fully qualified domain names (e.g. malcolm.example.com), not the hostnames only. \item Configure dibbler client to request for DNS Update. Use ,,option fqdn'' to achieve this. \item Server can be configured to execute \begin{itemize} \item both (AAAA and PTR) updates by itself \item execute PTR only by itself and let client execute AAAA update \item don't perform any updates and let client perform AAAA update. \end{itemize} \end{enumerate} Note that only server is allowed to perform PTR updates. After configuration, client and/or server should log following line, which informs that Dynamic DNS Update was completed successfully. As of 0.8.0, both Dibbler server and client are using TCP connection for DNS Updates. Connections are established over IPv6. There is no support for IPv4 connections. Server uses first DNS server address specified in \verb+dns-server+ option. It is possible to use differentiate between DNS addresses provided to clients and the one used for DDNS. To override DNS updates to be performed to different address, use the following command: \begin{lstlisting} fqdn-ddns-address 2001:db8:1::1 \end{lstlisting} \begin{figure}[ht] \begin{center} \includegraphics[width=0.65\textwidth]{dibbler-fqdn-cli-update} \caption{\emph{DNS Update (performed by client)}} \end{center} \end{figure} \subsubsection{Example BIND configuration} Below are example configuration files for the \href{http://www.isc.org/software/bind}{ISC BIND 9.7.2}, developed by \href{http://www.isc.org}{Internet Systems Consortium, Inc.}. First is a relevant part of the /etc/bind/named.conf configuration file. Generally, support for IPv6 in BIND is enabled (listen-on-v6) and there are two zones added: example.com (normal domain) and 0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.2.ip6.arpa (reverse mapping). Corresponding files are stored in \verb+example.com+ and \verb+rev-2000+ files. For details about meaning of those directives, please consult \emph{BIND 9 Administrator Reference Manual}. \Note Provided configuration is not safe from the security point of view. See next subsection for details. \begin{lstlisting} // part of the /etc/bind/named.conf configuration file options { listen-on-v6 { any; }; listen-on { any; }; // other global options here // ... }; zone "example.com" { type master; file "example.com"; allow-update { any; }; allow-transfer { any; }; allow-query { any; }; // other example.com domain-specific // options follow // ... }; zone "0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.2.ip6.arpa" { type master; file "rev-2000"; allow-update { any; }; allow-transfer { any; }; allow-query { any; }; // other 2000::/64 reverse domain related // options follow // ... }; \end{lstlisting} % \vspace{-0.3cm} % \begin{center} % BIND's named.conf example % \end{center} Below are examples of two files: forward and reverse zone. First example presents how to configure normal domain. As an example there is entry provided for zoe.example.com host, which has 2000::123 address. Note that you do not have to manually configure such entries -- dibbler will do this automatically. It was merely provided as an example, what kind of mapping will be done in this zone. \begin{lstlisting} ; $ORIGIN . $TTL 86400 ; 1 day example.com IN SOA v13.klub.com.pl. root.v13.klub.com.pl. ( 129 ; serial 7200 ; refresh (2 hours) 3600 ; retry (1 hour) 604800 ; expire (1 week) 86400 ; minimum (1 day) ) NS v13.klub.com.pl. A 1.2.3.4 TXT "Fake domain used for Dibbler tests." $ORIGIN example.com. $TTL 7200 ; 2 hours zoe AAAA 2000::123 \end{lstlisting} Second example presents zone file for reverse mapping. It contains entries for a special zone called 0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.2.ip6.arpa. This zone represents 2000::/64 address space. As an example there is a static entry, which maps address 2000::999 to a canonical name kaylee.example.com. Note that you do not have to manually configure such entries -- dibbler will do this automatically. It was merely provided as an example, what kind of mapping will be done in this zone. \begin{lstlisting} ; rev-2000 example file $ORIGIN . $TTL 259200 ; 3 days ; this line below is split in two due to page with limitation 0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.2.ip6.arpa IN SOA 0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.2.ip6.arpa. hostmaster.ep.net. ( ; this line above is split in two due to page with limitation 200608268 ; serial 86400 ; refresh (1 day) 1800 ; retry (30 minutes) 172800 ; expire (2 days) 259200 ; minimum (3 days) ) NS klub.com.pl. $ORIGIN 0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.2.ip6.arpa. $TTL 86200 ; 23 hours 56 minutes 40 seconds 3.2.1 PTR picard.example.com. ; this line below is split in two due to page with limitation 9.9.9 PTR kaylee.example.com. $ORIGIN 0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.2.ip6.arpa. ; example entry: 2000::999 -> troi.example.com. ; this line below is split in two due to page with limitation 9.9.9.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.2.ip6.arpa PTR troi.example.com. ; this line above is split in two due to page with limitation \end{lstlisting} \Note Due to page width limitation, if the example above, two lines were split. %% $ \subsubsection{Secure DDNS} Earlier Dibbler versions do not provide security for DNS Updates. This capability has been added in 0.8.3. It is possible to protect your updates using TSIG (Transaction Signatures), defined in RFC2845 (\cite{rfc2845}). For this feature to work, your DNS server and Dibbler server must be both configured with the same key. The first step to use this feature is to generate a key. Currently only HMAC-MD5 keys are supported. Please ask on dibbler-devel mailing list if you are interested in other key types. See section \ref{mailing-list} for details. To generate HMAC-MD5 key, a \emph{dnssec-keygen} tool from \href{http://www.isc.org/software/bind}{ISC BIND9} can be used: \begin{lstlisting} dnssec-keygen -a hmac-md5 -b 128 -n HOST my-ddns-secret-key \end{lstlisting} For ease of configuration, dibbler uses the same key syntax in its config file as \href{http://www.isc.org/software/bind}{ISC BIND9} does. In particular, all statements are finished with a semicolon. For example, the minimal set of commands to configure a key look like the following: \begin{lstlisting} key "DDNS\_UPDATER" { secret "9SYMLnjK2ohb1N/56GZ5Jg=="; algorithm hmac-md5; }; \end{lstlisting} Please keep in mind that TSIG signatures are time sensitive and they are valid only for specified amount of time. Therefore it is essential that your Dibbler server and your DNS server have well synchronized clocks. It is recommented to use NTP for that purpose. By default, the signature is valid for 300 seconds. This parameter is called a fudge. It can be modified to a different value, if needed. Shorter value is better from the security perspective as it shortens the window of potential replay attack. Longer values are better from the convenience perspective, as they are more ``forgiving'' to clock skew. The maximum allowed value here is 65535 seconds. Please note that such a large value is not reasonable. An example with the fudge value set to 250 is presented below: \begin{lstlisting} key "DDNS\_UPDATER" { secret "9SYMLnjK2ohb1N/56GZ5Jg=="; algorithm hmac-md5; fudge 250; }; \end{lstlisting} Any DNS server that supports DNS Updates (\cite{rfc2136}) and TSIG (\cite{rfc2845}) must support HMAC-MD5 signatures. Following paragraph explains how to configure HMAC-MD5 key for \href{http://www.isc.org/software/bind}{ISC BIND9}. There are at least three steps that has to be done to achieve forward (AAAA) and reverse (PTR) updates to function properly. First step is to add a key. Use the same key definition that was included in your Dibbler server.conf. Add it to BIND9 config file. Its location varies between systems, but it often /etc/bind/named.conf or similar. You should also modify your zone and reverse zone to accept updates from this new key. Make sure that you do not define \emph{fudge} parameter, as it is not supported by BIND9. Part of the named.conf that contains related changes looks as follows: \begin{lstlisting} key "DDNS\_UPDATER" { secret "9SYMLnjK2ohb1N/56GZ5Jg=="; algorithm hmac-md5; }; ... (other configuration options here) zone "example.org" { type master; file "/path/to/your/zonefile"; allow-update { key DDNS\_UPDATER; }; allow-query { any; }; }; zone "0.0.0.0.1.0.0.0.8.b.d.0.1.0.0.2.ip6.arpa" { type master; file "/path/to/your/zonefile"; allow-update { key DDNS\_UPDATER; }; allow-query { any; }; } ... (other zones and configuration options here) \end{lstlisting} In case of any problems, please refer to \emph{BIND 9 Administrator Reference Manual}, available on \href{http://www.isc.org/software/bind}{Internet Systems Consortium} website. \subsubsection{Dynamic DNS Testing and tips} Proper configuration of the DNS Update mechanism is not an easy task. Therefore this section provides description of several methods of testing and tuning BIND configuration. Please review following steps before reporting issues to the author or on the mailing list. \begin{itemize} \item See example server and client configuration files described in a sections \ref{example-client-fqdn} and \ref{example-server-fqdn}. Also note that Dibbler distribution should be accompanied with several example configuration files. Some of them include FQDN usage examples. \item Make sure that unix user, which runs BIND, is able to create and write file example.com.jnl. When BIND is unable to create this journal file, it will fail to accept updates from dibbler and will report failure. Check BIND log files, which are usually stored in the \verb+/var/log/+ directory. \item Make sure that you have routing configured properly on a host, which will attempt to perform DNS Update. Use ping6 command to verify that DNS server is reachable from this host. \item Make sure that your DNS server is configured properly. To do so, you might want to use \verb+nsupdate+ tool. It is part of the BIND distribution, but it is sometimes distributed separated as part of the dnsutils package. After executing nsupdate tool, specify address of the DNS server (\verb+server+ command), specify update parameters (\verb+update+ command) and then type \verb+send+. If nsupdate return a command prompt, then the update was successful. Otherwise nsupdate will print DNS server's response, e.g. NOTAUTH of SRVFAIL. See below for examples of successful forward (AAAA record) and reverse (PTR record) updates. \item After DNS Update is performed, DNS records can be verified using dig command line tool (a part of the dnsutils package). Command syntax is: \verb+dig @(dns-server-address) name record-type+. In the following example, this query checks for name jayne.example.com at a server located at 2000::1 address. Record type AAAA (standard record for resolving name into IPv6 address) is requested. dig tool provides server's response in the \verb+ANSWER SECTION:+. See example log below. \item In example BIND configuration above, zone transfers, queries and updates are allowed from anywhere. To make this configuration more secure, it might be a good idea to allow updates only from a certain range of addresses or even one (DHCPv6 server's) address only. \end{itemize} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% To manually make AAAA record update, type: \begin{lstlisting} nsupdate >server 2000::1 >update add worf.example.com 7200 IN AAAA 2000::567 >send \end{lstlisting} To manually make PTR record update, type: \begin{lstlisting} nsupdate >server 2000::1 >update add 3.2.1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.2.ip6.arpa. 86200 IN PTR picard.example.com. >send \end{lstlisting} \Note Everything between "update" and "picard.example.com" must be typed in one line. And here is an example dig session: \begin{lstlisting} v13:/var# dig @2000::1 jayne.example.com AAAA ; <<>> DiG 9.3.2 <<>> @2000::1 jayne.example.com AAAA ; (1 server found) ;; global options: printcmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 33416 ;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 2 ;; QUESTION SECTION: ;jayne.example.com. IN AAAA ;; ANSWER SECTION: jayne.example.com. 7200 IN AAAA 2001::e4 ;; AUTHORITY SECTION: example.com. 86400 IN NS v13.klub.com.pl. ;; Query time: 6 msec ;; SERVER: 2000::1#53(2000::1) ;; WHEN: Mon Jul 24 01:38:13 2006 ;; MSG SIZE rcvd: 136 \end{lstlisting} %% >> \subsubsection{Accepting Unknown FQDNs} By default, server configured to support FQDN has a list of names that are to be provided to clients. But there are use cases, when client uses its own name and sends it to the server. So it makes sense to sometimes allow client's own domain names. Server does not know anything about such names, thus its nickname "Unknown FQDN". There are several actions that server can do, when unknown FQDN is received. To configure such support for unknown FQDNs, \verb+accept-unknonwn-fqdn+ option can be defined on an interface. Depending on its, value, it may bave domain name as a parameter. For example: \begin{lstlisting} iface "eth0" { # assign addresses from this class class { pool 2000::/64 } # provide DNS server location to the clients # also server will use this address to perform DNS Update, # so it must be valid and DNS server must accept DNS Updates. option dns-server 2000::1 # provide their domain name option domain example.com # provide fully qualified domain names for clients # note that first, second and third entry is reserved # for a specific address or a DUID option fqdn 1 64 zebuline.example.com - 2000::1, kael.example.com - 2000::2, wash.example.com - 0x0001000043ce25b40013d4024bf5, zoe.example.com, malcolm.example.com, kaylee.example.com, jayne.example.com, inara.example.com # specify what to do with client's names that are not on the list # 0 - reject # 1 - send other name from allowed list # 2 - accept any name client sends # 3 - accept any name client sends, but append specified domain suffix # 4 - ignore client's hint, generate name based on his address, append domain name accept-unknown-fqdn 4 foo.bar.pl } \end{lstlisting} \subsection{Introduction to client classification} \label{feature-client-class} It is possible to define more than one address class for a single interface. Normally, when a client asks for an address, one of the classes is being chosen on a random basis. If not specified otherwise, all classes have equal probability of being chosen. However there are cases where an Administrator wants to restrict access to a given pool or to have distinct "client classes" associated to different address pools. For example, Computer and IP-Telephone terminals can coexist in the same LAN ; but the Computer must belong to given class pool meanwhile the IP-Telephone must belong to another pool. In order to implement the Client Class Classification, you must first create the client class and then in the class declaration, indicate which class to be allowed or denied. This point will be discussed in detail in next sections. \subsubsection{Client class declaration} Each client class used for class / ta / pd addressing must be defined in the server configuration file at global scope. A client-class declaration looks like this: \begin{lstlisting} Client-class TelephoneClass{ match-if ( client.vendor-spec.en == 1234567) } \end{lstlisting} Where TelephoneClass denotes the name of the client class and the (client.vendor-spec.en == 1234567) denotes the condition an incoming message shall match to belong to the Client-Class. The supported operator and data will be discussed in next section. \subsubsection{Access control} Access control is based on a per pool basis. In the client-class declaration; you can deny or allow the client class by using the keyword "allow" or "deny". For example, following class accepts all clients except those belonging to the client class "TelephoneClass": \begin{lstlisting} class { 2000::/64 deny TelephoneClass } \end{lstlisting} Another example. This class accepts only client belonging to the client class "TelephoneClass". \begin{lstlisting} class { 2000::/64 allow TelephoneClass } \end{lstlisting} The rule can also be applied to TA/PD declaration. Several "allow" directives can be associated to a given pool. \begin{lstlisting} ta-class { pool 2000::/64 deny TelephoneClass } pd-class { pd-pool 2000::/80 pd-length 96 deny TelephoneClass } \end{lstlisting} \subsubsection{Assigning clients to defined classes} Classifying operators are used for assigning client to a specific class. Currently, Dibbler supports the following Operators for classifying clients: \begin{lstlisting} Equal operator Syntax : ( Expr1 == Expr2 ) Scope : global Purpose : returns "true" if Expr1 equals Expr2 And Operator Syntax : ( Condition1 and Condition2 ) Scope : global Purpose : returns "true" if both Condition1 and Condition2 are "true" Or operator Syntax : ( Condition1 or Condition2 ) Scope : global Purpose : returns "true" if either Condition1 or Condition2 is "true" Contain Operator Syntax : ( String1 contain String2 ) Scope : global Purpose : returns "true" if String2 is a substring of String1 Substring Operator Syntax substring ( Expr1, index, length ) Scope : global Purpose : returns the substring of the result of that evaluation that starts index characters from the beginning, continuing for length characters. \end{lstlisting} Dibbler accepts different data expressions -- or variables -- which reflect value of options found in the packet to which the server is responding. \begin{description} \item[client.vendor-spec.en] the enterprise number value of OptionVendorSpecific (OPTION\_VENDOR\_OPTS, option value equals to 17 as per RFC3315) \item[client.vendor-spec.data] the data of OptionVendorSpecific (OPTION\_VENDOR\_OPTS, option value equals to 17 as per RFC3315) \item[client.vendor-class.en] the enterprise number value of OptionVendorClass (OPTION\_VENDOR\_CLASS, option value equal to 16 as per RFC3315) \item[client.vendor-class.data] the data of OptionVendorClass (OPTION\_VENDOR\_CLASS, option value equals to 16 as per RFC3315) \end{description} \subsubsection{Examples of Client-Class Classifying} Example 1 : \begin{lstlisting} Client-class CPEClass { match-if ( client.vendor-spec.data contain CPE ) } \end{lstlisting} Client belongs to CPEClass if its request message contains the Vendor Specific option with the data field including the substring "CPE". Example 2 : Combination with AND operator \begin{lstlisting} Client-class TelephoneClass { match-if (( client.vendor-spec.en == 1234) and ( client.vendor-spec.data contain CPE ) ) } \end{lstlisting} Example 3 : Combination with OR operator \begin{lstlisting} Client-class TelephoneClass { match-if (( client.vendor-spec.en == 1234) or ( client.vendor-spec.data contain CPE ) ) } \end{lstlisting} \subsection{External script} \label{feature-script} \Note Support for external scripts (often called \emph{notify script} was rewritten in 0.8.1RC1 release. Note that mapping prefix and notify scripts were removed. Support for server-side script was introduced in 0.8.1RC1. Dibbler-client is able to receive addresses, prefixes and numerous additional options. It will do its best to set up those parameters in the system. However, the need for some extra processing may arise. The most elegant solution is to call external script every time the configuration changes. Dibbler client may be configured to call external script every time REPLY is received for REQUEST (new parameters added), RENEW (parameters were updated) or RELEASE (parameters were deleted). Name of this script is specified using \verb+script+ keyword followed by absolute path to script. Script will be called with a single parameter, denoting current operation. Its value will be one of ``add'', ``update'', ``delete'' or ``expire''. Currently ``expire'' event is triggered on server-side only. \footnote{Please send your feedback to mailing list if you need it also on client-side.} Actual values of received parameters are passed as environment variables. In particular, IFNAME and IFINDEX variables denote interface name and interface index that was used to communicate with server, respectively. Another essential variable set is REMOTE\_ADDR. It defines address from which packet originated. That is client's address (when run on server) and server's address (when run on client). Client's message type is passed in CLNT\_MESSAGE variable. Server's response is passed in SRV\_MESSAGE. Note that server's reply is most often REPLY as script execution is skipped after sending ADVERTISE. Addresses are passed in variables ADDR1, ADDR2 and following. Note that each ADDR variable is accompanied with two additional variables: ADDR1PREF (address preferred lifetime) and ADDR1VALID (address valid lifetime). Prefixes are passed in variables PREFIX1, PREFIX2 and following. Note that each PREFIX variable is accompanied with three additional variales: PREFIX1LEN (prefix length), PREFIX1PREF (prefix preferred lifetime), and PREFIX1VALID (prefix valid lifetime). Support for additional options is in progress. Options are passed as environment variables. For example client DUID (conveyed in option code 1), will be passed as OPTION1. In 0.8.4 additional variables were added: DOWLINK\_PREFIX\_IFACES that defines a list of downlink interfaces when splitting delegated prefix. Typically it contains (sanitized) list defined in \verb+downlink-prefix-ifaces+ in \verb+client.conf+ or detected automatically by the client. The accompanying variable DOWNLINK\_PREFIXES contains the actual prefixes that were configured on specified interfaces. Those two variables are set on the client side only, for obvious reasons. To enable script execution, \verb+script+ global option must be added to \verb+client.conf+ file. For example: \begin{lstlisting} # client.conf script /var/lib/dibbler/script.sh iface eth0 { ia } \end{lstlisting} \subsection{Reconfiguration} Once DHCPv6 clients receive their configuration, they are not communicating with the server until T1 timer expires. If the network configuration changes before that time, it may be useful in some cases to inform that the clients should start reconfiguration process now, rather than wait till T1. To address this problem, DHCPv6 offers reconfigure mechanism. First, clients are informing the server that they are supporting reconfiguration process by sending \opt{RECONFIGURE-ACCEPT} in their \msg{SOLICIT} messages. Configuration then proceeds as usual, but the server includes \opt{AUTH} option in the \msg{REPLY} message with a randomly generated reconfigure-key. The client then knows that if it receives any \msg{RECONFIGURE} message, it will be signed using HMAC-MD5 generate with that particular key. That is a protection against rogue DHCPv6 servers, as the only server that is allows to trigger reconfiguration is the one who originally provided the configuration. The aforementioned example assumes that the default reconfigure-key authentication is used. It is also possible to sign \msg{RECONFIGURE} using delayed auth or Dibbler authentication protocol. During start-up, the server will load its lease database and will check whether loaded database matches existing configuration. In particular, it will check if the addresses clients have still belong to the configured subnets. If the server detects and outdated configuration, it will send \msg{RECONFIGURE} informing the client that it must start reconfiguration process. Clients by default have reconfigure support disabled. To enable it, use \emph{reconfigure-accept} directive. When enabling reconfigure support, it is strongly recommended to enable one of authentication methods, e.g. reconfigure-key. See section \ref{feature-auth} for detailed discussion about authentication. A short example that has reconfigure enabled looks like this: \begin{lstlisting} # client.conf - with reconfigure and reconfigure-key enabled reconfigure-accept 1 auth-protocol reconfigure-key auth-replay monotonic auth-methods digest-hmac-md5 iface eth0 { ia } \end{lstlisting} \subsection{Following M, O bits from Router Advertisements} Rounter Advertisements contain two bits that inform what kind of DHCPv6 services are available on link. \b M (Managed) that tells that addresses and prefixes can be obtained using stateful DHCPv6. \b O (OtherConf) tells that other configuration options may be configured. Both bits are defined in \cite{rfc4861}, section 4.2. It should be noted that those bits are informational only. In the default mode (when \emph{obey-ra-bits} is absent), the client will ask for configuration options that are specified specified in its configuration file. With \emph{obey-ra-bits}, the client will wait till it receives the RA message and will act according to the received bits. The default is off (\emph{obey-ra-bits} missing). Enabling \emph{obey-ra-bits} implies \emph{inactive-mode}. Let's take this simple client configuration: \begin{lstlisting} # client.conf - example that takes care of M,O bits from Router Adv. obey-ra-bits iface eth0 { ia option dns-server } \end{lstlisting} Without obey-ra-bits enabled, it would simply send \msg{SOLICIT} with one IA\_NA option (i.e. requesting non-temporary address) and \opt{ORO} requesting \opt{DNS-SERVER} configuration. If there is RA received with M=0, O=0, then Dibbler will not send anything and will simply wait till RA with at least one of M or O bits is received. If RA is received with M=0, O=1, then Dibbler will request ``other'' configuration options, i.e. all those that are not stateful or in other words any type of IA will not be sent. Dibbler will send \msg{INFORMATION-REQUEST} with \opt{ORO} requesting \opt{DNS-SERVERS}. With M=1, O=0 Dibbler will send a \msg{SOLCIT} only request an address, but will not ask for \opt{DNS-SERVERS}. Finally, with M=1, O=1 Dibbler will send \msg{SOLICIT} asking for both an address and \opt{DNS-SERVERS}. It should be noted that Dibbler will assess M,O bits only during start-up or while enabling an interface. It will not monitor any possible future changes in those bits (e.g. as a result of receiving Router Advertisement with updated flags). \subsection{CONFIRM message} \label{feature-confirm} Client detects if previous client instance was not shutdown properly (due to power outage, client crash, forceful shutdown or similar event). In such case, it reads existing address database and checks if assigned addresses may still be valid. If that is so, it tries to confirm those addresses by using \msg{CONFIRM} message. If you want to provoke this kind of scenario on purpose, you can run dibbler-client normally, then forcefully kill the procss (by sending kill -9 signal, or pressing ctrl-backslash under Linux). Make sure that you rerun client before address valid lifetime expires. Currently, client does support only IAs in the \msg{CONFIRM}. You can force the client to not send CONFIRM message by adding the following clause to your \verb+client.conf+: \begin{lstlisting} # Uncomment following line to skip confirm sending skip-confirm \end{lstlisting} It is important to understand the meaning of the CONFIRM message. It is a question whether specified addresses are topologically valid for a given link, not if the server has bindings for them. The server can be provided with the information which addresses are valid on a given link using \emph{subnet} clause. This directive was introduced in Dibbler 0.8.4RC1. See section \ref{example-server-subnet} for server configuration examples. Server will try to respond to CONFIRM messages, even when subnet is not defined. In that case it will check if the addresses are within configured address pool. If they are, the server will respond with success status code. Otherwise it will not respond (as required by RFC3315, section 18.2.2). It is important to understand the difference between address pool (or class) and subnet. Imagine the case of a network that uses 2001:db8::/32 prefix. Out of that prefix only small pool (2001:db8::1-2001:db8::ff) was assigned for server allocation. Without subnet definition, the server will be able to respond to CONFIRM messages only for that small pool. With subnet specified in its config file, the server will be able to respond to addresses from the whole subnet. The exact algorithm is as follows. If there is subnet defined, check if all addresses and prefixes sent in \msg{CONFIRM} are within that subnet. If yes, respond with success status. If any of the servers is not within the subnet, respond with NotOnLink status. If there were no addresses or prefixes specified, do not respond. If there is not subnet defined, check if all addresses and prefixes sent in \msg{CONFIRM} are present in respective class, ta-class or pd-class ranges. If they are, respond with Success status. If any of them is not within the pools, do not respond (because the server does not have enough knowledge to authoritatively say that they are not valid). \subsection{Mobility} Client can also be compiled with support for link change detection. The intended use for this feature is mobility. Client is able to detect when it moves to new link and react accordingly. Client sends \msg{CONFIRM} message to verify that its currently held address is still usable on this new link. \subsection{Leasequery} \label{feature-leasequery} Servers provide addresses, prefixes and other configuration options to the clients. Sometime administrators may want to obtain information regarding certain leases, e.g. who has been given a specific address or what addresses have been assigned to a specific client. This mechanism is called Leasequery \cite{rfc5007}. New DHCPv6 participant called requestor has been defined. Its sole purpose is to send queries and receive responses. Dibbler provides example implementation. To define a query, command line parameters are used. There are two types of queries: by address ("who leases this address?") and by client identifier ("what addresses has this client?"). To specify one of such types, \verb+-addr+ or \verb+duid+ command-line switches can be used. It is also mandatory to specify (using \verb+-i IFACE+), which interface should be used to transmit the query. Here is a complete list of all command-line switches: \begin{description} \item[-i IFACE] -- defines thru which interface should the query be sent \item[-addr ADDR] -- sets query type to query by address. Also defines address, which the query will be about. \item[-duid DUID] -- sets query type to query by client indentifier. Also defines client intentifier. \item[-timeout SECS] -- specifies time, which requestor should wait for response. \item[-dstaddr ADDR] -- destination address of the lease query message. By default messages are sent to the multicast address (ff02::1:2). To transmit query to an unicast addres, use this option. \end{description} Example query 1: Who has 2000::1 address? \begin{lstlisting} dibbler-requestor -i eth0 -addr 2000::1 \end{lstlisting} Example query 2: Which addresses are assigned to client with specific client identifier? \begin{lstlisting} dibbler-requestor -i eth0 -duid 00:01:00:01:0e:8d:a2:d7:00:08:54:04:a3:24 \end{lstlisting} \subsection{Stateless vs stateful and IA, TA options} \label{feature-stateless-stateful} This section explains the difference between stateless and stateful configurations. IA and TA options usage is also described. Usually, normal stateful configuration based on non-temporary addresses should be used. If you don't know, what temporary addresses are, you don't need them. Note that DHCPv6 stateless autoconfiguration is part of stateless autoconfiguration defined in \cite{rfc4862}. There are two kinds of configurations in DHCPv6 (\cite{rfc3315}, \cite{rfc3736}): \begin{description} \item[stateful] -- it assumes that addresses (and possibly other parameters) are assigned to a client. To perform this kind of configuration, four messages are exchanged: \msg{SOLICIT}, \msg{ADVERTISE}, \msg{REQUEST} and \msg{REPLY}. \item[stateless] -- when only parameters are configured (without assigning addresses to a client). During execution of this type of configuration, only two messages are exchanged: \msg{INF-REQUEST} and \msg{REPLY}. \end{description} During normal operation, client works in a stateful mode. If not instructed otherwise, it will request one or more normal (i.e. non-temporary) address. It will use \opt{IA} option (Identity Association for Non-temporary Addresses, see \cite{rfc3315} for details) to request and retrieve addresses. Since this is a default behavior, it does not have to be mentioned in the client configuration file. Nevertheless, it can be provided: \begin{lstlisting} # client.conf iface eth0 { ia option dns-server } \end{lstlisting} In a specific circustances, client might be interested in obtaining only temporary addresses. Although this is still a stateful mode, its configuration is sligtly different. There is a special option called \opt{TA} (Identity Association for Temporary Addresses, see \cite{rfc3315} for details). This option will be used to request and receive temporary addresses from the client. To force client to request temporary addresses instead of permanent ones, \verb+ta+ keyword must be used in client.conf file. If this option is defined, only temporary address will be requested. Keep in mind that temporary addresses are not renewed. \begin{lstlisting} # client.conf iface eth0 { ta option dns-server } \end{lstlisting} It is also possible to instruct client to work in a stateless mode. It will not ask for any type of addresses, but will ask for specific non-address related configuration parameters, e.g. DNS Servers information. This can be achieved by using \verb+stateless+ keyword. Since this is a global parameter, it is not defined on any interface, but as a global option. \begin{lstlisting} # client.conf stateless iface eth0 { option dns-server } \end{lstlisting} Some of the cases mentioned above can be used together. However, several combinations are illegal. Here is a complete list: \begin{description} \item[none] -- When no option is specified, client will assume one IA with one address should be requested. Client will send \verb+ia+ option (stateful autoconfiguration). \item[ia] -- Client will send \verb+ia+ option (stateful autoconfiguration). \item[ia,ta] -- When both options are specified, client will request for both - Non-temporary as well as Temporary addresses (stateful autoconfiguration). \item[stateless] -- Client will request additional configration parameters only and will not ask for addresses (stateless autoconfiguration). \item[stateless,ia] -- This combination is not allowed. \item[stateless,ta] -- This combination is not allowed. \item[stateless,ia,ta] -- This combination is not allowed. \end{description} \subsection{Server address caching} Previous Dibbler versions assigned a random address from the available address pool, so the same client received different address each time it asked for one. In the 0.5.0 release, new mechanism was introduced to make sure that the same client gets the same address each time. It is called \emph{Server caching}. Below is the algorithm used by the server to assign an address to the client. \begin{itemize} \item if the client provided hint, it is valid (i.e. is part of the supported address pool) and not used, then assign requested address. \item if the client provided hint, it is valid (i.e. is part of the supported address pool) but used, then assign free address from the same pool. \item if the client provided hint, but it is not valid (i.e. is not part of the supported address pool, is link-local or a multicast address), then ignore the hint completety. \item if the did not provide valid hint (or provided invalid one), try to assign address previously assigned to this client (address caching) \item if this is the first time the client is seen, assign any address available. \end{itemize} %% see SrvOptions/SrvOptIA_NA.cpp, TSrvOptIA_NA::getFreeAddr() method \subsection{XML files} \label{feature-xml} During its execution, all dibbler components (client, server and relay) store its internal information in the XML files. In Linux systems, they are stored in the \verb+/var/lib/dibbler+ directory. In Windows, current directory (i.e. directory where exe files are located) is used instead. There are several xml files generated. Since they are similar for each component, following list provides description for server only: \begin{itemize} \item server-CfgMgr.xml -- Represents information read from a configuration file, e.g. available address pool or DNS server configuration. \item server-IfaceMgr.xml -- Represens detected interfaces in the operating system, as well as bound sockets and similar information. \item server-AddrMgr.xml -- This is database, which contains identity associations with associated addresses. \item server-cache.xml -- Since caching is implemented by the server only, this file is only created by the server. It contains information about previously assigned addresses. \end{itemize} \subsection{Authentication and Authorization} \label{feature-auth} Implementation of authentication and authorization in Dibbler in versions 0.8.4 and earlier was loosely based on \cite{draft-aaa}. The implementation in 1.0.0 has been rewritten and is now based on standard \cite{rfc3315} format and mechanism, with custom extensions. Dibbler supports several mechanisms: \begin{enumerate} \item Replay detection -- Dibbler is able to detect whether the messages are being new or replayed. It implements the Replay Detection mechanism described in Section 21.3 of \cite{rfc3315}. \item Reconfigure Key Authentication protocol -- Dibbler supports reconfiguration mechanism since 1.0.0. Reconfiguration requires that the server generates a random key when configuring clients. That key is later used by server and client to verify if the reconfigure request really comes from the ligit server, not a rogue one. This mechanism uses HMAC-MD5 digests. This mechanism is described in Section 21.5 of \cite{rfc3315}. \item Delayed Authentication protocol -- It is possible to pre-provision clients with keys and configure the server to use them to sign its messages. Client informs the server that it is capable of using this method by sending empty AUTH option in its SOLICIT message. The server then selects a key and sends its key id to the client and signs its response. Then the client checks if it has a key with matching key-id and then uses it to verify incoming packets and sign its own transmissions. This mechanism uses HMAC-MD5 digests. That follows the mechanism specified in Section 21.4 of \cite{rfc3315} \item Dibbler protocol -- Dibbler also supports its own, custom authentication extension. It is somewhat similar to the delayed authentication, but has a number of advantages over it. First, it secures the whole transmission, including initial \msg{SOLICIT} message. Second, it offers much stronger digests: HMAC-MD5, HMAC-SHA1, HMAC-SHA224, HMAC-SHA256, HMAC-SHA384 and HMAC-SHA512. As this is Dibbler specific extension, it is not expected to inter-operate with any other implementations. Third, it does not require to maintain strict client DUID-key-id bindings on the server side, as clients send ID of the key they used to protect their transmissions. \end{enumerate} The authentication/authorization implementation in Dibbler is highly flexible. That is both blessing and a curse. You can tweak it to match your specific needs, but if you don't know what you are doing, you may get only an impression of security and complicate your deployment a lot. Both delayed authentication and Dibbler protocols are dynamic. It means that the server and the client reads its key files every time packet is sent or received. It means that the keys can be updated in real-time without any need for restarts. The following subsections explain how to take advantage of each mechanisms. \subsubsection{Replay Detection} \label{auth-replay} One of the possible attacks in DHCPv6 is a replay detection. In particular, the attacker could capture \msg{RECONFIGURE} message and then replay it frequently to cause the client to transmit \msg{RENEW} or other messages many times. To prevent such an attack, a mechanism called replay detection was implemented. It's basic principle is that the server includes a value in replay-detection field in \opt{AUTH} option. That value must be strictly increasing, i.e. the server must use greater value in any next message. Since the message is also protected using digest, attacker can't simply increase the value, as it would invalidate the digest. This parameter is configured using \emph{auth-replay}. The only allowed values are \emph{none} and \emph{monotonic}. It should be noted that this mechanism is useless on its own and must be used with one of other authentication mechanisms. The example for server configuration: \begin{lstlisting} # server.conf - example with enabled auth-replay protection auth-protocol reconfigure-key auth-replay monotonic auth-methods digest-hmac-md5 iface eth0 { class { pool 2001:db8:1::/64 } } \end{lstlisting} This is an example client configuration: \begin{lstlisting} # client.conf - with replay protection enabled auth-protocol reconfigure-key # This specifies replay detection mechanism. # Available modes: none, monotonic auth-replay monotonic auth-methods digest-hmac-md5 iface eth0 { ia } \end{lstlisting} \subsubsection{Reconfigure Key Authentication} \label{auth-reconf-key} Reconfigure key is a mechanism that protects only \msg{RECONFIGURE} message that the server sends to clients to force them to initiate reconfiguration procedure. The major benefit of Reconfigure key algorithm is that it does not require any preconfigured key. The server randomly generates keys on the fly when sending \msg{REPLY} message back to a client that reported support for reconfiguration. The major flaw of the Reconfigure key algorithm is that it sends the key value as a plain text, so client is only moderately confident that the entity that sent \msg{RECONFIGURE} is indeed the server. It is sufficient to sniff the initial client configuration procedure to obtain the key to later spoof \msg{RECONFIGURE} message to trick the client to initiate reconfiguration process. To take advantage of reconfigure key authentication, the client must do a couple things. First, it must support reconfiguration. Second, it must set its authentication protocol to reconfigure-key. Third, it must discard messages that are not authenticated. Finally, it should accept authentication method HMAC-MD5, as this is the method used by reconfigure key authentication. The minimal configuration file for client looks like this: \begin{lstlisting} # client.conf - reconfigure-key authentication reconfigure-accept 1 auth-protocol reconfigure-key auth-replay monotonic auth-methods digest-hmac-md5 iface eth0 { ia } \end{lstlisting} Server's configuration is modified in the similar way: \begin{lstlisting} # server.conf - reconfigure-key authentication auth-protocol reconfigure-key auth-replay monotonic auth-methods digest-hmac-md5 auth-required 0 iface eth0 { class { pool 2001:db8:1::/64 } } \end{lstlisting} For a more fully featured example, see \verb+doc/examples/client-auth-reconf-key.conf+ for client and \verb+doc/examples/server-auth-reconf-key.conf+ for server. \subsubsection{Delayed Authentication} \label{auth-delayed} Delayed authentication assumes that there are shared keys. Those keys must be somehow installed on the client and server machines, using an out of band mechanisms, e.g. using scp, manually copying keys using USB sticks etc. Dibbler assumes that the keys are stored in \verb+/var/lib/dibbler/AAA+ directory. See section \ref{keygen} below for details on how to generate and deploy keys. Let's assume that the client and server shares a key with key-id 0x01020304. In such case both client and server much name the key file \verb+AAA-key-01020304+ and place it in \verb+/var/lib/dibbler/AAA+ directory. In the delayed authentication keys belong to a given realm, which is really an administrative domain. Each realm must have a unique name. For the examples we use 'dibbler test realm' as the realm name. Once this is done, both client and server should be configured to use delayed authentication. Here's minimal client's example: \begin{lstlisting} # client.conf - delayed auth auth-protocol delayed auth-realm 'dibbler test realm' auth-replay monotonic auth-methods digest-hmac-md5 iface eth0 { ia } \end{lstlisting} Server's configuration is similar: \begin{lstlisting} # server.conf - delayed auth auth-protocol delayed auth-replay monotonic auth-methods digest-hmac-md5 auth-realm "dibbler test realm" auth-required 1 iface eth0 { class { pool 2001:db8:1::/64 } } \end{lstlisting} There is one additional step required. Server must be told which keys are to be used when communicating with specific clients. That is specified using a separate file \verb+keys-mapping+, which should be placed in \verb+/var/lib/dibbler/AAA+ directory. The format of the file is simple. It is a text file. Each line consists of a DUID followed by a coma, followed by key-id in hex notation. For example: \begin{lstlisting} # Comments starting with # are ignored. # So are empty lines 00:01:02:03:04:06:07:08:09, 0x010203ff 00:04:ff:ab:cd:ef:09:87:65:a1:bc, 0xabcdef00 \end{lstlisting} \subsubsection{Dibbler Authentication Protocol} \label{auth-dibbler} This is a mechanism that evolved from master thesis done by Michal Kowalczuk. It was rewritten by Tomek Mrugalski to use standard \opt{AUTH} option as defined in \cite{rfc3315}, rather then using its own non-standard \opt{AUTH}, \opt{KEYGENERATION} and \opt{AAAAUTHENTICATION} options. This authentication protocol provides strong protection against message tampering, can be used to authenticate the server (i.e. client is confident that it is talking to ligitimate server) by the clients and vice versa (i.e. the server is confident that it is providing configuration to the legitimate client). The first step is to deploy shared keys on the clients and the server. That is explained in details in \ref{keygen}. The server needs only one key per client. It is possible to share the same key among multiple clients, but that somewhat defeats the purpose of authentication. The client side requires two files: the key itself and a \texttt{AAA-SPI}, which contains 32-bit key identifier. That extra mechanism is needed for cases where client has multiple keys provisioned. That can come in handy for doing key rollover or using different keys for different visited networks. Both client and server can specify a list of accepted digests, using \emph{auth-methods} list. The first method on the list will be used as a default, but the server can later override it and use different method. Care should be taken to configure client and server with at least one common method, otherwise the authentication will fail. Once client is provided with key and AAA-SPI file that points to that key, the client sends \msg{SOLICIT} that includes \opt{AUTH} option with used key-id and digest using the first method specified on auth-methods list. The server will use specified key-id to select appropriate key and will validate the signature. Server will then know that the client is legitimate as it used known secret key. The server will then send \opt{ADVERTISE} option that will be protected by digest generated with the same key. Once client receives the message, it will do exactly the same verification as the server. Client will then know that the response was sent by legitimate server. Both sides have established their validity and the configuration process will continue. Depending on the intended outcome, the server may require clients to authenticate and drop packets from non-authenticated users. That is convenient for high-security networks where only known (registered) clients are able to get a service. An example client configuration file looks as follows: \begin{lstlisting} auth-protocol dibbler auth-replay monotonic auth-methods digest-hmac-sha256, digest-hmac-sha1, digest-hmac-md5 iface eth0 { ia } \end{lstlisting} An example server configuration file looks as follows: \begin{lstlisting} auth-protocol dibbler auth-replay monotonic auth-required 1 iface eth0 { class { pool 2001:db8:1::/64 } } \end{lstlisting} \subsubsection{Key generation} \label{keygen} Delayed authentication and Dibbler authentication require secret key to be generated and shared between the server and the client. For each pair of client and server three (two for delayed authentication) files are needed. Client uses a file \texttt{AAA-SPI}, which contains 32-bit AAA-SPI (AAA Security Parameter Index) --- eight hexadecimal digits, to properly introduce himself (authorize) to server. This file is needed only for Dibbler authentication. Also it needs file named \texttt{AAA-key-\textit{AAASPI}}, which contains a key that is used to generate authentication information in \opt{AUTH} options. The AAA-key is any number of arbitrary chosen bytes and is generated by administrator of DHCPv6 server. The server needs only one file per client to properly communicate using authentication. The file is named \texttt{AAA-key-\textit{AAASPI}}, where \textit{AAASPI} is the same value, that client has in \texttt{AAA-SPI} file. This file contains the same AAA-key, that client has in \texttt{AAA-key} file. Dibbler searches for those files in \textit{AAA directory}, which is \texttt{/var/lib/dibbler/AAA} when running under Linux and current directory, when running under Windows. Typical scenario of preparing a client and server to use authentication: \begin{enumerate} \item Administrator generates \texttt{AAA-key-\textit{AAASPI}} file. \textit{AAASPI} is an arbitrary chosen 32-bit number (as described above). The file contains any AAA-key and can be administrator's favorite poem or can be simply generated using \texttt{dd} and \texttt{/dev/urandom}: \begin{lstlisting} $ dd if=/dev/urandom of=AAA-key-b9a6452c bs=1 count=32 \end{lstlisting} %%$ \item Administrator creates file \texttt{AAA-SPI} which contains previously chosen \textit{AAASPI}. This file will be used by the client only. \item Administrator transfers \texttt{AAA-SPI} and \texttt{AAA-key-\textit{AAASPI}} to the client, using some secure method (e.g. mail+PGP, scp, https) to avoid sniffing the key by a potential attacker. \item Client: User stores \texttt{AAA-SPI} and \texttt{AAA-key-\textit{AAASPI}} in \textit{AAA directory}. \item Server: Administrator stores \texttt{AAA-key-\textit{AAASPI}} in \textit{AAA directory}. \end{enumerate} For example, configuration files can look like this: \begin{itemize} \item Server's \texttt{AAA-key-b9a6452c} and client's \texttt{AAA-key} (32 bytes): \begin{lstlisting} ma8s9849pujhaw09y4h[80pashydp80f \end{lstlisting} \item Client's \texttt{AAA-SPI} (8 bytes): \begin{lstlisting} b9a6452c \end{lstlisting} \end{itemize} When configuration files are prepared and stored in client's and server's \textit{AAA directory} you are ready to use authentication. For detailed description of possible options see \ref{client-conf-reference}. \subsection{Exceptions: per client configuration} \label{feature-exceptions} All configuration parameters (except FQDN) are the same for all clients, e.g. all clients will receive the same domain name and the same DNS servers information. However, it is sometimes useful to provide some clients with different configuration parameters. For example computers from the accouting department in a corporate network may be configured to be in a different subdomain. Is is possible to specify that for particular client different configuration options should be provided. Each client is identified by its DUID, by Remote-ID or by link-local address. This mechanism is called \emph{per client configuration}, but it is sometimes referred to as \emph{exceptions}. Support for per client prefix configuration has been added in 0.8.2RC1. See section \ref{example-server-exceptions} for server configuration examples. \subsection{Vendor specific information} \label{feature-vendor-spec} Dibbler supports vendor specific information options. As the name suggests, that option is specific to a particular vendor. For each vendor (or enterprise-id), there may be defined a number of sub-options. Let's assume that we want to define a suboption 1027 in vendor-id 4491. The value of that option should be 0x0013. To be able to support any vendor in a flexible manner, values are specified in a hex format in \verb+server.conf+. For example: \begin{lstlisting} option vendor-spec 4491-1027-0x0013 \end{lstlisting} When client asks for a vendor-specific info, server will send vendor-specific info option with enterprise number set to 4491 and option-data will contain one sub-option with code 1027. The value of that option will be 0x0013. Although uncommon, it is also possible to specify multiple vendor options. Another \verb+server.conf+ example: \begin{lstlisting} option vendor-spec 4491-1027-0x0013,1234-5678-0x0002aaaa \end{lstlisting} Server algorithm for choosing, which vendor option should be sent, works as follows: \begin{itemize} \item When client requests for a speficic vendor (i.e. sends \opt{vendor-spec info} option with vendor field set), it will receive option for that specific vendor (i.e. requested 4491, got 4491). \item When client requests any vendor (i.e. sends only \opt{option request} option with vendor-spec mentioned), it will receive first \opt{vendor-spec info} option from the list (i.e. 4491/1027/0x0013). \item When client requests for not supported vendor (i.e. 11111), it will receive first vendor-spec option from the list (i.e. 5678/0002aaaa). \end{itemize} It is possible to configure Dibbler client to ask for vendor-specific info. Granted value will not be used, so from the client's point of view this feature may be used as testing tool for the server. Client can request \opt{vendor-specific information} option in one of the following ways: \begin{description} \item[option vendor-spec] -- Only \opt{option request} option will be sent with \opt{vendor-spec info} option mentioned. \item[option vendor-spec 1234] -- \opt{option request} option will be sent with \opt{vendor-spec info} option mentioned, but also \opt{vendor-spec info} option with enterprise number set to 1234 will be sent. \item[option vendor-spec 1234 - 5678] -- \opt{option request} option will be sent with \opt{vendor-spec info} option mentioned, but also \opt{vendor-spec info} option with enterprise number set to 1234 and sub-option with code 5678 will be sent. \end{description} Although that is almost never needed, it is possible to configure client to request multiple vendor-specific options at the same time. That is also supported by the server. See \ref{example-client-vendor-spec} for examples. However, if client sends requests for multiple vendor-specific options, which are not supported by the server, for each sent option, server will assign one default vendor-spec option. See \ref{example-client-vendor-spec} for client example and \ref{example-server-vendor-spec} for server examples. \subsection{Not connected interfaces (inactive-mode)} \label{feature-inactive-mode} During normal startup, client tries to bind all interfaces defined in a configuration file. If such attempt fails, client reports an error and gives up. Usually that is best action. However, in some cases it is possible that interface is not ready yet, e.g. WLAN interface did not complete association. Dibbler attempt to detect link-local addresses, bind any sockets or initiate any kind of communication will fail. To work around this disadvantage, a new mode has been introduced in the 0.6.0RC4 version. It is possible to modify client behavior, so it will accept downed and not running interfaces. To do so, \emph{inactive-mode} keyword must be added to client.conf file. In this mode, client will accept inactive interfaces, will add them to inactive list and will periodically monitor its state. When the interface finally goes on-line, client will try to configure it. To test this mode, you can simulate deassociation using normal Ethernet interface. Issue following commands: \begin{itemize} \item Bring down your interface (e.g. ifconfig eth0 down) \item edit \verb+client.conf+ to enable inactive-mode \item execute client: \verb+dibbler-client run+ \item client will print information related to not ready interface, and will periodically (once in 3 seconds) check interface state. \item in a separate console, issue \verb+ifconfig eth0 up+ to bring the interface up. \item dibbler-client will detect this and will initiate normal configuration process. \end{itemize} In the 0.6.1 version, similar feature has been introduced on the server side. See sections \ref{example-client-inactivemode} and \ref{example-server-inactivemode} for configuration examples. \subsection{Parameters not supported by server (insist-mode)} \label{feature-insist-mode} Client can be instructed to obtain several configuration options, for example DNS server configuration or domain name. It is possible that server will not provide all requested options. Older versions of the dibbler client had been very aggressive in such case. It tried very hard to obtain such options. To do so, it did send \msg{INF-REQUEST} to obtain such option. It is possible that some other DHCPv6 servers will receive this message and will reply with valid configuration parameters. This behavior has changed in the 0.6.0RC4 release. Right now when client does not receive all requested options, it will complain, but will take no action. To enable old behavior, so called insist-mode has been added. To enable this mode, add \verb+insist-mode+ at the global section of the \verb+client.conf+ file. Example configuration file is provided in the \ref{example-client-insistmode}. \subsection{Different DUID types} \label{feature-duid-types} There are 3 different types of the DUID (DHCP Unique Identifier): \begin{itemize} \item type 1 (link-layer + time) -- this DUID is based on Link-layer address and a current timestamp. According to spec \cite{rfc3315}, that is a default type. \item type 2 (enterprise number) -- this DUID is based on the Private Enterprise Number assigned to larger companies. Each vendor should maintain its own space of unique identifiers. \item type 3 (link-layer) -- this DUID is based on link-layer address only. \end{itemize} According to spec \cite{rfc3315}, it is recommended to use link-layer + time, if possible. That DUID type provides most uniqueness. It has one major drawback -- it is impossible to know DUID before it is actually generated. That poses significant disadvantage to sysadmins, who want to specify different configuration for each client. In such cases, it is recommended to switch to link-layer only (type 3) DUIDs. During first executing dibbler-client will generate its DUID and store it in \verb+client-duid+ file on disk. During next startup DUID will be read from the file, not generated. It is possible to specify, what DUID format should be used. It is worth noting that such definition is taken into consideration during DUID generation only, i.e. during first client execution. To specify DUID type, put only one of the following lines in the \verb+client.conf+ file: \begin{lstlisting} # uncommend only ONE of the lines below duid-type duid-llt #duid-type duid-en 1234 0x56789abcde #duid-type duid-ll iface eth0 { ia option dns-server } \end{lstlisting} When using link-layer+time or link-layer DUID types, dibbler will autodetect addresses. To generate enterprise number-based DUID, specific data must be provided: enterprise-number (a 32-bit integer, 1234 in the example above) and a enterprise-specific indentifier of arbitrary length (56:78:9a:bc:de in the example above). \subsection{Debugging/compatibility features} During interoperability test session, it has been discovered that sometimes various different implementations of the DHCPv6 protocol has problem to interact with each other. As the protocol itself does not specify all aspects and details, some things can ba done differently and there is no only one ,,proper way''. It also happens that some implementations may have problems with different than its authors expected behaviors. To allow better interoperation between such implementation, dibbler has some features, which cause different behaviors. This could result in a successful operation with other servers, clients and relays. Normal users don't have to worry about those options, unless they are using different servers, clients and relays. Those options also may be useful for other vendors, who want to test their implementations. Therefore those options can be perceived as a debugging or testing features. \subsubsection{Interface-id option} During message relaying (done by relays), options can be placed in the \msg{RELAY-FORW} message is arbitrary order. In general, there are two options used: \opt{interface-id} option and \opt{relay-message} option. The former defines interface identifier, which the original data has been received from, while the later contains the whole original message. When several relays are used, such message-in-option encapsulation can occur multiple times. It is possible to instruct relay to store \opt{interface-id} before \opt{relay-message} option or after. There is also possibility to instruct server to omit the \opt{interface-id} option altogether, but since this violates \cite{rfc3315}, it should not be used. In general, this configuration parameter is only useful when dealing with buggy relays, which can't handle all option orders properly. Consider this parameter a debugging feature. Similar parameter is defined for the server. Server uses it during \msg{RELAY-REPL} generation. See description of the \emph{interface-id-order} parameters in Server configuation (section \ref{server-conf}) and Relay configuration (section \ref{relay-conf}). \subsubsection{Non-empty IA\_NA option} When client is interested in receiving an address, it sends \opt{IA\_NA} option. In this option it may (but don't have to) include addresses (using \opt{IAADDR} suboption) as hints for the server. It has been detected that some servers does not support properly (perfectly valid) empty \opt{IA\_NA} options. To work around this problem, dibbler-client can be instructed to include two \opt{IAADDR} in the \opt{IA\_NA} option. Here is minimal example config, which achieves that: \begin{lstlisting} iface eth0 { ia { address address } } \end{lstlisting} \subsubsection{Providing address/prefix hints} Dibbler client can be instructed to send specific addresses or prefixes in its \msg{SOLICIT} messages. This can be achieved by using following syntax: \begin{lstlisting} # client.conf - request specific address/prefix iface eth0 { ia { address { 2001:db8:dead:beef:: } } pd { prefix 2001:db8:aaaa::/64 } } \end{lstlisting} Be default, client will use those addresses in \msg{SOLICIT} message only. When transmitting \msg{REQUEST} message, it will copy proposals from \msg{ADVERTISE} message, received from a server. To force client to use those specified addresses and/or prefixes also in \msg{REQUEST}, please use \verb+insist-mode+ directive. \subsection{Experimental features} This section contains experimental features. Besides serving as a general purpose DHCPv6 solution, dibbler is also used as a research tool for new ideas. \footnote{This was particularly true during my Ph. D. research.} Normal users are recommended NOT to use any of those features. Advanced users should take extra caution. Also be aware that those options may not work as expected, may be incomplete and not documented properly. You have been warned. Since those mechanisms are non-standard, they are disabled by default. To enable them, ,,experimental'' keyword must be placed in the \verb+client.conf+ or \verb+server.conf+ files. \subsubsection{Server Performance mode} \label{feature-performance-mode} When running in a normal mode, the server rewrites its full database every time there is a change. That becomes problematic once the number of clients is large and number of packets per second is sufficiently high. To somehow eleviate the problem, an experimental performance-mode has been implemented. The server will load its database at start, then keep it in memory only and will write it again to disk during normal shutdown procedure. That should work, but it is dangerous! If there is power failure, server crash or other event, the server may not be able to write its database to disk and you'll lose your database. To use this feature, use the following config: \begin{lstlisting} # We want the server to not waste time on logging log-level 3 # Enable experimental features experimental # Enable performance mode performance-mode 1 iface eth0 { class { pool 2001:db8::/64 } } \end{lstlisting} If you are not satisfied with Dibbler performance, please submit patches or better yet, consider the alternative: Kea (BIND10 DHCP) \url{http://bind10.isc.org/wiki/Kea}. It offer tremendous performance, is open source and is being actively developed by a professional team. Its lead developer happen to be Dibbler author as well :) \subsubsection{Address Parameters} \label{feature-addr-params} \textbf{Note: This feature is experimental, i.e. it is not described by any RFC or even internet draft. Don't use it, unless you exactly know what you are doing.} There is ongoing process to register and publish internet draft, which describes this operation. Latest versions of this draft will be availabe at \url{http://klub.com.pl/dhcpv6/doc/}. RFC3315 (\cite{rfc3315}) defines means of allocating IPv6 addresses to all interested clients. Clients are able to obtains IPv6 addresses and other configuration parameters from the servers. Unfortunately, client after obtaining an address, are not able to communicate each other due to missing prefix information. That property of the DHCPv6 procotol is sometimes perceived as a major disadvantage. To overcome this deficiency, an extension to the protocol has been proposed. It is possible to attach additional option conveyed in normal IAADDR option. That additional option, called ADDRPARAMS option, contains additional information related to that address. To maintain backward compatibility, server does not send such option by default, even when configured to support it. To make server send this option, client must explicitly ask for it. Below are example configuration files for server and client. Note that since that is an non-standard feature, user must explicitly allow experimental options before configuring it (thus ,,experimental'' keyword is required). Example \verb+client.conf+ configuration file: \begin{lstlisting} #client.conf log-mode short log-level 8 iface "eth0" { ia { addr-params } } \end{lstlisting} Example \verb+server.conf+ configuration file: \begin{lstlisting} #server.conf log-level 8 experimental log-mode short iface eth0 { t1 60 t2 96 prefered-lifetime 120 valid-lifetime 180 class { addr-params 80 pool 2001:458:ff01:ff03::/80 } } \end{lstlisting} \subsubsection{Remote Autoconfiguration} \label{feature-remote-autoconf} Every time a node attaches to a new link, it must renew or obtain new address and parameters, using DHCPv6 protocol (namely \msg{CONFIRM} or \msg{SOLICIT} messages. In case of mobile nodes, it is beneficial to obtain address and other configuration parameters remotely, before actually attaching to destination link. This extension provides experimental support for such operation. Details of this mechanism are thoroughly discussed in \cite{phd, draft-remote-autoconf, networks2010, atnac2010}. The idea is that once client attaches to its current location, normal configuration procedure is initiated (\msg{SOLICIT}, \msg{ADVERTISE}, \msg{REQUEST} and \msg{REPLY}). However, besides requesting the usual options, client also asks for \opt{NEIGHBORS} option. Server provides that option that contains list of available DHCPv6 servers at neighboring networks. Once client gains that information, it then initiates remote autoconfiguration process, i.e. it sends \msg{SOLICIT} message to each of the newly discovered neighbors, requesting single IPv6 address. Servers respond remotely, using \msg{REPLY} message. Once this exchange is completed, client knows its new IPv6 address for each of the potential handover targets. What is especially important is that client obtains that knowledge, while still being connected to old location. It may leverage that knowledge, e.g. to update his correspondent nodes in advance. As Dibbler client is not a mobility software itself, it has to communicate with Mobile IPv6 stack somehow. Therefore it triggers ./remote-autoconf script every time remote autoconfiguration is concluded. Note that to support this scenario, both client and all participating servers must have unicast and rapid-commit support enabled. Following series of server.conf files demonstrate, how 3 servers can be configured to incorm client about their 2 neighbors. \begin{lstlisting} #server.conf for server1. log-level 8 log-mode short preference 2 experimental iface "eth0" { t1 1800 class { pool 2001:db8:1111::/64 } rapid-commit 1 unicast 2001:db8:1111::f option neighbors 2001:db8:2222::f,2001:db8:3333::f } \end{lstlisting} \begin{lstlisting} #server.conf for server2 log-level 8 log-mode short preference 1 experimental iface "eth1" { unicast 2001:db8:2222::f rapid-commit 1 class { pool 2001:db8:2222::/64 } option neighbors 2001:db8:1111::f,2001:db8:3333::f } \end{lstlisting} \begin{lstlisting} log-level 8 preference 0 experimental iface "eth1" { unicast 2001:db8:3333::f rapid-commit 1 class { pool 2001:db8:3333::/64 } option dns-server 2001:db8:3333::f option neighbors 2001:db8:1111::f,2001:db8:2222::f } \end{lstlisting} Client also needs to have enabled number of features. Following config file may serve as an example: \begin{lstlisting} log-mode short log-level 8 experimental remote-autoconf iface "eth0" { ia unicast 1 } \end{lstlisting} \subsection{Obsoleted experimental features} This subsection describes experimental features that are not supported anymore. This list is provided for historical reasons. It may be useful for someone to ease tracking of features removal, e.g. to get the latest version that still has support for something. \subsubsection{Mapping prefix} Mapping prefix was an extension that altered client's behavior when delegated prefix is received. Instead of considering it as a prefix that should be distributed on other interfaces, it is used as a mapping prefix. Normal prefix processing is supressed and external script is executed: \verb+mappingprefixadd+ or \verb+mappingprefixdel+. That script must be present in the working directory (that would be \verb+/var/lib/dibbler+ under Linux or current directory (Windows). This feature was removed in 0.8.0RC1. \subsubsection{Tunnel mode} As support for DS-Lite \cite{rfc6334} support was added in 0.8.0RC1, the old support for configuring tunnels was removed. dibbler-1.0.1/doc/logo-nss.png0000664000175000017500000003703412233256142013062 00000000000000‰PNG  IHDRm²Ÿžo:sRGB®ÎébKGDÿÿÿ ½§“ pHYsgŸÒRtIMEÛ 12˜ÉÛ IDATxÚíy|×uïÏp_ˆ’,É‹Åk¼JlǮ܌;éÇ ¡ÄiòiÚ¬óÒ×l‚Ú÷e%Ø÷úÚ4¥¯MÚ,Ó—ÚiÚ ´¥ÞFŠ#ÇI4ô"/²Ä¡#K¶$‹)’ Ì} –ÁÜ;ƒ™ÁB€<ß?1ÌvgîoιçžC(¥€”AôÀK®®Vß¶^¼‚ «&¼¶å3zà¥èÁ—燇nEEAE¬É'^ AuåAAEùDAPGQ>AÔQ”OAuåAAPGQ>AÔQ”OAuåAAEùDA•¬£âÑ×#?y:òÓgP>AÔQ+òùÓ§£ŽN½–À¦EAPGÍÉç˯G~òLô "ŸX¾AA5)Ÿ?}6zð¥bë“ €’Š ‚ Žräót俞‰<:õú (ÅS  TÑP ¨¦‚ ê(G>Ÿþ\%ŸjE5EAPGùòùð³ÑŸ¿¬+Ÿ\5Í+'ª)‚ ² uTq,ë¼Uªå­”šÚWTSA¤quT<~&òÈ‘è/ŽMžeÔ‹D®à}µ¨¦&ÅÕAi Ÿ‰<ú|N>ó‚§úÒb5¥Å ªÚ´¡¦€“dAÔQñø™È£/DŸ:=£o#šWSÕò¼à•©¦8IA©/Ÿ‰<öBôÐäÔ陜 j¨jj•¾¥§¦Á³y¤þ¨$Slû"‚ HµuT<~6ò¸b}Ϊ„°Xü,¨i~Ój •ëÅI2‚ HµuTœ<yì…è“RÎy[$…|ñ3VSà:{íª)ØšŠC§‚ HmttÛ®2’C€æd‡Ÿ¡L5͉N’AA]G1PSÍʤH/-¨)à$AdÙ*&£$÷!*Ù#@5"Åkªÿªþ˜ûÉ+\!¤6÷]ÍÂÂÕ,:’‹×wò¶fúcþw݃GAPGËÒQFfˆFÒ¬¨)WƱ®¦@n¾jãoÝZ¼2Õ”ÎÁ#‚ ¨£R#£knZQS­ª©Ô”©éŸï¸ö–«6jÍdž¯‰¤Ø GAV%%Äô€b>Ú²C§Æk–7Iæ–«.ø«6RJ×t4ÏÌ§Š·ÏnÍî$”QA´G+cbÂ6޳WcÞY²Mëì%@ÈŸû¯#„BÞsã¡M3ƒ£f>"‚ ¨£6E”•j ¼%bSMßý–‹·¿y#‚ðñ;·é캄šv·7_ØÓ^ÂŒ ‚ ŽVÆÕSSv@Ñ”šgˆ5uv·þ¯¼U1F;;;ßáÙâí»$» N çDn¼|Ý_ý¡çë¿q6™62UQPAV1•ίk¡ÄŠ&‡­ù)§P4È üáÌ¿ëÊ-º(¥‡£³³"~»çßOÌ-W’¹êâ5;nÞrÛõ›.êiþ·‰Á=OÌ.¤Í¥çEAPG+.Ÿ`¢`'‹‚i5Õ"—¬ïüìŽë)¥„5kºA÷Æ5±¿½Ëÿ—N½>£É/xɆ®/íyÛåëoºbýE=í”RJ鑉Á¯?¡5F NAA­€š‚‰x×a½\sÓ‚šþKÐG€¦¦¦ÖÖÖüz.Ýp|oàïÿãÉ©3³@½ùŠ õ´_´®ƒª „¼xr6k‰šŸÏà¼Ì7ñõYöâÂ^^ŸÏ‡}+²z ´37ÈG¾W͹‹Rm´ŽÎ}—Ô{ùÛ¯ÞL) T¦2•—––ÒéŒ"„B€!÷K1¹¿A ˜_Úz÷÷sKªð`ãƒç-:ü‘›CtK½5­Ïç×,t:’$™”Í{Éððp(²ªg‰DB½¤··WÓçj„¡¿¿¿üs÷z½j …B###êöïßo¾¯Åb‘HdttÔxµÞÞÞ@  M^ÞFl .ìå¥8 YMT¡Þ‹™‚E•RrXt¾2p“{ï§|çF÷~Êç»öBå²,'“³³ç—dY¦E>æÿ’ýE¦ÊÊÊÇ]ß:˜˜_²ZI†I¼ÐHy‰„Õ®Ö6ÑhTÓGÀÔÔTE,ÎÚ I’ßïïïï/)¢Ê©ŒŒ¸Ýîp8\NƒÁåm ™‹ HMt”SsÔ\ùk­šuà&÷¾{Þ5=úÑè_Üè¿ÂÕÙ¢,_\\L$fΛžŸ_ÐWЂX¤´h5yòõ™ÑÇ_Ô)âfXm”¯¦ Þ={jÓQF"îòrd¦–D£QÇ366fUwíÚåóùXŸ­IFGGkÓ@ÑhÔRÃ!RU{”'¢„XWÓ‚y:öÔTøÇÏEbG¥Ó³°°°pîܹ“§^{ãÜt2™¤†hä•'¥tüÙ“% ŒƒaµÑFVÓX<ñx\Oôºïº"‰ìرƒ5×L2>>^ޔ֦ôŒì†h ©*g”›ÍÉ«bVÀxŠ ˆ4~äÔøs§vE½ëš ü»½7_Ö#„È<ý§”*£žÊ–d™+p4/•ÒéY席Õe^Xo£)éÄÄD8®jgmÐ'‰h4ê÷ûÙ?¹Ýîááa½/já¼^¯Þ§ÕpVD‡††¸ȇ)QQÑhtbb‚{‘ƒÁ =ÛnÙ(‰ì¤†: Å©n¹jJ©©).¼°ÞGž;óÈsg†~wKðö˜͛*TY.¤.*ÖNA#¢ªc&æ+Éèªi …€˜UóRdüW=5¾Õè¨Ïç«ÆX¯(Š\ …B…öûý¡P(‹…B!6hhttÔï÷sÏtÙÈØèŒF£¨£b’Š‚*lø£ŒÎ^COïÞ¯|øOÍ-†=eš’¹]ƒÈ#% oÎK Ô§P¯å4ð(iUãY$IbEEÍØØ˜mŸgµáêÇÞ½{#‘ˆž™ëóùb±Øàà û'Û¹Ú d<î[Ï „ +TG¹jJÊSSíð*Bž?5ûù}/­ëYk ™zc¦)ݲ¡‹- •bô~P0ÆŒêų°¶ë­­ÏA¸H$Â:i÷îÝkÆ8‹D"š…SSS¶Ãv–·0ÚA–ÉÕþž'bYMù‚JÆžzåì<íY×cNJ‹ìTõ4˜ë¶¬åEêê«)hÔ”4–1ÚÛÛ[Ak©¤¢¨?*cŠšuê3j—uïܹӼ‡3‰8N{gÊm *9WÍ4ê(‚ÔØ%¥Ô8SJìN’‘Μïêìljn–ó³X̤Å+]·e­³³™ï¿5¥¦À|·® lO­Ä³TvG¢(jL:¿ßïóù4311au¾µ‰F£SSSê%N§ÓÒ¬Ëåb_M&&&ÌøH¹ 455Uñ1`I’4 äóù¢deÛ£PbLô‡N­O’qoè"„tt´kfŒ~Ï šÛ«·¾y“‘ÿ6»GsjÚp{äP(TÙî’µc”@6ܦÞ,ÖÛi#Ò‡kâ›tÏr(W¶Ø7§Fi YÙö¨fL”XVS=AeÔÔÙÙê¾ ŒGAÕ‘GŒšf5÷η\\ÅÓHR,¨ºk6†IÚ××§YXñx (RTÿÝ4«v6ܪ.—Ëëõ²6ºÉb¿[ƒRâ§Ø“EEZÚ£V¼¸`=¬Wµÿ[”e™LFë·-ŽÝ-éèýƒ[·:;Z˜`c‹Ó ¬·qàzqÇÆÆ*ϺFóòé÷û5~˺Ê(IëÔµš±]k4y¹&i(‹é5Ïç«çBU £`Ñ‹ 6'ÉøoÈ>ê ó ²Êu«ü÷‹£gïþîo®þÜ#íüÑ…Ÿyhó§Üô©v„~óÐß>ôüÁOÇçÕÃ¥pëVf°Ö´š6žŒ‚ÏçccJ¡rñ,[ÇétªÍPÖ$­Ÿh#ÖwjODËùb HÏë^ÿ „ +]GuíH3Jia’Œ³£E±G3™ÌB.; ¢¦GNÎ~蛿þÐ7ýð³§g’iuøÏGßøÉÓ¯}õG/øï=p鮽ùèçî¾xZ–é×|™·ª¦ e’²1¥•ŠgÑè¨ßïW/²bP?³_XÃ˶²Cªf8óPËT-ë@ÆRK{””¥¦`j’LÀ{™²,13£vÑîytòί?õäd¼x›üJ2ÏžHüÓc/¿ïïÆÝŸ‰þÍØsþsÏñF¥¦¤¤š6€æ»i·ÛÍo+?ž%‰hÒjìÇ£ UrÖÃõá–µ·)6]ƒÆ•j|æˆL-)¢Æ äv»ë¶d5Ø£Œšr»[ ëe†Wƒï¹:×é$=1½ð¾øÍß?>¥ok+Éäÿ4³ºï éíGÆ?ôò~Ža :yšØI2€Z'B¡;Å‚g±ÑM«?ööö²~ÂÕÌRfv_ƒ*Ó»«¹Ô¯ûêi ©WeÕ”+¨Äþ$™Á·_êÞÐ ÉäÂÂ¥ôÑçßðcâ…׿,U’ÑÛ\sÛ‡îÿ¼¸ÏD¶B½I2·s,'ž…-ðÂÍ+Ë.\y)èØÓaý´öh||ܶuÈ6W•Ù…˜#Aj¢£œ Œš‚Þ˜¨ÙI2¡÷g=NgϾA)ý‡ñŸþ·—f3“dJ«iv7ð¾WĽöv¤“ÖÔÈ›â“7¼v¸á¾âñ,ÜÉ—\[Ýo}zm‹GE†Zõ( Ú;0“ är¹¥d%ê¨U5 “dòÆèÒÒÒÔ©³_xhòœ,9IÆŠšÂm§§¢ì¾éµçæ°ªÔtmrzð™ïÿ©øÝždC¾­W6žEØÙ××§'2ßÙ§|è5½ZÍEîíí5ß@µ‹ Õ×QVM9ÑCæÔø“dB;®WÖ}iêäÝ÷}à™s•ª$3éÜ Kઅ¥oºïÿúî–™SòÜ–N¾kòñÏÿâkמ}¾qÛÞ žÅªÅæš3°ký~¿FÆÇÇ—=;éÓö!±¾q½:©µl MƒÜ@s"ˆy*UÇ›”¨ËGÌûÔ[‡_Átðw³Æ¨8uî÷ÂOžšIåJp—ªr `TW(kn€E’]}FøàÉ©«Þø‡G7öþjó[ž¾àêds{~ Ξ¼õ•'n<õ›ü:2dm†4hó‡B¡H$¢‰&M$ápØ’UÊúýDQ4Ø‚ËåÒŽF£Ñª–­. ;55%I’ !öjØžB£×@¡PÈ’X~E"‘jT{EÔÑb)媗v9¨Jg›UÓÐŽëõýõ£‰¹Tñvò_1­¦Å«]ûƤæTZ)¹!ÙÔóê+W¿q|A€sm®éöµpétÑš-2\”r¬Ïí2iÜ; ‰ô÷÷kŽŒŒX(eûôÑÑQK‡‡—WG¹R‹Å¬³¦¹m{Ô öìÙcér±žs« „:Š zT4Ÿ˜Œô1œ$Äõû¯soèŠ8îûëÇó©ªT’á±5-¼ý|ËõóMWÌ&®87©Ñ¶.:®O6¯•…L˨n<‹ùNSE3ó#©‡tì<ガby½^ÛSQ+Õ@¬´7b!ÈŠÖQ°éc*¬×ÙÙ¼ãÊÈãCß>”XHU¥’ŒÞ épe„7'›ožkyË|ó›“MW%7Ì7_µØì’…”))ÙͪÏ2::jrH¬RQBËmÄÆ×LLLXš$ŠâÈȈfaù)ýôÈä(i¥.,F!H•u´¤ÁgKMCþ뢿91ô'«WI¦3•€nž¶q¤š"ÔÐ!“v*¤HÈŠ(¡iBå¿ ôâYLZ™+XG4)Wñxœ•ÌÞÞÞòuT¯LZ™•𵂳_¤š:jÞ}ªk#rÔ´oËZWGËÐw~ÉQÊÊU’Ùª„æêà¤Y£3ÿoš@ŠPå'-@£ûu¸ tLö­š€”Ý»w›«·C56Ö²§ s»ÝƒƒƒìË„Ïç+)¥ñxÜçó±ÂV)®œÒ¼5n!ÈJ×Q°8Yj’Œ³yî}<2ôÝ_šUJ[•d6ÌOŸY+È 4-( ª*]·‚=síX¹VIûoÙ»iî ãÄÄ„Ïç3pðÆb1ÇÊèÀÀ€ù«Ñ „9„¥ÒñºyJÊj>2“d¾}Ó7þEò®ÃŸ$£Z?'¼Tw¼1Ú­?ȹ6CÎ4É2 ÈÙiþã °G!Ï¢IWÒÓtÓ}}}æ'ŠMÔèèèh8.'*§|“txx˜㜘˜èïï÷z½~¿ßãñx<—Ë‹ÅDQŒD"\ÿj___eUÇF±:j©‚Á ¦”%¨d ”Ïç+'†AV¢Ž(˜d\Aµ¨¦çõ^päƒO|6·eª³Yj F“d®={\ÙžCߤl§¤M†„CÑQªè(EP© ¯”»!Çb1ŸÖ¸Ö¬li2†R8ZãuŒF£•ªµiÛ$•$‰;-d||\“Í@§Ó‰D*þB`µØ <–®­Çã±×@ì‹·õ±ÿEV•Š3"Úêa–2öüèÖñÏ\ñãNÞXéŠç¾Ï}½ïÌqE_;¨‘Q¹9-¤‰Ú£K—MšáÒUYc–„°Ÿ¡Þúõà9 ‡Ãì@©yúúúDQ,§šwõÈê; æDšé(0:õÕÔP\ß~Á‘ï¼í NÞTFî{Sjºqnúòø©&€îL‰s[#+»ÙÝ&ŸkÌd< [?d``ÀªÆvëõ#ÐårE"‘ááaßݹsg,+¿tZÝ6æDêèhA íª)Ò·Vúßý[ˆ§:8yo“ÙzMM’¹CúU…&Jz2¥¯Ã%KB¨¼rÔªEÈ®f#¦Fñ–´¢–ë•brrÒ¼a:88899Yƒñ]“ T¾·@¯0ÚAÔT.¿.¨8sZ¥üF¹ëhGûÖIz‡]Íó@aüÌ5…?åá&HDµ…Ü:]K zñ`“ D€5™Ò§¸!Mš(¤'¤(¨‡ Ì[H>Ÿo÷îÝìLÍ€–ËåÒXlöbSÃá°&QŽživg~€]ÓäÕp»Ý‘H$G£Q1G~ÄÑétz<·Ûíóùü~¿ S¯ª Ä^1{ ‰D4±ÊšCµ1Ò‰ƒ£ÈJ‚PZûŠ|êAŽÚ¶¬RSuœÍsÝöeS¢@àîßüÞ ý 96Ζ¡ ¦%ÖQ­F)|ì采žy$Ch3ÀESvù³­éS͜˵ísŸÝöùÏâÍ„ ² ©”_Weóq|­Œ³·8VÈÙ2ÿØm_ö¬•€q€£Æ_»¦x z[Îyq‰ÎtÒ¢Ã+¬sáÜô>@qê®3=m¥7åÀ;AQS©ù£Š>{q™u€góÜc·}Éã’€6ÃTrÃTbca%Û•d4FªÊÓûõý×R2ÐJ¡ Ìêh·LÚdH xÛ ‚ ¶G™ #bÊ6u¶Ì=þÎ/zz¤ìâ@º &][d³jŒQÛLM’ù›ŸßÍôÉ&€&€5OtK UA©¸Ž²j Œšé" yU,I²'€øúV““dlä¾¿ëØ¯~ÿدš€4t8€X¾ :Š ‚TÃ-©¦Å‚êl™{üö/å-Qár¶¡øúV#TO\M¨é]/?uïÁûMM@ %-ÍýÓNɆ4ÁûA±¨£)Éœ1jJM-sßþEOÏdö€t¾*¾¶ÕN!îR•dî:úÔ½ïÏ •2ÌZSÑ$EA*§£sQ8áƒóÑö(ßïZ4tÚ×sü7w==“ŠÈiDK¥ MË•dîzù—÷¼Où=t 444 4 æ *WSÑEA¬ë¨+rNí€I7$"‰›³G5âJ.yrÿ_pwÎ ë: ]E›‘âO’)yÄhð]GŸº÷@VDÓ@gUª™û…ª~ ûaT Ð èÚEA¬ê(l€<3E_‚I7œ Àl΋¢‹Å”_òËÝn·Ûív¹\ÇjÔXŽx<ž¯kÝ××çr¹|>ŸÇ㱚ÜUS ÚjåçH$¢.Kâv» J†•¬;mû[J©s%1¯$IùZžÊ•Q.µRÜÌYØ;Ôj7‚ÁYh}N’¤Ét*U!G’¤h4š¿·óɽ^oþƒùdÈ춇æØK¤ÎQ¬ÔWîêüïå<Îl1;ãKZ³³®ÔsÄ¢ô`Êc¥|L$Ê]ohîåUž…"ãÍÊ#À^º@ `=¿î륉œf)?@Èç Ê -žPB:€4‹• •ÒÀC;GŸ¾­È¾„âl½šCfÖ¹úì‰<ôuçÒBö>è9ªäSIÌÓT3ÊzºI~¹-[À»òëF"‘h4ª)§¥ÇîÝ»KV»TžáH$¢©öÌât:ý~(2Ùc’â¤TÃÃÖž7ŸÏ§®¹íõz5Á¾LbüìH’ …¸õÀ5œšæ,JîÔvÓ`0h¯iò¬©7` ëýýýê%û÷ï/?s}, …Bf ­«wÇ^a{hNÁÒ500à÷ûm—¯‡Ã»ví2SÕÉYÛ¸¥óU45_;¯¯O¹½õn?§Ó)I’™·I’¶nݪ^ÒÛÛ+I’õq¾žqi+c• £‹ «ÔFp4´tÉ›¡”‘XõmñÎo;ÛÎìK6#!}ïzéÉŸþçWò"úšC>í …fM+•DÕËs?iÞЩf<ÕÕh®]¥(æÐÐIU:â’°Ûí)ÙS@"‘õx<«¡t8Þºu«­ÞXjš={ö”Ù4ËÕ²ñxÜï÷÷÷÷›Ô†j¶³ÊØØØÐÐÏç+ùÄé½›\ØÐH’ä÷û•ÇʼˆS1×çó)Î õýoòÖe_M”%Öu´Ù k¡ €¥Ò*+Ò‘i˜[0 ö÷÷›éRÕX'ñx<ìÚµËÒ ­Ü²»ví öºŒ†@¹2æ×¯l·®ˆJ9Mc{סP¨ö%¾ãñ¸Ïç3ÿv¨øñêð¶w»ÝVŸ I’ò¾z5SSS&Ý ôbj©• º2VÃápÉ+/I’æÍ¸··Wy^lÅvˆbeÒb)Õè"e„–YAÏ0õlœŒ}ä _öÜçT‚{M¨éÕoœøÁá¾ø¤²î¬@Ÿo•çZå Ù?QÕd¤ÕW´a½ÐÓ Qôã™OIDAT»@`Ïž=åß|šž«cktt´œþºÎx½+ãt:½^¯×ëíëë«R·nCT*Ø4‰D¢ä@@Åñûý\!QzÊgK‘×'‰DÂêXµ!µb?V_LK¾9qMÒ’¼ž1 6ë½´û µtNÐŬ,’¼@j *í4&?°J Viè÷ _wßè‹·xÛØÉ› *ÉüñÓïzêGy_îëùD‹2 JU™ó g°“ðFF Jµß"ÚÁÔŽ iˆ[P¯[÷z½êqx)‡(ŠJǤ§£z=—2áñx”mÆb1%èƒÛ­ƒÁú|ÔûúúìX<g6§Ó Ù¸åRÇb± Ú£išÑÑQ·Ûm/úcll,‹Õ¬Lw$a}¹½½½¡Pˆ­¬®D{E£QÍ¢w´±XL³qM]t“Î`†ç•ëÏ=øññqKPs:&ÿdé¬õÎÎø¬m?G&{°¾¾>¿ßïóù”x=Ès)ÁG±X,ÿ,°¯ª¡PH3J‡ Þ•€A®1ªÈ-â»éËù5d~™'Aþ%ÈOü+ òo@> ²òÓ ?ò³@Ÿzèó@_ú"З€z èq “@'N}èožúªöG~2!=ýðÚ¯}ë½ýêNoè¯z?û-øäð‰±5wßÿƒ ½¯À…?ï¾öz¿å~÷ŸÜô±Ýr÷‡n¾û¦ß¾Æÿ•þwÞóá›ïþðÍüùËoÿöú«lÛøPÛÆ‡Z7ý¨uÓ[7ý¤uÓO[6ýW˦‡[6=Ò²é‘æM6oz¬yÓãM›ö7mŠ5mwlú™cÓÏ›866ÿ\Øü„°ùdó!²ùÑÖ­»æÎm·î+ÿö$­KvïÞͽ'''' ¾8==½wï^]‰ÓéÜ·oŸÞÖ&''5XžÃ‡ë}K³æðð°¥s×¼oz½^ƒ•Ù^ÏÞg/ŽÓé48G«gaüÀîܹ“½Â½½½û÷ï×ûÊáÇËovÆ'µÿ~ÍW ŽÐöধ§+òø°­iþ»&悔{÷rO“{9|ø°q[<•æÏÚ|ëTê92¾¥•V6îÁò=ÏÞ½{õƒ½yô:=îeQ¯l·þh‡È.Ò t)?K¸Æ¥ÆÈ$Å®ÝüBªcÅ*ŸÖY t|Ïzž…ta ÓK_~裻ozï‡.¼õéwúǗߤª$Swa0d#M̈¨ñ6Yãäg2‰°/€ããã+)‚õ©Öl¸®š&× àˆÝ…ââk¬{†½CÌDz>jÍHðØØXƒôÅãqö–v:±X¬Roìåšššâ:ÃÃá°¦/Õ¼&–)Óîh1F†‘½ì× !­0ÓÞùþ_øÀÏ¿˜HuL€ÉJo’ŒÔsÉÿõþéE)B È…0¢óa^\wÑÇÞûâæ+ ò©®iSgw!{Cìܹ³œn]Ev8ÇÒë?÷]yúµ§ü¦)gîë|®MÀ+óõˆ[Òf²m®i:wn®ƒQÒz&³ïÑh´²MÌ Ü-i÷+Sá+§£H«Êk`_êEöª1œTZ¸”/ÝìþÆwÆŽÞÂV’1RSfC]qÖuIïR.F*/¨Š¦ªbwÃô¥ž‹þÇŸ™kí(Þr£ì3æt:Ëtµ±wØàà ¥ˆ·Û=88¸2žsÛ6S•:2›ÆãñØnš`0èt:5 •€£Úßö«çåIs²N§Óçó±¶ZƒFí²ïp;wî¬xük’*q^š#Ñô¥ê|Xeëh“H±=ZrŒF2Ášw7žìôÿçwìûRb©»H2‰M5ýá•7¯Ï]Ì4м¦f§:ÓÒö—ýŸkéÐÙr½?cÀ†/–¿MÖ-׋UûI‡5£Äܦ±a²]°É¦q¹\ÜÝU{–0kšLLL4œ”²—ÈÌ,x<®ÒVšÏï÷kÞi4YåAcŒ–o˜B5K4•ð{ÍWÊÐÑ&FõìK«?š+{ôf÷?í;z‹V&‹>ZSÓ‡·öÀFƒi $«©ÿ»ÿã§»ÖéÕe«C“”5ÊTP§*Í?í6^}>k»¬˜!Rv”Q™ŽYU9á6 ÷Û›·§¹&éÔÔTU!®G44ÖH{‰ÌÂ^Žl% y9lé»%÷Å­§B¡û355544¤DÕW°¶‰^s׸iòïéÜØ@ P=IcgÓçMŠþþþ¾¾¾`0X=S¦|K”½[J¾I’¤I ¡–¿ß¯™£ä¬}–™çˆÅƽW5³‡òت¯X4UêiŽ„kŒ–§£r\k†ˆ¥F}ÁH;³½ÃRgèÐîùÍ•Ö×P~ÍÑj E‘ž[ñ_„î IèØ¤_ß>8ßÚQB³ëþm®ü~¤‚Fc—Û3V¤B…¦¦¦Øi²ìé³rår¹¢Ñ(·gÏovddd``  VêVµi,½ŽD"öÜÇÇÇ£Ñh•ì ŸÏ·sçN½´—CCCJ2)óÕlj (J2)ö}«··×ŒíXr8Üï÷k®‰Rù§Ægmæ9boW¶7èíí­ö›P(RÏ%UÒjž,=cÊòë&cy££›¼"ZjLT<ó&ß¿uÏáìМ‚ŽÛ =½ìÐé‘ —@åËá“—ô=·ùJýÍ2oõJ]Í`f%å¬÷ù|ûöíc ÕŒõ÷÷û|¾zsh³½•Íw7>Ÿ úUzùê5q8ÖËz“ï÷ìÙ³uëÖª†EÉíXR2i†ú}EóEÍ+ën ð«ŠøW”Œ›jŒ×gƒÂá°Æè×3FËÔÑhV–dÞÀg©$õT_qÃâß¾¿›8{Y.ø¡C%ÕT+®œ@¤C] Ý2_ ¿sÓïmÍXM똺òk5ÜLy«øý~QJZØÛ¶m«M@oÍÞ·ÂápÉ€£ŠûèÂáðþýûK†¹îÙ³GI­Uo7ŒÓéV*šQ³‘UMÇ£ÊI$«jRRáJMÉNIck²Ã1ðvuTŽC2šÕ²E]E´šä(žìôÿ4´ëçŸH,u²õ4Ì¢šêŠkÑW-íÐ"kOñÁ«ßq¦{Ç fEºî Òº2øØƒYyÊêv»£Ñèáǹö™š‘‘‘ú)}ÃjŒUS`YŽm–$II¦jl›nÛ¶­~B¼^ïîÝ»¯¯É§€uÏrïv!&<))½n$cìžMz¾(GOôˆˆv}ñÜ¥ñÏN¼qia %°ˆæ6ATÛÒŒtªÇM©ÞX)oè”Ð#.¹åÕ—Z(,©f®¥ý~Ïû´›ÕlM³Ù:¦ïà¶»E{ih-éM0Ô+§U3u*̳¦« MqcpFGGý~Gm¿6UÄ¥ #‘7EbµL ãR‚`¹y‡$IËûöæt:EQ´qy5fåÀÀ÷D”´ê%JŽÀZžµ™çĘ̀ ˜¤Ü]ccÔ®ŽÊq˜ +J'O«ä©«+®yÉSÞ•^¾=øä'KŒn™VS•4ZRÓÝë [&çU¡F^ýÎy%u+Ò¬š6†s·Ü›¬R:jï©p»Ý–üåô.—«‚¾GåùTÒ¾‡B!n´”VZÁ×&{[«”« ×8àˆ}}QRcjâ0óVi(ªe¢¯×ÇÕïJ©Q«Uób±˜ætô®§ÛíÐŒðE£ÑZ:?*õÙ~!¶ñ ȦÒ-iŒ‚M¿n"˜5FçΕ.Ð]2ÉQð—Ÿ:ð‰¥.]/n!é|>bˆ]8IêIÉ!rbÍzP‡ëε´?xí;urßëí±®5¯üH× Nú¬j|i=£LjäF!)3lo¶R¯8lÓØ158ªåS Ø¦Ü#©½“3²™†¬^Ía;N]lÐÜ[®6£ÚÜÌ\%Q[:ºƒ…l>ªÌiNzÊ•Uàkm|©sèà={Ž|€1W /ÈÈ’šBqB¢Ö›hm‡âݯɣÀæpàU’Y7"«Íö6¨y+/§³nPü~?7âöϓm{›ªlÓèÕXÀ\.W$a¥4‘HÔ8[žÛífelttÔ’¶±wŽOvË ‘#Ðår±wN͆´YÉ %}Öu4‘Ý<•µ!EÔØ$U­Ùÿð½£ÇîÐÙ“JMUS•!h^MytdÃÍŽ¿b{ñÍU’©o-³ÿb{&Ûôõõ­ø^öb²Ñ¼¶Øæ¶×4ìRNÓè-K|2W«j¯(@€Uô]»v™l,vÄ7‘HŒëÃu‡6D´ÛÛÔÌ’fox3€E Azh2¯ªRÏSíïf2=qÏÄôe¥v©§¦*AÕµ_M‡õª¦¾<~ùïœéÞ`¹’L½Ð±sÊ|~<û’hãæf»Ñú‰V]öwÛNEšÆ^‚:ãW{6‘VíMRå‰0Žã­¥¢³Ï¦ßï7óU‘ëÖ:Ê-™PÏGnEGS"Ìfc™äSiž@zwÕkF»}tòÓû.©¦`{’Ì çzõžî«_eãšTÓ¸•ØŠÊnsttÔÒK=7ècuêhµßßËoã±·r ÁZŽ’Z²ŸíÒçó±.)%æ°äÍ‹ÅØn½z5ë_DYÛ¢œn]IMÎ6™’mܹ(fbÍ›¤ÆYk+Q%³MU•P(Ä>žÆ¥l¤.5Ǿ}ûNG•KÄÞ6JÂÆÔÑùH>F7= Ì*%¥EItCs‹?JsG¥;Ê>rRÉI2pº{ý/Ýo1[— ê;‘÷õ6‘HìØ±CI\gðò®ô­¬ârŸÀÑÑQƒ2Uñx\ÉÑÅZ!‘Hdå£%-þX,Æšžƒƒƒe^ ns›iš;vTµiôŽ*eh–ìUÃá0km×`kI£Õ ={K’$=mþøÙ̱ ‘#Ðívso›‰‰ Ç …êÊ05‘‡!%æct3g@>—Õ©¬4€\,ÇÅÙ(ÉUgÉ¿h<7XÑS ùTª¦8@6Â/.¾ò–/î¿òÖBHpáíÀ\%™úCqqÓsŒ)5 ÕùD”RAù'ÖãñhWÅM7::ÊÞÜJ™*¿ßïñx”.XEQÙ•vîܹì}™fê=Nèé¶mÛœN§Ïçóx<Š^*ÿÆb1¥Êk‰VÄ.÷ûý–š&‹é·U¼iô2UDvíÚÕ××§\p·Ûír¹<$I’$)‰Ø!y¯×»ì£òn·;‰ìرC£pJrÖgPÎ{€ßï×ܵIˆQÎs¤Ü6Ü$‘H(éþ½^¯Òîùw>Q%IŠÅb5KÝ`NG•aQšy.ëÑÍg#‚|Ö Êû'«ÒüÆï½rGND¥¦T]%—iÓQSø·¾;Œò ®¸ënýùF$IÒS²©©)½?åe•ûvÏfÊÎwÙ&oßÁÁÁzžn²Þûü+Æh"‘PÞTÌlD¹¤)éUÏMÃÍpT{ÔÒÙ)o-uâØä¾úŒ‡B!Í­ÅV“.SG•y«ÕöÙ~Ž40½nª–µ)å×U ‹¦ŽMq"o©éÔE@aäùÁjžŽýI2ÿué¶™¶»¹ïë×=„^Ž‹ÒårÅb±rf ¯Ô”Ù6|M{÷î­”mTÏM£—á¨Æ8N“eUjC8f§ŒŒ¨MRQMæ4ÐQvø¼QÊ¿D"ãºxu¯£çÃ…aÑc¹¬ Éri¼$GñTçØ©íÕ?)ë“d~xÍvF&M«iÝ߈ûöí+YUŠë–1诇‡‡­Æôõõíß¿uÆqûô}ûöUÖÁ˜o«_¬AÓ,{À‘×ëE±®’g)閸ʗ'cW°ÆJo½Ëš¬‹gü¬-“Ž.Æ`&[. ý¤_ãÌl!kúÈš>þR^’£±SÛé®Z]| “dN8×?|ù[Ë­ËVÇ(.öîÝ˾üêÝv%ý{¡PHÅ;wš¹G½^ïÞ½{EQ\%©téíí–$©JcT¡Phrr²Þš¦G&C7•s¬+K4ÇãÙ½{·f¡2PÊ5{{{m¼ °¯kãããõŸ#PíÏ$iß¾}–­{{{÷íÛWí $B¹e¿Òœñd‡Egañ×95€tö:.ö ú… Ù§ŽÎK¿zà}ÝÇ ¡¬p뚘¹l™"?SG3,JÂÅ3gO¬Y—[À:UÍìQ»¬³¿ ¿ûòÐ{.o”;2Çb1e@^ý ¹Ýn·Û­kX}P•Šó¢(jîWÇ£„ÛØè¿4ÑÊá™ÿºæ`”ð“û2ÿls7¥ìšÝ¦ra•È{gÖ§™Ö[Óp/µ:TÄêͬÄLinæòÏQiÍ6Í_|Íiß~Æ—Åê¦Ìï‚{ÙÙ³6ß:|ŽÌô`ì]?Z¥Ñíµ»Û›§£rÎú²Ã¢)XxH@a£·éÊ ãbδëó<öö?»Žecws¦ ZGÅÙKo8øÏË-"TG)ÕY Kªi± RÚX:Š ‚Tž_7PD’¿HãMƒ­ï9Üz[Œ+¢ÈtÝýÌ=MWºI޾wâŽ:8ß*U’Á Au4+‰AHfg•->ƒmïŸlùˆ°¶„'aâìe#‡?Út¹n’£±×·×ÍYWº’ ‚ ‚: 0¹=ʯ™¤·éúý­·F„.·Ém… !t 9IŽ&f.ZØTgç^ÑJ2‚ Èj×ÑÅć½°vŸãM1ÇfŸ¥m%–ºÂ‡? l²ñºùŸÑWï¨×+P‰J2(£‚ «]GS"œóqB÷0l” Ýf8~øðHŠå©òî>pz{}_‡ò*É ‚ «ZGÓœõA«6ˆÐ*gs‰¥®È‘Û…ž¢€#qæÒ©ä¦F¸¨¦‚ ˆU•ã0Wz¢Ðä.‹‘#w& =… œÙÞh—Åj%ÔRAU«£ \ÛŽ\–ñW=ÒÌFdžBÑXãé(cžO’AAV¯Ž6{@¨pÖÿè±í¤HP€xªóéó—5ò%23IAYµ:Z"Gî¡€Âg·¯ˆ eÖ‹V)‚ êh™8{™4³QpPŸ^Žê ‹K0·‹K5TSAu´rDm'M@œð³Dß2œVk ´¶Àüœ< ¯…sqHÌÂùy˜›‡¥,¥`q æ`> 3çaæYðÖfdXHÈd ¹KiH¥³’É%¹”ÊFæ g7tµC“¹sYJA* K)­÷¸­šY=vè­EA–YG÷üÊ IX8—U¬Ùù¬Œ-¥ fe!¡-:Û`}8¬Œò¶4CK3t¶CF†¥,-,ƒC(Ø»‚ R: Mèî„îÎìÇͪ?-¦`) IH.ÂùWa~¡° K8ho…öVHg`! ™ 8xC ‚ u££´6Ck3twd?ž™†SgìlG¦pv³ÐÕiÁµËÙŽ ³óÐÖ‚V)‚ Ò:ªaÃZ˜žá¤MhmöVhn‚æ&hnXHÅ)á¸`~³ÐÒ ]ÐÞjVPÓ™ld/ — •†Ö–lt‚ ‚4†Ž€³ NŸpvBg;twr­m¥7•\„Å,-A* Z𵑽€d2ª*ܤ`à&aq š” 0s„ ‚Ô¿Ž@g;¬]k×”»Å7«L<•eH.A*‹K@sri&yB:¹ ²€âí Ê"‚ Ž.?×Ue³‚mmÉ%XZ‚ä¢íP 2P)$;EAutk[ ´µ€@`aÑîÕr€ÃÚ‰ ‚¬J-öãAаºNW–uÑ|`‘ •²˜ËAA{t%‘˜JA²sišš@8)éed ² ² ”B^:32Ð449²ÑF‚ êè*:×¥´¶@W'4—:kATúš‘Ê S Ré¬ñŠ ‚ Ž®¢sU2ëÚÃ!|à”¥ Ëh•"‚ 8cœî‚ ‚ä@‹ AAPGAd9¨Œ_—~åâÉYi:)ž<¯ü2qê<^\AuÔ,ž »=vû¯Ù_;6-M'¥édìø´xò|"™ÆË ‚ ŽšÅwéÚܯ[ ¾OžOe Öñãq¼ú‚ ê¨Y\í;KתĤs â©óè FAPGíàîiw÷´«]ÁâÉYñäyÅ,M'§¦“ØB‚ ê¨Y”AVи‚Ë]Á‚ ꨸®`i:;GW0‚ ‚:jŬVVt#‚ ¨£öѸ‚ vl:ï Æù6‚ ê¨5ô\ÁÒô‚xò<º‚AÔQ p]ÁJê%t#‚ ¨£–Q¥^*¸‚¥é¤xr]Á‚ ê¨erÖêfå£2ßFqcê%AuÔì|u~ñÔyt#‚ „RŠWÁjWpà­›7lÆk‚ ² ùÿ6§¶^D©IEND®B`‚dibbler-1.0.1/doc/RELEASE-METHOD0000664000175000017500000000252312233256142012567 00000000000000Release process: Win32: 0. Modify version in Misc/Portable.h 1. Build doc under Linux 2. Copy dibbler-devel.pdf, dibbler-user.pdf into doc/ directory. 3. Copy client-win32.conf to client.conf server-win32.conf to server.conf relay-win32.conf to relay.conf 4. Compile all 3 projects in Port-win32/ in MS Visual Studio. 5. Modify Port-win32/dibber.iss to use proper version. 6. Run Inno setup on Port-win32/dibbler.iss WinNT/2000 7. Compile all 3 projects in Port-winnt2k/ in Dev-cpp. 8. Modify Port-winnt2k/dibber.iss to use proper version. 9. Run Inno setup on Port-winnt2k/dibbler.iss Linux: 1. make release-src 2. make release-doc 3. make server client relay 4. make release-linux DEB: 1. cvs co -d dibbler-cvs dibbler (CVS version available in dibbler-cvs) A. First release for this upstrem 1. cvs co dibbler (or extract dibbler-X.Y.Z.src.tar.gz) 2. cd dibbler 3. make orig B. Next release for this upstream 1. cvs co dibbler (or extract dibbler-X.Y.Z.src.tar.gz) 2. cd dibbler 3. download orig.tar.gz 5. cd .. 6. rm -rf dibbler 7. tar zxvf dibbler_X.Y.Z.orig.tar.gz 8. cd dibbler-X.Y.Z 9. Copy debian/ directory 10. Delete CVS/ from debian/ directory 11. Delete debian/patched directory (if it exists) 11. dpkg-buildpackage -rfakeroot 12. ... Useful commands: Create new debian/changelog entry: dch -b -v 0.6.0-1 RPM: Gentoo: dibbler-1.0.1/doc/Makefile.am0000644000175000017500000001041412277722750012651 00000000000000all: all-am: cppcheck: mkdir -p html cd .. && cppcheck --enable=all --inline-suppr \ --suppressions-list=doc/cppcheck-skip.txt \ --template '{file}:{line}: {message} ({severity},{id})' \ -f -v -j 4 -i bison++/ -i tests/ -i dibbler-*/ -i poslib/examples \ . 1> doc/html/cppcheck.log 2> doc/html/cppcheck-error.log man8_MANS = man/dibbler-server.8 man/dibbler-client.8 man/dibbler-relay.8 nobase_dist_doc_DATA = dibbler-user.pdf nobase_dist_doc_DATA += examples/client-addrparams.conf examples/client-auth.conf nobase_dist_doc_DATA += examples/client-autodetect.conf examples/client.conf examples/client-fqdn.conf nobase_dist_doc_DATA += examples/client-prefix-delegation.conf examples/client-stateless.conf nobase_dist_doc_DATA += examples/client-ta.conf examples/client-win32.conf nobase_dist_doc_DATA += examples/client-custom.conf nobase_dist_doc_DATA += examples/relay-1interface.conf examples/relay.conf nobase_dist_doc_DATA += examples/relay-echo-remoteid.conf nobase_dist_doc_DATA += examples/server-3classes.conf examples/server-addrparams.conf nobase_dist_doc_DATA += examples/server-auth.conf examples/server-bulk-lq.conf examples/server.conf nobase_dist_doc_DATA += examples/server-extraopts.conf examples/server-fqdn.conf nobase_dist_doc_DATA += examples/server-guess-mode.conf examples/server-leasequery.conf nobase_dist_doc_DATA += examples/server-per-client.conf examples/server-prefix-delegation.conf nobase_dist_doc_DATA += examples/server-relay.conf examples/server-relay-interface-id.conf nobase_dist_doc_DATA += examples/server-script.conf examples/server-stateless.conf nobase_dist_doc_DATA += examples/server-ta.conf examples/server-win32.conf examples/server-route.conf nobase_dist_doc_DATA += examples/server-client-classification.conf examples/server-subnet.conf dist_noinst_DATA = RELEASE-METHOD TEST-METHOD doxygen.cfg $(DOXYGEN) $(TEX_SOURCES) $(man8_MANS) TEX_SOURCES = dibbler-aaa.png dibbler-cascade-relays.png dibbler-fqdn-cli-update.png TEX_SOURCES += dibbler-fqdn-srv-update.png dibbler-multiple-cli.png dibbler-multiple-srv.png TEX_SOURCES += dibbler-prefixes-host.png dibbler-prefixes-router.png dibbler-relay.png TEX_SOURCES += dibbler-srv-cli.png dibbler-user-bibliography.tex dibbler-user-config-client.tex TEX_SOURCES += dibbler-user-config-relay.tex dibbler-user-config-server.tex dibbler-user-epilogue.tex TEX_SOURCES += dibbler-user-faq.tex dibbler-user-features.tex dibbler-user-intro.tex dibbler-user.tex TEX_SOURCES += dibbler-user-usage.tex dibbler-worldmap.png logo-eti.png logo-eu.jpg logo-iip.png TEX_SOURCES += logo-kti.png logo-nss.png logo-pg.png DOXYGEN = dibbler-devel-00-mainpage.dox DOXYGEN += dibbler-devel-01-intro.dox DOXYGEN += dibbler-devel-02-compile.dox DOXYGEN += dibbler-devel-03-port.dox DOXYGEN += dibbler-devel-04-common.dox DOXYGEN += dibbler-devel-05-sources.dox DOXYGEN += dibbler-devel-06-arch.dox DOXYGEN += dibbler-devel-07-debug.dox DOXYGEN += dibbler-devel-08-contrib.dox DOXYGEN += dibbler-devel-09-misc.dox DOXYGEN += dibbler-devel-bibl.dox DOXYGEN += doxygen.cfg LATEX=pdflatex LATEXOPTS=-file-line-error -halt-on-error user: $(TEX_SOURCES) $(LATEX) $(LATEXOPTS) dibbler-user.tex > dibbler-user.log if grep "undefined" dibbler-user.log; then \ echo "There are undefined references";\ fi devel: $(DOXYGEN) mkdir -p html/ doxygen doxygen.cfg > html/doxygen.log 2>html/doxygen-error.log cp logo* html/ echo "Encountered `cat html/doxygen-error.log | wc -l` errors and warnings." compile.log: mkdir -p html cd .. && ./configure &> doc/html/configure.log cd .. && $(MAKE) clean cd .. && $(MAKE) > doc/html/compile.log 2> doc/html/compile-warnings.log check.log: mkdir -p html cd .. && ./configure --with-gtest=/home/thomson/devel/gtest-1.6.0 &> doc/html/configure-gtest.log cd .. && $(MAKE) -j2 check &> doc/html/make-check.log distcheck.log: mkdir -p html cd .. && ./configure --with-gtest=/home/thomson/devel/gtest-1.6.0 &> doc/html/configure-gtest.log cd .. && $(MAKE) -j2 distcheck &> doc/html/make-distcheck.log summary.log: mkdir -p html/ wc -l html/compile-warnings.log html/cppcheck-error.log html/doxygen-error.log > html/summary.txt clean: @echo "[CLEAN ] $(SUBDIR)" @rm -f *.aux *.idx *.log *.toc *.out *~ *.ps *.dvi *.tmp clobber: clean @rm -f *.pdf .PHONY: devel cppcheck compile.log check.log distcheck.log dibbler-1.0.1/doc/dibbler-aaa.png0000664000175000017500000013701112233256142013440 00000000000000‰PNG  IHDRèRßçxsBITÛáOà pHYsÐй‹çŸ IDATxœìÝw`TUú7ðsïÞ’I/ z/¡(AŠu]u-«îkݵ£ëZ~+`w]qUD‘:ˆt–@ Ôt é=Óçν÷¼Œ“I€™IfîÌäùü•œ¹sç šä;'ç<!|Ì–-[°w­X±‚ï/€v‚‚‚¼ü]€1ž:u*ß_7í¼ð ^þ.¨¨¨àû‹ÀQnn®íQ’ïb·Á? °}5jÔ(K=YEEÅÙ³gù®!„FŽÍw ‡:vìXSSßU @0sæL¾«=”Á`Ø·oßU „PBB Aƒø®ôPEEEEEEǯ÷Q£FmݺՋ%pÝ?üðÄOð]B½þúë÷ÜsßU€jòäɇæ» $‘Hà×àKYYYbb"ßU „ÐÌ™3—,YÂw ‡zÿý÷ßyçŽã°T?Á?Á?Á?Á?Á?Á?Á?Á?Á?Á?Á?Á?Á?Á?Á? à» ›™Lƺº¾«ðQMMõ ’Je|pwåàÁ¬]»v¥¦¦ò]ˆ/ª¬¬wî\¡PÈw->çÔ©See%‰‰ñüöÀ/Á·.€±sçʼ¼¼ÌÌLŠ¢ø®Åç>|¨´´ 22Èd"ø®à&îÁæÍßM›6 ˜:ڵ뗺ºÊ°0%ß…º‚»¯3 Ú?h4š²}Ÿë´Ö@ë´ÖHMëÅqømä»Là‹†Yºt1ƘïBüI’O?ý&dA·ví’êêê©S§ò]ˆ/Ú´i£^߬VÃnTüwþ †²²²3ëÞªlÐÖ4j)’D (‚a1ËqJ™H.)¤"¥T$—Š"‚eŠ˜`…T$—Šdb!A ƒgÊžš;,cHüCïmæûK>Äh4,ZôêøñãE"ßµø+ŒñáÇÓÒÒ µû¸üL§ÓM˜0ïB|ÑêÕ«06«TR¾ tîÞ†1þäùÌšFmD.Ɔ+{…«Ò’"‚d®&„)æ KøílùSs‡÷Èû›!dƒAÿÑGoL:U&ƒ96÷=z4==½  ïBÀÍ,]º˜ ˆ‘#Gò]ˆ/Z¾|™TJH¥b¾ tîÞCÓô’Wf]kš1ºÏƒÓÒº÷æCâ3†Ä»pí©¹Ã—n;Ó½7þE¯×½ôÒ£ ¹¹¹|×âÇ´Zí AƒÎœ9,‘Dð] ¸¡¯¾z/((¨_¿~|âs†ùá‡eAA"‰ºë8 ¸{ƒV«ýâ¥9õ-ú»&õ¿ï6¶ŸÞ;ûb•çîü‚L&êÝ;˜ïBü[II!ôð]¸!ŒñgŸ½Õ»wï„„¾kñ9&“iùòeaar‘~ËPà[Ú³êêê>å†eï›:06¶óo ‚ H’$ù.Oá8î?ÿY`2KJ JJ ø.Çç””\ŽˆP …Ѐ@ÁÝSŽûøúù ©ð¡ééj¥„ïr pjkÓŒ1”ïB|TyùUHí$îÝï×Ïÿ¼ýhq¯pÕs÷Œ”нý/Ìrœ—_¼Œ H‚ àøÏƒ&ø©×hš~þ¾±éI¯?4ž" ŒÑKÓÈ{M¸–kÕã‡zÈ¥giµZš¦wíÚ塪@×Apï6MMM/?rÛs÷ŒŒUXG>Ë:ÖgTTL/~ »9N·víÚÁƒó]ð ššf“‰á» _§TJÂÂT|WÜ÷îqüÛǿߞ·à¡ñ Ùï‡Ý¬>P¬ÇõñíÔÎqÜúõëSSSa#c`cYò­·¾à» Ÿ†1÷Á‡àÀ—ApïÛ>z`ß©+ï<ž! ~¿‡ÎVž«¦÷`çÇn±nݺ¸¸8±ÎæðuÜg±Xžš7ò£{ÃÃÃ]zâÒ7fW7j_h¼m¤ ¢yãÉæÑ™¶‘AC‡^½r¥Ûju…a"##ËÛ×°cÇ©TªV«ùª 8‚ûï?“ùÀíiÿ}í­‘~ó¿ÛŒïÿ~jJX°ì¯³¯·$«oѱ¥x´¹¶‘‰S¦Þ=~÷íŒñšU«J E"‘mðСC­­­ à«*àXÙŒB ½9-)üéyÃÿ6wøËÜ~˧0 óâ}£Ó’"fO± êM–·Wæ™2‹ ~oÅ5kîÜS99wÌšå©Ò°w÷î1ãÆÙ§ö¶¶¶Ë—/÷ïߟǪ€K`Æ!„>xnöÓs‡Y?VÈD3F÷YñϹþ{ë®×ét/þiâ£3'Å\_gÂrøÍe9Ã&Ü! ­# Ãü²cǃ?ìÑâoîÒ… 2™ìÈÁƒ¶Žã²²²RSSmï. `˜L2NËw^RWWÝ¿ EÁYKôÜÑÁÿ>ªPɯoМ44þý~û“ÙÜé®Í3ËŸú2ëäËŒ QµkÐþÞÊS}†L–ËåÖO1ÆB‰äžùóy<"¤±±± ?_¯m÷;lÍš5IIIöð0t:íC=Éw^’•õÆF¾«x,•Akö]üÓí5xá3™/ÞÿåÃßn9ý¯Ç2Rû’­d1é!¡a¶™B1cæL[Ž÷>š¦wnÛ¦mk³ܺu«R©T© ç€ŸééÁý§Ý5qp¼­£M\d™fÏþø´ýàÙŸþi÷…·Ë Ûý]rÓÑËulD¯¸DÛHTlì°#"""Å•uꟙè°2<;¿æØ.%õúÉ£©éé!!!}““=R´sîß?dذm›6ÙFšššÊÊÊRRR:^|ùòeNçÅê€Ëznpç8îǧÿã17º ,XÖØj°}úÉó™wMê'·[°~¥ºuåáš¡£&ÚFÆOšÔÜÜU}k Ãlݴɨ×ÛnÚ´)$$D¡P8\Ìq\aaa^^ž nê‰ÁýÌò§Ž¿v÷$gzÿ©©™9Ø~+‡ñ[?䤙nkªˆ1ŠÅ÷Þ?¿ýt·nÚ4kölû ©{÷î¥i:**ªãÅùùùýúõ“H$^,¸©'÷ÿf|éÆKÛüúùŸ%"Ar¯ûÁE«O÷0Þ¾©¢T¡˜yç2™¬; uѱ#GRú÷ß¹õú¹QÇŽ«¬¬Lîl›ìÕ«W#""vìØáÅ€ûzÜL;?ùÓè±"¡³óâä¿÷Ädû‘våcuJxäõ9ìȘ˜ä””°ððn¬ÓUeW¯êtºÒ¢"ÛMÓƒ êxqSSÇq‡ò^}à‘aõ´XàþŒ­ÉÂ)%õ7/èyÁýxéwòb–ãþ6o¸}#–]9e¥Ú ÔA×›*öOK£H²Oß¾Ý[§K´Zíñ£G-f³ýàš5kúõë×qéŽÉdªªª*,,ôbàMÖ|äZ E ÇÖr.2Ò–?îÝ=5·ô¬à~üÛÇ{G¨(ÒÙÿo–‹ SÚ>Í+©ß}É8bÜõe6ã22®^¹’9cFgÏöŽã6oÜȘÍö=+++22²ãÒŽã Î;çÝÀòVcnM[ƒ ç4a#ëÎ’•hDYošîîê€kzVpßp0ÿ™»F8yqnaÍÈþ1¶O+4ßî)?õNÛȳg>xpþts•.Ú¾uë´ÌÌ=vØwïÞ1ïléNAAAJJ ¿kñà—› çê4ez¼½Šc±;wBŒ!/ëpqaÁmCúuwÀ5=hsjSS“D$9½6ëÀé«Sþ8TU£7¿¿úÂØÉ3mY,–_wíº{þ|O”ê¼S99½ãâìSû‘#Gjjj’’’:^\^^'ªËú€ç²àiW[ çê4…¼¥ÒÍÔ>TML 'ëZµï|½¢®U#Pf–ëî2 zÐŒû¯ÜõÀm¼Ø`²ˆ…”µ¤…aüprÔ¤Ù¶µ(lj$’{ï»ßæ•×®ÕÕÕ5Õ×ÛF CQQÑàÁƒ;^ÜÒÒBÓô¦7Ç!„ÞûápF}}DD„÷j€]k3æÕhеxW›Q{`19‚¬oÓ¾ü]‡P“F2ZX1Õƒ¦}}MOù§7½9,ØÙ%";O”Ì—ŒÂ½½ü䀑ÓìûKåò™³gó»àÄ`0Ü¿¿±®Î~pݺuýû÷·ïãne6›+**¶¿3Ùúé³÷Œüïë÷z§NxÙ5éTuÛþ¥ÚÍÔžDdF‘%ZüÒ·YÖ[4iõ!ƒfÜùÔSfÜ¿øÇ÷;=ÝŽ**oš?%!ô醼°¾#ƒƒƒmEDG÷ëß?,,¬û«tÆxÓ† f£Q(¼¾ògݺu±±±R©´ãÅùùù;ÿ=ÝÖ',HÖ¦3Ñ4m;@ ¡AOŸ¬j­7áÕœ[ dP¼œÈŒ"/ëð{ÿ[aËéBHO3,×Yx EtÞüƒu³ vã/ÖÓzDp7ÕÚø¨ '¯?_Z7¸o$Bèç}EIBRt/ÛCýRS…"QRŸ>)Ôi»vì˜4eÊ={l#¿üò‹@  íxqAAArr²¼ýâþYãR–.˜÷ì§¿t¼~JG3Êš›i¼®ÂÍuí!"4;†¬5âÿûî'ûÙuÑl¶0§ju¿UéžB"¤á}ÂäÎÉɫӜk0ÒÂx!•g&…ªÄ<¤èÜ?}q惙iÎ_ÿˉÒW{0¯ò|½8}ØÛøØ‰ËËʦMŸî]p6//4,Ì>µÿöÛovò'…k×®©Õê¥O;nOK ßü´r‡ÁÂn+nd0ÚìînÔ !z ž2±hñÊ,šqlÙ¤Õ넪í—ßPº¯ R5ZSß¹ýC z:·Î¸ò ãN)¾êŽJ)@U“*\áýWü5î:®¡Õéìt{c«A­”]kÙ”Û’>ìzËöéwÞyþìYÞS{mmmÙ•+…—.ÙFt:]qqñ€:^ÜÚÚj4×¾ÒyLÚÂbp½z$šå66p­.gÝë×.¡Ðñá¯ÚÒЦëxA“FGjgDSaR !$´›n7³ÜÁŠÖ å•Úc¤DœQ’ù‰ÐÜ?~qÖCÓÓ¿~ÃÁüIþÜ^:jÂí¶A‹Å²÷×_ﺗç &“iÏ®]­ÍͶŽãÖ¯_ŸššÚqC*MÓeee;ÞÒé­Î•Ö ïMð´B Ýcôݹ: …¶Trz·¢2I »z‘-ÿõ𵆖N¯iÒèCTíæÔÓƒÉÞ2|îr…c=í/kÙtqï-„oèöd6ù¬Ç×ö‚¶¶6­ž¶?ýô–šµ¦Ï7Œ½mž-Ôr'‹ï½ÿ~~›?Ú6¤Úï(]·n]\\œX,îxñ¥K—v¼Ÿy£d¾õ·¢ÿm>å¹jà5'«Z£¥Ä¦J®ÎäæßÒgÇ‘bÕ“Çó¯ÜèšV½Q-—’gÝn*&Æ„àæVíú#yÃûÆÙ_™W«=ZGW®C ôþ`i‹ÙoÎ^ÝYÅiÛýcÞE‹Ñ’=9/Ì™ÌSQÜ?zá·g¸0ÝΰܩRÍsï®ÿËHäòé3ftìÖâeûvï3nÜ‘ƒm#;vìJ¥jµºãÅ………}úôQÈ:osª zxÿ莓ôð;%Mú*­ép=W¡w3µ%’Äþ³E»r/Ýè!EL‰ç0ÈŒ‘ˆD³¢qŸoÞ϶_y[¯§së GêÛ-…ÿßø ËÍú!‘*I‡ ¬>…Åø|­F&¤Š´&ûñ()‘ ÃG.–æWÔðU ìàžóý"Ôò[_ú‡÷Vžš1Éù§|µå¼¢×à°ðpÛHÊ€b‰$!1Ѻ ©±1ÿÒ%ƒVkikk+--2dHÇ‹5N§{k~ Í´{§KÄ‚¯÷Ú÷}€_ÓÑÌáò–3Þ[ëfÃÅp11=š¬0à·Wn¿Ée÷g 7 éP=W¬Å¡qad˜í>ŸSTfFhyËÆ Æd·´])@÷Ç b•’ÞAÒÄi¿ôOJà½ü)‘ÉLÃ;9µM±^O_i1ì¨æ í÷ L‰¤‚Åè³MG fZ%“ÜàÙÞ°Áý­Ç&ÿí®áο+Úø[iŽJî`=~|UeåØñã=RŸÓ,ËŽmÛ8†±­lá8.++kàÀ·–Z,–+W®Â2 °Ñ,·¡°‘"Ðw›?Êh^/ÒÀ Å+Ö3Ü £ÿ”Á)sÆ Êkù}R¿—ŒHBå5õ«9n–;S£ý­–®6^¯†$Ðëi£AQJšåþúÖ‹Ÿ{T×ÖêN¹®ŠÅï,[ÿúÃw;s±…ŧkÚzIKŠÚuÔ‰”Ir|<ÿrÞåJÏ”é‚ÀŒw+þ9w@|x¯pÕ­/E!tüRõ‰r”<`mdú¬Y—.\¸mÚ4Ïè‚MYYsæÍ³âkÖ¬IJJêxè©uCjNN¤v °a„¾=W'§ÐÖJÎìÖl;ÐìRL¢vhÕntÙàÄØÇ§Í-©8\Ï!„䔉X ýåÖƒlû¬ßjfNÕŽ5´üjŒJcfFÇ“ñÎ7?­øè=¯¥v„Пÿ¾`×Ï?HNå¢su„Ñ›§Û¥v’@™‘ˆ5›WîÏñL® À÷Üž<[R÷êƒc¼¾´²åç#uc'ßa±X,{wïþó#x¦@:p`È!Û6m²lݺU©TªT¼')..NLLìt¯*É…:M¬”ØVÅÕ›Ý\Ú>%’Œ–å,.¿Ñ5ñ!/Îrµ®éе¾Ì5! I#C½ý—»l—¡µ Üýúö]Ûû(ˆ’fý˜^ÁruÏÓ/š úÒ yîUë†ÃG‡„Gýe‹3×hÍmÆM•œ©}ÿʾ B.$õXðï'æ[GDh-èD•öTné/‡ãÂÕ˹½“;zF w–e—l<õöcN^ߤ1~´±p´¹¶Žãšš›'Oz6Ï{ÿouÊh0° “}ì˜mäÀz½¾_?ÇcPBÕÕÕr¹|÷îÝ^,<¨ÖšK› §šñe›©=YI &ò+j6;{£kB”òWï¦1˜öëClûæ7àà ,BBÍa¶ Ñ=q‚ø iŒR’6züôûùì忹W­ÄRÙC/½õÊý³œ¹˜f¹3µm‰jYy‘Öá¡b-.ÖvüzY„L€fJ¿TîÕ&3Üßybò£³†ˆë4d¢™·Vœ3eŽýÚŽãä2Ù©ìlÕè¥òzú¦¦¦«W¯<¸ãeZ­¶­­íÂ… ÖOY–-//?¹êÕkõšŠÚ6±ˆ²þ-ËD3Ÿ¬:,“ɼR;ºŸÆÌ©h©5ᣠnnH”3¢É«z¼pí¯LŽ/«ojhÓIEÂ×î&PÛÄ×Q¢ôrª„ PZ„ÂÄpzþµþßÃîUëžG^y{Ë÷_½ùàlg.ΫÑHâ哎©ýæz5äÔZÄÞmûPÁ}ËâûÃå}cZ+Âaüæ9ƒÇN·-g¦ÙîPR«kOw‹ÅÒÒâxXhh¨õT¦Nˆˆ°~@Ótk«ãŠ.Û£!Fc2µk<$‰‚ƒƒmŸ2 ³yóæ´´´N7¤–––Þ;6òŒ±Ž)26\©š:,!"DNþñ”­éÍǦ~±Î'Þ“ÀU,ÆY…vV»™Ú…$šKj-賟68ÜbdrüßçM9x¾xùÞì¿Ï›¢Ú\E´ÐîLê1ZY©1MM %âßËVÿüÅ"£ÎµX܃ÆNK¥'8µ ášÆT­5­­à,®ü‹¦(‰AÐöœ ÃÚŸ<åiÜÏ,jwÎå>:ÑÉëþ|ºwêxÛ”6Ƹ´´tðàÁ¶d¬×ëÏŸ?o×Ç >Üö¨V«-,,´>Š1.)):t¨íQ³Ùl{.BèÊ•+öw6EEE¶G£££+**RRRlµ8q"##Ck×ÿqÍš5ÉÉÉ6sÌÏÏÿôÉáCS¢È’úµRÒ;BõëçžñŸüW€ïø4·6IN¬.献ς£?6¤Ê(ôÙÖ}M½ýCý{G>7g’…eÅBá™cÓbwUsUFwR{Š’¸ÚbÛ[-R¾øzcMuYá Ïuêv2¥êþç^}õ;¹ØÄpçj5}CåÕEç_‚D(‰­ÿf_N¨ÒÛ«$¸Ó4ýeÖÉ·NíK¹D„ö ˆ²Ô××O™2%&&ÆvÃ7¦§ÿ~êjuuõÌ™3Ãÿhñn6›7mÚ”ššj{433322Òv·M›6Ù‚¸Åb=ztß¾}mfee%%%Y?6™LG?¾-Ö_ºt)--Í>µoÞ¼9$$D¡PtüBŠ‹‹ããã‡÷‹vò ¿ï¶Ôw—Î|‘ƒÎ3€)iÒ÷Uûj¹w7¤Ž %âåÄÞ¼‚¼Ë×ìÇ{…¿r÷í5ÍšaúD‡E©UG¸"­;¯¢¡¹½¨$µ,J!:aÊÄ;ï^óåGîUëžÇ^oýן:¹HæLM›D@¾pÂ…ÔŽRUœ:+4´i½Ü$½½þHÆßæ—ˆœz²#ûj™^Ÿ˜l±X,qqq¶ÔŽ1Þºuë¬Y³¬‹dôzý€l©Ýúh\\œu‘ŒÁ`èׯŸ}j?wî\rr²X,F%%%555Ù§ö¼¼¼ÔÔTëúŽã***æÎkKíÕÕÕåååö3ë{÷î5›ÍQQ×ßcØÔÖÖJ$’åÏtæ«¶" "&L©Ñ¸ö?(øÕh ÏÕi 4øB››©=^NŒ #+Z–ïm·hV­½~o¦ÑlùU£R¨Ã¢Ôª ­øT³;¯" ЋÄÁáÀp¥‘aïyúÅ¥ÿ·À½jÝ3|ò4 m>{ô3—µëõæoŠiÆ•¯5\‚Ƨ&ýrÊ{C°Á}ÉË3GôééT×ö3Åõû ÌÒ‡ÙF‚‚‚ÌfsZZšmä×_7n\II BH*• …Bûu,»víš0a‚D"A‰Åb@`ßæE¯×_¹r…¦ië§{öìÉÌÌ´=ªÓéÊËËF£õÓÊÊÊÌÌLkÄGiµÚ£GÚ¯}?vìØµk×’“¯¿Ç°¿UssóÆÎv½´ÑèÍö«çàã,,÷ë•æ&ïs÷„T …fF“µFüîÏ;ìÇÅBÁ÷eJÅÂÍR=ƒ®èpnIÅþ:7_åÓQ Ê F-^‘õÝûo˜ ú[>«»(‚‚ï~òù%ï¼æÌÅ {¾Ns¬«3¹ö¥¯±bõ¡SìÏ«ò(¿_*³÷?Õ·èçetÒ!±£Š:Íw{+ÆOmר´´Ôb±lß~ý¤ß~ýúÕÖÖZ?.//gÆþÑþýû×ÔüÞú§¢¢‚eYûGB±±±Öt:T*ýõ×v[¶móúZ­–¢¨ãÇÛ""11Ñ6ûNÓtAAÁ AƒP Ô””ìûp¦3_u»'²IÞb)<|Æè›subb{çÒܰ I ¹±$I %ë·›hÆnœxõžÛ£ÕA›ªP“#„rš0B±îÕ9@E”·'Ä…Hä_^ýWEIáµÒ"÷nåž¿¾õÁÏŸ/tf‘ Fètu›R$8ÙÌÜòb{ÌÅú¾qÅUõîÖØUþÜ[ZZÖíËç §º¶·é̬½8îö¹Ylk`lì×—ÛÏ[Ù¯3±_!Ó‘B¡ètaº•R©´ïöØÑš5kRRR¬ r\ºt)ëí©Êå?˜¬Þ{qîD§ÞäÀä7hc¥ÄŽjTr„ IDAT®ÍâæƇ‘1RbˉsWêšìÇÿ߬ŒqÑÛ«ÜÜ„j/TLÜK¥„ÊÃå¢I³ï9uúÞ «¢ã»x[ç¥ÓÖÜxéÔ g.¾Ülh6Z–_a8W¾n™Ý6nÈâõ{Ü,±;øwp_øì¬7ÿ2á–ÝT¬^ýöh£‘Ú¶yÃ-¯¤-¬P@a„,V,rª%|·kjn ”Ëå*--íÝ»wXËû!Û ÍmÆÉÏþØÀã tQ“>¯—¸µU!/'F„Wk›Ö9c?>kdÚøÔ¤cœÛ§8ÙIôl?‘T@õ S`„Ÿ¬×hæ<ê½ã–B&£aÙÂ9s¥Žf.5hÔ±M´k/Ñ«¹`W~£ÁìâÓº•w†ãœxÊC…9É¿ƒ{O£×ëö.šîÒ³*êÚ²/Ve_ªÌÕG¥rj /x÷͹ÚH1±¶‚eÝš'šK ´dã.š¹žScB‚^¹ûö˵9dêêl;J&*5ÆŒ¸±ë+x½¯¸I¯13ß•º¶YÀÚ¸ýÛýüaéÇÁã8ª'í³dY¶¸¸xïâ;ny%ƨ¨¢ñ|i}Ym«ÉÌô›û÷ÿýãÎñð}%ÍúX)±»Öý¥í#Bˆh)±ýä…¢Ê:Û L,zíÞiz3½GâÒ ïN…‹‰Ì(Š"‰SÕm]½—W˜nO-ëê?©ªâÔ9‘ ¾Õ{‡¿Þˆ÷ªªª¨ný <—.]0`€PÐùÒ ÊzÍÙÒºÂòFŒ‘€"úö ¹ç•¥qq^=†ÝBG3gkµ—u8ßÝ®í¡"4.Œ,Ðà5‡rmƒBÿ˜7U­”­»F˜»Û’ ÐÞZwü„Å(_ãZ¹á4*5éÿÖìòPI.ñãàž³ò¥ø¨žÒüòå˱±±ÿ{¢ýàogËÏ_®7š Ã&Ũ3Ÿúô¯©©v¡€¿à0^WÐ( Û]Û$šÛ‹Ò1hɪõöãsǽ£Úý³WTèqE·Üȇõ5V¬>ÏWãv~ÜËkÛ&î3Ê $I®|ázC÷ßΖo;Z·;ðãàÎpœ“Üý˲EEE»Ý*ªhZ pßÈo6çÂ,;xïºÜlæÐñÆ.õl2ã…ëvÛ¿0grLòS9vïìÕž©WsÁ¯ùMzŸÛøqpï òóóû÷ï_߬_µçBBTÐן …|8W§‘ Ж2Îí£·G’ }»ý Ͱ¶ÁÑý†õéý[×âC´GæÅÚ:qKÕºû§t‘4nwÁÝw]½zµOŸ>}å {Ni?þé°T*å»"xJ£.o5f7ázwwŽÆË‰d%qöJåÉârÛ H(xlÚØ²º¦3­~ÖÒãÚ³Ã{/9íÒSlù¾‹ ÞÚ¸ý;hÜîÀ_ƒ{ss³Z)qé) Y˜wÄCõt»Æš†ÐÐÐáѦw¾Ý«T*ù.Äa¼£´™æp¶»‹dšEÖ™ð'Y{íÇï™¦Š·Ö {Ô™#ób»’ÝU§Î‰…u>иݿ÷Ë—/»Ú rÁƒ#=TL·ÓèÍ W{äŽÓ^\Åw-ð¸‹õ:¥­*s¿%ú¤RJ¡%[ö9ÿª¦6’ Ü;{Õ¯¹Ý}ªq» î§×¿Û?!Œï*<¢ ¬qí¾K_®9¤V«ù®§53%Íú³-¸ÑÝE2ÑRbP0Q\UwöJ¥ãÍF„”"ZP ïîewŸjÜîÀ_ƒ{E½&stŸ[_ço¶)ªmÒ}·úÆ=ÅOù qÔÝE2$fD‘ úpþŽj f„4àŽgLˆ²}\VUÛ]·e.0ö÷Æíü5¸·jMba@ý?haØÿl89¼_ô3ŸüÂw-ð’ò6c”„ø¥†cÜáD‹Ð–çŒt']c"‚•!Q懩‰D¢M*rìk' fKÇë¥b¡±³qEr×HKuÝ3÷oÛºjVï´óŒK;\}°q»¿ îÿ~jÊèNuòuÍú/³Nþmîð1O-ã»x ‹ñ‘ж .Ò¸™e$FVèñú#g:>* ž:ª²±¥X«rïþ±RbBqè|}EC‹ýxj\Ôˆä¸]¹ùZ£Ù~<=!fHR¯'/ÌíÞEP$9gLz›ÖPªs­¹ˆó&n©r²käÄ6ù\ãvþÜÿùèÄô>‘õæ»ns¹ªåÇ]ç¾ßš+øß~Äba##ù®\WÒ¤— ЦJ÷g G…R mØ} ÓGï›88n䀨@Jí®ÔgÌÿn ¤vže±°aa}^yåý®ß cŽa:Y \Âp8¯NW¢Å îîI‘h˜š¨kÕž.­èøhߘðéÜi%Ük O 4^P¯7Ñ?ìi—Ú…ê¹9“.–×ìkŸÚÅBÁs³3rK*:¦ö¡}zÝ>´ßÁ±E¾ÉÚ¸ýÇý9|r ~9ŽûûýcfŽKNOŠà»–nsª úø…kÿYŸCßµ€@Æq\CCßUø4Î'»›eË>jhh€]û]a4š³³ ³³×¿þúBëȇ¾æÞ­†9}:÷“O–%&öí¾{¢+-1‰N4¹?Ý>LMIôý¯G;>$¤¨§ï˜P×¢ÉnT¸wó±ad¿àÈ'/L”l?>ª_|˜J~üÒåÌáìÇÇ HTÉ¥WkK¦·—ˆ„3GÜs¦ðª"ŽJœÔ•u2ªŠ“$âºM7Öã þ܆y~þ˜û¦¦¦Ä…ò]K·9œW^TÑôÑÏÇù.>¹\°|ù‡|WáëBCÝüÝ<íÿû·L&›:uªýà®]Û;½Ød2®ZµÔ+uñ¯°ð˜1iÎ\i4š³³ ²³ ðë%rrÜl„ ÓéV®\¬V‡¸w`s¢JÛbÁMîN·¥“WtøRE'=Uæ´áfÜZ$''F… 6ƒyt¿vk«ÄBAˆRÖ¬5d¤·Kó‘@­5iõ“µKçBj¥¬Yg(V¦to;Ênì$.A£öñÍÆíü ¸›Íæçæ}tæà„h?;ª÷&ve—6¶ßûá0ß…€!4ÔÍ=I„¦-‡gK¥âŽY,Lÿþ}ƒ‚:î0ϯ/¿|',,¬o_ggv{õêAoÀ&LâÌeݘÚ[ZZÖ¬Y©bY?È>®Ñ@ËH" žIv³K‰D٥Ŋ WÏ“~¾ UÝ Ë šB8Wî°´]%“|øøÜ=g WìͶQÊ?6w[ö…µ‡û·L>àÁÉ#öµ)Ü{ÿÐE ±Qδ”ék¬X}¬€aýà§½¯ã †çîÿ·yÃcÕ|×Òm6*@½ñu'ÍVB„X,ît3 A7Údb6Ó§Ïòpià†>ûì­^½z%$$ð]ˆëÆÔ^__¿aÃÚèè`Š"Y_]©ìG‚$B£s ·ï@ÄÀPɹ+×ÇIò©;&´êŒGÜéßB(CÜÔ¬¥Vî?i?N ôôÌ Z£yõÁvÛ7 ‚ø³&Ö·é6És¸Uï0õƒ“Gk&Ü>XÊ ,Sâ‹*ýcA©Ow­Vûüÿ~ßèð`ßµt›Ÿv_ ’þuQçäxˆP(ÈÈåÒSÌfrîÜG&Nœæ¡’ÀM`Œ?úèõ”””ØØ€jþëeƒ9'§{R{eeå¶m›cbÔ$ ›²ºËá#³ª°µ+7ymx¸Z)w¼cDjRTØ–J޿܉Ë}Z zǧ¼µb»…i÷þlÚ°i Ñoÿ¸ƒn?>käÀ¾1áo®ØæpÔ¨P@=;'£àZm…øàÌt»L€n?Ô—·;ðÝàÞÜÜüÒÃS_ùÓXµÒSý>½ï»­gúÅ…>øî&¾ Œã¸òò2–5ñ]ˆ‰Ð]w=6~üÔ[_ ºÇq‹¿šžžÉw-~¬Sû•+WvïÞ ­º‘ÁÂ6™.Þ¤ÙÄö m·8J­ºw°cùW®RñnÜ0IAÌJXÑÐòXæûq‰HØ7&¼¶Eóà”öãR‘¨oLXUSÛ_níp«È`¥T,úUÃÃZM롪Î,’‰m*øµ Ig2ßòÊN©•r/Oøhp?÷ãÓŸ¯ÏYðÐx…LÄw-Ýcô农qé½ç½±ŽïZ@ £iúƒ^ºãŽ;E¢ùÞáŶm ¤v^0ŒeÑ¢WGŒ8ݼÏl¶tWjÏÏÏÿí·ÑÑÚ»™‘a«´]m©Yg`¢Ôד1Г3Æ›hËQÛ|Ð!µHŽ›2(yáº=©@è©;ÆëMt¢/òá ®4nWJ%/ÎòÃޯݖÞí…Ýœo÷CKþ²vߥ>:Q@È)&šY¸ò蓳‡yjßµ€@f±Xn”Ú-ËÏ?/úÖ7;0Æmm†§Ÿ~®c'™eË~Oí¼ÖÃiµšO?}kÊ”)R©Ô™ëƒ‚TçÎ]ôtU~*>¾·Jõû·SûáÇJK #" ™¬G˜Y®VO·˜ºÜ[LŒP $Â=1}Æø4r'µ§(‰i)ý>ÊÚפÑÛ«d’¿Íœpà\ñé’v'³ª²'ï¿óÔ¥Kå5·ºmh¿ôĘõׯ­­±Þ.v¿q»T$üû¼)«*\üT·vK>ô»|Ïm?Züæ#¨@Ù±®3Ò‹:öÂüQCýŽïZ@ ³X, ¾<~üøŽ©¦éŸ^–’ ÁÝŠãpaaEzzB§©]$ú=µ·¶ê%²TÏ/<˜uøðáÛn»M,î¤Ñ~§RS‡Ì˜ñ G« n§ö={vWW—……õ ¦ø^ö[E«Î‚õ–®ÎH·š9D ¥L2(!vHR¯}uœÎõ5åjÊŒÀ mú;F¤Þ1"Õþ¡„ÈP±P¬|ã>ûþZDRT(E‘ñ!íÇ‘X(ìz¼™¨÷áþ¡¾¦Š5ÇÝiÜ. þ>oêæãçÎÿû OvK¾ò»|ûÇ:xºìõ‡ÆÌÖ—­é“5'>]¹öW²¥v•Êqb R»kjOJŠÎȘçð}jokÓ³,ûÍ7гÕKöî]{üøñiÓ¦ ….¼YR«ƒ³³wz®ªàö^ÒíÛ·µ´ÔªÕŽMAw)m1œj %¨N$b1f1Š‹yø¶Q×j/Â]½ƒ€@SšºVâbYµCAqj…T|¢àª¦ýÒÁĨP©Xx,ÿŠÞHÛ$1n@bECëOoа\8`J‰/t½q»€"_œ3yÏ™‚Üwÿâ‰Âœª¯¶—õÁü3ŵ/ÿiÌ­/õ­†WŸX¶í”ó³G¸á–©=9Rû﬩=1ñF©]`Kí ©Ý{~ýõçS§NeffR”Ëûš É‰'lܘe0´Á‚1O1XØ“5ºýµìôˆî™“f8|ïø!b¡0›q9µ#„ÒMWT²^o®Øæ°„=64胿Ì^wøôöœvkÒ"CnÖoÅÞœýg‹nõç)#I‚ØoöåÉv··S$ù쓎å_9öÖŸ=Q˜“øÿ¾ê».Wµ<{÷ˆ[_ê'*êÚ–m?»tK¤vàQΤv‘ˆÿïq_`Kí“&Ý(µË¤v¯»xñìÏ?ÿœ––väȾk!T__Dz:•*pŽOñ5¡ƒå-Ê)…Z»¼3ÕJoáRb#4p­´Ë9UEdDõ]¸v·CjRÔ³³'•Ö4î8yÉ~\$<;{Òù«ÕS{ZBÌÌ‘©;ª±ku¼)¶©`wA³«Û ‚xrÆø eÕ^»ßC…9‰ç_êß/˜ÝÔfüëì¡ü–ÑŠ*š6Èÿߦ—þæ €«ƲhÑ+ÚqóÔ.^Oí ûí·Ú½G"‘Ž721Ñcb€'deDFB[*ºX¯;VÏ4šq/­>3Ø9r!ªI«?ÓâòÛ­H º=½\ÖnqËð¾qÑ!ª­ÙçoÚ®Iù˜þ ! ÙoK§ ëo?.PsƤ:_R*éãÞWá)J¢—H½ÆõÆí¹môµ†–_þ~·'ªr Ÿ¿×¿zé–ÃM÷v'ÏÉ+®Ý—{uÉÆ“$ ]q€obËÂ…¯Œ;öF©½­M·oß^jó5cšffÌÑYjÿZ(AjxƒÆÌœ©7­gBU¼ÑˆꆴÐK†Zh‰«\HM 'ÍK|dH|dˆÃ£A˜æ¶!ŽG ‘aaÙÌö©Ýª¾UwAÚum¶ý&g*MÜRuíÙá]¹¹µqûÒ}Ù®Öø@Æpɼñ™Ù]yõîÂ[pÿôùL…Lt׸d¾ èvGÏ_;WZ÷źl¾ ΖÚ;žPc±X`®ÝÇáÂÂk‰‰‘“&Ýåðвe_ …¤v€wp,oY_n±¦FŒëG$u®\ïÎ8Œ²®qQÝd{ÉÖt:Þ +¬n~ RWŽ[B©*N^”Šk]lÜ>gtºP@­x8³+/Ýøùí¾úÝ»Cƒ¤ÓF&ñòêž°çäåêFÝÂa™&𬛧öU«¾‡Ônƒ±ó©ùöÛ|Ôè)NT¶žib‚…(ؽ…´"œ›ŸÇ•éo}YO38%%¿û³k­¨¦ í¬úïªÊ <ü‚çhÝä‘ý08§n>\ȰÜ[ßà»à µ;c\P©à+ÎÖéôFK´çBKĈ ‹q‹™Õ˜¹Zƒ%!4(_õҷ~®Ÿ"Š‘¢ ,$®6µ©D”BH*E¤RD1& ÄbD T]ÓæRãö‰ûöëùñÝã>²ÓÔNQÚà†Ì,®70õ„Ð çØIÉ…¤€ „$!¢!EP! €t<ÈcÄp˜ÅˆÁcdf±‘álqßÓ_‹Û£BïŸ8üÕÛÒ>8ÙŽâmÆ]ÆËëv ÚÂ.\yô/3OøÛr¾kΚÚG ©ý–n™Úƒƒ!µòÄ jj‰D|×@÷QÈž™•ñ|Æ@©à&ÇQù¾fÜ}}©LiUËÓW[µ&„Р>‘Ï}¸144”ï¢@OÁ²ìÂ…/wšÚ†ùé§¥IIÑźÒ6PaŒKJª µƒÀ£PÈU*¶_#Iw¦9Žã8Å›o~äø—@ü”J&ynÎäg&¦ÊE¾žÚ_ÁÝÇ;B9WQVÛöö·ûèŠ ¼í–©!tôèE>Jó9ãæfÍܹã;¦öåËÿgKíZ-¤và¾üòm¾Kp©™XôâÜ)«œ|sÚ`¾kq oÁÔg;B¿PYPÞøÞ²Ã|z¢[¦vë ™´´>ªó-Ö2'¦ušÚI’°¥v“ R;]eMí |© ±PðâÜ)ŽœÉ_ô$ßµ8‹·ø”O6–ɹTuþr¤vÀ ëºö‘#GvšÚW­Z ëÚmþX×1yòÝuHí4¤vºÈ–Úƒƒ:à§„õœÉ;O]<ûó]‹ xœq÷¹àž[X“[T³ðÇ#|z"kj1bDHHˆÃCÖÔÞ§¤öß¹˜ÚwòQ#ÚÚßxãCHí `P$ùì‡.”œü×#|×âþ‚»"‚¯—îT^qíñ ×>\uŒïB@O©ÝyÖÔ©oà8lMíjµãO'üAOÝ1þtéµ# ä»—ÁŒ;B+­;œWþñêã|z"Žãn’Ú—/ÿ&11 !d6[ø¨Îç”–V'$DN™ÒIj'[j7ôÒ¥ÚèŽÃ'{ãÅÚAÀ zlÚ˜Òꆽ¯Ìç»wðÜ…Ê(‚aö†ÇêzÍ…+õûN]ýt ¤vÀŽã.|yøðáS;B¨©©I­V´¶ê¼_˜ÏJLŒêt7*Ajµ-µ›!µÐE¤öÕjè† Ç“G4´é¶¿àø{Ä_ðÜ 8(mNë¹,¾ °Ê/kØu¢ô‹uÙAð[ èl©ýF§DFFÞ{ï£zu‚ H’"IR ±,Ãq,˲û_oxHíÜÃ0n´6†ÔÒ¼±ƒ9oøÛ|â>>û”ËãÇÊOòز¨¢iûÑâÿ¬ÏԼϺBæ&©Ý‚‰$$I54Ô74Ô¶µµp6™ Z­6""’ ¹\Ʋ´Ï·noÅŠÿ²¦vR{€;uê¼X,æ» ?“››ûÈ#÷»”Ý9³¬u… ¤v8#C+›Ú¾ýó¾ é^"ˆàÁóëûñ1ÉWr­yÓáÂ/×Ã\;à5µ6Ìk© ‰DÞÐPWX˜M($$,44,11Éá2“ÉX__WTt‰ ÈþýS …wÊsÏŠÿC©ÕJ„Ng4 µ²ââòAƒEGGó]ˆ?Y·nD"t=µKßxcqHˆmE ñTšÇ· HctUC7›Ø:ƒ¥æZͬ§_Ô×IB)"•BR)¢dB2XL)…d‚J„Œ¿§vÄspGHÜKž0Nõ¨—_÷rUËúù_eå¸wæ3]aMíC‡õbj'…BÑáÃ{CCCGŒ}“+%B?ó IDATi\\B\\Çq¥¥ÅƒaÈaÞ)ÒUÚ{”æf½\.‡Ôî’£GšLZ…BêüS0Æ&“àí·?„ÔÞížÑË;ÅäÒ˜,ïº<(L$&ã”"¡2 ­µp F¦ÕÌ6Ù#ãQ½!•˜R‰H¥R‰H©€ •RA"J*ø}ÖÄb½…ÓÒœ–feÄI”X@Š…”˜ „‰Zžƒ;BH5`–©úkÖzí¯Ö´®Þ{q ¤vÀ[j óÞïE‰DvàÀ®!CFH¥Îþ 'I2%¥¿Á`ÌËË:t„GËs¤öÀ T*++«ëën~ÙèÑ㫪Š'Mšäªõk—.‹Š ª­mÍÉÉuòYðí·?ƒÔî A oåÆ0™hÛ=ìG ÖÌr:š}ûHEz¨$D" HÄadb¸f«¡9…­70zkÌ,Íñ™ê „ÔJ.$•BJ)"U"R)¢”BR!"ID „,ÖZX-Íii8IÈ„”D@ ©@Èå·Äp'…’ ´yͧòÎËUÔµý´ëü’9Eyç°Á˜‡ÔŽ2´Q©$)‚ -–ßײS…ãk™Lä½B©=`DFÆ|ðÁÒ›_c4?üðµ3fx§¤À`2™¶mÛŒ }ç¯ù®ðL&¤dBJ-®˜•b?ÎpØ`aö™½WÓär!©’"Š „2X83‹ §¡93‹ikiÖÄb ‡-,6±œ™Å#ãN£>€$HQ!"Š”!Aˆ(B& åBR)"E!R)$ Œ0‡‹±–æôNCsZ »xR‚D@Ф˜‚ÉV„|!¸#„¤½†‰Ë³Í%ž~¡ÊzÍòg¿ÞxÒ-ötÆÜÂ…<¤v„A}ú$ÛP”°ººââÅS:!$‘HúÅÆÆËå ‡]IIížÈ»+¾Á…„üžÚõzÓ÷ßÿÂwQÀS0ÆŸ|²`Ò¤IðR—¬\¹"2R ;¸À- HB%¨Ä‚wõïø(Ëa3ËYXlbXãç÷•Å*„ !) Iˆ(BL‰H‚ D"‚ûcöÇú1‡‡1Ë!3‡i[Xlá0ƒ±ÁÂ-̈S¤X@R!¤¬oàW§øJ~ |oýÁ0çÁ-U Úï·ç}½1R;ð>Œ¹E‹^2dˆ÷S{G° à\~þÛˆÉd,,<ÛÔT—œ<0<<ŠÇÚnnÅŠo0ÆÚ{ޝ¾z/==].—ó]ˆ?Y¿~­J% á7è*Š$d$…„( B›: ÷ÀË|eC ˆPôê¹û×4é¾ÝzzIV¶PçÆo³¦öÁƒ‡‡‡ó] B1 £×w²«„e£Ñàýzœ©½§Y³æ+©TÃw!þ䨱cF£F*Y?eY.8Ø'~캅¯w„²_&%óH§¤ºfý×›r¿ÎʉDž¸?7Á{jïlNHHINN ÿŽ (A||Jß¾Åb‰í"‚ ‘×öRÝÊ?^Oíz½ R{ÀÛ½{uEEÅ Aƒø.ÄŸTV^»x1/8Xfý”eY¡0ôµ×>à·*@7ò¡?¥¤ bÒ?ZÏo2VåuãmZ _m<õuÖ 8¶xï©!DÓL[[Shh»‚ƒÕ c ‹´X,Ça2d2YPÐõ7ω¬°ðB||¢×KvôãßpÜõÔ®Ó!µ6“ÉxâÄ Øê“É´uëë†T„Ër$¼`Á‡öïÆþ·‚;Bˆ)BF¬P(þÉ·ëU¾wâ#xãÅ‹_KKKó©Ôn£R :!Äq\[[«FÓÚÔÔÀq8**F©Töî=ÆGNlqHíZ­qÙ2HíÎl6?~6¤ºÄd2mݺٶ!Õd¢ž{±ñüVð_îVâˆþâˆþ!Ö¬¥›¯ÒÍetK9£­ãh½Ã•:½xÕñ÷ß^Ö+¥³;àAãÅ‹_MKK‹ŒŒä»–[ IR­Q«Cââø®Å¤öžéãdddÀ†T—üôÓ¶ ©f3õ䓯%&úÖQÇ€îåÁ݆+¥Ñƒ¤Ñ¿o˜ÃË™µœYÇÒ:άãhÝšÏ?xÁß{º—ß:AÏô¯=ÓÒÒTWWÍw!~Ìh4qŒ µ÷$Ö ©°¸Ñ%YY”J¡uCªÙL=üð ýû§ñ]À³ü,¸; HŠ’SÒ`Ûi¨¯|5™Çz@›8`@o¾«ðoÅÅW›››Ðï©Ý°lÙ.¾+·nÝ×"‘6¤º$;;[§kV«å!³™œ?ÿ¯ƒà»(€Çùwp$Hí=ǶmËOœ81lذÂÂB¾kñZ­öìÙÜèè`„ÙLÌžýÐèÑ|ðîßb0˜0ÆÚ{ˆüüó ±Mß…ø“òòÊà`)Bˆ¦‰ÌÌù“&Mç»"€—@pø†aW¬ØÍwÀ{ÄbžÛú£ÑT[«§i4qâ™™sù.à=Üè6C‡ŽÍËËæ» ÿšøôÓïò]¾Ž¦¹‰oŸ3ç¾ xwºÍèÑGžÈwø™ .QÅwþ¤¦¦.-mÜ}÷=Æw!oƒà€7¯¼òMÓ|Wágjk«ûò]€ÜðF  Â[_ì$%Á)KôPpF~‚;~‚;~‚;~‚;~‚;~‚;øÿìÝw\SWÿð“Å {ƒ‚ƒá„ (n­ƒ¶¸58ꪣ¶®âj­ÛªXW«Åþ¬³âžÄUµÖQ7¨ˆQAq2Y2Âȸ¿?ÒÆ< "ÉÍ…ÏûÕ×óJî¹ãG¾œœ{.0 w@áÀ(Ü…; p`î P; w–‡caaáíí- ·lÙ’ŸŸ_É!•Ÿ°âv‰D²iÓ¦Ï?ÿÜÅÅ…Çã™™™ ‚ ¤§§kËÃb±,,,üýýW­ZURRRí¯ñÚµkC† qvvær¹ÎÎÎÇ¿zõjµÏµ:zAG¨•ú÷ïOÕ•|™666»wïÖvHå',·ñÊ•+õë××x>Ÿ¿uëÖ÷æ (**ªÆ8wî\'¬Æ© Äü¡ú*Ž?®ç«ïܹSuõˆˆ=_]wЧ[·nÊ/ÁÊÊJÿWïÑ£‡òêæææú¿ºŽ 0΋/T_EHHˆž¯ž’’¢ºú”)Sô|uÝAG`œ¥K—ª¾Š;w×Îw%åW¨P(Þ¾}ûðáí[·¶jÕ*77w̘1Û·oÿÈ“_»víÓO?MMMõ÷÷ß½{wRRRII‰D"‰ µ´´üúë¯5æ¡(*''gçÎÖÖÖ·oßþùçŸ?ôÒ7n\µj—Ë3gNBBBiiéëׯ:ôÉ'Ÿ|äµ:zAG¨ej߈{Åír¹|æÌ™„33³ŒŒŒª¢±U"‘¸¹¹B¾ùæ™LVqÿ‰'V~òBZ¶lYÅ/J)33“ÏçBvìØñA8Œ¸ë:ã`Ľơ0FÜuq´¸«6։¢(…BÑ¡CBHhhh©ØºuëVBˆŸŸŸÆŸÎ*æ)(( „˜šš*ßúùùB>\ñðÇBZµjEQÔÚµk !:t¨Êu…». #0 ÷‡^À8(ÜuqêâTX,Ö´iÓ!çÏŸ¯öIŽ;F™>}:‡Ã©©`&L „ìØ±£b“²¨Uî Œ=zô蚺.ÔMèèiê\áN騱#!$>>¾Úgˆ%„tíÚõcbœ:uŠâáá¡|;räH“sçν|ùR}·—/_ž?ÞÄÄdĈ„¸¸8BH‡:ÔªU+###kkë.]º„‡‡S•Þ}P:zAG`”ºX¸;;;Brrr*6±´(·Û›7o!®®®Õ ——·{÷îÉ“'B„B¡r£ÍÀ …ú´ BHxx¸B¡4h*ö¡C‡†+•Jß¾}{ýúõñãÇ:T¡PT/ÔAèè¡êÈwŠ¢$ !„ÇãU<¤rª¹\.!¤¸¸øƒòTäïï_XX¨ÚMùqO£F …r‹B¡hذ!!äÂ… Ê-<Âf³mll8PPPPPP°ÿ~kkkBÈÿýßÿU1’¡Áw]@G`Ìq¯q范9ŽÀ8¸9õå? NNNU?¤\«‹‹ !äÙ³g”G…Ïçûùù­X±B"‘¨ïVñÇQù#Û°aCÕ¬­­­ò$T?vÿþýÊŸø*F24(ÜuqP¸×8ôÆAᮠ范›S߉ŒŒ$„4kÖ¬ÚgPÞéü¡OäR}Ó ïÝ»7þ|SSSõX,ÖØ±cÉw]¨^Œ7Nõ±T£F”/úöí«~l¿~ýÈÇMPƒº½€ #0J+Ü)ŠÚ¸q#!$00°Ú'8p !$,,L.—×X2B!ãÆc³ÙÇŽËÍÍÍÉÉ9vì›ÍVþÔ*µnݺ’Ã+y:1€:tô‚ŽÀ4u«pW(sæÌ‰ŒŒäóùãǯöyFíææ;mÚ4?£EEEŸVîîî½zõ*))Ù·oß¾}ûJKK{õêåîî®ÚaðàÁÊgΜQ?Py/v‹-ªqQ¨kÐÐ :£Õâ9î=Ú¶m[›6m”MüñG凼·õêÕ«ÆÆÆ„6mÚìÙ³'99¹´´Tõh_åd¯*ž¼œƒBüüü!äСCê­ …BùUØÙÙ>|¸°°°°°ðàÁƒÊ{«·oß^Å«Ìq×tÆÁ÷‡^À8˜ã® èŒSoNÕÈÖÖvïÞ½Ú©ü„å6^¾|¹^½z¯Âçó·mÛVÅ“—SRR¢ºÓÂÎή´´´ÜñññŽŽŽ/:fÌÕ½ŒƒÂ]Ð…{C/`ŽÀ8u÷æT‹Åçó½¼¼¼eË–¤¤¤‘#GÖÈ™»uëöøñã7:::r8@°`Á‚ÄÄį¾úªz§5665j”òõÈ‘#ŒŒÊíдiÓØØØÉ“'»¹¹q8++«O>ùdÿþý»víª}s¹ ¦ # t„Z£6¸ã`ˆ;FÜ(ŠªË#îµ w@áÀ(Ü…; p`î €Â€P¸0 w@áÀ(ÜßÅb±X¬Ê·ÔzèèV(Ü…»Â¯½€‚Žð.݉¢(º#н€ #èFÜ…;ÉÎÎ^¾|y»vílllx<ž››Ûˆ#®\¹RÉ!?¯yñâÅ”)S<==MLL¬­­{ôèqüøqmnß¾ÝÏÏÏÈÈÈÊʪwïÞ±±±åvSß # t¦èß¿?U÷DFF:99iü†¨ö)÷Vã–¿ÿþÛÜܼâI.\XñÀ©S§–ÛÍÜÜüñãÇåvÓ–§Vúã?T_éñãÇõ|õ;wª®¡ç«tÑ­[7å—iee¥ÿ«÷èÑCõ„þ¯N;ôñâÅ ÕW¢ç«§¤¤¨®>eÊ=_Ý #ˆ¥K—ª¾Ò;w×é÷W¯^õë×ïõë×þùgvvvYYYJJÊž={ºtéRõ󤦦2¤°°ð«¯¾Š‹‹+++ËÊÊúý÷ßÍÌÌBCC¯^½Znÿ-[¶¬X±"--­¬¬,::ºyóæ………+W®Tí@iï5½€ #0KqŸ={6!¤sçÎeee•ì¦üþT²EyžÉ“'—;pÛ¶m„!C†”;påÊ•ê»)‚4hPùEk7Œ¸ÓÁp`Ä.è†#î4BG0q×àÌ™3„ÐÐP÷1ç9{ö,!dÚ´iå¶2„YnûرcÕßB222>&@µ¡# t&¨ÓËA&%%BÚ¶mû‘çQøúú’ÿ>ÍQÿßÌÌÌrû;;;«¿566&„”••}d €êAG@/ èLP§ ÷š¢P(!r¹\c«T*Õoz # t]ªÓSe6lH‰ŽŽþÈ󸻻BRSSµMTúø¨ºƒŽ€^@И Nî}ûö%„,^¼X&“}üyÖ®][3±!ÿ}NT\\\ƒçн€ #0A.ÜgÍšeggwõêÕ®]»ž9s&//O&“½|ùrß¾}]»v­úy¾ûî;;;»°°°aÆ]¹r%//O.—¿}ûöÎ;¿üò‹¿¿5²)ÿZݹsgIII5¨:tô‚ŽÀ,up9HŠ¢"##5~CTû”{«qËÍ›7]\\´}o+9PÛöyóæi;I­„å é…Ž` °$Ð –ƒ¤:‚ÀršuèÐááÇ‹-jÕª•……Çsww9rdåö­¨]»v>\±bE»ví¬­­9޵µu@@À÷ßS`K–,™;w®§§§‘‘Q5ø èèAêæˆ;Œ¸PqÀˆ;EQq`4î €Â€P¸0 w@áÀ\Õ«‚‚‚øøx£@]–‘‘Aw„¥¦¦¢#]$ Ý!D¡P ]ÒÒÒèŽð¯ÜÜ\t Ë›7o4nW¸_ºt©yóæúÊ` f̘AwšI$ü:8pàÀèNð?0U€P¸0÷‡~ ;CmðøñãÓ§OK¥Rõ 4èÕ«—½½=]©ÊËËKÏWôññAGø'NœHHHP¾vuu9r$›Abbb¢ÿ‹>¼mÛ¶ú¿.C9räùóç·têÔIÿ‘jý---ñë€"•J3ÿcmmÝ®];»Éd²õë×+ŠrÛmmm;vìèàà û°µŸ³³³ê5‹¢(£Ô&™™™óçÏWÿ æp8Ó¦Mûõ×_i  S‡6l˜òµ©©é½{÷š4iBo$=?~¼ê­‹‹Ë Aƒ‚ƒƒ»víÊáph P ™™™QQQb±øþýûb±øÙ³gªú°}ûöQQQÚôññIIIñññüÇÇÇÇÌÌL_Áëî5,:::$$äæÍ›ª-cÇŽ §1€î¼~ýºeË–YYYÊ·ëÖ­›9s&½‘jJYYÙ›7oêÕ«§±5''ÇÙÙÙÉÉI( …ÂN:áƒ&`®ß~û-$$DcŸÏÏÏÏ×öã’’âîî®Ëhð?ð¯L kÛ¶mddä®]»\\\!–––+W®¤;€®Lž?66ÖÓÓ“ÞHÕ–––vôèQ‘Htýúu¹\®ÜØ Aƒ/^°X,z³|©T¯œô¢”™™I™={öÏ?ÿ¬ñ¼¼<[[[eMèêê*PãííÙ_†ƒûþ] Z,,,Ö¬YCw ÊÌÌd±þýãåÊ•¨Ú¡¢££gΜYq$+99ùÎ;¸gäÇ\¾|yÅF !b±XÛQÖÖÖëÖ­óññiß¾=ŸÏ×e@ø((ÜiSXX¸gϞɓ'Ó šf̘áãã3a„ÆO:•î8ÕdddtãÆŠÛ}||„B¡¶9î4’J¥<Oc“±±±ÆªTZ¸<!P¸ÓföìÙ[·n=uêÔúõë½½½éŽP={öLLLÌÌÌÄ_`.@àå啘˜¨|ÛªU«àà`¡Pˆõ‘À@äççÇÅÅ©æ½ÄÅÅíÝ»wРAw.7[Íf{{{«æ½P…©_Œ†9îô¸{÷n@@€r¥‘‘ÑŒ3.\haaAw.€ZèáÇ—/_®äs¡ùóç_¼xQ¹>Œ‡‡‡>³h³uëÖ³gÏŠÅâ/^”«Ö–,Yòã?j<*==}øðáÊ2Ý×××××—–çB€Ž p§Ç×_½mÛ6õ-®®®«V­5jþ¨b±8""B$ÅÇÇs8œ´´4'''{* |j†¦oß¾§OŸÖØ4pàÀcÇŽé9ü;EM›6mÞ¼Yý¡ªééécÆŒéܹsLL Á¢¨˜˜˜yóæy{{ûùù…††ÆÇÇBäry%…ªvЧôôô¿þúkÕªU_|ñÅ›7o´í¦q‰F Ë€`¸0âN§ÜÜÜ%K–lÚ´I&“©6vëÖíòåËô…`*Š¢²³³5¶ž;wNÏ‘(ŠR_™166VýGôܹsT>—º~ýúÊI/ÊÙ/^^^Xœ±.CáN¿¸¸¸éÓ§_ºt‰ÂápîܹãççGw(Fúâ‹/<¨¾…ÇãõèÑ#88xàÀêŸsèEQ¶¶¶yyy[×®]ûÝwßil*,,411ár±Ž¼ƒéçããóÏ?ÿ>|¸Aƒ'NDÕ†iÓ¦M£FÊÉÉ¡;@e„B¡ò…±±qß¾}ÃÃÃ_½zuöìÙ¯¾ú U;èEQ åþ\TÇb±*y.éÓ§Oµ5™››£j‡r0ân@äryaa¡••ÝAÊ{þü¹@ (,,tqqÙºukß¾}éNu‘L&»téRDDĈ#ºuë¦qŸâââáÇ:tÀ€æææzNuÁÛ·oUS_îß¿ÿàÁ‰DÂf³ß¾}«íG.$$ä·ß~#„p8œ&Mš¨æ½WWWýÆfCáÎeee\.wPþ)Š=z\¹rEù¶OŸ>§N¢7Ô)eee/^Œˆˆ8qâ„rrðW_}Una.=HMMíÚµë‹/4¶FEEµoß^cSddd||¼²R×öà$€ª@áÎkÖ¬ùý÷ß×®];dȺ³@ݲaÆéÓ§+_ÛÙÙ=xðÀÙÙ™ÞHP”””œ;wN$>>t‡‚:!11ÑÏÏO"‘(ßîß¿ÿ‹/¾ 7Ô¿üò‹¶›öx<^\\žl 5"55U5ïE,›››GGGkÛÙßßÿîÝ»ª·&&&ªI/Ÿ}öžÞº†Â¾üòËÝ»w«Þr¹ÜI“&-[¶ÌÆÆ†ÆTPë)Š®]»Þ¸qCùV(FDDÐ êŽçÏŸ—+ƒììì   {õêeddDW0¨7mÚ$‹oß¾]XX¨Þdll\PP mBË?üðèÑ#U±îéé‰)¬ O(Ü™!&&&$$$22R}£½½}hhèW_}…%]AGÔ‡<zô¨iÓ¦ø0˜…;ƒ>}ÚÃãiÓ¦t¨ŒL&suu}óæMÅ&{{ûõë×5Jÿ©€d2YLLŒ­­­———Æ.\¸¨íð—/_Ö¯__géô …;èÜ×_­þȤ¦M› …B???Szùò¥XÍÓ§O żyó~úé'û¿yóFuÓ¼¹¹¹jÞ‹¯¯/žž µ ž^Qk?~<22rñâÅøg ô ¨¨ˆÍf›ššjl …Û¶móññ …ÁÁÁ-Z´Ðs<0|+W®\²d‰êæub±XÛQ‹/VÖëžžžÚ&ÆÔq¯Š‹‹›7ož””äââ²råÊ1cÆàß2Ð…'OžDDDˆD¢»wïV²ôT*---Å8P¥í÷ÑÒ¥KüñGMõêÕKMMÕa,†Àˆ{í´víÚ¤¤$BHFFÆØ±c7oÞ¼aƶmÛÒ j‰‡ŠD¢ˆˆˆ¸¸8ÕÆˆˆm…;ÇÃìuL&S.Ψ²}ûö>}úhܹ⠌ÎÎΪy/º À(Ük'>ŸÏápT«7ܼy³}ûöãÆûé§ŸðÐfûöí½{÷vuu¥;´ˆˆˆiÓ¦½~ýºbÓéÓ§‹‹‹µÍ–ºcÿþý/^T.¦^nê‹X,ÖV¸ûùùµlÙRµ8£ŸŸ~a”ƒ©2µÖǧOŸ~ñâEõæææ[¶l1b]©À`ÅÄÄtèÐÇãýôÓOß~û-–Hm6oÞõåõë×\.·  ÀÄÄDã!@U¸»¸¸Ô`¶:€þaª BEQ]ºt¹yóæ¤I“–-[fkkKw"Ї›7ovîÜY¹l(›Í¾téR×®]éúCQT£F’““Õ7ZXXôíÛW(™™™Ñ• jVjjê€bccU3ÔÕݹsÇßß_ã.\ˆíÚµ³´´ÔqLx|Ü „²ÿþ7nÈåò7z{{oÞ¼Yµ<ÔbžžžB¡Pù:$$U{]Ãb±T?ÖÖÖ£G>qâDffæþýû…B!ªöÚÄÁÁ!..NcÕN‹ÅÚìÕ«×wß}ˆªÀ`Ä!¤~ýúiiiê[üüü6lØÐ¥Kº"Þ9r$,,ìܹs(Ôj‰DòçŸ8p`×®]VVV÷‰ŽŽÞ¼y³P( Ä“M§   ..N5ï…Ïç_¸pAÛξ¾¾ê³ÒÙl¶———rÒËÀ›7o®—ÈðQP¸!„®X±býúõ¥¥¥ª,køðákÖ¬©_¿>ÙàƒäççÿùçŸ"‘èìÙ³ÅÅÅ„?þøcüøñt炚ñâÅ‹½{÷ªgTÿ%ÎçóóóóµÝ:oß¾µ±±©ø»›Ãá´nÝzóæÍ­[·Ö}R  wР¬¬,,,lùòå+W®œ:u*Ýqàýöïß?räHõ- 6 …ÁÁÁíÚµc±Xtm¤Ri¹ÅUKé÷ìÙ³’Ùê7~ñâ…««k¹Åñ·@­‡Â´zõê•““~ߎJYšŸŸïèèXZZêéé, ýýýÑ ÙªU«æÍ›§±ÉÞÞþÍ›7Ú¼uëV«V­ŒŒŒt  w¨¦üü|¬Æ8Ož<Á3S˜(%%E$‰D¢V­ZýöÛoÚvÛ¶m[Û¶mýüüô™ ´¡(êÉ“'fffnnnwøë¯¿z÷î­íð´´4WWW¥FBáÕ4f̘'Ožlذ! €î,P%ÿýwïÞ½§M›¶råJ¬&ÁÏŸ?‰DÑÑÑÊ«]\\RSSµ º½ îß¿¯š÷òàÁƒ¢¢¢Å‹/]ºTãþéééõêÕS¾æp8ªÅ•TM*(Ü¡:¢¢¢:uêDQ›ÍþòË/W®\éääDw(¨ÌÛ·o[¶l™ššJqqq¹y󦻻;Ý¡@³ÌÌÌíÛ·‹D¢»wïVl½víZçÎõŸ *±~ýú7>{ö¬bÓ€Ž?®íÀ©S§úùù ???L}€÷âÒ˜G¡PL›6Mù'ŸB¡?zôèâÅ‹¿ýö[<ÀÅ`͘1CYµBœœœ\\\èÍ•ÈÉÉY°`Ʀ€€Œ¶ ììlU;©ô¡¤„7ê&ÔNø¼>›Í^¸pa£FT[Þ¾};{öl__ßsçÎÑ ´9uêÔÎ;•¯ŒŒvíÚ…?± YÓ¦M[¶l©zËf³;vì¸nݺ¤¤¤[·náyÆz“žžþ×_­Zµê‹/¾hÞ¼ùÅ‹µí)Êm166˜8qâwß}§ã˜P‡`ĪcРAŸþùÏ?ÿ¼jÕ*‰D¢Ü˜ðÙgŸmݺuâĉôÆu999ß|óêí¢E‹|}}iÌJW¯^­ä1:B¡0>>¾S§NÁÁÁƒÆtg½9yòäÕ«WÅbqttôÛ·oÕ›îÞ½Û³gOG)§¤«ÏP÷òòÂâŒPã0Ç>JJJÊ÷ßøðaå['‹›5kFo*P7jÔ¨}ûö)_·iÓ&**ŠËÅ_ìô (êÖ­[Êõa’’’’““µ­7òúõk+++='„îÝ»_¾|YcÓ¨Q£öìÙ£ß8ÿSeࣸ»»:tèÒ¥KÊAÜiÓ¦¡j7(ÇWUíÆÆÆ;wîDÕ® …âúõë3fÌhРA‡~þùç/^PuôèQm‡899¡j¯Y …"!!áСCóçÏ/,,Ô¶›¶Ï£Œu– Jð+jÀ'Ÿ|rïÞ½+VÌž=›î,ð?²³³9Ž\.'„,]º´E‹t'ªsÖ®]šŸŸ_±I$MŸ>]ÿ‘êˆüüür‹3ªæõõëׯC‡RÎVçp8ÞÞÞêS_°¤:L•¨ånß¾=vìX++«ëׯcÒ­þ}ùå—»wï.·ÑØØ8((h̘1ƒ ¢%U­'—ËÍÍÍKJJ4¶nÚ´iÒ¤I›233“““[·nÎSe@OÖ­[÷ûï¿+‡~AŸâââ>ŒB„ÁÁÁª×|>?88øàÁƒYYYÇŽCÕþ1äryTT”¶V‡SÉçK•,ÑèèèØ¶m[t0Lq}HNNnÞ¼¹D"aaaݺu£;@ÍÉdgΜquumÓ¦ÆJKK=<<ºví* ƒ‚‚ðÌÚjKKK«ILLär¹ÚÖ60aÂŽ;”¯ÍÌÌ|||Tó^|}}-,,ô˜ f p}:tè‘#G”¯Y,ÖСC×®]«m= Ã'‘HΞ=qúôéüüüÑ£GWœ£¢P(Øl|¼YM©©©cÇŽ½qã†Æy/÷ïß÷ññÑxàÉ“'oݺ¥Zœÿ@-€ÂtN.—<øäÉ“êù|þܹs¿ûî;, RXXxúôi‘HtæÌ™¢¢"Õvkkëׯ_ã‘õº ‘H,--µÍ²Û³gϨQ£ô €.(ÜAOΞ=;sæÌ„„õõêÕ;pàž Œpîܹ޽{k« Ïœ9¤çHÌ%—ËŸ~üX}‹¥¥e»víÁÈ‘#ýüütŸÀ `9HГÏ?ÿ¼G¿ýöÛ²eËTK㥥¥©h0pÍ›7W(å6º¸¸ 4(88¸’Ç ‚RjjêñãÇ••úýû÷KKKUMVVVE±X,úûûs8õÅ]\\ô•À€`ÄôíÕ«WóæÍÛµkEQýû÷?qâ݉j]»v9rdëÖ­XsZG:vì¨\ɤ~ýúB¡P(vêÔ “§«èâÅ‹½zõÒÖúüùóFilª¤¦¨SP¸=nß¾={öì]»v5nܘî,µDjjªO^^ž­­mXX&þ~¨ììì#GŽÜ¼ysçÎÚöÙ¹s烂ƒƒÛµk‡RR]YYÙ½{÷Äb±ƒƒƒ¶e.³²²46yzz8p@ÛÊ< „ 6 (ªwïÞgÏžU¾íÙ³çùóçQYVEZZÚÑ£GE"Ñõëוó×=zÔ¬Y3ºsºÔÔTõÅŸ>}ªüî9sFÛQõë×OKKãóùê‹3úøø`qF€ªÀw0PW®\iݺ5~WÑü¡ªÚ---wìØª½r)))"‘H$EEE•›¹.‰.\HW0FX¹råüùó56Uòl#BHxxxƒ ¼¼¼ðó P (ÜÁŽ1¢°°pÑ¢E!!!Xe¯r)))³gÏV½]·n»»;y EQíÚµ{õê•ÆÖÌÌL=ç1@R©477×ÑÑQckóæÍµ˜žžþæÍmSbk&@„{ªÀ­X±"===??ÿûï¿÷õõU%CEEM˜0AµPOPPÐøñãédøX,Vppp¹­ZµZ±bEBB† hIE#™LöèÑ£Ì;7((ÈÕÕÕÈÈhÛ¶mÚöêo?ýôÓï¿ÿ~ïÞ½qqq¶¶¶º PaŽ;œÒÒRkkërOIìׯßúõë=<<èJe°6mÚ4eÊåkkkëÔ«WÞH†C.—s8M—/_îÞ½;‹ÅjÛ¶­r}˜ºùÓµiÓ¦;vÄÆÆÊd²rMC† 9|ø°Æ£(Š5j”j’º³³³î“ w0H/_¾œ3gΡC‡Ô>gÍš5þ|sss³™Lfkk[PP |»k×®1cÆÐɈÅb‘H±`Á‚‘#GjÜG¡P¬X±bêÔ©u|xxΜ9k×®ÕØäíí]î±G@/î`¸®^½Rî^·­[·Nœ8‘®H(%%e„ .\èׯßÉ“'éŽCŠ¢îÞ½!‰•xìØ1zƒÑB"‘Ü¿_µäËš5k:uê¤qÏ}ûö•[9”Åbyzz ??¿ è%/T w0hr¹|Ë–-‹/ÎÎÎ&„øúúÞ½{WÛä‡:‹¢¨ÐÐÐiÓ¦ÙØØÐ…?Þ¾}ûÒÒÒÊ5™ššfffÖ‘hþùçŸÈÈHe½þôéSõ¥r~ýõ×éÓ§k<êÁƒ:t(·8cùŽ0 w`€ìììÅ‹oݺõÂ… ݺu£;–ððp÷ãr8œ^½zmÙ²¥AƒúO¥:uŠŒŒÔØ4nܸ;vhlÂCIËA2Û·ß~¯·Ëõïß?$$Do—;pàÀü¡zÛ®]»åË—/_¾\G—?~üˆ#ttòŠ~ûí·'NèírsæÌùôÓOõv¹%K–ܸqC?×’J¥\.Wuo¥±±q`` P(ìß¿¿Žæ¯O:UŸ“¿wìØacc%‹§M›fjjªq7@ ±pg³ÙÆÆÆÚN^±j>|xVVÖÇþ 'Ož433ÓÛåzõꥷk™™™ésöZVVÖðáÃõv9wwwm êBBB´iÓôv¹V­Zi»÷C¶mÛ6zôh½]˜ #îÌxîÜ9 ˜BŠŠŠø|>Ý)@'(Š‹Å~~~Úvøì³Ï®]»öÙgŸ …Â~ýúYYYé3^“Éd ê“ÔUKÎGGG·iÓFãQ[¶l™4i!ÄÙÙY ¦I“&\.Æh × AƒvïÞBUà_s¨  Å'Ÿ|Ò¸qãµk×âÙCµFYYÙÅ‹#""Nœ8Áçó“’’´ýºaÃÚQžÊår>Ÿ_VV¦±U,k+ÜûôésîܹÎ;k’¦Ã˜ 6رcÇ;w>ܬY³eË–Óª¯¤¤ääÉ“_~ù¥““SïÞ½wìØ‘’’­íÆ *?zôH[‡ÃiÚ´©¶Ör‹,©«_¿~`` ªv€ZŒI¿ê4ÊËË›?¾òµD"Y²dIxxø/¿ü2xð`zƒéBxxx×®]k룂$ÉW_}uìØ±rßRŠˆˆÐªWXX§š÷§P(òóóµ­$îß¿¯|Íf³•‹3*in€º…;0ŸÏŸ;wî²eËÞ¾}«Ü’””$ {õêÖ¼yszãÕ ‡Nž}ºX,~öìYÅ»‰µ¬÷îÝÛÂÂB øúúúùùá–5PÂͩ̆›SU^¿~=oÞ¼]»v©/_Íf³Ï;׳gOƒÕ™LÖ¡C‡;wî(ß.\¸Pw ìÐhþüù+W®T¾vtt8p P(ìÞ½;ÿJÉÏÏ·¶¶ÖöoìÁƒ‡ ¦çH`€ps*TFÜ¡–prrÚ±cǤI“BBBnݺ¥ÜèààPk¦¬ZµJUµ»ººÎš5‹Þ<Õ#‘HŽ9äèè¨q‡ààà;w4(88¸k×®†ù°­W¯^©æ½˜˜˜¨/ZªÎÒÒ²Q£FÏŸ?WßÈãñ”“^6l¨¬P‹ p‡Z% **j×®]óæÍ{õêÕO?ýÄô••Äb±úøúÖ­[™õÔ¬¬¬ãÇ‹D¢‹/J¥Òßÿ}òäÉ÷lݺuzzºžã½Wffæ¹s甕zLLLNNŽªÉÎÎN[áN%%%ÊI/ÊzÝÛÛ›Y÷Ñ€áÀï¨mX,ÖØ±c‡ ¶bÅŠqãÆÑ§H¥Ò±cǪÖ7n\Ÿ>}èTE¯_¿>vìXDDÄ•+WTH"„ˆD"m…»aº{÷îèÑ£56egg§¦¦Ö¯__cë*yøÀAᵓ©©ihh(Ý)jFhhhll¬òµ››ÛúõëéÍSE¿þúë¬Y³4Îð¾råJvv¶þSUDQTbb¢X,¶²²ÒöpY@ íp.—›žž®­pGÕ5…;ÔQ³gÏîß¿·nÝèòb±ø§Ÿ~R¾f±XÛ¶mcÊä77·ŠU{Ó¦Mƒƒƒ…B!U{AAꡤ÷ïß‹‹+**"„ôïß_[áîâââè蘙™Éáp¼¼¼Tó^¶’ Æ¡p‡ºèÒ¥KëÖ­[·n]ß¾}×­[çååEw"­7n<~üømÛ¶Q5qâÄÏ>ûŒîDUÄçó•5±P( nÑ¢½©~ûí·M•<Ûˆ²iÓ¦úõë·nÝ3Ô€.ø uŽL&S•n§N:þüÌ™3,X`nnNo0,,,¶lÙ2xðàÐÐПþ™î8ï$''ïÛ·¢¨ hÜÁÌÌlêÔ©VVV#FŒÐç * …¢  @Ûç...ÚLIIÉË˳¶¶ÖØZ+ŸçÌ‚uÜ™ ë¸WCFFFÇŽ“’’Ô7ººº®^½zäÈ‘øfVîáÇ"‘("""..ŽbooŸ‘‘Aï tzzºjÞ‹X,~üøñO?ý4gÎ;'&&z{{«Þš˜˜øøø¨æ½´oßž‰ Æ£aw¨:Œ¸CãââòôéÓmÛ¶-Z´(++K¹1==}ôèÑ¿üòËáÇ yæ ]Äb±²^Wßž••uåÊZqµsçÎ}ûöEEE)g㨻ÿ¾¶£<<¥¥p½pá‚Æ¦Jf«³ÙìÓ§Oë,€¡FºËÖÖöÿþïÿbbb>ùäå–Y³fyxxÐʹ¹¹ùûû«oár¹={öüý÷ßÓÓÓ¿ù曼–B¡HHH8tèЂ úöí£mOK4òùüž={~þùç5 À@`Äê:__ßK—.>|8,,lþüùtÇ¡ EQ•Ìï …111<¯GÁÁÁ ppp¨©KGGGß¾}[9O=..®¸¸XÕÔ§OŸr3¨‡ãíí­š÷âëë[¯^½šJ`hP¸BÈСC‡Jw Byøð¡>×L”ËåW¯^‰DÇŽ»zõª¶FŒáââ2tèP33³Ï0eÊ”;wîhlªdÒ‹@ J¥¸™êL•¨’“'OJ¥R]_åêÕ«¾¾¾_~ùe^^žN/$“ÉΟ??iÒ$WW×=zlܸ1==]$iÛ¿AƒcÇŽ­FÕ.•J£££·oß^VV¦mŸJžKZRR¢­‰Ãá j€:#îï—˜˜8tèPggç_~ùE(êè*EEEãÇW(»wï>uêTTT”úÂ…5åúõëáááG­ø·H$Ò¶ŠbÕ¥¥¥‰Õ$&&ÊårBH@@€¯¯¯ÆCT…»™™™jqF______KKËÌPk px¿Y³f•––&''÷èÑ#,,¬eË–5~•9sæ<{öLùÚÉÉÉÝݽÆ/AÙ½{÷Ž;*n766öððP(Õ^WG&“ñù|m#ëb±X[áÞ»wo'''åâŒDÐSeÞ#==]}Áþù§U«VÓ§OÏÍÍ­Á«üóÏ?›6mR¾ær¹;wî411©Áó««¿µ¶¶=zô‰'òòòöïßÿÞª=??_[—Ëmܸ±¶ÖJf«{xx :´I“&¨Ú*w€÷puu½}ûvHHHTT”r‹L&Û°aÃV¬X1a„_ú½  `üøñªÇÿý÷Õ>›L&{ùòe£F4¶vïÞÝÖÖ–Åb 0@(öêÕËÈÈHÛ©ärù“'OÔ§¾æååi«°ABB‚ê­­­­¿¿¿rÞK§NªýAáPmÚ´¹qãÆž={æÎ›‘‘¡ÜøæÍ›¯¿þºM›6­ZµúÈó÷ÝwÉÉÉÊ×>>>K–,©ÆIòóóÿüóO‘HtöìÙþýû€……Åš5kâââ‚‚‚ø|þÚµk?þœyyy\}Í›7¯êUû“'O‚‚‚ÆŽ{êÔ)UÕN),,<{ölÅCJJJnݺµuëÖ©S§Îš5KÛ™íììêׯ_n#‹Åòôôz ªSe>˜··÷™3gbbbÜÜÜ>þlÆ kÙ²åØ±ce2ÙÂ… «~ µµõùóç•‹-ªsuuýâ‹/”ëÞäææFFFª/ΨP(”»¹¸¸¬[·NÛÉAnn®jqF@àããƒ!¡p¨&ÿJZ‹‹‹«>S¥E‹·oß~ùò%Ç«zGGÇ.]º\¾|YùÖÓÓS(ûûû«fO]»vmÀ€¡:R IDATÏÈÈÈÌÌtttÔØº}ûvgg窇]ÃT€š———çííýÃ?Tñ‹UqáöÜÜÜU«VUrÔ€ÜÜܾüòË{÷î%&&®ZµªM›6ê÷ܸq£òuFFƘ1c6mÚ´aÆ6mÚT~à“'O"""D"ÑÝ»wÕ·‹D"??¿M›6M›6M5C]]%Ï6b±X¿üò‹«««@ À :£aª @ suuBEQîîîÎÎÎ......ÎÎΪb=.....NŸ_šáèСC÷îÝéNÕ®z1€!˜5k–‰‰ Ý)*ƒ'§2›ÞžœzáÂ…ÀÀ@]_àCÍ™3gõêÕt§€êhÛ¶í;wèNðNvv¶­­­þ¯‹'§BÕaŽ;³Í™3GU;èHHHFú¡Š0U†Ù0 Àh˜ïU‡Â>جY³† Bw ¨»’““‡Nw ¨1öööþù'Ý) Ž =}ú4Ý)ª …;|° ´oßžîPwY[[ÓjÇÃ?)@º#|Ìq`î €Â€P¸0 w@áÀ(Ü…; p`î €Â€¸t`’_]MwŠ÷+--ãñŒ8Ew¨1(ܪêçŸÞ¹swÚ´oèòIñ²e+š7÷£;Ô$îU²ví‚{÷ijf}Kw÷›?qÆNÆÆÆt€š„ÂàýV¯ž/ߟ1c*ÝAÞoÑ¢åÎÎ6vv– ÝQ FáæT€÷X½zÞýûqŒ¨Ú·nÝÁbɼ¼êÑj w€Ê¬Z57.îáôéSèò~ׯG=}šèïïEwÐ îZ­\9÷áÃG!!“éò~™™YÇŽo×®)ÝA@W0Ç@³Ÿ~šÿøÛoPµSµjÕZ —Ë¡; è w V¬øþñã'ß~;‰î U2wî¢Æ­­Íé:„ ¼åË¿KL|:m3ªö5kÖ[X»¹9Ðt sÜþDze³Ÿ>}jøOYR:vìÏÜÜ,ŸFtÈ;À;K—κvíjãÆžÛ·ï¢;ËûI¥²§OŸtîÜ’î  (ÜÞyú4¹K—¶FF<ºƒTÉãÇ/¬­ÍÙlÝA@P¸¼cffêëëmjjBw*),,ÊÎΦ;è æ¸0 w@áÀ˜ãðŽ\.‰yÀã1£_dfb‚;@‚w€w(Š¢;ÂÀz2u 3FôƒËåúû·dʪ2×®ÝIOMw ÐŒ¸0FܪIN‘÷èa0X„42‘ÿÔœƒi|:‚ÂÙ~üñÇ%K–°XøG@ßlÏ‘ÁÎäT&‘ÈéŽbLØä{Çœ¼ìq¥; ìZµjúô馦¦tÀTf»qãÝê"ç d€Ù“†ªB,¹d–]ææ{<¸%tgaž[·nÉd2ºS3`ÄàÃ4ø‡Ú“=iDΤ•¨tÅшL0ÏØøÇ¾·…Etg¨åP¸|€¦—I{k²/ h'„44%Cx/ö”Ò öCáPU­®osr8ƒî†¡…9(öÇ2)fzè w€*éIìÈŸx|!„6–Š€¢Äßö–Ëtg¨+P¸¼_Ï[„EÈ…,ºs†îÖÒFYñ›ŽgÖ§˜…;À{ô‹&¹eä^>Ý9 C?›R³ñŽ?ÿ¢;@ƒÂ 2­&sÙ,.!méNb꛲K=9téšÆV Àè w­äiådq19—î †¢¹ uLKÕNÁt …;€f2™L&£óÁ*&&Æ4^”8,RX&O~‹ç ý«Ø‚Gw€º …;€f·oßçóé|µ¯oSŒ]€ wÍ8¶@ÐŒîÿbÓÞ#îšQ•Wq»©©±™Sh nBá ™§gÃÜÜ·šZ¬P¸€þ¡pÐÌÞÞÆÞÞ†îÿBáP-eµ}H6›pèï pÐìÞ½‡eeR´m+`³±$€¡*)’{½£OSºsèP|RêVóNt§€wP¸hVV&m×Îî`¸zøûLHw úqÇaRJwPƒå …;`ª €fŽŽv·nÅVÜîêêäææ¢ÿ<PÇ¡pЬQ#·FÜèNð/L•`Œ¸h–˜˜”““Gc, êP¸h–““‡å Àp p¨I B²ËÈ3 É,%yRR #% "§!„Í"ÆlbÆ!Ö'·ò!„êC!õoÑÌ:ýïÖŽ^œÛ8¤S+ß–wÄ‹S³sR&ñº9^ödjRíŠÉ±WdY"É‘’ nÿsuB‹ÅR¾å­¼8Ù4yÙØÁææn»/Þl`Ì_v+c­ƒà Wò¹éãXíoè wÍ|}›Òãì2ü‘ýW*«*u%ÕëF·ýwÜ—=èqZ²Y3B‡-7+-<ùÚ<¹˜äHɯê\½TAö¤’…OÞ]ôe©îÊ×áÑ—zXfHš}&þ ß·ˆÛ™¼!v¦9Ùeäÿ’H¾”XqIgÛêý@áð±²J)6‹EÔ¦¥°Nÿû‚#¾øÉ'Ÿ\ÌåB¨QÃ![‘ŸßíÆ)à™B¬¸$'¿øÕÊ]•_HQRj;¼I3Oõ2R(§Q®?Eý@!7{tŪu÷Œ25®­²qˆZÈl£KõF|r*µ´³­ñ}á O(Ü4{õêMvv.š7÷b±°$3äåæŒq¶Š*à>, äïm¤óP3é9Ä•Ýgzg™\Ò·Oïk×®•;JY[³I =á*íM¦ó¼I•\¥èöý«ÑåªvBˆ›¼Êx5ÜÅùb6ëMòS’òˆ´éÝðíó`Yü_·¶}»_»ŸÔ± )*ÒxZcò©I.(³ÎJ"¾Mªÿ]Cá YRRjË–tþCÕÀ …tûÑS-[ûnäÚå“ú­sÍÌ‚¦fŽ»žsLî&»~½âQÊ)4Cî’‹O2ä)ñ}¼+›c^tK\xýŽÓw4¶¦§¥]¾ù°k»6õ|ëoòʽAzCwoŠòÚõxÌÙÂÇŠfD"Ñ û ÙþÛÏ­K­8þ¥€þ pÐŒÅb™››Ñ˜C.}}óÁÖ>ÉÛ%™­…Ãæ˜ð}Ýý8%DC »Kÿí{¤õ»ã"Ž ²2KScB´îE7c oÄ8ÍÖ\µ+•åç^8žðŒÿL]Ô·ƒ±ø)‡ÃáÚ×ïãΔþ@åÐX+/‘ülB(âçE wƒ†Âàc•©JrŠR˜Z.yXBH !„°rˆÑÂåBäR"—Y눴âIš–Ž$ʪ=ònåU»\u¬´4Ç©ÙÌèÿüÌÍ%ÜÇ„Ã}@&%e%‡(4ž  wÍär9–ƒ€*z–•¯¹RR )}ÿ¤ryRöÛŠÛK⟾üv©õàÏ^­Ü¬íØ|Gç ‰•æ6™”È4ü‘PQzn» #î …;³­^½3¡u¤cGº#c8™òì-̲ 4Ì#¯"»3[VVq»I3ϦÑÇ*?Ö‘"MÞü*G®¨æ8º1kÍ7iåŒù4Xºt©™¾óP%(Ü™­uëÖïß tlQç,6+>«èæÓÔ´-£ïšð8ì¶õš»:¼|ýf[pÛê]Í"+>ñ¨gmÿ*7òÉKIY•†Ø•¬ÍL:5q·01²c•.íÕ¢zàcøúúÒ…;€fIqII>ÞÖ[[k¯ĘÃ^Þ¥adJÎIk“×ÅrI™¬¨Lš‘[](É/.•Ê¥R›Å2æqùÆu ܉&ÀÔj(Ü4{ô(±  ˆÆX îH)&‹žã¯þ}Ë:M¨>ïZ©>„P!¤Ç¡É¿Î™úºÈì»Ó÷Ž5Ë4˜ÈK§Êl•GžIȺfÿlÔb(Ü4+((Âr ÷ÞR7rþ§âf±X„üÏÐ;ë4¡vo"„øÒ«ÙòïF“xóÆ„<)1çøE KŒºÔZèÞ4c•°-mbN!$þ‘•‘S”ãî§S¶½tí†\.?ó”Õ¯ü¯lÖé_8“±õIÚ[‰¤à­^s€~aÄ€flBm?zºM@Àp7WYRÖ“K<+‡½[•–¹¹›Øõlf$ñ¤åoSUN§yd•ÈvG=äÄbÕs¡!=è wͬ¬,oÝŠ­¸ÝÕÕÉÍ ¿ ¦)äwnF݉æšÚØ{<ˆ ìh{éV ejžcîâaf[_N†Ý% BØ„°Yä@«wÇí¿xƒdgB§ô¥}@á YÓ¦éŽuÅ»™ìrYqÖ«ÕÄaõÉ$Âb>1zExÆ„Ã%„EEd2"->x²””JUa©H¨ÕP¸Ð,»X¦a+¥ Ť¸ Š'É•”Kñhg€Ú …;€f))é¯^½¡1@›6¾X \.çp8t§¨…L©2g+óWo «}3#Þ‹Ì\n£L†…;€f™X²î(,,,**rrr¢;ˆ¡Û¹sgrròŒ3lmméÎR« kêÖÓ7:#ÿŸ‡/2ó?ì &F½Zzð¸ìŽFmëÛè(!îP§eff®^½úòåËÑÑÑtga€#Fxxx„……ý{wUõþü¹³03ì‹,# ˆ¸D)"*™¹¤ •K%n¸¤¨¨¨?•Ê=óë–©ßÊ%wqË]Ë6+5KÑúšKa®©,‚€( È2Ì3óûãÑ0  s¹ÃçýòÕkæÜsîyæÒyæÌ¹çN›6í­·ÞjÒ¤ ×Y·:{ÿ/Uêm/N+(0LjÎÓtE¢PY *Ñ«) ]íerg{?wg;‰X]ZæÌ”NïÒ"HîÌIä`1HÜ ‘ÊÎÎ^³fÍÆ‹ŠŠöíÛ'à¾Õ“ÉdóæÍ›9sæÊ•+7lØóöÛoã— séÚÌ­k3·uٙĬßíÙ^NEÒ£.Ó0ô×Ä9†!£ÓH—” mæài+Æü%€F‰;€aB¡ËAZ+…BñÑG­_¿¾  €ˆZµj5bÄ®ƒâI“&­^½:==½°°ýæ3yòäÙ³gËå8/ÌÃA"z=ÐûõÀJJ5Úâ2M©Fg#ÈÄB®~h¬¸Ö©S;®Có{úôéǼvíÚ§Oÿ¹Áä‚ pÁ¥é¤Ré‚ ¦M›Æ>U*•üñæÍ›£££çÌ™ãããÃmxVI,ˆ…øEoÐ(,_¾¼E‹K–,©˜µûûû=šÃÀøh„ Íš5«X¢R©6lØóàÁ®°nq0,//??¿öK³Õ¯¯œaðƒ¸~òÉ'ÿýïsrr*o?¾H„wš‘H$ .œcÆŒ 0^G£ÑìÛ·ïÙgŸŒŒ¼qã†eN¼Ð¾íŠQ¯¼èãÄu Ö ‰;€aZ­ööíû•ÿ=yb`Æ4%%%[·nmÕªÕôéÓÓÓÓ«­?wî\‰DbÀ¬•H$zï½÷L©©Õj:4dÈk×®Õw``yÏùy»<ºÝ»™Ã0]ÖEüF:®C°J˜*`XÇŽÏ©Õú7,$"‰ÄÆòÁ€qeee{öìY¾|yJJЉMärùĉ×ÑétZ­V«ÕV~`°ÐŒõ-ÖQëk4GGÇüü|S޹V«ýì³Ï>ÿüóAƒ-Z´ÈÄ¿TÃÅ0ç~¿ù('—ë8êQ~Q±)iÂs~Þ~ÊôoÖ.aŸJÔ­„Å ¹Ôopw~›>}ú† °öH}Hl£7|Z­vïÞ½K—.MLL¬QÃüüü¦M›Ï_ë)æFN§Ó}ùå—_}õ•££#×±ÔÄög8©¹£^Õ kÿûôÍ_‹Ò®^hÚ‹¸›lΜ9ÿùÏlmm¹x‰;¿ýùçŸ\‡`µ4ŽS7,,cŠ;w*ŠZ4,*****2{<`"N§V[wÎÛ(èeí“.ÜúßO~½Ú"‚Ó¸xæÞ½{†ë(€öë¯ R)— ƒƒñ[JµT*×!@µnÝú½÷Þûøã¯^½Êu,P{Ïùyûg”gíÓ/å_üéä•k¸ !q0L(tìø,×Q@5&Ožìëë»fÍšÌÌÌ5ôööö÷÷gF #Œomøõëµ£äääÓ [¶l¹hѢѣG …µk×Öü ų͛úg|óñböiìå¼Óß~}ãO,ÛP¿¸‰ÅâØØØ˜˜˜;v¬ZµêáÇ&6ÌËË;zô¨§§g½†gõÖ®]kbÖîçç÷î»ï¾ùæ›X8ß tx¦•â~yÖ>÷²âóãŸßKIå6*€ÆËA¦Óéòòò+ÿ+.ÆÄÜG*•NŸ>ýþýû›7onÞ¼¹)MŠŠŠV­ZUßY·¤¤¤}ûöU[Í××wË–-þùç„ µ[';YxŸ>åYûüËÙAÖ`q0¬eËæYYÙ•ËÝÜœe2,þÝI$’)S¦Œ?~ïÞ½+W®LJJ2^Ë–-³gÏ–Ëå– Ïú¬\¹²¬¬ÌH…¦M›ÎŸ??::šïëå7w’k‹û(ÿE(=Pÿõw_ð듸}³pw KAâ`˜»»«»»+×Q@ÙØØLœ8qܸqûöí{ÿý÷ïÝ«rÒmqqñÊ•+ׯ_oÉð¬ÆƒöìÙSÕV//¯¹sçNž-*úàƒJKK+—»»»¯Y³&11qÖ¬YÖ‘µ³ü¢í±„Ñ?æýœ¾!Y;€¥aÄÀ°„„[ïœj1; Þ«¡P8zôè‘#G=ztùòå7nè/T§R©ÞÿýM›6q=|øp×®]z…nnnï¼óÎôéÓííí9‰ªþ´=G!Nt$SJß踎…{¾RŠ´I[·W©Â?–†ÄÀ0µº$4´×Q€‚áÇ:ôøñãË–-»víZÅ­qqqsçÎ5ñ’V`­Zµªâí“\\\bccgΜÉû›¡¢ÕÑ@ûüԧ꡸¯%µ–•­Ü¸[côþtª2MjžÒÛQ&Äè€Y!q€FA DDD <ø«¯¾Z¶lYù­JJJV¬X±mÛ6nÃã‘ÌÌÌ;v°œœfΜëììÌmTõGÀPj¾úÈÇ\ÒPÌlkgC°*˜*`˜L&ÅrÕªEÖND QK;*ÒØ¾‘6¾£o½E`U¸Ö¾}[®Chèj—µ³|¤ôG>=ÕâÇSál°B:åååqX¹ºdíDd'$!CR‰ÄÜqX-Œ¸öøq·ËA¶mÛ’aj¹ØÂíÛ©ŽŽNëׯ™1c¶y£h$Úž¥»¿ŸØ»÷ïäÎe4 É}¢þ³³ÝDÚÁÏ j—µ³Ä C0wÃ’’R¹¼Ûp3*pIDATf­³öâbµH$ŒŽòÝw¢£G~òÉ. ´j¢éÔÍ•N<æ:ކ­¹”úyÉuÙI©Ž4¹B°zHÜ cÆÑ‘—wäùã”=:Ñ+¯¼x÷nÊÈ‘–-û80ð9®ãà‡2½âA{’FÇu( ˜T@¯Ûdþïò m^ªõNòJI££¢b•°nø} Àª(mlD]º´gŸ¶ní7vìÀ™3Çk4Xp À$ÿ £™ÈÚ«1³‰"îà‘Ò²:½±&æ-®Bà‘àód/¢d%×q4l½K³n]½~ç®éM‚Ï“¯¬ªŽ_ýþ×#w±..¨á¾Á4HÜ "ž}„$%e¾ñFߊ%¥¥¥²¤[·U5–üzÑ•ŽerGÃæ'£¶I›Nÿdzï3ÔɉN=©¦Ú Wµ£$r©S|Ö‰;€aÅÅ*µº„ÜkT?##[*•øûÿë„ß!2r¼Yã°Be:zÕƒö<ä:ކM* HYæG{?cŸŠ„—‚Ÿµ1:A]Gô²{õWúzØ[nJsww㸖pËÕՙÜœj´"äÇ9#GªX¢ÓéžgHÀPZuwD­8I¦MsïÖž¸2 q0ÌÉÉ¡¡¬týúWW;»-’|ëVb@@ X,æ**€†oÂô%.H­Î ÷Ü_=(|Vï _ûjÞXØI2Õ.ÑÃN’ù,á"òõtÿ`|D/¼åp ‰;¿ÅÅÅ5À`°$•J=iÒp½Â‹¯ïÜù'ñðÂ+—è¾’žâ‚T£Æ{;½sçgãÇG”—|ÿý/‹ÈaH ÙËßg¸JŃM;n¼ÄBfÓžýê’ÒçŸk³xXø MëeÞݼ1ƒ'‡úÛ" ¨ œ1”•õ(&fôoôæWÖNDá›6üúë³ö"¢¢"¥@ nÕª ×q4P®R±)ãÁܰ¶O ƒ[·X:ꕞ5\éE*<ãVýð¼HÈÄtnã‚Áv€Â9]ffFLÌèÁƒù—µ³¦N¼s'é÷ßoщ¦N}‡ëˆ€÷Úúù,sPx3§š6<—š'`˜jÿ­îÒħºe% 2Œ¸C£–™™1mÚ›}ÜÜœ¹Ž¥öÞ~{Üš5q®®NÅÅ¥Ï?»¥TI w[ä‹ÕŠ+ÇG¼Ú¢6ïŠ)£Zš=(‡Ä¯ŒŒ‡ãÆ nÒ¤Ééӹޥ®¼¼<öíûráÂ÷¹ AûãqѳM°`v5îç¿Ö݇ë(À$îÐx9::[Ó]ІñöÆg-€17‡úq@í!q‡ÆËÞÞw)¾ÀÅ©<€Ä€¸ðw@âÀHÜx‰; qà$î<€Ä€¸@cTRRâîîÎ0Œ›››Z­¶pe†a†©jÆ·ê¹xñâ Aƒš4i"‹}}}ÇŒsþüyÛêiÇÄ Ú½ëƒÄ¯ŠŸ B¡ÐÁÁ¡uëÖ[·nÍÏÏ7ÒÄø+—+•ÊÍ›7¿üòËr¹\,ÛÚÚ-\¸0##£ªx†qpp ùàƒT*U­_ãùóç‡êåå%‰¼¼¼FŒ_ë½X“/¾ø";;›ˆ ÅçŸÎUå:úî»ïºwïþõ×_çä䔕•=|øpß¾}=zô¨ÝÞ¬ã˜X3€ NŸ>]þÿ̺uë¸Ç<Œœ...{÷î­ª‰ñêž;wÎÇÇÇ`/vvvÛ¶m«6ž.]ºÕâΛ7Ï*ÏúÛ·o—¿–9sæpÔR§NØ?¢\.ç$€ððp"êܹ3õîÝÛ•kñfbPûöí‰hÀ€·oß.--MKKÛµk× /¼`JÛÚE^•9yƒ7n\ùûINNŽ…{¨)Þ„ƒeXqâÎ>ÖjµOŸ>½yóæ¶mÛ‚ƒƒÙMÛ·o7ÒÄøYñññ‰„ˆBBBöîÝ›’’¢R©”JeBBÂòåËåryÅúzÍ ÅîÝ»‰hÉ’%5}uŸ|ò ‰D¢9sæÜ¹sG­Vgee>|¸W¯^5ÝUCƒÄÝ:p›¸§¤¤[[ÛÔÔT[[[†a-YÙ\‰»H$"¢ÜÜ\S*×ÀI=Aâü‚©2DD Ã8::FGG_¹r%66–ˆfΜùèÑ£Zﳸ¸xÔ¨QjµzòäÉ¿þúë˜1cš7o.‘Hd2;UæÞ½{ÑÑÑU5wqq;vìæÍ›‰èèÑ£5êúÉ“'sçÎ%¢mÛ¶­ZµªM›6666Æ ûé§ŸjýЬF\\œV«:t¨¯¯ï!Ct:ÝÎ;-_¹îš6mJD¿ÍÖšÕkÆå·à«q×£Õj»víJDË—/7±Iå­Û¶m#¢:”••Õ:ž‚‚"’ÉdìÓ:Ñ‘#G*7?räëtº5kÖQ×®]Mé—w0ân8q×h4ì¶øøxNwîÜ9"òöö6xªÖSå½™±nÝ:¶‹›7ošR¿* ÿ˜ÔŒ¸¿`ÄÀ†a¦OŸND¿±ÔÔñãljhæÌ™B¡Ð\M˜0ˆ VÅÅÅ•W`Ã3fŒ¹ú°&ßÿýÇÛ´iÓ½{w"êÑ£GëÖ­ÓÓÓ¿ûî;KV®;µZ}ñâE"JOOïÞ½ûo¿ýVë]YÍ1°nHÜ {á…¨n?@'$$Q­—w`}óÍ7DÔ²eKöé¨Q£¤Ré©S§ÒÒÒ*VKKK;}ú´T*9r$]¿~ˆºvízøðáàà`ggçîÝ»ïÚµKgôª\€Æ`ÇŽô÷·\û˜-·XeªzDS^…N§:tèÁƒºuë¦P(ÂÂÂ*æîiii Ãxxx˜²·†|LL‰ ±àxÄx¢±M•ÑétÅÅÅD$‰*71ñœb/+..®]<¹¹¹{öìa/N]¼xqyùˆ#ˆhéÒ¥Û.Y²„ˆ"##Ù§ì±W•2dˆF£11¤† Se¬WSe=z$‹ÅbqVV–^¡H$zôè‘e*×ýšŒçêêš R©úôéCD...W¯^e+°™q¿~ýø~Lª¿.0Uø#î†ét:"²ü`Où {qj^^^HHÈìÙ³Ë+°ƒUÇÎu:Ý®]»¨Â˜–V«%¢Õ«W»¸¸ú裠  ‰DòÅ_„††æææ†……]½z•þž>7xð`¾SŽ@cQ_ßÀº4Â÷ääd"òôô4½‰ÞVvµG#K¤l^ÎÎήC‡+V¬P*•«iµZ???"úá‡Øö¯ãçç§ÕjÙWWWv'‡ªØöÀDbbH FÜ­W#î­[·6ò™ØªU+ËT®Ñ›‰A666DTXXX^¢P(ÚµkGDÎÎÎK—.%"wwwSîÁ‹cRO0âü‚wÃ~ùå"zæ™gj½v˜šÞ©´üä,,,üý÷ß,X “É*V`†ý¤a‡ÓÊDEE•ÿ>ТE öÁ€*¶8p ™iå8>Š¿{÷®‘ ÷îÝc—=©×ÊfakkËî¶¼ÄÅÅåÔ©Syyyï½÷-[¶Œ­f„5«‡ÄÀN·qãF"bïöW;¯¿þ:­[·N£Ñ˜-2""ŠŠŠÇÏÍÍU(ÇÇ:vìh¤9.ö‚F‹ö½hÑ"ƒCY ,  _‰ë¯²Y°KÖΞ=»´´´¼ÐËËkÖ¬Yìc;;»aÆU»k:&ÖÏàé §QM•Ñh4ï¼óÙÙÙeffšÒÄàV¥RéëëKDS¦L1¸¼qaaatt´‰;×Ó·o_"Ú°aÃúõ뉨oß¾·–¯³¦·âûÁƒ‰¨K—.&öÒ0aªŒu°üT™¼¼<™LÆ0Lrr²Á ‰‰‰ ÃÈd²¼¼¼ú«Ì–ÔèÍÄ óçÏ " ýöÛoóóóÓÓÓçÏŸÏ^Ïþ·gÏž*•ÊÈNxtLê ¦Ê¿ q“4†Ä½  àÖ­[Û·o/Ï'âââŒ7©vk||<»ÀK§N>ýôÓ¨Õj¥R™°|ùrv¼‰;×sèÐ!"êСCPP>|¸âV­V˾ 77·#GŽ:tÈÅÅ…ˆvìØab/ wë`ùĽüg4#uˆhãÆõW™}Z÷Ä]§Óíܹ“é®gÚ´iñññvvvD4|øðò«_*ãÑ1©'HÜ_¸ƒI¬8q7ÈÕÕuß¾}U51¾C½Â³gÏz{{ìÅÎÎnûöí&î\J¥*¿ÕÍÍM­VëU¸}û¶Áõ›ß|óM#Ÿâ¼€ÄÝ:X>q¦Jßrõ>|˜ˆ‚ƒƒë¯2û´o&ݼy3::Úßß_"‘ØÚÚöèÑãØ±cì¦3gΰWÈÄÆÆVÕœGǤž q~AâÎo#FŒ°Lfõ‰;Ã0vvv­ZµŠD¢%K–¤¥¥•””üþûïAAADäíím°|üøñzÍ+PUš^±¤gÏžû÷ïOMM----((8{öl·n݈(66ÖxCƒå "‘ˆˆ¢¢¢îÞ½«V«ïÞ½;vìX"‹Åׯ_¯ÜV$­X±"==½¤¤äòåËD4nÜ8“±Å!q~AâÎoHÜë‰X,&¢ÜÜܪ*¼ýöÛD£W¾}ûv":thy {ÐæÎ[y'#FŒ ¢¥K—V,\²d EFFš±#+ƒÄÝ:ð1q¯éù¸bÅŠŠÕ~þùg#åÍ›7×k^9S÷ʲ²²ˆ¨U«V¦4Ô+?~< >\¯ZDDû¦rÛ•+WV,Œ×{u wàÌq0€ëÞ½ûêÕ«/^¼¨V«õ*|ÿý÷D4}út½ò¡C‡Ñ/¿ü¢W>a„ʽ°…»víÒUø°ÜµkWÅúféÌ¢¦ç#›õ– 1Rž™™i– ÓÓÓcccŸ{î9{{{vÒ¹§§'¥¦¦ÖboçÎ#"öKE³gÏ&¢³gÏVnR1&¢.]ºù^@#‡å  زeË Aƒnܸ1wî\"’J¥}úôyûí·_zé%¶Brr2µoßžþ^=­â?~¬·Ã-ZTî¥OŸ>~~~ÉÉÉ?þøcŸ>}ˆèÌ™3)))~~~½{÷6cG`5=½¼¼*>•H$FÊKJJêá­[·ºwï®w)*«ò„)ÒÓÓ‰¨]»vzåìA`·ê©¿Wq0 $$äþýûœ8qbûöíKJJNœ8ѧOŸ={ö°´Z-i4F£ÕjË',±[KKKõvÈNÕÃ0 ;4Ç–°¢¢¢ÊWu0KG`5=Í«¼##æÍ›§P(ºwï~úôéÇ—––êtº²²²z ,‰;€a2™lĈÛ·o¿víZvvö¼yót:ݲeËØ­Íš5#¢‡V5 ÍÄ^¢¢¢ÁñãÇsss ÅñãÇAÅšÍÕÔÅÎGö2½1rvªºqì̖LJ……¹»»³ßä“’’j‰··7]¿~]¯œ-a·€Å q¨ž‹‹Ë¢E‹ˆèÁƒlÉ€ˆhÍš5uÜs³fÍÂÂÂT*Õþýû÷ï߯V«ÃÂÂØäÀ¼@ÝYì|”ËåDtåÊ•Š…»wï®¶!›ëÛØØT,\»vmåšì –ââbã;ìÙ³§Á=|øá‡DÔ«W¯jC3Bâ`@çÎׯ_ýúu¥R©ÑhgÍšED~~~l…wÞyÇÍÍmݺuÇ?wî\^^žF£yúôé•+W>üðÃòKÐLÁ^¦ÇΓѻºÔŒ@Yì|d/§™2eÊo¿ýVVV–‘‘ñþûï³ÃÆ•¯,™˜˜XVV–””4cÆŒM›6U®ÉìÞ½[¥RÙáŒ3D"Ñ&MštÿþýÒÒÒû÷ïO˜0áÈ‘#b±xÆŒµ|…P;&­= –ƒ¬'O¡PxäÈ‘ò:/^dGÅŒŸYÕžh*•ÊÕÕ•­æææ¦V«õ*˜«#«å ­—ƒÔÕù|4±üÎ;•oó4uêÔÊÍõJNœ8Qù¾§å÷{ªØpþüùƒ¯\sãÆ•÷)¶nÝZ»W× `9HàŒ¸põêÕØØØ   [[[‘Häíí=lذ .°‹¾±BCCoÞ¼¹bÅŠÐÐPggg¡PèììÜ¥K—Ù³g_½zÕô¾$ÉèÑ£ÙÇ£FÒûÛŒ@ÝYæ|lÓ¦M||ü+¯¼âèè(“É‚ƒƒ·nݺqãÆj¾úê«'NœèÚµ«T*µ··ïܹóæÍ›·nÝZ¹æâÅ‹çÍ›Pù=GÏÔ©SÏŸ?ÿÆoxxxˆD"Áƒ_¸paÒ¤Iµ|yP[Œ·ñYxxø©S§*…˜Ý?üÎ>^·n~ݹsç™gžaÏ™3gÕªUÜÆµÓ¹sgv·\.ÏÈÈà:h¤¢¢¢Ê/ÈÉÉ)ÿýÓ’Þxã½{÷:88X¾kàŒ¸ðw@âÀHÜx‰;ˆ¸5­V‹Ue€+J¥’ëj‰;¿}ùå—X  þdeey{{sg8 •J¹Žø‰;¿ÙÚÚZ¾ÓüüüÌÌLË÷ Àzüø1×!˜L&ã:à $îPc‹-Z´h×Q4.HÜ€:uâ: €H$®C¨wàÀ¼yó¸€g¸ƒI|||&OžÌuúžþy®C°F§ÓqT7`à$î<€Ä€¸ðw@âÀHÜx‰; qà$î<€Ä€¸ðw@âÀHÜx‰; qà$î<€Ä€¸ðw@âÀHÜx‰; qà$î<€Ä€¸ðwqÔIRRÒ… ,Ö]›6mBCC-ÖÝ7~ûí7‹uÜ®];‹uwéÒ¥;wîX¬»nݺµlÙÒbÝ={655ÕbÝ…‡‡Ëår‹u÷í·ßfgg[¬»×^{ÍÉÉÉbÝ;vL©TZ¬»ÈÈH±Xl±îöîÝk±¾Äbqdd¤ÅºS*•ÇŽ³XwNNN¯½öšÅºËÎÎþöÛo-Ö\.·Xw¦Ãˆ;ü?ï£îí,œÕ"IEND®B`‚dibbler-1.0.1/doc/dibbler-devel-01-intro.dox0000664000175000017500000000134412233256142015371 00000000000000/** * @page intro 1. Introduction Welcome to the Dibbler developer's guide. This document describes various aspects of the compilation and installation of Dibbler server and client. Detailed description of the internal architecture is also provided. People with programming background can find useful informations here. Main purpose of this document is to help contributors to quickly know Dibbler from the inside. This document is intenteded just as its title states -- a guide. It is not a thorough code description. To quickly wander around classes and methods used, see documentation generated with the Doxygen tool (open file doc/html/index.html ). More informations about documentation is provided in section @ref generalDocs. */ dibbler-1.0.1/doc/dibbler-devel-08-contrib.dox0000644000175000017500000001026112304040124015667 00000000000000/** * * @page contrib 8. Contributing code * * Dibbler has many shortcomings. There are many known reported bugs. New IETF drafts and * RFCs are published frequently and Dibbler does not support many of them. If you know * C++ or are skilled documentation writer, package maintainer, can improve build system * or are able to contribute in any other way - great! This section is written especially * for you. * * Preferred way of contributing code is providing patches. To ease merging process, they * should be done against the latest available code in GIT. In most cases your patch * will be generated against master, but there are cases when you may contribute code to * other long-lived branches. Please see GIT repository for available branches. If your * patch is generated against specific branch, rather than master, please clearly state * that. It will greatly increase that likelihood of acceptance. * * If there is no other choice, you may also provide patches against stable versions. As * they are rather infrequent and code changes significantly between releases, it will be * more difficult for me to review and merge the code. * * The least preferred way of contributting code is to send whole sources, packed as tar.gz * or zip. If you absolutely have to do that, please clearly state, which version code * was used as a base. Note that this greatly complicates review and merging process. There * is also non-zero chance that it will introduce regressions, so please avoid this if * possible. * * If you start working on a feature, you may want to subscribe to dibbler-devel mailing list * and announce your intentions. Also, that is the recommended way of asking questions. * While there's pretty good change that I (Tomek Mrugalski) will be answering those questions, * I'm very busy person and travel frequently. Therefore I may not be able to respond to any * questions for prolonged periods. If you send them directly to me, your chances for getting * a response are 0%. During writing of this documentation, there is over 30 people subscribed * to dibbler-devel list. Oh, and this is very low-volume list. It is hard to estimate exact * traffic, because there was no single post since 2008 (this section is written in October 2011). * * Depending on the quality, completeness and usefulness of contributted code, your code may * be rejected, but such cases are relatively rare. I may ask you to fix certain aspects (that is * much more common). If the code change is relatively small and safe, it will probably end up * on master. However, if it is large, highly experimental, touches essential parts of the code, * or we are in code stabilization phase before a release, your code may end up on a dedicated * branch. In case of merging to master or creating a branch, I will ask you to confirm that * merged code works as advertised, so be prepared to download latest code from GIT and rerun your * tests. * * @section tests 8.1 Testing * * In version 0.8.1RC1, support for unittests was added. Dibbler uses * googletest (often abbreviated as gtest) * for unittests. To run unittests, please use following commands: * @verbatim ./configure --with-gtest=/path/to/your/compliled/gtest/sources make make check @endverbatim * * It would be great if contributted code included unittests. That is not necessary, however. * During writing this section (Oct. 2011) googletest support was very fresh, so number of * available tests was very limited. For example of a unittest, see tests for TOptAddr class * in Options/tests/OptAddr_unittest.cc. * * As of Feb. 2014 there are moderately extensive tests for the server side. They are located * in tests/Srv directory. * * Author was experiencing odd linking errors about undefined reference to `pthread_key_create' * and other pthread functions on Ubuntu 13.10 x64 and gtest 1.7.0 (some dibbler tests were * linking fine, while others, namely Misc/tests, were failing) when linking dynamically. * Therefore the gtest unittests are now being linked statically by default. If you don't like * that behaviour, there's --enable-gtest-static=no option that will revert to the old way. * */ dibbler-1.0.1/doc/logo-eu.jpg0000664000175000017500000021004212233256142012654 00000000000000ÿØÿàJFIF,,ÿáèExifMM*bj(1r2އi¤Ð-ÆÀ'-ÆÀ'Adobe Photoshop CS3 Windows2008:09:16 14:10:05 ÿÿ < &(. ²HHÿØÿàJFIFHHÿí Adobe_CMÿîAdobed€ÿÛ„            ÿÀ5 "ÿÝ ÿÄ?   3!1AQa"q2‘¡±B#$RÁb34r‚ÑC%’Sðáñcs5¢²ƒ&D“TdE£t6ÒUâeò³„ÃÓuãóF'”¤…´•ÄÔäô¥µÅÕåõVfv†–¦¶ÆÖæö7GWgw‡—§·Ç×ç÷5!1AQaq"2‘¡±B#ÁRÑð3$bár‚’CScs4ñ%¢²ƒ&5ÂÒD“T£dEU6teâò³„ÃÓuãóF”¤…´•ÄÔäô¥µÅÕåõVfv†–¦¶ÆÖæö'7GWgw‡—§·ÇÿÚ ?õT’Uú†QÃÀÉË õ=O´0¡Û_·æîÚ’› .g¥ýkÍÌû/¯†ÚŽe9 ÜØn;qÁúæ.#ìõ]›üíL}£ý¶þeoñ†çÜÇdb1˜¿gnE»,{®kN zÕ¶1®¦¼k^ï²ú_jûGøKÒIOh’ä®úãÔ±+{sð±èÈuX¹4m½ÖVÚ²¯n ¾Õ`¡»,IJÆ=þ—©^C?™þmXéÿZz†oRÄÃû Ë±Ù‘{Þ2 h{òéf͸~uØÜZŸÚ6tû,®ïæ½_R´”ô©.:ñƒöžžü¼l!“crꥸÔZ,±Ø÷Wöº¯kZßé~‹mgØ>Ÿ¯O¥ê- ¾µ‹ñpr¨¥–ÕŸÔŸÓë{l–šÚ솳1Ž ;ýJñ}OOþùÄ”ô).C3ëëðþÐë°¿EE9nõEžÑv=ù˜x”_,“3ÝÓÞÊîÿ¹VÓ³ôµ«­úÇÔ²s®éØ8t»&»²ZÓuÎef¬_²5ï.e¹·Ýn}u²½»+þwÔÿ’ž‰sgü`tŽÔ­é¹8ùV]FÒçTÚËö¶Öí6_[¾‹ÿqŸ¯‚ÛkiÃ,«+ì?cµÏÑîÌû+ïdzÛú<œ\|ß´×[}O´ÓMÿè¬\OøÁÿÅvwŸüõZ±ÊbŽL†2ۆسä0‡w·¯ÿÇW Ü\ßó*ÿÞ”¿ñÕè÷7üÊ¿÷¥yzJ÷Üpö?kOï™|>ÇÔ?ñÕè÷7üÊ¿÷¥/üuzýÅÍÿ2¯ýé^w›Ó‡‰’ûkµ¹Œ/k+'sb×îo³ôo©ßÛDÊÄé·u*q:Eî}7zläÀ,wèݻ۹¬s½ÿõÅÁÊš Hĉž1ÅÁdðÏŠ_¢Èsgáôþ—¯å}ÿ^ÿqsÌ«ÿzRÿÇW Ü\ßó*ÿÞ•æÙ؇ 2ÜW=¶š]·Ô®K]àæÏòP‘äùyDJ6D€×¡Y.k,I ‹êükt û.nšý ¿÷¥v÷·#¬†sö‡r†áº%|úÿ ï^ùÒ¿ä¼?øŠ¿ê«sx!ˆDÂõ'rØå³K'i[?ÿÐõ œŠqqìÉÈx®šš_cÏ`9áV»;¦dcdWè¤S»&»ZêȪÃmev5–5–ú7µO«a¿?¦dáÖàÇß[˜×:`;úeÿ1ÛÖu:ÂñêVÖeÒÌl çYkšÊ­ºæ>‹®ý%¶YVUµ~Ÿù«=+?I]~…©MSÓ~¥¿øOiu8O 1öd´»ü–ú1^÷úöQs™û?옮~5ïý[ÒVGüÖQkCëîõkÚ,hÒÆôxµ‚éWkz}”ÞÚ¿Ð>¿QE¿W2jÉûe9 u͵ù e»ÜÍλ"ïM¡Ïw£]¸ÙÖÓo§ÿj*ÅËô¿CèØjº³4fgÊ/m/Ȫºm;í{ë4Ùm´ßVKœ.Èöd;ÔÆÈýýoÔõ[…õ%´;)£Ð¶ˆö€âÁKn³g®ö{q÷gúþžUî­öåúŸ¦õQ¬é_Tú‰-5×cíÊÈsö<ämô:…&ÊžË[êUéåcîô/®¿ÒVôÖý_Í5fcWuC©Vúr aÝ[ûÜ]F®mŽv6O¥²ÏÑÕ{>ÑúoRÊnú³”ç=ôæ Ç(ÚOÓ½×·&¿w·')øïwý©Ùÿq©IIq°>©ç ,Ū‹[’êóqzp},jo£l6¿²5Ôcþó?D¼ãü`ÿâ»;áOþz­zE; 9¹8ײê˜o ªàZ[^GÙ,±­u-ÛíÈÃºßæÿíOüé<ßü`ÿâ»;áOþz­\ä??Ý?œZüßó_PóÊÞGMªœ¦æc‹m¯n3È¿éo|=žÝí¯û¢¨®òþ”:xƯôVÝ”=H'Ó-{öûkÜê¿wú:ÿ¯å@DA”xŒgíJù¸¸£ÿA¥ˆ€I±`<|^ („é$¥cmâ_ÓªÃË«'Û“kZ1nYs·4=¿ÈüÕQ[éy®À˃™B¦ÕÚÐæ{ÿFÿk¶{íU\w8º’LàÖ†·üÕA'¡á— ¸Œø‡pJÇþK†0‡þÉ" !¨±b¸kÓûÜ_¤ÁÿAß½ó¥ÉxñÿÔ5xþƒ¾{çJÿ’ðÿâ+ÿ¨j©ñ–e³É~ŸÑÿÑõUÈd?¨}›+ì¯Í9å/´‚o,‡dý‡ÑÿG‘ê}ìŸaý'Ù=Oø%פ’žq¿oõñ©Ç²÷cçík­粟³\ûòwÝ“7ÕûCÿdcœÿç*ýFËʦžn[ò=Áã3pÉ|Zj¨µ·³ =Õ;Ôõ}µþ«¿ùµÕ$’ž<;©»¦±Ù®êÇ#ª±ÆæÖ/6Qì¡ín?é]{iOýìïW#ô¿©ØŽúzæ._ÙŹ6‹©û6öÙ].É»*Úr½[¿œwKǪ¼{.é.õ1ýUÔ¤’ž3ö¸ÙUÝfmwÙŽÚŽìsZú0[}´±ÿªzµÚ짾͟iûG¬®zS*áöïµ2Æg²‹= .¦§T1™¾úF5£õK¯¯¹ÿ ¹öczž§¨ºt’SÏu::­™^Ìo[ôxe¸{-µŸ¥5]ý†–â[g¨êÿHïÒ2ÏúÚ…¹G/3í==Ù¦^K××]‚¼wzØÖ¶á_§MÏ·Óõ_üÖvË=ÿf²¥Ò$’žN›zƒ«©À掠êð]]‚àpiÊûmGõM¿Ï7;Õý5à¿Zû"â?Æþ+³¾ÿçª×±¯(úóѺÎWÖœËñp2o¥â­¶×SÞÃV×m{[ír·È2›5é;ùŃšã /PòJÖTÎÀ«"œ[63-žÃŰæûqÞÿ§ôÑ¿æïÖü«Ìÿ¶,ÿÈ%ÿ7~°ÿå^gý±gþAhÏÚœxgÃ(èxeÃ!éõE£剸‰Üy4âãb^/ªÿ¶4¸U^âöËæ·ü”ÿê¿Ò¦=+2¼êpr˜píÈ,Úo­ÈØ÷C]í÷{ÿÑ?ùß¡b'üÜúÁ¯ù+3^AgþA'£}j˳ÕÉéù×Yw¾› $6v~näÀd({°:NäG¯ŠGõ<#äô~’ólûr-Gô¯l,ÊÌé?né8ù ·ó²ç×;^;[ŽÝ»šÿ~Ïç?á©YËCþnýaÿʼÏûbÏü‚_ówëþUæÛäQÆ1ÂÍÇŽTrLpÄåœb!Ç>Òá‚ÙŒ’ýp–;ðÇ÷\×ý| ÷Εÿ%áÿÄWÿPÕâú»õ‡k¿Éyœðä¶tÖ=;ikÛMaÍ"!­–¸*¼üŒ(ƒ©Ù³ÉÆCŽÁnÿÿÒõT—Ê©$§ê¤—Ê©$§ê¤—Ê©$§ê¤—Ê©$§ê¤—Ê©$§ê¤—Ê©$§ê¤—Ê©$§ê¤—Ê©$§ê¤—Ê©$§ê¤—Ê©$§ÿÙÿíôPhotoshop 3.08BIM/8BIM%ׄž ':ue€·ÕtÕ¥ù²8BIM/JÀ$HHÐ@dÀ°'jpg ü8BIMí,,8BIM&?€8BIM 8BIM8BIMó 8BIM 8BIM' 8BIMõH/fflff/ff¡™š2Z5-8BIMøpÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿèÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿèÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿèÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿè8BIM@@8BIM8BIM?<UEang<nullboundsObjcRct1Top longLeftlongBtomlongRghtlong<slicesVlLsObjcslicesliceIDlonggroupIDlongoriginenum ESliceOrigin autoGeneratedTypeenum ESliceTypeImg boundsObjcRct1Top longLeftlongBtomlongRghtlong<urlTEXTnullTEXTMsgeTEXTaltTagTEXTcellTextIsHTMLboolcellTextTEXT horzAlignenumESliceHorzAligndefault vertAlignenumESliceVertAligndefault bgColorTypeenumESliceBGColorTypeNone topOutsetlong leftOutsetlong bottomOutsetlong rightOutsetlong8BIM( ?ð8BIM8BIM8BIM Π5àc` ²ÿØÿàJFIFHHÿí Adobe_CMÿîAdobed€ÿÛ„            ÿÀ5 "ÿÝ ÿÄ?   3!1AQa"q2‘¡±B#$RÁb34r‚ÑC%’Sðáñcs5¢²ƒ&D“TdE£t6ÒUâeò³„ÃÓuãóF'”¤…´•ÄÔäô¥µÅÕåõVfv†–¦¶ÆÖæö7GWgw‡—§·Ç×ç÷5!1AQaq"2‘¡±B#ÁRÑð3$bár‚’CScs4ñ%¢²ƒ&5ÂÒD“T£dEU6teâò³„ÃÓuãóF”¤…´•ÄÔäô¥µÅÕåõVfv†–¦¶ÆÖæö'7GWgw‡—§·ÇÿÚ ?õT’Uú†QÃÀÉË õ=O´0¡Û_·æîÚ’› .g¥ýkÍÌû/¯†ÚŽe9 ÜØn;qÁúæ.#ìõ]›üíL}£ý¶þeoñ†çÜÇdb1˜¿gnE»,{®kN zÕ¶1®¦¼k^ï²ú_jûGøKÒIOh’ä®úãÔ±+{sð±èÈuX¹4m½ÖVÚ²¯n ¾Õ`¡»,IJÆ=þ—©^C?™þmXéÿZz†oRÄÃû Ë±Ù‘{Þ2 h{òéf͸~uØÜZŸÚ6tû,®ïæ½_R´”ô©.:ñƒöžžü¼l!“crꥸÔZ,±Ø÷Wöº¯kZßé~‹mgØ>Ÿ¯O¥ê- ¾µ‹ñpr¨¥–ÕŸÔŸÓë{l–šÚ솳1Ž ;ýJñ}OOþùÄ”ô).C3ëëðþÐë°¿EE9nõEžÑv=ù˜x”_,“3ÝÓÞÊîÿ¹VÓ³ôµ«­úÇÔ²s®éØ8t»&»²ZÓuÎef¬_²5ï.e¹·Ýn}u²½»+þwÔÿ’ž‰sgü`tŽÔ­é¹8ùV]FÒçTÚËö¶Öí6_[¾‹ÿqŸ¯‚ÛkiÃ,«+ì?cµÏÑîÌû+ïdzÛú<œ\|ß´×[}O´ÓMÿè¬\OøÁÿÅvwŸüõZ±ÊbŽL†2ۆسä0‡w·¯ÿÇW Ü\ßó*ÿÞ”¿ñÕè÷7üÊ¿÷¥yzJ÷Üpö?kOï™|>ÇÔ?ñÕè÷7üÊ¿÷¥/üuzýÅÍÿ2¯ýé^w›Ó‡‰’ûkµ¹Œ/k+'sb×îo³ôo©ßÛDÊÄé·u*q:Eî}7zläÀ,wèݻ۹¬s½ÿõÅÁÊš Hĉž1ÅÁdðÏŠ_¢Èsgáôþ—¯å}ÿ^ÿqsÌ«ÿzRÿÇW Ü\ßó*ÿÞ•æÙ؇ 2ÜW=¶š]·Ô®K]àæÏòP‘äùyDJ6D€×¡Y.k,I ‹êükt û.nšý ¿÷¥v÷·#¬†sö‡r†áº%|úÿ ï^ùÒ¿ä¼?øŠ¿ê«sx!ˆDÂõ'rØå³K'i[?ÿÐõ œŠqqìÉÈx®šš_cÏ`9áV»;¦dcdWè¤S»&»ZêȪÃmev5–5–ú7µO«a¿?¦dáÖàÇß[˜×:`;úeÿ1ÛÖu:ÂñêVÖeÒÌl çYkšÊ­ºæ>‹®ý%¶YVUµ~Ÿù«=+?I]~…©MSÓ~¥¿øOiu8O 1öd´»ü–ú1^÷úöQs™û?옮~5ïý[ÒVGüÖQkCëîõkÚ,hÒÆôxµ‚éWkz}”ÞÚ¿Ð>¿QE¿W2jÉûe9 u͵ù e»ÜÍλ"ïM¡Ïw£]¸ÙÖÓo§ÿj*ÅËô¿CèØjº³4fgÊ/m/Ȫºm;í{ë4Ùm´ßVKœ.Èöd;ÔÆÈýýoÔõ[…õ%´;)£Ð¶ˆö€âÁKn³g®ö{q÷gúþžUî­öåúŸ¦õQ¬é_Tú‰-5×cíÊÈsö<ämô:…&ÊžË[êUéåcîô/®¿ÒVôÖý_Í5fcWuC©Vúr aÝ[ûÜ]F®mŽv6O¥²ÏÑÕ{>ÑúoRÊnú³”ç=ôæ Ç(ÚOÓ½×·&¿w·')øïwý©Ùÿq©IIq°>©ç ,Ū‹[’êóqzp},jo£l6¿²5Ôcþó?D¼ãü`ÿâ»;áOþz­zE; 9¹8ײê˜o ªàZ[^GÙ,±­u-ÛíÈÃºßæÿíOüé<ßü`ÿâ»;áOþz­\ä??Ý?œZüßó_PóÊÞGMªœ¦æc‹m¯n3È¿éo|=žÝí¯û¢¨®òþ”:xƯôVÝ”=H'Ó-{öûkÜê¿wú:ÿ¯å@DA”xŒgíJù¸¸£ÿA¥ˆ€I±`<|^ („é$¥cmâ_ÓªÃË«'Û“kZ1nYs·4=¿ÈüÕQ[éy®À˃™B¦ÕÚÐæ{ÿFÿk¶{íU\w8º’LàÖ†·üÕA'¡á— ¸Œø‡pJÇþK†0‡þÉ" !¨±b¸kÓûÜ_¤ÁÿAß½ó¥ÉxñÿÔ5xþƒ¾{çJÿ’ðÿâ+ÿ¨j©ñ–e³É~ŸÑÿÑõUÈd?¨}›+ì¯Í9å/´‚o,‡dý‡ÑÿG‘ê}ìŸaý'Ù=Oø%פ’žq¿oõñ©Ç²÷cçík­粟³\ûòwÝ“7ÕûCÿdcœÿç*ýFËʦžn[ò=Áã3pÉ|Zj¨µ·³ =Õ;Ôõ}µþ«¿ùµÕ$’ž<;©»¦±Ù®êÇ#ª±ÆæÖ/6Qì¡ín?é]{iOýìïW#ô¿©ØŽúzæ._ÙŹ6‹©û6öÙ].É»*Úr½[¿œwKǪ¼{.é.õ1ýUÔ¤’ž3ö¸ÙUÝfmwÙŽÚŽìsZú0[}´±ÿªzµÚ짾͟iûG¬®zS*áöïµ2Æg²‹= .¦§T1™¾úF5£õK¯¯¹ÿ ¹öczž§¨ºt’SÏu::­™^Ìo[ôxe¸{-µŸ¥5]ý†–â[g¨êÿHïÒ2ÏúÚ…¹G/3í==Ù¦^K××]‚¼wzØÖ¶á_§MÏ·Óõ_üÖvË=ÿf²¥Ò$’žN›zƒ«©À掠êð]]‚àpiÊûmGõM¿Ï7;Õý5à¿Zû"â?Æþ+³¾ÿçª×±¯(úóѺÎWÖœËñp2o¥â­¶×SÞÃV×m{[ír·È2›5é;ùŃšã /PòJÖTÎÀ«"œ[63-žÃŰæûqÞÿ§ôÑ¿æïÖü«Ìÿ¶,ÿÈ%ÿ7~°ÿå^gý±gþAhÏÚœxgÃ(èxeÃ!éõE£剸‰Üy4âãb^/ªÿ¶4¸U^âöËæ·ü”ÿê¿Ò¦=+2¼êpr˜píÈ,Úo­ÈØ÷C]í÷{ÿÑ?ùß¡b'üÜúÁ¯ù+3^AgþA'£}j˳ÕÉéù×Yw¾› $6v~näÀd({°:NäG¯ŠGõ<#äô~’ólûr-Gô¯l,ÊÌé?né8ù ·ó²ç×;^;[ŽÝ»šÿ~Ïç?á©YËCþnýaÿʼÏûbÏü‚_ówëþUæÛäQÆ1ÂÍÇŽTrLpÄåœb!Ç>Òá‚ÙŒ’ýp–;ðÇ÷\×ý| ÷Εÿ%áÿÄWÿPÕâú»õ‡k¿Éyœðä¶tÖ=;ikÛMaÍ"!­–¸*¼üŒ(ƒ©Ù³ÉÆCŽÁnÿÿÒõT—Ê©$§ê¤—Ê©$§ê¤—Ê©$§ê¤—Ê©$§ê¤—Ê©$§ê¤—Ê©$§ê¤—Ê©$§ê¤—Ê©$§ê¤—Ê©$§ê¤—Ê©$§ÿÙ8BIM!UAdobe PhotoshopAdobe Photoshop CS38BIMÿá¨http://ns.adobe.com/xap/1.0/ ÿîAdobed@ÿÛ„      ÿÀ<ÿÝhÿÄ¢  s!1AQa"q2‘¡±B#ÁRÑá3bð$r‚ñ%C4S’¢²csÂ5D'“£³6TdtÃÒâ&ƒ „”EF¤´VÓU(òãóÄÔäôeu…•¥µÅÕåõfv†–¦¶ÆÖæö7GWgw‡—§·Ç×ç÷8HXhxˆ˜¨¸ÈØèø)9IYiy‰™©¹ÉÙéù*:JZjzŠšªºÊÚêúm!1AQa"q‘2¡±ðÁÑá#BRbrñ3$4C‚’S%¢c²ÂsÒ5âDƒT“ &6E'dtU7ò£³Ã()Óã󄔤´ÄÔäôeu…•¥µÅÕåõFVfv†–¦¶ÆÖæöGWgw‡—§·Ç×ç÷8HXhxˆ˜¨¸ÈØèø9IYiy‰™©¹ÉÙéù*:JZjzŠšªºÊÚêúÿÚ?üÿâ¯ßÌØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»?ÿÐüÿâ¯ßÌØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»?ÿÑüÿâ¯ßÌØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«²éŠ»+vlUÙ±WfÅ]›vlUÙ±WfÅ]›vlUÙ±WfÅ]›vlUÙ±WfÅ]›vlUÙ±WfÅ]›vlUÙ±WfÅ]›vlUÙ±WfÅ]›vlUÙ±WfÅ]›vlUÙ±WfÅ]›vlUÙ±WeÓvV*ìØ«³b®ÍŠ»6*ìÿÒüÿâ¯ßÌØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³í—üûëòOò‹óò"ó^óÇåÇ—ü׬§šu UÕ5;n'G«$|ÝIâ¥ØïŸ.Á‹ÚžÕìÞÛtºœ˜¡áDðÆF"É•šv}ìÖƒOŸJe’‘â;‘}³Üô+_óŽ_ùdüÿp«ù£<§ý{Aÿ)Ù¿ÓËõ½ò>ýJ? ìßô+_óŽ_ùdüÿp«ù£ô}íü§fÿO/Ö¿Èú?õ(üƒ³ЭÎ9å“òwý­ÿæŒÑ÷´ò›ý<¿Zÿ#èÿÔ£òÍÿBµÿ8åÿ–OÉß÷ ·ÿš1ÿGÞÐÊvoôòýkü£ÿRÈ;7ý ×üã—þY?'Ü*ßþhÇý{Aÿ)Ù¿ÓËõ¯ò>ýJ? ìßô+_óŽ_ùdüÿp«ù£ô}íü§fÿO/Ö¿Èú?õ(üƒ³ЭÎ9å“òwý­ÿæŒÑ÷´ò›ý<¿Zÿ#èÿÔ£òÍÿBµÿ8åÿ–OÉß÷ ·ÿš1ÿGÞÐÊvoôòýkü£ÿRÈ;7ý ×üã—þY?'Ü*ßþhÇý{Aÿ)Ù¿ÓËõ¯ò>ýJ? ìßô+_óŽ_ùdüÿp«ù£ô}íü§fÿO/Ö¿Èú?õ(üƒ³ЭÎ9å“òwý­ÿæŒÑ÷´ò›ý<¿Zÿ#èÿÔ£òÍÿBµÿ8åÿ–OÉß÷ ·ÿš1ÿGÞÐÊvoôòýkü£ÿRÈ;7ý ×üã—þY?'Ü*ßþhÇý{Aÿ)Ù¿ÓËõ¯ò>ýJ? ìßô+_óŽ_ùdüÿp«ù£ô}íü§fÿO/Ö¿Èú?õ(üƒ³ЭÎ9å“òwý­ÿæŒÑ÷´ò›ý<¿Zÿ#èÿÔ£òÍÿBµÿ8åÿ–OÉß÷ ·ÿš1ÿGÞÐÊvoôòýkü£ÿRÈ;7ý ×üã—þY?'Ü*ßþhÇý{Aÿ)Ù¿ÓËõ¯ò>ýJ? ìßô+_óŽ_ùdüÿp«ù£ô}íü§fÿO/Ö¿Èú?õ(üƒ³ЭÎ9å“òwý­ÿæŒÑ÷´ò›ý<¿Zÿ#èÿÔ£òÍÿBµÿ8åÿ–OÉß÷ ·ÿš1ÿGÞÐÊvoôòýkü£ÿRÈ;7ý ×üã—þY?'Ü*ßþhÇý{Aÿ)Ù¿ÓËõ¯ò>ýJ? ìßô+_óŽ_ùdüÿp«ù£ô}íü§fÿO/Ö¿Èú?õ(üƒ³ЭÎ9å“òwý­ÿæŒÑ÷´ò›ý<¿Zÿ#èÿÔ£òÍÿBµÿ8åÿ–OÉß÷ ·ÿš1ÿGÞÐÊvoôòýkü£ÿRÈ;7ý ×üã—þY?'Ü*ßþhÇý{Aÿ)Ù¿ÓËõ¯ò>ýJ? ìßô+_óŽ_ùdüÿp«ù£ô}íü§fÿO/Ö¿Èú?õ(üƒ³ЭÎ9å“òwý­ÿæŒÑ÷´ò›ý<¿Zÿ#èÿÔ£òÍÿBµÿ8åÿ–OÉß÷ ·ÿš1ÿGÞÐÊvoôòýkü£ÿRÈ;7ý ×üã—þY?'Ü*ßþhÇý{Aÿ)Ù¿ÓËõ¯ò>ýJ? ìßô+_óŽ_ùdüÿp«ù£ô}íü§fÿO/Ö¿Èú?õ(üƒ³ЭÎ9å“òwý­ÿæŒÑ÷´ò›ý<¿Zÿ#èÿÔ£òÍÿBµÿ8åÿ–OÉß÷ ·ÿš1ÿGÞÐÊvoôòýkü£ÿRÈ;7ý ×üã—þY?'Ü*ßþhÇý{Aÿ)Ù¿ÓËõ¯ò>ýJ? ìßô+_óŽ_ùdüÿp«ù£ô}íü§fÿO/Ö¿Èú?õ(üƒ³ЭÎ9å“òwý­ÿæŒÑ÷´ò›ý<¿Zÿ#èÿÔ£òÍÿBµÿ8åÿ–OÉß÷ ·ÿš1ÿGÞÐÊvoôòýkü£ÿRÈ;7ý ×üã—þY?'Ü*ßþhÇý{Aÿ)Ù¿ÓËõ¯ò>ýJ? ìßô+_óŽ_ùdüÿp«ù£ô}íü§fÿO/Ö¿Èú?õ(üƒ³ЭÎ9å“òwý­ÿæŒÑ÷´ò›ý<¿Zÿ#èÿÔ£òÏÿÎz~G~Oy þq÷Qó’ÿ-|½å}r=sL‚=WM°†Þq²0tŠ  Æzwüý«ínÑíØáÕjre‡‡3Ã), Cígéði ±ãŒMÀv|8Ϫß>vlUÙ±WfÅ]›vÿÓüÿâ¯ßÌØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³ôÿ>ÊÿÖr¾ÿÀÇSÿ¨{<ø÷þŸóGþ÷S}+Ù?ñ3ýc÷gÐìñ§¦vlUÙ±WfÅ]›vlUÙ±WfÅ]›vlUÙ±WfÅ]›vlUÙ±WfÅ]›vlUÙ±WfÅ]›vlUÙ±WfÅ]›vlUÙ±WfÅ]›vlUÙ±WfÅ]›vlUÙ±WfÅ]›vlUÙ±Wg‚¿çä_úÌš§þ:Güœ|õÏø ÎGø\þàóžÕ‰ëgç“>Ë|ÉÙ±WfÅ]›vlUÙÿÔüÿâ¯ßÌØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³ôÿ>ÊÿÖr¾ÿÀÇSÿ¨{<ø÷þŸóGþ÷S}+Ù?ñ3ýc÷gÐìñ§¦vlUÙ±WfÅ]›vlUÙ±WfÅ]›vlUÙ±WfÅ]›vlUÙ±WfÅ]›vlUÙ±WfÅ]›vlUÙ±WfÅ]›vlUÙ±WfÅ]›vlUÙ±WfÅ]›vlUÙ±WfÅ]›vlUÙ±Wg‚¿çä_úÌš§þ:Güœ|õÏø ÎGø\þàóžÕ‰ëgç“>Ë|ÉÙ±WfÅ]›vlUÙÿÕüÿâ¯ßÌØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«U¦lUÕÍŠ·›vlUªæÅ]\Ø«y±V«›usb­æÅ]›vlUÙ±WfÅ]›vlUÙ±WfÅ]›vlUÙ±WfÅ]›vlUÙ±WfÅ]›vlUÙ±WfÅ]›vlUÙ±V«›o6*ìØ«³b®ÍŠ»6*ìØ«³ôÿ>ÊÿÖr¾ÿÀÇSÿ¨{<ø÷þŸóGþ÷S}+Ù?ñ3ýc÷gÐìñ§¦vlUÙ±WfÅ]›vlUÙ±WfÅ]›vlUÙ±WfÅ]›vlUÙ±WfÅ]›vlUÙ±Wg4»üÏÐm?6tŸÊI wUòåϘc¶Á!¸Hc„ n΢Wù'¸ÏGÒÿÀÓ´uÆgö®#ü¯”ŠëxóÏÔ?Jÿƒ<¿©ë¿¢ý_Cë?£­d¹ô}^pçéñåÁ©ZÐôÍŠ¿ ¿è¹¿û+¿ø{Þƒ6*×ý;ÿewÿoûÐfÅ_«ÿóŒ¿ó’ô1ŸóÚwç¯ø7üúCô¿üêߤHpýq4ï_Õm«êzUþëá­7¦lUùáù)ÿ?†ÿ•Ãù¹ùqùYÿBíþÿ•æ  ôïø»ëTúì«­õаúœ9W¨µñ±WívlUùÿ9Gÿ?[ÿ¡küöóÏä§ü¨_ñ§ø/ôgüì¿âŸÑßYý#¥Új_ï/è‹®>µÃûÖ¯[Vƒb¯Ð(¿<â?ó‹ÑÎJÏå—Žü­_ÌɼØvU:'é–°[à ‚@ýØ”Ä+ö¸³›~7ê_óüIåGÿœm¶·YkÏ5¼Ìâ¿ ¤zTA :Š·Ï6*˜ùoþ‰_$^oÿœwh4ÇaêÞhþcÏ÷¥½ÆŸÈOüeLØ«õÿþqçþrWò£þr{É'Îÿ•zÌ·–Ö’‹m{A¿ˆ[jz]Ë)e†òÜ4K(ª²;£oÅÚ†›f¿šß›—¿’^IÕ0ÿ3¼Émåo*éV{éù;Ë3×Ó··†0ÒM+x¢)c¹è ~,~dÏîtë}RæËò›òB]WI…È·×üÓ©ýVYÔ¿P´Š^Ån ÜUE)›Nÿ*?çöQÕµkM/ó“ò†óÉúuĉÞlòåÿéH¡å±yl&† B)ܘ呸ôBEb¯ÚŸ%yßʘÞVѼëä]~ÏÍ>Tó ¸¹ÑµÛ OJš¡•VR+¬3b¯ÍïùÌïùù\_ó‰_™öß•Ð~N¿Ÿu ­×[ÓëÃK†5¼’â$ODi÷låL?Ö¹±WÆÏñ<Æ%ŒÏÿ8ç¦É °2Ç™¦Fe¯ÄŽšÁI SO Ø«íßùÆOùú‡äüä™ôŸËÿ0hšåŸuù–ÛA±Õ."½Ò¯î¤`±Z[ê1¬$M!4U–Ã*³;ÍŠ¾žÿœ¼ÿœ‘ÿ¡Uüš½üÛÿ>§ªØiŸáÿÒ?¢ù}uÙ=O¬ýVîœ)Zz{øŒØ«ò‡þ‹ÿ²»ÿ‡·ýè3b®ÿ¢æÿì®ÿáíÿzØ«÷wÊzïø£Ê¾Zó7Õ~£þ"Ò¬õ?©sõ}­À“z~§åÇ+ÄWÀfÅ_ÿÎoÿÎméó†zï¥ò@üÃ×¼ùwocåïÒ¿¢=+K‘®.ŒÿS½¯&‰ðäO/†‡b¯Ž%çñÚ_æ·æÏåï妳ù þ ±óæ¹i¡Š?ÅbüZM|âwks¤Z‡ 3"ŸÞ­'zPìUû]›|ÿ9Ïÿ9ÏÿB]ÿ*»þAwü¬¯ùY_¦ÿéwúê_¡¾¡ÿ.Þ¯«õïòxñý®[lUåŸó‡ßóô/,ÎR~jʧֿ,¿åUëz–qyå+§×LG©\ÚV{0?GYzn *š°`Œ64®Å_¤_˜^lÿùÏyú‡é_ðg—õ=wô_«è}gôu¬—>«ÂNý><¸µ+Z™±Wæüâüý3þ†ó·ËŸ“Ÿò¢¿Àÿâ MFëüGþ'ý'èýBÒ[®?VýiËŸ§Æ¾ ¥k¿LØ«õ»6*øÃþskþróþ„ëÈTóÏü«ßùX¿â0 ô_éoÑ…mg¹õ½_©Þóþç­kµ3b¬þpsþsgþ‡7JüÅÔÿåYÿÊ·ÿÝé¶¾‡éŸÓ[ý —Ë—Ôl}>…)F­{S}о¯üØó×üªÿÊÏ̿̿ѧ?å]ùSYó?è__êß\ýc5ïÕýN_KÕô¸óàÜk^-Ó6*üÁÿœ\ÿŸ­ÿÐÊ~{yòSþT/ø/üiúOþv_ñOé«~ŽÒîõ/÷—ôE¯>UáýêÓ—-éC±W¿ÿÎsÿÎsÿЗÊ®ÿ]ÿ++þVWé¿ú]þ†ú—èo¨Ë…÷«êý{üž<k–Ûygüá÷üý Ë󔟚Ÿò©õ¯Ë/ùUzÞ¥§\^yJéõßÓêW6ƒÕžÌÑÖ^›ˆʦ¬# +±Wéæ›?À~@óÇž~¡úWüåýO]ýêúYýk%Ï£êð“‡?O.-JÖ‡¦lUùƒÿ8Ÿÿ?Lÿ¡Ÿüíòçäçü¨¯ð?ø‚ÓQºÿÿ‰ÿIú?P´–ëÕ¿DÚrçéñ¯¨)ZïÓ6*õÿùÎ?ùÏ_ú-WòëLÿ•Sÿ+#ü}i©]zÿ§CýSô{Û§?£ï½N~½kU¥;×mнþpßþrþ†Ûò’çóOüÿ*ÿêþ`½Ð¿A~“ý+Ëê‘[Ëë}cê¶tåëÓ§µ:ší±Vcÿ9 ÿ95ùEÿ8Ãå(¼Ýù¯æÓã¿w‡Ëþ_²ë:¦©=ÿƒ§üäÿ„ÃýÔßJöOüLÿXýÁÙô;1q_ñÈqH_‡ @ôÎÁö—[ÚÓôiÄqƒ¼Ì|6õwćg¶óâ÷·vlUØAæ¯3i>LòÖ»æÍzf·Ñü»c>¡©J‹ÍÄP!v¿´Æ”¹Û7ÞËû7­ö“µtÝ•¡ˆ–£U–±‚hq̈Ž#Ò"îG ¸ú½T4¸¥—&Ñ€$ûƒ°ê¢¹†+ˆ$Y HfCUtaU`GPA®isažË@c(’;FÄЂß ‚ìW+K³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÏÏÈ¿õ™5Oütù8ùëŸðÿœŽð¹ýÁç=ªÿ?ÖÏÏ&}–ù“³b®ÍŠ»6*ìØ«³ÿ×üÿâ¯ßÌØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«È?ç!?òA~xæ¿ó7ýÒ®sb¯äGþpwÈPüÑÿœªüŸòŸ´H¼Çå1ê7°ëz,ÒKOZmÔèáxÜQãVÙ‡LØ«úmÿ¢oÿÎÿå„Ò¿î!«ÿÙnlUô—+¼…ù9ùM«y òÏ˰ùSÊ^ªM§èI4ÑÅ%ÊË4Ä<òJ甎NíøfÅ_ÈüáOþµÇüã—þl þ¢Ó6*þ×3b¯ä þ~ÿ­Ùùçÿ‚Ïþ#NlUûýÿʲ¯þʯþ)±WóÅÿ>âòŸ•|óÿ9›ù7å;ykJó‡–5Oñé?.kvpj7‡—u9âõ­®RHŸ„‘«¯%4e 7æÅ_²ßóòÏùÄÏùƽþq{Îß™^Yüµò¿å‡œüŽúl¾\Õ<µ§Ûhët÷Z„²ZOof°Å?©ÌA*]J†ˆ*v*øSþ|¯©yŽùÈÿÌ-&Á¥o,ê@¹¹ó ;ú{mJÅl¥=½Eõ¥Tö^MºÓb¯"ÿŸ£ÿÎEk?œŸó’>fò®¡ òäµäþZÑ4¤f>©nDzµÜˆv2}aZ{$kJU«±Wë'üà§üû«ò_ÉŸ“ÞOóßçåþ“ùù—çÝ.Û[Ô-|Ígý–“o}žÞÆ+ •x}Hãuõ]з©PP3b¯œ¿çç¿ó€Ÿ–>Mü³½ÿœƒü’ò½¿’'ò­Í¬˜OÒ£1é·7s-²^Û[-VÞHe’0ë¬f2ÎB²ûygüù«þrYÐÿ3üÇÿ8ñ«ê\y[Ï:}ιå+\²Úë:r .&Š·ªí%X—ß6*òÏùü…?èmôÊå¿Ñ¿ê/PÍŠ¿Sÿçÿççÿ0?ç ?'5:þGyÌúï˜4GôϘõ/éójwôäažüÃõžJŠXIUElUüüÿÎe~Wy_òþr—ó[òçòæîxü³å-RÎ.·®ÒMf/lmun³T¹6²NbV$·ÁñÕ9±WîüüÌÚÇçÙ?—ró ºkþm²òµ®$‚Ž//ì㸸 Z$†»–lUùåÿ>¤üü üþüÀü×Ò?7ü“mç]7Ëþ^²¼Ñíngº€A<·f7u6³BMTSrFlUûÿDßÿœ%ÿË ¥ûxjßö[›}£¦i¶:.›§húe¸´Ót«h¬ôûU$ˆ q ,I!U@ÜæÅ_Êßüý§óRo̯ùË;¯%irµî—ùO¤XùnÊÞÜú‹&¥t>¿zè§Ôåp0ñŠ”­k±WϿ󙟑wŸó‹?žú_“ôÂtÿ«ù[ÊÚæy ø¾´š|6÷— ãbͨÚ\=FÕÍŠ¿­ßȯÌÛOÎOÉ¿Ë/ÍOMGž<¹aª^AªÁy,+õ»z÷ôg÷\Ø«ñgþÿ®»ÿƒ·ýØ3b¯Å6ÇÏÿ“ò~Oþshï&“&³<žaò˜"¨»Ðµ9-¥Œž…¢–gOä‘+³fÅ_Ö…‡çŸ—ÿç#ç¼óùµ pƒüEùgæE×´”j?U·Òîb¾´mÉ9•¸¡hÊ=>!›>ÿóêOùͿ˟ûey‹þé79±Wõ»›~0ÿÏí?òA~TæÀ_û¥_fÅ^ÿ>:ÿ”Wþr'þÚ¾\ÿ“†lUú¿ÿ9cÿ¬±ÿ9-ÿš«Î_÷C¼ÍŠ¿˜ùõÇþ·gägþ ßøŒjÙ±Wßÿóüïýußü¿îÁ›~,i¶>üŸ“òó›Gy4™5™äó<Á%EÞ…©Ém,dô-°+:$‰]›6*þ´,?<ü¿ÿ9ÿ85çŸÍ­„â/Ë?2.½¤£Téú­¾—sõ£nHÌ­Àµ FQéñ Ø«ù÷ÿŸP Îmþ\ÿÛ+Ì_÷I¹Íо¿ÿŸâÿÊSÿ8íÿl¯2Éý?6*úëþ|é<6ßóˆ:½ÅÄ‹ yó[’yœñTD³°,Äž€›~ÿÎJ~sùÏþrûþr7Xó4-q©3ëQù{ò·Ë•b-´Ö¸ú¾™i7Ùyy‡’€r•ݨ+LØ«úZüƒÿŸsÎ3þPyLò÷™,¼·ù¥ç íü[ç3é°êsvê=Siâʶ±)Ú1V fg,Çb¯Çùú?üá“?çu*þm~Qi¯¡þ^ùæþM#]ò¨g–ÛJÕÄFâhòaÔqÊÞ›ðø${}«ÿ>lÿœ€Ö|íùuçoÈÏ3ê2j?•m¨ù*k‡/ ѵ‘%´‰>¬è íð‰B…T Š¿?ç:,_SÿœÛüôÓRAš‡œþ¬’™RŽô®lUèÿó„ž`ÿœ+ÿœ­¼ò·æ>å½[R—È¿›Úl§à²’–ŠýÈ_ô;Ƚ aix‚XfÅ_¨ÿóûIçÿ)ž7çädu ‚•|Av9±UßóäÏü_šÿù°þéV9±Wìö~€¿çÙ_úÎWßøêõgŸÿÁÓþrÿÂaþêo¥{'þ&¬~àìúž4ôÎÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®Â0jòhZ=þ¯¨kí§Äfm'JŽ9o&UûBä’ ìOÜEˆoØ=•Õ×bÒKQ‹L2K‡ÄÌe 0'—‰8Æf'n#ÝÌÆ ÈS¨Ìpã32®‘ÞGÜ îù;< ù•ÿ9åùi?“|ç¡ycOó=‡.tëÍ;JÖ1[ [Ù¡)úÁd11åN5¨¥3îÏøË ûW‹·;?[ÚytY;>9±eÉáå–O HÉPýÐŒ†HŽ⪕ÛÀöŸ·šCƒ&4˜3Š^g=»þZ›þYC·¿à‰í6>ÚìiãÇ‚0Î2ÎX̲c$Fc†â¼FޫÇÙ?k´ý›¥85F¤Lh^ǘæ:Ùø»>›þVþii›: ó6ƒåí{GÐ¥+ú6ÿ[µŽÑoTÖ¯l«4Œè´ût dš~lÁ;þ:¿øöòn»W¥Ï©âCO’YNµG)0„c3üË3\ã§ö_jôqø¸á8Ç¡‹Ý¹ÛÏ—u»:ny«³vq¿ùÈ/5ÃäÏÉ¯Ì aíÖöæm*]3I°dýb÷R¥¬b"ÔýìÊJÐÔžÁÿOe§í'·=—£8áñÍ’wÁááÓþÿ4¸ìp~‘ZtÞÐêÆ›A–ug†€çr—¤ ë¹äìù!cÿ89ùÝ{ù{/Fmm¬m=¯§ršœ¶¼K¡ýÚIÒ± EkF¢ÕÍoü¶Ç°oi£ØÞ,ç§úe¬ˆ½4rÝíë–>|YãhŽ(’>Ga»Fz_€—>â#î¿èóøìv}KÿœVóGø›ò7ÉqÏeú/Wò¤å¯0iF/BK{Í)Œ ²ÅE(î$`@¡móóþZ‡ÙŸäOø öŒ±äñ°k$5x2qqÇ&PñA„ìñB33ÇAØÓê~Êê¼~ÎÇc†P¨ÃmÇBE‹³ÑóóÑ; ?˜ß˜6–ž]›ÍŸ—õ½wI³$êO¡ÛGw-¬`TÍ,M,oéŽì ñêÔçwÿÏ`³ûkÚqìÍ6«M§Ï“û±©œ±G,¿™ ˆN}üÐóï—<‡ùa§Ë«yóÌSK—´ènà±’I"†I¤ ss,GHãcVqá×lØ«îú'7üüSÿ-–«ÿ…Ÿ—ÿï3›FŸó޾Ió¯åßüâ?‘<‹ù‡a&›ç.y2{/1iòÜÃzñ\„˜”7òM†„nŽÃß6*þRÿç vÿœ·ÿœs>˜ýE¦lUý­×6*þ@ÿçèßúÝžf¿õ,ÿâ1¤æÅ_¿ì¬¿óë2¬ ²ÿÎ+Q”ìAHèsb¯å‡òRüäÑÿ5ü©©Î?ǪËù¹mõïð”z%¢__žv yèÛɪÿè†nUCE©Ú•ÍŠ½'þr[ó7þrã;Ÿå_ùÊMoÎÐ^iÜotï*ùšÖM.¨(·pØ­àsBÊ%M*9uÍŠ¿¢¿ùöå·üãç•¿çí¼ëù#ª^y§Uó¬Ëæ/š5ˆ#µÕR±QËM–Ö7•-£·õ¹",’rzž£†S›0žPêÿŸœPjƺ¤>wó jDõúÂêW -hûUí›rÚMÎw¥i—ZCÇ&“si ºcÄ8ÆÖî¢(((¥¦lUòÿüçMÎmÿ8ÿ9.¨QmŸÉz„1ú€õ‰”Gl>~³ ù±WóSÿ>ȵÔn¿ç8#ΛÉd¶Ÿ\žêP nš¡ër BPW©`+¾lUíóùýk}3ÿ5þÿQz†lUäß•óñïùÊ?ʿʯ-þHþ[?—ì4¯.ZÏiåýMtc{«¢ÜM-Ñ`f’X]•¥%k ÷Ø« ÿœqÿœÿœÿœ¬üÈO9~hhÞ`ò‘µ­Qõ_?~dyž-¯õ/VS-À°Šè,·NK/–b@FØ«öþ~Ç¥éú'üá΋¤Ú%†•¤yƒË–ZmŒ[$6öîÑÅöUPlUüçþA~B~|þ}êúþ‘ùåÛŸ1júœWšô6ÚµŽ’c·–ON6/}wh¯WÚŠI±W×_ÿŸwÏÃ,õÝòóò×TŽÎÖþÚk—>qÐÒUgmü¨½º2j”þ`iôËrvM'^çuQZš^GvÍOæ\Ø«Âÿçùßúë¿ø;݃6*Á+¿ççÿœ˜ÿŸWi±è¶&ûóò‹Ì¾e×?.’{ˆÖWPÓV€–úÔlJ¹•" #6*ùçþ}Íÿ9'”¤üåÿœuó%ô«ä¿Ï/'kñèó ¶Þb‹Jœ!‹–Á¯-ÔÃÜ´‹æÅRùõþ¶ßåÏý²¼Åÿt›œØ«úÝÍŠ¿¿çö`ŸÈÊ’ üÁ@O¹Ò¯©ú³b¯>ÿŸíå_ùÈŸûkysþLj±Wê÷üå‡þ²Ïüä·þj¯9Ýó6*þa?ç× Çþs¯ò8€HAæbÄváTTý&™±Wß¿óüïýußü¿îÁ›`¿•ßóóÿÎLÏ«´Øô[}ùùEæ_2럗I=Äk?«¨i«@K}j6%ÜÊ‘ Л|óÿ>æÿœ€“ÊR~rÿÎ:ù’úUò_ç—“µøôHy…[o1E¥NÅË`×–êaîZEsb©üúƒÿ[oòçþÙ^bÿºMÎlUõÿüÿþRŸùÇoûey“þOéù±W¹϶"Ô.?çÜŸpi$Vkß;ǦSsõ†Ñ-„[Pþѳb¯ÄùÃÙôëoùÊÏùÇ9õW,ÓóËu–QTYN£…ŽÆ”©¯AÔÒ•ÍŠ¿¶¼Ø«ò¿þ q§Aÿ8‚ñ^”7žuÑ!ÒC ÍÀK©)ì}“è®lUùÏÿ>PµÔ_þr/ó:ö._¢mÿ.na¾¥xýfm_MkzšR¼"–•>9±WÆŸó÷“ØÎj~}_[0K›/84öì@ ÊÿÖr¾ÿÀÇSÿ¨{<ø÷þŸóGþ÷S}+Ù?ñ3ýc÷gÐìñ§¦vlUÙ±WfÅ]›vlUÙ±WfÅ]›vlUÙ±WfÅ]›vlUÙòoþs÷Ëú­ùƒùsåÏ&ùIo¿3üÉ÷:´ºlLo.íÙÖ 4x£ÚF-¿ ¨^¼z~©ÿËv÷hö³]­Ú=±®8ûK(CË 0âÈÉžQœþ€#<>ˆžJwÃÅÏɽ¿ÓãɪË;Ï0I¡¹£°çÈïÜœò›òª÷òÇþr#òãÊ¿ŸB ¦ë÷koig¨ñžÊk‹˜ÊZ:<.ÐNá‘] 2ŠÑ‡L÷ø*ÿÁGOí¿ü {[µ=†í;ͦÆg)b¸f†@ñ`€Ãz™:}f}8˜Å9@d‰„¸I ÂUõD ‰ÚÀ=Ê•X·÷`œÇ¶NÀÐYÚ[Iw5µ¬6ó_Ê'¾–8ÕZiB,Aä Ìjw¢Ðeùµ™³FÉ9J8ãÃI"23áˆ?Lxå)P¡Å)K™,D#HNçÌò³ðv ÌvNÍ…]Ÿ?ç"?,Çæüä×™<ù#äxÚêÊ+d×`Ó§iõçOZêêfvÛ…2¬mN+Ézc_ÚÏùgßø$dàO¤í¿m{Hˆd”Λ՗ÀððáÆ9s“Á,¾9ðLn1Àpøw´]™ùÎמ -À\<¸¹ÊG¤yÑä,w—d÷þpÊ_–¿<<×åÌ¿&­—榋Ï+Z3êYMk(ݘÙäIÒP„£qc^þ[WÚÍ_mÿÀÿCÚÞÍöÉÙyóxzC‡42Æñx²±N„ñHÄäˆË(LJ?Ø}0vŽL:œu–1¸ñs‰zédAîýŸa³ò5ö'fÅ]›vlUÙ±WfÅ]›vlUÙ±WfÅ]›vlUÙ±WfÅ]ž ÿŸ‘ë2jŸøéòqó×?à%ÿ9?ásûƒÎ{Uþ$¬ŸžLû-ó'fÅ]›vlUÙ±WgÿÑüÿâ¯ßÌØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«Çÿç!Oü€?Ïü×þfÿºUÎlUü{ÿÎ þkù_ò7þr?ò»óWΑßKå'_]ÜjÑé°¬÷E&°¹¶_J7xÃr­jÃjæÅ_ÐOýGþqþ­¿˜÷´ÿ¼†lUö×üãoüä·å×üåG‘µ_Ì/Ë(5‹}F×gòíÚëVÑÚÜ»{[[·*‘Í8)éÝ¥*Ö»m¾Å_ÉOæÿ‘üßÿ8ƒÿ9Mªépéíaª~UùÊ0ù âåÃwciz·ÚEÒšüi$hœ¨v`ÈO%lØ«úÑ¿çïóˆ·žD‡ÌÚÆ«æÍij²^~\ æâøÜ«ÅÚ(±uæ(®ó¥A•wb¯ç§ÌWž}ÿœÖÿœ¦Õ¯|¿¢ñçWšXéZDU‘,m‰¬àÝÙÚDYŠ3šfÅ_Öüä/—l<¡ÿ8cùãå+Ó<¯ù-æm#Nö¾¯eåÛ›x«NüPfÅ_Íüúçÿ[«ò7ÿmÿðXÕ³b¯Øoùü‡åTmÿœnÐÿ2­l]gòŸÌ–Ò\j!y‰.»§išÝî—ue4 ³Þ¬‘Zév²³}U%)ÆAFâhßdìUñWüúgógþUÏüåŽå›Û¦‡EüÜÒo<³tŒÀD/P ë ¬e·0¯üe÷ÍŠ¾ÆÿŸæÿë®ÿàíÿv Ø«ëïùôFßó†Ú%v§šµïù<™±Wä?üü¿þqÂÿþqŸþr&Óó7ÈË£y+ó2õüÏå;Ë1é'^·™f½µˆ®ÉÂf[ˆh ü~èœØ«ÿŸP Îm~\+ÌTöé¹ÍŠ¿­ÌØ«óßþ~wù1­~sÿÎ'y®ÓË:|Ú¿˜ÿ/µ+?:i:M¸/-ÀÓÒk{ÅìËgu;ª€K b3b¯Âoù÷üæ7—ç?1üÛŸ¬ïgü¹üʱ³µóêÆóMyZÊëÑ,¦HÔ\Ì’*üT`ʯثôþs¯þ~sùçŸÈÏ6~SþDjú‡œõÿÌkEÒµ0I¦Ýéö:v›+)¼R/ã·–I¥Œ”,e@,Åþ±W€ÿÏš?$uß0~qù›óÖ÷O–(~_iZ.ª:•Žã[Ô–5x£$Q½6ÉO³êG_µ›z÷üÿ7ÿ]tx¿îÁ›}}ÿ>ˆÛþpÛD®ÔóV½ÿ'“6*ü‡ÿŸ—ÿÎ8_ÿÎ3ÿÎDÚ~fù9to%~f^¿™ü§yf=1¤ëÖó,×¶±Ù8LËq _‚Ý›cóêOùͯ˃ã¥yŠƒþÝ79±W×ÿóüA_4ÿÎ;x~Šó'üŸÓób¯¯?çÎ*ÿ8‹ª$ŠÏÚÒ²0¨ ÚiõwÍŠ¿ ¿ç0ÿç¼×ÿ8—ÿ9­h6ÐÝiÞZ¸ÔÌ”žgƒ’¬ºiŸÕ·L ¤öMH¤† ¡éÁЊ¿q¿!ÿçïófò”ßžµÿå·æ.™e>a‰t«ÝBÃR»Ž5\X>Áfj·§2§xò`¶Å_•_óñùÎm;þrËÌ^Yò·åí•ö™ùOä)gº²›PQί©N¢6¼’[ÒŽ(ÁHTžTwg¡`‰±Wëoüúþqƒ]üü×0¼õ¥K£yãó’kK¸´{¤xîltK%“ê)ÊÿÖr¾ÿÀÇSÿ¨{<ø÷þŸóGþ÷S}+Ù?ñ3ýc÷gÐìñ§¦vlUÙ±WfÅ]›vlUÙ±WfÅ]›vlUÙ±Wb76ÖvóÝÞ\GiimKsu3ˆãU݈ Ü“—i´Ùu9c‹ Lç2#ÄJR;Æ#rIä62˜ˆ$šؾRÉÙ±WdRÓÉW²óf­ç˜´˜_ÍšÌÚ]ë’ÖIÖÖ –ð³WÒŽ£“*P3µNu:¿m;[SØØ;Yä48%)ÇôÀå™&Yfx™7ጧf01¡w‰æ–qÞHeÖ‡AÜ:íÌ»/ÍþJòÏž´µÒ<Ï¥E©[C2]XÊÌַ1QÜ[J>(¤Cº²šýÁ쟶}­ì¶¬êû3<±NQ0˜Ã.9m©¯ênæúöæF’Yî&j³’Îh+E …Pu>ÓûgÚÞÒÊ¥’lPƱàÃŽ"ÇŠÓ#ÄkŠrõÎR™2q4º:n/4dL¤zÊGrIëú9 ›WòO–u¿0ysÍwú\Mæo)É#è:ìÌ 4oЙ…â‘$`ÈÕ]ùS Éöϵ»3³u}•ƒ4†X"3a>¬s0”g ðŸ§$'˜ä èp’`eæÐáË–e\>™u(q—évJó–rÝ›vµ»µ½‹×³¹ŽêrEêÄÁלNÑȵZŠ«©SàA‘©ÒfÓOƒ4 %@Ô¦âhô”HïEŒf&.&ÇêØ»f;'fÅ]›vlUÙ±WfÅ]›vlUÙ±WfÅ]›vx+þ~Eÿ¬ÉªàC¤ÉÇÏ\ÿ€—üäpÿ…Ïî9íWø‘þ°v~y3ì·Ì›vlUÙ±WfÅ]ŸÿÒüÿâ¯ßÌØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«ó—•´ÿ;ùGÍ^KÕf¸·ÒüߣßhšÅ£*\%¾¡nöÒ´,é"‡ !*YXÔØ«ò—þˆ«ÿ8³ÿS÷æ¯ýÅtOûÁæÅ]ÿDTÿœYÿ©ûóWþâºýàób¯»¿çÿç¼ÿ8›ä_òëòçWóµ¢k^`¸óÕ×™.-nn–êæÖÒÑÑÎÖÍa,ЀPš–ø¨@Yÿ9ÿ8•ùÿ9A¥ÚY~kyS뺮•E¡y¿N”Ùêö(Ä’‘\¨<’¤ŸNUxëñp®ù±WçkÏ’¿#©ê§æïž×E¯ûÀWL7TÞƒë"Ô%}ýØ«ïßùÇ?ùÃ?È?ùÅÛ{©?,<ªçÌš„F OÏ:Ì¢ûYžA0‹‚ˆ°ÆJ‚É "±°$›{¿æ’t¯Ì¯ ùãòë]¸»´Ñ<ÿåýOËšÍÕƒ¤wQÚê¶²YÎöï*J‹"¤¤©d` *¤m›|#ù ÿ>¿ü‚ÿœwüØò§ç’¼ßùªyŸÉÿ^ýc­ßéSØIúBÂãO—ÖŽÛJ¶”Ò;–+ÆEø€­EAØ«íïÍoË?,þr~\yËò»ÎI;ùkÎúdÚ^¨öŒ‰sÊ*“[¼‰",±8Y²0  •#lØ«âoÈ?ùöGäwüãæ—ÿ6¼çÏÌ[1y}.áŽÃVÔ4™¬.a¼·’ÞX®bƒH‚F^2rdR)®Ù±WÞ^ròW”¿0üµªù;Ï]°óW•õÈL®‡©B·ó%j*Ž XVe`H Ø«ò§Ïßóæ?ùÆï1êsê^Kówœ?.á¹»hpÜ[êv0©ý˜>·¹ìç|Ø«8ü¥ÿŸGÎ+þ[ê¶Zï™#×ÿ6µ'Yb°ó=ÌJõ”ccg A_Ø™äCÝNlUú{igiaikccm••”Iœ±E Q(TŽ4PUT6*ø;þr[þ}Ïù%ÿ9Où‹æoæš|ñ£kÖú=¶ˆ–ž]¾Ómí ½¤“JŒRïM»“™3µO:R”6*úŸòOò‹Ëß•¾Qü¤ò…ö§©yoÉvó[iwºÄÍ}"Oq-ËžÞxÉ1Œkµ>y±W©æÅ^ÿ9ÿ8õä¿ùÉßËK¯Ê¿>êzÖ‘åë½BÓR’ó@šÚÞôKfţ£âIß÷uð#6*üùÿ¢*ÿÎ,ÿÔýù«ÿq]þðy±WÑçwÿûóW~¿îWDÿ¼lUôæ×üû§òkó“òóò[òÃÌþuóý‡•¿"´wѼ£—¨iÉr’Go\_™´¹–I¸[(U¨£‘ÍŠ½“þq{þqOò×þq+Éšç’-¯uÍZËÌZÃkZ¦«æí®/žcVë{K[HÄH±UG ‚Ìjk¶Å_DêZmޱ§_é:²^麥´¶š”¢©4¡ŽHØw ¬AÍŠ¿,ü¡ÿ>€ÿœqò7›¼³ç.þb~iÚkþQÕìõ½sªèÅc»°. &š(jAZ0>ù±WÓó•¿ó…?•Ÿó˜?à/ùYzÿš´?ùW¥?Bÿ†n¬m½_ÒßSõþ±õÛÞ\~¤œ8ñ¥ZµÚ›z?üã—üãÏ’ÿç¿--*üƒªkz¿—­5 ½J;Í~{k‹Ó-ãµ¶µˆ#oÝ×ĜتïùȯùÇoËÏùÉïË[¿ÊÿÌ”¿‹F–öÛR°Õ´™bƒQ°¼µcÆ{YgŠâ5fÞ&åŽÃcB6*ù‹þqóþ}™ùÿ8Ùù¥¢þmù;}Õ|É¡[ÞÛZYk·ú\ö,·Öïm!’;].ÖBBHJÒA¿Z³b¯Ñ<Ø«TÍŠ¿4ÿ;¿çÕó‹ßœZíÿšôÛMgò§Ì:œ¯q¨·”¦‚-:âw?§ÜÁj·ÐµÌ6鎳iš×œg†ö;IÔÔKoe6öÁ”УrüŰóõÔµk=+QÒb³ŽVUB°$úDò*ÑFÍ#|Ø«ôÚ™±WÂó“óïÈùÊ¿:i˜|Ô<Óå¯3éúbi77¾V»±µÐDì𛥼±¼ ñseV^'‰âÕ ¼v*õùÅÏùÅËÏùį(yƒÉ—טõ­/ÌšÁÖ¯®<Éqisp—Þ+nµš„ã4*Mk¿lØ«éÌýϲ¿õœ¯¿ð1ÔÿêÏ>=ÿƒ§üäÿ„ÃýÔßJöOüLÿXýÁÙô;”›$a|¸¤#~ë.ÏÿÎcþ~ùÿ%5o.ùÏÚ™5Ï7^Úé²Ã¡êv·³AfÜ\JâÞG*¬!Ÿlû/þY þÑGÛܡۗªÒé´XòfSƒ.dË^(DåŒD¥årð÷óâ½²íý7ò|±àËÊdGÓ!"2v'º¾.ÎÑùUÿ9!ù_æOË%ë^hüÍò®‹æ[Í&ÜyƒLÔµ‹K˜ï¢_Jà¼3JŽ¡¤Fe¨ÝH=3Æÿà£ÿ,ííwbûSÚ:>Ìì}v£G óð2bÓfËŽXdxñpä„%ÂQŒ¨í! w;®Êö“GŸIŽyscŒÌG2ˆ<\ŽÄß?±Ùßt?0h>gÓaÖ<µ­Øy‡H¸.°jšmÌWvÎc%\,°³!*A‡cžÛ]ƒÚ=‡ª–´tùtÙã\XóBX²Gˆ\nd,n,n7wø5óÄ¢z‚ù‡a¾j[›vlUÙ±WfÅ]›vlUÙ±WfÅ]›vlUØ_ªêúVƒ§]êúæ§i£i6 ê_j—ÓGoo TRK)TQRI͇eöN³µuPÒh°äÏŸ!¨cÇdÉ3Ρ)è-y³C ç!ŽdšÞK³‹yÓþr7òƒË¾Qó6»¦~gyK\Ôô2êëMѬu« ›‹»˜âc ÃÌÌÎà.ÃðÏdö;þYçÛnØí­‡SØÚý>Ù±Ã&\š\øñâÇ)<“œà#Â7+'§{¤ÖûG¡Ã‚y#›¥’œI&¶Ô»<¹ÿ8MùÿåH,µ,~cyóGÐ5_/ëWiÓkºµ“\ÚêLn˜¡¹‘=B· 1jVœ—ÄgÓ_òÙßð팞Ö`í/g{3Q©Á©ÓB3l3 ytàaCeÀ„Bë‹‚ut^_ØŸh0±jrÆ2ŒqHFĽ]H¿WûóÞ^Zóß’<ænÇ“üå¡ù¬Ø7ÃFÔm¯ýõáê}^Gãʆ•ëŸ {Gì?´Íð×ìýNľL|5ÅÁâÆË|ÉÙ±WfÅ]›vlUÙÿÓüÿâ¯ßÌØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³ôÿ>ÊÿÖr¾ÿÀÇSÿ¨{<ø÷þŸóGþ÷S}+Ù?ñ3ýc÷gÐìñ§¦vlUÙ±WfÅ]›vlUÙ±WfÅ]›vlUÙó_”¼µç ûË^mÑmuí QN7z}ÒrSÖŽ¤Q‘תºÊwè}–ö«µ}—í }¥Ù:‰éµ8Æp4|Á¥ r”$% ¥6qµzL:¬gh‰Dô?Ÿ>çgÀ?ùÈßË?,þX~pëþCòEýæ¯ad-¤× $šÚ{¸ÄßTŸÞðGZ5߉©ïü³Çü;[ÛŸb4½»ÛX±àËÌqDðÃ$1HãñŒeýߣ+§Š$FB1ðhû3ƒ_->dsæ ߇ϧÜìëŸó…’ÿ—Ÿ›Þpóžz’mCü#­õ‡•GÁo|²»£Éq"že"`•A@Ü…IZ©òùlÏø1{MÿÎÄÒG°Äq~vY1ÏSõdÂb#(ÇHáÉ:ÈxŒ D¸f6þÄö.—´sÌç³á€DzKÌõ¡¶Ýo»ggÛ«;;M>ÒÚÂÂÖ+8’;;tX¢Š(ÀTHÑ@UU€@3ñkW«Í«Í<ùç,™2HÊS‘2”å#r”¤lÊR;’M“ÍöøB0ˆŒ@lä‚s“³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»$qʨ²E"•’6«+ AêÉãÉ,r‰ ƒ`ˆ#‘ nÏŒÿó’ÿ–_–¯–|Áä¨ÎƒªyÒ{·¾ò•¸_¨Ç¸B÷0'X9<ª¼Àwà‰öþX‹þ ~Ö{q¤Öh;dNqˆje~<¥“ˆGIrÍQ„¥âÞ ¼C>0cã>Ýv.A8dÁé–Bn#éÚ·ÍÜòåÝTìóä‡åþ…çßÍï'y Ï—Ú•¯ÜúW a.šš—ìzä*«qo´ ;çÒ¿ðjö÷´=”ö+_Û½‰§>š"N0Æ<“"_‚ ¥(qGè2±G˜ì>ÏÇ«×cÁœ˜ÆGãÊÀß—+ß›³ôäÏ$ySò÷@³òÇ“t;mE²º´¶Zjd•ÍZGjnîKç?}±ö×¶}¯í,¥Û™êu9ÊgéDzaÿ #ôÐz-!‹ Db:ÓÞ|ÎîÉ^rÎ[³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÏÏÈ¿õ™5Oütù8ùëŸðÿœŽð¹ýÁç=ªÿ?ÖÏÏ&}–ù“³b®ÍŠ»6*ìØ«³ÿÔüÿâ¯ßÌØ«³b®ÍŠ»6*Õsb­æÅZ¯öæÅ]Q÷fÅ[ÍŠ´M3b®®lUÕþÌØ««›o6*ìØ«UÍŠº¹±WW6*êæÅ]\Ø««½3b­æÅZ®lU¼Ø«Y±WTfÅ[ÍŠµ\Ø«y±V«›læÅ]›j¹±WW6*ÞlUªæÅ[ÍŠµ\Ø«y±V«Û6*ìØ««í›usb®®lUÕüzfÅ]\Ø«y±V«LØ«y±V«½3b­æÅZ'6*êæÅ[ÍŠ»6*ìØ«³b®ÏÐüû+ÿYÊûÿOþ¡ìóãßø:ÎAøL?ÝMô¯dÿÄÏõÜŸC³Æž™Ù±WfÅ]›vlUÙ±WfÅ]›vlUÙ±Wf®Îù{ùäï$y¯Ìߘ·‘2~bù³Q»Ô/üÑw­ªÝ;7Õ¬#«cDn.ëq¢möÿþݹí?chýžÄ+Ù:,8ñCOzq<]Lö9rJC„ŽÞ0â¹ËEÙýƒKšz“ëÍ2I‘é}":6ï=õ³²­? ü£ ~lÙþnù-ÊšÍÔ7v~rÒmcRÕ­î’¥Œ`¨†U™#² 7ÉK70uðví®Öö3'²}°9§„±äÒä™ýö—&#T'DåÄqK.! ú¡Æ8&! °ì u£Y‡Ñ"˜LÁòènŽu¸³nÎëž ï]›vlUÙ±WfÅ]›vlUÙ±WfÅ]›vlUÙ±WfÅ]œ?_ü‡òœÿ4`üÎóÂ4O¡XÛØy?Ë—(>¡b"f™î$ФO3Ë! ¸â /ÂYU‡µöü»kÙ¿deì×bÊGQ–yuYàŸˆG'@áÅpˆ"¹HËÖ#)BZ=G`àÕk«?¬ÄŸ¦=I#øž»ë¢ì¿ÍÈ&þiÜi`ž! ùûË^y_ÎöhÕ¼Ö²‰¡YÀ+ëÄAàÆ£~ „“‘ÿgü»sØLYôåùŽÌÕÂxõL„øY!–'CŒïàå0$qÄ/O‰ ‘ˆŠö·`àטä>œ° Æc˜ Ø¿ç è~;;p­v4Ü óÅÏ=àv^vlUÙ±WfÅ]›vlUÙ±WfÅ]›vlUÙà¯ùùþ³&©ÿ‘ÿ'=sþ_ó‘Ãþ?¸<çµ_âGúÁÙùäϲß2vlUÙ±WfÅ]›vÿÕüÿâ¯ßÌØ«³b®ÍŠ»6*üŒÿœäÿœæÿœƒÿœÿœü¸ü‹ü”òO“|ßqù‰åÍïIµó¥ü׳뾯¦Cm¶úŒ*Žmâ Ívfb^”¦ÅX§ý OüþÿaòÿþEËÿVlUößüâGæüå§Ÿtïºï›~ŸæÅ_óñoù˯ÌùÄ_%þ\ùòßDòÖ·}æýnëMÔ¢ó-µåÌIÂeh…å›-Ô³0§lØ«ë}[ó TÒÿ µ?Í©ZO­éß—óù·ôum^ê-)¯ý*s.#.8ý¢iÞ»æÅ_Ÿ“?óšŸóòÏùÊ=#Xó7ä—åå|¾YÐ5Óoõ Û²ÝzqÌ e¿×܈äVä‘ß­veZÇüüCþrïþq«Ìz‡üægüã.Ÿ¦yGVmaów“Ý“•,ðÌoµ+™¸+?¡ë@ßê9±Wì’¼çå¿Ì?(ùsÏ>OÕ"Ö¼±æ½> OCÔá? ¶÷IU…hÊwVXÍŠ¾ ÿœ¼ÿŸ†ùKþqßÌV•—þU¸üäüôÕý8àò^šì`Óä¹êéxÖé4Ï<¼ƒ%´IÍ—vhÃ!}оqšóù=ZÏügeù#ä+Md70y*Q§ÇpПˆ‚ãXúÒ° öE}©Æ»нþq›þ~mÿ1£ü‰ÿœ˜ü½oÈÿÍÙ¯#Ó4ùn Ónµ  g5½åg²–R@‹›È’5%lUú©­^ɦèú®¥¬’éösÜÆ^,ÑFÎ¥6$fÅ_„_’ßóóñ¿ùÊ„ó5Çäoåå}Æ›å­×Z¼—Õ¶xZí\Á C[C!qµR*;‘PÅYæ½ÿ?ÿœÊÿœfÖ4eÿœÄÿœcÒíü•ªÜ 8<ßäéŠ` ,“ý{R³–fUgXH…~Í 6*ýü¹üÁòŸæ¿‘¼­ùä}Mu)ùÃO‹QÑoÀ*Z)6)"ÒHØt;«‚§q›~~MÏÆ¿çâó_âOùSŸŸ–žxÿýOüEõk=Bßêß_õþ­Ëë^c‡—©õi)Æ´ã½6ÍŠ½¿þ†#þNÿóˆß—àÿÆ9ñªÍŠ¿]ü“{æMGÉžQÔ<å§C£ù¾ÿE°¸óV‘m´6º”¶ñ½ÜÖI~æ,£ãm‡Ún¹±WÏŸó™ÿó‘Î/ÿÎ?ù³óSL¶Óõ4ZÏe¥ù7IÕku¨ßN¨T†HdeŽ,ÅUÔ„TuÍŠ¾ZÿŸ}Îwþ`ÎPù»ó+òëó‹Ë>^òü©§Zk^_°Ðmo,ý{Fó׊úòíùDó[TI7;~§æÅ_Œÿó¿óñÎùÅOùÈ #òÛÊPòw˜|¡7—´½sS}bÛPmIÍÍÍÌsŠŽü0 áàZâÆ§Û6*ýXü¬üÍòŸçå甿3¼}úCËrÓãÔ4ÉZ‚HùUd‚eRÁe†@Ñȵ<]Hí›yŸü坿ï™?!ÿç¿37<¡e¦j^còe­Î—c¬E4Ö24÷ÖöÌ&Ky­ä#„ÄŽ2.ôí¶lU,ÿœ3üëóWüäOüãgå¿çtý+Kó7œ?L~“±Ñ"ž ý¬_iñz1ÜÏs(¬VÊ[”ñEØ«éüØ«ñÿþrËþs£þrSò×þr“Kÿœgü‚ü»òg›u¿0XiÒhâ¹úÍÍåüO!dý%§ÛF†ÆCO›JuÏÏ/ùû—å¶›qæ_4Î8yÎÚ’™u+M··ñÆL6öÓÜ9jþÄÒ›ßb¯¬ç ¿ç9|ÿ9¢ëvÖz,¾GüÆòŒqËæ$ÜÜ¥Èh$b‹yc8XÚhyÑ_”jѱ À†Fmо~ÿœóÿœâüöÿœpüêü°ü§üœòw“üÕ?æ&‹kqk˜­/¦º“R»Ô¦±†d¶Ô¬cUbˆ1±$–§MаúŸùüoùÄoËÿù/þ5Y±WÙß󈿘¿ó˜~ÿ•…ÿC_ùEåÿÊ¿Ñ_¢À_ •—ëþ¿×?Hzܵ]N¾§oÇì}³ö¿gb¯Yÿœ‚ÿœü©ÿœeòKyãóS]:u¤îÖú‰j¢}KT¹Uä`³·ªó ɘª%AvZŠìUù‡¦Î~ÿÎqþ´Ú§üâ·üâ-«ù*IšßOóOšÚi⸡)É.ÞïH³WRAe(NŒHß6*œEÿ9Gÿ?Kü¸»ÓäüÔÿœ;мۡ<ñÅtÞXg{ %p¡žçLÔµˆ¡Eä*íoÅ@%º›~®~hy£RòGåæ'´È-¦Õü£åm_[°µ¹%³ÜØYKsH¢vBñ€Ô*HèFlUñ×üûÃþr·óþrÛòÇÎÞuüÇѼ»¢jž[óAÑ,mü·owmnöâÊÚ甫yyxÅùLECJm]ób¯qÿœÿœ¤ü±ÿœTòó¯æì—ºƒ½·”üŸbѶ¥«Ý(’vcŒ0ieo…]‘b¯Íþrþ~…ÿ9d<åùÿ8ûåÏËÿË›À'òýþ¾a7Ø)>«wkõ”`j$†ÕPÓív;PÓÿçäó’_ó>wѼ“ÿ9Ëù–´­]Ê[yßËQ:+ÎxÂÜÞÙ߈ËQmæ•Hÿ•5ÿ*Ó@ò®¹ÿ+üEúoüOk}sé~ˆýè}_êwÖ\y}uùòåZ-8ï]Š¿Oób®ÍŠ»?@_óì¯ýg+ïü u?ú‡³Ïàéÿ9á0ÿu7Ò½“ÿ?Ö?pv}ÏzgfÅ]›vlUÙ±WfÅ]›vlUÙ±WfÅ]› »6vlUÙ±WfÅ]›vlUÙ±WfÅ]›vlUÙ±WfÅ]›vlUÙ±WfÅ]›üÆ*ìØUÙ°+³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÏÏÈ¿õ™5Oütù8ùëŸðÿœŽð¹ýÁç=ªÿ?ÖÏÏ&}–ù“³b®ÍŠ»6*ìØ«³ÿÖüÿâ¯ßÌØ«³b®ÍŠ»6*üÿœúÿä¦Îç9ÿÄßQÍŠ¿GLتÚo›~ùÿ“iç_–£ÿˆ”y±WïölUøƒÿ?¼ÿÉWùÿ^£ÿP#6*ýógþ±™¿óJÞÿâ:ù±Wçÿüù3ÿ$æ·þlÿºUŽlUôüý[YòN›ÿ8gùƒaæÉíÿJë·ÚE·‘-$+õ‰uhïàŸ•¸$ÇmÌäºùëC±V5ÿ8æmsþqëþ}‘¡~`ù¶Ù¾·å(ù“ͺ‘v Ásy}}¥Bz7^¬L§ùd³b¯™?çÐ_”ßãÍKóoþrçó·™¼÷«ù†ëDòî¹ûÉ£ºž4¼Ö/—ÚIÍÔqZ¢T1±Wîå<Ù±Wã?üþ/òFóäöÿ9 ¤Ù-§?,5-;^ÕbøãCÔ§ñ¬¥EY ½–¨â$“ÄSb¯³?ç?7õ?Ï?ùÃ#þak·/yæK¿*ßé^f¼”“%ÅþgÓ§¹ž­pmýf¦Õ~Ý3b¯Îßùñßü¢¿ó‘?öÕòçü˜Ô3b¯ÑùøJùU¿ç >ÿÅâßôzùt¶˜n8íª‹ˆ¿Fp¯íýoÒãMë›xgüúuµÿœ8ÑΪd6æÍtùh=x‹/V0ü+ÛëB~ë›|…ÿ>3ÿ×¢ßoùÒiÿsüØ«÷÷¦lUÕÍŠ¿ ?ç纽ïç·üä_üãüá¿–îË SU·Öüæ‘KjRýV$ukK(®§"•á =ÆlU‡~}EüáÿüýòóOO…4ËŸÍûM6ÇVHG Xmîa_/ß#×µ»GoxÔñ_q›@#6*ü ÿœ¸ò×–¼ëÿ?Xü—òWœtóªù_ΞI·òþ·d( ÕmµË6*Çì²ú܃ Ô€Ãp3b¨oùÁ/Ìï3ÿÎÎLyãþpkóPeò¿˜õ²ß–ºåÀ1ÁúNåTÙI f¢Ã«AÀñ¸ ›3Hsb¯Ñïùùþ±'çßý²´ÿû«YfÅXÿüúãÿXOò3ÿoüIõlØ«ïüØ«ð ó÷ÿ“#ù+ÿ‚çýB\æÅ_¿D…±¢V'°ùæÅ_ÏÇüàÍ®›çùùÏüäŸ?*8ÉùYc™¤¼Õì–¶ ¨ê,K¥S…ÅÊ<ð€hÉ+°¦lUÿ?-?õŸ?ó‡ó«ÿâS.lUûû›Zzüób¯ç3ʺBÿÏÇ?çãrŸÏM6©ùù,/WOÐF·^‘v,ìíù-8þ‘ºss7íùÆB»E:]•ž›¦YA¦éÚ|)oa§ÛF°Ã1¨XãŽ4UT é›EæÅ^Cÿ9 ÿ’ óÃÿ5ÿ™¿î•s›~`Ï“?òA~kæÀmÿíÕc›|äÖ)ÿ9×ÿ?N×<»æúë_•‘³ê1‡‹Z¾åi–Ñ“Y/5YQ¥Ûã‰øWeÍŠ¿¢x¢Ž(ãŠ$E„Ž%UUEtl)›xüåä7—ç#ÿ%<ëù_®ÙÃ-æ¥e-Ï”µ { jÞ6k¤r P²Q^Ÿj6tèÙ±Wåçüùoóo[Ôü¡ù±ù¯Ï3Çù}}m®ùZÚbÅ­ ÔÞhµ UdD¸…d ?nYlU䙿•þZüíÿŸ¯ÿÎA~Oy¦?÷ùä”Ò­oB67±ù3J¼³½U$U­æ·Yw µsb¯XÿŸc~|yŸò£Ï¾sÿœüí‘´Ï2yCR¿ÿ•h×$ñBÏ=ö™µ9G*“yl@£)—Š1›}ÿ?xÿÖ5Ö¿ð*ÐäóæÅ_PÎÿë#ÿÎ9æ¿Ðÿê3b¯?çïÿ›íäùÇ 7òÇK¹+æ/έr;êqß>“¥²^^2ño?Õ¢ Ä„ØìUñüçüãþ¹ÿ8¯ùGÿ8-ùµåH#²ó_ä¬>_óEä`•]lL|Å ºÍñ¿­zó¾lUý y ÎzGæ/‘üŸçï/¹“Có®‹c®i,Ärú½ýº\F+€Gc›~Ïó¿õ×ðvÿ»lUûý›vlUÙúÿŸeë9_àc©ÿÔ=ž|{ÿOùÈ#ÿ ‡û©¾•ìŸø™þ±ûƒ³èvxÓÓ;6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìóÏç§çu§å¯ùGa;ÄÏiOÕýZ~ïKb¸œWqéKq ;=³ßÿà#ÿ|ßðCÑvîx _gèe—_«SÅÇ‹qñ1âÏ=H=,s½»ÛqììšxŸò™(ÿW‘?cö»= žôNÍ]›vlUÙ±WfÅ]›vlUÙ±WfÅ]›vlUÙ±WfÅ]›vlUÙ°«³Îß“¿žŸ™Þ~üìò”RÆÑþ_ë±Zèl€VÈD-¦`GÛîÚVåü®ƒqLú þ ¿ðÍì?³žÎö´¢Aí-,§šÿ‡7_ÁzlØcÃüüY o;ØÝ¹~§S„’˜úµGßꌾ;=Ÿ>=³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÏÏÈ¿õ™5Oütù8ùëŸðÿœŽð¹ýÁç=ªÿ?ÖÏÏ&}–ù“³b®ÍŠ»6*ìØ«³ÿ×üÿâ¯ßÌØ«³b®ÍŠ»6*þs¿çè>N‹óþ~ÿ8Ñù}>§q¢Áç¿.ù7ËÓk6”7‹ªy³U´7‚@ç“’ûŒØ«é?ú#•ö%0?ä\õS6*ýÿœRÿœiÓÿç?.õŸËí7ÏÇŸ Ö<ÇqæÖuµE¸‰î--- ˜pQh{±ÍŠ¿'¼ˆ _óû_9¬€£8Ô +lHo(ÆËJø®ãÛ6*ýýÍŠ¿?ç÷„Ê­üŽZŽGÍZ‰½ˆ©ÍŠ¿HüãÿÎù¦£h¥‹ò^ù%‰ÁVV_.¸ ƒ¸ æÅ_ƒ_óîÿÈßùÊÍ/Ë:ëßó’?ò¥ü¹§y Ùë£,¿Z½ú•´ŸYª+û·Dÿc›K¿4¼‡ç¿ùÇùÊË=cþ~$Ú‡üäW寻3ÿ‡üÑúnöëK†(ç‡ë­œ±eµæ’Md4BàѶ*ý¼ÿœùÓÛVÿœ#üõ·òɉ­SÊÞÙ›2=¨YÜÛ\Êb1¾ŸÕãjSj“›xüùçVÓõùÄ6±µ’·Zu«MQ6ªË$v·Hv$ÐÇ:n†lUú¨3b¯ÿçç:Ο£ÿÎ~u}yÀ}V-NÓá4¬—ëEB׺ª³Ÿe=ób¯/ÿŸch·šWüà™wt¥#ó ÞkÔlýȹžÒ¿KÛµ=³b¯Éïù÷&§ÿ9«¥h¿š×?ó‰¾^ò—™´ç½Òc󵇙žÝ&1ÝI`in­6 $ G=FÝÆÅ_wù›þp·þs·þrïWÑmÿç.8¼¿ä¿Ë &ñoOü¤i}P¬pÅ Û™83"Í<óêx£AØ«öòëòûÊŸ•^GòÇåבô´Ñ¼©åôýOSȬqî]ÜîòHÄ»±Ý˜–;œØ«ùgÿŸvÿÎi_ó–ßò¸IþeyƒòïþUÿøÐý¨ß\ý+úK—­Í—û¯©Ž4þfÍŠ¿K¿èþUÿØ•üÀÿ‘pÕLØ«öjI#†7–WX¢‰KI+ªª¢¤’v Ø«ùlü¡ÿœËüžÒ¿ç=?7¿ç+?8F»©iwgT´ü¬‡G²ŠêhcOL²’Q,ð ¥ÆÑšug'ç±VSÿ?ÿœÓÿœmÿœ´ü´ò^ä /5Ú~`y^{½.çYÓmíí›N½€Å}’;¹™Yž;w > w¨Ø«÷?þpÏó—þWÏüãGå?æ-Ìþ¾¹y£¦™æ¶f«[Kcczì7#Ö’*ƒ¿\Ø«óþr[ùüüãGý²tù;ªæÅ_@ÏÓÿç'üâü±·üëò‹ÿÊÕüš¶{©~¦¤]jZ lgž(9´¶m[ˆhvª¨,ë›x®­ÿ9Hç*¿çÖŸ·º¼ÂãóKÈ:F›£þcÚGC$ÒC¨Ù¼:§‰u 3± D”…k›}“ÿ>¸ÿÖüŒÿÁ›ÿ}[6*ûÿ6*þn¿ç6ü·ç_7ÿÏѼåŸËŸ7€üñ­iþ^·òßœ8³~¹6Ó‘7šFÃ6*Î?ç)?ç¿çâúOå7™õcþrr÷ó“ɺ=…Åçœü—¦_^i—WtHd¸?W¤wq¤jY¢g©§ÂŽvÍŠ¾áÿŸ[ù£ò#ÌßóŽßòü‘u­QúŸæŽ-É¿¾ŸT†ŠòkÙ$š)ãnQ!cøãQð1;| ÿ?dòÌ~tÿœÇÿœdòt×Ói‘y³EÑ´iu;zzÖëæ‹s4u ä‚NCÜfÅ_CÿÑü«ÿ±-ùÿ"àÿª™±WÞ¿ó‰ÿó‹ºwüâ§“<Çäí7Ïš×æ^bÖŽ³&§­„Y¡co¿¢œ‡EËæsb¯È¯ùó,ÇËÿ_ó’^GלŸ6¦•i%Â˼§ôN£=µñ%¾*‰nc¯¿\Ø«÷³ó ÏÎZ|ñ§þ]jÖšæ÷—õ;"k·èÖËY–ÖDÓîn¡¹ WÁŠ@@?}“±Wáüä·›¿çëóŠÿ—P~fþ`ÿÎMùYÐgÖ-´D´òö¥\]ýbî9¥Š]ù^Ñ8Tó­i±ÍŠ¿K4?9ù—óþ}ó?ž¼ã©~˜óW›$5 SÌ:¯£ ¿Ö.ît)¤–OFÝ"‰91&ˆŠ`3b¯¿çÉ¿ù 5¼?å`?ýÒ¬sb¯ÿŸfJ|¹ÿ?ÿœ¥ò¦¾æ?0Ígæ»jÈMd¸±ó-·Ö3ÑËߦáI4¦lUýŒØªœ²G<²È±E—’F P*I' fÅ_Ï?üú /ñ'üä¿üäߟ´´'Ëòér¤OÆ”ý1¬›«P|+«íí›gÚ6ÿóü_6 Òª?ü@¬³b¬×þ~±ÿ8Õ­,>]ÿœÇü¢Y´¯Ì/Êɬäó½Öž \=•œ¨Ö:²…SÊKY W÷4&‰ûaŸó–Ÿó‘ZgüåGüûÌË£ƒÌžfдïÌ]Þ¬4Ý^Ön‚xG7¨’ÅSö$E'•FlUú{ÿ8Uÿ¬ÿ8åÿšÿC§ý"&lUøÿ9·ÿ9 ù{¬ÿÏǼ7æ<º…÷åüãÖiªYiPGu-Æ¡e]VåR $‰[ãEk0,>^û{GüåÏüüþq'þr7þqëóò¢ÒÃÎðëºåŠ\ùNîëHµH¡Õ¬%K«2ò ç($b7`¤„fØôÍŠ¾‘ÿŸ@þrÿÊÁÿœh¹üº¿ŸÕ×?%õ‰4ÅRy;i:£I{a#á!¸…Ge~о`ÿŸçë®ÿàíÿv Ø«÷û6*ìØ«³ôÿ>ÊÿÖr¾ÿÀÇSÿ¨{<ø÷þŸóGþ÷S}+Ù?ñ3ýc÷gÐìñ§¦vlUÙ±WfÅ]›vlUÙ±WfÅ]›vp?ÎýóÞm/ôÏ䇜mlu[‰¸ò†£ee,W´Þ¶÷3ÆLrv¤Àíñ'vÿ€¯kÿÀï¯ò~Úö|ò`É/N«\Ñ–ønr¬˜úÞ8ø‘ßÓ’ÀÜÃÚFz€H ©{¤FÇß·¹Ùñó—ó?óGó#Ì‘Çù­u#ëþTi_£d´ŽÉ­]e&dxcD£óÙ‰ØÙûUÿÿø{#ìge™{-4ºÃÞ É,Ã(1ŽIÊWâ¯Q=KáݳښÍn_ð³ê…ƨF·ßaÕÙïùÇ=Îc~v=­òyÆ×˾@²qï›ït{)Káhí¢y*(ÌHE5äy|'á/ùhb?àÿ(ÏÐOUÚ™4Øõ9£qog™qïq€sÃÆ;ÿguݽڕ/CØÈÆ;×Híê=çêoggÓËX¤‚ÖÚ ®d½š’9o&²LÊ F¨€±ÜñP<ù§ªË¹g8@cŒ¤H„xŒ` ±™™LˆòR”¨z¤Nï§À&üûþ[|‹å ›vlUÙ±WfÅ]›vlUÙ±WfÅ]›vlUÙ±WfÅ]Œ‘K£¢ÈÑ3)E¡e¨§!ÈQÔTdñÈF@‘º>Fˆ;ù|ÐE»>nÎEy»þrÿòOë~dÒ¼ékæŸËŸQU5ôÑôñsaê¸HÒú!Y‚‰pcJ„f Ÿ¢ŸòÏžÊÀKþ ¼ªìùèûZ‰8N§QáçáR–žg%šˆ2–)â äŒ%7ͽ£ÕöïeÞHdÃüîÜo—¯…•€ìù¿ùSùŸù•ùyçÖ?.oåló*)£úº_Ix×sÆâ1 ªáÝåEã·*ô럢_ðQÿ§²¾ØvÑûCŠ?‘ÒøÎá¡(™™ÀdžÇ)qoÃùä7ìžÓÕèóñéï'éåÅÅdmF÷%Ùöÿò/Hÿœ€ýº÷çœm¥½»Š¶~IÓ쬣[Pßµwu Uie¸¯vnƒñ_þ Ý­ÿo̱: Ç%êÕåËšG-tÇ$ê8ÿ§–«~Ÿ¯*tä¾9±Wíwý·üâGþÄoåÿýÇ-?ê¦lUå_óßó:‘?ç üûùƒäý~ÓT_Ì­"/.~_ëVR‰!»o0©ˆÜ[L†‡…™štaü™±WœÿÏ­?"´o"ÿÎ&ySÌîk?˜5o®üÙ{%í´rJ–“0¶Ó‘ÔŸM­­Òu2ß6*û‡ó7òsÉ™—^xü½Ôt:ÒÏΚö%ìV‰-ÍäO Pñ3R:3b¯Ç¯ù󇿫å]sóóþqwÍßèZ÷•u9<ŧéNjÑ\ÚʺF·OòI­îXæÅ[ÿœ–üxùÆŸûdèò{UÍŠ¿vʆÔìÊzS6*þ^ç6ÿ'õïùÂ?ͯÌéüc$ßó”žWÕô˜4Û`½Ô¥.šÂ” Õ/)aÛýçfI"B6*ýŠÿŸ\ÿë ~FÿàÍÿ‰>­›}ý›~~~ÿòd%¿ð\ÿ¨KŒØ«÷éÑ7Pèà«¡ |Ø«ùýÿŸoüƒÿœêÿœ›ÿœl¹f´ÒµOÒQù~$zíåûö—N!OwÓï%’½‡Ï6*‡ÿŸ¡jšv‡ÿ9Íÿ8“­k°éšNkåÛÝSQ¹q6ööþfšIe‘ÛeTE%‰è3b¯ÖïúoùÄýˆßËÿûŽZÍy±W¢~]þ|~L~nÞêZwå懖üû£À—:¥¦‡¨Cy%¼NÜI&bª[`NlUøƒÿ9wù_ù«ÿ85ÿ9cüæ§äï—¤×ÿ,üÕ¨ËçkÕþ­ks©ž­ûF¬a†ùØË ÅJ¤Ì9"Ø«ô¿ò‡þ~7ÿ8•ùµ¡Xj/ù­¤þ\kSF?JycηhÓÚMJ²}få’ÖQàÑÊÀŽ´j¨Ø«âOùúÿüäOäGæ'üãž—äËÿÍß*yïÍ'Îzf t¯.ê–ú©[[{[Å–W’ÍåB™TnÝM|Ø«ìoÊïþF^„)¿ü¨ ¿ð_—6*ùþ|›ÿ’ ó[ÿ6SþáV9±W‰Ît~Y~cÎ ÿÎXysþsŸòŸF“Wònµ¨Åwçk8csog4"ÆþÚñ”?§§ ’Ÿ³;µ(Â>[~§þOÿÎuÿÎ.þrùfÓ_Ñ¿6¼¿å{ù!Y5?)y§PµÑõK)6æ ܨ$ M=HYãéño›|Yÿ9åÿ?ü»ƒÈ÷äwü㯙cüÐüÔüɼ¼ú§•‰Ô,ôë[ñèL-î­ù-ÅÜÊæ(RܹV%˜«*+ìUôOüû‡þq_Qÿœ`ü‹ô|ßn¶ÿ™Ÿ™7QëÞuµ-`‹K-1™vf¶Ff d‘Ae sb¯Š4aOùþ/›?í•þ VY±Wî~©¦iÚÞ›¨hú½Œ:ž“«[Me©é·(²Áqo:åŠXØÊèÅXˆ9±Wògÿ9mùeæßùÂÏ3~yþAÙ­ÕçäÇçÕ¶™­þ_\ÈÅ 'V†òQÈ¡žÍ={i݃Ç!2ŒØ«úÿœwóæ‘ù]ÿ8 ùUù®·Èß”v:åúV"Yi¢oMzüR  ’@¦lUðüúòÞo>Oùÿÿ97çý:c]óî¾ú=õÜ êóK'émbdYCTK4öâ½F&´Ø«öÓü)åoú–´¯¢Îù£6*üÿœYÿ¬BÿŸŸ~g~DÎ?FùóN[Ý7˶Ð,WŠ5½©3"h)·7`@¦ÛdóüÑ_úÚoÿ)·ýØ3b¯ÕÿúoùÄýˆßËÿûŽZÍy±VmäùÈßÈÍMuü±ùoù¹å_|÷ÄqG †(JÉ3Df.""yktZ®ÐÇI€}r¹Hý1Œ{ýäØsÂìó_Ÿ?çß·Þ]òÞ‹®þRy®ëTóç—./íu¼w÷0¿ª²Ù0ÚÝÕ€ ’3)UÁ©o£}†ÿ–õÓöÇjj4>Õèa‡³5DÂÅÅ’X1Ìpj<Ð1³<˜á ‚eÃŽQ1Œ9ü¥‡g¤Èe–›¡ÄF÷æžàly»>•ùCX¼ó•|»­ê:tÚF¥ªiÖ×:ž‘sÃ-­ÓƦx9ehä䦾ùÇíodàìŽØÕè´ùcŸÓ†<°œ2â>HÊ$ÄŒá®ÿƒéz<Ò͆1‘v ÖãàvvHóžr]›vlUÙ±WfÅ]›vlUÙ±WfÅ]ž ÿŸ‘ë2jŸøéòqó×?à%ÿ9?ásûƒÎ{Uþ$¬ŸžLû-ó'fÅ]›vlUÙ±WgÿÑüÿâ¯ßÌØ«³b®ÍŠ»6*ùƒó¯þpÏþq³þr#ÍVvüâü¸ÿyŸKÒ¢Ñ,5?ÓÆŸéØA<÷1Ãéi÷ÖÑšKs#r*[â¡4 мþ‰qÿ8)ÿ–3ÿo3ÿÞ[6*÷ÈïùÅÈ/ùÆë¯1^þKyüsæÈ­ óŸ¥5]GëÚ4 ÓQ¼º ÄÊû ×zí›{›ü™å?Ì.ê~Qó¿—tÿ5ùcY‹ÑÕ4-RÞ;›i–¡‡(äUXV«À‚ÍŠ¾ÔçÓ¿ó…wú©Ô¢ò±¦@ÌYôkMQ„’I§«4’¨ß¢ÈÃ6*û#ò‡òòòB›ËŸ”>AÒü¦]”mA¬Ñ亻hê#k»ÉÞ[‹‚œˆS,ŒEM)\Ø«ÐüÃåý'Í^_×<¯¯ZýBó&Ÿs¥ëV>¤‘zö—‘4ÇêDÈëÉŠ£A6*óÉ?ùǯÊùÇMVò¿äß”Áú¹¨ST±úþ¡¨ú·f$€Éêj77.¿j(¬jҵ͊½ Î~Mò׿”üÅäo9iQë¾UófŸ>—¯é2³Æ··(c•9ÄÉ"ÌŒ¬¦…H Ø«ü—ü†üªÿœzòµï’ÿ'ü²þRòÆ¡©I«ÝiM¨êЛɢŠ%WÔnn]9$( «Ú´©5تyù—ùMùkùÇå×ò§æ’´Ÿ«úE|‰­ÃiÌ·è$ó¤m(kðòišâ‚¿ïêí×®lUö·åWä¯åO䆀|±ùOä=#ÈÚ;•k¨´è)5Ó¨¢Éwråç¸p6+³SjÓ6*ô{»H/­nl®“Õ¶»‰á¸Ž¤rI« ©T ×6*ñÈïùÆoÉùÆë_1Y~Kù'ükæÉm§ó_¤µ-GëZ,‹ ®£utSˆ•¾Á®õ Íнàl)›vlUðýãþpSoù½?ïæó?ýå³b®ÿ¢\ÿÎ öüÿÛÌÿ÷–ÍŠ½¯Ïóˆó_™—Cü¢óŸ¤Ö?.¿,Ò$òO–F³¬ÛGf €ÛDZ[k覒"T4ÎäTïRk±W¾è‘åmDòÇ—ì“LÐ|¹am¥èšlEŠ[ÚYİÁ —,Ä$hT“¶lU6 é›|ñåïùÅÈ/*~rjßó\òèÍ­v[Éõ4ÛꚨK‰5)tÒX³d}Zò#ѧ?íüY±TÃÌ¿óŒß’>oüàò×çߘ¼•úGócÉñ[Áåß5þ’Ô¡ú¼v¦V„}N¤µ~&wÝâbk½h)±W¼fÅ^WùÃù'ù]ùùåò'æç” ó•ä:‚iÒÏsjñÝ[×Ó–+‹9`ž6™IGRÊj¬Aتiù[ù[äOÉo"h_–Ÿ–šøkÉ>Zú×è]ëWWž×.¥¼Ÿ÷÷’Ï3ršwo‰Í+AE н6*ùÿ_ÿœ\üŠóGç.‹ÿ9®ùëß›¾]ú·èo6þ“Ôâô~¨?èq]¥£qW#â„×½sb¯¦lUóÝÏüâ¯ä-×çtó‘ÒyÓüç·t‘<駪@Å’Ëôp/gÚZ=m¿tÜ¡<—íTæÅRÏÎßùÃßùÇOùȽIóGç'åßøÇ]Ðôñ¥éwߥõ}?Ò´¼þŸ§§^Û#|r1«)méZ›xÇýãþpSÿ,gþÞgÿ¼¶lUíÿ’óˆÿóóŽ:¦¹­~L~_ÿƒu?2ZGc¬Üþ–ÕµZŸÔDã¨Þ\ªÑ·ª€}ób¯¡îìí5 K› ëh¯lo"x/,çE’)b‘J¼r#¬¬¤‚¡fÅ_ùßþ}Áÿ8açÛûWTü‘Ó´FåËÉ?—¯5  Y¹5-,.a¶ÿŒ_,تß(Ï·?ç ü™qæŸù¦j÷qÓ”ºýÆüI#•µýÔÖýèi¯|Ø«ë»ß%ùZÿÉ·¿—Òhv¶ÞKÔ4‰t ü¹b¿R¶]6xÙía[c…=&*¾™R£ì‘A›yÿäŸüã×åü㦫y_òoÊ?àý\Ô©ªXýPÔ}[³@dõ5›—_‚5V µiZæÅ^³©éznµ§^éΟm«i:œm©i—°¤ö÷J¥dŠh¤ ŽŒ¦…XFlUð?çÖßó†rÔ¥ÕGå¥Ï”î®_Ô¹‹Ëº­í•³]–Õ¤’‡ù1"lØ«Û?%?ç ÿçÿç/?K~X~WiÚ_˜ø•k¿yµMQ¬!º¾’g€2š0„ aÔØ«éúfÅ^üã7ä¿çßüäŒ^JáùÑ}†ëΤµ#É‚i`}DÝ1þ‹Ç´=¹}¯‹6*÷zfÅ^)ùÛÿ8éù1ÿ9£húç7’ óž›åûÆ¿ÑQ®ïl&·ã1¹K‹ í¦âëNH_‹¤©*¤lU«þ@~Sk¿“PÎ>ê~W’_Ê+}6ËG‹ÊqjZŒXéòE-´ö”¼!Z©3UÀ£–ƒ±Tóò£òòóòCÉgåÏåw—#ò¯“ty.f°Òâæì¬—s<ó;Ü^K<òw;»µQT±W£Ó6*ùãóþqGò óGó?ÊÿœÞwòéOÌß%ýCü5æ»}SUÓå·m.åï,ØÅcyo ÎX4ˆÄŠ)%@b¨Ï?ùſȟùÉOð¿ü®¯#?Á^ÿ ¹=SNú·é«ýkþ9·v¼ùýV/·Êœ~T×b¯ÿ¢\Î åŒÿÛÌÿ÷–ÍŠ½còoþp§þq—þqûÍÒùëò‹òÓü%æ©´ù´¹5OÓ:Õým.9%Ò¿¾¹‹âhׇ!MŽç6*úŸ?@_óì¯ýg+ïü u?ú‡³Ïàéÿ9á0ÿu7Ò½“ÿ?Ö?pv}ÏzgfÅ]›vlUÙ±WfÅ]›vlUÙ±WfÅ]› «³`WfÅ]›vlUÙ±WfÅ]›vlUÙ±WfÅ]›vlUÙ±WfÅ]›vlUÙ±WfÅ]›vlUÙ±WfÅ]›vlUÙ±WfÅ]›vlUÙà¯ùùþ³&©ÿ‘ÿ'=sþ_ó‘Ãþ?¸<çµ_âGúÁÙùäϲß2vlUÙ±WfÅ]›vÿÒüÿâ¯ßÌØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³ôÿ>ÊÿÖr¾ÿÀÇSÿ¨{<ø÷þŸóGþ÷S}+Ù?ñ3ýc÷gÐìñ§¦vlUÙ±WfÅ]›vlUÙ±WfÅ]›vlUÙ±Wa™üË£y;Ëú¿š<Ãx¶.‡l÷Z…ÛôXÐvñ$ÐÜ‘›Ïf½œ×{GÚX;3AŒäÔj&!޲?  $ô–V§›²ä5‹%Øz jàŒÒ[7»/»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìùcÌú'œtxµï/^®¡¤ÏqumÚ}—{;‰-e§°’&7ÞÒ{5¯öw[-hc8³Ææby›sBÿÌÉãéuXõ8üLfâIýRb~Ðìf…ÈvlUÙ±WfÅ]›vlUÙ±WfÅ]›vlUÙ±Wg‚¿çä_úÌš§þ:Güœ|õÏø ÎGø\þàóžÕ‰ëgç“>Ë|ÉÙ±WfÅ]›vlUÙÿÓüÿâ¯ßÌØ«³b®ÍŠ»6*ìØ«³b­W6*êæÅ[ÍŠµ\Ø«y±V‰öÍŠº¹±Vób­›usb­æÅ]›vlUÙ±WfÅZ®lUÕû¼sb®®lUÕÍŠº¹±WW6*êæÅ]_lØ«y±V«í›u~ìØ««›o6*Õsb®®lU¼Ø«UÍŠº¹±Vób®Íе\Ø««›o6*Õsb®®lUºæÅ]›j»Ó6*êæÅ]\Ø««›usb®®lUÕÍŠº¹±Vób®ÏÐüû+ÿYÊûÿOþ¡ìóãßø:ÎAøL?ÝMô¯dÿÄÏõÜŸC³Æž™Ù±WfÅ]›vlUÙ±WfÅ]›vlUÙ±Wg<üÉüÊÑ+4æo1éºÅÞ‡ ¨_éVmz- ‰.$CÓ™AØ‘Q^ÿþ_ð9×ûwÚ?ɽ›O L‡¢²Œ>)þn#!Ã9æ_ÄH V»´»Ogâñr õ1Uïî|Ÿ7ç*ÿç.¿/ÿ3¿+%ò7åÝÖ¥-浩Zu®íZÙ>£lZ~!‰5-2E°ì~ŠË.Ë'{Kì?¶í¿h!„cÓáÉàðd%ãä¬v@€Å,»÷‘^^oí_µú]~‹ÀÓ™\¤8¬W¤o÷€ìê¿”ÿóœÿ•ZwåÏ’´<]ë æí/LƒOÖ-:Ë-¨ôPêÔc*¢¹§sLòïø)ÿË{c¬ö£´u}‹Nt³O..,£Œ2ŸÀÄHÇ)Jÿ† ÛµìŸn´PÒc†s/1нÆ×ñæì÷—–uøüÑ¡ØkÐ階‘o¨§«–­nm.Õ ¢´1/z€Àvφ½¤ìöheÐÏ6òÄjSÁ1——Q€pιFã|‰{Í6 gÆ2˜ƒÒBË§ÅØ}š'!Ù±WfÅ]›vlUÙ±WfÅ]›vlUÙ±WfÅ]…zÞ©úJ¾ÕŽŸ}ª­„FVÓôØ~±w*Ž¢AØ øÏ`NÙ³ìnÌþSÖbÒø¸ðœ’áãË/IåÇ:"½¸¥ér"6EYòøP3£*蟀êìñžç»ÛÍÃ1ˆËÄ¢" kÕÒýÅÙçùÄ_ùÊß$~Sy[ògæ-Ö¢«®ú‡—çµ¶k¯Ý]F¢xqã$e÷ê\çÑòÖ?òË}¿ÿh´Ý±ìô0’tãq9Œ^¬R>Åø¡> ¹ QÛwœöCÚ½?gi¥‡ROÕq¡{cæ/âìúaù]ù³åßÍÝ&mÊšv³‡pƒVÔìšÎ–ß—Õ̆²…¥ (âÕ®Ùù½ÿÏøv§üu±Ðv®]9Ô‘rLJ(Íîÿ¹ÙÔ3ÌÝ£³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÏÏÈ¿õ™5Oütù8ùëŸðÿœŽð¹ýÁç=ªÿ?ÖÏÏ&}–ù“³b®ÍŠ»6*ìØ«³ÿÔüÿâ¯ßÌØ«³b®ÍŠ»6*ìØ«åÿùÌÿÌß7þMÎ1þlþfy ú-7ÍÞUÓí'Ño§‚;˜ã’kûkv&)•‘¾ [¨"¹±Wå§üã÷ýþr«òÏGüÜò÷üåO•|­åmbæú *ÆçJ±·½gröÒú±Yh%8òŒð&W4ì*sb¬ïÍzçüýãþqËO›ÍZÖ¡äÏùÉO(èéêêvº]„3]Ei»Aii£_HÜEXÆ&#í5T›}£ÿ8eÿ9Éù{ÿ9 jPéš|žMüÉò¼Íæ¿!]L³‘°E¼±œ*}bܹ Ä¢´lBºÑ£gØ«ÉÿçèßóŸ›ÿóŽŸ”_—¾hü›ówø;]×<àº^©}õ ?PõmŸu?§éê6÷1¯Çšª†Ú•¥sb¯ü£åŸùü—<©å8èÿó~E]#ÍšM–³¥­ÆŸ¡$ÂÚþ¸ˆHƒËl¸8¨Ð÷ÍŠ¾¢ÿœgò_üüCüÒµ¿ÿœ›üÛòŸœ+WM¼K½G¶Ó"¹kÖQõW k¢ØÉÅZµýímOùÊï,OæuO¬*,Š -Jú"6Ñ—>Ô(¿µMób©‡üãoüüKó?Aüà‹þq›þskÊyó{È´½Îñ@–PËy9ãnš„Q»[”¹$®­ˆˆÕ~$È6*ýUüßó©å/Ê_Í5ès-¶·å(ëz¶pè²,wVVO ²8*À:A=ób¯ÂßùÆ;ÿÏÌç3¼­æO;y;þrƒË¾NÑ<³­>‘-ö‘§ÛNn®h‹e¢IÊ%ITò–­vîv*μÿÿ9!ÿ?ÿœÔt-oþr.,~}þSj—±ØÍæm*mB59 u¼´³±{yÝA*×V²+ÁKi±Wíåæ/–7?/¼¡ù—äÛ¦¼òÏtÈ5M&IYQ&_Š)T $N :ÔÑ•…sb¯ç£þqŸþ~Qÿ9#¬ÎJþ]i›˜Ñù‹òWÏ>lºòÁ¶}H²‰ZîYÈ—V¶P\(·–êÙÜ»‘Àž}j6*þ”‡LØ«áïùøOüäv±ÿ8Ñÿ8å®y·Ê¤zWæ'˜õ ?/ù êH ¹ônçc5ÅÇÕîHÜEk ¤sF^|9 ÷Ø«æÏùõ¯üäÿç×üä ïçþ‡ùõçó>±ù{?—ÓD¶“MÓtË‹V»mR+ôdÓ­­ƒ…{X䤩ï¾lU ÿ?Yÿœ¢üõÿœlÿ• ÿ*SÏ?à¿ñŸø§üKþã4½Gë?£¿D}Wþ:V—\8}j_îø×—ÅZ-6*Ê´ÿŸÑÿìBþ_ÿÒ‡ÿŒÎlUõ?ü┿ç><¿ç?1ÜÿÎYþgùgÏ>MŸE1yoOÐíôèf‡SúÄDJæÏIÓØ¯¢$ZaR>î6*üÿÿœüÿœâÿœüÿœ¯>Iü°ó’Åä]Fѵ»¿$¾¥ÝÇt‚6¹¾Ine³’ñ#’8Û›$ªQjÊV•ÍŠ¿gÿ#ÿ8¼§ù÷ùYäÿÍ%ÏÏEóeŠÜ5£0i¬®˜î¬ç¥?yªÑ·cNCá æÅ^/ÿ9ëù£ç¿ÉùÄÿÍoÌÏËMwü5ço-~‚ý ­}VÖóÑúæ»§ÙÏû‹È§…¹Ã;¯Ä†•¨£FÅ_1hžsÿœäüòÿœ%ÿœ|üÀüˆóî›çG˜ï.î¿0|Ç©Yè°Gw§Eq¨[ª¬Ú¡ÿuš½k±WË›^`ÿŸÄ~J~]ù›óCÏ?›Þ^·ò§” ŠãX–ÎÃÊ—„šxíÓ„K£‚Çœ«]úfÅR¿É<Ïß?ç ¿.ôŸÍ˯ΠçÊšÔ÷vö3_éÞTµœ½”ïo/(›G$QÐÓÇ6*ýFÿœ9Ò?ç347Ï‹ÿ9…æ­/Ìú”÷6È’i‘éQˆ`TŸëÿEÙÚ),Æ:s Ójo]оÑ6*þy¬ç!ÿçâÿó–ßóß‘‘?z>‡mùoæ?6ͤiúÞ Çoo¢èúðÒánF»šGA<@ f–bzìUïŸò­?çô4ßþròÿþ´?üfsb¯Ñ?&?çW“¿ç&»üâó%Ž·ùÛåï+ë7žbó.›¸µ’úºšÖHâŽÖÚ1#ÐjS±WÇóë?ùÈïÎùÈÿ ~jkœÞrÿê~[óŽ‹sú;NÓ½y­LŽœtëkej¶õ`O¾lUúŸ›~@y¿þró×KÿŸ¤ycþqÎÇÏ>‡äÖ£õ/®y;ôf˜Üýo.½óÿ¦µ¡¼œÚaáövÍŠ½þ~ùõù±ÿ8ïùå:þNy¯ü!æmSóOÑ/õ?¨Øjì&Òµ[™!ôµ {˜Ö²ÛDÜ‚†h b©wüû{þs+Yÿœ”òF¿äÍKåÏOËy¤>f2[Ãc&§§K3,W‚ÒáHÞ?WR#cC-Å_¦®lUù3ÿ>îÿœ˜üîüõüÞÿœ ò¿æ§¿ÅåÞ¡o“lFé¶_Sïõ}K–©c÷¬Ý+ÔšìU†ÿÏÅ?ç(ç%¿*ç ?&?&ÿ!|÷cä¡ù™¥iéõ‹½3O½¤u Zm>'’[ÛK‘€—4 ›M[òþ~ãl‡T·ÿœÀò%ƳV‘´é,a6|Þ¼•yùm’”'ˆ0€ )ǨثÍïç:ÿç4¿ç|×¢èóš”–kò±0·µüÆòÄqC4¤T»ÛÏo ±–EP[êòGo!¼•sb¯Ù¯Ëÿ?yKóGÉ~[üÁò&³˜<£æ»4¾Ñ5h*Hž «+ÈèÀ££Èà«ÀŒØ«2ÏÐüû+ÿYÊûÿOþ¡ìóãßø:ÎAøL?ÝMô¯dÿÄÏõÜŸC³Æž™Ù±WfÅ]›vlUÙ±WfÅ]›vlUÙ±Wc$Ž9Qâ•H¤R²Fã’²‘B;FOIBBQ$l±uÉÍÙð›óïòÆ8ÎHy·È‘FyÛO1G¨izeÕo}5’îZÈË´k#úd¨v¥F~áÀ+þ Y=ÿn‡·=¸í!—ˆÃ&mòœWI3¼Ôg›U¸Ó£o¬ÝÛ)H-RX"½’I9zs¢q©õGþX·ûj=Ú¹»KZcØÚ>ãŽR< õ„¿—öÕóýÕîsb¯ÑêfÅ_ÎOçî‰oÿ8ÿ?Lü­ó·‘‘t?+~ljF¯®iQ-’ßÌW²éä*•U£2=Ê©?#´ïÈïÉ?Püæò-ý‘|»o}eqæ-2)¡š-2Ý$ŽHÞà2²° ‚*Ù±W¾y_ó?ò×Ï—’¿0¼³çû8~±wc¢jÖz„ÑCÈ'¨ñÛK#*ò`*E*i›~$ÏÝü§ªþXþlÿÎ9ÎWyFÛÓÕ´[èt­JôU#†‡rº¶“ê;™TÜ)=xÆâ”Ø«÷/ÉžkÒ|óå*ù×A”O¡ù¿H±Ö´yÁ5µü q ¨$£Ž™±Wàßæè?ó˜ßóõŸ(~[ ý#ùwùðC®Ãñ=»G 7éTL½kùÁÈêæÅ_UÿÏä*çtÝ«ÿ!FÚŸòé¨fÅ^ßÿ8{ùáù-¡ÿÎ,ÿÎ?èú׿ÿ’t}[Mò.o¨éw¾`Ó­îmæŽÕÇ,R\+£)؆ŒØ«ë-~kþVùÓQm#Éß™^Vóf¬µËiz6³er!BHa·™ßˆ,4 ¨ÍŠ¿çó?ù4ÿç?íïÿQÚflUûý›|µÿ9«ù©©~KÎ-~t~bh—g¯išÔ4 èÿ¼·¿Ö."Òín#ÿ*n–AÚ«¾ÕÍŠ¾!ÿŸ7þNé~WüÖÿ8O4þjkwvöº³-d]H“ê±À¬j@k´¸w¥9|ûæÅ_°TÍŠ¿ÿçó¿“ZN·ùCäÏÏ Í^BÖàÐõ]E‰%ÑõA'‘‡_FícàÛÔzèv*ú¿òûó>ÿóþ}Ç7æ&­toµ­kòs_¶×¯Ùƒ5Æ¡¦iךuäÌT‘ÊIíˆìM6é›|­ÿ>MÿÉù®?ó 7ýÒ¬sb¯¡¿çê^nò——ç ÿ1ô1ÜÛ WÎw:F™äý2R=k‹øµ+kÂÑ¿¹† $b6R¿bªóïKmkÈ?óï!jzÙšÆk}ÌÞbÓãu<ಟP¿½¶uV؉#"eìCØ«ðÉŸ”Oæïù÷WæO掙`Ã]ü¥üâµ¾mZ$o[ôeÞ™ces:ïðOso)¡øB“Ó|Ø«ú{ÿœWüá‡óçþqïò«óLH²jdÐáO1*ÐÕ¬‹Yê*EúÌ2®üh{æÅ_˜?ó•×’ÎOÿÏÇ?çç,ßy3ò]áó7æ*¥á•V»Žz%^Ö XŸ²ó2ìsb©?üûù,¿ç0ÿç9|¾‹º\kW÷)kN(²óô@"ÔQëm¶“›dóíïýb_ÈOûejÛÚ÷6*ïùùþ±/çßý²´ÿû«YfÅ^ÿ> ÿÖ%ü¸ÿ¶¯˜¿î¯s›~S6*ÞlUüúÿÎ êoüýþsJ}FúßO›ók™R$,|ï§¡œZi›~ôÿŠü­ÿS.•ÿIÍy±V;ù©$s~T~cˬ±Kå=aã‘eekˆ ˆ9±Wä'üùÿ%_ç‡þzwý@œØ«öû6*üó÷ÿ&×É_öîÿÄJLØ«èùý_þ²Ïójé_÷D×3b¯Žç#<·ç/ùÅ<Î1ÿÎ{~Séæ- ÏžZòÜ™:-ÂÙõt›¬ÚÎB"Ôí¾.$¬Ñ´¿l¦lUý~W~eyOóƒòûÊ™~GÔ¥å8éñßé“ì9í$(-ÂXd ‰_…Ô¯lØ«ñƒþ}'ÿ“÷þsWþÚÖŸ÷UÕ³b¬þ~]ÿ­õÿ8oÿ‚¿þ%2fÅ_¿”ÍŠ¼wóÿòsË¿Ÿ”zü©ó5´SZy§Lš:éÀ-e¨"—²¼ˆx¼qãB¦ªH;~FÿÏ”¿25©´ÎïÉmjy ·“ïì5ÿ/ØÈjÖíëÚêQŠšª‰-¡`§&sÔï±Wî éŸ /ùöWþ³•÷þ:ŸýCÙçÇ¿ðtÿœ‚?𘺛é^Éÿ‰Ÿë¸7ŸC³Æž™Ù±WfÅ]›vlUÙ±WfÅ]›vlUÙ±WfÅ]Ï'~_ùOÈqj«å­&;;­~úmOÌ£|ww÷—4²Íq1øœ–r@û+Z(;k½½íŸj§€öŽs8i±G cÓ‹q†Í¥¤>oòêÍ Ž»îç’Þxž)-®þö*? ­^,*´Þ¯gû{Û.ÄÕv3h5F2žz¡˜åÇ.0»Ééᔡ\p&3NNÏÃ<ñÔþò7R芣Þ=üŽáÙ3Î9ÍvlUØ”3ÃqÍo*OXØ2’ „TlE[— ðÈÃ$Ld:G}ÆÇ¼ HÆîÅr¤»6*ìØ«³b®ÍŠ»6*ìØ«±9eŠ¥žyaC$Ó9 ¨Š*Y˜ìrrÌX§–bR‘,’v¹$ò”„EžNÅ2´»6*ì†Eä*Gçk¿ÌY4¨îüãsg›µqûÉ-lâ H-k´JÌîÌTrbÇ‘"€v}¼í‰ö=ŸŽsφIe8£éŽ\Ò¯Þæ­òJ1Œ#/L DŒ¥,1ÙøF êLo!g¤{‡w[ï·eùãÈ>UüÄÑ¿By¯KMBÞ)VçNºÍ•Ôf±ÜÚÌ¿R¡Ü2ŸcU$`ö+Û¾Øö;]ùÞËÌqÌÄÂqú±æÅ-§‹63éÉŽCœd?¥ 5ÝŸ‡[ƒ,ls¬OCл& PZÓ¹ê~ìäI²æ»/»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìðWüü‹ÿY“TÿÀ‡Hÿ“ž¹ÿ/ùÈáÿ ŸÜsÚ¯ñ#ý`ìüògÙo™;6*ìØ«³b®ÍŠ»?ÿÖüÿâ¯ßÌØ«³b®ÍŠ»6*ìØ«âùùþ±/ççý²´ÿû«YfÅXüúÿX“òãþÚ¾bÿº½ÎlUú;\Ø«ùâÿœÿuüÜÿŸ•ÿÎ9þVù|}nóËËå-3_ôõmäºÕ¦Õ.Y¾Ðc›ìÖ•4;fÅ_@ÏìÿòA~TæÀ_û¥_fÅSïÊOùõWüâOœ*,¼Ý­hþf}gÍ^SÑuYáÖåŽ3s}c ÄÅ' ¹ í›}‡ÿ8ñÿ8?ùÿ8¿æ}oÍß•:~³g¬ùƒK:F¢ú–¥%ìfÔÍÅ@œK¾lU)ÿŸƒþQ'ç'üâ_æÎƒ ¸¸Öü±¦Ÿ7yd„ç"Þh@ݲD£öç·Y`ñ“6*ùWþ}éÿ97§é?óï¿4y£Ì“­Õ×üãDåäÈ—6¶ÑOLŒxÒ?=ób¬#þ|çùi©jç7üäç›ë{æÍ v]LÔç_ßI }{T¸W©%n®æEoò ÍнWþ#·üâFšïÿÑ¿êPÍŠ¼Ëþq³þ}ƒÿ8«ùŸùù=ù‰æ­'Ì“y“ΞSÓ5r[mfXak›«u’CaQÈì3b¯¶ÿ ¿ç?ç?çüó7æ冮Zy’m.ãHyuNKÈ~­s$RH=6P9r…h®lUù¥ÿ?™ÿɧÿ8¡ÿoúŽÓ3b¯ßìØ«óÿþ~ƒåëï1Îþp¦ž-ÆúV’Z—‚ÓW³{‚MEEÊBwû?HØ«ÿŸOyŸM׿ç ?/t›)K¿$êþaÑõ„VäRâmVçTPƒa¾ŒÓéï›~’fÅ_—?ó÷¿5éÚüáþ§¡ÝJ‚ûÎþiÑt½*Û=´­¨Èáz•T´ žƒñ±TwüãW–o¼¥ÿ>«²ÒµÞ9îÿ)¼å­F®(} mu]RÜŠ±ŠéHñ±Wå·üû¿ò‹þs Ïß–>vÖÿç?ç ´ÏÊmÓÍÇ_òö§nfK‹Áeo'Ö›;À Õ:ðõÍŠ¾ÿòïüúã^óÿ´Ï?ÎaÎDkߟSéMŸ”bÚØˆùr15̳»¤.@-¼Pî>ÙÍŠ¿C?ç å´òüãGç|ÚMªé¶>Wü²ó+é–V [¬Xè×&(à AE@ŽÂ‚™±Wæüú¿ò×GüÆÿœ üßü¿×_ÕÒ3<Ûæm7Pøw…/4]2Ç’oö“€‘H¡ òÍŠ±ùôÿæÛþWy[þrsò+ó2äiw?‘z…ÿ›o cÉà¶³Y먼ŠÑ-å³»RŸØ«+ÿŸPùOXüÆóOüäWüæ?-Ûôÿ柘®ô/K!þîÝÉ1zm q ‹-6Ûb¬þpUßGÿŸ¢Îkh’É.¨|ퟅ‹Ÿ5ÙL‘¨'z%ÃWýZôÍŠ¤ßóüÝ¿èWðvÿ»lUöýþpÛþ¬¾jÿ¸ìßóFlUô÷üãüâäßüâ¯øËþU%–«gþ;ýúôûÞòýõ¯«ú|Ôp§Ö䯎Þ±Wææ¿ÿ&òxÚ¦ËþèzŽlUõgüüãþq0ÿÎBþN;ù?N3~l~QÃq©è+þÿRÒéê_éÛYè‚hE æ¥UŽlUñ&­ÿ9Gsÿ9?ÿ>©üíÐüÃ~/ÿ6¿* ò¶›çOQÿ}e˜4Ù-5V.jÍ408”Ö¦TsAÍFlUú]ÿ>ÞÿÖ%ü„ÿ¶V¡ÿukÜØ«¿çä?úÄ¿ŸŸöÊÓÿî­e›`óéÿýbOËûjù‹þê÷9±WèölUÙ±WòåùKÿ8ÁäùË/ùøüåçåÏæ.¯æ DÑ|Áçÿ2ZÝyrâÖÚé®­¼Û š#½Ý¥âÊ^9 5 ñPv*ýÿ¢*ÿÎ,ÿÔýù©ÿqMþðy±Wé½äûo)~Bë>@Ð ÕõŸ–|ƒqåý®Yæh¬´¶µƒÕdXÐÈÁJª‚zÓ6*üšÿŸ!O ü²üô¶)¸‹Ìúd²ÂÄ©%“„b<£ò9±Wîsb¯ÀO9)Ô?ç÷^S‚Ì­ÄÖkd×Q©ŒEäÉ.•{ˆ¾*xfÅ^ûÿ?«ÿÖXòþm]+þèzælUö¯–ÿ*¼§ùÛÿ8qùù[çkO­y{Î?•þ]²ºe§«¿¢í^ ¨Ié$ªÈ‡§%ÛlØ«ò³þ}ëù¡æÿùÄßùÈß=Î þsÞzf­«Jß—ºŒ¥„VtY 6Ř…·Õ­¸É­D¼V‚I6*Ê?çÓ¶·?óÿó›ÖWIéÝYëvð\ÇPÜdVÕÕ…A ÐŽÙ±V-ÿ?/ÿÖúÿœ7ÿÁ_ÿ™sb¯ßìØªAæ¯1é^NòϘüÝ®\ ]ʺ]汬]1Gkc ÜLä’ˆNç6*üÿŸ(ù{RÕ|Ëÿ9ùwnÖö7+¤é6Ò.ÐÉss5ÝíÊ%A5…V.§`ã¯mŠ¿ Ó?@_óì¯ýg+ïü u?ú‡³Ïàéÿ9á0ÿu7Ò½“ÿ?Ö?pv}ÏzgfÅ]›vlUÙ±WfÅ]›vlUÙ±WfÅ]›vlUÙ±Wa~©«izŒÚžµ©Zém·¬j7³%¼ó`«ÎY ¨«O\ÏìÎÊÖv¦¢:mçÍ;á†8Ë$å@“Ã#@hrµåÍ Q2œ„@êM™vr?>þ|~\ySÉ^jó&ŸçŸ.뎋¥]]iºU®©i<×71ÆÆV8åf%äâ»ùëÂÿÀ;ÚŽßííggìÝ^ Yóã†L“Á–ÇŽR$Ì¥Á)nzS¨×öö“O§É’9a#’$šØlz—g›?ç <ü¿}ùK>ƒç¿:iš^»åbî(_W¾†Úk‹KÖúâHwBÿ½–UÚ´{gÑòÙðí-/¶‘×vgæÍ¦Õéñ’0bžHcË„x…cŒ¸w 2Þ¸Œ¥æó^Åvî)èN<ù"% ¨€H—ª÷ç¹ø;=¿¡ù·Ê¾f7Ë~fÒ¼Âlø›±¦^Ávb^<ýn<¨i^¹ñgm{+Û‰À{GGŸMÇ|>6)â⪾1â«WV÷5˜sß…8ιð~çdƒ4C³b®ÍŠ»6*ìØ«°‹\ó?–¼±y“Ì:g—áºb–²êWpÚ,Œ¢¥PÌè€z Ýö/³]«Ûr”;;K›S(d0ãžSy bTKhϪŀ’q÷>÷gŽ¿ç0ÿ<<¥§~GùƒGòœ4k\óŒÐèi—ou$VÓ%ÔŽ°» m'»ŒúóþYþµ¬ÿ‚—WÚÚ ø4ÚËPNl91FY!QÃ™Æ Ìeœr€:c“ÆûcÛ˜!ÙÓ†‘”²T}$Gyré@‹³¬þN~}yÍŸ•ÞF×¼Ãç½Móæ“ kÖwú¬öÜ.ã–EqÎHÙ…GB:õÏ+ÿ‚÷üý¡ìk»KCÙý™ªË¥ÇžG ±àËÒ‰"fZŽâ»g‡ö·bëû#9Óë°dÓå °–9Ñäxf¨ô5EßaÏ4x±ÈHw‚ù‡a¦k]›vlUÙ±WfÅ]›vlUÙ±WfÅ]›vlUÙ±WfÅ]ž ÿŸ‘ë2jŸøéòqó×?à%ÿ9?ásûƒÎ{Uþ$¬ŸžLû-ó'fÅ]›vlUÙ±Wgÿ×üÿâ¯ßÌØ«³b®ÍŠ»6*ìØ«âùùþ±7çØÿµVŸÿuk,Ø«á¿ù÷Wüæ§üãä÷üâ¿“/¿2¿6,¼©ç RÖdÔ´[›JF.õ î!a$6’DᣑOÂÆ #6*õ?ÎùûwäΟfÞ\ÿœqÐõ¿Ï?̽f¶¾X¶ƒK½³ÓVé eKˆâ½œ©¡CÇB=DØæÅR?ù÷×üá¿æ†‘ùæ_ùËïùÊæOÎ9=äþ[òÕò »°:•EÖ¡v‰QÏaiéDYYC©±T·þgÿ’ ò£ÿ6ÿÝ*û6*Îÿ(?ççßó‡>Qü¥ü®ò¦»ù©Ûk~Xòމ¤ëÉ j’¬wVVÁ: Ü«t"ªH=³b¯£?(ÿçá󋞘^_ü®ü¹ó®¡«ùËÌÿ[ý §Ï¢ê6‘Éõ+I¯g¬ÓÀ‘¯`vÜïJ ÈÍŠ¾Ó’8æâ•X¥R’ÄÀ2²°¡ æÅ_Ç¿ç ówüã7œç-ç|»cs6‘ùæ ÛL¶‹JÚm•ãjš:¢­K=Äp«סéLØ«ú¤ÿœvü¦³üüü±ü§³à[Éš½¦§4t)6£%n5 –€m-Ô²¸ùæÅ_Ïäõ‘ôÑÿ™F§ý"j±Vÿ8Íÿ?(ÿœGüµÿœ{üšü¿ówŸ5+3ù;Ê:^“¯YG¡js¤WV¶ë¨²ÅnÈà0꤃›}Oùqÿ?ÿœNü×óÇ–¿.¼“ç­GQó_›¯ÃC±—DÔ­ÒYÙKie·TM”îÄ Ø«ó‹þKw‡æ?üâÝýÓzvÖPësÜ8ˆHï4ÖbÜÐ Ø«îú*ÿüá/þ\}Wÿ Ý_þɳb¯Jüµÿœ³ÿœ\ÿœË—ο’~Hóß›ÛVò¦¡/š´[½*úÂ94yš->ê’ÝCMâ(×zއ6*ü‰ü»ógæ¯üú[ó×ÍQüÄòÞ­ç?ùÆïÌ[ÀÚ_˜lU¸XIú¾¡hX¬Bò(IŽâÙÚ2â^+Š¿R$ÿŸ¢ÎGåïÓëù¾óIés]4Mcô‰’ŸÜúMf5v©pŸåS|Ø«óÌù¡ÿ?mÿœ„ò¼ºO–5!ÿÎ-~XÜI ÚÝè„:=Û™±>¡x±¤kFAј° ϱWîWçn“¦ùþq³ósBѬâÓ´}òÓ_°Ò´øG ¶¶Ñ犑{*"€†lUù¥ÿ>MÛò óXx~`?ýÒ¬sb¯ÙÞ»æÅ_'Îuj_¢çÿç!î¶>§’õ 3ɸ½ª-k_Þì;ôÍŠ¼ þ})cõOùÂï'\z¾§éO0y‚ç‡pã|ðq­M¹å]ºÓß6*ü¹ÿŸ”ùkÍßóÿó•ž{óåä-i¥ÿÎVyôÍFt%fké µÕíFæI¤´Šf¥w›èÍŠ¿¿ç¿(-¿!!+¿)áŽ4»òž‡z쑤º­Ï+­JU55Wº–V]öRlUùù[Ë¿óøÿÏm1’Þ3®Ùë€"ü56–:)JUÈZ¶Çö¾lU,ÿŸæïÿB¹ÛþSoû°fÅ_pÑWÿç òãê¿øNêÿöM›{äwüç7üã‡üäWœåòåO›¯µÏ3Á¦Ï«Ieq¤ßÙ'Õmž8äVæÒ¡¥]«S›~o~kÿòhÿ'Oýªl¿î‡¨æÅ_»™±Wóÿ?ü…׿çÿ4<íçÏË»Cä¿üäö›y¤ëúLA’ÚËT’hµ ìÏ„æÝ/-ÆÂ‚H”C]Š¿fçÛßúÄ¿ŸöÊÔ?î­{›wüü‡ÿX—óïþÙZýÕ¬³b¯?ÿŸPmÿ8Kùp:ÿ¹_1Ý^ç6*ýÍŠ´M3b¯À/ùÀm¿çé¿óš~ÿò±ÿñ7Óób¯ßá›Xè’+$ˆt` ŠAêlUüÜ~[ù¿]ÿŸUÿÎ[~bySó ˺ïä漄èþ`²…Ÿ…¼ÒK¦Þ[ÔªM-šÜ¼0‚s,+ðØ«ôËÎóõùÃ?,yZã_Ñ¿1î<÷ªý\É¥ùOGÒu(¯.d ¤l÷¶ÖðÁ¹2ºÐVŽÙ±WÉŸóî/Êß̯ΟùÈ/ÌÏùÏ?Í}]ÏÍÆú/Ë>d‘EÃßñ…§µigµ³³ŒZÆä~𱡬m›zgüþ«ùÅŸ ŠÿåUҿfÅ_£ÿó{þA~Gÿæ¿òÏýÒ­³b¯Ïÿùú7üâö¥ù‹ä]+þr'òÊ)lÿ7¿"Ñun,Awº-¤¿Zc_÷u„€ÜDzñõWv(Å_3ÿÏ›üÑyçoͯùËo:jÇo¨y¾M+[¾·†¾œsjú¥ÌŠ•Þ¤ {fÅR/ùú~¿¤ùWþskþqSÍýßÔ4/-éú«­_py}K?2O<òzq+»qD&ФžÀœØ«ô—RÿŸ™ÿÎi¶Mzÿž6·€‚ÖÏGÖ§™É"ØT|ڃČثó§þr þrßóƒþ~ Ïüã¿üá÷å˜òûXº†ÌÌ=V!j³@Ž®"¸™Hl­j¢Få!š`,kVŽMŠ¿]?ç?ç|½ÿ8·ù/åÏʽèj·öï&¥æÿ1ÄgRÕî‚ýbà'좄X¢¤Fˆ–©;}%Ÿ /ùöWþ³•÷þ:ŸýCÙçÇ¿ðtÿœ‚?𘺛é^Éÿ‰Ÿë¸;>‡g=3³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«°=妡isak õäOåÂ,±K€«££XEdi5y´y¡Ÿå&9 Fq&2„¢n2Œ…ÈÁÁäÆpŒâc!`ó‘÷»>+ÿÎlþD~^þPëZÖ|‘s&˜|é-ãÍäßï!¶[oL¼Öî[”q³J¯ñ²òÆ?ðqö›þzf¶ 3~B8ÀÕ}3ÈrqpãË8g1rFW‰)qŸöÛ°t½›’ÀkÄ¿GAU¸îòùm³³Îßÿ—zæ—æ¿•|…æMfãËún¹,«-Õ¼jÓ;C Î C!â(BŠÄ5  tÏ ¿àåÿÐöØÝonönžœÚxĈȑ'8ãñ$#êœqñ ÊP¸ƒë[Îvgcí n=>Y‰^ãžÂëÊëžþçgèÈŸ—ÞOü´òý·–<“¡ÛèZE¶æ(EdšN†Yåj¼®{³’{t?½¸ö÷¶ýµí)öŸmjg¨Ï>²>˜G¤1ÀT1Àt„Ï2Iú AÙø48†,ˆû|ÉæO™vL³s]›vx¿[üùúüæO–ÿ+Håãå¹4‹ërikwüu\ø±Šb_!ö/cÀ3ó_ð ÕûOá…~r9á/â:,¥˜Ñ2fË.øâ‰è/?opvô4·èàá?×—¨}€‹³Úæ3ã§´vl ìŒyÃɾWóöƒ{å8h¶Úö‡~?Ò,nV 0¯#aFG^ªêCÇ:_d½°ídûGiöF¢zmN?¦p5·XÈoÂ_Å ƒ ¤ ‹¬ÑáÖc8³DJ'¡ül|óà7üä—åw—?(¿6µŸ"ùSW¹ÖtûH-n}+¥Sqi%ÜbeµwJ ÆÈÁ¸­C ª*x?å?à›ÚŸðBö3OÛ«‚2ÎY!p'ÃËRà9£}Î3‰€0$J |ÚNËÅÙºÙ`Å# ;ó¿žÕóvtßùÃOÉ"~sùÏ^ÏÓMoå;kkø<© 1 E$‘£‘¥™X:Ç ©BÜÇÄ)CæßòØ?ðhö‹þÝ…¥—bbŒg­œñL½_—1ˆ”D1a,™Œ§qˆÇ/D‰;?c;MÚš‰øäÔ<<¸½ç ®»ù»>âizV™¡éÖzF§ÛéZ^ŸÃc§ZF°Á kÑ4(Ùø¥Ú}©«í=VM^³,ófË#)䜌ç9r”¤I'̾㋠1@BF#ðvÌÇfÅ]›vlUÙ±WfÅ]›vlUÙ±WfÅ]›vlUÙ±Wg‚¿çä_úÌš§þ:Güœ|õÏø ÎGø\þàóžÕ‰ëgç“>Ë|ÉÙ±WfÅ]›vlUÙÿÐüÿâ¯ßÌØ«³b®ÍŠ»6*ìØªIæ?,ùsÎ:.¡å¯7hoš|¹« ‹TÐ5{Ho¬®QX8I­îãPhÊwæÅ^ sÿ8iÿ8›ur÷RÿÎ8~\¤ŽT²CåÝ>þ¤QB¨:oE߯\Ø«Ö<ùSù_ùt/¿-ü­äEuòöe¥†’Aú¤1V¤“›g´ÍаÏ;~[þ^~eéöšOæ?ü»çý.Âãëv:o™4»MVÞŽ,ž¬q^E*+ñf^@V„ŒØ«ÌÿèS¿ç?ö*¿ðÐÿì6*È<­ÿ8õùämvÇÍ>Jüü¿ò™´¿Wôg˜´O-iZ}ý·¯Á/£smm©Î9‹ «;›zý3b¯4Ö¿%¿'<ÉæËO?y‹òŸÉºÿž¬&¶¸²ó¦£ é÷Z´2ÙkY#¾šZªc!ê”iLØ«Ó3b¬OÎ^Bò7æ6¾_üÁòf…ç½.í4O0éÖÚ¥˜¸ˆ2¤¢ ¸åš‡`•šuÍŠ¼¯þ…;þqgÿa§ò«ÿÝþÈób©Æÿ8ßÿ8ñåMgOó•¿!.¼µæ"Q>“®é^VÒlï-e$7[$‘µ ÝXØ«$óÏåå?ætºtÿ™_–RüŸGI#Òfó6‰a«=ªLTʰ5ä2˜Ã”^AiZ ôÍŠ°OúïùÅŸý†ŸÊ¯ü#t?û#ÍŠ²ÿ%~H~KþZê·ïåÏå’¼­ÝÚ=…Ö±å½NÒ®¤´‘ã•íÞ{8"vž$b¤Ð•SJ›fÚÿ—<¿æÍ&ïAóN‡§ù—CÔ%þ‹ªÚÅyi:ƒZKêè⣡±WÎQÿÎÎ"E«iç|Šo ‡ô_Hí*)·ÔÙM½6ééÓ6*ú_KÒt½O³Òt]:×HÒ´è– 2Ê··‚%û)Q…DQØLتýGN°Õì/´­VÊßSÒõ;ym5-6î$š ‹y¤°Ë•ÑÔ•e`AØ«òOå¿åç妟w¤þ\yËŸ—ú]ýÇÖï´ß-éVšU¼×?ZH¬â‰Yø¨^DV€Ù±Vi›H¼Éå-ùËE¿ò×›ü¿¦ù«Ëšª,z§—õ‹Ho¬nQdUšÚá7ÕXSBë›Sò·”¼«ä}ÃÊÞJòÖ•äÿ,é~¯èÏ.è–Piöþ¼¯<¾µ²Gs–Fvâ¢¬ÅŽäœØª†¿äŸ&ù®óEÔ|Ñå-Ìz‡–æ7>]¾Õ,-ï&°™š7i-dž7hX´HIB UOa›dôÍŠ° ÊoÊËO;Où—kùkå[oÌ{ž_XüÀ‹F±MnNp‹v稬"àòˆzf¯ºü=6ÍŠ»Ï?”ß•Ÿš¢ÿåeþZùWóô¯úüM£XêÿSúϧëý_ëËéz¾’sãN\V½lUçÿô)ßó‹?û ?•_øFèöG›ežMü‹ü’üºÕÛÌ—¿“¾Gò&¼öïhúß—|½¦éwfÞB¬ð™í-ârŒQIZÐ<3b©Åßågå•ÿ,ÿ2/¿.¼±{ù‰§"ÇaçÙô‹)5¨Q¢U‹PhÂŽÊ~„އ6*Ï3b¬[ÎFòWæŽÞ]ó÷“ôOÛÓfšYîP’.$yd4 sN>óì×ü;gÙ?c¥ìß`ÿ‚KQ–yuZ˜ŸßäâÇŠ[xŽ8 ”IÈfeÃ,`ËŸÕ{?‡Y­­G¬DÿêL¿œlû«ôØŸæ§üãÇ”0õÏ:ZÇåOÌÏ*]Úßè>mµi$²‘dŠØT¨š?€-I£en5S?øÿË@vײObjIÖv>³Ly´Ó—ÓÑ1œôó"GOQ•QÇ9o(ñTâ;WÙÜÌ‘ÏFhc!ýÀþ!öއ£³ÐyàoBìØ«³Æ?ó’¿~aó&­y÷òãó/]ò6¿§[M}«éW½‡I¼HÈ쪒ÒÚN*MTp'í(%Ÿ>Äÿ–qÿƒ·fv.«OØ^Ñv>›´4¹gx²þ[ õxe9pÄ(^£å3âÄ}Æñ~Òö\ð–£MšXæ$qH@×ÇÒ}Û}îψòkºÜú¸óÚÅôºð.—[{‰ZðO%–/ÍH5j)Ÿ´Xû³ñh¿! >(éxL<Œ<±(xuÁÁ+76l>"sä9Îv6—E >IáϨ:lÔNxäa8ᨃYñf(ÇÂÜKÙ}–ì,Þ5Zœó™Œx¥ÂÜqoê>\‡[v{Ó>{×fÅ]ž}òüã×”ü±çŸ3~jùƒ‡›?1üÍ©\ßnæ?Üé±LÇÒ¶°‰‹pô¢ ªÄ¹b •Ï{öçþݳ۞Ïhý—Ð^‹²4˜a‹ÂõêeëË©˜‹ÄÉÅ“Âb‰±9DMçôÏ`Á©ž¯'¯4äMžQ¾B#Èm|ýÃgcì¿çü¥å¿ÍÛÍï#*ùWR¹ŠêÓÎ:²c©At„™5 †Q2Ç!*8·בç‘ÖÁ÷¶»kج¾ÉvÙ:Ì0–9ésLÞ}4ñKé37ââ8¥“©ãã30ˆÆ°ö{ pÖ`ôH‚'ôÈ.†è÷å{»;þx3Ð;6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìðWüü‹ÿY“TÿÀ‡Hÿ“ž¹ÿ/ùÈáÿ ŸÜsÚ¯ñ#ý`ìüògÙo™;6*ìØ«³b®ÍŠ»?ÿÑüÿâ¯ßÌØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³ôÿ>ÊÿÖr¾ÿÀÇSÿ¨{<ø÷þŸóGþ÷S}+Ù?ñ3ýc÷gÐìñ§¦vlUÙ±WfÅ]›vlUÙ±WfÅ]›vlUÙ±WfÅ]›vlUÙ±WfÃjìØÙ±Wg%üðò·šüõùiæ$y:{{WÍé•uªÝ¹Xm,'qõÙYT~PUw,â´Zœõoø {OØþË{W¤í®×Œò`ÑfŽ8 ž\ð‰ü¼"O¦˜Ã$§-„1Ê®\1:ŽÜÒæÕé'ƒ Y=$žB'ê>~›çÜìá–?ó‚ÿ’vÿ—’y.êÊæ÷^ž“Mù‚[†¤.Â!¼iäG£B¤S‘góÛu¿òÛžßföœvÎ,ǦÄhªôÇ ðÌí9åÛûûø1“‰ÑCØ^ÏŽ—À ™ãþ+òèô~{îììóÞEóWååå·åçšnàÕ?Âw×VÞ_×-Ú‚óL–O¬@ï<¢t2´eN"ŒFùäŸðzöß±ý¸öš~Ðvd%‡ó˜ñÏ>ðêc $c!éɈG(˜¢xÏbAˆÜ{? Í Ò>R%ÀHŒ‡ñG˜÷u^]]·<]Þ;6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìðWüü‹ÿY“TÿÀ‡Hÿ“ž¹ÿ/ùÈáÿ ŸÜsÚ¯ñ#ý`ìüògÙo™;6*ìØ«³b®ÍŠ»?ÿÒüÿâ¯ßÌØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³ôÿ>ÊÿÖr¾ÿÀÇSÿ¨{<ø÷þŸóGþ÷S}+Ù?ñ3ýc÷gÐìñ§¦vlUÙ±WfÅ]›vlUÙ±WfÅ]›vlUÙ±WfÅ]›vlUÙ±WfÅ]›vlUÙ±WfÅ]› Ó³`WfÅ]›vlUÙ±WfÅ]›vlUÙ±WfÅ]›vlUÙ±WfÅ]›vlUÙ±WfÅ]ž ÿŸ‘ë2jŸøéòqó×?à%ÿ9?ásûƒÎ{Uþ$¬ŸžLû-ó'fÅ]›vlUÙ±WgÿÓüÿâ¯ßÌØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³ôÿ>ÊÿÖr¾ÿÀÇSÿ¨{<ø÷þŸóGþ÷S}+Ù?ñ3ýc÷gÐìñ§¦vlUÙ±WfÅ]›vlUÙ±WfÅ]›vlUÙ±WfÅ]›vlUÙ±WfÅ]›vlUÙ±WfÅ]›vlUÙ±WfÅ]›vlUÙ±WfÅ]›vlUÙ±WfÅ]›vlUÙ±WfÅ]›vlUÙ±Wg‚¿çä_úÌš§þ:Güœ|õÏø ÎGø\þàóžÕ‰ëgç“>Ë|ÉÙ±WfÅ]›vlUÙÿÔüÿâ¯ßÌØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³ôÿ>ÊÿÖr¾ÿÀÇSÿ¨{<ø÷þŸóGþ÷S}'Ù?ñ3ýc÷gÐìñ§§vlUÙ±WfÅ]›vlUÙ±WfÅ]›vlUÙ±WfÅ]›vlUÙ±WfÅ]›vlUÙ±WfÅ]›vlUÙ±WfÅ]›vlUÙ±WfÅ]›vlUÙ±WfÅ]›vlUÙ±WfÅ]›vlUÙ±Wg‚¿çä?ú̺§þ:Güœ|õÏø ÎGø\þàóžÕ‰ëgç“>Ë|ÉÙ±WfÅ]›vlUÙÿÕüÿâ¯ßÌØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«²C¥ù·ÍZ%±³Ñ¼Ëªé6ĕÖÊö{x˵nºŠNaçìí6¢\YqBg¾QüÈl†l<‹°ÃþV'æýO^aÿ¸ßýTÊ?‘t?êÿÒGõ3üÖ_çËæ]›þV'æýO^aÿ¸ßýTÃü‹¡ÿPÇþ’?©5—ùòù—fÿ•‰ùÿSטî'wÿU1þEÐÿ¨cÿIÔ¿šËüù|˳ÊÄüÀÿ©ëÌ?÷»ÿª˜ÿ"èÔ1ÿ¤ê_Íeþ|¾eÙ¿åb~`Ôõæû‰ÝÿÕL‘t?êÿÒGõ/æ²ÿ>_2ìßò±?0?êzóýÄîÿê¦?Ⱥõ é#ú—óYŸ/™voùXŸ˜õ=y‡þâwõSä]ú†?ô‘ýKù¬¿Ï—Ì»7ü¬OÌúž¼Ãÿq;¿ú©ò.‡ýCúHþ¥üÖ_çËæ]›þV'æýO^aÿ¸ßýTÇùCþ¡ý$Rþk/óåó.Íÿ+óþ§¯0ÿÜNïþªcü‹¡ÿPÇþ’?©5—ùòù—fÿ•‰ùÿSטî'wÿU1þEÐÿ¨cÿIÔ¿šËüù|˳ÊÄüÀÿ©ëÌ?÷»ÿª˜ÿ"èÔ1ÿ¤ê_Íeþ|¾eÙ¿åb~`Ôõæû‰ÝÿÕL‘t?êÿÒGõ/æ²ÿ>_2ìßò±?0?êzóýÄîÿê¦?Ⱥõ é#ú—óYŸ/™voùXŸ˜õ=y‡þâwõSä]ú†?ô‘ýKù¬¿Ï—Ì»7ü¬OÌúž¼Ãÿq;¿ú©ò.‡ýCúHþ¥üÖ_çËæ]›þV'æýO^aÿ¸ßýTÇùCþ¡ý$Rþk/óåó.Íÿ+óþ§¯0ÿÜNïþªcü‹¡ÿPÇþ’?©5—ùòù—fÿ•‰ùÿSטî'wÿU1þEÐÿ¨cÿIÔ¿šËüù|˳ÊÄüÀÿ©ëÌ?÷»ÿª˜ÿ"èÔ1ÿ¤ê_Íeþ|¾eÙ¿åb~`Ôõæû‰ÝÿÕL‘t?êÿÒGõ/æ²ÿ>_2ìßò±?0?êzóýÄîÿê¦?Ⱥõ é#ú—óYŸ/™voùXŸ˜õ=y‡þâwõSä]ú†?ô‘ýKù¬¿Ï—Ì»7ü¬OÌúž¼Ãÿq;¿ú©ò.‡ýCúHþ¥üÖ_çËæ]›þV'æýO^aÿ¸ßýTÇùCþ¡ý$Rþk/óåó.Íÿ+óþ§¯0ÿÜNïþªcü‹¡ÿPÇþ’?©5—ùòù—fÿ•‰ùÿSטî'wÿU1þEÐÿ¨cÿIÔ¿šËüù|˳ÊÄüÀÿ©ëÌ?÷»ÿª˜ÿ"èÔ1ÿ¤ê_Íeþ|¾eÙ¿åb~`Ôõæû‰ÝÿÕL‘t?êÿÒGõ/æ²ÿ>_2ìßò±?0?êzóýÄîÿê¦?Ⱥõ é#ú—óYŸ/™voùXŸ˜õ=y‡þâwõSä]ú†?ô‘ýKù¬¿Ï—Ì»7ü¬OÌúž¼Ãÿq;¿ú©ò.‡ýCúHþ¥üÖ_çËæ]›þV'æýO^aÿ¸ßýTÇùCþ¡ý$Rþk/óåó.Íÿ+óþ§¯0ÿÜNïþªcü‹¡ÿPÇþ’?©5—ùòù—fÿ•‰ùÿSטî'wÿU1þEÐÿ¨cÿIÔ¿šËüù|˳ÊÄüÀÿ©ëÌ?÷»ÿª˜ÿ"èÔ1ÿ¤ê_Íeþ|¾eÙ¿åb~`Ôõæû‰ÝÿÕL‘t?êÿÒGõ/æ²ÿ>_2ìßò±?0?êzóýÄîÿê¦?Ⱥõ é#ú—óYŸ/™voùXŸ˜õ=y‡þâwõSä]ú†?ô‘ýKù¬¿Ï—Ì»j^oóf³jlu3êÚ­“0v´¼½žx‹/Ù%$v¶Ëpvn—¸ñâ„eÞ"ù€ÆyòLT¤H÷—dw3Z›vlUÙ±WfÅ]ŸÿÖüÿâ¯ßÌØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»?ÿ×üÿâ¯ßÌØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»?ÿÐüÿâ¯ßÌØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»6*ìØ«³b®ÍŠ»?ÿÙdibbler-1.0.1/doc/dibbler-devel-07-debug.dox0000664000175000017500000000126612233256142015335 00000000000000/** @page debug 7. Dibbler debugging This section specifies, which tools can be used to debug Dibbler and generally aid in the software process development. @section debugMemoryLeaks 7.1 Detecting Memory Leaks using Valgrind Execute dibbler with the following command: @verbatim valgrind --tool=memcheck --show-reachable=yes --leak-check=full ./dibbler-client run @endverbatim @section debugCppcheck 7.2 Static code analysis using cppcheck Code is automatically checked using cppcheck tool, with all possible checks enabled (--enable=all). The goal is to have Dibbler code cppcheck clean. Sadly, we are currently far away from that goal. */dibbler-1.0.1/doc/dibbler-user-intro.tex0000664000175000017500000003464412561661420015054 00000000000000%% %% Dibbler - a portable DHCPv6 %% %% authors: Tomasz Mrugalski %% %% released under GNU GPL v2 licence %% %% \section{Intro} First of all, as an author I would like to thank you for your interest in this DHCPv6 implementation. If this documentation doesn't answer your questions or you have any suggestions, feel free to contact me as explained in \hyperlink{contact}{Contact} section. Also be sure to check out Dibbler website: \url{http://klub.com.pl/dhcpv6/}. \begin{flushright} \emph{Tomek Mrugalski} \end{flushright} \subsection{Overview} \emph{Dynamic Host Configuration Protocol for IPv6}, often abbreviated as DHCPv6, is a protocol, which is used to automatically configure IPv6 capable computers and other equipment located in a local network. This protocol defines \emph{clients} (i.e. nodes, which want to be configured), \emph{servers} (i.e. nodes, which provide configuration to clients) and \emph{relays} (i.e. nodes, which are connected to more than one network and are able to forward traffic between local clients and remote servers). Also, special type of DHCPv6 entity called \emph{requestor} has been defined. It is used by network administrator to query servers about their status and assigned parameters. Dibbler is a portable DHCPv6 solution, which features server, client and relay. Currently there are ports available for many Windows platforms ranging from NT4 to Windows 8, Linux 2.4 or later systems and Mac OS (experimental). See Section \ref{requirements} for details. It supports both stateful (i.e. IPv6 address granting) and stateless (i.e. options granting) autoconfiguration. Besides basic functionality (specified in basic DHCPv6 spec, RFC3315 \cite{rfc3315}), it also offers serveral enhancements, e.g. DNS servers and domain names configuration. Dibbler is an open source software, distributed under \href{http://www.gnu.org/copyleft/gpl.html}{GNU GPL} v2 licence. It means that it is freely available, free of charge and can be used by anyone (including commercial users). Source code is also provided, so anyone skilled enough can fix bugs, add new features and distribute his/her own version. \emph{Requestor} support has been added in version 0.7.0RC1. Requestor is a separate entity, which sends queries to the server regarding leases to specific clients. It is possible to ask a server, who has specific address or what addresses are assigned to a specific client. This feature is part of the lease query mechanism defined in \cite{rfc5007} and is considered advanced topic. If you don't know what lease query is, you definetely don't need it. \begin{figure}[ht] \begin{center} \includegraphics[width=0.7\textwidth]{dibbler-srv-cli} \caption{\emph{General DHCPv6 operation}} \end{center} \end{figure} Dibbler 1.0.0RC1 supports all features specified in RFC3315. In particular the following features are supported: \begin{itemize} \item Basic server discovery and address assignment (\msg{SOLICIT}, \msg{ADVERTISE}, \msg{REQUEST} and \msg{REPLY} messages) -- This is a most common case: client discovers servers available in the local network, then asks for an address (and possibly additional options like DNS configuration), which is granted by a~server. \begin{figure}[ht] \begin{center} \includegraphics[width=0.6\textwidth]{dibbler-multiple-cli} \caption{\emph{Several clients supported by one server}} \end{center} \end{figure} \item Server redundancy/Best server discovery -- when client detects more than one server available (by receiving more than one \msg{ADVERTISE} message), it chooses the best one and remembers remaining ones as a backup. \begin{figure}[ht] \begin{center} \includegraphics[width=0.6\textwidth]{dibbler-multiple-srv} \caption{\emph{Redundancy: several servers}} \end{center} \end{figure} \item Multiple servers support -- Client is capable of discovering and maintaning communication with several servers. For example, client would like to have 5 addresses configured. Prefered server can only lease 3, so client send request for remaining 2 addresses to one of the remaining servers. \item Relay support -- In a larger network, which contains several Ethernet segments and/or wireless areas, sometimes centrally located DHCPv6 server might not be directly reachable. In such cace, additional proxies, so called relays, might be deployed to relay communication between clients and a remote server. Dibbler server supports indirect communication with clients via relays. Stand-alone, lightweight relay implementation is also available. Clients are capable of talking to the server directly or via relays. \item Address renewal -- After receiving address from a server, client might be instructed to renew its address at regular intervals. Client periodically sends \msg{RENEW} messege to a server, which granted its address. In case of communication failure, client is also able to attempt emergency address renewal (i.e. it sends \msg{REBIND} message to any server). \item Unicast communication -- if specific conditions are met, client could send messages directly to a server's unicast address, so additional servers does not need to process those messages. It also improves effciency, as all nodes present in LAN segment receive multicast packets.\footnote{Nodes, which do not belong to specific multicast group, drop those packets silently. However, determining if host belongs or not to a group must be performed on each node. Also using multicast communication increases the network load.} \item Duplicate address detection -- Client is able to detect and properly handle faulty situation, when server grants an address which is illegaly used by some other host. It will inform server of such circumstances (using \msg{DECLINE} message), and request another address. Server will mark this address as used by unknown host, and will assign another address to a client. \item Power failure/crash support -- After client recovers from a crash or a power failure, it still can have valid addresses assigned. In such circumstances, client uses \msg{CONFIRM} message, to config if those addresses are still valid. \item Link change detection -- Client can be instructed to monitor its link state. Once it detects \item Normal and temporary addresses -- Depending on its purpose, client can be configured to ask for normal (\opt{IA\_NA} option) or temporary (\opt{IA\_TA} option). Although use of temporary addresses is rather uncommon, both dibbler server and client support it. \item Hint system -- Client can be configured to send various parameters and addresses in the \msg{REQUEST} message. It will be treated as a hint by the server. If such hint is valid, it will be granted for this client. \item Server caching -- Server can cache granted addresses, so the same client will receive the same address each time it asks. Size of this cache can be configured. \item Stateless mode -- Client can be configured to not ask for any addresses, but the configuration options only. In such case, when no addresses are granted, such configuration is called stateless (\msg{INFORMATION-REQUEST} message is used instead of normal \msg{REQUEST}). \item Rapid Commit -- Sometimes it is desirable to quicken configuration process. If both client and server are configured to use rapid commit, address assignment procedure can be shortened to 2 messages, instead of usual 4. Major advantage is lesser network usage and quicker client startup time. \item M,O bits from Router Advertisement -- the client can be told to observe M(managed) and O(OtherConf) bits from RA and act according to them \item Reconfigure -- server can inform clients that the configuration has changed and clients can initiate Reconfigure \item Authentication: Reconfigure-key -- the server can generate HMAC-MD5 reconfigure keys on the fly to later authenticate reconfigure messages. Clients are able to receive, store and later validate against that received key. \item Authentication: Delayed authorization -- server and client can protect their communication against tampering by using preprovisioned keys. \end{itemize} \subsection{Supported parameters} Except RFC3315-specified behavior \cite{rfc3315}, Dibbler also supports several enhancements: \begin{itemize} \item DNS Servers -- During normal operation, almost all hosts require constant use of the DNS servers. It is necessary for event basic operations, like web surfing. DHCPv6 client can ask for information about DNS servers and DHCPv6 server will provide necessary information. \cite{rfc3646} \item Domain Name -- Client might be interested in obtaining information about its domain. Properly configured domain allow reference to a different hosts in the same domain using hostname only, not the full domain name, e.g. alice.example.com with properly configured domain can refer to another host in the same domain by using 'bob' only, instead of full name bob.example.com. \cite{rfc3646} \item NTP Servers -- To prevent clock misconfiguration and drift, NTP protocol \cite{rfc2030} can be used to synchronize clocks. However, to successful use it, location of near NTP servers must be known. Dibbler is able to configure this information. \cite{rfc4075} \item Time Zone -- To avoid time-related ambiguation, each host should have timezone set properly. Dibbler is able to pass this parameter to all clients, who request it. \cite{draft-timezone} \item SIP Servers -- Session Initiation Protocol (SIP) \cite{rfc3263} is commonly used in VoIP solutions. One of the necessary information is SIP server addresses. This information can be passed to the clients. \cite{rfc3319} \item SIP Domain Name -- SIP domain name is another important parameter of the VoIP capable nodes. This parameter can be passed to all clients, who ask for it. \cite{rfc3319} \item NIS, NIS+ Server -- Network Information Service is a protocol for sharing authentication parameters between multiple Unix or Linux nodes. Both NIS and NIS+ server addresses can be passed to the clients. \cite{rfc3898} \item NIS, NIS+ Domain Name -- NIS or NIS+ domain name is another necessary parameter for NIS or NIS+. It can be obtained from the DHCPv6 server to all clients, who require it. \cite{rfc3898} \item Option Renewal Mechanism (Lifetime option)-- All of the options mentioned on this list can be refreshed periodically. This might be handy if one of those parameters change. \cite{rfc4242} \item Dynamic DNS Updates -- Server can assign a fully qualified domain name for a client. To make such name useful, DNS servers must be informed that such name is bound to a specific IPv6 address. This procedure is called DNS Update. There are two kinds of the DNS Updates: forward and reverse. First is used to translate domain name to an address. The second one is used to obtain full domain name of a known address. See section \ref{feature-dns-update} for details. \cite{rfc4704} \item Prefix Delegation -- Server can be configured to manage a prefix pool, i.e. clients will be assigned whole pools instead on single addresses. This is very useful, when clients are not simple end users (e.g. desktop computers or laptops), but rather are routers (e.g. cable modems). This functionality is often used for remote configuration of IPv6 routers. \cite{rfc3633} \end{itemize} \subsection{Not supported features} Although list of the supported features increases with each release, there are certain limitations. Below is a list of such features: \begin{itemize} \item DNS Updates are done over IPv6 only. Adding IPv4 support is not planned. Do not bother to develop patches -- Dibbler is a IPv6-focused software and IPv4-related patches will be rejected. \item Conflict resolution in DNS Updates is not supported. \end{itemize} \subsection{Operating System Requirements} \label{requirements} Dibbler can be run on Linux systems with kernels from 2.4 or later series. IPv6 (compiled into kernel or as module) support is necessary to run dibbler. DHCPv6 uses UDP ports below 1024, so root privileges are required. They're also required to add, modify and delete various system parameters, e.g. IPv6 addresses. Dibbler also runs on any Windows systems from Windows XP (Service Pack 1 or later) to Windows 8. Support for Windows 8 has been added in 0.8.3. To install various Dibbler parts (server, client or relay) as services, administrator privileges might be required. Support for Windows NT4 and 2000 is limited and considered experimental. Due to lack of support and any kind of informations from Microsoft, this will not change. In fact, support for NT4 and 2000 is expected to be dropped soon. Please post to Dibbler mailing list if you need them. There is working Mac OS X port available. Support for FreeBSD, NetBSD and OpenBSD was added in 0.8.1RC1, but those versions are not very well tested. Support for Solaris 11 has been added in 0.8.3, but it is still highly experimental. Sources are confirmed to compile and be able to start operation. Author was not able to test them thoroughly, so reports regarding confirming their stability or any discovered issues are welcome. Please report them on the mailing list. See section \ref{mailing-list}. See RELEASE-NOTES for details about version-specific upgrades, fixes and features. \subsection{Supported platforms} Although Dibbler was developed on the i386 architecture, there are ports available for other architectures: IA64, AMD64, PowerPC, HPPA, Sparc, MIPS, S/390, Alpha and ARMv5. They are available in the PLD, Gentoo and Debian Linux distributions. Other platforms are likely to be supported. Keep in mind that author has not tested those ports himself and need to rely on users' reports, so there might be some unknown issues present. If this is the case, be sure to notify package maintainers and possibly the author. If your system is not on the list, don't despair. Dibbler is fully portable. Core logic is system independent and coded in C++ language. There are also several low-level functions, which are system specific. They're used for adding addresses, retrieving information about interfaces, setting DNS servers and so on. Porting Dibbler to other systems (and even other architectures) would require implementic only those serveral system-specific functions. See Developer's Guide for details. dibbler-1.0.1/doc/dibbler-user-usage.tex0000644000175000017500000003622112277722750015024 00000000000000%% %% Dibbler - a portable DHCPv6 %% %% authors: Tomasz Mrugalski %% %% released under GNU GPL v2 licence \newpage \section{Installation and usage} \label{install} Client, server and relay are installed in the same way. Installation method is different in Windows and Linux systems, so each system installation is described separately. To simplify installation, it assumes that binary versions are used\footnote{Compilation is not required, usually binary version can be used. Compilation should be performed by advanced users only, see Section \ref{compile} for details.}. \subsection{Linux installation} Starting with 0.4.0, Dibbler consists of 3 different elements: client, server and relay. During writing this documentation, Dibbler is already part of many Linux distributions. In particular: \begin{description} \item[\href{http://debian.org}{Debian GNU/Linux}, \href{http://ubuntu.com}{Ubuntu}] and derived -- use standard tools (apt-get, aptitude and similar) to install dibbler-client, dibbler-server, dibbler-relay or dibbler-doc packages. \item[\href{http://opensuse.org}{OpenSUSE}] -- use standard installation mechanism. \item[\href{http://www.pld-linux.org}{PLD GNU/Linux}] -- use standard PLD's poldek tool to install dibbler package. \item[\href{http://www.gentoo.org}{Gentoo Linux}] -- use emerge to install dibbler (e.g. emerge dibbler). \item[\href{http://openwrt.org}{OpenWRT}] -- there are package definitions for OpenWRT. At time of this writing, they were very outdated (using 0.5.0 version). \end{description} If you are using other Linux distribution, check out if it already provides Dibbler packages. You may use them or compile the sources on your own. See Section \ref{compile} for details regarding compilation process. Dibbler used to provide native DEB and RPM packages, but due to limited resources, author is not continuing this activity. If you are a Dibbler package maintainer and want your package to be put on dibbler website, please send such request on mailing list (see Section \ref{mailing-list}). To install Dibbler on Debian or other system that provides apt-get package management system, run \verb+apt-get install package+ command. For example, to install server and client, issue the following command: \begin{lstlisting} apt-get install dibbler-server dibbler-client \end{lstlisting} To install Dibbler in Gentoo systems, just type: \begin{lstlisting} emerge dibbler \end{lstlisting} \subsection{Windows installation} Dibbler supports Windows XP and 2003 since the 0.2.1-RC1 release. Support for Vista was added somewhere around 0.7.x. Support for Windows 7 was added in 0.8.0RC1. In version 0.4.1 exprimental support for Windows NT4 and 2000 was added. The easiest way of Windows installation is to download clickable Windows installer. It can be downloaded from \url{http://klub.com.pl/dhcpv6/}. After downloading, click on it and follow on screen instructions. Dibbler will be installed and all required links will be placed in the Start menu. Note that there are two Windows versions (ports): one for modern systems (XP/2003/Vista and Win7) and one for archaic ones (NT4/2000). Make sure to use proper port. If you haven't set up IPv6 support, see following sections for details. Operation on Windows 8 was never tested, so support is not confirmed. \subsection{Mac OS X installation} As of 0.8.0 release, ready to use dmg packages are not provided, therefore dibbler has to be compiled. Please follow section \ref{compile} for generic Dibbler compilation that applies to Mac OS X. Currently support for Mac OS X is usable, but there is still one notable limitation. Client is not able to configure DNS servers or domain name informations. \subsection{FreeBSD, NetBSD, OpenBSD, Solaris 11} As of 0.8.1RC1 release, support for FreeBSD, NetBSD and OpenBSD has been added. Solaris 11 support is implemented after 0.8.2 and will be included in 0.8.3. There are no prebuilt binary packages available. Please follow Section \ref{compile} for generic Dibbler compilation that applies to all 3 mentioned OSes. \subsection{Basic usage} Depending what functionality do you want to use (server,client or relay), you should edit configuration file (\verb+client.conf+ for client, \verb+server.conf+ for server and \verb+relay.conf+ for relay). All configuration files should be placed in the \verb+/etc/dibbler+ directory. Also make sure that \verb+/var/lib/dibbler+ directory is present and is writeable. After editing configuration files, issue one of the following commands: \begin{lstlisting} dibbler-server start dibbler-client start dibbler-relay start \end{lstlisting} \verb+start+ parameter requires little explanation. It instructs Dibbler to run in daemon mode -- detach from console and run in the background. During configuration files fine-tuning, it is ofter better to watch Dibbler's bahavior instantly. In this case, use \verb+run+ instead of \verb+start+ parameter. Dibbler will present its messages on your console instead of log files. To finish it, press ctrl-c. To stop server, client or relay running in daemon mode, type: \begin{lstlisting} dibbler-server stop dibbler-client stop dibbler-relay stop \end{lstlisting} To see, if client, server or relay are running, type: \begin{lstlisting} dibbler-server status dibbler-client status dibbler-relay status \end{lstlisting} To see full list of available commands, type \verb+dibbler-server+, \verb+dibbler-client+ or \verb+dibbler-relay+ without any parameters. If your OS uses different layout of directories, you may want to modify Misc/Portable.h before starting compilation process. \newpage \section{Compilation} \label{compile} Dibbler is distributed in 2 versions: binary and source code. If there is binary version provided for your system, it is usually better choice. Compilation usually is performed by more experienced users. In average case it does not offer significant advantages over binary version. You probably want to just install and use Dibbler. If that is your case, read section named \ref{install}. However, if you are skilled enough, you might want to tune several Dibbler aspects during compilation. See \emph{ Dibbler Developer's Guide} for information about various compilation parameters. \subsection{Linux/Mac OS X/FreeBSD/NetBSD/OpenBSD/Solaris Compilation} The following descriptions applies to Linux, Mac OS X, FreeBSD, NetBSD and OpenBSD. Solaris 11 support has been added since 0.8.3. Other POSIX systems may work, but were never tested by author. If you would like to install Dibbler from sources, you will need all required dependencies. In particular, you need a typical C++ environment: a C and C++ compilers (most probably gcc and g++), make, and several other smaller tools. To install Dibbler package from sources, go to project homepage and download latest tar.gz source archive. Extract it using available tool for that purpose (in most cases that would be tool called tar and gzip). After sources are extracted, they must be configured to match specific operating system. To complete this step, a configure script must be called: \begin{lstlisting} ./configure \end{lstlisting} Configure script accepts many parameters, so if like to tweak something, here is your chance. You may run \verb+./configure --help+ to see list of available parameters. For example, to set up sources to compile in debug mode (useful if you want to debug them or provide better bugreport), you can do this: \begin{lstlisting} ./configure --enable-debug \end{lstlisting} See Dibbler Developer's Guide, section 2 for details on compilation switches. Once configure completes its operation, it prints out details of its configuration and source are ready for compilation. To build all components, just type make. If you want to make specific component only, you may use it as parameter to make, e.g. \verb+make server+. After successful compilation type \verb+make install+ to install compiled code in your system. For example, to build server and relay, type: \begin{lstlisting} tar zxvf dibbler-0.8.1RC1-src.tar.gz ./configure make server relay make install mkdir -p /var/lib/dibbler \end{lstlisting} Configure script was added in 0.8.1RC1. Earlier versions do not not need that step. Dibbler was compiled using gcc 2.95, 3.0, 3.2, 3.3, 3.4, 4.0, 4.1, 4.2, 4.3, 4.4, 4.5, 4.6 and 4.7 versions. Note that many older compilers are now considered obsolete and were not tested for some time. Lexer files (grammar defined config file) were generated using flex 2.5.35. Parser file were created using bison++ 1.21.9. Flex and bison++ tools are not required to compile Dibbler. Generated files are placed in GIT and in tar.gz archives. Dibbler requires also make. Autoconf and automake tools (autotools) were used for regeneration of the Makefiles and configure script, but those generated files are shipped with the code, so autotools should not be required. \subsection{Modern Windows (XP...Win7) compilation} Download dibbler-\version-src.tar.gz and extract it. In \verb+Port-win32+ there are several project files (for server, client and relay) for MS Visual Studio 2008. According to authors knowledge, it is possible to compile dibbler using free MS Visutal C++ Express 2008 edition. Previous dibbler releases were compiled using MS Visual Studio .NET (sometimes called 2002) and 2003. Those versions are not supported anymore. It might work with newest dibber version, but there are no guarantee. Open \verb+dibbler-win32.vs2008.sln+ solution file click Build command. That should start compilation. After a while, binary exe files will be stored in the \verb+Debug/+ or \verb+Release/+ directories. \subsection{Legacy Windows (NT/2000) compilation} Windows NT4/2000 port is considered experimental, but there are reports that it works just fine. To compile it, you should download dev-cpp (\url{http://www.bloodshed.net/dev/devcpp.html}), a free IDE for Windows utilising minGW port of the gcc for Windows. Run dev-cpp, click ,,open project...'', and open one of the \verb+*.dev+ files located in the Port-winnt2k directory, then click compile. You also should take a look at \verb+Port-winnt2k/INFO+ file for details. \subsection{IPv6 support} Some systems does not have IPv6 enabled by default. In that is the case, you can skip following subsections safely. If you are not sure, here is an easy way to check it. To verify if you have IPv6 support, execute following command: \verb+ping6 ::1+ (Linux) or \verb+ping ::1+ (Windows). If you get replies, you have IPv6 already installed. \subsubsection{Setting up IPv6 in Linux} Almost all modern Linux distributions have IPv6 enabled by default, so there is very good chance that nothing has to be done. However, if that is not the case, IPv6 can be enabled in Linux systems in two ways: compiled directly into kernel or as a module. If you don't have IPv6 enabled, try to load IPv6 module: \verb+modprobe ipv6+ (command executed as root) and try \verb+ping6 ::1+. If that fails, you have to recompile kernel to support IPv6. There are numerous descriptions how to recompile kernel available on the web, just type "kernel compilation howto" in \href{http://www.google.com}{Google}. \subsubsection{Setting up IPv6 in Windows Vista and Win7} Both systems have IPv6 enabled by default. Also note that Win7 also has DHCPv6 client built-in, so you may use it as well. \subsubsection{Setting up IPv6 in Windows XP and 2003} If you have already working IPv6 support, you can safely skip this section. The easiest way to enable IPv6 support is to right click on the \verb+My network place+ on the desktop, select \verb+Properties+, then locate your network interface, right click it and select \verb+Properties+. Then click \verb+Install...+, choose protocol and then IPv6 (its naming is somewhat diffrent depending on what Service Pack you have installed). In XP, there's much quicker way to install IPv6. Simply run command \verb+ipv6 install+ (i.e. hit Start..., choose run... and then type \verb+ipv6 install+). Also make sure that you have built-in firewall disabled. See \emph{Frequently Asked Question} section for details. \subsubsection{Setting up IPv6 in Windows 2000} If you have already working IPv6 support, you can safely skip this section. The following description was provided by Sob ( (\href{mailto:sob(at)hisoftware.cz}{sob(at)hisoftware.cz}). Thanks. This description assumes that ServicePack 4 is already installed. \begin{enumerate} \item Download the file tpipv6-001205.exe from: \url{http://msdn.microsoft.com/downloads/sdks/platform/tpipv6.asp} and save it to a local folder (for example, \verb+C:\IPv6TP+). \item From the local folder (\verb+C:\IPv6TP+), run \verb+Tpipv6-001205.exe+ and extract the files to the same location. \item From the local folder (\verb+C:\IPv6TP+), run \verb+Setup.exe -x+ and extract the files to a subfolder of the current folder (for example, \verb+C:\IPv6TP\files+). \item From the folder containing the extracted files (\verb+C:\IPv6TP\files+), open the file \verb+Hotfix.inf+ in a text editor. \item In the [Version] section of the Hotfix.inf file, change the line NTServicePackVersion=256 to NTServicePackVersion=1024, and then save changes. \footnote{This defines Service Pack requirement. NTServicePackVersion is a ServicePack version multiplied by 256. If there would be SP5 available, this value should have been changed to the 1280.} \item From the folder containing the extracted files (\verb+C:\IPv6TP\files+), run \verb+Hotfix.exe+. \item Restart the computer when prompted. \item After the computer is restarted, from the Windows 2000 desktop, click Start, point to Settings, and then click Network and Dial-up Connections. As an alternative, you can right-click My Network Places, and then click Properties. \item Right-click the Ethernet-based network interface to which you want to add the IPv6 protocol, and then click Properties. Typically, this network interface is named Local Area Connection. \item Click Install. \item In the Select Network Component Type dialog box, click Protocol, and then click Add. \item In the Select Network Protocol dialog box, click Microsoft IPv6 Protocol and then click OK. \item Click Close to close the Local Area Connection Properties dialog box. \end{enumerate} \subsubsection{Setting up IPv6 in Windows NT4} If you have already working IPv6 support, you can safely skip this section. The following description was provided by The following description was provided by Sob (\href{mailto:sob(at)hisoftware.cz}{sob(at)hisoftware.cz}). Thanks. \begin{enumerate} \item Download the file msripv6-bin-1-4.exe from: \url{http://research.microsoft.com/msripv6/msripv6.htm}{Microsoft} and save it to a local folder (for example, \verb+C:\IPv6Kit+). \item From the local folder (\verb+C:\IPv6Kit+), run \verb+msripv6-bin-1-4.exe+ and extract the files to the same location. \item Start the Control Panel's "Network" applet (an alternative way to do this is to right-click on "Network Neighborhood" and select "Properties") and select the "Protocols" tab. \item Click the "Add..." button and then "Have Disk...". When it asks you for a disk, give it the full pathname to where you downloaded the binary distribution kit (\verb+C:\IPv6Kit+). \item IPv6 is now installed. \end{enumerate} dibbler-1.0.1/doc/dibbler-worldmap.png0000664000175000017500000010347512233256142014552 00000000000000ÿØÿàJFIFÿþ>CREATOR: gd-jpeg v1.0 (using IJG JPEG v62), default quality ÿÛC    $.' ",#(7),01444'9=82<.342ÿÛC  2!!22222222222222222222222222222222222222222222222222ÿÀ…"ÿÄ ÿĵ}!1AQa"q2‘¡#B±ÁRÑð$3br‚ %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyzƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖרÙÚáâãäåæçèéêñòóôõö÷øùúÿÄ ÿĵw!1AQaq"2B‘¡±Á #3RðbrÑ $4á%ñ&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz‚ƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖרÙÚâãäåæçèéêòóôõö÷øùúÿÚ ?÷ú(¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ +Ö|k£èw/kpóKrŒÃy+‘rp1‚:õyñ9ìîå·“Aš6Fáf›Ë|u®Þ 8溩à«ÔWŒOÌ㫘a©6§=¾‘è4Wám%ŵó[Ú^ª<‘É·…uËä‘ó8àuÌèZ¢jS´šÇеkVvÁXåòÐ;7;Ë€sò£Œê²ú—’ž–òosft­ y¯Õ-»ÜõÊ©«§Kvm#¿µ{ÅL+2—Èê6ç9?•rŒ­t½BëE¸’óì¶öb8R.^nåb@û§vâHÈÏá­´ÍP»’;mBú(³ƒ=¬aQG@Ïæ€ 8\œH隺94\ª6—M.eˆÍ9$£I)>ªö=θ½kâ5†™w5¥½¤×SÃ)É"4ã®$xéëϯ6¥toí¯„º–›fÖëo±±vòãP¤)ʆH“OÖïôÝc]K»[†F‡uÒDM$€1gç 1‚zô9õ®ª9dc/Þ{ÊÞ–~ðçœàý—ºï×[®é[ô:~)ݾ•vÃÃºíŽøX’Î,’VÞWûÜWåôëí]‡“uqûß.i7ÒsøÓ$†X±æFéž›”Œ× LΤ´„R^Ÿ×äz²Šq³©''ëoëï(éPê:tžlºÝýÔœ‚²¾èÊœcåló‘ÔëíkßùïÿŽ/øU*+‚¥IT—4·=*T£J<°ÛïüËo©ÝÈ›Zc×9_”þ”Éo®¦ÎùÜ‚0@8}W¢ Ðr;FÁ‘аèAÁ¤$³bI'$žô”PNGhØ21V84Ú(õ®¡y„#4ŇÝ|·åZÐ>§*†t·ŒÑÎ>™¨t¥”¯DDŒà•@<ÑŽ3ߌç=óZ´ƒ;Fâ Ç$ RÑEQEA=å½³š@¤Œ‚•Cý­eÿ=ÿñÆÿ šêÒ+ÈÂJ!‡QX’h×K.Ô êOßÎ1õ 5»B¬HÐäþµ=¾¥mrʈÄHÙ•9ÿ ¨ú…C¸‘G;—!ôýjý¤2AIXç?*ÛÆ€'¢Š(¬ [Ä7ÚmÌ1ÇáÝBæ&v,[[ ù”.î äÛüñ¿E]9F.òWFu#)FÑ•ŸËõ9HL¬€¼[ƒlb9\ޏ¯tÖÑÅalâÞ#H–æ-µ›'$úœW«„ÃÐŒœ7~ò_‘âãqX™ETUº(·øÿ_#RÏ∠»Š[‹•¹…[ç…¢E=2 ûÿ>•fú÷Àúœ xö—Ö7%¶ÉofªùG#?.ÑŒq‚s’+‹¢»^—74=×å¡ç¬ugZžòþö¿wS­y¼!i9´±Òo5‡gQ²NÑ—$r (ƒ·.I'Ðg ‡QÐü!?úO‡¾Ã©¼-4j&óÀ0Q¼ä©bùA#'®8ß ÜÝiúºjöÖóyq0‰Ww X ÄnÀ9îpqÇq¬xÃÂÚÐþÏžÞk´Vß 10ÄÒm;Al‚£'nHÀÎO×&œ”Ô-)G®®ÿuíþ#ÑÂT‹¦ê^1•ô÷U¾û_ñÓ®ç%{âùu–ò¯´Í'l²£I)ŽU$€T3}ÄO¯Ò›q ×]£Ð¼1¶Ô8†Õeg^só¶í™9çvpàçîÛ™FÈÓFØ›r¯=ääzŸ©¯OЮcñ/€›Cµ¿Xu$·ØÊKä(~9'%Hd ØÆ0+zü¸xÆpZ_»²ó²9ðÜØ©Ê¶}ß’láî®ôù%í¯Íb†Â}¨ƒ|…·;‡ÜrAI={V]«Z¤¤ÝÃ4±íáb”Fsë’­Ç^1N¿³ûì–ßi·¹ÙÞÛ¾øÛ ~¸úՕЯ›K‡P •;ì‚?1|ÉŽâ§bg'÷ävÉK’1ß3‰ûIÊÉj¼¿1¦mÍR,o¼½§rý±2O ù\¼c¸éŽ}WÀúi­eel¶MlÇm¯œd; ÎàHÄŽøãÔW\[Ëis-´ë²XœÆëpÀàŒz ¸žÙ÷Á4‘1Ç1±SÁ :zÔ Ã„Ž"Ÿ*~š¶t`ñÓÂÕæk×D¿CèÊ+ϼâ=R¹[[¨ZêÅUƒ^2àÆ@º1éÇÞù³œ ôùœE PŸ$¯Ãbcˆ§í"š^aTutG°mî+‘œŸAW«'ZŽY|¤Kw|rrqê1ùVA…E:BFa·æ9ÂŒžÔÚ(¢Š(¢Š*ýŽ—%Ú¬¬Áb݃ê~•s\ªá=I2ŽéÍtv–ÿe¶HwnÛžqŽù ¶³†ÑH‰H$ Äœç=PEPEPE—©x“GÒX¥î¡ r c{ŒŒŒªäŽøôõªŒ%7h«²g8ÁsMÙyšJ¥s—-“žqÇ·êóËŠ°,ì-´™$‹­$áñÜqϽsw¼G4í$wqÀ§Ž8PªñÛp'õ®úy^&{«z¿ò¹æUÎp°Ù¹z/ó±ìôWŒ[üBñ3¬’]Ç:Œæ9!@­Ç} ÖºÝ3ânŸ<‹¡–ß"æu”¶ß›å g×9çªå˜Šjö¿ èæøZ®ÍòúÕ—¦ø“GÕ˜%–¡ ’*#'cœ œ+`‘Žøõô­Já”%i+3Ò„ã5Íuä…âÏhÍqÃöÇ`°E($?#wƒ€3ÏÓÖ·k™¾»ð·‰5$Ñ®Ùno"•ÕcÙ"ep ãƒßÚµÃÅ9©J-ÅjìcŠ“TÜa$¤ôWîy®¢]ø·\•¤”¿u.6ðÍÈ9$œJõí'AÓtX#ŽÊÖ4uM†b Èã9;›©ÉçÓò®JÏÂÖÞ ž_øš;YÓp6È«3F½Xäê8ã¸Íjjž$¹Ðnà†ilo¡ŽÜ ¢.+…`–Ø[ä(äžãŒú8Ê’ÄÉB”´¶Ú¯ø•€¥ $ëG[üZ?ºÚúèuuËø‡Æ°xwY†ÆæÎIb’+KË’ÃO^WÔuªqüNÐÞTF†ú5f»F¸_s†'@k€ñB¥æ·y¨ÙN×vs7š²ÜÊ>Pw/ÞE vÀqŒf£€n¥«ÆÊƘìÉF—6I»þ‡«Câý&uG$ÆÌ¶Ãxaa>TmbySó)ÉyëÁ¬Ýgâ †w%¤ wq0—sˆQvîÜ70å¾^€sž œ ã òyŽzW_ÿ _þ ¿ù5ÿØW›Ñ\µpT+Kšq»þ»”1øšä§+/“üÏV·ø¥¥´ nlo#—Ë×QÏbHÏÕ›ÅY×Ìóô˜ß.Jlœ®ÕìAÉ÷ãè+Îè¬VY†W÷m,ßíï~õÍâF—¨KäßDÖ3aY›|g l OQ€ZÞÔü1¢êó‰ï¬#’^ò)(ÍÀ•#<×¥x-]›XÔ.4Èôéîä–Ò7‘¹Ý´´`ž@¶qíXTÊÒš• rÿ]šYËppÄÁO¶ß‰èÚ‡Ã{dŠÐéK ’DÍç-ô‰èIL`¯`Ï~œóÚv±á›¹ÒÏ[ÑìâŠËÝ‘€7¾ÙÁùŽO#É®tëºÁ•e:­ñ‘Tª¿Ú dž‡òFIi^Y]žGbÌìrXž¤žæº)ajrÚ´ÛìÕÓG5\m.e*ÒîšM?ëþ ëº£à› ™²o#¶wOŸÍ–TVÿÓC´ž~½}릵ÕtëéLV—ö·ÜR)•ȸ§"¾z©-î'´g¶šHe\í’6*Ã#í\õr˜Í¹s»ùêuPÎåM(û4—–‡Ñ”W†ZøÏÄVqâÕfe-»2…”þl Ç*øO¼MÿA?üÿ\O'­}$¿ò;Ö}‡¶±‡ùžÙEyv‡ñ2êòõ¤óâq$#6xÏ!qŒô•·ÿ CDÿŸ]Cþý§ÿ\ó˱•¹oèuÓÍ0³75½NÚŠán¾(é±ùFÚÊâ`ÈÅÃ…gj÷ÎHäƒÀ#©ÈªÃ⚤è“iPí,Ñ݇!H·àôÈ烊K/ĵ~OÈo4Â'nÁÿ‘ètW™êž3Ñ5K•Ÿí~$´Ú<»I5<“’7yýtÚ7‰ü:–ÉeºÓ´j[ξfVnsË0žp ö¥SVRiýÃ¥˜Q©7%oUù5ØäI¢IbuxÝC+©È`z{ŠuqÁEPEPEPEPEPEPEPEPEPEPEPEPEPEÄßg¶–.I|´/åÄ»™°3…ÉíBWÐMÙ\’©jzÆŸ£À&Ô.ãOÝ rÍÈ(äõÈõxŠ]ß+i±»¢õÒ2r2?ˆàõààðx¯>ñ>½áMwPG¹›X•aMˆm‚,g<’óžÇ÷Euá°®¬í$췱NjÆF;Å®gµôÿ‚t4ghãKÉÔcG ÜvÜAý+Íî+»IZ)âmÈëÔˆöïPQO•ZÁÌÓ½õ5åñ6­4P›ˆÑnÿãàÃom/9ù™TÔ÷î}k*9&-²1R¤©ÁÁ#èA#ñ¦×E¡x3V×%Ék[mªæyЀʸ?ˆãŸOq‘YIңݒ6Š­ˆšŠ¼™ÎÔ‹;$$7d;+]rR3Œ ôëôì5Ÿ‡7úe³ÜÛ]Ãu (-¸Ødàú€ rI#>•‘¥èÞ,òZj–©h¦cvRª„å¼Ül;pCcœäb¢8ª3‡†ŒaA:Xxs]jÛµ¯ÒößÐã5TÒá{ˆâ¹¼¿½óŸuÓHÛ‘ÈbùùŽw£­Qû’Þý–ÌýµÏÝ6èç8ãžÝ¨Ô,gÓ5 ì®WÂ僃î3ØŽG±©-l5{Iíb“2̱Á,m€%Ï »?+dg=0kÞ£ ó}ÿ×ä|Ô¯)´ãò_׿š†¥¢Ü¸¶¸¸´•\yˆ \²žŒ½ðsÁµî:æ¡}¦$ú‡Ø®?w¿;†ÐwcªòOÊyæ Òô;Xš×S¹±…5sn¢yU@>as…ùwOÌ9çÅl×Îc±¯d£ªëýt>¯-ÀÔÃ]Êz>Ÿççéø…rÚ…Ì—o¸¨ÅUqŒ§­u5Êê˜ïçSŒ—-Ç¿?Ö¼ãÕ+QEMom-Ô"ByäöS@Õ˜,.g`&Œîa\×Koo´"(†~dúš–€3¢Ñ­Q~pÒIÇ劲–6ˆ¡E¼dUÉüÍX¢€(ZÐN"ÞNN7ãåëKý­eÿ=ÿñÆÿ ¥s¢»ÌM¿”‘ã€Y³øõªñh×Nß8XÆG$çòÅkÚê0]±Tʰ蟧5n¨YiQZ?˜XÉ ?+cãÒ¯ÐEPE“¬ø—JÐp·×;ed.‘"–féÓ'œ¾†ª”ß,UÙ© q曲/Þ^[éö’ÝÝʱAîwnƒüO·zðJîÛ³4í •·Ìeyø˜õbrx{Vߊ‚WŠ̪‘ùõÙh^#ÓüE’X´¢Ç™‰†L“Œö9ÁèMdC£øWÆVÒj0Z|ï”y4LŽFã>RÃw\}M^ðï…£ðÜ÷_f¼’Ki°V'7Vp2ÞÀ2x$æ¾{õW£®ŸÕÿCéð¿]SNrSƒê¿¥ú›ôQEyǪQEQEQEQEQEQEQEQEQEQEQE‰¨x†[;¹íaÑ5K©cBË$p)ÎÝØŸÃ¡9àx­º©ªXiqy—×pÛ©RÊ$p c®ÑÔžœZÒ¹­Ë#*·åº—/Ÿü9ášõÝíî³s5ú\E)rD3–-’X'=Žf×mªÅ¢j÷>_†´KËëŸ9Z[£$¦6$ç¸çæÉ%#9ÅdŸxƒí¯hštŽèË‚|€páIÁÁ<ƒ×õt±Ô—»äì¿_ÌøªØj®mÇß»Ý]þ6×äsõ=­Õô¦+Ki®$ ¸¤Q— zàväWµxo@ŠÃÃX_Y[ï“÷—1s"3ñ‚wdg ¹ÇVݽ¼,ÐÇ K±Æ¡Tdç€=ë‚®q¶£üÏNŽE)%)Î×]¿ȬþkZS]¸X'ÚY-¥áŸ…#œü¤å¸8ÁQž¹’xk\ŠW´‹âÊÅIX‡„ î+ß(®Xç“|É3²y—+hù¾ŠèbÀÄ3Œp:ŒÁIàã½gUÉA¸niEAÔŠž×Ôõ?øKÐÕe‘òñ["yS…äµr@#ž½yí]5ch^(ÒüB¬,¥a2.ç‚UÚê3Œúô'Ækf¾?*®oÛ^þgÝa£F4×°·/Ù#I¢x¥ExÝJ²0È`z‚;ŠÈÕtÝ æ ¨¡³Ów,³”FOðާhrzqZ·Z@ÓÜÍ1.7I#Q“ŽI÷®âŒ­¥YO,Ì·)+,1ŒฑœàmŒõä^uc ´›éýétg;&Òëçý|Ï5¿¼kû³;E_"F©vª¢…d“ÑGSQ[ÜOi:Ïm4ʹÛ$lU†F8#Ú£¢¾½E%ËÐøW&åÍÔöÍ6{­[L†_éú|–ÚÄü£Wh*äØ.Iè998­á_øGî5Fç@ûDj¨‹2 ¬X– ªy`ŽÀv×–O®j—:l:t·Ó5œKµbÝŒ‚þðÎqŽ1[¿&ž/Æ‘G½%…ÒS´‹Ùöù‚Ž}}ëÆ«€•:5%Ío%µ¿Ì÷èæQ©^œ9oæ÷¾ÚyÇEW€}0Vn¥¦µã¤‘¸Ò¦+JŠæ$Ónè¨Ì7$ vóÞ·ì­VÒÙc{«õ=êÅQEQEQEQERÖú="äéù·¥1 îUÃ7e¸ã9ÁëŒSŠæi)rÅ˱nIžY]R4RÌìp¤žÂˆäI¢IbuxÝC+©È`z{Šð«¯ë„£íÚÔ•Ù$QIåNã 1’  þ5ì>»kßÚMö±E°,™ ‘áI$ q׌ó]جððR“½ÿ¯SÏÁæPÅTqе¿¯OÄÖ¯œdŒÅ+ÆÅK+%X0ãÐŽ÷ôup:ïû[›ËE59`YY¥‘'ÎÌIÁxä ~µ®YЧAÉTvNÆ9¾®&0t•Ú¿ãcËh¯LÖ|5cuᇶÑl@¹³+"¶ÅiîÀž½óž€ҼνÜ6*ˆ¹C¡óx¼L,”gÕ›à/örh«§ÜK=º3¡„ƒæäœçq¸u8?\Îx«Ãµ¾¿y2YËsÄpÞ'uUfc†8àŽãÞºÏ £ZÏ£¦¡y6÷f[Ûéï-ŒaXžeVÇ9 ZÙÔ'·›S"Q'–‹°”<ä}*ñjb¾­ˆ”éÇ}õóü ¥‚úÖ0«/‡m<¿SÌ-|«\De”[ÛD"ó7K($÷ÆÅÜÛ½±Ûx®~½jXüØ^=î›Ô®ä8eÏp}kÊ%‰à™á‘vÉaœàŽ z~2x—.{icËÌðÂ(r_[êÆQEéžHQEQEQEQEQEQEQEQEQEQEQEQEQEQ^çàí4é~³Ä>k©•Ú"6ãw Û´gžœ1WWBÑÑ]SJ±UuÚà[  2Œ€^4óˆFn<»yžì2)Η=›[[cçúôÿ øGú§‡aóü™ïÌ[¦’Þå‹E»%r3€À``Ž õ®¿VÐ4ÍsÉþѶóüÞ_ïqœgî‘è*[MÓ6›+x'—½#ŠñÁn§ êk›™ª´Ò…ã//ó;0™;£U¹ÚQóÿ/ø'™j>þÃÑ5;ûû?ÉÚ-|‡Ûœ¶Ü¸*}TàQžõÉXé÷zÊÛY[É<§øPg džÃ$rx¯Dø£}w –[mÍÆ_%3 t<òx ½9ê:uá4=rïÃú‡Û,ü²å l².U”ö=PµzXJ•ªaÝFï'·nÇ“Ž¥‡§‰T’j+~ýÿ+CÀºói ¨%®ìî&ØåfP3ÉR§dœŽ+Ð|á{}#J‚îâÙN¥*ùŒî¹h²deN>äòF*φ|[e¯ZB¯41j%yn <ò¹ê03œgšè«ÇÆc1N•Em¯‘î`pXµ^“æÓñýä5cDgdEVvÜä 8'Ôàø uWšzáEPEPEPEPEPEPEPEPEPEPEPYzÍα Ãa Ä’¶Y¥Úò9+ÕôéŽý+RЍK•Ý«“8¹FÉÛÐæåÑuíSÉ:޹öD\™ ÓǓΑ‰nã#ã§zŽËá÷‡ìÝ­¤¹dÁy ‚NH¨#޹ê(­¾µU+EÙyiù}N‹|Ò\ÏÏ_Ìlq¤1$Q"¤h¡U`(…:Š+œé (¢€ ‚òòßO´–îîUŠ—s»tâ}»Ôõ›¯é?Ûš%ÆçùvßÞlÝŒ0n™žµPQrJNË©”‚»¶ž§•kÀ^½ÏˆîÞÚ)ò¶ÐÃÆò†$0'h p[{až:\µzija NŸlËæZ« eÄ›S‡'$cžÇ®xóêúܹè©}Þ‰Ì!É]Â÷k^¡EWYÄQEQEQEQEIoq=¤ë=´ÒC*çl‘±Vàjî|â?êºÝ­¼Yíâ]Ó •Õ wcqnF9ëŒñšà«gÚ–›¥ß5Ö¡b×M‰-¶9R²©sÈ}rAÇZæÅRŒé¿v聯:ðu¥N¬}ë+ë«_çùÄmjÖ=BÞÄXÛÜÜÀžbÍ#–ìPpOʇæÈÇb pÚ…Þ§r×7·O)þ'9ÀÉ8°É<*M_TŸZÕ&Ô.R4–]»„`…P¼džÂ©RÂáÕqUý0Æb¥^¬¤žÿÃ\(¢Šê9®é:µÞ‹¨G{e&ÉW‚*ëÝXwÿ¯ÔU*³mauwÌðŘ­“|Ò ¨3É=Iè:žÂ¦j.-Kb鹩' ×cØü%âȼIm"ȱÁ{7ĬNåÀùÆGLäcœq“È®’¼çáv–è·ºœ¶ìªê±A)8 2Kàw ϱµèÕòXÚté×”iì¶ËêÔ«†ŒêîŠ(®C´(¢Š(¢Š(¢Š(¢Šl’¢y8E,qíXÚ´—£ž(™J’çÜr?kní$’ÒTˆì¤k g\Í ˆön4æ¾ ðeΓo-ìOZÆ#-K™7˜`  C]/ÿy¨šãÈÒŒ›W< gg¶$g·`ËxêâK\ù“[ÊcýØòØ(áNîÔ/Ï|Ö%‡Û~ÛöwÚ>×Ï—ö}ÞgCœmç¦ úŸ`ñTª½m{ö>7ë Œr ¬¯f»ëý|Ï¡ëÄÚ¥½žs¶îÑnw,SL¾Ò (ï»ÜŠ©µú%¬VWr\£]°e2à¶9$çõë\7/—d쉋gŒrþuàá°þÓ©µ×_‘ô¸¼O²Ã:©ôÓæ\_iŒ®J\)UÈ[00zóžqÐ÷À¨t½_–fæöæÚâæI®0\ÃÌË‚CƒµU2IÈô«‰¢¾‚9u&£u3æ'š×›NI;yÅŽ Z2À«X¶Í¹P…ùFÝ«òç‚8ª:W‹¿´/<«äXå•É.pÌÍÂ…ÇœdžÕÃÓâdI‘¤ÌŒ0,™ÆáÜgµ)å¸w”¯˜éæØ¥4Ü®½4üüÖªµå…µü-ÄHùRªÅAdÏu'¡«ë"+£V A´µòêN.ëF}Œ£ÆÏTÏ/Ô´«­*qʘe]yVõÁöªUé—º%ž¢î÷^lŒßtù‡ðÊ:™éÖ¼÷PÓî4ËŸ"å@ln†#?§zúŒ68ˆò¿‰Z˜eóÃK™/uíåêU¢Š+Ð<Т•¤uDRÌÇ@É'Òº[Osj³\\}Û‘qß‘ƒíXÖÄR¢¯QØÞ†¶!Ú”ns4VÍß…õK@XB'P&»¾1ާò¦ÿÂ9©BË%Å”¦Ãx…•ŸnyÀóR±TZºšûÊx¼*…zÔ±G7'7ÍCÞ]º¯ó9j*üš.¥ ¯Úd³•bç$ŽF3É@ã©B½XÎ3ø]ÏtçX(§Å“È#†7’CÑQI'ð$öWvÈ{Y¢RpHÊŒúsC”S³z‰BMs%¡Ðh~WÓæ®9› ’}zû~4ÍOÂך|2NŽ“Âœ’ †¹#Ð}O­sýr´tœµ:~¡ˆöJ²âaQEÔrQ@Q@Og%¼WqIwn×+eâY6ö݃þxëPQI«« ;;žµiñ3KšÉ渵¸ŠhðZ*Ùã*I]Øã#ç¡‘{þýéÚ ò6c[eËï´°ÈéÓ=}Ž<^Šó%”ÐoK£ÖŽw‰JÎÏúÜú&ÎòßP´ŠîÒU– Wr:ô?à}»Tõã^ñß…•.'¦Ó/—ËIW*êWsc’8;s‘ϽzÎòßP´ŠîÒU– Wr:ô?à}»W‹‹ÂK.ñèÿ®§Ðàq±ÄÃ]$·_¯¡KÄ¿ˆt¦²¸fC»|r/TpÇ$cß±æ¼WYÐu äAÍù1ȧ+ úF@Í{õRÕ´›MkO’Êö=ñ7 ޳)ìGÿ[¡­0Xùaß+Ö?ÖÆY†[R排_©äÿ¤¸%HíÅŽæ]ÌnWæÚÍå‘È}¥¸èFsÒ½–¼ŸÃšÚOÄ8ì%Xn£…Ÿsì €:¹%Y9õÈó^±WšÊ2ª¥šLÏ&Œ¡BQ–6‚Š(¯0õŠ( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( *ø—£ÛÙjj1K‡»Ü&,ÌÌ:°'#*1Æ00:ãˆ"Ž@!›ÍRŠKm+†* .¡$g¾3]/޼Bºæ²#€æÒÓtqœ‚³ó8#±ÀÇ'ž3\µ}~ 3ª›ÿVü…Ì'NX‰ºkKÿÃþ!EWYÆQEQEQE]Ó4}CXœÃ§ÚI;¼TaW‚ycÀèzžj}{AºðíòZ]É Èñ Aˆ’0IÀçƒZW‰¼Fu%­æB …ÝP``ƒ„AÀ<àšŸÏÕ¼c«G£Üë̪®ð¸Œ¬násŒSž£,8±ž‡‘Ô­—•”R×{þGliP•;BîmÙl—çþg)Eijº4šV7Ý[Ïûé o'ÈñíÜåÞŒŠÍ®˜ÉI]lrN„¹e¸QED…wÓ‹-&²:5œJvÞÀŒ$Iz¹‰2yRxr>Záë¢ðï‹ïô0B!kweÜ"Å99`.[žçœ(ÈW6*%O÷C¯Rœ*þ÷á{î›á«- O¸¸ñisÅo‘ßePD|Ÿ™‰’~cº¼ï_ñº×•6ÑÙiðó¤8Ú¬z±À9'·÷$úG†â×µ'½YÆÖ— Šv•\Û|¾}FK|Ü/^ÚÇ„4}fŠKu·ee"[dDrv…ÎÓòã{Jñ©b¡F³u½çÝl½ïVÁÏA*êìÖ¯^¯·c‰ð‰5)5›M"âí¤³1:GFŒÃæà€>¾˜î=N¹½+ÀúF«ÿhÛ} Ê»¼´y2±çŽ8Éà‘É=}y®’¸ñÕiU«ÍIY[ñ;²ê5¨Ñä¬î醴Ð(¢Šã;Š( Š( Š( Š( £¸·ŠîÚ[i×|R¡×$eHÁÕ%'mPšMYžx|S øWY}>ÛÃò@°îŽYð<ÓÉ•ÒÚx2êhÕ®gKrs” ¼Ž˜èqÏ=ý=xìmmÅ¥¬Vêîë…RøÎN€T· -by&;QÌc× ŒçjñkfÕfùi+~'ÐaòJP\Õÿ ~'9càëHÚîSt® ïÁÉ«þÒà(Å$••÷fFÎxè@àŽÿýn*í¶µ¦Ýãɼˆ’ÛB±ÚÄû‚jýqÕÅb“|òkð;¨àðn)ÓŠi|ÿ¢Š+Œï +F}"h­’A–r>dPI϶=ª­°³G½¸0Æ‹œÿ2O`(•ñ.•a‹5ÄV‘G,{v´k·«sŽ¿pµ£®_}¿W¸•f2À²2@Åqû½ÇoaØ÷泫ë°TgJ—,ÝÞþžGÃfé×­ÍN6KO_3­ð;¨{ä,7„.y nÉýGç]…y{7‡tAíTk6ƈ*ç‰R,Hè×=zwòsl7,ýµ÷ééo¼÷2\_5?aËðõõmü¿Rµbí-QÔZÊî¸çpèj½xçºQEQEQEÆxŠ"ÂTµK2’Jë,ŽŸÂ™9Û“€}±ÈcwYÕí,í. k —MT$°m¼téÔuÅyô÷w7[~Ñq,Û~ï˜å±ôÍ{9^mûFÚ_5ó<ãN1öI'/“·ù‘¤g}€flû>ã÷sÝóžsõíŽÕrX£ž3Ѥ‘žªê?¯(ŠW‚dš6Û$lN3‚9éZ%ùÔt˜.ƒ.6É‚Ì8ç3×õŽ?,;öŠWMüÿ¯3|·0†%{'4¾Vþºa²´¶rðZÃ‚ÑÆãÓŠžŠ+Írrwg­¨«%`¬½CÃÚ~£‚ñyRn,d„fÏ\ñÍjQUN¤é¾h;2*R…XòÍ]VÞÓ-æ0–|tYXÏПNJѿÓm¯á‘d†#+FQehÃ2g8#éœÕÊ*别))JNèÎZ0‹„b’g˜®‹©´o °¸Âc ¡Ÿ@y?…P¯CÖ|E› h§¸,WË÷1ݱèqÇÄjZŒš¥×ÚfŽ$“hSå©Çs’yíø ú\"µozp²è|–; ‡Ã¾Zs¼º¯ø%:(¢»Ï8(¢Šê|ö´÷z À‘ín¡gL&å‚`ÙzŒq‘Áç ØðBêÚMÝõ¢y •~Ó¦HUYñæFű¸qž€‚9äb·ÂèÜø†îPŒc[B¬øàë€O©Áüu>3ÒOŸg¯Ã¨®-“–à«1–ÀÀɈÆ0wœ ñqU—·•´’ó×þÚk±ïàè?«Ç·‹~Z|ôÓ}tÝ3¯¢³t ©ï4+K‹››{™]2Ó[çcòFyFx-ö«k§Ïoo/˜÷7;„Æ…šB aÔrH§×„éËÁj×è}«E7¢vüF 0¶­½KAliÈÖÈ9Æzc°ç®t+?M·¸ -íÙš9î• Ú´þlp`c ÀÁ=O½hQQ»Ù»Ø)¥k¥kêQEA QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEWž|DñG”¡Y¼‹)ÁºqÀÚFv{äN;qÎHÖ£wö 2îóg™öx^]™ÆíªN3Û¥x¡}>§¨O{rÙ–g.ÜœažÀp=…z¹VT¨êKeùž.s‹t©*PzËò+QEô§É…Q@Q@Q@Q@º½ªhºm‚–[ûˆ¼ëáýÐH1Æ{©n*{yÂâ·‡ï¯týYeÓíÚ{¦ŠD0ì S†‘׎ К˧ DÑa0fLðHÎ £'ó5—²÷e­÷6öß¼SŽ–ÛäKÉ%ÙšôM:³“l»]É︆ç<ô4ˆ§cm‘ÅÆÕ’@ì8î@çÚ£­Oh¯¯ë1X$²³<¢=á䌎3׸ª“Œœ¶DÂ3¨Õ8êÛþµ2ëÓ|9ðâÑ­¡¼Õ¦ûA‘ˆ!Ý€AêàüÜx dw±kðëöñ–Þk–-òÌÀo—hÇáÞº˜ãHbH¢EHÑBª(ÀP:; ð±™§ËüÎK[ð ®­}o$7 cg€ÖÐ@'?3 œº:â·ôÝKÒ a`¥w…ËNpXòF}OaZW—£ž•sÃö‘ZhqZǬ X"dž $ç>äÔ7š+¾×‘Ýóøñ¯2n<ÍÃn‡­.D§½µõêp÷ÞŸJ×m.mÙžÈͼ°\ùXù€<çœc=¸äž½ké·-¡ 4Äl„e”ÿO¯¥e:4nÈà ¤‚=ëZØŠ•­Îïc,>ž›Ù«]Üm[ÑE½íó„š |Ž%pb3‘ÈúúÓ`³’eY"ÛKŒ¿QžyE†©64·VòO á Ç$2Aód†M¸`p8àqÐô­ðx7‰R³³VüN|v=a.®ÿè£iq¦*À¶—Ä\nò¶J —o\üØç>•⚟‰õ­^õü’EÞ5¹ g:ô¬Šî†LíïÏ_/éuLþ*_»…×›·ùžÕ¯ø#JÖƒL‘ [²ÁŒÑ oä’t$äüØÎq×ò{þŸ×‘éàð0¡QU¡/vKTÿ5ýw.^ØKhÌÅu» ÙúUJéo –ïOe186UC{ã9ãµsUç¨QEQEQEqwþ2šF‘,£ò£*6Hào IÇ#ÈÇãžÕчÂÔÄ;S[¸¬e,,S¨÷؛Ɩp*Áx¥wmŒWëøtüGµr5ÍÔ÷“®eyd=Øôïè9éP×ÕahÊ% ;ØøÜex׬êAY0¢Š+ å4ô½v÷KuÈ^y…sÓÓ¯oÇ5Û[x‹JºÀ[´¶î+/Élž3ô5æÔW'/¥]ó=—êz8Lξr­Wgú¦š„ލ—ÖÌÌpJ¤“éÖ­W‘U«}JúÔ"Áw2*ª;G9éÒ¸'“$þóÒ§ŸëûÈ}Ìôùî ¶@óÍJNHÁF}9®[Ž¡-¬‚[•¤ðÌG•’3Óƒöük’–Y'É4$‡«;Oâi•¾*)©ÊWhæÅg3­N1²7ý~AEW¬x¡Eløo÷#Ô¾ÍháU-,û7ø8ÈÈÉ'ŒgÔö5ZÃI¸Õ/¼›nf„H¥X ؤà38ÉÆ{k'Z ´ÞÛšª‹K}ŠÖvsß\¤!fb g8è9ëZëàÝrH®dŠÌÈ #;w›•õû½>÷Ì8æ»›K(ôëT´‰YR.0Ýsžsïœ×_§A-µšÇ+Ù'øsÛÞ¼:™Äù¿w<Ï¢¥‘SäýäüŽkÀ^½Ð-.å¿Ú“\²þäÅîäq“» öú“U-´{Û‰aYãŠÞGh›£€¤•<J·Ey•kJ­_i=ÙìQÃÆJžÈùþÂóVÒâûmŒ·Vð™B´‘äFÎ9 ݉ÆNc^àWÌ:½ýÌŠ_s~ò_5®#tM¹Éù0QNzœ`àœ |âöžÖÙ³.×yµ„R®Ò®Œ:dÄ@Ü8í^—£ßZj:EµÕ‚ìµtÄi³nÀ8ÛŽØ#qÇëãñ ÒS„t—_Óúù[…Ьá9;ç꼿§£.ÑEáFQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEfø‡þEWþ¼æÿÐ x }$i4O¨¯©VF PGq_?jz>¡£Î!Ô-$Ý,2­À<0àõïdÓ¥§ÍçÔåxM-5)QEî:QEQEQEQEQNŽ7šTŠ$g‘Ø*¢Œ–' ¹  :^›q«êPXZ…3LØ]Ç`d“ì&½ÇAЭt 6;[uV/ïgØ¥9''†NÎržð%Þ“ªE©ê3F¯f8bmÄ3)qÆ8¶yïÇ=ý|Þg‹Ud©ÓwŠüϬÊ0.ŒJ‘´ŸäQEy'´QEQEQEQEQEQEQEQEq4¹u ÒK[I®.b¸ÚHÌUNîlªóþ5å—Ú}Þ›:Ã{o$²,d%Hàÿž„ÔWÐõÌê²ZOªÁt–ÖòËo²¼AŽAÏÐv÷Éêa3'B ›WGŽÊV&n¢•›±ã–vw…ÜV–‘4³ÊÛQ©ÿïÚ½wþ±Ð´´Qò$¼y–v0í ŒJlÎ1€RGlëwgvc# Óß­gÉ$’¶éœãcšœ^e:ë–+•z•‚Êiá¤ç'Ìý?áΛûNÏ~ϧ§È¥^@Êz‚„å\Õæž±ÒÙ_ÛNÞLÉ»0?NŸýz©uy©Û±‘>r6º)#è?.õ_DV7¬Á€ ‡pãŸóþzÖù@YX“•é‚@ü»Ð{%²„ mÌÇ,ØÆj†µi#Ÿµ»‘žzÿõëfŠçô乎’v¼\±##8_\zךxÛD›F×7<ï:])•dd*ÌFÀrs·óW°ÜEu½ZÖXÑAæ6^$“ž´ä·2–ä#J½6ýÕ<ò3õý¥ua1O >d®qc°qÅÓänÍu>y¹‰¥Æ5`¬øàœ}Näiµô,VmÑ[ØZÅ˶TŽPãžÈäõõ¬ÝE‡Io2;+[4D*J]†só9É#ñì+ÕþÙŽ¾áã`Nëß^z9‡©ÏŸœÍàð29è:ž·¨«–¾Õ.S{$p <ÖÁ9ö#ñÅz"ÆŠˆ¡UF€¥-sO8¬ïÊ’:á‘PVrm™Ó.t›9mî MºMêѱ=@9Óõ­”mŽ­´68a~´Ú+Í«RUfç-ÙëÑ¥PTã²:[]VÞá~v?ucÇçXwòE-ì²BAF ‚;súÕj+3@¢Š(¢Š(®?Ä>;Ò}.Ðà†2¢0Àî0>¼AÅvÝÜV0ç%bp3·= zàqë]8Zõ(ÔNŸÝÜåÆa©W¤ãWEß·õÔò§FÙJ²œ#JJéuMOA¸Ô`u±2§š­q*‚›Ó °Q‘–9#'ÔcêϦɨHÚL7ZUg`XàIe·šÖ³f&Y"„yǃ´g  ïž ö­ßø®Ý.SI°ðü‘E4Åäh&i|°HPÄ0èÐN@êqÚ¼Þ½Gá¶©¤-—öliåjm—•œcÏÁ8ÚsÎÕÇw u5åãèÓ9Tå»~oï~‡±–b*ά)9¤–×KËEêtÚž›$’Kt’.6îez[ØqúוiZ&¥­Ë$zu«NÑ®ç;‚…ôÉ$ û{JõxrïÃÖwêçÚ<·Ž‘6ß›¹ÉÇBƒßÒÌ•aýŒ]šÙ^§“”¼ELS¯$ÚjÍÿ^¢Š(¯ž> (¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š+Äúu¾© ÏopÝÊÊÀ ÊCA àã#èMlT›I!V X ìsU8µ(#8¸É]3Î.üe=‘{hžÜ†Çš 8Äïí\ÌþÕ¢p©s gtr·Íƒ^£8±¼³)ó¯ÏôÁ¿•g×mËKKß×Sϯ”á«;Û—ÓOøƒµ9# Ío?Àîr? GëXwòÚÎðN…%C†SÚ½f±µ/EªjpÝO1ò‘4A~ö ?{m.wí¶ò81Y$yÕ÷ógÑ[¾%Ñ Òf…­™ü¹·|ÎÜc¡ôçôëXÖöóÝΰ[C$Ò¶vÇ–cžö¯j•hU¦ªGfx¨NWJ[¢:+¿±ø[w5²É{¨Çm)çÊH¼Í£©Èç9dqÖ³õ/‡:Ý­ÙŽÊ5½ƒh"PË÷Y¸?Ÿo Æ8ü4¥Ê¦¿¯=å–âãgúýÛœ…íŸð€øgþŸùOþ*¸ïø B¸Ô ¼’fŠ`q ‰Ú–Éð1ž+9 ²QWM÷7¯”b(ÁÍÙ¥ÙÿŽcÃúLjuU²·eA·|’7D@@'Ï cß°æ½›ÃÞ´ðîž-­†ù[iˆÃHßÐ÷ԒxŸ…W-Χl[ȑȫƒÊ©`N~¬¿zey™®"£ªé}•o™ëäØZJН¼þAEW’{aEPEPEPEPEPEPEPEPE ÅÌV±—•ÀãÜýdk7nÓe$"€Xzž¿—JÉ©®§7W/1P¥AÛµC@Q@Q@GhØ21V85q5{Å`LÇ¡QƒùU(ª·¿¶¹ G ݺx?ý³õ=Fæ ¯*#媀s€wgëX´çv‘‹;cÔ““@pkrÆ„Lžkg;²NhŪÚKæìcÙÆ1øô®fŠéæÕ-!ePäŸàçÖ¨kº”_Ørµ½üP3_1ˆT° ÷ÆW du"±ê®¥bºŽŸ5£¹A 0Á#õtíι¶¹^nIrïfO “ÍAqó{ñÇ>ÔúŽÞ¶¶Š$¬H×b¤©•¯¡q½•Š(¤0¢´ÛM‰´Áu ¹p»˜cŽ¿×ò¬Ê(¢Š(¢Š*;‹x® x'@ñ8Ã)ïRVGˆµ5Ó´ÉdÙq2•‹ƒê Ž„šÒŒ%:Š0Ý™W© tå9ì—õ÷œêAä‰n³,JppƒÜ{æ ¢¯èÑÛI«Û-Û¢@s /xÁ û)?g ½l‚Œ}¥D–—™BŠôMCÃ:uê|‘ i@Àx@¿Uèzý}ëÔ|?§ÌTÂóD[ $kÝÈ `÷éšåÃækèŸfvb²Êø}ZºîŒº)ñE$òáäôTRIü5Ñ£vGR¬§HÁÒ»n¯c‚Î׊*{‹+‹T…爢Ìãn¡‡ùíC’NÍ‚‹i´¶ ¢Š)ˆ(¢Š)ÑÈðÊ’Äì’#WS‚¤t ö4Ú(Ü|%âOøI4É'’(ḅÂI>sòƒ»@'8ô<šÛ0Dg”@»Cz ò¿…÷7 ¯\ÛG´Á%¾ùA8?)Hã“󌎤ö½b¾GAQ®ã·Ëq¯‡S–û3Žñï…ÿ¶,Ž£h’=ýºm§>jg$cÔd‘ŽO##^𾓤®¥um4²³4l“¨òŽÖ 8ÉyçæÅz5GR4=Š?Ð%—Ò–#ÛµÓUçÜŽx-üÏ"âóÈû.æ=Xã©>µ%WwÜîI-‚Š( aEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPQÏ \BÑI¬9ÅIE`-´ºf§2ÈÁAéx ÇùU}NØ[^²®6¸Þ vÏoçZÚ¥€¹ÎLù¨½:îŸZ$¶}GMÍSàdúsìh¢”‚¬U{RPf»¦6­¦˜#`²«‡BÇ=9àö'ô®Á:Bi>Œ4(—R³™Nwá˜/>˜Æ¹îMR†?6xãÎ7°\úd×\ˆ±¢¢Œ*€ö­½¼ý—±é{˜}ZŸ¶öö÷­aÔQEbnâ»Ôü-¨ZÅ»Ì1oP«¸±R(§n?×’D†'–WT³;©'°¬+xrÚv†MR2ËŒ˜Ñä^™á”:Ú„js©SMµ®Æ‰RPp«$“ÓWc‰ø_ÑÕ5 !'È[m¬ |¾aa³#¿ùíÏ­zm³Ü±‘n#@TŒ2g ǽgèwº¡e:hmD­‰Þ?(«×‡\vö­+XäŠÖ8äÛ¹oËÓŽ•®6««YÉÆÞF9}G ¥Íæ¶ùQHaAǵÈv…Q@Q@Q@Q@Q@Q@Q@Q@ïn–ÎÜÊWqÈsŒšåÚGgc–bI>õsS½k›†EoÜ¡ÂП_z£@Q@Q@Q@Q@Q@Q@Mi$qÜ¡™CGœ0#·­CE_Õ,¬ûÐ)ÎGéT+nÌ.¥¦ýžgã?&:€úâ²'…íæh¤Æå<â€#¢Š(îŸ~Örá‰0·ÞQÏ>¢¯Í§A} ÜZb2Ãî‘…ôïO¡ì)|!¨-®¤öÒ`-È1ìÃ8{ä®+µ¼ŠYížZ52¥¤]ÁAÝè~‡¯CãIC‰³Ö–wjßwÌ÷ êc𷌬õæVNý·Û§Sˆð¾‘oªO;Ýe£„݃Äç©ñŠé|Qn“hWR3$`fÀ+ó àŸP?~¥E¦Ø+ªÈ&¥ó:ƒŽ˜í‚O½YÔôÈ5ke‚v‘U\81pGp}k:øµãËè©®­f²¹{{„Ù*crädg·Ö­[èz•Äé³™7n’2ª=É"¾Õ‚3jÇÊFIK•EÜÏ¢®ê:UÞ–ê·Q…HF lwõî:Õ*¨N3\ÑwDΧ.Y«0¢•Qœá±Á8<’*Üðφn¼E|ªªÉfŒ Ó@À#r«`ø9Ò©R4âå'¢*)Õ’„Û;Ÿ…Ö+w{»/q0LAÇrÍ×¶׺¯3ø‹éZ6‰¤Ú¶‰¼íÚ2Ì¡@b@ëó1>¤×¡éÖŸ`Ó-,÷ùŸg…"ߌnÚ gºWËc#ÏlEþ6ì¼–‡Ø`%ìï…·À•ߛԳEW éQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@C-¾ö2FÞ\åv 1œ ç§JšŠ§mu)­î–4—“iá‡ùr û$_k7'sIŒ.O Æ8©è¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(–Ô¤j30ÎmçØcúUZßÔ4¡93@”œ²çÿõëh%·“Ë• ¶3Š[i|‹˜åÉXޏï]h!”2Aw®6´ Öf†ÜE±¨Xöþ´»<¢$”ã ¤àœgÚ°[X½••Sjœã¹Ï皊ëR¸»ŒFûUs’c?Zv•j×jý"Ž{öþT¥©i?Û:RZ\Ý][ä)¶!”‚§‚ œô¬«èðÉ{‘y–W‘Ûîqå2+ îÝ–Îâk¨¢¶…z°,eda<5’çœSgšø£áí­–•q¥4Åâc+Å,€ªÄ'oÈã©èSPx{âL¶ mf9.æˆ!9þ,úñÎsšô›·ºDSk;gÇ ¤]5™o%RàºÇ þFº–;žŸ%xóyÞÌãyw%_i‡—'uk§ø‘Û]ÂÌ–ñDpcLìaë¹N0}±Å\2†R# Žõs§^Hë+¬{¤`A÷sëúóW,´ë«I‹…ØIó’?~?óÏLÔ¢©ÚI|ò‘u h›x*{þf¬4¢6ýæÕRÁPç–'¶1@QEQEQEQEQEQE5]_;X6p}(Õ Ú»ZJ‘¦÷e*q׊šŠã(§HJâ2J;Iî;Sh¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(Ο!ŽþÉp¼ûñýjî·nþzÎ(Wòpsúu¬ J°e$rí]&Ÿx/àq"®å8e‚ù4ÍQSÝÚ½œæ' ñ•#¸¨(¢Š(«úU©ží\† ݸ ã5V yn\¤+¹€Î2tö–‘ÙÄcŒ±·|ÇüúPôQEeøƒB·ñ”ÖW ÈwoŽEêŽã¸äŒ{ö<×—7ÃýbÞ ë‹Ï&-"y7‡ÜeÚ¬~P;½Ž½JöZŽâÞ+»im§]ñJ†7\‘•#d{WnV‚åŽßÖÇ/.£‰—<–«ñõ>s¢¤¸·–Òæ[i×d±9× áÁõ}bwÕÓNÌ(¢»/xB]bæ=Jñ6iñ8*AóØ»ƒü9êßÖ­ 0s›ÐÚ… ר©ÁjËðŒ´S¼7q¦SMª´äœœ“Ï÷<ãÑŽ“ ÚK y,ü†sÐŽ¿Îjôq¤1$Q"¤h¡U`(…:¾O‰–"£›ùmƒÂC MB;õ}Î9Ñ£vFe$ïM­ýfÕÜÜ䇌õÿë×5w’ÙÏ/²W•$mb89Εݎ™;+› ÔÅç–ŸlE0b ?1“éíW+Î-./¬µèÒîâhŸÏA>ùÈ}ãžF? Wa'‰´¤™b[1šA*>U÷,p1î+¿‚«ä­÷À<Ì&aFjNIA߯Wþ}ÍoìmyÄWQHþmÇ9_lŒuôÏojãµO Yéþ)‡Kmbí¦VfžR™ƒ®7q·“Œîàq^‘¢Þ,lmŸ9Ê“ëé\ý߀®¯Ø­ ‚ê8®akIãgŠáZ78ÚAÎHééJ6º¾Ã•ìùw'¢š¡Ã¹gIF1·^ôêC (¢€ (¢€ (¢€ (¢€ μTŽVYHòL…Ӄמ™­(!@$’SÞ«j›{\gqA‰ã9íVª®¥˧ʑ©f ±€9j(¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ ·§ÞýŠrÅK# ;õª”Pί,W6ËC‘¿8Ƕ?ÏOzÆ©c–Q@„•“g=r:^+R î?hcÏøŠÈDi*)f=5©a¤»É¾ê2#Û¥°Iü+Z8-¬Ór¤q€0Xý{“N†âÞTöœP£†(³åƉž»T Óê$šE&hG< û³SPEPEPŽ|BѲü@n£·¾Ì£žüc©=H=‡ÍÒ¹*öïéoªøZæ(-Ú{ˆ™e‰óyÀîv–ãòçâ5õYmmA_u¡ñ™¶PÄ7¥¯ùo<5k¯ÞÏ-ãn·µÛº æn ˜FÞ½~ÞÞ+Kh­ ]‘D‚4\“…dûW˜|,ŽàëÒ)o³-¸Yî7–r;œç·>µêuäf³“Ä8·¢¶s&§†SQ³w»ï¨QEæ¹ ÔêÙá,T0ê;wª £G´ÀþúVS°‘Œß­jÑ@âÂÇ_4AE Áq¼c©õç#>ØíXðÛÏrå †IX •Kzñ^Ÿâ5=NÚÝö­ÒÙ÷–7#~1ÆAäpTÒnyÿëƒ]†~ÒæÞf,ü•f=G§ùþ•…VôÍßÚ0ìÆrzú`çô¯¤”ää•®}(8AE»Û©ÔQE†~¹mqy¢^Ai,Ñ\´DÂÐɱ·ŽTnì bkË< ö+/5/´Aqm»k6ÕŠ.[Í-ÊòTsŠö:ñrÄ^ܾ¿´‡NÔœ­»´±BRbHùÆ1Œ«pA-œ×­—Kš¢ôO¯é÷&kJ”ëÅ]ǧ—¾Ç³Ñ^Cá-oþ]Zk9áŽX¯&Ž?µ vÆ]”Ȥ™rO|öÆÕUÈN‡Œ°éǩɨt½^ûE¹k>&VCmŠÙRAÆ=À®·Tð¯ö–£-ßÛ|¿3/•œ`×>ÕÉM¤jðÍ,Ö²G$fœqëϦkêðØŒ=Zj[+¯Ó]Ï‹ÅáqTjº=ÝŸë¦ÝÍ›ÏkWú4ºmÃÂË*íyÕ ÈFsŽÇ9³á¿ÞÝêVÖº¥Ý̯,è‰å¤aH zû‘ƒÓŽx ÓÐtá©êi€Ñ ß"–+•×ÿ®)â0¸uFWŠKrpØÌS¯Y6ö×õ=öŠçtÍ@Z¹I™ŒDqßiÏòäÖືf ·N9¯“>ØšŠ( Š( Š( Š( Š( Š(  [Oó]E÷€Ë‚zÞ°«±tY‘†U{W5`öRde¢cò·ô>ôNŠ( Š)È#E,Ç &€E>He‹dn™é¹HÍ2€ (¢€ (¢€ (¢€ (¢€ (¢€ ²Ú…Ûªƒq&``ãóÇZ­E¿¡£‹GbNÖ”có9ÿ=+šy’$f8×GCÇ…UP¨¢Š(¢Š(¢Š+Çÿ¯Z–I-Œ/&wïßÐ×=zεGR]Nœ5Ф©GdY¢Š+#p¢Š(Œ½×ícø‰ka4×)å,Q±¤uÇ%~fôùˆì3]|ð¥Ä-™ÚÜWãï Eyg6³g/#ýåÆd8xÕpN˜ã=N*ÿ„¼gk®Å”ìÑêKÞLGR¸ïÆHÀÆxÈ×uZÕ¥ÓGëÜóhâ%O:5ú»ÇÍmoRkÍ9¢¼[‡“r†ŽqÍlYi°Ùá¾ü¼üä!Vö.ýûFücv9Ç¥:¸OH(¢ŠæüO¨Ï/üSÚu¿Ÿ} -‘œ©v?˜ÿ€3êzŸÁO£#4²Gh±ÆW ]нx•Ÿ^õ›á¿húLjµ ¤0^;~îà¶^åd£§oÔã‚koÄ“Ý[øvù졚k“HÖï¾]Ã9Ïá]²S¥8RJÍ4õïþ_Ó<øºu©Ô¬ß2i­;.ž¿ÒÐñ¡ ÞǦ]Ý]äP¸R÷%’Bûr#TêK‘Œ ä ״蚘ÖtkmAQPL¤ìV,ŒdÏŸLŽkÉ|Yá³ Åe4×s\\Þ´)•@+§²Ùc““ŸÔ÷? mç·ð̾|2Eæ\™z•Ü¥ 3ÔZô3Z¸uZ÷×OÉþG—•óPÅJ‡-´×¯šüØÑEáHQEQEQEQEQEQEQEQEQEQERí;H3H›¶.üoÀÝ·¦}¨ÔQEQEQEQEQEQEQEQEQEQEQEQUïn–ÒÙ¤?{¢Œu=¨7_#uºäd$~UO–i'rò¹võ&™@ax»ÎþÂo+îy‹æôû¿þÖÞ•»Uu+A¦ÜZ ‘\’n ñïŠÛ5N¬föMb©º”'îÓ<÷JÑäÕüå‚x’XðvHHܧ9#œvï]NáÉô«¦¹žå )åÆ28êHöì=9íPxoÃ÷v7†îì˜J‚«°;óëŽ1íê=¹ê«ÒÌ1ÒrtéÉ8¿ësÉË2è(F­Xµ%ýlQExçº]±Ôd´p—‡¡Lô÷ÓW]NŸ4ÓÚ$“&Ö=÷‡­Z¢Š(¢Š(¢Š(¢Š(¢Š(¤ 2•`#ô´P-ƆÆBmäP¤ý×Ïz•4(òÈ[¹µh  ¯ì(7çÍ“f:qœýkF("qjƒ¿_Z’Š‚òØ]Z¼G#*OcÚ°æÒe·å–X¨Ï99éÒº:(ŽthÝ‘†I{Ójk¹L×rÈNrÇ:véíPÐEPEPEPEPE«§i^z‰®2#<ªŽ õ¨mÉ“72.21}=ϽlRB¨€jZ(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š+…ñÞ¬½äZÎ-Æô„[˱a&ÝÄ‚6òÃ'‘ÛóÎ;ª¥{¥ZßÜÚ\Ëæ-Å£ï†HÜ©\‘¸z@ÁÏbk|5ocQLæÅÐöôœ?[_שÃxÆ©å6­^7™¸¼77pGuf=R =ñÆ<¡i>‹¬ÏlD–ÖbLcƒò¸ôÈÁZÓ×ôÈĪ[ZÉj¦ò[k›fde‚`wmB¸ÊàñÇO'" mHkŒ‰¬Ü°ž8¼¸oX’HWP¤°'Ѹ“»€>’8ÂN­5¤·^kúÿ#äëÕœá5_½Ÿtûþ­jÑ®%»Ðôû™Û|²ÛG#¶Ëœz»X>¶šÓ@ŽoÖú5r •J`m=øéÚ­xU}@»Ô"‰d’%UŽKû çÝ«æ¥j®êô>º9h)ÔÒÊï¯O#R¼ïÄÞ7±»µÕ4È%%ùi$Dþø‘ÎÇð{:q\¯‰<]uâH-¢š…abÅcsµÉU ÷6=cÔžv½œ&UËiÕzö]5< ntåxQZw}n»žÑe×µU³„¨!w¶âÊ ‚27m§ÜŒ~8Þ-áû=´Py’Kå O2VÜÍŒ±îOzðï j3éž$µ¸‚Þâçï+Áo’Τð:ãïcýžÝkÓõOi:CAÄwFyb4ƒ|9€à‘†ç§ÿ[1šS­R¬aubòj”)Q”æìïÿ tWð]ÀÐ\ÃÑ67G"†SƒžA÷§GCE*FŠQFÐØW)}ñ GŽi“Q»wTŽÞ8Ý }Jÿ Nqõ|c«ê?†>Õk˦tGxþu‡<“Êò26òÞJóµã +]é}aâèrʤ]ùV¶×ñ:J+?DÔŽ±£[j ÂfRÞZÊ$’:ŽütíÐò+B°”\dâ÷GL$§(ìŠ(©((¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š+[šáaÈØ£vî}ÏzÞ®{Yœ½Ù‡b69Î[Œ„§=/ýÀû5ÀN¢u!­µóóÿ?¼£áoÙi: ²¾µe0XE°,\–'qÀ9ç¯ñp蚥‚jšUÕŒ›BÏ f]ÁI6=AÁü+Át«T¾Ö,­%,#žâ8˜¯P€8÷æ½ÆÏÃö~£å¢4F+O²$JFÀ›·g¦Kg¾yúǪ̀ңQN.Òz†S^µzNIÅYvþ´<*òÕìo®-%*d‚V‰Šô%N=¸¨+Ùui:¤¾tA­g’ãÍžUfc 9,' I9Î8ÇJæõ†s%Ì ¤JÒG#?™%Ë€".Ðp2I;¹ÓÓ'У™ÐšJNÏÌó+åšm¸«¯"†<¨óë-,~S£[¤jAlåI'û½“œð1œH¥,EJ“©ªÑ|¯§Þìuâ©ÖÂÒ¥N–]¿[k÷+þ˜ú¾Ÿsy«x‡Ciî^T[sem’¦CîåNí \’{ZxÆ»s´e»vÛ_S»ÙÊxd©Þq–û_½ï§ ßA©&™a£è6÷]oóìc0Bª²7g –9Û“ÓžÙæ-|qâx|Bm'Xn$k ÚU ÛñµXt=$Žç5Ö§†5k+½:âÓÄ7Ó˜¥_µÇw1d‘?‹hç®ÏQÈ#œŸ|:—QÖ./téá…&_1’Vc™K|Ý G=ùãt×W —³©fµÖÚÞæ8š8¦ý¥$ÓMhšµ­Óõ¿ÜjOâÅðì“[ë‚òYÎ$GŽÜ˜•MÉdn I9lpI8Ά‘ã YUݬ33\ŽI$9ÃŽÄõäåž±gszÄS#¤KEù]Š‘Áœw<óšÏ·…®nb +„ôÉ8®ŸìÊ3§Íͯu±Éý±ˆ§W“—Nϼú2Šåmïîm€ÈvçîžGÿ[ð­Ë E/Â¥e –Ò¾tú’é!T³$ö¥¦ÈcXØÊT&0wt¬±p¶Ú‘†Ü»FX+ÇŒªdõµ³H@e*ÀF=袬ßÛ‹kÉ#íÎWŽÇüãðªÔQEQEQEQEQEQEI/q2Å71ã4ÕÁ!–Þ)t qî*Jlqˆ¢H×8E 3íN Š( Š( Š( Š( Š( Š( ¹ ã’)äIr\1É=ý믮oX 5,A^œŒŽh…Q@Q@Q@hèÒ„¾ ´"‘œôïý+:¬Xζ÷±Jßt`xÍutRC)GzZ(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢ŠâüQáBe—WÑ­a]AXNÎY²>lÇ3±ÆsÇ2I®fÓâˆ4«×‹V‡íÆèfŒC"q‘ŒŒäAã¦+Ö¨®êxÄ¡ÉZËñûÏ:®N~Ò„Ü[lþZ~'™§ÅYÄò™4˜Ú#-Vrxç'<û {סÚj6WûþÇyos³¼™Uöç¦pxèk6ïÂ½ÙæéVë³8òA‹¯®Ìg§zÏo‡š»K‹qulÈ¿*Ã9ÀnpàœÀàŽqÀã®j¬°uåN/ïýI£ }&ùÚšûŸäuu¦xgMÒ%¼*Û]D‰$ —òIbr`1íï\½ÇÃH£¶þÙuzѯú-¿˜±arIRÄ0Ï>€g=3ÄÑe—í-¬êæ—¨4Ë ÊnÄktÜ„ Ä|ÄF2{yÀ(IÓ«§]>í/qJ½GR*¥u³¿ß­­¯kÙi‚ÖÂÝa„1m ’I=É<“õôYj–“L¶WpÜX,žS†##§QïìGPkË'Òc½ÕÅ—…´ÍñDëÕ|ÉN$\}à„€>«ÔWy¡xJßHˆ}¢êkùC+/žvŒ¼+"€ÁBŒò@`qJ¾œ#Í9·'ÒÚüõšea±5jK’œŠë}>Z/Á4ijÕ†™iyq<êÂÑTÍd3®ïºìNF3Ê¡ñ-…î©¡\XØIrÏ…/$Œ€.rzœŒzô7fÓí.$ŽImãfŽa:’?å ]¡©ž˜‚¬×,g8Ê;£²P”Ô£=žš^IoÄ—aM²ÄÍ0eÜ6ódwÏáËnž&…-$i-–ñD.ÝY7ü¤ð9Æ; ÷[û ]RÊK;ȼÛy1¹7Î#Aêbßx+H¸ŽÓì¶ñÙËk":IrÀßÞÈIÎyõ³ЧB2R¿½÷9†®"q”mhýæ}:9&Ê1Œqè}EnYi‘Ãt]nRSmtØ S€FyàòãïRê–?j‡ÌOõ±ƒ¼=?¼ãÔ+%·Œ‰IŽJ|ÊÞüþ~ÖÆ 0|¥;ˆÁf9&²m¯nìaÉò—R¾øÏçùÖÊù²ù2n1¹xÊç93Û·–=E§F_*Ebž¹ŒŸZµEQEQEQEQEQEQH $:žô´QEQEQEQEQEQEQEQEQEQEQEQEQECV´76»‘I’3qÜŸJæë³®fûN’ÑÉP^¡ñÓØÐ*(¢€ (¢€ (¢€ (¢€ (¢€ é4›Cmk¹Ô‰$9 ö‡ùõ®v7ÊŽA!XŒþ=«± Š( Š( Š( Š( Š( Š( Š( ¹Ý^í.gTŒ†HÁ‡rzþ ÞžQJA;œõÈPEPEPEPE `ª $àÞ€;¨U0íKL…Y ]·8Pç98ª÷Z½²¶\<ƒ "œœûúP5 CìO €qËú…úž•z¹ æ{‰šY1¹8®ªÛwÙaßûvî¹Çz–Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( ííà´`¶†8b\íŽ5 £'<ïRWžxÃÇ«K¦èÒfSÄ—hÀ¨RýÙóΠ탎yn‘âÍ_EûWÙ®7ý§,þwχ?òÐgø¾¹¸8éÒË+U§í³}Ï"¶q‡£SÙ¥t·k¡·âÝz{oÝ$ž Ö‰µ^k£V  Fáׯr1Þ³t¿kÚ^áö¯µ£dí»Ì˜nxÚΫ© 5vßÞ{/õíSÄ—wñÂ"Ž]±Ï ˳8ݵIÆ{t®_ÀPè0ÛJúMä’\\"4öóH FTrÚ¤€_±ƒS|EºKO†-q,q&:>ØCúWÎU¥âù"¬›ZZÇÔÑ­*xi)]¤õ½ý O†z£Ý_jñ\Ü3Ï;-ÎÌpNNöpYOJôjùóJÕ®ôkÁug&Çà0ìê6ÓߨÎ1‘Çzú¶Íh{:¼ëi~–1ÉqÒƒ¦÷ëvQEyg°QEQUîçku‰” ¦EW'¢©ïí@(¨­ç[˜d+gõ늖€ (¦³ªcsÉÀÉÆO¥:Š( ‡VfPÀ²ýà"І{k†Ý,@·¨È'ò¢€,QEQEQEQEQEQEQEQEQEQEQEQEQEQEQE—}¤G*´–à$˜ûƒ…?àk‚¬U{We\¶¥Q™Fp[w>ã?Ö€*ÑEQEQEQE-¼M=ÂFЉèÇñ®º¹Í"ÛÏ»7Ü‹æ?^ßãøWG@Q@Q@Q@Q@Q@Q@Q@ï–G±™bûå}3‘Ü~UÊWg\Χkök¶Ú1üËè=Gùö  TQEQEQEKoo%ÌÂ(†Xþ@zšè,´È¬Û~L’cˆéôiƶè˜gÎâNI â¯Pd."s ÷=«$³bI'$žõÖ\Ü%¬ +‘Ààg©ô®J€-é‘yº„C w;cŸçŠê+B„m–sŒç`þgúVÍTM6Û…‡ÊîÞåSøRÂ%T"gVmÇF8Ïçÿ×@QEQEQEQEQEQEQEQEQQÜ\AiOs4pĸÝ$ŒFN9'Þ¸½_â]…Û[ØÚµðF*ò‰!é÷Náמ:qkj8zµ©«˜WÅQ ¯VV;Šó?‰šöùâÑ­¦þ{¤ Ä€Pg¾>œŽãŒKïˆ> ½Üæ;TdØVÞ0=yÉËÏb:W1$4¯,®Ï#±fv9,OROs^Ö ,•*Š¥[i²>0ÍáZ“¥E=w~Ch¢Šö(¢Š’‰íüÏ"i"óÆû®å=Tã¨>•{TÖ§Õ ´·h-íí­¤0À„(ÉÉ<’I8ÉíêNsh©p‹jMj‹U$¢âžŒ+è G›ÃÚd²»Š‚ÌF–Ë{~BU‚’@nãžzÔôÔ@€Æ דúæ@\;Ånï†p2Æ©Z[=ÌÍsyß•1•|®=€?ãZ$R¬`ƒÞ€¨U0í@ EPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEP\έÿ!9¿à?ú®š¹Ýi ßç î@zc¿”EPEPEP‘F ŠY@MjC¡Êñî–Qgîãwõ«Z,P‹_5Fe$«“ÛÛùVV²³K8v.‰Ë>1š³EQEQEQEQEQEQEQEV^ºØãl ‰0àkRªjhϧLdàÀMrôQEQEQZš=œW $“!`„mÏB¯o΀/h¨VÃ<üîOôþ•£HU  ©h?Y~ž[8ØÁ¾½¿­s•ØKOŽE܇¨Î*œZ=¤M’­!È#yéùP›H¼‹H£Û´…Ï=ÿZšŠ(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(Ìþ*_n¹ÓôõiÄiÜgål«ø­ùûšóºéÇl#-¹‰ÜǶ}ª¦•§4é HFHû£×ëZ´QEQEQEQEQEQEQEQEQEQEQEQEãßmRßÅfT,ZâÝ%|ôe8öÂÖ¹ ì¾&\E7Š’8Û- ²G Áù[,Øü˜ƸÚû þ¯ ö>0·Öª[¸QE[µÒµ茶–W†Ú^(YÀ>™¯"º\”UÙɹ;%r¥×Úü6×î"/(µ¶`ØÙ,¹'ßå 1øöªš·µÍ" .$†9íãMï,¸(Ï<7OÇã\ëBRåSW:eÄÆ<ÎÞ‡7EWIÊQEQ[>ðýLjuT·ìèÁ®%>¸?1çúQ9Ær“ÑNœªIB í×Âý6âÛM»¿”(†í”EÎIØX}N?ížö›i IH©(UE @aN¯ŽÄVuªº©÷xZ F4“Ø(¢ŠÄè (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ É׊ùŽ7n8ãœc×ò­jÄ׋o€mù@$6zž8þ_cÑEQEj->êx„‘ŹC¸ë[ú} ´µU*Œ2çßÓðªz˜a”±&0@POòOˆ­j(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š­}ln­%Û¸T·nýuŒº-Û3娂[¯ÓÑQ@ߨôóÿÿúõn×K·µmüÈø·cêj½EQEQEQEQEQEQEQEQEQEQEQEQEâÜ=ÂZH±Ü´L!v诔žÇcSÑM;;‰««áŸ>¯$7w—wÂŒ3«ôù‡ŒcOñŠê4¿…¿yµ{ïP©iø`–aõãœö¯H¢½*™­yEF:zM,› 9Nòõþµ8/ᦛes÷w^ð|¶@±³dõäcoêrii IH©(UE @aN¢¸«W©YÞ£¹èPÃR ­J6 Žá<Ûicò£—ròå8WÈèÜ~Ò¤¢±Z5ucçûÛÓb{k¯955”‡n4ç9=Øü¤cŒäç>½ÎïAÓl Ôõ=.¯åŠY1"LŽU¸“€Ù …ÆsŠðé#xex¥FIв0ÁR:‚;úÌ-b·Oëî>+‚xV¯×ú߸Ú(­K? ëWí·Òî™e]ÈíT#ÎãŒ{ó]’œ`¯'c†”Ý¢®?ÃÞ»ñ -­†È—iˆÊƿԞÿÐ=ÊÎÎßO´ŠÒÒ%Š—j"ôâ}ûÕMFƒAÒ!°·ìË<…@21êN?!×€N+J¾[Œx‰Ù|+oó>Ë.À,,.þ'¿ùQ\¤QE…§xžßRñ.¡£En´\‰³Ãà€à‚1Ç|àŸ®Ü’$1<²º¤h¥™Øà(I=…y.âk{ˆ-©I|ÆÎH„3Ü482íŒ Û@$èã]˜L?¶ŒÝ¯e§©ÁÅ{ SW²o_Oëúïë”Vn‡­A¯iÿm¶‚â(‹”_=–Çq‚r3ÇÔÒ®YEÂN2ݰœg(»¦QEIAEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPTutVÓ¤$d©{ãúÕê†ñ<Ë9—nâPàc<ãŠä¨§ÈÁ#8=?¦~„S(®ƒN²´’Ö)Ì!œŽsœÓ¦H¬›¹;WÚòqÎ1ú×N›¶.üoÀÝ·¦}¨DXÔ*(Uê( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( ¹¿É£Å&˜úÒY›e™›3oi8^*ƒ‘»³òà ‚HÇI^sñÇVÕµ>ÒÏOšxR,¬‘ÆH킺…^¸Æy®¼ë$Ý–ºíÐâÌ*8aÛŒnôÒ×êkß6&¢“h±é7Zôíˆ3ó¦Cgm§€ËnûÇg¥uõÇx'Áë¢À/ïâÿ‰›äb…rG2GCŽ9ÏcKà¥É s%Õþž_ðGƒSpö•"¢ßEúù÷ùQ\§`QEGqq¤ =ÌÑÃãt’0U8äŸz¾ˆM¤®É+7Y×´ýØO6ÍùÆ£-!8úœFHÍs:ÇĽ6Ö-šR5ä̼;)Hׯ\òH8ãƒÖ¹ÝÂÚ¯Œf®­{ µ»)`Í Þrª3òwvÀÈÀ5èRÀÙ{LCåâÏ2¶cÍ/e…\òü«4¼q®EªiúxÒ59 Ò»Ã%•»’ÒÀ!¶’À†ÝHêxcáÜSY}«\I’m1Û†*QrÍî@Æ;{ýÞâÏBÒtö‰í4ëX¤‰v¤‹Þ8ÇÞêN;çšÐ¡ãœ){*.ýG¹T¬ëb,ßn›yŽ4†$Š$T*¢Œ °§QEyç¦QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQE„¤A#¨íKEr¬i<‹%ˆœçÞ£­Mmn#8QS·sÎ<þ5—@ZM´3LæÄˆÀ¬c‚qÎ}û×C\tq™eH×v 3ï]t1ùPGs±Bç×€EPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEP'еÉü?£Ø->ÐÛÂrHXò°:guë^KÿŒ/åâúTúãÈü3·Û$w5í×Vv·Ñ®í¡¸Œ6à’Æëƒß“S×~<=Ø^]ÿ¯ø›‹ÀO?zmC²þ¿Ìåü/à«O캕¾Ñ¨ÃH~ìdõØ1éÆO?L‘]EW%Z³«.y»³¶taÉMYVû¯öŸö•þ—äùfã÷7nÆ3޽ñš³EBmlhâžáERQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEå°ºµxŽ2FTžÇµr²FðÈÑÈ¥YN5ØÕ[½> µ%”,„pã¯ãë@ý„ÑAy“((\gõÔ#¬ˆ®§*À}«š¹Ó.m—s(uÇ,œâe©Ëf»0$9ÚOO¡ ŽF)º©bªHQßÚ¨C¨ÜK:Äld\‘’Oݽ=[¶¸1yŠ’ ÏÆ3ïô©¨¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¬mþ]ÿà_ÒŠ(fŠ( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( ÿÙdibbler-1.0.1/doc/dibbler-fqdn-srv-update.png0000664000175000017500000021521412233256142015740 00000000000000‰PNG  IHDR«a¿¤7sRGB®ÎégAMA± üa cHRMz&€„ú€èu0ê`:˜pœºQ< pHYsÂÂnÐu>ÿyIDATx^ìý|TÅþÿþßßçŠ÷ È•"REED•&@°€Ò¤K/Ò‘.½—ÐC „J ” $„„JB ½7?ÿWœ;÷œÝÍn²åœÝ×yÌÃDz;gÎÌóœÅ}23ï÷ÿïÿþïÿþ‡ €/€ò     •@¯^½òäÉcíÇpÁ‚;wî|åÊB#0ÿ1]Ùa    — ´g"Š8nÜ8—ö„“ 8 ÐéHÙ ˜›@ãÆí1@Q§dÉ’AAAæ0{O¾D€èKw›c%   ÌܹsÇÆúOkfX«V­äääÌÚæç$@ž'@ôü=`H€H€H€HÀ8BBB¤æ=õÔSÍš5Ë;·x§F3fÌX¶lÙ?þ¨WÁ§Ÿ~»¹9Ð8·’=!‹h€|0H€H€H€H€þC!^¤Ý•+W.**jÏž=­[·† âýgŸ}šwüøq¬ü¬X±¢Þ$fÚ´iJ$`X4@ÃÞvŒH€H€H€<@ X±bÒëºví <ðø®Y³¦ø¨hÑ¢³fÍ:uêþ[¤H½–)Ss‰è=/I$`f„ø9 ø ¸¸8UçÖ­[' ðàãcÁ‚o¿ý¶¨óé§ŸBó1+˜#G½"¢LZZšÏÀã@IÀh€æ¸Oì% ¸²;H‘Ãd ôOc€‡ýúõË—/Ÿ¨Ù²eËØØXL~ýõ×70ÑeÜÐy^‚HÀ4@{(± øªU«J‹C kÚ¢E 1õ‡ÍªT©R`` j€À#GŽÌ;÷å—_ç~þùçˆzâĉöíÛ[ÜئMnäG$@ô |^šH€H€H€ DË>¥"õßþýû…&%%Aü°ÔS|úÃ?` ¨˜ˆ#&&¦gÏžðFTÀD"ôAe ‚ȯŸ DÆùáÇss î=»âKh€¾t·9V   °Nb&m á[¤^ºt 'ùùù©3„Ý»w× $Ê×´iSQ­@#FŒHMM (Uª”ÞibÉB$àf4@7çåH€H€HÀÄÇÇW¶r ûû˜Qç­·ÞBJ x lN¨÷@ÄžÁl¡ñù°‡$à5h€^s+9  p¸þ§¼Åw` .´Ö3Ø¢8 ªuSoâ\‡†d­5Ûȱ8z9‡úfüʘô“w°\¹rÀ" ðرcè<$PdŠŸ8cQdìÙ¹KÖ•~çIÌÏòå˯X±ú' ðèãcæÌ™… mÖ­[«F!ÛHañ9éܹ3âП{H^@€è7‘C   w°ßÅÏ}kÓk4@wß9ë×±^ÄÑ®];i€˜¾ÃIˆŠ÷ŸÊ‘#ü@òþØTQþ=-o¾'Óz 6ܱc‡˜ˆ™=ÄŒùí·ßrçÎs±9°[·n'OžÜ½{÷'Ÿ|¢÷@¬AE6BãaOHÀ[ нõÎr\$@$@$àBÒ1Y'TAs` !~î‹©<hmÝ&ç]xó,5œœ¬*ÙâÅ‹¥Þ¾}g 2ª~V+êhªZ"&·j×fˆO¦K—.H / ˆ)D„ùî»ïDûX:}úôsçÎ-Y²äÕW_Õ{`É’%ƒ‚‚Ü<|^Ž|Š Ð§n7K$@$@Î!  í1û'åÃ÷ì¼< ÐNPΪ6mÚ4y›^xá…ÈÈHa€Øã‡K}û9x  ȇ —Àž@ñã^ojÙ› ­ 2ChÄX*Õ¡šê.D´€?¢úñfj€¢“š>àk‹ZňpZVO´ 4k7%Ëgaßæú„bGÖ¢YDòD…6í»Š?gOÙ{8¥c×¾¹rgdGƒAæ@i€ ˆˆˆ/¿üR\÷Å_œ?þ… ðߢEŸØ£ QjŒ¬ÐY&ÏIÀ#h€Á΋’ €¹ 8j€Öêg T¦•Z¥ •~:Q¶&…S–>åƒm”©éƒÅ§¢“èƒz®Þ~ó´iÓFêÖÇ ýˆù:t‘`òæÍ‹ —oŒ>~Þþ²-ìÈ·ß=YÞ™/_¾?ÿüSÌ L|| Y|Ù²eÅÕ?ûì3ÈçéÓ§ûõëgqs fÓÒÒŒÃ=!“ šôƱÛ$@$@$àIŽ ú*åMMþnÛå´áš5kÄh‘™@ -£™’­‰á`"“´ ;€IE• ” §™u„|ÊôóŠâBò¿¨€ŽÙ΋èÉ{ùÿ'ý‰£ÿþÒ1)‡ŽmݺïçË_àpÂù,”åk·•¯ðdy'¦ò–/_®`ÒãFåæ@è(Ì)%ôs¿èV«"o!–­z–¯N¦&@4õícçI€H€HÀ3²c€ê‚ÏL …m„šAÊ)>Ë©ˆ×š³`ƒRUu´f€²5k™â¥jDT^ô÷Ì ³~U‘èOPei€÷îÝÃyí۷ǧu¾i|$á|–Ë„©óäæ@,þ s€ÂOœ8ÌmÛ¶•›‡šžž¾iÓ&D U»'^cs ¿¿¿ÑH²?$`4@³Ü)ö“H€H€ DÀmh-rŒœa“³| “©³¡5¡êêMkhQÕ{`±5T'ÚöƳ÷SjR±J”(±oß>a€H瀎ݿ¿téÒ¨0aÚü˜Ä Ù)Q±§{ö"6Âô:v숉>i€@¤@²ø5jˆþ 3Ë–-ƒ" ²ê=°bÅŠØLèYz¼: ˜‘ ÐŒw}&  pÚ"§Õp,Òm$”ê( Z4@,UÊamPœ®oÍÚ›¾aÖ/’rÕ²eKi€B­áBØ=›t!ûeÏÁ„¦?·WÄÊÏ &ˆ9@a€8Nž<¹téÒâÅ‹‹:_|ñf)Ñ™=zˆBÍU£Ühا‹3& 1ï {E$@$@†&à´a_Xx©ŸÍ³¶¦TE)–nÂÜää¡E„CŠö±ÐTäF·xè[3—"Ùƒ*TsçΕxóæMŒeÔ¨Qüñ§GO\tbY¿5mŠK#ÌÊ•+U„"!v$"Ž(*`ï_çÎQ*X»vm½æÉ“gøðáÜhè¿2Ø9# én°/$@$@$`î1@ý^>‰Ç¢¶ ´tAnÞ“Ûm4¥— k福ÅÄ íÉCƒÜg???9"ü„þ Ä®<ô© >ùäTèýûиä‹N/3ç-{¥ø“4_}õ.-æ…â@æ@øçùçŸ;vìåË—×®]+¦jijAzƒ€e7HÀÈh€F¾;ì ”€£˜µl4@Wß~äW…-Òab¸ôùóç‘¶í>p,9ÝEz™ûï̓ÌÒ‘)æ{«V­*ú ÷Û²e <6hqs jbªÐÕÜØ> ˜š ÐÔ·'  ÏpÔmd„¿ìÕ94 I¦Ô³6<·Í¢ç6VÊÔ~šeË&±~R ÂoJÄêPŒXð)¦éâO¦»´DNú©ù“œ„Øós€Â‘!Ç¢E‹d²øúõëc£&D«C-ÎÊâ}1$@z4@>$@$@$@pÔexLMŒ–L3Â[뙌é¦ã³g ‘`ä>@‹9ßmó2‹ʽ”(Ìõ ŒŠŠÂúOŒñÇÄG-Ûv‚þO¹äê²iûž*U?F÷æ›oÂ?Ulœ3gÎÕ«W=Bï%K– röãÏöHÀÜh€æ¾ì= x„€‚„¾¡¦œTçëì1@ü ×$[g!ͺÅ4 Ò5™â%"YAíI¦ù‘$Ý"d9‡¦1U³Ì"tŠT¦.]ºH¼páÆ»k×.|Šô}qÉK@áf §P.»§ þclþü9‘¢]»vÈ( “ߺuk¥J•DÿË—/?ÂôÙg3ò jŽZµjÅÅÅyä›Â‹’€ Ð xSØ%  0:{ ;µ0S'õÏ✘í9@üŽ·x–œÔ,Ñ”­áD}J@颚©Hk([C}Í,Ÿ¸=2¬¨&b) ±^TMZ½zµ4À»wïbt¿ýö*ÔkÐX5ÀÄS—O»©ˆMnÓ®³ÈˆÍ°;1( Ò"–©Œƒ‡³—X8Ú¼ys½"¥D¯^½¸9Ðè³°n!@t f^„H€H€¼‹€´&!iúCŠŸø-Ž?Bõ 2]*Ú—³p˜v“Þ…61¨¶© NÄDŸHú‡ÿâ#Ù%°Y3@Õñp.Î’)±ÊTvC都0@ì‘“šôÒK/Aÿ„"~ÿþýråʡ˜ 35˜túrÒ÷•‡ª×úBtµT©RXí© $cp£…(bpàÀa*ojƒ œ6mšw}9p˜ Ðad<H€H€H@5@ý|‹út“3U“m ~Ù«¾§Z¥Åy9™PÝyˆšê‰úÈ.6 P•@ᱚÖÐ=½ÙšÂe~Œ 9!¤¯0êÄÄDq÷JÔà‰3WNœukY°îÍRO6bI'z+æq  Ž#GŽÔ­[WôB»dÉ’ëׯã¿/¾ø¢þù|çw,®.æ÷š|„ ÐGn4‡I$@$@Î$ VTÚ>`Gê¼™ÅË‹©9½Î‰7Ådº”Th˜5¥”­á,LjfÔ¹Dµ3r,6vª)g5õÛE³¢óÖZsæmÈj[X ‰U‘R¦N* P¸º˜!,_áã'þ?û± s€0Àä³(CGü™¿À“ÍíÛ·G6i€˜÷à/bêÇG}„;‹=˜´¸9°N:8=«y ˜˜ ÐÄ7]'  !€ üšÇÌžÅýx6  >VlbÂÇâT‡è¡´f1ø§Cí¡²¿¿¿Ô¿\¹r!è‹0@‘K© ¾úê+TèÒ½Ÿ <™zÕýåð±”¶í»ˆÎc –tŠ9@a€ð=“&M’›E»1¥Ù Aýd 4¸ÿþÈ‹h„›Â>€ÛÐ݆š"   ChÖ¬™Ô¡êÕ«ïÙ³Gà‰'Ð?Õ„¢Âú-á¶ 0%íªGÊöÝûª~RM A‘ÉP5À‹/Bù:uê$6"1àÈ‘#oÞ¼¹}ûö÷ß_ïH)õ¢†¸1ì ¸… Ð-˜y   0 H‘¡ßÿ]à¥K—ÐÇ¥K—âÓÂEŠÆ&]ÌÔO»æ©2Ëoq‘¢O¶ùµjÕ @Å Gzzúj×®-Fúúë¯ÂçÍ›åÓ{`… """ s‹Øp!  á²i   0xŽê?Ȥ' 022òáÇè­H¶ÑäçÖvàés×ÿR ê­·ÞBnC1¨C‡ñ` ~"MTPlwÔ˜ EîAn4îÌže› 0ÛÙ ˜‡@™2e¤ó`ºO ˜ûÂñ)vÐE=íž½pݳ% p믕CC VžF“’’Ú´i#* 1àĉoß¾½iÓ¦·ß~[ïÐ`¬5Ï]eOIÀ4@`±* ˜š@rr²j; ,x÷î] MÌ~Zýó˜¤ Ž`ê…ë/ƒ†ŒÈýx®‹-ŽHo¨ñ@,‚ýì³Ï$„Âaƒ7"k¢ˆÊƒ¼‰ Лî&ÇB$@$@$@¶ }‚4À^x:$ 0::§Ý¿ÿƒ>@…¡#'fÅ/ÞH3@‰ŽMlÚ,c+#Ž¢E‹.[¶LĆQ¼)s<6lØ©‘R«Cõ“x§sçÎÈ È‹¼† Ðkn%B$@$@$@™¨[·®”,•”xêÔ)œ‰ÔyO=õ*„DÄdÑÓo¤£¬Ú^î½òb°Ÿ~úixx¸F1Ø~ýúÉÍx Í;tè¢Åè=›ÇÇÇ‹¼ƒ Ð;î#GA$@$@$@™@t5&”Fàµk×pòÔ©S!?o—)w$ñB– ðÜ¥›ž/é71™zñƸ‰ÓòÈÈý€E¡;vLHH#äóÓO?ÉÍ .ÄjX„Eö½–,Y2((ˆÏ ˜ Ðìwý'   »À^¤Õ`®oçΑç?zôHÄÆlÛ¡[6 ðü¥›ç/{®@Aÿ6@§9züt»]ÄÀ (€- Ä‘,þÃ?up×®]ð@ä–P'JtµjÕqSy€I ÐMzãØm   pŒ€Œ„ ™©R¥ ôO ‚d¢¡«W¯æÍ›-_»-ûxáò-Oø§j€HSt…!»#«~RMX\¹rå6nÜx^w Y<QÔAŠy¬ŒE•:è'1•Ú«W/ntìùcmàæV°#$@$@$@$àJ"ÑŸ8ºwï. Ñ2qÙ 6àý|ù N8ï¼xå–û ´Ó¢žJ»–’zuÆÜÅEо(`ñç‘#G4ëC<,EL6 ëc÷íÛaÖ{ RJ ²Ž+ïÛ&— º+%   C@VÕaV®\) zóðáCtUÌÖù¦‘ 0ýêmw§mLN½wâ\Çßz ÇC˜Áƒ# ¨æ8|ø° ™m@”Tü÷¥—^Ò{ ò+†„„ê^³3$`› O x?‘èOH„€Ø˜Â‘9ƒ¿uëÖ[o½…ÆMõs®^ºzÛ=ªiž8{%éÌåˆǪ׬-h¼úê««V­Ò{ &E±^TÔùøã1axýúõ¡C‡ZÜcLKKóþLj#ô 4@¯¸ Ø$€äæÒ[´h! Px‹˜!ÄÌØ¾#)N6Àk·/_»ãêréZÆd£ý˜xúr©K —­}¥øk â»`:44ÇøñãåæÀN:!¥ÄéÓ§›6mªŸ Äæ@h6®òI$ƒ ü±{$@$@$à[öïß*ÈV§Ž;²Äû¨à[Dœ1ZÄ,QeÖ¬YÒôW^Tøð£O£Ÿs¾^¿sÅ•z™5<žr)>%½wÿ¡¹r?+¸k׮ȯ‘Àøøx㑛ǎûàÁƒÐÐPD µ¸9Ðßßß7m€«Ð]E–í’ dOüª®\¹²ÆÅû7@lúBß<Þ ‡ØúùùIWAÀOèŸ0@$@G;Øä†UލÐwàH×àÕw]Qà–Ù4Àc'Ówï‹môC33~À¥Ÿ Ä !æ E$D4QìŸ\¼x1âÁè=°bÅŠÀëÐ=bep ÛPóB$@$@$@™0¸Nž<Ù "š9J¥FãÆ¥¥Ô®][`JJ jaY#Ò¢ÂÆí‘.5Àk7ï:·@)b€qÉž¸¸$ è2O6þUªT YSuâÁ”*UJ.E" l¡ìß¿?–€ê=°Y³fÜèЃÊÊî!@tg^…H€H€HÀ.Ö 3oX©ˆãÆv5äšJbµ¤¦"ív¦©ÁK $ ©ÐÎìÙ³1¢b¯¼z(þœ« ðúÍ»Î*Iç`lÒ…˜Ä CGN@J q—[¶lyìØ1½‚aîܹQA$¼téÒÙ³gëÔ©£—@>|87Úÿ¸²¦ÐÝ™—   °—€5´÷|×3£Bž¥™`®oóæÍÂ###=>¾ûî;Tø¹U7à[÷œR®ßºç"<’p>,êxóÖOÁcQèˆ# xš#..~(Àb!èÔ©Sÿúë¯íÛ·#9„Þ‘R±v\ül²y°— Ð^R¬G$@$@$à4@§Cîܹ³t’²eˆ…… <~ü8®… 1/¼ð*ÌZ°Ò=xóö½l–·ï¹Ô s¡A¡•>úD ÃÊÏuëÖé=pçΟ|ò¤Ü/99H‘&^¿9“@íô›ËI h€Y€ÆSH€H€H€²B“QݺuCq`> ëë4 Y3@,þÄG6⯠)4ˆ¢¢q\ÈFžnDwDSø¯¸ºÚ1´°páBýðÄ)hV(êØîOV¹æ„-‘رcGi€.\À·nÝŠOsåÊ}ðXš ðþÍÛY/î1@Г±“ý .*b'¦òÎèŽE‹åÏŸBFÜCÈV‡j6 ?äA'@ôø-`H€H€HÀû ˆø™úÕqÈî§RÇŸµH0Hp‡¦ôíã¢RóÔ«ˆÎˆp£8×bÇÖ¬Y£?E_ÓàAAajŸÈD R`€pBTøº^#wà­;÷³\ Žî4Àqi“[ýÚõ©9 Ûÿz÷î0 Û±Âû±@ôèÑ£111=zôð1èýßsŽÐ$h€&¹Qì& ˜–¦Ëäï`xšœ”Φ¦þË‚J·´Ø¸Å‚Ò5窉ת=¢“"!¡‹xmüü„ãÆ“ð±Úú' ~‚êæÍ›ï¾û.* ;ÍÍxûÎýÛw8Zàî7À¨£©ûcS7í<øñgO²A|ðÁ *åË—ƒá‹/¾¸mÛ¶-[¶lÚ´iÆ k×®ýè£$|Ä5í7˜÷64@o»£ ŠgJkÂl›fºO~$^:j€3ñ#.§YS*£¶à*š¢ê„$^«ëEñÚZ‡ÑyÓE‚©Zµª”† JĆ+>ݹ/Þýxçîƒ;÷)wxÐ#cÏî9Ûã÷áÀõꫯªØ®];¼Ù¼ys>óÌ3>ÓÄêï%ï ÐÇŸH€H€\K@®±Ô蟸ª S)ó¿;d€rvQ“>^I ›æêÒ-ž({ÔÐ1—b7šºmÒ¤IÒoß¾¡ :ŠRîýJXëè¼{ïáÝûö¸¢ °i‹ Ùûå—_T„âÍ™3gª(|„»À00®ý‹†­;B€è-Ö%  p€˜OÃõA_DKp0±zSLÓ9d€rÐbìѾì€Úqi€Èðnq@ÏBMs æäTΜ9‘«@`TTÆrÿþý/¾ø:üÖǃxïþC{Ê]c`‰’éà,XpêïKj…ãa j€ 4ð1ëà÷†ÕIÀ…h€.„˦I€H€HÀÇ `\¢i' ‡ К§Y”=5d‹4@kq\D³Ïbï™”jÕª…†† A) Zˆ +7ìò¬ÞðÈfÉPD#àêÍ{€+GŽ Ò €7?ÿüsL«X¤H »1í|þYÜ@€èȼ ø(¹œÒâP‹Pì7@Yž†©9k‡œ'T§û¬ žì’w š•®OŸ>Ò¯]»†‘Š5´Hu—êq|ðð‘µrÿQ °gÿ V³fÍå;-ñø©8wî\©xè >úW‡mH4@CÞvŠH€H€¼‚€\3‰v( ¨þÔ¶ñZíƒ/`DD„J*…îÝ»÷Ñãã§Ÿ~B…ï›¶4ˆ>|øH_ …Æ1À*g$3fŒÀãÇcJo"ò§j€­Zµ’ð‹+fçÃÏj$à4@÷pæUH€H€HÀ ¸Íen/|ÍÅêDq”*U ú' P¤¸@`’—^z ͘`|ô×£ÿ.Bã`Ø"% 0žüû@ô¼S¾|ù]»v©Xºti ¿sçξøåç˜ L€hà›Ã®‘ €É `á¥øìÒ9@k@mÀó…9À2eÊH ùù知ž?dvî܉O¡4á“ e€ý}À e€g,±7ß|Sê^ˆp/:uR 0 à©§ž’ðÕ\#&ÿB³û^B€è%7’à   °¶¤Sí*~CQÓÑX 2Ó >^K¦(¼ÞëE]ŠmiÒ]»vE…ªŸÕÚ4Õ`˜q÷ F3ÀúšÙ[yäÏŸo.^¼X5ÀÞ½{Køyòä¹sçN¦$+€; ÐÝI›×"  Ÿ#i¸N™0PL•Ø¿•eêv±²Ñâöq`R­ãõèçç'%ñ`vïÞ- 0&&”nÞ¼Y±bET0lœ ð/Cà …‹‚تU«¤þá5ÞyþùçV5ÀêÕ«Kø7ö¹ï<lx4@Ãß"vH€H€ÌL Ó”}EtÈ¥=â*!Áú,&$̾|i_ݺu¥„àµ4À3gÎTbb¢X¦¸içA£à#Ìþ‰b¤U KVn®Ü¹s«€˜Ä› 6Ԡȱ!¨¸™¿¾ì»w zç}å¨H€H€HÀ dB˜˜>ùžT8™.Â!” AñS[ŸpËJeÞ?ͧÙ7Ànݺ„°¾XvˆåRB»RàíÛ·Q„ øô­wÞŒ=k8T‚Ág`û.}@ »þN(GÙ²eñæÄ‰U=z´ºþw ûœ°c>K€è³·ž'  7š Äk8!4É褞©¡\2@ @$µÚ[ qÀÐäQ}¨˜, ærhÇ€“AAA’ æú¦\`dd$ˆÝ¿ÿ‹/¾@…–¿þf,4p6ˆrå+ÌY ’jà˜6bê¨ؤIÆvAq U ›¾c¼ 8B€è-Ö%  È)êôˆÔ6u‡ž£($PÊ^¦í‹îgÙq®æZö‡9͹¬œÔ¦MÉ¡B… Ð?a€°4‡X yóæE…E[ e€†Í¿cï1ÁóàÁƒI£FÂ;Ÿ}öò.ªX¼xq øðáY¹<‡\L€èbÀlžH€H€Hà1Ì•a·žÈׇŸÈâ…^Ÿ`ƒÐ3šu›˜Üï[ ú‚å bÒOm\L ZÄÆñ©µÝƒ8ÅF\KÄâ<~Ñ‚\Jb~J¼|ù2ú¶téR|š7_þ}1g c€‘öÝF¹wÿáÝ{îÜ}pëÎý›·ï߸}ïú­{×nÞ½zãî•ëw._»séÚíô«·/^¹uáò­ó—nžK¿™vñFêÅg/\?sþúés×N¥]KI½šœzõÄÙ+Ig.'ž¾œpêÒñ”Kñ)éÇN¦Ç%_ôØq¨¦"@4ÕíbgI€H€H€HÀ&D‘òóÏ?KÄö?œwêÔ)ñé[o¿;wñ:¯½ƒµöO¬9%p.\8A9š5k†7Ûµk§ QäØâñðQ%c ó¾°W$@$@$@$à05<$dÚ´iÒÓÓÓEsóçÏ‘`pÔoÔdó®CQq©Øí†=oØù†ýoØw$ñBL҅ؤŒÝqqÉéñ'Ó±eçO]N:}ùÄ™+Ég¯œL½š’võÔ¹kØe‡½vØq‡}wié7Î]º‰x؇]yØ›‡z—¯ßÁn=ìÙÃν·îݼ}Ûùn£Ü}àhqÿ>ÀÖíºÔwß}§ „o‚¶j€Ø(õ1B‘“ÃáûÇHÀ-h€nÁÌ‹ €+ `-bÅŠ¥à$ú' pÏž=§OŸÆ>@ôâÖ­[˜¿VXâØµ÷ ÷ \.kÅÍ‘`^/™±hvöìÙÇÿ>6mÚ„wòäɃ¸µªÖªUKò¯[·®+ï6Û&l f O&   ÏHKKkܸ±ê~ò5¶üaPÆEÒHË¥K—D‡1©U­Z5Q¹Ø+¯N™µÄms€°¸ì·Åݰmà èË‘#G¤"¼*Þs>÷Üs’<¦=ûTðê$`ƒ  ˜’Ö0s}zýûè£^zé%ñ>rÖ­Y³ú‡#ìñsóæM1æU«V½üòË¢æ'Õ> ‰tõ*P,Í~qO6ˆ¾G PùÇu^xá䊈­ƒð9[uæÌ™&Mšˆšùò˜0}¾+"Á@ÛœX\š~ïá”§'ýƒ9KüóÏ?ñNåÊ•V5@$Þ7âíÝO Ggv4@³ßAöŸH€H€HÀWÀÖÚ´i£Ÿ÷ÃÄݯ¿þнjý“ܰaÃûï¿/NÄ$!Âbˆb¢££¯^½* "rL™2eDÍò>\¿5܉±@!lN/ˆ2zùÚDEÜQDE RD"=—~3íâ Ä&E„RÄ)E´ÒSi×RR¯&§^=qöJҙˉ§/#´)œÆ§¤;™—œõ46éBLâ…# ç±1Q§Ì^o¼ñÆ1å¨W¯ÞìÕ«—j€+V¬Po >ò•'’ã4' 9ï{M$@$@$àc0}'–tjŽš5kbZÏšû©ïÏœ9S.…ɬ_¿^ ¬f„æÈØÕ–/_>q¡¦ÍÛDNrF6$„p~qþðS+ ¿}ûöªæÎ‘èTìÓ§¼)ÅŠó±“Ã5 ùî{L$@$@$àS[¼dÉ’z÷+^¼ø²eËä]HöpåÊ•³gÏÊwô/1%‚ÇäÌ™³mÛ¶Ò!ûöíƒ1>|øxÑTÇŽ1»ˆš¹s?;hؘl愪¹¨¸h°Pá¢;æKãþ>ðï ÄfMUDÜyw0IëS'kF4@3Þ5ö™H€H€HÀ'@=Ô,sR30…Ífªà]¼xQ˜Û_ýuíÚ5Ø  „½|õÕW¢5øÌøñã¡Âq8pàܹs‚/¢†Ê=‡o”*°zKV2Â#)¼‹‹ÓW®Þ 8ˆŽ#õ/Z¶l‰7[µj¥àÎ;EfEq@×}âÑä ÍL€hæ»Ç¾“ x)LÁuîÜY?ï‡wZ´h1“‚‡ÍwïÞÕ`xðàœÐ†â#„ }çwÄ%>øàL' Dx¸Äõë×E³H&ùFQó˯¿Ù{0>ùì•“©WSÒ®ž:w »ì°×;î°ï.-ýƹK7±ûñ°+{ó.¹«8w`§®}1X¬•=ª¯¼ò ÞD®?ÕÇ'o&WåJZ/}09,o @ô†»È1 xló˜éÓq!!!˜ßGjjªLëgqø0CÌæÉú_Œ;V^ë»ï¾Û¶m›0@ºÄ‘””tïÞ=4±AR‘1‹B{ôŸ|΄˜¹­81Ì{*a¤Ã† “¸uëV¼ÇÕElq`ÂÖ›žCŽÅ[ нõÎr\$@$@$@æ#Á“¡8Õ À"EŠÌž=[*27 zç£Gì!,®hñ¾ñ·ß~›áxØ(( 0** KF±·P,1Å|£žâ¯–˜¿$Àö ”ÌÍÅ)±@Ã¢Ž‹ X+ ËnñÎ_|˜«ª"dž¼SPw{îë€g Ð=ËŸW'   ÉÉÉuëÖÕ/ûÄ–?("¸¨ wøða‡¨Á!¶'wïÞ]£F Ñ%J̘1“]0@ØíÁ²RqQ„}÷ÝwEͪŸV ´¸ 2æ‘’ýl£ÆÍÀÐÊ—/«Èˆ7‘P5À… ª· 7Ñ¡ûÂÊ$à4@`çEI€H€H€Hà ,°”ñ95ˆ혂ƒ¼iŽ©S§.]ºFgÄÛ·ooÙ²eùòåúvôï`7à믿þÄîªV]·n0@è ò"ܸqC\tÒ¤IÈAš9r<Ý®ãoq §Õ}€Ð0–læ¬óMcŒ«K—.R1|1+OV ð—_~‘· “·öÜÖ! zü°$@$@$@¾KÀßßßâ–?L²mÞ¼Ùš³!4 $ÓÉx-!"²Ë¬Y³P§Øc€¢ŽÌ=ˆ(—Íš5C¸Ka€8:„™.±9áj‰^(PÏO›é'"Áx¾d/#|®ÜÏbD‡#Ž &à÷ß‹BU|ë­·¤b™¨ï>ǹ©ÐMu»ØY   o!€lì+VÔ/ûÄÄÚ”)ST[»té¶áaªa]äûðØ#Ônúôé¡¡¡þ©“€5ЍDµA¬ç„7bs  'Ät_»víD÷òæÍ '” Ä2Tt™'pQHѧŸ~*j–{¯|ðŽ0x çËŘ“D„R¬PE´ÒSi×RR¯&§^=qöJҙˉ§/#½!ÒÜǧ¤;™—|ñ艋±Ib/,^±)\¸°Ô?¼ t»uë¦ ]½}¸¡Þòlr^N€èå7˜Ã#  0ÄSiÜ8c¡æÀ:CDd9qâ"¯ˆª&fÛä°.8]VÀßܹs¡yø/–,Šj8 ™Ä$!,åäÉ“²>´M¦+Àæ@„“‘Y|±}ûö*Uªˆ~–.]zÁ‚Ð?…‚:„i@qQ̘-š‘BGÓf-Ž%ž€y¼dÁÛvè†!4lØŽ-|ùòáM¬¤d9(bȹF{ÌØ°F€ÈgƒH€H€H€ÜDö%Xjô¯N:"ê¦8 yØ¿g±[sÃn@¤pÀL |»ø´@¸ßÊ•+1§6ˆ-|bÖN=îß¿ŸžžnÛ1—X¬X1Ña$<ˆ™@ÈqëÖ-´‰Ñ 2Dì—Ëý쳇Œ€€y¼8:XòŒ…ˆê)õoÅŠxçù石‚Ò‘œCÞD¬•uÓ3ÄË@¶ г €0/'=JÕ¿R¥JaM:gb‰¦^Õl›4Ln„°aÛž*u—/_¶:B,1µáØû‡|€yòäAÏáxmÚ´Áô£0@q żX‰ w­_¿¾૯•X¸á –bz°8² tóŽ(1@äÃCkÛ¶-ÞÄ´­tBØ/EˆìˆâÀ͵ã`0 !n;A$@$@$àÅ0¹§ÎIm(P Àˆ# |ò¸pá‚ȼgçs;þ¼<3THÕ 6ˆ¡˜å³§58'& áoêéš×"„'ý/T¨ÐøñãU „ ¡3Â]±|TFI©õù—$`.ÎSÅþ}€CGNÄÐ>üðCu\o¿ý6ÞÄ,«|ˆÝ•ò>"•¢\[kjÖ!Ï z–?¯N$@$@$àͰM®sçÎꌟxY¦öíÛc•¦F±V¯^€"ú°.ÖÁÙvìØaÍÙ „H$è_l;ÄFDˆ‚‚‚*T¨ ‚¤yاú6^»vM\!mÏðñxŸîÒ­WbÊyȘGŠ‘`>«þ9zÛ¯_?9"¨,ÞãaÎS¬}Ç?ü o+VÆ:™•IÀ³h€žåÏ«“ x-qãÆ‰e“šã“O>Ùµk—EË\æÍ›o› ,>11…ÊÖ„ 2‰ÖЦLæn»M„9ADœeÛŧsæÌ‘y,¾ýö[ìET «RÅ>F80\W(RôÅY~‹!c)™Æ=pô´ØÄÅ•c{ÅÅFFøÂE2òˆì9^ã%JDý÷ñÞ{ïÉ[Œ›nÐ'’Ý"+h€|4H€H€H€H »°LnŠSõ¯R¥JÈžfÕDê<* šû,´+-U;Â<ÌÇ¡> ¾µ 78¡XTiÿsC²AÙ ¶´!ëƒ:9‰-™¦¡—‚*¢×Ø8`w5jÔp^ýõ™3gªûèj)Z[¼x±Üø}“Ÿ#ƒž¹¡hæß¯ø!ºŠ¬÷²ŸØµˆwàx¸wêQ½zuyÓ›5kfÿ-`M0 An»A$@$@$`XÊ8`À‹[þêÖ­+bŸhŽ7bÚ +B±=/Óq¢j¢¾¾ñ6bõ&f«2mJV@å={öXk\Ž *æú¬µ&ßGÐ90Ö¯_¯z Ì(6ŠÌ¹s?Û­×ï1 ©04W¹ t_t¢Øš¸sçNM¸—F›<°®+E¥úûûÛ X“ B€hÁn ˜ƒ~ô[ÜòW®\9hž”L¸aלüc\\œ ë°‘óŸŠè,ÙbM±0Á(ê …C¦æ†Êè3*c)©µ… nذÁAÅÞB‘·0SFŒ!ò">õÔS˜4Cº 5®Šº9°E‹B® yqêÌ…04W±pìÄ™¸(î Ú1üoþñǘϔ"JýÃ?…9žZö’4@>$@$@$@$`L£U¬XQ¿ì‹g̘¡êˆÎ‚E•ë”A$DX—ùóç#YŸæªxgÑ¢E": jª ": "…¢YùæéÓ§·lÙ"ÂÃX37è>[þ§ÈÓ±åÏ¢ ¢fXX˜5AÅd&ÁPmb‘¤ˆjÐ<™>oÞ¼Xl©‰®‰¾‰Í€Œð92Vf.[½9>#^‹ëJ†Ök±š·U«V²WÐTø*ÞDüÕpåhÒ¤‰|ªV­j×sÃJ$`04@ƒÝv‡H€H€HÀx°å¯M›6z÷ÃÒÁŽ;Â^ yâÀ¤Ðýû÷Õ@an²¦ì cB¢V¯^ Ceü¯…ÎáSÔ‘õái"ËŸ8Ð8.!?MLL„‰ ÇSÍ ‡?JUC5y ®%¶ü AÅåGð)¨H_¡¹p3ñ)bÒ>|Xž… :áTßÔ¿ÆôæÇ,0–.]í¨ˆ ‚$²/R¤ˆ¨ùÅWõB#ÂÓ\WòåÏÈRˆIWÙLýᤵFõ(V¬˜| øÔx*{D™ fΈ5H€H€H€|–f½†.1jŽÏ?ÿ ªšHu`ñИ3sñnÝ:ñïhT †f1: œf(/ ““‡Ø\‡C¨ÞÔ«šLC/ú AUÍ Á]0ý%Ô†?¢Ž\GŠ¥§˜Ä›òÒ˜œTæ© ªE!DèéQˆ³yóf5×:03¸(`2Dl„i·ëÔãб³qÉÈÜàä²tÕ&\a?Õnˆ÷jŠ<Šò@ UõÀnLŸý^pà¦&@4õícçI€H€H€\H‰×Õ9ùëÿ­·ÞÂF8ý¬Z¦]±fnUM&d·Ø,ÌSyê ¦ªÄæ@x?ª¦Q5M›sƒ Ê9Il5m"— RG¨Æ‹ø¢û¦¦Þ1É9hÐ ¹9Ë/±ÐR0˜0’X q̾þú믂|µB… 8Âob¨êÐcL!оLñâÅEÍÚ_ÖÛ²3*6éB6ËÎ=1h A_0e*¯‹€¥xó‡~@ry ¦ŽÈ!¸1n:,‘EzFªÇÛ¿Ÿ— zÉä0H€H€H€œBá=ôú‡ (,S´h2p9MXkÝ€ªÉL6 P„uÁÚC{&îÄ–?(¥5˦>‡í`ý'¬ÆZƒ2z´a¼Hh[ñ)F!sl|óÍ7X‹…òˆ‰‰‘i*FŽ)–hÂÇ~iÓ1â@BLâ…,—¡#'¢©>ø@½\‰%ðæäÉ“AOýû÷—v'‚¼0@õ€oCžm¤ú°«‘€K Ð]Š—“ ˜Œ€fñçk¯½†Í`øYoãÀ®6ÍÅš¹!:2@Àîðßèèhµµ«W¯bI¾ƒOEMH4Ã>¬ó\¾|¹ÐEL^YëZ³SP!œH(¶üÁ­5(*Ø#¨Òx¡s¶ŠO1“Ö·o_$ÙƒhÁñÚµk‡,ª˜aVDÁiÛ¶m…asàïƒGI8ŸµòiõÏÑH—.]ä…Ö¬YƒwÐ ì{D\Vy¨Æ—_~©×?õ$Àà” É¾ù¾Ô] /ÝmŽ•H€H€H 3Hò&§z°8ÐN{À }‚Ø5sCâyDÎDPMâ$2Å‹â'âˆ]s—.]ï£jа.Ð<ÈžÚk±ŽT˜Ìþ)D 9±9P¾© *ÏâÔ"6ÝÉóˆ*l¸œ*¨˜Ð“qGÕaj¸Jã ñÚ¶A,:mذ¡¸Ã3~üø½Ê×ÅpDŒ—´²’o¼5gQàá„ó•ȘS¹r?‹ abS^¤gÏžx-oûïCL<ŠcÔ¨Q¶ P|ŠÛáÐÜÌžM~NÎ!@tG¶B$@$@$àTsA˜²g KÔHˆL þþþ° H„P5ä<Ш¶Ûiô@d´hnP>˜˜˜Usz˜™Ô¨š&:‹È?![CeÕ¦§š›š†ïk&'Å‚F ¢ŽT †ê­ëHÅä$„3{ãÕ Ó"[lº{çw„na‰&z®zàp–¸(¶¾ù曢æ§Õ> ‰Œ>~ÎÎ2gá*á™jã¸ÞD" UÿüóO©xPö ê zª=«y½ã»ÃQ˜… Ð,wŠý$  pÕ‘µ\üîŸ5kæÁ0¥cÏ2¥žP5,_TO„ªÙÈôsúPY)ÍM®…¨ "ÚŠµè,еçA‹W¡jˆws“mBÅä¤zˆÌ²f&·lÙ"üV*®…‹w ÍY}Яf˜ÁbPnlܸqpp°ªj±±±rs jæË—w ›ø©ÕîÈøCñç2-¨‰S~úé'Ù,Ì¿xáOq9yàêÒ·ÆNý“Õ0:w<»¼ ØG€h'Ö"  ð ªþüóÏ2ܰaÃàEö ¨ƒtáëׯר¦øì ¢17´ƒ©E¨+SUÓ›œSö\#¨™ªš¦5¹An!KB#Å:R¬Eà<Íšñj†©Ç ŒÝºu“›;wîŒYPõ@T¹9°S§NÂß°¶³[ïÁ³] .ŠÊè³lafðò=Фò@fi€Ý»wwÔQ_F4õ¯Gih4@CßvŽH€H€HÀÍ4ˆI¡>}úˆ_ÿ uvÎ~”NèÐX°öR½ÌM3«}²›& 1U(ûŒ¦°Å›îìT5MÏ- * 0""BmÐã©ímÃÄNš5kŠ»€@ª³AÞ°9’úÍÅ^yuò¬%Ž¥Y,ë·íËpÅ\¹ñOà_|7‘ë«vå±`Áu (f>³`€”@‡~Vv) Kñ²q   “Ð $pìØ±br ™â0‡5Y8FÖŤÂC}kÚ¿?6ªÉeöP†õa7 µmĵØ8Ì ‚'[ÃÆ<ļ‘„»êבÚè¤TÛTW­ZU²dI!cUªTÁ!œòÀæ@¹ØsweÊ”5+}ôÉÊ »£âÒ4¥kïÁø´zõêj#/¼ðÞœ6mÊCÎã£"EŠdMÿÄYœ ´çAeW ºš0Û'  0‹ˆ´“&MÊ™3'Q"aY0@4"öÈejnP5DXádl ë‚0ž™ò…‰-ðFk b“¡ý‚е¬HèDAE”Ñ'Nd  5óäɃ'oÚ´)dOU8lÄŒ¢âçç'6âø¾i˽ÇöM•¥Üû•ð~¿~ýäéb®ïùçŸÇì¨z¼÷Þ{r ƒ³c€”ÀLŸUVp  ó$@$@$@¦!`ÍáoóæÍX±bEu¾+Si‘ 23¢è÷bNOFgÁ–?ͬ2F`/¢l )ìDÜÑÅ‹£e‹ˆ…ª‰ð¡¸ôéÓ§­õVqa]lܰ¸¸8È\»vm¦‚jq˜šÆenC¬Jµ&¯Ëy¹¼yó"‹ ƨ !6bµ*¶í=Ù˜+w».}Â$GƦâ¿OåÈ[ ÚòÄ-Zàúõ냀<×Tœ.$üȦâtÌvšæûÀŽz# 7ÞUމH€H€H «l`XX$J,Ä"CAÁ2H(™£&»dvxinBÕf̘³ÂÜRG¨ÍÊ-Øí&m¯f˜zÔX+‹îrs ¼™èUÄæ@(¥8VÌ*THÜ;,ë•Õ°”ï < _=ž{î9i€£Fr–r-¨¾Û¼äßh€|H€H€H€Hà?ì1@;aH„ ]8„~ƒÊÂé/„E”Hy® UÓß*HzQ1±†˜.hV}ßžÔb‰©< ö׿aC–?µA¬#µ½”úª2Aj{ÞFÐT¤¡WG­ŸœT«¦ž3ÚoÕ*#Ã;hÛðáñuS=à®bòëNQÕOÅ\rBVå1zôh©x…¯N4@ìfä ;vtºr7 CO8+;‹ ÐY$Ù €7Àr±£Lp‰+VXœ„â@ˆ”råʉúØ(lb¢,kŒH$„À:IÌ:ÂÇŠ]sš«CiÐf·k!Ó¦W]lù³ÖyláÑk>ÓÖP¹ —.]Šf­5ˆî94L˜5S¶ˆ:ƒ0žˆì‚›‚ù½Ö­[ã6a:×âѰaCTûå—_ UÐHõ1ÀMqºʬödp ³H²   /!pðàA^R8fù`PúU Â‘x‹¿ûî;QK±X ü2µ Zb×®‹ x‘a]dãPJh•MMMµØ¶É!JŠˆIƒA©}»Å„È” öòÙ67¨šˆsƒK#/…µÁ ÝÅ0Õö01(\­aS¢lQØŽ—^zi̘1 PLb×B݈ñi&Ož, °H‘"®Ð?´i§H;ô°2 Ø&@äB$@$@$@ZØü¦‘@Ì#aRH³P5@Hàü!·¢UÃì4M5$3Y"l˜›µ›'6ʱSšÖµª;Ð !˜ÓR‡qpûlÀãD ,•øý÷ß»È(•_?p3 ›ór$@$@$@æ @|u ìîÏ?ÿT#Áh ¶dÉ‘l@l âÊò=ƒ“=Ó˜›=ÑÈž¼:&ú&TLôaê‰Y5¼ƒÕ˜Èœ®ö J5—À;êp¤ b'Ε¡gÂZñ&¦àÔ‘’AƤÁ üQ~ŠE›ÁÁÁ‡ „Š>>î‹< Š+ö7j†i‘öĉåæÀo¿ývãÆB;tè€ûõÅ_@V±fUŒ}Ë‘#‡¼û‘‹ Í:§Çž›Î:$`› O X&ÙPCƒÂ ƒ–±@õ)B ‘Ò¥K yèÕ«\BU¬© üJl热9ÖE Lcn‡’&,þÄAªY‹Î‚÷Õá@P!QÂ!!¨RÕÀAmª©IC/:fMPÅ0±ŽmŠNÂa‰²Mˆ¨>©f˜zÔ˜pëÞ½»Üؾ}{d¤ž?~üxÙ fA(õ*xôèQ× <–ß@p' ;ióZ$@$@$@&#€µjÕRgñ!FD6‹…°nPœU±bE삃]ds2>O[õào˜^s¥Ø(¥H˜ÚÑ̪ešåO\3oðÙšT±Ž«ª¦ŸKÔôܶ bÒS—ªÎa© AU‡iÑ·‘ ¾fÍšâî¼úê«bá®Xù ¹ÅÌ-öÖ¨QCÞôêÕ«»NÿÐ2ÖÁ:t+Y™²I€˜M€<H€H€HÀû 4kÖL#mÛ¶µa€}‰cÊ”)ùòåɘt‚k‰Ù3x`6ȧ׉¨•˜sˆ¾X{i­YÈ?c”­AP1ɦ6nCÕ4ÝT–ç¢'¾Š-GŽQ„ÝÙ³fÒö0EƒØúX²dIq[1Ó‹SýHW­Z|þùçå5j”K 9!z†Y9ûh€ÙgÈH€H€H€¼Ÿ@›6m4Ø´iSks€ÂS‘'?üðCq"æ1Ñ„É@Õš²fƒÈ/wÍaÎÍÑÄâX{‰<ý¥!–è¶ý÷ʇZš²wÔÚ%àB6ìÔY×ÀÄ#´Ù; Ë–-CÎ@¬³ˆ¡ê½ÆJQ— R,ÚÏœ5I ûh€ÙgÈH€H€H€|‚€&Y<$áã?†‰‰l8°ù VJDKØ:˜+W.ÔG$ll³g†Ê3„9@WdXGïX{©bs š"©íÖdt–Í›7[ë*>‹Bí17Ôo¬µ†X¦ *Ö©Šû¢oP Hƒë"» bÀ¨(Hà–½ùæ›.Õ?4NtôÑeýl f O'  ð!Ó¦MÓÌ"iÖÚ6@,/ÄüÒÛo¿-ÎEx¬f“Ù?¤dÁ‚p'„!ÍÔÜ4·J¬½”}À†4ì‚‘W`DSÕIUC„ÓDÐy:æ!Wòˆ«© ªÚiñ€ª‰u­¨o .$êØ3Lp@5TF¤SµAtOv¡¸/Ȥ…,Q¢„¼Ë;v¤úÐ7Ü7†JôûÌQ’ 8‰&ÊÔ<PÌïMŸ>ÝÆ L"pb÷ P ÄŸDx1˜} D<™ÔÁš¹Ù½¦gÏžéSÍù.fÕ„†!æ',Kí¹Üò'–˜Ê¤ BSõ‚*U TQSokŽ *¬Dç±BN+ÚD—d¨Ox/¦Ý0 ƒÕàܹsUÉG†@ “¾:lÆ(h€F¹ì €Y ‹Ì,'má·ß~³¶ T $k,_~ùe3Š2ÌDU¦, !fÉ 4b[×0ÍèO¹ÅÇÇ˸£èvbb¢˜i„ªa™«ÚI}t(–˜Ê:T#¤ ªªÏDu.QMaMP5ÃD70j1|,\#yóæE";‘ Bĵh€ÈKŽU‹õêÕ§#7&ÄÐädY1Y‡pbí%æÜ°ÌÒ¡Ab§œµK#…ºJÓžfQ_Áƒ”ª ûµ§ÔÑ*†‰`ž8ÔÉIu"~…eŸ4jöïß_ÞMìöÄÖD7 HFσÜF€è6Ô¼ €w@¹gŸ}Võ@Ì# 80S„Â1 ‹¯¼òŠ8“ŠÈ‰'öÑA™²ÀÖ0}'Öpb…ª=¢…LȇAY»º˜`ÄFA;o'ä zâÄ k :*¨ÄÌbk"ËŸèöbVšm¿~õÕWò>V©RÅ ú‡KØ“-ÃNÔ¬Fö ÚC‰uH€H€H€HÀöÄ$žf2ð‡~°=( çâ@ b4Ož<˜WÄÅÄúÉìK Z€}a9¨ˆãbÃÜ "›6m;ô°Ðڥњ˜ZÄJNÛ+Ñh§¨lÃ¥ Ú½FÄ¤Ñ ªºåSŽ`‹)Ð]»v9d€ 7qÈ!î1@{´œ_?p" a²)   ß%€µ|U«VÕH r">§µU ª;v !1?úè#ÑÂÌ ` hŠõ“N9EærÀDŸz« !P>¡j¤‰OÕ+bQ¥ë"ß¼té’ ë‚6‹³XˆC#ö"BØ0:µAÌÔ©r« ªè5°MˆŸŒþ"DSrU*&$CCC5À6mÚ¨·êèÄfHßýÎpä"@ôx^–H€H€HÀ tîÜY#÷2xð`‘bŠH0Ð?bv$ ID#Íš5ƒXŠE¡ðœìX‰-sb–Ó}ÂÜpQ¡jÈ¢ž ^E]T)¦%á²r¾‹©Å9sæ`½¥œËëH…ªíÝ»W‘§ AœÚ¦^ ‹fE7p®&<&Z©ê±£ä‰hD.û¼zõ*2œ5À1cÆÈ…¸‚ü›o¾éýÃ%hÇ¿“¡ Ð }{Ø9   ÓЧŒ‡QÔ©SZb"j%,±uëÖBE°( ÄÉYˆ­†2m:¬O¨’X¨>¦.ªÔÜH—êÒÜÐdR®#Õ¨NÑ/wù'äu!¨˜»Ó*Ú‡aâMLb~O•Ié~hR ÛÄL¦0@@Ã,e¦«@-Z„ý~iÇݶÔZö Ó=öì°‰ÐMt³ØU   s€„è·*T¾‘é æâ³N¦Ä )T3 —YA\B$y‡ªA½dS°©LC}Z47±ˆTìTUM¬Ò”¶¦¿…¹UU¦¡Ç†Iµ‡r"/°3˜ý¸jÕ*!uÈìgñØ5ÕÜÒ¿ÿþ{÷L‚’9höÒ»нë~r4$@$@$@Æ €Õ›XéŸ\jÛ¶­íU ÒòǨQ£ä¢Pì3Ä„˜ô@¨Z6¤d8wîœÚˆmUÓ …}a KžŽ¦0USDî§6¹Å$§<cǤ"¬:~Ê÷Õ‰DlGDÖ ìoˆM›6R'±Z3@$`ü÷¿ÿ­¿;eË– pþá*ަè0Æ£Í^˜ž Ðô·   0,M¢XÇ;ï¼³nÝ:kû5O@¤ÐN:åÎ[Kݺu“““èR®0™f-¬‹5Âp0ìú³&¢è¼£·[þÔÖ ÒòªÂ !Òðai€C‡E&F¨ZµjXæj1 ’¼#<Þý Ù&Lp›ûáB¸‰vº±£ YŸl ò !   ÀšÆŠ+êÃà 6Ìb$½"T&$–hÞ¼¹È!gDæ@±+Ï) P„u3¶\3l¨u­Ö®Ž{ú°.ÖšÅä¦òP_ßšF*NÄx1=ˆÈ:" [þJ—.-°”(QbÖ¬Y#Á`mªšîOÞ EP4åNý¹12cÌÏIÀ%h€.ÁÊFI€H€H€H@%€e‡úy§ÚµkcëšÈˆ| "¨ÞU3Á>·úõ닦ž~úi4+‚…ª«1³cƒj\P‰ dth•f©zuŒNì Ì4ç;®%¶üi PŠa"!¦þPG`ppð×_-h`°gÏž2Œ&D»víræÌ©¿Õ«WwOÖ^Þ¸qƒ_ð §Èóº$@$@$@¾EûÙŠ+¦‘|ùòÍœ9Ó†ŠÝ€šAb .¢©‚ Ž7QR0K†ù1(S6ÌM¡«"¬ V«b§zŸ§A„Å̺­^Klù:*ßÇQ‘ÄOìèÓ‡Eû¸Š¨€¹»ëׯËsÕÊx—ì©0@ìúëØ±#2m€¶üaËå¶mÛÔX ÒGýâ‹/êݯxñâˆ;çýäµ í¾õès´#@4Ø awH€H€H€¼—€µð0õêÕƒ±hæ«Óöù7„»n·”I#œâÈ­'ò:sÃÌ– »½T5ˆ¢T5u•¦¸{"HŒ¬€‰M1Å7oÞ<¼uÐ&¶ê‰IBlÛƒ Êúê–?T›!cFàøñãXU ¼R¥JˆÝ¢Æ•ùyUòQ ;*ûõëç÷ÃE/^¼è½8Gf4@sÜ'ö’H€H€HÀk@Õôáa %ÇWWf&€O>Ƕ½7ÞxCzà´iÓ0(öfs2§Ÿ>}Zäv‡¹‰YA¬çTU uôÓzòN‰ðžâ€1bâN4gÃ|Èò'&â,Ê$4SŽ?y¬_¿¾råÊb°/¿üò”)SÔX rs¤?þø£ÅL?ÿü³›·ü©ª‰­›^ós æ%@4ï½cÏI€H€H€ÌJ3Zúð0°äýÃÌ›Ø èÐ… … j„$òØ(âÄÀÁ0—Í›î`€PÁ””µ)4ži4Ká¢ò,9µ(BÎÀßÔe¸ÜWÌ•‰´âÀÌ^“&Mıø³{÷î2ŒÌ! °G2(¨:õ‡ùÀ-[¶xjê×…ÍfŠË¬4ûm*4@SÝ.v–H€H€HÀ‹`ÒO?ˆÐ”íÛ·ÇV7±(Ô¡sbï¿ÿ¾ÐĉÁî8¨&€eß¹DU5‡Ò¢„ AÕÔ6Õ‰D$„ÀjO„•¤NlùÃѰaC¤°WcJ„R"¨j}âu‘"Eƒî‡KCžmL–zÑCÍ¡˜€ Ð7‰]$  ðV˜©«U«–^Z^yålœC€Ð,ˆ¼‚…²MäD–?{óœr AL¸Ù¯4¨‰ú/­Ê$*`æv'HÝ믿.ÆòÞ{ï-_¾\~¤Îbâ´FzŒX[‹ÙB,"õ¬þ:u ÃôÖg˜ã2 én;L$@$@$àm‚‚‚ÒS/09ìé"=d¥iÓ¦rê ëK‘ž^x l$› PÖÅÆ-}a)êk.ª."E¯°çR'Dùä“ODLÅ2WõSñ;ú0—تU+‹[þ¾üòK|êY÷‹?ÕÕ­Þöìr<&$@4áMc—I€H€H€¼ŽÂ„öêÕK/P8äŽW£¡8ô3ohVnDÈP‘:BlÌŽÊ”€ërá‹7ï¯^½ZlùC¸NõrªaìØ(h⵩Ã[·nwÔ ò5–ÑZÜòW¶lYôÊãî‡`Ž—úçu_VÓˆhú[È x Ä;±!¦|ùòˆ™‰ÝqY>ïwÞQ·b˜)AlØÛµk—Hç°cÇŽ[·nÉ×xG|„ !“„Ô?ÕˆÐ6ûE)Çü!¥®fÍšˆÝ¢~*_ƒF¹råôœ?þ &Áý„þ1ô‹×|7½i 4@oº› €7°!¶óÙgŸÁˆ²,8«1k×®-Å S‚¸Vrr²PAÌ fá8þ¼œèCP¤ïÃE¦¼Oe›¸„4"!¶üabPsçÎ-]º´èºàê§ò5¶üÕ¯__ï~ˆ Ó¦Moù“òim^ÔPŽÁäh€&¿ì> €7°!FÃÄôšš)ÁÑ×8½sçÎȧ'= Ñh¥«C³ì‰‰‰ .“~8ðï¨>)Ý/Ξ=‹ýòÀ6HìÙÁ –­ªŸª¯Ûµk'w6ªX½zõ;wdêÝHOO÷Ƨ’cò4@/¹‘ €÷°!ó]mÛ¶ WS&dáõâÅ‹ëÔ©ƒÖ„M!‘ ¦Ñ°Uìtô@VwÌÔaö›E¦xq¨Ë>‘uPAWó믿 ©Ã–¿Ÿ~ú)88X~ª¾?~ªU«†wºté"ÞÀ4c:u,úçÏ?ÿŒ¤…FÓ?83òÝó"o%@ôÖ;Ëq‘ €–À;w2éû¬Íâý^x¡\Ö¯_¤óöû) üÄ!²ºcâ¯ýõ×ÿûßúËU©R9*Œæ~çÎã~?~m¼ž Ðëo1H$@$@$@ZHàÞ«W/S‚p6Lå1bÇŽá6¾}û D¶ qDþ‰W^yEï~EŠ…ÊýRRR.]ºôàÁ>($à h€¾p—9F   °LÀßß¿qãÆ6¦±:*8hÐ ÄóDøPý! pÍßGåÊ•-6ˆ-Ý»w7N¦hð… ¸à“ß _#@ôµ;Îñ’ €–v¾ >¼X±b6Taé&|O£‚Ò‘Š[þþÿý¿ÿ§oçûï¿ÇöBƒLýaµ'»ÿõ×_|HÀ Ð}ð¦sÈ$@$@$@$`™6þ!„À¡BíÊ–-Û­[7,ø íÓ§ÞiРB¿äÉ“Gï~¨àq÷ÃŒÄïÚµk>äí'_&@ôå»Ï±“ €:mÚ´ªU«Úžħ¯½öšˆüùÜsÏé+çÏŸ„ t?a}W¯^e|>è$ Ðù0 X&DÔ–ºuëfª‚š 9räèØ±£G¶ü!‡;­4 Ø @äãA$@$@$@$ ¤‘1c2] DFø;wºaêïÔ©SÈÛŽ0ž˜åC@óäsLö ÚC‰uH€H€H€H€ž@ÄìÌ•+·~b°L™2!!!$E$`d4@#ßöH€H€H€ J **ñ7–*õ‘H*ˆÿbë AûÊn‘ (h€|H€H€H€H€&¬P¡kÛ¶S>“' x” Уøyq   0' 9ï{MÿGäC@$@$@$@$à0 ÃÈx ƒ Ð÷½    S šêv±³$ð4@> $@$@$@$@ :ŒŒ'€1ÐqØ    0 ©n;Kœä3@$@$@$@$ 4ÀlÀã©$àIœô$}^›H€H€H€LJ€hÒÇn“ Ï €Ãh€#ã $` 4@cÜö‚H€H€H€LE€hªÛÅÎ’ÀÐù4 8L€è02ž@Æ @4Æ}`/H€H€H€HÀTh€¦º]ì, pÏ @6г§’€' pГôym   0) Io»M4@>$@$@$@$@ :ŒŒ'€1ÐqØ    0 ©n;Kÿ!@äÓ@$@$@$@$à0 ÃÈx ƒ Ð÷½    S šêv±³$À9@>$@$@$@$@Ù @Ì<žJž$À9@OÒçµI€H€H€HÀ¤h€&½qì6 Ðù 8L€è02ž@Æ @4Æ}`/H€H€H€HÀTh€¦º]ì, ü‡ O €Ãh€#ã $` 4@cÜö‚H€H€H€LE€hªÛÅÎ’çý Œ7®L™2+VôóósvÛlH€H€H€ G€h¸[‘€}8h'뵋+ö?ÊQ²dI¼™Ývy> ˜ ÐÀ7‡]#[h€Y>BBB0駺Ÿú¡BÖ[ç™$@$@$@$``4@ßvh€Î~âââêÖ­kÍýÔ÷QíàÁƒÎ¾>Û#    zøðò$UœtŒ\ZZZ›6m,ºß»eJ•zã5‹5kÖ,99Ù±+±6 ˜ ÐÀ7‡]#Î:ã¸råÊ€ž~úi½ã)üÂì©ÃOCÁ üQ_'vîÜ8£/lƒH€H€H€kUÿxÇæeg÷8T"v6¬ÿ…Å 1È#Ϥü’ ˜Ž Ðt·Œ&A€ø_O‚­PŸeß X2ílÒÞ,—-ëB -z`ÕªU™4‚ßI    šèf±«$  >¡a#ÔgÑ"/Ì™>úlÒ>§häÊYô@$dÒ~?I€H€H€LA€hŠÛÄN’€ž 0ƒ‰µPŸòçÔ¯Kê‰}N/s§~µx1‹ˆ¤˜ŠäÃJ$@$@$@F&@4òÝaßHÀ_7@k¡>sçÎÕµSËc‡¶§žˆt]7j$Óbò@$`ò@~uI€H€H€ K€hØ[ÃŽ‘€m¾k€6B}¶lþý¡½›SOìwCIŽ Ôï7§Å䘜dò@~‡I€H€H€ H€hÀ›Â.‘€=|Ñs¥V­ZW`ÖªQußîuiÉQn.ñÑ;:´mf1i’úùùÙs/Y‡H€H€H€ÜF€è6Ô¼ 8—€o ö×5kÖÌ¢ûUªøÞúUóÓ’x°DïÛÚô‡Ö’F`Áªsï=[#   , fO$ÏðÄžº^½z=ýôÓz¿BD¿™cÏ<`ºþóŸXKÁäžýÂðê$@$@$@‚ O ˜”€÷ öÑa7]žlêr<6¬[—¶Xª÷@$˜6mšÙGöŸH€H€HÀ,h€f¹Sì' hx‰ÚõùÚ«/ÏŸ=áÂé#^Sb„´þ¥IŽ9ôˆMLÁ/9 €ÐÝ™— W0½Ú õ™oôðß/œ9â•%*bs½:Ÿ[KȤ®ø¶°M   I€ȇLJÀÜh#Ôg÷ß~=uáLŒw—í›>­ZÙ¢ÖªU ["Mú\²Û$@$@$@'@4ø b÷HÀ³ PŸ­[69¸óÂÙXß)óʽûŽElܸqrr2¿$@$@$@$à\4@çòdk$à6æ3@¡>k×úìÀž-ÏÆúf™?g"6=Zô@$`ò@·}©x!  ð4@_¸Ë£W0“Úõùa¥÷ƒÖù_L=Ê2zÄ€,'0`“zåטƒ"  ÷ ºŸ9¯HN!`´êó•s'§§Æ±Hg“ýÞç7kI#°yÒ)!  ðe4@_¾û»© Ým…ú,oÌÈéiÇX,HŠßשC+‹I#"""LýÔ²ó$@$@$@'@ôø-`H k m€ÖC}æîѵýÙ“‡ÓÓâYl8ö]£o4›±4k Ï"   A€È'LJÀ h-Ô'f´Ú´jw8ìÒ¹ã,v¸–~2&æÈ‹/•H4éוÝ&  ã ç^°'$ààPŸßÔýâ`dˆÚÃj på‰÷ïܾyùHøÒ·ß :ôÕ`e   [h€|>HÀ¤ d€H[‡äu“T®Taç¶µ—Ï'°ØIàêŤ{woÞ¹y9áPPðÒÞ›u¥šô+Ên“ €1 Ðy_Ø+È”€! ¡>‘°îé§ŸÖë_é·ÞXá?÷òùDû ܽ}õÖõ §âÃv¬¸uIÏ-‹»Ó3ý&° €Ch€ábe0 B}>EÀ“èççW°`A½û=ûlîýzœ;‡ml,v¸yíü_^¹¹uêöå¿o[Ö—èSßd–H€H€ÜL€èf༠8‹€g 0((¨L™2z÷C¨Ï¶­›ŸL$`Rî6@„ú¬ZµªÅp/õë}uøÀî«“Yì$pýÒé‡îݾ‘¸3pÈŽUƒi€&ý²Û$@$@$`:4@ÓÝ2v˜÷ ­PŸVܽcãÕô“,ö¸| iîÞºz"&8lÝè]«‡Ñù•&  p' ;ióZ$àDî0@›¡>ß X6ÿjz ‹ýîݽq÷öµ3‰{ölšºvÄî5Ãi€NüJ°)   {Ðí¡Ä:$`@®5@¡>Ÿ/êä±×.b±Ÿ@Fš‡k.œ‰ ž¶~tèºQ4@~©Ø%  ð4@_¸Ë£Wp¡Úõ9ð÷^çSì7ÖÄf¿¿þztåâI„{‰Ø8.|ÃX W~!9(  0  YîûI.1@k¡>ŸÎ‘ã×¶¿œN޽~ù4‹Ûin]¿ˆp/{6MÜ4žȯ1 €Ç Ð=~ ØÈ' PŸ ¾©s(âúå3,v¸yõÜÇ÷ïܼ’txë¾-SönžLÌÚSγH€H€H€œN€èt¤lÜCÀih#ÔçG•?ݹåúå³,ö¸šöàþÝ{wnœ>~`û¬È­Óh€îù>ð*$@$@$@v Ú ŠÕHÀhœ`€6B}¾]ºÔª€Å7®¤²ØOàÁýÛp¿s)чv-ˆÚ6sðt Ñ¾6ì Ï ˜”@v Ñ>Ë”)£Ïðþ|Ó§Œ¿q%Å~Xñ‰hŸé©ñ1K„̉Ú>›hÒï»M$@$@^O€èõ·˜ôVÙ5@}Ñèß³Ïæ4 Oú¹“7¯¦±ØIâ‡PŸ×ÒOÛ¿æÐ®ùwúѽõ+Çq‘ €w zÇ}ä(|@v )¤æÈñT»¶­Î¦Ä#„ ‹nß¼ü×£G·®§'ÅG‡.ŠÞ½€èƒßC™H€H€LG€hº[Æ“€ àL,7×ɘ7¯g±‡Àí—=DÀ—›)ñ¡GÂý‡-¡òkI$@$@$`4@³Ü)ö“4œi€/<Ÿ7pÂÏç’ݺvÅ&ôGïß»sý\Ê¡Ø=Ëc"–ÑùÍ$  0 ¹î{K’€3 °PÁ¼û¶N_3é—sÉÑÈ`Îb‘fýîß»uñl\|Ôº£{h€ü6’ ˜‘ ÐŒw}&p²F…̉ ž™!'£o߸ȢxpÿÒ<\½x21zS\dàÑ}«h€ü’ ˜” Ф7ŽÝ&çà~û·Í^=±Eòáí·o¤³€Àý»·þúë¯WÏ<ºSøIäwH€H€HÀÔh€¦¾}ì¼/p‰Ü9ÿÀŽù¦·‹ @¼_.wï\Gš8“¸ïøÁǬ§úò÷c'  ¯!@ôš[ÉøWà¡] £Co™ßcïú)wn^öÁrïöµ¿ïåîÍs'%FoN8´‰èkß.Ž—H€H€¼˜ Ћo.‡æÝ\k€‡Ãüw®²dÐõK©wn^ñ‘r÷öµG<¸çbjü‰#ÁI‡·Ò½û[ÄÑ‘ € úàM罃€Ë ðHø²ˆõ‚ô½r.éî­+^_0íwÿÞm„{9·ëDìv w|O8       0)w`LÄòÈàY«'4O:|÷ÖUo-Xñ‰L×/Ÿ=“¸÷dÜÎä£;h€&ýV°Û$@$@$@™ fŠˆHÀ˜Üd€1{‡-Ý4ç·ˆµão]OÇ:Io*¿ÿû¿¿nß¼”šu*>4åØn 1wöŠH€H€HÀYh€Î"ÉvHÀÍÜg€±H¹:lÍØM³:_8ë(Ò<ܽ}ý™ØÓ §Ž‡ÓÝüór$@$@$@!@ôv^”²OÀÝ·í¡Ý‹×Nn}4bÕ½;×Í[îß»‰4÷rù\âÙ¤H¬ü¤fÿqd $@$@$@f!@4Ëb?I@CÀxìÀú¸¨uÛÿŽ¡—Òïݽa¶‚y¿‡Ü»vétjòÔûi€ü^‘ ø ¯ÝqŽ×kxÆã‘ýPÐþ­³×Lúåжy·o^1‹"ÍÃÃ÷o^;þÔá´“‡h€^óMà@H€H€H€"@t+“€qxÒ¢7?´i÷ªQ«Æ5M‰Ýu•F.Hó€y?„{¹x6îü©#çR¢i€ÆyŽÙ   7 º8/GÎ"àaL<²5)f[|Ô†Ís»íX2èò¹¤û÷n­<Ìp¿»wï\¿|>éâÙ£NÇÐõü±   “ šôƱÛ$`<’|tç¡…k'·ŠÚ<ëúåsHªn„‚I¿ÿûë/Ìü]M?•ž1õ ß    0)àɸÝÉGwíY?iÕ¸Ÿà7.ŸG¤MÏ•{Hó¼q% S—Î%ÐMúˆ³Û$@$@$@® @tU¶In `,L‰;u<"åXØÞ “Ç7óÞEš‡G Ü 2=ˆBtóÈK ˜ˆ ÐD7‹]%•€ ðtž3‰ûN'ìÝ4 x`óìk—Î`'žÊc÷»ëFúåóÖ§Îò›C$@$@$@’  ˜”€ pßöyõ¿þô·^[²Ë2]Tþz”‘âïÎÍ+k>Óô…hÒGœÝ&  p +¨²Mpàà>­Ÿ~:ÇÿüÏÿü;O®¶¿|›5DÆ…s)‡ÏŸŽ‰Û»&dÉÀ•6‰Þ¾àÚ¥ÔŒøœN*Ûýî?õy!9=í¸õÂH0nx y    s šã>±—$ #àBœ:¶G®œÿ‚âøç?Ÿ~§t‰½Û;:( ð™£ÏKMŒŠÜÓÂX ü‘ € @ä“@&%àBŒ]\µr¹gžù§@ÏýûÙù3†9´ Tc€4ìÍÃBÍ„¨ K‡Œþ*x|ÐõË©zàCÜ0Lý!ÍC†×Ù_˜ФO:»M$@$@$àT4@§âdc$à>®5ÀÃaþÚ|‡U Rsçz¦y“zöï´f€W.$_½˜r5ýt⡭ᮞØbÓ¬.Gvú_JKĪNÛt±åïúå³ÏÆ9^˜Þ}O'¯D$@$@$`X4@ÃÞvŒlp¹ _†H0ò?÷ÿýÿ„þëŸO¿òrѰà%öD‚ÉÔ¯]>{ýJÚ«çÏ&8°uÎÆ–øvÛÂ~°Á³ Q˜åCxO¥ü…݃7¯žKO…ûaYiVÊ…Ó1çO9—¾!VMê‰ýg“"Ï$î=qêxø©øÐ”c»OÆíL>ºãDìöG‚“oMŒÞœphÓqÄ¿Aœ¨uÇö¯‰‹ <ŠÐ8³gyLIJ#áþ‡Ã–D‡.ŠÞ½àЮùwú™µ}vÔ¶™ûƒ§Gn¶oË”½›'ïÙ4qOÐøˆãÂ7Œ [?:tݨе#v¯¾kõ°Cv¬¼#``ÈŠþÛ—ÿ¾mYßà¥}‚ý{m]ÒsËâî›u}û¢Òà À/ d‡ 0;ôx. x€; 0&byDðü÷Þ-•ó™'Û¡"yžÍ5ndïLcÚo€7¯]qbRŽî>°e<6ˆ¹ÁÈÓÓÏÄÃýn]¿ˆŸÎÄf«Ð=øÀòÒ$@$@$@Æ @4Æ}`/HÀan2@‘ ¢K»&ÿΓ[ÎDA‹¿\4`ñ$Ù 1ÀóÈá®/È'¶`Òá~§cœR8èðƒÆH€H€H€¼‹ лî'GãCÜj€È¸ÔoôóòþãÿWÙ˜ó“*÷í ´˜Ð~ÄBP·)%œV¸ Ô‡¾#ª» „„„`¡rݺu«ò  00rå*äÎ]´P¡î#»F>D sçÎ~~~ÉÉÉ™þts·"ľËÊ—+­ÆÍXš'w§v??¢Éo·ž»qÕVÉ0ÀSGœX¸0Óg‹HÀQAAA%K–”ÿ<Ä$@$@$@$@Ž€ ^¹rÅÆÏ0 Èñ{϶¹såüß¿ÃÃàg_Íš5Þ-[fÖÔ‘§öœIÜwöÄ~ÄY±× Æf‚s§;³0Œ£¿îYŸ¬¸sçN³fÍý ŽõI€H€H€H€ô ,ˆEUÖ~yyÌ Š ]Ù¨Aízõê"FËÃwïß»‰ÑÑÑím³bñ4‡ á@m— L‰vna,P 8‹Ö|ò¯o    gxúé§#"",þTó¤"ÄÕô”{÷n\¾”t9=A”kWOÝ¿køð?^,ZhÜèöͦ^¿’Iyl€‡œ[h€ÎúõÏv|œ€~öïÙ‚/½U³I•ƒkt™ÌB$@$@$@$`›À»uÛ{¯Úÿ÷§TÌ“'ÏÁƒõ¿3]k€±{WNž8Ù D,PD‚Á>@± s€0À÷n_¾x<ý±+éIW/Ÿ”åî«|æ™åÊ•³g×vÇc#.œAî¾cé©ñ—Î%\>Ÿ$3Âgä´£`äi':½0 « ‡Ÿ}Ó¦MSÿªzê_9+6ìÜbF €CêZZ¤TEõ—U±bŰ×FóƒÍµxlÿÚ1cF¾ýV‰uË&X4ÀÛ7/Ãú¤^¿væÆõTQîß¿-fräxê_ÿúgÃuìÙfÑ!™– Ä®Bg`ö€-ø2´´4¬S—Oá®êö™Ózö^    {|ÛcéçM&Wo0¦^‡y?ÛŽSоõ*±în¼sûÆÂÙ#K—*1¬{ýàÉøÐî`¨˜„Þ¼~îÖÍ‹(·o¥?zôPýuˆ)ÁÊV˜5}\Ú©£ÿ™¼tæšÃΰ5W”ûÏ&EžIÜ{:!âÔñðSñ¡)ÇvŸŒÛ™|tljØí'Ž'Þš½9áЦã˜ùÄügÔºcû×ÄEŤ(¦F÷,‰Xv$ÜÿpØ’èÐEÑ»Ú5ÿàN¿!s¢¶ÏŽÚ6sðôÈ­Óöm™²wóä=›&î ±q\ø†±aëG‡®ºvÄî5Ãw­¶3pÈŽUƒw YÑûòß·-ë¼´O°¯­KznYÜ}ó¢®o¿QT> úçÀ—%„c÷ 6mÚ¨C}ýÛ„ö~ûXH€H€H€H€2%ÐnöžZÿ¬P¡«,VéýÓ°õmg†.YNþĆ@MŠ—Ïž?Ÿöí75·¬›óåç×®ñѾuhâ‘­°²÷ï`Ùçõkg…ÂýîÞ¹r÷Î5Èá¤I“4»!såÌ™#GŽ*0uÒ˜”¤Øk—NÛS2 ðD”k ЃÁK›˜¦«ßî·?­ße~$ €=j};îW­Z?ÿ;viÛv*þøA¥î­Ænm1v­º'!÷ÔŸŒî0@üÈ+öRáe ÿدâ»,›?Fî„&Ål;ré\âý{·=z€  îß~øàÎÇ÷ðGôµdɹr>£ŠóÌ3Ï`hé·Þüṡ„_M?e£ uUá ‰5„]÷5Ì3ÏæýuÊæî‹ö³ dJà‡žKá{}Ô3>þ¬ø1wïÞƒ=üðæg_é:_¥oZ©¥NºÜoߺ}€¸üSOý£[çæ«ü'¿Q²x«ŸŠH0Ò“î<·ûtÂÞ‹©ñXÕ™ÜåJ*Rüá¿Hã>cÊè×^}%wî\££þóŸÿ„ ¾ôbÑáC¤$ÅXôÀ LŠt]á*Pi/lN؈5 ò]­I·>K° dJ ×Âý}Ú²·re¸úKðúõÛµkÄû?v_Òcþžgòä•¿µ&^Öt¹Þ¿wkß®åß7úR\¾r¥r«—Où¹Iý’%^Y»|ªÆSâÃN°–>hݲêŸ}Œ% jQ1%X¸Ð ñ±û¯^LєǸÏu…hN a¯=F`øðáò[ü¿ÿxªçÜ]–d!   È”ÀO=—@óš4«ÿ%‡å øèÓÏ¡‘´–?·]Eu‡Fï Ü0jhל9ÿ…N<÷ïgÇì3æž/+ò}Ã/÷ìXU bжŠl©)1³gL¨QíL èg! íåâIMHšK #ÁxL&xaPƒ<•ý¤Î€h Ïè4qmÛQþ•ßEØÙgÔ-ÛYßg«}ùKïjßwø¡çy;l£`3eÛcÖ6q ä]³vSÔ6íyÔÇÀÎnûìýåÀIÀYj|5šÙ³øfˆOÛ _×sö6uÚÌßß_ÔwŸîݹtÅâ o–|Uô㻆_.[8¾eó†… =ߣKKû Pæ¼ráä¢ù3ë|U*øì³¹E³XŠ7ñ‘¦d`—  5„]ö M ˜_G.x˜…HÀ³нQÖâúoÖü¡£Å>w›²Nó>jŠv:ŒYêÙazöꭆ̱Ý|/¼J:ÿQªâg‚˜5È¢Y 5ë´êc£qyѸ¨fí¦È÷í|ÔŠ«`žåÌ«“€wè7g7¯nÝaÖ~Æai(*Ôk2!ão‰ ŸÊï2B0xÀC·-Ù²vný:5D? äÏÛ½Ë/s¦ýñõŸzáùù3ÇØ3( ðò…dµ¬ ôoÜ𛂟ÿçpÍGâ- ÍÕ…Ù <㼪ٌ7Nþeô\Âc×İ xœÀËo¾kç/~Y­ö4ÝnÞwÚÑ¿wÄY]þ\îñ‘z¤½¦­/]ñ3À±quÔÉЧB/ ˜òM뾂˜íSPYÞ{j¢¾ì€µ›"ß·óyPo·xŠÔ«x„6/JÞM y·E¼‘#¬ýLM½”$æãÞ£WF7î8T~—óäÉã<æ ŸWÒOÜ»s€0À›oðëß»’û‰Þ`Vpè€ßþÔ½t©’U?ª²ÊÚ>@± ô‰ž?qÙ‘’a€ØaèâB4›‰°¿ž!€Äò/£?o4a}, €Ç ¼ò·æ/ô^ÛS´é§v»Ûøåâ«ýeÓNšáàñêx|¤é¨bø jãê‚’¨3dÁq þk픾36ª™Ö”·F퀵›"ß·óIPñÙè³Gàó¢$àejÕÁ ³ñ3N,í;eÛˆe{ÔÍ qù*Pà‘ðeð®[7¯ÄÜ* 0hõì9Sÿ¨PþÙ¡OªT3¼O§öÍ ÌÿK³Æ#‚¹©ÓN:—røüé˜ gŽfÓ3ôÌ …á=㼪i`²´ý™S7e!ð8⥞Ì~ýSç¬u¦×ÄâëúðŽøu²Ö¸ÙÏ*ðXçÙÆ@Ä-¨VÿgQGœ‚cà¬ÏTQ­RÍú¢fçólÔTGµq+÷ãvèYYxÐU‹mšýö±ÿ$`ãWI ûÁÆ¿qãÖ ZÛ>þèy‘WJJçêÕ«—› 0&byü¡·o\:™xHÌÂ×ÌXµt 2z¡€èÓ¿þùtƒzŸ= A½ÚñÒ°ÁW»‚WY4ÀKç“-ê)uG M9¶ûdÜÎä£;NÄn?q$8éðÖÄèÍ ‡6?¸ñøõñQëŽí_xtߪ£{b÷,‰Xv$ÜÿpØ’èÐEÑ»Ú5ÿàN¿!s¢¶ÏŽÚ6sðôÈ­Óöm™²wóä=›&î ±q\ø†±aëG‡®ºvÄî5Ãw­¶3pÈŽUƒw YÑûòß·-ë¼´O°¯­KznYÜ}ó¢®o¿QTÞû˜FØQ¯# nüWÎ\Sךµ9Ž…HÀã^}«œøßD½f³Ö™~“¬µ€6ÅG¨“µÆÍ~VÂ:È6"êHD•k=ñºïÛýnñ,qËp–$SlÔ´“¿¼YY~Ì~³Ø02Á3¶CíZ´˜hû¢ˆÚ¨ÙDŒ¥Z½¦ÒjÕªå>Œêì[•žvüÊ¥s»‚—J\±x¢ÿüq?4®ó¯ýSôìùùZüÔhÂèß7ªû|üŸ|üáªes4s€XYêhyl€¡î)4@¯sÈ™‡Jþ5ôbñ7æmg!0`ýæ]²ÖŸSW‰o·¾¼#>B¬5nö³žlw€lm ­zÎøTø%YA¼ƒ£Ü‡Õ-ž%Ú¬òy|*^«§«§ØþTÓ¸¼YY~Ì~³Ø02ß@í0ÅgûÇ™Ø X­æ@Œ¥mŸ?åO¯bÅŠ¹ÛF®F¬—›7®F†os€ÂÌ;åÏAU*WC˜ïÖùsôÀŽ¿¶(ùú«/½XdâŸÃä*PGõõ1Tˆ™Û çi lË»`ùü¦—«\mÑöã,$@F ðzé's€ [üæhúþ¹g}Ѱ…øv¿W¹:þˆ‚÷ESx->2}þض÷hÔ)X¤˜(¸4Þ±}Q4¥ž‚³ªÖþV¶¯9WôG dÌ‚-òDœ‚?âMµ‚èú ûƒúÎêÏì ‡DOÐ8†ÿŠ?þÔq€¦Ïè›@§¾/ÏÒÃARÑUœ(þ(¨0—÷E}_B@'Õ÷åÍÊ“€qIòŽ>E¬O$`f¿ÎÔ'‚·øSQ¤†G›Ãf®‘?½ð·íñèÍ7¯]8‘pxÝÊÙÒý¦š1ùÞÝ}µxÆ_‘âÈ+ç—µ«3øÁ½«V©T ¾¡ƒú$ÅG¥§%8Zh€\ê]eâÑ4nÜX~ÇëþÐzÙÎ #(Yú=ñÝlÜò7GûƒSÔŸòµlJV0aÑû= ®9ï[»®µSÐÂWÑŸ%.÷B‘bãmÁÕ 5ï<õe…ù›¢]ÚŸá3-’mM·E?E÷d7M_®©ÿéƈÄûíûŽÒ´ «ÿHÞtRm\¾Ÿ…'AvØÑGˆõI€ì$дõ´LÃÀˆŸ‰Hš³VX´5Fý‹(..εùE$ì«@1<†½p7^8wýÚå¨}ÛÅ 0À)ã‡LúsPËŸ¿{ù¥ÿlZûÇ?þ·J劓' Ÿ1uL¯jå|æ™Ê•*L?")~?–•ÚY@órî,ÜhbGa×]I L™2ò¯¡Ö]¯ÚÈB$`o¼ýÄhÕÕÑþ´ì2§Ë %âx_4…6Å_xþ[¡J ¼‰"ÏÂûu¾ûEiµÙj_~+Π©vx­9K\N\E^D™³:\öGVýATcÌ~&/Ùj‘Œ¦Ï¨&:,º' : úßé÷±š1Š~¢qñ>Nï`Èšš ®¢~$oÊèÙ«-¾Ÿ…'A\ =qôb} ; |û}FϨ¨Œ޶¶m§¢æì•‘h¹ðKÅ寯   àñCA'bw\»túò¥ ›7.8}Ò0üwÆäá3§ŒèÕ½]ÙwÞR…µÂûïŽÚw󆥃ôü¼Ög¹r>ƒ‰ÁIã†'‹D–Û%Ãîtg¡föXòs%€èò{=lò’µá'XH€Œ@àÍwž`“Öݲ֟?ç®ßn} xG~ñq¡ùëö¨—hÝuø´PÑbšKWÿª¡øg-ߣ~ŠFdŸÑ‚ú‘ærâ¯Ôï7r¦¨f»?ò¢Îꮈ¦Ä(,²ô—CÏÅðë}ßR=qÚÒmzÔ‚†¾qiýûnœEzYx¬õ!kOÏ"ШóÍpx¶ùeú;²sçY¨9iÁn4RúÝŠò/a???O`BôæÄ#[O'î½sóʉ„8ÿSüfŒž7s̼™cçÏúsþlÌ N7rà§U+ÿãÿ~þùüõë}9gæøˆÝF€YÁ\¹rÖ®U *˜x,òbj¼ÅFP27ÆÍôÑd$ ¦‚9Í?ho2 €”úÛ -fOù©m7M·'Îb€úðŽøÿ8Z^¼a¯~¼x_T@#òÓÙ+¶Ë³VíˆÕŸ…¦Ä‰ø¯úi¦—S+XlÙ¹ýAßDƒ€lñ^ øõhiŒæDÙN¸Ô¿Z%Ú_7Ò4n±ÔQáØ~*U­©iS Ds;Œðx³$à5j~>^—ž~=Ó߃/͈3kÆþÞK™š6mšç 0)fۉؤû»qãÚáƒ{–.œ¼xÞÄ%ó'-Y0ÙáÔ¥ §-]4}î¬qß5þ&Ožge×ñâ…‚Ï7kÒhuÀ¼£Ñ»¦NÙà›/‹)t`Ï6ŒÑ— Œ qs¡fúh²‚P¿Å3o Ž<ÉB$`o•)¯~=3}Ýü×îšnO]°Nœ¥ÿïˆ>¯ÓÈâ`ñ¾¨€Fd…†?¶²Ö ¬S¹jMQgìô¥òMy9|jñr™öG6ë”þ …‹¾ŒN²ÅþˆOÕ!Èjâ¾ ‚z¢Å7qº@n²r‡ƒõ|ħ‚:FõýLŸýp,vÌ7û@^CàÃ{Àëìù)RŽš„±×ü²üF#-œQ 0ùèΔcaWÓOݺy=rOÈJÿ+—Î\µlvà²9Ëç®^áÓ[0¿s‡V•*>Y¦"‡ñÊË/vøµEð¦åT|ouÀü‹gãô˜2|Ìý…ùíyBYÇg ¼ú“béú°RXH€Œ@ ôßXäÅ—ñ:ÓÒ©×M·g.^/¾à¿´ë®ùïXûHÔ”ЈB‹ ªÉ ¢µ>©©9E¼¯6…:Ö·È\½™> _Ôm¤é€¸eÖÆb„çœ} ³€Ô!ȧ=¿gÍÚŒÊý†,Çk};JQÙí9ßFŒ…¤… æ ™s`‡ßÁóíZºØF$ì«@Å ðdÜnäŠ8›´‘Boݺsx‹Ö.X¿zá†5‹6¬]¼aí” õþмþýºVû¬ÊSO=¥þšÌ—÷¹À€ùˆ1£/ˆ ¹¿Ð³ù„ñtï"œœ¬~g6F„:ÍB$`o—}2غ}¬õgî’â ®oïˆPÇbã+}ì38Ð7EÖ‘-gírjǜ۴,Æ‚Qè‡ÿýO­­}„Êzª“g/Cî?l‚¦5qq­µÁQâ#×µFI¾Ÿ…'Av kÏ"°M`ݶXH‚|ÚóópåÊpTî?tÚ¬­`³fÍ g€§ŽGœNØ“v2úæµó÷îÞIN<ºsÛšà åÁ›V¨eç¶Àð]ëö…3¨Ñ·_çË—ååÎ+pÅ<,(Õ—ÇìB´ç eŸ! 1ÀåÂw<ÅB$`Ò[¶ï‘µþÌZ²A˜‰¾¼#>B‹[¬ f´ì<ÐÙrÖ.§v̹ýAËb,j'ååÄG]z ±†]sîu3rêàÍÀ­û5§ «ßÐñøhñêÖî>µFI¾Ÿ…'Abã¸ð cÃÖ]7*tíˆÝk†ïZ=lgà«ï²¢ÿöå¿o[Ö7xiŸ`ÿ^[—ôܲ¸ûæE]™Ðg$ËèUÌ-Y¶=*……HÀä’Ëíºg­?Ó=Yªoïˆï>êXlÜbi€™.IE…ÚuÉ–³v9µcÎíZ–«@5Ã_±9R|´`Uˆ5ì•ÿ^É)*Xk ¡ÁYÐèØó‰ZÄn’|? O‚\šµGˆg‘ dJX­Z?{~í‰U †¯D›µ¾úÏ*Pcí«@Å 0ÀÔäi'K9|íò™‡î^¹|áè‘={B7Ȳ/lã¡È­±‡BâcBOÄïù b¹Àå~çOÇèK†Þê©B´ç1e! à‚5¡›÷d!0 ¦YÛîYëÏä¿#Áè[À;â»:·XAÄGÁíOÖ.§^ŹýAË2Œf,íºgDj±=FQGÐó߸O4ÕàÇV±¨úðq˜k[£$ßÏ“ #Á8zËXŸHÀNU?écg$˜‘#PsĤ ´¬Æ5 £»rñä½»7ïݽ}>-%îHĽ[Pì7ÀÄÃ[δ_5´Á|Ʋ'ÙÿÚtÔuÀŸ‚¤µ¿?Ñ>ÅåäEq û™£¦{ž™0kÏ"È”€£Ù ÆÎ F›j>ÀáÇt fðÜ©#² Ý–†>¸çþ½;ϧ$Äí9r,&4éñàªesÕÊò5~—b"΃…«@íPVñ ª¼duX €¼ñö“PÛ?¶îšµþŒ»Fȉ¾¼#>B‹[¬PíË'éàë~ßÒZ—ðlW/šµË©—pnв0@ôS3ñ~—þcm3ÕD0Á­ÕGSuŸ‘3ÄY­~h?sÔ”cÏ“ ž"ÝËڣųH€$o޶3#|Û¶SQsâ‚Ý8÷õReÅß 8 ‘^ Ôâ*Ðs§ëËÅÔc7®¦=¸³‚éRN%zl€s,VÆ/ë„èMž,ÜèvÃAfN bÅŠòï –]¯Ø•ÈB$`%ÿ6ÀïZvÍZFÎZ-¾ÝŸ~ñ­¦´)>B‹[¬0pÂbqÖ EŠYuPY¶œµË©snвè'þ«^EÓ¼i‘¢&î‘hçý*5lÜ#YG4Jö3GM9ö,< â)²gDY{Æx @ƒïÇÂ뢢3ýÉÕ¢ÅDÔœ±2Ðò<—_þú 2É`Êaì´VÒSão^=ü¸ÊGËçY¬–a€È?áÑÂH0™>©¬à 2bÿ}|Þ Ù’ #x½ô“9À/ý2lF Eí9N_î‚EŠM W?jôËoâ#Ô±8XkªÖ~½mö·H=—}.ÿQ §\N6âÜþ Yô_QGÔx£ÈôøµÏù7'^4ë4ÀÆ)‹¸¢µšÖÆ(ßÇ‹L;¦© .m㢎6Èú$@Í~ ¯ ËôG#’F æôUf¯‹Rÿ‰‹‹3¦¥DÛY–.šyòø>‹•àFÏ`¦O*+øŒÕç¥Ë4[< €”x«œúÁž×Ï~IÓs¼#NÄ ”?o *4hÑE¼?hÚ*‹ƒµQAí^£&J¹ÊÕÕkÍXPm6;—Ë´ÃYèÚTÏBÏñGù&z›é0ay¨/0Žœ¿ÙÆ)rø¨)o¾¾5Jò}{:¦iV Sÿ`d:@V °“@‹ŽsàuÈõ—éÆ>ꉚhvÈŒÕò¯ô§Ÿ~'šÁOF#=`6 †š!`/Ì‘éÓÊ ÞNÀßß_þ5”ïùÂs¶c!0ײd€šž×ü¶¹ªŽhSTøæç'ØÊJ‹ƒµ]á£Z ¬é»VÿsénM›Ù¼\¦v´?h°Ã ©ªÂá5º-Þ±ÆD3(Õxm?0hPâê1zµÊÖ(É÷ñÂÑ'S €º „×!ΧíŒññgQ­æCÐlë>O¶ãëY¦L³à!ä„Èfyl€ë=_h€Þ®7_¦<¨þ’6?xú¦8 hÜî÷:Í:;ZôÝþuà”kÖµT9´&*ü6j¾hyB`”Å‘fZaМ ê š£Í…_BÁ \ge­µL/—i‡ú#:)OAç1–&‡ˆ±ØyëV0ÄÊôymÔ´6Fù¾5¼6Ú”OQ¦=d ¬æµkÒd¬í_\ë×ïCµÆ-¦à*µµ”?½7nlLM>蔂¡ÆÃ¾ŒP˜>SE`¯&pçά@ýØeؤ GYH€H€H€H€2%0~Í‘Jö€ÝÝ»÷ÀÆÆÁƒ—¢Î¯ý—£Á狼"w7Îxyá³_à:C Wë gºuëÊ¿‰Þÿ¬î¸u1,$@$@$@$@öøêqBˆ-[ÚøÑ%ÂÀô›¾ý÷9›ÕµWXŠå[x,j­QÊþ5q‘G÷­:º7 vÏò˜ˆeGÂý‡-‰]½{Á¡]óîô;2'jûì¨m3÷OÜ:mß–){7OÞ³iâž ñÇ…o¶~tèºQ¡kGì^3|×êa;‡ìX5xGÀÀý·/ÿ}Û²¾ÁKûû÷Úº¤ç–ÅÝ7/êúöEåí0`€=?ÓY‡\D #ÍßÇ¿ µú €=Zô\’awýZû&6~üY?´öy“ÎòGr2‹S  æì‰(g õØþ5Æ)4@©›5´´4õŸ£~­-5k3*4h1 M½ðòëòG2r™Â÷Ÿ=áœòØW§ÐM!*ì¤ë¨yáK–ÿdÐòC,$@$@$@$@ö¨þÕP8ž¿ÿNýO5haíÚñiû‘ÚŽZ¦þ›{`` á 0iÿYçŒ6.rµ‘ WºN.ز ¨ Aÿ÷Ouž¾µßÒ,$@$@$@$@™h5t ¯aÑúi@h!>ªöÕP4‚¸ÃÒ ,ˆh|Æ2Ààõ k|öQ®çò”zãµ?Gþ~&qß™¤H'–ǸÊP…ûM )ì¢Ëàï üM$ÿVz¯Ö÷=G± ØCàãê`zS¦lP¬bã¸ð cÃÖ]7*tíˆÝk†ïZ=lgà«ï²¢ÿöå¿o[Ö7xiŸ`ÿ^[—ôܲ¸ûæE]ß~£¨|°ôÎnÀNú53„|Jó½\êù×Þe!   °‡€Æýð›ªL™2W®\1¢&Ål+ûΛg ƒø¡  Vb+ ‚æ.œ/d“ÿ©ãáÙ/4@ Ø”I‡‰Åš™@þ‘H€H€H€H ˰ÑF³ýÏX±@ýfŒ|õýÒBü`0ÿÌ“kØÚ”ø°ì øHøRΚÔ\Øm§ÀL`žªø~Ù×=¼/èä±ÝÎ*`q8t±Á #ÁØóȲ €=êÖ†ÜP©©—ì©Ì:$@$@¾CÀX tQyl€‹ ^h€¾óÅãHI€HÀÕh€®&ÌöI€HÀ¤ e€»NƹªàöDï^h†Âl&ý*±Û$@$`,4@cÝö†H€ CÀ@ˆ­€®+4@fƒ0Ì—Ž! w ºƒ2¯A$@&$àCˆLëf)Ìo¯»L$@Æ"@4Öý`oH€HÀ0Œb€'bw¸´¸Yôý¤æ ÂŽ €Y ÐÍzçØo p1ã`rB¸®ãÁóÌSü„̉Ú>;jÛÌýÁÓ#·NÛ·eÊÞÍ“÷lš¸'h|ÄÆqáƆ­ºnTèÚ»× ßµzØÎÀ!;V Þ00dEÿíËß¶¬oðÒ>Áþ½¶.é¹eq÷Í‹ºª«@û÷ÿÝÅÏ›' ð0 ‡o/O$@F%` ŒÙ~ÂÅå±ú™¨¸Ô;·oöàÞm£>“ì €БM €70„&ÅlwuÉ0ÀsMT\j€Ûþ˜rlçÝÛ×½ñ‘æ˜H€H€2Ðù X$`Ü–ãÚ‚ÁéÌU\· ˜xxÓ‰Ømwn]áƒH€HÀ+ нò¶rP$@$}0À#ÁI®/4@u 0@”¤#[(Ùÿ± 0  o »D$@F àyL<ì†ÖSj¦+®‰# ˆå >0³È> 8‘ Љ0Ù xOàá­‰n) p–ùŠë ˜vò 7=Ó Ðù X$àZ Û<ç÷î¿Dlõ‹Ù»oÕÑÈÕqû×;°>þàÆã‡‚¢7'Þâž‚Áï‡M™±¸ „:(–ƒ^¿|†ß  o"@ô¦»É± € ¸ÖçLþýþç^~©pÀÂ1 èžòØg˜²¸Å±!ðÞÝ›N|°Ø €g Ð=ËŸW' Ãp­óÚ·m®œÏäxê=»4×ϺGÿpÜ€H¨”I‹³3Âëç1 xîT´aSvŒH€HÀQ4@G‰±> ø—à‘ðeë–Ž+Y¢&+ðî¾ÿÿ¬=´)Á]%÷N3oÙ·eÊÞÍ“÷lš¸'h|ÄÆqáƆ­ºnTèÚ»× ßµzØÎÀ!;V Þ00dEÿíËß¶¬oðÒ>Áþ½¶.é¹eq÷Ž?WËù¯¸â°h€˜|øà®<÷& x= ×ßbH€²FÀ±Ifƒ@8PQzwk‰™@Tø¨R¹mëçÈ÷þ"Ã7M4{±h€ÛV éÐ⋜Ï<­w¿üùþm-è‹ !äV@¯üªsP$@¾F€èkwœã% ; ¸Ö‘Ù ú÷h‰|€(ÃtŒÛ¿öXÔ:µìÛ±´qƒÏa/9žzªU³Ñ+5œòGàØ³i‚7”ÿÎѧӷ ü[ï~9r<…”ÂìœúS«Ý¹uÅΧ‡ÕH€H€ K€hØ[ÃŽ‘ €g ¸Ã±0`ᘗ‹†¨Ô®ñ”O/uËæy§tFð¤‹ûGw§XŸÚH†÷Ž"òŽôËk¯²¸åïçëEl÷Ï‚û‰S®_>ãÙ‡’W' È>`ö² ðJn2@D‚9º¬Þ—ŸŠKýFc2P_ôn |¼jô•?t²X'koâæE`öÌ+Ê‚ÉÝÞ-]Ü¢ûUÿ´’µLö ! Ð+¿ê €¯ úÚçxI€HÀNî3@ fìÝ >kß4nÿ}Ù²¤é÷_‹´°Áv­ïÞ<ÏbM‡ÞÌ0ÀãÌ^Vùý^åƒÒݯBù··_ólÔ¤Úùåa5 02 ‘ïûF$@$ànŒ‹\½aÅd±àóýroá5ÞÑ—}Û÷þ­Eá ˆý˜<´VÓâéú78|ßæ-ë jT§Šµ4s§ uŠûq¨¿Š¼4 8— й<Ù x ×ঀ‰åß}sú¸>2 ¦Q†-oÙ¬>ÔJÓô»¯ön_,Þ×—1ú ]Æ8itok5m¿ÿØÇš±lY>´Å÷5r>óO‹¡>GéêD÷£zÍ›!  Ÿ  ‹\k€k–ŒÍ—7Ôå—ŸêaàÑ}jY¿|råÊâS¬ùìÕ¥¹æSõþsGÖ®QY(&!«ýi£¾þ£ \?Æt¥SË:yÿKï~¹såDš‡ØÈµN×?F‚áß$@$àh€Þq9  p:× ²A„¬›Q¹b8Ì;o•غfúQìüï2sÂïbµgÉ/Ï›6X_A¾ƒÓ›~÷¥PJ¡‚¾©iûy.À…­m¢2¼ßO/, •oj^øMôÙÇï #ÂÂÑCºX«içû¸»×Œ0` Z2 áוŸzêõúWüå¢ÓÆ÷·_ÞœR“›ÍòÕe?I€HÀ6 Ÿ  ‹Üf€+böü§¬[6þå—2–nâ¿~SªiªÕý¢ªØXø…ü=;7‹Ø:ÏZeÛï?6Àá†*ÛV iÝ´fÎgžÖ»_þ|ÿܯƒSŒÎ¡FN'„ó{B$@$àh€Þq9  p:g`Þçž ™s`‡ßÁóíZº±@ æHÄr‹¥GçŸrå|þói•ò›WM±V-dý̶-¾!@Q¿a½ês§ °VÙÚû¸úã”®mêzêÒ<)ôüøQ½í™šsO[×/䉼rå |oÚ´i0=øžf1ž‡bÅŠ¤«ì œ Ðà7ˆÝ# OpšbÔH`®œÿš3©_tè’,”ÐM³á~ùžË°JØà·u«­˜…vÄ)¸r{Ê–¥¿·ÿ¹–µ4}{´v×Ùy•Kç<õ𥥥Á÷†Þ¹sgøžæá‘ÿ”€š5k†9@T†"zª·¼. ˜‹ Ð\÷‹½% ·p¦Z”@üŽïÞ± öf¹ îÓÓ‰Â>ý轩c{d¡©  è†Ò«]Ý‚þk.Tô¡>‘æÁƒ¡>- aÚɃn{Ô’““¡p¹6mÚ@ê4ˆ%¼©úNq[÷x! ð24@/»¡ 8‹€“ PH`É’%5;ßjUû`ßöyY07y Äïà ïˆf11X§v•qûØß :0À¥edß^-ö_aQ%¤yˆØîo礜۪]8}䯿9ëI²ÖÎÉ“'_|ñE‹;!…ïA1 9Ä” «;ÃöI€HÀwÐ}ç^s¤$@$àç .¥zuëÖÕüèÇ<ÞÆãí^”¸hÔ k½üR!Ñ8V™ÖúìƒÛíÝæg»Ù \ÑßEeÖèVeJ³(9Õ?­äñ4z¥L:²åúå3=(Y®/Éü¿ÿ÷ÿ^ýõ ¬[·Ž¾—e¤<‘H€ì!@´‡ë €p‰ ŽXï§‘"Ûà>­í^˜ý¸hdÇÖ åêPlüä£rh|ï¶¹G¶¯øÝéeÉÔ•ßÝ¢ûU(ÿvÀ¢ñn›Ð³ÿB§âwß»{ÓÏúü¡G„Ù¿qãÆq§;o¯E$àSh€>u»9X °Ÿ€ Ð… |XáíàÕ“‘2Þ)eãòq}»þü^Ù'Ùö …›Í0Àå¿;±ÌìRÿ‹ ÝiæNj¿’¹³¦{V~êŸ?±ñï“O>ÑÌ—)SÿX€ÅÃö?µ¬I$@$)`¦ˆXH€|“€k L1ɃŸøúÉÀA½[ܵÀ‰eׯé³&ôÆ-¶‰žl[ÞÏ)e_·¦ßV±êsä®î4:û¯åΕŸ¿K2i${Þ¹sNˆjüOdzÀž@lôͯ"GM$@Î%@t.O¶F$@^CÀåRø¹ônúé²Jï—œxpç|7” \Ö7ûåןª?—'§~,¹såDš‡ØÈµö+™;k¦&ï7BÎwUåWÊñƒþIªÐBÈ!OŽ×|Ó8 p3 ›ór$@$`î0@Á?ôõ ¾ó>÷l·öߨ9ÏÕ^Ú';eP×ó?«w?¤yhÓ¢‘ÑÒ‘íÝ ù} azBkÕªeq–+‡$¡bTæ+VÄ›qqqŽ^ŽõI€HÀ7 Ð}ó¾sÔ$@$)· è –ê'ñ[ÿ½2%ýg:°ÃÏ%Ãý{9ZfŒø¹ü;¯XKó°yÍ,w®ätèZYöiíùËTʼnø'L6nÜXMl“XTÌÈ1™~·YHÀÇ Ð}üàðI€HÀ øeoq2®UóÓ ë–ŽŠÚ1×¹ÝêßÓþ²hb›—¶è~eÞ.¹xÎ(‡|Ì•O'„jÙ§ ÿ€eŸxlE1UˆgFý·¼ÆB¼Ï¯7 €ž O €Ež1@ÑLãhVúIãúªÖ‡Kf Œ ™ë¬’a€KzÚSgwþæó÷žúÇÿêõ¯øËE§ïïNsèZp¿›×ΛèAÇjOÆ ”㊈ˆèܹ³&r æ 9&S“4v•H€²IÀQÄ lÆÆß±Ù¼.O' 08O @ƒ9õ×¼ê]•ÞkÒÈ.Q!s²_p¡-KzØ.ëçÿÖ¼q•œÿÊ¡w¿üùþ=¸_‡|̕ϞØgŠy?ý—A•@Gý`OàðáÃ5‘c°·pÚ´iŽ6eðo)»G$@Y `¿ÂúÔÅkz`€ó 0 Ï Ha~Ê«©áT+ñê‹z4ß¿}NvJ†.în£tlŽ4ÏXLóбí†Mó÷»}ó’Yž6‹ý„bkÈãð: cïÁúà~êíƒâ¡bä˜,ðä)$@ÞAÀÄߺ¹lqËÞÏÚßÉÞA£  /&`|ñ;«û¬y`®œÿªÿUU¿É}öoŸ…‚ö7/êf± èR·h¡ç,¦yøùÇzÆLóp"vÛų±÷îÞôŽG«7ÅT^–%Pp@;X Š¡šDóx®øïÙÞñ¨p$@ö°m€âÿ¹ÝO}Û­¹ªÂ~æ¬I$@¦ ` ”?â1uc1X¨øR¡‚y[5ýjíâû·Í²¿<6À®š2ºo÷ß(jñÿ_ÖúxǦùî\ÉiçµäóÆ•TS<[uR•@§LÜau1~¸h"Ç – Þg¢y‡n +“ ˜”€5Äߨïgíß[õÿOD4fD`æFk“>ì6 è ÎEñÿ'¤°¶?Püÿ©Ä«Eûµáâ¿Gn›™iÉ0À…¿É2{d³Jå^µè~U>|oÝò)vú˜Ûª!±ûåóIÜõâ‡?/ô7¿Kœ˜ìMá·‹Xh*üšÁ& ^㼯ÿ%ìÿ|f:ì0 €JÀè(úŠèø§G‹ÿëÒüÿ©Dñ¢Í×Ö÷—~ƒ"ƒgÈ‚F¦·môey‹iŠz~ü¨Þn›Ð³}!L÷aò:üõ×#|XU tÊrP=CìiÁ/MðlDIJ('Î=úà½ãI€ E@ &Ô§úÿÍ&ßÕ;¾îLB¸¾àý_š5²ø¦øß1s±ê^³3$@$às ~ k6wYüŸ“|³Ü;%¾ûæ³^¾Ç<Ï3VÒ<ôíÑÚã°¾«é§|gºÏÆc*%ÐÕÿÒŒ !r 6j"Çà qè‹ÄÊ$@$`40À2eZÖªUÛâÿ(kU¯²cóÒ3 ¶KÄŽU¨i±,©à_•F»éì ØCÀd(‡„îø™n{£ m9Äú¤yðH¨Ï¤#[ |—ÎGL—»·¯ÛsŸ|°Ž›WfâwŒæ‰‚Bñ¤qß‹>~2 ˜;/^Éâÿß-óÖŠÅSÏ$l^·àƒ ïZ6ÉZµ¸zÂìO ûO$àkÌj€ò>‰Í]Ø<†ð¶•Oý´eóïî ‚†¹º¤§»t.A\µåÁ½Û¾ö„™n¼ø)ƒå šDóX2Š I†D7ÝÝd‡IÀ ØõY´È s¦<›´'k%`ÉÔRo–°ø¿Zü{™›ÿÙÎï,‡L$@Î"`zTAá·;b{ØH&Á·Îzt¼¾üšÁ?.haÕ#Çxý­çIÀ¼¬…ú,?ïÀ~]Î&íÍ~™3}LRïøwX$ä¿”™÷áaÏI€|‡€W zÛèëú?qÿ1Ÿ'„û1-¸ï<ÙN)ž%LâARç™I&¸öɉœÙ @vØõÙµSËc‡¶¥žØçÄ2bH/X¥Å¤ø§XæÚÉέä¹$@$àj^k€®Çö}ÖVá7;iÍc!æŸ}‡L$`øçNMž)fM¨hï¦Ô‘®(ÉqapËܹsYLåF€Ã> è ÐùT@V`>ëÔXDˆƒyBDŽá?~g(Ï!pœvÂkÛH«U£ê®­©'ö»º;Ò²ù÷“âoHü•èø°x €k Ð]Ë—­{=üÃbc}äìÆá~¯¿û xŠþzÁê‹AYÊ•-½ÒFZò~w–è}›5øÊbð×#WIxê9áuI€HÀ"  pü ƒõ!,­ú?}à‡.Jmïœ~³ SÀ*l´³þºh‘B~3Ʀ%Gyªì^‰¹G‹ˆ¨ZÜŠoª%ðf4@o¾»›Gà÷>aE¨šh‘c°j”?€—rȰe˜ÁX›j1y þJäß~&zÙU o"@ô¦»É±˜€V@a—&t;vÈ`!rЛ`ì" €»ØõùyÍOCCVŸ?mür*aßÝŸµ”4Kå±S‰vÜE”×! È @äs@ž!€EP˜ÔDrGäÄx`¢yÏÜ^• CÀV¨Ïwß\6Çøâ§éáñ˜Ðn]ÚäÈ‘Ãbò@ü˜aس#$@$àýh€Þ9BƒÀ¿#r 6ª‘c°á‘c°úËàg÷H€œKÀv¨Ïy³ÇŸ?}ؼåÈí­~ùÑâæ@,’çiç>KlH€¬ òÙ €ò!F‚&Ñ<äŠÈ…RºOì ¸†€õPŸù† èa^ñÓô|Ħº_ÿWâé„X!ÏùrÍÃÅVI€Hà?h€|HÀˆ°ËAÕDóˆƒ%£X8ÊzF¼aì d€õPŸ9ºwi›~áô/+Û7­øðƒòç‘X•‹á³÷@ñl °E€Èçƒ Máa0-€P1êï$ü39ÞdäCß9vŽì#`+Ôg“†1w\8ãÅ%p…ß[¥þ$Yý‹Ñ’ù·œ}k‘ €ch€Žñbmðì ~a2PþHÂÎDTç?–{ê¦ðº$¶B}Öú,lÇ:/?ÍÐæÏžP´ha‹I#°#š ²ó˜ñ\ Рò© “À†@,Ãæ@M¢yl 2Ù`Ø]ðI6B}¾÷î;«æ]<ëƒeôˆþ äÓ{ ¢daU<“úäw…ƒ&p  K°²Qpˆˆü¹&r æ 9†¿–Üs xpˆ€­PŸE ÏŸ;ébêQ_.g’öëÓÅbò@ü›V¿3&–CÏ+“ €E4@>$à °œ ‰•ÕÈ1øwtDŽA–-. ò†Ì1x«¡> ä:¨÷ÅÔ8A ñؾÖ-›ZLˆð¿pyÅãÀA €ÇÐ=†ž&W€ïÁúIO]I3„Â]qE¶I$)¡>{tmŸ¿/=틆ÀÑèÐïÕ³,‹Þ3eÎ $@$@ÖÐùl€wÀb3üK9V„ª‰æ9«F±vÔ;ÇÌQ‘€ñØõÙ¬icHÅÏ6ˆÝkת¦ñ@Ä2Þ­fH€HÀ4h€¦¹Uì( d™æðOæšÈ1ˆ%ƒ÷³Ü&O$°MÀF¨ÏÚŸWÛté\<‹¶­øøã*ªòñ# È2`–ÑñD  °@ÀV¨ÏreÖ®ZxéÜqû ܽsýöÍË;‚Ðù}# § :#!  ÿ³êóÅ¢…úM½t.Å~wn^¾yíÂ鄈+-÷ ß1 p  S0²  _'`=ÔgþaCú^>ŸÈb?[×/üõèÑ…3±áÆlYÒcËân4@_ÿ‚qü$@Î#@tK¶Dn'pãÆý–Õ­U°ñéÂ… ‡=>&OžoçXѠʶ;cç%D5'6åÐuY™@ÀF¨ÏžÝ:&?`¿ù°æõËg=zx-ýÔÙÁK{oõïIä·ŒH€œK€è\žlÜJ>f1Túk¯½V¯^=!Ôôš$ê¯Y³ÆbGq"ÍGݺuÛš U®\Ù†IJ+ÃY¨i ŠÅËe`ÖšJMMÅè²vEžE `#ÔçÏ?}³çÊ…$; \¿|ú჻wn]9¶dûò~Û–õ¥ò[F$@® @tU¶In" ²'fçp´hÑÆ%… wjW¤¢æõ½Ô{Ä%ð>L ?vÑæqEñ¦íÉ@q9à :!Øèž›î"/cN6B}~Q»Æ¾ð­W.ž`±“ÀµK§Ü¿÷KŒÞ0pûŠþ4@s~-Øk s šã>±—$`‘€0@üWÿ©øH#iÒñÔ.S„#‰Fôº(Ì*hãÖÜ3íŸ:°HÀV¨Ï÷Ê®[íåb2‹ýîß»uûFzJÜ®Ýk†#â ß; p5 « ³}p!ˆ«ê%M8˜è³¸T3ˆé>T³¸Në'3]x™©bÙn!ÓU¦TtCðµÑ”µ-‚¶»‡–3í€ o-›6$[¡>_,²xÁÌ«é'Yì'p÷öµ»·®žMŠÜ4aWàЫ†Ð ùà³S$@ÞF€èmw”ãñ)¶ P/iÒy„Úé'÷4…eŸ6–qf|ÅQÄpÐ\î*UlhÔ¯5•[E\Ho€Øë¨.ˆÕ4%®%67Šä“£žh­>õ˜q°‚€µPŸÏÈ?|hÿ«é),öÀ‚ÏëWR/¥%DOß½fÄîÕÐùE# · º 5/DÎ'`ÛÅÌ GÎe©J&öòiÖ‚ê=J´`1®L¦ãÉ‚Ê)J8LLîB”s}¸¨è9ìNl}”š‡®ª'·/ÊjâQž‰KˆwD€Sñ¾|/ľJÁ„ó™Þn/®`-ÔçÓ9rôêÑùÔ‰#×.¥°ØIàqš‡‡×.>¶$lÝèе#i€^üÝáÐH€ŒI€hÌûÂ^‘€]25@Ø‘ºQPU21C¨Y ª7@˜’:W&¼ËNʲªíËh7‚bÛè§%Å0Uïh¢¡ u”ÑqôÝsžhGNÛ¡vÝ'V2-¡>›ÿüãñ¸(„0a±“ÀkiÞ¿}órüuÿ ß0–hÚo;N$`n4@sß?öÞÇ dÇN¿Ôân:‘2A|$–M M’ófÖîBÖ P¢Fí•°8ÚIs“=Q§õÔ7­ù°¨#¦5Tñ¾Å‹úø³çõ÷êóËÚ5#÷„`‹ÅN7®¤!ÍÃÝÛד†ìÙ41"h< Ðë¿A €‘ Ð|wØ7È„@6 Pº”.‹(;„ÉMzúE¤šîfÍõi Å„ž˜´ÖC=1]ÄzQÛ(*`Œb‹£<ÄÒP‹1WùŒz¡>Ë¿÷+²œÅ~îݹsó ½ìž¾wó$ ÷}e8" Ó šî–±Ã$ðv t*½’iÖ‚Ú6@½˜?Äa#%`Ö P¿ÄÔ»ÕÊ-‚bêRÎaJ‘ÓwO䔳ò Ðë¿{6C}]²pÎõËgYì'pïÎ{w®Ÿ?uøÐ®‘[§îÛ2…èõ_"HÀh€¦¸Mì$ X&`g,P¹«Í¢’©kA5ˆ¹/ÿÄšI^$.§3u$šË‰ádÍ5MÉœõè$š¬ÁeÑEЋ‡>)"ŸKo"`=Ôg ¼qå,‹ýæáöKW/ž<¾tÿ¶øIô¦/ ÇB$`v4@³ßAöß§ Ø6@M ²6)'| ÿÕx”˜Ó/ËÐ3D“Š7ïY܆'æÅd£úÚšLÊ–5ΦYÌ©§¡N6ªÓý¼ûk–œœ\²dIý¬/B}öîÙõÌÉc7®¤²ØI >ÿúë6þÛ¿ú@Èœ¨í³h€ÞýõáèH€ÌH€hÆ»Æ>“À6LÆðTýÍšʵ š);¡Lð"‹Ä-ÆÛÔÔu,æ”Sˆjܽ²¢5ˆ4RöÁâ–< TN6Šv,F”±½ÐÚ‰Âõbø zfÍšéõï—æM“â£o^Mc±“Àíë=zˆPŸIG‚îœwpÇ\ w|A8  ï#@ô¾{Êùa,"¹j–‚7ÅœžÞ‚llÌ“ûúÔE›˜ûÓ€0Të3¡d¸ŠP;kDÅm@N?Ùy:¤T®ÒTó.ˆáàQFñ©ŒÎ"”]’>&]Wö\ŸÔgÉ6rÙ*"¼“»ÅxÕ¥­ÂT­i°=mÞ;ÔªU«ªøÕŸØzóê9; ܾ~iîݽyúxDôî…‡vͧzï×…##ð4@o¸‹ƒÏʤŸÁ€ÉèwèÙÍ"­Lå 5&5VJ¦ú'ڪɳ4ù$4[þÄpdr?™ê]3…ˆ³4Á]DMÕ]åXð‘øTH¬ÆŠåФ੫¹æõ»}ö©ó¾«Øñ—7¯žg±›ÀE¤y¸÷湔蘈e‡CÓ½ï ‘ x ÷ÝSŽÈ‡`² Ö¤?¬é ¦ÂPÙZ?L¸‰¦ôq!h˜°)xmms Eúh…•‰ÓñÂâŠJ¹¨UL¢&æß,^H¤(­‰áè{Ž÷õ—ÓTCƵ4£–çÊö}è©ò½¡ªصy͘ÝËn];Ï’)û÷n#Ô祴ãq‘ˆør$l Ð÷¾=1 €) ÐMyÛØiðJö„–ñÊsPž% à€?o˜Õáxäú[×/°X#pÿî»·®"|BtPìÞ1{–Ó=û óê$@$à C¸X™HÀ…h€.„˦­Ð`TÈܳ:BÚ„ECàÞíëõyëzzòѸÈUG÷­¤ò»E$@¦#@4Ý-c‡IÀk нöÖ{`z<°cÞÆÙïô¿}#EÀ¤ß_"Ñß™Ä=Ç¢Ö"Ù ÐØÏ5{G$@V Ðùp … Ðb£ôýðR ðà®[ô _óç+ç‘ÜÜ—ËÝ[W=zðàÞíó§?¸!þÀ: —~8, _!@ô•;Íq’ X$`Íí^´3à%¯_:{çæeŸ,W‘æáÁ½;S%Þ’p(ˆÈ/ x ÜDH€H ël`tè’ˆ ·Ìíq9-Á× iÜ¿såâÉä£;oIŒÞDÌúCÆ3I€HÀHž µ˜ò"´8ÔÄÍÖ† Û±n^s¢Œb õ6° p¼‰^„n—œÄ“}!0";wî9r$ `èСÿ>ð×Ô¦M›NŸ>mijOn$`Û‡/Ý¿mÖê ?ŸO9‚õ¾P ~÷îܼq5íT|؉˜mIG‚i€n|y) p9'h#¯´š :Ó-:j;k֬ɴû2=´µôeb_>Ûµx©ºì¹J¦Ý` ß!ئM›‚ Ê¿Xðïà}ßÀ‘ª25À#Ë¢w/^3©elX¢xq¹ïÖ_ý…Ùδ䨓Gw$džÐùe! ï#à€ª*hCØÔj¶gö@Ó¶BðT÷Cey¨ïczÐûn GD$àjìܹsÉ’%åß'O?ýtãÆýüü®\¹âꫳ}ã°Çcö¬8±"xaŸ%ƒ®_=‡˜^Vîß…û=º÷æùÓ1)ÇBSâvÑóˆ²'$@$à\Z³|ú£E‹ê\^[”@Í\"βÝ]ˆsÅÏ2Ôã©—ÃzT¬ Uý3Î},Ø ø¸¸¸qãÆU¬XQý§¥ZµjM›6-99Ù§Pøæ`í4Àؽ+î Ü45p\³³ ‘Þc€wo ÍV~^:—xúxV~Òmð¯ÛrƒŒúÂÑÍ)¨/N×\N¼™é¿¡kβ֚cqôr¾ùwGM^C@k€Ð*cƒhIgà ýßúÕ¤¶ÝÌšÂñÄGÖTStRµD¯¹% €§¤¥¥ÁúêÖ­«ª`™2e KôT¯xÝÿ{çU•þÿÿó¬‚JPÁ‚׺«èŠˆ»¬º ««¬‹Š Š(J¤w¤—PC()¤’HO&uÒ{ïPC¯ºûÃÁãõÞ;wî”;¹“|ó¼Ï09÷Üs?÷Ìd>óž¢5‹ °(=0?É;Øe|v¤Ûå‹gœ=h›‡Ÿ¯^>u¼¶±2½¾<¨¦³)LœV¢(´8‚B…ì‹l:DX†Ü½ÿÐYÔ4†—‘­Íl üZ,=ÙšQ@@Ï,3@ºzoâÚ&Mññ·eQäDL ¯ÇìO^ƒòû¬žïÚ  7´rŒ§§çèÑ£»uëÆm°_¿~4jo5z»Y¶·ÇR,Î.É<ë»$|çÔeN*´Í¹ß¹SMM59 •é ©0@•}IÍÒ ü}ƒÖ®3U- P%p°;‹ Z@ èññ™¢ ÍÒT jÖÍ~)ÅÓ€fKšbLJpX׺£Ø ‹Nd¶°u?(˪r}W³ @hÛBBBhÒ?þ‘Ž´äVŽ!QlÛ×ÞN®Î:,Í É6ìÞ¿fLv”Û…s'/_:ë,ñ3mñwå"-÷r´¾àpuVcU& Т®.ü²›>êHX&¿c˜]´; ƒØ‘€5H§çom¢]„à è›rþögj,¨Y4›dûOд@K‡°³™„¢Éô =¯À—NGß牎¢gLþ§_QŒ=ææLùþ eétìO‹”)œtr¦Ââ¨T˜~ËlœjãƒléI5û|رϡ*pR´r ­CCFiå>꤅f« °,'”¶Iˆ÷_î¿úãê‚øË—Îé<®^½DK}^ºxædSù‘Ú\ÊþÁ­x ð: gè+ý©U–@Ù/p1 ÔŠ;‚C@,%`¥ò÷5ÑðÑ€r^LvÒ Ð$E™1nt c®xæP8Û‡?6•´T8ŠÚ)«ŽL´ ×?.ü†ˆð3Š*§ÿ -Tt²ígß5Ò¿¢á+T ÐÒ— Ê·s´< ­#ÔzqÑéI¬ãŒ}ÃF¤íòJÒ„¹~oð˜wúx m¨ ÃøùêEr?Jý:^s´¾ðh]> Ð꾪ÆYåôÇšÿV9R hõ}Á ê Xi€BCžL:¥Xy,¨ÂZ Â¥>É‘”Ssê/˜JòQ¬,ãÇÇs ÷”¾SK×&e qÒF² ä×Âzô$«Ÿ'âLµ_¶€ð/ ›hÎZ"l¿Tùhaö+ø§ETQÚ!Ú4‚€”¤m$øç†íˆ“^²íX™]UhÈŽÙ½í§¹÷s§ëH¯ûýB‹}žmn<ÞXr¬¡hcGUo€t"áWájÎ TC e@l$`¥òw(ÑVRT ª`€Â%gxÞŒ‡´Ñ¹IŽÒ€LÙ)ŽÂçenæuŠòiÂq¤ÉLþ‡A4˜VôÝ¡Pçø*©ÔN)º"n›¢Á¥B£žÎÒѳ6v8m’M¤i49P¸ÑZ°¯ÈÙ!صË.}•€€½hn€¢/ÀD¾¡`€t ½ïˆOòoÙù;š#y^N"KÓ‰rh\ŸLɧ©ÅKùÊÿà:';—€_»p’!—FSCU¹r‹êä—€¤Ÿ½^<¨d Ðk– ­CÍÓâ¢X9FŸ}ÆŽXM{©—$Væ÷ÿ°†{àE~éà õ£¼-÷Ò|¤’ôhǾg©ò1D²-Dߤ ÐÔÜÙ%¸J¿@gŸ¨€ô+leä«H§ÌÈ~–à§Âïép|ö°cDU `;G µÒÔXPed—GþÃÞƒxaá;=©rl=‡ÅëQ™KnNhЏ©2ì\ô¯)SåoÙÒ²¦j¶Bþu£è¤f%Öö΄@„h Á%K–Ðv‚·,2J[bå]u»`m©±®<¥º(>)pUÀšÑ¹ógOÒ*,Ž ñIû»Ó†õÍG«h“÷ß9@;u;K ÏÝýfÖ”òÏ*äN,±&üNÜÔ\ö‘ƒýKŸè(¡ÅÑ“¢…ë P8ù…·AX›ôËkn€Â¥ïX{T~â²Ó-B5 f8ÈMUc€ü È‘èD´&ûh¥°á„€ðK5zÿ¢·?S+y²cù{·ò7Xü=WxFÙ'…x墯ôødEáˆM5.J•ó Ž;å¨|±xÅ€Ø-CÖ7tèP¡ ’ÒÊ1ØhÞî´­¨PÁS£wÍšòiתüdŸ‚¿ÂÔÚžíH»A°µ@i%6F² 3ÀúŠ´†ÊŒÚ£1hßÊ’ƒ×­-¤-ø´ ÚÞýÊå —/ž;u¬†Æ|J£@­èÒC,5@Sg„ã6ùYxafq¢ù#4–’pýJ˜s“~(âJ¦¼€o†pß/iæÐTVSÔxn}Ð?»tkjh;¯gyHS?ü³ð½R6'j§¬%ªùÃ`¶1B&²ª'†’ ¶`+ÇЈPÑÊ14jÔh4Ú^?j°Ž€‚< cÇ:Ý<úÃXg€UY‡krèßlÞƒ[&t™Pš~ˆöüùçËv«ÿû_ËRŸgNÔ8\j*`€ÖõÑQ3@Ù5¸›‰\ް‘WB— ûE°© )Ïä(dk ¬Ï. •€€F¬4@áršÂ–)(—޵ÚÙIiV¡p¤EŒds‰LE_žñ‹’Žƒ—}ÆRäߥñìÏõ‰Þß…ï­j´¨K 08’­CëÄWŽ¡Çô =ïÈfà\D@Á{ÞÞ½ÙÞróMý¾/.d§¥9@f€MµyGê hNï»ÌoÕÇ,%øËÏWlr?ªäÌÉ<³µ@mïóŽ1@ÑèPa³¾8VoÉ?¹ ÇÉ~lS³[•lm¦²¶3G ö%`¥rï2%K²9éXPYdù=úQ³ I ¯ÄŠñt ¾V•Щ„_¡ñ÷G>ž5ÏÔpµ59@Ž…ÃäùRá{«r¤‘´ï+µ€½Pör€¢æ)OHÙBÊÚë,¨G€‚Nüâƒ.oáºÝÚeëº9à±Æâã‡K5çÅ{ÚúmІÏÓ¹4UåÐN+‚¹ß¹ÓGŽSµêhûkÁ1(»Ü k<ÿ &üÆÙì_yúŒÄz²ì'áÇ6þ!Dat•lmüSŠ©<¤íðQ€€]Xi€¦†(ç©Å¢± ²È+Q9»§¥CÕÕ3¢´}¡%ÊG_ðö(¼›:‘¤cEß癚=hË{«Ù¿ êY¡$€€hN Í ­C³i!6š×8¯Sy%˜E³¿º­Ç­\»té4rÄ[¹É*çÊ ­ÎròHeóÑêÃUÙyq^á;§ú®ø09x]U^Ü•Ëi)³AÛ»Ó|ÂógŽ‘ø‘ÔYØÐÆîäTE)ûYKÍ_yé§ …ª˜+*ü°…0Wiõf†6Þ `)k ¿_H‡(˜5@j·,úKÖ-E`…ÒwW¦öÁãc2ù7X*½KÖ?U çFI?ž”NSr(¼ñtuÒ•EÕüm°´÷ <€€h¥P²>Z5T´rÌœ9s°rŒÀÍ®J+ÁÜ{÷7ÝÔ‘ÝšøÐ÷ÆtS³Œ²ž:^{úDý™“$„EÉñ>‹I žóób=›ªriEOÚÐOÿ¥-þ.œ;A“ýŽ5Z0@{‘¥È—|}jRžð¯ð¥¶‚¶)'ß,5@5óM`€6v'­BÀbî3# Æ…cAeWOá91ú­Ù´ÙŽ)âp)³ÇÊ›ªYÖ÷ø)L 4e3÷ØðFª4@>ñüS:-PX!×]Ù â¬$o‰t-P…y­ÒÿpR´ í"H#B»uëÆß-i§A5ªf<ت$`ÖóŒû2â<ÞxuP×.øèÑýÖ…³¿1»¨J<{ª‰sž;}ôô‰ÆÊܘÌðá;§y/ýýK)7x¶¹‰ò~´Ôç%ZíåpY‹ÅÙuùGjs›jrWg5Ve6T¦7T¤Ö—§Ô•kKkhESZ×´ÐPUS™E‹Òe–ç„–e‡”f,É .Î*Nß_”æ_˜êWⓟì—ä•—è‘›àž¿';nWV¬[–Á53fGFô¶ô¨-i‘›Ó"6¥†oL [ŸºÎ²ÆxhUÒÁ•‰Á+‚–Å.ß¿8.`a¬ÿƒß¼ß¹Ñ>³£½gEí›é5#ÂsZ¸ÇÔp÷É»W ‰Ê›«E1K ÿY—]»EôwY¸¥ž©Æ;Ì•s€ì·Â‹BP‹þ†:A@ – ½éð¬ì÷Lj .ƒ5e€¼e $ãFdÖ>ᆠ²i@Ù1ŸÒÄ èf˜š©Ò©6V“7Ñ0}Ṅ_%Ê~Ahê/r€Z¼~P'8Œ@HH­#Úh~ôèÑ´r 6š·ñ.¨1@¶ÄÒ¹ßÜÚµËo#B;wzô‘‚}¶(ìa©’ £®$%7Ö#Î{qf„+-õÙ|´òh=­(csÀmè4– ÿà$Ø©œTøž—7@XFÍ_yKs€–N®ÚЭp(8”€ØéÝAºÄɽ³ð·0&*²[œ«4@ºDáŒ;ªPú.#,@§£6ÐwÞTŒýˆ6´hÎ1·5:Jô=ºpá ×›EÅ„»¦Š°¨7@®vì³…Â[¿pùSÑŸ¡9Ó®A®¤æoƒC»N `¬¬¬éÓ§‹VŽ¡!£´r 6š·Š¨ÒZ 9 ¹”Ý2îãûôÝxgïž7ÜpƒÐG¼÷VNÊÙý-0ÀSGΙŽÃ™çO=Z—o¯@кÞBGYd€¦†€òB¦r€ «°ÈN~1ûW^vˆ“ìÇ65+ÁÈÒƒZÝ©p 8˜€ØÕŒù&‘Õ?áÛ¢Â;»BÑXPÙê(·ŠÞõ,ZT¨sÌfÙH¡âJg` ‡¿ÊE‡‹¤‹.S½ò¢yÕ²B¤ÇÒöK3¢fÿ68¸çát 6 åahåaþŠÞ=è¿ô$Vޱˆ­ú Û>Çè÷ê]:ÿ6"ô†þеK禌—î¯Þi ¨B4VdÒ0Ñ#´«„Ý£@-ê&¿Vo€ÂÏÒÅí”s€ _mKSyÂ/ÖM ç^'üŠYÖ¹µ*´ÎÂ>>a¨•݇@«Pk€lt"½Î•'Ÿ¨ÏÒU Ç‚ši@oC¢l¡ÐYÆÒ €d°¦ô’N'9v v”PycLY¨Ehjª€ì=Ù–ÈŠ(ÿÛ€y€Vô:'@©?JRP´Ñ<¥ )a¨óÆë¡y– Û bá»ÝÚU˜ ¼ùæ›zÝqû¾=jKuå)õi •ö6À\ÊÝÙ+0кî§ÒéóÿC|¥O” >`È~áŸDJÉÏ%«mÂ)0Â/ñM}lã0LHâ§~ Cк…£@Àñ® ½1ñ–²T¶Œ×cj¥MQ=ü\ÊõSŠÞƒè]†ÞïèM‡þ¥Ç¶/„À«%¯S_'Û7‚@-¡7bz d¨2Ei)=‚F†L PÓ~jkŒÊ[‰b NG€&Ò´@š(Z9†&Ò4BÇ\5€’Î55Ñ:¤Ý ’¢<_ûû‹”ý£M;hÍÚÐkñõõùêËφý–`ó᳊ÑXžqîT9›}+ÁXñº ô#}8aŸ„_XË~b1k€¤a¢ù©¥“q„gɡ¢ ¦ OŠ‘–"œü"´¢;áh× °UΓ‚€hD€>8Ò’¡¢•chYQMõŒÙ‘¦g±/4« vƒ u2«+ ¯\>{öÌáæ'—у+W.Ð×s<Ð×c«Êà™æFå€êp-P5gL Ì¡>lv(«Ÿ¾ä%O ü‘ÎUáµñ1¢ìKjáØ%izPaè×<69…ÕFO ljhß·&ÔÚ€jÇ5ƒ€@ë -i#AÑFó4d”¶ÔbåwÊ2N$ʘ—”›ìÏW‚¡y€l(Û¾¡"íÊåsÇž8VÚ|¢’ÇùsG)zÇ={÷ê¹æ§ù5eéGêhÏÂcÅÇ—òáݰáÌI3AxöÔaJÙÙ=°„¥¯Rá¢k hv¢Š²’M ŒŸHy®Õ)Z¶€(ˆH®÷ìŸùW^J ­à °2?ºªÐPW–|´¾èÌÉÆKH)Î\ºx†ÒƒÇšªgÏü®Gî]:w–]8¤k×.´¯àk¯Ù±mCSC%¥AH«ÅÐÂ3šEj}yJ]©±¶$±¦8¡¦(®ºÐPUS™EH—YžZ–Ršu°$3¸8#¨8}Qšaª_AŠO~²w^’W^¢Gn‚{Nüžì¸]Y±nY×̘ÑÛÒ£¶¤EnN‹Ø”¾1%l}rè:cÈã¡UIW&¯HZ¸4~ÿ⸀…±þ ~ób|çFûÌŽöžµof¤×ŒÏiáSÃÝ'ëg cº%Î Ú€jÇ5ƒ€€  Y­*Z9fÉ’%­£ 4k€GŠ'ûI‡7ŠÇ}ÐÃmå'£Þëÿðýaû· †ƒV“;•$šÚ~ËÆŸzð~ò=S HÒDÁîÝ»ÅBN¯ èÄï&h:€€ÎÀuvCÐÐÚÙÖ´¤¡¢æiÔ¨ÊÿHÙ¤4ÉV ÕÙõýOfý]7/º³wOºŠÎnùaÊVξ«oï1#ÿ™•´ŸåÍ Û ÂøÉ¨{÷îE¾÷‡?üAjƒ44´ùX(Ê(XOi:M9@½uN´@´ Ô‚*ê¶I $$„Ö‰n4OR7zôhZ9Fy xú-“@ÒH½I JL‹÷‰Þñü€'™³½:d Çº1¿×·O¯³'©7@¾`jbÔäIî½çîN:ÑJ¡\iå˜æ£Õ¢€"Ø6ßSpU ­AØÔqNprdqÓ§O­CCFVŽÑ­ª7@cŒW\øÞÏÆü‹ÙZ÷n]'}ýÉÖ _òb¿{úx¹(•ì_Õ|´%r2â/øñᇸùæ›iy˜Ÿ–ÍgÏ £¡,vŒ ©†Úæ:ù Í5`€j(¡ €€€<Zß…VŽJ©ý—ž”]ú…†T€Ò\”NÔ Se¬+K¡ÿrÓ‚)È 0:d×ÚŸfvïv+óÀÇ}hñ¼ï) øÀý÷þãÍWÒƒLÍàÉ£•¢(ÎOÉΈ“>OÏ\3Àºº2£¶ÔI§D3@@@K0@-é¢nh7håJRP´Ñüœ9sDÃ>õ&ʘ›äUU{ñ™â\7Àð`WŸ=k_zñY>tsÈË/¬\úÃçŸ~xûmÝ'}ýiyA|=­ÛYI{÷e®ÉiªÍ;RW 6À#•´‡„Ê`X[š¤y`-ÐvóšÅ…‚´[0Àv{ëqá    íIÓIóD+ÇÐBž÷£Ç,hûÖó¶_ƒYÌ3î£]àÏ>ÚPSÈr€d€‡ü·ú¸ÌÿñÛ~÷öexËÍ7 {ûµŸ–Î|ó!´çûw?ËJ 7m€'X-x¼–¶jp@`7Û;j=€êùî m  àÜh±PZ2T¸r i!É!-.:sæL&N”9lÝ‹Tc€ùÉ>)~”Ç;sêX’Á ŸçFï=ë>ùø½[n¹¾ç{¯;n7ö? æNyãõ¿õèÑíãÿ¼—š"Ížhª°(~5À„ÚÍغg­ Àµ&ŒúA@þG[ÒpPÑFó|!™Ö•@õX˜@[>œ=}"7#†å™ºï\å²vþ«C^äƒBï½§ïèÞ_±ôÇï¿sûm=Þx}H€·›p艦r‹‚ ¶‰oq3Çv„Ç«@Ú.`Û½·¸2ÐZ†6šg;CheÑÖj¬EX”XšzædC}MI°ÿVn€»¶­Ø¾iÉÌiz°¿.Ê’º¬_:qÂØ?>úðÃÝ¿Õe%íqüp™¥ÑPšJ{Ä×Ç;(`€­Õq^О P{Æ8€€ÀÿþGKÅРÐ%K–Ð$@’®Ž; °W¯^­ÉR¤9%™›jrÏŸ;“’Îr€Ì]Ö/Z¿jÞØÑûñ«»µk—ao¿±iý²E ~xiÐ_zÝÑsÜg£i_øk*¨6Z ðXM˦ó‹BCUALe~TE^dynxyNhYvHiÖÁ’Ìà⌠âôýEiþ…©~)>ùÉÞyI^y‰¹ î9ñ{²ãveźe\3cvdDoKÚ’¹9-bSjøÆ”°õÉ¡ëŒ!kŒ‡V%\™¼"!hY|àÒøý‹ãÆú/0øÍ‹ñí3;Ú{VÔ¾™‘^3"<§…{L wŸŒý[ë‚ó‚´=0À¶wOqE  Ðú(×G¾G#?iÖ)–pP¡øÑ¯¨À¨Q£RSS[«ÑÖ`iVHeAÌÙæÃG›êîá¸ií—u ]Ö/÷ùG”ôã{ã7¾öê_·¹¬rÛ¾nü£|à¾;{÷"4Æ…o,5× °ºº(Öql­‰ó‚€€Æ`€Fõ  Ј|O4“ý—Ö€!×¢ ¥I)%¨0V`YN(%Ç+3._<[R˜íî¶n»Ë².Ë\7/wÝòÓέ+wn]5öä—^|Nä…¿<ûÃôoÂîóñÚ1é›/úõ»û¾~÷Lù~BR\ȱÆSQÏ °ÐàÈ@P']Íû€Ú—'jöB ¹¹yĈ¢½à¹êôîÝ›~E³ûhkxò=*¬[.6 ’¬Ì¦ñœ§šOd¤Å“îq]½gçÚ½nëöº­wßµÁc÷ÆM–½ó¡:ÝÂùtèpã+C/œ?#9áPPÀü„6”à~4QðXc±4È›V‘’980 T·ý « À­F‡A@ ] ¯ã>Cû=GјOZÕ“ž§-] °ªÐ@{µŸ:Q×|òX\t°·‡‹çfÏ-¾^[ýömóóÞáïíºÏcËøÏGß}WaJ°C‡´RèÊås ²ãÖ¯Yüâ Ïk(–Ư]UàЀ:QOFSA@@% JP(  &@²g4‹½ °e–â„ÆªÌ‹ç›Ož8’žèëä·3Øß-8`÷€=öSì=è¾}˪Q½ï=w U°cÇ_xö™??u´¡Hõ¥)”¤d£Ã+Á8{GûA@@Lˆ>  Ю Ø×kJkKGê .œ=qáü¹¢‚Œˆ}a‡¼Âí ù-¢Ã}ãc|w~?i\ÿGä*øøcýiÛ@i\3ÀÊÊ|qêèÀZ íúå‹h‹`€mñ®âš@@TÐÂëÊSê+ÒšjóÎ>zùòÅšªâ¤ØC†Ha&'ÊH ÏÍŒŽ‹Ù?ÎÚ3ðšHƒ ðä‘J’±V 졺7¡ €8 Ü$4@@@;Ú`CeFcUÖ‘ºü³§š®\¾t´©.'#.)îZ <7#º07®¬0Ék¯ËÀ©+F} `EE^D« PM÷kllœ­ ðpM%ÉOŸ¬¿zåâ¹³Í5•9é1éÆPŠŒä°ÜŒ¨ÂÜØ²ÂÄ_ 0Ÿ ‹âºæ†W´FÀÍvSr'21Ù}PèySFG²dê(ò@Ù“²ò¤^t¬ðtì,ìRJS æG1sã?ééé¤pµŸ•§IÿD*(¨Y’( à0@@Æ)@@ôKÀAHx-N6UÐÁ«W.“ 6Ô–å%äeRP`€¿–dåYÔ—$Ÿl*/Ï k½-Ë)Í:X’\œTœ¾¿(Í¿0Õ¯ Å'?Ù;/É+/Ñ#7Á='~OvÜ®¬X·,ƒkfÌŽŒèméQ[Ò"7§ElJ ߘ¶>9t1dñЪ¤ƒ+ƒW$-‹\¿q\ÀÂXÿ¿y1¾s£}fG{ÏŠÚ73ÒkF„ç´p©áî“w¯+Ô ]õ'¾..iÙK²ÑYo3i’¨ÍT’ý–Ž¢’ì¡’\I/“ ¯™å¹õ±Çô¯)>²Hÿ¸ˆÒjƒ´ýR‰åÈëdd›­«û…Æ€ÀÑ@@Ú5Ç ¥EAóúZTðêå3§7Ö—–—¤x^*-IÏüj€¡å´ }+ ÐÔ넹ù©”¨ Ϲ‰¼ˆRp\ÿ¤Gq9”fó„9Cò4v:RP6Ö”(›uä¦*J0òìŸôtt/[’ ðDSyY6%âZ1”ïʹ/>UOx09S¾ÄýJä]ü@Ù¡ž¦šû¡ð¤ÜEM;åƒKMy#’~š¿Iá `o0@{E}  NEÀHSUDNFüø/>‘-yÍË( ׺Q ²]›gɤÙ<*/] FÙÓØ)¸˜‰Váhj®Â@PÙ_qÕTÈÝ)(šRèT¯~4Ú)`;½ñ¸lF@s¬Î9lsÔ‘.+Í:ÔÚy€2¯á¬<6YƇ†òaœÒJIðØ0QQ†ÍìL?ª“(3žÊ“UJ…©ƒÔ6~ÂKãêhözñV  70@½Ý´@@À¡´7ÀìÃÕ¶Æ5,¥\«V‚‘µ5Ñ’žlqr0Ù­ ¸;Ñ…>QPxF³«­ÐeË0‹£_ ›DòÆÏ¢Ð~uBeå³úrÅÉ@ìAhЍ@@Ài hm€ÕY¶G]‰±Å3´zÀe{º©ÝÈÈ”D벘ÚwÁÔf  OÙ‰dOV ¹ÊžZú$ ÐißçÐpø :€€@»& ¹VeѾð6F]±ñøá²/=vƒ0õ‚¡©tl;QJP´GŸÊ KʉÖ_1›¤¶ñŸ\Øø¬B‘‹ªÌòô pd)r€íú}ïä`€N~Ñ|Ûhl€™Uvˆl,)ÉÒCÀÍö8iI®Eò&TAn_¶Ì Sc€Ô<ÑtAS¶Æ Њõ3Pv ³K˘j P]@)Ð# ï Ú  à0Îd€éÅz‰ýEiþ…©~)>ùÉÞyI^y‰¹ î9ñ{²ãveźe\3cvdDoKÚ’¹9-bSjøÆ”°õÉ¡ëŒ!kŒ‡V%\™¼"!hY|àÒøý‹ãÆú/0øÍ‹ñí3;Ú{VÔ¾™‘^3"<§…{L wŸ¼{õXá´4‡u³'¢Ì¹y”©…=¥y6>JS!óƶb·n(µ™/%J¶É…Sv¿ž¥ T=Öa 0@³}@@·`€º½5h€€€#hh€é v Êk(.J#ïÒOÀ[ú§©mxßå¾'LÁqï2µ™ÏŠÄReÎÎj`SøØ* ²/'¾{„)%3”]•舷'œ´!Ô†+jpö2À´øýßNø„b÷öÕuå)õivŒºâ¤c EEiz àõ.ÎmM:Ì’€\ö„ 4¾4‹tã>ª”á”j›zž‚Î"ÚPøê®L#Ú¾‚¥"™Š\è$ïph&È€¢[€€´kv1@·­ËûÜw÷c?øëèa÷>ûÇÇ}¸03ª¾<Õ^qÝSý‹ôÊ^9BÍ#_"#Y¢áJ0R9äšÇtdht=)\°%=xI¼û”ðÍÃÖ5ç-pIDAT|ûÂóÏØQ¯`!—ÞóYߤ¡’Ò øàISù7²,SG‰&ÝñW€z¤CØ.ðl,¨òkˆÆ² }O´ lû‘Ôòm uƒ€¶`€ÚòEí  :'`»Žûï/g|R–²3+de’÷̨íã¬~î«aÿz÷-j—¨%¬/,LñÕ[À…Ý›^’t±…aØÒ)äN¢q•¢—ý–Žb³õøÒ/¢]û„‡°ìœ©Ùƒ¢Ê)…ÈÊË®#}aR1JBŠÚOr(û¦6°ÊuþGó@¤`€è  횀íøÞ°¡?ü´ ª2Ó§À°>Åža×7!ë?ò_ÜõÞ^¡A»ëÊ’mÚ¢¤£õ¤[:Œv¾h»~ñàâAœ“ Ð9ïZ   `'¶à˃ž[°cM`q" KÒ@ÐO—÷oð¤¯ÇÚ®TÃuLö)Ð_ÀíÔQ €8ˆ ÐA q}°Ý?ùèݦŽ'÷£y€, HAMù÷ë¯ ®-5Ú!Š)H®¥ÏhÏûê³W£U   @ˆî  Ю Øn€kWÌðÚ`?ÊþÑJ0¤4Ò€¯ÍûÂó®-M²CÖåç÷é3`€íú%„‹p60@g»ch/€€€] Øn€E¡wõí=Åw?šH9ÀWfŒ¢`MI¢íQ[”x¤.¿E´t‰¹ î9ñ{²ãveźe\3cvdDoKÚ’¹9-bSjøÆ”°õÉ¡ëŒ!kŒ‡V%\™¼"!hY|àÒøý‹ãÆú/0øÍ‹ñí3;Ú{VÔ¾™‘^3"<§…{L wŸ¼{õXá•ví¨ @Ú`ûºß¸ZÛ °2?záœïž~k0?šHA+Á<üæ ³˜h»þQ × 0//ÉS¿ÄK @œ„ ÐInš     »`U¡áÛ¯Æ<ööKÃ7OùÀgÞp¯Ÿ›úþŸžz¬4'º¦8Áöh1ÀÚ¼¼D=r€ÚôPÔ  v&´3PT  à\ìe€ÕEq³gL¼«ïÝìÓ±c‡—_z>75´º8Á.qÍssÝuê\]­h¯`€íõÎãºA@®°£VÅSxm.ÉŽbíµ… -˜à®óÀ<@¼ª@@@ÿ`€ú¿Gh!€€€†ìj€q” Ô"È›jssöê=°Œ†]Uƒ€€}Àíõ€€8){`Ua¬vQCX“C6ýÖuÒš  Ð~ÀÛϽƕ‚€Èp"ÌŽÛí Ý ðB]€êúö q  Z°ŸhEPâZ0›ÒkNØPëN‹úA@À0@[èáX§'`¬,ˆÑ4j 㛪³³cÝœ"`€NÿªÀ€´i0À6}{qq  æ8‹®ÎÊŠÝé4apّ͌½-=jKZäæ´ˆM©áSÂÖ'‡®3†¬1Z•tpebðŠ„ eñKã÷/Ž Xë¿Àà7/Æwn´ÏìhïYQûfFz͈ðœî15Ü}òîÕcÿŸàçÒ…3æn,~  Oˆž  Ю ØÇó£+µ ʶ ÁÕ‰BS¬È ?æX»î¸¸x°– ÐZr8@@ M°Ý+ò£´f€™”Xs¢Ð2XžJx¶¹±MôA\€8” С¸q2½°ƒæEUh5ñ‡«2)«æ\¡Ý(P2@gNÖë­G¡=   s0@ß 4@@@[6`y^¤‚ °±*3#z»³…Vó¹Òƒ‹ç›µí"¨@Ú`ÛºŸ¸ Øj€¹åÚGMA\cU¥Ôœ.4Z Fh€5ű¿ü|ÕÂÛŽâ  Ð~ ÀÛï½Ç•ƒ€› 0¼VÝ6;(® @ìMho¢¨@@À©(àš¥ßwé܉6¢›ôåH9 +ËqD\7ÀÈÍéNŽ1@Zôç«—œªë¡±  Ð:`€­ÃgÐ ³£@Ãü7<õøÃ$ƒ^øSjŒÇïs€”tD6T¦·¨”“†Í;ÂÏùömáŽðÒ =sòH…N:š z&ÔóÝAÛ@@4'`ÖóŒû2â<ÆŽNrûmÝwo]ÌF–f‡:,Z °"--ÂÅicSjøÆ”°õÉ¡ëŒ!kŒ‡V%\™¼"!hY|àÒøý‹ãÆú/0øÍ‹ñí3;Ú{VÔ¾™‘^3"<§¹,=à©û„úGe °ª0æ¿ÿýE󃀀€“€:ù DóA@l# Æó“}hàÖµ³»ti:ዯ ã¢º öšnrް½7O|íå'DîGÿ½«O/Y¤'±G¼m¯  Ð.ÀÛÅmÆE‚€˜" Þi`|˜ÛsÏ´8ÉÓOôOŒt/Í:䘨Î'L%‰rêPŸ Ú9ùÝÿ{®Ã7HõïûîöÞhÊëÊ’ÐÕA@” ÀÑC@@Ú5‹ ­J9@2“®]:Í9¡$ë¢ÅËSSÃ68u¨1À0ÏYŸýçï;Ý$u¿ž·wŸ?ëkSîÇŸÇz0íúõŒ‹PA¨Š€€´]Ê8õ›ßþ*Íí±gëÒ¾}z‘¥<úÈýô˜fjd€õå)dPÎÊó§OÖ£[g©ûuíÒyâø‘iAfõ œ;}¤íöV\€Ø ÐQ€€€óP6ÀO?z‡„ä¾{ûúíùI°Ä’̹Éþß=ªc‡TàÍ×'Fì¡'5Šëº.ÅÉÔ.šþŸ{úö”º_ÇŽÆŒž™è«ÆýX™MeÎÛÑrp  ã  ú%`vèÂYã;v¸‘bÎôqlhqÆ á{HÿH]H'|þaŽÑ_ø[{=fHúÔB´èæå_þéñû¥îGϼ5ôeCè.õîÇJ®ÎÒooCË@@@`€:¸ h€€@ë0k€´Dð¾5÷õëKNò¯½”jðº&¿‹}n?ÑpP¶]ÄÊÅS¤l|¦:ßP_–œ²¶ 7@—)/ýå1Y÷üⳠ˽(;!í Ñz½ g' t‚›„&‚€hG@Òn™ñ^üóuÒ•¾}îØç¶¢8#HsgŒ'¤2O=ñȶõseËX÷$`]Yr‹;µ‰8à>oøÿ ”u¿Gû?à¾c¹¥y?Qyíz j6@Øn".@@Àz* ­³rñdÚ|~7ác*Ô?|›M¼¿ß]‹çLÌNò‘-iÑ“U-h4Zíìá³øÓÿ¼Þ¡ƒÌ6´Ëßšå3lt?v¸õ½G‚€@; l7—  `š€EHÚ´R|$x/ ü3m(+rôüg£ßeÛÇSVð«ÏG˜*©Ò5ÀUÆCαû—ûù°În–ÝæaæÔ/ìâ~0@¼ÖA@À, YD(  Ж (àŽ ³—Ïÿ†F²`aÚ~ЬDïÿý¶úËWŸ ÿ²çEAÏOÿîÓ¾wÞÁJkÈŸ ²%Í>Y•g¨+MJ:¸ÒIcþ´‘wöê!»Ô'mó`ÑRŸjD±-÷W\€ØLh3BT  àÌ” pÈàä-ÃÞükräîkø[xº.{ꉇ¯eùºý´è{á¯Dé·¬$ý záOôßkÒø»Ú”ÿ[•㤸jþgÝß²ˆŽô‡¶y0F{ª1:KË8sDÛA@@s0@Íã  z& l€i†=ï¼ù×–-ûõõß»ªE‹fMHž{æqÙ¼¼›Ë‚¿¿ü<!zLǦDí•Ö)}† °¶41ñÀ ' ·u“þôIJî÷êVló ÒëÊ’ôÜßÐ6hu0ÀV¿h€€@kP3pá_±-gOÿ¢ Õ_ÉQ{ÆŽú'ý–l‡Ö q•–áÏ„nž6é“Ï<ÎÕˆSµÊGµ`Ibbð §ß?¼2øiY÷{~À“¾{רt9ëŠo,nÍþ„sƒ€€î Àu‹Ð@- ¨1@šx`ߺþßGVó÷—Ÿ£¡4-PT€FxRZfÒ—#i÷iá3TÉ¢'PmLé‡êŸ=ísÙ£˜&/×yíþñýw^’u?ÚæÁÕe¡uRgÑQçNѲ¿ npz0@§¿…¸[¨4À‚ßÌxÏþùé -îâ±c1=#-kf²½ãÉÇŽ{h»l1á“T튅“†½õ·kûLÜ({È5LHZ¦Ûˆö]ôÉ¿_1µÔç²ß[dq¶þåç«¶ô  mž °Íßb\ €€€•˜ŸìËbí²©l›‡o¿üRø #ΓFÞwïõåO†½ù7ßÝ?É–Tÿ$`MIB|ÐR}Æ×cßêѽ‹4õ×µKgÚæ¡ -È£³èXLÄ«@Ì€šE„  m™€jô¡± ,Â6=õxËÚžýî·sÓ\þ¼èÁæ53üù1æEô`í²)¦Jš}¾*/º¦8>>p‰ÞbñŒzßÑ]ê~;v÷évßæÁ¬ žh*mË× ö ´EÔ  à´T Ñ;ÿ÷‘ëþíø»tnI¾ñꋆ[Eø}w/§Í$˜#õ½³ç쩟#vš*lêùª\f€‹õë}ì‘»e§ü½ûΫmó l€yá?_½ä´= €:4N   OB|øÁ» Á2 nYq»³ã÷æ$xä&yå÷å½e#æÀVÒ?² š¿GB˜ënªd˜ÿÆ>x“#ýÐ6ƒ g}I‡›*/z¾²Åãâö/ÒCìX=áù?_ßÞPd€´ÍCXà6³™: `P}¾ÄÐ*½€ê펠=  %0}út¡Æ<òà=±6I $Ðd¸o[Øÿ¡~TIŸ;{®]6Y¡dR„ëÔoG øóùéñSdžùoP8Š~Õb€Eqq‹Z7öïœþÆ?Ëæýž~²¿ûŽå©šj‘tèË'pf0@g¾{h;€€€Í>Ü­[7¡Õôé}ûAïU¿å“ö婈§Œe)¾Ay:Ès•ò!Iá® gާLào[A<Ôoê7£Âü6ÈHX]°°µâàÞYÿúÇÀ7Þ Õ¿î»ÛeÍl5’¦i$m~) öBØ^î4®@@À¬¬¬Þ½{‹$ðÏj6 T}$†ïxø«¬ž¡¯ Ü»mÙcÓ {–ÏŸøÎ›/3{$!ŒÞ,=êšÆÆú/p|Dì›óùÈW;wºIê~=oï>ÖךzÊÊkKâÿûß_ÐÃA@Ô€ª¡„2  mœ@UUU¿~-#9ùOŸÞ=÷»ÿ”›èiix»-2øYVÏ“=´`æ8•5ìØð£©Â•¹Qd€ÿùŽé†÷èÖYê~´ÍÃÄñ#¹Íƒ‚ VD]½|¡wP\€Ø Ð~,Q€€€3J`—η¬^ò]N¢‡â»ö_Ã^aƒýØïÒ¡È[C_6„îR92Ó1ÅN4•é¶;¡a   O0@}Þ´ @@ u477K%ðÙ?=šº-'ÁÝê˜ÿÃkÔ×FXUhˆñ«iìZ;aÐsý¥y?zfð‹Ï{otŒÔ©?˱†‚Öé%8+€83 3ß=´@@@/^1b„H„hZà>×E´@¨-±}ÝÌ¿½ô _ÿ³E¿°w¹Ù:+s¢ª bb|fk~Û¾{ûµgdÝïÑþ´î6²BHsÿÎ67jpóQ%€´}0À¶q…  Vpqq¹é¦ß-€Iæ6ÿ‡ÏÍÚšÙ)Q;—Îýjèß_ y†Lºî»·Ï¸1ÿTPAf€Ñ>³íAnSGýëeÙmîêÓkÍòê3r+YW–tùÒ9+î) 0@t'`4E»D­½øü“‘²ã÷Ø%V/þöí7^º½Ç­¿®ú`J”«´æÊœÈª‚èhïí¡î3¾õš©mfNýÂaFgщhä'6~À+@l!´…Žhãh¿ø¿üå/¢á‘”»›7㳬¸ÝvŒmkg¼÷Î#š¹CZmÅuœímŸ˜õÍðÞ=[Ö§ýÐRŸ´Íƒ®–úä~ˆ‘ŸmüņËp £Hã<  NK`úôéRYøÜ‘ë²bw9 È+ó£¢öÍ´=–Îñ`¿^²Sþh›c´§E9‡n¬JÇÈO§}¡á ú"Ô×ý@k@@ôI€F„öï/^'“’3¿å@ü!jŸõ±eÙ§Oýñúz¤"|uÈ@½móÀݲª0‹¾èóEV8) “Þ84@@ÀÑh£ˆÑ£GK³g¬Š>  0• $Ñz{è ÿ5v—@2ÀмÈÏéêãàîɽ;¨ó-¿ÛЂ©`ÏÛ»/[ð½Ã\ÎÒÑ°ÏæcÕÞPK9@µ¤P@@„hf t™Pò«n|ïí¿{.ψqµWTd“FDxLSã?ú{n¤©¿®]:Ó6iA–Z™cÊ3÷Ãfx¡€€¦`€šâEå  mœ€§§§ì P²¯×‡<ç±mNFÌÛãWœáa&æ~7¼WÏë» ¶y÷éúÜæôîׯ_'¸<=€êén -  NHàâÅ‹sæÌ¹é&™ñ–ä`Ï<ýȺ¥“Ò£wØ-˜î>E!VÌñèƒ}d§ü½ûΫºÝæîç„]Mpn0@ç¾h=€€€NÐÞñ²+…2%ëwOïï¾ú Ìwezôv+âWœî..‹?ðÔ}²îGÛ<„nsÌNKÏBk½œ9Y1Ÿ:éÀh€@û!l?÷W    9ªªªqãÆ™Ê’¤ ðøœ©cbצGmSÙáå¹aa{¿…ׯq¯ ~LÖýž~²¿ûŽå–Z™ÊSÒïDS)¶w×¼/â  `‚ ]@@ìL€ ¥q¡¦æ²Õb^ûÛ€ó¿L Ù”µÍl”K Ðoë„áCŸépã Rý{ྻ]ÖÌv€ËYzŠ¦ÚœógŽÙ™5ª° ÐB`(  êÐüÀ;wöë×O6GÇŸ|aÀc_ý§û–Ó¢¶šŠÌ ÝóEëÄ1ïÓ6¥ÕÒ6óg}m©˜iZ¾"/üpuÖ©ãµØØ]]¯A)М PsÄ8€€@;'CS»u리‚·õèJ‰Á9SFù윗¹E× 04t÷¤ï?{­û­òÛ€€> Àõy_Ð*¶F€R‚´uİaÔ=ý–†‰>óÔãF ]8s¬÷Îyd€.«gß}gé±´ÍØ‘Ãõ°ÍCMq,ó¤Å]~¾z©­Ý<\€´!0À6t3q)  Î@€V uqq‘ÝM^ ˼5ôeCè.M‡q*TN‰>R¾“G*.œ;%=¡ë¡  ÐBˆ~  ­C€Œ¡¬ ­jv® Ô ¿øl°÷FǸmÛÐP™JÓùN4•Qœmn$åkd8+€€€Í`€6#D   `3¢¢¢Õ«WÓQ³ÓŸ|ò‰Ð r0­ƒ9m¾«¨@ôH¨Ç»‚6€´g´©`@@í'1tèPá–”*¤œa{&ƒk° Ðv†¨@@4$@ƒEi5QúÑð¨@@ ÝøÿGàP)¿IEND®B`‚dibbler-1.0.1/doc/logo-kti.png0000664000175000017500000012141412233256142013042 00000000000000‰PNG  IHDRׯA÷‹sRGB®ÎégAMA± üa pHYsÃÃÇo¨dtEXtSoftwarePaint.NET v3.5.87;€]¢|IDATx^í½wg²6úý‹s¿sÎ$'Àä,‚HB9BB$„HB@dD"çd0Ù`0` 66{œíñxfNø¾»î]÷®û êÖSÝÕûí´%lÏ8Œ¼V/aiïÞ½»ßç­ª§žªúÿ£û¿î;Ð}ºï@÷è¾Ýw û¸îÀÆèǾ%/^øÑÏùc_c÷ùºïÀrÖÍ¥ºy³hä°4kúT>¨7å§¥ÄqC¨ß«=iß®-´r^œs´Ì#óпÕÅPVâÊN%ï6°M›’AÇŽ éeE4^ ýî_ÿ…b† î×òäºOò³¹ËëiRNe§M¤ñ£RIþZZ=–ZëâéÒÞ©Ö±g*½¾»€Þ¹¾‡N8B½^~‘ÚÖ¬&X›g<¢OŸ½G_?»í¯l%®ZÇÓ»§èѽkôõG·éÝ»¯ÓïÞ¥«—/Ò±cG©_ï^”•‘Ní›7Ñâs©hJ%ÆÅҜٕÝ`ûÙ¬’î éÒ€EJ˜0šÆD©R5[–«‡ŠèÊBº²¿.wð±ÏuÿÂjÄÁý{iìèQ4|ð@JKˆ¥¹sfS^ê±:æ1*f(-^8Ÿ–Ö;‡÷5øÿ‚Ü*ÈŽ—÷ON‘ŸyÙ™¸/?{FÏtPUY>ÙŸ²Ó'Š•;{öl7àºô”»_ô¹{víäE›Bqc†ÐÌâXÚÞšN×M£‹û§RÅä¡tõ ,Õ#³èɨ3§ŽSõÌ*YøÃÖåÓhFÞPZ1kµ­n¥»gZéü–Étr}íhL¥ ÖÑ̯Ÿ>FŽ5µñ´³)•ÊrÓÎe©tzã$º°m ]Ø>…æV—ÓÆu«èõ]t|S.-¨Mñc8@ÛÅ×þöý{ôí×Ñã·/Жu‹(=y<åd&ÒšÖÝ@û‡¬ î‘;kqíêUºøÚy*˜”Ai‰ÃiYÝzm½q²˜n/`];RDËç§KÇWÐ{7·Ñ7dwíí7è»jëÖ¶‰… R&ÆR}uu¬Ì ×Ú'Ók ¤Úi#épk¶üý“G—èÜÆüèÇ&þ;µE#ˆ8Îuhà 9Çý«tqǺ¸³@@ôкlZU7‘fN }zÉëF³EÄ÷ƒe{óÖ-zýÂiÚ¸¾ ¦8–³{tß¿ËX¿®†±ËÖó¥ßÓÄñcèË/>£ÿõ·gôç/Þ¢?~‡>||“ž>¾Koß»N¯;+‹‹5?/×Yœ)ñ±´xödZ·0Ž®Í¡×¶Z@(ÎožL{—gÐ’òXSÒøôþûtvý¤Î ùò¾C+³hç7çÓìÅâ>â3Ô’]Üa î(ÜR¸§M5ãiks íX™FËkÇSñ¤XÊÏë\s¯—_ ÇQáäTêÛë%Úµ£½Û¢ý]VØ?áIÌŸEÇ ¥i“chÁ¬Xº}¡ŒÖ4ùb!{F éGyÉ”ŸG+æ§Òªùi÷ÊtYÔXÜp×.lâ@m[’ÊGŠ€iδD!4άDgÚòä8múÿò7ë&ÑÆù‰Ö{7L¢Jåú.ßbY30>Ÿ +fìüÎÉT>iˆÄ„ˆ au¯¼vX¬kõŒÉ”•2TÎ…kùúË©²<ƒ2R˜™ÌMëÙ?!~”¯<)'…Ò’†ÐÞ­Ytöðš_=šn_,£«çifåtš:9‡öy‰Öͧ·nž£[§çеÃEc-œë"-,`Y‹Û´V *€jG[¥VÍŠcvo>Ý?·…N¯Î£Sž¿“cºö…É´¡6Q€¶la53”Ùtig•mÉlwѶbŽ›h[°¦ÙãhßšLºyjµoZK±#†ÑÞÍÕtãD1½qª˜ÚW¥2Å߃F* ûôã‡tíµeTV4–É›‘´g÷În ý(«îW|’3§NPBÜH^4#èô¡ÉtïzݽZN3KcèúÙbº}u 5‚J§M¢+G‹èòáBÊJH3Ê‹éoß}I7OÔÐk»§ÐÂé±è‹IëÈ &%¶×§Òê9iq)»Š|LKH‡¿Bó GÒÂi£©&?F,ÆÓ÷ߣ–¥ó(gBÊ9ð÷…E£œ£2{ô¢¼ôˆ:´o§cÍö.˰@¦VŒ¯Åع“iÍòÙ4ÊŠ§ÐÉelÁ¦Iü¨»r¬ˆZO6D@öÝ·Ó³ÇÇiqíX1´O·Ëø+ÆÆújªi#èÚźs:Ý»ÁÀºVA­MñttwÝ»iQå,^h&1oúN¢o¿ùœïl }­â "ÑÛP5–J³SmñHš™?Lb£5 *¸p[§Ð±U9–»Ç`9ÕšK'WåÒóûhè Â&‚ÕÃbÖ„Ããwî:ÇûüoÄg7o\¥åM3t}õìí[16°»ðâs«& †qæäa´´r,µ/M¦]+ÒéÍ »ä»-œ7]6X_XáëG\ǧÉw½yº„n-¡k'§QË’‰4j¸Å:‚ ùðéûôß{Ö¶V0ðd;»ã²´-oP —JéÁíôö­étÿ [­sG¦PݬÑtéµ}²Z›kéæ™q•°£+å2`JúÉQ½ÿø1u´×ÓºE ´«9MÈX,X Ç dî›ÄQ * GQÒºyh%=`9–ݰúÅ‹¨"}0M㜕y”N²rWzLÍMg=žúsÒ¿ƒ[~÷å3zzû$]ß¿ˆã1‹YĵœÚÇÔ}íj_-ŸU[3ƒÒ&¼*Ǿ¶L'þ2­¾û­s¥ôæk¥´¡%™š—ÄѬ ‹üˆ9\6÷߇NÜMé©ñÝ ûµ€äy¿Ç¯26L@õÎÝJzp§’Þ~s†mµ¦‹ÕZ\›E‡:6ËâYß:GvîóL»¯mH ¹å#iNÙH¡Üw´¤ÉŽ¿¡>Q^û€sG½}:XLBˆµBe[ª+»Ò‰Ãû…]5œs]5S©¹|­á|׎:Ö”MÇíÿÖcY6DZ<›ê*,fòìÞÕ4=s í×SþæŒébõ?z@Ÿ|ø.}ùôMúŠWÎËßw­™)$GYî:±966$Ñ¢ÊXª)A‹fŽ¡ÍÍÉt®cŠc½Þ<_*ÄNUÉpzã| ]>UD›Ö¤Ð¤ìáÐ`ÑöíÝK•Ó+èÄñ£òùÏûŒº_ÿ »3*Šhð€©uE<j½óV¥ .¶Z—mµNì¯<ßšæršW9ŠæÍE+ÆÑMÙN>KÕP^lå$îü²Q—ô¦GÒ³{§üË– ¬‡—öÑ•ó'ʾ®"Ög¶ÎMbws0={ë"]šå>øÿíC@Ç`›5£ŒZ[šéxsX‘C'WæÒ–ùI4‡ã³¢Ìq>†³w—Y©qD60™pc­Í2j¸‡; hÿ†,Z2k,Í­IõsÆÒž™b½Žìbâ¥!žÞºR.›Ñ=¾wî4Ñშ´¤ˆ^úýoä3Gðwˆ:FÖ °_^ºt¹'Žâü*»?£i϶LÖË>àÞg— äÍk+©’wûQ1Ãhñ|Î?mÊ«…¸Ãе8ØçxÄb-YòFuå£éìÖ|:°:S¶cûVúu ÙÁ‚6¿°u=ºÒAo]¤ƒ–û‡PMß—Ž6Ú a0©Ï¢aúÐSŽ©/ÉôGøwxÍ~íîºT9Ï…£{è,™ °- 2Žád¸ ˆñÎÉBÞA4¨Ï+Bb|óÉ»ÂdÛ+ßAr`¼YDèy‹ÜÀw‘³µ5•jy³™?s4å¤öËõá»ôæÍ ŽâdñÂi´°v"eg¦Óg¼ByYýø3{Píܪn€uiÅþB^”8q´0€»·fÒš•‰[¹­V%]»PL›×¦Òþ}eÁO+œL×ÎÌ÷q†7ÖB>H¤MÐ B+ÈʇYSc¬\[‚Ž– Ü÷e–­¢?>û€îß¶’Ëp—4±<%+™VÍ™D—Z–j~þ±NGêm -ΤÊ)itõÒ:´(ÃsðkñÁ¯ð¶,Ÿ/ç}½½ÎrmWñ@flMóRa0àø5^zÒDÚÄ*S\H¶€pñ °Ž›§¶-BÖÔØË°ÿúË—´¡qŠè£Y/Xðwï¤mí›ä»æÓv&KŽwL¢sÆÐ‚¹cèð¾\ñ òljZåƒG+Äcز.UÀ—ŸCpÑékìŸòúa­ª§‚âÖ•2®™Áî^¹X­ë¯Óò†8š]É:¾Ž<^M´uË:Y(k[g ý~çõ2±ZÞM—Pµƒf¬……¸»…Ë:˜Úv’&– mo©dm»NLzlÛJýò©ÄAˆ‡\Àb0¬¯Š§ÚܨHmåq”•–L÷Néîc~º€mÇü|¹öû¶Ñ–Y‰$î"Æ1™ìÜ‘=¬“[ ‘"*ŒAÙUvâÊeÕü7_}F§´ù­[j|÷§ïw@U=#ŸNî+•TÅŽ éVÜÅ) Üsx ¸¿%EC(vT ýÇ_îʽÇwád¡¸à[ØSè¶b¿0xÌņ۳„œÀƒÆNŠz’-ج#hùÒ8º~©DˆŒwîo’]Tòùs¨®&V0€ëÍ †Õ2èwUb¨K­^Ã̱tt¥TÚ½x*3om«èèÊlÊŠ±öÅS‰‡‹7Á°¾2žV•§ƒlÒþy霼Iûç¤E޹üoþÛ>VÔUK¬³qN>­›>Ñr €ؼBα§e–€[ã/Ä€°^ˆ ¡¼Ÿ’‘:}÷ÅCQð[ÄF!=¸¶™kÍ @gWN¥c»"´üm¾WÓòIÂ) ÜwCð^?oIŽó@¬Ù›×Ë©dêzój™<›«ç‹iÜèW ^Æ/l™ýó\.¨Þeœ@]¿¶•ž½œß_!qTíìÑ*즷ùáªKx󯉝ÊJ&Ñ×y!)¢:~í[—ËC\‘`A¿Ôe1]š=Øeµ¬µTéW­Kq¸9‹2'Úûü©ÄE°,Ü@€bmùD:ÈÖÀÚð0˜:øÈMŽ£woÓ\Ç&q,?a?ÃÄÉ®69\EØ™mËå:0!94þ‚tʰ^ÈAQßR3se=ÄŠñüË×ÒÍëå>¥'O ÃÛXe$•á6Ã}Þ¾>Ží$ÖKÀÅ–Iî3o`óf'J¬yçÖ^*)B›ÚR˜T#àvöÆtª®ˆá"ÎÑÝû¹A‹g`¿>¢Ú–¼["€íÉéî[·ÙJm”Tâ->Þ}{ïÂVbxe3ç·ìÄñ¦Õ,|eáK¸ –ÐçÚDÀU]0ÜäÚÉâùs«©¹q‰,`Ée±Å8Ô”I™qÀþòÙS‹¸@|Å`(àÂXÕÙÕóèöùã ~ŽQ&å¹ $µL“È$!6ƒ…øîÓ'ôáí‹tíØN¶4#i˪¥®ø+Ìz‰<Š-oóì Tš7Іì'÷hð€~´¿½VD½fRî²æ¼n°< w¥äáöá^#î:}Ì*[ùËwËï°É%OìEM‹'Xà€UоmYÌ(¾Ú °ŸÀr@¾®%Iì‰ý“¸Âv89ÈNh“E÷àí{ô_ÿù1+»oÐ’Åu=0W¶Rð3Ëc$gã·LE†—%„K r"u ÷oZjY­Ãlµ˜þ‹Ëf0cÂpØw 0pçfÅP[iœX+X¨kçN ˜pžìäV\äPC9»µÉÃä¨K¡Ö©ã¨±¦RÒK¹TdâðþN.+3-…óKC©‘ÏñøÚq+þRŠÞ°^ˆ½Ô5Dœˆxñú)îß±¢YÎU˜Çtzýé“ÛI”—5d÷÷ àºy±T,¬’‚ KN*ÏჇ+¬îÖ ÊIïK•ü¬vmÉpÁ¥¼rfšPÛ·þøMz~Nkög-kZ[(6æUɳܽZ!lU5d×fŽYvåRër– µgR ëûb†ö–ÅòÊ ¿§´”$zøÎ›ô½Ç.äFYçO%X.\> >€%¸v5§Ó–úd‹ÈØ6]â’ÍmË,«Åî—‹Ä`ïÀâtÊoŒ­ b¬¶ùôÖù£tæÄq‡ª_TUJ«¦Œ£µ…q4rè`zÿúk´{z²uÌH¦=•¬ÜOœH§XÙ±oV*íš™B³R‡ HËŠ 8–i)0xQË¥ýg×ð={h'˜%ör\Cv-¦c‡öÊõƒ<¾‘7Vl¨êäæÉ·ÞÐC!î:¶gíܘáVÜe%éÁÊBUÿ·¿¼ï€ë5fp\ÅSËÆˆ Ï2q|o.ÔÌí¶b? [W6QÿW'`x㵎•b©uYÝ|;gûðSˆ»$ô©#“e¡äçY$Anvº,<OŸ}ø€ž>:HÞ˜OX(.2ÃCÁ{ã-ˆs¥ø‘ݪ:v++ÊèÌæ G7(àb«™b-0y X È[¿n-½õæ-ÇJ¥Æ§EE´¹4žöÌH±€T‘,×ûáý;´«<‰ÜòïÚ¦Nß_?²›ö2°°š4¶kW@Ž´Ì¤U¥ãipïW(7+“>ÿìSzçÂ^'ö2‰› )’™šH{V—‰›«•Ës™h™”›Í¹°;ŽZÞ‰»l­!â.Ī3Ëb|¤†Gl½Ò¸CÜõ÷a½ø™ÀcX³"‘NÌ—g ¼l–x®Éq½¸0uT7Àþ‘ËæCû¿@7˜ÕÛØš,T¬¨`v-V³ÅÂpñTpÁMÁb|öôž$8Û7¤ÑÜY Ž+… AüŸ¾zL_<;KïÜXf%mUÊ0\<º6Ùd\Âm[-˜8¯K( !H ;ÖÚY“"y°¾½zÐüšjš›>œVާւq´jò8ZÉ9¢–IãhEÞXÊMÏLÛUZ‘3–VäZGÓ¬r±r›fæÓ*~OëÔñÔ0gºÍ . LŽb—³ƒNK¶tÈ9ýùógtyçqWo_/JümùüiÂâ»´Ì™ÀJ“,¡äOnÉ£˜Á}÷.68j UÊ+©XµqÁx!†LÆPÁµg{¦°²j½ðl&ÁF¨n!ÜJ0¶H‡`Óœ”ÙŸc¿î8ì‚/+vø‹tœ™)пû·e[Ú6v%.X.0OJÇËëÚíàdj\Ècn<+Û_u‘"_}ñ}õñUzx£Mz—¡Ê¸æ—Žâ“•';¼c%lɤ­\¼¸~N‚”‘,˜:J”íiƒE…Q1Œ¦LèÇ»v“ÔFõëù2ÜcI¼nnK7^êçàòqlß$Ù4nÏánX¯Ò½º-Øßaè²”4¡WÚN *.`D> À2ÁÕ´h]9kíœA–kÎl¦Ï/w‰u—1k…Ýy,Ó&ÓÒÚq”0~ &/ÇjIöÉÇOé¯_=¢»Üm/×l­[œ ù­¦†ÅÖο´Nê¦P?µ~^µ×%SNÒ˜ã-¨'$µr¦¼çøî-´±"žôî)Vó­c»%ž‚Û·³4‰v”ðÁ%ÿ ’bhÉ¢…tnM#m/L ÍS­¶ig;v‰›÷q=ƒµ´xí›Í2.&F@é#žjžYI¸£X²¸ÚÊ=!þÜ·}#-*-×\™7LÝ”d‚&kb©KCÜ… %7u¤¸¯_>»âQšŒ!îž,Òñ`f?ýx}÷§ëôÍ—oС[, zä°lúú}y-b.\x8Wkc<-™;V4ŒÃ÷îØß`VvJ_¹ÉíYøø.~°\—OÑ~°¢0Áv Á5»…³«'sK³Ã.p‰[»¦~ÇštšÍ@Žç>XØõ…ò~ø€¾ýâ ?u@~ßXW!»>v(L ^ÀeÄ[W-» æÍ±rZ „²ø4¤ß«Üàæ.]ØØ$±•€«8QÀ´<#–F1ûwïÔÚV@Í–P÷êŽu´«,‰ö¯´ÞR[%à•Zy3×éVÞ8Žî·Š>§Zå)ïÝöç»Ðsƒ•&¹C©½)…g£Ù\HŠŒxêÄΪ£ËG E½¢tü³G»èO_\£ëWÏ1;{ƒ^;oi)ë—,r\oMÌäDô꜠>?MžÕ®Í™´kS†c¹\xÆG™(ÉKïG¹Ì.Æ éÓ °`Öìò4aô+týL±Ð¾Aà«Å(¸*+RdÇT·:·5͉.¸4H†Bí Õw=ï˜k›“3»òic#ÇxÓâd±@/ˆŸ«[[EYþøÆþ¨à‚ÞÖcÛÚfYà‡W×Yy-BMW 猖ó}þé'ta}“X­ílµ¶MM ­S,KõîµKòïúÊR±"_{qÔÞÚL³S† ±ÑQc)8\w];´™S‹¤V¬mA‰…ãd£¸¶×Ör/I&Ûàª.ˆ±H N”«RõkhLú§¯?£{·ÏÓ7¯Ðù³§nW žI¹ÉLîäÐzŽÛïç„5çºà*©dº…šH†õR·Ðž5òh9©¬`h7À~,pX™I}h܈—Eë'¾}¸nr®àHº ® g iFé0a¨@áƒÁ.)‚]CS¨UÇfŽ }'àêbÂOìÒ(”üúãwé]î¨Écµ\×ùŽòží­õ–ÌÉ¿%Ù£hÄôùGr2¹ˆ¶EÀ•“GîÞ¡­“ã©hR.ã8 àZÃnéŒò2a½à:±¼”NÙ/DKme±¤4ß1*–ÿø€”ŠÎÐ ®–9qtpM–È Ðñé;éí»×iôÈšÌImÇ UäÐÒù´€ÛyU£Ä-ÌÍèG‡öäŠ"F €kûfN—0+ùì1'öí˜KÁ˵S­—íÂr\’{äç2•–›Ö¯ÛEü¡ËÎH¤8¶VÓ& ¢ G¦FWkS;Z\×/Sc}©€`Ñ|î!±!•Žùás ûv™‰¶£Æ{çÞMjãηå¹V^ÉÚW=¢‡¯ï³ª…7,”EÞº|©¸jª!„å*ž0€éôTÉ]ÍJ*y­ÿþëw–åb·p+»‚E)ñÔÂÉ]X^|ÆÆ èÀýꨀkzü`Ërñ9/wlr¬Õ®¯Bí—™LF<ˆ÷~ñé3GÄ ËueïLzÿÖ~ºËòª7®_ë*¯MåVÛ™)ã¹Âx:Ø9IØTu -œœÇݲ.è8q¯›Y(}ê(3ªÜU ×J$Ûq±-Â30­\—íò{ÀÏàÊNéÓMr|_€NÉ7pU}<­oN’Ò0ËõÆ…a–”Š7-×ÉCùRNma×rµ,·dDOÞk7¿JM‚¤OF ˜4,¸ݵ•ð“éD[.­®‰ã¦4#äo¨$Æâ¼~í*á¤n)'wsyÁ•>¼í­fpUY¹­Ò„‘TÁ²§Oß{DZ^SÇ TúX«À²„Y>¸yø7>ã›?¤Úò":Z_,‰ey7ÝW›fJQèÈ»!ÿVÀ$6›o?yH¾sƒ.]8#ÿËÖ çMOš@ 5™´}E*]Ø[ *åóùw¸‡÷v¸b.%4ð61ˆ2ÕB( *¾¬8K®(ïªå¸À4B .X¯#;óhQÍÙàþ=ºc°çÙ*Né÷;:µo2UN.ÀŠ.”;ìgÊVÁu`WŽSW…Ƶ׊BÃ…YÁ¥l¡SÇÕ ¸’8èþ–ôÉ&4¤ê˜•GZ²ieÕ*I·€†cëÖvzɯž< +;›‘.’¿°8{\’¾úšLÃUóg‹kµgE½Än­Ü¼sЫHgpÁÝ4¿vž€nSmQ„-´UòHbÊÞ<ØBÏÞ¾Jöl—ëŠg5š™œ•@õ3-ÅÉ™ö|šUcÄ\VÓЫÓ¸Ÿ?9 ®×Xñ‚Ú-’Ȳ™UåÒ¹³'èÐÞ\ïªBãæ¥2ñç‚{ \Hð¯¬gõÿö\JOèÝhî*¸¶nYÏåç¿§«Ç‹XOí\°ZçŽÈC[ùÓ­ËVIƒ7ÏWPÁÕ¶2I ÷Lpùñvi¿%Ú5’ȶhWسKG"¥&FI?Ôðª+ܾÀêÖ´`NµE†0ëzÿn‹ýäÖZ]ËÂUfùÔ5„õÚZšH{¾(n XAä¶J‹¸ÀÌ¢MÌJM¦ëV‹¥ë¨E1h ½ô»ßHK¶gߊPñ¬_<µªL4†÷n\¤Ã‡:åøÉ<‘%'e7ÂY-VWò\hŠî¼Ü_àrU%3¸öo̲ˆ—nDÀeç¹àjÙ j·¼àB*ä$‹¦¥_‰íä—Yò³Û¿#G\ÃK§ -&ØãÊÆÇàÂf‹õqõÄ4Ö^ö¡iÙݬ3 éÿ²øñ{6pÆò$ºÅ±O˜å‚Bc5KžRã_¥M­)BÅ+¡¥u¸`­°0`¹r3ËHÇ'KÓ&à‚üÉWì—›` ¸…÷/Š"^븴_†¶Mƒûv¯½wë:íªM¥%SF‹ü ¿ƒÅ‘vÑü^8FGO“Ø  i+˜@Cú¾JOÞL‡–ZÀ,c€­m])dÄ¡ºiœèåØŠs`°VUùi4˜­X‹yÿúí7,™ºE·®_q\½˜ÁhvIµÌO R³fI…l8’D¶•ñ˜BÐð¸ìvרhpOß¿kË.;[hÖt«¤(SòŒ&¸,·Ð€Ðk89{€0/¸PÀjƒ – Jq 9ÜTu[·Ø7^ãFõ—‰!hºYY4LÊë\6À4æzýx¡´—žÏ*ì~ɨBÃ.`¦üÉ×G{$Ðv‹cy˜A…’˜`b wU[ˆ>ðXd@§È PÝ”ëª*)ž„šH†"~ûìdªJB#[Šv€ÉäÏÞHwì„òâ̑ þù«/÷29a"ß³N²b«¹Å´sf2ÜÓN—Nã¯ñ’$W/“iñi©´aV¼+ÞRmáâ’X׃‹í.lÚS~7™ÙË wÌf5hÐS—(y,íc¨ÚB\ì5À-¼À©“-Äõ|Èò3ÕFjº,éš wË YÑÏR*(í;¶f;l¡T‡ÛaÖºr½v°@6ä11Ý*Ž@tMË*qöå!©Y±(Ž‹òr,pAjƒ ,zå¡×ë' ¥Ï€©Ð—]ËId××_Þm¡SrÂex°Þ’_c»<ò> få‹{õæ‰z£PÒJ$kÜ%ªx»ä¤ªÔ—¡/±±—ë· UZS2Šãr¿AK‚…Àÿ]®Ïúâ½·©:/EŽIl儵KIv˜ÀS{¶²|A\ÅXþ^]d%‰¯_<+™fÉ¿WõÐ(\šãÒ‰({VeІ¥I®HÞbVMäˆ5„þ–Ö69-õ¿À–÷XrŠvÌ…kzïѸ´žË—ÄÑ,mƒw‚Üc3ÆÛÖ¦Y­lpaã…[ˆÏ ó°=»ÝCaµs+©–{¢n M7Ñð&›ú[g-pÁüWç 6^’Èxw8ÆM÷j ïÚy.©)r,—.K*¸>|ò]Þããá½·èÁ½;Ü8ç<«κúƒôhiYAcc-úÝ<ð»¹5³iÿ®íôÞý·è½·ß¢ûÜà!Ÿ ÿ^¿f×± ¦Þ{ÈzÀGôù»·èó÷øx|‹>~ûu¹6\ãµ£«å¼ïß½ d†º„Úb #†\F%ò¡v+†üâã¸l]¡V"K™?ofÍq¸Ð'’¼§+à"À…² .¸žø¬Ã;x³åu±uušµóZ)ää²<'^Cب±aÿS(Ú—:àe:·oŠ€ëà–léh«Ö«eqœ˜}oÌ…› 9Œ .ÑÚŠêh* ôϳ\“ëþ6Ö2Õ$©aÄ]‡¬q«˜ùÉãëòóí;VoBX ¸LˆcæÛì øÿ”‰c¹n»i÷iËl©[SW"®Û¥mu´—eO›ç%Ò–Ú$Vë'‰j_Æ•ÅRQú@êõò‹\i0‰½K/iÓË-#À‡ã“?>¥Ï?yÊ™ ÁÿÈ‚Ýwï,·â-tBª]…lê Mp) o&ƒt…Ø@UúäÖR6ˆÑ²ò)CELŒµ„ Ù?¥õ:zxd àB³ÿäñ½h÷:ÂÆæ]ººzÁe¨4ä¦ÃePe|¸„Ž÷Ä]кaá|úÇ7]­¬áÆàõïܪ£ÞÛE=¹Äm×,e7Šüð¾´¤qT^˜Dó*¬E ·q‰39Òé[è½jXÆ„s‰Ê؆j \Úô­‹'„¬¸ŠióÍ• ”‘FÛÖ4ÓŠ¹erަ‚Xù;ª‹°xfúP¦ì{r%q²,x”õ/©E[7orõŽj«ÖÖ0]Îyµ£Ú墬O 2X#]óc©¢(É<äÔð^|&XΟܣÿþ÷è»o®Ó§ÌÈB™Ñ¶*Ég¹Üàr3…ðB4Çå—AÃKÌ ‰~^+ðv¦d Y(EBq+¯©¶¥ñÜm꟰UÜA)ºcp5×ÅÑÄØ2LfÝ ./R×[¯t|4Rã¤s}ýåm×{ï,¤/>9J~p…®^>ëÒÑ¥§Œ£ÚYÙ’K9´5GvE*nSò)qÖî§oŠ]gÐÑÊ$7ÚXåúâ…/b^`g'vãÀZƒ%ì]2»ŒvÌI™Ô¶¶fîN[Æ’¥RZP0Ñ«;š ÇEÿÝŸ¿¥k»›…œÃlãGZ³³Pá|íêúà‘~…ž† H(¸L"ÃT¯Y/ÜY]Ẋ¬Šç•˪„½­(žH) –d jà`aº÷Þ}Gª8¹ >€ÌÐ=lœðNPbä²Z¶[h‚ËŠ·J(=¾7•OB—áYq‚™‡bü§±`p·ñL«3{&ÓT¶^mK¹>‰¦¤†‚Ëd ͸kß–,Ú‡š.:>©!J vUίüÕ—OL¢£ãNPø]ue.­lÊ•تh]w/òN‰;xªs±ÑÃäPÅ»yI’ š“âIv½tzäˆ!ýÀ–Î åºî›È9£öP†’©ù\°˜,•Ã8M³ÜÁµ µT›3‚²F÷pܼJ:ôÄõ—¹`?{Ênh6•§¢ÌØW©®võapá½-ûìéþþWiú”dš[0ˆ‡kÌM› @£tööŠïXŸ%ª 2 KѲl–ˆyï_¯PðìBƒæ«PÂ,áJf´³6‡>tˆþøÑ»ô·?ßâI zâ-Mß8gm¤>—Ðc¹”Ì8¸9›V3«<5k — ñÈ]^cÿ4ôü¥‹g¨€Í7vB¸…¯œ*³®°ÓøÀà"æB½U´º.¯€÷Ovó0„ËôÖí«´˜• ú°¡sÛ´nªUkd¾óRòø°SHÀ·_± NÆé”ä f²aűz¹o[=SÔ :ôƒåv6¥Fô†\ÎÄ2f£ê»/ž‰5¹uþ€¨+F²ºb}·iCfL:©á¾õ˜õC Ë´¼x¬ÄQ·n´„¸LéÏÊ&4ÿÿþïhçÒ©´cí2ùŽ{×ÕK%4F ãyd˜±ü»‘_>ySæ%£•Ú‘5Ùü¬VCõXù ß+ò‡ð|®Xîo?šÉ’žòÝA8mçRœÿµ3{C)xÍ„ŸPÆ£Ž«‘ÅÃx_r‚E¼9´Å—QÞ¤) —¸„·PÁ…54}*Ï]c·ëjM}5ÎǽRÊýÖkØ€´Œ îW÷ Ö«¹n‚CjÛƒ˜+JÜp™u]Þ¸ëÉà ôÙÇ\{tï’ËÍ›65•{Ä[º¸{÷n9w‘ïBþkMK"¡ä·&n%*.ò*ÛJËc'ÇŽ¾±)YòLùò‘3y/0÷PúÆñlâhK)êĹ–rnc¶ŽÕâ&Úò=ËÊE˜{fËgÜG¼çÁk¬ô€ÂÝžÍU™ÃñP) ”ïÜ”÷¬_±Äå ¢¥6”Cû÷$0…`‘׺²o&•NNpi¿ ÷ø «¨xÈC2Ñ´¾µZ>cWûlKEÁ]ŠE×Éú@ts‚úýôñ)N~ V àjm©áÂRî„l÷ï¿ÉVNÓ¨2ÃŒ·´Ž S,ÑzÁI {­oÂ&¸¶¬H!×Ù-D,µ6jÈË¿npa÷ÀhÐMË’9·bµ†ÆtƳ{'GÀ%ù.?¸4î:Õ‘OV$àŠÄ]w®µÐ¹3'Q*b¦†EyÒ]†P~²–ź™i£Åµ:{z›Ô­mMë…z/ijª5̲%Ä׈‡€Á=°¾u+ÒÞš“¯šXÖ.¼°íZgQß þÎ[7iCà ڹ(U‡:±mÞ¬Ô±}“H–ôØXch~Æ9+@˜©cXÝÁÃ|n`Îärz²Zâ\¸ªCúõ Å Ù’}þ)`m"ÜãÐÑA¼Hg°5І4˜ ݾyÇjY,!†]œ::Eú®e"cVåš3¥6C¥rûÜé½ò,ÌN»fòØŒ·\Š€À”=ùâ-;Ç¥dÆt®XƦ€5vlke²z~oj¿ÚØ«Ï+¿‘2(Ì_ß?Uve oXv2Ùe¹l¥â.”\L—ÏÇ%Žåá ¸x#ÇšÛÍÒ¨>=~ÿë×µË)>¶·Hh"à*b_^)y\aqÀ¥®!n8‚Ý +­‡‘BEúßy¥P(΃"ÖË™¥ã[ŸÃz!Ñm5 ejžÝ$îÿp¼u~©ã*=™X¡êŠ©tjCž{N2/üºi£dˆÅ.â¯>z(@»ºg¡3˜î^óè.×RYIO²†”3I²e¡iNcÆpäÐA܉陀 t»ö#tjµvÔŠ¢¾melŸD3 ,¢ßãÏ_¾G÷/5:MЬžCN&«8µÇf‘AQ¬@‡®YWx ¥9ÙÄoÙmòÎâáíüL¥òŸ1€Uœ³±äÍo‚ Ï„7lxEðŽ\X{spí›Vÿz6!ví_›éÌôš% Áàò¸†ÈÂcÈuÙ”!T=PÊþOïç7À54[­™¬¡Z/X.$ŒŒÖW4 ·^ õòŠyíB=ìà".6f$ã»Àrüé“;âV@c—½;­>}Ûx¨,˜èí^BtðÂG ë+…úàþ}kb*#?zÀ­ ïÊß6¬_çô”o˜W.³ŽÕýPgM+ì H ©Ñ‚ — Ée±5½~°š¦—3³ÆÇåU΀ñŽuY\<9Œ“Ö)ôôÉûÒU¨wÎõØYgå©nnìšÕ²%OGXã[?x¸Í—‘8ê™a¸„xÖ-¬/Íâ¢H”˜`-`M8ÀòÄ[2³š7<0Òx.°Â2SÁ… ¾Ï+¿ýu€ë*[­)i,?ž‡¨ÉäcN)+¶yWñZ.µ^ç:¦H[3,b(ž\Æ~´S™lH¡4ߤÖð&”eÚ¤ÝâzqOá\Í7_ž½ƒÑRÃ=ÄbÓrX°×L¥áƒz wóD Sìke”éñ-%V‚YYD`Â$ò¯¯ˆÁÊìn«+wvÛÚ0?Q,ZQ«#rXå‘&A±±xÏòZ‘i¹~†û°ž\—Kq£Xmä.·;n ®×k«ufO,u×±0ÛhØ ^Bzüí/_щM”Åßeó†VW^Ë™Åe òÆZ°ZÓ´fõ*zíÄÔN‰Œ Êce ÑîZS¬]Ъä 1»¸…6¸°¶*Xå×RN¥ü*¨yX­SÛ&EÀe»†—øõ¶[3~‰ÁnnÅHZR3–NìâîB%]K“Éþž^µ†_È ê–ËÎ0]b/쨟~ú¡k¹,{´·€&–¡Ô÷NAAã–<÷î;· KæÏ ×vO±H ÉcÑ$:ÔŠ!‘ Á’aÂþ]›,w¥+›‰U³-@TÉÃúN;$Ó×™îÎàv¬´j¿þôõçtm?K›,¾†SGwËïm,ÝàP0“éû‘Ãð¨ÖvyÏÛ· «¥Ò2cš‰©€—x‹ÿ–ÍzÈ\ø)ýûNO-¡Ad%&^UÀåb Ù¢B?wúHY3»Ú2¬ØÝ×¢™cèÌÎ|gSÇ>vØ/¼î˱Z6eY¯"ÚÁê ¡ãa®\0ß>‘ôà RÖÇ+…Ò :H%ïëe 5"Ãp ,˜ÜŠÉCpaƒ—ƒŸÇPî×ò‹Í{Åó i¸D’ñ×ü /´Üä¾ò…-ëe%ú$á'B^7%¯¬!|k§ô? ¯†7çåР£…®œµz“›Ö«¼d¬ô3÷Z/uu¬«&;qn(7´ѽk$¾Brõõ£•t|Ç$J7@\D$iAmÃbëCU7Q¬[“É)ýéðæ*±Z×.°Ô6ù!€ck-»ó7¼Vˆ ‹¬¨žjµ¡ÅƵ3[‚äÀŽbÉpËÕô ßqþ¼JZ´`®Ðåvæ0“Ù“ÚִʤÎwß^èê‘á€ËžÙ°¤’¶nY'÷ܪÈðFzÇB$Ùô»‚÷¸„ˆé!:ÎIêKë’ÜÏ€×äÞäÛ7þ™Ã¬Ô‰´¯5Ó®ü§rùÂRÖ®™”¼ª5LJÞ›P®Ÿ3Ö.ý¯ñ²\Ãpë%í®1ÔSŠ¢±†à9t¬—¸‡vîËž› €¡æG!‰úÆåmŠ•,dU  ÿªiVYˆPÛ_¼Gw_kp¬˜é*NNíÏÓ/‹i×Öu(”ü×Ñ’R™ÇržëpÝ;¿Ú"Il’B…óÁ:¾ç(«PŽËõ>ˆ .ÇÊ”‹¸°çÛ%?ê%8e>vG§3Gå;¼yu´<ýƒÂ¢”§¡äd¥ÐŸ¿ý‚>ú`“SƯy-í¨‹÷Þ¾yLÀ…„±[GhÇZ€Ñ‰ÕÒ~*H D¬–åŽkâØŒµ¬ü–åòîg´8gh%QB£^6¹±#úýò¬WìОò€ñÐ=Œ!À5»x„tnUÖÐa¨Ì|W@B¹ž 3¡Ôr­3ë%‹ÃÓ@ÝCeÿã/w­Ú£ Üâ/^$/Šñ¤W¹_!ÏŽ-‹#.¢-‘RšqÀPÖSŠIü–§3‚MTWº¼ÀÒ Þ<»Vî™Z4!@lDA‡Ÿ[p=º¾Õú»m¡ðÞÛ§—ro“L@l’sfr ìÍSåžç¦ ?¼Þæx Ž"ÆIÛÀBµwnV:m\ß,Œ)T‘BH.ágéÜÄîIÙŽX3Dn†kxöx¿¸ƒP˸¤NÞX««àË&’86Á%¹-ƒ‚¯ÈJ¯í™BMsÆÓ±t~—E4a#7ð‹qׯn¢%H£ˆpátuÎæÞw¶kp %ïI(‹k”P¶µ†HÚ:à2äPâ6øhù`ëej0­¨ytåEÞ ‹C±rÃa~ò‰*®»²¦HÜ];¤1˜ 0ÞY¡ø‡’ CQ!,Ù;WÛä^ÔÍå¤öƵ®Õq6ϱuYªÄ1ïÞØ&»sf)}ôÎy¶W]eÑdžz²"Ï媒äÏ\"cºr_µË–­~бk•|Çû7’#´G1)ñ !æM#ûæ‹óV# »üÖ3åzÞ¹S',W8C¶Tq¬,!Â0„ÜVËJ«žÐLc#_Tk±Ö¼™ÚCè "Å ì]e&ûå€ ¦öÐÚl*Ë"35î:¼‘e. ':,•Ë54b//±œ—hÛºP¡Ízi“ÿ°ökPÅ£âø/ß}ì4T1K'¸G÷ÐæMkEÆtõ|£‡“¹^`¸ìÖ_&e¬‹à,—žƒÍB>,2(VÆ¿ÍÍdºŸÜ§Ç·¶É4=Þ8>;8ÞœÞ{ƒÿÆÇ¹ƒVIÉÇOÞæ›VowüÿÈaƒxìÑd!ŒÌ{kÆ´ ó’$wõ·¢öJËœ^üü]®¿fɢΟÚh5ûáM=÷ƒ L‹A¶“åS0»“ný¢rnÔ¹É!10óØêq¼V¬ˆ ­"ÿé+ ·…0Ûۂ;ÏÉt ›8E¡(¾ç‚ù³`Á•qRÞd1ÿ ôŠìëÏÏ GÅ ¡k—:e%–oÈBc-“~GÔkµ|.!âJC•5‡~&¸`õ×/I¤Ôq½~´ü˜‘Ch6O 4ã€ËvìS¬¬¡æ¼:%6 Èf:¬—S¡lÄAy}µ^üñ eW,JÙCnÞ¸FÏÞßèìñ;–⢌¸Û¦Hµ-ÞãÌVqhÇ^Óµñ—£G‚ð´äxZ½r© 7X^;Á8ÆKß äh¼Ç|v‘-}ák‡¶u­‘Ìb^õþ¡Ï_6k¿ûê-Gíä y“ØÞ¾BÜÁ7¯.‰ÄXL­£„Äåšù,Íi´väðAŽY÷É5¾ÿð°gXˆU•Éu©1¼y-o)¿A¿ ¸ |‘áÍm\OÄ“²ûˆo¶eñØÜ—~þ®áà>/ºh`\¼ºs˜9¯0bÃTÊ#û.;•·ÎË{EÉ{\8œ> † ÷ñb ¸‡ßplòîýÜg£ÍÖ7*d‘é°ri´bäÁ´’Öqm=¢[Ú—pmpl\5Cb§¦º™^iVI½yx‡j,Ü«º^‡÷âsËGq€lëàvuˆQðyHeàNíËçν£,rãÍe®)N·Ê¹/œmu – uo>y“ ,iÎ÷§˜!½yÚÊNa)ŸrÂYKø1 ,kXY‰¸¥ÚQW "&4BñEF„!t+2¼D†“aËÕº€{¡p¼åŠgítHúøWÞà:zp/•å qèdÓz!xÜPŸèËyy‰ Z~Él{§Òæ5žØ+ºõ²È tæ¸t~²Ö`µC¯AÏÃz¥'¡*¶Tï>º%ýÛ[š—H#+=¹7Í®)ó¾§Œ¨Ã&°XD–|ØJ\ì§coh³«ËhK@Ö‚ FpþîÝp^c‚Iϧ VPm[“&×€k©eµy 7·ùøÙ;Öµò5¯X6SÚa·­¶j®ðÝðKÙDÿÁÒ¢!\É'¿k_oUŸ<4™ !Îbª ˜ZÒ—‡A ¢Ébãpu–0j@c0„ðdêpéíÂHW¬%BÝHÒø0k‡&¦Õºd³­›ë“¨†'oþlYÃLn;¶§…Õšw1(bŽ'·äEÀå$•2»ÎËÔ"©,–ËVÊ›ÖËj`ãÉ{ÖK›‡¢CÖ·$Ù )^ê†0X æÄZ%ê¬ ƒÖá}\\Ç%ñ}{õä Žk¹‹írÇEtÜ#[&¥ý7¼n¢«Ü%‡DÒ=@è\ÆÝ£×}üþnºsm.UÎ(—X È‘5Ùr0X¬=Ì ¢*¶`1¸vsaª€ß?$Žq}Ù™é\¡}•Zyn8SóÒ1~èõ/®hTwÐÓ#Ãfw¯åq·l¡½:ÂhVKc-„,S\)äyÍé÷3&6àš²3S–7Äf ýŠhÖ -пÁWHi/&Ý•¡R‡˜š?ìΨj˜?N,‡Öá¡êܧ@÷Ð 8Þ½ßFéÜpO‹ˆ³’ kÇ8)K‡h }±8^qª™Ï±A¶¢q†”Êë 7§NÉ>!à0ÐÇ´ÞÄ^;nÈØd(ÜŸþÒ¬Ú¶ë¦0æ øæ«T¹Ùé<ªuž||'‰¯TÖÄà°*•6¹F¯ÂjÙßçª[EÉñCék§vžƒN-ÁsÁÁ’áy-­'×¾gS¦¸¯NY‰'¯u€­:ò‡Qc-Õ‚ñÀ¥ÀR«¥IûŸ­kxéÂiv yЀjÚ<Ök–ý¥¼r(±á±^û9Žha77î¬hytçE7&вtg² <㆔ܨ*îŠ-ÌÉ(^ñÁ›Mc­_Û(£EAAcB"õ¿þ×_xšˆ5òÕL4›ZD÷¬_³á¥Õìò žÜÀÞ¼²M¬—ÄöÜ)-g×ï£êógù>}â°ë;kÎnŸY©­mI˜ÝöûñýfšÃ}MF "×sé|•¯:ÀT¹‹µ¸Œ\–º‚Z]ܱÇÊݺ²XfTCÍbN3WµXvÿw•9];9M€µµ5•V°†Ü yÞüÜ·´ðäM® lœ;Þ®®X-¬=ä\Ol΋$ê EÌ&f›ÿ żÅ<Ùo7÷컨7\'¸ŸÜB%6@Ë{õ†°^G6s«3Ö‚%ƒèr:‹zѬqî8qÌök¾Jå(䬘ÕÔßšVèÕ*Àî\Ÿ+»8XAgá°›t™0hEQήÔÿù¿¿âžêœl6”^+²C\C%#{Þ˜/ׂÜq‘<‹Nƒ|ïÏé%Vg]ÍM™…£r>ß÷Œ”à<}´euŠ-ñ¾ü‚û‰X+MGÀšX·ªä…X7.Y¹±£W;s¶\Ýœø»:t£¹ƒÃÔªÕB«7¬ébÝÝÂÖή4c-µZð8ŒSggÉÌÆq_“Ÿ]Ü56¦ŸSæàµ^íM¼Ûpm‘€Ë¦åQVŽ!Ö 9sމÏÕ‹â©c-wTbżæi"´²ÕöÚ×ÄÆKnó¼Ì8¤‚«¨R†œÔTåÀÊæz@æ|ñ¯˜¡o“ÔwЛ7/8 ZÑT*ñÓ’ ´sÇV™¶éTT»º¼ /´’Û ,(0¦sŸ äÆT”kÆœú½t#ÑT…‹ì¤ešÉ.çÂYSõ DºXG8°¦¶·0é²u’‹~‡j½)-sŠXÙ0ÄÅü 8Lþ²\FÉMÂzaÇ€{¿·‰›Õ@sˆbB'©ì‘D`°^ޠ׫˜7¨yŸîÐtíF¢ÎÕ]Ý0uiÜ‹ÀWc0—Š~:‹tã…Iƒ*AAUÇŸëdWÏ[#Oßç’w-¿ðÊ‚œEiÇFŽ[eüûú™’pŽXàÈ&A-1\¿ß?C‡˜É/'v—5 ¨Tâuý²U†ÿW(SŒq?{)ÕΛě¼i±©·ÆžËäüpe³Ò8ÓÓÍI« ¢µ§«×Òæ3ˆµ¤ušÝÙ)ˆ!„Žp—;¡¹)R@XsX6@àà®âhTÌæŠ‚Cûvþ|¬×ƶZTÎ5IZa»†Ç6p{è¹q4fèKTÇ—/Ç;‡Z/Ç5ô0‡f‡($VÃZ6 aÝD í¡ ° §—È»òZK°ŠCÆVÌÚ½y±q€,9a¨¼r&T5ÿ÷½GOÞmq«lÒcG{­tA2]Fo¡¤Ì.´vŒäèòøÿ € …‹NÌh§¶¬+¤O>Ÿéj9íÇœElUDë±z9SÞ ®¹U7^ûűi—aX,x¸~ "¬ØÉ.µ@³(ôúëV˸¹n6ÐJëµa#0…M n^•Ðø Ö ÀÂø]_ƒO3Îò°ƒA clºGÛó|°XËa9i O aJ]Ùhª.ˆ¡uÜÓÞ©Ÿã5œ<~ØÏ\¸´ Cyyõ”á´–¿8Å{lvQ"aï©ÊÛÅÅ”¦j½Ê}‰eŸ{™Œâríø S)AÏ›Á¿·ö«¦’¶ËsÜIfUqxÍŃbKôã°•àì:ÁÝB‚5)~,V,:(Æÿó?¾¢Çïž×é£'›\ÕÎÐì™î—‹³-†(AŒãÄa«¥ôŸ¾~Ï(¡zÃÊéÜ?c7—ŸÜ€•2e€ÊåþÙ]š°9 Ž|Ÿ«šÝ–ÔdI5±5÷XjÛNX$Æ›¬ðsÍþƒÚ6øtU{TïžÆ3P­ Îr,–ÝÙɬ4v¤Nž¼ÖºÅ Ò_c­ul °nQÁ}Š›¥"ÄùÙ#üJ2Éàµ^ ®]Íi²38àòZ/O¥²i½@l@WçˆP=%)®>‡añ—=Sà2›ÚDô‡~1¦7f-K]“á&ZVÌž»lÓÔ Ä¬B nc"Ï3./+ueÅb~÷Ñ;<…䞘ttœ;{Âõ>S¼;rX‰£ölçÉ/¼è¡qrT^+eÆT6¨´ „Ũ˜A2_Ë´VŽ(ÕÄVMtÉŨ =;×˦äÓ šJw¹ÊÀBkÍ¡¡˜"766& ¸LöÐW±lÆ_!S‰”)ð tíz&/À\b_0uv/'öP+fºŠvoDµf` ·mÛdÅ26§‹= &8Ôúx~bq¿}ï˜HÎùŒÏq‘†ÂBA¥ÖÃë jÿš%Q:˜Îd/\LµW”JÓGá®uY® £<±4ª¹€efO 3Îr„¹VßwRŠô!Î5ÆN·­|ÏÉî9‚–sf §ÛúGò‘8fÐO®äñCé¼Ý‹\Û&KË/`ó™1ô©6ŒÎD>rÃp±3Þn5tÔêïe»‡F;6¯˜RšÃÛ¸ß)C"`Þ\˜öAä…eæ‘U½É(z@†˜¬tZ]gUDÛ¨„†‚ÍõÓkŒÿ¸Ÿy߇ó ˜L*Ý”Íþ™D…­ T†²yiª=¢\Ä›€ |6F6¹’Þ¦×pM9ž.C+i\u@†Ëè‹a+¢z7 !}î 6dµûEV 7Ú‹[sÔ´2ú@¦ŽùX® Ã^ö7§Tp±©…å2Û~¹¬W4rƒýf41[`;îaXü0Þ¡A<É¢]Ù-;X¤M@Ñ©hÖ¼“îìê*:ñ˜ 2tKÂb|öþ~›Â· ;>+™Ê`Ðů?öO/€—D®óI•¨( RKuþXß~}ßÕólàæµÓŽEï,<ƒÂܲX&aöÄð–îó†‹Í·SwаZÚ) ž˜ÁÓ›&9½ûµ?¤Õù8ŸJ2ýô¤Æ¤„¾Æ$ kö“Ù¬r~ɨPY”{…¸‡°˜ìaXÕ²™ÿ b®H{«#Ђ¡XÏM¤mÚ¼n"äEVN'"›ò&rM ÙW,¥ùI`×=)˨’" Zß8çÌ*äÇ !­õþ’©ƒ-öR©{ý<ýi¸±V\k.±ãþ18%oœú=• ,/åAx‡yÝÀ!®K|lY5{ºÍ8Àr@šmÒ"ÚÁ"‘8¹ÙA«Ê8Ð4zõÓB.ì ø¯Õ‚'Ö‹f’ 6‡ÚWàÙ “2}tžß7)ªààpªÊ3hFi²-K¹_?LJÛ×§ óyã\‰‹ý3ËCð0ì{TÌ`úêÑAz÷H.í­ã4ʼnF‘£«5\¤lÄaÙbÉfg$ˆº=€¼U`ðz‹eƒË_¶oõÄ”89³¨y\®Á:#rykÍ¡©É~ºDrn\_:³6I>÷æuÏpòéCâ/WK6[%àò0ˆ^oW\DW[‹hRõA½ÿ6Ñ‹‰˜ÁåRج¢+ í´33b3o|†ž^j?Jy¿YòVeRžÏîù{ç|FIúÚ1¢A§  Ì$°-]R÷o`Ÿ—èúª\ú²ö_è×GUµ»f }»z }¶e,ýq[=Ùéµh¶¶%Mfÿ‹ç–Á ª;ø}€ÊônºƒàÎð±lƸŸ\§Û pyÈIì³úæöê(RCÜ&ÁáK0wÕ‚4½´ p&WF¦Wz+š†£Q¬XÂÞEÝw hn°)µï"EL‚$äßHh\?¹dåÝì ¦Ù¸Æú·=PP®˜Š]ao)Ìá< `Ðlæ ¤y±ÿBø@óN!¹u´Ðæ—K^ ?­@ïo·&‹jŒÇ[“éí]YôöN™tƒç¸’Ä&åÎ19 !/t†™-ʕڠÝE…,†+èìÏË Ʋé?p™ÃÚî¡€ 9#¹ìÈ£dޝ=’Ô“ÿÒ3Àe–§8 ŽçX‘0PîѰ‘v~€ÙUÍXÈ\¤‡9+Ìî{nÆf>×Ñ^èV+4uS²“ŸXø÷ÞtwrÎgÉ—ô5ÝYíÑnæª ²" \PZxÿön• .•2±µÒÙdx-€ˆàünEoÖ™ùÒùëvmoÂûq˜ÿþÛ²—èO-ýé>noϦ›;òèÁ²ëØ”Bw7sCS>n0ío £n½Šwñ¦ì°Å²X;ˆK<1öÈš~*p?}Œàž^“G–õò»‡`[pyÔ=oæ¿<‡´ðLNü>sÔñöãðº‰Qb1¸ŠR¾Â‡Ù ÓiFjÇeNm!4,p€Ù·0¬•šcy< d†ù>§}™×ÕS@éõx‘Ú©o3R/€vfZ‹eÝøPp™š&Œ|Ù÷º;Ö9n,²¢hÅ¢¥Ã,@êçîš?†VOK©`ÄÏ¿,tƒò¿~K77eH*è£U#éIëz² G,½³šÇ ÏF·×¤Ò…õ9¸ «…5ÝT1ŽÎúÇçOu+È=p™ê ì¦ö°“øËì½ñC,˜Õ*ÀOtx[¶Y1/£( Q€ËÓBÚ%ö‚,È¢î£tÜ5-‰÷ßêÂüÄ¢\ß¶‚îܹ¡Ë½ç3ÀäëìëTP[mïÂW˳vŽÕÇ<ÄrµFØÀ3{&g]²¸‚KϯŸ[œøj§Dβ8ëügš&J Š]S^r\W䳚?iæ±®ÜùI¬KÁµfêØŸ \}èôj¾µ^žø ½Ãšîa&à2(úçXd4,’f¹Š«¢Ùì*¥VÌÓ]Êlá¦ãx´o{¤W{$ írƒ€æINkî(Œ:þ[ÍÌBêØÓÎÃÄÇÓwß~hÓåV.ÊÒzݽNe±ÚÛ"\5#CÀ5Àa×Ô'!³Ÿµ°?_Ëå+X./¸ZÙjE³tê~âüG—ø­«ù^\‡ZÑo{:ÀZUGSúS­Oâ5 JµÿçªQà‰åâÞ§.`†{ˆÜ—Æ_8>Á$³Ä_]˜/fLËÁ#—]³b£è¸ŠÅtЖñ˜ñ˜KmïQ{ø,ZØ\¹#ÛÊ9bÕñ¶µ®,KgeüqÚ±¡”ššéÓ'Çݹ(HçŽÎ¥§oo‹ô–7ç_y†?x@íÚ¹vnªv®Þ”ü<úë×o»bE³AŒ«“NS±I0pÍžÔ?Ðr ¸ìòñ½CéÕbËzìlñ_pÝæ6w]9÷¨—­kõ¸N‹.œïQ+ï窫Ú)¸ð±\— 0Û_¸¦q¦;¢=´äQJp2ˆž )W’9È‚äÁ¼¹0«¢½¬Y`?d*8Ì̲YE»èw#³Ä¼SK¤ì]Û<çÏÆ¢ PbÞìR*.*¤OŸ½á©p2+f¶o³þß.X4Ý>s4‘Xdû@jß3 \¥i~àÀuúhóé5 š=ÚÂV‚âþŽÌ.@c®V'w}ííu]Χ`¿´ŠÛ`WX ^;;4vì ¸Àÿï¹¶ÎÝI'pyâ¯Å%±VrÙɹf•§X Ž ŠàŠäÀ8wæ"*ÀœZ0£“¯Ý.ÀÛ>`N,¦Œ"Çc¢ìƒup‹©ÒÞ%£ÒátÆÂôº²€ÍYZÆ¿\êš=çÏÚê Šá@X«V® ûo]§¦¥ó¬V×÷Pü9“óÒ¹!é;N å“¡¨p0êwb—8 \¹zøþ†\ÀÅRǺè, àÙúèq‘/æ*Þé¢ÿ>àR ÜiI öº¤N?C¯ ßùÿÞSå ¼‰ `•ü¿xšO§Ö+w|: p…l1û­Žz#L=BÑ#&à ªbŽbÁ|T½]²_¯ýL ÕŠ€LG©ú´ŠF\æêaoÎ3ÀNçL‚ ŸkÀç5Hä4Àõ ìï‚ã¿ÿúTÚ¤§$Ò—ŸÿÑÕ·Âe¡Ì>¶¸Ö©µâï5«Ì…¢ 7hñÀµz°Ûj‡·±©óx¯ÿlM A'¸—¥LÔá=/v|ü.?¹¿x2:³(¸ÖvÝr)Éòþr®]{pi¼fÆA›×z¶Àr?;רþ/PÇÒ `^÷Ð }ù/SÄ jÔÛh‹€€™•ÌÞ^^€y‹.£Z1Qvxâ1dV­X–cÉœ|޶pµÐq«×Ñ8íñá³(&µ+­ùÓþ{Ñ«A¨y$'ÆÓ“÷ïÓζtJNL /?¹ë¸{–JÝÖýʱÆFßB[/¸°{?ù(,œ»<à ›ˆ$ó5ø»÷=8’ÃÚ÷’7ïkàj~³Â–6—é \E{ќϺÊy;{­ùwa0›Ðêê‰]~Ÿ*VLÀh¯~ïgGs#]€ë÷Êoiaá(šž9„¢YÖÏU3ã¨}A2UOœ`î"ÀPà¨8¢L[µíL€¹Š. ѯ£K Åü C­Žñá–S¹fˆ €³¦Ò«õpµ!è̵´uãÌB:ØÑÎÍbJiêä|ßB?6–çm=¡Ìô4zòø>íØÒJgÏœ¤·¯6øt®Š`èÿô°•ëYnË«€ø$(`ÿ¯Æß:qmE¾5ýÅtë¼ïÑ]_%„‚«¹Ÿ#Ä…GÀ7kz‰ÊåNkæNt¤MÏ.ùéÜßÑt^Ë]}ŸZIaïÕ ¨SË5-'žN´ðÈÔ•¹b½pY‘%&µ½.Y’Ì3r†Ê1·`!ÉŠ’~Èû!÷ß^Ÿ*%*¸1ûš3=êÀ - %‡cÁl€ù:Jq†º­ þFrbÁ„GdRí̇j#‰hd&Ëhë‹bÙ0’Ô"Hl‹b7o1]·-kfI<Õ¾y=55.e¥ú0ª_¼ˆìÛFÍ<Îv$ÿ¿ù@èOãÇÄòP»íR–Ò¼|U”–Б#‡…ð¨™=‹îݹ’PŽjãÎ paö. ìà_­ê4êœÂE­ækð,Dówºë_Û5Y¦à@òh¹\ªp×çõ½¨¹Ú*ÑB† ÷,×W}hKm×c®ç>Öñÿ»ÚÉ °œ¤X \À"ñW®  ÙnSÁ!$[¯ã«shÛÀÅv(•ë+¬b64fÀj‹GJ›Y¢1øÞrÅqx8˜baU¥Z% i^µ|zõÂ+/üž§Hò½?y„ÎÛB×.ì¡û—Ü€ëd-  ´Ä:ã{¢*ØkŸàKŒöµeÊ9X^ yÁ¥nRÇœá¬ì0Y÷"åózÜ5nÄ`:±"Ç[.Û‚)À\|)8`Ñ’ÌXP_%9¼Lâq¶§- –FÉ7pd0Pš­˜Ú:Àh!Êb´(Ȱtv•v|Ô”Žà9̓œ¶Ú^@~j©ºþäº%L@œÊnâ–°cpŸßÉ uX UïÊ1cê0ZÊñcGòµqòx[¦áCSÿàZL¹ÙY4wÎlšVX@Yi4³ª’§©<–š*=|×m·LÀw°ñõuæ"é;P;BîaëÌ+µ;ß}.]è6§Hi>6ÊPËÅ¡ô¾à6è5_/³µ¬*Ƶ+ŠÃÀ5+±g õ…eÙ]ðR Èr9Ðì]ô}Á•ÅF#èú.h9½‹æ‚ÀˆöúPpe'ÆÒñe—`EI",¢©â˜Ù膩zäÁ”Võvó ":nnʤZGÑÃu tKCÔŠ®ßÕl ˜vÊW‚òbAñ˜€Ì">4Gfö°wFذ¼JÆÉá ;VÀ+¶­…C/bõÔúÿ\·ržëñ­v‡pÉc¦ð¿ÿòÌ™mæ½Ó:ye~¯…3ü‹9ˆŠ×ýÁnÒÉ,mÐâ|gAð¢…; $:¸,/æ®}ܬ«Z.h—TW<¸`™½÷å6Òñ©q£éÀ°SGÑáåYÌɃ)À8]]Çy°Á¥×Md_Õ¦…ñ¯:¥ßSâ}Á¾ü½z®2]6Á)_qY±Î@ær- ¸L†ÑC€D4ŒÐ ˆw‘›1œI$tõß›¦Sܸ±ôñã«$=ßœšÙŽZÂõ™ ~s*£¡½Ô±<Úß7(“G»óXJj€ùC*$è= &Â,ØÀËüZ@µ\Ú¸óGŽ»–Ø!}ÙN(ùƒ¬¦Z® x,H*¦ñ[T¥FuÅ4ZZ °–ã%g ¢æÁB,˜`Û§Øà2ú!ÚzDo63ßï#Ãÿ†«©Ž¶ýyy/z{#Oa+vƒ§Mj³~§=—é*–Ì%§‚âôf^ E›pF1g¨e1]¶€/˜?‡ÛP?p€ä€kVuÄŠÚ@rúzÁ„ÿ·ÇñÈOÛRëfäÖ4æ†+ÓÊyÁÍk¢‚‹7I î[ðZp ¦«náÍ•Qb®(àŠá9}†ù÷0piª!h£é´’ù3†c¹9èÁúŒ@€!_€92©.Ìjv³•Áµzv\hÁe`œ È}x¿’¯/ÎnbšºÁº}É‹»íÝ-Vq§)N@L5™€=n£K^e.Ö ÅlÿNÀàu)]ÖÅv3C~w|O½"»8”ÏW¿¸ŽÞ}cKdú¢y æµé¿ @™cyt׿Ò`¥D¶ÑòU¡–‹Áµƒg D¨öçW‹_iá5Á– qZ’sˆ6—7 « èR® fmdßhj|j.gL+;Ô˜Ip ®.ÌèÇqlUŽhÝL¢Q¦ªzv¡KìÊN@혩C ²nß-•>^3šÞݘ`µvóX³£7fï:-·€ 6ú}4cœúo=ߺ–y¸‚€ä±Næ(óû`3 ÓJó—Z?• wçoM/…‚ëó¥½|ÏI‹&ߨøu!j 4¬‰Îžµ.ê›ß\ðt¶oÙÐégè5¨u¼ ä ®Ø!}éhc–€«"m0ÕMI2€MOâ$™}3jÁ|í8Ù Á¯ô’ó]zÛì]î ƒþí9þ¬¯…uà ÑÞy·Ñ;Á¥Ö LØd¡ýÉ¡™ha`3ûÞÛ£pBŒ(¿w•Ø„Y%c®•ksàï`~§hິÈ_´¨xPÍîéÖÿ{hÞ UÃA›¤.»·`WÀU>öEúã²!tµÅ¿éê‚?b¹J(Xÿnæ­~tpMÉJ¦M³xÊ;ìXS6mœ «HL+¸÷[i*khz¯ñÔj?ŽJVÔ[M=Ó²mÀV¬+7C»øtöZ½a;çÅRÚøWieÆ ®Øí³Ö˜ÀìAÞE¶ÀE†¸YŒ¤“Èö€0€úOŒ¤ç‰üôXX\‡}x¯ÛÙ8ìïÕ T‡å —!H¹/÷Þ{³jÂÛ0·Pû n]”â{ žë­Y=EnU©Ôà0$ìóÒƒµ…ÈK=¸ð´t? \Þß«µî´ôdï¶Í47/†Ž6d9Èà"¶UÅQRLØ ‘JíXì"z .mª]x¼MG½n¢Z1tøí 4úð;{>ð³Kü.ˆï‘ ïnâ)‘lÝÌ6ÜY7§$F¼%úß”wN߃‰œZbcȱN–Ik©LP™ß-´ „c«0 4MïÜuóîü·¹jÕaçÔn¸AàÒR,ØåOJ¢…ë@ÿ±èq<¸£)HòóÜ`V…®Spác¾d+`+ÊÇѦšÚ^dz“`Ó3†ÈÑPÊÃñ¥ºêÁ¼jŽi)ÃUõÚ:À°b'Úr¥F, <­i¿“zšÁ=ýîIPÐ~—K¾½¿×F&&Óx°-‹fÆÐɪ~3)±[Çn 8´_öY{¡Ë¨¤0·2 Ñ~g.aŸ$•ÝÙØ•~¿ç!'4‘ÜZÖyŸ ¸Ú:—Ýfº}a°D uX ,¬«Æ²±²ÎÂÀµ¶\°Z°‚]—Wʶ1ü pIܵÔ—`Ûj“ié4N6Û$‡jaÅ0Ü€šI1TÃ:Ä•U¤ØR›Þ Å•”¬xÚnbCâÙû%qÓ'þOɇ½¾9&'tnåBäÉÂn˜7)m¾Nc7m¹ì0“«†D,›º]˜æfQ¾Çïuô’×½sý09›†=ØàyÀ¥‹mU™?5¶áé{ÞäÖÒÈk†Z.».5‚Þ×Àr=«}Aªâ!\°v,d/‰õ®¡àšåWÁ H ïû@\xE¸ÿpU—O£–òñ¡C æ$šƒ´ˆvÁ%*@qc øÅ‘8¢·àÄÜ7õèÊì`7ÑcÅÂŽ4È:s Uó6vèK®×êî|wS'¦y”½;;Ÿ–xƒö‡¥ÃOX·»u}#ÖMã·ðÓ)±±™N—52A…´ƒçÐïâü i£÷&lá®*ý>à²òšaÏkýÜ©l,—¸‚-¹VèaWküXàÂFéášLaµÓ0äY.œxêÄþtÖ+À‚\.%GÀ‚˜DX±V‹‹.¬"ƒ«(?Sy ·À%äÄv7¦;9±”Xw°ª¾/üz,Hüém r½vA0Š XóéneËjš‚#m\8 ©ï—nGL†àÿ‡õø7güŽÎ¾ºÊ?†»í<µƒP`Yûw:Æœ[å‘ü¿ŽÜ1b³0¾SXC˜ÎÀµò9À¥›Î•æxZ^éÏ©éE/A¬ƒ55þBL°”.;å£À‚— .ïýÛ’qᖠפЈ¦+üÑÀ5²:RŸ%1X]þHÚ³0-`Q˜Ä¦ô¥&Ìn<ê¥ëAvlå A.€¦cdG pKs—êÇJ)8Z xo,\·/š‰JIé¶Úx©|ÅxO󵺞®±ú*І‘üd¿´'h‡E’uÜ0·5Ôn¬Hdו¦=sG¹c7λ$Àú8Uæß‚€„߀ÉÁc· ½Ÿ‚ m‚6žçÞ/wçô¥úòpIŠnñü›ÊƒÕìß6ôpY, ‚òç—ÉâYÐ ¶óû€K¿s— ¼”üÆ™ñ °Ld ° ³âiÍŒ8¡ê•I4“ÍUïmÀf^ÊVBØÄ°XÌ› Qó}¿ÞšÛ\5)¸¤àYíXzl^œä—Þ˜§«í¾ŠPâóÁÖ¹†X”fW=ø­!Ϙ2ÿ_sG×WÅÓÙ­ù’¤•¼b&•וæpm”LA R ¥ƒâÌŸöw Óâ{|²¸y]fÝx–§¿è»ÞxÅüþX ¬ˆ•M2Ì-”T o²ó üýçÕBˆÅ¨l`a=¸LåDWÁ…MYE¸a×TÜ¥þ…&úÄ5\p¹v`q:ÍÊFÇmpÙT½ 0oÑ¥º‰ ;´»”É&Y1Œ‘©€ì*z¿(¾Ì³Á¹1°ŠÞ¿ƒ%ú¯¥¿uFÍBŠƒc![’ +÷A]™_Êò:^ÀMâµ\º(ßjÉî¥[³§ÃéÖï§ÿ7G3‰ûyë¢ú‡¤ëÂü¡T6þÅHómâ£?ù:ÍF?°¶:í^&0p…gN.ý*¼–×pAm‘î¹VÝx.ÌÞ¼Íú¥Œöç—,p¦ &P¼ÒìAmÏp9À²TBEPs´‘uÌô?×ï.S„®¥‹®Ç.[.¼pÏÏ= p¬oo`E“38¿€IÆ™Ú#M=`2¿Ók\õ½oE¥p›;sÑŸX8F¦3þ¨àj¶Ò.¡à²++&OôǶxvædɯ–ö¦ÓÝÆq”=&Är}p…=U¸wx]á.Ê|ÑxN(LèG[f%º¶žã±æ’qîdsÜĵÜZe+^6ÑÕ§>€ð{HªUôî :MrRì~±|½×ÊŠuîSv.-ÚÄÏ^„AÆ__¢.„eÃ+·y‰?Wë$À«™à;OXé‚îØA¤ƒy-ˆwœ)íyN³鿯 k¤)÷×&9·ä»Iõ¯U †VIúC«¸7 o\>Bòîz§¡°äB }¼ÒîPeïèÑ,\¤£ÅD†Z¹MÁàÂë½aLÀŒâv]½ç×Í£uRb£«Iô¼Ÿ4“ÔÅ,ÎgÆ4 u¬øô7Ò#ðVkŠUdJf¨.”BYƒ˜Jö.ö7fкšxWyHP‰HMì¿ZIfʘ ïÊ"VË5²¯¿ÙLØûñ- {>aàÿ‡Y.|иA=-p‰Ë7 +ä\XuÆ0±d»jSýn¢WYÏtj³­¬×6n®NS!®â–ùþoìÈ_5öuæ8wöÔß0˯ Àÿ¤y¨åñÄvp^kéôïhêÅy¶‘Ï$ÒŹ>¦Í´rzþ¶K Hó„ÄÜm.Ø:ûÞêV8Öå°å× ˆú?læË*ŒA N³•6fYˆ]sejÑ¢&o8匳šÄàç¶|g¸ àÚøàz:ç·ÔûE #ìû›å#opÁÅ|n¶Pß2~4­›>Ѱ%SF “¸s^ Õæ ‚¸~ì*Æëm²cÛ¼d©pvÅbªOôtüÕx ]§ÂÜ<•SÅrÿh MwðÃuÁCÙœ¼Y'U²Øñ€»}gq\W€bº°F]y6„wÊh‚î#PnM¤ÛrE»WÊF¾ÝbÍÐAjÝÍþ=™îŸÓ´H…¶†ØÖTYì]”&^ ,6Yãvusø|q/Ö«óAA®ZWÁ¥€?^<Ô¥ëÒóÂJ~opácúqóšl¹pØlÇœ±\°bÈ…áX^X9H,OX×}‹;Ov« 0ÂUt õÞ[Ü;ìÆ°vç[³]À ¼b,í­â¸øì…ˆtIäKv/;!Œ.cØd±¶ÎM’¶Èz©v½®›U=èImš8Ø=ü! ˜ØüÌyÅak'LÊôñ³Ðh’¯ .±^Ýc•2Á¡n¢‚ lâ®ÚZRKì:âÆá&jf· p´‰]YÏm6o’²kè­€àyëÍ¿;µEMã¥ÌeFöP§–,ìf›m ÎïlWU T´8.šæ=?4,aPW$‰ [b]Œ^PYGØ5˹ysA»…ξþ®ÖîíV]^Ð{Ô•ý¸Ñî­b—†Po.›Hï5Žâø*Á‘/©ÒB6WÞd…]æMkkkey1[´™ ¼vFK¸‘0ôZ_/DZ&³Õ]¹vX^Ó’üàÒ°âØ±£^Ô²\ŽõªËp¬©p ­*0Uu욟JK¦ÆdS8йn÷‚TŸ|*¨”E-Ya¢pœ0SL~xEm¿ö>r.vð­#bmJYoº#¹ázªi<ÐìW†„=¤0p‰ëJÓ½ptErÀe0zAví–4௮^IZçõo¸½Ÿ5  ˜W¯YgT^dzÚ˹L´ƒXòï®^%ß.eëÓ0œ®7$P9o®«Yü­ë¡ž×ÖˆTb@ d{A²Yƒ@cifúPÂZ+MdÀ ñOXÑëYX˜ásÑž\î[JR5 ýÁ– àëUÎÖ 3@†/¬t½ÞÓŠ™Ò©‹ÒiNn ïB¯ÊMžÏÓU6rSSeÕ¸éxu½/ã& ®µ³ý.$:ED–¼*w‚;ù©òf:=?;Û%ÕzîçAwÞ׊þ‘-EPÂ\ <¤o{Ò†—T-I‘‡5x‹¶ dûûe„}O\\Ãh£O¾òì! ,di±ŸdQfßáá¬ßSâðÔ\:ް¤¬I@eKà ]GH­ÞÂÖ ! B9xýõ}ùw$XÌÚ ³Ï.|ç'ªþñàÂÅê÷2dÕ† 0€k_mšM4c1`v˜ˆÙ%€F>7€&íÜ&”@÷àR»9©í¯¯¨ð÷Óxž²@V3þA \ ïPæb”º` z ùÖÊåìÍáxÏß)IÂà @¢çV73¬q Àª9'XØ Ý¥Za¯zB7=Ó»æâzô\»æ†7Öt,\Cqÿ`µ¢õãù/Ѝµ‚`™÷r»s<Ë?Õ¿B,Fo-K'x6í)ãûE€eoìãúÑæµ«»D$x¯çxmž$˜Ã¬ÐO®¤ ±”<¬'Àlm®J ¹Ù1²ÃN:G³bO¹ 1mÂcÏ‚4ZSÇe-Ãåàз£ 嫆>¡eà"ð]ú¢K‰ …»–&N‡üÉ{Ìk˜=æßeQ¼¹Ü|Kü)õ^wÐos1½GÅÊ.ëEëµÎºì˜êOÄÔAפ€<·(z×Zu «2£ßáù¿7¬U¦0Ìê†â¦r±•[KÝ4u ]Yñ˜掤øM—€eZ3X8~®Ç þS7š¿›[¨ÚŸÍqIü@ÀJùÈ3'æµb îÛk¬Ì¥Q4XEuaÉY.ã]¤xXß-ùƒ£ø3ÿUl+@Ð<ÇûZaÓ–ÙþlÙUÐ…»·®,F©°l¯±üèR«?>Ó‡d]‚Fјà:0Y  Ð<¬’èaßÙkÕÂ\ŸíL ×šÄ}NÌó©ëýpYt™’ºÇ;gø;l™çsÀe¸€ý^öK·@ùºÄ²Vyc¸ªyr¬ó½¿XðnPôoôÆŽ•Ï ® ·Q§×©¯ »¯wp-­›K#^¥ª”!´gNªX0ì.8Ô'v({µbvâYAÖÎE0BŽ¿Ýy¿°ºQP}@³8¬÷ï]‹CÍ•f«Ç"ú2hA1„•”¶Zz© éµpºØ5(lKçu!¡/ƒ/èAyû|à5j]‚fQ™ç0•ñÞsëB_^èOc¹>«ys‚z­Um:Wª¢ËŽ”5Ü4)úë.¸…JX@éäBª%Ü>;™R†GDÛøÞ3Gþ ¡³Î½S%ÆfìŒxiúsûwFµv?ægÿÁ½_¡ÖihòØ~´iF‚X±Ò„>²ÃTvÀ‡6]EP­®bL; ²d m½Årº(.ð 5øû… Á%÷ë&õ5~!³”øYÃOƒ¬ ÆgZÌçÞƒŠªK½Ï–ΛgS—*h:GXƒ§/zÀD°4y¤»b@ϱbª¿PSØÕ9ý)Ùc¡ô>NõÜ?ý¾O;o{²bf¬ß y-’Áº–Móçñz%IÚ§ô— <,†Ãï5ï°}¶µFžfoý¨‹Ý8Y廸£~ÞëgO %ºgvª¬eÚ8š›CkËã\s%ž=ò)ä. öU<‡€ C"Ì­ éz³œ „òÃëÖh7¦ÏÜX±}Kü3§Ô×ÇM´#@Ï<ôüÚÉ?XÄ5n,Ér¬[;/¸ ð/`]‚*aõ=È-ïD_¨àÍåÖ!ê9ÊÆøgná^<ž÷yÝ?]ÌA=×±hQ°mãoø>AƒôÌ÷I)Lý ¸x£—\r¢–ðbù+ìú«Œƒ®EI"S3iöÄøQ¿}2-Kùƒ>³ '探ýóÒe‡™ž4˜òbûºb1“²÷ºŠ(cÁáX3o[È@ÛÅï4ð\1NF#ótãñ°° U  ’#v€›®vz7hK/þ¹…kŽ‚,ܧ‹z@(‡ÝÏÜ .u!/V÷ó¹aXA%j)õy1z'aQÞÈ`p˜é·6&€Të§ßMÏÔZÁú<ÀÂHó=z…djf•;€ñѼ(-¦ó6wø ï¼büNËö«gVQû¢*WÞíïiÝ~¨Ì7êõퟛ&k+£Q}^ …y£`&£è™-Þ7?-PáfÉ–sõs%y¯a„$¤»¢UÓœ?ÖèîýÆr®”¶•‡–·@ë/W ’Ø ´ kCV0ÈâzÅ ¸5xOWµ’sÓý¥ò8ÇùÙ~««àB|t=ÚB+¸¼Ò$o®.š0ÎõJû 'ïö³nÃ_}‘:\ØœŒá´¦d‚ Ç\¶f°dA Ót³fÉdBçkÛ7&@PêÒ? 1iÞ,ÜØË3;v,o ŒÙLæbCý>{Þ‚÷ÿgýohSð`ÕnUû›jê{JRü;6®ûcn3æ”pصQA‹*ˆáÓÅŽÉÏ ®n³´àÂΔ(w”å,Ò]^è¦áƒb¶ã“ÿ…•thî ýüŽ¥3ï?¿÷54r[Qª­«®÷=ê üÃÔ¥÷®_µ‚2b^¥Žš4Y3=‹`»™¶Y—¦¬,ïˆ} óPøf® JôVôæËŸhè½´øî×øvÐÍr7ôuêBÂRDAï ‚ÊÙ±«þq±?®ÒÙWh¤tÃ>‚ªyÃès=w;—à<¸žpëð„a~%:¾[Ùè`RV6¡¯ûžè¢Þ˜×‡â»Ï‡¿y5—¦`Öe-zlR°$X a÷ÿyÀ…ïô<àÒ{Ú%€üХƥÙ#`Kócib1X3›ðÈî"b2¨ˆKý Óa3=Ê}|–‚Ƭ… bHE½Àù$ïõhnlÀT0°$o.Š•Î_A–kEFð&…E:e”@Î+›¬y>Ëë%ÏL*Áº ª¥Âù:“,ýjÀ…/ õFÛ´8X>Ç^»ªS,€€¬¥hœèÑ€t-—³Ñ÷È̸̶fûµœŒôŠ„µt!bÑìž÷Æô– «æ}àX¨íò ˆÜzÿz£¿œ]ßãU¨|iQJ°Åý+ƒFÚˆÛXÒ°;´Cm@oõ ïˆ¸ y#ÏÞƱm¸¶2j¡òGº+‡õ÷—çÇIØà½×ÞÌ;o8Hñ÷WP|§Ÿv¯¨Qz®÷¿ò»§5ÅhëôD˜ºŠ.€Ùù1X2H©RXm/ #»‰ªYtJ[ìú± k†jèÀØÌh?à¦õ#@ÙÀÉgÍ«¡[QWÀ¥aúD·›ç(H¸@0̪…`[‘1+ µ‚W'Ï„‚ËÓçO¯ç⮹…úy3Ó‡ÑR~&ÞÏU»Té]õsúºóxpM ’‰þ^”^péëuáýXàRRª«n¤ ¢¹žÏŽúâ›W/Ñ+¿ûWZ_:‘jÒ†ÑjÌŽÇ‚@† AJkWÿv¹‹^±5sŠ5£1vU«SŒçr­Òˆˆ¡ÔG§ (__\âîÝu±³-Ïw“º8î.õ÷9×<'Ž8õ=»Jü„†.—†ŸÌ†-oM=7ꥂÞãyôój¸!(J?c×Ù~ «Ÿ3¶·»ó•®Ú ›çÃg­çˆù;sQc=v.¯ÅÑëï*ˆÂ^o‚üga¹p36¶­¦žXÉDÊgYÔ.N0; rc+ØMÔ¸ ù1Äd 4{¡Â×Jhh’++á\Y€ÛhImÔ°PâB:C'"Ã'Ðpgt¿p5.‚¶IÁ푇 ³P^@j‚ùÚÌÞ>2Fþ9ú§Å†Ø¼î­wy^0ãøî’àRoÌ£ykAZËýS‚À…ú¬°˜fhOw·&]¤—À…ÏäzvÕry‰½þ_%¸pSêçÏ¡¯þ椧â h3†8ÔŠy@&ù1Û]4A ÁŠU¥¡É\…ºˆ%V›+¹b™†„dUêPw¹K Ð %ˆG ‚fÍ™+f³×Îb‘Äj« Ëu¬"8.y·~„0—AÖ®e’Û=Âkp®« ®0Ës­^Z@Øë–='¸Âܲ ÕC%׋üÚ?ª…Í÷hîêÞü‘”1Üý¾2Žï‚zèã^üWÃË=̘ "Ú {ü<à ~––KwœìTV†áÖX_¦æ)c`a ›“Îù1ŽÕLvјF¨=ø@™ 4ŒpQê‚êh›êC‰Ç}Œ€ÍGЍe p'<Ðÿ­å¤C¬ùö*¿öQåY°ŒA - ¯W¼ š«Kâ#½&øZ´šWϯ‹! \–Äøš¼1£ † e¯° ;XMòE@:A?¿ž>Y¢wê˜Ú÷PñÙÖ¦`•$uæzÿÞY>+tAà2éöŸ[hÆmXîÈ>4ðåßR;“ûfYó‚l×Ì‹ñ²‹!ÖL¥UÓ& ùÌhHJ£ü¹³½ü>§©‰ö]ôZ5: ­›ÁOM7Ò«uôÎ<4GÔÃg\¯êEŸÖ÷‹´ÐÎUù ùAÍo$ö Ú‰o.1* ø0&(VÙ=-Ø*>ZÌ ‚<Št,Ä ……ÿlÑ@!˜¼×/1®Ïà¶æA×Ù˜lÉß®J/ÿÖ­c ‹wTeÑ•˜««àÒ>òA@ J½¨rãgCh"Xž °æÉlÁ0= w±&m8m‘(ëd¶5ƒË(:F[¿­:‰VÚ5f› 8ôüpUL3ؤWÌ)î4Úw«°Ø‰Ý¢ÄpÚ$ù7ü[f›1Ð{/\—«‚%PÕ¾àZÄL"r¶7‚¦¢àÝ—BÎý,zÛ“… ‹Ö ›XØ®ý¼à:>åßhhw<.SÑ™å ZüѬaÐ÷ *Á=è¬ïü%”÷«ƒ‹8müÚY™ìˆ‰C|qYg@¶ÑvŸFé Èİj ¶) ¹ú4”ðp‰}¬ub$Àº¹€'J~ó°ˆú@È¿Gï=Äuý^ЍĪq¯ˆ Wèóºßb±À­3¯%ŒÉ ’ a¡<ã:©¸AÁ9¨ ku‚k .ó§îXCˆå:8ù%zù÷nõ†‚ËKJ˜.Y¸¼}Ú½×Ç)X‚¾OPûó3~–n¡×ED V“2œ&îK­…ãi_µaÅØšÍH,4~ùá€ÌLJ³ûWÉe.Añ™hN¢ÚV„ÀuèÒ¹/ˆ¯*m(áÍð-Î%‡qlaËç³p¶¥›—ã^øA¯ÐäRzññû¼LËZ‚@p½»`s-`JçñõyÏ+¤×•;["|Ïç þÿàÂbÏöÕÕÖú¨ø é‘W^-& ²\A®®iðž+Hl¬ÞBg*ÅòüX'Ñë÷¬Ù)ÃÄŠí€ÈøØY•,ô½+.›mçÉŒ|™ 4¡òYj²Ï60‘¾œšMû|8V2å°éØÿÆÇ‘ÓSâ™™ Lýï' Ôߣ/*=8m>‹{Qܪø Û3aaÀòT ÇqMØ2GvmvÛû‹†ÐÜL? ±¸KGK¸ÎÏ󻵎T‹ŸSPÛòüe/5£¸åÜÙ >ý^˜åòª4:רÑî* *LmT&ãMdÿì-—táœjêùû§u,•ZWÇV¬Õ猦½ .u™#,vшËYF›Î‡Ìª$n [fehU¡Dµž³¹*©®›™o³ÿmõ±zꟀYÄVRÏ´˜¾\òª;×Ç×çµDÞ÷éÿÃÅy´7¶·Àån…í䦿ù¿ºðxDÆúž¦$ÿœ1%(ÂÜ?ïï;[Ü&áutÞ X7ÈÊÝ3“ÌøYAVOÍX1ïÀU) ®Q²Ö©ÌôÍL¥t·¨5ó A@+fp¹ˆëè¥øMËBDJb¼q›]ìx6A¢¸€×Õß©•”–uœ8Úï%KJttú0º¿0ÒFÁ$pÂeþzÈàBAkТkNs q5A”›ê,¶:]æg ;ꥂ¬`˜[æ—÷ý^×8š”)èþáüfÍÖ/Ær™`{é·ÿF­ãilÇô$š W±?5æ·Q­™76S·QÖ\0––NŠuI­º ¶5ܯ®¥Ë• °pÑÀׯE€8¼@|žÿ;r{`A?Ÿ7€LŽ£Lã‡Ëó'H­]¸6dûUî$rSØè‚þüÄ`Åüá¢`&4¨ Q­ ZMÿp‘açóºA÷Î[¯§™‰ì+lúÑÏ3¤OOšŸC{*SdÛdÓÆõ§ŽÍV°{K&‡—… J!B¼1ší>úÀfX·Êd&E\IŸK©®¥|°|¡Ö/È"ü.ôægÚÿÖëÂÏ­3“¨_”®Qýç’˾šõA.ç©"_tÿ¸°o(¸òû'>ÂýLíçoÀf¹p-ˆy¼qÊÁºj¹:s÷Ì.Zñ¥Þ›Îb>¯Ûú£ƒâÇÕùâ„Wè“bÍù»¯.ò÷õÀB}Pí·\Ú î¹ H_7Oý¿ß:ý“€+š»g&„».%zÂ,ç/\úE½ú ÕÂMœÁVŒ"¶\k‹âh{EÍO WŸ=Jb4ËšE€†üY¨ûèa#–-•–æÅºËcL±Ç­ ô‘Žõó€ +¿z¿ùY®{¯ÏþX¦ù̶D8_hƦòo¾A–ëI@ºÒä#Y€§*õp ¡jð¾^sx]]Ø-î ËíÜæ ò®^Üâ0…Æ/\Ya—T éM»g$Ó¶òDJÚKÀ¥.#,@kJŒ#@¶<Œ0fœÖ°!q]—5“_ ‰ßB6ä[Z· [Úô÷§«j äsœ×ØÖÈŠ3-½&jèÚ§Û®±)3Ó³…÷‚åÐäß ß÷w¬¤%, iþvtx}c‚¿'¬óRX>+Í-„Uõv`ŠFj˜ç WBð÷:ÑàÀíÛK{¾(VlÇ_iC{ ØÄ¢ÙqÙæ’xÇšÁªm.§ôa½°¹â4›qÍPˆHiŒG÷èÛùU éú —Ëjmð\àð€…„ò~寙Gе¨5Òë–¼$Mg(몛Ζ²ªãéHÒvðdÈá=Ý5ZŽÊ>Í/ÕÂß–äù«:Wg¬ž7}ð¼ ‰ °zàWX»8|m”ó«—ÞXµb Ù£©hLÚ==Y@æÍ\ÇéSëÚC‰‹°…ú<–ëû€+¨É ØRs–—\õÖb"ñnaÕ_;{& xå”6˜]Ä \ 2lMLP,É% ‹Ç\T`WM‰€M·…]J$±#ÖÍ\¤¦°rnÞ–/*@bºmJÆ;b­\ËòÆPAl?Y  Fý ·y:=Ô*š¯Ãû*&r·s*pô§ `qbN¼ß·0¶?µLâ ‚ÌQ4nPoÂfôÞ'óór]®aX.Éd ½ï £âHÌfUÿé®.ÔaW׿'e •v•%E¶<»ä°ÝHûçÆ¢‰TÎ3w{sñºþm1Þ,vCŸ”x=Þ h¯¥5Ô–®¯oÓp¾SäûVŒDû¿,)9UÓÿá  zfÑ,(t^´æyÿ^àò2‰ÿT1WWÀ6qìhêßãEÊã\ÙÊIãh' Gà ÙÅS×)táz­„ãu ”‰ ±¡ù>ß¿=€^“åâÁ"Û…ñ}ðÝ6N¤i_ÅôíI1ƒúÿ]\¿®Üû®¼¦…:µ²6\ÚU7È "LÌ×=/Ù éÊ÷ú§z b‹Ì¤x5°4–ñì,e á°·"o,ÍŒâ®cí‚­{¸q[Hóuáïó|¦žFV¬Tó5ê5ËOþ¦2 Øýƒ[<.f(µo\ÿ³°R?d‘uÖ@Ïý÷²\]ýüò•ïE|×1apoªŒ,‹‹´pt?çß&ð\‹Ùcù°Ø]–ÐkCþ¿|ü@ßû¼Ÿãü?_[û´JåDºn ó’†ËÿÇî/Ç߃œø©¾iÕfø„»¸¾npýÔO)Êçc—ÇâÄ"ÚbzüÞmÙÔÂ…ü +ØÉkÍ×=ÏûþxŽ’†°è6fç\ßò¥‹ñÖéy–@ôúnp=Ï]ü‰_»gç þ±€FÇЄ¡ýÅ•œ—8œê3FÑÎvÅŒcæÄ!nk×€­a6.¨÷\+sÇÉçÀÅKŽ(n,®cVE)­c¢æ'¾5?Û~¶¦k†rè s³dÁ—ädÈâÖ·eŒá>†ì¢™Ç\‰¹ Nóo)#ј!ý E¢…É”?Aœlg×®¨ûUz0õĬJÖi)ú÷°NSѨøî˜«{}ußÏ€·3FQiõë'J³ºÙÂîeÕ}ºx¼qYí„Eš…·•Ötƒ«‹7¶ûeÝw@ï@W¤YP‰tƒ«{Ítßáx;H=nH’ —a£a„ì>E÷øçº°j¦4««ò«®»Ôým»ïÀp¶0iÖpúîStßî;Ð}ºï@÷è¾Ýw ûtßî;Ð}ºï@'wàÿ3¬¸¡;ú7 IEND®B`‚dibbler-1.0.1/doc/TEST-METHOD0000664000175000017500000000110612233256142012262 00000000000000Test 1.1 client.conf/server.conf Copy client.conf to /etc/dibbler Copy server.conf to /etc/dibbler run server run client Check that client does not report any errors. Check that server does not report any errors. Test 1.2 Copy client-autodetect.conf to /etc/dibbler Test 1.3 Temporary addresses Copy client-ta.conf to /etc/dibbler Test 1.4 PD copy client-prefix-delegation.conf to /etc/dibbler Use wireshark. Make sure that prefixes are assigned properly. Test 1.5 PDx2 Uncomment second pd-pool i /etc/dibbler/server.conf Test 1.6 stateless Test 1.7 anynymous stateless dibbler-1.0.1/doc/dibbler-relay.png0000664000175000017500000030455412233256142014042 00000000000000‰PNG  IHDRûa7çÿyIDATx^ìý”TÅÖþßÿú]Ñï{}¯¢¨¨(Ld$ã #" *0‚(9‡‘,A2H–Œ 9g$I¢ (9ç ä¤˜¯zßÿËò¤>ÝÓÝsºÏSë,WsºNÕ®OUOÕÙµëÿ÷ÿ÷ÿ`"    ˆWPüL$@$@$@$àAû÷ï¯^½z‚}8pàÏ?ÿìAËi xŠÀ?û,ÿ©S§ þ3fÌhÖýˆñƒ™ƒçÚFƒH ê¨ø£Žœ’ "±®|ݺu•⇂G6lØ#<"ñíž={6lxë­·šu?ö\½z5P…üžâ™<÷.ÛF$@$@±H]îãÇ7(þ7R³fÍÒ§Oœ·Ýv[óæÍ9²zõj}ª  s?"÷Ç" ÚLa!@ÅŒ,„H€H€H lƧÄ:4=ä¾¥âß¹sçªU«*Uª$™ï¹ç¬ýýõד&Mzì±ÇÌ‹ýØþ‹ˆŸa³’‘@ì â¾¢¥$@$@$àÉÉÉJ¯¿úê«JñCâoذ^=²Æ"íÚµkæÌ™ùòå“GòæÍûÉ'Ÿ|óÍ7;wÎ!ƒY÷à Gùú$[I7 Pñs( xˆk G)uìÊUŠ¿eË–¸_´hÑ%K–芢÷î݃ zàäÁ¤¤$L  ìëÔ©cý¸ƒàžtî÷P¯Ó” â0`O$@$@$ øâ+Žüø§Rü³gÏ–ÉvèÖ¬Yëý²Æ/Š 9ÕþÝ;]»vÇŽCXÏ‚ šu¦L™FŒŒiÌK±J€Š?V{Žv“ @\Àê»RçyòäùꫯDñÿüsQüˆ¬ÿÇT®\9dhҼݶgí®Qç<ùÔMçþ"EŠ,^¼XWüý‡êÒ¥KÆŒ¥®zõêἆ°y×Ò¹¿S§Ntî“æãfPñû¸óÙt ð6 EM"Äðý÷ßK1†0ŽC‡•ûKÐ3Ø•°Õ”€9c4CõêÕ•æ.UªÔ—_~)tôèQ´Ëü—sÞ’õÛœu¾Úwî-ÎýHا»eËYãÅ„½Ðú’áÞ{ïÅÛƒóçÏã`¯gŸ}Ö¬û±£`Þ¼y1J•f“Pñs ¤`UrÈ&ÂcÛ,à w§B… AÙ!:åƒÙXBÆM<”yv¥,DÚlu‹õNý¨]¬¬+ÅéÒ%9cÆ 4ÿþÜqðœ›ký—kÖm"î:ˆÈùÞ{ïéŠÿð„ð>ÅŠ“Î}î¹ç ë/\¸Ð·o_Kç~ì1ÀÛïà¢%$àž¿{VÌI$@$ÖÊQ“­n¿šÔªU˲…Tüaèø@E`§¬>ûì³Ï”âGˆ<8<ÈðVõº;s­ú|Wâ+7Ýu}ôÑ?þXÖøEñ¹‘Æ—5kV©Gwaù_5mÚÔÒ¹¿~ýútîÔ™üÞs¨ø=×%4ˆH€â›@hëâ!3QŠ»3-|dúá,ú¡ø‘‰kü!wDÀ±¨¯zq3!÷Eñà Ï"?\kaÌäy»Ÿöšeï â÷N_Ð ð´Rüþúp¬Çê¾’tî=ŽBk ½z,zΜ9U4jÔH)þ3gÎ ÿæÍ›ñmú w|µçÔîÃçC»ú üèîŒ7û±gkù²Æ/Š¡?¹¿jÕªbœûíçâÅ‹óçÏ·|S„³~—.]ê‹-û¨øc¿Ù ˆ)¡©ä›¨´ZÀºJôãQ™Shm¡â7ƒ5µ;yòd¥øüñGä‡>TøËe+ì9r!5×Ö½_7lÚJ9÷·oß^Wüý°á}_t?ü l$èÞ½;NïÒWúåsbb¢¼…`"/ â÷rïÐ6 ¿I;汃èü |ëRø¢ eIÀGÜ«d¬æÆºWüxVlC‚ ›Ágn‹²ÙáqKÅ殮.wî†6*Äò€ÝçKyFŒ¡Äô}÷݇Ð:¢øwíÚ…Ò~ÿýw9·GŸÁ{^Hýµö‹=eÊVáÁ?~YãÅtâÄ ,ðgΜYò¼öÚkí0Ð9‚Rü8žIÕ¨—¯ºá8õûºâ|½u°úSůw¥sKjF˜*­ˆ¾îÇJ¹RÒ×JñËQ»§OŸN—.2¬Û¼wß±‹áº¦ÍYš#W^©7þü‹-Ò?D?6ø¶iÓF9÷·nÝd¾øâ‹%J˜u?œûèrX2 D™”³: °% „ ¶ÁoX!UêÆ2ÚŒSüW)Zƒ^A2Ͱ+ÙRô;[‚ê Ž4–…ã¦A ;´e;€‚Rüú AÍ‚p3`¬Ì,—~Q;(lV¥Ag«yáqË–:(þÔŒ ̯ôÚÝ;5Ûvù±V?jwРAJñËQ»8|Bï?v1ìWÿA£”s?œøQµ¬ñ#a¾wÿŠ+ ¢‡z¨¯\¹2kÖ,|6w:v#8ÌÃEŒå@°¨øƒ%Æü$@$)Jª•cY‡SB—ì÷ê)Yýaýª@•A„NUO©õi,º£ùVéQ³Å’¶’;Ì^üRô§ ÚQBå(Ùj>O "[Ù£Ì@™°ÇÁçþVñ«Št¥î¬øÕ# ¡o6¼{Q¥)€¦èé=bhšâOå¨ÐW÷åÕD¤†¸M¹ˆ‚¯b-Æ ¢ø!µõ£v5k½ÿø¥H\;œFáʹkùŠJñŸº‘Љ¹sç;1HÖ®]‹ï¿ÿ¾¥s?ŽïÅ´!ÊY 8 âçð  ¯PBP$…ò¬Ð?(9h^9FÀ¥V S_H6<mª¯S¾E™ªF}Í[_ wx«€’ÍòQ÷„1 WvZ–©4´K'{)Ë~´Tü–9-!FŽ¥ÿRô Û·o×È—,Y¢¿µÛ AdH®Z]ÿ¡“—£p 5éÌ7Ýôßzë-øÉ??vÃìòåË‹åO<ñÄìÙ³¿ýöÛ)S¦ Š¿y½3œ(}¶¬‘*~ ð %-×\•ót›ƒÅJëTi;ÃVZ)Çù[KÅïf­Ýù…ƒ¹n¤¹Ðî{Ü«óT4Ü{õ8ôˆê5ý­‹n†e?š±‡eTüµ¢ü{ÐÚ…tÆI[¢ø –`S/nBC?C)þç.GáÚsøL˶3d¸ƒázࢃÈýJñCô>„þ3Ï<#¿dÉ’0ëýÈ©oDV€ääd¸þG/«#!@ÅÏ‘@$@^!à,uW(?‡$ C¬®ó‘Süv+ÙvÆ(iî¦uæÄv½ÅïlŒY¦ëA™ìÌV-½ŠB»áæ~TDíW¡ÎºBj×®­?$5l€†Æ}¸Ðì8ð®ø|}%:צmªT»é¦çþ?þXÖøEñKêÝ»÷=÷Ü<Ê·aÆðBXÏ×_ݼؙf8˜ÆD /+"*~Ž ð÷Šß¬$ÌwÜk»`×øÝ8¥YQ¨–› ÖøÝ´.rŠ_Í,=ï-=”BVü–¯\]Šß 7÷£":¿ ¬yëf3F)~9j·sçÎׇР/î?~Ñ ø~s%j×Âekó¼y:[Á‚—/_®+~´ïIš4i¢œû{õê…¸¢+W®Ì—/Ÿ¹_àÜ?mÚ´èf-$@ÅÏ1@$@Þ"àRñC’ª¸–Ì^=vÎ'Á*~ˆ1ÎJ×.›ó¿ËÖYn9°ìÎ Öø•Í—wçX=^Pü.¹¹Ñùmà°[%ˆr_ÿÎ;aŽÚMHH@†NÝúZ*þcß\æ5òãÉ™¼éÜ_­Zµ;vÈ??üy_èÅ_”ÁiñâÅ44vìX;ç~lˆgÖBôêá  ¯p©øÝ/o«†ÅWó.…º*(Å0ž¦Ë]Ⱥ®8†Òô§”%ú>f‡¢Â>*B@Â#ˆ[¯ÿ+¯¼¢?bá£4øÏÈQ»+Öm³Vü§¯îuàØ¹ÖïuRÎýíÚµÓ?Dÿùóç±~¯FÝ«¯¾ºgÏlùExKç~D&¥s#‡K€Š?XbÌO$@‘"pC§›ý²X¥Ö£ôˆ­Rüb›>UOC,Q;cÜÄÿAÐÏ`·™ºWüzDQÃ;ç5~‡YŠÚ¾¬ïÆV¥9ì?V4ôöZ€ŠHr­\¸³ßyçJñÃ^)~ĽAFyíég÷á¨]+¯žc7äþ‰3ßFùúrÇÁªo×Ë{챩S§Ê¿(~¤ .tëÖMç‚ÐoÑ¢f/{÷î-[¶¬ÙÉzöìIçþ( 9?WAÅïçÞgÛI€¼E  âw£)QÛ7ÝûoëÕƒZT$‡Uj»àvŠ?`\yU/Ú‰X=ªQfð.»ˆ¢–áD†aµ‹Àc)î#4*¢ðÛÐOÃZ>BÚ‹â9j÷7Þ€>nØ´U@Åòì·Ñ¿æ/Z‘+ÏM7ýâŋåGWüýˆíS¯^=‘øpìùðÃ1«DøÑìÙ³›uÿÃ?Òÿ¥ ø¡‡nîú­X±"îE´ŸF™E?î€ÆÕ«W£Ð¬Â?¨øýÓ×l) €× ¸Qüºb†2€„.DÒe«YGBñëÓ;K,°Õò¿Ò:ºPVn0ve»EÕ è-–ÜDN»@cõ(Âæî0lcÐßè³&Ö¯q\öÕ<*\£"Ò¿¬dë}1oÞ<¥øõ£v“^Ov¯ø¿9- ¯5¾Jx±¤4*Ožž0õÁ?#xV¯^®üJñËœ%ŒûÒvæŸ0aÂO?ý„Ÿí“O>iÖýÙ²eûŽH÷Ë÷*~?ô2ÛH$3ÄËÅìnÙˆEèT¨C¬"ãƒƒÂÆ"ºÁF/Ðù[ãð¬”c°ÄM8”)>6xÖ²½h¾EÓÐ@ÉZ/ŠñvÉ©R¯e×:UˆØìÆ`RLr ×¥LR­p@®Qm÷OI }Io¿ý¶RüˆiƒB8€ûðŒß´ípPŠÿô…ki~ûúBóVïÝzëmhVô»wïnýøçš5k .,ÍÏŸ??šÝß§OKçþÄÄÄãÇ»gËœ$`&@ÅÏQA$@$@$UpR×׳‡ ¦¿µ‹h•È/¡=G.«øÏ\üÞ ×Ž½GËÜŒÅùì³ÏΟ?_œ|ô4jÔ(øý Šºuëâ¤:uê˜ûâ³mÛ¶tîê0¯Ê¨øã«?Ù  ð<œQ¥Díí·ßŽh6¢øqŠ-lÇQ»¥J•B†Öí»…¦øÏ^üþì%O\s,yìñ'¤±eʔϒAôãF«V­ð6à»(þõðn*V¬˜Y÷à hĈžï^èETü^ìÚD$@$@qL@9²CÔâ¨]¥øÅw"8}úôøjÙš¯BVüç.ýpîrÚ_˜xà…Cçnd¸‹ÊúGðJ0•p.¯ÚÜ‚F3gÎüå—_ð_ìp0ëþœ9s:¸ðÅñ°aÓRC€Š?5ôø, @Ðô£v»víª¿µ;eÊÈÜG}|÷áó©Qüç/ÿ¶¦¢ø±µ`ß¡¯«½só˜Þ|v ¢ÿÄ&]ù‰ÿ /ìܹ@°ê¯ãR€¤¤$ô4z>àWTü~íy¶›H€H€Ò‚€~Ô.ôëŠ+DñoÙ²EŽÚ­R¥ îת×4õŠÿ•ÓêÂdCWüŠã–®Ü Žé}ñÅ7l؀㺠ûw•sÓ¦Mñ-NõªT©’¥s§N×(-º‘uÆ*þë0šK$@$@1M;P•xÍ;7ä¾(~ RôÝwßÉQ»c&Ï ‹â¿xõÇè_˜fX*þSç¾;yöÛ!#ÆdÔ6ì:tÈ úqZ_9÷÷ë×ï×_]·n¢úX:÷c_DL TüQ€Ì*H€H€H€n@Œy%[4h ?ÜZWáÛôîØuø|¸ÿ¥oŠæ… †³â?qæÛûOÔo”"š+ú½{÷>gJ_~ùåË/¿,¬máÂ…8›lòäÉØ¿kÖý I2°#@ÅϱA$@$@$%Ø›««U,N+Å/Gíbm_I ¯â¿üíOѹ0µp£øŸ¾z웫ËWo.–PB€ÀƒñâÅfÝ?wî\÷”<¥K—>|øðµk×pv/âušu?¶DÓ¹?JC9Öª¡âµ£½$@$@$³¨t*¼w6nÜ(ŠÁjÐ&¸¤ÃϺ~0(ÌŠÿ»Ÿ®|÷s¤¯Ëß]™à^ñýúÊ‘SWÆLœù@æ‡ öãîڵˬû±¿Yç‚ÐoÓ¦ B|â4ßòåË›E?¶ùâÄ=Îß=cJ8²Så„7$—.]‚·¥sýúõqŽo\Œ 6"tTü¡³ã“$@$@$@î èGí+V r_ÿ±cÇPbõÈQ»ó–nˆ¨âÿî‡_Â{a FÅ¿÷èÅ=G/´nß ‹@®>7>pà€Y÷Ãù.@âÜÀüxO²wï^ìîµtîÇ ÷=ÅœñG€Š?þú”-"  /Ð=OÚ·o¯¿¬@#î$¤êý<¸ãà¹H+þk?þ¶ë‡ëo ®øw¹ðùÖCß|Gä;"x>ü´)Ái§Zµj’xá„#Ì–,Y¢‡@UÜÄñg^´)ò¨ø#Ϙ5 €ï `-__{þä“ODñÃkEŽÚ•7Uß©ÅÿýO¿†áÂÌ!bŠ;v:?cþÊçrätd´|ùr³îÇÍ‚ Jæß},ê#na½o(úýù[¤â÷g¿³Õ$@$àQ#=n$ƒ.Á.O¹ïQ»iV p;Qêó™gžùüóÏEñ«£v~øad6zjÔÿ?ý'uׯßG^ñƒÆög{õq×Ý÷@,êCÓÃwß>þøã|°aWz/ORRR ¢¨¯ø} âÃNe“H€H v @Ó‹@1ˆû"EŠàæã?î…¦qâB/ °Œ’ž5kÖTŠ_ŽÚݰa¾Mwë­›wžˆ¦âÿñçÿ„|ý€·ÑRüۜݴãxõ: à¾ß¹sg³èoÞ¼¹L ®ÜH—/_ÆŽ^ÃÛ•qãÆ…Ð}|$Ö PñÇzÒ~ ˆ+Wüx󀹇G&1Ôñ+©¯4?^)~9jnýÈP¼D"Ö³£¬øúå·.Ì¢¬ø·î?óÕ¾3Ÿ,ÿ¢`‘›Ñ9®Ç°Ø/ç—!ÈéŠ+–-[‡þ… ~øá‡:|ÊC?œ0šJÅF˜,ŠH€H µì…  ³Ó\j{êUCjYGñy¬++щ£v!÷EñïÞ½VüôÓOð>G†Î=?LÅÿó/¿ua†VŠÿ˽§·ì9ýáˆÉéÓ_Ò3sæÌ¯ÿLrŠ;ðÔ‡Ö×rr²‚ÎQìvVå!Tüê šB$@$`§ø=B†Š?´ŽHJJR¢Ÿ•â‡XEˆÎ)Gí®X¿3Mÿ/¿þö˯¿»¼07HsÅ¿dõvàBàÎ#GŽ(Å?`ÀÜ|ñÅq,—®øŸ|òIŸNü¡ à8xŠŠ?:‘M  ø!@Å?}ùgK GíöêÕK)þ~ø¹ IŠˆ4ÛöŸM+Åÿë~wsaVàÅß±ûuqø<§´$‘øá߯+þ‰'ê.=<‚7þ~_.[DÅﳑ „³|u#á8!ËâR©ø¥p¤l•%tŒ]â`—.]ªD'Öò?ûì3Qü[·nEi¿ýöÛ+¯¼‚ uµH[ÅÿŸß~w¾0%ðˆâéåò †{%ø>Œ%Üœ5k–®øõX=Y²d ¡ûøH| â~d+H€HÀÓ ïkÕª/|¥üðêyÒ¤I»í?G~xó[¶jÅÑ_/wìä»”†ÿ¢4ä1?kŽÆƒ<²gWªÀg{<ÝQ7®~ýúª_òçϰ<¢ø!Ra bõÜu×]È0uîŠ4Wü¿ýþ‡ÝõŸßþðˆâß°õ˜8ñƒáÉ?Ó„ pç‰'žX³f®øeƒ„$œxõÎg…^!@Å $@$¯ ëu-®ûà³Ać«ÂÝP¦®ûÍ“ p–¥z™rØÙ†oõ±Ì–æ;‰cbÌ`iYõHË–-•âGìHؽ§øÁæ·î;ãÅÿûï˜/L¼£øGŒ› bY³fUräWаaC]ñÏŸ?_6HHš7o^L  Tü‘ Ê2I€H€nÀê»÷PØâ<ƒµ”†† T¼‚UüJî£4”£¼zôW fѯœsÄerâ³2Fê†Á6ÉÿÊq` Ìp Ãq\ŸÁçD?‚ÄËQ»uêÔA†W+TöŽâÿãÿê×ïü×SŠÿÍj׉áLƒZÊœ93nŽ5JWüݺuSðÃ*ö3Ä+*þxíY¶‹H€e‹H€HÀ+Ô¿Y:‹‰f}”âWÂÝÒuG/_ +~óSñGy¬ 2 ö’ªRü×®]ƒ1pòÁ·Od{fËÞÓžRüžÎ‰ýÍ –+W.%÷ñá7ÞÀÍÖ­[ëŠ8õß"#E¹÷Y×Pñ{­Gh Äè(~xõ¨X™°g@‘噘kù8yW?vë¢vµ+Pk7lî)Åïå¸ÃÄš6mŠ×#*a/nBâ늿U«VJñgÊ”) ÝÍ*þü}÷݇ 8OÊ;ŠÇl9\i~æîý<b³gÏVrêÔ©¸óðÃñźâ/^üº»¿$µ›Ê‘SñÇG?²$@$àEê4+»80ï ¿Õî[÷Š^:"hìB ËMÃTüQ.Ù²eS¢³I“&Jñ_ºt µã8X|›>}†Í{N{DñCм~ùõ÷Ÿùí§_~ûñçÿüðÓ¯ßÿøëµ~ùöû_®^ûùʵŸ/÷Ó¥oºxõÇ W~<ù‡s—8{éû3¿?}áÚ7ç¯}}î»Sç¾;yöÛg¾=~úê±o®ýúÊ‘SWŸº|èäå'.í?~iß±‹{^ÜsôÂî#v>¿óÐùÏm?pvÛ³Sç­±Œ3ÑRýúõq§˜éНS°OZÁŸ6mZº›Uxœ¿Ç;ˆæ‘ @ @PN‘vaï•ãGŠ_f (ÿµ ¹#Ñ9%驸#=ªIF÷#Ÿ9s¦(þ7ÊQ» 6D†WÊWòˆâÿå?¿»ºÒNñ×mÔÄ^ýu]ñgÍš7ǯ+þ(øˆáƒ©‘în–ï}TüÞï#ZH$@1L@‰r˵võ@¡å~PÇdª|Ô#•ŠrÊnŽÃ]VÓ¨DçC=´nÝ:QürÔî·ß~+!äŸÍž{þ²/Ò|ÿç_ âJ£5þ<Ï1¤¥?Ž×Ål†¯”®ø1+PðqZX;–…Å**þXí9ÚM$@1A@¡©ŸŒ‹}´–z=(ÅBdF!¾=ºïV÷UùÈcØHzÅÂ1‡qÎ@LtV¸ŒÄ¢2À+ÑY±bE¥ø%.'¶íöë×/}úôȃp“u6OÛ3wá¥ìe¯žµ[‚Õ­·ÞºuëÖæöíÛãf™2e°ZWüت«àcê®ne91M€Š?¦»Æ“ @ PÊ[|~Ï‘ {^€wûþãáé~ðÄ%¸¼ÃñýÈ×WŽ~såØé«pˆ‡[ü©³ßÁK¾òð˜‡ßüًߟ»ô<éáO¯zøÖÃÃþÊw?ÃÛ>÷ßýð˵ýþ§_øé?î?…tEYñwîõ!HæÏŸ_É}|À?qñøuÅ?qâDÝŸŠGíÆÀŸÈ¨˜HÅ̬„H€üM:^×åJ‘@ðéA3)XÅG°~r,ˇ²·Tä!+~T§Dª´‚Ëüjh㋾´¯z¹páÂÊ_ÎÜ…oÜ•W®\©ÎŠÊû|¡yKÖGSñCô§âŠÞÎÝÒ¯$g»víéHÒîÝ»±ä›¨+þºuë*òØ<íï?wòåË?]ñë“®¶mÛzl¤Ðœ4#@ÅŸfèY1 Ä:¬Û©S'({³Ü¯Zµê—_~¹gÏ ˃ôïÿ“1¥ø·RUm±@ÔN•3}†;:tíY¯8ö„ãŠBtÎÑç€Þ<€‰¨J¯½ön6oÞ\Wü˜Séá7Ö햰ĘŸH€H€Hà:z7¸ì‹ÜÄy[·7}•àÇ_ªT)ùö™gž5jÖø¡ø‘6mÚ´cÇArçÎÅŠ“œÙžzvÊì¥ñã‡+ø®HÇã¯Q· h¼óÎ;ºâ¿ûî»qsîܹºâïܹ³RüˆáÃaJŠ? @p Ó%¼¦!á|¨!C†èZ_ÿr{—w:ß¾soy%¢ä>><õÔS¸9räH]ñBÇò¨ÝHü b·L*þØí;ZN$@$@Q"0oÞ¼,Y²˜µ>œòáa¢4=„>ÎÓýã?„çâÅ‹¢_!¬¤D”GÊ;7¼V ÷‘° <¯]»&Í[¶l™h\¤b %ÖlÜZ<~„äè Å_¸è‹huÏž=÷ÿ™pt1î`·4bF銿ZµjªƒxÔn”~±S ìô-%  ¨€Î„|4k}¸ìC†êšþÂ… *Ú¦˜ùË/¿À ÈY÷=ZmÿEü™%K–ˆâGœ¤#GŽüúë¯RŽ•czáâR¿Qʾ£gƒ: r< Wx×ø·ì>¥‚î+Åì²ê¿k×.]ñ«=øoc¢>RX¡§ Pñ{º{h ¤¸…À5߬õq§Q£FXƒÇо$ÈzµéÖl-Ž,?»tôèQDŽ—ŸÐô(ë¢_a¹ºbÅŠ"[ï»ï¾Áƒ‹âG‚g?Ô-Ü„„þY°`AÉY `‘%+ÖŸ:û¼äá+yøÍŸ½øý¹K?À“þôÐßÑ¿ÂåÇ_ñÍwd~¥?¶@ȪÿªU«tůÏÍà•–C‡u{’¿'»…F‘ @À)NXT6/í?öØc8cØ Ú!åÝ›)ÎýκµçÈ‘Cj‡¬Ÿ={¶(~$,öcéZM0fΜ Ï"ÉùÖÛ5÷1—c¾3`ÀåÜ_¥J•5kÖˆâGÂ"÷±cÇĹ®Dp’5ï wÜѹÛ†5þóW~H³+Õ±zf~² í‚›“’ûøP¹reÜlÕª•®ø±Þ/$ñ¨Ý€Cч¨ø}Øél2 ü\n”'½Añ# D¶¥L‡Ü>|8¶Þâ -Þ]ߟ~ú ª™‘Ü(~äA ÊæÍ›+çþ-Z(Å{œþܹsÿýïQ&êä©gžÍ>{þåÕƒ…ö4¼R³YËöè ÌÁ îUzàp§늿oß¾ª×à‹å°§‚ãÞ·¨ø}Ûõl8 \'0bĵ ®Ë}8Õ ,¦ègΜÁrþ?ü€}ºê&\íÇÿøà˜1c°+W%‰²/˜ðá»ï¾Ã@¾…_>ÜH°ÒMIŠù€¢yâÄ ø ã>ÿ矮­ØÈùŸÿüçÒ¥KúWæÏùÿä“OŠÅ‹_¼x±(~¬ô#!‚ç?þ(•Bà Ùn½õ¶vºœøæ"ÖûÓö í®ÛK{ñþÓ$I²=nN˜ê芧˜©N7nœOG3›íH€ŠŸ„H€H€|Gº‹Áf­wpøÒÀOFÉnÈqˆr3 „ËÔ•:"l"”¾øí¬X±Ó€ à3Î…Åê;¤¿*UãE¡@8¢ÀKÇY÷«Ó¥KW³fMD%ŠX‘õ_<‹P>¾•¦=øàCSfÌ…æNÛ+„3wû|x}‡n¾|ù”ÜÇü7‡ "«þ²soWô~äQ»¾û1»k0¿;NÌE$@$@qAÚºS§NâoHåË—‡ÃŒ’Ýà=±Nþüyõ¼M°Wt?öé>|X}‹×x9`ÞNùðR¯,Õ?‡ªR̾ûî»;tè ?1D0Œç~,çÉ“çækK®ýü+Èî4¼GñCOûîäÙoOœùÇûæêѯ¯9uåð©Ë‡N^>pâÒþã—ö»¸÷èÅ=G/”ýú| ‹úJñ£E¸ƒŽÃ›¹)Š¿nݺªyÔn\üF#Ò*þˆ`e¡$@$@$àAàð†7k}ˆã… BmKÂ29‚`Štv“°fézŽûsæÌUwðáòåËrŠ–s’ÈýúƒæÏо¥J•’VÀÛgòäɲÌ/ ³µÎ¯$‚'œ|5m¾ïÐ×PÞiu¥øÓg¸fã=‰jW·nÝp§hÑ¢zc¡ø•¿¾Å\.`~ïSTü>íx6›H€HÀW°x`³Ö¿çž{pØ–AUCRÃS<(>ˆì ¿;¥Žû JƒBy:ëþY³f©ÙKbbâgŸ}¦KaåÜõ8?¼2ã=÷9Ê;­.—küã¦^?@÷þûï×[„6â&¤Š/“$xRé}Š^Š33û‡¿úš-% ð#,Ø×¯_߬õ!‚7nŒ ˜fa õlÞ†kÇ’ú“O>A~ˆl;ŽoQ&btºé¸ãÃqeùòåΊßb{°œ Œæ ™ˆí£ bç~ÝU¢D ;O¾ù‹WB|§É寫§aÓV°'«¶ ]Ì›Ø#!»–%µo=‚§$µëftù6¿o»ž ' ˆX¿AlHX0†ˆÄd@Üß± Wý ö"âe®R‡˜Þ°aöæ"VܱƯJ0|˜>}:ò|üñLj©ï žúî‡ïÚ•f¸öÚµkKáÜß»wo]ôëÎýXWý¥î,Íõð>(\Wêx  NÞÅ;µ¿ïð&A^)à>Þ0è/`ì!Æ,Ba9ÀZ¸:M ^1 ªë~øÉû <‹o…OÖÇÿhÌdHð(_v±zzô«pì€nù#<‚›“&M®h•ú÷ﯺ1|V ï0ci±E€Š?¶ú‹Ö’ €-hè¶mÛšµ¾,Ãa‹î’ ! í ’3¶TfQê⽃µs‘æŸ~ú)ÜèUL”47+J]åD¼Î¹sçJ¨~Ë…·ðöÁ?ñ>+ñ*>X†ò„dÇ’¿žÍðÖ¶k×NÂÂ÷½iÓ¦X,×=apV€œ0€Ýyóæ\ Y´|Ý1ÍŒÚe³ÄKe`ô•Í8q wà…Ù×WZR§ãÛ¤¤$þ0HÀ?‡ Ä#F¨åm]ô¿øâ‹ð¶×¥¹:¡Ö¹ÙpÓ‡ŽzÇr‰R7KsýD^»2 JN)⯄wвºpG½–Ç~Iá¹ßAôã+¸ïWªTI8 èÍ€tÑ8È#¾LS¦LAÀ"ÉY¥Z/¶8úÍ•(]¦xüÛ÷#Ž:PùÊà–-[âN… 0;ÒÚ¥:šGíÆÃo8’m â$]–M$@$@‘'°zõêœ9sš—ö|ðAA]c}Ý¥ÜWVÃWë÷ú ½{inhºA©#ØÎÚµkñö«òªL¬ß»ôNÁ„äÊ•+κòçÏ/d°ÉÇèºðF¢Fæ%RÎý-Û¾¿÷ÈÙ#ãQ¸þ~רq3`BìëvÊ‹ìHÆfk•pÔ€ÞãðSŠü@c 1L€Š?†;¦“ øœtÜ9ÌZÿŽ;î€[”4ĺžàßó6\;ŒŠ• el(GýsÑ¢Eˆ€é¾ Ó%xŽe:tèïÝ—†œp‚è·+Pî#`‘zûQ¥JL3ôý¯pî—9`ÖªUK`fÎüЈѓp n.ýÌÝ·kÖCí5jÔPÂÚtéÒá&æuè>•Tx"|U @  1³ Pñû°ÓÙd  ˜'‘ŠVÅ[Ý’““°ÒRcS¯8Íc…øèÑ£P>$¦xÝ8(~ñÌ Îè ÈTÂû ާ@‡œç~ ¢0a²}橊ðrçp)ç~øÉ袟Q”lbÆâzáÂ…iþ‚…?YºŠ<Òס“—œ¸´ÿø¥2?ˆzG¥ÌëÕ«î)R‘yôôì³×#xJâQ»‡ 3Pñs @Œ˜6mš¥Ë~ž!Á¦qîW7áZƒw ²;T˜T`j¡Âûä>ŠÒ›i9€\Α#‡0„s?þ©+lݹ¿{÷î¹ÿúùÄ)­w<}ðÄ¥]PüÍ[wD]øº=wÝun¢SÐ*éGíbîêhâs>"@Åï£ÎfSI€H€b—¤0U5k}ˆÑV­ZAIcE_$¯] ({ÊT9±ª-J+ëðföiŽèøX•WÙðˆùØ]‰ÜÝ/Ù Í1s!.J]—æ8Z îòª@|ÀL@Ÿ 3Þ6¨ ˆû9þ|11õ•Ëþ1©ƒ!‹õ/H-ðË/¿èÍÔ³©Ï|ðœF /ùêÕ«cš¡¾Ä޳sÿÝïé?xôã—"t=_àº7\t”%Øx;8jÑ–ôT´hQ5`|ìŽjZ5TüQCÍŠH€H€H žpæyjH/¿ü².|-¥¹¡J¥% i±«d1½]”})"R[åÇ^aÄé¥.Ò3 Ì+tÍ eoçü¥Ž7 *3–Ûq@¯zဉ>cùÿ³Ï>Ó'$rį¹™x &$–¢“Æ R,¥¿÷Þ{ºèÇg4G9÷ãm€äÌ‘+ïô¹K÷¿ÞkËÎ#,HŸ{àÜ©V­Úz-!º‘~Ô.¶V‡2ªøŒÏPñû¬ÃÙ\  ˜"=s³ÖÇÆM|å^š-Îý¥næÈ`8‘׎·®Ô1gÀÌëýXõÇb¿ªy éñcBbPêðáç~$,ücù_oµùåƒ^¾%f)÷ÕMì+(]º´~â‰'0£ÐcÞÃõ9¥LìÈš5«ä,ój…u›÷î;v1\W¿A£P,vbèµÃÜDÃAR¥¾}ûªñÀ£vcêל–ÆRñ§%}ÖM$@$@v࡞˜˜hÖúpÙ‡æÃ굞>9–ÛpíʇÇAT†rÔ?CÓeÀU>¼‰ôÒNŸ>­þ)/ æ]v7”:<òÕã(jÍš5h£^>\}\(.Cv-•ûx-[6¡]ªT)¼©Ð•7Þ6¨°¡€¯œû6mµmß×{^Hý•ôz2ª®S§Žª÷“O>Áhz,ê#F§JåË—W£¢X±bÇÇÉâÍåüBÆ%|f‹KTüqÙ­l @l€Ü·tã©W¯|QÌâjX<^Ü„¶„V†s<òCFÛé`,ÒceźáIzØÇ®4”ƒåy|ë¦4Ƀà¡°+s—u©1ëpý˜WtéÒE9÷C|£QºîGˆOyGùCƒ Dvù¿{ïÁ{Ž\Hå…rPV5¶mÛöúË„2eÐMzºï¾û”âïÖ­@é G#c.‡ù‰ËéûaΘ&@ÅÓÝGãI€H€â“€Da×Ó‹/¾ˆàŒš1ø¡¹eW«ƒR‡{ºì¯…¦‡R´+uIÀDÕ„v  qهϽ]iÐîâ–'õ€JzZ¶íBû:OH°ÛØM÷£F¸Á;LHôZ0ׂÖòpîG¸ý¤[ÐÃ&iqvBNtŠäÌöÔ³c§ÌÛ}ä|h×”ÙKP¤¼^WÁ‚qyM% ÖGþ Š_ýkÿp£ré—å#óÄ4*þ˜î>O$@$Ÿ ó”°ûç?ÿ9bÄ,Q»IPê"ègΜiPêЂjJ­¬—gw¬Ó#ჺݱ*zKÌgla-Yí¦…ô„c‰z&ÐÙø¯ºƒ0;*$¿Ri.3 Àõ8Ä+’ú§Œl[‰ˆ¢ƒuÉ6Ôî ä/¼ð‚t¶L ]‹£L¹_wîñ¥—?]óÕ®Ã烽4i‰Š^{í5U "óÈQ»8° ;•UR³|õôÓOÛÉ}uKþAùzÅçω­ú¿ÿ£âç(   ÏÐ?´\M å] Vxu‹Óä‚RǶ¬šCL›¥¹!Ð þi§ÔÕ[(s©Òš[—æÊeŽ%ø¬+u¥¿ÍJ]}…wX>× xö‹s¿>!Q‘þ13AÈ C/êg @Áëd†þëŒT?é r01ÓP /U0A’JáÜ÷Ýw£§E§f½¦¾:´óÐy÷דO]?@·OŸ>ªð?üwž{î9pÖSΜ9ÕT°iÓ¦¿dÀÜÏ.`«ç†> Š *þÈpe©$@$@$ ºâ¿÷Þ{EôCàºýȆÅ]ó•/Ҳذjn·›Ö¬Ô¡DÕi¸ð0‘õu³4ÇÎQ=ʾÀÜW–cB¢ÎØ¥®¤9ª@Ezñ­AªâŸºRÇ®¸'I31)’ÝÆ˜¨·€¦·Z^>¨žÁg}BbÆ kqܶϢ pnÆ 1yÐu?œš”s?NÆ•¸™wß}Oûνw<çæZùù.<‚}½dL0p³Y³f˜¼©„i›îÒ#~Y.ûSñsŒ‡G©øã¡Ù  8# +~ÝG‚ԃf7 !wàɇS=¿¥470¥®žÂ`Ø?*ó‘æzâäÐ p(Ç ½z¡îñr@¦"¢×Q8ªPÐL‡Pžø Î**36òª“¹”‘rì—n¤ñk0Râ:ÄKR¥J•DmÃÛ¾wïÞxÝ¡\qЙê@«KX¹ÿxÒÜ€¢¿k¯A(G)ëeÊö\̬pšJ8jM)~Ä r©õõl ̽qö·Âes¨ø]‚b6  ˆƒâG,ö·ÞzKÔÞ˜1ct±ëF÷òvÓ¬Ô7mÚ¤Ksc>ËŽrêÆcG/&$x!ÛLU²”æÎJžKpXRÌô1ÙpÞÃjh¦%Ux×äÏŸ_z!wîܘGéG¡á '{ÉY¼dâ¼%ë·8kw!²áý€*mâĉ¸ƒw;Ëÿž”âýõ×CPüx„¢?z?c/ÕDÅï¥Þ -$@$@$pƒ€YñÃå£~ýú"øzöì Ï–´>Yºt)VÁÌQý€é¼eàÜbYÄ¡tƒê4¬1cEÜÎxxÛ^Æ Ôa&$Pÿª|³_ƒµp 8›Â¤"S¦LÒ•+W†¸G*Á¹_mq†/¾8÷#Uy»ÎÚ-·í?k¸¾Øq"}ú È0wî\UH­Zµpoà’¤^ïÀ­H)þAƒ…¦ø)úƒ®q“™Š?nº’ ! ˆ–Šñ[Úµk'šÁÚ¡,áúl’·pq£Ô±ƒvܸqÈ”–á>¾EyèH7ô¡ÈDç[Ù™¯d·±›ÒSL`ìÌÃDE9÷»,3LHœ©âÜß–-[Šsÿí·ßŽåy]ôã3|¨dûæøV¢î@Ù·hÛeë¾3ú5jül|õðÃë% :nöïß4T¾^%÷±[CVüý.CTn¨b9¿\¹r¢Â!Ù €Ù…JpÑUʹ_”›åÑÇšòÕ¾3raíW«VM=GÜÁt‘OñBF¥¤¤$¥øá\”¹/Ïu šzÌãeTü^îÚF$@$àSŠÁbõWD?T ô7’Ý(T=”:t­Š|¯‹?]šCÍ#è¾zÉnZ,„Ã3^ÝÇš·Š 5opBflóUçyAUë–`Òç~}±wï^97¯ì”:+¦+²‡½@ì!Ö'$ª™p›QAôÍ£ A&†Ùb“#GÑâØ}‹€žºî—CĤ:øe©Øš‹Ÿµhí—{Oß÷ÀƒxpèСê)„ÂÂ… £d=)W"|Û¡C‡Ô+~”€`M>ýù¯ÙTüþës¶˜H€HÀóœ?D?–¢áOñ‰ˆ4¹ãÁ&lâüä“O s?úè#(uh}u²<‚fêšCyB©ëõâ _¥Ô!š…±¬š‹4ß¹s§^ ªS.ûpîÇ¢sJ3‘0‡1LHÄ/H¾E6dV¢.|kh¦%äÁƒ#|*º31,Øc^×ýx€ ’åÜ_6ézüô# PùK–,‰›mÚ´A3UBcÕ?>8µÔLþK Ýãù?á1Š?<Y „‘@@ňˆ.ÃZg²"’f°Š_ò#ô$V¦o†É> ÕNšÚè Ô§OŸ®VÍ¡h-¥¹¡4‰ªªÆ„ÒY)u,–cZ‚ɉ47ˆWƒRWÍÔ÷0(¿ ÌUAo5^>¨³ Í´äŒ R“&MD—ßu×]ˆ¤‰I‹ž0ù‘ føVÞÒ Aâ«l8©@&rxƒ­º*Õ®][)þ¬Y³%ë3£_Â8nY”g Pñ{¶kh € ¸Qüp¯G „‰-8pà@HÉÐD?ž‚ÿ T/¤§iî^©[®š;¯+‹ËjŽŽ‚G»š`râ Í'$ÒLyuI-~Aø'|î 3˦˜`àLø«¯¾*]º´ôÈã?w]ôã Þ!ÈD;%SÙàÆ£ò ?î<ñÄধìÙ³+ÅMaTü(ŠÇñúá ¿z™m$ ˆ1ºâÏ•+N]…8V¸‘Db_¢»@­&''‹Ä¬‘ùî(©OÁ®þB%×FÕ‹ûY£›awįeß`ÀÞ%†ÄÐëzº_CË[êAU»ñÿT_)¿ ‡ÒÄeÈ/ÇÍ–-›tJÑ¢E¡Ý¥ï$¡ØGé™d@4õ•œóU¯^=O¦Î6V/ð-þ^ůŽˆ± Í †0´˜—H€H€¢B`ĈjM›ÚÔNñcå¸{÷î" áÖEqèþÔ+~,£Æ ¢ãƒA©+3èçmn!¸ÅMÃ[»þƒò–c¿ð’•Ú/»‘3 R‡4—=ÄØ`WT82`·1Â×X0 öÈ͸nØÂë…^~ÁÌ w,E¿lüEŒX«Ò®]»ôa€s¸"¡øÝ´: fð2*~/÷m# ð5œ«jýXÅŸ={¶Á_Öø¡ø‘à#^¥J—ˆÖXòâÙr‚k¨Û€Jݲ«Ä¹_Õµªö‚Í—!èNhnÙM •¬ÛŒV (¼¸Ðç0X˜—¹RWÒy°Ë³U&Ê1LHAš‰˜˜vkÞ0XÍ‚0åp˜˜Ï˜1#K–,Ò5/¿ü2œv]TOذ¯°…3$¼Á€‘x]£ÏúRyÔ®ÃlANZ`ŠWTüñÚ³l @<€û»’‰¢üùqüøñúÎ]ƒâ‡îÙ³§¸õcÿ(JßúÔ$hq ˜-nVêA”:Ö­E©«ÓpU”}KiŽ8›ª qRmÁ„Áé%d§®ÔuiËqF˜Þ|å²Y„>#B6i& Ä´Êà2¤Î€ñ€¬ˆÉj„Î/Uð¶‡g‰¿¢pb‡.öd‹èÇa[Òeؘ‹ÏØÀ MF`~¥øÃrÔ®èGsö#3Ä.*þØí;ZN$@$à z£¿ˆøƒX„VV±zÌŠzÂñþûïGf¼%€B……´…MMÂi¸rœŽ°; ×®KD©«ÚåÐ_QêX¡—peæÖ-ÄTÁrS©¸ ©œˆÜÐõJ©ÃeÊŒ6ëêQö•©Ø†‹*›j¦ÚÃk9GÊ‡Ùø§Ê,/ô ‰Lo4wåÊ•¥+q’n=P¦DgÂQ»˜¡©WÐý™3gVŠQü#áÒ#e"f‘/~N~m$¿_{ží& ˆˆ <ºwÖƒá©/Ñ9-?ΖÂâwÞ¼yå©êÕ«£€b4à|…àõ‚åi¸npÚ)u³4G(Ou–]ɲB¯lÆ$DBì‹4‡°V} Moe_ ǼB‡£7S•‰I¦:"ýåƒn$,‡ýÎ0á®S @étîóÏ?½zõ’r`í²eËнÓqYä? pӃ̣¨øc´ãh6 €¿@ƒ&$$D×®]?Âã 5mÚTÜEà„BXûáÏÑÖðòw0GúLœû• ƺ¾.Í «æ»Y|iTÂfheXèFš 7(uÕLˆ~¼7Ð ts¶€aBb9À»,ó«nÅ?žÂl ¯;à_„yšú ‹ý‘“ûR2ctl±›Š?vûŽ–“ ø‹„ubb¢.úñ¹cÇŽvkü¢ø±×n3<òˆ<ïYφæNe‚»‘Ú†‹Š‚í (uKq%U„²][°[_U&EpjWbñ[/Z?¨3 ÐLÌaìÌÃWp§iÛ¶-œû1£ÃpB\NQü²—WR5"­øƒ¹E•™Ó–Úògí$@$@$}ÝW´ ŽÚÕcõÀ‰ ëÄJñCô#CÕªU%?œI ©e±?•¢ã$)L3X¥.Îý$’¦CÀ××_x8Ù5äÈ‘#ðð‘—n@ËbDü´+/7‚ÚÀ¢/,KÓw)àEvñ"úªRü˜§Eô¨]óü“7ˆ˜' PñÇb¯Ñf  _HII1¬ô,XKãÓRñCÂ"AIß}÷ÝxV¶ó†k±ÿòåËj.k§ábC­¾¦®¶Éš樎×Ãû v‡5~qĸÛÒÕÉâ}ûöÙ(,ûi&|ÀÙO$@$àkÄz¤ˆÍ›77ûñ‹WRüp¾‡IŽ9ä¼1€8†¨…Æ ‹îǪ¶¬©CÃÕ>¨N2L? Œ¡›eM]È‹†ëv:ì¦5(uì4P…`Ÿ·”Œ*ä|bIX‰‡³ÙlÜÔë…ƒ¾:ô3ä‡c•4SÔ¥2«3¿…Ã~„ÚDL!;ÅÿÁès9¼Óˆ´KÊçP5¶2SñÇVÑZ  øDˆWaÝ•F,Uª4¥¾s׬ø!ú÷ìÙS»vmy ‡|a±ECÔB’¦>Á_hÍš5¢§áµíTÏA©C%+30mzHs8Ыû©QöU†FŒ(u$‹Âõöê+ñf›eóƒÊ¯7SÊÄVe©””ƒpÇG°ºï¬øÕ]èD쉂ÜG–“œ z™=K€Šß³]CÃH€H€HÀhÊúõëÜúŸ|òI¸†KtN$;ÅÿuœÎûè£Êãûƒ)„AÔ¦Fýcå[”:Üî±Pí2`Žj¶.úa\ðÝKs;K¥®Ks” )ðØ/)V\†”1h&v Ø&¸ûr_Ÿ väÁ©[8¾ÀâWÑTÑ)8Q! Šÿرc®F3Å&*þØì7ZM$@$@'€#x ¢nýˆPñCôcá¾@âÙ0>(J¤¡YS#÷Õ³ˆ—P9²þ ç{—]‡œÈogÔ?“ÜÌQÕ!3vÊÚˆø˜Á¤ÿ•”ÖÇýElÆ—Š3½+Ã' Š ]ö ³Å"*þXì5ÚL$@$@ (¡×u±ˆ€îíÛ·w^ãÅQ¾~ýú¢E‹Êãð‚HEðô€îO}B°K¬ñ+wñz·Kj7-´¯]Õ8¸JÜr6nÜP©#"xJf»áicÞ†ë`$¨¢9æÒôÐýØ×‹ªÕǽâ×ߨDá¨]™N`¿TqL€Š?Ž;—M# ðìÍ™3§a±¿\¹rˆønع+~üûJñCô#ÎСC%f?ÿÃO]Bè¤^ô£DîÇnQꘟ˜ûq÷%r"¿ªªÓüWÝ#Š]À½ã¡¹ÕLèÚ5Ûš%ÛŒ3Íaèà[äANƒâ×]öáöƒt7ÜHÁ*þgŸ}Võ`•*U¢°À*p¾ï~-~j0¿Ÿz›m% ðèN¸ãD?üÂáW£Çê±Süýˆ´S¯^=)±€°ò l²•6,ºRXU/Îýø¯Šðƒo‘G¯ Z_ŵÄV]ݬµË–Y³RWÒÐv½@Y‰7Lf0ÁPq°ÛÞ8†ñ‚;¸/¬ÙC%«2õ Ä(S,¼OVñwîÜ‹úzßÁòè(þ`·Xøà—WM¤â«îdcH€H€H@˜è‚›~³fÍ$?侃â‡ý¡C‡°U½.HHHÀècQÛaIp%¥Ž©T»rôÇg½|9QËЭ°DÖû%AˆC[Ë™\¢Ô•4ÇM|…ªÌÐúu‹òQ‹ÊvÔ%»•˾Åg©ß"ʯÏF0^ø/Á'*(Å?f̘׮]»Bw¢œö¥œ|tµõ¯+u7ÒÜЗ¥®NÃEQ"Í­7u 1cÑOéÒ Ä4“•Ó5 [Žšœà¾Ê£ÏFðø‘#GI?ŽH+Y²äÃ?Œ“¿üøgÏž]±bEì¸0ôþ9räÈè,ðc—…'þh9¿?ú™­$ ð%Ëhýˆá3hР€kü¢ø¡b!^_ýuÑ£Ø,ÇuVÙS£û!Êá!c–æ.{Ì ÔåŒ-$|0¼+°Óúª"ÃK l*€sŽ8÷ã¿øŒ;R¦þ¢O!pNãÂÁg¢ø± øí·ßß}÷9(þ&Mšègë*ÑŸ?þè„èÁŒAŠ’qÙÌæYTüžíF$@$@á!ЫW/óúqùòå!RÍ;wáÇ/^=JñCôC"l¿:ê Îý#FŒ€qXeÇz?äox{‚m9^ØÙO—Qö¥R™Ì¨Ò°w ð_uGwÙÇê8ÜxpîRümÛ¶½ë®»x¥J•pª®åÎ]Lºžzê)s¿À?jKûò!¨§Áö ó{„¿G:‚f @ `>K–,æí¼Ðñ†X=vŠÒ±qàÜòôÓOK9(ŽC¢ûáßFÑ5u†µg7D°îU Kì @Û‘Áý¡¿²‡X—øªdÝeŸ1)B$ÌODñÎOüðC˻˖-{çw,]öË–- ïÿhj}ÔÇ'ý}EøÇKô *~Ït !  ÈÀ:´y;oŽ9pü–{Å/´C‡3f™›˜˜(®8¢ûSŸäH]Ñý° âÛÀëëãÇÇ·h,×k„Šw#uS¼’$.>[bÆ‘^óçÏG„Í/>|Ôãú<9ñVGˆâÇ,‘LEÄcƒD£F°®o«§{÷îð†2/íçÊ• ›w£¬õå 6$D~ıO â÷D7Ð  ˆèc呯(\Jš7on·ÆW~ËíÛ´iS 惄wX6Æx¸t¿RêPáPØ‚ÒY–í±”®Ks¨|ÝGE7Ù ãQ„²G! ¸~ìÞW@Ó+­¯ÇöÁ¬ð>D)þªÓÊ^}õU,áë±zTtNTj> ¸0_êÓ§Oôµ¾Ôøã?Fmȱ¢4'@ÅŸæ]@H€H€H Ú°¸‹ ¦æõfì%Å9VúÎ]„ë ˜à6ƒun̤ÀêÕ«cR!ëýúB{È ÿð’¥ÛV®\) ÿpãÑ¥9 ·ôØ‘ð;ªj<¢Îôňx¼šÂ±àÌ™3*§î²’O:­/ ŠSÄ9•ö>÷Üs&LÐcõ¨5~™””dé²_¿~}TVrß|¸X´‡ ë‹.*þèòfm$@$@$༖~&ð5G I ×ã>}þùço¾ù¦R·PºâßEwhnèÔ$„ÄQJ]ÎÖÕK è/º_=/|yK ÞAx¹¡¨^àA„ •ˆF’°Ç råÊÒL,ððÁj箊Î)ŠçÝ~ûíf¹ÿÒK/¡´Òú¨×ak„gÆ& 3*þ0eq$@$@$C°KòfU -;lØ0,ö›p¼& ÊÏÞ,ð³—î‡R‡½.ÍNÔ2÷‚8÷«•·~¨s¼ñP7õɦ⯯RëÖ­á¬\x¡Q«V-¸ìë±z”âÇÎ]¼e¦š5kVÐHC­ª±A"†Æ'M *þp‘d9$@$@$«–.]š-[6³B-Z´(D­8÷•àÎŽ]ÊÇq<áòŽÙEXÖû•:‡~Å+ˆ  CÜÃßòm´¾:ˆ ¾=˜ê оJ8à‘GD/¾ø"Üuð•ŠÕ£âñ/X° `Á‚f’˜a£sÚj}ÔŽ)Û jÀÄMf*þ¸éJ6„H€H€B')ŒÃt•/¾Ò¬²£Wbw†zöì©æ8¯›DtB^cy>• >6ðÉ޾ ×Öãá²§ õêZs’¯¿þ9U‚áÂ…D?^}èߪ5~Œ·%–‘7kÔ¨‘†.ûjšá’RècˆOz˜¿‡;‡¦‘ @t @Ó'$$˜—¨}ôÑéÓ§‡ øåll-Q¢„*V¶öB÷Ë’È ÛOG|ñ!¸‚ÏÀïçaIäÍÓ§Oë5ê±}àài®ÎÊ…XW‘7[¶l©«n×®:gW§—?~)æKû0»¢;”X›·Pñ{«?h ¤9øš[îèÅŽUˆ`²&Ø‹-ªP¡‚z€þPáx·Íš%(xìå5OzÃ.^Ì –,Y"³@œJîëZ÷᥃x;*½÷Þ{JÄ¿ñƘQèßªÏØõ‹X=æ9N(9r¤´>l¸råJš*¶¨øÓ–?k'  /°ÛÑ‹}« 6„Ûº¾&¨ÏSƒ”‹?\}§‘mdÉz=´½.rMš4IÎØBäM+'ò"?¹UɨH¹³Ã§[0UP ž'žxBD|žÇ"[*þ°ñ!  ðèol·5K^ Q—ħOe‚à âÖ?ù䓺·bù«Ø>ÁJ}{.–ù¿£–DH‰øÇ|èСú·êóòåËÕ9»zó1?‘i‰§ä>ÎØÒ[í¿qÊ[ âç°   ‚ÀêÕ«q’®¥î¯X±âªU«R)úåqìµEijƒ/ªÃ1^)))8Ó×ýª¿î²UL'Túä“Oà>$­ø÷¿ÿÈ›ú·úç¦M›Þ~ûíæöâmv!{JëÓçÛo¿ ¢/™Õ7¨ø}ÓÕl( „\í!Á-#Õ`ÙNð†cªBþç|P®\9ÄRuÁá.F0þ9ÐôvIµÁjàˆ“TjÒ¤‰ñ•*UÂÛ ý[õ¹_¿~?ü°¹Y³fE<Oi}sâÄ „: _³¤¸"@ÅWÝÉÆ @Ô@_ÂßæŽ;î0kbl~­Zµêâŋ펬 áþèÑ£Q¦¾Çõb°¶­ë~EÛvQÂð«„ð;=ôŒã±°AÿV}ž9sfÑ¢EÍíÊ!œŽ¼¦õaÞ`Г'j#?+¢âÅ^£Í$@$@$àzÓ©S'Ë`>PÌXžÇb<â÷‡1Í;‹ô†s¯àh3°ÃX¸@þBãØ,•°ïöùçŸóŰ×VÿV}ƶÝ*UªXFÞÄ}¯¹ì£˜í  ¼2h‡W Pñ{µgh ÄÄч3¥s?n*ThÔ¨Q–gÖ¦æ&6ÔvîÜ9!!A t8ü€Ù… àî¯\öß|óMÉg„ÒÿôÓOõ êsëÖ­áÓonÞ,\¸ÐƒKûÀŽ#„cg˜ÐÒ4#@ÅŸfèY1 ć žÑˆÀÓ³gÏÔH|»g@³ÿþ¢Ôñ»‡UÂf_%âK—.=kÖ,ý[õyÈ!O?ý´YëgΜyäÈ‘ÔúðÚg¸ý8ûùD´9TüÅËÂI€H€HÀw°ð mççGü÷Þ{/¿ w½¾òÏ„s¸°ÅVn>õÔSÐôê+ý\ö‹/nÖú°QzöíÛç5¹7žË—/ë' øn„±ÁÁ âžŸ   D@üûá1oéꃯĻ߆+IEpõ‘Ô®];ü üø nêà²_³fMK—ý²eË~ñÅ^Óú°³)­hèñ{ Tü$@$@$@‘"€x>ˆ¥cÇSz©R¥?gK8’¸ìÏÔ¢E )_ÝÑ?`6rï½÷šg#¹råš={¶µþ7ß|óÃ?DªŸXn¼ â÷fûH€H€HÀÀÞîÜ.Èn,ù¿óÎ;8u óCN"ß\_RóæÍñOœ“¥îȇaÆeϞݬõ3fÌØ­[7j} š~TüágÊI€H€H€, @p#´Ž¥ŸÜÌ;wÇŽN5Á&)îû’Þ}÷]Qüê¶íªsvuà²@CŒ¼‰(û\×çO),¨øÃ‚‘… ¸%mCso»í6;éš*TÀ‘[¼ã>IiðΗ„ÝÃøgÉ’%åŸØ6ð¯ýË\c±bÅÖ®]ëµ¥}h}œ(ì(ó‘@ Tüñ{   ÀÖ^¸øgË–ÍaÉÿá‡FŒü+V¸ÑýRçKÅ_¢D ÄìGMs-ˆä_#Oi}Äá9þ<µ~†›ß‹¤â÷û`ûI€H€H m @Íé‡g9H¬Ä·jÕ :a=í’<¾àτؚø'¼óÍÅfÈ¡C‡žÒúXÔ¿víŽ NÛ¾`íñJ€Š?^{–í"  X"€¨>Xq/P €ƒîÇWˆ¥ép:Ÿ›’<ˆí¿HS¦LÉ›7¯eQUªTñŽËþ©S§ð®ƒçæÆÒHM[©øc³ßh5 Ä)ýû÷Ã!Ç.¿ñ?þ8Vñ¡ì7ü™ä«¹sç6nÜØòAþüùñ–À Kû'Ož¼xñâ/¿ü§}ÈfyŽ¿çº„‘ €À´iÓ—üñ-|ýkÔ¨1yòdÉùÄO˜ÿÈ‘#ÓVëCå_¸p®;\ÑçðŽ>*þè3g$@$@$@n à”YxûXFÕ 8@DÞÄ«€}ûö¥‰Ü§ÊwÛÍÌaTüÌâI€H€H€ÂAŽþXõONNvÞã«OÊ–-‹ þQÓú8p¯\¹òÝwß!ÞÎï¿ÿŽv³ *þ0@d$@$@$@Ñ$0oÞ<„÷qðõǶÝåË—C|G:}ûí·÷tÔ‰fï³®Pñ‡ x‚"{fÊ”çÖ[3¨¥}LæßÆÑð *~Ït !  ž@þü-p!ÂÏÀW¯^`—Á—Á'H Î PñÇy³y$@$@$ßDñÇwÙ:H%*þTäã$@$@$@iI€Š?-é³î!@Å#E3I€H€H€¬Pñs\@@Tü1 €w Pñ{·oh™gPñ{¦+h @ð¨øƒgÆ'|G€Šßw]Γ @< â§Þd["D€Š?B`Y, @4PñGƒ2ëˆqTü1Þ4ŸH€H€üM€ŠßßýÏÖ»"@Åï 3‘ x“¿7û…VyŠ¿§ºƒÆ G€Š?8^ÌíKTü¾ìv6šH€H€â…¼ô$ÛATü„Ë¢I€H€H€"M€Š?Ò„Y~ âƒNdH€H€HÀ¿¨øýÛ÷l¹kTü®Q1# €÷Pñ{¯Oh‘çPñ{®Kh €{TüîY1§o Pñû¶ëÙp  ˆTüñЋlC„ PñG0‹'  ˆ$*þHÒeÙqB€Š?N:’Í    â÷g¿³ÕA â 3“ x‹¿·úƒÖx’¿'»…F‘ ¸#@ÅïŽsùš¿¯»Ÿ'  X'@Åë=Hû£@€Š? Y @¤PñGŠ,Ë#TüqÔ™l ø¿ÿúœ-šÐÈø €wPñ{§/h‰g Pñ{¶kh @`Tü1‡ï Pñû~ Ä2*þXî=Ú%TüQÍjH€H€H€"A€Š?TYfœ â³esH€H€HÀ_¨øýÕßlmH¨øCÂÆ‡H€H€H€¼A€Šßý@+¼ví'è~ÜIHìòîø-E+5Ö—b¤ßK:ÆlùKñïß¿_U%ªµh;e+/    H¨ÚjЬî‹Ü—Ñ_¦Lgܯòã7Ýu%Ï¡?Æd&Íõ ¿?ÎÖUCêö;ïzoÒæŽÓ·ó"   ;öS¶{±=”ýòåFý­[à>¾Ež×š~ /ÈòL.ÏHè3ä¦âÿùçŸï¼óN5¤Š&Õì2k/    H¨ÞvšøóX*GÜÇ·ÈÓqêæÛï¼[)4cJ“æzƒÀMÅ?oÞ<}ùî=çîâE$` PªjÓ»î{(¨ë™ü%,1vžú…á~£¾Ó¥dÔBò$àMæqëÒÎruÚey*—úíàsÑòÕ›]èòqf#ø#Pª\Ë~чXøÇ·‰>@à —}‹ûw½!›cØŠ›Š¿zõêj0=üdö¾ówó"0H|«i°g­?òTnËrÌ÷›õŸ!…£߯ß},È…o x¶áÇ}ö|É×Bœo¾Ûëîû¶ûá¼TݳM¦a$9Ý&o /Z´Í¯¿þf©"qß"O— ›Z ýDÿ?~<†…'MO#7?ŽsSƒ©ì;)îáE$`&ðJµfê—’ñþ‡Ý\Ï,a(çѧs£ü×p¿ùÀ™R8jñ'ü×ë·@áOžmu»‘‹0ÚCœU›ÿ傌ŠW¨ŽáK~’ ¼ôšgNÃH Bšö˜5Ÿ’2ÚAþuè0 yužþ}Ïê'3nܸ4¬6† \Wü8ÓAŸ;vühÑÐÅûx‘ ˜ ¼úvŠüX²>“;d>¢œÌ%´4K G-!Ó*¼@Ó ‰?ãCœ2Ú‘ –zÝ€¥ÞûÃÔ·øÐØ"p P¹æ0¨ùiÓÖ:HHqìyãÁ(§@É Jª1bO ëî´3ýºâ8p F™|ô£O÷ó"°$Tý¦âì™´Á‰A.Cºu߉vLäç€ÿÆ4¶ˆìŒX°SœøŠG Ì?tÎöc–(©†W¯^ ø,3€Nàºâ×Ú­T»ÅÄUy‘ Xx£ÖMÅÿijyB@ÔuÄ\\™nH” ÿì3a™…ÏòµÈúïõÍSä%äÄU¦R­÷L X)ANyϾÝôýÁ37Ø=%ŒZ´P¸Ô…Çu“T±ç…—ßÂñÁ=ȃæÈ#¸ðY®[…›¨U T$¶l¯žu©¶K]n, Š˜ªNG¡w¡O%?ëÍA(&Àˆ¢ôVà[ôšÞƒ!ÕXÔ¥1sïˆñ¨BºÕ‡³mhF;.‡lòspÎ3@lè3nt<ÎÖ (I[·‡œ‡\ÿßÄ-énU¢Ó¦MŸe0*~}Ûn“ާ­>Ì‹HÀ’@åÚÍåî“Ïå QÏþWýáVE© ¨¥e‘™2gÑWtäsñ2íêÅ#(ÊüÊA–OIø¶Q»~úƒ¸/ùU†“–[Ž›øÊ²pÜÏW´”ÙËVXŽœ`â†3²Ù•€ûv…„@ Æt8Ù².t͸%;…˜axȰªe+×6÷¬ÊްüÖr°MPc \Ž15æ ]i7¨Ìý5böF‡N”öª!离™‡b@ç—BÇwí:= $8prvì·M~ø±§ÔÏpĈŸeø›âÇÙ[úßñ~cÎ^w„ €%*uZÈï%[ö¼Á"ê3zþ}™³àR¿8ùgþb¥¤(dP…Ë|‹ŠpéO•x¥¢¹ê¦úëÅÊS¸ÔM˧¤X|¥—;Ê$CK{,QHc ­Ðbx 5êpä3.”óèyë·ƒ§¬0”±.ƒ¦˜9«ÚU ­“aƒl@­3ѱƒ€2I8ëßZB¡ jŒ•K®írŒÁxË®Áý€]0ƒjB?¨€…3 x–@ç‹ ã¡æJÒÑ£—!g«.3Ñ–Â%ʪ¿?)))Ÿeø›âGTW]ñOY¶}þçGy‘ Xx«ÞMÅÿTö¼!#ºÿÁëRØ\Bÿ± ô#êÒ«PU#Ïðé+õ¯ºª¬Û¼³á+T$ß D6±Dþ[à…R(6$U©ƒRˆž¡dÙJã>Ù¤ GEªÒwßï¯W:}åny Oé_¡Ü‘¯P£¡j#ÌpåH†¶Ã õ•¡®T3·«]ïT“Í«÷²)¼h#Ð)Œø —9U±úSx0´&¨1&ņ„ê|«÷5ªSšG‘ûž2çTƒÓÐw©)“Ï’€÷ ´|:t<Ô|@I:gÎFäD~4ªZýVêÏŽQ ø,3Àß¿!4çâ/Žñ"°#ðvý–ò’è™y^¥ÊU2%b Ͼ4þ¯3VP‘ùÁ‚ ¥¥ö-»èߢ(Ëû’göê=J¸OZô…þ R“(Ù²É*ƒeC ÃãÈ,öX>…ŠTCZv ×«  ÷ƒÐާ¡í©'¦Ì³l×Ãÿšw:W6æ¦) †B ­ji¡uº>Æ £HêµcêAˑ龳ôœjœ˜ ¡ȧH V4o?:j> $]´èúA]u›|Œ¦½Û±Rü Ÿeø›â_½zµ@éÒݺ|Ë ^$@vj4øk‰Eýp><›3Ÿ¹¨|˜¿6q¡… –4nÕU2À •aìì›?a˺$[Å·êʃ(A/Y,Aê;bºe*j1gPª–§ðßéK¶X‹ê¤Þ ¥õ /Jv?Uu Öì5?Õ¥ßh”¦[2±€íJ,WYÚe¢Úeh¯X«¾µìAÅ*,pŒ)côê`¤zÐpß}7r*V Tw‡\#$ï¨ßôcèx¨ù€’tëÖ#ÈY»áHßòý¿6\QñDÇ ÿЦû3¶õ$/ ;µý¥ø3?ôHÀ«HñÒæ¢ðDás9ó¾9y‘èEóW’Se€êYe’~ÓeÉb þk×^—tƒ¶Bê²,Yµ…¸„¨]q0jFÀC#6qîÍ™•]ï ^ÔnÙƒÎ5ªo+U«k6>¼°w,«³{QÛe(“tsj\ïuû0ärø Ä(šu‡CÇCÍT¥»wŸ@Î7߀–vè9Dþ eË–-à³Ì@[ãŸ6mš@Püë·ŸâE$`G nãÖò{Éž+_È”DìšKøxêb)üÍ·ëY®2À •åÈSe“’qßîR [/ÙΕ'„ :¢€öÀì©óרêÔ³h©{¼½>£þˆÉ¦Ø‹‰ï¶í¦—¬—±Á£oªyp¶³ 5ZÕ®ŽÝ?4?«¾Õ»Ue o§‡6Æ`Œ¥îûHÏ €ª¿,„V,Ÿ""P¥ÚÀ€Ço‰V“C¸^{ã´NýÂ/Q)gI (ÿ7nœúã{ßý™7ìøš €]ΆLIÉhC c¦Þ<`µXn™AéW]õÚ}FÕzÉv–¨ž©þÄQñDÇ F¯Ãÿšm'y‘ بý§W\;B¦¤¼z %ŒšrÓ«µXn™Aù´t1’ zÉv–¨Ã’ÍÇy‘ Øx§ÁÍ蜈'2%MÒPÂà 7£s¢ËÂ-3”þ3>LÃV]‚5ÉÎUNZv(ʸPBé`íQxÑÒ`ŸµÌÿ~¿Ñ*À(@IžÐˆžõ™´Ë¡ë?qs[”!s»Ô·–ýÞNmŒZÀú Ϫ^HÍ',C‚…€4j1Îe¬ž5kv#g½¦Ãìw;öUküŒÕCA,ìß¿_÷|ýdã1^$@vªÕ»©øŸÎ‘7dJ¢~Ì% {Sñ£ËÂ-3ÔkÑE~Â_(mgÒˆé«PŠ5”lg‰*'„ ¨KìÁ³ˆ`m…*u`ÏÌU{T6…-u‰·ÇЩx ¥ƒå#zß|®€‡LLk0aá–u½ôê̓ ëÜ.õ­e¿‡·ÓCchlÀíú *¹>.»•ÙH ¾ ´ê4:~Ú´µE›ÄãoØ|€¼Y«@bÌ`Gà†3w'.Ý6gý^$@–ªÔýëÌÝÝ—ùºâÇi£†ú|<_þš£ËÂ-3|<£ˆÔuðËK”­(ðAÏ`g‰ÊZuª]Cj¿ÛYì1@PxíbnrJQù‹•²l»9CÈÄ”yŒR/zGu„]»Çl¤*ÖWx;=´1&­Îå߬ÔÈWƒÁZPE13 Ä ÷zÌqyæî„ «³yÇéh{ÙJ5”âONN¦´% ü¹o»í65†º Ÿ5}Ía^$@–’k7—K¶çò†Œ(Ó ŽÿŽ_ºS/¤ç¨yR8j±,Ü.CÙʵåA”‰<†gµ¿éú‰oGÎÙ¨+–8´%´ ­zŒTRP»ÁX(Å"¾UxÑ"÷xíJ“Ð:s]©$†‹¿RQ·ðý'+3ÌHU»Ì½ƒBÔ·–ýÞNyŒ©ƒùŠsPO¹ïzæ$%ð~ÿEÐñ½{ϨØF^†œ­»ÏAKóyIýiíÕ«WÀg™þÿÈ™3§C5Þí2ù³C¼H€, TªuSñ‹¼vyu9W/MIC|xò¹< e*Ê·È&¿DÔbY»C”£D? l?`27x¯o^íÿï4íd(V,Á³vÝrØ þªÀX{`î«æ«†«Ú‘M=«pá‘€CQJÕ…êÐ^…ÅÜÆÐˆÁe¡tŸ\rÓ®:5l #A𦾵ì÷ðvzÈclè¬Ï ãÖn”Ú õ€?–€Í $7zŒX ßµëô€’y³}ß…hûý=ªþþÌ›7/à³Ì@FÅŸ””¤ÆP©×Þ·â / K¯×|WýXÜè4|®^š¡{xX¾E6),kwΧð_Ë?ÛP…e™¸œ?›Ç®»S“!±b-DÅ^~òR©Q%;†gë²k`ÄPo›~“ Fеh‘ê CëTF‚´B}kÙØðvzjƘ—ð‘vÕmû×ü-àEý ø—‡ü@ ïÄÐñÕªõ(IkÕŒœ=F­µx—þ;Â&Ì€Ï2 Û¶mÿZWËþü¨eûy‘ Xx³QÇÇžÍìÕmÌRCiRÎ=<Œ †Ìߊ È&%ã[ËÚf¨Ùºw®Â%¥Xü¨åC‘Ä×ÍHùÈŒêÁ®»S™¡Eß (Ü`ÊlÔy˜]}§­SMÀƒIÕS\EÔen;Z&%KL…Ñ4é¯RoÔDíøªýÐÙò·Ô`¶6–¡¾µì÷ðvzÀÒœ3 ¥Ò›¸@Û¹k‚ú±,Íå0`6ˆ… ·†”ÿõ×ßœUiÑ¢mmÈü‡ßtûÄ_8cSË’@°®ûñë‡pÝ’îÖço¶d/ ˜&Ðfð,OÙM{:^ÒsòÚ`›Ÿz +5ì Š¿Ü;)ÁÖ–ü©oBXÌ`!$@ ”}½wÀC¸<«¿Ÿø'‰‘ €åßäpò.NäÅ·Þ‚¢žzþEõGNÁJ=æ'¿ÖøñIÊÿL¡ÒïÏØÎ‹H€HÀ@ ׋IÿÖ$¾úß0n|õmâ" —š~¸š¾L™Îæˆ=¸ƒûø¶Á‹›´R_“7nõ+ „@àæ?ž1b„Rÿ¼%]Óá+Þ›º €@“áËKUo›¿ìÛ™ŸÌ‰ ^mØ7 ŠH€‚"P²lwÈúaܵ‹oQZÁr5”<Ë”)ÓÏ?ÿ‚Úã#$ð—âǺóÎ;Õ¨ÊV°T«É_ñ"   ˆº½—@ÙÂtîÞ}BÂð×è:¿á°eX„UÚŒQz(ÜC&ð—âGIú›£ÊïM™ð%/    H(_kÄ=$þ¢E[ Ä–/ß^²dÜ)ûÎPT—5O‚f8x áÔC||Ðçþ¦ø1’ðÂH­»z¢þ¨ ÆmáE$@$@$@$v ?þ"1y€¬ô««TÅ~¸ÿr“¾ú:,ø}.ÙSÙü¿)~ƒ7?ÆÙƒÏ¬÷ñf^$@$@$@$@"P¾áØ„2Ý øñ_|F-IíÆüš?=øS©wù¸Qñ‚ö@ô?šï¥7û.ªùÑ&^$@$@$@$@‘&P¢Aïtÿs;CôP¦‡‘€…âß¿¿¾….Ýÿ»=û+µJ¥ åE$@$@$@$!Ekv½ÿéºÖÇçêÕ«‡Qù±(°Pü¹°AÄ0àøO    hHLLô§Be«ÃKÀZñ£Ž¥K—Vú£9¾Y øœ@RRð‡Wøú¶4[Å"݃¡æó›O$@$@$@Q&€­º<^×·ê< wRüRßêÕ«*!!!ÊcÕ‘ €¯dÉ’‹­¼zõj$dËô-ÀŠß·hØp ¸' ѯ㾙l €Ï Pñû|°ù$àkTü¾î~6žH€|C€Šß7]͆’ ˜PñsP ø¿z™m$°&@ÅÏ‘A$@$àTü~èe¶‘H€ŠŸc€H€HÀ¿¨øýÛ÷l9 ×ø9H€H€ü@€Šß½Ì6’ pŸc€H€HÀ¿¨øýÛ÷l9 ×ø9H€H€ü@€Šß½Ì6’ pŸc€H€HÀ¿¨øýÛ÷l9 ×ø9H€H€ü@€Šß½Ì6’ pŸc€H€HÀ¿¨øýÛ÷l9 ×ø9H€H€ü@€Šß½Ì6’ pŸc€H€HÀ¿¨øýÛ÷l9 ×ø9H€H€ü@€Šß½Ì6’ pŸc€H€HÀ¿¨øýÛ÷l9 ×ø9H€H€ü@€Šß½Ì6’ pŸc€H€HÀ¿¨øýÛ÷l9 ×ø9H€H€ü@€Šß½Ì6’ pŸc€H€HÀ¿¨øýÛ÷l9 ×ø9H€H€ü@€Šß½Ì6’ pŸc€H€HÀ¿¨øýÛ÷l9 ×ø9H€H€ü@€Šß½Ì6’@lؾ}{RRRBBB§N~þùç(MÅȬ‚H€H Í Pñ§yÐ ÿ»zõjýúõÿ¡¥L™2M›6-Òh¨ø#M˜å“ x¿z6€¯ 8ðÎ;ïÔå¾úŒõ~,üGŽ䨲d  ï â÷N_ÐðÕ«WçÌ™ÓRëë7SRRð t¨ø#A•e’ x¿×z„ö€/œ={.ûf­ë­·æÊ•Ë|/FŒv4TüaGÊI€H€ø$ @ì â¾¢¥$àØ‹utËͲµjÕÚ½{wÚÊ}UûŒ3ðªÁlg–,Yôcz©ø=0¦h @Ä PñG1+ ¸!0bÄK7ž‚ BFŸò^êÔ©“Ý1½xM~¡â›ÁɆ 8 âçð LèæÌ™ÓòÝ¡C‡zOêÿeÑž={Þzë-Ë—8¦7oÞÆýÛÏ$@$@$˨øc¹÷h; DžÐMNN6+flmذááǽ,÷•mx‘;wns+n¹å_>šyЬH€H€Ò’ZÒgÝ$àeˆ¼iw€.¶ínܸ1&´¾n$^GØÓ‹—^î ÚF$@$@©!@ÅŸz|–▀ݺ=öؤI“¾ŽÙ´wïÞFYFðÄ1½x¡·=ʆ‘ ø˜¿;ŸM'+8@711Ñ2ò&ßcVêÿÍpœÉe]ôÎ;ï xL/G Ä*þ˜ë2L‘"7húÛn»Í,÷+V¬¸mÛ¶øûªxYayLo¶lÙŽé}–K$@$@#@Å1´,˜bŠÀ´iÓ,#obÃë‚ âLë«æ9r“K'Ÿ¤¤$:ùÄÔ¦±$@$@¶¨ø98HÀï¶oß^ @Ëțعû”/_Þò˜^DôÇ«¿¶ŸH€H Æ PñÇxÒ|H ‹íª–±êk×®½oß>¨ý¿š8kÖ¬gžyÆò˜Þyóæ¥3%  4&@ÅŸÆÀêI ­`‹*6ªš.Ð]³f¯´¾ÞØÎ;[Ó‹¾rL/ Ä*þ˜ë2L©%€m©–èÞsÏ=cÆŒ9íûe_§NËW)))x1’Úàó$@$@$]TüÑåÍÚH M 8 Û¼yócÇŽù^íÿ`ùòåxÝaÖýØß$@ÅïÃNg“}GèfÉ’Å,[q€î”)S(õ àH²Æð¬^½:#xúîçÄ“ @  âÁN£É$àš\ÒíÐm×®µ¾{x R¼xqó¬ »ŸñòÄu‡0# ¤*þ4€Î*I °ÁgKYn?­\¹òŽ;Ü‹]æTðJ/FÌTqL/^¤D¡[Y „@€Š?h|„¼N`ܸq–èæÉ“gÑ¢EpDa ™À‰'ðzÄ2‚'Žé… ×í# ð*~ÿõ9[×°Ôò]l?íÝ»wÈ2—ìܹúžÇôÆõ‰# ø!@Å?}É–øœ$©ÝºMš49xð U{Ø à…‰å1½xÁÂcz}þ{dóI€HÀS¨ø=Õ4†B$`w€.6›®_¿>ìJ—êðòÄî˜ÞíÛ·‡Ø£|ŒH€H€ÂG€Š?|,Y ¤ ‹m£f÷’|Þü瘢B¯PêÖ­ËczÓâÀ:I€H€ â̈9HÀ›°IÔÒ•‘ã[¶lyòäɨh]Vò•+W*TÈ2‚'éõæˆV‘ €OPñû¤£Ù̸"€t;uêdy€îË/¿¼k×.Êð4$0räHËczsæÌÉczãêwÈÆ @ì â¾¢¥$pƒÜx,#o"NüܹsÓPé²jE/X°[Úò˜ÞäädÓËŸ2 @” PñG8«#T€'yiÿŽ;îèÖ­Ûy&øê«¯ðÊÅî˜^¼¨IÕPàÃ$@$@$àš¿kTÌH 0mÚ4ƒ‚|çwvïÞí1­Ksþ"€.{üñÇyL¯~=4H€üK€Šß¿}Ï–Ç"„ß1hÇÚµkïÝ»—ÛãÚ·oW1fÝŸ˜˜Èczcñ—H›I€H ¶PñÇVÑZ¿Ðÿ¿þõ/QwÞyg—.]<.yi^ÅÀ‰ßò˜Þ¶mÛÒÉÇï¿m¶ŸH€"I€Š?’tY6 „›€®ø±wòäÉùó牨ü³gϾÀämK—.Í“'Y÷£7áÿîñÂòH€H€Hà:*~Žˆ%Å¿îFêÛ·¯ŠÞSªT©/¾øÂÛ¢—Ö]@—YFð,P é¥$m% !@Å#E3IàKÅÑ¿jÕªzõêÝ~ûíXŒ.³<¦·~ýúW¯^å'  p âI–CÑ `§ø×ßHŸ|òI™2eDDbÕç¼zYòÒ6øüóÏ .lÁsàÀÑR¬ƒH€HÀ¨ø}ÐÉlbpVün¤Q£F=óÌ3""áå¿bÅŠ‹LÞ&0a»czqàZ_6…H€H mPñ§ wÖJ¡p£ø±lŒ„è=wÝu—èþJ•*íß¿ßÛ¢×ïÖ}óÍ7­Zµâ1½¡ý.ø €3*~Žˆ%î?DÿòåË«U«–.]:ÁóôéÓ~WÖÞnÿ¶mÛ”_–îꃽ½zõbÏXú­ÒV ð*~/õm!@‚Rüo¤¹sç+VLäc–,Y¦L™âmÑKë.Θ1Ãò˜^t‚{#üžH€H€Œ¨ø9&H –„ ø7ÝHØúðËî/]ºô–-[.1y›@ÇŽíŽé…V,ZÚJ$@$Ö¨øÓºX? C dÅÑ8ý)))éÓ§Ý߸qãcÇŽy[ôúݺ}ûöU¯^ÝÉN>8¦—<ƒùé0/ øš¿¯»Ÿ9©Tüý+W®|íµ×TÏ?üÐï²ÚóíÿôÓOóæÍkÖýÀŠñsc˜“ DŸô™³F@êÿæiòäÉyòä™#GŽÅ‹{^÷úÝÀ!C†ØÓ‹8¡)>I$@$àTü>èd61Ž¥ø?úhöºuÄ_¼zDñéoß¾zσ^fò0xaÁ/˼Ø;8¦÷ìÙ³q4ÒÙ  p â'M–E‘&”âÏŸ¿ÅK/½ß¯ß;Åÿå—_"ˆg:u$‚'¼ÃÛ·oáèaÑKÓ.cÚV¢D ³î¿óÎ;yLo¤€,ŸH€b”ŒvÍö)`ÿرkjÖþÚk]ÇŽg^ã‡â—´lÙ²„„åÜ?mÚ4*k˜4iÒC=dÖýÙ²eã1½>ýëÀf“ €=*~Žˆ%Á*þ©S7¿¥k×UIIªWï;{ö§ºWRü_ÝH£FzòÉ'ED¾ð ëׯ÷¸êõ¹ygΜiݺµå1½IIItò‰¥6m%  â0`Oa%¬â‡ÜÇ5tè¶~ýv6j´¬D‰žM›]±b­øñÿÖé½÷ÞS<›4irâĉ+L&pàÀW^yÅ2‚g§NxLoX,ŒH€b•¬öíö'`ÿˆ[q‰âïÜyo›6’“)Ò¥K—qkÖl°Tüýk×®­R¥ŠˆHx‡÷îÝÛÊ—¦]'ðÉ'ŸØÓ;oÞ<þXØj  E€ŠŸƒb‰@°ŠРír)Å߸ñ‘š5”.=«P¡LÑ/^=²Æ´íF‚R,T¨è~x‡#‚'ÅµÇ ôèуÇôÆÒï™¶’ @´PñG‹4ë!pVñ÷î½K]²ÆÅ_«ÖñÊ•O½úê¡"E&•+×e„O,ÿö á_î¿ÿ~Ñýåʕ۵k—ÇU¯Ï̓“O5,#x"²'é ǯe @ì â½>£Å~&¬âïÖmº Š¿|ùÓ%Jœ/Tè`¾|#Þz«÷üù+ kü¢øwìØÍ¾M›6ç~DðlÙ²å¹sç ™«&  ¥øk×î_¸ð°„„ÝPövWx?D?VˆsäÈ¡"x~öÙgß1y˜ÞÆÔ¬Y“Çôýkä$@$;¨øc§¯h) üßÿ¥øNg̘¹¯½Öµ`Á‹9R´èEó ŵa¤þýû«ž•*U:|ø°‡E/MûG+ä˗Ϭûˆ‰Çôòo Ä:*þXïAÚï/Á*~ˆþM›6 6óÕW;?ÿü̼y¿Î›÷Šá £W¬ñ‹â?pàNìjܸ±Áóüùó×^&0vìØ{ï½×¬ûsæÌ‰ä¯$@qD€Š?Ž:“MñÐ?´ÚúõŸðÁDèþÉ‘ãT¾~…Ëß ø!ú‘àÕS²dI‘Y²d™>}º—%/mƒ“Ï»ï¾kÁ399™ÇôúàÏ ›H$‡¨øã°SÙ¤8&²â‡èÿâ‹/>ûl]çÎcË•ëòÜsËŸ|ò*„¾ºÂ²s×Rñ#$Ò¤I“žzê)ÁsÛ¶mטC† ¢ ›4iòÍ7ßxXôÒ´ksçÎå1½ñü…m#ð *~ßt5¢ø!ú·lÙòé§«6”;wßGÝ ¹Åý»[·n­^½ºŠà9xð`*k/¸páBçÎ-#x&&&zä˜^¼‘°LAýè¿ÿþ{)Äð”ÜÄ{ª°”°Ðª X¬§2ø¡žNcH¨ø9 H –„QñCôùå—óæ­¨Q£ßsÏ ½ï¾Ã©ÇïàÕ#küPü’–-[–?~ÑýØúé§ŸzYõÒ6tÙo¼ayL/N^K['ÈGËТ¸ù¸–*T¨×2‡_{=¤ƒèG¸Y¤H‘ þRØ•æ\ˆjK°Õe[ÚföCÓ–0k'KTü$K®ø!ú‘¦M[’œÜ+wîîÍš Ã<œì‘¶ßH;þL¼ƒ´ëÏdy—{ÅäF9rdæÌ™Efá讣Gb•ɳ° ;{öìfycz§M›–V?$Åo6JÚ¼Š/–SñG§©ø£Ã™µ€?‡ Ä)~yÉ>vì\áUü[·î>|<" kü¢ø!ñ1IhݺµDðD|˜:\¼xѳ’—†À‡~è©czuÅAo™d^>[Š~*þèü)¤âgÖBTü$Ã"ªø¡õ%…qþüÕ/¼ð^É—:M›¶\÷êQŠ¢ÿرcØZðꫯ*çþ™3gR[{™¶\7jÔȼ‚ŽH>Ñß©$¤¼Ão{èСJ÷ãÙ3g ™íüøéÕÞ¿˜TüáåÉÒHÀ%®ñ»Ål$à ±¨ø_{£÷ ×¿–<¸jÕ>K—n?~ƒâ‡èGBd˜\¹r‰Ž|á…QÔ˪—¶}þùçE‹5èþè»÷¸Tüø#§ýpëwù“¦âw Êe6*~— ˜ÂK€Š?¼–ö•îÇìoÀTº{ÅG,X Lu~‡Š?¼JÅ^ž,\ âw ŠÙHÀbQñ—­ÐrWçG›õûæÆŸz¡[SÄ_¼z$‰â?qâ¶7hÐ@”Ôd¿~ý¼ªxýkׯ¿þª~… ŠÅ›±º/ÖÖªUKÿU¯^½³M$¼½ÑïëŠyð¸Šäÿǰ+ÿÄyZ¶liv+’·b›C¬½() Kvž¤E0ðAàðˆ*JÁÌŽTÃÁÍvh‚¸áAøÒH¶Ð¬²k£"féÑd÷fF‘´[Âq|¢Y¬þÏŒvGÔ‘³BH,²&&&ÞwãiK—.õæÿæÍÛ“’º•ysúÛCëËuÝ«GSümk÷ì^³sÙ²]Æ_"~üÅÑÿõ×_#fhµjÕ¤í8ò kÿþUßÑm¹î²Ó–,Y2a¼nò›â7¬.ËïXÅÿ±{c ^1æ=J3Ï"ìÔ°Ze7Ì+T±–¥ésKãÿé¯),g¡Yeׯ€«õê €>O³{c#MSs!çã–Sñ'™’@Ì â™®¢¡$  úSRR ¢¿E‹ÞTü€ÜÉ;·4¿@ðP‚+9S„üòË/Êe>cPN˜kùPñ;¸…(á+«à’”\¶“Úø]˜æªa»?ƒ–¥éŠße`"½|Õ»H¦–ÎQz AµQß(lÙLKÅœê¾Î_J¯ÜlZàÿ_H î PñÇ}³ñI`Þ¼yzHÄ5jxYñãü{÷îïÝ{t‰*+^mù­¾Æßó­v{;w>زåñZµ>O|£v:õê Þ¸q»øñc_Öø%áì'¤áÇßsÏ="˜êÖ­‹B„$¯Ÿ‹Õ]ö÷ìÙ3cÆŒ)S¦øVñ;¸…¨…d}^ß¹k÷7Ȭ˜-¿›ý©JÜÔm@Qîð÷Q5ÁòÅBÈVŒÕciÖòí¿rø1L®Ô|ÃýÙ ñù ¶Šn âç@ X%P½zuµÒï}Åw‘vìØÓ©Óèþ‚źËÎ]øñ÷~ýÝÃÍšá‚â?S¶ì¥B…d/Q¡BwÅúôilömܸñ­·Þ ˜ütïÞÝÏê<¼m×]özÑ¢EðÚŸ:uªŸ¿ƒWŒ¥„UÛ^<æÍÖ¡(Y«Æ#vÉrsBj¼Øí66È_LÝç'(«Ü(~@C6L¥dÛ®Úp,ñì6(f;ÊÅß¼ö«ôi7 ¤‚*àñQHS±¨øåÀÝ/¿ÜÙ¾ýد¾Ú%Š¿ï« õåÅø™ÜpëÅôèqó?d(d¼zÔÆDð\¸p!œO˜B&ðŸÿüG êo¿ývíÚµ³fÍÂê~<)~Ýó[—ãÎ;wíèËYñ;ü‘Vñ|ùìþ© â((þ`­rVüàlÐ÷æòÍŠ_mcÐÅ}jÞo¤éŸvVN!@Ŭ,”¢@ v?D¿:sŠ@ÉšßT¨ —Yñ¿Ð¶I“áÛ¶íÕ½z”â‡bCš3gÎc=&Ê téÒ;wî YòúöAlÏU.ûpßß±c¨Îž=;þhñø½ ø×øÕB»î²Å¬UnâÉoY¤?|r²óêÁ[åb¤xÔ†áÂÿŒXEL â‰n¢‘$`A >ÿ¸q‹ß,Ôpc‰òçJ•’˰Ɵ?‹Î,(ñR§nݦ8pDüø Š_t—.]ôžçÎó­|¶áÊeà|µxñbl‰WÅowæ®ó¿ƒ/¸’°zUšÃ–Y%aUg¯‡Y‡ÝŸÈ((þ`­²SüІœ"lææ øÑ|ʾZõaË2ÿCqI€Š?.»•òøPüpìY´h=Bô´~¾Úþ¼…¯äÍ‹K÷êâ;sû°)»k6ó‹]† ™wüøIKÅÑÐ@uêÔ‘BDðD´x,W39ÀAZê×röìÙU«V!ÚúüùóãUñ+—Œƒ{·³âwعk¹ÃÕÙ ^˜‡wç®å_½È)~—;wÍV9ïN†Áßÿ½e[œ¿.8SÓp_üÿƒô*~ÿõ9[/tÅûí·#@§ÏÜ•èœH²sWüøu¯(~9pwòäeðÝïëõOç4(þA÷âê>êp‹~_­6óÕW»Nž¼\D¿eZ¾|yÁ‚E÷#‚'¢Qô› Àe_¹ñ|÷Ýw8;t±"¾¿Zà7+xgÅïáѼT¿1ª4;¯³# ž²TÃúÆ;5,W{ô<©¾Î“–­r~áà„c¹5Yý9Wö ‹[Éiñò·Ÿí PPñ‡BÏ€˜£òãÿˆC† ùüÏ´ñFÚôg‚¤CÂVW¤-7Ò—&ü?iëŸ g]!m¿‘àÏ- ÎñH»þL»o$mDÚ{#íû3í¿‘ õ%¹Tüý8~kذyˆÒÓã¹$µsküŒ9ˆ Š¿Íàu{«ÔöëÂ¥†Œù‰ƒèÇWXàðÁE÷W®\Û©û¥õ–…Üp®V|+~(Båéa^à×5ºac¨š–b$c†)DÀã«ÔòÁœð¡yóæ*‚'DâÏø\÷+—} Dàýì³Ï>ýôÓ¸Qü2w5$ô;´ îøÉXºž;¯ñËͰf ¹¯ŠÅgý·­+Tˆ{=(ÖàÕÜÃ0Op³«Õ¬‰Õæ™LD?&óªùî­²l£¾Ú,èu˜h£Ýºªé,†áÛÿlXP\ â‹nd#üJ«³*6¥.ýÓ¥KW­Z58·ÄÜ?¿¸‹¤‹§ÔeVü/$´iÚt‚ùØé~¼©(_¾¼ðÉ’% ¦CˆKãä»ì_¾|3Æ+V`Äâ7Ï~Íw PívšôãWkùÈ)qâUùf½+¥‰§ZxÆMäT* ûJ"WêrV–±QÑg2Uüø»‚UwîÂf´K ë T¯ö ë4†ß¯ÿcd»­ Pñsd@ÌÀ-BÑ›ÅÍ]wÝÕµkרòê1+þ_lW±ÁJ}uÖøñཱýŠ—i`>µÓýˆ2ùÌ3Ï%Dð„K’D?\w”Ï?þï,,íc“®¯¿¨d‡ó°œ?¾…ºÕ¥Œ%»)„RüXÑ×çêwŠ›æ02αêõW †ß;̰ôY´âÇ_Ï`­²k#î[‚BKqò]¡ë°‹Z½<¡KOÌÿ 7*þpey$Fˆ£gͺÿÙgŸ=z4tLøñ›ÿÖ­{Ú´óÂK½_k¸ñí.—p‰âïß–Dè‡â´}PÏÝ=+ I)RöÝÁƒç;vB¾2§ž={f̘Q(5kÖìüùóq¯ûu—}¸9áP-ˆ§xRüÔ²l— Ôí<¿õ+°H †Ý±rSŒe3€œ‹ÿbÚn ¡J“*`ƒz kÕv~)ª-[Nñ,JP¥I,K;3ÄøÐ6°Ú±ü çÞ*ç6ÂTÙ,„A[_ªW]l·ƒYM'†?þGÄj½K€Šß»}CËH Xˆ®X¿~}K߆—^z AÖ½¿s׬ø±ãiݺm8‡«hé!¯4ØUá½kÅßyog\Í7«²÷íb}ÞÆ®ßI“–Ù‰~l2®]»¶PBÏaÆūè×]ö¡1ë[·n]ü)þ`&ÌÇÔ^a†áã^fÓB#@Å7>EÞ%·õ„„³î‡sÆ ªÒ˱zì¿èþ¥K7Ö¬9°h™‹–5~¹‰5þ–[â‚â¯v¢ñÊ{´PκÕFŒX ,¥œ9s®\¹Ñ*ã&é.ûˆ¼ 7ìäF×Sñ{÷wKËÂA 5^L᨟e€w Pñ{·oh ¤†NPÂ.U³î¿ï¾ûúôéãÙèœÎŠ_´ûìÙ«““?P‚Š¿ÖñZrÝTüWò>=TÌ";§©˜h$ âXKiOàçŸîÔ©“eÏ}zœQåMůó;øòË]­[\àÍú–-t©.¥øñà’%ŸW{µÝöAƒfÔk[¹ø»:ŒÛ±cŸ]p…Ê•+—P‚—?ÖÈ×ÒãI×ú`‚ ‹ØÈË©ø=ôó£)# ‚óà7 '~úóDŒ4 ŽyTü1ß…l ¸'0mÚ4D§1ë~xü<2QÒ¶ ÂiÇŸ »?‘°x, ñì‘öÜHˆ~ƒ´ïÏ„sÁü™ A‘à<ƒtøÏtäFB°H¤c&,ðëkü.¿d[³æ+Ó›§nõçÖyêÚSâÕ#ŠÿíWÚîîÙs»vG4ø¸L­W 4ÁW‡µ+È!zO,™{Vô«®Ç ¼¾@¡»¨øÝÿ"˜3@ôËi ‡-ÄA3ÙH%*þTäã$c®^½Ú¶m[KçþB… Á›Å;Š_&A¥Å‹7Àk?G‹äìïUìÛwžÅwJµ¸˧%?¼ýO'¼84O…йëlß¾×®pHç Üzë­˜ᔃxMô+—}|¸páf\˜€QñÇØ¯‘æ’ @´PñG‹4ë!/€ÒMJJ²tî¯R¥ B¶§áPß2óÌ™«*Wî5lØ 'ûð&5Ú~ùå—¯¿þZ6UèÕã‹$I$@á @ÅŠ,ƒâŽ@¯^½,û³gÏ>yòäpÅãW+ÖÑü€õûF†æÏßbáÂu¨Š\¥ÆÉG?Ü~Ž<ñ^8[…ý²M›6U<{öì.ůF“¸ìËQ–‰~üq÷ËcƒH€H "¨ø#‚•…’@8{ö,V¯-ûáüƒ8?©?+šBßPt¿ÜâŸP¾Î‰jÕä2+þjï ˜>}…©8Ìø¥—^R<±ç!5º_wÙ¿|ù2–óåü2»DÅ?46H€¢@€Š? Y Ä0ÄèLHH0ëþôéÓc³/¼ØC;s×죒VwZ¶õQ‰ëB_]²ÆÿÊ+Å$¼ xó­U«öYºtƒ‘xïñÔSO %L‡°ü¬î7¸ìáHZìüÑ9cø×EÓI€H Z¨ø£Ešõ@,˜7o^¦L™Ìºÿ€G;.Ò¾?4(’Ò©²>-N)i%ëê]¹ò‹J•z¶*TcÏ ¥¸—Yñ¹½cŸÕ‰¯ö;ЦMÛìJëÚµ«Á‹ô.u¿ˆ²òäIè>1,ÿ¶h; Dƒ4(³ˆ£:uºí¶Û̺?_¾|sæÌ‰QÅ/ò}âÄ¥XÔï–·ò±œÏ#’aؔ݃&îí>êpõ«‹ïÚ©Ó„/¿Üi©ûñÒ£zõê*‚çØ±c±xïÔÀÀi¾p£R ƒú@Å¿/6H€"J€Š?¢xY8 ĨÒäädKçþÊ•+oÞ¼RÕaßaª¾1b>tŸìI;žÈb¼z>s‹§êö:—øö²‚ ½,Xcgó§Ÿ~Z¬X1ÁsãÆ–¢_ ¼ À+yUZ‚o¶U |* €#&_}õÕ—_~‰ùâ‹/`À矾~ýúuëÖ­]»{0>ûì³U«V­X±bùòå°š°aÑ¢Eˆ=º`Á‚ùóçã­fq³gÏž5kÖŒ3¦OŸŽó¦L™2iÒ¤‰'N˜0aܸq˜ÏŒ3Ç´á°65$p?Þ=ÛC$@±O€Š?öû- ¨ÀvU„¢·tîÇy´±«ø¡à÷îÝ?xðìÒ¥;ꊿóˆ£r‰â¯ØáÛ„J‹z÷žæ|8¼ž„¦IgΜQº_õ¢ìã]ôzê“GÿàÁƒb(êC’’ 8 âçø ‘Vs-û}ôÑQ£FüøcÎxíÛmÛv-_¾Q¬Â?„¾º”âÿàƒ©øvêÔeíÚÙ²e‡eÆ´E‹âÜh§ˆà ç(Á(û8QKo–^XãïÓ§NÆ[‹G# ˆ*þ@e‘$àW¯^Å¢¾¥sÑ¢Eá(Ýï55¬=Püu»nÔûŒ\ÅÝÿjr‡’åÛôï?cÏž}–…ãæ•W^‘Å~<Å8ÖûÃ"ñ …xDñËÉepÃÆeßüØP ð4*~Ow#˜ €µê¤¤$³“N§ª[·î–-[\šôf¶áÃç%%u{õíyït:U³û\âÕ­ƒñßz]{ôÜÔçn-‹UxwüøÅv­èß¿?Á¿î7ð¶\J[?~¬ñ«³ŠO:…É11†i$ Ä7*þøî_¶Ž¢GûAsæÌiÖýwß}wçν©æ]ZµuëN({xö—~kñí.ÿ;=:öÜݳåÁ–oo©S¬E*Uz/^¼Î\26¼^}DNëKÉÞQüþ˜ Â)z£5‘ X âç¸ 'Âaݬû³eˆ/îcÌ{0't×®¡ûKTY5þ^½¦ÀHü÷Í^mÚíoÅ_ëx-œãUpC©¼Õkuì8ÎÐ4_ÿ¶È§4ŒÕ£¯ñËbÿ‰'¸—7œ¿1–E$@Á âžŸ p$ç~ÇkÁ³D‰ˆéA5ïÞ¤/¾Ø5ç~¥ø“ú4mp´.Qü….zæðõàžvŠr< )­¢sš?DÿéÓ§õC…ù" ˆ2*þ(gu$à뉉‰–Îý5‚ó‰{‘íÁœë×oÁ’¿¬ñ—éW¿Ú‰jr¹QüÐâÑIQˆÇ?`À€’%KÞrË-ª£-?DÿÅ‹ý2ôÙN ð*~ïõ -"8"€£²dÉbéÜ߯_¿ N–õff(þ„N×—öÕ¥Öø ?^¼z Ä£–"z×o¼¡k}éåAƒ©»†?üðC m6…H€b‰,õm%X$€ô½zõ²tîÏ‘#Ç´iÓ¼)å]ZµnÝæ ¬]·ØúW.$à ¨ø¼(j)rŠ¿M›6æ‰\æÌ™qįâÿæ›obqÓf ˆTüqЉl ÄDgG(zKç~Dö\»víÞXNsç®Bˆž|ï¾kw¡ßæ?~Cƒd¿H‘"PáÑLà7nÄ™ØA±nÝ: FT¥Ï>ûlÕªU+V¬X¾|ù§Ÿ~ŠW182Ÿ:uÊí8`>  p âE–A$¼óÎ;ÍBóÉ'Ÿ„€Ž-Ù¯?λõBryæ.Ž Æ+—[n¹ÅÜ eË– xÈ®åd¯q"3^X* €5*~Ž  O€sJJŠeÏÄÄÄ•+WôñÇ‹?¤¶GÒŠ+–/_Ž x£²dÉ’E‹-\¸pÁ‚óçÏŸ7oÞœ9sêÖ­k9ãÊ•+ÎLvi_å?v옧Ç# ¸#@Åw]Ê‘@<Ø¿?ô½¥WIýúõ7oÞì}Ù¯?f)IŠ¿wïÞˆ’dž1cÆ`½ö̓“'OÆã e›H€HÀ»¨ø½Û7´ŒHÀ@ ÏY²d±tîÿàƒ<.ú•â‡ÎöN2¯ñçhÑ¢v“«íÛ·‡¼´¯<}ú4Ç6 @4 PñG“6ë"H-Ÿþ¹W¯^–®&ˆ?qâDHRo¦Ñ£G‹WD¶§’òê™;wî›o¾™.]:³ÜGüM„õL½Ö—Î;—ÚqÀçI€H€‚!@Å -æ%ð³gÏ™ÇÒ¹ÿ7ހόE¿(~,°ÌcI›6mþ÷ÿ׌4kÖ¬ãÆ —Ö—r.^¼èqD+H€HÀ/¨øýÒÓl' ÄÈú ˜Ejúôé›4i‚02Û¼”F%Š ÛSiذaÙ³g7cÌ!C‘7ÝÌ ®]»£‘-" / â÷rïÐ6 À¦M›–)S&³`ÅYQýû÷÷ŽæWŠ êIS§N}å•W,_•T©R%,.û–€?þø#p¿2 @øPñ‡%K"H#pîïÔ©Óm·Ýf¯… B”É­HJñ#¦RõêÕÿõ¯™‰åÏŸ1:Ý,Õ‡–‡î¦Ñ¯„Õ’ øš¿¯»Ÿ'x"çþääd»ë5kÖ¤­ìWŠqZ§®]»fΜ٠7GŽšŽwÿXˆ§QǶ @L â‰n¢‘$@n lÚ´)gΜ–Îý-Z´HCѯ?ºJ«AŸ'OËÈ›M›6Ý·oŸ{áZNœ½õÛo¿¹íKæ# *þ0d1$@^"0bÄKç~„óúè#Ù¹ Ÿ™è§éÓ§#Š‘å ²eËb—sh >ا¾ýö[/ ÚB$@~!@Åï—žf;IÀoà=Ò¶m[Kçþ„„„O>ù$ʲ_)~TåÔ AËÈ›¹råš={v°ª=äüôà÷Ûoí%ð*~ïô-!?ãÇ'&&š×¶qζ®~öÙg_F+Á£FÖøD1õèÑã‘G17?cƌݺu Y»‡ðà‰'~ÿý÷ðw0K$ pA€Šß$f!ˆqˆ†™-[6³ð½ë®»ð :š_)þùQI86«hÑ¢–.û8¼,r‘7í&?üðCŒ"šO$@1L€Š?†;¦“ E`àÀwÞy§Y?ñÄcÇŽÝá„­²Æ?/ÂiæÌ™•+W¾å–[Ì--V¬ØòåËCX¡Oå#.\ª§˜™H€H ¼¨øÃË“¥‘ xšœûSRR,7°–*U ¯"'û•âŸÉÔ¼ysËYMÖ¬Y±êŸJáÚãß|óÍÿû_O G$@ñN€Š?Þ{˜í#0Ø¿?6ïZ:÷×®]{ýúõ›#”âlj`‘Hýúõ{æ™gÌÊ!C‡Bë©êäÉ“tßçOH€Òœšw Hp®¹õÖ –ÎýÝ»w»æWŠV¸ÓèÑ£ñ‚Âî豨EÞ4O°mšÑ÷Ófp³V ø;*~Ž ÿÈ—¯ÙƒµtƒÉ;÷¤I“¨û#¤ø«V­ú¯ýË,÷óçϨÿ©_¤¹¶õË/¿øwl±å$@$à%Tü^ê ÚB$]ùó·ÀuöìY„¯±\#íµ×/^ŒeòÔ§áÇ£ŠB… ÍSzï½÷xàËÈ›ˆ ²R׃?þøct;“µ‘ Ø âçà ð/QüÒþM›6(PÀ, Ó§Oß°aÃuëÖ¥Rô+ÅãoS™ #GËÈ›M›6Ý·o_¸T{hå`uÿÚµkþUl9 x¿÷ú„‘ D‹€®ø¥ÎiÓ¦eÊ”É,¦ï»ï>÷Ĭ ä4lØ0YãG!§1cƼüòË–¯#Ê–-›†.ûjnßýŸ~ú)ZÈzH€H€\ âw…‰™H€â’€Yñ£™?ÿüs§Nn»í6³°ÆK,χ&ú•âŸjªY³¦å–ƒ§Ÿ~zöìÙ¡­Ç‡÷)Dæ¡ï~\þRØ( X'@Åë=HûI€B'`©ø¥88÷'%%Y®¦ã|+œcµ1È4tèPYãŸ|Bx͇~ØÒe¿[·náUí!—†¸û ÄúXä“$@$ITü‘¤Ë²I€¼MÀAñ‹á«W¯Î™3§Yjß~ûíÍš5 Jó+Å?9˜„7yòä±tÙÇnãíÛ·‡,ÐÃû &HúÈ,û•â‡[Ž!5ê7ÞøŸÿù³ÜÏŸ?ÿÂ… S³ÞgOœ8ñí·ßri?üc‘%’ @$ PñG’.Ë&ð6Ô(~´ Îý)))–«ò%J”X°`Áz- û¬eäͦM›îÛ·/5=ŒÏBë_¹rå?þðï@aËI€H Æ PñÇxÒ| T‹â—úçÍ›—%KKçþ=z¬[· ö²Æ?zôh|.Y²¤å˲eËzÇe¡x¾ûî;jýT 1>J$@ž @Åï‰n $@iB ŒŠöc3k¯^½,ûsåÊÕºukQüo½õ–eäͧŸ~zêÔ©a\›¹(8ë_ºt‰a7ÓdL²R ˆ*þHPe™$@±A ¼Š_ÚŒÓg“““-×ïqó_ÿú—¥Ë>‚r†,ÐÃõàÉ“'/\¸ðý÷ßÇFçÑJ  רø]£bF ¸# Å/6mÚT @;ݯ߯_¿>v„Kµ[üv.^¼•ÿûï¿Ç]÷²A$@$@7 Pñs( ø—@ä¿06mZ¦L™ìt?ë]¾|y°=äü÷gΜ»¶áþðÃ?ýôôý;ôÙr Ÿ â÷Y‡³¹$@H+~TçþN:ÝvÛmºîÇ^8Æ‹]A$@$@Ñ!@Åά…HÀ‹¢ ø¥Ùp)ÎýXòÇî^/² M$@$@ñK€Š?~û–-#D jŠ?!üžH€H€"H€Š?‚pY4 €Ç Pñ{¼ƒh @XPñ‡# !ˆITü1Ùm4šH€H HTüAcv 8"@ÅGɦ Ø âçà ð/*~ÿö=[N$@~"@Åï§Þf[I€þN€ŠŸ#‚H€HÀ¨øýÐËl# €5*~Ž   ? â÷C/³$@Tü$@$@þ%@Åïß¾gËI€¸ÆÏ1@$@$àTü~èe¶‘H€kü$@$@þ%@Åïß¾gËI€¸ÆÏ1@$@$àTü~èe¶‘H€kü$@$@þ%@Åïß¾gËI€¸ÆÏ1@$@$àTü~èe¶‘H€kü$@$@þ%@Åïß¾gËI€¸ÆÏ1@$@$àTü~èe¶‘H€kü$@$@þ%@Åïß¾gËI€¸ÆÏ1@$@$àTü~èe¶‘H€kü$@$@þ%@Åïß¾gËI€¸ÆÏ1@$@$àTü~èe¶‘H€kü$@$@þ%@Åïß¾gËI€¸ÆÏ1@$@$àTü~èe¶‘H€kü$@$@þ%@Åïß¾gËI€¸ÆÏ1@$@$àTü~èe¶‘H€kü$@$@þ%@Åïß¾gËI€¸ÆÏ1@$@$àTü~èe¶‘H€kü$@$@þ%@Åïß¾gËI€¸ÆÏ1@$@$àTü~èe¶‘H€kü$@$@þ%@Åïß¾gËI€¸ÆÏ1@$@$àTü~èe¶‘H€kü$@$@þ%@Åïß¾gËI€¸ÆÏ1@$@$àTü~èe¶‘H€kü$@$@þ%@Åïß¾gËI€¸ÆÏ1@$@$àTü~èe¶‘H€kü$@$@þ%@Åïß¾gËI€¸ÆÏ1@$@$àTü~èe¶‘H€kü$@$@þ%@Åïß¾gËI€¸ÆÏ1@$@$àTü~èe¶‘H€kü$@$@þ%@Åïß¾gËI€¸ÆÏ1@$@$àTü~èe¶‘H€kü$@$@þ%@Åïß¾gËI€¸ÆÏ1@$@$àTü~èe¶‘H€kü$@$@þ%@Åïß¾gËI€¸ÆÏ1@$@$àTü~èe¶‘H€kü$@$@þ%@Åïß¾gËI€¸ÆÏ1@$@$àTü~èe¶‘H€kü$@$@þ%@Åïß¾gËI€¸ÆÏ1@$@$àTü~èe¶‘H€kü$@$@þ%@Åïß¾gËI€¸ÆÏ1@$@$àTü~èe¶‘H€kü$@$@þ%@Åïß¾gËI€¸ÆÏ1@$@$àA(þÕL$@$_žzª®øj[C$ÃŽ?îõÉ6FŸ@ÅÿóÏ?wêÔ)gΜÿ`"   ˆ0;ï¼3))iÓ¦MÑ…¬1Ž 8)þ¥K—fÊ”)›œ  T¯^ýêÕ«q¬AÙ´h°UüXÚçH€H€H€H ­dÉ’…~>Ñ”Åq\—µâ7nœåà¾û‘gî}<7/    ðøî2«/ˆ~®ôDZZÓ,ÿ¼yó .ã#Ï&6V}ä&^$@$@$@$@"P¹Ï¢¡‹þ”””¸”¡lTÔ?†”>Âò•¯Ýpìf^$@$@$@$@‘ PwÄú’>ãApás¡k«\’þîû”$»í¶Û¶oß5uÈŠâÀß?“.÷ŸÈ_ªéø/y‘ D‚@½!kŠ•|_´~ƒÃåîà~õ~Ÿèî= ñ'CÙ¢¨ø›âGüW¥øÿyKºúC—µ˜ô/    H(õZoHüJ•zŸ9sâïÒ¥kÕªõ¿¾Ò_¾×»ã·­ÔX_Šeþ¨éãø«è/Å~¼3R«Dµm§låE$@$@$@$ ÕÚN¿.îKv¹/ ¢¿L™Î¸_µÕ”–ã7Ý‘ñ~¥Í’““ãO‰²EÑ!ð—âoÛ¶í_îbÿJßvÒ¦oãE$@$@$@$ví¦|UìÅöPö‹m1h¾åË·_÷íy±=ò¼\«îÍõÙèDÖgn*~D}ÒCô|¥j—Y;x‘ D‚@Þ !ëáÃc©,Å·§Nç9§nþç-·*Ñß«W¯8S¢lNtÜTü†üMúÍì9g/ rµÛey*WPWÞ¯¹ÄØ|ÈB)µ¸|„ÙH  Ôî:ãÜýO#ÛH›I Äñy°œo)ød™yPNá²o)ÅØüш¬%ÎÜTüõë×Wƒé¡'³÷™¿› €™@â[Mƒ=k=ËS¹ÍåÔë>öù’¯î7í?C G-~†ÿBRu ð3϶=©n»° Nü(0Î-žm; #ðè:y }Ñ¢m®]ûÉRYþúëoøy³qï)úÿzèØgZ<:͹©øq†³L¥ßl8pá^$@f¯Tk¬âôé܆r ¼ô 1ßo>p¦ŽZü ¿QÏqï€ÂŸ<ÛêfmÁˆ Ëà”ñoùðlói „@Óó$§ƒÚëÐaò4ê<µÿ¿¥Wÿ÷7n\t4"k‰'×ÿñãÇuÓvÈÜ¡‹÷ñ"0xõíù±d}&wëA³Ü\ïZb(GD-J0ÜGiR8jñ'|…(üIÀ³­×à,Xêuõ¿óOÀ³Í§a$v•kƒšŸ6m­ƒ¦ÄŽ^äyãÁ¨={Áê·S½zõxR¢lKt\WüTÃè®{ùé~^$@–ÊW¿©ø{&OȈîyàºâ7—ÐnÈlù%¢– é^ ˆé†ÄŸñ©œ]Æ,Ř×W—Ró#Š?Âl‘ß”z¥ÔüÁƒ§ÔBv"O‰Ò§b½÷ÔÏ¡V¢£YK<¸®øSRnŠ ¦Â¥*ŒY~€ €%×j¼+s6OȈøÍ%¼?lŽŽZB.<¦Tx"¦Ƨrp¢geØËÈ·û Ä7¶ˆ, _°Sœøá¬ï¬)%0?òw1OŸ0_½z5žÄ(Û×bb¢FÞn—7XD=>š—)s\êç&ÿÌW´”… òj>{#îë™qÿ¬Þ¬“]½x$¡LEÃ#bj‡“-ŸPئ&ùU|.[¹¶ÙÜtà€’ÍöX¶B«2Ëg\0Ì%g˶£Ü#15vÉNs]ªQ†>•ª….|nÑc$zD_«Ã}…±ÿ¤å†o‘3ŒMPƒdŒé–XŽ1e¼äT]ƒû.»FºíBÛÕ¸ íGä²Ff#èüáÒëAxºN¨J{÷žœû-B‹~ì)õƒåæÝ€è˜ÁBñëñ{Œ˜=kÝ^$@–Þ¬ÓB~/Ù²ç QïÑó êÊP”Êðâ+ïûSãƒú,ùaƒ¹j<«g“§ô;M:ô7?%Ê%×FstÛTëÌÌö<_¬”% ½L³=h£þ”Áe Ú决z\U¤·Ý²³B#6jÞFΪã 5ʰÁƒµÞí,M3A/è&8p “š ÆƃË1¦Æ¼aôZŽC»‘`~Ru?"7ƒyHÀû:X?pà‚€ªtôèeÈÙªËL4ªp‰²êgضmÛ€Ï2 èþaÔ3eÙöùŸåE$`Ià­z7ÿSÙ󆀨ÿظîðºÜA òÏáÓWJQø¬‹ª/”ê>tª|…<ø§|‹ÇÇ}²I¯ÿ”2‘J–­¤ D¬¾j×û#ƒÍò•úoR•:ÈÃÞ}¿¿äÔ3è÷Q*RÖ*;UùÈ,ßâƒþ-JV_¡:•¢ù¸#O!›ÀqY=“t2¨WÇb–íB¥ÊÕj½:5lä[üSìÄF˜*֪ķúƒz·Ê³!tºcò¬>Æ€Kµß*û§¯Ü§Ð#bsQ™º®³Í_œ¼Hþš[>…rT˜¡ŠmÚ¦›œo¾5 lÝù/Ř+Ÿeø›âŸ6mšš2Bñ¯ß~Š €º[Ëï%{®|O]ðš:¹(‘;(ÁðJ“ÂË&%[ 2À •¡Ø‹7£ëâ¦=ƒGÏPjU/Ùòfô¶¼Ûöæ †9ðÁ#2Ù˜¿â+U£Â‹ÝBõ”ˆ’aƒ%y)34b >·³Må1t®²†™ŸUßêݪ²…·ÓCc0ÆÒ ÷}dÈi÷¹@>H±E JµÐñPó%©ÂõÚ øK®[–,Y>Ë $ð7ÅOjÝwæÏw|Í‹HÀŽ@=Mñ‡LéÁ?¿¡„±S—ȵXn™A¤³Ë„ªõ’í,QyBÈ ¹4 RÕ©gõ›n8—­l®ÆãþÐgJ˜²Í®w¤KbÎír.9¼ÚC»>覛ܫ Jcfˆ9•Þì5P’Šâ¹L´ͨøc;ÿ0¬ñ¯Ùv’ €ÚzõÀe%dJÊ¥ÁP¨)7½zP‹eá–`‰Km-KàzÉv–¨C'PñSЇLàúÎÝ{ï˼â˼H€ìÔlxÓ[0C¦¤¶-JþçÎ]ÔbY¸eµ´m×ÈðÒK¶³Då !ƒBTñ­ºAÝõ¬á~P¨Ááåò•Õîaù$þ9cé)'4b(VŠB»ììA–Ĝۥ¾µì÷ðvzhc í ø`P}p\U3“@̨Óp¤K?~Ù¹›üÖ´±U§¿üøéÕ²ðõíƒSüÿJŸaéæã¼H€ì¼ÓàftN„_ ™ÒFç4”0xÂÍ蜨ŲpË …þŒÓªóÀ`M²³D•B††­n©,]®r°ö(¼hi°Ïšó<ë³×«Þ ð¥ŽÏ’'4b ¾C×Ûåqn—úÖ²ßÃÛé¡1@ ø`Pýp\U3“@̨ç:VÏÆû¡ø‘mlÞ±¯Zãg¬ß ÷þí۷믿?ÙxŒ €jõn*þ§sä ™’#7—0`ìMÅZ, ·Ì LzéÕJv&Í\µÙð8.=%*O”‘xÖìé1tªÁÕÃ}‡rÐ4d®×¢ J³Ì†¯äOœ21ÚßΞ ž fè\çv©o-û=¼ÚC{>ÔÏ!ภª4f&˜#ÐªÓ èxœ®P½I<þ†ÍÇ¡oÖjFÅ3ØúñÎܸtÛœõGx‘ X¨R÷¯3wCFt_æëŠç›Jèóñ|ùkŽZ, ·Ì0dê y Å~<£³Ùù‹•Ò3ØY¢ò„–AžBjÛë#K{ºž¢lÖ3(¼h©K¼Í:Þ< ¶DÙŠÎÐð‰¡ ‡š²|—j¸¡sÛ¥¾µì÷ðvzhc `>貿$[ÀqTiÌL1G u—™.ÏÜ0ar6ï8m¬ðV}¥ø“’’(mI (ÿ@n}¿ûðY3ÖæE$`I ¹vsù½d{.oȈDî࿆zš'…£ËÂí2<_´”ƒUxJ)ÑNNÖK–ûm -ƒ¢„ÇQ»¹-¨Ñ²¥êA;–XO˺^|å¦L¯Ù¬“z<4b#çlT$·ï§3aéNÕ(3RÕ.K [ÞNyŒ©S3ò±€ã*ä$˜ ð~ÿEÐñ½{ϨØF^†œmºÏA»òyI ¶¶mÛ|–HàoÑ9ñœã ÆPw»Lþì/ K•jÝTü™2gyò¹<.¯~—ë¥áYùÅå-ò |§i'ù¶Ûȹr7-k·Ë0tÖçªL˜Ôཾò8î£(õUB™Š†bå+ ”Þ zujØ Í QßZö{x;=ä1˜ê  SÛ˜ò_‰€ã*ä’ù Ä#VBÇwí:= $Eälßw!ÚuÿCªŸ!-|–HÀ¨øñnH¡W’ëŽ[q €%×k¾«~,î?t>W/­ØËoèÏÞûÀÃò-²É}ÔbY»C|…rT±ø,—º“§ðKæ2%ÃãÏæ±ëîÔd@±öàÛ^ã–ê8cƒn³ ÃÎu¡LCíˆáA»1šv!M6ÐV˜ÍÐ ´ì÷ðvzjƘÙyØüëp\,H ¦ ô¸:¾Zµþ%iƒ×Oçí2l%Ú«ÿ›0>Ë $`Tü)))jå*Tbô²ý¼H€, T¨žrÏ{u:ÛPZ‘Ä×QˆüîðA¾E6)µXÖîœaèü­z±êG«4êhY T—«pI»îNeÁe˜áNé7jÚÕØ¸ó0ý‡œ†ìê“~ÓÖYV1)§eß ‚Z®ÇžÍ#]†úÿ·÷`R[Ü÷÷¼ï½÷”¤D#AAQI‚ ‚\ADTT JÎá’£ä äœ—œ6°„]vÙÌæÈÂF`YrFßï¿,ëöôôöÌôÌÎìœzJŸ¡·ººú_~uúÔ):YEŠËÆôJÀ^⯪ýnl§ÛrM^yg*z¿­~Jx]Y]3ïÈ ¸„KD7n2¬iÓá÷î=ЦR”ñ/Ú9iÅãEÙé!sçÎÆYVÀ"òýøåewŸ(öäüÝῌåÌ °öV`Ä‚mȆu˜¾æ“oàÇøå ¯ßÒ Ñ´íA«tž/íbEãiÇ/úŒùnÈ ÇÂé¥J/cœ¬¥*ÙXÞ¨S(°Ó6³Óu[ࡹ+P”øOû).•‰2->ÿü§ÂzR¯^=‹P ³ù³vñŸ"\OßikæïáÌ °¬+ +ðy¯1ß ž>dž‡9Yšwüž^É(ÆÒ±¬+ ¡À×}–ƒæŠGF¾e>ë¶õ¼Zÿ]AüpÍ`„e,U Ÿø‘0^WR«.}fï‰æÌ °¬+ +ðâkoâ9Y¶âóãÖUUÒ.Àz²¬+@ úõhnúÜFNü}'íš±-ôÅžœ¶k×.Ki˳‰ܸÇ!2p=U|±æô]g8³¬+À È 4ëð½qßþ°£©2ØH­Õ°ëÆ °¬€¶S·‡7j< @Ÿ›{]F¯_¿ '~”™¸9¤ûØÇQè!såÊæWVÀR¿båÝ>³<&mäÌ °¬+ ¶Ü§L…ªôÆÅw?ùöî}‘ë·øTÞŽb,+À °*ðñç¿j¬¼K.=í¾œƒz^}§¹0ð7lØÐRÔãò¬Àc?~SÇžºï2vk8gV€`XYÓ6U­ù†xõ*~àO?ÏÛÍŠ±¬+ GžSö‚é?þx¼jÄlÇ_QfÐRíŸY%ã~—.]Ü–VùÄmWàˆÕÉa:q½òNËž+‚8³¬+À °¬+À ØIv?­húáX?þßöÇ¥?-=õù¸õÅ$d³³³mÇ>®ÁmP?f„¼ð ò˜ò¥·[~=׫ûÒSœYV€`XV€`ì­@«~s‹ý«¸ c¢ÇmIݨW?ê…—ØÓO?-_gÿ,Y¦I·ÑmG­íö{gV€`XV€`XÃè2ûH«‹^xëCEäßÖ­[…}\Û* BüÐâСC²C¿¹àÓ¼`XV€`XVÀ~ ÷9"§Ûbº'®Nü ýö»u¹fV€`XV€`ô(À¸o òºyUf‰ºÄÅÅáRÓsErV€`XV€`X£€5ûî»9£{úZÄOGÚµkBÕ¬YÓ¨‹˜ëaXV€`XV€0U>Õï¿ÿ>'rdcy—k+˜øY#ý de]Fh­¦èß…K²¬+À °ECýûOã%8qâ–¢q:|¬@QR€‰ßÈÞdâ7RM®‹`XVÀ¥`âw©îâÆº—LüFö7¿‘jr]¬+À °.¥¿Ku7Ö½`â7²¿™øT“ëbXV€p)˜ø]ª»¸±î¥¿‘ýÍÄo¤š\+À °¬€K)ÀÄïRÝÅu/˜øìo&~#ÕäºXV€`\J&~—ê.n¬{)ÀÄod3ñ©&×Å °¬+àR 0ñ»TwqcÝK&~#û›‰ßH5¹.V€`X—R€‰ß¥º‹ë^ 0ñÙßLüFªÉu±¬+À ¸”Lü.Õ]ÜX÷R€‰ßÈþfâ7RM®‹`XVÀ¥`âw©îâÆº—LüFö7¿‘jr]¬+À °.¥¿Ku7Ö½`â7²¿™øT“ëbXV€p)˜ø]ª»¸±î¥¿‘ýÍÄo¤š\+À °¬€K)ÀÄïRÝÅu/˜øìo&~#ÕäºXV€`\J&~—ê.n¬{)ÀÄod3ñ©&×Å °¬+àR 0ñ»TwqcÝK&~#û›‰ßH5¹.V€`X—R€‰ß¥º‹ë^ 0ñÙßLüFªÉu±¬+À ¸”Lü.Õ]ÜX÷R€‰ßÈþfâ7RM®‹`XVÀ¥`âw©îâÆº—LüFö7¿‘jr]¬+À °.¥¿Ku7Ö½`â7²¿™øT“ëbXV€p)˜ø]ª»¸±î¥¿‘ýÍÄo¤š\+À °¬€K)ÀÄïRÝÅu/˜øìo&~#ÕäºXV€`\J&~—ê.n¬{)ÀÄod3ñ©&×Å °¬+àR 0ñ»TwqcÝK&~#û›‰ßH5¹.V€`X—R€‰ß¥º‹ë^ 0ñÙßLüFªÉu±¬+À ¸”Lü.Õ]ÜX÷R€‰ßÈþfâ7RM®‹`XVÀ¥`âw©îâÆº—LüFö7¿‘jr]¬+À °.¥¿Ku7Ö½`â7²¿™øT“ëbXV€p)˜ø]ª»¸±î¥¿‘ýÍÄo¤š\+À °¬€K)ÀÄïRÝÅu/˜øìo&~#ÕäºXV€`\J&~—ê.n¬{)ÀÄod3ñ©&×Å °¬+àR 0ñ»TwqcÝK&~#û›‰ßH5¹.V€`X—R€‰ß¥º‹ë^ 0ñÙßLüFªÉu±¬+À ¸”Lü.Õ]ÜX÷R€‰ßÈþfâ7RM®‹`XVÀ¥`âw©îâÆº—LüFö7¿‘jr]¬+À °.¥¿Ku7Ö½`â7²¿™øT“ëbXV€p)˜ø]ª»¸±î¥¿‘ýÍÄo¤š\+À °¬€K)ÀÄïRÝÅu/˜øìo&~#ÕäºXV€`\J&~—ê.n¬{)ÀÄod3ñ©&×Å °¬+àR 0ñ»TwqcÝK&~#û›‰ßH5¹.V€`X—R€‰ß¥º‹ë^ 0ñÙßLüFªÉu±¬+À ¸”Lü.Õ]ÜX÷R€‰ßÈþfâ7RM®‹`XVÀ¥`âw©îâÆº—LüFö7¿‘jr]¬+À °.¥¿Ku7Ö½`â7²¿™øT“ëbXV€p)˜ø]ª»¸±î¥¿‘ýÍÄo¤š\+À °¬€K)ÀÄïRÝÅu/˜øìo&~#ÕäºXV€`\J&~—ê.n¬{)ÀÄod3ñ©&×Å °¬+àR 0ñ»TwqcÝK&~#û›‰ßH5¹.V€`X—R€‰ß¥º‹ë^ 0ñÙßLüFªÉu±¬+À ¸”Lü.Õ]ÜX÷R€‰ßÈþfâ7RM®‹`XVÀ¥`âw©îâÆº—LüFö7¿‘jr]¬+À °.¥¿Ku7Ö½`â7²¿™øT“ëbXV€p)˜ø]ª»¸±î¥¿‘ýÍÄo¤š\+À °¬€K)ÀÄïRÝÅu/˜øìo&~#ÕäºXV€`\J&~—ê.n¬{)ÀÄod3ñ©&×Å °¬+àR 0ñ»TwqcÝK&~#ûÛRâ?tèÐûï¿ÿôÓO÷ÝwgÏž5²)\+À °¬+àX˜ø«7°@&~ Ä*°¨~âëÿÿ› ]àQ¸+À °¬+à„ 0ñ;a§p“XR€‰ßÈ+AñÖߥKë‹ÂÞ?nܸ+W®Ù,®‹`XV€°¿LüöטÀ X©¿•©î¦MüàxXñŸzê)s¸/¶?÷Üssçνs玑ãºXV€`X{*ÀÄoOu¹nVÀ&˜øm’O±³9â»O›6 ö{SÖ/W¶ô×_vxòÉb¦zá…V¯^mdû¸.V€`XVÀn 0ñÛMZ®˜°U&~[”÷W%~P;lö¦@_²dñƒ{%GMOôóßÛ©ãǪ¶ÿzõêa‚¯‘­äºXV€`X;(ÀÄoQ¹JVÀ˜øÑ‘jQ?H¼nÊñ°èÿøÝ1!GÒä|ÔsóG6Så~Ló=uꔑmåºXV€`X ˆ‹‹;j&!ò¿…rrqVÀq 0ñ©µ ~ÕP<„òíÛ~xÊoGFR€¹¼wÛòF ÞTåþ:àikd‹¹.V€`XV@‡pOmذ¡ö<´† ß«W¯Çĉ[tÔÇEXVÀ¡ 0ñ)7ˆ»Ê•_W}&‚ãï[—‘|JO^±xF­W«©ÖÓ«W/âid·q]¬+À °)€Ùh†@ÿóþÑ´i{Ž8WœüwVÀÑ 0ñ¦8p=zôÂÃÎô™XëÕêVÍËH´4Ï™ñß*•+˜Vˆ€?#FŒàGªaDZ¬+À h*P _~UaöÚâÅ‹YQV€p˜ø è P<åË•™ûë3S‚¬Î©±'ƈzL¹Á`tá žt!WÁ °¬+`^|XÖcàW”ÁL6øü³®¬+à 0ñÛÚ æCñ”9ôçÔØ“™)§mÏqá>ƒúõP âɦ[»÷gXV€ÐTo:AóeʔٴiS:uhKãÆ¦"11qøðáO>ù¤éÀ3ÐØ•¯/V Ð`â·¾ 4Bñôèþe|„OVêicsDÐ!Ô¬jh©Y³æ®]»¬?Þ“`XV€0£¨]¼zÚµk†Ì ÚÞ­[7lDúä“OT=Q±œ<‘æë‹(D˜ø­_+O»VAÇ÷f¥Û/£þöíZ©r?ü,ùª5=Êû°¬+À ˜Q¤.¯?{öl"~¤   ž={’i¿T©R#GŽLJJÚ½{÷›oªDœÃéÍ›7³Ì¬+P( 0ñ[&ûÙ³g»té¢JÛÖ÷>°)ûlˆc2Ž…#ª¶¤uëÖ“Xvb\š`XV€PS†$ñ®)V¬‡Äw ’··7Þ;T¦jÕª+V¬HOOÿí·ßÊ•+gú’‚eŠ——á p¼Lüz5G`œÈvñ «õZMkfŸ u|Þ±yŽ®Êýß}÷Æ'zO˱¬+À °j àÝ'Þ2ðÚ'ï²ññG##cÛ¶mµjÕ2µLa8Áa'ŠÆ¥Âgáä 0ñ›í P‡<.œt•êÓ¥S{ÕI½X_0øêgXV€`4€;¨üYºt© þ7n`GxõÈ:uêäëë+? ?&&‹s•(‘ÿñÑ/úöí_ >øÀô ç~þÍ×$+`˜ø«ªЧv­›×ýî* ¯h'F)ÿù¨¹*÷óWT{ÜQ\'+À °EFy©] ;pŸˆ><9).pè >ª!ÒeÏܽ4ùè¬+À °…¨€ˆª ì¯ â§šû÷ïÇvòÃã³5²÷Éȯ¾}쮃µx±h—Lü€~ŒöìÙÓ A‚{L>xðàùóçG]ªT)S{?Ï=+ÄK‚íÒ ¸ ñk†â©¹uòK™±î™cÂ÷ͪޓxÜóRˆ.}{sãYV€°NÈä÷VÌÄOS:}ùmDBNyס“Mš>v×sÿÖ­[ÉÆOÄ”””ôûï¿W®\™Ú¥Kšõûí·ßš¾žØÕº>å½Ü\¢OüZ¡xÊ—]8wÊ¥¬XÎaA^·~¼8¢âñŠ žü!ÕÍ|ú¬+àn À½S¼ *T¨Ü'âG¬}Hqÿþý5j ÀÜßWG&æèÌ¿¯ØôâKcq¶iÓ.=2ñú1Á·_¿~ôå~ûOOOÇü&Mš˜r?¾E/^¼ØÝú…Ï—°Z"Nü¡xþ;jPæÙˆÜ¬8ÎB?¯]M¿£jïLJTžÔkõmÆ;²¬+àZ ÈKíÂÕ^?ümp"˜†KÞù§£ÎG&^°(5©DÉ|wìŽÛO6~¤äG ëò"(½‰ªV­ºvíÚK—.-[¶ Žþ¦¯§† bé_×Ò–[Ë ŠE–ø5BñôêñmJÂéÜìxΪ ìÙ±®v­WM¬\(×(”`XVÀ‘ àÛ8A«(RįЧEóf~Þ{.ç$rÖ¯À[Wì'?X­¾ÎxGV€`XWQ@^j·U«V§OŸ&âŽãÄR»‡ýB£“/Ú˜—¬ÚòâËÕèEÓ²eK???™øñZÇßÞ½{ çþÉ“'cý/OOODõ1å~8÷oÞ¼ÙUtæv²ŽT ˆ¿F(ž:µ_Ý»s½~Ìå’PàÖõ‹×ó2³ÓÂçOú‰ß‘7$‹`XBWÜ,žücÇŽÄOKí±­ùZ혔‹FåácþvîÇðø˜@6~?RZZ¾3|ôÑGÔªêÕ«{xx\¾|k÷šsîG ….#7€p*\žø5BñÀ)eÅÒ¹y’8ëWàæÕì?ÿx˜w!åÔÁ¹‡7 ™9ª¿SݱÜV€`ìª&ÂÊ}LŠÄ=8tçÎQ G¯þ±©— ÌAÉݺ÷Îý“&M’‰ÐEyÖ³V­ZT¦E‹˜ã‹2 PuîÇÈûíz©p宥€k¿ÙP<¥JN™4:û|LÞ…dÎ:¸vùüï߸’~lµ×æáG6eâw­›™[Ë °¬€í À^íÚµûDüp Gå·nݪX±" ¬Ý¼;îì%Ãó>¦¼öÚkpÑ!??‚M:U8÷÷Q ""á>M|°Šü´iÓØ¹ßö«‚k( ¸*ñk„âЯ×Ù¤ð¼‹)œu*p5÷܃ûwîܼ{z‡ÏÖQÞ[F2ñ{›O`X+À$ZÎ?þø£ þÌÌLÔvüøqüá5ãÏæÚ/¯Û¼çÕ×jS30‘.=2ñú¹m£Ï>û,–òÍËËÛ»wo:uL¹ÿ…^àÕ$­¸x—"¦€ë¿F(ž®]>Oˆºr1•³N®æ¦=¸w3tS¢¼üvNôñÃÄ_Äîp>V€`ô+ Xjwýúõ‚øaÝG=ƒ Rúù—ñi¹ vÎã§Ì*[.??œv0y‘ûÉÆ„•¹0ÍW¬Öß·o&õÍ™3GÕ¹%ãââôKÁ%Y"¦€+?žDXÊtøžïÏ×ü½ãG÷_¹”ÊY¿÷î^¿sëêùÿ“{gÝ>ÎwÛX&þ"v{óé°¬+`‘ð•/Y,µDÄ/–Ú­_¿> Ì^°ÄŸxî²½sHTjÏ>ÝôáÉ3eÊ™ø¡ a=_yåï¥|###ñA#UZ€¯&iÑ%Á…‹Œ®Aü˜|ƒ»Tõî­Sûµý»7_½t–³~îÜÊ»y5'ç\dà¡yÇvNòÛ1‰¿ÈÜÒ|"¬+À X­€lVëØ±£ ~04êDÜL²¸ŸŽr`|±‰PIDATL!âO:ïˆìÞò£ÇÎý˜¹‹ù»dã'⇻Ò„ J–,‰æaí°æää` òᇪ:÷cÍ/«%âYUÀÙ‰n0‹“oLoÚªU+¯\¾~)œõ+pëÆ¥?ÿü#ïBj˜ßªã»§ß5™‰ßEo]n6+À °Æ* XjwÞ¼y‚ø¯^½Šc͘1ïâw6‰ƒÿ_ÄŸ|>Ï1yãÖ½¯Özì¦Hˆ)$VV"÷wëÖM8÷¯\¹ÍÞ¾};¢yš"DÍš51!ÐX¹6VÀ™pjâÇÊÞrT`qÇ–*UrÚä±9™‰˜rÊY§0êÿñÇÛ×.Dlω=Ó˜øùÎä¶±¬+à`@Àâ=[¬X±'Nñ‡„„ÐR»à°1JâOÏKvTž8uv¹GÎýH˜¼‹Bdãñ#Á#ÀÛÛ»qãÆTàwÞÁ?¯]»†ˆ=¥J•2åþÖ­[³s¿ƒ/3>\a)à¤Äiõ›ÞœO=ùäÀ}ΧF#”$g àæCÌϽ™—~ `ÿ,ÿ}3™ø ë~ã㲬+à´ €½xí6lظOÄŸ””„6Ã^^¢D Øï  þ”ô¼”Œ+Ëá±i½~~ìÜOžñãÇËÄè‡K&$T©R…NçóÏ?Ç)À è‡þgMIq²#FŒ`ç~§½,¹aF)àtÄïtb꽂ø¿ú²Sb\¨NÌåbù \É@ØÍ»·¯¥Å :¼0àÀ&~£î®‡`X"¦¢XŠ×î°aÃñ_ºt gºeËüµRå*XuË”øS3®¤f:4ŒlÕúq ~ÌÜ…÷Ùø‰ø‘0ÇwôèÑdÚ‡sÿÈ‘#/^¼ˆ@ŸM›65µ'¡nE¬CùtXY'"~P<¶xÿä1Ïëyéœõ+pÿîÍ»·¯g¥††x/ ôœêÐ<&~¾ùYV€`T@äk™ƒñ¥]?-µKònß÷4Güg3¯8>o޾ﵿœûᢃ@=‚ø/)V€`ŒR@^jS]‰øÅR»ô`ͦÝÄŸ–uµPò”ésÊ•ÍC¡Áƒ#l?lüDü°ë#aŠÂ[o½Eˆß¬Y3|¸@xUçþöíÛÃi”°\+à$ 2ñk†â©²jÅï×ó29ëWkiÁkÿÚåôØ íÁÞK‚½~gâw’;›Á °¬€3+ ûÓbF¬ ~Zjÿ+c©Ý°Ø mâ?—}µPrT¹z<ŽÁ¸àÇ/?øiùòåbq.œ#‚"‰µ{e“?¼€†Dqæ.ã¶±)P˜Ä¯ŠgúÔ —rÎ^9ëTàöÜ?óCñ\L ?ê»<Äg)¿EwfXVÀmÀ¼U™wW¬X!ˆŸ–Ú…< ´hùŸ˜”Kÿùœk…•ž nÔø]:Dì×>Ùø‰øsss1€Á| @þž8qâÍ›7}}}ÕÇÔÉçÙgŸÝ´i“Û^|âELB#~ÕµŠgЀ¾i 7®dsÖ©À­ë—þxxÿީѾá~«ÂŽ®dâ/bw)Ÿ+À °vU@^j·L™2À}"þˆˆ÷áÇ5OþuNâOϹVˆyÅêääƒÔ³gOêÄè¿|ù2"r~üñã%½jÔ¨±{÷n lÖ¬YÄ7å~„-BL»êÏ•³P ÐˆßtQ­¯»~‘’yój6gÝ \øãá=„âÉL Ž8¾6üØ&~Ü3|V€`Š˜bn+x·M›6‚øÉ ]!*&p[ä‰õLünußòɲ¬+`”ðV—mpptÄOKí¯ì×ëÕN¹hñg^¼^¸904ºõÚoî===ÐΚ5K8÷÷íÛXqN§NL¡#Ìofç~£.<®ÇÁ 8ñ/šÜkÁrÖ©Àý»·vórNr\ðî(ÿMgNndâwðmÇcXV È(€x”‚naË÷òò"⦥vÛµk‡½û µ‚ø³.Ý(ô¼qëÎWªU§süôÓOcbbÈÉG¤äääþýû ç~|¸}û¶ŸŸß믿nÊýˆY„Ð¥E¦÷ùDÜG§ þ™£¾ ;²òÖµ‹œµ¸wû¼öº'9Ò3úÔÖ¨€-Lüîs¯ò™²¬+`äiuo¾ù&|Ö‰øq¸ëׯóà»mŸ¯uÄŸ}é†3äQc&”|´"rŽ3®J î kÞ¼9!>ó>|æü ¨:÷#´¼€ìÑ\'+`'œ‚ø—ÎvdÝðŸµÀYΪ ܹuõÏ?ÿ¸}3ï\üqDÞ„'¿n ®–`X·R@^jô/ˆŸ–ÚŬVpÅJU¢’/ZIü¹7rro:CŽŒIþ¢ËWÄôUªTÁ*ÂÉGNØX­Z5*óÉ'ŸÄÇÇ#´ÿ!CTû{õêÅÎýnu³¸ôÉ: ñ‡ú­òZ7"Âwíí—8Ë Ü½uå?Ü¿w+#%(.dw\ðN&~—¾å¸ñ¬+À 8ˆZ#;®ìܹS?-µ ¨Eö»ØDü—o^(ìŒ!>5ÀÅhß!Ÿ7ë¿Mg £>Vã2åþI“&Ñâ\}Dóô'$$``êäƒ)Ó¦Mcç~繤¹%æp"â;¶ÆkýÈ€=so\ÉAtyÎwoåýñ¬ûbFlBؾøÐ=Lü|'³¬+À ¨ÀܹsÅ>ÿüóÀ}"þèèh KÑlæý¾ÆâÏ»y¡°òåü Dü˜LŒ BSgÌËôöë×<Ü-ˆìIâ<÷Üs .¼{÷î‘#GÍSÕ¹ËúØ/\+`¸ÎEüáÇ×Û>ùè¦ñ×r3n߸ìÎùáƒ{÷ïÞÄô\¸ì'†`â7üÒç YV€`ä¥v¿ùæAüps‡8ˆÇºÅ”Öàèó¶ÿż[…•ñ…AAüX. :á|wi™Þ¥K—Ò2½rÂ^¹¿AƒÇ¿wïÂû˜F‡P­[·Æ7¾¨XçTÀéˆ?âĆSûçY5,/;ùÎÍ<7ÌïßAäÍ«¹çÎÆú%Ez&EdâwΛ‡[Å °¬€K+€¥ve÷ôE‹ â§¥v§N mÒ¬ù™¤ †ÿ¥+·Ÿ1ÌP%þóÙ×Ò²®z;ݰÑãezëׯðàASîÇâ\ðû'Óþ_|qþüy”A(OSc?¶`.„ué ƒ_$pFâ<¹)Ø{ùîyßg§„ß¹yÅ}òƒ{·±œfîžOðO‰òJ>s„‰¿HÞu|R¬+À 8ƒ›7oÌZ¼xqÄ£$â§(4Xj÷½÷ÞC1~5øs¯ÞvdÆC›øÏf^Iͼ²dÅúÊ•«’ß~ûí™3gà»/§sçÎ=Z8÷;QŒ¢¢¢>úè#Uç~¸K9CsX¡€“ÿ™€-0öïý­gJ¸7¦®ù „âA@žì³agc|S£}˜øù.eXV€°«ß}÷ Õ?ü0 €ˆ?55ÇKí:b,ñ_¾vÛ1C ÄŸ’‘“œÝwà0ŠÊ²ÇJd èÇ?1Àx@8÷oܸñÁƒû÷ïWuî¯Y³&;÷ÛõæÊ-RÀy‰?ê”Ç™ÏOí™{ëÚ¥»·®É|ÿÎõ?ÿøƒ¦ç¦ÅO‹õcâ·è æÂ¬+À °Ö) ;£Ã€-ˆŸœRV­Z´­ñjíÈÄ †Þµ;öÎTXDüÉéyIç/û‡Ä}ØêcbúW^yeÓ¦Mˆ¿©HÞÞÞðÿ¡2ø rãÆ)S¦¨:÷wèЋøZ×A¼+` NMüÑÛc‚vœÜ3Ósù€ ç£áñR¤òÝþñðáý»yRáÆs.þ¿W6WÅ °¬+ ¡€¼Ô.ÈQhˆøƒ‚‚h©Ý®]»b{÷ŸúÚ…ø¯ß¹bÏŒá„uÄŸxîrBZîº-{^zùqT~ÌÇ=}ú´)÷/^¼¸|ùòÄýˆaŠO"H"¼ìêƒÉ#FŒ`ç~¾ W þØà]áÇÖíYôSlÀŽ"Cü»‰é¹X=73ùtzâ)&þ½ øè¬+À ¸›`PA¥o¼ñpŸˆç!ŵk×*T¨€+Öï´ñ_½q×c ‰?>-7îì¥c&—(™•®>ƒ†©>ë¶`;9ÁÀ‰Î7oÞ ¥ùŠ„Ÿ$¸ÛeÆçë< ¸ñÇ…ì‰ Þí³aÌÑMn\½pïÎu×ÍÞCäÍ›×.dŸ‹ÌH>‘ÈÄï<÷·„`X7Q ^½zIa¢İôPÀÇÇ-Q²dDBŽ]‰ÿÚÍ»Æf !Œ"þØÔKÇ£;w}츋><Ð"†iûöíIL,`ŒUÌð…ÿ—3RCv|]q“kŒOÓ©pâÝ—v øÈ²]ó¾O‰ô¹w÷†Ëå‡î®çÖ•‹1YgC3SC˜øêfàÆ°¬+à& À8-[ á­.ˆŸ–ÚÅ¢T(ðɧ_Ø›ø¯ß¼{ýæ=£2ÆLÊÅèä‹·|½ÞcÇýÆ{yy™rÿ¾}û„s?bbbáV9þ©Ð¼K—.pr“‹OÓIp1âOŒ8´ûÈêaÞëF_ÎNvèèÿùçŸ÷°¢Vvbιˆì´p&~'¹¸¬+À ¸¡p/ô ï"~„›„·oß~óÍ7Q`úìÅ þ·î’¯ßºg'âJÊŸ»ko^»xÿÞMçÍ÷o#ì&­¨u!=úÂù3LüŽ¿Ö)Š‚jBŒJ亪ð)–*A…rIÚˆÅk ªàþn®6íJĹXz8‹ÚÆ…YV h+#´`P“ÄŸžžŽËÒ_ŸNp ñß¼}ÏÆ|ãö={dbΉà„ïz¼ðVÉ’%Á÷¦Ðõ~ùåáÜO«ðb‚DÆ M¹Ÿ-ýEûFsª³sUâO‰òIö=¹kÖîùÝS"}ïß»å|vý?þxxÿÆ•ìK™qðäaâ/¬K@oúœ5ÝR­Zµ~øösíÖÓ^¨P.ƒ±ñÝwßµèÍÕ¦]‰8KgQÛ¸0+À aîܹ#»šÌž=[?&žâÄééôÖ;Ãã³Fü·îÜ·:ß¼}ß1Ä5 ÉÎ'¿û½jÕªµwï^ Ô#' ~¹råPËœ‰k ¿1W~ûpàÎ"|£9Û©¹6ñŸõK ÷ô^7ÒgÝ謔0Dµw’ ÒG4ž[7rór’r³˜ø ÷º×Iüô¾¯_¿^µÁLü…Û|tV€0D]»v è,V¬¾7ñ#È êÇ’RmÚ´A¾ƒF9˜øoß¹oEÆ8ÁÁÄ—›5k᪠•ª’˜¹‹…ŠeâOII!3ÿÖ­[ùÔÓÓóÀ`’´S{ éP®„У€Ë?bØŸ‹?urËÁeý|ÖÎN ‡ M!f°~~Œý[W¯\<{9'ŽûLüz.D»–ÄšWõí2dLædª§¤ ýØeØÆo×þâÊYVÀ® ÈKí6mÚ¸OÄHÅq«§D‰x î¹íæ•‹XôÊ.ùáƒÿ÷çŸðâÁê¹—³“Ô2{õXt_Ø¥°Eı¸pïÑiæ7%~TR`üs!íç¸þ‡Cd‘¦Ôr‹v¡Â0´èz$ê{h§Q4‰ŽeE;5vq°bÆ6žkct*0nÜ8MpD9yò$||º›+€èïÿóò]ºT?-µKn'ï·h—UèÄÿàáæòýÎBü}Œ„b:u:'¥7ÞxçÎ+ÿÂ… eñ­‹ÄïžÄ¯qÛâ‘.Û€tNo`âwè“ÐñGœØ0úgžÎ@©D‰ÿÜ£‹¥^= âÏ…ËMNJfjHÐE»t?°ø—Hßu¹YÉ–r?X_ n߸œ›“x)+^oæxü½¸”³”ø…Ù^ˆÚÄ/@Jvð®ü$R°¦¨M|"@yÚQ ,êÄoù|4ˆ_À+Y¾…-D¶‚˜"¸8:µŸ áæv¹1òǼØä#ŠûWá%;MaŒ!NYÖÊúå³&píDý¨S4ÞÜ'* øpáxÅ õ>àƒ³ÿveqo–.]¸OÄæÌ¨ƒ¥vé À¸)s„øþñ§2?8ñ¿ùv#(šÀOÏ+¸é#"§Lü]»vâCgë.G&~UÝ„,:¿N3ñ[wùY¹—ñGžÜ´aù¤ÒO—eþùϧêÕ©|ÌC¿¿*ñç]L½r) ók3SBÃ|Ö\ÒVÿàƒKrΞÉ”ÿDÐÏ;·®ÂY6{K3¯Àeå…bÄnV?®@ÙY¼@âWµå Û¹Â`/OK2µåÃùD !ä¡‚9â—ËËm&ý„YÝÔÈ-ûÕ蜷@u¢U´¯êV Z§&žËª! ‚›çИD"~ˆjU <¢ZyÀãxÅŒ¸–¹VÀ&à;.^¬ÿùÏñÃ#õ":'E’9|<Âyˆÿ?°˜åßù¡3¿O`þâĈ»!SÚ_iÖ¬YØØ¤I“ãÇËÄ_³fM!>fSXבzˆ|ÍÆ¢§ºX »›¾GLŒ2ø²*Ž¥±‹-3wU?ü*#™×3+Ì”ø…hÚñH¼ûÄ{åIÓ×þ8/ªúCU+è]L (pgœ¹ â?°%Àk5üøÁú$ž)å±n®Î™»ÚÄírÆõ+YpÁ¿˜ã¿ýÈšá›'wðY?&êØæÌ¤Ð»·¯ÃmGÎÐôÞÝW.¦^ÊŒµ.3ñ[÷t3d/‡¿ª:œø…K‰|:²_ÛÑ_Æ_sñ(pö’¦ñ[²@´DQ¡xx‘^®V<”5žàªZ‰cái ú£x‚HªQ­ÓñŠr1s%¬€Õ (–Ú:uª ~Zjwþüù¸‰êÔ}‘æŠøñuÐß©ˆ씹P {ûøÑ®];l„”LüXmW6t"b’uý¨MüЉdÂldn:µ/ …C<í¨:ñ‰vÁ“VÕ9U­9ö&~4I(£x—‰9c2‘ËÄß ÷Tœ,Yª#™øMEÀŽªÎ¥ÚÄ™Ó_õ}G&<²0âÝ'w„ö'ç%þ¨SˆÕÓçÇÎðê÷IÉÿþ©{ç˜àÆêÑIüðÅù\쉰#+ÁýÛgv…ÛOà¾)‘¾¸Œ`ÚÇ— »ùBzô…ógrÎEd§…g …‹‚ e$¦'ž:Ÿà.þâ¥ÅúñMöI‰òJ>s$)Ò3)â`bø„°}ñ¡{âBvÇïŒ Ú¸-úÔÖ¨€-Qþ›ÎœÜyb}Äñµá˜úŒ ÐGW†ú.ñYì½$Øë÷Ó‡y. ôœêм€söÏòß7óäÞ'öL;¾{êñ]“íœä·cÂÑíã|·õñã³u”÷–‘^›‡Ù8ôð†!3Gu’RÖ=¡ }/Ç¿ô›ž¯ªY<U!•ªúàP-©h†¹2æÜ ì5áK£úeCuwU%UËèéAU¬Gåb˜!¿‡ E±%嬀] 2”`ËG "~"!±Ôn>ƒœøó…qBâoÛ¡3Ä6lØÙ¿Ba/6â+¢LüƒâÛ²Ô®ñËØJD(³ ¹µø,†Šo( T$ËÔ¦ãâ‡P]õã¼x§È¨­G1Aü²S¨bG‹&ਿ©O4^ûæl^â©âìÄ蜘¹[ú™RâVy²X±R¥JÌÿuŒvtN+ˆ_¦ÿœ´3q»3âo]¿t1=ÚÌÄo×—™FåzxQ±»xxé÷êѰ[«Z ÍùÉ-ÑIü¢~íñ½*›e=%žûdmCûsªªªŠ©j%zPãÅóWa^UòÏÂRLª\†°“ oÒ œ8q‚ˆ_,µ[¦LظãˆÿŸ:#ñ—(‘÷ÞÞÞ‚øÉ–_½zu+ãÆ…ø¶,µkŽøåHk2#ây(?¨M¿'‹¿â‡üðÄó\4XÞ.„òòC•|KÄ. Nuñ›{Ñk?5Xg'¯ÅijÈSŒvd‹¾„CñÁœ_؞мÂd=åÏ5Šsò™Ò§ÆÀ ?´_Á.@üˆÎyúè&øñË>Åÿý¯×j¾r`ç sñøuÿ«4rNZÔµ¼Œ|R7*³ßN¯2ÍjCüæLõhšêÝN!/ògJ1ðШŠjÓHâY,cˆÂõ8Jšj¬0NˆàÉ¥ú-R¿žvÊM’¿ÀšëjU[> «ž ìRåHÅ ãòçc²€iY<`rÄOKíÒÌ–2eËÇd:ñÿíeëL^=K×l‡bXiKà>~ à)6þüóÏ2ñïß¿_^jw×®]V_”ªÄ/Læ ùb/sÓÉT_ú…©¥À0 âѪ°Î83ñ«’ÌùÉÄoú𓧇É]lŽøÍMó£}ÅVÁ ²›«ª•¹«Ë5ˆŸ¢sþüSWxõˆ~Àá§C»–!'÷š®À¥›øsàÍo.çÿåŒ ˆòiXf¯«tÖïh)ñËþ*òQÍYå‰)5üàFüòÝ¡ñÛ(â‡8Š•äƒB…&ògß›j)ñ ¸—ŽâE¨ð­”mQ¶ TÌúë˜÷dlP ..Ž©HÛ¶m#â ¥v{ôè¿ÂMÅÙˆßicõ|×ã(ÄO•’XjW&~ùcÝR»¢çU‰¿ÀYIÚ^8 s|ÉÉ\(dshë´ÄsQµ‹›SÌÜØIt¶cªü^Óã\Z ›«žiÊ¢m®DüXs3wË—+#Œý¸s°‚]Ë[ ø¥{rôqyÍ]]Ä%û†f~Düé90̘Ù߆—–u»ZJü°¡X;?ñÃ`€F˜ä»¶ØøEwࡃ7bå/b Ù!^¶ä7Š?#‰Êò,+ÕÁ[a)fÝ•Ì{±V+0mÚ4ûU«Vîñc$€:¯^½ŠõwQ`æü•ÎEüÿÀT]Ev’èœÕkæ+†€§ø½¼¼°åé§Ÿ>uê”LümÛ¶â·nÝÚêNÄŽ¦Ä¯åÜëÙ6#Àè1f;-ñkxŠ ©eT7Ê ˆ¯Írͪ!AúkÓsQ¹ñStÎáƒ~ªöÊËXÑóxîß»ùàþm„ÕŸ4iâœc3SB²Î†e§Eè!þëW²µs>ñçžÏÁb^Ffž¹«çÊ4²Œ¥Ä/niÅ}¨MüŽ1ª'züø°Šq¼¶WƃÜ †¿\9ŽŠâqiõœįª?´ÀiÓןáŠy­s]¬€Þÿ}_}õ• þ .`   üKíž Mu*âwÚ¸öyå+†¸œ±±±˜Ai̘1ØÔSÿ³Ï>+Ä_¼x±-©)ñ›3«+ŽbÊÜzæGél*¶¨ ‡g¨Y4>†›k°N§Sëüø5ÚcjB'mw\Ó7j —´T“XtR>¢¨Í"—4Þ%‰¶ü‡ï]¿–‘—›Dùj^êÛyGŽ)W¶Ì°A}ΜÐGüYˆÑ©‘ÿ"þØ10s¬£ŠYDü‚Îñ€VØ6¬&~ÕEaEmñ’u>8t>ñeס­üªZ'Unê)¶hœ2¾?˜š”t?JÏPz8j(\ˆŠuUs=¬€~à©/»ô § þ{÷î¡„‡GFï¾::Óiˆÿ!–ÙÒÈ÷î?¼{ïÁí»nݹóöý·ï]¿uïÚÍ»WoܽrýNÞµ;—¯ÝνzûÒ•[ón]¸|3'÷fö¥Y—nd^¼žqázzεóÙ×Ò²®žÍ¼’šy%%#/9=/éüåÄs—ÒrãÓrãÎ^ŠM½“r1:ùbTÒ…3I"s"rÂã³Ãâ²GŽ›ÅZ¶l)p?0§OŸ.ÿÒ¥Keñá믿ãLKš¿vlbQƒ°( ƵÂî.jÃSšø‰ü|î‘ L·âXb»¿Æ+LµÍ¤¿v“t¾¸å) õLÿ©Jüú‡OÔqNJü»mâ7çˆÖŠû_v¹µ™¦‹ç¸\ÀªŠC˜ûKoJ²€V¿ðá1‡ï¦KsËrÉí!·E´Ju‚pB4¶Ìœ1ÆñŠYzÝryVÀ(ä¥v‹/Ž2Dü‘‘‘8–ÚmÖ¬î»áÿæ<Ä /0"ñ7~÷(6cÆŒä¿RXXLþØèëë+·nÝÀÕ«WÏÆ>5%~0mj7ѹ£¢Á4wKIñP~çŽ'~s#Õ·Pƒ‰ßÆ R×îòå²tΰP’G8ùãë"NlÀ \'}^«Ym椪ÄއE_ÿõ«é7®gQ¾sû ÅÆúÇ?þñïÿëÃæÍíÛ¢Jü×ò2 ÌùÄ)-nBFg&~]W‰A…t?QŠ6ñ‹¥ûÈò¡E˜ÞÒT›ü”v”Ç¦Î‚èø“¼¯i3ã :5[ˆ_žó 'Ÿ6š~3•‰\U+³.Ыg$·JÛÛÒñŠé¿h¹$+`ˆÙÙÙ² dðàAAüÑCGÙ·o_5è‘Øèݶï?—Ÿ Ÿux®G&æ{±G%_ŒN¹“’ïÝw6ßÓ.ïp|O>Ÿ—’ž—šqñp‹?—}õ|Î5xÉÃWóð›Ïν‘sù&<éáO¯zøÖÃÃ>ïúxÛÃçþúÍ»7nÝ»yûÜñïVdÇûñÞ%ßQ§oß¾2ñ‹¥veâÇ@¼hž{î9ÛûÔ”øÅcÜœ#TìhQ¬2Z¡fz…‰WŒ9Ó¸xü:Ø«Gã›­¶WƇáù)mñ› ‹©ß·@Ï^Ž}B‘ߤEøX X±'F î±iͬz¯¿:¨ï·ÂÄŸåƒ5w4óîíëÔ»>èÿÁƒ;˜Ñ‹b5îÞ½zºoŠtÿ|”ž¯ZeÜGœ>uôjîyüˆøÏf¥†Ø#3ñÛþìÓYCÄOÞí¸“µ‡ÚÚÄO·¥é\sCAü8 Epzªº£h?êÁ3H5D&*D3T­Ý¶?áµé)Ó}'¯b¨è)ymBù&EcT™ÞÒœx-™ -ÚãxÅt^´\Œ°Q;wî "'bXË·X¥J•€û‚øŒ?--íÁ¼4ÿBò£|‰ß›6ìt‚ƒ‰ìn]vðÌÝŠ•ª@UÄ¿qÞóÏ?‡•Lüòãñ»ï¾³±Oep—P¸Pš{âÉ“rL‡Š*¨WüÓ܉øuWÕ†*×ïÕ# ]`ú}^›øqF¦ëÓ«nÅÐE(fîDLÝYQ›ê‹[^ùÇÜøAÕ+ØÒ¢è,'µñ_¿’3þ¿ÃHîfï¾µkË¢/;·iÚ¸¾¿÷&ÌÜÄ6Ökî¦'^̈ýk2nV~ˆý«9¹Ù‰vo„?¬ûðé7Eÿüßÿ[¢Dñ Ï=ûÃ÷ßœ På~"þÌ”`;eÊH LOÁÿ\ü œKZ¬ßÙßÔhŸ”(¯ä3G’"=“"&†HÛº'.dw\ðÎØ í1Û¢Om Øå¿éÌÉ‘'ÖG_މ˜qte¨ïòŸ¥ÁÞK‚½~?}xQçÂ@Ïù§Í 80'`ÿ,ÿ}3OîqbÏ´ã»§ß5ùØÎI~;&Ý>ÎwÛX1>[Gyoéµyø‘Co2sT'Y:ÛŸV…Uƒ¶“œÎ5,ð\P µéth£xjà郻”½k¥‘k£%Êñ¸èã©­Ñ$ÚK#F2öE ¨M8Yj.°6=]†JÈWJÏE…‡N™´Òn)DÖnÎWµ§ÌíåxÅô¨ÊeX«@ y…]ù1Ž`ü3gαz6þôéÓ£éâÅ‹´j,Öß0mžÃlü v[²ÃbõlÙå q`Ѹ={öÄÆo¿ýV&~ooo£–ÚW‚ª_^êÕô³ª¾S?ñ?ŽÇ1mß®-Ý¿ûºLéÒ²£Ówa’®"3ñ¯›_¦\+À °ΫÀܹså€<†`ïÍŸûß1•)]ºôСCñúlÍÈÈ€[?ÎöÖ­[ƒ&×”%K 3Éð™»`tc³]Wà:œ)0ˆ Ä?~üxllÓ¦ >°ÈÄ©º¢#l\jW\y4SKÕ¥„i¦«´X`±ÂdŽªÎÅRû„Â"bMKS”,ÖzZ"ÎTì"F/Š8S´°ÀÉZ¢Ù߉8›d4]a@£¤?Q¸l†'X77{MN5„7œˆDäyxƒ UÏNÔVÔlü ~ßMǯ3¼wñÿ+ß,ñÄŸ~ÒjÕ’éÝ»}^±Bù±#ûê´ñÿEügášOù¸ï¾?ÿW~ÄðIKŠÛÅGÄŸœžtʾ™ýø÷5Ê-cXVÀ©8tèPÍš5Mí /¿üòÚµk¬/ÿóرcX2–v[,_¾6~?R```hhhnn.9"Ò´jÕŠJ¾ørµe«·«€nx¶ßš»§å;êÀå)^Jp‘ÂÆY³fÉÄ¿qãF¹Sl\j×¢K&2ÑD2I\¦ub/ìÊÄíémø+Ê $ʫΰ¨ÁÎPBá\(4¾Eí! TLO¤?:N{ªžžªTË8©WOzRÐ[WcÃâ÷9¸fÅïS^z1‚<ÒÓ¥J~ßíóßçMhõaÓ Ï•_·bNzR Üâ3SB;?;-"û\dÎù(åš»Ró,ÉùÄŸ“Œ™µöÎidbÎ'¿Àé4H?Ö-¦¥v±—Lü½zõ]cûR»îy…óY«€“ÿ™€-‰‡îܺ’–J6~ÿὫvmýí³=ñÄt#U­RqÈ€'\»VZ¾wxßÉÿrN¦Û=s¬c¯k®`X¢«\öGŒ¡ˆ¼I¯E¸æÃi‹éR‚-óqñ±ÅôLø!ç~8 |'?"ù¤¦¦ ç~ )‚'0·ï€aÑIY¶Äã·îÛÏÆ×&œûâþJžV ¿Lüo¼ñ† ~tVѽùÌ\Fç%þ¨S1§wÁ$ùRº¿ÏV"þ;—íöX¼xþ„·ë×÷Ò[o¾>}Òˆž?~U¹R…Z¯U߸f‘9ÿå )eØø/g'Áï€ÌÑ9]æ¦á†²¬+Px ¬^½Zv¯ÂFÁ /€¾ø×®]ûóÏ?ÑRü¿±EƒûA«Çå,SfÒ¤I‚øýaaaXÌ‹œû333»uË_‚ ©\¹ò‹—¯·f.,Âeçl¸åú8e¬i p?(À"œ×eâ÷òò’¿½h„i.¼ëˆìv 85ñGn Úw[7¯Ä¿cÓ¢­ëæüòtS=ñ´nùÞô‰#zýøÍ«5«U®TqÞ¬‰&^=É—s,ˈ?ñ|ÂId&~·»ùø„YV€°DøÛ4lØPFIú]¹rexáË4Ÿ——÷ðáCEÝØ‚íÐ?!„|³fͨÚÚµk#Ü$p U‘ðŸ¨ZüS˜±4z×Ëï´kîbÙ]‡dc½zº÷ì Y0Ú‰•…3Âj\2ñ3Ft>žXÒÉ\–°—.@ü±Á»°Õí›yÉ ádã'âß°jÎ꥿~ñy›þóñš‚ÿ|ꩦï6˜<~øèáýš4~Q8G˜wúRVBnv’¥¸ò ~¬äwLæ¸ìu™s½¬+À ¸²°¯wéÒÅ”õáZƒ(ûÉÉÉé%¬¥uïÞ=s…–ÙåU`ʯøŒ€Àóøt@ÄO Û!‚çíÛ·ékÖ¬A¤jX÷½ÏÄŸ;—}õ|Î5xÉÃWóð›Ïν‘sù&<éáO¯zP¸#³~ü5^­Ó\¶l™þ;ó­þÐ «ÈÄ/¦D㯆,µëÊ/·ÝYp â Ùºð}åò…#6ÈÄ¿ü·©3&x·ñÛò£°QƒúãÆ Z8wJûv­Ë—+۳Ƿa§ýý–f&~ŽÎé,w*·ƒ`ÜR;wîL›6MÕeÿ“O>³@v8ë#˜¦N‘På5¸£ˆáÇÓqá¸ÿóÏ?#‚'?Âø áƒ9÷Ó:4{µ\ùg§Ì˜£Mü@pgCfîzú…àqšpÄY°ñË/¿”‰ëÓTJ˜­³S¸+`W\‰øÂœOŠ‘ƒÎœOüYñiqÇ—cýÎÆø¦Fû¤Dy%Ÿ9‚IÃ$„í‹Ý²;.xglÐö˜Àmѧ¶Fl‰òßtæäÆÈë#ޝ ?¶&ÜoUØÑ•¡¾ËC|–{/ öúýôáEAž =çŸ:4/àÀœ€ý³ü÷Í<¹wƉ=ÓŽïžz|×äc;'ùí˜ptû8ßmc}<Æølå½e¤×æáG6=¼a¿]o?®œ`X víÚõ /˜šöß|óÍ={öȼ@‡ïEb¹svµý ÛÏ?ÿœP¡B ÄÁ¬Ú999äÜ|ðÁTòÍúoï9à­jã|J¶=VϘ‰¿âÔZ´høE"Õ­[áR%?Bï‹.ÃIøAYÔ;\˜0\#~ðI>ãSýõ«yAÞDüKNYºhêÒEÓ–ý6}Ú¤ï5kôÄÿ÷Û /TíÿËO‡ömYúÛ¬NŸµCôýêÕ^ž5}Bl„nV¢vÎ'þÌø´ØcÌLü†_ä\!+À °.¦P‹g™²>\h`òÇ\E‚§Íï¿ÿŽhâ€x=§ Ðß²e bqšVeºåàÁƒˆEC©_¿þ¦M›`ãñ#¡À_„¢ƒîÛ·ëPÉÎ]¾ G(É«Ø]ˆÙÆèœMšå¯ŠPE÷± ¶€é#""dâ—ý¯Ð‰zºƒË°PÀõˆ?)ò0 ?-îÄõË—s/ܳiÕ’_W/¹zé¬5Ëf¯Y>gíŠyKLïüY;øñ‹Çå3Ï<ݶM«y³'ùÛ·~íoŸÖ®lÙÒï¼ýÆÌéãc"üá诚³ÏF^ÊŒ? »»#3Ûøpáó!XV€pJÈIÆ”õáOø“"‡}]ü†Ï’%KÀýø2péÒ%s':è£ÒÉ“'õ?•%[8÷wíÚ¼KÄäMII¹{÷. 7¤ &`MœBÉR¥F™–y ´í Ùêxü!ÑçÉméðáÃ~JiòäÉØ‚E Ð)2ñãcˆè>¬…ì”W7ÊpUâO‰òIöÍL ÁB]i© ;¶.߸fÁ¦µ 7­[´yýï[Ö/Þ²añ–K{÷ü6~ùÑY¦ô3;´Y¾xNtø±u«uíÒ±\¹2“ÇÙ›æì³—2ãÎÆulf¯w¼ùœYV€ R\|E‚©zc"ïÍ›7!<é÷b;,ýÀ} <ÐD.æ×’°<Àªº4*@lD–;"à&Âw¢NÔ¬1À.˜(,œû’R? N>¨‡b¡Lù¥³x¥ZõM[wbþnágkWàZ¼r3Nk ÜÇxø`ãôéÓeâß¾}»ÜwŽ\j—oV@[×&~˜Þߤ~óæõ˜3Á{¶¯Ú¾yéŽ-ËwnY±s늫vy¬ÞµmÍ”‰#ßkÚ¨X±ÇëvÑÝX¶Lé.;lZ÷ûì_Çuéü)ÈÞ4ƒø/fƦÂèîàÌ~ü|㲬+àN €Ò”õ_yå• 6€¤Eš“ë¼H0«ƒ°EÄЄ{°~ÕªUp¿¡b ˆ«ƒø?|ñå sss1 b¨õË5ý íÚµ£¦bšÁo¿ýÜ'âG‚Ó‹øÂ€É¾ð¢’4o'ŸBÏV¬¹ÛùËoq ½{÷†-Ÿ4$«¿¯¯/NYØøùåщèPwº„ù\]¢@üçâO"fÿµË·nÝHIŠ9rÈcÿ®uûw¯Û¿gÃ=ìÝDÛ'Þá“ÿ”)óŒüT-Q¢86^ÌŒ3ÍùÄŸ‹y´ŽÏêµã¤ßž@ÿƒkW-øæ«Ï+U|ŽžVíÚ´Ù›æGÄ“ííøÌÄoØ5α¬+à” ÀeP¨yó›o¾ `n¸ì«¢¹â´àQsùòe±WZZ&Ý’Ë>bûÀÕ^üIøiƒ#bH Íý³gÏ&7$¼±d/&ñSÂ`†š3íÓ§½pÁ󷥫2.^/Ìl ñoßç‹f#à¦|j_ý56öë×OŒ0ÚÁ(‹ ÿ”x©]§¼íÜ·QEŠø3’Og¦„d ÷ß¿wûrnNTDÀqßÝr&â;í~4.êÄáƒ[Zµ|/߯Ÿcš‰øS¢¼ #stN÷½-ùÌYV È+°zõj1V6ð7nÜØËË Öz‘@ç0áë5¶Äî9Uå Mý‚4*‡s?ÆòîŠßð¢°ôHX€ËÍÊdŒßh?9÷£%Í›çG¼AjÔ¸éaŸ“°µVÖoã0$ÝöíÛËçU±bE²ú‹ ~øô‹®ä¥võ_±\Ò1 MâÏN‹È>™wñì½;7nÞ¼–œyêÄ‘O òŠ ;wæDrÜ©Y3ÆuéÔáBzŒiÎN¸˜“rÆ«P2ÇãwÌ=ÀGaXVÀ‘ `nÆ eʧßUªT¯ˆ)[Ã)¶sáj_`SßÓÓ ¬D.€ñ¾h@?þ„¶jÕŠN¾.+W®$'áÜ7!ªsÇŽ8S*ùãO}bξ %ëôêy»A4uÆŒâtàÑ„-`zùñk¢‰nå¥v-ºÆ¸°(ÊÄŸs>êBzôåœä;7¯Ü¿ïÒ…ôĸఠ#”£Â|ãÎOŽ ˜5cì#â6Í ~lyVæ¸pð!XV€pŒ°vËÁÚÂdðàÁðQ¥jΧi¸˜!ªÝNL™¥X=Û¶m3è˜iŠðìGc ú?¸w5/;ã\ô¬ÿ}Dü*…ÿ"~ÏäÈÂÉLüö»¹fV€`£Q,Šˆë‚Ű@cš,œæ…Ë>|ß1áUüklaù'URhNÁdd"G äCQÆâO(†Â¨mÅŠð2R¸ ;w~ðWP¬ŸŸŸ\!˜'€v¢µèúüñG:S8÷ÃÁ]¶…ƒžRÔ0Lo­]»6•lÕºÍÉ 3 pGfíX=>낆a†®hÿ‰'¨µøA SúþûïEÏòR»:ï,''~,±ŒQ‡3 ¾ˆ¿¢¤bµ]ù¬‰ÔEaìˆ ýä„ÁýÀ ">>^”ëÃùG5^ýEòöö–ap Z?Љå«Ê•+?iڜԌ+˪ñø×lÚ6#,Ü`šž‹°ªÁRÂ0IîkD%rØ•æÒ2GüNrRLüÆt„|o,3,Æi˜¨¯‹8±!òä¦3°^ŸòˆÜ´#6xW\ÈžøÐ} aan‡K=‚çDaU,_Zs+pQ<~3?VOZ¤95"ç\db8¬ì…›ÙÆoÌUǵ°¬+àæÎKŽìЄɬ DÍál£³=n`7à›v‡W̱cÇš©©©2g›CsÅQ0ÆÀHCìˆJ†ŒýNÈêË÷ÃM«‰‘&ÅŠƒ“ BÉ¥0x@#ñU¡M›6¤œû7mÛ wL6]«G¯üº_}õ•ÜTšž ¹0?A¤_gŸr1&~G^EׯŸý6çÔðœs‰áû =³W#ï >+À °Ö)O˜š5kš²þ+¯¼ º‚‰á"¯: WãÐòÇEm ji¸ªuRä~QÌíHˆÂåFá¤Ñ0á2¤ÁýpãéÔé±§( çðä‘ýàá6!|‚ÀQPH8÷·ü¨ß©à¸²bÍÝš¯åO0X´h‘hç²e˰Ÿ,0b‘Ó›o¾):ßv¬»xŠØ^¸–ðy®ðHÐP5&¬-Ä}Q-Õoébg(/†všSžmüÆ\“vµñg¥…’³SÃ1lHÛï™ýø¹ð¸V€`졌ӈºcÊú¥J•š4iló¦‰<ò8 ‡Ô16@ ØàU«ÂFÄîÄ4\|CÐyv0̃{€­æ*ÄDa„èÑYŠá»láæjÛQmƒ H(½Ù¼y³Ìý˜ò‹¯ tPð\¹råP ®P=û N‘Û;'ž»œ–Ÿ–ë}"Œ¾H*¦çöèÑEBÈ#^jW¾N÷ˆoƒ ¯ŠÛÜoŽøiwsSf1 — 2Dõr¥Ú(ä.*EÃèO î§£‹ú韮>…·hÚø±ì®!ù/â‡CQágž¹«ÿÅÃ%YV€p˜p@‡W·jäÍo¿ýsmìÂjŽ$þ ooеïysÞü`T@^ûXZËRcÈAÓp7lØP ©c`€á k? H0iaþ $·víZ‰¢ÙX¢K,9ŒGŽ •’ìÜŒ‘ûG"·w&â7y&€¯å†Ñô\œ&‰Dsy)ÁsI¿§Vªºbà¸*+“>øÓž={ÄyY«“zMA\lQDù¤Ñð€¢þ‹f˜2½<ð6®Pã]±GD›™øµÆˆ?bz¸c!Ì‘HbâþŠÖŠäu®ó¤0𬠼}XÐeÚ¶šø1üÈŽ¡…¨ìôô'SèÎ9Díðç!‹>þßâ¶•?P&±£ʤSç,V‰?35Ô¨œOügÃâ1oØ92Gçtλˆ[Å °n¨L¼ 6”)Ÿ~W©RÖn0½H¦³ii®(ßw@$‘úŽ;ðOè Z#@§\áÕ«W)˜=%ŠÜ/ üØ”H1ã©Íiz.„Ãá(b€>|ú©6ÄùÁ‡ñ'¬¶+FpÚ‘;šü‚è@¨³oÅ^86pÊGü–¯ø ‡Š~ƒ úÂ… eîÇe¹¿V­ZT²é{-úœ—Û)G&dÒ‡()Úƒ1 ¶|üñdžÉI^j#@7¼Ä) ìV¬¡Kôƒ³i‹E6~\l÷±£©Î¦õSáÜ7Ý~>¢ZEìÇoÌÅ,?%Õ“™bTþ‹øwLJ8Efâ7æâãZXV€°A˜ÒaÊ5e}0âСCaºP+ÀR=LøæHÞí¢¹¢N ;À]ný"T?¸èO# ,† 4WDÞ¤i¸2©ÃÆO^@h¦ãШ“¶`<€QÌñе0 ÁEúñ'´ªnݺ$)>lß¾]uú!/GÎýHݺ÷:™w6×ð¼lÍVÔ_½zu¹h6b51,,†(ò• ÚiÃõ媻blF~sÞ/TI˜á-"~s@/ô2×AüæýÍ5›‰ß˜kÑŽÄŸ’iPÎN Ç|€¸`¬{å<™Wà2æ äZXV€°TXµ±¸’ªË>¬›ˆE£j5×>Š9R‡Õ¼@4WÔ R‡e]&uÌ.¥H` æŠÚ¤ŽÆ`U…ø?ˆ¦n¹Bð.ùá˜&„ý‘$ªD5.R]»v…MWn|ô Ï(ô¨Q£È²FŒ™›zÉØüÅWß¡òŸ~úI4><˜Å‹X&Ã'‘¾þúkÁ3n¾Ô.ÜlH U?]ÐSž#kñk'¨~÷òa±QõË€ØËt ÂÄoéR½¼QÄ?|Pφï¼Ñ¨Á›#†ô‰ óÉH 60g§ÀË?4 8Qfâ7æ äZXV€°HxÆË몊·Î ('8[$,…[à¢Zò¡©‹àC/W òlÑ“Pòúõëb÷ÌÌL 3Ð_®h®³… uÏ‘ñð“ÑÙrýÄ‚§¾&ÏsI|½ü¸› ÄiŽì™øuöcÅl'þ¸PÏ÷Þ}瓺ô[<ñûy#ßêܲQƒúùП|Ú¨ ⇃PìéΕƒ¶Çn‹>µ5 ë”ùo:srcä‰õÇ׆c 3,dvte¨ïòŸ¥ÁÞK‚½~?}xQçÂ@Ïù§Í 80'`ÿ,ÿ}3OîqbÏ´ã»§ß5ùØÎI~;&Ý>ÎwÛX1>[Gyoéµyø‘Co2sÔãØÉÔ_Æô=× °¬€K)>†ùV~mÑïòåËMùõàÁƒ°‚0Gh@³iÍq0¼hàܯ'`ލ…1 Ø\…€'K©C¹64Iüӻꊼª,\†4¸„ZµjE"õþHò·pý‘ûñ‘AÄ»A“û|cR.Ú˜Q Ž ï|ù mÛ¶ÅÆþýûcá3‘/U¾*q]I Ã!RÆ¥®t›[ )Ý´výÄ/JšÞ†ª[ÄT ¾h¿M_àζÿ˜á?ֽ붿¥!û¦Ø8ôÈ’ó ýÿŽØÓΔ™ø ¼¼¸+À °Æ)`êµ—ÀlùªØ*b_Â3G›ÔåÙ´ÄO¾40ÕùQ̦ÅÜ\sb@bHC- P^{@B³u&Ð0âîk?ý jÔ¨A´ðÞ{ï!ª£¼Ìmdd¤ˆÜ¿nÝ:áÜß¹ë·~§¢£“/Z ƒ#ñåÕ)S7n܈^I^j·råÊ÷刚 &sÎN:s‰bLüNÞM…fµµø_~±êß={âýW‡šà1ÚgEïýsßø®õßuIO 2$gÁÆŸ´ÝÙ2Ûøü¾â汬@QR@áÌÓ¢E ˜™)¸¾¹„³DÀUR—Ý $Ê‹ªà!ƒ‰³ÀY±q9)`\ç:Æœ¶òlZò͵M HD\ sÍ=<<è¸æjƒ½Ÿ$ˆFZàRb(w †™\[@ñ×3f &˜nôXßG‘AÊÐ(ÿG¬O ›çþCF‡DŸJº`E~»Aþ ÝÉ“'‹aÀƒ-Xj‹ËéwÞ0óý÷ß«¿Øˆïðù)J÷…â\Cü8ІWø“|)èœÃ6~û^–¶¹²¥·yJ ÚxÆ{aÐÎ ~kûZØuëÄ–+p =)ÐöLÄ´Íé2{õØ÷òäÚYV€ø[™øK–,‰8-:iØ Ç"f9´%~Ó„ZüUæpÁ'—}x¿AÿâX˜<*ÂãPÀ‘ðO ïƒ(&7qr``&ç~± "os¤`[Sooo8@kH(.ŽŽ ª.C؈?QûqÖø<"7R>MSm˜ÿ—_~!l€­ý¿ÿý/Ü~ä„Ó§p¥ jŒ ¨dÅJUæý¾æLÒ‹²h".pÖâ?þø#6vîÜšˆ„É4——Ð&~ú+ìýú§d¸ÖM¨ÇW»u3we?~Keaâ'Å\ØÆ_²DñM§ëÄ/{~Øók寵Íx>ñ”íùñŸŽ ôpÂÌ~ü–Þó\ž`XëPØøaríé„~|(‡7 ¡9ˆ@iŠæŠ*H´%Ç—Ð<’ø˜ˆ—Ñ_ ^@@”vÓ4\™Ôe4Ç_hŽæ$8Æ`V–Oÿ¤ð>4V>k„òÄ)r¿¶¤°¸Ã·‡ðºvíÚXµW†~wûtP|iÔ¨•|«Ac=Þ‘‰9:óÄéó±æÈ•c.6"”LüòR»ðò‚ï“âGL>.’þýzbõ¾)@'q¿~?~±zÌMÀELF3P-ÛøMŸu.Lü ß®7|ù °>2lü²cÏß}a;î£FrØÚ93ÏܵîåÍ{±¬+`‘2ñ7hÐð‡`2pwRÃ8­'FÅ[´¶ˆ13X,€¥Ú0"uQ®áDꨊ¢ìš‹h˜ÆlZ‹–×¥„h÷„ãø?XYüÆvùÔð‰@^ö‹ÚI¤.ŠÉ§‰õziy]Z¸Wõ¬H>_Ô€¶ž0¥‹îhÙ²%æ$Èhç~Eu¢ƒ*UªDÜÿIÇ/¼ýÏD$ä˜Qåûôé#ªÅ!¨ÇœÃ-‘>úè#aàGKtâ¾(c¿þéÎ]®…UXg<~ˆ&â`ZDüby/saõAù"t’itNs«@.öê±ï5#îü°n®^?~ùIŸ¯ú˜¶ —øñ#ñç­îm€í™‰ŸcõØ÷6àÚYVÀ‰þüùðî WLãú¡ ‹öàEü_'š+´Q%uº)šè7Bñ@Eã1MæÉåÿÇol‘$ 4W4 Fz™Ôq‚˜eK"(៊³ÆÇs¼‹cÉÓÈöuáÜ—„Ë„ËHñññä1£Œ?žœû‹=ùdÏ_E¦…Çgkä%K¢0üŽDmp"–æÍ›#œJ—.-Hæ×_µ”øQ¤"ý"8¦]×Ü…ìrðMq5Š£cl _¢6zõàpæù»ÂÓëï6º°Ñ9+WznèÎ}êëcæ.¼zjw|oøà^çümÏùÄŸ”oJwÚÌÑ9]ë†ãÖ²¬€ *  ~1¦ií;VOµ-Öp±H"lâNŠi#¢˜0À,*vÇ<ÝS§Náÿò€謓J¤ì†ÿ~È-Ô³¶ÍaÐMÁˆÛ£Gê8÷c‚¯ ýø çáÜß­[·Ç%Ë–Ÿ6{qX|¶j^¶nŠU¨PA®Š\‰Æ§)‘æÍ›'.QÞ â/zÐ/ÌüØ9ëty£³„…^,¸‹íÙøQÖ}!;ø^òq Q?lù²_Ä/n=sC¹Í˜¥ Gü´è¶u’Â.Lü©Ñ¾ f­þ^}}äovNý|Ó+Wªâ¿×vÜG ˆ?0*`³óf&~'¹“¸¬+Pt0%~@?–}%øèÕ«<^€§V$Ø¿á|ÈÖ#,Öð#G€s‚©.(Ì‘7Ì‹5W¡¥¦M˜« ²hh«Šo&äg…ç{„éÄ E$Ì>ß81  NÝúk¶ìËVäïzôE=_|ñ…¨1…hz.¬þðêI^j÷7Þ°÷i¯"fé‡Îòªdäµ/0l-㸥ÄKWò©NEýø§©ùßj¿˜™ Úoé¡ç¾vX×&þ³±~³¦Ž|¶öK|þÉú‘ Çt-óú‹³¦:Òü˜øý7a¡+§Í¼—Ãî>+À ¸§ªÄˆ=ð!DÀ~Ì:µ‚øE<œIhN^7û÷ï7w 4‰<æ®§@¶k"º<ÊÃo®Büet.%FsˆÁĸ÷è_J #œ€¸@aW¯^ýÜsÏ–Á. ‰dî‡×œŽèÒE^zé%*Ùêãö‡G„Äf‰\½f-lÇ ]±;~cK:u0W[N/¿ü² À~ýúÙBüýEéÎÂ( \.ƒ>¡¹©« ~8ø'mW•H3€åÏ,T‰ê¤^íÚp°ë‹á‡øjáŠýåòÄŸw|˺íÚ´xòÉb ßycíòYiñ'ŒÊY)¡éI§ÎøotêÌkîºâÇmfX×QÀñƒGgÏž]¼xqGëÖ­õ°©)¼Âùd×®]¤.Ðn"""äðmX ·"±(` ±êU5s ?{ 9°x–ØÔ.×43åÅŒXÓ: Í©$v1èÀh:M.p)1œNåÓÓÓ $~ÀYŒ=ókÑè‘Þ½{cz4F>"a`#¦GO:U8÷÷è3Ø?ìlpLÖÞ#AØC8yGòëèÛ·/†d"¡a2kbœc#ñcwt¢ëÜz[  ‡™œ‚çèÝGw9À=ªÁytïgMA ó¯#ÈšJ¾OQ þ´¸vÊùÄŸpæä'Ï‘'ÖG_~lM¸ßª°£+C}—‡ø, ö^ìõûéË‚<zÎ?uh^À9ûgùï›yrïŒ{¦ß=õø®ÉÇvNòÛ1áèöq¾ÛÆúxŒñÙ:Ê{ËH¯ÍÃlzxÞ¹ëð[’È °N§€ñûûûcî,A½zõ0?d z³4Á¡ŸÖØ’I] 9($ oxQ-ŒÖb6-y½‹?¡˜ u…Ë88K³i1Ì@{±šM³iáû_±ؽ{÷¢üÒ¥KUI] 9\öá°!Ÿ8Âø²ÑT±Q>Mì¨ÚÓÐpË–-4‡òÊg޶¼*æUÃΜ92ôÃÛ§L_?Ф¿§”-?bìtdtb³fÍä]P 6+HéçŸÄon©]KÇð­²h†ÓÝ$Ü §W hÿqXúí‘AüøžvþÌÄïô÷7`\Umâ v á[H˜ZJüT^¬QR?ðQv›¢¹BM:[&uìHpO«á 4ÇÐä-·q{á}@Ÿ2©åi H©cú¡9EÙ—+„­£Œ%©ƒà!y(awy Ïj3¢â(Κ,ôT[^,‹[·n]‚ò† " 'Ž(âú /šèèháÜOåñ¡@”\³f ¶ (””SýúõñwíÚÕR¸7W^çtW½‹¸Ý…­€ËÿÙØcöËLülã/ì;”Ï °…¯@ÄèbY(€ K¬²ÑÝ"úG{À.Q/ QöVsíÈ› RÇî´è/%ZiK®mÎã_AêØ XO.C4ÇG´Y¨®-  u0·8MT…ñ4ÄgTŽ©É0xË4„Ó,pX…8ªÂ¹“qfGæ~Œ[„Ÿ>w¼øâ‹ñXÙ@ÜlléÔ©üvDBóä¥v12ŠøQ†ëTáßÜW€‰_kÀOü þÇ×¹Bf¯¿¹ù¬+ଠè!~8©Ã—¦cÇŽŽ€EØÈiM\+ÖØ “wÔ@sSÙÈ—FìR˜zyy³ÅFÐãFB‘ûÅ^ˆ·#>>ìÞ½N2r#5¢ìS#1º ÏJ8M Ä€¤%´DKüª^ŠÓ4ÕBC‡Îý˜b Ç$9aª9GúÑk˜š)ÿAx°NÿðkIÄhŸ,ZjWÏÀ“:tÆBuÖ{…Ûå¼ â÷CÄ;åGÄ3.‘Ùßyï3n+À ¸²Š5w¼ˆÎIh{0¹}ƒø)ˆûðáÃÉ øiÈ€kú 2NJJ²HBrî7wD¸ÖXT9÷‹Úúð ÒæŠc)H”¹­uÊ~AM"4´…ëÎ'Ÿ|B#±çŸ“­e¬Gßa`¬Ç_1CWü A‡è‹Í¶mÛ0qY$LÑ.=V,µ[ ÷ãÄ-ê.Ì èTÀµ‰?5æ¨]sVr(¢|æ“´«dž¹«óÂçb¬+À èVà»ï¾G–`8¢˜#þ   Å‹S(x•(e¹uÐ ©0„ïܹþ3º[_PAêâè l=sı¥‘jÌ5–rD±¨aÐ,gÕ„/ ÕF.CÚÚ¢ËjÖ¬IýØ´iSp¼ÌýÅ!'<”ÄF²å7iÒŸ2ä$<…ðWë–ÚÕ†þŒŒ ‹Î ³:pqâöÅ:\öˈÿDø±Õ.“íLü7¯Yö²Ñyr1V€`œY-¦o* ŸÑÔÆâG‚I¸zõêd$Æ®#ð¢±:!hÜÐÉûTZ`hK…˜äõ.|iäi¸æôIc", c`®ýp@B¢s@‚ò˜Q€ÿ›«ÇÂAqhWüþ!¸ygΜI]‰ï0XE Ã|[PM-Z´@±aÆÁáG$œ¦|X½Ô®6ô[Ú¿:Uâbn®€ J´¯½s&¿ß*ÊvΙ|Æóz›Üü¡Á§Ï ¸£ááá èGp0®9âG@ü©U«Vˆ s»*5W˜H¤N¸li7/H–PÀœ…¹@ã¢ Ž‹£Ë»ÇÅ? “h@¢Mê°ëÓ²_lÀgÝÜ™bv,&Ý4Îv} I¤1 Qþá½CýRºtéÁƒ›?LþqázÐ$˜ùáÈ4vìXAü6.µ«ý:N–^\ÞÍpiâ÷I‰¶oñ#è'Úµ²ýâñƒø‘ó.¤¸ùmÃ§Ï °n¨¦™Êý ?@!ˆPáÇO6~?æË" 4ˆñý÷ßÇBQðð±ú±/V¥¥©€Î°m[ÔäܯJê°vË6uÔ,М֬ §@Ži¸2÷ƒà5H] 9ò;v _-D…øþ€o È"°à&P^u áSQxà8ÆŠFjëŒ5Œ?úè#ê¸iá; &^‹„8?ا„îAB‡’Ýs3ñÛ¾Ô®9èÇ•fQ·raV@®KüÞ)QvÏLüŠèœDüÈ—s,›C¦çZä2¬+À 8¹@1,³%ûuú—/_.ÏÜU?ÈuÙ²eäÖ&øÂÇÆ~Ð­Õ ‘+Á¦»Ú«áªêI‘ûÅÑAê˜!@6u TrssiE^٢¤j¼ Àº|:b@²nÝ:"uš#^|â}†¦áŠ¿âÐâ4s0ÙWŒbbbä E(Oœ&'Ú"ãLÅ(n<9ôõÕWè/ÌßÀ· 1©ƒ ¹ë Yj×ô› ™êä77Ï™pUâOŽòv@Î'þØc¡¾+\-ÛkÍ]Aüøqû¦e¡œù6à¶±¬+ Sжúá޵]E¬Sâ‡9tX£F rëŸ6mÙÚ­&~ÚèŒj Íaí¶Ôù[1ð7Ú.e¢fš‹%~M…R:$ ÀeH|‘Àì^š«®-€2©‹Ó$—!Œ"ÄŠ¼háX¢N cL]€ _è'Mš$œû‰ò«V­ŠÎ‚û>,N+ÈKí–+W®À¨;¶Ð?‡AçuËÅX—%þ3^ÉöÏ™É!ˆ¹Ë埥ÁÞK‚½~?}xQçÂ@Ïù§Í 80'`ÿ,ÿ}3OîqbÏ´ã»§ß5ùØÎI~;&Ý>ÎwÛX1>[Gyoéµyø‘CobÎÆâ?{ôáƒü9±¬+àV €2å4 t̘1S•øýø“ˆ ç€,M¨µ1 ¦`öu@–|i(á¼Àа¦£N=h®8–9RǧT+W¨ŠæŠÚ`ä–?ˆÓ¤1‰··7œÝåk (NSUpýO?ý$œûñcDáSâÁaéwÞ6þÏ>ûÌ /p_Ô¢®ä¬@ 8)ñïÙ<çèþeÑÛc‚vÄïŠ Ùº/!ì@bÄ¡¤ÈÃÉgŽ8&ƒøé?Äg™ f»? ?3õtW`XV è)ìСƒìã߈ë¢Aü˜k‹4}útòðPbI]P2Œý@[¼qh.ìߘ™j‘àm€ó½¥Æfrî§?(ÑÅ?ñ'=Ë~‰ö“ËHôµ«Èe¿ ×#5>Ô¼÷Þ{Ô­]ºtAÍð𥣠+/µ»dÉ’©Ý–ææR[Ô³\˜pRâ/[æéÅÿ=Æ0Uâô;&?"þ£°—»b¶·ŸúùQ °n®€"N?0±[·nælüDüˆùû4¢¼V¢XÖ\kýcùª£G’ \1 WO7‘×»âÐÂcQ\ ThF2w Y:-Ö}sµa,ƒ½ž³eTO“ê£ >¾á *ÖÙ…g??¾áˆžáK횎 0ª±è¼¸0+P NJü–Oôç?=»´ ÷÷PØøƒû8J>ñÇ ñ^âŠÙ1ÄŸu„}{ ¼Í¸+À UFŒ¡°ôcVD{±z0s–i$AüRÿþýŽb:¯ ´ž‘ÖoónAÞÚ¡-M;xÙBQ„ðÂ/Ôæ˜­‹ñœøÍ5•V@ õx­Ào´òæjƒ+Í6Öyš4‡Xu@‚A—˜@ŒãÂdâ}ÐeÍš5³Å~¯g_&þ¢úÄ(ÄórRâ?°%Àku‹÷ò}æjVñÀößþöê‰ðLrT~Dü¾Á^‹]6ÛäÇ¿cYß6Í_—_fòÌ]ñûÊ¥´B¼‚ùЬ+À ®˜‰«€~¬½¨¥èœæˆ>÷°¿øâ‹´/F8 nÛ"Ç|ƒ×-] à üm@ŒKŒšª-Ðü žF±;¾ÀmIü333S H4f‹e¿p ·oN|‚ ÓÄÿAÿÚ—"„Êb &c;"‡8pUùòåE/c¦¯j·¥ áÞÔEòèÎKüQ§<àÇ?|à÷O{¢D‰Ïž:”üø™ÿ"þß1ÖE³u3w¬Üý‹fÅÿ•o’¾cS%~8>ýùçEòöà“bXV@kôÃY®ÞÚÄèG~øöÅt^,îKÆ~Û¡Ø ´klYº¨šÍ@ø|ZèJHFs¬Z…b2ë —}8÷ýÅŸä`ÿ²Â°ÖËsͲp¬GÃqšø  zš˜Ø@á}ÐMøØ"*„ÎâãZo(X÷M‰öìÙrÿbT` ÍëÙ—‰_Ï}Çe,RÀÙ‰~ü›WÍxé…ʸÙ:~òaTÐj´ïé#¿»p¶º©ÍGÍp¿½ôBÏ]KÃ:&ÃÆŸísúÈo.œ-!þ‰C;½ò³¦¬-ßýiLð^sÄŸ‘è W3·`XBTÀt}.<<ÆhkêÇÜÄë2ʈà?˜6ŠØSlj{Â[ˆ‹/ÖØÒéõ.”Ã.š äÜOhŽïr h®èÅIÁ›_:±>¾!Í1›YÔ)[âµáDp8QR>MÌÆ,a±Hlÿ¢˜ì²Ok™!¿6ñÃMK¼í·Ô®t‘TÀ5ˆŸfîN?ðÉbÅú¾sðñm áíAüXÙ7ÐìÒYG<þߦþP¯Ö ª¬Ó¾ŸçZs¬/¶³cO‘|@ðI±¬€E ¨Fí¬S§ 튙» â~”¦L™B±;i¡.Ô¨•iÛúGýDêz¼ÞMI ,ŽPF(8â#TŽ4×&u˜Øi@ûåsÔÊ9²Dâ4Q!|‡E…òh§ƒaƤMü —­íÛ·Ûh¿×³;¦(XtáqaV @œ”ø_|¾â» ëùX¡ˆÎyhçÒwÞªƒ§aÙ2Ï`Ï~»æÌäàGĿе³&ñ¯_ØïÝwjª²~ƒ·_ßçñ[¬OîܺRàÕÆXV€pƧx¨V¬XÑ÷):'ÅêQ%~,| “óÇL»×¬YÎBP àk ë‹}è° “åÓpõÌý\ÆìXsÍ@Œ ·EKÎý")X_g”}:"¹ ɧ‰ÑæH¨ŽF0Ì aáæ¤‡øûöí+zÓÞKíŠÁ¢$Y$&f TÀI‰¿ï/aýÓkO+pÅ‡í§¼hö? Ô­SsëÚYb»á?¿WçWϪkîî^=²ýG¯ (¿Ÿ^­ùòªÅ“u²>ãˆ=Þl\€`ÜGÌ"…^~®bý&˜í $~„ÙAZ¶lÙK/½D»#f?9ùja̶=!Œ=y·#a€!¼Þ5zÍÆ$`ØÂÍ«êÂŽ)¹:»|»>Zb®BüÕ¢U¨àÝTk“‡"˜Ø€à¡˜z«Ÿøß}÷]Ñö^jW?NG§’\ŒЩ€“?¢s.ž;ŠBò÷ø®#yõÈ9òÔŽ_~ú>(ÿ“GÖ) òÏ̤|âô\àúyþ©CóÌ Ø?ËßLÏÍã¿ïÒ¢X±˜šö+W|vÞ¯#-b}*|1=Jç5ÇÅXV€p@É/¼ ô–üꫯ´müDüpŽG±_~ù…böcFïâÅ‹!y®Ûý¨!55•¦áåÑTs="fÓ¢>A˜;4‚ñ‹¸@Ú¤–õôô¤ñ,Ùæ*¤p¹)}¡ ¹ì›Hd—}Ô7|âÀ G?ñ{xxüû߇²°÷R»‚øõ¸3¹ÃMÄçh ÎKüˆÎ ¯ž·ß¬õÈ–_C•é±ñÃ÷¢Ð  }QI>ñŸ9xh^ÈDü~;§÷ûñ“âÿþ§)ë—+ûÌèa=5¦çjÒ“ ¼.¹*V€`Š€ðwÿý÷ÏÛ×_ kΫG? ¡ô=¦iÓ¦TÂwÍaì§©´†$„"RÇÄYxæÈš#¾'<ˆ¼áµõêUqDš` øì€(FåaA7%uæÂe_>œ”<˜A°1Ûþ9æfÃш&'àÿuˆ )Ž'lüðæ‡Ÿ¬û?±Úµk'ºÏKíñc r¸øùœM§&~Äã‡ÿÀŸ¿Áý†ü‹fŠ Ùkš×.R³zþ×ÏJËôã飛U‹Y±ÄŸ|æX¹hä‰Ã¿©ðliSÖòÉbýzæ¿Ý Ó¾Øå\ü1g»¸¹=¬+À 8ƒ½zõR Z޼IòE¬±E å®\¹R&u 9­–…¡Ð\®P¶Ä£rÀºø«X6Ët¶±Xö íDk)‚'vôíÁ°”øûôéóÌ3ùþÃ"9`©]"~‹æW8ÃÎmp \€øáÇ¿eõ¯ä¸ß­ë'ÛàäcšGúÄOcóÞ»\µ˜Eó‰?òð©ƒs]=ÏÔ³ÚK•LY[ºvnsÊw³-¬Oû2ñ»Ä ÏdXBQ>9äŸ#§öíÛCµˆÎ©Mü0QÃ#ý´ûsÏ=ó3Nh+ó±-ô¬'‹>Z„ôQ 9ÌðŠ(ûBLEK0J«ábCc|L h® sQ}Äç‚ló4ü 5¶P¾!ÐÇLH@”}QX`G|ÁÀñ£„*Ыëm‰IrA=avl/ƒ>-”«”Z´p â¦#$ÓÆoâÞƒ‡æÀ}ê¸~5«?^´üãVM5JêAÿ¿ˆΩƒ®š×-üæë¯¨²~Ëæõ„ÝÔ9`â/ÚO >;V€°QDÜGìÅÓ1|6lØ ‡øßH Y¯^=ªN>ÉÇ@î'R7Es˜á…“Œ9@ênßàrÐ6¹ !!0ŽŒæ€ZíØ>ŠObÑ_úz€ÿcæˆÃÉ ð>QøÂ€5ˆø—/_^«V¾“pƒ 4ˆßÞ{ï=Ó7fÉ’%'Mšd;Êë©Aá[eãUÇ»³B'%þΟ¶л+yõÀƼ›òˆA?Ðl]ÐüqÏÕb»âÇš%“ßm”?< ¬)ƒÍ•ÔÞâOŠô 80ÛóŽU£›5ª­Êú»¹}Ã<(¯³??VXV€ÐVÞ8ÂN/?œ{÷î] Ÿˆ¾1HC‡ƒR X®‹æÝ÷ÛžÑíõ€ž-Z±‹,ôbwT…ïp­‘¦ð Ò¸_ì ÷­[·ÂÖŽiÍr Åh?°v¢ ÂºOÄðàÁŽ;’V¥K—ž5k–*ñïÛ·ï믿F<%Ó—fÛ¶m1fÐ놔Á§ ¾X{(à¤Äߤa]Üu˜¶{ìàÊGÄÿwèÜ*?TÖ“Åžø¹ÇáþŠâŸû·-ú´msº{+U(ßíËv;7Î1WXu{>ñGB|×ÊûÖû¢ýã™^Ї—a7uÿù„ö¸@¹NV€`Š˜ÖR¥J)ÎuëÖŲ¯æüøáÕ#?ÈÈÛ¿á)„ ÞŠüà Løþ€Ð:Ì‘û­U ¾ÜLG¶´Cqt¹0±ø§<Á7È‚ñ?F?ÿü3­h†ôÍ7ßàDTgîŽ?^á²O»¼ñÆŽYoK Љ~K±T=.Ï NJüˆÎùC·¸ß sÙüÿÆžÞ©È›WM'ï ü™ÃM ˆ-Ç­êñmG ôùú·Å?ñûïŸé*ùð։ݻ¶4ŠgƤÁ:ñÝŠb“Ÿ)¬+À èT`ŸôƒM±æ®êÌ]SâGlM$¸¬tïÞêAøLê¥Èý²•ÝFúñ“s?ŽU ±ñõÈ(c¼¹ãÂkÎ3:ÃÑ ˜äá¾oZ›ü¡!z fB â_°`A… HHiª3wq^k):ÿÄ<éùóçb³×_ :TÏÚ:¯1.Æ (p^âGtÎÕ¿O RÿñÛŽ1§wšæ±#zR·ë×Þ±a¶j±‹y}Ññ#ŒèÞÆŽø'6jì•AÄ¿o¦Kd„Ý,óÌcc†üü*Y¢¸-a7uÒÿõ¼ÿ ëÆw+À °¬€¶¦KóâÑýé§Ÿ‚­á†NÑ9)V)ñˉèòð<¡Ç>"÷£Z æ&†KŒí -¡¹¼kÖ¬ÁqUOJžM S:÷5w\xÚÐ4\8Òh¯,‹ÁŽˆ’¨P®Mž@ŒsÄà>Q˜MÄáAãÆI ¬‡0oÞ<ÕX=;vì#oŠ—&>› ¶>è'u£JŸŠoVÀ~ 85ñÃ^=ï6z·bÝÚÕì^ ·~Eô^×­Ëã']‡¶¨–Qì²cý,ì"£ÿÀ>_›ÖŒ-I§#žÜ÷«“çñC»V(ÿ?AÄèá…°›½~øÂư›:‰ÿÁ½Ûö»L¹fV€`Ф˜Î‹À; s¥J•°æ®ñ“7¿" [¶lIU¡Nô„bpÛý0¢£©Dê»wï†-_t ÿð˜§Ù´p²OOO—G–xÅð‘ûi.TˆjMCÓ`ö*ª¢(û€xQ!ÎE8½ N4¦}¸Bñ#¤8#ðÁ.=bæ®":'–6+^¼¸BvübødÁ[T»ïÉÜ©NÊÙ‰?&“w·ì“#ìæ‚_‡ÑEÞ¿u> Z¼÷ΚÅT‹™îÕçÇÎ/¾P TËçø“{g8m^8a7+š>¶°å³ö- »©‡øyÚ®SÝÕÜV€p!`ïÒ¥‹écÆ~ ¬ÂÆOÞü ‘ŽFX¸AÌÄý†ØûAêØ/¯±¨¥(œ 4£›NÏU ?06 ¬‡!æ|ê2€/æÚÒ`~8ò·Ù§èÆø‚A‘ þ1cÆ—ýÏ?ÿ“"äX=‚ø1s·jÕª¦j¿üòËð5²ˆÑ ,¬ý­Ã….fnª3+àìÄ3?å+¦’Ï7]ÚžòZ+¶Ë?Pæ?-›Ð\³ú “ÿû³j1ý3ó‰ÿÄÞéN˜WÍë×àÍꪬ°›‡÷,×CêF•a'~g¾É¹m¬+àü ¨NçE@žiÓ¦‘WE Äüꫯ â0Šša&·1a5\"uJ´\®Vcú)q¿HpÅ!×Ô‰…Àè3Ƙ†+ÊÐú¾Ô‰Kµi¶%ì.ž¾õÖ[ˆÚ)Çêñøôb,$¿:!2F ⻥Ua…ç¿>¹…E@''þmÑçS^k`¿Ç ôDóÿóWñÏû~ïܱ"ùPÉ}¾ÂŽæ koÏ'þ°ý'öLsª¼mù°MUfá|vsãÊ_âxýõܼƬ"ð4àS`XÂTkÓé¼x°#?|`,"~*<}út±’üûGŒAóz á~"ušË^7ÚRÊmÀhA,ñ .LjB°¾ü¡CxûPSJ0ä·hÑ‚ð½lÙ²XÆXŽÕ#lü^^^Ô£yóûï¿/—}1*ÈÊÊ2·¨Ya^‹|좨€sÿ)h“<ÆÐJò¯[»ÚÆåSL ЖS^«ÑŸ> €þàûº_Í6·ý1ñïžzÂ9òžÕ#;·kR¬Ø?T¾H¾Xeñ¼±úÝÀ’éIEñÖàsbXV €Qß4v'¦“þôÓOpU''‹Òo¿ýöÎ;ùÆ2$ÄóAO -pb†p¿l­·(‚'@Îý¢8åcaîCAnn.<DBðM,b@ÁIñüß˱zD<þáÇ—)SÆô¥ {ÿ‘#G,µÇ[ŽÅY÷˜»²ÐˆÏqV¥ê¾-¿†[~|]ĉ ‘'7!:'bõ˜Ë!Ç6öþ¡YñÛ·yÿèþe%'éóâó•ÛÊ< ô_õÛ8Êå?øÂöß=¥Ð³·Ç„ï»4/þï¿Eê•+ûÌÄ1} $xK«b¿»>=ø¼YVÀ. ÀuµL!{¬ ÿu+"Ø`b€¨³C‡´^/¹ø’0£ÑîM§ášÓ¡i`¤W=´ÌÁH`n.h^$ØòaѧsP>>>âO²ÕªUÕ««ø¾V®\yÉ’%Ʋ»µ1îÛåæáJÍ+PhįXw°âse÷oõ?İ5J3Þ±¨y³·q×(þソ ñÛ Q~Õ¢qß|ñqÅGh æO¢}ˆ|âÝw|×”Â̓{µ/ý´zØÍ!ý¿ Þk)£Xž üüxaXVÀ :tÈ4ŒÞ_w€5…ï´4aÇ=zˆ®ð’§öÚÈý4ãA{€ÝºôÀ½ž\ö•]öaïÇ× Ô&f ¿þúëô¯Q£ÆŠ+ä¿ÒoxéÀ§U«V¦C&¸ìc¹b¸þ[èÆîg¶îÛã®á:5(4âÇú#”+߀þs„f~=yñœ‘/>Ÿ¬ÿŸ7}p»x¬Þû‡ÏkV{|h|(hýacT¢º#ˆ?>tï±]“ +OÑõ¹òO›>¶vóû¯?uLØMíáøùù °¬€@8ß›¾䵺ä9¬:ƒ¶Q-b€RÍxcj/…ðpÛÂý m Ó‰¯`ÃV• hª.þâp2ë£%ØpEÄ#5^:£F’ÿ*~#ô~Ïž=ÅRIJtX²5Ü­«fSØéšájYs ñ£A¦Ð_¦t©­«¦WE¹ï/a¶'îŸ4ºw°ßúw÷ܱpXÿno¿ùíe–øCöÛ9ÉñyþÄî¯U¯bú ÇG†ÝÔÆ}ÑÃOV€`ì­0ZuFïÛo¿ h†Ç‹ÕiæÌ™bÅYrñLJrõ[—ૃ/ ÆV„×úÀSž?Þ£D݇ QzB¥„€ý}ûöß%ÐH„ô‘ ˆß³gÏVuÙã7°°utnø^òRö¾r¸~V@V 0‰_úKÿ×ú¥Ïøo¶4ûî]üÃ7í±;˜v{wÿ [ôT‚bžÛ¨–Ì·ñ‡ìñÛ9Ñ‘yÅì>ï¼QM•õ›5ykŸÇoúäØRUFràŸþÁ·+À °¬€€ÞtF/ÞVƒµ·ä6–þÞ¸qãþóñÒÉ«öÂ$ ·ý/]º$àȈ¦Ó0¾ûÖ—[°Î<ò1W¤ T¨PÚÖ¨Q£mÛ¶É¿q õë×7}o–+Wnþüù†S»ÕB\*|V@UB&~´ _áJ(ߨð´3´{¤ÿ&+òé£k‡öû†üõQOû›íÞ4ËŠzh—ŒÄ øÝ~;&8&ï\9´õ×S<¹ê½^³PÂnšœ=Ê‹ìò3…`XG*o̸UµuîÜHm)ëËå±ûرc_|ñEQÿûï¿/ò·šû±*ðúõëEä~Z‘Wf}aÚ‡o¼}°D®H@|áwp—ÿ*~ã£DÇŽÕ|_ŸìÕ«WáFÞT 0ìqäÕÂÇb >ñ«B?îÞN><í»>ÖåãûÖ¨ö<=š4¨»rá+êÉ'þàÝ~ÛÇÛ;ï_;âó¶ ‹=¡v³rÅg +ì¦Æ€Û7/ó½Ä °¬+àxÀ¸ŠYpô¦£ •l/G±´â7ìå?/ò‡# ìôÖ™üáºK<ÜúZTv¬™™™ð° .ûbb4£OŸ>ò_åß 픡¿eË–ÇŽ³ÚoøŽ©©©XKØñ— ‘p"¯ÑXúaNP Ó쇶͋<¹Ñê ÐoÞô-ª¶lé§;uhñýõVâ Þutû8ûåÛG÷øª…s†ÝT%þÔž­ËV€` QØÝÍ9ù lå°aÀ×6&`ú¤I“0U@ööÁZ4ëV«“ì²õêUà ‘ÐøâÅ‹ÓA•hÿþýò_ÅoœþóÏ?6êÉäðòË/c /Ñݖ ± ú«¯>4+@ 8…_tÆë è‡_þŠ£ÀÇ–¼kï_un]ñ9šó_Ÿü§ÙÜ© ¬ó1ño{Ô>y`6¥Ÿ~üh“O¼d‰âýz]¸a7Uq¾ûìÌÃÏV€`œAXÊàp¯—¦bÅŠ`b9†½Õ¿ñI¡{÷î"þ=^U˜FŒÊÈRô—Yaûárã/¥E‹U«öxæÚbR²üWñspUç1#òæ˜1clAs{웓“ÃQ8áfá68ñ£Aøö'/ÎEÜýëvA>«"N¬·1ïÚ0£×÷Ÿ oŸüМ-Nÿ³¹ÊAü±Á»|·5+À °N«–â27©·I“&€u=L¯§ "oNŸ>ý“O>‘èÉ×;ÛÙ+’ Û›ò¸”¼½½ëñø?~c‹\@ü"ï‘£¬ø g8ú‹„y·íÚµ.û”ÿ*~ÃeÿÛo¿UuÙoÛ¶-F,VC¹ýv¼pá›öÝáÎrÝstv⇲k¥jì/SºÔø?†[c¿œ‘´Í{ËH+òÁõC{wûÐ\ØÍÑÃzÚ•×m©ü\ü±[×y]@×½©¹å¬+À ä+€·'–Ð2gïOöÙg{÷î ±CˆXß¿øåS:xðà?þ("o"â>å•ÀûHu¬‚>0ØÙ­®ùüùóìµÏ·œó+àÄO"ªûó}_©ºlÞð0¿ÕöÈ 1Û¼7°4í…°›ÿ65®PØÍ0ÿí¶¹ýöe7ç¿c¹…¬+À Xªü|Ìù÷ã=ÕªU+¬º…¸ø¦=z æ~ýúa9-JbQ-Äø_µj•Ø.ÿ€_~ݺuM_åÊ•ûõ×_­&rûíˆé ìÆcéÕÈå K—!~ c?žß©³cÝ”P¿UÆæôGÄïµy„þxgÕ®]N8…yÚˆ$ˆÿð_ ¡Bi ¶È?à²ß¦MU—}ÄuÂÈ›E Ö>»ñØû¢åú TÀ•ˆŸN1È!Å3âýwß\óÛèУ«ŒÊˆßÃkÓp=yÁÄoê¾VU•õ[6oìœa7™õ ¼—¸*V€`œ_Ì.E$MÕu»ðþ‚‹ÇŽ=<Ÿµ{Ó²q!¾+¬ÈˆË‘CLóÎå}¿éØØ\ØÍ“ÛÖm©qxò.¤<|ÀŸ#áîã6°¬+à `¹\sî²ôn­P¡BïÞ½÷ïß(zÒ?ü€½~ùå—}%"þ©S§nÙ²åóÏ?W¼‰5wÐeŸYß)®Qn„Í ¸<ñ“àþiÓ¦i**>Wæ§níönœâ³\ñGl9¼a°œ÷­îßëë÷Ÿ)¥Ša7c‚÷ÚåöØ75ÆFý;·®Ø|Áp¬+À °ES¸øÃÕGãM doÖ¬Ùĉýüü4“ ~Dÿ¤DÄß¾}ûgžyÆÔB× A ¬6ÀÛcGÄܼzõ*ÏÍ-š×º[žU!~ê;Š=lοŸ1u^{iÄ€¯·­žì³¼Àüˆø7^?Hä‘?·y¶lIÓ§Õ“Osΰ›™©§¯çeðº¹nywóI³¬+`0ù‹`šªßÏa¡ú=ñvüÕR÷îÝÉÆ¿ç¯×|Õª*W®Œ œö@vëêLKKËÍÍÅ:ÁÖÇû°N¬@‘"~¡3bcÍ?s’£|®ÌgíÞ›2º‡ïîyÁÞËT3¿çúAÈ“‡v|ùùrªuvíÜæ”ïf{Øæ­«aõ³Ó¯æžçh›N|ëqÓXV€pj0»ÏÍ-à%Þ†0Ï2V|Dö‰ˆÿçŸÆë–¸wß}WÍRöäСCccc­Csc÷Bd}xïܺuË©»„Ç Ø @Ñ$~(ÇWàÓ*ßðÿêKßui½`Z?O™ÁÞKEÎ'~ÿM¿MþúõW+«²>ÂnÞ³Ü:.7|¯ô¤€Ü¬x^.׆ÛweXV€P*€ :Ú&z?bM\„Ûß¶m¸Ÿˆ¡ô;wîüÄO˜¾@Û¶m‹©ÀÆR»µÁuçÒ¥K7nÜøóÏ?¹ãY¢­@Q&~Ñs˜f„玹¨>Š'Q‰âÿª_·zoÚNõ£ÇúßZØH•õvsû†y†S»¥ÂiçRf üvx2nѾQùìXV€(\`òG`Ÿzõêi?Ç_«U«FqxÝß´0Û·o·‚ÎÚEP>ûèîÅGw°nAüBSø&båíiI>Ëvsñ¼±–¢¹!åá®Ä¿œ“Ä¿{ûºƒ¯>+À °¬+ô_¼x±vlÕ7i¹rå°—Qி|ðÏÊÊ"[>S>_Àn«€{¿èfÄÿ‚{¢¥¬reŸq@ØMÂz2Þ_ÎIB0ÍÛ7/#ÿñ#»í}Ê'Î °¬€Ó)€(yðчùقû±Ä/¾´; ò&Üñ÷.\ÈËË»yóæíÛ·N5n+PH ¸)ñ µÞóŠð$Òžé ŒP¸º‰Ë °¬+À 8©ô&Å'tUïÙ:ÀÊî¤Mçf±n£€»¿¢£ãââðØÂ|_˜ÿiÊ/LˆO K†Û\|¢¬+À °¬€• =zF4zâMŠY¿VVÄ»±¬€¡ üÿxƒÚº¶„×IEND®B`‚dibbler-1.0.1/doc/dibbler-user-bibliography.tex0000664000175000017500000001231312413230313016346 00000000000000\newpage \newcommand{\rfc}[1]{\href{http://tools.ietf.org/html/rfc#1}{RFC#1}} \begin{thebibliography}{1} \bibitem{rfc2030} Mills, D., ``Simple Network Time Protocol (SNTP) Version 4 for IPv4, IPv6 and OSI'', \rfc{2030}, IETF, October 1996. \bibitem{rfc2136} P.Vixie, S.Thomson, Y.Rekhter, J.Bound, ``Dynamic Updates in the Domain Name System (DNS UPDATE)'', \rfc{2136}, IETF, April 1997. \bibitem{rfc2845} P.Vixie, O.Gudmundsson, D.Eastlake and B.Wellington, ``Secret Key Transaction Authentication for DNS (TSIG)'', \rfc{2845}, IETF, May 2000. \bibitem{rfc3263} J.Rosenberg and H. Schulzrinne, ``Session Initiation Protocol (SIP): Locating SIP Servers'', \rfc{3263}, IETF, June 2002. \bibitem{rfc3315} R. Droms, Ed. ``Dynamic Host Configuration Protocol for IPv6 (DHCPv6)'', \rfc{3315}, IETF, July 2003. \bibitem{rfc3319} H. Schulzrinne, and B. Volz ``Dynamic Host Configuration Protocol (DHCPv6) Options for Session Initiation Protocol (SIP) Servers'', \rfc{3319}, IETF, July 2003. \bibitem{rfc3596} S. Thomson, C. Huitema, V. Ksinant and M. Souissi ``DNS Extensions to Support IP Version 6'', \rfc{3596}, IETF, October 2003. \bibitem{rfc3633} O. Troan, and R. Droms ``IPv6 Prefix Options for Dynamic Host Configuration Protocol (DHCP) version 6'', \rfc{3633}, IETF, December 2003. \bibitem{rfc3646} R. Droms, Ed. ``DNS Configuration options for Dynamic Host Configuration Protocol for IPv6 (DHCPv6)'', \rfc{3646}, IETF, December 2003. \bibitem{rfc3736} R. Droms, ``Stateless Dynamic Host Configuration Protocol (DHCP) Service for IPv6'', \rfc{3736}, IETF, April 2004. \bibitem{rfc3898} V. Kalusivalingam ``Network Information Service (NIS) Configuration Options for Dynamic Host Configuration Protocol for IPv6 (DHCPv6)'', \rfc{3898}, IETF, October 2004. \bibitem{rfc4033} R. Arends, R. Austein, M. Larson, D. Massey and S. Rose ``DNS Security Introduction and Requirements'', \rfc{4033}, IETF, March 2005 \bibitem{rfc4242} S. Venaas, T. Chown, and B. Volz ``Information Refresh Time Option for DHCPv6'', \rfc{4242}, IETF, Nov. 2005. \bibitem{rfc4075} V. Kalusivalingam ``Simple Network Time Protocol (SNTP) Configuration Option for DHCPv6'', \rfc{4075}, IETF, May 2005. \bibitem{rfc4649} B. Volz ``DHCPv6 Relay Agent Remote-ID Option'', \rfc{4649}, IETF, August 2006 \bibitem{rfc4704} M. Stapp and B.Volz ``The Dynamic Host Configuration Protocol for IPv6 (DHCPv6) Client Fully Qualified Domain Name (FQDN) Option'', \rfc{4704}, IETF, October 2006 \bibitem{rfc4861} T.Narten, E.Nordmark, W.Simpson and H.Soliman, ``Neighbor Discovery for IP version 6 (IPv6)'', \rfc{4861}, IETF, September 2007 \bibitem{rfc4862} S.Thomson, T.Narten, T.Jinmei, ``IPv6 Stateless Address Autoconfiguration'', \rfc{4862}, IETF, September 2007 \bibitem{rfc4941} T. Narten, R. Draves, S. Krishnan, ``Privacy Extensions for Stateless Address Autoconfiguration in IPv6'', \rfc{4941}, IETF, September 2007 \bibitem{rfc4994} S. Zeng, B. Volz, K. Kinnear, J. Brzozowski, ``DHCPv6 Relay Agent Echo Request Option'', \rfc{4994}, IETF, September 2007 \bibitem{rfc5007} J. Brzozowski, K. Kinnear, B. Volz and S. Zeng ``DHCPv6 Leasequery'', \rfc{5007}, IETF, September 2007 \bibitem{rfc5460} M. Stapp, ``DHCPv6 Bulk Leasequery'', \rfc{5460}, IETF, February 2009 \bibitem{rfc6333} A.Durand, R.Droms, J.Woodyatt, Y.Lee, ``Dual-Stack Lite Broadband Deployments Following IPv4 Exhaustion'', \rfc{6333}, IETF, Aug. 2011 \bibitem{rfc6334} D.Hankins, T.Mrugalski, ``Dynamic Host Configuration Protocol for IPv6 (DHCPv6) Options for Dual-Stack Lite'', \rfc{6334}, IETF, Aug. 2011 \bibitem{rfc6939} G.Halwasia, S.Bhandari, W.Dec, ``Client Link-Layer Address Option in DHCPv6'', \rfc{6939}, IETF, May 2013 \bibitem{draft-aaa} Vishnu Ram, Saumya Upadhyaya, Nitin Jain ``Authentication, Authorization and key management for DHCPv6'', work in progress (expired), draft-ram-dhc-dhcpv6-aakey-01, IETF, August 2006 \bibitem{phd} T. Mrugalski, ``Optimization of the autoconfiguration mechanisms of the mobile stations supporting IPv6 protocol in the IEEE 802.16 environmentdfdf'', Ph.D dissertation, Gdañsk, Oct. 2009 \bibitem{networks2010} T. Mrugalski, J.Wozniak, K.Nowicki, ``Remote DHCPv6 Autoconfiguration for Mobile IPv6 nodes'', IEEE 14th International Telecommunications Network Strategy and Planning Symposium, Warsaw, Poland, Sept. 2010 \bibitem{atnac2010} T.Mrugalski, J.Wozniak, K.Nowicki, ``Remote Stateful Autoconfiguration for Mobile IPv6 Nodes with Server Side Duplicate Address Detection'', IEEE, Australasin Telecommunication Networks and Applications Conference, Auckland, New Zealand, Nov. 2010 \bibitem{draft-route-option} W.Dec, T.Mrugalski, T.Sun, B. Sarikaya, ``DHCPv6 Route Options'', MIF WG, work in progress, draft-ietf-mif-dhcpv6-route-option-03, IETF, Sep. 2011 . \bibitem{draft-remote-autoconf} T.Mrugalski, ``Remote DHCPv6 Autoconfiguration'', work-in-progress (expired), IETF, July 2010 \bibitem{draft-timezone} A.K. Vijayabhaskar ``Time Configuration Options for DHCPv6'', work in progress (expired), draft-ietf-dhc-dhcpv6-opt-timeconfig-03, IETF, October 2003 \end{thebibliography} \addcontentsline{toc}{section}{Bibliography}%\hfill \thepage\\} dibbler-1.0.1/doc/dibbler-user-config-relay.tex0000664000175000017500000004134112413230313016255 00000000000000\newpage \section{Relay configuration} \label{relay-conf} Relay configuration is stored in \verb+relay.conf+ file in the \verb+/etc/dibbler/+ directory (Linux systems) or in current directory (Windows systems). \subsection{Global scope} Every option can be declared in global scope. Config file consists of global options and one or more inteface definitions. Note that reasonable minimum is 2 interfaces, as defining only one would mean to resend messages on the same interface. \subsection{Interface declaration} Interface can be declared this way: \begin{lstlisting} iface interface-name { interface options } \end{lstlisting} or \begin{lstlisting} iface number { interface options } \end{lstlisting} where name\_of\_the\_interface denotes name of the interface and number denotes it's number. It does not need to be enclosed in single or double quotes (except windows cases, when interface name contains spaces). \subsection{Options} Every option has a scope it can be used in, default value and sometimes allowed range. \begin{description} \item[log-level] -- (scope: global, type: integer, default: 7) Defines verbose level of the log messages. The valid range if from 1 (Emergency) to 8 (Debug). The higher the logging level is set, the more messages dibbler will print. \item[log-name] -- (scope: global, type: string, default: Client). Defines name, which should be used during logging. \item[log-mode] -- (scope: global, type: short, full or precise, default value: full) Defines logging mode. In the default, full mode, name, date and time in the h:m:s format will be printed. In short mode, only minutes and seconds will be printed (this mode is useful on terminals with limited width). Recently added precise mode logs information with seconds and microsecond precision. It is a useful for finding bottlenecks in the DHCPv6 autoconfiguration process. \item[interface-id-order] -- (scope: global, type: before, after or omit, default: before) Defines placement of the interface-id option. Options can be placed in the \msg{RELAY-FORW} message is arbitrary order. This option has been specified to control that order. \opt{interface-id} option can be placed before or after \opt{relay-message} option. There is also possibility to instruct server to omit the \opt{interface-id} option altogether, but since this violates \cite{rfc3315}, it should not be used. In general, this configuration parameter is only useful when dealing with buggy relays, which can't handle all option orders properly. Consider this parameter a debugging feature. Note: similar parameter is available in the dibbler-server. \item[client multicast] -- (scope: interface, type: boolean, default: false) This command instructs dibbler-relay to listen on this particular interface for client messages sent to multicast (ff02::1:2) address. \item[client unicast] -- (scope: interface, type: address, default: not defined) This command instructs dibbler-relay to listen to messages sent to a specific unicast address. This feature is usually used to connect multiple relays together. \item[server multicast] -- (scope: interface, type: boolean, default: false) This command instructs dibbler-relay to send messages (received on any interface) to the server multicast (ff05::1:3) address. Note that this is not the same multicast address as the server usually listens to (ff02::1:2). Server must be specifically configured to be able to receive relayed messages. \item[server unicast] -- (scope: interface, type: address, default: none) This command instructs dibbler-relay to send message (received on any interface) to speficied unicast address. Server must be properly configured to to be able to receive unicast traffic. See \emph{unicast} command in the \ref{example-server-unicast} section. \item[interface-id] -- (scope: interface, type: integer, default: none) This specifies identifier of a particular interface. It is used to generate \opt{interface-id} option, when relaying message to the server. This option is then used by the server to detect, which interface the message originates from. It is essential to have consistent interface-id defined on the relay side and server side. It is worth mentioning that interface-id should be specified on the interface, which is used to receive messages from the clients, not the one used to forward packets to server. \item[guess-mode] -- (scope: global, type: boolean, default: no) Switches relay into so called guess-mode. Under normal operation, client sends messages, which are encapsulated and sent to the server. During this encapsulation relay appends \opt{interface-id} option and expects that server will use the same \opt{interface-id} option in its replies. Relay then uses those \opt{interface-id} values to detect, which the original request came from and sends reply to the same interface. Unfortunately, some servers does not sent \opt{interface-id} option. Normally in such case, dibbler-relay drops such server messages as there is no easy way to determine where such messages should be relayed to. However, when guess-mode is enabled, dibbler-relay tries to guess the destination interface. Luckily, it is often trivial to guess as there are usually 2 interfaces: one connected to server and second connected to the clients. \item[option remote-id] -- (scope: global, type: option, default: none) Tells the relay agent to insert remote-id option. It is followed by a number (enterprise-id), a dash (``-'') and a hex string that specifies the actual content of the remote-id option being inserted. Remote-id is specified in \cite{rfc4649}. \item[option relay-id] -- (scope: global, type: option, default: none) Tells the relay agent to insert relay-id option. It takes one parameter, which specifies the actual content of the relay-id. The parameter must be specified as a hex string. \item[option link-layer] -- (scope: global, type: option, default: none) Tells the relay agent to insert client link-layer address option, as specified in \cite{rfc6939}. It should be noted that the source MAC address is extracted from incoming link-local (fe80:...) address or from client-id. Both methods are not reliable and susceptible for spoofing. This was implemented mostly as a testing feature for the server implementation. \end{description} \subsection{Relay configuration examples} \label{example-relay} Relay configuration file is fairly simple. Relay forwards DHCPv6 messages between interfaces. Messages from client are encapsulated and forwarded as RELAY\_FORW messages. Replies from server are received as RELAY\_REPL message. After decapsulation, they are being sent back to clients. It is vital to inform server, where this relayed message was received. DHCPv6 does this using interface-id option. This identifier must be unique. Otherwise relays will get confused when they will receive reply from server. Note that this id does not need to be alligned with system interface id (ifindex). Think about it as "ethernet segment identifier" if you are using Ethernet network or as "bss identifier" if you are using 802.11 network. If you are interested in additional examples, download source version and look at \verb+*.conf+ files. \subsubsection{Example 1: Simple} \label{example-relay-1} Let's assume this case: relay has 2 interfaces: eth0 and eth1. Clients are located on the eth1 network. Relay should receive data on that interface using well-known ALL\_DHCP\_RELAYS\_AND\_SERVER multicast address (ff02::1:2). Note that all clients use multicast addresses by default. Packets received on the eth1 should be forwarded on the eth0 interface, using multicast address. See section \ref{example-server-relay1} for corresponding server configuration. \begin{lstlisting} # relay.conf log-level 8 log-mode short iface eth0 { server multicast yes } iface eth1 { client multicast yes interface-id 5020 } \end{lstlisting} \subsubsection{Example 2: Unicast/multicast} It is possible to use unicast addresses instead/besides of default multicast addresses. Following example allows message reception from clients on the 2000::123 address. It is also possible to instruct relay to send encapulated messages to the server using unicast addresess. This feature is configured in the next section (\ref{example-relay-multiple}). \begin{lstlisting} # relay.conf log-level 8 log-mode short iface eth0 { server multicast yes } iface eth1 { client multicast yes client unicast 2000::123 interface-id 5020 } \end{lstlisting} \subsubsection{Example 3: Multiple interfaces} \label{example-relay-multiple} Here is another example. This time messages should be forwarded from eth1 and eth3 to the eth0 interface (using multicast) and to the eth2 interface (using server's global address 2000::546). Also clients must use multicasts (the default approach): \begin{lstlisting} # relay.conf iface eth0 { server multicast yes } iface eth2 { server unicast 2000::456 } iface eth1 { client multicast yes interface-id 1000 } iface eth3 { client multicast yes interface-id 1001 } \end{lstlisting} \subsubsection{Example 4: 2 relays} \label{example-relay-cascade} Those two configuration files correspond to the ,,2 relays'' example provided in section \ref{example-server-relay2}. See section \ref{feature-relays} for detailed exmplanations. \begin{lstlisting} # relay.conf - relay 1 log-level 8 log-mode full # messages will be forwarded on this interface using multicast iface eth2 { server multicast yes // relay messages on this interface to ff05::1:3 # server unicast 6000::10 // relay messages on this interface to this global address } iface eth1 { # client multicast yes // bind ff02::1:2 client unicast 6011::1 // bind this address interface-id 6011 } \end{lstlisting} \begin{lstlisting} # relay.conf - relay 2 iface eth0 { # server multicast yes // relay messages on this interface to ff05::1:3 server unicast 6011::1 // relay messages on this interface to this global address } # client can send messages to multicast # (or specific link-local addr) on this link iface eth1 { client multicast yes // bind ff02::1:2 # client unicast 6021::1 // bind this address interface-id 6021 } \end{lstlisting} \subsubsection{Example 5: Guess-mode} In the 0.6.0 release, a new feature called guess-mode has been added. When client sends some data and relay forwards it to the server, it always adds interface-id option to specify, which link the data has been originally received on. Server, when responding to such request, should include the same interface-id option in the reply. However, in some poor implementations, server fails to do that. When relay receives such poorly formed response from the server, it can't decide which interface should be used to relay this message. Normally such packets are dropped. However, it is possible to switch relay into a guess-mode. It tries to find any suitable interface, which it can forward data on. It is not very reliable, but sometimes it is better than dropping the message altogether. \begin{lstlisting} # relay.conf log-level 8 log-mode short guess-mode iface eth0 { server multicast yes } iface eth1 { client multicast yes interface-id 5020 } \end{lstlisting} \subsubsection{Example 6: Relaying to multicast} During normal operation, relay sends forwarded messages to a \emph{All\_DHCP\_Servers} (FF05::1:3) multicast address. Although author does not consider this an elegant solution, it is also possible to instruct relay to forward message to a \emph{All\_DHCP\_Relay\_Agents\_and\_Servers} (ff02::1:2) multicast address. That is quite convenient when there are several relays connected in a cascade way (server -- relay1 -- relay2 -- clients). For details regarding DHCPv6-related multicast addresses and relay operation, see \cite{rfc3315}. To achieve this behavior, \emph{server unicast} can be used. Note that name of such parameter is a bit misleading (``server unicast'' used to specify multicast address). That parameter should be rather called ``destination address'', but to maintain backward compatibility, it has its current name. \begin{lstlisting} # relay.conf log-level 8 log-mode short iface eth0 { server unicast ff02::1:2 } iface eth1 { client multicast yes interface-id 5020 } \end{lstlisting} \subsubsection{Example 7: Options inserted by the relay} Typically relay agent receives messages from clients, encapsulates them and sends towards the server. The only option being added is interface-id option (if specified). However, in some cases it makes sense for the relay agent to insert additional options. Dibbler relay supports several options that can be inserted: \begin{description} \item[remote-id] -- Remote-id option may identify the remote client. Dibbler implementation is very simple, as it allows setting only one specific value, not unique value, one for each client. That makes this feature useful for testing purposes, but its deployment in a production network is unlikely. Remote-id takes two parameters. The first one is enterprise-id, a 32bit unique identifier that characterises a vendor. The second parameter is arbitrary length hex string. Remote-id is specified in \cite{rfc4649}. \item[echo-request] -- In some cases, relay inserts options and would like the server to send them back in its responses. Typically, those options are then processed by the relay to correctly send back to the client. Dibbler relay does not need such options to operate, but is able to simulate them. It is possible to specify one or more options that the relay requests the server to echo back. This option takes a list of coma separated values that designate option codes. Dibbler relay will insert options with specified option codes, but they will not carry any useful value. Echo Request Option is specified in \cite{rfc4994}. \item[relay-id] -- Relay agent may be configured to insert interface-id option. However, that option identifies an interface within each relay, but not necessarily the relay itself. In some cases it is useful for the relay agent to insert an option that identifies itself. That is implemented as relay-id option. This is particularly useful for bulk leasequery. This option is defined in \cite{rfc5460}. \item[link-layer] -- The initial DHCPv6 spec lacked information about client MAC addresses. In principle, the server is able to discover client's MAC address when receiving direct traffic. Unfortunately, it can't do that if the packet traverses a relay agent. That deficiency was addressed in \cite{rfc6939}. It defines an option that relays can insert when receiving incoming traffic from a client. Note that this implementation is not perfect. Instead of getting that information from layer 2 directly (there is no API to do that as of late 2014), it tries to get the information from client-id (DUID-LLT or DUID-LL) or from message source address (if it is link-local and uses EUI-64). This is not a bullet-proof solution, but it should work in most cases. \end{description} \begin{lstlisting} log-level 8 log-mode short # Uncomment the following line to force relay to start including remote-id # option with entreprise-id 5 and content of 01:02:03:04 option remote-id 5-0x01020304 # Uncomment the following line to force relay to send Echo Request Option # asking the server to echo back options 100, 101 and 102 option echo-request 100,101,102 # Uncommenting this option will make relay to insert relay-id option # into forwarded RELAY-FORW messages. option relay-id aa:bb:cc:dd:ee:ff # Uncomment this line to tell relay to attempt to insert client link-layer # address option. Relay will attempt to get that info from client's DUID # or source IPv6 link-layer address. These are not 100% reliable methods! option link-layer # The relay should listen on eth1 interface for incoming client's traffic. # Clients by default send their traffic to multicast. iface eth1 { client multicast yes # When forwarding traffic from that interface, please add interface-id # with value 5555, so the server will know where the clients are connected. interface-id 5555 } # This is a second interface. It is used to reach the server. iface eth2 { # Send message on this interface to the server multicast (ff05::1:3) server multicast yes } \end{lstlisting} \newpage \section{Requestor configuration} Requestor (entity used for leasequery) does not use configuration files. All parameters are specified by command-line switches. See section \ref{feature-leasequery} for details. dibbler-1.0.1/doc/dibbler-devel-00-mainpage.dox0000644000175000017500000000543312277722750016032 00000000000000/** * @mainpage Dibbler Developer's Guide * * @section homepage Dibbler Homepage * http://klub.com.pl/dhcpv6/ * * * @section toc Table Of Contents * - @subpage intro * - @subpage compilation * - @subpage compilationPosix * - @subpage compilationLinux * - @subpage compilationMac * - @subpage compilationBSD * - @subpage compilationSol * - @subpage autotools * - @subpage compilationWin32 * - @subpage compilationWinNT * - @subpage compilationFlexBison * - @subpage compilationDebRpm * - @subpage compilationOpenWrt * - @subpage compilationGentoo * - @subpage compilationDistros * - @subpage compilationEnvironment * - @subpage compilationDefaultValues * - @subpage compilationModularFeatures * - @subpage compilationCross * - @subpage portability * - @subpage portabilityLowLevel * - @subpage generalInfo "4. General information" * - @subpage generalReleases * - @subpage generalGIT * - @subpage generalDocs * - @subpage generalMemoryCpu * - @subpage srcOverview "5. Source code information" * - @subpage srcOptionValues * - @subpage srcMemoryManagement * - @subpage srcLogger * - @subpage srcNames * - @subpage srcParsers * - @subpage srcParsersParsing * - @subpage srcParsersUsingValues * - @subpage srcParsersEmbeddedConfiguration * - @subpage srcCodingGuidelines * - @subpage arch * - @subpage archClient * - @subpage archServer * - @subpage archRelay * - @subpage archRequestor * - @subpage debug * - @subpage debugMemoryLeaks * - @subpage contrib * - @subpage tests * - @subpage faq * - @subpage tips * - @subpage poslib * - @subpage poslibIntro * - @subpage poslibClient * - @subpage bibliography * - @subpage acknowledgements * * Note: some of the links below may not work if corresponding logs are not available.
* * Doxygen: [generation log] [errors and warnings]
* cppcheck: [generation log] [errors and warnings]
* * minimal build: [configure] * [make] * [errors]
* regular build: [configure] * [make] * [errors]
* gtest build: [configure] * [make] * [errors] * [check]
* distcheck: [make] * [errors] */ dibbler-1.0.1/doc/dibbler-devel-04-common.dox0000644000175000017500000001504412304040124015517 00000000000000/** * * @page generalInfo 4 General information This section covers several loosely related topics. @section generalReleases 4.1 Release cycle Dibbler is being released as a one product, i.e. client, server and relay are always released together. Each version is being designated with three numbers, separated by periods, e.g. 0.4.2. Every time a new significant functionality is added, the middle number is being increased. When new release contains only fixes and small improvements, only the minor number is changed. Leftmost number is currently set to 0 as not all features mentioned in base DHCPv6 document (RFC3315) are implemented. When Dibbler implementation will be complete, release number will reach 1.0.0. Since DHCPv6 specification is extensive, don't expect this to happen anytime soon. The above paragraph was written in Feb. 2010, when author was still working for Intel, a company which sadly was not interested in supporting DHCPv6 development. Fortunately, after changing employer to a more DHCP friendly one, the author was able to dedicate more effort to Dibbler and 1.0.0RC1 was published on 2013-07-30, on 10th DHCPv6 standard publication anniversary. Stable releases are often preceded by Release Candidate versions. For example 0.8.1RC1 is a Release Candidate 1 for 0.8.1 release. @section generalGIT 4.2 GIT repository Dibbler currently uses GIT repository available at github.com https://github.com/tomaszmrugalski/dibbler. Please download latest sources from there. Dibbler previously used SVN repository. Please DO NOT use it. It is kept around only for students, who started their theses using SVN, so they can generate diffs easier. Sources in SVN are old, obsolete, buggy and will eat your hard drive if if you try to use it. @section generalDocs 4.3 Documentation There are two parts of the documentation: User's Guide and Developer's Guide. User's Guide is written in LaTeX (*.tex files). To generate PDF files, you need to have LaTeX installed. To generate Developer's Guide documentation, a tool called Doxygen is required. All documentation is of course available at Dibbler's homepage. To generate all documentation, type (in Dibbler source directory): @verbatim make user devel @endverbatim Note that versions 0.7.3 and earlier had Developer's Guide and Code documentation separated. Those two documents are merged and are Doxygen based. @section generalMemoryCpu 4.4 Memory/CPU usage This section is very dated. Memory usage is not currently measured. The binary size is monitored on a daily basis on the following page: http://klub.com.pl/dhcpv6/stats/. This section provides basic insight about memory and CPU requirements for the dibbler components. Folowing paragraphs describe memory and CPU usage measurements. They were taken on a AMD Athlon 2800+ (actual clock speed: 2083MHz), running under Linux 2.6.17.3. Dibbler was compiled with gcc 4.1.2 (exact version number printed by @c gcc @c --version command: @verbatim gcc (GCC) 4.1.2 20060715 (prerelease) (Debian 4.1.1-9) @endverbatim Every Dibbler component (client, server or relay) is event driven. It means that it does nothing unless some data was received or a specific timeout has been reached. Each component most of the time spends in a select() system call. This means that (unless lots of traffic is being received) actual CPU usage is 0. During tests, author was unable to observe any CPU consumption above 0,0\%. In the 0.5.0 release, a compilation options called Modular features was added (see Section @ref compilationModularFeatures). One of the possible way of compiling Dibbler is to disable poslib - a library used to perform DNS Updates. Dibbler binaries compiled without poslib are designated as -wo-poslib. It is possible to compile Dibbler with various compilation options. In particular (enabled by default) @b -g option includes debugging information in the binary file (this greatly affects binary file size, but does not affect memory usage), @b -O0 (disably any kind of optimisation) or -Os (produce smallest possible code). Debugging informations can be removed using @b strip command (designated below as -stripped). Linux command line tool called \b top was used to measure memory usage. VIRT is a virtual memory size, RES denotes size of actual physical memory used and SHR is a size of a shared memory. See top manual page for details.
VIRTRES SHR %CPU %MEMOptim.filesizeCOMMAND
341615641416 0.0 0.2 -O0 7123510 dibbler-server
341615601416 0.0 0.2 -O0 751948 dibbler-server-stripped
332815441400 0.0 0.2 -O0 6533375 dibbler-server-wo-poslib
332815481400 0.0 0.2 -O0 663592 dibbler-server-wo-poslib-stripped
322014361292 0.0 0.2 -Os 4596760 dibbler-server run
314014241276 0.0 0.2 -Os 468776 dibbler-server-wo-poslib
338816361496 0.0 0.2 -O0 9771605 dibbler-client
339216441496 0.0 0.2 -O0 725352 dibbler-client-stripped
329616081472 0.0 0.2 -O0 9183726 dibbler-client-wo-poslib
330016121472 0.0 0.2 -O0 639240 dibbler-client-wo-poslib-stripped
321214721336 0.0 0.2 -Os 5901734 dibbler-client-wo-poslib
312014561320 0.0 0.2 -Os 458984 dibbler-client-wo-poslib
Dibbler stores data internally in lists. This means that server's memory and CPU usage is a linearly proportional to a number of clients it currently supports. @todo: Long/performance tests are required. */ dibbler-1.0.1/doc/logo-eti.png0000664000175000017500000000334112233256142013032 00000000000000‰PNG  IHDRxx9d6ÒbKGDÿÿÿ ½§“ pHYs × ×B(›xtIMEÙ :Ÿ 5nIDATxÚíÝYluÇñßÌÿ˜Ýå¨@$ðcãMÐhP4£xkPcô/*QbbbŒU"‰/DE¨ž‰Tšèƒ¨AAA!EP@0(J»Ýî1³óŸ¿#W»¥»Ýƒß÷­Mºs|:3ÿNÿ™q®¸mžkŠ>yû)çÀï¹Ü-Í›<ùÿ/Â0B1 !⸺gn¥$ž†§„pÇÅ D1Q*E”é#!ÜÞ}çi()Ê.†!Ο‹qÇEdLUW2•ô0ÿ™7±æ§MÂ…1gŸq {`6²¹ûÈÓ Ÿ­XE¯/p„wüXŒ5bHV4¡Œ1€’0q ¥Ò)é”OÅ~3jäAgº¶¶¶Ù}^ƒãØVýÈý&Ža÷^ ¬bS®Ü}g bÛÿeTrWÕ¾?ÿêDûò/°êÇÈtç …À±cZ0eòÙ¸éêK*7ÈbC›…ÅÃO,Á²ÏWB{ žRp… X`×î=Xµv#ž~å]Ü;gnž>•À …kcÜyÏlÞ¶--Ã!Åþ±jHø ¥R„§¿‹-[wâ»nçßÁÒ܇b˶?0,•<w_Žh-‘N%±tÙøèÓ¯Üulù_¯^T2×uú?ÍJt*‰EK> p#Ô¾lü„†åï~­öteñݺ×{›~Ý%6üqœÞ»¿l#p½[ 8ÿ9gïÈ›ÀuÞ„qÇ ø~»µ@)ŠpòI'¸Þ»áÊ‹‘/0¦ü£±TŠN'qÁyg¸Þk4ç´žŠ|±XÖ팉‘Íå1ëÖ«8Šn”-¸cŽ\¾cbêÒjmï‘›Éæ0õÂsqûÓÜ(ùžÆ{‹Á¹gNDWw=ùÂRÇ0&F”ÐÍ¡P 0óÖéxüÁ9G´Þª¬aZ+<7.Öwü†–¯À7k6௿;¡¤Ä¸ÇbÊä³0ãšKÑ2rØ/ƒÀõpMž8­ÇWå³kzŠö´áö®‚ë:ðµË=Å'ý~gsTý~~ÉØ´ùÐwm¼„FÇæíÿÝ®®‹õ¿áÁ/£P +²| ‹|àÑûgáØÑ-Û®»vã‘'—`X*Y\¥þîì†R²¶À›6oÇwë:àyúàS‡ë@¸.„èý-B Ÿ/båÚ œðg‘ÉäUx_”°rÍŒ>fDM€Ç.´RµVRÂó4ü„.c¥)]È ^5¬ :ÐMý².BÀÓ²¬íªud QÖqÃZ kí `Çqàº.‡ÀuQEðý†§“ÃÒàŽJ)Q Cd2=ðÏ‚ÕxÚÔÉh=}BY´ûJLwÚ— ™LP­^€¯vQÅ>kO¦ï|ø9RnÎkp¡PDŠqÅL`F`F`F`F`F`F`33333³&Öž®øó®Ž†ª:£cõñOWR rÊŽt±{w'ž¦X=¿öÖÇøæ‡ð´Ô縎¥ä!‰Èjœô9<Ýüã5˜˜˜˜˜˜˜ÀŒÀŒÀŒÀŒÀŒÀŒÀffffff>Ê«ê¬Ê\¡€Î®,òƒœ6[NŽëÀÓ Z)(%(;Àwϼ wÌÈ zâ{Y"¶nß…g_}Jù” àÖI†tcF ,!"pS^ƒÃR ±‰©ÊA ÌÌÌÌÌÌÌ–R é7îË“‰äo:UR"YáZ&}Rl®„pÝŠ>ÎOxe½jw¿µLx/½±©´cëERtvfzÜ¡’/¼ÞŽtʇ‰ME–“ÉäüxF%V¬ú]ÙŠA8¨uÐJbÛŽ?¡Uÿëà\qÛ<»ï cbD‘Ad ¬µ ì8¤Rì÷TÚJoÓá–Ó_qlÿ[8Ž¿R@Šý×áüÓ†ÍéóÂ….<(4Kõ²M®ë@k ]ÝipdqÍš*çPßlkk›Í]Ã#˜˜˜˜yÿ+jðç2~0\IEND®B`‚dibbler-1.0.1/doc/dibbler-devel-06-arch.dox0000644000175000017500000002144712277722750015177 00000000000000/** @page arch 6. Architecture General architecture is common between server, client and (to some extent) relay. In all cases, classes are divided into several major groups: - \b IfaceMgr -- Interface Manager. It represents all network interfaces present in the system. They're represented by TIfaceIface objects and stored in IfaceLst. Each interface has list of open sockets, represented with TIfaceSocket objects. There are also a number of auxiliary functions for getting proper interface. IfaceIface objects also provide methods to add, update and remove addresses. - \b AddrMgr -- Address Manager. It is an address database, which stores all informations about clients, IAs and associated addresses. - \b CfgMgr -- Config Manager. It is being used to read configuration information from config file and provide those informations while runtime. Common mechanisms shared between server and client are scarce, so this base class is almost empty. - \b TransMgr -- Transmission Manager, sometimes called Transaction Manager. It is responsible for network interaction and core DHCPv6 logic. It sends various messages when such need arise, matches received responses with sent messages, retransmits messages etc. It contains list of messages currently being trasmitted. - \b Messages -- There is one parent class of all messages. It contains several basic functionalites common to all messages. - \b Options -- There are multiple option classes. Note that some classes are designed to represent one specific option (e.g. OptIAAddress) and other are not (e.g. OptAddrLst can contain address list, so it can be used as DNS Resolvers, SIP servers o NIS servers option). - \b Misc -- This cathegory (or rather directory) contains various miscellanous classes and functions. None of those classes is used directly. Client, server and relay uses derived classes. They are all created within DHCPClient or DHCPServer objects in client or server, respectively. DHCPRelay object will perform similar function for relays. @section archClient 6.1 Client Architecture Client is represented by a DHCPClient object. It contains 4 large managers, each with its own functions. Also messages and options are defined: - \b TClntIfaceMgr -- contains client version of the IfaceMgr. Major difference is a TClntIfaceIface class, an enhanced version of the IfaceIface. It provides methods to set up various options on the physical interface. Those methods are used by Options representing options. - \b TClntAddrMgr -- Client version supports additional, client related functions, e.g. tentative timeout used in DAD procedure. It also simplifies database handling as there will always be only one client in the database. - \b TClntCfgMgr -- Client related parser. TClntCfgMgr and related objects are designed to provide easy access to parameters specified in the configuration file. ClntCfgIface is a very important class as most of the parameters is interface-specific. - \b TClntTransMgr -- Core logic of the Client. It uses all other managers to decide what actions should be taken at occuring circumstances, e.g. send REQUEST when there are less addresses assigned than specified in the configuration file. - \b TClntMsg -- All messages have client specific classes. Those objects are created as new messages are being sent. After server message reception, object is also created and passed to the original message. For example, client sends SOLICIT message and server send ADVERTISE message. Reply will be passed by invoking \b answer(msgAdvertise) method on the \b Solicit object. - \b TClntOpt -- There are client specific options defined. Each of those options has \b doDuties() method which is called if this option was received in a proper reply message from the server. It calls appropriate methods in TClntIfagrMgr which set specific options in the system. @section archServer 6.2 Server Architecture Server is represented by a DHCPServer object. It contains 4 large managers, each with its own functions. Also SrvMessages and SrvOptions are defined: - \b TSrvIfaceMgr -- contains server version of the IfaceMgr. There are almost no modificiation compared to common version. - \b TSrvAddrMgr -- Client version supports additional, client related functions, e.g. tentative timeout used in DAD procedure. It also simplifies database handling as there will always be only one client in the database. - \b TSrvCfgMgr -- Client related parser. TSrvCfgMgr and related objects are designed to provide easy access to parameters specified in the configuration file. SrvCfgIface is a very important class as most of the parameters is interface-specific. - \b TSrvTransMgr -- Core logic of the client. It uses all other managers to decide what actions should be taken at occuring circumstances, e.g. send REQUEST when there are less addresses assigned than specified in the configuration file. - \b TSrvMsg -- Server version of the messages. Each time server receives a message, TSrvMsg is created. Depending of its type, TSrvAdvertise of TSrvReply message is created. As parameter to its contructor original message is passed. After creating message, it is sent back to the client and stored for possible retransmission purposes. - \b TSrvOpt -- Server version of the Option representing objects. They are just used to store data, so they are considerably simpler than client versions. @section archRelay 6.3 Relay Architecture Preliminary relay version was available in the 0.4.0 release. It consists of serveral simple blocks: - \b TRelIfaceMgr -- contains relayr version of the IfaceMgr. There are almost no modificiation compared to common version, execept decodeMsg() and decodeRelayRepl() methods. - \b TRelCfgMgr -- Relay related parser. TRelCfgMgr and related objects are designed to provide easy access to parameters specified in the configuration file. RelCfgIface is a very important class as most of the parameters is interface-specific. - \b TRelTransMgr -- It's plain simple manager. It's only function is to relay received message on all interfaces. - \b TRelMsg] -- From the relay's point of view, all messages fall to one of 3 categories: Generic (i.e. not encapsulated) messages, RelayForw (already forwarded by some other relay) and RelayRepl (replies from server). Most of the messages is threated as generic message. - \b TRelOpt -- Similar approach is used to handle options. Expect RELAY_MSG option (which contains relayed message) and interface-id option (which contains identifier of the interface), all options are threated as generic options, which are handled transparently. @section archRequestor 6.4 Requestor Architecture @todo @section archNaming 6.5 Naming Convention @todo @section archAlgo 6.6 Algorithms @section archAlgoLeaseAssignment 6.6.1 Lease assignment policy 1. Client classification is performed (a class is assigned to a client) (see NodeClientSpecific::analyseMessage(msg) in void TSrvTransMgr::relayMsg(SPtr msg)) 2. black-list, white-list (TSrvCfgMgr::isClntSupported() called from TSrvTransMgr::relayMsg() ) 3. Check if there is existing lease for this client/ia. If there is, assign it. (TSrvOptIA_NA::renew() called from TSrvOptIA_NA::TSrvOptIA_NA() ) 4. Check if there is reserved address/prefix defined for this client. If it is, assign it (fixed-lease or "exception") (TSrvOptIA_NA::assignFixedLease() called from TSrvOptIA_NA::TSrvOptIA_NA() ) 5. Check if client didn't exceed max-client-leases (see code in TSrvOptIA_NA::TSrvOptIA_NA()) 6. See if there is a lease that was assigned previously (cache) (TSrvOptIA_NA::assignCachedAddr() called from TSrvOptIA_NA::TSrvOptIA_NA()) 7. See if client sent a hint and try to assign it, if possible. If requested address is not available, try to assign similar address (i.e. from the pool that hint belongs to). (TSrvOptIA_NA::assignRequestedAddr() called from TSrvOptIA_NA::TSrvOptIA_NA()) 8. randomly assign a new lease (TSrvOptIA_NA::assignRandomAddr() called from TSrvOptIA_NA::TSrvOptIA_NA()) @section archAlgoFixedLease 6.6.2 Fixed lease management 1. Old database is read when server starts. 2. Existing leases are confirmed against current configuration. Invalid leases are removed. The following steps are somewhat not feasible as there may be reservations for remote-id or subscriber-id (or mac address) // 3. List of fixed leases is created, based on configuration. // 4. An attempt to add each fixed lease to DB is tried. If lease // is already in DB, addition is skipped. Leases are marked as fixed. @section archAuth 6.7 Authentication see TClntMsg::appendAuthenticationOption() bool TClntMsg::checkReceivedAuthOption() void TSrvMsg::appendAuthenticationOption(SPtr duid) bool TSrvMsg::validateReplayDetection() missing: - validation on server side */dibbler-1.0.1/doc/man/0000775000175000017500000000000012561700420011434 500000000000000dibbler-1.0.1/doc/man/dibbler-relay.80000664000175000017500000000726112233256142014173 00000000000000.TH dibbler-relay 8 2004-12-11 GNU Dibbler server .SH NAME dibbler-relay \- a portable DHCPv6 relay .SH DESCRIPTION .B dibbler-relay is a portable implementation of the DHCPv6 relay. DHCPv6 relays are proxies, which allow one server to support links, which server is not directly connected to. There are ports available for Linux 2.4/2.6 systems as well as MS Windows XP and 2003. They are freely available under .B GNU GPL version 2 (or later) license. .SH SYNOPSIS .B dibbler-relay [ run | start | stop | status ] .SH OPTIONS .I run - starts relay in the console. Relay can be closed using ctrl-c. .I start - starts relay in daemon mode. .I stop - stops running relay. .I status - shows status of the relay. .SH EXAMPLES Relay forwards DHCPv6 messages between interfaces. Messages from client are encapsulated and forwarded as RELAY_FORW messages. Replies from server are received as RELAY_REPL message. After decapsulation, they are being sent back to clients. It is vital to inform server, where this relayed message was received. DHCPv6 does this using interface-id option. This identifier must be unique. Otherwise relays will get confused when they will receive reply from server. Note that this id does not need to be alligned with system interface id (ifindex). Think about it as "ethernet segment identifier" if you are using Ethernet network or as "bss identifier" if you are using 802.11 network. Let's assume this case: relay has 2 interfaces: eth0 and eth1. Clients are located on the eth1 network. Relay should receive data on that interface using well-known ALL_DHCP_RELAYS_AND_SERVER multicast address (ff02::1:2). Relay also listens on its global address 2000::123. Packets received on the eth1 should be forwarded on the eth0 interface, also using multicast address: .nf log-level 8 log-mode short iface eth0 { server multicast yes } iface eth1 { client multicast yes client unicast 2000::123 interface-id 1000 } .fi Here is another exmaple. This time messages should be forwarded from eth1 and eth3 to the eth0 interface (using multicast) and to the eth2 interface (using server's global address 2000::546). Also clients must use multicasts (the default approach): .nf iface eth0 { server multicast yes } iface eth2 { server unicast 2000::456 } iface eth1 { client multicast yes interface-id 1000 } iface eth3 { client multicast yes interface-id 1001 } .fi .SH FILES All files are created in the /var/lib/dibbler directory. During operation, Dibbler saves various file in that directory. Dibbler relay reads /etc/dibbler/relay.conf file. Log file is named client.log. .SH STANDARDS This implementation aims at conformance to the following standards: .I RFC 3315 DHCP for IPv6 .I RFC 3736 Stateless DHCPv6 .SH BUGS Bugs are tracked with bugzilla, available at \fIhttp://klub.com.pl/bugzilla/\fP. If you belive you have found a bug, don't hesitate to report it. .SH AUTHOR Dibbler was developed as master thesis on the Technical University of Gdansk by Tomasz Mrugalski and Marek Senderski. Currently Marek has not enough free time, so this project is being developed by Tomasz Mrugalski. Author can be reached at thomson@klub.com.pl. .SH SEE ALSO There are dibbler-server(8) and dibbler-client(8) manual pages available. You are also advised to take a look at project website located at \fIhttp://klub.com.pl/dhcpv6/\fP. As far as authors know, this is the only Windows DHCPv6 stateful implementation available and the only one with relay support. It is also one of two freely available under Linux. The other Linux implementation is available at \fIhttp://dhcpv6.sourceforge.net\fP, but it is rather outdated and seems not being actively developed. dibbler-1.0.1/doc/man/dibbler-server.80000664000175000017500000000666512233256142014374 00000000000000.TH dibbler-server 8 2004-12-11 GNU Dibbler server .SH NAME dibbler-server \- a portable DHCPv6 server .SH DESCRIPTION .B dibbler-server is a portable implementation of the DHCPv6 server. It supports both stateful (i.e. IPv6 address granting) and stateless (i.e. options granting) autoconfiguration. There are ports available for Linux 2.4/2.6 systems as well as MS Windows XP and 2003. They are freely available under .B GNU GPL version 2 (or later) license. .SH SYNOPSIS .B dibbler-server [ run | start | stop | status | install | uninstall ] .SH OPTIONS .I run - starts server in the console. Server can be closed using ctrl-c. .I start - starts server in daemon mode. .I stop - stops running server. .I status - shows status of the server. .I install - installs server as a service. This is not implemented yet. .I uninstall - uninstall server service. This is not implemented yet. .SH EXAMPLES Let's assume simple case: server should provide clients located on the eth1 link with IPv6 addresses from range 2000::100/120 and should have preference set to 7: .nf iface eth0 { preference 7 class { pool 2000::100-2000::1ff } } .fi Here is exmaple of server configured to work in a stateless mode (i.e. only options, not addresses are served). If client support option renewal, it should do so once in a 500 seconds: .nf log-level 7 log-mode short stateless iface eth0 { option dns-server 2000::100,2000::101 option domain example.com, test1.example.com option ntp-server 2000::200,2000::201,2000::202 option time-zone CET option sip-server 2000::300,2000::302,2000::303,2000::304 option sip-domain sip1.example.com,sip2.example.com option nis-server 2000::400,2000::401,2000::404,2000::405,2000::405 option nis-domain nis.example.com option nis+-server 2000::501,2000::502 option nis+-domain nisplus.example.com option lifetime 500 } .fi More examples can be found in the User's Guide. .SH FILES All files are created in the /var/lib/dibbler directory. Dibbler server reads /var/lib/dibbler/server.conf file. During operation, Dibbler saves various file in that directory. Log file is named client.log. .SH STANDARDS This implementation aims at conformance to the following standards: .I RFC 3315 DHCP for IPv6 .I RFC 3319 SIP options for DHCPv6 .I RFC 3646 DNS server options for DHCPv6 .I RFC 3736 Stateless DHCPv6 .I RFC 3898 NIS options for DHCPv6 Also options specified in following drafts are implemented: .I draft-ietf-dhc-dhcpv6-opt-timeconfig-03.txt NTP and timezone options. .I draft-ietf-dhc-dhcpv6-opt-lifetime-00.txt Option renewal. .SH BUGS Bugs are tracked with bugzilla, available at \fIhttp://klub.com.pl/bugzilla/\fP. If you belive you have found a bug, don't hesitate to report it. .SH AUTHOR Dibbler was developed as master thesis on the Technical University of Gdansk by Tomasz Mrugalski and Marek Senderski. Currently Marek has not enough free time, so this project is being developed by Tomasz Mrugalski. Authors can be reached at thomson@klub.com.pl and msend@o2.pl .SH SEE ALSO There is dibbler-client(8) manual page. You are also advised to take a look at project website located at \fIhttp://klub.com.pl/dhcpv6/\fP. As far as authors know, this is the only Windows DHCPv6 stateful implementation available. It is also one of two freely available under Linux. The other Linux implementation is available at \fIhttp://dhcpv6.sourceforge.net\fP, but it is rather outdated and seems not being actively developed. dibbler-1.0.1/doc/man/dibbler-client.80000664000175000017500000000703512233256142014334 00000000000000.TH dibbler-client 8 2004-12-11 GNU Dibbler client .SH NAME dibbler-client \- a portable DHCPv6 client .SH DESCRIPTION .B dibbler-client is a portable implementation of the DHCPv6 client. It supports both stateful (i.e. IPv6 address granting) and stateless (i.e. options granting) autoconfiguration. There are ports available for Linux 2.4/2.6 systems as well as MS Windows XP and 2003. They are freely available under .B GNU GPL version 2 (or later) license. .SH SYNOPSIS .B dibbler-client [ run | start | stop | status | install | uninstall ] .SH OPTIONS .I run - starts client in the console. Client can be closed using ctrl-c. .I start - starts client in daemon mode. .I stop - stops running clients. .I status - shows status of the client and server. .I install - installs client as a service. This is not implemented yet. .I uninstall - uninstall client service. This is not implemented yet. .SH EXAMPLES Let's start with simple configuration. We want receive one IPv6 address and there is only one Ethernet interface present. In that case client.conf file might be completly empty. Dibbler client will request for one IPv6 address on each up, running and multicast capable interface (except loopback). Now some real example. We want one IPv6 address and receive DNS servers and domain name. We are also not interested in the details, so debug mode is disabled. .nf log-mode short log-level 6 iface eth0 { ia { } option dns-server option domain } .fi Next example: we want only NIS domain and NIS server information. That information should be periodicaly renewed, so we use lifetime option. We don't need any addresses so stateless mode is used. .nf log-mode short iface eth0 { stateless option nis-server option nis-domain option lifetime } .fi More examples can be found in the User's Guide. .SH FILES All files are created in the /var/lib/dibbler directory. Dibbler client reads /var/lib/dibbler/client.conf file. During operation, Dibbler saves various file in that directory. After reception of the DNS servers or domain informations, they are added to the /etc/resolv.conf file. After shutdown, that information is removed from that file. Option values are stored in the option-* files. Log file is named client.log. .SH STANDARDS This implementation aims at conformance to the following standards: .I RFC 3315 DHCP for IPv6 .I RFC 3319 SIP options for DHCPv6 .I RFC 3646 DNS server options for DHCPv6 .I RFC 3736 Stateless DHCPv6 .I RFC 3898 NIS options for DHCPv6 Also options specified in following drafts are implemented: .I draft-ietf-dhc-dhcpv6-opt-timeconfig-03.txt NTP and timezone options. .I draft-ietf-dhc-dhcpv6-opt-lifetime-00.txt Option renewal. .SH BUGS Bugs are tracked with bugzilla, available at \fIhttp://klub.com.pl/bugzilla/\fP. If you belive you have found a bug, don't hesitate to report it. .SH AUTHOR Dibbler was developed as master thesis on the Technical University of Gdansk by Tomasz Mrugalski and Marek Senderski. Currently Marek has not enough free time, so this project is being developed by Tomasz Mrugalski. Authors can be reached at thomson@klub.com.pl and msend@o2.pl .SH SEE ALSO There is dibbler-server(8) manual page. You are also advised to take a look at project website located at \fIhttp://klub.com.pl/dhcpv6/\fP. As far as authors know, this is the only Windows DHCPv6 stateful implementation available. It is also one of two freely available under Linux. The other Linux implementation is available at \fIhttp://dhcpv6.sourceforge.net\fP, but it is rather outdated and seems not being actively developed. dibbler-1.0.1/doc/dibbler-devel-bibl.dox0000664000175000017500000000007512233256142014730 00000000000000/** @page bibliography 10. Bibliography @todo */dibbler-1.0.1/doc/examples/0000775000175000017500000000000012561700420012477 500000000000000dibbler-1.0.1/doc/examples/client-ta.conf0000664000175000017500000000025512233256142015153 00000000000000# # Example client configuration file: Temporart addresses # log-level 8 log-mode short iface eth0 { ia // ask for normal address ta // ask for temporary address } dibbler-1.0.1/doc/examples/server-relay-interface-id.conf0000664000175000017500000000162512233256142020245 00000000000000# # Example server configuration file: Relays # # Server must be configured to support relayed traffic. This is # an example how to do this. log-level 8 log-mode short // Note: If there are no clients connected directly, the whole // eth0 definition can be omited. iface eth0 { // this pool will be used for clients connected directly, not via relay class { pool 2001:db8::1-2001:db8::10 } } iface relay1 { relay eth0 // interface-id can be specified as number (4 bytes will be used) // interface-id 5020 // it can also be specified as a string // interface-id "some interface name" // and as a hex value interface-id 0x427531264361332f3000001018680f980000 T1 1000 T2 2000 // this pool will be used for clients connected via relay class { pool 2000::1-2000::ff } unicast 3800:0:0:180::8 option dns-server 2000::100,2000::101 option domain example.com, test1.example.com } dibbler-1.0.1/doc/examples/server-subnet.conf0000644000175000017500000000077712277722750016121 00000000000000# # Example server configuration file: Relays # # Server must be configured to support relayed traffic. This is # an example how to do this. log-level 8 log-mode short iface relay1 { relay eth0 interface-id 5020 T1 1000 T2 2000 subnet 2001:db8:2222::/64 // this pool will be used for clients connected via relay class { pool 2001:db8:2222::1-2001:db8:2222::ff } option dns-server 2001:db8::100, 2001:db8::101 option domain example.com, test1.example.com } dibbler-1.0.1/doc/examples/server-relay.conf0000644000175000017500000000236712277722750015732 00000000000000# # Example server configuration file: Relays # # Server must be configured to support relayed traffic. This is # an example how to do this. log-level 8 log-mode short // Note: If there are no clients connected directly, the whole // eth0 definition can be omited. iface eth0 { // this pool will be used for clients connected directly, not via relay class { pool 2001:db8:1::1-2001:db8:1::10 } } iface relay1 { relay eth0 // This relay1 actually represents a network that the // physical device relays packets from. The relay device should // have a global address assigned on its client-facing interface. // That address should belong to this subnet. subnet 2001:db8:2222::/48 // There are 3 ways of specifying interface-id content // Way 1: As a text string interface-id "relay1:en1" // Way 2: As unsigned integer coded on 32 bits // interface-id 5020 // Way 3: As a hex string interface-id 0x427531264361332f3000001018680f980000 T1 1000 T2 2000 // this pool will be used for clients connected via relay class { pool 2001:db8:2222::1-2001:db8:2222::ff } option dns-server 2001:db8::100, 2001:db8::101 option domain example.com, test1.example.com } dibbler-1.0.1/doc/examples/server-route.conf0000664000175000017500000000212712233256142015735 00000000000000# # Example server configuration file # # This config. file is considered all-purpose as it instructs server # to provide almost every configuratio # # Logging level range: 1(Emergency)-8(Debug) log-level 8 # Don't log full date log-mode short # set preference of this server to 0 (higher = more prefered) preference 0 iface "eth0" { // also ranges can be defines, instead of exact values t1 1800-2000 t2 2700-3000 prefered-lifetime 3600 valid-lifetime 7200 # assign addresses from this pool class { pool 2000::/64 } # a single next-hop without any routes defined (i.e. default router) next-hop 2001:db8:1::cafe # router with a single route with infinite lifetime next-hop 2001:db8:1::face:b00c { route 2001:db8:1::/64 } # router with 3 routes defined in different ways next-hop 2001:db8:1::dead:beef { route 2001:db8:2::/64 lifetime 7200 route 2001:db8:3::/64 lifetime infinite route 2001:db8:4::/64 } # prefixes available on link directly, not via router route 2001:db8:5::/64 lifetime 3600 route 2001:db8:6::/64 lifetime infinite route 2001:db8:7::/64 } dibbler-1.0.1/doc/examples/relay-1interface.conf0000664000175000017500000000022112233256142016417 00000000000000 log-level 8 log-mode short iface "eth1" { server multicast no # server unicast 2001:db8:1::1 client multicast yes interface-id 1234 } dibbler-1.0.1/doc/examples/server-fqdn.conf0000644000175000017500000000450212277722750015537 00000000000000# # Example server configuration file: DNS Updates (FQDN) # # Logging level range: 1(Emergency)-8(Debug) # log-level 8 # Don't log full date log-mode short # Set protocol to one of the following values: udp, tcp, any ddns-protocol udp # Sets DDNS Update timeout (in ms) ddns-timeout 1000 # specify address of DNS server to be used for DDNS fqdn-ddns-address 2001:db8:1::1 # Support for secure DNS Updates (using TSIG mechanism) # was implemented in 0.8.3. Please uncomment the following section # to have your updates being signed. Make sure to use *your own* # key, not this example. See Features HOWTO section in User's Guide # for details how to generate it on your own. # Key name must match the name configured on your DNS server. #key "DDNS_UPDATER" { # # # That is a base64 encoded secret # secret "9SYMLnjK2ohb1N/56GZ5Jg=="; # # # Algorithm type. Currently only hmac-md5 is supported. # # Parser also accepts hmac-sha1 and hmac-sha256, but they do # # not work. # algorithm hmac-md5; # # # It is possible to specify fudge (maximum time for Transacation Signature # # correctness. That is useful, if your DHCP and DNS servers have clocks # # misconfigured. The default value is 300. # #fudge 250; #}; iface "eth0" { # assign addresses from this class class { pool 2001:db8:1::/64 } # provide DNS server location to the clients # also server will use this address to perform DNS Update, # so it must be valid and DNS server must accept DNS Updates. option dns-server 2000::1 # provide their domain name option domain example.com # provide fully qualified domain names for clients # First parameter defines, who will do the updates (0 - nobody, 1 - server will # do PTR, client will do AAAA, 2 - AAAA and PTR done by server) # Third parameter specified reverse zone length option fqdn 2 64 inara.example.com - 2001:db8:1::babe, wash.example.com - 0x0001000043ce25b40013d4024bf5, zoe.example.com, malcolm.example.com, kaylee.example.com # specify what to do with client's names that are not on the list # 0 - reject # 1 - send other name from allowed list # 2 - accept any name client sends # 3 - accept any name client sends, but append specified domain suffix # 4 - ignore client's hint, generate name based on his address, append domain name accept-unknown-fqdn 4 example.org } dibbler-1.0.1/doc/examples/server-ta.conf0000664000175000017500000000024312233256142015200 00000000000000log-level 8 log-mode short iface "eth0" { class { pool 2001:db8:1111::1-2001:db8:1111::ff } ta-class { pool 2001:db8:2222::1-2001:db8:2222::ffff } } dibbler-1.0.1/doc/examples/client-stateless.conf0000664000175000017500000000133012420526756016562 00000000000000# # Example client configuration file: stateless autoconf # # this client configuration file is an example of how to configure # client in a stateless mode. Also all possible configuration # parameters are requested from the server. # Stateless means that client will not ask nor will receive any # addresses. log-level 8 log-mode short iface eth0 { # This tells the client to run in stateless mode (i.e. only request # options and not addresses or prefixes) stateless option dns-server option domain option ntp-server option time-zone option sip-server option sip-domain option nis-server option nis-domain option nis+-server option nis+-domain option vendor-spec option aftr } dibbler-1.0.1/doc/examples/server-bulk-lq.conf0000664000175000017500000000075512233256142016153 00000000000000# # Example server configuration file # # This config. file is for planned bulk leasequery functionality # that is not available yet. Do not use it unless you are a dibbler # developer # # Logging level range: 1(Emergency)-8(Debug) log-level 8 # Don't log full date log-mode short # Uncomment this to enable bulk-leasequery bulk-leasequery-timeout 301 bulk-leasequery-max-conns 11 bulk-leasequery-accept 1 bulk-leasequery-tcp-port 548 iface "eth0" { class { pool 2001:db8::/64 } } dibbler-1.0.1/doc/examples/relay-echo-remoteid.conf0000664000175000017500000000051612413230313017121 00000000000000log-level 8 log-mode short #option remote-id 5-0x01020304 #option echo-request 100,101,102 # Uncommenting this option will make relay to insert relay-id option # into forwarded RELAY-FORW messages. # option relay-id 00:01:02:03:04:05 iface eth0 { client multicast yes interface-id 5555 } iface eth1 { server multicast yes }dibbler-1.0.1/doc/examples/client-custom.conf0000644000175000017500000000166712277722750016102 00000000000000# # Example client conf file. This example showcases how to extend # Dibbler with custom options # log-mode debug # Uncomment this to have a stript called upon message reception #script "/var/lib/dibbler/client-notify.sh" iface eth0 { ia # send option 123 with specified string value option 123 string "custom.option.org" # just request option 124 and interpret response as string option 124 string # send option 123 with specified hex value option 125 hex 0x0123456789abcdef # just request option 126 and interpret response as hex data option 126 hex # send option 127 with specified address option 127 address 2001:db8::1 # request option 127 and interpret response as IPv6 address option 128 address # send option 129 with specified address list option 129 address-list 2001:db8::babe,2001:db8::cafe # request option 130 and interpret response as address list option 130 address-list } dibbler-1.0.1/doc/examples/server-per-client.conf0000644000175000017500000000256112277722750016654 00000000000000# # Example server configuration file: per-client configuaration # # In this example, some clients receive different parameters than others. # Logging level range: 1(Emergency)-8(Debug) log-level 8 # Don't log full date log-mode short iface "eth0" { class { pool 2001:db8:1::/64 } pd-class { pd-pool 2001:db8:2::/48 pd-length 64 } # common configuration options, provided for all clients option dns-server 2001:db8:1::1 option domain example.org option vendor-spec 5678-2-0xaaaa,1234-3-0x0102 # special parameters for client with DUID 00:01:02:03:04:06 client duid 0x000102030406 { address 2001:db8:1::123 prefix 2001:db8:abcd::/64 option domain second.example.org option dns-server 1234::5678:abcd option vendor-spec 5678-2-0xbbbb, 1234-5-0x222222 } # this client should receive default domain and dns-server, but different vendor-spec info client duid 0x0001000044e8ef3400085404a324 { option vendor-spec 1111-57-0x01020304 } client remote-id 5-0x01020304 { address 2000::0102:0304 option domain our.special.remoteid.example.org } # link-local reservation (see User's Guide, Section 5.3.12 # "Example 12: Per client configuration" and its warning # paragraph before using this) #client link-local fe80::1:2:3:4 #{ # option domain link.local.detected.interop.example.org #} } dibbler-1.0.1/doc/examples/server-leasequery.conf0000664000175000017500000000140012233256142016747 00000000000000# # Example server configuration file # # This config. file is considered all-purpose as it instructs server # to provide almost every configuratio # # Logging level range: 1(Emergency)-8(Debug) log-level 8 # Don't log full date log-mode short # set preference of this server to 0 (higher = more prefered) preference 0 iface "eth0" { accept-leasequery // also ranges can be defines, instead of exact values t1 1800-2000 t2 2700-3000 prefered-lifetime 3600 valid-lifetime 7200 # assign addresses from this pool class { pool 2001:db8:1111::/64 } # assign temporary addresses from this pool ta-class { pool 2001:db8:2222::/96 } #assign /96 prefixes from this pool pd-class { pd-pool 2001:db8:3333:ff03:abcd::/80 pd-length 96 } } dibbler-1.0.1/doc/examples/server-extraopts.conf0000664000175000017500000000113412233256142016625 00000000000000# # Example server configuration file # # This config. file is considered all-purpose as it instructs server # to provide almost every configuratio # # Logging level range: 1(Emergency)-8(Debug) log-level 8 # Don't log full date log-mode short # set preference of this server to 0 (higher = more prefered) preference 0 # adding extra option is experimental. This allows non-standard/extra behavior experimental iface "eth0" { # assign addresses from this pool class { pool 2001:db8::/64 } # send those extra options to the client option extra 1234-0x012345679abcdef,7777-0x01,8888-0x8888 } dibbler-1.0.1/doc/examples/server-stateless.conf0000664000175000017500000000152612233256142016610 00000000000000# # Example server configuration file: stateless autoconf # # Stateless autoconf is used when clients does not ask for addresses or # prefixes. Note that in stateless mode, limited number of messages # is accepted: inf-request and relay-forw only. log-level 8 log-mode short stateless iface eth0 { option dns-server 2000::100,2000::101 option domain example.com, test1.example.com option ntp-server 2000::200,2000::201,2000::202 option time-zone CET option sip-server 2000::300,2000::302,2000::303,2000::304 option sip-domain sip1.example.com,sip2.example.com option nis-server 2000::400,2000::401,2000::404,2000::405,2000::405 option nis-domain nis.example.com option nis+-server 2000::501,2000::502 option nis+-domain nisplus.example.com option aftr cgn.example.com # renew obtained paramters every 1800 seconds option lifetime 1800 } dibbler-1.0.1/doc/examples/client-auth.conf0000644000175000017500000000065312277722750015523 00000000000000# # Example client configuration file: authentication # #log-mode short # 7 = omit debug messages log-level 8 # authentication should be enabled # There are 4 allowed values here: none (this is the default), delayed, reconfigure-key, dibbler auth-protocol dibbler # client will accept following digests from the server (used in dibbler protocol) auth-accept-methods digest-hmac-md5, digest-hmac-sha1 iface eth0 { ia } dibbler-1.0.1/doc/examples/relay.conf0000664000175000017500000000274612413230313014406 00000000000000log-level 8 log-mode short # Uncomment the following line to force relay to start including remote-id # option with entreprise-id 5 and content of 01:02:03:04 # option remote-id 5-0x01020304 # Uncomment the following line to force relay to send Echo Request Option # asking the server to echo back options 100, 101 and 102 # option echo-request 100,101,102 # Uncommenting this option will make relay to insert relay-id option # into forwarded RELAY-FORW messages. # option relay-id aa:bb:cc:dd:ee:ff # Uncomment this line to tell relay to attempt to insert client link-layer # address option. Relay will attempt to get that info from client's DUID # or source IPv6 link-layer address. These are not 100% reliable methods! # option link-layer # The relay should listen on eth1 interface for incoming client's traffic. # Clients by default send their traffic to multicast. iface eth1 { client multicast yes # You may uncomment this if you want the relay to also listen on specific # unicast address. Usually you don't need that. # client unicast 2001:db8::1 # When forwarding traffic from that interface, please add interface-id # with value 5555, so the server will know where the clients are connected. interface-id 5555 } # This is a second interface. It is used to reach the server. iface eth2 { # Send message on this interface to the server multicast (ff05::1:3) server multicast yes # send messages on this interface to this global address # server unicast 2001:db8::123 } dibbler-1.0.1/doc/examples/client-autodetect.conf0000664000175000017500000000143212233256142016706 00000000000000# # Example client configuration file: Autodetect # # This config file is commented out. # Dibbler-client will autodetect all up, running, IPv6-supporting, multicast # capable interfaces and will try to obtain one IPv6 address on each of them. # To manually specify, what parameter should be obtained, uncomment # appropriate sections below. To get full list of supported options, # see Dibbler User's Guide. #log-mode short # 7 = omit debug messages #log-level 7 # Current Dibbler release adds obtained addresses with /64 prefix. Although # this violates spec (RFC3315), it is very useful as hosts in the network can # exchange data immediately. To restore previous behavior, uncomment this line: # strict-rfc-no-routing #iface "eth0" { # ia # option dns-server # option domain #} dibbler-1.0.1/doc/examples/client-addrparams.conf0000664000175000017500000000135512233256142016667 00000000000000# # Example client configuration file: address parameters # # Warning: This feature is non-standard and is not described by any standards # or drafts. There is an ongoing process to create and publish such draft, however. # log-mode short log-level 8 experimental # Current Dibbler release adds obtained addresses with /64 prefix. Although # this violates spec (RFC3315), it is very useful as hosts in the network can # exchange data immediately. To restore previous behavior, uncomment this line: # strict-rfc-no-routing iface "eth0" { ia { // address-parameters contain information about prefix length, so client // will ask for it. If server supports it too, addr-params option will be // granted. addr-params } } dibbler-1.0.1/doc/examples/client-win32.conf0000664000175000017500000000100012233256142015476 00000000000000# # Example client configuration file: Windows # # This config file is commented out. # Dibbler-client will autodetect all up, running, IPv6-supporting, physical interfaces and will try # to obtain one IPv6 address on each of them. # To manually specify, what parameter should be obtained, uncomment appropriate sections below. # To get full list of supported options, see Dibbler User's Guide. log-mode short # 7 = omit debug messages log-level 7 iface "Local Area Connection" { ia option dns-server } dibbler-1.0.1/doc/examples/client-prefix-delegation.conf0000664000175000017500000000116612233256142020157 00000000000000# # Example client configuration file: Prefix Delegation # # This is an example configuration file with prefix delegation # enabled. To ask for prefixes, use 'pd' (or 'prefix-delegation') keyword. log-mode short # 7 = omit debug messages log-level 7 # Dibbler-client will attempt to try selecting downlink interfaces automatically. # Usually it does its job right, but if you have fancy setup it may be better # to specify them explicitly #downlink-prefix-ifaces eth0, "eth4", "wifi0" iface "eth0" { ia pd # it is also possible to define requested parameters for prefix delegation # pd { # t1 1000 # t2 2000 #} } dibbler-1.0.1/doc/examples/server-win32.conf0000664000175000017500000000047012233256142015540 00000000000000log-level 7 log-mode short iface "Local Area Connection" { # clients should renew every half an hour T1 1800 T2 2000 class { pool 2001:db8:1111::1-2001:db8:1111::ff } option dns-server 2001:db8::1, 2001:db8::2 option domain example.com, test1.example.com } dibbler-1.0.1/doc/examples/server-addrparams.conf0000664000175000017500000000132312233256142016712 00000000000000# # Example server configuration file: Address-parameters # # Warning: This feature is non-standard and is not described by any standards # or drafts. There is an ongoing process to create and publish such draft, however. # # Logging level range: 1(Emergency)-8(Debug) # log-level 8 # allow experimental stuff (e.g. addr-params) experimental # Don't log full date log-mode short iface eth0 { t1 60 t2 96 prefered-lifetime 120 valid-lifetime 180 class { addr-params 80 // addresses will be assigned with /80 prefix pool 2001:db8:ff01:ff03::/80 } # provide DNS server location to the clients option dns-server 2001:db8:ffff:ffff::53 # provide their domain name option domain interop.example.com } dibbler-1.0.1/doc/examples/client-fqdn.conf0000664000175000017500000000101412351614666015503 00000000000000# # Example client configuration file: DNS Update (FQDN) # log-level 8 # uncomment following line to force S bit to 0 # option fqdn-s 0 # Set protocol to one of the following values: udp, tcp, any ddns-protocol udp # Sets DDNS Update timeout (in ms) ddns-timeout 800 iface eth0 { # ask for an address ia # ask for DNS server's address option dns-server # ask for fully qualified domain name (any name will do) # option fqdn # you can also provide hint for the server option fqdn dexter.example.org } dibbler-1.0.1/doc/examples/server-guess-mode.conf0000664000175000017500000000052512233256142016647 00000000000000log-level 8 log-mode short guess-mode iface "eth0" { // interface-id 5555 class { pool 2001:db8::1/64 } pd-class { pd-pool 2001:db8:1234::/60 pd-length 64 } # common configuration options, provided for all clients option dns-server 2001:db8::1 option domain example.com option vendor-spec 5678-2-0xaaaa,1234-2-0x0102 } dibbler-1.0.1/doc/examples/server-client-classification.conf0000644000175000017500000000123712277722750021060 00000000000000# # Example server configuration file: client classification on the server # # Server assigns clients to one of defined client classes. # Then selects pool based on which class the client was # assigned to. # log-level 8 log-mode short Client-class TelephoneClass{ match-if ( client.vendor-spec.en == 1234567) } Client-class CpeDevices { match-if ( client.vendor-class.data contain CPE ) } iface eth0 { class { pool 2001:db8:1::/64 #deny TelephoneClass allow CpeDevices } class { pool 2001:db8:2::/64 allow TelephoneClass #deny CpeDevices } class { pool 2001:db8:3::/64 } } dibbler-1.0.1/doc/examples/server-3classes.conf0000664000175000017500000000155112233256142016317 00000000000000# # Example relay configuration file: 3 classes # # This config file shows how to configure multiple classes on one interface. # Note the 'share' parameter which defines, how prefered is each class. # For example: # share = 100 for class 1, # share = 200 for class 2, # share = 300 for class 3 # would mean, that: # class 1 provides 100/(100+200+300) = 16% of all requests # class 2 provides 200/(100+200+300) = 33% of all requests # class 3 provides 300/(100+200+300) = 50% of all requests log-level 7 log-mode short iface eth0 { T1 1000 T2 2000 class { share 100 pool 2001:db8:1::1-2001:db8:1::ff } class { share 200 pool 2001:db8:2::/64 } class { share 300 pool 2001:db8:1::1234:5678/112 } option dns-server 2001:db8::100,2001:db8::101 option domain example.com, test1.example.com option sip-domain sip1.test.intra, sip2.test.intra } dibbler-1.0.1/doc/examples/server-script.conf0000664000175000017500000000026212233256142016101 00000000000000script "/home/thomson/devel/dibbler-git/server.sh" log-level 8 iface eth0 { class { pool 2001::/64 } pd-class { pd-pool 2001:db8:1::/56 pd-length 64 } }dibbler-1.0.1/doc/examples/server-prefix-delegation.conf0000664000175000017500000000231412233256142020203 00000000000000# # Example server configuration file: Prefix Delegation # # Server is able to grant prefixes for clients, who ask for it. # Prefixes can be assigned besides of or instead of addresses. # It depends what client asks for. # Logging level range: 1(Emergency)-8(Debug) log-level 8 # Don't log full date log-mode short iface "eth0" { # clients should renew every half an hour T1 1800 # In case of troubles, after 45 minutes, ask any server T2 2700 # Addresses should be prefered for an hour prefered-lifetime 3600 # and should be valid for 2 hours valid-lifetime 7200 class { pool 2001:db8:1::/64 } # the following lines instruct server to grant each client # 1 or 2 prefixes (if you have uncommented second line with pd-pool or not). # For example, client might get # 2001:db8:2:6485:0/64 and # 2001:db8:3:6485:0/112 pd-class { pd-pool 2001:db8:2::/48 # uncomment following line to assign 2 prefixes for 2 different pools # Note: each client will receive 1 prefix from each pool. # pd-pool 2001:db8:3::/48 # length of assigned prefixes pd-length 64 # you can also specify t1,t2, prefered and valid lifetimes on a per pool basis T1 11111 T2 22222 } } dibbler-1.0.1/doc/examples/server.conf0000664000175000017500000000450712233256142014605 00000000000000# # Example server configuration file # # This config. file is considered all-purpose as it instructs server # to provide almost every configuratio # # Logging level range: 1(Emergency)-8(Debug) log-level 8 # Don't log full date log-mode short # Uncomment this line to call script every time a response is sent #script "/var/lib/dibbler/server-notify.sh" # set preference of this server to 0 (higher = more prefered) preference 0 iface "eth0" { // also ranges can be defines, instead of exact values t1 1800-2000 t2 2700-3000 prefered-lifetime 3600 valid-lifetime 7200 # assign addresses from this pool class { pool 2001:db8:1111::/64 } # assign temporary addresses from this pool ta-class { pool 2001:db8:2222::/96 } #assign /96 prefixes from this pool pd-class { pd-pool 2001:db8:3333::/80 #pd-poll 2001:db8:4444::/80 pd-length 96 } # provide DNS server location to the clients option dns-server 2000::ff,2000::fe # provide their domain name option domain example.com # provide vendor-specific info (vendor id=5678 will get first value, # while vendor=1556 will get second value) option vendor-spec 5678-1-0x3031323334,1556-2-0x393837363534 # provide ntp-server information option ntp-server 2000::200,2000::201,2000::202 # provide timezone information option time-zone CET # provide VoIP parameter (SIP protocol servers and domain names) option sip-server 2000::300,2000::302,2000::303,2000::304 option sip-domain sip1.example.com,sip2.example.com # provide NIS information (server addresses and domain name) option nis-server 2000::400,2000::401,2000::404,2000::405,2000::405 option nis-domain nis.example.com # provide NIS+ information (server addresses and domain name) option nis+-server 2000::501,2000::502 option nis+-domain nisplus.example.com # provide AFTR information for DS-Lite clients (B4) option aftr cgn.example.com # provide fully qualified domain names for clients # note that first, second and third entry is reserved # for a specific address or a DUID option fqdn 1 64 zebuline.example.com - 2000::1, kael.example.com - 2000::2, inara.example.com - 0x0001000043ce25b40013d4024bf5, zoe.example.com, malcolm.example.com, kaylee.example.com, jayne.example.com, wash.example.com } dibbler-1.0.1/doc/examples/client.conf0000664000175000017500000000314312420526567014561 00000000000000# # Example client configuration file: default # # Uncomment following line to use Link-layer DUID instead of default Link-layer+time #duid-type duid-ll # Uncomment following line to make dibbler very aggressive about getting requested # options. #insist-mode # Uncomment following line to make dibbler accept downed/not associated interfaces inactive-mode # Uncomment following line to skip confirm sending (after crash or power outage) skip-confirm log-mode short # 7 = omit debug messages log-level 7 # Uncomment this line to run script every time response is received # script "/var/lib/dibbler/client-notify.sh" # Dibbler 1.0.0RC1 and earlier added obtained addresses with /64 prefix. This # violated spec (RFC3315), but was very useful as hosts in the network can # exchange data immediately, without extra wait for receiving corresponding RA. # See discussion here: https://klub.com.pl/bugzilla3/show_bug.cgi?id=222 # To restore previous behavior, uncomment this line: # strict-rfc-no-routing 0 # Dibbler can detect interfaces and ask for address on every suitable interface. # If that is what you require, just don't mention any interfaces # On the other hand, you may want to specify interfaces to be configured # explicitely iface "eth0" { # Request a regular (non-temporary) address ia # Request temporary address # ta # Request prefix delegation # pd option dns-server option domain #option ntp-server #option time-zone #option sip-server #option sip-domain #option nis-server #option nis-domain #option nis+-server #option nis+-domain #option vendor-spec #option aftr } dibbler-1.0.1/doc/examples/server-auth.conf0000644000175000017500000000043112277722750015545 00000000000000# example server config file with authorization enabled # auth is not working yet, don't use it log-level 8 log-mode short auth-methods digest-hmac-md5 auth-lifetime 1000 auth-key-len 32 iface "eth0" { t1 1000 t2 2000 class { pool 2001:db8::1/80 } } dibbler-1.0.1/doc/dibbler-fqdn-cli-update.png0000664000175000017500000021363712233256142015704 00000000000000‰PNG  IHDR«a¿¤7sRGB®ÎégAMA± üa cHRMz&€„ú€èu0ê`:˜pœºQ< pHYsÂÂnÐu>ÿyIDATx^ìý|Õþÿþßßç ÷ È•"REED•&¢€ `¤I—Þ»t齄J ôPI !BH#”„zoÞÿ+<Ÿ¹3»›ÝÍ–™Ý×<ÎÃDz{æÌ9Ï™Å}ò>ç}þÿùÏþ‡ €7€ò     %þýûçÏŸßÜá"EŠôèÑãÚµk„F$`8ÿc¸³Ã$@$@$@$@N%àïïoM Š8eʧö„“ 8œ ÐáHÙ ›@‹-¬1@Q§L™2Æ0{OÞD€èMw›c%   ìÜ»wÏÂüOsfX¯^½ÔÔÔìÚæç$@î'@tÿ=`H€H€H€H@?‚‚‚¤æ=÷Üs­[·Î—/Ÿx§N:óæÍ[³fÍO?ý¤UÁܹscõ êçV²'$`’  Àÿ@Šiw+VŒŠŠ:pà@‡`ƒxÿ…^€æ:u 3?«T©¢õ@$‰™3g’ è– P··†#   7(Y²¤ôº^½zÁ<=ëÖ­+>*Q¢Ä‚ Μ9ƒÿ/^\ëåË—G,Ñ ½ç%I€²#@ÌŽ?'   ¯!¯Ô¹-[¶HŒ~z,[¶ì½÷Þu>ÿüsh^RR¢‚¹råÒz 2Êdddx <”ŒA€hŒûÄ^’ € `w)rBÿTxôé1xðà‚ ŠšíÚµ‹‹‹Cð›o¾1¹8pذaÈ.ã‚Îó$@Ö ZC‰uH€H€H€HÀ+Ô¬YSZrÀ˜3À˜˜˜ÐÐжmÛŠÐ>üܹs›7oþàƒL.ôõõõ ‚$ èž P÷·ˆ$   —@Oäó”þ†´ŸÒwïÞ½zõjÌ1@ ŽcÇŽíØ±sAÅ)o¾ùæŠ+à³fÍ*T¨Ö‘9&""Â%CáEH€Ì òá    È"€0Ô¶¼y󆇇 „ò!³ >ªZµª¿¿¿Ò!Ç_¼xñk¯½&ÎýòË/‘;4%%¥K—.&vìØ‘‹ùÀ‘€ ÐÝŸ—&   À´Oi€ØúïðáÓ““!~˜ê)>ýñÇ1TÄ…âˆíׯ¼H„þ!© T;ÅkƒØq~ìØ±\¨£{Ï®x 7ÝmŽ•H€H€H€Ì€˜I[Cúi€W®\ÁI>>>ÊaŸ>}T „òµjÕJT+\¸ð¸qãÒÓÓýüüÊ–-«õ@dšXò† ¸˜ ÐÅÀy9  ð ÕÌcþ>fΜ‰j–G‹:¢UÍÆãM$± –¹Ö,7"Çbëålê›þ+c_¥¤áÒ>|ˆþcSxT¨óeCQ3?§N*c€0@$űuëVÜ>QçÝwßÅ–ð@Ø œPëÈ=ƒh¡þù°‡$à1h€s+9  p¸ö§¼Éw`Ë—/7×3Ø¢8 *ë §ÞĹ6 É\k–‘c±õr6õMÿ•ô“w°bÅŠÀ" ðäÉ“è<$Pì?}ފȸó‹Wm)÷þ³œŸ•*UZ·nôOà‰§Çüùó‹+&ÚlÔ¨fB¶±u„Éç¤GÈC£Jì! x ÜDH€H€\MÀz?÷Í…×h€®¾sæ¯'r½ˆ£sçÎÒ¾ÃIÈŠ÷ŸË•+üHêá¸tQþ˜8§@Ága½fÍš‹ 0@Dö3æ÷ßÏ—/ÎÅâÀÞ½{Ÿ>}zÿþýŸ}ö™Ö1»ê{BžJ€è©w–ã"  'ˆ`PÕ9„ø¹/By$ÐܼMÆxóL5ššªT²•+WJ¼{÷.Î5j*Ôü¢^Ô‰te‰ˆNm߹̟" LÏž=±5¼4@H BˆHóý÷ß‹ö1tîܹ.\XµjÕo¼¡õÀ2eʸxø¼ x WÝn–H€H€C@i€–[DôOþʇïYyy • UmΜ9ò6½üòË‘‘‘±Æ—xòäÉ'Ÿ|‚ Ãÿ˜Ÿ¡-»öÇ4mñ, f~Θ1CÄ…âÀüÏ7V®\Y\åÃ? „Ž9R¦UÚ 2ˆBJ5:¶C$ $@äó@$@$@$`3ë MK „×Yy% • UM¹gC“&M¤¦¥¥á/^|î¹ç`h»CcŽœÌ0W|ý?ü¨ª¹>úy>• X6@Ùáª>˜Ìq*:‰>(ÏÕÚ¯~ž€Ž;JÝúôÓO¡Â¯C'‘ ¦@¨°|íö˜S­/{ÂŽ÷ý³é üóÏ?E P`ÒÓ›ÅW¨PA\ý‹/¾€|ž={vðàÁ&"¢˜‘‘¡nì ” Р7ŽÝ&  w°ÕÑW)oÊÍß-  nÚ´IŒ;(S˨âB²5q"Lìd€-È ¨¨dgÁ¥Â©¢ŽOù‘6®(.$ÿ‹ è˜å}Ýy/ÿó±ÑŸ8†* A9tl÷îÝx¿`¡ÂÇ/ÚQÖnÞS©ò³éå­]»Vi€ÉO$•‹¡£0Cl)¡ý¢˜­Š} 1mÕ½Äxu04 ¡o;O$@$@î!TNøÌÖáQXF¨¤ ñ©\Ni€x­: 6(%P©Žæ P¶fn§x)*•WAmçÝsÃÌ_Ulô'¨²4Àà¼.]ºàӆ߶8žxÑî2mö¹8“?ÃÃÃE P`JJ vìÔ©“\8zôèÌÌÌ;v k¨²{â5úúúê$ûCF!@4Êb?I€H€H@G\f€æ2ÇÈ›ŒòN¶Î†Ö„B(goš3@“º¨¼&[Cy¢•ioÜ{_R“ŠUºtéC‡ ÄvèØÃ‡Ë•+‡ Óæ,Mº”“w¶ß Qbq L¯[·nôI„bûl_§NÑtfÍš5ð@ä¡Á.‚Z¬R¥ º—¯NF$@4â]cŸI€H€HÀÍ\c€R§È0 2‹4@ Ju”M ¦ª å0§k[3÷¦›o˜ùËã¤\µk×N Pkx ¶#'ÎÆ%_Êy9Øê—⊘ù9mÚ4ˆãôéÓ«W¯.Uª”¨óÕW_!J‰ÎôíÛWDUfrq nŸ.vLŸh€ú¼/ì 蚀k Ђ}aâ¥6šgnN©¥˜º s“ÁC“‡íc¢©ØÝä¡mÍXˆÍ”Bµxñbi€·o߯X&L˜¥ÁŸ~~"å²ËÖÝáhS\™`Ö¯_¯4@H ö!ÄŠDäE¬ýëÑ£*@ëׯ¯•Àüùó;–‹uýW;§'4@=Ý ö…H€H€ BÀ5¨]Ë'ñ˜Ô6a€–7]‹÷ärD MieÃÜ;ÊÅ"0h9x¨“ûìãã#G„„ŸÐ?a€X•‡b+ˆÏ>û  ŸzÙáeþ’5¯—z¶ÍÆ×_K‹ 0@Ø9P&þy饗&Ož|õêÕÍ›7‹‰©ªùl°½NÀ²$ g4@=ßöH€H€tJÀV´o7 ³o?öW…-Òab¸ôÅ‹±= *ìÙädj¦“ ô2ßß‹‘ ;JÄNñ8ï­Y³¦è'Üo×®]ð@Ø ÉŨ‰P¡³¹±}04 ¡o;O$@$@î!`«ZØ^ü²WÆÐ0$¹¥ž¹á¹,ˆž[˜*?RöÓ(1@L›ÄüIi€H¿) ³C1"$bÁ§Ó%œÎtj‰<–üs›g{bq Ì_Ä…b‡@+V¬›Å7iÒ 5!Š˜j2*‹÷Åx h ÐùT ØLÀV”é1U9Z²ÝÞ\ÏdNåv|Ö¬´2Œ\hrÏw˼Œb€r-%$ ±¾ÀÀ@a€QQQ˜ÿ‰1þôÓOø¨]§îпSiWœ]vì=P£æÂèÞyçø§ÒÏ;‡œ1 ‹ûõëwáÂt[Ék=r;eÊ›Ÿlž@^@€è7™C$  G°É¥M)ó¯ˆY6@ +úäò0åŽ ²5sÛ0È-•-› 'Z9@\e2€©ÿu€ÊÚ|pðàAa€§N­¹sçNÑ¢EaVK}7¹Æ…a.\ºöíwž-ó«[·.v1@ ŽóçÏc’g«V­„òaqà¢E‹®_¿îçç‡Ý#´X¦L™€€G?þlŒM€hìûÇÞ“ €[X)HèjÊ 2^gâ½j³uq¶Y7¹ ƒ4@ÕNñ‘¬ ìI¶ûb“t“e MeªF‰"uŠT¦ž={J¼t鯻oß>|ŠíûâS³¦€ÂÍÏ \uMùÇäB…²öÄ;wÆÎÒ!0ùÝ»wW­ZUô¿R¥Jø#<A_x!k¿AÕQ¯^½øøx·|SxQÐ! o »D$@$@z'`b¥"uRÿLÆÄ,Çñ;ÞäY2¨š¢)[ÉÚ-¥‹ªB‘æ P¶†úª(Ÿ¸=2­¨*c! ¹^”š´qãFi€÷ïßÇè~ÿýwThÜ´…Ò“Î\M:ë¢r$.µcçb@,„݉ 0@عLe>< ˆ^bâh›6m´ˆ-%ú÷ïÏÅzÿ›…ýs  K0ó"$@$@$àY¤5 IÓRüÄoqüB¨eí,PѾŒÂ!ì&½ m"¨lSi€8>±éþ‹d—TÂfÎ•Ž‡sq–ÜB³Le7´ŽjÄ9©I¯¾ú*ôO 6`ÀÀ>|X±bET˜4m¾Ê“Ï^M>çºq´v½¯DWË–-‹ÙžJ„"a n´E‡Ž¦¡¡¡ò)m°H‘"sæÌñ¬ï"GC6 ÚŒŒ' ( PoQ¾BpF¥j eÄ/{¥ï)­Òd\Nî¨\yˆšÊµ™], R…ǪZC÷´fk”û+`\ØB ü £NJJ7ñàÑ$­¦œ»–rÞ¥e•ß–wÊ>[ˆ)è­ˆâ@2ÇoÔ¨‘è3„vÕªU7oÞÄ_yåíóùþû]Ìï5 x  —Üh“H€H€I@̨´|ÀŽ”q3“—¡9­Î‰7E°N9•Th˜9¥”­á,„ UQ e,QÙ9 «•)£šÚe¢YÑys­9ò6ØÛ&CbV¤T£Ù³gK®."„•*r"Áÿß:@ÌE ˜zÞ eô¸? ~¶8°K—.Ø B â~8ôE„.qT¯^wk4¹8°aÆ8Ý^„< L€hà›Ç®“ €—@À¿æÙ3¹ÏÔÇŒM|LÎAµ‰Z@k&“ÚÔŽ*ûúúJýË›7/’¾{©c+ˆ¯¿þzölÁO§_w}9v2­S—ž¢óXˆ)"( ¾‡cÆŒrq ²È`õ BšM›6Õ¡ÁC‡žˆz¸)ì ¸Œ Ðe¨y!   ÐÖ­[Kª]»ö„¦¤¤ Hª -D…­»Â-`ZÆu·”½ûÕü¬–2‚b'C¥^¾|Ê×½{w±8Ž?þöíÛ{÷îý裴ˆ-%0_T7† — º3/B$@$@$@º!)’"4dÈi€W®\AW¯^O‹/—|9[ˆŸØ&*(–;ªH±÷ ê÷ fÏrL€˜c„l€H€H€H€ŒC |ùòÒyî“(b_ø#>Å º¨gm2Àó—nº·øùo{ãÍÒbhHÄ ÁSI`rrrÇŽEl 8}úô»wïîØ±ã½÷ÞÓz 4³FsWÙS° ÐX¬J$@$@$@†&ššª´eË–I¼ÿ>†&"„Ÿ×þ26ù’­˜~é¦ÛˈQãò=õAb±ÄÛª<“`¿øâ Âá°A“‹±k¢Èʃ<‰ Гî&ÇB$@$@$@–`ûi€/¿ü2tH`LL N{øðáÇŒ £ÇO·Ç/ßÊÐA‰‰KjÕ:k)#Ž%J¬Y³Fä†QxSîñجY3l-ˆ-%0;T Ä;=zôÀŠ|°HÀcÐ=æVr $@$@$@$ FIÉÁTIi€gΜÁ™Ø:ï¹çžC… ˆX; 0óV†>ÊÖ€½?¬$ûù矇‡‡«$ƒr$@$@$@$ d7Q&À„ÒH¼qãNž={6äç½ò']²Û/\¹íþ’yÑÈôË·¦LŸS¨pÖÞ˜Ú­[·ÄÄD±c„8ÿÉ“'"7f§®½sh€¯Ü¾xÕ} ú·"9͉Sg;wí)^¸pa,ùSI þˆÍâ?ùäQîÛ·ˆ½%”'JtõêÕySy€A Ð zãØm   °€Ì„ ™©Q£ôO ’d¢¡ëׯ(P­Ý¼'çxéêwø§Ò±M¶+ ÚYó³ZÂâ*V¬¸}ûö‹š›ÅCEl1™±¨ÒµkWm0¡Ôþýûsq mÏkë† P7·‚!   gý‰£OŸ>Ò‘-—ݶmÞ/X¨ð±Ä‹1ÀË×@;Mà™Œié×ç-^Y¼Ä+‚&?~\¥°>äƒÁ”QT@p̘1˜{èÐ!³Ö±¥2ë8óޱmp  S°²Q   Ðìj t˜õë× „Þ<~ü]†ß6w f^¿ëÊá´l€©é×ãS.tû½Ÿp<¤9r$²€ªŽcÇŽÉ”9Ðf???dIÅ_}õU­bÅ   ]Ýkv†, ò !   Ï' 6ú6B@nLa€Ø9ƒ¿sçλヒ¦Ìöq¬^¹~×5ªi¦œ¿–|îjÄ‘“µëÖ4Þxã 6h=AQÌu>ýôS oÞ¼9zôh“‹aŒžÿq„A€è·‘ƒ    ‹°¹¹4À¶mÛJÞ""„ˆŒ:žæ`¼q÷ê{Î.Wnd­7À¤³WÏ\Y¾fóë¥ÞXßáPÐPS§N•‹»wïŽ-%Ξ=ÛªU+m0‹¡ÙH¸Ê'‘tN€¨óÄî‘ €w8|ø0"T8°[räX‘%ÞGï"âˆÑ"g‰ÒX,X I/qàE…Oªsê‚ã ðæ½kÎ,ÐKû ðTÚ•„´ÌCGçÍ÷‚à^½zawx•&$$ Œ\8yòäG…††"k¨Éž¾¾Ž¸ilƒœE€è,²l—H€H€HÀ<ñ«ºZµj*ï»Ý±è }s{7lbëãã#] ?¡±:ÚÁ"7ÌrD…AÃÇ;ϯߺ̡ž<¹ÿP\ó[ Dˆø—6ˆ!â„¢6D6Q¬Ÿ\¹r%òÁh=°J•*ÀkÓ=bep ËPóB$@$@$@ÙйΜ9S'"š=JE-ZHK©_¿¾4À´´4Ô´Flˆ Û÷F:ÕoܾïØ¥tˆƧ^>‘ry•_ÀûåŸ-ü«Zµ*vL×ÈS¶lY9qi` åСC1Të­[·æâ@›TVv  k8ó*$@$@$@V0g€ˆ¼a¦"Ž[·nYÕs*‰Ù’zEZ?>¬LS&/1b„4@lu€v.\ˆ•|ý£ œm€7oßwTL:Öã’/Å&]=~¶Äw¹]»v'OžÔz æË—ÄÆ€W®\9þ|Æ µòcÇŽåâ@ëWÖt  ó$@$@$@Ö0g€ÖžïäzF4@ȳ4ÄúvîÜ) 022òÉÓãûï¿G…_ÚwuÞºóÀ!åæN2Àã‰âNµéðl#xL 7nOuÄÇÇÃXL={ö_ýµwï^l¡õ@l)\;N~6Ù< XK€h-)Ö#  p Ã!÷èÑC:I… „ž:u ×B’˜—_~,[ï¼}÷AË­»œj€È…ƒX¨@hÕêŸ t˜ù¹eË­†„„|öÙ³:p¿ÔÔT Å6ñÚŵÃo.$;Ðí€ÆSH€H€H€ì!€`TïÞ½‘FEˆ§a~ª!sˆÉŸøÈBþ4…‘AT4Ž YاÙÑþ+®®ìZX¾|¹vxâ4+”u,÷Ç@Î9iK¤vëÖMà¥K—pÁÝ»wãÓ¼yóEŸÌp¡>¼}×þâ 0™<Ó§h± æy"”wNs¬X±¢P¡B¨€2âBö0;Tµ8Pø!p; Ûo;@$@$@žO@äÏÔÎŽÃîp*åøí˃ îД¶}\Tjžò*¢3"Ý(Î5Ù±M›6iOÑÖÔyRPX‡²ÏHd" [`€pBTø¦qsWà{í.PGWà‘øŒˆèÔö¿õz.W.€Âò¿ ŒJŲ@̰źAL=qâDlllß¾}%|Ä=ÿ{΄ Ð 7ŠÝ$  Ã@¸Lþ†§É t6åÖv tK“›ÜBP ê\¥FâµÒÑI±!¡‹x­ÿý §L™"ác¶'ôO üÔíÛ·?øàT;yŽ‹ ðwï?²µÀ]o€Q'ÒÇ¥ï‰þô‹g»A|üñÇH *µkׂá+¯¼²gÏž]»víØ±cÛ¶m›7o®^½º„¼ †ý³ãžF€èiw”ã!  ]ÀäLiMˆ¶©Â}ò#9ñÒV„˜‰Ùp9ÕœR™µWQeU$ñZ9_¯Íu7\&˜š5kJ iÖ¬™4@„°0œ¸¸8ñiÈ¡×à½ûî=°¥ÜäFŒŒ;0ö|ß!cë7ÞP`çÎñf›6mTøüóÏKøÜ&^W/yygh€^þpø$@$@$à\rŽ¥JÿÄUešJ¹ÿ»M(£‹ªíã夰©®. Ð䉲WPAc V£)—¢Í˜1CàÝ»w1´Ñ£GCQ*~TsÝb€÷<¾ÿкWÔ¶j›%{¿þú«Ò!„xsþüùJ” >Â]`çþEÃÖm!@´…ë’ ØH@ÄÓð_mÒÑLÌÞa:› PMæníË(;. ;¼›ɳPÓXˆ¸“ŒAåÉ“{ŒŠŠÂX>|øÕW_¡B×ߺÑ<|lM¹¯,]&k;øeË–ùûÀ”ZáxX¨4À¦M›JøˆÄÚø½aup" á²i  ðrXG'§hZ‰Â&4çi&eO™²E ¹<.¢‚Ñc€X{&%¤V­Z¡¡¡ÂERJä…¢ÂúmûÜk€=±X²Q¸qçàÊ•+Wbb¢4ÀaÆáÍ/¿ü¡c¥/^\ÂÇjL+ŸV# º2/A$@$@^J@N§49Ô$ë PÖ„§!4gîqBe¸ÏœàÉ.y†*w¥8p 4À7n`¤b-¶:ˆŠOw»>züÄ\yøH/Øoè8«[·nšâ+-ñø) pñâÅRÿðÙA½ô¯[—h€º¼-ì x9g/¬¨ü©máµ²Þ`€JHP) ðàÁƒOž?ÿü3*üЪN ðñã'Ú-Ô~\-kó÷I“&Iü¬F®!@t g^…H€H€¼‘€Ë PîÍ`á…· ˜(޲eËBÿ„Š-.˜äÕW_ÅGó–øéÅŸüõä¿ „P?v$El Œ§ÿ>ýïTªTiß¾}J,W®œ„ߣGoüòsÌ:&@ÔñÍa×H€H€HÀà0ñRüvj Ð\"P ð¼!X¾|y)!¿üò‹4À‹/‚LHH>…Ò„G§êÊÿúû€ êʧÏ[bï¼óŽÔ?¼é^ºwï®4@??¿çž{NÂWî5bð/4»ï!h€r#9   Ð!sS:•]Åïcˆ"jÚš Tî4¨Í×’- 7@äzQNŲ4i€=Ÿ^½z¡BÍ/ê>‘®3̺{Ð@½`“æ-…ì­< *„7W®\©4ÀHøùóç¿wï^¶$+€+ Ð]I›×"  ¯#mºN¹a •X¿•åÖíbf£Éíã@RYÇã ÐÇÇGJòÁìß¿_`ll,(ݾ}»J•*¨0lÌà_º4À—‹•± 6HýÃk¼óÒK/¬Òk×®-á·hÑÂë¾ó°î Ðu‹ØA  02l·ìS)¢M(íW1 ÖgrCœ Î§ö5jÔHJ^K&L˜€w¾øâ 컨4ÀR¥JIøcÇŽµçþñp2 “³y   §+Ãj=±_~"‹Z}‚ BÏp¨æm"¸'Þ7™ôÓAEÐOÙ¸ šÄÆñ©¹Õƒ8ÅB\KÄäÜ~ñ¹”äü”xõêUômõêÕø´@ÁB‡bÏëÆcÛw åÁÃÇ÷<ºwÿÑ{oß}xëwܸ}ÿú­û×nÞ»zãÞ•w3¯ß½|íÎ¥«w.^¹}!óvÆå[é—o¿tóÜÅ›g/Ü8“q#-ýzjúõ”ó×’Ï]M:{5ñÌ•SiWÒ2OžÎŒO½|"år\ò¥Ø¤KÇ/K¼sêÂÑ„ Ñ'3ŽÄgü1iˆÁ¥¥þá…H÷2jÔ(¥")¨òß âããÝþ0°$ %@äSA$@$@$àjRwæ¼+h’–óv ÚâTJ Y»v­0Àððð'Omа™~ ‚—mq£~ݸ9ˆáŸAGqqq¹žî¿yóf¥bów nÐGˆÝöx4@¿Å €ÀÌC)!Qb—a€"…Ä$eË–E… ÓêÄï?@|Ïšâ¶`Þ¼ù@lçÎÒE¬¯téÒX ¨4ÀJ•*Iø°A/zì8TC êv±³$@$@$@$`‘²H ùå—_¤bùÎ;sæŒøôÝ÷>X¼r‹ÛgÞÃÜNë‹;fÎ_º¸Š+–¨8Z·n7;wî¬4@(¢ØcCÈÇÃG•ôI€¨ÏûÂ^‘ €Í”ÁCBæÌ™# 033S4·téR‘ G“æ-wî;ŸŽÕnXó†•oXÿ†UpÇ“.Å&_ŠKÎZŸš™p:Kæ°p.éÌÕä³WSÎ]K=ítúõ´Œëg.ÜÀ*;¬µÃŠ;¬»ËȼuáÊm¬ÄÃz<¬ÊÃÚ<¬Ð»zóVëaÍVîݺóàöÝXÎwåþ#[‹ë×vèÜ  ¾ÿþ{¥Bñ&h+ k¥þ!G(öä°ùþñp  K0ó"$@$@$@$àL˜‹X¥Ji x þI$@$@$@$`H˜g8lØ0Äú´úW½zõW_}U¼=ë6mÚýÃöôˆ½}û¶ó† ^{í5Qó³Z_E:{(&‚漸f7ˆAÃÇ s”$@$@$@žEÀßß¿H‘"Z÷«P¡>:}ú4\~ˆÉЍƒ ŸmÚ´Ù»w¯0@ì Ä?|øPP4hPÞ¼yE¼«S×Þ‡ãÎ:i ÌÍQÅû~V+kbçðáñň8"##sP•³@‘tGÞ LÇõ¬g£ñ44@O»£ €gÀŽÊ„ŸR< *4iÒ¤´ÿ>Pù§Ÿ~u^~ùeì! Ká32Zuîܹ–-[Šš ž6w©32Á@ÛXœº#üÁciÏ=Ýôæ, ðÏ?ÿÄ;ÕªUX¥bã y# ÞžýrtF'@4údÿI€H€H€¼…l­cÇŽÚ¸w¿ýöÖª©ôOþqÛ¶m}ô‘8AB¤E ˆbbbb®_¿. "sLùòåEÍJ•?Ùº;ܹ@!l/È2zõÆ=dEÞQdERd"½y;ãò-ä&E†Rä)E¶Ò37ÒÒ¯§¦_O9-ùÜÕ¤³W‘Ú NÒ2OžÎŒOÍÊz—|)6éÒñÄ‹˜‹œ¨³®„·ß~û¤âhܸ1Þìß¿¿Ò×­[§¼)øÈ[žHŽÓ˜h€Æ¼oì5 €—@øNLéTuëÖEXÏœû)ߟ?¾œ8 “Ùºu«0@˜ÍÍ‘`U[Á‚Å…Zµéy,Ù»A`CÇçà?·Çð»té¢4À|ù²v‡:¥8PÞ”’%KzÙƒÉá Ðx÷Œ=&  ð*Ø[¼L™2Z÷+UªÔš5k°É»8°Ùõk×Ο?/ßѾHJJBüJ$É“'O§N¤B:c|üø1ð¢©nݺ!ºˆšùò½0b̤îUsRqR °h±;â¥ñxwbQS¥";ÒzÕÃÉÁ‘ Јw}&  ð På.sR3‰Âb3¥à]¾|Y˜Û_ýuãÆ Ø „½|ýõ×¢5øÌÔ©S¡Âq9räÂ… ‚/²†Ê5‡o—-ç·q—=;ÂcSx'‡Ïݸ#pGê^´k×o¶oß^i€!!!bgEq@×½âÑä L€hä»Ç¾“ x(„àzôè¡ûá¶mÛB̤àaqàýû÷U=z'´ ø)Cßÿ}q‰?þáDa€Hƒ—¸yó¦h›I Þ(j6øæÛƒÑ ©ç¯N¿ž–qýÌ…Xe‡µvXq‡uw™·.\¹•xX‡UyX›wÅUűë»÷„Áb®ì Åñúë¯ãMìõ§4À)S¦ÈۄજIë¡&‡å h€žp9   O"€ex&wz@8.((ñ=q¤§§ËmýLfˆhž¬oòÅäɓ嵾ÿþû={öD¢KÉÉÉ<@ãlŠ vŒÀ¤Ð¾†%¤^°Æ!f.+Ìóaåªé˜1c¤îÞ½ïÀñ€Ei€"7Œ8°õ¤çcñT4@O½³ €ñ@ðd*Ne°xñâ .” ‡½óÉ“'ÖŒ–W´à˜ßøûï¿‹Åp<,”…)£X[(¦˜"Þ(…§Ô¥—®ò³„’¹¸8$hXÔ)±3c¥bÚ-ÞùꫯsUi€ØcCÞ)¨»5w„uHÀ½h€îåÏ«“ @ÔÔÔFi§}bÉ” \” wìØ1›¨Á!–ƒû÷ï¯S§Žè@éÒ¥çÍ›‡` VB{0­T\©G?øàQ³æçµ‚B#MÎ…Œ¹¥ä|7ˆ Sæah•*UŠSØob?@¥._¾\yËpmº/¬Ln!@t v^”H€H€H€žÀK™ŸSe€Ø¢!8È›ê˜={öêÕ«atÖ@¼{÷î®]»Ö®]«mGûV¾õÖ[Ïì®fÍ-[¶Äž`_„[·n‰‹Î˜1{Уf®\¹;wû=>ñ¬r 4Ì%‡û6ü¶ÆÕ³gO)€¾ˆ “•øë¯¿Ê[†à­5·ƒuHÀíh€n¿ì €÷ðõõ5¹äA¶;wšs6¤fâÀÆt2_‹IˆÈì²`ÁÔÄ)Ö ¨#÷D–ËÖ­[#Ý¥0@GE¤K,DºìD/¨pá—æÌ÷™`Ü_r¶#|Þ|/`D~~~H‡#ŽiÓ¦á>ú“B•øî»ïJÄ4Qï}Ž9rC êv±³$@$@$@žB»±W©RE;íµY³f)míÊ•+X†‡P!ÒºÈ÷á!°G¨ÝܹsCCC‘üS&11sQˆ Ê1ŸÞˆÅœá¾Î;‹î(PN( ˆi¨è vžÀE!EŸþ¹¨YñÃJÁað@÷—Ë·“D†RÌPE¶Ò37ÒÒ¯§¦_O9-ùÜÕ¤³W±½!¶¹OHËõò‰”ËqÉ—b“.­\·)V¬˜Ô?¼t{÷î­4@(ºòöá†zʳÉqx8 ‡ß`H€H€H@oO¥E‹¬y†ªó ‘‘%%%™WÄUÑ6y ­ N—â[¼x14ÿÅ”EQ ga§$„¥œ>}ZÖ‡¶Éí °8édäG&_ìÝ»·F¢ŸåÊ•[¶lôR¡à€! (.ŠˆY‰Y[¨ãhÕºíɤs0·; °S×ÞB³fÍàØò(X° ÞÄLZ@–1@‘Fäêí1cHÀ Ÿ    pØ—œ`©Ò¿† Ь›â€æaýžÉn©Ì «±…"ð=¬âæÂýÖ¯_8ž²A,áQ;åñðáÃÌÌLˈXbÉ’%E‡±áA`` 0@Dq`Lj;wî MŒnÔ¨Qb½\¾^>jÌíÅÖ`™·³&v"«§Ô¿uëÖá—^zID¥bsy1WÖEÏ/C9&@Ì1B6@$@$@$@V@\Nz”RÿÊ–-‹št0LÎÄM­ªY67h˜\aò=¥Ô]½zÕòÖbŠ©ÄÚ?ì˜?~ôŽ×±cG„…Š[Ì‹™¨p×&Mšˆ¾ñféuþÛÎa*¦‹-³@wG‰b? 9´N:áM„m¥Â~±Q„ØQ¸¹V<¬Bº @ÔÅm`'H€H€H€<˜‚{Êx‘Ԇ… 7Ê'K—.‰÷¬<`n/^”§#B…­” bF(¢|Ö´çDþ¦<]õR„ô¤¢ÿE‹:uªR!HèŒpWL•YRê}Ù úx"bqî*Ö¯=~:†öÉ'Ÿ(ÇõÞ{ïáMDYå›0@¬®”÷[)ʹµÖ fp/ {ùóê$@$@$@žLËäzô行ø‰×ˆ2uéÒ³4UеqãF$Ѧu1ÇÎlÎÙ „ØHÐ&¾Xvˆ…ˆ$T®\Y ›æauœÒ—°8ðÆâ¢Hiƒý ŸŽ7wÏÞý“Ò.BÆÜR¬ÌóEí/ÑÛÁƒËAeñ1O1÷U?þø£¼­˜kdV&÷ º—?¯N$@$@$౦L™"¦MªŽÏ>ûlß¾}&-KdpY²dIBB‚e.°DdøD` •Í d­¡M¹™»å6‘æep–eŸ.Z´HîcñÝwßa-¢R0+U¬c„Ãuâ%^Yà³2æ–’m.Ð#'ΊEŒP\9–‘#Gâ/¾øB¤À‘B ò¶bÑ Ç>Ę' zâ]å˜H€H€H€ÜJ Q¦L­û½ñÆ«V­ÂLKq`é–üáÀ ñVâ!¦'vðÃâ@¼crðC‘Kþà$²A¼Àn¼8 ØF€h/Ö&     ˜¨u?L†D4IiSŽÉ%xd-òS4‡æ†ÜžJsC˜¡ÜåOÙ }÷ïßGßÄâ@ùQl iD†Uç1tÇŽâZ›7oÆ¥å‰h›O ‚T“6cüúë¯Å¡O˜ù©Œ•)nذKEÍ6í:;™v:ýº+‹åý[ýÒ!«cmÚÈþËt/¸@'®]»Ê[ Õç7‚ŒE€h¬ûÅÞ’ 蔌®ÿþ" ¦:Zµj…¨Ô'©jª‘Àß𑬆9™«W¯†˜-\¸©)ár§‰VÕ”­‰´.JsÔQZD±;TFt>Ñ8ÞÄ…p9¥àa-ŸL AÅè,aï¿ÿ¾82© J¦ô@,ÄÞƒÂN±ÊîÙŽù^2üÔó×\Y,ì_¬xÖ~†"{Ž×x§téÒQÿ}|øá‡òã¦ëô‰d·HÀ      È)¬“‹â”úWµjU잢jbë< * š<åðáÃb§8°7òÇÈOñB©jªf¡p07Y[Ã+Ã}X@(ƒˆt)D4Òd*$‰ÁÎÊšÚ×Xú(9 W –;*'O&&&Šœ™É¦M› P¥ÞxsîÂ)箹¬$Ÿ»štöjâ™+§Ò®$¤ež<ŸzyëîptsY•é^:w    å-Æsúôð|p- kyój$@$@$@žEP¾|ymܯD‰>>>JG²f—?ÁQÛ·oGØ 3B±EYž&vùÇ%ä§III01áxJsƒÂáRÕPMž‚k‰%BPñGùüG *¶¯Pݸ™ø9iŽ;&Ï ƒp*ßÔ¾FxóÓO?Ë•+‡v”ˆ= ØÈ¾xñâ¢æW_7<Os^)X(k—B]eúÃ;ØÖ•GÉ’%åc€Ä§ú{TÙ#Èž 0{F¬A$@$@$àµõ;v¬˜Ä¨:¾üòKƒRÕÄV&•¹acan8¶lÙ"^à•ªÁÐLfg å¥ác2xˆÅu8„ªáM­ªÉmèE?!¨JsCr„¿„:BÃðGÔ‘óH1õ1@¼)/à¤ÒxažJA5)„Hý"= ÙbvîÜ©ÜkGš\0G%´;wï{ôäùøTìÜàà²zÃ\i?•Ý{Ü#©)öQ”r¨*Ÿ¬ÆôÚïnh4@Cß>vžH€H€HÀ‰°ñº2æ#ý¿ûî»X§ªeÛsæfRÕä†ì&›…"”§Œà!T%âÀ üQ)`*USµ©27ªŒIb©¡h{ bë¥ñ"¿¨É¾©†©õ@9GŒ!bú%&Z* &ŒM,Ð8¢¯¿ýö› HÝäióãS.;¶tîÞCù”é^0öýŠ£k×®ò@†›lo7+€> Ðõy_Ø+  p.¤¬ÄoYd4ÁZ&¤µD¦¤*qî% Õ:hÔ«WO÷ÃN'N„wÉãüù󪨚効—ˆàÉÄìGyhç‘Zh—Æ Leg°n z%ßĵ,'•Cº ŠòD„ã01žXȧìd¶[Gh‡©<]¼ävíÚ ÈX°‘ŠñU¹85?ÿüsQóý ú®8‘rÙQ ¢YåÕÅ;¯¼ò žÊ£B… ò‘À²Fåì\C=Ý쬷 zûÀñ“ x's3!„Xð†NÈéd0êþýûkÝïtèб)•ÉÀYÁÓ¦u1GS.‘xr¥5"ñ&…Ú”aá;•ž)[F4ÏÊ]þD‡Q‘=¥ byeƒNëaLLé47Rñ>|µråÊ8ÒobލÒ¡Ç!оL©R¥DÍú ï ‰ŠK¾”Ãr ­!é B¦òºHXŠ7üñGl!äÔ;FˆnŒ›ŽSd±=£HÕãµ_ÜXh€Æº_ì- 8’¦ØÁôDHPîÛ¦”¼‰Pó!QÙ‘×Ök[°_­þ!…iŠ&M.§JëbndP5¹Óƒi]0÷КÀXò¥4gYXÔg“ ¢Ìÿ„Õ˜kPf¯±òÂx±A¢e ħ…ÜcãÛo¿Åó†- å+·©?~¼˜¢ ûµc·ˆ#‰±I—ì.£ÇOGSü±òr¥K—Æ›3gÎ=y :T>Xò•|òla«+¡± 8• ЩxÙ8 Œ„pΜ9"¨!,ÜÂû‘ùøøØ´¹(¨&¾ùæ›X †Ÿõ¬j“Ù\Ì™öOǰ;ü7&&FÙÚõë×A’ïàSQRÍ0‡ó<×®]+tÁ+sÝCkV *„w_,ùƒškPT°FP¥ñBç,Ÿ"’6hÐ l²‡Ž×¹sg¤`Qа"ë b¤:uÏ'9áxâEûÊ絿D#={ö”Ú´iÞA7°îyYå¡|04h Õ?å;؃!A}ë½­«4@o»ã/ Ø@ë¯ò1@ˆŸÉmбV ó­‰VÙpU·VUª/&Zi/lŸ VÍÁÜ”zŒÌ™Hª)²³@œÄNñâ€ø‰|'bÕÜ•+WÄû¨ƒš"­ 4²§D"æ‘ ƒyÂ?eƒh÷B,”o*ŽgòfaÑÜbQ .§TôdÞQ ÿ 4TÆkÙ1é´Y³fÂî†gêÔ©\Ã9r`\ÒÊʼýî¢þÇ/ÚT"cÏäÍ÷.„À¦¼H¿~ýðZÞó߇<Šc„ – P|ŠÛaÓ\·>ø¼¸ zÑÍæPI€H€H ‡{r´hÑâµ×^ûÇ?þ!cƒ¶¬ŸÓUÁOÄ‚²&„%ê@$ÄN H® ‚DUÞ*UÃr;•ˆMš”&&¢j"¦‡È¤JÕTÙYÄþ²5TY=azJsSnC÷UÁI1¡Q%¨¨#ÃDÀPyûÄ&–üÁÍ5ˆE†Ö *æ²bƒDä‰u  "ËhJJJ¶`1QO nœ¼U«V=¥Âaq "ŠbÔbq ŽZµ :xòð‰tY*~T﫬à4@@æ%H€H€H@G¬ ÷©zŒ³DP?¾=u'@1ds[²d‰@¬„TÆ»²•Y w†@öíš@Äôdv,ùSEÕ°cn„l [؉¼£+W®DË&2¡j"}(.}öìYs½•I\DZ ,ö\¡ÁÍ›7g+¨&‡©j\îmˆY©ÖÀÄÆë2.W @ì"ˆ1*ЋµÆ²½g‹óæëÜs`Ø‘Ôȸtü÷¹\¹p+A[žØ¶m[¼Ó¤IòšŠÓÅ ?rh€8ÑNýÀ®x ÷ÝsŽ˜H€HÀ+ ØîSB61ûyóñÚ³ùY0À°°0H”˜(FLƒ„’Ùz Ø%w‡—æ&TmÞ¼y0+ÄÖ°u„²Y¹ä«Ý„Š;Ë 'Ó3T•wGª.‡‹*ùHqQ؈|û:àÒèºÎh—ÃÜK{ÄÚ9eƒ@lŸ6Ê7±U?`?á<¯–c€0@¢Fo¾ù¦‡îÝ»c«Šœ¢hM„æ`nXò'¢jH¤ ÇP©šÖàfÊëJsC åAeT —@¦\N¶ åS©Ýýû÷•*‹ˆ=ß•æ†ËIÕD*¤¥QªšRPáJA•c@!xòéB”ÛÐC§•£[G¨†i’3&ÊŠçG­Zµ–XyÀq–¸(8È=óæÍ‡úmÚ´‘5q"ÞÁWôI\å6¥bÑ`ÎõO´€Žÿ³E°Ž Ð:N¬E$@$@Æ!“pŸj”hJ¬¹Â¼GùKÚ8$ìé©å aí2‘1˜2e üÇ Ä)И†ˆ€i£jP51•ÑÜT+&ÍMq q¥ª¡2dÏdkÐ-ŒB†Ý„  =ƒaÈâ5B Xª§R5íNPV¥ "¿R®DHPîmˆ<Ÿ–W5L-jÌ•Åîrq ¼;Ñ+=‹¡”bà˜1[´hQqï0­WVÃTR¼ƒíàaøÊãÅ_”8aÂG ç‚Úóåä9"@tH6C$@$@n%àpŸj˜ž'öaCîè[Ç纋[c€"wÒ7@~Tü eÇðÒ"K¤<ׂªiA@ê”5ätA³Ê÷­Ù:BL1•gÁáºÂÜ lØåOÙ æ‘ZžÊ}U2ÁÖö"½8 ©Ø†^9jmpR9XÕ0µœÑ~ûöY;¼ã€¶!‡-–n*¸«~âÁF, T~*b}Ø{²*‰'Jýà L|u b5£ëk^‰h€|H€H€HÀÀîSQÀu¡ØÿÀÀ€lïºÒ1Û¶=ª fâ=z´H‚)²px ¨:R„Y6u\enˆà)Û„†™ÛÝäUÄÜKÙ¦þbEŸ²M4h98iÁÜÐæ»B±0OÕVãE R)¨&Qc^nåÊ•…¶U¨P×Rjn®‹7ñiÓ¦MåG8KäøÁG˜”+±÷‰lÍú'š’iKmºÝ¬L9$@Ì!@žN$@$@®&àŒpŸj ØMüêíÑ£‡«‡çîë 6LöhÎp[¾|¹È ƒYˆ˜|(æRæä€¢ˆ œhÄ&*s“}@6Køªõ©G0,Þ37Ø©¹¼£æz sÃDMs "ù§õûÚã憩lÓ;‹)"îc£F œJÄ:Æž={"¼)ßÄV¨‰{ VÊ£T©RòaèÖ­›Ã «mzÂYÙQh€Ž"ÉvH€H€HÀ¹œîSõ[*æÑ9wHºl?ÊÅŠ2yÀ%Ö­[g2Ä)+Võ±,P$ØD Ì¾F$6„ÀËæUynpid”57X¡»&¢Z&…+¢5,J´’-0 »ÃñꫯNš4ɤŠ€!Vý!Õ8ŸfæÌ™Ò‹/î ýC›VŠ´M+“€e4@>!$@$@$ ;. ÷)GŽŸ×bÕÂ&˜÷¨;(®í¿©$q$…Të• üã?ä²@´ Ô0+EU ›ˆ]",˜›90bq ló0¥¹áþ*W ABÓR‡qp* ð‡~p’"Qªkm^þCäC@$@$@º àúpŸjØXò‡ß»˜‰5cº âîNàŽ ¿‹r ìîÏ?ÿTf‚Q „mÕªUb³±,Pˆ<Êîz'z¦27k¡=yuú&TúºÄG"ª†w0;§+û‰ ¥ªKàåp¤ bž'Ε¡gÂZñ&Bpʱ%ƒÌIƒø£ü“6M 3}|ÜyW¬oT Ó$íéÓ§ËÅß}÷ÝöíÛ…víÚ÷뫯¾‚¬bΪú–+W.y÷1"' šµ)O57uHÀ2 Ÿ  p'·„ûLËÿ <è;qèìÚ ejPø$päÈ‘2¨Ö!EH4R®\9!ýû÷‡K(UÇ>„_‰å|°5›Òº¢*s;vì˜4q`ò'–ªTÍ\v¼¯%‚*U ” B5UÛÐ‹Ž™T1LÌ#E›¢“ðCX¢l"ªÍGª¦5n}úô‘‹»té‚)„çO:U6ˆ(èðáÃ¥þAOœ8á<„ÇêìÁgw<œ ÐÃo0‡G$@$ Cn÷é‰n»„ ØQ Äk¤»A˜4À¨¨(|„yƒâ¬*Uª`ì"‡Á@ø § –ˆçÁ@¥5ÙgƒØ5^®šCÌÍÖÅ1÷<í¥!–è¶õ· ʇšš2—wÔÜ%àBìÔQ×@àÚ‰Ý; kÖ¬Áž˜g+ )C•™¢N5@l±h=sÖ$œ æœ![   5†û<ò™PmIøôÓOabb7Xü†³@¥"ƒ%,Ì›7/ê# ¶Y¡²Æ aЙÖÅVæbî¥ò‹1щL-·&³³ìܹÓ\Wñ‘˜j¹¡ŽHxc®5ä2µIP1OUÜmƒÊ„4¸.vD¥Ê $pËÞyç§ê§Úúè²~ Ðs§“ À3 ÷yã0gÎÕtPlù„– Ó _zï½÷ĹHƒÙŒ"˜óIJ–-[wBÒlÍMuÄÜKÙ,HÃ*8‘yFdr«:©j¨ƒtšHš"OG\r%ÿˆ¼šJAI;MP51¯õÍÁ…Dk† ¨†ÊÈtªlÝ“Ý@ ÷;d`ÓB•–.]ZÞånݺѽá«íUc¤zÕíæ`I€H€O€á>Ç3Õw‹”)÷ €* ¾7wî\ 1@˜dàÄêA¡È?‰ô0"˜s Ä&xrSsæfªªçÏŸÛ"!§rÏwU†œŸ°,eÏå’?1ÅT~$šªT©j ŠšZ[³UPa­ :ªpZÑ&º$S}Â{vC0«5ÀÅ‹+%;Òõýdïl&@´O   †û¼ü@.¹³œ´…ßÿÝÜ,Pi€@̱|íµ×DzDAf¢T&»…Q2(ˆàaéÂŒ6Ý&•¹%$$ȼ£èvRR’ˆ4BÕ0ÍUÙImv(¦˜Ê:T;FHAUª<u”±DåÖæU5Lt£ÇÁÂceƒÊ„4"Ήªæ [DÈ{Z¨P!gëgÚô”²²CЂ‘ x†û¼â6[7H¯TûÅC°…6WЮT ’[B‡5j$Óà)1˜óãôéÓrS>˜›u£yV Ý:*l¥€|§"è'£jøçYA9©R{!˜›rPP>¹¹"o¢M¼ƒ÷•£Öîò'ZF—“5O:%ÝÇè'ÞÄG²: s‡â5}÷îÝÐ? X¹rei€Mš4q"ªM·‰•I ‡h€9ÈÓI€H€<œÃ}~ƒs0<Z´h¡Zˆ½à±#¼*ŒÊcŸÓ§Oéa DŽ´ÉÁs.hWi]V¯^Íúl¥JGah{öìÁb9ì>'€‡ªfÍš* Ä€ÈÏin¨ÒOž<‰”˜Õ«W- Í Æ “bþ¤CäA‘{9 Ч$ ò UC"M|ª¼"&UŠ´.òÍ+W®È´.ˆ°™Œb!X‹aÃè” "R§”[¥ ZÈ^Û„øÉì/²A4%g¥"ˆ,  j«vìØQyû Ž.0@,†tø£ÈIÀ2 Ÿ  /"ÀpŸÝl7 µG* Dº—‘#GŠýq ¨ÈýS ¢s8 iØ„@4Òºukˆ¥˜ ÏÉù ™X2'¢|÷ sÃE…ªaõÄÄDåU”“*EX(+`ÏwZ\´hæ[ÊX–˜G*TíàÁƒ¸Š< ÊäœÐ6åµðõÝÀ¹ªô˜hAnU}ØÑAžˆFä´ÏëׯcÇB˜³­8iÒ$9Wçw\ ¸í¸éQåe½— Ð{ï=GN$@^B€á>/¹Ñú¦vËxEÆ ¡%Ö ²VÂ;tè T“BÑ Fqr”b©¡Ü6Ö'T ›X(}L9©RÅÒ¥ô@inh 2)瑪T §h§;Šý'äu!¨ˆÝ©íÃ0ñ&€ˆï)eRº‡TÃ6ÉhˆRf; tÅŠXï§’vüÑeS@Íí~¡Ÿç™=ñ<4@Ï»§ @†ûø¸‘$D»,°hÑ¢ðlc€0@ˆÅaÏ:¹å ^ˆL¡ª(\N¢‚¸„Øäªõ’MÁ¦²MõiÒÜÄ$R±>P©jb–¦´5í}QÉ­RPå6ôX0©ì¡ $â&R"‰èŸ0À 6©ÃÎ~ “]±PS¹÷ƒôÀ~øÁ5@PrãSÊK{- ×ÞzœH€<Ã}xS ;$<˜Ã© .uêÔÉò,Pi€Hy‚c„ rR(ÖâŸ6¤BÕrx`K† .(±¬jª»ûBKžŽ¦„ª)D î§lr‹ §<cGPV F?åûÊ@"–#b× ¬oˆ…­ZµR'Ò±š3@lÀøïÿ[{w*T¨àçççýÃUlݢðßv\_h€úºì €î³Oq ___ÕF°Ž÷ßË–-æÖª ž€L¡Ý»wÏ—/Ÿ0–F¥¦¦:Ð¥\!˜f.­‹9\p0¬ú3'¢è¼­œ±äOÙDZþQi§pBˆ4¾ûÒG¢Zµjaš«ÉL0Øäéy´îÍž6mšËÜÂM´ÒmeÈú$`™ O €! 0ÜgÈÛæ•ÆœÆ*UªhÓÃŒ3Æd&­"U&l,ѦM±c¤œ;ŠUy9`€"­‹ˆ4Z>pEDØPóZÍ]+÷´i]Ì5‹àBy¨¯mM$#'b¼"³€Ä’¿råÊ ,¥K—^°`ÉL0˜›ªÜîOÞ EP4åJý{cdǘŸ“€SЂ•’ 8‰Ã}NËfMÓµq§úõëcéšØû%ˆ\ ZTš Ö¹5iÒD4•;wn4+’…*gcæÄ•yA-lT ³³@«TóH•WÇèÄÊÀl÷|ǵĒ?•*s‡b˜Ø¡?$ÔøÍ7ßöë×Of‚Qíѹsç$@$@z'ÀpŸÞïûg¬g+Y²¤JB ,8þ| (Vª$‰ºˆ¦Š)2eÊdIA” ñ1(SĦÐU‘Ö³U1ÏS9>ìÓ Ò‡"ò†n+¯%–ü •ïcލØÄO¬èÓ¦Eû¸Š¨€ØÝÍ›7å¹ÊÊx—CÔT VýuëÖ ;m€–üaÉåž={”¹@¥Nœ8ñ•W^Ѻ_©R¥0WÆýäµðwšu k‘€SЂ•’ äœÃ}9gÈôFÀ\z˜ÆÃXT1@äê´| þ†t—Âmà–rÓ‡x öÖû:sCdiK°»½T5ˆ¢T5å,MÁ\$‰‘Ø!¾%K–൨ƒ6±TO ±l*(ë+—ü¡šX ‰3§NŠÄªbàU«VEîe.P¹ 2¯J>JÄŠÊÁƒ»ÅýpÑË—/ëí±d¼ ÐÛî8ÇK$@º&ÀpŸ®o;ç P5mzhÉØ±c•³@³ÀgŸcÙÞÛo¿-=pΜ9ˆŠõ9 âô³gÏŠ½Ýan"*ˆùœJUCmXOré=ÅcDàN4gC¼Nìò'q&e‰#ÄO[·n­V­šìk¯½6kÖ,e.PDŒô§Ÿ~2¹ÓÃ/¿üââ%JÕÄÒM=Dl†ì'@´ŸÏ$ p†ûE’í…"ZÚô0°ìû‡È›X hÓ‰ ÅŠj„Mä±>P䉃!—Ëî`€PÁ´´4eSh<Ûl–ÂEåY2´(RÎÀß” Êt/¸ˆ•‰m3ÄÈ^Ë–-Å1ù³OŸ>2ŒÜ B`ß¾}eRPeèñÀ]»v¹+ô‡ëÂf³Åe”˜ý44 ¡o;O$@&ÀpŸo»î úiƒHMÙ¥K,u“Bm:û裄ö O VÇA5ÑÙœ{ 2—(Uͦmѕ… jÊ6•DlÙžH1*HXò‡£Y³fØÂ^™ T ”¹@•Ö'^/^›@¸Ñýpiȳ…`©ƒ(6CV Z…‰•H€H€E€á>G‘d;žA‘ºzõêi¥åõ×_ÇÂ9$µã@æ,,”mbÿ@ìò\bmžC4ˆ€›õJƒš¨oòÒJ™DD>awò€Ô½õÖ[b,~øáÚµkåGÊ §uêÔÑbÄÜZD 1‰Ô½úwæÌ Ó3žXŽÂÐ=à&r$@$ w ÷éý±î&€”žZÈaíœØ.ÂÖIVZµj%Cg˜_Šíé…ÂFrxÀUi], „}a)ê«.ªœDŠ^aÍ!¤NÈ:óÙgŸ &ȘŠi®ÊOÅkü‹b‰íÛ·7¹ä¯AƒøÔ½î'&*g·ºûYãõIà?4@>$@$@Î"ÀpŸ³È²]O$€(éß¿¿V¡pØ;^™ Ŧ׈¼¡Y¹D)CÅÖb‰`N×$ g4@=ßöH€ôB€á>½Ü öÃû .‡Ü-ÚmáB'l”¡Âæ99ШQ£Þ{ï=éWeÊ”ÁEÅ26ø›Ý‡r‚ —ò?~üË/¿,.ŠÕ«W¯V~*_ã}“k#±ÓÃàÁƒõ#~èÉéÓ§ïÞ½ë})Gl04@ƒÝ0v—H€\I€á>WÒæµHÀ‘)T딡°¢E‹Ž9R¹‡žÝ¯±l¯M›6ØzA¶_³fM¨`JJŠ*(õa@Ì SˆÚI©{õÕW'Ož¬üT¾Þ¹sgË–-µq?¼ƒd¡ø JWú‡©­ÖoȧÜH€èFø¼4 è‘Ã}z¼+ì <%€ fiš4"l›>kÖ,íŽyö½3nÜ8Õ>õˆ BA± ƒ5*¨Zòª8ÇëÅòäÉÓ­[7å§Ê×½{÷~ñŵƒ­Q£ÒáèÊýЙ+W®ð!%£ åN±Ÿ$@$à\ ÷9—/['ÇÀÖð52é~ø¡ÉÓíó@,ÒCt*¨Œ=bçúÖ­[ûûûcº#LO{ÈÞ¼yS¬ô“G×®]a}¢ç¦M›”ŸÊ×Ó§OóÍ7µ,^¼øÜ¹sõæ~ȤŠ=-w{Ù 8 Ðéˆy Ð-†ût{kØ1È––ÉaЦIDÆ”#FàŸux ÀØ´iSÌ8•WÌ;7,DÓÓÓ…Ê># œÉ9å=úÞxã qnùòå‘-Fù©| ±ÄŽÚAaÉ_Ÿ>}ô³Óƒ´ÐsçÎa[‹lo+€®Ðuu;Ø p†û\A™× —€2A¨Lz ¶UÀDJȦn:ððõõíС&*/ŠE}…aÄÈ;Âðò@ýjÕª‰Ê˜Õ‰”3ÊOåk,ùC"P¤ÕŽ»ÿ8p@o¡?¬¼zõ*7|wÉc΋8˜ ÐÁ@Ù 蓲ðá—"V©Ò©ãwöƒ†ê³Ûì €5ˆÃäL“ˆ|¡í۷ǹ(G[¶l0`@ÕªUÅuñ×ËåË—÷*,ùûþûï…Ô‰ðŽ²‚|”ž&—üU¨PÁÏÏOoî‡þ`AæÃ‡­¹5¬C:$@ÔáMa—H€HÀaÒÒÒÖ­[‡|ñ˜-&o¿ýiöìÙsëÖ-‡]‰ ‘ ¸›<ùZLz  ‘´Í›7vÂ1lØ0\´yóæø[EJ©ûì³Ïð‘òSùzÞ¼yØÐOÛçB… aâ¨Ýû=ðoNw?é¼~N ÐsJç“ €~ Úon} D«N:Ø:ðˆ Ÿ»ÿ>°[½ºR¥J!­‹|_ùbÍš5 4к²Î œ¨Ã%ÐÑÌÌLåîöú¹éì ØD€h.V&   Àú:sùB!]+V3f ¶ÝsˆJÄZ>qÀ3q•ÆËw”/0}»ʤ J ¬]»6.ê0ô‡½þîß¿o€Ï.’€h€V@b   0 ìLÎ Å›X"ˆ9ák×®=”³cèС"ˆe~â€Èá^½zÉwä‹Ñ£G—(QBÛ%ÌÅ6ñ:t?dûäf|öÙeKh€|>H€ŒA !!A»zošë½¨onµÞ7÷)NÄ?‹ÿˆn%q9s•-\ÎÊö•Õp! ·£AžB$àÙ¶¤GؼÁœ –.]º_¿~ؾώcÈ!Âþ>„þþûïò¼˜?>¶+Ôö;= A¨Ý»\Ðý<û«áµ££zí­çÀIÀ`d2qÕ¯ìܶm[üZ5Qÿ59NØ>Å•ŸÂ÷´WAûH§ž-,q¢9 4y¹lÛ4Y—°0. mΜ9“ÞhsžEžAûbº¦¹”¡"]çW_}µpáBl½`Ó! ð»ï¾Ûö÷Q«V-¼Ó³gOñÂŒ 64響üò rëMÿàÌØïÞ3î;GAZ4@>$@Æ  2&tXa‚7ahxÿUÙ—t9•æ‰Ñj• v$šB³%´!ÄåÄ›L˘tn€”A5ÆÀ^’ 8‚6†AÊPlc.ˆ÷_~ùe¤rÙºu+6·æ@ÚOa€Xà'±«;xýÛo¿ýûßÿÖ^®FØ£Boîwá®÷săÆ6tM€¨ëÛÃΑ Hæ ,¡gÚ°˜4@(œ6ö¥5@áHZ]„ ´@Ó¹Zî3 /$€ Üû÷ïo!$ˆ¿÷ÊÃÎ1ÁÁÁáAƒ Änâˆý'^ýu­û/^ª+÷ÃÆ9W®\yôè‘> ² záMçIÀ,;ŒøTéor¨É9“Z„æá0‰F¦ÉXb¶‚j.䨼Ü2Ûù™2Âia(¦ÂâSí„X\Ë2=.,4äW‚&ðõõmÑ¢…… f‡BGŒ|žHª=¤núû07oKþúô食 Á—.]â„O=JlÆ0h€†¹Uì( x9˳|ùr•é‰úriŸÊß´(êã׋–³5y\lÂ6uÄå”±J­dBçPMÎt…‹bDZ§ÅûÂ`Å„XʦÄûò#)“"|ªüÔ²åzùÈá“€gÀÊ·±cÇ–,YÒ‚ â#LÝ„ï©TP ¶"Ä’?l ÿÿþßÿÓ¶óÃ?`y¡NB˜í‰¿ÿúë/Ͼ­ ˜$@äƒA$` – ¦¤ âÉúB™TsAµ(Þîd2Œf“(—B_±òP.t”¯Y½‹Å;Ê 7âDˆ¢X!)¥Nê^ˆ³Ä*J‘USž(ÚÉvÅ£1ö’HÀ^Xø‡ $,$jW¡Bü•‚ Ÿ¡¡¡Ä;M›6Eê—üùókÝ•ýüüÜî~ˆøAünܸñøñc{ñð<ð4@O¸‹ xlW² Ÿ‘.e}üLQY“Éäœb¶§Œ•áp3+mÐTé–ô=9#TôG©drQ¢4@ü„þ)Ÿ)½òMm÷ĺGUšSñ&Úô†'Šc$°@‰CçÌ™S³fMË!Añ¦Èüùâ‹/j+*ThÚ´int?a}ׯ_g~>ð$ Ðù0 ƒ@N #T-4·=äGκ”6ˆw²õ@; ?›TÍ"¨´2“KEÏ¥BöðŽv¡¹ˆ¨¸ÙÚ©xí¨TÙ{I$à4PAdmiÔ¨Q¶*¨ª+W®nݺ¹eÉöp§õ9í‰`Þ@€è w‘c o CTÍÍvƒ>DÛP•‹ë› Í*grŠ;¨ÌòbNÆ,ïˆO!±"æ©Ll£¢'¢¾ê0©Þð€qŒ$@– ` ‘3&Û ¢øû;‡„„¸ ôwæÌü“Òx"ʇ„.LæÉǘ¬!@´†ë ¸Ÿ€5hÁy0å\Ðl P¿-äB; ìˆZ6@ ¦§²G¸¢ˆ[*sºX6@1|s‡£ûo<{@$ ?Èø‚µ‚yóæÓþ5R¾|yü“þºÌ‘ ü Ÿ c°&¨eÄ8å\P•â÷ŠØÞ$ ss&••EËæZ0¹ù„}(:£œ*sÃà*耈UZž*úƒ†Ú xÇÏ{I$àVQQIo¿Ý¬lÙêbSAüKÝÚ#^œHÀ*4@«0± €Û X6@í~î&ë˹ ª-þLæSQ9Û¹‘©T‰Ud ¢3Ê +&Ý“i]LÖQÅÍ™§e´¼© Ûï5;@$`0ÀÊ•{uê4Û½e'I€$  c°`€"Šjúb.¨8´›æ™Lƒ)ÚWåÛTQ“n©Í#xªò¾ˆÀj®”ðRÙ1“ud P´,6x‡ZËQm—p:®er¢1ö’HÀµh€®åÍ«‘€ÃІ’ ‘ 8•€ £É‰‹3‘¬EèœJÞ,£Ü$v‘H€þó Ÿ0( Ao»ME€á>º €w zÇ}æ(= Ðo*‡DF!ÀpŸQîûI$@Z4@>$`P4@ƒÞ8v›ŒJ€á>£Þ9ö›H€þ› O ” Р7ŽÝ&ƒ`¸Ï`7ŒÝ% ìг#ÄÏI@§h€:½1ì x†û<à&r$@$`Ž Ï ” Р7ŽÝ&ý`¸O¿÷†=# Ç :Ž%["— º7/FžJ€á>O½³ 0Èg€<Œ Ð17tÊ”)åË—¯R¥ŠcZd+$` ÷á.±$@$àŒ:+%ç æ”±¿¿É’%ÿGq”)Soæ´]žOz%ÀpŸ^ï ûE$@.%@t)n^ŒG€h?Ë   ý”î§|PÁþÖy& èŒÃ}:»!ì ¸™ ÐÍ7€—'{ Ðí!‡ŸÂ52ç~Ê÷Q-::ÚžkðІûtpØ Ð) No »EÙ fGè¿?ÏÈÈèØ±£I÷û |Ù²o¿iò£Ö­[§¦¦Úv%Ö&÷`¸Ï}ìye 0  an;JÿM€híqíÚµaÆåÎ[ëxÅ‹½¼pöس§ÂPðÔÖÁ‰=zô@#Ö^õHÀµîs-o^H€ O€hø[Èx+ Uw©>‹)¢õºB… ØM¸Ÿ²àM|¤­Ÿ?~h$~j[uUV"ç`¸ÏùŒy ðL4@ϼ¯• fs“µ©>…×åÊõÜï]ÛžˆÚu.1ÜdIŽ F…|ùòh=2 ¥ô‚§‹CÔ)†ûtzcØ- 0 ¡n;KÿG€höi°ê³å£#¶žKŠÈ¶œ8²û×_šCµˆ=$|}}ù0’€Ë0Üç2Ô¼ x 7ÜeŽÑ# ÐMÜV ©>ëÕþ4xçšsIl*ÁþÍš|e2I ö‘ç¦ùÕÒÉ îÓÉ`7H€HÀóÐ=ïžrD^B€ø_7ÚRªÏ ïú­šs>ù Ýe×–åH“X³fMná%_9× “á>×pæUH€HÀ› нùîsì†&@|vû,¤ú,QüåEs'žO>äü¸rE“ˆÍ¹i„¡¿Nîí<Ã}îåÏ«“ €· zÛçx=† 0ëVšKõY¸Pƒ{¦§rxYóåËÛ«{»“G÷¦§D:¯L™0 ’iró@lÁÍ ú¥rA·îsd^‚H€HÀ2 Ÿ0(ï5@ ©>ÛµùáèÁé)‡]PRãÃG þÂiró@'¹y A¿ZÎè6Ã}ΠÊ6I€H€ì#@´Ï"·ðFDΕzõꙜY¯NÍCû·d¤F¹¸$ÄwíÔÚ䦨<ÐÇÇÇí ;à. ÷¹‹<¯K$@$À ŸðHÞe€X_׺uk“îWµÊ‡[7,ÍH=âÆshw«›šÛ4V=òä L`¸ €Î 0¨óÄî‘€9Þb€XS׿ÿܹský Y|æO¾púˆNJdèÖ/ë|fnÓnèÁ_f†û<øærh$@$àyh€žwO9"/!àùˆ_ÕXM—?~­S! Ëø1ƒ.¤Eë°lÛ¸ aIs›F @ä%¨7 “á>o¸Ë# x çÝSŽÈKx¸úúú–,ibÓ…òåíÝ£ã™S/¦Õsñ]:ëÝwÞ2é˜ÎÊM#Œû-e¸Ï¸÷Ž=' h€|HÀ <Ö1[²|ùò&Ý©}ÛŸŽGí¹x&Æ(eÞÌñ%Š5¹i6ä¦úî1Üg ›Å®’ X&@äB%àh!Õç—u??`ñSõsÔ°>… 4¹iÄØ±c¹i„n¿ ÷éöÖ°c$@$@9!@Ì =žKn$àQh)ÕçÇ•¶oZqñì1C—Sqa½{vÂV­bÓˆ9sæ¸ñIâ¥Uîã#A$@$àÙh€ž}9:&à!h!Õç›o¼¶tá´Kg{L‰=Ôá×–¹råÒz =rÓ7~]îs#|^šH€HÀÅh€.ÎË‘€£Þ-¦ú,8qìKçŽ{d‰ŠØÙ¸á—æ6䦎ú†XÓÃ}ÖPb  #@ô°Êáxc …TŸ}~ÿílrÔ¥s±ž]öîôû¼f5“X¯^=,‰ôžGÙÅ#e¸ÏÅÀy9  ½ ê펰?$`%£ …TŸÚµŠ¹t>Î{Š¿ß’Š¼oÒ[´h‘ššjåÓÀjÙ`¸/[D¬@$@$à%h€^r£9LÏ#`<´ê³~½/ŽØuù|œw–¥‹¦cÑ£IĦž±y |"ñ©‹–á>Ïû‹#" È9`βp # …TŸŸTý(`‹ïåô,Ç +\Øô¦Æ 3ôæ¿2eÊ@q1|[îsd^‚H€HÀ¸h€Æ½wì¹—0†ZLõùú²Å33ÓãY$ó©G‡ üÝܦX†L§Ð¿òåË;Ïcî3â³Á>“ ¸… Ð-ØyQÈ9½ ¥TŸ… N?<3ã$‹IÉ ‡ºwmorÓˆˆˆˆœ?:®lSóçÏý«Y³¦3ôá>WÞM^‹H€HÀ3Ð=ã>r^H@×h>Õg¾¾½ºœ?},3#Å21aß7ÿVµ8Ð5³(õu È;7†€ì¦øG5ËpŸ£H²  ï$@ôÎûÎQ{ ¹TŸˆhulß:þXØ• §X¬$p#ótlìñW^)!=Ð@èãã#ô¯uëÖù¾1ÜçŒl„H€H€h€|HÀ tg€R}~Ûè«èÈ +µ‡Õ@àÚ¥”Gïݽ}õxøê÷Þ6žΙ3GXkÿþýsòc¸/'ôx. ˜$@äƒA% #D¦Gl^gr3ƒjU+‡ìÙ|õb"‹•®_N~pÿö½ÛW®°sE/à •âaÀöö}»î³Ï"  kЭ¡Ä:$ Cº0@äöÀ†ub²Ÿê(÷îÛë|_½˜Äb=ûw¯ß¹yéLBXðúá»WõÛµ²á s>Å“€Y 6}mî³ +“ €Ýh€v£ã‰$à^n6@ü^G„G¤yT… š9}ÂÕKÉ,Ö¸s+óÖµŒ‹gŽ…m¸z` oà ‰FáaÀ¿ Œ•_†û¬Åj$@$@$à(4@G‘d;$àbî4@„wŠ)¢u¿^È7lpß g㱌ÅJ·o\üëÉãk—R#wÏÞ»vÈž5ƒŒh€ˆc¿<øGd²üe`¸ÏÅYðr$@$@$ $@äó@%àDlûzkÝ©>;uhs:éèµË),V¸u=ýÉ“G·®_8¶2Øoxк¡5@èŸx*ðïHdîÅpŸAÿ®a·I€H€<Œ ÐÃn(‡ã=\m€øe/‚<Ú£Iã¯Ùýr*‹•n^9ûøÑƒ»·2ã#ýCüGoi\D ’%Kâ©ÀñZõ d¸Ï{þJâHI€H€ŒB€h”;Å~’€Š€ë ÐRªÏOªìÞ~=ó4‹µ®žÁ6÷ï\O‰ Û2q߯1†6@ü»€˜Œ`FF†|Fîã_X$@$@$ [4@ÝÞvŒ,p…ZLõùŽßš¥×3ÓX¬'ðàþ­ûwoœK:p`Ç´ÐÍãöokhÄz?‘ Áa<* ÷ñï,  0 !n;IZÎ5@ ©>_*\höÌÉ7®œa±ž@Ö67.]:87lëÄÐ-Œn€X*v©^½úĉëÕ«§œ 3đȤ òkL$@$@$ 4@=Üöì àD´êsøþÓ­7ÖÄb¿¿þzríòi¤{‰Ø>%|Ûd0Àùóç ßË“'Rü0´ÿþv<Ð<…H€H€HÀ5h€®áÌ«€Ã 8ÅÍ¥úÌ+×o~=›wóêY+ `owlópçæe¤{9°cú€©ža€³fÍRZ$Û2Üçðo8$  ' : ,›%gp°ZHõÙôÛ†±G#n^=Çb%Û×/<~üðÞíkÉÇvÚ5ëàΙl€Â‘«‡ æïï40Î~úÙ> €Ýh€v£ã‰$à^3@ ©>«Wû84d×Í«çY¬%p=ãÑÃûîÝ:{*üÈÞ‘»çxžŠçi`æÌ™Ó±cGs{„àý=z '…º÷o ^H€H€Th€|$HÀ `€R}¾W®ì¿•·®¥³XOàÑûp¿ i1G÷-‹Ú3ÿpà\6@Õ×q?Dÿ„ø‰ý!T–"7ÌØ±c¡Žxð ú­c·I€H€HÀÐ=à&rÞI §ˆlŸøQ®ý¥þRáÂsgM½u-ƒÅz˜ñ‰lŸ™é ±«-ŠÚ»ÐÛ Põ%„ãÁôà{°>“¶GúP#“…zçß_5 € ÐÝŸ—&œÈ©"é‹Jÿ^x!߈a3/œ¾}=ƒÅJ?¤ú¼‘yæäáMG÷-ñ¡š|¬1Ùb0/AB±„804'_žK$@$@$`+ ­ÄXŸtB §ˆŸãòWx®\ÏuîÔþ|ZR˜°XIàîí«=yrçffrl`L芘ýËh€Ö7°úÿ ÓÆX5I€H€HÀ!h€ÁÈFHÀõi€… ä=rûÆEkܽuåÉc$|¹–z<Ü÷XØ* ë¿¼" €}h€öqãY$àvŽ4À—_*à?í— ©GïܸÄb‘@æ“ÇÜ»y!íhܵ±kh€nÿ&°$@$@$@6 Ú„‹•I@?i€E‹8´{^HÁæ,& ê÷ðÁËç㢶œ8èGÔÏ—=!  °ž ÐzV¬Iº"à`Œ Z8?KOÇܽu™EIàÑÃ;ØæáúåÓI1;â#ýOÚ@ÔÕ—!  °ž ÐzV¬Iº"àx<ìsxÏÂÓÛ¦Û{÷V& <¼篿þºuýÂéÁý!á' PW_v†H€H€HÀV4@[‰±> è„€S 0:dé‘à¥ÛævŽ óC¾o.÷ïÝÄ6 p.éЩèí§Žl¥êäÑg7H€H€H€rB€˜z<—ÜHÀYxtßò˜Ð•»–ö=¸uÖ½ÛW½°<¸{ã/ä{¹ûÂé£I1;î ºñAç¥I€H€H€K€èXžl\FÀ¹x,Ì7dݘ U#n^I¿wûš—”ûwoºåæ™NDlxpï¦qË÷±ÍÒ½\½t>93?i€ý°Û$@$@$@v Ú§€¸ÁOÙµeïÊ!Èz%#éÁý[F+ˆû=~üèÁ+gÓS¤§¦êáQfH€H€H€\I€èJÚ¼ 8€{ 0{£ 8¼{ᦿݳäîíkF‘@lóðøÑÃÛ7.^ñÌñ i14@~—H€H€H€¼– Ðko=ntn6À¤ã»“c÷$DmÛ¹¸wðªW/$?|pGoåq–ûÝ¿ïæÕ‹É—ÏŸ¸t6–hôçžý'  È!`òtp]`J\PꉣAË7ÏlµsÁÍ«°©º ‚~ÿùë/Dþ®gžÉÌH¸œ~’è®'•×%  Р®n;CÖБžŽßŸzbß­36LùxëêEdÚt_y€m`€·®e ôwåB" Ðú§Š5I€H€H€<ž Ðão1è©ôe€i agNE¤ ;¸m¦ÿÔÖnòÀûØæáÉãGH÷‚D¡zê€ã"  ° Ð>n<‹ÜN@x6ñÀ¹¤Cg ˜<²sá+ç°Ïå©û=¼s+óêÅ,ëSÆÝþ°²$@$@$@ú!@ÔϽ`OHÀ&N4ÀC{—4ùæó÷ß}så‚1±ýâm8¹;Âc?@±rŠL0b fŠ 0Àó)‡±×ÂùäÑ;æùOý%Øwdêñ`LËtRùëIÖ÷n_˚󙑨-4@›,V&  ðl4@Ͼ¿p¢ŽØ!wî\ÿó?ÿóïüy;ýú}ˆ.¤»x66þঠUÃ×ÿÙ2fï²WÒ³òs:¨d-÷{ø4Õç¥ÔÌŒSæ 3ÁxðC#  ° Ð6^¬Mº!àDœ=¹oÞ<ÿ‚âøç?s¿_®ôÁ½+mJ¼tîÄåó'Ó“¢"wÎß8­ÍÓà¾{w®c‹ö”'¸Ø|âúåÓ™é ÙæÕÍsËŽ ¸™ ÐÍ7€—'{ 8ÑcBWÖ¬Vñùçÿ)$Ç‹ÿ~aé¼16ÍU $ kó0Q31* dõ(¿‰ßCO¸y5ÝF| býa›‡,¯³¾p?@{5žG$@$@$àIh€žt79¯"à\<æÛ½ã÷˜*%0_ÞçÛ´llý:@sxíRêõËi×3Ï&ÝîÿçÆémw,èy<Ä÷JFfuZ.¸ÁXòwóêùËçãm/ÜÞ«¾ , €i4@>$`PN7Àãák ¦p¡ÿñ¿ÿŸðÀý3÷믕 \eM&˜l ðÆÕó7¯eܺ~ñ|ò‘#»mŸ×uí¸ïö, <Ÿ…(Ò{*Ê_X=xûú…Ìt¸¦•ÚS.½xæø…´ô ¹jÒSŸOŽ<—tðlbÄ™SágBÓNî?’z"8%noÊñÀäc»“bv&Ýq ùo'jËÉÛâ#ýO 5äX±æx¸ï±°U1¡+bö/;ºoitˆÏ‘ EQ{Fí™8pnäî9‡vÍ:¸sæÓLØ>%|Ûä°­C·LÝ;WôzïíÒÇ fÐç•Ý&  Ð  Nn»A¶p…ÆF¬\úáeó<ÿlY T$ÿ y§Œm.Pë ðöK¢ OLÚ‰ýGv-‚ÂŒÜ>7ó\ÜïÎ͢ðyé\\Ž ÐÖ§ŒõI€H€H€<Ž Ðãn)ä-\d€b7ˆž[þ;>‰‚–z­„ßÊvƒ°Å/bwmÁ~±aëp?3á~gcRô–ïÇI$@$@$`†  ”€K û®ö™øRáÿøßÿU¬ ÌóY*‡öù›ÜÐzÄDP ·[J8¬p¨AŸwvÛ‚‚‚0Q¹Q£F5y è˜@ÅŠ•óå+Q´hi÷‘]#/"УGŸÔÔÔlî¹Ú±Ä¡5•*–SæÍšš?_÷οœ:¤ÚÞj¼p뺥’e€gŽ;°p`¶Ï+€­Ê”)#ÿyˆ/H€H€H€H€l%¼víš…Ÿan0@±Ä~òåÍ󿧇ÁϾºuë|P¡ü‚ÙãÏ&8—tè|ÊaäY±Ö‘ Æb‚ gŽ9²0Œ­¿îYŸÌ¸wï^ëÖ­mý ŽõI€H€H€H€´Š)‚IUæ~y¹ÍO ˆ ]ß¼iýÆ!GËãG÷>¸111]~ë¸nå› é@-—,L‹qla.P 8Šæ|ò¯o    GÈ;wDD„ÉŸjî4@ìq=3íÁƒ[W¯$_ÍLåÆõ3Þ;öWJ2q¸u1Àô›×²)O ð¨c ÐQ¿þÙŽ—ÐFÿ^(òê»u[Öh;²NÏ™,$@$@$@$@– |ШSÉkýÿxN)ùó玎ÖþÎt®Æ\?súDì!r" ÖŠY ˆÂ=¸{õò©ÌK'¯e&_¿zZ–û÷®>üùçÿ•7ož~½:ŸŠ‹¸t{÷ÌLO¸r!ñêÅd¹#|Ö~€VŒ<ãt´Ã ÷ôruáðsN`Μ9Ê¿ªžûWž*Íz´ÁB$@$@$@$`&#V/[Eù˪dÉ’Xk£úÁæ\¸ûäÉ#$}ôðîãG÷?~€?¢¯eʔΛçymVœçŸD˽ûΟ“þ8v$üzæ í ¹¨³ c€ÖvÝm” `ž¡Ào³vöYq˜…H€H€H€H [?ö[ ß«^½_BÂyñcîÁƒG}ûúàÍ/ŒêµôPÕoÛ+JtºÞ½s ëqùçžûGïm6øÎ|»L©ö¿4™`¤¦ž9¿ÿlâÁËé ˜Õ™•ÜåZ:¶øÃ±û¼Yß|ãõ|ùòšÌŽúÏþ6øê+%ÆŽ––kÒ³ 09Òy…³@ݦ¼°1 ` æ$Èot­–½®:ÂB$@$@$@$-þËWÿ|doýúpå/Á›7ïÖ¯?ïÿÔgUߥžÏ_@þÖÂ6ñ²¦Ó ðáƒ;‡ö­ý¡yqùjU+n\;ë—–MÊ”~}óÚÙ*LK;s*ÂÜŽð[ÖÔþâSLE‚P“*ˆ`±¢/'ľ~9MUžà!ç 15„½v±cÇÊoñÿþã¹~‹÷ [ÍB$@$@$@$-Ÿû­‚æµl9YûKÓAñÑç_Ž@#Ÿ6í n!»ŠL ê Œ9à8ÌoÂè^yòü xñß/L?pÒý^+Yü‡f ¯Ã,P´l€b7ˆô´Ø…ó¦Õ©õÚ¨ $ðÑC¯]>­* Isja&·É/l@Ê$O>k8Ê/†…HÀ½ºOßÜi‚¯MeÈŠ+ûŒš¢e+ë{mµ¿¨õC×ûM“·Ã2 6[¶}ì·@Þ5s7EÙ¦5σò1°²Û^{9pp:_†æAöLþ„âÓÎc·ô[¸G6óõõõ]g€CV¯[9í2oˆ~|߬ÁšåSÛµiV¬èK}{¶³Þå~€×.^±t~ïëC_x!ŸhÓAñ&>R•,L<àÔB4 †°Ëî! ÊóÛøãü± ¸—@É·+˜œ_cáͺ?v3ÙçÞ³¶¨ÞGMÑN×I«Ý;L÷^½ý¨E–;PðåW@©y?ÊVùB3Y´#«¡fÃö-4.ï/ÕÌÝù¾•σ²‡â*…{9óê$àÙ/ÚÁkÔhŒ¹Ÿq˜Š [NËú[¢òçò»Œ n0ÀÐ=«vm^ܤaÑÂ… ôéùë¢9|óÕE_~iéüIÖÄ…^½”ª,›ý}[4û¶H‘—¦þ9Võ‘ø#F Csvánîñ ^Õh¦L™"ÿ2z±p±É›bYH€ÜNàµw>°ò¿¬Vÿ§îªn·4íhßÇ;⬞®uûHÝÒþs¶–«òàX¸:êdéSÑW‡- ú¶Ã AÌò)¨,o‡55Q_vÀÜM‘ï[ù<(o·xŠ”Wq m^”<›@›Þ+ xãÇû™û˜ž~%+I̧&®iÑm´ü.çÏŸßx,ÌI>¯ež>¸ 1@`ðŽåÛ|†èŒÍýDo=ì÷?Fô)W¶LÍêUƒ6˜[(f>3À‹)Wm)Yˆ†N.4@£™ûëHI,ÿ2úäËæÓ¶Æ± ¸Àë`¡¢¯âµ5¥iÇÁÊn÷žºV|µ´ê®Þ¡ŽÛGê–€*†ª®.(‰:£–‹Sð_s§ š·MPͶ¦¼5ʘ»)ò}+Ÿåc ž" }v |^”<Œ@½†c xááñ~Ɖ‰ ƒfí·æ€ò_s‚‚‚œ> x<| ¼ëÎíkqÑ»¥l\¸hö•+½/;ôY*“ÆìÞ¥M‘"…~mÝ":";7`«ÀŒÓG/¤»x6öÒ¹94À,=sAáŽðîq ^Õ0° Y™´Ë¨ù³·Ÿ`!p;ReŸÅ¿ù¹‡}é?}øßº¶¼#>Bû7úY…Ÿê [ˆ¸µšü"êˆSp _°ÝäY‚*ªU­ÛDÔì1n‰…šÊÆQmÊúøÚ;"o–Oºj²M£ß>öŸôC`ꆣbìý`áÇß”)›P­Ó@_ô¼øëe¤sõïßßE±6áèö»·®œN:*b€0À-~ó6¬ž…‹¾\Xôé_ÿÌÝ´ñ—S'kÚ¸>R¼4kúõ¾À & ðÊÅd[ †z‰F]QBÓNî?’z"8%noÊñÀäc»“bv&Ýq*zû©#[¢¶œ<¼)>ÒÿÄ¡ 'úÅX±æx¸ï±°U1¡+bö/;ºoitˆÏ‘ EQ{Fí™8pnäî9‡vÍ:¸sæÓLØ>%|Ûä°­C·LÝ;WôzïíòÞ6Ì0ºÀŽzå"ÀåÉ;{ËÑ;ãYH€ÜNàw+ŠÿM4nÝþΠžég®´)>Bû7úY…‹eé [ˆ¨#U«÷Ìë~è<ÄäYâ–á,I§X¨i%y³ì~Œ~³ØÐ3‘óöBíÚ¶nù¢ÈÚ¼õtŒ¥VãVÒêÕ«ç:Œ…êÚ™qêÚ• ûWK\·rºïÒ)?¶hø¯ýSôì¥ÂÛþÜ|ÚÄá?4oôRáBŸ}úɆ5‹T1@Ì,µµ<5ÀP× Ç9 äHÈC%ÿz¥ÔÛKv'° è@é¿ °I›žöõgøì âÛ­mïˆPǾÆ~ÖKOíÍ ¤}ÿ‰Y¿‚н*+ˆwpTü¤¶É³D›5¾lŠOÅkåéÊS,ªj\Þ,»Ÿ£ß,öŸôLà÷~P;„ø,ÿ8KkÕޱtø§üéU²dIWà‰ÈÈõrûÖõÈð"( p٢ɳþQ£ZeÙ9$‰ù¾YÃ?'ïö[Û2o½ñê+ŧÿ9FεUÿPC…˜¹¬0èHc`[žEÓä7½bµZ+öžb!зÊ=‹6kû»­ýôçrœõU³¶âÛýaµÚø# ÞMáµøhÔÜ øc§Q§Hñ’¢àÒxÇòEÑ”òœU³þw²}Õ¹¢?b “–í’'âüo*+ˆþ ²?¨ï¨þ,ÜvTôcøø¯øãÏ݆©úŒ¾ tÊ÷åYZ8è¡@*ºŠÅÅ•Ìå}Q¾/! “Ê÷åͲãIÀ¸$y[Ÿ"Ö'°†@ëßæk7‚7ùSQl 6ÇÌß$zá… 0þðæS1;o߸”’xlËú…Ò}æN˜7ó}~{£TÖ_‘âÈ—7Oƒúµ§LùÇÈ5kT-\¨àè“¢23m-4@Îõ,2ðhZ´h!¿ã~ì°&$‘…H@Ê”ûP|7[´ûÝÖþàåÏ ùZ6%+ ›¶â£êÏR‚«NÁûæ®kî´ðu‹_µg‰Ë½\¼äÔ»ð_å…Úô†ú²ÂÒ1NíÏØùþ&É€¶ªÛ¢Ÿ¢{²ˆ›‚ænWÕÿü«,cÄGâý.ƒ&‰ ©ZƒÕ~$o :©l\¾oÇ“ ;lë#Äú$@VhÕaN¶i`ÄÏDlš 6Y±;VùQ||¼s÷™`°PÌE xkᢷ_:óÆÕ¨C{E P଩£fü9¢Ý/ß¿öêÿ-ZûÇ?þ·Fµ*3§7{RïëåyþùjU+Ϙ:.9á0¦•ZY@q9W®4°£°ëÎ$P¾|yù×P‡^#7ìOb!зß{f€?¶ïekÚõŽÓe ÐñG¼/šB›â‹/<ÿ­\£ÞD‘gáý†ßÿª½´²ÙZ ¾gá…T;¼V%.'®"¯‹?¢,Ú.û#+Èþ JcÌyf®Úm’ŒªÏ¨&:,º' : úß}ÈdÕE?Ѹx'Šw0dUM WQ~$oÊÄ…M¾oÇ“ ®…žØú±> €•¾û!+ÉgTTÖ GËG§N³QsáúH´\ìÕRò×W@@€Û ðÔÑ€”¸àWÎ^½riçöµÂç΃ÿΛ9vþ¬qýût®ðþ»Ja­üÑãFÚ¹mõÈaý¾¬÷EÞ<Ï#08cÊØä“‘Ø%ÂrÉ2À!®,4ÀìK~î¥0]~¯ÇÌ\µ9<……H@Þyÿ™¶ìÐÛ¾þü¹x³øvk[À;ò‹ -Ýr@y‰½FˆO‹–(©ºtí¯›‰pÖÚ=±ÊOшì3ZP~¤ºœø«õŸ/ªY£úƒ+¢)1 “líåÐs1üÆ?´Sž8gõ-jACÛˆ¸´ö} 7Î$=;žs}°ï‰âY$@Z ¿ ¯Ã2¿lGöè±5g,ÛFÊ}PEþ%ìãããNLŒÙ™t|÷Ù¤ƒ÷n_KIŒ÷]6ËgÞÄ%ó'-™?yé‚?—.DlpÚ”ñÃ?¯Yíÿø‡ìôK/jÒ¸Á¢ùS#öo›8~¢‚yóæ©_¯T0édäåô“Œ d..Ìší£É ^H@¹Äø9¾SYH€ô@ ìßX¬DIkÊÏz«º=}é3Ô~„wÄÿÇÑòÊmµãÅû¢‘Ÿ.\·Wžµ!8N{š'â¿ÊO³½œ²‚É–ÛôM4È&ïµ€ßäÇvæÈ¨N”ýWâÂé—ò¯Vɰî7ÍU›lu”p,? UkÖUµ)¢ºzx¼Ùðu¿¯Ë̼™íoÈ‘#WgåŒY°cÿðãO¥LÍ™3Çý˜»'%.ÛýݺuãXôÕËg®\2}ÕÒ«–Íô]>{õò9«WÌ]¼`Ê÷-¾ÍŸÿÙu¼x¹ÈK­[6ßè·äD̾ÙÓÇ7ý¶A‰âE؃„1Ú’e€qA..4ÀlMVðBÊoñ¼•Û#O³ èÀ»å+)¿žÙ¾nó[U·g/Û"ÎÒ~„wÄG_6lnr°x_T@#²B³ŸÚ›kPÖ©V³®¨3yîjù¦¼>5y¹lû#›uHЇb%^C'ÙdħÊ!Èjâ¾ ‚òD“oâtÜdå®}GjùˆO%å•ïgû h‡c²czx¼ÙðŸ|Ò^gÍH±%à„™{ÝMå7ÛÂéÅSO„¤ »žyæÎ훑‚ÖûÎ[¿zþ†5 ý×,ò_»xã:˜Þ&¿¥=º¶¯ZåÙ49Œ×_{¥ëomw¬ý¸Ê‡ý–^>¯-À”åc®/ÜК'”u¼†¶ƒWþ¤X½5,øH €”ûÛ‹¿ò^g[º÷¥êöü•[Åü×Î}Tás‰š²‘çÊ.)ßTµŒnh[¶þrÚ®:£?hTÑOŒH{¯§Î_ƒPÁäc Ç‚j²‚h­úguU§ˆ÷•M¡Ž¹ÆM2WÞ‹lŸ„¯5Wu@Ü2scÑÃsÎ>€Ñ @êäÓš_Ž ìDåÁ£ÖbÈõ¾ÉÊ%ެ¬ìÖœo¡NÖDÒ¿¢E D-:ì²ôè¾å1¡+-d‚Á:@1 TÄa€§ã÷c¯ˆóɇ‘)ôÎ[±ÇnÛ¼b«ÿ²­—oÛ´bÛæ•Û6¯B Øê Í:¸W­/j<÷ÜsÊ_“ ¼èï·9f´%Ëq!×`Ÿ0žîYRSS•ßY¿íaGϲ èÀ{žÅ;ték_¯Ú.¾àÚðŽøuL6n²B‰§>ƒ}³PdÙ²}—Sv̱ýAËb,…vø?üÜÁÜG¨¬¥:sáZ1ä¡c¦©Z7×Ú%>²p]s”äûv< ²ö=B<‹HÀ2-{â uHòiÍÏÃõëÃQyèèuh³¾Â[·n­;B“›¬ "ZVè¿lÙ¾Ë);æØþ e1e'ååÄG=û2‡]uîW²öÔÁ›þ»«NA#×àÑSñÑÊÁæî>5GI¾oÇ“ ž"ô;Gˆg‘ X&°-䤭8dÔ:´ù¥! ð\Ò¡ó)‡/¤Åܼ–þäñ£ éi‡îÛ»QY„=œ¶~í"ì%øÔã´?°“otK9¶;)fgâѧ¢·ŸÂNQ[NÞéÛc`“Œkc#Ö÷=¶*&tEÌþeG÷-ñ9´(jï¨=óÎÜ=çЮYwÎ<°cú€©Û§„o›¶ubè– ¡›Çíß4v߯1!þ£‚7Œ ö´nèÞµCö¬¸z` oÿÝ«úíZÙgçŠ^ÜÐk$KïUþ˜[µ%loT €È)—m;÷±¯?sW<›ªmïˆï>ê˜lÜdi€ÙNIE…úšË–í»œ²cŽíZ–³@UÃ_·3R|´lC9ìÕþžÉ)*˜k ¡ÁYÐèÖÄnŽ’|ߎ'AεïâY$@Ù€Öª5Øš_{bè°±ëÑf½¯ÿo¨¾ÖŠY "( 0=õHÆé£Ҏݸzîñ£û×®^:qüÀÐm² Û~4rwÜÑ „ØÐ”„W©è¿ÖçâÙXmÉ2Àc»ÝUh€Ö<¦¬ã%”¸lSèÎC§YH€ô@@f‚iÝ©}ý™ùw&m xG|÷QÇdã&+ˆü(ø¯­ý±ïrÊ«8¶?hYf‚Q¥sŸ¬L-–Ç(êz¾Û‰¦šþÔÞ$å…>yš&Ç\ãæ(É÷íxd&[oë“ XI æg­Ì3~¼jŽ›€–•¹@ c€Âè®]>ýàþí÷ï^ÌH‹?qäà.ë 0éØ.·ƽDn8L+(÷;kÕÖˆ ={ëµêØÛ¾þLõy¶„¶¼#uL6n²‚ì’¹³ÌõÓ¾Ë)[slвÜPÕç?Í’´:_7³À|Þšg»ÿuì5¢×°?Is¢)|ŠËÉ‹âÖ3GM9v;ž¹ }Ï"È–€­»ALžˆ6•ûŽ;V§ëU1À gŽË‚íþ05ôÑÃ{Ü»|1-1þ`ìÑ “±¡ÉOc€Ö,VV–¯ñ»87εB XÅ+( pôÌUÃ’YH€ô@àí÷ž¥Úþ©C/ûú3yñ&!'ÚðŽøuL6n²B­϶ƒoôC;s]ÂG°t^yQû.§¼„cûƒ–…¢Ÿªˆ÷{l™¹¨ ‚ þh®>š¨ŽŸ'Îjÿûp뙣¦»O‚xŠ,tϾG‹g‘ Hß6›håŽð:ÍFÍéËöãÜ·ÊV3àÐÅŽðª\ &g^8sL[.§Ÿ¼u=ãÑÃûˆ f^J;“zô©.2Y¿¬cv¸³p WØ ™=*UªÈ¿ƒÚõ¹n_ €”ùÛ¿o×˾þŒ_°Q|»?ÿê;U hS|„:&7Yaø´•⬗‹—4yâ|ÿp|$ê ²lÙ¾Ë);æØþ eÑOüWyALõ¦I>@Šš¸G¢jÔ±pdÑ8(YÏ5åØíxÄSd͈ì{Æx @Ó&Ã뢢’²ýÉÕ¶ítÔœ·>Ðò¿XHþú 0H 0íVš+™é ·¯_„ ~Z£ºÿÚ%&«e öŸpka&˜lŸTVðY9ˆÿ>¾lÚzUP" €¼UîY °Aó_ÇÌó·²({ŽSÄ—»Hñ’³ý•5ÿõwñ꘬¹ 5ë?Ë^€6OY¡<—}®T½ŽC.'qlÐ,ú/È(GÔx£Èöømà$ù7'^´î>ÌÂ)‹¸¢¹šæÆ(ßÇ‹l;¦ª .mᢶ6Èú$@*­›¯ ÏöG#6@͹Ž,Ü¥ü $>>Þ˜‘ceY½bþéS‡LV~j€ÛÝ[h€Ù>©¬à ²fŸÿ}”«T}éž =(ýnEåOk^¿TìUUÏñŽ8/P>ý²©¨Ð´mOñþˆ9LÖBeÇð5Q*V«­¼Ö¼­ÑÊfsr¹l;lGЦò,ô”o¢·Ù>ÓÖ†Êñãø¥;-œ"‡šòh뛣$ß·¦cªfÅ0µF¶d + ´í¶^‡½þ²ýÑX½z?ÔD³£æm”¥çÎ'ÁOÇ`{À 5KÀÜ^¸D¶O++x:___ù×PÁ—Š-Úu’…H@Þ´ËU=¯û]¥:¢MQáÛ_žàÐYëMÖr…êõšš3Ò>©ýçêýª6sx¹l;lkÐ`׳• ‡×è¶xÇÕ ”ÆkùAƒW߉ËÌU6GI¾¶>™â)BWm=‘õI€¬$Ðk´?¼y>-ÿ`LH8ju¿…f; |¶<_ÏòåËÅbOˆ–§¸Õý…èézÃñeK ::ZùKnÌÒÀ¹;âYH€ÜN Eç! [÷°µh»ýÛðYŸÔmòFÙŠ(hMTø}ÂRÑò4ÿ(“#ͶˆEµ›¶A›…‹½Š‚¸ β¯µl/—m›ú#:)OAç1––=F‰±XyëV0ÄÊöy-Ô47Fù¾9¼Ú”OQ¶=d ûŒñ ƒÚµl9Ùò/®­[¡Z‹¶³p•zÍÛÉŸ^-Z´0€¦§F;¤`¨ °/="°‚G¸wïf È¿‰~ê9fƶ,$@$@$@$@Ù˜ºéxÕOúÂîú¢Ñ”-±,$@$@$@$@Öøú醻vE[øÑ%ÒÀ ž»wȢʹW˜Šå]x2j³^ÊáMñ‘þ'm8qÐ/îÀÚØˆ5ÇÃ}…­Š ]³ÙÑ}K£C|Ž-ŠÚ»0jÏüÃs#wÏ9´kÖÁ3ì˜~ `jÄö)áÛ&‡mºeBèæqû7Ý·qLˆÿ¨à #ƒý†­ºwí=k®èÛ÷ª~»VöÙ¹¢×{o—·ذaÖüLgp¬hþ>þ]¸è„ÇYH€H€H€H€¬!жߪ,»¼ÜÜï4±ðÓ/£µ/[ö?º°'³8E×™`ΧD9ª`¨'oÒO¡:I-ج!ddd(ÿ9êב‹Æ¬a!   È–À ÅYK‘êÓÜDÐ v¢BÓ¶sÐÔ˯½%taG.Càáó)Ž)O p£~ ТÂN:€r_ø2•>±ö( €5j=Žçë¢ý©-¬_8>í2~[§ k”ÿæîïï¯{L>|Þq£Ü¨§ÂY Î“ ¶lʉ ÿûçzÌÝ=xõ    l ´½ Ž×¬ÙxmZˆj}= ï°4À"EŠ Ÿ¾ 0pëò:_TÏûbþ²o¿ùçø!ç’KŽt`yj€tU¸КÂ.:þÂßDòo¥ëýÐoe €5>­= ¦7kÖ6åµÓ§/ŠàÛŽÜÔeÖ.ü#»ü­5vìXYSëW-™òÚÛovýsèð-ó7¬L­š5i%Ž+p–qé­0ŒÓƒ ëŸ@ÿ·4=µ½ª×òÃ,$@$@$@$@Ùh3z3L%8ø¸øÕwóæ]ìˆwê5›ŒÓߨXSê6âB}à;eÞ˜µyùÊc3n¼´{ÀŒÊ¶üáÛ³IUžàzÝ þ5…=tÔÔT寀EJ•ë¶$’…H€H€H€HÀ ÛÍ8~¼²¿ˆå5j í4{Ã^Ó•+ñÏîÊtîîÚâSò×÷¤Y<ïð–±ûWöÙ5·í¦ /”,²cóò³‰R² ð Ÿ wƒpš_°aÀÆ$Ê¿ž>üæ×N‹² XCà› …ŠòÙW£ÚNÝûÓøy ¾¬\¨ â¢û p•ÏŸïWù¸éd˜OtÀäðµƒö,ì´uJ­1í>(ÿîÙÄ)jÜuº,ÜТÂ.:‰Vbk¥Vû©o»XH€H€H€H€¬!ÐjÒîÆÝ—}Óiqó¡þó´Ýy üŸþáWÖœ9sT?äÜo€~+g¼õ~Y1 ('‚þ°fd¾|y‡œ9‘óòÔ×ê³pGx'Ù›5   ¥âõ+åk4Ÿ°µõÜ    ë Tûyð?óPþ²ªY³¦ö¡û 0:bÓ¿òæûa (ô1@åDЀMËr®h#‡hé¶÷=¶*&tEÌþeG÷-ñ9´(jï¨=óÎÜ=çЮYwÎ<°cú€©Û§„o›¶ubè– ¡›Çíß4v߯1!þ£‚7Œ ö´nèÞµCö¬¸z` oÿÝ«úíZÙgçŠ^ï½]B> ˜zg7`'½„€rgù”|­ìKo~ÀB$@$@$@$` •ûá7Uùòå¯]»¦GLŽÝSáýwº-ñCA&ÌÅR@LÍW¬`Ðß3§Âs^h€4@/±)ƒŠU‘@þ‘H€H€H€HÀnXh£Zþ§¯\ >óÆ¿ñQ9!~H ÷CA2˜æÏ{8lsZBXÎ |<|µŽ c€5vÛa ÌŸ?¿ÝÍñD    A ^½zæôO™`L‰ ú±yÃÏ»4â×rÃÍרҫYÝZÕÓBRž ¯ž g:Ì$Øa ௪Ž;òïn    û ôçïïoùÇ û× L=Ò´ñ—¯|RâW}h«wÛÔ}çí7Ãö¬K;ê’e€a«ô\h€†ÕvÜñfÊ”)X°ÊƒHÀneÊ|^¬ØÇ½zõµ»žH$@$` ?l¶lÍÏ2àéøý3&¯S«z•*üآѱC§OîwT‹c¡+u^˜ ÆšG–uH€H€¬!ШÑì •ž~ŚʬC$@$à=ôe€@'•§¸Bç…è=_<Ž”H€œM€èlÂlŸH€ J@W¸ït¼³ nOÌþåF(Ü Â _%v›H€ôE€¨¯ûÁÞ €nèȱÐy…ÈÝ tó¥cGH€HÀh€® Ìk € x‘b§u£îoÀ¯»L$@ú"@Ô×ý`oH€H@7ôb€)qÁN-nýC?i€ºù‚°#$@$`T4@£Þ9ö›H€œL@?„=!œW€1:d‰qŠÏ‘ EQ{Fí™8pnäî9‡vÍ:¸sæÓLØ>%|Ûä°­C·LÝ;WôRÎ:tˆ“Ÿ+6O$@$àf4@7ß^žH€ôJ@»7ÅÉå©ú¨8Õ{tiýèÁ]½>“ì €Ð‘M €'Ð…&ÇîuvÉ2ÀàÅ*N5Àn~J;rÿîMO|¤9&  ,4@>$@$@& èÄ÷$Ç:·`ðp*cçÍ…&Û‘·çÞküb x$ GÞVŠH€rN@x<0Ùù…¨\( %ùø.J`οElH€tH€¨Ã›Â.‘ €¸ß“Žº €uVHÍpÅ9™`¤B1ôÉãGzxÙ   :&›" O"àn<¶;É%å©.0^q¾B3NG{Ò3ͱ €  €IÎ5À°‹†ôù5b·OìA¿¸CNDnŒ?¼ùä‘­ ÑÛO HŒÙ™tl—k 6eÄâ„Ý ”1@1ôæÕsü† x 'ÝMŽ…H€HÀ¹¸hæÿùŸÿyíÕb~Ë'™4@H kÊSœgÈâÄ‚À÷o;ðÁbS$@$@î%@t/^H€tKÀ¹x,Ìwô Nyó<Ÿë¹ôëÙFtþá*¸‘P)ƒGï¯" xáLŒnSvŒH€HÀV4@[‰±> x §àñð5[VO)Sº$‚Õ>þàPïÿÍ=º#ÑU%ËwÏ1n9´kÖÁ3ì˜~ `jÄö)áÛ&‡mºeBèæqû7Ý·qLˆÿ¨à #ƒý†­ºwí=k®èÛ÷ª~»VöéöK­<ÿÊ…[ “ˆ0àãG÷½ä¹ç0I€HÀã Ð=þs€$@$`W`lÄÚ¨ý¾­¾o÷(Xàßk–Në]Yžàlã» pøïß–(ú¢t?ñbPßbùŸªd¦Ÿ´ï1âY$@$@z#@ÔÛaH€H@'\d€"ÌüéCóæ}ҥîÔ?\ ¸íšmäbs pòÐßç•ûáùòæ Þ±Ô¤¦žúë¯':y4Ù   œ æ„Ï% &àRÄ:Àý;—¾_® <¤|¹2a+O!è’òÔgºX? tÉ”NŸTzKë~x§Æ'îÜ´À¤þ‰7¯gžñàÇC# ï!@ôž{Í‘’ €Mœn€á»c¨j7ˆ.~xŒz¾W·ÖÇú'Dosv”ÑK¶ë7,ìýMŠ&Ýïí2¥V.š`ÁýÄG—ηébe  } êó¾°W$@$àvÎ5À9“ûÃFš5®u€ÿµÄ‘mk–N~û­×ñéë%‹/œ92áÈ6§–§8ÃèÅ‚n[1è‡o«?÷ÿÕê_ñ¢/M0 [÷Î&†»ý¡dH€H€rN€˜s†lH€<’€s 02hÙç5*ÁI tëÚr7¤e@ïvˆ¢Bõª÷l]$ßwø‹,Ü1ÝèŤîY7ªkÛ¯ò<Ÿ[ë~… þÛ\Ò BÈ¥€ùUç H€¼ ÐÛî8ÇK$@Vp®b?@ì1´o;ìˆ2fX·øÃ›OFmQ–CÁ«[4ýö’ë¹çÚ·n±^UÁ!Ž;¦yBùïÝ vÿ®HákÝ/W®ç°åÑ0?+CÊj÷î\³òéa5  Ý êöÖ°c$@$à^®0@¬ô[>éµ’Å *õëT‡òi¥nÍ’Iï—ËJ^‚í"&ÿÑÇ!Ö§l$˦zFûNñ뛯5¹äï—ŸGìõµÃýÄ)7¯žsïCÉ«“ äœ 0ç Ù x$ 2Á ]Ó¸ÁçbáßjŸ‰j˰`€Og¾þǰî&ëØ÷&n^¢gQ–ÍìýA¹R&ݯöçUÍíô`½Ò=ò«ÎA‘ x ·ÝqŽ—H€¬$à:™`&ÿÑ[bÂçï]ZÅÞ¤-‡‚Vµúá±m l°sûûw.1YÓ¦7³ pû£— >Cj|\ΤûU®ôžßŠ©Ökž…š4@+¿<¬F$@z&@ÔóÝaßH€HÀ\m€ñ‘·­›)&|~Tñ]¼Æ;ÚrhïÊ¿·-öra±>ÁCs5Mž®}ˆÃ·ýiܲeňæ k˜ÛæañœÑq?ÎuãW‘—& Ç :–'[# !à\Üá7½ÒïÌ2Pîˆ0 JtØÚv­›@í 4­¾ÿúàÞ•â}m™4¦—ÐEaŒ3&0WÓòûO p²Ë®µ£ÛþP'Ïóÿ4™êsü¨^t? Ç|±9  ò  0IÀ¹¸iÕä‚òC]~ý¹1Öž8ä¯,[×άöq|Š9Ÿý{¶Q}ªü£ïâñõëT „À ¤qÊ?-Ô×~”e€['®to×°À¿ójÝ/_Þ<Øæ!.r³Ãõ™`ø7 x gÜGŽ‚H€NÀ¹ˆÝ ‚¶Ì«V¥<æýwKïÞ4÷Vþw™?mˆ˜íY¦ôkKæŒÔVïàôVß7J)T°ù·u-Ÿ"ϸ°­ TÆþùå—Loóбmsû¶y°Rïß½éðçŒ ’ ¸˜ ÐÅÀy9 0 § öÄn=~ûû"Ö7qôïH £*öìü*Àë¾ø´rHÀbmå;«ƒ o|š0&¿PA geà– †(3ÿè`n›‡& kçd›k 0%nQž]ö“H€HÀ   “\d€X¸jÑXál|vdÿ긃ëU%dû¢úµ³¦zB[µh°kãmÕ;ë—OÂüR±Ó PÁ,Ô´Œw0øÐ-t^|¦õ¨\ñÙ¢GÕÌOló°sÓk.‡u2NGó«B$@$àh€p9 p×`ÜA¿Kë×þngÛºfÞÑ–%sF”)]Rø*¯Zô‡Éjª7ÑÚo¿6«ôAÙéúš¬Ÿe€›Ç붬[Ø¿þj×ûáòï•Y¹hB½ÎúÓ¯]>íŒçŒm’ ¸˜ ÐÅÀy9 0 Wà¿Ø¿Ëè!åCÁÔPù¦ê…Ïì_|ú‘0", œ8ª§¹šV¾û±Ó8–€UÚ}Sí¹çþW«¥^+1gêPëåÍ!5¹Ð(_]ö“H€, ò ! 0IÀe¸.öÀÿ•-k¦¾öjÖÔMü×göpåGªj¾ª)Ö{¹P¿­#v/1WÙòûO p¬®Êžu£:´ª›çùÜZ÷+Tðß#wuˆÑÙÔÈÙÄp~OH€H€<ƒ Ð3î#GA$@'àH,ðâ QA‹ŽûD‡,=ºoyLèJäE&˜ãkM–¾=~ΛçyøÏç5*íÜ0Ë\µ ­ó;µýN¤Eýfk/ž5Ì\esïgàÆ?ôSzulø¢™mºuúÉIÛÒ·]Ñ— ɤ/8qÚø>Vª îľcôPÆ øñ•âÏF¡D—+×s¿üÔØ©ÛÝZbM ÝeäÀ'ŠÐâçÕ?œ=¹¯Me ßp”þ)ü_±PÑs¤úÄ6nLõiR3NG;ä1b#$@$@z#@ÔÛaH€H@'l€BË”)£ZùV¯ÖLJö.±ÃÜä)¿O*¿/šE`°aýSÆö´¾At,Èo˜SËøA?¾Qò¿Ò¢JØæ!b¯¯•A9—U»töø_=ÑɃÈn 8– б<Ù x Ç Ð\»v­Q£F* Doûº)G÷¯ÈIñ_1áÇfõ^{µ¨h³Lë}ññ¸áîñ±Ül–®ꤲ`bûòeKšL÷RûóªnßæA«”ÉÇwݼzÎcb„H€H@K€ȧ‚H€HÀ$§ ¸Ò°aÃTRa9°ýÑýËs^üWŒïÖ¡™œŠ…‚ŸU¯ˆÆîYl²qôgïº!/«fw­öÑ[&ݯr¥÷üVLuY@Ïú IØÿàþm~H€H€<› гï/GG$@vp¢¢OÚ¡¥O*¿¸q&¶ŒwHÙ¾vÊ ^¿|XáÙn{ÐB“ÍfàÚ!,~ó{6ùª²I÷Ã6‹çŒ¶^É\Y“3?íþªðD 0 ±î{K$@.#à\Ä0RSSË—/¯ ŽÐ.zß2–}Ûç.˜6ÿ5Ù&z²gí`‡”M>½[}WÃ\ªÏñ£z¹Ò謿g~ºìKÅ ‘ €ÐõpØ Ð!§ Æ|ïÞ½þýûkÃeU?*è?=:d© J–®”óòÛϵ_ÌŸG;–|yó`›‡¸ÈÍÖ+™+k¦§æžï:üú±K$@$à<4@ç±eË$@$`h®0@(((¨HuªÌ/¾Ð»ËGB–8» «椌èÕ´H¡´î‡m:¶m®·m¤^¦ á†ï†þвó$@$` }Üx x<× P"GhëÖ­µUò•—'îv$x‰óÊS`_™<ôÇR%_2¹ä¯IÃÚ:ÜæAè¦}b·wî÷àñßaH€L òÁ  0IÀ¥(z€ô0Ú` üêÃòe|Ž8ì㌒e€¾ým-óÆýRéý×Ímó°sÓWÎä´éZœöÉ/< x9 —?> ˜#à´ „kÕý¼ò–Õ¢‚;¶à¢»}ûY_VLïXçÓr&ݯü{eV.š`“¹²òÙÄpNûäžH€H€Èg€H€H@/1@Ùèèèš5k𴬝ë}²jÁð¨ ÅŽ*Y¸ªŸ5Åao¿üð¹ü¯¶c¥^+1gêPWêœMׂûݾq‘: €€­ˆ:ØÈ7""‚ôH€H€<›€{b€J¦þþþ%K–4éU?zwÆøžQA‹r^pÅ]«úZ.[—þÞ¦E<ÿÊ¥íL¡‚ÿ9¸«M>æÊÊçS1îçÙ_TŽŽH€l%`½Âú”ÿ ‹×ô@[i³> ˆ€û °°]ÄØ±cóçÏoÒK¿ñʰ¾mï]”“’e€+ûX(ÝÚ`›‡çMnóЭÓOºÝæîw÷ö=pì* €kXc€Ø³·Q£F&ÿç‹÷ñ©kºÊ« ¸’€. P 8##£Gæ<0ož5ùº¦Ï̇÷.´£ ý+z›,Ãz6*QôE“Û<üòSc}nó·çòù¸÷o»òYáµH€H€ DÀ²Šÿçšt?å›;vDMš]% È–€Ž Pô;F h2Y¨øRÑ"Ú·úzóÊq‡÷,°¾<5À^ª2qP³÷Þ.aòÿ ê}¼c©+grZy-$ù¼u-=ÛûÊ $@$@^NÀœbÞ Öû™û÷VíÿsçÎÝ¿üßÙËyrø$@$à1tg€‚,þÿäããcn} øÿSé7Jüþ[³•ó†DmÉ2Àå¿Ë²p|ëªß0é~5>ùpËÚYVú˜Ëªac÷«“?ºï1OB$@$àT& pΜ9&ÿµP¡‡ ì–t|/þ›/_íÿaŒø÷YüßÙ©}fã$@$@.  S”#GžsùBåÿŸ ¼˜¯AݪcµÛ±vRdà|“ îXÞÅwfû¯>Ϥû½]¦”Þ¶y@ÄïÚåÓœíé‚o/A$@F@e€øÿi™2eL.yèÙµMÜágO…‰‚×x'W®ç´•aø÷YÅá €·лŠûÅèø§G“ÿëRýÿ©t©­[Ô3è×u>#"çÉ‚FüævjÞ ’ÉmŠ}iê„. èY¾Â}Xã‡}þú뉷=Ž/ €£HT¥úTþ³å÷£Ã·œK ×¼ÿkëæ&ÿÁÿ;†O:ªŸl‡H€HÀÅŒa€ ¶Īt «Uÿ¯ªø~éï¿ý¢÷¦L™ò¼™mõíàv÷CJOXßõÌ3 ÷¹ø ÀË‘ €§€–/ß®^½ú&-®^íÁ;WŸKŒ°\"‚7 ¦ÉªT©ä©ô8. ð`3@y'|}}¡‚– ZNq†ù-ØæÁ-©>“ï‚ò]¹p 9]îß½éÁ‡F$@$àHàYªTU“ÿü ü»ëVÎ>—tÀú²s˲+`Ú$ëÕÃ?κeŒ¼( €}Œj€r´ñññˆïÕ«WÉʲÍj-+´kó}ôÁh˜³KfúÉ+‘Ä»ö¡¶F$@$@z `!Õg¯îíNÝ“žrÈeܨþ°J“›FàŸb¹y  öH€ÌðXä-'  o €îDR““3[ýØäèÁé)‘Î(©ñapË|ùòšÜ4 4¼>ÇH$@F$@4â]cŸI€H€Hà?X é-¦´Ô©¹o·_zÊag—“GƒÚµùÁäæÈÖ†´m¼O$@$@z#@ÔÛaH€H€H Xn‡„Ø&ݯb…rë}çe¤ve‰9´³yÓ¯Mö 1°JŸw”H€H@?h€ú¹ì dCKì°ÐÎdúëÅ‹úÌ›œ‘宲?p}½:5Mz ’´q)>n Ð  Nn»A$@$@ÙÀâ:“É®‘”eäÐÞNÑCÙ°z~Õ*šô@ÌYÅÌUÞf  ÷ º—?¯N$@$@Ù@ªO,«ÓjàõîÑ!áØ¾ §£uU|æÿùî;o™ô@Ì_å¦ÙßrÖ  § : -&  °êó矾;v8ðBÚQÝ–i“FbnªÉÍû÷ïÏM#rüt° °‡ Ðj<‡H€H€œMÀBªÏ/ë~´ñâ™ý—3‰‡F ëó‚©M#òçÏm{ïÝ»çl’lŸH€H@I€ÈçH€H€ôEÀRªÏÞó_³Hÿâ§êá©ØÐÞ=;æÊ•ËäæsæÌÑ× `oH€HÀ£ Ð=úörp$@$@†"`9Õç’…S/ž=fÜrüÈÞö¿þdrq`™2e°ÖÑP÷Š% £ õαß$@$@FÀ|ªÏ‚£†õ5®ø©z~8bG£oê™ôÀ*Uª`Ý£‡ÝV‡H€ôF€¨·;Âþ xó©>sõéÙ)1.üÒÙãVöîX÷ÉÇ•Lz`½zõ¢££½î!à€I€HÀUh€®"Íë €†€¥TŸ-›ÅF_:ëÁÅÏ»e˘ôÀ-Z¤¦¦ò‘! p8 Ã‘²A  Èž€¥TŸõ¾ ÞâÁâ§ÚÒ…ÓJ”(frÓˆ=zpóÀì&Ö  [Ðm¡Åº$@$@$cR}~øÁûý–\>ç…e⸡… Ôz 66l7ÌñsÇH€Hà   pK©>K[ºxÆåôÞ\Î¥FØÓäæEŠA¦nè¢'•—!ðh4@¾½ €n˜MõY¸àè.§Ç³I'uh×Êäæ%K–ôõõÕÍ-eGH€HÀh€†¼mì4 €XHõÙ·W—ä„C™'YTNÄ„~ß¼±É$1;v4ÐÝgWI€H@oh€z»#ì €ç°ê³u«ŠŸeû·×¯WKå¹sçöœG„#! — º9/H$@$à,¤ú¬ÿe­¡W.$°XI`wÀºO?­¡ô@/x‚8D p ³È²]  ï$`)ÕgÅò›7,¿rá‹õîß»y÷öÕà€e4@ïüBqÔ$@'@t8R6H$@$à¥,¤ú|¥D±å>³¯\Hd±žÀ½ÛWo߸t61"xýˆeS~¥zé÷ŠÃ&p4 £‰²=  ¯$`>Õg¡1£]½˜Äb=;7/ýõäÉ¥sqáÛ&íZÕw×ÊÞ4@¯üVqÐ$@N!@t V6J$@$à=,¤úì×»[ê©#Ö›kÞ¼zîÉ“Ç72Ï Z¸zÀnß~4@ïù*q¤$@®!@t g^…H€HÀ XHõùËÏ?$ĸv)™ÅJ7¯ž}üèþ½;׎…­Ú»vðž5ƒh€øáH€t@€¨ƒ›À. €…TŸ_Õ¯s(|÷µË),V¸qåÌ£‡÷à~I1;‚ü†ï]7”h´/ûK$`$4@#Ý-ö•H€HÀí,¥úü°Â–¾×.§²XOàáƒ;woe¦ÅïÛ¿i,2¾ÐÝþ„³$@O€èñ·˜$ p K©>_)¾rÙüë™§Y¬'pÿîûw®ŸOŽ<0mŸÿè £h€ŽyRÙ X$@äB$@$@Ù0—êó¥Â…ÆŽz=3Åz˜ðyóZú•ŒÄÈÀ¹û7Û¿ñ`ö k €ƒÐ’Í x(s©>sçÊÕ¿o3)Ço\Ic±’ÀÓm߸röxت°-C7§zè÷†Ã"Ð/ ~ï {F$@$à^R}¶ùå§SñQHaÂb%[72ž<~x÷öÕ„#["¶ÿ¾m2 н7¯N$àµh€^{ë9p  ³,¤úlP¿nä D±X¬$pëZ¶y¸÷fꉠ;¦GL¥ò»G$@n$@t#|^šH€H@w,¤ú¬ôáÛ6¯Ã–å,ÖxôàÞ½Û×îåpà܃;gÐu÷ijC$@ÞG€è}÷œ#& 0EÀbªÏ«–/ºyõ<‹õÜ»õàÞÍ‹gŽÝ·,r÷ìC»fÑùÍ# = êá.°$@$@n&`>Õgáq ¿uí<‹õ°ÍÃÝ[W®_>}<|õá=óð“èæç›—'    ¯&ššZ¦L™ÿÑHõ9 _¯s§OÞº–Îb%Løüë¯'XøwòðÆ#A‹¢ö. zõ·‹ƒ'Ð% .o ;E$@$à*­[·Öê߯mZ%'ÄܾžÁb%»7/?yò©>“F‡,‰^LtÕ#Ìë €mh€¶ñbm  #P³fM¥~ýÕ—G…Þ¾~ÅJwo^Â6îß>{*"fÿò£û–Ò=ì;Âá x ‡ÝP‡H€HÀ6JìökÓÛ×/²XMà2¶yxxÿö…´˜Øˆ5ÇBWÒm{øX›H€ÜA€èê¼& €n( °W›º±û×ܹq‘%[ÜEªÏ+§â#ý‘ñåxØ* njv„H€, òù  ðjJÖ÷—m ºžŠÜzçæ%sÞ¿uÿÎulŸwp]ìµ4@¯þ qð$@F#@4ÚcI€H€J@e€QA‹·/è Djwo"Õç›™©'‚â#7œ8´žèЇ‘‘ €+Ð]A™×  Ð-­ ^²}a÷c!¾woe²úýõä16ú;—tàdÔflö@Ôí#ÍŽ‘ €e4@>!$@$@^MÀ¤Fï[¶{YÿðMÞºv››{s¹çÚ“'=¸{ṉ̃SÑÛŽl¡zõ†ƒ'0> ñï!G@$@$æ ðèþ!~­~óÊù{·¯ze¹Žm=¸w9ýdò±]‰Gh€9xÐx* è… P/w‚ý  p  º*bÛô]‹û^ÍHô6Ä6Þ»vùtê‰à¤c»’bvÐÝò|ò¢$@$àpÏ 0((hŒ©cæÌ™‡ÿ>ÒÓÓ³½¼l'f[ä5oݺe¡þòåË{÷î]íï£qãÆ81!!ÁšK° X `Ù…¯>¼gÁÆi¿\L;ŽùÞP ~îݾu=ãLBXJìžäã4@~ƒH€HÀ“<3@Õÿdw¼ùô@M ãW¶³iÓ¦lI¡AqYh¦ÉÊhPÖÑvJhÍU²í+ x-l ðxÄš˜ý+7Íh懄(\>¸ó×_!Ú™‘uúDpj\ Ðk¿8 €°Á¥€AÉ,›²šåȰZ6@žÒú„‚ŠCù>ƒ|‡84  §°Æc¬;±.pùÀ U#n^¿€”˜VÞ‡û=yxÿöų±i'CÓâ÷ÑúÔ±q p#µŠ(ŸöhÛ¶­Ò»ÌI *–ˆ³,Í‚â\¡y¨ÇS:'æ£b^¨Ò tã3ÄK“ €¡ Xi€qÿÿöÎ:ªjýÛßZWA¥(Š bÁk/Xñ^® þõ*\WQ@PAE©‚H—"½„BI!•$@z2é½÷Þ 5ôªÞï ·ÇÓæLÍÌä—õ.Ö0ÙgŸ}ž³g2ϼ»$û¤ø%mö[3¶¾4Õq ðÒYÚæF~žh*«-I¤‘Ÿ0@õþLßnó 2†NN¡òìpÑ験z¿C¥T›Æk1ôtvý’GãAÄHZ¥…D‹;=¾_HG“ª»™’’ã±_©ä©BKĽ#d€…iþy žN“²Â]._©Ê½|éœÇÕ«—h©ÏKÏœl*;R“CÙ? Ý•ÔQ™8CXéO-ÿ$[Rö \Œ5âŽàC i€ü}M4¼A4 œ“4(4IQfŒÛ#h‰ážS¸÷ ôZº6);P˜ˆ“6’] ¿–Ðc ®rÍ^ ÏÔ ŸþEaÍYK„í—J m"ÌþÑcÿ4ˆ* ƒ€€0Ý+ò"+ tYQ{¬Ÿ£s=wú¸ Iàr¿ßh±Ï³Í ÇŠÕÂMì¨Ú N$ü*\Ëya€Z(¡ €€‰Œ4@þ%²©ªU1@á’3ZI›¼ÿÈš©wj€|î†ì7³JÈ?«;±Äšð;q¥¹lƒAö/}v¢£„GOŠ®S1@áäÞamÒ/¯¹ —¾cíÑø‰ËL·Õ€è!`%T ªÅùÏÐ;ˆhLfƒ*NH¿T£÷/zûSZÉ“Ë߻տÁâï¹Â3Ê>),À+}¥Ç'+ GljqQªœ_ pÜ)7@õ‹Å+@ÚL‰Ü=wúøÕyI^ùÉ>)~´#<Ûvƒ`kÒJ0l e9@f€uå©õé5ʼn‰k}V}œ¸îhMmÁg¹ íݯ\¾pùâ¹SǪi̧40 Ô,}ÛPTš8#·ÉÆ 3‹Í¡±”üƒ“èWœ›ôCW2õüx3„û~I3‡JYMQã¹õAÿÌÒñP ˜‘€• Z,».¨A(¼lÒáÂ'l½Mí\DƒØû¬ÒÐvþ^ÏòJ?<3)|¯”Íã‰Ú)k‰Zþ0èmŒ‰l…Ú‰¡$€8*2x@ûöí:t¸yì‡ÿ6Î*3«³éß,ÝÞC[§rš\’v˜öüõ×Ëf«ÿû_ËRŸgNÔžh,Q  Yú°Õ Pvîf"—ãldç•Ð…Ë~¬”TòLP¶6¡ÂúÌÒÙP Xˆ€‘(\NSØ2õåÒ± F ;)Í*Ž40ˆ‘l.‘© èË3~Q²[GHŸ4Ôùwi<;Çs}¢÷wá{«–ÆÀ ê(  Ð6 ¨`÷Û»²7Û[n¾©ÿƒ}c‚všdØT“{¤6Ÿᤡ¡±ÞË}VÂR‚¿ýzÅô ÷£JΜ¬'ÁÓX ÔôNn6[å‹c•ñ–ü“›pÌ‘ìÇ6-»UÉÖ¦”í49j0/# {—’,Éfä¤cAe å÷èGËN€$¼#Æ7Ò)øZUB§~…Æßù8xÖ<¥áj7Zr€ ‡Éó¥"Â÷Võ6H"hÞWjp*8å‹:u¼…ÿuèrk§më2h¨È5o,9V_”ëqxÛ·?O=ìÔT™M8æ~çN9NÕj  éýÖ:(»Ü k<ÿ &üÆYï_yúŒÄ—„ád Q]%[ÿ”¢”‡4>j0 # Pix€zZ, *k€¼³ûxjQ:T];#J»ÑZÂÑ¡|ôoÊÛ±Ò‰´ +ú>Oiö )ï­zÿ6hg…’  àHÔW‚Y2ï«ÛºÝÊ%°S§£G½™“ä§q ¬Òê,'T4­j¬ÌÊñÝ5Ã{å‡Ië+sc®\¾HK¹è ÚÞæž?sŒÄ¤Î À~€&ö^ë Ê(JÙÏZZþÊK?]¨TÅ–Uùa/ a®ÒèÍ M¼#8@ÀPÆ ¿QÐk€Ô>nYô%–¬:ŠÀ¤ï®”öÁãc2ù7X½KÖ?5 çFI?ž”N%9Þxº:éÊ¢Zþ6Ú{P@€€Þµ@i%˜Þ÷ÜuÓMíÙG^šø@¿ÞQ‡\´¬£n€§Ž×œ>Qwæd aa’_¬×RRAûÂÜh÷¦ÊZÑ“6ô“Äï´Åß…s'h²ß±ú#hb§5Ôù’o¢OMêþU¾ÔVÑ6õ䛡¨e¾ ÐÄî„ÃA Ul€Â}f¤Ã´ p,¨ìê)<'F¿Õ›v#ÛÑ"E.eöXy¥še}ŸBi )›¹Ç~„7R£ò‰äŸÒi ¹îÊNg%yK¤kªÌ+h•þ‡“‚€@«Ðk€¹‰ûÓcÜ^:¨s§üÏV·®·.ž÷Þµ@5àÙSM4˜óÜ飧O4TäDe„î Ý5ÓsÙ{ô/=¦ÜàÙæ&ÊûÑRŸ—hµ—ÆÒ‹3%jóŽÔä4Ug7Ve6TfÔW¤Õ—§Ô•%×–$ÖÇWÓŠ¦´®i®2?ª"/‚;¥Ë,Ë.Í *ÉZq´ŽV”19`€&ôoC p ìTϪ|ÏË ,£å¯¼¡9@C'×ÀMèV8¬J@l€ôî ]b„äŠÞYø[é8Cj¸F¤’ÂwT¡ô]FX€NGm Œc?¢ šsÌmŽ-µ"ÜGxÂõfDGQ1ᮩ",Ú «ûl¡òÖ/\þTôçDhδk°+iùÛ`Õ®‡“€€mÐn€´à!ïMwõè~à 7=pÔ»of'”ÝÐÀRöÆ–ñz”VÚÕÃÏ¥^?¥øè=ˆÞeèýŽÞtè_z¬e·@Õ’×i¯“íA  –Ð1=PÉ@² Ô˜¢4”]25@Kû© ¬1o%Š€@!`œÒn îÃþõeÿ†îîîNúÑb-ÞÞ^_}ùy¢î€aØÜxV5ÊÒÏj"g3o`%#:¹Ð¥™èà û„ üÂZö‹^$ ÈO-Œ#<£HUMP2@>)FvZŠpò‹ Јî„C@ U\7ÀV97N   ­NÀh¤Ý h̪ò‚+—Ïž=ÓØ|¢üäñRzpåÊúzîƒz»mÓ˜<ÓÜ 0@\ TËÄ¥9ÔíõŽeõÓ—¼äi¢?Ò¹*¼6>F”}I-»$Mª ÝâšÇ&§°ÚèIáø#‘ Â[ýÝ `€A¡€€€cP7ÀÜ”€œ$_¶(­CóÙ(P¶#|}yê•ËçŽ)8q¬¤ùDóçŽúùùÝqG÷wv_ûËÂêÒ´#µ´€gÁ±†¢ã%|Gø?ö¬?sROž=ÕH);³vƒ0´[ ]S‘@½UÔ lJè`üDês=¨NѲü@éDDºpõÉ;ô[Ùù&lÅribhh_Byh-0ÀÖ"󂀨u<ìïúè#{ïY)k€M59—.žâxº¹úÌé:.œ ¡¡ôY¹C‡[ºt¹õë/'äeÆÈàé“õzh;9@6ÎSå‡ h™ýÁf”ˆ–3 ù ìI6›†ª¢$[¬ŽþUY'œÕÆ °‘¨ì(r?¥‰3üZ” °™/|Á9¶ô‹4É^ɼñ¦ÏÓ±‰·4— Ðqï-® @@@u|û€Ç¦çž}ìóqïå&ûÓJ0Ì+ò"+ tµ¥IGë Ïœl¸t$âÌ¥‹g(=x¬©jÞœïºuëÚ©cGÙ…C:wîDû :dçöMõ¥”” ­C ÏX,RêÊ’kKkŠã«‹âª cª t•ùQytt™eÙÁ¥YA%™‡Š3‹ÒŠÒ¦ú¤øä'{å%yæ&x䯻åĹfÇîÍŠÙí’©sΈڙ¹=-bkjø–Ô°Í)¡›’C6$¯O Z›xxu¡Uñ+ã–Çú/‹=°4Æoq´ï"Ï‚(ïù‘^ó"=çFìŸî1;Ì}f¨ÛŒP×i¶3Ð}U‚€€U À­Š'°5z ðh}Ñ´o?m×îFò·G¾ßÍeÕ§cÞíÿà}!¶ †ƒV‘;Ç+í¿uÓ/ÜùžÒ’4Q°k×.±º SÇ«E„ÚÚ í°_0@û½wh9€€€h1ÀÌD_ç-KîêÑä­c‡[~˜þÅÆUóîîÕcÜèÿd&`9@½ÈvƒÐ…û:æÃ=î$ßûÛßþ&µAÚ|¬Zõ¥”¬£4E9@3ô'T 6Ohó· °$˜ë¸óù3g:d —ÛúqŸ¼Û«ç‹æMÕn€|?À”øˆiS'÷¾÷ž:ÐJ¡\iå˜æ£U¢€"hÉêh[`€më~ãjA@D´`b”GLè¾ÏƽÇl­k—ÎS¿þtÛÆÅ¯y©Ï½½ü<œÔGJv„¯l>ÚÙé±Kýøàýn¾ùfZæ—å Ùó¨/M¥#hª¡eóñò6@Øn2.@@@™€ºÖ–&ÓŽ9©”d´{Ý/sºv¹•yà#?°tÁ÷”ìw_ï¿ñjZ|€Ò<@‘žøÀ}ÛœVÑnÇK ú’Ú#¾º(ÖJÔÐsP@ì” ÐNoš   `† Í ,Î8ÔTsþÜ™äøP–dè´aÉ†Õ &Œý€Ü{à­;xëõÍ–/YôÃ˃^¸óŽî?KûÂ_SA­Ñb€Çª[6·Zè*ó£*ò"ÊsÃËrB˲ƒK³‚J2g¥¥(Lõ-HñÉOöÊKòÌ¥Ù’ñn9q®Ù±{³bvgF»dêœ3¢v¦GnO‹Øš¾%5lsJè¦ä IÁëƒÖ&^phU|àʸ€å±þËb,ñ[í»Hç³ Ê{~¤×¼HϹûç„{ÌsŸê6#Ôuö4OwG-  ð¿ÿÁÑ @@Ú4ã °$3¨"?êlsãѦºÃþ{¹n^·Èiýb§ K'~þ1%ý¸ÞxãÆþc»Ój—ë'}1öþ~}ïêq'©`bLðñ†½qÍ«ª £­0À6ý²ÀŃ82 #ß]\€€€^F`iv0%Ç*Ò/_<[\åê²~‡ÓòNË·¬pÞúË®m«vm[½pÞ´—_zŽ{ =xñ…g˜õMÈ¡ý^;§~óEŸ>÷ôísïôï''Äk(VŠ:f€:kr€z; €€€=€Úã]C›A@ÌFÀD¤A’y‘4žóTó‰ôÔXòÀ½ÎköîZ·Ïeý>— ®»7ºíÙ´yãò·ÿ=¼C‡[¸ ¶kwã«C/^8;)îp€ßž¯¾ü”6”ïׯM<ÖP$ 2À棕¤dVŒ5[?CE  `3`€6s+ÐÖ `¬,ÐÑ^í§NÔ6Ÿ<èéæäå¾ÅË}«·Ç6ŸýÛ}óôGë ¥QW’L9@J6Z=°Œ÷_4@ &4p$æ5Àêâøš’Ä#uùΞ¸pþ\a~zXÐþá‡÷‡ý‘¡Þ±Qþ~Þ»¾Ÿ:±ÿC÷s|ô‘þ´m 4®`EE8µv`-PGêí¸ 0@t6MÀX[–\WžÚT“{îôÑË—/VW%DÖ…û ƒ 0)þpzrhNFdLÔ…?M§=¯`¾4ÈO© k•Ànmú‚‹p80@‡»¥¸ CXÎë+Ò*3Ôæ=Õtåò¥£MµÙé1 1yÐ20éI¡9é‘91¥ ûœ¾8àHm¾4êŠÉËËsÃZ%`€Z:TCCôiÓ ôÀ?ô˜ž¡çU§ßŽ?^xÔÈ‘#÷îÝ«tÈ’k?QQQT€°SÑá7n¤£Øo‹‹‹•§Ó±2²§ 'µ·ŸÎHõпt.~ ]²\( Њ`€­§h}–6ÀÆêlJ’ž>YwõÊÅsg›«+ò³Ó¢Òƒ)Ò“BrÒ# r¢K âÿ0À<*,Šë˜ZÞÔÛMÉÈÄ„;ùcz^ÉèH–”Ž"”=)+OêEÇ OÇΞ!¥Tj0?Š™ÿIKK#…3¨ý¬<ýKú':PEAõ’D+€Z2N  `»¬d€$×âdS9M¼zå2©`}Mqan\nåøGIVžE]qÒɦ²²ìÖ‹àÒ¬ ’ÌCÅEéEi S} R|ò“½ò’3ÔmF¨ë´=k&5æúeäXÛHÃȾX’~Èâx›I“Dm¦’ü(*É:!É•ô2™òšY[{Lÿ*ñ‘-@úÇE”P¤í—J,7@^'{ Ûl›º_h € }@@ M°ŽRP4¯¯E¯^>súxC]IYq²ûµQ Ò’ôÌ\FÛзRÀ•^'Ì…ÈH¥DexÎMäE”‚ãú'=ŠË¡4›'Ì’§±Ó‘‚²±¦ü@Ù¬#7UQ‚‘gÿ¤§£C¸à‰2{œ!È@eØUü€Ø2 -ß´ @@Àâ¬b€9M5ŠÑ|¬ê¹“¿ýv58(`ÐÀçeK’žh*+Í¢D\+r€ò½Q=÷ŧê æ"§äKܯDÞÅ”ê©äxìÔÜ…'å.ª4î”.UòF$ý,þ&…€€¹ ÀÍMõ€Øk MÔÙ鱓¾øT¶ä5,¥,\ëFÊvmž%“fó¨¼t%uOc§àb&ZX… Ò\;• ²¿âª©’»S?P4¥Ð®^ýh,´Q0À6zãqÙ  Œ€Å °*»Ñä¨%l,-É<ÜÚy€2¯á¬<6YƇ†òaœÒJIðØ0QQ†MïL?ª“(3žÊ“UJ•©ƒÔ6~ÂKãê¨÷zñV `k`€¶vGЫ°¼f5V™× °„Rp­X FÖÖDKzÒÉšÈÁd·‚àîDT~øDAáõ®¶Bg”-Ã,Ž~%lÉ?‹JKøÕ ••Ï~´êË'0 9(¢»%`il¨Ê4=j‹[ 0ã`« P¶§+í¦@îD¦$Z—Eiß¥Í 2@ž²Éž¬r”=µôI Ý¾Ï¡á ð0@t6MÀâX™Iû›µE‰Ç‹É¾l!°„Ò †¦Ò±íD)AÑ}s€,)'ZEoÚÆ|raã³ E.ª1ÈӃ‘¥È¶é÷M\¼€Úù DóA@L#`aÌh¨4C´`Cqqz€- Po£‘–äZ$oBäöeÊ :-HÍMT²5n€F¬ç ÔÛ Pl– Ðfo   ` 5ÀúŠt³Ä5,*J÷·•ÀŽðÚúæÙ³g¹ïñlž–•`”ª×h€|ãZQ†Ï ”Ý@BïÒ2J-jë(¶Hh‹wm°{2À4ÿ"[‰…©¾)>ùÉ^yIž¹ ¹ñn9q®Ù±{³bvgF»dêœ3¢v¦GnO‹Øš¾%5lsJè¦ä IÁëƒÖ&^phU|àʸ€å±þËb,ñ[í»Hç³ Ê{~¤×¼HϹûç„{ÌsŸê6#ÔuÚž5„ÓÒ¬Ö=ôžˆ2{äBäQJ {Jól|”¦JæmÅnÜ(Pj3_J”l“ §ì~჌ÑûÙ¿?òðƒue)æŠë˜â[hKQ ì•#Ô<ò%ò7’%ú®#•C®y,AG†F‡Ð“ÂÅc¤ã6µ Ÿþ'ÝPô‚µŸšÍÚ/ܵB´$)Ï1*¥Ûô{ .lž Ðæo  `I¦`²Î»ÇÝ=]’nM ü9Öuzè–k¿}ñùgÌ(× °€ŒËÖóYߤ¡’Ò øàI¥üY–ÒQ¢Iwü Ýé¶ < ªþ¢±¬Bßí(Û~ä-ù¶„ºAÀ²`€–å‹ÚA@lœ€é8q¿œý]Piò®Ì U žs"vL:¸æ¹¯F¼÷Λ4Ô,QCXWPìmkvoxIÒņaK§;‰ÆUŠ^ô[:ŠÍÖãK¿ˆví²sJ³E•S ‘•—]Fú¤b”„µŸäPö%Lm`•Ûø Í€¢W€€´i¦à»#†ÿðË¢ˆŠ ¯|݆dߺÝßmøØwiçÞwì©-M2=j ŽÖå“nÙ`´ñµ@Ûô‹ `Ÿ`€öyßÐj30Ý_ôÜ¢ký‹âÉY‚Ž÷_ÑÿÝÁS¿ž`ºþQ × 0É+ßöh¦žˆj@@ÀJ`€VÓ€€Ø&Ó ðÓßùxÆ$r?šHÁÒ€4tÐôÿ¾öêàš’D3Da<åɵl3Úò~€¶Ù«Ñ*P!D÷hÓL7Àu+ç6˜Ä²´ éM¤4à°…^|þéš’3`m^^â~Û `›~ áâAì ÐÞîÚ   `V¦`azðݽzL÷]ÏÝæRðÕÙc(X]ozÔÆ©Ík-›x·œ8×ìØ½Y1»3£]2uÎQ;Ó#·§ElM ß’¶9%tSrȆ¤àõ‰Ak¯N8´*>pe\ÀòXÿe±–Æø-Žö]¤óYå=?Òk^¤ç܈ýsÂ=f‡¹Ï u›ê:mÏš Â*ÍÚP€´-0À¶u¿qµ  "¦`E^ä⟾{òÍÁLüh ­óà/ÎûaŠéúG5\3ÀÜÜwÛ  ^Z  `'`€v!¨é4ƒIDATr£ÐLË0‹Vè¾ýjÜ#o½1hmâáÕ ‡VÅ®Œ Xë¿,öÀÒ¿ÅѾ‹t> ¢¼çGzÍ‹ôœ±N¸Çì0÷™¡n3B]§íY3áÿ ~.]8£ïÆâ÷  ò`€è  mš€y 0/²Â’A9ÀÔ9ÛQXÔËsCÏŸ9Ö¦;..@Œ%4–Žp¦`y^„¥ƒ`%Öì(,™,Ë & <ÛÜà} V%´*nœ @@ÀÖ˜Ás#Ê-Õù±•”U³¯°Ü(P2@gNÖÙZB{@@ÀÆ Àmü¡y  –%`¢–å†[!È*3Ò#wØ[Xj 7@zpñ|³e»jÇ"t¬û‰«0€©˜Vfù¨Îi¨L§”šÝ……V‚`uQôo¿^5ð¶£8€´]0À¶{ïqå  DÀd -˱x´`EzzÄ6» + Ù M’DgÐH¨Š€8&uþêÀžwuwݱ$?Ù§ ů0Í¿(=°8ãPIfPivpiv¨u¢ªÅÓȦì1,±„0È7«rÌŠ«s€š›(ê°+ê¸vÙ÷:v è¦~9ZÎCJ³­× 0|Kš†u –ýõê%»êzh,€´`ëpÇYA@l„€ÞQ !¾ŸxôA’ÀA/>•åö× ¥­d€õi-*e§aòŽð?}û–pGxiž9y¤ÜF:š ¶LhËwm°8½˜›¸?=Æm˜‘d ·ßÖu϶¥lhIV°Õ¢ÅËSSÜì66§„nJÙ¼>1hmâáÕ ‡VÅ®Œ Xë¿,öÀÒ¿ÅѾ‹t> ¢¼çGzÍ‹ôœ±N¸Çì0÷™N?ðD_¡þÑcY¬,ˆúý÷ß,Þcp°s0@;¿h>€€€i´`^’Íܶn^§N-#B'ñá5´^TåG_3ÀÍöF ç–)Ã^yLä~ôß»{Þ)k€ô$öˆ7íÕ€£AÚ`›¸Í¸H%Ú æƆ¸<÷L‹“<ùXÿøp×’ÌÃÖ‰ª<2À’(»í9À€]ÓÞù¿çÚÝxƒTÿúõ½'Ðs“’Ö–& «ƒ€¨€¢‡€€´i [ ”r€d&;u˜?grqæa+D‹–¥¤„l´ëÐb€!îs?ûè_;Ü$u¿î·w]8÷k%÷ãÏc=˜6ýzÆÅƒh Ô E@@—€ºÎøæ“÷G¥y€¢Ý ön[Ö«çd)?t=¦™ 2Àº²d2({õy€³&èÖ¥£Ôý:wê8eÒèüÔ½úGÎ>⸽W f 4DT  `¿Ô püÇo“ôíÝËgï/‚Ý gÌIòýþë1íÛµ£o¼68>l/=i¡¸n€Áë“í<” pɬîíÕ]ê~íÛ·7zdF¼·÷ceN4•ÚooDËA@À `€V€ŒS€€Ø.½£@ÏÔ¾Ý?ÍšÈF¥äº—ôÔ…Tpòçf'ú k®ÇÌIŸ DknYñåSÞ'u?zæÍá¯è‚wkw?V²±*Óv{Z 6@h7Mh=z vƒÜ¿¶oŸ^ä$ÿ7ìåÇ5 üKìwù…†ƒ²í"V-.-`â3UyººÒ¤¤ uÜÝœ¦¿üÂ#²î7ø¥gU–{QwBÚ¢õzÎ  v@h7 M°-H»AdÄz|ðŸ×HWzõ¼c¿ËÊ¢ôiÌŸ=‰ Ê<ñØCÛ7Ì—-cÜ“d€µ¥I-îäqÐuÁÈÿ(ë~÷ïçºs…¡y?QyËõÔ  @è7—  `<ÈV‚Yµtm H>¿›ü •FJ”Û'¾Å&Þ×çî¥?MÉJð’-iГ•-˜˜xx½G˜×Òñ½Ö®Ì6´ËßÚ³Mt?v¸ñ½G‚€@ l7—   LÀ $m ØN)>¼—>MÛÊŠ=ÿÙØwØöñ”üêóQJ%5zà¸:ñ°½Fôß~>¢c‡›e·y˜3ã ³¸ ¯uÐK¨ €€82uܹqÞŠ…ßÐ(P–,H=@‘ïùÉÿÍVùê³Qô_ö¼(èùYßïu׬äÈ7‡ôÚ([Rï“•¹ºÚ’„„C«ì4Î}×Ýd—ú¤m ZêS‹(:rŵ€€É`€&#D  öL@݇ @Þ2â$…ï¹f€†»óò'{ðZ–¯Ë/K¾þJô˜~ËJÒÏ Ÿ¢ÿ^“ƿԦþßÊÜ(;5ÀÕ ?{ྖEt¤?´ÍCb¤»£3´Œ=÷G´@,NhqÄ8€€€-P7ÀTÝÞ·ßøGË–€}zùî[Ý"%ó¾&¤Ï=ó¨l^ÞÅiÑ¿^yž‹=¦c“#öIë”>CXSp¥…Ëú©O=ÖOÖý†hÄ6=°¶4Á–ûÚ ­NØê· hMZæ.þñ+¶%à¼Y_ä§øŠ")bï„1ÿ¡ß’íÐz¡ÑAÎÒ2ü™Pÿ-3§~:à™G¹ÑcªVý¨,Ž\iá½ó‡W?)ë~ÏxÜ{ßZ.g\±ã E­ÙŸpn°y0@›¿Eh €€€% h1@šxpÿúþö%«ù×+ÏшPš( *@#<©-3õËÑ´{„´ŒðªdÉ“©6¦ŽôCõÏ›ù¹ìQÌãWØxìùñý·_–u?ÚæÁÙi±qRgÐQçN±dAÝ  `÷`€v q  ¦Ðh€ùÉÞ±îügé -îâ¶s)=#­kç°½ãÉ'Œ}x‡l1á“TíÊÅSG¼ùÏkûLÜ({È5Œ‹ Xn³é½äÓÿ¾ª´ÔçòEßdq¦þí׫¦ô  Oèð·   F@£æ%y³X·|ÛæáÛ/?âO ¤Ç¸Ó¨Ñ¾½¯/2âzïùE¶¤ö'É«‹ãb–Ùf|=áÍn];IS;u¤mòSL1:ƒŽÅ$@¼ÚA@@/ ^D(  àÈ4 eâ·ù‰G[Ööìÿ`Ÿ]›çóçE¶¬3àéG˜уu˧+•Ôû|enduQl¬ÿ϶KgÜ㎮R÷kß¾ÝÄñ˜}›½6x¢©Ä‘;+® @ÌAhЍ@@Àn h2ÀDϼ¿Fz´ë·“>ìÔ±%øúЗt·‰ ðÿzïYA›I0GêuW÷y3>K Û¥TXéùÊf€Km'Ö/™ðÈC÷ÈNù{çí¡ÚæAÝËsC½zÉn{" V"´hœ@@À6  ðÁûïÑnÌйdÆìÉŠÝ—ç–“à‘›¸?7ÑS6¢n#ý# ¢ù{$„iÑ®J%C|7}üÁÌ釶\<÷K:\©¼èùŠŒ‰9°ÄbçšÉÏ?}}{C‘Ò6!þÛõfê,T«€ÚæK ­°50@[»#h€€€U Ìš5K¨1ÝoôÁÍ$ T ×í‹û?Ї*éyW÷u˧©”Lsžñí˜OÿŸ‘ÿ8cBˆïF•£èW-Xã·¤uãÀ®Y¯yZ6ï÷äãý]w®°Úi© @«¾lp2{&´ç»‡¶ƒ€˜L ±±±K—.B«éÙãöCž«ÿÌ&ìÏÕ?NŸÀR|ƒ^x2À}µú! ¡Î‹çL¢LàŸ[A<ÐgÆ7cB|6ÊHXUí·¸µâо¹ïý{`»oê_¿¾÷8­§EÒ,Z @“_ ¨@ ­€¶•;ëP"™™Ù£G‘öZÃFjøÐïÊêþêÀ}Ûé=6U·wÅÂ)o¿ñ ³GÂÈÀ-Ò£®`t´ï"ëGØþŸ>=´c‡›¤î×ýö® ç~mQ¯ÓXyMqìï¿ÿ†   … P %”pp•••}ú´Œää?={t?àúKN¼»¡áé²lÈàgY=?òÀ¢95Ö°sãJ…+r"Èu¾ ­³&ìÖ¥£Ôýh›‡)“F[s›¬È¸zù‚ƒwP\€˜ Ð|,Q€€€=J`§Ž·¬ùù»ìx7#"È{Ý{#^eƒ ¬‹gþ÷Þ^·Kݶy7z¤õ·yP1Às§Øs¿CÛA@ÀÚ`€Ö&Žó€Ø,’À'Ÿ|R¤=?}‡†ƒqÁ;ÈýnïÖ2ÏlœòŠFTõ‡Î×ùX<6ÿ<áÉGþ’å@ÞþŠ.x·Æ‘™Ö)v¢©Ôf» ¶Ih›÷­hÍÍÍR |ö©‡ã‚·gǹ øâ¡z3•¢Ó§|äµV{md€•º(ïùÝë&z®¿4ïGÏ ~éÙ@ÏMÖ‘:íg9VŸß:½g{&´ç»‡¶ƒ€X€ÀÅ‹G%!š¸ßy -jJìX?çŸ/?Ã×ÿlQÁ¯Gûí[¡·ÎŠìˆÊü¨(¯y Ÿíß½5ìY÷{¸¿ÖÝæAViîßÙæ Ü|T  ŽOèø÷W  `''§›nú˘dn ø\¯­é-±kÙü¯†ÿëEšgȤ«oïžÇýGE™FzÍ3{¸ÌóÞ+²Û<ÜÝóε+fkÏÈY­dmiÂåK猸§8@@€ÀÑ @@@@ž@bb¢h—²µ—ž<ÜcVì^³Äš¥ß¾õúË·w»õµCïOŽp–Ö\‘^™éù£#ØuöWc†)mó0gÆV3:ƒND#?±ñ^±  `  )ôp,€€€ƒ ýâ_xáÑðHÊÝ-˜ýYfÌ3Æöu³ß}{Mß)­¶üºÎô4OÌýfdî-ëÓˆ~h©OÚæÁ¦–úä~ˆ‘ŸþbÃåX‹ ÐZ¤q»%0kÖ,©, |î±p¿õ™Ñ»­d€yûç˜Ëfº¿Ï²Sþh›‡ÄHwƒ2rV+ÜP™†‘ŸvûBÃAl‹ жîZ  `›hDhÿþâu2)8ç»1V4À"ö[—âï××#àÐ!mm›î–•QXôÅ6_h€€€ÚéC³A@¬M€6Š;v¬4{öÐý÷n\ù}F´‹å‚åÃ=~0.ömøêŸÿ.›÷{~ÀãÞûÖZ-•g艎7ýöëUkßiœ@š Сo/.@@ÀÜ‚‚‚¤ËÃ\=ûd÷ 2t»,åÙa¹ááî³ O§¯ßy}€Ò6ÎN‹ U2«•¯+Kºx¾ÙÜwõ€`-Pô0€R2Dë­áƒÂ|ך]ÉËsÃÃÜgiC{¦}üÎ Ž·üeC ¦‚Ýoïº|Ñ÷Vs9CODÃ>›UxOP@@@+äµ’B9 ™ÒeBɯڵ»ñÝ·þè¾"=ÊÙ\QžEæ6ScLúø_ݺt¦þ:wêHÛ<ä§jeÖ)ÏÜ›=à… %´(^T  ààÜÝÝe…’}½6ä9·í?¥Gí4=þ0Àanzbþw#ïì~}wA¡Ò6Ç`›Û<^Âýüu‚˰%0@[ºh €€€¸xñâO?ýtÓM2ã-ÉÁžyò¡õ˦¦Eî4%Z 0'4ÔuºJ¬œ;êáû{ÊNù{çí¡6»ÍÜÏ»<š  `ß`€ö}ÿÐz!@{Çˮʔ¬Ï½=¾ûêƒïUi‘;Œˆ? pZ¨«L8-ýdÀ}eݶyñßn1œ†ž…Öz9s²c>m¤£ m‡ °íÜk\)€€€Å TVVNœ8Q)H’6pÀ£?Íå¿.-b»ö(Ï -Ë Ù÷½(<6M6øY÷{òñþ®;WjeV(OI¿M%ØÞÝâ}'0@t 03Z,”Æ…*Íd«Å û瀕 ¿ŒÚœ±]o”I ÐgÛä‘ßiwã Rýë×÷§µó¬àr†ž¢©&ûü™cffê@@ $4Šƒ€€€64?p×®]}úô‘ÍÑñ'_ðÈWþãºõÇÔˆmJÑb€Ù!Á{¿£pž2î}Úæ¡½´ZÚæaáܯ 3‹–/Ï m¬Ê€€m€Úæ}A«@@¥iëˆ#F¨{ û- }æ‰ÇŒ¾xÎÏ] ÈÖÌ»ç®nÒci›‡q£GÚÂ6ÕEÑ4Γwùõê%G»y¸p 0@º™¸{ @«†:99Éî&¯E…eÞþŠ.x·E‡qªTN‰>R¾“GÊ/œ;%=í¡ë¡  ÐBˆ~  ­C€Œ¡¬ ­ªw® Ô ¿ôl ç&ë¸mÛP_‘BÓùN4•Rœmn åkd8+€€€É`€&#D   `2ÂÂÂ5kÖÐQ½Óü±à r0Ksš|WQ€Ø" -Þ´ @@ - Mýüüh?‰áÇ ·” T!å Û2\;€€€é`€¦3D   `A4X”V¥ žUƒ€´ÿБm½wtIEND®B`‚dibbler-1.0.1/doc/dibbler-cascade-relays.png0000664000175000017500000027510212233256142015602 00000000000000‰PNG  IHDROš À_sRGB®ÎégAMA± üa cHRMz&€„ú€èu0ê`:˜pœºQ< pHYsÂÂnÐu>ÿyIDATx^콘TŶþ}ÿϽÇãw¢ÇˆbÀŒ€d$I”,aP ‚dÉ99ç$I”œÉ HN’É æì9÷{aEz÷î0»»ßzöÃÓÓ»â¯öžyYUµÖÿû¿ÿû¿ÿb"   (øâF²k0S¦LéÓ§bwâ½)¨=&   ˆÑ£G”WmÛ¶ýæ›o¢Ö¥ønè¿â{x €¯@ÃÝzë­Õ2ÜyçÐ…¾ê|Œv†j/F'ŽÝ&  ˜$’’âFê©<9r䨼ysLÕ7¦ÚóÍT°#$@$@$êÕ«§”Üßþö7ù|ûí·gÍš5ÿ”.]:³LJJ:}útà‰È©ö"‚••’ XÐ_tèÐaäÈ‘>ø È»Ê•+ム^ýu³àÃúorr27óyx®¨ö<@c   /¶mۦ˸+VìÝ»wûöí­[·†y· éºvízüøñ5kÖ(PÀ¬ù §OŸî¥í.Cµ—À“Ï¡“ @t ôîÝ[ ¸Œ3îÙ³jiß¾}7n,[¶¬Ü}ä‘G&Ož|æÌü{ï½÷š5|!£Û÷nj/†']'  Ø"€#JºaŸ®ö øöïß?kÖ¬lÙ²IžB… ­]»öĉíÚµûûßÿnÖ|5jÔ¸páBlH“ÞRí¥ v6J$@$@ GÇ,tÅ6iÒ$³Úƒà;pàÀСCï¹çÉ\§N±ÿUªTÉr3ì…¿üòKÂÑ fÀT{ÁÐb^   ¯&Nœ¨ävéAêÙ©=¾]»v5kÖLLzwÜqGŸ>}Ξ=»|ùò\¹rYnæƒc¯ýŠÿrT{ñ?Ç! ø¼¨(¡Vºti¥ö°c¯V­Z0õÁ°'¶=¤Oo¤uëÖ•(QBJ=õÔSsæÌæ5j”åf¾bÅŠa9Ø#õ[¨öü6#ì Ä!,¶ê!4°üªÔÞ”)SÔF½%K–èjïà„C¸ˆœ+y þ>øàƒ#GŽ´lÙÒr3_Ó¦M¹™ÏðQíÅáÅ!‘ €ßÀ£Š¾‹ð¢ö`ÌûóÏ?!M<° ÁÙÞÇ,¶=Q{‡n¤^½z©Í|5‚àƒëuŒW¯!×ÌÍ|ê ÚóÛëÀþ @€ÉM ²Ü¹sÃ…²¨½Ï?ÿ£…2S>–‘ ʯsçεwøðaÈ;è<©çþûï2dÈùóç-Z”%Kóf>xxÄŒC”Á‰j/xf,A$@$@$$h/%Ȱ«ÔÞ¥K—P¶îáîÝ÷Ü·f˾Òå*KÎÇ{l̘1ʶµ‡ôÙgŸ­\¹²páÂ’ñÖ ö ùúöíkr Æ?Xƒìl¼e§Ú‹·åxH€H€HÀopxB·½AŸ)µ÷Ûo¿¡·­ZµB† IÕv>‡kÚ¼ÏeO={›7o^äÇJ®R{|p8ÕñøãKµåʕ۹sç±cÇ”åÏ`êkÛ¶m"‡\£ÚóÛÁþ @¼ÐCh<ðÀ ˸p*öí=÷ÜsÐg#ÆMÛýÙyu 1Ö>ÑmÕªUÃá ±í‰ÚC:zô(¬‰IG@ ¿øâ‹>ú¨xñâæ…]læÃîÀx#ën:ðj:RI† Ƨl{P{XÀEZ¶lY¾|ù$OžòÈ#3gμ|ù2þ}øáT¥¨+?l+DþxÄŸ:&ª½8ž\H€H€Ò˜ŽDèºjíÚµ¢ööîÝ‹£¸è\íÚµ‘¡a“ÖŸ~~)¨kÓÖƒÕ^K]¢EŒ œ·Ûž¨=¤“'OÂuKΜ9¥/¼ð:ƒ0»:u² ¹d¼†\£ÚKã׀͓ @€£;¥öà ROÔÖ^1jBcêœ%Ÿ¿äáZ¸üýBEJH9r䀥PW{|8ð Í÷Þ{¯ä©W¯„ <¹`WŸåf>Xã/äÕ^¿b ¤1=„\+µ'!4à’ k²»uðÄeÏ×Äió{â)QoXÀŲ¬ØöDí!á0G³fÍÔf¾\½z†FœÞµÜÌ—’’’ÆàÂÚ<Õ^Xq²2   ¿Àˉ®¥¦M›¦Ôž„ÐèÖ­2”«PåÐÉË¡_]zôW›ùZ·n ·|Jí¡'H8ÒQºtiéÒÓO?½`Áh¾É“'ßw_ªgÃf>øö‹É¤Ú‹yä(H€H€HÀw°—N駻ヨÀߊR{X`UjG%0@Þà~vì?ñÙ©+a¼Vnøä…¢©›ù ìWCW{|_~ùåÀÕf>H=>XòÊ—/o^ØÅ™âÁƒÇôf>ª½øx¡8   ð8.†c%ž0C©= ¡Ã¸û|þBGN_‰Ä5iÆ‚ÇÿÚ̇\ÄÏÛž¨=$˜6l(=Dȵ‘#GÂ)ÌòåË%h¯!a"ü9û ±ëÞPí¹FÅŒ$@$@$@® à ƒL°áaÏœ¨=ø^‘:*Uª„ í;÷FÜsïõmyX¨ÅA xæSj¡Õà–EÙ ¡ó ö ù ü,C®!ì‚¶¹fà—ŒT{~™ öƒH€H€â‰|(µW @H=Q{ æ= ¡±dÕ–c_\èµëÓ“›µ‘myX½Å®ØöDí!ÒÒœ9sž|òIéðK/½tàÀˆB¨C³‘ß`å7¶B®QíÅӛű €_è!4ºté¢ÔÞ×_.„ٔᡇaÕƒÔûü˯#}mÞº¯d™ÔmyØÌ‡¸ºÚÃVB¤>}ú¤K—Ã4ú|ñâEt'9,7óá Š_XêÕ^ B¼O$@$@$$C¥K—ŠÚÛ³g„ÐhÞ¼9$TZõ”Ú;~æë(\s,6Kê¶<,࢟bÛµwîÜ9œÕ¨S§ŽÚÌ7uêÔo¿ý19à±Å¬ù2eÊ´fÍš Ù¤Avª½4€Î&I€H€H ¾ "…ÒF8ß°cÇQ{ðrŒÃÙžˆ'¤ÐÕÞ‰¯®Eçê7hä½76ó!½ñÆ­¡Ôßùóç7lØP°`AÉ7o^ü͇“¹–›ù’’’dyÚ·‰jÏ·SÃŽ‘ @¬@3¥öêÖ­«ÔÖF1$DN“cûž5¨½“_]‹Îµïðé¦-R}ìaõk¸bÛµ‡7{Ó§Oøá‡e µjÕB^¤ ˜|XùMNNöíf>ª½X}‘Øo  ð'C‰'*µ÷믿¢ÏVL/–.Ç+FµwöÚɳßDíÚ¾ïX…Ê/‹zÃ) œÕÐÕstïÞ]Nx`'"z~ùòeœ/.\¸°Yó¥OŸƒõá¤PíùpRØ%  ˆaPú(Ü5ãL1þ}ä‘GÌš/{öìØè«ù£ÚóÕt°3$@$@$óà”Ni x3Qjv2Œ BJBhløp¯OÔžˆË±oM½÷FÀ\XòZ¶lyìØ1¥ö.ÝH8!¡ÞŠ)²uëÖ+W®ôíÛWw"­^½zuÿ„\£Ú‹ù—Š   ÿ@„1]ý R­R{BãwÞ$Ê”9+B¥9¨½/ÎýëØé‹ÍZ¶ûû߯‡¹ï¾û`¤Ûž¨=¬á"Mš4 ·DÕAb·ß‰'^}õUËÍ|½zõòCÈ5ª=ÿ¼ ì Ä<„Sº6<œfµß+ÿú׿0<FÍ[w ¨ö¾¼ðmš\[w~Z¬xIŒy«V­ÒÕìywmÚ¤ºkÆf¾¡C‡þøã›6mzþùçÍš1Ù°æ›¶óJµ—¶üÙ: Ä=„F®\¹¶oß.j ã„yï€$š·hµwæâwiuÍš÷ÞO¦úØÃ±blÝÛÔÒÕ«W®|ùTwÍÏ<ó d.4ߌ3 ïÌš/_¾|Û¶mK«™¦ÚK+òl—H€H€â¼ë)­ÊJíA!a´k×®Å]®=|ò²µ÷ÕÅᄎ”f׉3—’»÷IwÇè3<íaUZW{|ˆ ‚  ˆ®+C.]º4œ3ãË:XnækÚ´išlæ£Ú‹Ã7C"  4!­£›µ,X Ôž„ÐȳI¯Ôp¯öÎ^ú>m¯}WNJÝ–÷ÔSOaPbÛÓÓˆ#Äñ2D^ÇŽqå³Ï>«X±¢Ùȇ•_xiŽòf>ª½4yØ( Ä!=„Vl!õDí9r£…³=1ƒ™83(µwîò÷i~­Xó~–¬ÙD½a˸ÁwòäI˜î$ï;ö矆-3[¶ÔRºòƒ+¿Q{¨ö¢†š ‘ @œÈŸ?¿Ò4pA¢Ôl]9üíá.ü›lÛ{)Q¢„@€ã=¨=h>(?ËÍ|Ô+:8Ò‰j/Ò„Y? $ìHÓÍW&LPjO. „ yóøàQ{û÷ïGÓØ·‡C Èй{ÏjïâÕýp]¸úÆÍ[ J žV¨P!¸_‘»zêÑ£‡Ú̇Ït@! ›ùF¹ ¢Ú‹[ÖL$@$@ D@Ń”A¨ 8µ§Bh Šn­Û²;µwéëÓöºøõP{XVÆV ïL»÷¾T+Mš49~ü¸Að:tÞ[Ôf¾Ù³gcó"ŽñÂc‹YóeÊ” á:"ñÄPíE‚*ë$  Ä"€µZ¨”‚)K©½ï¾û,àaw{ü©ƒÇ/…¨ö._û1­®K×~ÔÕ ÃKKóV©á7`É>|¸ÙÈËìŽ÷‡š9ub âÎ>}:¼OÕ^xy²6  HD›7oÖU+W®µ·k×. ¡Q³fMdhؤu8ÔÞO—¯¥ÍeV{pÿÏ¿Qô¯ðY³fÅy[ ¿¡'8^~øá‡…R:uΜ9ƒ»76ùàÆ%999Œ›ù¨öñä˜I€H€H ¼pÔ@©–,Y²@ê‰ÚÃâ&‚yOBhL½$,jïÊ7?Eÿ‚Ä´S{ˆð†¨¾3æ,zâÉÔÃX×Fø ƒàƒÂƒ7>œç öˆà"ÄE‹5k>¸qA Þ°LÕ^X0²  Hhz† *µ‡eMpËßíéîØuðL¸ÔÞÕoŽæqPí>÷Í©³ßtêÚ+]ºT/-Ý»wǶEÈÕ<Ѩ=Žà¶hÑ¢ßÿÿ>úè£fÍ—#GÐ ñÙ¢Ú  ‹“ @¢€Ó8]¦À)‰R{B®é¡ìKIŸ~~)Œjïëoþú»¨\ßþì^í<{mÛÞ£/W}M˜`õ{ ‚?®Zµ*wîÜ’¶=œçøá‡`í³ÜÌuJÈ5ª½DE9~  ‘B)µ‡[xµ‡èa¨'råÊ… ý†Œ »Ú»öÝ/‘¿~†¬ JíøêÚñ3_/\º.GÎô¤ö>ÿòëc_\í3`Ä=÷¦ê¹V­Z†Aðá|¯6ó5 Ñ­[·âô®åf¾”””`8ª½`‰1? ÀM8:ª‹’!C†(µ‡ aÈ7räHdÈó|ÁŸ_ŒÚûö‡_#tAG†¨öŽž¾ºsÿ‰: š%XòàH¡ä Ñ„á{EòÀñÞêÕ«¡ùæÎ‹³f͇u0º ©öܳbN   #˜š” oË–-¢ööîÝ‹¬,*T@†ÖºGTí}÷ã¯a¿  âöŽœºòÙ©++×oÍ›/Õëvì­X±Â¬ùpV'š…'ÄßÉ“'úé§^½zÁ'‹YóÕ«WÏåf>ª=¾·$@$@$@Þ @s(!›¤ž¨=‡E¥W¯^•KÖ|iµ÷ý¿…ñ‚v ¯ÚChàƒ'.¿ùÖ µ°[»ví}ûöa½Ûúôé“.]:@Ç{_ý5d_åʕ͂G:°i2àf>ª=ïÏ7K’ ègHqöV©==„ƃÞìbÄÕÞO¿ý¦ ª1BjïÓã—v<Ó´eÇ[nx݃ªëÚµ«Yðá˜s£FDÞa1÷­·Þú÷¿ÿ˜pÈbÖ|Xùu¿AµÇ÷”H€H€HÀ#C ,DŠÚS!4D²¼Z£NÔÔÞ?ÿâÉQµwàóK ±jÓ®â%S7ê=ùä“sæÌ1k¾>ø‡yÕ®L\.›7óÁÂê0…T{Ÿo#  À:£25=õÔS8I*jïóÏ?˜÷ž~úid˜0y^ÕÞï?ýâýúñçߣ£öö»¸÷è…q“æe|üI¥ç°~Ö”ÄÁ l¨êyÃÉ<îRíñe$  ˆ¬!*µ× A¥ö$„dîbÉrÇ/¢¬ö~þåwdb”ÕÞž#vv¾E»n·ß~}£ü°´hÑ»ôtɇ¥^ܪZµêÆ×­[·fÍ„!^¶l™rÔ‡»8çKÛ^DqVJ$@$@‰L{Åô=dãÇWjï?þ™=z CñËî;z!Újï×?~ òúù×?ÒJíí:|~Í–}’ª OØíàcY¥ àKÝÐÕÞ„ tøÜ·—Èo"ÇN$@$@‘"€ dJpÜvÛmz¢ö M"„Žè^—)ƒÞLµ÷Û¿s¥­ÚÛyèÜŽCçrå½.ì ä”Ô;|ø°@†=OW{uêÔQðaaužcîÛ‹Ô;ÀzI€H€H ¾ (oÀåË—Wj«ø—_~)!46|t ­ÔÞ¯¿ÿéêúíOèÂ4W{·]7ŒÅ\Èå3%XLñe¡B…p WW{Y³fUj¶@ª½ø~×8:  Hðñ¦»üÅ:£R{BCdÊ3™²ì=r! ÕÞo¿ÿðúÕj¯ç€Ñ †u[%õðÛõðeûöíuµ·`Á}'£©öÒà`“$@$@$ß–,Y¢lxk×®µ·gÏ ü_ÿú×Ë/¿Œ [tHcµ÷ÇŸ¿ÿñ/‡ ZÐ'jOöíuéÒfQ•ÄÍ2–èj¯mÛ¶ ¾~V×î‘ãJn|¿Œ D„€B#gΜü±¨=9.€ð<ðÉŒ”i®öþøã_üi}AúGíɱ\¨:%õĆ÷È# ®öŠ)¢Ôž³ï™{ª½ˆ¼¬”H€H€⛀îà·uëÖJíI …¹ûžûö|vÞjïÏ?ÿõç¿þm¸ ý£ö&N_b=ônØkÞ¼9¾lذ¡®öà{åÿø‡R{0û|Ò¨ö"b   ÿ 'Àú¾±wß}WÔÞŽ;°†‹¬7F†ŠIÕý£öþõ¯ë”Ÿ¯Ô^Ý7Z‚|"¾°JO<ñ¾œ4i’®ö†ªàcë$<-|:©ö"b   ÿ лwo%8`äƒÔµwìØ1äûþûïåÄ舱Ó|¥öjVÒ¿þ}ÝÎç+µ÷t¦, 6sæL%õ€ß@ϽÿþûºÚKJJRð‹+ææÑ¤ÚsC‰yH€H€H€nGz’ªU«¦ÔÞ¥K—iïÞ½ø!4>Ù{ÚojÝû÷¿ÿÏojoùú ß+GÅÆGI={öÄ—åÊ•ûè£tµwÿý÷+øÎ!4Ô„Qíñí%  ‚À… ôeܱcÇ*µ÷ûï¿£¢~ýú!Cî¼v>ï7µ©çCµ—Ükˆ•.]ZI=|(Z´(¾D\]íÍš5K‡ïBƒj/ˆÇšYI€H€H€éÓ§+ÁXgµ÷é§Ÿ"Bh”,YÚuéã7µ“žº|µ’[à…â 6lذS¥#GŽÀÔ‡/W­Z¥«½¦M›*øChPíñµ%  ðB@ß7öâ‹/B‹ˆÚƒ+`T‡#¥€P$ËÖo÷•Úóí™ÜOöƪ7ˆ}øá‡Jí½ýöÛø&Ož<ˆD§«½lÙ²)µ0„Õž—ç›eH€‡@•*U^°J;vøWÚ½{w@ R(è9ñ#¾Ä­€Åõ Øÿ.=Bˆ‚  JsH²ƒ>¶’eç=£ˆ­±û³·†ݺuSjïÇDŸg̘9’ñ±'w>çµçg{c'ͱ̙3+©‡¯¾ú*¾„e]í-]ºT‚ÑI BƒjÏŸ/{E$àO=õ”¾9Æî3²Aû9tZêÒÒóàG|‰[AâRºáÜ¢¹NiÉ< ªKQÈlÙyÏ("Ñaˆï`g$݈ZkÖ¬Ñ_ü(jo×®]èܯԨQàOÄ_j–­.?øÛ{¥zƒÏ“Zº÷Þ{ñåüùóuµ×½{wßM ª½¨½lˆH & ¸T{ò›× æôSí…8ý~V{?üðƒt/¡Ôž¾o !4 õDí8qs­BhÀW°ÔÞï׃§Ù^iKãÁ ã)Z´h‘{øŒo}ôÑíÛ·ëj¯L™2JíAU»¹x&×=+æ$H JíÍž=–$sÂx%DŸåJ.m{îŸ$Kµç“•\_™Ý# 1gÆŒ•à¨_¿¾R{×®]CÍëÖ­Ã]DÛqèœ_ÔÞïBÏ9_i'wÞ’ †`¸Ë*Á·/«W¯nP{²!RÎʸŸJª=÷¬˜“H (µç¼ú‰U<õË×°9ÏÕžû'ÉÏËÐ ¨öpPT_Æ:uª¨=ØŸ$„F‹-!WÞ~Q{¿ýñ«»ë—ßþøù×?~úå÷þý‡Ÿ~ûþÇß¾ûñ×oøõ›ï¹öÝÏ_ûó•o~º|í§K×~¼øõ®þpþÊç.öÒ÷_]úîÌÅï¾¼ðíç¿=}î›Sg¿9yöÚ‰¯®?óõç_~}ì‹«GO_=rêÊg§®>yùà‰ËŸ¿tàóKû]ÜwìâÞ£Zµïb¯¼òŠ®öž}öY|‰_/ºÚ5j”ßM ®äºÿUÜ$@‰HÀ¥Ú]ð¹Ü4Mµçþ‘¢ÚsÏ* 9áûM „ÐÀRQ{Phý?þÀ1&É5{®9ï­OãS¿þñK0Wš¨½ÜÏ.8I>þW‚tÆ7¡Ø$ºÚ{íµ×|—!4¨ö¢ðR°  &à^íaX®•ßÂ.Í{µwþüy¬ËI_S¢Ù’„o¤Š£;Ünª’ÓH.5«4'=Ç¿&[õß¡Q7·l@0†ÔyddvC#Ñl{X:„ÂS‚£råÊJííÙ³RO&bâĉwß}·dÃùƒ-;Žî=raßÑ °føüâ§Ÿ_:xüÒ¡—a肹ëÈé+0}Á3Œa0‰Á0vêÜ70’ÁTƒÙW¿ƒý V4ØÒ.\ùáâÕ/}ý#ll°´]ýöºÉíÚw¿Àü#LqßÿôÌr0ÎÁDéæáвmïƒÇ@ ~õP©= ƒ ×68ø¢«½GyDÁ‡ìêãJnP¸˜™H Q¥ö *ä·°ù˜-¾A28[ÑÕl!†!øÑÒÇŠ®-ðYß5(M£KÍç,˜ Ô UImè˜åd£5"½ ¾t¯¨ ÀÌç`,8ÛÒ°–Ç#²Û\?ª²²€)µáÊ*í®þ²šgDú¯šÏvý‰ƒwfÛ¶mz¨4!óÆo(µ‡S;wîDŒ ì•+Wš5k&¾B°‡¯c×~ÑW{ÐmÞ®h®äöü&åË—ïs-‰ojôù]®bëWotÙ²e–JíÁ2§*ACº­Q·&¢-‘+e1eÄK°ð½‚Rè¿0I9µïãæõ€åÞ½{c÷˜YçU¬X±ÿþjU·Zµjk×®…yj ÛÎŽ=Šøi‚âÝwß}ì±Ç¤’²/%mÚz0Ò+¹Ðj¡_Ñ9¥q{ºtÀzJíM™2ß `Övuµ—#G5p¹ìcFµ,1æ'HžÕžA¢T{æµEhKݦ«=Ë8J—ú`)˜ôÕgKû¥’evµYÚçF•Y5«z‚R{Î(-ëGC:XKͪú`° Æñ¾½%K–èžV”΀ƒ=ÜúâF:tèP»víDÂ3œ†(µÁ·cÇ„PûóÏ?Aø§Ÿ~BÈÛo¿9a¸jÛ±ûžÃ_Ehß¶î…çŠü™ÜɳH† ðß•ä(¬}ºÚƒ ko!4Ô{Dµ—·8H ` DGíÙÙÔÒÒå…n‚²ÜŸ§,[ºZÂÀ-“˜S ÖæÒ˜§“بd@ÿ•v¯öì:lÙ;°–ωZ·µ³¶ÆÓ.–_qÞÓlÏCh ΰu¯téÒº¡R [ý Y®^½*TEFAəᡇǾ=3ì§4pP#¼WD=°ÔoÜ (êÖ­««=ˆ?|9sæL]íõéÓGÍBhÀìì/4ª½`‰1? @BˆŽÚ³;Ö l`º O©=‡»Jé5[ & A¦Ö¹¶ ŽîJͪQ»IJBªwýÚS®pìΗ Zg°–ûõRñ­ö°EO“¡ä¬qÍ›7Ç~2³ÔSߤ¤¤<óÌ3R¤H‘"ï½÷ž¨=)E:|ø°ZãÆdÏž]r¾P´ÄªŸ„ëL.”Y$®ÈùÛ{æÙ¬€0yòd,|K‚Ýß@Ïaû£®öÊ•+§¦#¨´í%ÄŸ+’HÀ3(¨=g¥eVcnÖ ÕV<ÝveLЂÊ#Î,“¥‰QíÛsðùb‡ÝÄ´Sœº ´D¡–q¡ÉìF©áÖÎZiGÞÍŒx~£\= 2Ì&=„êÂú¬ƒÎÓo¼T‚eÇ:uêlذAÔVu‘à=ø÷ß—qÁQð=÷Ü#Í5nÖf×§'CôÀM¹+Þ•WoÚ…±CI8p@©½öíÛãK,æÔžòhƒ»A…Рڋò{ÄæH€bŒ@Ôž%É`Sà”¶°Üf'Ù,×ÍjÏpàÃü7ÞðnÓRj/ØU:ܳÚÓú‘.µжøV{Ø–)S&3±'žxbÁ‚X~•ôÕW_á°í÷ßöìYõ¥ùÃgŸ}C ÔÒ³gO¥öà¢$Ï;'Q7Q·Q£F’óž{ï2b¼g{×î"¢Wbitï“êT¾TTzþùçAcìØ±ºÚƒñOŸ BhPíûkŠùI€‹@°jÏ.¿Ã) ª=7”û•\ª=7<õ<eË–5ë<ÄlÅi\]ÉÁžœ·@„Äu|¸Ÿ,XÏ•š³fÍŠk°íAí!áœ)¤ ¤žÔ†båÉ/G®<‹–­Þ»2,Gü {ä´B…KΠAƒ”Ô|ƒS/X×Õžîê(ØT{Á¾ÌO$X‚R{ÎÞ•ñÜ ìD—xV{悵í¡+¹ê–îXÄÿ¶=¬b»”ÙhjwØ"þl{°Á‹‡¥Ú‡m•˜Ãf>åKEÿ€5ÙK—.9k>5xôÑG¥•R¥JÁˆ(j H¡r~üñG©ÛþätRÍÚõwì;æ>–tXt®0ÆÉÝyðŒ8ÕÃb7¬¡’äå…‡B(`]í©ßE¸l ª½Äú»ÅÑ’ K (µ§þóm>?á`ÛsØ·§Ž—êŠ0à‚#ƨz¢+Bç}{Á’ñ¬öЛ}{žOi¨}{Á†q 6ÎÔ"›éДæƒÝ Vl%á!TjÌî!ùù矑M18yò$Ì„j3–n± PÔ"À“‹læÃ9Ó.]ºˆJ—}Žœ†àiQ¼Â¨öÞš’‚ab]I=|(_¾<¾Äñ[]íɹ •pb:ØVòóL®7n,E$çÜ«=œxP™Í:ÃYíÙtPn{õsJs8¸>±<ôê|&×á°N¹Š,,¶=]íÙ5*VRŒBÑýJ®²k:ðÁ@ÔŽ´í¯î¤Wiˆ‡zN}•VÃμo¿ýVv×Lÿþ÷¿±ŸE4,U³&Ía3Ÿš¨=$S¸xñ¢4‡C?}âɧ¼·Ò!N.äW”/Äç½tíÇ‹_ÿxáêˆÛ‹è½ˆáûÕ¥ïÎ\ü!}!Oa’Óã䢟ªƒ47heÏûö”5Q¢3ØÌ:¶¢–-[ÂgÐR8º1mÚ4h&—Ý…påÊ•P!vúlÅŠ8‡á²6dÃI[˜¯Ԟ܂RZ§D‰ØÛ';ù$a\pû"öïß_¼´¤»ãŽäî} ºÒêrã]yƼë1p$EÙñ%)ë_®^½ZŸVÏ!4ÔÔPí¹J™“H€H€üB`ôèё̊/Ž5AKE…C räbÁ‚Î* ² ›çp™Ôö–!¡¥»o)¨LhÍwß}7 Ú“ j"Äkƒ d3ŸJ°SÊf>,c«Ÿ@@ø™óAx¥É0–FóÖ®["«VÕ"!4/^,Þg$uï~ÝK‹¤PBhPíùåue?H€H€H (°u!ĪYçae§( ~$a" {Ý`T_ž9sF¹°SiˆÙ Y&[ô ¨(3|#!"tI…g£ðÌç¬ù°¬6óAòÂÕŸ®ù@@V“ Ž0E-Ý{ß}†Œ‚‹æuêì7'Ï^;ñÕµãg¾þü˯}qõèé«GN]éÝÿz` íônˈ@I<øH;v¬’z!†Ð Úsù~1 ¤1Mµ €wÄ=X±•·vvQÎÔચOŠ`{Ü| š Š g T…ø`etXÛUù±—néÒ¥R•èHØü`ÊÒ+D~»_ØaAÔ3>CƒöíÛWv+"€,¢Ê¢r}T:†ñ¥—^Í”9ËsóÞ]µËRí½Xúº×lÈSƱb|=Y û¨J¯¼òŠR{!†Ð ÚKãW—Í“ @@ð#GóÒíÃ?<}út%† Þ\zÑ“e3Ÿ*ÿÉXo…©Ï¥,3t[ü'«²XZÅöAØù`íƒ>SßëkÁv‡•eb͇úßxã a‚hð2£ >l‰Sžù6mÚ”5ëõ­rHEн¸~óŽ“_]‹Îe°íí?rVÌPxª·r¾˜NO8´«f³ð!q“grÝPb  ˆ*,k®cÖywÜqT—_~©ë! ìŠss0Vű¤h'ª°ðjg³¤•¦ËGT 3›.F¡á,#mXÖ†EÞo¿ýÖAðáÖ–-[Š)"|ž{î¹™3gB­ª?/Ê3"Ĩkõßh¶÷ðiH±(\úJî¤é ÐO¬Ûê”à¿ð· ¥JrnC%)ÃòØQí…#+!  ð@|0xÓ•¨†„¸Ð10}Ä™¹@`†€* õÃdˆüø×\•|ƒ%]Æ=yò¤Ë!aö<»ÚÐ=„úPòËM³8’bW¡ú~îܹj»R¥JØz¨Ë)Ô•‰æ D;tè ÖµtéîèÞ{ ¤X.µo¯F­zhKϪ{Û·oÇb4¾„UŸURfKÜ‚Y× +7y¨öÜPb  ˆ””Ë-zp/»Jå`冡ŸÔ7XT[å‚C–É.=ˆ3d³“SPrä" Jƒ"„.” Ôžlæûðá59B™ÁN‰Ì0wT{ÈðÕW_uëÖM…\kÕª¶ÁéG\ae”€0—¾üòË" â©)3BEú’SzNš4IuläÈ‘b•Doõ¤–žq7ô 5Õ^4Þ^¶A$@$@Îð'áPÍö<@{çwtÝ£NN¨#rjæ:Qip°‚åN½EXË %åäÚÒ+„À‚E Ô÷È/ªK¬€f•¦dZÄ9¨.U2ËʺÅv:…hîš-Q JeÂÛ01uu ë þ`>„×b¡‡}oÐRºàƒÆf>9Œ&”g¾ÂE_\óþ6²ˆ^«7nC¯àEYïÒ«¯¾Š/Ûµkÿ2*!6‰þ`šÂõÖPí…‹$ë!  / Òì uêÔ * BG–9.-Ž\`—›Êƒƒ ºJƒðRß`­NõTf¸kQ^ô¤ëø_ª PQ0Ú‰JSñ» ü>úè#‘•e8ä¡òCá©-zräߨ»PZbY4óP.a¡„TEðêcDÂý{ógŒ._¾|"˜ éÐsݳ 'ü¼È0!=Õf¾º š~¼ë³£0ÂEæjß¹'úƒø¿zgä(ƬY³ÀD%=„L¼^&›2T{a„ɪH€H€H M*>˜ÁªW®\9˜‚d™¡øØƒ”QùáHE¢\@])YvâÄ ]–ýôÓO–''ð%nYª4X±ÃL|)C0YÊ2CÇ * ZSù[†û(QØ ÅÕ3ºŠ¥^q%# #2ø4 ÓRü¡{j5¼fÍš0Lê2Kmæ|D§•Í|·§»£}çûž=rúJدçóBƒ RÝ€ Å7÷ß?\Xë©páÂê1¨W¯^OR ¬T{ñ> D€¶Ä!ªyé;·pË,3tʬҠ!},e™îÜØrpâ?YuCWi"Ët¥/zf££^-î"*‚`pÂ, OÌ€°Jê£vðˆ[º5k>èZËP›ùÚ·o¯ >|Ö7óU©REf»ëƽ=ó³SWÂxíØB*×EgãÆñMõêÕa"U kä܆$<a|è¨ö“U‘ @`0/+V̬ó°EoøðáÐ1zr8ra§Ò°4¬jÀ^7½6˵`‡C¥¡ˆªáøñãP-X\Vß`Ù7 KgU?Ìi0ש²pƒu[È>T«w¿€bTö,X~Dý8¨+œ!¬£Bwb ) Pj3_$gÞ|…Þ[±ùðÉ+a¹†™„:±¬¬7Ãør̘1pm­¦^=°8¢o`ÀC-Ÿ¶9¨ö\‚b6  ,Ýšu¾iÓ¦ ,Rfùby䮲E§wíd¢¢¹ñÒ¢êÇÉ ,ÝêòN¯ßc¿]PP Ò°Vk×=hÁ€dôæ{5ßÊ•+³gÏ.Ì!éà\F^XŒ†œ•:.\˜!CÉY½fݶ:|òrˆWÒ+5P[‹-T£°bâØ± ¯*)aŠ»p%ˆÃÎ*Áꔪ6ÏÕ^PO)3“ €w0Œ™¥^‰%p*ÓN²,[¶LÖ:e—›]ÛúV´â öäÈ…•¦¼«à|®e…ø^Ž\ N®(¨¡ÕÄ(nYžÿu5V™î¾ùæ›j3_ݺu±lª‡¯€µ[Ñ li}úôÁùYL6óµíØcÏ᯸ìùB%¨ :R5׫W/|óâ‹/b¤zzàԳѿ]í©Ï8§ Ù” tT{nžOæ!  0@ ,]í=õÔSJøû휠Eä`,v¹aýÑÜu 2'OõÚ°÷:63õ%”¥ì–ƒ±Si"Ë'<°Ôˆqª¸^¾W§}!ÔĨré,þ\ìÆ Eë0LÃÀÕ¨!:!¼~{õZ¶l)ür-99Ù² ‡‹•g>(BÉù`†‡‡~çàñK®is– È8½¡¢E‹âKø„Û•àŠO0ÀÜRí©/±@ï¼QÒÀŠj/ o/«   7 j¯råÊØžåF© ¼ «Ã°*ÊäD›¥,Ó·èaw¤˜jÎçDW!Tš.Ë ä`6Óu¶èa)V6ó©ï±³šUú)i¶t[y@Ì–#÷œ…«?ýüRPW³VÑ \:«&p&C ‡Ø­û¢JzÌ™3;K=¹ ñªÖ >{T{1 „‡€®öþö·¿á¯>ô„KÓDŒ®ÒdIT›Y–Yîî—]nJ A.àà§®Ò”,ƒzƒ†3È2ÃÉ ;•­†#·Â C§ÊfY†ž(](žùTs0¸%Žc0L}¨C5jVÑŨŒÚ0LKñŸ/™2eÍcZÑ5Žw@5J£úf¾²/%½¿õÓŸ_ty=ólVÔEdU9Ä¥¨L]êá3‚¤)Û^ë֭ݨ=ÉáëÆÈGµž˜µ @@ºÚË’%‹ì$Ã_z81†}ËeÂæ-Qi²gÒJ/¨œÛu.ë`RE:$‚L’xQÖ+ÄZ°ÝF1è?4§2C–)•¯Ëj‘² &L• ­\:KWá™áàT6èٳٓt4“Ø1|@Ð;iöˆ&ôaZ²:tèwÞ‰)€ë“:uêÀ­Œ²+ÅrÜ"ÞòÄ&‡Ó²M[vÜñé—û]t¾VoÚ%5ëÕ"Ò1¾„3m8‚V ÃÑ—qaös¯öÄÈéìüìQí|7™H€H€ÂC@W{9sæ„I [÷ð—þA + òƒJ3T‚`rÓQñÌó•´•9‡ó¡nd™¡ ;•Yá¢Ë2´hçÒYÕi£p-ß$Íœ9§hu8£6 Ó)L˜5±…Í|8¡ >|Æf>¡ íx3ç=÷ 9qßÑ W÷>CÅp¨W(G1`á[¯¥Ž¯/øJB„ ¤žÊ¬Œ‘–Õž›÷‚yH€H€H  jVŸ5kÖ@öáÏ<ŒLøQ)°€jϪ˦Au ÎPìBO,#m¸4¢?YæÆ‹žTŽvaTÓQÀª$$)„©n#4DÚ°ì ºÉÐr¼¨YO Á»5,ˆºDƒóˆ`©ûUÎç²çž¹`åÞ£,¯â%Ë¢¶Î;«ª`ˆ•‰†=éÎ_yåoj¥Õ^P¯3“ €wfµƒ™2 >Øà6$üÙ6áxlà ¸¨'½ÇÖ4tšÌ®!XÔ ±Ü;ûÀ«¨UË„UQu²Ä%>H4øó³«»ñ‚£ØÜ†%igª²ŠnRªT)ÌÅ6-˜:µ×Ç{LÔa±ˮظcÏ‘óúµmÿé[nÄdʶª£Y³fø¦Zµjp¹§ÒòåËeX\.{V{‚jÏåSÇl$@$@$*Kµ'‘RË—//ï±¢P—˜U „‘D›Å.7Ôæ ÒàªWÖFaÁ}`™ä˜íܹsª4ur°«MÄ(öáéG.ìh¢ó8i‹8ˆQ˜ú,ÏÿÚÕ‰Q`Ÿ\@ cg¿~ýÔf>è3ìDÔ5¼á¨Ø!¡aW¯QËÍ;Žîþì¼\c'ÍÅ÷X¦×ËæÊ• _2]•°wPI=l Äê|(je-å>Õ^¨¯.Ë“ €Kj!.j×®-øq&–­€ÒÄœ‹§ØÙ]…† K ½’H²ÛÆp UÕ‰€UQÙÌ' Æ3Øêä`¬JS²LNN`‹›Þ%]³¢-u²»‚!Š:/çEl{"F-‡i5ô¥œöp£’ØÌ œÌvÚAŸAYê ›EOc]X9O¹ûžû’{ Ùuø<®Wª×AÙ† ªR.‚Ž«”””¤Ô^¾|ùB”zrhÃ|J—jÏåÊl$@$@$*gµÁ‡øiò·Ç6!A°tl‚þ@=¢Ò”ÿd‘eï¼óŽˆqÕ& :ÚK­ŠâDD¡º‹ýjXÐhPie¢,afÃB­ÞOÔ•“ PÐ|ê²)‡,X5ЄÇ`¬{ŠyBQQ ªB?Ñ[õ%öÃ9»‰F~˜9eÔÆ¢zÚ™-VØ!¿d:`–Ã`uÁ¿}°2 Àʯä|:S–‰Ó=áa|?~¼*“!¾)T¨ÐªÿL*ÂîöèÑ#tµ'nY l©öB}uYžH€H€\¨ö ð'_t\ñÁóœ®oÜ+?]¥aÑPYËpÈÀ Ë ^ôd ²ËMåD_eKƒJS² b ÊÒ Ë †%èH;•6þ|,+£9èKøœM‰}lY¦‹Qñù¢:†ž¨‚ø ó‰¨ËÖ°ÕYŽÚ0LK¼3fÌP‚ v8tCV ­¨•S¨8åÃÓwÛm·é9e¥¾]»vÐ*A×*Ã> ¡á^ búôg’jÏåÊl$@$@$*7j;½&L˜ ÂphZ¡ìT Rifkêt>aVi8š*Q.ÔZ°ƒ,32«4¬lJ=°ç‰‰Î,˰CÎRŒ¢ç:F–=‹¨'K ‰ #e-}Öá˜Gm¦&6óuïÞghDÃÁìªË8|Æ¢¹ò 8|øpxrANÈ;= âK±˜®’ŠÏ†[O<ñ„{10'Ì·º;ª½P_]–'  —\ª=>ìîBĈˆ È èؼ%DÎ…,SeeUÔe‡ÅŠ*+Q.à&×ôÎHDµ€uB¥Áü¦ ¢QiÀY¦W¨Ö‚ê”ebU ee «·Þ×å¨ Ã´ä /Ö•*USÜ£>:räH9^# FYl[-1úôé£îŽ7NJÁ4¨§lÙ²)ÛDd@ Tì¼Tô¨ö>œÌ@$@$@á!`ˆ“Û¡Cx`M v ˆ9ʼnMiØ»¦vƒµmÛËŽÞÔž¡*×u€›Éf>ËÖq½v”¶ * *Ê ËÜ„“ª”eNú&{±¢Škzoõµ`‡ñb˜P™Î±,ž={v‘hØÕ‡3˺æÃf>k¬üB£ÃÇŠºõúë¯#ýúõq^D¥yóæé˸ø1(103Ä´’àT{nžsæ!  0€A• ìÔÖ%[´h!™áƒjk‘!j>1§9Œµªìr3´­&~û\Ò‘“07ÚW~pY'¬íjp4vYd³¦¡þ±cǪÍ|â?O×| üî»ïêßÀª‡D)˜lUjÕª•z Ò¥KP½yÈ öRíõ 03 „D wïÞºÚÃgÈKÛž¨=˜‹°L¶ñá€o…êòœ°É )Ùå¶wïÞ`ƒ jzÓ8f!»î oª4ˆB99víú/b&4˜Ùö -¢],àÚÕ†Ó²A b:Ø¡{ª!x‡éÔ©“ÚÌé3­eB1wðá‡ؤ( ¾råÊ©'!”*ðìÙ³Âj/à³Ä $@$@$NfÁ§vôë+¹JíAðA(H˜ˆ‡d14”)* ÊOƺO²ËMµŽÅ\8+‘ sv*Md™:H¡÷kÄHêh8Ž‘½wXt¶‹ü -ˆ¶¤Q¸M¶CvE_b˜8¸àœôÌ–-›”E\]T%F¾Ð“®ÒГ€¶4#h X¼T7 ¹”§eH1•YùØÃ]ƒ,ÓÝ…5ns0’ÁÉ‹Þ4~”¸È€l:Ù¢gÐÄæûï¿/&C ÓÌß(?Òp˜8ªN=¶/V™1ÐÜ–j¯xñâj~+T¨àA½[ý¤Ú‹ì{ËÚI€H€H Xæ`8·5ã¬ö –<o½Ðð÷‹}á2òAÖè*ÍCÈ5è!Ý2o|²L AvøðaårÖ,Ë ƒ‚šö•[š8@ÆùN—eèƒò¢'ÕÄ(ÜDËžEhDµgyðYd%î"ê¤~X »8üEaµ÷üC©½aÆ+Ý<ä§Ú öd~  ˆ³ïelö1b„ƒmOÔÖ7{ì19ºÿ,0Œ‰ Ð =)•õéþÈ… ƒJ“ÕXIX¹VQ.pŸñº‹d™Ùdˆ¡©üX`U'KÄ‹~„yO2§w´¥#Âgl°“=‹Íê3¾WJÜéjøJ„lµ‡wÝp‹š=¨·`‹p%7o,Û   ÌžY 7n¬ŸÉÕWr•Úƒ ƒíí7ÞaÓ¾XUEºÚ3¨4œ?ê`,º…{˜ê önÙ²ÿº”e’–* âL—e¨Ù»A7À ŽØóð/>ã餮DQ ª+¼0"T{Ø…©Ô^DCh芪”+¹^@!  h€­KÅÆU*ßàˆƒx`±S{XE‚PÅoÅq]û5(­PÄô™¬–Â/ÊAmæCß V7½'‚yèFAñx¬*ÄêjPdä4±*-‹=øW}£%¼Ö‘]ª½ 2¨yìÔ©S°V:où1éT{Ñx]Ù x&€­x†sÏ<ó̪U«ª=œ÷Djß¾=Î~ÊÂîàÁƒÑ ¨ˆ3¨BOpS§¶ÜéG.ì«´¢ ]ëPîƒy` [8HkW”(vÑ™\8LÀž;wÎ\!–¡ÕB0Ú…²†I—joÒ¤IúÝx ÊM4"˜YòÇ1^˜K¥ÿˆ£¨G?,‚õk áƒ0Xµ‡sÖ÷ÝwŸš¾(„Ј¹T{ÞÞ8–"  4 }fv¿ {ÉåFí;v 'v[µj%fÂ;ï¼sôèÑ´dMè =Ĺ ]¥a%Q¬eÐ[PŸzÐyêL«Ð„®Ò{¢‚y ,:/yâVšY•¦êDY¥ Åx©nÁ²•&guQ•¨ùCý† Jé[ô°ÿK·ÐÜÁª=ØesåÊeéQ¡!jO€Ð¶—¯+›$  o DjÔ¨aPopíжÁ„@±HpR¤H©ò Ƭ´BQ~³& OÔ•ã€Þ²”e*mÑ¢Eʯ›.Ë 8U'Ô$4¥j†.µL ÇxøLÄ쇣Û*§®D¡ù þö`eµ‡Ì­[·Æz´óJ.Ì“U«VÕ㤠óœ9sF!„¤ ª=o¯K‘ @š€@1lテ(Q¢„¬wðÀb¹’«Ôd Ò›o¾yï½÷Šþ@¬BiÉhX<Å`™ê K¯ÐÙ‹ž0uPiY†š¼èImã%|#Ë2±$t]µ3⸜Zc%ZÔ|¬T¯^] Áý¡ƒÚkÙ²å?ÿùOƒ.Çp¼‚Rž÷áUöHª½4{KÙ0 „Hg/räÈa÷ÜsÏ´iÓ\ª=ì`ÃŽ7l S±iÓ¦²™OVTÞ ¨ìœ[Òͧº§-8•¢÷ʼì@U4ŸJ¨ ¢žSàEE}©oÄ1ò@*µ‡ÃÑ·Ýv›ÒÇv¶=Èè'žx¬óp2ãí·ßJ®…’kèŠ6m{!¾n,N$@$@iCâÉìœ"~•±ÃÌ|JÃ`ÛƒÚ15ÍW_}UÔ‰„߀’Õð >ƒps0VÑ”Ívv}€Õ  =T,<çYV¨‘bREíA¥=ýôÓ‚›ðf̘ayJG’ÍþQpà]/:«·J ê{©ö‚zN˜™H€H€üEK¥æ³ºÙ³g‡ëcÙ\;µo#HÈ_ºti48ÀÏ|P“°®…QóÉ¡Wº'pÎv8œ5Ɔ?d¶S{¨µá„Š.kêĆEó°Òm¨P7b¼° b¤¸¶Ú[±b…pˆV¨¢ü¤`÷ÛÔ©S¡Ò ¢ìTdŒgrr}ÓÕ»€Êg \ßAÃÙqŒK΋À·‹^¡~(ýÁ"8ä ¨=ÈÍ&Mšˆ€Ã¿5‚ÔòLnÿþýïºë.óÒ-Nc ]Z-Ä"°zVÌ©ö‚}§˜ŸH€H€üHÖ8óÑ^xJÈNía1×2aóß³Ï>+òÞ˜©"Œš®ì` “•¦d!ìj'ÊÌ =¡Þäü/Š`¢abt—ÎhM«:õ-z¡@e¬ÔÞ!C° RÀ䉲ú™\åošwO¢Ž¿Œ3&DÑæ­8€üÚ€ ÕžßXö‰H€H€<€åIÆU¦&DÝ@ð4³mONæ:$xãSÞ˜á¨ÞO¨ù°`*ö6&˜Ó Ë”wY…ÝN—zfïÊøFÏi(&C(¿³gÏ¢ŸâÒY¾DChNåÇî=eúÂg¬Ãü)«ÞP{8® †Bï¹çžƒ•Q?“«l{pƒƒÌf{7»@wzÓj!–ÂX,¨4ñW +£®ót œC._¾ É([ôP-*Wuêë›ð®¨'œn†Ä`œC@[,1ëgr•ÚÃÀ}ôQ3X¸\‰Zx ;ûßO?ýdŠjÏó«Ä‚$@$@$à_0’Yù ÚàO8(µ§2ck ÚÏ5 …$þùt[ˆÖ> w†tA‘•Í|*A8Â¥³úѼEúU%D6{ì±ÇDÀ*T[ôô3¹ÊßÞÂ… ÍaëPÞUzôèâ lèűöí@Œj/¨Ç‰™I€H€H –À?‹y'4JÉ’%á1NNo›°HZ¸paeß‚¦Ä65h>H.äBO°b›ù܃–ƒ´æ¦¡óÔ=|ÆZ' «+ ä ‚AuKy`ÚÆBŒÑÒ» |S§Õ=] :K=`¤Úsÿ,1' ĘÊà0Ù|\ —]»vÅo ÞOªT©¢ª… (KÐ ]óa™U®P‘^í¸ãLö#B¨Á§Aí)‡Ø¢'Nj4h ¸>ÖïªÏØ·Dwß}·yé~jÖ¯_ºM.Ä _qÀ%àCIµ3 @Ì€¤³\ˆÄéŋ뇂úŒ“ -Z´P[ú䇸e†-ͳ F¹X·nåŽ4|‰[j‹Ѝæ [ô`±ƒnS {•€Cœ«ÐïªÏ3gÎ|æ™gÌ:/ÊÐä B»\ò¦Ú‹ù˜   — Åî¸ã³‚©^½:D‚­yKPH½zõRîZ°¥KŸ8¾*Ë»}ÞÒ•+Wà„YôÜÝ©íwø€ñ¥xiF6U¿®óp@ÊK±*aX ¸Ü¹sã\…~W}†Ñ®L™2fJiÍNíAê98”6<T{._f#  x `wz˚͛7‡D3V êG¸†?g¥“°e;ÔIoš²GŒÅиާ-ø·ô:ÕÒ-4ná ­J8{¡âÂ!ÚðáÃõ»ê3Ü&#f† ÙI=¸P¶ô«g÷€RíÅëË1 @PìNo`M¶sçÎ8ôJÂ+Žë>øàƒJöÁ1ÄY(¦>†Í|*l†¥Î„K—.Áò§£('ÐðžA}†´Ü¢—VÐ줶*%õÀ„j/¨·ƒ™I€H€H NØÞ€DƒPƒ•.Á'eáܤråÊê$Vxg;Eö›°G §+ðA•Õ»Ö”q\C¥¡C‡Â’'¢®q²D¿«>ã”q®\¹ÌK·iÍNêÁPjŒð‰¤Ú ˆˆH€H€H n @=@™…¾A1˜Ót×tÞ>cyétG0ø !—xÞdŸH=]ç!*Vœ± ­’.à²fÍ:yòdý®ú¼aÜ,6?m ÙI=ø¦ñö RíyãÆR$@$@$?`o³Œú T¢D 8ÖÝÔyþ ÿvU«V•’pLÑ)p–"XÙ§{WÁ&6J•°ŽŒC'R?Vfá]E¿«ög4K©‡¸.ßZ>”T{ñó®r$$@$@$ ¸¶ôÒÙT©R¥7Z:¥óðå!CŠ/®[Ô`íÃV?9Æëœô^½z›ðô¤¶è½þúë8œaÈ ?Ž9Ò·ÐÌjïܹsÎñ‚N:Õ^@DÌ@$@$@ D`É’%ˆ„k^Ü„~‚w:l}ɰ$xԃ샯ÝÚ—>}zxoÁ‘˜²Ì²OMœíátjP  yäé6\éßUŸñ=îZzWñC4³Ôƒ¢ ýá£Ú !k   x#€V/Ëý|ÐgØÁ§*™0a¤¤~ŒMcqÛûΟ?¯oÑÃqT¬üÂ; Jˆ¥¡"¹Aðáh­~W}†N­U«–Ÿ ¤œÈ¸‰“áæÉ£ÚsC‰yH€H€H áàÐnïÞ½-½1CŠåɓ롖Q(Bù=ZµjebQ¬X1ЇæÃ=,7«„-z5kÖwÛm·!ª‡~WÿÜ®]»»îºË,^açƒæ×E¢8B½…¸z«?¯T{ ÷örÀ$@$@$àžíbG9Ì®('¬ùöéÓÇ2"Eˆ_" bÔBçIC8ŒÕØMZ«p+V\¾|¹~W}?~|æÌ™Í:Ï?Ð bñÌ™3–‘âÜO™9'Õ^(ôX–H€H€‚4_rr2æY®íâèkûöíaKÛ$Ë»ï¾û.މH7nܳÏ>+=Aœ_„PS·ôØ¢g8 "E \qPËÁ‘°É…Rç©S§Ä+MØ)ª½°#e…$@$@$ŸàïÍa?[à€ŽÁZ%óü¥¸G†Úƒo<$"“Þý÷ß³¢|iHØ¢W»vmÿ@Ó¥!ôôï¿ÿ¡ç†j/B`Y- Ä-éÓ§ëÞ’uƒ4V… pBÖ2:™‡/EíÁP‡]zH8 ‚ÿùÏb¿|cHØk!h¶Aú-š’zð¥‡( }V¨ö"Š—•“ @Ü€™Mí«3«+¨´æÍ›¯^½zGhIÔÞÂjˆ4sæL1ìÉzÂÁ^Äÿ0÷І Êk„ÊBç}ûí·‘Xº5G$˜EíÉ’°Î[¾|y³Îóg4hG.þþûï£0;ÒÕ^ÔP³!  ˆ[p‡M{·Þz«å1|‰“uêÔ‰n{IÔÞ¼yó°iÚ´i¢öäG¤Æÿãÿ0·[ªT)8Û‹YÎsµQÖyT{qûÊq`$@$@$&pŒþí¶ô‰ Ëš5+œ§@‡Á(è&‰Ú›;w.6ê!M:?Þwß}øŒSp¤bÖyO<ñL€žY„ ž={6\Þ’ƒ\Úö‚%Æü$@$@$@@Æ9›úà ¹J•*p†÷I $joΜ9ð¨‡4eÊüxÏ=÷äʕˬóÒ¥Kç·hØœwåʸªNdžj/ á³i  ˆgnL}}Ør7xðà­6IÔÞìÙ³—ÞHo¾ù&~üÿïÿ™¥^ýúõŠ-B–¹`«…ó¼K—.¥•1ÏðTQíÅókƱ‘ €9r¤iÓ¦vΙE·Aö•,Y‹³ƒñ±–DíÁñ Ž£XïÌ:ÏWÐà9'0¢pÒÖýÌRí¹gÅœ$@$@$@Þ `5ÛéòçÏow’C¾‡Ç¾Â… wëÖ ÞU úDíõìÙóé§Ÿ6ôI4œ½¸|ù2D^ƒÛzm*IµF˜¬ŠH€H€H 0˜ú{×ù0‡;È>Kcn¥y4lÈÃZíwß}÷Çsšæ ÚKSülœH€H€˜dvìåÈ‘ÃÙÚg¾‹ppäì^ºóc+Þùóç¡ðàù×_¡y£Ú‹¡ÉbWI€H€H > À]\·8DæP‚/jÐ ì.^¼xíÚ5„5ûùçŸ}µ/؇€j/XbÌO$@$@$)8Æ‹½}Îñßÿý?“^úôéq+R Çu½T{q=½ Ä&Šû>ùäKÕ«¿†“¼°ù%''CÆæPÒ¾×T{i?ì €@RÒÀ|ù:œ?ÿ5É„N€j/t†¬H€H€H ̨ö”j/Œ0Y @xPí…‡ãZ¨ö“U‘ „‡Õ^x8Rí…‘#«"  #ª½0¤m/Œ0Y @xPí…‡#m{aäȪH€H€H€ÂH€j/Œ0iÛ #LVE$@$@$T{ááHÛ^9²*   0 Ú #LÚö“U‘ „‡Õ^x8Ò¶FެŠH€H€H Œ¨ö“¶½0ÂdU$@$@$@á!@µŽ´í…‘#«"  #ª½0¤m/Œ0Y @xPí…‡#m{aäȪH€H€H€ÂH€j/Œ0iÛ #LVE$@$@$T{ááHÛ^9²*   0 Ú #LÚö“U‘ „‡Õ^x8Ò¶FެŠH€H€H Œ¨ö“¶½0ÂdU$@$@$@á!@µŽ´í…‘#«"  #ª½0¤m/Œ0Y @xPí…‡#m{aäȪH€H€H€ÂH€j/Œ0iÛ #LVE$@$@$T{ááHÛ^9²*   0 Ú #LÚö“U‘ „‡Õ^x8Ò¶FެŠH€H€H Œ¨ö“¶½0ÂdU$@$@$@á!@µŽ´í…‘#«"  #ª½0¤m/Œ0Y @xPí…‡#m{aäȪH€H€H€ÂH€j/Œ0iÛ #LVE$@$@$T{ááHÛ^9²*   0 Ú #LÚö“U‘ „‡Õ^x8Ò¶FެŠH€H€H Œ¨ö“¶½0ÂdU$@$@$@á!@µŽ´í…‘#«"  #ª½0¤m/Œ0Y @xPí…‡#m{aäȪH€H€H€ÂH€j/Œ0iÛ #LVE$@$@$T{ááHÛ^9²*   0 Ú #LÚö“U‘ „‡Õ^x8Ò¶FެŠH€H€H Œ¨ö“¶½0ÂdU$@$@$@á!@µŽ´í…‘#«"  #ª½0¤m/Œ0Y @xPí…‡#m{aäȪH€H€H€ÂH€j/Œ0iÛ #LVE$@$@$T{ááHÛ^9²*   0 Ú #LÚö“U‘ „‡Õ^x8z¶í­Y³&99¹X±b·Þzë1‘ D†@þüù›6mš’’Šø ζwúôé²eËFf8¬•H€H€H€HÀš@¦L™¶mÛæMó¡ö¦OŸNcŸA   H+ƒö øÜª½%K–¤ÕÀØ. €èÝ»w°‚Ï•ÚÃF=ƒUïÿKwwö—–i7ž @„ä­ÚæŽô”n°¾ÀjïÂ… éÓ§×›ÉTôåÚonh8i;/    HÈórsƒàÛ¼y³{ _`µ×¶m[½ÌÅ^n:u/    ¨ÒjF‰ŠƒòìTêÕÕ»-B+ÅôÔõXŽ9¦ööíÛ§Wýx®¢­¦ïäE$@$@$@$ -§l/SuD¾|ô«r£Ih«ðkítU6zôh—‚/€m/))IÕû?»¥ñ¸µífíâE$@$@$@$ 뎇Î+Y²ÇúõûΟÿ:%å‘}ÕÚÎDs÷>ò´fØh÷Ë/¿¸|NjïÈ‘#º„,ñz‡Îsöð"   ˆz½CØ.Üå‹/.)Ù‡/ ìÔ|ôÆzçéÚlâĉ¡ª=}ÇÞmwÞÝeÖöî){y‘ „@×9»‹”èa·råNƒ†ëÑc6¾¯XóM4úLžâJð¹Ü½gkÛƒmP÷ºR¬jÓ> ÷ó"   ˆ&ý–BÒÕ®=Òl®»zõ{üp·ëômõzOÑÍ{8bмg«ö`ÔëJžúþ€÷ð"0hØoj©š­‚º*¾ÑÕ%Æ^s·IÍhÅef#"Ð|XŠ<᯶ÔvÜòê9»J‘ P¶ÊKÞˆ¹~ýæãn­ÖÓÑô=£D¢èzW{úùŒgr¾0tÉA^$@fejµÖ½{Ægs™ë韲U¾o=bTn¾•PsQ·ëØNV&Ôce°ž§ô=ÆfÍÿb“þÓbeìì' „—@ïÛäpÆo¿ýa©Þöì9 ÅK÷F»tVz2fÌèQía÷Î;ïT½Ú¬×¨å‡x‘ ˜ ”¯Ý&Xµ÷Xæ\†z^nÒýÞ5ß~ÔB©­$&ü>37?WàEŠÄ$àÛQ‡25xÔÕ[ƒ'_.õM­öC|;jvŒ"G Qò<ˆ9ìÏsnåË÷Ažž“>ì1eþ§çôéÓ΂Ïz%šõZÌþ`ìÊüH€Ì*ÔIU{øs…Ïn®ªM{ê‘?ugÎeø¾Ó›©jÕ&&|…(“€oGíyjJ¼\_þ¾à±¯Ýaˆ ª·Z žáÛ³c$!•ª ‡’Ãñ[Ý6tè"äiÔyúp×ý”T èxÏZí!பâ±LÙ'®ùŒ €%ÊuÛÊËòd–\žÝ—áºÚ3×Ðuì»R9Zñ\yLTx"¦÷65Cæ~ O;þ5Ïiæ=äÏQ°düãˆHÀ™@ÁB¡ä¾ÿþgµ·eËAä©Zw,ª*PªŠ’jØ}çŶW¶lYUE¹ê§¬;Ê‹HÀ’@•z©žÍŸÊšÛ3¢ûoüý3×Ðsü{ò&¢Ï•ÇtA…(bz ñ×yoSSæÕòHãƒ%yðoüãˆHÀÀÐ[!ã’’:‹6œÌ½¾uïE,ä­ßa°’jp³ìEíeÊ”IUѬû¨ñ"°$ðJƒTµ÷tÖÜžÉ_8s }ÞZ,o"ZQ•™±ßã ª9)‚²J9 ¥?G¡ðÌi×É7~ÊØƒ"¦Ú ²Êì<­rM¸¬\uÆ}COœ™{›š"å^ÅÓŽË®r¼òÌ{žq—|˜|E ë°å7퉞ƒ"Dη–ìï÷ÎR%ÕðÁ9¨†õJ®^¾ïø…s7}΋HÀ’@µ†íå}yæ¹ÜÁ"1k=Já’Ò?”Q~,V¾ªT5àíTµ‡Vð#þEž›ÿ™{(cžJ¡‡v›uŽ ¥PÿÔUûÍ¥TðMë{©ZCä×3xëOQ³Ñg7£@'õž \ÎãÕ%¸Ìm¡á"¦ê1pF£jjðAŸS)"£“‰60ÑËâî„w·êÄä!q‚aàA!óU¯uoTˆ&p Oºði }jøKëøö…b~ˆ]­»§@ÃMž¼.àéÚfÍÞBÎaS¶ÌX{PWkÎ^÷,Ôž!`ÚôU{~pœ €%×¥ª½LÏå ÑIKôwU}VU© k¼/-3?ðPÆÎƒÞ¶lÚ®êA)Tn(¥šë=f2èÍ•x©*2ë<ô•XAúÓªû½?võ›»ìØÑœ¡-UC°Ä¤àó…KÛMMö½…¤áñ†ð/zbWvÌœõ¬a"TfÌ‘yàùÍ}âòËó`×¾gñ')¹œ‡×ƒ’zx›‚}û˜Ÿ|E yÇ™žöt (^÷†NzýÏðÈãêwBJJŠƒR´P{kÖ¬Q…ÿq[ºÅŸäE$`G Vãò¾<›-O°”æm8ˆâ¸ä¯,þ•µï#U ŸºL*W*¿Ö_âBõ·ÌM£?ªcÈ,¥ú›—¯Hª4A©ñ)õ‚ª9)‹ ø€ PPïÊ úƒÎý)Y¡š‹*…ñ½*ئçHÕô(ToQDàZ@Ϊ-GÏeìÒ–úå&#Ò/ÄP\º' a ª6ËÇC”»¨Dú©O«Ç]ŒÊ]½“†þc6IUÄÐóS*0 JYd§ýÑq¡Â°LÃÜ¡EÕÿ®CÞ 8ËÌ@ñDà–“È1'ÇrûŽ^…áç+\JýNÃùÚàÔÞôéÓUáûxhŶS¼H€ìÔnÚQÞ—ÌÙ󌞾<àõö‚÷ÍU=øðõ?´¨Áp µ©—wßÝtHÏ€¥ Ò  óô[Uj5R½27×¾÷(Ë»†æf®Ø.eÕçþà®]z ›$-"²™‡)ñ¯jKò(¼æRv3‚¤¶E˘ó(2¥*V °;Œ MèÓ§7‡ÙT·0ú-U§d0ÜÕ'Ýð,©: C“ÊUg@@oNF[æ‚êQRLSc9e¨—ê<2 ™¿|H Ôª7þ“®äbµ÷zü´þ‹€åÕ:MÕo’¶mÛzW{Ùrå_»ã4/ ;õš¥ª=õÊ9È’=¹ª 7Ô‰ùÖ¸™©j¦¾»É\ðÕ¿Tº¡ß• ñï¼U;,{^°Xéç°‰)*ƒjÎð½9ƒ]ÍvýÁФ¹Î}F[öGaD zõ=úæò!T£0T%ÅÁb £Ý¸ÔÀ “«¾/S©ºy\ê.ê7ßUêL0BØò“JÔSaIw- «Î¦ÀÃÔ˜ë×9yb óârÒ™b@õZ£ áŽ;Pí¥¤|€œÉ}`ȯ¿qÓ½½zõ‚S{ƒß<Ó›=wþ»¿àE$`G AóN.uždËš#¯¹ª »¼¦®Þ¯×†²R ŠxgñˆÙëå.>«ï-[·ËÐcôlõ+_u¢­ª8n=ó\n¹‹zµž›S•ØÕ€ñª1¢QôAAßÐCÅPï*ò(¼R õ»yU[†±£¬jË0voÄô å@q¡¶<7âWê£Ö{.S€»–ÃQd9^ÅÄpW}/’^s³nÃUO^ªÞP¿eW›Ê°¹ ¦ÕêŸ>ÝxìÕ-ôÖðŽ¸™wæ!Ø%к{ Ôâd´íµm{Ý 8lê öoK§~Õ¯Y³&8µ‡ÜwÞy§*ߺñ"°$ðjƒvúÿŽ\~îûÖb½¶Ü/ÜŒlîÏð¨ÜE6©­X¶î¡IòpÕTøtÖܸðAÿrÌÂõjCi.`‡Q¹¡uC—p·m¿‰†a±Î€´v«^Å®#oŠ]5v}øøÒ0¨Ó1é‰aútÂêñ@ëz·ñ£>цÉ]$s'‘SÕi¾[´Ü«Î“nè†smÒ+»æ¼M<ÕêIp?;'H ¦ ´ï»nôèeÕ^íÚ#‘säìO&.Ý¥ÿz„©.hµ—?~UÅ+ ÚOY” €%*õ½¨½žÞÓk8míSý w‘MÞD´bÙºs†NÃgéÕê: pÙW',Ûk¨3Äævxäür*¥k>Õ%ô,ÇX¦êÍmÈ( eíÆŽÐ»¶‚%¦Åa\ºˆ‘Vìʼ¨‰6t^Íšá9‘lꑳ¼[«eOKÂøÒò)r®Í¹9oSƒ:åI0ÿ×Ä“‰»ümC‰F ÿ;›¯ûUiö–³ÚC° d+X¨ó;«w³@½D0Ò9´ˆœ†8Ù¡ªÈ^àʼnkŽð"°$ðæâ=]Ç. ö²¬ªÝЙ•ë¶Å…*ƒÔŒVìøÌÐgÊÔYê•OfÉ5š÷2÷Cϵl.`´Ž> 'èz…è¡óÓ… Rÿ̬W…ÎR÷m¡xPÄôæ04¾úS)¿KÑ='š0ätW=rÐäY*Tæ•KâCýNCí2¬Í9ƒç©QœÑIÌþu~2ùû‡â›À˜% ã îâ,Ú$F¹ÊA#©~ê>"ü†‘΋ÚÓåâ Æ¨%{Ç­:Ì‹H€H@'ÐsÒª³·80©X'ÕVÕf=ˆŽH€”*ßJîØ±sºmæÌ÷‘§v‹É¨ç©çn†MjÛ¶­µg8¨Ñ|àôQËñ" Ð <–9×½>ŠË 2ˆm¯ëÄ•DG$@j5Ÿ%7yò:݆¥^äi;dÅÀ”mÿsËßÕ2ìæÍ›½¨=”ѷÑlèÒƒ¼H€H€tyK¾,¿m˼ÞÚL&©q7¹›ñÙ\äF$@Î:Ý%W­ÚP;݆¸jÈP PçÁ‹ö×é:FI½[o½õ—_~ñ¨öz÷î­*ºýÎ{¾w€ €Nà~SÕïɽªñÞGžn?k7/    Hh=ù“"%{CØõè1¾”!Æ õ$~Fé—‡¢Å\ejê–¸}ûö ¿À¶‡ÛX Ö+-^7¹ÕŒ¼H€H€H€H€"A þÐ5ù v’ó¹p¹R¾||.R²Wãq›kô›óß»E ³¤¤$7R/°Úƒy/S¦Lª^´ñr÷©Í¦îàE$@$@$@$ u‡®{¡xwˆ<¹JTÔðÍM¯]zû=è;öp 6 $@qI€j/.§•ƒ"ðB€jÏ 5–!ð=ª=ßO;H$-T{Ñ"ÍvH€¢J€j/ª¸Ù €Ÿ PíùyvØ7 Ϩö<£cA x#@µo3Êñ Ü @µÇH€R PíñQ ˆKT{q9­ €T{^¨± €ï Píù~ŠØA h Ú‹i¶C$UT{QÅÍÆH€üL€jÏϳþ‘ x&@µç ’ νx›QއHàª=>$@$J€j @\ Ú‹Ëiå H€¼ ÚóBeH€|O€jÏ÷SÄ’ D‹Õ^´H³ ¨ Ú‹*n6F$àgT{~žöHÀ3ª=ÏèXH ÞPíÅÛŒr<$@7PíñA  TT{|H€â’Õ^\N+E$à…Õžj,C$à{T{¾Ÿ"vH Z¨ö¢Eší D•Õ^Tq³1 ? Úóóì°o$@ž PíyFÇ‚$@'púôéäää¦M›nÞ¼9âýßÿQíE2› ˆ>ª½è3g‹$@ üòË/Ðy·Þzëý•’’’.\¸¸d9¨öB€Ç¢$@þ%@µçß¹aÏH a ¤¤¤¤OŸ^é<õâ¯wïÞ‚"Cµ!°¬–H m Pí¥-¶N$ðöíÛW¬X1³Îӿɘ1ã’%K"Žj/TY' @š ÚKó)`H€®øæ›oÚ¶mkÖyÿûßï½÷^ó÷eË–=räHxÙQí…—'k#ð ª=ŸL»A M`âĉwÞy§YÒ-ZôÃ?Ü¿?jXü°·21\ì¨öÂE’õ øŠÕž¯¦ƒ!„#°mÛ¶9r˜•ÜO<1}úôSZÚ°aÄŸ9'vø!gXÀQí…#+!ðª=¿ÍûC‰BlkÔ¨aVoéÒ¥ëܹóÑ£Gá~ÅœÞyç‡zÈ\*þüŽ!²£Ú  ‹“ ø“Õž?ç…½"x&€Cµƒ¶\º­X±âÎ;-užúB°M›6ØÏgÖ|õêÕ ÅK Õ^'@µçó b÷H ~à-ÒZ.Ý0À½ÎÓsÂ3vø™ë„ „¬ –Õ^°Ä˜ŸH &PíÅÄ4±“$ÛplÖCé³ |úé§_„–zõê…Ý~f͇ð†îÙQí¹gÅœ$@1D€j/†&‹]%˜$`ç*V¯^šÌ»Yz×®]µjÕ 1üÕ^L>aì4 @ T{ñ> €WŒIgV`ð–R\È\³‘‚ñâ襅/ @L Ú‹‰ib'I ²c 2ä\§E‹Aòš5Ä1¸DvnX; „L€j/d„¬€b™€Æ0ë|Ó¨Q#¨À„Wz7ôéÓÇ2üFÙ²e*–ŸöH Î PíÅùsx$à@`úôééÓ§7K½‚ nذá<“‰ÀÑ£GëÔ©c¹° Ñ éÌçH€|H€jχ“Â.‘@Ä ÀU^þüùͪå¾ûî›6mež3Háܹs3üFÄS6@$&T{aÉjH F8ÆèСÃéÓ§)õ\€û=ˆc³æƒŒføyØMHT{‰2Ó' €€]` ì<Û±c‡K•ÃlŠv[¶li饱渰˗ŽHÀ'¨ö|2ì D–€C`ŒyóæÁàÇä™ÀG}T¼xq³‘á7 ¯#;¯¬H€\ Ús‰YH – `qÖ.0F·nÝ 0 ÚãCAñFž~‹+fé]eèС™¢B`ñâÅY³fµ ¿!oÏÇC$àoT{þžöŽ‚!€C mÛ¶µ ŒÑ¸qãcÇŽEEç°‘› ¯ï¸ãóŒ0üF0Ï5ó’ „J€j/T‚,O>!÷ov1>þøcJ°´"‘ ©m)Á~Ã'ï»AqO€j/Œ1-­TÛÕ lܸñè,Ão`ŽâÿåI€Ò”Õ^šâgã$2„mÀöƒŒÀ±ÐŽ;ž9s擟¼óÎ;vá7 ÙC~X X Úã“A±M`ðàÁ©W®\¹Ý»wûIä°/7 @‚·nÝÚ.ü½´ÄöÛÈÞ“€_ PíùufØ/pGN=tµ÷ÏþsÚ´i”W>'9^¢D Ëðïîfž¹H€HÀ-ª=·¤˜üI@W{ÿøÇ?D@äË—oË–->W<ì^JJÊSO=eÖ|¿±fÍ>oì @, Ú‹ÅYcŸIà&]ía ·U«V·Ýv›ˆ7Þxã³Ï>»Ìäc_}õU=,½´ÀE3¢ÞñY' Ð Pí…Î5@Z0¨½?üpõêÕ*–ÃwÞ9dÈ«ví:C‡U©RÅläcø´|µØ6 ν8šL%! ˜ÕßG}„Ý{9sæ•ÁE‹QXùœVo-ÃoÀ"Ão$äËÍA“@ØPí… %+"4!`§ö øúôés×]w‰æ+]º4ܵø\ñ°{Ç·\ØE4<ÄÄK“gŒ’ Ä:ª½XŸAö?Ñ 8«=DÑØ´iSƒ n¹å>¬ ÂßÉ“'¯0ù˜À‰'š4ib~‘ñ/ÑzŽŸH HT{Acvð€j‚oëÖ­Ë—//R¤ˆ¬ b×Çj‡]»N`óæÍ… ² ¿(y>{ Ù _ Úóõô°s$€KµÁ‡4~üxåò^Z6lØ@aås“&Mbø€o3 8 ÚãB±M (µ÷ÉÔ¹sg奥víÚØ æsÅ“àÝ;{öl›6m,ÃoÔ«Wá7bûfïI *¨ö¢‚™@ÄxP{É «^5d•^Zúõëwþüù«L>&°wïÞ_|Ñ.üÆ/¿ü±GŒ“ Ä<ª½˜ŸB Á xS{|Û·o_°`AþüùE@d̘ñ½÷Þó±Úa×®À”1üF‚¿ò> x @µç‹€„¢ö ø† öÀˆæ+S¦ÌÎ;)¬üLàܹs={ö´ôÒR¶lY†ßðÑËÉ®€oPíùf*ØðD tµ·cÇxækÑ¢Åí·ß.š^ZN:ågÅþ!&Þk¯½f^Ø…“ääd.ìzz™Xˆâ–Õ^ÜN-– ‚R{+WnÀ) ,ãÊJ®$¨=$˜ô˘•—–7ß|ók&X·n]ž‡[¶Ü]¶ìøêÕ-\¸ÆRíAðÁ¯/B®Á!Ÿh¾¢E‹b©×ß‚'Ñ{+l—.],ÃoÀ«6Ãoøì%fwH â¨ö"Ž˜ @D ¥ö*V6fÌ>¹Díuìx¬eËÕ«o+RdD£F£Ö­Û"ûö`ØÛž¨=I­[·V^ZZµjõÅ_$ºªò÷ø÷ïßÿÒK/Yzi<ìÚ76l`øxyû9pK€jÏ-)æ#Jí•*5²M›ã†Ëʶw]í=øàÏO<±¦_¿j‚ïÓO?]»vm‰%Tȵ3fPUùœÀ¨Q£,½´äÏŸŸá7üù¦³W$ ª½Pè±, ¤= ÔÞ‹/ŽlÖì¤ù2­ä§ö ø<ˆk™2eR^Z>þøcŸ+žïŽTÃ.k~a9¸°›öï6{@á#@µ>–¬‰Ò‚@Pj¯xñQv–×_§4dßžµÁ‡7oÊKKãÆÏœ9ó-“ `-þ…^0k>¸=ztZ<Ñl“H ü¨öÂÏ”5’@4 ¥öŠU³æ—–W¸ÔÞ¡C‡°¡N:ÊKËðáÃ}¬vصëæÎ{ÿý÷›5Âo €^4Ÿg¶E$ T{‘ Ê:I z‚R{… ®Rå¬ÝuÃK¨¶=¨=¤Ã‡¯\¹òùçŸÞ%K–PXù™Ž×$''ã¨Yó%%%1üFô^i¶D @µ¨¬’¢H (µ÷ oBÒ9\aT{|Ÿ}öÙ¸qã2dÈ ¼´@úYñ°oØ‚i~OÃoDñÍfS$NT{á¤ÉºH úÜ«½+Ö—+׫hÑ•¥KŸ+]ú¢åvµÁ‡3žíÛ·W^Z:uêtéÒ¥ï˜|L~úi³‘á7`£þCÎI€B$@µ"@'4&à^ímݺuíÚM;¿?ÿ B…>,\øŠåâ) µ’+¶=IˆÖðÑG)£QúôégΜécµÃ®]'€Xº ¿‘Ư7›'0 Ú HVCiD (µ÷É´jÕÆfÍÞÌ—oØóÏï„¶3_¡œÉµS{|GEÈ5lü£Q¾|ù6mÚDaågˆÒ AK/-ØäG/-iôÒ³YšÕ^ÐÈX€|EÀƒÚÙY¤E‹ÖÖ«7$Û<«½í7Òœ9+ªW”;÷ä¬YO=ûì÷ꊨڃàÛµkW“&M”—–þýûÏäo'N´ôÒ‚ðøÏCl¿Eì= Ä;ª½xŸaŽ/Þ „¨ö øvìØ1yòâJ•úfË6ÿñÇ/fÌø£\î#§kÛƒÚCÂ*!B®)RDyiY¶l™¿O¢÷¾Â»ðôÒï¿l8¾&@µÓǮ“„EíAð!¦Â¨Q)8´ûì³Ë2d¸©µÁ‡eÜ©S§>þøã¢!Ê”)ƒ°¼‰®ªü=þÝ»w—,Y’á7øû‡bˆÕ^ M»J¨ö ø¶mÛ1pàLh¾§žZwï½?>ñÄš~ýf@~I‚/¤ý¥7 {žm{¢ö°Û¯cÇŽéÒ¥ƒ†€ƒ_xi9{ö¬¿5O¢÷nÞ¼y<òˆYóÁ“öš5kâé]}Ê&!âœJ„¹ÚyÔRM•*UôløQ¾Š·”B»ATÍ¡†  ÆPæ˜#BÔ4lØÏz¸ÐíÙ³gGŽ3Õ^䨲fˆðª=l§Cúàƒ­={N-_¾w¶lc¢£ö øNœ8í_5kÖðÌü“ \¹r¥k×®vá7NŸ> òmàï±åâµùKüÁvÐ|RþÀë]– ÅÔž´¬ÚS1‘ãXíùŒxNìž(t>BSCµù_l"I j‚¿q6mú¸S§·§M[^ÛÞÞ½Ÿnݺ[öí)Ûž¨=¤“'O.Z´(gΜÊKË–-[|,xص0k*T0ÿõ‚ ŒðJíÙùô±#Ý_kª½Hþ"¼Y·ÏÕžêžz¡×‘`çÓ³€vb$©ö<@cðÈ©=üÑÚs#…Wí 2/_¾½zÍØ¹s¿¥Úƒà;uêÔ˜1cî½÷^ù;Z½zu|Iaåg«W¯¶ ¿Q¶lY½-žº¢þ ÛÉ8|}ÿZËßõñãÇÓ¶çiÜò³Úà ¿ÓÌÿ+ÀÛ­l~°Û‘;æ£Ú FVBiF Õ^›ŽÓ[wN)Y¦ÿС)Ÿ}vT¶î)Ûž¨=$8dnÖ¬™„\»óÎ; €¥C?+ömÈ!æðØë™f¯G8¨ö¤ÙK'ËÝÿµæJn8¦è?êð³Ú“'$ yÂnÞ£Ú û“Æ I ªbQí5k3kRÊÁo¨ÙxA‘ý¦M[i©ö ø°÷ !×J—.-D§uáÂ…?2ù˜À™3gš6mª/nbCzT_‰p7æRí¡YŒT ÜåŽ{ª½pO×ÿùVíáÿÿ3#±·™1RíDÄ $àk±¨öÞh5g̬Ã#§é1þtóŸ—zefµjƒV¬øPöí)Ûž¨=¤/¾øbþüùO<ñ„ü„—˜‹|,x´k¿üòË¿ÿýoy[SíaàØ€%c7œ½ã’ÁfcP{ЈrTÉáœ¯Ò rJãüùóø ¥PÜAhTBR:/µA|8ˆuŒE¥çø×¥¾ òÀ ÏÒ"VºQ•áwnP½ 8FtOáBfÙXn5SjÏ SÝ8”QCPk—ê™Ñ²xî•Yí¡ZÕ„åÍYulÂÎZ ÂRg¸Lqj¼.í£îÿôжçžs’€ Œ=ZÿËzÛm·á÷ŽÏÕÞ+ Aä©Ë öZ´_¿þ¨M›vê+¹bÛƒÚCÂÎ0øï-P € Kuz¯tµðôƒ"f©Ñ-å—RvZ0¨?º¸7¸é ª»ÌT{aÁÈJH - `ù ö-ƒàÃß]®äâØúõŸ4o>®h¹±UZí{­÷5\úJ.ÔÞ‚îÃ4³nÇ*…Û4ïðác–j‚G:Ú·o/^ZàηgÏž×®]Ã62¦€ÎÓ·èḠB¨Íš5‹jOý ð¦öììaJ¦è @7ŒÙýê±ÜOf©ö” Íáx‡sm–ŠÓùwbÀ!„Þ+]íž,O›€H?í6Ì)h†£Lq.Ï_;q°ã†ëO Õ^¸H²HK8Y¯^=]ðuëÖÍ·j‚iÙ²-vE+LÆ ƒÚ[ܺçá>}Žuìxüõ:ãKÔ©”¯å[o-=~ü¤ZÉÛÂé"AsT®\Y†/-ï¾ûn„´N‚W«oÑÃ:ûâÅ‹±Kê¨öô—߃ÚsX Ô·è©VÔ—–g8$›¥°³üÒÍ9÷µ¹ü=h9.½l”{e§ö”W³áS˜„¾êªK=;óªKªÙ¨öBgÈHÀ/ t”àó¿Ú“Èi))ëá~å…ŠsÕ) HÀe:Bêáú¢víó*œÉ“¿Wöª;O±S{|çÎCȵ,Y²¢E‹âèI‚‹³0_ߢwõêÕ7Â'¬zT{æ—ß›Úsø%bÖ=J*9,ù)ùbyèAÙ½t›Dû°LÊÒf®Í›ÜÑOi˜Çz¯ðKÀ|&WoF>Ùeä~&ÆldUüu» :|í ¸ÝüaˆŽÔCO¨öÜLó@lˆEµ'4à`"OÎäâêMN7lˆKÔÞµû¼\ù>'.ÓWrŶ'jéèÑ£5’?T8Â2räHÏZ'‘ ê[ô°WÛC—.] *ÕžóËèÁ‹OÔz0E_íì2˜{eV{z,c¥bÅ nÙÒÀ\«Óú4¹Yhv~Nt×3!Ýüu ÚsC‰yH 6ćڃ–aEê|UºìÅÒ¥åÒm{»w,ñb÷7šOyùåï½·EöíÔžh>ø,^¼¸üZÏ”)Ó† Yº;v}‹ðÂå vé½÷Þ{T{ο ÔIRóú¦ƒmÏy1ÔÁ¶çp> XÛžÛRl{ž{eP{ºÔ 80êÎVœÝ«…l)¢6óy8ž"ÏîPÚÚÐÿQí…Î5€_ćÚûôÓÏúö]¡Bßù*_-X—Aí•,Õ{ÚÂ}ýÇ~R©êø FôÑ>Kµ'šË~øaÑ|8É‚0Y19øã?ÔýÍ7ßÀ;7éÁªGµç¼L )Y`¶ÖxS{j˜®{œ—A =Ñ»m^Éu1Âòw\äÔ^è½2¨=epµÛéè¬ö”ˆy'ZÍálóŸ%õPCèçy]þù¡Ús ŠÙH èj/gΜ8šêÃXr INiȾ=}%WâäîÝ{Ç2^ÍÓdÍsžöYµo¶½Kõž0÷ "íö™xò®Ÿ+=´C‡I‡}.‹¹æ„Úºví*!×à¥á×¾ýö[ >3ÅP[ôp'W®\¹bÅ ª=ùßB@µPj‰Ð¼ËAí¡”eh2üÒQF)ÝŒ¤Ôžƒ§7÷X”²ëƒè$H"=OäÔZ ±Wú|ôö¢Ûì,m:OË©tùB—zŸ(—uºÉFµç†ó@l0xÝ»å–[^ýõµk×ú*ršKµ‰†´uëÞ–-'ÔÏYï­Ìeå”Ô^ñ’}†L=† j¯Ãè3ðÏüÒ[ °yón;Á‡ï¡]ªU«&Œr !æ(øtJça‹ŽË¬[·nõêÕT{ºìpþÛ y§Šå6,gµg·sKYãt™¥ËK‰¦4¢AZ:RQúÃN;Ú9yŽ¨Ú ±W–jÏn]X´a§öTBq³§Gˈ¦ÔÃcLµÅÙKpCÀEM”Í]wÝÕ©S'|~ˆ“”ÚCx ¤ ¶Cê5i2VÔ^±ûBçÉ%j¯jo Wš3{ö:µÏîÃòåËsåÊ%dòçÏÐÀÔ|ú½Ë—/ÃM#þ‡€zT{òÒÙº»xž±§pñ\ÙI gµ‡‚æE=;Å£YEs†8ºî4˜-Õž®uÌ¢•«R–±4BôÀb§®Bì•®öÔj8ºjÖXhH ¥ì¶âé•È2®›ßÉzçèmÁÖl~ª½`‰1? øš¢WÁp¥–“Ô8¢›4iRŒª= ¤!Þ•¡öŠ”è ‘§.ƒÚ;vìd¹Š=Þ~{¹ƒò›0a‚ ¹Ö¤Iøj†Ÿ‘Lú=üQß³gβ è0Õžþ’+µgy8Ôð®A7ØÙlœ÷íI=SÐgâNIóþ0ݶ'Êùñ¥Ä™U]2 Kµ‡Áª}i¢V¥6$ý«YÅFÔ¶b¯ +ïJŽËV9>@5ËçBtQèá­~7àAã°Ý Úóõ_nvŽ<ÀÎúäädlP3k¾’%KbÖ¶iû_ Ô`åBÚõW’_…øó´÷¯„ÅP¤ý¥7Ò§7ÒÁ¿Ò¡éðôÙ_ Î;àɃmO“{àÀ‘B…»5ê}¤ÅÐórÔÞÞ½‡‹—êR·[_á]ƒøC×Z´h!!×ÄKKB©=}‹ŽIÙ´i|&Sí™ß8¥Ì/”þ ²9ÿ…vP{ºÞÒ«µ”JíAÞéD/hi£²S{"­FŠ‚æ%ãH«½PzeP{j1Úr!Ýð¿ËŽúó ìõàfÏåƒ$=¤Úóð·EH  @]•-[Öü« ›ùð«íƒ>ˆQµóÞ¢E›qb·Lµ95»}Y§ïU\j%Nø öJ”ï2fߘNï÷*Ó¢-í~øá^qÎgNP½eÊ”JðÒ‚mj‰ ùô-z°kâ(þtQíÙýš€Y²Æ.á.þ0»ùÛ/õlBøQ}‰JGiùí"ý†è¶"Tb×iÎRº¡q>,U‰ÉIL}–p¤6‡“"¿yÕÂHqo½2z6ŒNŒ©Ò‚ã0›¡Ã$ÃK°ÕhÛ –ó“@,Àî+ˆ³æ»ûî»û÷ï/‚/¶l{P{(HS¦¬‚æ+U}ñ+]nîÛµW¼|çAõ9ܧÙÉf•×Ô)øZóöíß9xð˜æƒUãÉ'ŸJ8 ¯šOߢ÷õ×_Ã’ ¯„[¶l¡ÚóÕ[íp6Ö¹Ÿzh¯G„>„±¶;£Š‡«WÞNH¨­{žÝì…‹ƒ‡z¨ö<@cˆ18½ÅJ³æÃyijQµÁwòäé±cCó«¶²p…³f­Å—{ö*úÒ »Ç:Bí!4çZZ&Oåf7î¥h™z÷î­¼´téÒç°Ü7I×y?ýôVÛqj2¨öbìefwÓŽ@ˆnöÒ®ã×[¦ÚK[þl¢D›ùÚ¶mk¹gåå—_ÆéËXÙ·§l{J±9r|äÈw_x¡sJÊFQ{…+´‡Î“KÔ^öo³?×둃 ›á³F(á° <3LJÚSK·Ð|8ã ƒ.ÎëPíEéÝc3qA@mìó¶ræ ¨öÒ| ؈œ±(V¬˜YóÝ~ûí8²€ý[þ?¥µg™pzC¾Ç¡ÝBÚ¦Ù½jW©½™3× Ã¶mûNA¼]»ª°ü ç,B €%v5œç©ÇëÒ¥K³0åRíEï•cK1N@Ϋé§aÜìÑôá ©ö|8)ì D–À’%Kô¨Jü=ðÀcÇŽÁçÛ3¹vM}ÙW D»²[_­p¾‚\µÍW®d×ò%º¼õÖÒ'NÙU8nÜ8奥nݺ°Æ–æÓuÞwß}‡#Ò˜SXp©ö"ûv±ö8" û5”ß“1jØãJn=• Cà—_~pdˆ3­~Ó|Jçá ƒw8\„×kª=ß½oì ¤ª½´ Î6IÀRRR,C®=óÌ3¹&Ñ4Ò*–†DËõœ::|øÚ;w=*™1cu§òmåÌ®¨=,ö~ÿì³ðä²sççV  ^Zà¥åÊ•+~Ð|úÒí?þˆ¥[ìÒƒ¥Úóß{Æ‘@Ú ÚKîl•|H›ùàsÎ2äZñâÅg"FÕž¸}û˨½Î¥Z|Q»¶\fµ·páûë×o³“}°–5hÐ@yiyë­·ÒPðé^ôàÑá›V=ª=¾_ì ¤!ª½4„ϦIÀ r’’’Ì›ùr­~ýúpÆÍ8¹§"¦O_Õ¡H£¿ì^?¶«l{;vìGƒõë*U¬3våGË„x²E‹J9rä€ï:¯('õôÀ¶wõêÕ'N|þùçT{~|©Ø'HkT{i=lŸ|IG4 bÌš!×úõë'‚V.$,"ü+a ¶%¤ÏþJ°6!Aˆ á «$H$„)“±‚„UH¤h¼›UBÃAϵ)Øp{‘ò—‹ÃeV{ó{šÚ¢OR±Î=xðˆ]Þ~ûí‡zH(á¼ LkÑ|ú=xWÁ^C Cª=_¾Lì ¤=ª½´Ÿö€|K`âĉ–›ù²eˆk‘S{¢ù"š,Ø/-=òÔ<–#߷ٳ˾½íÛ÷¡ÑzõF¾ÛvjßqÌKM*l3~üb»Î@ÐvêÔI…\ƒ—윋œæÓuÞÏ?ÿŒÈ¿¢’©ö|û±c$àT{~˜öüK!×’““-½´àhêûï¿ Û^Duž^9VuqbwX¶¤3OeÑÕÞ’fÉ8±‹X»ØØw¼|¥!Ï×ÀÝ÷ßßa×1D§¨P¡‚òÒ²xñâH>õ”ÀÏ3¼«(³¨ú@Ûž_$öŒÒ”Õ^šâgã$#° mgÖ|ð<ܬY3x¤ ïJnÔÔ:zôs˜î ùphWÙö–×o{¼M\P{ØØw-OžyYJvê4Ù¹c‹-Ê™3§PB„:¬ecG]X’zLPË¢­eâ¾½y¥ØMˆ*ª½¨âfc$Ó@6S¦LfÍwÏ=÷Œ3F_ˆûöÔºd”?8pxÚ´•Ò(VrW¿ÚPÚµ÷^–âP{¸{äȱ>}fíÞý©]‡ªB®!\ß…"øô¥Ûo¿ýrSm|´ü@µÓ¯;O"@µ!°¬–â–ÀèÑ£-C®åÍ›!×bTíéÒ joÝK5á™E.ƒÚÛ¶moÑ¢]K–ê=lØ|hDKÍß„M›6U!×à¥Åƒà3lÑÃYi9æ0ÑKܾ{ x%@µç•Ë‘@@È5¨ËÍ|ÕªUÛ²e‹‡3¹æ]hiõ Œ|IIý'¿Pí\±rhWl{;NB— öJ–î=9eÏ­æ”(=àí·—ÙõsݺuEŠQ^Z6mÚä^ó©‡ ÎüÎ;'‡šÝ'úÛKà·“C' T{|,H€<€³eìN3k>„\k×®]°XÒJÛY¶»k×Þ½g¾ò|³%yËCêÔÞ‹¥zO˜{p̬Ã]GLª5ÒpÑ¢÷íú?uêÔÇ\(Á‘!NWÀhçÔd ¶èAá)G6î?Píy|¦YŒâ”Õ^œN,‡EÑ"°dÉ’Œ3š5ßc=†k"PüíÙ6ðÃ÷Ÿ|²§M›·jåycS¦bÛC¯ðe‰’}FN?‚«ÏÄ“FŸy=ùH±—&býwß¾ƒvÝFÄaå¥Kà<ÅRð©Iƒ=lË©·ÄÈiÑzØ Äª½˜$v‘|N!×lrí…^@ȵU{"Ý6lØÖ¸ñ˜ryš+µWìžÐyrAí5p¹jo –¿lÙ‘Šx¯½öš ¹6oÞ<]ð©)†ÄQ ÙþbòIœÜU«Vùüf÷H î PíÅýs€$%ØÌ‡x–›ùêÔ©³sçNC, ç³¥~» %‡ ½ÚºuwÑ}»ŒýB.ƒÚC†™3WÏ›·Î®ÿK—.UAJ°Žójz°EïÌ™3Ê—Mè|¢ö ke*6J"›!0 ÚãCA$NÛ¶mËŸ?¿åf¾>}úè‘Óü¦ç\öjï…¢½Z =¯.ݶ‡JêÖñÒ+ÝñïúõŸØÕ9jÔ(¸­Jðk#ߥK— ïÄUuâ Æ4åž={vïÞ Í½cÇø‚þä“O`küè£ø§j(‡H6n܈ø¿ëׯ_»v-zµzõjØeW¬X±lÙ2ˆT¸Œ~ï½÷àSpáÂ… ,˜?>dÜܹsgÏžÀ*3gΜ>}ú´iÓ¦L™2yòdý@6ñS2á|ÔX €kT{®Q1# €k)))–!מ}öYˆ—ºÊŸÙú¬[·©EK}µåVè<¹ÔJ®¨½ÞóGµ_Ô÷Åj°ø»sç~Ë@Ò½üòËPEµkׯÎ< C‰äµÁ‡s'ºg×3’ „D€j/$|,L$`G›ùrÍr3_É’%r- ß8?gX·nkóæãŠ–[¥ÍÁ×z_µ·téfôj¯Ë»ƒg·ã±Ž•g6*X±Í!óöì9`6;Bía3YD“Ol{báédx¢á‹C$MT{ѤͶH áÀ'0ÜŽX†\kܸ±ÚÌçgaçÐ7È»š5‡yiJù–_èj¯Ù’änGºAíÕþ¢v…/+=?îÕܯ6^¸pƒ¡*¥öàË&¢ÉWj‚[<îMà€I M Pí¥)~6N‰AÛÂÔÑ]ùaïÚÈ‘#Ý; ögιs×Âå^þBÝ—,Ù„¶WyÛëAv·¹®öÎW€¿¾L› à{Cÿ $¶=lª‹BJó}{z”a”KŒgŸ£$_ ÚóÅ4°$&Nœhr-{öìØòïO%ç¾W“'/Ãr­¨½WW7„Γ+UímÍç ö Ã¢“¢pJ³\½zuËSºÚÃçü1{Ž‘ü@€jϳÀ>@¢øæ›oÚ¶mk饥|ùò8ê>\„os^?“»®fjݳUtµgèóÀnkvE+EZíÁÕÎwÜa˜_ã5è<ùñÔ©Sþùg¢<ú' ¤)ª½4ÅÏÆI ! ÀV¶lYËÍ|¹†l¾Urn:6iÒÒ—^êóÂ[5Š+q=Èîåb×WroØöìÔDXÔRä<°´oßÞ<§=ôFm©öðåÕ«Wò à I Ú¨ö¢Mœí‘ xtË”)“YdÈaìØ±ÞÂ…ù¤Ô®]ûúö Í—wv¥ëAvo¨½:u†º§l{P`ÑLò·W¼xqÃl–*Uêƒ>°“zòý¯¿þÊ7‚H Ò¨ö"M˜õ“ 8À¹TËÍ|yóæ…/_Ÿ¨7oÝøä“ÝÉÉ“óTnöìÚœÕäW”S$¼+#JžR{9sæ„[fg'w/^¼È7„H Ò¨ö"M˜õ“  M›6µÜ̇ýþ0y[>)õÁÛ›5›§\sÛD9EZíµnÝÚÔ“<¿ÿþ;_ ˆ Ú‹(^VN$à–¶ë!n¬eȵ.]ºŠñ´zõ‡³f­2 bÀ€rJÚ+ú)ì‘ÓtÛ^PjïÚµknŸæ#ðD€jÏ6"ˆ %K–d̘Ѭù{ì±·ß~;Æ%Ÿ±ûJíAx¥I oœ\Ïjïܹs‘yšX+ @*ª=> $@þ"€k½{÷¶ ¹=±|ùòƒñ’”Úû8’OÔséŠÅ_/!{w¨öânJ9 ˆ ØÌ‡%NËÍ|µkׯºgH>Q{؛ՕV >·lÙ‚`'›6mÚ¸qㆠÖ¯_¿víZœ˜^½zõÊ•+qØbÙ²eK—.]¼x1ÎÍÀyÞÂ… ,X‡ØóæÍ›;wîìÙ³gÍš5eÊý„uP+¹P{ßÿ}\<¶ ø”ÕžO'†Ý"œ]ÈŸ?¿Yó!äZ=>ñÔ¿Q{\i˜BW{Í›778UVíqëßwˆ(ª½ˆâeå$@a 0}úôôéÓ›5ŒIS§N]ɧÔΧa EíõíÛ÷É'Ÿ4OͰaÃÜŸÉEÎË—/‡áAa$@6¨öøh Ä„\KNN¶ÜÌW¢D ,;ˆÁÔ¯_?±íAo¥mò°’‹C3Eб\j¯_¿~PR™±pO!»H1K€j/f§Ž'Ä#púô餤$Ëk 4@ð±Ø’|JíAl¥yr¿o{õ^{íµüãæ‰È—/ŸK§Ê9Èc¹‰÷6sÄQ%@µUÜlŒH tF9rä°ÜÌ7tèÐ|Jí½ïäæ”FçÎï½÷^3|| k_°&=•ÿË/¿ ýÁ` $@v¨öøl Ä$Ñ£G[†\Ë–-Žˆî…[joܸqˆ‡fiXÅ™ŒÏ>û̳ÔCÁóçÏÇäSÈN“@Œ Ú‹‘‰b7I€L°™¯mÛ¶–[ÇÊ–- K•Ï%Ÿ¨½jÕªÁ٠<­T¬XÑ’s… á7'e/]ºÄœH r¨ö"Ç–5“ DƒÀ‘#G í,C®Áæ´cÇÄdógÂVÿ«=xW±Ü¢—9sføÞ ]çI W®\‰Æ³Â6H Q Pí%êÌsÜ$_p,W÷î«Ä߃>8jÔ(Ÿ«½u>Kâ]yÈ!?þ¸å=øŽ —Γzèo/¾^GŽÆw¨ö|7%ì €7¹6xð`ËÍ|yòäIIIÙë³Ô§O±íA]ù*Íœ9³@–[ôš6m é^©‡Ú~úé'o“ÎR$@nPí¹¡Ä<$@1CžÛ H,7™½úê«pbìɧÔ i>I’V«V­[n¹Å Þõ°¥/ì:ž:uêßÿþwÌ¥öV¦]š={v¹rå,¾kÖ¬‰-zíˆeÜ?ÿü“O0 @D PíE/+'ðlæ«Q£†¥¦©W¯‚sìN‹*¶=D‹~‚Ò­[·nx y°~ûí·¾xDØ ˆkT{q=½ €F`Û¶mùóç7k¾»ï¾»k×®Ñ×{Jí-z‚Yñ¾ûî3£x衇B €¬Úc ¾ $T{ÑáÌVH€üB`âĉ–›ùž~úi]QLJíá$lÔÒ„ råÊ¡hA©½Ó§Os ×/oûï¨öâ}†9> „\KNN¶Ü̇“¼p}ɧÔÞÒ¨¤¹sçF:ZPjïÇä³I$T{ÑáÌVH€|G¶¥¤¤$³• Þæ5jôñÇïŒpêÕ«—ìÛÃÙáH'ø ´Ü¢—3gÎ0@s¯ö._¾ì»‚"ø%@µ¿sË‘‘ ¸ €#–ÎG°™oÀ€Õ{Jí-Ždêׯßc=h.ÕÞÙ³géNÙųÉ,$6T{aCÉŠH€b—ÀèÑ£-C®eÍšuêÔ©;"“zöì †8‰„ž?ÿüóÑ €æFí}ùå—üñGì>*ì9 Ä"ª½Xœ5ö™H ü°™¯Q#ëk*T@¬‹°K>¥ö°–Þ„ À¿û·¿ýÍ2Âǹ‘e‘ȃÕó_ý5ü“ÇI€ Píñ! TçÏ-[ýûïÚ2äZóæÍ?úè£0j>¥öÞ kjÛ¶­¥2ÒЪC8RþùçŸù´‘ DŸÕ^ô™³E Ÿ€ÚË—¯CRÒÀ5kÖ ºšYó=ðÀC‡Ý¦¤ÔÞÂ0¥aÆ=õÔSænG'Z@µÇC¸>}îÙ­ @µ—“Ì!’ ¸# Ô²#äÚàÁƒ-dðW7kÖ¬Ð%ŸR{óCNðXªT©4 €Pê1®»g¹H "¨ö"‚••’ Ä"]íIÿr ¾K,UTõêÕ7lØ€øžS=ä”¶ÙyNÐ ÷¿ÿû¿æNæË—Ùê°HgÀî?ü‹ÏûLqC€j/n¦’!•€YíIûöí³ ¹vÛm·a“\ˆjï•W^™ç5uéÒåÁLóhzÇ2`% ubXžH 4T{¡ñci 8"`§ödˆ0¿Y†\{ôÑGGõIð©{÷îjP{ˆrl>|xöìÙ-½«têÔé³Ï>‹´ÅÎMýt¶G/‡Û¨öb{þØ{ 0pV{hf*„;³ ¹ã|æ%ù”Ú›Lš4iRÙ²e-—á)» Ýè°(ä9wîÜ¿þõ¯0Ϋ"ðL€jÏ3:$ˆ7Õž ›ù°UÎ2äZíÚµ×­[·Õ]Rjo¶ëT¿~ý;î¸ÃÜtZ@³S_ý5£eÄÛëÁñÄ2ª½Xž=öH ¬\ª=iÛõräÈa^¹†µT7zO©=œ´˜ºvíúÈ#X@ƒã•(Øê\6ñÅ_Щ^XŸJVFa @µˆ¬‚H >¥ödÈ'N´ÜÌ¿wãÇwÖ|JíÍtLcÇŽÍ;·ß YŠ¿Ë—/sõ6>ÞŽ"ÎPíÅÙ„r8$@Þ xP{h !×’““-7ó•,YrùòåÛ¤nݺAýüòË3lÒäÉ““’’, Á»^@3K=œ½¥ódïOK’@„ PíE0«'ˆÞÔžŒrÊÌr3_ƒ 6mÚd–|JíM·Jðóg¹E/Í ¤Üé]½zõÏ?ÿŒyfOI áPí%Ü”sÀ$@vBQ{R'B®eʔɬùîºë®>}ú Ì®ž”Ú›öŸ 9-+ñI4]íQçñm"˜ @µÓÄN’ Dƒ@èjOz9zôhËkY²dAˆ3%ø”Ú›úW‚ß¾bÅŠYzWÁi\8yvyT" Ù°Eï?þˆÆ¬°  Pí…Œ Ä p©=ðÀf>„Ù°Ôm•+W^ºté‡~ˆc¶²ooÊ7Ë~€& Gnaϣ΋—GžãHT{‰2Ó' @@aT{ÒÖ‘#G,mu¹Ö¤I8jµ×¦M˃½=ôlQ0Ô¹iâÒ¥K<‡ðbð'ª=Î {E$®öd K–,ɘ1£ÙÎ'‡0î¿ÿ~?@;þüwß}G¿*ið8²Iª½ð±dM$@1N BjTrmðàÁ–›ùÌR/m áŒ-‚…\»vN’cüqf÷Ià&ª=> $@$J rjO€Š‚_ËÍ|òeô }ùå—°ÞáÈäÝ÷ßUʧH þPíÅßœrD$@ DZíI·r-þü͇õÜwÞyæ´¨%ž´ðø”° Ä ª½œ4v™H 2¢£ö¤ï)))r2A8Šgx#3&ÖJ$@ÿGµÇ‡€H€R DSíI“›7o¦ÎãóG$iT{‘&ÌúI€b†@ôÕ^Ì aGI€b™Õ^,ÏûN$VT{aÅÉÊH€üB€jÏ/3Á~ ¤9ª½4Ÿv€H ¨ö"A•u’ Ä$ª½˜œ6všH ª½@„xŸH aPí%ÌTs $X¨ök¾9Z T{| µ÷Í7ߘ­zOx)oÕ6¥ÛçE$@$@$@$vÅ›ÉþRÃ;Ò?jPºÉÉÉ! > µg8qgúG+&Oi8i;/    HÈóróÿþÛ-ºæ›>}z(‚ϨöRRRôÚïyøéúc76²ƒ @$¼ÞåKõßz1iH¹Úã«w]„&^jû¦.øÒ§O¥WÏ‚ï?Ôá¢:¥öþ÷Ž»ë _ÖrúN^$@$@$@$@‘ PµÝì|ù:èWÅo¡¡bu’u\Û¶mãö°0¬×[©Íðv³vñ"   ˆZÝŠÎ=zÙž='fÎ|¿pá.ø±JãIhî‰ÜÅta†C´ÞßMÛžÁ°÷X¶‚çìáE$@$@$@$ ­ßú @ÁNÐv))(÷É'GDÿ5º¦Éèÿ£màólÞ»©ö ;öIé–²— @$¼Òèm¨ºfÍÞ2Xì`çÃ÷%+ @£Ï—«©Ì{ØnÛœóÞMµ—?~UÝ“9 ö^° @$$OÛ&†=Dè6¸ß~û£|ù>¸ÕæÍ ÞÙ¨/æÂ6ç]í9rD¯«Z»¡àE$` ÐkζæÃR‚ºÚŽ]î£ÔŒVÜaNˆ!]&¿/9>ÄP·ÙUˆ:ígAÏuîlíZeòäu¸[ùõ1húÙçK(‘7yÞÕâ᪊þ¿Ü>`á®!K>åE$` P¦Vë`Ý»g|6§%ÆÆý§¾o5b¾TŽVœ|Ç +œ€o‡ïmjºO{?oÉ—ïyà\òËç"Iõú¥l÷í`Ù1ˆ(ËõƒžÃÉ Kõvõê÷¸[ `çA‹ö5è5Qýé¹õÖ[=¸bI]ÉÕ=*ç}1iäòC¼H€ÌÊ×n¬Ú{,s.C=ÉW>WàEó÷íF-”ÊÑJÂÂoÐcÈ$2ßN½ç©©Ù~È=c¨÷·ðäûvÔì Dˆ@Ÿé[¯ïÌ+ÙÃÁP‡ý|×s‡¬@`‰SoOË×ÕD"¤¢ªåcÇ®<Ì‹HÀL BTµwïƒ>ž9—›«@éW õ ,^7”5|ßéÍTµ‡V> øvÞ=OM£žãÕ—lJÖî0UáªÚ´^¹…7bÀ¬-¾;;F‘ Шó(¹~ýæ;¨½÷Þûy^kü6:-ÿ‹êUªQ£F°‹¹×ÕÞ’%KT»åïc–í{kÍg¼H€Ì*Õm+/ËYryæs_†ëjÏ\CòØw¥r´â¹ò˜.H¾>ÏSƒç\žê‚e^1.GÁ’r|;vvŒ"A jݱPrë×ïsÐm_|q yJ¿ÔxµÉMÈwÞy§µ§;UÎY°ääuGy‘ X¨R¯üqz2knψDí™kè1þ=©­x®<¦ ’€o§ÏÛÔt>Ëù}¿t¯¼ø×·cgÇH Š¿ØJzÎY·a©ÙÆ/=0dÖûÊ0‡ÁºY¾nÛƒIPUQú•º36ãE$`Ià•©jï鬹=#ºÿÆŸ7s }ÞZ,o"Zñ\yL$ßNŸ·©QïKíV½ì††A{4áÛá³c$^o-ÙpÓž¨À¶m'#ç É[Ь¾*µ¶fÍš Ì{×Õ^Ž9TùúíúÎÙô9/ KÕ¶——å™çr‹hʪý(Ž+ýCQþ•ë¶î-Uõ;UíáKüØ}Ôìbå«"›\hQ¾w¾9õRª~sAéÂ-é˜4¤ŠèÆ¿»Uïr¾T­!¾ Kд… ožJéM52 '(n{{hèƒ3È  “žëùetêËf]‡ëýTe¥Hû1|5ƒøuÁÇy‘ X¨Ñ(Uíez.O°ˆOº¹AV7È«ªT´R±Æzõ™ßœ³Þ²é–ÝG-–LTCè’œVûIgªÕn¬ò|ÆT)Ãx›‡‰ õúØñä/"ˆW­;N‡†Ã*m@ÅvìØ9ä¬ñú( è;b’zk2f̰ì¨=âU…Ó?øÐ{Ïð"°#ШEgy_zä±çrä x½”TÃ\Ê¢”5Üš4w•Tn¾%9UtC•3is)É)â_½QË/=dÐ;J,ði,\¼¬š”uš ç"ž{—gõØè§:é|×’ †)C¶¬Pjž³d‹ùÁðöŒÙ={§Æ.Þ õw§û€7=×Â$£Z´ ÷É'G*¶óç¿Fβåûb¤êw^ŸôéÓ,ûjÑÖÔ[÷Àƒm=ð/ ;MZ¥ª½l9óz¦ôð áe®aZÊjyÑŠeå–T—P-ê´»¤Q$T¢*·ëI(BéO@–Xæ/ÿ@Nƈ‹–(Û¾ë€åïï1ñÖCTÚ’<øWoWµ8~êB‡þXλ%̲ŒÔaÆU½3 ÛeXÐýëP¡ÊM©×kÐ÷™“â†@ÍÚ£¡á°JëF±!g¹ò}1vüQ‚ Ü”UyþKW{°í}¸ï / ;ZÞT{ž)‰‰Œ 5Lž—jÛC+–•[fP]Ò 8|F%ªr»ž„’!”þ$`Ç•¸ÑÇŽâûÞÔ zë¡ê›yâôÊ¥hײE¾Ê úc9ï–L,k7ézg¶Ë° ›×aÝÖ#ªçè•a^ÜÔÀ<$ê6çRí}ÿýÏbÛÃÀÇLN]É‘—=8µgXÉ}÷—¼H€ì4ükß¶Xy¦¤öíj˜8{¥¼ÃhŲrË ªK¨½ xÍ\¼YUnדP2„ÒŸ€œ™zgö¨aPj?¢@Ø%¦Êzë¡ê›óÔã.Eô®ªQ‰yê®å¼[2‘VN72`oŸj4 a»  |Pƒš|°D°f ø ЬÍõ•Ü-[Tl²’[¡Ò ¿âÔï´ ÷íé§4îà¡u;Oó"°#Pï¯3¹YsäñLINSšk?+õL.Z±¬Ü2ƒê’])‡~ÚõDñ!”þ$à’yÊêûŽ.T¬Œ:¸ àøFŠ{î¡Ô†"5äQ-b€æ²Îý±d‚‡G~é[Vè툄í2,è<5(®æÇ¹œJf#¸$Ð6y¶ËS~œÕ_]Œõ®ö¶mÛ¦ÛÿWn;Å‹HÀŽ@¦7ýíy¦¤üíjxszªÚC+–•[f–“ æÇÉó3æaj¤WªîçÔó›Å‚$+úŒZé2rÚ{ï}‚œ­’çbh/U­¯[5‚³í!7¼¶¨òíû¿5oóç¼H€, Tãzx{¤gžË=ðÅ./CUéoh,üÛcôlýj“ÊÑŠeëvFÎ^/u"+_ÕP¶^›Þê7´(¥0»éö–ÁsÔÑî[‹¶º|Ñ»±£BEF»çV¨ÞPÚBµÍ» W=ÄgÕÜÕ;¯ôÇ<(u×rÞí&]ŸV|6T‹Ç@õ3,Ϙ·©QC“§Ýù}q9ÝÌFq@`ØÔ-Ðp;O¨Ø]ízœÜî)uö狨_æÉÉÉËþÇJ.~@ü U¾êfn<Æ‹HÀ’À« Ú©—Åý‡¾o-Ök{:kª:A ÷gx?Ê]d“:ÑŠeëš$ߌ¨ƒ:‹–{•”«ÖŸU?ÍÕÊ]Õs£ž3xë: :Œ2€"°è¥dì¸r¿PJ}o®Çs Ó'ýȪE|£w[=6†'Aò¨»–óî0锚\´ˆéF øRŸô®#gë= åó05zO¾/–pÎ>3@,6ýCh¸† ÇTlC‡.BήÖc˜<ü¸zRRR–5ª½¦M›ªò…JW™ºþ(/ K/×÷¢özMxO¯­Uß·ô¿‚ø,w‘MÞD´bÙºsCµúW4Q«eOsÒ§²æ¶›îP2xèºQ¦j½ç}s@j;ê´ ·J' :?J+–ÄÔccx¤Wê®å¼;O:ŠØ)* ë<|–aà¡é~Xî~0c”½¼H€H€ j÷œôLÞâw¥O5ò©_Áø¦xõÄE$@. t›³»H‰ît[¶4¸óç¿Æ"o‚:Mù¤~¿™ú2îš5kBR{ðÝ¢W÷r»‘]æîáE$@$`&Ðbººæ©ÖW…fýXLJ$@$,ZæBí•/ßǰ{¯Y³·ðýK5G£Â§òSòÌÃi\‘†©gråÔ¢jüÇw·žúIûY»y‘ „@Ûé;‹•é+‡sá]OĘÄÏ(T¤kË·?®Ôf„n‰=z´ÞQíég5®ï5~©në;y‘ D‚@Ãë!ì ïpQqNM<*×걨ÅäÓÝó€R{éÓ§÷p>ö‡¯Š»i0üï¿ÝòR»7›MÝÁ‹H€H€H€H ê]W¸d/y¸òìôZÏÅh(S¡ ºaoúôéÞ {FÛ~Æî=ýp._•ž³Þ˜´ @$4œøIõ^K+5›V­û{õÇ}ˆ&²–¬¡K½üùó{–zj_õîÝ[o‚ï¹²ujû ÞÛÛx‘ DŽ@•>óÓ?KWb0Ã9r$ÌjÕé¡5¤=h¾ûŸÊÉ‹H€H€H€H BþùÐSºÎÃgH=o^WtuøgrõeË–5´ÇI€H€H€H€¢I'hC±êYŸÒP5âÜÂîFs$@‰K€j/qçž#' mÏ @" ÚK„YæI€hÛã3@$¸¨öwî9r Úöø $ª½D˜eŽ‘H€¶=>$@‰K€j/qçž#' mÏ @" ÚK„YæI€hÛã3@$¸¨öwî9r Úöø $ª½D˜eŽ‘H€¶=>$@‰K€j/qçž#' mÏ @" ÚK„YæI€hÛã3@$¸¨öwî9r Úöø $ª½D˜eŽ‘H€¶=>$@‰K€j/qçž#' mÏ @" ÚK„YæI€hÛã3@$¸¨öwî9rð!}ûömÞ¼ùÂ… Ñém{ÑáÌVH€Ò–Õ^Úògë$@© ðjÔ¨ñ_7ÒwÞ9xðà_~ù%Òt¨ö"M˜õ“ øÕžf} „&Umwë­·ŠÔS)S¦LkÖ¬‰(ª½ˆâeå$@>!@µç“‰`7H A @Ïe̘ѠóôË–-{úôéѡڋXVK$à+T{¾šv†ˆÀ‘#G ätžº³_rrr$v©öèãPI Pí%ðäsè$F¾ùæ¨7óÒ-ä]­Zµ¦OŸž3gN³ LŸ>}JJJx»Lµ^ž¬HÀŸ¨öü9/ì Ä-(6è6³˜ƒÂ[¹rå©¿Ò°aÃî½÷^s¶bÅŠáÜn¸èPí…‹$ë!ð3ª=?ÏûFqE*-þüfU7fÌ¥óÔ‡ýû÷7mÚÔr©·mÛ¶0†N‡j/t†¬HÀÿ¨öü?Gì! Ä<xW±Ômÿûß›5kvàÀœÃ°K7n,Z´¨YóÁKËĉCDCµ"@'ˆ T{11Mì$ Ä0Ñ£GC™™å4”œƒÎÓo½óÎ;=ô¹’9rlÛ¶Í3ª=ÏèXH †PíÅÐd±«$c>óÌ ºmÆŒ.užÊvôèÑÎ;Ãh®n™½…ß Ú‹±GŠÝ%ðD€jÏ6"p$í•””d–eÐjPlÐmÁJ=•çÎ+V4׌¾ÂoPíñA&HT{‰0Ë# D¼âõîÝÛÒ» TÚ®]»¾Gš?~æÌ™ÍšŽšƒ ¿Aµ½'ƒ-‘ ¤ª½´cÏ–I î,Y²Ä20”ôY8dÞÔÑ«W¯téÒ™5œ6Ãu³ºT{n(1 @¬ Ú‹õdÿIÀìc@A“…]ç© ?ýôS8d¶\Ø…ç€^Z¨ö|ñô°$@&@µaÀ¬žâ€ưôŠ59©§j^½zµ·ðT{ñþxr|$@× Píñ9 ðNïìc`ÿÜ—ÑMãÆ³ ¿—Îvá7¨ö¼Ï=K’ Ī½Ø™+ö”üD^îìc@uEWæÝlíàÁƒÍ›7·ôÒ÷Îæ…]ª=?=Sì @¤PíEŠ,ë%x%ï*õêÕ³ô®¥õù矧•ÔSínÚ´ át-ÃoÀÕ³>/T{ñú”r\$@:ª=>$@A€O;ËÀPW[·nMs§w`æÌ™O<ñ„eø ¸}–1Sí1÷ÌJ$³¨öbvêØqˆ.ìó ŒE5kÖ¬3¾LÇÇ K/-~ƒj/º[#HT{ií’@ @ ËÀPQÐRPT¾Tz7;µgÏžJ•*YziÉœ¹tÞ¼mΟÿ:†¦ƒ]% ` PíKŒùI 8Æ€~‚Šò¹ÎÓ»·téÒ,Y²Xm7L7wîšT•H ñPí%ÞœsÄ$àŽ@JJŠ¥wh&(§ÒyzW bø wð˜‹H€|D€jÏG“Á®€OÀ;å™Vè$¨¥¯b<>|ø7Þð~Ã'sÄn €{T{îY1' Ä?x¤kÛ¶­e` ($è¤Wz7»¿víÚ ˜G s&Œšñ?Ó! @" ÚK¤ÙæXIÀ‘cXzW*‚6Чd„ Á†ßàCD$@1G€j/榌&ð@`Œ9r˜ ]PBÐCgã:k$  Ú‹0`VOþ&Ÿsð¸•Vá7ôqá°I€b™Õ^,ÏûN^ ØÆ€Öâ9—Ø©k×®–^Zàb¦P¯ÈYŽH€ÒŒÕ^š¡gÃ$&Ž9b¹d }•“Ø2ïæèღZµj–^Zz÷î ³hšÌ% o¨ö¼qc)ˆ=ð®‚@g·Þz«YÄ@Ù@ßPê¬X±"W®\f\3f\²dIì=ì1 @¢ ÚKԙ縌€]`ŒÜ¹sCÓœg²'0dÈûî»Ï¬ù`"…¡4Áž#—H & PíÅä´±Ó$àžŒvùóç7‹(èÊ<7Ž=Ú¨Q#K§Ó0—þÿíxÅþ¿ïóÿ]Ñ{ìŠ`Á‚‚" "ÒD@)JQš4Qzo¡w½C¨ j(’@ „B -ôÞ{QïÿÇõìž¾çdÏÙÏ>óø„“ÙÙ™wvO^¿³3ƒ ©ãÝÁœ$@$à}´=ï3çIÀK`!-[¶Ôt¸ ÆÑaI`óæÍ%K–ÔÜ~#((ÈKÊË €óh{Î3ã$à 57Æ€¯ÄÆÆbn)×@ì4v@Ų5¾pk°Ž$@¦#@Û3]—³Á~O+ÃinŒG©¸¦8$@>A€¶çÝÄJ’€XëÀi®®#IJJÒÑrX”’ÀÒ¥K¹ýŸO ƒ í¼ƒX=°Ok¿a8õìXHppðž'пÿ'Ÿ|RÝÜ~ÃþíË$@ž'@ÛóÖa¬®É `4µ@À*à†ñVäo[¶l)W®·ß0ùcËæ“@¶ íe{°$ଜ¬T‡çž{náÂ…Ô+ƒ˜={ö+¯¼¢v>n¿áĭϬ$@n í¹§’€× (mïÿý¿ÿ'â×_=pà€ÁÇäÕ;vìX§N4·ßhÔ¨·ßðú“Ä ’€¹ÐöÌÕßl­¯PÚÞÕ«^½º>l‰;f̘s<ŒM`×®]5kÖTùÐ}C† ñõ›“õ'0,Úža»†# JÛôÜÍ›7Ïœ9³H‘"B *´jÕ*c kw«a¿ÿþûjç+P @xx8ï{ ÐmOw¤,}ûö}æ™g„@Ô©SgÏž=´*ƒ0`€µí7233=x±h ó í™¯ÏÙb_&`Íöbcc7nÜØ¤I“9r@ø°an=Nœ8apã1yõð¶%·ßðåÇ‘u'Ÿ!@Ûó™®bEIlØ„ë}„††–.]Zù0Ô»`Á“•ñ›¥¹ýºc¾¼íI€HÀ}´=÷²ð»¶áÛºuë„ òçÏ/œ¯L™2ê=ÏÃØ¦M›¦¹ýFÙ²e±²÷î0^‰HÀ Ðöü±WÙ&ÿ%à íAøp´mÛö‰'žÎ׬Y³C‡[xÌ^»ƒ¢Ë4Wii×®vFößûš-#ð,Úžgù²tЗ€S¶Q·n]¹J˰aÃÌ®T†o?zÍÚö“'OÖ÷vbi$@&!@Û3IG³™~BÀYÛƒ:ÄÇÇc¿¢E‹ çÃ2«W¯6¼ó˜½‚‹-âö~òв$`´=t«@pÍö |8Ø{饗„ó}óÍ7;vì¸ÀÃÀNž<Ù»woÍUZ¸ý†ÃO 3’ d íñ> _"àŽí%$$`ºÆÏ?ÿ,WiÁ^^§N2°ð°j°t"·ßð¥G”u%C í²[X)°BÀMÛƒð%&&®]»¶R¥Jr•–   Z•Á ¬[·ŽÛoð[HÀe´=—ÑñDȺ؄/))iÖ¬Yo¿ý¶p¾âÅ‹oذÁàÆÃê9’ÛodÃSÇK’€ï íù~²f"à”íU¯Þ? `flìVñÞ{"¶'lǶmÛºuëöì³ÏÊUZ222.ò00Ç·lÙRô—òÀî)·oß6ÓÓÀ¶’ 8J€¶ç()æ##pÊöŠïØ¡Ã̯¾ê3vlˆ5Ûƒða/¼õ/Wiéß¿¿m‡UË"óÙgŸ©Ûoá!eHÀ€h{ìV‰¬pÖö-J˜4ió?L¬U«ÿüù«Ô±=ØŽäää%K–”,YR®Ò²lÙ2Š•Á LŸ>ÛoðË‚HÀ´=G(1 …€³¶7o^ÒìÙI“'§ôêS¥ÊˆFF„…mPŽäJۃ𥤤Œ?>Ož<Âù¾üòKŒöÜxL^=L©Æ6Ü~Ã(Ï'ëAF%@Û3jϰ^$ EÀYÛ›9sloäÈ´výüó†2etì8)2r³xoÏÂö |óýí·ßræÌ áÃÛ`X¥åÈ‘#—x˜–N,_¾¼z`÷©§žâöü"!Úoð%ÎÚÞ„ ÛE¶×µë¾¶mÔ¬¹ªT©ýúÅÇ'ªm·}ûvLÑÅ Ìr•–±cÇØvXµ,¡¡¡ùóçW;_áÂ…að¾t—³®$@z íéM”å‘€' 8k{;DRÚ^Ó¦™µk(_~ &pŒ"ÞÛ#¹â€íáHMM;wî‡~(WiÙ¸q#ÅÊàúô飹JK½zõNŸ>íÉ{“e“ —mϸ}Ú‘€š€³¶7xpºL2¶Û«[÷Xõê'Ë•;üé§ó¿ývÀœ9aš¶áÃ(áСCŸ{î9á|uêÔÁ*-7“Woß¾}õë×ר2dWiá ˜mÏ„Î&û0gm¯oßÝÊ$Fr¥í•/¶dÉ … g|ôÑ”&MF­XiÛ¶‡#66¶I“&b6Þ0`À™3g.ó00ŒÅ+VLí| ÷ág€U'pžmÏyf<ƒ²€³¶½³HjÛ+TèÊÛo_ã´Â…Gޱ@9’+m—––K˼åË—/$$ÄÀ¶Ãªe=z´æ*-•+WÎÌÌ̾™W&ð*ÚžWqób$à&gm¯}ûýÉšíåÉs+oÞ}  ³a{¾;wbšç믿.WiÁ0ÅÊÈ0¥ºU«VšÛo`'ìºùHòtð ´=Ÿè&V’pÖö~ýõ :YŒäŠØžã¶áÃÑ¥K±J ¬ØrôèQ#ë†wJ•*¥¹ýb´|ÀH€ü›mÏ¿û—­ó7ÎÚÄN3‰Yâ½=×l/==•Á¤ ¹åÚ¸qã®ð06 ¼øâ‹jç+[¶,Fíýíia{H€þ"@Ûã½@¾DÀYÛûñÇ#šIÛƒðíÚµ [®}üñÇB *„wûŒ-t³ª$ð?÷m/ñÁ¹¹cÇIÅŠ ÌŸ?ù•Wn"yÁö |XœÛ¬ÉUZ:wî|îÜ9Š•‘ ¿úê«jç+Q¢„I¶ßÈŸ?¿ºùŸ OÍš5m»—(û×)¿ÈÄvvø•SßnðKQg5Qîžç ¡:U+ƒdö¹6¢/ĽáÑN¡íäþd5HÀ!zÙ^§Ã±~}LóæEŠŒ|啽Ï=w'oÞ}  KIIÙþàÀßr;þ:Òb“\.Äö`{˜;R­Z5ñç «´`¯‘u‡uƒ‘cÂæö-[¶ôûí7±=)M›6µö$ÓöúŽs;“ÏÙžw*LÛsûÎb$àEúÚÞ¶Çòå y|0ñ7"¼c{¾ƒbißwß}Wü™Ä[}111ÈàaXè2éèÊÈÖSO=èŇÀÛ—’¶×©S'ÍA]üµV¡5áCdlÏ£]èyÒ¥ xØemÛÓ) !?!à Ûƒða!$dm½zCêóBlOØŽC‡ 0àùçŸö€UZð‰au‡µk×~øá‡ê‘ÍÂ… ;û™¯<“Òäl ´ $Obq|€•#¹ºß¾b{x^,ÂÆÉÕýf`$ૌ-×°ë†øÄ*-+W®4¸ñ˜¼z'NœPF³äŸ®   o?¾žSŒ¥jàϹ#õRÛ4Ñî<_ÍYâ,Û–é  a½Ý:¨['jî æªO·{Ekå`å|jëHOé•ßlÊžx7@<>Œíé™å€ÏðEÛ«ùÝðY‹SûÆWûvlóæc##4m—™™9{öì—_~Y|÷}ùå—ûÝàa`˜p#WR½àóÙ?à”íÍ›7OpPO³Å{‹·ú”¶P¾(^òÓt ÛC™²’âí@kCɶM¢¦,J´§ bš}ŠÌ²E°[QqŠ]çC» ‡p8Y1œn!ÊÎÖÊv±Ö‰Å{–¢Îê)Õø²5´1óFt‘ÇâuL€t;œ%^~ íùÙ7›C:ðEÛû¦Öˆ‰ ÒGíí;ùP“.›ËTÖ£ÇÌääâ½=q@õ„íáÀ·×®]Å–k˜Ú¥K|ÝXxÌ[µ»wïŠ{«±ÈØžÉm4¤xYˆší9¹°ÉPù΂AZ|wHÛƒ)_óWžˆÏÕß86LW±1ûXÓxDiø¯ôiºvmO6AýúšòZ.×J*C•¬±’Ü,PKµÖt±8×)ÛC5”¢íéð§‘E€ŸðEÛ«ZcäЙH°½ŽÇš k¶'C’xÜdPDD–¦>˜TFõÔóŽ5¿„ed!"†Óåtwj¥¶=Ùv![r$WDû4#²òí:k±R™Áñ)Jê%”i{~ögšÍ!(mï™gžÁÉÍŽØÇ–ÇÖ¿Œ²áûäâ{iˆÕ•Åz{b1'WÌÒðÄ{{_UÏIØ^í^WJVœ°jÕf¶á;zôèŠ+Š-*¾ˆ@Â*-Æ3sÕèÖ­[üñ‡¸•ÛÃÍ3kÖ¬wÞy‡±=ùxKu°P±=AÏb› (eÂÂÛ¤*‰Ðš…@ %ÍÂ85mÏF~ÔA¹Jˆ…t*UUYyGö„°h‚ ž)°Ö k¥| NŠ£fÈj:º Ý©ÇåEwKÍuç˶ç=žKþI@i{"è5yòdƒÛ^¥¯!y2YØÞ¢E‘ƒ-HOß+GrElOØŽcÇŽá‰\¥¥nݺí½É#;üþûïò¹ÂÈ!!!3gΜ>}:mOùuãšíY Äç•Ñ#¥*iF•ä…µP¢Ò„¤SZ{AÍniŽcJPv›à~­”mÔĨì5©\Ž.{Sý¥ÄâàŒk“h{þùך­"w`ß‹- räÈ½È Û[³fóç_ôo°·õ°S"YØÞðá ¿­Ö«z…®&,ïí©m‡Mu[·n-¶\«´\¼x1;„Ǥ׼wïž¼oÏœ9³jÕ*̧AT¶§~œ]³=kC2(¥T1å0¨µïÍwÎ4c{vßNS±”o°Y³vä+N9­™ßýZYLqããv•ËÂöäû”j–CínÎê¥í9rÃ0 ˜ŽÀòåË¡;ràLü0räHcŽä"4gÎÚªUûV®·¨~£?õ»€¤É…íõo1hóÀá½kw­YsàâÅ5mïøƒãÑeË–MΗ/_hh(yx”À;wä+z´Æ`úܹs±ÙmÏÚW ¶gm —ìÊ(Åœ\ÍšHQ*ŽÚödù6ê€òm—æ‚îÈ&hÆu©•ã š‘ þ©_ѳ6\«94ïÂ$Úž Ðx ˜‚`ÊYPŸÆÖöð—ǸqKà|•ê‡}ÛõŒ…í jØ;}ðà½=zlmЬM™–މIVŽä"¶'l–y›?þ[o½%œ«´`#_êŽi ‡çÉWô0†‹‘.\ˆPmÏö·Œ ¶gíe2q!µm('´:¬RÛžrD5kíë‡xâ”2$'X¸ðµk[XݯªjÍöàvh…X9E4Wù?ÏjÛÓ–1WõÛ–ÎÒ í9KŒùIÀD0)RF¹|Âö°‘ÆîÝ{‡ ó•ý~CÉ cÄ, Äö†|ߪ‡”ٴ鉚5£?­üÃÇÍúõ›'ßÛ³°=ßÉ“'ûöí+ViÁѦM /šVË<Ñpå+zbºLppð‚ h{v¿e¤=XŒÚ˜¥á²íÙ_i¾ˆfÛö,F 4ÿé}Ûs­VjÛS¯Û'KV:ŸÚöäûyÊÁ\¡€8ÑîZ3voÚž]DÌ@¦&ШQ#ùmeüØžÜ9mÇŽ]sJ•ê²nÝVa{Ãk´9Ôª’°½ %K^+X°xñ޶m‡¨ÞO?ý$ `tÿ“ æá&û÷ïËç /GnܸqÑ¢EˆêÑöTÎâ´ðƒÛª'öu°}¨Ç…m[ûŽv0¶çr­,lO9ïXXÄƆƊnµ6KC3¼*KsazŠmÏÔÈÙx°KÀGmO윖–¶[¬® ÛY¥å‘Im{ãÆ-Û´)E9’+b{8ð‹[®•,YR8_áÂ…ñO7uÇ´§cEùŠ `ž%K–àåHÚž¸»±=kk¦ÈYÍI²¶…ÉÆH®µuàp9Yå",6b{¶ã‹š_G^Éu¹Vý%GcQ æ\ Û¶gSNÝP/|m÷{›¶ç"žB¦&àÓ¶Õ“¶7°l“SÕªÉdÛ«V­_…J:LMOÏïíYØžp>¬Dó /ˆ¿ÊX¥qAÓJ›k —¯èáÌ­ [¶lmOZš#¶‡uæä0®úu.±=¶'‡•a$³±ö‡æÒ!¶çäÚø>EÌR=dé9Û“Øm{°Z)ûK9çÃÚÀ«mÛ³æ¹ÓpÚž©ÿl³ñ$àÿ°½„„ÔFFµ-Ù4¡t•seË"©moâ¬M¾(ßwèÐ…‡4m_ǘ¼Ò±cG±J Ö©éÝ»7¬qM}Lu–ò½Ó§OGFFâ-=Lý¦í)Gñ±=9qUÓQlØ ·%’e*3Ø]¾ÄÚœVMÛ“Ú˜p 'oxg$äݬ•²¿Y°ÆÚÜùÍ, Š)ºÒöþ¹Ž¥s$×qVÌIf$ ´½òåËãý*î¥(‘˜“+ßÛ#¹2¶'¶ÓÀËuëéU¬~FáâW R¾·‡ØÞè©[±ÓnÿÉû¾o±´tùA3g®UŽäŠØž<°SHåÊ•E«O#:…¹¥<4 (_Ñ»zõ*¸ÁBzˆêÑö”_(2\gc$W¹„n<‹='”Öhm¹c\E½… ìYè£rʪæ`®µõD4mON/ÅU4Û(uÄ…ahk_Ív‘q³Vš¶g-R¨Ü¤ØÚฬdëº3š4h{füûÍ6“€ãZ¶l)œFšÍ!CŒ¶sšƒ¶‡4pÌž½Kî ÿ°Æ±üïÉY°½þã’Fí8í@×qGªX{A­Zƒ¶lÙ!œOó€ä½÷Þ{‚L™2eð …OI«%ËWôðù®]»° ßêÕ«i{êPÚ†MÕ3ð·ßb k£«¶c{¸QáRJPîxkuSÚNT þ·GùŽšEs4myä)¨¤E”QºˆÚbÝдk{nÖÊ"+ûH“ï䉯 /”í …Ö¾Ûi{ŽÿÕcN0#¼©¦´=ñsñâÅ1wRì”k„}r²= ÅîßpÒ¤p>¥íõ½ª'l¯ù3ß\ú⇘nÝfÙ°=ñ+å*--Z´À*-t>å*zxEÌ1tNÛ³ö%b!sê‡N~‚œ¶C…Ò)/$„ ÿ•æ$~V^T-(Ê÷öÄÕÅ$S剚:k¶§9Õ, ª-ÖÓ¶çN­,lO鬒•Ä%fþj긲³ä¨: w™=Y2mÏŒ¿ÙfpŠ@»ví4ÿö`šÂúõë}ÑöÄÎi»wg„†F‰XÛk;d'öìÙóóÏ? JX¥eÔ¨Qf>å+z.\@$8""bݺu´=Ï]Ûö`cz¬Ý‘\¡€2ÀfW¥íá„âÔ5DQšÓlØ*ŸÓl,>Ô›ö‚í¹\+ ÛC9Òç”ß™hX‰ªh;þkm&‡r`Ýýeöh{Ný±cf0;ÔÔTå2Ëò‹ì‰'žhÛ¶-„/c‰#áÁ×Úp`dǶ¿üÍÀ‘ò×±ýÁ’q`M;q¤=8vþu`gÄMlqÀ«Ä±÷¯=gc{ê}ra{-ûín;ò„HjÛûúëþ•¾éÞ±ã´íÛw[s>ì÷õé§Ÿ 8 @4 «˜êÀ+zrè{ý¢Cñ¢°»¯8z&IDAT'V«¡íÙýO‡µÃñ—·D ùñOå‡b›±œíÕ=Di²ò5ÁÕ|‰6ª$.gãDˆëŠ:ˆÒlì-ëHi6ðŠš¨ßVÔ7’ ÛvÔøí·I¥¾_¹ù.ÛŸ#¶×!¶;öÙm{ -¶ã¨xð«GÕF8ùå¹?`Èú›o¾”°JËüùóýOø”¯èaÝA Íã-½Í›7Óöô|ÞX–iÈÀžÝ4‰„¶gÌ~a­HÀ-º-Q¢„Úùž}öYD³|ë½= Q kÒ$ðÓÒ•¶×2¾-TOØ^¥3•Š]*öNHY™ÁšóaU9¹J pA†0èé‡Òó0%¯N"¤‡9Ú´=·*žl>x“OÌt–³[¬­Øg|6´=ã÷kH. AàJí|o¿ýö¬Y³|e–†¦«-Y 퓱½zÛ>ÜgWÚ޲ϥí­\¹ÙšðáóÁƒ?ÿüó‚ViÁ'>-|r*œcÙ˜‡ƒ|Úž‹O37¹%‰üõÅ7öDÒöÌ}/³õþNCxݺuÓ|™¯R¥JXzCÌÊ5òœ\±‹#¹ßl¯]óDM‘ÆöØÎJNNÇÒ}بvh­L.þå—_Ä:ViÁH/ Ÿò½óçÏc5zq\Úž¿?ålŸ È%iÔëN{ðª(š¶ç¨,’ FËšÔ¨QCóe¾fÍšaŒÏ§moìØ¥xKïóo³6Ù}²Fr¶÷U…îa}GþôU¼öù³æ|˜¦*ײÁ*-ØXÂWœO9t‹Õ0t‹ѧ´=ƒ=ˆ¬ŽO{?údÕ•¦íùz²þ$à(¬›U¸paÍ—ù0šiÀõö°Ì²ƒÇ¶m;»t™Q¼~‹WW†ê ÛÃ'8¿ªR®kÚÈ‘»ûö]ôý¯5Kµí×oVo¶Vòœ9sä*-Øo« bÕÃJÏÃD4 éa•DÚž£Oó‘€9ÐöÌÑÏl% üEû­a°Rí||ð¶\ë+dueUOf‹‰Iþõ׉E›7,°µ¸Òöª–í ÕC:ÔªÕ¡:õ¦—ªóÍ'­§O_m­|ü<æ²äÊ• ”0ŽŸ10j@ᓯèá‡sçÎAL±ô5mÏ: €šmw ˜Ž^æ³¶åÚwß}‡Í²×ö0îìαfÍ–ÆGT½%b{('))­jéŽ&ì¶…í«[ƒ½' }T»h³ˆˆxÂ,Ы´Lš4É8Â'=÷.Ö Ü¿?ToÒöL÷0³Á$àÚžcœ˜‹ü޶7ÃH¥:È—3gÎß~û ¯ög×Îia{ÕJµÏlÚT$a{W jQ¨È°k×>$kŪÔEŠ”°J ÞqÌ^çSNÅÀzÚxýˆÝêh{~÷€²A$ 'Úžž4Y øððpÌHP;_ž÷бÂ$à}´=ï3çIÀX"2dˆæË|Ŋüx VôÀ±Bq`ÜBJ8v?8aüCpbFÔ¶¦v0Ãqè¯Ãš÷°Èôô½˜±;¦Ì+~u¦–g©da{ðÞnxÏ}mþüõÖj-[¶[®æµÜ¸qÃkÂ'ïŒáb •CÚž±$Ö† L€¶gàÎaÕHÀ‹+‚ͨƒ|øä‡~ˆõQÛƒ!h7bÄ",Ë7óãêg‹}‚9»b$WÄö`{“íI»[íØ¾ÒoX™O|®y`ç±2eÊJùòåÃ8¯§…OùŠü3K„!Óö¼øpðR$àóh{>ß…l èHC·rÍ9¥ùáe¾Î;{.¶'ƒ|žûaçÎ=}ûÎEoI¡Š× ¶‡Ëuî<}Z³ž˜±›Ñ©^ìÛZù»ŸK4kÝzBll²µÊ½ù曂X¥ÅΧ|E ~;. ù›ým+9iWØÞ÷ŠbäWT ™­Õ->>¾~ýúBøð2Viqßö”«è]ºt —¶¦z|oÏÞ]Ìß“ <$@Ûã­@$`•^æÃTõË|˜¬Ð´iÓ¸¸87gixÓð¬] ¶7¯òOrÒ®Úö°Í.â| n°VªU«Š/.(a·ìÀæšó)_ÑÃhˆ,Ši.¶ÎÉåL$`—mÏ."f ³@ KÍ©ï¹çžëÓ§ksråäÜlÿaذ¦ŸµŒ+_]ÌØE±½ªUûŠºÁöÆM®]l£F£Â÷X«p`` r•¼fç”óÉ›  ?~Üžãýý{ÚžÙŸO¶Ÿ @Ûs³ ü ù2–ë›={¶³+°d»ä)+Q§Îà^Ÿ4Ø[쳻쳰½i!i¤·ï·©bÕbX³þ_,L-ViÁ 8†Âoݺ…ˆíCÞ\xEïÌ™3r!§~àêÊ|FI€l íñö p”VzëÖ­›æË|UªTÁê$v×Û³ñ Z¶ÿjæÌU5j VäÛ#ï¶'ª„ØÞع»‘N;ÐuÜ‘:­cJ•0g÷uŽŽŽ®P¡‚…±J‹ Û“è1Éñ:±r¡ mÏÑ›˜ùHÀ”h{¦ìv6šÜ €MÆjÔ¨¡ù2_ëÖ­±†‹Õ•³]élW7nÜ8ß j(mž'l¯ù3õzŸÿ¼ÚìQ£Ù(mÞ¼y ”°¨ ¶¶p>ÙxE‘Bñ¤;‡AöÉíÝ»·7O%ðÚžG°²Pð{ˆ`in¹†—ùFem/ ƒÛž¨^jj:^æûå—ñ2¶×kB¦HÂö¾¸T¶ÎjäAbRÒkíêÑ£‡\¥‹WcŽ­r*Vу:‹ÙͺX{~@¸SRR’““·mÛ–˜˜ˆ-1Ÿ;ünÙ²ñ×M›6ÅÄÄ`*ÉÆ7lØÖØ@oíÚµ«W¯ÆŒ“°°°+V`D%—,YºhÑ¢… /X°;wîÜ9sæ`ø~Ö¬Y3gΜ>}ú;ï¼#í¿M›6çϟǨ´ß?l øÚžu«J†#€© š[®*T~ Ü9MìŸæ‹FrÛŽD/\¸€7óÄNtº±=±0õ•+WtºËX €[h{náãÉ$@‚†n±‡˜Úù0ŽÙ¡C8ãKŠ-gzúî±cCñ2_åVÖéq ª'mU…íAõF¦ì”Ðã«^¿"ÛâÅ4›€‘Sðyíµ× d=²}$W¹ɹs甃×|^H€²…m/[°ó¢$àŸÁÊ—/ŸÚùòæÍ;a£iœSõIIIƒØAæ*6ˆ¨ÑõalOØ^ƒÁ=úîîÛco¦™M¿N¬S¢uÓ† GFG'X”/m6æé#{ßÛ³Øq;¿ùçíÎV‘€ï íùN_±¦$à °åÚ!C4_æÃP&ÞZ“3v}ñ‡„„í½{ÁùJVœ0dÈ4ÿývXû¬Mv´…íÕ¸°?¬qN™7omõêý‹ô®ûî‘ÂÂö,ê†]+ÄH.ZêåÃ{i Ë”]ùí·ßb—Ûª‡ßž9s†Ï €÷ Ðö¼ÏœW$Sˆ/Q¢„Úù°åZŸ>}Œco®Õ»Ø`·ÀØÊ¦²½âÅ‹Ûõ<™á=S?ÿl|6 íex^–ÌM`òäÉš/óa«‰   ]¾|¤¦¦ \»ö ‹F¬_¿^Äöióþ¡û>¹ÊØžS¶‡­DÌ}ï³õ$ h{Ù—$l¹†™¹š/ó•/_>&&Æ—•O£îÒö ^Ùr`»Í›7c¼l£¢¢°Ú3¦ c|yݺuX{íÚµxrÕªUaaa+V¬Àʈ˖-[²dIhhè¢E‹°ëqppð‚ æÍ›7wîÜ9sæ¸l{GåýO$àe´=/çåH€þA sÔ¨QCóe¾V­Za¥’t9¤íÁº²ë0‚íaH÷Þ½{| H€¼I€¶çMÚ¼ €6Ä–0†«ù2ßðáÃýÃ÷¤íÅfßaÛCX—O €7 Ðö¼I›×"°E 00Ps˵?üpþüù;}üÀ€©xoÊ•‡û#¹3gÎD8ö‘G‘vîÔ{{œ™Ëoð>Úž÷™óŠ$@V êÓ®];Í-×*W®Œ·Í|Wù¤íÁ·²÷pç½=ôfO[tPÅŠŸ“‹œ'Ožä3@$àM´=oÒæµH€"€fávš[®µmÛQø¢óIÛƒleûáÂ,!C†,XPÝ)¹råÂܧl5z ˜‰ô#@ÛÓ%K"Е¦…æË—O­yòäÁ˜oš¯x7QŒäFàpÊöfÍš…èfÀµ~ýúX)Ú)Õ™u½SX €´=Þ"$@Æ%€-×RÒ|™¯X±b‹/ö!å“¶Ó2Âáà ,5züñÇÕª‡wõœ é)¥ðþýûƽíX3ð;´=¿ëR6ˆü޶\kÙ²¥fl©víÚ˜áºÃ,h'b{Ð,ƒ¶×ÛëÝ»wÞ¼yÕØŸþù)S¦¸ÏSžòçŸúÝ}Ê‘€q ÐöŒÛ7¬ €’@jjªæ–k9sæìܹ³ñ}OÚ^¤ak¶7mÚ´"EŠh.‚ئM›={ö¸©z‡æ½M$àM´=oÒæµH€Ü%¢¹åÞð›8q"ŒÐ°Çš5kDlŽeœÃb/ ì™ñÝwßåÈ‘C­zÕªUsí=µr–†»Ï'' ÐöœÆì$@ÙM/óhn¹V²dIÌí0¦ðIÛƒ`ê;§µnÝúé§ŸV{޻ヒ-ÔÜŒç)O?uêTvßD¼> ˜‹mÏ\ýÍÖ’€ßÀË|õêÕÓ|™¯qãÆXÐn»ÁìB+b{ØTÃPlsœ5÷2Á+z ÐÑóDQçÎó›û !Ÿ @Ûó‰nb%I€´ `1“Â… «ïÙgŸíÑ£‡¡|OÚìÊ8FÆË”)£)͘ƒ(©îª‡oܸÁšHÀ›h{Þ¤Ík‘ x„ÀäÉ“5_æ{çw0áÀ Î'mK±áX¹rå?ü ùŠ^éÒ¥1Öì ÏC™˜¢Á ¹y X( X'@ÛãÝA$à°åZ·nÝ4_æ+[¶,V†KÉîu#¹˜œ›íVWyñÅÕ!½7ß|3((ÈCž'ŠÅ¼?Üpl øÚžOu+K$`“@ff¦æ–kˆ`a•àøøølT>i{˜®‘Çøñã?øàÍ Ð°G=O~íÚ5ÞÅ$@^&@Ûó2p^ŽHÀã0Nª9ç/ó <89›Ž°°0ÛƒöeËÕU¾úê+}7@sÖ;Æa\?¼ ¨ÐöxS ø'Ì3ÕÜr ‘- Vz_ù²×ö~þùgOl€æ”íá½;wîøçÝÆV‘€± ÐöŒÝ?¬ €ð2_»ví4£Y•*UÂÄØm^<¤íaz„7¬MøòË/kn€6vìX§tÍÍÌè7:“§’ ¸N€¶ç:;žI$àöîÝ‹‰jÝÁË|XOxëÖ­ÞQ>i{+¼uL˜0¡hÑ¢žÛÍ)ùãŠÊ>ñ°°’þJ€¶ç¯=Ëv‘ üƒöØÀîjjõy饗FŒáá“¶‡šxú˜?~­Zµyän€æ¸íaöÌýû÷yG’ dÚ^v‘çuI€¼M[® 2Dóe¾>ú†”äÉ£·b–Æ2-Z´Ðl#6@ v\ÑtÌÉy¸Þ¾×y=ø'Úï sÀzoXEóe>ÄÃ0Ÿ×CÊ'mo©Ç¸ì믿®ùŠž'6@sP/]ºd®;Œ­%ã í¯OX# ÏÀÚ{%J”P‹QΜ9Û·oŸèoë‰ØÞ3fÌøì³Ï¼¼š#¶Ç-q=/ó $`ŸmÏ>#æ ðWÅŠÕ}ä‘ÇÕ’„7üÆŒ£¯òIÛ ÕõÀàlíÚµ5_Ñóèhލ¨\]Ï_Ÿ¶Ë·Ðö|«¿X[ = Ô¨1èãÛvìØEsË5ÿ-Z” Ó™"¶·X¿»_h¾¢ç… ÐìÚÞ‰'¨zzÞ¬,‹Ü @ÛsO%ðq°½âÅ;ž:uQ¨5jhބ֫WoÆ î+Ÿ´=¤ûǰaÃ0ëÂÚh{öì±kcÍpôèÑßÿÝÇïVŸü‡mÏú’-!p–€´=qbtttáÂ…Õ …-׺té‚WýÜ90WÄö°ƒ™;Ç”)S*V¬˜½ Ù6EDõ¸Þг·"ó“€G Ðö<Š—…“ š€…퉺Nž<9wîÜjÊŸ?ÿĉ]>i{!n?ýôÓÿû_uÝŠ)‚½w=®s°pDIÿøãC÷:+Gæ#@Û3_Ÿ³Å$@д=ü{|uëÖMóe>L}€·¹à|Òö0¯Â…£k×®yòä1Âh6´3pù®/0 Úž;…U"ðk¶'.-×*W®¬¹åÚ?þçÌUöÄHî'lõQ¨P!ƒl€fCõ.^¼è¥nãeH€œ$@Ûs³“ øÛ¶'Šõ– ( ù2_ÿþý÷=a{¯¾úê<‡©S§~ýõך««àÕ=LqptÕÓÙ>ÌÝ2üè±`SümÏ;•M"p€#¶'Š Ô\ëä½÷Þ›6mÚV¬©ì”í5nÜøÉ'ŸT[f6n€¦i'Ož¼wÀ™H [Ðö²;/J$`ŽÛª‹—ùZ¶l©9¶B… aaa¶•OÚÞ{G÷îÝ4ÚhjÕCHL Ñ‘¬ €M´=Þ $@æ%à”í L©©©eË–Õ|™¯I“&QQQ[¬ØACÄölÈÞ¸qã4÷sÉõáÒž“u¼|†ôÌûذå>H€¶çƒÆ*“ èDÀÛWÆRÉØ]Mí|/½ôÒ!C4}OÚ^ÖáàêÕ«s4 ÌÌÌdHO§Å€—Ðö¼š—!0 —mm¹}û6ÄNóe>¬~£³p>i{³TG‹-4_Ñ3ÂhJÕƒç]ºt‰ËéðNf•HÀ6Úï ópÇö5,&Œ­Õ4_æÃVl+W®Œýë¶7Sq¼óÎ;†ÝMª^Ñ»pá7C3ï£Â–û8Úžw «O$à÷mO\‹-k¾o÷ÄO n'|OÚÞŒǨQ£4ßÿƒùÕ¯_ß8«« žGÏsãã©$`´=Ct+A$-ô²=Qy숦¹åff`…äÅ‹‹YÓ§O¯U«–µ Ð0u×ñ©ÍyæÌ™ëׯgK¿ð¢$@ú íéË“¥‘ ø}m-ÇË|œÕÜr­pá°½^xAÓŸþù±cÇzÔÞ,üرcW®\á ­/ÝǬ+ Ø#@Û³Gˆ¿'ð_ºÛž@…ÑO¼´§ù2Ÿ17@;zô(¶¸Å~÷ïß÷ßÞfËHÀ¼h{æí{¶œHÀC¶'ÀFGG‹xž mÚ´ÉÁ¨›ŽÙࣧN¢áñ “ í™¤£ÙL  µ=q½É“'kÝ~ðÁØ~ šxíÀKx·nÝbôŽO ˜mÏ„Î&“ <$àÛÕ°q·nÝd„KôAÙ$@$à5´=¯¡æ…H€ GÀ;¶'šÁSLà äF†»X!ðw´=ïa¶HÀ:oÚûH€²‹m/»Èóº$@ÙO€¶—ý}À xžmÏóŒy £ íµgX/ = Ðöô¤É²H€|‹mÏ·ú‹µ%pmÏ5n<‹HÀÐöü¡Ù {h{öñ÷$@þK€¶ç¿}Ë–‘ üM€¶Ç»HÀ¼h{æí{¶œÌD€¶g¦Þf[I€þI€¶Ç;‚HÀ h{fèe¶‘H@›mw €ÐöÌÐËl# m÷ €y ÐöÌÛ÷l9 c{¼H€Ì@€¶g†^fI€Ûã=@$`^´=óö=[N$ÀØï 3 í™¡—ÙF Æöx ˜—mϼ}Ï–“ 0¶Ç{€HÀ h{fèe¶‘H€±=Þ$@æ%@Û3oß³å$@Œíñ 0Úžz™m$`l÷ €y ÐöÌÛ÷l9 c{¼H€Ì@€¶g†^fI€Ûã=@$`^´=óö=[N$ÀØï 3 í™¡—ÙF Æöx ˜—mϼ}Ï–“ 0¶Ç{€HÀ h{fèe¶‘H€±=Þ$@æ%@Û3oß³å$@Œíñ 0Úžz™m$`l÷ €y ÐöÌÛ÷l9 c{¼H€Ì@€¶g†^fI€Ûã=@$`^´=óö=[N$ÀØï 3 í™¡—ÙF Æöx ˜—mϼ}Ï–“ 0¶Ç{€HÀ h{fèe¶‘H€±=Þ$@æ%@Û3oß³å$@Œíñ 0Úžz™m$`l÷ €y ÐöÌÛ÷l9 c{¼H€Ì@€¶g†^fI€Ûã=@$`^´=óö=[N$ÀØï 3 í™¡—ÙF Æöx ˜—mϼ}Ï–“ 0¶Ç{€HÀ h{fèe¶‘H€±=Þ$@æ%@Û3oß³å$@Œíñ 0Úžz™m$`l÷ €y ÐöÌÛ÷l9 c{¼H€Ì@€¶g†^fI€Ûã=@$`^´=óö=[N$ÀØï 3 í™¡—ÙF Æöx ˜—mϼ}Ï–“ 0¶Ç{€HÀ h{fèe¶‘H€±=Þ$@æ%@Û3oß³å$@Œíñ 0Úžz™m$`l÷ €y ÐöÌÛ÷l9 c{¼H€Ì@À!Û‹ŽŽ¨Q£FY$@$àGž{îõ\¹^)Yò3?j›B$àÃÚµk´wï^}ÔŽíá’¹sçþ    o€±êè|VmïôéÓ•+WöV£x    ¿ <öØcºù´mïòåË… &r    l$€WéÜ> Û»}ûv‰%,öÌËùßÿòÇBU›2‘ x‚@¾bþ“ëY ›×nº¦½al¿­Ùp<.—¿ÈgRÒ›sÝö”ó3þýÈ£oº|' €/hãìŠêù ÑÄØ|ÀL‹Ï¹PŽ«˜œ|§‰«LNÀ°Í×¥kpóã>î¥W ÛLVŒ¼@૚Cás11éšövêÔÅoïu¼$õÇnc”s5\XŠåalO¹%náÏ¿¹r €šÀW Ú:k{¯¿[Ô¢œ®“W¿_¢¼úóv£‹ÂqÓÂoÜs<Ș™€a»^¯®´(é¹<¯eÙ^ž× ÛXVŒÏko¼[Ô‘T¢Ò·åà\]º…à¶—±ð ¶½¬ xš@í†Yq»Õ«“lxfo ÏWÕ¡2ß5ï&ŸfæfÙVg–E¼_ìóéë÷2‘ h¨Ùè¡í½õþG.#z!o–í©Kè5a‰xq— ÷éIÀ°Ýç~×à®wþß¶—÷5ö—#O(ÿe_ÍÙ¸ò'fæNY³«Ï¤ÌÌuv™å,Û«W¯ž|ü*Õj´!ƒ‰H@“À·MÚ‹‡%ÿû¹ŒèÅóÔ%LZ& ÇU\.ܧO$ÃvŸ;]Ó¦ÿdÜíò¯LåÚMÅ?ñ ¶½¬ x”À”°p¸ zÙmÕjrµõÁè«|Ž¢££íž«Ìe{%J”ç7hÝc~Ô~& MušvË;|ä,¢kvàt¤Ü/çC ø¯øgÃ6¢¨SÚ>Ä?{ŽžW¶Jmd WŸÛNȃœÊ³dùêEp!üJTL\Hž¢Ì0!t«²>ÈYµNS|¨K}P\  ¼ÅJUT^Ún«‘5Áém×±†u°à 2Љš+ó‹ÖÉ[u¡¬§t²(™WùºîÏ2ƒòd3/BóÒ¿öùÒT8 …«ÏùÕ—Ãç"³Ì`­pdÀ¯Ü¯kQy|îgm׫†²MÑä,.Ôh‚(έÇsÂÓD‹¿T®jmÍß⢚pŸXëôO>¯¤>EÞcøÁÁ{ÌÍ®AÐdTRÙ•š”éhæ!ÿ 0tjÖô ÛS4„«MŸ¾>kM¾^!høÇ¥*Êï‡nݺ9g{—/_V~¹Œ›¿~iìA& Mõ›wÏKÁ‹9‹h|ðœ…$JÀß?ñÏòÕj‹¢†ÏX!%¯‚+"/]I>§š—nÛ{”2ƒ8 Iy9”oQg! ²püS|"«¤ÎPýûŸE}¤dà‡+â,Jv¶>?·ï« ŸÛåÜÜÉ 5—mWBë6dª›5”}$Ž ‹k‰’†è\ååÄm#z\ü ê‰ÿ*KC9â·¨¹Åo- …ãtÙpqŠEeÔ·Š¼Ç$Ù y«XÜÞît¨§¾ä`·s™ü’@¿ÀÕp8lfר09Ût_Õê4–ßóxÏî¹ÿˆíeff*m/,î0 €5?¶è$ž—w s™RžW²ŒJ]ÂèYaòaDžA‚•—À?ʼn8Sù«É 7Ê_umQ±ûY«³< Ð4q".4gU‚øY™å(KFäo-~år}$YG ƒ$êÊX`Á¹5ë7Ól»Ë5×ÂQñë:uÃ'ÊîSþVÞ6¢ßoÜ%«Ä(~+á#rÊ+Zô¬ìV͆ËÊXÔÓö=†KÈ&‘Ew‹_9Õ5ÖºOv™#ýË<$àz Y‡CÜή±ED¤"g³ßfB«ÎäZ¶lY»çþÃöâãã•¶ž˜ÉD$`@ÃVmOMÞWòÙM%Ë~©. gáô÷ ³øÕ¸9Û^ÀÈéê¿ü¦®xZQ åoqÍÏeyâ/û)O5Á šM–,®(2wî(N·h‹Ëõ‘4/g­S¬ñùEéRCÙ^ÍnŵpWTÖVÞ6ø|YÌn‹†ÈÞÁo¬I´ø­<ׂ‰ìša“C4ÉÈÊÌ’”÷˜æ‰Öî1׺ÆZ—‰ºYPâ× ˜‡@×¾Y‹ía9=»Æ–’r96›8z†vÏý‡íaZ‡<ù‰œ¹6l;ÂD$`@“_:+ÿïÈîÏïþX]TÞW^ljê_Mš»ê/Wx]³Ýú?´+TC™AˆÿZ«vÐÒ‡¹ÅEʼn8Aó\Yò¢ð$uÛźPIÀ¢¶oHYIœ®Î©Ys׈}ö—Uœ²P³Jø\³åmóUõºêåo5ïM&òB¨’58¿ué/*S»As™Çî=&ϲè׺ÆZÝÐRÛw,¿‚HÀ¿ üÖ)Èîb{ÂÕÄ’{õŒƒÆË?:ùòåsÎö”K+çÎórÌö£L$@ÖüÜú¡í½üêëþØnªZ£®º(œ‹'çZüjÚ‚ÕâIVÿJä”P yî˜i‹lŸ%rŠ‹â¿Ê‹j~èBe…Ý©fíÞŸñ0´‰æÔý©9 ±}ŠË5´‹ËgyÛ(;NVÒöo5™ ™¢Ó5 %Ï[þPñ•½ãÚ=fíÞ³Û5Ö2 Jê»ÑåÒx" ø_ÚÍ´±C®RãÄn¹Õ¾ˆ6Êï.<>Î.°ü/L╪øÚëomÝqœ‰HÀ¿vÏˇE>v™Ò+ÄK]¬ൢp\E³pÍ ²J(eZKâ¢8Pˆ,ÜZMÜÉàN}ìÐIJpå&Ù:ÑFü³L¹Êº ‹LQŸâZ Q”]\¸–ȃÿ*¯+¯8aÆbõÑìwM&èeyÚètIC^Ô.akìžèÔã êoAÉ©˜™|š@ýáp¥µŸÃ.ºYÛiTé‡öâ D ~°{î?Fr•¶‡Ø^lê1& kš+lÏeJ"D„?x%Ì^#žd\E³pÍ ²JÊo?£Y¸µš¸“ÁúØ%`9N”¤l;ˆÏ{£<ѵʺ©;NY¸¨®«yE%|™AÖG³ß5™h6ÖZ§++c—°µ vOtêqФäT ÌL>MÀYÛ«\¥Ú;núÑñ°;g{#¹Q)G™H€¬hú×H.†¢\¦$Gr-J˜2ÿáH.®¢Y¸fY%—ç.‹–…[«‰;Ü©]¶™ž¶¨ÎÍÑ(Ñ.åQ¥F]y®k5”u³ÝõrŒRYUyE¢n‚ü­f¿k2WÁa÷]d(õÅ—ò¢v [Ë`÷D§MJN•ÀÌ$àÓ~iëôH.Ú‹¯8ùµæôH®r–Æ‹/½¼>é €5Z=|o¯™»LIÎÒ°(aÂ_³4pÍÂ53È*Y;ËF=­ÕDžâBwêc—€ƒÌCÖ&uéˆ r ¾"ñ‰8Ýåʹv‘"§2¼"¨>×v}4™ˆY84 ´Q=»„­e°{¢ƒ]#²ÉYNÅÌ$à7~íèÜ,º F£í#¦IÛsz–†ÒöPÊš„ÃL$@ÖüÔòá ,XBÂeJb™:u cg?\WÑ,\3ÃÐIÁâùw¡JÖj"¯îBwêc—€³Ì—Dï’ ‘|ZöKqºË54ðßy«4k‚ÏeeyÛ êåo5û]“I­®#híV±Ê.akìžèT׈N+§Îbfð]œ_moß{¸´½ 87’k±ºòŠ­‡˜H€¬hÐâï½4\¦$„Û X”0jÖJñ$ã*š…kf ‹—†±02ÝZ­GlV¡Ìc­&²2¸S»Ô­kßg…zÚ…&»\à Õ®ŸlíZòö@}”U•Ÿ£ê&Èßj«É­·Šú.’å|°72”(SI~h—°µ vOtêq{iXPrªf&Ÿ&ÐgD˜ƒ«+‹½4~þu:ÚÛÒÕ•-vN3}èæƒL$@š¾oöÐö |XÌeDb³,ü×¢„aÓWˆ?ḊfáÖ2|ò×¾jØeUóÄoê=Üu9•DMl´Åµ .×G6ÐZCÔ­·`ƒ€f­¿õz(FÊ2]«á´åq²ïPUu÷)÷OSþVÞ6ê³MþV³ß­uº¼VÓö}5;@Ô·“Ë÷˜ ]cãuS?.?S<‘|‹@ßюtilï·n ÐÀªµÿÞ9­FÎÅöû©§ž’±ÁŽ&…D`"Ð$P÷Áöö8Þù Øà©ËLEå~àXøoïÀùÊ_¡4Q8®¢yukFÏ‹eâø¢Jm‹s· ¸ÅÅYh‹µîv-ƒËõ‘ Äu'/‰sð&Dý­µJ2ʶ»\Ãjuz3ŠmÝc¤¬!~–«¬¼¼mPu£äo5ûÝZ§+»?[‹Û@0±¨‰Ë÷˜k]c­E—YÔÍÁîf6ð#fn‚Ãõê5Ï®±aw5älÛ3­.Vª¢ü2ïÖ­›Ýsÿ± þý7äùu~î8wc €&ïš¶—‹ã?ôŸ¼LYÚÛï$ÏÍ÷5üSüÙÄ縊æÕmdhÙýïuPf™¯¾C!Uê4ÅÏòZêbÅoeÔu9ƒkõAd…ñƒhˆÝ[X”g‰¶#}Tª¢ü\]ŽË5´è>QOY^Ÿ(«-o‹;Aä‘¿ÕìwŽF)o$t7JÀ‡ÊNï>zž²&îÜc.tµ¾ -(Ùíhf ¿!0¢¿ôøÙ—ߊʣŽßŠhˆl»h>ØZk»,Ö…ŠsåÍ€äUp]|âÒÊjËœê;AYŽf¿Ûít\ ¸D«Urí²}9—»Æ¢2¨°¸µï\æ$?#P©êh¶Áµ!mØHãóÏ»"ÛØåi='>|ÕG&]8m{‹°ô›µaš=L$@$@Nè26T|¿ù^Q§Ndf ³¨Ûd"4SnmH\y*V8Uê·–¹Â… ;¥zÈœµóÆíÛ·•5¾o70pÕ.&  %ª?¶}>Ïko¼[´Ç”Õšd¾mÙS|#'Ñ‘ € ­û.µ;QCLѨ×l ÊyíBÒöÚµkçŠíáœzõêÉRŠ•«>|E: €’@æ=Ä÷ä'j©É \˜ø\ž‡Ó5:OZMt$@$`ƒ@ÿùY éa õÖÔM¼´×aTx¿qÊ—ö–/_î¢íÉ‚{pqjõæ½þ–´Çì‹¶‡×ý{ì1YVµf=û…î`" P¨õÛ ù= ó“I~øj"$F$@ŽhÔ-ÄÆ:,bí•z¿Ì@Q¹ó½#¿d*W®ì¬ê=|oOœ¦Ì}1ß;½ng" ° ðcŸiï|üÅ3¹ùäW0>ù¢^kâ"  ôX\º\O(]zú »pᚘÛvÜÆfCCÜÆý‡íÅÇÇ+‹«Õ~T·)L$@$@j¿N\ßhàü2uZ#}Ýj@ó‘ËH‰H€œ%ð]‹éPº:u†Y¼½×¥K>¯V?¾]¬¬Ô³|ùò¹Øû‡íá˜Óû÷ÿ§æÉ×vV\ÇyÉL$@$@$@$@ºh;#®t…ˆ]ÿþ ¥Æ…„dí«öiÉοŒ‹ªÓcª2¨ƒí)çj ôÒõ;´™½‰H€H€H€HÀ ^·CjÕjÒœ9¡}âŸu:ÌÇåžõmi{¹sçva~†°Ã¬õö”‡rÏÜÿ{$G¾ó~™•ÈD$@$@$@$à ?ô]ñYéîBòDªÝ)*Z¥¡2°7yòd×{¶‡×”EçøoÎzC—7›žÀD$@$@$@$à ÆÆÔê°à›V³j¶ûÓÈ ¸Ä§uÛ)}Ì…ý3”jhÛÃï°Fó?…ï‰R {5šÏD$@$@$@$àQõGoxëÓªJÃÏƹØÓˆíá#Œ c5‹Ëäzñµ7KTý°JS&    OÈón‰ÿyÂÂÁ0­ÂÕÓ¶=!|Êù¹Wå?I€H€H€H€¼@`È!nªžUÛÃ/°»F5¼Ð ^‚H€H€H€HÀ‚ÀSO=åò’+‚¨ñÞž2Gxx8fü²H€H€H€H€¼F·Ó§O»ÕÓ^E³\l³y¿-[¶,ËÃ\¹^A²—‹¿'   KË—/ÏÌÌÔËóœ°=}/éߥ‰•rü»l €°3’ëC-1HUi{éVƒH€H€H€±=Ü´=`e¡$@$@$@®`lÏUrVΣíé ”Å‘ ¸G€¶ç?ÕÙ´=²8   ÷ÐöÜãGÛÓ™‹#  ЙmOg Œíé ”Å‘ ¸G€¶ç?ÆötæÇâH€H€H€t&@ÛÓ(c{:eq$@$@$@î í¹Ç±=ù±8    ÐötÊØžÎ@Y €{h{îñclOg~,ŽH€H€H@g´=2¶§3PG$@$@$àÚž{üÛÓ™‹#  ЙmOg Œíé ”Å‘ ¸G€¶ç?ÆötæÇâH€H€H€t&@ÛÓ(c{:eq$@$@$@î í¹Ç±=ù±8    ÐötÊØžÎ@Y €{h{îñclOg~,ŽH€H€H@g´=2¶§3PG$@$@$àÚž{üÛÓ™‹#  ЙmOg Œíé ”Å‘ ¸G€¶ç?ÆötæÇâH€H€H€t&@ÛÓ(c{:eq$@$@$@î í¹Ç±=ù±8    ÐötÊØžÎ@Y €{h{îñclOg~,ŽH€H€H@g´=2¶§3PG$@$@$àÚž{üÛÓ™‹#  ЙmOg Œíé ”Å‘ ¸G€¶ç?ÆötæÇâH€H€H€t&@ÛÓ(c{:eq$@$@$@î í¹Ç±=ù±8    ÐötÊØžÎ@Y €{h{îñclOg~,ŽH€H€H@g´=2¶§3PG$@$@$àÚž{üÛÓ™‹#  ЙmOg Œíé ”Å‘ ¸G€¶ç?ÆötæÇâH€H€H€t&@ÛÓ(c{:eq$@$@$@î í¹Ç±=ù±8    ÐötÊØžÎ@Y €{h{îñclOg~,ŽH€H€H@g´=2¶§3PG$@$@$àÚž{üÛÓ™‹#  ЙmOg Œíé ”Å‘ ¸G€¶ç?ÆötæÇâH€H€H€t&@ÛÓ(c{:eq$@$@$@î í¹Ç±=ù±8    ÐötÊØžÎ@Y €{h{îñclOg~,ŽH€H€H@g´=2¶§3PG$@$@$àÚž{üÛÓ™‹#  ЙmOg ÎÆööîÝ”™™©s=X < @ÛÓùFpÜö`x5jÔø×_G»víNŸ>­smX €é Ðöt¾±=XÜNzžüá±Ç ¸|ù²Îubq$@$@$@&&@ÛÓ¹ómÛÞíÛ·ásO=õ”Zõä'øm`` rê\3G$@$@$`J´=»Ý†íMž<9wîÜ6+ÇâH€H€H€ÌG€¶§sŸkÚÞòåË ( ö¼GÍÑþ·&Ñëüøýß/ð)³.\çê\EG$@$@$`&´={ÛÂöâããË–-«σámßv|ÿV‘⣗|Y¡´fN”­sEY €9Ðötîgi{Sn•÷eÅÒÑëCŽˆS§•¡Ó?-^TÓù0˵è\]G$@$@$àïh{:÷0l¯hÑ–šSnápE ¿:â‰ñ¶Óü™ï̯é|5âB-:÷‹#  ¿&@ÛÓ³{1‘6oÞOÿïÿU‹Ú+/¿4cò°OÇ ÀYš µÀ&¹P‹ž=DzH€H€HÀ Ðötë[,›¢9åö…çŸíÛ³ÝɃ ®%œ‹Ô·…Z°˜ jÑ­ÿX ø)Úž‹i³X0EsÊm‡6?ïMåö¹]Îßé»iãºÅ%?ýØÚB-\œÏ$:›I$@$`Z´½ÿYŸrûh§ö­öïÞ껞§¬yȼÉï¿W@Óù5jÄÅùLûÀ†“ ø=SÛž­)·?ÖÙµ=úÜñt?KS'åå.Ôâ—O>E$@$`þo{6¦ÜvîØúྤó§ö2@ô†åU*—·¶8j1Ï—[J$@$àgüÙölL¹môS½=i[.œÞÇdA`åÒ¹Å>*¤é|ÜuÍÏ~6‡H€HÀ$üÓölL¹­R¹B|ìZJžmsƒ&äë çÃì “<l& ø³=Sn‹}T8lÙ¼‹g2˜$0aì_|Qé|þtë³-$@$@$`þc{6¦Ü¾úJÞyA“.žÙÏä8Û7.ݸzvѼ ´=“|°™$@$@þJÀOlÏú”ÛçõïyñÌ&Ç @òþüã³Çwm >¢GmÚž¿>ül €Iø¼íÙ˜rÛµS›ÌýÛ/=Èä k—NüñÇïW.KÞ85"¸Ëúùh{&ù"`3I€H€ü˜€Ûž)·Öß—ï â0\½xì÷ûwn߸¼sËüÈ…Ý7„t¥íùñcϦ‘ ˜Š€OÚž)·U¿ª˜´5âò¹CL¸r!óþ½Û7¯?°#c{6§Ü¾<ÎÔËç3™'pûæ•[×/œ:œ¿60fi¿è%´=>ÿl2 €ø†íY›rûâ ÏØçÊ…#Lޏ}óÒŸþqáôþäÈ©›—Ü´lmÏ :ÛH$@$`ZF·=kSn{ôÑn]Ú=´ÓqËaÎ×Ί)·é[CbW]1˜¶gÚ'Ÿ ' 0ãÚž)·¿´lºoòÕ‹G™$pýêé?~¿wëúÅ}É+¶®±%lmÏ<9[J$@$`rF´=Sn«Uù2=5Ë…09HàúåSXZåέ«‡wmŒ[3:nõHڞɟy6ŸH€HÀlŒe{6¦Ü–úìÓÈõ+¯^<Îä8ûwoa´“ÖOˆ_;†¶g¶Ç›í%  0ŠíÙ˜rûvþ·‚çÍÀ6Lޏ{ûÚÛ×ÎMK™•¸~|BøXÚx  0'CØž)·£†8®8Ì wn^ùóÏ?/ŸËܹeAÒ†IIh{æ|¶Ùj  ²Ùö¬M¹}òÉ\Ý»v8æðõË'™$pûÆ…?ÿø/êíK^‰n·EN¡íñ9'  È6ÛËÌÌ,\¸ð¿´ŽÖ­šÌØkarÀÍkçþøý>L>¼+r{ôŒ”¨é´=>Û$@$@$@ÙÛ+[¶¬ÚôªU­¼;-éúåÓL¸yõÜï÷ïÞ½}ýøøÔM³ñ–mÏ6 €’@¶Åö{ì1¥í}^ªdÔ†57®œarœ€XZåì±;·ïØ<‡¶Çg›H€H€H@M ÛlO©zút¹qå,“ãîݹyïÎ §2ö&-ÃlŒ´Øy´=>Þ$@$@$@š a{ÛT¹prïÍ«g™ì¸wçúÿþüóÚ¥“ÛפÇ-LßLÛã³M$@$@$`ƒ€!loâ°6+Æÿ|áÔ>Ì6`²Fàî­«þùÇÍkç§GîNÝ¿˜¶Çg›H€H€HÀ.CØÞÔÑ]ÖOXùPøÎCh˜”n߸üÇ¿ã½ãûã0t»'q)mÏîÍ $@$@$@‚€Ql/[>DLZ>¦á¹{n]¿À$ܹy K«Ü»{ëô‘ûRÂö%¯ íñÑ%  pŠ€loû¦ÙI¦¬×ôDF­ëMŸ.cilt‹©ÒÂ3¶¯¢í9ug33 €áb{°½ÔÍsS¢ƒVMju yííM›~¿wSn¯œ?ŠÕ’ìߟº†¶Ç'–H€H€HÀ5ÆŠíÁövÄÎOÝ$@$@$@"à±=a{ûRV¥o]6±Ezì"ßµ=±„&Ÿ=žŽÙ'&Ñö<»b\:{ªwáTm/{0ÇmOè—µ(m/{û‘W' p€?ØÞÑ}[ŽeÄ툞»jB‹Η—ä²%=XBï.¦b\9äÒÙCϤí¹v_ê{–´4ÄÃð³úˆŽŽîÔ©“ˆ™Ù>k#¹ŒíéÛ_,H€H@_þc{Ç$`A“´M 0#6t0"j÷ïßñZúã{ÿûߟJ¾ráx–äÉÄØž¾7¬K¥)mÏvˆêIá³x9ÏÆ‰´=—º…'‘ x‰€Amoþôbç4¹º²\EÎÒÀ{{b$WÄö„í<”|òpÊÎØ8_LH¿Ì1¶y6ý~ž‡]1®]:qñÌËDÛóÒlë2ŽÛJ‘Âçø‹q´=t2«@$@$`•€mïã¢ïæ|â¿/<÷ô‚ƒ\³½SGROMÛ¿,jAÀÒÑ?¦Eͽzñ$v°Ð==ð¼»×/ŸÆˆ­µÄ÷ö²ýùsÊö®_¿.‡tmÌØP6ÊÂö0à‹¸ &a؞竞¥e1E?Ø %Ú–Q4YN7vjˆ¨¹í ¨ëvêÔ)°WD ^gÉ&;2'Z^'Šk9;ÙU/Ëö‡‚ 0ÃÙ^lø´<"FÓž~*W»V?Ƚ4äz{rN®µØž°½3ÇÒÏß}âÀ¶¤uSWŒmÒ?3}Ó¿ßÓ%ai”sSnÏìǂɶgid÷#å”í¡²x‡OÜÓlQ ‡9¹XÅbú/ Ñ”'¥íA•”o Š)·¨†&9ÛsrQ¬EQ¢4kÓ²E¢u²ò†6á[h²æ-()Û]C U}–5V’<~°`%Ö£­°!âr8ÔïebÙý4ðú$@f$`8ÛÛ;¿àÛ¯?òïÿužxü¿…>x'):Ø©‘\¥í;¹÷ü)ØØŒmk!|ašo[;åØÞ¸?0sÖ¥„¥’áy·®_Ìò¼SûIœ“›½Ï–³¶g-¿Ý9¹Ðqß ±PÚŒ¦dˆÌR.Õgi®êbÃöd4ë 9×X”†:(ÏU›®f®deå•­Ö¼¢Z+í²’äÕZŒšCd%Ikwš5h^&–½¯N$`ZF´½¤¨9ï¿ûÖþó˜ 3<óô“‹ft-¶'mïâ™CXåTæö›C¢,R;nù¨C;"oß¼šµ6žéÁ–wnß¼rñôÁó'÷9“¸Þ^v>bÎÚê*•E.²m{2¸råJÑZÁ’·±E„OÆö¤© ¿8%È ¨WQ¶+.2’tu¼P–&Ѝ˜íue_Êb-ÂxÐ/Y ÍEå¯G‰Wc“ ŵ”=(L™…¡¢@Y¦µx$È Èö)ëï5bÙùðÚ$@&&`DÛKÛ¼3na«¦ßå|âqù—2gÎÇ›üXKìœæÔH®…í]>äÊ…cW/ž¸|áØ¾¤Õ[– _2¢þÆy½Ò7…œÉÜ ™CäN3á&ÁÒ*Øý :WWÎÆ§ÌÛS¾‚f×ö`xíÏ¢¥2tgámJÛSz*­ÈB5mO–fm‘gi6𥠅RWÞF¯AÔ4Jœ"ãm­–#ݶÃ~Þ¦\1QóDY¬æ ¹æo½O,^šHÀäŒk{˜“‹YÏpÓ²1KûE/ ˆ íµ¸×ÆE=#vßÒ5"¸ËúùFô¨­d®ãçÍ¢¼c{6Ñ M Û³"ù²òõAµ YLøPv™æÏêÒlmt–ÅL^9áLõz(êÌ6ªª$cíIeÅd¸N”H/MÚÅ… :óæÏk‘ € à3¶‡X¶mZ\øÃX“åΗë‰VÍØ£ÜKCOÛ»xüì±:&Úž÷Ÿ=gmϵXÌi{èMÄÉÄŠwjm²p,Úž”c¥&J¶øe£{ÿþçI€HÀ—lO¬À8¬;‚|>š#_¾|ݺuøkø¥U«¹3ÇÈÓµ½Ë§1ÃFÊŠí]8v 5ë™Ûóösç¬íÙX]YæêÊÖCFk½ÛClŒäÊ_);@XšË±=Y¢hÐ>õJËÊ’¥íÁ½œª§#±=ᢃä{„Ö^æ“¶—ļýðz$@&&à{¶‡X¶o]¶jåRlƒvëæÅ«—]»zâÎí+øç ~€}r´= æÚN´=sŽäÊ0•ÅäÛ+°Ø&9Q@i„޼·ç༠i9Ö¦ÇÚøŠÓËö”—Àÿƒi.4(ßÛsyþ¯ª¨€²96Öˆ11ÿ bÓI€¼AÀ ¶·gÛ ¬À‚9¹šûäbèÝÅó—.¸|áHW/¹wïf‹ͱJ߯­§%o;§Y“{éÔ5{ ¶‡ÅùNA4NßÄ÷ö¼qsËk8Û“`17B¢ÓŒíÙxOsUkƒŒÊh™ƒ¶ç`Åz(ÊWÐ,ôÈ©^K¡(”im•>Ùj‰K6Ù†•¢49‡C݃vmO\Tô¬€ú Âl!æ^f&  ÔöºwíØö—†ÖlïÒÙC7¯Ÿ½pn_–í]<|íÊq™îß»Y¯^=Œóæ|â‰jU+m‰^mÝöN^»d'9²óÊ…£˜T¡{â, ob»E9ø§]øœ ì©GfmÇö škÝA_l¯‡¬Þ-C´H9Ú¨l£íÕã,v¡'ÊyÁVêrlOSa•õ”õ—Š&ƒmj“–'ʳ4W`±k{²™Èi»i²£½FÌîÊ $@$à!µ=¬ŠÒ¶u“Þ{;bÅd¬À‚9¹Ê}rì‹ýýþ‡±½¶wýÚ©×Î Á±ûmîܹÅë;p¾bš3k"öɵ˜“‹í4ì¦,Û;ätævÝmÏC7´f±ŽØDú" @sXÖ®íiž%­È" ¥œ( ^¯Nz§ZŒl»#~k½L¬íræ²íI¯²»{‡2´&s­–] TgßÛ-•|,Þ᳸7$¯óæ=Ïk‘ €’€AmïÜé£KNŸ3}ÈÛùóÔÑÂö°4ÉÙcé÷ïݺz嘈íÁönÞ8ûÖ%¤{w¯/_¾üŸkµä|æ™§›4ü!ly°\Å®ê!lùafžH\Åk¢t1A}XÌ'Å?Õc¨­mÛ“Ú$cEðéXø­Åˆ§Å´P„ÅJuø¯ŒK©g„(mÆ òZ(A®{§Ü'WíX.ÛžÒ Q¬òU¹§2·ß½}ýîë0¼›7Î ÛÃ?‘°ÝÙGU¯ñ䓹ræÌYý›ª æÎ¸rá¸Ý”e{玜´$Úž×E¥íÙ^\ êϰö"šmÛƒd(}KišÑ#¹ÞžòMAäTž¨ù~›flÏ"€'×½S–†ê©-ÖÛSª›µ+ª{Y9\®y–zhÛ)ÛSÖÊÚ(¹¬•rQߣļvÏóB$@$à¶wþìñ*U*ã/A¾×ò†ÌÕ½Só·ÞxuÑœQJÛ;§]8•qãÊYìckѯÉI[Þ·äNó¯{®\9ÿýïWªXnæô GíÂT ÍôÀö2¡eJ\]Ù;O£Ð Ûþê+ãaš“å¨gi pñ¡r8X¨Œ5}<8 á@‹µèðOkï“ɆhVR”7?N±¶@Œ(Í®Yë)˜±E“ÅE%Ímœ¥¹ ›5òÖj%ÖÿÃáÈä_/óÎ=Ï« €ØÞÛÛ¶uÞÛß9騦ñìiC?ü ~±=GöÉݸné×U¿ÄNkÿ÷ÿ§©}9s>)u¾«qæä~LȰH´=ÿXÅËÏýháÜÀÚµ*¿óöKæ=”éˆí‰XvïØÚ¡Ý/¹s¿øøãÃíÔÚ‡8_ùre.Ÿ?j‘ÎdîÄfkY8Ï%îœæÔ ËÌ$@$@$@N0´ím[š»x耎O<‘µ[ÚÓO?9jh·aƒº¼ÿõj_}‘³#¹Ø[Öñ}rw$o<°Ïk¯¾íûÏþ£Ô>|ˆ éLfV{9q0у‰¶çä-Ëì$@$@$@NðÛ‹‹Y°½ƒÇÄ{6Ñö ød°J$@$@$à/ j{»“–BøÎŸ9œ¼u©°½¨ð9ëÃfõêúËÓOåÎ÷Ú«y»ul1l`×¢…ß+ðö›ëÂæ:d{g#Âç`ʲ½3ŽïótblÏ_(¶ƒH€H€ GÀ ¶·c”ñ‹±ÊÝÍ—S×HÛ[³lÚ‚ ÑxiO¾rW¤Ð»ƒúuêØæçW^~©Î·Õ"VÛŒíÂ{xŽ'ØÞÅÓ b^HÉ5ÜÃÁ ‘ €_0´íaŸÜƒi·o^9°'QÄö`{+O^¸Ço­¿[ðíܹ_;jృÛ¶wðâçlïÂéýG3¶x#q–†©ŸD6žH€H€§R–íÊÈ’0¯%®Àbâ§‘M'  Oð%ÛËØ¾ûäž?¹ïÚÕKÉ Q"¶'loÒ˜“Æ èÙþÓâá5>9‡£Ð‡ïõìÞ~É¢Y¿¶nŠŸŸyæéÚ7㳎¤¶·ïÈÞMÞK´=OÜæ,“H€H€LLÀ÷lûäb ¬Ïréâ¹u«B`{Ó' 1iØŒÉÃgN1sêÈÑ#úVÿúË'Ÿ|ø>Ìïå¼y:´k¹bÉì勃:wøå£¢æy)wËf c6¬@èÎFʲ½“û°â±7WW6ñóȦ“ €þ|Òö°ÉFu±ºv9°táô¹3FÏ8oÖ˜yAcç›?{üì-šý”'Onåöh¥>+Þ³[»Èˆ%«WÎïÚùׂòco‹f wïØrþÔ>u:¹ãüɽ™{¢½š¸—†þ÷9K$  óðaÛ;¼+ A¾s'vß»{kOzrhðäEó'.Z0iтɋƒ§„†L ]8}ÉÂÉ-ZäC¥óáç/Ê|6°_·¤¸õ›6®¨ýí×õêÔı:=´½Ýш·y3qç4ó>‘l9 èMÀçmó'°mÚ•óGoÞ¸¶35.lé¬å‹g¬¹rɬ•Kg‡-¶l.Ò¬c[¶høÖ›¯[h_Å eêÖ©^û»o°P‹:ÁöÎÜsxw”·÷ÉÕûFgy$@$@$`Zþ`{G÷mðaãëWÎܹsëàþôë—„¯š¾:xÝêuk¦ˆðEÑ–"à×¥ó¯-¤Ô¾¯«V:wb:eÙÞ‰=ˆ´y?J߀ëƒiëìߟº&cûª})aû’WìMZ¶'qéî„Ð]ñ‹Ó±ãÈÖà[¤ÅÎÛ±yNê¦Ù©1³¶GÏH‰šž¼qê¶È)I&%ELH\?>!|lüÚ1qkFÇ­¹uÕˆ-aÃbW]1xóò›– ˆYÚ/zI@ThŸ¨Å½6.ê¹°û†®Á]ÖÏïÄÕ•MûÕÀ†“ ø ÿ±½ãð&ßéÌÔ«—Nþ~ÿî©™ñ[ÖE­_ñw‚ím‰Y™°umJbDtäÒÁ{T¬PÚgÓövãÁìH´=¿yÊØ  ÈNþf{'%cŸ\l›vå±û÷î\¾xv׎­[c”)aËÚ”„ˆôíÑ{wÆÜu˜kû öXS§Ó‡ÛƒímÈ–ÄØ^v>¼6 ø ÿ´½SGRÅ>¹—Ϲ{çÆÍWHKIÜ´u­H) ëÓ·GíݹùàÞ¸‘ÃúÔ«]ãìñ]ê”e{ÇwÂàìH´=yÊØ  ÈN~n{Bà°=îí—ÿüã÷«—ÏËܽ+5&-9ÒAÛÃéYÖ•]‰ïíeçÓÁk“ €?ðsÛCxO™.Ÿ?zëÆ%hßõkOØ¿O±½ºµ«[äÿDlïì±tL•ÈÆÄYþ𜱠$@$@$}üÛövž9¦.˼uýâ¿ß¿uóê„q#êÕ©¡™SØÞز1qNnö=¼2 ø¿¶=¼ºg/]:{hQÈÜ&hæ|`{;]ËÞÄXüàIcH€H€H »ø³ía¢†ƒéÈþ$휇wÀ÷§®ÍîÄõö²ëáuI€H€HÀç ø¯íÙqÚýt8õí­ÉöÄÕ•}þQcH€H€H ›ÐölJ!lïÈŽýÛWg{¢íeÓÂË’ €ÏðSÛËL=¥G:}8ÂŒí« ¸sšÏ?ll d µ½í§2uHl/5#%̉ûäfË‹’ €¯ðOÛÃæiº$a{Yše”¼boÒ²=‰Kw'„îŠ_œ·0}kðÎ- ÒbçíØ<'uÓìÔ˜YÛ£g¤DMOÞ8u[䔤 “’"&$®Ÿ>6~호5£ãVܺjÄ–°a±+‡Æ®¼yùÀMËÄ,í½$ *´OÔâ^õŒ\Ø}CH׈à.ëçwÑ£6ö–‡¯ßî¬? ˜mÏ–fÙ^æö}É+ “h{&|HÙd  p‹€?ÚÞ¡ä“:¥Ó‡„í­0NblÏ­û'“ €ùø¼íeìˆ\4wü¢yŽH8q0éÄ¡m:¦Ó‡ðò_ÊÞmË ”8’k¾§”-&  wø¶í- ™ôê;o¼Yô½× ½óß§sŽÖGGÕCQY¶w8á4C%¾·çÎÏsI€H€HÀl|Øöc–ä~9ϘÕsÇ'.ë3§Yð 7ËÍ>DøtJ°½“‡“÷$-5Vâ, ³=¦l/ ¸AÀ‡m¯ÉßþÖ§ËÊ}[ƒRÇÄ.è1¥éÊá/zsÞ¬1Ç&ê’NÁö%#–f´Ä9¹nÜó<•H€H€ÌEÀ‡mïÝoÍ[¿<ü@â‚‘ïõÜ8£ÕêÀ¯Æüö^Á·îÚŒ×øÜOloÛîÄ%†K\Å\Ï)[K$@$@®ðaÛ{9oîÙ1+Û Ý35yÂ{mÃÇÿ¸lpîboϘ4Ì}ÕC m/!±4£%®·çú]Ï3I€H€HÀL|ØöÛ±t{É…íŠ[,Â{ï}_î—?Ûï~z`{I»0ÑöÌôœ²­$@$@$à:¶½ê|ýC÷_0†‹ÕCls5Þ+ùëwµkU=¶?ÎýÛ;q0qWü"c&î¥áúÏ3I€H€HÀ4|ØöV/™–7>!yˆêa–Té³Vµ|_óXFœû)Ëö$îŠ[hÌDÛ3Ísʆ’ €ë|ØöT¾Ôwý[ ÏÃ.æäâ½½×Ë9¤çÑŒ­î§¶—bÜÄ}r]¿ùy& ˜‚€oÛ^ZâêŸùzø¯¼º¡ý>ïóÓ»óÍØ¢K¢íèQû_ŠÃÏI$@$@þEÀ·m/sOÌΤµE ½÷Lþ¼ùk•zõË [7†Ý·E—ÛÃÌ܈Ÿ9mY;oÇæ9©›f§ÆÌÚ=#%jzòÆ©Û"§$m˜”1!qýø„ð±ñkÇÄ­·zäÖU#¶„ ‹]94vÅàÍËnZ6 fi¿è%Q¡}¢÷Ú¸¨gäÂîBºFwY?¿mÏ¿žw¶†H€HÀŒ|ÞöŽìÝ|doìò…SÚµnܧûo;6âŸz¥S‡RŽïß¹eÁmÏŒÏ.ÛL$@$@ŽðÛƒðy$Áö0±7mË|£'Æö»Ý™‹H€H€LHÀçm/sïfÏ¥‡¶;Á3ƒ'Žäšðée“I€H€HÀ¾o{{6ez,=°½­i±sŸh{ŽÜîÌC$@$@&$ඃ¹JY¶—±"剳4Lø³É$@$@$`—€oÛÞáÝ1M§Òö¸‹Ý‡ˆH€H€HÀÐ|Ýö¢ïö`‚íÝ›º)Èg’‡W`ùóÏ? };³r$@$@$@*>n{»¢°£†çÒCÛ‹ Jõ™äÙõöNNúã÷û|ŽH€H€H€|ˆ€ÛÞ¡]=NL9²/v;f>”<¹ºòÁ뎈ûýþºÅYU  09_¶½ô‡<œ²loïæíÑ3}*yp/ ØÒÑ}›îß½eò'‡Í'  _!àÓ¶y(ݳéímÂ^d¾•<·sš°=!|Òõ•‡œõ$ 09_µ½ƒé¼NL>²gäÉç’‡öÉ•¶‡ÎK3ùÃÃæ“ €OðYÛÛ¹á çmoD¬À¢´=ü|íÒ Ÿ¸ËYI  03ƒÚ^šÛµª¿+!twâÒ=Û–ïM^¹/eUÆö5ûw„H[pg„wlë6'oœæƒiê¶È)I&%ELH\?>!|lüÚ1qkFÇ­¹uÕˆ-aÃbW]1xóò›– ˆYÚ/zI@ThŸ¨Å½6.ê¹°û†®Á]ÖÏïdÛö¥GܽsÃÌÏÛN$@$@Æ'`PÛû¬D¡ýë_}oÓÚ™jÛƒðy'eÙÞîèäÈ©¾˜¼`{bŠ®ñïrÖH€H€ÌLÀ ¶·3naÓŸj@øræ||Ú¸>ÿŒí­;æ¥$lÚä£ÉýØÞ ÎµÐ ò°Éÿ¼qõ¬™!¶H€H€ NÀ¸¶—¿8hRßçž} ªÑ¬Ñ·iñKÅHîþë¼–Ø^Ô¶ “}4¹c{«çthP«äÿ}Ô®í>’jð»œÕ#  30´íá½½„ȹ¥>-á(ôÁ;á˦>°=勵loÒ¶ >™\¶½V?•æ©Ç•ž‡Ÿ_Îó¢flÞ¹uÍÌOÛN$@$@F&`tÛ³4:üúÓ£9räÊùxàÐnûSý–`{‡wmLŠ˜èËɹYý;}—ûù'-<ÿ|ôѳ&´f{çOî6ò]κ‘ €™ ø†íá½½E³G¾‘ïehG­o*nÛš‘ºÖ éíEbZ«O'çäŽîûÓ»ùóª=Ÿ|[½b|Tˆ5ÕÃ瘜k槈m'  #0¨í èÙjÁôA+°lÛ´¸ê—¥!òõèÔ<#u§ÓɃ۰]Gâz„Ç|:ÙYeÆÈVŸyKÓó*–+¹jñDž'ÅÁ\#?ç¬ €™ Ôö^-äã—Ÿk[¬·‡‰3&ôA>ü?ãÏ¥‡¶·n|¢'këí­êöU¹¬×"ÕGá ,˜9ÜÏy¸Ò²™¿GØv  #0¨íE­šòáûù³&g¼ÿöæuAb–}ÛWËÔá·†ˆð!C…/Jl\=Sù+~`{Öóù¤Z]9<8 ÎןåxäßjÏÃlŒÉcú8îy"ç…SûŒ|£³n$@$@$`Zµ=¬·‡XÛûkɽ€,ÛûgÚ1·Þw_eM È‘£y£ï’bªó¸ùÉÉÛíŒ@`Ì’ÜK#zé–?}õÄãÿQ{ÞóÏ=Ý¿×oÎzžÈâ`‚iŸ"6œH€H€ŒLÀж‡÷ö‚gKî5¬ÿMZü’})aiÑìXœž{öé¾Ý[©3¸óÉ_¶7&!Üç“°½žíê>ûtNµçåÊùD›V vo sMõpÖÑ}›Œ|£³n$@$@$`ZF·=¼·—5ÿó’E!(Þ~cÍ’I{“ÃÔiÔàΰ=á|X®%):D3›³Âö¦­_èiXï&ùßИr‹¥U7¨i{Ê­# HÛ3í—N$@$`p>`{bŸÜîšbÄ© hƒªSRt0òäÍó‚Û­÷måȰéš9ÿð/Û¿Ö‡ÓôÑm‹~¨=å¶Zå21ëæ8"svóÐö þ¨³z$@$@¦%`PÛ[·t|ò¦¯À²mÅÞm+–/³q?ùè}üŒO4Ó¨A ¼ýº¬,_¶øœ)­å´û9lï@Úz €úhZ:«WéO?Мr[üã\ZÅ®ç‰ ´=Ó~‰°á$@$@'`PÛûzy^z~ÁŒAb–=ÛVˆ”µ{æ"tƒùéû¯ñOù+‹fOÕ¢ùÐ&uëbk™­}þÀöÖÅ­åsiÕü¾5«”Ôô¼‚ÞtjiÚžÁŸaVH€H€l0¨í ïß&ç?šã‘ö¿4Ø“´Ü"­^kwÒ2‹4ulï¼/e½¥‡ÐÝìÉýÕä'8½}ërx7k„·LñA}~Õ,VYÎ a{«FøDÂÒ*m~þÆÚ”Ûž]Z¸3åÖ®ü;žnÀû›U"  0®ía½½”ÍÁ?7¬ù`¦íSY>—¸Ô"m]ˆàŸÝU©XjÓÚ™ê<ÊO¡O׿".(Ž‹¾‡O¬xâ@Òk·®nüÔ¯sý—^Èš•lq`Ê-–VÙ¾u‰]]s3÷Òà· “€¡mOÌÒ˜:¦—Xræ§)spµòe>cµ5ª}±zÑ8Û·ß&DÎÔûW¢0EŒkžÛÛŸºfKØ0#§ñƒZä#k£9õQ¿NU÷—VqÐïß½eÌ[œµ"  “0ºííJ\‚³v‚p°Œí®_1I|h‘‚&÷yÄàï”1=5³©?;¼ ’fæ¿loè–0#¦ 1mŠ|ð†¦çU,WrýÊ銚ûÙ8!×äß#l> €‘ ÞöBá©Ý/?ˆ8\×vä‡?,™;⫊Ÿ zýµ¼{·Æp°µÌv??±?iÿö5±+‡-…NïZþóBšž‡¥U–Ìã¾À9U7É5òCκ‘ ˜œ€/Ùä k²Àá„ÉeEï.¨üyýòI?Ö« /DNŒc¿Ý˜5Óíº:ÃÛ[»rˆqRxp@o>Óœrûæë¯LÓÇ)KÓ%ó¡ôˆßïß1ùƒÄæ“ €a Âö:´®—3kû¦Ù©›ç¶%sr1KÃZêÒ®!ÖgÉ•+ý1¦îZË·!¨]«úâ?¼Ÿ‡˜ßðþmñ¡’-~ÛËØ¾zóŠÁFH‘‹û7®Wþ‰ÇS‡ôžîéa:ê¢n.rúHªaïoVŒH€H€H Ûl¯@JkéÛ­©ã¶'‹^=­NÍŠBãZ5­7l8ÜÀ^¿ÈŸO^ŽˆOP‚]í{`{«6¯”í©cËêÏÑ©mc.­b×ÿîܺƉH€H€HÀ°²Íö-Ü¥Ó¯õÿÛ‹[”n/-˜>ðÃ÷ò‹áZÄílç^5µwçŸK•(,¯ûqÑwñÉú¥¬˜e{)a›—ÌÆ4¨Û¯æ}^íyXZ¥qƒš^XZŶí1°gØg›#  A Ûl×nÔ¨‘…Ä´h\SŽäb0×ÁÔ«sS1\ {3´£Ý³¶FÌгUå %Åò+8>+QHó,ØÞ¾”°MËdK; É»o¿¢9ãÛê½¶´Š ÛÃ{wïÜà³D$@$@$`dÙi{àÒ­[7 ›iÙ¸VÖ{{[CœJ[×ÏlP÷+aoØ`þ·-z®#%ŒÒ±z•2Hš™³l/yå¦eý½œæoóyñ‚šžWú³b«O´;ºê 7®ž5òÍͺ‘ dslOt@@@€…ÖT®ð©ƒ®f¡hQa“[5ù6çÿEø/~Æ'Ž8Ÿµ<loEÌÒ~^KËfv®üÅß[}(É,ðæ‚™Ã½£qŽ\…«®ð„H€H€|‚@6Çö£!C†Xß;ù_ ‹ Ÿ ))jN¯NMás8ªW)½bÁHÊÁ)'ö'zÍöVÏí^¿æç9ù·:¤÷rž³eiÎwòp’OÜ߬$ €!lÝda9ÎÍß+mË—Ó°¾¿~øÞ[ßÌ+^¨[ÖMwª4ØÞÞm+¢—ôõhZÒ«u£ÊÖ–VéÙ¥…#‘6oæÁÎü~Ÿ €O0ŠíÖòåËŸz*k²…òèÜæG§üLÊXîób/¿òy1Dþ6†Mt¤Ø¶·l{è˜Û·ocæÇ{L3¨–ïÕÜ]G‡KŽšáZ²m{«g·oR·ôÿ}T}õçŸ{º¯ßœr/of>s,žçß6[G$@$@þÛ“mÀË|ݺuS¯Ò"%¬R¹O÷jî‚ðÁöÒ㮟ßI:6¯üô“ÚK«´iÕÀ˜K«ˈ½ráØï÷ïð   0ߎí)û ìZÛ…ùå|â¿ß~]&h|÷äÓLÙ^ÇõóÿNí«¿’çÍ¥U7¨iÀ¥UïÞxþänóÌóT³¥$@$@$ $à?¶'[……Z ( 9¶+>|)÷³Ð¾A½šE­³mã4éí…¬›×A¤1ßXðÍ’«U.³nŽ7Gcí^ +çáͼë—OñŽ'  03?´=ÑØf·^½z6œOüꃂo4ªWyÖønÛ"§©ÓÛ ^7¯ýôa K~ô¦fi¥?+¶jñD»îåµ ®½pjwÂ0óSͶ“ €ŸÇö,†w'Ož\¢D »Ú‡qÞ ½Ý°^å>ΟÚ+)r*l/:lRÕrjž^°À›YZE„ñðN·µåãM$@$@$`AÀoc{íÌÌÌÄìÝ|ùòÙÕ>™áý‚¯Sµâ£9QŸòržÇ ïîµpúBÐ;¬‡|ñÌ~ Ôò…<>Õ$@$@$@6˜Åö$‚ÔÔTLæ¨\¹²ãڧ̉¥UzviáeÏ;ºoÜË cÛWÏ2€ÇGšH€H€HÀq¦³=‰kõáݾvíÚÙžÒ!UïÑGíÒé·Ã)P.O'ŒÉb nqáø}Ìœ$@$@$@Ö˜×ö”D0Î óÃP/b~š£½-[¶Äª~¼H€H€H€HÀçÐö4º a?lÅ‹_ø¸ Ïõ++L$@$@$@‚Àÿ/ó’-ÂÍIEND®B`‚dibbler-1.0.1/doc/dibbler-prefixes-host.png0000664000175000017500000031335312233256142015523 00000000000000‰PNG  IHDR➈›sRGB®ÎégAMA± üa cHRMz&€„ú€èu0ê`:˜pœºQ< pHYsÂÂnÐu>ÿyIDATx^ìýÔdŵÿß÷×/d­ 3¹àÁÝ݃ÛàîÁÝ]w îNð‡HHp:¸3à 0 ,¹ïç™=ÙÙ9R§Îi;ݽkõzV?ÝuêT}ëtíún«ÿßÿýßÿý—GÀpGÀpGÀpG &@S½8Ž€#à8Ž€#à8Ž€#à85Aà¿jÒï†#à8Ž€#à8Ž€#à8Ž€#NSý1pGÀpGÀpGÀ¨NSk4ÞGÀpGÀpGÀp§©þ 8Ž€#à8Ž€#à8Ž€#àÔ§©5š ïŠ#à8Ž€#à8Ž€#à8Ž€ÓTGÀpGÀpGÀpj„€ÓÔM†wÅpGÀpGÀpGÀiª?Ž€#à8Ž€#à8Ž€#à85BÀij&ûâ8Ž€#à8Ž€#à8Ž€#à4ÕŸG } >ü©•öÝÕïä8Ž€#àô:Æ Ë›^«Ïè œ¦–›fhÆ,ÿ*p@¹‹[S›YztüñÇ·æl•AõÆèšë­·cù¯þY¼÷â8Ž@?#pÕUW©„ýÃþP(T!jëПæöA¤¥ÛGwûí·/½ôÒ*^yÃÄõöO‚·æÔ§©åæ……O×AVör·¦6 ±t©WijoŒ.!Au¾„¸òmkžoÕp®AÖ”Päu¼ë*ô»Èe"©‚©«G‡ت€å³joì:þ+ð8BÀij9äe)ÔÕo¹ë[P»·bÝ"t5 ç9ѽFxÆB[ÓÔü&¼IGÀè>ÄYI%,ïù¤ãÃpšÚñ)(ìÀöÛo/VÜʤŒ7®·wG…°xG pšZbá²Â4DšÖÁW“µØÒžã醪½AS£¹ûÕ¯~Õ ³á}tG UØu²>F0ä¾ÒžV¼síö†5UG‘pïíÝQçž¿³#Ð>œ¦–ÀZ5vx˜è²è‘ú%,_µ7h*z uC*_á8Ž@ï# ¦TØ…¾ïýawt„½DSk‡ÕÑùô›;½†€ÓÔ3j'æ/!p×MxÕ’ôMí­@É©óꎀ#àÄ" ÎJ"R5Hµ‘5±cèÂz½!›\©Ñ…žwÙˆBÀijLTÒðBMð[jeär¤/"‚†}…ͰÄäÀ„©)—p-ÿæêHª4Йƒá*n§·VÿR‰ÜH'NH|h»ÁØc¬Ç –šöŽ1!F".—K*ÐÔĸØýhg€1°é‘\ö2@î.óÅßÌ„“‘c0u+ÀU‰ÉJgÏ—O´'é9Í;ÕF/Œ}¦½ž#à8õ@@•d½UÖYSJ\Êp­\`}Ödi0ò¥ÖÌ1z8Šm3Ñš•Ît# åm#TÓíDX¨%®Ò…n*ÐT+(ek¤AÔò3Û­WÉ!oÈ1cT0u3–‚ «—¤w>Š•6b÷Tzą?)ï…#Ð 8MÅ´—o¤ºW2ìkû&Okìkâ*ÚIŸ‚NÙí½=33„¶Æêdö<`@N'…·‰ ò°F°¥áj.„²AJ2.ñÿÑ­E’{eŠ(éÓimýø1*˜éÙ׌PéJj¨ç«´DTw8Ú´­z/w|ŠýI{=GÀ¨ iµ¯~Ör–— ×ê +s¦h¤P¢c65±¶&BDJbA¶â‰÷i +‚/oZ2/‘» ˜ò®BRdÞÈʲmK4«‚’ÏÓ‚;/g‡ÝZ$ärb#?Fš´„•ádϙ;m“jvàyŸ×æäqz§©QóŠÈ‘uЮ\ªîM,g¶EÄ€]¢>¤¨ÌH_«qŒÔÑúV$ÖÖMµ4óÖé€Im-Ý +ç2×w›ÏÖv^ȼJaY›ÀGo܉)Ô}€ÊB1_ÛÝ Í¦¥²Jß„èµûŒRcä\kq“íF$MSŽN\úñЯò§©Q?i¯ä8µA 3ˆFePàˆò²âR“ [qc%rZ9˜GS­ÆÐÊ;e×iâ Þiñ”–z ¤Î’ew™Weú Y.°hªòp:Æ]øØØ¤·º1°úÖRcB›)a4Õn9Ü^¿JÖfµðŽôNS£æ[ea"#«®yŽ.*¨¬½Î¶iùpB…lm›ÖÈ–GSuU¥öîׄ.ÓÊ'k”CŠ$È¡Mûžèž]ú(Ycišm*† Þ¥—jÖTµâ&×!¤ e§¼]º¡}®Zj«·îWõøex/Gàÿœ¦?êç™Ö¢…Õ½º.ç©ßÄ^—)ÃòÖq¤Qâ’Lšª}΋#µ¾OyÖÔLhTÊÚöÚH¦EZM©yi t›R¦æÁž'Ñõ^™>f•ÇX¦Ú=„ ¤Å·×pG £(=H›°þ#t9SéPqiq©ÚÛLE$ÊA¤a‚zeÒTís^N>Á »¨¶–'ž2uš1' ¤-Ò–øåͰŠà 45O(ë­$µŽZ™©6Fiª¬5•Kj_;_yÙ(;ú+ñ›;}Š€ÓÔ≧J [جGkL‚8ë¢ÃZ“ 7“¦jŸf·Lq¨­¥ÝJ©ÌÛ…· ‰ µå!Órb õ’@RßL©°yn‰òÆ(ŸW°¦&.ÔÜã¨øë5G {ÈsV² Û]Z€V—ºò&Ò'%“¦æñ"‹zfB‰–y»°l’›¦[.ÔV‡eSÞ¤!©yû“L•náÖ¢ÚíC’ö”Îó5“«l¶Â®îù=yOžBÀijÁtR)• ™¼NMˆ‹"éãüÓ~Hz€Â$ïéèÍBA°•ÊfZSó²Vd®ûÚgI¥Wb»PnÑɰ˜Éœ<‘€^ S"*h™ÍVcƒ4U"N5Õï]ÑÛS °ÆèoÎJL^Ò¸ÄÒ*>¨…âÒ&5”Khº-¢©y$9|;äržxMû¬RbKnËZSó†óxc8Š«t{PjŒÐT®MèÆ;mõ÷¯ÖGï´§©XëB¯RPd¡-Ê"2Oæ™(\íIû8¥E¯¥(Ô´…0“ÈÅèz3Åa!- ÓTímàŠ7m*Ï3¹š¢ÐÔRcl¦ÚmD^¨mûV ¿“#à8ME@YhZ°ê'ªä +íÊ,ü3Ó¡&ïˆ8¡¸i rZPÆ(Xéj¦Þ3SìÚqhjŒè¡ŽjÌc‹ û“Æ\Æ•çoUHSó¨ UÈŽ4q÷¼ Oá~ƇGÔÔ§ÞsXœ¦ UjéÌsÈDSksµ'¤i^FZ˼{b1­M l5ìWz¡‰¬“˜B‘»­£©¥ÆØ8MµjŽŸýÅ{=GÀpê€M‘PÈLò²ú1Ä‘âRÆÍ}HÒ´„哹­M‘>º‰¡ 1uK«ij©1æ±âÈ=†õWâ¾ñ&åzü€¼Ž@ï#à454Çö­€/«=º-M _Å‚š¨aBꙍ–Ì›´èOØé7O嶦–ZåctÒ1T¶Í4µÔ¤©‰SyµÞ_«|„Ž€#Ð[(GB$¬ŠªB{W¡¸Là‡|„”¦•ÈÖ1ªEN¿yr¤òíÒFK~[dM o‡òÿÊÖTcUh"î­ŸÆèœ¦†æI YãÅ­2e.>¶Á2@²í5óØÒ¥P*ES©øÆäÎUMA<°1êáL©ŽM­6ÆFhª¦"¿ö9&Ww,?ÞKGÀècÔ˜Îfd®‘yòÄel{2yæaž–XÆ„ÕdÖ)Oa§ßR‹¿î1U²Ç«_„Ã)” ~KÑnÀÒ7¬æV™Îû¾‘>tG v8M M‰Š™ÂŒ»*ZìB‰ChÞ²›>•ú|ÈæšªÌ\ˆ s»HSЦêí=—CÏEe® "¬Â£MÍ ýÍ£Çaé[yŒ 6ÃPÈÔLëU2v}Æ M µ[f¼CŽ€#àü'ÖY©›ÌDJeÅ%wäÉ™”yGM°dרLÞÎÿOã…Ò”²¦†?•±ˆ£½ÕÓÂÃæY‚‡ *KS3s/kOÄ…;ó@šÓé7`5ÍsýÕÇ Z Š~[ø|¼Ž€#ÐA,Ì솦zIYqiÅœX#V%N:#¦Z‹«nž„mMµ:JÚÔ½í9Ÿ§EŒÅM¯ÒHæ6 <#–„0ŠÔL;‰S M­<ÆRÖT}ö¸*Aøíœ&ö*tù;õjŽ@spšš§ÚÍÁ–é+3™§¥FéœûisŸÄpæeçç ýexõON¥YfÊʬ8)”%á ÁrÓ<ª8ÈNwh*bFg$qP@•^Hó*Œ±MÍÓ‹§wföáqšÚÜ•Ñ[sÖ!PÖY‰ž¨î˜Å\ýƒÊŠKÚQáž)dÖHêÜt™ÂZ ž™Ü©šÓ¯L„JíÌžs»¼ ÊÌm€òFR(¥ÑKÇh6Í– ·Œ1ž¦Z&œ —µ7X;¿ÓÔÖ­Þ²#@Àij68PQŽ– ¦gÅ—«äV´Œ¬¤Ö’):ȼ¹aML_‚°I›vENSƒ¤5é˜VSšjûÓZøvb>M –ž‡=»ôhY¹Pì±HúÂþ¤´ûÉ÷haÏÄPá«ôÜeNPÙ1JË”4ò¤)á”H^eé ÖÑÝ€UJ±â‹£#à8mF@Ø”Hg%é¡Êå„ R¼¸Ô%4-¤èL¦úRÌ•™«·¶¦¢Ÿ•\Éô”)l-²BBÂÒ´'°Vv22dÑS«Ö¸ðvégÃî쉵¶ÙôU¥D¹ô*~Œò`¤e_ú¦*‹ÙµŽU+Py¹mþùí>AÀij»':­e,ìA…K Û¤Bž2æÚÈ:zή¥ÔÆ%Ý“LuudøSä¸lµ c¬p¿ÄpG ² 2¢¡A‰“Ù¥¼|ò…ý¯@·+ȵ —$º”©à. {ä0«1²q¯æ8õGÀijýç¨Jõô—<ƒ­æ.BäT¹A¯)ôªªqß½kŽ€#à8uG@Oɳaªïhá¡ëujª™4µëFáv®@ÀijWLSéNjHž ¨F¤ôžušZúqñ GÀp¢P)“—4A¸œ £n»î¦Ö}†¼Ž@!à4µ‡&ó?‡¢ÙƒÒrÔæÂm…¿Sg1ušÚYüý#àô6ö,€D Iˆ É„z§©½7§>"G ¶8M­íÔ4Ú1›yʪ)+lòÛ̌޸Ó×;Míô øýGÀèqlúÜL ˇ‚ÖD§©5œï’#Ы8MíÕ™Z^u=J¤°çó@žá®ÅijWOŸwÞp®@YcÕ¾VÈnÓ{žJ2)NS»âáôN:½€ÓÔÞ˜ÇÐ( £HSÍØÎû%å« ”ä´ÛkÒï†#à8Ž@¯"€S’ù†‰•ìJ=iDÕéct.a{õaöq9uCÀijÝfÄûã8Ž€#à8Ž€#à8Ž@_#à4µ¯§ßï8Ž€#à8Ž€#à8Ž@ÝpšZ·ñþ8Ž€#à8Ž€#à8Ž€#Ð×8Míëé÷Á;Ž€#à8Ž€#à8Ž€#P7œ¦ÖmF¼?Ž€#à8Ž€#à8Ž€#àô5NSûzú}ðŽ€#à8Ž€#à8Ž€#àÔ §©u›ï#à8Ž€#à8Ž€#à8}€ÓÔ¾ž~¼#à8Ž€#à8Ž€#à8uCÀijÝfÄûãTD@Ž\7n\Åëý2GÀpGÀH!€` ëØ8Ž@;èšú«_ýj饗žå_…÷pÀ°aà qL\¸Þzëýá(¼Š:Ûo¿½½ÝñÇ_xªÝ.¦e©# Ä,£Õ«<ðĘA/~hRœãK³ØZSfmøðá2äÈG¥,2Ô—[ü×ýWᓉ? òœÛ_ÿÆü@*tÞ/qz"À:ÀŠ‘°¬Š|îpeyQmÉMô“³^v2s]à /©ŒØUW]Å&Än-ø¤ðvé 2Y4UáÚ —°åhµt‹ì•ö¤cçqB¼¶/ëù$¦›ZŸØHмš#Psº›¦²ˆËÖ<³ð›ÏCŸåŒ¥<ó*£ÀœÑfæUa~XùvñOv,LS+#&ktº0ðR¢”¥Y©@SsîX ]Ã{ûí·çݱPV%Z¦¾ô°u4•YˆA5ú™7öð$þ‰õšŽ€#PsD¥Uaåo³ Ì“keÅS`:dÃP(¶ª!†n1oCÂç¥dK·Ì¶çé¢{­–n‘Ñž´bìòC@‡îL¤¬oÖ†*¯æt/]LSe_®œñ ¦6»Ügn©±³©è¥²\%Ri-o#®€šÔIÜŽ3 Y•oÿTY("­2bºòÚë‡ ÉT-…ò>=üvÒT¥s"ïe®í$^êcÓRš*Óæ‘øÛÓlü$þ‰õšŽ€#PsìN:s Ì[ùÛ,(íZ­ëUñ˜…",¶ª!–X–Ó;™¼­EºÃ ±Õž¬h*[;QR„­‘²¾Yªö̯ßÅè,]LS¬ÒÚÁxŸ€XeIbO/#ÂTÓW±NÉ·ié6˜I]ªÝ.þ±°+#Ý ÐÔjˆ)¹MÜ~Óa+Å+ÐT‰ ÕP4nñËkŠ-…~cÕǦÕúf™Ü°¾ uN·þÄ<^ÇpºKxÒ«ŠKÓ÷ö J]ý´â©_ʘe“9­Œ˜Ý?$bUô«Hÿ«£W¤6ø@öMňZhK”õ‘ªFžØ'Ô/wj…@·ÒTY5æ#­XßE+&&²€22ý­*À2™€~›Þ«|»˜§„…ÌêŒe\y4µ2b*ù2ãUŽ:ÃØÕ¹pÅ~¢Ž°qñ¬]ÍÜ(‘‹aÚê*ÖRš*…p"ñW­G&ÕÏûYU˜/¿Äpj‹€J–¼…=oåo³  Ë5]Í@)@ä%|qkl5Ĭ4Ȩ́ Êå¤2#ÖS¬=OW?ÐTy ÂOQ¤¬ÏÓªÈdÅo¨Ú3¹~G ãt+M s'UŸeUçÙTØ$¤BfkÚ²jRĦòí Ÿ =(¾¸ašZ 1¥Ùyâ9oà‰þ«0–¬<…œªpø‰ V…߸2¼ÓâÖ fxë ³/ñQ-¥©r£?Ç_‡–§ïÿÊNœ×w"Pø3ו?±ì´YPª4É[ö ’ ¾$“E[–ÖB±Ux£LÄ ÕǺ…+‚ñÿ’®RMzÒ¸º6ò±ìš*2ÆËúj?ȹðjŽ@ï!ÐÅ4•_{Ø|”¹J5Ö¥SLÀ›´‰·“çL½[Ó]"z-¬~’Ç.x5ÄhP¢3ŸþȤBüè€:Íæî'cÏÖ«ä*ƨ+T™B¯2ëÓˆe í^!—+}f€.F¦;ð•LJ¡®7ÿ¡îÆzo•ô9}…€f+ PÌ•¿ý‚²p9RcB2êù"™ªFkDZ˜¦VFŒn2"g$œJö@Œ‰F·Š–¼¦ †ƒdTAÉØ!O³Ÿn\+)B(´™·$¡´Z«›m}î"2° l*ÂO‚ŠòÀŽ¥”¬?±‘ª¾ZŽ|°}Ž@·ÒT™¶ðB–¹JµÌeBEE€eîï«ÝÎ.¸™‹£ô‡;ª (¤©• ÿBT×¢Ú7‘%…jiE2&øÓ òpª™UG.o@¸Ü&@(œÖľ¡¦j…Ìé–ÛQÂμoKᯚéà”gBéóeÔ‡ïô$ [A©}¬üy4O?Ϥâ"ƒhV h…b«PÂVc …zCîkµ…45,k\6dZV¦i§•n™)—‘_y$\H U è¹*SeÆ:q•Uµ~'~MEøI °³RYY¯=É´ÍÆl¨zr©ñA9yt7M Ì«ºYZ!#'Ô=Ò^#*ÔGHWŸÊ·+¤©Œ.!-"ijYÄ¿¨„-oC£uTäÊûR4Õ¦I øä$Ò`ˆÊVé²-’H^N,‹•† ,-¥©á£hÊâoc¥Ò¼W§&RGî+¯#àô$º Z.ÑfAciÔ@‚ó„É •Ò¤PlÎr&bá«2·1‰KÔÿK©`Øš¦©:ƒ4¢¶Í„¬L c÷9ªùMKØL‘‘8}@諸9¡€HdEÖúzßVÐTéL8H›:‘²>0§1ªÂÇÌ+8=†@ÏÒT]míâÃUiíZ1Ò7-2+ßNˆøè\Mì³Ø8MÍD,ïqÇ•%Ò"ͦ9`\H&x uŒ!·“6¥²A"žÕ…,S/pé¾AŸ½š˜ný*Ó^*äÙ*ào1e êÒx"å[F}8Ž@_!`“šZ§Ù6 Êšš'…E~QJ%ÑÇé‡!±¼Ç†ú*Ú¸iž§Œ6k×äBšš'k9‡‘ø:¹ Äa¡ˆ ©H m³Ê'dŠ6´» +­fÑl•ÎiéØT„Ÿíd¦sxYo5Ýô“щ„ÜPõÕ:ãƒu@ 7iª]mí4ëzÞgËz—¦©ª0Ë|t4µìí*<š ÒÔ<ÄÒ=  ¼ øóh^+eWKk¯¬é/àŸfà ]Þ4iÜ‘ú#&Ô&+Ò~ÒÔ 3®—È\dj *ãpÄŠÑ42¿ÖpjŽ@žÆJ×öÀjÜDA©Mô¤‘ÊâBÀ[ñ:¾„é’‰úÒZH¦©‘êÎ'3+D^Š{KS3ÝtóTÉasÚƒ7rb™m@‰\8щ £h‘õy!Hô<°¡*Ûy¯ïô=HS:ÈH¶ ©)HßðÎ>}» V#45Fk«]Rq«n6è)3å¨Ú0ÃoPÞ[pTSà…ÉŠE®Ôê m±¨0òæTGg%}äƒWaÞÇŽ7‚^xç«øÔVFä—8Ž@P&1k{eŒÔ«M –žhkY“·äªøKxáV£©•JWÂ4s¯ö"–f^¨æ)5„±óW$ŽnTòüo&ÒT±ßfbRYÖ#µÅº›ý o-ê¼&xßÖ!Ðk4Õ† †cýctŠ nvøi¢ô­0ß1;³Ù0béKÔGQ¡Òdhk Iµ­L$…rŽvÔ-§ÚÑy´ÀXdÔì,KMg!¡mM•;¦ŸÌÊø[ç.zêô«WÜ.Ï -r⼚#àt#vÍO/NSÓsF,]_—\–õZJè‚Õ´˜–kÕhjÌÓ¦©~« è3>R>³3…â¾Y* {÷ˆù¶)OXeZ×[}Šf ?:µÂÓâ—8Ý‹€= “å4°\Ç,¶M”1T'`ø*5#¥hj}PÁ¯9.|ô‘‹é€m-€¿;ýÂî>AÀ2®Bm `Ò~AY¸ï/¬9›1b«b1úÖ²éªQ5U¼æÍuṩ @æ,NMbûTˆU:þ(rr3«Éí"w5ÚBXÖ»Óo#3â×ö']LSõÏQ IK â1lhÒõ4±Ä‡9R|€eáÓCS+ f n&ÒÈ­LŒ¼·,naÚ™¶ g»¥oVñ\85-¢©cÇÃ] ào§;/­ððº@¼Ž#àÔ–ÕÄE.ì2œ6 ʰO¯ò–R›„Ìy)[Õ+%ª\f: u²Òóijž_c&F%f|ž©3ÍSdÒÎ-ŒôÑ›S#w/õðÊú~) x×ï›#ꕦ6r޳²µ´¯~•v¤ÄëUÈXZZ„uxÕnIÐì13]HS+#XúóÒåW¦Ir!àËØóäeŒ¿íƒ‚“vg²CP¤Ä5SJY•yÀÚv Ðšžn},u”y©°ý ï·ìt§™ªJÙ´+TÌSêuG +¨ Ó”qµYPªÊ’Å0}Zµòœ4}’sV(‘Ùì ijeÄ”–¤sëîw˜¦æÉš°rVWþ@¦_I”à¬Lt›X>ø£úP Kd{º^š¦6™O‚hlãUú£.”õé¦EY+nW¬*ÞIG ÝJSõ§o¸X­'k‹+ «˜®€yª8{F(â«$tSƒ-3IKµÛY e̼ÒÔʈÙ}Èèáã¼±mÆ»žÆËû<ÙßÔh:¹ôy¼2éy2CY½PAyHÓO EWxºµ“V–ˇá ÒÌ''Œ¿n‹ä\÷1éaÌ#êuG +°zºB ›ÞO·SPŠZSE0·–µ\—ÍL‚gu—1“^6AL‰½¸˜J–„ÄJ™Ã45OÖØ!(ŒT¶+¦$² µ“MBB\f΂}TTÎrǼÍXb7%Xiµ{i¸´Áô¦"óIKÁ.OQ¡¬·ÓØPÙ]J¤å<æÑõ:Ž@W#Е4Õš³ “Ýeš}hAW´D á…ÉîÔí…´p©p»æÒÔ£3º€¦ç«´*4ð«h"M-êB&á´L51jáoñ¿üBÑU–¦æEÓ¥BüÃÓ~Ôc:àuG ÎXÝk¡„Í”˜m”c`­ÎS&6—¦6ˆX`‡P!<²MÆÀ(h~¥ Y´ /¤Rž ˆËÀMi-­þæv™›7¡Çyc/KS¥~))IS©žî²ª:¯$Þ7G qº’¦Šå3²äùN ¬b}U±¨)1´GT}ö*nQhK,{;”Fú~(&yÁ!‘pî8 — &ºÀ²O¡¤ŒK*GxH…²¶D;5ÐH@¿@ûô3ñнÂéN`¢³™Wxº%¤•ÙyÇŽÇÌE!þÒˆAZ‡µðo!SÎ6cø‹µ\·aºË{`S‘ù$HË…=O«PÖË%L·B#ªî]g¼çŽ@ ]ISc_‡õ¢”1P[æª [öÊ·‹Q«kŠKR«ïÒÒö™…Rs'³Vê’–öYضþȽZ:oÜpzj+UeAÉzUVX7äA¬ãC(+"ÓV—e^¶~ä\·s“S‡éބū9íGÀijû1÷;:Ž€#à8Ž€#à8Ž€#àä"à4ÕGÀpGÀpGÀp!à4µF“á]qGÀpGÀpGÀpšêÏ€#à8Ž€#à8Ž€#à8Ž@pšZ£Éð®8Ž€#à8Ž€#à8Ž€#à8MõgÀpGÀpGÀpG F8M­ÑdxWGÀpGÀpGÀpœ¦ú3à8Ž€#à8Ž€#à8Ž€#P#œ¦Öh2¼+Ž€#à8Ž€#à8Ž€#à8NSýpGÀpGÀpGÀ¨NSk4ÞGÀpGÀpGÀp§©þ 8Ž€#à8Ž€#à8Ž€#àÔ§©5š ïŠ#à8Ž€#à8Ž€#à8Ž€ÓTGÀpGÀpGÀpj„€ÓÔM†wÅpGÀpGÀpGÀiª?Ž€#à8Ž€#à8Ž€#à85BÀij&ûâ8Ž€#à8Ž€#à8Ž€#à4ÕŸ&#ð‡?üaÓM7ýYNYwÝu¯»îº&ßÒ›sGÀpGÀpBÀijMf †òÑG <ø¿ŠÊâ‹/þ—¿ü¥ýõ.8Ž€#à8Ž€#à8Ž@ípšZ»)éêxâ‰Eõßßct…Övõx½óŽ€#à8Ž€#à8Ž€#Ðtœ¦6Ò¾nWßxšJÍþð‡0Û¿ÿýï}šÞpGÀpGÀp NSýqhŸ~ú©å¨sÎ9çÿ÷óÉDM´ÜrËí3¾ðašÇþô§?½õÖ[›ÖoÈpGÀpGÀpº§©Ý<{5ëûe—]¦t’I&yúé§÷»ß-¿üòòá,³ÌrÅW¼ûî»Çü!CÒdKì³Ï>[³1ywGÀpGÀpG Ý8Mm7â=|?bM•|®µÖZÐÔgÆ—‹.ºh¶Ùf“¯VXaR¿øâ‹»í¶VÖ4YÝe—]<`µ‡š#à8Ž€#à8Ž€#Pˆ€ÓÔBˆ¼BÄ—þèG?RÚy '(MÅFJ9üðÃ'›l2©°Ç{ÀT{ì±UW]5ÍTiçÌ3ÏŒº«WrGÀpGÀpžCÀijÏMi‡„T ç~ðƒ‡~8ASŸ{î¹G}tË-·”jSL1É“Þÿý«®ºjæ™gN“ÕÙgŸýî»ïîÐhü¶Ž€#à8Ž€#à8Ž€#Ð1œ¦v ú»1é‘”j.´ÐBpÔ4M…©>ÿüó·ÝvÛRK-%•çž{îo¼²zÔQG 4(MVW[mµW^y¥Ç°òá8Ž€#à8Ž€#à8Ž@§©þx4ŒŸJ2÷Ûo?KS_zé%œ~á¨BS)ûÛß~ó›ßÌ0à rÉꫯþ—¿üåå—_Þa‡ÒL•OàÀ¤nNG½GÀpGÀpGÀ¨7NSë=?]Ò»·ß~ÛÒË;î¸Ci*¹”8uçw~üñÇ-M…©¾ð t9¹–:ûï¿ÿ[o½õÇ?þQ“Û6ò“ŸÀl»ï¦#à8Ž€#à8Ž€#àTGÀijuìüJE€ŒGJ)9õ©§žšŠo^ùŠüI't’ZS…¦RˆbÝxã5`õ׿þõ‡~xÉ%—L;í´iËêüóÏO¬#ï8Ž€#à8Ž€#à8=Œ€ÓÔžÜö #O•Rn¾ùæJS!œt‚$Iúí¼óÎË¿pT¥©¤ü¥Ü|óÍ‹,²ˆT[xá…ï¼óN,´‡vXfÀêºë®Ë·ížßÉpGÀpGÀpÚˆ€ÓÔ6‚Ý£·"j—]%¢\pÒÔqãÆ1èÓN;og}®ŸÎ0!£/‰‘î¹ç±¦ M%~•rî¹çN=õÔÒ\TÂY·Þzë´Y•;rÈ!œ‚Ó£ ú°GÀpGÀpþEÀijÿÎ}³F~Ýu×)$ДÓP…¦Â0¹Å?þñVX ‡yÒ“/}¸ßÁGO2É@F߉&šhûí·§²¥©8 “l‰ L|KÁƒsÚê;ï¼óÀ=8MV Xåî͈·ã8Ž€#à8Ž€#à8u@Àijf¡»ûðóŸÿ\ ä*«¬Gš ½d`ü1ǨRáŽûò¥á¼úë«›m½£¬yä‘jM…¦R8†V×\sM©3ÝtÓ]vÙe}ô)”&Ÿ|ò4Y]|ñÅIÜÝ zïGÀpGÀpGà_8Mõg¡Q~ô£)u$a’ÒÔO>ù„¦¯¾újñø}êåáöõÛß=²äÒËË…fsùå—ãô«4¦úꫯÞpà äL’:µŠMõÝwß=à€ÄÖš(›nº)T¶ÑÁøõŽ€#à8Ž€#à8Ž€#Ðiœ¦vzºüþ˜1-]|衇„¦â»ûý÷ß38Éâ»Óîû?ýÊGé×…WÜ<ÛìsI +®¸âý÷ß/ÖT¡©”aÆqÆC† ‘:Ûl³ Ÿ~‰ÈÕ4S%`žì«]þLy÷GÀpGÀpú§©ýþ48~=oÒHøè“O>)4õµ×^£eãTSMÅW^yó3¯~”÷:ìè“'lÀ›3éŽ;îøÄOXš /%Ó'¯jÀê±Ç;räÈ»îºkî¹çN“UNĹõÖ[—_î8Ž€#à8Ž€#à8BÀij§ï‘ûªS.tq÷ÝwWš d„úÓŸø|’AƒŸ}uDøõÈöÝiÏŒ÷æå„UدZS¡©^ '¬®¼òÊÂKg™e’'q—SN9%3`•3r°èöÊ> GÀpG p}B‡›Vìê'D߸†·€ýRGÀh>NS›iÿ´Èá¥Væ]sÍ5JS¿ùæpØÿý©°öú›<7lDÌ뮇ž\~¥Õ¥Í9æ˜ãÊ+¯„£*M}}|á.|¥~ÂþóŸùp¯½öÊ XÝe—]<`µH©#à8Ž@&°ÐGÕ¯\ÃëÏ#àÔ§©õ™‹îë ©wU¶M9å”pT¡©dîe0Ħ.¼ðÂT8ùÌóŸmDüë’«n™mŽ Þ¼Ë,³ÌÝwß-ÖT¡©oŒ/øýjÀêÞ{ïÍçä^}õ × c2ûp"z3îìm8Ž€#P§©Õ±ó+W[m5•j믿¾ÒÔ>øpÞ|óM 7ýóÓ¯ýíõ‘e_GsÊdC&?Ù7°_KSi¹»ÝvÛI¦˜bŠSO=•ÃoHŒ?pZ£H†îú”9Ž€#à8ý†€Í"ÉWÑðžyæ™ý”×pj…€ÓÔZMG7u†ôHdÖUwöÙg+MýüóÏ Q£|»ÈbK¾ðúÈj¯Çž~mû'xó4èðÃWk*4•òÖ[o‘x¹å–“nÌ3Ï<·Ývdõ¸ãޏÑFI5V±²¾ÿþû_|ñ4ÓLãÞ^z|,Ž@w!à4µ»æ«.½µiguV8ªÐÔW_}•."ÅÖzÅu·¿òöèV¼}âå5Öš°Š½à‚ à¨JSß_¬ˆ%1}£`ƒuw¦ºŠe•šöôWÀ›nº©»3•~2üGÀpÚ À9á–UÞqÇJSGŽ©©•Hö‹eU­©ÐT )~øax³^$é¯ýk×ðÖf†½#Ž@#à4µÇ'¸ói‡ª4&·CŒƒ`#|TiêëïiÃë±§_ÙlË ¡§¬›ji*>|8Y UÄn·ÝvÃÆ— 6ØÀÝ™Zñ¨x›Ž€#à8BàÄOTцY©ÐTè+]úöÛo­­•XbSQ7+M…©¾ôÒK×^{íì³Ï.í¬°Â DÍtpÿý÷[k¢üüç?w o§¦ÛïëôNS{oN[;¢DÚ@‚X”¦rV*÷>ÿüó‘[„Œ’9ÉÐÔOÞx¿M¯;ïùãbK,-²“|¿$kªÐT ™–TİР;vì< ©#¬ÜEŠßzë­­ÅÔ[wGÀpšÀÏ~ö3gH¥©Â$%cÿ&šè¸S=åÔÓJMbPɺ$ÖT¡©”—_~™T XÝi§ÈGHDëj«­–fª$FªzÀj³'ÓÛsú§©ý8ëŒ9‘6×Y¡©(hÿ1¾¬½öÚÈ-ÎŒIÐÔ7ßÿäÍÚ÷:ÿ⫦™vÂY©[mµòXi*šB^âÕW_]D,ÉŠo¾ùfÈ*ŽOœ¶š–»{Zh7¿ÖpGÀh¤`°²Œ|øJS¿øâ ºÁqnTøÙŠ«=ùÒ‡~æ­Ý÷=t’Iñ g¨’x ™ni*LA¿ãŽ;jÀê1ǃ$EtÎ5×\i¡éÞ¶M´ßÈèaœ¦öðä¶dh6m Ù†à¨BSÉ©Ëý0¨N:é¤H¬[~÷‡4M}ëƒOÛùzåÍz”¬’òW%¬©BS L¥`){î¹EÄ®¼òÊHqü„É3‘°ºË.»¸;SKž*oÔpG ©¸^Ù#Ìé&4U²H S^j©¥¨pÔñg>õòpyÝûÈsl²µ\5õÔSŸzê©jM…¦â*Lá„Õ•VZIêÌ2Ë,ÐTÄâÉ'Ÿœ°êÞ¦N©7æôNSûnʰ e²*Mýøãiù¶ÛnoÓLûò[gÒÔ·?ü´Í¯'ž¶ÅVV§vÚK/½ÔÒTÒHPÆ*bwß}w˜*ZdÂnóÜ™ÄÐ/wGÀpZŠ^¾*ÂgJS {á¾>É"qß#Ï=ýòpûºö–ûZtI¹v¾ùæ#6Žª4UN 'õÃŒ3Î(uðKÂ;‰,{î¹gfÀ*^L»-¬7î8=‰€ÓÔžœÖV *‘6S¤ÒTür×]wÝ¡µÉæÛhê;Ã?kÿë®û]|É «Ë/¿¼¤ù¥M5j™÷Þ{oºøýžuÖYãÆã VüÓdu¶Ùf»ûî»[…²·ë8Ž€#à4†1¢*¼Ž?þx¥©Â/ºè"¾g¾…žyå£Ì×鿺lª¬’ï—ÌIbMš*Ù9¨†Ôú´ƒÿÛðÉŸþô'Ò,ejx‰©il@~µ#àôNSûnʰM8ýôÓÿõ¯š*iI™ ¤îœó¯ÓÔw?ú¬#¯ssÉÉ'„ž¢÷E¦*M…©b~ì±ÇV\qE±óÎ;/4²zÒI'‘i)-wW]uU¸GÀpG >Ø,¯‡zHh*Ip÷¥Ÿ’±ç=öæÕò^}þ=÷;l’ñD3)®F¤M²4õµ×^£M5Û¢á%«"RcüÓB“ŒÁ®á­ÏCâ=qê€ÓÔúÏQzhÓn½õÖJS ø¤—D¨Š0{æå÷ iê{íÈëõwFî¶ç¾MôCºŠ£¯ÈT8ªÐTÊèÑ£o¸á±k­µÁ9¤_BB§….Ÿ`ƒuw¦=£ÞGÀpúŽWÅá8å MÅol¾úê+É"qým<;lDøõȓöØf'id¿§Ÿ~ºZS¡©Ú$£þ²Ë.+u8Ø /‚õØcÍÔð’Ø5¼}ÿ„:Ž@NS£`òJ HÈßJS%õ¼ØZ—^v…—ÞCSß1¶S¯¿<ùª«O=E„£ßµ4¦:f̼¤DÄâÎÄ6|øÌ3Ïf)Ó‰ãXý!qGÀpꀀžtŠÀBǪ4U²Hüîw¿Ï9'n؈È×­wÿi©e&xó°Š2w$¥©0UÒ("9±\Däzë­GŠ>ßyç35¼i×ðÖáQñ>8uFÀijg§^}³i'žxb8ªÐT¼€è(±©bk=ò˜Sãiê#?ïàëêën™y– ¡§ÈT¬¦bMšJyë­·¶ÝvBú¥Ÿüä'W\qÅ—_~Iš(žÓrwþùçÇϪ^sæ½qGÀè3Èio%ÔM7ݤ4õ›o¾Œ=ö؃ 묿éó¯,õúõÅ×Í0ãoÞ5×\óÏþ³XS…¦RÈ´tàjÀ*ï9·É(Y…©êÞ>{6}¸Ž@9œ¦–ëŸkÛ´È'¥©ï¾û.° Š$mà½?]ަŽúüƒŽ¾=âèAã­¦ØN9Gÿ^aªZ~øa±‹-¶ÿ~òÉ'—éÎDÀ[„~~N|쎀#à8D€dEJ§œrJ8ªÐT8$½úöÛoç™g*œõëËÿöúÈ ¯ƒ?v’AB“²õÒ{/¼1²Úë±g^ÛjÛ «C† aK ÖT¡©8"Qn¹å–X@z²ôÒK£áE ü‹_üÂ5¼ýýxúè8M-V?WM¤ ¼ÿþû…¦¢ %m eà 7Díº×hêðÇÕáuçÝ-´ð""SI©OÖ_Iª¤‹1æV X%?¡5¨5u„¥¬¸3]vÙeýüÌøØGÀpÚŒ©"P•ª0«ViêçŸNgH8À—]aÝàëÎ{ÿL;r¯9æ˜ãšk®±4U”¹çž{.þДÍdñe€ ²J+¬"b R½ñÆ«ØZqmJËÝÅ_¬¢ öJŽ€#à8Ž@cpž¹J¢I&™„ƒL…¦r £Sæäp*yì@‰¦¼.¸ìúfš°J–Á?þñbMšúÎ;ïliŸ}öA¤r_ô¼T±ë’˜œÀi¡‰†—DaàW;Ž@ à4µG&²ÕðiwÝuW¥©’6L¹‚UpªLSGŒù¢ó¯Ñ_À–_}ãƒ=öÚOÄ'‡ÖœsÎ9rb- ™ÁRg¹å–æúÙgŸakµjlÀ›nºéG}Ôê9òöGÀpú›EÙÄAqBS%içÄH‰ûy†„üM|uì©“ ™\4¼»ì² ¹•¦ÂTÉaïÕÚk¯-b‘#ÖÑð’§ð¢‹.BȺ†·ÏZ¾#‡Àšú«_ýŠÈtÁjıR®ºê* l”í·ßžF¸ÊÖA‘&-s—R3‘ÙZa :–²·+l¹o+$Ò^ýõJSIð ,X3¤ l¦ŽóEg_#ÆÓT< —}øOOýl…•D|ê¡5 ²zÁ¨ˆÝi§Ä"WÓBúêîL}û ò;‘¨¸L‹c•ň6ª…T9˜¨‰t¦edkd¤Z^káFt,eoWªo^9ÖH@Gy¤ÒT8!5ɼÀ·3Î4Ë+oÜô×Ï¿±ã®{‹ÕGßãŽ;N¬©BS)ï½÷˜k®¹¤‡+®¸"^t¸|°\•(®áõÇÛès&ÐTä_zHBv„\àÔ äWQÍŠ Mšâ.¥àÎl­°KÙÛ¶Ü·iá¨BS9 Lpy»â)g^Ð8MõÉ—zÁ-M夎u½è²k¦™vBæ$Dæ /¼€6Úäî "–,S§vÿyär§Al ðÈêÛÉî8aT\Jdä#ºã¼ÖTÒ ­ƒt¦e®-5y­EŽ¥ìíJõÍ+[ÍöÉÁëGh*ÉxE§¼ÕV[Qa§]÷~õíÑ-z=øè3+­²†tcÎ9çD¯mi*óý÷ß?á„4`ÿ,Øì«¯¾Ê éǩʑì°êϹ#П”£©º‚äIG§©=ùÙ´›l²‰ÒTR 1^¤ <íÏO¿Öšúñ§_¶ÿ7Τ©ï}4öµwF|ØQWsøá‡'˜*ÿ²\}õÕ傃ôwÞ Y%uDfÀ*ÌJ˜GÀp,ñ4UV›iýkÌØ³m¡K<êyç÷Ýwß=ðÀ³Í6›ÝFÈ{œ„‰ êê‡Ä;ï8MA ž¦r;eª‰|ž8MmÊ4Õ³NêVùÂqd'šŠ_þöÛo%‹Äéç\øŸ4¡Öò×Ã=·òªBOa¤PhKS1PŽ9æx,=„ÂQaªðÕ•VšÈ0¡á%eF=gÁ{å8MD  MÅéH ª…¹ékš¦òILöàD¤+÷bi“ i!,"1)”hŠQHS1Yµ}.”«"-ÉMœªN5eÓ–©4UÔ™×^{-ÃTSOûük#šOS?ÿû§­|}2öïÕh*ŽRO¾ðæ6Ûí"?l§¡Ž&;Q}ôQugÂëÁ„¬ž~úéQÓd•àW^y¥S³ì÷u: PЦŽ7N½é”ì¸4A†,”ƒéHW ”Š:–@ ¥Ê²˜AIϨĶ³ë®»®J–õ×__i*¦Kºñæ›oÊ·äãµ4ÝkÛ^¸#Í¿à„³RñàÅ9K¬©BS <äÌ—~’ÙáÒK/;vìÍ7ßÌ6®ámç³ä÷rj‚@šJ×Õ šÈ¦‹})Èô‹ÜÒk•ërU&ݵ45õÜ%ÓÓ)LS¹Q"ÈVºÁ½2¥–ñ†}€Š4&×d¦«u#‘6¸¡©È?N §M±µn±ÍN­£©Ÿû{+^àFhê°wG#éoýý]|)y„PTc/M“U˜¼º3±xã7F-Gø¤ g »;SµgÕ¯rzR4•ñ"U„%Ôµ*¹òh*",±åÉAKSrPd1ÝHƒ¦©ee1íˈDOmeq¼1¹ž¼!$²HœrÊ)JS?ÿüs®:묳˜,çÐ$h*ñ,í|}ÞŰºãŽ;¢ŸUšŠÅ5 Iºä’KÊù袋ò/d•|¿ƒ81%Škx{ø©ö¡9iª ­„–4œé×òC‘7ºÜL̇¶f]›¦³GhjZ¶%ZK+¤UЦes¦`î±Gʦ ä¬38ªÐT1 È¿Ç$^|Õ-­¤©_6®ù¯¦ÐTä=Ç£Ÿzör¬9eë­·æXsº¶üò—¿Tw&Έûâ‹/H&Aš¥´ÐÅÖêîL=ö;òá8‘”¥©yõ 3ýÚ4…rP[SV,—X!ž6™hjY,4•“>$”Ý~à à9¢Òä?ø¾O+D­(JØN±£ª€LXtóh*‹ ^¹µ^»\¢_Ý~ûívþìHé$]¢²ˆÉ‡ç.z2»jÓn·ÝvJSI D}þ“I züoï¶”¦Žýâëæ¾à½M¤©/½9êé—Þß~ç½$·¾ ÝSåHH¬<í¸Rceeëp×]w ÕOwg¶nÿùxÿ²”¥©JÞX@BM–”„þ7A,UÞ‰mSW¡Äâ£RU* UüÑ‚¶™ð0Ê£©Õd±ŽTn'&\:>?¶,þÝ[ŸÔñ:}‹/¾8Uhªd‘øì³Ï$‹Äïî,¦¾ýá§m~=ñì°µþ•?Ÿ#œ{-M…©’øˆ#Ž#*«‡zèÇ ñ^f™eÒB'a¢oºw½çŽ€#F Ý45ÓQ6Ï…ØÒÔô–é˜Éoóhª:8e¦ïWån‚-« å^y'ÔõꃕHˆjSi*Éõ,«®¹îsÃF´š¦~þå7ÍzÁx›NS_|cÔ ¯¼çá§VXiÂé©Ý«¯¾Zol¹ï¾û–Xb ytÙLpšçúp¨OfÀ*NÂ~hM¯þ¾|\Ž@Fhªe¤akªÐ¼¤Mkªtâxmºé¦"4§Ÿ~zNƒcöù;ÝtÓ¥Éê|óÍçÞ>ÿ-øð{ ¶ÒTäb¦R…\‚"*MÍ㇪ýµÎº™45ïv.3[³›†~0ŸZ@i!TBS%m î\pA„Ä/O<« 4uÜ—ß4å×mM%‰tý¼‹¯ýéŒrë#t9.MV/¹äugBã­µêp•¾ä&託‹#àä!Ð6šš—rIm•VÞå…ùè(hM–,+¬3ijeYlijd¾¨þyÌ8Î6Ž‘šÊph8Èöfëmw.¤©œÞ‘×ñ'Ÿ1dò)è$NI¨K°£*M…©bDÅ«yá…'¤_’CÈò€·pfÀê:ë¬óöÛo÷Ïà#uz¶ÒÔ@Î!e¤Öm)óC;šsضœISqVo¥¼¹Ìl-&Wa¯>6m JÚ@fŠP}ä‰aí¡©_|õÍ_}ÛÈkÜW&ÙVÓTÐxöÕöÜï°I&È­Ðå´:²,Jþ}-|‚ “¬,O» ò&4Ä.n{õ'æãr´‡¦r©AÕf(T©8 Uù­Ž(SzV–ÅJSïÛljôB*5HŠ‹nThªdGÑ)¶Ö .»>†¦¾7blG^/{oû&„ž’?.±¦ M¥ÀK/ºè"=–|‡v@ŒRx“6«â$|ä‘Gº’·o>ðÞ@ ­45í,¤ ªh´ZÒÌH×îiјISÕËH’fhj@Ðö›Ço"m RPi*阅sÏ=Á0Ï| AÉÚFS¿üû·•_ðÛvÒÔg^ùè¾Gž[k½MD|2„ÓSL•ŘˆšOƴĸlY¡ë™!zcµõQ8…´‡¦r©ºÖм<b;•×j†Í¤©•e±ÓÔÀÃc•›p6¥©xÏrª¢0}æå÷#iêû#Ævêõ‡?=¹Ä’R–ï÷¡‡²4ùȆˆ”LËpÚ*3<·äN“UÒ@à\ø»ó Ž€#POÚJSÓ¹|”Ln)b/œÄ/’¦&¦×2û‰UÖª  pìzNmƒ½J¤ DM•´œÿ9tèP@Ûy÷ýÛLS¿úû·_}ý]Ùä¶ý4õé—‡?õòðK¯½sîù¼£)ø[¦úòË/‹¬å¤Ÿûï¿ÿž{îùýïÏ{Ãá+âWœJ¿ÜpºöÐÔ€8Ëä–" ÃfL²*è3›ª,‹•¦z^ßÄÃŒÓn`.¾øb¥©ÄæPù裦Š+¯N¶¿Xš:rì#?ïàëâ˯àmÆÎ;s›XSµ =×Xc ©0Ûl³ÝvÛmU °$RJoð£œPÐ-‹€÷ÓpŠ4µÚ4NS»èɳq’‹-¶Uh*6ŒQ1餓" ®»õöÓÔ¿ýÝß¿)óúú»ÒÔ'_úð‰?<øNYR\¦µ`_åÃ¥–ZêÁ´4u†fPA«þÀ]ôðxWG eij^ýp %§©Õf§žWÙ,O<1UhêóÏ?O‡‰MŸãN>§Mõù‡}½õþ¨ýþñ¸Î¾ž{éÕÖpÝ¢ÀH±šJœª-§žzª¬î¹çžpQ:ˆxMè+L°Ú'Ë©³¨BSmöy›ñ8Â45 ÁÕ,»–ÊƦjO¬„Ǧ–ÍØŸ45‘6ð¦›nšŠüã¨O&zÇwdõßpÓ­;HS¿ùöû˜„¶4uè:ƒG“ÀP‹äOâUKSíñå( z`•ñ!8Ž@$eiªžYšHn¦©¿YÍÙk©lLljd %M-+‹¦f>B0.{˜šJSÇŽË%$>@ÊÌ;ÿBœšV¦~ôñ¸:¼n¾í®™g™U8'ÐK/½”`ªxï½÷ÞRxTrg€Ì½÷Þ;ï¼ó¦É*‚•dÈ‘?I¯æ8D  MUJ™uašÈB”™?’!TfüLšªúÀI\š`©Ï­©6m Só§?ýIhꫯ¾ 2?™¯s/¼¦³4õÛ﾿à±5¡©’õ-ŒrÔn¸O8ù-M]h¡…T¬âzÝÁÕÁoí8mF MÕ¬¹éÃÞÂ45e>æ-[f30̲ĕ•ÅNS3EMy¤XM š øè”)k­µ_íºç•iêˆÑ_ÔáõÑèq¿<î¤Aƒ3Âg8¶Cq‚¬—´Â +ˆåUh*dõœsÎÉ X%ï”;+µy}óÛ9e(MS•² ¸_˜¦fž'N ºÎ&x¯ºç™aU/km°™4«¯¬\yg·Ò ½ÐoÓŸÖT›6p»í¶Sš*iá«q¢‰þòÜÛ§©ß}ÿ¼ ¶&4õ7— øHO3Í4xai«é–[nii**^qÐ’B"«²?i¯ï8Ý‹@û¨¼à$s MźHýÏ?ÿ\²H\sÓ] ÑÔ1_Œèô šŠûñ³/¾¾Õ6gÀR8{üŠ+®kl¹þúëõ§Áª@GÀ"CSÙv³˜èF»Š («ÒŤԗŒý“ ™ü…×G6BSGŽùbä'|A’…¦’Õ‰üÃ÷<ð§ZDNBTçi²zì±Ç’x‰ HR°ùì³ÏøáfIáÒ7xMŸy晾9Ž@ HÒTÄ Ò+]T"Ê;/²¥ÐšÊµˆ(h…—jËÖ†)HÙÌõTSé(BZ—˜„V8ÓšJk6¤––•ó9—h7â¹ij"m UhêsÏ=Œ0Õe—]ð=ê¤úÐÔüãŸök­Muö¹@ ½ï;ÿ*@*âó°4U3ìóíºë®[Ã%ûä8­C@%ŽÈÙBYŒäJdˆ¾:ýJûêÅ*dõ¨í-MåBL¦r8jBz&TÃy4µš,všš~êHdI×-·Ü¢4•¿Ô—Œý묿iã4uÔ'_vêCNÐTÎt}oÄØss‰Z³ÓN;½öÚk#ÿ³ðÉ6Ûl#°zõÕWóÍ7ùÆ6i² áw÷¥Ö­lÞ²#P $MMÿtŸ ™Â4ž©l7–úfò^i¿JJWño:T&¦5™Ò²´f»‘¦Ê}HSmÚÀÕW_]i*A•`ˆ\¯Ô;î¼^4õŸÿü‡¼þñÏZÑÔ;îû+pKÃnRiª<¥ÀûÈ#XšjChÐTûUûUŽ€#Ð¥XšÇH.$c‚Oê¨ 3ýZRj…`¦ï’´&ÊbéUZz¦cMóhj5Yì45ýHcÔ‡dú駇£ MåLQ*ãŒ#‡µœõëË›BS?þôËö¿àÆy4õÝ>ûÛ«ïîºÇ>rü8É~O9å”Så_R?,¹ä’§ë!s!«§všM=¥0r¶ù+¯¼Ò¥«‡wÛè=þMSUêd¾A¤AáÒÞ> D¨#—ÛÏ…Šðc§n=‡EÚBOùV¨£5xÊUÖ*›ÐûÊí2›E¨[w)]›D§'X; ç½ôX$Òr,¸ÒT¢\éùçŸh˜Ÿzyx­hê?)ÿ÷ü©M=äÈ“@ _#娼Yn¹åøð„N°4UŽQÕâ3½ôËò±81¨Ä HdÄ1òHì™yE$fšsZᘅޫ­q; °ÖÑITÉéDÊEUˆ'ºZV MÍk-ÛÞ«c³Hl²É&JS?üðC‹”hHŸ|ñ½fÑÔÑŸ}Õά8LSßþÙÛ~zÿÃO,û³EtÂÌÿûߌš(¨}‰e•:`…Ú?á½öÚËÊ\}û´œ½çÅp:‹ÀšÚæN@V± ɱi¥nM}È$Ã:¦M¡’Ú7Ói*¦‘Þ«“HˆŒÐÔ'žx‚Á~÷Ýw믿>KùŽ»íWCšJkHS—Xzyã`7 ÑRH˜,Úßßýîw–¦’NIÅäâ‹/Þ{O—Èpj…’T¥j©ŽqyѸôtY\ y­ ²9Ø)Mýꫯ¨†²Ô²+üíõ‘M¤©c>ûjÌØv¼àÑ4õ­>}óýO.½ê¦g8ƒ€BÈÌßþö·S%7Äᇮ«lÿP¾¿ð ¢5Nœ„9˧ÚÔøUŽ€#Ð,:CS›Õ{o§éØ´ ,°À£>*4õõ×_ç^de˜rÊ)YÍ/½öÎÒÔƒjͬ©=û6)‘A $•¦’•ŠO^xa"~-MµÉ0Ž:ꨦO®7è8Ž€#Ð\wÝuʬ&žxâ‡~Xhª²Blª°¯;¦é4õ“±oýkÀl[Ц¾ñþ'/¾>|ÿƒ1hЄCk;ì0|—ðK²åùçŸ‡Ä t zóÍ7£ÿío‹×tš¬Î?ÿü™9±{ãòQ8õGÀijý稭=´LiÏ=÷Tš:fÌúqÇw°Žsè“/}X7šZÏJç\x ˆ‘Ô÷-S6ÜpC>D#`iª£ª…ÝF['Þoæ8Ž€#Ð=üüç?Wy±ÒJ+qd¨ÐTˆƒàLÑI&™„ wÿáÉVÐÔO?ÿ{K_ŸŒ­BS_oÌkïŽùó“/¯±Öz޾×^{m‚©ò/®LzD9¾ÓO?ýô_|}53`Z‹–¹{ ï©#Ð;8Mí¹l|$‰´7Ýt“ÐTä§„Óþî»ïκ?tÝëFSk{ Í›l b{ï½·¥©C† áCÿZšÊ©nºçÀݨñÙôGÀpzK¨ðeUš:vìX†|Í5Òfœùù×F´ˆ¦~6îëÖ¼p#4uØ;£_y{ôu7ß=ûœ¤(Ë/¿<›™4YÅ­—ÄKR‡¬È£G†Þï¼óÎi³*þÕ‡rˆ׫¿&WmpšZÛ©é@ÇlÚÀ馛Že]hêK/½Do8vŒÓÃY¾;õ×µ¢©œ=“ùªÃ¹©SM=³‡¢7ÿUȆÏ'dôEími*‡¿©hDMÞé÷[:Ž€#àtˆK¥î»ï>¡©O>ù$:eÊæ›oN…ívÚ³¥4uì_7ù5@}›CS_~ëã—ÞüøÈcOåØXÁj=ö 1ñض çsÉó?ãŒ3@ÑLzˆ4YEƒŒ¯u7< ÞGG GpšÚ#Ù”aØ´m´‘ÒTI9KBVm"-üË+õ¡©ß~÷ü×÷ß|ûý×ß|÷÷¯¿ûòïß~ñÕ·ã¾úæó/¿A¬¢¯¯ý;© þ3æ‹£ÿã ñÃÙ>KÖ{Ò ¾õá§o~ð Ñ/âV4ìÝѯ¨l?/ Gqr:9*PZ³'xn؈g_ýè™W>ºö–ûAlРAÊQy#©%+£ÒTRUÉ1?Rn½õÖ¦L¨7â8Ž€#Ð{¼@åY$à¨BS9)”ÁbP•,_uK«iêç_|ÝÄרfÓÔßõØ3¯oùó.l§'tR‚©òïã?ÎQ4R‡Ð§»îº ²Š·0¼4MVa°•Ó{¿)Q=pšZÏyé@¯iÏ>ûl¥©_ý5âpÖëYâ‰?¬ M……¾:HS÷Ü÷0Û`ƒ Þ0…” |(Y•¦"8Uâ\äžEøø-GÀèDŽHÁ[Ui*‡¬0N åóI BgÚršúå7ãšô‚î¶‚¦¾ðÆ(4È·Ýó§…pz*~a¸5qlO¢à÷4×\s ª°VŽŸ%g2›QÙÂÞ%‹wÓèbœ¦vñä5·ë‰´<ð€ÐTIS%I ô¾]šú5–Ò˜W笩 Šgu–²TñÔBæáJmiêZk­¥ÂéØÜ™õÖGÀpzD‰Ë/¿\i*Ik¦øì¬½Þ&m£©_|õMƒ/¸nKiêó¯3~uÙ¤“MðÞxãÙÞ¤É*Zc X% 1 ¸ˆx!… ÇùH9ùä“ùx9‡ÖÒTëYägµuÙ/Ç»ë8Ž@@F(eB.ã•#4U²H`”,¿<ñ¬6ÒÔ°š^&Ù6ÐÔg_ñ×çßÙi÷ýå 8Br=ôP‚qÈœd vÔuÖY‡ 8ëÄr25bó­Ÿׯ§ÞoÕ§8MíÓ‰O í¬MÈ­4uäÈ‘TFG{ÐA‰hä@šCŽ<©ƒÒ|õõwe_íM=ú„³Àj±ÅSŽÊ›•W^™;î8KS/ºè"«¦õÄ÷þ›tGÀÈC@£(œ•¢4à —¼òÊ+’éà‘'†µ“¦"d+¿°Ä¶¦>óêGO¿2üÞGžûÙŠ‚Qgžy櫯¾:ÁT÷Ûo?0ÜvÛm‡ Fâ%ˆ+Z€_|Q’-I¹ì²Ëü)u–"à4µ¥ðvAã„A¦C/È 4•Ìäø•‘à!³ôÒKË=ëìs]~ý$ "]пeá#I&DJ! ‘ž$CÃÞH8ôú{Ÿ¼ùþ'o}ðéÛ~J:"’‘šˆEŒüüÃQŸÿxÜG£ÇóÅÈ1_ŒúäKNô&­É>2éŽHz„ C’U–‚í§©8\Ò 4U%Üïÿ{KSwÜqG{(k»à¡ñ.:Ž€#àtD¶ •<ýôÓ•¦rò'=:í´Ó(Äaþ‡h~ÝŠæDó;£Ç‹æ1ä$; 9ÿ-GŒ}äØÍ£>ÿèãqdüÑüÙWdTÑLVÂñÒy€£–UKýñÒ¹Ý4=;)6~sÙo:ÃÌ"/¾øâ÷M‘ U²HÜÿý÷Þ{/›"ŽZå`U«S&£G'¿§#ÐG8Mí£ÉN•xÔÌDv¤ùeQÖJR¢ •DJôŽSM5•,Ö«®±îz¾m4µŸ¢vgúÅæ >÷Üs©¥ èý¬³>õÔS–¦Z?"w"êë¤Þp äW¦„ÕOT¡©D—p~Ok®¹&öÜï°ŽÐÔÁ8ãÃv:KSI´ñø L9ÕÀ¹q–¦j Nú±4•„ˆ >'#ø£ê8­FÀij«®iû¬Â™Ç‚ª!>-O<ñž{î)ç¦R„\òî»ïJ†º¸Äˆgé÷Úÿð'^xwà ñ[SMÒЮi.ºòf™zê©•£òF¢9¢ÍÒTÔV;ëiîkúƒñn9Ž€#PÈë«"c™e–A4 M%À’Þ‘éw’I&¡Â-¿´S45*µáÀYqßצ>ðØËÀŶŸ^5¦žp |¸úê«?ôÐC–¦N3Í4 þ‰'žXƒÇÁ»àô8NS{|‚ÓÃ#gÍ–¤k.Ëô>ûìCLIÏN?ýôø MYˆðˆ#¤Y²+iÍfœù7—\×RšÚ”¬÷í97uÛöØm¶Ù<µÀZùðŠ+®°4•0`ƒûîqô;Ž€#àD#ðÓŸþTEÆa‡¦¢YP¯ºê*¾jêi“ñ8írú…yBS Фy-hê/Ž;Ä–Xb ö3Zä yˆ¨¥©—\r‰Õ)ãb=i^Ñp*"à4µ"pÝx&P–]›*I×ÜUW]T žE³Í6›T@eËyb}á…Æ' à×J6<©¹ô²+ÜyïŸ[›ÚÌÄ¿øšxWBk°!–8X¢a‰‰%ü† ¢d‰•%b–¸Y¢g‰¡%’–xZBwà!Œ‡`Bz†½;yûÊÛ…Ëx‰È}áõ‘Ø“9¤èÙækÁ‰H9êÝwßÍ'€O|¯¥©dýÕY@}ÐÏ•÷ÙpG   >,SºãŽ;„¦þõ¯ýÇø":èÍ·Þ±Ã4õ»ï¿ýîW}hêÊ«dô%ÜF9*é$ħ x-MÝ}÷Ý|”m˜n¿…#à8Mí—gÚiµ°ºÚÎ9çœ7Üpƒ%¨ö= „Öâß»ÕV[§AšJA.²šûí·‚ 5Å׈õ}‡]özü¹7š›B‰,JM|µ”¦ÞõГ‚ÃóÏ?O†@)’6p³Í6³4•°"œ«u.î—ÇÑÇé8Ž€#PؔʋYf™E1´4vìX>¤Â¹^SšúÝ÷ÿÈ|A_kBSÿôô[’Eª¯;Ÿ /¼OæwÞ‡~ØÒÔ…ZHÁÇõ¬äÔyuGÀ¨‚@EšŠˆŒ¯”í·ßÞÞ–ùp½õÖ«Ò—º^#ƒbÈuí`A¿pM–D2dÜ2 êçlì¶Ûnrí¤“Nzà*M…©âLw”¸tb̘1š´v²!“Ÿ~ÎEÍÊô «lú«uÖÔÃ8u¥•VRŽÊ›E]”Ï9çKSÉ"¨“BòFOØ¥?1ï¶#Ð)òd1k‹Èèî•\)º<䔌…ÂûnQ#ŠÍ(±ÝvÛ)M%$•fùw@§<ÑDyöí:ÐÔï¿ÿGúq­M%Ó/ˆqj7B[n¹%BD-M½í¶Û$‡ËFæÑ¯uH*ÒT¼巊ذw’ÓJÐçEÞ¾uÕ†Þ¶,‘†ÜºÞ¶¨ehKmš ò Ì“óQÔË…€U˜‘~O.¥UVYEšb~9êŽJy||zÁQeW¥ó-°ðmw?Üà4ðɽZäô»Ô2+€9PH!¯/Ÿ@D±E[šºÉ&‡ÖHñ´-úx³Ž@#'‹õäŒ:H.ÎåªÐÛo¿]Ï?KH± ßžIÄ´Åá‚ .Pš*nM„ªˆ’W{úåá5¡©ÿøÇ?íëûü³V4u›ö1ÿ;¦Hž$²HXšú‹_üBÁÇÅŒª 3è—8Ž@Yz“¦"¡¡R³e$«¸Ðt#M=óÌ33ÃP¡C(•ˆr ø—_~ÉsƒœC#&«×_=I••W^™ó?…¦BÃ(œ-ç¶Qð_l²É¤æf[nûô‹oW97uì@øhK_MM%㱄µ<ðÀJS%m !¾ûÛß,MrÊ)Uò1_e½^ßpúšÓTdÈв4UÄ¢UkªJdÞ”m³Û•Ë.»LåÅücMÂXah_}õ•(ˆ:þÌZÑÔþ«üãŸÿ¬M•CSÙØ(K•ÜûSL1ªyKSÙð(øë®»n·?KÞG [h2M­‰ÓoSŒº*_»Ž¦’­GsYåëL3Ítå•W*%÷úgŸ}&þºZu¢dõ7Þ $©¯¥©ˆF;;o¿ýv·¬ÞOGÀ¨ y4µ&N¿ÕŒºÈ ¥£‰À"ñ“’•3áÌU“i]7`G*28+Ei*òš›r x¥ÞûÇçêFSéÞ?ÿùu£©wÜ÷×ñ›“ADå ¥ì½÷Þ|ˆ£S‚¦þïÿþ¯‚¾ u³ì-;Ž€E É4µ&à6NSU¸êÂÔŠ[ÙÕV[Í’yÏB ·Ô3Áx3zôh95]P}~þùçXYmýÄûçž{‚*°zÜqÇ)M( †¸' Fvj—fšy–ë~{'YsÉKÝ0M…=¶íÕÄL¿m¶ ˜Û²I.…šÖÒÔ]wÝUg Z[“ߎwÃpº<šZ“!T£©PSYU¥ÎÀ]k2ÒVwµ¯uÂCGiª81}öÙ 6ëìs=õÒðºÑT8j iê~ bD3)GåÍ ,À‡d‘°4õ¬³Î²Û*¶7­žnoßp§©É'#ª‡Ñ÷5§©„¡rÈ!D?¦9*zí¹Õœzúõ×_þ¾ÿþûO>ù$ÀTù ¿Öe—]Vî8÷Üs_sÍ5XSŠòôÓOsh ÖZ¹dcË•š«¬¶æSÏ ÓTxc›_Í:†ë#>ÏÊQ/¿ür>ÁYš``KS\pA,æ®pF¼‚#à8 z’¦Š)•¿ØN3g\]‚›’¢+*v&*/°š>øàƒBSeg‚ÒyÍ5פŽ»íW7šŠU_µrú]béåAì”SNÁL L|Â>êü£¥©’TI žÕ]ñÀx'Þ@ ƒ¦"(A)8efÕkD4r-ÍJûe³¥IÒ?éXžcb*[SmæUd¤ÜNÖ¦:ÓÔßüæ7?ùÉOÒ•«9ÔÔRͲZ@ X “UÒ)éÝ7Ø`ƒ{ï½Wh*å™gžyíµ×p$–_ËÉ'ŸŒ]—~N4Ñ÷Ýÿ7Þ™éô cìÈ«ñsSo¼ãAF‡í½€1;ï¼óΖ¦²Éð´½±†ú(Ö! "I”)ƒ‘Åw•õ¼ ˆÔô¹¯ÈâpêÝ T=~>½Œºu“ÕÒ–m6ÄÅ[ %4%–L—^{gíhªÉ¢Tšúسo“Ä ¦JS¡¬|ƒÇù4–¦ª’oqLkéD{㎀#`øšŠÐB7©1!J{ø0AVó„„\ž—»A˜NÜGeÒfΊ´&êRd¢còUB²Êݵçòo|.%‘©ÔÇ×hܸqÜ·‚”mçÆÙ0óÏ?š N;í´_|1GÅ$ –=’òÆÂ®2ïäIJ·“ø„UžÀK±åBÒöØc:&4•‚0DW|ŒáÉÛn»­txši§»øòk±©#?ù¢c¯1_ŒýQ²ÄÊÒ+(4nÉX}qQÆQù­?}óƒOÞxÿ“×ßCîâaïŽæ¸WÞþøå·>~éÍQ/¾1ê…×Gî}Àጋ"KSg˜a>ľji*nÒ:k¸rN„WpþAéƒ JËb(ùo-J"û2É-ìW#<­¸L‹T¹—ÍJ˜p8’ËéXB鬛© ²8Fá+.9‰‘ÆŒº‡Ÿ{ìùž{î©4UŽ1+@žt²ÉŸ|éÃZÑÔÚHsÚ¹—‚.¾ÊQy³ÖZkñáGaiêÕW_m·Xìgzø1ó¡9uCàß4™IðTÆX™‘'fL6±Kü™zSi¿z­Š:+Y…OJIËu¹]$îcîe©omi*|oÓM7MTRÁѰfrKÈÒ¯ýk쟄’†1ùøão½õV*ßxã…4U*<ÿüóm´‘tiª©¦:ýôÓ•¦²²ãˆ‚€¥©C‡Õ¹ûùÏù|z5GÀèyl†ùLqi»2ý&’è&¤j&³UnÂá(!p-SÍ;K&†¦N±Êå¼àÕº«yø¬¬¿é¦›„¦rÂ9 (rbùÐu7®Måì™ÌWÎM]k½ÓàöÚk/6KRˆÓo/Tó–¦JR%)( ºëÉñÞ:ÝŽÀšŠÑLå ë¾ÚN!l–"êhËÒTĪÒ]›óÀêtÓLUI¯ˆj$“Hþª”⫄̦oz¡(e‘‹5¤©¤RÀí$3 uuÖ)«„ÊrØŒäCÒyäh*ü“‰xýõ×ÓO0¶V,®T ÀTñÚÕkAúf­äÆ%I¦{á…¾å–[è…¬KRêѹ)2dˆÔÜq—݇½ùdµ¯jÖÔÇž~ &À’¬4•\Ç|ˆ/4"ÐÒTIª$ÝA·¯#ÞGÀhJð&JK•–¥©bv“¢"U¤ª•õ 7%•ƒ²O°›«à¶Bœ]}SÑOµe±Â‹bZ·+e㆚5GmnçÄOÔY›nºéà¨BS¡¯ô„sÍ5N9û’:ÑÔï¿ý.÷õÍ·ßýÍ÷ÿ滯¾þîË¿ûÅWߌûò›Ï¿øz츯?7pRú'cr(NÈnøÉ€ ;éè4b‚£ÓÛ~Ê!œx÷o_§G§Ñã>~ñÍQ/¼1êo¯|þµ‘Ï ñì«#žyõ£§_.Y$~ûÛß*M½öÚ,ý³Î:+Â[šºÈ"‹(ø»ì²K›§Þoçô9hªúÿdê&Uz!«¯R4UCÿóÒíË]TZg^¨2;m,­›š~êFS¡4™a¨äã¹óÎ;¡£RØdÀÅtIAÛJ>$ý–#°ò)…yêÀɤ$[¨^Â=½† LDÂØ¯ÒïÏ8ã íç[l7šŠÅ•B>=Iã„ÃÒþûï/‡ÖL>ù'ŸzÖGNÓéW5šzÜɉiصˆ„ðŒ°ÒTŽeW±ÇñÚòâ8Ž€JœL#•zš:¨,MU‚—™#7Ý¾ÌˆÕ §/Tó/çñÛF”ʼn§B7 ýs §«È@ž*MÅA p$ñ‘–>ýV]hê·ßCDïÒÔko½ÄÐ’sÀž G"dÉÒT²{Ø,há}rv"0@S5cAžs¬T ¨T(ESóX¨Ž3¯JSó‚WEâö MÅ ie• ­É'ŸÂi‰"Œ4qª@ýÍ7ßÀHµ&†Í›o¾YÈ*æSx1â «´ r×&žK’àc­ U´éûí·Ÿ¬xàJSIxKaÞÉ'L³°ÖW\QF´Ð‹Üy÷CÅξ*Ħ®³þ€6‰.”£â‘% œ´b_•L¿xùêô1§íüÁû½G ÎÚ R¯MI«íg¿ä1ü”øM×óZ“of~Ç:Onµ¾¡Ç´jMžQš*rï**,¸È¿øa-hê7–Ò˜W§¬©;í¾?ˆáådiê4ÓLÇäï°4õ¤“NRðÙÌàËVmý*GÀ¨†ÀMUÑó@Z¡UЦæ‘IÛcrVð“g5í1k*lW+¨ä=Ín?Ê3ùd˜^b2å²JÁÊŠ­UäÖ|Ká±cÇò`È*æYIK@!™·Àš*4:‡+,'¸J ™yæ™¥æÆ›nñ싯Ã;ø*›Bi’AƒéùwÜ¡4U²[tÑEõ¡©6Þ\Õ~º~•#àô…*cÆ‹ˆ´R²MU·©€¯¬ºébYUx•mªGUy½*a5m.Mµ.úçÄT\¨TúO<ñÄ(‘…¦"I™²ño³ÍÀaÝXS·Ùa??óVÇS(A>ã_qúg¾…@ŒÝqOR4‹î¾–¦êî…ú$Gì±LJãÔšª‚ÄŠ¥p×ãi*UVXqÜÍ+*~¬ìQ¶™—(¿çi*ª;hŒ=Ô[ÅÕj«­†«ÈHá4TÂP#8è%.ÁPP½™GÌ“¥Ÿð­u´ŒEt̘1zaæŸo¾ù¤óK-µŽ4ÂT¥p_ X=öØc%Á Áƒ=üh¸b_ñ™~/»æVúLâ(;.B…ù¯fû!lÜj$¸È‹#à8*Xã-ESUeÌ‚œ'‹Õïת­u“GóèhijrTÔš6™ÿꫯ®4í§üdˆÁÙ|óÍE¬ì÷„SóôËßyå£g_ýˆhÌç_Ad&‰èIGORz"6IPOšúaïŒ&e=‰ë é$‰=©ì ò$§=™íß1öý‘c?õùðQŸƒC|Nkã”8"E‰óÙWŸŒýlÜ×c¿øúó/ÂJ¿øê[BLáœ^mŽMýã›R´ü¤rTšzøáYúùÝ¡X·4ÕÆX]vÙe¾F9Ž@› ©…FËtŸâiªÖ´[óÀ{«¬-4Šö6M% šÝ4’%÷Ÿ`ƒ÷ßÿ»ï¾[êéÁé7[â ó,Õ±¦ÄɄɪRn${Ô––¿áú+.L0dÂod¼3Ï<ëU×Þ ]ìÔ+ò@švÙ‹Þr¸Ñd“MƇ¤¡’ˆ\)jvà+OXêóÊŽ@o#Ph´Œ—Å™ü03~ž8¶þ½…l³Õ4ÕŸÓ'vÔL/*²Î*M%…E5¼=ôê‚ZtÉën} ý4ÂYíÕÎJGŸxÏ<‰I©Eò>rnª¥©œêglQz{ýñÑ95DÀijÁ¤ŠçVL*6Œ¥éÝfF"%2© êñ`Áã4&©zo¸áb0òX%\ëüóÏGÊa§……Ô‹¿ûÝïÈp¦©|‹át÷Ýw—¡Áâ8 ÌR8î‹l–€UZ#Q°ÔüÙ +=öä ¨x;ðŠ;7uö9榟âÒ,E|é§Ÿ~zÉ¥EÅ·²bëG OpššžhD†M¦Ø©}^T¤óA‡‹ [ÏMEÛ D¸þ tçž{N*rs‹mv|ôÉam³¦bPmàÕ¾L¿«®¹.àvØaÊQ±¦H Pµ4Õf‘À¦Ý'«Ó¨í£©Hš€Ó¯~eAíCk*$ê’©Þæ`4¤,N !<õ_’ªË1§B/óJ‡[M›¤—'ÞÐ$–j—^z)á£G‹N—›RW™¼Ÿ“[h•UV‘aÎ6Ûl—\r‰%«$sÒ€U¾"GÕ&šè‡»í¹ïkïŒÀ%©ý/\¡ð‰Â3êß)ïßßÞSøPÝ÷ǧÇ÷p"N£ÕH81QCr¦FÄ¡”~ØrÕj½óÎ8uF =45€£²ØFÀªk[dMÕ¬–²…¨óô5¥oy^T³Ï>ûf›m&‚ãÇ?þ1, ÉK¦J8åûï¿/©Ù  –ü´dL8ð°cÚàô‹ßoã¯6HóøóïN2>ªá«4õÌ3Ïä“e–Y7`KSçœsNÖä©jÊüz#Ž€#P ØØT‰ZÔ¦ã~mlj©žQ¹ßh*kefêòË/’O™¾µ†ŠÚ•õ+‚U®¹æ¡—äF²€Ã'±OâÄ·$øe¶ÔÇ!l˜°*…¬H?ü°ðOL¯`ÓÓƒåFr;wÛ Ù†)aÖŠŽ*bëñ<`­Ž<9¢³€º“%Xª ™|Šss ¤±ý¯M=òØSéÓdû/Cp&B‹=þ޹ö´eׯïô01±©¬Š•S(efñÁ³#45ÁQcúÙÕu^TàOjC Iã—]vY‘†„ÿp¶™ÐT4¿Fë°К8û\zõ­­‹M%<µ9¯ÖŸ›zÑ•·ÝÔSO-©È¤¬¿þú|x衇ZšjOæ[¶O]ýtyç.E 6Ó/ŒQΤ²OS©#IÛ Ç÷§5ÅžM“  <2ßrät‚O&›ápT@#…’VC\ÉÙ§J/‰5ë(‘d >i={yoé%Á8‹õ3¬Î-+Æ[Bbà´Ú&éäLT 4Œd•xÚ£>ZÈ9fF,ä…²dOVá+­´’ ³À‚ ßrçýä{hç+@S—^vzuÌ1ÇhÏïºë.>!=ÃAòi±i7ÝtÓ.]5¼ÛŽ€#Ð b2ýJp;RUB4K¥PRïÙ@x'ÂqL³µ¦ZŽ8ƒ ³Ðþ6^TŒ‰ ´åŠ+® œD¤!b-4*EA}¬Šì[n¹eÆg”š«]ï}±é)”È¢ÔÌ׸¯?7Ÿé“±_‘®‰¤M¤nùÉ#Æ|ñÑècêþ}V܈±øU¡°fðÖŸ¾ù¾ñuptÍH_zóãßõ£°'?ÿÚHJm»Óž@—“¥©’µ¬,MÅ^­;1)µÿ©ð;:Ž”87UD£ VЦjòƒ¼ãO!?šÚ!} MÞi®t£R(AÃÈr®«¡¾ÓÊï½÷Þ}÷Ý'ôRNCŬ‡"VrKáô哉ƒœ°ª5{×_½4‚$]“´ŒtD¿«Õ°ër˜*´Ù¶Æ¿|ÈWZ-ý†EwØa;q5ÄßZGYÜhõ„UèŸZ³Ö:ë?þì0ØcÛ^™N¿Ï¾òøñ’ÂW»-i×Xc„£»F ñ­§ ô%Øp(“Ì‹H¨}KÑTÍâ›wü)Qyy MžÛms~í– ç9jžGj£NTý—µ¸¡Š†ÿ^PÂûIh*À¶°Š²ø¿øÅ$“L"ºà}:â¹W?hV¦_’ý¶àÕBšúÓ½»òÊ+I!)m>ŸH KSñÖýAª¾R9Ž@G ©Mõž)ô[MÃ[Ц"nõמ©ÄÕöYøtú妇²:;Už6¨‡r·4GEÕG2!¥sjJ Ü‚X¢²^ˆ$CAÉ'§é%†Aqñ¥`ã…[ZÂɪ 3¯mPNX 0U¾Bʪ“Ò<ó̃ ±d•ÛAÔ¥ÍÓN;MÔŸØÝ÷yöå·!íy¥cS/¼l@Èáâk{‹0wÜqøBk=;×1É® gÜ+8Ž@/! Ç˜g2Iå™*+KÑT€Rp¦¬×öÚáB9XHSó\Íœ»¼-A/M4cakDÄiz0ÓL3a/Í#¨ös„Žb…ôä“OVšŠ¼æÙ@Ã+r'9 2õ4Ó^tÅ Í8†3iZòj‘5õ®‡ždølÐ}+Måðy>dÓei*S#Á½RHüÑcÏžÇè&ÐTõ5â‰üS=.¶MÕ­Z©YЦ‚…=„ƒUUM¦ÜHÛG.ZS*WU¦©¶ÏHÇR21s…â¹ÚLs`·=KWÃ%—\’MKçXLËF0bj­¦ÖàIËa>™N‚^b¤}ðÁq.²= ›ymƒ°h"gÂdÛ¯"³á†b¹µ± VK—.µµæyQÁ P^#gµ5ƒêÙ~’~#œ§BYpÁÑð"ƒ ©Éê§*Qrø-°ÀRs™åV¼ç¡¿6rn*d²u¯V8ý’MН¸âŠÄiMÎM–¦ž~úé*¬±%”݃õöå£sÚ‰ÀšÊ-m(¿O‰DÕ*¢"&mC€XZ˜n_#mìà+ÓTUHkÿ+›U ÅsÙÙBÙ¹øâ‹kÇô ùlI‡€sl¢Àä±Â¡4¼Ó„")˜nŠOøœüIÅÈÖ„‚^fk|HVÞ²+8ÎÉy­Éçd,$,Dì̸*í¹çž]KVÕɬÎ1×|Ôç}KÞ+G ø7Me´HÈdâpþM+,…ÓRnºü+Ÿgb‡WR1YI#djXíq‹@d¡•ë•Oþv(•‰®BÔ!kNZî⹊`Fe’7T¡’ž,Þ>‡’hR(¨¤5¢fM¯])¤—T@ùJk¼ò×BMê‡iª| Þh£®©¦š í¦eªHðw&xæž{àØRÊÊ«®ñðcÏ¢!néK­©·þ~À¡.mû†˜9XH"…¤à}m§>^ï ¬Ws^BÀŠ0Y:DV&|ŽòdqXr‰ŸTZ# 3ee¡ T@îÛ奨йS±.’7\;š?¿ùÍo2½¨–Xb ΡQJ^}\¢Òc!1¾»²J®D$B*í¶ÛnœX#4•£µr,9l y®pG:åŒ_•¢©0Õ6¼šKSŸxá=É"Á®†tRÐóÉСC ³²4uÊ)§TyͬÕü¹òî9=ŒÀÐT'Ë WI½ÛôÁÃHiVSû6½}Û $°)ô2jih¾Çj˜†Jþ$òø)m“´Fkr„sêa§d-²É¥ç´ÏÞBøçm·ÝfM©¸ Q¯!½zD͇ —zØ a¨\’G,Ñþ ‹ÆY—ÓVH2 ˜¶äaŠ¡©R‡DPêδÐB ÁÃmâ\D‹¬òD 2Ñ‚(BCüÔ oA&[÷§ßý:‚;’¿×ö R͇ü|$û¢=S‡¯~úÓŸ¶ú‘óöG @~iêÝV2‘õ’Ú·íë@ŒÙƒ{`vâ‡çE5Í4Ó q Ò dy ga;ðX{Iâ=tK5¼Èš³Ï>[i*SÀ·Vé9$Eòç[S?ýjt_MÌô{æ¯/g˜óÍ7ŸrTÞˆÛæeKS%©’6Tñí5G ¹dÓÔæÞ£Ï[#øQaW=yéB ”AEWjÓäâçC$§VÀiGÏ€áœ4Íú‹àQ¢ˆRë󯆡~õÕWÜB¿…VI>¤4½D²L ŸäF¶A8!ñ¥°hZÖÏ©¯¹‰ÆLgâ>MMêëµðgFM³ö.é÷V ½ù曓lÉÒBÂw7ÚÿýEc:ÙÉ>þ4²D´îM]tñ¥¸NDÚX=ŸL1Årœëé͹;}þ£ðá;Ž€#м¨öÝw_ìŸJ2|dþ+D0{ƒSå+6P2Ùl`­å”rÑÚ‹¨‚¡!Ä¥M¾‚-KÍ-¶Þî©ç‡œ~ám~5ë@šuÖðeÛ}÷Ý•¦âÓ$»2nXšŠZ7lœØO©Ñ¨-NS[85,‚dÊITÂPO=õÔ<>™èP‚^¢ zÉ_‚õ°™Ÿ„°I2z[ä„U½¯$×ŧWl°X¾%CŸ*¨…ö-½DÜJVa|ôÑGÅ£˜¿¼—[À±aÚ––ÛÓkhÊ «´Õ€ÕýöÛO„®¬µ2dtŸœ#°Ï8Ó,]~ëonÅë‰çßädKÂÜ¡ÝØi§øÈ¼­´à–lÓ¢žhácçM;Ž€#àt€ÕÚk¯Mœˆå™Hö²¹ßá™8ñ†É*Á2êfŒ†Q%4U¢Tp€RI}衇 g4hðQÇœ˜› cìÈ«)ç¦N5õ@ ôÈhó¥ „Oæw^Þ[šJ*ݶy‰NÿŒüþýŽ€ÓÔ–<(P±˜¥ *b`¯½öâœåcbŸ w"@/3í“y§¡Ê]Ð×"µÈ95u Ÿ„m -c„¾&NCÕ'è%²öòË/-ÉŸxÏ'|ž å!`Ñ™”æ€`±QŸsÎ9–©ò­ Xk®¹¤æ2Ë­ðû{åí›û:áÔsi«¸í™“ø?+ø¹Ì­ú0xÚÀ–üä¼QGÀpjƒ@^2(‘;¸% =ä/g›'ÔÁy(4¿é¦Ÿàm„VW5¼h{•¦Ê!jz,9ÒSOI˜y–Y¯¾þ›B‰,J|óÅG£Ç ÿx܇£>ÿ`äçï‹É—lOx)“ùé­>}s|ªÿ yøßýÊÛ£_~ëã—ÞüøÅ7G½ðƨïxLâ(娼‘¤¼ÞG*iXRóˆ%ºXNïDÒÄ zŒœc¥Îk ê•™)Ð8¾¯3LÛ8,.—×=ù9½Ç{ÔPArñË1qZôb FŠ£I•š3Ì4Ëù—^ÿâ£y]vÍ­4EÚz{;‘p°b‚~µ`R¶ÅtÛX+ó›yAÌTzGÀp"€cÔ‰'ž(jÓDáÔMÖ|¸¨á“¶«H(è¥V@4 š…‹â7$ŠlÐè=%*çÆod õ‘’ÈÊýÂõÛÌ7ÚU4¼Ûn»-Á)BS)ø"!4EC +†]Ëp&Ÿ|ŠK¯¸–ØñW§ßÇžy}<ßžÕ9Vk)»îº+n¶Ùfâ,±©$dæ A<·;øPù­Gœ¦6í1H£r.Y€¶Á²X+%’™dv)Å Ô"´î½÷^¤ŽµOZ§ù8µÚ“70ŒQD4`›Õ|H…FZ$« $À¢e˜TˆAœþ3 ¤u˜¦Ê·b®ÐYg•´À–:â@¥h0pÍŽ°ô²+Ütçƒ/¼1²Úkû]ö!§÷"a’H8‚{QŠkÙf›mTì-°À Žjÿe> :¯ã8Ž€#Ð6ÐPg&óÇuE°%Š6÷~¢{ z‰ „ŽŠÆ W³<  ¶ :”yz L> «œ¤”ˆÍÃ?\i*„ “#BS4¼˜[ñ¶ÄRËüñÏOA;û*›zÜÉçÐùEYD9*oȜć8?‹}Uh*ÿª°&x§lR«¶=r~#G pšÚ´¹Æ?Ä.pL¢")hø$’3A/!‡haå+¤Œ×¶†B>QɧŸ“íV‚mibÈ0WaŒˆÛ í Æ U?ä¸T‰ ÐKX"Y‚Eš¢îÅUX/·Mñ¡U#>óp·gÀrI €RôÔãÖÊÖÁ’U„GÑÊM¯¼òJ9a•²ñfÛ<ôØ {}dÙ×ìsÌÍå8é] Ç|OÆýØ–9çœS hhª|E¦b·¬6ígé 9Ž€#БKÓTÜeO:é$Ë‘P…Ú^ú˜ —!¨ˆWôžÑh›ˆÚp®D¶ˆ¼°YÕªjx¡mœ ‹ ÔU† rì@Thî°ón/¿þþ¤2êÔ«d ¥Õ‡®ÇtÐA:4Ö|Å|*ÜUh*Éu69¦¡5O·ê8%pšZ¬pUKSYéP¯bÇ‹dYÄ“`)“©ÐKå“°JÔœ >™xÉ™¦—P\MÆ öÉL>iO¯ÁwˆR„“¶¦,宥—–Ob•ez —ÓMIÀª~NÍ*œÉ¢é­Ðrè1;€-G*'¨o^ÜŸŽ9æ XÝa‡pgÂÖª…€UÍ¿‡°äß'Ätïýâ…÷žmdäëî?<Å…xLÙö7Ýt £Fu†¦…ÈU»‰aø…4U*  /L^Õ´g×rGÀˆF¡¹Ï>û¤ *Ÿì¸ãŽ„‘"NÃ|2qO¡—z9B)#é ¤ Ê%íBLᤤ^›ùvªÖ`X7:VKVÑËí]'Z3x𠧜ɡ5{Egú}úå÷%‹y u\Ç{,Ÿ,½ôÒv¤ÐÔ©¦šJç”\˜1{GÀh)NS›¯¥©’A¾„94’©R y€ÎRÈ*†|JØ'óÒ¥é%ÜL±¸ãš¤Ml­X\|2 ’ª¬ÕmÖñ˜¯°ÄJãDÌâ>dÇÈ· 7¤‹¦¾ÄÙ2@ðÊM¯ô Xˆ±m™­´<=Ì4¼lØ(ˆ°!`•Ø`ËTyϽÒ«ªvæy—=7lDÌëð£O¦ñå–[ζLœ*¢ö+-$»W±Çê‘ÕͪMûYzCŽ€#à4¼dþ$%"»{‚ b¯CÞÁ6#»€°ãKt r‹R™¹¯e¹™L•x“£>Z4¼Q”­rÅ X BS¤0Î>C‡¡6×ÜóÜþû8¦#¯Èi.»v ‹üÓGlà¤<´Þzë@M-Œ4rʼš#à´§©MÃÖÒÔ­·ÞZÎ Á«6@ Œ‘õ Ü ˜.õZûd¸»B/õ*,rJ/I€ä³}·á@ƒ(b¡ˆz «6븲h: I³ R9ï Xz.ÅZ_Y4æb5±Ò[ú¬uÐXgÒòÄ03…áC#EäÌ=÷ÜB‰µ ŠÉØ1á.¾øâRsáE—¼þ¶ž6"üZr™¨ü‹_üBd#"Љûÿ³hTßn°Á¥hªT´¦=£Þ#à8Ž@Uð¼ÍLæ?óÌ3_sÍ5™ •®M$C!½D‡+ÇÒ° È3Rq•bÝ7N=aƒª|ËMqAQHÀ*¹ô-‹ã[ ¹² ÁâÊùRsíu7xúù×Þûhlû_1ç¦î0>‹Ä–[n©cK \Ø$˱«Sf–càõ:Ž€#Ðjœ¦6 aKSÉž‡ÊS™*vÂRL5Á»0†ùdb h=ô2Á' }Œw(Åa º¨]BV1Ò5%ødŒ_£€[­iŸ¥ÐàR´\ârÃäßž±¾þúë“ß’Uä-zðL±S6Ütëûÿôü3¯~”ùúëóïü`¼·0¤][°uÖYç>SÐ5à¬ÚY ­hª3Õ¦ýD½!GÀp*!€xÒ\ñÿ¶¸ý׆zØa‡! µ ëÑÉ"µõBx Šâ@½Ì R>I¤A,JN`)xT‘¼WÿE訟Xy£A¯ 1† ³= ¿çî‹-¶Ø½í ìcÉ*Iq5±Ðé§Ÿ.‡Ö ⤷ÎzíðÆ6¿ÞþÙÛ~úÖŸ¾ùþ'o¼ÿÉëïyíÝ1ÃÞýÊÛ£9 ý¥7?&±?=¼ä’Kt¼ç²Hȱ±Z^xaYb‚*=&~‘#à4§©M4MS1èm·Ýv²ð!W,uŒ´¬J5¤’C‚*c 7Bé›w hŠÃ˜v´Ÿ¥¼¢…f^{»½$têkO» z‹¹Õ²èt'ÉDÔ`Öf&žxbÒГ™‰½‚ØÂ±A/ ѳN2É =÷;ì¯Ï½óÌ+%^¿ºðZ* K¶Há_þò—l´üñ*öð¤"#E5šêLµÔãê•GÀhÈH‹HDÁm òcù¤U×Òié%GЉ¥”¿–^"^1N Ÿ$ó|XÄz‰bñ*'¬êçM äA[J"ÃÄ`q’,ØxÉdy)ÃI°èLÖ —ãLQïFm„£“53^šO‚¦^û¿Å[ð!‘Ävv+…T³žoÇpAÀij#èýǵ™4•Lz$w•… „UkÙ‚QysÙe—ÒKÄwÄj‡'mÞ]pý¥5ÌŒt»v`Ü”[“?¯A23•bÑÜ—“fòZƒË31gÐZbo¨ÂE7Þxc™‚Hqg²$SVEÉÜeó!5'lòNûÍÓ/·¯ 7øvûí·×PZ‹Õ”¤ÇäiвæškªØ[vÙe+sT÷þmÚ¯ÔrG ò·+[³uÉ%—”)ÐQᓉ†¡—}ئTCö!+±—"‚…^*Ÿ¼þúë1T&ød‹Jò!Y#­¤E¤@t¡»Ü,Y¸ Ylƒ\k£rØ-X&«ÈDÎ~Óc'cÉb¶,Bƒ$鈟ŗXú÷÷=ulç+ÏšzðÇÑ%b†-Ç–)uà¢ö.(bõ_D&~©"Û ‹hd*M‰«R¢AÛ¸°h›U8Sî%—X4# Ó6ŽŒDpBË,Úv ´º3aÿ¤r-ìô„UÔ€Õyæ[è²ëî|êåáò"ÙS)›)¤æÂP-vCjÁi*—†65íiö†GÀècÐBª°uÚi§EÎ")´NCü±A i}òq^ˆ` ’qcÄ'(/Ë­A/ñ`ÒúÈ}RõŠVÖŠˆgŸ u¨Ÿé¯fCYµwO¼çLQ¬©‚ï¼óÎ³Ž²°*tšÃGjn±Õ¶?; öضW¦Ó/§£Ó¼œ´Ïþð D”3iøZ4/ß’´¿|º#P/ªÐÔ_ýêWx<®·Þz:>A—FÁfU¯ñEô†%>1œˆ‹2ªh* âgœ!7ªá”[©" 4’“œC–±À'å(péUôâj«_Áy$Ý.¢•ˆ–Q>IÉôB:_2ß!ýI),#ZN£#|RÜÐ"#§m'­‘™{)‹f˜zØiºÍ×_]Ï€·ØÈ‚U ä&›lÂí,Yµ«°t X]euîùã³×Ü|“ˆó°½D¬¦ûî»/"P˹çžk77ø5NSÁ->¨¸ÚcìW9Ž@· €ÀExQ´Ã|"²¡Ü-£°—átV‡]QNKœB8àlŒJä81§¡Ê‰OÁž©×â7DÀ*Î¥rÆŒ”<>™˜Ê4½D.⮈dÔó̼¶Ad Ò<ÀTùŠH–ùæ›OÁ’Œ·d;°Hj6¤Ö—€UàÚk¿ƒ_~ó£7?ø¤¯Tl곯| ~¼Ø½µ·Ì Ÿ°}µÇªkR% jˆ®ûíx‡^E 4MeIAb©Æà¡¬3RHnºšî¡ø«4(×Ã4VCûÐn„Ž–sº!Ȇ²…QQÄ^pÁ´‰l šE”²˜ ‘IÚ ðÉÄ`ù„ϵ”Lè%ë2ç” ›¥YçCx,δ¶A„ú5¡@ÅËH¿ELÖ(H/b_µôRù$¬’8;d¶#»¸/dU¿â¾¢¦'à„&˜a"Œ…cCݹµ^H#è¡ÃLƒÌVq¥«¸3¡J°4TŸÍ3#«dNZh‘%x³ÆkØÊ2­`ÈÀµØƒÂçœsÎÆ9ª´ÀØëüó¾9Ž@ÛHK.D°lµ3%]Û:Vx#èqéj|Hç3¿*l³ñ ’ž 3 •üIb9Ô‚A ÄÓTaqø%åB„{©,rª¶†ù˧mÁ¯ÖL°èÌNrjxpè^mx'«âxlV‡ ™ü¬ó.&¹Q{^6…Ò¹ç_Á³4Ï<óØNJž¤“N:É&‡k·UIhŽ¨ÆŸ(oÁpD 4ME •–"õ§©Ð!‘è™Â›ÓDù î ¯ h!M…þ]y啜äɽXëù›²4U꣈•ø)¨6™¶©Àé5rôh&½Ä$+nÃpW¬m®f <>[­‰|R ½Dp ŸDÑ‹D·|–žök‚^Zö§{©Æår/MÁëy´<1ÌLœiíµ×ù4ýôÓ“·Ð’Oœ¾è¿¸3ÑsMAeœˆ´&Ú>™nºé°ýÚbÏ-€7‹¦ºëoå_¨_èô"v‘kvP]AS…‹&z.£=8ß"”Ûä"vZè¡Ý諹‰4×ßRJ÷R±Wvú# t¡Üu4Uˆh&Me,™ô»¥3¡‚œØ[ÞO>ùä¸óXÚ†—¯þ‹PƒsŠ‚Ò˜×I”Èšåýo”hÁaz ŸÔÑóZÃWX4£+D›0[cc ÓTùâ§ÞŸþô§^x¡MGDàÈM‰‚áPYÁs͵×ÿóS¯@#[ý’i¦žf PÖ¦J’RÐK¼dõ¾$ Dºè¿ô*æ4TmYl¡z9É  m¨œí¸f^ÛC9aU/¤WrfUšµ æ™ymkâQ†÷œsÎ!­‚°PŽ'[¯Ìö´ ä“$Lö+Ùra‰Eý¯EÓ;óÕ!CšÈQ¥)Fݶ5Âoä8uC Ï Y¨­Ã@Â4•J…6ø-#YÁi‚:W¹×^x±*gC¼âKß&¨;õs(¨æC‚:&¢j©©ß"SöÑ Ñ~" š¬ê‡pKô¤zÉÝQO‹ºë+êZË*‘q–Eã”+5Ã,M·Äþð7Ñ`˜²¢~U§!x>ÎD–¬2=–ü´ÓNÓ€ÕvÛûÉÞöîè¾Þ}ëïfZq^³]Zk­µø™µ©%/²€D?yqš P‚¦æ™RIÐTF!$ܦ†*5I­f;˜*Ž%™41ƒÎòàƒÿ,x¨Æ-+«ÆWI¤„L¢åøp`‚^êÝé<>¥@€AåužäeYt‚^²!F¤dº z›7Lmo¥=÷ÜS&ñÇ?þ1îL–Žòž ]i¥•åú9*cG`sf_† 6Ø é4µïôRê•G nä™RégoÐT!á65TÓ§s%v3QM&Êꫯ·AÖHFJÈ¥-Hˆ«ÖÁÖe$¼ùŽä¢}ôÔbkE:Àxµ2Õž^ƒk gò¡V MìÔÓûÂ!%  !K­/bQä>y¯_!Ô ÇâÖ„a3Á¢ÅmXL¸dyNR„–Sì0íõ=qžªáEYO;–²…Ë0Œ}·Ýv¨'2ùÑÇŸöê;£[÷Ú}¼ÔvFrL$¦¬N³jÓŸ4oÐpA M—験¦©¬§|(%2¯—HŠ# ”8f#NjÊ%\¸QŒð– CJµ|ÅèeÒ³§™¥­©BS)ˆ" UÅŠ+‰*ĆÈ0þ–¥—âj›¸µˆ7‚KQ©>dÈrl‰ÔÏë?,*ŒÉ‘,Z΀Å× ªb6…³í…ðò¨¬ºêª2•ì“°²²ÛÈ+DéPú„k!ÄW’*IaÐtšJƒ¥ Ý¥PòÊŽ€#Pg,.-é’*X#}…‚5R Òx¤Ð/´¦rGY<Ìk˜7‰ä´~žºVÃ2žÇ'­è%"XxfšO¢]Í”€8ñ•ÞÉæAX.VJ|É) Æ+Í'}KÐKeÑ4(iŸà«„®}¥}جu‚–'Xtš¬â‡µÇ{Œli8m•çÐÚ—Qc«\a…Cb(³Ï9÷×ÝŽwn+^ó-0* +®vW,>! EBû¼À èÀ‘uþá{ß>D –¦ªOl¦Ø°4•šzгþøù$ ¡7éKä˜<Éç|+ÒÎ>Ix ñ¯¤&–jò>]¹Wuå4ƒ¿D’@nÙK8ý*M%î‘oÉD'}#žØWÕ ‘3x³hbúziz‰äÔ[L$*Ò¼h>ç[©†91¯çh‹9®Fw 饞Ëpò)‹=3f˜ˆIÑvGË@Ô Ó(h&S•SXI ™—B¤+4UŸIœÇ jME/Ї –ÙpDœe:þXšÊž–’\à~y‚Èi„Ä̔ŠIJ߬,Vqœ9B*[í1€&­¶Új‰mÿ<øÔSOÍ´O†o½„ò¥ée$ŸL4NVGm4’ƒP Â%Á'!îÁ6­‘»¢gX´l‰Èb;jÆ’™å!1ÌL³*›UVYE°eWƒ ·L9¨’¿¤¹æšKj®¸Ê÷?òÌËo}ÜÄ×ãϽAËx«±íÔ>ì´ÓN|H. +Êé‰Z#%RSíÙó«G ±4UÕ·™FN¥©r&•”„@Ê[¤e{‰x¼O¤ˆ`rX\â{••ŽÚ·„dÊŒ{‘Fñ5b™KøÑ>?66ÕÒT"-!±ø…J÷8® Ñ‚ì‰dS™ÕPµJ$g˜^æ=.°ª-c˜Õô$NH\Å'šßˆ€íA¶‰«­==z™ù,ñ!_ ›EÀØk¡Ð†‰“ Ås^¸&æSÉE–RÀ{ì±êÎD’$BÐdká_qÛFê£ê†ÙrT¬>lðØVpTÚdSáï—8Ž@W# Ñ7”´dd\JS-uLËâLñ'GˆG VÅPU̪¶²Øº_iß²8ÓEK7‘¶ÜÂ9…þÙ•Ùöd°ØatZbœ¹ì%`U/ÇS—0Tý7Óm8Ðañ(ÖËÉH¾>i{˜Ç'Íbò¥¦^Q”Ó×á«ì=lƒÊÂÃu¨@5{Uú=ÊhµTÃZQÄs#-ŒEcðT"qQÜz»á–ÍbªÇŸ2ph9)ší­guV>d`…¸Ý¢ª@ÑŸvð.|´¼‚#à´Xšæo *ˆ€QÑb-¥iid/´‚“Ë-}M¨¸T.&d-Jb*ÂY£‘Ž*Ú!Ò¢]Ë<@\o騜91h LuÊ)§„Æh ¥Me%åvøÉç™þùI;”`w¥È•T†É`ÖcQ†F¦éeá#•G/BjÊå¨uÅ:*± >iýšÄ9J+ Ø`•Ê•^òFπš—jz ´YÒWPÄaI¿b˜Ê¢q¹ôc9üáu¶“ Žâ K-,…€U §*ääéEŠBÛ¸éèˆ#ŽhM¥ÙÂ]Eá,{GÀè.$)=’.“J%¨ •UzŠ¥TYhâru˜¢rP¿åMž˜7ULÛKøœÖT[­±_µ”Ê¿™DTEv&£.;eȈÌ0TPYºÓ\ ‘ÁâOsah-óø·(»£KtmË„ÏPJ!€¤°¼M Ú&ÜLÅkL³ 5sf›jxwÜqGtñ–1©+A+pû}÷ÝW왓 |ðǾôæ¨Æ_k xÎ÷Ûo?½)‰¬øg7TÕì.´‡¬ÂzèС*¬=xž‡v J^Çpš‚@MÕ@‘pyùµ§ŠÔ™6!Yõó<Ű’F{_íL¦k®Æ—&üˆÒ;™ðéå ŠFxf"ô…`Eln’é7“¦ÒCâX$T•õ±*.¸0´F '’ËQ¨J/㟠XÕ»£Vz)´bÆäs­LŸ†*wL GÝ™`¹8?S„Ob“D<Û! ŸLt±Ê½´è%†‰îY>vRÚÅÌ« &†™‰6ûŒå–[Nžð9眓“„s"Ლ|Ÿ1BY­žžj­£©™ª–øùõšŽ€#Ðu„UÆ–¦fŠHUò&Œ±úyæUJB<ÐuzJ{'Å8ôî:â'.6Bx>Ùƒòˆ¥$B6ÒK–w9ÃܼÖ$(†j6R^ÿaG†JåÌùœoÓY…ó”dNÄÈäu¦Ø“ÄãIM` ÛTùï*ªHC66Çwœz)´€ u6û%¥‹3Ì4Ëù—^ÿâ£*¿ž~é}/7ÅF¢·“ —ø{£}°Ev\RN9å”LaMœ0»?®Ôâ•f!ES É›j[óx¬Š@»è[ElÞxôBU [§¦Ì«²ô'a€¤©Z-o ñ¸³òbµŒ¦zÞyçh*¡#¨ú4T•¤yè!iÐT®¥r dá.›n7A/-0Iš"f&†O&ƒÄZz ”´OB¤á–>™h*Í¢±sÊ0… òž3|mÚŸgd˜˜CÃP³wQíbã*ó+§ÒÑvl/¶Øb ô™fš©u•–=<5þ÷è5@ ¼©ƒ†eª±TX[U¬šR‚OµÆnE2Ì™©) ÈÇÐT.i<Gî›8ÅßÎ_üâ,žáÂÂ.‘œÐKÛôÃQˆ-êHÉ ,û$àë¿häõ˜SÜwóD0—*)ÒIm´]¥5”¡Â¢%«pàÁÖQмñŠSÞ0+-/ÂoÂ÷0dÉà@Áóˆ»X²jV±¸j6£¥—]áŽ{ÿôÂë#+¼.½úVî… ›½‘h™<òHëZtg+Ý g‘@±Î´fîöÀÂâCpj‹@MUÁ–—z!SòÙ1ÛK Çê>±Q¯r¡µÁƧŒ¤©M4AJ0UÜzÉ“”gM…¦âKÑ édñ‘Ô¸–ÚUc­¥ îò†<ˆwgØô’%;žO&ž~qµÕËAIw#ùd¢µ½TÍ`²5óÆø5%†™†š­~¼š(ë'?ù ýaÛ¤‡·CS536'òµ”¦”¯íŠãsʨ Ë;8­PÓš) •‚DjfË™ž½…£‹¤©¢¤Îso.¼‹V¯Z6Úh#v1,‹Õþ)éva¤J/‘ž{á“ÐNÖam ßZ=\"9õ+‚e„^Ò ä-!‚‘þ’åãR°CÚî¡]…QŸÆõsŽò³h´}Жˆ*Í(´l½õÖúTÀc„5;ŸpÚªøÇÒk:Ž@ Q45Ój[W2™™ÔššÎW”)5ÀFdÿ`ÓšÊÀ-‰¼‚,—¨reEÛ'±¢£4­‹õ 3Ì k(Ç» µC´4XH!þºˆ ä\Ì#¢u胸ڦ m–Ê9ÜÅŽš7$AY-mí…m<Óm8oìaJ›H)ö%HA¦†›yDxsŒ4•Y³û!61’¯r öâ8}‚@¡F¸ÐÛ(SŠx7mÞ´a«|K;ݤG¥h*+j¡çmxö-Mýÿþ¿ÿ9B ßÚH¢…›Œœµ&ôRí“pFjA­™¶¶!˰ÂYz)D°Ç—_~™ž«}2“OZc)² Ñ©M%X´ÒK„”¨¤)ðOËÉ!º*[Ó,)&W%X´=–:ÈKˈt,1Ì4¶tãðà /ç—r†*w±dUViŠSå5`uïýâ…wŸmDäk†gææhãguŸà§f9*ïgžy ¦lñ‚äݬÚ'K®³ã4™¦æ‰“4MU£hؽ6ÏÇ)ó„^F™2²S4U˜êºë®kÙ ïwØa‡0MER½¯\¸øâ‹`#þ· 2U.‡‹[,ôóc©§Õmq¢"Û°(æ¥ÛÕ[hZ#Beò‚§n©´OøWã0̶#¯Á²ÃÄ ‹M;Ý£ÓÈ[3bU:¹”¦êÙqLÙ AƒâÅ^嚥æÎ+;Ž@W#OSóÒ+dŠÂH÷ÚÌj6Ù¡Š9jòyÞñ¤©XêĬ‡£²ÚYHã¤Ú'í…(Ió’2ð¼IAȪ\Ÿ„¡‰íT,¢bŸDÄk›øå¹ÿ CáÃZ«©¦²'¿$1ÿÂ'‘Œ¶“Â'Ï?wá^ZdõjKÇ8ŽÊüÕcløÖ6ˆˆLdy°ÃÌ–íÙÆo,Ï ~¹HœË´ ¸'5£´É¸ÖYg©9ÕÔÓžyÞeÏ Qøºë¡'…¤Íb¿åC¤3 ka˜vW&‡ÓƔ鞸«×Rï|· Ð1šZ蛤æ‰4´¶U›û^´CTiª „@ÓS%X}^ž5šŠx  0üJpK Èlœ©"B4’3†^&hqµÕn o–¬Âx‹—r怬¹BåèÔ¼Qhö£Bz‰ÊVôÜÜ7aAµË>Y^—‹N//*§Y´5Ér_@£ÁM]~ùåu–9d(^æU®Ù- ÷ÓpG ³4U½pÁ›)ósC.I+¯;HSᨈ*aªÄÔàÔIS¥ºc¨`‚OJÒÚÂûʤ— >)g¢&ì‘VµóèL%í–à“Ü7O( ‹æŽÊ¢iSY´piþò ìZo årÂjU¸â|óͧ*xznÉ*jt$¬àÉ ½Ô\xÑ%¯¿õg_ý(ð:àÐc¨ÉæÊ6æÃ /¼ð>S4´Š¯¦™fš "«²;>ö^ÁhŽÑT›þ70†B6K;ðÕ´ŒLi;NS£äš³…ƒ¼°Åe:ý*MÅ5—ˆÿ¥–ZJ.”¼J¸ë°>bÜk° °TšÇ²d™s„¤´Ý@4* Å»Ø^‚}RŠ$2–@í9-p_ñjÖ™ÈEɇÔÀm>I;RAR,Z(Ð#wõ´rHºÜ=o˜z,ô=´^νTgLo1örGŽlMÓÔÿùŸÿÑù=ûì³+H¾²—4øû÷ËG ‹h5M Çn]á«ö¼VY ÓÁ¥¥©ègQ2Jà«0ÏRLÕVf¹F—z~šp0k Ø'Ã-««­¶À¶5q¼™×¶Ÿ —ì àtMþò^ÛD4ÇÐr† • ‹)UV ¢!¤å–l' »ÒC$òÔSO-ÓÚëmrÿŸžæÕ2_K.3 )&®J›’Hœ)¦˜Õ³-‹,²ˆ ëÍ7ß¼¬ä•úÎTK=ü^Ù¨€@MÕXÐxŸÞDWš›š7N\ŒòN[­M¥ÛÄKHÄ…¼SpÑIǦZšÊ¡2V^¹–d³ˆ"Q ÒT¹?9UŒœ¥#‰äÔnÀ'•=ÂKa§|¥ÇØÀë,Ÿ„ò%¥$Q„¶†¯¸3%Ò>é);H/D…ÁÚ<,š@ $Væ0!¥Ä‘ŠÚ­A‚B [TïÈ9Î+Ϥ©Ç3 Ç•ÂL…ÓVŠé«JM–Wv®F 0ë~¡¤knlj˜ÈÍäÏzh“sIÇi*:P˜ªd ÅM ‚Û„€•-€‰øÆÏ6òkø¶\„lÞH‡ÏQü# ‘ãîy­!× ˆ÷Bþ"µµAD°m¼ì¹,ˆc:@×Yž Xå(„}öÙGíÓ‚•X6 tŒ-û%jþ`¢‰vÚ}ÿ¿<÷ÎÓ¯|d_|ÂWT`Û -Èžpà 7DpkÁ< I•¤°ó©,‘©Æ?®^Ó¨€@M-Ôàf²PÛ›Ì 1iTÔ©œCþ!hP5m‰a+SµÁ9…Â[‰Œ˜­´^—NŸ3Î9Ô‰JišJ6<\LÕUÛ, ·8ß6…¬BÏÄÃ禛nBP•c‚^ÂE5ZFÚ óÉĽƒB~hÚ'bWô=®Avà‰ÓP¥Í4‹Fz‰ –aJn $–øJ15Ti3A¡Ù^°•A¯ ©#… Pe±¡§P*õ”zeG Û(t/*”t™TÎ OZƒ¦5˜s^ ª’ê„sS$M-4ÞFΦM¡„ùk*4•‚þtÙe—e¹†&‘ƒ·SÕìGÜ‚ô¼þØ´F\•ÇÜ$»¾?…"b,a¨0Û¼Ö„Eãþ™’ŽÑ‹.fvÜBòÞyíµ×Ñ9ýôÓs‚eª˜»‰"Ö€Õ­¶ÚJjN:Ùä'œö›§^®¯Óν”Ïçž{n{ù‚ .ȇœÚŠbB 'Ó¨°F§Œ ;^ì¦k"ˆ=N5òÇèÕ²DÑT=Ú;¡Õ›U£©zUæyâÒ¸†žª TZ˜U¸MUž—î¿,¾™õÓGª²bÊÈÚ*ÒÀQ3i*n0p3Ò/É Kh Ë.LL̆ä´D.œ­0Rš^²Xk7X»¡”6Fdûf}hx&E#z*; ºªmrÓ°2 ‡ZWëKd© S žÏPV­`M²Ø‡¹±4…4U½’˜­iDìE^ëÒ4å÷è8Ý‚@¡"µM97Uªt ƒ< žGªkBSáoøþ¬±Æ"O¬ö…œ*]Á-ÚX,¥(4ϲ ¢%ð0’ã7µ d1Qê¿ð1U›’º"O%iHr#||lƒ–ls/IûDeɇ”Wà“šÍ8À¢%9Sæ0-#åe/`Ñ $‰£aK#sú€ å¤:)¨Ñ5•1ïE¿@™g¾….½öÎ'_Îk躛ð O£^…fYÕø@iYyå••¦ò>Rઑž£0œ¸[ï§#P+¢hjá‘âÕhª=5“s*#µºØBªFZ›ò·P -³¢ÚßøY«M'‹¸œhb ÓáBaš SE,á¡:ãŒ3ʵ´CF‡k„²")%’ÉŠõ²lÀ*N>öî–O"tKµ&«ÚM!ŸP3Ûöa³‘â[»^‹Ç Š·3nEú¡¥Ð´Œ²;Û…BšŠ…ÖN%Ò±qÉWØB¡Æ½ÚÃéW9Ž@mÛ«ÑT«r3“s*#Mšjg2‚òŽc1“ꮣq•qž5Uh*Eû‰²AS¶°#&Déié%¼b å/þP¶Y+ ‘50dý–± ½DCq­–‰t†1b&øS¯‚îŠ4DŠ!…õs„¦¤êͤ—Ê'©€{ ½F$G?á[õ“B՛Ǣõ X’9a¨´£¶ÃÌù”SNw3œr1œ"I-Yeÿ£ÚspÐCûVYc;îûë”SOË…]t‘^Â8|²ÄKÀmјX¾åŽ…¢6¦BÞy³µ]I¼cŽ@W ESIX®T£©–ŠL‰%\Tu·Ü:qÆŒ TÞX~ËUúUB¶©Ì“ÑáL?%½iáÉoM™Ý£Ž:*ÁT'tRäSÀš*4•Âê«°D«²¬ã'C—`bÖžÙYE_+‘œüMäCÊ;wG<@üòîK:(TÅšÄ/Cܰæ5ˆ†¸ïåŽ mM²Ú’‹7)ÑGÒÔí¶ÛN§²ZÚÀA˜¨S6{G à^ÇpꌀrªLfX™¦"òÔw 9¨ò‘ÏmƇ„BY½…¹©ª˜ìUé£Ñí¸*S)ÜD•q!MEltÐA²€sz™–æÅSVˆ° ½¤MÕö„-Ÿ„ª¥O¯ ÐK(.tN¨L8Í'iP[[¾mY´¥—Ê'ɵ‹”·#årMHoáÀú-5%«0ÊÙD\.Jò\€IŒÒ´<=Ì4¼X&÷ÜsO™vDx h´po^ XÕú¶æJ+­Äç´bZÎ9ç»ï¢Ÿ„oæ%îú[ç•ÓûÖ¥ÄÒÔ°h¬LSAÍžÎÚ³gÌð>Í'­V/±WežÅš8j5³NŒ–·¹3ÐàÁƒí¢‰ñ¤“NÊsúµ4&‰?ê2Ë,#—“·]R+±‚³\6^‹¬àâ­½DÐÆÎ¾DÜ0QæÝv-úfÔÀ…Ñ2°S‘…ø‘Y ÐÜ4R§€–g ÀÓMY“,,9GKÑTâat·ÝvÛf‰½p;ž ¿¹?Foͨ?jØÌŒ#­LS8nŸ á›ø7“OZÁ*â;qUšN'ŽZMóX:#*ã„ñ¶ÚìÄÐTDçÉ'Ÿ,„×Säl¡Ý/¾b5 *c`Ú>pÿIÓKT¥âj+-6òÎÞ:pz fX„¸V†þi¾}š>‰¡õq‚OfÑ$Œ´\¥ç©Â¢!öjh…NCŒµÍ4-—Ó×ÃüŸÇfÕUW©ÊcÀq2–bdf‡ Dš‰>Q¸pk5Ä=i™¸œé ¯‡–Í6ÛL…õ ,ÐDaí®¿Õ~¡~•#@ –¦ª«mfx*òR„S p ‚ØN­l“…‰¥'Ï«„ÏÓ‰ï媼$,îöœÕ4MU‹k^n‹ž$)É{-Såý[lÁBŒµa ™~~ÈÎM…©’ðà¼óΓ³U)äÊcõàÆ™*- 4’3“^¢5€šŠ•ÀÞÁ†Àã¯~ˆ<Óœº <Rø$ùD*#ðz¹mŠi!&ífRM…[µí!iŠuÓÀçx\ã ù/ESٽٴ °‰’/ÐTYKr‹`oÖpÚ‰€ÈÊLM++°ˆÚ<9®Àbžy¢ :  ” @B„‰Ï;áÆÞ%“¦ÆXêHš SE1*glâ „-= Ò§BAh"q$Ñ®Z‹Oa‡£˜QЦmA#Ä£X/ÄK*¶PT±tU¿¢1¯œ°ªõå„UII(å¶ÛnƒªÙNN¯¡óv˜™8ëuw„iÐZD³$»ä‰'ž¨ßž{î¹|2ÝtÓq•-sÌ1‡>«œžÚ\a]6µrÙ‡Ùë;ý†@,M—¼£½›òLÒ¢-Σ»é{ÉQ.âÄs•Ü%HÓõmYL –?ûÙÏbž¸ ÖèšÊ‚õzçw–ˆ»@çJ$³)dÙ£\Té¥å“hg|Òjdyo»þB/atÈr…‹c¿±ÇØQ—Ú«Äæ)É{õsnª®P™iŸðPRïe(½e¼êÔÄ}áÏlSPÄ–¢©¸x‘éÞrÔAƒ5˜60Rj¦su”}ê¼¾#àt#b;j©¨b‰F#Žc¤ª`(IøKIðý!]3·~µñÆ3‰Ûl³ nZ.¿ür»Ñ"Ãs¤À¬æy Ký6½²#Pˆ@ šª’#/û|áÍj^AÔ·´Ã­î?†ÐS%ô”°ŠBk*û ©€X‹çŸ~idµÕVÃÖŠà{fS L<{¡—Ø…O¢§Ä¯É¶ÏÓO¼‘µŠ[Í*Lnþ…OJãüåF¶Akó”Y€aò¡ÖAâŠ;Ó%—\‚3ÂX>”DH2©ÏÎC)4½¢ó|Ë¥,M%œéÿ÷SFÆæHyÖ`5‚…Zý@zûŽ€#PC4ì%p~L »ß%ñøÍ4Ç7¢5YáÇ•vØay4A€8P¿P2"8¬5²eE¡‰"´lÿ3y2²ž,úï½÷^|kðdöy—ÓÝâ[£&¨æµ±Œ1óÚÛªòN;í$ÒöÇ?þñÑGm™*ïñ@¦Ø9ÛFt Øxµ`>U‘=dÈ¥°G¨–zf¼²#P4•ÖÅ Úxæ½ mõ%BÂ[ªŸŽ -!PéÕRK-…ú0àô«4•¥« Ùí°éq!ÊEñNPÄF(+ ݳT¬”Ü.Ì'£NÐKDæß7$W>)”Rmžia›TЀƒNaÑ(SÄ í8‰ïµŽ¥Ðx!¼Éf¬4¥"SOÃN¿gœq†¦Î·4•äI˜š[!ùm¯©ùŽy꼎#àtjPí®nÇôVIxSL©rÇ]vÙ%¡O$IO¦5Uh*BÜ<â&ƒæ—õ—]Èjå‚¥Q”°8Ü–=>qwÒÔ‹t#´ÐË6+‡Ò’×aÑ Ík•&œ1êøBxÙ,·Ür2•sÍ5¼T ãé‚óuHüA~c´ÕZ¬ÛZ‹tʰô½Ž#àÄ PަքËÅ ¬laà4¥j‡Qy’ )!SIíð›ßü&/65AS1K²è:TÁ[†”ÂâÒcí™Ur¯ÃÇ|2^JÍ4½DâZ>imžÙL˜‹-‹FP!¡u˜X_•ñòÐP!czšŠ×ð*²RåÑTä½=rM§ åjÚö¸ûBYqú*û„{}GÀèZÁåjŽ0ðf™RuP?ÿùÏR÷QI·c~•¦"àZdšŠÞ‘TÈ£nÉC/Ó‚UìºR`ª’UÝ.â>SøÂ`5­êZè“^Ž3EÿÕƒXÃôRø¤(©Å*³ÐZ<‹&G|€E'îCÖeÈÌŒYš¦J®àµÖZ ”¤0ƒüjÐÝëc@nªVè”QCÄï…jò£ón8µE MeâS:×DL•~çeljâ½bš‚Yq€[B¦ò/±0+=a )”Ò4¦Êú‹QQ/˺ZUƒ¬"q›X0Ø¢ š­C2À¼>jˆ÷®­Ñ£þk *Ã'zŽPšŠbX™'›¼‰2S(!•ÙÖHæÀDA#ÐĤö1‚³l˜SÙ©ñúŽ€#Ps$I~Óé\gG­ô»±Eéà 9šŠt¸÷Þ{9Ï\|4ÅpEËî*°VHÊY¡—ܺìJŽ,³@s-Y…azìtî,Ÿ„¡ÁimW%­‘œ £Ÿ[ ñKŸ‡ç”„ÙxØ1ö"-‹FAŒŸmx˜z,P s逶ÉN,Œ3×qÄÂ9Ê$æàls”ËZHáËWxw} WGª2dd½Õ,·N­\“dgË~wG )”¦©"E(‘§€4¥—­nDL©Mt1jJ‡YRí!Ô²¼’W ©#ç¦ÒT–f{ˆ–9çœS.'iÞ/BVxÍbªˆ4ióò:&AjB¡ÑËæu€N’ !>Z†0TdfkV¯ }%%޾BSéÀŽ;î(ž]üEùÂÞ(3…Ò/ùË)¦˜"MP¶my}•¾–:x¶)¢7â85D@$Wæ915ìmL—Ä”Ú:=8™`Ë8G˜%AS(Yk*4•$OØZÉ“'Wá<,IøÄY¹@ùÄéŒHŠAFë@/‘tzk„2K,œ8!‚Õ> ƒe«`;IÏA4rŽÖþÝu×]b U­|R΃µ "£m®DȪ0L)Ü]Y´&WÇ$wáv´¯—p¹dN 3jÔñ›l²‰L ›%7BSiSÄ:›:Ľ¦›²õe—]6F#\­ŽËèR´Wv”¦©´Å/šÚ3ª’L¿ur±‘ç D&¤„XÅ¿tß}÷¤©ºÈž}öÙDNJSÛˆ® ×²ŠœC¤‰Ô ÓKá“¢dEÓ‘GSå@›)FZ@,É­­ÙÓPQ¸‹ÉWi*ûqè¢î1ÎL¡Db@ÉtŸ(d_ ý`5ÖÈU÷ÒÈʯuz –PÑ÷Æ ä°œVÛ‡mâ_YÕñ9âhÉô›¦©ô ¿›C=T˜Y Ðr&øX5¾JËbŸ„²Fjxu¢åèÑLz)âîÊþA+„O¯b­Œv[Y´G‡¹2“O&ž½4‹†ÙJbÚ¤e¼©õ_躅 žÈ¹f&ÎlfH'!S¹è¢‹²A=òÈ#y¿È"‹€€t–©fuÍ-ßeg³7~¿> G T¡©­è‡·@_£t^%d9~2§_érÌ1ÇÀ¯dA'—€-#dµñ‚ “|HÈH¢=áÈ öJeqëµw¤r¢-CV$ñØIÒJA#iSLšÚ %¨4‹j]ü£„¦bõ]xá…„Ygx33ýâå«JôGE§ÞžTI BKBcÏœäk…#à8 €RÒÆ(²¼Ï=÷ÜDoh*Lõ /Í&×¢å”CD«T½ ³›ªY!„ñD2ü4½$cPž}²1¨µ…*‹æY ìH O¯I³hX®H äœÆmƒhºÃ¹-‹ÎÄüœsÎQï3yƒ7C¦Yö ø vÚiVŽ£˜hD_¾¶l–¬Â©ñ Ž@ß"à4µ;¦ΖN-K^%T¼y±©™4•!lp€¤¦œ#'—Bç`w“U‰‰EA •^*Ÿ„"¾ÿþûö.6õ®äCÒo‘Fiʼn@›7ˆøRš‹+î»– ª´£56@‡åYh*ŽFm´‘ \ÐÓJ‰iHÀ†Š§Ð}÷Ý×:ñh™£k‚¼;žcï¥#à85@N(GqjÁ‹j2Ïš MEÐ@)×^{mÕó’©^b2awÄá ¢á͡À,Єf)ͦØBu,x?±g°CK» :Ʀþ©—#Â&Ò¬~Hë6\m˜Òj\rõ«U2ÎG¨Î¡ÙÐÔ-¶ØBçšhV q öâ8 "à4µAÛw9úËôÁª,»¸¤BáäÜT9&¦ tabj¤åt8±¬J‚¥ÆÉ*Ž=H¡—Â'Q %b[æF™¼+AViìD ‹ß; žá_k•µö[¶BP¥@SAj*‚ ‰…2ÕfúUšzî¹çÊyk‰2ÓL31„V˶¼öQ%DÊòö=‘~'GÀpºD^‚©N9å”Zå@ŠÄ¦ŠÓ¯ÐT.¡à”$¢„Ë©/fÕFhª\‹Æ™D»"+m>¤€ôR;C (zˆ£SL#Ô¡&õóÆé-Ë¢Ù·`‰Ík°¬slÞ0¥}¡ÐÈJö3loÐJÊÙMå•é¤åoµ(§3‘˜{5GÀ à4µË̼J,¾œ|ÅR˜j|ÁVi“ ଠ– EÐÈF R/•ÓP‘"¶µBàf-(b…îJAöˆ&[Š5É„‘@’Y  õ”ˆ(¡eŒ6Ó¯ž›Š0ÃXš&¨XžI*Øj©h¢² !»ì±öî:Ž€#ÐvPe’VЮùrö[˜¦¢oÅ…U#G¡Ä@J´jãEC7KÑKAN\mmˆP‰ g {#bPÝJå¼Q`œ,Å¢ ±rÓ‡¼aÑ’ö)ræqÅ"À5Ýš5É¢­f/D ì¨JS ²³LúßV t§©‘sêÕ0NS»ï ž¡,L³©É&›ŒÌr8M©Y…åª0Þň„2¯q²JoI4o g©#Åd±‡€Á\œIP©ŒCDiAPI2LÊTSMÅþÃfúUk*{Ž­·ÞZ2d$Êæ›oÞæÃfÒâ³lÀR÷=ÓÞcGÀp:Æ·SE¤0`M…¦R%{ï½·x$!413 Kd¹n°p,ùƒ>I/Ó˜‰«­ö"ùØ`ÎĘÏ5­õmÿ٠ر0KÍ0½>)œ–ÝH š®‚Àà°˜ã¬=6Ñš&òeh¸Oã{EÍMÝc=T²“ž£ÕU0ìÄãì÷tz §©Ý:£˜UÓ•…x¥•VBy‰ËPÙ‚ÐåÈЩ§žZVs’%%±¸à6bVµ×Ò+\€JŽª5a‰Õ­I2L†$-po9Û€‚‚œýòÕfúÕsS;î8Mùk9*Éumgá[ [ .¯ì8Ž€#bŽì÷ %§a#D2~•¦"4±×©«Žäì‘HÑÆ ™ÿpðz g.¥ÞMw¬d&s„d£Â{É%Á]‘¶Û†*®¶ú¢Vü¤(éÄþT“Dýzª^(6Ï‹¦0ÞÀ0áÉš¢@€E´™ñÞÂb̾(“¦ª¶šYÞ`ƒ Ú Ö]pÇÿ½¦#@Àij?,߇rHÚ(ÉäTÕ …Søô²ÕA‚ Bº c,X&HÐ?"N ¡Gª‰R™mDâ¾– "´H$[)‡~8¶eA†œIKí·zn*Ižôèv #ÚÖóÏ?¿ ’¬0[ ¢äGÀpAašöQB:à•šŽMµ4Õ'T%ÊÙ6ˆKÄSÂY™µ’X‡U„ -½Œl€^âgDn$ÉÌOvB>|2q‹„­˜|Ešö ±.¹úy#)ù a;j‚ql2'ȼ5ù©°h†IÇôÖÄìèç@¡ ÚLN´Ì0SÐãLšJ¸ÐÿüÏÿ¨ˆçp¾6w§©1¨×q pšZQÝ+@Di² ÕDõ¨9„ʾ¹îºë8÷\›E„㟃˜OàÊ×ĉˆFÔɈ‡ÀCðh&„“Þ‘¯TÚñ!"MÒZH¹è¢‹f›m6é6› džýVßC\W]uÕ4hxp‘\¬Ú ÆÂ·`GâÁ-uÿíyÿG ‡8óÌ3BGhR"…R‚¦JŒ ÕD7J^%ÚDk8d¬ÁáQú±$}})È…3kðNz)…÷|b{h}hÓ7BæÚA‘CÓ> Ÿä_>´ ¦OC•f‘ã0L­‰2š-°\†‰«°ZY> HMî®Ùb‡aÒïh*)¯tZñí9LÎ~K=¥^ÙÈCÀij<D]<8Í»vÜqGò–å¨Z@Ц&È…s#Ä â¡ã*ŠXBL‘FØ3ð‰9@ðpB·(V Cµ”X *oˆB‘݃•2Oö'œp‚ýVßC¶É¨#²ˆáåÕñ0Tá®pTOgß#¿L†#àtéƒjÈY ÒD3ýfÒT¹ ýö$í'9̨½Ž#à"à4µ¢.«ÀâNÖÁ4ƒd’+o#… ŽÕW_]'‡I#4rµSE¡r?N6U1*R´Úš CE>Anå´)6ÒrË-‡ “ýVßÄZh¡4,„¡{챑² ÕÈáç£vÙOλë8½…ÜrÝu×MÈ N yä‘G ‡yÖT¡©ø"Q?&IŒ0Þ°ÀƒDƒ¬"Â/±IÔ¥hxÃTIz}Ê»;ß’|(ÒUUÂP¡ˆy­a|.Ë¢ÙH)Ý 5É"Q"`Lf“ISɵaç‘kÛ Çñ+šÿÞp¢pšSwU’ÔJ"# Õ´G¶Txx8è ƒ4½!·àÀU$±d5¨@VÙT 1‰I“8KPm*J80kÁ1xÁ”Î:ë¬x#Ûoõ=a¨™ç÷€ªîö„©DÊEd[áq²Ýõ(zoGÀèRÒ qÆá8ÓBš S…MÝu×]‹.º¨H(âeøDÜe§©´£#¥¿hx¡—$}ÈaªGÈÐs2æÝoiŠ%R`ʈ•0T¼móZበ‰¬ÂymÒ+I愱×6ÈNF•¶@ÇÞ€!£)(ES·Új+ÝÍ4ÓL‘²¸Áj8$wé3ïÝvꆀÓÔºÍHÓúƒn2­–õz‘E¹úê«íñ-ÕÞÓÈ:묣qž¨qÖLK0®R—![߆¡ÂßhV ±+ë­·žŒeâ‰'†3Ûoíû}öÙ‡ iº¾ì²ËôÒ (jîå ß:67í9ð†GÀp*!@*A‚\¬!®„”=pô©ÈàöȪȻ P@<÷øƒèÃsG  @†¦(_~ùå¡L14¾Gr„Í6ÛL„’c·("džÖxA‚\ýõB/¡Ê4®öIÒáX„+¯Þ…›Zc©’U©@M¥—87Î*3¦nÃÂ'9½Æ6hSïB€õ+ªX4 _’ùC}‰vÑ«hA½Šx Õ3½*ESáç6@IÀǺ)”©†gµ{EuáÝ»\Sœ¦ÖtbšÛ-äJúørY¸3Mœ2ù/>NÛm·fZ‘Œþ’sq"ùª%¨HSöl´œ~úéÊ<É×Gâ{û­¾Gæ-³Ì2i‚:hРö¤O(%áˆ,ò„IÍ}Ú½5GÀpšˆ&д¶IÅ*´¦BS W¡ ˜æ˜cL«­¶šø‹=³)q )W[µOæñÉ8r6Œ¥—šU˜,™™|R,¨i' h°eà–E·FêU+¼šO2)4L'd¡©8cž-túE °Í6ÛØƒRs%–Í•++·oâèM9}‹€ÓÔ>šzü—ÒZa–o¢4·Øb b8#éha5NƒýZ¾ŠßÈÈ$¼†j™Egù„·G¨iÁ»^ªÚhöÚoõ=’uË-·””¿‰BžÆš6c….[îèÛG¿@ª#àt'’ñ!-Y¶ß~{Œ¥§_¥©®F9à€P˜J;ĤŸ_V›ÂTñ5%·PÚ>™Ç'S‘ —°D1Ò Ÿ„ÛNZ›gæ”&8—‹G±ø!C8Ñ,ÓamÓæ„]ƒªd@DpŒ Î"ÙIBˆM%!âSL‘ž&8j{’'!ßýÀóîü‰{¯kŠ€ÓÔšNL‹º…H€Cf®ãÈ€µ×^›d ˆ“f„ܶÛn;Ûl³Y±A2 ú@ôŽ’U,Ÿ ‰Dœh¡?Ph¹__›!mƒ­ ïÙCüøÇ?NË'ø-ù™*kF[t!~Ad3nÑ,{³Ž€#à8MGÓ".B )CbB }y±© šŠÞµòÊ+K#$t [>ÖZ!«!/´f¡ÙR>¨BVµ •ÆÛ>©ŸT+Ðí h„¦ ¨ˆur1hƒÖ$ ÇÃo™DÁJSO>ùä)§œRàZi¥•ЧgÒT,ɤbNoڜ̿ì¹>MD½AG ÇpšÚc5Ä¢130«aƒ 6ÉÎVJ^ ¥Z%ó÷¨Ô˜GÂë8¥pšZ ®¬ q"ËQžeÁ‰Ý½f+Ê¡‡Š"ݧ„k!Ïæ\‘O˜RIzd¿Õ÷„¡î°Ã™a¨C‡­a*¤>®/’#à8½ˆ9pJ(IÉÈpá…ÆÐT«ÅëGÏM!Ù!®Å†°@ k° ¥A 1å 9{3gµ5j_ C…‹æÝkª¤h"©†ÊÀÄb5%«¢Ü—«lƒV’å+4wTšJø®j±ÉL˜Of¦_ìϪ˶³Ð©dþ’w£Ÿt“#ÐIœ¦výúÜElçàÁƒ3«“N:)þ·H¸æ’UbT¸h䤵0Oþr*7,ú•}sôÑGg†×.°ÀÚVXAl“\_~ùe}¦Û{â8Ž€#Ð äz@É›š;î¸#¹äÜÔ´5•ðÔ̹nzÂ*‰……Â褩r9$J̪iz q½÷Þ{…OöIÒ„4¥Ltƒ§äþKiF*C,åÐTnŠ~V$O’r9>D°ÂQ ëšzÞyçÍ0à ‚'þ\7Þx£Íô«Ò%˜mCvrSxàñ¢Âh\*¸ÁÏ/wú§©ý3×Å#%ê e:E„úÞà K®ÒÓ7¥@J…¦rö©”UVY…Oæ›o¾«®ºJ?´opµâÛ´|jsš„xÖŠ[I ]ÉZüðy GÀpº\{È„”6«^tÑEiš*ù~ó „ͦÞtÓMqw²ÚË*çâHº]¡—4Ë©ªÂ'‘ì–OZ§\™9>G 'lN+ä–$…°Ê-.¿ürÉèË{­o39Áè Í˜£¡”BSáÉK-µ”`8ÕTSpd3ýª5•xÂMë–ÌŸ´I6Mq>ÂÞeG ¾8M­ïÜt°gH²Ì£kDŠ,±ÄÇwÉ $_|åç¤5„"JŠÐÔý÷ß_?Ñ77ß|ózë­—&¨¸+£Ïnsš„HšJ,K¯>Æ~kGÀpÚ€îHéƒU‘V„´`”sSã mçwÖHÎrƒ§1 ؾ×HÁLPŒPSù eE¢Ù6­Í3žU­ŒŒƒ£ Y% T܆i–]œ‚#ÅZцKø®:CüŽ __’Jð‰Íô«ç¦þò—¿ÌLæU“ù£Gˆ ÓmÃsè·pz§©½7§Mî:šŠ0Í‘(¤×Ãýulµ¢4m´IÓƒ±~"oÙéÓº©¹ì²Ë¶í0´HjJ5,¨NP›özCŽ€#àt'žxb¦"Åk^µøÖ¦#p”:.²æšk¢õÄ=)²/Ah*'ÈIšJŠyÞ£èÕ3Ó,A%Mé›®m°A<ˆA-+æûôaòa;Ž€#л5“)+·ÙfM­$ –" SíŒ3Î(¢ÆÉÀ§1.¸pEH`ã_\ˆ4<3~Zˆn…ugÞZÓ1ð†~Ò-¤ë׃g¡ß'Ÿ|²~¥Ò@S9f÷Ýw×”¿v€×UÇ“ù£’&:7+¯é8ÕpšZ ·>½ …+8à Œ,™rÊ)wÝuWbE3áÂi¨BS©,eÅWä.ßpà óÒ$Ô- ¹Næ}'¨}ú“ða;Ž€#Bn†ËnÚ b†àÃèZ­pÚ ñ®ÒìøCn†*(ÆÕF RLBU9E¦0/= “$$º˜¸©…´)ÌS ÁAzúæÐí¶ÛîÑGµ”¦’B‰DJiô8cV"i;[ਅùoÂpš‚€ÓÔ¦ÀØw b‘7y9Eº,¸à‚{ï½7©òȪÒÔÛÿU„¦f†¡.¶ØbL“Š$÷CTãàÔwsïvGÀˆ@€™ôÙªÈ8òÛ?òÈ#6“P©÷·Ür‹M(HTŽµÚ YÅ *'ÂW¡”™Ñ+¤ ‚[J* !¢JSm}"6IáK”©Ë<9‡)û­¾ghK.¹dš Ö'™?zGxö½Š#М¦6Ǿm…¤êÀ“-òÉ,³Ì§E JN[”¦’«‰‚ó½éFˆMåèšÎjOõîˆ(Ò#¹”êÛÞî8Ž@<¸ á «™TÀñÉn»í†5:W­>¹êKØ*ŽÁ{c*”|Hœ+C>';R¬r\*}?üðCKPÕË²Š¸ÄkW ­iüÄ l¿Õ÷$ Þ|óÍ3wBS/*Ïëÿä{MG )8Mm ŒýÞk÷!‡6®"~¦Ÿ~zü|pæ0ʹçž+N¿—^ziæiÝòNÖ`Å pĈäKðPûýY÷ñ;Ž€#Pü2õ¹ø|ðÁ6ùmÙ÷лm^T‘7"k”£¶ó‡à÷r2pšêF»xúé7[lÿ]wý5Ô…+9ÚÝ¿Ÿ#à8Ž€#P ‹™¡1d!"=>$³ˆFV€ÃWmð*¼qþùççÔr ‰Kp¢(HœNÞ&N|ÕB·•yò†í·úžèÖÕW_=MP¡ât†3c#©cÛªa+ö¬þµùqxGú§©}=ý¼ÒÔŽÜÝoê8Ž€#àÔ 9auðàÁi:‡3íÚk¯ýûßÿ­n³ ÔÿÛå—_ÞÆˆ•ƒ¿. “„©*D¼G­LL©èîŠ+®(]Å”zä‘GÚoõýý÷ß¿ÓN;á\Ãdþ™¤—ab.®Û³áýqú§©};õ¸ÓÔŽAï7vGÀ¨1$Ô%‰ƒž+“`w°Ê+®¸³g )‹N?ýth° %[œYp3f ¾Ç¸>I! u›m¶rËßÍ7ßüÎ;ïÔoí›c=6ÓD<çœs^{íµm3Æßˆìîè[ã‡w­pšÚ³ÞÙ1;Mí,þ~wGÀp:#€MDG™éùpžyæX>Ý‚{侚é°U;}È”cŽ9F™çÒK/M}û­¾¿üòËq$Î C…»ÆóƶÕ|çw<[RÞ·¾EÀijßN}Çî4µcÐûGÀpºÈ*.¸y–Õ©¦š ƒçc=ÆY©M/4ɼ馛ð –B¤ùæ›O˜ç´ÓN OÖ¯ìÂP7Ø`ƒL‚ÍXðXnóŒ¿æb?Ž®K~Þ;CÀijßMyÇì4µãSàpGÀè ðDÍ‹Y… â©»ûî»cÆ$ûn §ž M%¸”rà 7H|)wÝuWù0]ø*3 uÙe—½ï¾ûâycÛjrv:y¡ºâ1ðN:ý‰€ÓÔþœ÷NŽÚij'Ñ÷{;Ž€#àt$X:óÌ3ó'!ðúë¯ã7â£Û”"4•‰D¥œzê©bD½ùæ›å“D¡ߦ¨3Í4Óe—]Ö6Ú#,ÕŸþy·=Þ_G ïpšÚwSÞñ;MíøxGÀpºX_fاPDxì!‡òàƒ6HV…¦bD½g|9å”Sø—clä_[Hé´ä’K¦ ê AƒŽ8âˆxÞØ¶š„¡~òÉ'îåÛ¿÷¹pšÚ‡“Þá!;MíðøíGÀpº»ï¾ûg?ûY^Ž%ð:”SL¯Z„¦^ýõ܈ròÉ' M•¥üö·¿Ýxãíy6ÚÒÿ’@¸mÌ3òFÔÏ>ûÌDíæßûÞw8Mí»)ïø€¦v| ¼Ž€#à8ÝŽ‰6ÝtÓ<²Êç°ÍÝvÛW!¥ŠÐTùr-夓N’ Ãò/åàƒþßÿýßô­[l1Χ‰äm«öî»ïº‹o·?íÞÿþDÀijÎ{'Gí4µ“èû½GÀpzÂ,qôÍ [&I#Î’ùKtšzÍ5×À9)'œp‚ÐTÞŸvÚi³Í6[š 2äüóÏoóŒ¼Ñ|േvJß!à4µï¦¼ãvšÚñ)ð8Ž€#àô8↫¤Þd“Mˆ&å›pšzõÕWß1¾üñü;ûì³/³Ì2i‚Ê‘9{íµ×Ë/¿IÛP ê>jÔ¨¯¾úªÇ¦Ø‡ãôNSûmÆ;?^§©Ÿï#à8Ž@/"À6'žxbظ …¯^xá…Î)JSo_Ž>úhØéÿ÷§9*A°µ C1bĸqã<µmS?"à4µg½³cvšÚYüý#à8=@¡qÎùãÿxÝu×=ýôÓÿôŸEhê•W^yë­·âQü£ý(MPçœsN²(µÁ4s‹÷Þ{oìØ±ßÿ}ÏO«Ðè+œ¦öÕt×b°NSk1 Þ GÀp^GàÓO?%å/þºLK|5ñᱯ˜a…® Måß¹æš+3 õØca-­óÖ[oa:f€ß~ûm¯O£ÏèSœ¦öéÄwpØNS;¾ßÚpG  }Ò.»ìò“Ÿü$ÌW9`fÅWÌ4Ÿr!a¨4B†á–òÏ@ãJMÿþ÷¿÷á$ú~CÀij¿ÍxçÇë4µósà=pGÀèKà«ûì³O8x5“Ê’.ø¾ûîk?A%[¯XMšöåëƒîkœ¦öõôwdðNS;»ßÔpGÀP^yå•£Ž:jþùçÛWùv¦™fºì²ËÚ@P 1>|ø˜1c>ûì3òô~÷Ýw>_Ž€#ÐÏ8MíçÙïÌØ¦vw¿«#à8Ž€#B€ã[Î<óÌŸýìgi¾Š÷/_9fŽ€#àt§©½¯oê4µ¯§ßï8Ž€#PKV[íg\mµÕÖ€¯âL*Þ¶µì©wÊpú§©}1͵¤ÓÔZM‡wÆpGÀu×=~±ÅöÇëÖÑpG 8M­Ã,ôWœ¦ö×|ûhGÀpº§©Ý0KÞGG pšÚG“]“¡:M­ÉDx7GÀpEÀiª? Ž€#P+œ¦Öj:ú¢3NSûbš}Ž€#à8]…€ÓÔ®š.ï¬#Ðû8Míý9®Û¦ÖmF¼?Ž€#à8Ž€ÓTG V8M­ÕtôEgœ¦öÅ4û GÀpº §©]5]ÞYG ÷pšÚûs\·:M­ÛŒxGÀp§©þ 8Ž@­pšZ«éè‹Î8Mí‹iöA:Ž€#àtNS»jº¼³Ž@ï#à4µ÷ç¸n#tšZ·ñþ8Ž€#à8NSýpZ!à4µVÓÑqšÚÓìƒtGÀè*œ¦vÕtygÞGÀijïÏqÝFè4µn3âýqGÀpœ¦ú3à8µBÀij­¦£/:ã4µ/¦Ùé8Ž€#ÐU8MíªéòÎ:½€ÓÔÞŸãºÐijÝfÄûã8Ž€#à8MõgÀpj…€ÓÔZMG_tÆij_L³ÒpG «pšÚUÓåuz§©½?Çu¡ÓԺ͈÷ÇpGÀpšêÏ€#àÔ §©µšŽ¾èŒÓÔ¾˜f¤#à8Ž@W!à4µ«¦Ë;ëô>NS{Žë6B§©u›ï#à8Ž€#à4ÕŸGÀ¨NSk5}ѧ©}1Í>HGÀp®BÀijWM—wÖè}œ¦öþ×m„NSë6#ÞGÀpGÀiª?Ž€#P+œ¦Öj:ú¢3NSûbš}Ž€#à8]…€ÓÔ®š.ï¬#Ðû8Míý9®Û¦ÖmF¼?Ž€#à8Ž€ÓTG V8M­ÕtôEgœ¦öÅ4û GÀpº §©]5]ÞYG ÷pšÚûs\·:M­ÛŒxGÀp§©þ 8Ž@­pšZ«éè‹Î´‡¦þêW¿Zz|6lXeX¯ºêªí·ß^Ú9þøãÿð‡?TnªðÂáÇÓg½o¸{áUT`€ôM:ÉU4suª®òí"{%ÄÌZeĘÇ8@ãM$ΉþÓÃjØSeJ$h…Õ«õÖ[>ó—†O ¯JWܘ£ ×F^2ËøRø[cÖd,…ÍRS§;þgUجWpz§©½7§>"G «pšÚÕÓוo:MeÿͶ;Ÿü×ø)¨Óí·ßÎ^YZ°%f[\ávìž3oLJé¡Ùö¹0ÝI® S¯Ê£«v»x@èvä¬UC ò·I#Ƈ`ßOjj;e°Ì‰Nw)‡˜>CÒÒ7哲lˆ¤WŒ=æ¾ê0A´OßÂ×±eDášyÓ]ø©Ðs¿ÄèÚCSES7nܸ“vl$þr¹]Œ Õ¶ÉbU­ŸrUY}båÛÅàPvøÕ«6pÛæ¨)X &R§Ytü3kò›j]O§lGÃ;RéU)ü¥rà‡ì4µÁ§Â//@i*¿Ia Í¥©º—}°Ít£ßô=º%NéÛч<:¡f^•ÇT+®ÚíâŸÖ)9¼ù¨†XxààoV…ø)±,»Oj3MµXÉ“\íaVfØRš*zBe}ó°&Nwü3ì5®F é45íÁ‚)‹gÌ~7L~Úvñ¿z— ú).ºæ‹Ž¯¯&.ä*V¶B?š¥šÞNnƒUµÛÅ£!ªÿ˜ýO5Ä@¦ÚÀC]g#X<&ÊQÛ|Ǽªy&æ);Lf'°ÕÖ"ñgG‘06äý@œ¦–)¯ß(M¤©WÙš õU ahùQ鿏¬*™Ú'¹iB€q÷ÌžHk:@ze®\%+&צåhåÑU»]ü³ÂØí> Àý*#¦í'¦Ï"£ºÖU¸šÁSô‘¢Y̆ Œ°ÎZâéªð0‹ˆ’ÒxÇòº-sv\×AÉCn*-VÃ?ø'Ök:½‡@iªÐ­ôZÑ MÍôè‘u©‰rYéG@«vÊÈtÛ‘~5_åÝ1¼êV»]ü¬R/Ü «kVyaé}ÞØ­æ7q!€”Ò+­ j™ˆ5øHÇÏBaÍ–ÒTy2 õA1øžóô-œ¦λWh25§©*3×8ýjRcP³¾‹™ ±:Á&¶ãö´ë”nÄÓV©j£«|»,åVù”'–*#¦ËwæV&ümbò D~#Hk"i¿q§8éd¦˜W…ß’s}¢ZJSùMIoýIlƒòhjà'Ôº%jú¾¶ìt{}G V4‘¦ÊâÓ\šjuL,Úâ+(¶;Yšøi7 Ï„ÿ·–Û!”­Î.3ZD嬘yåBK°3¯b´ºT½]¡â²Úíⲫn€¦VFÌÊÆ"ãªLkŒ’áX¦ÆOqaM¡â½p<þö9ÿ‚ðÄijáìx…&#Psšª;ûÌa+olÊWWç@k*·,1Ö ób¥R‰µÑU¾]ᣓˆTyœGS+#– £v/2ÖQ¥ ­©8,¥è bmÝ…¾a…Øê³šçC«CëGU¨¨‹N‹¬©2¹aA(Oˆ¸.*ëþ&Æøé.Ù+8½„@ij@GiyTã+gbùܩª+½^bøóôÎrGé9`¡ª|»Èç6aø ,þ–-§ ¦Ò9=pm3fÇe=NS#§8¦šL_XôGâ¯Ò9=§V¥½rš3A^§™ÒTÑJ s€€¯EÚéWRÔ†›ÕÑqa¦W )]‚’5“¹uuøÖ²òèªÝ® «C¯Ôô¬%©Œ-gz iû1Óª«°díEoiªŽ®Ð&ÀŽ ‰.3É´íkBã<ÚH!e†Ê¢[DSåFíˆHJfJÒ,hj¡¾#fº `¯àôu¦©Ês2éGs5ÈL«.y^-ºÈ$ÄwÞç ö› dêU›¹÷hÖªÝ.æ¹eàiëÀâ_ ±BÕsäZ­Å8Æ ?¾N`#ßHSjFÊô ÷TÌ?ÿð„¦e·ÓÔ óå—4„@€¦ZïÏÞgKMUÂÉ{ŠþŠ,‹ÈLøÉ!Mc~äyœM¢ÿm a’¤|t#àÞ™¹á.\¸3iåÑU»Ã%·”4Ò¾B …ܯ2bá¹wÓ°²PWaáQ…]-û yÄ^ÏSÙX= ÓTÝ]eRô˜é.üñzG ÷¨3M-C…âç+F¥›)Oíf=óvy 5°™*ß® »XÍ”XüETü™ˆiÚ¤¼•¿Pç(cqFW#Sø"_¡çiª>f¥|$þŠUÞƒ”~Hœ¦Æ?Š^³9äÑT]Œd­‘¢»ð„Ee­ oÒ4Õ†æ'ÚLï‰uã^økL›ÑZ¤ÃSÑ«î»1›ìÌ:ÕFWùvBSe^òh*ÓjÝ’ ¹_Ì#˜F¬ðªpÈnB F2ê²ÏCÀãKûŸð¿JüLø7þXu“Ëœ¹cZÞÒÔÀtëÏ9óÇ>ŠF ¹º ÓÔp˜é.|f¼‚#Ð{hª&bÕe‡ßQšZðS/]‡ÕéCàJìéiA¢ ¤ð»Î´Øò1ZÎczâ§#Ž'‘S&É„ó:#d’.5ê–òdf>ðéGZÎôÿLÏaâWÀµá¤Ðš&W5bœ˜"Ó]ˆÌé'ÐÞ1í&Þ¾&Fšw f>íªJüÄø‘LwáDz˜·9)‹Ø úÝá8Mùqyf"¦©…?ý%TnõÈÒÔ´Õ®}Öš§7 èíòd¡RÜx‚V[í],ÖJ㦩¥FWùv: Ñ ÄZŒM¤©òŒ¥Ùc#ø[Syzº÷ršZíëWUG ASî—Ö7/ó½•R145Oªhj5šêˆ˜+­†) Ĭn™j¿6û#U¤÷‹A,¦'ÊT•,… ­ÐÕÌn¨\ óϘ¹‹¦­£ô9¡bOÇ•i証S ÷MšMh””ÀgZû³¼ÈsÛÅ3[O¯ït; š³ì¨¢9±3.¤©…®†4Õ2®@¨¡ÓTý!"–þɨ0²QVHÉ%™Ù,il"U“;Z‰™¤²Y ÃÓç,”õË‹q<Ìû16².É9íÅP…"á¿f“WÙÅÁij#Óç×VA ghjÓ7¸–±‚1ÚCSut•oWáá(Ëý"‹é‰uoKHA H›÷m^ ù¶Zê¬Bý¨t&f¿3ÌD„òÕžúéÚ [Oý¶ÂM—È–ÞØ)EzÜ+Ò=ѧ"ð#JûS5>oÁèv4U-ZĘWdž …45EdjŸõG»‘¢ªòÙì5ykK¦ÛW⎧ßÀ’E#©@¸GY:”‡Oe b…Ó¡²Ï:¿hËiõn#ÖTÛI‚zÈzú ¿…´´Ò;Îô,¨f<àÇžI†ÞLÍ»ÞW”Åié\•¼Œ"sˤӭœßijáoÄ+4<šÊC™¹3N|˜ù»­à“™ÉˆN†zß]³Â:9éF¡ÀÈØ•GWívž›R4µb1Ilt¢ -üR¡‚î6Òã·u45!;õ±‰rØhƒ9uä±L‹^»-ˆéúMĈÿ˜0¤Èþ{5G gÈ£©1?ÀöÐÔÀ2ÛRš)nb¶š` šÚÿ¯Âm@âW‰Xáo'íÈž@k R5=’4ýÌ[?äÌhžï•Ó“ó¨dÞ%`³mpìé¹ILDÇ4‚¿Ž:ïŒ÷´hvšZøñ MF /65¬GÌìDÓ~c\&2ƒöÝ4–ÏIDATÄÈ.è1FÚÂ>¨ÊÊ®h•GWív0‰§©e“¬óVFKþ•zµ¦ê( #N™@M´¿V§Î¿r¢w`"ê@Sç´è­LS#ÅáS]áöK®F š5U¬¬ Þ\kjŒðÊ jmÊtXYÐißμ­¿å–1þœÖÕEÛ¬v»j˜”¢©ñˆÅt&±¤«Ø ›÷ép擸c"¯-H#<Û^Šk6Õón‘Ä$ŒqÿŸË?øÔv’?–E¿º;v9ÉVaô³Ó¯Z˜$%Vµs—FeÝ9Ð}Eƒ©ÄµèWc·ÞàÝs¢×¹,úu‘èž×BˆÖKd;[™nÑD¼2U÷á.Ûžùy–¢‚tG*%ò¼AûɃm·ï9|·%:¹üËÔ@ÄüäÄI¦ú™ä·]ªc›¨ñ¸ifrϵ.¥¶­&]5.‘­5ågÕíp×eÊ=ÞÙT}—4OŒ/[ù©a?#1)²éé92ÕÏ5‚Mœ\ÎMušìÒk#M÷ËØgSõà^õM%ë5íV;”]Å™²á)Zœîyzpoû*‹SéB'´Ýø‘©áˆé©9§q†vës÷W?Yõ,¾çÐD{ð|>b5ð,‘Þ#Jî4ž:YåÄÿHųìFùb¬[²5!?K©õS÷ |–3ä[(9<^™ª;—¾Âç2Š@5¥}Ê~nкóqYfÛí»ßš­cwUŠÐÉ‚¨óJLn¸êéªK–L5«ÏùŒw6Uß\Æî2ÕåÁ¨µqúLJ+R;ýÊÍÚs ã]PàtP\hþ~Š ¥0ÎÈ‘©!®V¢D"`•©žÂC_á¦^ÀåÙŒ§Šp2Ћ‹¬¬$9ÝIYežž|ó¿•ŽDñ”OîƒVm¯ŸÒY‡à¡K§ó(9É| i7ÏZ ML3±}iÜÐóy¹ª?YUewj>Ÿ,ê ‹`;²Î‹Ÿ Û.TÓ—•OeîG¦ºT·íO¶¯¾øé_\dªD×E³ee|ìå²õˆŸl`\"`’©.·]ju¶„\q¦»sì2ÕSÈùêç³ÊŒŠËgÝI:é.Ýù˜z]ÓÐÜšœÓÒ÷R;%ç¿8ÚÒÏ3ÊÄü \Æ]Ö‚„žQô\dÝgQ¥îçVn­¦±4+§ÇÊñH£€}Ï¿Ÿª4™âj%J$V™jVJ•»íŽäVa< Z=sÒÃSE¸»ZíÐøÒ‚í33'-í˸1·ÓsAý½©cÒGz*b*±1.ˆµM:\éÂ%çsE·Î§g­…&fœ9ºZ¥¥éñŸÍ«ügÕ³=èG>o¦%IºRé‹é1.Î1^VR›:{N lûHŽºõ½Ç8)¡¾ôó>¶)?î2UÎÔöÆê:'.¿#õqD†@v0ÉTãÛ¹Dc§dzÀç$ŸÂxör ÊtßqÀé˜YÛWOuº.+DÂ%¨DÊØS¦†#¦óïô´ÔÓÀTÏæTv}Otº‡F':EÛi±ÔdL÷zwalÝŽ^7rÛ1ƒžG ·¡£‹ªqŸîutwþîOÛʼnq+`å™âj%J$¶2U<ê+Ví­>zá»üjûÉËø‚§àq10NÙéÌèœ8‰ OYâÔ øYÜo»•Ÿ¾à­™tN+”•N2"¹Øeª±Ixr30vâ¶m̧\TõèÙÀ<ÛƒŸ5?Ö°‘€ŸkÄZk&~V²élÄ+SÕc¦@:YçÄ]¦ª»••ñ›@Õ©Ë#2²„€I¦»}¹vLVQV.+2´L5ÅòT.:9“ÕC[IÔºzE¯QôÉõ¹ídzmˆu½Œ¾ÃJfL‹Ü—ñWc)Œw.«fˆ’œzj¼îhbÆ'Ö 2>v÷ùfŠgsj.K®¤:LwRã2£Lµ^&ÆÕ‚¦Å;ÆvkªYù¯¾[Ò—€‰•ixc}+öNÕm DU¨ä!h×åÎß½ºåzÑ¥Ö×25h`•€“LUC«‘o\žJÏ%×žŽ¥g“”+µæn z%Sfä¿.º~ÅÂçêVülå„qZLÉ6q(9q_Ê¢tªÖƒ&g,£Ÿvã^)щ9Ü8¿ê'Ÿº­º40Ïö ˜|Í%Ún—/N\F`ÖZSí$Ä´ƒÊ°Óco÷êÖM]·duÿq#þ~ÞhRóÌÖ«XªÛ}ÏgŸm3ä«L•ŸËßrÙÊÇxeÉ%f‡¦çÎúÖì©"\ Œ«$tNŒ Ùö¥Z'˜›¸ÔQ“x>µÞñËX”üW-Ö÷h[Åe\ò£úgg§N>\ržRM|TþF!f|éFÜH,ЊÏæÔŒ J·.1ÖCAÉ›†féOmL•îT#7ãÅ¥[©u娵‘¸Ô©ËO¶@œŠóìñ<ù›ª[¨.Åx!›:2Õ“91p‘©*%}ª²Ü“|NõHÿ¢žnÆœ×ýoÈõ£ž§Æî<.‡BLr(ù”Lz×.\éB'Wy£û‘‚«ÃZ¤"=鏸`ã•|Þ-?úÉäÇ;L'@€ @ ëÜÙ°ïñ<Ï8¾•ÍAsIiP„&52U6C3^ÃÞñt­Î3€ @È6qÝÍ.ºä•Ë®ªWõþ–µœøÄ§SŽùÝÆQ®fzdODä 쩃6^½¹êöç>›I€ @€@¶¸ïõ¾"P/¼°Ž—^ñúcÍÆý«í„_q´ëÊKª{÷îͱAA Ž@vÈTY©¯/ÝCŽ8úùÎ…/}^L€ @€@Vx¢é¥N6ì³uë®Õ«¿xê©¶òß˯ª÷ì§So}¡™qJFÎS 7²'r†@ÈTÓTê-Ͼ÷jÏÙ@€ d—?ŸuUÕw”FÕ*âÛo¿¯Y³µ|yóý-¤§þõ&TsFbQè²@¦ßJ=ñô³ëõžC€ @€@¶xì­þ"G«Uk,ÒÔ8|—9ÕË/M~z¾õ„ZÍ'Tež&ú@È^™.Så¤cã{ç ï7è7—@€ l!pÝ-D‹”Y5C‹Cå§[h)eùC•Kõ¸—-³W_‘óXdºL­[·®¾\=ò˜}f68@ ·{]wÿsAƒÿ•ç[Ý”Šiù§ ¯>å¬sk6ì¬ëƒ j)u­|긦$¢4*ºb¶[J  ^l9N„èM750M¥ª¡¼¼§ª&Tßè2í×Z§gV­ZËp'ÈF™.S«T©¢/׋ªÞýÁ2 ˆžoÞ×8ðó÷1'œb›è >oý^ŒÅgå³Î‹˜Ï¬ŽþJÛ¼ÑÚ¥ªXEL>O6êâE›ù´4ÖšT‡NΘ„ѧgK05*:«›(™‡@ÊÜ÷TQ¡;Žu’ o¾Ù] ž¨×G²tØoŽÑ}Q»ví²Q]gÄB £eêŽ;Œƒ†§wýhØ| ˆ^ú¨Ÿ§ 1{Â)¦D¥G:õOçY¿3ùR¢Ë¯ó™½Ñ¯ª^C ÜôÐ .EMéÂënWÀåK§(¦Zs±”ªQÞŒU Ë7ÖúR•åócŠNEgo%çH%\ó¦¨Ð²²ÕNc÷#fŠÁ-w(¹ºàšjºG’ýYbîãÙH £eªœn¬/Ô_rØGƒç|Ý«yŸ)Šê w=¦âÊçgß²õ¯,}Vn 㬮2¤…ÀCµÚ‹þìÝ{’»NPûý¾Ôh°dòäÓÎÒJµE‹Ù(0È3¢Èh™zä‘Gê«ôíûvË[B€ À;m>›N$JhogüG¦Z=(å#ú§Vý¦J¢äÿ)ª(üGË>ë%\~”gOçï½è”óó/»NÉ¿ÚàÆ»kªß6Ö“u?T¿¾Þ¼»d^6F×~Ä@YÚþêTYQZB ÚÁ¨hn®öžèÏ%K6¸ÚÕë©5Ÿï,|®¾å>=®U«Vôá> 2W¦nÚ´I_¢òGÇáÅ=ó— D'ШýÏ2µÒI•CxûÛå×ýñìó%®ê£äo ò¥v¥~’/å›:Ûå'ù¯|é’î›-º‹7í_\ÉßòM³îãlc©üÔx¡¾ü*«\©(ÊÞh"?Ÿ ˜våMw™òc[ Ƀ¢¡ó þ«òf ÊÛSo|¨¿Ô•b$©UåÒõ¥¢ÛVßÍ÷ü,wÎÅÁTMʹ‹+϶¡ÀŠgOK KàŠ+ßýi{Q9Ìž½\Ìn¿¯¹€ºç‰:z Ì.JÙ¨¯Ès,2W¦Ž=Z_¢‡zx¿IË €b!ð~‡!ª{9þ¤Ê!J,ãC4«+epæÙ»ú滬–ê›[î}Ü6i—(âö¹zÍ­±Tr÷=Qçï—_oLN—N„Ȥh[^•84æGò`[^ùÞhÖªÇx¿ý Bã÷*!ÛJÑH•½ÐS IUš€v[çú{“½K¢žmÔ+O{ H@ħ‹ê9j߸q[ùf¿ÕßD¯4j§ûÒÊ•+{ÆÅ9I seª¬Å×—è>wðÔ@±hÖy¨Ö–!>ð¯:´¼Qÿ• ]uü}í?ï~÷ã^’hí·šŸuN¹ˆRùÒ”ºXêŒU»ï ‰¢‚|¯}ŠS,õ“ö,H/u–ŒÆüüë¥Æü|Ò;ÏäYÒÒ¹Õ¥üèâ˯ò½Ž%%’Ÿ$ç*ÖEW\¯È˜J*ߨ ›’Ó™1åD×—dXE‡* IË–†ÓÖ¹õ{]!Z‚".Q Š@ Çè2Ïm~•Àغu—X^ã;‚¥MÏqºï•?rRP(xÈܦ_¿~}}‰ž}ÞEËV ÄB E×aª{9áäÊò·Ÿ`M÷O-œâÁú“|iôo2¸ø7¨_«?ð„ñ§7›vp‰%™Tnåßnç#“{ï“^Aó£ bͤ¢=¿Tÿ#“Ûþç눒sã¯ïCµ^¶­/ÑT|±{•Srb©¾ÿ´ïíPåM\Ù&muîT_šªg3pkÊC,M'€@nè1r®ˆOÙÅ×sD.by饯ª‚eêŽ;üDÇ9F ;dêuÿ¼sÌÌU@±øøóŸeªqàò÷‰'W¶¦ûç*åZËö'ùRy{æ•w¬›¶ûùDhñ`üU9”ϫﴰ-f§~Vqw>ø„Ñ@''¶µ­g§üH**?7Üz­[§ˆ¯{~ÄÌä¶ó€‰¶)Ú¢Ö_ö5Cûш$o&çNõ¥áx6k†U\S=ÆÒDqäO{NñùÔSmý臛nj ƪàÆiÕªU~¢c#¹2Uv6Ó—è ·Ü5¡x €@,Úuá©IŒ'þîTkº©rA¹LµûI¾túIùQâA»í7f–g,'Q lù¸{ÖnùÑ™”¸Nnl4ÞšO¿bÍÏë [ºÀ±ÍªúòÆÛî1z{þÕwU‰Cý½K¥8ý¤œûùH¹LűÖc,í'€@Îh×m’(Ï7ßìîG?T«ÖXŒŒ-“â;¥’’?ѱ@ŽÈ\™Z£F }‰>ðèÓ“JÖ ÄB C¯‘ª{9éw§>ñì«~‚5ݳÏ-—©âÁú“|éô“2VâAǭר\¼Éçò««º”ÑÖ³Ïäl³ê”ŸAã‹=ÝJÜ›«Ý«²Ýªc_mWÀZË¢¢8S¾Wè$*®&#½õR`%f«£8Õ—.¦g33m‘©8.ÉÅÒPqd;æmLjòlذý “®å2uÌ<)õQG«‡Áùùù~¢c#2µf­ ç­#@ˆ…@—Þ£ÔíÿäßÚá_÷ËT[ò¥ü$NέO>÷ªÎ’üêô¨EŠ ‡HΔ1«H•Ñ3K’íSÇ5~iÊm×Ù‘ïUÛtî§ n©^.k]8ëŸtº¶ÎêK•=\Kð$ºuÈ ¶)ʳcDZ~ôƒ’©Ÿ÷/’²ÂIÈT?аÉaÙ!Sk<ùâ¤9k €b!СçgSC;<{ÿ¢ßò)JKïôó$[• œœ[ žxæg™ªÇ%îH´óÉ™2fõ ùÌä_ûÔq_ª_{ .Ÿ-Ÿ,Wl G¾W™¹÷á'•Kéô\®¸KÍPýלêë¿“ÆÁï2žäC·."B¹A ù'峩-Z õ£%”Lí=t¶”½2Õ2lrš@æÊT㻩·ÜñÀ„âÕ@±h×}¸R_ûß, Ù·Þu4{0¼²hïÜj ¯qª,]vÕ ò·g1yÎyˆäL¥¶z0"òÌŒ|Ô¾ö©ãî7õ<ÿjCOìÆÌt”¯°X]‰ç×þ|n™¸•ÿºÔˆË¯†·a·Oò¡[!Ü ðqç‰þýÞ}÷ûßM-•²²è7§µ…s$¹2Õx MùN¿3V ÄBàãn?ïô[¾OoؾåÏûOU±õðó°ý›“s«Áwñ}à‰ Y ‘œ) «HŠ4?:nùN¿ÿ‹WA+ß:Ø»üªÁÊVÉj¬&>m£¨œ+‡Æ¿­ÆNõ¥b…k žäƒ¢ÃÈ1j§ßÚµ;úÑ"j ¥Ó– £Le§_?ô°É=™+S›4i¢/Ñkn¾37ŽÏ¢€@&0ž›:?žç¦º§i=óSgÉýN1 qz§í£Ö“WMIëE]ÉA¦¦C\ÅØåÜTåÓöpWŠšª:ñ£Î˜µ=œVÙ«Zu¢Ö#^–VW~ŠéDÀlèÖED@ 7|6t¶(Ïš5[û‘b)A þùˆÈT?İÉm™+S»víª/Ñs/¼bÐÔ@±ø°óPÕ½RåÐÏ:§\ Ùz/å'1prnk ¾”ÛôγØyh‘üª‚Ñ \ržTåóÄK \ ¢òÓðã^ÚFã}à_uŒÅÆ'sU"‰®þ¸ðŠë2pÛ}击Й«?„’­±S}iì!Z‚'ù>‰ä®ÃJDyÊ4©§œØµë±¼þÆw¤øŸöŸd”©›6mòŒŽr@æÊÔÑ£GëKôØJ'ö›´Œ@ ïw¬ejh‡gžý³ŠkÕcœÉ‰R/bàäÜÖàê›ïR¹rŠø÷˯Wbiô.9OÏÕk¦) 1kYî{â%Û k¼’ac¬[î}Ü‹6Vl5aɉIcUº;WÞ„•meY¿÷Ó0<Éûq‚  ÛD|^{훞bãÆmbyã?ßo|ØY<òHϸ@ ' d®L]´h‘ñIÒgcÊzN\J€ @£O©î¥ÒI•ï®ù’ÏðæGÝIÿñìó•“+oºKJпŠ[ù^ œ²jkÐyä\õ½ŠkLî“þÓ$gù¯Ñs¸äüxøÛe×éDŸzýCc¦»è:Ú2â•Xò_)š¨|Öx¾¾g Þ|wMí\b™ÊkŠ®¡I‰èä\Õ—ÛF·~ï™I]"—Šöã@ · \qå¢?=UDYÙj1»ý¾æBã±~-_z­‹.ºÈ3.ÈI™+S·Q¦6l?ä³¼%@Ñ 4hû³L5v2žßñ؋ƤzîmS”÷?« ~{â)òÓ9ß)«N’1õ“úÈßâD‚þRþx¡a;“ÛÐÉi?.$u—üÈO7Þ]ÓZLc)ÄæüË®kÙoªúRSr©ÇºÍ»u¯qq®%¢“±*ˆäÁ–žõ{?ÍÌ“¼'Ø@¹Mà†›ßý)“¥îB¢  LÌî}ôc¡qýèn­F9©@(< d´L­\¹üÑ»úç2ÎÏÏÏ=íA‰ à“@¦ËT¹>ë~k5íÛ ß\ @€²‚ÀÛ½g_qõ›"D—,Ù` 1S~ºî–FR–*Wުǽ•*UÚ»w¯Ï=fÈ=™.S…x•*Uô{Î?n­×{€ @ÙBà®ZE‹Ö®ÝѤ%d*õî»?Ÿžh4´NçI¿<à@Ž¢É=¹E‰ÂșڢE }ÅÊÕ[£q¯W{Ì&@€ @ +Ôî0íâK^±¾¡úÁäË«ª¾#¥¸è–zÄ{ðÁoÚ´)ÜàžXÈ Y SeÁƒ\«úº­|ÎÅ/}>‹@€ l!pÿ«å¨ÊÁ3eJEôî=I¾)mµÉÈÇ?fœJ­Q£Fn( Jв@¦JÙŒ¨Š^½ù¹Ÿë:“@€ l!pÓå[þªí”ÔZ_ w>ßMòÿûóþaœJ]´hQèÁ=!²C¦Ê„ªñdšƒ~}Øõ»×ê<ƒ@€ l!Píé.JJ¸ôŠ×ï~­äüo·þ÷¬T«uëÖÍ ™A) …@vÈT)áàÁƒ[þþêð£ïhØ·f‡é@€ d ÇÚÞûÎðûT¾èîÚÆ!.üF6ÄÍ%Y#SzµjÕŒ—ñÿpà_o®yßGãiWH€ @€@¸¥^·ÿ|‘qp+=:—”e@hÙ$SeéoÕªUM³ü÷£ÿíéç @€ dºÅ:¦íÚµkè1=!c²I¦ ú;vQµ^Þ|@€ ¬# ;†æ˜Ì 8ˆB ËdªRªòfyÖu=d€ @Vò>*k}£èâæ$ì“©ªJJJäUUãyªôz€ @È"r’…̾ÈLNÊ (²U¦ê2˹Rù| d9&MÚuÖÝ>úv–—ƒìC€€_¨Ó(†¸9O ëejÎׄ*#fÊz ö©…¥Œ€ @À2•@ ý©é¯r@€@Æ@¦fLU@ @¦Vàʧè€ ˜ Si€ÒO™šþ: € d djÆT*0dj®|Š@€³©´@™G™šyuBŽ @HfSÓ†ž„!hÈT @Щ4@é'€LM@€2†25cª‚Œ@˜2µW>E‡ @ÀL™J›€ ~ÈÔô×9€ @ c S3¦*È P S+påSt@€˜M¥ @È<ÈÔÌ«r@€@Ú0›š6ô$ @@@¦Ò @€€&€L¥1@H?djúë€@€ 1©Sd¨À©¸ò): @fÈTÚ ô@¦¦¿È @C™š1UAF L™Z+Ÿ¢C€ Àl*m€@æ@¦f^#@€ÒF€ÙÔ´¡'a@š2•Æ@€4d*€@ú SÓ_ä€ Œ!€L͘ª #€@&€L­À•OÑ!@0@¦Ò& ¤Ÿ25ýu@ @ÈÈÔŒ© 2T`ÈÔ \ù€ fSi€225óê„A€ 6̦¦ = CЩ4@€   Si €ÒO™šþ: € d djÆT*0dj®|Š@€€™2•6@ ý©é¯r@€@Æ@¦fLU@ @¦Vàʧè€ 0›J€ y©™W'ä€ ´`65mèI€€&€L¥1@€ M™Jc€ ~ÈÔô×9€ @ c S3¦*È P S+påSt@€Ì©´ @é'€LM@€2†25cª‚Œ@˜2µW>E‡ @€ÙTÚ Ì#€Lͼ:!G€ ¤³©iCO€4d*€ hÈT ô@¦¦¿È @C™š1UAF L™Z+Ÿ¢C€ `&€L¥M@H?djúë€@€ 1©Sd¨À©¸ò): @̦Ò ddjæÕ 9‚ @ m˜MMz†   Si € @@@¦Ò ¤Ÿ25ýu@ @ÈÈÔŒ© 2T`ÈÔ \ù€ 3d*m€@ú SÓ_ä€ Œ!€L͘ª #€@&€L­À•OÑ!@`6•6@ ó S3¯NÈ @i#ÀljÚГ0 M™Jc€ @š2•Æ@ ý©é¯r@€@Æ@¦fLU@ @¦Vàʧè€ ˜ Si€ÒO™šþ: € d djÆT*0dj®|Š@€³©´@™G™šyuBŽ @HfSÓ†ž„!hAejQQѽ÷Þ[­ZµÁƒƒ€ ädjŽU(Ų’€™ºjÕ*Q§¿0|ªT©’ŸŸŸ•Å&Ó€ @ÀŽ2•v@ ýüÈÔM›6Õ®]Û(PW­Zµ¤¤$ý%!€ @ 2djd„8€ ™€»LÝ»woýúõ<òH'ª¿—•À2Ý9;8€ @é$€LM'}Ò†  ¸ÈÔvíÚUªTÉ*P=樓N<ÞV¸Ê¤«L½Â€ d)dj–VÙ†rŠ€­L•í‘*W®l¢tà‹Ï=¶ x캥ÓÞ{ç•c=ÚjsðÁËìŽ;r … @ b@¦VŒz¦”€@f0ÉTÙ颋.²)}è¾js¦ ªÃò²üºuj~ø¡V{™†mÑ¢…¬ÎìÒ“;@€ ð?©4@é' eê¢E‹LùjñYõº+ Æö^¿¬Ð6,œ=î™'’‰V«X•)Ù®]»¦¿ä€ ø#€LõÇ +@I™zÞyµ.¸à:ÛÔóªü¥ÏOÖ//ò %E#î¾ãf['rn ‡¬&Y‡ø† @ 6ÈÔØPâ€@8òéý÷?ñÿþß/­òò䓎ïÔîƒõ˧ cûV½î¶bõÊ+¯,** —ObA€ Ô@¦¦†3©@°' ïŽÚnä{ܱG7xóÅ +f„Ãt¾øÂólŪ¬+–ÕÅT  @ÈLÈÔ̬rä>—|_zþñE%y¡ª1b®-ÿü§3lÅj58·&÷Û%„ d!djVY†²œ€ËF¾?pûÜ£7®œohת‘¬¶=·FYåÜš,oPd€ k©¹V£”Èdnù^åäñý7®œ•PXµhÚ;o¾$k‰­bõÈ#lÒ¤ çÖdrË!o€ E™Z¡ª›ÂBi# ËkkÕªe»øöüsÏЫýÆ•Å)‹çæ×yá_‡~˜í!«íÚµK † @ÿ!€L¥-@H–€,©­_¿þÁl·‘ï ]Û7ß´jvŠÃ¼™ãžxì~§CV9·&Ùw@€¼ S½ñ; \6òmøV«SSr3§ ¯vË N‡¬Ê ´ÊMT@€ ž25<;bBp!಑ï˵Ÿ\R:ióê9™òFõ¾ú—8²ZRRB-C€ @¦¦8ÉA¹OÀe#ßG¼³´8oóš’L ƒúv”WdmÅê½÷Þ»jժܯ6J@€@Æ@¦fLU@ û ¸lä{ã WM8xóš¹™ºvhñ‡ÓNµ«rn ‡¬f ¥€ ì €LÍŽz"—€@†pÛÈ÷¼s÷íüÅÚyÙš¾÷æqÇc{ȪìÅ!«ÞÉ @  Ss ) Nîù~Ö±E¶¨Sc>×.›Y¯î GØ[#‡¬Ê¾P²šÎ6GÚ€ \'€LÍõ¦|€@’œ7ò=æÝú¯~±®4«ÃÒÓž¦æAdY­\¹r×®]“D‹o@€*.djÅ­{JD!à´‘¯Ì@¾òâSë–oYW–aþœüGºÛéÜYÒŠˆ @€€-d* €@0²‘o•*UleÛ“?$¢.7Ô©©Óò‡ÝxÃÕNçÖpÈj°6„5 @®©4@~ È!¢U«Vµ•j7V½fvÑØ-ëççv=¬ç¥_`K Zµj²Ñ±_”ØA€ gÈTZ o²‘o5lå™È¶ÑÃzmY¿ â„>=ÚÿåÏgÚÒJœ[ãÝž°€ @€ÙTÚ Ðd#ߺuë|ðÁVUvúNíÖ¹õ—TÌСí‡'Ÿ|¢í¹5rÈ*çÖ„nrD„ @€ÙTÚ {ræŠlä+ç¯X•ØqÇóáûõ¿Ü¸ÐèºBÊH¸É!«œ[ÃÕ@€@ÈÔЈä>Þ½{Ë™+Võ%ù¾Zç™ «ænݸˆ ¬Xr÷?©ÑÚ&±!@—2µâÖ=%‡@'ຑï±Í›6ÜþÅ2‚{v}ñÓ?nY7ÚðÇö¨ó`õ‹‘©ü£ø€ Щ¡ÑÈbŽùqøk/?¿ií‚í_,'ø$°kûúüaçÖµ³'tßëµq=_A¦fñµAÖ!@@™š•@ pÙÈ÷©']<úö-+> |µ}Ýß»w÷ŽÒ©=òú¼‘×».25…m™¤ @9K™š³UKÁ —|o¾ñºy³'íØ²‚à“ÀW[×|ÿÝÞ½{v,™3|b¿·&ô­‡L劃 @ .ÈÔ¸HâÈ\.ù^véEãGÜñåJ‚ß}»{Ï®­«Mš<¤Qþ€úÈÔÌmúä € ©ÙYoäðGÀe#ß3N?­g·ö;¿\EðO`ßž{÷ì\¿|FÑè–ƒ l€Lõ×±‚ @ djX˜BYDÀe#ßßwìGÍïܺšàŸÀÞ=ÛúéÇ­›–ÎßvòÆ“7B¦fÑå@V!@ÙE™š]õEn!_\6ò­ûjíÍ–îܺ†à“Àî][ÔF¾²OÒÔaïOÚ™ê«b@€@XÈÔ°äˆd$§|>è §kÕ\»rþWÛÖ|øú«M?þðÝ7»·-.:mD³iÛ"S3²Õ“)@€@®@¦æZRTX²‘ï•W^ù »Ï·ßZVRèS›a&¾Þ±ñ‡ï÷íûæ«•ó'jQ8²92µÂ^Y€ zÈÔÔ3'E@ f«V­º÷Þ{mêå—]µfB`Ïþ“fd#ßeãæt™“ß ™¸9€  S€ŠK@ 1²[’U£ÞyGµ¥3wïÜDðIà¨?|÷í¾Ý²OÒÜÉÝJ&uE¦&Öfq @€@`ÈÔÀȈ¤‘€‹j”©—_vIᔼÝ;7|Ø"'͈@Ý´znYaïySº#SÓØžI€ [ÈT ML2uõüI»¿ú‚à“€œ4óݾÝ[7.Y8s`é´^¥S{ S³©õ“W@€@…!€L­0UMA!L2ux»Z«çOÞóÕ‚;Q§{÷ìÜùåê%³‡Ï/ê[VØ™š…€ ä&djnÖ+¥‚@®0ÉÔ⼎#Ú=U®Twm!Øøö›¯~úé§Ý;¿X5ÂÂLïLÍÕ«ƒrA€r†25gª’‚ø%Pìðñ¿Ý×_­Ü˜b©/—,Y‹7O'á’ót›É&™:{bg #>}zÍü)ßìú’`$°oÏN9ifß7_­]2mѬ!‹fB¦&Ô¶u‡`íJѧ[鋬=•í—>ZÍœ:CO‡°ûra¢1ÊžèB„®tÛ;gTrAo…â6\ržù á9±7F/Bt~€ØÚȶñþí¯¡KfèR1g Ss¦*)ˆ/Òû[÷‰UßœnøT¯^½{÷î.¥W±L£Rñ!_^vÙe¾ró#'oîNtY‚&(o™fl•©s ºOè4´ÍËæŒûæë­!°oÏöü~ÿ>Isd•ïââ¡ÈÔD[²ôº‘‘\¢ir.ƒêÜŒ±Ô—Öî+gmL÷Ž›)–Æè¤Â¥"¦4NucÒMT@›6mÜ:TÌtDùCþë~[‡¢±kÖ¬iJN¾ñ¼(Â%矉ºq˜.'Ž˜TœDhÎâGÒõŸIe©:?Y êÙ½J]ªÌÚ>C”.tóó“Ul*djE¨eÊø_.2Õ*_å®ì47‚LMW«²•©%“ºÍ)è6ªãó¥“zóõ¶ŠvüðÃw²UÒ—-Ÿ7fiÉdjÒmU†àÆqùË/¿œtŠþý#Sý³J¯e2UĆÓcY÷Ç©.­Fs“Û¥ñB0&-ß»,4—œÿúñ¬2æ©ý“¢éG?Và.ĬEÇZåú/`Œ– ”ñyDèÒ…ƒcYp•©9P‰!£L•ûŠíÇô$ØöæŠL =VS'™:wr÷yS{ŽïþúŒŸìݽ½b9iæûïöîØ²jå‚ ËæŽY6w25ÖÖgïL,õTƒçP8YÒI SSI;JZ±ËTy\¢%“é9ÕRRù^ßãlWâ•’äJÅRS…ʡӃ-ÕÔ,¢ÄR“iî B'矶Θûµš˜ö¯&œý3AVÆ'cý0.K5@rZ|¨t¡aÆUüädjnÔ#¥ðK@ËT÷Û•Ü8w ë‚%§×±Xôë·&ÂÚ¹ËÔyÓzôo”ßë]Û6îݽ£â„¾ÛûÝ·{¾Þ±iÍâÉ+ÊÆ//‹L ÛÄÇÓRPÌ<×FN#lÛWÂXôg‚ñâ•©Æ~kk4þjZý«²Î'K­kYuã·NêY5‘¬&‚¡“óY¦™@—û~hbºâ¬š_“t=—=K‰ŒS²iyÚ¥*ÑXp¥ ÓgµbVq S+N]SÒr>eª²ÔJÕzsu¢‰LMºyÊÔÒÂ>…#Zå}^o×—k÷íÙ‘óAÖ÷ÊF¾{vm]¿|æÊWÎÏC¦&Ýþuƒ”±¸hB5q”ᯋ#SSÙB|¦¯LÕ¢ÑiæSÞµm«:¢í+²¢xU,«u_U«å˜ÔZèäüP5Î{®¤ MLÜVˆºÐX e™ÞEªšŒU®t¡aú©Vl*dj…ªn @¦ ,}#—ŽÛ玅ÈÔ¤™™ZVÔoV^ÇA-Y]V »ÝæjønïnÙÈ÷Û½»¾X[ºzѤU ©I7?«=S¤æ—´ôÙc¤>ÃÆLº¼.è?cl¡äŸ•‹e¼2ÕO;´–žïpÚhùꤊ Â%ç \mȤצõsÿ3ºRÞ\6xTÛЫѶ޴Ð=Jê[˜O™:Æ€Òi}dS¥™#ÚÊL£Ê’Ká»}_ÿôãß·oëÆÅk—L]³x 25õMQ¥hgëíœöM‘ñººÐ\t¬\ïÊÆº\SÚ¿xÖýƒgß"ùQ®lGä¶2UR—X¦$\:¢ é¾\€‚ º>)ÚŠVw°¶Ó†&o& .4ŒUeé´|Þ¬ùQ5(ÿgÕÈíF2é>«o•ˆZ¨¸D4=—QåµýÒˆÂÖsèäij¾ÛÞÑ´L’2Šd{O페*£z ×¶ê–ûš,•=…Ý3«.íA_ïÖü¸“tÕ£ëb㥋3]=9éf&djfÖ ¹JŠ@P™ªŸ›únÓÈLgWËTÑ´ïŸí½J{“‰ñ°Ž+n­Vw™*ö*3Ö$a;ZMR&Ö5ÆwílSuY6©íõh‚‹gýÔÌ麶¦h;äuYôk|-ßšŠmG”!Ý—Kk `|•ÃX:)—ÓIJˆ§ŽT¾w‘¸.ÛœJ~¬)4F«OXf¿Mw+ã­Í¸‚݉§m>u3syÓªŠC''yÓÙ°UÔê!‹‘¤§öóÓGX‹àK7—ÄÊFœ+zžYuiúÒ¶}ØáþJ‚ʆÿWœ$«~Jç„(LOÚädjîÕ)%r#T¦: :Ýeª¾‹È=C=ø4%g½­joºã{ѨZMJÕE¦E²ÎƒÑ›í°L¥nܘQ}h?ý¤Û_P™º¨xØÜÉ=‡µyraÑ Y›ÕáǾûáûo¿Þ±qÓª9ë—Ï@¦&ÝØ<ýëËÓ8w¡¯ §”<Çg¶Æ "ѱzFÅØEX/Õ@2ÕØoH)tÆîK¦5œ 龕Î)'þa†+ ±r‰25—j“²xHLuy$©{yãYœÆC¶]8ÉTÏÛNÇfè±u\Ïì½ë#¸E™ºlÞØ¥%c&xod»g×-žþí¾Ý™äT9iFæPwlYùź²ÍkK‘©ÁÛK‚1\¤£§Âq¹HmÒÛŸxŽüBËT(«ýWœf~œ:œ é¾ü$§¶ÝóÑ€¤hí3=÷Ð’X:¹  nciÍÆɦ=™œV Óu™Mu9Ö')¡“ Á!Šös!f͉ëååj_þkûbª.¾i6>JVCQQT¢N5k·þKçÙS™Äyèœ1· Ss»~)™@jdªËÝZbŒS~ža[¯¶Ã§Û¡°§¾Í„öQ¦./¿bþ„E³†ŽîX» ×;_m]óÝ·{2.” TÙ(éÛ]Û×¹aá–õ ©™ÐöŒypŸÕO‚L õµ}ɛƯZÀxŽ™‘¼è³©ž„3gH÷å)SêB"Z·œõ³ºD´®L±˜5åÍv¹xjfSŠËú<"´nŒ8›ê²5”ÏŠðl½¡µŸ;1kºú!¯üaÜFËtEë¥U>ß'÷,`DUƒ.ÓÚÊ¿ÏÒùѨñî±øDÏXÈÔŒ­2–ÔÈT—E³¶7]58p-Ä: uq¥¼íEÅþ£'Œ· ?CDj%ˆÓXdêÊù«Nš›ß}H«š¥=wµí»o¿ÉŒ°Oª(ÔÝ_mÙºi©œ7ƒL Ò:Rgk\Z/‘õ£/1Û‰§£8ô"@—Âå'INÍ|Z'7BϦšØ‰5…«ÞvÓű® Ìî+ŠL•¸¦‡tºwußâŪ-uGí¾&ÅúL0i™j|–!©ÛŠ—}t\fS]a—ÙÔ É…¸ÎCÈT?ÄÓ:^w™ê²NÌv-™öær7²®%sç¹<ŸvÂTaeª@º~ùÌ5‹¦ m!bµ¬ ×î[D6¦ üôã÷R²“ÓŽ/Wo+W§:0›ê}9§ËB_Œ2³]ñ«¾Ô½‡S‡`¸»Œ¤uŠò‡Œ&­Et™*û¸hÕ-ÝUZÛv8RÒ}yÊTw!mª §ÂšRqYôë>e”2™j\–é¹…»Ÿ¥Î¶¯UûYêl-rèäB\øþej b~rbmK¶«\žy%:ý¨_¤'†Ý¯”ØaúŽM.@¦æRmRodªqiŸiÐæ.S]V—Ù®ªò³q…Ë=Þ˜œç£MF9 SÖ«uËWôÿ¼éüÌ´pÖEÅÃäÜTu ìô«¶PRï¦êÙT%S7¬(Þ¸jκ¥Ó§k5°ùC…ƒ›mX:Kö1J(üX.P’b¿ÚºnÛ¦eÖÀ¢_ïë9ús—=’5£¥í»¦zöRˆº·±j £ÓÖ¬@t™ª=8=áò”©.ƒét_Qdªµhž›`©ä¬[(ég.ï[¦l %£Hð¹)—缨mKÓ«XJíÔxÂ%âº÷)Sƒ“gFjÑËT¤µìúàÓL˜MUsÚ¶½Y¸ÒéÚ 3Dµ%ç Ss¾Š)àÿ$Sõ€Ã*;ÝeªËøÕö©³öæ4’°ÝVÔöÆo9h…ˆZË'£M¶ËÔîíßùÕ¯’;î‘GVû©ûÃÉT9ôeóšÒ/Ö–•Nî=î³×†µù×ü©¾Ù½SÞ1ˆ@ýþ»}_m__®E][(e^¦•‰Ÿq¿ž6±Õ~Z ‰+—×Õ<ûuE«Ù“V´Û* OÁ`{L¨q65½Ý—§LuZ}-5|£ØÐ@\¶³ÒØõL”Ÿit…&z Q$¸hf7Ý`œJmÛNôÊiÂÖ–°$.¹½‚™‚˜íÙB¦ìé²{Îf«ˆ~²‚€S•œmÞ¢”.Ì …«œ!€LÍ™ª¤ ¾ø”©r‡6¾¦e]ÿæ.S¥Ó·±éeu&Ý«½ÉÀvp`\d¨Ëéô|Úi¡²Ž¨ïš¦µˆ9 S;ô×j°~è!¿þÛyž1±gÐÙT-Så˜/7,’ÉÕÃ[üèáéÃ[o^5ïÇ¿‹D þøÃw_ïØ´uã~}]ש4²*—ÔõµæôèJ]ÚꙑӜ†îœ†¹Ú ™jÛÉó,]ðÌì¾üÈTÛu.ºh¦îשŸÔ iì&·”í;ÉF’Fõègû"ÿíܸÈ¿FÿZ]Ø66—'&Z¾Z'Õ„MEœ>µ_8b.K®TºÆÝƒ<{ñ™Õ ew·Wg›·Ð¥ 3Þrá-7 Ss£)…_F™jûR™Ü†M]ÚNƒxÊT놢QõðÅtœ·q”)#ã0QnðZ0›CN2Õ¸ÛŠu¨aÜýÅtgÊv™:ojÏ+/;ÿC~¥”ê¿ü¿£~sDŸ®Zôk’©¢$e7£/7.)›Úwl——|xŸèÕUe“÷îÙ)«v…ŸÊÏBýnÏ®-Û6‰@]ì3p ßk;%vN{ª9%î9\3íÆdûx˘¨U{iö&Mâ6U? ³vÆ-š¬Z:Cº/?2Õ:kd<'Ãߨ'u¤ÆÇަ>Ö˜œé)¡‹LÕkDý¿=h\ äòú´úÉ„N·c;´.ÕÑ-Yî#Æ|Š¥ûzòÐÉ©‡;qMQ†&f|e‚)µ¯oú>ó)uá9›êÒÔñQò±.B–o¬Ä<¢ WºÐ0SÒ‹“H6@¦fSm‘×è´´sÙ®@ÿ$7§×´<ßMUNä® –òÑwbÛÕ5Ê›Zˆ«þ›|)ÿꛜéÞ¯ÓêTœQ½ÉýF{“ï­EË™:oZ¯çkÝ{Ø¡‡èJ<ì°Cžù×}þßMµ•©Û¾X±}˪_®ùrÃÒ…'÷m4àÃû z7\Z<úëúé¯ð“¼àúÍîm²¾Wfh†…2¯ûź²ÍkK%o›VÍÙ¸rö†³Ö/Ÿ!¯Ô®[Z¸vÉÔ5‹§¬^4iÕ‚• &®œŸ·¢lüòÒ±ËæŽY6wÔÒ’Kf_\wr·’I]çt™“ßiö„Åyígo7s\ÛcÛÌÓzúèVE£ZŽl>mD³iÛNöþ”¡M&i뿟–×ËÏJî2uçÖu_mß°kÇÆ¯wn^Yš_4´åÐÖ5G¶{V¦XE²nÛ´\fLÿ7ü$oß7_m—)Ù Ãdj†taN§(»gÏ8eÛ¥¸¼¯=ËÅn|Ôeêd ¯_s58ýËTIKÏœX{ 5±¦³jœ$ÌîËS¦Jÿf\i,£ËL— yqhZc̃IÍz&£L t`’­rsº}ˆ±ûbÓ™FºÔ.»ß ´ÉÅ+S£s*¸íƒi÷#•2UÝôÇë|*]t˜Òá“L €LÍ„Z ©# :PÏØþ¡N˜ðÌŒÒTtëqùRáÔ ®j Bþ•Q‹“îÕÞTº’KîîNÃ]—=%®Z ¤ò Ö9eC•(ÜáižÄâ20>z—ûëì‰çt-™Ômîäî²èWfSE¦–õ+Êëö׳ϪÇIÇó›¶-ê{îôë_¦îþj‹ ›W—.š>¤hH‹QŸ>×ïý»&t³lRïí›VJ‘¿Û·gû+·¬—Ñ(ÙÔ¸šO$?ú: zè®Æö0íÖóÕ5½lO]Φcct*ÆNI¢¨ï%×_Z—nJŒ½–©ÇÐY5ʳ é¾üÈTe#4t—h{ôŽÕ•©#ué–q¥§•n_¥¥ïN w]šmͺ”W»r¿Ùé_\©öf̼ˣ[íÄÔ„|²’è’ z1Ú^Æ<ûde½šl îYÝ.ÕçžUÕ€m‡Š¡úÉÚ™X‰©çnòñ³˜ÜX­î¥‹«ùEꬉœ+©¹R“”ƒ€O™ª¤yú‰{dÑïzȹçœ5nxW—iBÈT­W寶m\³pÊœqwmÛðÕ¶u2K`ÑoÅhÝ”2žÓS‰¤ŠS@ˆF™±!Ô$SåÜTÙBI6R2®¸“M€y ú¼#mÏM Sw~±Û9ìùêË­›–|±n~LwSSÛÎH-‡ Ss¨2)  P S+PeSTä 2U¤™YзÊ9gþÚ°ø ƒ<ú¨#›4|uÍ’©k—Ê^Dë—Ïܰ¢xãª9þeª¼žêÊeêÆ%rþj\-”r õR„´@¦¦;‰BˆH™ Ñ!”!SÕ4Ï>ùÀ¡ÿ9UUM®vØ¡§ýþ”!ý:†‘©;6ÉÙ§.a¿L]üÅÚÒ¸25¥íŒÄrˆ25‡*“¢@ˆ2µU6E…@-S—Î]8¡ÏETùÛùçõîÝ[N1U4¦L™üÚ«/ 4›ºkÇ&÷ 2UžÙ¼f^Œir S„Ô@¦¦ž9)BˆN™! Ôˆ"Så@™“üþû½_µaûÖeÛ¾\*a×Îuß}»G¶F¼ä¢¿ èÝÁç¢_9“Æ=ì—© 7¯™c@¦¦®‘RP–:™™C¥(€rŠ25§ª“Â@ ç xÊÔQC{Ê4j§_ÙBIÞMU‹~e6Udê7»·ïܾzë–Å"SåöíÝÙ Aƒ#?¬ÒomÕìݵˊe‡^™•÷K·m^¶í‹Û·¬Úñ嚟ÏM•£S½‚ÈTñ°iuIÌaÕœ+goX1kýò²VyÝÒµK¦®Y}úY•¿8üpÑ«÷Þ}{nÊýnóÊeêÚ2Y ›D`Ño65Yò @€@pÈÔà̈¤€™*Úò§Wî×ã£7^­õ§3ÿÐ÷³fúÝT‘©+æO9Õ_®þé§ø~Ÿ¬õÝ·÷«ï¾ýúûï¾ùáûoÿýïŸÎ8ý¿þÕ¯LbUþ+rõàƒ¾þº«;wüdó†å"Y]Â~™Zºqeq™š¾HÊ€ ¤‚25”Iˆ‹€™zæ§Šª<ðÀD¦~Þñƒ³Î<­Îó5ÔJJ¦®\/Juõ¢)_¬+Ûùåš½{vìûf—Y,ÿ®\R\¿ÞKGõ›Ã=Ô*VÕ«¿ü¿ÿ»ü²‹Û~Ü|ó†e;·®µ‘©›×”ŠžL(°…R\- ?€ d djV Y‚ ø‘©³¦ô»³úõJa^ý‹†ôk{Ï7U9ç̱C:™dêš%S×.-”-s×/Ÿi=7µCÛæ§ÿá÷²£’¼§j«W9äJ¿=nÉ‚bѺ¦°_¦ÎÛ°BÜ&©\$€ ä0djW.Eƒ@ð#SKg ™]8 Qý=ô×"/+ýö˜–Më5kR÷¤+=úàí%ECõlª»LUÒ”Ì*hüî›gœ~Ú¯ö¬zõ¾{î%Ħ 2U^‚1™\à@šlß € ý©4@ ›ø—©3'÷íÙµÙN;E ËG¼}pß¶5ºý¸cz÷íÕ¢_?2UŸ›ºdþ¬>l,k}:°|`åöÿþïÿ^~ñÙ[V›2•i²éº"¯€ #€LͰ !;€€+@2uê„^ã†u¹å¦«”¤<ñÄJõ^}ªs»&×^}é)¿;±O·ÖdêŽ-«TX½l^çö­¯¿öª_þò—wÝYmóºÅú'ýÇ~™ZR>á™hXZ¸vÉÔ5‹§¬^4iÕ‚• &®œŸ·¢lüòÒ±ËæŽY6wÔÒ’Kf_\qì1G©1œœƒzßÝ·¶jÖà¶[®—¿ºÿŽSFȾGrÌk˶¬_`”©Û¾X(”ËÔ•Åk—LK>°è×WˉÑHËTÑN£”M¥R•´´’1.ÁE¦z6D™ SeJ\‹O™ª5ªš>Um@M®ªè2Ùî‰@™@™š µ@ ¿|ÊÔù3,,*‡Ä|±qUÁ¸^Z¦èùq÷NÞ}çÍ2¡ªmòÂjígoöþ[wßq‹œ•Zí–ª#‡ô0ËÔÍË· ûeê,yq4wSý¶ž˜ìôˆß} ¨žû’f–²õ–J¥Hå½DSqSðnjV/úÍd™*µi|ðá$Sµœ¶Hé´Ÿ¯¶Æt¹à€@HÈÔàˆ¤…€™º@v š5dÃÊÙ»¾Ú6}òp5›*2µO·–Ý»|Ô²é[œÿW=;qÚïOyôá»[Ôèñ÷ËßçŸwN·N­ÿ;›P£Š¦™ºaÅ,© l¡”ÊÖèS¦J–Œs›©Éaz…bzSH8“eª~úàþnªžJ•~ÒJCæQS°ð;b-€€&€L¥1@ÙD ¨L]Tòà]í?ù°Á›u.ø[•ãŽ=¦Ùû 6¬ž¿uÓ² ™šÃ;ýú—©º¹¦lW¡ô Åô¦±#ËX™ªçH¥9¹ËTwþº€ž;0E$It@±@¦Æ‚'¹@@Þü‘›·Þ¥Sþ–5{¶Ï¤¥•µ|¦XòÄÚºÜNEQGDÈ¿ò·Ú«C%'Q$!uz„|ïBSÙØîÕ)dêFç_þpÉ¿NNÒ’`:¢DÉðõ`!dêâÙ#–”ŒÚþÅŠ]»vL™8Tͦ*™Ú¶Õ»­›7xàÞjGu¤«G~Øí·ÝÔ¹c‹O?izã WzÈ!Õ«Ýüy×¶[7-õD¦®_>sõ¢É© H“º^È¿LÕÂÀ$SÕU¬º½)«tªs0~|^×úŠÖBE÷êùט¨ñ—nGŸjãÞ/é {ÊTIËÔaZ‹¬½3,ªôNÆþÍ¥§ULQŒ{#)Ï:iEOO6Jhbez7Uº}cg벉®ÆnÛiûi²z±®z§4ŠLÕg*_–öSFl Ø@¦Ò0 P~œ ñµÓ‰N[#ºl¨(Þl_ES+²ä_ënœ"=Gx.ƒ ½¶ÐºÁ£í†jÔ%)êtuD—Qc&´•Ð2uéÜÑkOݳkëÆõ«÷ë¤dj»Ö>ý¸ñ§¿×¾M“§þõÐÏ8Ms8à€n¸îÊÎí[ ÔãÍ×_¼üÒ‹;ôûî¹ýó.m·n\êÊe겫NJYàÜÔ”µÏè2Uy0J#ÕðLjÖÿu­u”µP/ÐÚNêX’®õášÞ³G~õyÚªK'&]¢S7+]¢í[¾š’S\§žV‹+ •–Iì9ÑÓÚR¨§V·ò­öszN῭껆Šâ.SuÞlo@úeé ïäýÃÁÈmÈÔÜ®_JçM@ŸD§Æz ¸ý‰Ué•­šU#ë@A8ô`Î8æÐ¯9Ígê,™æxuD5ƒªr¢fÔpʪ´µLÕÖÓNSÁÞ(SbE¦.›7vyéxÙË÷»}{JK¦wïҲ˧M»¶ÿ°kûfŸuhþYǺujÙ¨þ«—_z¡qzñE¼R癑C{Žݯþ›u®ºòÒcŽ9ªÆÃ÷ ÐýËKœ‚ÈT9ŽU¤c*ÃÊWÎÏ[Q6~yéØesÇ,›;jiɈ%³‡/.ºhÖEò²îŒ ¦÷Ÿ_Ô·¬°Oé´^¥S{Ì›Ò}îän%“ºÎ)è2'¿Óì ŠóÚÏßn渶3ƶ™1¦õôÑ­ŠFµ(Ù|ÚˆfÓ†7:ìý)C›LÒxÒàFƒ l? þÄ~oMè[/¯Ïy½ëŽïõÚ¸ž¯ŒíQ‡E¿rAH'`«?ÕµiºúL—j ëZ-ÑQÔã0õQý‰ÓŠVŤ²Œ°<•èKßI¦j*cº›5–ѪT­”TO«f25XmìÕu—¨ã굯&zb Ði9gÔóêi‚¾Y™ÛÞ)l€ÏÎRõùêy¢™j\dnâéÔ}æ3@©'€LM=sRÌ,z¡—õ³žó4MqHôÐĪõëCƱ…*³q@#ÕèJÆj¨‡Nó·¶C@ãIz¦ñ¯S4•Î8{ 6*bïsi_«0ºL]1ª…“äÔ;·Í(œÐ£kË][õü¬uÏn÷úü“ÞŸ·íݽ,÷½íÖª‡òk£^½âò‹E¦NÉ:iÂo¿rÑ…ç{ìÑ…“G}¹q±5”ËÔ¥E«ä§2 SSÓ2ýϦ:uÆyE=e'm[+®p×µßI(:ÉTã²Æ'k:çV«Ú¦nT¼Ö‡wzÎV‹F“èU× ©3>(4ýäT"ÕÅ™”¼±Áøy7UÉl“06N;›Z ”])Þëlõ ÈXê>¢kA?µ4>qßž:5W©@ðC™ê‡6¹L@Z¬BT•Y¿€dœáÔƒ§‘‡œ&=B²ÈTrîKæÔpÍøÀ^r¥ÕÛ®ÊÓ#6SÝûer}Ç"SWŠz\8iݲ_ïÜ´cû—ÆÐëÓ½ÛìÓqPŸNƒúvܯËàþ]ûõêøô“5~ÿûSLkü®¹êò&êÍ•w×·|Üâ=ÙØöËÔÂU &¦2 SSÓtýÈTõÖºÓŒŸËJõè*ÜuB¦Jëâ^ýðΩ§râlÛƒiä¤x£jJ¶u7kʤöfË(bMýÈTÉ’íz?M"PãÔË|L7O™*©8½"®2|±L DC9O™šóUL=8Í7ªh¶ÚOGqY g;\sOK’sZÖ«³¹³ŸtDcnµL ñŒ?½M*F™ºzÑ”5K¦nZ3ïÛ½_oݲifф჻üùˆ!ÝGí1rXÏ‘ÃzI5¼wnm_z¡ÖyçžmÒ«•+ŸÜºÅ{[6,²‘©k—L[9BÊ‹~o¡Æ§zµ¼écS±N!j¶+üC_×ádª±ç‘.ȸŠ$¨ª±í÷\ž¾©ªÒ²Ü¤uDÛlxÆrjN"ÜLuZê¢»î¸æ*U¿mUÅž2Õø¯n“º5¢TïHˆ25>–xÊNz&A½æç-,ÏQ—QUG-Z¦: eœ6IÒ3¦aœ§Cɉ. qnAËÔ@+ú2¡†c—©k—ÊK¤2*‡Ö|óÍî…e³òÆô?ºïø1ýŒ¡ oPáäᣇ÷z§þ+×\õó,™¬ nýQã-ëZÃ~™:UÞM}àÝÔ¤ªqÉ®éÉ…é¿bi»™{úº-S¯èëÒ…xÀZ.}ÁºŎӷVÍæçÌ'?2Õ©ÃÔ=j,2UwÚN8œ`—ÉÈßZÞ‹¤×BZ eøvîI_¿ø‡²…25[jŠ|&HÀø¶’z€-ßÈ=Þö^nܹQ½tdû±]®æ¾ÀX•Ðv¸æ4jÑ©¸äÄv¥q¼ƒªëÆâ:!™*‡ÇlXQüźù²ð·ßî]»zÉô©£'Ob "SgŽ.™5~þÜ‚™EcZ}ôîé§ÿ~¿L]` "SeªvE™Ìm¦>°…R²MÒ}6U]Œ¢ lªñ2w_ü¯^ƒtù(Iì4iBà¢Á”¥éʲÝ!Ü«µû2 '?¦QæyÎZ ôJ`—ü;=õó#SThŒ=ª~•×væÖ…‰ñÛ|_xö¬J ¤25íU@2‚€qëHã|ˆŒ LÏõPÆ}EÿjŒîG¦êáŽu;ÉŒ –ÿYÓp6ÆAUŠë/Q™ºqÕÙø‹u ¾Þ¹ùǾ߲y]éœ)ESFê0sÚè’™ãç—,.›ºbñô»î¸¥ÕGÅÞþ#SÇËÜfê;ý&Ú,õuzêÌ]€…¾®žsÉ÷ž2UlŒí„è"S}v˜eªÏu"¶ü3D¦êÛ„í+'.-G«P‰®ŸZúY7®  €@\©q‘ÄOÖGÑ2Ä‘»¸uŒhœ¯ð9›ªç Œ»Pú‘©ú‰¸~kT¿‚e}¸îs6UOïèJB¦ÊJêÝTµèWͦ*™ºyMékËdfõ«íë¿ÿnï7{v­_³xþÜ)sfŒ“P2sÜü’üÅeSV,.ºë޶ú¨‘XZƒÈÔÕ‹§,/—¦À4 öH)“©î³©Öë:ŠL5¡ìô¦;Öг©º¤Æ5,!fS³]¦zÞ_ôÞZŠ˜qs-A]Öôúä“àŃk@¾ S}£Â°"'ÍÆsGÕk« €ŸwŸœPù‘©zNC†hêÍ"½á‡õù·ûn.5†Lõ–©¢T÷‡m›–ÉJà¾ÿvï7_oZ¿lÉ‚¢ÿ‘©Í)3S(—©‹&/—“ZÓ875¹+52ÕºzÂO‰œúÏÙT-rtéby75Š. !Su1]6‡‹ònjÒ‹~ƒ®Ö16?·ƒ(÷/?Í@1@¦ÆW9HÀ¸í„.žŸÑ€- Ÿ2U¿^¥fb]’Ó#Ë ‹‘©î2uóÚRkغiéž]_Š^Ý·w÷–M+V¯˜]>›Úü][ãý2uÒòycÒ©ÉõGIËÔÐ×µKwá.Sõ³0Qwz]½~R柤µ³ò¹…’m!dªÓ\FÿN'Ùd¢_}ΪÓDºËlª†ï²?³®Žp³åþ[–€¢@¦Fgˆ‡,& Ærwwyônxù™mPnå_ã¨O™ªÇš*º—ؾnäçe$‰¨rb»ÓoP}›öÊNÁ»©²è×=h½úÐC|Ü¢‰­q¹L]X°lîè´†QKKF,™=|qñÐE³†,š9hጠ¦÷Ÿ_Ô·¬°Oé´^¥S{Ì›Ò}îän%“ºÎ)è2'¿Óì ŠóÚÏßn渶3ƶ™1¦õôÑ­ŠFµ(Ù|ÚˆfÓ†7:ìý)C›LÒxÒàFƒ l? þÄ~oMè[/¯Ïy½ëŽïõÚ¸ž¯ŒíQçÁêë×kÔ¨‘ö–c’–©¡¯ëp2ÕªKª57koiÔ¶/[*ÿª’Ñ&„LWž¯_êWposHÄL©ž´]˜èr¹ìÝåtD­gº@H=djꙓbfpmûl^OEšF9º`ƃ¥õ/SÕ`Bò¦ÿ°}@n_Ú NãYö¶ç¦"S­ï¦ÊIª>CÇv-¦æµ5Þ/Só—͕ހLM¢»IZ¦†¾®ÃÉT­ë¬/ÒK/düÒ¦íÒ-ŸœfðœTq8™ê4Yª2¯µn’¬eª5ŸžËO< <Ñù4paâ^pñ¯_?1Oî3{˜Aˆ‘25F˜¸ÊJÆ=úMRPžëëœi¿_ý½üaŠ%CL=еåç•3½m’í™FÐÆeɦ—W%c:Ÿ¦éâ” ªbo)˜MÝ´z^ô 2uÕ‚ü¥%2Ÿ™ÞÀljìmðçuørm†~Êã)ÀÂ]×!dªNÈÔE¥²ÿc6meªqs&«4ž\mêÁ<)9ûgÛÇs¶ýªqû"S¯îÙa:èE¼. v5Pw&.7&•—µ9²1 @¦¦2Id:ãÞ!2˜‡|Œ[(YgMe@£µ¨Z3¬biW2°ŽKüϦ 2£+—E\&Kµ¸W>Æ#v$‡¦åvž£®Œ­³”ÈÔ¹²ßoİ_¦N\Z22Ý™[Nz6U娨ø¼®ƒÊTãºëz =Éé´lÄJÖV¦Š™qS-‘.H½`{v—òZ¦W‘¨e)ê£Òr9>ÔØ««|ªœxv˜NFéKCtgb|"`¼1oþk3– ã€@hÈÔÐ舘;Œ™­‡û9=weû*i ™ª'ü̾ê—mþ­PÏQWÆÖnÒ2uãê’X‚ÈÔ•ó',™3"ýwSãnÍ©‘©’ë ×u ™jÔrN+{uI]Žâ4Òu’©b#’Ø(JMÇSÛf ´L•ääÁœõ4lq(‚YKGk¡´27M·zv˜"S¥àî7&vNŠ»3À dj‚pq]dø"·pµõ‘|äù¯çèêèc,è8­‘“¡˜šêôCF†YÊØç»a’¨$í3ÿ’måÜeS?™L½Mâ2uUÉÆ8Âdêð%sÒ©q7SuíD¹|ü_Ú®k5ïgÛÉèþD÷i¢=³¡; Ÿ…uJ]×€t³¢U7¥öL’þÍigZÏìyˆgIQ™é‚»oz,XT—®f°UÎ=;L'Ýg·ïÙT=‹¬3ìÿÆä™(€ÒB™šì$ „$¼L³qU ¡\¦–å-™=,;ý†lmDËE¢ôÔdi\Ò1!Q&@é'€LM@À?Deꆕ³ã "SW”_<{hF¤ñß°Ìrj­¯Ë–EzçáÐ;`e9!²@ ; S³£žÈ%  $,S‹7¬Œ'”ËÔÒq‹‹‡dHàÜT®  BÀýøPãÆÅ„ ¥©YZqd”@²2uEñ†˜‚ÈÔå¥ãÊÅaæ„™ƒÎ°`zÿùE}Ë û”NëU:µÇ¼)ÝçNîV2©ëœ‚.sò;͞С8¯ý¬ñífŽk;cl›cZOݪhT‹Â‘ͧh6mxÓ©ÃÞŸ2´Éä!' nT0¨aÁÀùêOì÷Ö„¾õòú¼‘×»îø^¯ëùÊØu¬~±Þ&§F´½Rì”л ËœªñÅ~yOUVùêmœ|¾óŸòì“  üL™JS€²‰@\2uqÉø§žx𢿟{õW|ÒâÝõËg®_1+ư_¦Ž]4kpdj6µtòž€q‡d}qŸa6¼ —˜€RE™š*Ò¤ÄA ™:wúð‹þ^åÎç}ºMý;>ó‡+νûŽ–+ÕøB¹L7fÑÌA˜M£ â# ÈœªñàY5±¯¶–½|³ d€@…'€L­ðMÈ*±ÈÔǾóÉz/ö,ÍûxÆ w º½0úãKž½3^¥*2uÙ¼Ñ g̬À¢ß¬jíd6"9ÎG#8|1¢C€@©IPÅ' Xdê4aé¬þ Úo2¥ç+ã>­9´éñü±S»¦ë–ψ%”ËÔ¹£dö2Óï¦&Õ4ñ @€@|©ñ±Ä <è2uÒØž•N:aÂÊ9£—ÍèZ2ºya¿z:=5¢Åm_9öØ£×-›K™ºtî¨3úg\` ¥ä[))@€ ‘25"@¢C)%]¦ŽÞõäßWºxšÌ¦×ý>4è½CO8:LŸµK‹¢‡r™Z2rÁô~Øé7¥M–Ä @N™œ1 ôˆ.SWÌŸpøa‡~2y€¬ø• ¯§êu¿']òç6-FרâAdê’9#Dffà@šô5aR† @À›2Õ›€@æˆE¦^ÍeO4}M–ûŠ@•-”dѯZ÷{ê•ç6¿ÞÚ¥…Ñ2•sS3çª!'€ ¬#€Lͺ*#èÐb‘©#v<þôS”@•ý“d§_Ѩ²‹Ò çžÑ­Só5K¦Eå2uöp™´ÌØP:­WéÔó¦tŸ;¹[ɤ®s ºÌÉï4{B‡â¼ö³Æ·›9®íŒ±mfŒi=}t«¢Q- G6Ÿ6¢Ù´áM§{ÊÐ&“‡4ž4¸QÁ †ä¨?±ß[úÖËëóF^ïºã{½6®ç+c{ÔA¦Vè •ÂC€¢@¦FãGl@ µb‘©+ä?pÏmW?{R§äÅTÙBé¤_Zš]£Š‡ý2uXYaïŒ ÈÔÔ¶\Rƒ @ djX˜Bi'—L]µpÒÕo<ㆠolù\õ>oýãÃ'ŽøÃñ}?ÿxÍ⩱„r™Z<´lZ¯Œ ÈÔ´7f2@€€d*mÈ&1ÊÔÕ‹¦4nPç´ßŸò‹_üBþÜ÷ÓÕ‹§ÄD¦..R:­gFýfSÛ'¯€ D™Z*›¢B Ä+SE©&Êeê¬!¥S{fvàÝÔ¸&( @  Ss°R)r˜@¬2uòêEI‘©‹f – Š2?°…R_/ € ¥©YZqd”@Œ2U^OM. SÙé·‚^¢€ djñ¤Š@ÉÔ…3Íüy6¤IUó%@€ü@¦úã„ â“©«&d6uá̲ž6+ç¦fFë&€ üL™JS€²‰@\2UŽNM4ˆL]0c@ɤϲ$tSÐeN~§Ù:絟5¾ÝÌqmgŒm3cLëé£[jQ8²ù´ͦ o:uØûS†6™<¤ñ¤Á 5,Ø @ý‰ýޚз^^Ÿ7òz×ßëµq=_Û£ŽqÑï#<œMŒ¼B€ nÈÔt×éCAd•Lí/³”Ù•©wÝ~ó?|¤ž±… @ B@¦Vèê§ðÈ:±ÈÔó'&ÊgS§÷+)è’-!Q™zÇm×­Y<éûo¿ÉºöF†!@H djZ°“( ’@L2uŠùÉ‘©ó‹úÎÉïœU!©E¿"S——ŽYµ0ß7»BV<Ñ @¨H©©¶)+²Ÿ@ 2µ,oEò™j|7UÉT +L@©fÿUH @‰@¦&Ž˜  D—©ËËòRD¦–ö™=±S–…d¶PÒ2U”ª¬þå=Õ¯\A€r’25'«•BA g Ä SKÇ/O>üG¦vœ=1«Bò2U”ê–ue9Û@) @q@¦ÆA€@ªxÊÔß-+ê7Æ€3-œ5dQñ°Å³G,)µtîèeóÆ./—š 2µtZïbQ}Y8Æ8›ªVÿîÚ¾>UM†t @È>ÈÔì«3r ŠLÀ]¦éÕì¿øÅ99}ì¶¶2uÙ¼q© ûej¯â í³/¤D¦®(÷í¾Ý¹%Sv@€\ Si€@6ðœM}õ…‡E©vØ!6zÉ:›*ª© å2ujÏâ¼O³1Ìßn渶3ƶ™1¦õôÑ­ŠFµ(Ù|ÚˆfÓ†7:ìý)C›LÒxÒàFƒ l? þÄ~oMè[/¯Ïy½ëŽïõÚ¸ž¯ŒíQÇv %5•ªÂ¦Õ%ÙÔòÈ+ @)$€LM!l’‚"𔩥…}zvl|âñljX½çŽªs üwÑïÜ1ËR”L•÷iV†È2õóOœsÖÉRêc]ô«”*ª‘/@€r“257ë•RA W ø‘©ònjQ^·›®¿LÒï+Ÿ4jà§êÝÔT†ý2µû¬ñm³4„žMÜ©öíUÏ?ð€_jê"S·n\œ« •rA€ …25 =âB©&àS¦ª-”ê×­uÐJhPïÙTjTIKdê¼)ÝEìeoºèwT÷W¾ã²C}Q ª¿?x·Žq¹¯þ[ÞPýáû}©nC¤@€@Æ@¦f|‘A@À@ L•wSGh+ª¢”n¾áÅ“û/•iÕ”„ý2õó™ã>ÉÞH¦Ö~üÆ£Ž<Ä*P?ìÐz¯>i«QÕ—;¾\M‡ @&ÈTš M‚ÊT9f^Ñ ûî¼IÔ1Gÿæ£÷_“À)å2ur·™cÛdoð)Sß}õžßxŒU tÐ>X}δ.U~Ú¸ª8›Úy… @ %©)ÁL"€@LÜeêè­:ð€šW›=¥÷ÿH3gä'Íß™*jªÊÙgöíÖ|Éœ‘‰‘©s'w›1öãì®;ý¶løèŸÎ(Ÿ©¶~dϤ‚1Ýܪúuå‚ 15 Ü@€ ;©¹S—”€»L™ßíê+.Õô׿œ1¢ßÇÿ=fΈ%sF”Nôì“÷Ë«ªbpû­×Nß]¾L(”ËÔIŸÉ.Ùl¤éѦöåže+P¯¸ôoÃû}âG j›ï¿ý¦"4]Ê@€€ÈTÿ¬°„ÒOÀÏ¢ßÚO‰=@ŽNmÖ¸Ž,ú]<{¸1LÞùÚ+/‰uøa‡¼ôÜ#óŠš bù¯ÈÔ’IŸM—ÙÈlÿ{nê°nõn¼æ|[zÖ™§õìÜ4@UÆ»¿ú"ý ‹@€ I©™Täð"àG¦Ê4=;¿wjåEMU¿å[!úy‡÷ÔÖJ'žp\›æõb‘¦F'å2µ ËôÑ-s jQ8²ùؾï>tçUø?'Í(½zÒ ¿m×òíUEÙ¶y™Wµó; @‹2µbÕ7¥…@¶ð)Så@šéºßtýåêèÔÁ½ZÊ´ª5¼þÒã2é*6?ÿì6ÍÞ°µ ÷¥ÈÔ9]ŠF·Ì0iȇ/üë¶Cù•uõØc~㾑¯íŠLÍö«’üC€b'€L)! ø—©j ¥÷ê?¯ŽN­ÿúS‹Š‡ZÃÌü^÷ÞQU½°*3«b6·°¿­e /Ëej~g™‡Ìöðæ‹÷ý›ÃlOšyþ©=7òE¦&x1à€ »©¹[·” ¹H ¨Lm9rÀ'gžqª­Ë/9/oXG[µ9eìgÏüë^µ°Ì¯>Qãù&.5ï—©ŠF}”½¡Å»ÿ:ý÷å §­9i¦hbo?Ô ³©¹x¥R&@€@$ÈÔHøˆ ¤˜€»L:¶SÕk/éòI}Yô«fSU(™Öïáûn¹%³¦"Aå¿ú'ãò}ýºµN<þ8%̪ÿóêA=[ØZz~)2uöÄŽòJg6†ŽÍŸ?ïìÓlêuW_âó¤?•wSS|ù @ [ S³¥¦È' PNÀ]¦NÖö°CËß5}úñ»÷ËÔÁÆ0¨çG=û ùõ˜£”M€M¿ÿûñ‡u•¥|äÑ®“Çtu±·þT.S't(Ñ,»ÂÀÎo\qÑ_lê…œô¤ŸJ•ÙT®m@€L©4 @ ›x.ú8üÓ Îûs¹¼üË“GwY(bõC³F/‰LÝ¿mÒ_õhn5Ðßôîòþ5ÿ¸Pk6qX÷ÅÇÆýÔ%ŠþIdjñ„ÓF|˜-aX÷·ï¹­|Ç)ëGNšéÒ®‘OÍÂl×öõÙÔÉ+ @É@¦&Ϙ øxÊÔÒÂ>r ̦ª·L[øšL«š‚lüø#·ËÙªbsÏí7È­6úùµñÛÏÞtýeÊ^>ò¦ëÓOÜ3¢ßÇ.±~–©Ã?œ–ñalŸ†ÝwÓI3¼['„ò åûo¿‰¯à € \ €LÍ…Z¤ ¨8|ÊTy7µWç&jÖôá{ÿ9gJŸ3šÂˆ¾­/»ø\¥f_{ñÑéyŸ[mŒßˆ“ÖM_«öÏ«Ô6ò‘£Y?lô¢m,‘©³&´Ÿ:¼i†‡ç¿å(‡|夙³†œ!Œ×,žTqZ/%… @À'dªOP˜AAÀ¿L] G§æu»æß?ÿYyDßVò5´núªÚ3IħÚqCÚÚš™¾ü¬Ý;b,å_[ûr™š÷éÔadlhðÊýÇW¾³±ésÐAÖªyO,'ÍøQ­[Ö•eDÃ"€ ddj&Õy¼ø•©ÓÌÿOx­v Y¯+¡Ñ[Ïè/MÈO"e•`»ñºK{vzÏÉÒç÷ûej»)ÃÞÏÀк±œ4s‚ík¨÷ß}sŒ'Íø‘©¼˜êÕäù€ P S+b­Sfd/ß2µÿüéÿ >ÿðÔSÊ•mzvjlüÉø÷§-ë]vQ¥ßÄòÃwk;Yz~¿ç«-³Æ·2´IF….-Ÿ¿ð¼Ÿw06ÉT9ifìÐŽ~„eŒ6«æÿôÓÙÛÉ9 @ @¦&·€@"üÊÔ¢~óÿ7ÌžÔóéšw©mªÝ|eÁˆ&ýßá}ZˆRq'ìkµq1vrR.SÇ}2eÈ{úwxåšËϱA•“fzvn£øôh¹Hp @È~ÈÔì¯CJŠD ¨¨È¨µn©z霂®%“ºÍÜ}ÞÔžó¦õR;ý:…ü®¾â‚ò7Q=¤öS÷»[Ö|¸š:…U>çüåôWk?2vÐ'.QŒ?‰L9®Íä!ÓFõ|ë®[.±ÝÈ÷´SOn×òmÿª2^Ëeã~ø~_Ej¼”€ ¿©~IadJ•*•ê­U/3ËÔ¾e®¡K›új °üÛî£×]Œ ÇuiT﩯½ä¿§Ñœ^ù©šwëý‘{å2ul›Éƒ§1äõ{çÑ{®>ôƒ­“¨Çó›†o>¯ì êmëÆÅÒ¢È @™F™ši5B~ ½{÷6é®Kþ~öŒ¼.z6U&Tý„žºOM–^zÑ_Ç üØ=ʬ‚î-߯sÛÍÿÐó«§žrƒ÷Ü4qø§¶E¦Îûñ¤Áï¦+¼TëÖ£Ž<Ô*P?ìЗ_x4'͸«V¦R¹Î!@p!€L¥y@ÙG k×®ü?“„—^xÎ̉Ÿ©E¿þƒˆLQžJËÉbàÎmÞöWÌD žpü±Jâ:ÊÔ1OônêC£×îÿ݉åy3}䤙G¬ž²“fÜeê×;6f_³#Ç€ ¤Š25U¤Iˆ•ÀèÑ£MJõoçž5ul§Òi½ƒ†~Ÿ½_õÚK”¨;óôSÞ­WkVþç~œHĉÃÚÙZÊlêô1­ 5LehÙðÑ?q²í>IwÜv]Á˜nA×å&dÏrßX/œA€r25+•"A ‚°*U™áì÷Y™S Fhõà=7vè¯Eæsô‘µ»c°¶!ü¨(å2ut«‚ï¤&|Þú¹Ëþ~¦­@½âÒ¿ ï÷IB‚3„Û +grM¹B)& @ 4djhtD„ÒO@6þ=òÈ#òLö:ú Ásó¦ö ¦ŽéôÊó©½âê¶›®Ò³YWå2uTË‚ ’ƒ:½\õª*¶õ¬3OK×I3NòuÍâIìî›þˆ@€2ž25㫈 B®JJJL{ÿŠf{ðîªå;*E ßxò§Ÿ¢äŸì–Të±Ûûu}Ï¿C‘©E£Z䨟\Þíµû«_và¿´jÔ“NømOšqÒ¨k—Lùvßnš3 @ð$€LõD„ é6mÚtÑE™Ôš¼ª:et‡¹SzD Z×»õÆ+ÔJ`ùœPéØî®Ú·KcOŸûeêGùýßN"ŒíõÆ35np:i¦Þ«O†X‹›t”-ëÊXë›éùƒ d djÆT"Ø»wo­ZµLJõ˜£Žø¤Ù+s§t:µ~ã®jW‹ÃÿèÕcä¿ò¥“g‘©…£>šØÿíØÃ«ÏÜætÒÌóO=˜!ùE¯œ=³kûúuKT@€*dj…«r & Gªš¶ÿUyë—OÕ~îä¾=pWÕ*£ôª8·u[.SG6ŸØï­ÃûoÜÿ‡Ê•l_C•“fŠ&öNzF4„úæðåFÑ @É@¦&ÇÏ€@È«ª•+W6i¹£eZõ×K&cÜãƒçŸ¼»c«×m}ŠL6²Ù„~oÆ>nüè_ÿü󋲦¢]wõ%™sÒŒIDzÐ7 IB€r‚25'ª‘B@;vì¨ZµªuÖQf>'lW2©[ B¹LÑlBßzCÏ6Ï^zÁmgP/¼àœŒ:iƨQW-Ìß³ëKZ% @G™Ž± L'еkWÓY5"ödZõý·ŸJ•LýpBß7B‡þí_¸ã¦¿;4Ó¥]£KpSEÞDݶy)»%eúåAþ @™M™šÙõCî d`ÛiÕ?þáwZÕ3é³ä‚̦NÞ4¯Ïë!ÂÎ/>|§ãI3¼['j3\VÎäÈ™ –¨€ üL™JS€rœ€í´ªÌR^uÙyƒ>oNA×$B¹LöA^ïºAÃS_sÔ‘‡X'Q?ìP9ifÁ¬aádÒ±d•ï×;6æxK¢x€ ¤Š25U¤IH™V­V­šíÚûï¼®`D›Ù]â J¦Žï]×xã¹Û~{ìÏÞ³zÐAÖªyOž4£¤¯¬òݺqñ?|Ÿ¾ê%e@€r25×j”ò@Nòóó«T©b«xÀ·^9¼wÓÙù]â å2uèûã{½æ'4{ó¾ÓN9Î^Eß}sfž4£êßï£ÉA€ x Sãå‰7@ Ó ´k×®R%ûÓGo¸úï½:ÖŸß9z™:eh“q½^uíšÔ¸à¯§Ú T9ifìÐŽI/Ö çå‚ Û6/C fz['€ ¬%€LÍÚª#ã€@X{÷î­_¿þÁl«ϯòÇÖï¿X<±s”P.S‡¼7®ç+N¡{Ë]yñ™N'ÍôìÜ4œ€L:–¨,ñ Ûôˆ@€€/ÈT_˜0‚r€¼°Z£F '±zB¥cþõÈ­Ãz½_<±Sˆ°_¦6×óekÔñ¹Û«žà¿´jÔÓN=¹]Ë·“–šáü¯]2eçÖµÔÜ»( @  S3°RÈ :"VëÖ­k=aUkÈ3þpòëµÛ¿Yñ„ŽþƒÈÔɃíQdžw}áÁÛ/>ô×Yê±Çü¦á›Ï…‰Æ’éÓ/7,à˜™ÔµHR‚ @àßÿF¦Ò ü{ÇŽ-Z´pzgU©Ê+/=·þ«ŽéßlÖ„Žžaw¹Lm4¶ûK:<ÿ赿9Âþ¤™—_x4OšÙ¸ª˜3f¸6 @H djZ°“( ¡äÕ3Ï´eô¿ó«§|ß×¶nò¬¼NAdê¤ÁÆtIÂÛµo=ù„£¬3¨rÒÌ£VϨ“fät™M«Kdq/Û#eh%[€ ŠA™Z1ê™RBA”””ÔªUË}rUÉ΋/øó3Wÿ´yi£ÚÌÊk¯C¹LônÓ×ï:óÇÛî“tÇm׌é–èz]ÿÎ×-+ܶyéÞ=;‚@€ $E™šYüB9@`ðàÁ÷Þ{¯Ó6K&ýYùäJ×_õ·gjVk×ì¥Â)/»ð,[zÅ¥Þïÿ2!Ëõ˧ËK§»¶¯gâ4*E€ ädjŽU(Åâ' o®ÊbàjÕªùÔ«¶êT¾<ëÌÓÒuÒŒ¬æÝ°ræÖ‹E—2kÁ# @±@¦ÆŠg€@®(**’«T©â¤Em¿?é„ߦङU óE‹JiR9ÝTÂ7»·I`ŸÞ\o•”€ k©¹V£”H ™bíÝ»·œ¼ê.YåWÙC85Y"@€ ©¹Q”H3™em×®]íÚµ¯¼òJ5¡*g±Ö¯__ÔlšsFò€ @ Ûüçÿ¾gàÐéVIEND®B`‚dibbler-1.0.1/doc/logo-iip.png0000664000175000017500000010532012233256142013032 00000000000000‰PNG  IHDRpæU³¸ÔsRGB®ÎégAMA± üa cHRMz&€„ú€èu0ê`:˜pœºQ< pHYs!Õ!Õœ´Š9IDATx^íxTUÚÇ¿m®k]×-nHh¡¤B$¤÷Þ{ï½Ozo!ÐK舂‹ÒDEDd-XPײˆ«®m]”œïý_r³CLB’0 ožç<3™¹sï9¿{fîÿ¾íüäÿøoÔ¨LJº·ãÁMN?îóí7ß}ôÁ(âî»ï¾:^]ýÅ_ýêW{´çÍÛòÕW_}˜ŸŸß1êÊfL€ 0&À˜Àh'ÐÖÖvwlp°ÃÒyóÎÍ7®cú£Š›5ƒ3>w³µ-¯)*úãh?÷Ÿ 0&À˜`£Š@KKËìMM×訫ÿ·'Ñ6ƒÄœÜzzßX_ÿïù FÕ ¹³L€ 0&À˜­öîÝû #£#du벸A¬iRÓ¢¦MMG©á¼7³SÔÉ‚N_CãJQNŽÅhåÀýfL€ 0&À˜À¨ „¸ËÊÄä€,ÂdáÁ6ëÑqb6µ9ãÆ ¥†ÿõéu½NQ1‡Ïas44>.ÉÉуçN2&À˜`L`4ˆ Ì”ãÝ`Qƒu  "ÍÚj ©+5ü×çQÃvØŸ“EœéܹϞ9sæÁÑȃû̘`L€ 0•&°©­mªÞ”)_Àr+š.,n "mÑø b µ¥Ô„…R3ë|Ý„¶1êr°ÈÁj7süøŽ@7·4•”“ µ´.nÞ¼ù£‘ ÷™ 0&À˜`*IàäÉ“¿Ÿ3}ú»°˜ÁrËĬjfnl®ê…Çĉ“šWç£ ½n:aÅÀër›vÏL%+ܵ„ðpw•Üg&À˜`L€ ¨GÇÍ(ý1‡¬oHZ€õ 1op›†‘p‹¡æC–¸ÅÖ9XନAè™wf¢BÌ¡œܰ„ÊV¸ÅúúÿR¤¤üIåÏbL€ 0&À˜Àh$@¸U°œÁ}Šoæ$Êì;ãÞóIâÍ…âÝ ìq*'4¸“Às£†DlQë¬xÊI °ÀYÌ›÷QCEÅ#£‘÷™ 0&À˜`*G &8¸@—DÖÜÎä1ˆ4ľ!aÁ©S¼ÙÒël>'I¯‡RC<\¬pµ:Ñg`‘Cö«ž\šÄzÁ‚ ÇHåÏbL€ 0&À˜Àh$ànnî ¯¦öCOuß`Uƒ».UÿÎx¸¸©SE"µjp¯BÌy“àƒðë^îT3}ý=´"Ã/F#î3`L€ 0&ÀTŽÀÁmÛ&jh|Ò]ÀÙ¨©IËd™Rƒ0ƒå É I$Úr44Dá4 ‘O-ƒžÇÑëÁ$âMÔQ+&—F¯#V·,tX©Ën!¡®ÙÅšZWʳ³§ŒV>Üo&À˜`L€ ¨$œ„“yêÿÁñ1‡oÈ,µ¤ÿû†x7¸M H°A¼m˜1]¬ž1MT’˜Ë"QMάuHx@2jÅyš™µp_•<íÜ)&À˜`L`´ðµ¶^ «Ù¼ÎõL!à è,HŒ!þ .Rļ呀«%×Bmµrp™$àPäeGd œ™¦æ?Љ£ ÷Ÿ 0&À˜`*IàÙ#Gþ`g`pQ.‚GÄÀ!)+2 V¶tkE$âàF-£¦ ÿN™«Xà~}fÑä)ߦ‡‡û¨ä`¹SL€ 0&À˜+ ³-´uß•—Ç‚EÅ{‘ŠR!p£bE†Tl°º!nUÄ¿A๢‰·Åꯆ;9e’ëôgc… ƒ 0&À˜`*K ?6Vßq®áKd›#'2t« ‡lTXãà6 #Qñ†89+oVÓ¦ãêCâíç*;Hî`L€ 0&ÀÆÍ­­ ²²Zn:eê·Hd@-8¹À/V`ð¦’"HXð¥GXæHà- ÖáedôLyFÆNZk3‚ÇØ`L€ Œ ííí?ÛÜÒ¢dnÙà¬?ûÊNí ‘F«-\_R õÞHÔuXNžò]ˆ¹ùÁÒ„‡}ûöÝ3*ÇdL€ 0&À˜ÀX'€Zq/ž81+ÝßßÏrŠF²™ú¤ä›Ð½ë×›ŠË—ïëãçñ1&À˜`L€ 0&À˜`L€ 0&À˜`L€ 0&À˜`L€ 0&ÀTÀ»ï¾ûÇýÛ·ÏËÏÌ´R¤¤XoÙ°aÁ'ôšª÷›û§Þÿý_=säˆnSMÍ’”¸8Û¦åË—œ=}zZGGÇ/U£‡Ü &À˜`c„À[çÎýÞÏÍ-ÝÚÄämuõÏu&Mú=^Eë|þ¹•±ñóþ..™/¼ðÂ-æÞ|óÍ¿¦çæù8¸ùä9¸ûæ‡E'„=õÌ3óÆÈTÔ0(¹ã®œ´4;w›ÝzS¦|¬3qâ7Ôþ«¥®þ=©}5OSó}7›Õë››ïhVƒÌbL€ 0& L€Jd<æã“;KCãÛé>*úÓæhh|àéY¼»­í×w MÔsÛ°mÛ´ ˆ¸Ç–X;~oln+ºµ7ßÀ7³ Š=z÷Â…ÆúsEzºùbƒ 4w:ú3fŽÍvñâ#¥z …â§w +'`L€ 0[&AR­e6oÞ™îÝ$äfRÓìlxކו·¥‹ö™Š¢"í[ï"%57/ÄÒÁõß=·„Ü"Kûk~¡QÛöîÝûÖ-woýúõ÷úºº.ƒ•My^(Ïå9Ô}þèkh|îëÑÜÜü‹[î ï€ 0&À˜À@ .$dŽ‘žÞ%ù‹‹+.¶ÚÔt©a ÐYJM^T«SÌÉŸ[¨§÷vjLŒÁXe¡›–­\båøÍÍÄ›òû>!‘»6lØðÀXå²§µõ~W›­ÝçÍÌ•ÙX~¬³á9æ’.5Ìe!§KîU?gç\K«¬x\L€ 0&À†„@}UÕd“Y³ÞÀÅW¶¶éÐs\d±æç\jX¼ÝP©ájú=\ˆMôõ_«¯¯Ÿ<$S±Ô5¶hÚ¸x~4ñ†mM,ì:’³Écq)-Ä»¹ÛÛ¯œA®PyAøcnÌ¥†ycD K¡áùüÎy1‡¹+,þ´'N¼š¢b§ž»Ã˜`L@u´µµÝm»hÑcò…=jnò…׸sÍÏÅôˆ†õ?M:/Æò…kå ±í’%;ÆZì •Ÿ„Ç®¨x“··sõ¹¼k×®‡UçìMObCBü´ÔԾƒe Ö6Ì ÌSjæã'‹Î†çfób"V:X|e7kêÔ/6´¶Nšò^˜`L€ Œ1ñ‘‘Î"Ç…VXÝ`q[ _|éb‹ ®%­ï‰u>Ѭ°Ö'½¶”¬*{°¦`’ûu„ïS££Ç®š•+ÿèäé÷áÍYÛÄ"j=m—WXæ7–˜Ð À# tu_“o Þ ¨A˜-¡†ybGóÅIM]¸t6<·ÇÚ±ôÄæÏ¼N§l‰£‹=c‰… 0&À˜À@œ‘ÍâÅg ¸`y“Å.¨´@;d—fw  ®“:]€;›3=:ÒkvÔ° ,-ˆuê”nebrœŽq×tVv¢(*3èK¼-¶rNžþÂ7$Rx„ {7oAª79ÿð˜6Êu!* JÙm Ë-Ä›ÍÌgš#žê…ï¤É" ³ùÑ£×ÄI4Ÿ&JÛÀ‹¹§,Þ°O*5òuSuõ˜§²“À;bL€ 0;‹Àátp¡„ë .,XÞ ÞLéâ +›=]|]é"ë1q¢ðž4IøPóí|„˜3¡í üz+ËÞÆ¶6í±Bµ¹µÍEŠgSj² ³pp‘ñ)"3¯Xd”ŠôÜB˜& ¹¥¶Î]".:)íÈXá½”øò´ì:…ƒ%–7Xj!Ð|H¨“`‹˜2EDw¶Hz ¤×lh~Í7®ÏR5žŽŽËÇ /`L€ 0!!àda‘ «b×`9Û_ˆ7XÝÜI¸A´Nž,B¨…Ñ…7ˆ-ÔÔ„.]x»[Üz*?âéà<$U´¬Ýàmnç"¬<¤fåè.ð¿«·HÎÌu bEëZ±ªmƒ¨o^-Š*jE|j–p÷ ‹-í%vP†2$]ñõUŸ3cÆ—²ûqo°¦Ám -Ä[ 5·d ‘N-mêTáGsÊpüøYÜzº˜«©y®ãâE^±aHÎï„ 0&ÀÆ/GÇp[Áú†¬Rœãâ‹ø$ˆ7XÛ Ü`1‰¥æOccz_.'‚x'ļõTNv«¹ZZn°hÍ«z…wø‡E‹€ðGÏ€0—’)‰·u›¶‰ÇŸxR>rTìÙ÷¸h&!WPV%Âc“$±çÑ2VxPÝ@KåØ7$# &nQw²¾ÁÊñ–J¢-ŸÄ[6=Â¥:‡Ä?æ\ŠàÞn f̸üô“ON+ÌxL€ 0&Àn™€‹•Õ°ÙÖ7¸Nå¸%¸LƒI¼áœ@^:Ä6ÁJ‡GåRÈ@•“”­(¸(û88œ¼åŽªÈ6oÞó§ì‚’ÒsDbF®ˆJHT¤Wr›ÂòñvîÜyñúëoˆÓϽ ¶ïÚ+ªëWˆ„´láèá+¹^3 ŠBUd8·ÜâÜÜÙ} 1÷)æ\ïˆq |}îä’xK2Y,0á†ùƒ¹„$¿ Ö`÷8ì{Îôé_U;åÎò˜`L€ Œ– ¾÷)ê¹!ö Y¥Èô ëI€’å î0”AéXè=(g¡âuˆ9¸Ïº×ó‚€s³°øûXáEeD~Ú°j͚ŠQP^-œ¼®',ä–Š²¶Áòñöî¥K$ä^–¬puM«D‰=gÚÖÖÕë‹ýû÷?2Vxd%&&+Ç¿!™É p¿Ã}N.™\8Ý ˜’Ëîy)£¹³á9^“²P©u/%‚}ëMžü_Z“×x¬0ãq0&À˜¸eîVVÏà ŠäÉ}Jâ bÍ‹¬mp†SC<¬*Öˆk’ÓÕ…5Wj(‹„.Â('»Ã`Qñ¶µ=sËU¡š_ò8” ‰NJ—¼·éžÇˆ-$ÞÈëÅÊ!nîPCCÃ}Cޙ۸ÅÂV9V4”ŸAy”ÁÍbâ0¯ ü!êä„Ì!XyájÅœÃ6˜ƒ¸™P.I3wæÌ+œz‡É‡fL€ 0& Zì-ÊìIÀÁgFñJ¸ ÂÂñ@b ¥ âÉ%†¸&Í´LzŽÐΛXzñXád+.eJ¯u_,î0`L€ 0á$@k•þÜÞÈèe\0a-.S”y€ƒ[ Ö7XÙp¡E6aåôibµjrR:‰8XápÆÅI°ÂÙΟk­çn÷¾;::~EÖ8Ý“Ï>¹mמòÆUkšÖ®ß¬(.«2=vìØïnwÿ†ûøAžž ²U*M BNNho ô!ØJ§Mu4wÐJèy½K.,tÒÍÍ?ÄÂÁª­®þŸœÔTÓáïŸ 0&À˜À¨#çï(/´˜.žXÈ`$5À}ŠU`=P+"ÁÖ@Þ3¦‹fz,ï¼Ã:7ܨ²Å€²Gîð€Ô••=j¨©yI^Ñns9XpqC€Ø·@gq4òhþÔÒ¼YKó§npS€ƒpÑÃÕ «/ÄŸ6ícé‚OÃ]= ñÆL€ 0&Àîûöí»Çi¡ñßàFE=7¸>!à`‘ÃrH¨ÿW]€aq[NÝÕtñm¢GXSP]±qÞ´ÜepØ—«É¢§÷´¶Þ'0¼ÓÇá窩¦ö=báÐd1†LSˆ³ØN÷;D[ ÍŸUÔªéyN§ÞŸ¶µŸÁüÑQWÿnYYÙ˜u¿ßés†ÇϘ`C@ ¥®NÓL[çyUTÉG,bâ\预 0‰4Ä/A´UR+£¦ ÿ×çAjXì¤r$šÚ4kA×x£€€¸ténÛ%K¶Î7®CZ„^©¨/JÏø’¸‡›1“…tPAs 7X¥!²3‘Á7$àt'Lø!644} »È˜`LàöÈŠ‰17ÓÒúñÑàÆB<J„Àº7j<]„aq˦†Ø¥D\|é5$9Èî/+M­+ÒÓÍoïhøè#Màè¾}¿µ[²ä°œÐ€8HÙ ïNâq”ˆƒƒ`ÃZ 2Q±¾.ÍÔ…3§ä™ÙdÉó°³[¦P(Øu:Ò'‘ǘ`£“@eVÖ"KÝ×Ô '6À '׆Cí.XRpÑÅ#D\_®”è`NÛÙéÎzmYNŽIo£§x¦_lÙ²k²»𢔬\7WŸ€%¥Õ˵.^¼øÀè$6¶{ýÒK/ýÙ/8ÜÀÑÓg‰G`èÜu[¶h|øá‡÷ô6êÇ?lojºU[Mí¸QaÅ•Vf ¹$Ô„»˳¡á9ÄVþÀÍ‚ÁäÉ_zz*–-[Æ‹×í©Å£cL€ 0¡&P«(dm½ÊLcÚ·ˆƒCm7ÄÂ!> ÅY‘-Ñ&ñEæ©õ´i߆X[7•¥¦þ¥§þpûYAy•--üþ-'uÙÄÂîv§Ç+'/=ýΤeç%ì?~ü¡¡ÏHícüúòåG¾¹råO”™:ªHYõ2ƒ€°èõöî>—Ìlœ®â\™Ú8}oçêõ)«çh-ØÈ+W®ôßH™Íwûø„éè¼¥CÙ̆Ô×K.Š>ûtÎÌ!$Èàa΄ ×Ì O¥ÇĘqÒÂHÍX>`L€ Œ9¸ˆV¥§ëYZ5x.0zkɵXR¬°¤]pQïÍ\}â5_cã‹aÖÖUUii:(IÒˆ×^{íþàÈø5¦ÖŽßBôÖYÚÿàæôì¦M;FUÕý—{ìÏ•®ö™†zgµ4>LÒÖø(nƤ·jÜÚ6¤Ä/M“ãÔ©S¿ŠNNÏ7·wùì&çêšW@è‰òÚÚ)½öŸ”——ÿ)ØÓ3ÊÊØø™ÙS¦|‡²2†”™lD ³HØ-Ñ›õ/Zw_NZšCsYÙƒ£‰÷• 0&À˜€ÊoW(îk[¾|êöU«ì–6ùïlk³ZWU5y}eå½}­íIïÝå¾–¶¾ò{Nžþï=uòä8•…¢Ô±MiI6©³µþ=u|Gô”qä¼±ÅÏœüM¥‹írˆXUå½+.5{9«ú{®Ü}Þ*©ªŸÜר8ðKErò#›×¯_´¬¼Ü§0++¤µ©É…ê¤GD}šcUùärߘ`L€ ô—À†mÛ¦˜;¸~Ú_kŽòv‹È ”•Wè×ßcôv{«K&’åí=´Øij"~ÆD‘ 9I$jM–žÇÍP—Ķ¡Çkõ^ñ}Y+Gz ÊÇÛ°aÃön>ÿÔ¹²´¿–”žz;ûÏÇfL€ 0&À†ˆ@lJFæÍ¬oô¾Xbí([9ü(6ÎÝ?Uø6DÝÒÝÔ¸;UHâmºš$Ö’t§Š”YÓDªþt©á9^ípØ6ËPÿí}UU¿ÒŽ Ñβ Šû#Þp¾zÚÎÅ'ð$ÖE¢îðn˜`L€ 0ÛEÀÓ/ôɾDÊ ŸàH'¼ij‡ D†.`áàúÏ—^zmüíêoǽtéÒ¯3æé‹6AiÉz"mö ‘1O[dÎ×és5E¢ÎGâ.FãnT¸TwU”˜©ÚxП˜ÄM}«%$°<|…«O  ÌT±ÔÎÄ]çÊÊÙãËøt…š*ŽûĘ`L€ ô“YÎî¦ò¯ô& 2óŠDayµÈ/­i9",&Q8¸û rŸJÂÀÒÁíë¶¶ *·”Ò‰-kÕ3Ìþ8n¦ºdyK›3Cd.й‹æH)dK& ÞKОL.ÖënT´Õ ‘IýD8¢›EƧœêí\Ù8{ŠÈøT‘’¥Z\J¦ð‹¶.ž7ˆ¸ŒüâQ•q;¢€ù`L€ 0&ÀFp¿¦ ÿKm…¹‹Ô¨Œˆä*õ ¥ÕËDsÛ±~ó6±fýfQ׸Jd”Šèaéè& 8 ·oêšç«Úx·dOÏ0Ôû"Ak’ä*Í4Ô ˆ7²¾¥Ì”³èI¹T²Ì%’ˆ‹™vÝ×àï­jãA‚"b_£:o]çŠÄ·XLÖP'O?‘ž[ ÊkëÅò•­RÃó ßÁd9µvrï²Â•Ô,SIë¢*òæ>1&À˜PI¨#çñ"\£>ÁRóð!wi¬(®¬k6lO<,ŽŸ8%žúÛ3bËö]¢¦a¥HÎT7ß É²cåäþé³Ï>«¡j|v÷îñÙÆsþ7)\§YduƒÛ4mÎL‘cï¨BñóÑvÆ©P±ÆÑ£Çйò§ó—”‘+2…ÔŠDtbú5ŠyûgvQi°BÅ­Š£=÷— 0&À˜€Ê€UíÕ7ßœ{ø©£Å;÷=¾sùÊ–gkêWüâ§k–­°CÌÜÍ:}fß¾{H(My|y­ýþåµ»+Kwffþq´Xìn6¾¡|ÂrSéC›)³ö/«q%^Ž2StÏ´·?ØŸã¼ñÆFÏ;U·mç¾Ãå5õ¯–TÖ¾\Q×Ð^\Qráý÷ÓŸ}ð6L€ 0&À˜ÀLŽk“â,²ç‹Ÿ9ùª¼²3 g].±6kÝ[R2ñFtÃÐÏn°ÖÇ-%ËhÎë1®É¼b¦NèÈ]dx¾ÆÝ!ápss¿„3eL€ 0&À˜À€ Kïî*W{ ·ÿHB„Öélx.‹“Œ¹ºï¬ËL\:àŒ±X½ìw¥væO£ŽÞxÅNSû„ÜV-ûË>‡ 0&À˜PužŽI±jW!Ö¨l‡ˆ›¡.âgN”žã5YÈ¥hÿcW‘b¶*ôûvô¡ãý÷Ulµä€,r{⃵Y!|©å›.|¼]¡¸ïvô•ɘ`L€ ŒQë3’f¤Ìšq™Ü€$Ö&Òº¢SD22=©džã5¼Må<`qÊ[²à‰3g묆 #qŠš‚|#b5&|‘ÛW’ÎT‘ 5Y¾’ÈÓ˜ÐQïë7}ãc0&À˜`wz?Ïbˆ7IŒP±ÜT*Ñ‘Ns3æiI ëBÀ¥*»Rã5'ýwuläü‘F„b¸íí.w-[fþËÛQí}²¾eê•xÑÚ«(iÒþ‡xSæ¥X<ÿâ¶êj.2҆ǘ`L`,øøãïÍZ0ûTÜtu‘Ô)Þ°Þ(ŠäbÑÌù:’…‰›´œ•rbCsDHîH1pÛÞ–±¸6ßî±’T“Ï  ¿^^èøRs•oÜ¡C•÷ŽT?žXY¯›¢?óßñd”ÄÛì飓ٴB­É ±K¬º 8p{~çÖ#ÕO>`L€ 0&0† œ=vàwùKÞ„@Ã*°¸å’É_j(­rJ‚$Í`¦T4BOqéÚm#…¦µ6017fÖ³"fŠìZ‰žg…kvTçÚ:v`ÙïF¢/9‹ MãgNú…SfM£ì\m¡ á–g:÷ºµ¬æPáY"a椬pÇ6n´‰>ò1˜`L€ 01N€Öý}ÁÒ…oÃEšBÖ$ˆ6Å‘Þé>ź£ù$NrLô%q«l‰+03Z1xölTåFÏú.7RKÆéˆâ]©Ä’å+BN³£±ÄmÕHÔ©KÕ×\7sâ5X%!Ô°+¬oà•½POb%Y.IØAÄIqpÈê¥vbû³‘àÅÇ`L€ 0&ÀÆ8Äte-Ð?–¨=Y²²Á˞Çã«Ý-E©­ ”Y´tÕ´.QÒ–—2x–9ïÍÒ%$Ú*SõEmº¨I›#ŠâuDväL‘>SäÇÏýôÀ¶ÊiÃÝŸ=˪tÒ ´¾€5îÒŒyÚÒ²^™ tD‘•‘ĪÂÙŒ,r’à•cc¦©];±e­úp÷÷Ϙ`L€ Ü!–ùyJ8"xD ÄGÞ’¹¢ÚÍB¬u—D ¬tñÒ¢òÓ¾^ 5܈Ȫö E´îGEñº¢:m¶hÈ™OÍH”'ë“€#ka´¶$à2É•ÚPæî<ìýùðÃ{rŒç¾ œÄ ®g²´ÁúVj·H4…¸‰:o[Qhn(¹T!Œ‘ÌP`nüâeË~9Üýãý3&À˜`w-ŠôÉéót>N$ñ†²ÈFEp>JlŒE…£©(&ëÜ«Édƒ[°ÄÖ|GÇÅ‹Ã.HHÀ=˜­s¥4QO,Ëœ+êI¼ÁWŸm(–gÏ)³HÄiI"nE•¯ÇHœ²¶¸È*ò=â©X¯”Ì—i¡ù|QN¬ÊìInÔë8$¨u4úŽDßøL€ 0&À˜ÀD`uBD@’ŽÆ7ˆÕB}3ĺA€ Æ+—âߤ„r«&E)c®Î[;ÒÓÕF O]®ÅKeI³DUêl²¼ÍMŠ…b]¥“h+·“„œd‰‹ÕÿvU™ŸÁHô VÁbÓ­1´ ÃÔqR†®äF¯-±‚5.}®¦$ìH _«p´ÜB%OnºíHôÁ˜`L€ Œ1+#ƒbSfÏø.¿8ZyA*PK7ˆ<Òÿ¹ÆsÏï)-ÐÉ¡o¨ˆ)JÐ퀥 nEž±ØTë!ÖU9K.Õbp‹ŸéèxÄê¬]¹råþ³íäB½JE}¯»RQø¸“ÄÅÉ]­t¶Ùt@¡x`$yñ±˜`L€ 0;ŒÀÖüýr‹mÙFsþ‘Ü»µØp¤ûuáÂ…»Ú’£ýK eÎú,Q{ê5ÄRRȹ‹ N®Ž úð]­b¤Ï 0&À˜ÀO€ÓONîØ1®ÜÉbVޱÁÂ/Ý‹gÏŽHµÞàŸ9³é·M%Îu ?E6jYâ*SçüÐP`}ì©ÝËæÝΓ†LÞ]e…æ çç/™¿psvêt¬—z;ûÄÇfL€ 0&À˜@¿ ø»ë7Žk={t‹ñG—^Ñè÷û±!VcØ¿I¡vpW¹õS{k=¶6Çê_¸ptȉÿøÜ¹{Ûê#ÂëòígEh½V™e~ª¾Ø9÷Â…çéG÷x&À˜`L€ Œ.°ÚmmM±/K_òJN´î7¹ÑzßåDé~]kuú±-¥Æª>!¾x¨<Ãì™Ì­kÈhÍ’J“\o¥©&ïìÛZ¢¯êcàþ1&À˜`L ß ÞZ«#s¢õ¾ÇW9Qš…wñˆ¸5ZEáëö¶ wl×ïŽà†Ô¯ŸÖåÙí¡¤~c…¬ø€Gü1Wœbüö©#Ûþ<‚ÝâC1&À˜`L`ø<bÛ”‚„¹_Bì É%?-ZšDKKÅjK"® aÞû‡¶UN¾^ ~χö.7̉Ôù./F›úÔQÃ䕲#´žîð!˜`L€ 0&0üš+½+¤…åkÒçˆåY†Òê+ói]P„Ül‘O®I8²Ô5 o~„Æ"çÈ‚8ÝÔ”ƒð„ˆ[Sf#V—ZÓXæ‘%NGê?e¤¶|ïü &À˜`L€ ¨ ¦w\-0_™¢OâÍDl^æ--w%/u…8¸ Íq*¹èëçM(Mžûy1¹|ËÈŠ•6×y‰ 5n’;®àœ(ï7®ŒvSAüÜ%&À˜`L€ œÀ+ÏükyšÑgÒRW$€°BÂÚJGÉ‚µd)ŽX'ø@7%péÒ¥»W7­Vs±tÑNŠK3ÎJW˜Q[¢HSüðÃ{ü<ž²5³ÿÎÞÒ高°Øeýþ0oxË ó ݬœÿemf÷_w¯·›j›¦ÜòNUuüñ½®¶¶õÚ'þH¸Í !7³³á9š²°Óœ0áªí’%»W-[öUßXìWa^qÈRËðƒídãúYjBzFëÊV“ÔøÔéqqþa“JKKºcg7|Ô]Ü£”EznZ^Úð­÷=³€»Ô{?& 8Õ:ï]|OÝv©ƒ$¨ÑlÌìÏs-Б;GÎ6®ÕÊ¿“Vop¹£à‘ž;|øak“'fŒ×a& 6-z®MMçÑqBW©á¼§©$æðYr³ž¯*)™|+]Ç*dYúoe?cý³(ìbëþ˜ ò {£´ ÂwøŽÆ{îN`Ú º¡g¼\}?NˆJÚÝTÚt[ŒÃzflØð‰·=²E –6ˆ6=i³ÇÔæR›§Ôðÿj³hˆ9e!G1r/W(Z¨}ýúC÷¶¬YoêZ$,6éY¿Ð¨=î~!edQ:uêÔ¯†Â(Ü9bý<ÎBÀ‘;íËÆå+­¶¬ß2O¹mZ·inCCC×¹@Ðy‘¢$¶º²ÎDò--F¿nݺÉ¥U1+Z㇠ñØÚÔ:}HIHß#ÇGå•ätïþ_³rÍLe÷îºÖus³R©Û6m»¥%» þW5­YZVT»wïÞ>cĈã/KJêNŠL×¶ªM{Ó¦msׯ^?gÓ¦M=~Ù=úóÝm»íîô‡e•˦mZ»ivOcÃk[7l5À>c‚cþ²©iÓCøìHO5°8qâÄýááá¿G‰ñ¬Þú‹÷Ê Ê§ÑØ8ð@O7Qˆ#©)mRÃ>c“×Ë7•¥Õå=íwõŠÕZ´¯_v7öƒ~%…'ý¾¼¼vÊÚ–µz`ßÓ>ð:ÞW¤+&Òû-ÎY8Ò1~ÑRÝò›ØØ´G[[47ÐùÀ9)..þ]OŸÇMέŸ‹ß#+ëWÎìíÜâ{µ†.%Š’‰¿;wîܽýé¼ ’zêiΥťô«·s‚>ÔÕ5Í ŠýÍŸ“Ç–-[ö¶kiYãédíúÎIoÈ{=íãohhÐïs_c£ïï=8'tnÔ0×±ÿ¾ÆR[V«NçüÜ¡s÷ö'&©ó†þÁøø?bþÒEY¿×9²v“ž¼Ì­pNäq¬jXÕã80é7Kߌ¡·ïÈ@æ‚ò¶r’¢“&Ðï¨NoóbóúÍs0Ÿñ»‚ùyÞßcÊß;ô¿ª¸jêZbv³ï…h¨ð{÷|'ðÝHOW[IÌz;Îåºu›ge§dOÂö§N½ß¯k=,™ø®z9xýQún·m0À1š››ë&ÚÅÏÚÛ?B󬮲nÆÍæØá·ëèÑ Jè„–‘çÎñ¦u?þÍÃïKkë:ú}™œ“ñ»^ç2&¸³s.¹@¯AÀÁªK„Ûj ©S[ÔÙL:ÿ7¢GC%!Ñ'»V)Áas.V8 ÅUu‹½ÂN™XØu›ÛŠî ¯{†=]¿²un¾ðÝ'ò™Ãí®‰^°.-)i™¯Gù†´¤”õé æÇV¯þÝ`ö×ß/ÊpoG_ö_x¿Ò[ì›üzxPÔiY¬%F'—u&üP[Y;g°}ìèèø¥·‹ß!ìËÖÜþÛäÈdé‚ÐÒ´VÏf©ýnÖ'ù}óEVß§$¦{à³Ø§£•óëxÏÙÖíÍ[97§OŸžFý.d ôdOã„@ËJÍ ñqó{ÒÓÅ÷2ñ•ûè¼Aùs‡è‚S”Säàãæßîïô6â*ú;NŠQüÁÏ=à=?ÀmåÅÕ&CáF©ªªúmrt²aQQÑ{#?«©¨1 ô jð ~ÅÁÒù›þö×ÞÂñÛïàר¿kË‹Ë(_ ^~ùå)vŽÛþ4pMM̈û‘T’_©ìÞèü2¹þ¿êÏ~äm<œ¼>õóð?œ›žÐÞÐ~_Oc§€å{Šeξû?º'ö„ø‡Ÿ€ð?»~ýú{‹ Êœ½\|wx¾cej{µ¿}rµóø‚Æñ|X`Dicm£F_ó¶±±ñ¯Éñ©©Ô¯£t¬͹¾Ž‰sâït.*8¦tÕòõ”xþ$&2~Cû‹í¨Ï¯DÜôĸ†ª$ŤäùyžÄ9éþýé«?ŽÖ®_ÑÜzž¬"¹­õ­êeþþ¢´°ÒÈÏ=pÍÅ×iÎõûwÅÑÚåkš÷ç¼CVÔVÔâºÑë†MMM¿ÏLÉNñvó{ÚÓÉûJÇ1z‡\ ·Õ%ft½ë1AŽ}W|TŠ.ÂZzêæKs]ó£ôÛœ.õÁ¹ÿ}èü]ù€’×/Ì-éí¦|q=®*[6/Ø/¬‰æëyô¿¿sf©±EÎ1~+ sKüö5ïëúî(Ÿ;Œ¯ºº~fdPt%]›^p£ïFÑ9/¿ yq,9>-¦¶¶ö×=Í \Ë* +̽]ý6Ñwõ’ÕÛâ¿}ÝýߤsÚuó]”Yôç˜ðƒúúú‡{Ún+JjÌ|\|7Ò<»h·Ôá»þö¿]þ^ÁçȺÚPZPªÓ×<«)ªùc:…8ùºùÈ÷ÅÅÖíß8_^!«* +]< tóªÈȘ1{úôAxA¼Á¢‹Û|jjKÆOK©YLP–JÍœ^3¥Q!±§OŸ•Eœ6%7¤ÇÆZö%0¡R2ó#—Úº|Ñ“pëþš•³Ç§ ÙÞýýáä†m ·Í]<ÿÙØéêßGO'ä3MíZÖBƒWƒ}ÂÏÐý`…Ìíü\œrª§“O‹<9ÛZÛ¬Ûÿ+W®Üïíêÿ‚¼¯Z² `_¸;µ1³ûº¿_úºš•ì‰Ï~þùç¿¶Zb#eÐÑè'tž±µÿÁyo" ú¼Ô}œ›7ïýC°oèѾ~¬é"»Eþ ‚߆F>f±ÈJŠ7¼•Fýú69.5~°ìåÏÑÅsúáéäõ·òþ‚“”A"¶ß碷1Ñäâ£+äR0Ï?ÿüƒÿê/é×’bS"Ñ?üøR‰›<Û¥öý¾xôve?Û¼<7Œ½¹ýÁPÿÈu–‹mzMì¡Ï–­f·üMOÈ6\ û;¦Þ¶s²r¹œž”åÓ“ˆCI ¤¾x«ÇÀç=œ¼_'a¢qã÷0.*±ËÚŸý»Ú{üýVn"²SΔõ.}Woµ‘=·¢vÅxåsˆ¹–T‰¹w«û§ïÀWɱÉéøNtÿÎ57¯Ñ÷pôºp«Ç ~þ—\u?ÿ#«}thœ‹Åbë«¶æ_¥%ewïCUYÕ|:oÞjð[æí梥¥åG‡vEû]ô;[Lß»[þ=À÷.Ô?¼ 7IÊcÁõ\‘™M7ýþmèmÌ‹»ÿ¡Í-›ÿ |Œ¶¶¶»é·¨ÊÚ´÷yA¿÷ïTWWÿŸƒÅ:Ô/âöµ³{9+Œ!.2i9Ÿ~ߌ÷Ögú]ÿ7… %õô½jn^=ŸDö·zŽ)ií»ðÀÈÖÇ?(}ñÍÌVÂò(Ä\£d‹©A¤Y“h³£æ ¦.œ:›#=ÚÓk6Ô ì`›Ý§œÜ`elülo)üÀ¥ç¹,±qúº?âMÞÆÒÁí_¥5KnvñÃþ×ÄFÄÅÏœôµ$Ú¦Ž—ZLç£,äâ¦O¼ZfoÙrjÛ¶~™mqÜ·ß>ÿ‡j…•eFètÇ‚Äy¶çNïíº¾Y¿†ò}eçîèõ¯„Ød§¨°XS彄̵]?ŽÃ-àð%Ž Ñ‰ Š5 {\c&–×èN»¸{ßð?Ya d“ùH 8å ž¹ãg”É»º²¤&\‘¡°G¿B#—+Ê»,Ñaq›ä/Ÿ£µó'd ÙXYR™ŸSäoÖÓØä×È5`‹Zx¾Ošw&œØ[8]Ùµe—ƭ̇@¯àWÑ'úÁü˜²Ýn¨õ×ÜÔ¼¼o½Äî;/Ÿ¥å ÙÅÎ1½÷ïåg9‘Õ-ÎËÍ7>‹}û¯"»@Úø‹ ñ…Dn•¹d¤d/ë‰Cd@äüC‡I.F7~$¬$ëýàýÇÝÙûPYaErYA™{\t’E_SbS,+K*ýpñ kŒt!ÂÅ„î|å~á{Os-æœdM¥‹÷·^;«ËꢻÆNs“ö5 Û¢Q až,ä,>%ë꺊²ê:oÒ\è­%Ä$›“ÕÎ=?«0ÛÓÙç¤ÌÁÉÚ埕ŕӔÏíŠÚ¶ñ¯zIÞ†DÃ+ɱéOZR¦M_ÇÁ9)P»f¤äPPö[ò>ȪºOv%¯&o‚ŸWqVjnYŸþmü=ÿÑÓ~ñ›@.±AÿfUÕj;Z:ÿ³³$À^HOÊ,.£±¤Ä¦[ßl,%…åɱ©Äé}y,1¡±ë”Eo^VžæÜõyb÷²¶ì¬(®ŠÁܼÙü-¢ë Õ%L¢øÐCòw+êW˜*Ÿ“ .üÆÝÑûÅ®ófëöeì×TW¥Ów¶×ó™`^^XåEó6ÕÇÕÿ]T»DfBtbs÷ï4Y„2º.ÜF7ÄÀáüy9ûJvÌAg[÷s)ñi%å…å>˜ï}±Ä¼¡ß €Èà˜F²} ƒ~›vÁÊ­ÜŒ¤¬ ù…x~KV¾ƒô{‚ï]§Ïï]B:¾wA~¡ëè·Rº)FÕƒ"Eé c©®¨6'Ëõ·xV1ʆ~:?§8›âþ¼o6r[`ÌáAÑËé;( @ð y’£<Ž‚ìoùÆŒŽq•ÄÚ•¥• Åôýˆ [ŠqÄ„%M“<ÛVoû¿G t£A7i¯¼ôÒK¿VÞ!F¼±‘we…EÑoc_¿ë8õŵ(¯4ÅÃÑû¤›EŒuóºù7ÛýG¡yv^>?ÎvîobþW–UôõÝÇïKiq…7ͳtúŽ–ç2ö“—Zõˆ™§©ùbÞô¨Éâ V7XÛ ÜœI¬¹«O^' ïΆçôÄÝÜqדz*52s„﷮YÓc1ÉÍ{÷þÁÑÓ÷Ò@Ä›¼­³wÀ‹Õ£9T·>-Þ&nÆÄÿB´ÅNSq3ÔEü̉"As’ô7]]ÄhL,r°ÆÕxßìb e½~eB@A’áÛY‘Úßg„ÏZ×òç}´²Ò¿àܹë©‘úSpdÆÿèfLЯápÊchÃH ¸ÿûß[™Ú}Ù)"þ]RPnÙÓݹ<–7ÞxC¾ Òö¶æŽ——W¯˜Ý_+°2Ä>„úGHV3énÙÙ÷–šÉEôZoŽÌúMòFbLraO1h7›§ˆMLOÎΑ÷CÉÝ?3,Tô!Ø'ôDçà‡Œä¬°þƲ)犄s´Ü/G+×ÍòûŠ$lÏuŠ»k© !}•ÐۋΉ´=%¹ÈmäxΛñQ~ÿÄž÷“Åà€Ü§ŠâŠ(å÷ó2òä÷BüÂ÷‹cðnvÌËVL#Ë×eì‹Ü}Ÿ‘[Fù3#‘Ä–^Þ%¼Âã×8pzÀu@!Ö*ò+æ:X8†}QÿeeîžAÛåcäå$t$7ã„÷qn¢käýz‡®Tþ\blе|3A.­7¨žâ€E-æ/‰Í0ºpK"Ž.²_òÉ'7œ™½ ¸çN<7W~¬ª/>±ó‰Ã!ú/Xnß¼]ÓÆôºÇÄÜÇ/œxA]þ nªCü#ÎtöïjnF^È`¾w¸þåfÄu E¯ò1𹓻ÎÝå6n½¶j¹½|CE–É£²'†Aßí'ºæãfãèp’¸…»[YÀI,+çýòþèF0x0Vé3ûÎÜ¿ªë<:xU)Ÿ¯Ô¤ W9„ƒÄú+ÛÖnûsæ¯ò6—Ž^º;3]+‹8”¤ù¿ºÒR'/¸=aAC¼,oo°°¹’HƒhóŸ4IOž,B;œé„ ×ãßès°Ü)Ç¿)‹9Ë ²{êlÅ F¼á3ˆ‰+¬¬ñë jïd.Ðâ Â-Ak²HÒ*’õ4DʬiÒc¢ÎOb.Fƒ,s$â öÎ9pÃ]s÷ý¯­ÍŽÖûOVÄL‘¥)ÑZ";RSHB.\óÚª*¿Fº«»¥Ä€œXp½ÓêË…zþükzô…’îîé üüÍÄŠË?ôq‘ ûrŽºoKV˜®ò ‘I)·²¯¾e¨î•…¢½µóÂÁçÜ çæÈ?L&ÖǺ³ˆ€kP4Üçíâ{ûórõ{ï±ÇŽ ø‡L‚ÿå~‘5ó ~Üñ^izéCîöžRÜ ‰‚w÷ïßßg°~eeå½tó#Y“ÈÊóî‘#ƒïS|db×…º0§¸D™9Yi¤šˆh µ RÌç`þp1CœöC1˜W==Ç´€#÷yWæûá'fø ż>àhåò²¹Þ'ßK”í5è‹[ZBfšÜ§ü¬â2ù¸½Ž›»ܲv«ò¶Hôñtñ9" 8*â|;œéBó'å±;öì ¡ˆË}N/ÉûêMÀ!if°¼ü=‚,»\xüãÊû¡$˜¬.1bd~Ku½œ}ž‘„(…HlÝºã†Øï¾Üú¶õ.r²¨ðù`ljÏQŒ—RA…k¿j¬kìò|™››ÿR>…Ú¼ñÖ[oý~°Ç¡Õ_Ô{pGÛŽÞ!¹÷)Öë_ ?ŽÃëï1Q·”¬‘’e–nªÎÊEë)nù]¼ëskkë 7/=í¿/Gߥ{IÀ='‡’ýݧP Wy?”„±µ›€ë*vžß_=mGß½®Pÿs¶°Ø#Yß:EÜ¢.°¼uŠ7ˆ¶Ä©SEYߤØ7¥X8<Çösˆƒƒ "N9n¡®îÅî¡;‚Ÿ[:ºÛ›€3#Áæ-âR2ELRºŠˆî¾b±¥}—ˆ£¬ÔwèîºÇ2ÕîNup›&’å â Â-{á,‘»xŽÈœ¯#’ÈúWªäFUq…‹ì.÷½}mVX&YÞŠâuDMÚѤ0M¹ EyÒ,²Äi Xå â*²-ÖÆ3˜“Ênä\R\êcO<ñÄÛB¼ÃRYÀ‘ÎÅ÷Ò‘G4Ë1;-[k´ ¸úêÆ€ÁŽ›Üa㩦ÕqUpû÷WS²ÂÁ• !'‹8Jxø¸7IP£°®‚õ­”,n 9óEs™Xže(ê2 ȧ/òcHÄ‘€«/v=>˜x p#—…z+8ºR,Øûƒmdú—î,ït ,šôãüá`9’+ö£Ñ*àè"ze°ã&‹ñ?(ÖIJ,Q %o\ìXÈÕôå’ë -h,à†_ÀÝú÷ίë{×›€ƒÕßÏÁÎ ²Î ÇŒ±€ëCÀyØØ€ÅLvŸ"ö V6ˆ´pÑ$à|&N’^ó$¡D¯ÃŠ×Ñð<ˆ¶CLœC§%¬ˆ‰“]©º&|Ø=nÁêcn¾AÂÝ/Xztòô®>"» D4¬Z#6oÛ)vìÞ'6mÛ!šW‹Ü¢2 ( U²Ây„þ£· ý†¯-HTH†õ\¦¹‹æˆt²Â¥Pìš ‰-sydÃ{q°ÄÁ•še4çÍÞ„TS©g‘,àjÓ H¼Í-ÅæbM™hÌ] ¹Rñ~m¾ýム„d7:ÜÿÜ·V>AºÁQáƒ9ïògF³ u¨8b?Î6nȺ“â§Fƒ u¨ÆNñ”_d&dÞG8I Ê.Ô¡‹³­ë¿YÀ ¿€ªó…ýP‚AW8‰²n(A®ÔˆiÇw›]¨ÿ÷7Xà,ŒÖbµ$# ž›UgÖ),k¡$Î`]C©wŠ{ƒxC\ Yä²44¤–JÏñÆÉí›u´'ÿ¢ ñnp§¦èO9Æú¢Üa‰Xê.‰8XâàN•VE‡õZÖáÜ¡õ÷VåZÿ qn±:¢6}¹Q‹UEK%1Wš¨'JRŒÞfwã 3Yú÷5ýßV,àF^ÀÝjÃ@Ïq_Ûfw«I ½q ®á’n6FZÀÝJC_caw³3ýã÷û#àn5‰¡·^ eCoÇ`×MÀmX¹RwÖø ×àB•-pˆuCr\¡XuàHÐÅ’HË!±V=}šX5cºh¡VCÏsIÄÅ‘° ¤m\Hô!Y©†zãÆw:;ûôtBž:yrQmcó÷ˆs£„f!"„ÚcûŠ—^zY¼ùæ›âìÙsbïcÄò•­RlÜ­nßTÞd¨Jg›­("×K"W)Š,擈[,JlŒE¹SSfO—êÂ)/¸ ×›émíÚR¨^ž±älv¤VGq¼®”…Z6›Ü§³DYê‚ßV¹hà_»Áb0Ž2óºÊ¬m]k;Ø£cVŠa‘j ¡ÑÚ€?Jéh¸O?ýôŠÑŠ{R6×:ƒ^!c×®}ó©Ì‚TT2À#ðEåq4®eE‹¥\F„–xùQ-´Á2¼ÕÏ6GÉ=÷¹;z~ÞœüösÏ=wKÈžø©¨€û‰µ™}[W¶[Ý ‡[=÷½þFíÚ¯A%>űh ¹×‡ã8”ÜU‹ëé§OÌŽcŒ„€Ë¡5—åsB+häÝÊ8T9 •\Ów!^RÊuòºHYƒÎþîʈРR]J7ÏêêênZâc ¼G«€+Î/-ç-‰uKÙÎ7¸P·Ñê >‡ìQ¸>-:³PåšpÝ\. 8ˆ¶6ok©ÕÒsEÎhÚô/^}õÕ æÎ}o(,«K¬„½»ˆMÎ’ÖmÚ&Yáþvô˜8ðÄ“bíÆ­¢´z™”‘êàîÓ›Ðt³DWŸyæy¦F碧R¡^rÂMšJb "–8¸Sá>MÒ¡D‡¹:ŸlQdÍëÏ„:|ÿC­µÙ%) ÏÄé¿_”`ðÆê¿ÆÃ×OîÏç‡r›Á8EV~®<™â#“jû*rÚW_‹©Ò<¥`K ªœýUL@Ì “TÀáxTÓKZÛ•Ó·+ê[L{³²öÕ7z¥ÊÞ r ,óÜw+îÅg_Ô´\l+•¿pµ÷¼€eµ†ò<v_£MÀ¡°j°o˜T+ŠVøºPQ60ç·/^ª(àÐ_¬*ïRãÓˆ+S}$,pñQI+å±ä¦å¢ÈîO;‡{ûÜH8š‹Î‹zMºÉó |vò—dȘTYÀÑâî¿ ÚÒR]TbäßEŠ¢®ƒŒ±¯mq=¦åé$ah©5Ç¡ž£UÀQÆ|°\˜˜æÙQŒc°ÜopØI”¯oð\5õk°¸¡ÈlZYîO¬…Šÿ‘À—*’2HÀ•ë´Ž„Z)=Ϥ×çGÛÀz‡Ïà³(MèèØÐWGÉÂö×M[wœö •j½ù…D’®@TÔ5ˆ•kÖ‹5ë7Óã:éÿTr³ú†DvøE<µlÙ²~U1rEݤBK“')»ô{”ˆ“Šù’;Ur¯êNíÈ]4ïµ Iqƃ™lô™»×Åì‰Ìç#àJòKôÉ2%-C„»²pÿˆÍ´lˆsvjÁÌM›vLB™‚“'OŽëÞ¨ˆâZˆ[#&8Æ PQœJBFºÛB ò ÝÓSãÁ¸´„Œ"y²SÆæ‡i‰%Ñáñ jÊj¦ïÚu@½§¾áµmÛöN¤åTfd%g™ÓÊõTU_JCÇtZb¦ÿ­8ÈS-'i, F™QOÓ’[ÞÉ MÌÀgÿþÃj¨;ˆã–u[&·¶n˜ÒØØ¢±¬rÙ4ô¿µ©uÊPzmß1Thÿßùu{;/» #Ð'p]d¦‚aoçWùõãÇ?Ú}MCùüªª€£*ïZX+sË{ÑÒl+’c’Ín6¯»ó ËwŸ¿}#!à°¦«å’ë74TÇíË„è”ꄘÌs*í¤ÖŸsˆm°”ÕípÏ|æ¯.vRí2iíMW¿“´¢þ}L1&—iÁòOˆå§nöžÿ3d R¦ä—®vÿJˆNªy0ÚƽkÝ®‡imÒ}òZ¥×o$l¯§Ï¨8ç‡}Ì¿®yIÛ½OëEÖ÷ÄQUnh­ØkZjIžC˜«È¾ìk^wçA7/·4¶hö6‡FBÀÁjåÙ,ÙHåLÐpáîüŽ~ÜŸsˆmh­Öç*+—÷¸|ÕHXàÀK§QR‰¼®«4[3‡ï21:¯ Upçá]‡ô y\¾yê¼ÿ¯›½Ç¿úû½Ã8}Ýž¤¹ÜãjCðè‘n¼æ*ŽAeb¾w¡ß@úìGýtM9Mž»-)6Zø§'f¹Ñ5V*.7Û¥ß ”?%/I+¡uý(ç›hL»‚šp¨ß† ° -ì¬ Ë ÔbH°¡6ž‡!¬oˆ•ƒ Ÿ1ž4ùjZD„w­ZH>þBÀÎ=,©¬ýÖ¶qñ©Y(æû]DlòÑ¢Òj—ÞîºûsA„¥ìÂÑ£ì(U¨nn~ôòå˃6cöçx#±Í•+Wî÷õð'3À+¨×ÂÆÝû‚઒*kZ û TíVžTýy.Ý­ºù¿W¹qãÆ^«ag¥æHëbÁñÕ«ÖY÷— ÅS<™”Fu„Îã ?}RÞ†,ßùyøŸ.È,¦±þ(Žîïçþ®#/”M¥ÿøê«¯n¨‰(/2q!qƒ®–öì…irßíÍwÿNççfËï¯llñ¾YŸñþî¶Ý¿&Ëj-º}v0çÇ£%’žëéX´ ÏCTgíúúšn~ç.½té×}õ ZäúzuwgŸ×ÏžíÛÂÕ׾ʊʺÖg-É+»an|kRV•Õ™ÒšŒa¹£ÁÌ!Äbf§dßPé_¹O´’„:]>ƾcÂcoˆýìϹéï6ø=­(­±£•ŽP؃dhÃÜŒ ŸÕÓ1i5C’ ¢ßÊBýKûÕ};WGO#ù¦.,(²½§ý¬¬_93<(ª•–9ú€Ž7àq(»'çåæ/­z}ýc?wå><¶û±®•"™ù5ƒ'>'] èFös¬Ú}_¸9ΠåÃh¥€sòÊ2=g”1üùgŸ}&-mÕÓY.ïÉMÏõ£kË)¹^á€A79gOŸÕê¾,¥EQòüÐÌ?{ì±›ˆ<øê‹de¥†3¯½öÚýò~±Ž*…ÿHK¶Á0ç×çoE_熾“Öò8ݼ[zÒ>4ÏtiµŠµžÎÿ«a9P6ÊÛwõËŽŽó5š4é¹üܨÊÉ h^T~Q6 Ïñš3%/  ¬oÆê¶·/€ß} “Bî™Ó§'œ={~áñSϹ<õÌ ³ªªÆ¿ÞŠphFÓö8oŠŒG¬½–›êÙ_Á¬<““~¿eÃv³åµ a´¸xz¨d¾¿gp‘r ð )Œ‹ˆË¥‹uòš–užä Ôikkû5ï§}ñ"K}iÖÐBÊU}™Þ{ÙÇOöìÙsÿòå˧nX»Ù¡´ <.9&5‹Pa÷þᵔشÌÊ’êè-·[S|Ñøž„›|\Hã"ò¨ohÑqÜsXRª««Ó¶jƒASCs ˜û‡PYì¥XF´Ž'$¹/™ªñ2H±Fªr‰X×°J„œ 64<Çk–XnÓ)S¿‰q÷ÌÊ8ŸÁ~qï¤ÏÝÊEg¸9¡oªÚ?Uí×@ÎI_cÊñÝì8Cy¬Œ¿ÊÖUÿUe¾Õx†â\ vC9†¡ÜW÷ñÐÅû ™·0±þŽnVäîk^ åœÎqö<õç3Æ›ý~ E‡ò<öÔZ‡ö¯¶# 8x.zìs}AéLw#ãã ÕÔ¯Î!!‡ŒTÄ´Á5 ‘†2!lhuÈT]2Aíš³ÁÜ—J’“͇ïƒ 0&À˜ÀH€Å*20r\F’bÆÍ%0iR[Ãu«ÖÙÅ„%SHEWBWDPt¯ÅàGj,|Õ%@"ïçžýžgÍ Íó×®ZëUîáäÕe}‹ ßÜë(aO ör7\pÄz¦æ¿ŒÇOèÀ:§p‘šv6,|o7cæ—γç<íìIµezõ‹«.Nî`L€ ÜéÖ¬Xc‰˜¼ÁÆ$!ÎŽb:SÌÕ¨MŠ»ÓçÀHŒ(Žð†DÀÌ9$ ùzyòÉ'ožÌ‰`÷†‚‚é‰îîyQ…IžÞ+<<šó##K==ý‹RRtåuÊFbð| &À˜`CM ©¾ÙI9{²?U>'ŸPqÜé¹aTÞ¦ÇòCÝWÞßè%–é«\)¡¿ó ™÷TÕà‰ì4EðîÝCG=zIrÏ™`L€ $d$g–(J¬oÖY…æq¡qFÞ3èbúWr‹õXVƒÁ2îàÝL‹M›³9†÷é…æ¨è>ƒæç_[tŸÏ`L€ 0&À˜`L€ 0&À˜`L€ 0&À˜`L€ 0&À˜`L€ 0&p@Ý—/¿ü𷃮†»±ÑîùúòåG::®Ü?˜"Š·»ÿ||&À˜`L€ ô‹Àùóûj[šR”4ÿdA¢á›y1³_i®ò]µwsA ¿÷k§#¼Ñ‰›ÿ´²Ü»´ Áð¥¢ÄùïäÅ\h®ôm~bOí--ù2ÂÃàÃ1&À˜`Làæ>~ëÜï+2MŸÎŠÐº–>SdQÃ#Z~¼Á?wm,p¼ù^nïÇ÷¯V«È4»®Ùñ£1Ä|´gSá’ÛÛC>:`L€ 0&À†ÀòB§Yš"7JKäÇj‹‚8é17R«KÄm_›­²–8Ô5ªÌ±<ž1³÷1$Ì{ÿÙ£[Æ!6Þ`L€ 0&ÀnsÏïÑÉŽÔºš£-Ê’ôDUª¾¨N›-*’g‰¼hí.k¹"nOo~Ôm™VÙ‘Úßc ¥Jc(OÖ“lMl­ TÜ|o¼`L€ 0&ÀTœ@yúâH‰ŸÚŒ9¢1g¾¨Ëœ+ ¸’Ý.”7ç9²tÝ­ŠÃi*÷,‚P“ÇЀ1d % ÉšËD\YªÉaUì?÷‰ 0&À˜`"PžfœV@îRXÞ²ç‹åY†¢!gX‘gBÏç‰Ò=‘©) “ Ï^¹råþí|„6n­ ^—/ÆPŸþÏM cѨX(jÈšˆñAÀ‘=6B]âÃ0&À˜`L`øljŠs)ŠÓ»&¹MSf‹ed}[]j-6/óÍ…¦’(‚…Ž,uûÈ÷ÓáëÉà÷ÜTìU§ÛQ•:[TSk"á¶¡ÆM¬«r–,а$ ·ªÒ¯eðGáO2&À˜`L@E¼÷Þù‡ª2L>*Š×%K•Žäzl-±”PsÁQI.?VïûÍñ>*Òåuã™Ö§-¸w)ܨM¹F’x[[á@Ö8CQ Wp´î·ëš"8UUO"÷‹ 0&À˜­­q.iˆ#+'×icîIÌÇ뉚<«Ý§NúÕÀö:²[·¯I ΉÒꀅ5±‘ÜÀp¥Â‚˜«ÓÑRãרÞÞþ³‘í 0&À˜`ÃD«l_•lGñpoÄͺ ‹Ui⬎ҤÙ_¶Vz5ut|ýôâ»×¥[VdÌiȳöyí姆l·}›Š§6–¸–Ö(lþV›ow¼:ÇríîMùK/\¸p×PcØ¿­Ð¼,unÀÚeÁΗ.]x¤¿ûæe·úKŠ·cL€ 0&À†”¬ZkRf®‰‹JÌ73Z›f ½¥)È·º9ÔÏþì¿Òƒ `g»6æÛ$Ìû§\“M~ֹ̉º²Â§þÃÏÜ3€Ý Ù¦§x 5:ªÚÝ©.nÆÄ=)zÓÛ›‚}*W…/zíµ*™u;dƒç1&À˜`·ŸÀ¾æªß–;X6¥Ìšñyô”qB¹ÅLS»–9Ö…¶Äh,X?’½}rW­F~üœÏ²iµd´æSÁ]4ÄÜ!;”–ðú~U•ïˆÙÝ”œ<7ÏÔèxüŒ‰W»óŠŸ9ñ¿ŠÅóÿ¶)'}îH²âc1&À˜`wͱ±È7[øTôÔñ’™:^ÄhLžË%Asò75žŽ©$âF, ¿¹Âk jÉ!Á«=T¦èK­2_ñ:¬qÅÉóGt©«­Šô%É:Ó.w ·^x¥ÍÑúxu|4g¯ÞAß%*`L€ 0!€¤€R³-’x#!7]]I$hN’žã5YÈ%hNù¦-!Êi$:¡˜«ÿÓ­H™%­ò€b»•TsÉXþJZ|>BóZ•ÂÆz$útf_û£és´ÞƒxƒÀíÎ+ŽxÅNSëâ•n ûáÁ†ê‰#Ñ7>`L€ 0&p‡h‰ µ¡ø­ïc¦MÄZ’Α¬§!RfM“ž'jOq3 â®»V3çëŸn×®‡‡ ¸s£u>EV(Ê’4äIÅ‚QâãºÓïq-ÕÞÃÝì¿ÚÝ¡ Ò p»óJÒ*´'‹Øé$â:]Ñ¥væk†:kv$ÆÊÇ`L€ 0&ÀT,\…K·À’$‰7©³§‹ô¹´ˆ»¡¶È˜§-Rô§KïÅ(¹Riûk«£Ã-FbHiÆo`]ÒÚ4I°a¥Úm+·—DŠçDë^­É±Z0Üý¹ðÜs$ëMbâ-Yâ5㼈Į2+ˆ¸ÔÙZ_6§¥=8Üýãý3&À˜`w §NýF±xÁX×`I‚Éœ¯#rMfK-Í@S²ÀAØÅkM"«ÅÄuZ•V„Ž¢¶ºÀ’²ÀÁ]Zž_$M¡î¢ÊÕ‚,Ks¥˜8ˆ½L£Ùïl¬úëÆÒãа\V©½ùnXà’t5¤Ì\¸ì…´vªÝ"Ñì*êHðšJîhÉåL®ÀÂd—ho±ÚywÚyáñ2&À˜¸ãÛ¶úw¹‹æ¾wÄD„b» J*œÌD‰1‰”Y’Å)A{ʵZ§´;Tç€7g¦ÌJ=óóXJR@C‚Äܧeö‹%Vˆ#„‹qp)ú3¿Ø]Uªw§òâq3&À˜`ÃD`oE±aú<Ý÷Û7V¥ë ˆ‡ƒë4‡ÄD]Ò¬i×*m·¾vbϽÎçúÔØ $ÿ@ðÂj)ñ¢„pÊ6Ò•bâ ì’u5¾j ôŠäpÃ4qy·L€ 0&ÀîtqyKNÇQZ)+•bá`qC¬WЧým»CÓáöv®gF“e}z¢W¦¡Þ;à%ô%Á&>¦†çÙÆ³/­öõéµcïôyÌãgL€ 0&0j tttÜüøi­MííóO½ðÂÌ/¿üò·ýÌñý›Z›P`a¼¯Ô~éyjï”Øš¾XjcºjcVšÑ™3g~ÑŸýÜ)Ûì++{´5&8&Ïtþþ[³—ÀLajxpUdpÊ…b|8йùÝÆ­; ³ KÌ·lß>ïõ×ßÀ»þãm˜`L€ Œõ+×Ì ŠŒk6·w}ÏÂÞõßôø =~afëò‘XÌc¥•5Vý)¹AÛüâí3gÄrYW^{í~ïDÃ2 ðºxúô`FÏïêÏA*ëõCb6›Ù:„ódfãtÕÜÞ囥¶.Ÿz„ÊÍ+ñcë]Hò6L€ 0&ÀF)£Gþ<5;¯ÐÜÎù+cs[Ñ[[diw54:qË®]‡‡}Ó¡DùêáÃ/÷óL-w´:IuØþ?cÒçÅÖ¦¯[/­=¾u«Öh˜dż'.%³t©ó×}+ »ka;|øð£CÉ’÷Ř`L€ ¨¸5ãR2Öô%º¿çêôÂþýÇRî÷Ù³–Ø0Ó¬ù³>P^–JùyüÌÉÿYæã^|¢µUå+öíÛwOx\â€Î•›_Ð…-[¶¨«ú¹âþ1&À˜` š•Ÿlbn{m Û†Å$n€ån‡ñM[£#ìiñø/$ÁFŸXš*vššÔ¤eªè5¼3MíZ‰­ùÊmÕÕ¿ñNöó€£ñiÙqdYëè¹"—êþC‡ÝÛÏCñfL€ 0&À˜€*رc‡š³ÇGØ~±µÃwEUUKUu|{—WNȘ«ûJ›@°¡\²=Q§ ÏQHW^o4vºú÷>áªêN=úÜsйút0çj‰µãÕÜ’rU=WÜ/&À˜`L`’2sÓúcÑ¡mzŒ‹ ‹Ù9€Ãè¦Ë}Ý‹ÈÂÖA‹ÇÓ’Te:hy”6AÃbòXª*vYâ:×Í2šóú¦ÒR•t Ç¥¦Ç÷G¼á\õt¾ÜüƒŸ ìâ_ŽèIàƒ1&À˜`COÀÕ'èH_¢`±•ƒpòôî~ÁÂÞÍG˜Ù8Þ ä,\ßÿè£Ft=ÑþPxûí·¤ÂÂg!Î ÒP“õè2©X.ÖEÑ\ÔZ»n»îF•\©$øöU/îÏ1Fz›¨„”ý}«%çÊÃ?„ΙŸ ìᄜ“‡ß岺fNhéÇÇcL€ 0&0”ÈUx• ¸Ð›(°qñ”í(Òs Ejv¾ˆIJ>ÁÂÒÁ­KÄY9º±çÀa¡ì×Pìëyr gΟý1V…€PÃÊnŠÅÒ’^)³§K8;ZÇUÄNÿŸnMbLâPôa¨÷áý÷¾ÎÎOZNÔÒ²•ƒ!ÑíÝ%â`iu÷ Òê~ñþ˜`L€ 0$€°dU{–ˆ2´¥¶Î–XÜòJ*E]Ó*±¢u­hh^-ʪ—KBÎ/4Jð“Dœ¥ƒûW«×ož3‚Ýîס¶dOO7Ôû7¬o©$Ô2 u$ñ–e¤'-镽@OZ¶*s¾ŽäNMÔ™ÒåJ­óóÈé×AFx#g¯€ås…Gªû&`!uöYù%¢º~…hji“Zõò&‘]P*BcÅÍu îè„ÔÙ#Üm>`L€ 0&0”(ê^ÿ°è °ªA”¡y†I¹Eå’pÛ±{Ÿxâбoÿ¢mãQVS/âS³$$àÝ®œ;÷êä¡ì×Pì뙽Û&d-œó!„Y 4ÉmJk³Â—c¢/Š­ŠR»E¢Ð|¾ô¬qñš)+uœØYV0}ê}¤æäŸ÷ ‰”Î=üCe—J7íÍí;ÅãO<)5<ÇkxÏ;(\å–ŽîßF&$Lê~ñþ˜`L€ 0&PVµlܤTžBfÁQ ÒcÕ²F±mÇnqêÔsâïU¼øâ9±ÿñC¢‰D]f^±$ YÚ K'÷‹Xvk„»}ÓÉK—îÎ16xFpXc®Tľ˜Šj+Qè,*œÌÈ27G²ÊÁ•š¨£ñݶ‚ì™7=ÀmØ ¬ºnuœ+<ú‡F£”‹((«k7n;úŒ8þ‚ÔžúÛ3$¸·Ò{U"4:AÐ ÂÕ;ðâcÇT.^ñ6 äC2&À˜ÝV¯ÝìQX^ý}AyµHÎÊn¾A"1#GÔ56‹Ýû/½ô²x÷Ò%ñúëoˆÃGŽŠ–µENa©d‚û.<&q…ªh‰ ‰HÒÕø!Yg*Ÿ©Ý\ÀQ¦j±Ù¡÷ORÉZp{÷4Ï'A†s•”©’J"â’EIUؼm'‰íÓ‚’7¤v’žoÚ¶CWÖ‰pÚîq,‘Æk¤ªêlå~1&À˜K—>ÿõš [^^¶¢E¸xJ¢ .5ST’nëö]âÄÉgÅ+¯ü]œ9s–ܨE#ÅWeæI8KZ+uíæÍ*¦½ýÁü¥FÏ ™¦¨ýÖ— 5Õ@óóui‰ó€oD7½xñâ/×nÞvª–ĵ›o°dUƒu V6XÛŽ<õ´8wî¼ÔðœÎ«ô^pT¼°sñú¬¼¦^wD;ÌcL€ 0&À†ÀÑã§–,klþ/\¢Ž¡ >bà ß¾sSµ‡¬q”¬ J«—I™©zÙ%YªZôV¦õì–-ãóLç¿JåA¤’!R9r—fuKbH3óë éI~B¡øéð‘¾õ=ŸyùeŠMüÉ&°€z†Kqnu·î=~Pj·n—^CÒ YUˆOÉÈdëÛ­óç=0&À˜¸(+Šß禧ûX¯ò´·?æjmýwgKË×=ììN˜µ¤ÅÅù®¨®þs{{ûÏz;èÙs炪êþçìå/¢Ó„¢¸\ÊlDê2 ˆ/®¬I¹<òCJ¶¢aH0;ù÷<\ëé¸6Q{Ê×Tз±pɇąÔ93®æ/]øòöü•¬ýÖžs¯¼bÓ¸²åSOaíä!YØ`­¨kõ+[¥†ç XJ#®FƧÔb½ÛžöNóçž–+Œí/Îw³µ}ÂÝÖö%Gsó7iþœu\ºt—³…Eƺ¦&pà˜¯|&À˜ãªJJ&;š™µjk6ýÑGE_mîÌ™_8YX´VOíÉj†×.^|Ût×îÇ^ŽOÉü> ,ZН‚`ƒ…'9K!Âc“®ù†D¼›®(ŠTõ5P»ŸzŒïÅý»4ê¼]V„¬X°±Þߣ|]J‚åh\àÿøÇœÇ|&=;ÿ;_Ê"†+µß`qK¡XFm×|‚ÂßQ”Vø÷ö5hkkûu°§g”éܹçgŽßÑ×ü¡÷¯Y?“ê¸mÛ6•Œã_w`L€ Œv§(ÈÞ×Ñ1nž¦æÇ=]tg˜“[÷÷IÈ]ñuvŽÃ>zâðÅ_<ôüó/ºQùíä.}æß B¾Òr (Š*â÷íÛÇ•üUd}øá‡÷¼ôÒy«ƒO>µ²bYã3¹…e/'g*Î(Š+Ú³òŠCNž<ùûÞºªHMg:oÞÉãÆýH¸õ5´ÔÔ®Ú.^¼­©¦FME0p7˜`L€ ¨>òòòûÉÅÕËÕêTì÷·Ÿ~úéªOæÎî!,Œ¨ëGwÝŒ„"#Ãy–†Æ§Êóóó¤§ùƒy¥<ð¹Å¯dÄÆªlËÍðûL€ 0&ÀFŒ¹-ïö²³[Eì\D!ÜpqÕ¥6ëÑqb6µ9ãÆ ¥†ÿõéu½Î‹3.Ä’ˆ?þo{û•—¨^Úˆ €tÛ dgÛêO*¹ÜeáÁùyÒÓüÁ¼ÂüÂvyø>o¬¯ÿÖÚ•+Õoû ¸L€ 0&ÀT•,,q^’봲ᢠÁfHmµ…ÔŒ;žQ›Om.µÙÔp¡†èëqßû¹¸D©ê˜¹_CK ;%e’ÁŒïÉâ Ö63ˆ¶yóóEž?xļÂûØÛãsòÀÒùóŸíÕohGÂ{cL€ 0&0JÔWUMF".¾°‚èJÞq’pÃEvñø ”ÚRjÍœͨ-¡fÒy!†ƒèÃE–C-­ËÕ%%¼¼Ò(™ƒíæ… î¢,Óÿÿd±¥ùaѶˆæ‰òüÁ<Âÿx}5Ì3Ì7|V_É­J1tÑIƒíŽ 0&À˜À˜%ë››¥åùâ{]¼]·Œ@˜A¤YMP6ÔìÕÔ…ƒR³¥×¬©YPös%Wظ. öébeµòN¨FcüÙÁƒ“šªøKLjê_¶m;ð»;Å…œ¹Xwòäÿ@´Ã k,Ĭlh˜˜'vÝæþǼ²¤¶düuk.¬pÊ®T²ê}ôì³ÏþaÌ~y`L€ 0&ÀCàâÙ³¿›3mÚ×°xÀòñ† )¬&æta…Hs¤ ­«úDá1q¢ð¤æÕùèF¯á}l«[OY«óµµÿµ®¾þáÁôm4|.¾Â’ 3ïÀ°MTÃîu;W¯/mœ=¾ö }×É+à)ÊØŒiiÙ:À§pñ xa0âMþÌú-ÛçPw‡ý0yiiq²ûT¾@v)ó·)„?aüh¾„tÎÌ¡`zîK7 |~ˆ¿DíA夘9S§~h4ìƒá0&À˜-|ŽÊÁç¸xÊîSoº#nÉ«3Óèkt)"ãÈ-AgO–8¸Sá “/ÀrþtŒÑÂãfý ›bfãôß¾œ™­³°w÷önÞÂÜÎEµî†r¿–Üì8£åýª’/Xp!ºφú€¸@웜ð‚yçOób.‘æLÍ4<‡‹Þ7´ >6˜“²+~¹PWÖ×ëŽ&ÜO&À˜`ÃNÀqÉ’Æî[¸¿`AB¬o¸À"‰­hš†(§VB-»SÄÒÅÙ…¶“­pòî5Û… ‡} #t€Úåͽ‰·E–öÂÕ7HÄ&gˆ¤Œ\›’)‚"ã„£‡¯XlåÐ%â¢R÷Pw‡ý0±!!ú³ÔÔ~è.ààE¼›e§K7H„I¦ù’G­Œæš‚ž'I7“…'mƒ¸8X‚áÒ—×H] ¡ñÕÔ{dØÃ`L€ 0&0ZdÅÅyôds$—(\bdp}Áú† ô|ºàÖMŸ&VQk —J¯Á +`‰U®-Wš:fʈ¬Z½ÖbŒ¬p]m1 ·%ÖŽ"0"Vä—VŠêú¢®i•¨¨kÙ¥"".Y8¸ûvYâbÓÇŒErýúõ¿·00¸Ô]À!¶ Ù¨°ÈÂ"‡€hš?üU4oVR[A­’Z½†›ßN+.bá°?ˆXpLLž‹%XFËo÷“ 0&ÀTÀùóç2ž©ù%JˆÈ1p°‚Ì¥únpeÁ‚‚‹1j¿ÁRRDÛFºènš1]q°ÄÁ*‡x&X]ðY$3@Àá¼HSë‹m«WÿN‡>¨.­ß´ÕÞÅ;Pxø‡ Ï€Pz .Þ"$:AUÔˆUkÖ‹ö{Åž}‹Íí;Åò•­’ˆ "qw*¬wá±I[upü„•›™YË I0$ØLheÌ)Sz„Ù¨±4`q«¥y³ŽæÏZj5ô<‡^ƒkI3{}ø,æÏ¬ñ®…¹¹E«àйKL€ 0&ÀnÔ%s·°X)[P…Šâ¼ÈDYXààJ…‹4¾óŒ‹.D,qp§Â-†88ÄÉ)[à°,’·¥Õбd=))©ž—’ù]tRºˆ¡FîPá-Òs ECójI¸>ý‚8wîeqìØIIÄÁGŸ‘bâ ༂" oßú#§…†-˜2õ[~ˆ/¬¬€HÌ)Ùë,p°¶UL›&êiî •ÓóLz ±qp¹"^N¶À!¶nÑŒ™ž=vlÌÜ =}Þ#`L€ ܱÖ¯Z5a‰¶Îe¶ùKáŒdÓN.®6Oéq°ÄÁ ë¬'PGìœ9Y\p!‡ÎŒöÙP]=¦³¿páò}$ÈNæ— Eq…ä6õ ‰9…¥¢¥mƒ8|ä¨xýõ7Ä»—.I"‚îTÄÄÑŠ ‚Ü­×öì?4g,M6è?w_ºtÝ<:÷°¾bîÀ}>›æ¬º°ÊÂ½Ž’"pÃÃZØÙ èpc ¯|€}à³$;x1û±4Ux,L€ 0&0”`…‹ôöŽ6TW¿ªœ=ŠEÉq1EÕ|ÄÁÁ ‡ .Ü©¸#v ñq¸@£~¬'~ ÔÔ¯F¹{Fµ•ÀDY‰²ïó(Þm©³ð ™yÅbEëZqà‰'I¸—DÜsϽ ¶ïÚ+ÅÄ%¤e Jf kÝ‘æææ_ åùS…}Ude©›ii¿ á.×ÿCl%n –vºQqK-\©È>EÃs$0xÓüûÔ¬sQ{¸P]M޽ÿþû¿R…ñq˜`L€ ¨$ü2ÀÖ¶Ñ€2 åò ¨1Q+ D.Âp§Âbá†àtXNàúÂʼnFjê?„ØÛ7=zôn•ì-vêÃ?¼gûžÇvG&¤H‰ °¬A ÁUº~ó6ñ8‰8XâöÐté¹XgçÃ!Ë‹ãã]©Jþ¯ÇÚ¸oe<$êÆÌbõ·ÂŸ%¿8¸}û<… sbœ]÷†XXñ16ù{¤ý‰hGÇ-AÑ/>û¬Æ­‡?Ϙ`L€ 0&À˜`L€ 0&À˜`L€ 0&À˜`L€ 0&À˜`L€ 0&À˜`L`ÌøàÕWö´·ñ²·ßdµpáyí‰?¤"¶— 55/y;8´35ÍÙÝÞ®7æAð™`L€ 0& ÊP*…Ê] ÿkv.I¦¼ý’¹sÏÔ”–ò:Ÿ#pÎøL€ 0&À˜ÀNÀÏÉ©V4ˆ1XÙ Î Òôh• }jshu,%·ÙôËévn¡‡Ïáó‹æÌy¾¦¦æw8R>`L€ 0&À†@fr²ƒ¶ºúUˆ/17ˆ3ˆ6¬‹%¢°ÌØB¥†ÿ±|sÇvz°ÔI.Öqã:–.ÝtáÂ^µaøNï™ 0&À˜¸S ¼÷Þ{éé½)‹7¸Gaqƒp“׆ڰf´0;j—›)=ÇëXûBŸÃç!â(cõ?©ÑÑŽw*W7`L€ 0&À†€—£c ,f°¼é’ƒkÔ°S˜A¤YLP6ÔìÔÔ…=5‡ÎG[zÍš„Ü\ú¬65ìGމ[¨§wêܹs÷[çyÇL€ 0&À˜¸Ó\¾|ù>#]Ý ’ÅŒš,ÞLH-%aÁæ¢>Q¸Oœ(<¨yv>ºÑk¶ôÄ\§=e­’îj|DÄ’;+— 0&À˜`ÃF '9ÙpÖ”)_#a1o²å â V7'hm>“&‰€É“Eµ`jÞôÿRzö8XÝ®'<ôV+ÎÃÖ¶vØÀ;fL€ 0&À˜ÀFÀÛÉ) Ö7Ä­!»1op›Êâ Ö6·)SDdgó¢×° ºÇ¾)»OeAg¢¯ÿ4¾ûNcËãeL€ 0&À˜À°ˆ Xë™5Xßà:EÌܦä"õ'K[8 ·XjÑÔ\èu« p­NVˆ£¶¤33I ()"—‘Ë‘X.\øö¾}û~;,à2&À˜`LàN#àëì¼ ñk³É} kšl}s%ñæK–¶P²¾A¼EMžBîT5áH±owîÔ èìèu9ˆ?ˆ8Xón(ìk`p¥(3“kÂÝi“‹Ç˘`L€ 6Ù} —(bßìÈHÖ7¸MƒéÑžDÚuQ7IŠ £q‡m¼èuÄÊYvºU!å˜8XãÌ >a7<ç÷ʘ`L€ Ü₃+áö„åLvŸÂʆ875?lV$è Þ&M–]âÔ©"UCC¤P‹£ç¡dó¦íàvE­8¸båZpˆ‰³]°àÍûv=|âå!3&À˜`L`è xÚØøëQ ¸îΛœ52Xß Ð"H¼A´åS+¦!Š©eÓóxqÈN…kñq°ä!£Ö783}ýÿúÞó™`L€ 0&pXÕР=_Cã‹îÎI]]bfÔðÖ7XÛrI°ÕLŸ&VRk¤!—N¯AÜA䡸/,ys:ݨ°Ä…¹¹ÞhyÈL€ 0&À˜TÞãäâ<†"X˼sÕ¸AÑ–Ž/œ¥x¸É’¥ Ö·å$Ü6Θ.VϘ&*IÀeÒkp­ú€CBâN‡äˆùS§~ë¢?<½ç½2&À˜`Là%ëë`0Aí¹œÆGÙçO.–\‰µjpMÔê©•€K£×PjÄ«›¥Iºté×€»Cç› 0&À˜&/^ü¥Ý‚§ Ø â·ë¬rXãV5¸G!Ò’I¬)¨!þ­°Óú×j÷8,jo2eêW…II‹†©Û¼[&À˜`L€ ÜÙšªªtŒIp!#5Ü â  èPãÍ…âà‘A§p¥&SK¢C¢.„PJɦ®WÃñ®ÙÚ–ÝÙTyôL€ 0&À˜fÙ‘Ñþ &NúV^˜ sIÄÁ gCÙ¥XÐqnXZ«sMT¬ÔàI¯£ô„^çòZ>¦Kw\¾|ù¾aî2ïž 0&À˜`w6JhøifHxð¢)S?ƒ%V8y‰-ˆ8”A­79¬Â€²!Îô¿-YÞÌ;Wb0™ vÍßlé–—^zé×w6M=`L€ 0&ÀFˆDœ":z‘‹áü 'Lè@=7¸Rçuf©ÂE ±fIb7<ÇZ¨È<µž©ùÏxOÏÔ3gÎÜ3BÝåÃ0&À˜`L€ ÈšJKJððŠô4ZxNr‹vÆÃá9ê¼Á"á†GG]½†XX-/OÉž¢P(~Ê™`L€ 0&Àn#}ÍÍ÷lhlÔ´wL÷62Þegw(ÚÞáH™y»ÏÂ…eëêë­Wÿ–»ÛØM>4`L€ 0&0 þsœö´7ñIEND®B`‚dibbler-1.0.1/doc/dibbler-user.tex0000664000175000017500000000663712561661446013734 00000000000000%% %% Dibbler - a portable DHCPv6 %% %% authors: Tomasz Mrugalski %% Marek Senderski %% %% released under GNU GPL v2 only licence %% %% $Id: dibbler-user.tex,v 1.20 2008-08-29 00:07:38 thomson Exp $ %% \documentclass[11pt]{article} \usepackage[latin2]{inputenc} \usepackage[dvips]{graphicx} \usepackage{float} \usepackage{makeidx} \usepackage{fancyhdr} \usepackage{indentfirst} \usepackage{tabularx} \usepackage{longtable} \usepackage{url} \usepackage[usenames]{color} \usepackage[colorlinks=true,citecolor=darkblue,linkcolor=darkblue,urlcolor=darkred]{hyperref} %\setlength{\topmargin}{-1.0cm} \usepackage[twoside=true, left={2cm}, right={2cm}, top={2cm}, bottom={2cm}, footskip={1cm}, headheight={1cm}, %% twosideshift={0.5cm}, headsep={0.5cm}]{geometry} %%%%%% \dzis macro by Lupan %%%%%% \newcommand{\dzis}{ \the\year-% \ifnum\month<10{}0\fi \the\month-% \ifnum\day<10{}0\fi \the\day } \author{Tomek Mrugalski\\ \small{\href{mailto:thomson(at)klub.com.pl}{thomson(at)klub.com.pl}}} \date{\dzis} \title{Dibbler -- a portable DHCPv6\\User's guide} \definecolor{myBgColor}{rgb}{1.0,1.0,1.0} \definecolor{darkred}{rgb}{0.7,0.2, 0.4} %% URL (external links) \definecolor{darkblue}{rgb}{0.0,0.0,0.7} %% internal links, toc \definecolor{myBgTableColor}{rgb}{0.9, 0.9, 0.9} \pagecolor{myBgColor} %% include auto-generated version number \input{version.tex} \pagestyle{fancy} \fancyhf{} \fancyhead[L]{\small\bfseries Dibbler \version} \fancyhead[C]{\small\bfseries User's Guide} \fancyhead[R]{\small\bfseries\thepage} %%\fancyhead[C]{\small\bfseries\leftmark} \renewcommand{\headrulewidth}{0.5pt} \renewcommand{\footrulewidth}{0pt} \addtolength{\headheight}{0.5pt} \fancypagestyle{plain}{% \fancyhead{} % \renewcommand{\headrulewidth}{0pt} % } %%\newenvironment{Cfg}{ \Verbatim }{ \endVerbatim } \makeindex \newcommand{\Q}{ \vspace{0.5cm} \textbf{Q:} } \newcommand{\A}{ \vspace{0.25cm} \textbf{A:} } \newcommand{\Note}{ \textbf{Note:} } \newcommand{\msg}[1]{\emph{#1}} \newcommand{\opt}[1]{\emph{#1}} \newcommand{\IA}{ \textbf{\emph{IA}} } \newcommand{\duid} { DUID } \newcommand{\code}[1]{\textbf{#1}} \newcommand{\subsubsubsection}[1]{\subsubsection{#1}} \newcommand{\CfgBegin}{\begin{lstlisting}} \newcommand{\CfgEnd}{\end{lstlisting}} %% this does not work... yet \newenvironment{Cfg}{\begin{lstlisting}}{\end{lstlisting}} %% for Verbatim environment %%\RecustomVerbatimEnvironment{Verbatim}{Verbatim}{frame=single,framesep=3mm} %%\renewcommand{\FancyVerbFormatLine}[1]{\colorbox{red}{#1}} \usepackage{listings} \lstset{basicstyle=\ttfamily, columns=flexible, backgroundcolor=\color{myBgTableColor},frame=lines} %or columns=fullflexible %% message names should be printed this way: \msg{SOLICIT} %% options should be printed this way: \opt{Option Request} \begin{document} \vspace{-4cm} \maketitle \vspace{-1cm} \begin{center} \version \end{center} \newpage \tableofcontents \newpage %% INTRO, OVERVIEW \input{dibbler-user-intro.tex} %% INSTALLATION and USAGE \input{dibbler-user-usage.tex} %% FEATURES \input{dibbler-user-features.tex} %% CONFIG FILES \input{dibbler-user-config-server.tex} %% CONFIG FILES \input{dibbler-user-config-client.tex} %% CONFIG FILES \input{dibbler-user-config-relay.tex} %% FAQ \input{dibbler-user-faq.tex} %% HISTORY, CONTACT \input{dibbler-user-epilogue.tex} %% BIBLIOGRAPHY \input{dibbler-user-bibliography.tex} \end{document} dibbler-1.0.1/doc/dibbler-user-epilogue.tex0000644000175000017500000002172712277722750015536 00000000000000%% %% $Id: dibbler-user-epilogue.tex,v 1.12 2007-05-04 17:13:39 thomson Exp $ %% %% $Log: not supported by cvs2svn $ %% Revision 1.11 2007-04-01 19:22:26 thomson %% 0.6.0RC4 descriptions. %% \newpage \section{Miscellaneous topics} \subsection{History} Dibbler project was started as master thesis by Tomasz Mrugalski and Marek Senderski on Computer Science faculty on Gdansk University of Technology. Both authors graduated in september 2003 and soon after started their jobs. During master thesis writing, it came to my attention that there are other DHCPv6 implementations available, but none of them has been named properly. Refering to them was a bit silly: ,,DHCPv6 published on sourceforge.net has better support than DHCPv6 developed in KAME project, but our DHCPv6 implementation...''. So I have decided that this implementation should have a name. Soon it was named Dibbler after famous CMOT Dibbler from Discworld series by Terry Pratchett. Sadly, Marek does not have enough free time to develop Dibbler, so his involvement is non-existent at this time. However, that does not mean, that this project is abandoned. It is being actively developed by me (Tomek). Keep in mind that I work at full time and do Ph.D. studies, so my free time is also greatly limited. \hypertarget{contact}{} \subsection{Contact and reporting bugs} \label{contact} There is an website located at \url{http://klub.com.pl/dhcpv6}. If you belive you have found a bug, please put it in Bugzilla -- it is a bug tracking system located at \url{http://klub.com.pl/bugzilla}. If you are not familiar with that kind of system, don't worry. After simple registration, you will be asked for system and Dibbler version you are using and other details. Without feedback from users, author will not be aware of many bugs and so will not be able to fix them. That's why users feedback is very important. You can also send bug report to the mailing list if you don't want to use bugzilla directly (or want to confirm first that it is indeed a bug). Be sure to be as detailed as possible. Please include both server and client log files, both config and xml files. If you are familiar with tcpdump or ethereal, traffic dumps from this programs are also great help. If you are not sure if your issue is a bug or a configuration problem, you may also want to browse archives and ask on a mailing list. See following subsection for details. If you have used Dibbler and it worked ok, this documentation answered all you question and everything is in order (hmmm, wake up, it must be a dream, it isn't reality:), also send a short note to the mailing list. Author keeps a list of places where Dibbler software is used. He would appreciate if you could check if your country is on the list (see project website) and mention it if it isn't. That's completely optional and author won't be disappointed if you chose to not reveal that information. Finally, while the author's mail isn't secret, please \emph{DO NOT} send mails to him directly. He is quite busy and do not want to respond to the same questions over and over again. Also, he travels a lot, so often is unable to respons. It is much better to ask on the mailing list, which has public archive searchable by Google. This could help other people who may have the same question. And even if they ask the question without bothering to google for answers first, it will be easier for the author to respond with a link to previous response. Finally, there's currently over 100 people subscribed to the list, so there's a non-trivial chance that some of them will respond when author is not available. Please constact author directly \emph{ONLY} if you want to report security issue or want to discuss confidential matters. \subsection{Mailing lists} \label{mailing-list} There are two mailing lists related to the Dibbler project: \begin{description} \item[dibbler] -- Maling list for Dibbler users. It is used to ask for help, report bugs, hay hello and things like that. If you are not sure, what to do, people on this list will try to help you. Web-inteface link: \href{http://klub.com.pl/cgi-bin/mailman/listinfo/dibbler}{http://klub.com.pl/cgi-bin/mailman/listinfo/dibbler} \item[dibbler-devel] -- That list is intended as a way of communication between people, who are technically involved in the dibbler development. If you are going to improve dibbler in any way, make sure that you announce it here. You may get help. Also if you are trying to fix a bug on your own (hey, that's great!), this list is a good place to talk about it. Web-interface link: \href{http://klub.com.pl/cgi-bin/mailman/listinfo/dibbler-devel}{http://klub.com.pl/cgi-bin/mailman/listinfo/dibbler-devel} \end{description} Both lists have archives available on-line. You can join or leave one or both lists at any time using convenient web-interface or using traditional mail-based approach. \subsection{Thanks and greetings} I would like to send my thanks and greetings to various persons. Without them, Dibbler would not be where it is today. For a full list of contributors, see AUTHORS file. \begin{description} \item[Marek Senderski] -- He's author of almost half of the Dibbler code. Without his efforts, Dibbler would be simple, long forgotten by now master thesis. \item[Jozef Wozniak] -- My master thesis' supervisor. He allowed me to see DHCP in a larger scope as part of network provisioning process. \item[Jacek Swiatowiak] -- He's my master thesis consultant. He guided Marek and me to take first steps with DHCPv6 implementation. \item[Ania Szulc] -- Discworld fan and a great girl, too. She's the one who helped me to decide how to name this yet-untitled DHCPv6 implementation. \item[Christian Strauf] -- Without his queries and questions, Dibbler would be abandoned in late 2003. \item[Bartek Gajda] -- His interest convinced me that Dibbler is worth the effort to develop it further. \item[Artur Binczewski and Maciej Patelczyk] -- They both ensured that Dibbler is (and always will be) GNU GPL software. Open source community is grateful. \item[Josep Sole] -- His mails (directly and indirectly) resulted in various fixes and speeded up of 0.2.0 release. \item[Sob] -- He has ported 0.4.0 back to Win2000 and NT. As a direct result, 0.4.1 was released for those platforms, too. \item[Guy ''GMSoft'' Martin] -- He has provided me with access to HPPA machine, so I was able to squish some little/big endian bugs. He also uploaded ebuild to the Gentoo portage. \item[Bartosz ''fEnio'' Fenski] -- He taught me how much work needs to be done, before deb packages are considered ok. It took me some time to understand that more pain for the package developer means less problems for the end user. Thanks to him, Dibbler is now part of the Debian GNU/Linux distribution. \item[Adrien Clerc and his team] -- Their contribution of the DNS Updates code is most welcome. \item[Krzysztof Wnuk] -- He has fixed, improved and extended DNS Updates support as well as provided initial support for prefix delegation. \item[Alain Durand] -- Thanks for the invitation to interop test session and for allowing me to see DHCPv6 issues in a much broader scope. \item[Petr Pisar] -- He has reported lots of bugs, and also often provides fixes. Thanks. \item[Paul Schauer] -- Thanks to his effors, Dibbler now works on Mac OS X. He did majority of the porting work and then did numerous rounds of testing and debugging. \end{description} \newpage \section{Acknowledgements} Author would like to acknowledge following projects and programmes that supported or continue to support research and development of the Dibbler software and related activities. \vspace{1cm} \noindent This work has been partially supported by the Polish Ministry of Science and Higher Education under the European Regional Development Fund, Grant No. POIG.01.01.02-00-045/09-00 \href{https://www.iip.net.pl/en/project}{Future Internet Engineering.} \begin{figure}[ht] \begin{minipage}[b]{0.27\textwidth} \centering \vspace*{\fill} \includegraphics[scale=0.45]{logo-nss} \vspace*{\fill} \end{minipage} \begin{minipage}[b]{0.28\textwidth} \centering \includegraphics[scale=0.7]{logo-iip} \end{minipage} \begin{minipage}[b]{0.16\textwidth} \centering \includegraphics[scale=0.6]{logo-pg} \end{minipage} \begin{minipage}[b]{0.26\textwidth} \centering \includegraphics[scale=0.75]{logo-eu} \end{minipage} \end{figure} \vspace{1cm} \noindent The Dibbler project was created as master thesis at \href{http://www.eti.pg.gda.pl/lang?locale=en/}{Department of Computer Communications}, at \href{http://www.eti.pg.gda.pl/lang?locale=en}{Faculty of Electronics, Telecommunications and Informations}, at \href{http://www.pg.gda.pl/en/}{Gdansk University of Technology}. \begin{figure}[ht] \begin{minipage}[b]{0.33\linewidth} \centering \includegraphics[scale=1.0]{logo-eti} \vspace{-0.8cm} \end{minipage} \begin{minipage}[b]{0.33\linewidth} \centering \includegraphics[scale=1.1]{logo-pg} \end{minipage} \hspace{0.5cm} \begin{minipage}[b]{0.33\linewidth} \centering \includegraphics[scale=0.6]{logo-kti} \end{minipage} \end{figure} \newpage dibbler-1.0.1/doc/dibbler-devel-09-misc.dox0000664000175000017500000000674612233256142015214 00000000000000/** @page faq 9. Frequently Asked Questions This section describes various Dibbler aspects. - XML files -- After performing any action, server, client and relay store their internal information into XML files. As for 0.4.1 version, those files are never read, just written. This feature can be used as a debugging tool. However, it's main purpose is the ability to process and present internal state in some external form. For example using with css styles or after processing via XSLT parsers, server statistics can be presented as a web page. - Message building -- Each TMsg object (see Messages/Msg.h) has Options list. Options (TOpt derived objects) are created (usually in the constructor). They're stored as objects. For good example, see appendRequestedOptions() method in the client messages (ClntMessages/ClntMsg.cpp). Each option and message has method storeSelf(), which is called just before message is being sent. You might ask: what about retransmissions? Message is built each time it is being resent. That might seem inefficient, but there is an option called Estimated. It specifies how long does this particular transaction is being processed. So each time retrasmission is in fact a slightly different message. It differs in that option, so UDP checksum is different, so it has to be rebuilt. @page tips 10. Tips and tricks - Linux: Running client and server on the same host requires client recompilation with specific option enabled. Please edit \c misc/Portable.h and set \b CLIENT_BIND_REUSE to true. This will allow to receive data from local server, but will also disable checking if there is another client running. So you can run multiple clients, which is a straight road to trouble. You were warned. - Ethereal, a widely used network sniffer/analyzer has a bug with parsing DHCPv6 message: SIP options are always reported as malformed. Also NIS/NIS+ options have improper values (not comformant to RFC3898). To work around that problem, download packet-dhcpv6.c from Dibbler homepage and recompile Ethereal. Dibbler's author sent patches to the Ethereal team. Those changes should be included in the next Ethereal release. \b NOTE: This is no longer true. Patch was accepted and now Ethereal prints informations properly. - If you are reading this Developer's Guide, then Hey! You're probably a developer! If you found any bugs (or think you found one), go to the http://klub.com.pl/bugzilla and report it. If your report was a mistake -- oh well, you just lost 5 minutes. But if it was really a bug, you have just helped improve next Dibbler version. - If you have any questions about Dibbler or DHCPv6, feel free to mail me, preferably via Dibbler mailing list. All links are provided on the project website. @page acknowledgements Acknowledgements Author would like to acknowledge following projects and programmes that supported or continue to support research and development of the Dibbler software and related activities. This work has been partially supported by the Polish Ministry of Science and Higher Education under the European Regional Development Fund, Grant No. POIG.01.01.02-00-045/09-00 Future Internet Engineering. \htmlonly
\endhtmlonly */dibbler-1.0.1/doc/dibbler-user-config-client.tex0000644000175000017500000014661412474451650016446 00000000000000\newpage \section{Client configuration} This section describes Dibbler server, relay and client configuration. Square brackets denotes optional values: mandatory [optional]. Alternative is marked as $\mid$. A $\mid$ B means A or B. Parsers are case-insensitive, so Iface, IfAcE, iface and IFACE mean the same. This does not apply to interface names. eth0 and ETH0 are dwo diffrent interfaces. \subsection{Data types} Config file parsing is token-based. Token can be considered a keyword or a specific phrase. Here are more commonly used types: \begin{description} \item[IPv6 address] -- IPv6 address, e.g. 2000:db8:1::dead:beef \item[32-bit decimal integer] -- string containing only numbers, e.g. 12345 \item[string] -- string of arbitrary characters enclosed in single or double quotes, e.g. 'this is a string'. If string contains only a-z, A-Z and 0-9 characters, quotes can be omited, e.g. beeblebrox \item[DUID identifier] -- hex number starting with 0x, e.g. 0x12abcd. In Dibbler version 0.8.0RC1, another format was introduced: 2 hex digits separated by colon, e.g. 12:aa:bb:cc:d5. As this format may in some cases be confused with IPv6 address, the old format (starting with 0x) remains to be supported. \item[IPv6 address list] -- IPv6 addresses separated with commas, e.g. 2001:db8:1::face:b00c, fe80::abcd:1234,::1 \item[DUID list] -- DUIDs separated with commas, e.g. 0x0123456,0x0789abcd \item[string list] -- strings separated with comas, e.g. tealc,jackson,carter,oneill \item[boolean] -- YES, NO, TRUE, FALSE, 0 or 1. Each of them can be used, when user is expected to enable or disable specific option. \end{description} \subsection{Scopes} \label{scope} There are four scopes, in which options can be specified: global, inteface, IA and address. Every option is specific for one scope. Each option is only applied to a scope and all subscopes in which it is defined. For example, T1 is defined for IA scope. If there are several interfaces and each has several address classes, repeating the same T1 value many time may be a bit awkward. Therefore parameters can be also used in more common scopes. In this case -- in interface or global. Defining T1 in interface scope means: ,,for this interface the default T1 value is ...''. The same applies to global scope. Options can be used multiple times. In that case value defined later is used. Global scope is the largest. It covers the whole config file and applies to all intefaces, IAs, and addresses, unless some lower scope options override it. Next scope is inteface. Options defined there are inteface-specific and apply to a given interface, all IAs in this interface and addresses in those IAs. Next is IA scope. Options defined there are IA-specific and apply to this IA and to addresses it contains. The narrowest scope is address or prefix. \subsubsection{Interface declaration} \label{client-scope-iface} Each system interface, which should be configured, must be mentioned in the configureation file. Interfaces can be declared with this syntax: \begin{lstlisting} iface interface-name { interface-options IA-options address-options } \end{lstlisting} or \begin{lstlisting} iface interface-number { interface-options IA-options address-options } \end{lstlisting} In the latter case, interface-number denotes interface index (or ifindex). It can be obtained from \verb+ip~l+ (Linux), \verb+ipv6~if+ (Windows) or sometime \verb+ifconfig+ on other systems. \verb+interface-name+ is an interface name. Name of the interface does not have to be enclosed in single or double quotes. It is necessary only in Windows systems, where interface names sometimes contain spaces, e.g. ''local network connection''. Interface scoped options can be used here. IA-scoped as well as address scoped options can also be used. They will be treated as a default values for future definitions of the IA and address instantations. \subsubsection{IA declaration} \label{client-scope-ia} IA is an acronym for Identity Association. It is a logical entity representing address or addresses used to perform some functions. It is not suitable for prefixes (see Section \ref{pd-declaration}). IA-options can be defined, e.g. T1. IPv6 addresses can be defined here. All those values will be used as hints for a server. Almost always, each DHCPv6 client will have exactly one IA on each interface. IA is declared using following syntax: \begin{lstlisting} ia [iaid] { IA-options address-options address-declaration } \end{lstlisting} IAID is an optional number, which describes identifier of given IA. If not specified, it will be automatically assigned integer numbers starting with 1. There may be more than one IA defined on an interface. IA and PD (see Section \ref{pd-declaration}) may be used together. \subsubsection{TA declaration} \label{client-scope-ta} TA (Temporary Address) is a mechanism very similar to IA that allows configuration of temporary addresses. See Section \ref{client-scope-ia}. \subsubsection{PD declaration} \label{pd-declaration} \label{client-scope-pd} PD (Prefix Delegation) is a mechanism that allows leasing prefixes in similar way as addresses. For details, see \cite{rfc3633}. PD in client config file causes client to send IA\_PD option. This option informs server that client is requesting prefix delegation. \begin{lstlisting} pd [iaid] { pd-options prefix-declaration } \end{lstlisting} IAID is an optional number, which identifies this particular PD. If not specified, it will be automatically assigned integer numbers starting with 1. There may be more than one PD defined on an interface. IA (see Section \ref{client-scope-ia}) may be used together. \subsubsection{Address declaration} \label{client-scope-addr} When IA is defined, it is sometimes useful to define its address. Its value will be used as a hint for the server. Address is declared in the following way: \begin{lstlisting} address [number] { address-options address-declaration } \end{lstlisting} where number is optional and denotes how many addresses with those values should be requested. If it is diffrent than 1, then IPv6 address options are not allowed. Only address scoped options can be used here. Address can be defined only within IA scope. \subsubsection{Prefix declaration} \label{client-scope-prefix} When PD is defined, it is sometimes useful to define its prefix. Its value will be used as a hint for the server. Prefix is declared in the following way: \begin{lstlisting} prefix [number] { prefix-options prefix } \end{lstlisting} \subsection{Stateless configuration} If interface does not contain \verb+IA+ or \verb+TA+ keywords, client will ask for one address (one IA with one address request will be sent). If client should not request any addresses on this interface, \opt{stateless}\footnote{In the version 0.2.1-RC1 and earlier, this directive was called no-ia. This depreciated name is valid for now, but might be removed in future releases.} keyword must be used. In such circumstances, only specified options will be requested. \subsection{Relay support} Usage of the relays is not visible from the client's point of view: Client can't detect if it communicates via relay(s) or directly with the server. Therefore no special directives on the client side are required to use relays. See section \ref{feature-relays} for details related to relay deployment. \subsection{Comments} Comments are allowed in configuration files. All common comment styles are supported: \begin{itemize} \item C++ style one-line comments: \verb+// this is comment+ \item C style multi-line comments: \verb+ /* this is multi-line comment */+ \item script style one-line comments: \verb+# this is one-line comment+ \end{itemize} \subsection{File location} \label{client-cfg-file} Client configuration file should be named \verb+client.conf+. It should be placed in the \verb+/etc/dibbler/+ directory (Linux system) or in the current directory (Windows systems). One of design requirements for client was ,,out of the box'' usage. To achieve this, simply use empty \verb+client.conf+ file. Client will try to get one address for each up and running interface. More preciselt client tries to configure each up, multicast-capable and running interface, which has link address at least 6 bytes long. This usually means that client running in auto-detection mode will not configure tunnels, which usually have IPv4 address (4 bytes long) as their link address. It should configure all wired (Ethernet) and wireless (802.11) interfaces, though. \subsection{Client Reference} \label{client-conf-reference} This section contains complete list of parameters that are allowed in client configuration file. Dibbler client supports multiple parameters. Some ore defined by the base DHCPv6 specification (a RFC 3315 document \cite{rfc3315}), e.g. IA address option. Other parameters are for definition of one of multitude of extensions that were defined for DHCPv6 protocol (e.g. prefix delegation option). Finally, there are many configuration parameters that are not options in DHCPv6 sense, but rather affect the way the software operates (e.g. log level). All those parameters may be defined in client config file. Every statement has defined scope. See Section~\ref{scope} for details. In many cases, parameters may also be defined in scopes larger than its default scope. For example, instead of configuring DNS server option on 3 interfaces, it can be defined once in global scope. \begin{description} \item[iface] -- (scope: global). Takes one parameter that can be either string (interface name) or integer (interface index). Defines that client should perform some actions on specified interface. Exact operations are defined within interface scope. Can optionally take second string parameter with the only allowed value of ``no-config''. If it is present, it instructs client to not perform any operation on said interface. See Section \ref{client-scope-iface}. \item[ia] -- (scope: interface). Defines IA\_NA (Identity Association for Non-temporary Addresses), often abbreviated as IA. That is a container for ``regular'' (non-temporary in DHCPv6 nomenclature) addresses. Simply saying, this is a client's request for a single normal address. There may be more than one ia defined on one interface. In such case, client will request several addresses. It may have one optional integer parameter that defines unique indentifier (IAID). If followed by curly brackets, it will create new IA scope. See Section \ref{client-scope-ia}. \item[ta] -- (scope: interface). Defines IA\_TA (Indentity Association for Temporary Addresses), often abbreviated as TA. This is a container for temporary addresses. Simply saying, this is a client's request for a temporary address. If followed by curly brackets, it will create new IA scope, similar to IA. See Section \ref{client-scope-ia}. Note that TA scope accepts only limited set of parameters (e.g. iaid). \item[pd] -- (scope: interface). Defines IA\_PD (Identity Association for Prefix Delegation), often abbreviated as PD. This is a container for prefixes. Simply saying, this is client's request for prefix delegation. It may have one optional integer parameter that defines unique indentifier (IAID). If followed by curly brackets, it will create new PD scope. See Sections \ref{client-scope-pd} and \ref{feature-prefix}. \item[address] -- (scope: ia or ta). Defines an IPv6 address. It is usually defined in IA or TA to specify that an address should be sent. It takes one optional parameter that defines multiplier. For example, to define 3 addresses, following syntax may be used: \begin{lstlisting} address 3 { } \end{lstlisting} If followed by curly brackets, creates new address scope. See Section \ref{client-scope-addr}. \item[prefix] -- (scope: pd). Defined an IPv6 prefix. It is defined in PD to specify that a prefix should be sent. May be empty (\verb+prefix+) or accompanied with prefix definition that consists of IPv6 address followed by slash and prefix length (e.g. \verb+prefix 2001:db8:1::/56+. If followed by curly brackets, creates new prefix scope. See Section \ref{client-scope-prefix}. \item[work-dir] -- (scope: global). Takes one string parameter. Defines working directory. \item[downlink-prefix-ifaces] -- (scope: global). Takes coma separated list of network interfaces. When client receives prefix from upstream router, it attempts to split it into remaining interfaces. It works in most cases, but if there are strange interfaces or specific requirements, this auto-selection mechanism can be disabled and list of downlink interfaces can be explicitly specified. This command is used for that purpose. See \ref{feature-prefix} and \ref{example-client-prefix}. \item[log-level] -- (scope: global). Takes one integer parameter. Defines verbose level of the log messages. The valid range is from 1 (very quiet) to 8 (very verbose). Those values are modelled after levels used in syslog. These are: 1(Emergency), 2(Alert), 3(Critical), 4(Error), 5 (Warning), 6(Notice), 7(Info) and 8(Debug). Currently Dibbler is using levels 3 to 8, as 1 and 2 are reserved for system wide emergency events. \item[log-name] -- (scope: global). Takes one string parameter. Defines than name, which will be used during logging. \item[log-mode] -- (scope: global). Takes one parameter that can be short, full, precise or syslog. Defines logging mode. In the default, full mode, name, date and time in the h:m:s format will be printed. In short mode, only minutes and seconds will be printed (this mode is useful on terminals with limited width). Precise mode logs information with seconds and microsecond precision. It is a useful as a performance diagnostic tool for finding bottlenecks in the DHCPv6 autoconfiguration process. Syslog works under POSIX systems (Linux, Mac OS X, BSD family) and allows default POSIX logging functions. \item[log-colors] -- (scope: global). Takes one boolean parameter. Defines if logs printed to console should use colors. That feature is used to enhance logs readability. As it makes the log files messy on systems that do not support colors, it is disabled by default. The default is off. \item[strict-rfc-no-routing] -- (scope: global) Takes one boolean parameter. The default value is 0. During normal operation, DHCPv6 client should add IPv6 address only (i.e. configure it with /128 prefix), without configuring routing. Routing is expected to be configured with Router Advertisements \cite{rfc4861}. Please see \href{http://klub.com.pl/bugzilla3/show_bug.cgi?id=222}{discussion in bug 222} for detailed discussion about that behavior. Note that Dibbler versions between 0.5.0RC1 and 1.0.0RC1 used to configure addressed with arbitrarily chosen (guessed) prefix length of /64. Although it was convenient for users, as in most cases the guess was correct and clients connected to the same link could ping each other immediately, its correct operation was based on the assumption that the guess is correct. If it isn't, tricky to debug problems will appear. Hosts will incorrectly assume that some off-the link hosts are on link (or vice versa) and will attempt to reach them directly. If you really understand the repercussions and still willing to use that old behavior, you can use \emph{strict-rfc-no-routing 0}. Author recommends against that, though. \item[obey-ra-bits] -- (scope: global). Rounter Advertisements contain two bits that inform what kind of DHCPv6 services are available on link. \b M (Managed) that tells that addresses and prefixes can be obtained using stateful DHCPv6. \b O (OtherConf) tells that other configuration options may be configured. Both bits are defined in \cite{rfc4861}, section 4.2. It should be noted that those bits are informational only. In the default mode (when \emph{obey-ra-bits} is absent), the client will ask for configuration options that it has specified in the configuration file. With \emph{obey-ra-bits}, the client will wait till it receives the RA message and will act according to the received bits. The default is off (\emph{obey-ra-bits} missing). Enabling \emph{obey-ra-bits} implies \emph{inactive-mode}. \item[experimental] -- (scope: global). Allows enabling experimental features. There are some highly-experimental features present in Dibbler. To make a clear statement about their experimental nature, user is required to acknowledge that fact by putting this statement in its config file. This statement may be present or absent. The default is absent. \item[addr-params] -- (scope: IA). Allows configuration of additional sub-option conveyed in IAADDR. It supplements the usual information about an address received from a server with prefix length. For example, if client received address 2001:db8:1::abcd and addr-params option contains 64, Dibbler client will configure prefix 2001:db8:1::/64 on the interface that was used to communicate with server. This is experimental feature, not defined in any standard or draft. Requires \emph{experimental} statement. See Section \ref{feature-addr-params}. \item[bind-to-address] -- If specified, it describes the address the server will bind to. This is almost never needed, unless you have more than one link-local address and one to bind to one specific. \item[remote-autoconf] -- (scope: interface). Defines that remote autoconfiguration should be performed on a given interface. This is experimental feature, so it requires \emph{experimental} statement. See Section \ref{feature-remote-autoconf}. \item[ddns-protocol] -- (scope: global). Takes one string parameter. Defines protocol that should be used during DNS Update mechanism. Allowed values are \verb+tcp+, \verb+udp+ and \verb+any+. Any means that UDP will be tried first and if it fails, update will be retried over TCP. See Section \ref{feature-dns-update}. \item[ddns-timeout] -- (scope: global). Takes one integer parameter that specifies timeout in milliseconds. Defines how long client should wait for DNS server response during DNS Update before declaring update a failure. See Section \ref{feature-dns-update}. \item[script] -- (scope: global). Takes one string parameter that specifies script name. When dibbler client receives some options it normally sets them up in the system on its own. However, besides of setting up all parameters directly, dibbler client can execute external script. See Section \ref{feature-script} for details. \item[stateless] -- (scope: global). It may be present or missing. The default is missing. Defines that client should run in stateless mode. In this mode only configuration parameters are defined, not addresses or prefixes. It is mutually exclusive with \emph{ia}, \emph{ta} and \emph{pd}. See Section \ref{feature-stateless-stateful}. \emph{No-ia}, an alias to that command used to be supported, but due to misleading name its support was dropped in 0.8.1RC1. \item[anonymous-inf-request] -- (scope: global). When running in a stateless mode, client does not ask for addresses or prefixes, but rather requests some general options. By default, it sends its client identifier (DUID) to the server. However, it is possible to omit this identifier, so the \msg{INF-REQUEST} messages will be anonymous. This global option causes client to act in such anonymous way. \item[inactive-mode] -- (scope: global). This parameter may be present or absent. The default is absent. Normally (with inactive-mode disabled) client tries to bind all interfaces defined in configuration file. If such attempt fails, client reports an error and gives up. In some cases it is possible that interface is not ready yet, e.g. WLAN interface did not complete association. It is possible to modify client behavior, so it will accept downed and not running interfaces. To do so, inactive-mode must be enabled. In this mode, client will accept inactive interfaces, will add them to inactive list and will periodically monitor its state. When the interface finally becomes available, client will try to configure it. See section \ref{feature-inactive-mode} for details. \item[insist-mode] -- (scope: global). Client can be instructed to obtain several configuration options, like DNS server configuration or domain name. It is possible that server will not provide all requested options. Older versions of the dibbler client had been very aggressive in such case. It tried very hard to obtain options that user specified in config file. To do so, it did send \msg{INF-REQUEST} to obtain such option. This behavior has changed. Right now when client does not receive all requested options, it will complain, but will take no action. To enable old behavior, so called insist-mode has been added. Insist-mode will also affect the way addresses are requested. If address was specified in config file, client will request it in \msg{REQUEST} message, rather than sending address offered by server in \msg{ADVERTISE} as it is typically done. See Section \ref{feature-insist-mode} for details. \item[skip-confirm] -- (scope: global). Support for \msg{CONFIRM} messages was added in 0.8.0RC1. With it, client may send \msg{CONFIRM} when link state change is detected (e.g. switching to possibly new WiFi access-point or replugging Ethernet cable). Client also sends \msg{CONFIRM} after restart if there are still valid leases found in locally stored databased. \emph{skip-confirm} will disable any actions that would result in \msg{CONFIRM} transmissions. In particular, link state will not be detected and client will ignore its previous address during startup. %%% TODO: Add reconfigure accept here \item[duid-type] -- (scope: global). Takes one parameter. Allowed values are DUID-LLT, DUID-LL or DUID-EN. The default is DUID-LLT. This parameter defines, what type of DUID should be generated if there is no DUID already present. If there is a file containing DUID, this directive has no effect. DUID-LLT means that DUID will be based on link layer address as well as time. DUID-LL means that only link layer address will be used. The last value -- DUID-EN -- Enterprise Number-based generation has a slightly different syntax: \begin{lstlisting} duid-type duid-en enterprise-number enterprise-id. \end{lstlisting} For example: \verb+duid-type duid-en 1234 0x6789abcd+ means that enterprise number is set to 1234 and unique number from that company's pool is 67:89:ab:cd (hexadecimal value of arbitrary length). See section \ref{feature-duid-types} for details. \item[option fqdn-s] -- (scope: global). Takes one boolean parameter and has the default value of 1. The S bit is used in FQDN option. It is used to negotiate, which side (server or client) wants to perform DNS Update procedure. See \cite{rfc4704} for details. In general, if you don't know that this option does, you don't want to modify this. \item[option fqdn] -- (scope: interface). Takes optional domain name as parameter. This option instructs client to send FQDN option. This option has 2 purposes. The first one is to negotiated or request Fully Qualified Domain Name for this client. The second one is to negotiate, who (client or server) should perform DNS Update. If optional parameter is specified, it will be sent in the FQDN option. Otherwise FQDN will be sent with empty name. This option is defined in \cite{rfc4704}. See Section \ref{feature-dns-update} for details. \item[rapid-commit] -- (scope: interface). Takes one boolean parameter. The default is 0. This option allows rapid commit procedure to be performed. Note that enabling rapid-commit on the client side is not enough. server must be configured to allow rapid commit, too. \item[unicast] -- (scope: interface). Takes one boolean parameter. The default value is 0. This option specifies if client should request unicast communication from the server. If server is configured to allow it, it will add unicast option to its replies. It will allow client to communicate with server via unicast addresses instead of usual multicast. \item[preferred-servers] -- (scope: interface). Takes list of addresses or list of DUIDs. The default value is empty. This list defines, which servers are preferred. When client sends \msg{SOLICIT} message, all servers available in the local network will respond. When client receives multiple \msg{ADVERTISE} messages, it will choose those sent by servers mentioned on the preferred-server list. Otherwise the best server will be chosen. Note that this parameter used to be spelled differently (single R). Old spelling is still supported, but is deprecated and will be removed soon. \item[reject-servers] -- (scope: interface). Takes list of addresses or list of DUIDs. The default value is empty. This list defines which server must be ignored. It has opposite meaning to the prefered-servers list. Servers mentioned here will never be chosen. \item[vendor-spec] -- (scope: interface). This option allow requesting for a vendor specific configuration option or options. Although there are no vendor-specific (i.e. specific for Dibbler) parameters, it can be used to test some other DHCPv6 server implementations. It takes coma separated list following tokens: type (integer), type(integer) -- enterprise(number). It allows definition of just vendor-specific option and/or vendor-specific option with specific enterprise. See feature description in Section \ref{feature-vendor-spec}. \item[T1] -- (scope: IA or PD) Takes one parameter that specifies T1 hint sent to a server. The default value is $2^{32}-1$ and is expressed in seconds. T1 value assigned by server defines after what time client should start renew process. This is only a hint for the server. Actual value will be provided by the server. \item[T2] -- (scope: IA or PD). Takes one parameter that specifies T2 hint sent to a server. The default value is default:$2^{32}-1$ and is expressed in seconds. This value defines hint for T2. T2 assigned by server defined after what time client will start emergency rebind procedure if renew process fails. This is only a hint for the server. Actual value will be provided by the server. \item[valid-lifetime] -- (scope:address or prefix). Takes one integer parameter that defined requested valid lifetime for address or prefix. The default value is $2^{32}-1$. This parameter is expressed in seconds. This parameter defines valid lifetime of an address. It will be used as a hint for a server, when the client sends \msg{REQUEST} messages. \item[preferred-lifetime] -- (scope:address or prefix). type: integer, default:$2^{32}-1$) This parameter defines prefered lifetime of an address. It will be used as a hint for a server, when there client sends \msg{REQUEST} messages. Note that this parameter used to be spelled differently (single R). Old spelling is still supported, but is deprecated and will be removed soon. \item[option dns-server] -- (scope: interface). Takes optional address list as parameter. This option conveys information about DNS servers available. After retriving this information, client will be able to resolve domain names into IP (both IPv4 and IPv6) addresses. If address list is not specified, client will just request dns-server option from a server. If it is specified, listed addresses will be sent to server as hints. Defined in \cite{rfc3596}. \item[option domain] -- (scope: interface). Takes optional domain list as parameter. This option is used for retriving domain or domains names, which the client is connected in. For example, if client's hostname is \verb+alice.mylab.example.com+ and it wants to contact \verb+bob.mylab.example.com+ it can simply refer to it as \verb+bob+. Without domain name configured, it would have to use full domain name. If optional domain list if defined, it will be sent to server as a hint. Defined in \cite{rfc3596}. \item[option ntp-server] -- (scope: interface). Takes optional address list as parameter. This option defines information about available NTP servers. Network Time Protocol \cite{rfc2030} is a protocol used for time synchronisation, so all hosts in the network has the same proper time set. If address list is specified, it will be sent to server as a hint. Defined in \cite{rfc4075}. \item[option time-zone] -- (scope: interface). Optionally takes one string parameter that specifies requested timezone. It is possible to retrieve timezone from the server. If client is interested in this information, it should ask for this option. Note that this option is considered obsolete as it is mentioned in draft version only \cite{draft-timezone}. Work on this draft seems to be abandoned as similar functionality is provided in now standard \cite{rfc4075}. Unfortunately, it is not supported in Dibbler yet. \item[option sip-server] -- (scope: interface). Takes optional address list as parameter. Session Initiation Protocol (SIP) \cite{rfc3263} is a control protocol for creating, modifying, and terminating sessions with one or more participants. These sessions include Internet telephone calls, multimedia distribution, and multimedia conferences, including VoIP phones. If address list is specified, it will be sent as a hint for a server. Format of this option is defined in \cite{rfc3319}. \item[option sip-domain] -- (scope: interface). Takes optional list of domains. It is possible to define domain names for Session Initiation Protocol \cite{rfc3263}. Configuration of this parameter will ease usage of domain names in the SIP protocol. If domain list is specified, it will be sent as a hint for a server. Format of this option is defined in \cite{rfc3319}. \item[option nis-server] -- (scope: interface). Takes optional address list as parameter. Network Information Service (NIS) is a Unix-based system designed to use common login and user information on multiple systems, e.g. universities, where students can log on to ther accounts from any host. To use this functionality, a host needs information about NIS server's address. This can be retrieved with this option. If address list is specified, it will be sent as a hint for a server. Its format is defined in \cite{rfc3898}. \item[option nis-domain] -- (scope: interface). Takes optional list of domains. Network Information Service (NIS) can albo specify domain names. It can be configured with this option. If domain list is specified, it will be sent as a hint for a server. It is defined in \cite{rfc3898}. \item[option nis+-server] -- (scope: interface). Takes optional address list as parameter. Network Information Service Plus (NIS+) is an improved version of the NIS protocol. If address list is specified, it will be sent as a hint for a server. This option is defined in \cite{rfc3898}. \item[option nis+-domain] -- (scope: interface). Takes optional list of domains. Similar to nis-domain, it defines domains for NIS+. If domain list is specified, it will be sent as a hint for a server. This option is defined in \cite{rfc3898}. \item[option lifetime] -- (scope: interface). This statement can be present or missing. The default is missing. Base spec of the DHCPv6 protocol does offers way of refreshing addresses only, but not the options. Lifetime defines, how often client would like to renew all its options. By default client will not send such option, but it will accept it and act accordingly if the server sends it on its own. Format of this option is defined in \cite{rfc4242}. \item[option aftr] -- (scope: interface). In networks that deploy Dual-Stack Lite architecture \cite{rfc6333}, client (B4) needs to configure DS-Lite tunnel. Client may obtain information about AFTR (a remote tunnel endpoint). This option conveys fully qualified domain name. This statement instructs client to request such option. It is defined in defined in \cite{rfc6334}. \item[option] -- (scope: interface). There are number of options supported by Dibbler. There may be cases, however, when user wants to specify its own options. Several syntaxes are supported: \begin{lstlisting} option number - hexstring option number address-keyword address option number address-list option number string-keyword string option number address-keyword request-keyword option number string request-keyword option number address-list request-keyword \end{lstlisting} where number designates option number, address-keyword is word ``address'', address is an IPv6 address, address-list is coma separated list of IPv6 addresses, string-keyword is a word ``string'' and request-keyword is a word ``request''. See Section \ref{feature-custom-options}. \item[auth-protocol] -- (scope: global, type: string, default: none). This is a crucial parameter that specifies which authorization/authentication protocol is used. Allowed values are: \texttt{none}, \texttt{delayed}, \texttt{reconfigure-key} and \texttt{dibbler}. See section \ref{feature-auth} for details. \item[auth-methods] -- (scope: global). Takes coma separated list of accepted authentication methods methods that client will accept from server. If this list is empty, any method will be accepted. The first method on the list is the default one. Possible values are: \texttt{none}, \texttt{digest-plain}, \texttt{digest-hmac-md5}, \texttt{digest-hmac-sha1}, \texttt{digest-hmac-sha224}, \texttt{digest-hmac-sha256}, \texttt{digest-hmac-sha384}, and \texttt{digest-hmac-sha512}. \item[auth-replay] -- (scope: global, type: string, default: none). Specifies which replay detection methods are supported. Currently two values are implemented: \texttt{none} and \texttt{monotonic}. \item[auth-required] -- (scope: global, type: boolean, default: 0). This parameter specifies if the client is required to authenticate itself. When set to 0, any client authentication failures (invalid signature or lack of \opt{AUTH} option) will result in a warning only. When set to 1, such messages will be dropped. \item[route] -- (scope: interface). Takes one boolean parameter that defines if routing information should requested or not. The default value is false. See Section \ref{feature-routing}. \end{description} After receiving options values from a server, client stores values of those options in separate files in the working directory (\verb+/var/lib/dibbler+ in POSIX systems (Linux, Mac OS X and BSD) and current directory in Windows). File names start with the option word, e.g. \verb+option-dns-server+. Dibbler client can also call user defined script after parameters are assigned or removed. Dibbler client also sets DNS servers and domain names on its own on most systems. \subsection{Client Configuration Examples} This subsection contains various examples of the most popular configurations. Several additional examples are provided with the source code. Please download it and look at \verb+*.conf+ files. \subsubsection{Example 1: Default} In the most simple case, client configuration file can be empty. Client will try to assign one address for every interface present in the system, except interfaces, which are: \begin{itemize} \item down (flag UP not set) \item loopback (flag LOOPBACK set) \item not running (flag RUNNING not set) \item not multicast capable (flag MULTICAST not set) \item have link-layer address less than 6 bytes long (this requirement should skip all tunnels and virtual interfaces) \end{itemize} If you must use DHCPv6 on one of such interfaces (which is not recommended and such attempt probably will fail), you must explicitly specify this interface in the configuration file. \subsubsection{Example 2: DNS} Configuration mentioned in previous subsection is a minimal one and in a real life will be used rarely. The most common usage of the DHCPv6 protocol is to request for an address and DNS configuration. Client configuration file achieving those goals is presented below: \begin{lstlisting} # client.conf log-mode short log-level 7 iface eth0 { ia option dns-server } \end{lstlisting} \subsubsection{Example 3: Timeouts and specific address} \label{example-specific-addrs} Automatic configuration is being driven by several timers, which define, what action should be performed at various intervals. Since all values are provided by the server, client can only define values, which will be sent to a server as hints. Server might take them into consideration, but might also ignore them completely. Following example shows how to ask for a specific address and provide hints for a server. Client would like to get 2000::1:2:3 address, it would like to renew addresses once in 30 minutes (T1 timer is set to 1800 seconds). Client also would like to have address, which is prefered for an hour and is valid for 2 hours. Note: The format has changed in 1.0.0RC2. \begin{lstlisting} # client.conf log-mode short log-level 7 iface eth0 { T1 1800 T2 2000 prefered-lifetime 3600 valid-lifetime 7200 ia { address 2000::1:2:3 } } \end{lstlisting} There are multiple ways in which addresses can be requested in ia. This syntax was implemented more for completeness, rather than having practical utility. It is mentioned here for reference. \begin{lstlisting} # client.conf iface eth0 { T1 1800 T2 2700 ia // Send just an empty IA ia { // Send an IA with one (any, ::) address address } ia { // Send an IA with five (any, ::) addresses address 5 } ia { // Send an IA with address 2001:db8::1 address 2001:db8::1 } ia { // Send an IA with one (any, ::) address with specific parameters address { preferred-lifetime 3600 } } ia { // Send an IA with five (any, ::) addresses with specific parameters address 5 { preferred-lifetime 3600 } } ia { // Send an IA with address 2001:db8::1 address 2001:db8::1 { preferred-lifetime 3600 } } } \end{lstlisting} \subsubsection{Example 4: More than one address} Another example: client would like to obtain 2 addresses on wifi0 interface. They are necessary since this particular interface name contains spaces. It is possible to do this in two ways. First is to sent 2 Identity Associations (IA for short). Identity Association is a nice name for a addresses container. This appears to be a most common way of telling server that this client is interested in more than one address. \begin{lstlisting} # client.conf log-mode short log-level 5 iface wifi0 { ia ia } \end{lstlisting} Another way it to send one IA, but include two address hints in it. Server may take them into consideration (dibbler server does), but some other DHCPv6 implementations may ignore those hints. \begin{lstlisting} # client.conf log-mode short log-level 5 iface wifi0 { ia { address address } } \end{lstlisting} \subsubsection{Example 5: Quick configuration using Rapid-commit} Rapid-commit is a shortened exchange with server. It consists of only two messages, instead of the usual four. It is worth to know that both sides (client and server) must also support rapid-commit to use this fast configuration. \begin{lstlisting} # client.conf iface eth1 { rapid-commit yes ia option dns-server } \end{lstlisting} \subsubsection{Example 6: Stateless mode} Client can be configured to work in a stateless mode. It means that it will obtain only some configuration parameters, but no addresses. Let's assume we want all the details stored in a log file and we want to obtain all possible configuration parameters. Here is a configuration file: \begin{lstlisting} # client.conf log-level 8 log-mode full stateless iface eth0 { option dns-server option domain option ntp-server option time-zone option sip-server option sip-domain option nis-server option nis-domain option nis+-server option nis+-domain } \end{lstlisting} \subsubsection{Example 7: Dynamic DNS (FQDN)} \label{example-client-fqdn} Dibbler client is able to request fully qualified domain name, i.e. name, which is fully resolvable using DNS. After receiving such name, it can perform DNS Update procedure. Client can ask for any name, without any preferrence. Here is an example how to configure client to perform such task: \begin{lstlisting} # client.conf # Set protocol to one of the following values: udp, tcp, any ddns-protocol udp # Sets DDNS Update timeout (in ms) ddns-timeout 800 # uncomment following line to force S bit to 0 # option fqdn-s 0 log-level 7 iface eth0 { # ask for one address ia # ask for options option dns-server option domain option fqdn # ask for fully qualified domain name (any name will do) option fqdn # you can also provide hint for the server regarding preferred name # option fqdn dexter.example.org } \end{lstlisting} In this case, client will mention that it is interested in FQDN by using Option Request and empty FQDN option, as specified in \cite{rfc4704}. Server upon receiving such request (if it is configured to support it), will provide FQDN option containing domain name. Depending on the server's configuration, all DNS Updates will be performed by the server, forward will be performed by client and reverse by the server, or only forward will be done by a client. It is also possible for client to provide its name as a hint for server. Server might take it into consideration when it will choose a name for this client. To send specific hostname, additional parameter (a string with a fully qualified domain name) should be specified. Two additional parameters were introduced in Dibbler 0.8.1. \verb+ddns-protocol+ specifies protocol that should be used for communication with DNS server. Allowed values are \verb+udp+, \verb+tcp+ or \verb+any+. ``Any'' will try to use UDP and if that fails, it will revert to TCP. Second parameter is \verb+ddns-timeout+ that specifies maximum time allowed for DNS server to respond before assuming communication failure. It is specified in milliseconds. Note that to successfully perform DNS Update, address must be assigned and dns server address must be known. Therefoe ``ia'' and ``option dns-server'' are required for ``option fqdn'' to work properly. Also if DHCPv6 server provides more than one DNS server address, update will be attempted only for the first address on the list. It is also possible to force S bit in the FQDN option to 0 or 1. See \cite{rfc4704} for details regarding its meaning. \subsubsection{Example 8: Interface indexes} Usually, interface names are referred to by names, e.g. eth0 or Local Area Connection. Every system also provides unique number associated with each infterface, usually called ifindex or interface index. It is possible to read the number using \verb+ip l+ command (Linux) or \verb+ipv6 ifx+. Below is an example, which demonstrate how to use interface indexes: \begin{lstlisting} # client.conf log-mode short log-level 5 iface 5 { ia } \end{lstlisting} \subsubsection{Example 9: Vendor-specific options} \label{example-client-vendor-spec} It is possible to configure dibbler-client to ask for a vendor specific options. Although there are no dibbler-specific features to configure, it is possible to use this option to test other server implementations. This option will rather be used by network engineers and power network admins, rather than normal end users. There are 3 ways to define, how dibbler-client can request vendor-specific options. First choice: It can just ask for this option (only \opt{option request option} will be sent). Second choice: it can ask for vendor-spec option by adding such option with enterprise number set, but no actual data. Third choice: send this option and include both enterprise number and actual data. In the following configuration file example, uncomment appropriate line to obtain desired bahavior: \begin{lstlisting} # client.conf log-level 8 iface eth0 { # ask for address ia # uncomment only one of the following lines: option vendor-spec # option vendor-spec 1234 # option vendor-spec 1234 5678 # To ask for multiple vendor-spec options, uncomment: # option vendor-spec 123,456 } \end{lstlisting} Although that is almost never needed, it is possible to configure client to request multiple vendor-specific options at the same time. That feature is mainly used as a test tool for the server. To use it, uncomment last line in the example above. \subsubsection{Example 10: Unicast communication} Client would like to obtain an address on ,,Local Area Connection'' interface. Note quotation marks around interface name. They are necessary since this particular interface name contains spaces. Client also would like to accept Unicast communication if server supports it. User wants all information to be logged via Linux syslog daemon. Take note that you won't be able see to what Dibbler is doing with such low log-level. (Usually log-level should be set to 7, which is also a default value). \begin{lstlisting} # client.conf log-mode syslog log-level 5 iface "Local Area Connection" { unicast yes ia ia } \end{lstlisting} \subsubsection{Example 11: Prefix delegation} \label{example-client-prefix} From the client's point of view, configuration is quite simple. It is required to specify that this client is interested in prefix delegation. See section \ref{feature-prefix} for background information related to prefix delegation and sections \ref{example-server-prefix} and \ref{example-server-prefixes} for details about server configuration. To ask for prefix delegation, emph{prefix-delegation} (or \emph{pd}) should be used. \begin{lstlisting} # client.conf iface "eth0" { ia // ask for address pd // ask for prefix } \end{lstlisting} It is possible to define additional parameters for a prefix: \begin{lstlisting} # client.conf iface eth0 { pd { t1 1000 t2 2000 } } \end{lstlisting} Client (requesting router in PD nomenclature) receives prefix from upstream router and tries to auto-select downstream interfaces. It tries to use interfaces that are up, running, multicast-capable, with MAC address at least 6 bytes long and were not used to obtain prefix. If this algorithm does not work in your case (e.g. because you want to use prefixes on other interfaces or you want some interfaces to be skipped), it is possible to explicitly enumerate downstream interfaces using \emph{downlink-prefix-ifaces}: \begin{lstlisting} # client.conf # received prefix will be split among following interfaces downlink-prefix-ifaces eth1, eth5 # Ask for prefix over eth0 iface eth0 { pd } \end{lstlisting} If you do not want Dibbler to split the prefixes automatically, it is possible to do so by specifying \emph{"none"} as the interface name. Note that this will render PD mechanism useless, unless you also use a script and do the delegated prefix processing on your own. \begin{lstlisting} # client.conf # Dibbler client should not split received prefixes on its own downlink-prefix-ifaces "none" # You need to provide your own script to handle prefixes script "/var/lib/dibbler/client-pd-split.sh" # Ask for prefix over eth0 iface eth0 { pd } \end{lstlisting} Prefix hints can be specified in the similar way as addresses (see \ref{example-specific-addrs}, except that multiple prefixes syntax is not supported. \begin{lstlisting} # client.conf log-level 8 iface eth0 { T1 1800 T2 2700 pd // Send just an empty PD pd { // Send a PD with one (any, ::/0) prefix prefix } pd { // Send an PD with a specific prefix prefix 2001:db8::1 / 64 } pd { // Send an PD with one (any, ::/0) prefix with specific parameters prefix { preferred-lifetime 3600 } } pd { // Send an PD with a specific prefix and specific parameters prefix 2001:db8::1 /64 { preferred-lifetime 3600 } } } \end{lstlisting} \subsubsection{Example 12: Insist mode} \label{example-client-insistmode} During normal operation, when client asks for an option, but does not receive it from the server, it complain, but takes no action. To force client to insist (i.e. ask over and over again), so called insist mode has been introduced. See section \ref{feature-insist-mode} for extended explanation. \begin{lstlisting} insist-mode iface "eth0" { ia option dns-server option domain option ntp-server } \end{lstlisting} \subsubsection{Example 13: Inactive mode} \label{example-client-inactivemode} Usually client starts when network interfaces are operational. Normally downed or nonexisting interfaces mentioned in the configuration file are considered misconfiguration and client refuses to start. However, sometimes that is not the case, e.g. still waiting to be associated wireless interfaces. To allow operation in such circumstances, inactive mode has been added. See \ref{feature-inactive-mode} for detailed explanation. interfaces are spec \begin{lstlisting} inactive-mode iface "eth0" { ia } \end{lstlisting} \subsubsection{Example 14: Dibbler Authentication} \label{example-client-auth} Authentication is enabled. Client will accept HMAC-SHA-512, HMAC-MD5 and HMAC-SHA-256 as an authentication method. \begin{lstlisting} # client.conf log-mode short log-level 7 auth-protocol dibbler auth-replay monotonic auth-required 1 auth-methods digest-hmac-sha512, digest-hmac-md5, digest-hmac-sha256 iface eth0 { } \end{lstlisting} \subsubsection{Example 15: Skip Confirm} \label{example-client-confirm} Client detects if previous client instance was not shutdown properly (due to power outage, client crash or similar event). In such case, it reads existing address database and checks if assigned addresses may still be valid. If that is so, it tries to confirm those addresses by using \msg{CONFIRM} message. If user don't want \msg{CONFIRM} message to be send and client should start ''from scratch'' every time, it is possible to disable confirm support. \begin{lstlisting} # client.conf log-mode short log-level 7 skip-confirm iface eth0 { ia } \end{lstlisting} \subsubsection{Example 15: User-defined IAID} \label{example-client-iaid} Sometimes it is useful to define specific IAID identifiers. That is rather uncommon, but possible. This technique can be used for both addresses (IA\_NA options) and prefixes (IA\_PD options). \begin{lstlisting} # client.conf iface "eth0" { ia 123 option dns-server option domain } \end{lstlisting} \subsubsection{Example 16: DS-Lite tunnel (AFTR)} \label{example-server-ds-lite} Server may provide information about AFTR (a Dual Stack Lite tunnel endpoint) to the clients, as specified in \cite{rfc6334}. \begin{lstlisting} iface "eth0" { ia option aftr # request name of the remote DS-Lite tunnel endpoint } \end{lstlisting} \subsubsection{Example 17: Custom options} Client is able to ask for custom options, that are not supported by default. Following config file allows client to ask for many options. Also, see Section \ref{feature-custom-options} for extended explanation. Note that the syntax changed slightly after Dibbler 0.8.3 was released. \begin{lstlisting} #client.conf iface "eth0" { ia # This will send specified option value option 145 hex 01:02:a3:b4:c5:dd:ea option 146 address 2001:db8:1::dead:beef option 147 address-list 2001:db8:1::aaaa,2001:db8:1::bbbb option 148 string "secretlair.example.org" # This will request specific options and interpret responses option 149 hex option 150 address option 151 address-list option 152 string \end{lstlisting} \subsubsection{Example 18: Remote Autoconfiguration} Client is able to use experimental extension to ask for configuration remotely. See Section \ref{feature-remote-autoconf} for details. \begin{lstlisting} log-mode short log-level 8 experimental remote-autoconf iface "eth0" { ia unicast 1 option dns-server option domain option nis-server option nis-domain option nis+-server option nis+-domain option time-zone option lifetime } \end{lstlisting} dibbler-1.0.1/doc/doxygen.cfg0000664000175000017500000017564112561700376012767 00000000000000# Doxyfile 1.6.1 # This file describes the settings to be used by the documentation system # doxygen (www.doxygen.org) for a project # # All text after a hash (#) is considered a comment and will be ignored # The format is: # TAG = value [value, ...] # For lists items can also be appended using: # TAG += value [value, ...] # Values that contain spaces should be placed between quotes (" ") #--------------------------------------------------------------------------- # Project related configuration options #--------------------------------------------------------------------------- # This tag specifies the encoding used for all characters in the config file # that follow. The default is UTF-8 which is also the encoding used for all # text before the first occurrence of this tag. Doxygen uses libiconv (or the # iconv built into libc) for the transcoding. See # http://www.gnu.org/software/libiconv for the list of possible encodings. DOXYFILE_ENCODING = UTF-8 # The PROJECT_NAME tag is a single word (or a sequence of words surrounded # by quotes) that should identify the project. PROJECT_NAME = "Dibbler - a portable DHCPv6" # The PROJECT_NUMBER tag can be used to enter a project or revision number. # This could be handy for archiving the generated documentation or # if some version control system is used. PROJECT_NUMBER = 1.0.1 # The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) # base path where the generated documentation will be put. # If a relative path is entered, it will be relative to the location # where doxygen was started. If left blank the current directory will be used. OUTPUT_DIRECTORY = . # If the CREATE_SUBDIRS tag is set to YES, then doxygen will create # 4096 sub-directories (in 2 levels) under the output directory of each output # format and will distribute the generated files over these directories. # Enabling this option can be useful when feeding doxygen a huge amount of # source files, where putting all generated files in the same directory would # otherwise cause performance problems for the file system. CREATE_SUBDIRS = YES # The OUTPUT_LANGUAGE tag is used to specify the language in which all # documentation generated by doxygen is written. Doxygen will use this # information to generate all constant output in the proper language. # The default language is English, other supported languages are: # Afrikaans, Arabic, Brazilian, Catalan, Chinese, Chinese-Traditional, # Croatian, Czech, Danish, Dutch, Esperanto, Farsi, Finnish, French, German, # Greek, Hungarian, Italian, Japanese, Japanese-en (Japanese with English # messages), Korean, Korean-en, Lithuanian, Norwegian, Macedonian, Persian, # Polish, Portuguese, Romanian, Russian, Serbian, Serbian-Cyrilic, Slovak, # Slovene, Spanish, Swedish, Ukrainian, and Vietnamese. OUTPUT_LANGUAGE = English # If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will # include brief member descriptions after the members that are listed in # the file and class documentation (similar to JavaDoc). # Set to NO to disable this. BRIEF_MEMBER_DESC = YES # If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend # the brief description of a member or function before the detailed description. # Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the # brief descriptions will be completely suppressed. REPEAT_BRIEF = YES # This tag implements a quasi-intelligent brief description abbreviator # that is used to form the text in various listings. Each string # in this list, if found as the leading text of the brief description, will be # stripped from the text and the result after processing the whole list, is # used as the annotated text. Otherwise, the brief description is used as-is. # If left blank, the following values are used ("$name" is automatically # replaced with the name of the entity): "The $name class" "The $name widget" # "The $name file" "is" "provides" "specifies" "contains" # "represents" "a" "an" "the" ABBREVIATE_BRIEF = "The $name class" \ "The $name widget" \ "The $name file" \ is \ provides \ specifies \ contains \ represents \ a \ an \ the # If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then # Doxygen will generate a detailed section even if there is only a brief # description. ALWAYS_DETAILED_SEC = NO # If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all # inherited members of a class in the documentation of that class as if those # members were ordinary class members. Constructors, destructors and assignment # operators of the base classes will not be shown. INLINE_INHERITED_MEMB = NO # If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full # path before files name in the file list and in the header files. If set # to NO the shortest path that makes the file name unique will be used. FULL_PATH_NAMES = NO # If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag # can be used to strip a user-defined part of the path. Stripping is # only done if one of the specified strings matches the left-hand part of # the path. The tag can be used to show relative paths in the file list. # If left blank the directory from which doxygen is run is used as the # path to strip. STRIP_FROM_PATH = # The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of # the path mentioned in the documentation of a class, which tells # the reader which header file to include in order to use a class. # If left blank only the name of the header file containing the class # definition is used. Otherwise one should specify the include paths that # are normally passed to the compiler using the -I flag. STRIP_FROM_INC_PATH = # If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter # (but less readable) file names. This can be useful is your file systems # doesn't support long names like on DOS, Mac, or CD-ROM. SHORT_NAMES = NO # If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen # will interpret the first line (until the first dot) of a JavaDoc-style # comment as the brief description. If set to NO, the JavaDoc # comments will behave just like regular Qt-style comments # (thus requiring an explicit @brief command for a brief description.) JAVADOC_AUTOBRIEF = NO # If the QT_AUTOBRIEF tag is set to YES then Doxygen will # interpret the first line (until the first dot) of a Qt-style # comment as the brief description. If set to NO, the comments # will behave just like regular Qt-style comments (thus requiring # an explicit \brief command for a brief description.) QT_AUTOBRIEF = NO # The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen # treat a multi-line C++ special comment block (i.e. a block of //! or /// # comments) as a brief description. This used to be the default behaviour. # The new default is to treat a multi-line C++ comment block as a detailed # description. Set this tag to YES if you prefer the old behaviour instead. MULTILINE_CPP_IS_BRIEF = NO # If the INHERIT_DOCS tag is set to YES (the default) then an undocumented # member inherits the documentation from any documented member that it # re-implements. INHERIT_DOCS = YES # If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce # a new page for each member. If set to NO, the documentation of a member will # be part of the file/class/namespace that contains it. SEPARATE_MEMBER_PAGES = NO # The TAB_SIZE tag can be used to set the number of spaces in a tab. # Doxygen uses this value to replace tabs by spaces in code fragments. TAB_SIZE = 4 # This tag can be used to specify a number of aliases that acts # as commands in the documentation. An alias has the form "name=value". # For example adding "sideeffect=\par Side Effects:\n" will allow you to # put the command \sideeffect (or @sideeffect) in the documentation, which # will result in a user-defined paragraph with heading "Side Effects:". # You can put \n's in the value part of an alias to insert newlines. ALIASES = # Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C # sources only. Doxygen will then generate output that is more tailored for C. # For instance, some of the names that are used will be different. The list # of all members will be omitted, etc. OPTIMIZE_OUTPUT_FOR_C = NO # Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java # sources only. Doxygen will then generate output that is more tailored for # Java. For instance, namespaces will be presented as packages, qualified # scopes will look different, etc. OPTIMIZE_OUTPUT_JAVA = NO # Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran # sources only. Doxygen will then generate output that is more tailored for # Fortran. OPTIMIZE_FOR_FORTRAN = NO # Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL # sources. Doxygen will then generate output that is tailored for # VHDL. OPTIMIZE_OUTPUT_VHDL = NO # Doxygen selects the parser to use depending on the extension of the files it parses. # With this tag you can assign which parser to use for a given extension. # Doxygen has a built-in mapping, but you can override or extend it using this tag. # The format is ext=language, where ext is a file extension, and language is one of # the parsers supported by doxygen: IDL, Java, Javascript, C#, C, C++, D, PHP, # Objective-C, Python, Fortran, VHDL, C, C++. For instance to make doxygen treat # .inc files as Fortran files (default is PHP), and .f files as C (default is Fortran), # use: inc=Fortran f=C. Note that for custom extensions you also need to set # FILE_PATTERNS otherwise the files are not read by doxygen. EXTENSION_MAPPING = # If you use STL classes (i.e. std::string, std::vector, etc.) but do not want # to include (a tag file for) the STL sources as input, then you should # set this tag to YES in order to let doxygen match functions declarations and # definitions whose arguments contain STL classes (e.g. func(std::string); v.s. # func(std::string) {}). This also make the inheritance and collaboration # diagrams that involve STL classes more complete and accurate. BUILTIN_STL_SUPPORT = NO # If you use Microsoft's C++/CLI language, you should set this option to YES to # enable parsing support. CPP_CLI_SUPPORT = NO # Set the SIP_SUPPORT tag to YES if your project consists of sip sources only. # Doxygen will parse them like normal C++ but will assume all classes use public # instead of private inheritance when no explicit protection keyword is present. SIP_SUPPORT = NO # For Microsoft's IDL there are propget and propput attributes to indicate getter # and setter methods for a property. Setting this option to YES (the default) # will make doxygen to replace the get and set methods by a property in the # documentation. This will only work if the methods are indeed getting or # setting a simple type. If this is not the case, or you want to show the # methods anyway, you should set this option to NO. IDL_PROPERTY_SUPPORT = YES # If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC # tag is set to YES, then doxygen will reuse the documentation of the first # member in the group (if any) for the other members of the group. By default # all members of a group must be documented explicitly. DISTRIBUTE_GROUP_DOC = NO # Set the SUBGROUPING tag to YES (the default) to allow class member groups of # the same type (for instance a group of public functions) to be put as a # subgroup of that type (e.g. under the Public Functions section). Set it to # NO to prevent subgrouping. Alternatively, this can be done per class using # the \nosubgrouping command. SUBGROUPING = YES # When TYPEDEF_HIDES_STRUCT is enabled, a typedef of a struct, union, or enum # is documented as struct, union, or enum with the name of the typedef. So # typedef struct TypeS {} TypeT, will appear in the documentation as a struct # with name TypeT. When disabled the typedef will appear as a member of a file, # namespace, or class. And the struct will be named TypeS. This can typically # be useful for C code in case the coding convention dictates that all compound # types are typedef'ed and only the typedef is referenced, never the tag name. TYPEDEF_HIDES_STRUCT = NO # The SYMBOL_CACHE_SIZE determines the size of the internal cache use to # determine which symbols to keep in memory and which to flush to disk. # When the cache is full, less often used symbols will be written to disk. # For small to medium size projects (<1000 input files) the default value is # probably good enough. For larger projects a too small cache size can cause # doxygen to be busy swapping symbols to and from disk most of the time # causing a significant performance penality. # If the system has enough physical memory increasing the cache will improve the # performance by keeping more symbols in memory. Note that the value works on # a logarithmic scale so increasing the size by one will rougly double the # memory usage. The cache size is given by this formula: # 2^(16+SYMBOL_CACHE_SIZE). The valid range is 0..9, the default is 0, # corresponding to a cache size of 2^16 = 65536 symbols SYMBOL_CACHE_SIZE = 0 #--------------------------------------------------------------------------- # Build related configuration options #--------------------------------------------------------------------------- # If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in # documentation are documented, even if no documentation was available. # Private class members and static file members will be hidden unless # the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES EXTRACT_ALL = YES # If the EXTRACT_PRIVATE tag is set to YES all private members of a class # will be included in the documentation. EXTRACT_PRIVATE = YES # If the EXTRACT_STATIC tag is set to YES all static members of a file # will be included in the documentation. EXTRACT_STATIC = YES # If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs) # defined locally in source files will be included in the documentation. # If set to NO only classes defined in header files are included. EXTRACT_LOCAL_CLASSES = YES # This flag is only useful for Objective-C code. When set to YES local # methods, which are defined in the implementation section but not in # the interface are included in the documentation. # If set to NO (the default) only methods in the interface are included. EXTRACT_LOCAL_METHODS = YES # If this flag is set to YES, the members of anonymous namespaces will be # extracted and appear in the documentation as a namespace called # 'anonymous_namespace{file}', where file will be replaced with the base # name of the file that contains the anonymous namespace. By default # anonymous namespace are hidden. EXTRACT_ANON_NSPACES = YES # If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all # undocumented members of documented classes, files or namespaces. # If set to NO (the default) these members will be included in the # various overviews, but no documentation section is generated. # This option has no effect if EXTRACT_ALL is enabled. HIDE_UNDOC_MEMBERS = NO # If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all # undocumented classes that are normally visible in the class hierarchy. # If set to NO (the default) these classes will be included in the various # overviews. This option has no effect if EXTRACT_ALL is enabled. HIDE_UNDOC_CLASSES = NO # If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all # friend (class|struct|union) declarations. # If set to NO (the default) these declarations will be included in the # documentation. HIDE_FRIEND_COMPOUNDS = NO # If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any # documentation blocks found inside the body of a function. # If set to NO (the default) these blocks will be appended to the # function's detailed documentation block. HIDE_IN_BODY_DOCS = NO # The INTERNAL_DOCS tag determines if documentation # that is typed after a \internal command is included. If the tag is set # to NO (the default) then the documentation will be excluded. # Set it to YES to include the internal documentation. INTERNAL_DOCS = NO # If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate # file names in lower-case letters. If set to YES upper-case letters are also # allowed. This is useful if you have classes or files whose names only differ # in case and if your file system supports case sensitive file names. Windows # and Mac users are advised to set this option to NO. CASE_SENSE_NAMES = NO # If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen # will show members with their full class and namespace scopes in the # documentation. If set to YES the scope will be hidden. HIDE_SCOPE_NAMES = NO # If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen # will put a list of the files that are included by a file in the documentation # of that file. SHOW_INCLUDE_FILES = YES # If the INLINE_INFO tag is set to YES (the default) then a tag [inline] # is inserted in the documentation for inline members. INLINE_INFO = YES # If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen # will sort the (detailed) documentation of file and class members # alphabetically by member name. If set to NO the members will appear in # declaration order. SORT_MEMBER_DOCS = YES # If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the # brief documentation of file, namespace and class members alphabetically # by member name. If set to NO (the default) the members will appear in # declaration order. SORT_BRIEF_DOCS = YES # If the SORT_MEMBERS_CTORS_1ST tag is set to YES then doxygen # will sort the (brief and detailed) documentation of class members so that # constructors and destructors are listed first. If set to NO (the default) # the constructors will appear in the respective orders defined by # SORT_MEMBER_DOCS and SORT_BRIEF_DOCS. # This tag will be ignored for brief docs if SORT_BRIEF_DOCS is set to NO # and ignored for detailed docs if SORT_MEMBER_DOCS is set to NO. SORT_MEMBERS_CTORS_1ST = YES # If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the # hierarchy of group names into alphabetical order. If set to NO (the default) # the group names will appear in their defined order. SORT_GROUP_NAMES = NO # If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be # sorted by fully-qualified names, including namespaces. If set to # NO (the default), the class list will be sorted only by class name, # not including the namespace part. # Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES. # Note: This option applies only to the class list, not to the # alphabetical list. SORT_BY_SCOPE_NAME = NO # The GENERATE_TODOLIST tag can be used to enable (YES) or # disable (NO) the todo list. This list is created by putting \todo # commands in the documentation. GENERATE_TODOLIST = YES # The GENERATE_TESTLIST tag can be used to enable (YES) or # disable (NO) the test list. This list is created by putting \test # commands in the documentation. GENERATE_TESTLIST = YES # The GENERATE_BUGLIST tag can be used to enable (YES) or # disable (NO) the bug list. This list is created by putting \bug # commands in the documentation. GENERATE_BUGLIST = YES # The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or # disable (NO) the deprecated list. This list is created by putting # \deprecated commands in the documentation. GENERATE_DEPRECATEDLIST= YES # The ENABLED_SECTIONS tag can be used to enable conditional # documentation sections, marked by \if sectionname ... \endif. ENABLED_SECTIONS = # The MAX_INITIALIZER_LINES tag determines the maximum number of lines # the initial value of a variable or define consists of for it to appear in # the documentation. If the initializer consists of more lines than specified # here it will be hidden. Use a value of 0 to hide initializers completely. # The appearance of the initializer of individual variables and defines in the # documentation can be controlled using \showinitializer or \hideinitializer # command in the documentation regardless of this setting. MAX_INITIALIZER_LINES = 30 # Set the SHOW_USED_FILES tag to NO to disable the list of files generated # at the bottom of the documentation of classes and structs. If set to YES the # list will mention the files that were used to generate the documentation. SHOW_USED_FILES = YES # If the sources in your project are distributed over multiple directories # then setting the SHOW_DIRECTORIES tag to YES will show the directory hierarchy # in the documentation. The default is NO. # obsoleted in doxygen 1.8.1.1 #SHOW_DIRECTORIES = YES # Set the SHOW_FILES tag to NO to disable the generation of the Files page. # This will remove the Files entry from the Quick Index and from the # Folder Tree View (if specified). The default is YES. SHOW_FILES = YES # Set the SHOW_NAMESPACES tag to NO to disable the generation of the # Namespaces page. This will remove the Namespaces entry from the Quick Index # and from the Folder Tree View (if specified). The default is YES. SHOW_NAMESPACES = YES # The FILE_VERSION_FILTER tag can be used to specify a program or script that # doxygen should invoke to get the current version for each file (typically from # the version control system). Doxygen will invoke the program by executing (via # popen()) the command , where is the value of # the FILE_VERSION_FILTER tag, and is the name of an input file # provided by doxygen. Whatever the program writes to standard output # is used as the file version. See the manual for examples. FILE_VERSION_FILTER = # The LAYOUT_FILE tag can be used to specify a layout file which will be parsed by # doxygen. The layout file controls the global structure of the generated output files # in an output format independent way. The create the layout file that represents # doxygen's defaults, run doxygen with the -l option. You can optionally specify a # file name after the option, if omitted DoxygenLayout.xml will be used as the name # of the layout file. LAYOUT_FILE = #--------------------------------------------------------------------------- # configuration options related to warning and progress messages #--------------------------------------------------------------------------- # The QUIET tag can be used to turn on/off the messages that are generated # by doxygen. Possible values are YES and NO. If left blank NO is used. QUIET = NO # The WARNINGS tag can be used to turn on/off the warning messages that are # generated by doxygen. Possible values are YES and NO. If left blank # NO is used. WARNINGS = YES # If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings # for undocumented members. If EXTRACT_ALL is set to YES then this flag will # automatically be disabled. WARN_IF_UNDOCUMENTED = YES # If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for # potential errors in the documentation, such as not documenting some # parameters in a documented function, or documenting parameters that # don't exist or using markup commands wrongly. WARN_IF_DOC_ERROR = YES # This WARN_NO_PARAMDOC option can be abled to get warnings for # functions that are documented, but have no documentation for their parameters # or return value. If set to NO (the default) doxygen will only warn about # wrong or incomplete parameter documentation, but not about the absence of # documentation. WARN_NO_PARAMDOC = NO # The WARN_FORMAT tag determines the format of the warning messages that # doxygen can produce. The string should contain the $file, $line, and $text # tags, which will be replaced by the file and line number from which the # warning originated and the warning text. Optionally the format may contain # $version, which will be replaced by the version of the file (if it could # be obtained via FILE_VERSION_FILTER) WARN_FORMAT = "$file:$line: $text" # The WARN_LOGFILE tag can be used to specify a file to which warning # and error messages should be written. If left blank the output is written # to stderr. WARN_LOGFILE = #--------------------------------------------------------------------------- # configuration options related to the input files #--------------------------------------------------------------------------- # The INPUT tag can be used to specify the files and/or directories that contain # documented source files. You may enter file names like "myfile.cpp" or # directories like "/usr/src/myproject". Separate the files or directories # with spaces. INPUT = .. # This tag can be used to specify the character encoding of the source files # that doxygen parses. Internally doxygen uses the UTF-8 encoding, which is # also the default input encoding. Doxygen uses libiconv (or the iconv built # into libc) for the transcoding. See http://www.gnu.org/software/libiconv for # the list of possible encodings. INPUT_ENCODING = UTF-8 # If the value of the INPUT tag contains directories, you can use the # FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp # and *.h) to filter out the source-files in the directories. If left # blank the following patterns are tested: # *.c *.cc *.cxx *.cpp *.c++ *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh *.hxx # *.hpp *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm *.py *.f90 FILE_PATTERNS = *.dox *.cpp *.c *.h # The RECURSIVE tag can be used to turn specify whether or not subdirectories # should be searched for input files as well. Possible values are YES and NO. # If left blank NO is used. RECURSIVE = YES # The EXCLUDE tag can be used to specify files and/or directories that should # excluded from the INPUT source files. This way you can easily exclude a # subdirectory from a directory tree whose root is specified with the INPUT tag. EXCLUDE = ./Port-win32 \ ./Port-winnt2k \ ./tests \ ./dibbler-* \ ./bison++ \ ./poslib # The EXCLUDE_SYMLINKS tag can be used select whether or not files or # directories that are symbolic links (a Unix filesystem feature) are excluded # from the input. EXCLUDE_SYMLINKS = YES # If the value of the INPUT tag contains directories, you can use the # EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude # certain files from those directories. Note that the wildcards are matched # against the file with absolute path, so to exclude all test directories # for example use the pattern */test/* EXCLUDE_PATTERNS = */.svn/* *~ bison++ Port-win32 Port-winnt2k */tests/* dibbler-1.0.1 # The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names # (namespaces, classes, functions, etc.) that should be excluded from the # output. The symbol name can be a fully qualified name, a word, or if the # wildcard * is used, a substring. Examples: ANamespace, AClass, # AClass::ANamespace, ANamespace::*Test EXCLUDE_SYMBOLS = # The EXAMPLE_PATH tag can be used to specify one or more files or # directories that contain example code fragments that are included (see # the \include command). EXAMPLE_PATH = ../poslib/examples ../doc/examples # If the value of the EXAMPLE_PATH tag contains directories, you can use the # EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp # and *.h) to filter out the source-files in the directories. If left # blank all files are included. EXAMPLE_PATTERNS = * # If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be # searched for input files to be used with the \include or \dontinclude # commands irrespective of the value of the RECURSIVE tag. # Possible values are YES and NO. If left blank NO is used. EXAMPLE_RECURSIVE = NO # The IMAGE_PATH tag can be used to specify one or more files or # directories that contain image that are included in the documentation (see # the \image command). IMAGE_PATH = # The INPUT_FILTER tag can be used to specify a program that doxygen should # invoke to filter for each input file. Doxygen will invoke the filter program # by executing (via popen()) the command , where # is the value of the INPUT_FILTER tag, and is the name of an # input file. Doxygen will then use the output that the filter program writes # to standard output. If FILTER_PATTERNS is specified, this tag will be # ignored. INPUT_FILTER = "sed \"s/List(\([_A-Za-z0-9]*\))/TContainer< SPtr<\1> >/g\"" # The FILTER_PATTERNS tag can be used to specify filters on a per file pattern # basis. Doxygen will compare the file name with each pattern and apply the # filter if there is a match. The filters are a list of the form: # pattern=filter (like *.cpp=my_cpp_filter). See INPUT_FILTER for further # info on how filters are used. If FILTER_PATTERNS is empty, INPUT_FILTER # is applied to all files. #FILTER_PATTERNS = *Lexer.cpp="sed /s/FLEX_STD/std::/g" FILTER_PATTERNS = # If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using # INPUT_FILTER) will be used to filter the input files when producing source # files to browse (i.e. when SOURCE_BROWSER is set to YES). FILTER_SOURCE_FILES = YES #--------------------------------------------------------------------------- # configuration options related to source browsing #--------------------------------------------------------------------------- # If the SOURCE_BROWSER tag is set to YES then a list of source files will # be generated. Documented entities will be cross-referenced with these sources. # Note: To get rid of all source code in the generated output, make sure also # VERBATIM_HEADERS is set to NO. SOURCE_BROWSER = NO # Setting the INLINE_SOURCES tag to YES will include the body # of functions and classes directly in the documentation. INLINE_SOURCES = NO # Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct # doxygen to hide any special comment blocks from generated source code # fragments. Normal C and C++ comments will always remain visible. STRIP_CODE_COMMENTS = YES # If the REFERENCED_BY_RELATION tag is set to YES # then for each documented function all documented # functions referencing it will be listed. REFERENCED_BY_RELATION = NO # If the REFERENCES_RELATION tag is set to YES # then for each documented function all documented entities # called/used by that function will be listed. REFERENCES_RELATION = NO # If the REFERENCES_LINK_SOURCE tag is set to YES (the default) # and SOURCE_BROWSER tag is set to YES, then the hyperlinks from # functions in REFERENCES_RELATION and REFERENCED_BY_RELATION lists will # link to the source code. Otherwise they will link to the documentation. REFERENCES_LINK_SOURCE = YES # If the USE_HTAGS tag is set to YES then the references to source code # will point to the HTML generated by the htags(1) tool instead of doxygen # built-in source browser. The htags tool is part of GNU's global source # tagging system (see http://www.gnu.org/software/global/global.html). You # will need version 4.8.6 or higher. USE_HTAGS = NO # If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen # will generate a verbatim copy of the header file for each class for # which an include is specified. Set to NO to disable this. VERBATIM_HEADERS = YES #--------------------------------------------------------------------------- # configuration options related to the alphabetical class index #--------------------------------------------------------------------------- # If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index # of all compounds will be generated. Enable this if the project # contains a lot of classes, structs, unions or interfaces. ALPHABETICAL_INDEX = YES # If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then # the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns # in which this list will be split (can be a number in the range [1..20]) COLS_IN_ALPHA_INDEX = 5 # In case all classes in a project start with a common prefix, all # classes will be put under the same header in the alphabetical index. # The IGNORE_PREFIX tag can be used to specify one or more prefixes that # should be ignored while generating the index headers. IGNORE_PREFIX = #--------------------------------------------------------------------------- # configuration options related to the HTML output #--------------------------------------------------------------------------- # If the GENERATE_HTML tag is set to YES (the default) Doxygen will # generate HTML output. GENERATE_HTML = YES # The HTML_OUTPUT tag is used to specify where the HTML docs will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `html' will be used as the default path. HTML_OUTPUT = html # The HTML_FILE_EXTENSION tag can be used to specify the file extension for # each generated HTML page (for example: .htm,.php,.asp). If it is left blank # doxygen will generate files with .html extension. HTML_FILE_EXTENSION = .html # The HTML_HEADER tag can be used to specify a personal HTML header for # each generated HTML page. If it is left blank doxygen will generate a # standard header. HTML_HEADER = # The HTML_FOOTER tag can be used to specify a personal HTML footer for # each generated HTML page. If it is left blank doxygen will generate a # standard footer. HTML_FOOTER = # The HTML_STYLESHEET tag can be used to specify a user-defined cascading # style sheet that is used by each HTML page. It can be used to # fine-tune the look of the HTML output. If the tag is left blank doxygen # will generate a default style sheet. Note that doxygen will try to copy # the style sheet file to the HTML output directory, so don't put your own # stylesheet in the HTML output directory as well, or it will be erased! HTML_STYLESHEET = # If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes, # files or namespaces will be aligned in HTML using tables. If set to # NO a bullet list will be used. # Obsoleted in doxygen 1.8.1.1 #HTML_ALIGN_MEMBERS = YES # If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML # documentation will contain sections that can be hidden and shown after the # page has loaded. For this to work a browser that supports # JavaScript and DHTML is required (for instance Mozilla 1.0+, Firefox # Netscape 6.0+, Internet explorer 5.0+, Konqueror, or Safari). HTML_DYNAMIC_SECTIONS = YES # If the GENERATE_DOCSET tag is set to YES, additional index files # will be generated that can be used as input for Apple's Xcode 3 # integrated development environment, introduced with OSX 10.5 (Leopard). # To create a documentation set, doxygen will generate a Makefile in the # HTML output directory. Running make will produce the docset in that # directory and running "make install" will install the docset in # ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find # it at startup. # See http://developer.apple.com/tools/creatingdocsetswithdoxygen.html for more information. GENERATE_DOCSET = NO # When GENERATE_DOCSET tag is set to YES, this tag determines the name of the # feed. A documentation feed provides an umbrella under which multiple # documentation sets from a single provider (such as a company or product suite) # can be grouped. DOCSET_FEEDNAME = "Doxygen generated docs" # When GENERATE_DOCSET tag is set to YES, this tag specifies a string that # should uniquely identify the documentation set bundle. This should be a # reverse domain-name style string, e.g. com.mycompany.MyDocSet. Doxygen # will append .docset to the name. DOCSET_BUNDLE_ID = org.doxygen.Project # If the GENERATE_HTMLHELP tag is set to YES, additional index files # will be generated that can be used as input for tools like the # Microsoft HTML help workshop to generate a compiled HTML help file (.chm) # of the generated HTML documentation. GENERATE_HTMLHELP = NO # If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can # be used to specify the file name of the resulting .chm file. You # can add a path in front of the file if the result should not be # written to the html output directory. CHM_FILE = # If the GENERATE_HTMLHELP tag is set to YES, the HHC_LOCATION tag can # be used to specify the location (absolute path including file name) of # the HTML help compiler (hhc.exe). If non-empty doxygen will try to run # the HTML help compiler on the generated index.hhp. HHC_LOCATION = # If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag # controls if a separate .chi index file is generated (YES) or that # it should be included in the master .chm file (NO). GENERATE_CHI = NO # If the GENERATE_HTMLHELP tag is set to YES, the CHM_INDEX_ENCODING # is used to encode HtmlHelp index (hhk), content (hhc) and project file # content. CHM_INDEX_ENCODING = # If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag # controls whether a binary table of contents is generated (YES) or a # normal table of contents (NO) in the .chm file. BINARY_TOC = NO # The TOC_EXPAND flag can be set to YES to add extra items for group members # to the contents of the HTML help documentation and to the tree view. TOC_EXPAND = NO # If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and QHP_VIRTUAL_FOLDER # are set, an additional index file will be generated that can be used as input for # Qt's qhelpgenerator to generate a Qt Compressed Help (.qch) of the generated # HTML documentation. GENERATE_QHP = NO # If the QHG_LOCATION tag is specified, the QCH_FILE tag can # be used to specify the file name of the resulting .qch file. # The path specified is relative to the HTML output folder. QCH_FILE = # The QHP_NAMESPACE tag specifies the namespace to use when generating # Qt Help Project output. For more information please see # http://doc.trolltech.com/qthelpproject.html#namespace QHP_NAMESPACE = # The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating # Qt Help Project output. For more information please see # http://doc.trolltech.com/qthelpproject.html#virtual-folders QHP_VIRTUAL_FOLDER = doc # If QHP_CUST_FILTER_NAME is set, it specifies the name of a custom filter to add. # For more information please see # http://doc.trolltech.com/qthelpproject.html#custom-filters QHP_CUST_FILTER_NAME = # The QHP_CUST_FILT_ATTRS tag specifies the list of the attributes of the custom filter to add.For more information please see # Qt Help Project / Custom Filters. QHP_CUST_FILTER_ATTRS = # The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this project's # filter section matches. # Qt Help Project / Filter Attributes. QHP_SECT_FILTER_ATTRS = # If the GENERATE_QHP tag is set to YES, the QHG_LOCATION tag can # be used to specify the location of Qt's qhelpgenerator. # If non-empty doxygen will try to run qhelpgenerator on the generated # .qhp file. QHG_LOCATION = # The DISABLE_INDEX tag can be used to turn on/off the condensed index at # top of each HTML page. The value NO (the default) enables the index and # the value YES disables it. DISABLE_INDEX = NO # This tag can be used to set the number of enum values (range [1..20]) # that doxygen will group on one line in the generated HTML documentation. ENUM_VALUES_PER_LINE = 4 # The GENERATE_TREEVIEW tag is used to specify whether a tree-like index # structure should be generated to display hierarchical information. # If the tag value is set to YES, a side panel will be generated # containing a tree-like index structure (just like the one that # is generated for HTML Help). For this to work a browser that supports # JavaScript, DHTML, CSS and frames is required (i.e. any modern browser). # Windows users are probably better off using the HTML help feature. GENERATE_TREEVIEW = YES # By enabling USE_INLINE_TREES, doxygen will generate the Groups, Directories, # and Class Hierarchy pages using a tree view instead of an ordered list. # Obsoleted in Doxygen 1.8.1.1 #USE_INLINE_TREES = YES # If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be # used to set the initial width (in pixels) of the frame in which the tree # is shown. TREEVIEW_WIDTH = 250 # Use this tag to change the font size of Latex formulas included # as images in the HTML documentation. The default is 10. Note that # when you change the font size after a successful doxygen run you need # to manually remove any form_*.png images from the HTML output directory # to force them to be regenerated. FORMULA_FONTSIZE = 10 # When the SEARCHENGINE tag is enable doxygen will generate a search box # for the HTML output. The underlying search engine uses javascript # and DHTML and should work on any modern browser. Note that when using # HTML help (GENERATE_HTMLHELP) or Qt help (GENERATE_QHP) # there is already a search function so this one should typically # be disabled. SEARCHENGINE = YES #--------------------------------------------------------------------------- # configuration options related to the LaTeX output #--------------------------------------------------------------------------- # If the GENERATE_LATEX tag is set to YES (the default) Doxygen will # generate Latex output. GENERATE_LATEX = NO # The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `latex' will be used as the default path. LATEX_OUTPUT = latex # The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be # invoked. If left blank `latex' will be used as the default command name. LATEX_CMD_NAME = latex # The MAKEINDEX_CMD_NAME tag can be used to specify the command name to # generate index for LaTeX. If left blank `makeindex' will be used as the # default command name. MAKEINDEX_CMD_NAME = makeindex # If the COMPACT_LATEX tag is set to YES Doxygen generates more compact # LaTeX documents. This may be useful for small projects and may help to # save some trees in general. COMPACT_LATEX = NO # The PAPER_TYPE tag can be used to set the paper type that is used # by the printer. Possible values are: a4, a4wide, letter, legal and # executive. If left blank a4wide will be used. PAPER_TYPE = a4wide # The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX # packages that should be included in the LaTeX output. EXTRA_PACKAGES = # The LATEX_HEADER tag can be used to specify a personal LaTeX header for # the generated latex document. The header should contain everything until # the first chapter. If it is left blank doxygen will generate a # standard header. Notice: only use this tag if you know what you are doing! LATEX_HEADER = # If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated # is prepared for conversion to pdf (using ps2pdf). The pdf file will # contain links (just like the HTML output) instead of page references # This makes the output suitable for online browsing using a pdf viewer. PDF_HYPERLINKS = YES # If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of # plain latex in the generated Makefile. Set this option to YES to get a # higher quality PDF documentation. USE_PDFLATEX = YES # If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode. # command to the generated LaTeX files. This will instruct LaTeX to keep # running if errors occur, instead of asking the user for help. # This option is also used when generating formulas in HTML. LATEX_BATCHMODE = NO # If LATEX_HIDE_INDICES is set to YES then doxygen will not # include the index chapters (such as File Index, Compound Index, etc.) # in the output. LATEX_HIDE_INDICES = NO # If LATEX_SOURCE_CODE is set to YES then doxygen will include # source code with syntax highlighting in the LaTeX output. # Note that which sources are shown also depends on other settings # such as SOURCE_BROWSER. LATEX_SOURCE_CODE = NO #--------------------------------------------------------------------------- # configuration options related to the RTF output #--------------------------------------------------------------------------- # If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output # The RTF output is optimized for Word 97 and may not look very pretty with # other RTF readers or editors. GENERATE_RTF = NO # The RTF_OUTPUT tag is used to specify where the RTF docs will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `rtf' will be used as the default path. RTF_OUTPUT = rtf # If the COMPACT_RTF tag is set to YES Doxygen generates more compact # RTF documents. This may be useful for small projects and may help to # save some trees in general. COMPACT_RTF = NO # If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated # will contain hyperlink fields. The RTF file will # contain links (just like the HTML output) instead of page references. # This makes the output suitable for online browsing using WORD or other # programs which support those fields. # Note: wordpad (write) and others do not support links. RTF_HYPERLINKS = NO # Load stylesheet definitions from file. Syntax is similar to doxygen's # config file, i.e. a series of assignments. You only have to provide # replacements, missing definitions are set to their default value. RTF_STYLESHEET_FILE = # Set optional variables used in the generation of an rtf document. # Syntax is similar to doxygen's config file. RTF_EXTENSIONS_FILE = #--------------------------------------------------------------------------- # configuration options related to the man page output #--------------------------------------------------------------------------- # If the GENERATE_MAN tag is set to YES (the default) Doxygen will # generate man pages GENERATE_MAN = NO # The MAN_OUTPUT tag is used to specify where the man pages will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `man' will be used as the default path. MAN_OUTPUT = man # The MAN_EXTENSION tag determines the extension that is added to # the generated man pages (default is the subroutine's section .3) MAN_EXTENSION = .3 # If the MAN_LINKS tag is set to YES and Doxygen generates man output, # then it will generate one additional man file for each entity # documented in the real man page(s). These additional files # only source the real man page, but without them the man command # would be unable to find the correct page. The default is NO. MAN_LINKS = NO #--------------------------------------------------------------------------- # configuration options related to the XML output #--------------------------------------------------------------------------- # If the GENERATE_XML tag is set to YES Doxygen will # generate an XML file that captures the structure of # the code including all documentation. GENERATE_XML = NO # The XML_OUTPUT tag is used to specify where the XML pages will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `xml' will be used as the default path. XML_OUTPUT = xml # The XML_SCHEMA tag can be used to specify an XML schema, # which can be used by a validating XML parser to check the # syntax of the XML files. XML_SCHEMA = # The XML_DTD tag can be used to specify an XML DTD, # which can be used by a validating XML parser to check the # syntax of the XML files. XML_DTD = # If the XML_PROGRAMLISTING tag is set to YES Doxygen will # dump the program listings (including syntax highlighting # and cross-referencing information) to the XML output. Note that # enabling this will significantly increase the size of the XML output. XML_PROGRAMLISTING = YES #--------------------------------------------------------------------------- # configuration options for the AutoGen Definitions output #--------------------------------------------------------------------------- # If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will # generate an AutoGen Definitions (see autogen.sf.net) file # that captures the structure of the code including all # documentation. Note that this feature is still experimental # and incomplete at the moment. GENERATE_AUTOGEN_DEF = NO #--------------------------------------------------------------------------- # configuration options related to the Perl module output #--------------------------------------------------------------------------- # If the GENERATE_PERLMOD tag is set to YES Doxygen will # generate a Perl module file that captures the structure of # the code including all documentation. Note that this # feature is still experimental and incomplete at the # moment. GENERATE_PERLMOD = NO # If the PERLMOD_LATEX tag is set to YES Doxygen will generate # the necessary Makefile rules, Perl scripts and LaTeX code to be able # to generate PDF and DVI output from the Perl module output. PERLMOD_LATEX = NO # If the PERLMOD_PRETTY tag is set to YES the Perl module output will be # nicely formatted so it can be parsed by a human reader. This is useful # if you want to understand what is going on. On the other hand, if this # tag is set to NO the size of the Perl module output will be much smaller # and Perl will parse it just the same. PERLMOD_PRETTY = YES # The names of the make variables in the generated doxyrules.make file # are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. # This is useful so different doxyrules.make files included by the same # Makefile don't overwrite each other's variables. PERLMOD_MAKEVAR_PREFIX = #--------------------------------------------------------------------------- # Configuration options related to the preprocessor #--------------------------------------------------------------------------- # If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will # evaluate all C-preprocessor directives found in the sources and include # files. ENABLE_PREPROCESSING = YES # If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro # names in the source code. If set to NO (the default) only conditional # compilation will be performed. Macro expansion can be done in a controlled # way by setting EXPAND_ONLY_PREDEF to YES. MACRO_EXPANSION = YES # If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES # then the macro expansion is limited to the macros specified with the # PREDEFINED and EXPAND_AS_DEFINED tags. EXPAND_ONLY_PREDEF = NO # If the SEARCH_INCLUDES tag is set to YES (the default) the includes files # in the INCLUDE_PATH (see below) will be search if a #include is found. SEARCH_INCLUDES = YES # The INCLUDE_PATH tag can be used to specify one or more directories that # contain include files that are not input files but should be processed by # the preprocessor. INCLUDE_PATH = # You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard # patterns (like *.h and *.hpp) to filter out the header-files in the # directories. If left blank, the patterns specified with FILE_PATTERNS will # be used. INCLUDE_FILE_PATTERNS = # The PREDEFINED tag can be used to specify one or more macro names that # are defined before the preprocessor is started (similar to the -D option of # gcc). The argument of the tag is a list of macros of the form: name # or name=definition (no spaces). If the definition and the = are # omitted =1 is assumed. To prevent a macro definition from being # undefined via #undef or recursively expanded use the := operator # instead of the = operator. PREDEFINED = # If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then # this tag can be used to specify a list of macro names that should be expanded. # The macro definition that is found in the sources will be used. # Use the PREDEFINED tag if you want to use a different macro definition. EXPAND_AS_DEFINED = # If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then # doxygen's preprocessor will remove all function-like macros that are alone # on a line, have an all uppercase name, and do not end with a semicolon. Such # function macros are typically used for boiler-plate code, and will confuse # the parser if not removed. SKIP_FUNCTION_MACROS = YES #--------------------------------------------------------------------------- # Configuration::additions related to external references #--------------------------------------------------------------------------- # The TAGFILES option can be used to specify one or more tagfiles. # Optionally an initial location of the external documentation # can be added for each tagfile. The format of a tag file without # this location is as follows: # TAGFILES = file1 file2 ... # Adding location for the tag files is done as follows: # TAGFILES = file1=loc1 "file2 = loc2" ... # where "loc1" and "loc2" can be relative or absolute paths or # URLs. If a location is present for each tag, the installdox tool # does not have to be run to correct the links. # Note that each tag file must have a unique name # (where the name does NOT include the path) # If a tag file is not located in the directory in which doxygen # is run, you must also specify the path to the tagfile here. TAGFILES = # When a file name is specified after GENERATE_TAGFILE, doxygen will create # a tag file that is based on the input files it reads. GENERATE_TAGFILE = tag # If the ALLEXTERNALS tag is set to YES all external classes will be listed # in the class index. If set to NO only the inherited external classes # will be listed. ALLEXTERNALS = NO # If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed # in the modules index. If set to NO, only the current project's groups will # be listed. EXTERNAL_GROUPS = YES # The PERL_PATH should be the absolute path and name of the perl script # interpreter (i.e. the result of `which perl'). PERL_PATH = /usr/bin/perl #--------------------------------------------------------------------------- # Configuration options related to the dot tool #--------------------------------------------------------------------------- # If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will # generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base # or super classes. Setting the tag to NO turns the diagrams off. Note that # this option is superseded by the HAVE_DOT option below. This is only a # fallback. It is recommended to install and use dot, since it yields more # powerful graphs. CLASS_DIAGRAMS = YES # You can define message sequence charts within doxygen comments using the \msc # command. Doxygen will then run the mscgen tool (see # http://www.mcternan.me.uk/mscgen/) to produce the chart and insert it in the # documentation. The MSCGEN_PATH tag allows you to specify the directory where # the mscgen tool resides. If left empty the tool is assumed to be found in the # default search path. MSCGEN_PATH = # If set to YES, the inheritance and collaboration graphs will hide # inheritance and usage relations if the target is undocumented # or is not a class. HIDE_UNDOC_RELATIONS = YES # If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is # available from the path. This tool is part of Graphviz, a graph visualization # toolkit from AT&T and Lucent Bell Labs. The other options in this section # have no effect if this option is set to NO (the default) HAVE_DOT = YES # By default doxygen will write a font called FreeSans.ttf to the output # directory and reference it in all dot files that doxygen generates. This # font does not include all possible unicode characters however, so when you need # these (or just want a differently looking font) you can specify the font name # using DOT_FONTNAME. You need need to make sure dot is able to find the font, # which can be done by putting it in a standard location or by setting the # DOTFONTPATH environment variable or by setting DOT_FONTPATH to the directory # containing the font. DOT_FONTNAME = FreeSans # The DOT_FONTSIZE tag can be used to set the size of the font of dot graphs. # The default size is 10pt. DOT_FONTSIZE = 10 # By default doxygen will tell dot to use the output directory to look for the # FreeSans.ttf font (which doxygen will put there itself). If you specify a # different font using DOT_FONTNAME you can set the path where dot # can find it using this tag. DOT_FONTPATH = # If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen # will generate a graph for each documented class showing the direct and # indirect inheritance relations. Setting this tag to YES will force the # the CLASS_DIAGRAMS tag to NO. CLASS_GRAPH = YES # If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen # will generate a graph for each documented class showing the direct and # indirect implementation dependencies (inheritance, containment, and # class references variables) of the class with other documented classes. COLLABORATION_GRAPH = YES # If the GROUP_GRAPHS and HAVE_DOT tags are set to YES then doxygen # will generate a graph for groups, showing the direct groups dependencies GROUP_GRAPHS = YES # If the UML_LOOK tag is set to YES doxygen will generate inheritance and # collaboration diagrams in a style similar to the OMG's Unified Modeling # Language. UML_LOOK = YES # If set to YES, the inheritance and collaboration graphs will show the # relations between templates and their instances. TEMPLATE_RELATIONS = NO # If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT # tags are set to YES then doxygen will generate a graph for each documented # file showing the direct and indirect include dependencies of the file with # other documented files. # Performance trick: disable this to make generation much faster INCLUDE_GRAPH = YES # If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and # HAVE_DOT tags are set to YES then doxygen will generate a graph for each # documented header file showing the documented files that directly or # indirectly include this file. # Performance trick: disable this to make generation much faster INCLUDED_BY_GRAPH = YES # If the CALL_GRAPH and HAVE_DOT options are set to YES then # doxygen will generate a call dependency graph for every global function # or class method. Note that enabling this option will significantly increase # the time of a run. So in most cases it will be better to enable call graphs # for selected functions only using the \callgraph command. CALL_GRAPH = NO # If the CALLER_GRAPH and HAVE_DOT tags are set to YES then # doxygen will generate a caller dependency graph for every global function # or class method. Note that enabling this option will significantly increase # the time of a run. So in most cases it will be better to enable caller # graphs for selected functions only using the \callergraph command. CALLER_GRAPH = NO # If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen # will graphical hierarchy of all classes instead of a textual one. GRAPHICAL_HIERARCHY = YES # If the DIRECTORY_GRAPH, SHOW_DIRECTORIES and HAVE_DOT tags are set to YES # then doxygen will show the dependencies a directory has on other directories # in a graphical way. The dependency relations are determined by the #include # relations between the files in the directories. DIRECTORY_GRAPH = YES # The DOT_IMAGE_FORMAT tag can be used to set the image format of the images # generated by dot. Possible values are png, jpg, or gif # If left blank png will be used. DOT_IMAGE_FORMAT = png # The tag DOT_PATH can be used to specify the path where the dot tool can be # found. If left blank, it is assumed the dot tool can be found in the path. DOT_PATH = # The DOTFILE_DIRS tag can be used to specify one or more directories that # contain dot files that are included in the documentation (see the # \dotfile command). DOTFILE_DIRS = # The DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of # nodes that will be shown in the graph. If the number of nodes in a graph # becomes larger than this value, doxygen will truncate the graph, which is # visualized by representing a node as a red box. Note that doxygen if the # number of direct children of the root node in a graph is already larger than # DOT_GRAPH_MAX_NODES then the graph will not be shown at all. Also note # that the size of a graph can be further restricted by MAX_DOT_GRAPH_DEPTH. DOT_GRAPH_MAX_NODES = 50 # The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the # graphs generated by dot. A depth value of 3 means that only nodes reachable # from the root by following a path via at most 3 edges will be shown. Nodes # that lay further from the root node will be omitted. Note that setting this # option to 1 or 2 may greatly reduce the computation time needed for large # code bases. Also note that the size of a graph can be further restricted by # DOT_GRAPH_MAX_NODES. Using a depth of 0 means no depth restriction. MAX_DOT_GRAPH_DEPTH = 0 # Set the DOT_TRANSPARENT tag to YES to generate images with a transparent # background. This is disabled by default, because dot on Windows does not # seem to support this out of the box. Warning: Depending on the platform used, # enabling this option may lead to badly anti-aliased labels on the edges of # a graph (i.e. they become hard to read). DOT_TRANSPARENT = NO # Set the DOT_MULTI_TARGETS tag to YES allow dot to generate multiple output # files in one run (i.e. multiple -o and -T options on the command line). This # makes dot run faster, but since only newer versions of dot (>1.8.10) # support this, this feature is disabled by default. DOT_MULTI_TARGETS = YES # If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will # generate a legend page explaining the meaning of the various boxes and # arrows in the dot generated graphs. GENERATE_LEGEND = YES # If the DOT_CLEANUP tag is set to YES (the default) Doxygen will # remove the intermediate dot files that are used to generate # the various graphs. DOT_CLEANUP = YES dibbler-1.0.1/doc/Makefile.in0000664000175000017500000005027512561652535012674 00000000000000# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = doc DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(srcdir)/doxygen.cfg.in $(srcdir)/version.tex.in \ $(dist_noinst_DATA) $(nobase_dist_doc_DATA) ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/libtool.m4 \ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/include/dibbler-config.h CONFIG_CLEAN_FILES = doxygen.cfg version.tex CONFIG_CLEAN_VPATH_FILES = AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = SOURCES = DIST_SOURCES = am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } man8dir = $(mandir)/man8 am__installdirs = "$(DESTDIR)$(man8dir)" "$(DESTDIR)$(docdir)" NROFF = nroff MANS = $(man8_MANS) DATA = $(dist_noinst_DATA) $(nobase_dist_doc_DATA) am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALLOCA = @ALLOCA@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ ARCH = @ARCH@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ EXTRA_DIST_SUBDIRS = @EXTRA_DIST_SUBDIRS@ FGREP = @FGREP@ GREP = @GREP@ GTEST_INCLUDES = @GTEST_INCLUDES@ GTEST_LDADD = @GTEST_LDADD@ GTEST_LDFLAGS = @GTEST_LDFLAGS@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LINKPRINT = @LINKPRINT@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PORT_CFLAGS = @PORT_CFLAGS@ PORT_LDFLAGS = @PORT_LDFLAGS@ PORT_SUBDIR = @PORT_SUBDIR@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ subdirs = @subdirs@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ man8_MANS = man/dibbler-server.8 man/dibbler-client.8 man/dibbler-relay.8 nobase_dist_doc_DATA = dibbler-user.pdf \ examples/client-addrparams.conf examples/client-auth.conf \ examples/client-autodetect.conf examples/client.conf \ examples/client-fqdn.conf \ examples/client-prefix-delegation.conf \ examples/client-stateless.conf examples/client-ta.conf \ examples/client-win32.conf examples/client-custom.conf \ examples/relay-1interface.conf examples/relay.conf \ examples/relay-echo-remoteid.conf \ examples/server-3classes.conf examples/server-addrparams.conf \ examples/server-auth.conf examples/server-bulk-lq.conf \ examples/server.conf examples/server-extraopts.conf \ examples/server-fqdn.conf examples/server-guess-mode.conf \ examples/server-leasequery.conf \ examples/server-per-client.conf \ examples/server-prefix-delegation.conf \ examples/server-relay.conf \ examples/server-relay-interface-id.conf \ examples/server-script.conf examples/server-stateless.conf \ examples/server-ta.conf examples/server-win32.conf \ examples/server-route.conf \ examples/server-client-classification.conf \ examples/server-subnet.conf dist_noinst_DATA = RELEASE-METHOD TEST-METHOD doxygen.cfg $(DOXYGEN) $(TEX_SOURCES) $(man8_MANS) TEX_SOURCES = dibbler-aaa.png dibbler-cascade-relays.png \ dibbler-fqdn-cli-update.png dibbler-fqdn-srv-update.png \ dibbler-multiple-cli.png dibbler-multiple-srv.png \ dibbler-prefixes-host.png dibbler-prefixes-router.png \ dibbler-relay.png dibbler-srv-cli.png \ dibbler-user-bibliography.tex dibbler-user-config-client.tex \ dibbler-user-config-relay.tex dibbler-user-config-server.tex \ dibbler-user-epilogue.tex dibbler-user-faq.tex \ dibbler-user-features.tex dibbler-user-intro.tex \ dibbler-user.tex dibbler-user-usage.tex dibbler-worldmap.png \ logo-eti.png logo-eu.jpg logo-iip.png logo-kti.png \ logo-nss.png logo-pg.png DOXYGEN = dibbler-devel-00-mainpage.dox dibbler-devel-01-intro.dox \ dibbler-devel-02-compile.dox dibbler-devel-03-port.dox \ dibbler-devel-04-common.dox dibbler-devel-05-sources.dox \ dibbler-devel-06-arch.dox dibbler-devel-07-debug.dox \ dibbler-devel-08-contrib.dox dibbler-devel-09-misc.dox \ dibbler-devel-bibl.dox doxygen.cfg LATEX = pdflatex LATEXOPTS = -file-line-error -halt-on-error all: all-am .SUFFIXES: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign doc/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign doc/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): doxygen.cfg: $(top_builddir)/config.status $(srcdir)/doxygen.cfg.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ version.tex: $(top_builddir)/config.status $(srcdir)/version.tex.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-man8: $(man8_MANS) @$(NORMAL_INSTALL) @list1='$(man8_MANS)'; \ list2=''; \ test -n "$(man8dir)" \ && test -n "`echo $$list1$$list2`" \ || exit 0; \ echo " $(MKDIR_P) '$(DESTDIR)$(man8dir)'"; \ $(MKDIR_P) "$(DESTDIR)$(man8dir)" || exit 1; \ { for i in $$list1; do echo "$$i"; done; \ if test -n "$$list2"; then \ for i in $$list2; do echo "$$i"; done \ | sed -n '/\.8[a-z]*$$/p'; \ fi; \ } | while read p; do \ if test -f $$p; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; echo "$$p"; \ done | \ sed -e 'n;s,.*/,,;p;h;s,.*\.,,;s,^[^8][0-9a-z]*$$,8,;x' \ -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,' | \ sed 'N;N;s,\n, ,g' | { \ list=; while read file base inst; do \ if test "$$base" = "$$inst"; then list="$$list $$file"; else \ echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man8dir)/$$inst'"; \ $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man8dir)/$$inst" || exit $$?; \ fi; \ done; \ for i in $$list; do echo "$$i"; done | $(am__base_list) | \ while read files; do \ test -z "$$files" || { \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(man8dir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(man8dir)" || exit $$?; }; \ done; } uninstall-man8: @$(NORMAL_UNINSTALL) @list='$(man8_MANS)'; test -n "$(man8dir)" || exit 0; \ files=`{ for i in $$list; do echo "$$i"; done; \ } | sed -e 's,.*/,,;h;s,.*\.,,;s,^[^8][0-9a-z]*$$,8,;x' \ -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,'`; \ dir='$(DESTDIR)$(man8dir)'; $(am__uninstall_files_from_dir) install-nobase_dist_docDATA: $(nobase_dist_doc_DATA) @$(NORMAL_INSTALL) @list='$(nobase_dist_doc_DATA)'; test -n "$(docdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(docdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(docdir)" || exit 1; \ fi; \ $(am__nobase_list) | while read dir files; do \ xfiles=; for file in $$files; do \ if test -f "$$file"; then xfiles="$$xfiles $$file"; \ else xfiles="$$xfiles $(srcdir)/$$file"; fi; done; \ test -z "$$xfiles" || { \ test "x$$dir" = x. || { \ echo " $(MKDIR_P) '$(DESTDIR)$(docdir)/$$dir'"; \ $(MKDIR_P) "$(DESTDIR)$(docdir)/$$dir"; }; \ echo " $(INSTALL_DATA) $$xfiles '$(DESTDIR)$(docdir)/$$dir'"; \ $(INSTALL_DATA) $$xfiles "$(DESTDIR)$(docdir)/$$dir" || exit $$?; }; \ done uninstall-nobase_dist_docDATA: @$(NORMAL_UNINSTALL) @list='$(nobase_dist_doc_DATA)'; test -n "$(docdir)" || list=; \ $(am__nobase_strip_setup); files=`$(am__nobase_strip)`; \ dir='$(DESTDIR)$(docdir)'; $(am__uninstall_files_from_dir) tags TAGS: ctags CTAGS: cscope cscopelist: distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(MANS) $(DATA) installdirs: for dir in "$(DESTDIR)$(man8dir)" "$(DESTDIR)$(docdir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-generic dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-man install-nobase_dist_docDATA install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-man8 install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-man uninstall-nobase_dist_docDATA uninstall-man: uninstall-man8 .MAKE: install-am install-strip .PHONY: all all-am check check-am clean clean-generic clean-libtool \ cscopelist-am ctags-am distclean distclean-generic \ distclean-libtool distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-man8 install-nobase_dist_docDATA install-pdf \ install-pdf-am install-ps install-ps-am install-strip \ installcheck installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-generic \ mostlyclean-libtool pdf pdf-am ps ps-am tags-am uninstall \ uninstall-am uninstall-man uninstall-man8 \ uninstall-nobase_dist_docDATA all: all-am: cppcheck: mkdir -p html cd .. && cppcheck --enable=all --inline-suppr \ --suppressions-list=doc/cppcheck-skip.txt \ --template '{file}:{line}: {message} ({severity},{id})' \ -f -v -j 4 -i bison++/ -i tests/ -i dibbler-*/ -i poslib/examples \ . 1> doc/html/cppcheck.log 2> doc/html/cppcheck-error.log user: $(TEX_SOURCES) $(LATEX) $(LATEXOPTS) dibbler-user.tex > dibbler-user.log if grep "undefined" dibbler-user.log; then \ echo "There are undefined references";\ fi devel: $(DOXYGEN) mkdir -p html/ doxygen doxygen.cfg > html/doxygen.log 2>html/doxygen-error.log cp logo* html/ echo "Encountered `cat html/doxygen-error.log | wc -l` errors and warnings." compile.log: mkdir -p html cd .. && ./configure &> doc/html/configure.log cd .. && $(MAKE) clean cd .. && $(MAKE) > doc/html/compile.log 2> doc/html/compile-warnings.log check.log: mkdir -p html cd .. && ./configure --with-gtest=/home/thomson/devel/gtest-1.6.0 &> doc/html/configure-gtest.log cd .. && $(MAKE) -j2 check &> doc/html/make-check.log distcheck.log: mkdir -p html cd .. && ./configure --with-gtest=/home/thomson/devel/gtest-1.6.0 &> doc/html/configure-gtest.log cd .. && $(MAKE) -j2 distcheck &> doc/html/make-distcheck.log summary.log: mkdir -p html/ wc -l html/compile-warnings.log html/cppcheck-error.log html/doxygen-error.log > html/summary.txt clean: @echo "[CLEAN ] $(SUBDIR)" @rm -f *.aux *.idx *.log *.toc *.out *~ *.ps *.dvi *.tmp clobber: clean @rm -f *.pdf .PHONY: devel cppcheck compile.log check.log distcheck.log # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: dibbler-1.0.1/doc/dibbler-srv-cli.png0000664000175000017500000012304112233256142014273 00000000000000‰PNG  IHDR« ­·­sRGB®ÎégAMA± üa cHRMz&€„ú€èu0ê`:˜pœºQ< pHYsÂÂnÐu>¥ŠIDATx^í½|UÅÖþÿ¿÷*÷}¥X ¨(ØPAD”bìô"M¤J—"Mª P„ÞR! !$!$$¤‡i„:xÿOXܹãÞûì³OÍI²æ3 ûÌž=óì9ç|÷:kÖúÿþýïÿƒ +À °¬+À °¬+Pvs;vìhݺu—.]üýýYV€`XV€`XR¬À?JñÜ N ÈÛ°aCù™§C‡qqqOçf¬+À °¬+À °%K2MÀÀ\À®){×®]Ï;W²n'–`XV€`XVÀ¬e”€¶}ûö5ëëò¯ýë§Ÿ~ºpá‚Y¹+À °¬+À °¬@IQ Ì0pv„ @[5þV¯öd•ʪ?üðÃ8åúõë%å¦ò8YV€`XV€`t([}º .ž2+À °¬+À °%TÒFÀ:¡ž®þäÊ%3Ϧ„Z]qz­šÎÄ cMãàÁ%ô=ÀÃfXV€`\D¸Yª ÿæl÷TªØT¨‡ªU›8vˆÕà«8qîÌqèPmF„5MãàÁv_£Ü!+À °¬+PêûjnÙ¼˜TÓ¦MãØ¬öZ ¥„€uB= Ü+þ„oVê1;ÖÓqA£Gô¯X±‚fð`€8/P{-Pî‡`XV€( ¼üòËfu¡š8p ,âè9–xÖ õЫûW'B=³RÃTãOø èÛU3hÔÜÜÜ}ó¸V€`XV€( `C‘ümZ·níþ¥`âÅ8…LÀð‰Á.4ÍÓú£f¡‡wg¥†;¡žõúþ›ÏMMãàÁŸ¸ùÒ¬+À °¬@‰P¿[DÀÔ{Ø÷Òêû[" {κvíª¹V5¬·wûês§#œ\îvk AÓ8x°Õ ”OdXV€`J½@;w8p`… Ež–Øb4dÈÄÄD???¹hüðÞK½>Ž˜` #`<ëŒ5 BÍšˆÒà¶t¶“ÁWq9À7ÜTÐ4ÞÈéˆÌ}²¬+À °%Z° 6Ë–-;~ü¸··w»víˆ(ªV­º|ùòŒŒŒµk×Ö¬YSœ¨ËŠPb{Ëð”ƒgõGd†SGg§w‘ê¾faíW_Òä`˜®9hšË”OaXV€`J«7nÌÓ/‚B€€Q`8òÖ©S‡^mÔ¨öÀ%%%ÁX±bE5fp‚‹VHÉ `,Í!•*VöSŸôÄÐìôHW«Kþ˜þtõ§Ô Ïyì¸cÑ寬+À °¬@)V@vìlÕªUDD„ `@ð‰'¦OŸ^¹re"Šï¿ÿž^ýî»ï4|ÌÎÁFV‹«0?r '#ªDÔŒ¤cÆô…¹Zs²»‘eÊmXV€`XR©|d<Ð$à¨{ûá½ð ëׯ?sæÌŠ+ªT©¢fŒ† ¢óR)š]&劬êáÝúûw®+à«äÉßÞ=¾¥§7EƒM³ËjæNXV€`X’¥~TP¯^=à/phh诿þºuëV€Qˆ€£ï•U«V‰ô|ð 9%%åçŸÖdŒ.]ºð$Í%áZ¬êá…ZÏ­^1/'3ºD×ðÏ._¶×4lóFÎ’õ™Å£eXV€`lW@võìÝ»· `°/Ñ—_~éãã#ðÉ{eüøñÂ9¸W¯^HÏÛ·×` l@bÇKõrÖ õPyÖoãr3O–šê繎šŒh4Íöî`XV€p}©àÜÝÝ_¹r{Ú bðàÁp&0pLL œzöì)œƒáC|öìÙ={öÔ­[WÓñ’p–—„K°N¨‡áCúe&‡—ö•'²ÃcU½º÷Cœ(V*4qý-!+À °¬+`£‹/ðÔSO…‡‡Ã⋞ïÞ½Û¸qc¹Á¼yódÇÆÆeâHÍ i”õ»,/Së>\ø,V€`XVÀe@‚7a†­÷È‘#DÀ0Þ¹sÃîܹ3ôî?4üTÕ#‘§ ]¡BQB8.l!jÙ€©`?÷‡~ žá1cÆ p×¶mÛ^{í5õΈF…a¸¬D˜S X7ÔÃókVý‘—uªŒ×äøÐÁziþfÁ®úNàÎYV€`Xg*W¤Hlü%NLLÄ0`ö‚g0¬Þ¸'âT–\>ñEçïéÜjÕªÁx,0 þû÷ïoÒ¤ µ©]»ö¾}û²³³'Mš„lj†‘g9sî®p-'°^¨‡ª•gMŸ—ÇU({"°ë÷]4ƒÎÓ®°tx ¬+À °¬+`µ°¿Š/z„}œ““ƒ> ¯ÂíáxÜ9ͺq‡OýwQï¼óÎöíÛÉLŒˆE‹‘©MÇŽ±‹sM0`Q.S^—Î `Ó¡*Ž:àlZTþ¹x®jŽómÓúCõ2…ÛGL³ú‡OdXV€`Š]|Ëßï»wï|óæM ^¼hЮcçãñçtêì…nOU{šº‚×D`` LÀà]ì™:thÅŠEŽà‡aÆedd!•†0Èë²ØÅqÎKÀ:¡úöúáTTpþ¹®ú øìlÜèÅ2…÷ºsÖ_…`XV€`쮀œ îÅ_ #†S/®?à×__ýs¹E&dë×ÐèôACÇT¨XäÞç`$‡C05²£À§NÆ_}õ±œƒ—.] K3 ”ˆž¦æà2òk³£X'ÔÃgÚF†ùÏNàjP ¹I{÷ìzüñÿöÃ;ÇîïFî`XV€`œ£âò ôDF7AÀHiÀŽ‹W±)t{"!ÛHõ Žþò«ûààù°páB™€“î$ËhР]·~ýú~~~™™™cÇŽÕt.õ© ìOÀHpÒµkWM“Æøì:ŸÈÕ¸7®_¾VXíõÆ«Ï U™€ó ÅWaXV€`ì®ÜmeLZµj• àË—/ãr³fÍ*‚Ô¢s,ª»|quçà;w’ ˜8ù^™?~•*U¨ €" k’¼&à \ZƒíIÀÐnÔrp;qƒ_¯ýÊ–+ r’¸WàúÕ‚ë…™IG¶MòZ?´Î+÷} *°Ý?¸CV€`XVÀ9 ¸¹¹ @‚ßð—˜6ù Eð1frtRŽuÞŸ«…s0œ‚ƒƒeNIIÁž9¤Yé”a>sæ ùD0~EÇEsss)«…W@øÉäëjxlÆOÃî;c6À!}Ù€AÀ(©©©È÷é§Ÿ¹=óÌ3k×®ÍÏÏÇ5Ó)7lØ0$$Äqš8¿g;0eð| fßJ•*Ž3ü\Æ©‚œ®¸ráÜÝ»w.䦆ù,ñÙ4Úgã(&`ç¿+øŠ¬+À °¬€ƒ€ÑP¶N™2EðùóçqQ0Õs5_ˆI屄Ätúú¿ÎÁóæÍ“  æFµ·Þz‹(î½÷ÞæÂyĈš© Àîȯá eœÜ­MŒ<"o¾ù¦š}¡Z¿>ÝÒ’"/ä¦p5¨Àå‚Ì;·o^½œw2ØÝÏcœïæ1LÀN~3ðåXV€`XG+gNHçëëKŒìn” î»ï¾Cƒž}ŦäÚ¥nÛã÷vƒÆtQ`ÛÖ­[ÉLŒ’––öûï¿ çà~ýúá%ìÆûì³ÏÔŒgW¸b–‚<µV0\UämŒ²@Ÿuü4êøá y©\ *pé|Æí[ׯ_½¹/`ëDÿ-㙀ýÄý³¬+À °Å¢vL jªW¯’#tÆóßTpî;O¥æÙ±þ±dMµê÷7Áõ.2‚9øÇÎÁS§N…MÚËË Q#ÔŒÿL­X´×E-&`<+Èþ+²(ï5nè¿ïbÞi®Æ€Ù÷Ú•üôøÃ»§lŸÄl¯•Íý°¬+À °.¨¢í v2dˆ `J‡”xÁ}ãNçÙ½žˆ?óóˆ±9¤‹ÍpL6`”ô{‘ƒ[µjE#D â-[¶ ¶š¦s0Œ¡%7E—¬êáÕ­›×\ÌOãj\×.ݸzñlJX¨ç‚Ã;§Ú1™ Ø?ªxH¬+À °¬€½nʦÃ]»v ¦Tp£GFƒ¶ŸvŒ?ï tìT—oºÒ0àù°`Á™€‘1¾È¯½öµiÑ¢ Æ9¬×šÎÁ}ûö-‰ÎÁ†X'ÔÃãU«üùÇïóÓ¹Wõpþ\R˜ïÒ ÝÓwMc¶×‡ ÷à °¬+À ¸¬È9,øÉ'ŸþÃc†0ü"Ð`Ú¬?ÒòZwîhò~  vÂíØ±ƒlÀDÀÈ”2qâD‘Nø PF¶¹¶mÛª"°·1ÁJ–s°yÖ õ0qܨœ¬$¸±r5¨6ºýu÷Î¥ó™Øî¼wVО™LÀ.û9ÅcXV€`ì«€¼‡ >¥‚€›¸6¨aoøòXT ð71ý¼£ëŠ5Ï×¼Ÿ¹]»vˆI,0‚#r0RÖò>þøãsæÌGrËQÒfE©Q£b$ØW1Çõ¦GÀ¦B=ü«\¹ûöÈH1ˆ}Ü \¹tîî[Èî–p|OÈþ¹GöÍfvܲæžYV€`XWSì(g Cš AÀ” ÙÚÀ”ï4l ÿ"ठgÔ1¦Vüs0\“‘>ƒlÀ `G;tèPóæÍ‰wëÔ©³wïÞ‹/Âè«™Né<GÂÕÄWG›€uB=|ñY»˜!ÝÅÕ …Ïݹ}ãÆµË§Oõ\pôÀ<&`×cðYV€`Xû*Oa4EÎ lz#F4\©à`…ElVû;$e8¼FÄœîÚ£Ÿp^´h‘LÀ€à¬¬¬ 6ÔªU‹Ú š‚WÀk¡ÓÔÆ`ׄ‹§SV°N¨‡&ï½tÈërÁ®Æ¸}óúõ Øîî³$Ôk!°}?M¸7V€`XV ¤(еkW‹-[¶Äö2"`J30¥‚ÛçsD&àä̧U/ÿЦÍî;×­[w÷îÝd&FÁŽ7ìÕ#Ó/ìÙ£FB ø1øá‡šÎÁð{vÙ»ó_Ö õPçõ×¶oY¹à,Wã ܼQxóú•œŒ“Q‡×†y/>vp°Ë¾ x`¬+À °¬€£èŽ7N0¥‚Û¼y3 !{MAÀ)g œYÝÖo©Yë¾spûöíá 0 8::ú‡î§šƒsðªU«.]º´mÛ6DOSs0¢¿! ˆ£µµ¢ÿ"Ö õPuÉ¢¹W.dq5®Âœýû¯¿ùä‘M¾Ë`ýe¶biò)¬+À °¬@©QÙ†e:ôññ!Ææ3J×£G4èüMWMN=s!õ¬SëØ‰¿ çàŸþ†j²£dß+ÈfרQ#šÔ;#ÂŒðšÎÁ i2u»NùðW3³q¥J0:/û´qòã–px@˜³+ÏÅGì:î¿2Âo°ë¬u +À °¬+P\ “° àÚµk‰€iÓ`Œ ¨ËÜ6›"àÓg/8¹FÅ¥uïußÍ1`ë• þ(kÖ¬yúéû©æ¾øâ‹ä{…h^QÈkÂuœƒÿ!ûeÓXÿõ¯rýûõ:›ž€-\\ *pírÞÝ»wê!5ÆçÄá5‘‡Ü˜€‹ëS†¯Ë °¬+À ¸š²µ±gÏž‚€aLÅPÂ0䛈Œ;£CÀiY_}kØè=BD}±lÀDÀ¹¹¹Ø37vìXJ–ÀÀ¿þúk^^^ppp“&MÔ ¯‰?ÿüÓîÎ?îWߟwˆ+¼˜ÍÕ ×.ç"̼~3“ŽF­ \Ëì +›ÇÀ °¬+À ¸ˆŠTpk×®|ãÆ Î€±-?>•Z” Yí /€¿é犧.sÛPýégˆ{÷î@‚€Á@ÞØØØŽ;RƒgŸ}vãÆ………ø/þVspƒ àR¼wço\û…'óÎÆ^ÊájL<„9»u£0;=*æ¨Gt°;pñ®f¾:+À °¬+à‚ ÈÖF¤‚;zô(0¶”a´ð~÷Ýw‰Sg.0BÀÙ—Š¥&¥ç 6ª\¹a¨pö9s&Ù€‰€Qòóó===ëׯOÈÛ´iÓ#GŽà ÂGÈwîܹÓ)ÿ€ëÖyaç=òÏÆ_½”ËU_[7¯Ý¼~™ãÃvÄ„l>yd#° ~èðXV€`XbW C‡û>ûì3AÀ” Ç(Ü¡£1 83ûRqÕãщ­>þ„¦‡f8ÓÊ ÞEh‹åË—Ão˜Ú ¥\ê½òå—_ªÁ cxHK:å¿p½7_:êùÇ®?zægÅ_½œËUS[7®üûß!³qR”ç©Ð­±G=˜€‹ýÃ…À °¬+À ¸¦À;Ù:oÞ²»Å…í8ul;°“×+_Ž`XV€(Y 8p@0l½‡&F4LD¤‚ûqÐpË8÷òÙâ®'O¯x/;Hwøðá ^‚ñ7ÒݵiÓ†¦ÿÒK/íÚµëÚµkýpjnÖ¬b;íæjðñ·cï˜×5;-êÚ•|®PàÆÕ‹ݽƒ@¿g’C"öćïbvÚå ±¬+À °%W¾}û Úkذ!ð—8%%“‚žÁh°aëK 8+÷rVÞ•â­ñÉg¾ïz?ö¢nÉ'X.;wî„¿‰ðÑGsáþ;lØ0Mç`Èåç`mŽ<´&ÂÕÎ=R£ý¯]9_–ë«îÞ¹}ûæ5dwKŒÜŸx|/pÉý⑳¬+À °NV F‚€GŒ!&RŒ„,Ä•«TIε‚€Ïå]q…êã\¯þÛ4Í>øàÔH¡à`s0 ßß?þø˜ëååU§N5ãÉÛìw÷õ8*hCtðFï5#Ã=—–5F˜³Û·®_:Ÿ‘v*ø›åÅì¸UÈ=³¬+À °¥RØ2Û½ð ‚K,RÁ‘{Àü?WÛDÀç ³‹»‚€á—”ÙÐÏ1 _Ø})\š\,vb’å7Þ8xð ‚"ƒ†aúUspëÖ­I+»ó|òÈæI‡=¦^.È‚K@©¯_¤·¸r1;#ñHj¬_êI&`»/;î`XV€( `w— :ä L®®'NœÀ«ØF“a çœ/Ì)(Î þ&ÆæwúxZÜ!|`. O ØÆEßüraßÅjãøtV€`XVÀ™ È©àÊ—/ü%ŽŠŠÂ0àüþûïõFŒžlλpµXjn6#sÂéì¿L¨X±ˆqAºcÆŒÉÈÈP@pbb"Ò,òÂ9xýúõ7oÞܳg¢§©9øå—_†EÙ.7ÑFøÛ˜Ðm~îüݽ”ŸYJ øÆ„9ƒçÃùìä̤x>0Û¸°À¾o¾ù&­Ú®]»ÚØŸÎ °¬+À ”Pºté"®mÛ¶‚€A˜RÁU¨P <ýÃíEÀù®å_tb½ÇÜ:œ–uñôÙ ¡‘ Ÿ´ûŒ¤@Ä4www8<(ŠO£F¨ bÆÞºukÊ”)šÎÁ°(Ÿ>}ÚÆUaŸ Û¾û˜×’s»eć -p‰®wïÞ¾sûæ¥üŒ¬Ôúe¶q1Éì‹-œxöµ±C³§#» ܪ޻W“fáÂ…YYY:gÁÍhêÔ©ÔÁуºý•+WÐ E8mpQÍfxýËc3{!êÐl1+‹h ÓáºuëÔZ‰‰ëŒmÔ0x#¨SŠ¡[…ìÖSÃb å±<ðOÅ€1³"ë R=}5˜‘-®Bköƒ6Ô•üªÙÙÑÔtV/BÖ›ZÿôRKª­¦¼šS08ZôoÑ»Rÿþj¾ƒhÖfï;ïk,0œ‚#êÍ.0S7Ôø»›[º¾ˆr ÓÛ¤I“_ºt ãß°ahï¹çkE'æØ‘€Ï_¼vþ’S*PÛ§ž¹’Y°u×Á7ëÖ'ÆÅN¸   5ƒ€ÈÔ¦sçÎxT@bÙ$ ¯‰Q£FÙâl Çß{lçþeƒBvÏ»r1çæ+%®û^ÌÉNÊJ ?›Æl˧‰óÙô†¯z3À•^xÓãS_Ï€!¹½8´¤`Aäé¡nõ5Á—šaŠføF486Å…¨CýbvTò`ô;DWø.—ÛÓxô %1ÿ45Yõ#õ¯VLôF·RîÜÜpþ!T!¯ùo¹™°Nç:ƒT¯ ýÕkÒì–E ÎqDóÙƒº’¥6;;šV©©E.tS³Œâr 5,•Âàhq‹Þ•:wÖÔ;ˆfÿêÈcDQà5±xñbëœ€Ü'<î¿s^·äãž%ˆ€¾ðyÀv·Ü3±çÒNd>ÎlÝÒ¡³œÏ¾t]úâ¼ S Y§è½sŽæ3±ˆø†Ãß/ä/{‹¾k¨„séË_ŠòØcS\ˆÞä¢`xÄ‹òA€at\ZÑþ)¾ËåobA¨êöâˆ|EAœê!DP¶¥¬V@žè·U\T¨$f*“ îµÜÝ…Jš†=SjÓ*ÂýRè}  ÝwÙæG Uó¾¨uŒ¨Æ,ŒÇ«#zS£ç ð‘ŒtQ5¥Ñqq,•ÂT{õh-zWÔVÜP"ºYš:£%­ X|†@+üM«Nñ0IÚê¼4Ÿglù(æs]PX(®Õ­[I"ˆ€)ÌÀ” nåºíŽ à —¯;´ÀÌl'¦Ÿ‹Nù¡ûý·„*€` ‚Ìàíü%ŽÅŒ®]»¿4˜4m¾£ ørá ;Vð´} 86%7"6³ßÀaH Aàþ '`ã.¤Åk&s—l5NÀOf’.¶²°"`áŒþAZÆï‚C XlÙ”}E,º¢`D1AÙÎm «Aø¬Â´äGG²tê‡[Ñ!ZM)\€i ²{´æ»˜3]üM}DywØòÌ纾r*8X+Ó;i~±7+*0,Áá|õæ;ÕË…7AÀH”ã|²ù‡ÂÖªU QÉÖ+—ÈÈHd£6p2Ù¿?~áGl5 ¯šƒÇúÆ`;pzBpFb8ØÏ}ü¶Ù߯…ì¼qí2vž9¹û^/¼p!'^¿¨LÀV^¸ûÒDäXôµ„¯1ÍÈDD¥f-7ò7–u6`ƒP(ßç0W›‰~é&Ý4·BLÍ"0Î:‰Ì¶¦WÝ\ýñªr,š‘yñ¨æûˆ „¤Ð™/) Ÿ®¨3/ù¦ÈŒ(\·Å¯¦Ø”b Wz ï‚<ñOÅí0Bu–JAíŒÖ¢%gP[ú$QÌKçDZTÜ>SÅ}לšþORVV󉮣ÀKvTÅ;W0¥‚ûý÷ß±Šê¿ÓèDB¶s¸ðÚM+0Ú¡•˜5–¯Û^ãùZ„³Í›7Gö5oݺõµ×^£6 = ûÕÎÁÈ¥¬³*BÀ™I¡g’Ž=¸uÚŽy]ãŽî¼yýÊÛ7œP‹\àð{íÒ…ÜÓHr!U¶[üáàšì+OƒÂÐÒ˜xþS|»8€ ~C;Ÿ€ÕOÆôý ¡4½2èUÍ"¶µ™eYš¦bc¢Ù³4 ØÈxdU)°¼$ð·:¬8Å^¬Ö™¦£¾´ `S:Ël +©Â›êÇZaØb„„ì¢]‹pœî©Ý„â­q)Ä9¦,z6øþ²H[t®Žï¦ÿ(+âË ³Püæ@¯šš”Ž÷¼ÅÓ|‚K*€oOñ.@*8|UÃÉã…0²c ÁÀŸG;‘€o^³©:‡€#²ÇŸúˤ Š¢¡Áí¡ÿþ§NBöE™8q"€zÅ€§€XþüÑOËe†€Çïñ]—6!ÞnÈŠŒœp”ñ€)bAÐN8ò†Ù€‰€Ï¦†#ÖXz\PжÛf¶oqAN‚‘9¨"Äï¿ÿý×Íë…óÒÏŸKRWö‚0þA¡ˆã­ù•V,M­f K$¸Gí™à0ä5b$s>Ë‘¡h?Š©¸­:^ ÖáˆèÐ:62͵ (Á4“9:„€Lüb®é'ms+Xá a£-ZR˜z–áLÄ…3fó8ÐhK¡˜Îg”E¬óÀ£¸½àX‚þE¡Q™ÍŽ!žÀ våçI#ôýíš§ð3½ñ¯ n©P_UâÎ~øá‡pW%NOOGËÜÜ\J·} 3 øêõ[VWг3 8"îœhüç¿'«T©²hÑ"Ï™3/5nÜÉä¼¼¼*#ð^®V­šÚ´i:‹S€'îS®ÜƒÿüŸÿyôáŠî+³Ž€q,;#úLJx¤ïêÝô>è62å„÷ÍW±;Í~Û*êáú¥ó™ùçMWÞ gôc èðÿþßÿsÁf³i–ñFÖñUmäËLñåjÑw­´m#Íò¢ÙÛ©IZB"5%XtE#ßñô«±q˱¦ ØjúÐV'…ùÓî6`ÅS]T^ŠÖ]Q͈²/„í,ì¾4`ûä­r ó°©µ§I´:R/Ë Ôw›¥xÑÉCFXMÀèYa¿TŒJ‡´,²ÈjNÖTç¬ð6±èŠš _Û ˜ E4yŽâŽS±Ù÷&zSÿäbJŠâ%`(ZáÀ*–.y[™ú)IAÂÛëóûq5ðA†°Ý»w;v CE*8²ý}¯b!àë7o[TAÌÅHÀÇbΆƜ­ûö»j¦¤qÈ,-p¿~ý„øø)Cmèpçògª?ñÏþu÷ÿû¯—_|.ÐkE^ ÎÏJ„onNFLô¡ û÷GÔ pöé(ø0XZÁ¾E™/åägŬLÀ–~R¸&ë³—Ú±Oñe¦Aü¬,ÌÆV°ˆo*LÄ`àa‹xTóÎê–ˆ/+ŸhÑEÊ:¹J³GT‡¾Œ«O@Ý¡Eã!æ0© Xó¥ë*ü>m'`9ð…â¡Ë8SÒ£EĶ6“‹ø¸úvb è\]S 㣵è]iÄ BßßW‘ÇD?¨"°¥ß,¥»=L•°a øKœ””„‰Ã üâ‹/¢ÁËÜ‹‹€oܺc¨Þ¼Vv&Ÿ`¼Ñ„ ØÃÃGžyæ$‘ ˜bÌQÑ߇{aÆ8Ìm‹÷ß._þÿDWª°|á¯Æý€5 ¸ ';Õà°›u2póA·[g}}tÏ‚Œ¸83üõ×sõ/xP\½œ‡‡¼³qVΈañ‡«q°øXm’¡Ÿø$$Ú«½aú¢ï`yÿœEßµŠŸJɪ„ÿª!ØÒäsñŸ¥,ò€ÈÞ±–^‘¤ÃÅdåDÓô¡¡03 }?%ËìbÑx¨gy0âš°.^µˆG-² ¾Tè`ÑM1"­j*²hÆ™RÌ…Ìçø¯:Fœ.ØH€9« —yI­EïJ#¬ÿë"“ýEWQ,]ù%¶[ü5SŠN@†^ñÞìÞ½» ༼<Ì2((¯>X®\ȉ´b$à›·î˜­7\ƒ€»m…bÕ«WÏÊ?þˆƒW&`dN¦sTÌî[0 bâ¨>•*–Â#â».íN†î6²NŸ€á¹ †ËÎ䜎 ݰñWé_ú®å·4|íòyä³ø{-²û^/,8_ľp«°¦rN8ë>j\Šƒé‹“¾¹ñm‡oG|ŸÑ/•8®Þó$ÂáÚ¦#ïbQP¬ø®Uÿ6Š#ÂQ’8Fq®0Α·í­û±pP3ú˜æÑç?2Úéo*×'-µw¦þÄI ÅgЏòdé. ¨‰ŠÜH7ê âsˆZL‹Æ#+ë¢[œŽK£h¦‹ƒòú*ê•>ƩӹÑÕQêäõ&*t:SS°:4›Ü¹b½Ñ%L}aЭQ›‡Ñ‰ZK¥ öFFkѻ҈¶tiïHj ´%3°¼tñ2µt‰€5?@è ÙmvÖ}JóYÅ®¾(,á777"`Dõº}ûõÿt8Þ¬Eklö*^¾uû®N»ÿÐs}›È\³fM„ׯLÀcÇŽâÇÓlf8Câ±wóü'Ÿ¨üÏþ“zǹkÕðÚ¹Âl,ƒ|åbNá¥\ªé§#ýÖlœˆ sû€m81üÀµ+ç±tn\¿ ' ¸ÛT9+² ®ÃÁâ»Gþ¸Ñø¦§h¶§ïZSE ¯&CZ ˜"u…ƒ +š-~À¦®.ß[³¶Fa7¥³ô'N³P³ æ€JâWodà*š7BMó–ŽÇ”ò¸œ)ü5KÀ ²ÔŒöÂÜ.žè¾èñû†S èW°Nçj–¥ñh2.Ưþ‘Dˆ GŸ€ÕR¨W‚bäbT½+Íj+–t> ÅoG¢ …RQPý¤§n¦8KñälÃG2ŸêZ yŽF*8X|‰€cbb0P¤‚£f¦Îu¾}ç®f»×x®(<ðæÍ›Iƒ ôÄd†óöö– a7„ø'X¿%`DC‹ Úüa³†Ê?$.Pþ¡ÿëüE›È]:ÑЬ `Âø#;-á„Ã,C†‹ yi¹gbíP™€Í- ³¯»ã›LZÌþäA'Ú«(ÄÄÉv«YÅâë Lý4LÚ„½ÇT3º„)ÁuúÇÕžú6`¡~îhÅt&N/™êMÜ9¦Ðü²§PeBSþ»VŒGVýëÈK²ë«D~2ú;´Ñ¿ †$ëLWÔ/bIèwN¯Ê7…Žì\^ð:+ÙÔ}W‹c©VgRŠw¥Ùéë¿yŸŠ·':Ÿ!xk.]swÀäç†ÙÏ^nàâ Èñhñ· `Z'©©©ô3½×á.BÀw@ìïLì:¼Ëëè=«k¹ÄÄDAÀãÇÇAÈ{èÐ!™€yä¨x1»T, `І6iLÿJ•ŠâØQÁ>¹ŠÊO=ÈT<` f`õêå|ä¹@@ »ÕŒ“ÙéQ"g¥†ŸM ;“š™’‘x$#!(=>0-îÐéS©±~©'}R¢½“£¼’Nx&" 2b!Gì‰ß¶£HЭ±G=bB6Ÿ<²1:Ø=*h}TàÚ‡×Dr;î¿2ÂoE„ï²pŸ%aÞ‹\êµð¨ç‚£æ…ìŸ{dßìཱི‚öÌ Ú==p×´Ã;§Ú19`û¤€­ý·Œ÷óç»yŒÏ¦Ñ>Gy»<¸a¸×ú¡u^yZÈG{³·Ö \‡ƒ0Y¼,Oú¿Î»Â˜ þ\a$V_Ò§`õÜÍžÈ☕ˆ”©àŒV0¥‚[°`¾Ç_£B}¹ ßýë®TïÜýË¥xÔøéPì£>J“ ÙÑñõ'ðܹså_ZÀ'fžÅŒŒû·/yò‰*Â#—|è¡ÿ{ºú“›Ö,PgÄ0LÀÙW.š¬Øô÷ßœŒ“v¬LÀf‡ÁÌÁ…²o3ü¬øÐ·ïÚ÷Še³7³†ö²) ÍšÅ)ËwŸç®VA”„ÁÖ ó$ðñãÇÑ~À” ®×C]‹€ÿº_°ïÊÕøÝ÷šC1$‘ “0"ÌœLÀß|óˆld}ZCÀˆ†º³]›d\¸bÅòï6¨{Ä»œÎ(_8wÅt½z)÷GÛ±2YÆÛ0׊[– L¹g” )8n¨,Žã´åžK¢}ûöÖ Aà/0è ÓA*8x£Á*÷=.GÀˆ/‹XÅ.FÀÁÇO#hC(ed$ ²téR©_¿~`` LÀÏ?ÿ¼¥¿“[IÀ m·ÇŸ5Ÿ{ºyóf"y ž#ìdÔ°‘!(+²AF8 ‡`0˜Õ¾•½ ìþ£à`ü*a÷Kp‡¬+À °¬€ *€ †*øâÅ‹-¥"z¬rU¤:s9þëßýårâ±}óJDCC,Ú ?`9'Rççă}/ä§\,H£zéBÆ­[W[·n]¾üCõÞªƒDVdÊ '2bÜŒÀºµðb6ø\Z¤Ý+ï„sµ+À °¬+PâÀ¾7aؤ>#©à fÍ_érìª;ឬV`Û¶mñ7Ž<ûì³È±'p£F„øðE1¸xÌpÔ‘­:}Ù¡m³£>k4 `z>7A0ŒÁÿ©gïܾAûõ*U¬ðÌÓÕÌ™šwé‹•|©à¬ÙŠMrLÀ. Âà"ãf¬+À °¬@éV Y³f¾ýö[AÀ” ž¬x^­A©®EÀ® Í}»7ƒÅW6ÃŒƒß}÷LÀû÷ï—SÁ ¿\³ëÍ LJï¾yãê¤q_íÅ«¦«mÀpö½u³° ?™lÀÀßÂËÙW óP¯_+€+ÒrК@¼ˆ Êÿ2â§È°Ù|éü³›ä@ÀEöZGTކfv™pV€`XV€0¡À… dD=#¨Q*¸‰'¢"‹9ëRì²1z÷/rløüóÏS¤Ÿ`\¶l™LÀ²õÝH*8£^ à¼Üð6÷ùuß|uHÿï^È ‡ôl·n\½V˜'øÚÕü×/ Â üÓO?ÉË1,€ÂÏ>óô„±#Žñƒ„‘zŸ€S#²R90ª±¬+À °¬€• È©àÊ—/ü%>yò$zD*¸¦M›‚…†ŒœèJ|çÖm“µØsÂÕ{§È±aþüù€ùGÀ¸‡– øÓO?œi$œœ“S”äúÓ6Í÷ïXòíWíš4ª低bA`'eEFàËYýu÷öíë0 ߸qéÖÍ+ø[â ÎÿïÿþKLýŸÿù˜„Ÿ|âñݾ 𼘟©S/ܳ#¸„c*gİòMϧ±¬+À °e^.]ºûøãŸ={Ú€á€Åh°Óë¨ë0W¿Þ¸yçúÍÛ×nܾzýVáµ[W®Þ¼\xóRá‹Wn\¸|½àÒµó¯å_¸šwájnAaöùÂsùW²ò®œÍ½|&çrfÎ¥ŒìKéç.¦e]<}öBê™ )™É™IçÓÏ'¤åÇŸÎKÍ;•š›’“œ”•˜s"!;2!ûxü¹€c 6S„RNþO™4i¶hÑâèÑ£2?ñÄBüÅ‹_Œæ½ ®\¾X¡BQ&äÏ<µôI3&Cò‹‹&ËLY‘ÓãƒsÎĦ{ãÚ¥×.߸~ùæõ+ׯ^<Чç÷åz(,ÛƒÅß+V@ùªó{wm¾˜Ÿ¡®Àk˜“Á©Ž«œÎø¢á–¬+À °¬+ xøá‡Ò i« `JGâgŸ«sÖ%øæЭ‘Z\<ñ·yP 1•þâ–-[âà”)Sd†G„ –—f|Yš'à[7¯úîsƒ0®ñàƒôêÖi§Ç¢úukwý¦cDÐ6²§Åêä„ËL‰œ5}â£>ÞÕä`¬T©b½ºofŸI¼˜—.WDЏGÀÇW™€/nÉ °¬+À °¤€¿¿¿ lÉÂÆ,"àˆˆ¼Š8h€6jÐòãö"‹Ý\k¼‹ ¸U›k̘1ˆ¤A%&&†RÁíÝ»W&à~øAˆÿæ›oZ´& pÔÑÁ[ø¦=]æíz¯»»ÍîÙµSõjOL7Ø Ã]˜bAøìøc/ø?À ¾ þßÿýß9³¦^ÈK“륂3 `@ªCkfRHF⑌„ ôøÀ´¸C§O¤Æú¥žôI‰öNŽòJ:á™ßã{"öÄ‡ïŠ ÛQ#tkìQ˜Í'lŒv Z¸öÄá5‘‡ÜŽû¯Œð[á»,ÜgI˜÷âc…z-<ê¹àèy!ûçÙ7;xﬠ=3ƒvOÜ5íðΩ‡vLØ>)`ëDÿ-ãý<Æùnã³i´ÏÆQÞî#nîµ~(Ç‚°hescV€`XVÀÑ `Ç?…½¢òÖ[oÁKU0ðÀf¸‘#GR¼„ƒè?dô‘ÈÓqçðs?~÷JÌŽNÌ9™”g¸À1 îtœà*‡¸ Ày åL àN§¸ÀÁngr/gå^>—w%;¿0ç|anA‘CBþ…"ç„‚K×á¨w8-\¾z pc€3pÖŠê|/ˆ *B+///AÀ+W®Ä‘:uê„……ÉL{ã¨ÀúnÑí¶€€Cmš6éçòý.óÈ#•&Ž´jÉ´Z¼WãÙêî«çšµ ñ€û2»âzè¡råŠV þ^¿fÙ…Ü4¹"X0°E+›³¬+À °ŽS¹Ÿä4ÈÄ0ˆ] ;á`F˜CzzzÛ¶m©ÙSÕžþc™»ó ,k]u¦ð²µEA«U«–(•¯¾ú þùg™€wìØ!ð„„„Xt»-#à _÷«ç¼òrMºdƒ·ßøsÞÄ铇½úr­OÛ´ Ü¥ã¡&à ¹§©FEþ6yP}öîùƒ8.þ€oñí[72“Ž:¸² Ø¢ÅÃYV€`X²¨Àܹseß_™ÃÚ·oÈ"ppppll,ÂAL{öìy饗¨}£&Íwrš kKuÚN¸n½B䔕 @Œƒ7n” xÔ¨QBy쇳t!šÏ wõrþÙ´hxAÀ ö?°vÿŽe>-òGFyàÚÒbÉSúõú¦òcþ4 {ÒÉC™IpW8†PÁßk*+rAnªñzñ|F'†8º²„¥ ˆÛ³¬+À °eG$\xùå—e䥿ŸþùnݺQD~èÓ§å„£ v6iQl`„5@´„ok÷>ƒÃí~µ½:'DçkA™uëÖ ÆŽà‘¡!dnÒ¤‰¸ fK¡ŽÞst+œw/]ÈÞFì³ÏíÀÎð‚¨Zå1ºv¥JúöüúÏy“Ûµý°òcÌ™1Î<礮ˆ.ÂS'Tö¶tq{V€`XV ´+׺uk5ûV¬Xqüøñi÷ í“O>¡6HÞ;{ölAÀ€àðððììlÒ)??¿GÔ²r•ª3ç.uœ0\íS mŸ_=DGG'ü§ 0á!°¯¯/Ř£K y>ydsLˆ6‡]¿zéäqAÀ{¶.ݼnÞ7?}àÞzîéa?õž>yTÃu{ô‘‰c>TÓ|>'Å¢z!?½ˆ€‚Ry'œ¥«ˆÛ³¬+À °¥VøòÊ?¸Ë ŠEÚ øøÊeÛ¶mسEͰOÎÝÝø‹GU°Ý¥K—H¬ÐÐÐwÞy‡Z¾ñf½m{üì¾›áì[xÌÄâÃ?ø‹?H"dÇ ‰÷İ(œX¦F 86t+"!\½œ—žr’lÀ àí›mÙ°`ñ‚I ßyKŒ£î›µ'>aôfMß­X¡üÀ~Ý£#ür2cd?`l†³¨".Ä=rNåX¥öcŒ'Æ °¬+À X¢’,È9ímýüüì+ÿsÖ¬YâÄÎ;3”^xáÏ?ÿ„ Œ'" çææÒÑs«V­¨å+¯Ö^·y·-ñ€Á©Ž«ŽÈŠ_x.ÿJVÞ•³¹—Ïä\F¤í@ò¤ð@"¤óHÉ,@j=Ò|À¼ 7¸Ô<8=# ¶F'åD%æ|ùUQ‚·þýû üõRÐ ™€ûõë'îˆÙº%g%' ;Ú Ï3)a7®_NJˆÚ´n!Ù€/˜²ä©Kþ˜6wÖ„N_|òØcˆ!>üpÅÎ_vXï¶híª…ýûv¡ÖóH 7x@ŸÃžpЯ9÷‰—X9'œuKŠÏbXV€`J¢°,jºüÖ­[À*® ØÊö×_)æz†ñXŸƒ§NJ„áð€Œ¾h@Œ‚H©©©€iê ."¦ ÿe|\J¶ñœp`SçTû0…@Ü<PY½z5ŽàÉÛ eÆx «¼u‹Í&NŠòJ>é—åÊ¥Ð`ß•‹g¬Z2Ómé,·¥³W/›½zùœ5+æýØû‡Z5kˆ>øàï7m4ö—!>ž[¶oY5àÇîÏÕxæùçž>tÀ‘Ãò²4+⦀¤N®œÙºUÅg±¬+À °%H¸çÊÉ´T©ReÑ¢E@^QΟ?Ož»šX|ùòe˜‡åSÃÀùã?Ò%{ì±)S¦Ã)"++‹Ò)£l¡£–ÕŸ~fõú­F²"#1²«ÝlÀ»|1Mìø‹?¾ÿþ{Dpe™€½½½eó<ܵ­[iv à”ß´ø@8E\¼xÞ×kÇz·yëÝlX½`Ú?Ü×.Ú¸öÏëOž8²Ñ»oË#ÆÓOËM›<úXˆçÞ]ëöïQóù¯½úRì‰ µ¢ä¤p¬¿“+°u«ŠÏbXV€`J„šÉ+I‹MlÉÉÉ‚_áò{óæM#“"Ã9X‚ñ~ÖoÚ´)qÑ믿¾jÕ*à/ -P|è®…maÂäù~óýÁÁngr/gå^>—w%;¿0ç|anAŒKµ‹Dßà EÇŽe¦Tpp ‘ xܸq’ÁÃFîˆfûp*ØôÔ¡³)á× /œËJ÷ܳi«û’­—nÛ´|û¦Û=VîðXµc‹Û²?oÿiëG)²ÿ‹RîÁÛ´n1wÖ¤ø“Aï6¬¿sëš¼³qŠZ|€ýœ\™€­^X|"+À °¬+àÊ Àiq4“c;¬Â2Â"ªXÙ¢é 2rdèsðš5k8ƒˆè£>òòò"FÐDLÎÁˆ† ƒô=4ÿׇÄ&f¨ \LÕ~Àõ4ÂìBI¤© ~ŽP*8™€Å¶B¼jE*8qíIÀiqé Á¹gânß¼~&#%ÐÏží«÷n_³wçÚ};×íÛµ~ß® ¨ön\ºè÷/?ÿôÙgªÿ …Ë=ˆx;¶®É=§¨ˆNñ-†zÒ'%Ú;9Ê+é„'""'ß›±'>|W\ØŽ¢ðp¡[czÄ„l>ydct°{TÐú¨Àµ'¯‰<ävÜe„ߊßeá>K¼;¸(ÔkáQÏGÌ Ù?÷ȾÙÁ{gí™´{zà®i‡wN=´crÀöI['úoïç1ÎwóŸM£}6ŽòvypÃp¯õ ¢OnÌ °¬+À ˜T)ÄjÔ¨!CýýÚk¯mٲ匪 Ÿb8€Éàä`DV̺QQQê®GRRRàò+œƒ{÷î ø&†G ‹)2süôÓO4Î*U_´t•l†¸«;á‚#ïÁ}9DɱQÁ‡vOþud‘ ¸ˆ€cõü¹DØ•‘®x*Û€­^_|"+À °¬+à È6TAQôGÏž=A–‚V›”° N2cË¢€nñ_dëUL æa‰ñ*Ч§'‚ÔŠ±¹íÊ•+ØE§ÄûöíI’ëׯ’† Œs2xZ¤SÞºu+sÐà¿ïÚ#!å ´Ø«ÕÑÐZÒÑWà/ á0 ã beÈ ·qïš5kfËÊr,g>~.í¶µ]+<ãúµÌôÄðPŸÀ}¢†ñ<æ{" !&85!ô݆õvx¬ÎÉŒUTôí›×RNzOe¶e‰ñ¹¬+À °¬@q+€´aš.¿Í›7GÆ D] Þ®·4d„e¸xñ¢h/‚À Ì…+E^^ÚÀ$ bƒÑa*F>3ÑàtŠí€‚½t8E~Uý7úAÙ¾øâ … F‰ŽŽ†×<˜Ñþ;zôhÂÄŠ•*ý:e:´Ø«uñ€‘³Ø½{7¬ÝTfΜ‰#Mš4!§á!û®X— N¬DgpvFtNf 8¸ðRîÛ· òÏ¥&EEóŽ8ê…z"Ì;ö„BLPjÂÑ{ì†ÆŠš.œ}°Ø*û÷‡_Ÿ`XV€°B+’&(Œ¾øg­ZµÖ¯_o Uãæçç‹ÆÀPä­ s/‚s¡2 #˜ƒÜ!NÑô—À&9 ¶Ã~Œ0·”˜n¯ƒ ‚)”8ˆs©gôóÙgŸÑì^«]gëŽ}`Ðâ­–fÄpÛ°ƒ|?þâöíÛã Ÿ¬ÂDÀ{÷î•ï£u©àœNÀ'sîÕÜ̘Kùp¸sçöÅ‚œÌ´ØØ¨C#àÍ«¨¥\ó³î0Â_åpV|îð)¬+À °¬@q)B2•Üø—_~1‚ªŠ‘Ã5âDvb}agÃ<,^Bè4²Ôš*° Ã¥Þ: ä… ˜˜ï¹çžÃ…ˆ€©À2ŠDtäŒÌØÃG-Ûwü"2& ‘"Š­Z˜®gßAö·ß~+ÏŽ¶»!‰Àbð°aEÓ¨Àlãºr’ f`EÍÉ£8ªA>x(â²—#7*}ûöÅAd–çaÉ陊թàÄuŸK2Raú=srT¸¯º1Âß#àýÅ[™€ý±Åý³¬+À °V+`*¹qÕªU¹š”‰ ´­ ÑÌæ¼(S,\ȳ"œ0:<|ø°NÄ41A+¶¡O³Œ¸úÏ?ÿ,œƒ‡."þ†CelF a.mÖüCÿÀ°Œs—œ_ÓÏ]DçÓg/¤ž¹’YœY”q>1ý|BZ~üéü¸Ô¼S©yã'ÏÎ"¾›<——^z qË(•éÓ§ üŦF}'#KÈ)œuζŠ, à"-öÊ1Œ,+nà °¬+À 8QÀk—.]d\:t(r³¡„$<á¿âÜ…ÕAlkƒƒzàà@m@·pº…ï„8žÁ(âŸ`µuëÖ¡%ÖtlÉ d‚oA§›ý›í=Žf R„ó€ÌŽpM¦ð(6lú“SÒÈLH’:¹š%à÷šÅ6ž4i’˜Åp «0å¡Ò®];qq¯m_\Î!àˆ‰fKE‚Œ{¼¯ø+°í‹Ž{`XV€`ì¤%7&˨¢`¸JFUÙpˆ¿erÅŽ+ #xtÅŠpí£CÜ???âc@0¢@ˆ…˯p/ÁK‚£mÞ¼1€sƒñ*Xו©Vaø3È€®ÉĈ¹F†RtÛ¿¿l.…a›œƒ1G˜ŠÉyiä¦NŸ$urÕ±GÆ¡±QÄ7*cÆŒÁ‘¶mÛRbvpQ¨×£ž Ž˜²î‘}³ƒ÷Î Ú33h÷ôÀ]ÓïœzhÇä€í“¶Nôß2ÞÏcœïæ1>›Fûlåí>òà†á^ë‡Öyåiqû'L˜`ËŸË °¬+À ”P`ÿ£XŠ;èÀ±]L0¢>ª*¦rE{¹*PFY8EÑ ÍÐXô&œƒAÃ`b™bá® :"ë@0^Âμ¦M›’ ¯¿þúÚµke–ƒ-ZT¥JjÙ­g¿ÈS§SÎ8£jí„«V½läÑ"äŽÔ©SNÀryñÅÅí†åÛÈ-0ÛÆ±|65Â.5;ã$8>b—«T&`³+‹°¬+À 8]8€¶nÝV»üLìô᛿ ©äÆ&{¡Œ‰1†­fE @ô$46ÅšpŠ0å—¦!\,D‡ŠÎ ØH¼ê -Ñ^ŸƒáªºDŠ­ZµBè7Ùkƒ<1°6Zâ~:劕ÆL˜Š( Ωr,ˆ{ýÉn-’2€ 2Æ`QY~ÚÁDÌ/-MÀágSíP(­ˆ€ÃwºNe°ÕÅMXV€`œª~g'V€{h)ã`„ÐLnü / 0d œ_) ¬¡FîŒÇhŒ-eê®è^Â…ÖFzCrù5Õ†‡í_šq'Lõš‡Ïƒ©é8œ+àAÎÁp'€ƒÁÑ£GeÄ”ƒ±ÛŒVËó5_X¹Öxê„*¢¡õ<—F„yxÈŒƒpÂÆ°E1b„ `ÛSÁ yIÀ)ágíT‘#ãÖ«qa;]©²„Ánæ* À att¿ãUuÁYê àS[¿+œ¢h£Ù¹|Pþ&0ÕX=xºŠÙBSÐ6¦¹pá©÷ ì(š³ÆÕõ/d<¨¾<Ke׃¸Y¦F«¹©O•J ô¿­Ívâ*ï„Ò>@ð›o¾Yš8˜ Û²þ®T©ÒäÉ“e"„u¾â|h[›>¹Â°ºmÛ6rù…ÝÑbÓ¶6DðÕ7±ã‚gÔX‡€éŠà<#–`Ú“_^}¦WáöгgOR FÖÙ³gË»ÊðH€ÈÁ´“®AjÙ´Y O¿£ TGWŠüNâo¿ýö››»»;Ž<þøã¸qriذ¡¸û¶§‚³?G…îû¦K‡†ï¼õíWý½6ŸI>v&%Ì^õÜ}ÞË«ëTö.íß#¥m~ï½÷>D`/151¼¤þŽÁAp¡|Q¿+4¦¼DÀJ:Q³sùrâ)õ0ÄÅ`p–NczIL™Cy.€ÝŽ;*†‡â B(P§(z6»€t 7¤?•;1;Yùæš­fÏ4}¦»©3Aj ͬÜÀA ”ÖInÜ»woÙ ^Š{°ƒg­ÀÄÌÌLÄ2£°»jrªÂK¨êéé û®8$Ýiè=‹ƒx°D ÚÖ¦éb–ÑRøˆM›6Ýe`…;¯ è Qʯ“'L³¦V^B²gÇÆÆ!`jƒH 4 ,`.øRæ`$Ã[]ý ç௾í~*!=ß5-ÿXT F+u@@€î)vîÜ9DA9~ °×[Æ>6`ï½kª?ÿì÷côZ0¶å ¯®^uÎŒñEl§Š„E6àcÛ]ª2Ûkr?NPœGèƒÏΊ« Ø%S( Ú£)è‡êX=©7ÎÅUè‘â’˜HWQXôi'6êgÉmp\ó\j¬IÀ¤ þ‹WÉŠIWO™âêÑûo(“Rw(øU†`ö¢qiÍÑʬ/÷l–€ ÔFsñ +’]ÓvnP næJ4/^¼Xä–Ÿ<- P ”¤‚À êÝi Q²SAF ø’¹"dÜ dTE68À´hŒ?°àåHgèW °­ÈH Ž7Ÿ‡kÖ¬¡ã :¹CÄš € ä,^‚ù„G€ŽŠdÔ'þ)†fh,Ïaƒ±{Ož¦|Eñ7#d„—-ööÉ ×d„›Àµ  ñ çàŸGŽ‹J8c­cê´Y—˃Á>\°`,Ó¢`ß›¸ûˆúl‘c·þ{Ê>üQ‹÷Æÿ9sC´Ï¡ÛÇø®è·wîsÍÞ²#Ÿ:¶Íå*Ç‚pÄg6÷é h 0•/eê%|¬NÁÎ'Ú“ÍO>"wEFbÙ"¨s]Åt‰€M™õÍÏúçª ‚˜²\Ò”e¨¥#úÞÝ:&S¢µÙU¿½âÒ:£U÷l–€Ñ¹À\Åc€c…ÅÚ")¸±C(qŒ'[áÈ!³ïÓO? Ä”9ô¦³;RKˆö0 ÂJ„J¨ ÎÊ(5}Ôä 0Ùzáì‹ UAçð} ã´|‹AÃ`bÑλ{öì!S4æÈC©Ó¼„¢1°ÆiyÖh,ºšƒ1žÑ£G‹tÊ €…Uö§JMM¥øn?üÙgŸ‘æÕª?³péÚ8¤/v@mói‘9IžÅ0`±Æ ¬ðs¢´iÓF¬¤8±ã;żgëÒ—^{Å7õø–Ø€¥á{¦n~pÉ×›'U|öq¸Cd&‡Ú^‘O®ˆ€C·º`åhhv\ŽÜ•ãJfTap5BÀhè!H'â™ý4ÇLø%_Å^ŒËéàš¥Ljh¢¡¶ âN&`2ÛË Û‹€…†‚e°&”‹ƒ¦ž…·¤¹gK(l*¹1\~ÇŽ —wªª¯H¼j'¸r…ÙUÓªªß›š\±=Ž8•Œ¸06ë ª¢s Ã Ç tr_¯ã L´ð£ [²¢Pä`yšj¦wêÔ‰hûÉ`j•!ÛÑð™C–oØe5jD-á­»}¯ÿ©Ô<ûÖ +¡sXßŰqG`àúË~Ì‚€í’ NHgv[2½A³Æ à]ñÁn‘fñ 3páZµ|?3é¨íõ\Zä­…±¡[\±r<`K?†¹½Ó‰ K§Ú:+†£©d8î8K¹Ô•ݹLá²B}е/“i\ž”<ŒD¶w–>ölƒ,̽Â4. Ãmiwú;€/ø_\–ƒaÈi&7Æ“*Ì·À;QHÁ¢›J!uÅéØ˜ÿ„UaUÕïÎÁð §Ra¦Ercy„ ? S‚\ÉÅBœ 7b"`ü!wã´Nêp,OS>]ü¡¾ñÆÄ”ï¾û.Üšå݈ÃhM½O«W¯N-;~Ñåph¬½ xµûNôùä“OÊ—¦ü&°Uø. ðÌÀåÊ=˜‘b{EB">ºÅ%+gİ胈ƒ »/Á¨ÚeSRÕ6Qr!Pÿ4M•ö"`¢yS0m© ˜z£Y˜äàdVûlØË¬~D1HÀX» —_SOAŰÊù’–(àjŒw¢¦Ëoýúõ±óIMrð^P{Íê€O,]M"ÄAìHƒaØH@q 왃瀩- X @—» £ˆ#@R‹œ_€®9H„U‚õÕWðÜaÖbÊQ‡ë"¶Z… ð! á ?~*36%×ÆÚ³ï tˆëŠ‹Bº në!©tíÚUð[o½…MT€Âø¹¿˜}*p,ÜãöÔsOÃú à/*9BôØ5³R'ìZk/Fê5—­œÎ’Ï^nëlôIÖ\µû©>¤Š jòè5OÑ$l:hd™ Xù:ü ÇȉÕt¬¶xÕ”±æN8:Hãid¯IÃfwÂYz_éÒ˜‹b¦€ØógÑN8ÙkŠ×¿ô’ÂKG º8 p} º¥jp{ç+à" ÌR›~‘ÜxÙ²e¦Sá5«#¤‹¦©ÞÀaä{€ýpfïl±tu`¢©ñ*«)¶µ™ê™\~q/LõF.:Æ&¹5{†2x ç`$¡P¤aƒG‡pîÖ­}HV®RuÖ¼¥1ɹ¶Ôçj}ŒÃ¾+®H¶^$~ó\jÕª%>Ÿ $XþNÒf_kŠopJŒo•ÊNÝ¿ þ`_€á†#ÄÃE¼&#ñˆ5ëtlÀ.‹¿œÙìG7(FÔ–ZS.¼V0ÁØTLPö¸P°²ø Sÿ!3«EÑÐÂZj¦Ó1fÁÖbl’Â[ZÄgМˆAyÀ2|kjbi44aE8 è! =Bà¿2å·cüÂBça£<_ÚRŠƒùU^ÿ°5<FPøèxˆaš9/D ð(BžáÙOôxͶ*Ž1i[È!45$T¥¸ xoÊ*ƉWåmm:w³ —_œbj²0‰ ƒkÍÞ\èæááö°Rë H¯Âíá£>"ý 2•Oá,œƒáˆÒ¼ysjYçÍz¶ì?™”cEõ (ÚëŒ8hØë&ö`ìׯ¬Ñ¢à¡E^xðÐ$`aÆt4¤M‰f;²ÿ»_´øûÂø ðÿ>\!ÛHÀò0åeË®sü€E¸7u„ {ù«¿,%`ç%ì1/o¢9Æo#lo¦ ` ¡Ð š0Áv2¹‚Ï`&T€ÂÂ*ßæî4 ©+š%''Ãô(“«Œª Q¹CÅî4ÚÖ&›–¹Ê9/0 A^οlœ.¿”ÚC¼„ÏX‘¼¤+º"¶±Lü80­tM&ž1c†H§üÃ?àr2¤‚éÉ91z…sp÷>ƒÂ¢³ ÖÆM?À-7nœèáäp—–ñ#.„X§_ýµ¦6x‚2b ¶§Æú#'ÂÕïÞ¶ýòá7{gD§šÏ?ë·Cz|íõlJX‘ 8ØÝ•ki"`¬o, …;ÿ³d)@ŸS"ò«â§pa ”múj*0a zÓ„T ‹¯IMû(Í×"ÆW&¥ÆKÁ…Î!`Ì‚$ÅÕîÈ%‚€ñ‹vÉz§ðhAÀa†ç¥¥¹]l„`?óÌ3Xÿ/¿ü2~vM,‚\ ^aU…„8¶^}?Zp'Ìœ¢½Àh‚iò£À×¢h€Æ¦v§7ñÙ"Zâ,A®°­ ? `ÜŽåÙiÆ£ Ã$,ša˜t$&…N(¶1þ‹ôr‡hèŠiªµEÿˆL܉0dàT„¤ ðšúýS 7”Ê•«Ž™8ãDB¶ÙNI75Ztûã?âHûöí!”(xH€§„ `˜‡0m•3 Æn|úÔ¡ècºÿÐ >ÁñûM„íN‹²KEveptð¯¥É ÂÆO4>ÝEPhåQÑî2­ê@ªpýTÙæÐ9ùh&³€Ñ¿Hùf*÷˜E¬µM–H¼N#`ŒAxñÊã)ì"+Ÿ‡aD@ |êÈìG–Wø 9Ѿm ô¡‡Oüž€*ƒLÍ€€Èy«­8 s¤lÉf E' á€ ð‚&À)³¨ªèlª WôC0 ªaë ªz¨ˆŒ‰ˆS0M¢^òQ¿Î¬èäb¡Sàž /ZpAÿ2cã °ž‰V­ZQË—^ymùÚm‘ñçt꜅nh ‡c¹Ãºuëâà¤I“pïD‘·Išá…bSc}{pZ\ ƒê™ä{´ÁÅ+°ÙnàLÔñË䫫Êé@*€^¢7_rT0ÕÆ.,ÐДáÖ"Öï¦ã|/RU¤ ‘­qLÀÎ|û”îk¹û’È F,Xø4hП9 süS¶ÎZĈ‡`j[›©û gNNŽÌÁ¡ª¢[¹ÆÄÄ(ŒÓÆãy  )è´{OAüdœ61Óꋉ|©©eË–²Õü…UDóÅ^yåâàæ¶Þ¾?ðxü9ÍúE—ïѦgÏž‚€½½½ÉÖ ¿/xwˆÒ¶m[a†k¸øk‚íKÀ‡ÓâRÏ$»yýJTຒPKÉN¸Òýé_FfGV^Ÿ2´ˆ|ò6/ Ì®ÔLý£¼Q¸ë\Nݹb?™øÅ_ŸbÅ—¥f"7K Xô­ `â4k9fœÙpò¶0+ÚëgJÓ'Zá ! Þfw©cA p&V‚æ&?Í÷‹ñGš2òv+)Ót)ö5EÀ`;¸6iÒïAlJÙ»w/† ¶³´ W…æ¶6S7‹\~ñ.0u!P ¶…¿×€QDº5Õ|QŒ÷†–°àÂþjªCKƒ‚‘‹…Žª¸L³Â9h°‹Ã0/ œƒáúLS@ŒáÊ•+¶~ý}¯€c qçõ©jE{ú—/_.z@ÿ8—_Ï¿9>ôäÉ“­&`K°= Žª™I¡LÀNŽaÑ{’» fâǘɩ@ln# R²ìê'Œ”lJ S‹Ë‰aèS,úWïQµ”€q"HZ›ø(šõ£¡ÑC‚‰fìa…8fmºŠÀ½úÑÓHI¼ùlèÜyRòø™€]ð]¯?$d_#ZV›6mha¯\¹RŸÕ416`Ĉ ?òš5%½ÀÜä¥SPHž è1hÍ.„€Àuá®`ª7tøacjf{CÀ܆ tÓŒ;¡3kèlö¹þ½zõ¢ç`0« Áø‘ƒI[¬1¸“M·B…Š?ú5üT–¨îÛ½©ùt²õþüóÏ0ü‹²hÑ"ù›Øm ã\MŸà’DÀ'üZ"jiˆ†fäÝÈm\YX7Lú;Z@É”¢‚>4ÓUÀ2jÊéVž>8Rÿr¦raˆãb¨ŒÙ‘ÓYj(×?WGJ·!ö ¢sõ¬1B³³šàZxlP‡ÎE£ñ¨]«ELP¾AÔ^¿ˆz­Ù½ t-ý>5×9âÊo›PÀeÙ×,ÀúÝwß ýöÛoøáÞ,®©À«•6´F“’’ è8&‡ZìNC¹8ïøTPH`r%T%—_ %&ŠlÌÆ‡ ¡:DÔ@‡Ïƒˆ1Œ ‚¦D ÜÇ¥1ýõkኸ® +®‚rMAç.ND¢@dñ™ çàO?ý”ZÖx®Ö‚¥Âb³P{ý8G€¼ò‰´½Áÿ[”o¾ùF𫯾j#þÒÆ8ut;pÀéSŽª™IGaFœÝ’RKA<`þò`X€ ™ÑF ùtpqö5BÀ€`$È úé§Ÿð›;&eik¯ ×íÛ·ãŸtið.m)ªbƒ—Ü-ž3áüS¼Šøe»wïÆYK—.ÊA!`Í…ÏA-<˜áh+ÎB< Ú“ç`4DzÆàææ¦N§ŒÎ1r2Nà ¯ q":Á«² ¸.*rv˜JJ‡«àZè1Ú°ÃLž5©¯-òQ ÿ<äã1@ÆY8£ÒÃ~ã7èÆ½û^ó ÛÖ{û]ü ²8…6!úÜKä‚H ‚€M¥‚³‹Åî=ñž²# šã*ò*ƒ€#­.9ÕÑ1œ©ÑÆÏ_>(› ÐV6}ב²© ÏÚ9 ”ö5HÀ¦1cÆ!k øU&Hã4,Èð‡Í[@aBU°ú”Q•²+ øUD¼»Éæ š„¡0 ãø¼¥@UywE dr•s^ [2N«Q–iøÓ€ŽK…£`j2 Ë±±M–öu2BÐõ9†pÜJ nß¾}ñóTDa£ÜWàö pØë&Z’¿{÷î°(XD³vMµW„†(YìÛjI©Í 7tpï¿þº¿ôóaÊWaX‹À·£Ž{ƒE]qcVÀ"Jû'`@0|C) ÀÛ4cœ}å–‚\ UÅ:¨ªPžBêÊü Ë1A*01ú—/'£ª¢7+“‰Æ2¹Ð7mÚ„)™&ª*zµËä WÐeGgx<ËÄé`¥>ÕÓTK8Ä:u"NEF·Ù³gË,;C±¡C‡’sð[o½%7{öÙgqpΜ9°%‹K¿Àß*UªØ Õ¾v"à¿TGÖŒ„#E6à€U%¨:”€õû63éÈÝ;&ú-ú¸äƬ+À °¥Cš-öø¾–*©Ž††íY´Žh‰~4TÁ ¡dG0@ï`F½YWŽ?†“ÏÕLH¡9 L&ÎEþa0%P4,wèÔOÃA£ h^œr…˜x‘ÂйxIøQè(L\q †DTàv Xy:¡Ó(r°¾¼~~~ÂÕ^ÂpAÆ]ÎÁÂ÷ /pãàÒ ^ݲe ÝJãñ(" Å¡òùçŸÛ‘€Ñ’á õìCÀ)1¾­HŒ >°ª$Uÿ•~+"|—…û, ó^|ìà¢P¯…G==0/dÿÜ#ûfï´gfÐî黦Þ9õÐŽÉÛ'lè¿e¼ŸÇ8ßÍc|6öÙ8ÊÛ}äÁ ýÖ•cA€€“£=3oß¼…ÄÒOnÏ °¬+Pú#‚Š+·…uz*ø—_~1EÀ°†Âϱi `,„g‚u¬8 þ2™ÈŒ«yux5ˆÂFºB¹Уªâj@G,°)¢Ë£¥lÉf‡§tÍù.X°@8Ã0Œ°f2ã© g‘k¯ŒÈŒ¨uëÖØä' °X¤'Ä«–¦‚3‹ËPU¸£Øƒ€Oú¤8¸¦'°ÿÊ’UMÀ€àôøC ÁfßÀÜ€`XVÀe€òñÇ—]?»uë¦i¦4 Ý ‚sÁ-¸)ÛP­b@L¤ŠmmF#ç`ÅEán«wB§CìÉ#RÔ,ðú°Ð ÎTo°+›Jélj„ @W÷ŒðpÇÎÁ²­—hxíÚµØ÷&“1E–˜8q"’E‹2eʱ¬N§ÏÁb¯ž8ù¤£kÚ=.ÊWi£žI>Ê>ÁF>§¸ +À °¬€k*0mÚ4™€ñ7L‰j/AÀøy}Ö¬YÂ-ìÕJñËh[›E*Á¦H€( öŠ‘s°wÂTŸpÉ¥=y€~SãÇî1õ¶6S¸‹Àºhoª7LÓD4bãÓ„M𛕑ÚÈÛ>¾° “9_]à7BžÁˆD‰.Déܹ³X @d³6]+Àó›&n3G{';¾¦Åƒ€/Gø-/yÕñ >Ÿ­ ph|YsKV€`XV Ø˜0a‚‚‘Cá,0€ ¿˜SÚ^˜Pd޵¥ˆÀÀØ…f$ç…,< àù C0¼x52ˆ³€ªð£.¿àfq:¬Ú(âŸ"À0À0jêfak¦@ñ(àLlJ $°0è©©©ôl èŠ Á +™Á©·IMÀˆîŒW¯^=¸&SÁæ?( ò0ãÕ±cÇZ¸FN¡æ xÃò)1!±¡[OÛ~*lg\øîøã{"÷'žðLŠòJŽ>脚XDÀ¾ËJbuœ0Ù€©^+<_ìŸ_<V€`XVÀj`˜T@pÓ¦Má%,vÂ)Û¼@p„ ³ÀÐÌ„ r…%jÑtÈ9X&WÚÖ¦&W€,a(àH*YìNS˜– IÕ€.bCF¤µ“;šc`¦jNSÄ6RSê8ÐÍê #½H§Œ ÈvnQ>þøcܲþýû#Øœ€aƽC5yØž Î #´…yž7­(ÇÇ-õY£IÀIQPÓâŠ8Üwi‰¬Û 'ðéSþwnß¿gÑÛ•³¬+À °.¢è|IEiذ!¬ƒ BMÀ€`d îÝ»7µïС@ I6T« ”<¸®:˜¾\°FÅÕÁ£ä “ª°ªªÊƒT‡Nƒi¢ ¼…Ùt©‰ð£Àh˜À;Ñh+Ç£ økâU1M°8lêbšÖw²%#Hâ9ȃ—Óf2Å4ÕjÃß`àÀtk}ôQÄDŒâ 6ºáž §dø‹û^³fM#Ö\ëÚà9Ç<‡ù¯íÔ±hÓeµ'«n\5]m†Ø 5-îpû,)¡ÕA± dÆßùYøô¸È‡ƒ`XV€€åUÁH.Ö!`lCS6`0 " /ÒQ£F×l7Ra~&k¨‘mm åÉ9Xp!Œµp@Á2,šBUEo¦ÈUª:Q~©OÚ½':¦)R{€€aY—G˱Ž!/ÉÓÔä`dzw‡B§uíÚ•FΆ+6dÛ¿»»»–µº ž‘Ìûƒ€á|pçŸoÔ. CݤQÝ ïu÷ü€8­ž>pãÚå0ï?Knµ:ðúù}ÕA^ø{ØànjÆ‘ yi%ýƒÇÏ °¬+À ¼ƒ1K߀H<Š¢hhøÉ.äA [#^B$5j Èð+%ë)Lž¶˜*­´e͔׬Î-l™PXΖlö¾£1ùPŒÓòÔÀýÆ}6è`eq:¦éããG˜1rÍÑê¡êL“zËËËC°3ñlƒÍ‹¸Lþø Ÿ`:+V´m žˆñ%`Ú ×«ëç_åÇY±h²Óð">vðÏ’\-Έá±dðç¿­`_úçÖõó4 ÞÀfß?Ü€`XV€p}ðSµß}ðsÀ/õ: nFAþäÊ•+£=¼)ð›;Ù;m!`:ãÛÚÀß– (“« |!`Á…WƒÁÞhwÜXMMÇÒÝ{Àeø%›ê-++Ë"@Ç,4§IýÃNŒËÁ«?üðh.Aܼys–‚úw°Û¼A êÙP—–4òÚµÜ8ûŠ–ð±èMÈYV€`X×WñΡ‚áüûï¿‹X¦ŒÜcÏ=÷¾jѲÇÁ< È#Û‹HðfѶ6ä c€×G@@ÙhQà) #®/ /‚€h›ÜfÆ…ïR×îóÞ©w2HŸ±ð÷_4›Yt09Ú»ˆ€÷Ï-éõÐÎYýº~Rþ¡ÿU³/œM;ÐàšmÃlöÍÌ XV€`J´j·`؆Š‹¢¡Q,òFþÃ]åçŸ&Ï`$h˜6m¤ +,ÐÐö‚$gHiF.ð0«3®K™ç0`SW‡¥0Û5€°"›ê Â-Ú½—_<-¨;” ÉÀJ(EàÈa€áÉ WEŽNG| v‡D–ð½p»µ”$¹ï.'Žl1ÅÁ0Ó”ª=U¾¦ZAáÿðœý%¸ŽðÅce-W„9C–c³aÎÌ‚¯hÀlð‚›±¬+À ”\`Í%бÏÃÃÁ¿Ñ7iÒ„ÎEÀ5DÛ…ä?`{A„]„6£mm WØ_Mé F'çZøöjêÒ0¦’ï"*è“+P•øÖh6¾{Æé}ûö¡=rg(:” Ép‡UÃGÂ":t¨¸}H‡‡ƒF\[šåͰßîÅ:¶ Ø»LDC£öt#C/ŒÁ¿OJÕÍFŽpÿÅßÞ»—™j¬s<)ú lÀˆ VBëô±Ýž­^U;sÖíÛŽÜ1—Üi9+À °¬€#Ðt †_)òÆéÛ€AÀ²‹H¥r(— Ñ`;£˜l¹Â&ªp†Ïò<‰b"òÉ©@a–†#„ØÖ†öj=q9±; | }šp"î„"bšè ã4ñ4úÊ.¿˜ƃXi¸¨EŒÇ•—^zIÐÑ'Ÿ|b ×?—LéflÀˆ\¯åZ0s¼ N…í+Ø·òc£Á¯¿¸qÕ Å«âŸð˜0ªoµ'ï#`›ÞÉ8hª½úxR´Wïý½ÄÕ…ÓúÕ}½¦š}qä“Öïx®1εÆ[² ØŸ³Ü'+À °¬€ * é ®Bº]/AÀðR€¶OŸ>ôMýÄO€G1MÀ0àh{9{ö,ÌÀ€È•+W"Þ:Ay— FYÅUpQÅî4ØYå1›1 ½`hº#ÂWó‚øÊ§K-à,^ÂuáªK¦eõî=(CÆi\~â,°¯ˆ¡¢Ìçe‹ï/¾øBö€ø3gÎ4N±¶´¤hæ½ 6,ŸB˜ûýWŸDyœ:¶C®8Ò¿Wg„‰@ íánŠò?ÿ˜5J¸£}‹÷L?0Ôw½Î)ôRRø"RH” ê¾dxÓ†ÿuî–!¸iãú{<'ZK[^+4ê'䂟e<$V€`XVÀRÔnÁp;v¬)?`™€ÁpÈÓ‹p]"ù\Æ Ñc;Ú‹ƒP£W$ZÃÏñ TéÓdÔä n&r…‚ÌÄ2ª’ÝWÝ!ø+®+£ já³àqC ÖtM:G·< £0üã?ŒØ€û÷ïÿÈ#(Œƒˆá„Tpàfað6OÀ'lñvkñþ;+bA "Dì±íŠzp×à,¹: éÿíñ Íê6âÒýíÿì–û 8t`•©³£6r­ñÓÏg'Y÷ÁÁg±¬+À °¥@¤|S“VÏž=Ám"š“5ÑÛÛû£>¢~(b¬¡vä`Á—àE‹Ò)ƒnž¦@Lmk3ug1)˜EE‡pËt tff&âlÀúK ´€ÚÇ{ iî„Û¿ÿwß}§pù%a±õ 3Œ›omo)‡“3JÀ1G·R8¼±CÛæ÷sÏVÛ°â7q\þ#Ä{ÍÈŸºÒÖ7@m§Ï>òÚñ§fKƒ"÷_¿z1p÷t׬£ùDU¥GKÑÜË=ˆ0gvõ OÃì\ >¾y ¬+À °¶(ÏÔÇ\ÁÁÈŠŒ]bØ,#òʶmÛ„Q›ä`ïÞ¶ƒ© 6\BlkÓ™8|L]‘n5·µ™ê377.¿ðQw(’áL§0s `È ‚Zü·G¬¹nÒ¤I>ú¨úÖb\×v¢µ¨òiR'à-1Gÿ[§ŒëO†Þm›ì[.¿¤höò‹5hæðvpûs¢©–úÇïð®i.VŸÐí…çžTßZA˜³¿Æm·viyú”?;Ûò¡É粬+À ”à€”oŠ/hl5j”–Ñ !^}õUêŠònÃ=VR ì¯`GÚs)L°šúÃx OY (ßSE3ÚĆáÒ ã§dh#—_l”;”]~þ 1ã€È‚€aë…Å—Ô€™cÖŒ±|ùr±³P¾ UªT™?¾Eäj—ÆxÀ!,HaÃâo`¹"HðÇ-cVˆ•öS¿¯#mP4ÿt[4὆oÒü_~¡Æ¬Iƒ±µÎTcÍã Ç÷Ù€wþæ:uÕÜoÕ¾ŸVQñkùA#…93KÉòŠÒœpaXV€`X(«­"k¾²ß{ï=„, xÀðj¥X´~À¦Ê¼yó°a‹¾ña>¢ ¦]8äJY'Ôä ë,F+b–]¼xQ¦Ub\rn d¶zõjLM½àG’&Û3|ĉ²Ë/úDb<-À…šæç:uê/¾øâªU«äXÂŒ'„víÚ©ƒ¸ˆ¸ìœ€ hÆDÔY ÿFÀîđݸEZs"p]TІèàˆq2ÄÃT]µh '>õd•ù3†ë´Ü½inû¶Í„"4}{ÊØx»éœ"^">¼sª+TeÚ4¸ÿ,¨¸Á Þ®³uý<³œê læ{V€`XV@¡pðå—_V|_ƒÆYMÀÄÁ:?ëÊI½µnÝš2SØ‹ƒj”ÎM+ú'T…eWFU0«l©¥)Ë Û-L³dZƹ” n"c3\dö&R¸ t#0p¿}ûö4k€ùå±NDC#8p …P[¶„dz]¬¹–v‚ÝoxŠP¿/þQ£œ8ª‡Š€Ázu܈ž°£Ÿ·ë¾ºeí Æþ{—¢1š‰‹Â<Œ#8®sVÂñ½E¼cjñÖn£¾ü´‘ú¾âœ­Z<ÅAhk°[6óç>+À °¬+ V›Ø`}T}¿òÊ+0‚’ ØxA¹|EдfÍš!. ‚•ÂŒjc£-Q/ñ+h¤.÷©f_1eŠÝ&Ã`ŒTd?F¼^ò£@AP6dŒÍd÷ì ü‚#ÒMC=<6 ß@VŽ!xöìÙÏ>û¬Zäš5k‚¹-ÅV{µ‡37b\h¾)þ£êeѧkaŽ>²ÉH >¸òÛÎmhæøÃoÏý³Ð`ò˜~° ±€Åc‡÷ X§>1>bøÐŽ)ÅU÷­Ûµóåú—úÖV©üÈŒÉC Bªãš±˜?ôYV€`Xðë<¢:¨¿Ç¿úê+X40µÄ)°w †™Ž@m»p00ôðáà `„J Äš´jj²Š1À–œƒQÁØý&zƒÙXlƒ¡Æo G»ÕªECAde(Ç‚ñ€éL„§@$%±ËZ×)¿jHWDÀšÜ·[Gò‚0‚¿¢Í®sȾ‹íÛ¾š=è¹Xê€î?ú°†I¿b…òs¶Ûq\k°gdÁ¸~õð±¬+À °¬€ŽØ‡ jFÌà9sæO°EÞ±£G˜ˆxØ(FñƒÉ5ÂŽ Ý\Ú«' É€HñOÙŒ–°m‹‚Hgð–&¡CîÔr,aöõõýá‡4#uëÖ­X\~ePF Åî0Z¨ãç}Û©u[^çMúö[÷ý7|cåÂqF: ó_‹–Á^+ÕãÃwƒð¶Orr2ò«'ªjzûæ5#·™Û°¬+À °¬€¦ =u9Àj î)[W°‰mÈ!ð0&®€‹0ÜÈ5Â>{ö,mkƒI¦YyFØŸ‡Àx ±A“}Éån ¢”Áè4Hx5ÀC~UüØj½{÷v‘䯦X'òƒúÖk0až¸U ü¦Sëëm©¡¾n“F÷nÜà~8å¢çŒ·^>ðÛý[æêw{*lÇõ þ[Æ;¨îY=â‹¶ |àŸjü­ùÜÓ‹ç7N¥Nk™ŸÏÖ_þ4gXV€`lW{×4Ã¥ÁŽÛ³gO@‘!ÁÒ¿§L™"»#lLb·hØŠ .Á.ð¡àË ïÂbø]ÈÊy€á‹¢ ‚¯œÜ¸W¯^8"7O:UÓå·X’›Â_<]˜ |¦¹B´ Má@­ŽmQçµZ;ÖÏ@ 4kà¥@áÖ-’w …õédªs"`¿-ãí^=ÝG÷ú¦…©0g“ÆtÑ¿Pj¬oá¥ÛßðÜ+À °¬+À @ºš‰|á;räHXC-e_¹=L­:u^¶ø±ô ¯ò¶‚B8ÿ—>Ý:nZ9EÝgì±í `_±öª“†ùLµÇ´îëƒÝ¾íè:aÎ|>[#»·¥·œÛ³¬+À °¬€Žø\m$f€?< BÁÆ‚TmƒU Áž%êÈyÂÜûKäOvB Ýv½°ÀwóÛëœ ß¾ñªFÖ>,ˆOZ¿à¹Æ¸7‚3[f$^½œgü¾rKV€`XV€°EØe±Nm,Ã$HóððÃèZý7¼Ú·o/GÀæˆj@aøìZŠÂ2Â6  øõR» ·µØÍöÝwß!\šxUþÃTrãW_}µ“kâ/ö½é¤|3{ë 0zGö0ª×Áë¯ÖÜ´r²£!ø?<Úw³õÕmNŸÆok„¯Ã¤š6®¿Çc‘3‰Öøµïí|voz3»”¹+À °¬+`w`¡Ô®];͈¹êºf ºÙ˜1cD<2º¶cÍ;þfíÁ2ûØ`¸Db Qàeñä“ORŸHW±aÃùUñ7ŽãU5é¹Brc5§§§[êø«XF ˜NÃ:ÐL£ÒªEïóZí º6`ŸM¿XW=– ú´å[šq¯¼\ÓÜ >Î:ÎñÎìþqƲ¬+À °)€€¾šüÛ-2GÀ×,ãl€®–6fZpixe€Á@ºê"&?`D;,ìcPûÌ3ÏÌš5K~Uü‹~óÍ7š˜ä ÉÕø›-ïó³èVŠÆ–°Ž1Nݾn{hï¢ãnv¯1G·ðÆQ–Ö+êÒ¾¡f˜³êO=>oæ/Æm±Nnyú”?|°nMóY¬+À °¬€#@Ö0ÍÈÁ`Gä‰@B8_íU€§Ó§OG·"|®‚Hµˆ ±}ûvrsÄ߈ŒèÅ¢`М Î _•ÿF¼G}T¿M›6u…äÆ ü…烑|oFî¾Å¬o ~ìÑJÃ|å¾VXà½q”ñºoí°~ß·(ÿKíA7¸JåGÆŒèãd¢5~¹{n‰wïÜ6rÿ¸ +À °¬+À 8MøL˜0A3XÙÔ.\¨™MÍ–ƒèó‹/¾·ÍáZðë¥YÃæaxúŠÒ¿± ®Û¶m“_ÃÅ¢V-$¸®“ÜX¿ |=äub%SÐîá‡V?7<õDå¡ý¿ ñZá¿Ê.õdˆG»4X‡÷móxP&åÊ=ˆ0g.ê~Á¾ìÌid|!V€`XVÀ (X„ؾ¦!8›8q¢ff5‚e(Ü…a'F‡~R™3gŽ€ZÄ6F®cùUñ7²ÊÉÙÄø]*¹±Œ¿Ø•h˦7Í[l£Gl6Ä9u¸4¨‰¿½hwpÛœÿ•6Ö“!›AÀÝG˜­SG~YóÙªÚ¾,ßv ñÛhÜëÌ–÷Ø7‰í¾V| ñ)¬+À °¬@±(™²#ß `p w@¡,\lÅ£—_á= ¯†_ýU¼$ÿ—ßï¿ÿ^3¹ñ矎`ÀvÖk{‡Èxg»×¯z…ØJÀÔ£NÄøÚºñn÷á~+­®ÑGîð†á:uño?¼ñÊÓšìÛòƒF.æ þ¾òÒ˜}‹åË/Ê °¬+À بLøIºš/^xî"ú¯f¶a«/]ºÔû^×/9(S¤3ü“Ž+ÊèÑ£5]~]*¹±L̈g ·o©ÓíCÀÔ;tLE Á]iôNí #ºùï^î·ÂÒ}dÓ=¦Y×ÍëÕ¨¾†#KQÔ·ël]?Ï™Ö\ã×Bv·Ëg8Ì™ƒV6wË °¬+À 8SñÕŒA`úÉ'Ÿ¬ZµJ3󰉀—,Y‚°¾(k×®¥oØGGQ‡_yå5£»Zrc¿0­âÑ¡·ÏžL…;¶©Ò÷Á5û÷I?†û.7^£ƒAÀç½ÖUÔM‹úvl­‘®B˜³U‹§çQ§µ„Ñξ7o:ô¾rç¬+À °¬+à|7MLj¸¼Ø¦vàÀ+¨W>…±)`]FY³f þ 30ýS.Èì+òÀÉ 'æAƒ¹TrcÂ_°/²8ÂíA±ìOÀtLfMÿ`ºˆñù§ï/™3,Ìw¹ÙZDÀWÎ{­ûYÔmKûÛñÝòÿWNã¦ò#3&uÑ¿PvFÔ• YÎ7òYV€`XVÀ™ è[.-[¶œ9s&Ò¶YWêÖ­K ˜FY½z50ý“Ê®]»Í÷¡‡R“®Ž€h¶{èÚ·§±/­G0õNNâšñ"Äý€U¸Yã7þ±Ó·Ia¾Ë4ktðF°çºŸ©öù¦Ù#•4îhÅ åæ,6l·q*utKlq;—y1?ƒ#<8󣇯а¬+À »d 42¢ÈøØcØ—³1¶ YTˆ€áÛ—_øWÓ?Q&Mš„ fjöuÁäÆÀè´´4Dù•#;áÞ9–€iðb†^Ç5BÜ¡'Ÿxì“V¦Žé¹aéØ0Ÿ¥¢F¹ðÚ!ã·{¼rEõE˜³¾=:»N˜3øø"¶Ãõ«œp ù¬+À °¬+ಠÀˆ¼Ä¦\„ i@´cÇŽ…]Æc#…q‚÷Ü++W®Ä?«V­Š¿a& EA¤³É“'Û×jk{ožΰ+–#n Ô©oŒæ‘zo¼øÙ'MG þzåc=÷ï®ùLÍfŸ·oYìaÎÆâlê±ü¬xø9p`—ýⱬ+À °Å¥ÐVßA[Ù:vì®=b®Þ}¯¬X±€„mmÈ¡IJ.˜Ü8''çÊ•+Åu/p]gØ€ÕÓ‹‹‹CJã(lŠ˜æÌk×rG{2hö÷ / ½@^ÞÖVŒ+˜/Í °¬+À ” âÖ@}“0¼#ðËùìÙ³ƒMÄ/#0œ}Q–/_Žþ¿ÿ÷ÿÔ¼äjÉ‘× ¹-œ°ÑÍì’(ÂUx$2HÏû¾Yçå +g:}áÏÒÍÍ< ØEEH Tvê5»°¸+À °¬+À è(`Ö$ ‚U¸M›6p¢@:· ©/X°>Äðmxúi|ðF€6ÛìÒCzz:"<ܾ}Ûu–D1°,Ddd$îqëÖ­õiM¸ß®£ „`XV€`XëÀ^)pjÆ õDQøÃ?D²eBa"`°ï;ï¼£éò;|øpWˆt–••ð½qã†uâ8ô,"`yžøù5à)Ñ¥Ká,2Æ•ƒ;gXV€`XVÀù ÀAô§Ÿ~ªQ£†Ù½RMš4yöÙgÑìP7þú믋7¹1Qïµkל¯¡EWtQ¶hܘ`XV€`XÒ¡~‡PßQX“’‹+¹qFFFI¡^y…0—Ž÷ Ï‚`XV€`J•'«×ŸÈ °¬+À ”bô ˜HCFM?`}¤¡WÕmd›—i`/#š¢+Ò 3™q À‰:½™õ6;? c–!Ècp)o`»0Í_Ü'5“:¦Kð'{ÓÍII8Ñ­z¹Ð…„Ëw¨gÙ‰G^FèÊT¸ €Ì©êA#—¨M;t¿54Q4Ò¹Á¹”âO.ž+À °¬+`‹f]èÛYÄ…P°Y¤$ ÐY¢[Ò€éBâ õó5ˆäÎ!4­€>ŒxTÀ ‰î05° ¡”{A`Ú4gA÷š,ßBµTØ€åe }éq‡*– ­'µmU½v Hó£ù–À]0mðr Õ4÷â ­N1xƒÓÒW(iËŸË °¬+À ”)Œ0¾jMųÒü"Vü¨«IŠ/zÒ·€ÂHG$*› b€fo-œN¨¦OÀF#XŽtV<00 ¢xƒŠÒHm ¥eDuÅr1µˆÁ¬rWšöWõ»]˜¥Mù¿¼œf3Œ_ñTDËK\Ë`ççR¦>Ëx²¬+À °¬€ql'`³H#£‹<0ùK\4¦¾ß]ÄSÍ„ZŸ€ †Æ/Ó9Í´Œ°àWµ X­‘B;ÅÍ+FîJ½\H}E¡'$a6¸\èÁ…<1ðmb“ƒcÓ«f/‡âWyÝÓqqD1*ƒœ‹ñnÉ °¬+À ”) °pfU_›EÅ7¾æW¿Œ4d&Óa ‹,¨1T}uØà`˜€ï«J'îPñ0AªÀqÅ/úïsJ‹"£°LÒš«Sq9Sëž~þ QÑÞ8Ù%ÜÛ2—2õ‰Æ“eXV€`Œ( OÀÄú+»°ìS«6´áˆŒãê«+fmŠMåf:lp0LÀEz ‡kMÃ-=‹˜].ÖÙ€5­­Š¥`‹s)‚ =“ÑÊ£§@Í”‰òM0Ù˜IµØ`çÖÍÅÈ'·aXV€`Ê‚úLŽ”ò^.'Ø€Õn„A 0û‹± pÑ=¢Å$[4Õ6`ùqŠî+ÙDÅ>3S¾Òò]ÔtWGíEWrØ9ƒË§˜ XF†[òÜ5{9SL=`0´½O‘JÚ`ççR>Âxެ+À °¬€ è°ð‡”w© Ø,Òh^‚¬Ë ¨é¬¶²“À'r’]³6`S6;?Œøë¦¬0¥{Vü^ ˜Xv[Q 2e’“Mªt3pDÞT¨ˆP¦X.d{ÆRO¡,÷li½*¶ÁÑìh"/§CÀ¢5IìÜà\¬øDàSXV€`X² €)Fœ%zIa¢R°Y¤ÑìGaêR xèFϤŒ¼1@³79`…>LÙ"`Ò -r »¦ü¶Ñ´£%ÔêÁ¤JçÊfcAÀ8 „‚ÌÄŠå‚+ÒíDœŽWñ_êYØÈ–>u…sÑåfS¬<#—Ó!`z,S?0tF:7¸ôËÂGÏ‘`XV€°BBÁ3 ¤Qƒ¦ Xièô{/pEÍÄj¤# " E<`#H#l‘bÄßâ\}§ $SÆ  GYêÊŠûå S,ȈA+@QLÍGüÜOã‹@†f…¯PŠn’X:²žì»27£sA½â,EººEÑ•Ú/Âìåhî¦.‡5„WÕÝR{³Ÿ‹‘ùrV€`XV ¬)@_ÓêB°¨VCMÀÔRiÔ ûšÜ¹&ÒD·¬Š a€Ü›‚=ˆ7„ù’þ©À'ýÁhºtò)(ˆÔ g×YlF ØŽ#†d ƒ±ºs8W Ù=gŠ•d¤g#¡«ë’˜ˆ‘Ë©Û8´së†Äg±¬+À °¬€B#$`¤f·"þƒ²[15_Ù>Û{°QÅéÅ@Àö÷Æ °¬+À °¬+À X¤°ErqcV€`XV€`X¯p‰¿…<V€`XV€`X‹`¶H.nÌ °¬+À °¬+Pâ`.ñ·'À °¬+À °¬+`‘LÀÉÅYV€`XV€`J¼LÀ%þòXV€`XV€`,Ràÿ´ÐbàÖ2ÒIEND®B`‚dibbler-1.0.1/config.sub0000755000175000017500000010541212304040124012011 00000000000000#! /bin/sh # Configuration validation subroutine script. # Copyright 1992-2013 Free Software Foundation, Inc. timestamp='2013-10-01' # This file is free software; you can redistribute it and/or modify it # under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, see . # # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that # program. This Exception is an additional permission under section 7 # of the GNU General Public License, version 3 ("GPLv3"). # Please send patches with a ChangeLog entry to config-patches@gnu.org. # # Configuration subroutine to validate and canonicalize a configuration type. # Supply the specified configuration type as an argument. # If it is invalid, we print an error message on stderr and exit with code 1. # Otherwise, we print the canonical config type on stdout and succeed. # You can get the latest version of this script from: # http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub;hb=HEAD # This file is supposed to be the same for all GNU packages # and recognize all the CPU types, system types and aliases # that are meaningful with *any* GNU software. # Each package is responsible for reporting which valid configurations # it does not support. The user should be able to distinguish # a failure to support a valid configuration from a meaningless # configuration. # The goal of this file is to map all the various variations of a given # machine specification into a single specification in the form: # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM # or in some cases, the newer four-part form: # CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM # It is wrong to echo any other type of specification. me=`echo "$0" | sed -e 's,.*/,,'` usage="\ Usage: $0 [OPTION] CPU-MFR-OPSYS $0 [OPTION] ALIAS Canonicalize a configuration name. Operation modes: -h, --help print this help, then exit -t, --time-stamp print date of last modification, then exit -v, --version print version number, then exit Report bugs and patches to ." version="\ GNU config.sub ($timestamp) Copyright 1992-2013 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." help=" Try \`$me --help' for more information." # Parse command line while test $# -gt 0 ; do case $1 in --time-stamp | --time* | -t ) echo "$timestamp" ; exit ;; --version | -v ) echo "$version" ; exit ;; --help | --h* | -h ) echo "$usage"; exit ;; -- ) # Stop option processing shift; break ;; - ) # Use stdin as input. break ;; -* ) echo "$me: invalid option $1$help" exit 1 ;; *local*) # First pass through any local machine types. echo $1 exit ;; * ) break ;; esac done case $# in 0) echo "$me: missing argument$help" >&2 exit 1;; 1) ;; *) echo "$me: too many arguments$help" >&2 exit 1;; esac # Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any). # Here we must recognize all the valid KERNEL-OS combinations. maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'` case $maybe_os in nto-qnx* | linux-gnu* | linux-android* | linux-dietlibc | linux-newlib* | \ linux-musl* | linux-uclibc* | uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | \ knetbsd*-gnu* | netbsd*-gnu* | \ kopensolaris*-gnu* | \ storm-chaos* | os2-emx* | rtmk-nova*) os=-$maybe_os basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'` ;; android-linux) os=-linux-android basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`-unknown ;; *) basic_machine=`echo $1 | sed 's/-[^-]*$//'` if [ $basic_machine != $1 ] then os=`echo $1 | sed 's/.*-/-/'` else os=; fi ;; esac ### Let's recognize common machines as not being operating systems so ### that things like config.sub decstation-3100 work. We also ### recognize some manufacturers as not being operating systems, so we ### can provide default operating systems below. case $os in -sun*os*) # Prevent following clause from handling this invalid input. ;; -dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \ -att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \ -unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \ -convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\ -c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \ -harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \ -apple | -axis | -knuth | -cray | -microblaze*) os= basic_machine=$1 ;; -bluegene*) os=-cnk ;; -sim | -cisco | -oki | -wec | -winbond) os= basic_machine=$1 ;; -scout) ;; -wrs) os=-vxworks basic_machine=$1 ;; -chorusos*) os=-chorusos basic_machine=$1 ;; -chorusrdb) os=-chorusrdb basic_machine=$1 ;; -hiux*) os=-hiuxwe2 ;; -sco6) os=-sco5v6 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco5) os=-sco3.2v5 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco4) os=-sco3.2v4 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco3.2.[4-9]*) os=`echo $os | sed -e 's/sco3.2./sco3.2v/'` basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco3.2v[4-9]*) # Don't forget version if it is 3.2v4 or newer. basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco5v6*) # Don't forget version if it is 3.2v4 or newer. basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco*) os=-sco3.2v2 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -udk*) basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -isc) os=-isc2.2 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -clix*) basic_machine=clipper-intergraph ;; -isc*) basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -lynx*178) os=-lynxos178 ;; -lynx*5) os=-lynxos5 ;; -lynx*) os=-lynxos ;; -ptx*) basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'` ;; -windowsnt*) os=`echo $os | sed -e 's/windowsnt/winnt/'` ;; -psos*) os=-psos ;; -mint | -mint[0-9]*) basic_machine=m68k-atari os=-mint ;; esac # Decode aliases for certain CPU-COMPANY combinations. case $basic_machine in # Recognize the basic CPU types without company name. # Some are omitted here because they have special meanings below. 1750a | 580 \ | a29k \ | aarch64 | aarch64_be \ | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \ | alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \ | am33_2.0 \ | arc | arceb \ | arm | arm[bl]e | arme[lb] | armv[2-8] | armv[3-8][lb] | armv7[arm] \ | avr | avr32 \ | be32 | be64 \ | bfin \ | c4x | c8051 | clipper \ | d10v | d30v | dlx | dsp16xx \ | epiphany \ | fido | fr30 | frv \ | h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \ | hexagon \ | i370 | i860 | i960 | ia64 \ | ip2k | iq2000 \ | k1om \ | le32 | le64 \ | lm32 \ | m32c | m32r | m32rle | m68000 | m68k | m88k \ | maxq | mb | microblaze | microblazeel | mcore | mep | metag \ | mips | mipsbe | mipseb | mipsel | mipsle \ | mips16 \ | mips64 | mips64el \ | mips64octeon | mips64octeonel \ | mips64orion | mips64orionel \ | mips64r5900 | mips64r5900el \ | mips64vr | mips64vrel \ | mips64vr4100 | mips64vr4100el \ | mips64vr4300 | mips64vr4300el \ | mips64vr5000 | mips64vr5000el \ | mips64vr5900 | mips64vr5900el \ | mipsisa32 | mipsisa32el \ | mipsisa32r2 | mipsisa32r2el \ | mipsisa64 | mipsisa64el \ | mipsisa64r2 | mipsisa64r2el \ | mipsisa64sb1 | mipsisa64sb1el \ | mipsisa64sr71k | mipsisa64sr71kel \ | mipsr5900 | mipsr5900el \ | mipstx39 | mipstx39el \ | mn10200 | mn10300 \ | moxie \ | mt \ | msp430 \ | nds32 | nds32le | nds32be \ | nios | nios2 | nios2eb | nios2el \ | ns16k | ns32k \ | open8 \ | or1k | or32 \ | pdp10 | pdp11 | pj | pjl \ | powerpc | powerpc64 | powerpc64le | powerpcle \ | pyramid \ | rl78 | rx \ | score \ | sh | sh[1234] | sh[24]a | sh[24]aeb | sh[23]e | sh[34]eb | sheb | shbe | shle | sh[1234]le | sh3ele \ | sh64 | sh64le \ | sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet | sparclite \ | sparcv8 | sparcv9 | sparcv9b | sparcv9v \ | spu \ | tahoe | tic4x | tic54x | tic55x | tic6x | tic80 | tron \ | ubicom32 \ | v850 | v850e | v850e1 | v850e2 | v850es | v850e2v3 \ | we32k \ | x86 | xc16x | xstormy16 | xtensa \ | z8k | z80) basic_machine=$basic_machine-unknown ;; c54x) basic_machine=tic54x-unknown ;; c55x) basic_machine=tic55x-unknown ;; c6x) basic_machine=tic6x-unknown ;; m6811 | m68hc11 | m6812 | m68hc12 | m68hcs12x | nvptx | picochip) basic_machine=$basic_machine-unknown os=-none ;; m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k) ;; ms1) basic_machine=mt-unknown ;; strongarm | thumb | xscale) basic_machine=arm-unknown ;; xgate) basic_machine=$basic_machine-unknown os=-none ;; xscaleeb) basic_machine=armeb-unknown ;; xscaleel) basic_machine=armel-unknown ;; # We use `pc' rather than `unknown' # because (1) that's what they normally are, and # (2) the word "unknown" tends to confuse beginning users. i*86 | x86_64) basic_machine=$basic_machine-pc ;; # Object if more than one company name word. *-*-*) echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 exit 1 ;; # Recognize the basic CPU types with company name. 580-* \ | a29k-* \ | aarch64-* | aarch64_be-* \ | alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \ | alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \ | alphapca5[67]-* | alpha64pca5[67]-* | arc-* | arceb-* \ | arm-* | armbe-* | armle-* | armeb-* | armv*-* \ | avr-* | avr32-* \ | be32-* | be64-* \ | bfin-* | bs2000-* \ | c[123]* | c30-* | [cjt]90-* | c4x-* \ | c8051-* | clipper-* | craynv-* | cydra-* \ | d10v-* | d30v-* | dlx-* \ | elxsi-* \ | f30[01]-* | f700-* | fido-* | fr30-* | frv-* | fx80-* \ | h8300-* | h8500-* \ | hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \ | hexagon-* \ | i*86-* | i860-* | i960-* | ia64-* \ | ip2k-* | iq2000-* \ | k1om-* \ | le32-* | le64-* \ | lm32-* \ | m32c-* | m32r-* | m32rle-* \ | m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \ | m88110-* | m88k-* | maxq-* | mcore-* | metag-* \ | microblaze-* | microblazeel-* \ | mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \ | mips16-* \ | mips64-* | mips64el-* \ | mips64octeon-* | mips64octeonel-* \ | mips64orion-* | mips64orionel-* \ | mips64r5900-* | mips64r5900el-* \ | mips64vr-* | mips64vrel-* \ | mips64vr4100-* | mips64vr4100el-* \ | mips64vr4300-* | mips64vr4300el-* \ | mips64vr5000-* | mips64vr5000el-* \ | mips64vr5900-* | mips64vr5900el-* \ | mipsisa32-* | mipsisa32el-* \ | mipsisa32r2-* | mipsisa32r2el-* \ | mipsisa64-* | mipsisa64el-* \ | mipsisa64r2-* | mipsisa64r2el-* \ | mipsisa64sb1-* | mipsisa64sb1el-* \ | mipsisa64sr71k-* | mipsisa64sr71kel-* \ | mipsr5900-* | mipsr5900el-* \ | mipstx39-* | mipstx39el-* \ | mmix-* \ | mt-* \ | msp430-* \ | nds32-* | nds32le-* | nds32be-* \ | nios-* | nios2-* | nios2eb-* | nios2el-* \ | none-* | np1-* | ns16k-* | ns32k-* \ | open8-* \ | orion-* \ | pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \ | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* \ | pyramid-* \ | rl78-* | romp-* | rs6000-* | rx-* \ | sh-* | sh[1234]-* | sh[24]a-* | sh[24]aeb-* | sh[23]e-* | sh[34]eb-* | sheb-* | shbe-* \ | shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \ | sparc-* | sparc64-* | sparc64b-* | sparc64v-* | sparc86x-* | sparclet-* \ | sparclite-* \ | sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | sv1-* | sx?-* \ | tahoe-* \ | tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \ | tile*-* \ | tron-* \ | ubicom32-* \ | v850-* | v850e-* | v850e1-* | v850es-* | v850e2-* | v850e2v3-* \ | vax-* \ | we32k-* \ | x86-* | x86_64-* | xc16x-* | xps100-* \ | xstormy16-* | xtensa*-* \ | ymp-* \ | z8k-* | z80-*) ;; # Recognize the basic CPU types without company name, with glob match. xtensa*) basic_machine=$basic_machine-unknown ;; # Recognize the various machine names and aliases which stand # for a CPU type and a company and sometimes even an OS. 386bsd) basic_machine=i386-unknown os=-bsd ;; 3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc) basic_machine=m68000-att ;; 3b*) basic_machine=we32k-att ;; a29khif) basic_machine=a29k-amd os=-udi ;; abacus) basic_machine=abacus-unknown ;; adobe68k) basic_machine=m68010-adobe os=-scout ;; alliant | fx80) basic_machine=fx80-alliant ;; altos | altos3068) basic_machine=m68k-altos ;; am29k) basic_machine=a29k-none os=-bsd ;; amd64) basic_machine=x86_64-pc ;; amd64-*) basic_machine=x86_64-`echo $basic_machine | sed 's/^[^-]*-//'` ;; amdahl) basic_machine=580-amdahl os=-sysv ;; amiga | amiga-*) basic_machine=m68k-unknown ;; amigaos | amigados) basic_machine=m68k-unknown os=-amigaos ;; amigaunix | amix) basic_machine=m68k-unknown os=-sysv4 ;; apollo68) basic_machine=m68k-apollo os=-sysv ;; apollo68bsd) basic_machine=m68k-apollo os=-bsd ;; aros) basic_machine=i386-pc os=-aros ;; aux) basic_machine=m68k-apple os=-aux ;; balance) basic_machine=ns32k-sequent os=-dynix ;; blackfin) basic_machine=bfin-unknown os=-linux ;; blackfin-*) basic_machine=bfin-`echo $basic_machine | sed 's/^[^-]*-//'` os=-linux ;; bluegene*) basic_machine=powerpc-ibm os=-cnk ;; c54x-*) basic_machine=tic54x-`echo $basic_machine | sed 's/^[^-]*-//'` ;; c55x-*) basic_machine=tic55x-`echo $basic_machine | sed 's/^[^-]*-//'` ;; c6x-*) basic_machine=tic6x-`echo $basic_machine | sed 's/^[^-]*-//'` ;; c90) basic_machine=c90-cray os=-unicos ;; cegcc) basic_machine=arm-unknown os=-cegcc ;; convex-c1) basic_machine=c1-convex os=-bsd ;; convex-c2) basic_machine=c2-convex os=-bsd ;; convex-c32) basic_machine=c32-convex os=-bsd ;; convex-c34) basic_machine=c34-convex os=-bsd ;; convex-c38) basic_machine=c38-convex os=-bsd ;; cray | j90) basic_machine=j90-cray os=-unicos ;; craynv) basic_machine=craynv-cray os=-unicosmp ;; cr16 | cr16-*) basic_machine=cr16-unknown os=-elf ;; crds | unos) basic_machine=m68k-crds ;; crisv32 | crisv32-* | etraxfs*) basic_machine=crisv32-axis ;; cris | cris-* | etrax*) basic_machine=cris-axis ;; crx) basic_machine=crx-unknown os=-elf ;; da30 | da30-*) basic_machine=m68k-da30 ;; decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn) basic_machine=mips-dec ;; decsystem10* | dec10*) basic_machine=pdp10-dec os=-tops10 ;; decsystem20* | dec20*) basic_machine=pdp10-dec os=-tops20 ;; delta | 3300 | motorola-3300 | motorola-delta \ | 3300-motorola | delta-motorola) basic_machine=m68k-motorola ;; delta88) basic_machine=m88k-motorola os=-sysv3 ;; dicos) basic_machine=i686-pc os=-dicos ;; djgpp) basic_machine=i586-pc os=-msdosdjgpp ;; dpx20 | dpx20-*) basic_machine=rs6000-bull os=-bosx ;; dpx2* | dpx2*-bull) basic_machine=m68k-bull os=-sysv3 ;; ebmon29k) basic_machine=a29k-amd os=-ebmon ;; elxsi) basic_machine=elxsi-elxsi os=-bsd ;; encore | umax | mmax) basic_machine=ns32k-encore ;; es1800 | OSE68k | ose68k | ose | OSE) basic_machine=m68k-ericsson os=-ose ;; fx2800) basic_machine=i860-alliant ;; genix) basic_machine=ns32k-ns ;; gmicro) basic_machine=tron-gmicro os=-sysv ;; go32) basic_machine=i386-pc os=-go32 ;; h3050r* | hiux*) basic_machine=hppa1.1-hitachi os=-hiuxwe2 ;; h8300hms) basic_machine=h8300-hitachi os=-hms ;; h8300xray) basic_machine=h8300-hitachi os=-xray ;; h8500hms) basic_machine=h8500-hitachi os=-hms ;; harris) basic_machine=m88k-harris os=-sysv3 ;; hp300-*) basic_machine=m68k-hp ;; hp300bsd) basic_machine=m68k-hp os=-bsd ;; hp300hpux) basic_machine=m68k-hp os=-hpux ;; hp3k9[0-9][0-9] | hp9[0-9][0-9]) basic_machine=hppa1.0-hp ;; hp9k2[0-9][0-9] | hp9k31[0-9]) basic_machine=m68000-hp ;; hp9k3[2-9][0-9]) basic_machine=m68k-hp ;; hp9k6[0-9][0-9] | hp6[0-9][0-9]) basic_machine=hppa1.0-hp ;; hp9k7[0-79][0-9] | hp7[0-79][0-9]) basic_machine=hppa1.1-hp ;; hp9k78[0-9] | hp78[0-9]) # FIXME: really hppa2.0-hp basic_machine=hppa1.1-hp ;; hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893) # FIXME: really hppa2.0-hp basic_machine=hppa1.1-hp ;; hp9k8[0-9][13679] | hp8[0-9][13679]) basic_machine=hppa1.1-hp ;; hp9k8[0-9][0-9] | hp8[0-9][0-9]) basic_machine=hppa1.0-hp ;; hppa-next) os=-nextstep3 ;; hppaosf) basic_machine=hppa1.1-hp os=-osf ;; hppro) basic_machine=hppa1.1-hp os=-proelf ;; i370-ibm* | ibm*) basic_machine=i370-ibm ;; i*86v32) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-sysv32 ;; i*86v4*) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-sysv4 ;; i*86v) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-sysv ;; i*86sol2) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-solaris2 ;; i386mach) basic_machine=i386-mach os=-mach ;; i386-vsta | vsta) basic_machine=i386-unknown os=-vsta ;; iris | iris4d) basic_machine=mips-sgi case $os in -irix*) ;; *) os=-irix4 ;; esac ;; isi68 | isi) basic_machine=m68k-isi os=-sysv ;; m68knommu) basic_machine=m68k-unknown os=-linux ;; m68knommu-*) basic_machine=m68k-`echo $basic_machine | sed 's/^[^-]*-//'` os=-linux ;; m88k-omron*) basic_machine=m88k-omron ;; magnum | m3230) basic_machine=mips-mips os=-sysv ;; merlin) basic_machine=ns32k-utek os=-sysv ;; microblaze*) basic_machine=microblaze-xilinx ;; mingw64) basic_machine=x86_64-pc os=-mingw64 ;; mingw32) basic_machine=i686-pc os=-mingw32 ;; mingw32ce) basic_machine=arm-unknown os=-mingw32ce ;; miniframe) basic_machine=m68000-convergent ;; *mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*) basic_machine=m68k-atari os=-mint ;; mips3*-*) basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'` ;; mips3*) basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown ;; monitor) basic_machine=m68k-rom68k os=-coff ;; morphos) basic_machine=powerpc-unknown os=-morphos ;; msdos) basic_machine=i386-pc os=-msdos ;; ms1-*) basic_machine=`echo $basic_machine | sed -e 's/ms1-/mt-/'` ;; msys) basic_machine=i686-pc os=-msys ;; mvs) basic_machine=i370-ibm os=-mvs ;; nacl) basic_machine=le32-unknown os=-nacl ;; ncr3000) basic_machine=i486-ncr os=-sysv4 ;; netbsd386) basic_machine=i386-unknown os=-netbsd ;; netwinder) basic_machine=armv4l-rebel os=-linux ;; news | news700 | news800 | news900) basic_machine=m68k-sony os=-newsos ;; news1000) basic_machine=m68030-sony os=-newsos ;; news-3600 | risc-news) basic_machine=mips-sony os=-newsos ;; necv70) basic_machine=v70-nec os=-sysv ;; next | m*-next ) basic_machine=m68k-next case $os in -nextstep* ) ;; -ns2*) os=-nextstep2 ;; *) os=-nextstep3 ;; esac ;; nh3000) basic_machine=m68k-harris os=-cxux ;; nh[45]000) basic_machine=m88k-harris os=-cxux ;; nindy960) basic_machine=i960-intel os=-nindy ;; mon960) basic_machine=i960-intel os=-mon960 ;; nonstopux) basic_machine=mips-compaq os=-nonstopux ;; np1) basic_machine=np1-gould ;; neo-tandem) basic_machine=neo-tandem ;; nse-tandem) basic_machine=nse-tandem ;; nsr-tandem) basic_machine=nsr-tandem ;; op50n-* | op60c-*) basic_machine=hppa1.1-oki os=-proelf ;; openrisc | openrisc-*) basic_machine=or32-unknown ;; os400) basic_machine=powerpc-ibm os=-os400 ;; OSE68000 | ose68000) basic_machine=m68000-ericsson os=-ose ;; os68k) basic_machine=m68k-none os=-os68k ;; pa-hitachi) basic_machine=hppa1.1-hitachi os=-hiuxwe2 ;; paragon) basic_machine=i860-intel os=-osf ;; parisc) basic_machine=hppa-unknown os=-linux ;; parisc-*) basic_machine=hppa-`echo $basic_machine | sed 's/^[^-]*-//'` os=-linux ;; pbd) basic_machine=sparc-tti ;; pbb) basic_machine=m68k-tti ;; pc532 | pc532-*) basic_machine=ns32k-pc532 ;; pc98) basic_machine=i386-pc ;; pc98-*) basic_machine=i386-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentium | p5 | k5 | k6 | nexgen | viac3) basic_machine=i586-pc ;; pentiumpro | p6 | 6x86 | athlon | athlon_*) basic_machine=i686-pc ;; pentiumii | pentium2 | pentiumiii | pentium3) basic_machine=i686-pc ;; pentium4) basic_machine=i786-pc ;; pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*) basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentiumpro-* | p6-* | 6x86-* | athlon-*) basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentiumii-* | pentium2-* | pentiumiii-* | pentium3-*) basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentium4-*) basic_machine=i786-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pn) basic_machine=pn-gould ;; power) basic_machine=power-ibm ;; ppc | ppcbe) basic_machine=powerpc-unknown ;; ppc-* | ppcbe-*) basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ppcle | powerpclittle | ppc-le | powerpc-little) basic_machine=powerpcle-unknown ;; ppcle-* | powerpclittle-*) basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ppc64) basic_machine=powerpc64-unknown ;; ppc64-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ppc64le | powerpc64little | ppc64-le | powerpc64-little) basic_machine=powerpc64le-unknown ;; ppc64le-* | powerpc64little-*) basic_machine=powerpc64le-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ps2) basic_machine=i386-ibm ;; pw32) basic_machine=i586-unknown os=-pw32 ;; rdos | rdos64) basic_machine=x86_64-pc os=-rdos ;; rdos32) basic_machine=i386-pc os=-rdos ;; rom68k) basic_machine=m68k-rom68k os=-coff ;; rm[46]00) basic_machine=mips-siemens ;; rtpc | rtpc-*) basic_machine=romp-ibm ;; s390 | s390-*) basic_machine=s390-ibm ;; s390x | s390x-*) basic_machine=s390x-ibm ;; sa29200) basic_machine=a29k-amd os=-udi ;; sb1) basic_machine=mipsisa64sb1-unknown ;; sb1el) basic_machine=mipsisa64sb1el-unknown ;; sde) basic_machine=mipsisa32-sde os=-elf ;; sei) basic_machine=mips-sei os=-seiux ;; sequent) basic_machine=i386-sequent ;; sh) basic_machine=sh-hitachi os=-hms ;; sh5el) basic_machine=sh5le-unknown ;; sh64) basic_machine=sh64-unknown ;; sparclite-wrs | simso-wrs) basic_machine=sparclite-wrs os=-vxworks ;; sps7) basic_machine=m68k-bull os=-sysv2 ;; spur) basic_machine=spur-unknown ;; st2000) basic_machine=m68k-tandem ;; stratus) basic_machine=i860-stratus os=-sysv4 ;; strongarm-* | thumb-*) basic_machine=arm-`echo $basic_machine | sed 's/^[^-]*-//'` ;; sun2) basic_machine=m68000-sun ;; sun2os3) basic_machine=m68000-sun os=-sunos3 ;; sun2os4) basic_machine=m68000-sun os=-sunos4 ;; sun3os3) basic_machine=m68k-sun os=-sunos3 ;; sun3os4) basic_machine=m68k-sun os=-sunos4 ;; sun4os3) basic_machine=sparc-sun os=-sunos3 ;; sun4os4) basic_machine=sparc-sun os=-sunos4 ;; sun4sol2) basic_machine=sparc-sun os=-solaris2 ;; sun3 | sun3-*) basic_machine=m68k-sun ;; sun4) basic_machine=sparc-sun ;; sun386 | sun386i | roadrunner) basic_machine=i386-sun ;; sv1) basic_machine=sv1-cray os=-unicos ;; symmetry) basic_machine=i386-sequent os=-dynix ;; t3e) basic_machine=alphaev5-cray os=-unicos ;; t90) basic_machine=t90-cray os=-unicos ;; tile*) basic_machine=$basic_machine-unknown os=-linux-gnu ;; tx39) basic_machine=mipstx39-unknown ;; tx39el) basic_machine=mipstx39el-unknown ;; toad1) basic_machine=pdp10-xkl os=-tops20 ;; tower | tower-32) basic_machine=m68k-ncr ;; tpf) basic_machine=s390x-ibm os=-tpf ;; udi29k) basic_machine=a29k-amd os=-udi ;; ultra3) basic_machine=a29k-nyu os=-sym1 ;; v810 | necv810) basic_machine=v810-nec os=-none ;; vaxv) basic_machine=vax-dec os=-sysv ;; vms) basic_machine=vax-dec os=-vms ;; vpp*|vx|vx-*) basic_machine=f301-fujitsu ;; vxworks960) basic_machine=i960-wrs os=-vxworks ;; vxworks68) basic_machine=m68k-wrs os=-vxworks ;; vxworks29k) basic_machine=a29k-wrs os=-vxworks ;; w65*) basic_machine=w65-wdc os=-none ;; w89k-*) basic_machine=hppa1.1-winbond os=-proelf ;; xbox) basic_machine=i686-pc os=-mingw32 ;; xps | xps100) basic_machine=xps100-honeywell ;; xscale-* | xscalee[bl]-*) basic_machine=`echo $basic_machine | sed 's/^xscale/arm/'` ;; ymp) basic_machine=ymp-cray os=-unicos ;; z8k-*-coff) basic_machine=z8k-unknown os=-sim ;; z80-*-coff) basic_machine=z80-unknown os=-sim ;; none) basic_machine=none-none os=-none ;; # Here we handle the default manufacturer of certain CPU types. It is in # some cases the only manufacturer, in others, it is the most popular. w89k) basic_machine=hppa1.1-winbond ;; op50n) basic_machine=hppa1.1-oki ;; op60c) basic_machine=hppa1.1-oki ;; romp) basic_machine=romp-ibm ;; mmix) basic_machine=mmix-knuth ;; rs6000) basic_machine=rs6000-ibm ;; vax) basic_machine=vax-dec ;; pdp10) # there are many clones, so DEC is not a safe bet basic_machine=pdp10-unknown ;; pdp11) basic_machine=pdp11-dec ;; we32k) basic_machine=we32k-att ;; sh[1234] | sh[24]a | sh[24]aeb | sh[34]eb | sh[1234]le | sh[23]ele) basic_machine=sh-unknown ;; sparc | sparcv8 | sparcv9 | sparcv9b | sparcv9v) basic_machine=sparc-sun ;; cydra) basic_machine=cydra-cydrome ;; orion) basic_machine=orion-highlevel ;; orion105) basic_machine=clipper-highlevel ;; mac | mpw | mac-mpw) basic_machine=m68k-apple ;; pmac | pmac-mpw) basic_machine=powerpc-apple ;; *-unknown) # Make sure to match an already-canonicalized machine name. ;; *) echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 exit 1 ;; esac # Here we canonicalize certain aliases for manufacturers. case $basic_machine in *-digital*) basic_machine=`echo $basic_machine | sed 's/digital.*/dec/'` ;; *-commodore*) basic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'` ;; *) ;; esac # Decode manufacturer-specific aliases for certain operating systems. if [ x"$os" != x"" ] then case $os in # First match some system type aliases # that might get confused with valid system types. # -solaris* is a basic system type, with this one exception. -auroraux) os=-auroraux ;; -solaris1 | -solaris1.*) os=`echo $os | sed -e 's|solaris1|sunos4|'` ;; -solaris) os=-solaris2 ;; -svr4*) os=-sysv4 ;; -unixware*) os=-sysv4.2uw ;; -gnu/linux*) os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'` ;; # First accept the basic system types. # The portable systems comes first. # Each alternative MUST END IN A *, to match a version number. # -sysv* is not here because it comes later, after sysvr4. -gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \ | -*vms* | -sco* | -esix* | -isc* | -aix* | -cnk* | -sunos | -sunos[34]*\ | -hpux* | -unos* | -osf* | -luna* | -dgux* | -auroraux* | -solaris* \ | -sym* | -kopensolaris* | -plan9* \ | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \ | -aos* | -aros* \ | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \ | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \ | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* \ | -bitrig* | -openbsd* | -solidbsd* \ | -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \ | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \ | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \ | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \ | -chorusos* | -chorusrdb* | -cegcc* \ | -cygwin* | -msys* | -pe* | -psos* | -moss* | -proelf* | -rtems* \ | -mingw32* | -mingw64* | -linux-gnu* | -linux-android* \ | -linux-newlib* | -linux-musl* | -linux-uclibc* \ | -uxpv* | -beos* | -mpeix* | -udk* \ | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \ | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \ | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \ | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \ | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \ | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \ | -skyos* | -haiku* | -rdos* | -toppers* | -drops* | -es*) # Remember, each alternative MUST END IN *, to match a version number. ;; -qnx*) case $basic_machine in x86-* | i*86-*) ;; *) os=-nto$os ;; esac ;; -nto-qnx*) ;; -nto*) os=`echo $os | sed -e 's|nto|nto-qnx|'` ;; -sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \ | -windows* | -osx | -abug | -netware* | -os9* | -beos* | -haiku* \ | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*) ;; -mac*) os=`echo $os | sed -e 's|mac|macos|'` ;; -linux-dietlibc) os=-linux-dietlibc ;; -linux*) os=`echo $os | sed -e 's|linux|linux-gnu|'` ;; -sunos5*) os=`echo $os | sed -e 's|sunos5|solaris2|'` ;; -sunos6*) os=`echo $os | sed -e 's|sunos6|solaris3|'` ;; -opened*) os=-openedition ;; -os400*) os=-os400 ;; -wince*) os=-wince ;; -osfrose*) os=-osfrose ;; -osf*) os=-osf ;; -utek*) os=-bsd ;; -dynix*) os=-bsd ;; -acis*) os=-aos ;; -atheos*) os=-atheos ;; -syllable*) os=-syllable ;; -386bsd) os=-bsd ;; -ctix* | -uts*) os=-sysv ;; -nova*) os=-rtmk-nova ;; -ns2 ) os=-nextstep2 ;; -nsk*) os=-nsk ;; # Preserve the version number of sinix5. -sinix5.*) os=`echo $os | sed -e 's|sinix|sysv|'` ;; -sinix*) os=-sysv4 ;; -tpf*) os=-tpf ;; -triton*) os=-sysv3 ;; -oss*) os=-sysv3 ;; -svr4) os=-sysv4 ;; -svr3) os=-sysv3 ;; -sysvr4) os=-sysv4 ;; # This must come after -sysvr4. -sysv*) ;; -ose*) os=-ose ;; -es1800*) os=-ose ;; -xenix) os=-xenix ;; -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) os=-mint ;; -aros*) os=-aros ;; -zvmoe) os=-zvmoe ;; -dicos*) os=-dicos ;; -nacl*) ;; -none) ;; *) # Get rid of the `-' at the beginning of $os. os=`echo $os | sed 's/[^-]*-//'` echo Invalid configuration \`$1\': system \`$os\' not recognized 1>&2 exit 1 ;; esac else # Here we handle the default operating systems that come with various machines. # The value should be what the vendor currently ships out the door with their # machine or put another way, the most popular os provided with the machine. # Note that if you're going to try to match "-MANUFACTURER" here (say, # "-sun"), then you have to tell the case statement up towards the top # that MANUFACTURER isn't an operating system. Otherwise, code above # will signal an error saying that MANUFACTURER isn't an operating # system, and we'll never get to this point. case $basic_machine in score-*) os=-elf ;; spu-*) os=-elf ;; *-acorn) os=-riscix1.2 ;; arm*-rebel) os=-linux ;; arm*-semi) os=-aout ;; c4x-* | tic4x-*) os=-coff ;; c8051-*) os=-elf ;; hexagon-*) os=-elf ;; tic54x-*) os=-coff ;; tic55x-*) os=-coff ;; tic6x-*) os=-coff ;; # This must come before the *-dec entry. pdp10-*) os=-tops20 ;; pdp11-*) os=-none ;; *-dec | vax-*) os=-ultrix4.2 ;; m68*-apollo) os=-domain ;; i386-sun) os=-sunos4.0.2 ;; m68000-sun) os=-sunos3 ;; m68*-cisco) os=-aout ;; mep-*) os=-elf ;; mips*-cisco) os=-elf ;; mips*-*) os=-elf ;; or1k-*) os=-elf ;; or32-*) os=-coff ;; *-tti) # must be before sparc entry or we get the wrong os. os=-sysv3 ;; sparc-* | *-sun) os=-sunos4.1.1 ;; *-be) os=-beos ;; *-haiku) os=-haiku ;; *-ibm) os=-aix ;; *-knuth) os=-mmixware ;; *-wec) os=-proelf ;; *-winbond) os=-proelf ;; *-oki) os=-proelf ;; *-hp) os=-hpux ;; *-hitachi) os=-hiux ;; i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent) os=-sysv ;; *-cbm) os=-amigaos ;; *-dg) os=-dgux ;; *-dolphin) os=-sysv3 ;; m68k-ccur) os=-rtu ;; m88k-omron*) os=-luna ;; *-next ) os=-nextstep ;; *-sequent) os=-ptx ;; *-crds) os=-unos ;; *-ns) os=-genix ;; i370-*) os=-mvs ;; *-next) os=-nextstep3 ;; *-gould) os=-sysv ;; *-highlevel) os=-bsd ;; *-encore) os=-bsd ;; *-sgi) os=-irix ;; *-siemens) os=-sysv4 ;; *-masscomp) os=-rtu ;; f30[01]-fujitsu | f700-fujitsu) os=-uxpv ;; *-rom68k) os=-coff ;; *-*bug) os=-coff ;; *-apple) os=-macos ;; *-atari*) os=-mint ;; *) os=-none ;; esac fi # Here we handle the case where we know the os, and the CPU type, but not the # manufacturer. We pick the logical manufacturer. vendor=unknown case $basic_machine in *-unknown) case $os in -riscix*) vendor=acorn ;; -sunos*) vendor=sun ;; -cnk*|-aix*) vendor=ibm ;; -beos*) vendor=be ;; -hpux*) vendor=hp ;; -mpeix*) vendor=hp ;; -hiux*) vendor=hitachi ;; -unos*) vendor=crds ;; -dgux*) vendor=dg ;; -luna*) vendor=omron ;; -genix*) vendor=ns ;; -mvs* | -opened*) vendor=ibm ;; -os400*) vendor=ibm ;; -ptx*) vendor=sequent ;; -tpf*) vendor=ibm ;; -vxsim* | -vxworks* | -windiss*) vendor=wrs ;; -aux*) vendor=apple ;; -hms*) vendor=hitachi ;; -mpw* | -macos*) vendor=apple ;; -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) vendor=atari ;; -vos*) vendor=stratus ;; esac basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"` ;; esac echo $basic_machine$os exit # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "timestamp='" # time-stamp-format: "%:y-%02m-%02d" # time-stamp-end: "'" # End: dibbler-1.0.1/RelCfgMgr/0000775000175000017500000000000012561700421011725 500000000000000dibbler-1.0.1/RelCfgMgr/RelParser.h0000664000175000017500000002352412556513130013726 00000000000000#ifndef YY_RelParser_h_included #define YY_RelParser_h_included #define YY_USE_CLASS #line 1 "../bison++/bison.h" /* before anything */ #ifdef c_plusplus #ifndef __cplusplus #define __cplusplus #endif #endif #line 8 "../bison++/bison.h" #line 3 "RelParser.y" #include #include #include #include #include "DHCPConst.h" #include "SmartPtr.h" #include "Container.h" #include "RelParser.h" #include "RelParsGlobalOpt.h" #include "RelParsIfaceOpt.h" #include "RelCfgIface.h" #include "RelCfgMgr.h" #include "OptVendorData.h" #include "OptDUID.h" #include "DUID.h" #include "Logger.h" #include "Portable.h" using namespace std; #define YY_USE_CLASS #define YY_RelParser_MEMBERS FlexLexer * lex; \ List(TRelParsGlobalOpt) ParserOptStack; /* list of parsed interfaces/IAs/addrs */ \ List(TRelCfgIface) RelCfgIfaceLst; /* list of RelCfg interfaces */ \ List(TIPv6Addr) PresentAddrLst; /* address list (used for DNS,NTP,etc.)*/ \ List(std::string) PresentStringLst; /* string list */ \ SPtr EchoOpt; /* echo request option */ \ /*method check whether interface with id=ifaceNr has been already declared */ \ bool CheckIsIface(int ifaceNr); \ /*method check whether interface with id=ifaceName has been already declared*/ \ bool CheckIsIface(string ifaceName); \ void StartIfaceDeclaration(); \ bool EndIfaceDeclaration(); \ TRelCfgMgr* CfgMgr; \ virtual ~RelParser(); #define YY_RelParser_CONSTRUCTOR_PARAM yyFlexLexer * lex #define YY_RelParser_CONSTRUCTOR_CODE \ ParserOptStack.append(new TRelParsGlobalOpt()); \ this->lex = lex; \ yynerrs = 0; \ yychar = 0; #line 55 "RelParser.y" typedef union { unsigned int ival; char *strval; char addrval[16]; struct SDuid { int length; char* duid; } duidval; } yy_RelParser_stype; #define YY_RelParser_STYPE yy_RelParser_stype #line 21 "../bison++/bison.h" /* %{ and %header{ and %union, during decl */ #ifndef YY_RelParser_COMPATIBILITY #ifndef YY_USE_CLASS #define YY_RelParser_COMPATIBILITY 1 #else #define YY_RelParser_COMPATIBILITY 0 #endif #endif #if YY_RelParser_COMPATIBILITY != 0 /* backward compatibility */ #ifdef YYLTYPE #ifndef YY_RelParser_LTYPE #define YY_RelParser_LTYPE YYLTYPE /* WARNING obsolete !!! user defined YYLTYPE not reported into generated header */ /* use %define LTYPE */ #endif #endif /*#ifdef YYSTYPE*/ #ifndef YY_RelParser_STYPE #define YY_RelParser_STYPE YYSTYPE /* WARNING obsolete !!! user defined YYSTYPE not reported into generated header */ /* use %define STYPE */ #endif /*#endif*/ #ifdef YYDEBUG #ifndef YY_RelParser_DEBUG #define YY_RelParser_DEBUG YYDEBUG /* WARNING obsolete !!! user defined YYDEBUG not reported into generated header */ /* use %define DEBUG */ #endif #endif /* use goto to be compatible */ #ifndef YY_RelParser_USE_GOTO #define YY_RelParser_USE_GOTO 1 #endif #endif /* use no goto to be clean in C++ */ #ifndef YY_RelParser_USE_GOTO #define YY_RelParser_USE_GOTO 0 #endif #ifndef YY_RelParser_PURE #line 65 "../bison++/bison.h" #line 65 "../bison++/bison.h" /* YY_RelParser_PURE */ #endif #line 68 "../bison++/bison.h" #line 68 "../bison++/bison.h" /* prefix */ #ifndef YY_RelParser_DEBUG #line 71 "../bison++/bison.h" #define YY_RelParser_DEBUG 1 #line 71 "../bison++/bison.h" /* YY_RelParser_DEBUG */ #endif #ifndef YY_RelParser_LSP_NEEDED #line 75 "../bison++/bison.h" #line 75 "../bison++/bison.h" /* YY_RelParser_LSP_NEEDED*/ #endif /* DEFAULT LTYPE*/ #ifdef YY_RelParser_LSP_NEEDED #ifndef YY_RelParser_LTYPE #ifndef BISON_YYLTYPE_ISDECLARED #define BISON_YYLTYPE_ISDECLARED typedef struct yyltype { int timestamp; int first_line; int first_column; int last_line; int last_column; char *text; } yyltype; #endif #define YY_RelParser_LTYPE yyltype #endif #endif /* DEFAULT STYPE*/ #ifndef YY_RelParser_STYPE #define YY_RelParser_STYPE int #endif /* DEFAULT MISCELANEOUS */ #ifndef YY_RelParser_PARSE #define YY_RelParser_PARSE yyparse #endif #ifndef YY_RelParser_LEX #define YY_RelParser_LEX yylex #endif #ifndef YY_RelParser_LVAL #define YY_RelParser_LVAL yylval #endif #ifndef YY_RelParser_LLOC #define YY_RelParser_LLOC yylloc #endif #ifndef YY_RelParser_CHAR #define YY_RelParser_CHAR yychar #endif #ifndef YY_RelParser_NERRS #define YY_RelParser_NERRS yynerrs #endif #ifndef YY_RelParser_DEBUG_FLAG #define YY_RelParser_DEBUG_FLAG yydebug #endif #ifndef YY_RelParser_ERROR #define YY_RelParser_ERROR yyerror #endif #ifndef YY_RelParser_PARSE_PARAM #ifndef __STDC__ #ifndef __cplusplus #ifndef YY_USE_CLASS #define YY_RelParser_PARSE_PARAM #ifndef YY_RelParser_PARSE_PARAM_DEF #define YY_RelParser_PARSE_PARAM_DEF #endif #endif #endif #endif #ifndef YY_RelParser_PARSE_PARAM #define YY_RelParser_PARSE_PARAM void #endif #endif /* TOKEN C */ #ifndef YY_USE_CLASS #ifndef YY_RelParser_PURE #ifndef yylval extern YY_RelParser_STYPE YY_RelParser_LVAL; #else #if yylval != YY_RelParser_LVAL extern YY_RelParser_STYPE YY_RelParser_LVAL; #else #warning "Namespace conflict, disabling some functionality (bison++ only)" #endif #endif #endif #line 169 "../bison++/bison.h" #define IFACE_ 258 #define CLIENT_ 259 #define SERVER_ 260 #define UNICAST_ 261 #define MULTICAST_ 262 #define IFACE_ID_ 263 #define IFACE_ID_ORDER_ 264 #define LOGNAME_ 265 #define LOGLEVEL_ 266 #define LOGMODE_ 267 #define WORKDIR_ 268 #define DUID_ 269 #define OPTION_ 270 #define REMOTE_ID_ 271 #define ECHO_REQUEST_ 272 #define RELAY_ID_ 273 #define LINK_LAYER_ 274 #define GUESS_MODE_ 275 #define STRING_ 276 #define HEXNUMBER_ 277 #define INTNUMBER_ 278 #define IPV6ADDR_ 279 #line 169 "../bison++/bison.h" /* #defines token */ /* after #define tokens, before const tokens S5*/ #else #ifndef YY_RelParser_CLASS #define YY_RelParser_CLASS RelParser #endif #ifndef YY_RelParser_INHERIT #define YY_RelParser_INHERIT #endif #ifndef YY_RelParser_MEMBERS #define YY_RelParser_MEMBERS #endif #ifndef YY_RelParser_LEX_BODY #define YY_RelParser_LEX_BODY #endif #ifndef YY_RelParser_ERROR_BODY #define YY_RelParser_ERROR_BODY #endif #ifndef YY_RelParser_CONSTRUCTOR_PARAM #define YY_RelParser_CONSTRUCTOR_PARAM #endif /* choose between enum and const */ #ifndef YY_RelParser_USE_CONST_TOKEN #define YY_RelParser_USE_CONST_TOKEN 0 /* yes enum is more compatible with flex, */ /* so by default we use it */ #endif #if YY_RelParser_USE_CONST_TOKEN != 0 #ifndef YY_RelParser_ENUM_TOKEN #define YY_RelParser_ENUM_TOKEN yy_RelParser_enum_token #endif #endif class YY_RelParser_CLASS YY_RelParser_INHERIT { public: #if YY_RelParser_USE_CONST_TOKEN != 0 /* static const int token ... */ #line 212 "../bison++/bison.h" static const int IFACE_; static const int CLIENT_; static const int SERVER_; static const int UNICAST_; static const int MULTICAST_; static const int IFACE_ID_; static const int IFACE_ID_ORDER_; static const int LOGNAME_; static const int LOGLEVEL_; static const int LOGMODE_; static const int WORKDIR_; static const int DUID_; static const int OPTION_; static const int REMOTE_ID_; static const int ECHO_REQUEST_; static const int RELAY_ID_; static const int LINK_LAYER_; static const int GUESS_MODE_; static const int STRING_; static const int HEXNUMBER_; static const int INTNUMBER_; static const int IPV6ADDR_; #line 212 "../bison++/bison.h" /* decl const */ #else enum YY_RelParser_ENUM_TOKEN { YY_RelParser_NULL_TOKEN=0 #line 215 "../bison++/bison.h" ,IFACE_=258 ,CLIENT_=259 ,SERVER_=260 ,UNICAST_=261 ,MULTICAST_=262 ,IFACE_ID_=263 ,IFACE_ID_ORDER_=264 ,LOGNAME_=265 ,LOGLEVEL_=266 ,LOGMODE_=267 ,WORKDIR_=268 ,DUID_=269 ,OPTION_=270 ,REMOTE_ID_=271 ,ECHO_REQUEST_=272 ,RELAY_ID_=273 ,LINK_LAYER_=274 ,GUESS_MODE_=275 ,STRING_=276 ,HEXNUMBER_=277 ,INTNUMBER_=278 ,IPV6ADDR_=279 #line 215 "../bison++/bison.h" /* enum token */ }; /* end of enum declaration */ #endif public: int YY_RelParser_PARSE(YY_RelParser_PARSE_PARAM); virtual void YY_RelParser_ERROR(char *msg) YY_RelParser_ERROR_BODY; #ifdef YY_RelParser_PURE #ifdef YY_RelParser_LSP_NEEDED virtual int YY_RelParser_LEX(YY_RelParser_STYPE *YY_RelParser_LVAL,YY_RelParser_LTYPE *YY_RelParser_LLOC) YY_RelParser_LEX_BODY; #else virtual int YY_RelParser_LEX(YY_RelParser_STYPE *YY_RelParser_LVAL) YY_RelParser_LEX_BODY; #endif #else virtual int YY_RelParser_LEX() YY_RelParser_LEX_BODY; YY_RelParser_STYPE YY_RelParser_LVAL; #ifdef YY_RelParser_LSP_NEEDED YY_RelParser_LTYPE YY_RelParser_LLOC; #endif int YY_RelParser_NERRS; int YY_RelParser_CHAR; #endif #if YY_RelParser_DEBUG != 0 public: int YY_RelParser_DEBUG_FLAG; /* nonzero means print parse trace */ #endif public: YY_RelParser_CLASS(YY_RelParser_CONSTRUCTOR_PARAM); public: YY_RelParser_MEMBERS }; /* other declare folow */ #endif #if YY_RelParser_COMPATIBILITY != 0 /* backward compatibility */ /* Removed due to bison problems /#ifndef YYSTYPE / #define YYSTYPE YY_RelParser_STYPE /#endif*/ #ifndef YYLTYPE #define YYLTYPE YY_RelParser_LTYPE #endif #ifndef YYDEBUG #ifdef YY_RelParser_DEBUG #define YYDEBUG YY_RelParser_DEBUG #endif #endif #endif /* END */ #line 267 "../bison++/bison.h" #endif dibbler-1.0.1/RelCfgMgr/RelCfgIface.h0000664000175000017500000000232012233256142014107 00000000000000/* * Dibbler - a portable DHCPv6 * * authors: Tomasz Mrugalski * Marek Senderski * * released under GNU GPL v2 only licence * */ class TRelCfgIface; #ifndef RELCFGIFACE_H #define RELCFGIFACE_H #include "DHCPConst.h" #include "RelParsGlobalOpt.h" #include #include class TRelCfgIface { friend std::ostream& operator<<(std::ostream& out,TRelCfgIface& iface); public: TRelCfgIface(const std::string& ifaceName); TRelCfgIface(int ifaceNr); virtual ~TRelCfgIface(); void setName(std::string ifaceName); void setID(int ifaceID); int getID(); std::string getName(); std::string getFullName(); SPtr getServerUnicast(); SPtr getClientUnicast(); bool getServerMulticast(); bool getClientMulticast(); void setOptions(SPtr opt); unsigned char getPreference(); int getInterfaceID(); private: std::string Name_; int ID_; int InterfaceID_; // value of interface-id option (optional) SPtr ClientUnicast_; SPtr ServerUnicast_; bool ClientMulticast_; bool ServerMulticast_; }; #endif /* RELCFGIFACE_H */ dibbler-1.0.1/RelCfgMgr/Makefile.am0000644000175000017500000000225212277722750013715 00000000000000noinst_LIBRARIES = libRelCfgMgr.a libRelCfgMgr_a_CPPFLAGS = -I$(top_srcdir)/Misc -I$(top_srcdir)/CfgMgr libRelCfgMgr_a_CPPFLAGS += -I$(top_srcdir)/Options -I$(top_srcdir)/RelOptions libRelCfgMgr_a_CPPFLAGS += -I$(top_srcdir)/IfaceMgr -I$(top_srcdir)/RelIfaceMgr libRelCfgMgr_a_CPPFLAGS += -I$(top_srcdir)/RelMessages -I$(top_srcdir)/Messages libRelCfgMgr_a_CPPFLAGS += -I$(top_srcdir)/@PORT_SUBDIR@ libRelCfgMgr_a_SOURCES = RelCfgIface.cpp RelCfgIface.h RelCfgMgr.cpp RelCfgMgr.h RelLexer.cpp RelLexer.h RelParser.cpp RelParser.h RelParsGlobalOpt.cpp RelParsGlobalOpt.h RelParsIfaceOpt.cpp RelParsIfaceOpt.h dist_noinst_DATA = RelLexer.l RelParser.y parser: RelParser.y RelLexer.l echo "[BISON++] $(SUBDIR)/RelParser.y" $(top_builddir)/bison++/bison++ --skeleton=$(top_builddir)/bison++/bison.cc --headerskeleton=$(top_builddir)/bison++/bison.h -v --debug --defines -d RelParser.y -o RelParser.cpp echo "[FLEX ] $(SUBDIR)/RelLexer.l" flex -+ -i -oRelLexer.cpp RelLexer.l @echo "[SED ] $(SUBDIR)/RelLexer.cpp" cat RelLexer.cpp | sed 's/extern "C" int isatty (int );/\/\/ extern "C" int isatty (int ) throw ();/' > RelLexer.cpp2 rm -f RelLexer.cpp mv RelLexer.cpp2 RelLexer.cpp dibbler-1.0.1/RelCfgMgr/RelParsIfaceOpt.cpp0000664000175000017500000000243012556514673015353 00000000000000/* * Dibbler - a portable DHCPv6 * * authors: Tomasz Mrugalski * Marek Senderski * * released under GNU GPL v2 only licence * */ #include "DHCPDefaults.h" #include "RelParsIfaceOpt.h" TRelParsIfaceOpt::TRelParsIfaceOpt(void) :ClientUnicast_(), ServerUnicast_(), ClientMulticast_(false), ServerMulticast_(false), InterfaceID_(-1) { } TRelParsIfaceOpt::~TRelParsIfaceOpt(void) { } // --- unicast --- void TRelParsIfaceOpt::setServerUnicast(SPtr addr) { ServerUnicast_ = addr; } SPtr TRelParsIfaceOpt::getServerUnicast() { return ServerUnicast_; } void TRelParsIfaceOpt::setClientUnicast(SPtr addr) { ClientUnicast_ = addr; } SPtr TRelParsIfaceOpt::getClientUnicast() { return ClientUnicast_; } void TRelParsIfaceOpt::setClientMulticast(bool multi) { ClientMulticast_ = multi; } bool TRelParsIfaceOpt::getClientMulticast() { return ClientMulticast_; } void TRelParsIfaceOpt::setServerMulticast(bool multi) { ServerMulticast_ = multi; } bool TRelParsIfaceOpt::getServerMulticast() { return ServerMulticast_; } void TRelParsIfaceOpt::setInterfaceID(int id) { InterfaceID_ = id; } int TRelParsIfaceOpt::getInterfaceID() { return InterfaceID_; } dibbler-1.0.1/RelCfgMgr/RelParsGlobalOpt.cpp0000644000175000017500000000236712474402562015543 00000000000000/* * Dibbler - a portable DHCPv6 * * authors: Tomasz Mrugalski * Marek Senderski * * released under GNU GPL v2 only licence * */ #include "RelParsGlobalOpt.h" #include "Portable.h" using namespace std; TRelParsGlobalOpt::TRelParsGlobalOpt(void) : WorkDir_(DEFAULT_WORKDIR), GuessMode_(false), InterfaceIDOrder_(REL_IFACE_ID_ORDER_BEFORE) { } TRelParsGlobalOpt::~TRelParsGlobalOpt(void) { } string TRelParsGlobalOpt::getWorkDir() { return WorkDir_; } void TRelParsGlobalOpt::setWorkDir(std::string dir) { WorkDir_ = dir; } void TRelParsGlobalOpt::setGuessMode(bool guess) { GuessMode_ = guess; } bool TRelParsGlobalOpt::getGuessMode() { return GuessMode_; } void TRelParsGlobalOpt::setInterfaceIDOrder(ERelIfaceIdOrder order) { InterfaceIDOrder_ = order; } ERelIfaceIdOrder TRelParsGlobalOpt::getInterfaceIDOrder() { return InterfaceIDOrder_; } void TRelParsGlobalOpt::setRemoteID(SPtr remoteID) { RemoteID_ = remoteID; } SPtr TRelParsGlobalOpt::getRemoteID() { return RemoteID_; } void TRelParsGlobalOpt::setEcho(SPtr echo) { Echo_ = echo; } SPtr TRelParsGlobalOpt::getEcho() { return Echo_; } dibbler-1.0.1/RelCfgMgr/RelParsGlobalOpt.h0000644000175000017500000000223712277722750015211 00000000000000/* * Dibbler - a portable DHCPv6 * * authors: Tomasz Mrugalski * Marek Senderski * * released under GNU GPL v2 only licence * */ #ifndef TRELPARSGLOBALOPT_H_ #define TRELPARSGLOBALOPT_H_ #include "RelParsIfaceOpt.h" #include "OptVendorData.h" #include "RelOptEcho.h" #include "SmartPtr.h" #include typedef enum { REL_IFACE_ID_ORDER_BEFORE, REL_IFACE_ID_ORDER_AFTER, REL_IFACE_ID_ORDER_NONE } ERelIfaceIdOrder; class TRelParsGlobalOpt : public TRelParsIfaceOpt { public: TRelParsGlobalOpt(void); ~TRelParsGlobalOpt(void); std::string getWorkDir(); void setWorkDir(std::string dir); void setGuessMode(bool guess); bool getGuessMode(); void setInterfaceIDOrder(ERelIfaceIdOrder order); ERelIfaceIdOrder getInterfaceIDOrder(); void setRemoteID(SPtr remoteID); SPtr getRemoteID(); void setEcho(SPtr echo); SPtr getEcho(); private: std::string WorkDir_; bool GuessMode_; ERelIfaceIdOrder InterfaceIDOrder_; SPtr RemoteID_; SPtr Echo_; }; #endif dibbler-1.0.1/RelCfgMgr/RelCfgIface.cpp0000664000175000017500000000574612556514712014471 00000000000000/* * Dibbler - a portable DHCPv6 * * authors: Tomasz Mrugalski * * released under GNU GPL v2 only licence * */ #include #include "DHCPDefaults.h" #include "RelCfgIface.h" #include "Logger.h" using namespace std; TRelCfgIface::TRelCfgIface(int ifindex) :Name_("[unknown]"), ID_(ifindex), InterfaceID_(-1), ClientUnicast_(), ServerUnicast_(), ClientMulticast_(false), ServerMulticast_(false) { } TRelCfgIface::TRelCfgIface(const std::string& ifaceName) :Name_(ifaceName), ID_(-1), InterfaceID_(-1), ClientUnicast_(), ServerUnicast_(), ClientMulticast_(false), ServerMulticast_(false) { } int TRelCfgIface::getID() { return ID_; } string TRelCfgIface::getName() { return Name_; } string TRelCfgIface::getFullName() { ostringstream oss; oss << ID_; return Name_ + "/" + oss.str(); } TRelCfgIface::~TRelCfgIface() { } SPtr TRelCfgIface::getServerUnicast() { return ServerUnicast_; } SPtr TRelCfgIface::getClientUnicast() { return ClientUnicast_; } bool TRelCfgIface::getClientMulticast() { return ClientMulticast_; } bool TRelCfgIface::getServerMulticast() { return ServerMulticast_; } void TRelCfgIface::setOptions(SPtr opt) { ClientUnicast_ = opt->getClientUnicast(); ServerUnicast_ = opt->getServerUnicast(); ClientMulticast_ = opt->getClientMulticast(); ServerMulticast_ = opt->getServerMulticast(); InterfaceID_ = opt->getInterfaceID(); } void TRelCfgIface::setName(std::string ifaceName) { Name_ = ifaceName; } void TRelCfgIface::setID(int ifaceID) { ID_ = ifaceID; } int TRelCfgIface::getInterfaceID() { return InterfaceID_; } // -------------------------------------------------------------------- // --- operators ------------------------------------------------------ // -------------------------------------------------------------------- ostream& operator<<(ostream& out, TRelCfgIface& iface) { SPtr addr; SPtr str; out << dec; out << " " << std::endl; if (iface.ClientUnicast_) { out << " " << iface.ClientUnicast_->getPlain() << "" << endl; } else { out << " " << endl; } if (iface.ClientMulticast_) { out << " " << endl; } else { out << " " << endl; } if (iface.ServerUnicast_) { out << " " << iface.ServerUnicast_->getPlain() << "" << endl; } else { out << " " << endl; } if (iface.ServerMulticast_) { out << " " << endl; } else { out << " " << endl; } out << " " << endl; return out; } dibbler-1.0.1/RelCfgMgr/RelLexer.cpp0000664000175000017500000023055612556513130014111 00000000000000#line 2 "RelLexer.cpp" #line 4 "RelLexer.cpp" #define YY_INT_ALIGNED short int /* A lexical scanner generated by flex */ #define FLEX_SCANNER #define YY_FLEX_MAJOR_VERSION 2 #define YY_FLEX_MINOR_VERSION 5 #define YY_FLEX_SUBMINOR_VERSION 39 #if YY_FLEX_SUBMINOR_VERSION > 0 #define FLEX_BETA #endif /* The c++ scanner is a mess. The FlexLexer.h header file relies on the * following macro. This is required in order to pass the c++-multiple-scanners * test in the regression suite. We get reports that it breaks inheritance. * We will address this in a future release of flex, or omit the C++ scanner * altogether. */ #define yyFlexLexer yyFlexLexer /* First, we deal with platform-specific or compiler-specific issues. */ /* begin standard C headers. */ /* end standard C headers. */ /* flex integer type definitions */ #ifndef FLEXINT_H #define FLEXINT_H /* C99 systems have . Non-C99 systems may or may not. */ #if defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L /* C99 says to define __STDC_LIMIT_MACROS before including stdint.h, * if you want the limit (max/min) macros for int types. */ #ifndef __STDC_LIMIT_MACROS #define __STDC_LIMIT_MACROS 1 #endif #include typedef int8_t flex_int8_t; typedef uint8_t flex_uint8_t; typedef int16_t flex_int16_t; typedef uint16_t flex_uint16_t; typedef int32_t flex_int32_t; typedef uint32_t flex_uint32_t; #else typedef signed char flex_int8_t; typedef short int flex_int16_t; typedef int flex_int32_t; typedef unsigned char flex_uint8_t; typedef unsigned short int flex_uint16_t; typedef unsigned int flex_uint32_t; /* Limits of integral types. */ #ifndef INT8_MIN #define INT8_MIN (-128) #endif #ifndef INT16_MIN #define INT16_MIN (-32767-1) #endif #ifndef INT32_MIN #define INT32_MIN (-2147483647-1) #endif #ifndef INT8_MAX #define INT8_MAX (127) #endif #ifndef INT16_MAX #define INT16_MAX (32767) #endif #ifndef INT32_MAX #define INT32_MAX (2147483647) #endif #ifndef UINT8_MAX #define UINT8_MAX (255U) #endif #ifndef UINT16_MAX #define UINT16_MAX (65535U) #endif #ifndef UINT32_MAX #define UINT32_MAX (4294967295U) #endif #endif /* ! C99 */ #endif /* ! FLEXINT_H */ /* begin standard C++ headers. */ #include #include #include #include #include /* end standard C++ headers. */ #ifdef __cplusplus /* The "const" storage-class-modifier is valid. */ #define YY_USE_CONST #else /* ! __cplusplus */ /* C99 requires __STDC__ to be defined as 1. */ #if defined (__STDC__) #define YY_USE_CONST #endif /* defined (__STDC__) */ #endif /* ! __cplusplus */ #ifdef YY_USE_CONST #define yyconst const #else #define yyconst #endif /* Returned upon end-of-file. */ #define YY_NULL 0 /* Promotes a possibly negative, possibly signed char to an unsigned * integer for use as an array index. If the signed char is negative, * we want to instead treat it as an 8-bit unsigned char, hence the * double cast. */ #define YY_SC_TO_UI(c) ((unsigned int) (unsigned char) c) /* Enter a start condition. This macro really ought to take a parameter, * but we do it the disgusting crufty way forced on us by the ()-less * definition of BEGIN. */ #define BEGIN (yy_start) = 1 + 2 * /* Translate the current start state into a value that can be later handed * to BEGIN to return to the state. The YYSTATE alias is for lex * compatibility. */ #define YY_START (((yy_start) - 1) / 2) #define YYSTATE YY_START /* Action number for EOF rule of a given start state. */ #define YY_STATE_EOF(state) (YY_END_OF_BUFFER + state + 1) /* Special action meaning "start processing a new file". */ #define YY_NEW_FILE yyrestart( yyin ) #define YY_END_OF_BUFFER_CHAR 0 /* Size of default input buffer. */ #ifndef YY_BUF_SIZE #ifdef __ia64__ /* On IA-64, the buffer size is 16k, not 8k. * Moreover, YY_BUF_SIZE is 2*YY_READ_BUF_SIZE in the general case. * Ditto for the __ia64__ case accordingly. */ #define YY_BUF_SIZE 32768 #else #define YY_BUF_SIZE 16384 #endif /* __ia64__ */ #endif /* The state buf must be large enough to hold one state per character in the main buffer. */ #define YY_STATE_BUF_SIZE ((YY_BUF_SIZE + 2) * sizeof(yy_state_type)) #ifndef YY_TYPEDEF_YY_BUFFER_STATE #define YY_TYPEDEF_YY_BUFFER_STATE typedef struct yy_buffer_state *YY_BUFFER_STATE; #endif #ifndef YY_TYPEDEF_YY_SIZE_T #define YY_TYPEDEF_YY_SIZE_T typedef size_t yy_size_t; #endif extern yy_size_t yyleng; #define EOB_ACT_CONTINUE_SCAN 0 #define EOB_ACT_END_OF_FILE 1 #define EOB_ACT_LAST_MATCH 2 /* Note: We specifically omit the test for yy_rule_can_match_eol because it requires * access to the local variable yy_act. Since yyless() is a macro, it would break * existing scanners that call yyless() from OUTSIDE yylex. * One obvious solution it to make yy_act a global. I tried that, and saw * a 5% performance hit in a non-yylineno scanner, because yy_act is * normally declared as a register variable-- so it is not worth it. */ #define YY_LESS_LINENO(n) \ do { \ int yyl;\ for ( yyl = n; yyl < yyleng; ++yyl )\ if ( yytext[yyl] == '\n' )\ --yylineno;\ }while(0) #define YY_LINENO_REWIND_TO(dst) \ do {\ const char *p;\ for ( p = yy_cp-1; p >= (dst); --p)\ if ( *p == '\n' )\ --yylineno;\ }while(0) /* Return all but the first "n" matched characters back to the input stream. */ #define yyless(n) \ do \ { \ /* Undo effects of setting up yytext. */ \ int yyless_macro_arg = (n); \ YY_LESS_LINENO(yyless_macro_arg);\ *yy_cp = (yy_hold_char); \ YY_RESTORE_YY_MORE_OFFSET \ (yy_c_buf_p) = yy_cp = yy_bp + yyless_macro_arg - YY_MORE_ADJ; \ YY_DO_BEFORE_ACTION; /* set up yytext again */ \ } \ while ( 0 ) #define unput(c) yyunput( c, (yytext_ptr) ) #ifndef YY_STRUCT_YY_BUFFER_STATE #define YY_STRUCT_YY_BUFFER_STATE struct yy_buffer_state { std::istream* yy_input_file; char *yy_ch_buf; /* input buffer */ char *yy_buf_pos; /* current position in input buffer */ /* Size of input buffer in bytes, not including room for EOB * characters. */ yy_size_t yy_buf_size; /* Number of characters read into yy_ch_buf, not including EOB * characters. */ yy_size_t yy_n_chars; /* Whether we "own" the buffer - i.e., we know we created it, * and can realloc() it to grow it, and should free() it to * delete it. */ int yy_is_our_buffer; /* Whether this is an "interactive" input source; if so, and * if we're using stdio for input, then we want to use getc() * instead of fread(), to make sure we stop fetching input after * each newline. */ int yy_is_interactive; /* Whether we're considered to be at the beginning of a line. * If so, '^' rules will be active on the next match, otherwise * not. */ int yy_at_bol; int yy_bs_lineno; /**< The line count. */ int yy_bs_column; /**< The column count. */ /* Whether to try to fill the input buffer when we reach the * end of it. */ int yy_fill_buffer; int yy_buffer_status; #define YY_BUFFER_NEW 0 #define YY_BUFFER_NORMAL 1 /* When an EOF's been seen but there's still some text to process * then we mark the buffer as YY_EOF_PENDING, to indicate that we * shouldn't try reading from the input source any more. We might * still have a bunch of tokens to match, though, because of * possible backing-up. * * When we actually see the EOF, we change the status to "new" * (via yyrestart()), so that the user can continue scanning by * just pointing yyin at a new input file. */ #define YY_BUFFER_EOF_PENDING 2 }; #endif /* !YY_STRUCT_YY_BUFFER_STATE */ /* We provide macros for accessing buffer states in case in the * future we want to put the buffer states in a more general * "scanner state". * * Returns the top of the stack, or NULL. */ #define YY_CURRENT_BUFFER ( (yy_buffer_stack) \ ? (yy_buffer_stack)[(yy_buffer_stack_top)] \ : NULL) /* Same as previous macro, but useful when we know that the buffer stack is not * NULL or when we need an lvalue. For internal use only. */ #define YY_CURRENT_BUFFER_LVALUE (yy_buffer_stack)[(yy_buffer_stack_top)] void *yyalloc (yy_size_t ); void *yyrealloc (void *,yy_size_t ); void yyfree (void * ); #define yy_new_buffer yy_create_buffer #define yy_set_interactive(is_interactive) \ { \ if ( ! YY_CURRENT_BUFFER ){ \ yyensure_buffer_stack (); \ YY_CURRENT_BUFFER_LVALUE = \ yy_create_buffer( yyin, YY_BUF_SIZE ); \ } \ YY_CURRENT_BUFFER_LVALUE->yy_is_interactive = is_interactive; \ } #define yy_set_bol(at_bol) \ { \ if ( ! YY_CURRENT_BUFFER ){\ yyensure_buffer_stack (); \ YY_CURRENT_BUFFER_LVALUE = \ yy_create_buffer( yyin, YY_BUF_SIZE ); \ } \ YY_CURRENT_BUFFER_LVALUE->yy_at_bol = at_bol; \ } #define YY_AT_BOL() (YY_CURRENT_BUFFER_LVALUE->yy_at_bol) /* Begin user sect3 */ #define YY_SKIP_YYWRAP typedef unsigned char YY_CHAR; #define yytext_ptr yytext #define YY_INTERACTIVE #include int yyFlexLexer::yywrap() { return 1; } /* Done after the current pattern has been matched and before the * corresponding action - sets up yytext. */ #define YY_DO_BEFORE_ACTION \ (yytext_ptr) = yy_bp; \ yyleng = (size_t) (yy_cp - yy_bp); \ (yy_hold_char) = *yy_cp; \ *yy_cp = '\0'; \ (yy_c_buf_p) = yy_cp; #define YY_NUM_RULES 43 #define YY_END_OF_BUFFER 44 /* This struct is not used in this scanner, but its presence is necessary. */ struct yy_trans_info { flex_int32_t yy_verify; flex_int32_t yy_nxt; }; static yyconst flex_int16_t yy_accept[433] = { 0, 1, 1, 0, 0, 0, 0, 44, 42, 2, 1, 1, 42, 24, 42, 42, 39, 39, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 28, 28, 43, 1, 1, 1, 0, 36, 24, 0, 36, 26, 25, 39, 0, 0, 38, 0, 33, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 21, 37, 37, 37, 37, 37, 37, 37, 27, 25, 39, 0, 0, 0, 32, 40, 31, 31, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 20, 39, 0, 0, 0, 0, 30, 30, 0, 31, 0, 31, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 22, 37, 37, 39, 0, 41, 0, 0, 0, 30, 0, 30, 0, 31, 31, 31, 31, 37, 37, 37, 23, 37, 3, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 0, 0, 0, 0, 0, 30, 30, 30, 30, 0, 31, 31, 31, 0, 31, 4, 37, 37, 37, 37, 37, 37, 37, 37, 11, 37, 37, 5, 37, 37, 0, 0, 0, 0, 30, 30, 30, 0, 30, 0, 0, 31, 31, 31, 31, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 6, 37, 41, 0, 0, 0, 0, 0, 30, 30, 30, 30, 0, 31, 31, 31, 0, 31, 37, 37, 37, 37, 37, 18, 16, 37, 13, 37, 19, 0, 0, 0, 0, 30, 30, 30, 0, 30, 35, 31, 31, 31, 31, 37, 37, 37, 37, 17, 7, 12, 0, 0, 0, 0, 34, 30, 30, 30, 30, 31, 31, 31, 0, 31, 37, 10, 37, 14, 41, 0, 0, 30, 30, 30, 0, 30, 31, 31, 31, 31, 37, 37, 0, 0, 0, 0, 30, 30, 30, 30, 31, 31, 31, 0, 31, 15, 8, 0, 0, 0, 30, 30, 30, 0, 30, 31, 31, 31, 31, 37, 41, 0, 0, 0, 30, 30, 30, 30, 31, 31, 31, 0, 31, 37, 0, 0, 29, 32, 30, 30, 30, 0, 30, 31, 31, 31, 31, 37, 0, 0, 29, 0, 30, 30, 30, 30, 30, 31, 31, 31, 0, 31, 37, 41, 29, 32, 30, 0, 30, 30, 30, 30, 31, 31, 31, 37, 0, 29, 30, 30, 30, 30, 31, 31, 31, 9, 0, 30, 30, 0, 30, 30, 31, 41, 30, 30, 31, 0, 30, 30, 0, 29, 30, 30, 29, 30, 30, 0, 0, 30, 30, 0, 30, 30, 0, 41, 30, 30, 0, 30, 30, 0, 30, 30, 0 } ; static yyconst flex_int32_t yy_ec[256] = { 0, 1, 1, 1, 1, 1, 1, 1, 1, 2, 3, 1, 1, 4, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 5, 6, 1, 1, 1, 7, 1, 1, 8, 1, 1, 9, 10, 11, 12, 13, 13, 13, 13, 13, 13, 13, 13, 13, 14, 1, 1, 1, 1, 1, 1, 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, 24, 1, 1, 1, 1, 1, 1, 40, 16, 41, 42, 43, 44, 45, 46, 47, 24, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 24, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 } ; static yyconst flex_int32_t yy_meta[63] = { 0, 1, 1, 2, 1, 1, 1, 1, 1, 3, 4, 1, 5, 5, 6, 5, 5, 5, 5, 5, 5, 3, 7, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 8, 3, 5, 5, 5, 5, 5, 3, 7, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 8, 3 } ; static yyconst flex_int16_t yy_base[576] = { 0, 0, 0, 1384, 1383, 0, 0, 1390, 1393, 1393, 60, 62, 1384, 0, 1381, 59, 59, 62, 1373, 112, 147, 52, 62, 54, 1372, 66, 69, 122, 85, 65, 90, 125, 160, 68, 93, 127, 1393, 1374, 1393, 87, 139, 144, 1379, 1393, 0, 1376, 1375, 1393, 0, 163, 1367, 157, 1393, 0, 137, 1366, 204, 1365, 158, 156, 89, 185, 168, 172, 183, 180, 181, 1364, 198, 213, 199, 200, 219, 224, 227, 1393, 0, 239, 1363, 235, 1362, 224, 0, 255, 260, 274, 257, 268, 245, 263, 258, 284, 259, 126, 288, 281, 291, 294, 296, 307, 295, 299, 1361, 321, 315, 1360, 1359, 1358, 328, 334, 339, 344, 347, 339, 356, 311, 356, 363, 352, 364, 349, 370, 366, 372, 373, 350, 376, 395, 1357, 406, 404, 410, 414, 1356, 1355, 1354, 416, 427, 418, 391, 432, 437, 438, 445, 450, 1353, 377, 421, 1352, 452, 1351, 448, 449, 451, 453, 457, 460, 455, 464, 465, 467, 471, 472, 1350, 1349, 1348, 1347, 483, 497, 477, 503, 509, 476, 516, 1346, 521, 490, 510, 1345, 518, 498, 524, 526, 522, 528, 529, 535, 1344, 530, 538, 1343, 531, 537, 1342, 1341, 1340, 542, 559, 1339, 573, 550, 564, 579, 583, 587, 566, 592, 580, 584, 589, 593, 594, 597, 600, 603, 595, 606, 598, 1338, 599, 1337, 1336, 1335, 1334, 613, 617, 645, 622, 650, 625, 555, 655, 1333, 660, 637, 661, 647, 662, 623, 664, 663, 1332, 1331, 665, 1330, 667, 1329, 1328, 1327, 1326, 640, 674, 1325, 680, 683, 687, 690, 701, 696, 706, 707, 709, 710, 716, 694, 1324, 1323, 1322, 1321, 1320, 1319, 1318, 719, 723, 724, 729, 730, 744, 1317, 749, 733, 737, 734, 1316, 741, 1315, 1314, 1313, 1312, 756, 1311, 761, 764, 768, 771, 777, 782, 779, 746, 783, 1310, 1309, 1308, 1307, 792, 797, 800, 805, 808, 1306, 814, 786, 819, 1305, 821, 1304, 1303, 1302, 824, 1301, 829, 796, 830, 835, 836, 841, 842, 843, 1300, 1299, 1298, 1297, 848, 849, 854, 855, 861, 1296, 866, 804, 867, 856, 1295, 1294, 1293, 0, 872, 1292, 877, 819, 882, 887, 884, 892, 893, 894, 1291, 1290, 1289, 1288, 1287, 903, 900, 908, 1290, 912, 1285, 917, 0, 909, 914, 1284, 1283, 1393, 1282, 0, 925, 1281, 930, 1284, 934, 931, 0, 918, 1279, 1278, 1277, 1276, 939, 1015, 946, 985, 0, 958, 957, 956, 955, 0, 951, 1393, 0, 954, 953, 952, 1393, 951, 948, 941, 0, 940, 939, 920, 895, 879, 869, 0, 809, 786, 772, 0, 765, 758, 0, 751, 736, 713, 686, 684, 677, 0, 633, 630, 1393, 973, 981, 989, 997, 1005, 1009, 1015, 1023, 1027, 1030, 577, 554, 1032, 1035, 1037, 552, 1040, 1042, 1045, 1047, 1049, 1052, 1055, 516, 1057, 1059, 1062, 513, 1065, 1068, 1070, 1072, 1074, 1077, 1080, 1083, 495, 1085, 1087, 1089, 1092, 475, 1095, 1098, 1100, 1102, 1105, 1108, 1111, 449, 1113, 1115, 1117, 1120, 438, 1123, 1126, 1128, 1130, 1132, 1135, 1138, 1141, 431, 1143, 1145, 1148, 398, 1151, 1154, 1156, 1158, 1160, 1163, 1166, 1169, 383, 1171, 1173, 1175, 1178, 325, 1181, 1184, 1186, 1188, 1191, 1194, 1197, 306, 1199, 1201, 1203, 275, 1206, 259, 1209, 1212, 1214, 1216, 1218, 1221, 1224, 1226, 238, 1228, 1230, 1232, 205, 1235, 1237, 195, 1239, 1241, 1243, 1246, 193, 1247, 1249, 179, 146, 1251, 1253, 1255, 1257, 1259, 108, 1261, 1263, 1265, 1267, 101, 1269, 1271, 1273, 98, 1275, 82, 1277, 1279, 1281, 80, 1283 } ; static yyconst flex_int16_t yy_def[576] = { 0, 432, 1, 433, 433, 434, 434, 432, 432, 432, 432, 432, 435, 436, 437, 432, 438, 438, 432, 439, 439, 20, 20, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 432, 432, 432, 432, 432, 432, 435, 432, 436, 437, 432, 432, 440, 441, 442, 441, 432, 443, 444, 439, 439, 439, 439, 56, 56, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 432, 440, 445, 446, 445, 447, 448, 443, 449, 449, 56, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 450, 450, 451, 452, 453, 454, 454, 432, 455, 456, 455, 85, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 450, 131, 452, 457, 458, 432, 459, 460, 459, 432, 461, 461, 462, 462, 114, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 463, 432, 464, 465, 432, 466, 466, 467, 467, 432, 432, 432, 468, 469, 468, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 470, 471, 472, 432, 432, 432, 473, 474, 473, 432, 432, 475, 475, 476, 476, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 464, 432, 477, 478, 432, 432, 479, 479, 480, 480, 432, 432, 432, 481, 482, 481, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 483, 484, 485, 432, 432, 432, 486, 487, 486, 432, 488, 488, 489, 489, 439, 439, 439, 439, 439, 439, 439, 490, 432, 491, 492, 432, 493, 493, 494, 494, 432, 432, 495, 496, 495, 439, 439, 439, 439, 477, 497, 498, 432, 432, 499, 500, 499, 501, 501, 502, 502, 439, 439, 503, 432, 504, 505, 506, 506, 507, 507, 432, 432, 508, 509, 508, 439, 439, 510, 511, 512, 432, 432, 513, 514, 513, 515, 515, 516, 516, 439, 491, 432, 517, 518, 519, 519, 520, 520, 432, 432, 521, 522, 521, 439, 523, 524, 525, 526, 432, 432, 527, 528, 527, 529, 529, 530, 530, 439, 531, 432, 532, 432, 533, 534, 534, 535, 535, 432, 432, 536, 537, 536, 439, 538, 539, 432, 540, 541, 432, 432, 542, 542, 543, 543, 544, 439, 545, 432, 546, 547, 548, 548, 432, 432, 549, 439, 550, 432, 551, 552, 432, 432, 553, 554, 555, 556, 432, 557, 432, 558, 559, 560, 561, 562, 532, 432, 563, 564, 565, 566, 567, 568, 432, 569, 570, 432, 571, 572, 565, 432, 573, 574, 575, 432, 0, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432 } ; static yyconst flex_int16_t yy_nxt[1456] = { 0, 8, 9, 10, 11, 12, 13, 14, 8, 8, 8, 15, 16, 17, 18, 19, 19, 20, 19, 21, 22, 23, 24, 25, 24, 24, 26, 27, 28, 29, 24, 24, 30, 31, 32, 33, 24, 34, 24, 35, 19, 20, 19, 21, 22, 23, 24, 25, 24, 26, 27, 28, 29, 24, 24, 30, 31, 32, 33, 24, 34, 24, 35, 39, 40, 41, 40, 47, 432, 59, 48, 49, 49, 50, 49, 49, 50, 60, 55, 432, 432, 52, 432, 432, 52, 364, 62, 425, 55, 61, 39, 40, 64, 59, 63, 68, 72, 53, 65, 432, 432, 55, 60, 423, 432, 52, 418, 432, 52, 69, 62, 55, 61, 411, 67, 88, 64, 63, 68, 72, 53, 65, 73, 432, 56, 56, 50, 56, 56, 56, 56, 56, 56, 69, 57, 122, 432, 67, 88, 432, 432, 432, 41, 40, 70, 73, 74, 39, 40, 83, 83, 404, 56, 56, 56, 56, 56, 66, 57, 56, 56, 50, 56, 56, 56, 56, 56, 56, 70, 57, 74, 78, 432, 58, 432, 77, 77, 78, 87, 52, 66, 86, 432, 90, 403, 52, 432, 56, 56, 56, 56, 56, 71, 57, 432, 432, 58, 432, 400, 432, 392, 93, 87, 52, 89, 86, 91, 94, 90, 52, 387, 92, 432, 432, 432, 71, 85, 85, 78, 85, 85, 85, 85, 85, 85, 93, 57, 432, 89, 91, 94, 98, 95, 432, 92, 99, 108, 108, 432, 96, 97, 432, 100, 382, 85, 85, 85, 85, 85, 50, 57, 103, 103, 50, 98, 95, 101, 52, 99, 432, 102, 52, 96, 97, 364, 110, 100, 111, 111, 112, 432, 432, 432, 432, 112, 119, 115, 432, 117, 101, 360, 52, 432, 102, 121, 52, 114, 114, 50, 114, 114, 114, 114, 114, 114, 432, 118, 116, 432, 119, 115, 117, 432, 120, 124, 432, 125, 121, 432, 432, 432, 354, 129, 432, 114, 114, 114, 114, 114, 118, 116, 432, 123, 126, 130, 432, 128, 120, 124, 50, 335, 125, 127, 131, 131, 50, 129, 52, 136, 146, 137, 137, 138, 52, 432, 123, 126, 130, 138, 432, 128, 140, 140, 112, 110, 127, 141, 141, 112, 143, 143, 52, 146, 432, 432, 147, 432, 52, 145, 145, 432, 145, 145, 145, 145, 145, 145, 432, 432, 152, 432, 151, 148, 150, 432, 149, 432, 432, 326, 158, 432, 432, 153, 154, 155, 156, 145, 145, 145, 145, 145, 432, 157, 307, 151, 138, 148, 150, 149, 432, 159, 178, 158, 162, 160, 153, 154, 155, 432, 156, 432, 161, 131, 131, 432, 157, 132, 132, 167, 167, 170, 170, 52, 159, 178, 432, 297, 136, 160, 168, 168, 138, 172, 276, 140, 140, 161, 110, 432, 173, 173, 112, 112, 179, 260, 110, 52, 175, 175, 176, 432, 180, 432, 432, 176, 432, 432, 432, 181, 432, 183, 432, 185, 188, 432, 182, 179, 186, 432, 432, 229, 432, 184, 187, 189, 432, 432, 432, 202, 202, 192, 138, 181, 196, 183, 167, 167, 185, 182, 190, 207, 186, 206, 206, 191, 184, 187, 136, 189, 197, 197, 138, 432, 136, 192, 199, 199, 200, 171, 432, 432, 144, 190, 200, 176, 209, 110, 191, 203, 203, 112, 110, 432, 204, 204, 176, 432, 208, 432, 210, 432, 211, 432, 432, 432, 432, 213, 217, 209, 432, 215, 432, 432, 216, 224, 224, 214, 109, 212, 84, 219, 208, 228, 228, 210, 218, 211, 256, 256, 136, 213, 225, 225, 138, 432, 215, 432, 216, 200, 214, 176, 212, 82, 136, 219, 226, 226, 200, 218, 230, 432, 202, 202, 110, 234, 203, 203, 110, 432, 231, 231, 176, 110, 432, 233, 233, 234, 432, 432, 432, 238, 432, 432, 432, 432, 236, 240, 432, 237, 241, 432, 245, 242, 250, 244, 224, 224, 136, 243, 225, 225, 246, 432, 239, 238, 432, 200, 432, 236, 254, 240, 237, 263, 241, 429, 245, 242, 429, 244, 259, 259, 243, 272, 272, 246, 136, 239, 251, 251, 200, 136, 432, 253, 253, 254, 110, 263, 203, 203, 176, 110, 432, 257, 257, 234, 234, 432, 432, 432, 432, 262, 432, 261, 264, 136, 267, 225, 225, 200, 265, 136, 429, 273, 273, 254, 275, 275, 432, 422, 266, 432, 254, 256, 256, 262, 261, 432, 264, 432, 267, 234, 110, 265, 277, 277, 234, 110, 432, 279, 279, 280, 280, 266, 432, 432, 284, 285, 429, 282, 283, 432, 272, 272, 136, 432, 289, 289, 254, 254, 136, 432, 291, 291, 292, 292, 296, 296, 432, 432, 285, 422, 280, 282, 283, 110, 432, 203, 203, 234, 110, 432, 294, 294, 280, 299, 426, 136, 298, 225, 225, 254, 136, 422, 304, 304, 292, 306, 306, 432, 415, 313, 110, 292, 308, 308, 280, 422, 432, 299, 432, 298, 280, 110, 311, 310, 310, 311, 432, 325, 325, 415, 314, 136, 313, 318, 318, 292, 432, 334, 334, 136, 292, 320, 320, 321, 432, 353, 353, 110, 321, 203, 203, 280, 373, 110, 314, 323, 323, 311, 432, 327, 363, 363, 311, 136, 432, 225, 225, 292, 136, 432, 332, 332, 321, 321, 110, 432, 336, 336, 311, 311, 110, 432, 338, 338, 339, 339, 432, 136, 432, 346, 346, 321, 321, 136, 432, 348, 348, 349, 349, 432, 110, 341, 203, 203, 311, 110, 432, 351, 351, 339, 339, 136, 415, 225, 225, 321, 136, 355, 361, 361, 349, 432, 408, 432, 341, 349, 110, 339, 365, 365, 339, 110, 432, 367, 367, 368, 368, 432, 416, 432, 355, 370, 136, 349, 376, 376, 349, 136, 432, 378, 378, 110, 368, 203, 203, 339, 110, 432, 380, 380, 368, 432, 383, 415, 136, 370, 225, 225, 349, 136, 432, 388, 388, 110, 368, 390, 390, 368, 136, 393, 398, 398, 408, 359, 408, 110, 383, 203, 203, 368, 136, 397, 225, 225, 345, 408, 397, 405, 397, 375, 331, 432, 393, 36, 36, 36, 36, 36, 36, 36, 36, 38, 38, 38, 38, 38, 38, 38, 38, 42, 42, 42, 42, 42, 42, 42, 42, 44, 368, 44, 44, 44, 44, 44, 44, 45, 45, 45, 45, 45, 45, 45, 45, 51, 51, 51, 51, 55, 55, 55, 55, 55, 55, 76, 432, 76, 76, 76, 76, 76, 76, 79, 79, 79, 80, 80, 104, 104, 104, 105, 105, 106, 106, 113, 113, 113, 132, 132, 132, 133, 133, 134, 134, 135, 135, 139, 139, 139, 142, 142, 142, 164, 164, 165, 165, 169, 169, 169, 174, 174, 174, 177, 177, 177, 193, 193, 194, 194, 195, 195, 198, 198, 198, 201, 201, 201, 205, 205, 205, 220, 220, 221, 221, 222, 222, 227, 227, 227, 232, 232, 232, 235, 235, 235, 248, 248, 249, 249, 252, 252, 252, 255, 255, 255, 258, 258, 258, 268, 268, 269, 269, 270, 270, 274, 274, 274, 278, 278, 278, 281, 281, 281, 286, 286, 287, 287, 288, 288, 290, 290, 290, 293, 293, 293, 295, 295, 295, 301, 301, 302, 302, 305, 305, 305, 309, 309, 309, 312, 312, 312, 315, 315, 316, 316, 317, 317, 319, 319, 319, 322, 322, 322, 324, 324, 324, 328, 328, 329, 329, 330, 330, 333, 333, 333, 337, 337, 337, 340, 340, 340, 343, 343, 344, 344, 347, 347, 347, 350, 350, 350, 352, 352, 352, 356, 356, 357, 357, 358, 358, 362, 362, 362, 366, 366, 366, 369, 369, 369, 371, 371, 372, 372, 374, 374, 377, 377, 377, 379, 379, 381, 381, 381, 316, 316, 385, 385, 386, 386, 389, 389, 391, 391, 391, 394, 394, 395, 395, 396, 396, 399, 399, 401, 401, 402, 402, 343, 343, 406, 406, 407, 407, 409, 409, 410, 410, 412, 412, 413, 413, 414, 414, 417, 417, 419, 419, 420, 420, 421, 421, 424, 424, 427, 427, 428, 428, 430, 430, 431, 431, 397, 375, 359, 81, 432, 349, 375, 359, 384, 339, 432, 375, 373, 359, 331, 303, 321, 359, 331, 81, 311, 345, 331, 303, 342, 292, 331, 303, 271, 432, 280, 81, 303, 271, 81, 254, 303, 271, 300, 432, 432, 234, 81, 271, 223, 223, 432, 432, 432, 200, 271, 223, 81, 432, 432, 432, 432, 176, 81, 223, 166, 247, 432, 138, 223, 166, 166, 432, 432, 432, 112, 81, 166, 107, 81, 432, 432, 432, 166, 107, 163, 432, 81, 107, 107, 432, 107, 81, 432, 432, 432, 81, 45, 46, 43, 75, 432, 54, 46, 43, 432, 37, 37, 7, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432 } ; static yyconst flex_int16_t yy_chk[1456] = { 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 10, 10, 11, 11, 15, 23, 21, 15, 16, 16, 16, 17, 17, 17, 22, 21, 29, 25, 16, 33, 26, 17, 574, 25, 570, 22, 23, 39, 39, 26, 21, 25, 29, 33, 16, 26, 28, 17, 21, 22, 568, 30, 16, 564, 34, 17, 30, 25, 22, 23, 559, 28, 60, 26, 25, 29, 33, 16, 26, 34, 17, 19, 19, 19, 19, 19, 19, 19, 19, 19, 30, 19, 93, 27, 28, 60, 31, 93, 35, 40, 40, 31, 34, 35, 41, 41, 54, 54, 553, 19, 19, 19, 19, 19, 27, 19, 20, 20, 20, 20, 20, 20, 20, 20, 20, 31, 20, 35, 51, 58, 20, 32, 49, 49, 49, 59, 51, 27, 58, 62, 62, 552, 49, 63, 20, 20, 20, 20, 20, 32, 20, 65, 66, 20, 64, 549, 61, 544, 65, 59, 51, 61, 58, 63, 66, 62, 49, 541, 64, 68, 70, 71, 32, 56, 56, 56, 56, 56, 56, 56, 56, 56, 65, 56, 69, 61, 63, 66, 70, 68, 72, 64, 71, 81, 81, 73, 69, 69, 74, 72, 537, 56, 56, 56, 56, 56, 79, 56, 77, 77, 77, 70, 68, 73, 79, 71, 88, 74, 77, 69, 69, 528, 83, 72, 83, 83, 83, 84, 86, 90, 92, 84, 90, 86, 89, 88, 73, 526, 79, 87, 74, 92, 77, 85, 85, 85, 85, 85, 85, 85, 85, 85, 95, 89, 87, 91, 90, 86, 88, 94, 91, 95, 96, 96, 92, 97, 100, 98, 522, 100, 101, 85, 85, 85, 85, 85, 89, 87, 99, 94, 97, 101, 115, 99, 91, 95, 104, 514, 96, 98, 103, 103, 103, 100, 104, 108, 115, 108, 108, 108, 103, 109, 94, 97, 101, 109, 113, 99, 110, 110, 113, 111, 98, 111, 111, 111, 112, 112, 104, 115, 120, 125, 116, 118, 103, 114, 114, 116, 114, 114, 114, 114, 114, 114, 117, 119, 121, 122, 120, 117, 119, 121, 118, 123, 124, 509, 125, 126, 146, 122, 122, 122, 123, 114, 114, 114, 114, 114, 139, 124, 500, 120, 139, 117, 119, 118, 127, 126, 146, 125, 130, 127, 122, 122, 122, 130, 123, 129, 129, 131, 131, 131, 124, 132, 132, 136, 136, 138, 138, 131, 126, 146, 147, 496, 137, 127, 137, 137, 137, 140, 487, 140, 140, 129, 141, 142, 141, 141, 141, 142, 147, 482, 143, 131, 143, 143, 143, 144, 149, 151, 152, 144, 153, 149, 154, 151, 157, 153, 155, 155, 158, 156, 152, 147, 156, 158, 159, 474, 160, 154, 157, 159, 161, 162, 169, 172, 172, 162, 169, 151, 167, 153, 167, 167, 155, 152, 160, 469, 156, 176, 176, 161, 154, 157, 168, 159, 168, 168, 168, 180, 170, 162, 170, 170, 170, 460, 171, 177, 456, 160, 171, 177, 180, 173, 161, 173, 173, 173, 175, 179, 175, 175, 175, 183, 179, 181, 181, 182, 182, 184, 185, 188, 191, 184, 189, 180, 186, 186, 192, 189, 188, 196, 196, 185, 448, 183, 444, 192, 179, 200, 200, 181, 191, 182, 230, 230, 197, 184, 197, 197, 197, 201, 186, 205, 188, 201, 185, 205, 183, 443, 199, 192, 199, 199, 199, 191, 202, 207, 202, 202, 203, 207, 203, 203, 204, 208, 204, 204, 204, 206, 209, 206, 206, 206, 210, 211, 215, 210, 212, 217, 219, 213, 208, 212, 214, 209, 213, 216, 217, 214, 224, 216, 224, 224, 225, 215, 225, 225, 219, 227, 211, 210, 229, 227, 238, 208, 229, 212, 209, 238, 213, 431, 217, 214, 430, 216, 234, 234, 215, 250, 250, 219, 226, 211, 226, 226, 226, 228, 236, 228, 228, 228, 231, 238, 231, 231, 231, 233, 235, 233, 233, 233, 235, 237, 240, 239, 243, 237, 245, 236, 239, 251, 245, 251, 251, 251, 240, 253, 428, 253, 253, 253, 254, 254, 255, 427, 243, 426, 255, 256, 256, 237, 236, 258, 239, 264, 245, 258, 257, 240, 257, 257, 257, 259, 260, 259, 259, 259, 260, 243, 261, 262, 263, 264, 425, 261, 262, 263, 272, 272, 273, 274, 273, 273, 273, 274, 275, 276, 275, 275, 275, 276, 280, 280, 281, 282, 264, 424, 281, 261, 262, 277, 284, 277, 277, 277, 279, 298, 279, 279, 279, 284, 423, 289, 282, 289, 289, 289, 291, 421, 291, 291, 291, 292, 292, 293, 420, 298, 294, 293, 294, 294, 294, 418, 295, 284, 297, 282, 295, 296, 297, 296, 296, 296, 299, 311, 311, 417, 299, 304, 298, 304, 304, 304, 305, 321, 321, 306, 305, 306, 306, 306, 307, 339, 339, 308, 307, 308, 308, 308, 416, 310, 299, 310, 310, 310, 312, 314, 349, 349, 312, 318, 314, 318, 318, 318, 320, 322, 320, 320, 320, 322, 323, 324, 323, 323, 323, 324, 325, 326, 325, 325, 325, 326, 327, 332, 333, 332, 332, 332, 333, 334, 335, 334, 334, 334, 335, 341, 336, 327, 336, 336, 336, 338, 340, 338, 338, 338, 340, 346, 414, 346, 346, 346, 348, 341, 348, 348, 348, 350, 413, 352, 327, 350, 351, 352, 351, 351, 351, 353, 354, 353, 353, 353, 354, 355, 412, 362, 341, 355, 361, 362, 361, 361, 361, 363, 369, 363, 363, 365, 369, 365, 365, 365, 367, 370, 367, 367, 367, 383, 370, 411, 376, 355, 376, 376, 376, 378, 381, 378, 378, 380, 381, 380, 380, 380, 388, 383, 388, 388, 410, 409, 407, 390, 370, 390, 390, 390, 398, 406, 398, 398, 405, 403, 402, 401, 396, 395, 394, 393, 383, 433, 433, 433, 433, 433, 433, 433, 433, 434, 434, 434, 434, 434, 434, 434, 434, 435, 435, 435, 435, 435, 435, 435, 435, 436, 391, 436, 436, 436, 436, 436, 436, 437, 437, 437, 437, 437, 437, 437, 437, 438, 438, 438, 438, 439, 439, 439, 439, 439, 439, 440, 389, 440, 440, 440, 440, 440, 440, 441, 441, 441, 442, 442, 445, 445, 445, 446, 446, 447, 447, 449, 449, 449, 450, 450, 450, 451, 451, 452, 452, 453, 453, 454, 454, 454, 455, 455, 455, 457, 457, 458, 458, 459, 459, 459, 461, 461, 461, 462, 462, 462, 463, 463, 464, 464, 465, 465, 466, 466, 466, 467, 467, 467, 468, 468, 468, 470, 470, 471, 471, 472, 472, 473, 473, 473, 475, 475, 475, 476, 476, 476, 477, 477, 478, 478, 479, 479, 479, 480, 480, 480, 481, 481, 481, 483, 483, 484, 484, 485, 485, 486, 486, 486, 488, 488, 488, 489, 489, 489, 490, 490, 491, 491, 492, 492, 493, 493, 493, 494, 494, 494, 495, 495, 495, 497, 497, 498, 498, 499, 499, 499, 501, 501, 501, 502, 502, 502, 503, 503, 504, 504, 505, 505, 506, 506, 506, 507, 507, 507, 508, 508, 508, 510, 510, 511, 511, 512, 512, 513, 513, 513, 515, 515, 515, 516, 516, 516, 517, 517, 518, 518, 519, 519, 519, 520, 520, 520, 521, 521, 521, 523, 523, 524, 524, 525, 525, 527, 527, 527, 529, 529, 529, 530, 530, 530, 531, 531, 532, 532, 533, 533, 534, 534, 534, 535, 535, 536, 536, 536, 538, 538, 539, 539, 540, 540, 542, 542, 543, 543, 543, 545, 545, 546, 546, 547, 547, 548, 548, 550, 550, 551, 551, 554, 554, 555, 555, 556, 556, 557, 557, 558, 558, 560, 560, 561, 561, 562, 562, 563, 563, 565, 565, 566, 566, 567, 567, 569, 569, 571, 571, 572, 572, 573, 573, 575, 575, 387, 386, 385, 384, 379, 377, 374, 372, 371, 366, 364, 360, 359, 358, 357, 356, 347, 344, 343, 342, 337, 331, 330, 329, 328, 319, 317, 316, 315, 313, 309, 303, 302, 301, 300, 290, 288, 287, 286, 285, 283, 278, 271, 270, 269, 268, 267, 266, 265, 252, 249, 248, 247, 246, 244, 242, 241, 232, 223, 222, 221, 220, 218, 198, 195, 194, 193, 190, 187, 178, 174, 166, 165, 164, 163, 150, 148, 145, 135, 134, 133, 128, 107, 106, 105, 102, 80, 78, 67, 57, 55, 50, 46, 45, 42, 37, 24, 18, 14, 12, 7, 4, 3, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432 } ; /* Table of booleans, true if rule could match eol. */ static yyconst flex_int32_t yy_rule_can_match_eol[44] = { 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, }; /* The intent behind this definition is that it'll catch * any uses of REJECT which flex missed. */ #define REJECT reject_used_but_not_detected #define yymore() yymore_used_but_not_detected #define YY_MORE_ADJ 0 #define YY_RESTORE_YY_MORE_OFFSET #line 1 "RelLexer.l" #line 5 "RelLexer.l" #ifdef WIN32 #define strncasecmp _strnicmp #endif using namespace std; #include "RelParser.h" #include "Portable.h" #define YYABORT yyterminate(); /* duplicate default definition from flex. This makes cppcheck check for defined YY_FATAL_ERROR() go away. */ #define YY_FATAL_ERROR(msg) LexerError(msg) #line 36 "RelLexer.l" using namespace std; unsigned ComBeg; // line, in which comment begins unsigned LftCnt; // how many chars : on the left side of '::' char was interpreted unsigned RgtCnt; // the same as above, but on the right side of '::' char Address[16]; // address, which is analizing right now char AddrPart[16]; unsigned intpos,pos; namespace std{ yy_RelParser_stype yylval; } #line 967 "RelLexer.cpp" #define INITIAL 0 #define COMMENT 1 #define ADDR 2 #ifndef YY_NO_UNISTD_H /* Special case for "unistd.h", since it is non-ANSI. We include it way * down here because we want the user's section 1 to have been scanned first. * The user has a chance to override it with an option. */ #include #endif #ifndef YY_EXTRA_TYPE #define YY_EXTRA_TYPE void * #endif #ifndef yytext_ptr static void yy_flex_strncpy (char *,yyconst char *,int ); #endif #ifdef YY_NEED_STRLEN static int yy_flex_strlen (yyconst char * ); #endif #ifndef YY_NO_INPUT #endif /* Amount of stuff to slurp up with each read. */ #ifndef YY_READ_BUF_SIZE #ifdef __ia64__ /* On IA-64, the buffer size is 16k, not 8k */ #define YY_READ_BUF_SIZE 16384 #else #define YY_READ_BUF_SIZE 8192 #endif /* __ia64__ */ #endif /* Copy whatever the last rule matched to the standard output. */ #ifndef ECHO #define ECHO LexerOutput( yytext, yyleng ) #endif /* Gets input and stuffs it into "buf". number of characters read, or YY_NULL, * is returned in "result". */ #ifndef YY_INPUT #define YY_INPUT(buf,result,max_size) \ \ if ( (result = LexerInput( (char *) buf, max_size )) < 0 ) \ YY_FATAL_ERROR( "input in flex scanner failed" ); #endif /* No semi-colon after return; correct usage is to write "yyterminate();" - * we don't want an extra ';' after the "return" because that will cause * some compilers to complain about unreachable statements. */ #ifndef yyterminate #define yyterminate() return YY_NULL #endif /* Number of entries by which start-condition stack grows. */ #ifndef YY_START_STACK_INCR #define YY_START_STACK_INCR 25 #endif /* Report a fatal error. */ #ifndef YY_FATAL_ERROR #define YY_FATAL_ERROR(msg) LexerError( msg ) #endif /* end tables serialization structures and prototypes */ /* Default declaration of generated scanner - a define so the user can * easily add parameters. */ #ifndef YY_DECL #define YY_DECL_IS_OURS 1 #define YY_DECL int yyFlexLexer::yylex() #endif /* !YY_DECL */ /* Code executed at the beginning of each rule, after yytext and yyleng * have been set up. */ #ifndef YY_USER_ACTION #define YY_USER_ACTION #endif /* Code executed at the end of each rule. */ #ifndef YY_BREAK #define YY_BREAK break; #endif #define YY_RULE_SETUP \ YY_USER_ACTION /** The main scanner function which does all the work. */ YY_DECL { register yy_state_type yy_current_state; register char *yy_cp, *yy_bp; register int yy_act; if ( !(yy_init) ) { (yy_init) = 1; #ifdef YY_USER_INIT YY_USER_INIT; #endif if ( ! (yy_start) ) (yy_start) = 1; /* first start state */ if ( ! yyin ) yyin = & std::cin; if ( ! yyout ) yyout = & std::cout; if ( ! YY_CURRENT_BUFFER ) { yyensure_buffer_stack (); YY_CURRENT_BUFFER_LVALUE = yy_create_buffer( yyin, YY_BUF_SIZE ); } yy_load_buffer_state( ); } { #line 49 "RelLexer.l" #line 1104 "RelLexer.cpp" while ( 1 ) /* loops until end-of-file is reached */ { yy_cp = (yy_c_buf_p); /* Support of yytext. */ *yy_cp = (yy_hold_char); /* yy_bp points to the position in yy_ch_buf of the start of * the current run. */ yy_bp = yy_cp; yy_current_state = (yy_start); yy_match: do { register YY_CHAR yy_c = yy_ec[YY_SC_TO_UI(*yy_cp)] ; if ( yy_accept[yy_current_state] ) { (yy_last_accepting_state) = yy_current_state; (yy_last_accepting_cpos) = yy_cp; } while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) { yy_current_state = (int) yy_def[yy_current_state]; if ( yy_current_state >= 433 ) yy_c = yy_meta[(unsigned int) yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; ++yy_cp; } while ( yy_base[yy_current_state] != 1393 ); yy_find_action: yy_act = yy_accept[yy_current_state]; if ( yy_act == 0 ) { /* have to back up */ yy_cp = (yy_last_accepting_cpos); yy_current_state = (yy_last_accepting_state); yy_act = yy_accept[yy_current_state]; } YY_DO_BEFORE_ACTION; if ( yy_act != YY_END_OF_BUFFER && yy_rule_can_match_eol[yy_act] ) { yy_size_t yyl; for ( yyl = 0; yyl < yyleng; ++yyl ) if ( yytext[yyl] == '\n' ) yylineno++; ; } do_action: /* This label is used only to access EOF actions. */ switch ( yy_act ) { /* beginning of action switch */ case 0: /* must back up */ /* undo the effects of YY_DO_BEFORE_ACTION */ *yy_cp = (yy_hold_char); yy_cp = (yy_last_accepting_cpos); yy_current_state = (yy_last_accepting_state); goto yy_find_action; case 1: /* rule 1 can match eol */ YY_RULE_SETUP #line 51 "RelLexer.l" ; // ignore end of line YY_BREAK case 2: YY_RULE_SETUP #line 52 "RelLexer.l" ; // ignore TABs and spaces YY_BREAK case 3: YY_RULE_SETUP #line 54 "RelLexer.l" { return RelParser::IFACE_;} YY_BREAK case 4: YY_RULE_SETUP #line 55 "RelLexer.l" { return RelParser::CLIENT_;} YY_BREAK case 5: YY_RULE_SETUP #line 56 "RelLexer.l" { return RelParser::SERVER_; } YY_BREAK case 6: YY_RULE_SETUP #line 57 "RelLexer.l" { return RelParser::UNICAST_; } YY_BREAK case 7: YY_RULE_SETUP #line 58 "RelLexer.l" { return RelParser::MULTICAST_; } YY_BREAK case 8: YY_RULE_SETUP #line 59 "RelLexer.l" { return RelParser::IFACE_ID_; } YY_BREAK case 9: YY_RULE_SETUP #line 60 "RelLexer.l" { return RelParser::IFACE_ID_ORDER_; } YY_BREAK case 10: YY_RULE_SETUP #line 61 "RelLexer.l" { return RelParser::GUESS_MODE_; } YY_BREAK case 11: YY_RULE_SETUP #line 62 "RelLexer.l" { return RelParser::OPTION_; } YY_BREAK case 12: YY_RULE_SETUP #line 63 "RelLexer.l" { return RelParser::REMOTE_ID_; } YY_BREAK case 13: YY_RULE_SETUP #line 64 "RelLexer.l" { return RelParser::RELAY_ID_; } YY_BREAK case 14: YY_RULE_SETUP #line 65 "RelLexer.l" { return RelParser::LINK_LAYER_; } YY_BREAK case 15: YY_RULE_SETUP #line 66 "RelLexer.l" { return RelParser::ECHO_REQUEST_; } YY_BREAK case 16: YY_RULE_SETUP #line 68 "RelLexer.l" { return RelParser::LOGNAME_;} YY_BREAK case 17: YY_RULE_SETUP #line 69 "RelLexer.l" { return RelParser::LOGLEVEL_;} YY_BREAK case 18: YY_RULE_SETUP #line 70 "RelLexer.l" { return RelParser::LOGMODE_; } YY_BREAK case 19: YY_RULE_SETUP #line 72 "RelLexer.l" { return RelParser::WORKDIR_;} YY_BREAK case 20: YY_RULE_SETUP #line 74 "RelLexer.l" { yylval.ival=1; return RelParser::INTNUMBER_;} YY_BREAK case 21: YY_RULE_SETUP #line 75 "RelLexer.l" { yylval.ival=0; return RelParser::INTNUMBER_;} YY_BREAK case 22: YY_RULE_SETUP #line 76 "RelLexer.l" { yylval.ival=1; return RelParser::INTNUMBER_;} YY_BREAK case 23: YY_RULE_SETUP #line 77 "RelLexer.l" { yylval.ival=0; return RelParser::INTNUMBER_;} YY_BREAK case 24: YY_RULE_SETUP #line 79 "RelLexer.l" ; YY_BREAK case 25: YY_RULE_SETUP #line 81 "RelLexer.l" ; YY_BREAK case 26: YY_RULE_SETUP #line 83 "RelLexer.l" { BEGIN(COMMENT); ComBeg=yylineno; } YY_BREAK case 27: YY_RULE_SETUP #line 88 "RelLexer.l" BEGIN(INITIAL); YY_BREAK case 28: /* rule 28 can match eol */ YY_RULE_SETUP #line 89 "RelLexer.l" ; YY_BREAK case YY_STATE_EOF(COMMENT): #line 90 "RelLexer.l" { Log(Crit) << "Comment not closed. (/* in line " << ComBeg << LogEnd; { YYABORT; } } YY_BREAK //IPv6 address - various forms case 29: YY_RULE_SETUP #line 97 "RelLexer.l" { if(!inet_pton6(yytext,yylval.addrval)) { Log(Crit) << "Invalid address format: [" << yytext << "]" << LogEnd; YYABORT; } else { return RelParser::IPV6ADDR_; } } YY_BREAK case 30: YY_RULE_SETUP #line 106 "RelLexer.l" { if(!inet_pton6(yytext,yylval.addrval)) { Log(Crit) << "Invalid address format: [" << yytext << "]" << LogEnd; YYABORT; } else { return RelParser::IPV6ADDR_; } } YY_BREAK case 31: YY_RULE_SETUP #line 115 "RelLexer.l" { if(!inet_pton6(yytext,yylval.addrval)) { Log(Crit) << "Invalid address format: [" << yytext << "]" << LogEnd; YYABORT; } else { return RelParser::IPV6ADDR_; } } YY_BREAK case 32: YY_RULE_SETUP #line 124 "RelLexer.l" { if(!inet_pton6(yytext,yylval.addrval)) { Log(Crit) << "Invalid address format: [" << yytext << "]" << LogEnd; YYABORT; } else { return RelParser::IPV6ADDR_; } } YY_BREAK case 33: YY_RULE_SETUP #line 133 "RelLexer.l" { if(!inet_pton6(yytext,yylval.addrval)) { Log(Crit) << "Invalid address format: [" << yytext << "]" << LogEnd; YYABORT; } else { return RelParser::IPV6ADDR_; } } YY_BREAK case 34: YY_RULE_SETUP #line 142 "RelLexer.l" { if(!inet_pton6(yytext,yylval.addrval)) { Log(Crit) << "Invalid address format: [" << yytext << "]" << LogEnd; YYABORT; } else { return RelParser::IPV6ADDR_; } } YY_BREAK case 35: YY_RULE_SETUP #line 151 "RelLexer.l" { if(!inet_pton6(yytext,yylval.addrval)) { Log(Crit) << "Invalid address format: [" << yytext << "]" << LogEnd; YYABORT; } else { return RelParser::IPV6ADDR_; } } YY_BREAK case 36: /* rule 36 can match eol */ YY_RULE_SETUP #line 160 "RelLexer.l" { yylval.strval=new char[strlen(yytext)-1]; strncpy(yylval.strval, yytext+1, strlen(yytext)-2); yylval.strval[strlen(yytext)-2]=0; return RelParser::STRING_; } YY_BREAK case 37: YY_RULE_SETUP #line 167 "RelLexer.l" { int len = strlen(yytext); if ( ( (len>2) && !strncasecmp("yes",yytext,3) ) || ( (len>3) && !strncasecmp("true", yytext,4) ) ) { yylval.ival = 1; return RelParser::INTNUMBER_; } if ( ( (len>1) && !strncasecmp("no",yytext,2) ) || ( (len>4) && !strncasecmp("false",yytext,5) ) ) { yylval.ival = 0; return RelParser::INTNUMBER_; } yylval.strval=new char[strlen(yytext)+1]; strncpy(yylval.strval, yytext, strlen(yytext)); yylval.strval[strlen(yytext)]=0; return RelParser::STRING_; } YY_BREAK case 38: YY_RULE_SETUP #line 188 "RelLexer.l" { // HEX NUMBER yytext[strlen(yytext)-1]='\n'; if(!sscanf(yytext,"%9x",&(yylval.ival))) { Log(Crit) << "Hex value [" << yytext << " parsing failed." << LogEnd; YYABORT; } return RelParser::HEXNUMBER_; } YY_BREAK case 39: YY_RULE_SETUP #line 198 "RelLexer.l" { if(!sscanf(yytext,"%9u",&(yylval.ival))) { Log(Crit) << "Decimal value [" << yytext << " parsing failed." << LogEnd; YYABORT; } return RelParser::INTNUMBER_; } YY_BREAK case 40: YY_RULE_SETUP #line 206 "RelLexer.l" { // DUID in 0x010203 format int len; char * ptr; if (strlen(yytext)%2) { yytext[1]='0'; //if odd then no-meaning zero at the beginning len = strlen(yytext)-1; ptr = yytext+1; } else { len = strlen(yytext)-2; ptr = yytext+2; } //and now there is an even number of hex digits yylval.duidval.length = len >> 1; yylval.duidval.duid = new char[len >> 1]; for (int i=0 ; i>1]<<=4; if (!isxdigit(ptr[i])) { Log(Crit) << "DUID parsing failed (" << yytext << ")." << LogEnd; YYABORT; } if (isalpha(ptr[i])) { yylval.duidval.duid[i>>1]|=toupper(ptr[i])-'A'+10; } else { yylval.duidval.duid[i>>1]|=ptr[i]-'0'; } } return RelParser::DUID_; } YY_BREAK case 41: YY_RULE_SETUP #line 238 "RelLexer.l" { // DUID in 00:01:02:03 format int len = (strlen(yytext)+1)/3; char * pos = 0; yylval.duidval.length = len; yylval.duidval.duid = new char[len]; int i=0; for (pos = yytext; pos<=yytext+strlen(yytext)-2; pos+=3) { char x; if (isalpha(*pos)) x = (toupper(*pos)-'A' + 10); else x = *pos-'0'; x *= 16; if (isalpha(*(pos+1))) x += (toupper(*(pos+1))-'A' + 10); else x += *(pos+1) - '0'; yylval.duidval.duid[i] = x; i++; } return RelParser::DUID_; } YY_BREAK case 42: YY_RULE_SETUP #line 266 "RelLexer.l" { return yytext[0]; } YY_BREAK case 43: YY_RULE_SETUP #line 269 "RelLexer.l" ECHO; YY_BREAK #line 1544 "RelLexer.cpp" case YY_STATE_EOF(INITIAL): case YY_STATE_EOF(ADDR): yyterminate(); case YY_END_OF_BUFFER: { /* Amount of text matched not including the EOB char. */ int yy_amount_of_matched_text = (int) (yy_cp - (yytext_ptr)) - 1; /* Undo the effects of YY_DO_BEFORE_ACTION. */ *yy_cp = (yy_hold_char); YY_RESTORE_YY_MORE_OFFSET if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_NEW ) { /* We're scanning a new file or input source. It's * possible that this happened because the user * just pointed yyin at a new source and called * yylex(). If so, then we have to assure * consistency between YY_CURRENT_BUFFER and our * globals. Here is the right place to do so, because * this is the first action (other than possibly a * back-up) that will match for the new input source. */ (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_n_chars; YY_CURRENT_BUFFER_LVALUE->yy_input_file = yyin; YY_CURRENT_BUFFER_LVALUE->yy_buffer_status = YY_BUFFER_NORMAL; } /* Note that here we test for yy_c_buf_p "<=" to the position * of the first EOB in the buffer, since yy_c_buf_p will * already have been incremented past the NUL character * (since all states make transitions on EOB to the * end-of-buffer state). Contrast this with the test * in input(). */ if ( (yy_c_buf_p) <= &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] ) { /* This was really a NUL. */ yy_state_type yy_next_state; (yy_c_buf_p) = (yytext_ptr) + yy_amount_of_matched_text; yy_current_state = yy_get_previous_state( ); /* Okay, we're now positioned to make the NUL * transition. We couldn't have * yy_get_previous_state() go ahead and do it * for us because it doesn't know how to deal * with the possibility of jamming (and we don't * want to build jamming into it because then it * will run more slowly). */ yy_next_state = yy_try_NUL_trans( yy_current_state ); yy_bp = (yytext_ptr) + YY_MORE_ADJ; if ( yy_next_state ) { /* Consume the NUL. */ yy_cp = ++(yy_c_buf_p); yy_current_state = yy_next_state; goto yy_match; } else { yy_cp = (yy_c_buf_p); goto yy_find_action; } } else switch ( yy_get_next_buffer( ) ) { case EOB_ACT_END_OF_FILE: { (yy_did_buffer_switch_on_eof) = 0; if ( yywrap( ) ) { /* Note: because we've taken care in * yy_get_next_buffer() to have set up * yytext, we can now set up * yy_c_buf_p so that if some total * hoser (like flex itself) wants to * call the scanner after we return the * YY_NULL, it'll still work - another * YY_NULL will get returned. */ (yy_c_buf_p) = (yytext_ptr) + YY_MORE_ADJ; yy_act = YY_STATE_EOF(YY_START); goto do_action; } else { if ( ! (yy_did_buffer_switch_on_eof) ) YY_NEW_FILE; } break; } case EOB_ACT_CONTINUE_SCAN: (yy_c_buf_p) = (yytext_ptr) + yy_amount_of_matched_text; yy_current_state = yy_get_previous_state( ); yy_cp = (yy_c_buf_p); yy_bp = (yytext_ptr) + YY_MORE_ADJ; goto yy_match; case EOB_ACT_LAST_MATCH: (yy_c_buf_p) = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)]; yy_current_state = yy_get_previous_state( ); yy_cp = (yy_c_buf_p); yy_bp = (yytext_ptr) + YY_MORE_ADJ; goto yy_find_action; } break; } default: YY_FATAL_ERROR( "fatal flex scanner internal error--no action found" ); } /* end of action switch */ } /* end of scanning one token */ } /* end of user's declarations */ } /* end of yylex */ /* The contents of this function are C++ specific, so the () macro is not used. */ yyFlexLexer::yyFlexLexer( std::istream* arg_yyin, std::ostream* arg_yyout ) { yyin = arg_yyin; yyout = arg_yyout; yy_c_buf_p = 0; yy_init = 0; yy_start = 0; yy_flex_debug = 0; yylineno = 1; // this will only get updated if %option yylineno yy_did_buffer_switch_on_eof = 0; yy_looking_for_trail_begin = 0; yy_more_flag = 0; yy_more_len = 0; yy_more_offset = yy_prev_more_offset = 0; yy_start_stack_ptr = yy_start_stack_depth = 0; yy_start_stack = NULL; yy_buffer_stack = 0; yy_buffer_stack_top = 0; yy_buffer_stack_max = 0; yy_state_buf = 0; } /* The contents of this function are C++ specific, so the () macro is not used. */ yyFlexLexer::~yyFlexLexer() { delete [] yy_state_buf; yyfree(yy_start_stack ); yy_delete_buffer( YY_CURRENT_BUFFER ); yyfree(yy_buffer_stack ); } /* The contents of this function are C++ specific, so the () macro is not used. */ void yyFlexLexer::switch_streams( std::istream* new_in, std::ostream* new_out ) { if ( new_in ) { yy_delete_buffer( YY_CURRENT_BUFFER ); yy_switch_to_buffer( yy_create_buffer( new_in, YY_BUF_SIZE ) ); } if ( new_out ) yyout = new_out; } #ifdef YY_INTERACTIVE int yyFlexLexer::LexerInput( char* buf, int /* max_size */ ) #else int yyFlexLexer::LexerInput( char* buf, int max_size ) #endif { if ( yyin->eof() || yyin->fail() ) return 0; #ifdef YY_INTERACTIVE yyin->get( buf[0] ); if ( yyin->eof() ) return 0; if ( yyin->bad() ) return -1; return 1; #else (void) yyin->read( buf, max_size ); if ( yyin->bad() ) return -1; else return yyin->gcount(); #endif } void yyFlexLexer::LexerOutput( const char* buf, int size ) { (void) yyout->write( buf, size ); } /* yy_get_next_buffer - try to read in a new buffer * * Returns a code representing an action: * EOB_ACT_LAST_MATCH - * EOB_ACT_CONTINUE_SCAN - continue scanning from current position * EOB_ACT_END_OF_FILE - end of file */ int yyFlexLexer::yy_get_next_buffer() { register char *dest = YY_CURRENT_BUFFER_LVALUE->yy_ch_buf; register char *source = (yytext_ptr); register int number_to_move, i; int ret_val; if ( (yy_c_buf_p) > &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars) + 1] ) YY_FATAL_ERROR( "fatal flex scanner internal error--end of buffer missed" ); if ( YY_CURRENT_BUFFER_LVALUE->yy_fill_buffer == 0 ) { /* Don't try to fill the buffer, so this is an EOF. */ if ( (yy_c_buf_p) - (yytext_ptr) - YY_MORE_ADJ == 1 ) { /* We matched a single character, the EOB, so * treat this as a final EOF. */ return EOB_ACT_END_OF_FILE; } else { /* We matched some text prior to the EOB, first * process it. */ return EOB_ACT_LAST_MATCH; } } /* Try to read more data. */ /* First move last chars to start of buffer. */ number_to_move = (int) ((yy_c_buf_p) - (yytext_ptr)) - 1; for ( i = 0; i < number_to_move; ++i ) *(dest++) = *(source++); if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_EOF_PENDING ) /* don't do the read, it's not guaranteed to return an EOF, * just force an EOF */ YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars) = 0; else { yy_size_t num_to_read = YY_CURRENT_BUFFER_LVALUE->yy_buf_size - number_to_move - 1; while ( num_to_read <= 0 ) { /* Not enough room in the buffer - grow it. */ /* just a shorter name for the current buffer */ YY_BUFFER_STATE b = YY_CURRENT_BUFFER_LVALUE; int yy_c_buf_p_offset = (int) ((yy_c_buf_p) - b->yy_ch_buf); if ( b->yy_is_our_buffer ) { yy_size_t new_size = b->yy_buf_size * 2; if ( new_size <= 0 ) b->yy_buf_size += b->yy_buf_size / 8; else b->yy_buf_size *= 2; b->yy_ch_buf = (char *) /* Include room in for 2 EOB chars. */ yyrealloc((void *) b->yy_ch_buf,b->yy_buf_size + 2 ); } else /* Can't grow it, we don't own it. */ b->yy_ch_buf = 0; if ( ! b->yy_ch_buf ) YY_FATAL_ERROR( "fatal error - scanner input buffer overflow" ); (yy_c_buf_p) = &b->yy_ch_buf[yy_c_buf_p_offset]; num_to_read = YY_CURRENT_BUFFER_LVALUE->yy_buf_size - number_to_move - 1; } if ( num_to_read > YY_READ_BUF_SIZE ) num_to_read = YY_READ_BUF_SIZE; /* Read in more data. */ YY_INPUT( (&YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move]), (yy_n_chars), num_to_read ); YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars); } if ( (yy_n_chars) == 0 ) { if ( number_to_move == YY_MORE_ADJ ) { ret_val = EOB_ACT_END_OF_FILE; yyrestart( yyin ); } else { ret_val = EOB_ACT_LAST_MATCH; YY_CURRENT_BUFFER_LVALUE->yy_buffer_status = YY_BUFFER_EOF_PENDING; } } else ret_val = EOB_ACT_CONTINUE_SCAN; if ((yy_size_t) ((yy_n_chars) + number_to_move) > YY_CURRENT_BUFFER_LVALUE->yy_buf_size) { /* Extend the array by 50%, plus the number we really need. */ yy_size_t new_size = (yy_n_chars) + number_to_move + ((yy_n_chars) >> 1); YY_CURRENT_BUFFER_LVALUE->yy_ch_buf = (char *) yyrealloc((void *) YY_CURRENT_BUFFER_LVALUE->yy_ch_buf,new_size ); if ( ! YY_CURRENT_BUFFER_LVALUE->yy_ch_buf ) YY_FATAL_ERROR( "out of dynamic memory in yy_get_next_buffer()" ); } (yy_n_chars) += number_to_move; YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] = YY_END_OF_BUFFER_CHAR; YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars) + 1] = YY_END_OF_BUFFER_CHAR; (yytext_ptr) = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[0]; return ret_val; } /* yy_get_previous_state - get the state just before the EOB char was reached */ yy_state_type yyFlexLexer::yy_get_previous_state() { register yy_state_type yy_current_state; register char *yy_cp; yy_current_state = (yy_start); for ( yy_cp = (yytext_ptr) + YY_MORE_ADJ; yy_cp < (yy_c_buf_p); ++yy_cp ) { register YY_CHAR yy_c = (*yy_cp ? yy_ec[YY_SC_TO_UI(*yy_cp)] : 1); if ( yy_accept[yy_current_state] ) { (yy_last_accepting_state) = yy_current_state; (yy_last_accepting_cpos) = yy_cp; } while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) { yy_current_state = (int) yy_def[yy_current_state]; if ( yy_current_state >= 433 ) yy_c = yy_meta[(unsigned int) yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; } return yy_current_state; } /* yy_try_NUL_trans - try to make a transition on the NUL character * * synopsis * next_state = yy_try_NUL_trans( current_state ); */ yy_state_type yyFlexLexer::yy_try_NUL_trans( yy_state_type yy_current_state ) { register int yy_is_jam; register char *yy_cp = (yy_c_buf_p); register YY_CHAR yy_c = 1; if ( yy_accept[yy_current_state] ) { (yy_last_accepting_state) = yy_current_state; (yy_last_accepting_cpos) = yy_cp; } while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) { yy_current_state = (int) yy_def[yy_current_state]; if ( yy_current_state >= 433 ) yy_c = yy_meta[(unsigned int) yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; yy_is_jam = (yy_current_state == 432); return yy_is_jam ? 0 : yy_current_state; } void yyFlexLexer::yyunput( int c, register char* yy_bp) { register char *yy_cp; yy_cp = (yy_c_buf_p); /* undo effects of setting up yytext */ *yy_cp = (yy_hold_char); if ( yy_cp < YY_CURRENT_BUFFER_LVALUE->yy_ch_buf + 2 ) { /* need to shift things up to make room */ /* +2 for EOB chars. */ register yy_size_t number_to_move = (yy_n_chars) + 2; register char *dest = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[ YY_CURRENT_BUFFER_LVALUE->yy_buf_size + 2]; register char *source = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move]; while ( source > YY_CURRENT_BUFFER_LVALUE->yy_ch_buf ) *--dest = *--source; yy_cp += (int) (dest - source); yy_bp += (int) (dest - source); YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_buf_size; if ( yy_cp < YY_CURRENT_BUFFER_LVALUE->yy_ch_buf + 2 ) YY_FATAL_ERROR( "flex scanner push-back overflow" ); } *--yy_cp = (char) c; if ( c == '\n' ){ --yylineno; } (yytext_ptr) = yy_bp; (yy_hold_char) = *yy_cp; (yy_c_buf_p) = yy_cp; } int yyFlexLexer::yyinput() { int c; *(yy_c_buf_p) = (yy_hold_char); if ( *(yy_c_buf_p) == YY_END_OF_BUFFER_CHAR ) { /* yy_c_buf_p now points to the character we want to return. * If this occurs *before* the EOB characters, then it's a * valid NUL; if not, then we've hit the end of the buffer. */ if ( (yy_c_buf_p) < &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] ) /* This was really a NUL. */ *(yy_c_buf_p) = '\0'; else { /* need more input */ yy_size_t offset = (yy_c_buf_p) - (yytext_ptr); ++(yy_c_buf_p); switch ( yy_get_next_buffer( ) ) { case EOB_ACT_LAST_MATCH: /* This happens because yy_g_n_b() * sees that we've accumulated a * token and flags that we need to * try matching the token before * proceeding. But for input(), * there's no matching to consider. * So convert the EOB_ACT_LAST_MATCH * to EOB_ACT_END_OF_FILE. */ /* Reset buffer status. */ yyrestart( yyin ); /*FALLTHROUGH*/ case EOB_ACT_END_OF_FILE: { if ( yywrap( ) ) return EOF; if ( ! (yy_did_buffer_switch_on_eof) ) YY_NEW_FILE; #ifdef __cplusplus return yyinput(); #else return input(); #endif } case EOB_ACT_CONTINUE_SCAN: (yy_c_buf_p) = (yytext_ptr) + offset; break; } } } c = *(unsigned char *) (yy_c_buf_p); /* cast for 8-bit char's */ *(yy_c_buf_p) = '\0'; /* preserve yytext */ (yy_hold_char) = *++(yy_c_buf_p); if ( c == '\n' ) yylineno++; ; return c; } /** Immediately switch to a different input stream. * @param input_file A readable stream. * * @note This function does not reset the start condition to @c INITIAL . */ void yyFlexLexer::yyrestart( std::istream* input_file ) { if ( ! YY_CURRENT_BUFFER ){ yyensure_buffer_stack (); YY_CURRENT_BUFFER_LVALUE = yy_create_buffer( yyin, YY_BUF_SIZE ); } yy_init_buffer( YY_CURRENT_BUFFER, input_file ); yy_load_buffer_state( ); } /** Switch to a different input buffer. * @param new_buffer The new input buffer. * */ void yyFlexLexer::yy_switch_to_buffer( YY_BUFFER_STATE new_buffer ) { /* TODO. We should be able to replace this entire function body * with * yypop_buffer_state(); * yypush_buffer_state(new_buffer); */ yyensure_buffer_stack (); if ( YY_CURRENT_BUFFER == new_buffer ) return; if ( YY_CURRENT_BUFFER ) { /* Flush out information for old buffer. */ *(yy_c_buf_p) = (yy_hold_char); YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = (yy_c_buf_p); YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars); } YY_CURRENT_BUFFER_LVALUE = new_buffer; yy_load_buffer_state( ); /* We don't actually know whether we did this switch during * EOF (yywrap()) processing, but the only time this flag * is looked at is after yywrap() is called, so it's safe * to go ahead and always set it. */ (yy_did_buffer_switch_on_eof) = 1; } void yyFlexLexer::yy_load_buffer_state() { (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_n_chars; (yytext_ptr) = (yy_c_buf_p) = YY_CURRENT_BUFFER_LVALUE->yy_buf_pos; yyin = YY_CURRENT_BUFFER_LVALUE->yy_input_file; (yy_hold_char) = *(yy_c_buf_p); } /** Allocate and initialize an input buffer state. * @param file A readable stream. * @param size The character buffer size in bytes. When in doubt, use @c YY_BUF_SIZE. * * @return the allocated buffer state. */ YY_BUFFER_STATE yyFlexLexer::yy_create_buffer( std::istream* file, int size ) { YY_BUFFER_STATE b; b = (YY_BUFFER_STATE) yyalloc(sizeof( struct yy_buffer_state ) ); if ( ! b ) YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" ); b->yy_buf_size = size; /* yy_ch_buf has to be 2 characters longer than the size given because * we need to put in 2 end-of-buffer characters. */ b->yy_ch_buf = (char *) yyalloc(b->yy_buf_size + 2 ); if ( ! b->yy_ch_buf ) YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" ); b->yy_is_our_buffer = 1; yy_init_buffer( b, file ); return b; } /** Destroy the buffer. * @param b a buffer created with yy_create_buffer() * */ void yyFlexLexer::yy_delete_buffer( YY_BUFFER_STATE b ) { if ( ! b ) return; if ( b == YY_CURRENT_BUFFER ) /* Not sure if we should pop here. */ YY_CURRENT_BUFFER_LVALUE = (YY_BUFFER_STATE) 0; if ( b->yy_is_our_buffer ) yyfree((void *) b->yy_ch_buf ); yyfree((void *) b ); } /* Initializes or reinitializes a buffer. * This function is sometimes called more than once on the same buffer, * such as during a yyrestart() or at EOF. */ void yyFlexLexer::yy_init_buffer( YY_BUFFER_STATE b, std::istream* file ) { int oerrno = errno; yy_flush_buffer( b ); b->yy_input_file = file; b->yy_fill_buffer = 1; /* If b is the current buffer, then yy_init_buffer was _probably_ * called from yyrestart() or through yy_get_next_buffer. * In that case, we don't want to reset the lineno or column. */ if (b != YY_CURRENT_BUFFER){ b->yy_bs_lineno = 1; b->yy_bs_column = 0; } b->yy_is_interactive = 0; errno = oerrno; } /** Discard all buffered characters. On the next scan, YY_INPUT will be called. * @param b the buffer state to be flushed, usually @c YY_CURRENT_BUFFER. * */ void yyFlexLexer::yy_flush_buffer( YY_BUFFER_STATE b ) { if ( ! b ) return; b->yy_n_chars = 0; /* We always need two end-of-buffer characters. The first causes * a transition to the end-of-buffer state. The second causes * a jam in that state. */ b->yy_ch_buf[0] = YY_END_OF_BUFFER_CHAR; b->yy_ch_buf[1] = YY_END_OF_BUFFER_CHAR; b->yy_buf_pos = &b->yy_ch_buf[0]; b->yy_at_bol = 1; b->yy_buffer_status = YY_BUFFER_NEW; if ( b == YY_CURRENT_BUFFER ) yy_load_buffer_state( ); } /** Pushes the new state onto the stack. The new state becomes * the current state. This function will allocate the stack * if necessary. * @param new_buffer The new state. * */ void yyFlexLexer::yypush_buffer_state (YY_BUFFER_STATE new_buffer) { if (new_buffer == NULL) return; yyensure_buffer_stack(); /* This block is copied from yy_switch_to_buffer. */ if ( YY_CURRENT_BUFFER ) { /* Flush out information for old buffer. */ *(yy_c_buf_p) = (yy_hold_char); YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = (yy_c_buf_p); YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars); } /* Only push if top exists. Otherwise, replace top. */ if (YY_CURRENT_BUFFER) (yy_buffer_stack_top)++; YY_CURRENT_BUFFER_LVALUE = new_buffer; /* copied from yy_switch_to_buffer. */ yy_load_buffer_state( ); (yy_did_buffer_switch_on_eof) = 1; } /** Removes and deletes the top of the stack, if present. * The next element becomes the new top. * */ void yyFlexLexer::yypop_buffer_state (void) { if (!YY_CURRENT_BUFFER) return; yy_delete_buffer(YY_CURRENT_BUFFER ); YY_CURRENT_BUFFER_LVALUE = NULL; if ((yy_buffer_stack_top) > 0) --(yy_buffer_stack_top); if (YY_CURRENT_BUFFER) { yy_load_buffer_state( ); (yy_did_buffer_switch_on_eof) = 1; } } /* Allocates the stack if it does not exist. * Guarantees space for at least one push. */ void yyFlexLexer::yyensure_buffer_stack(void) { yy_size_t num_to_alloc; if (!(yy_buffer_stack)) { /* First allocation is just for 2 elements, since we don't know if this * scanner will even need a stack. We use 2 instead of 1 to avoid an * immediate realloc on the next call. */ num_to_alloc = 1; (yy_buffer_stack) = (struct yy_buffer_state**)yyalloc (num_to_alloc * sizeof(struct yy_buffer_state*) ); if ( ! (yy_buffer_stack) ) YY_FATAL_ERROR( "out of dynamic memory in yyensure_buffer_stack()" ); memset((yy_buffer_stack), 0, num_to_alloc * sizeof(struct yy_buffer_state*)); (yy_buffer_stack_max) = num_to_alloc; (yy_buffer_stack_top) = 0; return; } if ((yy_buffer_stack_top) >= ((yy_buffer_stack_max)) - 1){ /* Increase the buffer to prepare for a possible push. */ int grow_size = 8 /* arbitrary grow size */; num_to_alloc = (yy_buffer_stack_max) + grow_size; (yy_buffer_stack) = (struct yy_buffer_state**)yyrealloc ((yy_buffer_stack), num_to_alloc * sizeof(struct yy_buffer_state*) ); if ( ! (yy_buffer_stack) ) YY_FATAL_ERROR( "out of dynamic memory in yyensure_buffer_stack()" ); /* zero only the new slots.*/ memset((yy_buffer_stack) + (yy_buffer_stack_max), 0, grow_size * sizeof(struct yy_buffer_state*)); (yy_buffer_stack_max) = num_to_alloc; } } void yyFlexLexer::yy_push_state( int new_state ) { if ( (yy_start_stack_ptr) >= (yy_start_stack_depth) ) { yy_size_t new_size; (yy_start_stack_depth) += YY_START_STACK_INCR; new_size = (yy_start_stack_depth) * sizeof( int ); if ( ! (yy_start_stack) ) (yy_start_stack) = (int *) yyalloc(new_size ); else (yy_start_stack) = (int *) yyrealloc((void *) (yy_start_stack),new_size ); if ( ! (yy_start_stack) ) YY_FATAL_ERROR( "out of memory expanding start-condition stack" ); } (yy_start_stack)[(yy_start_stack_ptr)++] = YY_START; BEGIN(new_state); } void yyFlexLexer::yy_pop_state() { if ( --(yy_start_stack_ptr) < 0 ) YY_FATAL_ERROR( "start-condition stack underflow" ); BEGIN((yy_start_stack)[(yy_start_stack_ptr)]); } int yyFlexLexer::yy_top_state() { return (yy_start_stack)[(yy_start_stack_ptr) - 1]; } #ifndef YY_EXIT_FAILURE #define YY_EXIT_FAILURE 2 #endif void yyFlexLexer::LexerError( yyconst char msg[] ) { std::cerr << msg << std::endl; exit( YY_EXIT_FAILURE ); } /* Redefine yyless() so it works in section 3 code. */ #undef yyless #define yyless(n) \ do \ { \ /* Undo effects of setting up yytext. */ \ int yyless_macro_arg = (n); \ YY_LESS_LINENO(yyless_macro_arg);\ yytext[yyleng] = (yy_hold_char); \ (yy_c_buf_p) = yytext + yyless_macro_arg; \ (yy_hold_char) = *(yy_c_buf_p); \ *(yy_c_buf_p) = '\0'; \ yyleng = yyless_macro_arg; \ } \ while ( 0 ) /* Accessor methods (get/set functions) to struct members. */ /* * Internal utility routines. */ #ifndef yytext_ptr static void yy_flex_strncpy (char* s1, yyconst char * s2, int n ) { register int i; for ( i = 0; i < n; ++i ) s1[i] = s2[i]; } #endif #ifdef YY_NEED_STRLEN static int yy_flex_strlen (yyconst char * s ) { register int n; for ( n = 0; s[n]; ++n ) ; return n; } #endif void *yyalloc (yy_size_t size ) { return (void *) malloc( size ); } void *yyrealloc (void * ptr, yy_size_t size ) { /* The cast to (char *) in the following accommodates both * implementations that use char* generic pointers, and those * that use void* generic pointers. It works with the latter * because both ANSI C and C++ allow castless assignment from * any pointer type to void*, and deal with argument conversions * as though doing an assignment. */ return (void *) realloc( (char *) ptr, size ); } void yyfree (void * ptr ) { free( (char *) ptr ); /* see yyrealloc() for (char *) cast */ } #define YYTABLES_NAME "yytables" #line 268 "RelLexer.l" dibbler-1.0.1/RelCfgMgr/RelCfgMgr.h0000664000175000017500000000404212413230313013620 00000000000000/* * Dibbler - a portable DHCPv6 * * authors: Tomasz Mrugalski * Marek Senderski * * released under GNU GPL v2 only licence * */ #ifndef RELCFGMGR_H #define RELCFGMGR_H #include "RelCfgIface.h" #include "CfgMgr.h" #include "DHCPConst.h" #include "OptVendorData.h" #include "RelOptEcho.h" #define RelCfgMgr() (TRelCfgMgr::instance()) class TRelCfgMgr : public TCfgMgr { public: friend std::ostream & operator<<(std::ostream &strum, TRelCfgMgr &x); virtual ~TRelCfgMgr(); static void instanceCreate(const std::string& cfgFile, const std::string& xmlFile); static TRelCfgMgr& instance(); bool parseConfigFile(const std::string& cfgFile); //Interfaces access methods void firstIface(); SPtr getIface(); SPtr getIfaceByID(int iface); SPtr getIfaceByInterfaceID(int iface); long countIface(); void addIface(SPtr iface); void dump(); bool isDone(); bool setupGlobalOpts(SPtr opt); // configuration parameters std::string getWorkdir(); bool guessMode(); ERelIfaceIdOrder getInterfaceIDOrder(); SPtr getRemoteID(); SPtr getEcho(); void setRelayID(SPtr relayID); SPtr getRelayID(); void setClientLinkLayerAddress(bool enabled); bool getClientLinkLayerAddress(); protected: static TRelCfgMgr * Instance; TRelCfgMgr(const std::string& cfgFile, const std::string& xmlFile); private: std::string XmlFile; static int NextRelayID; bool IsDone; bool validateConfig(); bool validateIface(SPtr ptrIface); List(TRelCfgIface) IfaceLst; bool matchParsedSystemInterfaces(List(TRelCfgIface) * lst); // global options std::string Workdir; bool GuessMode; ERelIfaceIdOrder InterfaceIDOrder; SPtr RemoteID; SPtr Echo; SPtr RelayID_; bool ClientLinkLayerAddress_; }; #endif /* RELCONFMGR_H */ dibbler-1.0.1/RelCfgMgr/RelCfgMgr.cpp0000664000175000017500000002250012556514740014173 00000000000000/* * Dibbler - a portable DHCPv6 * * authors: Tomasz Mrugalski * * released under GNU GPL v2 only licence * */ #include #include #include #include #include #include "IfaceMgr.h" #include "RelIfaceMgr.h" #include "RelCfgIface.h" using namespace std; #include "FlexLexer.h" #include "RelParser.h" #include "RelCfgMgr.h" int TRelCfgMgr::NextRelayID = RELAY_MIN_IFINDEX; TRelCfgMgr * TRelCfgMgr::Instance = 0; TRelCfgMgr::TRelCfgMgr(const std::string& cfgFile, const std::string& xmlFile) :TCfgMgr(), XmlFile(xmlFile), ClientLinkLayerAddress_(false) { // load config file if (!this->parseConfigFile(cfgFile)) { this->IsDone = true; return; } this->dump(); this->IsDone = false; } bool TRelCfgMgr::parseConfigFile(const std::string& cfgFile) { int result; ifstream f; // parse config file f.open( cfgFile.c_str() ); if ( ! f.is_open() ) { Log(Crit) << "Unable to open " << cfgFile << " file." << LogEnd; this->IsDone = true; return false; } else { Log(Notice) << "Parsing " << cfgFile << " config file..." << LogEnd; } yyFlexLexer lexer(&f,&clog); RelParser parser(&lexer); parser.CfgMgr = this; // just a workaround to access CfgMgr while still being in constructor result = parser.yyparse(); Log(Debug) << "Parsing config done." << LogEnd; f.close(); this->LogLevel = logger::getLogLevel(); this->LogName = logger::getLogName(); if (result) { Log(Crit) << "Fatal error during config parsing." << LogEnd; return false; } // setup global options this->setupGlobalOpts(parser.ParserOptStack.getLast()); // analyse interfaces mentioned in config file if (!this->matchParsedSystemInterfaces(&parser.RelCfgIfaceLst)) { return false; } // check if config is sane if(!this->validateConfig()) { return false; } if (guessMode()) Log(Debug) << "Guess-mode enabled. RELAY-REPL from the server without interface-id option will be accepted." << LogEnd; else Log(Debug) << "Guess-mode disabled. RELAY-REPL from the server without interface-id option will be dropped." << LogEnd; return true; } void TRelCfgMgr::dump() { std::ofstream xmlDump; xmlDump.open(this->XmlFile.c_str()); xmlDump << *this; xmlDump.close(); } bool TRelCfgMgr::setupGlobalOpts(SPtr opt) { this->Workdir = opt->getWorkDir(); this->GuessMode = opt->getGuessMode(); this->InterfaceIDOrder = opt->getInterfaceIDOrder(); this->RemoteID = opt->getRemoteID(); this->Echo = opt->getEcho(); return true; } /* * Now parsed information should be placed in config manager * in accordance with information provided by interface manager */ bool TRelCfgMgr::matchParsedSystemInterfaces(List(TRelCfgIface) * lst) { int cfgIfaceCnt; cfgIfaceCnt = lst->count(); Log(Debug) << cfgIfaceCnt << " interface(s) specified in " << RELCONF_FILE << LogEnd; SPtr cfgIface; SPtr ifaceIface; lst->first(); while(cfgIface=lst->get()) { // physical interface if (cfgIface->getID()==-1) { // ID==-1 means that user referenced to interface by name ifaceIface = RelIfaceMgr().getIfaceByName(cfgIface->getName()); } else { ifaceIface = RelIfaceMgr().getIfaceByID(cfgIface->getID()); } if (!ifaceIface) { Log(Crit) << "Interface " << cfgIface->getName() << "/" << cfgIface->getID() << " is not present in the system or does not support IPv6." << LogEnd; return false; } if (!ifaceIface->countLLAddress()) { Log(Crit) << "Interface " << ifaceIface->getName() << "/" << ifaceIface->getID() << " is down or doesn't have any link-layer address. " << LogEnd; return false; } cfgIface->setName(ifaceIface->getName()); cfgIface->setID(ifaceIface->getID()); this->addIface(cfgIface); Log(Info) << "Interface " << cfgIface->getName() << "/" << cfgIface->getID() << " configuration has been loaded." << LogEnd; } return true; } SPtr TRelCfgMgr::getIface() { return this->IfaceLst.get(); } void TRelCfgMgr::addIface(SPtr ptr) { IfaceLst.append(ptr); } void TRelCfgMgr::firstIface() { IfaceLst.first(); } long TRelCfgMgr::countIface() { return IfaceLst.count(); } TRelCfgMgr::~TRelCfgMgr() { Log(Debug) << "RelCfgMgr cleanup." << LogEnd; } bool TRelCfgMgr::isDone() { return IsDone; } bool TRelCfgMgr::guessMode() { return GuessMode; } bool TRelCfgMgr::validateConfig() { SPtr ptrIface; if (!this->countIface()) { Log(Crit) << "Config problem: No interface defined." << LogEnd; return false; } if ( this->countIface()<2 ) { Log(Warning) << "There is only one interface defined. At least two is a sanite configuration." << LogEnd; } firstIface(); while(ptrIface=getIface()) { if (!this->validateIface(ptrIface)) return false; } return true; } bool TRelCfgMgr::validateIface(SPtr ptrIface) { if ( (ptrIface->getInterfaceID() == (signed int)DHCPV6_INFINITY) && (ptrIface->getClientUnicast() || ptrIface->getClientMulticast()) ) { Log(Crit) << "Client address defined without Interface-ID on the " << ptrIface->getFullName() << " interface." << LogEnd; return false; } if ( !ptrIface->getServerUnicast() && !ptrIface->getServerMulticast() && !ptrIface->getClientUnicast() && !ptrIface->getClientMulticast() ) { Log(Warning) << "Both server and client support is defined on the " << ptrIface->getName() << "/" << ptrIface->getID() << " interface." << LogEnd; } if ( (ptrIface->getServerUnicast() || ptrIface->getServerMulticast()) && (ptrIface->getClientUnicast() || ptrIface->getClientMulticast()) ) { Log(Warning) << "Both server and client support is defined on the " << ptrIface->getName() << "/" << ptrIface->getID() << " interface." << LogEnd; } return true; } SPtr TRelCfgMgr::getIfaceByID(int iface) { SPtr ptrIface; this->firstIface(); while ( ptrIface = this->getIface() ) { if ( ptrIface->getID()==iface ) return ptrIface; } Log(Error) << "There is no interface with ifindex=" << iface << " in the CfgMgr." << LogEnd; return SPtr(); // NULL } SPtr TRelCfgMgr::getIfaceByInterfaceID(int iface) { SPtr ptrIface; this->firstIface(); while ( ptrIface = this->getIface() ) { if ( ptrIface->getInterfaceID()==iface ) return ptrIface; } Log(Error) << "There is no interface with interfaceID=" << iface << " in the CfgMgr." << LogEnd; return SPtr(); // NULL } ERelIfaceIdOrder TRelCfgMgr::getInterfaceIDOrder() { return InterfaceIDOrder; } SPtr TRelCfgMgr::getRemoteID() { return RemoteID; } SPtr TRelCfgMgr::getEcho() { return Echo; } void TRelCfgMgr::instanceCreate(const std::string& cfgFile, const std::string& xmlFile ) { if (Instance) Log(Crit) << "RelCfgMgr instance already created. Application error!" << LogEnd; Instance = new TRelCfgMgr(cfgFile, xmlFile); } TRelCfgMgr& TRelCfgMgr::instance() { if (!Instance) { Log(Crit) << "RelCfgMgr instance not created yet. Application error. Emergency shutdown." << LogEnd; exit(EXIT_FAILURE); } return *Instance; } // -------------------------------------------------------------------- // --- operators ------------------------------------------------------ // -------------------------------------------------------------------- ostream & operator<<(ostream &out, TRelCfgMgr &x) { out << "" << std::endl; out << " " << x.getWorkDir() << "" << endl; out << " " << x.getLogName() << "" << endl; out << " " << x.getLogLevel() << "" << endl; out << " "; switch (x.InterfaceIDOrder) { case REL_IFACE_ID_ORDER_BEFORE: out << "before"; break; case REL_IFACE_ID_ORDER_AFTER: out << "after"; break; case REL_IFACE_ID_ORDER_NONE: out << "none"; break; default: out << "unknown(" << x.InterfaceIDOrder << ")"; break; } out << "" << endl; if (SPtr r = x.getRemoteID()) { out << " getVendor() << "\" length=\"" << r->getVendorDataLen() << "\">" << r->getVendorDataPlain() << "" << endl; } else { out << " " << endl; } if (x.getEcho()) { SPtr e = x.getEcho(); out << " count() << "\">"; for (int i=0;icount();i++) { out << e->getReqOpt(i) << " "; } out << "" << endl; } else { out << " " << endl; } SPtr ptrIface; x.firstIface(); while (ptrIface = x.getIface()) { out << *ptrIface; } out << "" << std::endl; return out; } void TRelCfgMgr::setRelayID(SPtr relayID) { RelayID_ = relayID; } SPtr TRelCfgMgr::getRelayID() { return RelayID_; } void TRelCfgMgr::setClientLinkLayerAddress(bool enabled) { ClientLinkLayerAddress_ = enabled; } bool TRelCfgMgr::getClientLinkLayerAddress() { return ClientLinkLayerAddress_; } dibbler-1.0.1/RelCfgMgr/RelLexer.l0000664000175000017500000001546712413230313013553 00000000000000%option noyywrap %option yylineno %{ #ifdef WIN32 #define strncasecmp _strnicmp #endif using namespace std; #include "RelParser.h" #include "Portable.h" #define YYABORT yyterminate(); /* duplicate default definition from flex. This makes cppcheck check for defined YY_FATAL_ERROR() go away. */ #define YY_FATAL_ERROR(msg) LexerError(msg) %} %x COMMENT %x ADDR hexdigit [0-9A-Fa-f] hexnumber {hexdigit}+h letter [a-zA-Z] cipher [0-9] integer {cipher}+ curly_op [{] curly_cl [}] hex1to4 {hexdigit}{1,4} CR \r LF \n EOL (({CR}{LF}?)|{LF}) %{ using namespace std; unsigned ComBeg; // line, in which comment begins unsigned LftCnt; // how many chars : on the left side of '::' char was interpreted unsigned RgtCnt; // the same as above, but on the right side of '::' char Address[16]; // address, which is analizing right now char AddrPart[16]; unsigned intpos,pos; namespace std{ yy_RelParser_stype yylval; } %} %% {EOL}* ; // ignore end of line [ \t] ; // ignore TABs and spaces iface { return RelParser::IFACE_;} client { return RelParser::CLIENT_;} server { return RelParser::SERVER_; } unicast { return RelParser::UNICAST_; } multicast { return RelParser::MULTICAST_; } interface-id { return RelParser::IFACE_ID_; } interface-id-order { return RelParser::IFACE_ID_ORDER_; } guess-mode { return RelParser::GUESS_MODE_; } option { return RelParser::OPTION_; } remote-id { return RelParser::REMOTE_ID_; } relay-id { return RelParser::RELAY_ID_; } link-layer { return RelParser::LINK_LAYER_; } echo-request { return RelParser::ECHO_REQUEST_; } log-name { return RelParser::LOGNAME_;} log-level { return RelParser::LOGLEVEL_;} log-mode { return RelParser::LOGMODE_; } work-dir { return RelParser::WORKDIR_;} yes { yylval.ival=1; return RelParser::INTNUMBER_;} no { yylval.ival=0; return RelParser::INTNUMBER_;} true { yylval.ival=1; return RelParser::INTNUMBER_;} false { yylval.ival=0; return RelParser::INTNUMBER_;} #.* ; "//"(.*) ; "/*" { BEGIN(COMMENT); ComBeg=yylineno; } "*/" BEGIN(INITIAL); .|"\n" ; <> { Log(Crit) << "Comment not closed. (/* in line " << ComBeg << LogEnd; { YYABORT; } } %{ //IPv6 address - various forms %} ({hex1to4}:){7}{hex1to4} { if(!inet_pton6(yytext,yylval.addrval)) { Log(Crit) << "Invalid address format: [" << yytext << "]" << LogEnd; YYABORT; } else { return RelParser::IPV6ADDR_; } } (({hex1to4}:){1,6})?{hex1to4}"::"(({hex1to4}:){1,6})?{hex1to4} { if(!inet_pton6(yytext,yylval.addrval)) { Log(Crit) << "Invalid address format: [" << yytext << "]" << LogEnd; YYABORT; } else { return RelParser::IPV6ADDR_; } } "::"(({hex1to4}:){1,7})?{hex1to4} { if(!inet_pton6(yytext,yylval.addrval)) { Log(Crit) << "Invalid address format: [" << yytext << "]" << LogEnd; YYABORT; } else { return RelParser::IPV6ADDR_; } } (({hex1to4}:){0,7})?{hex1to4}:: { if(!inet_pton6(yytext,yylval.addrval)) { Log(Crit) << "Invalid address format: [" << yytext << "]" << LogEnd; YYABORT; } else { return RelParser::IPV6ADDR_; } } "::" { if(!inet_pton6(yytext,yylval.addrval)) { Log(Crit) << "Invalid address format: [" << yytext << "]" << LogEnd; YYABORT; } else { return RelParser::IPV6ADDR_; } } (({hex1to4}:){1,5})?{hex1to4}"::"(({hex1to4}:){1,6})?{integer}"."{integer}"."{integer}"."{integer} { if(!inet_pton6(yytext,yylval.addrval)) { Log(Crit) << "Invalid address format: [" << yytext << "]" << LogEnd; YYABORT; } else { return RelParser::IPV6ADDR_; } } "::"(({hex1to4}":"){1,6})?{integer}"."{integer}"."{integer}"."{integer} { if(!inet_pton6(yytext,yylval.addrval)) { Log(Crit) << "Invalid address format: [" << yytext << "]" << LogEnd; YYABORT; } else { return RelParser::IPV6ADDR_; } } ('([^']|(''))*')|(\"[^\"]*\") { yylval.strval=new char[strlen(yytext)-1]; strncpy(yylval.strval, yytext+1, strlen(yytext)-2); yylval.strval[strlen(yytext)-2]=0; return RelParser::STRING_; } ([a-zA-Z][a-zA-Z0-9\.-]+) { int len = strlen(yytext); if ( ( (len>2) && !strncasecmp("yes",yytext,3) ) || ( (len>3) && !strncasecmp("true", yytext,4) ) ) { yylval.ival = 1; return RelParser::INTNUMBER_; } if ( ( (len>1) && !strncasecmp("no",yytext,2) ) || ( (len>4) && !strncasecmp("false",yytext,5) ) ) { yylval.ival = 0; return RelParser::INTNUMBER_; } yylval.strval=new char[strlen(yytext)+1]; strncpy(yylval.strval, yytext, strlen(yytext)); yylval.strval[strlen(yytext)]=0; return RelParser::STRING_; } {hexnumber} { // HEX NUMBER yytext[strlen(yytext)-1]='\n'; if(!sscanf(yytext,"%9x",&(yylval.ival))) { Log(Crit) << "Hex value [" << yytext << " parsing failed." << LogEnd; YYABORT; } return RelParser::HEXNUMBER_; } {integer} { if(!sscanf(yytext,"%9u",&(yylval.ival))) { Log(Crit) << "Decimal value [" << yytext << " parsing failed." << LogEnd; YYABORT; } return RelParser::INTNUMBER_; } 0x{hexdigit}+ { // DUID in 0x010203 format int len; char * ptr; if (strlen(yytext)%2) { yytext[1]='0'; //if odd then no-meaning zero at the beginning len = strlen(yytext)-1; ptr = yytext+1; } else { len = strlen(yytext)-2; ptr = yytext+2; } //and now there is an even number of hex digits yylval.duidval.length = len >> 1; yylval.duidval.duid = new char[len >> 1]; for (int i=0 ; i>1]<<=4; if (!isxdigit(ptr[i])) { Log(Crit) << "DUID parsing failed (" << yytext << ")." << LogEnd; YYABORT; } if (isalpha(ptr[i])) { yylval.duidval.duid[i>>1]|=toupper(ptr[i])-'A'+10; } else { yylval.duidval.duid[i>>1]|=ptr[i]-'0'; } } return RelParser::DUID_; } {hexdigit}{2}(:{hexdigit}{2})+ { // DUID in 00:01:02:03 format int len = (strlen(yytext)+1)/3; char * pos = 0; yylval.duidval.length = len; yylval.duidval.duid = new char[len]; int i=0; for (pos = yytext; pos<=yytext+strlen(yytext)-2; pos+=3) { char x; if (isalpha(*pos)) x = (toupper(*pos)-'A' + 10); else x = *pos-'0'; x *= 16; if (isalpha(*(pos+1))) x += (toupper(*(pos+1))-'A' + 10); else x += *(pos+1) - '0'; yylval.duidval.duid[i] = x; i++; } return RelParser::DUID_; } . { return yytext[0]; } %% dibbler-1.0.1/RelCfgMgr/RelLexer.h0000664000175000017500000000026412233256142013544 00000000000000/* * Dibbler - a portable DHCPv6 * * authors: Tomasz Mrugalski * Marek Senderski * * released under GNU GPL v2 only licence */ dibbler-1.0.1/RelCfgMgr/RelParsIfaceOpt.h0000664000175000017500000000175012233256142015006 00000000000000/* * Dibbler - a portable DHCPv6 * * authors: Tomasz Mrugalski * Marek Senderski * * released under GNU GPL v2 only licence * * $Id: RelParsIfaceOpt.h,v 1.3 2008-08-29 00:07:32 thomson Exp $ * */ #ifndef RELPARSIFACEOPT_H_ #define RELPARSIFACEOPT_H_ #include "SmartPtr.h" #include "IPv6Addr.h" class TRelParsIfaceOpt { public: TRelParsIfaceOpt(void); ~TRelParsIfaceOpt(void); void setClientUnicast(SPtr addr); void setServerUnicast(SPtr addr); void setClientMulticast(bool unicast); void setServerMulticast(bool unicast); SPtr getServerUnicast(); SPtr getClientUnicast(); bool getServerMulticast(); bool getClientMulticast(); void setInterfaceID(int id); int getInterfaceID(); private: SPtr ClientUnicast_; SPtr ServerUnicast_; bool ClientMulticast_; bool ServerMulticast_; int InterfaceID_; }; #endif dibbler-1.0.1/RelCfgMgr/RelParser.cpp0000664000175000017500000013604212556513130014261 00000000000000#define YY_RelParser_h_included #define YY_USE_CLASS /* A Bison++ parser, made from RelParser.y */ /* with Bison++ version bison++ Version 1.21.9-1, adapted from GNU bison by coetmeur@icdc.fr Maintained by Magnus Ekdahl */ #define YY_USE_CLASS #line 1 "../bison++/bison.cc" /* -*-C-*- Note some compilers choke on comments on `#line' lines. */ /* Skeleton output parser for bison, Copyright (C) 1984, 1989, 1990 Bob Corbett and Richard Stallman 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 1, 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., 675 Mass Ave, Cambridge, MA 02139, USA. As a special exception, when this file is copied by Bison++ into a Bison++ output file, you may use that output file without restriction. This special exception was added by the Free Software Foundation in version 1.24 of Bison, and has been in Bison++ since 1.21.9. */ /* HEADER SECTION */ #if defined( _MSDOS ) || defined(MSDOS) || defined(__MSDOS__) #define __MSDOS_AND_ALIKE #endif #if defined(_WINDOWS) && defined(_MSC_VER) #define __HAVE_NO_ALLOCA #define __MSDOS_AND_ALIKE #endif #ifndef alloca #if defined( __GNUC__) #define alloca __builtin_alloca #elif (!defined (__STDC__) && defined (sparc)) || defined (__sparc__) || defined (__sparc) || defined (__sgi) #include #elif defined (__MSDOS_AND_ALIKE) #include #ifndef __TURBOC__ /* MS C runtime lib */ #define alloca _alloca #endif #elif defined(_AIX) /* pragma must be put before any C/C++ instruction !! */ #pragma alloca #include #elif defined(__hpux) #ifdef __cplusplus extern "C" { void *alloca (unsigned int); }; #else /* not __cplusplus */ void *alloca (); #endif /* not __cplusplus */ #endif /* not _AIX not MSDOS, or __TURBOC__ or _AIX, not sparc. */ #endif /* alloca not defined. */ #ifdef c_plusplus #ifndef __cplusplus #define __cplusplus #endif #endif #ifdef __cplusplus #ifndef YY_USE_CLASS /*#warning "For C++ its recomended to use bison++, otherwise classes won't be generated"*/ #endif #else #ifndef __STDC__ #define const #endif #ifdef YY_USE_CLASS #error "This is a C++ header generated by bison++, please use a C++ compiler!" #endif #endif #include #define YYBISON 1 #line 88 "../bison++/bison.cc" #line 3 "RelParser.y" #include #include #include #include #include "DHCPConst.h" #include "SmartPtr.h" #include "Container.h" #include "RelParser.h" #include "RelParsGlobalOpt.h" #include "RelParsIfaceOpt.h" #include "RelCfgIface.h" #include "RelCfgMgr.h" #include "OptVendorData.h" #include "OptDUID.h" #include "DUID.h" #include "Logger.h" #include "Portable.h" using namespace std; #define YY_USE_CLASS #line 27 "RelParser.y" #include "FlexLexer.h" #define YY_RelParser_MEMBERS FlexLexer * lex; \ List(TRelParsGlobalOpt) ParserOptStack; /* list of parsed interfaces/IAs/addrs */ \ List(TRelCfgIface) RelCfgIfaceLst; /* list of RelCfg interfaces */ \ List(TIPv6Addr) PresentAddrLst; /* address list (used for DNS,NTP,etc.)*/ \ List(std::string) PresentStringLst; /* string list */ \ SPtr EchoOpt; /* echo request option */ \ /*method check whether interface with id=ifaceNr has been already declared */ \ bool CheckIsIface(int ifaceNr); \ /*method check whether interface with id=ifaceName has been already declared*/ \ bool CheckIsIface(string ifaceName); \ void StartIfaceDeclaration(); \ bool EndIfaceDeclaration(); \ TRelCfgMgr* CfgMgr; \ virtual ~RelParser(); #define YY_RelParser_CONSTRUCTOR_PARAM yyFlexLexer * lex #define YY_RelParser_CONSTRUCTOR_CODE \ ParserOptStack.append(new TRelParsGlobalOpt()); \ this->lex = lex; \ yynerrs = 0; \ yychar = 0; #line 55 "RelParser.y" typedef union { unsigned int ival; char *strval; char addrval[16]; struct SDuid { int length; char* duid; } duidval; } yy_RelParser_stype; #define YY_RelParser_STYPE yy_RelParser_stype #line 88 "../bison++/bison.cc" /* %{ and %header{ and %union, during decl */ #define YY_RelParser_BISON 1 #ifndef YY_RelParser_COMPATIBILITY #ifndef YY_USE_CLASS #define YY_RelParser_COMPATIBILITY 1 #else #define YY_RelParser_COMPATIBILITY 0 #endif #endif #if YY_RelParser_COMPATIBILITY != 0 /* backward compatibility */ #ifdef YYLTYPE #ifndef YY_RelParser_LTYPE #define YY_RelParser_LTYPE YYLTYPE #endif #endif /* Testing alternative bison solution /#ifdef YYSTYPE*/ #ifndef YY_RelParser_STYPE #define YY_RelParser_STYPE YYSTYPE #endif /*#endif*/ #ifdef YYDEBUG #ifndef YY_RelParser_DEBUG #define YY_RelParser_DEBUG YYDEBUG #endif #endif /* use goto to be compatible */ #ifndef YY_RelParser_USE_GOTO #define YY_RelParser_USE_GOTO 1 #endif #endif /* use no goto to be clean in C++ */ #ifndef YY_RelParser_USE_GOTO #define YY_RelParser_USE_GOTO 0 #endif #ifndef YY_RelParser_PURE #line 130 "../bison++/bison.cc" #line 130 "../bison++/bison.cc" /* YY_RelParser_PURE */ #endif /* section apres lecture def, avant lecture grammaire S2 */ #line 134 "../bison++/bison.cc" #line 134 "../bison++/bison.cc" /* prefix */ #ifndef YY_RelParser_DEBUG #line 136 "../bison++/bison.cc" #define YY_RelParser_DEBUG 1 #line 136 "../bison++/bison.cc" /* YY_RelParser_DEBUG */ #endif #ifndef YY_RelParser_LSP_NEEDED #line 141 "../bison++/bison.cc" #line 141 "../bison++/bison.cc" /* YY_RelParser_LSP_NEEDED*/ #endif /* DEFAULT LTYPE*/ #ifdef YY_RelParser_LSP_NEEDED #ifndef YY_RelParser_LTYPE #ifndef BISON_YYLTYPE_ISDECLARED #define BISON_YYLTYPE_ISDECLARED typedef struct yyltype { int timestamp; int first_line; int first_column; int last_line; int last_column; char *text; } yyltype; #endif #define YY_RelParser_LTYPE yyltype #endif #endif /* DEFAULT STYPE*/ /* We used to use `unsigned long' as YY_RelParser_STYPE on MSDOS, but it seems better to be consistent. Most programs should declare their own type anyway. */ #ifndef YY_RelParser_STYPE #define YY_RelParser_STYPE int #endif /* DEFAULT MISCELANEOUS */ #ifndef YY_RelParser_PARSE #define YY_RelParser_PARSE yyparse #endif #ifndef YY_RelParser_LEX #define YY_RelParser_LEX yylex #endif #ifndef YY_RelParser_LVAL #define YY_RelParser_LVAL yylval #endif #ifndef YY_RelParser_LLOC #define YY_RelParser_LLOC yylloc #endif #ifndef YY_RelParser_CHAR #define YY_RelParser_CHAR yychar #endif #ifndef YY_RelParser_NERRS #define YY_RelParser_NERRS yynerrs #endif #ifndef YY_RelParser_DEBUG_FLAG #define YY_RelParser_DEBUG_FLAG yydebug #endif #ifndef YY_RelParser_ERROR #define YY_RelParser_ERROR yyerror #endif #ifndef YY_RelParser_PARSE_PARAM #ifndef YY_USE_CLASS #ifdef YYPARSE_PARAM #define YY_RelParser_PARSE_PARAM void* YYPARSE_PARAM #else #ifndef __STDC__ #ifndef __cplusplus #define YY_RelParser_PARSE_PARAM #endif #endif #endif #endif #ifndef YY_RelParser_PARSE_PARAM #define YY_RelParser_PARSE_PARAM void #endif #endif #if YY_RelParser_COMPATIBILITY != 0 /* backward compatibility */ #ifdef YY_RelParser_LTYPE #ifndef YYLTYPE #define YYLTYPE YY_RelParser_LTYPE #else /* WARNING obsolete !!! user defined YYLTYPE not reported into generated header */ #endif #endif /* Removed due to bison compabilityproblems /#ifndef YYSTYPE /#define YYSTYPE YY_RelParser_STYPE /#else*/ /* WARNING obsolete !!! user defined YYSTYPE not reported into generated header */ /*#endif*/ #ifdef YY_RelParser_PURE # ifndef YYPURE # define YYPURE YY_RelParser_PURE # endif #endif #ifdef YY_RelParser_DEBUG # ifndef YYDEBUG # define YYDEBUG YY_RelParser_DEBUG # endif #endif #ifndef YY_RelParser_ERROR_VERBOSE #ifdef YYERROR_VERBOSE #define YY_RelParser_ERROR_VERBOSE YYERROR_VERBOSE #endif #endif #ifndef YY_RelParser_LSP_NEEDED # ifdef YYLSP_NEEDED # define YY_RelParser_LSP_NEEDED YYLSP_NEEDED # endif #endif #endif #ifndef YY_USE_CLASS /* TOKEN C */ #line 263 "../bison++/bison.cc" #define IFACE_ 258 #define CLIENT_ 259 #define SERVER_ 260 #define UNICAST_ 261 #define MULTICAST_ 262 #define IFACE_ID_ 263 #define IFACE_ID_ORDER_ 264 #define LOGNAME_ 265 #define LOGLEVEL_ 266 #define LOGMODE_ 267 #define WORKDIR_ 268 #define DUID_ 269 #define OPTION_ 270 #define REMOTE_ID_ 271 #define ECHO_REQUEST_ 272 #define RELAY_ID_ 273 #define LINK_LAYER_ 274 #define GUESS_MODE_ 275 #define STRING_ 276 #define HEXNUMBER_ 277 #define INTNUMBER_ 278 #define IPV6ADDR_ 279 #line 263 "../bison++/bison.cc" /* #defines tokens */ #else /* CLASS */ #ifndef YY_RelParser_CLASS #define YY_RelParser_CLASS RelParser #endif #ifndef YY_RelParser_INHERIT #define YY_RelParser_INHERIT #endif #ifndef YY_RelParser_MEMBERS #define YY_RelParser_MEMBERS #endif #ifndef YY_RelParser_LEX_BODY #define YY_RelParser_LEX_BODY #endif #ifndef YY_RelParser_ERROR_BODY #define YY_RelParser_ERROR_BODY #endif #ifndef YY_RelParser_CONSTRUCTOR_PARAM #define YY_RelParser_CONSTRUCTOR_PARAM #endif #ifndef YY_RelParser_CONSTRUCTOR_CODE #define YY_RelParser_CONSTRUCTOR_CODE #endif #ifndef YY_RelParser_CONSTRUCTOR_INIT #define YY_RelParser_CONSTRUCTOR_INIT #endif /* choose between enum and const */ #ifndef YY_RelParser_USE_CONST_TOKEN #define YY_RelParser_USE_CONST_TOKEN 0 /* yes enum is more compatible with flex, */ /* so by default we use it */ #endif #if YY_RelParser_USE_CONST_TOKEN != 0 #ifndef YY_RelParser_ENUM_TOKEN #define YY_RelParser_ENUM_TOKEN yy_RelParser_enum_token #endif #endif class YY_RelParser_CLASS YY_RelParser_INHERIT { public: #if YY_RelParser_USE_CONST_TOKEN != 0 /* static const int token ... */ #line 307 "../bison++/bison.cc" static const int IFACE_; static const int CLIENT_; static const int SERVER_; static const int UNICAST_; static const int MULTICAST_; static const int IFACE_ID_; static const int IFACE_ID_ORDER_; static const int LOGNAME_; static const int LOGLEVEL_; static const int LOGMODE_; static const int WORKDIR_; static const int DUID_; static const int OPTION_; static const int REMOTE_ID_; static const int ECHO_REQUEST_; static const int RELAY_ID_; static const int LINK_LAYER_; static const int GUESS_MODE_; static const int STRING_; static const int HEXNUMBER_; static const int INTNUMBER_; static const int IPV6ADDR_; #line 307 "../bison++/bison.cc" /* decl const */ #else enum YY_RelParser_ENUM_TOKEN { YY_RelParser_NULL_TOKEN=0 #line 310 "../bison++/bison.cc" ,IFACE_=258 ,CLIENT_=259 ,SERVER_=260 ,UNICAST_=261 ,MULTICAST_=262 ,IFACE_ID_=263 ,IFACE_ID_ORDER_=264 ,LOGNAME_=265 ,LOGLEVEL_=266 ,LOGMODE_=267 ,WORKDIR_=268 ,DUID_=269 ,OPTION_=270 ,REMOTE_ID_=271 ,ECHO_REQUEST_=272 ,RELAY_ID_=273 ,LINK_LAYER_=274 ,GUESS_MODE_=275 ,STRING_=276 ,HEXNUMBER_=277 ,INTNUMBER_=278 ,IPV6ADDR_=279 #line 310 "../bison++/bison.cc" /* enum token */ }; /* end of enum declaration */ #endif public: int YY_RelParser_PARSE (YY_RelParser_PARSE_PARAM); virtual void YY_RelParser_ERROR(char *msg) YY_RelParser_ERROR_BODY; #ifdef YY_RelParser_PURE #ifdef YY_RelParser_LSP_NEEDED virtual int YY_RelParser_LEX (YY_RelParser_STYPE *YY_RelParser_LVAL,YY_RelParser_LTYPE *YY_RelParser_LLOC) YY_RelParser_LEX_BODY; #else virtual int YY_RelParser_LEX (YY_RelParser_STYPE *YY_RelParser_LVAL) YY_RelParser_LEX_BODY; #endif #else virtual int YY_RelParser_LEX() YY_RelParser_LEX_BODY; YY_RelParser_STYPE YY_RelParser_LVAL; #ifdef YY_RelParser_LSP_NEEDED YY_RelParser_LTYPE YY_RelParser_LLOC; #endif int YY_RelParser_NERRS; int YY_RelParser_CHAR; #endif #if YY_RelParser_DEBUG != 0 int YY_RelParser_DEBUG_FLAG; /* nonzero means print parse trace */ #endif public: YY_RelParser_CLASS(YY_RelParser_CONSTRUCTOR_PARAM); public: YY_RelParser_MEMBERS }; /* other declare folow */ #if YY_RelParser_USE_CONST_TOKEN != 0 #line 341 "../bison++/bison.cc" const int YY_RelParser_CLASS::IFACE_=258; const int YY_RelParser_CLASS::CLIENT_=259; const int YY_RelParser_CLASS::SERVER_=260; const int YY_RelParser_CLASS::UNICAST_=261; const int YY_RelParser_CLASS::MULTICAST_=262; const int YY_RelParser_CLASS::IFACE_ID_=263; const int YY_RelParser_CLASS::IFACE_ID_ORDER_=264; const int YY_RelParser_CLASS::LOGNAME_=265; const int YY_RelParser_CLASS::LOGLEVEL_=266; const int YY_RelParser_CLASS::LOGMODE_=267; const int YY_RelParser_CLASS::WORKDIR_=268; const int YY_RelParser_CLASS::DUID_=269; const int YY_RelParser_CLASS::OPTION_=270; const int YY_RelParser_CLASS::REMOTE_ID_=271; const int YY_RelParser_CLASS::ECHO_REQUEST_=272; const int YY_RelParser_CLASS::RELAY_ID_=273; const int YY_RelParser_CLASS::LINK_LAYER_=274; const int YY_RelParser_CLASS::GUESS_MODE_=275; const int YY_RelParser_CLASS::STRING_=276; const int YY_RelParser_CLASS::HEXNUMBER_=277; const int YY_RelParser_CLASS::INTNUMBER_=278; const int YY_RelParser_CLASS::IPV6ADDR_=279; #line 341 "../bison++/bison.cc" /* const YY_RelParser_CLASS::token */ #endif /*apres const */ YY_RelParser_CLASS::YY_RelParser_CLASS(YY_RelParser_CONSTRUCTOR_PARAM) YY_RelParser_CONSTRUCTOR_INIT { #if YY_RelParser_DEBUG != 0 YY_RelParser_DEBUG_FLAG=0; #endif YY_RelParser_CONSTRUCTOR_CODE; } #endif #line 352 "../bison++/bison.cc" #define YYFINAL 77 #define YYFLAG -32768 #define YYNTBASE 29 #define YYTRANSLATE(x) ((unsigned)(x) <= 279 ? yytranslate[x] : 57) static const char yytranslate[] = { 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 28, 27, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 25, 2, 26, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24 }; #if YY_RelParser_DEBUG != 0 static const short yyprhs[] = { 0, 0, 2, 5, 7, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 35, 37, 40, 42, 44, 46, 48, 50, 51, 58, 59, 66, 68, 70, 74, 78, 82, 85, 89, 92, 95, 98, 101, 104, 106, 109, 115, 119, 122, 123, 128, 130, 134 }; static const short yyrhs[] = { 30, 0, 31, 33, 0, 32, 0, 31, 32, 0, 45, 0, 44, 0, 46, 0, 47, 0, 48, 0, 56, 0, 50, 0, 51, 0, 52, 0, 53, 0, 36, 0, 33, 36, 0, 35, 0, 34, 35, 0, 41, 0, 40, 0, 43, 0, 42, 0, 49, 0, 0, 3, 21, 25, 37, 34, 26, 0, 0, 3, 39, 25, 38, 34, 26, 0, 22, 0, 23, 0, 5, 6, 24, 0, 4, 6, 24, 0, 5, 7, 39, 0, 5, 7, 0, 4, 7, 39, 0, 4, 7, 0, 11, 39, 0, 12, 21, 0, 10, 21, 0, 13, 21, 0, 20, 0, 8, 39, 0, 15, 16, 39, 27, 14, 0, 15, 18, 14, 0, 15, 19, 0, 0, 15, 17, 54, 55, 0, 39, 0, 55, 28, 39, 0, 9, 21, 0 }; #endif #if (YY_RelParser_DEBUG != 0) || defined(YY_RelParser_ERROR_VERBOSE) static const short yyrline[] = { 0, 86, 90, 94, 95, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 112, 113, 117, 118, 122, 123, 124, 125, 126, 130, 135, 143, 148, 159, 160, 164, 171, 178, 182, 189, 193, 200, 206, 211, 218, 225, 231, 238, 245, 252, 259, 265, 270, 275, 282 }; static const char * const yytname[] = { "$","error","$illegal.","IFACE_","CLIENT_", "SERVER_","UNICAST_","MULTICAST_","IFACE_ID_","IFACE_ID_ORDER_","LOGNAME_","LOGLEVEL_", "LOGMODE_","WORKDIR_","DUID_","OPTION_","REMOTE_ID_","ECHO_REQUEST_","RELAY_ID_", "LINK_LAYER_","GUESS_MODE_","STRING_","HEXNUMBER_","INTNUMBER_","IPV6ADDR_", "'{'","'}'","'-'","','","Grammar","GlobalList","GlobalOptionsList","GlobalOption", "IfaceList","IfaceOptionList","IfaceOptions","Iface","@1","@2","Number","ServerUnicastOption", "ClientUnicastOption","ServerMulticast","ClientMulticastOption","LogLevelOption", "LogModeOption","LogNameOption","WorkDirOption","GuessMode","IfaceID","RemoteID", "RelayID","LinkLayerOption","EchoRequest","@3","OptionIdList","IfaceIDOrder", "" }; #endif static const short yyr1[] = { 0, 29, 30, 31, 31, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 33, 33, 34, 34, 35, 35, 35, 35, 35, 37, 36, 38, 36, 39, 39, 40, 41, 42, 42, 43, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 54, 53, 55, 55, 56 }; static const short yyr2[] = { 0, 1, 2, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 2, 1, 1, 1, 1, 1, 0, 6, 0, 6, 1, 1, 3, 3, 3, 2, 3, 2, 2, 2, 2, 2, 1, 2, 5, 3, 2, 0, 4, 1, 3, 2 }; static const short yydefact[] = { 0, 0, 0, 0, 0, 0, 0, 40, 1, 0, 3, 6, 5, 7, 8, 9, 11, 12, 13, 14, 10, 49, 38, 28, 29, 36, 37, 39, 0, 45, 0, 44, 0, 4, 2, 15, 0, 0, 43, 0, 0, 16, 0, 47, 46, 24, 26, 42, 0, 0, 0, 48, 0, 0, 0, 0, 17, 20, 19, 22, 21, 23, 0, 0, 35, 0, 33, 41, 25, 18, 27, 31, 34, 30, 32, 0, 0, 0 }; static const short yydefgoto[] = { 75, 8, 9, 10, 34, 55, 56, 35, 49, 50, 25, 57, 58, 59, 60, 11, 12, 13, 14, 15, 61, 16, 17, 18, 19, 37, 44, 20 }; static const short yypact[] = { 4, -18, -13, -1, -9, 6, 28,-32768,-32768, 22,-32768, -32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768, -32768,-32768,-32768,-32768,-32768,-32768,-32768, -1,-32768, 39, -32768, 27,-32768, 38,-32768, 29, -1,-32768, 30, 32, -32768, 40,-32768, 31,-32768,-32768,-32768, -1, 35, 35, -32768, 23, 45, -1, -3,-32768,-32768,-32768,-32768,-32768, -32768, 2, 34, -1, 36, -1,-32768,-32768,-32768,-32768, -32768,-32768,-32768,-32768, 61, 62,-32768 }; static const short yypgoto[] = {-32768, -32768,-32768, 54,-32768, 14, -44, 33,-32768,-32768, -28, -32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768, -32768,-32768,-32768,-32768,-32768,-32768,-32768 }; #define YYLAST 67 static const short yytable[] = { 36, 52, 53, 21, 40, 54, 52, 53, 22, 43, 54, 69, 26, 1, 2, 3, 4, 5, 69, 6, 51, 23, 24, 68, 7, 32, 67, 27, 70, 63, 64, 1, 2, 3, 4, 5, 72, 6, 74, 52, 53, 32, 7, 54, 28, 29, 30, 31, 39, 23, 24, 65, 66, 38, 47, 45, 42, 46, 71, 48, 73, 76, 77, 33, 62, 0, 0, 41 }; static const short yycheck[] = { 28, 4, 5, 21, 32, 8, 4, 5, 21, 37, 8, 55, 21, 9, 10, 11, 12, 13, 62, 15, 48, 22, 23, 26, 20, 3, 54, 21, 26, 6, 7, 9, 10, 11, 12, 13, 64, 15, 66, 4, 5, 3, 20, 8, 16, 17, 18, 19, 21, 22, 23, 6, 7, 14, 14, 25, 27, 25, 24, 28, 24, 0, 0, 9, 50, -1, -1, 34 }; #line 352 "../bison++/bison.cc" /* fattrs + tables */ /* parser code folow */ /* This is the parser code that is written into each bison parser when the %semantic_parser declaration is not specified in the grammar. It was written by Richard Stallman by simplifying the hairy parser used when %semantic_parser is specified. */ /* Note: dollar marks section change the next is replaced by the list of actions, each action as one case of the switch. */ #if YY_RelParser_USE_GOTO != 0 /* SUPRESSION OF GOTO : on some C++ compiler (sun c++) the goto is strictly forbidden if any constructor/destructor is used in the whole function (very stupid isn't it ?) so goto are to be replaced with a 'while/switch/case construct' here are the macro to keep some apparent compatibility */ #define YYGOTO(lb) {yy_gotostate=lb;continue;} #define YYBEGINGOTO enum yy_labels yy_gotostate=yygotostart; \ for(;;) switch(yy_gotostate) { case yygotostart: { #define YYLABEL(lb) } case lb: { #define YYENDGOTO } } #define YYBEGINDECLARELABEL enum yy_labels {yygotostart #define YYDECLARELABEL(lb) ,lb #define YYENDDECLARELABEL } #else /* macro to keep goto */ #define YYGOTO(lb) goto lb #define YYBEGINGOTO #define YYLABEL(lb) lb: #define YYENDGOTO #define YYBEGINDECLARELABEL #define YYDECLARELABEL(lb) #define YYENDDECLARELABEL #endif /* LABEL DECLARATION */ YYBEGINDECLARELABEL YYDECLARELABEL(yynewstate) YYDECLARELABEL(yybackup) /* YYDECLARELABEL(yyresume) */ YYDECLARELABEL(yydefault) YYDECLARELABEL(yyreduce) YYDECLARELABEL(yyerrlab) /* here on detecting error */ YYDECLARELABEL(yyerrlab1) /* here on error raised explicitly by an action */ YYDECLARELABEL(yyerrdefault) /* current state does not do anything special for the error token. */ YYDECLARELABEL(yyerrpop) /* pop the current state because it cannot handle the error token */ YYDECLARELABEL(yyerrhandle) YYENDDECLARELABEL /* ALLOCA SIMULATION */ /* __HAVE_NO_ALLOCA */ #ifdef __HAVE_NO_ALLOCA int __alloca_free_ptr(char *ptr,char *ref) {if(ptr!=ref) free(ptr); return 0;} #define __ALLOCA_alloca(size) malloc(size) #define __ALLOCA_free(ptr,ref) __alloca_free_ptr((char *)ptr,(char *)ref) #ifdef YY_RelParser_LSP_NEEDED #define __ALLOCA_return(num) \ do { return( __ALLOCA_free(yyss,yyssa)+\ __ALLOCA_free(yyvs,yyvsa)+\ __ALLOCA_free(yyls,yylsa)+\ (num)); } while(0) #else #define __ALLOCA_return(num) \ do { return( __ALLOCA_free(yyss,yyssa)+\ __ALLOCA_free(yyvs,yyvsa)+\ (num)); } while(0) #endif #else #define __ALLOCA_return(num) do { return(num); } while(0) #define __ALLOCA_alloca(size) alloca(size) #define __ALLOCA_free(ptr,ref) #endif /* ENDALLOCA SIMULATION */ #define yyerrok (yyerrstatus = 0) #define yyclearin (YY_RelParser_CHAR = YYEMPTY) #define YYEMPTY -2 #define YYEOF 0 #define YYACCEPT __ALLOCA_return(0) #define YYABORT __ALLOCA_return(1) #define YYERROR YYGOTO(yyerrlab1) /* Like YYERROR except do call yyerror. This remains here temporarily to ease the transition to the new meaning of YYERROR, for GCC. Once GCC version 2 has supplanted version 1, this can go. */ #define YYFAIL YYGOTO(yyerrlab) #define YYRECOVERING() (!!yyerrstatus) #define YYBACKUP(token, value) \ do \ if (YY_RelParser_CHAR == YYEMPTY && yylen == 1) \ { YY_RelParser_CHAR = (token), YY_RelParser_LVAL = (value); \ yychar1 = YYTRANSLATE (YY_RelParser_CHAR); \ YYPOPSTACK; \ YYGOTO(yybackup); \ } \ else \ { YY_RelParser_ERROR ("syntax error: cannot back up"); YYERROR; } \ while (0) #define YYTERROR 1 #define YYERRCODE 256 #ifndef YY_RelParser_PURE /* UNPURE */ #define YYLEX YY_RelParser_LEX() #ifndef YY_USE_CLASS /* If nonreentrant, and not class , generate the variables here */ int YY_RelParser_CHAR; /* the lookahead symbol */ YY_RelParser_STYPE YY_RelParser_LVAL; /* the semantic value of the */ /* lookahead symbol */ int YY_RelParser_NERRS; /* number of parse errors so far */ #ifdef YY_RelParser_LSP_NEEDED YY_RelParser_LTYPE YY_RelParser_LLOC; /* location data for the lookahead */ /* symbol */ #endif #endif #else /* PURE */ #ifdef YY_RelParser_LSP_NEEDED #define YYLEX YY_RelParser_LEX(&YY_RelParser_LVAL, &YY_RelParser_LLOC) #else #define YYLEX YY_RelParser_LEX(&YY_RelParser_LVAL) #endif #endif #ifndef YY_USE_CLASS #if YY_RelParser_DEBUG != 0 int YY_RelParser_DEBUG_FLAG; /* nonzero means print parse trace */ /* Since this is uninitialized, it does not stop multiple parsers from coexisting. */ #endif #endif /* YYINITDEPTH indicates the initial size of the parser's stacks */ #ifndef YYINITDEPTH #define YYINITDEPTH 200 #endif /* YYMAXDEPTH is the maximum size the stacks can grow to (effective only if the built-in stack extension method is used). */ #if YYMAXDEPTH == 0 #undef YYMAXDEPTH #endif #ifndef YYMAXDEPTH #define YYMAXDEPTH 10000 #endif #if __GNUC__ > 1 /* GNU C and GNU C++ define this. */ #define __yy_bcopy(FROM,TO,COUNT) __builtin_memcpy(TO,FROM,COUNT) #else /* not GNU C or C++ */ /* This is the most reliable way to avoid incompatibilities in available built-in functions on various systems. */ #ifdef __cplusplus static void __yy_bcopy (char *from, char *to, int count) #else #ifdef __STDC__ static void __yy_bcopy (char *from, char *to, int count) #else static void __yy_bcopy (from, to, count) char *from; char *to; int count; #endif #endif { register char *f = from; register char *t = to; register int i = count; while (i-- > 0) *t++ = *f++; } #endif int #ifdef YY_USE_CLASS YY_RelParser_CLASS:: #endif YY_RelParser_PARSE(YY_RelParser_PARSE_PARAM) #ifndef __STDC__ #ifndef __cplusplus #ifndef YY_USE_CLASS /* parameter definition without protypes */ YY_RelParser_PARSE_PARAM_DEF #endif #endif #endif { register int yystate; register int yyn; register short *yyssp; register YY_RelParser_STYPE *yyvsp; int yyerrstatus; /* number of tokens to shift before error messages enabled */ int yychar1=0; /* lookahead token as an internal (translated) token number */ short yyssa[YYINITDEPTH]; /* the state stack */ YY_RelParser_STYPE yyvsa[YYINITDEPTH]; /* the semantic value stack */ short *yyss = yyssa; /* refer to the stacks thru separate pointers */ YY_RelParser_STYPE *yyvs = yyvsa; /* to allow yyoverflow to reallocate them elsewhere */ #ifdef YY_RelParser_LSP_NEEDED YY_RelParser_LTYPE yylsa[YYINITDEPTH]; /* the location stack */ YY_RelParser_LTYPE *yyls = yylsa; YY_RelParser_LTYPE *yylsp; #define YYPOPSTACK (yyvsp--, yyssp--, yylsp--) #else #define YYPOPSTACK (yyvsp--, yyssp--) #endif int yystacksize = YYINITDEPTH; #ifdef YY_RelParser_PURE int YY_RelParser_CHAR; YY_RelParser_STYPE YY_RelParser_LVAL; int YY_RelParser_NERRS; #ifdef YY_RelParser_LSP_NEEDED YY_RelParser_LTYPE YY_RelParser_LLOC; #endif #endif YY_RelParser_STYPE yyval; /* the variable used to return */ /* semantic values from the action */ /* routines */ int yylen; /* start loop, in which YYGOTO may be used. */ YYBEGINGOTO #if YY_RelParser_DEBUG != 0 if (YY_RelParser_DEBUG_FLAG) fprintf(stderr, "Starting parse\n"); #endif yystate = 0; yyerrstatus = 0; YY_RelParser_NERRS = 0; YY_RelParser_CHAR = YYEMPTY; /* Cause a token to be read. */ /* Initialize stack pointers. Waste one element of value and location stack so that they stay on the same level as the state stack. The wasted elements are never initialized. */ yyssp = yyss - 1; yyvsp = yyvs; #ifdef YY_RelParser_LSP_NEEDED yylsp = yyls; #endif /* Push a new state, which is found in yystate . */ /* In all cases, when you get here, the value and location stacks have just been pushed. so pushing a state here evens the stacks. */ YYLABEL(yynewstate) *++yyssp = yystate; if (yyssp >= yyss + yystacksize - 1) { /* Give user a chance to reallocate the stack */ /* Use copies of these so that the &'s don't force the real ones into memory. */ YY_RelParser_STYPE *yyvs1 = yyvs; short *yyss1 = yyss; #ifdef YY_RelParser_LSP_NEEDED YY_RelParser_LTYPE *yyls1 = yyls; #endif /* Get the current used size of the three stacks, in elements. */ int size = yyssp - yyss + 1; #ifdef yyoverflow /* Each stack pointer address is followed by the size of the data in use in that stack, in bytes. */ #ifdef YY_RelParser_LSP_NEEDED /* This used to be a conditional around just the two extra args, but that might be undefined if yyoverflow is a macro. */ yyoverflow("parser stack overflow", &yyss1, size * sizeof (*yyssp), &yyvs1, size * sizeof (*yyvsp), &yyls1, size * sizeof (*yylsp), &yystacksize); #else // cppcheck-suppress constStatement yyoverflow("parser stack overflow", &yyss1, size * sizeof (*yyssp), &yyvs1, size * sizeof (*yyvsp), &yystacksize); #endif yyss = yyss1; yyvs = yyvs1; #ifdef YY_RelParser_LSP_NEEDED yyls = yyls1; #endif #else /* no yyoverflow */ /* Extend the stack our own way. */ if (yystacksize >= YYMAXDEPTH) { YY_RelParser_ERROR(((char*)"parser stack overflow")); __ALLOCA_return(2); } yystacksize *= 2; if (yystacksize > YYMAXDEPTH) yystacksize = YYMAXDEPTH; yyss = (short *) __ALLOCA_alloca (yystacksize * sizeof (*yyssp)); __yy_bcopy ((char *)yyss1, (char *)yyss, size * sizeof (*yyssp)); __ALLOCA_free(yyss1,yyssa); yyvs = (YY_RelParser_STYPE *) __ALLOCA_alloca (yystacksize * sizeof (*yyvsp)); __yy_bcopy ((char *)yyvs1, (char *)yyvs, size * sizeof (*yyvsp)); __ALLOCA_free(yyvs1,yyvsa); #ifdef YY_RelParser_LSP_NEEDED yyls = (YY_RelParser_LTYPE *) __ALLOCA_alloca (yystacksize * sizeof (*yylsp)); __yy_bcopy ((char *)yyls1, (char *)yyls, size * sizeof (*yylsp)); __ALLOCA_free(yyls1,yylsa); #endif #endif /* no yyoverflow */ yyssp = yyss + size - 1; yyvsp = yyvs + size - 1; #ifdef YY_RelParser_LSP_NEEDED yylsp = yyls + size - 1; #endif #if YY_RelParser_DEBUG != 0 if (YY_RelParser_DEBUG_FLAG) fprintf(stderr, "Stack size increased to %d\n", yystacksize); #endif if (yyssp >= yyss + yystacksize - 1) YYABORT; } #if YY_RelParser_DEBUG != 0 if (YY_RelParser_DEBUG_FLAG) fprintf(stderr, "Entering state %d\n", yystate); #endif YYGOTO(yybackup); YYLABEL(yybackup) /* Do appropriate processing given the current state. */ /* Read a lookahead token if we need one and don't already have one. */ /* YYLABEL(yyresume) */ /* First try to decide what to do without reference to lookahead token. */ yyn = yypact[yystate]; if (yyn == YYFLAG) YYGOTO(yydefault); /* Not known => get a lookahead token if don't already have one. */ /* yychar is either YYEMPTY or YYEOF or a valid token in external form. */ if (YY_RelParser_CHAR == YYEMPTY) { #if YY_RelParser_DEBUG != 0 if (YY_RelParser_DEBUG_FLAG) fprintf(stderr, "Reading a token: "); #endif YY_RelParser_CHAR = YYLEX; } /* Convert token to internal form (in yychar1) for indexing tables with */ if (YY_RelParser_CHAR <= 0) /* This means end of input. */ { yychar1 = 0; YY_RelParser_CHAR = YYEOF; /* Don't call YYLEX any more */ #if YY_RelParser_DEBUG != 0 if (YY_RelParser_DEBUG_FLAG) fprintf(stderr, "Now at end of input.\n"); #endif } else { yychar1 = YYTRANSLATE(YY_RelParser_CHAR); #if YY_RelParser_DEBUG != 0 if (YY_RelParser_DEBUG_FLAG) { fprintf (stderr, "Next token is %d (%s", YY_RelParser_CHAR, yytname[yychar1]); /* Give the individual parser a way to print the precise meaning of a token, for further debugging info. */ #ifdef YYPRINT YYPRINT (stderr, YY_RelParser_CHAR, YY_RelParser_LVAL); #endif fprintf (stderr, ")\n"); } #endif } yyn += yychar1; if (yyn < 0 || yyn > YYLAST || yycheck[yyn] != yychar1) YYGOTO(yydefault); yyn = yytable[yyn]; /* yyn is what to do for this token type in this state. Negative => reduce, -yyn is rule number. Positive => shift, yyn is new state. New state is final state => don't bother to shift, just return success. 0, or most negative number => error. */ if (yyn < 0) { if (yyn == YYFLAG) YYGOTO(yyerrlab); yyn = -yyn; YYGOTO(yyreduce); } else if (yyn == 0) YYGOTO(yyerrlab); if (yyn == YYFINAL) YYACCEPT; /* Shift the lookahead token. */ #if YY_RelParser_DEBUG != 0 if (YY_RelParser_DEBUG_FLAG) fprintf(stderr, "Shifting token %d (%s), ", YY_RelParser_CHAR, yytname[yychar1]); #endif /* Discard the token being shifted unless it is eof. */ if (YY_RelParser_CHAR != YYEOF) YY_RelParser_CHAR = YYEMPTY; *++yyvsp = YY_RelParser_LVAL; #ifdef YY_RelParser_LSP_NEEDED *++yylsp = YY_RelParser_LLOC; #endif /* count tokens shifted since error; after three, turn off error status. */ if (yyerrstatus) yyerrstatus--; yystate = yyn; YYGOTO(yynewstate); /* Do the default action for the current state. */ YYLABEL(yydefault) yyn = yydefact[yystate]; if (yyn == 0) YYGOTO(yyerrlab); /* Do a reduction. yyn is the number of a rule to reduce with. */ YYLABEL(yyreduce) yylen = yyr2[yyn]; if (yylen > 0) yyval = yyvsp[1-yylen]; /* implement default value of the action */ #if YY_RelParser_DEBUG != 0 if (YY_RelParser_DEBUG_FLAG) { int i; fprintf (stderr, "Reducing via rule %d (line %d), ", yyn, yyrline[yyn]); /* Print the symbols being reduced, and their result. */ for (i = yyprhs[yyn]; yyrhs[i] > 0; i++) fprintf (stderr, "%s ", yytname[yyrhs[i]]); fprintf (stderr, " -> %s\n", yytname[yyr1[yyn]]); } #endif #line 840 "../bison++/bison.cc" switch (yyn) { case 24: #line 131 "RelParser.y" { CheckIsIface(string(yyvsp[-1].strval)); //If no - everything is ok StartIfaceDeclaration(); ; break;} case 25: #line 136 "RelParser.y" { //Information about new interface has been read //Add it to list of read interfaces RelCfgIfaceLst.append(new TRelCfgIface(yyvsp[-4].strval)); delete [] yyvsp[-4].strval; EndIfaceDeclaration(); ; break;} case 26: #line 144 "RelParser.y" { CheckIsIface(yyvsp[-1].ival); //If no - everything is ok StartIfaceDeclaration(); ; break;} case 27: #line 149 "RelParser.y" { RelCfgIfaceLst.append(new TRelCfgIface(yyvsp[-4].ival)); EndIfaceDeclaration(); ; break;} case 28: #line 159 "RelParser.y" {yyval.ival=yyvsp[0].ival;; break;} case 29: #line 160 "RelParser.y" {yyval.ival=yyvsp[0].ival;; break;} case 30: #line 165 "RelParser.y" { ParserOptStack.getLast()->setServerUnicast(new TIPv6Addr(yyvsp[0].addrval)); ; break;} case 31: #line 172 "RelParser.y" { ParserOptStack.getLast()->setClientUnicast(new TIPv6Addr(yyvsp[0].addrval)); ; break;} case 32: #line 179 "RelParser.y" { ParserOptStack.getLast()->setServerMulticast(yyvsp[0].ival); ; break;} case 33: #line 183 "RelParser.y" { ParserOptStack.getLast()->setServerMulticast(true); ; break;} case 34: #line 190 "RelParser.y" { ParserOptStack.getLast()->setClientMulticast(yyvsp[0].ival); ; break;} case 35: #line 194 "RelParser.y" { ParserOptStack.getLast()->setClientMulticast(true); ; break;} case 36: #line 200 "RelParser.y" { logger::setLogLevel(yyvsp[0].ival); ; break;} case 37: #line 206 "RelParser.y" { logger::setLogMode(yyvsp[0].strval); ; break;} case 38: #line 212 "RelParser.y" { logger::setLogName(yyvsp[0].strval); ; break;} case 39: #line 219 "RelParser.y" { ParserOptStack.getLast()->setWorkDir(yyvsp[0].strval); ; break;} case 40: #line 226 "RelParser.y" { ParserOptStack.getLast()->setGuessMode(true); ; break;} case 41: #line 232 "RelParser.y" { ParserOptStack.getLast()->setInterfaceID(yyvsp[0].ival); ; break;} case 42: #line 239 "RelParser.y" { Log(Debug) << "RemoteID set: enterprise-number=" << yyvsp[-2].ival << ", remote-id length=" << yyvsp[0].duidval.length << LogEnd; ParserOptStack.getLast()->setRemoteID( new TOptVendorData(OPTION_REMOTE_ID, yyvsp[-2].ival, yyvsp[0].duidval.duid, yyvsp[0].duidval.length, 0)); ; break;} case 43: #line 246 "RelParser.y" { Log(Debug) << "Relay-id set: length=" << yyvsp[0].duidval.length << LogEnd; CfgMgr->setRelayID(new TOptDUID(OPTION_RELAY_ID, yyvsp[0].duidval.duid, yyvsp[0].duidval.length, NULL)); ; break;} case 44: #line 253 "RelParser.y" { Log(Debug) << "Client link-local address option (RFC6939) enabled." << LogEnd; CfgMgr->setClientLinkLayerAddress(true); ; break;} case 45: #line 260 "RelParser.y" { EchoOpt = new TRelOptEcho(0); ParserOptStack.getLast()->setEcho(EchoOpt); Log(Debug) << "Echo Request option will be added with opt(s): "; ; break;} case 46: #line 265 "RelParser.y" { Log(Cont) << ", " << EchoOpt->count() << " opt(s) total." << LogEnd; ; break;} case 47: #line 271 "RelParser.y" { EchoOpt->addOption(yyvsp[0].ival); Log(Cont) << " " << yyvsp[0].ival; ; break;} case 48: #line 276 "RelParser.y" { EchoOpt->addOption(yyvsp[0].ival); Log(Cont) << " " << yyvsp[0].ival; ; break;} case 49: #line 283 "RelParser.y" { if (!strncasecmp(yyvsp[0].strval,"before",6)) { ParserOptStack.getLast()->setInterfaceIDOrder(REL_IFACE_ID_ORDER_BEFORE); } else if (!strncasecmp(yyvsp[0].strval,"after",5)) { ParserOptStack.getLast()->setInterfaceIDOrder(REL_IFACE_ID_ORDER_AFTER); } else if (!strncasecmp(yyvsp[0].strval,"omit",4)) { ParserOptStack.getLast()->setInterfaceIDOrder(REL_IFACE_ID_ORDER_NONE); } else { Log(Crit) << "Invalid interface-id-order specified. Allowed values: before, after, none" << LogEnd; YYABORT; } ; break;} } #line 840 "../bison++/bison.cc" /* the action file gets copied in in place of this dollarsign */ yyvsp -= yylen; yyssp -= yylen; #ifdef YY_RelParser_LSP_NEEDED yylsp -= yylen; #endif #if YY_RelParser_DEBUG != 0 if (YY_RelParser_DEBUG_FLAG) { short *ssp1 = yyss - 1; fprintf (stderr, "state stack now"); while (ssp1 != yyssp) fprintf (stderr, " %d", *++ssp1); fprintf (stderr, "\n"); } #endif *++yyvsp = yyval; #ifdef YY_RelParser_LSP_NEEDED yylsp++; if (yylen == 0) { yylsp->first_line = YY_RelParser_LLOC.first_line; yylsp->first_column = YY_RelParser_LLOC.first_column; yylsp->last_line = (yylsp-1)->last_line; yylsp->last_column = (yylsp-1)->last_column; yylsp->text = 0; } else { yylsp->last_line = (yylsp+yylen-1)->last_line; yylsp->last_column = (yylsp+yylen-1)->last_column; } #endif /* Now "shift" the result of the reduction. Determine what state that goes to, based on the state we popped back to and the rule number reduced by. */ yyn = yyr1[yyn]; yystate = yypgoto[yyn - YYNTBASE] + *yyssp; if (yystate >= 0 && yystate <= YYLAST && yycheck[yystate] == *yyssp) yystate = yytable[yystate]; else yystate = yydefgoto[yyn - YYNTBASE]; YYGOTO(yynewstate); YYLABEL(yyerrlab) /* here on detecting error */ if (! yyerrstatus) /* If not already recovering from an error, report this error. */ { ++YY_RelParser_NERRS; #ifdef YY_RelParser_ERROR_VERBOSE yyn = yypact[yystate]; if (yyn > YYFLAG && yyn < YYLAST) { int size = 0; char *msg; int x, count; count = 0; /* Start X at -yyn if nec to avoid negative indexes in yycheck. */ for (x = (yyn < 0 ? -yyn : 0); x < (sizeof(yytname) / sizeof(char *)); x++) if (yycheck[x + yyn] == x) size += strlen(yytname[x]) + 15, count++; msg = (char *) malloc(size + 15); if (msg != 0) { strcpy(msg, "parse error"); if (count < 5) { count = 0; for (x = (yyn < 0 ? -yyn : 0); x < (sizeof(yytname) / sizeof(char *)); x++) if (yycheck[x + yyn] == x) { strcat(msg, count == 0 ? ", expecting `" : " or `"); strcat(msg, yytname[x]); strcat(msg, "'"); count++; } } YY_RelParser_ERROR(msg); free(msg); } else YY_RelParser_ERROR ("parse error; also virtual memory exceeded"); } else #endif /* YY_RelParser_ERROR_VERBOSE */ YY_RelParser_ERROR((char*)"parse error"); } YYGOTO(yyerrlab1); YYLABEL(yyerrlab1) /* here on error raised explicitly by an action */ if (yyerrstatus == 3) { /* if just tried and failed to reuse lookahead token after an error, discard it. */ /* return failure if at end of input */ if (YY_RelParser_CHAR == YYEOF) YYABORT; #if YY_RelParser_DEBUG != 0 if (YY_RelParser_DEBUG_FLAG) fprintf(stderr, "Discarding token %d (%s).\n", YY_RelParser_CHAR, yytname[yychar1]); #endif YY_RelParser_CHAR = YYEMPTY; } /* Else will try to reuse lookahead token after shifting the error token. */ yyerrstatus = 3; /* Each real token shifted decrements this */ YYGOTO(yyerrhandle); YYLABEL(yyerrdefault) /* current state does not do anything special for the error token. */ #if 0 /* This is wrong; only states that explicitly want error tokens should shift them. */ yyn = yydefact[yystate]; /* If its default is to accept any token, ok. Otherwise pop it.*/ if (yyn) YYGOTO(yydefault); #endif YYLABEL(yyerrpop) /* pop the current state because it cannot handle the error token */ if (yyssp == yyss) YYABORT; yyvsp--; yystate = *--yyssp; #ifdef YY_RelParser_LSP_NEEDED yylsp--; #endif #if YY_RelParser_DEBUG != 0 if (YY_RelParser_DEBUG_FLAG) { short *ssp1 = yyss - 1; fprintf (stderr, "Error: state stack now"); while (ssp1 != yyssp) fprintf (stderr, " %d", *++ssp1); fprintf (stderr, "\n"); } #endif YYLABEL(yyerrhandle) yyn = yypact[yystate]; if (yyn == YYFLAG) YYGOTO(yyerrdefault); yyn += YYTERROR; if (yyn < 0 || yyn > YYLAST || yycheck[yyn] != YYTERROR) YYGOTO(yyerrdefault); yyn = yytable[yyn]; if (yyn < 0) { if (yyn == YYFLAG) YYGOTO(yyerrpop); yyn = -yyn; YYGOTO(yyreduce); } else if (yyn == 0) YYGOTO(yyerrpop); if (yyn == YYFINAL) YYACCEPT; #if YY_RelParser_DEBUG != 0 if (YY_RelParser_DEBUG_FLAG) fprintf(stderr, "Shifting error token, "); #endif *++yyvsp = YY_RelParser_LVAL; #ifdef YY_RelParser_LSP_NEEDED *++yylsp = YY_RelParser_LLOC; #endif yystate = yyn; YYGOTO(yynewstate); /* end loop, in which YYGOTO may be used. */ YYENDGOTO } /* END */ #line 1039 "../bison++/bison.cc" #line 303 "RelParser.y" ///////////////////////////////////////////////////////////////////////////// // programs section //method check whether interface with id=ifaceNr has been //already declared bool RelParser::CheckIsIface(int ifaceNr) { SPtr ptr; RelCfgIfaceLst.first(); while (ptr=RelCfgIfaceLst.get()) { if ((ptr->getID())==ifaceNr) { Log(Crit) << "Interface with ID=" << ifaceNr << " is already defined." << LogEnd; YYABORT; } } return true; } //method check whether interface with id=ifaceName has been //already declared bool RelParser::CheckIsIface(string ifaceName) { SPtr ptr; RelCfgIfaceLst.first(); while (ptr=RelCfgIfaceLst.get()) { string presName=ptr->getName(); if (presName==ifaceName) { Log(Crit) << "Interface " << ifaceName << " is already defined." << LogEnd; YYABORT; } } return true; } //method creates new scope appropriately for interface options and declarations //clears all lists except the list of interfaces and adds new group void RelParser::StartIfaceDeclaration() { //Interface scope, so parameters associated with global scope are pushed on stack ParserOptStack.append(new TRelParsGlobalOpt(*ParserOptStack.getLast())); } bool RelParser::EndIfaceDeclaration() { //setting interface options on the basis of just read information RelCfgIfaceLst.getLast()->setOptions(ParserOptStack.getLast()); ParserOptStack.delLast(); return true; } namespace std { extern yy_RelParser_stype yylval; } int RelParser::yylex() { memset(&std::yylval,0, sizeof(std::yylval)); memset(&this->yylval,0, sizeof(this->yylval)); int x = this->lex->yylex(); this->yylval=std::yylval; return x; } void RelParser::yyerror(char *m) { Log(Crit) << "Config parse error: line " << lex->lineno() << ", unexpected [" << lex->YYText() << "] token." << LogEnd; } RelParser::~RelParser() { } dibbler-1.0.1/RelCfgMgr/Makefile.in0000664000175000017500000010025012561652535013724 00000000000000# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = RelCfgMgr DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/depcomp $(dist_noinst_DATA) ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/libtool.m4 \ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/include/dibbler-config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = LIBRARIES = $(noinst_LIBRARIES) ARFLAGS = cru AM_V_AR = $(am__v_AR_@AM_V@) am__v_AR_ = $(am__v_AR_@AM_DEFAULT_V@) am__v_AR_0 = @echo " AR " $@; am__v_AR_1 = libRelCfgMgr_a_AR = $(AR) $(ARFLAGS) libRelCfgMgr_a_LIBADD = am_libRelCfgMgr_a_OBJECTS = libRelCfgMgr_a-RelCfgIface.$(OBJEXT) \ libRelCfgMgr_a-RelCfgMgr.$(OBJEXT) \ libRelCfgMgr_a-RelLexer.$(OBJEXT) \ libRelCfgMgr_a-RelParser.$(OBJEXT) \ libRelCfgMgr_a-RelParsGlobalOpt.$(OBJEXT) \ libRelCfgMgr_a-RelParsIfaceOpt.$(OBJEXT) libRelCfgMgr_a_OBJECTS = $(am_libRelCfgMgr_a_OBJECTS) AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)/include depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) LTCXXCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CXXFLAGS) $(CXXFLAGS) AM_V_CXX = $(am__v_CXX_@AM_V@) am__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@) am__v_CXX_0 = @echo " CXX " $@; am__v_CXX_1 = CXXLD = $(CXX) CXXLINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \ $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CXXLD = $(am__v_CXXLD_@AM_V@) am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@) am__v_CXXLD_0 = @echo " CXXLD " $@; am__v_CXXLD_1 = COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(libRelCfgMgr_a_SOURCES) DIST_SOURCES = $(libRelCfgMgr_a_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac DATA = $(dist_noinst_DATA) am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALLOCA = @ALLOCA@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ ARCH = @ARCH@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ EXTRA_DIST_SUBDIRS = @EXTRA_DIST_SUBDIRS@ FGREP = @FGREP@ GREP = @GREP@ GTEST_INCLUDES = @GTEST_INCLUDES@ GTEST_LDADD = @GTEST_LDADD@ GTEST_LDFLAGS = @GTEST_LDFLAGS@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LINKPRINT = @LINKPRINT@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PORT_CFLAGS = @PORT_CFLAGS@ PORT_LDFLAGS = @PORT_LDFLAGS@ PORT_SUBDIR = @PORT_SUBDIR@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ subdirs = @subdirs@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ noinst_LIBRARIES = libRelCfgMgr.a libRelCfgMgr_a_CPPFLAGS = -I$(top_srcdir)/Misc -I$(top_srcdir)/CfgMgr \ -I$(top_srcdir)/Options -I$(top_srcdir)/RelOptions \ -I$(top_srcdir)/IfaceMgr -I$(top_srcdir)/RelIfaceMgr \ -I$(top_srcdir)/RelMessages -I$(top_srcdir)/Messages \ -I$(top_srcdir)/@PORT_SUBDIR@ libRelCfgMgr_a_SOURCES = RelCfgIface.cpp RelCfgIface.h RelCfgMgr.cpp RelCfgMgr.h RelLexer.cpp RelLexer.h RelParser.cpp RelParser.h RelParsGlobalOpt.cpp RelParsGlobalOpt.h RelParsIfaceOpt.cpp RelParsIfaceOpt.h dist_noinst_DATA = RelLexer.l RelParser.y all: all-am .SUFFIXES: .SUFFIXES: .cpp .lo .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign RelCfgMgr/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign RelCfgMgr/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstLIBRARIES: -test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES) libRelCfgMgr.a: $(libRelCfgMgr_a_OBJECTS) $(libRelCfgMgr_a_DEPENDENCIES) $(EXTRA_libRelCfgMgr_a_DEPENDENCIES) $(AM_V_at)-rm -f libRelCfgMgr.a $(AM_V_AR)$(libRelCfgMgr_a_AR) libRelCfgMgr.a $(libRelCfgMgr_a_OBJECTS) $(libRelCfgMgr_a_LIBADD) $(AM_V_at)$(RANLIB) libRelCfgMgr.a mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libRelCfgMgr_a-RelCfgIface.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libRelCfgMgr_a-RelCfgMgr.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libRelCfgMgr_a-RelLexer.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libRelCfgMgr_a-RelParsGlobalOpt.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libRelCfgMgr_a-RelParsIfaceOpt.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libRelCfgMgr_a-RelParser.Po@am__quote@ .cpp.o: @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $< .cpp.obj: @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .cpp.lo: @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LTCXXCOMPILE) -c -o $@ $< libRelCfgMgr_a-RelCfgIface.o: RelCfgIface.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libRelCfgMgr_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libRelCfgMgr_a-RelCfgIface.o -MD -MP -MF $(DEPDIR)/libRelCfgMgr_a-RelCfgIface.Tpo -c -o libRelCfgMgr_a-RelCfgIface.o `test -f 'RelCfgIface.cpp' || echo '$(srcdir)/'`RelCfgIface.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libRelCfgMgr_a-RelCfgIface.Tpo $(DEPDIR)/libRelCfgMgr_a-RelCfgIface.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='RelCfgIface.cpp' object='libRelCfgMgr_a-RelCfgIface.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libRelCfgMgr_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libRelCfgMgr_a-RelCfgIface.o `test -f 'RelCfgIface.cpp' || echo '$(srcdir)/'`RelCfgIface.cpp libRelCfgMgr_a-RelCfgIface.obj: RelCfgIface.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libRelCfgMgr_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libRelCfgMgr_a-RelCfgIface.obj -MD -MP -MF $(DEPDIR)/libRelCfgMgr_a-RelCfgIface.Tpo -c -o libRelCfgMgr_a-RelCfgIface.obj `if test -f 'RelCfgIface.cpp'; then $(CYGPATH_W) 'RelCfgIface.cpp'; else $(CYGPATH_W) '$(srcdir)/RelCfgIface.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libRelCfgMgr_a-RelCfgIface.Tpo $(DEPDIR)/libRelCfgMgr_a-RelCfgIface.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='RelCfgIface.cpp' object='libRelCfgMgr_a-RelCfgIface.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libRelCfgMgr_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libRelCfgMgr_a-RelCfgIface.obj `if test -f 'RelCfgIface.cpp'; then $(CYGPATH_W) 'RelCfgIface.cpp'; else $(CYGPATH_W) '$(srcdir)/RelCfgIface.cpp'; fi` libRelCfgMgr_a-RelCfgMgr.o: RelCfgMgr.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libRelCfgMgr_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libRelCfgMgr_a-RelCfgMgr.o -MD -MP -MF $(DEPDIR)/libRelCfgMgr_a-RelCfgMgr.Tpo -c -o libRelCfgMgr_a-RelCfgMgr.o `test -f 'RelCfgMgr.cpp' || echo '$(srcdir)/'`RelCfgMgr.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libRelCfgMgr_a-RelCfgMgr.Tpo $(DEPDIR)/libRelCfgMgr_a-RelCfgMgr.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='RelCfgMgr.cpp' object='libRelCfgMgr_a-RelCfgMgr.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libRelCfgMgr_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libRelCfgMgr_a-RelCfgMgr.o `test -f 'RelCfgMgr.cpp' || echo '$(srcdir)/'`RelCfgMgr.cpp libRelCfgMgr_a-RelCfgMgr.obj: RelCfgMgr.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libRelCfgMgr_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libRelCfgMgr_a-RelCfgMgr.obj -MD -MP -MF $(DEPDIR)/libRelCfgMgr_a-RelCfgMgr.Tpo -c -o libRelCfgMgr_a-RelCfgMgr.obj `if test -f 'RelCfgMgr.cpp'; then $(CYGPATH_W) 'RelCfgMgr.cpp'; else $(CYGPATH_W) '$(srcdir)/RelCfgMgr.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libRelCfgMgr_a-RelCfgMgr.Tpo $(DEPDIR)/libRelCfgMgr_a-RelCfgMgr.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='RelCfgMgr.cpp' object='libRelCfgMgr_a-RelCfgMgr.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libRelCfgMgr_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libRelCfgMgr_a-RelCfgMgr.obj `if test -f 'RelCfgMgr.cpp'; then $(CYGPATH_W) 'RelCfgMgr.cpp'; else $(CYGPATH_W) '$(srcdir)/RelCfgMgr.cpp'; fi` libRelCfgMgr_a-RelLexer.o: RelLexer.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libRelCfgMgr_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libRelCfgMgr_a-RelLexer.o -MD -MP -MF $(DEPDIR)/libRelCfgMgr_a-RelLexer.Tpo -c -o libRelCfgMgr_a-RelLexer.o `test -f 'RelLexer.cpp' || echo '$(srcdir)/'`RelLexer.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libRelCfgMgr_a-RelLexer.Tpo $(DEPDIR)/libRelCfgMgr_a-RelLexer.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='RelLexer.cpp' object='libRelCfgMgr_a-RelLexer.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libRelCfgMgr_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libRelCfgMgr_a-RelLexer.o `test -f 'RelLexer.cpp' || echo '$(srcdir)/'`RelLexer.cpp libRelCfgMgr_a-RelLexer.obj: RelLexer.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libRelCfgMgr_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libRelCfgMgr_a-RelLexer.obj -MD -MP -MF $(DEPDIR)/libRelCfgMgr_a-RelLexer.Tpo -c -o libRelCfgMgr_a-RelLexer.obj `if test -f 'RelLexer.cpp'; then $(CYGPATH_W) 'RelLexer.cpp'; else $(CYGPATH_W) '$(srcdir)/RelLexer.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libRelCfgMgr_a-RelLexer.Tpo $(DEPDIR)/libRelCfgMgr_a-RelLexer.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='RelLexer.cpp' object='libRelCfgMgr_a-RelLexer.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libRelCfgMgr_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libRelCfgMgr_a-RelLexer.obj `if test -f 'RelLexer.cpp'; then $(CYGPATH_W) 'RelLexer.cpp'; else $(CYGPATH_W) '$(srcdir)/RelLexer.cpp'; fi` libRelCfgMgr_a-RelParser.o: RelParser.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libRelCfgMgr_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libRelCfgMgr_a-RelParser.o -MD -MP -MF $(DEPDIR)/libRelCfgMgr_a-RelParser.Tpo -c -o libRelCfgMgr_a-RelParser.o `test -f 'RelParser.cpp' || echo '$(srcdir)/'`RelParser.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libRelCfgMgr_a-RelParser.Tpo $(DEPDIR)/libRelCfgMgr_a-RelParser.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='RelParser.cpp' object='libRelCfgMgr_a-RelParser.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libRelCfgMgr_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libRelCfgMgr_a-RelParser.o `test -f 'RelParser.cpp' || echo '$(srcdir)/'`RelParser.cpp libRelCfgMgr_a-RelParser.obj: RelParser.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libRelCfgMgr_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libRelCfgMgr_a-RelParser.obj -MD -MP -MF $(DEPDIR)/libRelCfgMgr_a-RelParser.Tpo -c -o libRelCfgMgr_a-RelParser.obj `if test -f 'RelParser.cpp'; then $(CYGPATH_W) 'RelParser.cpp'; else $(CYGPATH_W) '$(srcdir)/RelParser.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libRelCfgMgr_a-RelParser.Tpo $(DEPDIR)/libRelCfgMgr_a-RelParser.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='RelParser.cpp' object='libRelCfgMgr_a-RelParser.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libRelCfgMgr_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libRelCfgMgr_a-RelParser.obj `if test -f 'RelParser.cpp'; then $(CYGPATH_W) 'RelParser.cpp'; else $(CYGPATH_W) '$(srcdir)/RelParser.cpp'; fi` libRelCfgMgr_a-RelParsGlobalOpt.o: RelParsGlobalOpt.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libRelCfgMgr_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libRelCfgMgr_a-RelParsGlobalOpt.o -MD -MP -MF $(DEPDIR)/libRelCfgMgr_a-RelParsGlobalOpt.Tpo -c -o libRelCfgMgr_a-RelParsGlobalOpt.o `test -f 'RelParsGlobalOpt.cpp' || echo '$(srcdir)/'`RelParsGlobalOpt.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libRelCfgMgr_a-RelParsGlobalOpt.Tpo $(DEPDIR)/libRelCfgMgr_a-RelParsGlobalOpt.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='RelParsGlobalOpt.cpp' object='libRelCfgMgr_a-RelParsGlobalOpt.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libRelCfgMgr_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libRelCfgMgr_a-RelParsGlobalOpt.o `test -f 'RelParsGlobalOpt.cpp' || echo '$(srcdir)/'`RelParsGlobalOpt.cpp libRelCfgMgr_a-RelParsGlobalOpt.obj: RelParsGlobalOpt.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libRelCfgMgr_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libRelCfgMgr_a-RelParsGlobalOpt.obj -MD -MP -MF $(DEPDIR)/libRelCfgMgr_a-RelParsGlobalOpt.Tpo -c -o libRelCfgMgr_a-RelParsGlobalOpt.obj `if test -f 'RelParsGlobalOpt.cpp'; then $(CYGPATH_W) 'RelParsGlobalOpt.cpp'; else $(CYGPATH_W) '$(srcdir)/RelParsGlobalOpt.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libRelCfgMgr_a-RelParsGlobalOpt.Tpo $(DEPDIR)/libRelCfgMgr_a-RelParsGlobalOpt.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='RelParsGlobalOpt.cpp' object='libRelCfgMgr_a-RelParsGlobalOpt.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libRelCfgMgr_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libRelCfgMgr_a-RelParsGlobalOpt.obj `if test -f 'RelParsGlobalOpt.cpp'; then $(CYGPATH_W) 'RelParsGlobalOpt.cpp'; else $(CYGPATH_W) '$(srcdir)/RelParsGlobalOpt.cpp'; fi` libRelCfgMgr_a-RelParsIfaceOpt.o: RelParsIfaceOpt.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libRelCfgMgr_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libRelCfgMgr_a-RelParsIfaceOpt.o -MD -MP -MF $(DEPDIR)/libRelCfgMgr_a-RelParsIfaceOpt.Tpo -c -o libRelCfgMgr_a-RelParsIfaceOpt.o `test -f 'RelParsIfaceOpt.cpp' || echo '$(srcdir)/'`RelParsIfaceOpt.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libRelCfgMgr_a-RelParsIfaceOpt.Tpo $(DEPDIR)/libRelCfgMgr_a-RelParsIfaceOpt.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='RelParsIfaceOpt.cpp' object='libRelCfgMgr_a-RelParsIfaceOpt.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libRelCfgMgr_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libRelCfgMgr_a-RelParsIfaceOpt.o `test -f 'RelParsIfaceOpt.cpp' || echo '$(srcdir)/'`RelParsIfaceOpt.cpp libRelCfgMgr_a-RelParsIfaceOpt.obj: RelParsIfaceOpt.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libRelCfgMgr_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libRelCfgMgr_a-RelParsIfaceOpt.obj -MD -MP -MF $(DEPDIR)/libRelCfgMgr_a-RelParsIfaceOpt.Tpo -c -o libRelCfgMgr_a-RelParsIfaceOpt.obj `if test -f 'RelParsIfaceOpt.cpp'; then $(CYGPATH_W) 'RelParsIfaceOpt.cpp'; else $(CYGPATH_W) '$(srcdir)/RelParsIfaceOpt.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libRelCfgMgr_a-RelParsIfaceOpt.Tpo $(DEPDIR)/libRelCfgMgr_a-RelParsIfaceOpt.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='RelParsIfaceOpt.cpp' object='libRelCfgMgr_a-RelParsIfaceOpt.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libRelCfgMgr_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libRelCfgMgr_a-RelParsIfaceOpt.obj `if test -f 'RelParsIfaceOpt.cpp'; then $(CYGPATH_W) 'RelParsIfaceOpt.cpp'; else $(CYGPATH_W) '$(srcdir)/RelParsIfaceOpt.cpp'; fi` mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LIBRARIES) $(DATA) installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool clean-noinstLIBRARIES \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \ clean-libtool clean-noinstLIBRARIES cscopelist-am ctags \ ctags-am distclean distclean-compile distclean-generic \ distclean-libtool distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-dvi install-dvi-am install-exec \ install-exec-am install-html install-html-am install-info \ install-info-am install-man install-pdf install-pdf-am \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ tags tags-am uninstall uninstall-am parser: RelParser.y RelLexer.l echo "[BISON++] $(SUBDIR)/RelParser.y" $(top_builddir)/bison++/bison++ --skeleton=$(top_builddir)/bison++/bison.cc --headerskeleton=$(top_builddir)/bison++/bison.h -v --debug --defines -d RelParser.y -o RelParser.cpp echo "[FLEX ] $(SUBDIR)/RelLexer.l" flex -+ -i -oRelLexer.cpp RelLexer.l @echo "[SED ] $(SUBDIR)/RelLexer.cpp" cat RelLexer.cpp | sed 's/extern "C" int isatty (int );/\/\/ extern "C" int isatty (int ) throw ();/' > RelLexer.cpp2 rm -f RelLexer.cpp mv RelLexer.cpp2 RelLexer.cpp # 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: dibbler-1.0.1/RelCfgMgr/RelParser.y0000664000175000017500000002110712413230313013731 00000000000000%name RelParser %header{ #include #include #include #include #include "DHCPConst.h" #include "SmartPtr.h" #include "Container.h" #include "RelParser.h" #include "RelParsGlobalOpt.h" #include "RelParsIfaceOpt.h" #include "RelCfgIface.h" #include "RelCfgMgr.h" #include "OptVendorData.h" #include "OptDUID.h" #include "DUID.h" #include "Logger.h" #include "Portable.h" using namespace std; #define YY_USE_CLASS %} %{ #include "FlexLexer.h" %} // class definition %define MEMBERS FlexLexer * lex; \ List(TRelParsGlobalOpt) ParserOptStack; /* list of parsed interfaces/IAs/addrs */ \ List(TRelCfgIface) RelCfgIfaceLst; /* list of RelCfg interfaces */ \ List(TIPv6Addr) PresentAddrLst; /* address list (used for DNS,NTP,etc.)*/ \ List(std::string) PresentStringLst; /* string list */ \ SPtr EchoOpt; /* echo request option */ \ /*method check whether interface with id=ifaceNr has been already declared */ \ bool CheckIsIface(int ifaceNr); \ /*method check whether interface with id=ifaceName has been already declared*/ \ bool CheckIsIface(string ifaceName); \ void StartIfaceDeclaration(); \ bool EndIfaceDeclaration(); \ TRelCfgMgr* CfgMgr; \ virtual ~RelParser(); // constructor %define CONSTRUCTOR_PARAM yyFlexLexer * lex %define CONSTRUCTOR_CODE \ ParserOptStack.append(new TRelParsGlobalOpt()); \ this->lex = lex; \ yynerrs = 0; \ yychar = 0; %union { unsigned int ival; char *strval; char addrval[16]; struct SDuid { int length; char* duid; } duidval; } %token IFACE_, CLIENT_, SERVER_, UNICAST_, MULTICAST_, IFACE_ID_, IFACE_ID_ORDER_ %token LOGNAME_, LOGLEVEL_, LOGMODE_, WORKDIR_ %token DUID_, OPTION_, REMOTE_ID_, ECHO_REQUEST_, RELAY_ID_, LINK_LAYER_ %token GUESS_MODE_ %token STRING_ %token HEXNUMBER_ %token INTNUMBER_ %token IPV6ADDR_ %type Number %token DUID_ %% ///////////////////////////////////////////////////////////////////////////// // rules section ///////////////////////////////////////////////////////////////////////////// Grammar : GlobalList ; GlobalList : GlobalOptionsList IfaceList ; GlobalOptionsList : GlobalOption | GlobalOptionsList GlobalOption ; GlobalOption : LogModeOption | LogLevelOption | LogNameOption | WorkDirOption | GuessMode | IfaceIDOrder | RemoteID | RelayID | LinkLayerOption | EchoRequest ; IfaceList : Iface | IfaceList Iface ; IfaceOptionList : IfaceOptions | IfaceOptionList IfaceOptions ; IfaceOptions : ClientUnicastOption | ServerUnicastOption | ClientMulticastOption | ServerMulticast | IfaceID ; Iface :IFACE_ STRING_ '{' { CheckIsIface(string($2)); //If no - everything is ok StartIfaceDeclaration(); } IfaceOptionList '}' { //Information about new interface has been read //Add it to list of read interfaces RelCfgIfaceLst.append(new TRelCfgIface($2)); delete [] $2; EndIfaceDeclaration(); } |IFACE_ Number '{' { CheckIsIface($2); //If no - everything is ok StartIfaceDeclaration(); } IfaceOptionList '}' { RelCfgIfaceLst.append(new TRelCfgIface($2)); EndIfaceDeclaration(); } ///////////////////////////////////////////////////////////////////////////// // Now Options and their parameters ///////////////////////////////////////////////////////////////////////////// Number : HEXNUMBER_ {$$=$1;} | INTNUMBER_ {$$=$1;} ; ServerUnicastOption : SERVER_ UNICAST_ IPV6ADDR_ { ParserOptStack.getLast()->setServerUnicast(new TIPv6Addr($3)); } ; ClientUnicastOption : CLIENT_ UNICAST_ IPV6ADDR_ { ParserOptStack.getLast()->setClientUnicast(new TIPv6Addr($3)); } ; ServerMulticast : SERVER_ MULTICAST_ Number { ParserOptStack.getLast()->setServerMulticast($3); } | SERVER_ MULTICAST_ { ParserOptStack.getLast()->setServerMulticast(true); } ; ClientMulticastOption : CLIENT_ MULTICAST_ Number { ParserOptStack.getLast()->setClientMulticast($3); } | CLIENT_ MULTICAST_ { ParserOptStack.getLast()->setClientMulticast(true); } ; LogLevelOption : LOGLEVEL_ Number { logger::setLogLevel($2); } ; LogModeOption : LOGMODE_ STRING_ { logger::setLogMode($2); } LogNameOption : LOGNAME_ STRING_ { logger::setLogName($2); } ; WorkDirOption : WORKDIR_ STRING_ { ParserOptStack.getLast()->setWorkDir($2); } ; GuessMode : GUESS_MODE_ { ParserOptStack.getLast()->setGuessMode(true); }; IfaceID :IFACE_ID_ Number { ParserOptStack.getLast()->setInterfaceID($2); } ; RemoteID :OPTION_ REMOTE_ID_ Number '-' DUID_ { Log(Debug) << "RemoteID set: enterprise-number=" << $3 << ", remote-id length=" << $5.length << LogEnd; ParserOptStack.getLast()->setRemoteID( new TOptVendorData(OPTION_REMOTE_ID, $3, $5.duid, $5.length, 0)); }; RelayID :OPTION_ RELAY_ID_ DUID_ { Log(Debug) << "Relay-id set: length=" << $3.length << LogEnd; CfgMgr->setRelayID(new TOptDUID(OPTION_RELAY_ID, $3.duid, $3.length, NULL)); } LinkLayerOption :OPTION_ LINK_LAYER_ { Log(Debug) << "Client link-local address option (RFC6939) enabled." << LogEnd; CfgMgr->setClientLinkLayerAddress(true); } EchoRequest :OPTION_ ECHO_REQUEST_ { EchoOpt = new TRelOptEcho(0); ParserOptStack.getLast()->setEcho(EchoOpt); Log(Debug) << "Echo Request option will be added with opt(s): "; } OptionIdList { Log(Cont) << ", " << EchoOpt->count() << " opt(s) total." << LogEnd; }; OptionIdList : Number { EchoOpt->addOption($1); Log(Cont) << " " << $1; } |OptionIdList ',' Number { EchoOpt->addOption($3); Log(Cont) << " " << $3; }; IfaceIDOrder :IFACE_ID_ORDER_ STRING_ { if (!strncasecmp($2,"before",6)) { ParserOptStack.getLast()->setInterfaceIDOrder(REL_IFACE_ID_ORDER_BEFORE); } else if (!strncasecmp($2,"after",5)) { ParserOptStack.getLast()->setInterfaceIDOrder(REL_IFACE_ID_ORDER_AFTER); } else if (!strncasecmp($2,"omit",4)) { ParserOptStack.getLast()->setInterfaceIDOrder(REL_IFACE_ID_ORDER_NONE); } else { Log(Crit) << "Invalid interface-id-order specified. Allowed values: before, after, none" << LogEnd; YYABORT; } }; %% ///////////////////////////////////////////////////////////////////////////// // programs section //method check whether interface with id=ifaceNr has been //already declared bool RelParser::CheckIsIface(int ifaceNr) { SPtr ptr; RelCfgIfaceLst.first(); while (ptr=RelCfgIfaceLst.get()) { if ((ptr->getID())==ifaceNr) { Log(Crit) << "Interface with ID=" << ifaceNr << " is already defined." << LogEnd; YYABORT; } } return true; } //method check whether interface with id=ifaceName has been //already declared bool RelParser::CheckIsIface(string ifaceName) { SPtr ptr; RelCfgIfaceLst.first(); while (ptr=RelCfgIfaceLst.get()) { string presName=ptr->getName(); if (presName==ifaceName) { Log(Crit) << "Interface " << ifaceName << " is already defined." << LogEnd; YYABORT; } } return true; } //method creates new scope appropriately for interface options and declarations //clears all lists except the list of interfaces and adds new group void RelParser::StartIfaceDeclaration() { //Interface scope, so parameters associated with global scope are pushed on stack ParserOptStack.append(new TRelParsGlobalOpt(*ParserOptStack.getLast())); } bool RelParser::EndIfaceDeclaration() { //setting interface options on the basis of just read information RelCfgIfaceLst.getLast()->setOptions(ParserOptStack.getLast()); ParserOptStack.delLast(); return true; } namespace std { extern yy_RelParser_stype yylval; } int RelParser::yylex() { memset(&std::yylval,0, sizeof(std::yylval)); memset(&this->yylval,0, sizeof(this->yylval)); int x = this->lex->yylex(); this->yylval=std::yylval; return x; } void RelParser::yyerror(char *m) { Log(Crit) << "Config parse error: line " << lex->lineno() << ", unexpected [" << lex->YYText() << "] token." << LogEnd; } RelParser::~RelParser() { } dibbler-1.0.1/RelOptions/0000775000175000017500000000000012561700422012214 500000000000000dibbler-1.0.1/RelOptions/RelOptInterfaceID.cpp0000664000175000017500000000134112233256142016103 00000000000000/* * Dibbler - a portable DHCPv6 * * authors: Tomasz Mrugalski * Marek Senderski * * released under GNU GPL v2 only licence * * $Id: RelOptInterfaceID.cpp,v 1.3 2008-08-29 00:07:32 thomson Exp $ * */ #include "RelOptInterfaceID.h" #include "DHCPConst.h" TRelOptInterfaceID::TRelOptInterfaceID(char * data, int dataLen, TMsg* parent) :TOptInteger(OPTION_INTERFACE_ID, 4 /** @todo: Support length other than 4 */, data, dataLen, parent) { } TRelOptInterfaceID::TRelOptInterfaceID(int interfaceID, TMsg* parent) :TOptInteger(OPTION_INTERFACE_ID, 4 /** @todo: Support length other than 4 */, interfaceID, parent) { } bool TRelOptInterfaceID::doDuties() { return true; } dibbler-1.0.1/RelOptions/RelOptGeneric.cpp0000664000175000017500000000063712233256142015351 00000000000000/* * Dibbler - a portable DHCPv6 * * authors: Tomasz Mrugalski * * released under GNU GPL v2 licence * * $Id: RelOptGeneric.cpp,v 1.3 2008-03-02 19:32:28 thomson Exp $ * */ #include "RelOptGeneric.h" TRelOptGeneric::TRelOptGeneric(int type, char* buf, int bufsize, TMsg* parent) :TOptGeneric(type, buf, bufsize, parent){ } bool TRelOptGeneric::doDuties() { return true; } dibbler-1.0.1/RelOptions/RelOptRelayMsg.h0000664000175000017500000000104512233256142015157 00000000000000/* * Dibbler - a portable DHCPv6 * * authors: Tomasz Mrugalski * Marek Senderski * * released under GNU GPL v2 licence * * $Id: RelOptRelayMsg.h,v 1.1 2005-01-11 22:53:36 thomson Exp $ * * $Log: not supported by cvs2svn $ */ #ifndef RELOPTRELAYMSG_H #define RELOPTRELAYMSG_H #include "DHCPConst.h" #include "OptGeneric.h" class TRelOptRelayMsg : public TOptGeneric { public: TRelOptRelayMsg(char* buf, int bufsize, TMsg* parent); bool doDuties(); }; #endif /* RELOPTGENERIC_H */ dibbler-1.0.1/RelOptions/RelOptRemoteID.cpp0000644000175000017500000000103412304040124015421 00000000000000/* * Dibbler - a portable DHCPv6 * * authors: Tomasz Mrugalski * * released under GNU GPL v2 only licence * */ #include "RelOptRemoteID.h" #include "DHCPConst.h" TRelOptRemoteID::TRelOptRemoteID( char * buf, int n, TMsg* parent) :TOptVendorData(OPTION_REMOTE_ID, buf,n, parent) { } TRelOptRemoteID::TRelOptRemoteID(int enterprise, char * data, int dataLen, TMsg* parent) :TOptVendorData(OPTION_REMOTE_ID, enterprise, data, dataLen, parent) { } bool TRelOptRemoteID::doDuties() { return true; } dibbler-1.0.1/RelOptions/Makefile.am0000644000175000017500000000055612277722750014210 00000000000000noinst_LIBRARIES = libRelOptions.a libRelOptions_a_CPPFLAGS = -I$(top_srcdir)/Misc libRelOptions_a_CPPFLAGS += -I$(top_srcdir)/Options -I$(top_srcdir)/RelOptions libRelOptions_a_SOURCES = RelOptEcho.cpp RelOptEcho.h RelOptGeneric.cpp RelOptGeneric.h RelOptInterfaceID.cpp RelOptInterfaceID.h RelOptRelayMsg.cpp RelOptRelayMsg.h RelOptRemoteID.cpp RelOptRemoteID.h dibbler-1.0.1/RelOptions/RelOptGeneric.h0000664000175000017500000000073412233256142015014 00000000000000/* * Dibbler - a portable DHCPv6 * * authors: Tomasz Mrugalski * * released under GNU GPL v2 licence * * $Id: RelOptGeneric.h,v 1.4 2008-03-02 19:32:28 thomson Exp $ * */ #ifndef RELOPTGENERIC_H #define RELOPTGENERIC_H #include "DHCPConst.h" #include "OptGeneric.h" class TRelOptGeneric : public TOptGeneric { public: TRelOptGeneric(int type, char* buf, int bufsize, TMsg* parent); bool doDuties(); }; #endif /* RELOPTGENERIC_H */ dibbler-1.0.1/RelOptions/RelOptEcho.h0000664000175000017500000000102512233256142014310 00000000000000/* * Dibbler - a portable DHCPv6 * * authors: Tomasz Mrugalski * * released under GNU GPL v2 only licence * * $Id: RelOptEcho.h,v 1.2 2008-08-29 00:07:32 thomson Exp $ * */ #ifndef RELOPTECHO_H #define RELOPTECHO_H #include "DHCPConst.h" #include "SmartPtr.h" #include "OptOptionRequest.h" class TRelOptEcho; class TRelOptEcho : public TOptOptionRequest { public: TRelOptEcho(char * buf, int n, TMsg* parent); TRelOptEcho(TMsg* parent); bool doDuties(); }; #endif /* RelOptEcho */ dibbler-1.0.1/RelOptions/RelOptRemoteID.h0000644000175000017500000000076712304040124015102 00000000000000/* * Dibbler - a portable DHCPv6 * * authors: Tomasz Mrugalski * * released under GNU GPL v2 only licence * */ class TRelOptRemoteID; #ifndef RELOPTREMOTEID_H #define RELOPTREMOTEID_H #include "OptVendorData.h" class TRelOptRemoteID : public TOptVendorData { public: TRelOptRemoteID(int enterprise, char * data, int dataLen, TMsg* parent); TRelOptRemoteID(char * buf, int n, TMsg* parent); bool doDuties(); private: }; #endif /* CLNTOPTVENDORSPECINFO_H */ dibbler-1.0.1/RelOptions/RelOptInterfaceID.h0000664000175000017500000000110312233256142015544 00000000000000/* * Dibbler - a portable DHCPv6 * * authors: Tomasz Mrugalski * Marek Senderski * * released under GNU GPL v2 only licence * * $Id: RelOptInterfaceID.h,v 1.4 2008-08-29 00:07:32 thomson Exp $ * */ #ifndef RELOPTIONINTERFACEID_H #define RELOPTIONINTERFACEID_H #include "OptInteger.h" class TRelOptInterfaceID : public TOptInteger { public: TRelOptInterfaceID(char * data, int dataLen, TMsg* parent); TRelOptInterfaceID(int interfaceID, TMsg* parent); bool doDuties(); }; #endif /* RELOPTIONINTERFACEID_H */ dibbler-1.0.1/RelOptions/RelOptEcho.cpp0000664000175000017500000000067112233256142014651 00000000000000/* * Dibbler - a portable DHCPv6 * * authors: Tomasz Mrugalski * * released under GNU GPL v2 only licence * */ #include "SmartPtr.h" #include "RelOptEcho.h" TRelOptEcho::TRelOptEcho( char * buf, int n, TMsg* parent) :TOptOptionRequest(OPTION_ERO, buf, n, parent) { } TRelOptEcho::TRelOptEcho(TMsg* parent) :TOptOptionRequest(OPTION_ERO, parent) { } bool TRelOptEcho::doDuties() { return true; } dibbler-1.0.1/RelOptions/Makefile.in0000664000175000017500000007325212561652535014225 00000000000000# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = RelOptions DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/depcomp ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/libtool.m4 \ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/include/dibbler-config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = LIBRARIES = $(noinst_LIBRARIES) ARFLAGS = cru AM_V_AR = $(am__v_AR_@AM_V@) am__v_AR_ = $(am__v_AR_@AM_DEFAULT_V@) am__v_AR_0 = @echo " AR " $@; am__v_AR_1 = libRelOptions_a_AR = $(AR) $(ARFLAGS) libRelOptions_a_LIBADD = am_libRelOptions_a_OBJECTS = libRelOptions_a-RelOptEcho.$(OBJEXT) \ libRelOptions_a-RelOptGeneric.$(OBJEXT) \ libRelOptions_a-RelOptInterfaceID.$(OBJEXT) \ libRelOptions_a-RelOptRelayMsg.$(OBJEXT) \ libRelOptions_a-RelOptRemoteID.$(OBJEXT) libRelOptions_a_OBJECTS = $(am_libRelOptions_a_OBJECTS) AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)/include depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) LTCXXCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CXXFLAGS) $(CXXFLAGS) AM_V_CXX = $(am__v_CXX_@AM_V@) am__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@) am__v_CXX_0 = @echo " CXX " $@; am__v_CXX_1 = CXXLD = $(CXX) CXXLINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \ $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CXXLD = $(am__v_CXXLD_@AM_V@) am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@) am__v_CXXLD_0 = @echo " CXXLD " $@; am__v_CXXLD_1 = COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(libRelOptions_a_SOURCES) DIST_SOURCES = $(libRelOptions_a_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALLOCA = @ALLOCA@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ ARCH = @ARCH@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ EXTRA_DIST_SUBDIRS = @EXTRA_DIST_SUBDIRS@ FGREP = @FGREP@ GREP = @GREP@ GTEST_INCLUDES = @GTEST_INCLUDES@ GTEST_LDADD = @GTEST_LDADD@ GTEST_LDFLAGS = @GTEST_LDFLAGS@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LINKPRINT = @LINKPRINT@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PORT_CFLAGS = @PORT_CFLAGS@ PORT_LDFLAGS = @PORT_LDFLAGS@ PORT_SUBDIR = @PORT_SUBDIR@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ subdirs = @subdirs@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ noinst_LIBRARIES = libRelOptions.a libRelOptions_a_CPPFLAGS = -I$(top_srcdir)/Misc \ -I$(top_srcdir)/Options -I$(top_srcdir)/RelOptions libRelOptions_a_SOURCES = RelOptEcho.cpp RelOptEcho.h RelOptGeneric.cpp RelOptGeneric.h RelOptInterfaceID.cpp RelOptInterfaceID.h RelOptRelayMsg.cpp RelOptRelayMsg.h RelOptRemoteID.cpp RelOptRemoteID.h all: all-am .SUFFIXES: .SUFFIXES: .cpp .lo .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign RelOptions/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign RelOptions/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstLIBRARIES: -test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES) libRelOptions.a: $(libRelOptions_a_OBJECTS) $(libRelOptions_a_DEPENDENCIES) $(EXTRA_libRelOptions_a_DEPENDENCIES) $(AM_V_at)-rm -f libRelOptions.a $(AM_V_AR)$(libRelOptions_a_AR) libRelOptions.a $(libRelOptions_a_OBJECTS) $(libRelOptions_a_LIBADD) $(AM_V_at)$(RANLIB) libRelOptions.a mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libRelOptions_a-RelOptEcho.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libRelOptions_a-RelOptGeneric.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libRelOptions_a-RelOptInterfaceID.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libRelOptions_a-RelOptRelayMsg.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libRelOptions_a-RelOptRemoteID.Po@am__quote@ .cpp.o: @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $< .cpp.obj: @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .cpp.lo: @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LTCXXCOMPILE) -c -o $@ $< libRelOptions_a-RelOptEcho.o: RelOptEcho.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libRelOptions_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libRelOptions_a-RelOptEcho.o -MD -MP -MF $(DEPDIR)/libRelOptions_a-RelOptEcho.Tpo -c -o libRelOptions_a-RelOptEcho.o `test -f 'RelOptEcho.cpp' || echo '$(srcdir)/'`RelOptEcho.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libRelOptions_a-RelOptEcho.Tpo $(DEPDIR)/libRelOptions_a-RelOptEcho.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='RelOptEcho.cpp' object='libRelOptions_a-RelOptEcho.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libRelOptions_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libRelOptions_a-RelOptEcho.o `test -f 'RelOptEcho.cpp' || echo '$(srcdir)/'`RelOptEcho.cpp libRelOptions_a-RelOptEcho.obj: RelOptEcho.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libRelOptions_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libRelOptions_a-RelOptEcho.obj -MD -MP -MF $(DEPDIR)/libRelOptions_a-RelOptEcho.Tpo -c -o libRelOptions_a-RelOptEcho.obj `if test -f 'RelOptEcho.cpp'; then $(CYGPATH_W) 'RelOptEcho.cpp'; else $(CYGPATH_W) '$(srcdir)/RelOptEcho.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libRelOptions_a-RelOptEcho.Tpo $(DEPDIR)/libRelOptions_a-RelOptEcho.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='RelOptEcho.cpp' object='libRelOptions_a-RelOptEcho.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libRelOptions_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libRelOptions_a-RelOptEcho.obj `if test -f 'RelOptEcho.cpp'; then $(CYGPATH_W) 'RelOptEcho.cpp'; else $(CYGPATH_W) '$(srcdir)/RelOptEcho.cpp'; fi` libRelOptions_a-RelOptGeneric.o: RelOptGeneric.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libRelOptions_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libRelOptions_a-RelOptGeneric.o -MD -MP -MF $(DEPDIR)/libRelOptions_a-RelOptGeneric.Tpo -c -o libRelOptions_a-RelOptGeneric.o `test -f 'RelOptGeneric.cpp' || echo '$(srcdir)/'`RelOptGeneric.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libRelOptions_a-RelOptGeneric.Tpo $(DEPDIR)/libRelOptions_a-RelOptGeneric.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='RelOptGeneric.cpp' object='libRelOptions_a-RelOptGeneric.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libRelOptions_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libRelOptions_a-RelOptGeneric.o `test -f 'RelOptGeneric.cpp' || echo '$(srcdir)/'`RelOptGeneric.cpp libRelOptions_a-RelOptGeneric.obj: RelOptGeneric.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libRelOptions_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libRelOptions_a-RelOptGeneric.obj -MD -MP -MF $(DEPDIR)/libRelOptions_a-RelOptGeneric.Tpo -c -o libRelOptions_a-RelOptGeneric.obj `if test -f 'RelOptGeneric.cpp'; then $(CYGPATH_W) 'RelOptGeneric.cpp'; else $(CYGPATH_W) '$(srcdir)/RelOptGeneric.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libRelOptions_a-RelOptGeneric.Tpo $(DEPDIR)/libRelOptions_a-RelOptGeneric.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='RelOptGeneric.cpp' object='libRelOptions_a-RelOptGeneric.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libRelOptions_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libRelOptions_a-RelOptGeneric.obj `if test -f 'RelOptGeneric.cpp'; then $(CYGPATH_W) 'RelOptGeneric.cpp'; else $(CYGPATH_W) '$(srcdir)/RelOptGeneric.cpp'; fi` libRelOptions_a-RelOptInterfaceID.o: RelOptInterfaceID.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libRelOptions_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libRelOptions_a-RelOptInterfaceID.o -MD -MP -MF $(DEPDIR)/libRelOptions_a-RelOptInterfaceID.Tpo -c -o libRelOptions_a-RelOptInterfaceID.o `test -f 'RelOptInterfaceID.cpp' || echo '$(srcdir)/'`RelOptInterfaceID.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libRelOptions_a-RelOptInterfaceID.Tpo $(DEPDIR)/libRelOptions_a-RelOptInterfaceID.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='RelOptInterfaceID.cpp' object='libRelOptions_a-RelOptInterfaceID.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libRelOptions_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libRelOptions_a-RelOptInterfaceID.o `test -f 'RelOptInterfaceID.cpp' || echo '$(srcdir)/'`RelOptInterfaceID.cpp libRelOptions_a-RelOptInterfaceID.obj: RelOptInterfaceID.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libRelOptions_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libRelOptions_a-RelOptInterfaceID.obj -MD -MP -MF $(DEPDIR)/libRelOptions_a-RelOptInterfaceID.Tpo -c -o libRelOptions_a-RelOptInterfaceID.obj `if test -f 'RelOptInterfaceID.cpp'; then $(CYGPATH_W) 'RelOptInterfaceID.cpp'; else $(CYGPATH_W) '$(srcdir)/RelOptInterfaceID.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libRelOptions_a-RelOptInterfaceID.Tpo $(DEPDIR)/libRelOptions_a-RelOptInterfaceID.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='RelOptInterfaceID.cpp' object='libRelOptions_a-RelOptInterfaceID.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libRelOptions_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libRelOptions_a-RelOptInterfaceID.obj `if test -f 'RelOptInterfaceID.cpp'; then $(CYGPATH_W) 'RelOptInterfaceID.cpp'; else $(CYGPATH_W) '$(srcdir)/RelOptInterfaceID.cpp'; fi` libRelOptions_a-RelOptRelayMsg.o: RelOptRelayMsg.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libRelOptions_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libRelOptions_a-RelOptRelayMsg.o -MD -MP -MF $(DEPDIR)/libRelOptions_a-RelOptRelayMsg.Tpo -c -o libRelOptions_a-RelOptRelayMsg.o `test -f 'RelOptRelayMsg.cpp' || echo '$(srcdir)/'`RelOptRelayMsg.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libRelOptions_a-RelOptRelayMsg.Tpo $(DEPDIR)/libRelOptions_a-RelOptRelayMsg.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='RelOptRelayMsg.cpp' object='libRelOptions_a-RelOptRelayMsg.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libRelOptions_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libRelOptions_a-RelOptRelayMsg.o `test -f 'RelOptRelayMsg.cpp' || echo '$(srcdir)/'`RelOptRelayMsg.cpp libRelOptions_a-RelOptRelayMsg.obj: RelOptRelayMsg.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libRelOptions_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libRelOptions_a-RelOptRelayMsg.obj -MD -MP -MF $(DEPDIR)/libRelOptions_a-RelOptRelayMsg.Tpo -c -o libRelOptions_a-RelOptRelayMsg.obj `if test -f 'RelOptRelayMsg.cpp'; then $(CYGPATH_W) 'RelOptRelayMsg.cpp'; else $(CYGPATH_W) '$(srcdir)/RelOptRelayMsg.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libRelOptions_a-RelOptRelayMsg.Tpo $(DEPDIR)/libRelOptions_a-RelOptRelayMsg.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='RelOptRelayMsg.cpp' object='libRelOptions_a-RelOptRelayMsg.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libRelOptions_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libRelOptions_a-RelOptRelayMsg.obj `if test -f 'RelOptRelayMsg.cpp'; then $(CYGPATH_W) 'RelOptRelayMsg.cpp'; else $(CYGPATH_W) '$(srcdir)/RelOptRelayMsg.cpp'; fi` libRelOptions_a-RelOptRemoteID.o: RelOptRemoteID.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libRelOptions_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libRelOptions_a-RelOptRemoteID.o -MD -MP -MF $(DEPDIR)/libRelOptions_a-RelOptRemoteID.Tpo -c -o libRelOptions_a-RelOptRemoteID.o `test -f 'RelOptRemoteID.cpp' || echo '$(srcdir)/'`RelOptRemoteID.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libRelOptions_a-RelOptRemoteID.Tpo $(DEPDIR)/libRelOptions_a-RelOptRemoteID.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='RelOptRemoteID.cpp' object='libRelOptions_a-RelOptRemoteID.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libRelOptions_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libRelOptions_a-RelOptRemoteID.o `test -f 'RelOptRemoteID.cpp' || echo '$(srcdir)/'`RelOptRemoteID.cpp libRelOptions_a-RelOptRemoteID.obj: RelOptRemoteID.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libRelOptions_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libRelOptions_a-RelOptRemoteID.obj -MD -MP -MF $(DEPDIR)/libRelOptions_a-RelOptRemoteID.Tpo -c -o libRelOptions_a-RelOptRemoteID.obj `if test -f 'RelOptRemoteID.cpp'; then $(CYGPATH_W) 'RelOptRemoteID.cpp'; else $(CYGPATH_W) '$(srcdir)/RelOptRemoteID.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libRelOptions_a-RelOptRemoteID.Tpo $(DEPDIR)/libRelOptions_a-RelOptRemoteID.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='RelOptRemoteID.cpp' object='libRelOptions_a-RelOptRemoteID.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libRelOptions_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libRelOptions_a-RelOptRemoteID.obj `if test -f 'RelOptRemoteID.cpp'; then $(CYGPATH_W) 'RelOptRemoteID.cpp'; else $(CYGPATH_W) '$(srcdir)/RelOptRemoteID.cpp'; fi` mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LIBRARIES) installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool clean-noinstLIBRARIES \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \ clean-libtool clean-noinstLIBRARIES cscopelist-am ctags \ ctags-am distclean distclean-compile distclean-generic \ distclean-libtool distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-dvi install-dvi-am install-exec \ install-exec-am install-html install-html-am install-info \ install-info-am install-man install-pdf install-pdf-am \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ tags tags-am uninstall uninstall-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: dibbler-1.0.1/RelOptions/RelOptRelayMsg.cpp0000664000175000017500000000113412233256142015511 00000000000000/* * Dibbler - a portable DHCPv6 * * authors: Tomasz Mrugalski * Marek Senderski * * released under GNU GPL v2 licence * * $Id: RelOptRelayMsg.cpp,v 1.2 2005-01-11 23:35:22 thomson Exp $ * * $Log: not supported by cvs2svn $ * Revision 1.1 2005/01/11 22:53:36 thomson * Relay skeleton implemented. * */ #include "OptGeneric.h" #include "RelOptRelayMsg.h" TRelOptRelayMsg::TRelOptRelayMsg(char* buf, int bufsize, TMsg* parent) :TOptGeneric(OPTION_RELAY_MSG, buf, bufsize, parent){ } bool TRelOptRelayMsg::doDuties() { return true; } dibbler-1.0.1/CHANGELOG0000664000175000017500000010007412561661764011271 00000000000000 Dibbler changelog ------------------- 1.0.1 [2015-08-09] - Fixed code for NoAddrsAvailable case (thanks to Etienne Buira for reporting the issue and providing excellent patch) - Mac OS 10.10 compilation fix - Several typos fixed in logs (bug #319, thanks to Jirka Klimes for his patch) - GPL v2 license corrected (no worries, it's still open software, just corrected FSF address) Thanks to Ihar Hrachyshka for spotting this one. - Generated radvd.conf is now specifying AdvValidLifetime (bug #314) - Server now properly assigns valid-lifetime for reserved out-of-pool reservations (bug #300). 1.0.1RC1 [2015-03-07] - prefix update is now implemented for Linux (both kernel and radvd.conf) - It is now possible to specify the address client will use to communicate (bind-to-address) in the client.conf - The client's working directory can be overridden with -w on command line. This will cause all files (.conf, .pid, etc.) to be created or read from that directory). - Removed server caching - Time calculations workaround (thanks to Baodong Li for the patch!) - Improvements in bind-to-address (thanks to Baodong Li fo the patch!) 1.0.0 [2014-11-07] - Added missing includes for NetBSD (and probably other BSDs). Thanks to Justin Cormack for providing a patch. - Fix for client crash if PD was requested, the server returned IA_PD, but without any IAPREFIX options inside. Added better checks. Thanks to Maciej Fijalkowski for providing a patch. - Cli: Received options are now applied in stateless mode (bug #246) - Rel: remote-id option is now being inserted correctly (RFC4649) - Rel: Relay agent is now able to insert relay-id option (RFC5460) - Rel: Relay agent is now able to insert client link-layer address option (RFC6939) - Srv: drop-unicast added. Server is now able to respond with status code set to UseMulticast if a client sent his packets to unicast. According to author's knowledge this was the last missing functionality of RFC3315. 1.0.0RC2 [2014-07-12] - Cli: segfault when invalid or incomplete auth parameters are specified Thanks to George Joseph for a patch (bug #289) - Srv: fixed leases are not added to AddrMgr. Thanks to George Joseph for a patch (bug #291) - Log message fixed. Thanks to George Joseph for a patch (bug #292) - Client options are now passed to notify scripts (bug #293) - Fedora RPM script contributted by Patrick Pichon, thanks! - Srv: Experimental performance-mode added - Compliation fix for Mac OS X 10.9/Apple LLVM 5.0 (clang-500) - The code compiles again with --disable-auth - Cli: does not send or expect AUTH option by default. - Win: Service dependency fixed for Vista and above - Notify script called only when non-empty script name specified. (thanks to Hernan Martinez for contributed patches) - Support for ppc64le architecture added (thanks to Snehal for sending patches) Dibbler now uses alpha version of libtool 2.4.2.418, which features fixes for ppc64le. - Cli/Srv: no longer crashes when reconfigure-key is empty (thanks to Hernan Martinez for fixing this!) - Doc update: vendor-spec options examples are now updated (thanks to Michael Rapoport for spotting this) - Win: detection whether client is run with administrative privileges - gtest tests linking problem on Ubuntu 13.10 fixed. Sort of. The tests are not linked statically by default. There is a --enable-gtest-static flag that controls that behaviour. - Minor Developer's Guide update. - Srv: reconfigure-enabled 0,1 directive added to the server. It controls whether server sends RECONFIGURE messages at start-up. - Srv: received prefix is now being truncated to appropriate length, so client sending prefix hints with host part set should no longer confuse the server (bug #295) - Win: Better shutdown when shutting down from Microsoft Mgmt Console (bug #162) (Thanks to Hernan Martinez for the fix!) - Added support for IPv6 address in vendor-specific information option, and fixed bugs in other vendor-specific options formats (based on a patch provided by Herman Martinez, thanks!) - Srv: Unicast address of IA_PD stored in the database is no longer lost after server restarts. That should make the reconfigure mechanism usable again. - Linux: daemon shutdown improvement. There was a possibility that the daemon will stall while shutting down. Thanks to Petr Pisar for providing a patch! (bug #251) - Cli: Dibbler now configures received addresses with /128 prefix, as mandated by the RFCs. In versions 0.5.0 to 1.0.0RC1 it used to be /64, which was an arbitrarily chosen value that happened to work in most, but not all cases. Please see discussion in https://klub.com.pl/bugzilla3/show_bug.cgi?id=222 for details (bug #222) - Srv: Fix in remote-id option support. Thanks to Richard Ouseph for providing a patch. (bug #299) - Srv: Multiple instances of vendor-options with the same vendor-id are now sent as one option with multiple sub-options, as clarified in RFC3315bis (bug #304) - Win32 Cli: Address lifetimes are now properly renewed. Thanks to Shine for the patch! - Srv: Fixed calculations for available prefixes if the was a lot of prefixes (more than 2^30) (bug #295) - Cli: It is possible to disable prefix split by passing "none" to downlink-prefix-ifaces (bug #306, github #10) - Cli: Ability to define prefix parameter to be sent as hints. Thanks to Maciek Fijalkowski for the patch! - Cli: Updated syntax for sending address hints. See section 6.8.3 in the User's Guide for details. - Cli: Sanity checks added: client now refuses to mix stateless with ia,ta,pd options. Thanks to Arifumi Matsumoto for reporting this issue! - Cli: empty inf-request messages should no longer be sent. Thanks to Arifumi Matsumoto for reporting this issue! - Cli: information refresh time option can only be used in stateless mode. - Cli: invalid prefixes (pref > valid) are now rejected (bug #308) - Srv: Support for remote-id fixed. Thanks to Richard Ouseph for the patch (bug #299) - Win: Migrated to Visual Studio 2013 Express. All files from previous VS were removed. 1.0.0RC1 [2013-07-30] - Reconfigure support (original patch by Grzegorz Pluto + tons of fixes) - Authentication rewritten (now uses RFC3315 option formats) - Auth: support for reconfigure-key added - Auth: support for delayed authentication - Linux: support for M,O bits reading from Router Advertisements (bug #49) - Srv: server no longer crashes when options are defined in global scope (issue reported by Michael Thorsager, thanks!) - Srv: database sanitization now works also for relays (bug #288) (issue reported by Michael Thorsager, thanks!) - After 10 years of development, all features from RFC3315 are now supported! (there are outstanding bugs, though...) 0.8.4 [2013-06-27] - Rel: Unknown message types are now relayed (as a forward compatibility feature) - Cli: DOWNLINK_PREFIX_IFACES and DOWNLINK_PREFIXES variables are now passed to the notify script (bug #265) - AC_FUNC_MALLOC/AC_FUNC_REALLOC are no longer used - OpenBSD bug workaround for invalid link-local addresses reported is now extended to all other BSDs as this affects pfSense as well - Cli/Srv: interface names are stored in *-AddrMgr.xml - Srv: Database is now checked against missing or interface index changes (bugs #192, #247, #250) - Cli: Database is now checked against missing or interface index changes (bugs #192, #247, #250) - Srv: Temporary addresses are now stored in the database (bug #284) - Cli: Temporary addresses are now expired and removed properly (bug #285) - Linux: pthreads is now linked only when --enable-link-state is used (bug #249) - Srv: Buffer for incoming UDP packets increased to 64k - Srv: incoming packet destination address check is disabled by default and can be enabled with --enable-dst-addr-check parameter (bug #286) 0.8.4RC1 [2013-04-27] - Inteface-ids shorter than 4 bytes are not handled properly (patch by Tao Cui) - It is now possible to send custom options (hex, string, address or address-list is supported for now, but other data formats may be added in the future) - Responses to packets sent from global addresses are now sent via sockets bound to global addresses - Server now properly calculates number of available addresses and prefixes after expiration (bug #264) - Srv: info about second and following relays are now passed to the script properly - Cli: fix for a double free in error handing (if file read failed). Thanks to Jean-Jacques Sarton for reporting and providing patch (bug #266) - client.vendor-class.en and client.vendor-class.data expressions are now supported (but not tested yet) - Srv: Relay support refactored. Unknown options are now handled better and any development related to relays will be easier - Srv: logical relay interfaces are no longer present in server-IfaceMgr.xml - Classes for USER_CLASS and VENDOR_CLASS options implemented. - Linux: stop command fix (bug #268) - Win32: dibbler waits for netsh.exe execution completion, because netsh.exe does not seem to be reentrant - Win32: DNS configuration is now flushed during the first DNS configuration - Win32: Client no longer crashes when expired addresses is used with confirm support enabled - Cli: "option fqdn" now contains hostname by default (bug #267) - Win32: Client inactive-mode improvements (patch by Vaclav Michalek) - Compilation fix for Mac OS X 10.8.0 (bug #277), patch by Michael Thorsager - Linux: cosmetic low-level Linux improvements (bug #276) - FQDN option improvements (fully qualified, hostname only and empty options) are now supported - Daemon mode should now be able to read sockets properly (bug #275) (patch by Jean-Jacques Sarton) - Linux compilation fixes (bug #282) - Srv: Confirm support improved, now also using subnet declaration (bug #240, bug #259) 0.8.3 [2013-01-20] - Cli: workaround for odd link-local interface detection code on OpenBSD - AFTR option on-wire encoding fixed - Compilation fix in Port-linux/interface.c on CentOS 5.x - DUID is now written properly on 64 bit Windows - Resource leak (socket not closed) in iterface detection fixed (bug #255) 0.8.3RC1 [2012-08-17] - Srv: address and prefix assignment rewritten - Srv: implemented per-client prefix configuration - Cli: Reasons for rejecting IA_NA/IA_PD are now logged (i.e. T1>T2) - Cli: client no longer crashes when server's reply does not included expected IA_PD - gcc4.6 compilation warnings removed - added missing header in ClntIfaceIface.h (debian #672003) - debian/ directory is moved to debian branch and no longer available on master - Many cppcheck/doxygen warnings removed - Srv: Refactoring continues another 11 classes removed. - Srv: NIS, NIS+, SIP, DNS, Domain, NTP and Lifetime options are now handled through unified option handling mechanism. Server code should be smaller now. - Cli: support for resolvconf tool added (see --enable-resolvconf parameter) - Srv: out-of-pool reservations now use T1,T2,preferred,valid times from the interface - Rel: Recent regression (complain about server and client on the same link) fixed - Srv: relays parameters (link, peer address) are now passed to the notify script - Cli: client no longer crashes, when client-AddrMgr.xml is empty (bug #245) - Srv: Secure DNS Update (using TSIG) is now supported - Srv: Expired leases are now removed from the DNS (using DNS Update) - Srv: Many smaller FQDN related fixes - Srv: Support for FQDN-related data in server-AddrMgr.xml improved - Srv: Server no longer loads empty IAs or empty clients from server-AddrMgr.xml - Experimental port to Solaris 11 - Srv: Cached entries for reserved address/prefix will no longer cause server to assign reserved address/prefix to another client - Srv: Fixed problem when reserved address/prefix was assigned to different client when nearing addresses/prefixes depletion - Cli: Script can now be called in stateless mode (inf-request) - Cli: Script for MacOS dns and domain setting added - Cli: Silent address expiration (T1>valid lifetime) is now supported properly - Cli/Srv: FQDN, Vendor options are now passed to script correctly - Cli: IAID is now parsed properly in PD definitions in client-AddrMgr.xml - Cli: Silent prefix expiration (T1>valid lifetime) is now supported properly - Srv: Skeleton functions for logging MAC address added 0.8.2 [2012-02-29] - Cli: code refactoring. Code is now a bit smaller. Removed classes: ClntOpt*Servers, ClntOpt*Domain. Client binary is now smaller by 36kb (exact size is architecture dependent) - Srv: code refactoring, similar to client. Code is now a bit smaller. Removed classes: SrvOpt*Server, SrvOpt*Domain. - Cli/Srv: NIS, NIS+ domains are now encoded properly by client and server (bug #223, #227) - Example configs are now using 2001:db8:1:: prefix dedicated to testing and example purposes - Cli: Fix for prefix delegation segfault (bug #236) - Srv: CONFIRM messages are now supported properly (partial fix for bug #240) - Cli: Prefix split is now done properly, even for prefix lengths not divisible by 8 - Cli: It is now possible to specify downlink interfaces for prefix delegation (downlink-prefix-ifaces) - Cli: prefixes are now refreshed properly, even when system prefix configuration failed (bug #238) - Cli: client no longer segfaults when temporary addresses are requested (bug #241, debian 659476) - Cli: client no longer transmits SOLICIT every second if some requested (addresses or prefixes) are not available, but rather uses exponential back-off (bug #238) - Cli/Srv: syntax for custom options defined using hex notation has changed (bug #235) - Doc: Developer's guide now generates properly (bug #215) - Cli: When using fqdn, client by default requests server to do DNS Update (S bit = 1) 0.8.1 [2011-12-31] - Srv: Prefixes are now expired properly. - Cli/Srv: IFINDEX variable is now set properly in notify scripts. - Srv: Notify script is now called when lease is expired. (bug #216) - Srv: Existing prefix lease is now assigned to returning clients if exists (bug #224) 0.8.1RC1 [2011-11-11] - Fixed socket binding problem on server that may affect relay scenarios - Fixed segmentation fault when interface-id was not defined on relay interface. - Makefiles reworked - Srv/Cli: Implemented support for DNS Update over UDP (ddns-protocol directive) - Srv/Cli: Implemented support for DNS Update timeout (ddns-timeout directive) - Fixed problem with possible PD crash - Linux: radvd.conf generation improved in PD - Fix: server/client will no longer load DUID empty file (bug #209) - Cli: no longer confused when receiving delegated prefix, but there are no suitable interfaces - Srv: server now caches assinged prefixes (bug #217) - Cli: support for notify script execution reimplemented (bugs #207, #216) - Makefile system rewritten (using autotools now for better portability) - Srv: server now calls external script when assigning or releasing delegated prefix (bug #205) - FreeBSD,NetBSD,OpenBSD compilation successful (not tested yet, consider it experimental) - Google test framework added for unittests. There are only handful tests implemented now, but the number is expected to grow - Fix: alignment memory reads, tested on ARMv5 (bug #221) - Changed default number of addresses allowed per client from millions to 10 - Srv: number of currently allocated prefixes is set correctly after restart and database reload - Several server and client fixes for DNS Update - Cli: Obsolete "no-ia" statement removed. Corrected spelling of "preferred" in config parser. - It is now possible to specify IAID for PD - Doc: Rather large User's Guide update - Support for RFC6334 (DS-Lite tunnels) added - Support for routing configuration added (draft-ietf-mif-dhcpv6-route-option-03) 0.8.0 [2011-05-11] - Fixed compilation problems - Fix: client, server and relay no longer leave PID file after failed start - Fix: error in detecting MAC addresses on Mac - Fix: several crashes introduced in 0.8.0RC1 fixed - Fix: client no longer gets confused when requesting IA, TA and PD - Fix: Server now sends back rapid-commit option - Srv: It is now possible to specify how server should handle unknown FQDNs from clients - Srv: It is now possible to specify DDNS server address, used during DNS Updates - Doc: Fixed bug in example in server man page - Srv: answers to RENEW are now constructed properly (single SERVERID is enough) - All: Inteface link address is now detected properly on Mac OS X - All: Many Mac OS port fixes. It should be operational now. - Linux: client now adds addresses with proper preferred/valid lifetimes - Linux: client now properly updates addresses during renew/rebind - Cli: Client now properly copies prefixes from ADVERTISE to REQUEST (bug #197) - Cli: RELEASE is now sent properly if there are only prefixes, and no addresses (bug #196) - Cli: It is now possible to define serveral prefixes in one pd - Cli: It is now possible to define specific prefix in pd as a hint - Cli: T1,T2 are now properly set for PD - Cli: Duplicate IA,TA and PD are no longer created in database, when restarting client with existing leases. - Cli: Client no longer silently quits, if adding/updating prefix failed. - Linux/Mac OS: daemonizing should close stdin/stdout/stderr (bug #188) - Linux: detecting link state change no longer takes 100% CPU - All: Vendor spec support improved (new definition format is simpler) (bug #173) - Cli: client now waits for longer periods, rather than 1 s - Srv: Server now creates separate socket for transmission and not use multicast socket (bug #200) - Rel: TRelOptRemoteID compilation fix - Srv/Cli: DS-List draft updated to latest, approved version (ds-lite-tunnel-10) (bugs #203, #204) 0.8.0RC1 [2010-09-17] - Linux: CONFIRM support added - Support for Windows 7 added - Server reloads its database after shutdown/start sequence - Client with enabled unicast now uses global source addresses - Linux: console logging now has color support - Srv/Cli: DUID in format 00:01:02:03 is now supported in config files (0x010203 format is still supported) - It is now possible to configure IAID - Support for Mac OS X added (experimental, of course) - Server: DS-Lite tunnel options added - Client: Partial support for DS-Lite tunnel option added - Experimental support for Remote Autoconf added - Fixed problem with not populating AddrMgr correctly - Fix: after restart, server no longer refuses to handle addresses after first RELEASE. - Fix: Notify scripts are now executed, even when no IA received (bug #193) - Code cleanup: Singleton managers implemented - Code cleanup: Server REPLY generation refactored - Code cleanup: Many obsolete classes removed - Code cleanup: Obsolete tunnel endpoint removed - Code cleanup: Obsolete VS2003 and VS2005 files removed 0.7.3 [2009-03-09] - Linux: Fix for compilation with libc6, version 2.8 - New timezone option support added (by Petr Pisar) (bug #185) - Linux: Syslog support added (by Petr Pisar) (bug #184) - Double timezone removal fixed (by Petr Pisar) (bug #183) - Timezone support implemented in Linux systems (by Petr Pisar) (bug #182) - Interface-ids other than 4 bytes long are now supported (bug #179) - Cli/Srv: Empty FQDN option problem fixed (bug #186 and #187) - Srv: Client classification implemented - Linux: Pid is now stored in pid_t type (bug #180) - Cli: /etc/resolv.conf support improved - Linux: Race condition in stop/start fixed (bug #181) 0.7.2 [2008-08-31] - Cli: external scripts may now be executed - Cli: addresses are now added properly in autodetect-mode - Cli: DNS server is now configured properly under Windows XP/Vista - Srv: client's FQDN hints may now be honored - Srv: support for extra options added - Experimental CONFIRM support added (+extra fixes) - Cli: requested options are now sent in RENEW messages - Cli: elapsed option is now sent in all messages - Cli: client does not get confused when running in autodetect mode and there are no suitable interfaces 0.7.1 [2008-06-18] - Linux: Prefixes starting with a-f are now supported properly (bug #171) - /etc/resolv.conf update bug fixed (bug #161) - Srv/Cli: Experimental authentication and authorization added (bugs #79, #80) - All: Return codes are now proper under Linux (bug #175) - Srv: supports out of addresses scenario properly (bug #177) - Cli: ADVERTISE with empty IAs are now discarded properly - Cli: supports TA properly - Cli: stateless insist-mode implemented - Srv/Rel: RemoteID support added - Srv/Rel: Echo Request Option support added - Srv: Prefixes with lengths not divisible by 8 are now supported properly - Srv: Guess-mode implemented (relay's interface-id don't have to be specified anymore) - Cli: FQDN S bit is now configurable - Srv: reply for CONFIRM now contains server-id (fixed long time ago, probably in 0.6.1) (bug #163) - Numerous fixes after 3rd bakeoff meeting (Philadelphia) 0.7.0 [was never properly released] 0.7.0RC1 [2007-12-31] - Leasequery support (new entity: requestor added) - Numerous fixes after 2nd bakeoff meeting (Vancouver) - CLI: REQUEST is sent to multicast when unicast option is supported (because client does not have address with sufficient scope) - Fix in all string options (like domain name or nis domain) - Fix in DNS Update (memory corruption fixed) - Documentation updated. 0.6.1 [2007-09-09] - Srv: Inactive mode implemented (bug #168) - Srv: When assigning fewer address than requested, status is now set to success - Srv: proper status code is returned when temporary addresses are not supported - cross-compilation is now possible (bug #169) - Make -j2 now works (bug #130) - gcc 4.3.0 conformance - Security: Possible segfault in REBIND processing fix - Srv: CONFIRM message contents are now validated properly (bug #165) - Security: Vendor-specific information Option possible segfault - Srv: Option Request Option parsing fixed (bug #166) - Security: Option Request Option possible segfault (bug #167) - Security: invalid length field parsing fixed (bug #164) - Security: world writable files are no longer created (bug #160) 0.6.0 [2007-05-05] - Configuration file examples are now described better - Documentation update (Dibbler User's Guide is now 60+ pages long) - Clnt: false positive DECLINE fixed (bug #153) - Srv: Does not go into infinite loop when there are no more prefixes to assign - Clnt: supports REBIND with prefixes (IA_PD) included - Srv: supports REBIND with prefixes (IA_PD) included - Srv: Sends the same addresses if client still has valid bindings (i.e. REQUEST retransmission) (bug #154) - Srv: Prefix delegation now supports more than one client properly - Srv: Support for more than 1 relay fixed (bug #156) - Srv: interface-id option location in the RELAY-REPL is now configurable - Relay: interface-id option parsing improved - Relay: interface-id option location in the RELAY-FORW is now configurable - Fix for print invalid MAC addresses. - Decline procedure is now working as expected - NTP is now removed properly (bug #159) - Fix for compilation in RedHat Enterprise Linux 4 - Fixes for gcc 4.3 compilation - Clnt: Cause of bind failure is now reported in Linux - Clnt: Another fix for not operational interface (bug #133) - Clnt: client-CfgMgr.xml is now formed properly (bug #158) 0.6.0RC4 [2007-03-31] - Clnt: Preliminary support for inactive-mode (bug #133) - Clnt: Preliminary support for insist-mode (bug #146) - Clnt: Support for DUID type 2 (Enterprise number) added (bug #148) - Clnt: T1=T2=0 is now handled properly (bug #145) - Clnt: REQUEST now contains addresses offered in ADVERTISE (bug #152) - Clnt: Received advertise(s) + preference are now printed (sorted). - Clnt: No longer gets confused if there is no reply to REQUEST message (bug #147) - Clnt: Chooses server properly when there are more then one server (bug #151) - Clnt: Prefixes are split properly when forwarding is enabled - Clnt: /etc/resolv.conf update improved - Clnt/Srv: Time is now used properly during DUID-LLT creation (bug #149) - Srv: Does not complain anymore, when receives message addressed to a different server (bug #157) - Srv: No longer crashes when is unable to find relay (bug #144) - Relay: Global peer-addr field was not set properly in RELAY-FORw (bug #143) 0.6.0RC3 [2007-03-14] - Relay: Global address fix - Relay: Guess mode implemented - All: Support for anonymous INF-REQUEST added - Server: Does not crash during DNS Update, when DNS are not defined (bug #142) - Client: Large timeouts does not confuse client anymore (bug #141) - Client: Prefix deletation support in REBIND improved 0.6.0RC2 [2007-02-25] - Linux: fixed segfault on interfaces with no link-local addresses, e.g. tun devices (bug #136, #140) - Linux: NTP servers are now set up properly (bug #138, #139) 0.6.0RC1 [2007-02-03] - All: Server, client and relay no longer crash, when run on Windows with IPv6 disabled. (Bug #134) - All: Prefix-delegation is now supported (still some work is needed, e.g. docs and bugfixes) - All: Support for multiple prefixes has been added - Vendor-spec information option is now supported - Clnt: renewal works ok, if client wakes up "late" (bug #125) - Srv: Per-client configuration is now possible (so called exceptions) - Clnt: DUID type change (preliminary support) - All: DUID bug fixed (resulted in changing duid in each srv/cli execution) - All: Elapsed option has now correct length (issue introduced in 0.5.0) (bug #127) - Clnt: Elapsed option increases its value, when message is retransmitted. - All: Required/not allowed options check improved (now you will know why message is dropped) - Linux: iproute2 package update to version 20051007 (latest stable available in Debian and Ubuntu) - Lots of memory fixes (found by using Valgrind) - Linux: multiple domains are now added and removed properly to /etc/resolv.conf - Linux: NTP servers are now set up properly. (bug #138, #139) - All: Messages with reconfigure-accept or vendor-class options are now accepted 0.5.0 [2006-10-05] - FQDN fixes - Documentation update and cleanup 0.5.0-RC1 [2006-08-30] - FQDN Support (DNS Updates) support added - Support for temporary addresses (TA) added - Server cache added - log-mode PRECISE added - log entries are appended (previously log files were overwritten at startup) - Modular features (optional compilation of additional features) added - Clnt: Addresses are added with /64 prefix by default (use strict-rfc-no-routing to use previous behavior, i.e. /128 prefix) 0.4.2 [2006-02-03] (DSFG cleanup release) - No bugfixes or new features - Debian Free Software Guidelines (i.e. headers in source files, removed non-free files) - Unnecessary files removed 0.4.1 [2005-08-07] - Windows NT/2000 support added. - Numerous examples added to User's Guide. - Srv: Class/prefix syntax is now supported (bug #121) - White list support improved (bug #120) - Win32: -d parameter is now optional - Greatly improved relay support: 2 relay cascade connection, Cisco interoperability etc. (bug #107) - Win32: apps no longer die quietly during interface detection (bug #117) - Linux: Stale PID file no longer confuses server,client or relay. 0.4.0 [2005-03-15] - white list (accept-only) works ok (bug #106) 0.4.0-RC2 [2005-03-08] - Domain List option is now properly built and parsed (bug #104) - Srv/Clnt/Relay no longer crash when invalid interface is specified (bug #105) - Server stateless mode fixed (bug #103) - /etc/init.d scripts are provided for Debian,PLD and Gentoo (bug #94, #95) 0.4.0-RC1 [2005-02-03] - Relay implemented - Win32: start/stop command are now working (bug #27) - Win32: status command now shows if service is running (bug #28) - Server now supports relays (bug #70) - Working directories are not properly stored in the *-CfgMgr.xml files (bug #100) - Linux: Paths to config files fixed (bugs #96, #97) 0.3.1 [2004-12-27] (bugfix release) - Documenatation (PDF files) now should look ok on all systems - Linux: URLs in the manual are now visible (bugs #92, #93) - Problem with interfaces without link local address (e.g. downed sit0) fixed (bugs #90, #91) - Linux: DEB packages are now generated (bugs #65, #66) 0.3.0 [2004-12-16] - Linux: make install was implemented (bugs #86, #87) - Linux: man pages were created (buf #61, #62) - Linux: RPM package prepared (bugs #63, #64) - Windows installer (bugs #59, #60) - Client now can handle denied REPLY for RENEW in a sanite way (bug #53) - Client now removes expired addresses (bug #15) - Server and client no longer supports link local addresses (bug #38, #39) - Linux: Fixed issue with running server and client on the same host (bug #56) - Server now supports stateless mode (bug #71) - Developer's guide (bugs #42, #43) - Log files are now created, even when run in the console (bugs #34, #36) - DAD timeout was decreased to 1 second - NIS options values are changed to meet recently published RFC3898 - Server now supports domains containing - (bug #73) - Linux: /etc/resolv.conf no longer gets corrupted if not ended with CR (bug #74) - Multiple instantions are no longer allowed (bug #2) - Client requests for Lifetime option only if explicitly told to do so (bug #75) - Server now properly retransmits messages. - Client no longer sends RapidCommit unless told to do so (bug #55) - Client no longer retrasmits indefinetly INF-REQUEST message. 0.3.0-RC2 - Fixed bug found by PCSS team regarding improper socket initialization in ClntTransMgr. - Server now properly supports clients which send IA without IAADDR included. 0.3.0-RC1 - Socket binding has changes (no more REUSE_ADDR). See RELNOTES for details. - New options: SIP-SERVERS, SIP-DOMAINS, NIS-SERVERS, NIS-DOMAIN, NIS+-SERVERS, NIS+-DOMAIN, LIFETIME - Option renewal mechanism (Lifetime option) - Fixed issues with large timeouts (signed/unsigned problem) - Assigned options are now stored in files in working directory (besides of setting them up in the system) - Parsers are now more robust and more verbose in case of invalid config files. - Server granting incorrect valid lifetime values fixed (bug #57) 0.2.1 was never released 0.2.1-RC1 - Windows2003 is now supported. - WIN32: netsh.exe is used instead of depreciated ipv6.exe (bug #24, #48) - First version of Developer's guide is included (bug #42, #43) - WIN32: DNS is now properly added to interface. (Adv.NetworkingPack or SP2 might be necessary) - Unicast communication support (bug #30,#31) - RAPID-COMMIT support fixed (bug #50, #51, #52) - DECLINE infinite loop fixed. - DECLINE and RELEASE does no longer contain addrs with non-zero pref/valid lifetimes (bug #32) - Invalid address parsing fixed. - YES,NO,TRUE and FALSE can now be used in config files instead of 0 or 1. 0.2.0 - WinXP: client displays help when command line parameters are incorrect. - Windows 2000 is no longer supported. 0.2.0-RC2 - Linux server send replies on proper interface. - Windows server/client no longer loops when interface is down. 0.2.0-RC1 - Console commands are common on WindowsXP and Linux - Parsers are now a lot more reliable - Full (without ::) addresses are now parsed properly - Srv: Address management rewritten (removed that nasty bug) - Srv: No longer ingores IA when client didn't include IAADDR option. - Srv: Now properly creates DUID (bug #45, #46) - Doc: a real documentation included - Srv: class-max-lease, iface-max-lease parameters added - Client: config file logic changed, no-config is no longer needed. - Client: No more stupid "Interface is loopback, down, not multicast-capable or not present in the system" message. - Linux: Sending through wrong interface problem fixed - Linux: build process rewritten 0.1.1 - Hmmm... don't remember :) 0.1.0 - First release For details regarding bugs and requested features, see http://klub.com.pl/bugzilla/ dibbler-1.0.1/CfgMgr/0000775000175000017500000000000012561700417011267 500000000000000dibbler-1.0.1/CfgMgr/tests/0000775000175000017500000000000012561700417012431 500000000000000dibbler-1.0.1/CfgMgr/tests/run_tests.cc0000664000175000017500000000031712233256142014704 00000000000000 #define STDC_HEADERS 1 #include #include int main(int argc, char* argv[]) { testing::InitGoogleTest(&argc, argv); int status = RUN_ALL_TESTS(); return status; } dibbler-1.0.1/CfgMgr/tests/Makefile.am0000664000175000017500000000112412233256142014400 00000000000000AM_CPPFLAGS = -I$(top_srcdir)/Misc AM_CPPFLAGS += -I$(top_srcdir)/CfgMgr # This is to workaround long long in gtest.h AM_CPPFLAGS += $(GTEST_INCLUDES) -Wno-long-long -Wno-variadic-macros TESTS = if HAVE_GTEST TESTS += CfgMgr_tests CfgMgr_tests_SOURCES = run_tests.cc CfgMgr_tests_SOURCES += HostID_unittest.cc CfgMgr_tests_SOURCES += HostRange_unittest.cc CfgMgr_tests_LDFLAGS = $(AM_LDFLAGS) $(GTEST_LDFLAGS) CfgMgr_tests_LDADD = $(GTEST_LDADD) CfgMgr_tests_LDADD += $(top_builddir)/CfgMgr/libCfgMgr.a CfgMgr_tests_LDADD += $(top_builddir)/Misc/libMisc.a endif noinst_PROGRAMS = $(TESTS) dibbler-1.0.1/CfgMgr/tests/HostID_unittest.cc0000664000175000017500000000054012233256142015745 00000000000000#include "IPv6Addr.h" #include "DUID.h" #include "HostID.h" #include namespace { TEST(HostIDTest, constructor) { SPtr addr = new TIPv6Addr("fe80::abcd", true); SPtr duid = new TDUID("00:01:02:03:04"); SPtr host1 = new THostID(addr); /// @todo: implement tests for HostID class } } dibbler-1.0.1/CfgMgr/tests/HostRange_unittest.cc0000664000175000017500000000056512233256142016514 00000000000000#include "IPv6Addr.h" #include "DUID.h" #include "HostRange.h" #include namespace { TEST(HostRangeTest, constructor) { SPtr addr1 = new TIPv6Addr("fe80::1", true); SPtr addr2 = new TIPv6Addr("fe80::ffff", true); SPtr range = new THostRange(addr1, addr2); /// @todo: implement tests for HostRange } } dibbler-1.0.1/CfgMgr/tests/Makefile.in0000664000175000017500000010013612561652534014425 00000000000000# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ TESTS = $(am__EXEEXT_1) @HAVE_GTEST_TRUE@am__append_1 = CfgMgr_tests noinst_PROGRAMS = $(am__EXEEXT_2) subdir = CfgMgr/tests DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/depcomp $(top_srcdir)/test-driver ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/libtool.m4 \ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/include/dibbler-config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = @HAVE_GTEST_TRUE@am__EXEEXT_1 = CfgMgr_tests$(EXEEXT) am__EXEEXT_2 = $(am__EXEEXT_1) PROGRAMS = $(noinst_PROGRAMS) am__CfgMgr_tests_SOURCES_DIST = run_tests.cc HostID_unittest.cc \ HostRange_unittest.cc @HAVE_GTEST_TRUE@am_CfgMgr_tests_OBJECTS = run_tests.$(OBJEXT) \ @HAVE_GTEST_TRUE@ HostID_unittest.$(OBJEXT) \ @HAVE_GTEST_TRUE@ HostRange_unittest.$(OBJEXT) CfgMgr_tests_OBJECTS = $(am_CfgMgr_tests_OBJECTS) am__DEPENDENCIES_1 = @HAVE_GTEST_TRUE@CfgMgr_tests_DEPENDENCIES = $(am__DEPENDENCIES_1) \ @HAVE_GTEST_TRUE@ $(top_builddir)/CfgMgr/libCfgMgr.a \ @HAVE_GTEST_TRUE@ $(top_builddir)/Misc/libMisc.a AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = CfgMgr_tests_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \ $(CXXFLAGS) $(CfgMgr_tests_LDFLAGS) $(LDFLAGS) -o $@ AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)/include depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) LTCXXCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CXXFLAGS) $(CXXFLAGS) AM_V_CXX = $(am__v_CXX_@AM_V@) am__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@) am__v_CXX_0 = @echo " CXX " $@; am__v_CXX_1 = CXXLD = $(CXX) CXXLINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \ $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CXXLD = $(am__v_CXXLD_@AM_V@) am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@) am__v_CXXLD_0 = @echo " CXXLD " $@; am__v_CXXLD_1 = SOURCES = $(CfgMgr_tests_SOURCES) DIST_SOURCES = $(am__CfgMgr_tests_SOURCES_DIST) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags am__tty_colors_dummy = \ mgn= red= grn= lgn= blu= brg= std=; \ am__color_tests=no am__tty_colors = { \ $(am__tty_colors_dummy); \ if test "X$(AM_COLOR_TESTS)" = Xno; then \ am__color_tests=no; \ elif test "X$(AM_COLOR_TESTS)" = Xalways; then \ am__color_tests=yes; \ elif test "X$$TERM" != Xdumb && { test -t 1; } 2>/dev/null; then \ am__color_tests=yes; \ fi; \ if test $$am__color_tests = yes; then \ red=''; \ grn=''; \ lgn=''; \ blu=''; \ mgn=''; \ brg=''; \ std=''; \ fi; \ } am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__recheck_rx = ^[ ]*:recheck:[ ]* am__global_test_result_rx = ^[ ]*:global-test-result:[ ]* am__copy_in_global_log_rx = ^[ ]*:copy-in-global-log:[ ]* # A command that, given a newline-separated list of test names on the # standard input, print the name of the tests that are to be re-run # upon "make recheck". am__list_recheck_tests = $(AWK) '{ \ recheck = 1; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ { \ if ((getline line2 < ($$0 ".log")) < 0) \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[nN][Oo]/) \ { \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[yY][eE][sS]/) \ { \ break; \ } \ }; \ if (recheck) \ print $$0; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # A command that, given a newline-separated list of test names on the # standard input, create the global log from their .trs and .log files. am__create_global_log = $(AWK) ' \ function fatal(msg) \ { \ print "fatal: making $@: " msg | "cat >&2"; \ exit 1; \ } \ function rst_section(header) \ { \ print header; \ len = length(header); \ for (i = 1; i <= len; i = i + 1) \ printf "="; \ printf "\n\n"; \ } \ { \ copy_in_global_log = 1; \ global_test_result = "RUN"; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".trs"); \ if (line ~ /$(am__global_test_result_rx)/) \ { \ sub("$(am__global_test_result_rx)", "", line); \ sub("[ ]*$$", "", line); \ global_test_result = line; \ } \ else if (line ~ /$(am__copy_in_global_log_rx)[nN][oO]/) \ copy_in_global_log = 0; \ }; \ if (copy_in_global_log) \ { \ rst_section(global_test_result ": " $$0); \ while ((rc = (getline line < ($$0 ".log"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".log"); \ print line; \ }; \ printf "\n"; \ }; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # Restructured Text title. am__rst_title = { sed 's/.*/ & /;h;s/./=/g;p;x;s/ *$$//;p;g' && echo; } # Solaris 10 'make', and several other traditional 'make' implementations, # pass "-e" to $(SHELL), and POSIX 2008 even requires this. Work around it # by disabling -e (using the XSI extension "set +e") if it's set. am__sh_e_setup = case $$- in *e*) set +e;; esac # Default flags passed to test drivers. am__common_driver_flags = \ --color-tests "$$am__color_tests" \ --enable-hard-errors "$$am__enable_hard_errors" \ --expect-failure "$$am__expect_failure" # To be inserted before the command running the test. Creates the # directory for the log if needed. Stores in $dir the directory # containing $f, in $tst the test, in $log the log. Executes the # developer- defined test setup AM_TESTS_ENVIRONMENT (if any), and # passes TESTS_ENVIRONMENT. Set up options for the wrapper that # will run the test scripts (or their associated LOG_COMPILER, if # thy have one). am__check_pre = \ $(am__sh_e_setup); \ $(am__vpath_adj_setup) $(am__vpath_adj) \ $(am__tty_colors); \ srcdir=$(srcdir); export srcdir; \ case "$@" in \ */*) am__odir=`echo "./$@" | sed 's|/[^/]*$$||'`;; \ *) am__odir=.;; \ esac; \ test "x$$am__odir" = x"." || test -d "$$am__odir" \ || $(MKDIR_P) "$$am__odir" || exit $$?; \ if test -f "./$$f"; then dir=./; \ elif test -f "$$f"; then dir=; \ else dir="$(srcdir)/"; fi; \ tst=$$dir$$f; log='$@'; \ if test -n '$(DISABLE_HARD_ERRORS)'; then \ am__enable_hard_errors=no; \ else \ am__enable_hard_errors=yes; \ fi; \ case " $(XFAIL_TESTS) " in \ *[\ \ ]$$f[\ \ ]* | *[\ \ ]$$dir$$f[\ \ ]*) \ am__expect_failure=yes;; \ *) \ am__expect_failure=no;; \ esac; \ $(AM_TESTS_ENVIRONMENT) $(TESTS_ENVIRONMENT) # A shell command to get the names of the tests scripts with any registered # extension removed (i.e., equivalently, the names of the test logs, with # the '.log' extension removed). The result is saved in the shell variable # '$bases'. This honors runtime overriding of TESTS and TEST_LOGS. Sadly, # we cannot use something simpler, involving e.g., "$(TEST_LOGS:.log=)", # since that might cause problem with VPATH rewrites for suffix-less tests. # See also 'test-harness-vpath-rewrite.sh' and 'test-trs-basic.sh'. am__set_TESTS_bases = \ bases='$(TEST_LOGS)'; \ bases=`for i in $$bases; do echo $$i; done | sed 's/\.log$$//'`; \ bases=`echo $$bases` RECHECK_LOGS = $(TEST_LOGS) AM_RECURSIVE_TARGETS = check recheck TEST_SUITE_LOG = test-suite.log TEST_EXTENSIONS = @EXEEXT@ .test LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver LOG_COMPILE = $(LOG_COMPILER) $(AM_LOG_FLAGS) $(LOG_FLAGS) am__set_b = \ case '$@' in \ */*) \ case '$*' in \ */*) b='$*';; \ *) b=`echo '$@' | sed 's/\.log$$//'`; \ esac;; \ *) \ b='$*';; \ esac am__test_logs1 = $(TESTS:=.log) am__test_logs2 = $(am__test_logs1:@EXEEXT@.log=.log) TEST_LOGS = $(am__test_logs2:.test.log=.log) TEST_LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver TEST_LOG_COMPILE = $(TEST_LOG_COMPILER) $(AM_TEST_LOG_FLAGS) \ $(TEST_LOG_FLAGS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALLOCA = @ALLOCA@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ ARCH = @ARCH@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ EXTRA_DIST_SUBDIRS = @EXTRA_DIST_SUBDIRS@ FGREP = @FGREP@ GREP = @GREP@ GTEST_INCLUDES = @GTEST_INCLUDES@ GTEST_LDADD = @GTEST_LDADD@ GTEST_LDFLAGS = @GTEST_LDFLAGS@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LINKPRINT = @LINKPRINT@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PORT_CFLAGS = @PORT_CFLAGS@ PORT_LDFLAGS = @PORT_LDFLAGS@ PORT_SUBDIR = @PORT_SUBDIR@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ subdirs = @subdirs@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ # This is to workaround long long in gtest.h AM_CPPFLAGS = -I$(top_srcdir)/Misc -I$(top_srcdir)/CfgMgr \ $(GTEST_INCLUDES) -Wno-long-long -Wno-variadic-macros @HAVE_GTEST_TRUE@CfgMgr_tests_SOURCES = run_tests.cc \ @HAVE_GTEST_TRUE@ HostID_unittest.cc HostRange_unittest.cc @HAVE_GTEST_TRUE@CfgMgr_tests_LDFLAGS = $(AM_LDFLAGS) $(GTEST_LDFLAGS) @HAVE_GTEST_TRUE@CfgMgr_tests_LDADD = $(GTEST_LDADD) \ @HAVE_GTEST_TRUE@ $(top_builddir)/CfgMgr/libCfgMgr.a \ @HAVE_GTEST_TRUE@ $(top_builddir)/Misc/libMisc.a all: all-am .SUFFIXES: .SUFFIXES: .cc .lo .log .o .obj .test .test$(EXEEXT) .trs $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign CfgMgr/tests/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign CfgMgr/tests/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstPROGRAMS: @list='$(noinst_PROGRAMS)'; test -n "$$list" || exit 0; \ echo " rm -f" $$list; \ rm -f $$list || exit $$?; \ test -n "$(EXEEXT)" || exit 0; \ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ echo " rm -f" $$list; \ rm -f $$list CfgMgr_tests$(EXEEXT): $(CfgMgr_tests_OBJECTS) $(CfgMgr_tests_DEPENDENCIES) $(EXTRA_CfgMgr_tests_DEPENDENCIES) @rm -f CfgMgr_tests$(EXEEXT) $(AM_V_CXXLD)$(CfgMgr_tests_LINK) $(CfgMgr_tests_OBJECTS) $(CfgMgr_tests_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/HostID_unittest.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/HostRange_unittest.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/run_tests.Po@am__quote@ .cc.o: @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $< .cc.obj: @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .cc.lo: @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LTCXXCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags # Recover from deleted '.trs' file; this should ensure that # "rm -f foo.log; make foo.trs" re-run 'foo.test', and re-create # both 'foo.log' and 'foo.trs'. Break the recipe in two subshells # to avoid problems with "make -n". .log.trs: rm -f $< $@ $(MAKE) $(AM_MAKEFLAGS) $< # Leading 'am--fnord' is there to ensure the list of targets does not # expand to empty, as could happen e.g. with make check TESTS=''. am--fnord $(TEST_LOGS) $(TEST_LOGS:.log=.trs): $(am__force_recheck) am--force-recheck: @: $(TEST_SUITE_LOG): $(TEST_LOGS) @$(am__set_TESTS_bases); \ am__f_ok () { test -f "$$1" && test -r "$$1"; }; \ redo_bases=`for i in $$bases; do \ am__f_ok $$i.trs && am__f_ok $$i.log || echo $$i; \ done`; \ if test -n "$$redo_bases"; then \ redo_logs=`for i in $$redo_bases; do echo $$i.log; done`; \ redo_results=`for i in $$redo_bases; do echo $$i.trs; done`; \ if $(am__make_dryrun); then :; else \ rm -f $$redo_logs && rm -f $$redo_results || exit 1; \ fi; \ fi; \ if test -n "$$am__remaking_logs"; then \ echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \ "recursion detected" >&2; \ else \ am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \ fi; \ if $(am__make_dryrun); then :; else \ st=0; \ errmsg="fatal: making $(TEST_SUITE_LOG): failed to create"; \ for i in $$redo_bases; do \ test -f $$i.trs && test -r $$i.trs \ || { echo "$$errmsg $$i.trs" >&2; st=1; }; \ test -f $$i.log && test -r $$i.log \ || { echo "$$errmsg $$i.log" >&2; st=1; }; \ done; \ test $$st -eq 0 || exit 1; \ fi @$(am__sh_e_setup); $(am__tty_colors); $(am__set_TESTS_bases); \ ws='[ ]'; \ results=`for b in $$bases; do echo $$b.trs; done`; \ test -n "$$results" || results=/dev/null; \ all=` grep "^$$ws*:test-result:" $$results | wc -l`; \ pass=` grep "^$$ws*:test-result:$$ws*PASS" $$results | wc -l`; \ fail=` grep "^$$ws*:test-result:$$ws*FAIL" $$results | wc -l`; \ skip=` grep "^$$ws*:test-result:$$ws*SKIP" $$results | wc -l`; \ xfail=`grep "^$$ws*:test-result:$$ws*XFAIL" $$results | wc -l`; \ xpass=`grep "^$$ws*:test-result:$$ws*XPASS" $$results | wc -l`; \ error=`grep "^$$ws*:test-result:$$ws*ERROR" $$results | wc -l`; \ if test `expr $$fail + $$xpass + $$error` -eq 0; then \ success=true; \ else \ success=false; \ fi; \ br='==================='; br=$$br$$br$$br$$br; \ result_count () \ { \ if test x"$$1" = x"--maybe-color"; then \ maybe_colorize=yes; \ elif test x"$$1" = x"--no-color"; then \ maybe_colorize=no; \ else \ echo "$@: invalid 'result_count' usage" >&2; exit 4; \ fi; \ shift; \ desc=$$1 count=$$2; \ if test $$maybe_colorize = yes && test $$count -gt 0; then \ color_start=$$3 color_end=$$std; \ else \ color_start= color_end=; \ fi; \ echo "$${color_start}# $$desc $$count$${color_end}"; \ }; \ create_testsuite_report () \ { \ result_count $$1 "TOTAL:" $$all "$$brg"; \ result_count $$1 "PASS: " $$pass "$$grn"; \ result_count $$1 "SKIP: " $$skip "$$blu"; \ result_count $$1 "XFAIL:" $$xfail "$$lgn"; \ result_count $$1 "FAIL: " $$fail "$$red"; \ result_count $$1 "XPASS:" $$xpass "$$red"; \ result_count $$1 "ERROR:" $$error "$$mgn"; \ }; \ { \ echo "$(PACKAGE_STRING): $(subdir)/$(TEST_SUITE_LOG)" | \ $(am__rst_title); \ create_testsuite_report --no-color; \ echo; \ echo ".. contents:: :depth: 2"; \ echo; \ for b in $$bases; do echo $$b; done \ | $(am__create_global_log); \ } >$(TEST_SUITE_LOG).tmp || exit 1; \ mv $(TEST_SUITE_LOG).tmp $(TEST_SUITE_LOG); \ if $$success; then \ col="$$grn"; \ else \ col="$$red"; \ test x"$$VERBOSE" = x || cat $(TEST_SUITE_LOG); \ fi; \ echo "$${col}$$br$${std}"; \ echo "$${col}Testsuite summary for $(PACKAGE_STRING)$${std}"; \ echo "$${col}$$br$${std}"; \ create_testsuite_report --maybe-color; \ echo "$$col$$br$$std"; \ if $$success; then :; else \ echo "$${col}See $(subdir)/$(TEST_SUITE_LOG)$${std}"; \ if test -n "$(PACKAGE_BUGREPORT)"; then \ echo "$${col}Please report to $(PACKAGE_BUGREPORT)$${std}"; \ fi; \ echo "$$col$$br$$std"; \ fi; \ $$success || exit 1 check-TESTS: @list='$(RECHECK_LOGS)'; test -z "$$list" || rm -f $$list @list='$(RECHECK_LOGS:.log=.trs)'; test -z "$$list" || rm -f $$list @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ log_list=`for i in $$bases; do echo $$i.log; done`; \ trs_list=`for i in $$bases; do echo $$i.trs; done`; \ log_list=`echo $$log_list`; trs_list=`echo $$trs_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) TEST_LOGS="$$log_list"; \ exit $$?; recheck: all @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ bases=`for i in $$bases; do echo $$i; done \ | $(am__list_recheck_tests)` || exit 1; \ log_list=`for i in $$bases; do echo $$i.log; done`; \ log_list=`echo $$log_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) \ am__force_recheck=am--force-recheck \ TEST_LOGS="$$log_list"; \ exit $$? CfgMgr_tests.log: CfgMgr_tests$(EXEEXT) @p='CfgMgr_tests$(EXEEXT)'; \ b='CfgMgr_tests'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) .test.log: @p='$<'; \ $(am__set_b); \ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) @am__EXEEXT_TRUE@.test$(EXEEXT).log: @am__EXEEXT_TRUE@ @p='$<'; \ @am__EXEEXT_TRUE@ $(am__set_b); \ @am__EXEEXT_TRUE@ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ @am__EXEEXT_TRUE@ --log-file $$b.log --trs-file $$b.trs \ @am__EXEEXT_TRUE@ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ @am__EXEEXT_TRUE@ "$$tst" $(AM_TESTS_FD_REDIRECT) distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am $(MAKE) $(AM_MAKEFLAGS) check-TESTS check: check-am all-am: Makefile $(PROGRAMS) installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: -test -z "$(TEST_LOGS)" || rm -f $(TEST_LOGS) -test -z "$(TEST_LOGS:.log=.trs)" || rm -f $(TEST_LOGS:.log=.trs) -test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool clean-noinstPROGRAMS \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: check-am install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-TESTS check-am clean \ clean-generic clean-libtool clean-noinstPROGRAMS cscopelist-am \ ctags ctags-am distclean distclean-compile distclean-generic \ distclean-libtool distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-dvi install-dvi-am install-exec \ install-exec-am install-html install-html-am install-info \ install-info-am install-man install-pdf install-pdf-am \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ recheck tags tags-am uninstall uninstall-am # 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: dibbler-1.0.1/CfgMgr/CfgMgr.cpp0000644000175000017500000002632412556506107013071 00000000000000/* * Dibbler - a portable DHCPv6 * * authors: Tomasz Mrugalski * Marek Senderski * * released under GNU GPL v2 only licence * */ #include #include #include #include #include #include "CfgMgr.h" #include "Logger.h" #include "Portable.h" #include "DHCPDefaults.h" #include "Logger.h" using namespace std; TCfgMgr::TCfgMgr() :LogLevel(DEFAULT_LOGLEVEL), IsDone(false), DUIDType(DUID_TYPE_LLT), /* default DUID type: LLT */ DUIDEnterpriseNumber(-1), DdnsProto(DNSUPDATE_TCP), DDNSTimeout_(DNSUPDATE_DEFAULT_TIMEOUT) // default is 1000 ms #ifndef MOD_DISABLE_AUTH // Authentication ,AuthProtocol_(AUTH_PROTO_NONE), AuthAlgorithm_(0), AuthReplay_(AUTH_REPLAY_NONE), AuthDropUnauthenticated_(false) /// @todo should be true #endif { } TCfgMgr::~TCfgMgr() { } void TCfgMgr::setDDNSProtocol(DNSUpdateProtocol proto) { DdnsProto = proto; } // method compares both files and if differs // returns true if files differs and false in the other case bool TCfgMgr::compareConfigs(const std::string& cfgFile, const std::string& oldCfgFile) { std::ifstream oldF,newF; bool newConf=false; // It's common for client and server so why not to create CfgMgr //open new and saved config files newF.open(cfgFile.c_str(), ios::in|ios::binary); oldF.open(oldCfgFile.c_str(),ios::in|ios::binary); //is it possible to open both ? if(!newF.fail()) { if (!oldF.fail()) { //yes - comparision of old file and new file //first the length of both files newF.seekg(0,ios::end); oldF.seekg(0,ios::end); if((newF.tellg()) != oldF.tellg()) newConf = true; //there is a diffrence at least in length else { //next contents newF.seekg(0,ios::beg); oldF.seekg(0,ios::beg); while((!newF.eof())&&(!oldF.eof())&&(!newConf)) newConf=(newF.get()!=oldF.get()); } newF.close(); oldF.close(); } else { //there is no old config file, so there is new config //and it should be make copy of new one newF.close(); newConf=true; } } else { Log(Error) << "Can't open file " << cfgFile << ". Config comparision aborted." << LogEnd; } return newConf; } // replaces copy cfgFile to oldCfgFile void TCfgMgr::copyFile(const std::string& cfgFile, const std::string& oldCfgFile) { ifstream newF; ofstream oOldF; //try to open input file newF.open(cfgFile.c_str(), ios::in|ios::binary); if (newF.fail()) Log(Error) << "Can't open file "<0) oOldF.put(newF.get()); } newF.close(); oOldF.close(); } /** * @brief loads DUID from a file. * * This function also checks if DUID value exist and checks the correctness of this file. * * @param duidFile string representation of the DUID file. * * @return true if DUID value exists and is correct, false if doesn't. * */ bool TCfgMgr::loadDUID(const std::string& duidFile) { ifstream f; f.open(duidFile.c_str()); if ( !(f.is_open()) ) { // unable to open DUID file Log(Notice) << "Unable to open DUID file (" << duidFile << "), generating new DUID." << LogEnd; return false; } string s; getline(f,s); f.close(); this->DUID = new TDUID(s.c_str()); Log(Debug) << "DUID's value = " << DUID->getPlain() << " was loaded from " << duidFile << " file." << LogEnd; int duidLen = s.length(); int duidLen2 = DUID->getLen(); if (duidLen <= 0 || duidLen2 == 0) { Log(Error) << "DUID's length is 0. Please check that " << duidFile << " is not empty and contains actual DUID. You can also delete it." << LogEnd; return false; } return true; } bool TCfgMgr::setDUID(const std::string& filename, TIfaceMgr & ifaceMgr) { // --- load DUID --- if (this->loadDUID(filename)) { Log(Info) << "My DUID is " << this->DUID->getPlain() << "." << LogEnd; return true; } // Failed to load DUID. We need to generate it. SPtr realIface; bool found=false; ifaceMgr.firstIface(); if (this->DUIDType == DUID_TYPE_EN) { realIface = ifaceMgr.getIface(); // use the first interface. It will be ignored anyway found = true; if (!realIface) { Log(Error) << "Unable to find any interfaces. Can't generate DUID" << LogEnd; return false; } } while( (!found) && (realIface=ifaceMgr.getIface()) ) { realIface->firstLLAddress(); char buf[64]; memset(buf,0,64); if (!realIface->getMac()) { Log(Debug) << "DUID creation: Interface " << realIface->getFullName() << " skipped: no link addresses." << LogEnd; continue; } if ( realIface->getMacLen()<6 ) { Log(Debug) << "DUID creation: Interface " << realIface->getFullName() << " skipped: MAC length is " << realIface->getMacLen() << ", but at least 6 is required." << LogEnd; continue; } if ( realIface->flagLoopback() ) { Log(Debug) << "DUID creation: Interface " << realIface->getFullName() << " skipped: Interface is loopback." << LogEnd; continue; } if ( !memcmp(realIface->getMac(),buf,realIface->getMacLen()) ) { Log(Debug) << "DUID creation: Interface " << realIface->getFullName() << " skipped: MAC is all zero. " << LogEnd; continue; } if ( !realIface->flagUp() ) { Log(Debug) << "DUID creation: Interface " << realIface->getFullName() << " skipped: Interface is down." << LogEnd; continue; } found=true; } if(found) { if ( this->generateDUID(filename, realIface->getMac(), realIface->getMacLen(), realIface->getHardwareType())) { if (this->DUIDType!=DUID_TYPE_EN) Log(Notice) << "DUID creation: generated using " << realIface->getFullName() << " interface." << LogEnd; Log(Info) << "My DUID is " << this->DUID->getPlain() << "." << LogEnd; return true; } else { Log(Crit) << "DUID creation: generation attempt based on " << realIface->getFullName() << " interface failed." << LogEnd; return false; } } Log(Crit) << "Cannot generate DUID, because there is no up and running interface with " << "MAC address at least 6 bytes long." << LogEnd; this->DUID=new TDUID(); return false; } bool TCfgMgr::generateDUID(const std::string& duidFile, char * mac,int macLen, int macType) { ofstream f; f.open( duidFile.c_str() ); if (!f.is_open()) { Log(Crit) << "Unable to create/write " << duidFile << " file." << LogEnd; return false; } string duidType; int DUIDlen = 0; char *DUID = 0; long cur_time = 0; switch (this->DUIDType) { case DUID_TYPE_LLT: duidType = "link-local+time (duid-llt)"; DUIDlen=macLen+8; DUID = new char[DUIDlen]; writeUint16(DUID, this->DUIDType); writeUint16(DUID+2, macType); cur_time = (uint32_t)time(NULL); writeUint32(DUID+4, (cur_time-946684800) & 0xFFFFFFFF); /* 946684800=Number of seconds between midnight (UTC), January 2000 and midnight (UTC), January 1970. It is 30 years. 7 leap years of 366 days. 23 years of 365 days. Modified by Eric Gamess (UCV) */ for (int i=0;iDUIDType); writeUint16(DUID+2, macType); for (int i=0;igetLen(); DUID = new char[DUIDlen]; writeUint16(DUID, this->DUIDType); writeUint32(DUID+2, this->DUIDEnterpriseNumber); this->DUIDEnterpriseID->storeSelf(DUID+6); break; default: Log(Error) << "Invalid DUID type." << LogEnd; return false; } Log(Notice) << "DUID creation: Generating " << DUIDlen << "-bytes long " << duidType << " DUID." << LogEnd; this->DUID=new TDUID(DUID,DUIDlen); delete [] DUID; f << this->DUID->getPlain(); f.close(); return true; } void TCfgMgr::setWorkdir(std::string workdir) { Workdir = workdir; } string TCfgMgr::getWorkDir() { return Workdir; } string TCfgMgr::getLogName() { return LogName; } int TCfgMgr::getLogLevel() { return LogLevel; } SPtr TCfgMgr::getDUID() { return DUID; } #if !defined(MOD_SRV_DISABLE_DNSUPDATE) && !defined(MOD_CLNT_DISABLE_DNSUPDATE) void TCfgMgr::addKey(SPtr key) { Keys_.push_back(key); } SPtr TCfgMgr::getKey() { /// @todo: add some parameter that will pick the right key if (Keys_.empty()) return SPtr(); return Keys_.front(); // just return first key for now } #endif #ifndef MOD_DISABLE_AUTH void TCfgMgr::setAuthProtocol(AuthProtocols proto) { Log(Debug) << "Auth: setting auth protocol to " << proto << LogEnd; AuthProtocol_ = proto; } void TCfgMgr::setAuthReplay(AuthReplay replay_detection_mode) { AuthReplay_ = replay_detection_mode; } void TCfgMgr::setAuthAlgorithm(uint8_t algorithm) { // protocol specific value AuthAlgorithm_ = algorithm; } AuthProtocols TCfgMgr::getAuthProtocol() { return AuthProtocol_; } AuthReplay TCfgMgr::getAuthReplay() { return AuthReplay_; } uint8_t TCfgMgr::getAuthAlgorithm() { return AuthAlgorithm_; } void TCfgMgr::setAuthDropUnauthenticated(bool drop) { AuthDropUnauthenticated_ = drop; } bool TCfgMgr::getAuthDropUnauthenticated() { return AuthDropUnauthenticated_; } void TCfgMgr::setAuthRealm(const std::string& realm) { AuthRealm_ = realm; Log(Debug) << "AUTH: Realm set to '" << realm << "'." << LogEnd; } std::string TCfgMgr::getAuthRealm() { return AuthRealm_; } #endif dibbler-1.0.1/CfgMgr/HostRange.h0000644000175000017500000000226512277722750013265 00000000000000/* * Dibbler - a portable DHCPv6 * * authors: Tomasz Mrugalski * Marek Senderski * * released under GNU GPL v2 only licence * */ #ifndef STATIONRANGE_H #define STATIONRANGE_H #include "IPv6Addr.h" #include "DUID.h" #include "SmartPtr.h" #include #include class THostRange { friend std::ostream& operator<<(std::ostream& out, THostRange& station); public: THostRange(SPtr duidl, SPtr duidr); THostRange(SPtr addrl, SPtr addrR); ~THostRange(void); bool in(SPtr duid, SPtr addr) const; bool in(SPtr addr) const; bool in(SPtr duid) const; SPtr getRandomAddr() const; SPtr getRandomPrefix() const; unsigned long rangeCount() const; SPtr getAddrL() const; SPtr getAddrR() const; int getPrefixLength() const; void setPrefixLength(int len); void truncate(int minPrefix, int maxPrefix); private: bool isAddrRange_; SPtr DUIDL_; SPtr DUIDR_; SPtr AddrL_; SPtr AddrR_; int PrefixLength_; }; #endif dibbler-1.0.1/CfgMgr/HostID.cpp0000664000175000017500000000155112233256142013044 00000000000000/* * Dibbler - a portable DHCPv6 * * authors: Tomasz Mrugalski * Marek Senderski * * released under GNU GPL v2 only licence */ #include "HostID.h" #include #include using namespace std; THostID::THostID(SPtr addr) { this->Addr=addr; isIDAddress=true; } THostID::THostID(SPtr duid) { this->DUID=duid; isIDAddress=false; } bool THostID::operator==(SPtr addr) { if (!isIDAddress) return false; return *addr==*Addr; } bool THostID::operator==(SPtr duid) { if (isIDAddress) return false; return *duid==*DUID; } ostream& operator<<(ostream& out,THostID& station) { if (station.DUID) { out<<*station.DUID; } else { out << "" << *station.Addr << "" << endl; } return out; } dibbler-1.0.1/CfgMgr/FlexLexer.h0000664000175000017500000001411412233256142013254 00000000000000// -*-C++-*- // FlexLexer.h -- define interfaces for lexical analyzer classes generated // by flex // Copyright (c) 1993 The Regents of the University of California. // All rights reserved. // // This code is derived from software contributed to Berkeley by // Kent Williams and Tom Epperly. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions // are met: // 1. Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // 2. Redistributions in binary form must reproduce the above copyright // notice, this list of conditions and the following disclaimer in the // documentation and/or other materials provided with the distribution. // Neither the name of the University nor the names of its contributors // may be used to endorse or promote products derived from this software // without specific prior written permission. // THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR // IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED // WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR // PURPOSE. // This file defines FlexLexer, an abstract class which specifies the // external interface provided to flex C++ lexer objects, and yyFlexLexer, // which defines a particular lexer class. // // If you want to create multiple lexer classes, you use the -P flag // to rename each yyFlexLexer to some other xxFlexLexer. You then // include in your other sources once per lexer class: // // #undef yyFlexLexer // #define yyFlexLexer xxFlexLexer // #include // // #undef yyFlexLexer // #define yyFlexLexer zzFlexLexer // #include // ... #ifndef __FLEX_LEXER_H // Never included before - need to define base class. #define __FLEX_LEXER_H #include # ifndef FLEX_STD # define FLEX_STD std:: # endif extern "C++" { struct yy_buffer_state; typedef int yy_state_type; class FlexLexer { public: virtual ~FlexLexer() { } const char* YYText() const { return yytext; } int YYLeng() const { return yyleng; } virtual void yy_switch_to_buffer( struct yy_buffer_state* new_buffer ) = 0; virtual struct yy_buffer_state* yy_create_buffer( FLEX_STD istream* s, int size ) = 0; virtual void yy_delete_buffer( struct yy_buffer_state* b ) = 0; virtual void yyrestart( FLEX_STD istream* s ) = 0; virtual int yylex() = 0; // Call yylex with new input/output sources. int yylex( FLEX_STD istream* new_in, FLEX_STD ostream* new_out = 0 ) { switch_streams( new_in, new_out ); return yylex(); } // Switch to new input/output streams. A nil stream pointer // indicates "keep the current one". virtual void switch_streams( FLEX_STD istream* new_in = 0, FLEX_STD ostream* new_out = 0 ) = 0; int lineno() const { return yylineno; } int debug() const { return yy_flex_debug; } void set_debug( int flag ) { yy_flex_debug = flag; } protected: char* yytext; int yyleng; int yylineno; // only maintained if you use %option yylineno int yy_flex_debug; // only has effect with -d or "%option debug" }; } #endif // FLEXLEXER_H #if defined(yyFlexLexer) || ! defined(yyFlexLexerOnce) // Either this is the first time through (yyFlexLexerOnce not defined), // or this is a repeated include to define a different flavor of // yyFlexLexer, as discussed in the flex manual. #define yyFlexLexerOnce extern "C++" { class yyFlexLexer : public FlexLexer { public: // arg_yyin and arg_yyout default to the cin and cout, but we // only make that assignment when initializing in yylex(). yyFlexLexer( FLEX_STD istream* arg_yyin = 0, FLEX_STD ostream* arg_yyout = 0 ); virtual ~yyFlexLexer(); void yy_switch_to_buffer( struct yy_buffer_state* new_buffer ); struct yy_buffer_state* yy_create_buffer( FLEX_STD istream* s, int size ); void yy_delete_buffer( struct yy_buffer_state* b ); void yyrestart( FLEX_STD istream* s ); void yypush_buffer_state( struct yy_buffer_state* new_buffer ); void yypop_buffer_state(); virtual int yylex(); virtual void switch_streams( FLEX_STD istream* new_in, FLEX_STD ostream* new_out = 0 ); virtual int yywrap(); protected: virtual int LexerInput( char* buf, int max_size ); virtual void LexerOutput( const char* buf, int size ); virtual void LexerError( const char* msg ); void yyunput( int c, char* buf_ptr ); int yyinput(); void yy_load_buffer_state(); void yy_init_buffer( struct yy_buffer_state* b, FLEX_STD istream* s ); void yy_flush_buffer( struct yy_buffer_state* b ); int yy_start_stack_ptr; int yy_start_stack_depth; int* yy_start_stack; void yy_push_state( int new_state ); void yy_pop_state(); int yy_top_state(); yy_state_type yy_get_previous_state(); yy_state_type yy_try_NUL_trans( yy_state_type current_state ); int yy_get_next_buffer(); FLEX_STD istream* yyin; // input source for default LexerInput FLEX_STD ostream* yyout; // output sink for default LexerOutput // yy_hold_char holds the character lost when yytext is formed. char yy_hold_char; // Number of characters read into yy_ch_buf. int yy_n_chars; // Points to current character in buffer. char* yy_c_buf_p; int yy_init; // whether we need to initialize int yy_start; // start state number // Flag which is used to allow yywrap()'s to do buffer switches // instead of setting up a fresh yyin. A bit of a hack ... int yy_did_buffer_switch_on_eof; size_t yy_buffer_stack_top; /**< index of top of stack. */ size_t yy_buffer_stack_max; /**< capacity of stack. */ struct yy_buffer_state ** yy_buffer_stack; /**< Stack as an array. */ void yyensure_buffer_stack(void); // The following are not always needed, but may be depending // on use of certain flex features (like REJECT or yymore()). yy_state_type yy_last_accepting_state; char* yy_last_accepting_cpos; yy_state_type* yy_state_buf; yy_state_type* yy_state_ptr; char* yy_full_match; int* yy_full_state; int yy_full_lp; int yy_lp; int yy_looking_for_trail_begin; int yy_more_flag; int yy_more_len; int yy_more_offset; int yy_prev_more_offset; }; } #endif // yyFlexLexer || ! yyFlexLexerOnce dibbler-1.0.1/CfgMgr/Makefile.am0000644000175000017500000000042612277722750013253 00000000000000SUBDIRS = . if HAVE_GTEST SUBDIRS += tests endif noinst_LIBRARIES = libCfgMgr.a libCfgMgr_a_CPPFLAGS = -I$(top_srcdir)/Misc -I$(top_srcdir)/IfaceMgr libCfgMgr_a_SOURCES = CfgMgr.cpp CfgMgr.h FlexLexer.h libCfgMgr_a_SOURCES += HostID.cpp HostID.h HostRange.cpp HostRange.h dibbler-1.0.1/CfgMgr/HostRange.cpp0000644000175000017500000001001612556506047013610 00000000000000/* * Dibbler - a portable DHCPv6 * * authors: Tomasz Mrugalski * Marek Senderski * * released under GNU GPL v2 only licence */ #include "HostRange.h" #include "DHCPConst.h" #include "Logger.h" THostRange::THostRange( SPtr duidl, SPtr duidr) :isAddrRange_(false), DUIDL_(duidl), DUIDR_(duidr), PrefixLength_(-1) { } THostRange::THostRange( SPtr addrl, SPtr addrr) :isAddrRange_(true), AddrL_(addrl), AddrR_(addrr), PrefixLength_(-1) { /// @todo: prefix length could be calculated automatically here } bool THostRange::in(SPtr duid, SPtr addr) const { if (isAddrRange_) { if ((*addr<=*AddrL_)&&(*AddrL_<=*addr)) return true; if ((*addr<=*AddrR_)&&(*AddrR_<=*addr)) return true; if (*addr<=*AddrL_) return false; if (*AddrR_<=*addr) return false; } else { if (!duid) return false; if (*duid <= *DUIDL_) return false; if (*DUIDR_ <= *duid) return false; return true; } return false; // should not happen } bool THostRange::in(SPtr addr) const { if (isAddrRange_) { if ((*addr<=*AddrL_)&&(*AddrL_<=*addr)) return true; if ((*addr<=*AddrR_)&&(*AddrR_<=*addr)) return true; if (*addr<=*AddrL_) return false; if (*AddrR_<=*addr) return false; return true; } else return false; } bool THostRange::in(SPtr duid) const { if (isAddrRange_) return false; else { if (*duid<=*DUIDL_) return false; if (*DUIDR_<=*duid) return false; } return true; } SPtr THostRange::getRandomAddr() const { if(isAddrRange_) { SPtr diff = new TIPv6Addr(); *diff=(*AddrR_)-(*AddrL_); --(*diff); *diff=*diff+*AddrL_; return diff; } else return SPtr(); } SPtr THostRange::getRandomPrefix() const { if(isAddrRange_) { SPtr diff = new TIPv6Addr(); *diff=(*AddrR_)-(*AddrL_); --(*diff); *diff=*diff+*AddrL_; return diff; } else return SPtr(); } unsigned long THostRange::rangeCount() const { if(isAddrRange_) { SPtr diff(new TIPv6Addr()); *diff=(*AddrR_)-(*AddrL_); char *addr=diff->getAddr(); for(int i=0;i<12;i++) { if (addr[i]>0) return DHCPV6_INFINITY; } unsigned long retVal = addr[12]*256*256*256 + addr[13]*256*256 + addr[14]*256 + addr[15]; if (retVal!=DHCPV6_INFINITY) return retVal + 1; return retVal; } else return 0; } int THostRange::getPrefixLength() const { return PrefixLength_; } void THostRange::setPrefixLength(int len) { PrefixLength_ = len; } THostRange::~THostRange(void) { } SPtr THostRange::getAddrL() const { return AddrL_; } SPtr THostRange::getAddrR() const { return AddrR_; } void THostRange::truncate(int minPrefix, int maxPrefix) { if (!isAddrRange_) { Log(Error) << "Unable to truncace this pool: this is DUID pool, not address pool." << LogEnd; return; } // if the L and R addresses are not at the prefix boundaries, then we are // pretty f%%%ed up AddrL_->truncate(minPrefix, maxPrefix); AddrR_->truncate(minPrefix, maxPrefix); } std::ostream& operator<<(std::ostream& out, THostRange& range) { if (range.isAddrRange_) { // address range if(range.AddrL_&&range.AddrR_) out << " " << std::endl; } else { // DUID range if (range.DUIDL_&&range.DUIDR_) { out << " " << std::endl << " " << *range.DUIDL_ << " " << *range.DUIDR_ << " " << std::endl; } } return out; } dibbler-1.0.1/CfgMgr/HostID.h0000664000175000017500000000131712233256142012511 00000000000000/* * Dibbler - a portable DHCPv6 * * authors: Tomasz Mrugalski * Marek Senderski * * released under GNU GPL v2 only licence */ #ifndef STATIONID_H_ #define STATIONID_H_ #include "SmartPtr.h" #include "IPv6Addr.h" #include "DUID.h" #include #include class THostID { friend std::ostream& operator<<(std::ostream& out, THostID& station); public: THostID(SPtr addr); THostID(SPtr duid); bool operator==(SPtr addr); bool operator==(SPtr duid); //THostID(const THostID& info); //~THostID(); private: bool isIDAddress; SPtr Addr; SPtr DUID; }; #endif dibbler-1.0.1/CfgMgr/CfgMgr.h0000644000175000017500000000576012277722750012543 00000000000000/* * Dibbler - a portable DHCPv6 * * authors: Tomasz Mrugalski * Marek Senderski * * released under GNU GPL v2 only licence * */ #ifndef CFGMGR_H #define CFGMGR_H #include #include "SmartPtr.h" #include "DUID.h" #include "IfaceMgr.h" #include "Key.h" /* shared by server and relay */ #define RELAY_MIN_IFINDEX 1024 /* Defined DUID types */ enum EDUIDType{ DUID_TYPE_NOT_DEFINED = 0, DUID_TYPE_LLT = 1, DUID_TYPE_EN = 2, DUID_TYPE_LL = 3 }; class TCfgMgr { public: enum DNSUpdateProtocol { DNSUPDATE_TCP, /* TCP only */ DNSUPDATE_UDP, /* UDP only */ DNSUPDATE_ANY /* try UDP first, if response truncated, switch to TCP */ }; TCfgMgr(); virtual ~TCfgMgr(); bool compareConfigs(const std::string& cfgFile, const std::string& oldCfgFile); void copyFile(const std::string& cfgFile, const std::string& oldCfgFile); SPtr getDUID(); void setWorkdir(std::string workdir); int getLogLevel(); std::string getWorkDir(); std::string getLogName(); void setDDNSProtocol(DNSUpdateProtocol proto); DNSUpdateProtocol getDDNSProtocol() { return DdnsProto; } void setDDNSTimeout(unsigned int timeout) { DDNSTimeout_ = timeout; } unsigned int getDDNSTimeout() { return DDNSTimeout_; } #if !defined(MOD_SRV_DISABLE_DNSUPDATE) && !defined(MOD_CLNT_DISABLE_DNSUPDATE) void addKey(SPtr key); SPtr getKey(); #endif #ifndef MOD_DISABLE_AUTH void setAuthProtocol(AuthProtocols proto); void setAuthReplay(AuthReplay replay_detection_mode); void setAuthAlgorithm(uint8_t algorithm); // protocol specific value AuthProtocols getAuthProtocol(); AuthReplay getAuthReplay(); uint8_t getAuthAlgorithm(); void setAuthDropUnauthenticated(bool drop); bool getAuthDropUnauthenticated(); void setAuthRealm(const std::string& realm); std::string getAuthRealm(); #endif protected: SPtr DUID; bool setDUID(const std::string& duidFile, TIfaceMgr &ifaceMgr); bool loadDUID(const std::string& filename); bool generateDUID(const std::string& duidFile,char * mac,int macLen, int macType); std::string Workdir; std::string LogName; int LogLevel; bool IsDone; EDUIDType DUIDType; int DUIDEnterpriseNumber; SPtr DUIDEnterpriseID; DNSUpdateProtocol DdnsProto; unsigned int DDNSTimeout_; #ifndef MOD_DISABLE_AUTH AuthProtocols AuthProtocol_; uint8_t AuthAlgorithm_; AuthReplay AuthReplay_; std::string AuthRealm_; bool AuthDropUnauthenticated_; #endif // for TSIG in DDNS TSIGKeyList Keys_; private: }; #endif dibbler-1.0.1/CfgMgr/Makefile.in0000664000175000017500000007047512561652534013277 00000000000000# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ @HAVE_GTEST_TRUE@am__append_1 = tests subdir = CfgMgr DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/depcomp ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/libtool.m4 \ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/include/dibbler-config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = LIBRARIES = $(noinst_LIBRARIES) ARFLAGS = cru AM_V_AR = $(am__v_AR_@AM_V@) am__v_AR_ = $(am__v_AR_@AM_DEFAULT_V@) am__v_AR_0 = @echo " AR " $@; am__v_AR_1 = libCfgMgr_a_AR = $(AR) $(ARFLAGS) libCfgMgr_a_LIBADD = am_libCfgMgr_a_OBJECTS = libCfgMgr_a-CfgMgr.$(OBJEXT) \ libCfgMgr_a-HostID.$(OBJEXT) libCfgMgr_a-HostRange.$(OBJEXT) libCfgMgr_a_OBJECTS = $(am_libCfgMgr_a_OBJECTS) AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)/include depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) LTCXXCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CXXFLAGS) $(CXXFLAGS) AM_V_CXX = $(am__v_CXX_@AM_V@) am__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@) am__v_CXX_0 = @echo " CXX " $@; am__v_CXX_1 = CXXLD = $(CXX) CXXLINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \ $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CXXLD = $(am__v_CXXLD_@AM_V@) am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@) am__v_CXXLD_0 = @echo " CXXLD " $@; am__v_CXXLD_1 = COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(libCfgMgr_a_SOURCES) DIST_SOURCES = $(libCfgMgr_a_SOURCES) RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \ ctags-recursive dvi-recursive html-recursive info-recursive \ install-data-recursive install-dvi-recursive \ install-exec-recursive install-html-recursive \ install-info-recursive install-pdf-recursive \ install-ps-recursive install-recursive installcheck-recursive \ installdirs-recursive pdf-recursive ps-recursive \ tags-recursive uninstall-recursive am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive am__recursive_targets = \ $(RECURSIVE_TARGETS) \ $(RECURSIVE_CLEAN_TARGETS) \ $(am__extra_recursive_targets) AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \ distdir am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags DIST_SUBDIRS = . tests DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) am__relativize = \ dir0=`pwd`; \ sed_first='s,^\([^/]*\)/.*$$,\1,'; \ sed_rest='s,^[^/]*/*,,'; \ sed_last='s,^.*/\([^/]*\)$$,\1,'; \ sed_butlast='s,/*[^/]*$$,,'; \ while test -n "$$dir1"; do \ first=`echo "$$dir1" | sed -e "$$sed_first"`; \ if test "$$first" != "."; then \ if test "$$first" = ".."; then \ dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ else \ first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ if test "$$first2" = "$$first"; then \ dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ else \ dir2="../$$dir2"; \ fi; \ dir0="$$dir0"/"$$first"; \ fi; \ fi; \ dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ done; \ reldir="$$dir2" ACLOCAL = @ACLOCAL@ ALLOCA = @ALLOCA@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ ARCH = @ARCH@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ EXTRA_DIST_SUBDIRS = @EXTRA_DIST_SUBDIRS@ FGREP = @FGREP@ GREP = @GREP@ GTEST_INCLUDES = @GTEST_INCLUDES@ GTEST_LDADD = @GTEST_LDADD@ GTEST_LDFLAGS = @GTEST_LDFLAGS@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LINKPRINT = @LINKPRINT@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PORT_CFLAGS = @PORT_CFLAGS@ PORT_LDFLAGS = @PORT_LDFLAGS@ PORT_SUBDIR = @PORT_SUBDIR@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ subdirs = @subdirs@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ SUBDIRS = . $(am__append_1) noinst_LIBRARIES = libCfgMgr.a libCfgMgr_a_CPPFLAGS = -I$(top_srcdir)/Misc -I$(top_srcdir)/IfaceMgr libCfgMgr_a_SOURCES = CfgMgr.cpp CfgMgr.h FlexLexer.h HostID.cpp \ HostID.h HostRange.cpp HostRange.h all: all-recursive .SUFFIXES: .SUFFIXES: .cpp .lo .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign CfgMgr/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign CfgMgr/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstLIBRARIES: -test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES) libCfgMgr.a: $(libCfgMgr_a_OBJECTS) $(libCfgMgr_a_DEPENDENCIES) $(EXTRA_libCfgMgr_a_DEPENDENCIES) $(AM_V_at)-rm -f libCfgMgr.a $(AM_V_AR)$(libCfgMgr_a_AR) libCfgMgr.a $(libCfgMgr_a_OBJECTS) $(libCfgMgr_a_LIBADD) $(AM_V_at)$(RANLIB) libCfgMgr.a mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libCfgMgr_a-CfgMgr.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libCfgMgr_a-HostID.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libCfgMgr_a-HostRange.Po@am__quote@ .cpp.o: @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $< .cpp.obj: @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .cpp.lo: @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LTCXXCOMPILE) -c -o $@ $< libCfgMgr_a-CfgMgr.o: CfgMgr.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libCfgMgr_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libCfgMgr_a-CfgMgr.o -MD -MP -MF $(DEPDIR)/libCfgMgr_a-CfgMgr.Tpo -c -o libCfgMgr_a-CfgMgr.o `test -f 'CfgMgr.cpp' || echo '$(srcdir)/'`CfgMgr.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libCfgMgr_a-CfgMgr.Tpo $(DEPDIR)/libCfgMgr_a-CfgMgr.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='CfgMgr.cpp' object='libCfgMgr_a-CfgMgr.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libCfgMgr_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libCfgMgr_a-CfgMgr.o `test -f 'CfgMgr.cpp' || echo '$(srcdir)/'`CfgMgr.cpp libCfgMgr_a-CfgMgr.obj: CfgMgr.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libCfgMgr_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libCfgMgr_a-CfgMgr.obj -MD -MP -MF $(DEPDIR)/libCfgMgr_a-CfgMgr.Tpo -c -o libCfgMgr_a-CfgMgr.obj `if test -f 'CfgMgr.cpp'; then $(CYGPATH_W) 'CfgMgr.cpp'; else $(CYGPATH_W) '$(srcdir)/CfgMgr.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libCfgMgr_a-CfgMgr.Tpo $(DEPDIR)/libCfgMgr_a-CfgMgr.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='CfgMgr.cpp' object='libCfgMgr_a-CfgMgr.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libCfgMgr_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libCfgMgr_a-CfgMgr.obj `if test -f 'CfgMgr.cpp'; then $(CYGPATH_W) 'CfgMgr.cpp'; else $(CYGPATH_W) '$(srcdir)/CfgMgr.cpp'; fi` libCfgMgr_a-HostID.o: HostID.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libCfgMgr_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libCfgMgr_a-HostID.o -MD -MP -MF $(DEPDIR)/libCfgMgr_a-HostID.Tpo -c -o libCfgMgr_a-HostID.o `test -f 'HostID.cpp' || echo '$(srcdir)/'`HostID.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libCfgMgr_a-HostID.Tpo $(DEPDIR)/libCfgMgr_a-HostID.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='HostID.cpp' object='libCfgMgr_a-HostID.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libCfgMgr_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libCfgMgr_a-HostID.o `test -f 'HostID.cpp' || echo '$(srcdir)/'`HostID.cpp libCfgMgr_a-HostID.obj: HostID.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libCfgMgr_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libCfgMgr_a-HostID.obj -MD -MP -MF $(DEPDIR)/libCfgMgr_a-HostID.Tpo -c -o libCfgMgr_a-HostID.obj `if test -f 'HostID.cpp'; then $(CYGPATH_W) 'HostID.cpp'; else $(CYGPATH_W) '$(srcdir)/HostID.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libCfgMgr_a-HostID.Tpo $(DEPDIR)/libCfgMgr_a-HostID.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='HostID.cpp' object='libCfgMgr_a-HostID.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libCfgMgr_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libCfgMgr_a-HostID.obj `if test -f 'HostID.cpp'; then $(CYGPATH_W) 'HostID.cpp'; else $(CYGPATH_W) '$(srcdir)/HostID.cpp'; fi` libCfgMgr_a-HostRange.o: HostRange.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libCfgMgr_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libCfgMgr_a-HostRange.o -MD -MP -MF $(DEPDIR)/libCfgMgr_a-HostRange.Tpo -c -o libCfgMgr_a-HostRange.o `test -f 'HostRange.cpp' || echo '$(srcdir)/'`HostRange.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libCfgMgr_a-HostRange.Tpo $(DEPDIR)/libCfgMgr_a-HostRange.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='HostRange.cpp' object='libCfgMgr_a-HostRange.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libCfgMgr_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libCfgMgr_a-HostRange.o `test -f 'HostRange.cpp' || echo '$(srcdir)/'`HostRange.cpp libCfgMgr_a-HostRange.obj: HostRange.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libCfgMgr_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libCfgMgr_a-HostRange.obj -MD -MP -MF $(DEPDIR)/libCfgMgr_a-HostRange.Tpo -c -o libCfgMgr_a-HostRange.obj `if test -f 'HostRange.cpp'; then $(CYGPATH_W) 'HostRange.cpp'; else $(CYGPATH_W) '$(srcdir)/HostRange.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libCfgMgr_a-HostRange.Tpo $(DEPDIR)/libCfgMgr_a-HostRange.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='HostRange.cpp' object='libCfgMgr_a-HostRange.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libCfgMgr_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libCfgMgr_a-HostRange.obj `if test -f 'HostRange.cpp'; then $(CYGPATH_W) 'HostRange.cpp'; else $(CYGPATH_W) '$(srcdir)/HostRange.cpp'; fi` mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs # This directory's subdirectories are mostly independent; you can cd # into them and run 'make' without going through this Makefile. # To change the values of 'make' variables: instead of editing Makefiles, # (1) if the variable is set in 'config.status', edit 'config.status' # (which will cause the Makefiles to be regenerated when you run 'make'); # (2) otherwise, pass the desired values on the 'make' command line. $(am__recursive_targets): @fail=; \ if $(am__make_keepgoing); then \ failcom='fail=yes'; \ else \ failcom='exit 1'; \ fi; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-recursive TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ empty_fix=.; \ else \ include_option=--include; \ empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-recursive CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-recursive cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ $(am__make_dryrun) \ || test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ $(am__relativize); \ new_distdir=$$reldir; \ dir1=$$subdir; dir2="$(top_distdir)"; \ $(am__relativize); \ new_top_distdir=$$reldir; \ echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ ($(am__cd) $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$new_top_distdir" \ distdir="$$new_distdir" \ am__remove_distdir=: \ am__skip_length_check=: \ am__skip_mode_fix=: \ distdir) \ || exit 1; \ fi; \ done check-am: all-am check: check-recursive all-am: Makefile $(LIBRARIES) installdirs: installdirs-recursive installdirs-am: install: install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-recursive clean-am: clean-generic clean-libtool clean-noinstLIBRARIES \ mostlyclean-am distclean: distclean-recursive -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive html-am: info: info-recursive info-am: install-data-am: install-dvi: install-dvi-recursive install-dvi-am: install-exec-am: install-html: install-html-recursive install-html-am: install-info: install-info-recursive install-info-am: install-man: install-pdf: install-pdf-recursive install-pdf-am: install-ps: install-ps-recursive install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-recursive -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: .MAKE: $(am__recursive_targets) install-am install-strip .PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am check \ check-am clean clean-generic clean-libtool \ clean-noinstLIBRARIES cscopelist-am ctags ctags-am distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ installdirs-am maintainer-clean maintainer-clean-generic \ mostlyclean mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf pdf-am ps ps-am tags tags-am uninstall \ uninstall-am # 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: dibbler-1.0.1/TODO0000644000175000017500000003477412556513345010555 00000000000000 Dibbler code TODO ------------------- Note: This is a scratchpad. It just happens to be available with the rest of the code. - remove TClntOptStatusCode, TClntOptIAAddress - must include *.l *.y files in dist - Check if client message retransmissions have proper digests. Subnet support: - rcv: clean up SrvIfaceMgr::decodeRelayForw() - remove getUnderlaying(), getOverlaying() (WTF???) - snd: Fix TSrvMsg::send() (sending responses) - remove adding relays to IfaceMgr (WTF is that???) - move TSrvIfaceIface::getRelayByInterface() -> TSrvIfaceMgr - SrvCfgMgr wrong subnet print format to server-CfgMgr.xml - TSrvIfaceMgr::decodeMsg(SPtr -> SPtr, ...) (or even better -> int ifindex,...) - Implement tests in tests/Srv/ for SrvIfaceMgr::decodeRelayForw() - modify send() to use SrvMsg::getPhysicalInterface() - remove the need to specify physical underlying interfaces in config Important: - Implement 8 step lease assignment algorithm (done for IA_NA, todo for IA_PD) - Implement support for fixed leases: (see dibbler-devel-06-arch 6.6.2) - Srv: Implement access control for PD - Expressions (options, client-id, ...) - DNS Update(delete) after expiration - Common option parsing ========= Authentication ======== - implement authentication option: framework for multiple auth protocols (done) - 2 protocols defined in 3315, 3rd done by Kowalczuk (3 total) - at most one auth option incluended - unit-tests for client - unit-tests for server 0 1 2 3 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | OPTION_AUTH | option-len | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | protocol | algorithm | RDM | | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | | | | replay detection (64 bits) +-+-+-+-+-+-+-+-+ | | auth-info | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | . authentication information . . (variable length) . +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ RDM = 0 => monotonically increasing counter (must be supported by all protocols) Delayed auth protocol protocol = 2, delayed auth mechanism. algorithm 1 = hmac-md5 - Client and server preconfigured with keys -client requests auth in solicit -srv includes auth in advertise -contains nonce value generate by the source as a message auth code (MAC) HMAC-MD5 is used Refactor: - remove Msg* in TOpt - remove many SrvOpt and ClntOpt classes - rename TSrvOptTA to TSrvOptIA_TA MUST-FIX before 0.9.0: - once exceptions are read, remove corresponding addrs from cache. Otherwise cached client may get an address that is reserved for someone else. tentative plans for 0.9.0: - DNS Updates: UDP support [DONE] - add cppcheck to make devel - DNS Updates: DHC ID record (RFC4701) - DNS Updates: conflict resolution (RFC4703) - DNS Updates: security (TSIG) - Support for subscriber-id (bug 209) - Support for storing remote-id, subscriber-id in server-cache.xml - Reconfigure - BSD support [done] - Routing configuration [done] - Universal system for handling new (custom) options 1.0.0 - Received options are stored in /var/lib/dibbler/option-{option-name}. This MUST be done for ALL options. Also, it MUST add interface name to those file names. - Implement support for SNTP option (RFC4075 replacement) - remaining RFC3315 features (M,O bits) - Bulk Leasequery - Fix references in User's guide - Describe MOD_REMOTE_AUTOCONF Remote autoconf extension in Developer's Guide - Describe MOD_CLNT_CONFIRM in Developer's Guide - Add examples for ds-lite, custom options and remote-autoconf - Mac OS: configure DNS and domain properly (used mDNSresponder or Bonjour APIs) - Mac OS: create dmg package for easier installation - accept "option domain-name" besides "option domain" - RFC3315, 9.1 duid length is no longer than 128 octets - Add sanity length checks in Options constructors - Remove setDUID() method from TOpt() - Implement support for Client vendor class options - Fix: Elapsed time should be specified with 10ms granulation. - Cleanup: Migrated to STL. Remove Container.h and replace it with - CLI: AUTH: set ClntCfgIface->getKeyGenerationState() somewhere - SRV: PD: prefixes are not removed from db if valid goes to 0. - CLI: PD: radvd.conf is invalid if there were more than one prefix added to the same interface - CLI: Implement client side prefix delegation hints. It must be possible to define, what prefix(es) client will send as hints. - SRV: Prefixes stored in server's AddrMgr for too long (i.e. after its valid lifetime has expired) should be removed from the server's database (see SrvAddrMgr::doDuties()) - CLI: When server is not configured to support PD and client requests PD, server sends PD with status code set to NOADDRSAVAIL (that is ok). However, client should complain about it (and maybe try to do something with it). Right now it prints information that "PD set successfully." - ALL: Migrate SPtr -> SPtr, TIPv6Addr -> TAddr - ALL: Make TAddrAddr a derived class from TAddr - CLI: Remember last assigned address. - DOC: Add "Static reservation" section to User's Guide (describe white-list and cache-function) - CLI/BUG: when FQDN is assigned, client performs update first, then verifies tentative status. It should be done in reverse order. - SRV: When client does not send RELEASE (crash, went out of range), server does not perform FQDN delete. - When server shuts down, it does not perform FQDN delete. - SRV/CLI: TransMgr->dump() should be implemented. - CLI: Clnt requests for Address and options (receives both and lifetime option). It should send renew only if T1lifetime. - REL: 20. RFC3315: If the relay agent has not been explicitly configured, it MUST use the All_DHCP_Servers multicast address as the default. - CLI: setting up a domain: echo homenetwork > /etc/dnsdomainname - check server's behavior: there isn't any addrs left, and srv receives SOLICIT. Does PREFERENCE have normal value (e.g. not faulty 255, check tex/test09/10th packet) - When client receives NO-ADDR AVAILABLE, it simultaneusly: starts SOLICIT transaction, sends REQUEST to next server on backup list. - test11: reply contains empty IA with 2 STATUS CODE options: 1. unspecfail (1) + description "no such IA" 2. ok (!!!) [This entry is so old and lots of the code has been rewritten since. Is it still valid bug?] - CLI: client's answers are generated by answer(...) method, whereas server's answers are generated in the relayMsg method by differents constructors of the same message. Shouldn't it be better to make it homogeneous ? I don't have any preference :) - CLI: ClntIfaceMgr: remove ugly sleep(3) instruction. - CLI: Server ADVERTISE evaluations. There should be some kind of ranking system, which checks that IAs, TAs and PDs were provided. And options too. - SRV/CLI: Suboptions parsing. It's done in lots of places, but should be done in one. e.g. TSrvOptIA_NA, TClntOptIA_NA, TClntOptTA, TSrvOptTA constructors. - SRV: {Server|Client}Identifier is added in numerous places in SrvOpt*.cpp. It should be added in TSrvMsg::appendRequestedOptions() - SRV: How many addrs can be assigned to the client? Implement counter in the TAddrClient class. - TEST: Implement test environment [Megatask] Dibbler BUGS -------------- - When RELEASEing PDs, there's a warning about second attempt to remove PD from AddrMgr. - Remove msg cache from server. - Add GetCfgMgr, GetAddrMgr, GetTransMgr, GetIfaceMgr singletons Philly bakeoff BUGS/OBSERVATIONS ---------------------------------- 1. There are 2 servers, one of them responds with IA/NOADDRSAVAIL, second responds fine. Client sends REQUEST and gets address configured. BUG: It also sends another SOLICIT. 2. Several RELEASEs from Richard, sending REPLYies. 3. HP-UX server sends address with valid-lifetime set to 0. Client adds and removes address immediately, then waits 30 seconds for RENEW. Dibbler client tries to RENEW and crash. 4. Client stateless. Insist mode implemented. [done] 5. Client gets confused when after RENEW, server sends NO-BINDING. The address eventually expires and client sleeps for 0xffffffff seconds. 6. Make (INFORMATION_REFRESH_TIME configurable). 7. Dibbler client asks for TA, dibbler server provides it. Client accepts, adds address, but for some reason it sends SOLICIT. 8. Leasequery: (Discussion with Bernie) Asking about address from the pool, but not assigned, should return empty (without LQ Client option) response. Asking about address outside of the pool should report not-configured (that works ok right now). 9. Add configuration to send InfRefreshTime in stateless-mode Vancouver bakeoff BUGS/OBSERVATIONS ------------------------------------- + Windows client tested. 1. Zero padding in DUID parsing (e.g. in requestor cmd-line, but the TDUID constructor is messed up) is wrong: 0:1:2:3:4:5 parsed as: 012345 2. Cli gets addr from SRV1, SRV1 goes down, CLI rebinds to SRV2 and gets addr from it. CLI sends renew for both addrs: the one it got from SRV1 and SRV2. [nobug. That is proper behavior. First address is still valid.] 3. Client does not request for a UNICAST option (does not send the ORO with unicast). [done] 4. Unicast over 2 relays does not work. Cli send Solicit, Srv sends ADV, CLI send REQ using unicast address, but that REQ is not seen by the SRV. 5. CLI should send REQ to multicast (because it does not have address with sufficient scope). [done] 6. CLI gets addr from SRV, SRV goes down and up, SRV ignores RENEW, then goes REBIND, and then goes for RENEW. (should go SOLICIT) 7. SRV configured to pref: 60 valid: 120, CLI asks for 7200/10800 and SRV grants 7200/10800. (CLI behind double relay, looks like messing pools, i.e. using pool on the eth0, not relay2 interface). [rootcause: server misconfiguration] 8. SRV: LeaseQuery (by address) about PD should check if the address is contained within the prefix. 9. Implement insist-mode off in stateless autoconf. 10. Windows client does not set DNS server in the stateless mode. 11. DAD does not work on Windows. 12. FQDN does not start if rapid-commit is used. 13. No log created (no directory) silently omitted. New tasks should be added to the TODO list. After task is implemented, it should be moved to the 'DONE/Not Validated' list. After confirmation that it is working properly, it can be removed completely. - CLI: link-change detection: part of the log file. kernel: ADDRCONF(NETDEV_UP): eth1: link is not ready kernel: ADDRCONF(NETDEV_CHANGE): eth1: link becomes ready DONE/Not validated -------------------- - CLI: PD: this should be possible "iface eth0 { pd { prefix 2000::/64 } }" - CLI: PD: this should be possible "iface eth0 { pd { prefix prefix } }" - CLI: Win32: prefix delegation low-level support is not implemented. - CLI: PD: prefixes are not removed if valid goes to 0. - CLI: PD: Rebind attempt segfaults - CLI: PD: this cfg: "iface eth0 { pd }" does not work - CLI: PD: this should be possible "iface eth0 { pd pd }" - CLI: PD: RENEW does not work - SRV: Prefix hint analysis. (client support for hints is required) - SRV: Perform DNS Update delete, when RELEASE is sent (SrvMsgReply.cpp:387) - CLI: Perform DNS Update delete, when RELEASE is sent (ClntMsgRelease.cpp:102) - CLI/BUG: domain format in /etc/resolv.conf must be fixed DONE ------ - ALL: Fix linux low-level interface (don't use PKTINFO anymore). - CLI: Elapsed time is not recalculated when SOLICIT is resent - SRV/REL: Support InterfaceID option with length other than 4 - Feature: Add support for admin configured options both on server and client as well. - Fix (easy): run unicast server, run client, cli gets single addr, restart server, restart client, srv will send NoAddrsAvail. - CLI: Linux: prefixes should be moved to Port-linux. - DOC: Describe dumping XML files, option files - SRV: Crashes when not configured to support prefix-delegation, but client sends pd option. - DOC: Describe strict-rfc-no-routing on the client side - CLI/BUG: option fqdn - does not work, option fqdn some.name.com must be used in client.conf file - SRV: Add cache. SrvAddrMgr - cachedLst. - SRV: Add to SrvParser options: cache-size - SRV: Store cache on disk. Read cache during startup. - SRV/CLI: Implement vendor-class support. - CLI: Add address with /64 prefix, add option to ClntParser strict-rfc-no-routing to disable this. BUGS ------ See http://klub.com.pl/bugzilla/ DRAFTS & RFCs --------------- Netboot: https://datatracker.ietf.org/doc/draft-ietf-dhc-dhcpv6-opt-netboot/ DS-Lite tunnel: https://datatracker.ietf.org/doc/draft-ietf-softwire-ds-lite-tunnel-option/ REDESIGN IDEAS ---------------- Current hierarchy: class TClntParsGlobalOpt : public TClntParsIfaceOpt class TClntParsIfaceOpt : public TClntParsIAOpt class TClntParsIAOpt : public TClntParsAddrOpt class TClntParsAddrOpt ClntCfgMgr ClntCfgIface ClntCfgIA ClntCfgTA ClntCfgPD ClntCfgAddr ClntCfgPrefix CODE CLEANUP -------------- - remove void TClntMsg::invalidAllowOptInMsg(int msg, int opt) { - remove void TClntMsg::invalidAllowOptInOpt(int msg, int parentOpt, int childOpt) { - rename TClntTransMgr::addAdvertise to addReceivedAdvertise REMOTE-AUTOCONF ----------------- - target server uses unicasts - previous server announces option_REMOTE_AUTOCONF_NEIGHNORS option: - List of addresses (list of neighboring DHCPv6 servers) - Client receives list of neighbors - Client obtains configuration locally - Client Sends unicast solicit to all dst servers with OPTION_REMOTE_AUTOCONF - Server responds with ADVERTISE (including OPTION_REMOTE_AUTOCONF) - Client sends unicast request to dst server wthi OPTION_REMOTE_AUTOCONF - Server responds with REPLY (including OPTION_REMOTE_AUTOCONF) - external entities (mip daemon?) are notified - Client maintains extra information till handover - After handover, client uses a priori knowledge to configure parameters instanteously (copy alternative configuration to main configuration) Client operation: - Store additional configuration in AddrMgr->Client->IA->alternativeConf - Add CheckRemoteAutoConf to ClntTransMgr - Add UseAlternativeIA(copies from alternative IA to "main" IA after HO) - Modify Reply (if handled IA is remote, then don't call IfaceMgr->addAddr() ) dibbler-1.0.1/test-driver0000755000175000017500000000761112304040124012226 00000000000000#! /bin/sh # test-driver - basic testsuite driver script. scriptversion=2012-06-27.10; # UTC # Copyright (C) 2011-2013 Free Software Foundation, Inc. # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # This file is maintained in Automake, please report # bugs to or send patches to # . # Make unconditional expansion of undefined variables an error. This # helps a lot in preventing typo-related bugs. set -u usage_error () { echo "$0: $*" >&2 print_usage >&2 exit 2 } print_usage () { cat <$log_file 2>&1 estatus=$? if test $enable_hard_errors = no && test $estatus -eq 99; then estatus=1 fi case $estatus:$expect_failure in 0:yes) col=$red res=XPASS recheck=yes gcopy=yes;; 0:*) col=$grn res=PASS recheck=no gcopy=no;; 77:*) col=$blu res=SKIP recheck=no gcopy=yes;; 99:*) col=$mgn res=ERROR recheck=yes gcopy=yes;; *:yes) col=$lgn res=XFAIL recheck=no gcopy=yes;; *:*) col=$red res=FAIL recheck=yes gcopy=yes;; esac # Report outcome to console. echo "${col}${res}${std}: $test_name" # Register the test result, and other relevant metadata. echo ":test-result: $res" > $trs_file echo ":global-test-result: $res" >> $trs_file echo ":recheck: $recheck" >> $trs_file echo ":copy-in-global-log: $gcopy" >> $trs_file # Local Variables: # mode: shell-script # sh-indentation: 2 # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC" # time-stamp-end: "; # UTC" # End: dibbler-1.0.1/depcomp0000755000175000017500000005570312277722750011437 00000000000000#! /bin/sh # depcomp - compile a program generating dependencies as side-effects scriptversion=2012-10-18.11; # UTC # Copyright (C) 1999-2013 Free Software Foundation, Inc. # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License # along with this program. If not, see . # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # Originally written by Alexandre Oliva . case $1 in '') echo "$0: No command. Try '$0 --help' for more information." 1>&2 exit 1; ;; -h | --h*) cat <<\EOF Usage: depcomp [--help] [--version] PROGRAM [ARGS] Run PROGRAMS ARGS to compile a file, generating dependencies as side-effects. Environment variables: depmode Dependency tracking mode. source Source file read by 'PROGRAMS ARGS'. object Object file output by 'PROGRAMS ARGS'. DEPDIR directory where to store dependencies. depfile Dependency file to output. tmpdepfile Temporary file to use when outputting dependencies. libtool Whether libtool is used (yes/no). Report bugs to . EOF exit $? ;; -v | --v*) echo "depcomp $scriptversion" exit $? ;; esac # Get the directory component of the given path, and save it in the # global variables '$dir'. Note that this directory component will # be either empty or ending with a '/' character. This is deliberate. set_dir_from () { case $1 in */*) dir=`echo "$1" | sed -e 's|/[^/]*$|/|'`;; *) dir=;; esac } # Get the suffix-stripped basename of the given path, and save it the # global variable '$base'. set_base_from () { base=`echo "$1" | sed -e 's|^.*/||' -e 's/\.[^.]*$//'` } # If no dependency file was actually created by the compiler invocation, # we still have to create a dummy depfile, to avoid errors with the # Makefile "include basename.Plo" scheme. make_dummy_depfile () { echo "#dummy" > "$depfile" } # Factor out some common post-processing of the generated depfile. # Requires the auxiliary global variable '$tmpdepfile' to be set. aix_post_process_depfile () { # If the compiler actually managed to produce a dependency file, # post-process it. if test -f "$tmpdepfile"; then # Each line is of the form 'foo.o: dependency.h'. # Do two passes, one to just change these to # $object: dependency.h # and one to simply output # dependency.h: # which is needed to avoid the deleted-header problem. { sed -e "s,^.*\.[$lower]*:,$object:," < "$tmpdepfile" sed -e "s,^.*\.[$lower]*:[$tab ]*,," -e 's,$,:,' < "$tmpdepfile" } > "$depfile" rm -f "$tmpdepfile" else make_dummy_depfile fi } # A tabulation character. tab=' ' # A newline character. nl=' ' # Character ranges might be problematic outside the C locale. # These definitions help. upper=ABCDEFGHIJKLMNOPQRSTUVWXYZ lower=abcdefghijklmnopqrstuvwxyz digits=0123456789 alpha=${upper}${lower} if test -z "$depmode" || test -z "$source" || test -z "$object"; then echo "depcomp: Variables source, object and depmode must be set" 1>&2 exit 1 fi # Dependencies for sub/bar.o or sub/bar.obj go into sub/.deps/bar.Po. depfile=${depfile-`echo "$object" | sed 's|[^\\/]*$|'${DEPDIR-.deps}'/&|;s|\.\([^.]*\)$|.P\1|;s|Pobj$|Po|'`} tmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`} rm -f "$tmpdepfile" # Avoid interferences from the environment. gccflag= dashmflag= # Some modes work just like other modes, but use different flags. We # parameterize here, but still list the modes in the big case below, # to make depend.m4 easier to write. Note that we *cannot* use a case # here, because this file can only contain one case statement. if test "$depmode" = hp; then # HP compiler uses -M and no extra arg. gccflag=-M depmode=gcc fi if test "$depmode" = dashXmstdout; then # This is just like dashmstdout with a different argument. dashmflag=-xM depmode=dashmstdout fi cygpath_u="cygpath -u -f -" if test "$depmode" = msvcmsys; then # This is just like msvisualcpp but w/o cygpath translation. # Just convert the backslash-escaped backslashes to single forward # slashes to satisfy depend.m4 cygpath_u='sed s,\\\\,/,g' depmode=msvisualcpp fi if test "$depmode" = msvc7msys; then # This is just like msvc7 but w/o cygpath translation. # Just convert the backslash-escaped backslashes to single forward # slashes to satisfy depend.m4 cygpath_u='sed s,\\\\,/,g' depmode=msvc7 fi if test "$depmode" = xlc; then # IBM C/C++ Compilers xlc/xlC can output gcc-like dependency information. gccflag=-qmakedep=gcc,-MF depmode=gcc fi case "$depmode" in gcc3) ## gcc 3 implements dependency tracking that does exactly what ## we want. Yay! Note: for some reason libtool 1.4 doesn't like ## it if -MD -MP comes after the -MF stuff. Hmm. ## Unfortunately, FreeBSD c89 acceptance of flags depends upon ## the command line argument order; so add the flags where they ## appear in depend2.am. Note that the slowdown incurred here ## affects only configure: in makefiles, %FASTDEP% shortcuts this. for arg do case $arg in -c) set fnord "$@" -MT "$object" -MD -MP -MF "$tmpdepfile" "$arg" ;; *) set fnord "$@" "$arg" ;; esac shift # fnord shift # $arg done "$@" stat=$? if test $stat -ne 0; then rm -f "$tmpdepfile" exit $stat fi mv "$tmpdepfile" "$depfile" ;; gcc) ## Note that this doesn't just cater to obsosete pre-3.x GCC compilers. ## but also to in-use compilers like IMB xlc/xlC and the HP C compiler. ## (see the conditional assignment to $gccflag above). ## There are various ways to get dependency output from gcc. Here's ## why we pick this rather obscure method: ## - Don't want to use -MD because we'd like the dependencies to end ## up in a subdir. Having to rename by hand is ugly. ## (We might end up doing this anyway to support other compilers.) ## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like ## -MM, not -M (despite what the docs say). Also, it might not be ## supported by the other compilers which use the 'gcc' depmode. ## - Using -M directly means running the compiler twice (even worse ## than renaming). if test -z "$gccflag"; then gccflag=-MD, fi "$@" -Wp,"$gccflag$tmpdepfile" stat=$? if test $stat -ne 0; then rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" echo "$object : \\" > "$depfile" # The second -e expression handles DOS-style file names with drive # letters. sed -e 's/^[^:]*: / /' \ -e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile" ## This next piece of magic avoids the "deleted header file" problem. ## The problem is that when a header file which appears in a .P file ## is deleted, the dependency causes make to die (because there is ## typically no way to rebuild the header). We avoid this by adding ## dummy dependencies for each header file. Too bad gcc doesn't do ## this for us directly. ## Some versions of gcc put a space before the ':'. On the theory ## that the space means something, we add a space to the output as ## well. hp depmode also adds that space, but also prefixes the VPATH ## to the object. Take care to not repeat it in the output. ## Some versions of the HPUX 10.20 sed can't process this invocation ## correctly. Breaking it into two sed invocations is a workaround. tr ' ' "$nl" < "$tmpdepfile" \ | sed -e 's/^\\$//' -e '/^$/d' -e "s|.*$object$||" -e '/:$/d' \ | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; hp) # This case exists only to let depend.m4 do its work. It works by # looking at the text of this script. This case will never be run, # since it is checked for above. exit 1 ;; sgi) if test "$libtool" = yes; then "$@" "-Wp,-MDupdate,$tmpdepfile" else "$@" -MDupdate "$tmpdepfile" fi stat=$? if test $stat -ne 0; then rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" if test -f "$tmpdepfile"; then # yes, the sourcefile depend on other files echo "$object : \\" > "$depfile" # Clip off the initial element (the dependent). Don't try to be # clever and replace this with sed code, as IRIX sed won't handle # lines with more than a fixed number of characters (4096 in # IRIX 6.2 sed, 8192 in IRIX 6.5). We also remove comment lines; # the IRIX cc adds comments like '#:fec' to the end of the # dependency line. tr ' ' "$nl" < "$tmpdepfile" \ | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' \ | tr "$nl" ' ' >> "$depfile" echo >> "$depfile" # The second pass generates a dummy entry for each header file. tr ' ' "$nl" < "$tmpdepfile" \ | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \ >> "$depfile" else make_dummy_depfile fi rm -f "$tmpdepfile" ;; xlc) # This case exists only to let depend.m4 do its work. It works by # looking at the text of this script. This case will never be run, # since it is checked for above. exit 1 ;; aix) # The C for AIX Compiler uses -M and outputs the dependencies # in a .u file. In older versions, this file always lives in the # current directory. Also, the AIX compiler puts '$object:' at the # start of each line; $object doesn't have directory information. # Version 6 uses the directory in both cases. set_dir_from "$object" set_base_from "$object" if test "$libtool" = yes; then tmpdepfile1=$dir$base.u tmpdepfile2=$base.u tmpdepfile3=$dir.libs/$base.u "$@" -Wc,-M else tmpdepfile1=$dir$base.u tmpdepfile2=$dir$base.u tmpdepfile3=$dir$base.u "$@" -M fi stat=$? if test $stat -ne 0; then rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" exit $stat fi for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" do test -f "$tmpdepfile" && break done aix_post_process_depfile ;; tcc) # tcc (Tiny C Compiler) understand '-MD -MF file' since version 0.9.26 # FIXME: That version still under development at the moment of writing. # Make that this statement remains true also for stable, released # versions. # It will wrap lines (doesn't matter whether long or short) with a # trailing '\', as in: # # foo.o : \ # foo.c \ # foo.h \ # # It will put a trailing '\' even on the last line, and will use leading # spaces rather than leading tabs (at least since its commit 0394caf7 # "Emit spaces for -MD"). "$@" -MD -MF "$tmpdepfile" stat=$? if test $stat -ne 0; then rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" # Each non-empty line is of the form 'foo.o : \' or ' dep.h \'. # We have to change lines of the first kind to '$object: \'. sed -e "s|.*:|$object :|" < "$tmpdepfile" > "$depfile" # And for each line of the second kind, we have to emit a 'dep.h:' # dummy dependency, to avoid the deleted-header problem. sed -n -e 's|^ *\(.*\) *\\$|\1:|p' < "$tmpdepfile" >> "$depfile" rm -f "$tmpdepfile" ;; ## The order of this option in the case statement is important, since the ## shell code in configure will try each of these formats in the order ## listed in this file. A plain '-MD' option would be understood by many ## compilers, so we must ensure this comes after the gcc and icc options. pgcc) # Portland's C compiler understands '-MD'. # Will always output deps to 'file.d' where file is the root name of the # source file under compilation, even if file resides in a subdirectory. # The object file name does not affect the name of the '.d' file. # pgcc 10.2 will output # foo.o: sub/foo.c sub/foo.h # and will wrap long lines using '\' : # foo.o: sub/foo.c ... \ # sub/foo.h ... \ # ... set_dir_from "$object" # Use the source, not the object, to determine the base name, since # that's sadly what pgcc will do too. set_base_from "$source" tmpdepfile=$base.d # For projects that build the same source file twice into different object # files, the pgcc approach of using the *source* file root name can cause # problems in parallel builds. Use a locking strategy to avoid stomping on # the same $tmpdepfile. lockdir=$base.d-lock trap " echo '$0: caught signal, cleaning up...' >&2 rmdir '$lockdir' exit 1 " 1 2 13 15 numtries=100 i=$numtries while test $i -gt 0; do # mkdir is a portable test-and-set. if mkdir "$lockdir" 2>/dev/null; then # This process acquired the lock. "$@" -MD stat=$? # Release the lock. rmdir "$lockdir" break else # If the lock is being held by a different process, wait # until the winning process is done or we timeout. while test -d "$lockdir" && test $i -gt 0; do sleep 1 i=`expr $i - 1` done fi i=`expr $i - 1` done trap - 1 2 13 15 if test $i -le 0; then echo "$0: failed to acquire lock after $numtries attempts" >&2 echo "$0: check lockdir '$lockdir'" >&2 exit 1 fi if test $stat -ne 0; then rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" # Each line is of the form `foo.o: dependent.h', # or `foo.o: dep1.h dep2.h \', or ` dep3.h dep4.h \'. # Do two passes, one to just change these to # `$object: dependent.h' and one to simply `dependent.h:'. sed "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile" # Some versions of the HPUX 10.20 sed can't process this invocation # correctly. Breaking it into two sed invocations is a workaround. sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" \ | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; hp2) # The "hp" stanza above does not work with aCC (C++) and HP's ia64 # compilers, which have integrated preprocessors. The correct option # to use with these is +Maked; it writes dependencies to a file named # 'foo.d', which lands next to the object file, wherever that # happens to be. # Much of this is similar to the tru64 case; see comments there. set_dir_from "$object" set_base_from "$object" if test "$libtool" = yes; then tmpdepfile1=$dir$base.d tmpdepfile2=$dir.libs/$base.d "$@" -Wc,+Maked else tmpdepfile1=$dir$base.d tmpdepfile2=$dir$base.d "$@" +Maked fi stat=$? if test $stat -ne 0; then rm -f "$tmpdepfile1" "$tmpdepfile2" exit $stat fi for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" do test -f "$tmpdepfile" && break done if test -f "$tmpdepfile"; then sed -e "s,^.*\.[$lower]*:,$object:," "$tmpdepfile" > "$depfile" # Add 'dependent.h:' lines. sed -ne '2,${ s/^ *// s/ \\*$// s/$/:/ p }' "$tmpdepfile" >> "$depfile" else make_dummy_depfile fi rm -f "$tmpdepfile" "$tmpdepfile2" ;; tru64) # The Tru64 compiler uses -MD to generate dependencies as a side # effect. 'cc -MD -o foo.o ...' puts the dependencies into 'foo.o.d'. # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put # dependencies in 'foo.d' instead, so we check for that too. # Subdirectories are respected. set_dir_from "$object" set_base_from "$object" if test "$libtool" = yes; then # Libtool generates 2 separate objects for the 2 libraries. These # two compilations output dependencies in $dir.libs/$base.o.d and # in $dir$base.o.d. We have to check for both files, because # one of the two compilations can be disabled. We should prefer # $dir$base.o.d over $dir.libs/$base.o.d because the latter is # automatically cleaned when .libs/ is deleted, while ignoring # the former would cause a distcleancheck panic. tmpdepfile1=$dir$base.o.d # libtool 1.5 tmpdepfile2=$dir.libs/$base.o.d # Likewise. tmpdepfile3=$dir.libs/$base.d # Compaq CCC V6.2-504 "$@" -Wc,-MD else tmpdepfile1=$dir$base.d tmpdepfile2=$dir$base.d tmpdepfile3=$dir$base.d "$@" -MD fi stat=$? if test $stat -ne 0; then rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" exit $stat fi for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" do test -f "$tmpdepfile" && break done # Same post-processing that is required for AIX mode. aix_post_process_depfile ;; msvc7) if test "$libtool" = yes; then showIncludes=-Wc,-showIncludes else showIncludes=-showIncludes fi "$@" $showIncludes > "$tmpdepfile" stat=$? grep -v '^Note: including file: ' "$tmpdepfile" if test $stat -ne 0; then rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" echo "$object : \\" > "$depfile" # The first sed program below extracts the file names and escapes # backslashes for cygpath. The second sed program outputs the file # name when reading, but also accumulates all include files in the # hold buffer in order to output them again at the end. This only # works with sed implementations that can handle large buffers. sed < "$tmpdepfile" -n ' /^Note: including file: *\(.*\)/ { s//\1/ s/\\/\\\\/g p }' | $cygpath_u | sort -u | sed -n ' s/ /\\ /g s/\(.*\)/'"$tab"'\1 \\/p s/.\(.*\) \\/\1:/ H $ { s/.*/'"$tab"'/ G p }' >> "$depfile" rm -f "$tmpdepfile" ;; msvc7msys) # This case exists only to let depend.m4 do its work. It works by # looking at the text of this script. This case will never be run, # since it is checked for above. exit 1 ;; #nosideeffect) # This comment above is used by automake to tell side-effect # dependency tracking mechanisms from slower ones. dashmstdout) # Important note: in order to support this mode, a compiler *must* # always write the preprocessed file to stdout, regardless of -o. "$@" || exit $? # Remove the call to Libtool. if test "$libtool" = yes; then while test "X$1" != 'X--mode=compile'; do shift done shift fi # Remove '-o $object'. IFS=" " for arg do case $arg in -o) shift ;; $object) shift ;; *) set fnord "$@" "$arg" shift # fnord shift # $arg ;; esac done test -z "$dashmflag" && dashmflag=-M # Require at least two characters before searching for ':' # in the target name. This is to cope with DOS-style filenames: # a dependency such as 'c:/foo/bar' could be seen as target 'c' otherwise. "$@" $dashmflag | sed "s|^[$tab ]*[^:$tab ][^:][^:]*:[$tab ]*|$object: |" > "$tmpdepfile" rm -f "$depfile" cat < "$tmpdepfile" > "$depfile" # Some versions of the HPUX 10.20 sed can't process this sed invocation # correctly. Breaking it into two sed invocations is a workaround. tr ' ' "$nl" < "$tmpdepfile" \ | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \ | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; dashXmstdout) # This case only exists to satisfy depend.m4. It is never actually # run, as this mode is specially recognized in the preamble. exit 1 ;; makedepend) "$@" || exit $? # Remove any Libtool call if test "$libtool" = yes; then while test "X$1" != 'X--mode=compile'; do shift done shift fi # X makedepend shift cleared=no eat=no for arg do case $cleared in no) set ""; shift cleared=yes ;; esac if test $eat = yes; then eat=no continue fi case "$arg" in -D*|-I*) set fnord "$@" "$arg"; shift ;; # Strip any option that makedepend may not understand. Remove # the object too, otherwise makedepend will parse it as a source file. -arch) eat=yes ;; -*|$object) ;; *) set fnord "$@" "$arg"; shift ;; esac done obj_suffix=`echo "$object" | sed 's/^.*\././'` touch "$tmpdepfile" ${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@" rm -f "$depfile" # makedepend may prepend the VPATH from the source file name to the object. # No need to regex-escape $object, excess matching of '.' is harmless. sed "s|^.*\($object *:\)|\1|" "$tmpdepfile" > "$depfile" # Some versions of the HPUX 10.20 sed can't process the last invocation # correctly. Breaking it into two sed invocations is a workaround. sed '1,2d' "$tmpdepfile" \ | tr ' ' "$nl" \ | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \ | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" "$tmpdepfile".bak ;; cpp) # Important note: in order to support this mode, a compiler *must* # always write the preprocessed file to stdout. "$@" || exit $? # Remove the call to Libtool. if test "$libtool" = yes; then while test "X$1" != 'X--mode=compile'; do shift done shift fi # Remove '-o $object'. IFS=" " for arg do case $arg in -o) shift ;; $object) shift ;; *) set fnord "$@" "$arg" shift # fnord shift # $arg ;; esac done "$@" -E \ | sed -n -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \ -e '/^#line [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \ | sed '$ s: \\$::' > "$tmpdepfile" rm -f "$depfile" echo "$object : \\" > "$depfile" cat < "$tmpdepfile" >> "$depfile" sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; msvisualcpp) # Important note: in order to support this mode, a compiler *must* # always write the preprocessed file to stdout. "$@" || exit $? # Remove the call to Libtool. if test "$libtool" = yes; then while test "X$1" != 'X--mode=compile'; do shift done shift fi IFS=" " for arg do case "$arg" in -o) shift ;; $object) shift ;; "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI") set fnord "$@" shift shift ;; *) set fnord "$@" "$arg" shift shift ;; esac done "$@" -E 2>/dev/null | sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::\1:p' | $cygpath_u | sort -u > "$tmpdepfile" rm -f "$depfile" echo "$object : \\" > "$depfile" sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::'"$tab"'\1 \\:p' >> "$depfile" echo "$tab" >> "$depfile" sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::\1\::p' >> "$depfile" rm -f "$tmpdepfile" ;; msvcmsys) # This case exists only to let depend.m4 do its work. It works by # looking at the text of this script. This case will never be run, # since it is checked for above. exit 1 ;; none) exec "$@" ;; *) echo "Unknown depmode $depmode" 1>&2 exit 1 ;; esac exit 0 # Local Variables: # mode: shell-script # sh-indentation: 2 # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC" # time-stamp-end: "; # UTC" # End: dibbler-1.0.1/ClntCfgMgr/0000775000175000017500000000000012561700421012103 500000000000000dibbler-1.0.1/ClntCfgMgr/ClntCfgIface.h0000644000175000017500000001745412556512677014477 00000000000000/* * Dibbler - a portable DHCPv6 * * authors: Tomasz Mrugalski * Marek Senderski * changes: Krzysztof Wnuk * Michal Kowalczuk * Mateusz Ozga * * released under GNU GPL v2 only licence */ #ifndef CLNTCFGIFACE_H #define CLNTCFGIFACE_H #include #include "Container.h" #include "HostID.h" #include "SmartPtr.h" #include "DHCPConst.h" #include "IPv6Addr.h" #include "ClntCfgTA.h" #include "ClntParsGlobalOpt.h" #include "SmartPtr.h" #include "DUID.h" #include "ClntCfgIA.h" #include "ClntCfgPD.h" #include "OptVendorSpecInfo.h" #include "Opt.h" class TClntCfgIface { friend std::ostream& operator<<(std::ostream&,TClntCfgIface&); public: class TOptionStatus { public: TOptionStatus(): OptionType(0), State(STATE_NOTCONFIGURED), Option(), Always(true) {}; unsigned short OptionType; EState State; SPtr Option; TOpt::EOptionLayout Layout; bool Always; // should this option be sent always? (even when already configured?) }; typedef std::list< SPtr > TOptionStatusLst; TClntCfgIface(const std::string& ifaceName); TClntCfgIface(int ifaceNr); void setRouting(bool enabled); bool isRoutingEnabled(); EState getRoutingEnabledState(); void setRoutingEnabledState(EState state); bool isServerRejected(SPtr addr,SPtr duid); // IA void firstIA(); int countIA(); SPtr getIA(); SPtr getIA(int iaid); void addIA(SPtr ptr); // PD void firstPD(); int countPD(); SPtr getPD(); SPtr getPD(int iaid); void addPD(SPtr ptr); // TA void firstTA(); void addTA(SPtr ta); SPtr getTA(); int countTA(); std::string getName(void); std::string getFullName(void); void setOptions(SPtr opt); int getID(void); void setNoConfig(); void setIfaceID(int ifaceID); void setIfaceName(const std::string& ifaceName); bool noConfig(); bool stateless(); bool getUnicast(); bool getRapidCommit(); void setRapidCommit(bool rapCom); // --- option: DNS servers --- bool isReqDNSServer(); EState getDNSServerState(); void setDNSServerState(EState state); unsigned long getDNSServerTimeout(); List(TIPv6Addr) * getProposedDNSServerLst(); // --- option: Domain --- bool isReqDomain(); EState getDomainState(); unsigned long getDomainTimeout(); void setDomainState(EState state); List(std::string) * getProposedDomainLst(); // --- option: NTP servers --- bool isReqNTPServer(); EState getNTPServerState(); unsigned long getNTPServerTimeout(); void setNTPServerState(EState state); List(TIPv6Addr) * getProposedNTPServerLst(); // --- option: Timezone --- /// @todo: Once set, these are never used bool isReqTimezone(); EState getTimezoneState(); unsigned long getTimezoneTimeout(); void setTimezoneState(EState state); std::string getProposedTimezone(); // --- option: SIP servers --- bool isReqSIPServer(); EState getSIPServerState(); unsigned long getSIPServerTimeout(); void setSIPServerState(EState state); List(TIPv6Addr) * getProposedSIPServerLst(); // --- option: SIP domains --- bool isReqSIPDomain(); EState getSIPDomainState(); unsigned long getSIPDomainTimeout(); void setSIPDomainState(EState state); List(std::string) * getProposedSIPDomainLst(); // --- option: FQDN --- bool isReqFQDN(); EState getFQDNState(); unsigned long getFQDNTimeout(); void setFQDNState(EState state); std::string getProposedFQDN(); // --- option: NIS servers --- bool isReqNISServer(); EState getNISServerState(); unsigned long getNISServerTimeout(); void setNISServerState(EState state); List(TIPv6Addr) * getProposedNISServerLst(); // --- option: NIS+ servers --- bool isReqNISPServer(); EState getNISPServerState(); unsigned long getNISPServerTimeout(); void setNISPServerState(EState state); List(TIPv6Addr) * getProposedNISPServerLst(); // --- option: NIS domains --- bool isReqNISDomain(); EState getNISDomainState(); unsigned long getNISDomainTimeout(); void setNISDomainState(EState state); std::string getProposedNISDomain(); // --- option: NIS+ domains --- bool isReqNISPDomain(); EState getNISPDomainState(); unsigned long getNISPDomainTimeout(); void setNISPDomainState(EState state); std::string getProposedNISPDomain(); // --- option: Lifetime --- bool isReqLifetime(); EState getLifetimeState(); void setLifetimeState(EState state); // --- see strict-rfc-no-routing --- void setOnLinkPrefixLength(int len); int getOnLinkPrefixLength(); // --- option: VendorSpec --- bool isReqVendorSpec(); void vendorSpecSupported(bool support); EState getVendorSpecState(); void setVendorSpecState(EState state); void firstVendorSpec(); SPtr getVendorSpec(); int getVendorSpecCount(); void setVendorSpec(List(TOptVendorSpecInfo) vendorSpecList); // --- custom/extra options --- void addExtraOption(SPtr extra, TOpt::EOptionLayout layout, bool sendAlways); void addExtraOption(int optType, TOpt::EOptionLayout layout, bool sendAlways); TOptionStatusLst& getExtraOptions(); SPtr getExtaOptionState(int type); // --- option: KeyGeneration --- EState getKeyGenerationState(); void setKeyGenerationState(EState state); void setMbit(bool m_bit); void setObit(bool o_bit); /// @brief sets link-local address to bind to /// @param link_local the link local address the client will bind to void setBindToAddr(SPtr link_local); /// @brief Returns link-local address to which the client should bind (if set) /// @return the address to bind to (or NULL if not set) SPtr getBindToAddr(); private: void setDefaults(); std::string IfaceName; int ID; bool NoConfig; bool Stateful_; bool Unicast; bool RapidCommit; int PrefixLength; // default prefix length of the configured addresses List(TClntCfgIA) IALst; List(TClntCfgPD) PDLst; List(THostID) PrefSrvLst; List(THostID) RejectedSrvLst; List(TClntCfgTA) ClntCfgTALst; List(TIPv6Addr) DNSServerLst; List(std::string) DomainLst; List(TIPv6Addr) NTPServerLst; std::string Timezone; List(TIPv6Addr) SIPServerLst; List(std::string) SIPDomainLst; std::string FQDN; List(TIPv6Addr) NISServerLst; List(TIPv6Addr) NISPServerLst; std::string NISDomain; std::string NISPDomain; List(TOptVendorSpecInfo) VendorSpecLst; EState DNSServerState; EState DomainState; EState NTPServerState; EState TimezoneState; EState SIPServerState; EState SIPDomainState; EState FQDNState; EState NISServerState; EState NISPServerState; EState NISDomainState; EState NISPDomainState; EState LifetimeState; EState PrefixDelegationState; EState VendorSpecState; EState KeyGenerationState; EState RoutingEnabledState; /// @todo: Remove those booleans and use State directly bool ReqDNSServer; bool ReqDomain; bool ReqNTPServer; bool ReqTimezone; bool ReqSIPServer; bool ReqSIPDomain; bool ReqFQDN; bool ReqNISServer; bool ReqNISPServer; bool ReqNISDomain; bool ReqNISPDomain; bool ReqLifetime; bool ReqPrefixDelegation; bool ReqVendorSpec; bool RoutingEnabled; /// @brief Extra options to be sent to server TOptionStatusLst ExtraOpts; /// @brief Specify bind-to address (may be null) SPtr BindToAddr_; }; #endif dibbler-1.0.1/ClntCfgMgr/ClntCfgPrefix.h0000664000175000017500000000212512233256142014674 00000000000000/* * Dibbler - a portable DHCPv6 * * authors: Tomasz Mrugalski * Marek Senderski * changes: Krzysztof Wnuk * * released under GNU GPL v2 only licence * */ #ifndef CLNTCFGPREFIX_H #define CLNTCFGPREFIX_H #include "DHCPConst.h" #include "ClntParsGlobalOpt.h" #include "SmartPtr.h" #include "IPv6Addr.h" #include #include class TClntCfgPrefix { friend std::ostream& operator<<(std::ostream& out,TClntCfgPrefix& group); public: TClntCfgPrefix(); TClntCfgPrefix(SPtr prefix, unsigned char prefixLength); TClntCfgPrefix(SPtr prefix, unsigned long valid, unsigned long pref, unsigned char prefixLength); ~TClntCfgPrefix(); SPtr get(); unsigned long getValid(); unsigned long getPref(); inline unsigned char getLength() { return PrefixLength; } void setOptions(SPtr opt); private: SPtr Prefix; unsigned long Valid; unsigned long Pref; unsigned char PrefixLength; }; #endif dibbler-1.0.1/ClntCfgMgr/ClntCfgIA.h0000664000175000017500000000222012233256142013724 00000000000000/* * Dibbler - a portable DHCPv6 * * authors: Tomasz Mrugalski * Marek Senderski * * released under GNU GPL v2 only licence * */ class TClntCfgIA; #ifndef CLNTCFGIA_H #define CLNTCFGIA_H #include "ClntCfgAddr.h" #include "ClntParsGlobalOpt.h" #include "DHCPConst.h" #include #include class TClntCfgIA { friend std::ostream& operator<<(std::ostream& out, TClntCfgIA& group); public: long getIAID(); void setIAID(long iaid); unsigned long getT1(); unsigned long getT2(); void setOptions(SPtr opt); void firstAddr(); SPtr getAddr(); long countAddr(); void addAddr(SPtr addr); TClntCfgIA(); TClntCfgIA(SPtr right, long iAID); void reset(); void setState(enum EState state); enum EState getState(); bool getAddrParams(); private: unsigned long IAID; unsigned long T1; unsigned long T2; EState State; List(TClntCfgAddr) ClntCfgAddrLst; static long newID(); bool AddrParams; /// experimental address parameters feature }; #endif dibbler-1.0.1/ClntCfgMgr/ClntParsGlobalOpt.h0000644000175000017500000000220712277722750015542 00000000000000/* * Dibbler - a portable DHCPv6 * * authors: Tomasz Mrugalski * Marek Senderski * * released under GNU GPL v2 only licence * */ class TClntParsGlobalOpt; #ifndef PARSGLOBALOPT_H #define PARSGLOBALOPT_H #include "ClntParsIfaceOpt.h" #include "DHCPConst.h" class TClntParsGlobalOpt : public TClntParsIfaceOpt { public: TClntParsGlobalOpt(); ~TClntParsGlobalOpt(); void setWorkDir(const std::string& dir); std::string getWorkDir(); void setOnLinkPrefixLength(int len); int getOnLinkPrefixLength(); void setAnonInfRequest(bool anonymous); bool getAnonInfRequest(); void setInsistMode(bool insist); bool getInsistMode(); void setInactiveMode(bool flex); bool getInactiveMode(); void setExperimental(); bool getExperimental(); void setFQDNFlagS(bool s); bool getFQDNFlagS(); void setConfirm(bool conf); bool getConfirm(); private: std::string WorkDir; int PrefixLength; bool AnonInfRequest; bool InactiveMode; bool InsistMode; bool UseConfirm; bool FQDNFlagS; bool Experimental; }; #endif dibbler-1.0.1/ClntCfgMgr/ClntCfgPD.h0000664000175000017500000000202312233256142013737 00000000000000/* * Dibbler - a portable DHCPv6 * * author: Krzysztof Wnuk * * released under GNU GPL v2 only licence * */ #ifndef CLNTCFGPD_H #define CLNTCFGPD_H #include "ClntCfgPrefix.h" #include "ClntParsGlobalOpt.h" #include "DHCPConst.h" #include #include class TClntCfgPD { friend std::ostream& operator<<(std::ostream& out, TClntCfgPD& group); public: long getIAID(); void setIAID(long iaid); unsigned long getT1(); unsigned long getT2(); char getPrefixLength(); void setOptions(SPtr opt); void firstPrefix(); SPtr getPrefix(); long countPrefixes(); void addPrefix(SPtr addr); TClntCfgPD(); TClntCfgPD(SPtr right, long iAID); void setState(enum EState state); enum EState getState(); private: List(TClntCfgPrefix) ClntCfgPrefixLst_; unsigned long IAID_; unsigned long T1_; unsigned long T2_; char PrefixLength_; EState State_; }; #endif dibbler-1.0.1/ClntCfgMgr/ClntLexer.l0000644000175000017500000002442012474447243014115 00000000000000%option noyywrap %option yylineno %{ #ifdef WIN32 #define strncasecmp _strnicmp #endif using namespace std; #include "ClntParser.h" #include "Portable.h" #define YYABORT yyterminate(); /* duplicate default definition from flex. This makes cppcheck check for defined YY_FATAL_ERROR() go away. */ #define YY_FATAL_ERROR(msg) LexerError(msg) %} %x COMMENT %x ADDR hexdigit [0-9A-Fa-f] hexnumber {hexdigit}+h letter [a-zA-Z] cipher [0-9] integer {cipher}+ curly_op [{] curly_cl [}] hex1to4 {hexdigit}{1,4} CR \r LF \n EOL (({CR}{LF}?)|{LF}) %{ using namespace std; namespace std { unsigned ComBeg; //line, in which comment begins unsigned LftCnt; //how many signs : on the left side of :: sign was interpreted unsigned RgtCnt; //the same as above, but on the right side of :: char Address[16]; //address, which is analizying right now char AddrPart[16]; unsigned intpos,pos; yy_ClntParser_stype yylval; } %} %% {EOL}* ; // ignore end of line [ \t] ; // ignore TABs and spaces iface { return ClntParser::IFACE_;} no-config { return ClntParser::NO_CONFIG_;} address { return ClntParser::ADDRESS_KEYWORD_;} string { return ClntParser::STRING_KEYWORD_; } duid { return ClntParser::DUID_KEYWORD_; } hex { return ClntParser::HEX_KEYWORD_; } address-list { return ClntParser::ADDRESS_LIST_KEYWORD_; } name { return ClntParser::NAME_; } ia { return ClntParser::IA_;} ta { return ClntParser::TA_; } iaid { return ClntParser::IAID_; } stateless { return ClntParser::STATELESS_;} log-level { return ClntParser::LOGLEVEL_; } log-mode { return ClntParser::LOGMODE_; } log-name { return ClntParser::LOGNAME_; } log-colors { return ClntParser::LOGCOLORS_; } work-dir { return ClntParser::WORKDIR_;} script { return ClntParser::SCRIPT_; } prefered-lifetime { return ClntParser::PREF_TIME_; } preferred-lifetime { return ClntParser::PREF_TIME_; } valid-lifetime { return ClntParser::VALID_TIME_; } remote-autoconf { return ClntParser::REMOTE_AUTOCONF_; } t1 { return ClntParser::T1_;} t2 { return ClntParser::T2_;} option { return ClntParser::OPTION_; } dns-server { return ClntParser::DNS_SERVER_;} domain { return ClntParser::DOMAIN_;} ntp-server { return ClntParser::NTP_SERVER_;} time-zone { return ClntParser::TIME_ZONE_;} sip-server { return ClntParser::SIP_SERVER_; } sip-domain { return ClntParser::SIP_DOMAIN_; } fqdn { return ClntParser::FQDN_; } fqdn-s { return ClntParser::FQDN_S_; } ddns-protocol { return ClntParser::DDNS_PROTOCOL_; } ddns-timeout { return ClntParser::DDNS_TIMEOUT_; } nis-server { return ClntParser::NIS_SERVER_; } nis-domain { return ClntParser::NIS_DOMAIN_; } nis\+-server { return ClntParser::NISP_SERVER_; } nis\+-domain { return ClntParser::NISP_DOMAIN_; } lifetime { return ClntParser::LIFETIME_; } routing { return ClntParser::ROUTING_; } reject-servers { return ClntParser::REJECT_SERVERS_;} preferred-servers { return ClntParser::PREFERRED_SERVERS_;} prefered-servers { return ClntParser::PREFERRED_SERVERS_;} rapid-commit { return ClntParser::RAPID_COMMIT_;} reconfigure-accept { return ClntParser::RECONFIGURE_; } unicast { return ClntParser::UNICAST_; } strict-rfc-no-routing { return ClntParser::STRICT_RFC_NO_ROUTING_; } obey-ra-bits { return ClntParser::OBEY_RA_BITS_; } prefix-delegation { return ClntParser::PD_; } pd { return ClntParser::PD_; } prefix { return ClntParser::PREFIX_; } duid-type { return ClntParser::DUID_TYPE_; } DUID-LL { return ClntParser::DUID_TYPE_LL_; } DUID-LLT { return ClntParser::DUID_TYPE_LLT_; } DUID-EN { return ClntParser::DUID_TYPE_EN_; } vendor-spec { return ClntParser::VENDOR_SPEC_; } anonymous-inf-request { return ClntParser::ANON_INF_REQUEST_; } insist-mode { return ClntParser::INSIST_MODE_; } inactive-mode { return ClntParser::INACTIVE_MODE_; } auth-methods { return ClntParser::AUTH_METHODS_; } auth-protocol { return ClntParser::AUTH_PROTOCOL_; } auth-algorithm { return ClntParser::AUTH_ALGORITHM_; } auth-replay { return ClntParser::AUTH_REPLAY_; } auth-realm { return ClntParser::AUTH_REALM_; } digest-none { return ClntParser::DIGEST_NONE_; } digest-plain { return ClntParser::DIGEST_PLAIN_; } digest-hmac-md5 { return ClntParser::DIGEST_HMAC_MD5_; } digest-hmac-sha1 { return ClntParser::DIGEST_HMAC_SHA1_; } digest-hmac-sha224 { return ClntParser::DIGEST_HMAC_SHA224_; } digest-hmac-sha256 { return ClntParser::DIGEST_HMAC_SHA256_; } digest-hmac-sha384 { return ClntParser::DIGEST_HMAC_SHA384_; } digest-hmac-sha512 { return ClntParser::DIGEST_HMAC_SHA512_; } skip-confirm { return ClntParser::SKIP_CONFIRM_; } aftr { return ClntParser::AFTR_; } downlink-prefix-ifaces { return ClntParser::DOWNLINK_PREFIX_IFACES_; } bind-to-address { return ClntParser::BIND_TO_ADDR_; } experimental { return ClntParser::EXPERIMENTAL_; } addr-params { return ClntParser::ADDR_PARAMS_; } #.* ; "//"(.*) ; "/*" { BEGIN(COMMENT); ComBeg=yylineno; } "*/" BEGIN(INITIAL); .|"\n" ; <> { Log(Crit) << "Comment not closed. (/* in line " << ComBeg << LogEnd; { YYABORT; } } %{ //IPv6 address - various forms %} ({hex1to4}:){7}{hex1to4} { if(!inet_pton6(yytext,yylval.addrval)) { Log(Crit) << "Invalid address format: [" << yytext << "]" << LogEnd; { YYABORT; } } else { return ClntParser::IPV6ADDR_; } } (({hex1to4}:){1,6})?{hex1to4}"::"(({hex1to4}:){1,6})?{hex1to4} { if(!inet_pton6(yytext,yylval.addrval)) { Log(Crit) << "Invalid address format: [" << yytext << "]" << LogEnd; { YYABORT; } } else { return ClntParser::IPV6ADDR_; } } "::"(({hex1to4}:){1,7})?{hex1to4} { if(!inet_pton6(yytext,yylval.addrval)) { Log(Crit) << "Invalid address format: [" << yytext << "]" << LogEnd; { YYABORT; } } else { Log(Crit) << "Invalid address format: [" << yytext << "]" << LogEnd; return ClntParser::IPV6ADDR_; } } (({hex1to4}:){0,7})?{hex1to4}:: { if(!inet_pton6(yytext,yylval.addrval)) { Log(Crit) << "Invalid address format: [" << yytext << "]" << LogEnd; { YYABORT; } } else { return ClntParser::IPV6ADDR_; } } "::" { if(!inet_pton6(yytext,yylval.addrval)) { Log(Crit) << "Invalid address format: [" << yytext << "]" << LogEnd; { YYABORT; } } else { return ClntParser::IPV6ADDR_; } } (({hex1to4}:){1,5})?{hex1to4}"::"(({hex1to4}:){1,6})?{integer}"."{integer}"."{integer}"."{integer} { if(!inet_pton6(yytext,yylval.addrval)) { Log(Crit) << "Invalid address format: [" << yytext << "]" << LogEnd; { YYABORT; } } else { return ClntParser::IPV6ADDR_; } } "::"(({hex1to4}":"){1,6})?{integer}"."{integer}"."{integer}"."{integer} { if(!inet_pton6(yytext,yylval.addrval)) { Log(Crit) << "Invalid address format: [" << yytext << "]" << LogEnd; { YYABORT; } } else { return ClntParser::IPV6ADDR_; } } ('([^']|(''))*')|(\"[^\"]*\") { yylval.strval=new char[strlen(yytext)-1]; strncpy(yylval.strval, yytext+1, strlen(yytext)-2); yylval.strval[strlen(yytext)-2]=0; return ClntParser::STRING_; } ([a-zA-Z][a-zA-Z0-9\.-]+) { int len = strlen(yytext); if ( ( (len>2) && !strncasecmp("yes",yytext,3) ) || ( (len>3) && !strncasecmp("true", yytext,4) ) ) { yylval.ival = 1; return ClntParser::INTNUMBER_; } if ( ( (len>1) && !strncasecmp("no",yytext,2) ) || ( (len>4) && !strncasecmp("false",yytext,5) ) ) { yylval.ival = 0; return ClntParser::INTNUMBER_; } yylval.strval=new char[strlen(yytext)+1]; strncpy(yylval.strval, yytext, strlen(yytext)); yylval.strval[strlen(yytext)]=0; return ClntParser::STRING_; } 0x{hexdigit}+ { // DUID in 0x00010203 format int len; char * ptr; if (strlen(yytext)%2) { yytext[1]='0'; //if odd than no-meaning zero at the beginning len = strlen(yytext)-1; ptr = yytext+1; } else { len = strlen(yytext)-2; ptr = yytext+2; } //and now there is an even number of hex digits yylval.duidval.length = len >> 1; yylval.duidval.duid = new char[len >> 1]; for (int i=0 ; i>1]<<=4; if (!isxdigit(ptr[i])) { Log(Crit) << "DUID parsing failed (" << yytext << ")." << LogEnd; { YYABORT; } } if (isalpha(ptr[i])) { yylval.duidval.duid[i>>1]|=toupper(ptr[i])-'A'+10; } else { yylval.duidval.duid[i>>1]|=ptr[i]-'0'; } } return ClntParser::DUID_; } {hexdigit}{2}(:{hexdigit}{2})+ { // DUID in 00:01:02:03 format int len = (strlen(yytext)+1)/3; char * pos = 0; yylval.duidval.length = len; yylval.duidval.duid = new char[len]; int i=0; for (pos = yytext; pos<=yytext+strlen(yytext)-2; pos+=3) { char x; if (isalpha(*pos)) x = (toupper(*pos)-'A' + 10); else x = *pos-'0'; x *= 16; if (isalpha(*(pos+1))) x += (toupper(*(pos+1))-'A' + 10); else x += *(pos+1) - '0'; yylval.duidval.duid[i] = x; i++; } return ClntParser::DUID_; } {hexnumber} { yytext[strlen(yytext)-1]='\n'; if(!sscanf(yytext,"%10x",(unsigned int*)&(yylval.ival))) { Log(Crit) << "Hex number parsing [" << yytext << "] failed." << LogEnd; { YYABORT; } } return ClntParser::HEXNUMBER_; } {integer} { if(!sscanf(yytext,"%10u",(unsigned int*)&(yylval.ival))) { Log(Crit) << "Integer parsing [" << yytext << "] failed." << LogEnd; { YYABORT; } } return ClntParser::INTNUMBER_; } . {return yytext[0];} %% dibbler-1.0.1/ClntCfgMgr/ClntParsAddrOpt.cpp0000644000175000017500000000122512277722750015546 00000000000000/* * Dibbler - a portable DHCPv6 * * authors: Tomasz Mrugalski * Marek Senderski * * Released under GNU GPL v2 licence * * $Id: ClntParsAddrOpt.cpp,v 1.3 2004-10-25 20:45:52 thomson Exp $ * * $Log: not supported by cvs2svn $ */ #include #include "ClntParsAddrOpt.h" TClntParsAddrOpt::TClntParsAddrOpt() { Pref=UINT_MAX; Valid=UINT_MAX; } long TClntParsAddrOpt::getPref() { return Pref; } void TClntParsAddrOpt::setPref(long pref) { this->Pref=pref; } long TClntParsAddrOpt::getValid() { return Valid; } void TClntParsAddrOpt::setValid(long valid) { Valid=valid; } dibbler-1.0.1/ClntCfgMgr/Makefile.am0000644000175000017500000000301212277722750014066 00000000000000noinst_LIBRARIES = libClntCfgMgr.a libClntCfgMgr_a_CPPFLAGS = -I$(top_srcdir)/Misc -I$(top_srcdir)/CfgMgr -I$(top_srcdir)/ClntOptions libClntCfgMgr_a_CPPFLAGS += -I$(top_srcdir)/Options -I$(top_srcdir)/ClntIfaceMgr libClntCfgMgr_a_CPPFLAGS += -I$(top_srcdir)/IfaceMgr -I$(top_srcdir)/ClntAddrMgr libClntCfgMgr_a_CPPFLAGS += -I$(top_srcdir)/AddrMgr -I$(top_srcdir)/ClntTransMgr libClntCfgMgr_a_CPPFLAGS += -I$(top_srcdir)/ClntMessages -I$(top_srcdir)/Messages libClntCfgMgr_a_CPPFLAGS += -I$(top_srcdir)/@PORT_SUBDIR@ libClntCfgMgr_a_SOURCES = ClntCfgAddr.cpp ClntCfgAddr.h ClntCfgIA.cpp ClntCfgIA.h ClntCfgIface.cpp ClntCfgIface.h ClntCfgMgr.cpp ClntCfgMgr.h ClntCfgPD.cpp ClntCfgPD.h ClntCfgPrefix.cpp ClntCfgPrefix.h ClntCfgTA.cpp ClntCfgTA.h ClntLexer.cpp ClntParsAddrOpt.cpp ClntParsAddrOpt.h ClntParser.cpp ClntParser.h ClntParsGlobalOpt.cpp ClntParsGlobalOpt.h ClntParsIAOpt.cpp ClntParsIAOpt.h ClntParsIfaceOpt.cpp ClntParsIfaceOpt.h dist_noinst_DATA = ClntLexer.l ClntParser.y parser: ClntParser.y ClntLexer.l @echo "[BISON++] $(SUBDIR)/ClntParser.y" $(top_builddir)/bison++/bison++ --skeleton=$(top_builddir)/bison++/bison.cc --headerskeleton=$(top_builddir)/bison++/bison.h -v --debug --defines -d ClntParser.y -o ClntParser.cpp @echo "[FLEX ] $(SUBDIR)/ClntLexer.l" flex -+ -i -L -oClntLexer.cpp ClntLexer.l @echo "[SED ] $(SUBDIR)/ClntLexer.cpp" cat ClntLexer.cpp | sed 's/extern "C" int isatty (int );/\/\/extern "C" int isatty (int ) throw ();/' > ClntLexer.cpp2 rm -f ClntLexer.cpp mv ClntLexer.cpp2 ClntLexer.cpp dibbler-1.0.1/ClntCfgMgr/ClntParser.h0000644000175000017500000004135612556513130014263 00000000000000#ifndef YY_ClntParser_h_included #define YY_ClntParser_h_included #define YY_USE_CLASS #line 1 "../bison++/bison.h" /* before anything */ #ifdef c_plusplus #ifndef __cplusplus #define __cplusplus #endif #endif #line 8 "../bison++/bison.h" #line 3 "ClntParser.y" #include #include #include #include #include "DHCPConst.h" #include "SmartPtr.h" #include "Container.h" #include "ClntParser.h" #include "ClntParsGlobalOpt.h" #include "ClntCfgIface.h" #include "ClntCfgAddr.h" #include "ClntCfgIA.h" #include "ClntCfgTA.h" #include "ClntCfgPD.h" #include "ClntCfgMgr.h" #include "Logger.h" #include "OptGeneric.h" #include "OptAddr.h" #include "OptAddrLst.h" #include "OptString.h" using namespace std; #define YY_USE_CLASS #define YY_ClntParser_MEMBERS yyFlexLexer * Lex_; \ /*List of options in scope stack,the most fresh is last in the list*/ \ List(TClntParsGlobalOpt) ParserOptStack; \ /*List of parsed interfaces/IAs/Addresses, last */ \ /*interface/IA/address is just being parsing or have been just parsed*/ \ List(TClntCfgIface) ClntCfgIfaceLst; \ List(TClntCfgIA) ClntCfgIALst; \ List(TClntCfgTA) ClntCfgTALst; \ List(TClntCfgPD) ClntCfgPDLst; \ List(TClntCfgAddr) ClntCfgAddrLst; \ DigestTypesLst DigestLst; \ /*Pointer to list which should contain either rejected servers or */ \ /*preffered servers*/ \ List(THostID) PresentStationLst; \ List(TIPv6Addr) PresentAddrLst; \ List(TClntCfgPrefix) PrefixLst; \ List(std::string) PresentStringLst; \ List(TOptVendorSpecInfo) VendorSpec; \ bool IfaceDefined(int ifaceNr); \ bool IfaceDefined(const std::string& ifaceName); \ bool StartIfaceDeclaration(const std::string& ifaceName); \ bool StartIfaceDeclaration(int ifindex); \ bool EndIfaceDeclaration(); \ void EmptyIface(); \ bool StartIADeclaration(bool aggregation); \ void EndIADeclaration(); \ bool StartPDDeclaration(); \ bool EndPDDeclaration(); \ void EmptyIA(); \ void EmptyAddr(); \ TClntCfgMgr * CfgMgr; \ bool iaidSet; \ unsigned int iaid; \ unsigned int AddrCount_; \ virtual ~ClntParser(); \ EDUIDType DUIDType; \ int DUIDEnterpriseNumber; \ SPtr DUIDEnterpriseID; #define YY_ClntParser_CONSTRUCTOR_PARAM yyFlexLexer * lex #define YY_ClntParser_CONSTRUCTOR_CODE \ Lex_ = lex; \ ParserOptStack.append(new TClntParsGlobalOpt()); \ ParserOptStack.getFirst()->setIAIDCnt(1); \ ParserOptStack.getLast(); \ DUIDType = DUID_TYPE_NOT_DEFINED; \ DUIDEnterpriseID.reset(); \ AddrCount_ = 0; \ CfgMgr = 0; \ iaidSet = false; \ iaid = 0xffffffff; \ DUIDEnterpriseNumber = -1; \ yynerrs = 0; \ yychar = 0; #line 91 "ClntParser.y" typedef union { int ival; char *strval; struct SDuid { int length; char* duid; } duidval; char addrval[16]; } yy_ClntParser_stype; #define YY_ClntParser_STYPE yy_ClntParser_stype #line 21 "../bison++/bison.h" /* %{ and %header{ and %union, during decl */ #ifndef YY_ClntParser_COMPATIBILITY #ifndef YY_USE_CLASS #define YY_ClntParser_COMPATIBILITY 1 #else #define YY_ClntParser_COMPATIBILITY 0 #endif #endif #if YY_ClntParser_COMPATIBILITY != 0 /* backward compatibility */ #ifdef YYLTYPE #ifndef YY_ClntParser_LTYPE #define YY_ClntParser_LTYPE YYLTYPE /* WARNING obsolete !!! user defined YYLTYPE not reported into generated header */ /* use %define LTYPE */ #endif #endif /*#ifdef YYSTYPE*/ #ifndef YY_ClntParser_STYPE #define YY_ClntParser_STYPE YYSTYPE /* WARNING obsolete !!! user defined YYSTYPE not reported into generated header */ /* use %define STYPE */ #endif /*#endif*/ #ifdef YYDEBUG #ifndef YY_ClntParser_DEBUG #define YY_ClntParser_DEBUG YYDEBUG /* WARNING obsolete !!! user defined YYDEBUG not reported into generated header */ /* use %define DEBUG */ #endif #endif /* use goto to be compatible */ #ifndef YY_ClntParser_USE_GOTO #define YY_ClntParser_USE_GOTO 1 #endif #endif /* use no goto to be clean in C++ */ #ifndef YY_ClntParser_USE_GOTO #define YY_ClntParser_USE_GOTO 0 #endif #ifndef YY_ClntParser_PURE #line 65 "../bison++/bison.h" #line 65 "../bison++/bison.h" /* YY_ClntParser_PURE */ #endif #line 68 "../bison++/bison.h" #line 68 "../bison++/bison.h" /* prefix */ #ifndef YY_ClntParser_DEBUG #line 71 "../bison++/bison.h" #define YY_ClntParser_DEBUG 1 #line 71 "../bison++/bison.h" /* YY_ClntParser_DEBUG */ #endif #ifndef YY_ClntParser_LSP_NEEDED #line 75 "../bison++/bison.h" #line 75 "../bison++/bison.h" /* YY_ClntParser_LSP_NEEDED*/ #endif /* DEFAULT LTYPE*/ #ifdef YY_ClntParser_LSP_NEEDED #ifndef YY_ClntParser_LTYPE #ifndef BISON_YYLTYPE_ISDECLARED #define BISON_YYLTYPE_ISDECLARED typedef struct yyltype { int timestamp; int first_line; int first_column; int last_line; int last_column; char *text; } yyltype; #endif #define YY_ClntParser_LTYPE yyltype #endif #endif /* DEFAULT STYPE*/ #ifndef YY_ClntParser_STYPE #define YY_ClntParser_STYPE int #endif /* DEFAULT MISCELANEOUS */ #ifndef YY_ClntParser_PARSE #define YY_ClntParser_PARSE yyparse #endif #ifndef YY_ClntParser_LEX #define YY_ClntParser_LEX yylex #endif #ifndef YY_ClntParser_LVAL #define YY_ClntParser_LVAL yylval #endif #ifndef YY_ClntParser_LLOC #define YY_ClntParser_LLOC yylloc #endif #ifndef YY_ClntParser_CHAR #define YY_ClntParser_CHAR yychar #endif #ifndef YY_ClntParser_NERRS #define YY_ClntParser_NERRS yynerrs #endif #ifndef YY_ClntParser_DEBUG_FLAG #define YY_ClntParser_DEBUG_FLAG yydebug #endif #ifndef YY_ClntParser_ERROR #define YY_ClntParser_ERROR yyerror #endif #ifndef YY_ClntParser_PARSE_PARAM #ifndef __STDC__ #ifndef __cplusplus #ifndef YY_USE_CLASS #define YY_ClntParser_PARSE_PARAM #ifndef YY_ClntParser_PARSE_PARAM_DEF #define YY_ClntParser_PARSE_PARAM_DEF #endif #endif #endif #endif #ifndef YY_ClntParser_PARSE_PARAM #define YY_ClntParser_PARSE_PARAM void #endif #endif /* TOKEN C */ #ifndef YY_USE_CLASS #ifndef YY_ClntParser_PURE #ifndef yylval extern YY_ClntParser_STYPE YY_ClntParser_LVAL; #else #if yylval != YY_ClntParser_LVAL extern YY_ClntParser_STYPE YY_ClntParser_LVAL; #else #warning "Namespace conflict, disabling some functionality (bison++ only)" #endif #endif #endif #line 169 "../bison++/bison.h" #define T1_ 258 #define T2_ 259 #define PREF_TIME_ 260 #define DNS_SERVER_ 261 #define VALID_TIME_ 262 #define UNICAST_ 263 #define NTP_SERVER_ 264 #define DOMAIN_ 265 #define TIME_ZONE_ 266 #define SIP_SERVER_ 267 #define SIP_DOMAIN_ 268 #define NIS_SERVER_ 269 #define NISP_SERVER_ 270 #define NIS_DOMAIN_ 271 #define NISP_DOMAIN_ 272 #define FQDN_ 273 #define FQDN_S_ 274 #define DDNS_PROTOCOL_ 275 #define DDNS_TIMEOUT_ 276 #define LIFETIME_ 277 #define VENDOR_SPEC_ 278 #define IFACE_ 279 #define NO_CONFIG_ 280 #define REJECT_SERVERS_ 281 #define PREFERRED_SERVERS_ 282 #define IA_ 283 #define TA_ 284 #define IAID_ 285 #define ADDRESS_KEYWORD_ 286 #define NAME_ 287 #define IPV6ADDR_ 288 #define WORKDIR_ 289 #define RAPID_COMMIT_ 290 #define OPTION_ 291 #define SCRIPT_ 292 #define LOGNAME_ 293 #define LOGLEVEL_ 294 #define LOGMODE_ 295 #define LOGCOLORS_ 296 #define STRING_ 297 #define HEXNUMBER_ 298 #define INTNUMBER_ 299 #define DUID_ 300 #define STRICT_RFC_NO_ROUTING_ 301 #define SKIP_CONFIRM_ 302 #define OBEY_RA_BITS_ 303 #define PD_ 304 #define PREFIX_ 305 #define DOWNLINK_PREFIX_IFACES_ 306 #define DUID_TYPE_ 307 #define DUID_TYPE_LLT_ 308 #define DUID_TYPE_LL_ 309 #define DUID_TYPE_EN_ 310 #define AUTH_METHODS_ 311 #define AUTH_PROTOCOL_ 312 #define AUTH_ALGORITHM_ 313 #define AUTH_REPLAY_ 314 #define AUTH_REALM_ 315 #define DIGEST_NONE_ 316 #define DIGEST_PLAIN_ 317 #define DIGEST_HMAC_MD5_ 318 #define DIGEST_HMAC_SHA1_ 319 #define DIGEST_HMAC_SHA224_ 320 #define DIGEST_HMAC_SHA256_ 321 #define DIGEST_HMAC_SHA384_ 322 #define DIGEST_HMAC_SHA512_ 323 #define STATELESS_ 324 #define ANON_INF_REQUEST_ 325 #define INSIST_MODE_ 326 #define INACTIVE_MODE_ 327 #define EXPERIMENTAL_ 328 #define ADDR_PARAMS_ 329 #define REMOTE_AUTOCONF_ 330 #define AFTR_ 331 #define ROUTING_ 332 #define BIND_TO_ADDR_ 333 #define ADDRESS_LIST_KEYWORD_ 334 #define STRING_KEYWORD_ 335 #define DUID_KEYWORD_ 336 #define HEX_KEYWORD_ 337 #define RECONFIGURE_ 338 #line 169 "../bison++/bison.h" /* #defines token */ /* after #define tokens, before const tokens S5*/ #else #ifndef YY_ClntParser_CLASS #define YY_ClntParser_CLASS ClntParser #endif #ifndef YY_ClntParser_INHERIT #define YY_ClntParser_INHERIT #endif #ifndef YY_ClntParser_MEMBERS #define YY_ClntParser_MEMBERS #endif #ifndef YY_ClntParser_LEX_BODY #define YY_ClntParser_LEX_BODY #endif #ifndef YY_ClntParser_ERROR_BODY #define YY_ClntParser_ERROR_BODY #endif #ifndef YY_ClntParser_CONSTRUCTOR_PARAM #define YY_ClntParser_CONSTRUCTOR_PARAM #endif /* choose between enum and const */ #ifndef YY_ClntParser_USE_CONST_TOKEN #define YY_ClntParser_USE_CONST_TOKEN 0 /* yes enum is more compatible with flex, */ /* so by default we use it */ #endif #if YY_ClntParser_USE_CONST_TOKEN != 0 #ifndef YY_ClntParser_ENUM_TOKEN #define YY_ClntParser_ENUM_TOKEN yy_ClntParser_enum_token #endif #endif class YY_ClntParser_CLASS YY_ClntParser_INHERIT { public: #if YY_ClntParser_USE_CONST_TOKEN != 0 /* static const int token ... */ #line 212 "../bison++/bison.h" static const int T1_; static const int T2_; static const int PREF_TIME_; static const int DNS_SERVER_; static const int VALID_TIME_; static const int UNICAST_; static const int NTP_SERVER_; static const int DOMAIN_; static const int TIME_ZONE_; static const int SIP_SERVER_; static const int SIP_DOMAIN_; static const int NIS_SERVER_; static const int NISP_SERVER_; static const int NIS_DOMAIN_; static const int NISP_DOMAIN_; static const int FQDN_; static const int FQDN_S_; static const int DDNS_PROTOCOL_; static const int DDNS_TIMEOUT_; static const int LIFETIME_; static const int VENDOR_SPEC_; static const int IFACE_; static const int NO_CONFIG_; static const int REJECT_SERVERS_; static const int PREFERRED_SERVERS_; static const int IA_; static const int TA_; static const int IAID_; static const int ADDRESS_KEYWORD_; static const int NAME_; static const int IPV6ADDR_; static const int WORKDIR_; static const int RAPID_COMMIT_; static const int OPTION_; static const int SCRIPT_; static const int LOGNAME_; static const int LOGLEVEL_; static const int LOGMODE_; static const int LOGCOLORS_; static const int STRING_; static const int HEXNUMBER_; static const int INTNUMBER_; static const int DUID_; static const int STRICT_RFC_NO_ROUTING_; static const int SKIP_CONFIRM_; static const int OBEY_RA_BITS_; static const int PD_; static const int PREFIX_; static const int DOWNLINK_PREFIX_IFACES_; static const int DUID_TYPE_; static const int DUID_TYPE_LLT_; static const int DUID_TYPE_LL_; static const int DUID_TYPE_EN_; static const int AUTH_METHODS_; static const int AUTH_PROTOCOL_; static const int AUTH_ALGORITHM_; static const int AUTH_REPLAY_; static const int AUTH_REALM_; static const int DIGEST_NONE_; static const int DIGEST_PLAIN_; static const int DIGEST_HMAC_MD5_; static const int DIGEST_HMAC_SHA1_; static const int DIGEST_HMAC_SHA224_; static const int DIGEST_HMAC_SHA256_; static const int DIGEST_HMAC_SHA384_; static const int DIGEST_HMAC_SHA512_; static const int STATELESS_; static const int ANON_INF_REQUEST_; static const int INSIST_MODE_; static const int INACTIVE_MODE_; static const int EXPERIMENTAL_; static const int ADDR_PARAMS_; static const int REMOTE_AUTOCONF_; static const int AFTR_; static const int ROUTING_; static const int BIND_TO_ADDR_; static const int ADDRESS_LIST_KEYWORD_; static const int STRING_KEYWORD_; static const int DUID_KEYWORD_; static const int HEX_KEYWORD_; static const int RECONFIGURE_; #line 212 "../bison++/bison.h" /* decl const */ #else enum YY_ClntParser_ENUM_TOKEN { YY_ClntParser_NULL_TOKEN=0 #line 215 "../bison++/bison.h" ,T1_=258 ,T2_=259 ,PREF_TIME_=260 ,DNS_SERVER_=261 ,VALID_TIME_=262 ,UNICAST_=263 ,NTP_SERVER_=264 ,DOMAIN_=265 ,TIME_ZONE_=266 ,SIP_SERVER_=267 ,SIP_DOMAIN_=268 ,NIS_SERVER_=269 ,NISP_SERVER_=270 ,NIS_DOMAIN_=271 ,NISP_DOMAIN_=272 ,FQDN_=273 ,FQDN_S_=274 ,DDNS_PROTOCOL_=275 ,DDNS_TIMEOUT_=276 ,LIFETIME_=277 ,VENDOR_SPEC_=278 ,IFACE_=279 ,NO_CONFIG_=280 ,REJECT_SERVERS_=281 ,PREFERRED_SERVERS_=282 ,IA_=283 ,TA_=284 ,IAID_=285 ,ADDRESS_KEYWORD_=286 ,NAME_=287 ,IPV6ADDR_=288 ,WORKDIR_=289 ,RAPID_COMMIT_=290 ,OPTION_=291 ,SCRIPT_=292 ,LOGNAME_=293 ,LOGLEVEL_=294 ,LOGMODE_=295 ,LOGCOLORS_=296 ,STRING_=297 ,HEXNUMBER_=298 ,INTNUMBER_=299 ,DUID_=300 ,STRICT_RFC_NO_ROUTING_=301 ,SKIP_CONFIRM_=302 ,OBEY_RA_BITS_=303 ,PD_=304 ,PREFIX_=305 ,DOWNLINK_PREFIX_IFACES_=306 ,DUID_TYPE_=307 ,DUID_TYPE_LLT_=308 ,DUID_TYPE_LL_=309 ,DUID_TYPE_EN_=310 ,AUTH_METHODS_=311 ,AUTH_PROTOCOL_=312 ,AUTH_ALGORITHM_=313 ,AUTH_REPLAY_=314 ,AUTH_REALM_=315 ,DIGEST_NONE_=316 ,DIGEST_PLAIN_=317 ,DIGEST_HMAC_MD5_=318 ,DIGEST_HMAC_SHA1_=319 ,DIGEST_HMAC_SHA224_=320 ,DIGEST_HMAC_SHA256_=321 ,DIGEST_HMAC_SHA384_=322 ,DIGEST_HMAC_SHA512_=323 ,STATELESS_=324 ,ANON_INF_REQUEST_=325 ,INSIST_MODE_=326 ,INACTIVE_MODE_=327 ,EXPERIMENTAL_=328 ,ADDR_PARAMS_=329 ,REMOTE_AUTOCONF_=330 ,AFTR_=331 ,ROUTING_=332 ,BIND_TO_ADDR_=333 ,ADDRESS_LIST_KEYWORD_=334 ,STRING_KEYWORD_=335 ,DUID_KEYWORD_=336 ,HEX_KEYWORD_=337 ,RECONFIGURE_=338 #line 215 "../bison++/bison.h" /* enum token */ }; /* end of enum declaration */ #endif public: int YY_ClntParser_PARSE(YY_ClntParser_PARSE_PARAM); virtual void YY_ClntParser_ERROR(char *msg) YY_ClntParser_ERROR_BODY; #ifdef YY_ClntParser_PURE #ifdef YY_ClntParser_LSP_NEEDED virtual int YY_ClntParser_LEX(YY_ClntParser_STYPE *YY_ClntParser_LVAL,YY_ClntParser_LTYPE *YY_ClntParser_LLOC) YY_ClntParser_LEX_BODY; #else virtual int YY_ClntParser_LEX(YY_ClntParser_STYPE *YY_ClntParser_LVAL) YY_ClntParser_LEX_BODY; #endif #else virtual int YY_ClntParser_LEX() YY_ClntParser_LEX_BODY; YY_ClntParser_STYPE YY_ClntParser_LVAL; #ifdef YY_ClntParser_LSP_NEEDED YY_ClntParser_LTYPE YY_ClntParser_LLOC; #endif int YY_ClntParser_NERRS; int YY_ClntParser_CHAR; #endif #if YY_ClntParser_DEBUG != 0 public: int YY_ClntParser_DEBUG_FLAG; /* nonzero means print parse trace */ #endif public: YY_ClntParser_CLASS(YY_ClntParser_CONSTRUCTOR_PARAM); public: YY_ClntParser_MEMBERS }; /* other declare folow */ #endif #if YY_ClntParser_COMPATIBILITY != 0 /* backward compatibility */ /* Removed due to bison problems /#ifndef YYSTYPE / #define YYSTYPE YY_ClntParser_STYPE /#endif*/ #ifndef YYLTYPE #define YYLTYPE YY_ClntParser_LTYPE #endif #ifndef YYDEBUG #ifdef YY_ClntParser_DEBUG #define YYDEBUG YY_ClntParser_DEBUG #endif #endif #endif /* END */ #line 267 "../bison++/bison.h" #endif dibbler-1.0.1/ClntCfgMgr/ClntCfgTA.cpp0000664000175000017500000000157312233256142014304 00000000000000/* * Dibbler - a portable DHCPv6 * * authors: Tomasz Mrugalski * * released under GNU GPL v2 licence * * $Id: ClntCfgTA.cpp,v 1.3 2007-01-07 20:18:44 thomson Exp $ */ #include "ClntCfgTA.h" #include #include #include "Logger.h" using namespace std; TClntCfgTA::TClntCfgTA() { static unsigned long lastIAID = 1; this->iaid = lastIAID++; this->State = STATE_NOTCONFIGURED; } void TClntCfgTA::setState(enum EState state) { this->State = state; } enum EState TClntCfgTA::getState() { return this->State; } unsigned long TClntCfgTA::getIAID() { return this->iaid; } void TClntCfgTA::setIAID(unsigned long iaid) { this->iaid=iaid; } ostream& operator<<(ostream& out,TClntCfgTA& ta) { out << " " << std::endl; return out; } dibbler-1.0.1/ClntCfgMgr/ClntParsGlobalOpt.cpp0000644000175000017500000000366612474402306016076 00000000000000/* * Dibbler - a portable DHCPv6 * * authors: Tomasz Mrugalski * Marek Senderski * * released under GNU GPL v2 only licence * */ #include "ClntParsGlobalOpt.h" #include "Portable.h" #include "DHCPDefaults.h" #include "Logger.h" using namespace std; TClntParsGlobalOpt::TClntParsGlobalOpt() :TClntParsIfaceOpt() { this->WorkDir = DEFAULT_WORKDIR; this->PrefixLength = CLIENT_DEFAULT_PREFIX_LENGTH; this->AnonInfRequest = false; this->InactiveMode = false; this->InsistMode = false; this->FQDNFlagS = CLIENT_DEFAULT_FQDN_FLAG_S; this->Experimental = false; this->UseConfirm = true; } TClntParsGlobalOpt::~TClntParsGlobalOpt() { } void TClntParsGlobalOpt::setWorkDir(const std::string& dir) { WorkDir = dir; } string TClntParsGlobalOpt::getWorkDir() { return WorkDir; } void TClntParsGlobalOpt::setOnLinkPrefixLength(int len) { PrefixLength = len; } int TClntParsGlobalOpt::getOnLinkPrefixLength() { return PrefixLength; } void TClntParsGlobalOpt::setAnonInfRequest(bool anonymous) { this->AnonInfRequest = anonymous; } bool TClntParsGlobalOpt::getAnonInfRequest() { return this->AnonInfRequest; } void TClntParsGlobalOpt::setInsistMode(bool insist) { InsistMode = insist; } bool TClntParsGlobalOpt::getInsistMode() { return InsistMode; } void TClntParsGlobalOpt::setInactiveMode(bool flex) { InactiveMode = flex; } bool TClntParsGlobalOpt::getInactiveMode() { return InactiveMode; } void TClntParsGlobalOpt::setExperimental() { Experimental = true; } bool TClntParsGlobalOpt::getExperimental() { return Experimental; } void TClntParsGlobalOpt::setFQDNFlagS(bool s) { FQDNFlagS = s; } bool TClntParsGlobalOpt::getFQDNFlagS() { return FQDNFlagS; } void TClntParsGlobalOpt::setConfirm(bool conf) { UseConfirm = conf; } bool TClntParsGlobalOpt::getConfirm() { return UseConfirm; } dibbler-1.0.1/ClntCfgMgr/ClntParser.cpp0000644000175000017500000032557612556513130014627 00000000000000#define YY_ClntParser_h_included #define YY_USE_CLASS /* A Bison++ parser, made from ClntParser.y */ /* with Bison++ version bison++ Version 1.21.9-1, adapted from GNU bison by coetmeur@icdc.fr Maintained by Magnus Ekdahl */ #define YY_USE_CLASS #line 1 "../bison++/bison.cc" /* -*-C-*- Note some compilers choke on comments on `#line' lines. */ /* Skeleton output parser for bison, Copyright (C) 1984, 1989, 1990 Bob Corbett and Richard Stallman 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 1, 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., 675 Mass Ave, Cambridge, MA 02139, USA. As a special exception, when this file is copied by Bison++ into a Bison++ output file, you may use that output file without restriction. This special exception was added by the Free Software Foundation in version 1.24 of Bison, and has been in Bison++ since 1.21.9. */ /* HEADER SECTION */ #if defined( _MSDOS ) || defined(MSDOS) || defined(__MSDOS__) #define __MSDOS_AND_ALIKE #endif #if defined(_WINDOWS) && defined(_MSC_VER) #define __HAVE_NO_ALLOCA #define __MSDOS_AND_ALIKE #endif #ifndef alloca #if defined( __GNUC__) #define alloca __builtin_alloca #elif (!defined (__STDC__) && defined (sparc)) || defined (__sparc__) || defined (__sparc) || defined (__sgi) #include #elif defined (__MSDOS_AND_ALIKE) #include #ifndef __TURBOC__ /* MS C runtime lib */ #define alloca _alloca #endif #elif defined(_AIX) /* pragma must be put before any C/C++ instruction !! */ #pragma alloca #include #elif defined(__hpux) #ifdef __cplusplus extern "C" { void *alloca (unsigned int); }; #else /* not __cplusplus */ void *alloca (); #endif /* not __cplusplus */ #endif /* not _AIX not MSDOS, or __TURBOC__ or _AIX, not sparc. */ #endif /* alloca not defined. */ #ifdef c_plusplus #ifndef __cplusplus #define __cplusplus #endif #endif #ifdef __cplusplus #ifndef YY_USE_CLASS /*#warning "For C++ its recomended to use bison++, otherwise classes won't be generated"*/ #endif #else #ifndef __STDC__ #define const #endif #ifdef YY_USE_CLASS #error "This is a C++ header generated by bison++, please use a C++ compiler!" #endif #endif #include #define YYBISON 1 #line 88 "../bison++/bison.cc" #line 3 "ClntParser.y" #include #include #include #include #include "DHCPConst.h" #include "SmartPtr.h" #include "Container.h" #include "ClntParser.h" #include "ClntParsGlobalOpt.h" #include "ClntCfgIface.h" #include "ClntCfgAddr.h" #include "ClntCfgIA.h" #include "ClntCfgTA.h" #include "ClntCfgPD.h" #include "ClntCfgMgr.h" #include "Logger.h" #include "OptGeneric.h" #include "OptAddr.h" #include "OptAddrLst.h" #include "OptString.h" using namespace std; #define YY_USE_CLASS #line 30 "ClntParser.y" #include "FlexLexer.h" #define YY_ClntParser_MEMBERS yyFlexLexer * Lex_; \ /*List of options in scope stack,the most fresh is last in the list*/ \ List(TClntParsGlobalOpt) ParserOptStack; \ /*List of parsed interfaces/IAs/Addresses, last */ \ /*interface/IA/address is just being parsing or have been just parsed*/ \ List(TClntCfgIface) ClntCfgIfaceLst; \ List(TClntCfgIA) ClntCfgIALst; \ List(TClntCfgTA) ClntCfgTALst; \ List(TClntCfgPD) ClntCfgPDLst; \ List(TClntCfgAddr) ClntCfgAddrLst; \ DigestTypesLst DigestLst; \ /*Pointer to list which should contain either rejected servers or */ \ /*preffered servers*/ \ List(THostID) PresentStationLst; \ List(TIPv6Addr) PresentAddrLst; \ List(TClntCfgPrefix) PrefixLst; \ List(std::string) PresentStringLst; \ List(TOptVendorSpecInfo) VendorSpec; \ bool IfaceDefined(int ifaceNr); \ bool IfaceDefined(const std::string& ifaceName); \ bool StartIfaceDeclaration(const std::string& ifaceName); \ bool StartIfaceDeclaration(int ifindex); \ bool EndIfaceDeclaration(); \ void EmptyIface(); \ bool StartIADeclaration(bool aggregation); \ void EndIADeclaration(); \ bool StartPDDeclaration(); \ bool EndPDDeclaration(); \ void EmptyIA(); \ void EmptyAddr(); \ TClntCfgMgr * CfgMgr; \ bool iaidSet; \ unsigned int iaid; \ unsigned int AddrCount_; \ virtual ~ClntParser(); \ EDUIDType DUIDType; \ int DUIDEnterpriseNumber; \ SPtr DUIDEnterpriseID; #define YY_ClntParser_CONSTRUCTOR_PARAM yyFlexLexer * lex #define YY_ClntParser_CONSTRUCTOR_CODE \ Lex_ = lex; \ ParserOptStack.append(new TClntParsGlobalOpt()); \ ParserOptStack.getFirst()->setIAIDCnt(1); \ ParserOptStack.getLast(); \ DUIDType = DUID_TYPE_NOT_DEFINED; \ DUIDEnterpriseID.reset(); \ AddrCount_ = 0; \ CfgMgr = 0; \ iaidSet = false; \ iaid = 0xffffffff; \ DUIDEnterpriseNumber = -1; \ yynerrs = 0; \ yychar = 0; #line 91 "ClntParser.y" typedef union { int ival; char *strval; struct SDuid { int length; char* duid; } duidval; char addrval[16]; } yy_ClntParser_stype; #define YY_ClntParser_STYPE yy_ClntParser_stype #line 102 "ClntParser.y" namespace std { extern yy_ClntParser_stype yylval; } #line 88 "../bison++/bison.cc" /* %{ and %header{ and %union, during decl */ #define YY_ClntParser_BISON 1 #ifndef YY_ClntParser_COMPATIBILITY #ifndef YY_USE_CLASS #define YY_ClntParser_COMPATIBILITY 1 #else #define YY_ClntParser_COMPATIBILITY 0 #endif #endif #if YY_ClntParser_COMPATIBILITY != 0 /* backward compatibility */ #ifdef YYLTYPE #ifndef YY_ClntParser_LTYPE #define YY_ClntParser_LTYPE YYLTYPE #endif #endif /* Testing alternative bison solution /#ifdef YYSTYPE*/ #ifndef YY_ClntParser_STYPE #define YY_ClntParser_STYPE YYSTYPE #endif /*#endif*/ #ifdef YYDEBUG #ifndef YY_ClntParser_DEBUG #define YY_ClntParser_DEBUG YYDEBUG #endif #endif /* use goto to be compatible */ #ifndef YY_ClntParser_USE_GOTO #define YY_ClntParser_USE_GOTO 1 #endif #endif /* use no goto to be clean in C++ */ #ifndef YY_ClntParser_USE_GOTO #define YY_ClntParser_USE_GOTO 0 #endif #ifndef YY_ClntParser_PURE #line 130 "../bison++/bison.cc" #line 130 "../bison++/bison.cc" /* YY_ClntParser_PURE */ #endif /* section apres lecture def, avant lecture grammaire S2 */ #line 134 "../bison++/bison.cc" #line 134 "../bison++/bison.cc" /* prefix */ #ifndef YY_ClntParser_DEBUG #line 136 "../bison++/bison.cc" #define YY_ClntParser_DEBUG 1 #line 136 "../bison++/bison.cc" /* YY_ClntParser_DEBUG */ #endif #ifndef YY_ClntParser_LSP_NEEDED #line 141 "../bison++/bison.cc" #line 141 "../bison++/bison.cc" /* YY_ClntParser_LSP_NEEDED*/ #endif /* DEFAULT LTYPE*/ #ifdef YY_ClntParser_LSP_NEEDED #ifndef YY_ClntParser_LTYPE #ifndef BISON_YYLTYPE_ISDECLARED #define BISON_YYLTYPE_ISDECLARED typedef struct yyltype { int timestamp; int first_line; int first_column; int last_line; int last_column; char *text; } yyltype; #endif #define YY_ClntParser_LTYPE yyltype #endif #endif /* DEFAULT STYPE*/ /* We used to use `unsigned long' as YY_ClntParser_STYPE on MSDOS, but it seems better to be consistent. Most programs should declare their own type anyway. */ #ifndef YY_ClntParser_STYPE #define YY_ClntParser_STYPE int #endif /* DEFAULT MISCELANEOUS */ #ifndef YY_ClntParser_PARSE #define YY_ClntParser_PARSE yyparse #endif #ifndef YY_ClntParser_LEX #define YY_ClntParser_LEX yylex #endif #ifndef YY_ClntParser_LVAL #define YY_ClntParser_LVAL yylval #endif #ifndef YY_ClntParser_LLOC #define YY_ClntParser_LLOC yylloc #endif #ifndef YY_ClntParser_CHAR #define YY_ClntParser_CHAR yychar #endif #ifndef YY_ClntParser_NERRS #define YY_ClntParser_NERRS yynerrs #endif #ifndef YY_ClntParser_DEBUG_FLAG #define YY_ClntParser_DEBUG_FLAG yydebug #endif #ifndef YY_ClntParser_ERROR #define YY_ClntParser_ERROR yyerror #endif #ifndef YY_ClntParser_PARSE_PARAM #ifndef YY_USE_CLASS #ifdef YYPARSE_PARAM #define YY_ClntParser_PARSE_PARAM void* YYPARSE_PARAM #else #ifndef __STDC__ #ifndef __cplusplus #define YY_ClntParser_PARSE_PARAM #endif #endif #endif #endif #ifndef YY_ClntParser_PARSE_PARAM #define YY_ClntParser_PARSE_PARAM void #endif #endif #if YY_ClntParser_COMPATIBILITY != 0 /* backward compatibility */ #ifdef YY_ClntParser_LTYPE #ifndef YYLTYPE #define YYLTYPE YY_ClntParser_LTYPE #else /* WARNING obsolete !!! user defined YYLTYPE not reported into generated header */ #endif #endif /* Removed due to bison compabilityproblems /#ifndef YYSTYPE /#define YYSTYPE YY_ClntParser_STYPE /#else*/ /* WARNING obsolete !!! user defined YYSTYPE not reported into generated header */ /*#endif*/ #ifdef YY_ClntParser_PURE # ifndef YYPURE # define YYPURE YY_ClntParser_PURE # endif #endif #ifdef YY_ClntParser_DEBUG # ifndef YYDEBUG # define YYDEBUG YY_ClntParser_DEBUG # endif #endif #ifndef YY_ClntParser_ERROR_VERBOSE #ifdef YYERROR_VERBOSE #define YY_ClntParser_ERROR_VERBOSE YYERROR_VERBOSE #endif #endif #ifndef YY_ClntParser_LSP_NEEDED # ifdef YYLSP_NEEDED # define YY_ClntParser_LSP_NEEDED YYLSP_NEEDED # endif #endif #endif #ifndef YY_USE_CLASS /* TOKEN C */ #line 263 "../bison++/bison.cc" #define T1_ 258 #define T2_ 259 #define PREF_TIME_ 260 #define DNS_SERVER_ 261 #define VALID_TIME_ 262 #define UNICAST_ 263 #define NTP_SERVER_ 264 #define DOMAIN_ 265 #define TIME_ZONE_ 266 #define SIP_SERVER_ 267 #define SIP_DOMAIN_ 268 #define NIS_SERVER_ 269 #define NISP_SERVER_ 270 #define NIS_DOMAIN_ 271 #define NISP_DOMAIN_ 272 #define FQDN_ 273 #define FQDN_S_ 274 #define DDNS_PROTOCOL_ 275 #define DDNS_TIMEOUT_ 276 #define LIFETIME_ 277 #define VENDOR_SPEC_ 278 #define IFACE_ 279 #define NO_CONFIG_ 280 #define REJECT_SERVERS_ 281 #define PREFERRED_SERVERS_ 282 #define IA_ 283 #define TA_ 284 #define IAID_ 285 #define ADDRESS_KEYWORD_ 286 #define NAME_ 287 #define IPV6ADDR_ 288 #define WORKDIR_ 289 #define RAPID_COMMIT_ 290 #define OPTION_ 291 #define SCRIPT_ 292 #define LOGNAME_ 293 #define LOGLEVEL_ 294 #define LOGMODE_ 295 #define LOGCOLORS_ 296 #define STRING_ 297 #define HEXNUMBER_ 298 #define INTNUMBER_ 299 #define DUID_ 300 #define STRICT_RFC_NO_ROUTING_ 301 #define SKIP_CONFIRM_ 302 #define OBEY_RA_BITS_ 303 #define PD_ 304 #define PREFIX_ 305 #define DOWNLINK_PREFIX_IFACES_ 306 #define DUID_TYPE_ 307 #define DUID_TYPE_LLT_ 308 #define DUID_TYPE_LL_ 309 #define DUID_TYPE_EN_ 310 #define AUTH_METHODS_ 311 #define AUTH_PROTOCOL_ 312 #define AUTH_ALGORITHM_ 313 #define AUTH_REPLAY_ 314 #define AUTH_REALM_ 315 #define DIGEST_NONE_ 316 #define DIGEST_PLAIN_ 317 #define DIGEST_HMAC_MD5_ 318 #define DIGEST_HMAC_SHA1_ 319 #define DIGEST_HMAC_SHA224_ 320 #define DIGEST_HMAC_SHA256_ 321 #define DIGEST_HMAC_SHA384_ 322 #define DIGEST_HMAC_SHA512_ 323 #define STATELESS_ 324 #define ANON_INF_REQUEST_ 325 #define INSIST_MODE_ 326 #define INACTIVE_MODE_ 327 #define EXPERIMENTAL_ 328 #define ADDR_PARAMS_ 329 #define REMOTE_AUTOCONF_ 330 #define AFTR_ 331 #define ROUTING_ 332 #define BIND_TO_ADDR_ 333 #define ADDRESS_LIST_KEYWORD_ 334 #define STRING_KEYWORD_ 335 #define DUID_KEYWORD_ 336 #define HEX_KEYWORD_ 337 #define RECONFIGURE_ 338 #line 263 "../bison++/bison.cc" /* #defines tokens */ #else /* CLASS */ #ifndef YY_ClntParser_CLASS #define YY_ClntParser_CLASS ClntParser #endif #ifndef YY_ClntParser_INHERIT #define YY_ClntParser_INHERIT #endif #ifndef YY_ClntParser_MEMBERS #define YY_ClntParser_MEMBERS #endif #ifndef YY_ClntParser_LEX_BODY #define YY_ClntParser_LEX_BODY #endif #ifndef YY_ClntParser_ERROR_BODY #define YY_ClntParser_ERROR_BODY #endif #ifndef YY_ClntParser_CONSTRUCTOR_PARAM #define YY_ClntParser_CONSTRUCTOR_PARAM #endif #ifndef YY_ClntParser_CONSTRUCTOR_CODE #define YY_ClntParser_CONSTRUCTOR_CODE #endif #ifndef YY_ClntParser_CONSTRUCTOR_INIT #define YY_ClntParser_CONSTRUCTOR_INIT #endif /* choose between enum and const */ #ifndef YY_ClntParser_USE_CONST_TOKEN #define YY_ClntParser_USE_CONST_TOKEN 0 /* yes enum is more compatible with flex, */ /* so by default we use it */ #endif #if YY_ClntParser_USE_CONST_TOKEN != 0 #ifndef YY_ClntParser_ENUM_TOKEN #define YY_ClntParser_ENUM_TOKEN yy_ClntParser_enum_token #endif #endif class YY_ClntParser_CLASS YY_ClntParser_INHERIT { public: #if YY_ClntParser_USE_CONST_TOKEN != 0 /* static const int token ... */ #line 307 "../bison++/bison.cc" static const int T1_; static const int T2_; static const int PREF_TIME_; static const int DNS_SERVER_; static const int VALID_TIME_; static const int UNICAST_; static const int NTP_SERVER_; static const int DOMAIN_; static const int TIME_ZONE_; static const int SIP_SERVER_; static const int SIP_DOMAIN_; static const int NIS_SERVER_; static const int NISP_SERVER_; static const int NIS_DOMAIN_; static const int NISP_DOMAIN_; static const int FQDN_; static const int FQDN_S_; static const int DDNS_PROTOCOL_; static const int DDNS_TIMEOUT_; static const int LIFETIME_; static const int VENDOR_SPEC_; static const int IFACE_; static const int NO_CONFIG_; static const int REJECT_SERVERS_; static const int PREFERRED_SERVERS_; static const int IA_; static const int TA_; static const int IAID_; static const int ADDRESS_KEYWORD_; static const int NAME_; static const int IPV6ADDR_; static const int WORKDIR_; static const int RAPID_COMMIT_; static const int OPTION_; static const int SCRIPT_; static const int LOGNAME_; static const int LOGLEVEL_; static const int LOGMODE_; static const int LOGCOLORS_; static const int STRING_; static const int HEXNUMBER_; static const int INTNUMBER_; static const int DUID_; static const int STRICT_RFC_NO_ROUTING_; static const int SKIP_CONFIRM_; static const int OBEY_RA_BITS_; static const int PD_; static const int PREFIX_; static const int DOWNLINK_PREFIX_IFACES_; static const int DUID_TYPE_; static const int DUID_TYPE_LLT_; static const int DUID_TYPE_LL_; static const int DUID_TYPE_EN_; static const int AUTH_METHODS_; static const int AUTH_PROTOCOL_; static const int AUTH_ALGORITHM_; static const int AUTH_REPLAY_; static const int AUTH_REALM_; static const int DIGEST_NONE_; static const int DIGEST_PLAIN_; static const int DIGEST_HMAC_MD5_; static const int DIGEST_HMAC_SHA1_; static const int DIGEST_HMAC_SHA224_; static const int DIGEST_HMAC_SHA256_; static const int DIGEST_HMAC_SHA384_; static const int DIGEST_HMAC_SHA512_; static const int STATELESS_; static const int ANON_INF_REQUEST_; static const int INSIST_MODE_; static const int INACTIVE_MODE_; static const int EXPERIMENTAL_; static const int ADDR_PARAMS_; static const int REMOTE_AUTOCONF_; static const int AFTR_; static const int ROUTING_; static const int BIND_TO_ADDR_; static const int ADDRESS_LIST_KEYWORD_; static const int STRING_KEYWORD_; static const int DUID_KEYWORD_; static const int HEX_KEYWORD_; static const int RECONFIGURE_; #line 307 "../bison++/bison.cc" /* decl const */ #else enum YY_ClntParser_ENUM_TOKEN { YY_ClntParser_NULL_TOKEN=0 #line 310 "../bison++/bison.cc" ,T1_=258 ,T2_=259 ,PREF_TIME_=260 ,DNS_SERVER_=261 ,VALID_TIME_=262 ,UNICAST_=263 ,NTP_SERVER_=264 ,DOMAIN_=265 ,TIME_ZONE_=266 ,SIP_SERVER_=267 ,SIP_DOMAIN_=268 ,NIS_SERVER_=269 ,NISP_SERVER_=270 ,NIS_DOMAIN_=271 ,NISP_DOMAIN_=272 ,FQDN_=273 ,FQDN_S_=274 ,DDNS_PROTOCOL_=275 ,DDNS_TIMEOUT_=276 ,LIFETIME_=277 ,VENDOR_SPEC_=278 ,IFACE_=279 ,NO_CONFIG_=280 ,REJECT_SERVERS_=281 ,PREFERRED_SERVERS_=282 ,IA_=283 ,TA_=284 ,IAID_=285 ,ADDRESS_KEYWORD_=286 ,NAME_=287 ,IPV6ADDR_=288 ,WORKDIR_=289 ,RAPID_COMMIT_=290 ,OPTION_=291 ,SCRIPT_=292 ,LOGNAME_=293 ,LOGLEVEL_=294 ,LOGMODE_=295 ,LOGCOLORS_=296 ,STRING_=297 ,HEXNUMBER_=298 ,INTNUMBER_=299 ,DUID_=300 ,STRICT_RFC_NO_ROUTING_=301 ,SKIP_CONFIRM_=302 ,OBEY_RA_BITS_=303 ,PD_=304 ,PREFIX_=305 ,DOWNLINK_PREFIX_IFACES_=306 ,DUID_TYPE_=307 ,DUID_TYPE_LLT_=308 ,DUID_TYPE_LL_=309 ,DUID_TYPE_EN_=310 ,AUTH_METHODS_=311 ,AUTH_PROTOCOL_=312 ,AUTH_ALGORITHM_=313 ,AUTH_REPLAY_=314 ,AUTH_REALM_=315 ,DIGEST_NONE_=316 ,DIGEST_PLAIN_=317 ,DIGEST_HMAC_MD5_=318 ,DIGEST_HMAC_SHA1_=319 ,DIGEST_HMAC_SHA224_=320 ,DIGEST_HMAC_SHA256_=321 ,DIGEST_HMAC_SHA384_=322 ,DIGEST_HMAC_SHA512_=323 ,STATELESS_=324 ,ANON_INF_REQUEST_=325 ,INSIST_MODE_=326 ,INACTIVE_MODE_=327 ,EXPERIMENTAL_=328 ,ADDR_PARAMS_=329 ,REMOTE_AUTOCONF_=330 ,AFTR_=331 ,ROUTING_=332 ,BIND_TO_ADDR_=333 ,ADDRESS_LIST_KEYWORD_=334 ,STRING_KEYWORD_=335 ,DUID_KEYWORD_=336 ,HEX_KEYWORD_=337 ,RECONFIGURE_=338 #line 310 "../bison++/bison.cc" /* enum token */ }; /* end of enum declaration */ #endif public: int YY_ClntParser_PARSE (YY_ClntParser_PARSE_PARAM); virtual void YY_ClntParser_ERROR(char *msg) YY_ClntParser_ERROR_BODY; #ifdef YY_ClntParser_PURE #ifdef YY_ClntParser_LSP_NEEDED virtual int YY_ClntParser_LEX (YY_ClntParser_STYPE *YY_ClntParser_LVAL,YY_ClntParser_LTYPE *YY_ClntParser_LLOC) YY_ClntParser_LEX_BODY; #else virtual int YY_ClntParser_LEX (YY_ClntParser_STYPE *YY_ClntParser_LVAL) YY_ClntParser_LEX_BODY; #endif #else virtual int YY_ClntParser_LEX() YY_ClntParser_LEX_BODY; YY_ClntParser_STYPE YY_ClntParser_LVAL; #ifdef YY_ClntParser_LSP_NEEDED YY_ClntParser_LTYPE YY_ClntParser_LLOC; #endif int YY_ClntParser_NERRS; int YY_ClntParser_CHAR; #endif #if YY_ClntParser_DEBUG != 0 int YY_ClntParser_DEBUG_FLAG; /* nonzero means print parse trace */ #endif public: YY_ClntParser_CLASS(YY_ClntParser_CONSTRUCTOR_PARAM); public: YY_ClntParser_MEMBERS }; /* other declare folow */ #if YY_ClntParser_USE_CONST_TOKEN != 0 #line 341 "../bison++/bison.cc" const int YY_ClntParser_CLASS::T1_=258; const int YY_ClntParser_CLASS::T2_=259; const int YY_ClntParser_CLASS::PREF_TIME_=260; const int YY_ClntParser_CLASS::DNS_SERVER_=261; const int YY_ClntParser_CLASS::VALID_TIME_=262; const int YY_ClntParser_CLASS::UNICAST_=263; const int YY_ClntParser_CLASS::NTP_SERVER_=264; const int YY_ClntParser_CLASS::DOMAIN_=265; const int YY_ClntParser_CLASS::TIME_ZONE_=266; const int YY_ClntParser_CLASS::SIP_SERVER_=267; const int YY_ClntParser_CLASS::SIP_DOMAIN_=268; const int YY_ClntParser_CLASS::NIS_SERVER_=269; const int YY_ClntParser_CLASS::NISP_SERVER_=270; const int YY_ClntParser_CLASS::NIS_DOMAIN_=271; const int YY_ClntParser_CLASS::NISP_DOMAIN_=272; const int YY_ClntParser_CLASS::FQDN_=273; const int YY_ClntParser_CLASS::FQDN_S_=274; const int YY_ClntParser_CLASS::DDNS_PROTOCOL_=275; const int YY_ClntParser_CLASS::DDNS_TIMEOUT_=276; const int YY_ClntParser_CLASS::LIFETIME_=277; const int YY_ClntParser_CLASS::VENDOR_SPEC_=278; const int YY_ClntParser_CLASS::IFACE_=279; const int YY_ClntParser_CLASS::NO_CONFIG_=280; const int YY_ClntParser_CLASS::REJECT_SERVERS_=281; const int YY_ClntParser_CLASS::PREFERRED_SERVERS_=282; const int YY_ClntParser_CLASS::IA_=283; const int YY_ClntParser_CLASS::TA_=284; const int YY_ClntParser_CLASS::IAID_=285; const int YY_ClntParser_CLASS::ADDRESS_KEYWORD_=286; const int YY_ClntParser_CLASS::NAME_=287; const int YY_ClntParser_CLASS::IPV6ADDR_=288; const int YY_ClntParser_CLASS::WORKDIR_=289; const int YY_ClntParser_CLASS::RAPID_COMMIT_=290; const int YY_ClntParser_CLASS::OPTION_=291; const int YY_ClntParser_CLASS::SCRIPT_=292; const int YY_ClntParser_CLASS::LOGNAME_=293; const int YY_ClntParser_CLASS::LOGLEVEL_=294; const int YY_ClntParser_CLASS::LOGMODE_=295; const int YY_ClntParser_CLASS::LOGCOLORS_=296; const int YY_ClntParser_CLASS::STRING_=297; const int YY_ClntParser_CLASS::HEXNUMBER_=298; const int YY_ClntParser_CLASS::INTNUMBER_=299; const int YY_ClntParser_CLASS::DUID_=300; const int YY_ClntParser_CLASS::STRICT_RFC_NO_ROUTING_=301; const int YY_ClntParser_CLASS::SKIP_CONFIRM_=302; const int YY_ClntParser_CLASS::OBEY_RA_BITS_=303; const int YY_ClntParser_CLASS::PD_=304; const int YY_ClntParser_CLASS::PREFIX_=305; const int YY_ClntParser_CLASS::DOWNLINK_PREFIX_IFACES_=306; const int YY_ClntParser_CLASS::DUID_TYPE_=307; const int YY_ClntParser_CLASS::DUID_TYPE_LLT_=308; const int YY_ClntParser_CLASS::DUID_TYPE_LL_=309; const int YY_ClntParser_CLASS::DUID_TYPE_EN_=310; const int YY_ClntParser_CLASS::AUTH_METHODS_=311; const int YY_ClntParser_CLASS::AUTH_PROTOCOL_=312; const int YY_ClntParser_CLASS::AUTH_ALGORITHM_=313; const int YY_ClntParser_CLASS::AUTH_REPLAY_=314; const int YY_ClntParser_CLASS::AUTH_REALM_=315; const int YY_ClntParser_CLASS::DIGEST_NONE_=316; const int YY_ClntParser_CLASS::DIGEST_PLAIN_=317; const int YY_ClntParser_CLASS::DIGEST_HMAC_MD5_=318; const int YY_ClntParser_CLASS::DIGEST_HMAC_SHA1_=319; const int YY_ClntParser_CLASS::DIGEST_HMAC_SHA224_=320; const int YY_ClntParser_CLASS::DIGEST_HMAC_SHA256_=321; const int YY_ClntParser_CLASS::DIGEST_HMAC_SHA384_=322; const int YY_ClntParser_CLASS::DIGEST_HMAC_SHA512_=323; const int YY_ClntParser_CLASS::STATELESS_=324; const int YY_ClntParser_CLASS::ANON_INF_REQUEST_=325; const int YY_ClntParser_CLASS::INSIST_MODE_=326; const int YY_ClntParser_CLASS::INACTIVE_MODE_=327; const int YY_ClntParser_CLASS::EXPERIMENTAL_=328; const int YY_ClntParser_CLASS::ADDR_PARAMS_=329; const int YY_ClntParser_CLASS::REMOTE_AUTOCONF_=330; const int YY_ClntParser_CLASS::AFTR_=331; const int YY_ClntParser_CLASS::ROUTING_=332; const int YY_ClntParser_CLASS::BIND_TO_ADDR_=333; const int YY_ClntParser_CLASS::ADDRESS_LIST_KEYWORD_=334; const int YY_ClntParser_CLASS::STRING_KEYWORD_=335; const int YY_ClntParser_CLASS::DUID_KEYWORD_=336; const int YY_ClntParser_CLASS::HEX_KEYWORD_=337; const int YY_ClntParser_CLASS::RECONFIGURE_=338; #line 341 "../bison++/bison.cc" /* const YY_ClntParser_CLASS::token */ #endif /*apres const */ YY_ClntParser_CLASS::YY_ClntParser_CLASS(YY_ClntParser_CONSTRUCTOR_PARAM) YY_ClntParser_CONSTRUCTOR_INIT { #if YY_ClntParser_DEBUG != 0 YY_ClntParser_DEBUG_FLAG=0; #endif YY_ClntParser_CONSTRUCTOR_CODE; } #endif #line 352 "../bison++/bison.cc" #define YYFINAL 311 #define YYFLAG -32768 #define YYNTBASE 89 #define YYTRANSLATE(x) ((unsigned)(x) <= 338 ? yytranslate[x] : 194) static const char yytranslate[] = { 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 86, 88, 2, 87, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 84, 2, 85, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 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, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83 }; #if YY_ClntParser_DEBUG != 0 static const short yyprhs[] = { 0, 0, 2, 3, 5, 7, 10, 13, 15, 17, 19, 21, 23, 25, 27, 29, 31, 33, 35, 37, 39, 41, 43, 45, 47, 49, 51, 53, 55, 57, 59, 61, 63, 65, 67, 69, 71, 73, 75, 77, 79, 81, 83, 85, 87, 89, 91, 93, 95, 97, 99, 101, 103, 105, 107, 109, 111, 113, 115, 117, 119, 120, 124, 125, 132, 133, 140, 145, 150, 154, 158, 160, 163, 165, 168, 170, 173, 175, 178, 180, 181, 182, 189, 193, 196, 198, 201, 202, 208, 209, 216, 220, 222, 225, 227, 230, 232, 235, 237, 240, 243, 244, 250, 251, 258, 259, 266, 268, 271, 273, 275, 278, 281, 284, 287, 290, 293, 298, 300, 303, 305, 308, 311, 312, 316, 319, 322, 324, 327, 330, 332, 336, 338, 340, 342, 344, 346, 348, 350, 352, 354, 356, 358, 360, 361, 365, 366, 370, 373, 376, 379, 381, 383, 385, 387, 390, 393, 396, 399, 402, 405, 407, 411, 412, 418, 421, 422, 429, 431, 434, 436, 438, 440, 445, 447, 451, 452, 458, 459, 468, 470, 473, 475, 477, 480, 483, 485, 487, 491, 495, 497, 501, 503, 507, 509, 511, 514, 515, 520, 523, 524, 529, 532, 533, 538, 541, 545, 548, 549, 554, 557, 558, 563, 566, 570, 574, 577, 578, 583, 586, 587, 592, 595, 599, 602, 606, 609, 612, 616, 618, 622, 626, 632, 635, 640, 645, 646, 652, 657, 661, 665, 669 }; static const short yyrhs[] = { 90, 0, 0, 91, 0, 96, 0, 90, 91, 0, 90, 96, 0, 92, 0, 116, 0, 117, 0, 115, 0, 118, 0, 121, 0, 119, 0, 122, 0, 123, 0, 148, 0, 149, 0, 124, 0, 126, 0, 127, 0, 128, 0, 129, 0, 132, 0, 133, 0, 134, 0, 181, 0, 135, 0, 146, 0, 147, 0, 94, 0, 145, 0, 93, 0, 164, 0, 120, 0, 163, 0, 169, 0, 171, 0, 173, 0, 175, 0, 176, 0, 178, 0, 180, 0, 182, 0, 184, 0, 186, 0, 187, 0, 188, 0, 189, 0, 191, 0, 136, 0, 138, 0, 192, 0, 144, 0, 140, 0, 151, 0, 152, 0, 142, 0, 114, 0, 143, 0, 0, 51, 95, 167, 0, 0, 24, 42, 84, 97, 99, 85, 0, 0, 24, 168, 84, 98, 99, 85, 0, 24, 42, 84, 85, 0, 24, 168, 84, 85, 0, 24, 42, 25, 0, 24, 168, 25, 0, 92, 0, 99, 92, 0, 105, 0, 99, 105, 0, 100, 0, 99, 100, 0, 153, 0, 99, 153, 0, 29, 0, 0, 0, 29, 84, 101, 103, 102, 85, 0, 29, 84, 85, 0, 103, 104, 0, 104, 0, 30, 168, 0, 0, 28, 84, 106, 108, 85, 0, 0, 28, 168, 84, 107, 108, 85, 0, 28, 84, 85, 0, 28, 0, 28, 168, 0, 93, 0, 108, 93, 0, 109, 0, 108, 109, 0, 31, 0, 31, 33, 0, 31, 168, 0, 0, 31, 84, 110, 113, 85, 0, 0, 31, 33, 84, 111, 113, 85, 0, 0, 31, 168, 84, 112, 113, 85, 0, 114, 0, 113, 114, 0, 141, 0, 150, 0, 39, 168, 0, 40, 42, 0, 38, 42, 0, 41, 168, 0, 52, 53, 0, 52, 54, 0, 52, 55, 168, 45, 0, 69, 0, 34, 42, 0, 46, 0, 46, 168, 0, 37, 42, 0, 0, 56, 125, 130, 0, 57, 42, 0, 58, 42, 0, 128, 0, 59, 42, 0, 60, 42, 0, 131, 0, 130, 86, 131, 0, 61, 0, 62, 0, 63, 0, 64, 0, 65, 0, 66, 0, 67, 0, 68, 0, 70, 0, 72, 0, 71, 0, 73, 0, 0, 26, 137, 165, 0, 0, 27, 139, 165, 0, 78, 33, 0, 5, 168, 0, 35, 168, 0, 74, 0, 75, 0, 48, 0, 47, 0, 83, 168, 0, 20, 42, 0, 21, 168, 0, 7, 168, 0, 3, 168, 0, 4, 168, 0, 49, 0, 49, 84, 85, 0, 0, 49, 84, 154, 156, 85, 0, 49, 168, 0, 0, 49, 168, 84, 155, 156, 85, 0, 157, 0, 156, 157, 0, 158, 0, 151, 0, 152, 0, 50, 33, 87, 168, 0, 50, 0, 50, 84, 85, 0, 0, 50, 84, 159, 161, 85, 0, 0, 50, 33, 87, 168, 84, 160, 161, 85, 0, 162, 0, 161, 162, 0, 150, 0, 141, 0, 8, 168, 0, 77, 168, 0, 33, 0, 45, 0, 165, 86, 33, 0, 165, 86, 45, 0, 33, 0, 166, 86, 33, 0, 42, 0, 167, 86, 42, 0, 43, 0, 44, 0, 36, 6, 0, 0, 36, 6, 170, 166, 0, 36, 10, 0, 0, 36, 10, 172, 167, 0, 36, 9, 0, 0, 36, 9, 174, 166, 0, 36, 11, 0, 36, 11, 42, 0, 36, 12, 0, 0, 36, 12, 177, 166, 0, 36, 13, 0, 0, 36, 13, 179, 167, 0, 36, 18, 0, 36, 18, 42, 0, 36, 19, 168, 0, 36, 14, 0, 0, 36, 14, 183, 166, 0, 36, 15, 0, 0, 36, 15, 185, 166, 0, 36, 16, 0, 36, 16, 42, 0, 36, 17, 0, 36, 17, 42, 0, 36, 22, 0, 36, 23, 0, 36, 23, 190, 0, 168, 0, 168, 88, 168, 0, 190, 86, 168, 0, 190, 86, 168, 88, 168, 0, 36, 76, 0, 36, 168, 82, 45, 0, 36, 168, 31, 33, 0, 0, 36, 168, 79, 193, 166, 0, 36, 168, 80, 42, 0, 36, 168, 82, 0, 36, 168, 31, 0, 36, 168, 80, 0, 36, 168, 79, 0 }; #endif #if (YY_ClntParser_DEBUG != 0) || defined(YY_ClntParser_ERROR_VERBOSE) static const short yyrline[] = { 0, 145, 146, 150, 151, 152, 153, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 211, 212, 213, 214, 215, 219, 221, 229, 234, 244, 251, 260, 272, 283, 296, 310, 311, 312, 313, 314, 315, 316, 317, 324, 333, 344, 349, 349, 361, 362, 366, 378, 384, 389, 396, 406, 417, 425, 438, 439, 440, 441, 454, 460, 466, 474, 485, 492, 503, 513, 521, 533, 534, 538, 539, 543, 553, 558, 563, 569, 570, 571, 579, 601, 608, 616, 639, 645, 648, 658, 680, 688, 691, 707, 716, 717, 721, 722, 723, 724, 725, 726, 727, 728, 732, 738, 744, 750, 757, 762, 768, 771, 777, 783, 790, 797, 808, 824, 831, 838, 845, 862, 870, 877, 884, 891, 899, 907, 914, 918, 927, 934, 942, 943, 947, 948, 949, 955, 962, 969, 976, 979, 987, 994, 1001, 1002, 1006, 1007, 1011, 1029, 1046, 1050, 1054, 1058, 1065, 1066, 1070, 1071, 1074, 1075, 1082, 1088, 1092, 1101, 1106, 1109, 1118, 1124, 1127, 1136, 1140, 1150, 1156, 1159, 1168, 1173, 1176, 1185, 1194, 1201, 1216, 1222, 1225, 1234, 1240, 1243, 1252, 1256, 1267, 1271, 1281, 1292, 1297, 1305, 1306, 1307, 1308, 1312, 1319, 1326, 1335, 1340, 1346, 1353, 1359, 1366, 1372 }; static const char * const yytname[] = { "$","error","$illegal.","T1_","T2_", "PREF_TIME_","DNS_SERVER_","VALID_TIME_","UNICAST_","NTP_SERVER_","DOMAIN_", "TIME_ZONE_","SIP_SERVER_","SIP_DOMAIN_","NIS_SERVER_","NISP_SERVER_","NIS_DOMAIN_", "NISP_DOMAIN_","FQDN_","FQDN_S_","DDNS_PROTOCOL_","DDNS_TIMEOUT_","LIFETIME_", "VENDOR_SPEC_","IFACE_","NO_CONFIG_","REJECT_SERVERS_","PREFERRED_SERVERS_", "IA_","TA_","IAID_","ADDRESS_KEYWORD_","NAME_","IPV6ADDR_","WORKDIR_","RAPID_COMMIT_", "OPTION_","SCRIPT_","LOGNAME_","LOGLEVEL_","LOGMODE_","LOGCOLORS_","STRING_", "HEXNUMBER_","INTNUMBER_","DUID_","STRICT_RFC_NO_ROUTING_","SKIP_CONFIRM_","OBEY_RA_BITS_", "PD_","PREFIX_","DOWNLINK_PREFIX_IFACES_","DUID_TYPE_","DUID_TYPE_LLT_","DUID_TYPE_LL_", "DUID_TYPE_EN_","AUTH_METHODS_","AUTH_PROTOCOL_","AUTH_ALGORITHM_","AUTH_REPLAY_", "AUTH_REALM_","DIGEST_NONE_","DIGEST_PLAIN_","DIGEST_HMAC_MD5_","DIGEST_HMAC_SHA1_", "DIGEST_HMAC_SHA224_","DIGEST_HMAC_SHA256_","DIGEST_HMAC_SHA384_","DIGEST_HMAC_SHA512_", "STATELESS_","ANON_INF_REQUEST_","INSIST_MODE_","INACTIVE_MODE_","EXPERIMENTAL_", "ADDR_PARAMS_","REMOTE_AUTOCONF_","AFTR_","ROUTING_","BIND_TO_ADDR_","ADDRESS_LIST_KEYWORD_", "STRING_KEYWORD_","DUID_KEYWORD_","HEX_KEYWORD_","RECONFIGURE_","'{'","'}'", "','","'/'","'-'","Grammar","GlobalDeclarationList","GlobalOptionDeclaration", "InterfaceOptionDeclaration","IAOptionDeclaration","DownlinkPrefixInterfaces", "@1","InterfaceDeclaration","@2","@3","InterfaceDeclarationsList","TADeclaration", "@4","@5","TADeclarationList","IAID","IADeclaration","@6","@7","IADeclarationList", "ADDRESDeclaration","@8","@9","@10","AddressParametersList","AddressParameter", "LogLevelOption","LogModeOption","LogNameOption","LogColors","DuidTypeOption", "StatelessMode","WorkDirOption","StrictRfcNoRoutingOption","ScriptName","AuthAcceptMethods", "@11","AuthProtocol","AuthAlgorithm","AuthReplay","AuthRealm","DigestList","Digest", "AnonInfRequest","InactiveMode","InsistMode","Experimental","RejectServersOption", "@12","PreferServersOption","@13","BindToAddress","PreferredTimeOption","RapidCommitOption", "ExperimentalAddrParams","ExperimentalRemoteAutoconf","ObeyRaBits","SkipConfirm", "ReconfigureAccept","DdnsProtocol","DdnsTimeout","ValidTimeOption","T1Option", "T2Option","PDDeclaration","@14","@15","PDOptionsList","PDOption","Prefix","@16", "@17","PrefixOptionsList","PrefixOption","UnicastOption","Routing","ADDRESDUIDList", "ADDRESSList","StringList","Number","DNSServerOption","@18","DomainOption","@19", "NTPServerOption","@20","TimeZoneOption","SIPServerOption","@21","SIPDomainOption", "@22","FQDNOption","FQDNBits","NISServerOption","@23","NISPServerOption","@24", "NISDomainOption","NISPDomainOption","LifetimeOption","VendorSpecOption","VendorSpecList", "DsLiteTunnelOption","ExtraOption","@25","" }; #endif static const short yyr1[] = { 0, 89, 89, 90, 90, 90, 90, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 93, 93, 93, 93, 93, 95, 94, 97, 96, 98, 96, 96, 96, 96, 96, 99, 99, 99, 99, 99, 99, 99, 99, 100, 101, 102, 100, 100, 103, 103, 104, 106, 105, 107, 105, 105, 105, 105, 108, 108, 108, 108, 109, 109, 109, 110, 109, 111, 109, 112, 109, 113, 113, 114, 114, 115, 116, 117, 118, 119, 119, 119, 120, 121, 122, 122, 123, 125, 124, 126, 127, 127, 128, 129, 130, 130, 131, 131, 131, 131, 131, 131, 131, 131, 132, 133, 134, 135, 137, 136, 139, 138, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 153, 154, 153, 153, 155, 153, 156, 156, 157, 157, 157, 158, 158, 158, 159, 158, 160, 158, 161, 161, 162, 162, 163, 164, 165, 165, 165, 165, 166, 166, 167, 167, 168, 168, 169, 170, 169, 171, 172, 171, 173, 174, 173, 175, 175, 176, 177, 176, 178, 179, 178, 180, 180, 181, 182, 183, 182, 184, 185, 184, 186, 186, 187, 187, 188, 189, 189, 190, 190, 190, 190, 191, 192, 192, 193, 192, 192, 192, 192, 192, 192 }; static const short yyr2[] = { 0, 1, 0, 1, 1, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 3, 0, 6, 0, 6, 4, 4, 3, 3, 1, 2, 1, 2, 1, 2, 1, 2, 1, 0, 0, 6, 3, 2, 1, 2, 0, 5, 0, 6, 3, 1, 2, 1, 2, 1, 2, 1, 2, 2, 0, 5, 0, 6, 0, 6, 1, 2, 1, 1, 2, 2, 2, 2, 2, 2, 4, 1, 2, 1, 2, 2, 0, 3, 2, 2, 1, 2, 2, 1, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 3, 0, 3, 2, 2, 2, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 1, 3, 0, 5, 2, 0, 6, 1, 2, 1, 1, 1, 4, 1, 3, 0, 5, 0, 8, 1, 2, 1, 1, 2, 2, 1, 1, 3, 3, 1, 3, 1, 3, 1, 1, 2, 0, 4, 2, 0, 4, 2, 0, 4, 2, 3, 2, 0, 4, 2, 0, 4, 2, 3, 3, 2, 0, 4, 2, 0, 4, 2, 3, 2, 3, 2, 2, 3, 1, 3, 3, 5, 2, 4, 4, 0, 5, 4, 3, 3, 3, 3 }; static const short yydefact[] = { 2, 0, 0, 0, 0, 0, 0, 0, 0, 143, 145, 0, 0, 0, 0, 0, 0, 0, 0, 119, 153, 152, 60, 0, 122, 0, 0, 0, 0, 117, 139, 141, 140, 142, 150, 151, 0, 0, 0, 1, 3, 7, 32, 30, 4, 58, 10, 8, 9, 11, 13, 34, 12, 14, 15, 18, 19, 20, 21, 22, 23, 24, 25, 27, 50, 51, 54, 108, 57, 59, 53, 31, 28, 29, 16, 17, 109, 55, 56, 35, 33, 36, 37, 38, 39, 40, 41, 42, 26, 43, 44, 45, 46, 47, 48, 49, 52, 193, 194, 158, 159, 148, 157, 183, 155, 156, 0, 0, 0, 0, 118, 149, 195, 201, 198, 204, 206, 209, 215, 218, 221, 223, 212, 0, 225, 226, 232, 0, 121, 112, 110, 111, 113, 120, 0, 114, 115, 0, 0, 124, 125, 127, 128, 184, 147, 154, 5, 6, 68, 62, 69, 64, 185, 186, 144, 146, 0, 0, 0, 205, 0, 0, 0, 0, 222, 224, 213, 214, 228, 227, 239, 241, 240, 238, 191, 61, 0, 131, 132, 133, 134, 135, 136, 137, 138, 123, 129, 66, 0, 67, 0, 0, 189, 197, 203, 200, 208, 211, 217, 220, 0, 0, 234, 0, 237, 233, 0, 116, 0, 91, 78, 0, 160, 70, 0, 74, 72, 76, 0, 187, 188, 0, 229, 230, 236, 192, 130, 86, 92, 79, 162, 164, 63, 71, 75, 73, 77, 65, 190, 0, 90, 0, 88, 82, 0, 161, 0, 165, 231, 97, 93, 0, 95, 0, 0, 80, 84, 173, 170, 171, 0, 167, 169, 0, 98, 100, 99, 87, 94, 96, 0, 85, 0, 83, 0, 175, 163, 168, 0, 102, 0, 104, 89, 81, 0, 174, 0, 166, 0, 0, 106, 0, 172, 182, 181, 0, 179, 0, 101, 107, 0, 177, 176, 180, 103, 105, 0, 0, 178, 0, 0, 0 }; static const short yydefgoto[] = { 309, 39, 40, 41, 42, 43, 134, 44, 188, 190, 214, 215, 244, 272, 255, 256, 216, 241, 253, 251, 252, 280, 288, 291, 289, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 138, 56, 57, 58, 59, 185, 186, 60, 61, 62, 63, 64, 108, 65, 109, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 217, 246, 263, 260, 261, 262, 286, 306, 295, 296, 79, 80, 154, 193, 175, 127, 81, 156, 82, 158, 83, 157, 84, 85, 160, 86, 161, 87, 88, 89, 162, 90, 163, 91, 92, 93, 94, 169, 95, 96, 203 }; static const short yypact[] = { 113, 166, 166, 166, 166, 166, -6, 166, 201,-32768,-32768, 13, 166, 218, 27, 72, 166, 77, 166, 166,-32768, -32768,-32768, 202,-32768, 102, 104, 126, 137,-32768,-32768, -32768,-32768,-32768,-32768,-32768, 166, 54, 166, 113,-32768, -32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768, -32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768, -32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768, -32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768, -32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768, -32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768, -32768,-32768,-32768,-32768,-32768, -20, 22, 78, 78,-32768, -32768, 122, 156, 162, 165, 181, 173, 214, 216, 209, 221, 224, 166,-32768, 166,-32768, -12,-32768,-32768,-32768, -32768,-32768,-32768, 247,-32768,-32768, 166, 270,-32768,-32768, -32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768, 138,-32768, 175,-32768,-32768, 172, 172, 257, 257, 247,-32768, 257, 247, 257, 257,-32768,-32768,-32768,-32768, 203, 206, 260, 262, 256, 255,-32768, 215, 258,-32768,-32768,-32768,-32768, -32768,-32768,-32768,-32768, 219,-32768,-32768, 190,-32768, 190, 97,-32768, 225, 225, 215, 225, 215, 225, 225, 166, 166,-32768, 257,-32768,-32768, 271,-32768, 270, 28, 220, 263, 57,-32768, 5,-32768,-32768,-32768, 17,-32768,-32768, 279,-32768, 227, 225,-32768,-32768, 231, 233, 235, 237, 239,-32768,-32768,-32768,-32768,-32768,-32768,-32768, 166,-32768, 100,-32768,-32768, 294,-32768, 35,-32768,-32768, 82,-32768, 53,-32768, 100, 166, 294,-32768, -3,-32768,-32768, 23, -32768,-32768, 35, 241,-32768, 242,-32768,-32768,-32768, 58, -32768, 243,-32768, 253, 244,-32768,-32768, 25,-32768, 9, -32768,-32768,-32768, 166,-32768, 9,-32768, 9, 43,-32768, 9, 259,-32768,-32768, 44,-32768, 71,-32768,-32768, 91, -32768,-32768,-32768,-32768,-32768, 9, 92,-32768, 341, 342, -32768 }; static const short yypgoto[] = {-32768, -32768, 305, 32, 1,-32768,-32768, 306,-32768,-32768, 157, -105,-32768,-32768,-32768, 93, -56,-32768,-32768, 96, -228, -32768,-32768,-32768, -86, 30,-32768,-32768,-32768,-32768,-32768, -32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768, -32768, 142,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768, -32768, -94,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768, 2, 24, 36, -51,-32768,-32768, 83, -201,-32768,-32768, -32768, 46, -150,-32768,-32768, 245, 18, 45, -1,-32768, -32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768, -32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768, -32768,-32768,-32768,-32768 }; #define YYLAST 354 static const short yytable[] = { 99, 100, 101, 102, 103, 148, 105, 107, 1, 2, 3, 111, 4, 5, 3, 130, 4, 132, 133, 170, 1, 2, 3, 269, 4, 5, 1, 2, 1, 2, 274, 9, 10, 209, 210, 143, 104, 145, 1, 2, 12, 211, 269, 9, 10, 209, 210, 150, 3, 3, 4, 4, 12, 211, 212, 110, 1, 2, 3, 277, 4, 1, 2, 3, 149, 4, 212, 171, 172, 128, 173, 97, 98, 257, 29, 257, 3, 277, 4, 34, 35, 275, 36, 37, 249, 257, 29, 144, 12, 249, 232, 34, 35, 12, 36, 37, 3, 3, 4, 4, 97, 98, 237, 1, 2, 3, 151, 4, 276, 234, 287, 152, 227, 234, 129, 264, 1, 2, 3, 131, 4, 5, 167, 153, 168, 97, 98, 34, 298, 302, 219, 249, 34, 6, 7, 12, 176, 8, 267, 9, 10, 230, 220, 282, 139, 303, 140, 11, 12, 13, 14, 15, 16, 17, 18, -196, 304, 303, 235, 19, 20, 21, 235, 236, 22, 23, 265, 236, 141, 24, 25, 26, 27, 28, 34, 194, 305, 308, 196, 142, 198, 199, 29, 30, 31, 32, 33, 34, 35, -202, 36, 37, 293, 1, 2, 3, 38, 4, 5, 222, 223, 293, 297, 195, -199, 300, 197, 159, 228, 97, 98, 231, 293, 293, -207, -210, 9, 10, 209, 210, 213, 224, 213, 187, 112, 12, 211, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 248, 212, 124, 125, 250, 106, 97, 98, 233, -216, 266, -219, 233, 164, 268, 271, 250, 135, 136, 137, 191, 29, 189, 97, 98, 165, 34, 35, 166, 36, 37, 112, 258, 268, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 259, 292, 258, 124, 125, 258, 294, 174, 192, 200, 201, 202, 126, -235, 259, 294, 204, 259, 205, 206, 258, 207, 229, 208, 97, 98, 294, 294, 290, 221, 238, 225, 259, 239, 240, 242, 290, 299, 243, 290, 245, 247, 254, 279, 281, 299, 283, 285, 299, 177, 178, 179, 180, 181, 182, 183, 184, 126, 284, 310, 311, 301, 146, 147, 278, 218, 273, 270, 226, 0, 307, 0, 155 }; static const short yycheck[] = { 1, 2, 3, 4, 5, 25, 7, 8, 3, 4, 5, 12, 7, 8, 5, 16, 7, 18, 19, 31, 3, 4, 5, 251, 7, 8, 3, 4, 3, 4, 33, 26, 27, 28, 29, 36, 42, 38, 3, 4, 35, 36, 270, 26, 27, 28, 29, 25, 5, 5, 7, 7, 35, 36, 49, 42, 3, 4, 5, 260, 7, 3, 4, 5, 84, 7, 49, 79, 80, 42, 82, 43, 44, 50, 69, 50, 5, 278, 7, 74, 75, 84, 77, 78, 31, 50, 69, 33, 35, 31, 85, 74, 75, 35, 77, 78, 5, 5, 7, 7, 43, 44, 85, 3, 4, 5, 84, 7, 85, 214, 85, 33, 84, 218, 42, 33, 3, 4, 5, 42, 7, 8, 123, 45, 125, 43, 44, 74, 85, 85, 33, 31, 74, 20, 21, 35, 137, 24, 85, 26, 27, 84, 45, 85, 42, 295, 42, 34, 35, 36, 37, 38, 39, 40, 41, 33, 85, 307, 214, 46, 47, 48, 218, 214, 51, 52, 84, 218, 42, 56, 57, 58, 59, 60, 74, 157, 85, 85, 160, 42, 162, 163, 69, 70, 71, 72, 73, 74, 75, 33, 77, 78, 286, 3, 4, 5, 83, 7, 8, 200, 201, 295, 288, 158, 42, 291, 161, 42, 209, 43, 44, 212, 306, 307, 33, 42, 26, 27, 28, 29, 188, 203, 190, 85, 6, 35, 36, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 239, 49, 22, 23, 241, 42, 43, 44, 214, 33, 249, 33, 218, 42, 251, 254, 253, 53, 54, 55, 86, 69, 85, 43, 44, 42, 74, 75, 42, 77, 78, 6, 246, 270, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 246, 284, 260, 22, 23, 263, 286, 42, 33, 88, 86, 33, 76, 33, 260, 295, 42, 263, 45, 86, 278, 45, 84, 86, 43, 44, 306, 307, 280, 86, 33, 42, 278, 88, 85, 84, 288, 289, 85, 291, 85, 84, 30, 84, 84, 297, 85, 85, 300, 61, 62, 63, 64, 65, 66, 67, 68, 76, 87, 0, 0, 84, 39, 39, 263, 190, 255, 253, 208, -1, 306, -1, 109 }; #line 352 "../bison++/bison.cc" /* fattrs + tables */ /* parser code folow */ /* This is the parser code that is written into each bison parser when the %semantic_parser declaration is not specified in the grammar. It was written by Richard Stallman by simplifying the hairy parser used when %semantic_parser is specified. */ /* Note: dollar marks section change the next is replaced by the list of actions, each action as one case of the switch. */ #if YY_ClntParser_USE_GOTO != 0 /* SUPRESSION OF GOTO : on some C++ compiler (sun c++) the goto is strictly forbidden if any constructor/destructor is used in the whole function (very stupid isn't it ?) so goto are to be replaced with a 'while/switch/case construct' here are the macro to keep some apparent compatibility */ #define YYGOTO(lb) {yy_gotostate=lb;continue;} #define YYBEGINGOTO enum yy_labels yy_gotostate=yygotostart; \ for(;;) switch(yy_gotostate) { case yygotostart: { #define YYLABEL(lb) } case lb: { #define YYENDGOTO } } #define YYBEGINDECLARELABEL enum yy_labels {yygotostart #define YYDECLARELABEL(lb) ,lb #define YYENDDECLARELABEL } #else /* macro to keep goto */ #define YYGOTO(lb) goto lb #define YYBEGINGOTO #define YYLABEL(lb) lb: #define YYENDGOTO #define YYBEGINDECLARELABEL #define YYDECLARELABEL(lb) #define YYENDDECLARELABEL #endif /* LABEL DECLARATION */ YYBEGINDECLARELABEL YYDECLARELABEL(yynewstate) YYDECLARELABEL(yybackup) /* YYDECLARELABEL(yyresume) */ YYDECLARELABEL(yydefault) YYDECLARELABEL(yyreduce) YYDECLARELABEL(yyerrlab) /* here on detecting error */ YYDECLARELABEL(yyerrlab1) /* here on error raised explicitly by an action */ YYDECLARELABEL(yyerrdefault) /* current state does not do anything special for the error token. */ YYDECLARELABEL(yyerrpop) /* pop the current state because it cannot handle the error token */ YYDECLARELABEL(yyerrhandle) YYENDDECLARELABEL /* ALLOCA SIMULATION */ /* __HAVE_NO_ALLOCA */ #ifdef __HAVE_NO_ALLOCA int __alloca_free_ptr(char *ptr,char *ref) {if(ptr!=ref) free(ptr); return 0;} #define __ALLOCA_alloca(size) malloc(size) #define __ALLOCA_free(ptr,ref) __alloca_free_ptr((char *)ptr,(char *)ref) #ifdef YY_ClntParser_LSP_NEEDED #define __ALLOCA_return(num) \ do { return( __ALLOCA_free(yyss,yyssa)+\ __ALLOCA_free(yyvs,yyvsa)+\ __ALLOCA_free(yyls,yylsa)+\ (num)); } while(0) #else #define __ALLOCA_return(num) \ do { return( __ALLOCA_free(yyss,yyssa)+\ __ALLOCA_free(yyvs,yyvsa)+\ (num)); } while(0) #endif #else #define __ALLOCA_return(num) do { return(num); } while(0) #define __ALLOCA_alloca(size) alloca(size) #define __ALLOCA_free(ptr,ref) #endif /* ENDALLOCA SIMULATION */ #define yyerrok (yyerrstatus = 0) #define yyclearin (YY_ClntParser_CHAR = YYEMPTY) #define YYEMPTY -2 #define YYEOF 0 #define YYACCEPT __ALLOCA_return(0) #define YYABORT __ALLOCA_return(1) #define YYERROR YYGOTO(yyerrlab1) /* Like YYERROR except do call yyerror. This remains here temporarily to ease the transition to the new meaning of YYERROR, for GCC. Once GCC version 2 has supplanted version 1, this can go. */ #define YYFAIL YYGOTO(yyerrlab) #define YYRECOVERING() (!!yyerrstatus) #define YYBACKUP(token, value) \ do \ if (YY_ClntParser_CHAR == YYEMPTY && yylen == 1) \ { YY_ClntParser_CHAR = (token), YY_ClntParser_LVAL = (value); \ yychar1 = YYTRANSLATE (YY_ClntParser_CHAR); \ YYPOPSTACK; \ YYGOTO(yybackup); \ } \ else \ { YY_ClntParser_ERROR ("syntax error: cannot back up"); YYERROR; } \ while (0) #define YYTERROR 1 #define YYERRCODE 256 #ifndef YY_ClntParser_PURE /* UNPURE */ #define YYLEX YY_ClntParser_LEX() #ifndef YY_USE_CLASS /* If nonreentrant, and not class , generate the variables here */ int YY_ClntParser_CHAR; /* the lookahead symbol */ YY_ClntParser_STYPE YY_ClntParser_LVAL; /* the semantic value of the */ /* lookahead symbol */ int YY_ClntParser_NERRS; /* number of parse errors so far */ #ifdef YY_ClntParser_LSP_NEEDED YY_ClntParser_LTYPE YY_ClntParser_LLOC; /* location data for the lookahead */ /* symbol */ #endif #endif #else /* PURE */ #ifdef YY_ClntParser_LSP_NEEDED #define YYLEX YY_ClntParser_LEX(&YY_ClntParser_LVAL, &YY_ClntParser_LLOC) #else #define YYLEX YY_ClntParser_LEX(&YY_ClntParser_LVAL) #endif #endif #ifndef YY_USE_CLASS #if YY_ClntParser_DEBUG != 0 int YY_ClntParser_DEBUG_FLAG; /* nonzero means print parse trace */ /* Since this is uninitialized, it does not stop multiple parsers from coexisting. */ #endif #endif /* YYINITDEPTH indicates the initial size of the parser's stacks */ #ifndef YYINITDEPTH #define YYINITDEPTH 200 #endif /* YYMAXDEPTH is the maximum size the stacks can grow to (effective only if the built-in stack extension method is used). */ #if YYMAXDEPTH == 0 #undef YYMAXDEPTH #endif #ifndef YYMAXDEPTH #define YYMAXDEPTH 10000 #endif #if __GNUC__ > 1 /* GNU C and GNU C++ define this. */ #define __yy_bcopy(FROM,TO,COUNT) __builtin_memcpy(TO,FROM,COUNT) #else /* not GNU C or C++ */ /* This is the most reliable way to avoid incompatibilities in available built-in functions on various systems. */ #ifdef __cplusplus static void __yy_bcopy (char *from, char *to, int count) #else #ifdef __STDC__ static void __yy_bcopy (char *from, char *to, int count) #else static void __yy_bcopy (from, to, count) char *from; char *to; int count; #endif #endif { register char *f = from; register char *t = to; register int i = count; while (i-- > 0) *t++ = *f++; } #endif int #ifdef YY_USE_CLASS YY_ClntParser_CLASS:: #endif YY_ClntParser_PARSE(YY_ClntParser_PARSE_PARAM) #ifndef __STDC__ #ifndef __cplusplus #ifndef YY_USE_CLASS /* parameter definition without protypes */ YY_ClntParser_PARSE_PARAM_DEF #endif #endif #endif { register int yystate; register int yyn; register short *yyssp; register YY_ClntParser_STYPE *yyvsp; int yyerrstatus; /* number of tokens to shift before error messages enabled */ int yychar1=0; /* lookahead token as an internal (translated) token number */ short yyssa[YYINITDEPTH]; /* the state stack */ YY_ClntParser_STYPE yyvsa[YYINITDEPTH]; /* the semantic value stack */ short *yyss = yyssa; /* refer to the stacks thru separate pointers */ YY_ClntParser_STYPE *yyvs = yyvsa; /* to allow yyoverflow to reallocate them elsewhere */ #ifdef YY_ClntParser_LSP_NEEDED YY_ClntParser_LTYPE yylsa[YYINITDEPTH]; /* the location stack */ YY_ClntParser_LTYPE *yyls = yylsa; YY_ClntParser_LTYPE *yylsp; #define YYPOPSTACK (yyvsp--, yyssp--, yylsp--) #else #define YYPOPSTACK (yyvsp--, yyssp--) #endif int yystacksize = YYINITDEPTH; #ifdef YY_ClntParser_PURE int YY_ClntParser_CHAR; YY_ClntParser_STYPE YY_ClntParser_LVAL; int YY_ClntParser_NERRS; #ifdef YY_ClntParser_LSP_NEEDED YY_ClntParser_LTYPE YY_ClntParser_LLOC; #endif #endif YY_ClntParser_STYPE yyval; /* the variable used to return */ /* semantic values from the action */ /* routines */ int yylen; /* start loop, in which YYGOTO may be used. */ YYBEGINGOTO #if YY_ClntParser_DEBUG != 0 if (YY_ClntParser_DEBUG_FLAG) fprintf(stderr, "Starting parse\n"); #endif yystate = 0; yyerrstatus = 0; YY_ClntParser_NERRS = 0; YY_ClntParser_CHAR = YYEMPTY; /* Cause a token to be read. */ /* Initialize stack pointers. Waste one element of value and location stack so that they stay on the same level as the state stack. The wasted elements are never initialized. */ yyssp = yyss - 1; yyvsp = yyvs; #ifdef YY_ClntParser_LSP_NEEDED yylsp = yyls; #endif /* Push a new state, which is found in yystate . */ /* In all cases, when you get here, the value and location stacks have just been pushed. so pushing a state here evens the stacks. */ YYLABEL(yynewstate) *++yyssp = yystate; if (yyssp >= yyss + yystacksize - 1) { /* Give user a chance to reallocate the stack */ /* Use copies of these so that the &'s don't force the real ones into memory. */ YY_ClntParser_STYPE *yyvs1 = yyvs; short *yyss1 = yyss; #ifdef YY_ClntParser_LSP_NEEDED YY_ClntParser_LTYPE *yyls1 = yyls; #endif /* Get the current used size of the three stacks, in elements. */ int size = yyssp - yyss + 1; #ifdef yyoverflow /* Each stack pointer address is followed by the size of the data in use in that stack, in bytes. */ #ifdef YY_ClntParser_LSP_NEEDED /* This used to be a conditional around just the two extra args, but that might be undefined if yyoverflow is a macro. */ yyoverflow("parser stack overflow", &yyss1, size * sizeof (*yyssp), &yyvs1, size * sizeof (*yyvsp), &yyls1, size * sizeof (*yylsp), &yystacksize); #else // cppcheck-suppress constStatement yyoverflow("parser stack overflow", &yyss1, size * sizeof (*yyssp), &yyvs1, size * sizeof (*yyvsp), &yystacksize); #endif yyss = yyss1; yyvs = yyvs1; #ifdef YY_ClntParser_LSP_NEEDED yyls = yyls1; #endif #else /* no yyoverflow */ /* Extend the stack our own way. */ if (yystacksize >= YYMAXDEPTH) { YY_ClntParser_ERROR(((char*)"parser stack overflow")); __ALLOCA_return(2); } yystacksize *= 2; if (yystacksize > YYMAXDEPTH) yystacksize = YYMAXDEPTH; yyss = (short *) __ALLOCA_alloca (yystacksize * sizeof (*yyssp)); __yy_bcopy ((char *)yyss1, (char *)yyss, size * sizeof (*yyssp)); __ALLOCA_free(yyss1,yyssa); yyvs = (YY_ClntParser_STYPE *) __ALLOCA_alloca (yystacksize * sizeof (*yyvsp)); __yy_bcopy ((char *)yyvs1, (char *)yyvs, size * sizeof (*yyvsp)); __ALLOCA_free(yyvs1,yyvsa); #ifdef YY_ClntParser_LSP_NEEDED yyls = (YY_ClntParser_LTYPE *) __ALLOCA_alloca (yystacksize * sizeof (*yylsp)); __yy_bcopy ((char *)yyls1, (char *)yyls, size * sizeof (*yylsp)); __ALLOCA_free(yyls1,yylsa); #endif #endif /* no yyoverflow */ yyssp = yyss + size - 1; yyvsp = yyvs + size - 1; #ifdef YY_ClntParser_LSP_NEEDED yylsp = yyls + size - 1; #endif #if YY_ClntParser_DEBUG != 0 if (YY_ClntParser_DEBUG_FLAG) fprintf(stderr, "Stack size increased to %d\n", yystacksize); #endif if (yyssp >= yyss + yystacksize - 1) YYABORT; } #if YY_ClntParser_DEBUG != 0 if (YY_ClntParser_DEBUG_FLAG) fprintf(stderr, "Entering state %d\n", yystate); #endif YYGOTO(yybackup); YYLABEL(yybackup) /* Do appropriate processing given the current state. */ /* Read a lookahead token if we need one and don't already have one. */ /* YYLABEL(yyresume) */ /* First try to decide what to do without reference to lookahead token. */ yyn = yypact[yystate]; if (yyn == YYFLAG) YYGOTO(yydefault); /* Not known => get a lookahead token if don't already have one. */ /* yychar is either YYEMPTY or YYEOF or a valid token in external form. */ if (YY_ClntParser_CHAR == YYEMPTY) { #if YY_ClntParser_DEBUG != 0 if (YY_ClntParser_DEBUG_FLAG) fprintf(stderr, "Reading a token: "); #endif YY_ClntParser_CHAR = YYLEX; } /* Convert token to internal form (in yychar1) for indexing tables with */ if (YY_ClntParser_CHAR <= 0) /* This means end of input. */ { yychar1 = 0; YY_ClntParser_CHAR = YYEOF; /* Don't call YYLEX any more */ #if YY_ClntParser_DEBUG != 0 if (YY_ClntParser_DEBUG_FLAG) fprintf(stderr, "Now at end of input.\n"); #endif } else { yychar1 = YYTRANSLATE(YY_ClntParser_CHAR); #if YY_ClntParser_DEBUG != 0 if (YY_ClntParser_DEBUG_FLAG) { fprintf (stderr, "Next token is %d (%s", YY_ClntParser_CHAR, yytname[yychar1]); /* Give the individual parser a way to print the precise meaning of a token, for further debugging info. */ #ifdef YYPRINT YYPRINT (stderr, YY_ClntParser_CHAR, YY_ClntParser_LVAL); #endif fprintf (stderr, ")\n"); } #endif } yyn += yychar1; if (yyn < 0 || yyn > YYLAST || yycheck[yyn] != yychar1) YYGOTO(yydefault); yyn = yytable[yyn]; /* yyn is what to do for this token type in this state. Negative => reduce, -yyn is rule number. Positive => shift, yyn is new state. New state is final state => don't bother to shift, just return success. 0, or most negative number => error. */ if (yyn < 0) { if (yyn == YYFLAG) YYGOTO(yyerrlab); yyn = -yyn; YYGOTO(yyreduce); } else if (yyn == 0) YYGOTO(yyerrlab); if (yyn == YYFINAL) YYACCEPT; /* Shift the lookahead token. */ #if YY_ClntParser_DEBUG != 0 if (YY_ClntParser_DEBUG_FLAG) fprintf(stderr, "Shifting token %d (%s), ", YY_ClntParser_CHAR, yytname[yychar1]); #endif /* Discard the token being shifted unless it is eof. */ if (YY_ClntParser_CHAR != YYEOF) YY_ClntParser_CHAR = YYEMPTY; *++yyvsp = YY_ClntParser_LVAL; #ifdef YY_ClntParser_LSP_NEEDED *++yylsp = YY_ClntParser_LLOC; #endif /* count tokens shifted since error; after three, turn off error status. */ if (yyerrstatus) yyerrstatus--; yystate = yyn; YYGOTO(yynewstate); /* Do the default action for the current state. */ YYLABEL(yydefault) yyn = yydefact[yystate]; if (yyn == 0) YYGOTO(yyerrlab); /* Do a reduction. yyn is the number of a rule to reduce with. */ YYLABEL(yyreduce) yylen = yyr2[yyn]; if (yylen > 0) yyval = yyvsp[1-yylen]; /* implement default value of the action */ #if YY_ClntParser_DEBUG != 0 if (YY_ClntParser_DEBUG_FLAG) { int i; fprintf (stderr, "Reducing via rule %d (line %d), ", yyn, yyrline[yyn]); /* Print the symbols being reduced, and their result. */ for (i = yyprhs[yyn]; yyrhs[i] > 0; i++) fprintf (stderr, "%s ", yytname[yyrhs[i]]); fprintf (stderr, " -> %s\n", yytname[yyr1[yyn]]); } #endif #line 840 "../bison++/bison.cc" switch (yyn) { case 60: #line 219 "ClntParser.y" { PresentStringLst.clear(); ; break;} case 61: #line 221 "ClntParser.y" { CfgMgr->setDownlinkPrefixIfaces(PresentStringLst); ; break;} case 62: #line 230 "ClntParser.y" { if (!StartIfaceDeclaration(yyvsp[-1].strval)) YYABORT; ; break;} case 63: #line 235 "ClntParser.y" { delete [] yyvsp[-4].strval; if (!EndIfaceDeclaration()) YYABORT; ; break;} case 64: #line 245 "ClntParser.y" { if (!IfaceDefined(yyvsp[-1].ival)) YYABORT; if (!StartIfaceDeclaration(yyvsp[-1].ival)) YYABORT; ; break;} case 65: #line 252 "ClntParser.y" { if (!EndIfaceDeclaration()) YYABORT; ; break;} case 66: #line 261 "ClntParser.y" { if (!IfaceDefined(string(yyvsp[-2].strval))) YYABORT; ClntCfgIfaceLst.append(new TClntCfgIface(yyvsp[-2].strval)); delete [] yyvsp[-2].strval; EmptyIface(); ; break;} case 67: #line 273 "ClntParser.y" { if (!IfaceDefined(yyvsp[-2].ival)) YYABORT; ClntCfgIfaceLst.append(new TClntCfgIface(yyvsp[-2].ival)); EmptyIface(); ; break;} case 68: #line 284 "ClntParser.y" { if (!IfaceDefined(string(yyvsp[-1].strval))) YYABORT; ClntCfgIfaceLst.append(new TClntCfgIface(yyvsp[-1].strval)); ClntCfgIfaceLst.getLast()->setOptions(ParserOptStack.getLast()); ClntCfgIfaceLst.getLast()->setNoConfig(); delete yyvsp[-1].strval; ; break;} case 69: #line 297 "ClntParser.y" { if (!IfaceDefined(yyvsp[-1].ival)) YYABORT; ClntCfgIfaceLst.append(SPtr (new TClntCfgIface(yyvsp[-1].ival)) ); ClntCfgIfaceLst.getLast()->setOptions(ParserOptStack.getLast()); ClntCfgIfaceLst.getLast()->setNoConfig(); ; break;} case 78: #line 325 "ClntParser.y" { if (!ParserOptStack.getLast()->getStateful()) { Log(Crit) << "Attempted to use TA (stateful option) in stateless mode." << LogEnd; YYABORT; } this->ClntCfgTALst.append( new TClntCfgTA() ); // append new TA ; break;} case 79: #line 334 "ClntParser.y" { if (!ParserOptStack.getLast()->getStateful()) { Log(Crit) << "Attempted to use TA (stateful option) in stateless mode." << LogEnd; YYABORT; } this->ClntCfgTALst.append( new TClntCfgTA() ); // append new TA this->iaidSet = false; ; break;} case 80: #line 344 "ClntParser.y" { if (this->iaidSet) this->ClntCfgTALst.getLast()->setIAID(this->iaid); ; break;} case 82: #line 350 "ClntParser.y" { if (!ParserOptStack.getLast()->getStateful()) { Log(Crit) << "Attempted to use TA (stateful option) in stateless mode." << LogEnd; YYABORT; } this->ClntCfgTALst.append( new TClntCfgTA() ); // append new TA ; break;} case 85: #line 367 "ClntParser.y" { this->iaidSet = true; this->iaid = yyvsp[0].ival; Log(Crit) << "IAID=" << this->iaid << " parsed." << LogEnd; ; break;} case 86: #line 379 "ClntParser.y" { if (!StartIADeclaration(false)) { YYABORT; } ; break;} case 87: #line 385 "ClntParser.y" { EndIADeclaration(); ; break;} case 88: #line 390 "ClntParser.y" { if (!StartIADeclaration(false)) { YYABORT; } this->iaid = yyvsp[-1].ival; ; break;} case 89: #line 397 "ClntParser.y" { EndIADeclaration(); Log(Info) << "Setting IAID to " << this->iaid << LogEnd; ClntCfgIALst.getLast()->setIAID(this->iaid); ; break;} case 90: #line 407 "ClntParser.y" { if (!StartIADeclaration(true)) { YYABORT; } EndIADeclaration(); ; break;} case 91: #line 418 "ClntParser.y" { if (!StartIADeclaration(true)) { YYABORT; } EndIADeclaration(); ; break;} case 92: #line 426 "ClntParser.y" { if (!StartIADeclaration(true)) { YYABORT; } EndIADeclaration(); Log(Info) << "Setting IAID to " << yyvsp[0].ival << LogEnd; ClntCfgIALst.getLast()->setIAID(yyvsp[0].ival); ; break;} case 97: #line 455 "ClntParser.y" { EmptyAddr(); ; break;} case 98: #line 460 "ClntParser.y" { ClntCfgAddrLst.append(new TClntCfgAddr(new TIPv6Addr(yyvsp[0].addrval))); ClntCfgAddrLst.getLast()->setOptions(ParserOptStack.getLast()); ; break;} case 99: #line 467 "ClntParser.y" { for (int i = 0; i < yyvsp[0].ival; i++) { EmptyAddr(); } ; break;} case 100: #line 475 "ClntParser.y" { // Get last context SPtr globalOpt = ParserOptStack.getLast(); // Create new context based on the current one SPtr newOpt = new TClntParsGlobalOpt(*globalOpt); // Add this new context to the contexts stack ParserOptStack.append(newOpt); ; break;} case 101: #line 486 "ClntParser.y" { EmptyAddr(); // Create an empty address ParserOptStack.delLast(); // Delete new context ; break;} case 102: #line 493 "ClntParser.y" { // We need to store just one address, but let's use PresentAddrLst // We'll need that address to create an actual object when the context is closed PresentAddrLst.clear(); PresentAddrLst.append(SPtr (new TIPv6Addr(yyvsp[-1].addrval))); SPtr globalOpt = ParserOptStack.getLast(); SPtr newOpt = new TClntParsGlobalOpt(*globalOpt); ParserOptStack.append(newOpt); ; break;} case 103: #line 504 "ClntParser.y" { ClntCfgAddrLst.append(new TClntCfgAddr(PresentAddrLst.getLast())); ClntCfgAddrLst.getLast()->setOptions(ParserOptStack.getLast()); if (ParserOptStack.count()) ParserOptStack.delLast(); PresentAddrLst.clear(); ; break;} case 104: #line 514 "ClntParser.y" { //In this agregated declaration no address hints are allowed ParserOptStack.append(new TClntParsGlobalOpt(*ParserOptStack.getLast())); ParserOptStack.getLast()->setAddrHint(false); AddrCount_ = yyvsp[-1].ival; ; break;} case 105: #line 522 "ClntParser.y" { for (unsigned int i = 0; i < AddrCount_; i++) { EmptyAddr(); ClntCfgAddrLst.getLast()->setOptions(ParserOptStack.getLast()); } ParserOptStack.delLast(); AddrCount_ = 0; ; break;} case 110: #line 544 "ClntParser.y" { if ( (yyvsp[0].ival<1) || (yyvsp[0].ival>8) ) { Log(Crit) << "Invalid loglevel specified: " << yyvsp[0].ival << ". Allowed range: 1-8." << LogEnd; } logger::setLogLevel(yyvsp[0].ival); ; break;} case 111: #line 553 "ClntParser.y" { logger::setLogMode(yyvsp[0].strval); ; break;} case 112: #line 558 "ClntParser.y" { logger::setLogName(yyvsp[0].strval); ; break;} case 113: #line 564 "ClntParser.y" { logger::setColors(yyvsp[0].ival==1); ; break;} case 114: #line 569 "ClntParser.y" { this->DUIDType = DUID_TYPE_LLT;; break;} case 115: #line 570 "ClntParser.y" { this->DUIDType = DUID_TYPE_LL; ; break;} case 116: #line 571 "ClntParser.y" { this->DUIDType = DUID_TYPE_EN; this->DUIDEnterpriseNumber = yyvsp[-1].ival; this->DUIDEnterpriseID = new TDUID(yyvsp[0].duidval.duid, yyvsp[0].duidval.length); ; break;} case 117: #line 580 "ClntParser.y" { if (!ClntCfgIALst.empty()) { Log(Crit) << "Attempting to enable statelss, but IA (stateful option) is already defined." << LogEnd; YYABORT; } if (!ClntCfgTALst.empty()) { Log(Crit) << "Attempting to enable statelss, but TA (stateful option) is already defined." << LogEnd; YYABORT; } if (!ClntCfgPDLst.empty()) { Log(Crit) << "Attempting to enable statelss, but PD (stateful option) is already defined." << LogEnd; YYABORT; } ParserOptStack.getLast()->setStateful(false); ; break;} case 118: #line 602 "ClntParser.y" { ParserOptStack.getLast()->setWorkDir(yyvsp[0].strval); ; break;} case 119: #line 609 "ClntParser.y" { Log(Warning) << "strict-rfc-no-routing has changed in 1.0.0RC2: it now takes one argument: " << " 0 (address configured with guessed /64 prefix length that may be wrong in " << "some cases; dibbler clients prior to 1.0.0RC2 used this) or 1 (address " << "configured with /128, as RFC specifies); the default has changed in 1.0.0RC2: " << "Dibbler is now RFC conformant." << LogEnd; ; break;} case 120: #line 617 "ClntParser.y" { switch (yyvsp[0].ival) { case 0: // This is pre 1.0.0RC2 behaviour Log(Warning) << "Strict-rfc-no-routing disabled: addresses will be " << "configured with /64 prefix." << LogEnd; ParserOptStack.getLast()->setOnLinkPrefixLength(64); break; case 1: // The default is now /128 anyway, so this is a no-op Log(Warning) << "Strict-rfc-no-routing enabled (it is the default): " << "addresses will be configured with /128 prefix." << LogEnd; break; default: Log(Crit) << "Invalid parameter passed to strict-rfc-no-routing: " << yyvsp[0].ival << ", only 0 or 1" << LogEnd; YYABORT; } ; break;} case 121: #line 640 "ClntParser.y" { CfgMgr->setScript(yyvsp[0].strval); ; break;} case 122: #line 646 "ClntParser.y" { DigestLst.clear(); ; break;} case 123: #line 648 "ClntParser.y" { #ifndef MOD_DISABLE_AUTH CfgMgr->setAuthAcceptMethods(DigestLst); DigestLst.clear(); #else Log(Crit) << "Auth support disabled at compilation time." << LogEnd; #endif ; break;} case 124: #line 658 "ClntParser.y" { #ifndef MOD_DISABLE_AUTH if (!strcasecmp(yyvsp[0].strval,"none")) { CfgMgr->setAuthProtocol(AUTH_PROTO_NONE); CfgMgr->setAuthAlgorithm(AUTH_ALGORITHM_NONE); } else if (!strcasecmp(yyvsp[0].strval, "delayed")) { CfgMgr->setAuthProtocol(AUTH_PROTO_DELAYED); } else if (!strcasecmp(yyvsp[0].strval, "reconfigure-key")) { CfgMgr->setAuthProtocol(AUTH_PROTO_RECONFIGURE_KEY); CfgMgr->setAuthAlgorithm(AUTH_ALGORITHM_RECONFIGURE_KEY); } else if (!strcasecmp(yyvsp[0].strval, "dibbler")) { CfgMgr->setAuthProtocol(AUTH_PROTO_DIBBLER); } else { Log(Crit) << "Invalid auth-protocol parameter: " << string(yyvsp[0].strval) << LogEnd; YYABORT; } #else Log(Crit) << "Auth support disabled at compilation time." << LogEnd; #endif ; break;} case 125: #line 680 "ClntParser.y" { #ifndef MOD_DISABLE_AUTH Log(Crit) << "auth-algorithm selection is not supported yet." << LogEnd; YYABORT; #else Log(Crit) << "Auth support disabled at compilation time." << LogEnd; #endif ; break;} case 127: #line 691 "ClntParser.y" { #ifndef MOD_DISABLE_AUTH if (strcasecmp(yyvsp[0].strval, "none")) { CfgMgr->setAuthReplay(AUTH_REPLAY_NONE); } else if (strcasecmp(yyvsp[0].strval, "monotonic")) { CfgMgr->setAuthReplay(AUTH_REPLAY_MONOTONIC); } else { Log(Crit) << "Invalid auth-replay parameter: " << string(yyvsp[0].strval) << LogEnd; YYABORT; } #else Log(Crit) << "Auth support disabled at compilation time." << LogEnd; #endif ; break;} case 128: #line 707 "ClntParser.y" { #ifndef MOD_DISABLE_AUTH CfgMgr->setAuthRealm(std::string(yyvsp[0].strval)); #else Log(Crit) << "Auth support disabled at compilation time." << LogEnd; #endif ; break;} case 131: #line 721 "ClntParser.y" { DigestLst.push_back(DIGEST_NONE); ; break;} case 132: #line 722 "ClntParser.y" { DigestLst.push_back(DIGEST_PLAIN); ; break;} case 133: #line 723 "ClntParser.y" { DigestLst.push_back(DIGEST_HMAC_MD5); ; break;} case 134: #line 724 "ClntParser.y" { DigestLst.push_back(DIGEST_HMAC_SHA1); ; break;} case 135: #line 725 "ClntParser.y" { DigestLst.push_back(DIGEST_HMAC_SHA224); ; break;} case 136: #line 726 "ClntParser.y" { DigestLst.push_back(DIGEST_HMAC_SHA256); ; break;} case 137: #line 727 "ClntParser.y" { DigestLst.push_back(DIGEST_HMAC_SHA384); ; break;} case 138: #line 728 "ClntParser.y" { DigestLst.push_back(DIGEST_HMAC_SHA512); ; break;} case 139: #line 733 "ClntParser.y" { ParserOptStack.getLast()->setAnonInfRequest(true); ; break;} case 140: #line 739 "ClntParser.y" { ParserOptStack.getLast()->setInactiveMode(true); ; break;} case 141: #line 745 "ClntParser.y" { ParserOptStack.getLast()->setInsistMode(true); ; break;} case 142: #line 751 "ClntParser.y" { Log(Crit) << "Experimental features are allowed." << LogEnd; ParserOptStack.getLast()->setExperimental(); ; break;} case 143: #line 758 "ClntParser.y" { //ParserOptStack.getLast()->clearRejedSrv(); PresentStationLst.clear(); ; break;} case 144: #line 762 "ClntParser.y" { ParserOptStack.getLast()->setRejedSrvLst(&PresentStationLst); ; break;} case 145: #line 769 "ClntParser.y" { PresentStationLst.clear(); ; break;} case 146: #line 771 "ClntParser.y" { ParserOptStack.getLast()->setPrefSrvLst(&PresentStationLst); ; break;} case 147: #line 778 "ClntParser.y" { ClntCfgIfaceLst.getLast()->setBindToAddr(SPtr(new TIPv6Addr(yyvsp[0].addrval))); ; break;} case 148: #line 784 "ClntParser.y" { ParserOptStack.getLast()->setPref(yyvsp[0].ival); ; break;} case 149: #line 791 "ClntParser.y" { ParserOptStack.getLast()->setRapidCommit(yyvsp[0].ival); ; break;} case 150: #line 798 "ClntParser.y" { if (!ParserOptStack.getLast()->getExperimental()) { Log(Crit) << "Experimental 'addr-params' defined, but experimental features are disabled." << "Add 'experimental' in global section of client.conf to enable it." << LogEnd; YYABORT; } ParserOptStack.getLast()->setAddrParams(true); ; break;} case 151: #line 809 "ClntParser.y" { if (!ParserOptStack.getLast()->getExperimental()) { Log(Crit) << "Experimental remote autoconfiguration feature defined, but experimental" " features are disabled. Add 'experimental' in global section of client.conf " "to enable it." << LogEnd; YYABORT; } #ifdef MOD_REMOTE_AUTOCONF CfgMgr->setRemoteAutoconf(true); #else Log(Error) << "Remote autoconf support not compiled in." << LogEnd; #endif ; break;} case 152: #line 825 "ClntParser.y" { Log(Debug) << "Obeying Router Advertisement (M, O) bits." << LogEnd; CfgMgr->obeyRaBits(true); ; break;} case 153: #line 832 "ClntParser.y" { Log(Debug) << "CONFIRM support disabled (skip-confirm in client.conf)." << LogEnd; ParserOptStack.getLast()->setConfirm(false); ; break;} case 154: #line 839 "ClntParser.y" { Log(Debug) << "Reconfigure accept " << ((yyvsp[0].ival>0)?"enabled":"disabled") << "." << LogEnd; CfgMgr->setReconfigure(yyvsp[0].ival); ; break;} case 155: #line 846 "ClntParser.y" { if (!strcasecmp(yyvsp[0].strval,"tcp")) CfgMgr->setDDNSProtocol(TCfgMgr::DNSUPDATE_TCP); else if (!strcasecmp(yyvsp[0].strval,"udp")) CfgMgr->setDDNSProtocol(TCfgMgr::DNSUPDATE_UDP); else if (!strcasecmp(yyvsp[0].strval,"any")) CfgMgr->setDDNSProtocol(TCfgMgr::DNSUPDATE_ANY); else { Log(Crit) << "Invalid ddns-protocol specifed:" << (yyvsp[0].strval) << ", supported values are tcp, udp, any." << LogEnd; YYABORT; } Log(Debug) << "DDNS: Setting protocol to " << (yyvsp[0].strval) << LogEnd; ; break;} case 156: #line 863 "ClntParser.y" { Log(Debug) << "DDNS: Setting timeout to " << yyvsp[0].ival << "ms." << LogEnd; CfgMgr->setDDNSTimeout(yyvsp[0].ival); ; break;} case 157: #line 871 "ClntParser.y" { ParserOptStack.getLast()->setValid(yyvsp[0].ival); ; break;} case 158: #line 878 "ClntParser.y" { ParserOptStack.getLast()->setT1(yyvsp[0].ival); ; break;} case 159: #line 885 "ClntParser.y" { ParserOptStack.getLast()->setT2(yyvsp[0].ival); ; break;} case 160: #line 892 "ClntParser.y" { Log(Debug) << "Prefix delegation option (no parameters) found." << LogEnd; if (!StartPDDeclaration()) { YYABORT; } EndPDDeclaration(); ; break;} case 161: #line 900 "ClntParser.y" { Log(Debug) << "Prefix delegation option (empty scope) found." << LogEnd; if (!StartPDDeclaration()) { YYABORT; } EndPDDeclaration(); ; break;} case 162: #line 908 "ClntParser.y" { Log(Debug) << "Prefix delegation option (with scope) found." << LogEnd; if (!StartPDDeclaration()) { YYABORT; } ; break;} case 163: #line 915 "ClntParser.y" { EndPDDeclaration(); ; break;} case 164: #line 919 "ClntParser.y" { Log(Debug) << "Prefix delegation option (with IAID set to " << yyvsp[0].ival << " found." << LogEnd; if (!StartPDDeclaration()) { YYABORT; } EndPDDeclaration(); ClntCfgPDLst.getLast()->setIAID(yyvsp[0].ival); ; break;} case 165: #line 928 "ClntParser.y" { if (!StartPDDeclaration()) { YYABORT; } this->iaid = yyvsp[-1].ival; ; break;} case 166: #line 935 "ClntParser.y" { EndPDDeclaration(); ClntCfgPDLst.getLast()->setIAID(yyvsp[-4].ival); ; break;} case 172: #line 956 "ClntParser.y" { SPtr addr = new TIPv6Addr(yyvsp[-2].addrval); SPtr prefix = new TClntCfgPrefix(addr, (yyvsp[0].ival)); PrefixLst.append(prefix); Log(Debug) << "PD: Adding single prefix " << addr->getPlain() << "/" << (yyvsp[0].ival) << "." << LogEnd; ; break;} case 173: #line 963 "ClntParser.y" { Log(Debug) << "PD: Adding single prefix." << LogEnd; SPtr prefix = new TClntCfgPrefix(new TIPv6Addr("::",true), 0); PrefixLst.append(prefix); ; break;} case 174: #line 970 "ClntParser.y" { Log(Debug) << "PD: Adding single prefix." << LogEnd; SPtr prefix = new TClntCfgPrefix(new TIPv6Addr("::",true), 0); PrefixLst.append(prefix); ; break;} case 175: #line 977 "ClntParser.y" { ; break;} case 176: #line 980 "ClntParser.y" { Log(Debug) << "PD: Adding single (any) prefix." << LogEnd; SPtr prefix = new TClntCfgPrefix(new TIPv6Addr("::",true), 0); prefix->setOptions(ParserOptStack.getLast()); PrefixLst.append(prefix); ; break;} case 177: #line 988 "ClntParser.y" { SPtr addr = new TIPv6Addr(yyvsp[-3].addrval); SPtr prefix = new TClntCfgPrefix(addr, (yyvsp[-1].ival)); PrefixLst.append(prefix); Log(Debug) << "PD: Adding single prefix " << addr->getPlain() << "/" << (yyvsp[-1].ival) << "." << LogEnd; ; break;} case 178: #line 995 "ClntParser.y" { PrefixLst.getLast()->setOptions(ParserOptStack.getLast()); ; break;} case 183: #line 1012 "ClntParser.y" { switch(yyvsp[0].ival) { case 0: ParserOptStack.getLast()->setUnicast(false); break; case 1: ParserOptStack.getLast()->setUnicast(true); break; default: Log(Error) << "Invalid parameter (" << yyvsp[0].ival << ") passed to unicast in line " << Lex_->YYText() << "." << LogEnd; return 1; } ; break;} case 184: #line 1030 "ClntParser.y" { switch(yyvsp[0].ival) { case 0: ClntCfgIfaceLst.getLast()->setRouting(false); break; case 1: ClntCfgIfaceLst.getLast()->setRouting(true); break; default: Log(Error) << "Invalid parameter (" << yyvsp[0].ival << ") passed to routing in line " << Lex_->YYText() << "." << LogEnd; return 1; } ; break;} case 185: #line 1047 "ClntParser.y" { PresentStationLst.append(SPtr (new THostID(new TIPv6Addr(yyvsp[0].addrval)))); ; break;} case 186: #line 1051 "ClntParser.y" { PresentStationLst.append(SPtr (new THostID(new TDUID(yyvsp[0].duidval.duid,yyvsp[0].duidval.length)))); ; break;} case 187: #line 1055 "ClntParser.y" { PresentStationLst.append(SPtr (new THostID(new TIPv6Addr(yyvsp[0].addrval)))); ; break;} case 188: #line 1059 "ClntParser.y" { PresentStationLst.append(SPtr (new THostID( new TDUID(yyvsp[0].duidval.duid,yyvsp[0].duidval.length)))); ; break;} case 189: #line 1065 "ClntParser.y" {PresentAddrLst.append(SPtr (new TIPv6Addr(yyvsp[0].addrval)));; break;} case 190: #line 1066 "ClntParser.y" {PresentAddrLst.append(SPtr (new TIPv6Addr(yyvsp[0].addrval)));; break;} case 191: #line 1070 "ClntParser.y" { PresentStringLst.append(SPtr (new string(yyvsp[0].strval))); ; break;} case 192: #line 1071 "ClntParser.y" { PresentStringLst.append(SPtr (new string(yyvsp[0].strval))); ; break;} case 193: #line 1074 "ClntParser.y" {yyval.ival=yyvsp[0].ival;; break;} case 194: #line 1075 "ClntParser.y" {yyval.ival=yyvsp[0].ival;; break;} case 195: #line 1083 "ClntParser.y" { PresentAddrLst.clear(); // PresentAddrLst.append(SPtr (new TIPv6Addr())); ParserOptStack.getLast()->setDNSServerLst(&PresentAddrLst); ; break;} case 196: #line 1089 "ClntParser.y" { PresentAddrLst.clear(); ; break;} case 197: #line 1092 "ClntParser.y" { ParserOptStack.getLast()->setDNSServerLst(&PresentAddrLst); ; break;} case 198: #line 1102 "ClntParser.y" { PresentStringLst.clear(); ParserOptStack.getLast()->setDomainLst(&PresentStringLst); ; break;} case 199: #line 1106 "ClntParser.y" { PresentStringLst.clear(); ; break;} case 200: #line 1109 "ClntParser.y" { ParserOptStack.getLast()->setDomainLst(&PresentStringLst); ; break;} case 201: #line 1119 "ClntParser.y" { PresentAddrLst.clear(); // PresentAddrLst.append(SPtr (new TIPv6Addr())); ParserOptStack.getLast()->setNTPServerLst(&PresentAddrLst); ; break;} case 202: #line 1124 "ClntParser.y" { PresentAddrLst.clear(); ; break;} case 203: #line 1127 "ClntParser.y" { ParserOptStack.getLast()->setNTPServerLst(&PresentAddrLst); ; break;} case 204: #line 1137 "ClntParser.y" { ParserOptStack.getLast()->setTimezone(string("")); ; break;} case 205: #line 1141 "ClntParser.y" { ParserOptStack.getLast()->setTimezone(yyvsp[0].strval); ; break;} case 206: #line 1151 "ClntParser.y" { PresentAddrLst.clear(); // PresentAddrLst.append(SPtr (new TIPv6Addr())); ParserOptStack.getLast()->setSIPServerLst(&PresentAddrLst); ; break;} case 207: #line 1156 "ClntParser.y" { PresentAddrLst.clear(); ; break;} case 208: #line 1159 "ClntParser.y" { ParserOptStack.getLast()->setSIPServerLst(&PresentAddrLst); ; break;} case 209: #line 1169 "ClntParser.y" { PresentStringLst.clear(); ParserOptStack.getLast()->setSIPDomainLst(&PresentStringLst); ; break;} case 210: #line 1173 "ClntParser.y" { PresentStringLst.clear(); ; break;} case 211: #line 1176 "ClntParser.y" { ParserOptStack.getLast()->setSIPDomainLst(&PresentStringLst); ; break;} case 212: #line 1186 "ClntParser.y" { char hostname[255]; if (get_hostname(hostname, 255) == LOWLEVEL_NO_ERROR) { ParserOptStack.getLast()->setFQDN(string(hostname)); } else { ParserOptStack.getLast()->setFQDN(string("")); } ; break;} case 213: #line 1195 "ClntParser.y" { ParserOptStack.getLast()->setFQDN(yyvsp[0].strval); ; break;} case 214: #line 1202 "ClntParser.y" { if (yyvsp[0].ival!=0 && yyvsp[0].ival!=1) { Log(Crit) << "Invalid FQDN S bit value: " << yyvsp[0].ival << ", expected 0 or 1." << LogEnd; YYABORT; } Log(Info) << "Setting FQDN S bit to " << yyvsp[0].ival << LogEnd; ParserOptStack.getLast()->setFQDNFlagS(yyvsp[0].ival); ; break;} case 215: #line 1217 "ClntParser.y" { PresentAddrLst.clear(); // PresentAddrLst.append(SPtr (new TIPv6Addr())); ParserOptStack.getLast()->setNISServerLst(&PresentAddrLst); ; break;} case 216: #line 1222 "ClntParser.y" { PresentAddrLst.clear(); ; break;} case 217: #line 1225 "ClntParser.y" { ParserOptStack.getLast()->setNISServerLst(&PresentAddrLst); ; break;} case 218: #line 1235 "ClntParser.y" { PresentAddrLst.clear(); // PresentAddrLst.append(SPtr (new TIPv6Addr())); ParserOptStack.getLast()->setNISPServerLst(&PresentAddrLst); ; break;} case 219: #line 1240 "ClntParser.y" { PresentAddrLst.clear(); ; break;} case 220: #line 1243 "ClntParser.y" { ParserOptStack.getLast()->setNISPServerLst(&PresentAddrLst); ; break;} case 221: #line 1253 "ClntParser.y" { ParserOptStack.getLast()->setNISDomain(""); ; break;} case 222: #line 1257 "ClntParser.y" { ParserOptStack.getLast()->setNISDomain(yyvsp[0].strval); ; break;} case 223: #line 1268 "ClntParser.y" { ParserOptStack.getLast()->setNISPDomain(""); ; break;} case 224: #line 1272 "ClntParser.y" { ParserOptStack.getLast()->setNISPDomain(yyvsp[0].strval); ; break;} case 225: #line 1282 "ClntParser.y" { if (ParserOptStack.getLast()->getStateful()) { Log(Crit) << "Information refresh time (lifetime) option can only be used in stateless mode." << LogEnd; YYABORT; } ParserOptStack.getLast()->setLifetime(); ; break;} case 226: #line 1293 "ClntParser.y" { Log(Debug) << "VendorSpec defined (no details)." << LogEnd; ParserOptStack.getLast()->setVendorSpec(); ; break;} case 227: #line 1298 "ClntParser.y" { ParserOptStack.getLast()->setVendorSpec(); Log(Debug) << "VendorSpec defined (multiple times)." << LogEnd; ; break;} case 228: #line 1305 "ClntParser.y" { VendorSpec.append( new TOptVendorSpecInfo(OPTION_VENDOR_OPTS, yyvsp[0].ival,0,0,0,0) ); ; break;} case 229: #line 1306 "ClntParser.y" { VendorSpec.append( new TOptVendorSpecInfo(OPTION_VENDOR_OPTS, yyvsp[-2].ival,yyvsp[0].ival,0,0,0) ); ; break;} case 230: #line 1307 "ClntParser.y" { VendorSpec.append( new TOptVendorSpecInfo(OPTION_VENDOR_OPTS, yyvsp[0].ival,0,0,0,0) ); ; break;} case 231: #line 1308 "ClntParser.y" { VendorSpec.append( new TOptVendorSpecInfo(OPTION_VENDOR_OPTS, yyvsp[-2].ival,yyvsp[0].ival,0,0,0) ); ; break;} case 232: #line 1313 "ClntParser.y" { ClntCfgIfaceLst.getLast()->addExtraOption(OPTION_AFTR_NAME, TOpt::Layout_String, false); ; break;} case 233: #line 1320 "ClntParser.y" { // option 123 hex 0x1234abcd SPtr opt = new TOptGeneric(yyvsp[-2].ival, yyvsp[0].duidval.duid, yyvsp[0].duidval.length, 0); ClntCfgIfaceLst.getLast()->addExtraOption(opt, TOpt::Layout_Duid, true); Log(Debug) << "Will send option " << yyvsp[-2].ival << " (hex data, len" << yyvsp[0].duidval.length << ")" << LogEnd; ; break;} case 234: #line 1327 "ClntParser.y" { // option 123 address 2001:db8::1 SPtr addr(new TIPv6Addr(yyvsp[0].addrval)); SPtr opt = new TOptAddr(yyvsp[-2].ival, addr, 0); ClntCfgIfaceLst.getLast()->addExtraOption(opt, TOpt::Layout_Addr, true); Log(Debug) << "Will send option " << yyvsp[-2].ival << " (address " << addr->getPlain() << ")" << LogEnd; ; break;} case 235: #line 1336 "ClntParser.y" { // option 123 address-list 2001:db8::1,2001:db8::cafe PresentAddrLst.clear(); ; break;} case 236: #line 1340 "ClntParser.y" { SPtr opt = new TOptAddrLst(yyvsp[-3].ival, PresentAddrLst, 0); ClntCfgIfaceLst.getLast()->addExtraOption(opt, TOpt::Layout_AddrLst, true); Log(Debug) << "Will send option " << yyvsp[-3].ival << " (address list, containing " << PresentAddrLst.count() << " addresses)." << LogEnd; ; break;} case 237: #line 1347 "ClntParser.y" { // option 123 string "foobar" SPtr opt = new TOptString(yyvsp[-2].ival, string(yyvsp[0].strval), 0); ClntCfgIfaceLst.getLast()->addExtraOption(opt, TOpt::Layout_String, true); Log(Debug) << "Will send option " << yyvsp[-2].ival << " (string " << yyvsp[0].strval << ")" << LogEnd; ; break;} case 238: #line 1354 "ClntParser.y" { // just request option 123 and interpret responses as hex Log(Debug) << "Will request option " << yyvsp[-1].ival << " and iterpret response as hex." << LogEnd; ClntCfgIfaceLst.getLast()->addExtraOption(yyvsp[-1].ival, TOpt::Layout_Duid, false); ; break;} case 239: #line 1360 "ClntParser.y" { // just request this option and expect OptAddr layout Log(Debug) << "Will request option " << yyvsp[-1].ival << " and interpret response as IPv6 address." << LogEnd; ClntCfgIfaceLst.getLast()->addExtraOption(yyvsp[-1].ival, TOpt::Layout_Addr, false); ; break;} case 240: #line 1367 "ClntParser.y" { // just request this option and expect OptString layout Log(Debug) << "Will request option " << yyvsp[-1].ival << " and interpret response as a string." << LogEnd; ClntCfgIfaceLst.getLast()->addExtraOption(yyvsp[-1].ival, TOpt::Layout_String, false); ; break;} case 241: #line 1373 "ClntParser.y" { // just request this option and expect OptAddrLst layout Log(Debug) << "Will request option " << yyvsp[-1].ival << " and interpret response as an address list." << LogEnd; ClntCfgIfaceLst.getLast()->addExtraOption(yyvsp[-1].ival, TOpt::Layout_AddrLst, false); ; break;} } #line 840 "../bison++/bison.cc" /* the action file gets copied in in place of this dollarsign */ yyvsp -= yylen; yyssp -= yylen; #ifdef YY_ClntParser_LSP_NEEDED yylsp -= yylen; #endif #if YY_ClntParser_DEBUG != 0 if (YY_ClntParser_DEBUG_FLAG) { short *ssp1 = yyss - 1; fprintf (stderr, "state stack now"); while (ssp1 != yyssp) fprintf (stderr, " %d", *++ssp1); fprintf (stderr, "\n"); } #endif *++yyvsp = yyval; #ifdef YY_ClntParser_LSP_NEEDED yylsp++; if (yylen == 0) { yylsp->first_line = YY_ClntParser_LLOC.first_line; yylsp->first_column = YY_ClntParser_LLOC.first_column; yylsp->last_line = (yylsp-1)->last_line; yylsp->last_column = (yylsp-1)->last_column; yylsp->text = 0; } else { yylsp->last_line = (yylsp+yylen-1)->last_line; yylsp->last_column = (yylsp+yylen-1)->last_column; } #endif /* Now "shift" the result of the reduction. Determine what state that goes to, based on the state we popped back to and the rule number reduced by. */ yyn = yyr1[yyn]; yystate = yypgoto[yyn - YYNTBASE] + *yyssp; if (yystate >= 0 && yystate <= YYLAST && yycheck[yystate] == *yyssp) yystate = yytable[yystate]; else yystate = yydefgoto[yyn - YYNTBASE]; YYGOTO(yynewstate); YYLABEL(yyerrlab) /* here on detecting error */ if (! yyerrstatus) /* If not already recovering from an error, report this error. */ { ++YY_ClntParser_NERRS; #ifdef YY_ClntParser_ERROR_VERBOSE yyn = yypact[yystate]; if (yyn > YYFLAG && yyn < YYLAST) { int size = 0; char *msg; int x, count; count = 0; /* Start X at -yyn if nec to avoid negative indexes in yycheck. */ for (x = (yyn < 0 ? -yyn : 0); x < (sizeof(yytname) / sizeof(char *)); x++) if (yycheck[x + yyn] == x) size += strlen(yytname[x]) + 15, count++; msg = (char *) malloc(size + 15); if (msg != 0) { strcpy(msg, "parse error"); if (count < 5) { count = 0; for (x = (yyn < 0 ? -yyn : 0); x < (sizeof(yytname) / sizeof(char *)); x++) if (yycheck[x + yyn] == x) { strcat(msg, count == 0 ? ", expecting `" : " or `"); strcat(msg, yytname[x]); strcat(msg, "'"); count++; } } YY_ClntParser_ERROR(msg); free(msg); } else YY_ClntParser_ERROR ("parse error; also virtual memory exceeded"); } else #endif /* YY_ClntParser_ERROR_VERBOSE */ YY_ClntParser_ERROR((char*)"parse error"); } YYGOTO(yyerrlab1); YYLABEL(yyerrlab1) /* here on error raised explicitly by an action */ if (yyerrstatus == 3) { /* if just tried and failed to reuse lookahead token after an error, discard it. */ /* return failure if at end of input */ if (YY_ClntParser_CHAR == YYEOF) YYABORT; #if YY_ClntParser_DEBUG != 0 if (YY_ClntParser_DEBUG_FLAG) fprintf(stderr, "Discarding token %d (%s).\n", YY_ClntParser_CHAR, yytname[yychar1]); #endif YY_ClntParser_CHAR = YYEMPTY; } /* Else will try to reuse lookahead token after shifting the error token. */ yyerrstatus = 3; /* Each real token shifted decrements this */ YYGOTO(yyerrhandle); YYLABEL(yyerrdefault) /* current state does not do anything special for the error token. */ #if 0 /* This is wrong; only states that explicitly want error tokens should shift them. */ yyn = yydefact[yystate]; /* If its default is to accept any token, ok. Otherwise pop it.*/ if (yyn) YYGOTO(yydefault); #endif YYLABEL(yyerrpop) /* pop the current state because it cannot handle the error token */ if (yyssp == yyss) YYABORT; yyvsp--; yystate = *--yyssp; #ifdef YY_ClntParser_LSP_NEEDED yylsp--; #endif #if YY_ClntParser_DEBUG != 0 if (YY_ClntParser_DEBUG_FLAG) { short *ssp1 = yyss - 1; fprintf (stderr, "Error: state stack now"); while (ssp1 != yyssp) fprintf (stderr, " %d", *++ssp1); fprintf (stderr, "\n"); } #endif YYLABEL(yyerrhandle) yyn = yypact[yystate]; if (yyn == YYFLAG) YYGOTO(yyerrdefault); yyn += YYTERROR; if (yyn < 0 || yyn > YYLAST || yycheck[yyn] != YYTERROR) YYGOTO(yyerrdefault); yyn = yytable[yyn]; if (yyn < 0) { if (yyn == YYFLAG) YYGOTO(yyerrpop); yyn = -yyn; YYGOTO(yyreduce); } else if (yyn == 0) YYGOTO(yyerrpop); if (yyn == YYFINAL) YYACCEPT; #if YY_ClntParser_DEBUG != 0 if (YY_ClntParser_DEBUG_FLAG) fprintf(stderr, "Shifting error token, "); #endif *++yyvsp = YY_ClntParser_LVAL; #ifdef YY_ClntParser_LSP_NEEDED *++yylsp = YY_ClntParser_LLOC; #endif yystate = yyn; YYGOTO(yynewstate); /* end loop, in which YYGOTO may be used. */ YYENDGOTO } /* END */ #line 1039 "../bison++/bison.cc" #line 1380 "ClntParser.y" ///////////////////////////////////////////////////////////////////////////// // programs section ///////////////////////////////////////////////////////////////////////////// /** * method check whether interface with id=ifaceNr has been * already declared. * * @param ifindex interface index of the checked interface * * @return true if not declared. */ bool ClntParser::IfaceDefined(int ifindex) { SPtr ptr; ClntCfgIfaceLst.first(); while (ptr=ClntCfgIfaceLst.get()) { if ((ptr->getID())==ifindex) { Log(Crit) << "Interface with ifindex=" << ifindex << " is already defined." << LogEnd; return false; } } return true; } //method check whether interface with id=ifaceName has been //already declared /** * method check whether interface with specified name has been * already declared. * * @param ifaceName name of the checked interface * * @return true if not declared. */ bool ClntParser::IfaceDefined(const std::string& ifaceName) { SPtr ptr; ClntCfgIfaceLst.first(); while (ptr=ClntCfgIfaceLst.get()) { if (ptr->getName()==ifaceName) { Log(Crit) << "Interface " << ifaceName << " is already defined." << LogEnd; return false; } }; return true; } /** * creates new scope appropriately for interface options and declarations * clears all lists except the list of interfaces and adds new group */ bool ClntParser::StartIfaceDeclaration(const std::string& ifaceName) { if (!IfaceDefined(ifaceName)) return false; ClntCfgIfaceLst.append(new TClntCfgIface(ifaceName)); //Interface scope, so parameters associated with global scope are pushed on stack ParserOptStack.append(new TClntParsGlobalOpt(*ParserOptStack.getLast())); ClntCfgIALst.clear(); ClntCfgAddrLst.clear(); this->VendorSpec.clear(); return true; } /** * creates new scope appropriately for interface options and declarations * clears all lists except the list of interfaces and adds new group */ bool ClntParser::StartIfaceDeclaration(int ifindex) { if (!IfaceDefined(ifindex)) return false; ClntCfgIfaceLst.append(new TClntCfgIface(ifindex)); //Interface scope, so parameters associated with global scope are pushed on stack ParserOptStack.append(new TClntParsGlobalOpt(*ParserOptStack.getLast())); ClntCfgIALst.clear(); ClntCfgAddrLst.clear(); this->VendorSpec.clear(); return true; } bool ClntParser::EndIfaceDeclaration() { SPtr iface = ClntCfgIfaceLst.getLast(); if (!iface) { Log(Crit) << "Internal error: Interface not found. Something is wrong. Very wrong." << LogEnd; return false; } // set interface options on the basis of just read information // preferred-server and rejected-servers are also copied here if (VendorSpec.count()) ParserOptStack.getLast()->setVendorSpec(VendorSpec); iface->setOptions(ParserOptStack.getLast()); iface->setOnLinkPrefixLength(ParserOptStack.getLast()->getOnLinkPrefixLength()); if ( (iface->stateless()) && (ClntCfgIALst.count()) ) { Log(Crit) << "Interface " << iface->getFullName() << " is configured stateless, " " but has " << ClntCfgIALst.count() << " IA(s) defined." << LogEnd; return false; } if ( (iface->stateless()) && (ClntCfgTALst.count()) ) { Log(Crit) << "Interface " << iface->getFullName() << " is configured stateless, " " but has TA defined." << LogEnd; return false; } // add all IAs to the interface SPtr ia; ClntCfgIALst.first(); while (ia=ClntCfgIALst.get()) { ClntCfgIfaceLst.getLast()->addIA(ia); } //add all TAs to the interface SPtr ptrTA; ClntCfgTALst.first(); while ( ptrTA = ClntCfgTALst.get() ) { iface->addTA(ptrTA); } //add all PDs to the interface SPtr pd; ClntCfgPDLst.first(); while (pd = ClntCfgPDLst.get() ) { iface->addPD(pd); } //restore global options ParserOptStack.delLast(); ClntCfgIALst.clear(); return true; } void ClntParser::EmptyIface() { //set iface options on the basis of recent information ClntCfgIfaceLst.getLast()->setOptions(ParserOptStack.getLast()); //add one IA with one address to this iface EmptyIA(); ClntCfgIALst.getLast()->setOptions(ParserOptStack.getLast()); ClntCfgIfaceLst.getLast()->addIA(ClntCfgIALst.getLast()); } /// method creates new scope appropriately for interface options and declarations /// clears list of addresses /// /// @param aggregation - does this IA contains suboptions ( ia { ... } ) /// @return true if creation was successful bool ClntParser::StartIADeclaration(bool aggregation) { if (!ParserOptStack.getLast()->getStateful()) { Log(Crit) << "Attempted to use IA (stateful option) in stateless mode." << LogEnd; return (false); } ParserOptStack.append(new TClntParsGlobalOpt(*ParserOptStack.getLast())); ParserOptStack.getLast()->setAddrHint(!aggregation); ClntCfgAddrLst.clear(); return (true); } /** * Inbelivable piece of crap code. If you read this, rewrite this code immediately. * */ void ClntParser::EndIADeclaration() { if(!ClntCfgAddrLst.count()) { EmptyIA(); } else { SPtr ia = new TClntCfgIA(); ClntCfgIALst.append(ia); SPtr ptr; ClntCfgAddrLst.first(); while(ptr=ClntCfgAddrLst.get()) ia->addAddr(ptr); } //set proper options specific for this IA ClntCfgIALst.getLast()->setOptions(ParserOptStack.getLast()); ClntCfgAddrLst.clear(); ParserOptStack.delLast(); //this IA matches with previous ones and can be grouped with them //so it's should be left on the list and be appended with them to present list } /// @brief creates PD context /// /// @return true if initialization was successful bool ClntParser::StartPDDeclaration() { if (!ParserOptStack.getLast()->getStateful()) { Log(Crit) << "Attempted to use PD (stateful option) in stateless mode." << LogEnd; return (false); } ParserOptStack.append(new TClntParsGlobalOpt(*ParserOptStack.getLast())); ClntCfgAddrLst.clear(); PrefixLst.clear(); return (true); } bool ClntParser::EndPDDeclaration() { SPtr pd = new TClntCfgPD(); pd->setOptions(ParserOptStack.getLast()); // copy all defined prefixes PrefixLst.first(); SPtr prefix; while (prefix = PrefixLst.get()) { pd->addPrefix(prefix); } PrefixLst.clear(); ClntCfgPDLst.append(pd); ParserOptStack.delLast(); return true; } /** * method adds 1 IA object (containing 1 address) to the ClntCfgIA list. * Both objects' properties are set to last parsed values * */ void ClntParser::EmptyIA() { EmptyAddr(); ClntCfgIALst.append(new TClntCfgIA()); ClntCfgIALst.getLast()->setOptions(ParserOptStack.getLast()); // Commented out: by default sent empty IA, without any addresses // ClntCfgIALst.getLast()->addAddr(ClntCfgAddrLst.getLast()); } /** * method adds empty address to the ClntCfgAddrList list and sets * its properties to last parsed values * */ void ClntParser::EmptyAddr() { ClntCfgAddrLst.append(new TClntCfgAddr()); ClntCfgAddrLst.getLast()->setOptions(ParserOptStack.getLast()); } int ClntParser::yylex() { memset(&std::yylval,0, sizeof(std::yylval)); memset(&this->yylval,0, sizeof(this->yylval)); int x = Lex_->yylex(); this->yylval=std::yylval; return x; } /** * This method is called when parsing error is detected. * * @param m - first invalid character */ void ClntParser::yyerror(char *m) { Log(Crit) << "Config parse error: line " << Lex_->lineno() << ", unexpected [" << Lex_->YYText() << "] token." << LogEnd; } /** * Desctructor. Just cleans things up * */ ClntParser::~ClntParser() { this->ClntCfgIfaceLst.clear(); this->ClntCfgIALst.clear(); this->ClntCfgTALst.clear(); this->ClntCfgAddrLst.clear(); } dibbler-1.0.1/ClntCfgMgr/ClntCfgTA.h0000664000175000017500000000116612233256142013747 00000000000000/* * Dibbler - a portable DHCPv6 * * authors: Tomasz Mrugalski * Marek Senderski * * released under GNU GPL v2 licence * */ #ifndef CLNTCFGTA_H #define CLNTCFGTA_H #include "ClntParsGlobalOpt.h" #include "DHCPConst.h" #include #include class TClntCfgTA { friend std::ostream& operator<<(std::ostream& out,TClntCfgTA& ta); public: TClntCfgTA(); unsigned long getIAID(); void setIAID(unsigned long iaid); void setState(enum EState state); enum EState getState(); private: unsigned long iaid; EState State; }; #endif dibbler-1.0.1/ClntCfgMgr/ClntParsAddrOpt.h0000664000175000017500000000107412233256142015204 00000000000000/* * Dibbler - a portable DHCPv6 * * authors: Tomasz Mrugalski * Marek Senderski * * Released under GNU GPL v2 licence * * $Id: ClntParsAddrOpt.h,v 1.2 2004-10-25 20:45:52 thomson Exp $ * * $Log: not supported by cvs2svn $ */ #ifndef CLNTPARSADDROPT_H #define CLNTPARSADDROPT_H #include "DHCPConst.h" class TClntParsAddrOpt { public: TClntParsAddrOpt(); long getPref(); void setPref(long pref); long getValid(); void setValid(long valid); private: long Pref; long Valid; }; #endif dibbler-1.0.1/ClntCfgMgr/ClntParser.y0000644000175000017500000013230512556513041014300 00000000000000%name ClntParser %header{ #include #include #include #include #include "DHCPConst.h" #include "SmartPtr.h" #include "Container.h" #include "ClntParser.h" #include "ClntParsGlobalOpt.h" #include "ClntCfgIface.h" #include "ClntCfgAddr.h" #include "ClntCfgIA.h" #include "ClntCfgTA.h" #include "ClntCfgPD.h" #include "ClntCfgMgr.h" #include "Logger.h" #include "OptGeneric.h" #include "OptAddr.h" #include "OptAddrLst.h" #include "OptString.h" using namespace std; #define YY_USE_CLASS %} %{ #include "FlexLexer.h" %} // --- CLASS MEMBERS --- %define MEMBERS yyFlexLexer * Lex_; \ /*List of options in scope stack,the most fresh is last in the list*/ \ List(TClntParsGlobalOpt) ParserOptStack; \ /*List of parsed interfaces/IAs/Addresses, last */ \ /*interface/IA/address is just being parsing or have been just parsed*/ \ List(TClntCfgIface) ClntCfgIfaceLst; \ List(TClntCfgIA) ClntCfgIALst; \ List(TClntCfgTA) ClntCfgTALst; \ List(TClntCfgPD) ClntCfgPDLst; \ List(TClntCfgAddr) ClntCfgAddrLst; \ DigestTypesLst DigestLst; \ /*Pointer to list which should contain either rejected servers or */ \ /*preffered servers*/ \ List(THostID) PresentStationLst; \ List(TIPv6Addr) PresentAddrLst; \ List(TClntCfgPrefix) PrefixLst; \ List(std::string) PresentStringLst; \ List(TOptVendorSpecInfo) VendorSpec; \ bool IfaceDefined(int ifaceNr); \ bool IfaceDefined(const std::string& ifaceName); \ bool StartIfaceDeclaration(const std::string& ifaceName); \ bool StartIfaceDeclaration(int ifindex); \ bool EndIfaceDeclaration(); \ void EmptyIface(); \ bool StartIADeclaration(bool aggregation); \ void EndIADeclaration(); \ bool StartPDDeclaration(); \ bool EndPDDeclaration(); \ void EmptyIA(); \ void EmptyAddr(); \ TClntCfgMgr * CfgMgr; \ bool iaidSet; \ unsigned int iaid; \ unsigned int AddrCount_; \ virtual ~ClntParser(); \ EDUIDType DUIDType; \ int DUIDEnterpriseNumber; \ SPtr DUIDEnterpriseID; %define CONSTRUCTOR_PARAM yyFlexLexer * lex %define CONSTRUCTOR_CODE \ Lex_ = lex; \ ParserOptStack.append(new TClntParsGlobalOpt()); \ ParserOptStack.getFirst()->setIAIDCnt(1); \ ParserOptStack.getLast(); \ DUIDType = DUID_TYPE_NOT_DEFINED; \ DUIDEnterpriseID.reset(); \ AddrCount_ = 0; \ CfgMgr = 0; \ iaidSet = false; \ iaid = 0xffffffff; \ DUIDEnterpriseNumber = -1; \ yynerrs = 0; \ yychar = 0; %union { int ival; char *strval; struct SDuid { int length; char* duid; } duidval; char addrval[16]; } %{ namespace std { extern yy_ClntParser_stype yylval; } %} %token T1_,T2_,PREF_TIME_,DNS_SERVER_,VALID_TIME_, UNICAST_ %token NTP_SERVER_, DOMAIN_, TIME_ZONE_, SIP_SERVER_, SIP_DOMAIN_ %token NIS_SERVER_, NISP_SERVER_, NIS_DOMAIN_, NISP_DOMAIN_ %token FQDN_, FQDN_S_, DDNS_PROTOCOL_, DDNS_TIMEOUT_ %token LIFETIME_, VENDOR_SPEC_ %token IFACE_,NO_CONFIG_,REJECT_SERVERS_,PREFERRED_SERVERS_ %token IA_,TA_,IAID_,ADDRESS_KEYWORD_, NAME_, IPV6ADDR_,WORKDIR_, RAPID_COMMIT_ %token OPTION_, SCRIPT_ %token LOGNAME_, LOGLEVEL_, LOGMODE_, LOGCOLORS_ %token STRING_ %token HEXNUMBER_ %token INTNUMBER_ %token IPV6ADDR_ %token DUID_ %token STRICT_RFC_NO_ROUTING_ %token SKIP_CONFIRM_, OBEY_RA_BITS_ %token PD_, PREFIX_, DOWNLINK_PREFIX_IFACES_ %token DUID_TYPE_, DUID_TYPE_LLT_, DUID_TYPE_LL_, DUID_TYPE_EN_ %token AUTH_METHODS_, AUTH_PROTOCOL_, AUTH_ALGORITHM_, AUTH_REPLAY_, AUTH_REALM_ %token DIGEST_NONE_, DIGEST_PLAIN_, DIGEST_HMAC_MD5_, DIGEST_HMAC_SHA1_, DIGEST_HMAC_SHA224_ %token DIGEST_HMAC_SHA256_, DIGEST_HMAC_SHA384_, DIGEST_HMAC_SHA512_ %token STATELESS_, ANON_INF_REQUEST_, INSIST_MODE_, INACTIVE_MODE_ %token EXPERIMENTAL_, ADDR_PARAMS_, REMOTE_AUTOCONF_ %token AFTR_ %token ROUTING_, BIND_TO_ADDR_ %token ADDRESS_LIST_KEYWORD_, STRING_KEYWORD_, DUID_KEYWORD_, HEX_KEYWORD_ %token RECONFIGURE_ %type Number %% ///////////////////////////////////////////////////////////////////////////// // rules section ///////////////////////////////////////////////////////////////////////////// Grammar : GlobalDeclarationList | ; GlobalDeclarationList : GlobalOptionDeclaration | InterfaceDeclaration | GlobalDeclarationList GlobalOptionDeclaration | GlobalDeclarationList InterfaceDeclaration ; GlobalOptionDeclaration : InterfaceOptionDeclaration | LogModeOption | LogNameOption | LogLevelOption | LogColors | WorkDirOption | DuidTypeOption | StrictRfcNoRoutingOption | ScriptName | DdnsProtocol | DdnsTimeout | AuthAcceptMethods | AuthProtocol | AuthAlgorithm | AuthReplay | AuthRealm | AnonInfRequest | InactiveMode | InsistMode | FQDNBits | Experimental | SkipConfirm | ReconfigureAccept | DownlinkPrefixInterfaces | ObeyRaBits ; InterfaceOptionDeclaration : IAOptionDeclaration | Routing | StatelessMode | UnicastOption | DNSServerOption | DomainOption | NTPServerOption | TimeZoneOption | SIPServerOption | SIPDomainOption | FQDNOption | NISServerOption | NISPServerOption | NISDomainOption | NISPDomainOption | LifetimeOption | VendorSpecOption | DsLiteTunnelOption | RejectServersOption | PreferServersOption | ExtraOption | ExperimentalRemoteAutoconf | BindToAddress ; IAOptionDeclaration : T1Option | T2Option | RapidCommitOption | AddressParameter | ExperimentalAddrParams ; DownlinkPrefixInterfaces : DOWNLINK_PREFIX_IFACES_ { PresentStringLst.clear(); } StringList { CfgMgr->setDownlinkPrefixIfaces(PresentStringLst); } InterfaceDeclaration ///////////////////////////////////////////////////////////////////////////// //Declaration: iface 'eth0' { T1 10 T2 20 ... } ///////////////////////////////////////////////////////////////////////////// :IFACE_ STRING_ '{' { if (!StartIfaceDeclaration($2)) YYABORT; } InterfaceDeclarationsList '}' { delete [] $2; if (!EndIfaceDeclaration()) YYABORT; } ///////////////////////////////////////////////////////////////////////////// //Declaration: iface 5 { T1 10 T2 20 ... } ///////////////////////////////////////////////////////////////////////////// |IFACE_ Number '{' { if (!IfaceDefined($2)) YYABORT; if (!StartIfaceDeclaration($2)) YYABORT; } InterfaceDeclarationsList '}' { if (!EndIfaceDeclaration()) YYABORT; } ///////////////////////////////////////////////////////////////////////////// //Declaration: iface 'eth0' { } ///////////////////////////////////////////////////////////////////////////// |IFACE_ STRING_ '{' '}' { if (!IfaceDefined(string($2))) YYABORT; ClntCfgIfaceLst.append(new TClntCfgIface($2)); delete [] $2; EmptyIface(); } ///////////////////////////////////////////////////////////////////////////// //Declaration: iface 5 { } ///////////////////////////////////////////////////////////////////////////// |IFACE_ Number '{' '}' { if (!IfaceDefined($2)) YYABORT; ClntCfgIfaceLst.append(new TClntCfgIface($2)); EmptyIface(); } ///////////////////////////////////////////////////////////////////////////// //Declaration: iface 'eth0' no-config ///////////////////////////////////////////////////////////////////////////// |IFACE_ STRING_ NO_CONFIG_ { if (!IfaceDefined(string($2))) YYABORT; ClntCfgIfaceLst.append(new TClntCfgIface($2)); ClntCfgIfaceLst.getLast()->setOptions(ParserOptStack.getLast()); ClntCfgIfaceLst.getLast()->setNoConfig(); delete $2; } ///////////////////////////////////////////////////////////////////////////// //Declaration: iface 5 no-config ///////////////////////////////////////////////////////////////////////////// |IFACE_ Number NO_CONFIG_ { if (!IfaceDefined($2)) YYABORT; ClntCfgIfaceLst.append(SPtr (new TClntCfgIface($2)) ); ClntCfgIfaceLst.getLast()->setOptions(ParserOptStack.getLast()); ClntCfgIfaceLst.getLast()->setNoConfig(); } ; //////////////////////////////////////////////////////////////////////////// //Interface specific declarations ////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// InterfaceDeclarationsList : InterfaceOptionDeclaration | InterfaceDeclarationsList InterfaceOptionDeclaration | IADeclaration | InterfaceDeclarationsList IADeclaration | TADeclaration | InterfaceDeclarationsList TADeclaration | PDDeclaration | InterfaceDeclarationsList PDDeclaration ; TADeclaration ///////////////////////////////////////////////////////////////////////////// // TA options ///////////////////////////////////////////////////////////////////////////// :TA_ { if (!ParserOptStack.getLast()->getStateful()) { Log(Crit) << "Attempted to use TA (stateful option) in stateless mode." << LogEnd; YYABORT; } this->ClntCfgTALst.append( new TClntCfgTA() ); // append new TA } |TA_ '{' { if (!ParserOptStack.getLast()->getStateful()) { Log(Crit) << "Attempted to use TA (stateful option) in stateless mode." << LogEnd; YYABORT; } this->ClntCfgTALst.append( new TClntCfgTA() ); // append new TA this->iaidSet = false; } TADeclarationList { if (this->iaidSet) this->ClntCfgTALst.getLast()->setIAID(this->iaid); } '}' |TA_ '{' '}' { if (!ParserOptStack.getLast()->getStateful()) { Log(Crit) << "Attempted to use TA (stateful option) in stateless mode." << LogEnd; YYABORT; } this->ClntCfgTALst.append( new TClntCfgTA() ); // append new TA } ; TADeclarationList :TADeclarationList IAID |IAID ; IAID :IAID_ Number { this->iaidSet = true; this->iaid = $2; Log(Crit) << "IAID=" << this->iaid << " parsed." << LogEnd; } ; IADeclaration ///////////////////////////////////////////////////////////////////////////// // ia { options-inside } ///////////////////////////////////////////////////////////////////////////// :IA_ '{' { if (!StartIADeclaration(false)) { YYABORT; } } IADeclarationList '}' { EndIADeclaration(); } |IA_ Number '{' { if (!StartIADeclaration(false)) { YYABORT; } this->iaid = $2; } IADeclarationList '}' { EndIADeclaration(); Log(Info) << "Setting IAID to " << this->iaid << LogEnd; ClntCfgIALst.getLast()->setIAID(this->iaid); } ///////////////////////////////////////////////////////////////////////////// // ia { } ///////////////////////////////////////////////////////////////////////////// |IA_ '{' '}' { if (!StartIADeclaration(true)) { YYABORT; } EndIADeclaration(); } ///////////////////////////////////////////////////////////////////////////// // ia (1 address is added by default) ///////////////////////////////////////////////////////////////////////////// |IA_ { if (!StartIADeclaration(true)) { YYABORT; } EndIADeclaration(); } |IA_ Number { if (!StartIADeclaration(true)) { YYABORT; } EndIADeclaration(); Log(Info) << "Setting IAID to " << $2 << LogEnd; ClntCfgIALst.getLast()->setIAID($2); } ; IADeclarationList :IAOptionDeclaration |IADeclarationList IAOptionDeclaration |ADDRESDeclaration |IADeclarationList ADDRESDeclaration ; // This covers the following declarations: // 1. address (send an empty address) // 2. address 2001:db8::1 (send this specific address) // 3. address 5 (send 5 addresses) // 4. address { ... } (send an empty address with the following parameters) // 5. address 2001:d8b::1 { ... } (spend specific address with the following parameters) // 6. address 5 { ... } (send 5 addresses with the following parameters) ADDRESDeclaration // 1. address (send an empty address) : ADDRESS_KEYWORD_ { EmptyAddr(); } // 2. address 2001:db8::1 (send this specific address) | ADDRESS_KEYWORD_ IPV6ADDR_ { ClntCfgAddrLst.append(new TClntCfgAddr(new TIPv6Addr($2))); ClntCfgAddrLst.getLast()->setOptions(ParserOptStack.getLast()); } // 3. address 5 (send 5 addresses) |ADDRESS_KEYWORD_ Number { for (int i = 0; i < $2; i++) { EmptyAddr(); } } // 4. address { ... } (send an empty address with the following parameters) | ADDRESS_KEYWORD_ '{' { // Get last context SPtr globalOpt = ParserOptStack.getLast(); // Create new context based on the current one SPtr newOpt = new TClntParsGlobalOpt(*globalOpt); // Add this new context to the contexts stack ParserOptStack.append(newOpt); } AddressParametersList '}' { EmptyAddr(); // Create an empty address ParserOptStack.delLast(); // Delete new context } // 5. address 2001:d8b::1 { ... } (spend specific address with the following parameters) | ADDRESS_KEYWORD_ IPV6ADDR_ '{' { // We need to store just one address, but let's use PresentAddrLst // We'll need that address to create an actual object when the context is closed PresentAddrLst.clear(); PresentAddrLst.append(SPtr (new TIPv6Addr($2))); SPtr globalOpt = ParserOptStack.getLast(); SPtr newOpt = new TClntParsGlobalOpt(*globalOpt); ParserOptStack.append(newOpt); } AddressParametersList '}' { ClntCfgAddrLst.append(new TClntCfgAddr(PresentAddrLst.getLast())); ClntCfgAddrLst.getLast()->setOptions(ParserOptStack.getLast()); if (ParserOptStack.count()) ParserOptStack.delLast(); PresentAddrLst.clear(); } // 6. address 5 { ... } (send 5 addresses with the following parameters) |ADDRESS_KEYWORD_ Number '{' { //In this agregated declaration no address hints are allowed ParserOptStack.append(new TClntParsGlobalOpt(*ParserOptStack.getLast())); ParserOptStack.getLast()->setAddrHint(false); AddrCount_ = $2; } AddressParametersList '}' { for (unsigned int i = 0; i < AddrCount_; i++) { EmptyAddr(); ClntCfgAddrLst.getLast()->setOptions(ParserOptStack.getLast()); } ParserOptStack.delLast(); AddrCount_ = 0; } ; AddressParametersList : AddressParameter | AddressParametersList AddressParameter ; AddressParameter : PreferredTimeOption | ValidTimeOption ; LogLevelOption : LOGLEVEL_ Number { if ( ($2<1) || ($2>8) ) { Log(Crit) << "Invalid loglevel specified: " << $2 << ". Allowed range: 1-8." << LogEnd; } logger::setLogLevel($2); } ; LogModeOption : LOGMODE_ STRING_ { logger::setLogMode($2); } LogNameOption : LOGNAME_ STRING_ { logger::setLogName($2); } LogColors : LOGCOLORS_ Number { logger::setColors($2==1); } DuidTypeOption : DUID_TYPE_ DUID_TYPE_LLT_ { this->DUIDType = DUID_TYPE_LLT;} | DUID_TYPE_ DUID_TYPE_LL_ { this->DUIDType = DUID_TYPE_LL; } | DUID_TYPE_ DUID_TYPE_EN_ Number DUID_ { this->DUIDType = DUID_TYPE_EN; this->DUIDEnterpriseNumber = $3; this->DUIDEnterpriseID = new TDUID($4.duid, $4.length); } ; StatelessMode : STATELESS_ { if (!ClntCfgIALst.empty()) { Log(Crit) << "Attempting to enable statelss, but IA (stateful option) is already defined." << LogEnd; YYABORT; } if (!ClntCfgTALst.empty()) { Log(Crit) << "Attempting to enable statelss, but TA (stateful option) is already defined." << LogEnd; YYABORT; } if (!ClntCfgPDLst.empty()) { Log(Crit) << "Attempting to enable statelss, but PD (stateful option) is already defined." << LogEnd; YYABORT; } ParserOptStack.getLast()->setStateful(false); } ; WorkDirOption : WORKDIR_ STRING_ { ParserOptStack.getLast()->setWorkDir($2); } ; StrictRfcNoRoutingOption : STRICT_RFC_NO_ROUTING_ { Log(Warning) << "strict-rfc-no-routing has changed in 1.0.0RC2: it now takes one argument: " << " 0 (address configured with guessed /64 prefix length that may be wrong in " << "some cases; dibbler clients prior to 1.0.0RC2 used this) or 1 (address " << "configured with /128, as RFC specifies); the default has changed in 1.0.0RC2: " << "Dibbler is now RFC conformant." << LogEnd; } | STRICT_RFC_NO_ROUTING_ Number { switch ($2) { case 0: // This is pre 1.0.0RC2 behaviour Log(Warning) << "Strict-rfc-no-routing disabled: addresses will be " << "configured with /64 prefix." << LogEnd; ParserOptStack.getLast()->setOnLinkPrefixLength(64); break; case 1: // The default is now /128 anyway, so this is a no-op Log(Warning) << "Strict-rfc-no-routing enabled (it is the default): " << "addresses will be configured with /128 prefix." << LogEnd; break; default: Log(Crit) << "Invalid parameter passed to strict-rfc-no-routing: " << $2 << ", only 0 or 1" << LogEnd; YYABORT; } } ; ScriptName : SCRIPT_ STRING_ { CfgMgr->setScript($2); } AuthAcceptMethods : AUTH_METHODS_ { DigestLst.clear(); } DigestList { #ifndef MOD_DISABLE_AUTH CfgMgr->setAuthAcceptMethods(DigestLst); DigestLst.clear(); #else Log(Crit) << "Auth support disabled at compilation time." << LogEnd; #endif } AuthProtocol : AUTH_PROTOCOL_ STRING_ { #ifndef MOD_DISABLE_AUTH if (!strcasecmp($2,"none")) { CfgMgr->setAuthProtocol(AUTH_PROTO_NONE); CfgMgr->setAuthAlgorithm(AUTH_ALGORITHM_NONE); } else if (!strcasecmp($2, "delayed")) { CfgMgr->setAuthProtocol(AUTH_PROTO_DELAYED); } else if (!strcasecmp($2, "reconfigure-key")) { CfgMgr->setAuthProtocol(AUTH_PROTO_RECONFIGURE_KEY); CfgMgr->setAuthAlgorithm(AUTH_ALGORITHM_RECONFIGURE_KEY); } else if (!strcasecmp($2, "dibbler")) { CfgMgr->setAuthProtocol(AUTH_PROTO_DIBBLER); } else { Log(Crit) << "Invalid auth-protocol parameter: " << string($2) << LogEnd; YYABORT; } #else Log(Crit) << "Auth support disabled at compilation time." << LogEnd; #endif }; AuthAlgorithm : AUTH_ALGORITHM_ STRING_ { #ifndef MOD_DISABLE_AUTH Log(Crit) << "auth-algorithm selection is not supported yet." << LogEnd; YYABORT; #else Log(Crit) << "Auth support disabled at compilation time." << LogEnd; #endif }; | AuthReplay AuthReplay : AUTH_REPLAY_ STRING_ { #ifndef MOD_DISABLE_AUTH if (strcasecmp($2, "none")) { CfgMgr->setAuthReplay(AUTH_REPLAY_NONE); } else if (strcasecmp($2, "monotonic")) { CfgMgr->setAuthReplay(AUTH_REPLAY_MONOTONIC); } else { Log(Crit) << "Invalid auth-replay parameter: " << string($2) << LogEnd; YYABORT; } #else Log(Crit) << "Auth support disabled at compilation time." << LogEnd; #endif }; AuthRealm : AUTH_REALM_ STRING_ { #ifndef MOD_DISABLE_AUTH CfgMgr->setAuthRealm(std::string($2)); #else Log(Crit) << "Auth support disabled at compilation time." << LogEnd; #endif }; DigestList : Digest | DigestList ',' Digest ; Digest : DIGEST_NONE_ { DigestLst.push_back(DIGEST_NONE); } | DIGEST_PLAIN_ { DigestLst.push_back(DIGEST_PLAIN); } | DIGEST_HMAC_MD5_ { DigestLst.push_back(DIGEST_HMAC_MD5); } | DIGEST_HMAC_SHA1_ { DigestLst.push_back(DIGEST_HMAC_SHA1); } | DIGEST_HMAC_SHA224_ { DigestLst.push_back(DIGEST_HMAC_SHA224); } | DIGEST_HMAC_SHA256_ { DigestLst.push_back(DIGEST_HMAC_SHA256); } | DIGEST_HMAC_SHA384_ { DigestLst.push_back(DIGEST_HMAC_SHA384); } | DIGEST_HMAC_SHA512_ { DigestLst.push_back(DIGEST_HMAC_SHA512); } ; AnonInfRequest : ANON_INF_REQUEST_ { ParserOptStack.getLast()->setAnonInfRequest(true); }; InactiveMode : INACTIVE_MODE_ { ParserOptStack.getLast()->setInactiveMode(true); }; InsistMode : INSIST_MODE_ { ParserOptStack.getLast()->setInsistMode(true); }; Experimental : EXPERIMENTAL_ { Log(Crit) << "Experimental features are allowed." << LogEnd; ParserOptStack.getLast()->setExperimental(); }; RejectServersOption :REJECT_SERVERS_ { //ParserOptStack.getLast()->clearRejedSrv(); PresentStationLst.clear(); } ADDRESDUIDList { ParserOptStack.getLast()->setRejedSrvLst(&PresentStationLst); } ; PreferServersOption :PREFERRED_SERVERS_ { PresentStationLst.clear(); } ADDRESDUIDList{ ParserOptStack.getLast()->setPrefSrvLst(&PresentStationLst); } ; BindToAddress :BIND_TO_ADDR_ IPV6ADDR_ { ClntCfgIfaceLst.getLast()->setBindToAddr(SPtr(new TIPv6Addr($2))); } PreferredTimeOption :PREF_TIME_ Number { ParserOptStack.getLast()->setPref($2); } ; RapidCommitOption : RAPID_COMMIT_ Number { ParserOptStack.getLast()->setRapidCommit($2); } ; ExperimentalAddrParams : ADDR_PARAMS_ { if (!ParserOptStack.getLast()->getExperimental()) { Log(Crit) << "Experimental 'addr-params' defined, but experimental features are disabled." << "Add 'experimental' in global section of client.conf to enable it." << LogEnd; YYABORT; } ParserOptStack.getLast()->setAddrParams(true); }; ExperimentalRemoteAutoconf : REMOTE_AUTOCONF_ { if (!ParserOptStack.getLast()->getExperimental()) { Log(Crit) << "Experimental remote autoconfiguration feature defined, but experimental" " features are disabled. Add 'experimental' in global section of client.conf " "to enable it." << LogEnd; YYABORT; } #ifdef MOD_REMOTE_AUTOCONF CfgMgr->setRemoteAutoconf(true); #else Log(Error) << "Remote autoconf support not compiled in." << LogEnd; #endif }; ObeyRaBits : OBEY_RA_BITS_ { Log(Debug) << "Obeying Router Advertisement (M, O) bits." << LogEnd; CfgMgr->obeyRaBits(true); } SkipConfirm : SKIP_CONFIRM_ { Log(Debug) << "CONFIRM support disabled (skip-confirm in client.conf)." << LogEnd; ParserOptStack.getLast()->setConfirm(false); }; ReconfigureAccept : RECONFIGURE_ Number { Log(Debug) << "Reconfigure accept " << (($2>0)?"enabled":"disabled") << "." << LogEnd; CfgMgr->setReconfigure($2); }; DdnsProtocol :DDNS_PROTOCOL_ STRING_ { if (!strcasecmp($2,"tcp")) CfgMgr->setDDNSProtocol(TCfgMgr::DNSUPDATE_TCP); else if (!strcasecmp($2,"udp")) CfgMgr->setDDNSProtocol(TCfgMgr::DNSUPDATE_UDP); else if (!strcasecmp($2,"any")) CfgMgr->setDDNSProtocol(TCfgMgr::DNSUPDATE_ANY); else { Log(Crit) << "Invalid ddns-protocol specifed:" << ($2) << ", supported values are tcp, udp, any." << LogEnd; YYABORT; } Log(Debug) << "DDNS: Setting protocol to " << ($2) << LogEnd; }; DdnsTimeout :DDNS_TIMEOUT_ Number { Log(Debug) << "DDNS: Setting timeout to " << $2 << "ms." << LogEnd; CfgMgr->setDDNSTimeout($2); } ValidTimeOption :VALID_TIME_ Number { ParserOptStack.getLast()->setValid($2); } ; T1Option :T1_ Number { ParserOptStack.getLast()->setT1($2); } ; T2Option :T2_ Number { ParserOptStack.getLast()->setT2($2); } ; PDDeclaration :PD_ { Log(Debug) << "Prefix delegation option (no parameters) found." << LogEnd; if (!StartPDDeclaration()) { YYABORT; } EndPDDeclaration(); } |PD_ '{' '}' { Log(Debug) << "Prefix delegation option (empty scope) found." << LogEnd; if (!StartPDDeclaration()) { YYABORT; } EndPDDeclaration(); } |PD_ '{' { Log(Debug) << "Prefix delegation option (with scope) found." << LogEnd; if (!StartPDDeclaration()) { YYABORT; } } PDOptionsList '}' { EndPDDeclaration(); } |PD_ Number { Log(Debug) << "Prefix delegation option (with IAID set to " << $2 << " found." << LogEnd; if (!StartPDDeclaration()) { YYABORT; } EndPDDeclaration(); ClntCfgPDLst.getLast()->setIAID($2); } |PD_ Number '{' { if (!StartPDDeclaration()) { YYABORT; } this->iaid = $2; } PDOptionsList '}' { EndPDDeclaration(); ClntCfgPDLst.getLast()->setIAID($2); } ; PDOptionsList : PDOption | PDOptionsList PDOption ; PDOption : Prefix | T1Option | T2Option ; Prefix : PREFIX_ IPV6ADDR_ '/' Number { SPtr addr = new TIPv6Addr($2); SPtr prefix = new TClntCfgPrefix(addr, ($4)); PrefixLst.append(prefix); Log(Debug) << "PD: Adding single prefix " << addr->getPlain() << "/" << ($4) << "." << LogEnd; } | PREFIX_ { Log(Debug) << "PD: Adding single prefix." << LogEnd; SPtr prefix = new TClntCfgPrefix(new TIPv6Addr("::",true), 0); PrefixLst.append(prefix); } | PREFIX_ '{' '}' { Log(Debug) << "PD: Adding single prefix." << LogEnd; SPtr prefix = new TClntCfgPrefix(new TIPv6Addr("::",true), 0); PrefixLst.append(prefix); } | PREFIX_ '{' { } PrefixOptionsList '}' { Log(Debug) << "PD: Adding single (any) prefix." << LogEnd; SPtr prefix = new TClntCfgPrefix(new TIPv6Addr("::",true), 0); prefix->setOptions(ParserOptStack.getLast()); PrefixLst.append(prefix); } | PREFIX_ IPV6ADDR_ '/' Number '{' { SPtr addr = new TIPv6Addr($2); SPtr prefix = new TClntCfgPrefix(addr, ($4)); PrefixLst.append(prefix); Log(Debug) << "PD: Adding single prefix " << addr->getPlain() << "/" << ($4) << "." << LogEnd; } PrefixOptionsList '}' { PrefixLst.getLast()->setOptions(ParserOptStack.getLast()); } ; PrefixOptionsList : PrefixOption | PrefixOptionsList PrefixOption ; PrefixOption : ValidTimeOption | PreferredTimeOption ; UnicastOption :UNICAST_ Number { switch($2) { case 0: ParserOptStack.getLast()->setUnicast(false); break; case 1: ParserOptStack.getLast()->setUnicast(true); break; default: Log(Error) << "Invalid parameter (" << $2 << ") passed to unicast in line " << Lex_->YYText() << "." << LogEnd; return 1; } } ; Routing :ROUTING_ Number { switch($2) { case 0: ClntCfgIfaceLst.getLast()->setRouting(false); break; case 1: ClntCfgIfaceLst.getLast()->setRouting(true); break; default: Log(Error) << "Invalid parameter (" << $2 << ") passed to routing in line " << Lex_->YYText() << "." << LogEnd; return 1; } } ADDRESDUIDList : IPV6ADDR_ { PresentStationLst.append(SPtr (new THostID(new TIPv6Addr($1)))); } | DUID_ { PresentStationLst.append(SPtr (new THostID(new TDUID($1.duid,$1.length)))); } | ADDRESDUIDList ',' IPV6ADDR_ { PresentStationLst.append(SPtr (new THostID(new TIPv6Addr($3)))); } | ADDRESDUIDList ',' DUID_ { PresentStationLst.append(SPtr (new THostID( new TDUID($3.duid,$3.length)))); } ; ADDRESSList : IPV6ADDR_ {PresentAddrLst.append(SPtr (new TIPv6Addr($1)));} | ADDRESSList ',' IPV6ADDR_ {PresentAddrLst.append(SPtr (new TIPv6Addr($3)));} ; StringList : STRING_ { PresentStringLst.append(SPtr (new string($1))); } | StringList ',' STRING_ { PresentStringLst.append(SPtr (new string($3))); } Number : HEXNUMBER_ {$$=$1;} | INTNUMBER_ {$$=$1;} ; ////////////////////////////////////////////////////////////////////// //DNS-SERVER option/////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////// DNSServerOption :OPTION_ DNS_SERVER_ { PresentAddrLst.clear(); // PresentAddrLst.append(SPtr (new TIPv6Addr())); ParserOptStack.getLast()->setDNSServerLst(&PresentAddrLst); } |OPTION_ DNS_SERVER_ { PresentAddrLst.clear(); } ADDRESSList { ParserOptStack.getLast()->setDNSServerLst(&PresentAddrLst); } ; ////////////////////////////////////////////////////////////////////// //DOMAIN option/////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////// DomainOption :OPTION_ DOMAIN_ { PresentStringLst.clear(); ParserOptStack.getLast()->setDomainLst(&PresentStringLst); } |OPTION_ DOMAIN_ { PresentStringLst.clear(); } StringList { ParserOptStack.getLast()->setDomainLst(&PresentStringLst); } ; ////////////////////////////////////////////////////////////////////// //NTP-SERVER option/////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////// NTPServerOption :OPTION_ NTP_SERVER_ { PresentAddrLst.clear(); // PresentAddrLst.append(SPtr (new TIPv6Addr())); ParserOptStack.getLast()->setNTPServerLst(&PresentAddrLst); } |OPTION_ NTP_SERVER_ { PresentAddrLst.clear(); } ADDRESSList { ParserOptStack.getLast()->setNTPServerLst(&PresentAddrLst); } ; ////////////////////////////////////////////////////////////////////// //TIMEZONE option///////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////// TimeZoneOption : OPTION_ TIME_ZONE_ { ParserOptStack.getLast()->setTimezone(string("")); } |OPTION_ TIME_ZONE_ STRING_ { ParserOptStack.getLast()->setTimezone($3); } ; ////////////////////////////////////////////////////////////////////// //SIP-SERVER option/////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////// SIPServerOption :OPTION_ SIP_SERVER_ { PresentAddrLst.clear(); // PresentAddrLst.append(SPtr (new TIPv6Addr())); ParserOptStack.getLast()->setSIPServerLst(&PresentAddrLst); } |OPTION_ SIP_SERVER_ { PresentAddrLst.clear(); } ADDRESSList { ParserOptStack.getLast()->setSIPServerLst(&PresentAddrLst); } ; ////////////////////////////////////////////////////////////////////// //SIP-DOMAIN option/////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////// SIPDomainOption :OPTION_ SIP_DOMAIN_ { PresentStringLst.clear(); ParserOptStack.getLast()->setSIPDomainLst(&PresentStringLst); } |OPTION_ SIP_DOMAIN_ { PresentStringLst.clear(); } StringList { ParserOptStack.getLast()->setSIPDomainLst(&PresentStringLst); } ; ////////////////////////////////////////////////////////////////////// //FQDN option///////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////// FQDNOption :OPTION_ FQDN_ { char hostname[255]; if (get_hostname(hostname, 255) == LOWLEVEL_NO_ERROR) { ParserOptStack.getLast()->setFQDN(string(hostname)); } else { ParserOptStack.getLast()->setFQDN(string("")); } } |OPTION_ FQDN_ STRING_ { ParserOptStack.getLast()->setFQDN($3); } ; FQDNBits :OPTION_ FQDN_S_ Number { if ($3!=0 && $3!=1) { Log(Crit) << "Invalid FQDN S bit value: " << $3 << ", expected 0 or 1." << LogEnd; YYABORT; } Log(Info) << "Setting FQDN S bit to " << $3 << LogEnd; ParserOptStack.getLast()->setFQDNFlagS($3); }; ////////////////////////////////////////////////////////////////////// //NIS-SERVER option/////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////// NISServerOption :OPTION_ NIS_SERVER_ { PresentAddrLst.clear(); // PresentAddrLst.append(SPtr (new TIPv6Addr())); ParserOptStack.getLast()->setNISServerLst(&PresentAddrLst); } |OPTION_ NIS_SERVER_ { PresentAddrLst.clear(); } ADDRESSList { ParserOptStack.getLast()->setNISServerLst(&PresentAddrLst); } ; ////////////////////////////////////////////////////////////////////// //NISP-SERVER option////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////// NISPServerOption : OPTION_ NISP_SERVER_ { PresentAddrLst.clear(); // PresentAddrLst.append(SPtr (new TIPv6Addr())); ParserOptStack.getLast()->setNISPServerLst(&PresentAddrLst); } | OPTION_ NISP_SERVER_ { PresentAddrLst.clear(); } ADDRESSList { ParserOptStack.getLast()->setNISPServerLst(&PresentAddrLst); } ; ////////////////////////////////////////////////////////////////////// //NIS-DOMAIN option/////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////// NISDomainOption :OPTION_ NIS_DOMAIN_ { ParserOptStack.getLast()->setNISDomain(""); } |OPTION_ NIS_DOMAIN_ STRING_ { ParserOptStack.getLast()->setNISDomain($3); } ; ////////////////////////////////////////////////////////////////////// //NISP-DOMAIN option////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////// NISPDomainOption :OPTION_ NISP_DOMAIN_ { ParserOptStack.getLast()->setNISPDomain(""); } |OPTION_ NISP_DOMAIN_ STRING_ { ParserOptStack.getLast()->setNISPDomain($3); } ; ////////////////////////////////////////////////////////////////////// //LIFETIME option///////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////// LifetimeOption :OPTION_ LIFETIME_ { if (ParserOptStack.getLast()->getStateful()) { Log(Crit) << "Information refresh time (lifetime) option can only be used in stateless mode." << LogEnd; YYABORT; } ParserOptStack.getLast()->setLifetime(); } ; VendorSpecOption :OPTION_ VENDOR_SPEC_ { Log(Debug) << "VendorSpec defined (no details)." << LogEnd; ParserOptStack.getLast()->setVendorSpec(); } |OPTION_ VENDOR_SPEC_ VendorSpecList { ParserOptStack.getLast()->setVendorSpec(); Log(Debug) << "VendorSpec defined (multiple times)." << LogEnd; } ; VendorSpecList : Number { VendorSpec.append( new TOptVendorSpecInfo(OPTION_VENDOR_OPTS, $1,0,0,0,0) ); } | Number '-' Number { VendorSpec.append( new TOptVendorSpecInfo(OPTION_VENDOR_OPTS, $1,$3,0,0,0) ); } | VendorSpecList ',' Number { VendorSpec.append( new TOptVendorSpecInfo(OPTION_VENDOR_OPTS, $3,0,0,0,0) ); } | VendorSpecList ',' Number '-' Number { VendorSpec.append( new TOptVendorSpecInfo(OPTION_VENDOR_OPTS, $3,$5,0,0,0) ); } ; DsLiteTunnelOption : OPTION_ AFTR_ { ClntCfgIfaceLst.getLast()->addExtraOption(OPTION_AFTR_NAME, TOpt::Layout_String, false); } ; ExtraOption :OPTION_ Number HEX_KEYWORD_ DUID_ { // option 123 hex 0x1234abcd SPtr opt = new TOptGeneric($2, $4.duid, $4.length, 0); ClntCfgIfaceLst.getLast()->addExtraOption(opt, TOpt::Layout_Duid, true); Log(Debug) << "Will send option " << $2 << " (hex data, len" << $4.length << ")" << LogEnd; } |OPTION_ Number ADDRESS_KEYWORD_ IPV6ADDR_ { // option 123 address 2001:db8::1 SPtr addr(new TIPv6Addr($4)); SPtr opt = new TOptAddr($2, addr, 0); ClntCfgIfaceLst.getLast()->addExtraOption(opt, TOpt::Layout_Addr, true); Log(Debug) << "Will send option " << $2 << " (address " << addr->getPlain() << ")" << LogEnd; } |OPTION_ Number ADDRESS_LIST_KEYWORD_ { // option 123 address-list 2001:db8::1,2001:db8::cafe PresentAddrLst.clear(); } ADDRESSList { SPtr opt = new TOptAddrLst($2, PresentAddrLst, 0); ClntCfgIfaceLst.getLast()->addExtraOption(opt, TOpt::Layout_AddrLst, true); Log(Debug) << "Will send option " << $2 << " (address list, containing " << PresentAddrLst.count() << " addresses)." << LogEnd; } |OPTION_ Number STRING_KEYWORD_ STRING_ { // option 123 string "foobar" SPtr opt = new TOptString($2, string($4), 0); ClntCfgIfaceLst.getLast()->addExtraOption(opt, TOpt::Layout_String, true); Log(Debug) << "Will send option " << $2 << " (string " << $4 << ")" << LogEnd; } |OPTION_ Number HEX_KEYWORD_ { // just request option 123 and interpret responses as hex Log(Debug) << "Will request option " << $2 << " and iterpret response as hex." << LogEnd; ClntCfgIfaceLst.getLast()->addExtraOption($2, TOpt::Layout_Duid, false); } |OPTION_ Number ADDRESS_KEYWORD_ { // just request this option and expect OptAddr layout Log(Debug) << "Will request option " << $2 << " and interpret response as IPv6 address." << LogEnd; ClntCfgIfaceLst.getLast()->addExtraOption($2, TOpt::Layout_Addr, false); } |OPTION_ Number STRING_KEYWORD_ { // just request this option and expect OptString layout Log(Debug) << "Will request option " << $2 << " and interpret response as a string." << LogEnd; ClntCfgIfaceLst.getLast()->addExtraOption($2, TOpt::Layout_String, false); } |OPTION_ Number ADDRESS_LIST_KEYWORD_ { // just request this option and expect OptAddrLst layout Log(Debug) << "Will request option " << $2 << " and interpret response as an address list." << LogEnd; ClntCfgIfaceLst.getLast()->addExtraOption($2, TOpt::Layout_AddrLst, false); }; %% ///////////////////////////////////////////////////////////////////////////// // programs section ///////////////////////////////////////////////////////////////////////////// /** * method check whether interface with id=ifaceNr has been * already declared. * * @param ifindex interface index of the checked interface * * @return true if not declared. */ bool ClntParser::IfaceDefined(int ifindex) { SPtr ptr; ClntCfgIfaceLst.first(); while (ptr=ClntCfgIfaceLst.get()) { if ((ptr->getID())==ifindex) { Log(Crit) << "Interface with ifindex=" << ifindex << " is already defined." << LogEnd; return false; } } return true; } //method check whether interface with id=ifaceName has been //already declared /** * method check whether interface with specified name has been * already declared. * * @param ifaceName name of the checked interface * * @return true if not declared. */ bool ClntParser::IfaceDefined(const std::string& ifaceName) { SPtr ptr; ClntCfgIfaceLst.first(); while (ptr=ClntCfgIfaceLst.get()) { if (ptr->getName()==ifaceName) { Log(Crit) << "Interface " << ifaceName << " is already defined." << LogEnd; return false; } }; return true; } /** * creates new scope appropriately for interface options and declarations * clears all lists except the list of interfaces and adds new group */ bool ClntParser::StartIfaceDeclaration(const std::string& ifaceName) { if (!IfaceDefined(ifaceName)) return false; ClntCfgIfaceLst.append(new TClntCfgIface(ifaceName)); //Interface scope, so parameters associated with global scope are pushed on stack ParserOptStack.append(new TClntParsGlobalOpt(*ParserOptStack.getLast())); ClntCfgIALst.clear(); ClntCfgAddrLst.clear(); this->VendorSpec.clear(); return true; } /** * creates new scope appropriately for interface options and declarations * clears all lists except the list of interfaces and adds new group */ bool ClntParser::StartIfaceDeclaration(int ifindex) { if (!IfaceDefined(ifindex)) return false; ClntCfgIfaceLst.append(new TClntCfgIface(ifindex)); //Interface scope, so parameters associated with global scope are pushed on stack ParserOptStack.append(new TClntParsGlobalOpt(*ParserOptStack.getLast())); ClntCfgIALst.clear(); ClntCfgAddrLst.clear(); this->VendorSpec.clear(); return true; } bool ClntParser::EndIfaceDeclaration() { SPtr iface = ClntCfgIfaceLst.getLast(); if (!iface) { Log(Crit) << "Internal error: Interface not found. Something is wrong. Very wrong." << LogEnd; return false; } // set interface options on the basis of just read information // preferred-server and rejected-servers are also copied here if (VendorSpec.count()) ParserOptStack.getLast()->setVendorSpec(VendorSpec); iface->setOptions(ParserOptStack.getLast()); iface->setOnLinkPrefixLength(ParserOptStack.getLast()->getOnLinkPrefixLength()); if ( (iface->stateless()) && (ClntCfgIALst.count()) ) { Log(Crit) << "Interface " << iface->getFullName() << " is configured stateless, " " but has " << ClntCfgIALst.count() << " IA(s) defined." << LogEnd; return false; } if ( (iface->stateless()) && (ClntCfgTALst.count()) ) { Log(Crit) << "Interface " << iface->getFullName() << " is configured stateless, " " but has TA defined." << LogEnd; return false; } // add all IAs to the interface SPtr ia; ClntCfgIALst.first(); while (ia=ClntCfgIALst.get()) { ClntCfgIfaceLst.getLast()->addIA(ia); } //add all TAs to the interface SPtr ptrTA; ClntCfgTALst.first(); while ( ptrTA = ClntCfgTALst.get() ) { iface->addTA(ptrTA); } //add all PDs to the interface SPtr pd; ClntCfgPDLst.first(); while (pd = ClntCfgPDLst.get() ) { iface->addPD(pd); } //restore global options ParserOptStack.delLast(); ClntCfgIALst.clear(); return true; } void ClntParser::EmptyIface() { //set iface options on the basis of recent information ClntCfgIfaceLst.getLast()->setOptions(ParserOptStack.getLast()); //add one IA with one address to this iface EmptyIA(); ClntCfgIALst.getLast()->setOptions(ParserOptStack.getLast()); ClntCfgIfaceLst.getLast()->addIA(ClntCfgIALst.getLast()); } /// method creates new scope appropriately for interface options and declarations /// clears list of addresses /// /// @param aggregation - does this IA contains suboptions ( ia { ... } ) /// @return true if creation was successful bool ClntParser::StartIADeclaration(bool aggregation) { if (!ParserOptStack.getLast()->getStateful()) { Log(Crit) << "Attempted to use IA (stateful option) in stateless mode." << LogEnd; return (false); } ParserOptStack.append(new TClntParsGlobalOpt(*ParserOptStack.getLast())); ParserOptStack.getLast()->setAddrHint(!aggregation); ClntCfgAddrLst.clear(); return (true); } /** * Inbelivable piece of crap code. If you read this, rewrite this code immediately. * */ void ClntParser::EndIADeclaration() { if(!ClntCfgAddrLst.count()) { EmptyIA(); } else { SPtr ia = new TClntCfgIA(); ClntCfgIALst.append(ia); SPtr ptr; ClntCfgAddrLst.first(); while(ptr=ClntCfgAddrLst.get()) ia->addAddr(ptr); } //set proper options specific for this IA ClntCfgIALst.getLast()->setOptions(ParserOptStack.getLast()); ClntCfgAddrLst.clear(); ParserOptStack.delLast(); //this IA matches with previous ones and can be grouped with them //so it's should be left on the list and be appended with them to present list } /// @brief creates PD context /// /// @return true if initialization was successful bool ClntParser::StartPDDeclaration() { if (!ParserOptStack.getLast()->getStateful()) { Log(Crit) << "Attempted to use PD (stateful option) in stateless mode." << LogEnd; return (false); } ParserOptStack.append(new TClntParsGlobalOpt(*ParserOptStack.getLast())); ClntCfgAddrLst.clear(); PrefixLst.clear(); return (true); } bool ClntParser::EndPDDeclaration() { SPtr pd = new TClntCfgPD(); pd->setOptions(ParserOptStack.getLast()); // copy all defined prefixes PrefixLst.first(); SPtr prefix; while (prefix = PrefixLst.get()) { pd->addPrefix(prefix); } PrefixLst.clear(); ClntCfgPDLst.append(pd); ParserOptStack.delLast(); return true; } /** * method adds 1 IA object (containing 1 address) to the ClntCfgIA list. * Both objects' properties are set to last parsed values * */ void ClntParser::EmptyIA() { EmptyAddr(); ClntCfgIALst.append(new TClntCfgIA()); ClntCfgIALst.getLast()->setOptions(ParserOptStack.getLast()); // Commented out: by default sent empty IA, without any addresses // ClntCfgIALst.getLast()->addAddr(ClntCfgAddrLst.getLast()); } /** * method adds empty address to the ClntCfgAddrList list and sets * its properties to last parsed values * */ void ClntParser::EmptyAddr() { ClntCfgAddrLst.append(new TClntCfgAddr()); ClntCfgAddrLst.getLast()->setOptions(ParserOptStack.getLast()); } int ClntParser::yylex() { memset(&std::yylval,0, sizeof(std::yylval)); memset(&this->yylval,0, sizeof(this->yylval)); int x = Lex_->yylex(); this->yylval=std::yylval; return x; } /** * This method is called when parsing error is detected. * * @param m - first invalid character */ void ClntParser::yyerror(char *m) { Log(Crit) << "Config parse error: line " << Lex_->lineno() << ", unexpected [" << Lex_->YYText() << "] token." << LogEnd; } /** * Desctructor. Just cleans things up * */ ClntParser::~ClntParser() { this->ClntCfgIfaceLst.clear(); this->ClntCfgIALst.clear(); this->ClntCfgTALst.clear(); this->ClntCfgAddrLst.clear(); } dibbler-1.0.1/ClntCfgMgr/ClntCfgAddr.h0000664000175000017500000000154612233256142014317 00000000000000/* * Dibbler - a portable DHCPv6 * * authors: Tomasz Mrugalski * Marek Senderski * * released under GNU GPL v2 only licence * */ class TClntCfgAddr; #ifndef CLNTCFGADDR_H #define CLNTCFGADDR_H #include "DHCPConst.h" #include "ClntParsGlobalOpt.h" #include "SmartPtr.h" #include "IPv6Addr.h" #include #include class TClntCfgAddr { friend std::ostream& operator<<(std::ostream& out, TClntCfgAddr& group); public: TClntCfgAddr(); TClntCfgAddr(SPtr addr); TClntCfgAddr(SPtr addr,long valid,long pref); ~TClntCfgAddr(); SPtr get(); unsigned long getValid(); unsigned long getPref(); void setOptions(SPtr opt); private: SPtr Addr; unsigned long Valid; unsigned long Pref; }; #endif dibbler-1.0.1/ClntCfgMgr/ClntParsIAOpt.cpp0000644000175000017500000000402412277722750015165 00000000000000/* * Dibbler - a portable DHCPv6 * * authors: Tomasz Mrugalski * Marek Senderski * * released under GNU GPL v2 only licence */ #include "ClntParsIAOpt.h" #include TClntParsIAOpt::TClntParsIAOpt() : TClntParsAddrOpt() { T1=UINT_MAX; T2=UINT_MAX; IAIDCnt=0; AddrHint=true; AddrParams = false; } long TClntParsIAOpt::getT1() { return T1; } void TClntParsIAOpt::setT1(long T1) { this->T1=T1; } long TClntParsIAOpt::getT2() { return this->T2; } void TClntParsIAOpt::setT2(long T2) { this->T2=T2; } long TClntParsIAOpt::getIAIDCnt() { return this->IAIDCnt; } void TClntParsIAOpt::setIAIDCnt(long cnt) { this->IAIDCnt=cnt; } bool TClntParsIAOpt::getAddrHint() { return this->AddrHint; } void TClntParsIAOpt::setAddrHint(bool addrHint) { this->AddrHint=addrHint; } void TClntParsIAOpt::addPrefSrv(SPtr prefSrv) { this->PrefSrv.append(prefSrv); } void TClntParsIAOpt::firstPrefSrv() { this->PrefSrv.first(); } SPtr TClntParsIAOpt::getPrefSrv() { return this->PrefSrv.get(); } void TClntParsIAOpt::clearPrefSrv() { this->PrefSrv.clear(); } void TClntParsIAOpt::setPrefSrvLst(TContainer > *lst) { SPtr id; this->PrefSrv.clear(); lst->first(); while(id=lst->get()) this->PrefSrv.append(id); } void TClntParsIAOpt::addRejedSrv(SPtr prefSrv) { this->RejedSrv.append(prefSrv); } void TClntParsIAOpt::firstRejedSrv() { this->RejedSrv.first(); } void TClntParsIAOpt::clearRejedSrv() { this->RejedSrv.clear(); } void TClntParsIAOpt::setRejedSrvLst(TContainer > *lst) { SPtr id; this->RejedSrv.clear(); lst->first(); while(id=lst->get()) this->RejedSrv.append(id); } SPtr TClntParsIAOpt::getRejedSrv() { return this->RejedSrv.get(); } void TClntParsIAOpt::setAddrParams(bool useAddrParams) { AddrParams = useAddrParams; } bool TClntParsIAOpt::getAddrParams() { return AddrParams; } dibbler-1.0.1/ClntCfgMgr/ClntCfgMgr.h0000644000175000017500000001104412360241427014163 00000000000000/* * Dibbler - a portable DHCPv6 * * authors: Tomasz Mrugalski * Marek Senderski * changes: Krzysztof WNuk * Michal Kowalczuk * * released under GNU GPL v2 only licence * * $Id: ClntCfgMgr.h,v 1.30 2008-08-30 21:41:10 thomson Exp $ */ class TClntCfgMgr; class TClntCfgIface; class ClntParser; #ifndef CLNTCFGMGR_H #define CLNTCFGMGR_H #include #include #include "SmartPtr.h" #include "Container.h" #include "ClntCfgIface.h" #include "ClntIfaceMgr.h" #include "ClntCfgIA.h" #include "ClntCfgPD.h" #include "CfgMgr.h" #ifndef MOD_DISABLE_AUTH #include "KeyList.h" #endif #define ClntCfgMgr() (TClntCfgMgr::instance()) class TClntCfgMgr : public TCfgMgr { friend std::ostream & operator<<(std::ostream &strum, TClntCfgMgr &x); private: TClntCfgMgr(const std::string& cfgFile); public: static TClntCfgMgr & instance(); static void instanceCreate(const std::string& cfgFile); ~TClntCfgMgr(); // --- Iface related --- SPtr getIA(long IAID); SPtr getPD(long IAID); SPtr getIface(); SPtr getIface(int id); void firstIface(); void addIface(SPtr x); void makeInactiveIface(int ifindex, bool inactive, bool managed, bool otherConf); int countIfaces(); void dump(); void setDownlinkPrefixIfaces(List(std::string)& ifaces); const std::vector& getDownlinkPrefixIfaces() { return DownlinkPrefixIfaces_; } void setReconfigure(bool enable); bool getReconfigure(); //IA related bool setIAState(int iface, int iaid, enum EState state); int countAddrForIA(long IAID); SPtr getIfaceByIAID(int iaid); bool isDone(); DigestTypes getDigest(); void setDigest(DigestTypes value); void setScript(std::string script) { ScriptName = script; } std::string getScript() { return ScriptName; } bool anonInfRequest(); bool insistMode(); bool inactiveMode(); bool addInfRefreshTime(); int inactiveIfacesCnt(); SPtr checkInactiveIfaces(); bool openSocket(SPtr iface); void obeyRaBits(bool obey); bool obeyRaBits(); #ifndef MOD_DISABLE_AUTH // Authorization uint32_t getSPI(); /// @todo move this to CfgMgr void setAuthAcceptMethods(const std::vector& methods); const std::vector& getAuthAcceptMethods(); SPtr AuthKeys; #endif #ifdef MOD_REMOTE_AUTOCONF void setRemoteAutoconf(bool enable); bool getRemoteAutoconf(); #endif bool getFQDNFlagS(); bool useConfirm(); private: bool setGlobalOptions(ClntParser * parser); bool validateConfig(); bool validateIface(SPtr iface); bool validateIA(SPtr ptrIface, SPtr ptrIA); bool validateAddr(SPtr ptrIface, SPtr ptrIA, SPtr ptrAddr); bool validatePD(SPtr ptrIface, SPtr ptrPD); bool validatePrefix(SPtr ptrIface, SPtr ptrPD, SPtr ptrPrefix); bool parseConfigFile(const std::string& cfgFile); bool matchParsedSystemInterfaces(ClntParser *parser); List(TClntCfgIface) ClntCfgIfaceLst; List(TClntCfgIface) InactiveLst; std::string ScriptName; bool AnonInfRequest; bool InsistMode; bool InactiveMode; bool UseConfirm; bool Reconfigure; DigestTypes Digest_; #ifndef MOD_DISABLE_AUTH std::vector AuthAcceptMethods_; // used in auth protocol dibbler uint32_t SPI_; // used in auth protocol dibbler #endif #ifdef MOD_REMOTE_AUTOCONF bool RemoteAutoconf; #endif bool FQDNFlagS; // S bit in the FQDN option std::vector DownlinkPrefixIfaces_; bool ObeyRaBits_; static TClntCfgMgr * Instance; }; typedef bool HardcodedCfgFunc(TClntCfgMgr *cfgMgr, std::string params); #endif dibbler-1.0.1/ClntCfgMgr/ClntCfgPrefix.cpp0000644000175000017500000000311412277722750015237 00000000000000/* * Dibbler - a portable DHCPv6 * * authors: Tomasz Mrugalski * Marek Senderski * changes: Krzysztof Wnuk * released under GNU GPL v2 only licence * * */ #include #include #include #include "DHCPConst.h" #include "ClntCfgPrefix.h" #include "Logger.h" SPtr TClntCfgPrefix::get() { return Prefix; } unsigned long TClntCfgPrefix::getValid() { return Valid; } unsigned long TClntCfgPrefix::getPref() { return Pref; } TClntCfgPrefix::TClntCfgPrefix(SPtr prefix, unsigned long valid, unsigned long pref, unsigned char len) :Prefix(prefix), Valid(valid), Pref(pref), PrefixLength(len) { } TClntCfgPrefix::~TClntCfgPrefix() { } void TClntCfgPrefix::setOptions(SPtr opt) { this->Valid=opt->getValid(); this->Pref=opt->getPref(); } TClntCfgPrefix::TClntCfgPrefix() { this->Valid=UINT_MAX; this->Pref=UINT_MAX; Prefix = new TIPv6Addr(); PrefixLength = 0; } TClntCfgPrefix::TClntCfgPrefix(SPtr prefix, unsigned char len) :Prefix(prefix), Valid(UINT_MAX), Pref(UINT_MAX), PrefixLength(len) { } std::ostream& operator<<(std::ostream& out,TClntCfgPrefix& pref) { out << ""; out << *pref.Prefix << "" << std::endl; return out; } dibbler-1.0.1/ClntCfgMgr/ClntParsIfaceOpt.cpp0000644000175000017500000001322212474446757015714 00000000000000/* * Dibbler - a portable DHCPv6 * * authors: Tomasz Mrugalski * Marek Senderski * changes: Krzysztof Wnuk * * released under GNU GPL v2 only licence * */ #include #include #include "ClntParsIfaceOpt.h" #include "DHCPDefaults.h" #include "Logger.h" using namespace std; TClntParsIfaceOpt::TClntParsIfaceOpt() : TClntParsIAOpt(), Stateless_(false), Unicast(CLIENT_DEFAULT_UNICAST), RapidCommit(CLIENT_DEFAULT_RAPID_COMMIT), Timezone(""), FQDN(""), NISDomain(""), Lifetime(false), ReqDNSServer(false), ReqDomain(false), ReqNTPServer(false), ReqTimezone(false), ReqSIPServer(false), ReqSIPDomain(false), ReqFQDN(false), ReqNISServer(false), ReqNISPServer(false), ReqNISDomain(false), ReqNISPDomain(false), ReqLifetime(false), ReqPrefixDelegation(false), ReqVendorSpec(false) { } bool TClntParsIfaceOpt::getStateful() { return !Stateless_; } void TClntParsIfaceOpt::setStateful(bool state) { Stateless_ = !state; } void TClntParsIfaceOpt::setUnicast(bool unicast) { Unicast = unicast; } bool TClntParsIfaceOpt::getUnicast() { return this->Unicast; } bool TClntParsIfaceOpt::getRapidCommit() { return this->RapidCommit; } void TClntParsIfaceOpt::setRapidCommit(bool rapCom) { this->RapidCommit=rapCom; } TClntParsIfaceOpt::~TClntParsIfaceOpt() { } // --- option: DNS server --- List(TIPv6Addr) * TClntParsIfaceOpt::getDNSServerLst() { return &this->DNSServerLst; } void TClntParsIfaceOpt::setDNSServerLst(List(TIPv6Addr) *lst) { this->DNSServerLst = *lst; this->ReqDNSServer = true; } bool TClntParsIfaceOpt::getReqDNSServer() { return this->ReqDNSServer; } // --- option: domain --- List(std::string) * TClntParsIfaceOpt::getDomainLst() { return &this->DomainLst; } void TClntParsIfaceOpt::setDomainLst(List(std::string) * domain) { this->DomainLst=*domain; this->ReqDomain=true; } bool TClntParsIfaceOpt::getReqDomain() { return this->ReqDomain; } // --- option: NTP-SERVERS --- List(TIPv6Addr) * TClntParsIfaceOpt::getNTPServerLst() { return &this->NTPServerLst; } void TClntParsIfaceOpt::setNTPServerLst(List(TIPv6Addr) *lst) { this->NTPServerLst = *lst; this->ReqNTPServer = true; } bool TClntParsIfaceOpt::getReqNTPServer(){ return this->ReqNTPServer; } // --- option: Timezone --- void TClntParsIfaceOpt::setTimezone(const std::string& Timezone) { this->Timezone=Timezone; this->ReqTimezone=true; } bool TClntParsIfaceOpt::getReqTimezone() { return this->ReqTimezone; } string TClntParsIfaceOpt::getTimezone() { return this->Timezone; } // --- option: SIP server --- List(TIPv6Addr) * TClntParsIfaceOpt::getSIPServerLst() { return &this->SIPServerLst; } void TClntParsIfaceOpt::setSIPServerLst(List(TIPv6Addr) *lst) { this->SIPServerLst = *lst; this->ReqSIPServer = true; } bool TClntParsIfaceOpt::getReqSIPServer(){ return this->ReqSIPServer; } // --- option: SIP domain --- List(std::string) * TClntParsIfaceOpt::getSIPDomainLst() { return &this->SIPDomainLst; } void TClntParsIfaceOpt::setSIPDomainLst(List(std::string) * domain) { this->SIPDomainLst=*domain; this->ReqSIPDomain=true; } bool TClntParsIfaceOpt::getReqSIPDomain() { return this->ReqSIPDomain; } // --- option: FQDN --- void TClntParsIfaceOpt::setFQDN(const std::string& fqdn) { this->FQDN=fqdn; this->ReqFQDN=true; } bool TClntParsIfaceOpt::getReqFQDN() { return this->ReqFQDN; } string TClntParsIfaceOpt::getFQDN() { return this->FQDN; } // --- option: Prefix Delegation --- void TClntParsIfaceOpt::setPrefixDelegation() { this->ReqPrefixDelegation=true; } bool TClntParsIfaceOpt::getReqPrefixDelegation() { return this->ReqPrefixDelegation; } // --- option: NIS server --- List(TIPv6Addr) * TClntParsIfaceOpt::getNISServerLst() { return &this->NISServerLst; } void TClntParsIfaceOpt::setNISServerLst(List(TIPv6Addr) *lst) { this->NISServerLst = *lst; this->ReqNISServer = true; } bool TClntParsIfaceOpt::getReqNISServer(){ return this->ReqNISServer; } // --- option: NIS domain --- string TClntParsIfaceOpt::getNISDomain() { return this->NISDomain; } void TClntParsIfaceOpt::setNISDomain(const std::string& domain) { this->NISDomain=domain; this->ReqNISDomain=true; } bool TClntParsIfaceOpt::getReqNISDomain() { return this->ReqNISDomain; } // --- option: NIS+ server --- List(TIPv6Addr) * TClntParsIfaceOpt::getNISPServerLst() { return &this->NISPServerLst; } void TClntParsIfaceOpt::setNISPServerLst(List(TIPv6Addr) *lst) { this->NISPServerLst = *lst; this->ReqNISPServer = true; } bool TClntParsIfaceOpt::getReqNISPServer(){ return this->ReqNISPServer; } // --- option: NIS+ domain --- string TClntParsIfaceOpt::getNISPDomain() { return this->NISPDomain; } void TClntParsIfaceOpt::setNISPDomain(const std::string& domain) { this->NISPDomain=domain; this->ReqNISPDomain=true; } bool TClntParsIfaceOpt::getReqNISPDomain() { return this->ReqNISPDomain; } // --- option: Lifetime --- bool TClntParsIfaceOpt::getLifetime() { return this->Lifetime; } void TClntParsIfaceOpt::setLifetime() { this->Lifetime = true; this->ReqLifetime = true; } bool TClntParsIfaceOpt::getReqLifetime() { return this->ReqLifetime; } // --- option: vendor-spec --- void TClntParsIfaceOpt::setVendorSpec(List(TOptVendorSpecInfo) vendorSpec) { VendorSpec = vendorSpec; ReqVendorSpec = true; } void TClntParsIfaceOpt::setVendorSpec() { ReqVendorSpec = true; } bool TClntParsIfaceOpt::getReqVendorSpec() { return ReqVendorSpec; } List(TOptVendorSpecInfo) TClntParsIfaceOpt::getVendorSpec() { return VendorSpec; } dibbler-1.0.1/ClntCfgMgr/ClntParsIAOpt.h0000664000175000017500000000246312233256142014626 00000000000000/* * Dibbler - a portable DHCPv6 * * authors: Tomasz Mrugalski * Marek Senderski *changes : Krzysztof Wnuk * released under GNU GPL v2 only licence */ #ifndef PARSIAOPT_H_ #define PARSIAOPT_H_ #include "HostID.h" #include "Container.h" #include "DHCPConst.h" #include "SmartPtr.h" #include "ClntParsAddrOpt.h" #include "IPv6Addr.h" class TClntParsIAOpt : public TClntParsAddrOpt { public: TClntParsIAOpt(); long getT1(); void setT1(long T1); long getT2(); void setT2(long T2); long getIAIDCnt(); void setIAIDCnt(long cnt); bool getAddrHint(); void setAddrHint(bool addrHint); void addPrefSrv(SPtr prefSrv); void firstPrefSrv(); SPtr getPrefSrv(); void clearPrefSrv(); void setPrefSrvLst(TContainer > *lst); void addRejedSrv(SPtr prefSrv); void firstRejedSrv(); SPtr getRejedSrv(); void clearRejedSrv(); void setRejedSrvLst(TContainer > *lst); void setAddrParams(bool useAddrParams); bool getAddrParams(); private: long T1; long T2; long IAIDCnt; bool AddrHint; List(THostID) PrefSrv; List(THostID) RejedSrv; bool AddrParams; }; #endif dibbler-1.0.1/ClntCfgMgr/ClntCfgAddr.cpp0000644000175000017500000000242012277722750014653 00000000000000/* * Dibbler - a portable DHCPv6 * * authors: Tomasz Mrugalski * Marek Senderski * * released under GNU GPL v2 only licence * * $Id: ClntCfgAddr.cpp,v 1.5 2008-08-29 00:07:27 thomson Exp $ * */ #include #include #include #include "DHCPConst.h" #include "ClntCfgAddr.h" #include "Logger.h" SPtr TClntCfgAddr::get() { return Addr; } unsigned long TClntCfgAddr::getValid() { return Valid; } unsigned long TClntCfgAddr::getPref() { return Pref; } TClntCfgAddr::TClntCfgAddr(SPtr addr,long valid,long pref) { Addr=addr; Valid = valid; Pref = pref; } TClntCfgAddr::~TClntCfgAddr() { } void TClntCfgAddr::setOptions(SPtr opt) { this->Valid=opt->getValid(); this->Pref=opt->getPref(); } TClntCfgAddr::TClntCfgAddr() { this->Valid=UINT_MAX; this->Pref=UINT_MAX; Addr= new TIPv6Addr(); } TClntCfgAddr::TClntCfgAddr(SPtr addr) { Addr=addr; Valid = UINT_MAX; Pref = UINT_MAX; } std::ostream& operator<<(std::ostream& out, TClntCfgAddr& addr) { out << ""; out << *addr.Addr << "" << std::endl; return out; } dibbler-1.0.1/ClntCfgMgr/ClntCfgIface.cpp0000644000175000017500000005160512556512753015021 00000000000000/* * Dibbler - a portable DHCPv6 * * authors: Tomasz Mrugalski * Marek Senderski * changes: Krzysztof Wnuk * Michal Kowalczuk * Mateusz Ozga * * released under GNU GPL v2 only licence * */ #include #include #include #include "ClntCfgIface.h" #include "Logger.h" #include "Portable.h" #include "OptVendorSpecInfo.h" using namespace std; TClntCfgIface::TClntCfgIface(const std::string& ifaceName) :Stateful_(true), Unicast(false), RapidCommit(false), PrefixLength(-1), RoutingEnabled(false){ setDefaults(); NoConfig=false; IfaceName=ifaceName; ID=-1; } TClntCfgIface::TClntCfgIface(int iface_index) :Stateful_(true), Unicast(false), RapidCommit(false), PrefixLength(-1), RoutingEnabled(false){ setDefaults(); NoConfig=false; ID=iface_index; IfaceName="[unknown]"; } void TClntCfgIface::setDefaults() { DNSServerState = STATE_DISABLED; DomainState = STATE_DISABLED; NTPServerState = STATE_DISABLED; TimezoneState = STATE_DISABLED; SIPServerState = STATE_DISABLED; SIPDomainState = STATE_DISABLED; FQDNState = STATE_DISABLED; NISServerState = STATE_DISABLED; NISPServerState = STATE_DISABLED; NISDomainState = STATE_DISABLED; NISPDomainState = STATE_DISABLED; LifetimeState = STATE_DISABLED; PrefixDelegationState = STATE_DISABLED; VendorSpecState = STATE_DISABLED; RoutingEnabledState = STATE_DISABLED; ReqDNSServer = false; ReqDomain = false; ReqNTPServer = false; ReqTimezone = false; ReqSIPServer = false; ReqSIPDomain = false; ReqFQDN = false; ReqNISServer = false; ReqNISPServer = false; ReqNISDomain = false; ReqNISPDomain = false; ReqLifetime = false; ReqVendorSpec = false; ReqPrefixDelegation = false; ExtraOpts.clear(); } void TClntCfgIface::setOptions(SPtr opt) { Stateful_ = opt->getStateful(); Unicast = opt->getUnicast(); RapidCommit = opt->getRapidCommit(); // copy YES/NO information ReqDNSServer = opt->getReqDNSServer(); ReqDomain = opt->getReqDomain(); ReqNTPServer = opt->getReqNTPServer(); ReqTimezone = opt->getReqTimezone(); ReqSIPServer = opt->getReqSIPServer(); ReqSIPDomain = opt->getReqSIPDomain(); ReqFQDN = opt->getReqFQDN(); ReqNISServer = opt->getReqNISServer(); ReqNISDomain = opt->getReqNISDomain(); ReqNISPServer= opt->getReqNISPServer(); ReqNISPDomain= opt->getReqNISPDomain(); ReqLifetime = opt->getReqLifetime(); ReqPrefixDelegation = opt->getReqPrefixDelegation(); ReqVendorSpec= opt->getReqVendorSpec(); // copy parameters DNSServerLst = *opt->getDNSServerLst(); DomainLst = *opt->getDomainLst(); Timezone = opt->getTimezone(); NTPServerLst = *opt->getNTPServerLst(); SIPServerLst = *opt->getSIPServerLst(); SIPDomainLst = *opt->getSIPDomainLst(); FQDN = opt->getFQDN(); NISServerLst = *opt->getNISServerLst(); NISDomain = opt->getNISDomain(); NISPServerLst= *opt->getNISPServerLst(); NISPDomain = opt->getNISPDomain(); VendorSpecLst= opt->getVendorSpec(); if (ReqDNSServer) setDNSServerState(STATE_NOTCONFIGURED); if (ReqDomain) setDomainState(STATE_NOTCONFIGURED); if (ReqNTPServer) setNTPServerState(STATE_NOTCONFIGURED); if (ReqTimezone) setTimezoneState(STATE_NOTCONFIGURED); if (ReqSIPServer) setSIPServerState(STATE_NOTCONFIGURED); if (ReqSIPDomain) setSIPDomainState(STATE_NOTCONFIGURED); if (ReqFQDN) setFQDNState(STATE_NOTCONFIGURED); if (ReqNISServer) setNISServerState(STATE_NOTCONFIGURED); if (ReqNISDomain) setNISDomainState(STATE_NOTCONFIGURED); if (ReqNISPServer) setNISPServerState(STATE_NOTCONFIGURED); if (ReqNISPDomain) setNISPDomainState(STATE_NOTCONFIGURED); if (ReqLifetime) setLifetimeState(STATE_NOTCONFIGURED); if (ReqVendorSpec) setVendorSpecState(STATE_NOTCONFIGURED); // copy preferred-server list SPtr station; opt->firstPrefSrv(); while (station = opt->getPrefSrv()) PrefSrvLst.append(station); // copy rejected-server list opt->firstRejedSrv(); while (station = opt->getRejedSrv()) RejectedSrvLst.append(station); } bool TClntCfgIface::isServerRejected(SPtr addr,SPtr duid) { RejectedSrvLst.first(); SPtr RejectedSrv; while(RejectedSrv=RejectedSrvLst.get()) { if (((*RejectedSrv)==addr)||((*RejectedSrv)==duid)) return true; } return false; } void TClntCfgIface::firstTA() { ClntCfgTALst.first(); } SPtr TClntCfgIface::getTA() { return ClntCfgTALst.get(); } void TClntCfgIface::addTA(SPtr ta) { ClntCfgTALst.append(ta); } int TClntCfgIface::countTA() { return ClntCfgTALst.count(); } void TClntCfgIface::firstIA() { IALst.first(); } int TClntCfgIface::countIA() { return IALst.count(); } SPtr TClntCfgIface::getIA() { return IALst.get(); } SPtr TClntCfgIface::getIA(int iaid) { SPtr ia; IALst.first(); while (ia = IALst.get() ) { if (ia->getIAID() == iaid) return ia; } return SPtr(); // NULL } void TClntCfgIface::addIA(SPtr ptr) { IALst.append(ptr); } void TClntCfgIface::firstPD() { PDLst.first(); } int TClntCfgIface::countPD() { return PDLst.count(); } SPtr TClntCfgIface::getPD() { return PDLst.get(); } SPtr TClntCfgIface::getPD(int iaid) { SPtr ia; PDLst.first(); while (ia = PDLst.get() ) { if (ia->getIAID() == iaid) return ia; } return SPtr(); // NULL } void TClntCfgIface::addPD(SPtr ptr) { PDLst.append(ptr); } string TClntCfgIface::getName(void) { return IfaceName; } string TClntCfgIface::getFullName() { ostringstream oss; oss << ID; return string(IfaceName) +"/" +oss.str(); } int TClntCfgIface::getID(void) { return ID; } void TClntCfgIface::setIfaceID(int ifaceID) { ID=ifaceID; } void TClntCfgIface::setIfaceName(const std::string& ifaceName) { IfaceName=ifaceName; } void TClntCfgIface::setNoConfig() { NoConfig=true; } bool TClntCfgIface::stateless() { return !Stateful_; } bool TClntCfgIface::noConfig() { return NoConfig; } bool TClntCfgIface::getUnicast() { return this->Unicast; } bool TClntCfgIface::getRapidCommit() { return this->RapidCommit; } void TClntCfgIface::vendorSpecSupported(bool support) { ReqVendorSpec = support; VendorSpecState = STATE_NOTCONFIGURED; } // -------------------------------------------------------------------------------- // --- options below -------------------------------------------------------------- // -------------------------------------------------------------------------------- bool TClntCfgIface::isReqDNSServer() { return this->ReqDNSServer; } bool TClntCfgIface::isReqDomain() { return this->ReqDomain; } bool TClntCfgIface::isReqNTPServer() { return this->ReqNTPServer; } bool TClntCfgIface::isReqTimezone() { return this->ReqTimezone; } bool TClntCfgIface::isReqSIPServer() { return this->ReqSIPServer; } bool TClntCfgIface::isReqSIPDomain() { return this->ReqSIPDomain; } bool TClntCfgIface::isReqFQDN() { return this->ReqFQDN; } bool TClntCfgIface::isReqNISServer() { return this->ReqNISServer; } bool TClntCfgIface::isReqNISDomain() { return this->ReqNISDomain; } bool TClntCfgIface::isReqNISPServer() { return this->ReqNISPServer; } bool TClntCfgIface::isReqNISPDomain() { return this->ReqNISPDomain; } bool TClntCfgIface::isReqLifetime() { return this->ReqLifetime; } bool TClntCfgIface::isReqVendorSpec() { return this->ReqVendorSpec; } bool TClntCfgIface::isRoutingEnabled() { return this->RoutingEnabled; } // -------------------------------------------------------------------------------- // --- options: state ------------------------------------------------------------- // -------------------------------------------------------------------------------- EState TClntCfgIface::getDNSServerState() { return DNSServerState; } EState TClntCfgIface::getDomainState() { return DomainState; } EState TClntCfgIface::getNTPServerState() { return NTPServerState; } EState TClntCfgIface::getTimezoneState() { return TimezoneState; } EState TClntCfgIface::getSIPServerState() { return SIPServerState; } EState TClntCfgIface::getSIPDomainState() { return SIPDomainState; } EState TClntCfgIface::getFQDNState() { return FQDNState; } EState TClntCfgIface::getNISServerState() { return NISServerState; } EState TClntCfgIface::getNISPServerState() { return NISPServerState; } EState TClntCfgIface::getNISDomainState() { return NISDomainState; } EState TClntCfgIface::getNISPDomainState() { return NISPDomainState; } EState TClntCfgIface::getLifetimeState() { return LifetimeState; } EState TClntCfgIface::getVendorSpecState() { return VendorSpecState; } EState TClntCfgIface::getKeyGenerationState() { return KeyGenerationState; } EState TClntCfgIface::getRoutingEnabledState() { return RoutingEnabledState; } // -------------------------------------------------------------------- // --- options: get option -------------------------------------------- // -------------------------------------------------------------------- List(TIPv6Addr) * TClntCfgIface::getProposedDNSServerLst() { return &this->DNSServerLst; } List(std::string) * TClntCfgIface::getProposedDomainLst() { return &this->DomainLst; } List(TIPv6Addr) * TClntCfgIface::getProposedNTPServerLst() { return &this->NTPServerLst; } string TClntCfgIface::getProposedTimezone() { return this->Timezone; } List(TIPv6Addr) * TClntCfgIface::getProposedSIPServerLst() { return &this->SIPServerLst; } List(std::string) * TClntCfgIface::getProposedSIPDomainLst() { return &this->SIPDomainLst; } string TClntCfgIface::getProposedFQDN() { return this->FQDN; } List(TIPv6Addr) * TClntCfgIface::getProposedNISServerLst() { return &this->NISServerLst; } List(TIPv6Addr) * TClntCfgIface::getProposedNISPServerLst() { return &this->NISPServerLst; } string TClntCfgIface::getProposedNISDomain() { return this->NISDomain; } string TClntCfgIface::getProposedNISPDomain() { return this->NISPDomain; } void TClntCfgIface::firstVendorSpec() { VendorSpecLst.first(); } SPtr TClntCfgIface::getVendorSpec() { return this->VendorSpecLst.get(); } // -------------------------------------------------------------------- // --- options: setState ---------------------------------------------- // -------------------------------------------------------------------- void TClntCfgIface::setDNSServerState(EState state) { this->DNSServerState=state; } void TClntCfgIface::setDomainState(EState state) { this->DomainState=state; } void TClntCfgIface::setNTPServerState(EState state) { this->NTPServerState=state; } void TClntCfgIface::setTimezoneState(EState state) { this->TimezoneState=state; } void TClntCfgIface::setSIPServerState(EState state) { this->SIPServerState=state; } void TClntCfgIface::setSIPDomainState(EState state) { this->SIPDomainState=state; } void TClntCfgIface::setFQDNState(EState state) { this->FQDNState=state; } void TClntCfgIface::setNISServerState(EState state) { this->NISServerState=state; } void TClntCfgIface::setNISPServerState(EState state) { this->NISPServerState=state; } void TClntCfgIface::setNISDomainState(EState state) { this->NISDomainState=state; } void TClntCfgIface::setNISPDomainState(EState state) { this->NISPDomainState=state; } void TClntCfgIface::setLifetimeState(EState state) { this->LifetimeState=state; } void TClntCfgIface::setVendorSpecState(EState state) { this->VendorSpecState = state; } void TClntCfgIface::setVendorSpec(List(TOptVendorSpecInfo) vendorSpecList) { VendorSpecLst = vendorSpecList; } void TClntCfgIface::setKeyGenerationState(EState state) { this->KeyGenerationState = state; } void TClntCfgIface::setOnLinkPrefixLength(int len) { this->PrefixLength = len; } int TClntCfgIface::getOnLinkPrefixLength() { return this->PrefixLength; } void TClntCfgIface::setRoutingEnabledState(EState state) { RoutingEnabledState = state; } /** * add extra option to the list of supported extra options * * @param extra smart pointer to the supported option (to be sent) * @param layout specifies layout of the option * @param sendAlways should this option be always sent? Even when already configured? */ void TClntCfgIface::addExtraOption(SPtr extra, TOpt::EOptionLayout layout, bool sendAlways) { SPtr optStatus = new TOptionStatus(); optStatus->OptionType = extra->getOptType(); optStatus->Option = extra; optStatus->Always = sendAlways; optStatus->Layout = layout; ExtraOpts.push_back(optStatus); } /** * add extra option to the list of supported extra options * * @param opttype code of the supported option * @param layout defines layout (see TOpt::EOptionLayout) * @param sendAlways should this option be always sent? Even when already configured? */ void TClntCfgIface::addExtraOption(int opttype, TOpt::EOptionLayout layout, bool sendAlways) { SPtr optStatus = new TOptionStatus(); optStatus->OptionType = opttype; optStatus->Always = sendAlways; optStatus->Layout = layout; ExtraOpts.push_back(optStatus); } TClntCfgIface::TOptionStatusLst& TClntCfgIface::getExtraOptions() { return ExtraOpts; } void TClntCfgIface::setRouting(bool enabled) { RoutingEnabled = enabled; } SPtr TClntCfgIface::getExtaOptionState(int type) { for (TOptionStatusLst::iterator opt=ExtraOpts.begin(); opt!=ExtraOpts.end(); ++opt) if ((*opt)->OptionType == type) return (*opt); // these are the droids you are looking for return SPtr(); // not found } void TClntCfgIface::setMbit(bool m_bit) { if (!m_bit) { Stateful_ = false; } } void TClntCfgIface::setObit(bool o_bit) { if (!o_bit) { setDefaults(); } } void TClntCfgIface::setBindToAddr(SPtr link_local) { BindToAddr_ = link_local; } SPtr TClntCfgIface::getBindToAddr() { return (BindToAddr_); } // -------------------------------------------------------------------- // --- operators ------------------------------------------------------ // -------------------------------------------------------------------- ostream& operator<<(ostream& out,TClntCfgIface& iface) { SPtr addr; SPtr str; out << dec; out<<" " << endl; return out; } out << "name=\"" << iface.IfaceName << "\"" << " ifindex=\"" << iface.ID << "\">" << endl; if (iface.RapidCommit) { out << " " << endl; } else { out << " " << endl; } out << " " << endl; out << " " << endl; SPtr ia; iface.IALst.first(); while(ia=iface.IALst.get()) { out << *ia; } out << " " << endl; out << " " << endl; SPtr ta; iface.firstTA(); while (ta = iface.getTA() ) { out << *ta; } out << " " << endl; out << " " << endl; out << " " << endl; SPtr pd; iface.firstPD(); while (pd = iface.getPD()) { out << *pd; } out << " " << endl; // --- option: DNS-servers --- if (iface.isReqDNSServer()) { out << " " << endl; iface.DNSServerLst.first(); while(addr=iface.DNSServerLst.get()) out << " " << *addr << "" << endl; } else { out << " " << endl; } // --- option: DOMAIN --- if (iface.isReqDomain()) { out << " " << endl; iface.DomainLst.first(); while (str = iface.DomainLst.get()) out << " " << *str <<"" << endl; } else { out << " " << endl; } // --- option: NTP servers --- if (iface.isReqNTPServer()) { out << " " << endl; iface.NTPServerLst.first(); while(addr=iface.NTPServerLst.get()) out << " " << *addr << "" << endl; } else { out << " " << endl; } // --- option: Timezone --- if (iface.isReqTimezone()) { out << " " << iface.Timezone << "" << endl; } else { out << " " << endl; } // --- option: SIP servers --- if (iface.isReqSIPServer()) { out << " " << endl; iface.NTPServerLst.first(); while(addr=iface.NTPServerLst.get()) out << " " << *addr << "" << endl; } else { out << " " << endl; } // --- option: SIP domains --- if (iface.isReqSIPDomain()) { out << " " << endl; iface.SIPDomainLst.first(); while (str = iface.SIPDomainLst.get()) out << " " << *str <<"" << endl; } else { out << " " << endl; } // --- option: FQDN --- if (iface.isReqFQDN()) { out << " " << iface.FQDN << "" << endl; } else { out << " " << endl; } // --- option: NIS server --- if (iface.isReqNISServer()) { out << " " << endl; iface.NISServerLst.first(); while(addr=iface.NISServerLst.get()) out << " " << *addr << "" << endl; } else { out << " " << endl; } // --- option: NIS domains --- if (iface.isReqNISDomain()) { out << " " << iface.NISDomain << "" << endl; } else { out << " " << endl; } // --- option: NISP server --- if (iface.isReqNISPServer()) { out << " " << endl; iface.NISPServerLst.first(); while(addr=iface.NISPServerLst.get()) out << " " << *addr << "" << endl; } else { out << " " << endl; } // --- option: NISP domains --- if (iface.isReqNISPDomain()) { out << " " << iface.NISPDomain << "" << endl; } else { out << " " << endl; } // --- option: Lifetime --- if (iface.isReqLifetime()) { out << " " << endl; } else { out << " " << endl; } // --- option: Vendor-spec --- if (iface.isReqVendorSpec()) { SPtr opt; out << " " << endl; iface.VendorSpecLst.first(); while (opt = iface.VendorSpecLst.get()) { out << " getVendor() << "\">" << opt->getPlain() << "" << endl; } out << " " << endl; } else { out << " " << endl; } out << " " << endl; return out; } dibbler-1.0.1/ClntCfgMgr/ClntLexer.cpp0000664000175000017500000036137612556513130014452 00000000000000 #line 3 "ClntLexer.cpp" #define YY_INT_ALIGNED short int /* A lexical scanner generated by flex */ #define FLEX_SCANNER #define YY_FLEX_MAJOR_VERSION 2 #define YY_FLEX_MINOR_VERSION 5 #define YY_FLEX_SUBMINOR_VERSION 39 #if YY_FLEX_SUBMINOR_VERSION > 0 #define FLEX_BETA #endif /* The c++ scanner is a mess. The FlexLexer.h header file relies on the * following macro. This is required in order to pass the c++-multiple-scanners * test in the regression suite. We get reports that it breaks inheritance. * We will address this in a future release of flex, or omit the C++ scanner * altogether. */ #define yyFlexLexer yyFlexLexer /* First, we deal with platform-specific or compiler-specific issues. */ /* begin standard C headers. */ /* end standard C headers. */ /* flex integer type definitions */ #ifndef FLEXINT_H #define FLEXINT_H /* C99 systems have . Non-C99 systems may or may not. */ #if defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L /* C99 says to define __STDC_LIMIT_MACROS before including stdint.h, * if you want the limit (max/min) macros for int types. */ #ifndef __STDC_LIMIT_MACROS #define __STDC_LIMIT_MACROS 1 #endif #include typedef int8_t flex_int8_t; typedef uint8_t flex_uint8_t; typedef int16_t flex_int16_t; typedef uint16_t flex_uint16_t; typedef int32_t flex_int32_t; typedef uint32_t flex_uint32_t; #else typedef signed char flex_int8_t; typedef short int flex_int16_t; typedef int flex_int32_t; typedef unsigned char flex_uint8_t; typedef unsigned short int flex_uint16_t; typedef unsigned int flex_uint32_t; /* Limits of integral types. */ #ifndef INT8_MIN #define INT8_MIN (-128) #endif #ifndef INT16_MIN #define INT16_MIN (-32767-1) #endif #ifndef INT32_MIN #define INT32_MIN (-2147483647-1) #endif #ifndef INT8_MAX #define INT8_MAX (127) #endif #ifndef INT16_MAX #define INT16_MAX (32767) #endif #ifndef INT32_MAX #define INT32_MAX (2147483647) #endif #ifndef UINT8_MAX #define UINT8_MAX (255U) #endif #ifndef UINT16_MAX #define UINT16_MAX (65535U) #endif #ifndef UINT32_MAX #define UINT32_MAX (4294967295U) #endif #endif /* ! C99 */ #endif /* ! FLEXINT_H */ /* begin standard C++ headers. */ #include #include #include #include #include /* end standard C++ headers. */ #ifdef __cplusplus /* The "const" storage-class-modifier is valid. */ #define YY_USE_CONST #else /* ! __cplusplus */ /* C99 requires __STDC__ to be defined as 1. */ #if defined (__STDC__) #define YY_USE_CONST #endif /* defined (__STDC__) */ #endif /* ! __cplusplus */ #ifdef YY_USE_CONST #define yyconst const #else #define yyconst #endif /* Returned upon end-of-file. */ #define YY_NULL 0 /* Promotes a possibly negative, possibly signed char to an unsigned * integer for use as an array index. If the signed char is negative, * we want to instead treat it as an 8-bit unsigned char, hence the * double cast. */ #define YY_SC_TO_UI(c) ((unsigned int) (unsigned char) c) /* Enter a start condition. This macro really ought to take a parameter, * but we do it the disgusting crufty way forced on us by the ()-less * definition of BEGIN. */ #define BEGIN (yy_start) = 1 + 2 * /* Translate the current start state into a value that can be later handed * to BEGIN to return to the state. The YYSTATE alias is for lex * compatibility. */ #define YY_START (((yy_start) - 1) / 2) #define YYSTATE YY_START /* Action number for EOF rule of a given start state. */ #define YY_STATE_EOF(state) (YY_END_OF_BUFFER + state + 1) /* Special action meaning "start processing a new file". */ #define YY_NEW_FILE yyrestart( yyin ) #define YY_END_OF_BUFFER_CHAR 0 /* Size of default input buffer. */ #ifndef YY_BUF_SIZE #ifdef __ia64__ /* On IA-64, the buffer size is 16k, not 8k. * Moreover, YY_BUF_SIZE is 2*YY_READ_BUF_SIZE in the general case. * Ditto for the __ia64__ case accordingly. */ #define YY_BUF_SIZE 32768 #else #define YY_BUF_SIZE 16384 #endif /* __ia64__ */ #endif /* The state buf must be large enough to hold one state per character in the main buffer. */ #define YY_STATE_BUF_SIZE ((YY_BUF_SIZE + 2) * sizeof(yy_state_type)) #ifndef YY_TYPEDEF_YY_BUFFER_STATE #define YY_TYPEDEF_YY_BUFFER_STATE typedef struct yy_buffer_state *YY_BUFFER_STATE; #endif #ifndef YY_TYPEDEF_YY_SIZE_T #define YY_TYPEDEF_YY_SIZE_T typedef size_t yy_size_t; #endif extern yy_size_t yyleng; #define EOB_ACT_CONTINUE_SCAN 0 #define EOB_ACT_END_OF_FILE 1 #define EOB_ACT_LAST_MATCH 2 /* Note: We specifically omit the test for yy_rule_can_match_eol because it requires * access to the local variable yy_act. Since yyless() is a macro, it would break * existing scanners that call yyless() from OUTSIDE yylex. * One obvious solution it to make yy_act a global. I tried that, and saw * a 5% performance hit in a non-yylineno scanner, because yy_act is * normally declared as a register variable-- so it is not worth it. */ #define YY_LESS_LINENO(n) \ do { \ int yyl;\ for ( yyl = n; yyl < yyleng; ++yyl )\ if ( yytext[yyl] == '\n' )\ --yylineno;\ }while(0) #define YY_LINENO_REWIND_TO(dst) \ do {\ const char *p;\ for ( p = yy_cp-1; p >= (dst); --p)\ if ( *p == '\n' )\ --yylineno;\ }while(0) /* Return all but the first "n" matched characters back to the input stream. */ #define yyless(n) \ do \ { \ /* Undo effects of setting up yytext. */ \ int yyless_macro_arg = (n); \ YY_LESS_LINENO(yyless_macro_arg);\ *yy_cp = (yy_hold_char); \ YY_RESTORE_YY_MORE_OFFSET \ (yy_c_buf_p) = yy_cp = yy_bp + yyless_macro_arg - YY_MORE_ADJ; \ YY_DO_BEFORE_ACTION; /* set up yytext again */ \ } \ while ( 0 ) #define unput(c) yyunput( c, (yytext_ptr) ) #ifndef YY_STRUCT_YY_BUFFER_STATE #define YY_STRUCT_YY_BUFFER_STATE struct yy_buffer_state { std::istream* yy_input_file; char *yy_ch_buf; /* input buffer */ char *yy_buf_pos; /* current position in input buffer */ /* Size of input buffer in bytes, not including room for EOB * characters. */ yy_size_t yy_buf_size; /* Number of characters read into yy_ch_buf, not including EOB * characters. */ yy_size_t yy_n_chars; /* Whether we "own" the buffer - i.e., we know we created it, * and can realloc() it to grow it, and should free() it to * delete it. */ int yy_is_our_buffer; /* Whether this is an "interactive" input source; if so, and * if we're using stdio for input, then we want to use getc() * instead of fread(), to make sure we stop fetching input after * each newline. */ int yy_is_interactive; /* Whether we're considered to be at the beginning of a line. * If so, '^' rules will be active on the next match, otherwise * not. */ int yy_at_bol; int yy_bs_lineno; /**< The line count. */ int yy_bs_column; /**< The column count. */ /* Whether to try to fill the input buffer when we reach the * end of it. */ int yy_fill_buffer; int yy_buffer_status; #define YY_BUFFER_NEW 0 #define YY_BUFFER_NORMAL 1 /* When an EOF's been seen but there's still some text to process * then we mark the buffer as YY_EOF_PENDING, to indicate that we * shouldn't try reading from the input source any more. We might * still have a bunch of tokens to match, though, because of * possible backing-up. * * When we actually see the EOF, we change the status to "new" * (via yyrestart()), so that the user can continue scanning by * just pointing yyin at a new input file. */ #define YY_BUFFER_EOF_PENDING 2 }; #endif /* !YY_STRUCT_YY_BUFFER_STATE */ /* We provide macros for accessing buffer states in case in the * future we want to put the buffer states in a more general * "scanner state". * * Returns the top of the stack, or NULL. */ #define YY_CURRENT_BUFFER ( (yy_buffer_stack) \ ? (yy_buffer_stack)[(yy_buffer_stack_top)] \ : NULL) /* Same as previous macro, but useful when we know that the buffer stack is not * NULL or when we need an lvalue. For internal use only. */ #define YY_CURRENT_BUFFER_LVALUE (yy_buffer_stack)[(yy_buffer_stack_top)] void *yyalloc (yy_size_t ); void *yyrealloc (void *,yy_size_t ); void yyfree (void * ); #define yy_new_buffer yy_create_buffer #define yy_set_interactive(is_interactive) \ { \ if ( ! YY_CURRENT_BUFFER ){ \ yyensure_buffer_stack (); \ YY_CURRENT_BUFFER_LVALUE = \ yy_create_buffer( yyin, YY_BUF_SIZE ); \ } \ YY_CURRENT_BUFFER_LVALUE->yy_is_interactive = is_interactive; \ } #define yy_set_bol(at_bol) \ { \ if ( ! YY_CURRENT_BUFFER ){\ yyensure_buffer_stack (); \ YY_CURRENT_BUFFER_LVALUE = \ yy_create_buffer( yyin, YY_BUF_SIZE ); \ } \ YY_CURRENT_BUFFER_LVALUE->yy_at_bol = at_bol; \ } #define YY_AT_BOL() (YY_CURRENT_BUFFER_LVALUE->yy_at_bol) /* Begin user sect3 */ #define YY_SKIP_YYWRAP typedef unsigned char YY_CHAR; #define yytext_ptr yytext #define YY_INTERACTIVE #include int yyFlexLexer::yywrap() { return 1; } /* Done after the current pattern has been matched and before the * corresponding action - sets up yytext. */ #define YY_DO_BEFORE_ACTION \ (yytext_ptr) = yy_bp; \ yyleng = (size_t) (yy_cp - yy_bp); \ (yy_hold_char) = *yy_cp; \ *yy_cp = '\0'; \ (yy_c_buf_p) = yy_cp; #define YY_NUM_RULES 101 #define YY_END_OF_BUFFER 102 /* This struct is not used in this scanner, but its presence is necessary. */ struct yy_trans_info { flex_int32_t yy_verify; flex_int32_t yy_nxt; }; static yyconst flex_int16_t yy_accept[867] = { 0, 1, 1, 0, 0, 0, 0, 102, 100, 2, 1, 1, 100, 82, 100, 100, 99, 99, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 86, 86, 101, 1, 1, 1, 0, 94, 82, 0, 94, 84, 83, 99, 0, 0, 98, 0, 91, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 11, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 53, 95, 95, 95, 95, 95, 95, 95, 95, 25, 26, 12, 95, 95, 95, 95, 95, 85, 83, 99, 0, 0, 0, 90, 96, 89, 89, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 8, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 99, 0, 0, 0, 0, 88, 88, 0, 89, 0, 89, 95, 95, 77, 95, 95, 95, 95, 95, 95, 95, 95, 7, 95, 34, 13, 95, 95, 95, 95, 95, 10, 0, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 99, 0, 97, 0, 0, 0, 88, 0, 88, 0, 89, 89, 89, 89, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 3, 95, 95, 95, 95, 95, 95, 95, 0, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 0, 0, 0, 0, 0, 88, 88, 88, 88, 0, 89, 89, 89, 0, 89, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 29, 95, 95, 95, 95, 95, 35, 95, 95, 95, 95, 95, 95, 95, 0, 0, 95, 95, 95, 95, 95, 27, 95, 54, 95, 95, 95, 95, 95, 20, 95, 95, 95, 95, 95, 6, 95, 95, 95, 95, 95, 0, 0, 0, 0, 88, 88, 88, 0, 88, 0, 0, 89, 89, 89, 89, 95, 5, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 58, 56, 95, 95, 95, 95, 95, 95, 95, 95, 95, 0, 0, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 43, 95, 95, 95, 95, 95, 95, 49, 95, 95, 95, 97, 0, 0, 0, 0, 0, 88, 88, 88, 88, 0, 89, 89, 89, 0, 89, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 57, 95, 95, 95, 95, 42, 95, 95, 16, 17, 0, 0, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 19, 0, 0, 0, 0, 88, 88, 88, 0, 88, 93, 89, 89, 89, 89, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 55, 95, 95, 95, 95, 15, 0, 0, 95, 95, 4, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 14, 95, 31, 95, 95, 0, 0, 0, 0, 92, 88, 88, 88, 88, 89, 89, 89, 0, 89, 95, 95, 95, 95, 95, 95, 67, 95, 95, 95, 95, 95, 95, 95, 28, 95, 95, 95, 95, 18, 0, 0, 39, 38, 30, 95, 95, 95, 95, 95, 95, 95, 95, 95, 33, 32, 95, 95, 95, 95, 97, 0, 0, 88, 88, 88, 0, 88, 89, 89, 89, 89, 81, 95, 95, 95, 95, 95, 66, 95, 95, 95, 95, 68, 95, 95, 95, 95, 61, 41, 40, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 59, 0, 0, 0, 0, 88, 88, 88, 88, 89, 89, 89, 0, 89, 9, 95, 95, 63, 95, 95, 95, 37, 95, 69, 95, 80, 95, 51, 95, 95, 95, 95, 95, 47, 95, 95, 95, 76, 95, 95, 0, 0, 0, 88, 88, 88, 0, 88, 89, 89, 89, 89, 95, 95, 64, 95, 36, 95, 95, 95, 62, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 97, 0, 0, 0, 88, 88, 88, 88, 89, 89, 89, 0, 89, 95, 65, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 44, 95, 95, 23, 0, 0, 87, 90, 88, 88, 88, 0, 88, 89, 89, 89, 89, 95, 79, 70, 95, 95, 95, 95, 95, 95, 95, 95, 24, 95, 0, 0, 87, 0, 88, 88, 88, 88, 88, 89, 89, 89, 0, 89, 95, 71, 95, 95, 95, 95, 95, 46, 95, 95, 95, 95, 95, 97, 87, 90, 88, 0, 88, 88, 88, 88, 89, 89, 89, 95, 95, 95, 95, 95, 95, 21, 95, 45, 52, 95, 95, 0, 87, 88, 88, 88, 88, 89, 89, 89, 95, 72, 73, 74, 75, 95, 22, 48, 95, 0, 88, 88, 0, 88, 88, 89, 95, 95, 95, 97, 88, 88, 89, 95, 95, 95, 0, 88, 88, 0, 60, 95, 50, 87, 88, 88, 78, 87, 88, 88, 0, 0, 88, 88, 0, 88, 88, 0, 97, 88, 88, 0, 88, 88, 0, 88, 88, 0 } ; static yyconst flex_int32_t yy_ec[256] = { 0, 1, 1, 1, 1, 1, 1, 1, 1, 2, 3, 1, 1, 4, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 5, 6, 1, 1, 1, 7, 1, 1, 8, 9, 1, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 20, 22, 1, 1, 1, 1, 1, 1, 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, 1, 1, 1, 1, 1, 1, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 } ; static yyconst flex_int32_t yy_meta[75] = { 0, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 3, 3, 3, 3, 3, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 3, 3, 3, 3, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 } ; static yyconst flex_int16_t yy_base[952] = { 0, 0, 0, 1425, 1415, 0, 0, 1393, 4032, 4032, 72, 74, 1380, 0, 1377, 71, 71, 34, 1361, 134, 183, 184, 228, 215, 240, 297, 54, 77, 71, 321, 210, 223, 308, 331, 354, 67, 87, 67, 4032, 1370, 4032, 108, 112, 115, 1376, 4032, 0, 1373, 1371, 4032, 0, 399, 1355, 417, 4032, 0, 443, 0, 485, 83, 171, 0, 179, 176, 185, 188, 200, 190, 227, 239, 235, 252, 235, 269, 280, 331, 278, 279, 304, 300, 1330, 317, 333, 332, 0, 348, 338, 489, 336, 343, 390, 408, 493, 0, 0, 0, 411, 416, 457, 482, 479, 4032, 0, 547, 1317, 461, 1316, 591, 0, 635, 565, 677, 480, 482, 487, 495, 500, 486, 501, 1327, 506, 494, 505, 505, 551, 0, 568, 570, 577, 607, 612, 1326, 620, 123, 655, 1325, 634, 651, 655, 679, 674, 685, 676, 672, 684, 1324, 678, 675, 687, 692, 695, 690, 696, 690, 737, 616, 1311, 1283, 1267, 783, 755, 764, 827, 869, 801, 911, 803, 0, 784, 1277, 1276, 1275, 798, 831, 842, 840, 1274, 835, 1273, 0, 864, 865, 873, 873, 917, 0, 1272, 917, 907, 904, 1262, 909, 923, 921, 912, 924, 913, 925, 919, 959, 1261, 939, 961, 1260, 944, 961, 951, 1259, 988, 1245, 1101, 1092, 1091, 1014, 1025, 1067, 1043, 1085, 1111, 1129, 1155, 1173, 1090, 951, 949, 956, 1162, 952, 957, 954, 971, 1035, 1058, 1176, 1110, 1154, 0, 1165, 1156, 1168, 1164, 1185, 1176, 1191, 1189, 1179, 1190, 1183, 1193, 1191, 1196, 1193, 1188, 1101, 1207, 1195, 1220, 1212, 1207, 1213, 1224, 1227, 1219, 1212, 1226, 1214, 1223, 1100, 1225, 1240, 1087, 1086, 1085, 1051, 1282, 1293, 1311, 1337, 1355, 1138, 1381, 1050, 1393, 1435, 1411, 1245, 1282, 1304, 1345, 1411, 1399, 1413, 1404, 1417, 1437, 1060, 1429, 0, 1434, 1435, 1438, 1426, 1439, 0, 1431, 1059, 1441, 1443, 1434, 1453, 1445, 1444, 1455, 1455, 1451, 1464, 1453, 1486, 0, 1483, 1058, 1486, 1481, 1057, 1056, 1484, 0, 1479, 1475, 1483, 1494, 1055, 0, 1485, 1482, 1491, 1045, 1495, 1015, 997, 996, 1540, 1551, 937, 1563, 1605, 1581, 1623, 1649, 1660, 1678, 1704, 1722, 1569, 906, 1584, 1617, 1648, 1671, 1721, 903, 1708, 1711, 1730, 1703, 1715, 0, 1707, 1712, 1724, 1725, 1726, 1735, 1726, 1737, 1738, 1740, 1734, 1739, 1757, 1737, 1751, 1739, 902, 1758, 1769, 1771, 1761, 1770, 1759, 1778, 0, 1779, 1759, 1768, 1770, 1772, 1777, 0, 1783, 1774, 1776, 889, 888, 887, 886, 1832, 1843, 1854, 1872, 1898, 1916, 1881, 1942, 884, 1954, 1996, 1972, 1795, 1850, 1887, 1903, 1969, 1958, 1967, 1968, 1995, 1987, 2003, 1996, 1995, 1999, 2007, 895, 0, 2008, 2000, 894, 2000, 0, 1998, 2005, 0, 0, 2017, 1997, 2011, 2016, 2022, 2025, 2029, 893, 2028, 2043, 2036, 2029, 2046, 2031, 2044, 2049, 2053, 2041, 2055, 2057, 2057, 2048, 0, 880, 849, 848, 2074, 2102, 847, 2114, 2156, 2132, 2141, 2200, 2174, 2244, 2218, 2143, 2155, 858, 2190, 2210, 2211, 2240, 2253, 2251, 2241, 2242, 2257, 2245, 2259, 2243, 2246, 0, 2243, 2251, 2261, 2247, 0, 2258, 2263, 2255, 2252, 0, 2259, 2269, 2286, 857, 2285, 2286, 2282, 2283, 2282, 2292, 2289, 2299, 0, 2306, 0, 2305, 2306, 844, 842, 841, 840, 2321, 2349, 2367, 2393, 2411, 2437, 839, 2449, 2491, 2467, 2338, 2356, 2404, 2463, 2469, 2471, 0, 2450, 2487, 2499, 2482, 2501, 2500, 2497, 0, 2489, 2507, 2494, 2505, 0, 2497, 2494, 0, 0, 0, 2493, 2505, 2510, 2530, 2519, 2516, 2521, 2505, 2528, 0, 0, 2526, 850, 2525, 2543, 837, 836, 807, 2565, 806, 2587, 2629, 2605, 2673, 2647, 2717, 2691, 0, 2527, 2534, 2591, 2610, 2666, 0, 2680, 2684, 2706, 817, 0, 2713, 2723, 2717, 2726, 0, 4032, 4032, 2712, 2726, 2715, 2725, 2730, 2729, 2717, 816, 2733, 2736, 2727, 2727, 2733, 0, 803, 802, 801, 773, 2780, 2798, 2824, 2842, 2868, 770, 2880, 2922, 2898, 0, 2782, 2798, 0, 2832, 2898, 2892, 0, 2918, 0, 2900, 0, 2917, 0, 2928, 2912, 2929, 2918, 2937, 0, 2938, 2922, 2926, 0, 2927, 2930, 713, 712, 711, 2981, 710, 2993, 3035, 3011, 3079, 3053, 3123, 3097, 715, 2932, 0, 2998, 0, 3031, 3079, 3095, 0, 3085, 3127, 3128, 3112, 3115, 3133, 3118, 3124, 714, 3134, 657, 656, 655, 654, 3177, 3195, 3221, 3239, 3265, 653, 3277, 3319, 3295, 3123, 0, 3166, 656, 3202, 3217, 3291, 3283, 3282, 3298, 3310, 3327, 0, 3325, 3314, 0, 650, 649, 648, 0, 3344, 647, 3370, 3412, 3388, 3456, 3430, 3500, 3474, 3329, 0, 0, 377, 658, 3339, 3375, 3403, 3446, 3466, 3477, 0, 3494, 645, 644, 605, 604, 603, 3547, 3521, 3591, 3565, 3609, 602, 3635, 0, 3653, 3494, 0, 123, 602, 608, 3546, 3560, 0, 3560, 3598, 3639, 3638, 3634, 571, 570, 4032, 569, 0, 3693, 568, 3705, 3679, 3749, 3723, 0, 3636, 572, 569, 526, 475, 3663, 0, 3700, 0, 0, 3693, 3710, 467, 466, 465, 464, 3793, 3768, 3811, 463, 0, 3770, 0, 0, 0, 0, 3792, 0, 0, 3803, 462, 461, 423, 0, 3837, 4032, 0, 3794, 3811, 3801, 422, 421, 420, 4032, 3796, 3812, 3811, 419, 418, 388, 0, 0, 3808, 0, 386, 385, 384, 0, 382, 375, 374, 0, 372, 365, 321, 0, 320, 316, 0, 315, 314, 308, 306, 279, 273, 0, 271, 264, 4032, 3875, 3879, 3883, 3887, 3891, 3895, 3897, 230, 3899, 3901, 3903, 3905, 3907, 3909, 3911, 3913, 3915, 3917, 3919, 3921, 3923, 3925, 3927, 3929, 3931, 3933, 3935, 3937, 3939, 3941, 3943, 3945, 3947, 3949, 3951, 3953, 3955, 3957, 3959, 3961, 3963, 3965, 3967, 3969, 229, 3971, 3973, 3975, 227, 3977, 3979, 3981, 225, 222, 3983, 3985, 3987, 220, 3989, 3991, 219, 214, 3993, 3995, 3997, 3999, 4001, 212, 4003, 4005, 4007, 4009, 4011, 143, 4013, 4015, 4017, 139, 4019, 134, 4021, 4023, 4025, 79, 4027 } ; static yyconst flex_int16_t yy_def[952] = { 0, 866, 1, 867, 867, 868, 868, 866, 866, 866, 866, 866, 869, 870, 871, 866, 866, 16, 866, 866, 19, 19, 19, 19, 19, 19, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 866, 866, 866, 866, 866, 866, 869, 866, 870, 871, 866, 866, 872, 866, 873, 51, 866, 874, 866, 25, 25, 58, 58, 25, 25, 25, 25, 58, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 866, 872, 866, 875, 103, 876, 866, 874, 866, 109, 58, 111, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 866, 154, 877, 878, 879, 866, 159, 866, 866, 866, 162, 111, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 866, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 155, 155, 878, 880, 881, 866, 866, 866, 214, 866, 866, 218, 866, 220, 165, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 866, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 882, 866, 883, 884, 866, 866, 275, 866, 277, 866, 866, 866, 866, 866, 282, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 866, 866, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 885, 886, 887, 866, 866, 866, 866, 866, 344, 866, 866, 866, 349, 866, 351, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 866, 866, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 883, 866, 888, 889, 866, 866, 866, 408, 866, 410, 866, 866, 866, 866, 866, 415, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 866, 866, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 890, 891, 892, 866, 866, 866, 866, 866, 473, 866, 866, 477, 866, 479, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 866, 866, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 893, 866, 894, 895, 866, 866, 530, 866, 532, 866, 866, 866, 866, 536, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 866, 866, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 896, 897, 898, 866, 866, 866, 866, 584, 866, 587, 866, 589, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 866, 866, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 899, 866, 900, 901, 866, 628, 866, 630, 866, 866, 866, 866, 634, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 902, 903, 904, 866, 866, 866, 866, 668, 866, 671, 866, 673, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 905, 866, 906, 907, 866, 698, 866, 700, 866, 866, 866, 866, 704, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 908, 909, 910, 911, 866, 866, 866, 866, 729, 866, 732, 866, 734, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 912, 866, 913, 866, 914, 866, 754, 866, 756, 866, 866, 866, 915, 760, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 916, 917, 866, 918, 919, 866, 866, 866, 783, 866, 785, 920, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 921, 866, 922, 923, 866, 804, 866, 866, 924, 25, 25, 25, 25, 25, 25, 25, 25, 25, 925, 866, 926, 927, 866, 866, 928, 25, 25, 25, 929, 930, 931, 866, 25, 25, 25, 932, 866, 933, 934, 25, 25, 25, 935, 936, 937, 25, 938, 866, 939, 940, 941, 942, 943, 944, 866, 945, 946, 866, 947, 948, 941, 866, 949, 950, 951, 866, 0, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866 } ; static yyconst flex_int16_t yy_nxt[4107] = { 0, 8, 9, 10, 11, 12, 13, 14, 8, 8, 8, 8, 15, 16, 17, 17, 17, 17, 17, 17, 17, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 25, 25, 28, 25, 29, 30, 31, 25, 32, 33, 34, 35, 36, 37, 25, 25, 25, 19, 20, 21, 22, 23, 24, 25, 26, 27, 25, 25, 28, 25, 29, 30, 31, 25, 32, 33, 34, 35, 36, 37, 25, 25, 25, 41, 42, 43, 42, 49, 866, 72, 757, 50, 51, 51, 51, 51, 51, 51, 51, 51, 51, 52, 53, 53, 53, 53, 53, 53, 73, 54, 76, 97, 100, 74, 866, 72, 77, 112, 98, 41, 42, 75, 99, 43, 42, 55, 41, 42, 53, 53, 53, 53, 53, 53, 73, 54, 76, 97, 100, 74, 186, 187, 77, 112, 98, 859, 789, 75, 99, 790, 857, 55, 57, 57, 852, 58, 58, 58, 58, 58, 58, 58, 58, 58, 52, 58, 58, 58, 59, 58, 60, 57, 61, 57, 57, 57, 57, 57, 62, 57, 57, 57, 57, 57, 57, 63, 57, 57, 57, 57, 57, 58, 58, 58, 59, 58, 60, 57, 61, 57, 57, 57, 57, 57, 62, 57, 57, 57, 57, 57, 57, 63, 57, 57, 57, 57, 57, 58, 58, 58, 58, 113, 64, 844, 114, 831, 115, 57, 57, 116, 830, 824, 117, 808, 57, 57, 803, 118, 787, 119, 753, 108, 82, 58, 58, 58, 58, 113, 64, 58, 114, 58, 115, 57, 57, 116, 83, 84, 117, 57, 57, 57, 65, 118, 58, 119, 57, 66, 82, 70, 120, 85, 67, 68, 58, 58, 58, 58, 122, 69, 121, 123, 83, 84, 57, 57, 124, 71, 65, 125, 58, 57, 57, 66, 863, 70, 120, 85, 67, 68, 58, 863, 58, 863, 122, 69, 121, 123, 126, 856, 57, 127, 124, 71, 130, 125, 131, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 866, 57, 57, 57, 57, 57, 57, 126, 57, 866, 127, 863, 86, 130, 57, 131, 87, 856, 860, 856, 132, 57, 133, 849, 856, 78, 88, 57, 57, 57, 57, 57, 57, 79, 57, 128, 135, 89, 86, 80, 57, 136, 87, 90, 81, 91, 132, 57, 133, 93, 94, 78, 88, 129, 92, 137, 138, 139, 95, 79, 143, 128, 135, 89, 144, 80, 96, 136, 849, 90, 81, 91, 764, 765, 766, 778, 767, 849, 838, 129, 92, 137, 138, 139, 95, 850, 143, 849, 838, 752, 144, 838, 96, 103, 103, 103, 103, 103, 103, 103, 103, 103, 104, 105, 105, 105, 105, 105, 105, 145, 54, 105, 105, 105, 105, 105, 105, 105, 105, 105, 146, 821, 726, 838, 821, 835, 821, 149, 150, 105, 105, 105, 105, 105, 105, 145, 54, 109, 109, 109, 109, 109, 109, 109, 109, 109, 146, 110, 110, 110, 110, 110, 110, 149, 150, 155, 155, 155, 155, 155, 155, 155, 155, 155, 780, 697, 761, 821, 780, 752, 107, 813, 151, 110, 110, 110, 110, 110, 110, 111, 111, 111, 111, 111, 111, 111, 111, 111, 104, 111, 111, 111, 111, 111, 111, 140, 61, 147, 151, 152, 153, 166, 141, 167, 168, 142, 169, 170, 171, 172, 174, 175, 176, 177, 148, 111, 111, 111, 111, 111, 111, 140, 61, 147, 812, 152, 153, 166, 141, 167, 168, 142, 169, 170, 171, 172, 174, 175, 176, 177, 148, 154, 154, 154, 154, 154, 154, 154, 154, 154, 52, 155, 155, 155, 155, 155, 155, 866, 54, 164, 164, 164, 164, 164, 164, 164, 164, 164, 178, 811, 810, 730, 780, 752, 800, 179, 180, 155, 155, 155, 155, 155, 155, 181, 54, 159, 159, 159, 159, 159, 159, 159, 159, 159, 178, 160, 160, 160, 160, 160, 160, 179, 180, 792, 791, 705, 780, 778, 752, 181, 209, 209, 209, 209, 209, 209, 209, 209, 209, 182, 183, 160, 160, 160, 160, 160, 160, 161, 185, 162, 162, 162, 162, 162, 162, 162, 162, 162, 163, 164, 164, 164, 164, 164, 164, 182, 183, 697, 627, 768, 669, 752, 697, 107, 185, 738, 635, 726, 697, 627, 723, 188, 190, 191, 192, 164, 164, 164, 164, 164, 164, 165, 165, 165, 165, 165, 165, 165, 165, 165, 52, 165, 165, 165, 165, 165, 165, 188, 190, 191, 192, 193, 194, 195, 196, 197, 198, 200, 201, 202, 203, 204, 205, 206, 207, 721, 707, 165, 165, 165, 165, 165, 165, 585, 697, 627, 528, 193, 194, 195, 196, 197, 198, 200, 201, 202, 203, 204, 205, 206, 207, 208, 208, 208, 208, 208, 208, 208, 208, 208, 52, 209, 209, 209, 209, 209, 209, 866, 54, 216, 216, 216, 216, 216, 216, 216, 216, 216, 217, 217, 217, 217, 217, 217, 217, 217, 217, 209, 209, 209, 209, 209, 209, 537, 54, 213, 107, 214, 214, 214, 214, 214, 214, 214, 214, 214, 215, 216, 216, 216, 216, 216, 216, 866, 223, 219, 219, 219, 219, 219, 219, 219, 219, 219, 627, 528, 107, 657, 645, 474, 627, 224, 225, 216, 216, 216, 216, 216, 216, 161, 229, 218, 218, 218, 218, 218, 218, 218, 218, 218, 163, 219, 219, 219, 219, 219, 219, 224, 225, 528, 624, 621, 416, 107, 528, 405, 229, 405, 567, 541, 345, 528, 405, 230, 231, 232, 234, 219, 219, 219, 219, 219, 219, 220, 220, 220, 220, 220, 220, 220, 220, 220, 236, 221, 221, 221, 221, 221, 221, 230, 231, 232, 234, 107, 510, 499, 496, 283, 237, 107, 405, 273, 467, 450, 426, 238, 239, 419, 236, 221, 221, 221, 221, 221, 221, 222, 222, 222, 222, 222, 222, 222, 222, 222, 237, 222, 222, 222, 222, 222, 222, 238, 239, 240, 245, 247, 248, 250, 253, 254, 255, 251, 241, 242, 243, 252, 256, 257, 258, 246, 215, 222, 222, 222, 222, 222, 222, 262, 266, 240, 245, 247, 248, 250, 253, 254, 255, 251, 241, 242, 243, 252, 256, 257, 258, 246, 259, 263, 267, 268, 285, 286, 287, 262, 266, 292, 293, 295, 264, 296, 294, 260, 208, 208, 208, 208, 208, 208, 208, 208, 208, 866, 259, 263, 267, 268, 285, 286, 287, 405, 273, 292, 293, 295, 264, 296, 294, 260, 274, 274, 274, 274, 274, 274, 274, 274, 274, 213, 273, 275, 275, 275, 275, 275, 275, 275, 275, 275, 215, 276, 276, 276, 276, 276, 276, 866, 400, 276, 276, 276, 276, 276, 276, 276, 276, 276, 396, 390, 389, 386, 371, 363, 297, 163, 107, 276, 276, 276, 276, 276, 276, 277, 277, 277, 277, 277, 277, 277, 277, 277, 298, 278, 278, 278, 278, 278, 278, 279, 297, 217, 217, 217, 217, 217, 217, 217, 217, 217, 273, 158, 107, 335, 321, 866, 273, 158, 298, 278, 278, 278, 278, 278, 278, 161, 270, 280, 280, 280, 280, 280, 280, 280, 280, 280, 163, 281, 281, 281, 281, 281, 281, 866, 302, 281, 281, 281, 281, 281, 281, 281, 281, 281, 347, 347, 347, 347, 347, 347, 347, 347, 347, 281, 281, 281, 281, 281, 281, 161, 302, 282, 282, 282, 282, 282, 282, 282, 282, 282, 283, 284, 284, 284, 284, 284, 284, 866, 288, 284, 284, 284, 284, 284, 284, 284, 284, 284, 303, 304, 289, 305, 306, 290, 307, 291, 299, 284, 284, 284, 284, 284, 284, 300, 288, 308, 309, 310, 311, 313, 314, 301, 315, 316, 303, 304, 289, 305, 306, 290, 307, 291, 299, 312, 317, 318, 319, 320, 322, 300, 323, 308, 309, 310, 311, 313, 314, 301, 315, 316, 324, 325, 326, 327, 328, 329, 330, 331, 332, 312, 317, 318, 319, 320, 322, 333, 323, 334, 336, 337, 866, 353, 269, 265, 261, 249, 324, 325, 326, 327, 328, 329, 330, 331, 332, 244, 235, 233, 228, 227, 226, 333, 107, 334, 336, 337, 341, 353, 274, 274, 274, 274, 274, 274, 274, 274, 274, 213, 158, 342, 342, 342, 342, 342, 342, 342, 342, 342, 215, 343, 343, 343, 343, 343, 343, 866, 354, 343, 343, 343, 343, 343, 343, 343, 343, 343, 158, 199, 189, 184, 173, 158, 107, 134, 355, 343, 343, 343, 343, 343, 343, 213, 354, 344, 344, 344, 344, 344, 344, 344, 344, 344, 345, 346, 346, 346, 346, 346, 346, 866, 355, 346, 346, 346, 346, 346, 346, 346, 346, 346, 107, 47, 356, 48, 45, 101, 56, 48, 45, 346, 346, 346, 346, 346, 346, 161, 866, 348, 348, 348, 348, 348, 348, 348, 348, 348, 163, 161, 356, 349, 349, 349, 349, 349, 349, 349, 349, 349, 283, 350, 350, 350, 350, 350, 350, 866, 39, 350, 350, 350, 350, 350, 350, 350, 350, 350, 39, 866, 866, 866, 866, 357, 358, 359, 360, 350, 350, 350, 350, 350, 350, 351, 351, 351, 351, 351, 351, 351, 351, 351, 361, 352, 352, 352, 352, 352, 352, 357, 358, 359, 360, 362, 364, 365, 366, 367, 368, 369, 370, 372, 373, 374, 375, 376, 377, 378, 361, 352, 352, 352, 352, 352, 352, 379, 380, 381, 382, 362, 364, 365, 366, 367, 368, 369, 370, 372, 373, 374, 375, 376, 377, 378, 383, 384, 387, 388, 391, 392, 393, 379, 380, 381, 382, 394, 395, 397, 385, 398, 399, 401, 866, 866, 866, 866, 866, 866, 866, 866, 383, 384, 387, 388, 391, 392, 393, 866, 866, 866, 866, 394, 395, 397, 385, 398, 399, 401, 406, 406, 406, 406, 406, 406, 406, 406, 406, 213, 866, 407, 407, 407, 407, 407, 407, 407, 407, 407, 215, 213, 866, 408, 408, 408, 408, 408, 408, 408, 408, 408, 345, 409, 409, 409, 409, 409, 409, 866, 866, 409, 409, 409, 409, 409, 409, 409, 409, 409, 866, 866, 866, 866, 866, 866, 418, 866, 866, 409, 409, 409, 409, 409, 409, 410, 410, 410, 410, 410, 410, 410, 410, 410, 420, 411, 411, 411, 411, 411, 411, 412, 418, 347, 347, 347, 347, 347, 347, 347, 347, 347, 866, 421, 866, 866, 866, 866, 866, 866, 420, 411, 411, 411, 411, 411, 411, 161, 866, 348, 348, 348, 348, 348, 348, 348, 348, 348, 161, 421, 413, 413, 413, 413, 413, 413, 413, 413, 413, 283, 414, 414, 414, 414, 414, 414, 866, 422, 414, 414, 414, 414, 414, 414, 414, 414, 414, 866, 866, 866, 866, 866, 866, 866, 866, 423, 414, 414, 414, 414, 414, 414, 161, 422, 415, 415, 415, 415, 415, 415, 415, 415, 415, 416, 417, 417, 417, 417, 417, 417, 866, 423, 417, 417, 417, 417, 417, 417, 417, 417, 417, 424, 427, 428, 432, 433, 434, 435, 436, 437, 417, 417, 417, 417, 417, 417, 425, 429, 438, 439, 440, 441, 442, 430, 443, 431, 444, 424, 427, 428, 432, 433, 434, 435, 436, 437, 445, 446, 447, 448, 449, 451, 425, 429, 438, 439, 440, 441, 442, 430, 443, 431, 444, 452, 453, 454, 455, 456, 457, 458, 459, 460, 445, 446, 447, 448, 449, 451, 461, 462, 463, 464, 465, 466, 866, 481, 866, 866, 866, 452, 453, 454, 455, 456, 457, 458, 459, 460, 866, 866, 866, 866, 866, 866, 461, 462, 463, 464, 465, 466, 470, 481, 406, 406, 406, 406, 406, 406, 406, 406, 406, 213, 866, 407, 407, 407, 407, 407, 407, 407, 407, 407, 213, 866, 471, 471, 471, 471, 471, 471, 471, 471, 471, 345, 472, 472, 472, 472, 472, 472, 866, 482, 472, 472, 472, 472, 472, 472, 472, 472, 472, 476, 476, 476, 476, 476, 476, 476, 476, 476, 472, 472, 472, 472, 472, 472, 213, 482, 473, 473, 473, 473, 473, 473, 473, 473, 473, 474, 475, 475, 475, 475, 475, 475, 866, 483, 475, 475, 475, 475, 475, 475, 475, 475, 475, 866, 866, 484, 866, 866, 866, 866, 866, 866, 475, 475, 475, 475, 475, 475, 161, 483, 348, 348, 348, 348, 348, 348, 348, 348, 348, 283, 161, 484, 477, 477, 477, 477, 477, 477, 477, 477, 477, 416, 478, 478, 478, 478, 478, 478, 866, 866, 478, 478, 478, 478, 478, 478, 478, 478, 478, 866, 866, 866, 866, 866, 485, 486, 487, 488, 478, 478, 478, 478, 478, 478, 479, 479, 479, 479, 479, 479, 479, 479, 479, 489, 480, 480, 480, 480, 480, 480, 485, 486, 487, 488, 490, 491, 492, 493, 494, 495, 497, 498, 500, 501, 502, 503, 504, 505, 506, 489, 480, 480, 480, 480, 480, 480, 507, 508, 509, 511, 490, 491, 492, 493, 494, 495, 497, 498, 500, 501, 502, 503, 504, 505, 506, 512, 513, 514, 515, 516, 517, 518, 507, 508, 509, 511, 519, 520, 521, 522, 523, 524, 529, 529, 529, 529, 529, 529, 529, 529, 529, 512, 513, 514, 515, 516, 517, 518, 866, 866, 866, 866, 519, 520, 521, 522, 523, 524, 213, 866, 407, 407, 407, 407, 407, 407, 407, 407, 407, 345, 213, 866, 530, 530, 530, 530, 530, 530, 530, 530, 530, 474, 531, 531, 531, 531, 531, 531, 866, 866, 531, 531, 531, 531, 531, 531, 531, 531, 531, 476, 476, 476, 476, 476, 476, 476, 476, 476, 531, 531, 531, 531, 531, 531, 532, 532, 532, 532, 532, 532, 532, 532, 532, 539, 533, 533, 533, 533, 533, 533, 866, 540, 535, 535, 535, 535, 535, 535, 535, 535, 535, 866, 866, 866, 866, 866, 866, 866, 866, 539, 533, 533, 533, 533, 533, 533, 161, 540, 534, 534, 534, 534, 534, 534, 534, 534, 534, 416, 535, 535, 535, 535, 535, 535, 866, 542, 538, 538, 538, 538, 538, 538, 538, 538, 538, 866, 866, 866, 866, 866, 866, 866, 543, 544, 535, 535, 535, 535, 535, 535, 161, 542, 536, 536, 536, 536, 536, 536, 536, 536, 536, 537, 538, 538, 538, 538, 538, 538, 543, 544, 545, 546, 547, 548, 549, 550, 551, 552, 553, 554, 555, 556, 557, 558, 559, 560, 561, 562, 538, 538, 538, 538, 538, 538, 563, 564, 545, 546, 547, 548, 549, 550, 551, 552, 553, 554, 555, 556, 557, 558, 559, 560, 561, 562, 568, 565, 569, 570, 571, 572, 563, 564, 566, 573, 574, 575, 576, 577, 578, 529, 529, 529, 529, 529, 529, 529, 529, 529, 866, 866, 568, 565, 569, 570, 571, 572, 866, 866, 566, 573, 574, 575, 576, 577, 578, 213, 866, 582, 582, 582, 582, 582, 582, 582, 582, 582, 474, 583, 583, 583, 583, 583, 583, 866, 591, 583, 583, 583, 583, 583, 583, 583, 583, 583, 866, 866, 866, 866, 866, 866, 866, 866, 592, 583, 583, 583, 583, 583, 583, 213, 591, 584, 584, 584, 584, 584, 584, 584, 584, 584, 585, 586, 586, 586, 586, 586, 586, 866, 592, 586, 586, 586, 586, 586, 586, 586, 586, 586, 866, 866, 593, 866, 866, 866, 866, 866, 866, 586, 586, 586, 586, 586, 586, 161, 866, 348, 348, 348, 348, 348, 348, 348, 348, 348, 416, 161, 593, 587, 587, 587, 587, 587, 587, 587, 587, 587, 537, 588, 588, 588, 588, 588, 588, 866, 866, 588, 588, 588, 588, 588, 588, 588, 588, 588, 866, 866, 866, 866, 866, 594, 595, 596, 597, 588, 588, 588, 588, 588, 588, 589, 589, 589, 589, 589, 589, 589, 589, 589, 598, 590, 590, 590, 590, 590, 590, 594, 595, 596, 597, 599, 600, 601, 602, 603, 604, 605, 606, 607, 608, 609, 610, 611, 612, 866, 598, 590, 590, 590, 590, 590, 590, 615, 616, 617, 618, 599, 600, 601, 602, 603, 604, 605, 606, 607, 608, 609, 610, 611, 612, 613, 619, 620, 622, 623, 637, 638, 614, 615, 616, 617, 618, 213, 866, 407, 407, 407, 407, 407, 407, 407, 407, 407, 474, 866, 866, 613, 619, 620, 622, 623, 637, 638, 614, 213, 866, 628, 628, 628, 628, 628, 628, 628, 628, 628, 585, 629, 629, 629, 629, 629, 629, 866, 866, 629, 629, 629, 629, 629, 629, 629, 629, 629, 866, 866, 866, 866, 866, 866, 639, 866, 866, 629, 629, 629, 629, 629, 629, 630, 630, 630, 630, 630, 630, 630, 630, 630, 640, 631, 631, 631, 631, 631, 631, 866, 639, 633, 633, 633, 633, 633, 633, 633, 633, 633, 866, 866, 866, 866, 866, 866, 866, 866, 640, 631, 631, 631, 631, 631, 631, 161, 866, 632, 632, 632, 632, 632, 632, 632, 632, 632, 537, 633, 633, 633, 633, 633, 633, 866, 641, 636, 636, 636, 636, 636, 636, 636, 636, 636, 866, 866, 866, 866, 866, 866, 866, 642, 643, 633, 633, 633, 633, 633, 633, 161, 641, 634, 634, 634, 634, 634, 634, 634, 634, 634, 635, 636, 636, 636, 636, 636, 636, 642, 643, 644, 646, 647, 648, 649, 650, 651, 652, 653, 654, 655, 656, 658, 659, 660, 661, 662, 866, 636, 636, 636, 636, 636, 636, 866, 866, 644, 646, 647, 648, 649, 650, 651, 652, 653, 654, 655, 656, 658, 659, 660, 661, 662, 213, 866, 666, 666, 666, 666, 666, 666, 666, 666, 666, 585, 667, 667, 667, 667, 667, 667, 866, 675, 667, 667, 667, 667, 667, 667, 667, 667, 667, 866, 866, 866, 866, 866, 866, 866, 866, 676, 667, 667, 667, 667, 667, 667, 213, 675, 668, 668, 668, 668, 668, 668, 668, 668, 668, 669, 670, 670, 670, 670, 670, 670, 866, 676, 670, 670, 670, 670, 670, 670, 670, 670, 670, 866, 866, 677, 866, 866, 866, 866, 866, 866, 670, 670, 670, 670, 670, 670, 161, 866, 348, 348, 348, 348, 348, 348, 348, 348, 348, 537, 161, 677, 671, 671, 671, 671, 671, 671, 671, 671, 671, 635, 672, 672, 672, 672, 672, 672, 866, 866, 672, 672, 672, 672, 672, 672, 672, 672, 672, 866, 866, 866, 866, 866, 678, 679, 866, 682, 672, 672, 672, 672, 672, 672, 673, 673, 673, 673, 673, 673, 673, 673, 673, 683, 674, 674, 674, 674, 674, 674, 678, 679, 680, 682, 684, 685, 686, 687, 681, 688, 689, 690, 691, 692, 693, 866, 708, 866, 866, 683, 674, 674, 674, 674, 674, 674, 866, 866, 680, 866, 684, 685, 686, 687, 681, 688, 689, 690, 691, 692, 693, 213, 708, 407, 407, 407, 407, 407, 407, 407, 407, 407, 585, 213, 866, 698, 698, 698, 698, 698, 698, 698, 698, 698, 669, 699, 699, 699, 699, 699, 699, 866, 866, 699, 699, 699, 699, 699, 699, 699, 699, 699, 866, 866, 866, 866, 866, 866, 709, 866, 866, 699, 699, 699, 699, 699, 699, 700, 700, 700, 700, 700, 700, 700, 700, 700, 710, 701, 701, 701, 701, 701, 701, 866, 709, 703, 703, 703, 703, 703, 703, 703, 703, 703, 866, 866, 866, 866, 866, 866, 866, 866, 710, 701, 701, 701, 701, 701, 701, 161, 866, 702, 702, 702, 702, 702, 702, 702, 702, 702, 635, 703, 703, 703, 703, 703, 703, 866, 711, 706, 706, 706, 706, 706, 706, 706, 706, 706, 866, 866, 866, 866, 866, 866, 866, 712, 713, 703, 703, 703, 703, 703, 703, 161, 711, 704, 704, 704, 704, 704, 704, 704, 704, 704, 705, 706, 706, 706, 706, 706, 706, 712, 713, 714, 715, 716, 717, 718, 719, 720, 722, 866, 736, 866, 866, 866, 866, 866, 866, 866, 866, 706, 706, 706, 706, 706, 706, 866, 866, 714, 715, 716, 717, 718, 719, 720, 722, 213, 736, 727, 727, 727, 727, 727, 727, 727, 727, 727, 669, 728, 728, 728, 728, 728, 728, 866, 737, 728, 728, 728, 728, 728, 728, 728, 728, 728, 866, 866, 866, 866, 866, 866, 866, 866, 739, 728, 728, 728, 728, 728, 728, 213, 737, 729, 729, 729, 729, 729, 729, 729, 729, 729, 730, 731, 731, 731, 731, 731, 731, 866, 739, 731, 731, 731, 731, 731, 731, 731, 731, 731, 866, 866, 740, 866, 866, 866, 866, 866, 866, 731, 731, 731, 731, 731, 731, 161, 866, 348, 348, 348, 348, 348, 348, 348, 348, 348, 635, 161, 740, 732, 732, 732, 732, 732, 732, 732, 732, 732, 705, 733, 733, 733, 733, 733, 733, 866, 866, 733, 733, 733, 733, 733, 733, 733, 733, 733, 866, 866, 866, 866, 866, 741, 742, 743, 744, 733, 733, 733, 733, 733, 733, 734, 734, 734, 734, 734, 734, 734, 734, 734, 745, 735, 735, 735, 735, 735, 735, 741, 742, 743, 744, 746, 747, 748, 213, 763, 407, 407, 407, 407, 407, 407, 407, 407, 407, 669, 745, 735, 735, 735, 735, 735, 735, 769, 866, 866, 866, 746, 747, 748, 213, 763, 754, 754, 754, 754, 754, 754, 754, 754, 754, 730, 755, 755, 755, 755, 755, 755, 866, 769, 755, 755, 755, 755, 755, 755, 755, 755, 755, 866, 866, 866, 866, 866, 866, 770, 866, 866, 755, 755, 755, 755, 755, 755, 756, 756, 756, 756, 756, 756, 756, 756, 756, 771, 757, 757, 757, 757, 757, 757, 866, 770, 759, 759, 759, 759, 759, 759, 759, 759, 759, 866, 866, 866, 866, 866, 866, 866, 866, 771, 757, 757, 757, 757, 757, 757, 161, 866, 758, 758, 758, 758, 758, 758, 758, 758, 758, 705, 759, 759, 759, 759, 759, 759, 866, 772, 762, 762, 762, 762, 762, 762, 762, 762, 762, 866, 866, 866, 866, 866, 866, 866, 773, 774, 759, 759, 759, 759, 759, 759, 161, 772, 760, 760, 760, 760, 760, 760, 760, 760, 760, 761, 762, 762, 762, 762, 762, 762, 773, 774, 775, 866, 788, 782, 782, 782, 782, 782, 782, 782, 782, 782, 866, 866, 866, 866, 866, 866, 762, 762, 762, 762, 762, 762, 866, 866, 775, 213, 788, 781, 781, 781, 781, 781, 781, 781, 781, 781, 730, 782, 782, 782, 782, 782, 782, 866, 793, 784, 784, 784, 784, 784, 784, 784, 784, 784, 794, 866, 866, 866, 866, 866, 866, 866, 795, 782, 782, 782, 782, 782, 782, 213, 793, 783, 783, 783, 783, 783, 783, 783, 783, 783, 794, 784, 784, 784, 784, 784, 784, 161, 795, 348, 348, 348, 348, 348, 348, 348, 348, 348, 705, 866, 866, 866, 866, 866, 866, 866, 796, 784, 784, 784, 784, 784, 784, 161, 866, 785, 785, 785, 785, 785, 785, 785, 785, 785, 761, 786, 786, 786, 786, 786, 786, 866, 796, 786, 786, 786, 786, 786, 786, 786, 786, 786, 797, 798, 799, 866, 809, 866, 866, 866, 866, 786, 786, 786, 786, 786, 786, 866, 814, 805, 805, 805, 805, 805, 805, 805, 805, 805, 797, 798, 799, 213, 809, 407, 407, 407, 407, 407, 407, 407, 407, 407, 730, 213, 814, 804, 804, 804, 804, 804, 804, 804, 804, 804, 815, 805, 805, 805, 805, 805, 805, 866, 816, 807, 807, 807, 807, 807, 807, 807, 807, 807, 866, 866, 866, 866, 866, 866, 866, 817, 815, 805, 805, 805, 805, 805, 805, 161, 816, 806, 806, 806, 806, 806, 806, 806, 806, 806, 761, 807, 807, 807, 807, 807, 807, 817, 866, 866, 823, 823, 823, 823, 823, 823, 823, 823, 823, 866, 866, 866, 866, 866, 866, 866, 825, 807, 807, 807, 807, 807, 807, 213, 866, 822, 822, 822, 822, 822, 822, 822, 822, 822, 826, 823, 823, 823, 823, 823, 823, 161, 825, 348, 348, 348, 348, 348, 348, 348, 348, 348, 761, 827, 832, 833, 834, 839, 840, 841, 826, 823, 823, 823, 823, 823, 823, 213, 845, 407, 407, 407, 407, 407, 407, 407, 407, 407, 866, 827, 832, 833, 834, 839, 840, 841, 866, 866, 866, 866, 866, 866, 866, 866, 845, 38, 38, 38, 38, 40, 40, 40, 40, 44, 44, 44, 44, 46, 866, 46, 46, 47, 47, 47, 47, 102, 866, 102, 102, 106, 106, 156, 156, 157, 157, 210, 210, 211, 211, 212, 212, 271, 271, 272, 272, 338, 338, 339, 339, 340, 340, 402, 402, 403, 403, 404, 404, 468, 468, 469, 469, 525, 525, 526, 526, 527, 527, 579, 579, 580, 580, 581, 581, 468, 468, 625, 625, 626, 626, 663, 663, 664, 664, 665, 665, 694, 694, 695, 695, 696, 696, 580, 580, 724, 724, 725, 725, 749, 749, 750, 750, 751, 751, 776, 776, 777, 777, 779, 779, 664, 664, 801, 801, 802, 802, 818, 818, 819, 819, 820, 820, 828, 828, 829, 829, 724, 724, 836, 836, 837, 837, 842, 842, 843, 843, 846, 846, 847, 847, 848, 848, 777, 777, 851, 851, 853, 853, 854, 854, 855, 855, 858, 858, 861, 861, 862, 862, 864, 864, 865, 865, 7, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866 } ; static yyconst flex_int16_t yy_chk[4107] = { 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 10, 10, 11, 11, 15, 17, 26, 950, 15, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 27, 16, 28, 35, 37, 27, 17, 26, 28, 59, 36, 41, 41, 27, 36, 42, 42, 16, 43, 43, 16, 16, 16, 16, 16, 16, 27, 16, 28, 35, 37, 27, 133, 133, 28, 59, 36, 946, 765, 27, 36, 765, 944, 16, 19, 19, 940, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 20, 21, 20, 21, 60, 20, 934, 62, 928, 63, 20, 21, 64, 927, 924, 65, 920, 20, 21, 919, 66, 915, 67, 911, 874, 30, 20, 21, 20, 21, 60, 20, 23, 62, 23, 63, 20, 21, 64, 30, 31, 65, 23, 20, 21, 22, 66, 22, 67, 23, 22, 30, 23, 68, 31, 22, 22, 24, 23, 24, 23, 69, 22, 68, 70, 30, 31, 24, 23, 71, 24, 22, 72, 22, 24, 23, 22, 865, 23, 68, 31, 22, 22, 24, 864, 24, 862, 69, 22, 68, 70, 73, 861, 24, 74, 71, 24, 76, 72, 77, 24, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 73, 25, 860, 74, 859, 32, 76, 25, 77, 32, 858, 857, 855, 78, 25, 79, 854, 852, 29, 32, 25, 25, 25, 25, 25, 25, 29, 25, 75, 81, 33, 32, 29, 25, 82, 32, 33, 29, 33, 78, 25, 79, 34, 34, 29, 32, 75, 33, 83, 85, 86, 34, 29, 88, 75, 81, 33, 89, 29, 34, 82, 851, 33, 29, 33, 739, 739, 739, 850, 739, 848, 847, 75, 33, 83, 85, 86, 34, 846, 88, 844, 843, 842, 89, 837, 34, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 90, 51, 53, 53, 53, 53, 53, 53, 53, 53, 53, 91, 836, 835, 830, 829, 828, 820, 96, 97, 51, 51, 51, 51, 51, 51, 90, 51, 56, 56, 56, 56, 56, 56, 56, 56, 56, 91, 56, 56, 56, 56, 56, 56, 96, 97, 105, 105, 105, 105, 105, 105, 105, 105, 105, 819, 818, 807, 803, 802, 801, 800, 792, 98, 56, 56, 56, 56, 56, 56, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 87, 58, 92, 98, 99, 100, 112, 87, 113, 114, 87, 115, 116, 117, 118, 120, 121, 122, 123, 92, 58, 58, 58, 58, 58, 58, 87, 58, 92, 791, 99, 100, 112, 87, 113, 114, 87, 115, 116, 117, 118, 120, 121, 122, 123, 92, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 110, 103, 110, 110, 110, 110, 110, 110, 110, 110, 110, 124, 790, 789, 782, 779, 777, 776, 126, 127, 103, 103, 103, 103, 103, 103, 128, 103, 107, 107, 107, 107, 107, 107, 107, 107, 107, 124, 107, 107, 107, 107, 107, 107, 126, 127, 767, 766, 759, 753, 752, 751, 128, 155, 155, 155, 155, 155, 155, 155, 155, 155, 129, 130, 107, 107, 107, 107, 107, 107, 109, 132, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 129, 130, 750, 749, 740, 728, 725, 724, 723, 132, 710, 703, 697, 696, 695, 694, 134, 136, 137, 138, 109, 109, 109, 109, 109, 109, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 134, 136, 137, 138, 139, 140, 141, 142, 143, 144, 146, 147, 148, 149, 150, 151, 152, 153, 692, 675, 111, 111, 111, 111, 111, 111, 667, 665, 664, 663, 139, 140, 141, 142, 143, 144, 146, 147, 148, 149, 150, 151, 152, 153, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 160, 154, 160, 160, 160, 160, 160, 160, 160, 160, 160, 161, 161, 161, 161, 161, 161, 161, 161, 161, 154, 154, 154, 154, 154, 154, 633, 154, 159, 627, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 164, 166, 164, 164, 164, 164, 164, 164, 164, 164, 164, 626, 625, 624, 617, 601, 583, 581, 166, 168, 159, 159, 159, 159, 159, 159, 162, 172, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 166, 168, 580, 579, 576, 535, 528, 527, 526, 172, 525, 511, 483, 472, 469, 468, 173, 174, 175, 177, 162, 162, 162, 162, 162, 162, 163, 163, 163, 163, 163, 163, 163, 163, 163, 180, 163, 163, 163, 163, 163, 163, 173, 174, 175, 177, 467, 451, 437, 433, 414, 181, 405, 404, 403, 402, 383, 360, 182, 183, 354, 180, 163, 163, 163, 163, 163, 163, 165, 165, 165, 165, 165, 165, 165, 165, 165, 181, 165, 165, 165, 165, 165, 165, 182, 183, 184, 187, 188, 189, 191, 193, 194, 195, 192, 184, 184, 184, 192, 196, 197, 198, 187, 343, 165, 165, 165, 165, 165, 165, 201, 204, 184, 187, 188, 189, 191, 193, 194, 195, 192, 184, 184, 184, 192, 196, 197, 198, 187, 199, 202, 205, 206, 223, 224, 225, 201, 204, 227, 228, 229, 202, 230, 228, 199, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 199, 202, 205, 206, 223, 224, 225, 340, 339, 227, 228, 229, 202, 230, 228, 199, 213, 213, 213, 213, 213, 213, 213, 213, 213, 214, 338, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 216, 336, 216, 216, 216, 216, 216, 216, 216, 216, 216, 331, 324, 323, 320, 305, 295, 231, 281, 273, 214, 214, 214, 214, 214, 214, 215, 215, 215, 215, 215, 215, 215, 215, 215, 232, 215, 215, 215, 215, 215, 215, 217, 231, 217, 217, 217, 217, 217, 217, 217, 217, 217, 272, 271, 270, 267, 253, 222, 212, 211, 232, 215, 215, 215, 215, 215, 215, 218, 210, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 219, 234, 219, 219, 219, 219, 219, 219, 219, 219, 219, 279, 279, 279, 279, 279, 279, 279, 279, 279, 218, 218, 218, 218, 218, 218, 220, 234, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 221, 226, 221, 221, 221, 221, 221, 221, 221, 221, 221, 235, 237, 226, 238, 239, 226, 240, 226, 233, 220, 220, 220, 220, 220, 220, 233, 226, 241, 242, 243, 244, 245, 246, 233, 247, 248, 235, 237, 226, 238, 239, 226, 240, 226, 233, 244, 249, 250, 251, 252, 254, 233, 255, 241, 242, 243, 244, 245, 246, 233, 247, 248, 256, 257, 258, 259, 260, 261, 262, 263, 264, 244, 249, 250, 251, 252, 254, 265, 255, 266, 268, 269, 209, 285, 207, 203, 200, 190, 256, 257, 258, 259, 260, 261, 262, 263, 264, 186, 178, 176, 171, 170, 169, 265, 158, 266, 268, 269, 274, 285, 274, 274, 274, 274, 274, 274, 274, 274, 274, 275, 157, 275, 275, 275, 275, 275, 275, 275, 275, 275, 275, 275, 275, 275, 275, 275, 275, 276, 286, 276, 276, 276, 276, 276, 276, 276, 276, 276, 156, 145, 135, 131, 119, 106, 104, 80, 287, 275, 275, 275, 275, 275, 275, 277, 286, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 278, 287, 278, 278, 278, 278, 278, 278, 278, 278, 278, 52, 48, 288, 47, 44, 39, 18, 14, 12, 277, 277, 277, 277, 277, 277, 280, 7, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 282, 288, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 284, 4, 284, 284, 284, 284, 284, 284, 284, 284, 284, 3, 0, 0, 0, 0, 289, 290, 291, 292, 282, 282, 282, 282, 282, 282, 283, 283, 283, 283, 283, 283, 283, 283, 283, 293, 283, 283, 283, 283, 283, 283, 289, 290, 291, 292, 294, 296, 298, 299, 300, 301, 302, 304, 306, 307, 308, 309, 310, 311, 312, 293, 283, 283, 283, 283, 283, 283, 313, 314, 315, 316, 294, 296, 298, 299, 300, 301, 302, 304, 306, 307, 308, 309, 310, 311, 312, 317, 319, 321, 322, 325, 327, 328, 313, 314, 315, 316, 329, 330, 333, 319, 334, 335, 337, 0, 0, 0, 0, 0, 0, 0, 0, 317, 319, 321, 322, 325, 327, 328, 0, 0, 0, 0, 329, 330, 333, 319, 334, 335, 337, 341, 341, 341, 341, 341, 341, 341, 341, 341, 342, 0, 342, 342, 342, 342, 342, 342, 342, 342, 342, 342, 344, 0, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 346, 0, 346, 346, 346, 346, 346, 346, 346, 346, 346, 0, 0, 0, 0, 0, 0, 353, 0, 0, 344, 344, 344, 344, 344, 344, 345, 345, 345, 345, 345, 345, 345, 345, 345, 355, 345, 345, 345, 345, 345, 345, 347, 353, 347, 347, 347, 347, 347, 347, 347, 347, 347, 0, 356, 0, 0, 0, 0, 0, 0, 355, 345, 345, 345, 345, 345, 345, 348, 0, 348, 348, 348, 348, 348, 348, 348, 348, 348, 349, 356, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 350, 357, 350, 350, 350, 350, 350, 350, 350, 350, 350, 0, 0, 0, 0, 0, 0, 0, 0, 358, 349, 349, 349, 349, 349, 349, 351, 357, 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 352, 358, 352, 352, 352, 352, 352, 352, 352, 352, 352, 359, 361, 362, 364, 365, 367, 368, 369, 370, 351, 351, 351, 351, 351, 351, 359, 363, 371, 372, 373, 374, 375, 363, 376, 363, 377, 359, 361, 362, 364, 365, 367, 368, 369, 370, 378, 379, 380, 381, 382, 384, 359, 363, 371, 372, 373, 374, 375, 363, 376, 363, 377, 385, 386, 387, 388, 389, 390, 392, 393, 394, 378, 379, 380, 381, 382, 384, 395, 396, 397, 399, 400, 401, 0, 418, 0, 0, 0, 385, 386, 387, 388, 389, 390, 392, 393, 394, 0, 0, 0, 0, 0, 0, 395, 396, 397, 399, 400, 401, 406, 418, 406, 406, 406, 406, 406, 406, 406, 406, 406, 407, 0, 407, 407, 407, 407, 407, 407, 407, 407, 407, 408, 0, 408, 408, 408, 408, 408, 408, 408, 408, 408, 408, 408, 408, 408, 408, 408, 408, 409, 419, 409, 409, 409, 409, 409, 409, 409, 409, 409, 412, 412, 412, 412, 412, 412, 412, 412, 412, 408, 408, 408, 408, 408, 408, 410, 419, 410, 410, 410, 410, 410, 410, 410, 410, 410, 410, 410, 410, 410, 410, 410, 410, 411, 420, 411, 411, 411, 411, 411, 411, 411, 411, 411, 0, 0, 421, 0, 0, 0, 0, 0, 0, 410, 410, 410, 410, 410, 410, 413, 420, 413, 413, 413, 413, 413, 413, 413, 413, 413, 413, 415, 421, 415, 415, 415, 415, 415, 415, 415, 415, 415, 415, 415, 415, 415, 415, 415, 415, 417, 0, 417, 417, 417, 417, 417, 417, 417, 417, 417, 0, 0, 0, 0, 0, 422, 423, 424, 425, 415, 415, 415, 415, 415, 415, 416, 416, 416, 416, 416, 416, 416, 416, 416, 426, 416, 416, 416, 416, 416, 416, 422, 423, 424, 425, 427, 428, 429, 430, 431, 432, 435, 436, 438, 440, 441, 444, 445, 446, 447, 426, 416, 416, 416, 416, 416, 416, 448, 449, 450, 452, 427, 428, 429, 430, 431, 432, 435, 436, 438, 440, 441, 444, 445, 446, 447, 453, 454, 455, 456, 457, 458, 459, 448, 449, 450, 452, 460, 461, 462, 463, 464, 465, 470, 470, 470, 470, 470, 470, 470, 470, 470, 453, 454, 455, 456, 457, 458, 459, 0, 0, 0, 0, 460, 461, 462, 463, 464, 465, 471, 0, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 473, 0, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 475, 0, 475, 475, 475, 475, 475, 475, 475, 475, 475, 476, 476, 476, 476, 476, 476, 476, 476, 476, 473, 473, 473, 473, 473, 473, 474, 474, 474, 474, 474, 474, 474, 474, 474, 481, 474, 474, 474, 474, 474, 474, 478, 482, 478, 478, 478, 478, 478, 478, 478, 478, 478, 0, 0, 0, 0, 0, 0, 0, 0, 481, 474, 474, 474, 474, 474, 474, 477, 482, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 480, 484, 480, 480, 480, 480, 480, 480, 480, 480, 480, 0, 0, 0, 0, 0, 0, 0, 485, 486, 477, 477, 477, 477, 477, 477, 479, 484, 479, 479, 479, 479, 479, 479, 479, 479, 479, 479, 479, 479, 479, 479, 479, 479, 485, 486, 487, 488, 489, 490, 491, 492, 493, 494, 495, 496, 498, 499, 500, 501, 503, 504, 505, 506, 479, 479, 479, 479, 479, 479, 508, 509, 487, 488, 489, 490, 491, 492, 493, 494, 495, 496, 498, 499, 500, 501, 503, 504, 505, 506, 512, 510, 513, 514, 515, 516, 508, 509, 510, 517, 518, 519, 521, 523, 524, 529, 529, 529, 529, 529, 529, 529, 529, 529, 0, 0, 512, 510, 513, 514, 515, 516, 0, 0, 510, 517, 518, 519, 521, 523, 524, 530, 0, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 531, 539, 531, 531, 531, 531, 531, 531, 531, 531, 531, 0, 0, 0, 0, 0, 0, 0, 0, 540, 530, 530, 530, 530, 530, 530, 532, 539, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 533, 540, 533, 533, 533, 533, 533, 533, 533, 533, 533, 0, 0, 541, 0, 0, 0, 0, 0, 0, 532, 532, 532, 532, 532, 532, 534, 0, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 536, 541, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 538, 0, 538, 538, 538, 538, 538, 538, 538, 538, 538, 0, 0, 0, 0, 0, 542, 543, 544, 546, 536, 536, 536, 536, 536, 536, 537, 537, 537, 537, 537, 537, 537, 537, 537, 547, 537, 537, 537, 537, 537, 537, 542, 543, 544, 546, 548, 549, 550, 551, 552, 554, 555, 556, 557, 559, 560, 564, 565, 566, 0, 547, 537, 537, 537, 537, 537, 537, 568, 569, 570, 571, 548, 549, 550, 551, 552, 554, 555, 556, 557, 559, 560, 564, 565, 566, 567, 572, 575, 577, 578, 592, 593, 567, 568, 569, 570, 571, 582, 0, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 0, 0, 567, 572, 575, 577, 578, 592, 593, 567, 584, 0, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 586, 0, 586, 586, 586, 586, 586, 586, 586, 586, 586, 0, 0, 0, 0, 0, 0, 594, 0, 0, 584, 584, 584, 584, 584, 584, 585, 585, 585, 585, 585, 585, 585, 585, 585, 595, 585, 585, 585, 585, 585, 585, 588, 594, 588, 588, 588, 588, 588, 588, 588, 588, 588, 0, 0, 0, 0, 0, 0, 0, 0, 595, 585, 585, 585, 585, 585, 585, 587, 0, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 590, 596, 590, 590, 590, 590, 590, 590, 590, 590, 590, 0, 0, 0, 0, 0, 0, 0, 598, 599, 587, 587, 587, 587, 587, 587, 589, 596, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 598, 599, 600, 603, 604, 605, 606, 610, 611, 612, 613, 614, 615, 616, 618, 619, 620, 621, 622, 0, 589, 589, 589, 589, 589, 589, 0, 0, 600, 603, 604, 605, 606, 610, 611, 612, 613, 614, 615, 616, 618, 619, 620, 621, 622, 628, 0, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 629, 638, 629, 629, 629, 629, 629, 629, 629, 629, 629, 0, 0, 0, 0, 0, 0, 0, 0, 639, 628, 628, 628, 628, 628, 628, 630, 638, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 631, 639, 631, 631, 631, 631, 631, 631, 631, 631, 631, 0, 0, 641, 0, 0, 0, 0, 0, 0, 630, 630, 630, 630, 630, 630, 632, 0, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 634, 641, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 636, 0, 636, 636, 636, 636, 636, 636, 636, 636, 636, 0, 0, 0, 0, 0, 642, 643, 0, 647, 634, 634, 634, 634, 634, 634, 635, 635, 635, 635, 635, 635, 635, 635, 635, 649, 635, 635, 635, 635, 635, 635, 642, 643, 645, 647, 651, 652, 653, 654, 645, 655, 657, 658, 659, 661, 662, 0, 676, 0, 0, 649, 635, 635, 635, 635, 635, 635, 0, 0, 645, 0, 651, 652, 653, 654, 645, 655, 657, 658, 659, 661, 662, 666, 676, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 668, 0, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 670, 0, 670, 670, 670, 670, 670, 670, 670, 670, 670, 0, 0, 0, 0, 0, 0, 678, 0, 0, 668, 668, 668, 668, 668, 668, 669, 669, 669, 669, 669, 669, 669, 669, 669, 680, 669, 669, 669, 669, 669, 669, 672, 678, 672, 672, 672, 672, 672, 672, 672, 672, 672, 0, 0, 0, 0, 0, 0, 0, 0, 680, 669, 669, 669, 669, 669, 669, 671, 0, 671, 671, 671, 671, 671, 671, 671, 671, 671, 671, 671, 671, 671, 671, 671, 671, 674, 681, 674, 674, 674, 674, 674, 674, 674, 674, 674, 0, 0, 0, 0, 0, 0, 0, 682, 684, 671, 671, 671, 671, 671, 671, 673, 681, 673, 673, 673, 673, 673, 673, 673, 673, 673, 673, 673, 673, 673, 673, 673, 673, 682, 684, 685, 686, 687, 688, 689, 690, 691, 693, 0, 707, 0, 0, 0, 0, 0, 0, 0, 0, 673, 673, 673, 673, 673, 673, 0, 0, 685, 686, 687, 688, 689, 690, 691, 693, 698, 707, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 699, 709, 699, 699, 699, 699, 699, 699, 699, 699, 699, 0, 0, 0, 0, 0, 0, 0, 0, 711, 698, 698, 698, 698, 698, 698, 700, 709, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 701, 711, 701, 701, 701, 701, 701, 701, 701, 701, 701, 0, 0, 712, 0, 0, 0, 0, 0, 0, 700, 700, 700, 700, 700, 700, 702, 0, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 704, 712, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 706, 0, 706, 706, 706, 706, 706, 706, 706, 706, 706, 0, 0, 0, 0, 0, 713, 714, 715, 716, 704, 704, 704, 704, 704, 704, 705, 705, 705, 705, 705, 705, 705, 705, 705, 717, 705, 705, 705, 705, 705, 705, 713, 714, 715, 716, 718, 720, 721, 727, 736, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 717, 705, 705, 705, 705, 705, 705, 741, 0, 0, 0, 718, 720, 721, 729, 736, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 731, 741, 731, 731, 731, 731, 731, 731, 731, 731, 731, 0, 0, 0, 0, 0, 0, 742, 0, 0, 729, 729, 729, 729, 729, 729, 730, 730, 730, 730, 730, 730, 730, 730, 730, 743, 730, 730, 730, 730, 730, 730, 733, 742, 733, 733, 733, 733, 733, 733, 733, 733, 733, 0, 0, 0, 0, 0, 0, 0, 0, 743, 730, 730, 730, 730, 730, 730, 732, 0, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 735, 744, 735, 735, 735, 735, 735, 735, 735, 735, 735, 0, 0, 0, 0, 0, 0, 0, 745, 746, 732, 732, 732, 732, 732, 732, 734, 744, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 745, 746, 748, 755, 763, 755, 755, 755, 755, 755, 755, 755, 755, 755, 0, 0, 0, 0, 0, 0, 734, 734, 734, 734, 734, 734, 0, 0, 748, 754, 763, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 757, 768, 757, 757, 757, 757, 757, 757, 757, 757, 757, 769, 0, 0, 0, 0, 0, 0, 0, 771, 754, 754, 754, 754, 754, 754, 756, 768, 756, 756, 756, 756, 756, 756, 756, 756, 756, 769, 756, 756, 756, 756, 756, 756, 758, 771, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 0, 0, 0, 0, 0, 0, 0, 772, 756, 756, 756, 756, 756, 756, 760, 0, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 762, 772, 762, 762, 762, 762, 762, 762, 762, 762, 762, 773, 774, 775, 0, 788, 0, 0, 0, 0, 760, 760, 760, 760, 760, 760, 784, 793, 784, 784, 784, 784, 784, 784, 784, 784, 784, 773, 774, 775, 781, 788, 781, 781, 781, 781, 781, 781, 781, 781, 781, 781, 783, 793, 783, 783, 783, 783, 783, 783, 783, 783, 783, 795, 783, 783, 783, 783, 783, 783, 786, 798, 786, 786, 786, 786, 786, 786, 786, 786, 786, 0, 0, 0, 0, 0, 0, 0, 799, 795, 783, 783, 783, 783, 783, 783, 785, 798, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 799, 805, 0, 805, 805, 805, 805, 805, 805, 805, 805, 805, 0, 0, 0, 0, 0, 0, 0, 809, 785, 785, 785, 785, 785, 785, 804, 0, 804, 804, 804, 804, 804, 804, 804, 804, 804, 814, 804, 804, 804, 804, 804, 804, 806, 809, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 817, 825, 826, 827, 832, 833, 834, 814, 804, 804, 804, 804, 804, 804, 822, 840, 822, 822, 822, 822, 822, 822, 822, 822, 822, 0, 817, 825, 826, 827, 832, 833, 834, 0, 0, 0, 0, 0, 0, 0, 0, 840, 867, 867, 867, 867, 868, 868, 868, 868, 869, 869, 869, 869, 870, 0, 870, 870, 871, 871, 871, 871, 872, 0, 872, 872, 873, 873, 875, 875, 876, 876, 877, 877, 878, 878, 879, 879, 880, 880, 881, 881, 882, 882, 883, 883, 884, 884, 885, 885, 886, 886, 887, 887, 888, 888, 889, 889, 890, 890, 891, 891, 892, 892, 893, 893, 894, 894, 895, 895, 896, 896, 897, 897, 898, 898, 899, 899, 900, 900, 901, 901, 902, 902, 903, 903, 904, 904, 905, 905, 906, 906, 907, 907, 908, 908, 909, 909, 910, 910, 912, 912, 913, 913, 914, 914, 916, 916, 917, 917, 918, 918, 921, 921, 922, 922, 923, 923, 925, 925, 926, 926, 929, 929, 930, 930, 931, 931, 932, 932, 933, 933, 935, 935, 936, 936, 937, 937, 938, 938, 939, 939, 941, 941, 942, 942, 943, 943, 945, 945, 947, 947, 948, 948, 949, 949, 951, 951, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866 } ; /* Table of booleans, true if rule could match eol. */ static yyconst flex_int32_t yy_rule_can_match_eol[102] = { 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, }; /* The intent behind this definition is that it'll catch * any uses of REJECT which flex missed. */ #define REJECT reject_used_but_not_detected #define yymore() yymore_used_but_not_detected #define YY_MORE_ADJ 0 #define YY_RESTORE_YY_MORE_OFFSET #ifdef WIN32 #define strncasecmp _strnicmp #endif using namespace std; #include "ClntParser.h" #include "Portable.h" #define YYABORT yyterminate(); /* duplicate default definition from flex. This makes cppcheck check for defined YY_FATAL_ERROR() go away. */ #define YY_FATAL_ERROR(msg) LexerError(msg) using namespace std; namespace std { unsigned ComBeg; //line, in which comment begins unsigned LftCnt; //how many signs : on the left side of :: sign was interpreted unsigned RgtCnt; //the same as above, but on the right side of :: char Address[16]; //address, which is analizying right now char AddrPart[16]; unsigned intpos,pos; yy_ClntParser_stype yylval; } #define INITIAL 0 #define COMMENT 1 #define ADDR 2 #ifndef YY_NO_UNISTD_H /* Special case for "unistd.h", since it is non-ANSI. We include it way * down here because we want the user's section 1 to have been scanned first. * The user has a chance to override it with an option. */ #include #endif #ifndef YY_EXTRA_TYPE #define YY_EXTRA_TYPE void * #endif #ifndef yytext_ptr static void yy_flex_strncpy (char *,yyconst char *,int ); #endif #ifdef YY_NEED_STRLEN static int yy_flex_strlen (yyconst char * ); #endif #ifndef YY_NO_INPUT #endif /* Amount of stuff to slurp up with each read. */ #ifndef YY_READ_BUF_SIZE #ifdef __ia64__ /* On IA-64, the buffer size is 16k, not 8k */ #define YY_READ_BUF_SIZE 16384 #else #define YY_READ_BUF_SIZE 8192 #endif /* __ia64__ */ #endif /* Copy whatever the last rule matched to the standard output. */ #ifndef ECHO #define ECHO LexerOutput( yytext, yyleng ) #endif /* Gets input and stuffs it into "buf". number of characters read, or YY_NULL, * is returned in "result". */ #ifndef YY_INPUT #define YY_INPUT(buf,result,max_size) \ \ if ( (result = LexerInput( (char *) buf, max_size )) < 0 ) \ YY_FATAL_ERROR( "input in flex scanner failed" ); #endif /* No semi-colon after return; correct usage is to write "yyterminate();" - * we don't want an extra ';' after the "return" because that will cause * some compilers to complain about unreachable statements. */ #ifndef yyterminate #define yyterminate() return YY_NULL #endif /* Number of entries by which start-condition stack grows. */ #ifndef YY_START_STACK_INCR #define YY_START_STACK_INCR 25 #endif /* Report a fatal error. */ #ifndef YY_FATAL_ERROR #define YY_FATAL_ERROR(msg) LexerError( msg ) #endif /* end tables serialization structures and prototypes */ /* Default declaration of generated scanner - a define so the user can * easily add parameters. */ #ifndef YY_DECL #define YY_DECL_IS_OURS 1 #define YY_DECL int yyFlexLexer::yylex() #endif /* !YY_DECL */ /* Code executed at the beginning of each rule, after yytext and yyleng * have been set up. */ #ifndef YY_USER_ACTION #define YY_USER_ACTION #endif /* Code executed at the end of each rule. */ #ifndef YY_BREAK #define YY_BREAK break; #endif #define YY_RULE_SETUP \ YY_USER_ACTION /** The main scanner function which does all the work. */ YY_DECL { register yy_state_type yy_current_state; register char *yy_cp, *yy_bp; register int yy_act; if ( !(yy_init) ) { (yy_init) = 1; #ifdef YY_USER_INIT YY_USER_INIT; #endif if ( ! (yy_start) ) (yy_start) = 1; /* first start state */ if ( ! yyin ) yyin = & std::cin; if ( ! yyout ) yyout = & std::cout; if ( ! YY_CURRENT_BUFFER ) { yyensure_buffer_stack (); YY_CURRENT_BUFFER_LVALUE = yy_create_buffer( yyin, YY_BUF_SIZE ); } yy_load_buffer_state( ); } { while ( 1 ) /* loops until end-of-file is reached */ { yy_cp = (yy_c_buf_p); /* Support of yytext. */ *yy_cp = (yy_hold_char); /* yy_bp points to the position in yy_ch_buf of the start of * the current run. */ yy_bp = yy_cp; yy_current_state = (yy_start); yy_match: do { register YY_CHAR yy_c = yy_ec[YY_SC_TO_UI(*yy_cp)] ; if ( yy_accept[yy_current_state] ) { (yy_last_accepting_state) = yy_current_state; (yy_last_accepting_cpos) = yy_cp; } while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) { yy_current_state = (int) yy_def[yy_current_state]; if ( yy_current_state >= 867 ) yy_c = yy_meta[(unsigned int) yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; ++yy_cp; } while ( yy_base[yy_current_state] != 4032 ); yy_find_action: yy_act = yy_accept[yy_current_state]; if ( yy_act == 0 ) { /* have to back up */ yy_cp = (yy_last_accepting_cpos); yy_current_state = (yy_last_accepting_state); yy_act = yy_accept[yy_current_state]; } YY_DO_BEFORE_ACTION; if ( yy_act != YY_END_OF_BUFFER && yy_rule_can_match_eol[yy_act] ) { yy_size_t yyl; for ( yyl = 0; yyl < yyleng; ++yyl ) if ( yytext[yyl] == '\n' ) yylineno++; ; } do_action: /* This label is used only to access EOF actions. */ switch ( yy_act ) { /* beginning of action switch */ case 0: /* must back up */ /* undo the effects of YY_DO_BEFORE_ACTION */ *yy_cp = (yy_hold_char); yy_cp = (yy_last_accepting_cpos); yy_current_state = (yy_last_accepting_state); goto yy_find_action; case 1: /* rule 1 can match eol */ YY_RULE_SETUP ; // ignore end of line YY_BREAK case 2: YY_RULE_SETUP ; // ignore TABs and spaces YY_BREAK case 3: YY_RULE_SETUP { return ClntParser::IFACE_;} YY_BREAK case 4: YY_RULE_SETUP { return ClntParser::NO_CONFIG_;} YY_BREAK case 5: YY_RULE_SETUP { return ClntParser::ADDRESS_KEYWORD_;} YY_BREAK case 6: YY_RULE_SETUP { return ClntParser::STRING_KEYWORD_; } YY_BREAK case 7: YY_RULE_SETUP { return ClntParser::DUID_KEYWORD_; } YY_BREAK case 8: YY_RULE_SETUP { return ClntParser::HEX_KEYWORD_; } YY_BREAK case 9: YY_RULE_SETUP { return ClntParser::ADDRESS_LIST_KEYWORD_; } YY_BREAK case 10: YY_RULE_SETUP { return ClntParser::NAME_; } YY_BREAK case 11: YY_RULE_SETUP { return ClntParser::IA_;} YY_BREAK case 12: YY_RULE_SETUP { return ClntParser::TA_; } YY_BREAK case 13: YY_RULE_SETUP { return ClntParser::IAID_; } YY_BREAK case 14: YY_RULE_SETUP { return ClntParser::STATELESS_;} YY_BREAK case 15: YY_RULE_SETUP { return ClntParser::LOGLEVEL_; } YY_BREAK case 16: YY_RULE_SETUP { return ClntParser::LOGMODE_; } YY_BREAK case 17: YY_RULE_SETUP { return ClntParser::LOGNAME_; } YY_BREAK case 18: YY_RULE_SETUP { return ClntParser::LOGCOLORS_; } YY_BREAK case 19: YY_RULE_SETUP { return ClntParser::WORKDIR_;} YY_BREAK case 20: YY_RULE_SETUP { return ClntParser::SCRIPT_; } YY_BREAK case 21: YY_RULE_SETUP { return ClntParser::PREF_TIME_; } YY_BREAK case 22: YY_RULE_SETUP { return ClntParser::PREF_TIME_; } YY_BREAK case 23: YY_RULE_SETUP { return ClntParser::VALID_TIME_; } YY_BREAK case 24: YY_RULE_SETUP { return ClntParser::REMOTE_AUTOCONF_; } YY_BREAK case 25: YY_RULE_SETUP { return ClntParser::T1_;} YY_BREAK case 26: YY_RULE_SETUP { return ClntParser::T2_;} YY_BREAK case 27: YY_RULE_SETUP { return ClntParser::OPTION_; } YY_BREAK case 28: YY_RULE_SETUP { return ClntParser::DNS_SERVER_;} YY_BREAK case 29: YY_RULE_SETUP { return ClntParser::DOMAIN_;} YY_BREAK case 30: YY_RULE_SETUP { return ClntParser::NTP_SERVER_;} YY_BREAK case 31: YY_RULE_SETUP { return ClntParser::TIME_ZONE_;} YY_BREAK case 32: YY_RULE_SETUP { return ClntParser::SIP_SERVER_; } YY_BREAK case 33: YY_RULE_SETUP { return ClntParser::SIP_DOMAIN_; } YY_BREAK case 34: YY_RULE_SETUP { return ClntParser::FQDN_; } YY_BREAK case 35: YY_RULE_SETUP { return ClntParser::FQDN_S_; } YY_BREAK case 36: YY_RULE_SETUP { return ClntParser::DDNS_PROTOCOL_; } YY_BREAK case 37: YY_RULE_SETUP { return ClntParser::DDNS_TIMEOUT_; } YY_BREAK case 38: YY_RULE_SETUP { return ClntParser::NIS_SERVER_; } YY_BREAK case 39: YY_RULE_SETUP { return ClntParser::NIS_DOMAIN_; } YY_BREAK case 40: YY_RULE_SETUP { return ClntParser::NISP_SERVER_; } YY_BREAK case 41: YY_RULE_SETUP { return ClntParser::NISP_DOMAIN_; } YY_BREAK case 42: YY_RULE_SETUP { return ClntParser::LIFETIME_; } YY_BREAK case 43: YY_RULE_SETUP { return ClntParser::ROUTING_; } YY_BREAK case 44: YY_RULE_SETUP { return ClntParser::REJECT_SERVERS_;} YY_BREAK case 45: YY_RULE_SETUP { return ClntParser::PREFERRED_SERVERS_;} YY_BREAK case 46: YY_RULE_SETUP { return ClntParser::PREFERRED_SERVERS_;} YY_BREAK case 47: YY_RULE_SETUP { return ClntParser::RAPID_COMMIT_;} YY_BREAK case 48: YY_RULE_SETUP { return ClntParser::RECONFIGURE_; } YY_BREAK case 49: YY_RULE_SETUP { return ClntParser::UNICAST_; } YY_BREAK case 50: YY_RULE_SETUP { return ClntParser::STRICT_RFC_NO_ROUTING_; } YY_BREAK case 51: YY_RULE_SETUP { return ClntParser::OBEY_RA_BITS_; } YY_BREAK case 52: YY_RULE_SETUP { return ClntParser::PD_; } YY_BREAK case 53: YY_RULE_SETUP { return ClntParser::PD_; } YY_BREAK case 54: YY_RULE_SETUP { return ClntParser::PREFIX_; } YY_BREAK case 55: YY_RULE_SETUP { return ClntParser::DUID_TYPE_; } YY_BREAK case 56: YY_RULE_SETUP { return ClntParser::DUID_TYPE_LL_; } YY_BREAK case 57: YY_RULE_SETUP { return ClntParser::DUID_TYPE_LLT_; } YY_BREAK case 58: YY_RULE_SETUP { return ClntParser::DUID_TYPE_EN_; } YY_BREAK case 59: YY_RULE_SETUP { return ClntParser::VENDOR_SPEC_; } YY_BREAK case 60: YY_RULE_SETUP { return ClntParser::ANON_INF_REQUEST_; } YY_BREAK case 61: YY_RULE_SETUP { return ClntParser::INSIST_MODE_; } YY_BREAK case 62: YY_RULE_SETUP { return ClntParser::INACTIVE_MODE_; } YY_BREAK case 63: YY_RULE_SETUP { return ClntParser::AUTH_METHODS_; } YY_BREAK case 64: YY_RULE_SETUP { return ClntParser::AUTH_PROTOCOL_; } YY_BREAK case 65: YY_RULE_SETUP { return ClntParser::AUTH_ALGORITHM_; } YY_BREAK case 66: YY_RULE_SETUP { return ClntParser::AUTH_REPLAY_; } YY_BREAK case 67: YY_RULE_SETUP { return ClntParser::AUTH_REALM_; } YY_BREAK case 68: YY_RULE_SETUP { return ClntParser::DIGEST_NONE_; } YY_BREAK case 69: YY_RULE_SETUP { return ClntParser::DIGEST_PLAIN_; } YY_BREAK case 70: YY_RULE_SETUP { return ClntParser::DIGEST_HMAC_MD5_; } YY_BREAK case 71: YY_RULE_SETUP { return ClntParser::DIGEST_HMAC_SHA1_; } YY_BREAK case 72: YY_RULE_SETUP { return ClntParser::DIGEST_HMAC_SHA224_; } YY_BREAK case 73: YY_RULE_SETUP { return ClntParser::DIGEST_HMAC_SHA256_; } YY_BREAK case 74: YY_RULE_SETUP { return ClntParser::DIGEST_HMAC_SHA384_; } YY_BREAK case 75: YY_RULE_SETUP { return ClntParser::DIGEST_HMAC_SHA512_; } YY_BREAK case 76: YY_RULE_SETUP { return ClntParser::SKIP_CONFIRM_; } YY_BREAK case 77: YY_RULE_SETUP { return ClntParser::AFTR_; } YY_BREAK case 78: YY_RULE_SETUP { return ClntParser::DOWNLINK_PREFIX_IFACES_; } YY_BREAK case 79: YY_RULE_SETUP { return ClntParser::BIND_TO_ADDR_; } YY_BREAK case 80: YY_RULE_SETUP { return ClntParser::EXPERIMENTAL_; } YY_BREAK case 81: YY_RULE_SETUP { return ClntParser::ADDR_PARAMS_; } YY_BREAK case 82: YY_RULE_SETUP ; YY_BREAK case 83: YY_RULE_SETUP ; YY_BREAK case 84: YY_RULE_SETUP { BEGIN(COMMENT); ComBeg=yylineno; } YY_BREAK case 85: YY_RULE_SETUP BEGIN(INITIAL); YY_BREAK case 86: /* rule 86 can match eol */ YY_RULE_SETUP ; YY_BREAK case YY_STATE_EOF(COMMENT): { Log(Crit) << "Comment not closed. (/* in line " << ComBeg << LogEnd; { YYABORT; } } YY_BREAK //IPv6 address - various forms case 87: YY_RULE_SETUP { if(!inet_pton6(yytext,yylval.addrval)) { Log(Crit) << "Invalid address format: [" << yytext << "]" << LogEnd; { YYABORT; } } else { return ClntParser::IPV6ADDR_; } } YY_BREAK case 88: YY_RULE_SETUP { if(!inet_pton6(yytext,yylval.addrval)) { Log(Crit) << "Invalid address format: [" << yytext << "]" << LogEnd; { YYABORT; } } else { return ClntParser::IPV6ADDR_; } } YY_BREAK case 89: YY_RULE_SETUP { if(!inet_pton6(yytext,yylval.addrval)) { Log(Crit) << "Invalid address format: [" << yytext << "]" << LogEnd; { YYABORT; } } else { Log(Crit) << "Invalid address format: [" << yytext << "]" << LogEnd; return ClntParser::IPV6ADDR_; } } YY_BREAK case 90: YY_RULE_SETUP { if(!inet_pton6(yytext,yylval.addrval)) { Log(Crit) << "Invalid address format: [" << yytext << "]" << LogEnd; { YYABORT; } } else { return ClntParser::IPV6ADDR_; } } YY_BREAK case 91: YY_RULE_SETUP { if(!inet_pton6(yytext,yylval.addrval)) { Log(Crit) << "Invalid address format: [" << yytext << "]" << LogEnd; { YYABORT; } } else { return ClntParser::IPV6ADDR_; } } YY_BREAK case 92: YY_RULE_SETUP { if(!inet_pton6(yytext,yylval.addrval)) { Log(Crit) << "Invalid address format: [" << yytext << "]" << LogEnd; { YYABORT; } } else { return ClntParser::IPV6ADDR_; } } YY_BREAK case 93: YY_RULE_SETUP { if(!inet_pton6(yytext,yylval.addrval)) { Log(Crit) << "Invalid address format: [" << yytext << "]" << LogEnd; { YYABORT; } } else { return ClntParser::IPV6ADDR_; } } YY_BREAK case 94: /* rule 94 can match eol */ YY_RULE_SETUP { yylval.strval=new char[strlen(yytext)-1]; strncpy(yylval.strval, yytext+1, strlen(yytext)-2); yylval.strval[strlen(yytext)-2]=0; return ClntParser::STRING_; } YY_BREAK case 95: YY_RULE_SETUP { int len = strlen(yytext); if ( ( (len>2) && !strncasecmp("yes",yytext,3) ) || ( (len>3) && !strncasecmp("true", yytext,4) ) ) { yylval.ival = 1; return ClntParser::INTNUMBER_; } if ( ( (len>1) && !strncasecmp("no",yytext,2) ) || ( (len>4) && !strncasecmp("false",yytext,5) ) ) { yylval.ival = 0; return ClntParser::INTNUMBER_; } yylval.strval=new char[strlen(yytext)+1]; strncpy(yylval.strval, yytext, strlen(yytext)); yylval.strval[strlen(yytext)]=0; return ClntParser::STRING_; } YY_BREAK case 96: YY_RULE_SETUP { // DUID in 0x00010203 format int len; char * ptr; if (strlen(yytext)%2) { yytext[1]='0'; //if odd than no-meaning zero at the beginning len = strlen(yytext)-1; ptr = yytext+1; } else { len = strlen(yytext)-2; ptr = yytext+2; } //and now there is an even number of hex digits yylval.duidval.length = len >> 1; yylval.duidval.duid = new char[len >> 1]; for (int i=0 ; i>1]<<=4; if (!isxdigit(ptr[i])) { Log(Crit) << "DUID parsing failed (" << yytext << ")." << LogEnd; { YYABORT; } } if (isalpha(ptr[i])) { yylval.duidval.duid[i>>1]|=toupper(ptr[i])-'A'+10; } else { yylval.duidval.duid[i>>1]|=ptr[i]-'0'; } } return ClntParser::DUID_; } YY_BREAK case 97: YY_RULE_SETUP { // DUID in 00:01:02:03 format int len = (strlen(yytext)+1)/3; char * pos = 0; yylval.duidval.length = len; yylval.duidval.duid = new char[len]; int i=0; for (pos = yytext; pos<=yytext+strlen(yytext)-2; pos+=3) { char x; if (isalpha(*pos)) x = (toupper(*pos)-'A' + 10); else x = *pos-'0'; x *= 16; if (isalpha(*(pos+1))) x += (toupper(*(pos+1))-'A' + 10); else x += *(pos+1) - '0'; yylval.duidval.duid[i] = x; i++; } return ClntParser::DUID_; } YY_BREAK case 98: YY_RULE_SETUP { yytext[strlen(yytext)-1]='\n'; if(!sscanf(yytext,"%10x",(unsigned int*)&(yylval.ival))) { Log(Crit) << "Hex number parsing [" << yytext << "] failed." << LogEnd; { YYABORT; } } return ClntParser::HEXNUMBER_; } YY_BREAK case 99: YY_RULE_SETUP { if(!sscanf(yytext,"%10u",(unsigned int*)&(yylval.ival))) { Log(Crit) << "Integer parsing [" << yytext << "] failed." << LogEnd; { YYABORT; } } return ClntParser::INTNUMBER_; } YY_BREAK case 100: YY_RULE_SETUP {return yytext[0];} YY_BREAK case 101: YY_RULE_SETUP ECHO; YY_BREAK case YY_STATE_EOF(INITIAL): case YY_STATE_EOF(ADDR): yyterminate(); case YY_END_OF_BUFFER: { /* Amount of text matched not including the EOB char. */ int yy_amount_of_matched_text = (int) (yy_cp - (yytext_ptr)) - 1; /* Undo the effects of YY_DO_BEFORE_ACTION. */ *yy_cp = (yy_hold_char); YY_RESTORE_YY_MORE_OFFSET if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_NEW ) { /* We're scanning a new file or input source. It's * possible that this happened because the user * just pointed yyin at a new source and called * yylex(). If so, then we have to assure * consistency between YY_CURRENT_BUFFER and our * globals. Here is the right place to do so, because * this is the first action (other than possibly a * back-up) that will match for the new input source. */ (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_n_chars; YY_CURRENT_BUFFER_LVALUE->yy_input_file = yyin; YY_CURRENT_BUFFER_LVALUE->yy_buffer_status = YY_BUFFER_NORMAL; } /* Note that here we test for yy_c_buf_p "<=" to the position * of the first EOB in the buffer, since yy_c_buf_p will * already have been incremented past the NUL character * (since all states make transitions on EOB to the * end-of-buffer state). Contrast this with the test * in input(). */ if ( (yy_c_buf_p) <= &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] ) { /* This was really a NUL. */ yy_state_type yy_next_state; (yy_c_buf_p) = (yytext_ptr) + yy_amount_of_matched_text; yy_current_state = yy_get_previous_state( ); /* Okay, we're now positioned to make the NUL * transition. We couldn't have * yy_get_previous_state() go ahead and do it * for us because it doesn't know how to deal * with the possibility of jamming (and we don't * want to build jamming into it because then it * will run more slowly). */ yy_next_state = yy_try_NUL_trans( yy_current_state ); yy_bp = (yytext_ptr) + YY_MORE_ADJ; if ( yy_next_state ) { /* Consume the NUL. */ yy_cp = ++(yy_c_buf_p); yy_current_state = yy_next_state; goto yy_match; } else { yy_cp = (yy_c_buf_p); goto yy_find_action; } } else switch ( yy_get_next_buffer( ) ) { case EOB_ACT_END_OF_FILE: { (yy_did_buffer_switch_on_eof) = 0; if ( yywrap( ) ) { /* Note: because we've taken care in * yy_get_next_buffer() to have set up * yytext, we can now set up * yy_c_buf_p so that if some total * hoser (like flex itself) wants to * call the scanner after we return the * YY_NULL, it'll still work - another * YY_NULL will get returned. */ (yy_c_buf_p) = (yytext_ptr) + YY_MORE_ADJ; yy_act = YY_STATE_EOF(YY_START); goto do_action; } else { if ( ! (yy_did_buffer_switch_on_eof) ) YY_NEW_FILE; } break; } case EOB_ACT_CONTINUE_SCAN: (yy_c_buf_p) = (yytext_ptr) + yy_amount_of_matched_text; yy_current_state = yy_get_previous_state( ); yy_cp = (yy_c_buf_p); yy_bp = (yytext_ptr) + YY_MORE_ADJ; goto yy_match; case EOB_ACT_LAST_MATCH: (yy_c_buf_p) = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)]; yy_current_state = yy_get_previous_state( ); yy_cp = (yy_c_buf_p); yy_bp = (yytext_ptr) + YY_MORE_ADJ; goto yy_find_action; } break; } default: YY_FATAL_ERROR( "fatal flex scanner internal error--no action found" ); } /* end of action switch */ } /* end of scanning one token */ } /* end of user's declarations */ } /* end of yylex */ /* The contents of this function are C++ specific, so the () macro is not used. */ yyFlexLexer::yyFlexLexer( std::istream* arg_yyin, std::ostream* arg_yyout ) { yyin = arg_yyin; yyout = arg_yyout; yy_c_buf_p = 0; yy_init = 0; yy_start = 0; yy_flex_debug = 0; yylineno = 1; // this will only get updated if %option yylineno yy_did_buffer_switch_on_eof = 0; yy_looking_for_trail_begin = 0; yy_more_flag = 0; yy_more_len = 0; yy_more_offset = yy_prev_more_offset = 0; yy_start_stack_ptr = yy_start_stack_depth = 0; yy_start_stack = NULL; yy_buffer_stack = 0; yy_buffer_stack_top = 0; yy_buffer_stack_max = 0; yy_state_buf = 0; } /* The contents of this function are C++ specific, so the () macro is not used. */ yyFlexLexer::~yyFlexLexer() { delete [] yy_state_buf; yyfree(yy_start_stack ); yy_delete_buffer( YY_CURRENT_BUFFER ); yyfree(yy_buffer_stack ); } /* The contents of this function are C++ specific, so the () macro is not used. */ void yyFlexLexer::switch_streams( std::istream* new_in, std::ostream* new_out ) { if ( new_in ) { yy_delete_buffer( YY_CURRENT_BUFFER ); yy_switch_to_buffer( yy_create_buffer( new_in, YY_BUF_SIZE ) ); } if ( new_out ) yyout = new_out; } #ifdef YY_INTERACTIVE int yyFlexLexer::LexerInput( char* buf, int /* max_size */ ) #else int yyFlexLexer::LexerInput( char* buf, int max_size ) #endif { if ( yyin->eof() || yyin->fail() ) return 0; #ifdef YY_INTERACTIVE yyin->get( buf[0] ); if ( yyin->eof() ) return 0; if ( yyin->bad() ) return -1; return 1; #else (void) yyin->read( buf, max_size ); if ( yyin->bad() ) return -1; else return yyin->gcount(); #endif } void yyFlexLexer::LexerOutput( const char* buf, int size ) { (void) yyout->write( buf, size ); } /* yy_get_next_buffer - try to read in a new buffer * * Returns a code representing an action: * EOB_ACT_LAST_MATCH - * EOB_ACT_CONTINUE_SCAN - continue scanning from current position * EOB_ACT_END_OF_FILE - end of file */ int yyFlexLexer::yy_get_next_buffer() { register char *dest = YY_CURRENT_BUFFER_LVALUE->yy_ch_buf; register char *source = (yytext_ptr); register int number_to_move, i; int ret_val; if ( (yy_c_buf_p) > &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars) + 1] ) YY_FATAL_ERROR( "fatal flex scanner internal error--end of buffer missed" ); if ( YY_CURRENT_BUFFER_LVALUE->yy_fill_buffer == 0 ) { /* Don't try to fill the buffer, so this is an EOF. */ if ( (yy_c_buf_p) - (yytext_ptr) - YY_MORE_ADJ == 1 ) { /* We matched a single character, the EOB, so * treat this as a final EOF. */ return EOB_ACT_END_OF_FILE; } else { /* We matched some text prior to the EOB, first * process it. */ return EOB_ACT_LAST_MATCH; } } /* Try to read more data. */ /* First move last chars to start of buffer. */ number_to_move = (int) ((yy_c_buf_p) - (yytext_ptr)) - 1; for ( i = 0; i < number_to_move; ++i ) *(dest++) = *(source++); if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_EOF_PENDING ) /* don't do the read, it's not guaranteed to return an EOF, * just force an EOF */ YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars) = 0; else { yy_size_t num_to_read = YY_CURRENT_BUFFER_LVALUE->yy_buf_size - number_to_move - 1; while ( num_to_read <= 0 ) { /* Not enough room in the buffer - grow it. */ /* just a shorter name for the current buffer */ YY_BUFFER_STATE b = YY_CURRENT_BUFFER_LVALUE; int yy_c_buf_p_offset = (int) ((yy_c_buf_p) - b->yy_ch_buf); if ( b->yy_is_our_buffer ) { yy_size_t new_size = b->yy_buf_size * 2; if ( new_size <= 0 ) b->yy_buf_size += b->yy_buf_size / 8; else b->yy_buf_size *= 2; b->yy_ch_buf = (char *) /* Include room in for 2 EOB chars. */ yyrealloc((void *) b->yy_ch_buf,b->yy_buf_size + 2 ); } else /* Can't grow it, we don't own it. */ b->yy_ch_buf = 0; if ( ! b->yy_ch_buf ) YY_FATAL_ERROR( "fatal error - scanner input buffer overflow" ); (yy_c_buf_p) = &b->yy_ch_buf[yy_c_buf_p_offset]; num_to_read = YY_CURRENT_BUFFER_LVALUE->yy_buf_size - number_to_move - 1; } if ( num_to_read > YY_READ_BUF_SIZE ) num_to_read = YY_READ_BUF_SIZE; /* Read in more data. */ YY_INPUT( (&YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move]), (yy_n_chars), num_to_read ); YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars); } if ( (yy_n_chars) == 0 ) { if ( number_to_move == YY_MORE_ADJ ) { ret_val = EOB_ACT_END_OF_FILE; yyrestart( yyin ); } else { ret_val = EOB_ACT_LAST_MATCH; YY_CURRENT_BUFFER_LVALUE->yy_buffer_status = YY_BUFFER_EOF_PENDING; } } else ret_val = EOB_ACT_CONTINUE_SCAN; if ((yy_size_t) ((yy_n_chars) + number_to_move) > YY_CURRENT_BUFFER_LVALUE->yy_buf_size) { /* Extend the array by 50%, plus the number we really need. */ yy_size_t new_size = (yy_n_chars) + number_to_move + ((yy_n_chars) >> 1); YY_CURRENT_BUFFER_LVALUE->yy_ch_buf = (char *) yyrealloc((void *) YY_CURRENT_BUFFER_LVALUE->yy_ch_buf,new_size ); if ( ! YY_CURRENT_BUFFER_LVALUE->yy_ch_buf ) YY_FATAL_ERROR( "out of dynamic memory in yy_get_next_buffer()" ); } (yy_n_chars) += number_to_move; YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] = YY_END_OF_BUFFER_CHAR; YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars) + 1] = YY_END_OF_BUFFER_CHAR; (yytext_ptr) = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[0]; return ret_val; } /* yy_get_previous_state - get the state just before the EOB char was reached */ yy_state_type yyFlexLexer::yy_get_previous_state() { register yy_state_type yy_current_state; register char *yy_cp; yy_current_state = (yy_start); for ( yy_cp = (yytext_ptr) + YY_MORE_ADJ; yy_cp < (yy_c_buf_p); ++yy_cp ) { register YY_CHAR yy_c = (*yy_cp ? yy_ec[YY_SC_TO_UI(*yy_cp)] : 1); if ( yy_accept[yy_current_state] ) { (yy_last_accepting_state) = yy_current_state; (yy_last_accepting_cpos) = yy_cp; } while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) { yy_current_state = (int) yy_def[yy_current_state]; if ( yy_current_state >= 867 ) yy_c = yy_meta[(unsigned int) yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; } return yy_current_state; } /* yy_try_NUL_trans - try to make a transition on the NUL character * * synopsis * next_state = yy_try_NUL_trans( current_state ); */ yy_state_type yyFlexLexer::yy_try_NUL_trans( yy_state_type yy_current_state ) { register int yy_is_jam; register char *yy_cp = (yy_c_buf_p); register YY_CHAR yy_c = 1; if ( yy_accept[yy_current_state] ) { (yy_last_accepting_state) = yy_current_state; (yy_last_accepting_cpos) = yy_cp; } while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) { yy_current_state = (int) yy_def[yy_current_state]; if ( yy_current_state >= 867 ) yy_c = yy_meta[(unsigned int) yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; yy_is_jam = (yy_current_state == 866); return yy_is_jam ? 0 : yy_current_state; } void yyFlexLexer::yyunput( int c, register char* yy_bp) { register char *yy_cp; yy_cp = (yy_c_buf_p); /* undo effects of setting up yytext */ *yy_cp = (yy_hold_char); if ( yy_cp < YY_CURRENT_BUFFER_LVALUE->yy_ch_buf + 2 ) { /* need to shift things up to make room */ /* +2 for EOB chars. */ register yy_size_t number_to_move = (yy_n_chars) + 2; register char *dest = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[ YY_CURRENT_BUFFER_LVALUE->yy_buf_size + 2]; register char *source = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move]; while ( source > YY_CURRENT_BUFFER_LVALUE->yy_ch_buf ) *--dest = *--source; yy_cp += (int) (dest - source); yy_bp += (int) (dest - source); YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_buf_size; if ( yy_cp < YY_CURRENT_BUFFER_LVALUE->yy_ch_buf + 2 ) YY_FATAL_ERROR( "flex scanner push-back overflow" ); } *--yy_cp = (char) c; if ( c == '\n' ){ --yylineno; } (yytext_ptr) = yy_bp; (yy_hold_char) = *yy_cp; (yy_c_buf_p) = yy_cp; } int yyFlexLexer::yyinput() { int c; *(yy_c_buf_p) = (yy_hold_char); if ( *(yy_c_buf_p) == YY_END_OF_BUFFER_CHAR ) { /* yy_c_buf_p now points to the character we want to return. * If this occurs *before* the EOB characters, then it's a * valid NUL; if not, then we've hit the end of the buffer. */ if ( (yy_c_buf_p) < &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] ) /* This was really a NUL. */ *(yy_c_buf_p) = '\0'; else { /* need more input */ yy_size_t offset = (yy_c_buf_p) - (yytext_ptr); ++(yy_c_buf_p); switch ( yy_get_next_buffer( ) ) { case EOB_ACT_LAST_MATCH: /* This happens because yy_g_n_b() * sees that we've accumulated a * token and flags that we need to * try matching the token before * proceeding. But for input(), * there's no matching to consider. * So convert the EOB_ACT_LAST_MATCH * to EOB_ACT_END_OF_FILE. */ /* Reset buffer status. */ yyrestart( yyin ); /*FALLTHROUGH*/ case EOB_ACT_END_OF_FILE: { if ( yywrap( ) ) return EOF; if ( ! (yy_did_buffer_switch_on_eof) ) YY_NEW_FILE; #ifdef __cplusplus return yyinput(); #else return input(); #endif } case EOB_ACT_CONTINUE_SCAN: (yy_c_buf_p) = (yytext_ptr) + offset; break; } } } c = *(unsigned char *) (yy_c_buf_p); /* cast for 8-bit char's */ *(yy_c_buf_p) = '\0'; /* preserve yytext */ (yy_hold_char) = *++(yy_c_buf_p); if ( c == '\n' ) yylineno++; ; return c; } /** Immediately switch to a different input stream. * @param input_file A readable stream. * * @note This function does not reset the start condition to @c INITIAL . */ void yyFlexLexer::yyrestart( std::istream* input_file ) { if ( ! YY_CURRENT_BUFFER ){ yyensure_buffer_stack (); YY_CURRENT_BUFFER_LVALUE = yy_create_buffer( yyin, YY_BUF_SIZE ); } yy_init_buffer( YY_CURRENT_BUFFER, input_file ); yy_load_buffer_state( ); } /** Switch to a different input buffer. * @param new_buffer The new input buffer. * */ void yyFlexLexer::yy_switch_to_buffer( YY_BUFFER_STATE new_buffer ) { /* TODO. We should be able to replace this entire function body * with * yypop_buffer_state(); * yypush_buffer_state(new_buffer); */ yyensure_buffer_stack (); if ( YY_CURRENT_BUFFER == new_buffer ) return; if ( YY_CURRENT_BUFFER ) { /* Flush out information for old buffer. */ *(yy_c_buf_p) = (yy_hold_char); YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = (yy_c_buf_p); YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars); } YY_CURRENT_BUFFER_LVALUE = new_buffer; yy_load_buffer_state( ); /* We don't actually know whether we did this switch during * EOF (yywrap()) processing, but the only time this flag * is looked at is after yywrap() is called, so it's safe * to go ahead and always set it. */ (yy_did_buffer_switch_on_eof) = 1; } void yyFlexLexer::yy_load_buffer_state() { (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_n_chars; (yytext_ptr) = (yy_c_buf_p) = YY_CURRENT_BUFFER_LVALUE->yy_buf_pos; yyin = YY_CURRENT_BUFFER_LVALUE->yy_input_file; (yy_hold_char) = *(yy_c_buf_p); } /** Allocate and initialize an input buffer state. * @param file A readable stream. * @param size The character buffer size in bytes. When in doubt, use @c YY_BUF_SIZE. * * @return the allocated buffer state. */ YY_BUFFER_STATE yyFlexLexer::yy_create_buffer( std::istream* file, int size ) { YY_BUFFER_STATE b; b = (YY_BUFFER_STATE) yyalloc(sizeof( struct yy_buffer_state ) ); if ( ! b ) YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" ); b->yy_buf_size = size; /* yy_ch_buf has to be 2 characters longer than the size given because * we need to put in 2 end-of-buffer characters. */ b->yy_ch_buf = (char *) yyalloc(b->yy_buf_size + 2 ); if ( ! b->yy_ch_buf ) YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" ); b->yy_is_our_buffer = 1; yy_init_buffer( b, file ); return b; } /** Destroy the buffer. * @param b a buffer created with yy_create_buffer() * */ void yyFlexLexer::yy_delete_buffer( YY_BUFFER_STATE b ) { if ( ! b ) return; if ( b == YY_CURRENT_BUFFER ) /* Not sure if we should pop here. */ YY_CURRENT_BUFFER_LVALUE = (YY_BUFFER_STATE) 0; if ( b->yy_is_our_buffer ) yyfree((void *) b->yy_ch_buf ); yyfree((void *) b ); } /* Initializes or reinitializes a buffer. * This function is sometimes called more than once on the same buffer, * such as during a yyrestart() or at EOF. */ void yyFlexLexer::yy_init_buffer( YY_BUFFER_STATE b, std::istream* file ) { int oerrno = errno; yy_flush_buffer( b ); b->yy_input_file = file; b->yy_fill_buffer = 1; /* If b is the current buffer, then yy_init_buffer was _probably_ * called from yyrestart() or through yy_get_next_buffer. * In that case, we don't want to reset the lineno or column. */ if (b != YY_CURRENT_BUFFER){ b->yy_bs_lineno = 1; b->yy_bs_column = 0; } b->yy_is_interactive = 0; errno = oerrno; } /** Discard all buffered characters. On the next scan, YY_INPUT will be called. * @param b the buffer state to be flushed, usually @c YY_CURRENT_BUFFER. * */ void yyFlexLexer::yy_flush_buffer( YY_BUFFER_STATE b ) { if ( ! b ) return; b->yy_n_chars = 0; /* We always need two end-of-buffer characters. The first causes * a transition to the end-of-buffer state. The second causes * a jam in that state. */ b->yy_ch_buf[0] = YY_END_OF_BUFFER_CHAR; b->yy_ch_buf[1] = YY_END_OF_BUFFER_CHAR; b->yy_buf_pos = &b->yy_ch_buf[0]; b->yy_at_bol = 1; b->yy_buffer_status = YY_BUFFER_NEW; if ( b == YY_CURRENT_BUFFER ) yy_load_buffer_state( ); } /** Pushes the new state onto the stack. The new state becomes * the current state. This function will allocate the stack * if necessary. * @param new_buffer The new state. * */ void yyFlexLexer::yypush_buffer_state (YY_BUFFER_STATE new_buffer) { if (new_buffer == NULL) return; yyensure_buffer_stack(); /* This block is copied from yy_switch_to_buffer. */ if ( YY_CURRENT_BUFFER ) { /* Flush out information for old buffer. */ *(yy_c_buf_p) = (yy_hold_char); YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = (yy_c_buf_p); YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars); } /* Only push if top exists. Otherwise, replace top. */ if (YY_CURRENT_BUFFER) (yy_buffer_stack_top)++; YY_CURRENT_BUFFER_LVALUE = new_buffer; /* copied from yy_switch_to_buffer. */ yy_load_buffer_state( ); (yy_did_buffer_switch_on_eof) = 1; } /** Removes and deletes the top of the stack, if present. * The next element becomes the new top. * */ void yyFlexLexer::yypop_buffer_state (void) { if (!YY_CURRENT_BUFFER) return; yy_delete_buffer(YY_CURRENT_BUFFER ); YY_CURRENT_BUFFER_LVALUE = NULL; if ((yy_buffer_stack_top) > 0) --(yy_buffer_stack_top); if (YY_CURRENT_BUFFER) { yy_load_buffer_state( ); (yy_did_buffer_switch_on_eof) = 1; } } /* Allocates the stack if it does not exist. * Guarantees space for at least one push. */ void yyFlexLexer::yyensure_buffer_stack(void) { yy_size_t num_to_alloc; if (!(yy_buffer_stack)) { /* First allocation is just for 2 elements, since we don't know if this * scanner will even need a stack. We use 2 instead of 1 to avoid an * immediate realloc on the next call. */ num_to_alloc = 1; (yy_buffer_stack) = (struct yy_buffer_state**)yyalloc (num_to_alloc * sizeof(struct yy_buffer_state*) ); if ( ! (yy_buffer_stack) ) YY_FATAL_ERROR( "out of dynamic memory in yyensure_buffer_stack()" ); memset((yy_buffer_stack), 0, num_to_alloc * sizeof(struct yy_buffer_state*)); (yy_buffer_stack_max) = num_to_alloc; (yy_buffer_stack_top) = 0; return; } if ((yy_buffer_stack_top) >= ((yy_buffer_stack_max)) - 1){ /* Increase the buffer to prepare for a possible push. */ int grow_size = 8 /* arbitrary grow size */; num_to_alloc = (yy_buffer_stack_max) + grow_size; (yy_buffer_stack) = (struct yy_buffer_state**)yyrealloc ((yy_buffer_stack), num_to_alloc * sizeof(struct yy_buffer_state*) ); if ( ! (yy_buffer_stack) ) YY_FATAL_ERROR( "out of dynamic memory in yyensure_buffer_stack()" ); /* zero only the new slots.*/ memset((yy_buffer_stack) + (yy_buffer_stack_max), 0, grow_size * sizeof(struct yy_buffer_state*)); (yy_buffer_stack_max) = num_to_alloc; } } void yyFlexLexer::yy_push_state( int new_state ) { if ( (yy_start_stack_ptr) >= (yy_start_stack_depth) ) { yy_size_t new_size; (yy_start_stack_depth) += YY_START_STACK_INCR; new_size = (yy_start_stack_depth) * sizeof( int ); if ( ! (yy_start_stack) ) (yy_start_stack) = (int *) yyalloc(new_size ); else (yy_start_stack) = (int *) yyrealloc((void *) (yy_start_stack),new_size ); if ( ! (yy_start_stack) ) YY_FATAL_ERROR( "out of memory expanding start-condition stack" ); } (yy_start_stack)[(yy_start_stack_ptr)++] = YY_START; BEGIN(new_state); } void yyFlexLexer::yy_pop_state() { if ( --(yy_start_stack_ptr) < 0 ) YY_FATAL_ERROR( "start-condition stack underflow" ); BEGIN((yy_start_stack)[(yy_start_stack_ptr)]); } int yyFlexLexer::yy_top_state() { return (yy_start_stack)[(yy_start_stack_ptr) - 1]; } #ifndef YY_EXIT_FAILURE #define YY_EXIT_FAILURE 2 #endif void yyFlexLexer::LexerError( yyconst char msg[] ) { std::cerr << msg << std::endl; exit( YY_EXIT_FAILURE ); } /* Redefine yyless() so it works in section 3 code. */ #undef yyless #define yyless(n) \ do \ { \ /* Undo effects of setting up yytext. */ \ int yyless_macro_arg = (n); \ YY_LESS_LINENO(yyless_macro_arg);\ yytext[yyleng] = (yy_hold_char); \ (yy_c_buf_p) = yytext + yyless_macro_arg; \ (yy_hold_char) = *(yy_c_buf_p); \ *(yy_c_buf_p) = '\0'; \ yyleng = yyless_macro_arg; \ } \ while ( 0 ) /* Accessor methods (get/set functions) to struct members. */ /* * Internal utility routines. */ #ifndef yytext_ptr static void yy_flex_strncpy (char* s1, yyconst char * s2, int n ) { register int i; for ( i = 0; i < n; ++i ) s1[i] = s2[i]; } #endif #ifdef YY_NEED_STRLEN static int yy_flex_strlen (yyconst char * s ) { register int n; for ( n = 0; s[n]; ++n ) ; return n; } #endif void *yyalloc (yy_size_t size ) { return (void *) malloc( size ); } void *yyrealloc (void * ptr, yy_size_t size ) { /* The cast to (char *) in the following accommodates both * implementations that use char* generic pointers, and those * that use void* generic pointers. It works with the latter * because both ANSI C and C++ allow castless assignment from * any pointer type to void*, and deal with argument conversions * as though doing an assignment. */ return (void *) realloc( (char *) ptr, size ); } void yyfree (void * ptr ) { free( (char *) ptr ); /* see yyrealloc() for (char *) cast */ } #define YYTABLES_NAME "yytables" dibbler-1.0.1/ClntCfgMgr/ClntParsIfaceOpt.h0000644000175000017500000000717412474447060015356 00000000000000/* * Dibbler - a portable DHCPv6 * * authors: Tomasz Mrugalski * Marek Senderski * changes: Krzysztof Wnuk * * released under GNU GPL v2 only licence * */ #ifndef CLNTPARSEIFACEOPT_H #define CLNTPARSEIFACEOPT_H #include #include #include "DHCPConst.h" #include "Container.h" #include "ClntParsIAOpt.h" #include "HostID.h" #include "IPv6Addr.h" #include "OptVendorSpecInfo.h" class TClntParsIfaceOpt : public TClntParsIAOpt { public: TClntParsIfaceOpt(); ~TClntParsIfaceOpt(); void setUnicast(bool unicast); bool getUnicast(); bool getRapidCommit(); void setRapidCommit(bool rapid); bool getStateful(); void setStateful(bool state); //-- options related methods -- // option: DNS Servers List(TIPv6Addr) * getDNSServerLst(); void setDNSServerLst(List(TIPv6Addr) *lst); bool getReqDNSServer(); // option: Domain List(std::string) * getDomainLst(); void setDomainLst(List(std::string) * domains); bool getReqDomain(); // option: NTP servers List(TIPv6Addr) * getNTPServerLst(); void setNTPServerLst(List(TIPv6Addr) *lst); bool getReqNTPServer(); // option: Timezone std::string getTimezone(); void setTimezone(const std::string& timeZone); bool getReqTimezone(); // option: SIP servers List(TIPv6Addr) * getSIPServerLst(); void setSIPServerLst(List(TIPv6Addr) *addr); bool getReqSIPServer(); // option: SIP domains List(std::string) * getSIPDomainLst(); void setSIPDomainLst(List(std::string) *domainlist); bool getReqSIPDomain(); // option: FQDN std::string getFQDN(); void setFQDN(const std::string& fqdn); bool getReqFQDN(); // option: NIS servers List(TIPv6Addr) * getNISServerLst(); void setNISServerLst( List(TIPv6Addr) *nislist); bool getReqNISServer(); // option: NIS+ servers List(TIPv6Addr) * getNISPServerLst(); void setNISPServerLst( List(TIPv6Addr) *nisplist); bool getReqNISPServer(); // option: NIS domain std::string getNISDomain(); void setNISDomain(const std::string& domain); bool getReqNISDomain(); // option: NISP domain std::string getNISPDomain(); void setNISPDomain(const std::string& domain); bool getReqNISPDomain(); // option: Lifetime bool getLifetime(); void setLifetime(); bool getReqLifetime(); // option: Prefix Delegation void setPrefixDelegation(); bool getReqPrefixDelegation(); // option: vendor-spec void setVendorSpec(List(TOptVendorSpecInfo) vendorSpec); void setVendorSpec(); bool getReqVendorSpec(); List(TOptVendorSpecInfo) getVendorSpec(); private: /// defined whether this interface is running in stateless mode bool Stateless_; /// do we accept unicast? bool Unicast; /// should we try to use rapid-commit? bool RapidCommit; List(TIPv6Addr) DNSServerLst; List(std::string) DomainLst; List(TIPv6Addr) NTPServerLst; std::string Timezone; List(TIPv6Addr) SIPServerLst; List(std::string) SIPDomainLst; std::string FQDN; List(TIPv6Addr) NISServerLst; List(TIPv6Addr) NISPServerLst; std::string NISDomain; std::string NISPDomain; bool Lifetime; List(TOptVendorSpecInfo) VendorSpec; bool ReqDNSServer; bool ReqDomain; bool ReqNTPServer; bool ReqTimezone; bool ReqSIPServer; bool ReqSIPDomain; bool ReqFQDN; bool ReqNISServer; bool ReqNISPServer; bool ReqNISDomain; bool ReqNISPDomain; bool ReqLifetime; bool ReqPrefixDelegation; bool ReqVendorSpec; }; #endif dibbler-1.0.1/ClntCfgMgr/ClntCfgIA.cpp0000644000175000017500000000427612277722750014305 00000000000000/* * Dibbler - a portable DHCPv6 * * authors: Tomasz Mrugalski * Marek Senderski * * released under GNU GPL v2 only licence */ #include #include #include "ClntCfgIA.h" #include "DHCPDefaults.h" #include "Logger.h" using namespace std; TClntCfgIA::TClntCfgIA() :IAID(newID()), T1(CLIENT_DEFAULT_T1), T2(CLIENT_DEFAULT_T2), State(STATE_NOTCONFIGURED), AddrParams(false) { } long TClntCfgIA::newID(){ static unsigned long nextIAID=1; return nextIAID++; } long TClntCfgIA::countAddr() { return ClntCfgAddrLst.count(); } unsigned long TClntCfgIA::getT1() { return T1; } unsigned long TClntCfgIA::getT2() { return T2; } void TClntCfgIA::setState(enum EState state) { State = state; } enum EState TClntCfgIA::getState() { return State; } long TClntCfgIA::getIAID() { return IAID; } void TClntCfgIA::setIAID(long iaid) { IAID=iaid; } void TClntCfgIA::reset() { this->State = STATE_NOTCONFIGURED; } void TClntCfgIA::firstAddr() { ClntCfgAddrLst.first(); } SPtr TClntCfgIA::getAddr() { return ClntCfgAddrLst.get(); } TClntCfgIA::TClntCfgIA(SPtr right, long iaid) :IAID(iaid), T1(right->getT1()), T2(right->getT2()), State(STATE_NOTCONFIGURED), ClntCfgAddrLst(right->ClntCfgAddrLst), AddrParams(false) { } void TClntCfgIA::setOptions(SPtr opt) { T1=opt->getT1(); T2=opt->getT2(); AddrParams = opt->getAddrParams(); } void TClntCfgIA::addAddr(SPtr addr) { this->ClntCfgAddrLst.append(addr); } bool TClntCfgIA::getAddrParams() { return AddrParams; } ostream& operator<<(ostream& out,TClntCfgIA& ia) { out << " " << std::endl; SPtr addr; ia.ClntCfgAddrLst.first(); while(addr=ia.ClntCfgAddrLst.get()) { out << " " << *addr; } if (ia.AddrParams) out << " " << endl; out << " " << std::endl; return out; } dibbler-1.0.1/ClntCfgMgr/ClntCfgMgr.cpp0000644000175000017500000010127612556513124014530 00000000000000/* * Dibbler - a portable DHCPv6 * * authors: Tomasz Mrugalski * Marek Senderski * changes: Krzysztof Wnuk * Michal Kowalczuk * * released under GNU GPL v2 only licence * */ #include #include #include #include "SmartPtr.h" #include "Portable.h" #include "ClntCfgMgr.h" #include "ClntCfgIface.h" #include "Logger.h" using namespace std; #include "FlexLexer.h" #include "ClntIfaceMgr.h" #include "ClntParsGlobalOpt.h" #include "ClntParser.h" #include "hex.h" TClntCfgMgr * TClntCfgMgr::Instance = 0; #ifdef MOD_CLNT_EMBEDDED_CFG static bool HardcodedCfgExample(TClntCfgMgr *cfgMgr, string params); #endif extern std::string CLNTCONF_FILE; TClntCfgMgr & TClntCfgMgr::instance() { if (!Instance) { Log(Crit) << "Application error. Tried to access CfgMgr without instanceCreate!" << LogEnd; instanceCreate(CLNTCONF_FILE); } // throw an exception here or something return *Instance; } void TClntCfgMgr::instanceCreate(const std::string& cfgFile) { Instance = new TClntCfgMgr(cfgFile); } TClntCfgMgr::TClntCfgMgr(const std::string& cfgFile) :TCfgMgr(), ScriptName(DEFAULT_SCRIPT), ObeyRaBits_(false) { #ifdef MOD_REMOTE_AUTOCONF RemoteAutoconf = false; #endif Reconfigure = false; // parse configuration file if (!parseConfigFile(cfgFile)) { IsDone = true; return; } // load or create DUID string duidFile = (string)CLNTDUID_FILE; if (!setDUID(duidFile, ClntIfaceMgr())) { IsDone = true; return; } this->dump(); #ifndef MOD_DISABLE_AUTH AuthKeys = new KeyList(); // create dummy empty keylist #endif } void TClntCfgMgr::dump() { // store ClntCfgMgr in file std::ofstream xmlDump; xmlDump.open(CLNTCFGMGR_FILE); xmlDump << *this; xmlDump.close(); } bool TClntCfgMgr::parseConfigFile(const std::string& cfgFile) { #ifndef MOD_CLNT_EMBEDDED_CFG // --- normal operation: read config. file --- // parse config file ifstream f; f.open(cfgFile.c_str()); if ( ! f.is_open() ) { Log(Crit) << "Unable to open " << cfgFile << " file." << LogEnd; return false; } else { Log(Notice) << "Parsing " << cfgFile << " config file..." << LogEnd; } yyFlexLexer lexer(&f,&clog); ClntParser parser(&lexer); parser.CfgMgr = this; // just a workaround to access CfgMgr while still being in constructor int result = parser.yyparse(); Log(Debug) << "Parsing " << cfgFile << " done, result=" << result << (result?"(failure)":"(success)") << LogEnd; f.close(); if (result) { //Result!=0 means config errors. Finish whole DHCPClient Log(Crit) << "Fatal error during config parsing." << LogEnd; this->DUID=new TDUID(); return false; } if (!setGlobalOptions(&parser)) { return false; } // match parsed interfaces with interfaces detected in system if (!matchParsedSystemInterfaces(&parser)) { return false; } #else // --- use hardcoded config --- // use your favourite configuration generator function here HardcodedCfgFunc *cfgMaker = &HardcodedCfgExample; // call your function here cfgMaker(this, cfgFile); #endif // check config consistency if(!validateConfig()) { return false; } return true; } /** * match parsed interfaces with interfaces detected in system. * ClntCfgIface objects copied to CfgMgr. * * @param parser * * @return true if ok, false if interface definitions are incorrect */ bool TClntCfgMgr::matchParsedSystemInterfaces(ClntParser *parser) { int cfgIfaceCnt; cfgIfaceCnt = parser->ClntCfgIfaceLst.count(); Log(Debug) << cfgIfaceCnt << " interface(s) specified in " << CLNTCONF_FILE << LogEnd; SPtr cfgIface; SPtr ifaceIface; if (cfgIfaceCnt) { // user specified some interfaces in config file parser->ClntCfgIfaceLst.first(); while(cfgIface = parser->ClntCfgIfaceLst.get()) { // for each interface (from config file) if (cfgIface->getID()==-1) { ifaceIface = ClntIfaceMgr().getIfaceByName(cfgIface->getName()); } else { ifaceIface = ClntIfaceMgr().getIfaceByID(cfgIface->getID()); } if (!ifaceIface) { if (inactiveMode()) { Log(Info) << "Interface " << cfgIface->getFullName() << " is not currently available (that's ok, inactive-mode enabled)." << LogEnd; continue; } Log(Error) << "Interface " << cfgIface->getFullName() << " specified in " << CLNTCONF_FILE << " is not present or does not support IPv6." << LogEnd; return false; } if (cfgIface->noConfig()) { Log(Info) << "Interface " << cfgIface->getFullName() << " has flag no-config set, so it is ignored." << LogEnd; continue; } #ifdef MOD_REMOTE_AUTOCONF if (RemoteAutoconf) { List(TIPv6Addr) emptyLst; SPtr optNeighbors = new TOptAddrLst(OPTION_NEIGHBORS, emptyLst, 0); Log(Debug) << "Enabled Neighbors option on " << cfgIface->getFullName() << LogEnd; cfgIface->addExtraOption(optNeighbors, false); } #endif cfgIface->setIfaceName(ifaceIface->getName()); cfgIface->setIfaceID(ifaceIface->getID()); // setup default prefix length (used when IPv6 address is added to the interface) ifaceIface->setPrefixLength(cfgIface->getOnLinkPrefixLength()); if (!ifaceIface->flagUp() || !ifaceIface->countLLAddress()) { if (inactiveMode()) { Log(Notice) << "Interface " << ifaceIface->getFullName() << " is not operational yet (does not have " << "link-local address or is down), skipping it for now." << LogEnd; addIface(cfgIface); makeInactiveIface(cfgIface->getID(), true, true, true); // move it to InactiveLst continue; } Log(Crit) << "Interface " << ifaceIface->getFullName() << " is down or doesn't have any link-local address." << LogEnd; return false; } // Check if the interface is during bring-up phase // (i.e. DAD procedure for link-local addr is not complete yet) char tmp[64]; if (cfgIface->getBindToAddr()) { inet_ntop6(cfgIface->getBindToAddr()->getPlain(), tmp); } else { ifaceIface->firstLLAddress(); inet_ntop6(ifaceIface->getLLAddress(), tmp); } if (is_addr_tentative(ifaceIface->getName(), ifaceIface->getID(), tmp) == LOWLEVEL_TENTATIVE_YES) { Log(Notice) << "Interface " << ifaceIface->getFullName() << " has link-local address " << tmp << ", but it is currently tentative." << LogEnd; if (this->inactiveMode()) { Log(Notice) << "Interface " << ifaceIface->getFullName() << " is not operational yet (link-local address " << "is not ready), skipping it for now." << LogEnd; addIface(cfgIface); makeInactiveIface(cfgIface->getID(), true, true, true); // move it to InactiveLst continue; } Log(Crit) << "Interface " << ifaceIface->getFullName() << " has tentative link-local address (and inactive-mode is disabled)." << LogEnd; return false; } if (obeyRaBits()) { if (!ifaceIface->getMBit() && !ifaceIface->getOBit()) { Log(Info) << "Interface " << cfgIface->getFullName() << " configuration loaded, but did not receive a Router " << "Advertisement with M or O bits set, adding to inactive." << LogEnd; addIface(cfgIface); makeInactiveIface(cfgIface->getID(), true, true, true); // move it to inactive list continue; } cfgIface->setMbit(ifaceIface->getMBit()); cfgIface->setObit(ifaceIface->getOBit()); } addIface(cfgIface); Log(Info) << "Interface " << cfgIface->getFullName() << " configuration has been loaded." << LogEnd; } return countIfaces() || (inactiveMode() && inactiveIfacesCnt()); } else { // user didn't specified any interfaces in config file, so // we'll try to configure each interface we could find Log(Warning) << "Config file does not contain any interface definitions. Trying to autodetect." << LogEnd; List(TIPv6Addr) dnsList; dnsList.clear(); parser->ParserOptStack.getLast()->setDNSServerLst(&dnsList); // Try to add a hostname char hostname[255]; if (get_hostname(hostname, 255) == LOWLEVEL_NO_ERROR) { parser->ParserOptStack.getLast()->setFQDN(string(hostname)); } else { parser->ParserOptStack.getLast()->setFQDN(string("")); } int cnt = 0; ClntIfaceMgr().firstIface(); while ( ifaceIface = ClntIfaceMgr().getIface() ) { // for each interface present in the system... if (!inactiveMode()) { if (!ifaceIface->flagUp()) { Log(Notice) << "Interface " << ifaceIface->getFullName() << " is down, ignoring." << LogEnd; continue; } if (!ifaceIface->flagRunning()) { Log(Notice) << "Interface " << ifaceIface->getFullName() << " has flag RUNNING not set, ignoring." << LogEnd; continue; } if (!ifaceIface->flagMulticast()) { Log(Notice) << "Interface " << ifaceIface->getFullName() << " is not multicast capable, ignoring." << LogEnd; continue; } } if ( !(ifaceIface->getMacLen() > 5) ) { Log(Notice) << "Interface " << ifaceIface->getFullName() << " has MAC address length " << ifaceIface->getMacLen() << " (6 or more required), ignoring." << LogEnd; continue; } // ignore disabled Teredo pseudo-interface on Win (and other similar useless junk) const static unsigned char zeros[] = {0,0,0,0,0,0,0,0}; const static unsigned char ones[] = {0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff}; if ( (ifaceIface->getMacLen()<=8) && (!memcmp(zeros, ifaceIface->getMac(), min(8,ifaceIface->getMacLen())) || !memcmp(ones, ifaceIface->getMac(), min(8,ifaceIface->getMacLen()))) ) { Log(Notice) << "Interface " << ifaceIface->getFullName() << " has invalid MAC address " << hexToText((uint8_t*)ifaceIface->getMac(), ifaceIface->getMacLen(), true) << ", ignoring." << LogEnd; continue; } if (!ifaceIface->countLLAddress()) { Log(Notice) << "Interface " << ifaceIface->getFullName() << " has no link-local address, ignoring. " << "(Disconnected? Not associated? No-link?)" << LogEnd; continue; } // One address... SPtr addr(new TClntCfgAddr()); addr->setOptions(parser->ParserOptStack.getLast()); // ... is stored in one IA... SPtr ia = new TClntCfgIA(); ia->setOptions(parser->ParserOptStack.getLast()); ia->addAddr(addr); // ... on this newly created interface... cfgIface = SPtr(new TClntCfgIface(ifaceIface->getID())); cfgIface->setIfaceName(ifaceIface->getName()); cfgIface->setIfaceID(ifaceIface->getID()); cfgIface->addIA(ia); cfgIface->setOptions(parser->ParserOptStack.getLast()); // ... which is added to ClntCfgMgr addIface(cfgIface); Log(Info) << "Interface " << cfgIface->getFullName() << " has been added." << LogEnd; if (inactiveMode() && !ifaceIface->flagRunning() ) { makeInactiveIface(cfgIface->getID(), true, true, true); // move it to InactiveLst Log(Notice) << "Interface " << ifaceIface->getFullName() << " is not operational yet" << " (not running), made inactive." << LogEnd; } cnt ++; } if (!cnt) { Log(Crit) << "Unable to detect any suitable interfaces. If there are any interfaces that you" << " want to have configured, please specify them in client.conf file." << LogEnd; return false; } } return true; } SPtr TClntCfgMgr::getIface() { return ClntCfgIfaceLst.get(); } void TClntCfgMgr::addIface(SPtr ptr) { ClntCfgIfaceLst.append(ptr); } void TClntCfgMgr::makeInactiveIface(int ifindex, bool inactive, bool managed, bool otherConf) { SPtr x; if (inactive) { ClntCfgIfaceLst.first(); while (x= ClntCfgIfaceLst.get()) { if (x->getID() == ifindex) { Log(Info) << "Switching " << x->getFullName() << " to inactive-mode." << LogEnd; ClntCfgIfaceLst.del(); InactiveLst.append(x); return; } } Log(Error) << "Unable to switch interface ifindex=" << ifindex << " to inactive-mode: interface not found." << LogEnd; return; } InactiveLst.first(); while (x= InactiveLst.get()) { if (x->getID() == ifindex) { Log(Info) << "Switching " << x->getFullName() << " to normal mode." << LogEnd; InactiveLst.del(); InactiveLst.first(); x->setMbit(managed); x->setObit(otherConf); addIface(x); return; } } Log(Error) << "Unable to switch interface ifindex=" << ifindex << " from inactive-mode to normal operation: interface not found." << LogEnd; } void TClntCfgMgr::firstIface() { ClntCfgIfaceLst.first(); } int TClntCfgMgr::countIfaces() { return ClntCfgIfaceLst.count(); } bool TClntCfgMgr::getReconfigure() { return Reconfigure; } void TClntCfgMgr::setReconfigure(bool enable) { Reconfigure = enable; } int TClntCfgMgr::countAddrForIA(long IAID) { SPtr iface; firstIface(); while (iface = getIface() ) { SPtr ia; iface->firstIA(); while (ia = iface->getIA()) if (ia->getIAID()==IAID) return ia->countAddr(); } return 0; } SPtr TClntCfgMgr::getIA(long IAID) { SPtr iface; firstIface(); while (iface = getIface() ) { SPtr ia; iface->firstIA(); while (ia = iface->getIA()) if (ia->getIAID()==IAID) return ia; } return SPtr(); // NULL } SPtr TClntCfgMgr::getPD(long IAID) { SPtr iface; firstIface(); while (iface = getIface() ) { SPtr pd; iface->firstPD(); while (pd = iface->getPD()) if (pd->getIAID()==IAID) return pd; } return SPtr(); // NULL } bool TClntCfgMgr::setIAState(int iface, int iaid, enum EState state) { firstIface(); SPtr ptrIface; while (ptrIface = getIface() ) { if ( ptrIface->getID() == iface ) break; } if (! ptrIface) { Log(Error) <<"ClntCfgMgr: Unable to set IA state (id=" << iaid << "):Interface " << iface << " not found." << LogEnd; return false; } SPtr ia; ptrIface->firstIA(); while (ia = ptrIface->getIA()) { if ( ia->getIAID() == iaid ) { ia->setState(state); return true; } } Log(Error) << "ClntCfgMgr: Unable to set IA state (id=" << iaid << ")" << LogEnd; return false; } //check whether T1 ptrIface; this->ClntCfgIfaceLst.first(); while(ptrIface=ClntCfgIfaceLst.get()) { if (!this->validateIface(ptrIface)) { return false; } } #ifndef MOD_DISABLE_AUTH // Validate authentication settings switch (getAuthProtocol()) { case AUTH_PROTO_NONE: break; case AUTH_PROTO_DELAYED: { const std::vector digests = getAuthAcceptMethods(); if (digests.empty()) { Log(Error) << "AUTH: No digests specified. For delayed-auth HMAC-MD5 must be used." << LogEnd; return false; } if (digests.size() > 1) { Log(Warning) << "AUTH: More than one digest type allowed for delayed-auth," << " expected only HMAC-MD5" << LogEnd; } if (digests[0] != DIGEST_HMAC_MD5) { Log(Error) << "AUTH: First digest type for delayed-auth is " << getDigestName(digests[0]) << ", but only HMAC-MD5 is allowed for delayed-auth." << LogEnd; return false; } break; } case AUTH_PROTO_RECONFIGURE_KEY: { const std::vector digests = getAuthAcceptMethods(); if (digests.size() > 1) { Log(Warning) << "AUTH: More than one digest type allowed for reconfigure-key," << " expected only HMAC-MD5." << LogEnd; } if (digests[0] != DIGEST_HMAC_MD5) { Log(Error) << "AUTH: First digest type for reconfigure-key is " << getDigestName(digests[0]) << ", but only HMAC-MD5 is allowed for delayed-auth." << LogEnd; return false; } break; } case AUTH_PROTO_DIBBLER: break; } #endif return true; } bool TClntCfgMgr::validateIface(SPtr ptrIface) { SPtr ptrIA; ptrIface->firstIA(); while(ptrIA=ptrIface->getIA()) { if (!this->validateIA(ptrIface, ptrIA)) return false; } SPtr ptrPD; ptrIface->firstPD(); while(ptrPD=ptrIface->getPD()) { if (!this->validatePD(ptrIface, ptrPD)) return false; } return true; } bool TClntCfgMgr::validateIA(SPtr ptrIface, SPtr ptrIA) { if ( ptrIA->getT2()getT1() ) { Log(Crit) << "T1 can't be lower than T2 for IA " << *ptrIA << "on the " << ptrIface->getName() << "/" << ptrIface->getID() << " interface." << LogEnd; return false; } SPtr ptrAddr; ptrIA->firstAddr(); while(ptrAddr=ptrIA->getAddr()) { if (!this->validateAddr(ptrIface, ptrIA, ptrAddr)) return false; } return true; } bool TClntCfgMgr::validateAddr(SPtr ptrIface, SPtr ptrIA, SPtr ptrAddr) { SPtr addr = ptrAddr->get(); if ( addr && addr->linkLocal()) { Log(Crit) << "Address " << ptrAddr->get()->getPlain() << " specified in IA " << ptrIA->getIAID() << " on the " << ptrIface->getName() << "/" << ptrIface->getID() << " interface is link local." << LogEnd; return false; } if( ptrAddr->getPref()>ptrAddr->getValid() ) { Log(Crit) << "Prefered time " << ptrAddr->getPref() << " can't be lower than valid lifetime " << ptrAddr->getValid() << " for IA " << ptrIA->getIAID() << " on the " << ptrIface->getName() << "/" << ptrIface->getID() << " interface." << LogEnd; return false; } if ((unsigned long)ptrIA->getT1()>(unsigned long)ptrAddr->getValid()) { Log(Crit) << "Valid lifetime " << ptrAddr->getValid() << " can't be lower than T1 " <getT1() << "(address can't be renewed) in IA " << ptrIA->getIAID() << " on the " << ptrIface->getName() << "/" << ptrIface->getName() << " interface." << LogEnd; return false; } return true; } bool TClntCfgMgr::validatePD(SPtr ptrIface, SPtr ptrPD) { if ( ptrPD->getT1() && ptrPD->getT2() && (ptrPD->getT2() < ptrPD->getT1()) ) { Log(Crit) << "Non-zero T1 can't be lower than non-zero T2 for PD " << *ptrPD << " on the " << ptrIface->getFullName() << " interface." << LogEnd; return false; } SPtr ptrPrefix; ptrPD->firstPrefix(); while(ptrPrefix = ptrPD->getPrefix()) { if (!this->validatePrefix(ptrIface, ptrPD, ptrPrefix)) return false; } return true; } bool TClntCfgMgr::validatePrefix(SPtr ptrIface, SPtr ptrPD, SPtr ptrPrefix) { if( ptrPrefix->getPref() > ptrPrefix->getValid() ) { Log(Crit) << "Preferred time " << ptrPrefix->getPref() << " can't be lower than valid lifetime " << ptrPrefix->getValid() << " for PD " << ptrPD->getIAID() << " on the " << ptrIface->getFullName() << " interface." << LogEnd; return false; } // Note that valid-lifetime can be larger than the T1. This is uncommon, but // valid scenario. It's a way to tell the client to never renew. // This may be useful if ISP wants his clients to periodically change their // delegated prefixes. // // Quote from RFC3633, section 10: // A requesting router discards any prefixes for which the preferred // lifetime is greater than the valid lifetime. A delegating router // ignores the lifetimes set by the requesting router if the preferred // lifetime is greater than the valid lifetime and ignores the values // for T1 and T2 set by the requesting router if those values are // greater than the preferred lifetime. return true; } SPtr TClntCfgMgr::getIface(int id) { firstIface(); SPtr iface; while(iface=getIface()) if (iface->getID()==id) return iface; return SPtr (); } SPtr TClntCfgMgr::getIfaceByIAID(int iaid) { SPtr iface; firstIface(); while(iface=getIface()) { SPtr ia; iface->firstIA(); while(ia=iface->getIA()) if (ia->getIAID()==iaid) return iface; } return SPtr(); } bool TClntCfgMgr::setGlobalOptions(ClntParser * parser) { SPtr opt = parser->ParserOptStack.getLast(); LogLevel = logger::getLogLevel(); LogName = logger::getLogName(); AnonInfRequest = opt->getAnonInfRequest(); InsistMode = opt->getInsistMode();// should the client insist on receiving // all options i.e. sending INF-REQUEST // if REQUEST did not grant required opts if (opt->getInactiveMode()) // should the client accept not ready interfaces? InactiveMode = true; // This may have been set up already by obeyRaBits() FQDNFlagS = opt->getFQDNFlagS(); UseConfirm = opt->getConfirm(); // should client try to send CONFIRM? // user has specified DUID type, just in case if new DUID will be generated if (parser->DUIDType != DUID_TYPE_NOT_DEFINED) { DUIDType = parser->DUIDType; DUIDEnterpriseNumber = parser->DUIDEnterpriseNumber; DUIDEnterpriseID = parser->DUIDEnterpriseID; } #ifndef MOD_DISABLE_AUTH if (getAuthProtocol() == AUTH_PROTO_DIBBLER) { SPI_ = getAAASPIfromFile(); if (SPI_) { Log(Debug) << "Auth: Read SPI=" << hex << SPI_ << dec << " from a AAA-SPI file:" << CLNT_AAASPI_FILE << LogEnd; } else { Log(Crit) << "Auth: Dibbler protocol configured, but unable to read AAA-SPI file:" << CLNT_AAASPI_FILE << LogEnd; return false; } // now let's try to load specified key unsigned len = 0; char * ptr = getAAAKey(SPI_, &len); if (len == 0) { Log(Crit) << "Auth: Failed to load AAA key from file " << getAAAKeyFilename(SPI_) << LogEnd; return false; } free(ptr); // we don't really need the key yet. } #endif return true; } #ifdef MOD_REMOTE_AUTOCONF void TClntCfgMgr::setRemoteAutoconf(bool enable) { Log(Info) << "Remote autoconf " << (enable?"enabled":"disabled") << LogEnd; RemoteAutoconf = enable; } bool TClntCfgMgr::getRemoteAutoconf() { return RemoteAutoconf; } #endif void TClntCfgMgr::setDigest(DigestTypes type) { if (type >= DIGEST_INVALID) Digest_ = DIGEST_NONE; else Digest_ = type; } DigestTypes TClntCfgMgr::getDigest() { return Digest_; } bool TClntCfgMgr::isDone() { return IsDone; } bool TClntCfgMgr::anonInfRequest() { return AnonInfRequest; } bool TClntCfgMgr::inactiveMode() { return InactiveMode; } bool TClntCfgMgr::addInfRefreshTime() { /* this can be considered a workaround, but for now ask for inf-refresh-time only when running in stateless mode */ // are there any stateful interfaces? SPtr ptr; firstIface(); while ( ptr = getIface() ) { if (!ptr->stateless()) return false; } return true; } bool TClntCfgMgr::insistMode() { return InsistMode; } int TClntCfgMgr::inactiveIfacesCnt() { return InactiveLst.count(); } SPtr TClntCfgMgr::checkInactiveIfaces() { if (!InactiveLst.count()) return SPtr(); // NULL ClntIfaceMgr().redetectIfaces(); SPtr x; SPtr iface; InactiveLst.first(); while (x = InactiveLst.get()) { iface = ClntIfaceMgr().getIfaceByID(x->getID()); if (!iface) { Log(Error) << "Unable to find interface with ifindex=" << x->getID() << LogEnd; continue; } iface->firstLLAddress(); if (iface->flagUp() && iface->flagRunning() && iface->getLLAddress()) { // check if its link-local address is not tentative char tmp[64]; iface->firstLLAddress(); inet_ntop6(iface->getLLAddress(), tmp); if (is_addr_tentative(iface->getName(), iface->getID(), tmp)==LOWLEVEL_TENTATIVE_YES) { Log(Debug) << "Interface " << iface->getFullName() << " is up and running, but link-local address " << tmp << " is currently tentative." << LogEnd; continue; } if (obeyRaBits() && !iface->getMBit() && !iface->getOBit()) { Log(Debug) << "Interface " << iface->getFullName() << " is up and running, but did not receive Router Advertisement " << "with either M or O bits set." << LogEnd; continue; } bool managed = !obeyRaBits() || iface->getMBit(); bool otherConf = !obeyRaBits() || iface->getOBit(); makeInactiveIface(x->getID(), false, managed, otherConf); // move it to active mode return x; } } return SPtr(); // NULL } #ifndef MOD_DISABLE_AUTH uint32_t TClntCfgMgr::getSPI() { return SPI_; } /// @todo move this to CfgMgr and unify with TSrvCfgMgr::setAuthDigests void TClntCfgMgr::setAuthAcceptMethods(const std::vector& methods) { AuthAcceptMethods_ = methods; if (!methods.empty()) { Log(Debug) << "AUTH: " << methods.size() << " method(s) accepted:"; for (unsigned i = 0; i < methods.size(); ++i) { Log(Cont) << " " << getDigestName(methods[i]); if (i==0) { Log(Cont) << "(default)"; } } Log(Cont) << LogEnd; // Use the first method as the default one Digest_ = methods[0]; } } const std::vector& TClntCfgMgr::getAuthAcceptMethods() { return AuthAcceptMethods_; } #endif bool TClntCfgMgr::getFQDNFlagS() { return FQDNFlagS; } bool TClntCfgMgr::useConfirm() { return UseConfirm; } TClntCfgMgr::~TClntCfgMgr() { Log(Debug) << "ClntCfgMgr cleanup." << LogEnd; } ostream & operator<<(ostream &strum, TClntCfgMgr &x) { strum << "" << endl; strum << " " << x.getWorkDir() << "" << endl; strum << " " << x.getScript() << "" << endl; strum << " " << x.getLogName() << "" << endl; strum << " " << x.getLogLevel() << "" << endl; strum << " " << (x.anonInfRequest()?1:0) << "" << endl; strum << " " << (x.InsistMode?1:0) << "" << endl; strum << " " << (x.InactiveMode?1:0) << "" << endl; strum << " " << (x.FQDNFlagS?1:0) << "" << endl; strum << " " << (x.UseConfirm?1:0) << "" << endl; strum << " "; switch (x.getDigest()) { case DIGEST_NONE: strum << "digest-none"; break; case DIGEST_HMAC_SHA1: strum << "digest-hmac-sha1"; break; default: strum << x.getDigest(); break; }; strum << "" << endl; if (x.DUID) strum << " " << *x.DUID; else strum << " "; SPtr ptr; x.firstIface(); while ( ptr = x.getIface() ) { strum << *ptr; } strum << "" << endl; return strum; } void TClntCfgMgr::setDownlinkPrefixIfaces(List(std::string)& ifaces) { ifaces.first(); SPtr iface; Log(Debug) << "PD: Following interfaces marked as downlink:"; while (iface = ifaces.get()) { Log(Cont) << " " << *iface; DownlinkPrefixIfaces_.push_back(*iface); } Log(Cont) << LogEnd; } void TClntCfgMgr::obeyRaBits(bool obey) { ObeyRaBits_ = obey; if (obey) { InactiveMode = true; } } bool TClntCfgMgr::obeyRaBits() { return ObeyRaBits_; } #ifdef MOD_CLNT_EMBEDDED_CFG /** * this is example hardcoded configuration file * * @param cfgMgr * @param params * * @return */ bool HardcodedCfgExample(TClntCfgMgr *cfgMgr, string params) { Log(Info) << "Using hardcoded config. file." << LogEnd; // there's no way to set some parameters directly, to fake ClntParsGlobalOpt // must be created. SPtr opt = new TClntParsGlobalOpt(); // Pretend to have parsed empty DNS list (i.e. request DNS server configuration, but don't // provide any hints) List(TIPv6Addr) dnsList; dnsList.clear(); opt->setDNSServerLst(&dnsList); // Pretend to have parsed rapid-commit request opt->setRapidCommit(true); // Create interface, which will be configured SPtr iface = new TClntCfgIface("eth0"); iface->setIfaceID(3); // set all "parsed" options on this interface iface->setOptions(opt); // Create one IA SPtr ia = new TClntCfgIA(); ia->setIAID(123); // set parameters in the "parsed" objects opt->setT1(900); opt->setT2(1200); ia->setOptions(opt); // optional: add a requested address to IA // request for a 2000::123:456 address with preferred lifetime set to 1800 // and valid lifetime set to 3600 SPtr addr = new TIPv6Addr("2000::123:456", true); SPtr cfgAddr = new TClntCfgAddr(addr, 3600, 1800); ia->addAddr(cfgAddr); // add IA to a interface iface->addIA(ia); // add interface to a CfgMgr cfgMgr->addIface(iface); return true; } #endif dibbler-1.0.1/ClntCfgMgr/Makefile.in0000664000175000017500000014041112561652534014104 00000000000000# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = ClntCfgMgr DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/depcomp $(dist_noinst_DATA) ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/libtool.m4 \ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/include/dibbler-config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = LIBRARIES = $(noinst_LIBRARIES) ARFLAGS = cru AM_V_AR = $(am__v_AR_@AM_V@) am__v_AR_ = $(am__v_AR_@AM_DEFAULT_V@) am__v_AR_0 = @echo " AR " $@; am__v_AR_1 = libClntCfgMgr_a_AR = $(AR) $(ARFLAGS) libClntCfgMgr_a_LIBADD = am_libClntCfgMgr_a_OBJECTS = libClntCfgMgr_a-ClntCfgAddr.$(OBJEXT) \ libClntCfgMgr_a-ClntCfgIA.$(OBJEXT) \ libClntCfgMgr_a-ClntCfgIface.$(OBJEXT) \ libClntCfgMgr_a-ClntCfgMgr.$(OBJEXT) \ libClntCfgMgr_a-ClntCfgPD.$(OBJEXT) \ libClntCfgMgr_a-ClntCfgPrefix.$(OBJEXT) \ libClntCfgMgr_a-ClntCfgTA.$(OBJEXT) \ libClntCfgMgr_a-ClntLexer.$(OBJEXT) \ libClntCfgMgr_a-ClntParsAddrOpt.$(OBJEXT) \ libClntCfgMgr_a-ClntParser.$(OBJEXT) \ libClntCfgMgr_a-ClntParsGlobalOpt.$(OBJEXT) \ libClntCfgMgr_a-ClntParsIAOpt.$(OBJEXT) \ libClntCfgMgr_a-ClntParsIfaceOpt.$(OBJEXT) libClntCfgMgr_a_OBJECTS = $(am_libClntCfgMgr_a_OBJECTS) AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)/include depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) LTCXXCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CXXFLAGS) $(CXXFLAGS) AM_V_CXX = $(am__v_CXX_@AM_V@) am__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@) am__v_CXX_0 = @echo " CXX " $@; am__v_CXX_1 = CXXLD = $(CXX) CXXLINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \ $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CXXLD = $(am__v_CXXLD_@AM_V@) am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@) am__v_CXXLD_0 = @echo " CXXLD " $@; am__v_CXXLD_1 = COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(libClntCfgMgr_a_SOURCES) DIST_SOURCES = $(libClntCfgMgr_a_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac DATA = $(dist_noinst_DATA) am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALLOCA = @ALLOCA@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ ARCH = @ARCH@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ EXTRA_DIST_SUBDIRS = @EXTRA_DIST_SUBDIRS@ FGREP = @FGREP@ GREP = @GREP@ GTEST_INCLUDES = @GTEST_INCLUDES@ GTEST_LDADD = @GTEST_LDADD@ GTEST_LDFLAGS = @GTEST_LDFLAGS@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LINKPRINT = @LINKPRINT@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PORT_CFLAGS = @PORT_CFLAGS@ PORT_LDFLAGS = @PORT_LDFLAGS@ PORT_SUBDIR = @PORT_SUBDIR@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ subdirs = @subdirs@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ noinst_LIBRARIES = libClntCfgMgr.a libClntCfgMgr_a_CPPFLAGS = -I$(top_srcdir)/Misc -I$(top_srcdir)/CfgMgr \ -I$(top_srcdir)/ClntOptions -I$(top_srcdir)/Options \ -I$(top_srcdir)/ClntIfaceMgr -I$(top_srcdir)/IfaceMgr \ -I$(top_srcdir)/ClntAddrMgr -I$(top_srcdir)/AddrMgr \ -I$(top_srcdir)/ClntTransMgr -I$(top_srcdir)/ClntMessages \ -I$(top_srcdir)/Messages -I$(top_srcdir)/@PORT_SUBDIR@ libClntCfgMgr_a_SOURCES = ClntCfgAddr.cpp ClntCfgAddr.h ClntCfgIA.cpp ClntCfgIA.h ClntCfgIface.cpp ClntCfgIface.h ClntCfgMgr.cpp ClntCfgMgr.h ClntCfgPD.cpp ClntCfgPD.h ClntCfgPrefix.cpp ClntCfgPrefix.h ClntCfgTA.cpp ClntCfgTA.h ClntLexer.cpp ClntParsAddrOpt.cpp ClntParsAddrOpt.h ClntParser.cpp ClntParser.h ClntParsGlobalOpt.cpp ClntParsGlobalOpt.h ClntParsIAOpt.cpp ClntParsIAOpt.h ClntParsIfaceOpt.cpp ClntParsIfaceOpt.h dist_noinst_DATA = ClntLexer.l ClntParser.y all: all-am .SUFFIXES: .SUFFIXES: .cpp .lo .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign ClntCfgMgr/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign ClntCfgMgr/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstLIBRARIES: -test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES) libClntCfgMgr.a: $(libClntCfgMgr_a_OBJECTS) $(libClntCfgMgr_a_DEPENDENCIES) $(EXTRA_libClntCfgMgr_a_DEPENDENCIES) $(AM_V_at)-rm -f libClntCfgMgr.a $(AM_V_AR)$(libClntCfgMgr_a_AR) libClntCfgMgr.a $(libClntCfgMgr_a_OBJECTS) $(libClntCfgMgr_a_LIBADD) $(AM_V_at)$(RANLIB) libClntCfgMgr.a mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libClntCfgMgr_a-ClntCfgAddr.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libClntCfgMgr_a-ClntCfgIA.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libClntCfgMgr_a-ClntCfgIface.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libClntCfgMgr_a-ClntCfgMgr.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libClntCfgMgr_a-ClntCfgPD.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libClntCfgMgr_a-ClntCfgPrefix.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libClntCfgMgr_a-ClntCfgTA.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libClntCfgMgr_a-ClntLexer.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libClntCfgMgr_a-ClntParsAddrOpt.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libClntCfgMgr_a-ClntParsGlobalOpt.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libClntCfgMgr_a-ClntParsIAOpt.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libClntCfgMgr_a-ClntParsIfaceOpt.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libClntCfgMgr_a-ClntParser.Po@am__quote@ .cpp.o: @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $< .cpp.obj: @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .cpp.lo: @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LTCXXCOMPILE) -c -o $@ $< libClntCfgMgr_a-ClntCfgAddr.o: ClntCfgAddr.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libClntCfgMgr_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libClntCfgMgr_a-ClntCfgAddr.o -MD -MP -MF $(DEPDIR)/libClntCfgMgr_a-ClntCfgAddr.Tpo -c -o libClntCfgMgr_a-ClntCfgAddr.o `test -f 'ClntCfgAddr.cpp' || echo '$(srcdir)/'`ClntCfgAddr.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libClntCfgMgr_a-ClntCfgAddr.Tpo $(DEPDIR)/libClntCfgMgr_a-ClntCfgAddr.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='ClntCfgAddr.cpp' object='libClntCfgMgr_a-ClntCfgAddr.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libClntCfgMgr_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libClntCfgMgr_a-ClntCfgAddr.o `test -f 'ClntCfgAddr.cpp' || echo '$(srcdir)/'`ClntCfgAddr.cpp libClntCfgMgr_a-ClntCfgAddr.obj: ClntCfgAddr.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libClntCfgMgr_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libClntCfgMgr_a-ClntCfgAddr.obj -MD -MP -MF $(DEPDIR)/libClntCfgMgr_a-ClntCfgAddr.Tpo -c -o libClntCfgMgr_a-ClntCfgAddr.obj `if test -f 'ClntCfgAddr.cpp'; then $(CYGPATH_W) 'ClntCfgAddr.cpp'; else $(CYGPATH_W) '$(srcdir)/ClntCfgAddr.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libClntCfgMgr_a-ClntCfgAddr.Tpo $(DEPDIR)/libClntCfgMgr_a-ClntCfgAddr.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='ClntCfgAddr.cpp' object='libClntCfgMgr_a-ClntCfgAddr.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libClntCfgMgr_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libClntCfgMgr_a-ClntCfgAddr.obj `if test -f 'ClntCfgAddr.cpp'; then $(CYGPATH_W) 'ClntCfgAddr.cpp'; else $(CYGPATH_W) '$(srcdir)/ClntCfgAddr.cpp'; fi` libClntCfgMgr_a-ClntCfgIA.o: ClntCfgIA.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libClntCfgMgr_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libClntCfgMgr_a-ClntCfgIA.o -MD -MP -MF $(DEPDIR)/libClntCfgMgr_a-ClntCfgIA.Tpo -c -o libClntCfgMgr_a-ClntCfgIA.o `test -f 'ClntCfgIA.cpp' || echo '$(srcdir)/'`ClntCfgIA.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libClntCfgMgr_a-ClntCfgIA.Tpo $(DEPDIR)/libClntCfgMgr_a-ClntCfgIA.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='ClntCfgIA.cpp' object='libClntCfgMgr_a-ClntCfgIA.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libClntCfgMgr_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libClntCfgMgr_a-ClntCfgIA.o `test -f 'ClntCfgIA.cpp' || echo '$(srcdir)/'`ClntCfgIA.cpp libClntCfgMgr_a-ClntCfgIA.obj: ClntCfgIA.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libClntCfgMgr_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libClntCfgMgr_a-ClntCfgIA.obj -MD -MP -MF $(DEPDIR)/libClntCfgMgr_a-ClntCfgIA.Tpo -c -o libClntCfgMgr_a-ClntCfgIA.obj `if test -f 'ClntCfgIA.cpp'; then $(CYGPATH_W) 'ClntCfgIA.cpp'; else $(CYGPATH_W) '$(srcdir)/ClntCfgIA.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libClntCfgMgr_a-ClntCfgIA.Tpo $(DEPDIR)/libClntCfgMgr_a-ClntCfgIA.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='ClntCfgIA.cpp' object='libClntCfgMgr_a-ClntCfgIA.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libClntCfgMgr_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libClntCfgMgr_a-ClntCfgIA.obj `if test -f 'ClntCfgIA.cpp'; then $(CYGPATH_W) 'ClntCfgIA.cpp'; else $(CYGPATH_W) '$(srcdir)/ClntCfgIA.cpp'; fi` libClntCfgMgr_a-ClntCfgIface.o: ClntCfgIface.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libClntCfgMgr_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libClntCfgMgr_a-ClntCfgIface.o -MD -MP -MF $(DEPDIR)/libClntCfgMgr_a-ClntCfgIface.Tpo -c -o libClntCfgMgr_a-ClntCfgIface.o `test -f 'ClntCfgIface.cpp' || echo '$(srcdir)/'`ClntCfgIface.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libClntCfgMgr_a-ClntCfgIface.Tpo $(DEPDIR)/libClntCfgMgr_a-ClntCfgIface.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='ClntCfgIface.cpp' object='libClntCfgMgr_a-ClntCfgIface.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libClntCfgMgr_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libClntCfgMgr_a-ClntCfgIface.o `test -f 'ClntCfgIface.cpp' || echo '$(srcdir)/'`ClntCfgIface.cpp libClntCfgMgr_a-ClntCfgIface.obj: ClntCfgIface.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libClntCfgMgr_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libClntCfgMgr_a-ClntCfgIface.obj -MD -MP -MF $(DEPDIR)/libClntCfgMgr_a-ClntCfgIface.Tpo -c -o libClntCfgMgr_a-ClntCfgIface.obj `if test -f 'ClntCfgIface.cpp'; then $(CYGPATH_W) 'ClntCfgIface.cpp'; else $(CYGPATH_W) '$(srcdir)/ClntCfgIface.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libClntCfgMgr_a-ClntCfgIface.Tpo $(DEPDIR)/libClntCfgMgr_a-ClntCfgIface.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='ClntCfgIface.cpp' object='libClntCfgMgr_a-ClntCfgIface.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libClntCfgMgr_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libClntCfgMgr_a-ClntCfgIface.obj `if test -f 'ClntCfgIface.cpp'; then $(CYGPATH_W) 'ClntCfgIface.cpp'; else $(CYGPATH_W) '$(srcdir)/ClntCfgIface.cpp'; fi` libClntCfgMgr_a-ClntCfgMgr.o: ClntCfgMgr.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libClntCfgMgr_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libClntCfgMgr_a-ClntCfgMgr.o -MD -MP -MF $(DEPDIR)/libClntCfgMgr_a-ClntCfgMgr.Tpo -c -o libClntCfgMgr_a-ClntCfgMgr.o `test -f 'ClntCfgMgr.cpp' || echo '$(srcdir)/'`ClntCfgMgr.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libClntCfgMgr_a-ClntCfgMgr.Tpo $(DEPDIR)/libClntCfgMgr_a-ClntCfgMgr.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='ClntCfgMgr.cpp' object='libClntCfgMgr_a-ClntCfgMgr.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libClntCfgMgr_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libClntCfgMgr_a-ClntCfgMgr.o `test -f 'ClntCfgMgr.cpp' || echo '$(srcdir)/'`ClntCfgMgr.cpp libClntCfgMgr_a-ClntCfgMgr.obj: ClntCfgMgr.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libClntCfgMgr_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libClntCfgMgr_a-ClntCfgMgr.obj -MD -MP -MF $(DEPDIR)/libClntCfgMgr_a-ClntCfgMgr.Tpo -c -o libClntCfgMgr_a-ClntCfgMgr.obj `if test -f 'ClntCfgMgr.cpp'; then $(CYGPATH_W) 'ClntCfgMgr.cpp'; else $(CYGPATH_W) '$(srcdir)/ClntCfgMgr.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libClntCfgMgr_a-ClntCfgMgr.Tpo $(DEPDIR)/libClntCfgMgr_a-ClntCfgMgr.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='ClntCfgMgr.cpp' object='libClntCfgMgr_a-ClntCfgMgr.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libClntCfgMgr_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libClntCfgMgr_a-ClntCfgMgr.obj `if test -f 'ClntCfgMgr.cpp'; then $(CYGPATH_W) 'ClntCfgMgr.cpp'; else $(CYGPATH_W) '$(srcdir)/ClntCfgMgr.cpp'; fi` libClntCfgMgr_a-ClntCfgPD.o: ClntCfgPD.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libClntCfgMgr_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libClntCfgMgr_a-ClntCfgPD.o -MD -MP -MF $(DEPDIR)/libClntCfgMgr_a-ClntCfgPD.Tpo -c -o libClntCfgMgr_a-ClntCfgPD.o `test -f 'ClntCfgPD.cpp' || echo '$(srcdir)/'`ClntCfgPD.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libClntCfgMgr_a-ClntCfgPD.Tpo $(DEPDIR)/libClntCfgMgr_a-ClntCfgPD.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='ClntCfgPD.cpp' object='libClntCfgMgr_a-ClntCfgPD.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libClntCfgMgr_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libClntCfgMgr_a-ClntCfgPD.o `test -f 'ClntCfgPD.cpp' || echo '$(srcdir)/'`ClntCfgPD.cpp libClntCfgMgr_a-ClntCfgPD.obj: ClntCfgPD.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libClntCfgMgr_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libClntCfgMgr_a-ClntCfgPD.obj -MD -MP -MF $(DEPDIR)/libClntCfgMgr_a-ClntCfgPD.Tpo -c -o libClntCfgMgr_a-ClntCfgPD.obj `if test -f 'ClntCfgPD.cpp'; then $(CYGPATH_W) 'ClntCfgPD.cpp'; else $(CYGPATH_W) '$(srcdir)/ClntCfgPD.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libClntCfgMgr_a-ClntCfgPD.Tpo $(DEPDIR)/libClntCfgMgr_a-ClntCfgPD.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='ClntCfgPD.cpp' object='libClntCfgMgr_a-ClntCfgPD.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libClntCfgMgr_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libClntCfgMgr_a-ClntCfgPD.obj `if test -f 'ClntCfgPD.cpp'; then $(CYGPATH_W) 'ClntCfgPD.cpp'; else $(CYGPATH_W) '$(srcdir)/ClntCfgPD.cpp'; fi` libClntCfgMgr_a-ClntCfgPrefix.o: ClntCfgPrefix.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libClntCfgMgr_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libClntCfgMgr_a-ClntCfgPrefix.o -MD -MP -MF $(DEPDIR)/libClntCfgMgr_a-ClntCfgPrefix.Tpo -c -o libClntCfgMgr_a-ClntCfgPrefix.o `test -f 'ClntCfgPrefix.cpp' || echo '$(srcdir)/'`ClntCfgPrefix.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libClntCfgMgr_a-ClntCfgPrefix.Tpo $(DEPDIR)/libClntCfgMgr_a-ClntCfgPrefix.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='ClntCfgPrefix.cpp' object='libClntCfgMgr_a-ClntCfgPrefix.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libClntCfgMgr_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libClntCfgMgr_a-ClntCfgPrefix.o `test -f 'ClntCfgPrefix.cpp' || echo '$(srcdir)/'`ClntCfgPrefix.cpp libClntCfgMgr_a-ClntCfgPrefix.obj: ClntCfgPrefix.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libClntCfgMgr_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libClntCfgMgr_a-ClntCfgPrefix.obj -MD -MP -MF $(DEPDIR)/libClntCfgMgr_a-ClntCfgPrefix.Tpo -c -o libClntCfgMgr_a-ClntCfgPrefix.obj `if test -f 'ClntCfgPrefix.cpp'; then $(CYGPATH_W) 'ClntCfgPrefix.cpp'; else $(CYGPATH_W) '$(srcdir)/ClntCfgPrefix.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libClntCfgMgr_a-ClntCfgPrefix.Tpo $(DEPDIR)/libClntCfgMgr_a-ClntCfgPrefix.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='ClntCfgPrefix.cpp' object='libClntCfgMgr_a-ClntCfgPrefix.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libClntCfgMgr_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libClntCfgMgr_a-ClntCfgPrefix.obj `if test -f 'ClntCfgPrefix.cpp'; then $(CYGPATH_W) 'ClntCfgPrefix.cpp'; else $(CYGPATH_W) '$(srcdir)/ClntCfgPrefix.cpp'; fi` libClntCfgMgr_a-ClntCfgTA.o: ClntCfgTA.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libClntCfgMgr_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libClntCfgMgr_a-ClntCfgTA.o -MD -MP -MF $(DEPDIR)/libClntCfgMgr_a-ClntCfgTA.Tpo -c -o libClntCfgMgr_a-ClntCfgTA.o `test -f 'ClntCfgTA.cpp' || echo '$(srcdir)/'`ClntCfgTA.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libClntCfgMgr_a-ClntCfgTA.Tpo $(DEPDIR)/libClntCfgMgr_a-ClntCfgTA.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='ClntCfgTA.cpp' object='libClntCfgMgr_a-ClntCfgTA.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libClntCfgMgr_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libClntCfgMgr_a-ClntCfgTA.o `test -f 'ClntCfgTA.cpp' || echo '$(srcdir)/'`ClntCfgTA.cpp libClntCfgMgr_a-ClntCfgTA.obj: ClntCfgTA.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libClntCfgMgr_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libClntCfgMgr_a-ClntCfgTA.obj -MD -MP -MF $(DEPDIR)/libClntCfgMgr_a-ClntCfgTA.Tpo -c -o libClntCfgMgr_a-ClntCfgTA.obj `if test -f 'ClntCfgTA.cpp'; then $(CYGPATH_W) 'ClntCfgTA.cpp'; else $(CYGPATH_W) '$(srcdir)/ClntCfgTA.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libClntCfgMgr_a-ClntCfgTA.Tpo $(DEPDIR)/libClntCfgMgr_a-ClntCfgTA.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='ClntCfgTA.cpp' object='libClntCfgMgr_a-ClntCfgTA.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libClntCfgMgr_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libClntCfgMgr_a-ClntCfgTA.obj `if test -f 'ClntCfgTA.cpp'; then $(CYGPATH_W) 'ClntCfgTA.cpp'; else $(CYGPATH_W) '$(srcdir)/ClntCfgTA.cpp'; fi` libClntCfgMgr_a-ClntLexer.o: ClntLexer.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libClntCfgMgr_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libClntCfgMgr_a-ClntLexer.o -MD -MP -MF $(DEPDIR)/libClntCfgMgr_a-ClntLexer.Tpo -c -o libClntCfgMgr_a-ClntLexer.o `test -f 'ClntLexer.cpp' || echo '$(srcdir)/'`ClntLexer.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libClntCfgMgr_a-ClntLexer.Tpo $(DEPDIR)/libClntCfgMgr_a-ClntLexer.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='ClntLexer.cpp' object='libClntCfgMgr_a-ClntLexer.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libClntCfgMgr_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libClntCfgMgr_a-ClntLexer.o `test -f 'ClntLexer.cpp' || echo '$(srcdir)/'`ClntLexer.cpp libClntCfgMgr_a-ClntLexer.obj: ClntLexer.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libClntCfgMgr_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libClntCfgMgr_a-ClntLexer.obj -MD -MP -MF $(DEPDIR)/libClntCfgMgr_a-ClntLexer.Tpo -c -o libClntCfgMgr_a-ClntLexer.obj `if test -f 'ClntLexer.cpp'; then $(CYGPATH_W) 'ClntLexer.cpp'; else $(CYGPATH_W) '$(srcdir)/ClntLexer.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libClntCfgMgr_a-ClntLexer.Tpo $(DEPDIR)/libClntCfgMgr_a-ClntLexer.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='ClntLexer.cpp' object='libClntCfgMgr_a-ClntLexer.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libClntCfgMgr_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libClntCfgMgr_a-ClntLexer.obj `if test -f 'ClntLexer.cpp'; then $(CYGPATH_W) 'ClntLexer.cpp'; else $(CYGPATH_W) '$(srcdir)/ClntLexer.cpp'; fi` libClntCfgMgr_a-ClntParsAddrOpt.o: ClntParsAddrOpt.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libClntCfgMgr_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libClntCfgMgr_a-ClntParsAddrOpt.o -MD -MP -MF $(DEPDIR)/libClntCfgMgr_a-ClntParsAddrOpt.Tpo -c -o libClntCfgMgr_a-ClntParsAddrOpt.o `test -f 'ClntParsAddrOpt.cpp' || echo '$(srcdir)/'`ClntParsAddrOpt.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libClntCfgMgr_a-ClntParsAddrOpt.Tpo $(DEPDIR)/libClntCfgMgr_a-ClntParsAddrOpt.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='ClntParsAddrOpt.cpp' object='libClntCfgMgr_a-ClntParsAddrOpt.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libClntCfgMgr_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libClntCfgMgr_a-ClntParsAddrOpt.o `test -f 'ClntParsAddrOpt.cpp' || echo '$(srcdir)/'`ClntParsAddrOpt.cpp libClntCfgMgr_a-ClntParsAddrOpt.obj: ClntParsAddrOpt.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libClntCfgMgr_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libClntCfgMgr_a-ClntParsAddrOpt.obj -MD -MP -MF $(DEPDIR)/libClntCfgMgr_a-ClntParsAddrOpt.Tpo -c -o libClntCfgMgr_a-ClntParsAddrOpt.obj `if test -f 'ClntParsAddrOpt.cpp'; then $(CYGPATH_W) 'ClntParsAddrOpt.cpp'; else $(CYGPATH_W) '$(srcdir)/ClntParsAddrOpt.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libClntCfgMgr_a-ClntParsAddrOpt.Tpo $(DEPDIR)/libClntCfgMgr_a-ClntParsAddrOpt.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='ClntParsAddrOpt.cpp' object='libClntCfgMgr_a-ClntParsAddrOpt.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libClntCfgMgr_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libClntCfgMgr_a-ClntParsAddrOpt.obj `if test -f 'ClntParsAddrOpt.cpp'; then $(CYGPATH_W) 'ClntParsAddrOpt.cpp'; else $(CYGPATH_W) '$(srcdir)/ClntParsAddrOpt.cpp'; fi` libClntCfgMgr_a-ClntParser.o: ClntParser.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libClntCfgMgr_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libClntCfgMgr_a-ClntParser.o -MD -MP -MF $(DEPDIR)/libClntCfgMgr_a-ClntParser.Tpo -c -o libClntCfgMgr_a-ClntParser.o `test -f 'ClntParser.cpp' || echo '$(srcdir)/'`ClntParser.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libClntCfgMgr_a-ClntParser.Tpo $(DEPDIR)/libClntCfgMgr_a-ClntParser.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='ClntParser.cpp' object='libClntCfgMgr_a-ClntParser.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libClntCfgMgr_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libClntCfgMgr_a-ClntParser.o `test -f 'ClntParser.cpp' || echo '$(srcdir)/'`ClntParser.cpp libClntCfgMgr_a-ClntParser.obj: ClntParser.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libClntCfgMgr_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libClntCfgMgr_a-ClntParser.obj -MD -MP -MF $(DEPDIR)/libClntCfgMgr_a-ClntParser.Tpo -c -o libClntCfgMgr_a-ClntParser.obj `if test -f 'ClntParser.cpp'; then $(CYGPATH_W) 'ClntParser.cpp'; else $(CYGPATH_W) '$(srcdir)/ClntParser.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libClntCfgMgr_a-ClntParser.Tpo $(DEPDIR)/libClntCfgMgr_a-ClntParser.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='ClntParser.cpp' object='libClntCfgMgr_a-ClntParser.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libClntCfgMgr_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libClntCfgMgr_a-ClntParser.obj `if test -f 'ClntParser.cpp'; then $(CYGPATH_W) 'ClntParser.cpp'; else $(CYGPATH_W) '$(srcdir)/ClntParser.cpp'; fi` libClntCfgMgr_a-ClntParsGlobalOpt.o: ClntParsGlobalOpt.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libClntCfgMgr_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libClntCfgMgr_a-ClntParsGlobalOpt.o -MD -MP -MF $(DEPDIR)/libClntCfgMgr_a-ClntParsGlobalOpt.Tpo -c -o libClntCfgMgr_a-ClntParsGlobalOpt.o `test -f 'ClntParsGlobalOpt.cpp' || echo '$(srcdir)/'`ClntParsGlobalOpt.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libClntCfgMgr_a-ClntParsGlobalOpt.Tpo $(DEPDIR)/libClntCfgMgr_a-ClntParsGlobalOpt.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='ClntParsGlobalOpt.cpp' object='libClntCfgMgr_a-ClntParsGlobalOpt.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libClntCfgMgr_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libClntCfgMgr_a-ClntParsGlobalOpt.o `test -f 'ClntParsGlobalOpt.cpp' || echo '$(srcdir)/'`ClntParsGlobalOpt.cpp libClntCfgMgr_a-ClntParsGlobalOpt.obj: ClntParsGlobalOpt.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libClntCfgMgr_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libClntCfgMgr_a-ClntParsGlobalOpt.obj -MD -MP -MF $(DEPDIR)/libClntCfgMgr_a-ClntParsGlobalOpt.Tpo -c -o libClntCfgMgr_a-ClntParsGlobalOpt.obj `if test -f 'ClntParsGlobalOpt.cpp'; then $(CYGPATH_W) 'ClntParsGlobalOpt.cpp'; else $(CYGPATH_W) '$(srcdir)/ClntParsGlobalOpt.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libClntCfgMgr_a-ClntParsGlobalOpt.Tpo $(DEPDIR)/libClntCfgMgr_a-ClntParsGlobalOpt.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='ClntParsGlobalOpt.cpp' object='libClntCfgMgr_a-ClntParsGlobalOpt.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libClntCfgMgr_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libClntCfgMgr_a-ClntParsGlobalOpt.obj `if test -f 'ClntParsGlobalOpt.cpp'; then $(CYGPATH_W) 'ClntParsGlobalOpt.cpp'; else $(CYGPATH_W) '$(srcdir)/ClntParsGlobalOpt.cpp'; fi` libClntCfgMgr_a-ClntParsIAOpt.o: ClntParsIAOpt.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libClntCfgMgr_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libClntCfgMgr_a-ClntParsIAOpt.o -MD -MP -MF $(DEPDIR)/libClntCfgMgr_a-ClntParsIAOpt.Tpo -c -o libClntCfgMgr_a-ClntParsIAOpt.o `test -f 'ClntParsIAOpt.cpp' || echo '$(srcdir)/'`ClntParsIAOpt.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libClntCfgMgr_a-ClntParsIAOpt.Tpo $(DEPDIR)/libClntCfgMgr_a-ClntParsIAOpt.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='ClntParsIAOpt.cpp' object='libClntCfgMgr_a-ClntParsIAOpt.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libClntCfgMgr_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libClntCfgMgr_a-ClntParsIAOpt.o `test -f 'ClntParsIAOpt.cpp' || echo '$(srcdir)/'`ClntParsIAOpt.cpp libClntCfgMgr_a-ClntParsIAOpt.obj: ClntParsIAOpt.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libClntCfgMgr_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libClntCfgMgr_a-ClntParsIAOpt.obj -MD -MP -MF $(DEPDIR)/libClntCfgMgr_a-ClntParsIAOpt.Tpo -c -o libClntCfgMgr_a-ClntParsIAOpt.obj `if test -f 'ClntParsIAOpt.cpp'; then $(CYGPATH_W) 'ClntParsIAOpt.cpp'; else $(CYGPATH_W) '$(srcdir)/ClntParsIAOpt.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libClntCfgMgr_a-ClntParsIAOpt.Tpo $(DEPDIR)/libClntCfgMgr_a-ClntParsIAOpt.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='ClntParsIAOpt.cpp' object='libClntCfgMgr_a-ClntParsIAOpt.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libClntCfgMgr_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libClntCfgMgr_a-ClntParsIAOpt.obj `if test -f 'ClntParsIAOpt.cpp'; then $(CYGPATH_W) 'ClntParsIAOpt.cpp'; else $(CYGPATH_W) '$(srcdir)/ClntParsIAOpt.cpp'; fi` libClntCfgMgr_a-ClntParsIfaceOpt.o: ClntParsIfaceOpt.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libClntCfgMgr_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libClntCfgMgr_a-ClntParsIfaceOpt.o -MD -MP -MF $(DEPDIR)/libClntCfgMgr_a-ClntParsIfaceOpt.Tpo -c -o libClntCfgMgr_a-ClntParsIfaceOpt.o `test -f 'ClntParsIfaceOpt.cpp' || echo '$(srcdir)/'`ClntParsIfaceOpt.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libClntCfgMgr_a-ClntParsIfaceOpt.Tpo $(DEPDIR)/libClntCfgMgr_a-ClntParsIfaceOpt.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='ClntParsIfaceOpt.cpp' object='libClntCfgMgr_a-ClntParsIfaceOpt.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libClntCfgMgr_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libClntCfgMgr_a-ClntParsIfaceOpt.o `test -f 'ClntParsIfaceOpt.cpp' || echo '$(srcdir)/'`ClntParsIfaceOpt.cpp libClntCfgMgr_a-ClntParsIfaceOpt.obj: ClntParsIfaceOpt.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libClntCfgMgr_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libClntCfgMgr_a-ClntParsIfaceOpt.obj -MD -MP -MF $(DEPDIR)/libClntCfgMgr_a-ClntParsIfaceOpt.Tpo -c -o libClntCfgMgr_a-ClntParsIfaceOpt.obj `if test -f 'ClntParsIfaceOpt.cpp'; then $(CYGPATH_W) 'ClntParsIfaceOpt.cpp'; else $(CYGPATH_W) '$(srcdir)/ClntParsIfaceOpt.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libClntCfgMgr_a-ClntParsIfaceOpt.Tpo $(DEPDIR)/libClntCfgMgr_a-ClntParsIfaceOpt.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='ClntParsIfaceOpt.cpp' object='libClntCfgMgr_a-ClntParsIfaceOpt.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libClntCfgMgr_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libClntCfgMgr_a-ClntParsIfaceOpt.obj `if test -f 'ClntParsIfaceOpt.cpp'; then $(CYGPATH_W) 'ClntParsIfaceOpt.cpp'; else $(CYGPATH_W) '$(srcdir)/ClntParsIfaceOpt.cpp'; fi` mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LIBRARIES) $(DATA) installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool clean-noinstLIBRARIES \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \ clean-libtool clean-noinstLIBRARIES cscopelist-am ctags \ ctags-am distclean distclean-compile distclean-generic \ distclean-libtool distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-dvi install-dvi-am install-exec \ install-exec-am install-html install-html-am install-info \ install-info-am install-man install-pdf install-pdf-am \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ tags tags-am uninstall uninstall-am parser: ClntParser.y ClntLexer.l @echo "[BISON++] $(SUBDIR)/ClntParser.y" $(top_builddir)/bison++/bison++ --skeleton=$(top_builddir)/bison++/bison.cc --headerskeleton=$(top_builddir)/bison++/bison.h -v --debug --defines -d ClntParser.y -o ClntParser.cpp @echo "[FLEX ] $(SUBDIR)/ClntLexer.l" flex -+ -i -L -oClntLexer.cpp ClntLexer.l @echo "[SED ] $(SUBDIR)/ClntLexer.cpp" cat ClntLexer.cpp | sed 's/extern "C" int isatty (int );/\/\/extern "C" int isatty (int ) throw ();/' > ClntLexer.cpp2 rm -f ClntLexer.cpp mv ClntLexer.cpp2 ClntLexer.cpp # 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: dibbler-1.0.1/ClntCfgMgr/ClntCfgPD.cpp0000644000175000017500000000375412277722750014317 00000000000000/* * Dibbler - a portable DHCPv6 * * author: Krzysztof Wnuk * * released under GNU GPL v2 only licence */ #include #include #include "ClntCfgPD.h" #include "DHCPDefaults.h" #include "Logger.h" using namespace std; TClntCfgPD::TClntCfgPD() :T1_(CLIENT_DEFAULT_T1), T2_(CLIENT_DEFAULT_T2), PrefixLength_(64), State_(STATE_NOTCONFIGURED) { static unsigned long nextIAID=1; IAID_ = nextIAID++; } long TClntCfgPD::countPrefixes() { return ClntCfgPrefixLst_.count(); } unsigned long TClntCfgPD::getT1() { return T1_; } char TClntCfgPD::getPrefixLength() { return PrefixLength_; } unsigned long TClntCfgPD::getT2() { return T2_; } void TClntCfgPD::setState(enum EState state) { State_ = state; } enum EState TClntCfgPD::getState() { return State_; } long TClntCfgPD::getIAID() { return IAID_; } void TClntCfgPD::setIAID(long iaid) { IAID_ = iaid; } void TClntCfgPD::setOptions(SPtr opt) { T1_ = opt->getT1(); T2_ = opt->getT2(); } void TClntCfgPD::firstPrefix() { ClntCfgPrefixLst_.first(); } SPtr TClntCfgPD::getPrefix() { return ClntCfgPrefixLst_.get(); } TClntCfgPD::TClntCfgPD(SPtr right, long iaid) :ClntCfgPrefixLst_(right->ClntCfgPrefixLst_), IAID_(iaid), T1_(right->getT1()), T2_(right->getT2()), PrefixLength_(right->getPrefixLength()) { } void TClntCfgPD::addPrefix(SPtr prefix) { ClntCfgPrefixLst_.append(prefix); } ostream& operator<<(ostream& out,TClntCfgPD& pd) { out << " " << std::endl; SPtr prefix; pd.ClntCfgPrefixLst_.first(); while(prefix = pd.ClntCfgPrefixLst_.get()) { out << " " << *prefix; } out << " " << std::endl; return out; } dibbler-1.0.1/ClntTransMgr/0000775000175000017500000000000012561700421012473 500000000000000dibbler-1.0.1/ClntTransMgr/Makefile.am0000664000175000017500000000102412233256142014446 00000000000000noinst_LIBRARIES = libClntTransMgr.a libClntTransMgr_a_CPPFLAGS = -I$(top_srcdir)/ClntCfgMgr -I$(top_srcdir)/CfgMgr -I$(top_srcdir)/Misc libClntTransMgr_a_CPPFLAGS += -I$(top_srcdir)/Options -I$(top_srcdir)/ClntOptions libClntTransMgr_a_CPPFLAGS += -I$(top_srcdir)/AddrMgr -I$(top_srcdir)/ClntAddrMgr libClntTransMgr_a_CPPFLAGS += -I$(top_srcdir)/ClntMessages -I$(top_srcdir)/Messages libClntTransMgr_a_CPPFLAGS += -I$(top_srcdir)/ClntIfaceMgr -I$(top_srcdir)/IfaceMgr libClntTransMgr_a_SOURCES = ClntTransMgr.cpp ClntTransMgr.h dibbler-1.0.1/ClntTransMgr/ClntTransMgr.h0000644000175000017500000000722012277722750015156 00000000000000/* * Dibbler - a portable DHCPv6 * * authors: Tomasz Mrugalski * Marek Senderski * * released under GNU GPL v2 only licence * */ #ifndef CLNTTRANSMGR_H #define CLNTTRANSMGR_H #include #include "ClntCfgIface.h" #include "Opt.h" #include "OptAddrLst.h" #include "IPv6Addr.h" #include "AddrIA.h" #include "ClntMsg.h" #define ClntTransMgr() (TClntTransMgr::instance()) class TClntTransMgr { private: TClntTransMgr(const std::string& config); public: static void instanceCreate(const std::string& config); static TClntTransMgr &instance(); ~TClntTransMgr(); void doDuties(); void relayMsg(SPtr msg); unsigned long getTimeout(); void stop(); void sendRequest(TOptList requestOptions, int iface); void sendInfRequest(TOptList requestOptions, int iface); void sendRebind(TOptList ptrIA, int iface); void sendRelease(List(TAddrIA) iaLst, SPtr ta, List(TAddrIA) pdLst); bool handleResponse(SPtr question, SPtr answer); void handleReconfigure(SPtr reconfMsg); void sendRenew(); void shutdown(); bool isDone(); char * getCtrlAddr(); int getCtrlIface(); // Backup server list management void addAdvertise(SPtr advertise); // adds ADVERTISE to the list void firstAdvertise(); SPtr getAdvertise(); SPtr getAdvertiseDUID(); // returns server DUID of the best advertise on the list void sortAdvertise(); // sorts advertise messages void delFirstAdvertise(); // deletes first advertise int getMaxPreference(); int getAdvertiseLstCount(); void printAdvertiseLst(); bool sanitizeAddrDB(); #ifdef MOD_REMOTE_AUTOCONF struct TNeighborInfo { typedef enum { NeighborInfoState_Added, // just added (waiting to be sent) NeighborInfoState_Sent, // sent, awaiting remote reply NeighborInfoState_Received // remote reply received } NeighborInfoState; SPtr srvAddr; int ifindex; int transid; SPtr srvDuid; SPtr reply; SPtr rcvdAddr; NeighborInfoState state; TNeighborInfo(SPtr addr) : srvAddr(addr), ifindex(0), transid(0), srvDuid(0), reply(0), rcvdAddr(0), state(NeighborInfoState_Added) { } }; typedef std::list< SPtr > TNeighborInfoLst; TNeighborInfoLst Neighbors; SPtr neighborInfoGet(SPtr addr); SPtr neighborInfoGet(int transid); SPtr neighborAdd(int ifindex, SPtr addr); bool checkRemoteSolicits(); bool updateNeighbors(int ifindex, SPtr neighbors); bool sendRemoteSolicit(SPtr neighbor); bool processRemoteReply(SPtr reply); #endif protected: void removeExpired(); void checkDecline(); void checkConfirm(); void checkDB(); void checkRenew(); void checkRequest(); void checkSolicit(); void checkInfRequest(); private: bool openLoopbackSocket(); bool openSockets(SPtr iface); bool populateAddrMgr(SPtr iface); void sortAdvertiseLst(); void printLst(List(TMsg) lst); List(TClntMsg) Transactions; bool IsDone; // isDone = true - client operation is finished bool Shutdown; // is shutdown in progress? bool BindReuse; // Bug #56. Shall we allow running client and server on the same machine? int CtrlIface_; char CtrlAddr_[48]; List(TMsg) AdvertiseLst; // list of backup servers (i.e. not used ADVERTISE messages) static TClntTransMgr * Instance; }; #endif dibbler-1.0.1/ClntTransMgr/ClntTransMgr.cpp0000664000175000017500000014172712556514063015522 00000000000000/* * Dibbler - a portable DHCPv6 * * authors: Tomasz Mrugalski * Marek Senderski * changes: Krzysztof Wnuk * Michal Kowalczuk * * released under GNU GPL v2 only licence * */ #include #include #include "ClntTransMgr.h" #include "ClntAddrMgr.h" #include "ClntCfgMgr.h" #include "ClntCfgPD.h" #include "ClntMsgAdvertise.h" #include "ClntMsgRequest.h" #include "ClntMsgRenew.h" #include "ClntMsgRebind.h" #include "ClntMsgReply.h" #include "ClntMsgRelease.h" #include "ClntMsgSolicit.h" #include "ClntMsgInfRequest.h" #include "ClntMsgDecline.h" #include "ClntMsgConfirm.h" #include "ClntMsgReconfigure.h" #include "Container.h" #include "DHCPConst.h" #include "Logger.h" using namespace std; TClntTransMgr * TClntTransMgr::Instance = 0; void TClntTransMgr::instanceCreate(const std::string& config) { if (Instance) { Log(Crit) << "ClntTransMgr instance already exists. Internal code error!" << LogEnd; return; } Instance = new TClntTransMgr(config); } TClntTransMgr &TClntTransMgr::instance() { if (!Instance) { Log(Crit) << "Error: ClntTransMgr not initialized. Trying to recover." << LogEnd; instanceCreate(CLNTTRANSMGR_FILE); } return *Instance; } TClntTransMgr::TClntTransMgr(const std::string& config) :IsDone(true), Shutdown(true), CtrlIface_(-1) { // should we set REUSE option during binding sockets? #ifdef MOD_CLNT_BIND_REUSE BindReuse = true; #else BindReuse = false; #endif if (this->BindReuse) Log(Debug) << "Bind reuse enabled (multiple instances allowed)." << LogEnd; else Log(Debug) << "Bind reuse disabled (multiple instances not allowed)." << LogEnd; if (!this->openLoopbackSocket()) { return; } SPtr iface; ClntCfgMgr().firstIface(); while(iface=ClntCfgMgr().getIface()) { if (!populateAddrMgr(iface)) return; if (!this->openSockets(iface)) { return; } } checkDB(); ClntIfaceMgr().dump(); Shutdown = false; IsDone = false; } bool TClntTransMgr::populateAddrMgr(SPtr iface) { // create IAs in AddrMgr corresponding to those specified in CfgMgr. SPtr ia; iface->firstIA(); while(ia = iface->getIA()) { if (ClntAddrMgr().getIA(ia->getIAID())) continue; // there is such IA already - read from disk cache (client-AddrMgr.xml) SPtr addrIA = new TAddrIA(iface->getName(), iface->getID(), IATYPE_IA, SPtr(), SPtr(), ia->getT1(), ia->getT2(), ia->getIAID()); ClntAddrMgr().addIA(addrIA); } SPtr ta; iface->firstTA(); if ( (ta = iface->getTA()) && (!ClntAddrMgr().getTA(ta->getIAID()))) { // if there is such TA already, then skip adding it SPtr addrTA = new TAddrIA(iface->getName(), iface->getID(), IATYPE_TA, SPtr(), SPtr(), DHCPV6_INFINITY, DHCPV6_INFINITY, ta->getIAID()); ClntAddrMgr().addTA(addrTA); } SPtr pd; iface->firstPD(); while (pd = iface->getPD()) { if (ClntAddrMgr().getPD(pd->getIAID())) continue; // there is such IA already - read from disk cache (client-AddrMgr.xml) SPtr addrPD = new TAddrIA(iface->getName(), iface->getID(), IATYPE_PD, SPtr(), SPtr(), pd->getT1(), pd->getT2(), pd->getIAID()); ClntAddrMgr().addPD(addrPD); } return true; } bool TClntTransMgr::openSockets(SPtr iface) { if (iface->noConfig()) return true; // open socket SPtr realIface = ClntIfaceMgr().getIfaceByID(iface->getID()); if (!realIface) { Log(Error) << "Interface " << iface->getFullName() << " not present in system." << LogEnd; return false; } if (!realIface->flagUp()) { Log(Error) << "Interface " << realIface->getFullName() << " is down. Unable to open socket." << LogEnd; return false; } if (!realIface->flagRunning()) { Log(Error) << "Interface " << realIface->getFullName() << " is not running." << LogEnd; return false; } // get link-local address char* llAddr; realIface->firstLLAddress(); llAddr=realIface->getLLAddress(); if (!llAddr) { Log(Error) << "Interface " << realIface->getFullName() << " does not have link-layer address. Weird." << LogEnd; return false; } // By default, we use the first link-local address on the interface SPtr addr = new TIPv6Addr(llAddr); // However, if the user specified bind-to address, we'll use that instead. if (iface->getBindToAddr()) { addr = iface->getBindToAddr(); Log(Debug) << "Using bind-to address " << addr->getPlain() << " on interface " << iface->getFullName() << LogEnd; } // it's very important to open unicast socket first as it will be used for // unicast communication if (iface->getUnicast()) { Log(Notice) << "Creating socket for unicast communication on " << iface->getFullName() << LogEnd; SPtr anyaddr = new TIPv6Addr("::", true); // don't bind to a specific address if (!realIface->addSocket(anyaddr, DHCPCLIENT_PORT, false, this->BindReuse)) { Log(Crit) << "Unicast socket creation (addr=" << anyaddr->getPlain() << ") on " << iface->getFullName() << " interface failed." << LogEnd; return false; } } Log(Notice) << "Creating socket (addr=" << *addr << ") on " << iface->getFullName() << " interface." << LogEnd; if (!realIface->addSocket(addr,DHCPCLIENT_PORT,true, this->BindReuse)) { Log(Crit) << "Socket creation (addr=" << *addr << ") on " << iface->getFullName() << " interface failed." << LogEnd; return false; } if (llAddr) { char buf[48]; inet_ntop6(llAddr,buf); CtrlIface_ = realIface->getID(); strncpy(CtrlAddr_, buf, 48); } return true; } /** this function removes expired addresses from interface and from database * It must be called before AddrMgr::doDuties() is called. */ void TClntTransMgr::removeExpired() { /// @todo: call notify-script when address/prefix is expired TNotifyScriptParams params; if (ClntAddrMgr().getValidTimeout()) return; SPtr ptrIA; SPtr ptrAddr; SPtr ptrIface; // are there any expired IA_NAs? ClntAddrMgr().firstIA(); while (ptrIA = ClntAddrMgr().getIA()) { if (ptrIA->getValidTimeout()) continue; ptrIA->firstAddr(); while (ptrAddr = ptrIA->getAddr()) { if (ptrAddr->getValidTimeout()) continue; ptrIface = ClntIfaceMgr().getIfaceByID(ptrIA->getIfindex()); Log(Warning) << "Address " << ptrAddr->get()->getPlain() << " assigned to the " << ptrIface->getFullName() << " interface (in IA_NA " << ptrIA->getIAID() <<") has expired." << LogEnd; // remove that address from the physical interace ptrIface->delAddr(ptrAddr->get(), ptrIface->getPrefixLength()); // Note: Technically, removing address here is not needed, as it will // be removed in AddrMgr::doDuties() anyway ptrIA->delAddr(ptrAddr->get()); Log(Info) << "Expired address " << ptrAddr->get()->getPlain() << " from IA " << ptrIA->getIAID() << " has been removed from addrDB." << LogEnd; } // if there are no more addresses in this IA, declare it freed if (!ptrIA->countAddr()) { Log(Debug) << "The IA_NA (with IAID=" << ptrIA->getIAID() << ") has expired. " << LogEnd; SPtr cfgIface = ClntCfgMgr().getIface(ptrIA->getIfindex()); if (cfgIface) { SPtr cfgIA = cfgIface->getIA(ptrIA->getIAID()); if (cfgIA) { cfgIA->setState(STATE_NOTCONFIGURED); } } else { // something is terribly wrong here } } } // are there any expired IA_TAs? ClntAddrMgr().firstTA(); while (ptrIA = ClntAddrMgr().getTA()) { if (ptrIA->getValidTimeout()) continue; ptrIA->firstAddr(); while (ptrAddr = ptrIA->getAddr()) { if (ptrAddr->getValidTimeout()) continue; ptrIface = ClntIfaceMgr().getIfaceByID(ptrIA->getIfindex()); Log(Warning) << "Temporary address " << ptrAddr->get()->getPlain() << " assigned to the " << ptrIface->getFullName() << " interface (in IA_TA " << ptrIA->getIAID() <<") has expired." << LogEnd; // remove that address from the physical interace ptrIface->delAddr(ptrAddr->get(), ptrIface->getPrefixLength()); // Note: Technically, removing address here is not needed, as it will // be removed in AddrMgr::doDuties() anyway ptrIA->delAddr(ptrAddr->get()); Log(Info) << "Expired temporary address " << ptrAddr->get()->getPlain() << " from IA " << ptrIA->getIAID() << " has been removed from addrDB." << LogEnd; } // if there are no more addresses in this IA, declare it freed if (!ptrIA->countAddr()) { Log(Debug) << "The IA_TA (with IAID=" << ptrIA->getIAID() << ") has expired. " << LogEnd; SPtr cfgIface = ClntCfgMgr().getIface(ptrIA->getIfindex()); if (cfgIface) { cfgIface->firstTA(); SPtr cfgTA = cfgIface->getTA(); if (cfgTA) { cfgTA->setState(STATE_NOTCONFIGURED); } } else { // something is terribly wrong here } } } // are there any expired IA_PDs? SPtr ptrPD; SPtr ptrPrefix; ClntAddrMgr().firstPD(); while (ptrPD = ClntAddrMgr().getPD()) { if (ptrPD->getValidTimeout()) continue; ptrPD->firstPrefix(); while (ptrPrefix = ptrPD->getPrefix()) { if (ptrPrefix->getValidTimeout()) continue; ptrIface = ClntIfaceMgr().getIfaceByID(ptrPD->getIfindex()); Log(Warning) << "Prefix " << ptrPrefix->get()->getPlain() << " obtained on the " << ptrIface->getFullName() << " interface (in IA_PD " << ptrPD->getIAID() <<") has expired." << LogEnd; // remove that address from the physical interace ClntIfaceMgr().delPrefix(ptrPD->getIfindex(), ptrPrefix->get(), ptrPrefix->getLength(), ¶ms); // Note: Technically, removing address here is not needed, as it will // be removed in AddrMgr::doDuties() anyway ptrPD->delPrefix(ptrPrefix); Log(Info) << "Expired prefix " << ptrPrefix->get()->getPlain() << "/" << ptrPrefix->getLength() << " from IA_PD " << ptrPD->getIAID() << " has been removed from addrDB." << LogEnd; } // if there are no more addresses in this IA, declare it freed if (!ptrPD->countPrefix()) { Log(Debug) << "The IA_PD (with IAID=" << ptrPD->getIAID() << ") has expired. " << LogEnd; SPtr cfgIface = ClntCfgMgr().getIface(ptrPD->getIfindex()); if (cfgIface) { SPtr cfgPD = cfgIface->getPD(ptrPD->getIAID()); if (cfgPD) { cfgPD->setState(STATE_NOTCONFIGURED); } } else { // something is terribly wrong here } } } } /** * checks if loaded Address database is sane (i.e. does not reffer to non-existing interface) * */ void TClntTransMgr::checkDB() { SPtr iface; SPtr ptrIA; SPtr ptrAddr; ClntAddrMgr().doDuties(); ClntAddrMgr().firstIA(); while ( ptrIA = ClntAddrMgr().getIA()) { iface = ClntCfgMgr().getIface( ptrIA->getIfindex() ); if (!iface) { Log(Warning) << "IA (iaid=" << ptrIA->getIAID() << ") loaded from old file, but currently there is no iface with ifindex=" << ptrIA->getIfindex(); // IA with non-existent iface, purge iface ptrIA->firstAddr(); while (ptrAddr = ptrIA->getAddr()) ptrIA->delAddr( ptrAddr->get() ); ptrIA->setState(STATE_NOTCONFIGURED); ClntAddrMgr().delIA(ptrIA->getIAID()); } } } bool TClntTransMgr::openLoopbackSocket() { SPtr ptrIface; if (!this->BindReuse) return true; #ifndef WIN32 SPtr loopback; ClntIfaceMgr().firstIface(); while (ptrIface=ClntIfaceMgr().getIface()) { if (!ptrIface->flagLoopback()) { continue; } loopback = ptrIface; break; } if (!loopback) { Log(Crit) << "Loopback interface not found!" << LogEnd; return false; } SPtr loopAddr = new TIPv6Addr("::", true); Log(Notice) << "Creating control (" << *loopAddr << ") socket on the " << loopback->getName() << "/" << loopback->getID() << " interface." << LogEnd; if (!loopback->addSocket(loopAddr,DHCPCLIENT_PORT, false, true)) { Log(Crit) << "Proper socket creation failed." << LogEnd; return false; } #endif return true; } /* * this method is called, when no message has been received, but some * action should be taken, e.g. RENEW transmission */ void TClntTransMgr::doDuties() { // for each message on list, let it do its duties, if timeout is reached SPtr msg; Transactions.first(); while(msg=Transactions.get()) { if ((!msg->getTimeout())&&(!msg->isDone())) { Log(Info) << "Processing msg (" << msg->getName() << ",transID=0x" << hex << msg->getTransID() << dec << ",opts:"; SPtr ptrOpt; msg->firstOption(); while (ptrOpt = msg->getOption()) { Log(Cont) << " " << ptrOpt->getOptType(); } Log(Cont) << ")" << LogEnd; msg->doDuties(); } } // now delete messages which are marked as done Transactions.first(); while (msg = Transactions.get() ) { if (msg->isDone()) Transactions.del(); } if (ClntCfgMgr().inactiveMode()) { SPtr x; x = ClntCfgMgr().checkInactiveIfaces(); if (x) { if (!populateAddrMgr(x)) { Log(Error)<< "Call to populateAddrMgr() ended with error" << " Following operation may be unstable!" << LogEnd; } if (!openSockets(x)) { Log(Crit) << "Attempt to bind activated interfaces failed." << " Following operation may be unstable!" << LogEnd; } } } removeExpired(); ClntAddrMgr().doDuties(); ClntAddrMgr().dump(); ClntIfaceMgr().dump(); ClntCfgMgr().dump(); if (!this->Shutdown && !this->IsDone) { // did we switched links lately? // are there any IAs to confirm? checkConfirm(); // are there any tentative addrs? checkDecline(); // are there any IAs or TAs to configure? checkSolicit(); //is there any IA in Address manager, which has not sufficient number //of addresses checkRequest(); // are there any aging IAs or PDs? checkRenew(); //Maybe we require only infromations concernig link checkInfRequest(); #ifdef MOD_REMOTE_AUTOCONF checkRemoteSolicits(); #endif } // This method launch the DNS update, so the checkDecline has to be done before to ensure the ip address is valid ClntIfaceMgr().doDuties(); if (this->Shutdown && !Transactions.count()) this->IsDone = true; } void TClntTransMgr::shutdown() { SPtr ptrFirstIA; SPtr ptrNextIA; SPtr ta; SPtr pd; SPtr iface; List(TAddrIA) releasedIAs; List(TAddrIA) releasedPDs; Transactions.clear(); // delete all transactions this->Shutdown = true; Log(Notice) << "Shutting down entire client." << LogEnd; // delete all weird-state/innormal-state and address-free IAs ClntAddrMgr().firstIA(); while (ptrFirstIA = ClntAddrMgr().getIA()) { if ( (ptrFirstIA->getState() != STATE_CONFIGURED && ptrFirstIA->getState() != STATE_INPROCESS) || !ptrFirstIA->countAddr() ) ClntAddrMgr().delIA(ptrFirstIA->getIAID()); } // normal IAs are to be released while (ClntAddrMgr().countIA()) { // clear the list releasedIAs.clear(); // get first IA ClntAddrMgr().firstIA(); ptrFirstIA = ClntAddrMgr().getIA(); releasedIAs.append(ptrFirstIA); ClntAddrMgr().delIA( ptrFirstIA->getIAID() ); // find similar IAs while (ptrNextIA = ClntAddrMgr().getIA()) { if ((*(ptrFirstIA->getDUID())==*(ptrNextIA->getDUID())) && (ptrFirstIA->getIfindex() == ptrNextIA->getIfindex() ) ) { // IA serviced via this same server, add it do the list releasedIAs.append(ptrNextIA); // delete addressess from IfaceMgr SPtr ptrAddr; SPtr ptrIface; ptrIface = ClntIfaceMgr().getIfaceByID(ptrNextIA->getIfindex()); if (!ptrIface) { Log(Error) << "Unable to find " << ptrNextIA->getIfindex() << " interface while releasing address." << LogEnd; break; } ptrNextIA->firstAddr(); // delete IA from AddrMgr ClntAddrMgr().delIA( ptrNextIA->getIAID() ); } } ta.reset(); if (releasedIAs.count()) { // check if there are TA to release releasedIAs.first(); iface = ClntCfgMgr().getIface(releasedIAs.get()->getIfindex()); if (iface && iface->countTA()) { iface->firstTA(); SPtr cfgTA = iface->getTA(); ta = ClntAddrMgr().getTA(cfgTA->getIAID()); cfgTA->setState(STATE_DISABLED); } } pd.reset(); ClntAddrMgr().firstPD(); while (pd = ClntAddrMgr().getPD()) { releasedPDs.append(pd); SPtr cfgPD = ClntCfgMgr().getPD(pd->getIAID()); if (cfgPD) cfgPD->setState(STATE_DISABLED); } sendRelease(releasedIAs, ta, releasedPDs); } // now check if there are any TA left ClntCfgMgr().firstIface(); while (iface = ClntCfgMgr().getIface()) { if (iface->countTA()) { iface->firstTA(); SPtr cfgTA = iface->getTA(); ta = ClntAddrMgr().getTA(cfgTA->getIAID()); releasedIAs.clear(); if (!ta) { Log(Warning) << "Unable to find TA(taid=" << cfgTA->getIAID() <<"). " << LogEnd; continue; } if (cfgTA->getState()==STATE_CONFIGURED) { this->sendRelease(releasedIAs, ta, releasedPDs); cfgTA->setState(STATE_DISABLED); } } } // are there any PDs left to release? pd.reset(); ClntAddrMgr().firstPD(); releasedIAs.clear(); releasedPDs.clear(); while (pd = ClntAddrMgr().getPD()) { releasedPDs.append(pd); SPtr cfgPD = ClntCfgMgr().getPD(pd->getIAID()); if (cfgPD) cfgPD->setState(STATE_DISABLED); } if (releasedPDs.count()) this->sendRelease(releasedIAs, SPtr(), releasedPDs); //CHANGED:the following two lines are uncommented. doDuties(); // just to send RELEASE msg Transactions.clear(); // delete all transactions // clean up options ClntIfaceMgr().removeAllOpts(); } void TClntTransMgr::relayMsg(SPtr msgAnswer) { SPtr ifaceQuestion; SPtr ifaceAnswer; // is message valid? if (!msgAnswer->check()) return ; if (msgAnswer->getType() == RECONFIGURE_MSG) { handleReconfigure(msgAnswer); return; } #ifdef MOD_REMOTE_AUTOCONF if (neighborInfoGet(msgAnswer->getTransID())) { processRemoteReply(msgAnswer); return; } #endif // find which message this is answer for bool found = false; SPtr msgQuestion; Transactions.first(); while(msgQuestion=(Ptr*)Transactions.get()) { if (msgQuestion->getTransID()==msgAnswer->getTransID()) { found =true; if (msgQuestion->getIface()!=msgAnswer->getIface()) { ifaceQuestion = ClntIfaceMgr().getIfaceByID(msgQuestion->getIface()); ifaceAnswer = ClntIfaceMgr().getIfaceByID(msgAnswer->getIface()); Log(Warning) << "Reply for transaction 0x" << hex << msgQuestion->getTransID() << dec << " sent on " << ifaceQuestion->getFullName() << " was received on interface " << ifaceAnswer->getFullName() << "." << LogEnd; // return; // don't return, just fix interface ID // useful, when sending thru eth0, but receiving via loopback msgAnswer->setIface(msgQuestion->getIface()); } handleResponse(msgQuestion, msgAnswer); break; } } if (!found) { if (!Shutdown) Log(Warning) << "Message with wrong transID (0x" << hex << msgAnswer->getTransID() << dec << ") received. Ignoring." << LogEnd; else Log(Debug) << "Message with transID=0x" << hex << msgAnswer->getTransID() << dec << " received, but ignored during shutdown." << LogEnd; } ClntCfgMgr().dump(); ClntAddrMgr().dump(); } /// processes received RECONFIGURE message /// /// Verifies that received message is valid. Depending on received option, it will /// send RENEW, INF-REQUEST or REBIND message /// /// @param reconfMsg pointer to received reconfigure message /// void TClntTransMgr::handleReconfigure(SPtr reconfMsg) { // see if there is reconfigure-msg option. If not, drop message. // if yes, send specific message, e.g. call sendRenew(), sendRebind() or sendInfRequest() if(!ClntCfgMgr().getReconfigure()) { Log(Notice) << "Client is not configured to support reconfigure message." << LogEnd; return; } /// @todo: check authentication here /// @todo: server may tell client to send, RENEW, REBIND or INF-REQUEST Log(Notice) << "Received RECONFIGURE, sending RENEW." << LogEnd; sendRenew(); } /** * handle response * * @param question * @param answer * * @return */ bool TClntTransMgr::handleResponse(SPtr question, SPtr answer) { // pre-handling hooks can be added here // handle actual response question->answer(answer); // post-handling hooks can be added here SPtr q = (Ptr*) question; SPtr a = (Ptr*) answer; ClntIfaceMgr().notifyScripts(ClntCfgMgr().getScript(), q, a); if ( (question->getType()==REQUEST_MSG || question->getType()==SOLICIT_MSG) && (answer->getType()==REPLY_MSG) ) { // we got actual configuration complete here } return true; } unsigned long TClntTransMgr::getTimeout() { unsigned long timeout = DHCPV6_INFINITY; unsigned long tmp; if (this->IsDone) return 0; // AddrMgr timeout timeout = ClntAddrMgr().getTimeout(); tmp = ClntAddrMgr().getTentativeTimeout(); if (timeout > tmp) timeout = tmp; // Uncomment for timeout debugging //Log(Debug) << "Timeout after AddrMgr=" << timeout << LogEnd; if (timeout == 0) { ClntAddrMgr().getTimeout(); } // IfaceMgr (Lifetime option) timeout tmp = ClntIfaceMgr().getTimeout(); if (timeout > tmp) timeout = tmp; // Uncomment for timeout debugging // Log(Debug) << "Timeout after IfaceMgr=" << timeout << LogEnd; // Messages timeout SPtr ptrMsg; Transactions.first(); tmp = DHCPV6_INFINITY; while(ptrMsg=Transactions.get()) { if (tmp > ptrMsg->getTimeout()) tmp = ptrMsg->getTimeout(); } if (timeout > tmp) timeout = tmp; if (ClntCfgMgr().inactiveIfacesCnt()) { if (timeout>INACTIVE_MODE_INTERVAL) timeout=INACTIVE_MODE_INTERVAL; } return timeout; } void TClntTransMgr::stop() { } /** * Note: requestOptions list MUST NOT contain server DUID. */ void TClntTransMgr::sendRequest(TOptList requestOptions, int iface) { sortAdvertiseLst(); for (TOptList::iterator opt= requestOptions.begin(); opt!=requestOptions.end(); ++opt) { if (!allowOptInMsg(REQUEST_MSG, (*opt)->getOptType()) || (*opt)->getOptType() == OPTION_AUTH) opt = requestOptions.erase(opt); } SPtr ptr = new TClntMsgRequest(requestOptions, iface); Transactions.append( (Ptr*)ptr ); } void TClntTransMgr::sendRenew() { // Find all IAs List(TAddrIA) iaLst; SPtr ia; SPtr iaPattern; ClntAddrMgr().firstIA(); // Need to be fixed:?? how to deal with mutiple network interfaces. while (ia = ClntAddrMgr().getIA() ) { iaLst.append(ia); ia->setState(STATE_INPROCESS); } // Find all PDs List(TAddrIA) pdLst; ClntAddrMgr().firstPD(); while (ia = ClntAddrMgr().getPD()) { pdLst.append(ia); ia->setState(STATE_INPROCESS); } if (iaLst.count() + pdLst.count() == 0) { // there are no IAs or PD to refresh. Just do nothing. return; } Log(Info) << "Generating RENEW for " << iaLst.count() << " IA(s) and " << pdLst.count() << " PD(s). " << LogEnd; SPtr ptrRenew = new TClntMsgRenew(iaLst, pdLst); Transactions.append(ptrRenew); } // Send RELEASE message void TClntTransMgr::sendRelease( List(TAddrIA) IALst, SPtr ta, List(TAddrIA) pdLst) { if ( !IALst.count() && !ta && !pdLst.count() ) { Log(Error) << "Unable to send RELEASE with empty IA list, PD list and no TA." << LogEnd; return; } // find interface and srv address int iface; SPtr addr; SPtr ptrIA; if (IALst.count()) { IALst.first(); ptrIA = IALst.get(); iface = ptrIA->getIfindex(); addr = ptrIA->getSrvAddr(); } else if (pdLst.count()) { pdLst.first(); ptrIA = pdLst.get(); iface = ptrIA->getIfindex(); addr = ptrIA->getSrvAddr(); } else if (ta) { iface = ta->getIfindex(); addr = ta->getSrvAddr(); } else { Log(Error) << "Unable to send RELEASE message. No IA, PD or TA defined." << LogEnd; return; } SPtr ptrIface = ClntCfgMgr().getIface(iface); if (!ptrIface) { Log(Error) << "Unable to find interface with ifindex=" << iface << LogEnd; return; } Log(Notice) << "Creating RELEASE for " << IALst.count() << " IA(s), " << pdLst.count() << " PD(s), " << (ta?" and TA":" (no TA)") << " on the " << ptrIface->getFullName() << " interface." << LogEnd; SPtr ptr = new TClntMsgRelease(iface, addr, IALst, ta, pdLst); Transactions.append( ptr ); } // Send REBIND message void TClntTransMgr::sendRebind(TOptList requestOptions, int iface) { for (TOptList::iterator opt= requestOptions.begin(); opt!=requestOptions.end(); ++opt) { if (!allowOptInMsg(REBIND_MSG, (*opt)->getOptType())) opt = requestOptions.erase(opt); } SPtr ptr = new TClntMsgRebind(requestOptions, iface); if (!ptr->isDone()) Transactions.append( ptr ); } void TClntTransMgr::sendInfRequest(TOptList requestOptions, int iface) { for (TOptList::iterator opt= requestOptions.begin(); opt!=requestOptions.end(); ++opt) { if (!allowOptInMsg(INFORMATION_REQUEST_MSG, (*opt)->getOptType())) opt = requestOptions.erase(opt); } SPtr ptr = new TClntMsgInfRequest(requestOptions,iface); if (!ptr->isDone()) Transactions.append( ptr ); } // should we send SOLICIT ? void TClntTransMgr::checkSolicit() { //For every iface, every group in iface in ClntCfgMgr //Enumerate IA's from this group SPtr iface; ClntCfgMgr().firstIface(); while( (iface=ClntCfgMgr().getIface()) ) { if (iface->noConfig()) continue; if (iface->stateless()) continue; // step 1: check if there are any IA to be configured List(TClntCfgIA) iaLst; // list of IA requiring configuration SPtr cfgIA; iface->firstIA(); while(cfgIA=iface->getIA()) { // These not assigned in AddrMgr and configurable and not in // trasaction group and pass to constructor of Solicit message if(cfgIA->getState()==STATE_NOTCONFIGURED) iaLst.append(cfgIA); } // step 2: check if TA has to be configured SPtr ta; if (iface->countTA() ) { iface->firstTA(); ta = iface->getTA(); if (ta->getState()!=STATE_NOTCONFIGURED) ta.reset(); } // step 3: check if there are any PD to be configured List(TClntCfgPD) pdLst; SPtr pd; iface->firstPD(); while ( pd = iface->getPD() ) { if (pd->getState()==STATE_NOTCONFIGURED) { pdLst.append(pd); } } //Are there any IA, TA or PD which should be configured? if (iaLst.count() || ta || pdLst.count()) { Log(Info) << "Creating SOLICIT message with " << iaLst.count() << " IA(s), " << (ta?"1":"no") << " TA and " << pdLst.count() << " PD(s)"; if (iface->getRapidCommit()) { Log(Cont) << " (with rapid-commit)"; } Log(Cont) << " on " << iface->getFullName() <<" interface." << LogEnd; Transactions.append(new TClntMsgSolicit(iface->getID(), SPtr(), iaLst, ta, pdLst, iface->getRapidCommit())); // state of certain IAs has changed. Let's log it. ClntAddrMgr().dump(); ClntCfgMgr().dump(); } }//for every iface } void TClntTransMgr::checkConfirm() { SPtr ptrIA; SPtr iface; SPtr cfgIA; List(TAddrIA) IALst; ClntCfgMgr().firstIface(); while(iface=ClntCfgMgr().getIface()) { IALst.clear(); iface->firstIA(); while (cfgIA = iface->getIA()) { ClntAddrMgr().firstIA(); while(ptrIA=ClntAddrMgr().getIA()) { if (ptrIA->getState()!=STATE_CONFIRMME) continue; if (ptrIA->getIfindex()==iface->getID()) { IALst.append(ptrIA); ptrIA->setState(STATE_INPROCESS); cfgIA->setState(STATE_INPROCESS); } } } if (IALst.count()) { Log(Info) << "Creating CONFIRM: " << IALst.count() << " IA(s) on " << iface->getFullName() << LogEnd; Transactions.append( new TClntMsgConfirm(iface->getID(), IALst)); // state of certain IAs has changed. Let's log it. ClntAddrMgr().dump(); ClntCfgMgr().dump(); } } } void TClntTransMgr::checkInfRequest() { SPtr iface; ClntCfgMgr().firstIface(); while( (iface=ClntCfgMgr().getIface()) ) { if (iface->noConfig()) continue; SPtr ifaceIface = (Ptr*)ClntIfaceMgr().getIfaceByID(iface->getID()); if (!ifaceIface) { Log(Error) << "Interface with ifindex=" << iface->getID() << " not found." << LogEnd; continue; } if (!ifaceIface->getTimeout()) { if (iface->getDNSServerState() == STATE_CONFIGURED) iface->setDNSServerState(STATE_NOTCONFIGURED); if (iface->getDomainState() == STATE_CONFIGURED) iface->setDomainState(STATE_NOTCONFIGURED); if (iface->getNTPServerState() == STATE_CONFIGURED) iface->setNTPServerState(STATE_NOTCONFIGURED); if (iface->getTimezoneState() == STATE_CONFIGURED) iface->setTimezoneState (STATE_NOTCONFIGURED); if (iface->getSIPServerState() == STATE_CONFIGURED) iface->setSIPServerState(STATE_NOTCONFIGURED); if (iface->getSIPDomainState() == STATE_CONFIGURED) iface->setSIPDomainState(STATE_NOTCONFIGURED); if (iface->getFQDNState() == STATE_CONFIGURED) iface->setFQDNState(STATE_NOTCONFIGURED); if (iface->getNISServerState() == STATE_CONFIGURED) iface->setNISServerState(STATE_NOTCONFIGURED); if (iface->getNISDomainState() == STATE_CONFIGURED) iface->setNISDomainState(STATE_NOTCONFIGURED); if (iface->getNISPServerState() == STATE_CONFIGURED) iface->setNISPServerState(STATE_NOTCONFIGURED); if (iface->getNISPDomainState() == STATE_CONFIGURED) iface->setNISPDomainState(STATE_NOTCONFIGURED); if (iface->getKeyGenerationState() == STATE_CONFIGURED) iface->setKeyGenerationState(STATE_NOTCONFIGURED); } if ( (iface->getDNSServerState() == STATE_NOTCONFIGURED) || (iface->getDomainState() == STATE_NOTCONFIGURED) || (iface->getNTPServerState() == STATE_NOTCONFIGURED) || (iface->getTimezoneState() == STATE_NOTCONFIGURED) || (iface->getSIPServerState() == STATE_NOTCONFIGURED) || (iface->getSIPDomainState() == STATE_NOTCONFIGURED) || (iface->getFQDNState() == STATE_NOTCONFIGURED) || (iface->getNISServerState() == STATE_NOTCONFIGURED) || (iface->getNISDomainState() == STATE_NOTCONFIGURED) || (iface->getNISPServerState() == STATE_NOTCONFIGURED) || (iface->getNISPDomainState() == STATE_NOTCONFIGURED) ) { Log(Info) << "Creating INFORMATION-REQUEST message on " << iface->getFullName() << " interface." << LogEnd; Transactions.append(new TClntMsgInfRequest(iface)); } } } void TClntTransMgr::checkRenew() { // are there any IAs which require RENEW? if (ClntAddrMgr().getT1Timeout() > 0 ) return; // TENTATIVE_YES, there are. Find them! // Find all IAs List(TAddrIA) iaLst; SPtr ia; SPtr iaPattern; ClntAddrMgr().firstIA(); // Need to be fixed:?? how to deal with mutiple network interfaces. while (ia = ClntAddrMgr().getIA() ) { if ( (ia->getT1Timeout()!=0) || (ia->getState()!=STATE_CONFIGURED) || (ia->getTentative()==ADDRSTATUS_UNKNOWN) ) continue; if (!iaPattern) { iaPattern = ia; iaLst.append(ia); ia->setState(STATE_INPROCESS); continue; } if ( (ia->getIfindex() == iaPattern->getIfindex()) && (ia->getDUID() == iaPattern->getDUID()) ) { iaLst.append(ia); ia->setState(STATE_INPROCESS); } } // Find all PDs List(TAddrIA) pdLst; ClntAddrMgr().firstPD(); while (ia = ClntAddrMgr().getPD()) { if ( (ia->getT1Timeout()!=0) || (ia->getState()!=STATE_CONFIGURED) ) continue; if (!iaPattern) { iaPattern = ia; pdLst.append(ia); ia->setState(STATE_INPROCESS); continue; } if ( (ia->getIfindex() == iaPattern->getIfindex()) && (ia->getDUID() == iaPattern->getDUID()) ) { pdLst.append(ia); ia->setState(STATE_INPROCESS); } } if (iaLst.count() + pdLst.count() == 0) { // there are no IAs or PD to refresh. Just do nothing. return; } Log(Info) << "Generating RENEW for " << iaLst.count() << " IA(s) and " << pdLst.count() << " PD(s). " << LogEnd; SPtr ptrRenew = new TClntMsgRenew(iaLst, pdLst); Transactions.append(ptrRenew); // state of certain IAs has changed. Let's log it. ClntAddrMgr().dump(); ClntCfgMgr().dump(); } void TClntTransMgr::checkDecline() { //Find any tentative address and remove them from address manager //Group declined addresses and IAs by server and send Decline //Find first IA with tentative addresses SPtr firstIA; SPtr ptrIA; do { firstIA=SPtr(); // NULL TContainer > declineIALst; ClntAddrMgr().firstIA(); while((ptrIA=ClntAddrMgr().getIA())&&(!firstIA)) { if (ptrIA->getTentative()==ADDRSTATUS_YES) firstIA=ptrIA; } if (firstIA) { declineIALst.append(firstIA); while(ptrIA=ClntAddrMgr().getIA()) { if ((ptrIA->getTentative()==ADDRSTATUS_YES)&& (*ptrIA->getDUID()==*firstIA->getDUID())) { declineIALst.append(ptrIA); } } //Here should be send decline for all tentative addresses in IAs SPtr decline = new TClntMsgDecline(firstIA->getIfindex(), SPtr(), declineIALst); Transactions.append( (Ptr*) decline); // decline sent, now remove those addrs from IfaceMgr SPtr ptrIface = ClntIfaceMgr().getIfaceByID(firstIA->getIfindex()); SPtr duid; declineIALst.first(); while (ptrIA = declineIALst.get() ) { SPtr ptrAddr; ptrIA->firstAddr(); Log(Info) << "Sending DECLINE for IA(IAID=" << ptrIA->getIAID() << ")" << LogEnd; while ( ptrAddr= ptrIA->getAddr() ) { if (ptrAddr->getTentative() == ADDRSTATUS_YES) { Log(Cont) << ptrAddr->get()->getPlain() << " "; /// @todo: check result // remove this address from interface ptrIface->delAddr(ptrAddr->get(), ptrAddr->getPrefix()); /// @todo: check result // remove this address from addrDB ptrIA->delAddr(ptrAddr->get()); } } Log(Cont) << LogEnd; duid = ptrIA->getDUID(); ptrIA->setTentative(); } // create REQUEST message SPtr request; request = new TClntMsgRequest(declineIALst, duid, firstIA->getIfindex() ); Transactions.append( (Ptr*) request); // state of certain IAs has changed. Let's log it. ClntAddrMgr().dump(); ClntCfgMgr().dump(); } } while(firstIA); } void TClntTransMgr::checkRequest() { /// @todo: Reimplement check request support. return; SPtr ia; SPtr cfgIA; SPtr duid; List(TAddrIA) requestIALst; int ifaceID = 0; requestIALst.clear(); ClntAddrMgr().firstIA(); while( ia=ClntAddrMgr().getIA() ) { cfgIA = ClntCfgMgr().getIA(ia->getIAID()); if (!cfgIA) { Log(Error) << "Internal sanity check failed. Unable to find IA (iaid=" << ia->getIAID() << ") in the CfgMgr." << LogEnd; continue; } // find all IAs which should be configured: if ( (cfgIA->getState()!=STATE_CONFIGURED) ) continue; // this IA is being serviced by different server if ( (duid) && ia->getDUID() && !((*ia->getDUID()) == (*duid)) ) { continue; } // if we have found one IA, following ones must be on the same interface if ( ifaceID && (ia->getIfindex()!=ifaceID) ) { continue; } // do we have enough addresses? // cfgIA - specified in conf file, ia - actually asigned by the server if ( ia->countAddr() >= cfgIA->countAddr() ) continue; Log(Info) << "IA (iaid=" << ia->getIAID() << ") is configured to get " << cfgIA->countAddr() << " addr, but server provided " << ia->countAddr() << ", REQUEST will be sent." << LogEnd; requestIALst.append(ia); ia->setState(STATE_INPROCESS); duid = ia->getDUID(); ifaceID = ia->getIfindex(); } if (requestIALst.count()) { // create REQUEST message SPtr request; request = new TClntMsgRequest( requestIALst, duid, ifaceID ); Transactions.append( (Ptr*) request); } } bool TClntTransMgr::isDone() { return IsDone; } char* TClntTransMgr::getCtrlAddr() { return CtrlAddr_; } int TClntTransMgr::getCtrlIface() { return CtrlIface_; } TClntTransMgr::~TClntTransMgr() { Log(Debug) << "ClntTransMgr cleanup." << LogEnd; } void TClntTransMgr::addAdvertise(SPtr advertise) { AdvertiseLst.append( advertise ); } void TClntTransMgr::firstAdvertise() { AdvertiseLst.first(); } SPtr TClntTransMgr::getAdvertise() { return AdvertiseLst.get(); } SPtr TClntTransMgr::getAdvertiseDUID() { if (!AdvertiseLst.count()) return TOptPtr(); // NULL AdvertiseLst.first(); SPtr msg = AdvertiseLst.get(); return msg->getOption(OPTION_SERVERID); } void TClntTransMgr::delFirstAdvertise() { AdvertiseLst.first(); AdvertiseLst.delFirst(); } int TClntTransMgr::getAdvertiseLstCount() { return AdvertiseLst.count(); } int TClntTransMgr::getMaxPreference() { if (AdvertiseLst.count() == 0) return -1; int max = 0; SPtr ptr; AdvertiseLst.first(); while ( ptr = (Ptr*) AdvertiseLst.get() ) { if ( max < ptr->getPreference() ) max = ptr->getPreference(); } return max; } void TClntTransMgr::printLst(List(TMsg) lst) { SPtr x; SPtr adv; lst.first(); bool first = true; while (x = lst.get()) { adv = (Ptr*) x; Log(Debug) << "Advertise from " << adv->getInfo() << "."; if (first) { Log(Cont) << "[using this]"; first = false; } Log(Cont) << LogEnd; } } void TClntTransMgr::sortAdvertiseLst() { // we'll store all ADVERTISE here List(TMsg) sorted; // sort ADVERTISE by the PREFERENCE value SPtr ptr; while (AdvertiseLst.count()) { int max = getMaxPreference(); AdvertiseLst.first(); while ( ptr = (Ptr*) AdvertiseLst.get() ) { if (ptr->getPreference() == max) break; } // did we find it? Then append it on the end of sorted list, and delete from this new. if (ptr) { sorted.append( (Ptr*) ptr ); AdvertiseLst.del(); } } // now copy sorted list to AnswersLst AdvertiseLst = sorted; } void TClntTransMgr::printAdvertiseLst() { printLst(AdvertiseLst); } /// @brief checks/updates loaded database (regarding interface names/indexes) /// /// /// @return true if sanitization was successful, false if it failed bool TClntTransMgr::sanitizeAddrDB() { // Those two maps will hold current interface names/ifindexes TAddrMgr::NameToIndexMapping currentNameToIndex; TAddrMgr::IndexToNameMapping currentIndexToName; // Let's get name->index and index->name maps first ClntIfaceMgr().firstIface(); while (SPtr iface = ClntIfaceMgr().getIface()) { currentNameToIndex.insert(make_pair(iface->getName(), iface->getID())); currentIndexToName.insert(make_pair(iface->getID(), iface->getName())); } // Ok, let's iterate over all loaded entries in Ifa return ClntAddrMgr().updateInterfacesInfo(currentNameToIndex, currentIndexToName); } #ifdef MOD_REMOTE_AUTOCONF SPtr TClntTransMgr::neighborInfoGet(SPtr addr) { for (TNeighborInfoLst::iterator it=Neighbors.begin(); it!=Neighbors.end(); ++it) { if ( (*(*it)->srvAddr) == *addr) return *it; } return 0; } SPtr TClntTransMgr::neighborInfoGet(int transid) { for (TNeighborInfoLst::iterator it=Neighbors.begin(); it!=Neighbors.end(); ++it) { if ( (*it)->transid == transid) return *it; } return 0; } bool TClntTransMgr::updateNeighbors(int ifindex, SPtr neighbors) { neighbors->firstAddr(); SPtr addr; while (addr=neighbors->getAddr()) { SPtr info; info = neighborInfoGet(addr); if (info) continue; // this neighbor is already known neighborAdd(ifindex, addr); } return true; } SPtr TClntTransMgr::neighborAdd(int ifindex, SPtr addr) { SPtr info = new TNeighborInfo(addr); info->srvAddr = addr; info->ifindex = ifindex; Log(Debug) << "New information about neighbor " << addr->getPlain() << " added." << LogEnd; Neighbors.push_back(info); // it's too early to send remote solicit. // we will send it once global address is received // sendRemoteSolicit(info); return info; } bool TClntTransMgr::checkRemoteSolicits() { bool status = true; if (!ClntAddrMgr().getPreferredAddr()) { // There are no preferred (non-tentative) addresses. Skipping remote solicit. return false; } // There is preferred address: " << ClntAddrMgr().getPreferredAddr()->getPlain() for (TNeighborInfoLst::iterator it=Neighbors.begin(); it!=Neighbors.end(); ++it) { if ( (*it)->state != TNeighborInfo::NeighborInfoState_Added) continue; status = sendRemoteSolicit(*it) && status; (*it)->state = TNeighborInfo::NeighborInfoState_Sent; } return status; } bool TClntTransMgr::sendRemoteSolicit(SPtr neighbor) { Log(Debug) << "Sending remote Solicit to " << neighbor->srvAddr->getPlain() << LogEnd; SPtr iface; ClntCfgMgr().firstIface(); while( (iface=ClntCfgMgr().getIface()) ) { if (iface->getID() == neighbor->ifindex) break; } if (!iface) { Log(Error) << "Unable to find interface with ifindex=" << neighbor->ifindex << ". Remote solicit failed." << LogEnd; return false; } List(TClntCfgIA) iaLst; // list of IA requiring configuration SPtr cfgIA; iface->firstIA(); while (cfgIA=iface->getIA()) { iaLst.append(cfgIA); } // ignore TA & PD Log(Info) << "Creating remote SOLICIT to be transmitted to " << neighbor->srvAddr->getPlain() << LogEnd; SPtr ta; // use empty pointer List(TClntCfgPD) pdLst; // use empty list SPtr solicit = new TClntMsgSolicit(neighbor->ifindex, neighbor->srvAddr, iaLst, ta, pdLst, true /*rapid-commit */, true /* remote autoconf*/); neighbor->transid = solicit->getTransID(); Transactions.append(solicit); return true; } bool TClntTransMgr::processRemoteReply(SPtr reply) { Log(Debug) << "Processing remote REPLY to remote SOLICIT." << LogEnd; int xid = reply->getTransID(); SPtr neigh = neighborInfoGet(xid); if (!neigh) { Log(Error) << "Failed to match transmitted remote SOLICIT. Seems like bogus remote REPLY." << LogEnd; return false; } SPtr rpl = (Ptr*) reply; neigh->reply = reply; neigh->rcvdAddr = rpl->getFirstAddr(); neigh->state = TNeighborInfo::NeighborInfoState_Received; Transactions.first(); SPtr sol; while (sol = Transactions.get() ) { if (sol->getTransID() == neigh->transid) sol->isDone(true); } return ClntIfaceMgr().notifyRemoteScripts(neigh->rcvdAddr, neigh->srvAddr, reply->getIface() ); } #endif dibbler-1.0.1/ClntTransMgr/Makefile.in0000664000175000017500000005125712561652534014505 00000000000000# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = ClntTransMgr DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/depcomp ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/libtool.m4 \ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/include/dibbler-config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = LIBRARIES = $(noinst_LIBRARIES) ARFLAGS = cru AM_V_AR = $(am__v_AR_@AM_V@) am__v_AR_ = $(am__v_AR_@AM_DEFAULT_V@) am__v_AR_0 = @echo " AR " $@; am__v_AR_1 = libClntTransMgr_a_AR = $(AR) $(ARFLAGS) libClntTransMgr_a_LIBADD = am_libClntTransMgr_a_OBJECTS = \ libClntTransMgr_a-ClntTransMgr.$(OBJEXT) libClntTransMgr_a_OBJECTS = $(am_libClntTransMgr_a_OBJECTS) AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)/include depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) LTCXXCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CXXFLAGS) $(CXXFLAGS) AM_V_CXX = $(am__v_CXX_@AM_V@) am__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@) am__v_CXX_0 = @echo " CXX " $@; am__v_CXX_1 = CXXLD = $(CXX) CXXLINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \ $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CXXLD = $(am__v_CXXLD_@AM_V@) am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@) am__v_CXXLD_0 = @echo " CXXLD " $@; am__v_CXXLD_1 = COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(libClntTransMgr_a_SOURCES) DIST_SOURCES = $(libClntTransMgr_a_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALLOCA = @ALLOCA@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ ARCH = @ARCH@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ EXTRA_DIST_SUBDIRS = @EXTRA_DIST_SUBDIRS@ FGREP = @FGREP@ GREP = @GREP@ GTEST_INCLUDES = @GTEST_INCLUDES@ GTEST_LDADD = @GTEST_LDADD@ GTEST_LDFLAGS = @GTEST_LDFLAGS@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LINKPRINT = @LINKPRINT@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PORT_CFLAGS = @PORT_CFLAGS@ PORT_LDFLAGS = @PORT_LDFLAGS@ PORT_SUBDIR = @PORT_SUBDIR@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ subdirs = @subdirs@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ noinst_LIBRARIES = libClntTransMgr.a libClntTransMgr_a_CPPFLAGS = -I$(top_srcdir)/ClntCfgMgr \ -I$(top_srcdir)/CfgMgr -I$(top_srcdir)/Misc \ -I$(top_srcdir)/Options -I$(top_srcdir)/ClntOptions \ -I$(top_srcdir)/AddrMgr -I$(top_srcdir)/ClntAddrMgr \ -I$(top_srcdir)/ClntMessages -I$(top_srcdir)/Messages \ -I$(top_srcdir)/ClntIfaceMgr -I$(top_srcdir)/IfaceMgr libClntTransMgr_a_SOURCES = ClntTransMgr.cpp ClntTransMgr.h all: all-am .SUFFIXES: .SUFFIXES: .cpp .lo .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign ClntTransMgr/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign ClntTransMgr/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstLIBRARIES: -test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES) libClntTransMgr.a: $(libClntTransMgr_a_OBJECTS) $(libClntTransMgr_a_DEPENDENCIES) $(EXTRA_libClntTransMgr_a_DEPENDENCIES) $(AM_V_at)-rm -f libClntTransMgr.a $(AM_V_AR)$(libClntTransMgr_a_AR) libClntTransMgr.a $(libClntTransMgr_a_OBJECTS) $(libClntTransMgr_a_LIBADD) $(AM_V_at)$(RANLIB) libClntTransMgr.a mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libClntTransMgr_a-ClntTransMgr.Po@am__quote@ .cpp.o: @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $< .cpp.obj: @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .cpp.lo: @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LTCXXCOMPILE) -c -o $@ $< libClntTransMgr_a-ClntTransMgr.o: ClntTransMgr.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libClntTransMgr_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libClntTransMgr_a-ClntTransMgr.o -MD -MP -MF $(DEPDIR)/libClntTransMgr_a-ClntTransMgr.Tpo -c -o libClntTransMgr_a-ClntTransMgr.o `test -f 'ClntTransMgr.cpp' || echo '$(srcdir)/'`ClntTransMgr.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libClntTransMgr_a-ClntTransMgr.Tpo $(DEPDIR)/libClntTransMgr_a-ClntTransMgr.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='ClntTransMgr.cpp' object='libClntTransMgr_a-ClntTransMgr.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libClntTransMgr_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libClntTransMgr_a-ClntTransMgr.o `test -f 'ClntTransMgr.cpp' || echo '$(srcdir)/'`ClntTransMgr.cpp libClntTransMgr_a-ClntTransMgr.obj: ClntTransMgr.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libClntTransMgr_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libClntTransMgr_a-ClntTransMgr.obj -MD -MP -MF $(DEPDIR)/libClntTransMgr_a-ClntTransMgr.Tpo -c -o libClntTransMgr_a-ClntTransMgr.obj `if test -f 'ClntTransMgr.cpp'; then $(CYGPATH_W) 'ClntTransMgr.cpp'; else $(CYGPATH_W) '$(srcdir)/ClntTransMgr.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libClntTransMgr_a-ClntTransMgr.Tpo $(DEPDIR)/libClntTransMgr_a-ClntTransMgr.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='ClntTransMgr.cpp' object='libClntTransMgr_a-ClntTransMgr.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libClntTransMgr_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libClntTransMgr_a-ClntTransMgr.obj `if test -f 'ClntTransMgr.cpp'; then $(CYGPATH_W) 'ClntTransMgr.cpp'; else $(CYGPATH_W) '$(srcdir)/ClntTransMgr.cpp'; fi` mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LIBRARIES) installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool clean-noinstLIBRARIES \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \ clean-libtool clean-noinstLIBRARIES cscopelist-am ctags \ ctags-am distclean distclean-compile distclean-generic \ distclean-libtool distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-dvi install-dvi-am install-exec \ install-exec-am install-html install-html-am install-info \ install-info-am install-man install-pdf install-pdf-am \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ tags tags-am uninstall uninstall-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: dibbler-1.0.1/Port-linux/0000775000175000017500000000000012561700416012202 500000000000000dibbler-1.0.1/Port-linux/interface.h0000664000175000017500000000257512233256142014242 00000000000000#ifndef INTERFACE_H #define INTERFACE_H /* * This file is part of ifplugd. * * ifplugd 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. * * ifplugd 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 ifplugd; if not, write to the Free Software Foundation, * Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ #ifdef __cplusplus extern "C" { #endif int interface_auto_up; int interface_do_message; typedef enum { IFSTATUS_UP, IFSTATUS_DOWN, IFSTATUS_ERR } interface_status_t; void interface_up(int fd, const char *iface); /* interface_status_t interface_detect_beat_mii(int fd, char *iface); */ /* interface_status_t interface_detect_beat_priv(int fd, char *iface); */ interface_status_t interface_detect_beat_ethtool(int fd, const char *iface); /* interface_status_t interface_detect_beat_wlan(int fd, char *iface); */ interface_status_t interface_detect_beat_iff(int fd, const char *iface); #ifdef __cplusplus } #endif #endif dibbler-1.0.1/Port-linux/ll_map.h0000664000175000017500000000073112233256142013536 00000000000000#ifndef __LL_MAP_H__ #define __LL_MAP_H__ 1 extern int ll_remember_index(const struct sockaddr_nl *who, struct nlmsghdr *n, void *arg); extern int ll_init_map(struct rtnl_handle *rth); extern unsigned ll_name_to_index(const char *name); extern const char *ll_index_to_name(unsigned idx); extern const char *ll_idx_n2a(unsigned idx, char *buf); extern int ll_index_to_type(unsigned idx); extern unsigned ll_index_to_flags(unsigned idx); #endif /* __LL_MAP_H__ */ dibbler-1.0.1/Port-linux/rt_names.h0000664000175000017500000000167612233256142014113 00000000000000#ifndef RT_NAMES_H_ #define RT_NAMES_H_ 1 #include char* rtnl_rtprot_n2a(int id, char *buf, int len); char* rtnl_rtscope_n2a(int id, char *buf, int len); char* rtnl_rttable_n2a(int id, char *buf, int len); char* rtnl_rtrealm_n2a(int id, char *buf, int len); char* rtnl_dsfield_n2a(int id, char *buf, int len); int rtnl_rtprot_a2n(__u32 *id, char *arg); int rtnl_rtscope_a2n(__u32 *id, char *arg); int rtnl_rttable_a2n(__u32 *id, char *arg); int rtnl_rtrealm_a2n(__u32 *id, char *arg); int rtnl_dsfield_a2n(__u32 *id, char *arg); const char *inet_proto_n2a(int proto, char *buf, int len); int inet_proto_a2n(char *buf); const char * ll_type_n2a(int type, char *buf, int len); const char *ll_addr_n2a(unsigned char *addr, int alen, int type, char *buf, int blen); int ll_addr_a2n(char *lladdr, int len, char *arg); const char * ll_proto_n2a(unsigned short id, char *buf, int len); int ll_proto_a2n(unsigned short *id, char *buf); #endif dibbler-1.0.1/Port-linux/utils.h0000664000175000017500000000676012233256142013442 00000000000000#ifndef __UTILS_H__ #define __UTILS_H__ 1 #include //#include #include #include "libnetlink.h" #include "ll_map.h" #include "rtm_map.h" extern int preferred_family; extern int show_stats; extern int show_details; extern int show_raw; extern int resolve_hosts; extern int oneline; extern int timestamp; extern char * _SL_; #ifndef IPPROTO_ESP #define IPPROTO_ESP 50 #endif #ifndef IPPROTO_AH #define IPPROTO_AH 51 #endif #ifndef IPPROTO_COMP #define IPPROTO_COMP 108 #endif #ifndef IPSEC_PROTO_ANY #define IPSEC_PROTO_ANY 255 #endif #define SPRINT_BSIZE 64 #define SPRINT_BUF(x) char x[SPRINT_BSIZE] extern void incomplete_command(void) __attribute__((noreturn)); #define NEXT_ARG() do { argv++; if (--argc <= 0) incomplete_command(); } while(0) #define NEXT_ARG_OK() (argc - 1 > 0) #define PREV_ARG() do { argv--; argc++; } while(0) typedef struct { __u8 family; __u8 bytelen; __s16 bitlen; __u32 flags; __u32 data[4]; } inet_prefix; #define PREFIXLEN_SPECIFIED 1 #define DN_MAXADDL 20 #ifndef AF_DECnet #define AF_DECnet 12 #endif struct dn_naddr { unsigned short a_len; unsigned char a_addr[DN_MAXADDL]; }; #define IPX_NODE_LEN 6 struct ipx_addr { u_int32_t ipx_net; u_int8_t ipx_node[IPX_NODE_LEN]; }; extern __u32 get_addr32(const char *name); extern int get_addr_1(inet_prefix *dst, const char *arg, int family); extern int get_prefix_1(inet_prefix *dst, char *arg, int family); extern int get_addr(inet_prefix *dst, const char *arg, int family); extern int get_prefix(inet_prefix *dst, char *arg, int family); extern int get_integer(int *val, const char *arg, int base); extern int get_unsigned(unsigned *val, const char *arg, int base); #define get_byte get_u8 #define get_ushort get_u16 #define get_short get_s16 extern int get_u32(__u32 *val, const char *arg, int base); extern int get_u16(__u16 *val, const char *arg, int base); extern int get_s16(__s16 *val, const char *arg, int base); extern int get_u8(__u8 *val, const char *arg, int base); extern int get_s8(__s8 *val, const char *arg, int base); extern char* hexstring_n2a(const __u8 *str, int len, char *buf, int blen); extern __u8* hexstring_a2n(const char *str, __u8 *buf, int blen); extern const char *format_host(int af, int len, const void *addr, char *buf, int buflen); extern const char *rt_addr_n2a(int af, int len, const void *addr, char *buf, int buflen); void missarg(const char *) __attribute__((noreturn)); void invarg(const char *, const char *) __attribute__((noreturn)); void duparg(const char *, const char *) __attribute__((noreturn)); void duparg2(const char *, const char *) __attribute__((noreturn)); int matches(const char *arg, const char *pattern); extern int inet_addr_match(const inet_prefix *a, const inet_prefix *b, int bits); const char *dnet_ntop(int af, const void *addr, char *str, size_t len); int dnet_pton(int af, const char *src, void *addr); const char *ipx_ntop(int af, const void *addr, char *str, size_t len); int ipx_pton(int af, const char *src, void *addr); extern int __iproute2_hz_internal; static __inline__ int get_hz(void) { return 1000; } extern int __iproute2_user_hz_internal; extern int __get_user_hz(void); static __inline__ int get_user_hz(void) { return 1000; } int print_timestamp(FILE *fp); #define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0])) extern int cmdlineno; extern size_t getcmdline(char **line, size_t *len, FILE *in); extern int makeargs(char *line, char *argv[], int maxargs); #endif /* __UTILS_H__ */ dibbler-1.0.1/Port-linux/dibbler-relay.cpp0000664000175000017500000000604212474402332015344 00000000000000/* * Dibbler - a portable DHCPv6 * * authors: Tomasz Mrugalski * * released under GNU GPL v2 only licence * */ #include #include #include #include "DHCPRelay.h" #include "Portable.h" #include "Logger.h" #include "daemon.h" using namespace std; TDHCPRelay * ptr = 0; /// the default working directory std::string WORKDIR(DEFAULT_WORKDIR); void signal_handler(int n) { Log(Crit) << "Signal received. Shutting down." << LogEnd; ptr->stop(); } int status() { pid_t pid = getServerPID(); if (pid==-1) { cout << "Dibbler server: NOT RUNNING." << endl; } else { cout << "Dibbler server: RUNNING, pid=" << pid << endl; } pid = getClientPID(); if (pid==-1) { cout << "Dibbler client: NOT RUNNING." << endl; } else { cout << "Dibbler client: RUNNING, pid=" << pid << endl; } pid = getRelayPID(); if (pid==-1) { cout << "Dibbler relay : NOT RUNNING." << endl; } else { cout << "Dibbler relay : RUNNING, pid=" << pid << endl; } return (pid>0)? 0: -1; } int run() { if (!init(RELPID_FILE, WORKDIR.c_str())) { die(RELPID_FILE); return -1; } TDHCPRelay relay(RELCONF_FILE); ptr = &relay; if (ptr->isDone()) { die(RELPID_FILE); return -1; } // connect signals signal(SIGTERM, signal_handler); signal(SIGINT, signal_handler); ptr->run(); die(RELPID_FILE); return 0; } int help() { cout << "Usage:" << endl; cout << " dibbler-relay ACTION" << endl << " ACTION = status|start|stop|install|uninstall|run" << endl << " status - show status and exit" << endl << " start - start installed service" << endl << " stop - stop installed service" << endl << " install - Not available in Linux/Unix systems." << endl << " uninstall - Not available in Linux/Unix systems." << endl << " run - run in the console" << endl << " help - displays usage info." << endl; return 0; } int main(int argc, char * argv[]) { char command[256]; int result=-1; logStart("(RELAY, Linux port)", "Relay", RELLOG_FILE); // parse command line parameters if (argc>1) { int len = strlen(argv[1])+1; if (len > 255) len = 255; strncpy(command, argv[1], len); } else { memset(command,0,256); } if (!strncasecmp(command,"start",5) ) { result = start(RELPID_FILE, WORKDIR.c_str()); } else if (!strncasecmp(command,"run",3) ) { result = run(); } else if (!strncasecmp(command,"stop",4)) { result = stop(RELPID_FILE); } else if (!strncasecmp(command,"status",6)) { result = status(); } else if (!strncasecmp(command,"help",4)) { result = help(); } else if (!strncasecmp(command,"install",7)) { cout << "Function not available in Linux/Unix systems." << endl; result = 0; } else if (!strncasecmp(command,"uninstall",9)) { cout << "Function not available in Linux/Unix systems." << endl; result = 0; } else { help(); } logEnd(); return result? EXIT_FAILURE: EXIT_SUCCESS; } dibbler-1.0.1/Port-linux/utils.c0000644000175000017500000002604612277722750013445 00000000000000/* * utils.c * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version * 2 of the License, or (at your option) any later version. * * Authors: Alexey Kuznetsov, * * * Changes: * * Rani Assaf 980929: resolve addresses */ #define _GNU_SOURCE #define _XOPEN_SOURCE 700 #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "utils.h" int get_integer(int *val, const char *arg, int base) { long res; char *ptr; if (!arg || !*arg) return -1; res = strtol(arg, &ptr, base); if (!ptr || ptr == arg || *ptr || res > INT_MAX || res < INT_MIN) return -1; *val = res; return 0; } int get_unsigned(unsigned *val, const char *arg, int base) { unsigned long res; char *ptr; if (!arg || !*arg) return -1; res = strtoul(arg, &ptr, base); if (!ptr || ptr == arg || *ptr || res > UINT_MAX) return -1; *val = res; return 0; } int get_u32(__u32 *val, const char *arg, int base) { unsigned long res; char *ptr; if (!arg || !*arg) return -1; res = strtoul(arg, &ptr, base); if (!ptr || ptr == arg || *ptr || res > 0xFFFFFFFFUL) return -1; *val = res; return 0; } int get_u16(__u16 *val, const char *arg, int base) { unsigned long res; char *ptr; if (!arg || !*arg) return -1; res = strtoul(arg, &ptr, base); if (!ptr || ptr == arg || *ptr || res > 0xFFFF) return -1; *val = res; return 0; } int get_u8(__u8 *val, const char *arg, int base) { unsigned long res; char *ptr; if (!arg || !*arg) return -1; res = strtoul(arg, &ptr, base); if (!ptr || ptr == arg || *ptr || res > 0xFF) return -1; *val = res; return 0; } int get_s16(__s16 *val, const char *arg, int base) { long res; char *ptr; if (!arg || !*arg) return -1; res = strtol(arg, &ptr, base); if (!ptr || ptr == arg || *ptr || res > 0x7FFF || res < -0x8000) return -1; *val = res; return 0; } int get_s8(__s8 *val, const char *arg, int base) { long res; char *ptr; if (!arg || !*arg) return -1; res = strtol(arg, &ptr, base); if (!ptr || ptr == arg || *ptr || res > 0x7F || res < -0x80) return -1; *val = res; return 0; } int get_addr_1(inet_prefix *addr, const char *name, int family) { const char *cp; unsigned char *ap = (unsigned char*)addr->data; int i; memset(addr, 0, sizeof(*addr)); if (strcmp(name, "default") == 0 || strcmp(name, "all") == 0 || strcmp(name, "any") == 0) { if (family == AF_DECnet) return -1; addr->family = family; addr->bytelen = (family == AF_INET6 ? 16 : 4); addr->bitlen = -1; return 0; } if (strchr(name, ':')) { addr->family = AF_INET6; if (family != AF_UNSPEC && family != AF_INET6) return -1; if (inet_pton(AF_INET6, name, addr->data) <= 0) return -1; addr->bytelen = 16; addr->bitlen = -1; return 0; } if (family == AF_DECnet) { struct dn_naddr dna; addr->family = AF_DECnet; if (dnet_pton(AF_DECnet, name, &dna) <= 0) return -1; memcpy(addr->data, dna.a_addr, 2); addr->bytelen = 2; addr->bitlen = -1; return 0; } addr->family = AF_INET; if (family != AF_UNSPEC && family != AF_INET) return -1; addr->bytelen = 4; addr->bitlen = -1; for (cp=name, i=0; *cp; cp++) { if (*cp <= '9' && *cp >= '0') { ap[i] = 10*ap[i] + (*cp-'0'); continue; } if (*cp == '.' && ++i <= 3) continue; return -1; } return 0; } int get_prefix_1(inet_prefix *dst, char *arg, int family) { int err; unsigned plen; char *slash; memset(dst, 0, sizeof(*dst)); if (strcmp(arg, "default") == 0 || strcmp(arg, "any") == 0 || strcmp(arg, "all") == 0) { if (family == AF_DECnet) return -1; dst->family = family; dst->bytelen = 0; dst->bitlen = 0; return 0; } slash = strchr(arg, '/'); if (slash) *slash = 0; err = get_addr_1(dst, arg, family); if (err == 0) { switch(dst->family) { case AF_INET6: dst->bitlen = 128; break; case AF_DECnet: dst->bitlen = 16; break; default: case AF_INET: dst->bitlen = 32; } if (slash) { if (get_unsigned(&plen, slash+1, 0) || plen > dst->bitlen) { err = -1; goto done; } dst->flags |= PREFIXLEN_SPECIFIED; dst->bitlen = plen; } } done: if (slash) *slash = '/'; return err; } int get_addr(inet_prefix *dst, const char *arg, int family) { if (family == AF_PACKET) { fprintf(stderr, "Error: \"%s\" may be inet address, but it is not allowed in this context.\n", arg); exit(1); } if (get_addr_1(dst, arg, family)) { fprintf(stderr, "Error: an inet address is expected rather than \"%s\".\n", arg); exit(1); } return 0; } int get_prefix(inet_prefix *dst, char *arg, int family) { if (family == AF_PACKET) { fprintf(stderr, "Error: \"%s\" may be inet prefix, but it is not allowed in this context.\n", arg); exit(1); } if (get_prefix_1(dst, arg, family)) { fprintf(stderr, "Error: an inet prefix is expected rather than \"%s\".\n", arg); exit(1); } return 0; } __u32 get_addr32(const char *name) { inet_prefix addr; if (get_addr_1(&addr, name, AF_INET)) { fprintf(stderr, "Error: an IP address is expected rather than \"%s\"\n", name); exit(1); } return addr.data[0]; } void incomplete_command(void) { fprintf(stderr, "Command line is not complete. Try option \"help\"\n"); exit(-1); } void missarg(const char *key) { fprintf(stderr, "Error: argument \"%s\" is required\n", key); exit(-1); } void invarg(const char *msg, const char *arg) { fprintf(stderr, "Error: argument \"%s\" is wrong: %s\n", arg, msg); exit(-1); } void duparg(const char *key, const char *arg) { fprintf(stderr, "Error: duplicate \"%s\": \"%s\" is the second value.\n", key, arg); exit(-1); } void duparg2(const char *key, const char *arg) { fprintf(stderr, "Error: either \"%s\" is duplicate, or \"%s\" is a garbage.\n", key, arg); exit(-1); } int matches(const char *cmd, const char *pattern) { int len = strlen(cmd); if (len > strlen(pattern)) return -1; return memcmp(pattern, cmd, len); } int inet_addr_match(const inet_prefix *a, const inet_prefix *b, int bits) { __u32 *a1 = (__u32*)a->data; __u32 *a2 = (__u32*)b->data; int words = bits >> 0x05; bits &= 0x1f; if (words) if (memcmp(a1, a2, words << 2)) return -1; if (bits) { __u32 w1, w2; __u32 mask; w1 = a1[words]; w2 = a2[words]; mask = htonl((0xffffffff) << (0x20 - bits)); if ((w1 ^ w2) & mask) return 1; } return 0; } int __iproute2_hz_internal; int __iproute2_user_hz_internal; const char *rt_addr_n2a(int af, int len, const void *addr, char *buf, int buflen) { switch (af) { case AF_INET: case AF_INET6: return inet_ntop(af, addr, buf, buflen); case AF_IPX: return ipx_ntop(af, addr, buf, buflen); case AF_DECnet: { struct dn_naddr dna = { 2, { 0, 0, }}; memcpy(dna.a_addr, addr, 2); return dnet_ntop(af, &dna, buf, buflen); } default: return "???"; } } #ifdef RESOLVE_HOSTNAMES struct namerec { struct namerec *next; inet_prefix addr; char *name; }; static struct namerec *nht[256]; char *resolve_address(const char *addr, int len, int af) { struct namerec *n; struct hostent *h_ent; unsigned hash; static int notfirst; if (af == AF_INET6 && ((__u32*)addr)[0] == 0 && ((__u32*)addr)[1] == 0 && ((__u32*)addr)[2] == htonl(0xffff)) { af = AF_INET; addr += 12; len = 4; } hash = addr[len-1] ^ addr[len-2] ^ addr[len-3] ^ addr[len-4]; for (n = nht[hash]; n; n = n->next) { if (n->addr.family == af && n->addr.bytelen == len && memcmp(n->addr.data, addr, len) == 0) return n->name; } if ((n = malloc(sizeof(*n))) == NULL) return NULL; n->addr.family = af; n->addr.bytelen = len; n->name = NULL; memcpy(n->addr.data, addr, len); n->next = nht[hash]; nht[hash] = n; if (++notfirst == 1) sethostent(1); fflush(stdout); if ((h_ent = gethostbyaddr(addr, len, af)) != NULL) n->name = strdup(h_ent->h_name); /* Even if we fail, "negative" entry is remembered. */ return n->name; } #endif const char *format_host(int af, int len, const void *addr, char *buf, int buflen) { #ifdef RESOLVE_HOSTNAMES if (resolve_hosts) { char *n; if (len <= 0) { switch (af) { case AF_INET: len = 4; break; case AF_INET6: len = 16; break; case AF_IPX: len = 10; break; #ifdef AF_DECnet /* I see no reasons why gethostbyname may not work for DECnet */ case AF_DECnet: len = 2; break; #endif default: ; } } if (len > 0 && (n = resolve_address(addr, len, af)) != NULL) return n; } #endif return rt_addr_n2a(af, len, addr, buf, buflen); } char *hexstring_n2a(const __u8 *str, int len, char *buf, int blen) { char *ptr = buf; int i; for (i=0; i 1) { *ptr++ = ':'; blen--; } } return buf; } __u8* hexstring_a2n(const char *str, __u8 *buf, int blen) { int cnt = 0; for (;;) { unsigned acc; char ch; acc = 0; while ((ch = *str) != ':' && ch != 0) { if (ch >= '0' && ch <= '9') ch -= '0'; else if (ch >= 'a' && ch <= 'f') ch -= 'a'-10; else if (ch >= 'A' && ch <= 'F') ch -= 'A'-10; else return NULL; acc = (acc<<4) + ch; str++; } if (acc > 255) return NULL; if (cnt < blen) { buf[cnt] = acc; cnt++; } if (ch == 0) break; ++str; } if (cnt < blen) memset(buf+cnt, 0, blen-cnt); return buf; } int print_timestamp(FILE *fp) { struct timeval tv; char *tstr; memset(&tv, 0, sizeof(tv)); gettimeofday(&tv, NULL); tstr = asctime(localtime(&tv.tv_sec)); tstr[strlen(tstr)-1] = 0; fprintf(fp, "Timestamp: %s %lu usec\n", tstr, tv.tv_usec); return 0; } int cmdlineno; /* Like glibc getline but handle continuation lines and comments */ size_t getcmdline(char **linep, size_t *lenp, FILE *in) { ssize_t cc; char *cp; if ((cc = getline(linep, lenp, in)) < 0) return cc; /* eof or error */ ++cmdlineno; cp = strchr(*linep, '#'); if (cp) *cp = '\0'; while ((cp = strstr(*linep, "\\\n")) != NULL) { char *line1 = NULL; size_t len1 = 0; size_t cc1; if ((cc1 = getline(&line1, &len1, in)) < 0) { fprintf(stderr, "Missing continuation line\n"); return cc1; } ++cmdlineno; *cp = 0; cp = strchr(line1, '#'); if (cp) *cp = '\0'; *linep = realloc(*linep, strlen(*linep) + strlen(line1) + 1); if (!*linep) { fprintf(stderr, "Out of memory\n"); return -1; } cc += cc1 - 2; strcat(*linep, line1); free(line1); } return cc; } /* split command line into argument vector */ int makeargs(char *line, char *argv[], int maxargs) { static const char ws[] = " \t\r\n"; char *cp; int argc = 0; for (cp = strtok(line, ws); cp; cp = strtok(NULL, ws)) { if (argc >= (maxargs - 1)) { fprintf(stderr, "Too many arguments to command\n"); exit(1); } argv[argc++] = cp; } argv[argc] = NULL; return argc; } dibbler-1.0.1/Port-linux/lowlevel-linux-link-state.c0000644000175000017500000001374212277722750017343 00000000000000/* * Dibbler - a portable DHCPv6 * * authors: Tomasz Mrugalski * * Released under GNU GPL v2 licence * */ #ifdef MOD_CLNT_CONFIRM #define __USE_UNIX98 #include #include #include #include #include #include #include #include #include "Portable.h" #include "interface.h" #define IF_RECONNECTED_DETECTED -1 int report_link_state(const char* iface); volatile struct link_state_notify_t * changed_links = 0; volatile int * notifier = 0; int isDone = 0; pthread_t parent_id; pthread_t ntid; pthread_mutex_t lock; struct state { int id; int stat; struct state* next; }; struct state* states = NULL; int getStateById(int id){ struct state* item = states; struct state* new_state; for(;item!=NULL;item = item->next){ if(item->id==id) return item->stat; } new_state = malloc(sizeof(struct state)); new_state->id = id; new_state->stat = 1; new_state->next = states; states = new_state; return new_state->stat; } void setStateById(int id,int stat){ struct state* item = states; struct state* new_state; for(;item!=NULL;item = item->next){ if(item->id==id){ item->stat = stat; return; } } new_state = malloc(sizeof(struct state)); new_state->id = id; new_state->stat = stat; new_state->next = states; states = new_state; } /** * this function should be called when interface link state change is detected * * @param ifindex index of the changed interface */ void link_state_changed(int ifindex) { if (changed_links) { if (changed_links->cnt<16) changed_links->ifindex[changed_links->cnt++] = ifindex; pthread_mutex_lock(&lock); *notifier = 1; /* notify that change has occured */ pthread_mutex_unlock(&lock); pthread_kill(parent_id,SIGUSR1); } else { printf("Error: link state change detected, but notification system not initiated properly\n"); /* link_state_change_init() should have been called in advance */ } } void * checkLinkState(void * ptr){ struct iface * head = (struct iface *)ptr; while(!isDone){ struct iface * item = head; for(;item!=NULL;item = item->next){ int old_r = item->link_state; int new_r = report_link_state(item->name); if (new_r - old_r == IF_RECONNECTED_DETECTED){ link_state_changed(item->id); } item->link_state = new_r; } /* printf("."); */ sleep(1); } /* if_list_release(head); */ /* printf("Finishing link-state change\n"); */ /* pthread_exit(NULL); */ return NULL; } /** * removes intefaces that are not to be monitored from the list * * @param head * @param monitored_links * * @return */ struct iface * filter_if_list(struct iface *head, volatile struct link_state_notify_t * monitored_links) { struct iface * out = NULL; struct iface * tmp = NULL; int i; while (head!=NULL) { int copy = 0; for (i=0; icnt; i++) { if (head->id == monitored_links->ifindex[i]) { copy = 1; } } if (copy) { tmp = head; head = head->next; tmp->next = out; out = tmp; } else { tmp = head; head = head->next; tmp->next = 0; if_list_release(tmp); } } return out; } /** * begin monitoring of those interfaces * * @param monitored_links head of the monitored links list * @param notify pointer to variable that is going to be modifed if change is detected */ void link_state_change_init(volatile struct link_state_notify_t * monitored_links, volatile int * notify) { struct iface * ifacesLst; int err; /* the same structure will be used for notifying about link-state change */ notifier = notify; changed_links = monitored_links; parent_id = pthread_self(); /** @todo Add actual monitoring here (spawn extra thread or install some handlers, etc.) */ ifacesLst = if_list_get(); ifacesLst = filter_if_list(ifacesLst, monitored_links); /* uncomment this section to get information regarding interfaces to be monitored */ /* int i=0; printf("About to start monitoring %d interfaces:", monitored_links->cnt); for (i=0; icnt; i++) printf(" %d", monitored_links->ifindex[i]); printf("\n"); */ err = pthread_create(&ntid, NULL, checkLinkState, (void*)ifacesLst); if (err !=0 ){ printf("process create fail in dibbler/Port-linux/lowlevel-linux-link-state.c."); return ; } } /** * cleanup code for link state monitoring * */ void link_state_change_cleanup() { isDone = 1; } int report_link_state(const char* iface) { int fd, r = 0; interface_status_t s; if ((fd = socket(PF_INET, SOCK_DGRAM, 0)) < 0) { printf("Socket create failed\n"); return -1; } /* here just to make it more convenient for testing:if we define DEBUG,so a plugin-out and plugin-in event * will be detected if we do "ifconfig interface-name down" and ifconfig interface-name up".Otherwise, * if we do not define DEBUG, a plugin-in and plugin-out event can only be detected when the local link * plugin in and out. Skip this comment if you did not catch it. */ /* #define DEBUG*/ #if 0 if ((s = interface_detect_beat_ethtool(fd, iface)) == IFSTATUS_ERR) { printf(" SIOCETHTOOL failed (%s)\n", strerror(errno)); close(fd); return -1; } #else if ((s = interface_detect_beat_iff(fd,iface)) == IFSTATUS_ERR) { printf(" IFF_RUNNING failed (%s)\n", strerror(errno)); close(fd); return -1; } #endif switch(s) { case IFSTATUS_UP: /* link beat detected */ r = 1; break; case IFSTATUS_DOWN: /* unplugged */ r = 2; break; default: /* not supported (Retry as root?)*/ r = -1; break; } close(fd); return r; } #else /* just a dummy code to not cause link failures */ void link_state_change_init(volatile struct link_state_notify_t * monitored_links, volatile int * notify) { } #endif dibbler-1.0.1/Port-linux/ll_map.c0000644000175000017500000000637012277722750013547 00000000000000/* * ll_map.c * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version * 2 of the License, or (at your option) any later version. * * Authors: Alexey Kuznetsov, * */ #include #include #include #include #include #include #include #include #include #include "libnetlink.h" #include "ll_map.h" struct idxmap { struct idxmap * next; unsigned index; int type; int alen; unsigned flags; unsigned char addr[8]; char name[16]; }; static struct idxmap *idxmap[16]; int ll_remember_index(const struct sockaddr_nl *who, struct nlmsghdr *n, void *arg) { int h; struct ifinfomsg *ifi = NLMSG_DATA(n); struct idxmap *im, **imp; struct rtattr *tb[IFLA_MAX+1]; if (n->nlmsg_type != RTM_NEWLINK) return 0; if (n->nlmsg_len < NLMSG_LENGTH(sizeof(ifi))) return -1; memset(tb, 0, sizeof(*tb)); parse_rtattr(tb, IFLA_MAX, IFLA_RTA(ifi), IFLA_PAYLOAD(n)); if (tb[IFLA_IFNAME] == NULL) return 0; h = ifi->ifi_index&0xF; for (imp=&idxmap[h]; (im=*imp)!=NULL; imp = &im->next) if (im->index == ifi->ifi_index) break; if (im == NULL) { im = malloc(sizeof(*im)); if (im == NULL) return 0; im->next = *imp; im->index = ifi->ifi_index; *imp = im; } im->type = ifi->ifi_type; im->flags = ifi->ifi_flags; if (tb[IFLA_ADDRESS]) { int alen; im->alen = alen = RTA_PAYLOAD(tb[IFLA_ADDRESS]); if (alen > sizeof(im->addr)) alen = sizeof(im->addr); memcpy(im->addr, RTA_DATA(tb[IFLA_ADDRESS]), alen); } else { im->alen = 0; memset(im->addr, 0, sizeof(im->addr)); } strcpy(im->name, RTA_DATA(tb[IFLA_IFNAME])); return 0; } const char *ll_idx_n2a(unsigned idx, char *buf) { struct idxmap *im; if (idx == 0) return "*"; for (im = idxmap[idx&0xF]; im; im = im->next) if (im->index == idx) return im->name; snprintf(buf, 16, "if%u", idx); return buf; } const char *ll_index_to_name(unsigned idx) { static char nbuf[16]; return ll_idx_n2a(idx, nbuf); } int ll_index_to_type(unsigned idx) { struct idxmap *im; if (idx == 0) return -1; for (im = idxmap[idx&0xF]; im; im = im->next) if (im->index == idx) return im->type; return -1; } unsigned ll_index_to_flags(unsigned idx) { struct idxmap *im; if (idx == 0) return 0; for (im = idxmap[idx&0xF]; im; im = im->next) if (im->index == idx) return im->flags; return 0; } unsigned ll_name_to_index(const char *name) { static char ncache[16]; static int icache; struct idxmap *im; int i; if (name == NULL) return 0; if (icache && strcmp(name, ncache) == 0) return icache; for (i=0; i<16; i++) { for (im = idxmap[i]; im; im = im->next) { if (strcmp(im->name, name) == 0) { icache = im->index; strcpy(ncache, name); return im->index; } } } return if_nametoindex(name); } int ll_init_map(struct rtnl_handle *rth) { if (rtnl_wilddump_request(rth, AF_UNSPEC, RTM_GETLINK) < 0) { perror("Cannot send dump request"); exit(1); } if (rtnl_dump_filter(rth, ll_remember_index, &idxmap, NULL, NULL) < 0) { fprintf(stderr, "Dump terminated\n"); exit(1); } return 0; } dibbler-1.0.1/Port-linux/iproute.c0000644000175000017500000011635212437705662013775 00000000000000/* * iproute.c "ip route". * * 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. * * Authors: Alexey Kuznetsov, * * * Changes: * * Rani Assaf 980929: resolve addresses * Kunihiro Ishiguro 001102: rtnh_ifindex was not initialized */ #include #include #include #include #include #include #include #include #include #include #include #include #include /* #include */ #include "rt_names.h" #include "utils.h" #include "ip_common.h" #ifndef RTAX_RTTVAR #define RTAX_RTTVAR RTAX_HOPS #endif static void usage(void) __attribute__((noreturn)); static void usage(void) { fprintf(stderr, "Usage: ip route { list | flush } SELECTOR\n"); fprintf(stderr, " ip route get ADDRESS [ from ADDRESS iif STRING ]\n"); fprintf(stderr, " [ oif STRING ] [ tos TOS ]\n"); fprintf(stderr, " ip route { add | del | change | append | replace | monitor } ROUTE\n"); fprintf(stderr, "SELECTOR := [ root PREFIX ] [ match PREFIX ] [ exact PREFIX ]\n"); fprintf(stderr, " [ table TABLE_ID ] [ proto RTPROTO ]\n"); fprintf(stderr, " [ type TYPE ] [ scope SCOPE ]\n"); fprintf(stderr, "ROUTE := NODE_SPEC [ INFO_SPEC ]\n"); fprintf(stderr, "NODE_SPEC := [ TYPE ] PREFIX [ tos TOS ]\n"); fprintf(stderr, " [ table TABLE_ID ] [ proto RTPROTO ]\n"); fprintf(stderr, " [ scope SCOPE ] [ metric METRIC ]\n"); fprintf(stderr, " [ mpath MP_ALGO ]\n"); fprintf(stderr, "INFO_SPEC := NH OPTIONS FLAGS [ nexthop NH ]...\n"); fprintf(stderr, "NH := [ via ADDRESS ] [ dev STRING ] [ weight NUMBER ] NHFLAGS\n"); fprintf(stderr, "OPTIONS := FLAGS [ mtu NUMBER ] [ advmss NUMBER ]\n"); fprintf(stderr, " [ rtt NUMBER ] [ rttvar NUMBER ]\n"); fprintf(stderr, " [ window NUMBER] [ cwnd NUMBER ] [ ssthresh NUMBER ]\n"); fprintf(stderr, " [ realms REALM ]\n"); fprintf(stderr, "TYPE := [ unicast | local | broadcast | multicast | throw |\n"); fprintf(stderr, " unreachable | prohibit | blackhole | nat ]\n"); fprintf(stderr, "TABLE_ID := [ local | main | default | all | NUMBER ]\n"); fprintf(stderr, "SCOPE := [ host | link | global | NUMBER ]\n"); fprintf(stderr, "FLAGS := [ equalize ]\n"); fprintf(stderr, "MP_ALGO := { rr | drr | random | wrandom }\n"); fprintf(stderr, "NHFLAGS := [ onlink | pervasive ]\n"); fprintf(stderr, "RTPROTO := [ kernel | boot | static | NUMBER ]\n"); exit(-1); } static struct { int tb; int flushed; char *flushb; int flushp; int flushe; int protocol, protocolmask; int scope, scopemask; int type, typemask; int tos, tosmask; int iif, iifmask; int oif, oifmask; int realm, realmmask; inet_prefix rprefsrc; inet_prefix rvia; inet_prefix rdst; inet_prefix mdst; inet_prefix rsrc; inet_prefix msrc; } filter; #if 0 static char *mp_alg_names[IP_MP_ALG_MAX+1] = { [IP_MP_ALG_NONE] = "none", [IP_MP_ALG_RR] = "rr", [IP_MP_ALG_DRR] = "drr", [IP_MP_ALG_RANDOM] = "random", [IP_MP_ALG_WRANDOM] = "wrandom" }; #endif static int flush_update(void) { if (rtnl_send(&rth, filter.flushb, filter.flushp) < 0) { perror("Failed to send flush request\n"); return -1; } filter.flushp = 0; return 0; } int print_route(const struct sockaddr_nl *who, struct nlmsghdr *n, void *arg) { FILE *fp = (FILE*)arg; struct rtmsg *r = NLMSG_DATA(n); int len = n->nlmsg_len; struct rtattr * tb[RTA_MAX+1]; char abuf[256]; inet_prefix dst; inet_prefix src; inet_prefix prefsrc; inet_prefix via; int host_len = -1; SPRINT_BUF(b1); if (n->nlmsg_type != RTM_NEWROUTE && n->nlmsg_type != RTM_DELROUTE) { fprintf(stderr, "Not a route: %08x %08x %08x\n", n->nlmsg_len, n->nlmsg_type, n->nlmsg_flags); return 0; } if (filter.flushb && n->nlmsg_type != RTM_NEWROUTE) return 0; len -= NLMSG_LENGTH(sizeof(*r)); if (len < 0) { fprintf(stderr, "BUG: wrong nlmsg len %d\n", len); return -1; } if (r->rtm_family == AF_INET6) host_len = 128; else if (r->rtm_family == AF_INET) host_len = 32; else if (r->rtm_family == AF_DECnet) host_len = 16; else if (r->rtm_family == AF_IPX) host_len = 80; if (r->rtm_family == AF_INET6) { if (filter.tb) { if (filter.tb < 0) { if (!(r->rtm_flags&RTM_F_CLONED)) return 0; } else { if (r->rtm_flags&RTM_F_CLONED) return 0; if (filter.tb == RT_TABLE_LOCAL) { if (r->rtm_type != RTN_LOCAL) return 0; } else if (filter.tb == RT_TABLE_MAIN) { if (r->rtm_type == RTN_LOCAL) return 0; } else { return 0; } } } } else { if (filter.tb > 0 && filter.tb != r->rtm_table) return 0; } if ((filter.protocol^r->rtm_protocol)&filter.protocolmask) return 0; if ((filter.scope^r->rtm_scope)&filter.scopemask) return 0; if ((filter.type^r->rtm_type)&filter.typemask) return 0; if ((filter.tos^r->rtm_tos)&filter.tosmask) return 0; if (filter.rdst.family && (r->rtm_family != filter.rdst.family || filter.rdst.bitlen > r->rtm_dst_len)) return 0; if (filter.mdst.family && (r->rtm_family != filter.mdst.family || (filter.mdst.bitlen >= 0 && filter.mdst.bitlen < r->rtm_dst_len))) return 0; if (filter.rsrc.family && (r->rtm_family != filter.rsrc.family || filter.rsrc.bitlen > r->rtm_src_len)) return 0; if (filter.msrc.family && (r->rtm_family != filter.msrc.family || (filter.msrc.bitlen >= 0 && filter.msrc.bitlen < r->rtm_src_len))) return 0; if (filter.rvia.family && r->rtm_family != filter.rvia.family) return 0; if (filter.rprefsrc.family && r->rtm_family != filter.rprefsrc.family) return 0; parse_rtattr(tb, RTA_MAX, RTM_RTA(r), len); memset(&dst, 0, sizeof(dst)); dst.family = r->rtm_family; if (tb[RTA_DST]) memcpy(&dst.data, RTA_DATA(tb[RTA_DST]), (r->rtm_dst_len+7)/8); if (filter.rsrc.family || filter.msrc.family) { memset(&src, 0, sizeof(src)); src.family = r->rtm_family; if (tb[RTA_SRC]) memcpy(&src.data, RTA_DATA(tb[RTA_SRC]), (r->rtm_src_len+7)/8); } if (filter.rvia.bitlen>0) { memset(&via, 0, sizeof(via)); via.family = r->rtm_family; if (tb[RTA_GATEWAY]) memcpy(&via.data, RTA_DATA(tb[RTA_GATEWAY]), host_len); } if (filter.rprefsrc.bitlen>0) { memset(&prefsrc, 0, sizeof(prefsrc)); prefsrc.family = r->rtm_family; if (tb[RTA_PREFSRC]) memcpy(&prefsrc.data, RTA_DATA(tb[RTA_PREFSRC]), host_len); } if (filter.rdst.family && inet_addr_match(&dst, &filter.rdst, filter.rdst.bitlen)) return 0; if (filter.mdst.family && filter.mdst.bitlen >= 0 && inet_addr_match(&dst, &filter.mdst, r->rtm_dst_len)) return 0; if (filter.rsrc.family && inet_addr_match(&src, &filter.rsrc, filter.rsrc.bitlen)) return 0; if (filter.msrc.family && filter.msrc.bitlen >= 0 && inet_addr_match(&src, &filter.msrc, r->rtm_src_len)) return 0; if (filter.rvia.family && inet_addr_match(&via, &filter.rvia, filter.rvia.bitlen)) return 0; if (filter.rprefsrc.family && inet_addr_match(&prefsrc, &filter.rprefsrc, filter.rprefsrc.bitlen)) return 0; if (filter.realmmask) { __u32 realms = 0; if (tb[RTA_FLOW]) realms = *(__u32*)RTA_DATA(tb[RTA_FLOW]); if ((realms^filter.realm)&filter.realmmask) return 0; } if (filter.iifmask) { int iif = 0; if (tb[RTA_IIF]) iif = *(int*)RTA_DATA(tb[RTA_IIF]); if ((iif^filter.iif)&filter.iifmask) return 0; } if (filter.oifmask) { int oif = 0; if (tb[RTA_OIF]) oif = *(int*)RTA_DATA(tb[RTA_OIF]); if ((oif^filter.oif)&filter.oifmask) return 0; } if (filter.flushb && r->rtm_family == AF_INET6 && r->rtm_dst_len == 0 && r->rtm_type == RTN_UNREACHABLE && tb[RTA_PRIORITY] && *(int*)RTA_DATA(tb[RTA_PRIORITY]) == -1) return 0; if (filter.flushb) { struct nlmsghdr *fn; if (NLMSG_ALIGN(filter.flushp) + n->nlmsg_len > filter.flushe) { if (flush_update()) return -1; } fn = (struct nlmsghdr*)(filter.flushb + NLMSG_ALIGN(filter.flushp)); memcpy(fn, n, n->nlmsg_len); fn->nlmsg_type = RTM_DELROUTE; fn->nlmsg_flags = NLM_F_REQUEST; fn->nlmsg_seq = ++rth.seq; filter.flushp = (((char*)fn) + n->nlmsg_len) - filter.flushb; filter.flushed++; if (show_stats < 2) return 0; } if (n->nlmsg_type == RTM_DELROUTE) fprintf(fp, "Deleted "); if (r->rtm_type != RTN_UNICAST && !filter.type) fprintf(fp, "%s ", rtnl_rtntype_n2a(r->rtm_type, b1, sizeof(b1))); if (tb[RTA_DST]) { if (r->rtm_dst_len != host_len) { fprintf(fp, "%s/%u ", rt_addr_n2a(r->rtm_family, RTA_PAYLOAD(tb[RTA_DST]), RTA_DATA(tb[RTA_DST]), abuf, sizeof(abuf)), r->rtm_dst_len ); } else { fprintf(fp, "%s ", format_host(r->rtm_family, RTA_PAYLOAD(tb[RTA_DST]), RTA_DATA(tb[RTA_DST]), abuf, sizeof(abuf)) ); } } else if (r->rtm_dst_len) { fprintf(fp, "0/%d ", r->rtm_dst_len); } else { fprintf(fp, "default "); } if (tb[RTA_SRC]) { if (r->rtm_src_len != host_len) { fprintf(fp, "from %s/%u ", rt_addr_n2a(r->rtm_family, RTA_PAYLOAD(tb[RTA_SRC]), RTA_DATA(tb[RTA_SRC]), abuf, sizeof(abuf)), r->rtm_src_len ); } else { fprintf(fp, "from %s ", format_host(r->rtm_family, RTA_PAYLOAD(tb[RTA_SRC]), RTA_DATA(tb[RTA_SRC]), abuf, sizeof(abuf)) ); } } else if (r->rtm_src_len) { fprintf(fp, "from 0/%u ", r->rtm_src_len); } if (r->rtm_tos && filter.tosmask != -1) { SPRINT_BUF(b1); fprintf(fp, "tos %s ", rtnl_dsfield_n2a(r->rtm_tos, b1, sizeof(b1))); } #if 0 if (tb[RTA_MP_ALGO]) { __u32 mp_alg = *(__u32*) RTA_DATA(tb[RTA_MP_ALGO]); if (mp_alg > IP_MP_ALG_NONE) { fprintf(fp, "mpath %s ", mp_alg < IP_MP_ALG_MAX ? mp_alg_names[mp_alg] : "unknown"); } } #endif if (tb[RTA_GATEWAY] && filter.rvia.bitlen != host_len) { fprintf(fp, "via %s ", format_host(r->rtm_family, RTA_PAYLOAD(tb[RTA_GATEWAY]), RTA_DATA(tb[RTA_GATEWAY]), abuf, sizeof(abuf))); } if (tb[RTA_OIF] && filter.oifmask != -1) fprintf(fp, "dev %s ", ll_index_to_name(*(int*)RTA_DATA(tb[RTA_OIF]))); if (!(r->rtm_flags&RTM_F_CLONED)) { if (r->rtm_table != RT_TABLE_MAIN && !filter.tb) fprintf(fp, " table %s ", rtnl_rttable_n2a(r->rtm_table, b1, sizeof(b1))); if (r->rtm_protocol != RTPROT_BOOT && filter.protocolmask != -1) fprintf(fp, " proto %s ", rtnl_rtprot_n2a(r->rtm_protocol, b1, sizeof(b1))); if (r->rtm_scope != RT_SCOPE_UNIVERSE && filter.scopemask != -1) fprintf(fp, " scope %s ", rtnl_rtscope_n2a(r->rtm_scope, b1, sizeof(b1))); } if (tb[RTA_PREFSRC] && filter.rprefsrc.bitlen != host_len) { /* Do not use format_host(). It is our local addr and symbolic name will not be useful. */ fprintf(fp, " src %s ", rt_addr_n2a(r->rtm_family, RTA_PAYLOAD(tb[RTA_PREFSRC]), RTA_DATA(tb[RTA_PREFSRC]), abuf, sizeof(abuf))); } if (tb[RTA_PRIORITY]) fprintf(fp, " metric %d ", *(__u32*)RTA_DATA(tb[RTA_PRIORITY])); if (r->rtm_flags & RTNH_F_DEAD) fprintf(fp, "dead "); if (r->rtm_flags & RTNH_F_ONLINK) fprintf(fp, "onlink "); if (r->rtm_flags & RTNH_F_PERVASIVE) fprintf(fp, "pervasive "); if (r->rtm_flags & RTM_F_EQUALIZE) fprintf(fp, "equalize "); if (r->rtm_flags & RTM_F_NOTIFY) fprintf(fp, "notify "); if (tb[RTA_FLOW] && filter.realmmask != ~0U) { __u32 to = *(__u32*)RTA_DATA(tb[RTA_FLOW]); __u32 from = to>>16; to &= 0xFFFF; fprintf(fp, "realm%s ", from ? "s" : ""); if (from) { fprintf(fp, "%s/", rtnl_rtrealm_n2a(from, b1, sizeof(b1))); } fprintf(fp, "%s ", rtnl_rtrealm_n2a(to, b1, sizeof(b1))); } if ((r->rtm_flags&RTM_F_CLONED) && r->rtm_family == AF_INET) { __u32 flags = r->rtm_flags&~0xFFFF; int first = 1; fprintf(fp, "%s cache ", _SL_); #define PRTFL(fl,flname) if (flags&RTCF_##fl) { \ flags &= ~RTCF_##fl; \ fprintf(fp, "%s" flname "%s", first ? "<" : "", flags ? "," : "> "); \ first = 0; } PRTFL(LOCAL, "local"); PRTFL(REJECT, "reject"); PRTFL(MULTICAST, "mc"); PRTFL(BROADCAST, "brd"); PRTFL(DNAT, "dst-nat"); PRTFL(SNAT, "src-nat"); PRTFL(MASQ, "masq"); PRTFL(DIRECTDST, "dst-direct"); PRTFL(DIRECTSRC, "src-direct"); PRTFL(REDIRECTED, "redirected"); PRTFL(DOREDIRECT, "redirect"); PRTFL(FAST, "fastroute"); PRTFL(NOTIFY, "notify"); PRTFL(TPROXY, "proxy"); #ifdef RTCF_EQUALIZE PRTFL(EQUALIZE, "equalize"); #endif if (flags) fprintf(fp, "%s%x> ", first ? "<" : "", flags); if (tb[RTA_CACHEINFO]) { struct rta_cacheinfo *ci = RTA_DATA(tb[RTA_CACHEINFO]); static int hz; if (!hz) hz = get_user_hz(); if (ci->rta_expires != 0) fprintf(fp, " expires %dsec", ci->rta_expires/hz); if (ci->rta_error != 0) fprintf(fp, " error %d", ci->rta_error); if (show_stats) { if (ci->rta_clntref) fprintf(fp, " users %d", ci->rta_clntref); if (ci->rta_used != 0) fprintf(fp, " used %d", ci->rta_used); if (ci->rta_lastuse != 0) fprintf(fp, " age %dsec", ci->rta_lastuse/hz); } #ifdef RTNETLINK_HAVE_PEERINFO if (ci->rta_id) fprintf(fp, " ipid 0x%04x", ci->rta_id); if (ci->rta_ts || ci->rta_tsage) fprintf(fp, " ts 0x%x tsage %dsec", ci->rta_ts, ci->rta_tsage); #endif } } else if (r->rtm_family == AF_INET6) { struct rta_cacheinfo *ci = NULL; if (tb[RTA_CACHEINFO]) ci = RTA_DATA(tb[RTA_CACHEINFO]); if ((r->rtm_flags & RTM_F_CLONED) || (ci && ci->rta_expires)) { static int hz; if (!hz) hz = get_user_hz(); if (r->rtm_flags & RTM_F_CLONED) fprintf(fp, "%s cache ", _SL_); if (ci->rta_expires) fprintf(fp, " expires %dsec", ci->rta_expires/hz); if (ci->rta_error != 0) fprintf(fp, " error %d", ci->rta_error); if (show_stats) { if (ci->rta_clntref) fprintf(fp, " users %d", ci->rta_clntref); if (ci->rta_used != 0) fprintf(fp, " used %d", ci->rta_used); if (ci->rta_lastuse != 0) fprintf(fp, " age %dsec", ci->rta_lastuse/hz); } } else if (ci) { if (ci->rta_error != 0) fprintf(fp, " error %d", ci->rta_error); } } if (tb[RTA_METRICS]) { int i; unsigned mxlock = 0; struct rtattr *mxrta[RTAX_MAX+1]; parse_rtattr(mxrta, RTAX_MAX, RTA_DATA(tb[RTA_METRICS]), RTA_PAYLOAD(tb[RTA_METRICS])); if (mxrta[RTAX_LOCK]) mxlock = *(unsigned*)RTA_DATA(mxrta[RTAX_LOCK]); for (i=2; i<=RTAX_MAX; i++) { static char *mx_names[] = { "mtu", "window", "rtt", "rttvar", "ssthresh", "cwnd", "advmss", "reordering", }; static int hz; if (mxrta[i] == NULL) continue; if (!hz) hz = get_hz(); if (i-2 < sizeof(mx_names)/sizeof(char*)) fprintf(fp, " %s", mx_names[i-2]); else fprintf(fp, " metric %d", i); if (mxlock & (1<= hz) fprintf(fp, " %ums", val/hz); else fprintf(fp, " %.2fms", (float)val/hz); } } } if (tb[RTA_IIF] && filter.iifmask != -1) { fprintf(fp, " iif %s", ll_index_to_name(*(int*)RTA_DATA(tb[RTA_IIF]))); } if (tb[RTA_MULTIPATH]) { struct rtnexthop *nh = RTA_DATA(tb[RTA_MULTIPATH]); int first = 0; len = RTA_PAYLOAD(tb[RTA_MULTIPATH]); for (;;) { if (len < sizeof(*nh)) break; if (nh->rtnh_len > len) break; if (r->rtm_flags&RTM_F_CLONED && r->rtm_type == RTN_MULTICAST) { if (first) fprintf(fp, " Oifs:"); else fprintf(fp, " "); } else fprintf(fp, "%s\tnexthop", _SL_); if (nh->rtnh_len > sizeof(*nh)) { parse_rtattr(tb, RTA_MAX, RTNH_DATA(nh), nh->rtnh_len - sizeof(*nh)); if (tb[RTA_GATEWAY]) { fprintf(fp, " via %s ", format_host(r->rtm_family, RTA_PAYLOAD(tb[RTA_GATEWAY]), RTA_DATA(tb[RTA_GATEWAY]), abuf, sizeof(abuf))); } } if (r->rtm_flags&RTM_F_CLONED && r->rtm_type == RTN_MULTICAST) { fprintf(fp, " %s", ll_index_to_name(nh->rtnh_ifindex)); if (nh->rtnh_hops != 1) fprintf(fp, "(ttl>%d)", nh->rtnh_hops); } else { fprintf(fp, " dev %s", ll_index_to_name(nh->rtnh_ifindex)); fprintf(fp, " weight %d", nh->rtnh_hops+1); } if (nh->rtnh_flags & RTNH_F_DEAD) fprintf(fp, " dead"); if (nh->rtnh_flags & RTNH_F_ONLINK) fprintf(fp, " onlink"); if (nh->rtnh_flags & RTNH_F_PERVASIVE) fprintf(fp, " pervasive"); len -= NLMSG_ALIGN(nh->rtnh_len); nh = RTNH_NEXT(nh); } } fprintf(fp, "\n"); fflush(fp); return 0; } int parse_one_nh(struct rtattr *rta, struct rtnexthop *rtnh, int *argcp, char ***argvp) { int argc = *argcp; char **argv = *argvp; while (++argv, --argc > 0) { if (strcmp(*argv, "via") == 0) { NEXT_ARG(); rta_addattr32(rta, 4096, RTA_GATEWAY, get_addr32(*argv)); rtnh->rtnh_len += sizeof(struct rtattr) + 4; } else if (strcmp(*argv, "dev") == 0) { NEXT_ARG(); if ((rtnh->rtnh_ifindex = ll_name_to_index(*argv)) == 0) { fprintf(stderr, "Cannot find device \"%s\"\n", *argv); exit(1); } } else if (strcmp(*argv, "weight") == 0) { unsigned w; NEXT_ARG(); if (get_unsigned(&w, *argv, 0) || w == 0 || w > 256) invarg("\"weight\" is invalid\n", *argv); rtnh->rtnh_hops = w - 1; } else if (strcmp(*argv, "onlink") == 0) { rtnh->rtnh_flags |= RTNH_F_ONLINK; } else break; } *argcp = argc; *argvp = argv; return 0; } int parse_nexthops(struct nlmsghdr *n, struct rtmsg *r, int argc, char **argv) { char buf[1024]; struct rtattr *rta = (void*)buf; struct rtnexthop *rtnh; rta->rta_type = RTA_MULTIPATH; rta->rta_len = RTA_LENGTH(0); rtnh = RTA_DATA(rta); while (argc > 0) { if (strcmp(*argv, "nexthop") != 0) { fprintf(stderr, "Error: \"nexthop\" or end of line is expected instead of \"%s\"\n", *argv); exit(-1); } if (argc <= 1) { fprintf(stderr, "Error: unexpected end of line after \"nexthop\"\n"); exit(-1); } memset(rtnh, 0, sizeof(*rtnh)); rtnh->rtnh_len = sizeof(*rtnh); rta->rta_len += rtnh->rtnh_len; parse_one_nh(rta, rtnh, &argc, &argv); rtnh = RTNH_NEXT(rtnh); } if (rta->rta_len > RTA_LENGTH(0)) addattr_l(n, 1024, RTA_MULTIPATH, RTA_DATA(rta), RTA_PAYLOAD(rta)); return 0; } int iproute_modify(int cmd, unsigned flags, int argc, char **argv) { struct { struct nlmsghdr n; struct rtmsg r; char buf[1024]; } req; char mxbuf[256]; struct rtattr * mxrta = (void*)mxbuf; unsigned mxlock = 0; char *d = NULL; int gw_ok = 0; int dst_ok = 0; int nhs_ok = 0; int scope_ok = 0; int table_ok = 0; memset(&req, 0, sizeof(req)); req.n.nlmsg_len = NLMSG_LENGTH(sizeof(struct rtmsg)); req.n.nlmsg_flags = NLM_F_REQUEST|flags; req.n.nlmsg_type = cmd; req.r.rtm_family = preferred_family; req.r.rtm_table = RT_TABLE_MAIN; req.r.rtm_scope = RT_SCOPE_NOWHERE; if (cmd != RTM_DELROUTE) { req.r.rtm_protocol = RTPROT_BOOT; req.r.rtm_scope = RT_SCOPE_UNIVERSE; req.r.rtm_type = RTN_UNICAST; } mxrta->rta_type = RTA_METRICS; mxrta->rta_len = RTA_LENGTH(0); while (argc > 0) { if (strcmp(*argv, "src") == 0) { inet_prefix addr; NEXT_ARG(); get_addr(&addr, *argv, req.r.rtm_family); if (req.r.rtm_family == AF_UNSPEC) req.r.rtm_family = addr.family; addattr_l(&req.n, sizeof(req), RTA_PREFSRC, &addr.data, addr.bytelen); } else if (strcmp(*argv, "via") == 0) { inet_prefix addr; gw_ok = 1; NEXT_ARG(); get_addr(&addr, *argv, req.r.rtm_family); if (req.r.rtm_family == AF_UNSPEC) req.r.rtm_family = addr.family; addattr_l(&req.n, sizeof(req), RTA_GATEWAY, &addr.data, addr.bytelen); } else if (strcmp(*argv, "from") == 0) { inet_prefix addr; NEXT_ARG(); get_prefix(&addr, *argv, req.r.rtm_family); if (req.r.rtm_family == AF_UNSPEC) req.r.rtm_family = addr.family; if (addr.bytelen) addattr_l(&req.n, sizeof(req), RTA_SRC, &addr.data, addr.bytelen); req.r.rtm_src_len = addr.bitlen; } else if (strcmp(*argv, "tos") == 0 || matches(*argv, "dsfield") == 0) { __u32 tos; NEXT_ARG(); if (rtnl_dsfield_a2n(&tos, *argv)) invarg("\"tos\" value is invalid\n", *argv); req.r.rtm_tos = tos; } else if (matches(*argv, "metric") == 0 || matches(*argv, "priority") == 0 || matches(*argv, "preference") == 0) { __u32 metric; NEXT_ARG(); if (get_u32(&metric, *argv, 0)) invarg("\"metric\" value is invalid\n", *argv); addattr32(&req.n, sizeof(req), RTA_PRIORITY, metric); } else if (strcmp(*argv, "scope") == 0) { __u32 scope = 0; NEXT_ARG(); if (rtnl_rtscope_a2n(&scope, *argv)) invarg("invalid \"scope\" value\n", *argv); req.r.rtm_scope = scope; scope_ok = 1; } else if (strcmp(*argv, "lifetime") == 0) { /* this one is added by thomson */ static struct ifa_cacheinfo ci; memset(&ci, 0, sizeof(ci)); NEXT_ARG(); __u32 validlft; if (get_u32(&validlft, *argv, 0)) invarg("\lifetime value is invalid\n", *argv); ci.ifa_valid = validlft; ci.ifa_prefered = validlft - 1; addattr_l(&req.n, sizeof(req), IFA_CACHEINFO, &ci, sizeof(ci)); } else if (strcmp(*argv, "mtu") == 0) { unsigned mtu; NEXT_ARG(); if (strcmp(*argv, "lock") == 0) { mxlock |= (1< '9') && (**argv < 'a' || **argv > 'f') && (**argv < 'A' || **argv > 'F') && rtnl_rtntype_a2n(&type, *argv) == 0) { NEXT_ARG(); req.r.rtm_type = type; } if (matches(*argv, "help") == 0) usage(); if (dst_ok) duparg2("to", *argv); get_prefix(&dst, *argv, req.r.rtm_family); if (req.r.rtm_family == AF_UNSPEC) req.r.rtm_family = dst.family; req.r.rtm_dst_len = dst.bitlen; dst_ok = 1; if (dst.bytelen) addattr_l(&req.n, sizeof(req), RTA_DST, &dst.data, dst.bytelen); } argc--; argv++; } if (d || nhs_ok) { ll_init_map(&rth); if (d) { int idx; if ((idx = ll_name_to_index(d)) == 0) { fprintf(stderr, "Cannot find device \"%s\"\n", d); return -1; } addattr32(&req.n, sizeof(req), RTA_OIF, idx); } } if (mxrta->rta_len > RTA_LENGTH(0)) { if (mxlock) rta_addattr32(mxrta, sizeof(mxbuf), RTAX_LOCK, mxlock); addattr_l(&req.n, sizeof(req), RTA_METRICS, RTA_DATA(mxrta), RTA_PAYLOAD(mxrta)); } if (nhs_ok) parse_nexthops(&req.n, &req.r, argc, argv); if (!table_ok) { if (req.r.rtm_type == RTN_LOCAL || req.r.rtm_type == RTN_BROADCAST || req.r.rtm_type == RTN_NAT || req.r.rtm_type == RTN_ANYCAST) req.r.rtm_table = RT_TABLE_LOCAL; } if (!scope_ok) { if (req.r.rtm_type == RTN_LOCAL || req.r.rtm_type == RTN_NAT) req.r.rtm_scope = RT_SCOPE_HOST; else if (req.r.rtm_type == RTN_BROADCAST || req.r.rtm_type == RTN_MULTICAST || req.r.rtm_type == RTN_ANYCAST) req.r.rtm_scope = RT_SCOPE_LINK; else if (req.r.rtm_type == RTN_UNICAST || req.r.rtm_type == RTN_UNSPEC) { if (cmd == RTM_DELROUTE) req.r.rtm_scope = RT_SCOPE_NOWHERE; else if (!gw_ok && !nhs_ok) req.r.rtm_scope = RT_SCOPE_LINK; } } if (req.r.rtm_family == AF_UNSPEC) req.r.rtm_family = AF_INET; return rtnl_talk(&rth, &req.n, 0, 0, NULL, NULL, NULL); } static int rtnl_rtcache_request(struct rtnl_handle *rth, int family) { struct { struct nlmsghdr nlh; struct rtmsg rtm; } req; struct sockaddr_nl nladdr; memset(&nladdr, 0, sizeof(nladdr)); memset(&req, 0, sizeof(req)); nladdr.nl_family = AF_NETLINK; req.nlh.nlmsg_len = sizeof(req); req.nlh.nlmsg_type = RTM_GETROUTE; req.nlh.nlmsg_flags = NLM_F_ROOT|NLM_F_REQUEST; req.nlh.nlmsg_pid = 0; req.nlh.nlmsg_seq = rth->dump = ++rth->seq; req.rtm.rtm_family = family; req.rtm.rtm_flags |= RTM_F_CLONED; return sendto(rth->fd, (void*)&req, sizeof(req), 0, (struct sockaddr*)&nladdr, sizeof(nladdr)); } static int iproute_flush_cache(void) { #define ROUTE_FLUSH_PATH "/proc/sys/net/ipv4/route/flush" int len; int flush_fd = open (ROUTE_FLUSH_PATH, O_WRONLY); char *buffer = "-1"; if (flush_fd < 0) { fprintf (stderr, "Cannot open \"%s\"\n", ROUTE_FLUSH_PATH); return -1; } len = strlen (buffer); if ((write (flush_fd, (void *)buffer, len)) < len) { fprintf (stderr, "Cannot flush routing cache\n"); close(flush_fd); return -1; } close(flush_fd); return 0; } static int iproute_list_or_flush(int argc, char **argv, int flush) { int do_ipv6 = preferred_family; char *id = NULL; char *od = NULL; iproute_reset_filter(); filter.tb = RT_TABLE_MAIN; if (flush && argc <= 0) { fprintf(stderr, "\"ip route flush\" requires arguments.\n"); return -1; } while (argc > 0) { if (matches(*argv, "table") == 0) { __u32 tid; NEXT_ARG(); if (rtnl_rttable_a2n(&tid, *argv)) { if (strcmp(*argv, "all") == 0) { tid = 0; } else if (strcmp(*argv, "cache") == 0) { tid = -1; } else if (strcmp(*argv, "help") == 0) { usage(); } else { invarg("table id value is invalid\n", *argv); } } filter.tb = tid; } else if (matches(*argv, "cached") == 0 || matches(*argv, "cloned") == 0) { filter.tb = -1; } else if (strcmp(*argv, "tos") == 0 || matches(*argv, "dsfield") == 0) { __u32 tos; NEXT_ARG(); if (rtnl_dsfield_a2n(&tos, *argv)) invarg("TOS value is invalid\n", *argv); filter.tos = tos; filter.tosmask = -1; } else if (matches(*argv, "protocol") == 0) { __u32 prot = 0; NEXT_ARG(); filter.protocolmask = -1; if (rtnl_rtprot_a2n(&prot, *argv)) { if (strcmp(*argv, "all") != 0) invarg("invalid \"protocol\"\n", *argv); prot = 0; filter.protocolmask = 0; } filter.protocol = prot; } else if (matches(*argv, "scope") == 0) { __u32 scope = 0; NEXT_ARG(); filter.scopemask = -1; if (rtnl_rtscope_a2n(&scope, *argv)) { if (strcmp(*argv, "all") != 0) invarg("invalid \"scope\"\n", *argv); scope = RT_SCOPE_NOWHERE; filter.scopemask = 0; } filter.scope = scope; } else if (matches(*argv, "type") == 0) { int type; NEXT_ARG(); filter.typemask = -1; if (rtnl_rtntype_a2n(&type, *argv)) invarg("node type value is invalid\n", *argv); filter.type = type; } else if (strcmp(*argv, "dev") == 0 || strcmp(*argv, "oif") == 0) { NEXT_ARG(); od = *argv; } else if (strcmp(*argv, "iif") == 0) { NEXT_ARG(); id = *argv; } else if (strcmp(*argv, "via") == 0) { NEXT_ARG(); get_prefix(&filter.rvia, *argv, do_ipv6); } else if (strcmp(*argv, "src") == 0) { NEXT_ARG(); get_prefix(&filter.rprefsrc, *argv, do_ipv6); } else if (matches(*argv, "realms") == 0) { __u32 realm; NEXT_ARG(); if (get_rt_realms(&realm, *argv)) invarg("invalid realms\n", *argv); filter.realm = realm; filter.realmmask = ~0U; if ((filter.realm&0xFFFF) == 0 && (*argv)[strlen(*argv) - 1] == '/') filter.realmmask &= ~0xFFFF; if ((filter.realm&0xFFFF0000U) == 0 && (strchr(*argv, '/') == NULL || (*argv)[0] == '/')) filter.realmmask &= ~0xFFFF0000U; } else if (matches(*argv, "from") == 0) { NEXT_ARG(); if (matches(*argv, "root") == 0) { NEXT_ARG(); get_prefix(&filter.rsrc, *argv, do_ipv6); } else if (matches(*argv, "match") == 0) { NEXT_ARG(); get_prefix(&filter.msrc, *argv, do_ipv6); } else { if (matches(*argv, "exact") == 0) { NEXT_ARG(); } get_prefix(&filter.msrc, *argv, do_ipv6); filter.rsrc = filter.msrc; } } else { if (matches(*argv, "to") == 0) { NEXT_ARG(); } if (matches(*argv, "root") == 0) { NEXT_ARG(); get_prefix(&filter.rdst, *argv, do_ipv6); } else if (matches(*argv, "match") == 0) { NEXT_ARG(); get_prefix(&filter.mdst, *argv, do_ipv6); } else { if (matches(*argv, "exact") == 0) { NEXT_ARG(); } get_prefix(&filter.mdst, *argv, do_ipv6); filter.rdst = filter.mdst; } } argc--; argv++; } if (do_ipv6 == AF_UNSPEC && filter.tb) do_ipv6 = AF_INET; ll_init_map(&rth); if (id || od) { int idx; if (id) { if ((idx = ll_name_to_index(id)) == 0) { fprintf(stderr, "Cannot find device \"%s\"\n", id); return -1; } filter.iif = idx; filter.iifmask = -1; } if (od) { if ((idx = ll_name_to_index(od)) == 0) { fprintf(stderr, "Cannot find device \"%s\"\n", od); return -1; } filter.oif = idx; filter.oifmask = -1; } } if (flush) { int round = 0; char flushb[4096-512]; time_t start = time(0); if (filter.tb == -1) { if (do_ipv6 != AF_INET6) { iproute_flush_cache(); if (show_stats) printf("*** IPv4 routing cache is flushed.\n"); } if (do_ipv6 == AF_INET) return 0; } filter.flushb = flushb; filter.flushp = 0; filter.flushe = sizeof(flushb); for (;;) { if (rtnl_wilddump_request(&rth, do_ipv6, RTM_GETROUTE) < 0) { perror("Cannot send dump request"); exit(1); } filter.flushed = 0; if (rtnl_dump_filter(&rth, print_route, stdout, NULL, NULL) < 0) { fprintf(stderr, "Flush terminated\n"); exit(1); } if (filter.flushed == 0) { if (round == 0) { if (filter.tb != -1 || do_ipv6 == AF_INET6) fprintf(stderr, "Nothing to flush.\n"); } else if (show_stats) printf("*** Flush is complete after %d round%s ***\n", round, round>1?"s":""); fflush(stdout); return 0; } round++; if (flush_update() < 0) exit(1); if (time(0) - start > 30) { printf("\n*** Flush not completed after %ld seconds, %d entries remain ***\n", time(0) - start, filter.flushed); exit(1); } if (show_stats) { printf("\n*** Round %d, deleting %d entries ***\n", round, filter.flushed); fflush(stdout); } } } if (filter.tb != -1) { if (rtnl_wilddump_request(&rth, do_ipv6, RTM_GETROUTE) < 0) { perror("Cannot send dump request"); exit(1); } } else { if (rtnl_rtcache_request(&rth, do_ipv6) < 0) { perror("Cannot send dump request"); exit(1); } } if (rtnl_dump_filter(&rth, print_route, stdout, NULL, NULL) < 0) { fprintf(stderr, "Dump terminated\n"); exit(1); } exit(0); } int iproute_get(int argc, char **argv) { struct { struct nlmsghdr n; struct rtmsg r; char buf[1024]; } req; char *idev = NULL; char *odev = NULL; int connected = 0; int from_ok = 0; memset(&req, 0, sizeof(req)); iproute_reset_filter(); req.n.nlmsg_len = NLMSG_LENGTH(sizeof(struct rtmsg)); req.n.nlmsg_flags = NLM_F_REQUEST; req.n.nlmsg_type = RTM_GETROUTE; req.r.rtm_family = preferred_family; req.r.rtm_table = 0; req.r.rtm_protocol = 0; req.r.rtm_scope = 0; req.r.rtm_type = 0; req.r.rtm_src_len = 0; req.r.rtm_dst_len = 0; req.r.rtm_tos = 0; while (argc > 0) { if (strcmp(*argv, "tos") == 0 || matches(*argv, "dsfield") == 0) { __u32 tos; NEXT_ARG(); if (rtnl_dsfield_a2n(&tos, *argv)) invarg("TOS value is invalid\n", *argv); req.r.rtm_tos = tos; } else if (matches(*argv, "from") == 0) { inet_prefix addr; NEXT_ARG(); if (matches(*argv, "help") == 0) usage(); from_ok = 1; get_prefix(&addr, *argv, req.r.rtm_family); if (req.r.rtm_family == AF_UNSPEC) req.r.rtm_family = addr.family; if (addr.bytelen) addattr_l(&req.n, sizeof(req), RTA_SRC, &addr.data, addr.bytelen); req.r.rtm_src_len = addr.bitlen; } else if (matches(*argv, "iif") == 0) { NEXT_ARG(); idev = *argv; } else if (matches(*argv, "oif") == 0 || strcmp(*argv, "dev") == 0) { NEXT_ARG(); odev = *argv; } else if (matches(*argv, "notify") == 0) { req.r.rtm_flags |= RTM_F_NOTIFY; } else if (matches(*argv, "connected") == 0) { connected = 1; } else { inet_prefix addr; if (strcmp(*argv, "to") == 0) { NEXT_ARG(); } if (matches(*argv, "help") == 0) usage(); get_prefix(&addr, *argv, req.r.rtm_family); if (req.r.rtm_family == AF_UNSPEC) req.r.rtm_family = addr.family; if (addr.bytelen) addattr_l(&req.n, sizeof(req), RTA_DST, &addr.data, addr.bytelen); req.r.rtm_dst_len = addr.bitlen; } argc--; argv++; } if (req.r.rtm_dst_len == 0) { fprintf(stderr, "need at least destination address\n"); exit(1); } ll_init_map(&rth); if (idev || odev) { int idx; if (idev) { if ((idx = ll_name_to_index(idev)) == 0) { fprintf(stderr, "Cannot find device \"%s\"\n", idev); return -1; } addattr32(&req.n, sizeof(req), RTA_IIF, idx); } if (odev) { if ((idx = ll_name_to_index(odev)) == 0) { fprintf(stderr, "Cannot find device \"%s\"\n", odev); return -1; } addattr32(&req.n, sizeof(req), RTA_OIF, idx); } } if (req.r.rtm_family == AF_UNSPEC) req.r.rtm_family = AF_INET; if (rtnl_talk(&rth, &req.n, 0, 0, &req.n, NULL, NULL) < 0) exit(2); if (connected && !from_ok) { struct rtmsg *r = NLMSG_DATA(&req.n); int len = req.n.nlmsg_len; struct rtattr * tb[RTA_MAX+1]; if (print_route(NULL, &req.n, (void*)stdout) < 0) { fprintf(stderr, "An error :-)\n"); exit(1); } if (req.n.nlmsg_type != RTM_NEWROUTE) { fprintf(stderr, "Not a route?\n"); return -1; } len -= NLMSG_LENGTH(sizeof(*r)); if (len < 0) { fprintf(stderr, "Wrong len %d\n", len); return -1; } parse_rtattr(tb, RTA_MAX, RTM_RTA(r), len); if (tb[RTA_PREFSRC]) { tb[RTA_PREFSRC]->rta_type = RTA_SRC; r->rtm_src_len = 8*RTA_PAYLOAD(tb[RTA_PREFSRC]); } else if (!tb[RTA_SRC]) { fprintf(stderr, "Failed to connect the route\n"); return -1; } if (!odev && tb[RTA_OIF]) tb[RTA_OIF]->rta_type = 0; if (tb[RTA_GATEWAY]) tb[RTA_GATEWAY]->rta_type = 0; if (!idev && tb[RTA_IIF]) tb[RTA_IIF]->rta_type = 0; req.n.nlmsg_flags = NLM_F_REQUEST; req.n.nlmsg_type = RTM_GETROUTE; if (rtnl_talk(&rth, &req.n, 0, 0, &req.n, NULL, NULL) < 0) exit(2); } if (print_route(NULL, &req.n, (void*)stdout) < 0) { fprintf(stderr, "An error :-)\n"); exit(1); } exit(0); } void iproute_reset_filter() { memset(&filter, 0, sizeof(filter)); filter.mdst.bitlen = -1; filter.msrc.bitlen = -1; } int do_iproute(int argc, char **argv) { if (argc < 1) return iproute_list_or_flush(0, NULL, 0); if (matches(*argv, "add") == 0) return iproute_modify(RTM_NEWROUTE, NLM_F_CREATE|NLM_F_EXCL, argc-1, argv+1); if (matches(*argv, "change") == 0 || strcmp(*argv, "chg") == 0) return iproute_modify(RTM_NEWROUTE, NLM_F_REPLACE, argc-1, argv+1); if (matches(*argv, "replace") == 0) return iproute_modify(RTM_NEWROUTE, NLM_F_CREATE|NLM_F_REPLACE, argc-1, argv+1); if (matches(*argv, "prepend") == 0) return iproute_modify(RTM_NEWROUTE, NLM_F_CREATE, argc-1, argv+1); if (matches(*argv, "append") == 0) return iproute_modify(RTM_NEWROUTE, NLM_F_CREATE|NLM_F_APPEND, argc-1, argv+1); if (matches(*argv, "test") == 0) return iproute_modify(RTM_NEWROUTE, NLM_F_EXCL, argc-1, argv+1); if (matches(*argv, "delete") == 0) return iproute_modify(RTM_DELROUTE, 0, argc-1, argv+1); if (matches(*argv, "list") == 0 || matches(*argv, "show") == 0 || matches(*argv, "lst") == 0) return iproute_list_or_flush(argc-1, argv+1, 0); if (matches(*argv, "get") == 0) return iproute_get(argc-1, argv+1); if (matches(*argv, "flush") == 0) return iproute_list_or_flush(argc-1, argv+1, 1); if (matches(*argv, "help") == 0) usage(); fprintf(stderr, "Command \"%s\" is unknown, try \"ip route help\".\n", *argv); exit(-1); } dibbler-1.0.1/Port-linux/lowlevel-linux.c0000664000175000017500000005405112560471634015267 00000000000000/* * Dibbler - a portable DHCPv6 * * authors: Tomasz Mrugalski * changes: Michal Kowalczuk * * This file is a based on the ip/ipaddress.c file from iproute2 * ipaddress.c authors (note: those folks are not involved in Dibbler development): * Authors: Alexey Kuznetsov, * Changes: Laszlo Valko * * released under GNU GPL v2 only licence * */ #define _GNU_SOURCE #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "libnetlink.h" #include "ll_map.h" #include "utils.h" #include "rt_names.h" #include "Portable.h" /* #define LOWLEVEL_DEBUG 1 */ #ifndef IPV6_RECVPKTINFO #define IPV6_RECVPKTINFO IPV6_PKTINFO #endif #define ADDROPER_DEL 0 #define ADDROPER_ADD 1 #define ADDROPER_UPDATE 2 struct rtnl_handle rth; char Message[1024] = {0}; int lowlevelInit() { if (rtnl_open(&rth, 0) < 0) { sprintf(Message, "Cannot open rtnetlink\n"); return LOWLEVEL_ERROR_SOCKET; } return 0; } int lowlevelExit() { rtnl_close(&rth); return 0; } struct nlmsg_list { struct nlmsg_list *next; struct nlmsghdr h; }; int print_linkinfo(struct nlmsghdr *n); int print_addrinfo(struct nlmsghdr *n); int print_selected_addrinfo(int ifindex, struct nlmsg_list *ainfo); void ipaddr_local_get(int *count, char **buf, int ifindex, struct nlmsg_list *ainfo); void ipaddr_global_get(int *count, char **buf, int ifindex, struct nlmsg_list *ainfo); void print_link_flags( unsigned flags); int default_scope(inet_prefix *lcl); int store_nlmsg(const struct sockaddr_nl *who, struct nlmsghdr *n, void *arg) { struct nlmsg_list **linfo = (struct nlmsg_list**)arg; struct nlmsg_list *h; struct nlmsg_list **lp; h = malloc(n->nlmsg_len+sizeof(void*)); if (h == NULL) return -1; memcpy(&h->h, n, n->nlmsg_len); h->next = NULL; for (lp = linfo; *lp; lp = &(*lp)->next) /* NOTHING */; *lp = h; ll_remember_index(who, n, NULL); return 0; } void release_nlmsg_list(struct nlmsg_list *n) { struct nlmsg_list *tmp; while (n) { tmp = n->next; free(n); n = tmp; } } void if_list_release(struct iface * list) { struct iface * tmp; while (list) { tmp = list->next; if (list->linkaddrcount) free(list->linkaddr); if (list->globaladdrcount) free(list->globaladdr); free(list); list = tmp; } } #define IF_RA_MANAGED 0x40 #define IF_RA_OTHERCONF 0x80 /** * extracts M(managed) and O(other conf) flags set by Router Advertisement * * @param rta a pointer to tb[IFLA_PROTINFO] message received over netlink * * @return flags (see IF_RA_MANAGED and IF_RA_OTHERCONF) */ uint32_t link_get_mo_bits(struct rtattr* rta) { size_t rtasize1; void *rtadata; struct rtattr *rta1; uint32_t mo_flags = 0; rtadata = RTA_DATA(rta); rtasize1 = rta->rta_len; for (rta1 = (struct rtattr *)rtadata; RTA_OK(rta1, rtasize1); rta1 = RTA_NEXT(rta1, rtasize1)) { void *rtadata1 = RTA_DATA(rta1); switch(rta1->rta_type) { case IFLA_INET6_FLAGS: mo_flags = *((u_int32_t *)rtadata1); #ifdef LOWLEVEL_DEBUG if (mo_flags & IF_RA_MANAGED) printf("M flag!"); if (mo_flags & IF_RA_OTHERCONF) printf("O flag!"); #endif return mo_flags; } } return 0; } /* * returns interface list with detailed informations */ struct iface * if_list_get() { struct nlmsg_list *linfo = NULL; struct nlmsg_list *ainfo = NULL; struct nlmsg_list *l; struct rtnl_handle rth; struct iface * head = NULL; struct iface * tmp; uint32_t mo_bits = 0; /* required to display information about interface */ struct ifinfomsg *ifi; /* table for storing base interface information */ struct rtattr * tb[IFLA_MAX + 1]; int len; memset(tb, 0, sizeof(tb)); memset(&rth,0, sizeof(rth)); rtnl_open(&rth, 0); rtnl_wilddump_request(&rth, AF_INET6, RTM_GETLINK); rtnl_dump_filter(&rth, store_nlmsg, &linfo, NULL, NULL); /* 2nd attribute: AF_UNSPEC, AF_INET, AF_INET6 */ rtnl_wilddump_request(&rth, AF_UNSPEC, RTM_GETADDR); rtnl_dump_filter(&rth, store_nlmsg, &ainfo, NULL, NULL); /* build list with interface names */ for (l=linfo; l; l = l->next) { ifi = NLMSG_DATA(&l->h); len = (&l->h)->nlmsg_len; len -= NLMSG_LENGTH(sizeof(*ifi)); parse_rtattr(tb, IFLA_MAX, IFLA_RTA(ifi), len); /* let's get M,O flags for interface */ mo_bits = 0; if (tb[IFLA_PROTINFO]) { mo_bits = link_get_mo_bits(tb[IFLA_PROTINFO]); } #ifdef LOWLEVEL_DEBUG printf("### iface %d %s (flags:%d) (mo bits:%d)###\n",ifi->ifi_index, (char*)RTA_DATA(tb[IFLA_IFNAME]),ifi->ifi_flags, mo_bits); #endif tmp = malloc(sizeof(struct iface)); memset(tmp, 0, sizeof(struct iface)); snprintf(tmp->name,MAX_IFNAME_LENGTH,"%s",(char*)RTA_DATA(tb[IFLA_IFNAME])); tmp->id=ifi->ifi_index; tmp->flags=ifi->ifi_flags; tmp->hardwareType = ifi->ifi_type; tmp->next=head; head=tmp; tmp->m_bit = (mo_bits & IF_RA_MANAGED)?1:0; tmp->o_bit = (mo_bits & IF_RA_OTHERCONF)?1:0; memset(tmp->mac,0,255); /* This stuff reads MAC addr */ /* Does inetface have LL_ADDR? */ if (tb[IFLA_ADDRESS]) { tmp->maclen = RTA_PAYLOAD(tb[IFLA_ADDRESS]); memcpy(tmp->mac,RTA_DATA(tb[IFLA_ADDRESS]), tmp->maclen); } /* Tunnels can have no LL_ADDR. RTA_PAYLOAD doesn't check it and try to * dereference it in this manner * #define RTA_PAYLOAD(rta) ((int)((rta)->rta_len) - RTA_LENGTH(0)) * */ else { tmp->maclen=0; } ipaddr_local_get(&tmp->linkaddrcount, &tmp->linkaddr, tmp->id, ainfo); ipaddr_global_get(&tmp->globaladdrcount, &tmp->globaladdr, tmp->id, ainfo); } release_nlmsg_list(linfo); release_nlmsg_list(ainfo); rtnl_close(&rth); return head; } /** * returns local addresses for specified interface */ void ipaddr_local_get(int *count, char **bufPtr, int ifindex, struct nlmsg_list *ainfo) { int cnt=0; char * buf=0, * tmpbuf=0; char addr[16]; struct rtattr * rta_tb[IFA_MAX+1]; int pos; for ( ;ainfo ; ainfo = ainfo->next) { struct nlmsghdr *n = &ainfo->h; struct ifaddrmsg *ifa = NLMSG_DATA(n); if ( (ifa->ifa_family == AF_INET6) && (ifa->ifa_index == ifindex) ) { memset(rta_tb, 0, sizeof(*rta_tb)); parse_rtattr(rta_tb, IFA_MAX, IFA_RTA(ifa), n->nlmsg_len - NLMSG_LENGTH(sizeof(*ifa))); if (!rta_tb[IFA_LOCAL]) rta_tb[IFA_LOCAL] = rta_tb[IFA_ADDRESS]; if (!rta_tb[IFA_ADDRESS]) rta_tb[IFA_ADDRESS] = rta_tb[IFA_LOCAL]; memcpy(addr,(char*)RTA_DATA(rta_tb[IFLA_ADDRESS]),16); if (addr[0]!=0xfe || addr[1]!=0x80) { continue; /* ignore non link-scoped addrs */ } /* ifa->ifa_flags & 128 - permenent */ /* printf("flags:%d : ",ifa->ifa_flags); */ pos = cnt*16; buf = (char*) malloc( pos + 16); if (pos > 0) { memcpy(buf, tmpbuf, pos); /* copy old addrs */ } memcpy(buf+pos,addr,16); /* copy new addr */ if (pos > 0) { free(tmpbuf); } tmpbuf = buf; cnt++; } } *count = cnt; *bufPtr = buf; } /** * returns non-local addresses for specified interface */ void ipaddr_global_get(int *count, char **bufPtr, int ifindex, struct nlmsg_list *ainfo) { int cnt=0; char * buf=0, * tmpbuf=0; char addr[16]; struct rtattr * rta_tb[IFA_MAX+1]; int pos; for ( ;ainfo ; ainfo = ainfo->next) { struct nlmsghdr *n = &ainfo->h; struct ifaddrmsg *ifa = NLMSG_DATA(n); if ( (ifa->ifa_family == AF_INET6) && (ifa->ifa_index == ifindex) ) { memset(rta_tb, 0, sizeof(*rta_tb)); parse_rtattr(rta_tb, IFA_MAX, IFA_RTA(ifa), n->nlmsg_len - NLMSG_LENGTH(sizeof(*ifa))); if (!rta_tb[IFA_LOCAL]) rta_tb[IFA_LOCAL] = rta_tb[IFA_ADDRESS]; if (!rta_tb[IFA_ADDRESS]) rta_tb[IFA_ADDRESS] = rta_tb[IFA_LOCAL]; memcpy(addr,(char*)RTA_DATA(rta_tb[IFLA_ADDRESS]),16); if ( (addr[0]==0xfe && addr[1]==0x80) || /* link local */ (addr[0]==0xff) ) { /* multicast */ continue; /* ignore non link-scoped addrs */ } /* ifa->ifa_flags & 128 - permenent */ /* printf("flags:%d : ",ifa->ifa_flags); */ pos = cnt*16; buf = (char*) malloc( pos + 16); if (pos > 0) { memcpy(buf,tmpbuf, pos); /* copy old addrs */ } memcpy(buf+pos,addr,16); /* copy new addr */ if (pos > 0) { free(tmpbuf); } tmpbuf = buf; cnt++; } } *count = cnt; *bufPtr = buf; } /** * adds, updates or deletes addresses to interface * * @param addr * @param ifacename * @param prefixLen * @param preferred * @param valid * @param mode - 0-delete, 1-add, 2-update * * @return */ int ipaddr_add_or_del(const char * addr, const char *ifacename, int prefixLen, unsigned long preferred, unsigned long valid, int mode) { struct rtnl_handle rth; struct { struct nlmsghdr n; struct ifaddrmsg ifa; char buf[256]; } req; inet_prefix lcl; /* inet_prefix peer; */ int local_len = 0; int peer_len = 0; int scoped = 0; struct ifa_cacheinfo ci; #ifdef LOWLEVEL_DEBUG printf("### iface=%s, addr=%s, add=%d ###\n", ifacename, addr, add); #endif memset(&req, 0, sizeof(req)); req.n.nlmsg_len = NLMSG_LENGTH(sizeof(struct ifaddrmsg)); switch (mode) { case ADDROPER_DEL: req.n.nlmsg_type = RTM_DELADDR; /* del address */ req.n.nlmsg_flags = NLM_F_REQUEST; break; case ADDROPER_ADD: req.n.nlmsg_type = RTM_NEWADDR; /* add address */ req.n.nlmsg_flags = NLM_F_REQUEST |NLM_F_CREATE|NLM_F_EXCL; break; case ADDROPER_UPDATE: req.n.nlmsg_type = RTM_NEWADDR; /* update address */ req.n.nlmsg_flags = NLM_F_REQUEST | NLM_F_REPLACE; break; } req.ifa.ifa_family = AF_INET6; req.ifa.ifa_flags = 0; req.ifa.ifa_prefixlen = prefixLen; get_prefix_1(&lcl, (char*)addr, AF_INET6); addattr_l(&req.n, sizeof(req), IFA_LOCAL, &lcl.data, lcl.bytelen); local_len = lcl.bytelen; memset(&ci, 0, sizeof(ci)); ci.ifa_valid = valid; ci.ifa_prefered = preferred; addattr_l(&req.n, sizeof(req), IFA_CACHEINFO, &ci, sizeof(ci)); if (peer_len == 0 && local_len) { /* peer = lcl; */ addattr_l(&req.n, sizeof(req), IFA_ADDRESS, &lcl.data, lcl.bytelen); } if (req.ifa.ifa_prefixlen == 0) req.ifa.ifa_prefixlen = lcl.bitlen; if (!scoped) req.ifa.ifa_scope = default_scope(&lcl); rtnl_open(&rth, 0); ll_init_map(&rth); /* is there an interface with this ifindex? */ if ((req.ifa.ifa_index = ll_name_to_index((char*)ifacename)) == 0) { sprintf(Message, "Cannot find device: %s", ifacename); return LOWLEVEL_ERROR_UNSPEC; } rtnl_talk(&rth, &req.n, 0, 0, NULL, NULL, NULL); fflush(stdout); return LOWLEVEL_NO_ERROR; } int ipaddr_add(const char * ifacename, int ifaceid, const char * addr, unsigned long pref, unsigned long valid, int prefixLength) { return ipaddr_add_or_del(addr,ifacename, prefixLength, pref, valid, ADDROPER_ADD); } int ipaddr_update(const char* ifacename, int ifindex, const char* addr, unsigned long pref, unsigned long valid, int prefixLength) { /** @todo: Linux kernel currently does not provide API for dynamic addresses */ return ipaddr_add_or_del(addr, ifacename, prefixLength, pref, valid, ADDROPER_UPDATE); } int ipaddr_del(const char * ifacename, int ifaceid, const char * addr, int prefixLength) { return ipaddr_add_or_del(addr,ifacename, prefixLength, 0/*pref*/, 0/*valid*/, ADDROPER_DEL); } int sock_add(char * ifacename,int ifaceid, char * addr, int port, int thisifaceonly, int reuse) { int error; int on = 1; struct addrinfo hints; struct addrinfo *res, *res2; struct ipv6_mreq mreq6; int Insock; int multicast; char port_char[6]; char * tmp; struct sockaddr_in6 bindme; sprintf(port_char,"%d",port); if (!strncasecmp(addr,"ff",2)) multicast = 1; else multicast = 0; #ifdef LOWLEVEL_DEBUG printf("### iface: %s(id=%d), addr=%s, port=%d, ifaceonly=%d reuse=%d###\n", ifacename,ifaceid, addr, port, thisifaceonly, reuse); fflush(stdout); #endif /* Open a socket for inbound traffic */ memset(&hints, 0, sizeof(hints)); hints.ai_family = PF_INET6; hints.ai_socktype = SOCK_DGRAM; hints.ai_protocol = IPPROTO_UDP; hints.ai_flags = AI_PASSIVE; if( (error = getaddrinfo(NULL, port_char, &hints, &res)) ){ sprintf(Message, "getaddrinfo failed. Is IPv6 protocol supported by kernel?"); return LOWLEVEL_ERROR_GETADDRINFO; } if( (Insock = socket(AF_INET6, SOCK_DGRAM,0 )) < 0){ sprintf(Message, "socket creation failed. Is IPv6 protocol supported by kernel?"); return LOWLEVEL_ERROR_UNSPEC; } /* Set the options to receivce ipv6 traffic */ if (setsockopt(Insock, IPPROTO_IPV6, IPV6_RECVPKTINFO, &on, sizeof(on)) < 0) { sprintf(Message, "Unable to set up socket option IPV6_RECVPKTINFO."); return LOWLEVEL_ERROR_SOCK_OPTS; } /* bind to device only when running as root */ if (thisifaceonly && !getuid()) { if (setsockopt(Insock, SOL_SOCKET, SO_BINDTODEVICE, ifacename, strlen(ifacename)+1) <0) { sprintf(Message, "Unable to bind socket to interface %s.", ifacename); return LOWLEVEL_ERROR_BIND_IFACE; } } /* allow address reuse (this option sucks - why allow running multiple servers?) */ if (reuse!=0) { if (setsockopt(Insock, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on)) < 0) { sprintf(Message, "Unable to set up socket option SO_REUSEADDR."); return LOWLEVEL_ERROR_REUSE_FAILED; } } /* bind socket to a specified port */ bzero(&bindme, sizeof(struct sockaddr_in6)); bindme.sin6_family = AF_INET6; bindme.sin6_port = htons(port); bindme.sin6_scope_id = ifaceid; tmp = (char*)(&bindme.sin6_addr); inet_pton6(addr, tmp); if (bind(Insock, (struct sockaddr*)&bindme, sizeof(bindme)) < 0) { sprintf(Message, "Unable to bind socket: %s", strerror(errno) ); return LOWLEVEL_ERROR_BIND_FAILED; } freeaddrinfo(res); /* multicast server stuff */ if (multicast) { hints.ai_flags = 0; if((error = getaddrinfo(addr, port_char, &hints, &res2))){ sprintf(Message, "Failed to obtain getaddrinfo"); return LOWLEVEL_ERROR_GETADDRINFO; } memset(&mreq6, 0, sizeof(mreq6)); mreq6.ipv6mr_interface = ifaceid; memcpy(&mreq6.ipv6mr_multiaddr, &((struct sockaddr_in6 *)res2->ai_addr)->sin6_addr, sizeof(mreq6.ipv6mr_multiaddr)); /* Add to the all agent multicast address */ if (setsockopt(Insock, IPPROTO_IPV6, IPV6_ADD_MEMBERSHIP, &mreq6, sizeof(mreq6))) { sprintf(Message, "error joining ipv6 group"); return LOWLEVEL_ERROR_MCAST_MEMBERSHIP; } freeaddrinfo(res2); } return Insock; } int sock_del(int fd) { return close(fd); } int sock_send(int sock, char *addr, char *buf, int message_len, int port, int iface ) { struct addrinfo hints, *res; int result; char cport[10]; sprintf(cport,"%d",port); memset(&hints, 0, sizeof(hints)); hints.ai_family = PF_INET6; hints.ai_socktype = SOCK_DGRAM; if (getaddrinfo(addr, cport, &hints, &res) < 0) { return -1; /* Error in transmitting */ } result = sendto(sock, buf, message_len, 0, res->ai_addr, res->ai_addrlen); freeaddrinfo(res); if (result<0) { sprintf(Message, "Unable to send data (dst addr: %s)", addr); return LOWLEVEL_ERROR_SOCKET; } return LOWLEVEL_NO_ERROR; } /* * */ int sock_recv(int fd, char * myPlainAddr, char * peerPlainAddr, char * buf, int buflen) { struct msghdr msg; /* message received by recvmsg */ struct sockaddr_in6 peerAddr; /* sender address */ struct sockaddr_in6 myAddr; /* my address */ struct iovec iov; /* simple structure containing buffer address and length */ struct cmsghdr *cm; /* control message */ struct in6_pktinfo *pktinfo; char control[CMSG_SPACE(sizeof(struct in6_pktinfo))]; char controlLen = CMSG_SPACE(sizeof(struct in6_pktinfo)); int result = 0; bzero(&msg, sizeof(msg)); bzero(&peerAddr, sizeof(peerAddr)); bzero(&myAddr, sizeof(myAddr)); bzero(&control, sizeof(control)); iov.iov_base = buf; iov.iov_len = buflen; msg.msg_name = &peerAddr; msg.msg_namelen = sizeof(peerAddr); msg.msg_iov = &iov; msg.msg_iovlen = 1; msg.msg_control = control; msg.msg_controllen = controlLen; result = recvmsg(fd, &msg, 0); if (result==-1) { return LOWLEVEL_ERROR_UNSPEC; } /* get source address */ inet_ntop6((void*)&peerAddr.sin6_addr, peerPlainAddr); /* get destination address */ for(cm = (struct cmsghdr *) CMSG_FIRSTHDR(&msg); cm; cm = (struct cmsghdr *) CMSG_NXTHDR(&msg, cm)){ if (cm->cmsg_level != IPPROTO_IPV6 || cm->cmsg_type != IPV6_PKTINFO) continue; pktinfo= (struct in6_pktinfo *) (CMSG_DATA(cm)); inet_ntop6((void*)&pktinfo->ipi6_addr, myPlainAddr); } return result; } void microsleep(int microsecs) { struct timespec x,y; x.tv_sec = (int) microsecs / 1000000; x.tv_nsec = ( microsecs - x.tv_sec*1000000) * 1000; nanosleep(&x,&y); } /* * returns: -1 - address not found, 0 - addr is ok, 1 - addr is tentative */ int is_addr_tentative(char * ifacename, int iface, char * addr) { char buf[256]; char packed1[16]; char packed2[16]; struct rtattr * rta_tb[IFA_MAX+1]; struct nlmsg_list *ainfo = NULL; struct nlmsg_list *head = NULL; struct rtnl_handle rth; int tentative = LOWLEVEL_TENTATIVE_DONT_KNOW; inet_pton6(addr,packed1); rtnl_open(&rth, 0); /* 2nd attribute: AF_UNSPEC, AF_INET, AF_INET6 */ /* rtnl_wilddump_request(&rth, AF_PACKET, RTM_GETLINK); */ rtnl_wilddump_request(&rth, AF_INET6, RTM_GETADDR); rtnl_dump_filter(&rth, store_nlmsg, &ainfo, NULL, NULL); head = ainfo; while (ainfo) { struct nlmsghdr *n = &ainfo->h; struct ifaddrmsg *ifa = NLMSG_DATA(n); memset(rta_tb, 0, sizeof(*rta_tb)); if (ifa->ifa_index == iface && ifa->ifa_family==AF_INET6) { parse_rtattr(rta_tb, IFA_MAX, IFA_RTA(ifa), n->nlmsg_len - NLMSG_LENGTH(sizeof(*ifa))); if (!rta_tb[IFA_LOCAL]) rta_tb[IFA_LOCAL] = rta_tb[IFA_ADDRESS]; if (!rta_tb[IFA_ADDRESS]) rta_tb[IFA_ADDRESS] = rta_tb[IFA_LOCAL]; inet_ntop6(RTA_DATA(rta_tb[IFA_LOCAL]), buf /*, sizeof(buf)*/); memcpy(packed2,RTA_DATA(rta_tb[IFA_LOCAL]),16); /* print_packed(packed1); printf(" "); print_packed(packed2); printf("\n"); */ /* is this addr which are we looking for? */ if (!memcmp(packed1,packed2,16) ) { if (ifa->ifa_flags & IFA_F_TENTATIVE) tentative = LOWLEVEL_TENTATIVE_YES; else tentative = LOWLEVEL_TENTATIVE_NO; } } ainfo = ainfo->next; } /* now delete list */ while (head) { ainfo = head; head = head->next; free(ainfo); } rtnl_close(&rth); return tentative; } char * getAAAKeyFilename(uint32_t SPI) { static char filename[1024]; if (SPI != 0) snprintf(filename, 1024, "%s%s%08x", "/var/lib/dibbler/AAA/", "AAA-key-", SPI); else strcpy(filename, "/var/lib/dibbler/AAA/AAA-key"); return filename; } char * getAAAKey(uint32_t SPI, unsigned *len) { char * filename = 0; struct stat st; char * retval; int offset = 0; int fd; int ret; filename = getAAAKeyFilename(SPI); if (stat(filename, &st)) return NULL; fd = open(filename, O_RDONLY); if (0 > fd) return NULL; retval = malloc(st.st_size); if (!retval) { close(fd); return NULL; } while (offset < st.st_size) { ret = read(fd, retval + offset, st.st_size - offset); if (!ret) break; if (ret < 0) { close(fd); free(retval); return NULL; } offset += ret; } close(fd); if (offset != st.st_size) { free(retval); return NULL; } *len = st.st_size; return retval; } char * error_message() { return Message; } int get_mac_from_ipv6(const char* iface_name, int ifindex, const char* v6addr, char* mac, int* mac_len) { /// @todo: Implement this for Linux /// see "/sbin/ip -6 neigh" return LOWLEVEL_ERROR_NOT_IMPLEMENTED; } /* iproute.c dummy link section */ int show_stats = 0; /* to disable iproute.c messages */ int preferred_family = AF_INET6; char* rtnl_rtntype_n2a(int id, char *buf, int len) { return 0;} char* rtnl_dsfield_n2a(int id, char *buf, int len) { return 0;} char* rtnl_rttable_n2a(int id, char *buf, int len) { return 0;} char* rtnl_rtprot_n2a(int id, char *buf, int len) { return 0;} char* rtnl_rtscope_n2a(int id, char *buf, int len) { return 0;} char* rtnl_rtrealm_n2a(int id, char *buf, int len) { return 0;} int rtnl_rtprot_a2n(__u32 *id, char *arg) { return 0; } int rtnl_rtscope_a2n(__u32 *id, char *arg) { return 0; } int rtnl_rttable_a2n(__u32 *id, char *arg) { return 0; } int rtnl_rtrealm_a2n(__u32 *id, char *arg) { return 0; } int rtnl_dsfield_a2n(__u32 *id, char *arg) { return 0; } int rtnl_rtntype_a2n(int *id, char *arg) { return 0; } int get_rt_realms(__u32 *realms, char *arg){ return 0; } int default_scope(inet_prefix *lcl) { return 0; } char * _SL_; int dnet_pton(int af, const char *src, void *addr) { return 0; } const char *dnet_ntop(int af, const void *addr, char *str, size_t len){ return 0; } const char *ipx_ntop(int af, const void *addr, char *str, size_t len) { return 0; } #ifdef DEBUG #include /* [Thomson: very clever function. It prints backtrace. Done by Michal Kowalczuk.] */ void print_trace(void) { void *array[10]; size_t size; size = backtrace (array, 10); backtrace_symbols_fd (array, size, 1); } #endif dibbler-1.0.1/Port-linux/libnetlink.h0000664000175000017500000000411312233256142014423 00000000000000#ifndef __LIBNETLINK_H__ #define __LIBNETLINK_H__ 1 #include #include #include struct rtnl_handle { int fd; struct sockaddr_nl local; struct sockaddr_nl peer; __u32 seq; __u32 dump; }; extern int rtnl_open(struct rtnl_handle *rth, unsigned subscriptions); extern int rtnl_open_byproto(struct rtnl_handle *rth, unsigned subscriptions, int protocol); extern void rtnl_close(struct rtnl_handle *rth); extern int rtnl_wilddump_request(struct rtnl_handle *rth, int fam, int type); extern int rtnl_dump_request(struct rtnl_handle *rth, int type, void *req, int len); typedef int (*rtnl_filter_t)(const struct sockaddr_nl *, struct nlmsghdr *n, void *); extern int rtnl_dump_filter(struct rtnl_handle *rth, rtnl_filter_t filter, void *arg1, rtnl_filter_t junk, void *arg2); extern int rtnl_talk(struct rtnl_handle *rtnl, struct nlmsghdr *n, pid_t peer, unsigned groups, struct nlmsghdr *answer, rtnl_filter_t junk, void *jarg); extern int rtnl_send(struct rtnl_handle *rth, const char *buf, int); extern int addattr32(struct nlmsghdr *n, int maxlen, int type, __u32 data); extern int addattr_l(struct nlmsghdr *n, int maxlen, int type, const void *data, int alen); extern int addraw_l(struct nlmsghdr *n, int maxlen, const void *data, int len); extern int rta_addattr32(struct rtattr *rta, int maxlen, int type, __u32 data); extern int rta_addattr_l(struct rtattr *rta, int maxlen, int type, const void *data, int alen); extern int parse_rtattr(struct rtattr *tb[], int max, struct rtattr *rta, int len); extern int parse_rtattr_byindex(struct rtattr *tb[], int max, struct rtattr *rta, int len); #define parse_rtattr_nested(tb, max, rta) \ (parse_rtattr((tb), (max), RTA_DATA(rta), RTA_PAYLOAD(rta))) extern int rtnl_listen(struct rtnl_handle *, rtnl_filter_t handler, void *jarg); extern int rtnl_from_file(FILE *, rtnl_filter_t handler, void *jarg); #define NLMSG_TAIL(nmsg) \ ((struct rtattr *) (((char *) (nmsg)) + NLMSG_ALIGN((nmsg)->nlmsg_len))) #endif /* __LIBNETLINK_H__ */ dibbler-1.0.1/Port-linux/dibbler-server.cpp0000664000175000017500000000614212556247252015550 00000000000000/* * Dibbler - a portable DHCPv6 * * authors: Tomasz Mrugalski * Marek Senderski * * released under GNU GPL v2 only licence * */ #include #include #include #include #include "DHCPServer.h" #include "Portable.h" #include "Logger.h" #include "daemon.h" using namespace std; TDHCPServer * ptr = 0; /// the default working directory std::string WORKDIR(DEFAULT_WORKDIR); void signal_handler(int n) { Log(Crit) << "Signal received. Shutting down." << LogEnd; ptr->stop(); } int status() { pid_t pid = getServerPID(); if (pid==-1) { cout << "Dibbler server: NOT RUNNING." << endl; } else { cout << "Dibbler server: RUNNING, pid=" << pid << endl; } int result = (pid>0)? 0: -1; pid = getClientPID(); if (pid==-1) { cout << "Dibbler client: NOT RUNNING." << endl; } else { cout << "Dibbler client: RUNNING, pid=" << pid << endl; } pid = getRelayPID(); if (pid==-1) { cout << "Dibbler relay : NOT RUNNING." << endl; } else { cout << "Dibbler relay : RUNNING, pid=" << pid << endl; } return result; } int run() { if (!init(SRVPID_FILE, WORKDIR.c_str())) { die(SRVPID_FILE); return -1; } TDHCPServer srv(SRVCONF_FILE); ptr = &srv; if (ptr->isDone()) { die(SRVPID_FILE); return -1; } // connect signals signal(SIGTERM, signal_handler); signal(SIGINT, signal_handler); ptr->run(); die(SRVPID_FILE); return 0; } int help() { cout << "Usage:" << endl; cout << " dibbler-server ACTION" << endl << " ACTION = status|start|stop|run" << endl << " status - show status and exit" << endl << " start - start installed service" << endl << " stop - stop installed service" << endl << " install - Not available in Linux/Unix systems." << endl << " uninstall - Not available in Linux/Unix systems." << endl << " run - run in the console" << endl << " help - displays usage info." << endl; return 0; } int main(int argc, char * argv[]) { char command[256]; int result=-1; logStart("(SERVER, Linux port)", "Server", SRVLOG_FILE); // parse command line parameters if (argc>1) { int len = strlen(argv[1])+1; if (len>255) len = 255; strncpy(command,argv[1],len); } else { memset(command,0,256); } if (!strncasecmp(command,"start",5) ) { result = start(SRVPID_FILE, WORKDIR.c_str()); } else if (!strncasecmp(command,"run",3) ) { result = run(); } else if (!strncasecmp(command,"stop",4)) { result = stop(SRVPID_FILE); } else if (!strncasecmp(command,"status",6)) { result = status(); } else if (!strncasecmp(command,"help",4)) { result = help(); } else if (!strncasecmp(command,"install",7)) { cout << "Function not available in Linux/Unix systems." << endl; result = 0; } else if (!strncasecmp(command,"uninstall",9)) { cout << "Function not available in Linux/Unix systems." << endl; result = 0; } else { help(); } logEnd(); return result? EXIT_FAILURE : EXIT_SUCCESS; } dibbler-1.0.1/Port-linux/Makefile.am0000644000175000017500000000126312277722750014167 00000000000000noinst_LIBRARIES = libLowLevel.a libLowLevel_a_CFLAGS = -std=c99 libLowLevel_a_CPPFLAGS = -I$(top_srcdir)/Misc libLowLevel_a_SOURCES = daemon.cpp daemon.h ethtool-kernel.h ethtool-local.h interface.c interface.h ip_common.h iproute.c libnetlink.c libnetlink.h ll_map.c ll_map.h ll_types.c lowlevel-linux.c lowlevel-linux-link-state.c lowlevel-options-linux.c rtm_map.h rt_names.h utils.c utils.h # that's ugly hack. Those files should not be built here. They are compiled during link of respective daemons. # As far as this makefile is concerned, they should be treated as data, so they are included in make dist dist_noinst_DATA = dibbler-client.cpp dibbler-relay.cpp dibbler-server.cpp dibbler-1.0.1/Port-linux/ip_common.h0000664000175000017500000000242612233256142014255 00000000000000extern int print_linkinfo(const struct sockaddr_nl *who, struct nlmsghdr *n, void *arg); extern int print_addrinfo(const struct sockaddr_nl *who, struct nlmsghdr *n, void *arg); extern int print_neigh(const struct sockaddr_nl *who, struct nlmsghdr *n, void *arg); extern int ipaddr_list(int argc, char **argv); extern int ipaddr_list_link(int argc, char **argv); extern int iproute_monitor(int argc, char **argv); extern void iplink_usage(void) __attribute__((noreturn)); extern void iproute_reset_filter(void); extern void ipaddr_reset_filter(int); extern void ipneigh_reset_filter(void); extern int print_route(const struct sockaddr_nl *who, struct nlmsghdr *n, void *arg); extern int print_prefix(const struct sockaddr_nl *who, struct nlmsghdr *n, void *arg); extern int do_ipaddr(int argc, char **argv); extern int do_iproute(int argc, char **argv); extern int do_iprule(int argc, char **argv); extern int do_ipneigh(int argc, char **argv); extern int do_iptunnel(int argc, char **argv); extern int do_iplink(int argc, char **argv); extern int do_ipmonitor(int argc, char **argv); extern int do_multiaddr(int argc, char **argv); extern int do_multiroute(int argc, char **argv); extern int do_xfrm(int argc, char **argv); extern struct rtnl_handle rth; dibbler-1.0.1/Port-linux/libnetlink.c0000664000175000017500000003177412233256142014433 00000000000000/* * libnetlink.c RTnetlink service routines. * * 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. * * Authors: Alexey Kuznetsov, * */ #include #include #include #include #include #include #include #include #include #include #include #include #include "libnetlink.h" void rtnl_close(struct rtnl_handle *rth) { close(rth->fd); } int rtnl_open_byproto(struct rtnl_handle *rth, unsigned subscriptions, int protocol) { socklen_t addr_len; int sndbuf = 32768; int rcvbuf = 32768; memset(rth, 0, sizeof(struct rtnl_handle)); rth->fd = socket(AF_NETLINK, SOCK_RAW, protocol); if (rth->fd < 0) { perror("Cannot open netlink socket"); return -1; } if (setsockopt(rth->fd,SOL_SOCKET,SO_SNDBUF,&sndbuf,sizeof(sndbuf)) < 0) { perror("SO_SNDBUF"); return -1; } if (setsockopt(rth->fd,SOL_SOCKET,SO_RCVBUF,&rcvbuf,sizeof(rcvbuf)) < 0) { perror("SO_RCVBUF"); return -1; } memset(&rth->local, 0, sizeof(rth->local)); rth->local.nl_family = AF_NETLINK; rth->local.nl_groups = subscriptions; if (bind(rth->fd, (struct sockaddr*)&rth->local, sizeof(rth->local)) < 0) { perror("Cannot bind netlink socket"); return -1; } addr_len = sizeof(rth->local); if (getsockname(rth->fd, (struct sockaddr*)&rth->local, &addr_len) < 0) { perror("Cannot getsockname"); return -1; } if (addr_len != sizeof(rth->local)) { fprintf(stderr, "Wrong address length %d\n", addr_len); return -1; } if (rth->local.nl_family != AF_NETLINK) { fprintf(stderr, "Wrong address family %d\n", rth->local.nl_family); return -1; } rth->seq = time(NULL); return 0; } int rtnl_open(struct rtnl_handle *rth, unsigned subscriptions) { return rtnl_open_byproto(rth, subscriptions, NETLINK_ROUTE); } int rtnl_wilddump_request(struct rtnl_handle *rth, int family, int type) { struct { struct nlmsghdr nlh; struct rtgenmsg g; } req; struct sockaddr_nl nladdr; memset(&nladdr, 0, sizeof(nladdr)); nladdr.nl_family = AF_NETLINK; memset(&req, 0, sizeof(req)); req.nlh.nlmsg_len = sizeof(req); req.nlh.nlmsg_type = type; req.nlh.nlmsg_flags = NLM_F_ROOT|NLM_F_MATCH|NLM_F_REQUEST; req.nlh.nlmsg_pid = 0; req.nlh.nlmsg_seq = rth->dump = ++rth->seq; req.g.rtgen_family = family; return sendto(rth->fd, (void*)&req, sizeof(req), 0, (struct sockaddr*)&nladdr, sizeof(nladdr)); } int rtnl_send(struct rtnl_handle *rth, const char *buf, int len) { struct sockaddr_nl nladdr; memset(&nladdr, 0, sizeof(nladdr)); nladdr.nl_family = AF_NETLINK; return sendto(rth->fd, buf, len, 0, (struct sockaddr*)&nladdr, sizeof(nladdr)); } int rtnl_dump_request(struct rtnl_handle *rth, int type, void *req, int len) { struct nlmsghdr nlh; struct sockaddr_nl nladdr; struct iovec iov[2] = { { .iov_base = &nlh, .iov_len = sizeof(nlh) }, { .iov_base = req, .iov_len = len } }; struct msghdr msg = { .msg_name = &nladdr, .msg_namelen = sizeof(nladdr), .msg_iov = iov, .msg_iovlen = 2, }; memset(&nladdr, 0, sizeof(nladdr)); nladdr.nl_family = AF_NETLINK; nlh.nlmsg_len = NLMSG_LENGTH(len); nlh.nlmsg_type = type; nlh.nlmsg_flags = NLM_F_ROOT|NLM_F_MATCH|NLM_F_REQUEST; nlh.nlmsg_pid = 0; nlh.nlmsg_seq = rth->dump = ++rth->seq; return sendmsg(rth->fd, &msg, 0); } int rtnl_dump_filter(struct rtnl_handle *rth, rtnl_filter_t filter, void *arg1, rtnl_filter_t junk, void *arg2) { struct sockaddr_nl nladdr; struct iovec iov; struct msghdr msg = { .msg_name = &nladdr, .msg_namelen = sizeof(nladdr), .msg_iov = &iov, .msg_iovlen = 1, }; char buf[16384]; iov.iov_base = buf; while (1) { int status; struct nlmsghdr *h; iov.iov_len = sizeof(buf); status = recvmsg(rth->fd, &msg, 0); if (status < 0) { if (errno == EINTR) continue; perror("OVERRUN"); continue; } if (status == 0) { fprintf(stderr, "EOF on netlink\n"); return -1; } h = (struct nlmsghdr*)buf; while (NLMSG_OK(h, status)) { int err; if (nladdr.nl_pid != 0 || h->nlmsg_pid != rth->local.nl_pid || h->nlmsg_seq != rth->dump) { if (junk) { err = junk(&nladdr, h, arg2); if (err < 0) return err; } goto skip_it; } if (h->nlmsg_type == NLMSG_DONE) return 0; if (h->nlmsg_type == NLMSG_ERROR) { struct nlmsgerr *err = (struct nlmsgerr*)NLMSG_DATA(h); if (h->nlmsg_len < NLMSG_LENGTH(sizeof(struct nlmsgerr))) { fprintf(stderr, "ERROR truncated\n"); } else { errno = -err->error; perror("RTNETLINK answers"); } return -1; } err = filter(&nladdr, h, arg1); if (err < 0) return err; skip_it: h = NLMSG_NEXT(h, status); } if (msg.msg_flags & MSG_TRUNC) { fprintf(stderr, "Message truncated\n"); continue; } if (status) { fprintf(stderr, "!!!Remnant of size %d\n", status); exit(1); } } } int rtnl_talk(struct rtnl_handle *rtnl, struct nlmsghdr *n, pid_t peer, unsigned groups, struct nlmsghdr *answer, rtnl_filter_t junk, void *jarg) { int status; unsigned seq; struct nlmsghdr *h; struct sockaddr_nl nladdr; struct iovec iov = { .iov_base = (void*) n, .iov_len = n->nlmsg_len }; struct msghdr msg = { .msg_name = &nladdr, .msg_namelen = sizeof(nladdr), .msg_iov = &iov, .msg_iovlen = 1, }; char buf[16384]; memset(&nladdr, 0, sizeof(nladdr)); nladdr.nl_family = AF_NETLINK; nladdr.nl_pid = peer; nladdr.nl_groups = groups; n->nlmsg_seq = seq = ++rtnl->seq; if (answer == NULL) n->nlmsg_flags |= NLM_F_ACK; status = sendmsg(rtnl->fd, &msg, 0); if (status < 0) { perror("Cannot talk to rtnetlink"); return -1; } memset(buf,0,sizeof(buf)); iov.iov_base = buf; while (1) { iov.iov_len = sizeof(buf); status = recvmsg(rtnl->fd, &msg, 0); if (status < 0) { if (errno == EINTR) continue; perror("OVERRUN"); continue; } if (status == 0) { fprintf(stderr, "EOF on netlink\n"); return -1; } if (msg.msg_namelen != sizeof(nladdr)) { fprintf(stderr, "sender address length == %d\n", msg.msg_namelen); exit(1); } for (h = (struct nlmsghdr*)buf; status >= sizeof(*h); ) { int err; int len = h->nlmsg_len; int l = len - sizeof(*h); if (l<0 || len>status) { if (msg.msg_flags & MSG_TRUNC) { fprintf(stderr, "Truncated message\n"); return -1; } fprintf(stderr, "!!!malformed message: len=%d\n", len); exit(1); } if (nladdr.nl_pid != peer || h->nlmsg_pid != rtnl->local.nl_pid || h->nlmsg_seq != seq) { if (junk) { err = junk(&nladdr, h, jarg); if (err < 0) return err; } continue; } if (h->nlmsg_type == NLMSG_ERROR) { struct nlmsgerr *err = (struct nlmsgerr*)NLMSG_DATA(h); if (l < sizeof(struct nlmsgerr)) { fprintf(stderr, "ERROR truncated\n"); } else { errno = -err->error; if (errno == 0) { if (answer) memcpy(answer, h, h->nlmsg_len); return 0; } perror("RTNETLINK answers"); } return -1; } if (answer) { memcpy(answer, h, h->nlmsg_len); return 0; } fprintf(stderr, "Unexpected reply!!!\n"); status -= NLMSG_ALIGN(len); h = (struct nlmsghdr*)((char*)h + NLMSG_ALIGN(len)); } if (msg.msg_flags & MSG_TRUNC) { fprintf(stderr, "Message truncated\n"); continue; } if (status) { fprintf(stderr, "!!!Remnant of size %d\n", status); exit(1); } } } int rtnl_listen(struct rtnl_handle *rtnl, rtnl_filter_t handler, void *jarg) { int status; struct nlmsghdr *h; struct sockaddr_nl nladdr; struct iovec iov; struct msghdr msg = { .msg_name = &nladdr, .msg_namelen = sizeof(nladdr), .msg_iov = &iov, .msg_iovlen = 1, }; char buf[8192]; memset(&nladdr, 0, sizeof(nladdr)); nladdr.nl_family = AF_NETLINK; nladdr.nl_pid = 0; nladdr.nl_groups = 0; iov.iov_base = buf; while (1) { iov.iov_len = sizeof(buf); status = recvmsg(rtnl->fd, &msg, 0); if (status < 0) { if (errno == EINTR) continue; perror("OVERRUN"); continue; } if (status == 0) { fprintf(stderr, "EOF on netlink\n"); return -1; } if (msg.msg_namelen != sizeof(nladdr)) { fprintf(stderr, "Sender address length == %d\n", msg.msg_namelen); exit(1); } for (h = (struct nlmsghdr*)buf; status >= sizeof(*h); ) { int err; int len = h->nlmsg_len; int l = len - sizeof(*h); if (l<0 || len>status) { if (msg.msg_flags & MSG_TRUNC) { fprintf(stderr, "Truncated message\n"); return -1; } fprintf(stderr, "!!!malformed message: len=%d\n", len); exit(1); } err = handler(&nladdr, h, jarg); if (err < 0) return err; status -= NLMSG_ALIGN(len); h = (struct nlmsghdr*)((char*)h + NLMSG_ALIGN(len)); } if (msg.msg_flags & MSG_TRUNC) { fprintf(stderr, "Message truncated\n"); continue; } if (status) { fprintf(stderr, "!!!Remnant of size %d\n", status); exit(1); } } } int rtnl_from_file(FILE *rtnl, rtnl_filter_t handler, void *jarg) { int status; struct sockaddr_nl nladdr; char buf[8192]; struct nlmsghdr *h = (void*)buf; memset(&nladdr, 0, sizeof(nladdr)); nladdr.nl_family = AF_NETLINK; nladdr.nl_pid = 0; nladdr.nl_groups = 0; while (1) { int err, len; int l; status = fread(&buf, 1, sizeof(*h), rtnl); if (status < 0) { if (errno == EINTR) continue; perror("rtnl_from_file: fread"); return -1; } if (status == 0) return 0; len = h->nlmsg_len; /* type= h->nlmsg_type; */ l = len - sizeof(*h); if (l<0 || len>sizeof(buf)) { fprintf(stderr, "!!!malformed message: len=%d @%lu\n", len, ftell(rtnl)); return -1; } status = fread(NLMSG_DATA(h), 1, NLMSG_ALIGN(l), rtnl); if (status < 0) { perror("rtnl_from_file: fread"); return -1; } if (status < l) { fprintf(stderr, "rtnl-from_file: truncated message\n"); return -1; } err = handler(&nladdr, h, jarg); if (err < 0) return err; } } int addattr32(struct nlmsghdr *n, int maxlen, int type, __u32 data) { int len = RTA_LENGTH(4); struct rtattr *rta; if (NLMSG_ALIGN(n->nlmsg_len) + len > maxlen) { fprintf(stderr,"addattr32: Error! max allowed bound %d exceeded\n",maxlen); return -1; } rta = NLMSG_TAIL(n); rta->rta_type = type; rta->rta_len = len; memcpy(RTA_DATA(rta), &data, 4); n->nlmsg_len = NLMSG_ALIGN(n->nlmsg_len) + len; return 0; } int addattr_l(struct nlmsghdr *n, int maxlen, int type, const void *data, int alen) { int len = RTA_LENGTH(alen); struct rtattr *rta; if (NLMSG_ALIGN(n->nlmsg_len) + RTA_ALIGN(len) > maxlen) { fprintf(stderr, "addattr_l ERROR: message exceeded bound of %d\n",maxlen); return -1; } rta = NLMSG_TAIL(n); rta->rta_type = type; rta->rta_len = len; memcpy(RTA_DATA(rta), data, alen); n->nlmsg_len = NLMSG_ALIGN(n->nlmsg_len) + RTA_ALIGN(len); return 0; } int addraw_l(struct nlmsghdr *n, int maxlen, const void *data, int len) { if (NLMSG_ALIGN(n->nlmsg_len) + NLMSG_ALIGN(len) > maxlen) { fprintf(stderr, "addraw_l ERROR: message exceeded bound of %d\n",maxlen); return -1; } memcpy(NLMSG_TAIL(n), data, len); memset((char *) NLMSG_TAIL(n) + len, 0, NLMSG_ALIGN(len) - len); n->nlmsg_len = NLMSG_ALIGN(n->nlmsg_len) + NLMSG_ALIGN(len); return 0; } int rta_addattr32(struct rtattr *rta, int maxlen, int type, __u32 data) { int len = RTA_LENGTH(4); struct rtattr *subrta; if (RTA_ALIGN(rta->rta_len) + len > maxlen) { fprintf(stderr,"rta_addattr32: Error! max allowed bound %d exceeded\n",maxlen); return -1; } subrta = (struct rtattr*)(((char*)rta) + RTA_ALIGN(rta->rta_len)); subrta->rta_type = type; subrta->rta_len = len; memcpy(RTA_DATA(subrta), &data, 4); rta->rta_len = NLMSG_ALIGN(rta->rta_len) + len; return 0; } int rta_addattr_l(struct rtattr *rta, int maxlen, int type, const void *data, int alen) { struct rtattr *subrta; int len = RTA_LENGTH(alen); if (RTA_ALIGN(rta->rta_len) + RTA_ALIGN(len) > maxlen) { fprintf(stderr,"rta_addattr_l: Error! max allowed bound %d exceeded\n",maxlen); return -1; } subrta = (struct rtattr*)(((char*)rta) + RTA_ALIGN(rta->rta_len)); subrta->rta_type = type; subrta->rta_len = len; memcpy(RTA_DATA(subrta), data, alen); rta->rta_len = NLMSG_ALIGN(rta->rta_len) + RTA_ALIGN(len); return 0; } int parse_rtattr(struct rtattr *tb[], int max, struct rtattr *rta, int len) { memset(tb, 0, sizeof(struct rtattr *) * (max + 1)); while (RTA_OK(rta, len)) { if (rta->rta_type <= max) tb[rta->rta_type] = rta; rta = RTA_NEXT(rta,len); } if (len) fprintf(stderr, "!!!Deficit %d, rta_len=%d\n", len, rta->rta_len); return 0; } int parse_rtattr_byindex(struct rtattr *tb[], int max, struct rtattr *rta, int len) { int i = 0; memset(tb, 0, sizeof(struct rtattr *) * max); while (RTA_OK(rta, len)) { if (rta->rta_type <= max && i < max) tb[i++] = rta; rta = RTA_NEXT(rta,len); } if (len) fprintf(stderr, "!!!Deficit %d, rta_len=%d\n", len, rta->rta_len); return i; } dibbler-1.0.1/Port-linux/ethtool-kernel.h0000664000175000017500000002646512233256142015242 00000000000000/* * ethtool.h: Defines for Linux ethtool. * * Copyright (C) 1998 David S. Miller (davem@redhat.com) * Copyright 2001 Jeff Garzik * Portions Copyright 2001 Sun Microsystems (thockin@sun.com) * Portions Copyright 2002 Intel (eli.kupermann@intel.com, * christopher.leech@intel.com, * scott.feldman@intel.com) */ #ifndef _LINUX_ETHTOOL_H #define _LINUX_ETHTOOL_H /* This should work for both 32 and 64 bit userland. */ struct ethtool_cmd { u32 cmd; u32 supported; /* Features this interface supports */ u32 advertising; /* Features this interface advertises */ u16 speed; /* The forced speed, 10Mb, 100Mb, gigabit */ u8 duplex; /* Duplex, half or full */ u8 port; /* Which connector port */ u8 phy_address; u8 transceiver; /* Which tranceiver to use */ u8 autoneg; /* Enable or disable autonegotiation */ u32 maxtxpkt; /* Tx pkts before generating tx int */ u32 maxrxpkt; /* Rx pkts before generating rx int */ u32 reserved[4]; }; #define ETHTOOL_BUSINFO_LEN 32 /* these strings are set to whatever the driver author decides... */ struct ethtool_drvinfo { u32 cmd; char driver[32]; /* driver short name, "tulip", "eepro100" */ char version[32]; /* driver version string */ char fw_version[32]; /* firmware version string, if applicable */ char bus_info[ETHTOOL_BUSINFO_LEN]; /* Bus info for this IF. */ /* For PCI devices, use pci_dev->slot_name. */ char reserved1[32]; char reserved2[20]; u32 testinfo_len; u32 eedump_len; /* Size of data from ETHTOOL_GEEPROM (bytes) */ u32 regdump_len; /* Size of data from ETHTOOL_GREGS (bytes) */ }; #define SOPASS_MAX 6 /* wake-on-lan settings */ struct ethtool_wolinfo { u32 cmd; u32 supported; u32 wolopts; u8 sopass[SOPASS_MAX]; /* SecureOn(tm) password */ }; /* for passing single values */ struct ethtool_value { u32 cmd; u32 data; }; /* for passing big chunks of data */ struct ethtool_regs { u32 cmd; u32 version; /* driver-specific, indicates different chips/revs */ u32 len; /* bytes */ u8 data[]; /* thomson: was data[0] */ }; /* for passing EEPROM chunks */ struct ethtool_eeprom { u32 cmd; u32 magic; u32 offset; /* in bytes */ u32 len; /* in bytes */ u8 data[]; /* thomson: was data[0] */ }; /* for configuring coalescing parameters of chip */ struct ethtool_coalesce { u32 cmd; /* ETHTOOL_{G,S}COALESCE */ /* How many usecs to delay an RX interrupt after * a packet arrives. If 0, only rx_max_coalesced_frames * is used. */ u32 rx_coalesce_usecs; /* How many packets to delay an RX interrupt after * a packet arrives. If 0, only rx_coalesce_usecs is * used. It is illegal to set both usecs and max frames * to zero as this would cause RX interrupts to never be * generated. */ u32 rx_max_coalesced_frames; /* Same as above two parameters, except that these values * apply while an IRQ is being services by the host. Not * all cards support this feature and the values are ignored * in that case. */ u32 rx_coalesce_usecs_irq; u32 rx_max_coalesced_frames_irq; /* How many usecs to delay a TX interrupt after * a packet is sent. If 0, only tx_max_coalesced_frames * is used. */ u32 tx_coalesce_usecs; /* How many packets to delay a TX interrupt after * a packet is sent. If 0, only tx_coalesce_usecs is * used. It is illegal to set both usecs and max frames * to zero as this would cause TX interrupts to never be * generated. */ u32 tx_max_coalesced_frames; /* Same as above two parameters, except that these values * apply while an IRQ is being services by the host. Not * all cards support this feature and the values are ignored * in that case. */ u32 tx_coalesce_usecs_irq; u32 tx_max_coalesced_frames_irq; /* How many usecs to delay in-memory statistics * block updates. Some drivers do not have an in-memory * statistic block, and in such cases this value is ignored. * This value must not be zero. */ u32 stats_block_coalesce_usecs; /* Adaptive RX/TX coalescing is an algorithm implemented by * some drivers to improve latency under low packet rates and * improve throughput under high packet rates. Some drivers * only implement one of RX or TX adaptive coalescing. Anything * not implemented by the driver causes these values to be * silently ignored. */ u32 use_adaptive_rx_coalesce; u32 use_adaptive_tx_coalesce; /* When the packet rate (measured in packets per second) * is below pkt_rate_low, the {rx,tx}_*_low parameters are * used. */ u32 pkt_rate_low; u32 rx_coalesce_usecs_low; u32 rx_max_coalesced_frames_low; u32 tx_coalesce_usecs_low; u32 tx_max_coalesced_frames_low; /* When the packet rate is below pkt_rate_high but above * pkt_rate_low (both measured in packets per second) the * normal {rx,tx}_* coalescing parameters are used. */ /* When the packet rate is (measured in packets per second) * is above pkt_rate_high, the {rx,tx}_*_high parameters are * used. */ u32 pkt_rate_high; u32 rx_coalesce_usecs_high; u32 rx_max_coalesced_frames_high; u32 tx_coalesce_usecs_high; u32 tx_max_coalesced_frames_high; /* How often to do adaptive coalescing packet rate sampling, * measured in seconds. Must not be zero. */ u32 rate_sample_interval; }; /* for configuring RX/TX ring parameters */ struct ethtool_ringparam { u32 cmd; /* ETHTOOL_{G,S}RINGPARAM */ /* Read only attributes. These indicate the maximum number * of pending RX/TX ring entries the driver will allow the * user to set. */ u32 rx_max_pending; u32 rx_mini_max_pending; u32 rx_jumbo_max_pending; u32 tx_max_pending; /* Values changeable by the user. The valid values are * in the range 1 to the "*_max_pending" counterpart above. */ u32 rx_pending; u32 rx_mini_pending; u32 rx_jumbo_pending; u32 tx_pending; }; /* for configuring link flow control parameters */ struct ethtool_pauseparam { u32 cmd; /* ETHTOOL_{G,S}PAUSEPARAM */ /* If the link is being auto-negotiated (via ethtool_cmd.autoneg * being true) the user may set 'autonet' here non-zero to have the * pause parameters be auto-negotiated too. In such a case, the * {rx,tx}_pause values below determine what capabilities are * advertised. * * If 'autoneg' is zero or the link is not being auto-negotiated, * then {rx,tx}_pause force the driver to use/not-use pause * flow control. */ u32 autoneg; u32 rx_pause; u32 tx_pause; }; #define ETH_GSTRING_LEN 32 enum ethtool_stringset { ETH_SS_TEST = 0, ETH_SS_STATS, }; /* for passing string sets for data tagging */ struct ethtool_gstrings { u32 cmd; /* ETHTOOL_GSTRINGS */ u32 string_set; /* string set id e.c. ETH_SS_TEST, etc*/ u32 len; /* number of strings in the string set */ u8 data[]; /* thomson: was data[0] */ }; enum ethtool_test_flags { ETH_TEST_FL_OFFLINE = (1 << 0), /* online / offline */ ETH_TEST_FL_FAILED = (1 << 1), /* test passed / failed */ }; /* for requesting NIC test and getting results*/ struct ethtool_test { u32 cmd; /* ETHTOOL_TEST */ u32 flags; /* ETH_TEST_FL_xxx */ u32 reserved; u32 len; /* result length, in number of u64 elements */ u64 data[]; /* thomson: was data[0] */ }; /* CMDs currently supported */ #define ETHTOOL_GSET 0x00000001 /* Get settings. */ #define ETHTOOL_SSET 0x00000002 /* Set settings, privileged. */ #define ETHTOOL_GDRVINFO 0x00000003 /* Get driver info. */ #define ETHTOOL_GREGS 0x00000004 /* Get NIC registers, privileged. */ #define ETHTOOL_GWOL 0x00000005 /* Get wake-on-lan options. */ #define ETHTOOL_SWOL 0x00000006 /* Set wake-on-lan options, priv. */ #define ETHTOOL_GMSGLVL 0x00000007 /* Get driver message level */ #define ETHTOOL_SMSGLVL 0x00000008 /* Set driver msg level, priv. */ #define ETHTOOL_NWAY_RST 0x00000009 /* Restart autonegotiation, priv. */ #define ETHTOOL_GLINK 0x0000000a /* Get link status (ethtool_value) */ #define ETHTOOL_GEEPROM 0x0000000b /* Get EEPROM data */ #define ETHTOOL_SEEPROM 0x0000000c /* Set EEPROM data, priv. */ #define ETHTOOL_GCOALESCE 0x0000000e /* Get coalesce config */ #define ETHTOOL_SCOALESCE 0x0000000f /* Set coalesce config, priv. */ #define ETHTOOL_GRINGPARAM 0x00000010 /* Get ring parameters */ #define ETHTOOL_SRINGPARAM 0x00000011 /* Set ring parameters, priv. */ #define ETHTOOL_GPAUSEPARAM 0x00000012 /* Get pause parameters */ #define ETHTOOL_SPAUSEPARAM 0x00000013 /* Set pause parameters, priv. */ #define ETHTOOL_GRXCSUM 0x00000014 /* Get RX hw csum enable (ethtool_value) */ #define ETHTOOL_SRXCSUM 0x00000015 /* Set RX hw csum enable (ethtool_value) */ #define ETHTOOL_GTXCSUM 0x00000016 /* Get TX hw csum enable (ethtool_value) */ #define ETHTOOL_STXCSUM 0x00000017 /* Set TX hw csum enable (ethtool_value) */ #define ETHTOOL_GSG 0x00000018 /* Get scatter-gather enable * (ethtool_value) */ #define ETHTOOL_SSG 0x00000019 /* Set scatter-gather enable * (ethtool_value), priv. */ #define ETHTOOL_TEST 0x0000001a /* execute NIC self-test, priv. */ #define ETHTOOL_GSTRINGS 0x0000001b /* get specified string set */ #define ETHTOOL_PHYS_ID 0x0000001c /* identify the NIC */ /* compatibility with older code */ #define SPARC_ETH_GSET ETHTOOL_GSET #define SPARC_ETH_SSET ETHTOOL_SSET /* Indicates what features are supported by the interface. */ #define SUPPORTED_10baseT_Half (1 << 0) #define SUPPORTED_10baseT_Full (1 << 1) #define SUPPORTED_100baseT_Half (1 << 2) #define SUPPORTED_100baseT_Full (1 << 3) #define SUPPORTED_1000baseT_Half (1 << 4) #define SUPPORTED_1000baseT_Full (1 << 5) #define SUPPORTED_Autoneg (1 << 6) #define SUPPORTED_TP (1 << 7) #define SUPPORTED_AUI (1 << 8) #define SUPPORTED_MII (1 << 9) #define SUPPORTED_FIBRE (1 << 10) #define SUPPORTED_BNC (1 << 11) /* Indicates what features are advertised by the interface. */ #define ADVERTISED_10baseT_Half (1 << 0) #define ADVERTISED_10baseT_Full (1 << 1) #define ADVERTISED_100baseT_Half (1 << 2) #define ADVERTISED_100baseT_Full (1 << 3) #define ADVERTISED_1000baseT_Half (1 << 4) #define ADVERTISED_1000baseT_Full (1 << 5) #define ADVERTISED_Autoneg (1 << 6) #define ADVERTISED_TP (1 << 7) #define ADVERTISED_AUI (1 << 8) #define ADVERTISED_MII (1 << 9) #define ADVERTISED_FIBRE (1 << 10) #define ADVERTISED_BNC (1 << 11) /* The following are all involved in forcing a particular link * mode for the device for setting things. When getting the * devices settings, these indicate the current mode and whether * it was foced up into this mode or autonegotiated. */ /* The forced speed, 10Mb, 100Mb, gigabit. */ #define SPEED_10 10 #define SPEED_100 100 #define SPEED_1000 1000 /* Duplex, half or full. */ #define DUPLEX_HALF 0x00 #define DUPLEX_FULL 0x01 /* Which connector port. */ #define PORT_TP 0x00 #define PORT_AUI 0x01 #define PORT_MII 0x02 #define PORT_FIBRE 0x03 #define PORT_BNC 0x04 /* Which tranceiver to use. */ #define XCVR_INTERNAL 0x00 #define XCVR_EXTERNAL 0x01 #define XCVR_DUMMY1 0x02 #define XCVR_DUMMY2 0x03 #define XCVR_DUMMY3 0x04 /* Enable or disable autonegotiation. If this is set to enable, * the forced link modes above are completely ignored. */ #define AUTONEG_DISABLE 0x00 #define AUTONEG_ENABLE 0x01 /* Wake-On-Lan options. */ #define WAKE_PHY (1 << 0) #define WAKE_UCAST (1 << 1) #define WAKE_MCAST (1 << 2) #define WAKE_BCAST (1 << 3) #define WAKE_ARP (1 << 4) #define WAKE_MAGIC (1 << 5) #define WAKE_MAGICSECURE (1 << 6) /* only meaningful if WAKE_MAGIC */ #endif /* _LINUX_ETHTOOL_H */ dibbler-1.0.1/Port-linux/ethtool-local.h0000664000175000017500000000200712233256142015036 00000000000000#ifndef fooethtoollocalhfoo #define fooethtoollocalhfoo /* $Id: ethtool-local.h,v 1.1 2009-03-24 23:32:29 thomson Exp $ */ /* * This file is part of ifplugd. * * ifplugd 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. * * ifplugd 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 ifplugd; if not, write to the Free Software Foundation, * Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ typedef unsigned long long u64; typedef __uint32_t u32; typedef __uint16_t u16; typedef __uint8_t u8; #include "ethtool-kernel.h" #endif dibbler-1.0.1/Port-linux/dibbler-client.cpp0000664000175000017500000001224012474450745015516 00000000000000/* * Dibbler - a portable DHCPv6 * * authors: Tomasz Mrugalski * * released under GNU GPL v2 only licence * */ #include #include #include #include #include #include #include #include "DHCPClient.h" #include "Portable.h" #include "Logger.h" #include "daemon.h" #include "ClntCfgMgr.h" #include #include using namespace std; #define IF_RECONNECTED_DETECTED -1 extern pthread_mutex_t lock; TDHCPClient* ptr = 0; std::string WORKDIR(DEFAULT_WORKDIR); std::string CLNTCONF_FILE(DEFAULT_CLNTCONF_FILE); std::string CLNTLOG_FILE(DEFAULT_CLNTLOG_FILE); std::string CLNTPID_FILE(DEFAULT_CLNTPID_FILE); void signal_handler(int n) { Log(Crit) << "Signal received. Shutting down." << LogEnd; ptr->stop(); } #ifdef MOD_CLNT_CONFIRM void signal_handler_of_linkstate_change(int n) { Log(Notice) << "Network switch off event detected. initiating CONFIRM." << LogEnd; pthread_mutex_lock(&lock); pthread_mutex_unlock(&lock); } #endif int status() { pid_t pid = getServerPID(); if (pid==-1) { cout << "Dibbler server: NOT RUNNING." << endl; } else { cout << "Dibbler server: RUNNING, pid=" << pid << endl; } pid = getClientPID(); if (pid==-1) { cout << "Dibbler client: NOT RUNNING." << endl; } else { cout << "Dibbler client: RUNNING, pid=" << pid << endl; } int result = (pid > 0)? 0: -1; pid = getRelayPID(); if (pid==-1) { cout << "Dibbler relay : NOT RUNNING." << endl; } else { cout << "Dibbler relay : RUNNING, pid=" << pid << endl; } return result; } int run() { if (!init(CLNTPID_FILE.c_str(), WORKDIR.c_str())) { die(CLNTPID_FILE.c_str()); return -1; } // Change attribs to the client file: 644 (user=rw, group=r, other=r) chmod(CLNTPID_FILE.c_str(), S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH); if (lowlevelInit()<0) { cout << "Lowlevel init failed:" << error_message() << endl; die(CLNTPID_FILE.c_str()); return -1; } TDHCPClient client(CLNTCONF_FILE.c_str()); ptr = &client; if (ptr->isDone()) { die(CLNTPID_FILE.c_str()); return -1; } // connect signals (SIGTERM, SIGINT = shutdown) signal(SIGTERM, signal_handler); signal(SIGINT, signal_handler); #ifdef MOD_CLNT_CONFIRM // CHANGED: add a signal handling function to handle SIGUSR1, // which will be generated if network switch off. // SIGUSR1 = link state-change signal(SIGUSR1, signal_handler_of_linkstate_change); Log(Notice) << "CONFIRM support compiled in." << LogEnd; #else Log(Info) << "CONFIRM support not compiled in." << LogEnd; #endif ptr->run(); lowlevelExit(); die(CLNTPID_FILE.c_str()); return 0; } int help() { cout << "Usage:" << endl; cout << " dibbler-client ACTION [OPTION]" << endl << " ACTION = status|start|stop|install|uninstall|run" << endl << " status - show status and exit" << endl << " start - start installed service" << endl << " stop - stop installed service" << endl << " install - Not available in Linux/Unix systems." << endl << " uninstall - Not available in Linux/Unix systems." << endl << " run - run in the console" << endl << " help - displays usage info." << endl << endl << " OPTION = -w " << endl << " -w - specify the client's working directory." << endl; return 0; } int main(int argc, char * argv[]) { int result = -1; // If at least one parameter (command) is not specified, then... if (argc < 2) { help(); return EXIT_FAILURE; } // The first parameter is command const char* command = argv[1]; // Let's parse additional commands if specified if (argc > 2) { int c; // Let's go through any additional command line options. while ((c = getopt(argc-1, argv + 1, "w:")) != -1) { switch (c) { case 'w': WORKDIR = string(optarg); CLNTPID_FILE = string(optarg) + "/client.pid"; CLNTCONF_FILE = string(optarg) + "/client.conf"; CLNTLOG_FILE = string(optarg) + "/client.log"; break; default: help(); return result ? EXIT_FAILURE: EXIT_SUCCESS; } } } logStart("(CLIENT, Linux port)", "Client", CLNTLOG_FILE.c_str()); if (!strncasecmp(command,"start",5) ) { result = start(CLNTPID_FILE.c_str(), WORKDIR.c_str()); } else if (!strncasecmp(command,"run",3) ) { result = run(); } else if (!strncasecmp(command,"stop",4)) { result = stop(CLNTPID_FILE.c_str()); } else if (!strncasecmp(command,"status",6)) { result = status(); } else if (!strncasecmp(command,"help",4)) { result = help(); } else if (!strncasecmp(command,"install",7)) { cout << "Function not available in Linux/Unix systems." << endl; result = 0; } else if (!strncasecmp(command,"uninstall",9)) { cout << "Function not available in Linux/Unix systems." << endl; result = 0; } else { help(); } logEnd(); return result ? EXIT_FAILURE: EXIT_SUCCESS; } dibbler-1.0.1/Port-linux/rtm_map.h0000664000175000017500000000033012233256142013724 00000000000000#ifndef __RTM_MAP_H__ #define __RTM_MAP_H__ 1 char *rtnl_rtntype_n2a(int id, char *buf, int len); int rtnl_rtntype_a2n(int *id, char *arg); int get_rt_realms(__u32 *realms, char *arg); #endif /* __RTM_MAP_H__ */ dibbler-1.0.1/Port-linux/daemon.h0000664000175000017500000000131112474424667013550 00000000000000/* * Dibbler - a portable DHCPv6 * * authors: Tomasz Mrugalski * Marek Senderski * changes: Michal Kowalczuk * * released under GNU GPL v2 only licence */ #ifndef DAEMON_H #define DAEMON_H #ifndef SIGTERM #define SIGTERM 15 #endif #ifndef SIGINT #define SIGINT 2 #endif int start(const char * pidfile, const char * workdir); int stop(const char * pidfile); int init(const char * pidfile, const char * workdir); pid_t getPID(char * pidfile); int getServerPID(); int getClientPID(); int getRelayPID(); int die(const char * pidfile); void logStart(const char * note, const char * logname, const char * logfile); void logEnd(); #endif dibbler-1.0.1/Port-linux/interface.c0000644000175000017500000000762712277722750014251 00000000000000/* * This file is part of ifplugd. * * ifplugd 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. * * ifplugd 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 ifplugd; if not, write to the Free Software Foundation, * Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ #ifdef MOD_CLNT_CONFIRM #ifdef HAVE_CONFIG_H #include #endif #include #include #include #include #include #include #include #include #include #include #include #include #include #include "ethtool-local.h" #include "interface.h" #include #include #include void daemon_log(int loglevel, const char *fmt,...) { char buf[255]; va_list args; va_start(args,fmt); vsnprintf(buf, 255, fmt, args); va_end(args); printf("%s\n", buf); } void interface_up(int fd, const char *iface) { struct ifreq ifr; memset(&ifr, 0, sizeof(ifr)); strncpy(ifr.ifr_name, iface, sizeof(ifr.ifr_name)-1); if (ioctl(fd, SIOCGIFFLAGS, &ifr) < 0) { if (interface_do_message) daemon_log(LOG_WARNING, "Warning: Could not get interface flags."); return; } if ((ifr.ifr_flags & IFF_UP) == IFF_UP) return; if (ioctl(fd, SIOCGIFADDR, &ifr) < 0) { if (interface_do_message) daemon_log(LOG_WARNING, "Warning: Could not get interface address."); } else if (ifr.ifr_addr.sa_family != AF_INET) { if (interface_do_message) daemon_log(LOG_WARNING, "Warning: The interface is not IP-based."); } else { ((struct sockaddr_in *)(&ifr.ifr_addr))->sin_addr.s_addr = INADDR_ANY; if (ioctl(fd, SIOCSIFADDR, &ifr) < 0) { if (interface_do_message) daemon_log(LOG_WARNING, "Warning: Could not set interface address."); } } if (ioctl(fd, SIOCGIFFLAGS, &ifr) < 0) { if (interface_do_message) daemon_log(LOG_WARNING, "Warning: Could not get interface flags."); return; } ifr.ifr_flags |= IFF_UP; if (ioctl(fd, SIOCSIFFLAGS, &ifr) < 0) if (interface_do_message) daemon_log(LOG_WARNING, "Warning: Could not set interface flags."); } interface_status_t interface_detect_beat_ethtool(int fd, const char *iface) { struct ifreq ifr; struct ethtool_value edata; if (interface_auto_up) interface_up(fd, iface); memset(&ifr, 0, sizeof(ifr)); strncpy(ifr.ifr_name, iface, sizeof(ifr.ifr_name)-1); edata.cmd = ETHTOOL_GLINK; ifr.ifr_data = /*(caddr_t)*/ &edata; if (ioctl(fd, SIOCETHTOOL, &ifr) == -1) { if (interface_do_message) daemon_log(LOG_ERR, "ETHTOOL_GLINK failed: %s", strerror(errno)); return IFSTATUS_ERR; } return edata.data ? IFSTATUS_UP : IFSTATUS_DOWN; } interface_status_t interface_detect_beat_iff(int fd, const char *iface) { struct ifreq ifr; if (interface_auto_up) interface_up(fd, iface); memset(&ifr, 0, sizeof(ifr)); strncpy(ifr.ifr_name, iface, sizeof(ifr.ifr_name)-1); if (ioctl(fd, SIOCGIFFLAGS, &ifr) == -1) { if (interface_do_message) daemon_log(LOG_ERR, "SIOCGIFFLAGS failed: %s", strerror(errno)); return IFSTATUS_ERR; } return ifr.ifr_flags & IFF_RUNNING ? IFSTATUS_UP : IFSTATUS_DOWN; } #endif dibbler-1.0.1/Port-linux/lowlevel-options-linux.c0000644000175000017500000004060312560472666016762 00000000000000/* * Dibbler - a portable DHCPv6 * * authors: Tomasz Mrugalski * * released under GNU GPL v2 only licence * */ #define _BSD_SOURCE #define _POSIX_SOURCE #include #include #include #include #include #include #include #include #include #include #include #include #include "Portable.h" #include "dibbler-config.h" #define CR 0x0a #define LF 0x0d #define MAX_LINE_LEN 511 extern char * Message; #ifdef MOD_RESOLVCONF /** @brief check whether the resolconf executable exists * * Tries to spawn resolvconf process and returns a pipe to it. * Parameters are passed to resolvconf as command line * arguments (e.g. -a|-d, "IFNAME") * * the pipe needs to be closed by the caller * * @param arg1 first command line argument passed to resolvconf * @param arg2 second command line argument passed to resolvconf * * @return file handler (pipe to resolvconf process) or NULL */ FILE *resolvconf_open(const char *arg1, const char *arg2) { pid_t child; int pipefd[2]; if (access(RESOLVCONF, X_OK) != 0) return NULL; if (pipe(pipefd) != 0) return NULL; switch(child = fork()) { case 0: /* child */ close(pipefd[1]); close(0); dup(pipefd[0]); close(pipefd[0]); /* double fork so init reaps the child */ if (!fork()) { /* child */ execl(RESOLVCONF, RESOLVCONF, arg1, arg2, (char *)NULL); } /* All other cases are meaningless here */ exit(EXIT_FAILURE); break; case EXIT_FAILURE: /* error */ return NULL; break; } /* parent */ close(pipefd[0]); waitpid(child, NULL, 0); return fdopen(pipefd[1], "w"); } #endif /* in iproute.c, borrowed from iproute2 */ extern int iproute_modify(int cmd, unsigned flags, int argc, char **argv); /** * @brief Removes an entry from a file. * * Remove value of keyword from opened file in and the result is printed into * opened file out. If removed_empty and keyword remains without argument, it * will be removed too. Comments (starting with comment char) are respected. * All values following keyword are removed on all lines (global remove). * * @param in * @param out * @param keyword * @param value * @param comment * @param remove_empty * * @return Returns LOWLEVEL_NO_ERROR by default, LOWLEVEL_ERROR_FILE on I/O error \ * (and errno is set up), LOWLEVEL_ERROR_UNSPEC if value or keyword is too long. */ int cfg_value_del(FILE *in, FILE *out, const char *keyword, const char *value, const char comment, int remove_empty) { char buf[MAX_LINE_LEN+1]; if (strlen(keyword) > MAX_LINE_LEN || strlen(value) > MAX_LINE_LEN) return(LOWLEVEL_ERROR_UNSPEC); errno = 0; while (fgets(buf, MAX_LINE_LEN, in)) { char *head; /* Skip leading white space */ for (head=buf; *head!='\0' && isspace((int)(*head)); head++); /* Skip comment */ if (*head!='\0' && *head!=comment) { /* Find keyword */ if (strstr(head, keyword)==head) { head += strlen(keyword); /* Skip alone keyword */ if (*head!='\0' && *head!=comment && isspace((int)(*head))) { char *keyword_end=head; /* Locate each argument */ while (*head!='\0' && *head!=comment) { char *argument_begin=head; /* Skip spaces before argument */ for (; *head!='\0' && isspace((int)(*head)); head++); if (*head!='\0' && *head!=comment) { /* Compare argument to value */ if (strstr(head, value)==head) { head += strlen(value); if (*head=='\0' || *head==comment || isspace((int)(*head))) { /* remove this argument */ /* sprinf() moves data and appends '\0' */ sprintf(argument_begin, "%s", head); head=argument_begin; } } /* Skip rest of the argument */ for (; *head!='\0' && !isspace((int)(*head)); head++); } } /* Remove whole line if keyword remains without any arguments.*/ if (remove_empty) { for (head=keyword_end; *head!='\0' && isspace((int)(*head)); head++); if (*head=='\0' || *head==comment) *buf='\0'; } } } } /* print output */ if (-1 == fprintf(out, "%s", buf)) return(LOWLEVEL_ERROR_FILE); } return((errno)?LOWLEVEL_ERROR_FILE:LOWLEVEL_NO_ERROR); } /** * @brief removes value of keyword from file. * * It tries to do its best not to corrupt the file. * Returns LOWLEVEL ERROR codes * * @param file * @param keyword * @param value * * @return status code (one of LOWLEVEL_* defines) */ int cfg_file_del(const char *file, const char *keyword, const char *value) { FILE *fold, *ftmp; int tmpfd; int error = LOWLEVEL_NO_ERROR; struct stat st; char template[]="/etc/dibbler.XXXXXX"; /* Create temporary FILE */ if ((tmpfd = mkstemp(template)) == -1) return (LOWLEVEL_ERROR_FILE); if (!(ftmp = fdopen(tmpfd, "w"))) { /* close the file first, then... */ close(tmpfd); /* then delete it */ unlink(template); return(LOWLEVEL_ERROR_FILE); } /* Open original file */ if (!(fold = fopen(file, "r"))) { unlink(template); fclose(ftmp); return(LOWLEVEL_ERROR_FILE); } /* modify configuration */ error = cfg_value_del(fold, ftmp, keyword, value, '#', 1); /* close the files */ if (fclose(fold) == EOF) { error=LOWLEVEL_ERROR_FILE; } if (fclose(ftmp) == EOF) { error=LOWLEVEL_ERROR_FILE; } /* move temp file into place of the old one */ if (error==LOWLEVEL_NO_ERROR) { memset(&st,0,sizeof(st)); if (stat(file, &st) || rename(template, file) || chmod(file, st.st_mode)) error=LOWLEVEL_ERROR_FILE; } return(error); } /* * results 0 - ok -1 - unable to open temp. file -2 - unable to open resolv.conf file */ int dns_add(const char * ifname, int ifaceid, const char * addrPlain) { FILE * f = NULL; unsigned char c; #ifdef MOD_RESOLVCONF /* try to use resolvconf */ f=resolvconf_open("-a", ifname); #endif /* if resolvconf is not available, fallback to normal file append */ if (!f && !(f=fopen(RESOLVCONF_FILE, "a+")) ) { return LOWLEVEL_ERROR_FILE; } fseek(f, -1, SEEK_END); c = fgetc(f); /* read the last character */ fseek(f,0, SEEK_END); /* if the file does not end with new-line, add it */ if ( (c != CR) && (c != LF) ) { fprintf(f,"\n"); } fprintf(f,"nameserver %s\n",addrPlain); fclose(f); return LOWLEVEL_NO_ERROR; } int dns_del(const char * ifname, int ifaceid, const char *addrPlain) { #ifdef MOD_RESOLVCONF FILE *f = NULL; /* try to use resolvconf to remove config */ if ((f=resolvconf_open("-d", ifname))) { fclose(f); return LOWLEVEL_NO_ERROR; } #endif return cfg_file_del(RESOLVCONF_FILE, "nameserver", addrPlain); } int domain_add(const char* ifname, int ifaceid, const char* domain) { FILE * f, *f2; char buf[512]; int found = 0; unsigned char c; struct stat st; #ifdef MOD_RESOLVCONF /* try to use resolvconf it is available */ if ( (f=resolvconf_open("-a", ifname))) { fprintf(f, "search %s\n", domain); fclose(f); return LOWLEVEL_NO_ERROR; } #endif /* otherwise do the edit on your own */ memset(&st,0,sizeof(st)); stat(RESOLVCONF_FILE, &st); unlink(RESOLVCONF_FILE ".old"); rename(RESOLVCONF_FILE, RESOLVCONF_FILE ".old"); if ( !(f = fopen(RESOLVCONF_FILE ".old", "r")) ) return LOWLEVEL_ERROR_FILE; if ( !(f2 = fopen(RESOLVCONF_FILE, "w+")) ) { fclose(f); return LOWLEVEL_ERROR_FILE; } while (fgets(buf,511,f)) { if ( (!found) && (strstr(buf, "search")) ) { if (strlen(buf)) buf[strlen(buf)-1]=0; fprintf(f2, "%s %s\n", buf, domain); found = 1; continue; } fprintf(f2,"%s",buf); } fseek(f2, -1, SEEK_END); c = fgetc(f2); fseek(f2,0, SEEK_END); if ( (c!=CR) && (c!=LF) ) { fprintf(f2,"\n"); } if (!found) fprintf(f2,"search %s\n",domain); fclose(f); fclose(f2); chmod(RESOLVCONF_FILE,st.st_mode); return LOWLEVEL_NO_ERROR; } int domain_del(const char * ifname, int ifaceid, const char *domain) { #ifdef MOD_RESOLVCONF FILE * f; /* try to use resolvconf if it is available */ if ((f = resolvconf_open("-d", ifname))) { fclose(f); return LOWLEVEL_NO_ERROR; } #endif /* otherwise fallback to normal file manipulation */ return cfg_file_del(RESOLVCONF_FILE, "search", domain); } int ntp_add(const char* ifname, const int ifindex, const char* addrPlain){ FILE * f; unsigned char c; if ( !(f=fopen(NTPCONF_FILE,"a+"))) { return LOWLEVEL_ERROR_FILE; } fseek(f, -1, SEEK_END); c = fgetc(f); fseek(f,0, SEEK_END); if ( (c!=CR) && (c!=LF) ) { fprintf(f,"\n"); } fprintf(f,"server %s\n",addrPlain); fclose(f); return LOWLEVEL_NO_ERROR; } int ntp_del(const char* ifname, const int ifindex, const char* addrPlain){ return cfg_file_del(NTPCONF_FILE, "server", addrPlain); } /* * Set new timezone by making symlink (usually from /etc/localtime to * /usr/share/zoneinfo/). * Only symbolic abberviated timezone specification is assumed. POSIX * timezones like 'PST8PDT,M4.1.0/02:00,M10.5.0/02:00' are not supported. */ int timezone_set(const char* ifname, int ifindex, const char* timezone){ /* timezone-data README states: * file name component must not exceed 14 characters * file name components use only ASCII letters, '.', '-' and '_'. * Thus TZ_LEN >= * strlen(TIMEZONES_DIR) + '/' + file name component1 + '/' + component2 */ #define TZ_LEN 64 #define TIMEZONE_FILE_TMP TIMEZONE_FILE".dibbler" char buf[TZ_LEN]; struct stat st; if (!timezone || strlen(timezone)==0) return LOWLEVEL_ERROR_UNSPEC; /* Security check: Do not allow evil server to traverse client file system */ if (strstr(timezone, "..")) return LOWLEVEL_ERROR_UNSPEC; if (TZ_LEN <= snprintf(buf, TZ_LEN, "%s/%s", TIMEZONES_DIR, timezone)) return LOWLEVEL_ERROR_UNSPEC; if (stat(buf, &st) || S_ISDIR(st.st_mode)) return LOWLEVEL_ERROR_FILE; if (unlink(TIMEZONE_FILE_TMP) && errno!=ENOENT) return LOWLEVEL_ERROR_FILE; if (symlink(buf, TIMEZONE_FILE_TMP)) return LOWLEVEL_ERROR_FILE; if (rename(TIMEZONE_FILE_TMP, TIMEZONE_FILE)) { unlink(TIMEZONE_FILE_TMP); return LOWLEVEL_ERROR_FILE; } return LOWLEVEL_NO_ERROR; } int timezone_del(const char* ifname, int ifindex, const char* timezone){ return LOWLEVEL_NO_ERROR; } int sipserver_add(const char* ifname, const int ifindex, const char* addrPlain){ return LOWLEVEL_NO_ERROR; } int sipserver_del(const char* ifname, const int ifindex, const char* addrPlain){ return LOWLEVEL_NO_ERROR; } int sipdomain_add(const char* ifname, int ifindex, const char* domain){ return LOWLEVEL_NO_ERROR; } int sipdomain_del(const char* ifname, int ifindex, const char* domain){ return LOWLEVEL_NO_ERROR; } int nisserver_add(const char* ifname, const int ifindex, const char* addrPlain){ return LOWLEVEL_NO_ERROR; } int nisserver_del(const char* ifname, const int ifindex, const char* addrPlain){ return LOWLEVEL_NO_ERROR; } int nisdomain_set(const char* ifname, int ifindex, const char* domain){ return LOWLEVEL_NO_ERROR; } int nisdomain_del(const char* ifname, int ifindex, const char* domain){ return LOWLEVEL_NO_ERROR; } int nisplusserver_add(const char* ifname, const int ifindex, const char* addrPlain){ return LOWLEVEL_NO_ERROR; } int nisplusserver_del(const char* ifname, const int ifindex, const char* addrPlain){ return LOWLEVEL_NO_ERROR; } int nisplusdomain_set(const char* ifname, int ifindex, const char* domain){ return LOWLEVEL_NO_ERROR; } int nisplusdomain_del(const char* ifname, int ifindex, const char* domain){ return LOWLEVEL_NO_ERROR; } void add_radvd_conf(const char* ifname, const char* prefixPlain, int prefixLength, uint32_t preferred, uint32_t valid) { char * errorMsg = error_message(); FILE * f; f = fopen(RADVD_FILE, "r+"); if (!f) { /* unable to open, so this file is missing, let's create it */ f = fopen(RADVD_FILE, "w"); fprintf(f, "#\n"); fprintf(f, "# Router Advertisement config file generated by Dibbler %s\n", DIBBLER_VERSION); fprintf(f, "#\n"); fprintf(f, "\n"); } if (!f) { sprintf(errorMsg, "Unable to open %s file.", RADVD_FILE); } fseek(f, 0, SEEK_END); fprintf(f, "\n### %s start ###\n", ifname); fprintf(f, "interface %s \n", ifname); fprintf(f, "{ \n"); fprintf(f, " AdvSendAdvert on; \n"); fprintf(f, " prefix %s/%d\n", prefixPlain, prefixLength); fprintf(f, " { \n"); fprintf(f, " AdvOnLink on;\n"); fprintf(f, " AdvPreferredLifetime %lu;\n", preferred); fprintf(f, " AdvValidLifetime %lu;\n", valid); fprintf(f, " AdvAutonomous on;\n"); fprintf(f, " };\n"); fprintf(f, "};\n"); fprintf(f, "### %s end ###\n", ifname); fprintf(f, "\n"); fclose(f); } void delete_radvd_conf(const char* ifname, const char* prefixPlain, int prefixLen) { FILE *f, *f2; struct stat st; int found = 0; char buf[512]; char buf2[512]; memset(&st,0,sizeof(st)); stat(RADVD_FILE, &st); unlink(RADVD_FILE".old"); rename(RADVD_FILE,RADVD_FILE".old"); f = fopen(RADVD_FILE".old","r"); f2 = fopen(RADVD_FILE,"w"); snprintf(buf2, 511, "### %s start ###\n", ifname); while (fgets(buf,511,f)) { if ( (!found) && (strstr(buf, buf2)) ) { found = 1; snprintf(buf2, 511, "### %s end ###\n", ifname); continue; } if ( (found) && (strstr(buf, buf2)) ) { found = 0; continue; } if (!found) fprintf(f2,"%s",buf); } fclose(f); fclose(f2); } /** * adds prefix - if this node has IPv6 forwarding disabled, it will configure that prefix on the * interface, which prefix has been received on. If the forwarding is enabled, it will be assigned * to all other up, running and multicast capable interfaces. * In both cases, radvd.conf file will be created. * * @param ifname interface name * @param ifindex interface index * @param prefixPlain prefix (specified in human readable format) * @param prefixLength prefix length * @param prefered preferred lifetime * @param valid valid lifetime * * @return negative error code or 0 if successful */ int prefix_add(const char* ifname, int ifindex, const char* prefixPlain, int prefixLength, unsigned long preferred, unsigned long valid) { char *argv[5]; int result; char buf[128]; int numargs = 0; /* char buf2[128]; */ add_radvd_conf(ifname, prefixPlain, prefixLength, preferred, valid); snprintf(buf, 127, "%s/%d", prefixPlain, prefixLength); argv[0] = buf; argv[1] = "dev"; argv[2] = (char*)ifname; numargs = 3; /* this is not supported in the kernel: snprintf(buf2, 127, "%d", valid); argv[3] = "lifetime"; argv[4] = buf2; numargs = 5; */ result = iproute_modify(RTM_NEWROUTE, NLM_F_CREATE|NLM_F_EXCL, numargs, argv); if (result == 0) return LOWLEVEL_NO_ERROR; else return LOWLEVEL_ERROR_UNSPEC; } int prefix_update(const char* ifname, int ifindex, const char* prefixPlain, int prefixLength, unsigned long prefered, unsigned long valid) { char *argv[3]; int result; char buf[128]; delete_radvd_conf(ifname, prefixPlain, prefixLength); add_radvd_conf(ifname, prefixPlain, prefixLength, prefered, valid); snprintf(buf, 127, "%s/%d", prefixPlain, prefixLength); argv[0] = buf; argv[1] = "dev"; argv[2] = (char*)ifname; /* iproute2: ip route change uses iproute_modify(RTM_NEWROUTE, NLM_F_REPLACE, ...) ip route replace uses iproute_modify(RTM_NEWROUTE, NLM_F_CREATE|NLM_F_REPLACE, ...) */ result = iproute_modify(RTM_NEWROUTE, NLM_F_CREATE|NLM_F_REPLACE, 3, argv); if (result == 0) return LOWLEVEL_NO_ERROR; else return LOWLEVEL_ERROR_UNSPEC; } int prefix_del(const char* ifname, int ifindex, const char* prefixPlain, int prefixLength) { int result; char *argv[3]; char buf[512]; delete_radvd_conf(ifname, prefixPlain, prefixLength); snprintf(buf, 127, "%s/%d", prefixPlain, prefixLength); argv[0] = buf; argv[1] = "dev"; argv[2] = (char*)ifname; result = iproute_modify(RTM_DELROUTE, 0, 3, argv); if (result == 0) return LOWLEVEL_NO_ERROR; else return LOWLEVEL_ERROR_UNSPEC; } dibbler-1.0.1/Port-linux/ll_types.c0000664000175000017500000000510612233256142014121 00000000000000/* * ll_types.c * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version * 2 of the License, or (at your option) any later version. * * Authors: Alexey Kuznetsov, */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "rt_names.h" const char * ll_type_n2a(int type, char *buf, int len) { #define __PF(f,n) { ARPHRD_##f, #n }, static struct { int type; const char *name; } arphrd_names[] = { { 0, "generic" }, __PF(ETHER,ether) __PF(EETHER,eether) __PF(AX25,ax25) __PF(PRONET,pronet) __PF(CHAOS,chaos) #ifdef ARPHRD_IEEE802_TR __PF(IEEE802,ieee802) #else __PF(IEEE802,tr) #endif __PF(ARCNET,arcnet) __PF(APPLETLK,atalk) __PF(DLCI,dlci) #ifdef ARPHRD_ATM __PF(ATM,atm) #endif __PF(METRICOM,metricom) #ifdef ARPHRD_IEEE1394 __PF(IEEE1394,ieee1394) #endif #ifdef ARPHRD_INFINIBAND __PF(INFINIBAND,infiniband) #endif __PF(SLIP,slip) __PF(CSLIP,cslip) __PF(SLIP6,slip6) __PF(CSLIP6,cslip6) __PF(RSRVD,rsrvd) __PF(ADAPT,adapt) __PF(ROSE,rose) __PF(X25,x25) #ifdef ARPHRD_HWX25 __PF(HWX25,hwx25) #endif __PF(PPP,ppp) __PF(HDLC,hdlc) __PF(LAPB,lapb) #ifdef ARPHRD_DDCMP __PF(DDCMP,ddcmp) #endif #ifdef ARPHRD_RAWHDLC __PF(RAWHDLC,rawhdlc) #endif __PF(TUNNEL,ipip) __PF(TUNNEL6,tunnel6) __PF(FRAD,frad) __PF(SKIP,skip) __PF(LOOPBACK,loopback) __PF(LOCALTLK,ltalk) __PF(FDDI,fddi) __PF(BIF,bif) __PF(SIT,sit) __PF(IPDDP,ip/ddp) __PF(IPGRE,gre) __PF(PIMREG,pimreg) __PF(HIPPI,hippi) __PF(ASH,ash) __PF(ECONET,econet) __PF(IRDA,irda) __PF(FCPP,fcpp) __PF(FCAL,fcal) __PF(FCPL,fcpl) __PF(FCFABRIC,fcfb0) __PF(FCFABRIC+1,fcfb1) __PF(FCFABRIC+2,fcfb2) __PF(FCFABRIC+3,fcfb3) __PF(FCFABRIC+4,fcfb4) __PF(FCFABRIC+5,fcfb5) __PF(FCFABRIC+6,fcfb6) __PF(FCFABRIC+7,fcfb7) __PF(FCFABRIC+8,fcfb8) __PF(FCFABRIC+9,fcfb9) __PF(FCFABRIC+10,fcfb10) __PF(FCFABRIC+11,fcfb11) __PF(FCFABRIC+12,fcfb12) #ifdef ARPHRD_IEEE802_TR __PF(IEEE802_TR,tr) #endif #ifdef ARPHRD_IEEE80211 __PF(IEEE80211,ieee802.11) #endif #ifdef ARPHRD_VOID __PF(VOID,void) #endif }; #undef __PF int i; for (i=0; i * Marek Senderski * changes: Michal Kowalczuk * * released under GNU GPL v2 licence * */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "Portable.h" #include "Logger.h" extern int status(); extern int run(); extern std::string WORKDIR; using namespace std; /** * checks if pid file exists, and returns its content (or -2 if unable to read) * * @param file * * @return pid value, or negative if error was detected */ pid_t getPID(const char * file) { /* check if the file exists */ struct stat buf; int i = stat(file, &buf); if (i!=0) return LOWLEVEL_ERROR_UNSPEC; ifstream pidfile(file); if (!pidfile.is_open()) return LOWLEVEL_ERROR_FILE; pid_t pid; pidfile >> pid; return pid; } pid_t getClientPID() { std::string clntpid_file = WORKDIR + "/client.pid"; return getPID(clntpid_file.c_str()); } pid_t getServerPID() { std::string srvpid_file = WORKDIR + "/server.pid"; return getPID(srvpid_file.c_str()); } pid_t getRelayPID() { std::string relpid_file = WORKDIR + "/relay.pid"; return getPID(relpid_file.c_str()); } void daemon_init() { std::cout << "Starting daemon..." << std::endl; // daemon should close all open files fclose(stdin); fclose(stdout); fclose(stderr); pid_t childpid; logger::EchoOff(); if (getppid()!=1) { #ifdef SIGTTOU signal(SIGTTOU, SIG_IGN); #endif #ifdef SIGTTIN signal(SIGTTIN, SIG_IGN); #endif #ifdef SIGTSTP signal(SIGTSTP, SIG_IGN); #endif if ( (childpid = fork()) <0 ) { Log(Crit) << "Can't fork first child." << endl; return; } else if (childpid > 0) exit(EXIT_SUCCESS); // parent process if (setpgrp() == -1) { Log(Crit) << "Can't change process group." << endl; return; } signal( SIGHUP, SIG_IGN); if ( (childpid = fork()) <0) { cout << "Can't fork second child." << endl; return; } else if (childpid > 0) exit(EXIT_SUCCESS); // first child } // getppid()!=1 umask(DEFAULT_UMASK); } void daemon_die() { logger::Terminate(); logger::EchoOn(); } int init(const char * pidfile, const char * workdir) { string tmp; pid_t pid = getPID(pidfile); if (pid > 0) { /** @todo: buf needs to fit "/proc/%d/exe", where %d is pid_t * (on my system it's 20 B exactly with positive PID. However this is not * portable.) */ char buf[128]; char cmd[256]; /* @todo: ISO C++ doesn't support 'j' length modifier nor 'll' nor * PRIdMAX macro. So, long int is the biggest printable type. * God bless pid_t to fit into long int. */ if (snprintf(buf, sizeof(buf), "/proc/%ld", (long int)pid) >= (int)sizeof(buf)) { Log(Crit) << "Buffer for string `/proc/" << pid << "' too small" << LogEnd; return 0; }; if (!access(buf, F_OK)) { if(snprintf(buf, sizeof(buf), "/proc/%ld/exe", (long int)pid) >= (int)sizeof(buf)) { Log(Crit) << "Buffer for string `/proc/" << pid << "/exe' too small" << LogEnd; return 0; } ssize_t len=readlink(buf, cmd, sizeof(cmd)); if(len!=-1) { cmd[len]=0; if(strstr(cmd, "dibbler")==NULL) { Log(Warning) << "Process is running but it is not Dibbler (pid=" << pid << ", name " << cmd << ")." << LogEnd; } else { Log(Crit) << "Process already running and it seems to be Dibbler (pid=" << pid << ", name " << cmd << ")." << LogEnd; return 0; } } else { Log(Crit) << "Process already running (pid=" << pid << ", file " << pidfile << " is present)." << LogEnd; return 0; } } else { Log(Warning) << "Pid file found (pid=" << pid << ", file " << pidfile << "), but process " << pid << " does not exist." << LogEnd; } } unlink(pidfile); ofstream pidFile(pidfile); if (!pidFile.is_open()) { Log(Crit) << "Unable to create " << pidfile << " file." << LogEnd; return 0; } pidFile << getpid(); pidFile.close(); Log(Notice) << "My pid (" << getpid() << ") is stored in " << pidfile << LogEnd; if (chdir(workdir)) { Log(Crit) << "Unable to change directory to " << workdir << "." << LogEnd; return 0; } umask(DEFAULT_UMASK); return 1; } void die(const char * pidfile) { if (unlink(pidfile)) { Log(Warning) << "Unable to delete " << pidfile << "." << LogEnd; } } int start(const char * pidfile, const char * workdir) { int result; daemon_init(); result = run(); daemon_die(); return result; } static pid_t pid; static void thaw_ptraced_daemon(int signal) { cout << "Detaching process " << pid << "." << endl; ptrace(PTRACE_DETACH, pid, NULL, NULL); } int stop(const char * pidfile) { int saved_errno; int ptrace_failed, p_status; struct sigaction action; sigset_t block_signals; pid = getPID(pidfile); if (pid==-1) { cout << "Process is not running." << endl; return -1; } if (pid==-2) { cout << "Unable to read file " << pidfile << ". Are you running as root?" << endl; return -1; } /* Make sure daemon will not keep stopped if we terminates untimely. */ action.sa_handler = thaw_ptraced_daemon; action.sa_flags = 0; sigfillset(&block_signals); action.sa_mask = block_signals; if (sigaction(SIGHUP, &action, NULL) || sigaction(SIGINT, &action, NULL) || sigaction(SIGPIPE, &action, NULL) || sigaction(SIGTERM, &action, NULL)) { cout << "Unable to protect daemon from eternal sleep." << endl; } /* simply sending kill is not enough, because it will return immediately after sending signal and this (sending) process would terminate shortly after. this means that the following commands will create race condition: dibbler-server stop dibbler-server start Unfortunately, this is a common case in various scripts. Therefore we need those ptrace calls (or something similar) to wait till the process to be terminated really dies, before we finish. */ ptrace_failed = ptrace(PTRACE_ATTACH, pid, NULL, NULL); if (ptrace_failed) { saved_errno = errno; cout << "Attaching to process " << pid << " failed: " << strerror(saved_errno) << endl; } else { /* Ptraced daemon will be stopped. However this is asynchronous from * ptrace() return. We have to synchronize to this point, otherwise * tracing assumptions cannot be held. */ while (1) { if (-1 == waitpid(pid, &p_status, 0)) { saved_errno = errno; cout << "Failed: " << strerror(saved_errno) << endl; ptrace(PTRACE_DETACH, pid, NULL, NULL); return -1; } if (WIFEXITED(p_status) || WIFSIGNALED(p_status) || (WIFSTOPPED(p_status) && WSTOPSIG(p_status) == SIGSTOP)) { break; } ptrace(PTRACE_CONT, pid, NULL, WIFSTOPPED(p_status) ? WSTOPSIG(p_status) : 0); } /* For unknown reason, signal sent by tracee to ptrace-stopped process * is not queued. Daemon must be resumed before sending SIGTERM. */ ptrace(PTRACE_CONT, pid, NULL, NULL); } cout << "Sending TERM signal to process " << pid << endl; if (-1 == kill(pid, SIGTERM)) { saved_errno = errno; cout << "Signal sending failed: " << strerror(saved_errno) << endl; if (!ptrace_failed) ptrace(PTRACE_DETACH, pid, NULL, NULL); return -1; } if (ptrace_failed) { cout << "Warning: Can not guarantee for remote process termination" << endl; return 0; } cout << "Waiting for signalled process termination... " << flush; while (1) { if (-1 == waitpid(pid, &p_status, 0)) { saved_errno = errno; cout << "Failed: " << strerror(saved_errno) << endl; ptrace(PTRACE_DETACH, pid, NULL, NULL); return -1; } if (WIFEXITED(p_status) || WIFSIGNALED(p_status)) { break; } ptrace(PTRACE_CONT, pid, NULL, (WIFSTOPPED(p_status) && WSTOPSIG(p_status) != SIGSTOP) ? WSTOPSIG(p_status) : 0); } cout << "Done." << endl; return 0; } int install() { return 0; } int uninstall() { return 0; } /** things to do just after started */ void logStart(const char * note, const char * logname, const char * logfile) { std::cout << DIBBLER_COPYRIGHT1 << " " << note << std::endl; std::cout << DIBBLER_COPYRIGHT2 << std::endl; std::cout << DIBBLER_COPYRIGHT3 << std::endl; std::cout << DIBBLER_COPYRIGHT4 << std::endl; logger::setLogName(logname); logger::Initialize(logfile); logger::EchoOff(); Log(Notice) << DIBBLER_COPYRIGHT1 << " " << note << LogEnd; logger::EchoOn(); } /** things to do just before end */ void logEnd() { logger::Terminate(); } dibbler-1.0.1/Port-linux/Makefile.in0000664000175000017500000012253312561652535014205 00000000000000# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = Port-linux DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/depcomp $(dist_noinst_DATA) ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/libtool.m4 \ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/include/dibbler-config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = LIBRARIES = $(noinst_LIBRARIES) ARFLAGS = cru AM_V_AR = $(am__v_AR_@AM_V@) am__v_AR_ = $(am__v_AR_@AM_DEFAULT_V@) am__v_AR_0 = @echo " AR " $@; am__v_AR_1 = libLowLevel_a_AR = $(AR) $(ARFLAGS) libLowLevel_a_LIBADD = am_libLowLevel_a_OBJECTS = libLowLevel_a-daemon.$(OBJEXT) \ libLowLevel_a-interface.$(OBJEXT) \ libLowLevel_a-iproute.$(OBJEXT) \ libLowLevel_a-libnetlink.$(OBJEXT) \ libLowLevel_a-ll_map.$(OBJEXT) \ libLowLevel_a-ll_types.$(OBJEXT) \ libLowLevel_a-lowlevel-linux.$(OBJEXT) \ libLowLevel_a-lowlevel-linux-link-state.$(OBJEXT) \ libLowLevel_a-lowlevel-options-linux.$(OBJEXT) \ libLowLevel_a-utils.$(OBJEXT) libLowLevel_a_OBJECTS = $(am_libLowLevel_a_OBJECTS) AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)/include depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) LTCXXCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CXXFLAGS) $(CXXFLAGS) AM_V_CXX = $(am__v_CXX_@AM_V@) am__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@) am__v_CXX_0 = @echo " CXX " $@; am__v_CXX_1 = CXXLD = $(CXX) CXXLINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \ $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CXXLD = $(am__v_CXXLD_@AM_V@) am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@) am__v_CXXLD_0 = @echo " CXXLD " $@; am__v_CXXLD_1 = SOURCES = $(libLowLevel_a_SOURCES) DIST_SOURCES = $(libLowLevel_a_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac DATA = $(dist_noinst_DATA) am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALLOCA = @ALLOCA@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ ARCH = @ARCH@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ EXTRA_DIST_SUBDIRS = @EXTRA_DIST_SUBDIRS@ FGREP = @FGREP@ GREP = @GREP@ GTEST_INCLUDES = @GTEST_INCLUDES@ GTEST_LDADD = @GTEST_LDADD@ GTEST_LDFLAGS = @GTEST_LDFLAGS@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LINKPRINT = @LINKPRINT@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PORT_CFLAGS = @PORT_CFLAGS@ PORT_LDFLAGS = @PORT_LDFLAGS@ PORT_SUBDIR = @PORT_SUBDIR@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ subdirs = @subdirs@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ noinst_LIBRARIES = libLowLevel.a libLowLevel_a_CFLAGS = -std=c99 libLowLevel_a_CPPFLAGS = -I$(top_srcdir)/Misc libLowLevel_a_SOURCES = daemon.cpp daemon.h ethtool-kernel.h ethtool-local.h interface.c interface.h ip_common.h iproute.c libnetlink.c libnetlink.h ll_map.c ll_map.h ll_types.c lowlevel-linux.c lowlevel-linux-link-state.c lowlevel-options-linux.c rtm_map.h rt_names.h utils.c utils.h # that's ugly hack. Those files should not be built here. They are compiled during link of respective daemons. # As far as this makefile is concerned, they should be treated as data, so they are included in make dist dist_noinst_DATA = dibbler-client.cpp dibbler-relay.cpp dibbler-server.cpp all: all-am .SUFFIXES: .SUFFIXES: .c .cpp .lo .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign Port-linux/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign Port-linux/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstLIBRARIES: -test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES) libLowLevel.a: $(libLowLevel_a_OBJECTS) $(libLowLevel_a_DEPENDENCIES) $(EXTRA_libLowLevel_a_DEPENDENCIES) $(AM_V_at)-rm -f libLowLevel.a $(AM_V_AR)$(libLowLevel_a_AR) libLowLevel.a $(libLowLevel_a_OBJECTS) $(libLowLevel_a_LIBADD) $(AM_V_at)$(RANLIB) libLowLevel.a mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libLowLevel_a-daemon.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libLowLevel_a-interface.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libLowLevel_a-iproute.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libLowLevel_a-libnetlink.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libLowLevel_a-ll_map.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libLowLevel_a-ll_types.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libLowLevel_a-lowlevel-linux-link-state.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libLowLevel_a-lowlevel-linux.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libLowLevel_a-lowlevel-options-linux.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libLowLevel_a-utils.Po@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< libLowLevel_a-interface.o: interface.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libLowLevel_a_CPPFLAGS) $(CPPFLAGS) $(libLowLevel_a_CFLAGS) $(CFLAGS) -MT libLowLevel_a-interface.o -MD -MP -MF $(DEPDIR)/libLowLevel_a-interface.Tpo -c -o libLowLevel_a-interface.o `test -f 'interface.c' || echo '$(srcdir)/'`interface.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libLowLevel_a-interface.Tpo $(DEPDIR)/libLowLevel_a-interface.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='interface.c' object='libLowLevel_a-interface.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libLowLevel_a_CPPFLAGS) $(CPPFLAGS) $(libLowLevel_a_CFLAGS) $(CFLAGS) -c -o libLowLevel_a-interface.o `test -f 'interface.c' || echo '$(srcdir)/'`interface.c libLowLevel_a-interface.obj: interface.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libLowLevel_a_CPPFLAGS) $(CPPFLAGS) $(libLowLevel_a_CFLAGS) $(CFLAGS) -MT libLowLevel_a-interface.obj -MD -MP -MF $(DEPDIR)/libLowLevel_a-interface.Tpo -c -o libLowLevel_a-interface.obj `if test -f 'interface.c'; then $(CYGPATH_W) 'interface.c'; else $(CYGPATH_W) '$(srcdir)/interface.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libLowLevel_a-interface.Tpo $(DEPDIR)/libLowLevel_a-interface.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='interface.c' object='libLowLevel_a-interface.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libLowLevel_a_CPPFLAGS) $(CPPFLAGS) $(libLowLevel_a_CFLAGS) $(CFLAGS) -c -o libLowLevel_a-interface.obj `if test -f 'interface.c'; then $(CYGPATH_W) 'interface.c'; else $(CYGPATH_W) '$(srcdir)/interface.c'; fi` libLowLevel_a-iproute.o: iproute.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libLowLevel_a_CPPFLAGS) $(CPPFLAGS) $(libLowLevel_a_CFLAGS) $(CFLAGS) -MT libLowLevel_a-iproute.o -MD -MP -MF $(DEPDIR)/libLowLevel_a-iproute.Tpo -c -o libLowLevel_a-iproute.o `test -f 'iproute.c' || echo '$(srcdir)/'`iproute.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libLowLevel_a-iproute.Tpo $(DEPDIR)/libLowLevel_a-iproute.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='iproute.c' object='libLowLevel_a-iproute.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libLowLevel_a_CPPFLAGS) $(CPPFLAGS) $(libLowLevel_a_CFLAGS) $(CFLAGS) -c -o libLowLevel_a-iproute.o `test -f 'iproute.c' || echo '$(srcdir)/'`iproute.c libLowLevel_a-iproute.obj: iproute.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libLowLevel_a_CPPFLAGS) $(CPPFLAGS) $(libLowLevel_a_CFLAGS) $(CFLAGS) -MT libLowLevel_a-iproute.obj -MD -MP -MF $(DEPDIR)/libLowLevel_a-iproute.Tpo -c -o libLowLevel_a-iproute.obj `if test -f 'iproute.c'; then $(CYGPATH_W) 'iproute.c'; else $(CYGPATH_W) '$(srcdir)/iproute.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libLowLevel_a-iproute.Tpo $(DEPDIR)/libLowLevel_a-iproute.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='iproute.c' object='libLowLevel_a-iproute.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libLowLevel_a_CPPFLAGS) $(CPPFLAGS) $(libLowLevel_a_CFLAGS) $(CFLAGS) -c -o libLowLevel_a-iproute.obj `if test -f 'iproute.c'; then $(CYGPATH_W) 'iproute.c'; else $(CYGPATH_W) '$(srcdir)/iproute.c'; fi` libLowLevel_a-libnetlink.o: libnetlink.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libLowLevel_a_CPPFLAGS) $(CPPFLAGS) $(libLowLevel_a_CFLAGS) $(CFLAGS) -MT libLowLevel_a-libnetlink.o -MD -MP -MF $(DEPDIR)/libLowLevel_a-libnetlink.Tpo -c -o libLowLevel_a-libnetlink.o `test -f 'libnetlink.c' || echo '$(srcdir)/'`libnetlink.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libLowLevel_a-libnetlink.Tpo $(DEPDIR)/libLowLevel_a-libnetlink.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='libnetlink.c' object='libLowLevel_a-libnetlink.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libLowLevel_a_CPPFLAGS) $(CPPFLAGS) $(libLowLevel_a_CFLAGS) $(CFLAGS) -c -o libLowLevel_a-libnetlink.o `test -f 'libnetlink.c' || echo '$(srcdir)/'`libnetlink.c libLowLevel_a-libnetlink.obj: libnetlink.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libLowLevel_a_CPPFLAGS) $(CPPFLAGS) $(libLowLevel_a_CFLAGS) $(CFLAGS) -MT libLowLevel_a-libnetlink.obj -MD -MP -MF $(DEPDIR)/libLowLevel_a-libnetlink.Tpo -c -o libLowLevel_a-libnetlink.obj `if test -f 'libnetlink.c'; then $(CYGPATH_W) 'libnetlink.c'; else $(CYGPATH_W) '$(srcdir)/libnetlink.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libLowLevel_a-libnetlink.Tpo $(DEPDIR)/libLowLevel_a-libnetlink.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='libnetlink.c' object='libLowLevel_a-libnetlink.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libLowLevel_a_CPPFLAGS) $(CPPFLAGS) $(libLowLevel_a_CFLAGS) $(CFLAGS) -c -o libLowLevel_a-libnetlink.obj `if test -f 'libnetlink.c'; then $(CYGPATH_W) 'libnetlink.c'; else $(CYGPATH_W) '$(srcdir)/libnetlink.c'; fi` libLowLevel_a-ll_map.o: ll_map.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libLowLevel_a_CPPFLAGS) $(CPPFLAGS) $(libLowLevel_a_CFLAGS) $(CFLAGS) -MT libLowLevel_a-ll_map.o -MD -MP -MF $(DEPDIR)/libLowLevel_a-ll_map.Tpo -c -o libLowLevel_a-ll_map.o `test -f 'll_map.c' || echo '$(srcdir)/'`ll_map.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libLowLevel_a-ll_map.Tpo $(DEPDIR)/libLowLevel_a-ll_map.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ll_map.c' object='libLowLevel_a-ll_map.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libLowLevel_a_CPPFLAGS) $(CPPFLAGS) $(libLowLevel_a_CFLAGS) $(CFLAGS) -c -o libLowLevel_a-ll_map.o `test -f 'll_map.c' || echo '$(srcdir)/'`ll_map.c libLowLevel_a-ll_map.obj: ll_map.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libLowLevel_a_CPPFLAGS) $(CPPFLAGS) $(libLowLevel_a_CFLAGS) $(CFLAGS) -MT libLowLevel_a-ll_map.obj -MD -MP -MF $(DEPDIR)/libLowLevel_a-ll_map.Tpo -c -o libLowLevel_a-ll_map.obj `if test -f 'll_map.c'; then $(CYGPATH_W) 'll_map.c'; else $(CYGPATH_W) '$(srcdir)/ll_map.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libLowLevel_a-ll_map.Tpo $(DEPDIR)/libLowLevel_a-ll_map.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ll_map.c' object='libLowLevel_a-ll_map.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libLowLevel_a_CPPFLAGS) $(CPPFLAGS) $(libLowLevel_a_CFLAGS) $(CFLAGS) -c -o libLowLevel_a-ll_map.obj `if test -f 'll_map.c'; then $(CYGPATH_W) 'll_map.c'; else $(CYGPATH_W) '$(srcdir)/ll_map.c'; fi` libLowLevel_a-ll_types.o: ll_types.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libLowLevel_a_CPPFLAGS) $(CPPFLAGS) $(libLowLevel_a_CFLAGS) $(CFLAGS) -MT libLowLevel_a-ll_types.o -MD -MP -MF $(DEPDIR)/libLowLevel_a-ll_types.Tpo -c -o libLowLevel_a-ll_types.o `test -f 'll_types.c' || echo '$(srcdir)/'`ll_types.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libLowLevel_a-ll_types.Tpo $(DEPDIR)/libLowLevel_a-ll_types.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ll_types.c' object='libLowLevel_a-ll_types.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libLowLevel_a_CPPFLAGS) $(CPPFLAGS) $(libLowLevel_a_CFLAGS) $(CFLAGS) -c -o libLowLevel_a-ll_types.o `test -f 'll_types.c' || echo '$(srcdir)/'`ll_types.c libLowLevel_a-ll_types.obj: ll_types.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libLowLevel_a_CPPFLAGS) $(CPPFLAGS) $(libLowLevel_a_CFLAGS) $(CFLAGS) -MT libLowLevel_a-ll_types.obj -MD -MP -MF $(DEPDIR)/libLowLevel_a-ll_types.Tpo -c -o libLowLevel_a-ll_types.obj `if test -f 'll_types.c'; then $(CYGPATH_W) 'll_types.c'; else $(CYGPATH_W) '$(srcdir)/ll_types.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libLowLevel_a-ll_types.Tpo $(DEPDIR)/libLowLevel_a-ll_types.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ll_types.c' object='libLowLevel_a-ll_types.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libLowLevel_a_CPPFLAGS) $(CPPFLAGS) $(libLowLevel_a_CFLAGS) $(CFLAGS) -c -o libLowLevel_a-ll_types.obj `if test -f 'll_types.c'; then $(CYGPATH_W) 'll_types.c'; else $(CYGPATH_W) '$(srcdir)/ll_types.c'; fi` libLowLevel_a-lowlevel-linux.o: lowlevel-linux.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libLowLevel_a_CPPFLAGS) $(CPPFLAGS) $(libLowLevel_a_CFLAGS) $(CFLAGS) -MT libLowLevel_a-lowlevel-linux.o -MD -MP -MF $(DEPDIR)/libLowLevel_a-lowlevel-linux.Tpo -c -o libLowLevel_a-lowlevel-linux.o `test -f 'lowlevel-linux.c' || echo '$(srcdir)/'`lowlevel-linux.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libLowLevel_a-lowlevel-linux.Tpo $(DEPDIR)/libLowLevel_a-lowlevel-linux.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='lowlevel-linux.c' object='libLowLevel_a-lowlevel-linux.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libLowLevel_a_CPPFLAGS) $(CPPFLAGS) $(libLowLevel_a_CFLAGS) $(CFLAGS) -c -o libLowLevel_a-lowlevel-linux.o `test -f 'lowlevel-linux.c' || echo '$(srcdir)/'`lowlevel-linux.c libLowLevel_a-lowlevel-linux.obj: lowlevel-linux.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libLowLevel_a_CPPFLAGS) $(CPPFLAGS) $(libLowLevel_a_CFLAGS) $(CFLAGS) -MT libLowLevel_a-lowlevel-linux.obj -MD -MP -MF $(DEPDIR)/libLowLevel_a-lowlevel-linux.Tpo -c -o libLowLevel_a-lowlevel-linux.obj `if test -f 'lowlevel-linux.c'; then $(CYGPATH_W) 'lowlevel-linux.c'; else $(CYGPATH_W) '$(srcdir)/lowlevel-linux.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libLowLevel_a-lowlevel-linux.Tpo $(DEPDIR)/libLowLevel_a-lowlevel-linux.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='lowlevel-linux.c' object='libLowLevel_a-lowlevel-linux.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libLowLevel_a_CPPFLAGS) $(CPPFLAGS) $(libLowLevel_a_CFLAGS) $(CFLAGS) -c -o libLowLevel_a-lowlevel-linux.obj `if test -f 'lowlevel-linux.c'; then $(CYGPATH_W) 'lowlevel-linux.c'; else $(CYGPATH_W) '$(srcdir)/lowlevel-linux.c'; fi` libLowLevel_a-lowlevel-linux-link-state.o: lowlevel-linux-link-state.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libLowLevel_a_CPPFLAGS) $(CPPFLAGS) $(libLowLevel_a_CFLAGS) $(CFLAGS) -MT libLowLevel_a-lowlevel-linux-link-state.o -MD -MP -MF $(DEPDIR)/libLowLevel_a-lowlevel-linux-link-state.Tpo -c -o libLowLevel_a-lowlevel-linux-link-state.o `test -f 'lowlevel-linux-link-state.c' || echo '$(srcdir)/'`lowlevel-linux-link-state.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libLowLevel_a-lowlevel-linux-link-state.Tpo $(DEPDIR)/libLowLevel_a-lowlevel-linux-link-state.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='lowlevel-linux-link-state.c' object='libLowLevel_a-lowlevel-linux-link-state.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libLowLevel_a_CPPFLAGS) $(CPPFLAGS) $(libLowLevel_a_CFLAGS) $(CFLAGS) -c -o libLowLevel_a-lowlevel-linux-link-state.o `test -f 'lowlevel-linux-link-state.c' || echo '$(srcdir)/'`lowlevel-linux-link-state.c libLowLevel_a-lowlevel-linux-link-state.obj: lowlevel-linux-link-state.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libLowLevel_a_CPPFLAGS) $(CPPFLAGS) $(libLowLevel_a_CFLAGS) $(CFLAGS) -MT libLowLevel_a-lowlevel-linux-link-state.obj -MD -MP -MF $(DEPDIR)/libLowLevel_a-lowlevel-linux-link-state.Tpo -c -o libLowLevel_a-lowlevel-linux-link-state.obj `if test -f 'lowlevel-linux-link-state.c'; then $(CYGPATH_W) 'lowlevel-linux-link-state.c'; else $(CYGPATH_W) '$(srcdir)/lowlevel-linux-link-state.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libLowLevel_a-lowlevel-linux-link-state.Tpo $(DEPDIR)/libLowLevel_a-lowlevel-linux-link-state.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='lowlevel-linux-link-state.c' object='libLowLevel_a-lowlevel-linux-link-state.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libLowLevel_a_CPPFLAGS) $(CPPFLAGS) $(libLowLevel_a_CFLAGS) $(CFLAGS) -c -o libLowLevel_a-lowlevel-linux-link-state.obj `if test -f 'lowlevel-linux-link-state.c'; then $(CYGPATH_W) 'lowlevel-linux-link-state.c'; else $(CYGPATH_W) '$(srcdir)/lowlevel-linux-link-state.c'; fi` libLowLevel_a-lowlevel-options-linux.o: lowlevel-options-linux.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libLowLevel_a_CPPFLAGS) $(CPPFLAGS) $(libLowLevel_a_CFLAGS) $(CFLAGS) -MT libLowLevel_a-lowlevel-options-linux.o -MD -MP -MF $(DEPDIR)/libLowLevel_a-lowlevel-options-linux.Tpo -c -o libLowLevel_a-lowlevel-options-linux.o `test -f 'lowlevel-options-linux.c' || echo '$(srcdir)/'`lowlevel-options-linux.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libLowLevel_a-lowlevel-options-linux.Tpo $(DEPDIR)/libLowLevel_a-lowlevel-options-linux.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='lowlevel-options-linux.c' object='libLowLevel_a-lowlevel-options-linux.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libLowLevel_a_CPPFLAGS) $(CPPFLAGS) $(libLowLevel_a_CFLAGS) $(CFLAGS) -c -o libLowLevel_a-lowlevel-options-linux.o `test -f 'lowlevel-options-linux.c' || echo '$(srcdir)/'`lowlevel-options-linux.c libLowLevel_a-lowlevel-options-linux.obj: lowlevel-options-linux.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libLowLevel_a_CPPFLAGS) $(CPPFLAGS) $(libLowLevel_a_CFLAGS) $(CFLAGS) -MT libLowLevel_a-lowlevel-options-linux.obj -MD -MP -MF $(DEPDIR)/libLowLevel_a-lowlevel-options-linux.Tpo -c -o libLowLevel_a-lowlevel-options-linux.obj `if test -f 'lowlevel-options-linux.c'; then $(CYGPATH_W) 'lowlevel-options-linux.c'; else $(CYGPATH_W) '$(srcdir)/lowlevel-options-linux.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libLowLevel_a-lowlevel-options-linux.Tpo $(DEPDIR)/libLowLevel_a-lowlevel-options-linux.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='lowlevel-options-linux.c' object='libLowLevel_a-lowlevel-options-linux.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libLowLevel_a_CPPFLAGS) $(CPPFLAGS) $(libLowLevel_a_CFLAGS) $(CFLAGS) -c -o libLowLevel_a-lowlevel-options-linux.obj `if test -f 'lowlevel-options-linux.c'; then $(CYGPATH_W) 'lowlevel-options-linux.c'; else $(CYGPATH_W) '$(srcdir)/lowlevel-options-linux.c'; fi` libLowLevel_a-utils.o: utils.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libLowLevel_a_CPPFLAGS) $(CPPFLAGS) $(libLowLevel_a_CFLAGS) $(CFLAGS) -MT libLowLevel_a-utils.o -MD -MP -MF $(DEPDIR)/libLowLevel_a-utils.Tpo -c -o libLowLevel_a-utils.o `test -f 'utils.c' || echo '$(srcdir)/'`utils.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libLowLevel_a-utils.Tpo $(DEPDIR)/libLowLevel_a-utils.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='utils.c' object='libLowLevel_a-utils.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libLowLevel_a_CPPFLAGS) $(CPPFLAGS) $(libLowLevel_a_CFLAGS) $(CFLAGS) -c -o libLowLevel_a-utils.o `test -f 'utils.c' || echo '$(srcdir)/'`utils.c libLowLevel_a-utils.obj: utils.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libLowLevel_a_CPPFLAGS) $(CPPFLAGS) $(libLowLevel_a_CFLAGS) $(CFLAGS) -MT libLowLevel_a-utils.obj -MD -MP -MF $(DEPDIR)/libLowLevel_a-utils.Tpo -c -o libLowLevel_a-utils.obj `if test -f 'utils.c'; then $(CYGPATH_W) 'utils.c'; else $(CYGPATH_W) '$(srcdir)/utils.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libLowLevel_a-utils.Tpo $(DEPDIR)/libLowLevel_a-utils.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='utils.c' object='libLowLevel_a-utils.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libLowLevel_a_CPPFLAGS) $(CPPFLAGS) $(libLowLevel_a_CFLAGS) $(CFLAGS) -c -o libLowLevel_a-utils.obj `if test -f 'utils.c'; then $(CYGPATH_W) 'utils.c'; else $(CYGPATH_W) '$(srcdir)/utils.c'; fi` .cpp.o: @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $< .cpp.obj: @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .cpp.lo: @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LTCXXCOMPILE) -c -o $@ $< libLowLevel_a-daemon.o: daemon.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libLowLevel_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libLowLevel_a-daemon.o -MD -MP -MF $(DEPDIR)/libLowLevel_a-daemon.Tpo -c -o libLowLevel_a-daemon.o `test -f 'daemon.cpp' || echo '$(srcdir)/'`daemon.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libLowLevel_a-daemon.Tpo $(DEPDIR)/libLowLevel_a-daemon.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='daemon.cpp' object='libLowLevel_a-daemon.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libLowLevel_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libLowLevel_a-daemon.o `test -f 'daemon.cpp' || echo '$(srcdir)/'`daemon.cpp libLowLevel_a-daemon.obj: daemon.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libLowLevel_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libLowLevel_a-daemon.obj -MD -MP -MF $(DEPDIR)/libLowLevel_a-daemon.Tpo -c -o libLowLevel_a-daemon.obj `if test -f 'daemon.cpp'; then $(CYGPATH_W) 'daemon.cpp'; else $(CYGPATH_W) '$(srcdir)/daemon.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libLowLevel_a-daemon.Tpo $(DEPDIR)/libLowLevel_a-daemon.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='daemon.cpp' object='libLowLevel_a-daemon.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libLowLevel_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libLowLevel_a-daemon.obj `if test -f 'daemon.cpp'; then $(CYGPATH_W) 'daemon.cpp'; else $(CYGPATH_W) '$(srcdir)/daemon.cpp'; fi` mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LIBRARIES) $(DATA) installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool clean-noinstLIBRARIES \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \ clean-libtool clean-noinstLIBRARIES cscopelist-am ctags \ ctags-am distclean distclean-compile distclean-generic \ distclean-libtool distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-dvi install-dvi-am install-exec \ install-exec-am install-html install-html-am install-info \ install-info-am install-man install-pdf install-pdf-am \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ tags tags-am uninstall uninstall-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: dibbler-1.0.1/missing0000755000175000017500000001533112277722750011452 00000000000000#! /bin/sh # Common wrapper for a few potentially missing GNU programs. scriptversion=2012-06-26.16; # UTC # Copyright (C) 1996-2013 Free Software Foundation, Inc. # Originally written by Fran,cois Pinard , 1996. # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License # along with this program. If not, see . # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. if test $# -eq 0; then echo 1>&2 "Try '$0 --help' for more information" exit 1 fi case $1 in --is-lightweight) # Used by our autoconf macros to check whether the available missing # script is modern enough. exit 0 ;; --run) # Back-compat with the calling convention used by older automake. shift ;; -h|--h|--he|--hel|--help) echo "\ $0 [OPTION]... PROGRAM [ARGUMENT]... Run 'PROGRAM [ARGUMENT]...', returning a proper advice when this fails due to PROGRAM being missing or too old. Options: -h, --help display this help and exit -v, --version output version information and exit Supported PROGRAM values: aclocal autoconf autoheader autom4te automake makeinfo bison yacc flex lex help2man Version suffixes to PROGRAM as well as the prefixes 'gnu-', 'gnu', and 'g' are ignored when checking the name. Send bug reports to ." exit $? ;; -v|--v|--ve|--ver|--vers|--versi|--versio|--version) echo "missing $scriptversion (GNU Automake)" exit $? ;; -*) echo 1>&2 "$0: unknown '$1' option" echo 1>&2 "Try '$0 --help' for more information" exit 1 ;; esac # Run the given program, remember its exit status. "$@"; st=$? # If it succeeded, we are done. test $st -eq 0 && exit 0 # Also exit now if we it failed (or wasn't found), and '--version' was # passed; such an option is passed most likely to detect whether the # program is present and works. case $2 in --version|--help) exit $st;; esac # Exit code 63 means version mismatch. This often happens when the user # tries to use an ancient version of a tool on a file that requires a # minimum version. if test $st -eq 63; then msg="probably too old" elif test $st -eq 127; then # Program was missing. msg="missing on your system" else # Program was found and executed, but failed. Give up. exit $st fi perl_URL=http://www.perl.org/ flex_URL=http://flex.sourceforge.net/ gnu_software_URL=http://www.gnu.org/software program_details () { case $1 in aclocal|automake) echo "The '$1' program is part of the GNU Automake package:" echo "<$gnu_software_URL/automake>" echo "It also requires GNU Autoconf, GNU m4 and Perl in order to run:" echo "<$gnu_software_URL/autoconf>" echo "<$gnu_software_URL/m4/>" echo "<$perl_URL>" ;; autoconf|autom4te|autoheader) echo "The '$1' program is part of the GNU Autoconf package:" echo "<$gnu_software_URL/autoconf/>" echo "It also requires GNU m4 and Perl in order to run:" echo "<$gnu_software_URL/m4/>" echo "<$perl_URL>" ;; esac } give_advice () { # Normalize program name to check for. normalized_program=`echo "$1" | sed ' s/^gnu-//; t s/^gnu//; t s/^g//; t'` printf '%s\n' "'$1' is $msg." configure_deps="'configure.ac' or m4 files included by 'configure.ac'" case $normalized_program in autoconf*) echo "You should only need it if you modified 'configure.ac'," echo "or m4 files included by it." program_details 'autoconf' ;; autoheader*) echo "You should only need it if you modified 'acconfig.h' or" echo "$configure_deps." program_details 'autoheader' ;; automake*) echo "You should only need it if you modified 'Makefile.am' or" echo "$configure_deps." program_details 'automake' ;; aclocal*) echo "You should only need it if you modified 'acinclude.m4' or" echo "$configure_deps." program_details 'aclocal' ;; autom4te*) echo "You might have modified some maintainer files that require" echo "the 'automa4te' program to be rebuilt." program_details 'autom4te' ;; bison*|yacc*) echo "You should only need it if you modified a '.y' file." echo "You may want to install the GNU Bison package:" echo "<$gnu_software_URL/bison/>" ;; lex*|flex*) echo "You should only need it if you modified a '.l' file." echo "You may want to install the Fast Lexical Analyzer package:" echo "<$flex_URL>" ;; help2man*) echo "You should only need it if you modified a dependency" \ "of a man page." echo "You may want to install the GNU Help2man package:" echo "<$gnu_software_URL/help2man/>" ;; makeinfo*) echo "You should only need it if you modified a '.texi' file, or" echo "any other file indirectly affecting the aspect of the manual." echo "You might want to install the Texinfo package:" echo "<$gnu_software_URL/texinfo/>" echo "The spurious makeinfo call might also be the consequence of" echo "using a buggy 'make' (AIX, DU, IRIX), in which case you might" echo "want to install GNU make:" echo "<$gnu_software_URL/make/>" ;; *) echo "You might have modified some files without having the proper" echo "tools for further handling them. Check the 'README' file, it" echo "often tells you about the needed prerequisites for installing" echo "this package. You may also peek at any GNU archive site, in" echo "case some other package contains this missing '$1' program." ;; esac } give_advice "$1" | sed -e '1s/^/WARNING: /' \ -e '2,$s/^/ /' >&2 # Propagate the correct exit status (expected to be 127 for a program # not found, 63 for a program that failed due to version mismatch). exit $st # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC" # time-stamp-end: "; # UTC" # End: dibbler-1.0.1/Options/0000775000175000017500000000000012561700417011555 500000000000000dibbler-1.0.1/Options/OptReconfigureMsg.cpp0000644000175000017500000000310612304040124015564 00000000000000/* * Dibbler - a portable DHCPv6 * * authors: Grzegorz Pluto * changes: Tomasz Mrugalski * * released under GNU GPL v2 licence * */ #include #include #include #include "Logger.h" #include "Portable.h" #include "DHCPConst.h" #include "OptReconfigureMsg.h" TOptReconfigureMsg::TOptReconfigureMsg(int msgType, TMsg* parent) :TOpt(OPTION_RECONF_MSG, parent), MsgType_(msgType) { } TOptReconfigureMsg::TOptReconfigureMsg(char *buf, int bufsize, TMsg* parent) :TOpt(OPTION_RECONF_MSG, parent) { if ((unsigned int)bufsize != 1) { Valid = false; return; } MsgType_ = (unsigned char)(buf[0]); if( (MsgType_ != 5) && // renew, as defined in RFC3315 (MsgType_ != 11) && // inf-request, as defined in RFC3315 (MsgType_ != 6) ) { //rebind, as defined in draft-ietf-dhc-dhcpv6-reconfigure-rebind-08 Log(Warning) << "Invalid content of reconfigure option. Message type " << (int)MsgType_ << " not valid (only 5,7 and 11 are)." << LogEnd; Valid = false; return; } } size_t TOptReconfigureMsg::getSize() { return 4 + 1; // header (4) + data-length (1) } char * TOptReconfigureMsg::storeSelf( char* buf) { buf = writeUint16(buf, OptType); buf = writeUint16(buf, 1); // length buf = writeUint8(buf, MsgType_); //*buf = (char)MsgType_; return buf+1; } bool TOptReconfigureMsg::isValid() const { if ( MsgType_==RENEW_MSG || MsgType_==INFORMATION_REQUEST_MSG || MsgType_==REBIND_MSG ) return true; return false; } dibbler-1.0.1/Options/OptAddrLst.cpp0000644000175000017500000000264612277722750014237 00000000000000/* * Dibbler - a portable DHCPv6 * * authors: Tomasz Mrugalski * Marek Senderski * * released under GNU GPL v2 licence * */ #include #include #include "Portable.h" #include "OptAddrLst.h" #include "DHCPConst.h" TOptAddrLst::TOptAddrLst(int type, List(TIPv6Addr) lst, TMsg* parent) :TOpt(type, parent), AddrLst(lst) { } TOptAddrLst::TOptAddrLst(int type, const char* buf, unsigned short bufSize, TMsg* parent) :TOpt(type, parent) { while(bufSize>0) { if (bufSize<16) { Valid = false; return; } this->AddrLst.append(new TIPv6Addr(buf)); buf +=16; bufSize -= 16; } Valid = true; return; } char * TOptAddrLst::storeSelf(char* buf) { SPtr addr; buf = writeUint16(buf, OptType); buf = writeUint16(buf, getSize()-4); AddrLst.first(); while(addr=AddrLst.get()) buf=addr->storeSelf(buf); return buf; } size_t TOptAddrLst::getSize() { return 4+16*AddrLst.count(); } void TOptAddrLst::firstAddr() { this->AddrLst.first(); } SPtr TOptAddrLst::getAddr() { return this->AddrLst.get(); } bool TOptAddrLst::isValid() const { return this->Valid; } std::string TOptAddrLst::getPlain() { std::stringstream tmp; AddrLst.first(); SPtr addr; while (addr = AddrLst.get()) { tmp << addr->getPlain() << " "; } return tmp.str(); } dibbler-1.0.1/Options/OptFQDN.cpp0000644000175000017500000001257412277722750013433 00000000000000/* * Dibbler - a portable DHCPv6 * * authors: Adrien CLERC, Bahattin DEMIRPLAK, Gaëtant ELEOUET * Mickaël GUÉRIN, Lionel GUILMIN, Lauréline PROVOST * from ENSEEIHT, Toulouse, France * * released under GNU GPL v2 licence * */ #include #include #include #include "Portable.h" #include "OptFQDN.h" #include "Logger.h" #include "Portable.h" using namespace std; TOptFQDN::TOptFQDN(const std::string& domain, TMsg* parent) :TOpt(OPTION_FQDN, parent), fqdn_(domain), flag_N_(false), flag_O_(false), flag_S_(false) { // The O flag is always off in client messages. Valid = true; } TOptFQDN::TOptFQDN(const char * buf, int bufsize, TMsg* parent) :TOpt(OPTION_FQDN, parent) { Valid = false; // empty fqdn field is ok (section 4.2 of RFC4704), but it must have // bits field if (bufsize < 1) { Log(Warning) << "Truncated FQDN option received." << LogEnd; return; } // Extracting flags... unsigned char flags = *buf; flag_N_ = flags & FQDN_N; flag_S_ = flags & FQDN_S; flag_O_ = flags & FQDN_O; buf += 1; bufsize -= 1; //Extracting domain name fqdn_ = ""; if (bufsize <= 255 ) { unsigned char tmplength; while (bufsize>0) { tmplength = *buf; buf++; bufsize--; if (tmplength>bufsize) { Log(Warning) << "Malformed FQDN option: domain name encoding is invalid." << LogEnd; return; } if (tmplength == 0) { buf += bufsize; bufsize = 0; } else { if (fqdn_.length()) fqdn_.append("."); fqdn_.append(buf, tmplength); buf += tmplength; bufsize -= tmplength; } } Valid = true; } else { Log(Warning) << "Too long FQDN option (len=" << bufsize << ") received." << LogEnd; return; } Log(Debug) << "FQDN: FQDN option received: fqdn name=" << (fqdn_.length() ? fqdn_ : "[empty]") << LogEnd; } TOptFQDN::~TOptFQDN() { return; } void TOptFQDN::setNFlag(bool flag) { flag_N_ = flag; } void TOptFQDN::setSFlag(bool flag) { flag_S_ = flag; } void TOptFQDN::setOFlag(bool flag) { flag_O_ = flag; } std::string TOptFQDN::getFQDN() const { return fqdn_; } /** * @brief returns option size * * Each dot will be removed from the string, and replaced with a length < 63 * The first length and the final 0 will increased the fqdn string length by 2 * We also have to add 4 for the header (option type and size) and 1 for the flags. * 2 + 1 + 4 = 7 * * @return size of the option (without option header) */ size_t TOptFQDN::getSize() { if (fqdn_.length()) { //the final 0 should be present only for full fqdn, not for partial hostname //we distinguish between them by dot . presence if ((fqdn_.find('.',0) == string::npos) || (fqdn_[fqdn_.length()-1] == '.') ) //ends with dot => do not add final 0, will be //made from existing dot final position return fqdn_.length() + 6; return fqdn_.length() + 7; //contains '.' => full fqdn } else //the final 0 should be present only for non-empty filed //rfc4704 : A client MAY also leave the Domain Name field empty if it desires the //server to provide a name. return 5; } char * TOptFQDN::storeSelf(char *buffer) { // Type and size buffer = writeUint16(buffer, OptType); buffer = writeUint16(buffer, getSize()-4); //Flag Initialization *buffer = 0; if (flag_N_) { *buffer |= FQDN_N; } if (flag_S_) { *buffer |= FQDN_S; } if (flag_O_) { *buffer |= FQDN_O; } buffer++; //FQDN field if (fqdn_.empty()) { // no FQDN? Ok, we're done then return buffer; } string copy = fqdn_; bool endzero = false; std::string::size_type dotpos = copy.find('.', 0); while(dotpos != string::npos) { endzero = true; //data is full fqdn, append zero at the end // write length *buffer = dotpos; buffer++; // write label memcpy(buffer, copy.c_str(), dotpos); buffer += dotpos; copy = copy.substr(dotpos + 1, copy.length()); // substring dotpos = copy.find('.', 0); } *buffer = copy.length(); //copy.length()==0 => the data ends with dot. (full fqdn forced) buffer++; if (copy.empty()) { return buffer; } memcpy(buffer, copy.c_str(), copy.length()); buffer += copy.length(); if (endzero) { //add final 0 only if not assigned by converting the dot //i.e. the data is fqdn not already ended with dot. *buffer = 0; buffer++; } return buffer; } std::string TOptFQDN::getPlain() { stringstream tmp; tmp << fqdn_; if (flag_N_) tmp << " N"; if (flag_O_) tmp << " O"; if (flag_S_) tmp << " S"; return tmp.str(); } bool TOptFQDN::isValid() const { /// @todo Check the validity of this option return Valid; } bool TOptFQDN::getNFlag() const { return flag_N_; } bool TOptFQDN::getSFlag() const { return flag_S_; } bool TOptFQDN::getOFlag() const { return flag_O_; } bool TOptFQDN::doDuties() { return true; } dibbler-1.0.1/Options/OptVendorSpecInfo.h0000644000175000017500000000271712304040124015205 00000000000000/* * Dibbler - a portable DHCPv6 * * authors: Tomasz Mrugalski * * * released under GNU GPL v2 only licence */ #ifndef OPTVENDORSPECINFO_H #define OPTVENDORSPECINFO_H #include "Opt.h" #include "SmartPtr.h" #include "IPv6Addr.h" #include class TOptVendorSpecInfo : public TOpt { public: TOptVendorSpecInfo(uint16_t type, char * buf, int n, TMsg* parent); TOptVendorSpecInfo(uint16_t code, uint32_t enterprise, uint16_t sub_option_code, const char *data, int dataLen, TMsg* parent); TOptVendorSpecInfo(uint16_t code, uint32_t enterprise, uint16_t sub_option_code, SPtr addr, TMsg* parent); TOptVendorSpecInfo(uint16_t code, uint32_t enterprise, uint16_t sub_option_code, const std::string& str, TMsg* parent); size_t getSize(); char * storeSelf(char* buf); virtual bool isValid() const; virtual std::string getPlain(); uint32_t getVendor(); ~TOptVendorSpecInfo(); bool doDuties() { return true; } protected: /// @brief utility function that appends sub-option with specified code and data /// /// @param sub_option_code the code of suboption to be added /// @param data specifies sub-option length /// @param data_len pointer to the sub-option data void createSuboption(uint16_t sub_option_code, const char* data, size_t data_len); uint32_t Vendor_; }; #endif /* OPTVENDORSPECINFO_H */ dibbler-1.0.1/Options/tests/0000775000175000017500000000000012561700417012717 500000000000000dibbler-1.0.1/Options/tests/run_tests.cpp0000664000175000017500000000031412233256142015364 00000000000000#define STDC_HEADERS 1 #include #include int main(int argc, char* argv[]) { testing::InitGoogleTest(&argc, argv); int status = RUN_ALL_TESTS(); return status; } dibbler-1.0.1/Options/tests/OptFQDN_unittest.cc0000644000175000017500000000625412277722750016335 00000000000000#include #include "DHCPConst.h" #include "OptFQDN.h" using namespace std; namespace { // fully fualified domain name const uint8_t expected1_len = 22; const uint8_t expected1[] = { 0, OPTION_FQDN, 0, expected1_len, 0x7, // flags 0x8, 'h', 'o', 's', 't', 'n', 'a', 'm', 'e', 0x6, 'd', 'o', 'm', 'a', 'i', 'n', 0x3, 'o', 'r', 'g', 0x0 }; // just a hostname (no trailing 0, so it does not end with a .) const uint8_t expected2_len = 15; const uint8_t expected2[] = { 0, OPTION_FQDN, 0, expected2_len, 0x5, // flags 13, 'j', 'u', 's', 't', 'a', 'h', 'o', 's', 't', 'n', 'a', 'm', 'e' }; // empty option. (RFC4704, Section 4.2: A client MAY also leave the Domain // Name field empty if it desires the server to provide a name. const uint8_t expected3_len = 1; const uint8_t expected3[] = { 0, OPTION_FQDN, 0, expected3_len, 0x2 /* flags */ }; TEST(OptFQDNTest, parseBuildFullyQualified) { char buf[128]; TOptFQDN* opt = new TOptFQDN((char*)expected1 + 4, (int)expected1_len, NULL); EXPECT_EQ(OPTION_FQDN, opt->getOptType() ); EXPECT_EQ(expected1_len + 4u, opt->getSize()); EXPECT_EQ(true, opt->isValid()); EXPECT_EQ("hostname.domain.org", opt->getFQDN()); EXPECT_EQ(true, opt->getNFlag()); // 7 = N + O + S bits EXPECT_EQ(true, opt->getOFlag()); EXPECT_EQ(true, opt->getSFlag()); // check that parsed option can be stored back char * ptr = opt->storeSelf(buf); EXPECT_EQ(ptr, buf + expected1_len + 4); EXPECT_FALSE( memcmp(buf, expected1, expected1_len + 4) ); delete opt; } TEST(OptFQDNTest, parseBuildHostnameOnly) { char buf[128]; TOptFQDN* opt = new TOptFQDN((char*)expected2 + 4, (int)expected2_len, NULL); EXPECT_EQ(OPTION_FQDN, opt->getOptType() ); EXPECT_EQ(expected2_len + 4u, opt->getSize()); EXPECT_EQ(true, opt->isValid()); EXPECT_EQ("justahostname", opt->getFQDN()); EXPECT_EQ(true, opt->getNFlag()); // 5 = N + S bits EXPECT_EQ(false, opt->getOFlag()); EXPECT_EQ(true, opt->getSFlag()); // check that parsed option can be stored back char * ptr = opt->storeSelf(buf); EXPECT_EQ(ptr, buf + expected2_len + 4); EXPECT_FALSE( memcmp(buf, expected2, expected2_len + 4) ); delete opt; } TEST(OptFQDNTest, parseBuildEmpty) { char buf[128]; TOptFQDN* opt = new TOptFQDN((char*)expected3 + 4, (int)expected3_len, NULL); EXPECT_EQ(OPTION_FQDN, opt->getOptType() ); EXPECT_EQ(expected3_len + 4u, opt->getSize()); EXPECT_EQ(true, opt->isValid()); EXPECT_EQ("", opt->getFQDN()); EXPECT_EQ(false, opt->getNFlag()); // 2 = O bit only EXPECT_EQ(true, opt->getOFlag()); EXPECT_EQ(false, opt->getSFlag()); // check that parsed option can be stored back char * ptr = opt->storeSelf(buf); EXPECT_EQ(ptr, buf + expected3_len + 4); EXPECT_FALSE( memcmp(buf, expected3, expected3_len + 4) ); delete opt; } } dibbler-1.0.1/Options/tests/OptVendorSpecInfo_unittest.cc0000644000175000017500000000473712304040124020450 00000000000000#include #include "DHCPConst.h" #include "OptVendorSpecInfo.h" using namespace std; namespace { TEST(OptVendorSpecInfo, parse) { char buf[128]; char buf2[128]; char expected[] = { 0, OPTION_REMOTE_ID, 0, 17, // length = 18 bytes 0xfa, 0xce, 0xb0, 0x0c, // enterprise-id 0, 7, // sub-option 7 0, 9, // sub-option length 9 'r', 'e', 'm', 'o', 't', 'e', '-', 'i', 'd' }; TOptVendorSpecInfo* opt = new TOptVendorSpecInfo(OPTION_REMOTE_ID, expected+4, 17, NULL); EXPECT_EQ(OPTION_REMOTE_ID, opt->getOptType() ); EXPECT_EQ(21u, opt->getSize()); EXPECT_EQ(true, opt->isValid()); EXPECT_EQ(0xfaceb00c, opt->getVendor()); SPtr sub_opt = opt->getOption(7); ASSERT_TRUE(sub_opt); ASSERT_EQ(9u, sub_opt->getSize() - 4); sub_opt->storeSelf(buf2); EXPECT_EQ(0, memcmp(buf2, expected + 8, 13)); // check that parsed option can be stored back char * ptr = opt->storeSelf(buf); EXPECT_EQ(ptr, buf + 21); EXPECT_FALSE( memcmp(buf, expected, 21) ); delete opt; } TEST(OptionVendorSpecInfo, string) { char expected[] = { 0, OPTION_REMOTE_ID, 0, 17, // length = 18 bytes 0xfa, 0xce, 0xb0, 0x0c, // enterprise-id 0, 7, // sub-option 7 0, 9, // sub-option length 9 'r', 'e', 'm', 'o', 't', 'e', '-', 'i', 'd' }; const int expected_len = sizeof(expected); TOptVendorSpecInfo vendor(OPTION_REMOTE_ID, 0xfaceb00c, 7, string("remote-id"), NULL); char buf[128]; char* ptr = vendor.storeSelf(buf); EXPECT_EQ(ptr, buf + expected_len); EXPECT_EQ(0, memcmp(expected, buf, expected_len)); } // This test checks that the constructor that takes IPv6 address as a parameter // is working properly TEST(OptionVendorSpecInfo, addr) { char expected[] = { 0x01, 0x23, // option type = 0x123 0, 24, // length = 24 bytes 0x01, 0x23, 0x45, 0x67, // enterprise-id = 0x1234567 0x89, 0x01, // sub-option 0x8901 0, 16, // sub-option length 16 0x20, 0x01, 0xd, 0xb8, 0, 0, 0, 0, // IPv6 addr: 2001:db8::1 0, 0, 0, 0, 0, 0, 0, 1 }; const int expected_len = sizeof(expected); SPtr addr(new TIPv6Addr("2001:db8::1", true)); TOptVendorSpecInfo vendor(0x123, 0x01234567, 0x8901, addr, NULL); char buf[128]; char* ptr = vendor.storeSelf(buf); EXPECT_EQ(ptr, buf + expected_len); EXPECT_EQ(0, memcmp(expected, buf, expected_len)); } } dibbler-1.0.1/Options/tests/Makefile.am0000644000175000017500000000237112277722750014704 00000000000000AM_CPPFLAGS = -I$(top_srcdir)/Options AM_CPPFLAGS += -I$(top_srcdir)/Misc # This is to workaround long long in gtest.h AM_CPPFLAGS += $(GTEST_INCLUDES) -Wno-long-long -Wno-variadic-macros info: @echo "GTEST_LDADD=$(GTEST_LDADD)" @echo "GTEST_LDFLAGS=$(GTEST_LDFLAGS)" @echo "GTEST_INCLUDES=$(GTEST_INCLUDES)" @echo "HAVE_GTEST=$(HAVE_GTEST)" TESTS = if HAVE_GTEST TESTS += Opt_tests Opt_tests_SOURCES = run_tests.cpp Opt_tests_SOURCES += Opt_unittest.cc Opt_tests_SOURCES += OptAddr_unittest.cc Opt_tests_SOURCES += OptAuthentication_unittest.cc Opt_tests_SOURCES += OptIAAddress_unittest.cc Opt_tests_SOURCES += OptFQDN_unittest.cc Opt_tests_SOURCES += OptRtPrefix_unittest.cc Opt_tests_SOURCES += OptDomainLst_unittest.cc Opt_tests_SOURCES += OptUserClass_unittest.cc Opt_tests_SOURCES += OptVendorClass_unittest.cc Opt_tests_SOURCES += OptVendorSpecInfo_unittest.cc Opt_tests_SOURCES += OptVendorData_unittest.cc Opt_tests_LDFLAGS = $(AM_LDFLAGS) $(GTEST_LDFLAGS) Opt_tests_LDADD = $(GTEST_LDADD) Opt_tests_LDADD += $(top_builddir)/Options/libOptions.a Opt_tests_LDADD += $(top_builddir)/Messages/libMessages.a Opt_tests_LDADD += $(top_builddir)/Misc/libMisc.a Opt_tests_LDADD += $(top_builddir)/@PORT_SUBDIR@/libLowLevel.a endif noinst_PROGRAMS = $(TESTS) dibbler-1.0.1/Options/tests/OptUserClass_unittest.cc0000644000175000017500000000243212277722750017503 00000000000000#include #include "DHCPConst.h" #include "IPv6Addr.h" #include "OptUserClass.h" using namespace std; namespace { TEST(OptUserClassTest, parse) { char buf[128]; const char expected[] = { 0, OPTION_USER_CLASS, // OPTION_UNICAST 0, 21, // length = 18 bytes 0, 0x9, 'd', 'o', 'c', 's', 'i', 's', '3', '.', '0', 0, 0x2, 'i', 's', 0, 0x4, 'h', 'a', 'r', 'd' }; TOptUserClass* opt = new TOptUserClass(OPTION_USER_CLASS, expected+4, 21, NULL); EXPECT_EQ(OPTION_USER_CLASS, opt->getOptType() ); EXPECT_EQ(25u, opt->getSize()); EXPECT_EQ(true, opt->isValid()); ASSERT_EQ(3u, opt->userClassData_.size()); ASSERT_EQ(9u, opt->userClassData_[0].opaqueData_.size()); EXPECT_EQ(0, memcmp("docsis3.0", &opt->userClassData_[0].opaqueData_[0], 9)); ASSERT_EQ(2u, opt->userClassData_[1].opaqueData_.size()); EXPECT_EQ(0, memcmp("is", &opt->userClassData_[1].opaqueData_[0], 2)); ASSERT_EQ(4u, opt->userClassData_[2].opaqueData_.size()); EXPECT_EQ(0, memcmp("hard", &opt->userClassData_[2].opaqueData_[0], 4)); // check that parsed option can be stored back char * ptr = opt->storeSelf(buf); EXPECT_EQ(ptr, buf + 25); EXPECT_FALSE( memcmp(buf, expected, 25) ); delete opt; } } dibbler-1.0.1/Options/tests/OptVendorData_unittest.cc0000644000175000017500000000160012277722750017622 00000000000000#include #include "DHCPConst.h" #include "OptVendorData.h" using namespace std; namespace { const char expected[] = { 0, OPTION_REMOTE_ID, 0, 13, // length = 18 bytes 1, 2, 3, 4, 'r', 'e', 'm', 'o', 't', 'e', '-', 'i', 'd' }; TEST(OptVendorDataTest, parse) { char buf[128]; TOptVendorData* opt = new TOptVendorData(OPTION_REMOTE_ID, expected+4, 13, NULL); EXPECT_EQ(OPTION_REMOTE_ID, opt->getOptType() ); EXPECT_EQ(17u, opt->getSize()); EXPECT_EQ(true, opt->isValid()); EXPECT_EQ(0x1020304, opt->getVendor()); ASSERT_EQ(9, opt->getVendorDataLen()); EXPECT_EQ(0, memcmp("remote-id", opt->getVendorData(), 9)); // check that parsed option can be stored back char * ptr = opt->storeSelf(buf); EXPECT_EQ(ptr, buf + 17); EXPECT_FALSE( memcmp(buf, expected, 17) ); delete opt; } } dibbler-1.0.1/Options/tests/Opt_unittest.cc0000644000175000017500000000306712277722750015663 00000000000000#include #include "DHCPConst.h" #include "IPv6Addr.h" #include "Opt.h" #include "OptAddr.h" #include "OptGeneric.h" using namespace std; namespace { TEST(OptTest, basic) { SPtr addr = new TIPv6Addr("2001:db8:1::dead:beef", true); TOptAddr* opt = new TOptAddr(OPTION_UNICAST, addr, NULL); EXPECT_EQ(OPTION_UNICAST, opt->getOptType()); delete opt; } TEST(OptTest, suboptions) { char buf[128]; for (int i=0; i<128; i++) buf[i] = i; TOptGeneric* opt1 = new TOptGeneric(1, buf, 8, NULL); SPtr opt2 = new TOptGeneric(2, buf+8, 4, NULL); SPtr opt3 = new TOptGeneric(3, buf+12, 2, NULL); SPtr opt4 = new TOptGeneric(4, buf+14, 1, NULL); SPtr opt5 = new TOptGeneric(5, buf+15, 0, NULL); EXPECT_EQ(0, opt1->countOption()); opt1->addOption(opt2); EXPECT_EQ(1, opt1->countOption()); delete opt1; } TEST(OptTest, OptList) { char buf[128]; for (int i=0; i<128; i++) buf[i] = i; SPtr opt1 = new TOptGeneric(1, buf, 8, NULL); SPtr opt2 = new TOptGeneric(2, buf+8, 4, NULL); SPtr opt3 = new TOptGeneric(3, buf+12, 2, NULL); SPtr opt4 = new TOptGeneric(4, buf+14, 1, NULL); SPtr opt5 = new TOptGeneric(5, buf+15, 0, NULL); TOptList list; list.push_back(opt1); list.push_back(opt2); list.push_back(opt3); list.push_back(opt4); list.push_back(opt5); EXPECT_TRUE(TOpt::getOption(list, 1)); EXPECT_TRUE(TOpt::getOption(list, 5)); EXPECT_FALSE(TOpt::getOption(list, 6)); } } dibbler-1.0.1/Options/tests/OptVendorClass_unittest.cc0000644000175000017500000000255512277722750020030 00000000000000#include #include "DHCPConst.h" #include "OptVendorClass.h" using namespace std; namespace { const char expected[] = { 0, OPTION_VENDOR_CLASS, 0, 25, 1, 2, 3, 4, 0, 0x9, 'd', 'o', 'c', 's', 'i', 's', '3', '.', '0', 0, 0x2, 'i', 's', 0, 0x4, 'h', 'a', 'r', 'd' }; TEST(OptVendorClassTest, parse) { char buf[128]; TOptVendorClass* opt = new TOptVendorClass(OPTION_VENDOR_CLASS, expected+4, 25, NULL); EXPECT_EQ(OPTION_VENDOR_CLASS, opt->getOptType() ); EXPECT_EQ(29u, opt->getSize()); EXPECT_EQ(true, opt->isValid()); EXPECT_EQ(0x1020304u, opt->Enterprise_id_); ASSERT_EQ(3u, opt->userClassData_.size()); ASSERT_EQ(9u, opt->userClassData_[0].opaqueData_.size()); EXPECT_EQ(0, memcmp("docsis3.0", &opt->userClassData_[0].opaqueData_[0], 9)); ASSERT_EQ(2u, opt->userClassData_[1].opaqueData_.size()); EXPECT_EQ(0, memcmp("is", &opt->userClassData_[1].opaqueData_[0], 2)); ASSERT_EQ(4u, opt->userClassData_[2].opaqueData_.size()); EXPECT_EQ(0, memcmp("hard", &opt->userClassData_[2].opaqueData_[0], 4)); // check that parsed option can be stored back char * ptr = opt->storeSelf(buf); EXPECT_EQ(ptr, buf + 29); EXPECT_FALSE( memcmp(buf, expected, 29) ); delete opt; } } dibbler-1.0.1/Options/tests/OptAddr_unittest.cc0000664000175000017500000000367312233256142016450 00000000000000#include #include "DHCPConst.h" #include "IPv6Addr.h" #include "OptAddr.h" #include "OptGeneric.h" using namespace std; namespace { const char expected[] = { 0, 12, // OPTION_UNICAST 0, 16, // length = 16 bytes (+4 hdr=20) 0x20, 0x1, 0x0d, 0xb8, 0, 1, 0, 0, 0, 0, 0, 0, 0xde, 0xad, 0xbe, 0xef }; TEST(OptAddrTest, storeSelf) { char buf[128]; SPtr addr = new TIPv6Addr("2001:db8:1::dead:beef", true); TOptAddr* opt = new TOptAddr(OPTION_UNICAST, addr, NULL); char* ptr = opt->storeSelf(buf); ASSERT_EQ(buf+20, ptr); ASSERT_EQ(20u, opt->getSize()); ASSERT_FALSE( memcmp(buf, expected, 20) ); delete opt; } TEST(OptAddrTest, parse) { char buf[128]; TOptAddr* opt = new TOptAddr(OPTION_UNICAST, expected+4, 16, NULL); SPtr addr = opt->getAddr(); EXPECT_EQ(string("2001:db8:1::dead:beef"), addr->getPlain()); EXPECT_EQ(OPTION_UNICAST, opt->getOptType() ); opt->storeSelf(buf); EXPECT_FALSE( memcmp(buf, expected, 20) ); delete opt; } TEST(OptAddrTest, subopts) { char buf[128]; char genericPayload[4] = {51, 52, 53, 54}; SPtr generic = new TOptGeneric(0xface, genericPayload, 4, NULL); SPtr addr = new TIPv6Addr("2001:db8:1::1", true); // generic takes 8 bytes // next hop takes 20 bytes TOptAddr* nextHop = new TOptAddr(OPTION_NEXT_HOP, addr, NULL); EXPECT_EQ(20u, nextHop->getSize() ); nextHop->addOption(generic); EXPECT_EQ(28u, nextHop->getSize() ); char* ptr = nextHop->storeSelf(buf); ASSERT_EQ(buf+28, ptr); char expected[] = { OPTION_NEXT_HOP/256, OPTION_NEXT_HOP%256, 0, 24, 0x20, 0x01, 0x0d, 0xb8, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, // 2001:db8:1::1 0xfa, 0xce, 0, 4, 51, 52, 53, 54}; EXPECT_EQ(0, memcmp(buf, expected, 28) ); delete nextHop; } } dibbler-1.0.1/Options/tests/OptAuthentication_unittest.cc0000644000175000017500000001471312277722750020563 00000000000000#include #include #include "DHCPConst.h" #include "IPv6Addr.h" #include "OptAddr.h" #include "OptAuthentication.h" namespace test { TEST(OptAuthTest, constructorNone) { char expData[] = { 0, 11, // option type 0, 11, // option length 0, // protocol 0, // algorithm 1, // RDM = monotonic, 1, 2, 3, 4, 5, 6, 7, 8 }; // replay detection data char buf[100]; memset(buf, 0, sizeof(buf)); SPtr opt = new TOptAuthentication(AUTH_PROTO_NONE, 0, AUTH_REPLAY_MONOTONIC, NULL); opt->setReplayDetection(0x0102030405060708); char* ptr = opt->storeSelf(buf); EXPECT_EQ(15u, opt->getSize()); EXPECT_EQ(ptr, buf + 15); EXPECT_TRUE(0 == memcmp(buf, expData, 15)); } TEST(OptAuthTest, constructorReconfigureKey) { char expData1[] = { 0, 11, // option type 0, TOptAuthentication::OPT_AUTH_FIXED_SIZE + RECONFIGURE_KEY_AUTHINFO_SIZE, // option length 3, // protocol 0, // algorithm 1, // RDM = monotonic, 1, 2, 3, 4, 5, 6, 7, 8, // replay detection data 1, // type 1 = reconfigure-key 0xf, 0xe, 0xd, 0xc, 0xb, 0xa, 9, 8, // 16byte key 7, 6, 5, 4, 3, 2, 1, 0 }; char expData2[] = { 0, 11, // option type 0, TOptAuthentication::OPT_AUTH_FIXED_SIZE + RECONFIGURE_KEY_AUTHINFO_SIZE, // option length 3, // protocol 0, // algorithm 1, // RDM = monotonic, 1, 2, 3, 4, 5, 6, 7, 8, // replay detection data 2, // type 2 = HMAC-MD5 digest 0, 0, 0, 0, 0, 0, 0, 0, // zeroed - HMAC-MD5 digest will be calculated 0, 0, 0, 0, 0, 0, 0, 0 }; // later std::vector digest(17,0); for (int i=0; i<16; i++) { digest[i+1] = 15 - i; } char buf[100]; memset(buf, 0, sizeof(buf)); digest[0] = 1; // try with key type 1 = reconfigure-key SPtr opt = new TOptAuthentication(AUTH_PROTO_RECONFIGURE_KEY, 0, AUTH_REPLAY_MONOTONIC, NULL); opt->setReplayDetection(0x0102030405060708); opt->setPayload(digest); char* ptr = opt->storeSelf(buf); size_t expLen = TOpt::OPTION6_HDR_LEN + TOptAuthentication::OPT_AUTH_FIXED_SIZE + RECONFIGURE_KEY_AUTHINFO_SIZE; EXPECT_EQ(expLen, opt->getSize()); EXPECT_EQ(ptr, buf + expLen); EXPECT_TRUE(0 == memcmp(buf, expData1, expLen)); digest[0] = 2; // try with key type 2 = HMAC-MD5 digest opt = new TOptAuthentication(AUTH_PROTO_RECONFIGURE_KEY, 0, AUTH_REPLAY_MONOTONIC, NULL); opt->setReplayDetection(0x0102030405060708); opt->setPayload(digest); ptr = opt->storeSelf(buf); expLen = TOpt::OPTION6_HDR_LEN + TOptAuthentication::OPT_AUTH_FIXED_SIZE + RECONFIGURE_KEY_AUTHINFO_SIZE; EXPECT_EQ(expLen, opt->getSize()); EXPECT_EQ(ptr, buf + expLen); EXPECT_TRUE(0 == memcmp(buf, expData2, expLen)); } TEST(OptAuthTest, constructorDelayedAuth) { char expData1[] = { 0, 11, // option type 0, TOptAuthentication::OPT_AUTH_FIXED_SIZE, // option length 2, // protocol 1, // algorithm (HMAC-MD5) 1, // RDM = monotonic, 0, 0, 0, 0, 0, 0, 0, 0 // replay detection data }; const std::string realm = "DHCP realm"; char expData2[] = { 0, 11, // option type 0, static_cast(TOptAuthentication::OPT_AUTH_FIXED_SIZE + realm.size() + DELAYED_AUTH_DIGEST_SIZE + DELAYED_AUTH_KEY_ID_SIZE), // option length 2, // protocol 1, // algorithm (HMAC-MD5) 1, // RDM = monotonic, 1, 2, 3, 4, 5, 6, 7, 8, // replay detection data 'D', 'H', 'C', 'P', ' ', 'r', 'e', 'a', 'l', 'm', 0, 0, 0, 0, // key ID 0x0 0, 0, 0, 0, 0, 0, 0, 0, // zeroed - HMAC-MD5 digest will be calculated 0, 0, 0, 0, 0, 0, 0, 0 }; // later char buf[100]; memset(buf, 0, sizeof(buf)); // Try empty option (sent in SOLICIT) SPtr opt = new TOptAuthentication(AUTH_PROTO_DELAYED, 1, AUTH_REPLAY_MONOTONIC, NULL); opt->setReplayDetection(0x0); opt->setRealm(std::string("")); char* ptr = opt->storeSelf(buf); size_t expLen = TOpt::OPTION6_HDR_LEN + TOptAuthentication::OPT_AUTH_FIXED_SIZE; EXPECT_EQ(expLen, opt->getSize()); EXPECT_EQ(ptr, buf + expLen); EXPECT_TRUE(0 == memcmp(buf, expData1, expLen)); opt = new TOptAuthentication(AUTH_PROTO_DELAYED, 1, AUTH_REPLAY_MONOTONIC, NULL); opt->setReplayDetection(0x0102030405060708); opt->setRealm(realm); ptr = opt->storeSelf(buf); expLen = TOpt::OPTION6_HDR_LEN + TOptAuthentication::OPT_AUTH_FIXED_SIZE + realm.size() + + DELAYED_AUTH_DIGEST_SIZE + DELAYED_AUTH_KEY_ID_SIZE; EXPECT_EQ(expLen, opt->getSize()); EXPECT_EQ(ptr - buf, expLen); EXPECT_TRUE(0 == memcmp(buf, expData2, expLen)); } TEST(OptAuthTest, constructorDibbler) { char expData[] = { 0, 11, // option type 0, 15, // option length 4, // protocol 0, // algorithm 1, // RDM = monotonic, 1, 2, 3, 4, 5, 6, 7, 8, // replay detection data 0, 0, 0, 0}; // SPI = 0 (because there's no parent message) char buf[100]; memset(buf, 0, sizeof(buf)); SPtr opt = new TOptAuthentication(AUTH_PROTO_DIBBLER, 0, AUTH_REPLAY_MONOTONIC, NULL); opt->setReplayDetection(0x0102030405060708); char* ptr = opt->storeSelf(buf); EXPECT_EQ(19u, opt->getSize()); EXPECT_EQ(ptr, buf + 19); EXPECT_TRUE(0 == memcmp(buf, expData, 19)); } } dibbler-1.0.1/Options/tests/OptDomainLst_unittest.cc0000644000175000017500000000231012277722750017464 00000000000000#include #include "DHCPConst.h" #include "IPv6Addr.h" #include "OptDomainLst.h" using namespace std; namespace { const char expected[] = { 0, OPTION_NIS_DOMAIN_NAME, // OPTION_UNICAST 0, 18, // length = 18 bytes 0x4, 'a', 'f', 't', 'r', 0x7, 'e', 'x', 'a', 'm', 'p', 'l', 'e', 0x3, 'c', 'o', 'm', 0x0 }; TEST(OptAddrTest, storeSelf1) { char buf[128]; TOptDomainLst* opt = new TOptDomainLst(OPTION_NIS_DOMAIN_NAME, "aftr.example.com", NULL); char* ptr = opt->storeSelf(buf); ASSERT_EQ(buf+22, ptr); ASSERT_EQ(22u, opt->getSize()); ASSERT_FALSE( memcmp(buf, expected, 22) ); delete opt; } TEST(OptAddrTest, parse1) { char buf[128]; TOptDomainLst* opt = new TOptDomainLst(OPTION_NIS_DOMAIN_NAME, expected+4, 18, NULL); EXPECT_EQ(string("aftr.example.com"), opt->getDomain()); EXPECT_EQ(OPTION_NIS_DOMAIN_NAME, opt->getOptType() ); // check that parsed option can be stored back char * ptr = opt->storeSelf(buf); EXPECT_EQ(ptr, buf + 22); EXPECT_FALSE( memcmp(buf, expected, 22) ); delete opt; } } dibbler-1.0.1/Options/tests/Makefile.in0000664000175000017500000010710512561652535014717 00000000000000# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ TESTS = $(am__EXEEXT_1) @HAVE_GTEST_TRUE@am__append_1 = Opt_tests noinst_PROGRAMS = $(am__EXEEXT_2) subdir = Options/tests DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/depcomp $(top_srcdir)/test-driver ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/libtool.m4 \ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/include/dibbler-config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = @HAVE_GTEST_TRUE@am__EXEEXT_1 = Opt_tests$(EXEEXT) am__EXEEXT_2 = $(am__EXEEXT_1) PROGRAMS = $(noinst_PROGRAMS) am__Opt_tests_SOURCES_DIST = run_tests.cpp Opt_unittest.cc \ OptAddr_unittest.cc OptAuthentication_unittest.cc \ OptIAAddress_unittest.cc OptFQDN_unittest.cc \ OptRtPrefix_unittest.cc OptDomainLst_unittest.cc \ OptUserClass_unittest.cc OptVendorClass_unittest.cc \ OptVendorSpecInfo_unittest.cc OptVendorData_unittest.cc @HAVE_GTEST_TRUE@am_Opt_tests_OBJECTS = run_tests.$(OBJEXT) \ @HAVE_GTEST_TRUE@ Opt_unittest.$(OBJEXT) \ @HAVE_GTEST_TRUE@ OptAddr_unittest.$(OBJEXT) \ @HAVE_GTEST_TRUE@ OptAuthentication_unittest.$(OBJEXT) \ @HAVE_GTEST_TRUE@ OptIAAddress_unittest.$(OBJEXT) \ @HAVE_GTEST_TRUE@ OptFQDN_unittest.$(OBJEXT) \ @HAVE_GTEST_TRUE@ OptRtPrefix_unittest.$(OBJEXT) \ @HAVE_GTEST_TRUE@ OptDomainLst_unittest.$(OBJEXT) \ @HAVE_GTEST_TRUE@ OptUserClass_unittest.$(OBJEXT) \ @HAVE_GTEST_TRUE@ OptVendorClass_unittest.$(OBJEXT) \ @HAVE_GTEST_TRUE@ OptVendorSpecInfo_unittest.$(OBJEXT) \ @HAVE_GTEST_TRUE@ OptVendorData_unittest.$(OBJEXT) Opt_tests_OBJECTS = $(am_Opt_tests_OBJECTS) am__DEPENDENCIES_1 = @HAVE_GTEST_TRUE@Opt_tests_DEPENDENCIES = $(am__DEPENDENCIES_1) \ @HAVE_GTEST_TRUE@ $(top_builddir)/Options/libOptions.a \ @HAVE_GTEST_TRUE@ $(top_builddir)/Messages/libMessages.a \ @HAVE_GTEST_TRUE@ $(top_builddir)/Misc/libMisc.a \ @HAVE_GTEST_TRUE@ $(top_builddir)/@PORT_SUBDIR@/libLowLevel.a AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = Opt_tests_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \ $(CXXFLAGS) $(Opt_tests_LDFLAGS) $(LDFLAGS) -o $@ AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)/include depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) LTCXXCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CXXFLAGS) $(CXXFLAGS) AM_V_CXX = $(am__v_CXX_@AM_V@) am__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@) am__v_CXX_0 = @echo " CXX " $@; am__v_CXX_1 = CXXLD = $(CXX) CXXLINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \ $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CXXLD = $(am__v_CXXLD_@AM_V@) am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@) am__v_CXXLD_0 = @echo " CXXLD " $@; am__v_CXXLD_1 = SOURCES = $(Opt_tests_SOURCES) DIST_SOURCES = $(am__Opt_tests_SOURCES_DIST) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags am__tty_colors_dummy = \ mgn= red= grn= lgn= blu= brg= std=; \ am__color_tests=no am__tty_colors = { \ $(am__tty_colors_dummy); \ if test "X$(AM_COLOR_TESTS)" = Xno; then \ am__color_tests=no; \ elif test "X$(AM_COLOR_TESTS)" = Xalways; then \ am__color_tests=yes; \ elif test "X$$TERM" != Xdumb && { test -t 1; } 2>/dev/null; then \ am__color_tests=yes; \ fi; \ if test $$am__color_tests = yes; then \ red=''; \ grn=''; \ lgn=''; \ blu=''; \ mgn=''; \ brg=''; \ std=''; \ fi; \ } am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__recheck_rx = ^[ ]*:recheck:[ ]* am__global_test_result_rx = ^[ ]*:global-test-result:[ ]* am__copy_in_global_log_rx = ^[ ]*:copy-in-global-log:[ ]* # A command that, given a newline-separated list of test names on the # standard input, print the name of the tests that are to be re-run # upon "make recheck". am__list_recheck_tests = $(AWK) '{ \ recheck = 1; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ { \ if ((getline line2 < ($$0 ".log")) < 0) \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[nN][Oo]/) \ { \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[yY][eE][sS]/) \ { \ break; \ } \ }; \ if (recheck) \ print $$0; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # A command that, given a newline-separated list of test names on the # standard input, create the global log from their .trs and .log files. am__create_global_log = $(AWK) ' \ function fatal(msg) \ { \ print "fatal: making $@: " msg | "cat >&2"; \ exit 1; \ } \ function rst_section(header) \ { \ print header; \ len = length(header); \ for (i = 1; i <= len; i = i + 1) \ printf "="; \ printf "\n\n"; \ } \ { \ copy_in_global_log = 1; \ global_test_result = "RUN"; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".trs"); \ if (line ~ /$(am__global_test_result_rx)/) \ { \ sub("$(am__global_test_result_rx)", "", line); \ sub("[ ]*$$", "", line); \ global_test_result = line; \ } \ else if (line ~ /$(am__copy_in_global_log_rx)[nN][oO]/) \ copy_in_global_log = 0; \ }; \ if (copy_in_global_log) \ { \ rst_section(global_test_result ": " $$0); \ while ((rc = (getline line < ($$0 ".log"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".log"); \ print line; \ }; \ printf "\n"; \ }; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # Restructured Text title. am__rst_title = { sed 's/.*/ & /;h;s/./=/g;p;x;s/ *$$//;p;g' && echo; } # Solaris 10 'make', and several other traditional 'make' implementations, # pass "-e" to $(SHELL), and POSIX 2008 even requires this. Work around it # by disabling -e (using the XSI extension "set +e") if it's set. am__sh_e_setup = case $$- in *e*) set +e;; esac # Default flags passed to test drivers. am__common_driver_flags = \ --color-tests "$$am__color_tests" \ --enable-hard-errors "$$am__enable_hard_errors" \ --expect-failure "$$am__expect_failure" # To be inserted before the command running the test. Creates the # directory for the log if needed. Stores in $dir the directory # containing $f, in $tst the test, in $log the log. Executes the # developer- defined test setup AM_TESTS_ENVIRONMENT (if any), and # passes TESTS_ENVIRONMENT. Set up options for the wrapper that # will run the test scripts (or their associated LOG_COMPILER, if # thy have one). am__check_pre = \ $(am__sh_e_setup); \ $(am__vpath_adj_setup) $(am__vpath_adj) \ $(am__tty_colors); \ srcdir=$(srcdir); export srcdir; \ case "$@" in \ */*) am__odir=`echo "./$@" | sed 's|/[^/]*$$||'`;; \ *) am__odir=.;; \ esac; \ test "x$$am__odir" = x"." || test -d "$$am__odir" \ || $(MKDIR_P) "$$am__odir" || exit $$?; \ if test -f "./$$f"; then dir=./; \ elif test -f "$$f"; then dir=; \ else dir="$(srcdir)/"; fi; \ tst=$$dir$$f; log='$@'; \ if test -n '$(DISABLE_HARD_ERRORS)'; then \ am__enable_hard_errors=no; \ else \ am__enable_hard_errors=yes; \ fi; \ case " $(XFAIL_TESTS) " in \ *[\ \ ]$$f[\ \ ]* | *[\ \ ]$$dir$$f[\ \ ]*) \ am__expect_failure=yes;; \ *) \ am__expect_failure=no;; \ esac; \ $(AM_TESTS_ENVIRONMENT) $(TESTS_ENVIRONMENT) # A shell command to get the names of the tests scripts with any registered # extension removed (i.e., equivalently, the names of the test logs, with # the '.log' extension removed). The result is saved in the shell variable # '$bases'. This honors runtime overriding of TESTS and TEST_LOGS. Sadly, # we cannot use something simpler, involving e.g., "$(TEST_LOGS:.log=)", # since that might cause problem with VPATH rewrites for suffix-less tests. # See also 'test-harness-vpath-rewrite.sh' and 'test-trs-basic.sh'. am__set_TESTS_bases = \ bases='$(TEST_LOGS)'; \ bases=`for i in $$bases; do echo $$i; done | sed 's/\.log$$//'`; \ bases=`echo $$bases` RECHECK_LOGS = $(TEST_LOGS) AM_RECURSIVE_TARGETS = check recheck TEST_SUITE_LOG = test-suite.log TEST_EXTENSIONS = @EXEEXT@ .test LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver LOG_COMPILE = $(LOG_COMPILER) $(AM_LOG_FLAGS) $(LOG_FLAGS) am__set_b = \ case '$@' in \ */*) \ case '$*' in \ */*) b='$*';; \ *) b=`echo '$@' | sed 's/\.log$$//'`; \ esac;; \ *) \ b='$*';; \ esac am__test_logs1 = $(TESTS:=.log) am__test_logs2 = $(am__test_logs1:@EXEEXT@.log=.log) TEST_LOGS = $(am__test_logs2:.test.log=.log) TEST_LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver TEST_LOG_COMPILE = $(TEST_LOG_COMPILER) $(AM_TEST_LOG_FLAGS) \ $(TEST_LOG_FLAGS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALLOCA = @ALLOCA@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ ARCH = @ARCH@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ EXTRA_DIST_SUBDIRS = @EXTRA_DIST_SUBDIRS@ FGREP = @FGREP@ GREP = @GREP@ GTEST_INCLUDES = @GTEST_INCLUDES@ GTEST_LDADD = @GTEST_LDADD@ GTEST_LDFLAGS = @GTEST_LDFLAGS@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LINKPRINT = @LINKPRINT@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PORT_CFLAGS = @PORT_CFLAGS@ PORT_LDFLAGS = @PORT_LDFLAGS@ PORT_SUBDIR = @PORT_SUBDIR@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ subdirs = @subdirs@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ # This is to workaround long long in gtest.h AM_CPPFLAGS = -I$(top_srcdir)/Options -I$(top_srcdir)/Misc \ $(GTEST_INCLUDES) -Wno-long-long -Wno-variadic-macros @HAVE_GTEST_TRUE@Opt_tests_SOURCES = run_tests.cpp Opt_unittest.cc \ @HAVE_GTEST_TRUE@ OptAddr_unittest.cc \ @HAVE_GTEST_TRUE@ OptAuthentication_unittest.cc \ @HAVE_GTEST_TRUE@ OptIAAddress_unittest.cc OptFQDN_unittest.cc \ @HAVE_GTEST_TRUE@ OptRtPrefix_unittest.cc \ @HAVE_GTEST_TRUE@ OptDomainLst_unittest.cc \ @HAVE_GTEST_TRUE@ OptUserClass_unittest.cc \ @HAVE_GTEST_TRUE@ OptVendorClass_unittest.cc \ @HAVE_GTEST_TRUE@ OptVendorSpecInfo_unittest.cc \ @HAVE_GTEST_TRUE@ OptVendorData_unittest.cc @HAVE_GTEST_TRUE@Opt_tests_LDFLAGS = $(AM_LDFLAGS) $(GTEST_LDFLAGS) @HAVE_GTEST_TRUE@Opt_tests_LDADD = $(GTEST_LDADD) \ @HAVE_GTEST_TRUE@ $(top_builddir)/Options/libOptions.a \ @HAVE_GTEST_TRUE@ $(top_builddir)/Messages/libMessages.a \ @HAVE_GTEST_TRUE@ $(top_builddir)/Misc/libMisc.a \ @HAVE_GTEST_TRUE@ $(top_builddir)/@PORT_SUBDIR@/libLowLevel.a all: all-am .SUFFIXES: .SUFFIXES: .cc .cpp .lo .log .o .obj .test .test$(EXEEXT) .trs $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign Options/tests/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign Options/tests/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstPROGRAMS: @list='$(noinst_PROGRAMS)'; test -n "$$list" || exit 0; \ echo " rm -f" $$list; \ rm -f $$list || exit $$?; \ test -n "$(EXEEXT)" || exit 0; \ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ echo " rm -f" $$list; \ rm -f $$list Opt_tests$(EXEEXT): $(Opt_tests_OBJECTS) $(Opt_tests_DEPENDENCIES) $(EXTRA_Opt_tests_DEPENDENCIES) @rm -f Opt_tests$(EXEEXT) $(AM_V_CXXLD)$(Opt_tests_LINK) $(Opt_tests_OBJECTS) $(Opt_tests_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/OptAddr_unittest.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/OptAuthentication_unittest.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/OptDomainLst_unittest.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/OptFQDN_unittest.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/OptIAAddress_unittest.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/OptRtPrefix_unittest.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/OptUserClass_unittest.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/OptVendorClass_unittest.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/OptVendorData_unittest.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/OptVendorSpecInfo_unittest.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Opt_unittest.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/run_tests.Po@am__quote@ .cc.o: @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $< .cc.obj: @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .cc.lo: @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LTCXXCOMPILE) -c -o $@ $< .cpp.o: @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $< .cpp.obj: @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .cpp.lo: @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LTCXXCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags # Recover from deleted '.trs' file; this should ensure that # "rm -f foo.log; make foo.trs" re-run 'foo.test', and re-create # both 'foo.log' and 'foo.trs'. Break the recipe in two subshells # to avoid problems with "make -n". .log.trs: rm -f $< $@ $(MAKE) $(AM_MAKEFLAGS) $< # Leading 'am--fnord' is there to ensure the list of targets does not # expand to empty, as could happen e.g. with make check TESTS=''. am--fnord $(TEST_LOGS) $(TEST_LOGS:.log=.trs): $(am__force_recheck) am--force-recheck: @: $(TEST_SUITE_LOG): $(TEST_LOGS) @$(am__set_TESTS_bases); \ am__f_ok () { test -f "$$1" && test -r "$$1"; }; \ redo_bases=`for i in $$bases; do \ am__f_ok $$i.trs && am__f_ok $$i.log || echo $$i; \ done`; \ if test -n "$$redo_bases"; then \ redo_logs=`for i in $$redo_bases; do echo $$i.log; done`; \ redo_results=`for i in $$redo_bases; do echo $$i.trs; done`; \ if $(am__make_dryrun); then :; else \ rm -f $$redo_logs && rm -f $$redo_results || exit 1; \ fi; \ fi; \ if test -n "$$am__remaking_logs"; then \ echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \ "recursion detected" >&2; \ else \ am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \ fi; \ if $(am__make_dryrun); then :; else \ st=0; \ errmsg="fatal: making $(TEST_SUITE_LOG): failed to create"; \ for i in $$redo_bases; do \ test -f $$i.trs && test -r $$i.trs \ || { echo "$$errmsg $$i.trs" >&2; st=1; }; \ test -f $$i.log && test -r $$i.log \ || { echo "$$errmsg $$i.log" >&2; st=1; }; \ done; \ test $$st -eq 0 || exit 1; \ fi @$(am__sh_e_setup); $(am__tty_colors); $(am__set_TESTS_bases); \ ws='[ ]'; \ results=`for b in $$bases; do echo $$b.trs; done`; \ test -n "$$results" || results=/dev/null; \ all=` grep "^$$ws*:test-result:" $$results | wc -l`; \ pass=` grep "^$$ws*:test-result:$$ws*PASS" $$results | wc -l`; \ fail=` grep "^$$ws*:test-result:$$ws*FAIL" $$results | wc -l`; \ skip=` grep "^$$ws*:test-result:$$ws*SKIP" $$results | wc -l`; \ xfail=`grep "^$$ws*:test-result:$$ws*XFAIL" $$results | wc -l`; \ xpass=`grep "^$$ws*:test-result:$$ws*XPASS" $$results | wc -l`; \ error=`grep "^$$ws*:test-result:$$ws*ERROR" $$results | wc -l`; \ if test `expr $$fail + $$xpass + $$error` -eq 0; then \ success=true; \ else \ success=false; \ fi; \ br='==================='; br=$$br$$br$$br$$br; \ result_count () \ { \ if test x"$$1" = x"--maybe-color"; then \ maybe_colorize=yes; \ elif test x"$$1" = x"--no-color"; then \ maybe_colorize=no; \ else \ echo "$@: invalid 'result_count' usage" >&2; exit 4; \ fi; \ shift; \ desc=$$1 count=$$2; \ if test $$maybe_colorize = yes && test $$count -gt 0; then \ color_start=$$3 color_end=$$std; \ else \ color_start= color_end=; \ fi; \ echo "$${color_start}# $$desc $$count$${color_end}"; \ }; \ create_testsuite_report () \ { \ result_count $$1 "TOTAL:" $$all "$$brg"; \ result_count $$1 "PASS: " $$pass "$$grn"; \ result_count $$1 "SKIP: " $$skip "$$blu"; \ result_count $$1 "XFAIL:" $$xfail "$$lgn"; \ result_count $$1 "FAIL: " $$fail "$$red"; \ result_count $$1 "XPASS:" $$xpass "$$red"; \ result_count $$1 "ERROR:" $$error "$$mgn"; \ }; \ { \ echo "$(PACKAGE_STRING): $(subdir)/$(TEST_SUITE_LOG)" | \ $(am__rst_title); \ create_testsuite_report --no-color; \ echo; \ echo ".. contents:: :depth: 2"; \ echo; \ for b in $$bases; do echo $$b; done \ | $(am__create_global_log); \ } >$(TEST_SUITE_LOG).tmp || exit 1; \ mv $(TEST_SUITE_LOG).tmp $(TEST_SUITE_LOG); \ if $$success; then \ col="$$grn"; \ else \ col="$$red"; \ test x"$$VERBOSE" = x || cat $(TEST_SUITE_LOG); \ fi; \ echo "$${col}$$br$${std}"; \ echo "$${col}Testsuite summary for $(PACKAGE_STRING)$${std}"; \ echo "$${col}$$br$${std}"; \ create_testsuite_report --maybe-color; \ echo "$$col$$br$$std"; \ if $$success; then :; else \ echo "$${col}See $(subdir)/$(TEST_SUITE_LOG)$${std}"; \ if test -n "$(PACKAGE_BUGREPORT)"; then \ echo "$${col}Please report to $(PACKAGE_BUGREPORT)$${std}"; \ fi; \ echo "$$col$$br$$std"; \ fi; \ $$success || exit 1 check-TESTS: @list='$(RECHECK_LOGS)'; test -z "$$list" || rm -f $$list @list='$(RECHECK_LOGS:.log=.trs)'; test -z "$$list" || rm -f $$list @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ log_list=`for i in $$bases; do echo $$i.log; done`; \ trs_list=`for i in $$bases; do echo $$i.trs; done`; \ log_list=`echo $$log_list`; trs_list=`echo $$trs_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) TEST_LOGS="$$log_list"; \ exit $$?; recheck: all @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ bases=`for i in $$bases; do echo $$i; done \ | $(am__list_recheck_tests)` || exit 1; \ log_list=`for i in $$bases; do echo $$i.log; done`; \ log_list=`echo $$log_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) \ am__force_recheck=am--force-recheck \ TEST_LOGS="$$log_list"; \ exit $$? Opt_tests.log: Opt_tests$(EXEEXT) @p='Opt_tests$(EXEEXT)'; \ b='Opt_tests'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) .test.log: @p='$<'; \ $(am__set_b); \ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) @am__EXEEXT_TRUE@.test$(EXEEXT).log: @am__EXEEXT_TRUE@ @p='$<'; \ @am__EXEEXT_TRUE@ $(am__set_b); \ @am__EXEEXT_TRUE@ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ @am__EXEEXT_TRUE@ --log-file $$b.log --trs-file $$b.trs \ @am__EXEEXT_TRUE@ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ @am__EXEEXT_TRUE@ "$$tst" $(AM_TESTS_FD_REDIRECT) distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am $(MAKE) $(AM_MAKEFLAGS) check-TESTS check: check-am all-am: Makefile $(PROGRAMS) installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: -test -z "$(TEST_LOGS)" || rm -f $(TEST_LOGS) -test -z "$(TEST_LOGS:.log=.trs)" || rm -f $(TEST_LOGS:.log=.trs) -test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool clean-noinstPROGRAMS \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: check-am install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-TESTS check-am clean \ clean-generic clean-libtool clean-noinstPROGRAMS cscopelist-am \ ctags ctags-am distclean distclean-compile distclean-generic \ distclean-libtool distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-dvi install-dvi-am install-exec \ install-exec-am install-html install-html-am install-info \ install-info-am install-man install-pdf install-pdf-am \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ recheck tags tags-am uninstall uninstall-am info: @echo "GTEST_LDADD=$(GTEST_LDADD)" @echo "GTEST_LDFLAGS=$(GTEST_LDFLAGS)" @echo "GTEST_INCLUDES=$(GTEST_INCLUDES)" @echo "HAVE_GTEST=$(HAVE_GTEST)" # 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: dibbler-1.0.1/Options/tests/OptRtPrefix_unittest.cc0000664000175000017500000000525112560471634017343 00000000000000#include #include "DHCPConst.h" #include "IPv6Addr.h" #include "OptAddr.h" #include "OptRtPrefix.h" namespace test { char expected[] = { OPTION_NEXT_HOP/256, OPTION_NEXT_HOP%256, 0, 42, 0x20, 0x01, 0x0d, 0xb8, 0xde, 0xad, 0xbe, 0xef, 0, 0, 0, 0, 0, 0, 0, 1, // 2001:db8:dead:beef::1 // ^--- NEXT-HOP, RT-PREFIX---v OPTION_RTPREFIX/256, OPTION_RTPREFIX%256, 0, 22, 0, 0, 0x3, 0xe8, // lifetime = 1000 64, 42, // prefix-length, metric 0x20, 0x01, 0x0d, 0xb8, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 // 2001:db8:1:: prefix }; // this test is for verifying that RTPREFIX can be stored in // NextHop option TEST(OptAddrTest, rtPrefixStoreSelf) { char buf[128]; // rt-prefix option SPtr prefix = new TIPv6Addr("2001:db8:1::", true); SPtr rtPrefix = new TOptRtPrefix(1000, // lifetime 64, // prefix length 42, // metric prefix, // prefix NULL); SPtr routerAddr = new TIPv6Addr("2001:db8:dead:beef::1", true); // next-hop option TOptAddr* nextHop = new TOptAddr(OPTION_NEXT_HOP, routerAddr, NULL); EXPECT_TRUE(rtPrefix->isValid()); EXPECT_TRUE(nextHop->isValid()); EXPECT_EQ(1000u, rtPrefix->getLifetime()); EXPECT_EQ(64, rtPrefix->getPrefixLen()); EXPECT_EQ(42, rtPrefix->getMetric()); // rt-rprefix on its own takes 26 bytes EXPECT_EQ(26u, rtPrefix->getSize()); // next-hop on its own takes 20 bytes EXPECT_EQ(20u, nextHop->getSize()); nextHop->addOption((Ptr*)rtPrefix); // together, they should take 46 bytes EXPECT_EQ(46u, nextHop->getSize() ); char* ptr = nextHop->storeSelf(buf); ASSERT_EQ(buf+46, ptr); EXPECT_EQ(0, memcmp(buf, expected, 46) ); delete nextHop; } TEST(OptAddrTest, rtPrefixParse) { SPtr prefix = new TIPv6Addr("2001:db8:1::", true); SPtr routerAddr = new TIPv6Addr("2001:db8:dead:beef::1", true); SPtr nextHop = new TOptAddr(OPTION_NEXT_HOP, expected+4, 42, NULL); EXPECT_EQ(46, nextHop->getSize()); EXPECT_EQ(OPTION_NEXT_HOP, nextHop->getOptType()); EXPECT_TRUE(nextHop->isValid()); SPtr rtPrefix = (Ptr*)nextHop->getOption(OPTION_RTPREFIX); // there should be option OPTION_RTPREFIX ASSERT_TRUE(rtPrefix); EXPECT_TRUE(nextHop->isValid()); EXPECT_EQ(1000u, rtPrefix->getLifetime()); EXPECT_EQ(64, rtPrefix->getPrefixLen()); EXPECT_EQ(42, rtPrefix->getMetric()); } } dibbler-1.0.1/Options/tests/OptIAAddress_unittest.cc0000664000175000017500000000264712233256142017375 00000000000000#include #include "DHCPConst.h" #include "IPv6Addr.h" #include "OptIAAddress.h" using namespace std; namespace { char expected[] = { 0, 5, // OPTION_IAADDR 0, 24, // length = 24 0x20, 0x1, 0x0d, 0xb8, 0, 1, 0, 0, 0, 0, 0, 0, 0xde, 0xad, 0xbe, 0xef, 0 , 0, 3, 0xe8, 0, 0, 7, 0xd0 }; TEST(OptIAAddressTest, storeSelf) { char buf[128]; SPtr addr = new TIPv6Addr("2001:db8:1::dead:beef", true); TOptIAAddress* opt = new TOptIAAddress(addr, 1000, 2000, NULL); char* ptr = opt->storeSelf(buf); EXPECT_EQ(buf+28, ptr); // 28 - length of this option EXPECT_EQ(1000U, opt->getPref() ); EXPECT_EQ(2000U, opt->getValid() ); ASSERT_EQ(28u, opt->getSize()); ASSERT_FALSE( memcmp(buf, expected, 28) ); delete opt; } TEST(OptIAAddressTest, parse) { char buf[128]; char* ptr = expected+4; int len = 24; TOptIAAddress* opt = new TOptIAAddress(ptr, len, NULL); EXPECT_EQ(len, 0); EXPECT_EQ(ptr, expected + 28); SPtr addr = opt->getAddr(); EXPECT_EQ(string("2001:db8:1::dead:beef"), addr->getPlain()); EXPECT_EQ(OPTION_IAADDR, opt->getOptType() ); EXPECT_EQ(1000u, opt->getPref() ); EXPECT_EQ(2000u, opt->getValid() ); opt->storeSelf(buf); EXPECT_FALSE( memcmp(buf, expected, 20) ); delete opt; } } dibbler-1.0.1/Options/OptDUID.h0000644000175000017500000000137112277722750013066 00000000000000/* * Dibbler - a portable DHCPv6 * * authors: Tomasz Mrugalski * Marek Senderski * * released under GNU GPL v2 only licence */ #ifndef OPTDUID_H #define OPTDUID_H #include "DHCPConst.h" #include "Opt.h" #include "DUID.h" #include "SmartPtr.h" class TOptDUID : public TOpt { public: TOptDUID(int type, SPtr duid, TMsg* parent); TOptDUID(int type, const char* buf, int len, TMsg* parent); size_t getSize(); char * storeSelf(char* buf); bool doDuties() { return true; } SPtr getDUID() const; virtual bool isValid() const; std::string getPlain() { if (DUID) return DUID->getPlain(); else return std::string(""); } protected: SPtr DUID; }; #endif dibbler-1.0.1/Options/OptIAAddress.cpp0000644000175000017500000000363012277722750014473 00000000000000/* * Dibbler - a portable DHCPv6 * * authors: Tomasz Mrugalski * Marek Senderski * * released under GNU GPL v2 licence * */ //#include #include #include "Portable.h" #include "DHCPConst.h" #include "Opt.h" #include "OptIAAddress.h" TOptIAAddress::TOptIAAddress(char * &buf, int& n, TMsg* parent) :TOpt(OPTION_IAADDR, parent), Valid_(false) { if ( n >= 24) { Addr_ = new TIPv6Addr(buf); buf += 16; n -= 16; PrefLifetime_ = readUint32(buf); buf += sizeof(uint32_t); n -= sizeof(uint32_t); ValidLifetime_ = readUint32(buf); buf += sizeof(uint32_t); n -= sizeof(uint32_t); Valid_ = true; } } TOptIAAddress::TOptIAAddress(SPtr addr, unsigned long pref, unsigned long valid, TMsg* parent) :TOpt(OPTION_IAADDR, parent), Valid_(true) { if(addr) Addr_ = addr; else Addr_ = new TIPv6Addr(); PrefLifetime_ = pref; ValidLifetime_ = valid; } size_t TOptIAAddress::getSize() { int mySize = 28; return mySize + getSubOptSize(); } void TOptIAAddress::setPref(unsigned long pref) { PrefLifetime_ = pref; } void TOptIAAddress::setValid(unsigned long valid) { ValidLifetime_ = valid; } char * TOptIAAddress::storeSelf( char* buf) { buf = writeUint16(buf, OptType); buf = writeUint16(buf, getSize() - 4 ); memcpy(buf, Addr_->getAddr(), 16); buf += 16; buf = writeUint32(buf, PrefLifetime_); buf = writeUint32(buf, ValidLifetime_); buf = storeSubOpt(buf); return buf; } SPtr TOptIAAddress::getAddr() const { return Addr_; } unsigned long TOptIAAddress::getPref() const { return PrefLifetime_; } unsigned long TOptIAAddress::getValid() const { return ValidLifetime_; } bool TOptIAAddress::isValid() const { return Valid_; } dibbler-1.0.1/Options/OptInteger.h0000644000175000017500000000147512277722750013743 00000000000000/* * Dibbler - a portable DHCPv6 * * authors: Tomasz Mrugalski * Marek Senderski * * released under GNU GPL v2 licence * */ #ifndef OPTINTEGER4_H #define OPTINTEGER4_H #include #include #include "Opt.h" class TOptInteger : public TOpt { public: TOptInteger(uint16_t type, unsigned int len/* 1,2, or 4*/, unsigned int value, TMsg* parent); TOptInteger(uint16_t type, unsigned int len/* 1,2, or 4*/, const char *buf, size_t size, TMsg* parent); char * storeSelf( char* buf); size_t getSize(); unsigned int getValue(); bool isValid() const; std::string getPlain(); bool doDuties() { return true; } protected: unsigned int Value; bool Valid; int Len; /* length in bytes of the integer field: 0-4 */ }; #endif dibbler-1.0.1/Options/OptIAPrefix.h0000644000175000017500000000206112277722750014005 00000000000000/* * Dibbler - a portable DHCPv6 * * author: Krzysztof Wnuk * * released under GNU GPL v2 only licence * * */ #ifndef OPTIAPREFIX_H #define OPTIAPREFIX_H #include "SmartPtr.h" #include "Container.h" #include "Opt.h" #include "IPv6Addr.h" class TOptIAPrefix : public TOpt { public: TOptIAPrefix( char * &addr, int &n, TMsg* parent); TOptIAPrefix( SPtr addr, char prefix_length,unsigned long pref, unsigned long valid, TMsg* parent); size_t getSize(); char * storeSelf( char* buf); SPtr getPrefix() const; uint8_t getPrefixLength() const; unsigned long getPref() const; unsigned long getValid() const; void setPref(unsigned long pref); void setValid(unsigned long valid); void setPrefixLenght(char prefix_length); virtual bool isValid() const; private: SPtr Prefix_; // unsigned long PrefLifetime_; unsigned long ValidLifetime_; char PrefixLength_; // this I am not sure (because prefix should be only 1 byte ) bool Valid_; }; #endif dibbler-1.0.1/Options/OptString.h0000664000175000017500000000131312233256142013572 00000000000000/* * Dibbler - a portable DHCPv6 * * authors: Tomasz Mrugalski * Marek Senderski * * released under GNU GPL v2 licence * */ #ifndef OPTSTRING_H #define OPTSTRING_H #include #include #include "Opt.h" class TOptString : public TOpt { public: TOptString(int type, std::string str, TMsg* parent); TOptString(int type, const char *buf, unsigned short len, TMsg* parent); char * storeSelf( char* buf); size_t getSize(); std::string getString(); virtual bool doDuties() { return true; } // do nothing, actual code in ClntOpt* classes std::string getPlain() { return Str; } protected: std::string Str; }; #endif dibbler-1.0.1/Options/OptDUID.cpp0000664000175000017500000000165112426742324013417 00000000000000/* * Dibbler - a portable DHCPv6 * * authors: Tomasz Mrugalski * Marek Senderski * * released under GNU GPL v2 licence * */ #include #include "Portable.h" #include "DHCPConst.h" #include "OptDUID.h" TOptDUID::TOptDUID(int type, SPtr duid, TMsg* parent) :TOpt(type, parent) { DUID=duid; } size_t TOptDUID::getSize() { if (DUID) return DUID->getLen() + 4; return 4; } char * TOptDUID::storeSelf( char* buf) { buf = writeUint16(buf, OptType); buf = writeUint16(buf, DUID->getLen()); return this->DUID->storeSelf(buf); } TOptDUID::TOptDUID(int type, const char* buf, int bufsize, TMsg* parent) :TOpt(type, parent) { this->DUID = new TDUID(buf,bufsize); } SPtr TOptDUID::getDUID() const { return DUID; } bool TOptDUID::isValid() const { if (this->getDUID()->getLen()>2) return true; return false; } dibbler-1.0.1/Options/OptEmpty.cpp0000644000175000017500000000117512277722750013774 00000000000000/* * Dibbler - a portable DHCPv6 * * authors: Tomasz Mrugalski * Marek Senderski * * released under GNU GPL v2 licence * */ #include #include "Portable.h" #include "OptEmpty.h" TOptEmpty::TOptEmpty(int code, const char * buf, int n, TMsg* parent) :TOpt(code, parent) { if (n) { Valid = false; } } TOptEmpty::TOptEmpty(int code, TMsg* parent) :TOpt(code, parent) { } size_t TOptEmpty::getSize() { return 4; } char * TOptEmpty::storeSelf( char* buf) { buf = writeUint16(buf, OptType); buf = writeUint16(buf, getSize()-4); return buf; } dibbler-1.0.1/Options/OptAddr.cpp0000664000175000017500000000246712233256142013544 00000000000000/* * Dibbler - a portable DHCPv6 * * authors: Tomasz Mrugalski * Marek Senderski * * released under GNU GPL v2 licence * */ #include "Portable.h" #include "OptAddr.h" #include "Logger.h" #include "OptRtPrefix.h" #include "OptGeneric.h" TOptAddr::TOptAddr(int type, const char * buf, unsigned short len, TMsg* parent) :TOpt(type, parent) { if (len<16) { Valid = false; Log(Warning) << "Malformed option (code=" << type << ", length=" << len << "), expected length is 16." << LogEnd; return; } Addr = new TIPv6Addr(buf, false); // plain = false buf += 16; len -= 16; Valid = parseOptions(SubOptions, buf, len, parent); } TOptAddr::TOptAddr(int type, SPtr addr, TMsg* parent) :TOpt(type, parent) { this->Addr = addr; } size_t TOptAddr::getSize() { // 20 - size of this option return 20 + getSubOptSize(); } SPtr TOptAddr::getAddr() { return Addr; } std::string TOptAddr::getPlain() { return Addr->getPlain(); } char * TOptAddr::storeSelf(char* buf) { // store generic header buf = writeUint16( buf, OptType ); buf = writeUint16( buf, getSize() - 4 ); // store address buf = Addr->storeSelf(buf); // store sub-options (if three are any) return storeSubOpt(buf); } dibbler-1.0.1/Options/OptIAAddress.h0000644000175000017500000000173212277722750014141 00000000000000/* * Dibbler - a portable DHCPv6 * * authors: Tomasz Mrugalski * Marek Senderski * * released under GNU GPL v2 only licence * */ #ifndef OPTIAADDRESS_H #define OPTIAADDRESS_H #include "SmartPtr.h" #include "Container.h" #include "Opt.h" #include "IPv6Addr.h" class TOptIAAddress : public TOpt { public: TOptIAAddress(char* &addr, int& n, TMsg* parent); TOptIAAddress( SPtr addr, unsigned long pref, unsigned long valid, TMsg* parent); size_t getSize(); char * storeSelf( char* buf); SPtr getAddr() const; unsigned long getPref() const; unsigned long getValid() const; void setPref(unsigned long pref); void setValid(unsigned long valid); bool isValid() const; virtual bool doDuties() { return true; } // does nothing on its own private: SPtr Addr_; unsigned long ValidLifetime_; unsigned long PrefLifetime_; bool Valid_; }; #endif dibbler-1.0.1/Options/OptRtPrefix.h0000664000175000017500000000144212233256142014072 00000000000000/* * Dibbler - a portable DHCPv6 * * authors: Mateusz Ozga * changes: Tomek Mrugalski * * Released under GNU GPL v2 licence * */ #include "IPv6Addr.h" #include "SmartPtr.h" #include "Opt.h" class TOptRtPrefix : public TOpt { public: TOptRtPrefix(uint32_t lifetime, uint8_t prefixlen, uint8_t metric, SPtr prefix, TMsg* parent); TOptRtPrefix(const char * buf, int bufsize, TMsg* parent); char* storeSelf(char* buf); size_t getSize(); bool doDuties() { return true; }; uint32_t getLifetime(); uint8_t getPrefixLen(); uint8_t getMetric(); SPtr getPrefix(); std::string getPlain(); protected: uint32_t Lifetime; uint8_t PrefixLen; uint8_t Metric; SPtr Prefix; }; dibbler-1.0.1/Options/OptTA.h0000644000175000017500000000163312277722750012646 00000000000000/* * Dibbler - a portable DHCPv6 * * authors: Tomasz Mrugalski * * released under GNU GPL v2 only licence * */ class TOptTA; #ifndef OPTIA_TA_H #define OPTIA_TA_H #include "Opt.h" // length without optType and Length #define OPTION_IA_TA_LEN 4 class TOptTA : public TOpt { public: TOptTA(uint32_t iaid, TMsg* parent); TOptTA(char * &buf, int &bufsize, TMsg* parent); size_t getSize(); int getStatusCode(); unsigned long getIAID(); unsigned long getMaxValid(); int countAddrs(); char * storeSelf( char* buf); virtual bool isValid() const; bool doDuties() { return true; } protected: uint32_t IAID_; bool Valid_; }; #endif /* OPTIA_TA_H */ /* * $Log: not supported by cvs2svn $ * Revision 1.2 2006-03-05 21:37:46 thomson * TA support merged. * * Revision 1.1.2.1 2006/02/05 23:39:52 thomson * Initial revision. * */ dibbler-1.0.1/Options/Opt.cpp0000644000175000017500000001005512556505271012747 00000000000000/* * Dibbler - a portable DHCPv6 * * authors: Tomasz Mrugalski * Marek Senderski * * released under GNU GPL v2 licence * */ #include "Portable.h" #include "Opt.h" #include "OptGeneric.h" #include "OptRtPrefix.h" #include "Logger.h" int TOpt::getOptType() { return OptType; } TOpt::~TOpt() { } TOpt::TOpt(int optType, TMsg *parent) :Valid(true) { OptType=optType; Parent=parent; } int TOpt::getSubOptSize() { int size = 0; SubOptions.first(); TOptPtr ptr; while (ptr = SubOptions.get()) size += ptr->getSize(); return size; } char* TOpt::storeHeader(char* buf) { buf = writeUint16(buf, OptType); buf = writeUint16(buf,getSize() - 4); return buf; } char* TOpt::storeSubOpt(char* buf){ TOptPtr ptr; SubOptions.first(); while ( ptr = SubOptions.get() ) { ptr->storeSelf(buf); buf += ptr->getSize(); } return buf; } void TOpt::firstOption() { SubOptions.first(); } TOptPtr TOpt::getOption() { return SubOptions.get(); } TOptPtr TOpt::getOption(int optType) { firstOption(); TOptPtr opt; while(opt=getOption()) { if (opt->getOptType()==optType) return opt; } return TOptPtr(); } void TOpt::addOption(TOptPtr opt) { SubOptions.append(opt); } int TOpt::countOption() { return SubOptions.count(); } void TOpt::setParent(TMsg* Parent) { this->Parent=Parent; } void TOpt::delAllOptions() { SubOptions.clear(); } bool TOpt::isValid() const { return Valid; } /// @brief Deletes all specified options of that type /// /// @param type /// /// @return bool TOpt::delOption(uint16_t type) { firstOption(); TOptPtr opt; bool del = false; while(opt=getOption()) { if (opt->getOptType()==type) { SubOptions.del(); SubOptions.first(); del = true; } } return del; } std::string TOpt::getPlain() { return "[generic]"; } TOptPtr TOpt::getOption(const TOptList& list, uint16_t opt_type) { for (TOptList::const_iterator opt = list.begin(); opt != list.end(); ++opt) { if ((*opt)->getOptType() == opt_type) { return *opt; } } return TOptPtr(); // NULL } /// @brief Parses options or suboptions, creates appropriate objects and store them /// in options container /// /// @param options options container (new options will be added here) /// @param buf buffer to be parsed /// @param len length of the buffer /// @param parent pointer to parent message /// @param placeId specifies location of the message (option number for option parsing /// or 0 for message parsing) /// @param place text representation of the parsed scope /// /// @return true if parsing was successful, false if anomalies are detected bool TOpt::parseOptions(TOptContainer& options, const char* buf, size_t len, TMsg* parent, uint16_t placeId /*= 0*/, // 5 (option 5) or (message 5) std::string place) { /*= "option"*/ // "option" or "message" // parse suboptions while (len>0) { if (len<4) { Log(Warning) << "Truncated suboption in " << place << " " << placeId << LogEnd; return false; } uint16_t optType = readUint16(buf); buf += sizeof(uint16_t); len -= sizeof(uint16_t); uint16_t optLen = readUint16(buf); buf += sizeof(uint16_t); len -= sizeof(uint16_t); if (optLen>len) { Log(Warning) << "Truncated suboption " << optType << " in " << place << " " << placeId << LogEnd; return false; } switch (optType) { case OPTION_RTPREFIX: { TOptPtr opt = new TOptRtPrefix(buf, len, parent); options.append(opt); break; } default: { TOptPtr opt = new TOptGeneric(optType, buf, len, parent); options.append(opt); break; } } buf += optLen; len -= optLen; } return true; } dibbler-1.0.1/Options/OptUserClass.h0000644000175000017500000000152112277722750014242 00000000000000/* * Dibbler - a portable DHCPv6 * * authors: Tomasz Mrugalski * Marek Senderski * * released under GNU GPL v2 only licence */ #ifndef OPTUSERCLASS_H #define OPTUSERCLASS_H #include "Opt.h" #include #include class TOptUserClass : public TOpt { public: struct UserClassData { std::vector opaqueData_; }; std::vector userClassData_; bool parseUserData(const char* buf, unsigned short buf_len); TOptUserClass(uint16_t type, const char* buf, unsigned short buf_len, TMsg* parent); TOptUserClass(uint16_t type, TMsg* parent); size_t getSize(); virtual bool isValid() const; char* storeSelf( char* buf); bool doDuties() { return false; } protected: char* storeUserData(char* buf); }; #endif /* USERCLASS_H */ dibbler-1.0.1/Options/OptIAPrefix.cpp0000644000175000017500000000427412277722750014350 00000000000000/* * Dibbler - a portable DHCPv6 * * author: Krzysztof Wnuk * changes: Tomasz Mrugalski * * released under GNU GPL v2 only licence * */ #include #include "Portable.h" #include "DHCPConst.h" #include "OptIAPrefix.h" TOptIAPrefix::TOptIAPrefix( char * &buf, int &n, TMsg* parent) :TOpt(OPTION_IAPREFIX, parent), Valid_(false) { if (n >= 25) // was 24 for IA address { PrefLifetime_ = readUint32(buf); buf += sizeof(uint32_t); n -= sizeof(uint32_t); ValidLifetime_ = readUint32(buf); buf += sizeof(uint32_t); n -= sizeof(uint32_t); PrefixLength_ = *buf;// was ntohl(*((char*)buf)); buf+= 1; n-=1; Prefix_ = new TIPv6Addr(buf); // was buf buf+= 16; n-=16; Valid_ = true; } } TOptIAPrefix::TOptIAPrefix(SPtr prefix, char len, unsigned long pref, unsigned long valid, TMsg* parent) :TOpt(OPTION_IAPREFIX, parent), Prefix_(prefix), PrefLifetime_(pref), ValidLifetime_(valid), PrefixLength_(len), Valid_(true) { // we are not checking is prefix is a proper address type, } size_t TOptIAPrefix::getSize() { return 29 + getSubOptSize(); } void TOptIAPrefix::setPref(unsigned long pref) { PrefLifetime_ = pref; } void TOptIAPrefix::setValid(unsigned long valid) { ValidLifetime_ = valid; } void TOptIAPrefix::setPrefixLenght(char prefix_length){ PrefixLength_ = prefix_length; } char * TOptIAPrefix::storeSelf(char* buf) { buf = writeUint16(buf, OptType); buf = writeUint16(buf, getSize()-4); buf = writeUint32(buf, PrefLifetime_); buf = writeUint32(buf, ValidLifetime_); *(char*)buf = PrefixLength_; buf+=1; memcpy(buf, Prefix_->getAddr(), 16); buf+=16; buf=storeSubOpt(buf); return buf; } SPtr TOptIAPrefix::getPrefix() const { return Prefix_; } unsigned long TOptIAPrefix::getPref() const { return PrefLifetime_; } unsigned long TOptIAPrefix::getValid() const { return ValidLifetime_; } uint8_t TOptIAPrefix::getPrefixLength() const { return PrefixLength_; } bool TOptIAPrefix::isValid() const { return Valid_; } dibbler-1.0.1/Options/OptFQDN.h0000644000175000017500000000314612277722750013073 00000000000000/* * Dibbler - a portable DHCPv6 * * authors: Adrien CLERC, Bahattin DEMIRPLAK, Gaëtant ELEOUET * Mickaël GUÉRIN, Lionel GUILMIN, Lauréline PROVOST * from ENSEEIHT, Toulouse, France * * released under GNU GPL v2 licence * */ /** * This class is mother of Client and Server version of the FQDN option. * * It implements all common methods */ class TOptFQDN; #ifndef OPTFQDN_H #define OPTFQDN_H #include #include "Opt.h" #include "DHCPConst.h" class TOptFQDN : public TOpt { public: /** * Constructor * * The FQDN is set and all flags are 0 * @param fqdn The FQDN about to be sent * @param parent The message in which this option is included */ TOptFQDN(const std::string& fqdn, TMsg* parent); /** * Constructor * * Build the option with a buffer received * @param buf the buffer received, containing the whole option * @param bufsize the size of the buffer * @param parent the message in which this option is included */ TOptFQDN(const char* buf, int bufsize, TMsg* parent); /** * Destructor - Does actually nothing */ ~TOptFQDN(); size_t getSize(); char * storeSelf( char* buf); bool isValid() const; bool getNFlag() const; bool getSFlag() const; bool getOFlag() const; void setNFlag(bool flag); void setOFlag(bool flag); void setSFlag(bool flag); std::string getFQDN() const; virtual std::string getPlain(); bool doDuties(); private: std::string fqdn_; bool flag_N_; bool flag_O_; bool flag_S_; }; #endif /* OPTFQDN_H */ dibbler-1.0.1/Options/OptAuthentication.h0000644000175000017500000000336212277722750015322 00000000000000/* * Dibbler - a portable DHCPv6 * * author: Michal Kowalczuk * changes: Tomek Mrugalski * * released under GNU GPL v2 only licence */ #ifndef OPTAUTHENTICATION_H #define OPTAUTHENTICATION_H #include #include "DHCPConst.h" #include "Opt.h" #include "Portable.h" class TOptAuthentication : public TOpt { public: const static size_t OPT_AUTH_FIXED_SIZE = 11; TOptAuthentication(AuthProtocols proto, uint8_t algo, AuthReplay rdm, TMsg* parent); TOptAuthentication(char* buf, size_t buflen, TMsg* parent); AuthProtocols getProto() const; uint8_t getAlgorithm() const; AuthReplay getRDM() const; void setRDM(AuthReplay value); void setReplayDetection(uint64_t value); uint64_t getReplayDetection(); size_t getSize(); char * storeSelf(char* buf); bool doDuties(); void setPayload(const std::vector& data); void getPayload(std::vector& data); // not real fields, those are used for checksum calculations /// @todo: remove this // specific for method 4 (see DHCPConst.h) uint32_t getSPI() const; void setAuthInfoLen(uint16_t len); void setDigestType(DigestTypes type); inline char* getAuthDataPtr() const { return authDataPtr_; } void setRealm(const std::string& realm); private: AuthProtocols proto_; // protocol uint8_t algo_; // algorithm AuthReplay rdm_; // replay detection method uint64_t replay_; std::vector data_; ///< auth data (specific to a given proto) std::string realm_; ///< auth realm (used in delayed-auth) char* authDataPtr_; // specific for AUTH_PROTO_DIBBLER uint16_t AuthInfoLen_; }; #endif dibbler-1.0.1/Options/OptString.cpp0000664000175000017500000000240612233256142014131 00000000000000/* * Dibbler - a portable DHCPv6 * * authors: Tomasz Mrugalski * Marek Senderski * * released under GNU GPL v2 licence * */ #include #include #include "Portable.h" #include "OptString.h" #include "DHCPConst.h" using namespace std; TOptString::TOptString(int type, std::string str, TMsg* parent) :TOpt(type, parent), Str(str) { } TOptString::TOptString(int type, const char *buf, unsigned short bufsize, TMsg* parent) :TOpt(type, parent) { char* str=new char[bufsize+1]; memcpy(str,buf,bufsize); str[bufsize]=0; Str = string(str); delete [] str; } char * TOptString::storeSelf(char* buf) { buf = writeUint16(buf, OptType); buf = writeUint16(buf, getSize()-4); memcpy(buf,Str.c_str(),Str.length()); buf[Str.length()]=0; // null-terminated return buf+this->Str.length()+1; *buf = (char)Str.length(); // length of a string (with first byte) buf++; memcpy(buf,this->Str.c_str(),this->Str.length()); buf += this->Str.length(); *buf=0; // add final 0. return buf+1; } size_t TOptString::getSize() { return (int)(Str.length()+6); // 4-normal header + 1 (strlen) + 1 (final 0) } std::string TOptString::getString() { return Str; } dibbler-1.0.1/Options/OptVendorSpecInfo.cpp0000664000175000017500000000757312560471634015571 00000000000000/* * Dibbler - a portable DHCPv6 * * authors: Tomasz Mrugalski * Marek Senderski * * released under GNU GPL v2 licence * */ #include #include #include #include "Portable.h" #include "OptVendorSpecInfo.h" #include "OptGeneric.h" #include "DHCPConst.h" #include "Logger.h" #if defined(LINUX) || defined(BSD) #include #endif TOptVendorSpecInfo::TOptVendorSpecInfo(uint16_t type, char * buf, int n, TMsg* parent) :TOpt(type, parent), Vendor_(0) { int optionCode = 0, optionLen = 0; if (n<4) { Log(Error) << "Unable to parse truncated vendor-spec info option." << LogEnd; Valid = false; return; } Vendor_ = readUint32(buf); // enterprise number buf += sizeof(uint32_t); n -= sizeof(uint32_t); while (n>=4) { optionCode = readUint16(buf); buf += sizeof(uint16_t); n -= sizeof(uint16_t); optionLen = readUint16(buf); buf += sizeof(uint16_t); n -= sizeof(uint16_t); if (optionLen>n) { Log(Warning) << "Malformed vendor-spec info option. Suboption " << optionCode << " truncated." << LogEnd; Valid = false; return; } SPtr opt = new TOptGeneric(optionCode, buf, optionLen, parent); addOption(opt); buf += optionLen; n -= optionLen; } if (n) { Log(Warning) << "Extra " << n << " bytes, after parsing suboption " << optionCode << " in vendor-spec info option." << LogEnd; Valid = false; return; } Valid = true; } TOptVendorSpecInfo::TOptVendorSpecInfo(uint16_t code, uint32_t enterprise, uint16_t sub_option_code, const char *data, int dataLen, TMsg* parent) :TOpt(code, parent), Vendor_(enterprise) { createSuboption(sub_option_code, data, dataLen); } void TOptVendorSpecInfo::createSuboption(uint16_t sub_option_code, const char* data, size_t data_len) { if (sub_option_code) { SPtr opt = new TOptGeneric(sub_option_code, data, data_len, Parent); addOption( (Ptr*) opt); } } TOptVendorSpecInfo::TOptVendorSpecInfo(uint16_t code, uint32_t enterprise, uint16_t sub_option_code, SPtr addr, TMsg* parent) :TOpt(code, parent), Vendor_(enterprise) { createSuboption(sub_option_code, addr->getAddr(), 16); } TOptVendorSpecInfo::TOptVendorSpecInfo(uint16_t code, uint32_t enterprise, uint16_t sub_option_code, const std::string& str, TMsg* parent) :TOpt(code, parent), Vendor_(enterprise) { createSuboption(sub_option_code, str.c_str(), str.length()); } TOptVendorSpecInfo::~TOptVendorSpecInfo() { } size_t TOptVendorSpecInfo::getSize() { SPtr opt; unsigned int len = 8; // normal header(4) + enterprise(4) firstOption(); while (opt = getOption()) { len += opt->getSize(); } return len; } char * TOptVendorSpecInfo::storeSelf( char* buf) { // option-code OPTION_VENDOR_OPTS (2 bytes long) buf = writeUint16(buf, OptType); // option-len size of total option-data buf = writeUint16(buf, getSize()-4); // enterprise-number (4 bytes long) buf = writeUint32(buf, Vendor_); SPtr opt; firstOption(); while (opt = getOption()) { buf = opt->storeSelf(buf); } return buf; } std::string TOptVendorSpecInfo::getPlain() { std::stringstream tmp; tmp << "vendor=" << Vendor_ << " "; SPtr opt; firstOption(); while (opt = getOption()) { tmp << opt->getOptType() << "="; tmp << opt->getPlain() << " "; } return tmp.str(); } bool TOptVendorSpecInfo::isValid() const { return true; } uint32_t TOptVendorSpecInfo::getVendor() { return Vendor_; } dibbler-1.0.1/Options/Makefile.am0000644000175000017500000000264012277722750013541 00000000000000SUBDIRS = . if HAVE_GTEST SUBDIRS += tests endif noinst_LIBRARIES = libOptions.a libOptions_a_CPPFLAGS = -I$(top_srcdir)/Misc -I$(top_srcdir)/Messages libOptions_a_SOURCES = OptAddr.cpp OptAddr.h libOptions_a_SOURCES += OptAddrLst.cpp OptAddrLst.h libOptions_a_SOURCES += OptAuthentication.cpp OptAuthentication.h libOptions_a_SOURCES += Opt.cpp Opt.h libOptions_a_SOURCES += OptDUID.cpp OptDUID.h libOptions_a_SOURCES += OptEmpty.cpp OptEmpty.h libOptions_a_SOURCES += OptFQDN.cpp OptFQDN.h libOptions_a_SOURCES += OptGeneric.cpp OptGeneric.h libOptions_a_SOURCES += OptIAAddress.cpp OptIAAddress.h libOptions_a_SOURCES += OptIA_NA.cpp OptIA_NA.h libOptions_a_SOURCES += OptIA_PD.cpp OptIA_PD.h libOptions_a_SOURCES += OptIAPrefix.cpp OptIAPrefix.h libOptions_a_SOURCES += OptInteger.cpp OptInteger.h libOptions_a_SOURCES += OptOptionRequest.cpp OptOptionRequest.h libOptions_a_SOURCES += OptStatusCode.cpp OptStatusCode.h libOptions_a_SOURCES += OptString.cpp OptString.h libOptions_a_SOURCES += OptDomainLst.cpp OptDomainLst.h libOptions_a_SOURCES += OptTA.cpp OptTA.h libOptions_a_SOURCES += OptUserClass.cpp OptUserClass.h libOptions_a_SOURCES += OptVendorClass.cpp OptVendorClass.h libOptions_a_SOURCES += OptVendorSpecInfo.cpp OptVendorSpecInfo.h libOptions_a_SOURCES += OptRtPrefix.cpp OptRtPrefix.h libOptions_a_SOURCES += OptReconfigureMsg.cpp OptReconfigureMsg.h libOptions_a_SOURCES += OptVendorData.cpp OptVendorData.h dibbler-1.0.1/Options/Opt.h0000644000175000017500000000514112304040124012372 00000000000000/* * Dibbler - a portable DHCPv6 * * authors: Tomasz Mrugalski * Marek Senderski * * released under GNU GPL v2 only licence * */ #ifndef OPT_H #define OPT_H #include #include #include "SmartPtr.h" #include "Container.h" #include "DUID.h" class TMsg; class TOpt; typedef SPtr TOptPtr; typedef std::list< TOptPtr > TOptList; typedef TContainer< TOptPtr > TOptContainer; class TOpt { public: /// length of a DHCPv6 option header const static size_t OPTION6_HDR_LEN = 4; /* this is required to specify, what is the format of expected options. This cannot be class field or method, because there is no object to hold that information. Option object is created when requested option is received. */ typedef enum { Layout_Addr, Layout_AddrLst, Layout_String, Layout_StringLst, Layout_Duid, Layout_Generic } EOptionLayout; TOpt(int optType, TMsg* parent); virtual ~TOpt(); /** * Return the size of the option, including : * - Option number, * - Option size * - data * * @return the size */ virtual size_t getSize() = 0; /** * This method transform the instance of the option class into bytecode * ready to be sent to the client or server, conform to the RFC * * @param buf The address where to store the option * @return The address where the option ends */ virtual char * storeSelf(char* buf) = 0; virtual bool doDuties() = 0; /** * Validate the option * * @return true if the option is valid. */ virtual bool isValid() const; virtual std::string getPlain(); int getOptType(); TOptPtr getOption(int type); // suboptions management void firstOption(); TOptPtr getOption(); void addOption(TOptPtr opt); bool delOption(uint16_t type); int countOption(); void delAllOptions(); void setParent(TMsg* Parent); static bool parseOptions(TOptContainer& options, const char* buf, size_t len, TMsg* parent, uint16_t placeId = 0, // 5 (option 5) or (message 5) std::string place = "option" // "option" or "message" ); static TOptPtr getOption(const TOptList& list, uint16_t opt_type); protected: char* storeHeader(char* buf); char* storeSubOpt(char* buf); int getSubOptSize(); TOptContainer SubOptions; int OptType; TMsg* Parent; bool Valid; }; #endif dibbler-1.0.1/Options/OptIA_NA.h0000664000175000017500000000160512233256142013177 00000000000000/* * Dibbler - a portable DHCPv6 * * authors: Tomasz Mrugalski * Marek Senderski * * released under GNU GPL v2 only licence * */ class TOptIA_NA; #ifndef OPTIA_NA_H #define OPTIA_NA_H #include "Opt.h" class TOptIA_NA : public TOpt { public: TOptIA_NA( long IAID, long t1, long t2, TMsg* parent); TOptIA_NA( char * &buf, int &bufsize, TMsg* parent); size_t getSize(); int getStatusCode(); unsigned long getIAID() const; unsigned long getT1() const; unsigned long getT2() const; void setT1(unsigned long t1); void setT2(unsigned long t2); void setIAID(uint32_t iaid); unsigned long getMaxValid(); int countAddrs(); char * storeSelf( char* buf); bool isValid() const; protected: unsigned long IAID_; unsigned long T1_; unsigned long T2_; bool Valid_; }; #endif /* */ dibbler-1.0.1/Options/OptEmpty.h0000664000175000017500000000101112233256142013415 00000000000000/* * Dibbler - a portable DHCPv6 * * authors: Tomasz Mrugalski * Marek Senderski * * released under GNU GPL v2 only licence */ #ifndef OPTRAPIDCOMMIT_H #define OPTRAPIDCOMMIT_H #include "DHCPConst.h" #include "Opt.h" class TOptEmpty : public TOpt { public: TOptEmpty(int code, TMsg* parent); TOptEmpty(int code, const char * buf, int n, TMsg* parent); size_t getSize(); char * storeSelf(char* buf); bool doDuties() { return false; } }; #endif dibbler-1.0.1/Options/OptGeneric.cpp0000644000175000017500000000246012277722750014250 00000000000000/* * Dibbler - a portable DHCPv6 * * authors: Tomasz Mrugalski * Marek Senderski * * released under GNU GPL v2 licence * */ #include #include #include "Portable.h" #include #include "DHCPConst.h" #include "OptGeneric.h" #include "hex.h" using namespace std; TOptGeneric::TOptGeneric(int optType, const char* data, unsigned short dataLen, TMsg* parent) :TOpt(optType, parent) { this->Data = new char[dataLen]; memcpy(this->Data, data, dataLen); this->DataLen = dataLen; } TOptGeneric::TOptGeneric(int optType, TMsg * parent) :TOpt(optType, parent) { this->Data = 0; this->DataLen = 0; } TOptGeneric::~TOptGeneric() { if (this->DataLen) { delete [] this->Data; } } size_t TOptGeneric::getSize() { return DataLen + 4; } char * TOptGeneric::storeSelf(char* buf) { buf = writeUint16(buf, OptType); buf = writeUint16(buf, this->DataLen); memmove(buf, this->Data, this->DataLen); return buf+this->DataLen; } std::string TOptGeneric::getPlain() { return hexToText((uint8_t*)(Data), DataLen, false); } bool TOptGeneric::isValid() const { return true; } bool TOptGeneric::operator == (const TOptGeneric &other) { /// @todo: Implement comparison for real return false; } dibbler-1.0.1/Options/OptOptionRequest.h0000644000175000017500000000175012277722750015163 00000000000000/* * Dibbler - a portable DHCPv6 * * authors: Tomasz Mrugalski * Marek Senderski * * released under GNU GPL v2 only licence * */ #ifndef OPTOPTIONREQUEST_H #define OPTOPTIONREQUEST_H #include "DHCPConst.h" #include "SmartPtr.h" #include "Opt.h" class TClntConfMgr; class TOptOptionRequest : public TOpt { public: TOptOptionRequest(uint16_t code, TMsg* parent); TOptOptionRequest(uint16_t code, const char * buf, size_t size, TMsg* parent); void addOption(unsigned short optNr); void delOption(unsigned short optNr); bool isOption(unsigned short optNr); int count(); void clearOptions(); size_t getSize(); char * storeSelf( char* buf); int getReqOpt(int optNr); virtual bool isValid() const; bool doDuties() { return true; } ~TOptOptionRequest(); protected: bool Valid_; unsigned short *Options; /// @todo: you're kidding me, right? Rewrite this ASAP int OptCnt; }; #endif dibbler-1.0.1/Options/OptDomainLst.cpp0000664000175000017500000000620212233256142014553 00000000000000/* * Dibbler - a portable DHCPv6 * * authors: Tomasz Mrugalski * Marek Senderski * * released under GNU GPL v2 licence * */ #include #include "Portable.h" #include "OptDomainLst.h" #include "DHCPConst.h" #include "Logger.h" using namespace std; TOptDomainLst::TOptDomainLst(int type, List(std::string) strLst, TMsg* parent) :TOpt(type, parent) { StringLst = strLst; } TOptDomainLst::TOptDomainLst(int type, const std::string& domain, TMsg* parent) :TOpt(type, parent) { StringLst.append(new string(domain) ); } const std::string& TOptDomainLst::getDomain() { StringLst.first(); return *StringLst.get(); } TOptDomainLst::TOptDomainLst(int type, const char *buf, unsigned short bufsize, TMsg* parent) :TOpt(type, parent) { int len; string domain = ""; char* str=new char[bufsize+1]; str[bufsize]=0; while (bufsize) { len = (char)*buf; if (len>bufsize) { Log(Debug) << "Option parsing failed. String length is specified as " << len << ", but remaining buffer is only " << bufsize << " bytes long." << LogEnd; StringLst.clear(); return; } if (len==0) { // end of domain if (domain.length()) { SPtr x = new string(domain); this->StringLst.append(x); } bufsize -= len+1; buf += len+1; domain = ""; continue; } memcpy(str,buf+1,len); str[len]=0; if (domain.length()) domain += string("."); domain = domain + string(str); bufsize -= len+1; buf += len+1; } delete [] str; } char * TOptDomainLst::storeSelf(char* buf) { SPtr x; buf = writeUint16(buf, OptType); buf = writeUint16(buf, getSize()-4); std::string::size_type dotpos; StringLst.first(); while (x = StringLst.get() ) { string cp(*x); dotpos = string::npos; while (cp.find(".")!=string::npos) { if (*cp.c_str()=='.') break; dotpos = cp.find("."); if (dotpos!=string::npos) { *buf = dotpos; buf++; memcpy(buf, cp.c_str(), dotpos); buf+=dotpos; cp = cp.substr(dotpos+1); } } *buf = cp.length(); // length of the string buf++; memcpy(buf, cp.c_str(), cp.length()); buf+= cp.length(); *buf=0; buf++; } return buf; } size_t TOptDomainLst::getSize() { int len = 0; int tmplen = 0; SPtr x; StringLst.first(); while ( x = StringLst.get() ) { const char * c = x->c_str(); tmplen = x->length(); if (c[tmplen]=='.') len++; len += x->length()+2; } return len+4; // 5=4(std.option header) + 1 (final 0) } #if 0 string TOptDomainLst::getString() { return *(this->StringLst.get()); } #endif std::string TOptDomainLst::getPlain() { string concat; StringLst.first(); SPtr s; while (s=StringLst.get()) { concat.append(*s); concat.append(" "); } return concat; } dibbler-1.0.1/Options/OptIA_PD.cpp0000664000175000017500000000451712560471634013554 00000000000000/* * Dibbler - a portable DHCPv6 * * author: Krzysztof Wnuk * changes: Tomasz Mrugalski * * released under GNU GPL v2 only licence * */ #include "Portable.h" #include "OptIA_PD.h" #include "OptIAPrefix.h" #include "OptStatusCode.h" TOptIA_PD::TOptIA_PD(uint32_t iaid, uint32_t t1, uint32_t t2, TMsg* parent) :TOpt(OPTION_IA_PD, parent), IAID_(iaid), T1_(t1), T2_(t2), Valid_(true) { } uint32_t TOptIA_PD::getIAID() const { return IAID_; } uint32_t TOptIA_PD::getT1() const { return T1_; } uint32_t TOptIA_PD::getT2() const { return T2_; } TOptIA_PD::TOptIA_PD(char * &buf, int &bufsize, TMsg* parent) :TOpt(OPTION_IA_PD, parent), Valid_(false) { if (bufsize < 12) { bufsize = 0; } else { IAID_ = readUint32(buf); buf += sizeof(uint32_t); bufsize -= sizeof(uint32_t); T1_ = readUint32(buf); buf += sizeof(uint32_t); bufsize -= sizeof(uint32_t); T2_ = readUint32(buf); buf += sizeof(uint32_t); bufsize -= sizeof(uint32_t); Valid = true; } } int TOptIA_PD::getStatusCode() { SPtr ptrOpt; SubOptions.first(); while ( ptrOpt = SubOptions.get() ) { if ( ptrOpt->getOptType() == OPTION_STATUS_CODE) { SPtr ptrStatus; ptrStatus = (Ptr*) ptrOpt; return ptrStatus->getCode(); } } return -1; } size_t TOptIA_PD::getSize() { int mySize = 16; return mySize + getSubOptSize(); } char * TOptIA_PD::storeSelf( char* buf) { buf = writeUint16(buf, OptType); buf = writeUint16(buf, getSize() - 4 ); buf = writeUint32(buf, IAID_); buf = writeUint32(buf, T1_); buf = writeUint32(buf, T2_); buf = storeSubOpt(buf); return buf; } bool TOptIA_PD::isValid() const { /// @todo check if suboptions are valid return this->Valid; } /* * How many prefixes are stored in this IA_PD */ int TOptIA_PD::countPrefixes() { int cnt = 0; SPtr opt; this->firstOption(); while (opt = this->getOption() ) { if (opt->getOptType() == OPTION_IAPREFIX) cnt++; } return cnt; } void TOptIA_PD::setT1(uint32_t t1) { T1_ = t1; } void TOptIA_PD::setT2(uint32_t t2) { T2_ = t2; } void TOptIA_PD::setIAID(uint32_t iaid) { IAID_ = iaid; } dibbler-1.0.1/Options/OptTA.cpp0000664000175000017500000000424712560471634013204 00000000000000/* * Dibbler - a portable DHCPv6 * * authors: Tomasz Mrugalski * Marek Senderski * * released under GNU GPL v2 licence * * $Id: OptTA.cpp,v 1.2 2006-03-05 21:37:46 thomson Exp $ */ #include "Portable.h" #include "OptTA.h" #include "OptIAAddress.h" #include "OptStatusCode.h" #include "Logger.h" TOptTA::TOptTA(uint32_t iaid, TMsg* parent) :TOpt(OPTION_IA_TA, parent), IAID_(iaid), Valid_(true) { } unsigned long TOptTA::getIAID() { return IAID_; } TOptTA::TOptTA(char * &buf, int &bufsize, TMsg* parent) :TOpt(OPTION_IA_TA, parent), Valid_(false) { if (bufsize < OPTION_IA_TA_LEN) { buf += bufsize; bufsize = 0; return; } IAID_ = readUint32(buf); buf += sizeof(uint32_t); bufsize -= sizeof(uint32_t); Valid_ = true; /// @todo: Parse suboptions } int TOptTA::getStatusCode() { SPtr ptrOpt; SubOptions.first(); while ( ptrOpt = SubOptions.get() ) { if ( ptrOpt->getOptType() == OPTION_STATUS_CODE) { SPtr ptrStatus; ptrStatus = (Ptr*) ptrOpt; return ptrStatus->getCode(); } } return -1; } size_t TOptTA::getSize() { return 4 + OPTION_IA_TA_LEN + getSubOptSize(); } char * TOptTA::storeSelf( char* buf) { buf = writeUint16(buf, OptType); buf = writeUint16(buf, getSize()-4); buf = writeUint32(buf, IAID_); buf = storeSubOpt(buf); return buf; } unsigned long TOptTA::getMaxValid() { unsigned long maxValid=0; SPtr ptrOpt; SubOptions.first(); while (ptrOpt=SubOptions.get()) { if (ptrOpt->getOptType()==OPTION_IAADDR) { SPtr ptrIAAddr=(Ptr*)ptrOpt; if (maxValidgetValid()) maxValid=ptrIAAddr->getValid(); } } return maxValid; } bool TOptTA::isValid() const { return this->Valid; } /* * How many addresses is stored in this IA */ int TOptTA::countAddrs() { int cnt = 0; SPtr opt; this->firstOption(); while (opt = this->getOption() ) { if (opt->getOptType() == OPTION_IAADDR) cnt++; } return cnt; } dibbler-1.0.1/Options/OptVendorClass.cpp0000644000175000017500000000152212277722750015115 00000000000000/* * Dibbler - a portable DHCPv6 * * authors: Tomasz Mrugalski * * released under GNU GPL v2 licence * */ #include "DHCPConst.h" #include "OptVendorClass.h" #include "Portable.h" #include TOptVendorClass::TOptVendorClass(uint16_t type, const char* buf, unsigned short buf_len, TMsg* parent) :TOptUserClass(type, parent) { if (buf_len < 4) { Valid = false; return; } Enterprise_id_ = readUint32(buf); buf += sizeof(uint32_t); buf_len -= sizeof(uint32_t); Valid = parseUserData(buf, buf_len); } size_t TOptVendorClass::getSize() { return 4 + TOptUserClass::getSize(); } char * TOptVendorClass::storeSelf(char* buf) { buf = writeUint16(buf, OptType); buf = writeUint16(buf, getSize() - 4); buf = writeUint32(buf, Enterprise_id_); return storeUserData(buf); } dibbler-1.0.1/Options/OptGeneric.h0000644000175000017500000000147312277722750013720 00000000000000/* * Dibbler - a portable DHCPv6 * * authors: Tomasz Mrugalski * * released under GNU GPL v2 licence * * $Id: OptGeneric.h,v 1.3 2008-11-11 22:41:48 thomson Exp $ * */ #ifndef OPTGENERIC_H #define OPTGENERIC_H #include "DHCPConst.h" #include "Opt.h" #include "DUID.h" #include "SmartPtr.h" class TOptGeneric : public TOpt { public: bool operator == (const TOptGeneric &other); TOptGeneric(int optType, const char * data, unsigned short dataLen, TMsg* parent); TOptGeneric(int optType, TMsg* parent); ~TOptGeneric(); size_t getSize(); void setData(char * data, int dataLen); std::string getPlain(); bool doDuties() { return true; } char * storeSelf(char* buf); virtual bool isValid() const; protected: char * Data; int DataLen; }; #endif dibbler-1.0.1/Options/OptAddrLst.h0000644000175000017500000000146612277722750013703 00000000000000/* * Dibbler - a portable DHCPv6 * * authors: Tomasz Mrugalski * * released under GNU GPL v2 only licence * */ #ifndef OPTDNSSERVERS_H #define OPTDNSSERVERS_H #include "IPv6Addr.h" #include "Container.h" #include "SmartPtr.h" #include "Opt.h" class TOptAddrLst : public TOpt { public: TOptAddrLst(int type, List(TIPv6Addr) lst, TMsg* parent); TOptAddrLst(int type, const char *buf, unsigned short len, TMsg* parent); char * storeSelf( char* buf); size_t getSize(); void firstAddr(); SPtr getAddr(); const List(TIPv6Addr)& getAddrLst() { return AddrLst; } int countAddr(); bool isValid() const; virtual bool doDuties() { return true; } // does nothing on its own std::string getPlain(); protected: List(TIPv6Addr) AddrLst; }; #endif dibbler-1.0.1/Options/OptInteger.cpp0000644000175000017500000000402712277722750014272 00000000000000/* * Dibbler - a portable DHCPv6 * * authors: Tomasz Mrugalski * Marek Senderski * * released under GNU GPL v2 licence * */ #include #include #include #include "Portable.h" #include "OptInteger.h" #include "DHCPConst.h" using namespace std; TOptInteger::TOptInteger(uint16_t type, unsigned int integerLen, unsigned int value, TMsg* parent) :TOpt(type, parent) { this->Value = value; this->Valid = true; this->Len = integerLen; } TOptInteger::TOptInteger(uint16_t type, unsigned int len, const char *buf, size_t bufsize, TMsg* parent) :TOpt(type, parent) { if ((unsigned int)bufsizeValid = false; return; } this->Len = len; this->Valid = true; switch (len) { case 0: this->Value = 0; break; case 1: this->Value = (unsigned char)(*buf); break; case 2: this->Value = readUint16(buf); break; case 3: this->Value = ((long)buf[0])<<16 | ((long)buf[1])<<8 | (long)buf[2]; /* no ntoh3, eh? */ break; case 4: this->Value = readUint32(buf); break; default: this->Valid = false; return; } } char * TOptInteger::storeSelf(char* buf) { buf = writeUint16(buf, OptType); buf = writeUint16(buf, this->Len); switch (this->Len) { case 0: break; case 1: *buf = (char)this->Value; break; case 2: buf = writeUint16(buf, this->Value); break; case 3: { int tmp = this->Value; buf[0] = tmp%256; tmp = tmp/256; buf[1] = tmp%256; tmp = tmp/256; buf[2] = tmp%256; tmp = tmp/256; break; } case 4: buf = writeUint32(buf, this->Value); break; default: /* this should never happen */ break; } return buf+this->Len; } size_t TOptInteger::getSize() { return 4 /*option header length*/ + this->Len; } unsigned int TOptInteger::getValue() { return this->Value; } std::string TOptInteger::getPlain() { stringstream tmp; tmp << Value; return tmp.str(); } bool TOptInteger::isValid() const { return this->Valid; } dibbler-1.0.1/Options/OptStatusCode.h0000664000175000017500000000130212420534542014401 00000000000000/* * Dibbler - a portable DHCPv6 * * authors: Tomasz Mrugalski * Marek Senderski * * released under GNU GPL v2 only licence * */ #ifndef OPTSTATUSCODE_H #define OPTSTATUSCODE_H #include #include "Opt.h" #include "DHCPConst.h" class TOptStatusCode : public TOpt { public: TOptStatusCode(const char * buf, size_t len, TMsg* parent); TOptStatusCode(int status, const std::string& Message, TMsg* parent); size_t getSize(); char * storeSelf( char* buf); int getCode(); std::string getText(); bool doDuties(); private: std::string Message_; int StatusCode_; bool Valid_; }; #endif dibbler-1.0.1/Options/OptVendorClass.h0000644000175000017500000000076212277722750014567 00000000000000/* * Dibbler - a portable DHCPv6 * * authors: Tomasz Mrugalski * * released under GNU GPL v2 only licence */ #ifndef OPTVENDORCLASS_H #define OPTVENDORCLASS_H #include "OptUserClass.h" #include class TOptVendorClass : public TOptUserClass { public: uint32_t Enterprise_id_; TOptVendorClass(uint16_t type, const char* buf, unsigned short buf_len, TMsg* parent); size_t getSize(); char * storeSelf( char* buf); }; #endif /* USERCLASS_H */ dibbler-1.0.1/Options/OptIA_NA.cpp0000664000175000017500000000533712560471634013550 00000000000000/* * Dibbler - a portable DHCPv6 * * authors: Tomasz Mrugalski * Marek Senderski * * released under GNU GPL v2 licence * */ #include "Portable.h" #include "OptIA_NA.h" #include "OptIAAddress.h" #include "OptStatusCode.h" //#include "OptRapidCommit.h" TOptIA_NA::TOptIA_NA(long IAID, long t1, long t2, TMsg* parent) :TOpt(OPTION_IA_NA, parent), IAID_(IAID), T1_(t1), T2_(t2), Valid_(true) { } void TOptIA_NA::setIAID(uint32_t iaid) { IAID_ = iaid; } unsigned long TOptIA_NA::getIAID() const { return IAID_; } unsigned long TOptIA_NA::getT1() const { return T1_; } void TOptIA_NA::setT1(unsigned long t1) { T1_ = t1; } unsigned long TOptIA_NA::getT2() const { return T2_; } void TOptIA_NA::setT2(unsigned long t2) { T2_ = t2; } TOptIA_NA::TOptIA_NA( char * &buf, int &bufsize, TMsg* parent) :TOpt(OPTION_IA_NA, parent), Valid_(false) { if (bufsize < 12) { buf += bufsize; bufsize = 0; } else { IAID_ = readUint32(buf); buf += sizeof(uint32_t); bufsize -= sizeof(uint32_t); T1_ = readUint32(buf); buf += sizeof(uint32_t); bufsize -= sizeof(uint32_t); T2_ = readUint32(buf); buf += sizeof(uint32_t); bufsize -= sizeof(uint32_t); Valid_ = true; } } int TOptIA_NA::getStatusCode() { SPtr ptrOpt; SubOptions.first(); while ( ptrOpt = SubOptions.get() ) { if ( ptrOpt->getOptType() == OPTION_STATUS_CODE) { SPtr ptrStatus; ptrStatus = (Ptr*) ptrOpt; return ptrStatus->getCode(); } } return -1; } size_t TOptIA_NA::getSize() { int mySize = 16; return mySize + getSubOptSize(); } char * TOptIA_NA::storeSelf( char* buf) { buf = writeUint16(buf, OptType); buf = writeUint16(buf, getSize() - 4 ); buf = writeUint32(buf, IAID_); buf = writeUint32(buf, T1_); buf = writeUint32(buf, T2_); buf = storeSubOpt(buf); return buf; } unsigned long TOptIA_NA::getMaxValid() { unsigned long maxValid=0; SPtr ptrOpt; SubOptions.first(); while (ptrOpt=SubOptions.get()) { if (ptrOpt->getOptType()==OPTION_IAADDR) { SPtr ptrIAAddr=(Ptr*)ptrOpt; if (maxValidgetValid()) maxValid=ptrIAAddr->getValid(); } } return maxValid; } bool TOptIA_NA::isValid() const { return this->Valid; } /* * How many addresses is stored in this IA */ int TOptIA_NA::countAddrs() { int cnt = 0; SPtr opt; this->firstOption(); while (opt = this->getOption() ) { if (opt->getOptType() == OPTION_IAADDR) cnt++; } return cnt; } dibbler-1.0.1/Options/OptOptionRequest.cpp0000644000175000017500000000575312277722750015525 00000000000000/* * Dibbler - a portable DHCPv6 * * authors: Tomasz Mrugalski * Marek Senderski * * released under GNU GPL v2 licence * */ #include #include "Portable.h" #include "OptOptionRequest.h" #include "DHCPConst.h" #include "Logger.h" TOptOptionRequest::TOptOptionRequest(uint16_t code, TMsg* parent) :TOpt(code, parent), Valid_(true) { Options = NULL; OptCnt = 0; } int TOptOptionRequest::getReqOpt(int optNr) { if ( (!OptCnt) || (optNr>OptCnt) ) return 0; return this->Options[optNr]; } size_t TOptOptionRequest::getSize() { if (!OptCnt) return 0; int mySize = 4+(OptCnt<<1); return mySize+getSubOptSize(); } char * TOptOptionRequest::storeSelf( char* buf) { if (!OptCnt) return buf; buf = writeUint16(buf, OptType); buf = writeUint16(buf, getSize()-4); int i=0; while(i=OptCnt) return; memcpy(Options+optIdx,Options+optIdx+1,(OptCnt-optIdx-1)<<1); OptCnt--; } bool TOptOptionRequest::isOption(unsigned short optNr) { for(int i=0;iOptCnt; } void TOptOptionRequest::clearOptions() { if (this->OptCnt) delete [] this->Options; OptCnt=0; } bool TOptOptionRequest::isValid() const { return Valid_; } TOptOptionRequest::~TOptOptionRequest() { if (Options) delete [] Options; } dibbler-1.0.1/Options/OptAddr.h0000664000175000017500000000165112233256142013203 00000000000000/* * Dibbler - a portable DHCPv6 * * authors: Tomasz Mrugalski * Marek Senderski * * released under GNU GPL v2 licence * * $Id: OptAddr.h,v 1.1 2004-10-26 22:36:57 thomson Exp $ * * $Log: not supported by cvs2svn $ * Revision 1.2 2004/09/05 15:27:49 thomson * Data receive switched from recvfrom to recvmsg, unicast partially supported. * * */ #ifndef OPTSERVERUNICAST_H #define OPTSERVERUNICAST_H #include "Opt.h" #include "SmartPtr.h" #include "IPv6Addr.h" class TOptAddr : public TOpt { public: TOptAddr(int type, const char * buf, unsigned short len, TMsg* parent); TOptAddr(int type, SPtr addr, TMsg * parent); size_t getSize(); char * storeSelf( char* buf); SPtr getAddr(); virtual bool doDuties() { return true; } // does nothing on its own std::string getPlain(); protected: SPtr Addr; }; #endif dibbler-1.0.1/Options/OptRtPrefix.cpp0000664000175000017500000000360212233256142014425 00000000000000/* * Dibbler - a portable DHCPv6 * * authors: Mateusz Ozga * changes: Tomek Mrugalski * * Released under GNU GPL v2 licence * */ #include #include "DHCPConst.h" #include "OptRtPrefix.h" #include "Logger.h" #include "Portable.h" using namespace std; TOptRtPrefix::TOptRtPrefix(uint32_t lifetime, uint8_t prefixlen, uint8_t metric, SPtr prefix, TMsg* parent) :TOpt(OPTION_RTPREFIX, parent), Lifetime(lifetime), PrefixLen(prefixlen), Metric(metric), Prefix(prefix) { } TOptRtPrefix::TOptRtPrefix(const char * buf, int bufsize, TMsg* parent) :TOpt(OPTION_RTPREFIX, parent) { if (bufsize<20) { Log(Warning) << "Received truncated RTPREFIX option" << LogEnd; Valid = false; return; } Lifetime = readUint32(buf); buf += sizeof(uint32_t); bufsize -= sizeof(uint32_t); PrefixLen = buf[0]; buf += 1; bufsize -= 1; Metric = buf[0]; buf += 1; bufsize -= 1; Prefix = new TIPv6Addr(buf, false); buf += 16; bufsize -= 16; Valid = parseOptions(SubOptions, buf, bufsize, parent, OPTION_RTPREFIX); } char* TOptRtPrefix::storeSelf(char* buf) { buf = storeHeader(buf); buf = writeUint32(buf, Lifetime); buf[0] = PrefixLen; buf[1] = Metric; buf += 2; buf = Prefix->storeSelf(buf); return storeSubOpt(buf); } uint32_t TOptRtPrefix::getLifetime() { return Lifetime; } uint8_t TOptRtPrefix::getPrefixLen() { return PrefixLen; } uint8_t TOptRtPrefix::getMetric() { return Metric; } SPtr TOptRtPrefix::getPrefix() { return Prefix; } size_t TOptRtPrefix::getSize() { return 4 + 22 + getSubOptSize(); } std::string TOptRtPrefix::getPlain() { stringstream tmp; tmp << Prefix->getPlain() << "/" << (unsigned int)PrefixLen << " " << Lifetime << " " << (unsigned int)Metric; return tmp.str(); } dibbler-1.0.1/Options/OptVendorData.h0000644000175000017500000000162712304040124014347 00000000000000/* * Dibbler - a portable DHCPv6 * * authors: Tomasz Mrugalski * * released under GNU GPL v2 only licence */ #ifndef OPTVENDORDATA_H #define OPTVENDORDATA_H #include "Opt.h" //#include "DHCPConst.h" class TOptVendorData : public TOpt { public: TOptVendorData(int type, int enterprise, char * data, int dataLen, TMsg* parent); TOptVendorData(int type, const char * buf, int n, TMsg* parent); size_t getSize(); char * storeSelf( char* buf); virtual bool isValid() const; /// @todo: should return uint32_t int getVendor(); char * getVendorData(); // returns vendor data (binary) std::string getVendorDataPlain(); // returns vendor data (as a printable string) int getVendorDataLen(); // returns vendor data length bool doDuties() { return true; } protected: int Vendor; char * VendorData; int VendorDataLen; }; #endif dibbler-1.0.1/Options/OptUserClass.cpp0000644000175000017500000000370312277722750014601 00000000000000/* * Dibbler - a portable DHCPv6 * * authors: Tomasz Mrugalski * Marek Senderski * * released under GNU GPL v2 licence * */ #include "DHCPConst.h" #include "OptUserClass.h" #include "Portable.h" #include TOptUserClass::TOptUserClass(uint16_t type, const char* buf, unsigned short buf_len, TMsg* parent) :TOpt(type, parent) { Valid = parseUserData(buf, buf_len); } TOptUserClass::TOptUserClass(uint16_t type, TMsg* parent) :TOpt(type, parent) { Valid = true; } size_t TOptUserClass::getSize() { size_t len = 4; for (std::vector::const_iterator data = userClassData_.begin(); data != userClassData_.end(); ++data) { len += 2; // len field len += data->opaqueData_.size(); } return len; } char * TOptUserClass::storeSelf(char* buf) { buf = writeUint16(buf, OptType); buf = writeUint16(buf, getSize() - 4); return storeUserData(buf); } char * TOptUserClass::storeUserData(char* buf) { for (std::vector::const_iterator data = userClassData_.begin(); data != userClassData_.end(); ++data) { buf = writeUint16(buf, data->opaqueData_.size()); memcpy(buf, &data->opaqueData_[0], data->opaqueData_.size()); buf += data->opaqueData_.size(); } return buf; } /// @brief parses UserData field /// /// @return true if parsing was successful, false otherwise bool TOptUserClass::parseUserData(const char* buf, unsigned short buf_len) { int pos = 0; while (buf_len > 2) { uint16_t len = readUint16(buf + pos); buf_len -= sizeof(uint16_t); pos += sizeof(uint16_t); if (len > buf_len) { // truncated user-data return false; } UserClassData data; data.opaqueData_.resize(len); memcpy(&data.opaqueData_[0], buf + pos, len); userClassData_.push_back(data); pos += len; buf_len -= len; } if (buf_len) { return false; } return true; } bool TOptUserClass::isValid() const { return true; } dibbler-1.0.1/Options/OptVendorData.cpp0000644000175000017500000000416012304040124014675 00000000000000/* * Dibbler - a portable DHCPv6 * * authors: Tomasz Mrugalski * * released under GNU GPL v2 licence * */ #include #include "OptVendorData.h" #include #include #include "Portable.h" #include "DHCPConst.h" #include "Logger.h" #include "hex.h" #if defined(LINUX) || defined(BSD) #include #endif using namespace std; TOptVendorData::TOptVendorData(int type, int enterprise, char * data, int dataLen, TMsg* parent) :TOpt(type, parent) { Vendor = enterprise; VendorData = new char[dataLen]; memcpy(VendorData, data, dataLen); VendorDataLen = dataLen; } TOptVendorData::TOptVendorData(int type, const char * buf, int n, TMsg* parent) :TOpt(type, parent) { if (n<4) { Log(Warning) << "Unable to parse " << type << "option." << LogEnd; this->Vendor = 0; this->VendorData = 0; this->VendorDataLen = 0; return; } this->Vendor = readUint32(buf); // enterprise number buf += sizeof(uint32_t); n -= sizeof(uint32_t); if (!n) { this->VendorData = 0; this->VendorDataLen = 0; return; } if (n) { this->VendorData = new char[n]; memmove(this->VendorData, buf, n); } else { this->VendorData = 0; } this->VendorDataLen = n; } size_t TOptVendorData::getSize() { return 8 + VendorDataLen; /* 8 normal header(4) + enterprise (4) */ } /** * stores option in a buffer * * @param buf option will be stored here * * @return pointer to the next unused byte */ char * TOptVendorData::storeSelf( char* buf) { buf = writeUint16(buf, OptType); buf = writeUint16(buf, getSize()-4); buf = writeUint32(buf, this->Vendor); memmove(buf, this->VendorData, this->VendorDataLen); buf+=this->VendorDataLen; return buf; } bool TOptVendorData::isValid() const { return true; } int TOptVendorData::getVendor() { return Vendor; } char * TOptVendorData::getVendorData() { return VendorData; } std::string TOptVendorData::getVendorDataPlain() { return hexToText((uint8_t*)&VendorData[0], VendorDataLen); } int TOptVendorData::getVendorDataLen() { return VendorDataLen; } dibbler-1.0.1/Options/OptReconfigureMsg.h0000644000175000017500000000111112277722750015250 00000000000000/* * Dibbler - a portable DHCPv6 * * authors: Grzegorz Pluto * changes: Tomasz Mrugalski * * released under GNU GPL v2 only licence */ #ifndef OPTRECONFIGURE_H #define OPTRECONFIGURE_H #include "DHCPConst.h" #include "Opt.h" class TOptReconfigureMsg : public TOpt { public: TOptReconfigureMsg(int msgType, TMsg* parent); TOptReconfigureMsg(char *buf, int bufsize, TMsg* parent); size_t getSize(); char* storeSelf(char* buf); bool doDuties() { return true; } bool isValid() const; protected: uint8_t MsgType_; }; #endif dibbler-1.0.1/Options/Makefile.in0000664000175000017500000022376312561652535013566 00000000000000# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ @HAVE_GTEST_TRUE@am__append_1 = tests subdir = Options DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/depcomp ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/libtool.m4 \ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/include/dibbler-config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = LIBRARIES = $(noinst_LIBRARIES) ARFLAGS = cru AM_V_AR = $(am__v_AR_@AM_V@) am__v_AR_ = $(am__v_AR_@AM_DEFAULT_V@) am__v_AR_0 = @echo " AR " $@; am__v_AR_1 = libOptions_a_AR = $(AR) $(ARFLAGS) libOptions_a_LIBADD = am_libOptions_a_OBJECTS = libOptions_a-OptAddr.$(OBJEXT) \ libOptions_a-OptAddrLst.$(OBJEXT) \ libOptions_a-OptAuthentication.$(OBJEXT) \ libOptions_a-Opt.$(OBJEXT) libOptions_a-OptDUID.$(OBJEXT) \ libOptions_a-OptEmpty.$(OBJEXT) libOptions_a-OptFQDN.$(OBJEXT) \ libOptions_a-OptGeneric.$(OBJEXT) \ libOptions_a-OptIAAddress.$(OBJEXT) \ libOptions_a-OptIA_NA.$(OBJEXT) \ libOptions_a-OptIA_PD.$(OBJEXT) \ libOptions_a-OptIAPrefix.$(OBJEXT) \ libOptions_a-OptInteger.$(OBJEXT) \ libOptions_a-OptOptionRequest.$(OBJEXT) \ libOptions_a-OptStatusCode.$(OBJEXT) \ libOptions_a-OptString.$(OBJEXT) \ libOptions_a-OptDomainLst.$(OBJEXT) \ libOptions_a-OptTA.$(OBJEXT) \ libOptions_a-OptUserClass.$(OBJEXT) \ libOptions_a-OptVendorClass.$(OBJEXT) \ libOptions_a-OptVendorSpecInfo.$(OBJEXT) \ libOptions_a-OptRtPrefix.$(OBJEXT) \ libOptions_a-OptReconfigureMsg.$(OBJEXT) \ libOptions_a-OptVendorData.$(OBJEXT) libOptions_a_OBJECTS = $(am_libOptions_a_OBJECTS) AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)/include depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) LTCXXCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CXXFLAGS) $(CXXFLAGS) AM_V_CXX = $(am__v_CXX_@AM_V@) am__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@) am__v_CXX_0 = @echo " CXX " $@; am__v_CXX_1 = CXXLD = $(CXX) CXXLINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \ $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CXXLD = $(am__v_CXXLD_@AM_V@) am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@) am__v_CXXLD_0 = @echo " CXXLD " $@; am__v_CXXLD_1 = COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(libOptions_a_SOURCES) DIST_SOURCES = $(libOptions_a_SOURCES) RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \ ctags-recursive dvi-recursive html-recursive info-recursive \ install-data-recursive install-dvi-recursive \ install-exec-recursive install-html-recursive \ install-info-recursive install-pdf-recursive \ install-ps-recursive install-recursive installcheck-recursive \ installdirs-recursive pdf-recursive ps-recursive \ tags-recursive uninstall-recursive am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive am__recursive_targets = \ $(RECURSIVE_TARGETS) \ $(RECURSIVE_CLEAN_TARGETS) \ $(am__extra_recursive_targets) AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \ distdir am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags DIST_SUBDIRS = . tests DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) am__relativize = \ dir0=`pwd`; \ sed_first='s,^\([^/]*\)/.*$$,\1,'; \ sed_rest='s,^[^/]*/*,,'; \ sed_last='s,^.*/\([^/]*\)$$,\1,'; \ sed_butlast='s,/*[^/]*$$,,'; \ while test -n "$$dir1"; do \ first=`echo "$$dir1" | sed -e "$$sed_first"`; \ if test "$$first" != "."; then \ if test "$$first" = ".."; then \ dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ else \ first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ if test "$$first2" = "$$first"; then \ dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ else \ dir2="../$$dir2"; \ fi; \ dir0="$$dir0"/"$$first"; \ fi; \ fi; \ dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ done; \ reldir="$$dir2" ACLOCAL = @ACLOCAL@ ALLOCA = @ALLOCA@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ ARCH = @ARCH@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ EXTRA_DIST_SUBDIRS = @EXTRA_DIST_SUBDIRS@ FGREP = @FGREP@ GREP = @GREP@ GTEST_INCLUDES = @GTEST_INCLUDES@ GTEST_LDADD = @GTEST_LDADD@ GTEST_LDFLAGS = @GTEST_LDFLAGS@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LINKPRINT = @LINKPRINT@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PORT_CFLAGS = @PORT_CFLAGS@ PORT_LDFLAGS = @PORT_LDFLAGS@ PORT_SUBDIR = @PORT_SUBDIR@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ subdirs = @subdirs@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ SUBDIRS = . $(am__append_1) noinst_LIBRARIES = libOptions.a libOptions_a_CPPFLAGS = -I$(top_srcdir)/Misc -I$(top_srcdir)/Messages libOptions_a_SOURCES = OptAddr.cpp OptAddr.h OptAddrLst.cpp \ OptAddrLst.h OptAuthentication.cpp OptAuthentication.h Opt.cpp \ Opt.h OptDUID.cpp OptDUID.h OptEmpty.cpp OptEmpty.h \ OptFQDN.cpp OptFQDN.h OptGeneric.cpp OptGeneric.h \ OptIAAddress.cpp OptIAAddress.h OptIA_NA.cpp OptIA_NA.h \ OptIA_PD.cpp OptIA_PD.h OptIAPrefix.cpp OptIAPrefix.h \ OptInteger.cpp OptInteger.h OptOptionRequest.cpp \ OptOptionRequest.h OptStatusCode.cpp OptStatusCode.h \ OptString.cpp OptString.h OptDomainLst.cpp OptDomainLst.h \ OptTA.cpp OptTA.h OptUserClass.cpp OptUserClass.h \ OptVendorClass.cpp OptVendorClass.h OptVendorSpecInfo.cpp \ OptVendorSpecInfo.h OptRtPrefix.cpp OptRtPrefix.h \ OptReconfigureMsg.cpp OptReconfigureMsg.h OptVendorData.cpp \ OptVendorData.h all: all-recursive .SUFFIXES: .SUFFIXES: .cpp .lo .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign Options/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign Options/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstLIBRARIES: -test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES) libOptions.a: $(libOptions_a_OBJECTS) $(libOptions_a_DEPENDENCIES) $(EXTRA_libOptions_a_DEPENDENCIES) $(AM_V_at)-rm -f libOptions.a $(AM_V_AR)$(libOptions_a_AR) libOptions.a $(libOptions_a_OBJECTS) $(libOptions_a_LIBADD) $(AM_V_at)$(RANLIB) libOptions.a mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libOptions_a-Opt.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libOptions_a-OptAddr.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libOptions_a-OptAddrLst.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libOptions_a-OptAuthentication.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libOptions_a-OptDUID.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libOptions_a-OptDomainLst.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libOptions_a-OptEmpty.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libOptions_a-OptFQDN.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libOptions_a-OptGeneric.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libOptions_a-OptIAAddress.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libOptions_a-OptIAPrefix.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libOptions_a-OptIA_NA.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libOptions_a-OptIA_PD.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libOptions_a-OptInteger.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libOptions_a-OptOptionRequest.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libOptions_a-OptReconfigureMsg.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libOptions_a-OptRtPrefix.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libOptions_a-OptStatusCode.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libOptions_a-OptString.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libOptions_a-OptTA.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libOptions_a-OptUserClass.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libOptions_a-OptVendorClass.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libOptions_a-OptVendorData.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libOptions_a-OptVendorSpecInfo.Po@am__quote@ .cpp.o: @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $< .cpp.obj: @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .cpp.lo: @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LTCXXCOMPILE) -c -o $@ $< libOptions_a-OptAddr.o: OptAddr.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libOptions_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libOptions_a-OptAddr.o -MD -MP -MF $(DEPDIR)/libOptions_a-OptAddr.Tpo -c -o libOptions_a-OptAddr.o `test -f 'OptAddr.cpp' || echo '$(srcdir)/'`OptAddr.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libOptions_a-OptAddr.Tpo $(DEPDIR)/libOptions_a-OptAddr.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='OptAddr.cpp' object='libOptions_a-OptAddr.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libOptions_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libOptions_a-OptAddr.o `test -f 'OptAddr.cpp' || echo '$(srcdir)/'`OptAddr.cpp libOptions_a-OptAddr.obj: OptAddr.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libOptions_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libOptions_a-OptAddr.obj -MD -MP -MF $(DEPDIR)/libOptions_a-OptAddr.Tpo -c -o libOptions_a-OptAddr.obj `if test -f 'OptAddr.cpp'; then $(CYGPATH_W) 'OptAddr.cpp'; else $(CYGPATH_W) '$(srcdir)/OptAddr.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libOptions_a-OptAddr.Tpo $(DEPDIR)/libOptions_a-OptAddr.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='OptAddr.cpp' object='libOptions_a-OptAddr.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libOptions_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libOptions_a-OptAddr.obj `if test -f 'OptAddr.cpp'; then $(CYGPATH_W) 'OptAddr.cpp'; else $(CYGPATH_W) '$(srcdir)/OptAddr.cpp'; fi` libOptions_a-OptAddrLst.o: OptAddrLst.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libOptions_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libOptions_a-OptAddrLst.o -MD -MP -MF $(DEPDIR)/libOptions_a-OptAddrLst.Tpo -c -o libOptions_a-OptAddrLst.o `test -f 'OptAddrLst.cpp' || echo '$(srcdir)/'`OptAddrLst.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libOptions_a-OptAddrLst.Tpo $(DEPDIR)/libOptions_a-OptAddrLst.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='OptAddrLst.cpp' object='libOptions_a-OptAddrLst.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libOptions_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libOptions_a-OptAddrLst.o `test -f 'OptAddrLst.cpp' || echo '$(srcdir)/'`OptAddrLst.cpp libOptions_a-OptAddrLst.obj: OptAddrLst.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libOptions_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libOptions_a-OptAddrLst.obj -MD -MP -MF $(DEPDIR)/libOptions_a-OptAddrLst.Tpo -c -o libOptions_a-OptAddrLst.obj `if test -f 'OptAddrLst.cpp'; then $(CYGPATH_W) 'OptAddrLst.cpp'; else $(CYGPATH_W) '$(srcdir)/OptAddrLst.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libOptions_a-OptAddrLst.Tpo $(DEPDIR)/libOptions_a-OptAddrLst.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='OptAddrLst.cpp' object='libOptions_a-OptAddrLst.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libOptions_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libOptions_a-OptAddrLst.obj `if test -f 'OptAddrLst.cpp'; then $(CYGPATH_W) 'OptAddrLst.cpp'; else $(CYGPATH_W) '$(srcdir)/OptAddrLst.cpp'; fi` libOptions_a-OptAuthentication.o: OptAuthentication.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libOptions_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libOptions_a-OptAuthentication.o -MD -MP -MF $(DEPDIR)/libOptions_a-OptAuthentication.Tpo -c -o libOptions_a-OptAuthentication.o `test -f 'OptAuthentication.cpp' || echo '$(srcdir)/'`OptAuthentication.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libOptions_a-OptAuthentication.Tpo $(DEPDIR)/libOptions_a-OptAuthentication.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='OptAuthentication.cpp' object='libOptions_a-OptAuthentication.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libOptions_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libOptions_a-OptAuthentication.o `test -f 'OptAuthentication.cpp' || echo '$(srcdir)/'`OptAuthentication.cpp libOptions_a-OptAuthentication.obj: OptAuthentication.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libOptions_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libOptions_a-OptAuthentication.obj -MD -MP -MF $(DEPDIR)/libOptions_a-OptAuthentication.Tpo -c -o libOptions_a-OptAuthentication.obj `if test -f 'OptAuthentication.cpp'; then $(CYGPATH_W) 'OptAuthentication.cpp'; else $(CYGPATH_W) '$(srcdir)/OptAuthentication.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libOptions_a-OptAuthentication.Tpo $(DEPDIR)/libOptions_a-OptAuthentication.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='OptAuthentication.cpp' object='libOptions_a-OptAuthentication.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libOptions_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libOptions_a-OptAuthentication.obj `if test -f 'OptAuthentication.cpp'; then $(CYGPATH_W) 'OptAuthentication.cpp'; else $(CYGPATH_W) '$(srcdir)/OptAuthentication.cpp'; fi` libOptions_a-Opt.o: Opt.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libOptions_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libOptions_a-Opt.o -MD -MP -MF $(DEPDIR)/libOptions_a-Opt.Tpo -c -o libOptions_a-Opt.o `test -f 'Opt.cpp' || echo '$(srcdir)/'`Opt.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libOptions_a-Opt.Tpo $(DEPDIR)/libOptions_a-Opt.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='Opt.cpp' object='libOptions_a-Opt.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libOptions_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libOptions_a-Opt.o `test -f 'Opt.cpp' || echo '$(srcdir)/'`Opt.cpp libOptions_a-Opt.obj: Opt.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libOptions_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libOptions_a-Opt.obj -MD -MP -MF $(DEPDIR)/libOptions_a-Opt.Tpo -c -o libOptions_a-Opt.obj `if test -f 'Opt.cpp'; then $(CYGPATH_W) 'Opt.cpp'; else $(CYGPATH_W) '$(srcdir)/Opt.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libOptions_a-Opt.Tpo $(DEPDIR)/libOptions_a-Opt.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='Opt.cpp' object='libOptions_a-Opt.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libOptions_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libOptions_a-Opt.obj `if test -f 'Opt.cpp'; then $(CYGPATH_W) 'Opt.cpp'; else $(CYGPATH_W) '$(srcdir)/Opt.cpp'; fi` libOptions_a-OptDUID.o: OptDUID.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libOptions_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libOptions_a-OptDUID.o -MD -MP -MF $(DEPDIR)/libOptions_a-OptDUID.Tpo -c -o libOptions_a-OptDUID.o `test -f 'OptDUID.cpp' || echo '$(srcdir)/'`OptDUID.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libOptions_a-OptDUID.Tpo $(DEPDIR)/libOptions_a-OptDUID.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='OptDUID.cpp' object='libOptions_a-OptDUID.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libOptions_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libOptions_a-OptDUID.o `test -f 'OptDUID.cpp' || echo '$(srcdir)/'`OptDUID.cpp libOptions_a-OptDUID.obj: OptDUID.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libOptions_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libOptions_a-OptDUID.obj -MD -MP -MF $(DEPDIR)/libOptions_a-OptDUID.Tpo -c -o libOptions_a-OptDUID.obj `if test -f 'OptDUID.cpp'; then $(CYGPATH_W) 'OptDUID.cpp'; else $(CYGPATH_W) '$(srcdir)/OptDUID.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libOptions_a-OptDUID.Tpo $(DEPDIR)/libOptions_a-OptDUID.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='OptDUID.cpp' object='libOptions_a-OptDUID.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libOptions_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libOptions_a-OptDUID.obj `if test -f 'OptDUID.cpp'; then $(CYGPATH_W) 'OptDUID.cpp'; else $(CYGPATH_W) '$(srcdir)/OptDUID.cpp'; fi` libOptions_a-OptEmpty.o: OptEmpty.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libOptions_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libOptions_a-OptEmpty.o -MD -MP -MF $(DEPDIR)/libOptions_a-OptEmpty.Tpo -c -o libOptions_a-OptEmpty.o `test -f 'OptEmpty.cpp' || echo '$(srcdir)/'`OptEmpty.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libOptions_a-OptEmpty.Tpo $(DEPDIR)/libOptions_a-OptEmpty.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='OptEmpty.cpp' object='libOptions_a-OptEmpty.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libOptions_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libOptions_a-OptEmpty.o `test -f 'OptEmpty.cpp' || echo '$(srcdir)/'`OptEmpty.cpp libOptions_a-OptEmpty.obj: OptEmpty.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libOptions_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libOptions_a-OptEmpty.obj -MD -MP -MF $(DEPDIR)/libOptions_a-OptEmpty.Tpo -c -o libOptions_a-OptEmpty.obj `if test -f 'OptEmpty.cpp'; then $(CYGPATH_W) 'OptEmpty.cpp'; else $(CYGPATH_W) '$(srcdir)/OptEmpty.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libOptions_a-OptEmpty.Tpo $(DEPDIR)/libOptions_a-OptEmpty.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='OptEmpty.cpp' object='libOptions_a-OptEmpty.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libOptions_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libOptions_a-OptEmpty.obj `if test -f 'OptEmpty.cpp'; then $(CYGPATH_W) 'OptEmpty.cpp'; else $(CYGPATH_W) '$(srcdir)/OptEmpty.cpp'; fi` libOptions_a-OptFQDN.o: OptFQDN.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libOptions_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libOptions_a-OptFQDN.o -MD -MP -MF $(DEPDIR)/libOptions_a-OptFQDN.Tpo -c -o libOptions_a-OptFQDN.o `test -f 'OptFQDN.cpp' || echo '$(srcdir)/'`OptFQDN.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libOptions_a-OptFQDN.Tpo $(DEPDIR)/libOptions_a-OptFQDN.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='OptFQDN.cpp' object='libOptions_a-OptFQDN.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libOptions_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libOptions_a-OptFQDN.o `test -f 'OptFQDN.cpp' || echo '$(srcdir)/'`OptFQDN.cpp libOptions_a-OptFQDN.obj: OptFQDN.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libOptions_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libOptions_a-OptFQDN.obj -MD -MP -MF $(DEPDIR)/libOptions_a-OptFQDN.Tpo -c -o libOptions_a-OptFQDN.obj `if test -f 'OptFQDN.cpp'; then $(CYGPATH_W) 'OptFQDN.cpp'; else $(CYGPATH_W) '$(srcdir)/OptFQDN.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libOptions_a-OptFQDN.Tpo $(DEPDIR)/libOptions_a-OptFQDN.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='OptFQDN.cpp' object='libOptions_a-OptFQDN.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libOptions_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libOptions_a-OptFQDN.obj `if test -f 'OptFQDN.cpp'; then $(CYGPATH_W) 'OptFQDN.cpp'; else $(CYGPATH_W) '$(srcdir)/OptFQDN.cpp'; fi` libOptions_a-OptGeneric.o: OptGeneric.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libOptions_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libOptions_a-OptGeneric.o -MD -MP -MF $(DEPDIR)/libOptions_a-OptGeneric.Tpo -c -o libOptions_a-OptGeneric.o `test -f 'OptGeneric.cpp' || echo '$(srcdir)/'`OptGeneric.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libOptions_a-OptGeneric.Tpo $(DEPDIR)/libOptions_a-OptGeneric.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='OptGeneric.cpp' object='libOptions_a-OptGeneric.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libOptions_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libOptions_a-OptGeneric.o `test -f 'OptGeneric.cpp' || echo '$(srcdir)/'`OptGeneric.cpp libOptions_a-OptGeneric.obj: OptGeneric.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libOptions_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libOptions_a-OptGeneric.obj -MD -MP -MF $(DEPDIR)/libOptions_a-OptGeneric.Tpo -c -o libOptions_a-OptGeneric.obj `if test -f 'OptGeneric.cpp'; then $(CYGPATH_W) 'OptGeneric.cpp'; else $(CYGPATH_W) '$(srcdir)/OptGeneric.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libOptions_a-OptGeneric.Tpo $(DEPDIR)/libOptions_a-OptGeneric.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='OptGeneric.cpp' object='libOptions_a-OptGeneric.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libOptions_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libOptions_a-OptGeneric.obj `if test -f 'OptGeneric.cpp'; then $(CYGPATH_W) 'OptGeneric.cpp'; else $(CYGPATH_W) '$(srcdir)/OptGeneric.cpp'; fi` libOptions_a-OptIAAddress.o: OptIAAddress.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libOptions_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libOptions_a-OptIAAddress.o -MD -MP -MF $(DEPDIR)/libOptions_a-OptIAAddress.Tpo -c -o libOptions_a-OptIAAddress.o `test -f 'OptIAAddress.cpp' || echo '$(srcdir)/'`OptIAAddress.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libOptions_a-OptIAAddress.Tpo $(DEPDIR)/libOptions_a-OptIAAddress.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='OptIAAddress.cpp' object='libOptions_a-OptIAAddress.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libOptions_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libOptions_a-OptIAAddress.o `test -f 'OptIAAddress.cpp' || echo '$(srcdir)/'`OptIAAddress.cpp libOptions_a-OptIAAddress.obj: OptIAAddress.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libOptions_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libOptions_a-OptIAAddress.obj -MD -MP -MF $(DEPDIR)/libOptions_a-OptIAAddress.Tpo -c -o libOptions_a-OptIAAddress.obj `if test -f 'OptIAAddress.cpp'; then $(CYGPATH_W) 'OptIAAddress.cpp'; else $(CYGPATH_W) '$(srcdir)/OptIAAddress.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libOptions_a-OptIAAddress.Tpo $(DEPDIR)/libOptions_a-OptIAAddress.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='OptIAAddress.cpp' object='libOptions_a-OptIAAddress.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libOptions_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libOptions_a-OptIAAddress.obj `if test -f 'OptIAAddress.cpp'; then $(CYGPATH_W) 'OptIAAddress.cpp'; else $(CYGPATH_W) '$(srcdir)/OptIAAddress.cpp'; fi` libOptions_a-OptIA_NA.o: OptIA_NA.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libOptions_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libOptions_a-OptIA_NA.o -MD -MP -MF $(DEPDIR)/libOptions_a-OptIA_NA.Tpo -c -o libOptions_a-OptIA_NA.o `test -f 'OptIA_NA.cpp' || echo '$(srcdir)/'`OptIA_NA.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libOptions_a-OptIA_NA.Tpo $(DEPDIR)/libOptions_a-OptIA_NA.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='OptIA_NA.cpp' object='libOptions_a-OptIA_NA.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libOptions_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libOptions_a-OptIA_NA.o `test -f 'OptIA_NA.cpp' || echo '$(srcdir)/'`OptIA_NA.cpp libOptions_a-OptIA_NA.obj: OptIA_NA.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libOptions_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libOptions_a-OptIA_NA.obj -MD -MP -MF $(DEPDIR)/libOptions_a-OptIA_NA.Tpo -c -o libOptions_a-OptIA_NA.obj `if test -f 'OptIA_NA.cpp'; then $(CYGPATH_W) 'OptIA_NA.cpp'; else $(CYGPATH_W) '$(srcdir)/OptIA_NA.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libOptions_a-OptIA_NA.Tpo $(DEPDIR)/libOptions_a-OptIA_NA.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='OptIA_NA.cpp' object='libOptions_a-OptIA_NA.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libOptions_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libOptions_a-OptIA_NA.obj `if test -f 'OptIA_NA.cpp'; then $(CYGPATH_W) 'OptIA_NA.cpp'; else $(CYGPATH_W) '$(srcdir)/OptIA_NA.cpp'; fi` libOptions_a-OptIA_PD.o: OptIA_PD.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libOptions_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libOptions_a-OptIA_PD.o -MD -MP -MF $(DEPDIR)/libOptions_a-OptIA_PD.Tpo -c -o libOptions_a-OptIA_PD.o `test -f 'OptIA_PD.cpp' || echo '$(srcdir)/'`OptIA_PD.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libOptions_a-OptIA_PD.Tpo $(DEPDIR)/libOptions_a-OptIA_PD.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='OptIA_PD.cpp' object='libOptions_a-OptIA_PD.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libOptions_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libOptions_a-OptIA_PD.o `test -f 'OptIA_PD.cpp' || echo '$(srcdir)/'`OptIA_PD.cpp libOptions_a-OptIA_PD.obj: OptIA_PD.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libOptions_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libOptions_a-OptIA_PD.obj -MD -MP -MF $(DEPDIR)/libOptions_a-OptIA_PD.Tpo -c -o libOptions_a-OptIA_PD.obj `if test -f 'OptIA_PD.cpp'; then $(CYGPATH_W) 'OptIA_PD.cpp'; else $(CYGPATH_W) '$(srcdir)/OptIA_PD.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libOptions_a-OptIA_PD.Tpo $(DEPDIR)/libOptions_a-OptIA_PD.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='OptIA_PD.cpp' object='libOptions_a-OptIA_PD.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libOptions_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libOptions_a-OptIA_PD.obj `if test -f 'OptIA_PD.cpp'; then $(CYGPATH_W) 'OptIA_PD.cpp'; else $(CYGPATH_W) '$(srcdir)/OptIA_PD.cpp'; fi` libOptions_a-OptIAPrefix.o: OptIAPrefix.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libOptions_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libOptions_a-OptIAPrefix.o -MD -MP -MF $(DEPDIR)/libOptions_a-OptIAPrefix.Tpo -c -o libOptions_a-OptIAPrefix.o `test -f 'OptIAPrefix.cpp' || echo '$(srcdir)/'`OptIAPrefix.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libOptions_a-OptIAPrefix.Tpo $(DEPDIR)/libOptions_a-OptIAPrefix.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='OptIAPrefix.cpp' object='libOptions_a-OptIAPrefix.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libOptions_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libOptions_a-OptIAPrefix.o `test -f 'OptIAPrefix.cpp' || echo '$(srcdir)/'`OptIAPrefix.cpp libOptions_a-OptIAPrefix.obj: OptIAPrefix.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libOptions_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libOptions_a-OptIAPrefix.obj -MD -MP -MF $(DEPDIR)/libOptions_a-OptIAPrefix.Tpo -c -o libOptions_a-OptIAPrefix.obj `if test -f 'OptIAPrefix.cpp'; then $(CYGPATH_W) 'OptIAPrefix.cpp'; else $(CYGPATH_W) '$(srcdir)/OptIAPrefix.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libOptions_a-OptIAPrefix.Tpo $(DEPDIR)/libOptions_a-OptIAPrefix.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='OptIAPrefix.cpp' object='libOptions_a-OptIAPrefix.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libOptions_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libOptions_a-OptIAPrefix.obj `if test -f 'OptIAPrefix.cpp'; then $(CYGPATH_W) 'OptIAPrefix.cpp'; else $(CYGPATH_W) '$(srcdir)/OptIAPrefix.cpp'; fi` libOptions_a-OptInteger.o: OptInteger.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libOptions_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libOptions_a-OptInteger.o -MD -MP -MF $(DEPDIR)/libOptions_a-OptInteger.Tpo -c -o libOptions_a-OptInteger.o `test -f 'OptInteger.cpp' || echo '$(srcdir)/'`OptInteger.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libOptions_a-OptInteger.Tpo $(DEPDIR)/libOptions_a-OptInteger.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='OptInteger.cpp' object='libOptions_a-OptInteger.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libOptions_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libOptions_a-OptInteger.o `test -f 'OptInteger.cpp' || echo '$(srcdir)/'`OptInteger.cpp libOptions_a-OptInteger.obj: OptInteger.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libOptions_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libOptions_a-OptInteger.obj -MD -MP -MF $(DEPDIR)/libOptions_a-OptInteger.Tpo -c -o libOptions_a-OptInteger.obj `if test -f 'OptInteger.cpp'; then $(CYGPATH_W) 'OptInteger.cpp'; else $(CYGPATH_W) '$(srcdir)/OptInteger.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libOptions_a-OptInteger.Tpo $(DEPDIR)/libOptions_a-OptInteger.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='OptInteger.cpp' object='libOptions_a-OptInteger.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libOptions_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libOptions_a-OptInteger.obj `if test -f 'OptInteger.cpp'; then $(CYGPATH_W) 'OptInteger.cpp'; else $(CYGPATH_W) '$(srcdir)/OptInteger.cpp'; fi` libOptions_a-OptOptionRequest.o: OptOptionRequest.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libOptions_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libOptions_a-OptOptionRequest.o -MD -MP -MF $(DEPDIR)/libOptions_a-OptOptionRequest.Tpo -c -o libOptions_a-OptOptionRequest.o `test -f 'OptOptionRequest.cpp' || echo '$(srcdir)/'`OptOptionRequest.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libOptions_a-OptOptionRequest.Tpo $(DEPDIR)/libOptions_a-OptOptionRequest.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='OptOptionRequest.cpp' object='libOptions_a-OptOptionRequest.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libOptions_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libOptions_a-OptOptionRequest.o `test -f 'OptOptionRequest.cpp' || echo '$(srcdir)/'`OptOptionRequest.cpp libOptions_a-OptOptionRequest.obj: OptOptionRequest.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libOptions_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libOptions_a-OptOptionRequest.obj -MD -MP -MF $(DEPDIR)/libOptions_a-OptOptionRequest.Tpo -c -o libOptions_a-OptOptionRequest.obj `if test -f 'OptOptionRequest.cpp'; then $(CYGPATH_W) 'OptOptionRequest.cpp'; else $(CYGPATH_W) '$(srcdir)/OptOptionRequest.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libOptions_a-OptOptionRequest.Tpo $(DEPDIR)/libOptions_a-OptOptionRequest.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='OptOptionRequest.cpp' object='libOptions_a-OptOptionRequest.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libOptions_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libOptions_a-OptOptionRequest.obj `if test -f 'OptOptionRequest.cpp'; then $(CYGPATH_W) 'OptOptionRequest.cpp'; else $(CYGPATH_W) '$(srcdir)/OptOptionRequest.cpp'; fi` libOptions_a-OptStatusCode.o: OptStatusCode.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libOptions_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libOptions_a-OptStatusCode.o -MD -MP -MF $(DEPDIR)/libOptions_a-OptStatusCode.Tpo -c -o libOptions_a-OptStatusCode.o `test -f 'OptStatusCode.cpp' || echo '$(srcdir)/'`OptStatusCode.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libOptions_a-OptStatusCode.Tpo $(DEPDIR)/libOptions_a-OptStatusCode.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='OptStatusCode.cpp' object='libOptions_a-OptStatusCode.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libOptions_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libOptions_a-OptStatusCode.o `test -f 'OptStatusCode.cpp' || echo '$(srcdir)/'`OptStatusCode.cpp libOptions_a-OptStatusCode.obj: OptStatusCode.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libOptions_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libOptions_a-OptStatusCode.obj -MD -MP -MF $(DEPDIR)/libOptions_a-OptStatusCode.Tpo -c -o libOptions_a-OptStatusCode.obj `if test -f 'OptStatusCode.cpp'; then $(CYGPATH_W) 'OptStatusCode.cpp'; else $(CYGPATH_W) '$(srcdir)/OptStatusCode.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libOptions_a-OptStatusCode.Tpo $(DEPDIR)/libOptions_a-OptStatusCode.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='OptStatusCode.cpp' object='libOptions_a-OptStatusCode.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libOptions_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libOptions_a-OptStatusCode.obj `if test -f 'OptStatusCode.cpp'; then $(CYGPATH_W) 'OptStatusCode.cpp'; else $(CYGPATH_W) '$(srcdir)/OptStatusCode.cpp'; fi` libOptions_a-OptString.o: OptString.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libOptions_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libOptions_a-OptString.o -MD -MP -MF $(DEPDIR)/libOptions_a-OptString.Tpo -c -o libOptions_a-OptString.o `test -f 'OptString.cpp' || echo '$(srcdir)/'`OptString.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libOptions_a-OptString.Tpo $(DEPDIR)/libOptions_a-OptString.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='OptString.cpp' object='libOptions_a-OptString.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libOptions_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libOptions_a-OptString.o `test -f 'OptString.cpp' || echo '$(srcdir)/'`OptString.cpp libOptions_a-OptString.obj: OptString.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libOptions_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libOptions_a-OptString.obj -MD -MP -MF $(DEPDIR)/libOptions_a-OptString.Tpo -c -o libOptions_a-OptString.obj `if test -f 'OptString.cpp'; then $(CYGPATH_W) 'OptString.cpp'; else $(CYGPATH_W) '$(srcdir)/OptString.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libOptions_a-OptString.Tpo $(DEPDIR)/libOptions_a-OptString.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='OptString.cpp' object='libOptions_a-OptString.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libOptions_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libOptions_a-OptString.obj `if test -f 'OptString.cpp'; then $(CYGPATH_W) 'OptString.cpp'; else $(CYGPATH_W) '$(srcdir)/OptString.cpp'; fi` libOptions_a-OptDomainLst.o: OptDomainLst.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libOptions_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libOptions_a-OptDomainLst.o -MD -MP -MF $(DEPDIR)/libOptions_a-OptDomainLst.Tpo -c -o libOptions_a-OptDomainLst.o `test -f 'OptDomainLst.cpp' || echo '$(srcdir)/'`OptDomainLst.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libOptions_a-OptDomainLst.Tpo $(DEPDIR)/libOptions_a-OptDomainLst.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='OptDomainLst.cpp' object='libOptions_a-OptDomainLst.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libOptions_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libOptions_a-OptDomainLst.o `test -f 'OptDomainLst.cpp' || echo '$(srcdir)/'`OptDomainLst.cpp libOptions_a-OptDomainLst.obj: OptDomainLst.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libOptions_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libOptions_a-OptDomainLst.obj -MD -MP -MF $(DEPDIR)/libOptions_a-OptDomainLst.Tpo -c -o libOptions_a-OptDomainLst.obj `if test -f 'OptDomainLst.cpp'; then $(CYGPATH_W) 'OptDomainLst.cpp'; else $(CYGPATH_W) '$(srcdir)/OptDomainLst.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libOptions_a-OptDomainLst.Tpo $(DEPDIR)/libOptions_a-OptDomainLst.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='OptDomainLst.cpp' object='libOptions_a-OptDomainLst.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libOptions_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libOptions_a-OptDomainLst.obj `if test -f 'OptDomainLst.cpp'; then $(CYGPATH_W) 'OptDomainLst.cpp'; else $(CYGPATH_W) '$(srcdir)/OptDomainLst.cpp'; fi` libOptions_a-OptTA.o: OptTA.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libOptions_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libOptions_a-OptTA.o -MD -MP -MF $(DEPDIR)/libOptions_a-OptTA.Tpo -c -o libOptions_a-OptTA.o `test -f 'OptTA.cpp' || echo '$(srcdir)/'`OptTA.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libOptions_a-OptTA.Tpo $(DEPDIR)/libOptions_a-OptTA.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='OptTA.cpp' object='libOptions_a-OptTA.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libOptions_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libOptions_a-OptTA.o `test -f 'OptTA.cpp' || echo '$(srcdir)/'`OptTA.cpp libOptions_a-OptTA.obj: OptTA.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libOptions_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libOptions_a-OptTA.obj -MD -MP -MF $(DEPDIR)/libOptions_a-OptTA.Tpo -c -o libOptions_a-OptTA.obj `if test -f 'OptTA.cpp'; then $(CYGPATH_W) 'OptTA.cpp'; else $(CYGPATH_W) '$(srcdir)/OptTA.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libOptions_a-OptTA.Tpo $(DEPDIR)/libOptions_a-OptTA.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='OptTA.cpp' object='libOptions_a-OptTA.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libOptions_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libOptions_a-OptTA.obj `if test -f 'OptTA.cpp'; then $(CYGPATH_W) 'OptTA.cpp'; else $(CYGPATH_W) '$(srcdir)/OptTA.cpp'; fi` libOptions_a-OptUserClass.o: OptUserClass.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libOptions_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libOptions_a-OptUserClass.o -MD -MP -MF $(DEPDIR)/libOptions_a-OptUserClass.Tpo -c -o libOptions_a-OptUserClass.o `test -f 'OptUserClass.cpp' || echo '$(srcdir)/'`OptUserClass.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libOptions_a-OptUserClass.Tpo $(DEPDIR)/libOptions_a-OptUserClass.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='OptUserClass.cpp' object='libOptions_a-OptUserClass.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libOptions_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libOptions_a-OptUserClass.o `test -f 'OptUserClass.cpp' || echo '$(srcdir)/'`OptUserClass.cpp libOptions_a-OptUserClass.obj: OptUserClass.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libOptions_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libOptions_a-OptUserClass.obj -MD -MP -MF $(DEPDIR)/libOptions_a-OptUserClass.Tpo -c -o libOptions_a-OptUserClass.obj `if test -f 'OptUserClass.cpp'; then $(CYGPATH_W) 'OptUserClass.cpp'; else $(CYGPATH_W) '$(srcdir)/OptUserClass.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libOptions_a-OptUserClass.Tpo $(DEPDIR)/libOptions_a-OptUserClass.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='OptUserClass.cpp' object='libOptions_a-OptUserClass.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libOptions_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libOptions_a-OptUserClass.obj `if test -f 'OptUserClass.cpp'; then $(CYGPATH_W) 'OptUserClass.cpp'; else $(CYGPATH_W) '$(srcdir)/OptUserClass.cpp'; fi` libOptions_a-OptVendorClass.o: OptVendorClass.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libOptions_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libOptions_a-OptVendorClass.o -MD -MP -MF $(DEPDIR)/libOptions_a-OptVendorClass.Tpo -c -o libOptions_a-OptVendorClass.o `test -f 'OptVendorClass.cpp' || echo '$(srcdir)/'`OptVendorClass.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libOptions_a-OptVendorClass.Tpo $(DEPDIR)/libOptions_a-OptVendorClass.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='OptVendorClass.cpp' object='libOptions_a-OptVendorClass.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libOptions_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libOptions_a-OptVendorClass.o `test -f 'OptVendorClass.cpp' || echo '$(srcdir)/'`OptVendorClass.cpp libOptions_a-OptVendorClass.obj: OptVendorClass.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libOptions_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libOptions_a-OptVendorClass.obj -MD -MP -MF $(DEPDIR)/libOptions_a-OptVendorClass.Tpo -c -o libOptions_a-OptVendorClass.obj `if test -f 'OptVendorClass.cpp'; then $(CYGPATH_W) 'OptVendorClass.cpp'; else $(CYGPATH_W) '$(srcdir)/OptVendorClass.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libOptions_a-OptVendorClass.Tpo $(DEPDIR)/libOptions_a-OptVendorClass.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='OptVendorClass.cpp' object='libOptions_a-OptVendorClass.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libOptions_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libOptions_a-OptVendorClass.obj `if test -f 'OptVendorClass.cpp'; then $(CYGPATH_W) 'OptVendorClass.cpp'; else $(CYGPATH_W) '$(srcdir)/OptVendorClass.cpp'; fi` libOptions_a-OptVendorSpecInfo.o: OptVendorSpecInfo.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libOptions_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libOptions_a-OptVendorSpecInfo.o -MD -MP -MF $(DEPDIR)/libOptions_a-OptVendorSpecInfo.Tpo -c -o libOptions_a-OptVendorSpecInfo.o `test -f 'OptVendorSpecInfo.cpp' || echo '$(srcdir)/'`OptVendorSpecInfo.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libOptions_a-OptVendorSpecInfo.Tpo $(DEPDIR)/libOptions_a-OptVendorSpecInfo.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='OptVendorSpecInfo.cpp' object='libOptions_a-OptVendorSpecInfo.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libOptions_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libOptions_a-OptVendorSpecInfo.o `test -f 'OptVendorSpecInfo.cpp' || echo '$(srcdir)/'`OptVendorSpecInfo.cpp libOptions_a-OptVendorSpecInfo.obj: OptVendorSpecInfo.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libOptions_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libOptions_a-OptVendorSpecInfo.obj -MD -MP -MF $(DEPDIR)/libOptions_a-OptVendorSpecInfo.Tpo -c -o libOptions_a-OptVendorSpecInfo.obj `if test -f 'OptVendorSpecInfo.cpp'; then $(CYGPATH_W) 'OptVendorSpecInfo.cpp'; else $(CYGPATH_W) '$(srcdir)/OptVendorSpecInfo.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libOptions_a-OptVendorSpecInfo.Tpo $(DEPDIR)/libOptions_a-OptVendorSpecInfo.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='OptVendorSpecInfo.cpp' object='libOptions_a-OptVendorSpecInfo.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libOptions_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libOptions_a-OptVendorSpecInfo.obj `if test -f 'OptVendorSpecInfo.cpp'; then $(CYGPATH_W) 'OptVendorSpecInfo.cpp'; else $(CYGPATH_W) '$(srcdir)/OptVendorSpecInfo.cpp'; fi` libOptions_a-OptRtPrefix.o: OptRtPrefix.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libOptions_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libOptions_a-OptRtPrefix.o -MD -MP -MF $(DEPDIR)/libOptions_a-OptRtPrefix.Tpo -c -o libOptions_a-OptRtPrefix.o `test -f 'OptRtPrefix.cpp' || echo '$(srcdir)/'`OptRtPrefix.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libOptions_a-OptRtPrefix.Tpo $(DEPDIR)/libOptions_a-OptRtPrefix.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='OptRtPrefix.cpp' object='libOptions_a-OptRtPrefix.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libOptions_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libOptions_a-OptRtPrefix.o `test -f 'OptRtPrefix.cpp' || echo '$(srcdir)/'`OptRtPrefix.cpp libOptions_a-OptRtPrefix.obj: OptRtPrefix.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libOptions_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libOptions_a-OptRtPrefix.obj -MD -MP -MF $(DEPDIR)/libOptions_a-OptRtPrefix.Tpo -c -o libOptions_a-OptRtPrefix.obj `if test -f 'OptRtPrefix.cpp'; then $(CYGPATH_W) 'OptRtPrefix.cpp'; else $(CYGPATH_W) '$(srcdir)/OptRtPrefix.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libOptions_a-OptRtPrefix.Tpo $(DEPDIR)/libOptions_a-OptRtPrefix.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='OptRtPrefix.cpp' object='libOptions_a-OptRtPrefix.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libOptions_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libOptions_a-OptRtPrefix.obj `if test -f 'OptRtPrefix.cpp'; then $(CYGPATH_W) 'OptRtPrefix.cpp'; else $(CYGPATH_W) '$(srcdir)/OptRtPrefix.cpp'; fi` libOptions_a-OptReconfigureMsg.o: OptReconfigureMsg.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libOptions_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libOptions_a-OptReconfigureMsg.o -MD -MP -MF $(DEPDIR)/libOptions_a-OptReconfigureMsg.Tpo -c -o libOptions_a-OptReconfigureMsg.o `test -f 'OptReconfigureMsg.cpp' || echo '$(srcdir)/'`OptReconfigureMsg.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libOptions_a-OptReconfigureMsg.Tpo $(DEPDIR)/libOptions_a-OptReconfigureMsg.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='OptReconfigureMsg.cpp' object='libOptions_a-OptReconfigureMsg.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libOptions_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libOptions_a-OptReconfigureMsg.o `test -f 'OptReconfigureMsg.cpp' || echo '$(srcdir)/'`OptReconfigureMsg.cpp libOptions_a-OptReconfigureMsg.obj: OptReconfigureMsg.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libOptions_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libOptions_a-OptReconfigureMsg.obj -MD -MP -MF $(DEPDIR)/libOptions_a-OptReconfigureMsg.Tpo -c -o libOptions_a-OptReconfigureMsg.obj `if test -f 'OptReconfigureMsg.cpp'; then $(CYGPATH_W) 'OptReconfigureMsg.cpp'; else $(CYGPATH_W) '$(srcdir)/OptReconfigureMsg.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libOptions_a-OptReconfigureMsg.Tpo $(DEPDIR)/libOptions_a-OptReconfigureMsg.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='OptReconfigureMsg.cpp' object='libOptions_a-OptReconfigureMsg.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libOptions_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libOptions_a-OptReconfigureMsg.obj `if test -f 'OptReconfigureMsg.cpp'; then $(CYGPATH_W) 'OptReconfigureMsg.cpp'; else $(CYGPATH_W) '$(srcdir)/OptReconfigureMsg.cpp'; fi` libOptions_a-OptVendorData.o: OptVendorData.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libOptions_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libOptions_a-OptVendorData.o -MD -MP -MF $(DEPDIR)/libOptions_a-OptVendorData.Tpo -c -o libOptions_a-OptVendorData.o `test -f 'OptVendorData.cpp' || echo '$(srcdir)/'`OptVendorData.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libOptions_a-OptVendorData.Tpo $(DEPDIR)/libOptions_a-OptVendorData.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='OptVendorData.cpp' object='libOptions_a-OptVendorData.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libOptions_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libOptions_a-OptVendorData.o `test -f 'OptVendorData.cpp' || echo '$(srcdir)/'`OptVendorData.cpp libOptions_a-OptVendorData.obj: OptVendorData.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libOptions_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libOptions_a-OptVendorData.obj -MD -MP -MF $(DEPDIR)/libOptions_a-OptVendorData.Tpo -c -o libOptions_a-OptVendorData.obj `if test -f 'OptVendorData.cpp'; then $(CYGPATH_W) 'OptVendorData.cpp'; else $(CYGPATH_W) '$(srcdir)/OptVendorData.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libOptions_a-OptVendorData.Tpo $(DEPDIR)/libOptions_a-OptVendorData.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='OptVendorData.cpp' object='libOptions_a-OptVendorData.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libOptions_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libOptions_a-OptVendorData.obj `if test -f 'OptVendorData.cpp'; then $(CYGPATH_W) 'OptVendorData.cpp'; else $(CYGPATH_W) '$(srcdir)/OptVendorData.cpp'; fi` mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs # This directory's subdirectories are mostly independent; you can cd # into them and run 'make' without going through this Makefile. # To change the values of 'make' variables: instead of editing Makefiles, # (1) if the variable is set in 'config.status', edit 'config.status' # (which will cause the Makefiles to be regenerated when you run 'make'); # (2) otherwise, pass the desired values on the 'make' command line. $(am__recursive_targets): @fail=; \ if $(am__make_keepgoing); then \ failcom='fail=yes'; \ else \ failcom='exit 1'; \ fi; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-recursive TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ empty_fix=.; \ else \ include_option=--include; \ empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-recursive CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-recursive cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ $(am__make_dryrun) \ || test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ $(am__relativize); \ new_distdir=$$reldir; \ dir1=$$subdir; dir2="$(top_distdir)"; \ $(am__relativize); \ new_top_distdir=$$reldir; \ echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ ($(am__cd) $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$new_top_distdir" \ distdir="$$new_distdir" \ am__remove_distdir=: \ am__skip_length_check=: \ am__skip_mode_fix=: \ distdir) \ || exit 1; \ fi; \ done check-am: all-am check: check-recursive all-am: Makefile $(LIBRARIES) installdirs: installdirs-recursive installdirs-am: install: install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-recursive clean-am: clean-generic clean-libtool clean-noinstLIBRARIES \ mostlyclean-am distclean: distclean-recursive -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive html-am: info: info-recursive info-am: install-data-am: install-dvi: install-dvi-recursive install-dvi-am: install-exec-am: install-html: install-html-recursive install-html-am: install-info: install-info-recursive install-info-am: install-man: install-pdf: install-pdf-recursive install-pdf-am: install-ps: install-ps-recursive install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-recursive -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: .MAKE: $(am__recursive_targets) install-am install-strip .PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am check \ check-am clean clean-generic clean-libtool \ clean-noinstLIBRARIES cscopelist-am ctags ctags-am distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ installdirs-am maintainer-clean maintainer-clean-generic \ mostlyclean mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf pdf-am ps ps-am tags tags-am uninstall \ uninstall-am # 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: dibbler-1.0.1/Options/OptDomainLst.h0000664000175000017500000000152512233256142014223 00000000000000/* * Dibbler - a portable DHCPv6 * * authors: Tomasz Mrugalski * Marek Senderski * * released under GNU GPL v2 licence */ #ifndef OPTSTRINGLST_H #define OPTSTRINGLST_H #include "Opt.h" #include #include class TOptDomainLst : public TOpt { public: TOptDomainLst(int type, List(std::string) strLst, TMsg* parent); TOptDomainLst(int type, const std::string& domain, TMsg* parent); TOptDomainLst(int type, const char *buf, unsigned short bufsize, TMsg* parent); const List(std::string)& getDomainLst() { return StringLst; } const std::string& getDomain(); char * storeSelf( char* buf); size_t getSize(); int countString(); bool doDuties() { return true; } virtual std::string getPlain(); protected: List(std::string) StringLst; }; #endif dibbler-1.0.1/Options/OptAuthentication.cpp0000644000175000017500000002352012277722750015653 00000000000000/* * Dibbler - a portable DHCPv6 * * author: Michal Kowalczuk * changes: Tomek Mrugalski * * released under GNU GPL v2 licence */ #include #include #include "Portable.h" #include "OptAuthentication.h" #include "DHCPConst.h" #include "Portable.h" #include "Portable.h" #include "Logger.h" #include "Msg.h" #include "Portable.h" TOptAuthentication::TOptAuthentication(char* buf, size_t buflen, TMsg* parent) :TOpt(OPTION_AUTH, parent), authDataPtr_(NULL), AuthInfoLen_(0) { if (buflen < OPT_AUTH_FIXED_SIZE) { Valid = false; return; } uint8_t proto = buf[0]; switch (proto) { case AUTH_PROTO_NONE: case AUTH_PROTO_DELAYED: case AUTH_PROTO_RECONFIGURE_KEY: case AUTH_PROTO_DIBBLER: proto_ = static_cast(proto); break; default: { Log(Warning) << "Auth: unsupported protocol type " << proto << " received in auth option." << LogEnd; Valid = false; return; } } algo_ = buf[1]; uint8_t rdm = buf[2]; if (rdm <= AUTH_REPLAY_MONOTONIC) { rdm_ = static_cast(rdm); } else { Log(Warning) << "Auth: unsupported rdm value " << rdm << " received in auth option." << LogEnd; Valid = false; return; } replay_ = readUint64(buf); buf += OPT_AUTH_FIXED_SIZE; buflen -= OPT_AUTH_FIXED_SIZE; switch (proto_) { default: case AUTH_PROTO_NONE: data_ = std::vector(buf, buf + buflen); if (Parent) Parent->setAuthDigestPtr(buf, buflen); break; case AUTH_PROTO_DELAYED: { // We can have 2 cases here: // 1. this is SOLICIT and client sends no data, buflen should be zero // 2. this is something else, so the data format should follow section 21.4.1 // i.e. have 4bytes key ID, 128bis of HMAC-MD5 and the rest is 'realm' if (buflen == 0) { // SOLICIT option, without any data. break; } if (buflen < DELAYED_AUTH_DIGEST_SIZE + DELAYED_AUTH_KEY_ID_SIZE) { Log(Warning) << "AUTH: protocol set to delayed-auth, but variable option data" << " is smaller (" << buflen << ") than required 20. Invalid auth." << LogEnd; Valid = false; return; } // The gentleman who designed delayed auth protocol was not exactly sober // during the act of creation. data_ = std::vector(buf, buf + buflen); // let's store that crap in data_ // First undetermined number of bytes is DHCP realm // (fine idea to start with variable field. Why not?) int realm_size = buflen - DELAYED_AUTH_DIGEST_SIZE - DELAYED_AUTH_KEY_ID_SIZE; realm_ = std::string(buf, buf + realm_size); buf += realm_size; buflen -= realm_size; // The next 4 bytes (RFC3315 never says that it's exactly 4 bytes. Nah, every // implementor will just guess the same size) if (Parent) Parent->setSPI(readUint32(buf)); buf += sizeof(uint32_t); buflen -= sizeof(uint32_t); // The rest should be 16 bytes of of HMAC-MD5 data if (Parent) Parent->setAuthDigestPtr(buf, buflen); // that should be the last 16 bytes. break; } case AUTH_PROTO_RECONFIGURE_KEY: { data_ = std::vector(buf, buf + buflen); if (Parent) Parent->setAuthDigestPtr(buf + 1, buflen); if (data_.size() != RECONFIGURE_KEY_AUTHINFO_SIZE) { Log(Warning) << "AUTH: Invalid reconfigure-key data received. Expected size is " << RECONFIGURE_KEY_AUTHINFO_SIZE << ", but received " << data_.size() << LogEnd; Valid = false; return; } break; } case AUTH_PROTO_DIBBLER: { if (algo_ >= DIGEST_INVALID) { Log(Warning) << "Unsupported digest type: " << algo_ << ", max supported " << " type is " << DIGEST_INVALID - 1 << LogEnd; Valid = false; return; } if (!Parent) { Log(Error) << "Orphaned option AUTH: no parent set." << LogEnd; Valid = false; return; } Parent->DigestType_ = static_cast(algo_); Parent->setSPI(readUint32(buf)); buf += sizeof(uint32_t); buflen -= sizeof(uint32_t); data_ = std::vector(buf, buf + buflen); AuthInfoLen_ = getDigestSize(parent->DigestType_); if (buflen != AuthInfoLen_){ Log(Warning) << "Auth: Invalid digest size for digest type " << algo_ << ", expected len=" << AuthInfoLen_ << ", received " << buflen << LogEnd; Valid = false; return; } Parent->setAuthDigestPtr(buf, AuthInfoLen_); PrintHex(std::string("Auth: Received digest ") + getDigestName(parent->DigestType_) + ": ", (uint8_t*)buf, AuthInfoLen_); } } Valid = true; } uint8_t TOptAuthentication::getAlgorithm() const { return algo_; } AuthReplay TOptAuthentication::getRDM() const { return rdm_; } TOptAuthentication::TOptAuthentication(AuthProtocols proto, uint8_t algo, AuthReplay rdm, TMsg* parent) :TOpt(OPTION_AUTH, parent), proto_(proto), algo_(algo), rdm_(rdm), replay_(0), authDataPtr_(NULL) { switch (proto) { default: AuthInfoLen_ = 0; return; case AUTH_PROTO_DELAYED: if (algo != 1) { Log(Warning) << "AUTH: The only defined protocol for delayed-auth is 1, but " << static_cast(algo) << " was specified." << LogEnd; } AuthInfoLen_ = 0; // Keep it as zero (we don't know yet if it's a SOLICIT // (no data at all) or any other (realm + key id + HMAC-MD5) return; case AUTH_PROTO_DIBBLER: { if (parent) { AuthInfoLen_ = getDigestSize(parent->DigestType_); } else { AuthInfoLen_ = 0; } return; } case AUTH_PROTO_RECONFIGURE_KEY: AuthInfoLen_ = RECONFIGURE_DIGEST_SIZE; // Sec section 21.5.1, RFC3315 return; } } void TOptAuthentication::setRDM(AuthReplay value) { rdm_ = value; } size_t TOptAuthentication::getSize() { size_t tmp = TOpt::OPTION6_HDR_LEN + OPT_AUTH_FIXED_SIZE + AuthInfoLen_; switch (proto_) { default: return tmp; case AUTH_PROTO_DELAYED: if (realm_.empty()) { return tmp; } else { return tmp + realm_.size() + DELAYED_AUTH_KEY_ID_SIZE; } case AUTH_PROTO_RECONFIGURE_KEY: return tmp + 1; case AUTH_PROTO_DIBBLER: return tmp + sizeof(uint32_t); // +4 bytes for SPI } } bool TOpt::doDuties() { return true; } char* TOptAuthentication::storeSelf(char* buf) { // common part (the same for all auth protocols) buf = writeUint16(buf, OptType); buf = writeUint16(buf, getSize() - 4); buf = writeUint8(buf, static_cast(proto_)); buf = writeUint8(buf, algo_); buf = writeUint8(buf, static_cast(rdm_)); buf = writeUint64(buf, getReplayDetection()); switch (proto_) { case AUTH_PROTO_RECONFIGURE_KEY: { if (!data_.size()) { return buf; } switch (data_[0]) { default: case 1: // reconfigure-key value authDataPtr_ = buf; buf = writeData(buf, (char*)&data_[0], data_.size()); return buf; case 2: // HMAC-MD5 digest authDataPtr_ = buf + 1; // The first byte is 1 or 2 (see RFC3315, 21.5.1) buf[0] = data_[0]; // 2 = HMAC-MD5 digest memset(buf + 1, 0, RECONFIGURE_DIGEST_SIZE); // 16 bytes return buf + RECONFIGURE_KEY_AUTHINFO_SIZE; } } default: case AUTH_PROTO_NONE: { authDataPtr_ = buf; buf = writeData(buf, (char*)&data_[0], data_.size()); return buf; } case AUTH_PROTO_DELAYED: { if (realm_.empty()) { // SOLICIT without any data return buf; } else { // Realm set, build the option for real memcpy(buf, &realm_[0], realm_.size()); // realm (variable) buf += realm_.size(); if (Parent) buf = writeUint32(buf, Parent->getSPI()); // key id (4 bytes) else buf = writeUint32(buf, 0); authDataPtr_ = buf; // Digest will be stored here memset(buf, 0, AuthInfoLen_); // HMAC-MD5 (16 bytes) buf += AuthInfoLen_; return buf; } } case AUTH_PROTO_DIBBLER: { if (!Parent) { return writeUint32(buf, 0); // no SPI at all } AuthInfoLen_ = getDigestSize(Parent->DigestType_); // write SPI first buf = writeUint32(buf, Parent->getSPI()); // Reserve space for the digest Parent->setAuthDigestPtr(buf, AuthInfoLen_); memset(buf, 0, AuthInfoLen_); buf += AuthInfoLen_; } } return buf; } AuthProtocols TOptAuthentication::getProto() const { return proto_; } void TOptAuthentication::setReplayDetection(uint64_t value) { replay_ = value; } uint64_t TOptAuthentication::getReplayDetection() { return replay_; } void TOptAuthentication::setPayload(const std::vector& data) { data_ = data; } void TOptAuthentication::getPayload(std::vector& data) { data = data_; } bool TOptAuthentication::doDuties() { return true; } void TOptAuthentication::setRealm(const std::string& realm) { realm_ = realm; if (realm_.empty()) { AuthInfoLen_ = 0; } else { AuthInfoLen_ = DELAYED_AUTH_DIGEST_SIZE; } } dibbler-1.0.1/Options/OptStatusCode.cpp0000664000175000017500000000453112233256142014742 00000000000000/* * Dibbler - a portable DHCPv6 * * authors: Tomasz Mrugalski * Marek Senderski * * released under GNU GPL v2 licence * */ #include #include #include "Portable.h" #include "OptStatusCode.h" #include "Logger.h" #if defined(LINUX) || defined(BSD) #include #endif using namespace std; TOptStatusCode::TOptStatusCode(const char * buf, size_t len, TMsg* parent) :TOpt(OPTION_STATUS_CODE, parent), Valid_(false) { if (len < 2) { buf += len; len = 0; return; } StatusCode_ = readUint16(buf); buf += sizeof(uint16_t); len -= sizeof(uint16_t); char *msg = new char[len+1]; memcpy(msg, buf, len); msg[len]=0; Message_ = (string)msg; delete [] msg; Valid_ = true; } size_t TOptStatusCode::getSize() { return Message_.length() + 6; } int TOptStatusCode::getCode() { return StatusCode_; } string TOptStatusCode::getText() { return Message_; } char * TOptStatusCode::storeSelf( char* buf) { buf = writeUint16(buf, OptType); buf = writeUint16(buf, getSize()-4); buf = writeUint16(buf, StatusCode_); strncpy((char *)buf, Message_.c_str(), Message_.length()); buf += Message_.length(); return buf; } TOptStatusCode::TOptStatusCode(int status,const std::string& message, TMsg* parent) :TOpt(OPTION_STATUS_CODE, parent), Message_(message), StatusCode_(status), Valid_(true) { } bool TOptStatusCode::doDuties() { switch (StatusCode_) { case STATUSCODE_SUCCESS: Log(Notice) << "Status SUCCESS :" << Message_ << LogEnd; break; case STATUSCODE_UNSPECFAIL: Log(Notice) << "Status UNSPECIFIED FAILURE :" << Message_ << LogEnd; break; case STATUSCODE_NOADDRSAVAIL: Log(Notice) << "Status NO ADDRS AVAILABLE :" << Message_ << LogEnd; break; case STATUSCODE_NOBINDING: Log(Notice) << "Status NO BINDING:" << Message_ << LogEnd; break; case STATUSCODE_NOTONLINK: Log(Notice) << "Status NOT ON LINK:" << Message_ << LogEnd; break; case STATUSCODE_USEMULTICAST: Log(Notice) << "Status USE MULTICAST:" << Message_ << LogEnd; break; case STATUSCODE_NOPREFIXAVAIL: Log(Notice) << "Status NO PREFIX AVAILABLE :" << Message_ << LogEnd; break; } return true; } dibbler-1.0.1/Options/OptIA_PD.h0000644000175000017500000000140412277722750013212 00000000000000/* * Dibbler - a portable DHCPv6 * * author: Krzysztof Wnuk * */ class TOptIA_PD; #ifndef OPTIA_PD_H #define OPTIA_PD_H #include #include "Opt.h" class TOptIA_PD : public TOpt { public: TOptIA_PD(uint32_t iaid, uint32_t t1, uint32_t t2, TMsg* parent); TOptIA_PD(char * &buf, int &bufsize, TMsg* parent); size_t getSize(); int getStatusCode(); uint32_t getIAID() const; uint32_t getT1() const; uint32_t getT2() const; int countPrefixes(); void setT1(uint32_t t1); void setT2(uint32_t t2); void setIAID(uint32_t iaid); char * storeSelf( char* buf); bool isValid() const; protected: uint32_t IAID_; uint32_t T1_; uint32_t T2_; bool Valid_; }; #endif /* */ dibbler-1.0.1/configure0000775000175000017500000227570012561652533011773 00000000000000#! /bin/sh # Guess values for system-dependent variables and create Makefiles. # Generated by GNU Autoconf 2.69 for dibbler 1.0.1. # # Report bugs to . # # # Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc. # # # This configure script is free software; the Free Software Foundation # gives unlimited permission to copy, distribute and modify it. ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in #( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH # Use a proper internal environment variable to ensure we don't fall # into an infinite loop, continuously re-executing ourselves. if test x"${_as_can_reexec}" != xno && test "x$CONFIG_SHELL" != x; then _as_can_reexec=no; export _as_can_reexec; # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV case $- in # (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail # out after a failed `exec'. $as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 as_fn_exit 255 fi # We don't want this to propagate to other subprocesses. { _as_can_reexec=; unset _as_can_reexec;} if test "x$CONFIG_SHELL" = x; then as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which # is contrary to our usage. Disable this feature. alias -g '\${1+\"\$@\"}'='\"\$@\"' setopt NO_GLOB_SUBST else case \`(set -o) 2>/dev/null\` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi " as_required="as_fn_return () { (exit \$1); } as_fn_success () { as_fn_return 0; } as_fn_failure () { as_fn_return 1; } as_fn_ret_success () { return 0; } as_fn_ret_failure () { return 1; } exitcode=0 as_fn_success || { exitcode=1; echo as_fn_success failed.; } as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; } as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; } as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; } if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then : else exitcode=1; echo positional parameters were not saved. fi test x\$exitcode = x0 || exit 1 test -x / || exit 1" as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" && test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1 test -n \"\${ZSH_VERSION+set}\${BASH_VERSION+set}\" || ( ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' ECHO=\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO ECHO=\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO PATH=/empty FPATH=/empty; export PATH FPATH test \"X\`printf %s \$ECHO\`\" = \"X\$ECHO\" \\ || test \"X\`print -r -- \$ECHO\`\" = \"X\$ECHO\" ) || exit 1 test \$(( 1 + 1 )) = 2 || exit 1" if (eval "$as_required") 2>/dev/null; then : as_have_required=yes else as_have_required=no fi if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then : else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR as_found=false for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. as_found=: case $as_dir in #( /*) for as_base in sh bash ksh sh5; do # Try only shells that exist, to save several forks. as_shell=$as_dir/$as_base if { test -f "$as_shell" || test -f "$as_shell.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then : CONFIG_SHELL=$as_shell as_have_required=yes if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then : break 2 fi fi done;; esac as_found=false done $as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then : CONFIG_SHELL=$SHELL as_have_required=yes fi; } IFS=$as_save_IFS if test "x$CONFIG_SHELL" != x; then : export CONFIG_SHELL # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV case $- in # (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail # out after a failed `exec'. $as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 exit 255 fi if test x$as_have_required = xno; then : $as_echo "$0: This script requires a shell more modern than all" $as_echo "$0: the shells that I found on your system." if test x${ZSH_VERSION+set} = xset ; then $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should" $as_echo "$0: be upgraded to zsh 4.3.4 or later." else $as_echo "$0: Please tell bug-autoconf@gnu.org and $0: dibbler@klub.com.pl about your system, including any $0: error possibly output before this message. Then install $0: a modern shell, or manually run the script under such a $0: shell if you do have one." fi exit 1 fi fi fi SHELL=${CONFIG_SHELL-/bin/sh} export SHELL # Unset more variables known to interfere with behavior of common tools. CLICOLOR_FORCE= GREP_OPTIONS= unset CLICOLOR_FORCE GREP_OPTIONS ## --------------------- ## ## M4sh Shell Functions. ## ## --------------------- ## # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p # as_fn_executable_p FILE # ----------------------- # Test if FILE is an executable regular file. as_fn_executable_p () { test -f "$1" && test -x "$1" } # as_fn_executable_p # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi $as_echo "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits as_lineno_1=$LINENO as_lineno_1a=$LINENO as_lineno_2=$LINENO as_lineno_2a=$LINENO eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" && test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || { # Blame Lee E. McMahon (1931-1989) for sed's syntax. :-) sed -n ' p /[$]LINENO/= ' <$as_myself | sed ' s/[$]LINENO.*/&-/ t lineno b :lineno N :loop s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ t loop s/-\n.*// ' >$as_me.lineno && chmod +x "$as_me.lineno" || { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; } # If we had to re-execute with $CONFIG_SHELL, we're ensured to have # already done that, so ensure we don't try to do so again and fall # in an infinite loop. This has already happened in practice. _as_can_reexec=no; export _as_can_reexec # Don't try to exec as it changes $[0], causing all sort of problems # (the dirname of $[0] is not the place where we might find the # original and so on. Autoconf is especially sensitive to this). . "./$as_me.lineno" # Exit status is that of the last command. exit } ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -pR' fi else as_ln_s='cp -pR' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi as_test_x='test -x' as_executable_p=as_fn_executable_p # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" SHELL=${CONFIG_SHELL-/bin/sh} test -n "$DJDIR" || exec 7<&0 &1 # Name of the host. # hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status, # so uname gets run too. ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` # # Initializations. # ac_default_prefix=/usr/local ac_clean_files= ac_config_libobj_dir=. LIBOBJS= cross_compiling=no subdirs= MFLAGS= MAKEFLAGS= # Identity of this package. PACKAGE_NAME='dibbler' PACKAGE_TARNAME='dibbler' PACKAGE_VERSION='1.0.1' PACKAGE_STRING='dibbler 1.0.1' PACKAGE_BUGREPORT='dibbler@klub.com.pl' PACKAGE_URL='' ac_unique_file="IfaceMgr/SocketIPv6.cpp" # Factoring default headers for most tests. ac_includes_default="\ #include #ifdef HAVE_SYS_TYPES_H # include #endif #ifdef HAVE_SYS_STAT_H # include #endif #ifdef STDC_HEADERS # include # include #else # ifdef HAVE_STDLIB_H # include # endif #endif #ifdef HAVE_STRING_H # if !defined STDC_HEADERS && defined HAVE_MEMORY_H # include # endif # include #endif #ifdef HAVE_STRINGS_H # include #endif #ifdef HAVE_INTTYPES_H # include #endif #ifdef HAVE_STDINT_H # include #endif #ifdef HAVE_UNISTD_H # include #endif" enable_option_checking=no ac_subst_vars='am__EXEEXT_FALSE am__EXEEXT_TRUE LTLIBOBJS LIBOBJS HAVE_GTEST_FALSE HAVE_GTEST_TRUE subdirs LINKPRINT PORT_CFLAGS PORT_LDFLAGS EXTRA_DIST_SUBDIRS PORT_SUBDIR ARCH GTEST_LDADD GTEST_LDFLAGS GTEST_INCLUDES RESOLVCONF_FALSE RESOLVCONF_TRUE MOD_SRV_DST_ADDR_CHECK_FALSE MOD_SRV_DST_ADDR_CHECK_TRUE ALLOCA CXXCPP CPP OTOOL64 OTOOL LIPO NMEDIT DSYMUTIL MANIFEST_TOOL RANLIB ac_ct_AR AR DLLTOOL OBJDUMP LN_S NM ac_ct_DUMPBIN DUMPBIN LD FGREP EGREP GREP SED host_os host_vendor host_cpu host build_os build_vendor build_cpu build LIBTOOL am__fastdepCC_FALSE am__fastdepCC_TRUE CCDEPMODE ac_ct_CC CFLAGS CC am__fastdepCXX_FALSE am__fastdepCXX_TRUE CXXDEPMODE am__nodep AMDEPBACKSLASH AMDEP_FALSE AMDEP_TRUE am__quote am__include DEPDIR OBJEXT EXEEXT ac_ct_CXX CPPFLAGS LDFLAGS CXXFLAGS CXX MAINT MAINTAINER_MODE_FALSE MAINTAINER_MODE_TRUE AM_BACKSLASH AM_DEFAULT_VERBOSITY AM_DEFAULT_V AM_V am__untar am__tar AMTAR am__leading_dot SET_MAKE AWK mkdir_p MKDIR_P INSTALL_STRIP_PROGRAM STRIP install_sh MAKEINFO AUTOHEADER AUTOMAKE AUTOCONF ACLOCAL VERSION PACKAGE CYGPATH_W am__isrc INSTALL_DATA INSTALL_SCRIPT INSTALL_PROGRAM target_alias host_alias build_alias LIBS ECHO_T ECHO_N ECHO_C DEFS mandir localedir libdir psdir pdfdir dvidir htmldir infodir docdir oldincludedir includedir localstatedir sharedstatedir sysconfdir datadir datarootdir libexecdir sbindir bindir program_transform_name prefix exec_prefix PACKAGE_URL PACKAGE_BUGREPORT PACKAGE_STRING PACKAGE_VERSION PACKAGE_TARNAME PACKAGE_NAME PATH_SEPARATOR SHELL' ac_subst_files='' ac_user_opts=' enable_option_checking enable_silent_rules enable_maintainer_mode enable_dependency_tracking enable_shared enable_static with_pic enable_fast_install with_gnu_ld with_sysroot enable_libtool_lock enable_ enable_debug enable_efence enable_bind_reuse enable_dst_addr_filter enable_resolvconf enable_dns_update enable_auth with_gtest enable_gtest_static enable_link_state enable_remote_autoconf ' ac_precious_vars='build_alias host_alias target_alias CXX CXXFLAGS LDFLAGS LIBS CPPFLAGS CCC CC CFLAGS CPP CXXCPP' ac_subdirs_all='bison++' # Initialize some variables set by options. ac_init_help= ac_init_version=false ac_unrecognized_opts= ac_unrecognized_sep= # The variables have the same names as the options, with # dashes changed to underlines. cache_file=/dev/null exec_prefix=NONE no_create= no_recursion= prefix=NONE program_prefix=NONE program_suffix=NONE program_transform_name=s,x,x, silent= site= srcdir= verbose= x_includes=NONE x_libraries=NONE # Installation directory options. # These are left unexpanded so users can "make install exec_prefix=/foo" # and all the variables that are supposed to be based on exec_prefix # by default will actually change. # Use braces instead of parens because sh, perl, etc. also accept them. # (The list follows the same order as the GNU Coding Standards.) bindir='${exec_prefix}/bin' sbindir='${exec_prefix}/sbin' libexecdir='${exec_prefix}/libexec' datarootdir='${prefix}/share' datadir='${datarootdir}' sysconfdir='${prefix}/etc' sharedstatedir='${prefix}/com' localstatedir='${prefix}/var' includedir='${prefix}/include' oldincludedir='/usr/include' docdir='${datarootdir}/doc/${PACKAGE_TARNAME}' infodir='${datarootdir}/info' htmldir='${docdir}' dvidir='${docdir}' pdfdir='${docdir}' psdir='${docdir}' libdir='${exec_prefix}/lib' localedir='${datarootdir}/locale' mandir='${datarootdir}/man' ac_prev= ac_dashdash= for ac_option do # If the previous option needs an argument, assign it. if test -n "$ac_prev"; then eval $ac_prev=\$ac_option ac_prev= continue fi case $ac_option in *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; *=) ac_optarg= ;; *) ac_optarg=yes ;; esac # Accept the important Cygnus configure options, so we can diagnose typos. case $ac_dashdash$ac_option in --) ac_dashdash=yes ;; -bindir | --bindir | --bindi | --bind | --bin | --bi) ac_prev=bindir ;; -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) bindir=$ac_optarg ;; -build | --build | --buil | --bui | --bu) ac_prev=build_alias ;; -build=* | --build=* | --buil=* | --bui=* | --bu=*) build_alias=$ac_optarg ;; -cache-file | --cache-file | --cache-fil | --cache-fi \ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) ac_prev=cache_file ;; -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) cache_file=$ac_optarg ;; --config-cache | -C) cache_file=config.cache ;; -datadir | --datadir | --datadi | --datad) ac_prev=datadir ;; -datadir=* | --datadir=* | --datadi=* | --datad=*) datadir=$ac_optarg ;; -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \ | --dataroo | --dataro | --datar) ac_prev=datarootdir ;; -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \ | --dataroot=* | --dataroo=* | --dataro=* | --datar=*) datarootdir=$ac_optarg ;; -disable-* | --disable-*) ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=no ;; -docdir | --docdir | --docdi | --doc | --do) ac_prev=docdir ;; -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*) docdir=$ac_optarg ;; -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv) ac_prev=dvidir ;; -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*) dvidir=$ac_optarg ;; -enable-* | --enable-*) ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=\$ac_optarg ;; -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ | --exec | --exe | --ex) ac_prev=exec_prefix ;; -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ | --exec=* | --exe=* | --ex=*) exec_prefix=$ac_optarg ;; -gas | --gas | --ga | --g) # Obsolete; use --with-gas. with_gas=yes ;; -help | --help | --hel | --he | -h) ac_init_help=long ;; -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) ac_init_help=recursive ;; -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) ac_init_help=short ;; -host | --host | --hos | --ho) ac_prev=host_alias ;; -host=* | --host=* | --hos=* | --ho=*) host_alias=$ac_optarg ;; -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht) ac_prev=htmldir ;; -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \ | --ht=*) htmldir=$ac_optarg ;; -includedir | --includedir | --includedi | --included | --include \ | --includ | --inclu | --incl | --inc) ac_prev=includedir ;; -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ | --includ=* | --inclu=* | --incl=* | --inc=*) includedir=$ac_optarg ;; -infodir | --infodir | --infodi | --infod | --info | --inf) ac_prev=infodir ;; -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) infodir=$ac_optarg ;; -libdir | --libdir | --libdi | --libd) ac_prev=libdir ;; -libdir=* | --libdir=* | --libdi=* | --libd=*) libdir=$ac_optarg ;; -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ | --libexe | --libex | --libe) ac_prev=libexecdir ;; -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ | --libexe=* | --libex=* | --libe=*) libexecdir=$ac_optarg ;; -localedir | --localedir | --localedi | --localed | --locale) ac_prev=localedir ;; -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*) localedir=$ac_optarg ;; -localstatedir | --localstatedir | --localstatedi | --localstated \ | --localstate | --localstat | --localsta | --localst | --locals) ac_prev=localstatedir ;; -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*) localstatedir=$ac_optarg ;; -mandir | --mandir | --mandi | --mand | --man | --ma | --m) ac_prev=mandir ;; -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) mandir=$ac_optarg ;; -nfp | --nfp | --nf) # Obsolete; use --without-fp. with_fp=no ;; -no-create | --no-create | --no-creat | --no-crea | --no-cre \ | --no-cr | --no-c | -n) no_create=yes ;; -no-recursion | --no-recursion | --no-recursio | --no-recursi \ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) no_recursion=yes ;; -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ | --oldin | --oldi | --old | --ol | --o) ac_prev=oldincludedir ;; -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) oldincludedir=$ac_optarg ;; -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) ac_prev=prefix ;; -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) prefix=$ac_optarg ;; -program-prefix | --program-prefix | --program-prefi | --program-pref \ | --program-pre | --program-pr | --program-p) ac_prev=program_prefix ;; -program-prefix=* | --program-prefix=* | --program-prefi=* \ | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) program_prefix=$ac_optarg ;; -program-suffix | --program-suffix | --program-suffi | --program-suff \ | --program-suf | --program-su | --program-s) ac_prev=program_suffix ;; -program-suffix=* | --program-suffix=* | --program-suffi=* \ | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) program_suffix=$ac_optarg ;; -program-transform-name | --program-transform-name \ | --program-transform-nam | --program-transform-na \ | --program-transform-n | --program-transform- \ | --program-transform | --program-transfor \ | --program-transfo | --program-transf \ | --program-trans | --program-tran \ | --progr-tra | --program-tr | --program-t) ac_prev=program_transform_name ;; -program-transform-name=* | --program-transform-name=* \ | --program-transform-nam=* | --program-transform-na=* \ | --program-transform-n=* | --program-transform-=* \ | --program-transform=* | --program-transfor=* \ | --program-transfo=* | --program-transf=* \ | --program-trans=* | --program-tran=* \ | --progr-tra=* | --program-tr=* | --program-t=*) program_transform_name=$ac_optarg ;; -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd) ac_prev=pdfdir ;; -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*) pdfdir=$ac_optarg ;; -psdir | --psdir | --psdi | --psd | --ps) ac_prev=psdir ;; -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*) psdir=$ac_optarg ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) silent=yes ;; -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) ac_prev=sbindir ;; -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ | --sbi=* | --sb=*) sbindir=$ac_optarg ;; -sharedstatedir | --sharedstatedir | --sharedstatedi \ | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ | --sharedst | --shareds | --shared | --share | --shar \ | --sha | --sh) ac_prev=sharedstatedir ;; -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ | --sha=* | --sh=*) sharedstatedir=$ac_optarg ;; -site | --site | --sit) ac_prev=site ;; -site=* | --site=* | --sit=*) site=$ac_optarg ;; -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) ac_prev=srcdir ;; -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) srcdir=$ac_optarg ;; -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ | --syscon | --sysco | --sysc | --sys | --sy) ac_prev=sysconfdir ;; -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) sysconfdir=$ac_optarg ;; -target | --target | --targe | --targ | --tar | --ta | --t) ac_prev=target_alias ;; -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) target_alias=$ac_optarg ;; -v | -verbose | --verbose | --verbos | --verbo | --verb) verbose=yes ;; -version | --version | --versio | --versi | --vers | -V) ac_init_version=: ;; -with-* | --with-*) ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=\$ac_optarg ;; -without-* | --without-*) ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=no ;; --x) # Obsolete; use --with-x. with_x=yes ;; -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ | --x-incl | --x-inc | --x-in | --x-i) ac_prev=x_includes ;; -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) x_includes=$ac_optarg ;; -x-libraries | --x-libraries | --x-librarie | --x-librari \ | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) ac_prev=x_libraries ;; -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) x_libraries=$ac_optarg ;; -*) as_fn_error $? "unrecognized option: \`$ac_option' Try \`$0 --help' for more information" ;; *=*) ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` # Reject names that are not valid shell variable names. case $ac_envvar in #( '' | [0-9]* | *[!_$as_cr_alnum]* ) as_fn_error $? "invalid variable name: \`$ac_envvar'" ;; esac eval $ac_envvar=\$ac_optarg export $ac_envvar ;; *) # FIXME: should be removed in autoconf 3.0. $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2 expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2 : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}" ;; esac done if test -n "$ac_prev"; then ac_option=--`echo $ac_prev | sed 's/_/-/g'` as_fn_error $? "missing argument to $ac_option" fi if test -n "$ac_unrecognized_opts"; then case $enable_option_checking in no) ;; fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;; *) $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;; esac fi # Check all directory arguments for consistency. for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ datadir sysconfdir sharedstatedir localstatedir includedir \ oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ libdir localedir mandir do eval ac_val=\$$ac_var # Remove trailing slashes. case $ac_val in */ ) ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'` eval $ac_var=\$ac_val;; esac # Be sure to have absolute directory names. case $ac_val in [\\/$]* | ?:[\\/]* ) continue;; NONE | '' ) case $ac_var in *prefix ) continue;; esac;; esac as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val" done # There might be people who depend on the old broken behavior: `$host' # used to hold the argument of --host etc. # FIXME: To remove some day. build=$build_alias host=$host_alias target=$target_alias # FIXME: To remove some day. if test "x$host_alias" != x; then if test "x$build_alias" = x; then cross_compiling=maybe elif test "x$build_alias" != "x$host_alias"; then cross_compiling=yes fi fi ac_tool_prefix= test -n "$host_alias" && ac_tool_prefix=$host_alias- test "$silent" = yes && exec 6>/dev/null ac_pwd=`pwd` && test -n "$ac_pwd" && ac_ls_di=`ls -di .` && ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || as_fn_error $? "working directory cannot be determined" test "X$ac_ls_di" = "X$ac_pwd_ls_di" || as_fn_error $? "pwd does not report name of working directory" # Find the source files, if location was not specified. if test -z "$srcdir"; then ac_srcdir_defaulted=yes # Try the directory containing this script, then the parent directory. ac_confdir=`$as_dirname -- "$as_myself" || $as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_myself" : 'X\(//\)[^/]' \| \ X"$as_myself" : 'X\(//\)$' \| \ X"$as_myself" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_myself" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` srcdir=$ac_confdir if test ! -r "$srcdir/$ac_unique_file"; then srcdir=.. fi else ac_srcdir_defaulted=no fi if test ! -r "$srcdir/$ac_unique_file"; then test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir" fi ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" ac_abs_confdir=`( cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg" pwd)` # When building in place, set srcdir=. if test "$ac_abs_confdir" = "$ac_pwd"; then srcdir=. fi # Remove unnecessary trailing slashes from srcdir. # Double slashes in file names in object file debugging info # mess up M-x gdb in Emacs. case $srcdir in */) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;; esac for ac_var in $ac_precious_vars; do eval ac_env_${ac_var}_set=\${${ac_var}+set} eval ac_env_${ac_var}_value=\$${ac_var} eval ac_cv_env_${ac_var}_set=\${${ac_var}+set} eval ac_cv_env_${ac_var}_value=\$${ac_var} done # # Report the --help message. # if test "$ac_init_help" = "long"; then # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF \`configure' configures dibbler 1.0.1 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... To assign environment variables (e.g., CC, CFLAGS...), specify them as VAR=VALUE. See below for descriptions of some of the useful variables. Defaults for the options are specified in brackets. Configuration: -h, --help display this help and exit --help=short display options specific to this package --help=recursive display the short help of all the included packages -V, --version display version information and exit -q, --quiet, --silent do not print \`checking ...' messages --cache-file=FILE cache test results in FILE [disabled] -C, --config-cache alias for \`--cache-file=config.cache' -n, --no-create do not create output files --srcdir=DIR find the sources in DIR [configure dir or \`..'] Installation directories: --prefix=PREFIX install architecture-independent files in PREFIX [$ac_default_prefix] --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX [PREFIX] By default, \`make install' will install all the files in \`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify an installation prefix other than \`$ac_default_prefix' using \`--prefix', for instance \`--prefix=\$HOME'. For better control, use the options below. Fine tuning of the installation directories: --bindir=DIR user executables [EPREFIX/bin] --sbindir=DIR system admin executables [EPREFIX/sbin] --libexecdir=DIR program executables [EPREFIX/libexec] --sysconfdir=DIR read-only single-machine data [PREFIX/etc] --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] --localstatedir=DIR modifiable single-machine data [PREFIX/var] --libdir=DIR object code libraries [EPREFIX/lib] --includedir=DIR C header files [PREFIX/include] --oldincludedir=DIR C header files for non-gcc [/usr/include] --datarootdir=DIR read-only arch.-independent data root [PREFIX/share] --datadir=DIR read-only architecture-independent data [DATAROOTDIR] --infodir=DIR info documentation [DATAROOTDIR/info] --localedir=DIR locale-dependent data [DATAROOTDIR/locale] --mandir=DIR man documentation [DATAROOTDIR/man] --docdir=DIR documentation root [DATAROOTDIR/doc/dibbler] --htmldir=DIR html documentation [DOCDIR] --dvidir=DIR dvi documentation [DOCDIR] --pdfdir=DIR pdf documentation [DOCDIR] --psdir=DIR ps documentation [DOCDIR] _ACEOF cat <<\_ACEOF Program names: --program-prefix=PREFIX prepend PREFIX to installed program names --program-suffix=SUFFIX append SUFFIX to installed program names --program-transform-name=PROGRAM run sed PROGRAM on installed program names System types: --build=BUILD configure for building on BUILD [guessed] --host=HOST cross-compile to build programs to run on HOST [BUILD] _ACEOF fi if test -n "$ac_init_help"; then case $ac_init_help in short | recursive ) echo "Configuration of dibbler 1.0.1:";; esac cat <<\_ACEOF Optional Features: --disable-option-checking ignore unrecognized --enable/--with options --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) --enable-FEATURE[=ARG] include FEATURE [ARG=yes] --enable-silent-rules less verbose build output (undo: "make V=1") --disable-silent-rules verbose build output (undo: "make V=0") --enable-maintainer-mode enable make rules and dependencies not useful (and sometimes confusing) to the casual installer --enable-dependency-tracking do not reject slow dependency extractors --disable-dependency-tracking speeds up one-time build --enable-shared[=PKGS] build shared libraries [default=no] --enable-static[=PKGS] build static libraries [default=yes] --enable-fast-install[=PKGS] optimize for fast installation [default=yes] --disable-libtool-lock avoid locking (might break parallel builds) Dibbler modular features: --enable-debug Turn on debugging (default: no) --enable-efence Enables linking with electric-fence (default: no) --enable-bind-reuse Enables reusing the same port/address: SO_REUSEADDR (default: yes) --enable-dst-addr-check Enables server checks of dst address vs socket binding address (default: no) --enable-resolvconf Enables support for resolvconf (/sbin/resolvcof) (default: no) --enable-dns-update Enables DNS Update mechanism (default: yes) --enable-auth Enables authentication (default: yes) --enable-gtest-static Enables static linking for gtest (default: yes) --enable-link-state Enables link-state change detections (default: yes) --enable-remote-autoconf Enables *experimental* remote autoconfiguration (default: no) Optional Packages: --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) --with-pic[=PKGS] try to use only PIC/non-PIC objects [default=use both] --with-gnu-ld assume the C compiler uses GNU ld [default=no] --with-sysroot=DIR Search for dependent libraries within DIR (or the compiler's sysroot if not specified). --with-gtest=PATH specify a path to gtest header files and library Some influential environment variables: CXX C++ compiler command CXXFLAGS C++ compiler flags LDFLAGS linker flags, e.g. -L if you have libraries in a nonstandard directory LIBS libraries to pass to the linker, e.g. -l CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I if you have headers in a nonstandard directory CC C compiler command CFLAGS C compiler flags CPP C preprocessor CXXCPP C++ preprocessor Use these variables to override the choices made by `configure' or to help it to find libraries and programs with nonstandard names/locations. Report bugs to . _ACEOF ac_status=$? fi if test "$ac_init_help" = "recursive"; then # If there are subdirs, report their specific --help. for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue test -d "$ac_dir" || { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } || continue ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix cd "$ac_dir" || { ac_status=$?; continue; } # Check for guested configure. if test -f "$ac_srcdir/configure.gnu"; then echo && $SHELL "$ac_srcdir/configure.gnu" --help=recursive elif test -f "$ac_srcdir/configure"; then echo && $SHELL "$ac_srcdir/configure" --help=recursive else $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 fi || ac_status=$? cd "$ac_pwd" || { ac_status=$?; break; } done fi test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF dibbler configure 1.0.1 generated by GNU Autoconf 2.69 Copyright (C) 2012 Free Software Foundation, Inc. This configure script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it. _ACEOF exit fi ## ------------------------ ## ## Autoconf initialization. ## ## ------------------------ ## # ac_fn_cxx_try_compile LINENO # ---------------------------- # Try to compile conftest.$ac_ext, and return whether this succeeded. ac_fn_cxx_try_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_cxx_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_cxx_try_compile # ac_fn_c_try_compile LINENO # -------------------------- # Try to compile conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_compile # ac_fn_c_try_link LINENO # ----------------------- # Try to link conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_link () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext conftest$ac_exeext if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && { test "$cross_compiling" = yes || test -x conftest$ac_exeext }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would # interfere with the next link command; also delete a directory that is # left behind by Apple's compiler. We do this before executing the actions. rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_link # ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES # ------------------------------------------------------- # Tests whether HEADER exists and can be compiled using the include files in # INCLUDES, setting the cache variable VAR accordingly. ac_fn_c_check_header_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 #include <$2> _ACEOF if ac_fn_c_try_compile "$LINENO"; then : eval "$3=yes" else eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_header_compile # ac_fn_c_try_cpp LINENO # ---------------------- # Try to preprocess conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_cpp () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } > conftest.i && { test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || test ! -s conftest.err }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_cpp # ac_fn_c_try_run LINENO # ---------------------- # Try to link conftest.$ac_ext, and return whether this succeeded. Assumes # that executables *can* be run. ac_fn_c_try_run () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { ac_try='./conftest$ac_exeext' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then : ac_retval=0 else $as_echo "$as_me: program exited with status $ac_status" >&5 $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=$ac_status fi rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_run # ac_fn_c_check_func LINENO FUNC VAR # ---------------------------------- # Tests whether FUNC exists, setting the cache variable VAR accordingly ac_fn_c_check_func () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Define $2 to an innocuous variant, in case declares $2. For example, HP-UX 11i declares gettimeofday. */ #define $2 innocuous_$2 /* System header to define __stub macros and hopefully few prototypes, which can conflict with char $2 (); below. Prefer to if __STDC__ is defined, since exists even on freestanding compilers. */ #ifdef __STDC__ # include #else # include #endif #undef $2 /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $2 (); /* 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_$2 || defined __stub___$2 choke me #endif int main () { return $2 (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : eval "$3=yes" else eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_func # ac_fn_cxx_try_cpp LINENO # ------------------------ # Try to preprocess conftest.$ac_ext, and return whether this succeeded. ac_fn_cxx_try_cpp () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } > conftest.i && { test -z "$ac_cxx_preproc_warn_flag$ac_cxx_werror_flag" || test ! -s conftest.err }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_cxx_try_cpp # ac_fn_cxx_try_link LINENO # ------------------------- # Try to link conftest.$ac_ext, and return whether this succeeded. ac_fn_cxx_try_link () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext conftest$ac_exeext if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_cxx_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && { test "$cross_compiling" = yes || test -x conftest$ac_exeext }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would # interfere with the next link command; also delete a directory that is # left behind by Apple's compiler. We do this before executing the actions. rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_cxx_try_link # ac_fn_cxx_try_run LINENO # ------------------------ # Try to link conftest.$ac_ext, and return whether this succeeded. Assumes # that executables *can* be run. ac_fn_cxx_try_run () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { ac_try='./conftest$ac_exeext' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then : ac_retval=0 else $as_echo "$as_me: program exited with status $ac_status" >&5 $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=$ac_status fi rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_cxx_try_run # ac_fn_cxx_check_type LINENO TYPE VAR INCLUDES # --------------------------------------------- # Tests whether TYPE exists after having included INCLUDES, setting cache # variable VAR accordingly. ac_fn_cxx_check_type () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else eval "$3=no" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main () { if (sizeof ($2)) return 0; ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main () { if (sizeof (($2))) return 0; ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : else eval "$3=yes" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_cxx_check_type # ac_fn_cxx_check_func LINENO FUNC VAR # ------------------------------------ # Tests whether FUNC exists, setting the cache variable VAR accordingly ac_fn_cxx_check_func () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Define $2 to an innocuous variant, in case declares $2. For example, HP-UX 11i declares gettimeofday. */ #define $2 innocuous_$2 /* System header to define __stub macros and hopefully few prototypes, which can conflict with char $2 (); below. Prefer to if __STDC__ is defined, since exists even on freestanding compilers. */ #ifdef __STDC__ # include #else # include #endif #undef $2 /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $2 (); /* 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_$2 || defined __stub___$2 choke me #endif int main () { return $2 (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : eval "$3=yes" else eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_cxx_check_func # ac_fn_cxx_check_header_mongrel LINENO HEADER VAR INCLUDES # --------------------------------------------------------- # Tests whether HEADER exists, giving a warning if it cannot be compiled using # the include files in INCLUDES and setting the cache variable VAR # accordingly. ac_fn_cxx_check_header_mongrel () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if eval \${$3+:} false; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } else # Is the header compilable? { $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 usability" >&5 $as_echo_n "checking $2 usability... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 #include <$2> _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_header_compiler=yes else ac_header_compiler=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler" >&5 $as_echo "$ac_header_compiler" >&6; } # Is the header present? { $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 presence" >&5 $as_echo_n "checking $2 presence... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include <$2> _ACEOF if ac_fn_cxx_try_cpp "$LINENO"; then : ac_header_preproc=yes else ac_header_preproc=no fi rm -f conftest.err conftest.i conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5 $as_echo "$ac_header_preproc" >&6; } # So? What about this header? case $ac_header_compiler:$ac_header_preproc:$ac_cxx_preproc_warn_flag in #(( yes:no: ) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&5 $as_echo "$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 $as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} ;; no:yes:* ) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled" >&5 $as_echo "$as_me: WARNING: $2: present but cannot be compiled" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: check for missing prerequisite headers?" >&5 $as_echo "$as_me: WARNING: $2: check for missing prerequisite headers?" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation" >&5 $as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&5 $as_echo "$as_me: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 $as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} ( $as_echo "## ---------------------------------- ## ## Report this to dibbler@klub.com.pl ## ## ---------------------------------- ##" ) | sed "s/^/$as_me: WARNING: /" >&2 ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else eval "$3=\$ac_header_compiler" fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_cxx_check_header_mongrel # ac_fn_cxx_check_decl LINENO SYMBOL VAR INCLUDES # ----------------------------------------------- # Tests whether SYMBOL is declared in INCLUDES, setting cache variable VAR # accordingly. ac_fn_cxx_check_decl () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack as_decl_name=`echo $2|sed 's/ *(.*//'` as_decl_use=`echo $2|sed -e 's/(/((/' -e 's/)/) 0&/' -e 's/,/) 0& (/g'` { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $as_decl_name is declared" >&5 $as_echo_n "checking whether $as_decl_name is declared... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main () { #ifndef $as_decl_name #ifdef __cplusplus (void) $as_decl_use; #else (void) $as_decl_name; #endif #endif ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : eval "$3=yes" else eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_cxx_check_decl # ac_fn_c_find_intX_t LINENO BITS VAR # ----------------------------------- # Finds a signed integer type with width BITS, setting cache variable VAR # accordingly. ac_fn_c_find_intX_t () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for int$2_t" >&5 $as_echo_n "checking for int$2_t... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else eval "$3=no" # Order is important - never check a type that is potentially smaller # than half of the expected target width. for ac_type in int$2_t 'int' 'long int' \ 'long long int' 'short int' 'signed char'; do cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default enum { N = $2 / 2 - 1 }; int main () { static int test_array [1 - 2 * !(0 < ($ac_type) ((((($ac_type) 1 << N) << N) - 1) * 2 + 1))]; test_array [0] = 0; return test_array [0]; ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default enum { N = $2 / 2 - 1 }; int main () { static int test_array [1 - 2 * !(($ac_type) ((((($ac_type) 1 << N) << N) - 1) * 2 + 1) < ($ac_type) ((((($ac_type) 1 << N) << N) - 1) * 2 + 2))]; test_array [0] = 0; return test_array [0]; ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : else case $ac_type in #( int$2_t) : eval "$3=yes" ;; #( *) : eval "$3=\$ac_type" ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if eval test \"x\$"$3"\" = x"no"; then : else break fi done fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_find_intX_t # ac_fn_c_find_uintX_t LINENO BITS VAR # ------------------------------------ # Finds an unsigned integer type with width BITS, setting cache variable VAR # accordingly. ac_fn_c_find_uintX_t () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for uint$2_t" >&5 $as_echo_n "checking for uint$2_t... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else eval "$3=no" # Order is important - never check a type that is potentially smaller # than half of the expected target width. for ac_type in uint$2_t 'unsigned int' 'unsigned long int' \ 'unsigned long long int' 'unsigned short int' 'unsigned char'; do cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default int main () { static int test_array [1 - 2 * !((($ac_type) -1 >> ($2 / 2 - 1)) >> ($2 / 2 - 1) == 3)]; test_array [0] = 0; return test_array [0]; ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : case $ac_type in #( uint$2_t) : eval "$3=yes" ;; #( *) : eval "$3=\$ac_type" ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if eval test \"x\$"$3"\" = x"no"; then : else break fi done fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_find_uintX_t cat >config.log <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. It was created by dibbler $as_me 1.0.1, which was generated by GNU Autoconf 2.69. Invocation command line was $ $0 $@ _ACEOF exec 5>>config.log { cat <<_ASUNAME ## --------- ## ## Platform. ## ## --------- ## hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` uname -m = `(uname -m) 2>/dev/null || echo unknown` uname -r = `(uname -r) 2>/dev/null || echo unknown` uname -s = `(uname -s) 2>/dev/null || echo unknown` uname -v = `(uname -v) 2>/dev/null || echo unknown` /usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` /bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` /bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` /usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown` /bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` /bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` _ASUNAME as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. $as_echo "PATH: $as_dir" done IFS=$as_save_IFS } >&5 cat >&5 <<_ACEOF ## ----------- ## ## Core tests. ## ## ----------- ## _ACEOF # Keep a trace of the command line. # Strip out --no-create and --no-recursion so they do not pile up. # Strip out --silent because we don't want to record it for future runs. # Also quote any args containing shell meta-characters. # Make two passes to allow for proper duplicate-argument suppression. ac_configure_args= ac_configure_args0= ac_configure_args1= ac_must_keep_next=false for ac_pass in 1 2 do for ac_arg do case $ac_arg in -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) continue ;; *\'*) ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; esac case $ac_pass in 1) as_fn_append ac_configure_args0 " '$ac_arg'" ;; 2) as_fn_append ac_configure_args1 " '$ac_arg'" if test $ac_must_keep_next = true; then ac_must_keep_next=false # Got value, back to normal. else case $ac_arg in *=* | --config-cache | -C | -disable-* | --disable-* \ | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ | -with-* | --with-* | -without-* | --without-* | --x) case "$ac_configure_args0 " in "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; esac ;; -* ) ac_must_keep_next=true ;; esac fi as_fn_append ac_configure_args " '$ac_arg'" ;; esac done done { ac_configure_args0=; unset ac_configure_args0;} { ac_configure_args1=; unset ac_configure_args1;} # When interrupted or exit'd, cleanup temporary files, and complete # config.log. We remove comments because anyway the quotes in there # would cause problems or look ugly. # WARNING: Use '\'' to represent an apostrophe within the trap. # WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug. trap 'exit_status=$? # Save into config.log some information that might help in debugging. { echo $as_echo "## ---------------- ## ## Cache variables. ## ## ---------------- ##" echo # The following way of writing the cache mishandles newlines in values, ( for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #( *${as_nl}ac_space=\ *) sed -n \ "s/'\''/'\''\\\\'\'''\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p" ;; #( *) sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) echo $as_echo "## ----------------- ## ## Output variables. ## ## ----------------- ##" echo for ac_var in $ac_subst_vars do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo if test -n "$ac_subst_files"; then $as_echo "## ------------------- ## ## File substitutions. ## ## ------------------- ##" echo for ac_var in $ac_subst_files do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo fi if test -s confdefs.h; then $as_echo "## ----------- ## ## confdefs.h. ## ## ----------- ##" echo cat confdefs.h echo fi test "$ac_signal" != 0 && $as_echo "$as_me: caught signal $ac_signal" $as_echo "$as_me: exit $exit_status" } >&5 rm -f core *.core core.conftest.* && rm -f -r conftest* confdefs* conf$$* $ac_clean_files && exit $exit_status ' 0 for ac_signal in 1 2 13 15; do trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal done ac_signal=0 # confdefs.h avoids OS command line length limits that DEFS can exceed. rm -f -r conftest* confdefs.h $as_echo "/* confdefs.h */" > confdefs.h # Predefined preprocessor variables. cat >>confdefs.h <<_ACEOF #define PACKAGE_NAME "$PACKAGE_NAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_TARNAME "$PACKAGE_TARNAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_VERSION "$PACKAGE_VERSION" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_STRING "$PACKAGE_STRING" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_URL "$PACKAGE_URL" _ACEOF # Let the site file select an alternate cache file if it wants to. # Prefer an explicitly selected file to automatically selected ones. ac_site_file1=NONE ac_site_file2=NONE if test -n "$CONFIG_SITE"; then # We do not want a PATH search for config.site. case $CONFIG_SITE in #(( -*) ac_site_file1=./$CONFIG_SITE;; */*) ac_site_file1=$CONFIG_SITE;; *) ac_site_file1=./$CONFIG_SITE;; esac elif test "x$prefix" != xNONE; then ac_site_file1=$prefix/share/config.site ac_site_file2=$prefix/etc/config.site else ac_site_file1=$ac_default_prefix/share/config.site ac_site_file2=$ac_default_prefix/etc/config.site fi for ac_site_file in "$ac_site_file1" "$ac_site_file2" do test "x$ac_site_file" = xNONE && continue if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5 $as_echo "$as_me: loading site script $ac_site_file" >&6;} sed 's/^/| /' "$ac_site_file" >&5 . "$ac_site_file" \ || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "failed to load site script $ac_site_file See \`config.log' for more details" "$LINENO" 5; } fi done if test -r "$cache_file"; then # Some versions of bash will fail to source /dev/null (special files # actually), so we avoid doing that. DJGPP emulates it as a regular file. if test /dev/null != "$cache_file" && test -f "$cache_file"; then { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5 $as_echo "$as_me: loading cache $cache_file" >&6;} case $cache_file in [\\/]* | ?:[\\/]* ) . "$cache_file";; *) . "./$cache_file";; esac fi else { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5 $as_echo "$as_me: creating cache $cache_file" >&6;} >$cache_file fi # Check that the precious variables saved in the cache have kept the same # value. ac_cache_corrupted=false for ac_var in $ac_precious_vars; do eval ac_old_set=\$ac_cv_env_${ac_var}_set eval ac_new_set=\$ac_env_${ac_var}_set eval ac_old_val=\$ac_cv_env_${ac_var}_value eval ac_new_val=\$ac_env_${ac_var}_value case $ac_old_set,$ac_new_set in set,) { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} ac_cache_corrupted=: ;; ,set) { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} ac_cache_corrupted=: ;; ,);; *) if test "x$ac_old_val" != "x$ac_new_val"; then # differences in whitespace do not lead to failure. ac_old_val_w=`echo x $ac_old_val` ac_new_val_w=`echo x $ac_new_val` if test "$ac_old_val_w" != "$ac_new_val_w"; then { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5 $as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} ac_cache_corrupted=: else { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5 $as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;} eval $ac_var=\$ac_old_val fi { $as_echo "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5 $as_echo "$as_me: former value: \`$ac_old_val'" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5 $as_echo "$as_me: current value: \`$ac_new_val'" >&2;} fi;; esac # Pass precious variables to config.status. if test "$ac_new_set" = set; then case $ac_new_val in *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; *) ac_arg=$ac_var=$ac_new_val ;; esac case " $ac_configure_args " in *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. *) as_fn_append ac_configure_args " '$ac_arg'" ;; esac fi done if $ac_cache_corrupted; then { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5 $as_echo "$as_me: error: changes in the environment can compromise the build" >&2;} as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5 fi ## -------------------- ## ## Main body of script. ## ## -------------------- ## ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu am__api_version='1.14' ac_aux_dir= for ac_dir in "$srcdir" "$srcdir/.." "$srcdir/../.."; do if test -f "$ac_dir/install-sh"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install-sh -c" break elif test -f "$ac_dir/install.sh"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install.sh -c" break elif test -f "$ac_dir/shtool"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/shtool install -c" break fi done if test -z "$ac_aux_dir"; then as_fn_error $? "cannot find install-sh, install.sh, or shtool in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" "$LINENO" 5 fi # These three variables are undocumented and unsupported, # and are intended to be withdrawn in a future Autoconf release. # They can cause serious problems if a builder's source tree is in a directory # whose full name contains unusual characters. ac_config_guess="$SHELL $ac_aux_dir/config.guess" # Please don't use this var. ac_config_sub="$SHELL $ac_aux_dir/config.sub" # Please don't use this var. ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var. # Find a good install program. We prefer a C program (faster), # so one script is as good as another. But avoid the broken or # incompatible versions: # SysV /etc/install, /usr/sbin/install # SunOS /usr/etc/install # IRIX /sbin/install # AIX /bin/install # AmigaOS /C/install, which installs bootblocks on floppy discs # AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag # AFS /usr/afsws/bin/install, which mishandles nonexistent args # SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" # OS/2's system install, which has a completely different semantic # ./install, which can be erroneously created by make from ./install.sh. # Reject install programs that cannot install multiple files. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5 $as_echo_n "checking for a BSD-compatible install... " >&6; } if test -z "$INSTALL"; then if ${ac_cv_path_install+:} false; then : $as_echo_n "(cached) " >&6 else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. # Account for people who put trailing slashes in PATH elements. case $as_dir/ in #(( ./ | .// | /[cC]/* | \ /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ ?:[\\/]os2[\\/]install[\\/]* | ?:[\\/]OS2[\\/]INSTALL[\\/]* | \ /usr/ucb/* ) ;; *) # OSF1 and SCO ODT 3.0 have their own names for install. # Don't use installbsd from OSF since it installs stuff as root # by default. for ac_prog in ginstall scoinst install; do for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then if test $ac_prog = install && grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # AIX install. It has an incompatible calling convention. : elif test $ac_prog = install && grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # program-specific install script used by HP pwplus--don't use. : else rm -rf conftest.one conftest.two conftest.dir echo one > conftest.one echo two > conftest.two mkdir conftest.dir if "$as_dir/$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir" && test -s conftest.one && test -s conftest.two && test -s conftest.dir/conftest.one && test -s conftest.dir/conftest.two then ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" break 3 fi fi fi done done ;; esac done IFS=$as_save_IFS rm -rf conftest.one conftest.two conftest.dir fi if test "${ac_cv_path_install+set}" = set; then INSTALL=$ac_cv_path_install else # As a last resort, use the slow shell script. Don't cache a # value for INSTALL within a source directory, because that will # break other packages using the cache if that directory is # removed, or if the value is a relative name. INSTALL=$ac_install_sh fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5 $as_echo "$INSTALL" >&6; } # Use test -z because SunOS4 sh mishandles braces in ${var-val}. # It thinks the first close brace ends the variable substitution. test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether build environment is sane" >&5 $as_echo_n "checking whether build environment is sane... " >&6; } # Reject unsafe characters in $srcdir or the absolute working directory # name. Accept space and tab only in the latter. am_lf=' ' case `pwd` in *[\\\"\#\$\&\'\`$am_lf]*) as_fn_error $? "unsafe absolute working directory name" "$LINENO" 5;; esac case $srcdir in *[\\\"\#\$\&\'\`$am_lf\ \ ]*) as_fn_error $? "unsafe srcdir value: '$srcdir'" "$LINENO" 5;; esac # Do 'set' in a subshell so we don't clobber the current shell's # arguments. Must try -L first in case configure is actually a # symlink; some systems play weird games with the mod time of symlinks # (eg FreeBSD returns the mod time of the symlink's containing # directory). if ( am_has_slept=no for am_try in 1 2; do echo "timestamp, slept: $am_has_slept" > conftest.file set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` if test "$*" = "X"; then # -L didn't work. set X `ls -t "$srcdir/configure" conftest.file` fi if test "$*" != "X $srcdir/configure conftest.file" \ && test "$*" != "X conftest.file $srcdir/configure"; then # If neither matched, then we have a broken ls. This can happen # if, for instance, CONFIG_SHELL is bash and it inherits a # broken ls alias from the environment. This has actually # happened. Such a system could not be considered "sane". as_fn_error $? "ls -t appears to fail. Make sure there is not a broken alias in your environment" "$LINENO" 5 fi if test "$2" = conftest.file || test $am_try -eq 2; then break fi # Just in case. sleep 1 am_has_slept=yes done test "$2" = conftest.file ) then # Ok. : else as_fn_error $? "newly created file is older than distributed files! Check your system clock" "$LINENO" 5 fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } # If we didn't sleep, we still need to ensure time stamps of config.status and # generated files are strictly newer. am_sleep_pid= if grep 'slept: no' conftest.file >/dev/null 2>&1; then ( sleep 1 ) & am_sleep_pid=$! fi rm -f conftest.file test "$program_prefix" != NONE && program_transform_name="s&^&$program_prefix&;$program_transform_name" # Use a double $ so make ignores it. test "$program_suffix" != NONE && program_transform_name="s&\$&$program_suffix&;$program_transform_name" # Double any \ or $. # By default was `s,x,x', remove it if useless. ac_script='s/[\\$]/&&/g;s/;s,x,x,$//' program_transform_name=`$as_echo "$program_transform_name" | sed "$ac_script"` # expand $ac_aux_dir to an absolute path am_aux_dir=`cd $ac_aux_dir && pwd` if test x"${MISSING+set}" != xset; then case $am_aux_dir in *\ * | *\ *) MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;; *) MISSING="\${SHELL} $am_aux_dir/missing" ;; esac fi # Use eval to expand $SHELL if eval "$MISSING --is-lightweight"; then am_missing_run="$MISSING " else am_missing_run= { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: 'missing' script is too old or missing" >&5 $as_echo "$as_me: WARNING: 'missing' script is too old or missing" >&2;} fi if test x"${install_sh}" != xset; then case $am_aux_dir in *\ * | *\ *) install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; *) install_sh="\${SHELL} $am_aux_dir/install-sh" esac fi # Installed binaries are usually stripped using 'strip' when the user # run "make install-strip". However 'strip' might not be the right # tool to use in cross-compilation environments, therefore Automake # will honor the 'STRIP' environment variable to overrule this program. if test "$cross_compiling" != no; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. set dummy ${ac_tool_prefix}strip; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_STRIP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$STRIP"; then ac_cv_prog_STRIP="$STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_STRIP="${ac_tool_prefix}strip" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi STRIP=$ac_cv_prog_STRIP if test -n "$STRIP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5 $as_echo "$STRIP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_STRIP"; then ac_ct_STRIP=$STRIP # Extract the first word of "strip", so it can be a program name with args. set dummy strip; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_STRIP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_STRIP"; then ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_STRIP="strip" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP if test -n "$ac_ct_STRIP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5 $as_echo "$ac_ct_STRIP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_STRIP" = x; then STRIP=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac STRIP=$ac_ct_STRIP fi else STRIP="$ac_cv_prog_STRIP" fi fi INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a thread-safe mkdir -p" >&5 $as_echo_n "checking for a thread-safe mkdir -p... " >&6; } if test -z "$MKDIR_P"; then if ${ac_cv_path_mkdir+:} false; then : $as_echo_n "(cached) " >&6 else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/opt/sfw/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in mkdir gmkdir; do for ac_exec_ext in '' $ac_executable_extensions; do as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext" || continue case `"$as_dir/$ac_prog$ac_exec_ext" --version 2>&1` in #( 'mkdir (GNU coreutils) '* | \ 'mkdir (coreutils) '* | \ 'mkdir (fileutils) '4.1*) ac_cv_path_mkdir=$as_dir/$ac_prog$ac_exec_ext break 3;; esac done done done IFS=$as_save_IFS fi test -d ./--version && rmdir ./--version if test "${ac_cv_path_mkdir+set}" = set; then MKDIR_P="$ac_cv_path_mkdir -p" else # As a last resort, use the slow shell script. Don't cache a # value for MKDIR_P within a source directory, because that will # break other packages using the cache if that directory is # removed, or if the value is a relative name. MKDIR_P="$ac_install_sh -d" fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MKDIR_P" >&5 $as_echo "$MKDIR_P" >&6; } for ac_prog in gawk mawk nawk awk do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_AWK+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$AWK"; then ac_cv_prog_AWK="$AWK" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_AWK="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi AWK=$ac_cv_prog_AWK if test -n "$AWK"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AWK" >&5 $as_echo "$AWK" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$AWK" && break done { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5 $as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; } set x ${MAKE-make} ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` if eval \${ac_cv_prog_make_${ac_make}_set+:} false; then : $as_echo_n "(cached) " >&6 else cat >conftest.make <<\_ACEOF SHELL = /bin/sh all: @echo '@@@%%%=$(MAKE)=@@@%%%' _ACEOF # GNU make sometimes prints "make[1]: Entering ...", which would confuse us. case `${MAKE-make} -f conftest.make 2>/dev/null` in *@@@%%%=?*=@@@%%%*) eval ac_cv_prog_make_${ac_make}_set=yes;; *) eval ac_cv_prog_make_${ac_make}_set=no;; esac rm -f conftest.make fi if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } SET_MAKE= else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } SET_MAKE="MAKE=${MAKE-make}" fi rm -rf .tst 2>/dev/null mkdir .tst 2>/dev/null if test -d .tst; then am__leading_dot=. else am__leading_dot=_ fi rmdir .tst 2>/dev/null # Check whether --enable-silent-rules was given. if test "${enable_silent_rules+set}" = set; then : enableval=$enable_silent_rules; fi case $enable_silent_rules in # ((( yes) AM_DEFAULT_VERBOSITY=0;; no) AM_DEFAULT_VERBOSITY=1;; *) AM_DEFAULT_VERBOSITY=1;; esac am_make=${MAKE-make} { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $am_make supports nested variables" >&5 $as_echo_n "checking whether $am_make supports nested variables... " >&6; } if ${am_cv_make_support_nested_variables+:} false; then : $as_echo_n "(cached) " >&6 else if $as_echo 'TRUE=$(BAR$(V)) BAR0=false BAR1=true V=1 am__doit: @$(TRUE) .PHONY: am__doit' | $am_make -f - >/dev/null 2>&1; then am_cv_make_support_nested_variables=yes else am_cv_make_support_nested_variables=no fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_make_support_nested_variables" >&5 $as_echo "$am_cv_make_support_nested_variables" >&6; } if test $am_cv_make_support_nested_variables = yes; then AM_V='$(V)' AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)' else AM_V=$AM_DEFAULT_VERBOSITY AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY fi AM_BACKSLASH='\' if test "`cd $srcdir && pwd`" != "`pwd`"; then # Use -I$(srcdir) only when $(srcdir) != ., so that make's output # is not polluted with repeated "-I." am__isrc=' -I$(srcdir)' # test to see if srcdir already configured if test -f $srcdir/config.status; then as_fn_error $? "source directory already configured; run \"make distclean\" there first" "$LINENO" 5 fi fi # test whether we have cygpath if test -z "$CYGPATH_W"; then if (cygpath --version) >/dev/null 2>/dev/null; then CYGPATH_W='cygpath -w' else CYGPATH_W=echo fi fi # Define the identity of the package. PACKAGE='dibbler' VERSION='1.0.1' cat >>confdefs.h <<_ACEOF #define PACKAGE "$PACKAGE" _ACEOF cat >>confdefs.h <<_ACEOF #define VERSION "$VERSION" _ACEOF # Some tools Automake needs. ACLOCAL=${ACLOCAL-"${am_missing_run}aclocal-${am__api_version}"} AUTOCONF=${AUTOCONF-"${am_missing_run}autoconf"} AUTOMAKE=${AUTOMAKE-"${am_missing_run}automake-${am__api_version}"} AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"} MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"} # For better backward compatibility. To be removed once Automake 1.9.x # dies out for good. For more background, see: # # mkdir_p='$(MKDIR_P)' # We need awk for the "check" target. The system "awk" is bad on # some platforms. # Always define AMTAR for backward compatibility. Yes, it's still used # in the wild :-( We should find a proper way to deprecate it ... AMTAR='$${TAR-tar}' # We'll loop over all known methods to create a tar archive until one works. _am_tools='gnutar pax cpio none' am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -' # POSIX will say in a future version that running "rm -f" with no argument # is OK; and we want to be able to make that assumption in our Makefile # recipes. So use an aggressive probe to check that the usage we want is # actually supported "in the wild" to an acceptable degree. # See automake bug#10828. # To make any issue more visible, cause the running configure to be aborted # by default if the 'rm' program in use doesn't match our expectations; the # user can still override this though. if rm -f && rm -fr && rm -rf; then : OK; else cat >&2 <<'END' Oops! Your 'rm' program seems unable to run without file operands specified on the command line, even when the '-f' option is present. This is contrary to the behaviour of most rm programs out there, and not conforming with the upcoming POSIX standard: Please tell bug-automake@gnu.org about your system, including the value of your $PATH and any error possibly output before this message. This can help us improve future automake versions. END if test x"$ACCEPT_INFERIOR_RM_PROGRAM" = x"yes"; then echo 'Configuration will proceed anyway, since you have set the' >&2 echo 'ACCEPT_INFERIOR_RM_PROGRAM variable to "yes"' >&2 echo >&2 else cat >&2 <<'END' Aborting the configuration process, to ensure you take notice of the issue. You can download and install GNU coreutils to get an 'rm' implementation that behaves properly: . If you want to complete the configuration process using your problematic 'rm' anyway, export the environment variable ACCEPT_INFERIOR_RM_PROGRAM to "yes", and re-run configure. END as_fn_error $? "Your 'rm' program is bad, sorry." "$LINENO" 5 fi fi ac_config_headers="$ac_config_headers include/dibbler-config.h" # DO NOT trigger rebuild rules, unless I tell you so. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to enable maintainer-specific portions of Makefiles" >&5 $as_echo_n "checking whether to enable maintainer-specific portions of Makefiles... " >&6; } # Check whether --enable-maintainer-mode was given. if test "${enable_maintainer_mode+set}" = set; then : enableval=$enable_maintainer_mode; USE_MAINTAINER_MODE=$enableval else USE_MAINTAINER_MODE=no fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $USE_MAINTAINER_MODE" >&5 $as_echo "$USE_MAINTAINER_MODE" >&6; } if test $USE_MAINTAINER_MODE = yes; then MAINTAINER_MODE_TRUE= MAINTAINER_MODE_FALSE='#' else MAINTAINER_MODE_TRUE='#' MAINTAINER_MODE_FALSE= fi MAINT=$MAINTAINER_MODE_TRUE # Poslib stuff ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu system=`uname -s` s_version=`uname -r` case $system in Darwin) case $s_version in 12*|13*|14*) $as_echo "#define __APPLE_USE_RFC_3542 1" >>confdefs.h NEED_RFC_3542=yes # Yup, Mac OS X 10.6.x is special. 10.9 is no different, too. ;; *) # Let's hope that madness will go way one day. ;; esac ;; esac # Check whether --enable-silent-rules was given. if test "${enable_silent_rules+set}" = set; then : enableval=$enable_silent_rules; fi case $enable_silent_rules in # ((( yes) AM_DEFAULT_VERBOSITY=0;; no) AM_DEFAULT_VERBOSITY=1;; *) AM_DEFAULT_VERBOSITY=1;; esac am_make=${MAKE-make} { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $am_make supports nested variables" >&5 $as_echo_n "checking whether $am_make supports nested variables... " >&6; } if ${am_cv_make_support_nested_variables+:} false; then : $as_echo_n "(cached) " >&6 else if $as_echo 'TRUE=$(BAR$(V)) BAR0=false BAR1=true V=1 am__doit: @$(TRUE) .PHONY: am__doit' | $am_make -f - >/dev/null 2>&1; then am_cv_make_support_nested_variables=yes else am_cv_make_support_nested_variables=no fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_make_support_nested_variables" >&5 $as_echo "$am_cv_make_support_nested_variables" >&6; } if test $am_cv_make_support_nested_variables = yes; then AM_V='$(V)' AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)' else AM_V=$AM_DEFAULT_VERBOSITY AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY fi AM_BACKSLASH='\' CFLAGS_SAVED="$CFLAGS" CPPFLAGS_SAVED="$CPPFLAGS" CXXFLAGS_SAVED="$CXXFLAGS" # Checks for programs. ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu if test -z "$CXX"; then if test -n "$CCC"; then CXX=$CCC else if test -n "$ac_tool_prefix"; then for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CXX+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CXX"; then ac_cv_prog_CXX="$CXX" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CXX="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CXX=$ac_cv_prog_CXX if test -n "$CXX"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXX" >&5 $as_echo "$CXX" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$CXX" && break done fi if test -z "$CXX"; then ac_ct_CXX=$CXX for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CXX+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CXX"; then ac_cv_prog_ac_ct_CXX="$ac_ct_CXX" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CXX="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CXX=$ac_cv_prog_ac_ct_CXX if test -n "$ac_ct_CXX"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CXX" >&5 $as_echo "$ac_ct_CXX" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_CXX" && break done if test "x$ac_ct_CXX" = x; then CXX="g++" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CXX=$ac_ct_CXX fi fi fi fi # Provide some information about the compiler. $as_echo "$as_me:${as_lineno-$LINENO}: checking for C++ compiler version" >&5 set X $ac_compile ac_compiler=$2 for ac_option in --version -v -V -qversion; do { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? if test -s conftest.err; then sed '10a\ ... rest of stderr output deleted ... 10q' conftest.err >conftest.er1 cat conftest.er1 >&5 fi rm -f conftest.er1 conftest.err $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } done cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out" # Try to create an executable without -o first, disregard a.out. # It will help us diagnose broken compilers, and finding out an intuition # of exeext. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C++ compiler works" >&5 $as_echo_n "checking whether the C++ compiler works... " >&6; } ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` # The possible output files: ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*" ac_rmfiles= for ac_file in $ac_files do case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; * ) ac_rmfiles="$ac_rmfiles $ac_file";; esac done rm -f $ac_rmfiles if { { ac_try="$ac_link_default" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link_default") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : # Autoconf-2.13 could set the ac_cv_exeext variable to `no'. # So ignore a value of `no', otherwise this would lead to `EXEEXT = no' # in a Makefile. We should not override ac_cv_exeext if it was cached, # so that the user can short-circuit this test for compilers unknown to # Autoconf. for ac_file in $ac_files '' do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; [ab].out ) # We found the default executable, but exeext='' is most # certainly right. break;; *.* ) if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no; then :; else ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` fi # We set ac_cv_exeext here because the later test for it is not # safe: cross compilers may not add the suffix if given an `-o' # argument, so we may need to know it at that point already. # Even if this section looks crufty: it has the advantage of # actually working. break;; * ) break;; esac done test "$ac_cv_exeext" = no && ac_cv_exeext= else ac_file='' fi if test -z "$ac_file"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error 77 "C++ compiler cannot create executables See \`config.log' for more details" "$LINENO" 5; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for C++ compiler default output file name" >&5 $as_echo_n "checking for C++ compiler default output file name... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5 $as_echo "$ac_file" >&6; } ac_exeext=$ac_cv_exeext rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out ac_clean_files=$ac_clean_files_save { $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5 $as_echo_n "checking for suffix of executables... " >&6; } if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : # If both `conftest.exe' and `conftest' are `present' (well, observable) # catch `conftest.exe'. For instance with Cygwin, `ls conftest' will # work properly (i.e., refer to `conftest.exe'), while it won't with # `rm'. for ac_file in conftest.exe conftest conftest.*; do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` break;; * ) break;; esac done else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of executables: cannot compile and link See \`config.log' for more details" "$LINENO" 5; } fi rm -f conftest conftest$ac_cv_exeext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5 $as_echo "$ac_cv_exeext" >&6; } rm -f conftest.$ac_ext EXEEXT=$ac_cv_exeext ac_exeext=$EXEEXT cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { FILE *f = fopen ("conftest.out", "w"); return ferror (f) || fclose (f) != 0; ; return 0; } _ACEOF ac_clean_files="$ac_clean_files conftest.out" # Check that the compiler produces executables we can run. If not, either # the compiler is broken, or we cross compile. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5 $as_echo_n "checking whether we are cross compiling... " >&6; } if test "$cross_compiling" != yes; then { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } if { ac_try='./conftest$ac_cv_exeext' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then cross_compiling=no else if test "$cross_compiling" = maybe; then cross_compiling=yes else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot run C++ compiled programs. If you meant to cross compile, use \`--host'. See \`config.log' for more details" "$LINENO" 5; } fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5 $as_echo "$cross_compiling" >&6; } rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out ac_clean_files=$ac_clean_files_save { $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5 $as_echo_n "checking for suffix of object files... " >&6; } if ${ac_cv_objext+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.o conftest.obj if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : for ac_file in conftest.o conftest.obj conftest.*; do test -f "$ac_file" || continue; case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;; *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` break;; esac done else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of object files: cannot compile See \`config.log' for more details" "$LINENO" 5; } fi rm -f conftest.$ac_cv_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5 $as_echo "$ac_cv_objext" >&6; } OBJEXT=$ac_cv_objext ac_objext=$OBJEXT { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C++ compiler" >&5 $as_echo_n "checking whether we are using the GNU C++ compiler... " >&6; } if ${ac_cv_cxx_compiler_gnu+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_compiler_gnu=yes else ac_compiler_gnu=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_cxx_compiler_gnu=$ac_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cxx_compiler_gnu" >&5 $as_echo "$ac_cv_cxx_compiler_gnu" >&6; } if test $ac_compiler_gnu = yes; then GXX=yes else GXX= fi ac_test_CXXFLAGS=${CXXFLAGS+set} ac_save_CXXFLAGS=$CXXFLAGS { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CXX accepts -g" >&5 $as_echo_n "checking whether $CXX accepts -g... " >&6; } if ${ac_cv_prog_cxx_g+:} false; then : $as_echo_n "(cached) " >&6 else ac_save_cxx_werror_flag=$ac_cxx_werror_flag ac_cxx_werror_flag=yes ac_cv_prog_cxx_g=no CXXFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_cv_prog_cxx_g=yes else CXXFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : else ac_cxx_werror_flag=$ac_save_cxx_werror_flag CXXFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_cv_prog_cxx_g=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cxx_werror_flag=$ac_save_cxx_werror_flag fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cxx_g" >&5 $as_echo "$ac_cv_prog_cxx_g" >&6; } if test "$ac_test_CXXFLAGS" = set; then CXXFLAGS=$ac_save_CXXFLAGS elif test $ac_cv_prog_cxx_g = yes; then if test "$GXX" = yes; then CXXFLAGS="-g -O2" else CXXFLAGS="-g" fi else if test "$GXX" = yes; then CXXFLAGS="-O2" else CXXFLAGS= fi fi ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu DEPDIR="${am__leading_dot}deps" ac_config_commands="$ac_config_commands depfiles" am_make=${MAKE-make} cat > confinc << 'END' am__doit: @echo this is the am__doit target .PHONY: am__doit END # If we don't find an include directive, just comment out the code. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for style of include used by $am_make" >&5 $as_echo_n "checking for style of include used by $am_make... " >&6; } am__include="#" am__quote= _am_result=none # First try GNU make style include. echo "include confinc" > confmf # Ignore all kinds of additional output from 'make'. case `$am_make -s -f confmf 2> /dev/null` in #( *the\ am__doit\ target*) am__include=include am__quote= _am_result=GNU ;; esac # Now try BSD make style include. if test "$am__include" = "#"; then echo '.include "confinc"' > confmf case `$am_make -s -f confmf 2> /dev/null` in #( *the\ am__doit\ target*) am__include=.include am__quote="\"" _am_result=BSD ;; esac fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $_am_result" >&5 $as_echo "$_am_result" >&6; } rm -f confinc confmf # Check whether --enable-dependency-tracking was given. if test "${enable_dependency_tracking+set}" = set; then : enableval=$enable_dependency_tracking; fi if test "x$enable_dependency_tracking" != xno; then am_depcomp="$ac_aux_dir/depcomp" AMDEPBACKSLASH='\' am__nodep='_no' fi if test "x$enable_dependency_tracking" != xno; then AMDEP_TRUE= AMDEP_FALSE='#' else AMDEP_TRUE='#' AMDEP_FALSE= fi depcc="$CXX" am_compiler_list= { $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 $as_echo_n "checking dependency style of $depcc... " >&6; } if ${am_cv_CXX_dependencies_compiler_type+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up # making a dummy file named 'D' -- because '-MD' means "put the output # in D". rm -rf conftest.dir mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. cp "$am_depcomp" conftest.dir cd conftest.dir # We will build objects and dependencies in a subdirectory because # it helps to detect inapplicable dependency modes. For instance # both Tru64's cc and ICC support -MD to output dependencies as a # side effect of compilation, but ICC will put the dependencies in # the current directory while Tru64 will put them in the object # directory. mkdir sub am_cv_CXX_dependencies_compiler_type=none if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` fi am__universal=false case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac for depmode in $am_compiler_list; do # Setup a source with many dependencies, because some compilers # like to wrap large dependency lists on column 80 (with \), and # we should not choose a depcomp mode which is confused by this. # # We need to recreate these files for each test, as the compiler may # overwrite some of them when testing with obscure command lines. # This happens at least with the AIX C compiler. : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with # Solaris 10 /bin/sh. echo '/* dummy */' > sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf # We check with '-c' and '-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly # handle '-M -o', and we need to detect this. Also, some Intel # versions had trouble with output in subdirs. am__obj=sub/conftest.${OBJEXT-o} am__minus_obj="-o $am__obj" case $depmode in gcc) # This depmode causes a compiler race in universal mode. test "$am__universal" = false || continue ;; nosideeffect) # After this tag, mechanisms are not by side-effect, so they'll # only be used when explicitly requested. if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; msvc7 | msvc7msys | msvisualcpp | msvcmsys) # This compiler won't grok '-c -o', but also, the minuso test has # not run yet. These depmodes are late enough in the game, and # so weak that their functioning should not be impacted. am__obj=conftest.${OBJEXT-o} am__minus_obj= ;; none) break ;; esac if depmode=$depmode \ source=sub/conftest.c object=$am__obj \ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ >/dev/null 2>conftest.err && grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && grep $am__obj sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then # icc doesn't choke on unknown options, it will just issue warnings # or remarks (even with -Werror). So we grep stderr for any message # that says an option was ignored or not supported. # When given -MP, icc 7.0 and 7.1 complain thusly: # icc: Command line warning: ignoring option '-M'; no argument required # The diagnosis changed in icc 8.0: # icc: Command line remark: option '-MP' not supported if (grep 'ignoring option' conftest.err || grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else am_cv_CXX_dependencies_compiler_type=$depmode break fi fi done cd .. rm -rf conftest.dir else am_cv_CXX_dependencies_compiler_type=none fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CXX_dependencies_compiler_type" >&5 $as_echo "$am_cv_CXX_dependencies_compiler_type" >&6; } CXXDEPMODE=depmode=$am_cv_CXX_dependencies_compiler_type if test "x$enable_dependency_tracking" != xno \ && test "$am_cv_CXX_dependencies_compiler_type" = gcc3; then am__fastdepCXX_TRUE= am__fastdepCXX_FALSE='#' else am__fastdepCXX_TRUE='#' am__fastdepCXX_FALSE= fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. set dummy ${ac_tool_prefix}gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_CC"; then ac_ct_CC=$CC # Extract the first word of "gcc", so it can be a program name with args. set dummy gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi else CC="$ac_cv_prog_CC" fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. set dummy ${ac_tool_prefix}cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi fi if test -z "$CC"; then # Extract the first word of "cc", so it can be a program name with args. set dummy cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else ac_prog_rejected=no as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then ac_prog_rejected=yes continue fi ac_cv_prog_CC="cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS if test $ac_prog_rejected = yes; then # We found a bogon in the path, so make sure we never use it. set dummy $ac_cv_prog_CC shift if test $# != 0; then # We chose a different compiler from the bogus one. # However, it has the same basename, so the bogon will be chosen # first if we set CC to just the basename; use the full file name. shift ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" fi fi fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then for ac_prog in cl.exe do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$CC" && break done fi if test -z "$CC"; then ac_ct_CC=$CC for ac_prog in cl.exe do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_CC" && break done if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi fi fi test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "no acceptable C compiler found in \$PATH See \`config.log' for more details" "$LINENO" 5; } # Provide some information about the compiler. $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 set X $ac_compile ac_compiler=$2 for ac_option in --version -v -V -qversion; do { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? if test -s conftest.err; then sed '10a\ ... rest of stderr output deleted ... 10q' conftest.err >conftest.er1 cat conftest.er1 >&5 fi rm -f conftest.er1 conftest.err $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } done { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5 $as_echo_n "checking whether we are using the GNU C compiler... " >&6; } if ${ac_cv_c_compiler_gnu+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_compiler_gnu=yes else ac_compiler_gnu=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_c_compiler_gnu=$ac_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 $as_echo "$ac_cv_c_compiler_gnu" >&6; } if test $ac_compiler_gnu = yes; then GCC=yes else GCC= fi ac_test_CFLAGS=${CFLAGS+set} ac_save_CFLAGS=$CFLAGS { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 $as_echo_n "checking whether $CC accepts -g... " >&6; } if ${ac_cv_prog_cc_g+:} false; then : $as_echo_n "(cached) " >&6 else ac_save_c_werror_flag=$ac_c_werror_flag ac_c_werror_flag=yes ac_cv_prog_cc_g=no CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes else CFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : else ac_c_werror_flag=$ac_save_c_werror_flag CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_c_werror_flag=$ac_save_c_werror_flag fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 $as_echo "$ac_cv_prog_cc_g" >&6; } if test "$ac_test_CFLAGS" = set; then CFLAGS=$ac_save_CFLAGS elif test $ac_cv_prog_cc_g = yes; then if test "$GCC" = yes; then CFLAGS="-g -O2" else CFLAGS="-g" fi else if test "$GCC" = yes; then CFLAGS="-O2" else CFLAGS= fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 $as_echo_n "checking for $CC option to accept ISO C89... " >&6; } if ${ac_cv_prog_cc_c89+:} false; then : $as_echo_n "(cached) " >&6 else ac_cv_prog_cc_c89=no ac_save_CC=$CC cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include struct stat; /* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ struct buf { int x; }; FILE * (*rcsopen) (struct buf *, struct stat *, int); static char *e (p, i) char **p; int i; { return p[i]; } static char *f (char * (*g) (char **, int), char **p, ...) { char *s; va_list v; va_start (v,p); s = g (p, va_arg (v,int)); va_end (v); return s; } /* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has function prototypes and stuff, but not '\xHH' hex character constants. These don't provoke an error unfortunately, instead are silently treated as 'x'. The following induces an error, until -std is added to get proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an array size at least. It's necessary to write '\x00'==0 to get something that's true only with -std. */ int osf4_cc_array ['\x00' == 0 ? 1 : -1]; /* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters inside strings and character constants. */ #define FOO(x) 'x' int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; int test (int i, double x); struct s1 {int (*f) (int a);}; struct s2 {int (*f) (double a);}; int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); int argc; char **argv; int main () { return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; ; return 0; } _ACEOF for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" do CC="$ac_save_CC $ac_arg" if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_c89=$ac_arg fi rm -f core conftest.err conftest.$ac_objext test "x$ac_cv_prog_cc_c89" != "xno" && break done rm -f conftest.$ac_ext CC=$ac_save_CC fi # AC_CACHE_VAL case "x$ac_cv_prog_cc_c89" in x) { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 $as_echo "none needed" >&6; } ;; xno) { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 $as_echo "unsupported" >&6; } ;; *) CC="$CC $ac_cv_prog_cc_c89" { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 $as_echo "$ac_cv_prog_cc_c89" >&6; } ;; esac if test "x$ac_cv_prog_cc_c89" != xno; then : fi ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC understands -c and -o together" >&5 $as_echo_n "checking whether $CC understands -c and -o together... " >&6; } if ${am_cv_prog_cc_c_o+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF # Make sure it works both with $CC and with simple cc. # Following AC_PROG_CC_C_O, we do the test twice because some # compilers refuse to overwrite an existing .o file with -o, # though they will create one. am_cv_prog_cc_c_o=yes for am_i in 1 2; do if { echo "$as_me:$LINENO: $CC -c conftest.$ac_ext -o conftest2.$ac_objext" >&5 ($CC -c conftest.$ac_ext -o conftest2.$ac_objext) >&5 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } \ && test -f conftest2.$ac_objext; then : OK else am_cv_prog_cc_c_o=no break fi done rm -f core conftest* unset am_i fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_prog_cc_c_o" >&5 $as_echo "$am_cv_prog_cc_c_o" >&6; } if test "$am_cv_prog_cc_c_o" != yes; then # Losing compiler, so override with the script. # FIXME: It is wrong to rewrite CC. # But if we don't then we get into trouble of one sort or another. # A longer-term fix would be to have automake use am__CC in this case, # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)" CC="$am_aux_dir/compile $CC" fi ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu depcc="$CC" am_compiler_list= { $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 $as_echo_n "checking dependency style of $depcc... " >&6; } if ${am_cv_CC_dependencies_compiler_type+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up # making a dummy file named 'D' -- because '-MD' means "put the output # in D". rm -rf conftest.dir mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. cp "$am_depcomp" conftest.dir cd conftest.dir # We will build objects and dependencies in a subdirectory because # it helps to detect inapplicable dependency modes. For instance # both Tru64's cc and ICC support -MD to output dependencies as a # side effect of compilation, but ICC will put the dependencies in # the current directory while Tru64 will put them in the object # directory. mkdir sub am_cv_CC_dependencies_compiler_type=none if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` fi am__universal=false case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac for depmode in $am_compiler_list; do # Setup a source with many dependencies, because some compilers # like to wrap large dependency lists on column 80 (with \), and # we should not choose a depcomp mode which is confused by this. # # We need to recreate these files for each test, as the compiler may # overwrite some of them when testing with obscure command lines. # This happens at least with the AIX C compiler. : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with # Solaris 10 /bin/sh. echo '/* dummy */' > sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf # We check with '-c' and '-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly # handle '-M -o', and we need to detect this. Also, some Intel # versions had trouble with output in subdirs. am__obj=sub/conftest.${OBJEXT-o} am__minus_obj="-o $am__obj" case $depmode in gcc) # This depmode causes a compiler race in universal mode. test "$am__universal" = false || continue ;; nosideeffect) # After this tag, mechanisms are not by side-effect, so they'll # only be used when explicitly requested. if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; msvc7 | msvc7msys | msvisualcpp | msvcmsys) # This compiler won't grok '-c -o', but also, the minuso test has # not run yet. These depmodes are late enough in the game, and # so weak that their functioning should not be impacted. am__obj=conftest.${OBJEXT-o} am__minus_obj= ;; none) break ;; esac if depmode=$depmode \ source=sub/conftest.c object=$am__obj \ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ >/dev/null 2>conftest.err && grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && grep $am__obj sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then # icc doesn't choke on unknown options, it will just issue warnings # or remarks (even with -Werror). So we grep stderr for any message # that says an option was ignored or not supported. # When given -MP, icc 7.0 and 7.1 complain thusly: # icc: Command line warning: ignoring option '-M'; no argument required # The diagnosis changed in icc 8.0: # icc: Command line remark: option '-MP' not supported if (grep 'ignoring option' conftest.err || grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else am_cv_CC_dependencies_compiler_type=$depmode break fi fi done cd .. rm -rf conftest.dir else am_cv_CC_dependencies_compiler_type=none fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CC_dependencies_compiler_type" >&5 $as_echo "$am_cv_CC_dependencies_compiler_type" >&6; } CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type if test "x$enable_dependency_tracking" != xno \ && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then am__fastdepCC_TRUE= am__fastdepCC_FALSE='#' else am__fastdepCC_TRUE='#' am__fastdepCC_FALSE= fi case `pwd` in *\ * | *\ *) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&5 $as_echo "$as_me: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&2;} ;; esac macro_version='2.4.2' macro_revision='1.3337' ltmain="$ac_aux_dir/ltmain.sh" # Make sure we can run config.sub. $SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 || as_fn_error $? "cannot run $SHELL $ac_aux_dir/config.sub" "$LINENO" 5 { $as_echo "$as_me:${as_lineno-$LINENO}: checking build system type" >&5 $as_echo_n "checking build system type... " >&6; } if ${ac_cv_build+:} false; then : $as_echo_n "(cached) " >&6 else ac_build_alias=$build_alias test "x$ac_build_alias" = x && ac_build_alias=`$SHELL "$ac_aux_dir/config.guess"` test "x$ac_build_alias" = x && as_fn_error $? "cannot guess build type; you must specify one" "$LINENO" 5 ac_cv_build=`$SHELL "$ac_aux_dir/config.sub" $ac_build_alias` || as_fn_error $? "$SHELL $ac_aux_dir/config.sub $ac_build_alias failed" "$LINENO" 5 fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5 $as_echo "$ac_cv_build" >&6; } case $ac_cv_build in *-*-*) ;; *) as_fn_error $? "invalid value of canonical build" "$LINENO" 5;; esac build=$ac_cv_build ac_save_IFS=$IFS; IFS='-' set x $ac_cv_build shift build_cpu=$1 build_vendor=$2 shift; shift # Remember, the first character of IFS is used to create $*, # except with old shells: build_os=$* IFS=$ac_save_IFS case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking host system type" >&5 $as_echo_n "checking host system type... " >&6; } if ${ac_cv_host+:} false; then : $as_echo_n "(cached) " >&6 else if test "x$host_alias" = x; then ac_cv_host=$ac_cv_build else ac_cv_host=`$SHELL "$ac_aux_dir/config.sub" $host_alias` || as_fn_error $? "$SHELL $ac_aux_dir/config.sub $host_alias failed" "$LINENO" 5 fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_host" >&5 $as_echo "$ac_cv_host" >&6; } case $ac_cv_host in *-*-*) ;; *) as_fn_error $? "invalid value of canonical host" "$LINENO" 5;; esac host=$ac_cv_host ac_save_IFS=$IFS; IFS='-' set x $ac_cv_host shift host_cpu=$1 host_vendor=$2 shift; shift # Remember, the first character of IFS is used to create $*, # except with old shells: host_os=$* IFS=$ac_save_IFS case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac # Backslashify metacharacters that are still active within # double-quoted strings. sed_quote_subst='s/\(["`$\\]\)/\\\1/g' # Same as above, but do not quote variable references. double_quote_subst='s/\(["`\\]\)/\\\1/g' # Sed substitution to delay expansion of an escaped shell variable in a # double_quote_subst'ed string. delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g' # Sed substitution to delay expansion of an escaped single quote. delay_single_quote_subst='s/'\''/'\'\\\\\\\'\''/g' # Sed substitution to avoid accidental globbing in evaled expressions no_glob_subst='s/\*/\\\*/g' ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to print strings" >&5 $as_echo_n "checking how to print strings... " >&6; } # Test print first, because it will be a builtin if present. if test "X`( print -r -- -n ) 2>/dev/null`" = X-n && \ test "X`print -r -- $ECHO 2>/dev/null`" = "X$ECHO"; then ECHO='print -r --' elif test "X`printf %s $ECHO 2>/dev/null`" = "X$ECHO"; then ECHO='printf %s\n' else # Use this function as a fallback that always works. func_fallback_echo () { eval 'cat <<_LTECHO_EOF $1 _LTECHO_EOF' } ECHO='func_fallback_echo' fi # func_echo_all arg... # Invoke $ECHO with all args, space-separated. func_echo_all () { $ECHO "" } case "$ECHO" in printf*) { $as_echo "$as_me:${as_lineno-$LINENO}: result: printf" >&5 $as_echo "printf" >&6; } ;; print*) { $as_echo "$as_me:${as_lineno-$LINENO}: result: print -r" >&5 $as_echo "print -r" >&6; } ;; *) { $as_echo "$as_me:${as_lineno-$LINENO}: result: cat" >&5 $as_echo "cat" >&6; } ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a sed that does not truncate output" >&5 $as_echo_n "checking for a sed that does not truncate output... " >&6; } if ${ac_cv_path_SED+:} false; then : $as_echo_n "(cached) " >&6 else ac_script=s/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/ for ac_i in 1 2 3 4 5 6 7; do ac_script="$ac_script$as_nl$ac_script" done echo "$ac_script" 2>/dev/null | sed 99q >conftest.sed { ac_script=; unset ac_script;} if test -z "$SED"; then ac_path_SED_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in sed gsed; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_SED="$as_dir/$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_SED" || continue # Check for GNU ac_path_SED and select it if it is found. # Check for GNU $ac_path_SED case `"$ac_path_SED" --version 2>&1` in *GNU*) ac_cv_path_SED="$ac_path_SED" ac_path_SED_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo '' >> "conftest.nl" "$ac_path_SED" -f conftest.sed < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_SED_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_SED="$ac_path_SED" ac_path_SED_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_SED_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_SED"; then as_fn_error $? "no acceptable sed could be found in \$PATH" "$LINENO" 5 fi else ac_cv_path_SED=$SED fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_SED" >&5 $as_echo "$ac_cv_path_SED" >&6; } SED="$ac_cv_path_SED" rm -f conftest.sed test -z "$SED" && SED=sed Xsed="$SED -e 1s/^X//" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5 $as_echo_n "checking for grep that handles long lines and -e... " >&6; } if ${ac_cv_path_GREP+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$GREP"; then ac_path_GREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in grep ggrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_GREP" || continue # Check for GNU ac_path_GREP and select it if it is found. # Check for GNU $ac_path_GREP case `"$ac_path_GREP" --version 2>&1` in *GNU*) ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'GREP' >> "conftest.nl" "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_GREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_GREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_GREP"; then as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_GREP=$GREP fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5 $as_echo "$ac_cv_path_GREP" >&6; } GREP="$ac_cv_path_GREP" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5 $as_echo_n "checking for egrep... " >&6; } if ${ac_cv_path_EGREP+:} false; then : $as_echo_n "(cached) " >&6 else if echo a | $GREP -E '(a|b)' >/dev/null 2>&1 then ac_cv_path_EGREP="$GREP -E" else if test -z "$EGREP"; then ac_path_EGREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in egrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_EGREP" || continue # Check for GNU ac_path_EGREP and select it if it is found. # Check for GNU $ac_path_EGREP case `"$ac_path_EGREP" --version 2>&1` in *GNU*) ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'EGREP' >> "conftest.nl" "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_EGREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_EGREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_EGREP"; then as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_EGREP=$EGREP fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5 $as_echo "$ac_cv_path_EGREP" >&6; } EGREP="$ac_cv_path_EGREP" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for fgrep" >&5 $as_echo_n "checking for fgrep... " >&6; } if ${ac_cv_path_FGREP+:} false; then : $as_echo_n "(cached) " >&6 else if echo 'ab*c' | $GREP -F 'ab*c' >/dev/null 2>&1 then ac_cv_path_FGREP="$GREP -F" else if test -z "$FGREP"; then ac_path_FGREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in fgrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_FGREP="$as_dir/$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_FGREP" || continue # Check for GNU ac_path_FGREP and select it if it is found. # Check for GNU $ac_path_FGREP case `"$ac_path_FGREP" --version 2>&1` in *GNU*) ac_cv_path_FGREP="$ac_path_FGREP" ac_path_FGREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'FGREP' >> "conftest.nl" "$ac_path_FGREP" FGREP < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_FGREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_FGREP="$ac_path_FGREP" ac_path_FGREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_FGREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_FGREP"; then as_fn_error $? "no acceptable fgrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_FGREP=$FGREP fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_FGREP" >&5 $as_echo "$ac_cv_path_FGREP" >&6; } FGREP="$ac_cv_path_FGREP" test -z "$GREP" && GREP=grep # Check whether --with-gnu-ld was given. if test "${with_gnu_ld+set}" = set; then : withval=$with_gnu_ld; test "$withval" = no || with_gnu_ld=yes else with_gnu_ld=no fi ac_prog=ld if test "$GCC" = yes; then # Check if gcc -print-prog-name=ld gives a path. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld used by $CC" >&5 $as_echo_n "checking for ld used by $CC... " >&6; } case $host in *-*-mingw*) # gcc leaves a trailing carriage return which upsets mingw ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; *) ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; esac case $ac_prog in # Accept absolute paths. [\\/]* | ?:[\\/]*) re_direlt='/[^/][^/]*/\.\./' # Canonicalize the pathname of ld ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'` while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"` done test -z "$LD" && LD="$ac_prog" ;; "") # If it fails, then pretend we aren't using GCC. ac_prog=ld ;; *) # If it is relative, then search for the first ld in PATH. with_gnu_ld=unknown ;; esac elif test "$with_gnu_ld" = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5 $as_echo_n "checking for GNU ld... " >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5 $as_echo_n "checking for non-GNU ld... " >&6; } fi if ${lt_cv_path_LD+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$LD"; then lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR for ac_dir in $PATH; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then lt_cv_path_LD="$ac_dir/$ac_prog" # Check to see if the program is GNU ld. I'd rather use --version, # but apparently some variants of GNU ld only accept -v. # Break only if it was the GNU/non-GNU ld that we prefer. case `"$lt_cv_path_LD" -v 2>&1 &5 $as_echo "$LD" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -z "$LD" && as_fn_error $? "no acceptable ld found in \$PATH" "$LINENO" 5 { $as_echo "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5 $as_echo_n "checking if the linker ($LD) is GNU ld... " >&6; } if ${lt_cv_prog_gnu_ld+:} false; then : $as_echo_n "(cached) " >&6 else # I'd rather use --version here, but apparently some GNU lds only accept -v. case `$LD -v 2>&1 &5 $as_echo "$lt_cv_prog_gnu_ld" >&6; } with_gnu_ld=$lt_cv_prog_gnu_ld { $as_echo "$as_me:${as_lineno-$LINENO}: checking for BSD- or MS-compatible name lister (nm)" >&5 $as_echo_n "checking for BSD- or MS-compatible name lister (nm)... " >&6; } if ${lt_cv_path_NM+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$NM"; then # Let the user override the test. lt_cv_path_NM="$NM" else lt_nm_to_check="${ac_tool_prefix}nm" if test -n "$ac_tool_prefix" && test "$build" = "$host"; then lt_nm_to_check="$lt_nm_to_check nm" fi for lt_tmp_nm in $lt_nm_to_check; do lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. tmp_nm="$ac_dir/$lt_tmp_nm" if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext" ; then # Check to see if the nm accepts a BSD-compat flag. # Adding the `sed 1q' prevents false positives on HP-UX, which says: # nm: unknown option "B" ignored # Tru64's nm complains that /dev/null is an invalid object file case `"$tmp_nm" -B /dev/null 2>&1 | sed '1q'` in */dev/null* | *'Invalid file or object type'*) lt_cv_path_NM="$tmp_nm -B" break ;; *) case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in */dev/null*) lt_cv_path_NM="$tmp_nm -p" break ;; *) lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but continue # so that we can try to find one that supports BSD flags ;; esac ;; esac fi done IFS="$lt_save_ifs" done : ${lt_cv_path_NM=no} fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_NM" >&5 $as_echo "$lt_cv_path_NM" >&6; } if test "$lt_cv_path_NM" != "no"; then NM="$lt_cv_path_NM" else # Didn't find any BSD compatible name lister, look for dumpbin. if test -n "$DUMPBIN"; then : # Let the user override the test. else if test -n "$ac_tool_prefix"; then for ac_prog in dumpbin "link -dump" do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_DUMPBIN+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$DUMPBIN"; then ac_cv_prog_DUMPBIN="$DUMPBIN" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_DUMPBIN="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi DUMPBIN=$ac_cv_prog_DUMPBIN if test -n "$DUMPBIN"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DUMPBIN" >&5 $as_echo "$DUMPBIN" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$DUMPBIN" && break done fi if test -z "$DUMPBIN"; then ac_ct_DUMPBIN=$DUMPBIN for ac_prog in dumpbin "link -dump" do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_DUMPBIN+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_DUMPBIN"; then ac_cv_prog_ac_ct_DUMPBIN="$ac_ct_DUMPBIN" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_DUMPBIN="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_DUMPBIN=$ac_cv_prog_ac_ct_DUMPBIN if test -n "$ac_ct_DUMPBIN"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DUMPBIN" >&5 $as_echo "$ac_ct_DUMPBIN" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_DUMPBIN" && break done if test "x$ac_ct_DUMPBIN" = x; then DUMPBIN=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac DUMPBIN=$ac_ct_DUMPBIN fi fi case `$DUMPBIN -symbols /dev/null 2>&1 | sed '1q'` in *COFF*) DUMPBIN="$DUMPBIN -symbols" ;; *) DUMPBIN=: ;; esac fi if test "$DUMPBIN" != ":"; then NM="$DUMPBIN" fi fi test -z "$NM" && NM=nm { $as_echo "$as_me:${as_lineno-$LINENO}: checking the name lister ($NM) interface" >&5 $as_echo_n "checking the name lister ($NM) interface... " >&6; } if ${lt_cv_nm_interface+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_nm_interface="BSD nm" echo "int some_variable = 0;" > conftest.$ac_ext (eval echo "\"\$as_me:$LINENO: $ac_compile\"" >&5) (eval "$ac_compile" 2>conftest.err) cat conftest.err >&5 (eval echo "\"\$as_me:$LINENO: $NM \\\"conftest.$ac_objext\\\"\"" >&5) (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out) cat conftest.err >&5 (eval echo "\"\$as_me:$LINENO: output\"" >&5) cat conftest.out >&5 if $GREP 'External.*some_variable' conftest.out > /dev/null; then lt_cv_nm_interface="MS dumpbin" fi rm -f conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_nm_interface" >&5 $as_echo "$lt_cv_nm_interface" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ln -s works" >&5 $as_echo_n "checking whether ln -s works... " >&6; } LN_S=$as_ln_s if test "$LN_S" = "ln -s"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no, using $LN_S" >&5 $as_echo "no, using $LN_S" >&6; } fi # find the maximum length of command line arguments { $as_echo "$as_me:${as_lineno-$LINENO}: checking the maximum length of command line arguments" >&5 $as_echo_n "checking the maximum length of command line arguments... " >&6; } if ${lt_cv_sys_max_cmd_len+:} false; then : $as_echo_n "(cached) " >&6 else i=0 teststring="ABCD" case $build_os in msdosdjgpp*) # On DJGPP, this test can blow up pretty badly due to problems in libc # (any single argument exceeding 2000 bytes causes a buffer overrun # during glob expansion). Even if it were fixed, the result of this # check would be larger than it should be. lt_cv_sys_max_cmd_len=12288; # 12K is about right ;; gnu*) # Under GNU Hurd, this test is not required because there is # no limit to the length of command line arguments. # Libtool will interpret -1 as no limit whatsoever lt_cv_sys_max_cmd_len=-1; ;; cygwin* | mingw* | cegcc*) # On Win9x/ME, this test blows up -- it succeeds, but takes # about 5 minutes as the teststring grows exponentially. # Worse, since 9x/ME are not pre-emptively multitasking, # you end up with a "frozen" computer, even though with patience # the test eventually succeeds (with a max line length of 256k). # Instead, let's just punt: use the minimum linelength reported by # all of the supported platforms: 8192 (on NT/2K/XP). lt_cv_sys_max_cmd_len=8192; ;; mint*) # On MiNT this can take a long time and run out of memory. lt_cv_sys_max_cmd_len=8192; ;; amigaos*) # On AmigaOS with pdksh, this test takes hours, literally. # So we just punt and use a minimum line length of 8192. lt_cv_sys_max_cmd_len=8192; ;; netbsd* | freebsd* | openbsd* | darwin* | dragonfly*) # This has been around since 386BSD, at least. Likely further. if test -x /sbin/sysctl; then lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax` elif test -x /usr/sbin/sysctl; then lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax` else lt_cv_sys_max_cmd_len=65536 # usable default for all BSDs fi # And add a safety zone lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` ;; interix*) # We know the value 262144 and hardcode it with a safety zone (like BSD) lt_cv_sys_max_cmd_len=196608 ;; os2*) # The test takes a long time on OS/2. lt_cv_sys_max_cmd_len=8192 ;; osf*) # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not # nice to cause kernel panics so lets avoid the loop below. # First set a reasonable default. lt_cv_sys_max_cmd_len=16384 # if test -x /sbin/sysconfig; then case `/sbin/sysconfig -q proc exec_disable_arg_limit` in *1*) lt_cv_sys_max_cmd_len=-1 ;; esac fi ;; sco3.2v5*) lt_cv_sys_max_cmd_len=102400 ;; sysv5* | sco5v6* | sysv4.2uw2*) kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null` if test -n "$kargmax"; then lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[ ]//'` else lt_cv_sys_max_cmd_len=32768 fi ;; *) lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null` if test -n "$lt_cv_sys_max_cmd_len"; then lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` else # Make teststring a little bigger before we do anything with it. # a 1K string should be a reasonable start. for i in 1 2 3 4 5 6 7 8 ; do teststring=$teststring$teststring done SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}} # If test is not a shell built-in, we'll probably end up computing a # maximum length that is only half of the actual maximum length, but # we can't tell. while { test "X"`env echo "$teststring$teststring" 2>/dev/null` \ = "X$teststring$teststring"; } >/dev/null 2>&1 && test $i != 17 # 1/2 MB should be enough do i=`expr $i + 1` teststring=$teststring$teststring done # Only check the string length outside the loop. lt_cv_sys_max_cmd_len=`expr "X$teststring" : ".*" 2>&1` teststring= # Add a significant safety factor because C++ compilers can tack on # massive amounts of additional arguments before passing them to the # linker. It appears as though 1/2 is a usable value. lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2` fi ;; esac fi if test -n $lt_cv_sys_max_cmd_len ; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sys_max_cmd_len" >&5 $as_echo "$lt_cv_sys_max_cmd_len" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: none" >&5 $as_echo "none" >&6; } fi max_cmd_len=$lt_cv_sys_max_cmd_len : ${CP="cp -f"} : ${MV="mv -f"} : ${RM="rm -f"} { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the shell understands some XSI constructs" >&5 $as_echo_n "checking whether the shell understands some XSI constructs... " >&6; } # Try some XSI features xsi_shell=no ( _lt_dummy="a/b/c" test "${_lt_dummy##*/},${_lt_dummy%/*},${_lt_dummy#??}"${_lt_dummy%"$_lt_dummy"}, \ = c,a/b,b/c, \ && eval 'test $(( 1 + 1 )) -eq 2 \ && test "${#_lt_dummy}" -eq 5' ) >/dev/null 2>&1 \ && xsi_shell=yes { $as_echo "$as_me:${as_lineno-$LINENO}: result: $xsi_shell" >&5 $as_echo "$xsi_shell" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the shell understands \"+=\"" >&5 $as_echo_n "checking whether the shell understands \"+=\"... " >&6; } lt_shell_append=no ( foo=bar; set foo baz; eval "$1+=\$2" && test "$foo" = barbaz ) \ >/dev/null 2>&1 \ && lt_shell_append=yes { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_shell_append" >&5 $as_echo "$lt_shell_append" >&6; } if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then lt_unset=unset else lt_unset=false fi # test EBCDIC or ASCII case `echo X|tr X '\101'` in A) # ASCII based system # \n is not interpreted correctly by Solaris 8 /usr/ucb/tr lt_SP2NL='tr \040 \012' lt_NL2SP='tr \015\012 \040\040' ;; *) # EBCDIC based system lt_SP2NL='tr \100 \n' lt_NL2SP='tr \r\n \100\100' ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to convert $build file names to $host format" >&5 $as_echo_n "checking how to convert $build file names to $host format... " >&6; } if ${lt_cv_to_host_file_cmd+:} false; then : $as_echo_n "(cached) " >&6 else case $host in *-*-mingw* ) case $build in *-*-mingw* ) # actually msys lt_cv_to_host_file_cmd=func_convert_file_msys_to_w32 ;; *-*-cygwin* ) lt_cv_to_host_file_cmd=func_convert_file_cygwin_to_w32 ;; * ) # otherwise, assume *nix lt_cv_to_host_file_cmd=func_convert_file_nix_to_w32 ;; esac ;; *-*-cygwin* ) case $build in *-*-mingw* ) # actually msys lt_cv_to_host_file_cmd=func_convert_file_msys_to_cygwin ;; *-*-cygwin* ) lt_cv_to_host_file_cmd=func_convert_file_noop ;; * ) # otherwise, assume *nix lt_cv_to_host_file_cmd=func_convert_file_nix_to_cygwin ;; esac ;; * ) # unhandled hosts (and "normal" native builds) lt_cv_to_host_file_cmd=func_convert_file_noop ;; esac fi to_host_file_cmd=$lt_cv_to_host_file_cmd { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_to_host_file_cmd" >&5 $as_echo "$lt_cv_to_host_file_cmd" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to convert $build file names to toolchain format" >&5 $as_echo_n "checking how to convert $build file names to toolchain format... " >&6; } if ${lt_cv_to_tool_file_cmd+:} false; then : $as_echo_n "(cached) " >&6 else #assume ordinary cross tools, or native build. lt_cv_to_tool_file_cmd=func_convert_file_noop case $host in *-*-mingw* ) case $build in *-*-mingw* ) # actually msys lt_cv_to_tool_file_cmd=func_convert_file_msys_to_w32 ;; esac ;; esac fi to_tool_file_cmd=$lt_cv_to_tool_file_cmd { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_to_tool_file_cmd" >&5 $as_echo "$lt_cv_to_tool_file_cmd" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $LD option to reload object files" >&5 $as_echo_n "checking for $LD option to reload object files... " >&6; } if ${lt_cv_ld_reload_flag+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_ld_reload_flag='-r' fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_reload_flag" >&5 $as_echo "$lt_cv_ld_reload_flag" >&6; } reload_flag=$lt_cv_ld_reload_flag case $reload_flag in "" | " "*) ;; *) reload_flag=" $reload_flag" ;; esac reload_cmds='$LD$reload_flag -o $output$reload_objs' case $host_os in cygwin* | mingw* | pw32* | cegcc*) if test "$GCC" != yes; then reload_cmds=false fi ;; darwin*) if test "$GCC" = yes; then reload_cmds='$LTCC $LTCFLAGS -nostdlib ${wl}-r -o $output$reload_objs' else reload_cmds='$LD$reload_flag -o $output$reload_objs' fi ;; esac if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}objdump", so it can be a program name with args. set dummy ${ac_tool_prefix}objdump; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_OBJDUMP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$OBJDUMP"; then ac_cv_prog_OBJDUMP="$OBJDUMP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_OBJDUMP="${ac_tool_prefix}objdump" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi OBJDUMP=$ac_cv_prog_OBJDUMP if test -n "$OBJDUMP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OBJDUMP" >&5 $as_echo "$OBJDUMP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_OBJDUMP"; then ac_ct_OBJDUMP=$OBJDUMP # Extract the first word of "objdump", so it can be a program name with args. set dummy objdump; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_OBJDUMP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_OBJDUMP"; then ac_cv_prog_ac_ct_OBJDUMP="$ac_ct_OBJDUMP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_OBJDUMP="objdump" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_OBJDUMP=$ac_cv_prog_ac_ct_OBJDUMP if test -n "$ac_ct_OBJDUMP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OBJDUMP" >&5 $as_echo "$ac_ct_OBJDUMP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_OBJDUMP" = x; then OBJDUMP="false" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac OBJDUMP=$ac_ct_OBJDUMP fi else OBJDUMP="$ac_cv_prog_OBJDUMP" fi test -z "$OBJDUMP" && OBJDUMP=objdump { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to recognize dependent libraries" >&5 $as_echo_n "checking how to recognize dependent libraries... " >&6; } if ${lt_cv_deplibs_check_method+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_file_magic_cmd='$MAGIC_CMD' lt_cv_file_magic_test_file= lt_cv_deplibs_check_method='unknown' # Need to set the preceding variable on all platforms that support # interlibrary dependencies. # 'none' -- dependencies not supported. # `unknown' -- same as none, but documents that we really don't know. # 'pass_all' -- all dependencies passed with no checks. # 'test_compile' -- check by making test program. # 'file_magic [[regex]]' -- check by looking for files in library path # which responds to the $file_magic_cmd with a given extended regex. # If you have `file' or equivalent on your system and you're not sure # whether `pass_all' will *always* work, you probably want this one. case $host_os in aix[4-9]*) lt_cv_deplibs_check_method=pass_all ;; beos*) lt_cv_deplibs_check_method=pass_all ;; bsdi[45]*) lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib)' lt_cv_file_magic_cmd='/usr/bin/file -L' lt_cv_file_magic_test_file=/shlib/libc.so ;; cygwin*) # func_win32_libid is a shell function defined in ltmain.sh lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' lt_cv_file_magic_cmd='func_win32_libid' ;; mingw* | pw32*) # Base MSYS/MinGW do not provide the 'file' command needed by # func_win32_libid shell function, so use a weaker test based on 'objdump', # unless we find 'file', for example because we are cross-compiling. # func_win32_libid assumes BSD nm, so disallow it if using MS dumpbin. if ( test "$lt_cv_nm_interface" = "BSD nm" && file / ) >/dev/null 2>&1; then lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' lt_cv_file_magic_cmd='func_win32_libid' else # Keep this pattern in sync with the one in func_win32_libid. lt_cv_deplibs_check_method='file_magic file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)' lt_cv_file_magic_cmd='$OBJDUMP -f' fi ;; cegcc*) # use the weaker test based on 'objdump'. See mingw*. lt_cv_deplibs_check_method='file_magic file format pe-arm-.*little(.*architecture: arm)?' lt_cv_file_magic_cmd='$OBJDUMP -f' ;; darwin* | rhapsody*) lt_cv_deplibs_check_method=pass_all ;; freebsd* | dragonfly*) if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then case $host_cpu in i*86 ) # Not sure whether the presence of OpenBSD here was a mistake. # Let's accept both of them until this is cleared up. lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[3-9]86 (compact )?demand paged shared library' lt_cv_file_magic_cmd=/usr/bin/file lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*` ;; esac else lt_cv_deplibs_check_method=pass_all fi ;; gnu*) lt_cv_deplibs_check_method=pass_all ;; haiku*) lt_cv_deplibs_check_method=pass_all ;; hpux10.20* | hpux11*) lt_cv_file_magic_cmd=/usr/bin/file case $host_cpu in ia64*) lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - IA64' lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so ;; hppa*64*) lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF[ -][0-9][0-9])(-bit)?( [LM]SB)? shared object( file)?[, -]* PA-RISC [0-9]\.[0-9]' lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl ;; *) lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|PA-RISC[0-9]\.[0-9]) shared library' lt_cv_file_magic_test_file=/usr/lib/libc.sl ;; esac ;; interix[3-9]*) # PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|\.a)$' ;; irix5* | irix6* | nonstopux*) case $LD in *-32|*"-32 ") libmagic=32-bit;; *-n32|*"-n32 ") libmagic=N32;; *-64|*"-64 ") libmagic=64-bit;; *) libmagic=never-match;; esac lt_cv_deplibs_check_method=pass_all ;; # This must be glibc/ELF. linux* | k*bsd*-gnu | kopensolaris*-gnu) lt_cv_deplibs_check_method=pass_all ;; netbsd*) if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$' else lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|_pic\.a)$' fi ;; newos6*) lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (executable|dynamic lib)' lt_cv_file_magic_cmd=/usr/bin/file lt_cv_file_magic_test_file=/usr/lib/libnls.so ;; *nto* | *qnx*) lt_cv_deplibs_check_method=pass_all ;; openbsd*) if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|\.so|_pic\.a)$' else lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$' fi ;; osf3* | osf4* | osf5*) lt_cv_deplibs_check_method=pass_all ;; rdos*) lt_cv_deplibs_check_method=pass_all ;; solaris*) lt_cv_deplibs_check_method=pass_all ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) lt_cv_deplibs_check_method=pass_all ;; sysv4 | sysv4.3*) case $host_vendor in motorola) lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib) M[0-9][0-9]* Version [0-9]' lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*` ;; ncr) lt_cv_deplibs_check_method=pass_all ;; sequent) lt_cv_file_magic_cmd='/bin/file' lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [LM]SB (shared object|dynamic lib )' ;; sni) lt_cv_file_magic_cmd='/bin/file' lt_cv_deplibs_check_method="file_magic ELF [0-9][0-9]*-bit [LM]SB dynamic lib" lt_cv_file_magic_test_file=/lib/libc.so ;; siemens) lt_cv_deplibs_check_method=pass_all ;; pc) lt_cv_deplibs_check_method=pass_all ;; esac ;; tpf*) lt_cv_deplibs_check_method=pass_all ;; esac fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_deplibs_check_method" >&5 $as_echo "$lt_cv_deplibs_check_method" >&6; } file_magic_glob= want_nocaseglob=no if test "$build" = "$host"; then case $host_os in mingw* | pw32*) if ( shopt | grep nocaseglob ) >/dev/null 2>&1; then want_nocaseglob=yes else file_magic_glob=`echo aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ | $SED -e "s/\(..\)/s\/[\1]\/[\1]\/g;/g"` fi ;; esac fi file_magic_cmd=$lt_cv_file_magic_cmd deplibs_check_method=$lt_cv_deplibs_check_method test -z "$deplibs_check_method" && deplibs_check_method=unknown if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}dlltool", so it can be a program name with args. set dummy ${ac_tool_prefix}dlltool; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_DLLTOOL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$DLLTOOL"; then ac_cv_prog_DLLTOOL="$DLLTOOL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_DLLTOOL="${ac_tool_prefix}dlltool" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi DLLTOOL=$ac_cv_prog_DLLTOOL if test -n "$DLLTOOL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DLLTOOL" >&5 $as_echo "$DLLTOOL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_DLLTOOL"; then ac_ct_DLLTOOL=$DLLTOOL # Extract the first word of "dlltool", so it can be a program name with args. set dummy dlltool; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_DLLTOOL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_DLLTOOL"; then ac_cv_prog_ac_ct_DLLTOOL="$ac_ct_DLLTOOL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_DLLTOOL="dlltool" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_DLLTOOL=$ac_cv_prog_ac_ct_DLLTOOL if test -n "$ac_ct_DLLTOOL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DLLTOOL" >&5 $as_echo "$ac_ct_DLLTOOL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_DLLTOOL" = x; then DLLTOOL="false" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac DLLTOOL=$ac_ct_DLLTOOL fi else DLLTOOL="$ac_cv_prog_DLLTOOL" fi test -z "$DLLTOOL" && DLLTOOL=dlltool { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to associate runtime and link libraries" >&5 $as_echo_n "checking how to associate runtime and link libraries... " >&6; } if ${lt_cv_sharedlib_from_linklib_cmd+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_sharedlib_from_linklib_cmd='unknown' case $host_os in cygwin* | mingw* | pw32* | cegcc*) # two different shell functions defined in ltmain.sh # decide which to use based on capabilities of $DLLTOOL case `$DLLTOOL --help 2>&1` in *--identify-strict*) lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib ;; *) lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib_fallback ;; esac ;; *) # fallback: assume linklib IS sharedlib lt_cv_sharedlib_from_linklib_cmd="$ECHO" ;; esac fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sharedlib_from_linklib_cmd" >&5 $as_echo "$lt_cv_sharedlib_from_linklib_cmd" >&6; } sharedlib_from_linklib_cmd=$lt_cv_sharedlib_from_linklib_cmd test -z "$sharedlib_from_linklib_cmd" && sharedlib_from_linklib_cmd=$ECHO if test -n "$ac_tool_prefix"; then for ac_prog in ar do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_AR+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$AR"; then ac_cv_prog_AR="$AR" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_AR="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi AR=$ac_cv_prog_AR if test -n "$AR"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AR" >&5 $as_echo "$AR" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$AR" && break done fi if test -z "$AR"; then ac_ct_AR=$AR for ac_prog in ar do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_AR+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_AR"; then ac_cv_prog_ac_ct_AR="$ac_ct_AR" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_AR="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_AR=$ac_cv_prog_ac_ct_AR if test -n "$ac_ct_AR"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_AR" >&5 $as_echo "$ac_ct_AR" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_AR" && break done if test "x$ac_ct_AR" = x; then AR="false" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac AR=$ac_ct_AR fi fi : ${AR=ar} : ${AR_FLAGS=cru} { $as_echo "$as_me:${as_lineno-$LINENO}: checking for archiver @FILE support" >&5 $as_echo_n "checking for archiver @FILE support... " >&6; } if ${lt_cv_ar_at_file+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_ar_at_file=no cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : echo conftest.$ac_objext > conftest.lst lt_ar_try='$AR $AR_FLAGS libconftest.a @conftest.lst >&5' { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$lt_ar_try\""; } >&5 (eval $lt_ar_try) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } if test "$ac_status" -eq 0; then # Ensure the archiver fails upon bogus file names. rm -f conftest.$ac_objext libconftest.a { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$lt_ar_try\""; } >&5 (eval $lt_ar_try) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } if test "$ac_status" -ne 0; then lt_cv_ar_at_file=@ fi fi rm -f conftest.* libconftest.a fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ar_at_file" >&5 $as_echo "$lt_cv_ar_at_file" >&6; } if test "x$lt_cv_ar_at_file" = xno; then archiver_list_spec= else archiver_list_spec=$lt_cv_ar_at_file fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. set dummy ${ac_tool_prefix}strip; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_STRIP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$STRIP"; then ac_cv_prog_STRIP="$STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_STRIP="${ac_tool_prefix}strip" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi STRIP=$ac_cv_prog_STRIP if test -n "$STRIP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5 $as_echo "$STRIP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_STRIP"; then ac_ct_STRIP=$STRIP # Extract the first word of "strip", so it can be a program name with args. set dummy strip; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_STRIP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_STRIP"; then ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_STRIP="strip" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP if test -n "$ac_ct_STRIP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5 $as_echo "$ac_ct_STRIP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_STRIP" = x; then STRIP=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac STRIP=$ac_ct_STRIP fi else STRIP="$ac_cv_prog_STRIP" fi test -z "$STRIP" && STRIP=: if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args. set dummy ${ac_tool_prefix}ranlib; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_RANLIB+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$RANLIB"; then ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi RANLIB=$ac_cv_prog_RANLIB if test -n "$RANLIB"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RANLIB" >&5 $as_echo "$RANLIB" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_RANLIB"; then ac_ct_RANLIB=$RANLIB # Extract the first word of "ranlib", so it can be a program name with args. set dummy ranlib; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_RANLIB+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_RANLIB"; then ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_RANLIB="ranlib" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB if test -n "$ac_ct_RANLIB"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB" >&5 $as_echo "$ac_ct_RANLIB" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_RANLIB" = x; then RANLIB=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac RANLIB=$ac_ct_RANLIB fi else RANLIB="$ac_cv_prog_RANLIB" fi test -z "$RANLIB" && RANLIB=: # Determine commands to create old-style static archives. old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs' old_postinstall_cmds='chmod 644 $oldlib' old_postuninstall_cmds= if test -n "$RANLIB"; then case $host_os in openbsd*) old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$tool_oldlib" ;; *) old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$tool_oldlib" ;; esac old_archive_cmds="$old_archive_cmds~\$RANLIB \$tool_oldlib" fi case $host_os in darwin*) lock_old_archive_extraction=yes ;; *) lock_old_archive_extraction=no ;; esac # If no C compiler was specified, use CC. LTCC=${LTCC-"$CC"} # If no C compiler flags were specified, use CFLAGS. LTCFLAGS=${LTCFLAGS-"$CFLAGS"} # Allow CC to be a program name with arguments. compiler=$CC # Check for command to grab the raw symbol name followed by C symbol from nm. { $as_echo "$as_me:${as_lineno-$LINENO}: checking command to parse $NM output from $compiler object" >&5 $as_echo_n "checking command to parse $NM output from $compiler object... " >&6; } if ${lt_cv_sys_global_symbol_pipe+:} false; then : $as_echo_n "(cached) " >&6 else # These are sane defaults that work on at least a few old systems. # [They come from Ultrix. What could be older than Ultrix?!! ;)] # Character class describing NM global symbol codes. symcode='[BCDEGRST]' # Regexp to match symbols that can be accessed directly from C. sympat='\([_A-Za-z][_A-Za-z0-9]*\)' # Define system-specific variables. case $host_os in aix*) symcode='[BCDT]' ;; cygwin* | mingw* | pw32* | cegcc*) symcode='[ABCDGISTW]' ;; hpux*) if test "$host_cpu" = ia64; then symcode='[ABCDEGRST]' fi ;; irix* | nonstopux*) symcode='[BCDEGRST]' ;; osf*) symcode='[BCDEGQRST]' ;; solaris*) symcode='[BDRT]' ;; sco3.2v5*) symcode='[DT]' ;; sysv4.2uw2*) symcode='[DT]' ;; sysv5* | sco5v6* | unixware* | OpenUNIX*) symcode='[ABDT]' ;; sysv4) symcode='[DFNSTU]' ;; esac # If we're using GNU nm, then use its standard symbol codes. case `$NM -V 2>&1` in *GNU* | *'with BFD'*) symcode='[ABCDGIRSTW]' ;; esac # Transform an extracted symbol line into a proper C declaration. # Some systems (esp. on ia64) link data and code symbols differently, # so use this general approach. lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'" # Transform an extracted symbol line into symbol name and symbol address lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([^ ]*\)[ ]*$/ {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([^ ]*\) \([^ ]*\)$/ {\"\2\", (void *) \&\2},/p'" lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="sed -n -e 's/^: \([^ ]*\)[ ]*$/ {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([^ ]*\) \(lib[^ ]*\)$/ {\"\2\", (void *) \&\2},/p' -e 's/^$symcode* \([^ ]*\) \([^ ]*\)$/ {\"lib\2\", (void *) \&\2},/p'" # Handle CRLF in mingw tool chain opt_cr= case $build_os in mingw*) opt_cr=`$ECHO 'x\{0,1\}' | tr x '\015'` # option cr in regexp ;; esac # Try without a prefix underscore, then with it. for ac_symprfx in "" "_"; do # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol. symxfrm="\\1 $ac_symprfx\\2 \\2" # Write the raw and C identifiers. if test "$lt_cv_nm_interface" = "MS dumpbin"; then # Fake it for dumpbin and say T for any non-static function # and D for any global variable. # Also find C++ and __fastcall symbols from MSVC++, # which start with @ or ?. lt_cv_sys_global_symbol_pipe="$AWK '"\ " {last_section=section; section=\$ 3};"\ " /^COFF SYMBOL TABLE/{for(i in hide) delete hide[i]};"\ " /Section length .*#relocs.*(pick any)/{hide[last_section]=1};"\ " \$ 0!~/External *\|/{next};"\ " / 0+ UNDEF /{next}; / UNDEF \([^|]\)*()/{next};"\ " {if(hide[section]) next};"\ " {f=0}; \$ 0~/\(\).*\|/{f=1}; {printf f ? \"T \" : \"D \"};"\ " {split(\$ 0, a, /\||\r/); split(a[2], s)};"\ " s[1]~/^[@?]/{print s[1], s[1]; next};"\ " s[1]~prfx {split(s[1],t,\"@\"); print t[1], substr(t[1],length(prfx))}"\ " ' prfx=^$ac_symprfx" else lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[ ]\($symcode$symcode*\)[ ][ ]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'" fi lt_cv_sys_global_symbol_pipe="$lt_cv_sys_global_symbol_pipe | sed '/ __gnu_lto/d'" # Check to see that the pipe works correctly. pipe_works=no rm -f conftest* cat > conftest.$ac_ext <<_LT_EOF #ifdef __cplusplus extern "C" { #endif char nm_test_var; void nm_test_func(void); void nm_test_func(void){} #ifdef __cplusplus } #endif int main(){nm_test_var='a';nm_test_func();return(0);} _LT_EOF if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then # Now try to grab the symbols. nlist=conftest.nm if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist\""; } >&5 (eval $NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && test -s "$nlist"; then # Try sorting and uniquifying the output. if sort "$nlist" | uniq > "$nlist"T; then mv -f "$nlist"T "$nlist" else rm -f "$nlist"T fi # Make sure that we snagged all the symbols we need. if $GREP ' nm_test_var$' "$nlist" >/dev/null; then if $GREP ' nm_test_func$' "$nlist" >/dev/null; then cat <<_LT_EOF > conftest.$ac_ext /* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests. */ #if defined(_WIN32) || defined(__CYGWIN__) || defined(_WIN32_WCE) /* DATA imports from DLLs on WIN32 con't be const, because runtime relocations are performed -- see ld's documentation on pseudo-relocs. */ # define LT_DLSYM_CONST #elif defined(__osf__) /* This system does not cope well with relocations in const data. */ # define LT_DLSYM_CONST #else # define LT_DLSYM_CONST const #endif #ifdef __cplusplus extern "C" { #endif _LT_EOF # Now generate the symbol file. eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | $GREP -v main >> conftest.$ac_ext' cat <<_LT_EOF >> conftest.$ac_ext /* The mapping between symbol names and symbols. */ LT_DLSYM_CONST struct { const char *name; void *address; } lt__PROGRAM__LTX_preloaded_symbols[] = { { "@PROGRAM@", (void *) 0 }, _LT_EOF $SED "s/^$symcode$symcode* \(.*\) \(.*\)$/ {\"\2\", (void *) \&\2},/" < "$nlist" | $GREP -v main >> conftest.$ac_ext cat <<\_LT_EOF >> conftest.$ac_ext {0, (void *) 0} }; /* This works around a problem in FreeBSD linker */ #ifdef FREEBSD_WORKAROUND static const void *lt_preloaded_setup() { return lt__PROGRAM__LTX_preloaded_symbols; } #endif #ifdef __cplusplus } #endif _LT_EOF # Now try linking the two files. mv conftest.$ac_objext conftstm.$ac_objext lt_globsym_save_LIBS=$LIBS lt_globsym_save_CFLAGS=$CFLAGS LIBS="conftstm.$ac_objext" CFLAGS="$CFLAGS$lt_prog_compiler_no_builtin_flag" if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 (eval $ac_link) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && test -s conftest${ac_exeext}; then pipe_works=yes fi LIBS=$lt_globsym_save_LIBS CFLAGS=$lt_globsym_save_CFLAGS else echo "cannot find nm_test_func in $nlist" >&5 fi else echo "cannot find nm_test_var in $nlist" >&5 fi else echo "cannot run $lt_cv_sys_global_symbol_pipe" >&5 fi else echo "$progname: failed program was:" >&5 cat conftest.$ac_ext >&5 fi rm -rf conftest* conftst* # Do not use the global_symbol_pipe unless it works. if test "$pipe_works" = yes; then break else lt_cv_sys_global_symbol_pipe= fi done fi if test -z "$lt_cv_sys_global_symbol_pipe"; then lt_cv_sys_global_symbol_to_cdecl= fi if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: failed" >&5 $as_echo "failed" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: ok" >&5 $as_echo "ok" >&6; } fi # Response file support. if test "$lt_cv_nm_interface" = "MS dumpbin"; then nm_file_list_spec='@' elif $NM --help 2>/dev/null | grep '[@]FILE' >/dev/null; then nm_file_list_spec='@' fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for sysroot" >&5 $as_echo_n "checking for sysroot... " >&6; } # Check whether --with-sysroot was given. if test "${with_sysroot+set}" = set; then : withval=$with_sysroot; else with_sysroot=no fi lt_sysroot= case ${with_sysroot} in #( yes) if test "$GCC" = yes; then lt_sysroot=`$CC --print-sysroot 2>/dev/null` fi ;; #( /*) lt_sysroot=`echo "$with_sysroot" | sed -e "$sed_quote_subst"` ;; #( no|'') ;; #( *) { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${with_sysroot}" >&5 $as_echo "${with_sysroot}" >&6; } as_fn_error $? "The sysroot must be an absolute path." "$LINENO" 5 ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${lt_sysroot:-no}" >&5 $as_echo "${lt_sysroot:-no}" >&6; } # Check whether --enable-libtool-lock was given. if test "${enable_libtool_lock+set}" = set; then : enableval=$enable_libtool_lock; fi test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes # Some flags need to be propagated to the compiler or linker for good # libtool support. case $host in ia64-*-hpux*) # Find out which ABI we are using. echo 'int i;' > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then case `/usr/bin/file conftest.$ac_objext` in *ELF-32*) HPUX_IA64_MODE="32" ;; *ELF-64*) HPUX_IA64_MODE="64" ;; esac fi rm -rf conftest* ;; *-*-irix6*) # Find out which ABI we are using. echo '#line '$LINENO' "configure"' > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then if test "$lt_cv_prog_gnu_ld" = yes; then case `/usr/bin/file conftest.$ac_objext` in *32-bit*) LD="${LD-ld} -melf32bsmip" ;; *N32*) LD="${LD-ld} -melf32bmipn32" ;; *64-bit*) LD="${LD-ld} -melf64bmip" ;; esac else case `/usr/bin/file conftest.$ac_objext` in *32-bit*) LD="${LD-ld} -32" ;; *N32*) LD="${LD-ld} -n32" ;; *64-bit*) LD="${LD-ld} -64" ;; esac fi fi rm -rf conftest* ;; x86_64-*kfreebsd*-gnu|x86_64-*linux*|ppc*-*linux*|powerpc*-*linux*| \ s390*-*linux*|s390*-*tpf*|sparc*-*linux*) # Find out which ABI we are using. echo 'int i;' > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then case `/usr/bin/file conftest.o` in *32-bit*) case $host in x86_64-*kfreebsd*-gnu) LD="${LD-ld} -m elf_i386_fbsd" ;; x86_64-*linux*) LD="${LD-ld} -m elf_i386" ;; ppc64-*linux*|powerpc64-*linux*) LD="${LD-ld} -m elf32ppclinux" ;; s390x-*linux*) LD="${LD-ld} -m elf_s390" ;; sparc64-*linux*) LD="${LD-ld} -m elf32_sparc" ;; esac ;; *64-bit*) case $host in x86_64-*kfreebsd*-gnu) LD="${LD-ld} -m elf_x86_64_fbsd" ;; x86_64-*linux*) LD="${LD-ld} -m elf_x86_64" ;; ppc*-*linux*|powerpc*-*linux*) LD="${LD-ld} -m elf64ppc" ;; s390*-*linux*|s390*-*tpf*) LD="${LD-ld} -m elf64_s390" ;; sparc*-*linux*) LD="${LD-ld} -m elf64_sparc" ;; esac ;; esac fi rm -rf conftest* ;; *-*-sco3.2v5*) # On SCO OpenServer 5, we need -belf to get full-featured binaries. SAVE_CFLAGS="$CFLAGS" CFLAGS="$CFLAGS -belf" { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler needs -belf" >&5 $as_echo_n "checking whether the C compiler needs -belf... " >&6; } if ${lt_cv_cc_needs_belf+:} false; then : $as_echo_n "(cached) " >&6 else ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : lt_cv_cc_needs_belf=yes else lt_cv_cc_needs_belf=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_cc_needs_belf" >&5 $as_echo "$lt_cv_cc_needs_belf" >&6; } if test x"$lt_cv_cc_needs_belf" != x"yes"; then # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf CFLAGS="$SAVE_CFLAGS" fi ;; *-*solaris*) # Find out which ABI we are using. echo 'int i;' > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then case `/usr/bin/file conftest.o` in *64-bit*) case $lt_cv_prog_gnu_ld in yes*) case $host in i?86-*-solaris*) LD="${LD-ld} -m elf_x86_64" ;; sparc*-*-solaris*) LD="${LD-ld} -m elf64_sparc" ;; esac # GNU ld 2.21 introduced _sol2 emulations. Use them if available. if ${LD-ld} -V | grep _sol2 >/dev/null 2>&1; then LD="${LD-ld}_sol2" fi ;; *) if ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then LD="${LD-ld} -64" fi ;; esac ;; esac fi rm -rf conftest* ;; esac need_locks="$enable_libtool_lock" if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}mt", so it can be a program name with args. set dummy ${ac_tool_prefix}mt; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_MANIFEST_TOOL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$MANIFEST_TOOL"; then ac_cv_prog_MANIFEST_TOOL="$MANIFEST_TOOL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_MANIFEST_TOOL="${ac_tool_prefix}mt" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi MANIFEST_TOOL=$ac_cv_prog_MANIFEST_TOOL if test -n "$MANIFEST_TOOL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MANIFEST_TOOL" >&5 $as_echo "$MANIFEST_TOOL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_MANIFEST_TOOL"; then ac_ct_MANIFEST_TOOL=$MANIFEST_TOOL # Extract the first word of "mt", so it can be a program name with args. set dummy mt; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_MANIFEST_TOOL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_MANIFEST_TOOL"; then ac_cv_prog_ac_ct_MANIFEST_TOOL="$ac_ct_MANIFEST_TOOL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_MANIFEST_TOOL="mt" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_MANIFEST_TOOL=$ac_cv_prog_ac_ct_MANIFEST_TOOL if test -n "$ac_ct_MANIFEST_TOOL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_MANIFEST_TOOL" >&5 $as_echo "$ac_ct_MANIFEST_TOOL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_MANIFEST_TOOL" = x; then MANIFEST_TOOL=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac MANIFEST_TOOL=$ac_ct_MANIFEST_TOOL fi else MANIFEST_TOOL="$ac_cv_prog_MANIFEST_TOOL" fi test -z "$MANIFEST_TOOL" && MANIFEST_TOOL=mt { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $MANIFEST_TOOL is a manifest tool" >&5 $as_echo_n "checking if $MANIFEST_TOOL is a manifest tool... " >&6; } if ${lt_cv_path_mainfest_tool+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_path_mainfest_tool=no echo "$as_me:$LINENO: $MANIFEST_TOOL '-?'" >&5 $MANIFEST_TOOL '-?' 2>conftest.err > conftest.out cat conftest.err >&5 if $GREP 'Manifest Tool' conftest.out > /dev/null; then lt_cv_path_mainfest_tool=yes fi rm -f conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_mainfest_tool" >&5 $as_echo "$lt_cv_path_mainfest_tool" >&6; } if test "x$lt_cv_path_mainfest_tool" != xyes; then MANIFEST_TOOL=: fi case $host_os in rhapsody* | darwin*) if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}dsymutil", so it can be a program name with args. set dummy ${ac_tool_prefix}dsymutil; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_DSYMUTIL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$DSYMUTIL"; then ac_cv_prog_DSYMUTIL="$DSYMUTIL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_DSYMUTIL="${ac_tool_prefix}dsymutil" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi DSYMUTIL=$ac_cv_prog_DSYMUTIL if test -n "$DSYMUTIL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DSYMUTIL" >&5 $as_echo "$DSYMUTIL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_DSYMUTIL"; then ac_ct_DSYMUTIL=$DSYMUTIL # Extract the first word of "dsymutil", so it can be a program name with args. set dummy dsymutil; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_DSYMUTIL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_DSYMUTIL"; then ac_cv_prog_ac_ct_DSYMUTIL="$ac_ct_DSYMUTIL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_DSYMUTIL="dsymutil" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_DSYMUTIL=$ac_cv_prog_ac_ct_DSYMUTIL if test -n "$ac_ct_DSYMUTIL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DSYMUTIL" >&5 $as_echo "$ac_ct_DSYMUTIL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_DSYMUTIL" = x; then DSYMUTIL=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac DSYMUTIL=$ac_ct_DSYMUTIL fi else DSYMUTIL="$ac_cv_prog_DSYMUTIL" fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}nmedit", so it can be a program name with args. set dummy ${ac_tool_prefix}nmedit; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_NMEDIT+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$NMEDIT"; then ac_cv_prog_NMEDIT="$NMEDIT" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_NMEDIT="${ac_tool_prefix}nmedit" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi NMEDIT=$ac_cv_prog_NMEDIT if test -n "$NMEDIT"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $NMEDIT" >&5 $as_echo "$NMEDIT" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_NMEDIT"; then ac_ct_NMEDIT=$NMEDIT # Extract the first word of "nmedit", so it can be a program name with args. set dummy nmedit; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_NMEDIT+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_NMEDIT"; then ac_cv_prog_ac_ct_NMEDIT="$ac_ct_NMEDIT" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_NMEDIT="nmedit" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_NMEDIT=$ac_cv_prog_ac_ct_NMEDIT if test -n "$ac_ct_NMEDIT"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_NMEDIT" >&5 $as_echo "$ac_ct_NMEDIT" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_NMEDIT" = x; then NMEDIT=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac NMEDIT=$ac_ct_NMEDIT fi else NMEDIT="$ac_cv_prog_NMEDIT" fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}lipo", so it can be a program name with args. set dummy ${ac_tool_prefix}lipo; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_LIPO+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$LIPO"; then ac_cv_prog_LIPO="$LIPO" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_LIPO="${ac_tool_prefix}lipo" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi LIPO=$ac_cv_prog_LIPO if test -n "$LIPO"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LIPO" >&5 $as_echo "$LIPO" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_LIPO"; then ac_ct_LIPO=$LIPO # Extract the first word of "lipo", so it can be a program name with args. set dummy lipo; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_LIPO+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_LIPO"; then ac_cv_prog_ac_ct_LIPO="$ac_ct_LIPO" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_LIPO="lipo" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_LIPO=$ac_cv_prog_ac_ct_LIPO if test -n "$ac_ct_LIPO"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_LIPO" >&5 $as_echo "$ac_ct_LIPO" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_LIPO" = x; then LIPO=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac LIPO=$ac_ct_LIPO fi else LIPO="$ac_cv_prog_LIPO" fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}otool", so it can be a program name with args. set dummy ${ac_tool_prefix}otool; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_OTOOL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$OTOOL"; then ac_cv_prog_OTOOL="$OTOOL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_OTOOL="${ac_tool_prefix}otool" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi OTOOL=$ac_cv_prog_OTOOL if test -n "$OTOOL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OTOOL" >&5 $as_echo "$OTOOL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_OTOOL"; then ac_ct_OTOOL=$OTOOL # Extract the first word of "otool", so it can be a program name with args. set dummy otool; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_OTOOL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_OTOOL"; then ac_cv_prog_ac_ct_OTOOL="$ac_ct_OTOOL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_OTOOL="otool" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_OTOOL=$ac_cv_prog_ac_ct_OTOOL if test -n "$ac_ct_OTOOL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL" >&5 $as_echo "$ac_ct_OTOOL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_OTOOL" = x; then OTOOL=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac OTOOL=$ac_ct_OTOOL fi else OTOOL="$ac_cv_prog_OTOOL" fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}otool64", so it can be a program name with args. set dummy ${ac_tool_prefix}otool64; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_OTOOL64+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$OTOOL64"; then ac_cv_prog_OTOOL64="$OTOOL64" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_OTOOL64="${ac_tool_prefix}otool64" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi OTOOL64=$ac_cv_prog_OTOOL64 if test -n "$OTOOL64"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OTOOL64" >&5 $as_echo "$OTOOL64" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_OTOOL64"; then ac_ct_OTOOL64=$OTOOL64 # Extract the first word of "otool64", so it can be a program name with args. set dummy otool64; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_OTOOL64+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_OTOOL64"; then ac_cv_prog_ac_ct_OTOOL64="$ac_ct_OTOOL64" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_OTOOL64="otool64" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_OTOOL64=$ac_cv_prog_ac_ct_OTOOL64 if test -n "$ac_ct_OTOOL64"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL64" >&5 $as_echo "$ac_ct_OTOOL64" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_OTOOL64" = x; then OTOOL64=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac OTOOL64=$ac_ct_OTOOL64 fi else OTOOL64="$ac_cv_prog_OTOOL64" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -single_module linker flag" >&5 $as_echo_n "checking for -single_module linker flag... " >&6; } if ${lt_cv_apple_cc_single_mod+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_apple_cc_single_mod=no if test -z "${LT_MULTI_MODULE}"; then # By default we will add the -single_module flag. You can override # by either setting the environment variable LT_MULTI_MODULE # non-empty at configure time, or by adding -multi_module to the # link flags. rm -rf libconftest.dylib* echo "int foo(void){return 1;}" > conftest.c echo "$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ -dynamiclib -Wl,-single_module conftest.c" >&5 $LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ -dynamiclib -Wl,-single_module conftest.c 2>conftest.err _lt_result=$? # If there is a non-empty error log, and "single_module" # appears in it, assume the flag caused a linker warning if test -s conftest.err && $GREP single_module conftest.err; then cat conftest.err >&5 # Otherwise, if the output was created with a 0 exit code from # the compiler, it worked. elif test -f libconftest.dylib && test $_lt_result -eq 0; then lt_cv_apple_cc_single_mod=yes else cat conftest.err >&5 fi rm -rf libconftest.dylib* rm -f conftest.* fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_apple_cc_single_mod" >&5 $as_echo "$lt_cv_apple_cc_single_mod" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -exported_symbols_list linker flag" >&5 $as_echo_n "checking for -exported_symbols_list linker flag... " >&6; } if ${lt_cv_ld_exported_symbols_list+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_ld_exported_symbols_list=no save_LDFLAGS=$LDFLAGS echo "_main" > conftest.sym LDFLAGS="$LDFLAGS -Wl,-exported_symbols_list,conftest.sym" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : lt_cv_ld_exported_symbols_list=yes else lt_cv_ld_exported_symbols_list=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LDFLAGS="$save_LDFLAGS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_exported_symbols_list" >&5 $as_echo "$lt_cv_ld_exported_symbols_list" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -force_load linker flag" >&5 $as_echo_n "checking for -force_load linker flag... " >&6; } if ${lt_cv_ld_force_load+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_ld_force_load=no cat > conftest.c << _LT_EOF int forced_loaded() { return 2;} _LT_EOF echo "$LTCC $LTCFLAGS -c -o conftest.o conftest.c" >&5 $LTCC $LTCFLAGS -c -o conftest.o conftest.c 2>&5 echo "$AR cru libconftest.a conftest.o" >&5 $AR cru libconftest.a conftest.o 2>&5 echo "$RANLIB libconftest.a" >&5 $RANLIB libconftest.a 2>&5 cat > conftest.c << _LT_EOF int main() { return 0;} _LT_EOF echo "$LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a" >&5 $LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a 2>conftest.err _lt_result=$? if test -s conftest.err && $GREP force_load conftest.err; then cat conftest.err >&5 elif test -f conftest && test $_lt_result -eq 0 && $GREP forced_load conftest >/dev/null 2>&1 ; then lt_cv_ld_force_load=yes else cat conftest.err >&5 fi rm -f conftest.err libconftest.a conftest conftest.c rm -rf conftest.dSYM fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_force_load" >&5 $as_echo "$lt_cv_ld_force_load" >&6; } case $host_os in rhapsody* | darwin1.[012]) _lt_dar_allow_undefined='${wl}-undefined ${wl}suppress' ;; darwin1.*) _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; darwin*) # darwin 5.x on # if running on 10.5 or later, the deployment target defaults # to the OS version, if on x86, and 10.4, the deployment # target defaults to 10.4. Don't you love it? case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in 10.0,*86*-darwin8*|10.0,*-darwin[91]*) _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;; 10.[012]*) _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; 10.*) _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;; esac ;; esac if test "$lt_cv_apple_cc_single_mod" = "yes"; then _lt_dar_single_mod='$single_module' fi if test "$lt_cv_ld_exported_symbols_list" = "yes"; then _lt_dar_export_syms=' ${wl}-exported_symbols_list,$output_objdir/${libname}-symbols.expsym' else _lt_dar_export_syms='~$NMEDIT -s $output_objdir/${libname}-symbols.expsym ${lib}' fi if test "$DSYMUTIL" != ":" && test "$lt_cv_ld_force_load" = "no"; then _lt_dsymutil='~$DSYMUTIL $lib || :' else _lt_dsymutil= fi ;; esac ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5 $as_echo_n "checking how to run the C preprocessor... " >&6; } # On Suns, sometimes $CPP names a directory. if test -n "$CPP" && test -d "$CPP"; then CPP= fi if test -z "$CPP"; then if ${ac_cv_prog_CPP+:} false; then : $as_echo_n "(cached) " >&6 else # Double quotes because CPP needs to be expanded for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp" do ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : break fi done ac_cv_prog_CPP=$CPP fi CPP=$ac_cv_prog_CPP else ac_cv_prog_CPP=$CPP fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5 $as_echo "$CPP" >&6; } ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "C preprocessor \"$CPP\" fails sanity check See \`config.log' for more details" "$LINENO" 5; } fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5 $as_echo_n "checking for ANSI C header files... " >&6; } if ${ac_cv_header_stdc+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include #include int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_header_stdc=yes else ac_cv_header_stdc=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if test $ac_cv_header_stdc = yes; then # SunOS 4.x string.h does not declare mem*, contrary to ANSI. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "memchr" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "free" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. if test "$cross_compiling" = yes; then : : else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #if ((' ' & 0x0FF) == 0x020) # define ISLOWER(c) ('a' <= (c) && (c) <= 'z') # define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) #else # define ISLOWER(c) \ (('a' <= (c) && (c) <= 'i') \ || ('j' <= (c) && (c) <= 'r') \ || ('s' <= (c) && (c) <= 'z')) # define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) #endif #define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) int main () { int i; for (i = 0; i < 256; i++) if (XOR (islower (i), ISLOWER (i)) || toupper (i) != TOUPPER (i)) return 2; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : else ac_cv_header_stdc=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5 $as_echo "$ac_cv_header_stdc" >&6; } if test $ac_cv_header_stdc = yes; then $as_echo "#define STDC_HEADERS 1" >>confdefs.h fi # On IRIX 5.3, sys/types and inttypes.h are conflicting. for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \ inttypes.h stdint.h unistd.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default " if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done for ac_header in dlfcn.h do : ac_fn_c_check_header_compile "$LINENO" "dlfcn.h" "ac_cv_header_dlfcn_h" "$ac_includes_default " if test "x$ac_cv_header_dlfcn_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_DLFCN_H 1 _ACEOF fi done func_stripname_cnf () { case ${2} in .*) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%\\\\${2}\$%%"`;; *) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%${2}\$%%"`;; esac } # func_stripname_cnf # Set options # Check whether --enable-shared was given. if test "${enable_shared+set}" = set; then : enableval=$enable_shared; p=${PACKAGE-default} case $enableval in yes) enable_shared=yes ;; no) enable_shared=no ;; *) enable_shared=no # Look at the argument we got. We use all the common list separators. lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for pkg in $enableval; do IFS="$lt_save_ifs" if test "X$pkg" = "X$p"; then enable_shared=yes fi done IFS="$lt_save_ifs" ;; esac else enable_shared=no fi enable_dlopen=no enable_win32_dll=no # Check whether --enable-static was given. if test "${enable_static+set}" = set; then : enableval=$enable_static; p=${PACKAGE-default} case $enableval in yes) enable_static=yes ;; no) enable_static=no ;; *) enable_static=no # Look at the argument we got. We use all the common list separators. lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for pkg in $enableval; do IFS="$lt_save_ifs" if test "X$pkg" = "X$p"; then enable_static=yes fi done IFS="$lt_save_ifs" ;; esac else enable_static=yes fi # Check whether --with-pic was given. if test "${with_pic+set}" = set; then : withval=$with_pic; lt_p=${PACKAGE-default} case $withval in yes|no) pic_mode=$withval ;; *) pic_mode=default # Look at the argument we got. We use all the common list separators. lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for lt_pkg in $withval; do IFS="$lt_save_ifs" if test "X$lt_pkg" = "X$lt_p"; then pic_mode=yes fi done IFS="$lt_save_ifs" ;; esac else pic_mode=default fi test -z "$pic_mode" && pic_mode=default # Check whether --enable-fast-install was given. if test "${enable_fast_install+set}" = set; then : enableval=$enable_fast_install; p=${PACKAGE-default} case $enableval in yes) enable_fast_install=yes ;; no) enable_fast_install=no ;; *) enable_fast_install=no # Look at the argument we got. We use all the common list separators. lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for pkg in $enableval; do IFS="$lt_save_ifs" if test "X$pkg" = "X$p"; then enable_fast_install=yes fi done IFS="$lt_save_ifs" ;; esac else enable_fast_install=yes fi # This can be used to rebuild libtool when needed LIBTOOL_DEPS="$ltmain" # Always use our own libtool. LIBTOOL='$(SHELL) $(top_builddir)/libtool' test -z "$LN_S" && LN_S="ln -s" if test -n "${ZSH_VERSION+set}" ; then setopt NO_GLOB_SUBST fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for objdir" >&5 $as_echo_n "checking for objdir... " >&6; } if ${lt_cv_objdir+:} false; then : $as_echo_n "(cached) " >&6 else rm -f .libs 2>/dev/null mkdir .libs 2>/dev/null if test -d .libs; then lt_cv_objdir=.libs else # MS-DOS does not allow filenames that begin with a dot. lt_cv_objdir=_libs fi rmdir .libs 2>/dev/null fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_objdir" >&5 $as_echo "$lt_cv_objdir" >&6; } objdir=$lt_cv_objdir cat >>confdefs.h <<_ACEOF #define LT_OBJDIR "$lt_cv_objdir/" _ACEOF case $host_os in aix3*) # AIX sometimes has problems with the GCC collect2 program. For some # reason, if we set the COLLECT_NAMES environment variable, the problems # vanish in a puff of smoke. if test "X${COLLECT_NAMES+set}" != Xset; then COLLECT_NAMES= export COLLECT_NAMES fi ;; esac # Global variables: ofile=libtool can_build_shared=yes # All known linkers require a `.a' archive for static linking (except MSVC, # which needs '.lib'). libext=a with_gnu_ld="$lt_cv_prog_gnu_ld" old_CC="$CC" old_CFLAGS="$CFLAGS" # Set sane defaults for various variables test -z "$CC" && CC=cc test -z "$LTCC" && LTCC=$CC test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS test -z "$LD" && LD=ld test -z "$ac_objext" && ac_objext=o for cc_temp in $compiler""; do case $cc_temp in compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; \-*) ;; *) break;; esac done cc_basename=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"` # Only perform the check for file, if the check method requires it test -z "$MAGIC_CMD" && MAGIC_CMD=file case $deplibs_check_method in file_magic*) if test "$file_magic_cmd" = '$MAGIC_CMD'; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ${ac_tool_prefix}file" >&5 $as_echo_n "checking for ${ac_tool_prefix}file... " >&6; } if ${lt_cv_path_MAGIC_CMD+:} false; then : $as_echo_n "(cached) " >&6 else case $MAGIC_CMD in [\\/*] | ?:[\\/]*) lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path. ;; *) lt_save_MAGIC_CMD="$MAGIC_CMD" lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR ac_dummy="/usr/bin$PATH_SEPARATOR$PATH" for ac_dir in $ac_dummy; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. if test -f $ac_dir/${ac_tool_prefix}file; then lt_cv_path_MAGIC_CMD="$ac_dir/${ac_tool_prefix}file" if test -n "$file_magic_test_file"; then case $deplibs_check_method in "file_magic "*) file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` MAGIC_CMD="$lt_cv_path_MAGIC_CMD" if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | $EGREP "$file_magic_regex" > /dev/null; then : else cat <<_LT_EOF 1>&2 *** Warning: the command libtool uses to detect shared libraries, *** $file_magic_cmd, produces output that libtool cannot recognize. *** The result is that libtool may fail to recognize shared libraries *** as such. This will affect the creation of libtool libraries that *** depend on shared libraries, but programs linked with such libtool *** libraries will work regardless of this problem. Nevertheless, you *** may want to report the problem to your system manager and/or to *** bug-libtool@gnu.org _LT_EOF fi ;; esac fi break fi done IFS="$lt_save_ifs" MAGIC_CMD="$lt_save_MAGIC_CMD" ;; esac fi MAGIC_CMD="$lt_cv_path_MAGIC_CMD" if test -n "$MAGIC_CMD"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5 $as_echo "$MAGIC_CMD" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test -z "$lt_cv_path_MAGIC_CMD"; then if test -n "$ac_tool_prefix"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for file" >&5 $as_echo_n "checking for file... " >&6; } if ${lt_cv_path_MAGIC_CMD+:} false; then : $as_echo_n "(cached) " >&6 else case $MAGIC_CMD in [\\/*] | ?:[\\/]*) lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path. ;; *) lt_save_MAGIC_CMD="$MAGIC_CMD" lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR ac_dummy="/usr/bin$PATH_SEPARATOR$PATH" for ac_dir in $ac_dummy; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. if test -f $ac_dir/file; then lt_cv_path_MAGIC_CMD="$ac_dir/file" if test -n "$file_magic_test_file"; then case $deplibs_check_method in "file_magic "*) file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` MAGIC_CMD="$lt_cv_path_MAGIC_CMD" if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | $EGREP "$file_magic_regex" > /dev/null; then : else cat <<_LT_EOF 1>&2 *** Warning: the command libtool uses to detect shared libraries, *** $file_magic_cmd, produces output that libtool cannot recognize. *** The result is that libtool may fail to recognize shared libraries *** as such. This will affect the creation of libtool libraries that *** depend on shared libraries, but programs linked with such libtool *** libraries will work regardless of this problem. Nevertheless, you *** may want to report the problem to your system manager and/or to *** bug-libtool@gnu.org _LT_EOF fi ;; esac fi break fi done IFS="$lt_save_ifs" MAGIC_CMD="$lt_save_MAGIC_CMD" ;; esac fi MAGIC_CMD="$lt_cv_path_MAGIC_CMD" if test -n "$MAGIC_CMD"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5 $as_echo "$MAGIC_CMD" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi else MAGIC_CMD=: fi fi fi ;; esac # Use C for the default configuration in the libtool script lt_save_CC="$CC" ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu # Source file extension for C test sources. ac_ext=c # Object file extension for compiled C test sources. objext=o objext=$objext # Code to be used in simple compile tests lt_simple_compile_test_code="int some_variable = 0;" # Code to be used in simple link tests lt_simple_link_test_code='int main(){return(0);}' # If no C compiler was specified, use CC. LTCC=${LTCC-"$CC"} # If no C compiler flags were specified, use CFLAGS. LTCFLAGS=${LTCFLAGS-"$CFLAGS"} # Allow CC to be a program name with arguments. compiler=$CC # Save the default compiler, since it gets overwritten when the other # tags are being tested, and _LT_TAGVAR(compiler, []) is a NOP. compiler_DEFAULT=$CC # save warnings/boilerplate of simple test code ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" >conftest.$ac_ext eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_compiler_boilerplate=`cat conftest.err` $RM conftest* ac_outfile=conftest.$ac_objext echo "$lt_simple_link_test_code" >conftest.$ac_ext eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_linker_boilerplate=`cat conftest.err` $RM -r conftest* ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... if test -n "$compiler"; then lt_prog_compiler_no_builtin_flag= if test "$GCC" = yes; then case $cc_basename in nvcc*) lt_prog_compiler_no_builtin_flag=' -Xcompiler -fno-builtin' ;; *) lt_prog_compiler_no_builtin_flag=' -fno-builtin' ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -fno-rtti -fno-exceptions" >&5 $as_echo_n "checking if $compiler supports -fno-rtti -fno-exceptions... " >&6; } if ${lt_cv_prog_compiler_rtti_exceptions+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_rtti_exceptions=no ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-fno-rtti -fno-exceptions" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. # The option is referenced via a variable to avoid confusing sed. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings other than the usual output. $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then lt_cv_prog_compiler_rtti_exceptions=yes fi fi $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_rtti_exceptions" >&5 $as_echo "$lt_cv_prog_compiler_rtti_exceptions" >&6; } if test x"$lt_cv_prog_compiler_rtti_exceptions" = xyes; then lt_prog_compiler_no_builtin_flag="$lt_prog_compiler_no_builtin_flag -fno-rtti -fno-exceptions" else : fi fi lt_prog_compiler_wl= lt_prog_compiler_pic= lt_prog_compiler_static= if test "$GCC" = yes; then lt_prog_compiler_wl='-Wl,' lt_prog_compiler_static='-static' case $host_os in aix*) # All AIX code is PIC. if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor lt_prog_compiler_static='-Bstatic' fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support lt_prog_compiler_pic='-fPIC' ;; m68k) # FIXME: we need at least 68020 code to build shared libraries, but # adding the `-m68020' flag to GCC prevents building anything better, # like `-m68040'. lt_prog_compiler_pic='-m68020 -resident32 -malways-restore-a4' ;; esac ;; beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) # PIC is the default for these OSes. ;; mingw* | cygwin* | pw32* | os2* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). # Although the cygwin gcc ignores -fPIC, still need this for old-style # (--disable-auto-import) libraries lt_prog_compiler_pic='-DDLL_EXPORT' ;; darwin* | rhapsody*) # PIC is the default on this platform # Common symbols not allowed in MH_DYLIB files lt_prog_compiler_pic='-fno-common' ;; haiku*) # PIC is the default for Haiku. # The "-static" flag exists, but is broken. lt_prog_compiler_static= ;; hpux*) # PIC is the default for 64-bit PA HP-UX, but not for 32-bit # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag # sets the default TLS model and affects inlining. case $host_cpu in hppa*64*) # +Z the default ;; *) lt_prog_compiler_pic='-fPIC' ;; esac ;; interix[3-9]*) # Interix 3.x gcc -fpic/-fPIC options generate broken code. # Instead, we relocate shared libraries at runtime. ;; msdosdjgpp*) # Just because we use GCC doesn't mean we suddenly get shared libraries # on systems that don't support them. lt_prog_compiler_can_build_shared=no enable_shared=no ;; *nto* | *qnx*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. lt_prog_compiler_pic='-fPIC -shared' ;; sysv4*MP*) if test -d /usr/nec; then lt_prog_compiler_pic=-Kconform_pic fi ;; *) lt_prog_compiler_pic='-fPIC' ;; esac case $cc_basename in nvcc*) # Cuda Compiler Driver 2.2 lt_prog_compiler_wl='-Xlinker ' if test -n "$lt_prog_compiler_pic"; then lt_prog_compiler_pic="-Xcompiler $lt_prog_compiler_pic" fi ;; esac else # PORTME Check for flag to pass linker flags through the system compiler. case $host_os in aix*) lt_prog_compiler_wl='-Wl,' if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor lt_prog_compiler_static='-Bstatic' else lt_prog_compiler_static='-bnso -bI:/lib/syscalls.exp' fi ;; mingw* | cygwin* | pw32* | os2* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). lt_prog_compiler_pic='-DDLL_EXPORT' ;; hpux9* | hpux10* | hpux11*) lt_prog_compiler_wl='-Wl,' # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but # not for PA HP-UX. case $host_cpu in hppa*64*|ia64*) # +Z the default ;; *) lt_prog_compiler_pic='+Z' ;; esac # Is there a better lt_prog_compiler_static that works with the bundled CC? lt_prog_compiler_static='${wl}-a ${wl}archive' ;; irix5* | irix6* | nonstopux*) lt_prog_compiler_wl='-Wl,' # PIC (with -KPIC) is the default. lt_prog_compiler_static='-non_shared' ;; linux* | k*bsd*-gnu | kopensolaris*-gnu) case $cc_basename in # old Intel for x86_64 which still supported -KPIC. ecc*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-static' ;; # icc used to be incompatible with GCC. # ICC 10 doesn't accept -KPIC any more. icc* | ifort*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-fPIC' lt_prog_compiler_static='-static' ;; # Lahey Fortran 8.1. lf95*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='--shared' lt_prog_compiler_static='--static' ;; nagfor*) # NAG Fortran compiler lt_prog_compiler_wl='-Wl,-Wl,,' lt_prog_compiler_pic='-PIC' lt_prog_compiler_static='-Bstatic' ;; pgcc* | pgf77* | pgf90* | pgf95* | pgfortran*) # Portland Group compilers (*not* the Pentium gcc compiler, # which looks to be a dead project) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-fpic' lt_prog_compiler_static='-Bstatic' ;; ccc*) lt_prog_compiler_wl='-Wl,' # All Alpha code is PIC. lt_prog_compiler_static='-non_shared' ;; xl* | bgxl* | bgf* | mpixl*) # IBM XL C 8.0/Fortran 10.1, 11.1 on PPC and BlueGene lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-qpic' lt_prog_compiler_static='-qstaticlink' ;; *) case `$CC -V 2>&1 | sed 5q` in *Sun\ Ceres\ Fortran* | *Sun*Fortran*\ [1-7].* | *Sun*Fortran*\ 8.[0-3]*) # Sun Fortran 8.3 passes all unrecognized flags to the linker lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' lt_prog_compiler_wl='' ;; *Sun\ F* | *Sun*Fortran*) lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' lt_prog_compiler_wl='-Qoption ld ' ;; *Sun\ C*) # Sun C 5.9 lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' lt_prog_compiler_wl='-Wl,' ;; *Intel*\ [CF]*Compiler*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-fPIC' lt_prog_compiler_static='-static' ;; *Portland\ Group*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-fpic' lt_prog_compiler_static='-Bstatic' ;; esac ;; esac ;; newsos6) lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' ;; *nto* | *qnx*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. lt_prog_compiler_pic='-fPIC -shared' ;; osf3* | osf4* | osf5*) lt_prog_compiler_wl='-Wl,' # All OSF/1 code is PIC. lt_prog_compiler_static='-non_shared' ;; rdos*) lt_prog_compiler_static='-non_shared' ;; solaris*) lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' case $cc_basename in f77* | f90* | f95* | sunf77* | sunf90* | sunf95*) lt_prog_compiler_wl='-Qoption ld ';; *) lt_prog_compiler_wl='-Wl,';; esac ;; sunos4*) lt_prog_compiler_wl='-Qoption ld ' lt_prog_compiler_pic='-PIC' lt_prog_compiler_static='-Bstatic' ;; sysv4 | sysv4.2uw2* | sysv4.3*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' ;; sysv4*MP*) if test -d /usr/nec ;then lt_prog_compiler_pic='-Kconform_pic' lt_prog_compiler_static='-Bstatic' fi ;; sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' ;; unicos*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_can_build_shared=no ;; uts4*) lt_prog_compiler_pic='-pic' lt_prog_compiler_static='-Bstatic' ;; *) lt_prog_compiler_can_build_shared=no ;; esac fi case $host_os in # For platforms which do not support PIC, -DPIC is meaningless: *djgpp*) lt_prog_compiler_pic= ;; *) lt_prog_compiler_pic="$lt_prog_compiler_pic -DPIC" ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $compiler option to produce PIC" >&5 $as_echo_n "checking for $compiler option to produce PIC... " >&6; } if ${lt_cv_prog_compiler_pic+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_pic=$lt_prog_compiler_pic fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic" >&5 $as_echo "$lt_cv_prog_compiler_pic" >&6; } lt_prog_compiler_pic=$lt_cv_prog_compiler_pic # # Check to make sure the PIC flag actually works. # if test -n "$lt_prog_compiler_pic"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler PIC flag $lt_prog_compiler_pic works" >&5 $as_echo_n "checking if $compiler PIC flag $lt_prog_compiler_pic works... " >&6; } if ${lt_cv_prog_compiler_pic_works+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_pic_works=no ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="$lt_prog_compiler_pic -DPIC" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. # The option is referenced via a variable to avoid confusing sed. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings other than the usual output. $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then lt_cv_prog_compiler_pic_works=yes fi fi $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_works" >&5 $as_echo "$lt_cv_prog_compiler_pic_works" >&6; } if test x"$lt_cv_prog_compiler_pic_works" = xyes; then case $lt_prog_compiler_pic in "" | " "*) ;; *) lt_prog_compiler_pic=" $lt_prog_compiler_pic" ;; esac else lt_prog_compiler_pic= lt_prog_compiler_can_build_shared=no fi fi # # Check to make sure the static flag actually works. # wl=$lt_prog_compiler_wl eval lt_tmp_static_flag=\"$lt_prog_compiler_static\" { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler static flag $lt_tmp_static_flag works" >&5 $as_echo_n "checking if $compiler static flag $lt_tmp_static_flag works... " >&6; } if ${lt_cv_prog_compiler_static_works+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_static_works=no save_LDFLAGS="$LDFLAGS" LDFLAGS="$LDFLAGS $lt_tmp_static_flag" echo "$lt_simple_link_test_code" > conftest.$ac_ext if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then # The linker can only warn and ignore the option if not recognized # So say no if there are warnings if test -s conftest.err; then # Append any errors to the config.log. cat conftest.err 1>&5 $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if diff conftest.exp conftest.er2 >/dev/null; then lt_cv_prog_compiler_static_works=yes fi else lt_cv_prog_compiler_static_works=yes fi fi $RM -r conftest* LDFLAGS="$save_LDFLAGS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_static_works" >&5 $as_echo "$lt_cv_prog_compiler_static_works" >&6; } if test x"$lt_cv_prog_compiler_static_works" = xyes; then : else lt_prog_compiler_static= fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 $as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } if ${lt_cv_prog_compiler_c_o+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_c_o=no $RM -r conftest 2>/dev/null mkdir conftest cd conftest mkdir out echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-o out/conftest2.$ac_objext" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then lt_cv_prog_compiler_c_o=yes fi fi chmod u+w . 2>&5 $RM conftest* # SGI C++ compiler will create directory out/ii_files/ for # template instantiation test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files $RM out/* && rmdir out cd .. $RM -r conftest $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5 $as_echo "$lt_cv_prog_compiler_c_o" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 $as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } if ${lt_cv_prog_compiler_c_o+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_c_o=no $RM -r conftest 2>/dev/null mkdir conftest cd conftest mkdir out echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-o out/conftest2.$ac_objext" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then lt_cv_prog_compiler_c_o=yes fi fi chmod u+w . 2>&5 $RM conftest* # SGI C++ compiler will create directory out/ii_files/ for # template instantiation test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files $RM out/* && rmdir out cd .. $RM -r conftest $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5 $as_echo "$lt_cv_prog_compiler_c_o" >&6; } hard_links="nottested" if test "$lt_cv_prog_compiler_c_o" = no && test "$need_locks" != no; then # do not overwrite the value of need_locks provided by the user { $as_echo "$as_me:${as_lineno-$LINENO}: checking if we can lock with hard links" >&5 $as_echo_n "checking if we can lock with hard links... " >&6; } hard_links=yes $RM conftest* ln conftest.a conftest.b 2>/dev/null && hard_links=no touch conftest.a ln conftest.a conftest.b 2>&5 || hard_links=no ln conftest.a conftest.b 2>/dev/null && hard_links=no { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hard_links" >&5 $as_echo "$hard_links" >&6; } if test "$hard_links" = no; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5 $as_echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;} need_locks=warn fi else need_locks=no fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5 $as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; } runpath_var= allow_undefined_flag= always_export_symbols=no archive_cmds= archive_expsym_cmds= compiler_needs_object=no enable_shared_with_static_runtimes=no export_dynamic_flag_spec= export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' hardcode_automatic=no hardcode_direct=no hardcode_direct_absolute=no hardcode_libdir_flag_spec= hardcode_libdir_separator= hardcode_minus_L=no hardcode_shlibpath_var=unsupported inherit_rpath=no link_all_deplibs=unknown module_cmds= module_expsym_cmds= old_archive_from_new_cmds= old_archive_from_expsyms_cmds= thread_safe_flag_spec= whole_archive_flag_spec= # include_expsyms should be a list of space-separated symbols to be *always* # included in the symbol list include_expsyms= # exclude_expsyms can be an extended regexp of symbols to exclude # it will be wrapped by ` (' and `)$', so one must not match beginning or # end of line. Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc', # as well as any symbol that contains `d'. exclude_expsyms='_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*' # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out # platforms (ab)use it in PIC code, but their linkers get confused if # the symbol is explicitly referenced. Since portable code cannot # rely on this symbol name, it's probably fine to never include it in # preloaded symbol tables. # Exclude shared library initialization/finalization symbols. extract_expsyms_cmds= case $host_os in cygwin* | mingw* | pw32* | cegcc*) # FIXME: the MSVC++ port hasn't been tested in a loooong time # When not using gcc, we currently assume that we are using # Microsoft Visual C++. if test "$GCC" != yes; then with_gnu_ld=no fi ;; interix*) # we just hope/assume this is gcc and not c89 (= MSVC++) with_gnu_ld=yes ;; openbsd*) with_gnu_ld=no ;; esac ld_shlibs=yes # On some targets, GNU ld is compatible enough with the native linker # that we're better off using the native interface for both. lt_use_gnu_ld_interface=no if test "$with_gnu_ld" = yes; then case $host_os in aix*) # The AIX port of GNU ld has always aspired to compatibility # with the native linker. However, as the warning in the GNU ld # block says, versions before 2.19.5* couldn't really create working # shared libraries, regardless of the interface used. case `$LD -v 2>&1` in *\ \(GNU\ Binutils\)\ 2.19.5*) ;; *\ \(GNU\ Binutils\)\ 2.[2-9]*) ;; *\ \(GNU\ Binutils\)\ [3-9]*) ;; *) lt_use_gnu_ld_interface=yes ;; esac ;; *) lt_use_gnu_ld_interface=yes ;; esac fi if test "$lt_use_gnu_ld_interface" = yes; then # If archive_cmds runs LD, not CC, wlarc should be empty wlarc='${wl}' # Set some defaults for GNU ld with shared library support. These # are reset later if shared libraries are not supported. Putting them # here allows them to be overridden if necessary. runpath_var=LD_RUN_PATH hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' export_dynamic_flag_spec='${wl}--export-dynamic' # ancient GNU ld didn't support --whole-archive et. al. if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then whole_archive_flag_spec="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' else whole_archive_flag_spec= fi supports_anon_versioning=no case `$LD -v 2>&1` in *GNU\ gold*) supports_anon_versioning=yes ;; *\ [01].* | *\ 2.[0-9].* | *\ 2.10.*) ;; # catch versions < 2.11 *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... *\ 2.11.*) ;; # other 2.11 versions *) supports_anon_versioning=yes ;; esac # See if GNU ld supports shared libraries. case $host_os in aix[3-9]*) # On AIX/PPC, the GNU linker is very broken if test "$host_cpu" != ia64; then ld_shlibs=no cat <<_LT_EOF 1>&2 *** Warning: the GNU linker, at least up to release 2.19, is reported *** to be unable to reliably create shared libraries on AIX. *** Therefore, libtool is disabling shared libraries support. If you *** really care for shared libraries, you may want to install binutils *** 2.20 or above, or modify your PATH so that a non-GNU linker is found. *** You will then need to restart the configuration process. _LT_EOF fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds='' ;; m68k) archive_cmds='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' hardcode_libdir_flag_spec='-L$libdir' hardcode_minus_L=yes ;; esac ;; beos*) if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then allow_undefined_flag=unsupported # Joseph Beckenbach says some releases of gcc # support --undefined. This deserves some investigation. FIXME archive_cmds='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' else ld_shlibs=no fi ;; cygwin* | mingw* | pw32* | cegcc*) # _LT_TAGVAR(hardcode_libdir_flag_spec, ) is actually meaningless, # as there is no search path for DLLs. hardcode_libdir_flag_spec='-L$libdir' export_dynamic_flag_spec='${wl}--export-all-symbols' allow_undefined_flag=unsupported always_export_symbols=no enable_shared_with_static_runtimes=yes export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1 DATA/;s/^.*[ ]__nm__\([^ ]*\)[ ][^ ]*/\1 DATA/;/^I[ ]/d;/^[AITW][ ]/s/.* //'\'' | sort | uniq > $export_symbols' exclude_expsyms='[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname' if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' # If the export-symbols file already is a .def file (1st line # is EXPORTS), use it as is; otherwise, prepend... archive_expsym_cmds='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then cp $export_symbols $output_objdir/$soname.def; else echo EXPORTS > $output_objdir/$soname.def; cat $export_symbols >> $output_objdir/$soname.def; fi~ $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' else ld_shlibs=no fi ;; haiku*) archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' link_all_deplibs=yes ;; interix[3-9]*) hardcode_direct=no hardcode_shlibpath_var=no hardcode_libdir_flag_spec='${wl}-rpath,$libdir' export_dynamic_flag_spec='${wl}-E' # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. # Instead, shared libraries are loaded at an image base (0x10000000 by # default) and relocated if they conflict, which is a slow very memory # consuming and fragmenting process. To avoid this, we pick a random, # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link # time. Moving up from 0x10000000 also allows more sbrk(2) space. archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' archive_expsym_cmds='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' ;; gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu) tmp_diet=no if test "$host_os" = linux-dietlibc; then case $cc_basename in diet\ *) tmp_diet=yes;; # linux-dietlibc with static linking (!diet-dyn) esac fi if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \ && test "$tmp_diet" = no then tmp_addflag=' $pic_flag' tmp_sharedflag='-shared' case $cc_basename,$host_cpu in pgcc*) # Portland Group C compiler whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' tmp_addflag=' $pic_flag' ;; pgf77* | pgf90* | pgf95* | pgfortran*) # Portland Group f77 and f90 compilers whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' tmp_addflag=' $pic_flag -Mnomain' ;; ecc*,ia64* | icc*,ia64*) # Intel C compiler on ia64 tmp_addflag=' -i_dynamic' ;; efc*,ia64* | ifort*,ia64*) # Intel Fortran compiler on ia64 tmp_addflag=' -i_dynamic -nofor_main' ;; ifc* | ifort*) # Intel Fortran compiler tmp_addflag=' -nofor_main' ;; lf95*) # Lahey Fortran 8.1 whole_archive_flag_spec= tmp_sharedflag='--shared' ;; xl[cC]* | bgxl[cC]* | mpixl[cC]*) # IBM XL C 8.0 on PPC (deal with xlf below) tmp_sharedflag='-qmkshrobj' tmp_addflag= ;; nvcc*) # Cuda Compiler Driver 2.2 whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' compiler_needs_object=yes ;; esac case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C 5.9 whole_archive_flag_spec='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' compiler_needs_object=yes tmp_sharedflag='-G' ;; *Sun\ F*) # Sun Fortran 8.3 tmp_sharedflag='-G' ;; esac archive_cmds='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' if test "x$supports_anon_versioning" = xyes; then archive_expsym_cmds='echo "{ global:" > $output_objdir/$libname.ver~ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ echo "local: *; };" >> $output_objdir/$libname.ver~ $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' fi case $cc_basename in xlf* | bgf* | bgxlf* | mpixlf*) # IBM XL Fortran 10.1 on PPC cannot create shared libs itself whole_archive_flag_spec='--whole-archive$convenience --no-whole-archive' hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' archive_cmds='$LD -shared $libobjs $deplibs $linker_flags -soname $soname -o $lib' if test "x$supports_anon_versioning" = xyes; then archive_expsym_cmds='echo "{ global:" > $output_objdir/$libname.ver~ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ echo "local: *; };" >> $output_objdir/$libname.ver~ $LD -shared $libobjs $deplibs $linker_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib' fi ;; esac else ld_shlibs=no fi ;; netbsd*) if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then archive_cmds='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' wlarc= else archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' fi ;; solaris*) if $LD -v 2>&1 | $GREP 'BFD 2\.8' > /dev/null; then ld_shlibs=no cat <<_LT_EOF 1>&2 *** Warning: The releases 2.8.* of the GNU linker cannot reliably *** create shared libraries on Solaris systems. Therefore, libtool *** is disabling shared libraries support. We urge you to upgrade GNU *** binutils to release 2.9.1 or newer. Another option is to modify *** your PATH or compiler configuration so that the native linker is *** used, and then restart. _LT_EOF elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' else ld_shlibs=no fi ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*) case `$LD -v 2>&1` in *\ [01].* | *\ 2.[0-9].* | *\ 2.1[0-5].*) ld_shlibs=no cat <<_LT_EOF 1>&2 *** Warning: Releases of the GNU linker prior to 2.16.91.0.3 can not *** reliably create shared libraries on SCO systems. Therefore, libtool *** is disabling shared libraries support. We urge you to upgrade GNU *** binutils to release 2.16.91.0.3 or newer. Another option is to modify *** your PATH or compiler configuration so that the native linker is *** used, and then restart. _LT_EOF ;; *) # For security reasons, it is highly recommended that you always # use absolute paths for naming shared libraries, and exclude the # DT_RUNPATH tag from executables and libraries. But doing so # requires that you compile everything twice, which is a pain. if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' else ld_shlibs=no fi ;; esac ;; sunos4*) archive_cmds='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' wlarc= hardcode_direct=yes hardcode_shlibpath_var=no ;; *) if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' else ld_shlibs=no fi ;; esac if test "$ld_shlibs" = no; then runpath_var= hardcode_libdir_flag_spec= export_dynamic_flag_spec= whole_archive_flag_spec= fi else # PORTME fill in a description of your system's linker (not GNU ld) case $host_os in aix3*) allow_undefined_flag=unsupported always_export_symbols=yes archive_expsym_cmds='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname' # Note: this linker hardcodes the directories in LIBPATH if there # are no directories specified by -L. hardcode_minus_L=yes if test "$GCC" = yes && test -z "$lt_prog_compiler_static"; then # Neither direct hardcoding nor static linking is supported with a # broken collect2. hardcode_direct=unsupported fi ;; aix[4-9]*) if test "$host_cpu" = ia64; then # On IA64, the linker does run time linking by default, so we don't # have to do anything special. aix_use_runtimelinking=no exp_sym_flag='-Bexport' no_entry_flag="" else # If we're using GNU nm, then we don't want the "-C" option. # -C means demangle to AIX nm, but means don't demangle with GNU nm # Also, AIX nm treats weak defined symbols like other global # defined symbols, whereas GNU nm marks them as "W". if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then export_symbols_cmds='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' else export_symbols_cmds='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' fi aix_use_runtimelinking=no # Test if we are trying to use run time linking or normal # AIX style linking. If -brtl is somewhere in LDFLAGS, we # need to do runtime linking. case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*) for ld_flag in $LDFLAGS; do if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then aix_use_runtimelinking=yes break fi done ;; esac exp_sym_flag='-bexport' no_entry_flag='-bnoentry' fi # When large executables or shared objects are built, AIX ld can # have problems creating the table of contents. If linking a library # or program results in "error TOC overflow" add -mminimal-toc to # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. archive_cmds='' hardcode_direct=yes hardcode_direct_absolute=yes hardcode_libdir_separator=':' link_all_deplibs=yes file_list_spec='${wl}-f,' if test "$GCC" = yes; then case $host_os in aix4.[012]|aix4.[012].*) # We only want to do this on AIX 4.2 and lower, the check # below for broken collect2 doesn't work under 4.3+ collect2name=`${CC} -print-prog-name=collect2` if test -f "$collect2name" && strings "$collect2name" | $GREP resolve_lib_name >/dev/null then # We have reworked collect2 : else # We have old collect2 hardcode_direct=unsupported # It fails to find uninstalled libraries when the uninstalled # path is not listed in the libpath. Setting hardcode_minus_L # to unsupported forces relinking hardcode_minus_L=yes hardcode_libdir_flag_spec='-L$libdir' hardcode_libdir_separator= fi ;; esac shared_flag='-shared' if test "$aix_use_runtimelinking" = yes; then shared_flag="$shared_flag "'${wl}-G' fi else # not using gcc if test "$host_cpu" = ia64; then # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release # chokes on -Wl,-G. The following line is correct: shared_flag='-G' else if test "$aix_use_runtimelinking" = yes; then shared_flag='${wl}-G' else shared_flag='${wl}-bM:SRE' fi fi fi export_dynamic_flag_spec='${wl}-bexpall' # It seems that -bexpall does not export symbols beginning with # underscore (_), so it is better to generate a list of symbols to export. always_export_symbols=yes if test "$aix_use_runtimelinking" = yes; then # Warning - without using the other runtime loading flags (-brtl), # -berok will link without error, but may produce a broken library. allow_undefined_flag='-berok' # Determine the default libpath from the value encoded in an # empty executable. if test "${lt_cv_aix_libpath+set}" = set; then aix_libpath=$lt_cv_aix_libpath else if ${lt_cv_aix_libpath_+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : lt_aix_libpath_sed=' /Import File Strings/,/^$/ { /^0/ { s/^0 *\([^ ]*\) *$/\1/ p } }' lt_cv_aix_libpath_=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` # Check for a 64-bit object if we didn't find anything. if test -z "$lt_cv_aix_libpath_"; then lt_cv_aix_libpath_=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` fi fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test -z "$lt_cv_aix_libpath_"; then lt_cv_aix_libpath_="/usr/lib:/lib" fi fi aix_libpath=$lt_cv_aix_libpath_ fi hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath" archive_expsym_cmds='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" else if test "$host_cpu" = ia64; then hardcode_libdir_flag_spec='${wl}-R $libdir:/usr/lib:/lib' allow_undefined_flag="-z nodefs" archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" else # Determine the default libpath from the value encoded in an # empty executable. if test "${lt_cv_aix_libpath+set}" = set; then aix_libpath=$lt_cv_aix_libpath else if ${lt_cv_aix_libpath_+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : lt_aix_libpath_sed=' /Import File Strings/,/^$/ { /^0/ { s/^0 *\([^ ]*\) *$/\1/ p } }' lt_cv_aix_libpath_=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` # Check for a 64-bit object if we didn't find anything. if test -z "$lt_cv_aix_libpath_"; then lt_cv_aix_libpath_=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` fi fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test -z "$lt_cv_aix_libpath_"; then lt_cv_aix_libpath_="/usr/lib:/lib" fi fi aix_libpath=$lt_cv_aix_libpath_ fi hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath" # Warning - without using the other run time loading flags, # -berok will link without error, but may produce a broken library. no_undefined_flag=' ${wl}-bernotok' allow_undefined_flag=' ${wl}-berok' if test "$with_gnu_ld" = yes; then # We only use this code for GNU lds that support --whole-archive. whole_archive_flag_spec='${wl}--whole-archive$convenience ${wl}--no-whole-archive' else # Exported symbols can be pulled into shared objects from archives whole_archive_flag_spec='$convenience' fi archive_cmds_need_lc=yes # This is similar to how AIX traditionally builds its shared libraries. archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' fi fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds='' ;; m68k) archive_cmds='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' hardcode_libdir_flag_spec='-L$libdir' hardcode_minus_L=yes ;; esac ;; bsdi[45]*) export_dynamic_flag_spec=-rdynamic ;; cygwin* | mingw* | pw32* | cegcc*) # When not using gcc, we currently assume that we are using # Microsoft Visual C++. # hardcode_libdir_flag_spec is actually meaningless, as there is # no search path for DLLs. case $cc_basename in cl*) # Native MSVC hardcode_libdir_flag_spec=' ' allow_undefined_flag=unsupported always_export_symbols=yes file_list_spec='@' # Tell ltmain to make .lib files, not .a files. libext=lib # Tell ltmain to make .dll files, not .so files. shrext_cmds=".dll" # FIXME: Setting linknames here is a bad hack. archive_cmds='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames=' archive_expsym_cmds='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then sed -n -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' -e '1\\\!p' < $export_symbols > $output_objdir/$soname.exp; else sed -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp; fi~ $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ linknames=' # The linker will not automatically build a static lib if we build a DLL. # _LT_TAGVAR(old_archive_from_new_cmds, )='true' enable_shared_with_static_runtimes=yes exclude_expsyms='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*' export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1,DATA/'\'' | $SED -e '\''/^[AITW][ ]/s/.*[ ]//'\'' | sort | uniq > $export_symbols' # Don't use ranlib old_postinstall_cmds='chmod 644 $oldlib' postlink_cmds='lt_outputfile="@OUTPUT@"~ lt_tool_outputfile="@TOOL_OUTPUT@"~ case $lt_outputfile in *.exe|*.EXE) ;; *) lt_outputfile="$lt_outputfile.exe" lt_tool_outputfile="$lt_tool_outputfile.exe" ;; esac~ if test "$MANIFEST_TOOL" != ":" && test -f "$lt_outputfile.manifest"; then $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; $RM "$lt_outputfile.manifest"; fi' ;; *) # Assume MSVC wrapper hardcode_libdir_flag_spec=' ' allow_undefined_flag=unsupported # Tell ltmain to make .lib files, not .a files. libext=lib # Tell ltmain to make .dll files, not .so files. shrext_cmds=".dll" # FIXME: Setting linknames here is a bad hack. archive_cmds='$CC -o $lib $libobjs $compiler_flags `func_echo_all "$deplibs" | $SED '\''s/ -lc$//'\''` -link -dll~linknames=' # The linker will automatically build a .lib file if we build a DLL. old_archive_from_new_cmds='true' # FIXME: Should let the user specify the lib program. old_archive_cmds='lib -OUT:$oldlib$oldobjs$old_deplibs' enable_shared_with_static_runtimes=yes ;; esac ;; darwin* | rhapsody*) archive_cmds_need_lc=no hardcode_direct=no hardcode_automatic=yes hardcode_shlibpath_var=unsupported if test "$lt_cv_ld_force_load" = "yes"; then whole_archive_flag_spec='`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience ${wl}-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`' else whole_archive_flag_spec='' fi link_all_deplibs=yes allow_undefined_flag="$_lt_dar_allow_undefined" case $cc_basename in ifort*) _lt_dar_can_shared=yes ;; *) _lt_dar_can_shared=$GCC ;; esac if test "$_lt_dar_can_shared" = "yes"; then output_verbose_link_cmd=func_echo_all archive_cmds="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}" module_cmds="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}" archive_expsym_cmds="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}" module_expsym_cmds="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}" else ld_shlibs=no fi ;; dgux*) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_libdir_flag_spec='-L$libdir' hardcode_shlibpath_var=no ;; # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor # support. Future versions do this automatically, but an explicit c++rt0.o # does not break anything, and helps significantly (at the cost of a little # extra space). freebsd2.2*) archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' hardcode_libdir_flag_spec='-R$libdir' hardcode_direct=yes hardcode_shlibpath_var=no ;; # Unfortunately, older versions of FreeBSD 2 do not have this feature. freebsd2.*) archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' hardcode_direct=yes hardcode_minus_L=yes hardcode_shlibpath_var=no ;; # FreeBSD 3 and greater uses gcc -shared to do shared libraries. freebsd* | dragonfly*) archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' hardcode_libdir_flag_spec='-R$libdir' hardcode_direct=yes hardcode_shlibpath_var=no ;; hpux9*) if test "$GCC" = yes; then archive_cmds='$RM $output_objdir/$soname~$CC -shared $pic_flag ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' else archive_cmds='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' fi hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' hardcode_libdir_separator=: hardcode_direct=yes # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. hardcode_minus_L=yes export_dynamic_flag_spec='${wl}-E' ;; hpux10*) if test "$GCC" = yes && test "$with_gnu_ld" = no; then archive_cmds='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' fi if test "$with_gnu_ld" = no; then hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' hardcode_libdir_separator=: hardcode_direct=yes hardcode_direct_absolute=yes export_dynamic_flag_spec='${wl}-E' # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. hardcode_minus_L=yes fi ;; hpux11*) if test "$GCC" = yes && test "$with_gnu_ld" = no; then case $host_cpu in hppa*64*) archive_cmds='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' ;; ia64*) archive_cmds='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' ;; *) archive_cmds='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' ;; esac else case $host_cpu in hppa*64*) archive_cmds='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' ;; ia64*) archive_cmds='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' ;; *) # Older versions of the 11.00 compiler do not understand -b yet # (HP92453-01 A.11.01.20 doesn't, HP92453-01 B.11.X.35175-35176.GP does) { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC understands -b" >&5 $as_echo_n "checking if $CC understands -b... " >&6; } if ${lt_cv_prog_compiler__b+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler__b=no save_LDFLAGS="$LDFLAGS" LDFLAGS="$LDFLAGS -b" echo "$lt_simple_link_test_code" > conftest.$ac_ext if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then # The linker can only warn and ignore the option if not recognized # So say no if there are warnings if test -s conftest.err; then # Append any errors to the config.log. cat conftest.err 1>&5 $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if diff conftest.exp conftest.er2 >/dev/null; then lt_cv_prog_compiler__b=yes fi else lt_cv_prog_compiler__b=yes fi fi $RM -r conftest* LDFLAGS="$save_LDFLAGS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler__b" >&5 $as_echo "$lt_cv_prog_compiler__b" >&6; } if test x"$lt_cv_prog_compiler__b" = xyes; then archive_cmds='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' fi ;; esac fi if test "$with_gnu_ld" = no; then hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' hardcode_libdir_separator=: case $host_cpu in hppa*64*|ia64*) hardcode_direct=no hardcode_shlibpath_var=no ;; *) hardcode_direct=yes hardcode_direct_absolute=yes export_dynamic_flag_spec='${wl}-E' # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. hardcode_minus_L=yes ;; esac fi ;; irix5* | irix6* | nonstopux*) if test "$GCC" = yes; then archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' # Try to use the -exported_symbol ld option, if it does not # work, assume that -exports_file does not work either and # implicitly export all symbols. # This should be the same for all languages, so no per-tag cache variable. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $host_os linker accepts -exported_symbol" >&5 $as_echo_n "checking whether the $host_os linker accepts -exported_symbol... " >&6; } if ${lt_cv_irix_exported_symbol+:} false; then : $as_echo_n "(cached) " >&6 else save_LDFLAGS="$LDFLAGS" LDFLAGS="$LDFLAGS -shared ${wl}-exported_symbol ${wl}foo ${wl}-update_registry ${wl}/dev/null" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int foo (void) { return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : lt_cv_irix_exported_symbol=yes else lt_cv_irix_exported_symbol=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LDFLAGS="$save_LDFLAGS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_irix_exported_symbol" >&5 $as_echo "$lt_cv_irix_exported_symbol" >&6; } if test "$lt_cv_irix_exported_symbol" = yes; then archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations ${wl}-exports_file ${wl}$export_symbols -o $lib' fi else archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -exports_file $export_symbols -o $lib' fi archive_cmds_need_lc='no' hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator=: inherit_rpath=yes link_all_deplibs=yes ;; netbsd*) if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out else archive_cmds='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF fi hardcode_libdir_flag_spec='-R$libdir' hardcode_direct=yes hardcode_shlibpath_var=no ;; newsos6) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_direct=yes hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator=: hardcode_shlibpath_var=no ;; *nto* | *qnx*) ;; openbsd*) if test -f /usr/libexec/ld.so; then hardcode_direct=yes hardcode_shlibpath_var=no hardcode_direct_absolute=yes if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols' hardcode_libdir_flag_spec='${wl}-rpath,$libdir' export_dynamic_flag_spec='${wl}-E' else case $host_os in openbsd[01].* | openbsd2.[0-7] | openbsd2.[0-7].*) archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' hardcode_libdir_flag_spec='-R$libdir' ;; *) archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' hardcode_libdir_flag_spec='${wl}-rpath,$libdir' ;; esac fi else ld_shlibs=no fi ;; os2*) hardcode_libdir_flag_spec='-L$libdir' hardcode_minus_L=yes allow_undefined_flag=unsupported archive_cmds='$ECHO "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~echo DATA >> $output_objdir/$libname.def~echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def' old_archive_from_new_cmds='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def' ;; osf3*) if test "$GCC" = yes; then allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*' archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' else allow_undefined_flag=' -expect_unresolved \*' archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' fi archive_cmds_need_lc='no' hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator=: ;; osf4* | osf5*) # as osf3* with the addition of -msym flag if test "$GCC" = yes; then allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*' archive_cmds='$CC -shared${allow_undefined_flag} $pic_flag $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' else allow_undefined_flag=' -expect_unresolved \*' archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' archive_expsym_cmds='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; printf "%s\\n" "-hidden">> $lib.exp~ $CC -shared${allow_undefined_flag} ${wl}-input ${wl}$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib~$RM $lib.exp' # Both c and cxx compiler support -rpath directly hardcode_libdir_flag_spec='-rpath $libdir' fi archive_cmds_need_lc='no' hardcode_libdir_separator=: ;; solaris*) no_undefined_flag=' -z defs' if test "$GCC" = yes; then wlarc='${wl}' archive_cmds='$CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' else case `$CC -V 2>&1` in *"Compilers 5.0"*) wlarc='' archive_cmds='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp' ;; *) wlarc='${wl}' archive_cmds='$CC -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' ;; esac fi hardcode_libdir_flag_spec='-R$libdir' hardcode_shlibpath_var=no case $host_os in solaris2.[0-5] | solaris2.[0-5].*) ;; *) # The compiler driver will combine and reorder linker options, # but understands `-z linker_flag'. GCC discards it without `$wl', # but is careful enough not to reorder. # Supported since Solaris 2.6 (maybe 2.5.1?) if test "$GCC" = yes; then whole_archive_flag_spec='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' else whole_archive_flag_spec='-z allextract$convenience -z defaultextract' fi ;; esac link_all_deplibs=yes ;; sunos4*) if test "x$host_vendor" = xsequent; then # Use $CC to link under sequent, because it throws in some extra .o # files that make .init and .fini sections work. archive_cmds='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' fi hardcode_libdir_flag_spec='-L$libdir' hardcode_direct=yes hardcode_minus_L=yes hardcode_shlibpath_var=no ;; sysv4) case $host_vendor in sni) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_direct=yes # is this really true??? ;; siemens) ## LD is ld it makes a PLAMLIB ## CC just makes a GrossModule. archive_cmds='$LD -G -o $lib $libobjs $deplibs $linker_flags' reload_cmds='$CC -r -o $output$reload_objs' hardcode_direct=no ;; motorola) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_direct=no #Motorola manual says yes, but my tests say they lie ;; esac runpath_var='LD_RUN_PATH' hardcode_shlibpath_var=no ;; sysv4.3*) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_shlibpath_var=no export_dynamic_flag_spec='-Bexport' ;; sysv4*MP*) if test -d /usr/nec; then archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_shlibpath_var=no runpath_var=LD_RUN_PATH hardcode_runpath_var=yes ld_shlibs=yes fi ;; sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*) no_undefined_flag='${wl}-z,text' archive_cmds_need_lc=no hardcode_shlibpath_var=no runpath_var='LD_RUN_PATH' if test "$GCC" = yes; then archive_cmds='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' fi ;; sysv5* | sco3.2v5* | sco5v6*) # Note: We can NOT use -z defs as we might desire, because we do not # link with -lc, and that would cause any symbols used from libc to # always be unresolved, which means just about no library would # ever link correctly. If we're not using GNU ld we use -z text # though, which does catch some bad symbols but isn't as heavy-handed # as -z defs. no_undefined_flag='${wl}-z,text' allow_undefined_flag='${wl}-z,nodefs' archive_cmds_need_lc=no hardcode_shlibpath_var=no hardcode_libdir_flag_spec='${wl}-R,$libdir' hardcode_libdir_separator=':' link_all_deplibs=yes export_dynamic_flag_spec='${wl}-Bexport' runpath_var='LD_RUN_PATH' if test "$GCC" = yes; then archive_cmds='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' fi ;; uts4*) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_libdir_flag_spec='-L$libdir' hardcode_shlibpath_var=no ;; *) ld_shlibs=no ;; esac if test x$host_vendor = xsni; then case $host in sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) export_dynamic_flag_spec='${wl}-Blargedynsym' ;; esac fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs" >&5 $as_echo "$ld_shlibs" >&6; } test "$ld_shlibs" = no && can_build_shared=no with_gnu_ld=$with_gnu_ld # # Do we need to explicitly link libc? # case "x$archive_cmds_need_lc" in x|xyes) # Assume -lc should be added archive_cmds_need_lc=yes if test "$enable_shared" = yes && test "$GCC" = yes; then case $archive_cmds in *'~'*) # FIXME: we may have to deal with multi-command sequences. ;; '$CC '*) # Test whether the compiler implicitly links with -lc since on some # systems, -lgcc has to come before -lc. If gcc already passes -lc # to ld, don't add -lc before -lgcc. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -lc should be explicitly linked in" >&5 $as_echo_n "checking whether -lc should be explicitly linked in... " >&6; } if ${lt_cv_archive_cmds_need_lc+:} false; then : $as_echo_n "(cached) " >&6 else $RM conftest* echo "$lt_simple_compile_test_code" > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } 2>conftest.err; then soname=conftest lib=conftest libobjs=conftest.$ac_objext deplibs= wl=$lt_prog_compiler_wl pic_flag=$lt_prog_compiler_pic compiler_flags=-v linker_flags=-v verstring= output_objdir=. libname=conftest lt_save_allow_undefined_flag=$allow_undefined_flag allow_undefined_flag= if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$archive_cmds 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1\""; } >&5 (eval $archive_cmds 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } then lt_cv_archive_cmds_need_lc=no else lt_cv_archive_cmds_need_lc=yes fi allow_undefined_flag=$lt_save_allow_undefined_flag else cat conftest.err 1>&5 fi $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_archive_cmds_need_lc" >&5 $as_echo "$lt_cv_archive_cmds_need_lc" >&6; } archive_cmds_need_lc=$lt_cv_archive_cmds_need_lc ;; esac fi ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking dynamic linker characteristics" >&5 $as_echo_n "checking dynamic linker characteristics... " >&6; } if test "$GCC" = yes; then case $host_os in darwin*) lt_awk_arg="/^libraries:/,/LR/" ;; *) lt_awk_arg="/^libraries:/" ;; esac case $host_os in mingw* | cegcc*) lt_sed_strip_eq="s,=\([A-Za-z]:\),\1,g" ;; *) lt_sed_strip_eq="s,=/,/,g" ;; esac lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e $lt_sed_strip_eq` case $lt_search_path_spec in *\;*) # if the path contains ";" then we assume it to be the separator # otherwise default to the standard path separator (i.e. ":") - it is # assumed that no part of a normal pathname contains ";" but that should # okay in the real world where ";" in dirpaths is itself problematic. lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED 's/;/ /g'` ;; *) lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED "s/$PATH_SEPARATOR/ /g"` ;; esac # Ok, now we have the path, separated by spaces, we can step through it # and add multilib dir if necessary. lt_tmp_lt_search_path_spec= lt_multi_os_dir=`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null` for lt_sys_path in $lt_search_path_spec; do if test -d "$lt_sys_path/$lt_multi_os_dir"; then lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path/$lt_multi_os_dir" else test -d "$lt_sys_path" && \ lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path" fi done lt_search_path_spec=`$ECHO "$lt_tmp_lt_search_path_spec" | awk ' BEGIN {RS=" "; FS="/|\n";} { lt_foo=""; lt_count=0; for (lt_i = NF; lt_i > 0; lt_i--) { if ($lt_i != "" && $lt_i != ".") { if ($lt_i == "..") { lt_count++; } else { if (lt_count == 0) { lt_foo="/" $lt_i lt_foo; } else { lt_count--; } } } } if (lt_foo != "") { lt_freq[lt_foo]++; } if (lt_freq[lt_foo] == 1) { print lt_foo; } }'` # AWK program above erroneously prepends '/' to C:/dos/paths # for these hosts. case $host_os in mingw* | cegcc*) lt_search_path_spec=`$ECHO "$lt_search_path_spec" |\ $SED 's,/\([A-Za-z]:\),\1,g'` ;; esac sys_lib_search_path_spec=`$ECHO "$lt_search_path_spec" | $lt_NL2SP` else sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" fi library_names_spec= libname_spec='lib$name' soname_spec= shrext_cmds=".so" postinstall_cmds= postuninstall_cmds= finish_cmds= finish_eval= shlibpath_var= shlibpath_overrides_runpath=unknown version_type=none dynamic_linker="$host_os ld.so" sys_lib_dlsearch_path_spec="/lib /usr/lib" need_lib_prefix=unknown hardcode_into_libs=no # when you set need_version to no, make sure it does not cause -set_version # flags to be left without arguments need_version=unknown case $host_os in aix3*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a' shlibpath_var=LIBPATH # AIX 3 has no versioning support, so we append a major version to the name. soname_spec='${libname}${release}${shared_ext}$major' ;; aix[4-9]*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no hardcode_into_libs=yes if test "$host_cpu" = ia64; then # AIX 5 supports IA64 library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH else # With GCC up to 2.95.x, collect2 would create an import file # for dependence libraries. The import file would start with # the line `#! .'. This would cause the generated library to # depend on `.', always an invalid library. This was fixed in # development snapshots of GCC prior to 3.0. case $host_os in aix4 | aix4.[01] | aix4.[01].*) if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' echo ' yes ' echo '#endif'; } | ${CC} -E - | $GREP yes > /dev/null; then : else can_build_shared=no fi ;; esac # AIX (on Power*) has no versioning support, so currently we can not hardcode correct # soname into executable. Probably we can add versioning support to # collect2, so additional links can be useful in future. if test "$aix_use_runtimelinking" = yes; then # If using run time linking (on AIX 4.2 or later) use lib.so # instead of lib.a to let people know that these are not # typical AIX shared libraries. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' else # We preserve .a as extension for shared libraries through AIX4.2 # and later when we are not doing run time linking. library_names_spec='${libname}${release}.a $libname.a' soname_spec='${libname}${release}${shared_ext}$major' fi shlibpath_var=LIBPATH fi ;; amigaos*) case $host_cpu in powerpc) # Since July 2007 AmigaOS4 officially supports .so libraries. # When compiling the executable, add -use-dynld -Lsobjs: to the compileline. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' ;; m68k) library_names_spec='$libname.ixlibrary $libname.a' # Create ${libname}_ixlibrary.a entries in /sys/libs. finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' ;; esac ;; beos*) library_names_spec='${libname}${shared_ext}' dynamic_linker="$host_os ld.so" shlibpath_var=LIBRARY_PATH ;; bsdi[45]*) version_type=linux # correct to gnu/linux during the next big refactor need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" # the default ld.so.conf also contains /usr/contrib/lib and # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow # libtool to hard-code these into programs ;; cygwin* | mingw* | pw32* | cegcc*) version_type=windows shrext_cmds=".dll" need_version=no need_lib_prefix=no case $GCC,$cc_basename in yes,*) # gcc library_names_spec='$libname.dll.a' # DLL is installed to $(libdir)/../bin by postinstall_cmds postinstall_cmds='base_file=`basename \${file}`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname~ chmod a+x \$dldir/$dlname~ if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; fi' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ dlpath=$dir/\$dldll~ $RM \$dlpath' shlibpath_overrides_runpath=yes case $host_os in cygwin*) # Cygwin DLLs use 'cyg' prefix rather than 'lib' soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/lib/w32api" ;; mingw* | cegcc*) # MinGW DLLs use traditional 'lib' prefix soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' ;; pw32*) # pw32 DLLs use 'pw' prefix rather than 'lib' library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' ;; esac dynamic_linker='Win32 ld.exe' ;; *,cl*) # Native MSVC libname_spec='$name' soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' library_names_spec='${libname}.dll.lib' case $build_os in mingw*) sys_lib_search_path_spec= lt_save_ifs=$IFS IFS=';' for lt_path in $LIB do IFS=$lt_save_ifs # Let DOS variable expansion print the short 8.3 style file name. lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"` sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path" done IFS=$lt_save_ifs # Convert to MSYS style. sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | sed -e 's|\\\\|/|g' -e 's| \\([a-zA-Z]\\):| /\\1|g' -e 's|^ ||'` ;; cygwin*) # Convert to unix form, then to dos form, then back to unix form # but this time dos style (no spaces!) so that the unix form looks # like /cygdrive/c/PROGRA~1:/cygdr... sys_lib_search_path_spec=`cygpath --path --unix "$LIB"` sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null` sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` ;; *) sys_lib_search_path_spec="$LIB" if $ECHO "$sys_lib_search_path_spec" | $GREP ';[c-zC-Z]:/' >/dev/null; then # It is most probably a Windows format PATH. sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` else sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` fi # FIXME: find the short name or the path components, as spaces are # common. (e.g. "Program Files" -> "PROGRA~1") ;; esac # DLL is installed to $(libdir)/../bin by postinstall_cmds postinstall_cmds='base_file=`basename \${file}`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ dlpath=$dir/\$dldll~ $RM \$dlpath' shlibpath_overrides_runpath=yes dynamic_linker='Win32 link.exe' ;; *) # Assume MSVC wrapper library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib' dynamic_linker='Win32 ld.exe' ;; esac # FIXME: first we should search . and the directory the executable is in shlibpath_var=PATH ;; darwin* | rhapsody*) dynamic_linker="$host_os dyld" version_type=darwin need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${major}$shared_ext ${libname}$shared_ext' soname_spec='${libname}${release}${major}$shared_ext' shlibpath_overrides_runpath=yes shlibpath_var=DYLD_LIBRARY_PATH shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/local/lib" sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' ;; dgux*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH ;; freebsd* | dragonfly*) # DragonFly does not have aout. When/if they implement a new # versioning mechanism, adjust this. if test -x /usr/bin/objformat; then objformat=`/usr/bin/objformat` else case $host_os in freebsd[23].*) objformat=aout ;; *) objformat=elf ;; esac fi version_type=freebsd-$objformat case $version_type in freebsd-elf*) library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' need_version=no need_lib_prefix=no ;; freebsd-*) library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix' need_version=yes ;; esac shlibpath_var=LD_LIBRARY_PATH case $host_os in freebsd2.*) shlibpath_overrides_runpath=yes ;; freebsd3.[01]* | freebsdelf3.[01]*) shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; freebsd3.[2-9]* | freebsdelf3.[2-9]* | \ freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1) shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; *) # from 4.6 on, and DragonFly shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; esac ;; gnu*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; haiku*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no dynamic_linker="$host_os runtime_loader" library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LIBRARY_PATH shlibpath_overrides_runpath=yes sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib' hardcode_into_libs=yes ;; hpux9* | hpux10* | hpux11*) # Give a soname corresponding to the major version so that dld.sl refuses to # link against other versions. version_type=sunos need_lib_prefix=no need_version=no case $host_cpu in ia64*) shrext_cmds='.so' hardcode_into_libs=yes dynamic_linker="$host_os dld.so" shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' if test "X$HPUX_IA64_MODE" = X32; then sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" else sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" fi sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; hppa*64*) shrext_cmds='.sl' hardcode_into_libs=yes dynamic_linker="$host_os dld.sl" shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; *) shrext_cmds='.sl' dynamic_linker="$host_os dld.sl" shlibpath_var=SHLIB_PATH shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' ;; esac # HP-UX runs *really* slowly unless shared libraries are mode 555, ... postinstall_cmds='chmod 555 $lib' # or fails outright, so override atomically: install_override_mode=555 ;; interix[3-9]*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; irix5* | irix6* | nonstopux*) case $host_os in nonstopux*) version_type=nonstopux ;; *) if test "$lt_cv_prog_gnu_ld" = yes; then version_type=linux # correct to gnu/linux during the next big refactor else version_type=irix fi ;; esac need_lib_prefix=no need_version=no soname_spec='${libname}${release}${shared_ext}$major' library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}' case $host_os in irix5* | nonstopux*) libsuff= shlibsuff= ;; *) case $LD in # libtool.m4 will add one of these switches to LD *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") libsuff= shlibsuff= libmagic=32-bit;; *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") libsuff=32 shlibsuff=N32 libmagic=N32;; *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") libsuff=64 shlibsuff=64 libmagic=64-bit;; *) libsuff= shlibsuff= libmagic=never-match;; esac ;; esac shlibpath_var=LD_LIBRARY${shlibsuff}_PATH shlibpath_overrides_runpath=no sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" hardcode_into_libs=yes ;; # No shared lib support for Linux oldld, aout, or coff. linux*oldld* | linux*aout* | linux*coff*) dynamic_linker=no ;; # This must be glibc/ELF. linux* | k*bsd*-gnu | kopensolaris*-gnu) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no # Some binutils ld are patched to set DT_RUNPATH if ${lt_cv_shlibpath_overrides_runpath+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_shlibpath_overrides_runpath=no save_LDFLAGS=$LDFLAGS save_libdir=$libdir eval "libdir=/foo; wl=\"$lt_prog_compiler_wl\"; \ LDFLAGS=\"\$LDFLAGS $hardcode_libdir_flag_spec\"" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : if ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null; then : lt_cv_shlibpath_overrides_runpath=yes fi fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LDFLAGS=$save_LDFLAGS libdir=$save_libdir fi shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath # This implies no fast_install, which is unacceptable. # Some rework will be needed to allow for fast_install # before this can be enabled. hardcode_into_libs=yes # Append ld.so.conf contents to the search path if test -f /etc/ld.so.conf; then lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '` sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" fi # We used to test for /lib/ld.so.1 and disable shared libraries on # powerpc, because MkLinux only supported shared libraries with the # GNU dynamic linker. Since this was broken with cross compilers, # most powerpc-linux boxes support dynamic linking these days and # people can always --disable-shared, the test was removed, and we # assume the GNU/Linux dynamic linker is in use. dynamic_linker='GNU/Linux ld.so' ;; netbsd*) version_type=sunos need_lib_prefix=no need_version=no if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' dynamic_linker='NetBSD (a.out) ld.so' else library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' dynamic_linker='NetBSD ld.elf_so' fi shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; newsos6) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes ;; *nto* | *qnx*) version_type=qnx need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes dynamic_linker='ldqnx.so' ;; openbsd*) version_type=sunos sys_lib_dlsearch_path_spec="/usr/lib" need_lib_prefix=no # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs. case $host_os in openbsd3.3 | openbsd3.3.*) need_version=yes ;; *) need_version=no ;; esac library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' shlibpath_var=LD_LIBRARY_PATH if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then case $host_os in openbsd2.[89] | openbsd2.[89].*) shlibpath_overrides_runpath=no ;; *) shlibpath_overrides_runpath=yes ;; esac else shlibpath_overrides_runpath=yes fi ;; os2*) libname_spec='$name' shrext_cmds=".dll" need_lib_prefix=no library_names_spec='$libname${shared_ext} $libname.a' dynamic_linker='OS/2 ld.exe' shlibpath_var=LIBPATH ;; osf3* | osf4* | osf5*) version_type=osf need_lib_prefix=no need_version=no soname_spec='${libname}${release}${shared_ext}$major' library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" ;; rdos*) dynamic_linker=no ;; solaris*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes # ldd complains unless libraries are executable postinstall_cmds='chmod +x $lib' ;; sunos4*) version_type=sunos library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes if test "$with_gnu_ld" = yes; then need_lib_prefix=no fi need_version=yes ;; sysv4 | sysv4.3*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH case $host_vendor in sni) shlibpath_overrides_runpath=no need_lib_prefix=no runpath_var=LD_RUN_PATH ;; siemens) need_lib_prefix=no ;; motorola) need_lib_prefix=no need_version=no shlibpath_overrides_runpath=no sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' ;; esac ;; sysv4*MP*) if test -d /usr/nec ;then version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' soname_spec='$libname${shared_ext}.$major' shlibpath_var=LD_LIBRARY_PATH fi ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) version_type=freebsd-elf need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes if test "$with_gnu_ld" = yes; then sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' else sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' case $host_os in sco3.2v5*) sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" ;; esac fi sys_lib_dlsearch_path_spec='/usr/lib' ;; tpf*) # TPF is a cross-target only. Preferred cross-host = GNU/Linux. version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; uts4*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH ;; *) dynamic_linker=no ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: result: $dynamic_linker" >&5 $as_echo "$dynamic_linker" >&6; } test "$dynamic_linker" = no && can_build_shared=no variables_saved_for_relink="PATH $shlibpath_var $runpath_var" if test "$GCC" = yes; then variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" fi if test "${lt_cv_sys_lib_search_path_spec+set}" = set; then sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec" fi if test "${lt_cv_sys_lib_dlsearch_path_spec+set}" = set; then sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to hardcode library paths into programs" >&5 $as_echo_n "checking how to hardcode library paths into programs... " >&6; } hardcode_action= if test -n "$hardcode_libdir_flag_spec" || test -n "$runpath_var" || test "X$hardcode_automatic" = "Xyes" ; then # We can hardcode non-existent directories. if test "$hardcode_direct" != no && # If the only mechanism to avoid hardcoding is shlibpath_var, we # have to relink, otherwise we might link with an installed library # when we should be linking with a yet-to-be-installed one ## test "$_LT_TAGVAR(hardcode_shlibpath_var, )" != no && test "$hardcode_minus_L" != no; then # Linking always hardcodes the temporary library directory. hardcode_action=relink else # We can link without hardcoding, and we can hardcode nonexisting dirs. hardcode_action=immediate fi else # We cannot hardcode anything, or else we can only hardcode existing # directories. hardcode_action=unsupported fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hardcode_action" >&5 $as_echo "$hardcode_action" >&6; } if test "$hardcode_action" = relink || test "$inherit_rpath" = yes; then # Fast installation is not supported enable_fast_install=no elif test "$shlibpath_overrides_runpath" = yes || test "$enable_shared" = no; then # Fast installation is not necessary enable_fast_install=needless fi if test "x$enable_dlopen" != xyes; then enable_dlopen=unknown enable_dlopen_self=unknown enable_dlopen_self_static=unknown else lt_cv_dlopen=no lt_cv_dlopen_libs= case $host_os in beos*) lt_cv_dlopen="load_add_on" lt_cv_dlopen_libs= lt_cv_dlopen_self=yes ;; mingw* | pw32* | cegcc*) lt_cv_dlopen="LoadLibrary" lt_cv_dlopen_libs= ;; cygwin*) lt_cv_dlopen="dlopen" lt_cv_dlopen_libs= ;; darwin*) # if libdl is installed we need to link against it { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5 $as_echo_n "checking for dlopen in -ldl... " >&6; } if ${ac_cv_lib_dl_dlopen+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldl $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char dlopen (); int main () { return dlopen (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_dl_dlopen=yes else ac_cv_lib_dl_dlopen=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5 $as_echo "$ac_cv_lib_dl_dlopen" >&6; } if test "x$ac_cv_lib_dl_dlopen" = xyes; then : lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl" else lt_cv_dlopen="dyld" lt_cv_dlopen_libs= lt_cv_dlopen_self=yes fi ;; *) ac_fn_c_check_func "$LINENO" "shl_load" "ac_cv_func_shl_load" if test "x$ac_cv_func_shl_load" = xyes; then : lt_cv_dlopen="shl_load" else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for shl_load in -ldld" >&5 $as_echo_n "checking for shl_load in -ldld... " >&6; } if ${ac_cv_lib_dld_shl_load+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldld $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char shl_load (); int main () { return shl_load (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_dld_shl_load=yes else ac_cv_lib_dld_shl_load=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_shl_load" >&5 $as_echo "$ac_cv_lib_dld_shl_load" >&6; } if test "x$ac_cv_lib_dld_shl_load" = xyes; then : lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-ldld" else ac_fn_c_check_func "$LINENO" "dlopen" "ac_cv_func_dlopen" if test "x$ac_cv_func_dlopen" = xyes; then : lt_cv_dlopen="dlopen" else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5 $as_echo_n "checking for dlopen in -ldl... " >&6; } if ${ac_cv_lib_dl_dlopen+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldl $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char dlopen (); int main () { return dlopen (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_dl_dlopen=yes else ac_cv_lib_dl_dlopen=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5 $as_echo "$ac_cv_lib_dl_dlopen" >&6; } if test "x$ac_cv_lib_dl_dlopen" = xyes; then : lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl" else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -lsvld" >&5 $as_echo_n "checking for dlopen in -lsvld... " >&6; } if ${ac_cv_lib_svld_dlopen+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lsvld $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char dlopen (); int main () { return dlopen (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_svld_dlopen=yes else ac_cv_lib_svld_dlopen=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_svld_dlopen" >&5 $as_echo "$ac_cv_lib_svld_dlopen" >&6; } if test "x$ac_cv_lib_svld_dlopen" = xyes; then : lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld" else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dld_link in -ldld" >&5 $as_echo_n "checking for dld_link in -ldld... " >&6; } if ${ac_cv_lib_dld_dld_link+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldld $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char dld_link (); int main () { return dld_link (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_dld_dld_link=yes else ac_cv_lib_dld_dld_link=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_dld_link" >&5 $as_echo "$ac_cv_lib_dld_dld_link" >&6; } if test "x$ac_cv_lib_dld_dld_link" = xyes; then : lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-ldld" fi fi fi fi fi fi ;; esac if test "x$lt_cv_dlopen" != xno; then enable_dlopen=yes else enable_dlopen=no fi case $lt_cv_dlopen in dlopen) save_CPPFLAGS="$CPPFLAGS" test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H" save_LDFLAGS="$LDFLAGS" wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\" save_LIBS="$LIBS" LIBS="$lt_cv_dlopen_libs $LIBS" { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a program can dlopen itself" >&5 $as_echo_n "checking whether a program can dlopen itself... " >&6; } if ${lt_cv_dlopen_self+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : lt_cv_dlopen_self=cross else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext <<_LT_EOF #line $LINENO "configure" #include "confdefs.h" #if HAVE_DLFCN_H #include #endif #include #ifdef RTLD_GLOBAL # define LT_DLGLOBAL RTLD_GLOBAL #else # ifdef DL_GLOBAL # define LT_DLGLOBAL DL_GLOBAL # else # define LT_DLGLOBAL 0 # endif #endif /* We may have to define LT_DLLAZY_OR_NOW in the command line if we find out it does not work in some platform. */ #ifndef LT_DLLAZY_OR_NOW # ifdef RTLD_LAZY # define LT_DLLAZY_OR_NOW RTLD_LAZY # else # ifdef DL_LAZY # define LT_DLLAZY_OR_NOW DL_LAZY # else # ifdef RTLD_NOW # define LT_DLLAZY_OR_NOW RTLD_NOW # else # ifdef DL_NOW # define LT_DLLAZY_OR_NOW DL_NOW # else # define LT_DLLAZY_OR_NOW 0 # endif # endif # endif # endif #endif /* When -fvisbility=hidden is used, assume the code has been annotated correspondingly for the symbols needed. */ #if defined(__GNUC__) && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3)) int fnord () __attribute__((visibility("default"))); #endif int fnord () { return 42; } int main () { void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); int status = $lt_dlunknown; if (self) { if (dlsym (self,"fnord")) status = $lt_dlno_uscore; else { if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; else puts (dlerror ()); } /* dlclose (self); */ } else puts (dlerror ()); return status; } _LT_EOF if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 (eval $ac_link) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && test -s conftest${ac_exeext} 2>/dev/null; then (./conftest; exit; ) >&5 2>/dev/null lt_status=$? case x$lt_status in x$lt_dlno_uscore) lt_cv_dlopen_self=yes ;; x$lt_dlneed_uscore) lt_cv_dlopen_self=yes ;; x$lt_dlunknown|x*) lt_cv_dlopen_self=no ;; esac else : # compilation failed lt_cv_dlopen_self=no fi fi rm -fr conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self" >&5 $as_echo "$lt_cv_dlopen_self" >&6; } if test "x$lt_cv_dlopen_self" = xyes; then wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\" { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a statically linked program can dlopen itself" >&5 $as_echo_n "checking whether a statically linked program can dlopen itself... " >&6; } if ${lt_cv_dlopen_self_static+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : lt_cv_dlopen_self_static=cross else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext <<_LT_EOF #line $LINENO "configure" #include "confdefs.h" #if HAVE_DLFCN_H #include #endif #include #ifdef RTLD_GLOBAL # define LT_DLGLOBAL RTLD_GLOBAL #else # ifdef DL_GLOBAL # define LT_DLGLOBAL DL_GLOBAL # else # define LT_DLGLOBAL 0 # endif #endif /* We may have to define LT_DLLAZY_OR_NOW in the command line if we find out it does not work in some platform. */ #ifndef LT_DLLAZY_OR_NOW # ifdef RTLD_LAZY # define LT_DLLAZY_OR_NOW RTLD_LAZY # else # ifdef DL_LAZY # define LT_DLLAZY_OR_NOW DL_LAZY # else # ifdef RTLD_NOW # define LT_DLLAZY_OR_NOW RTLD_NOW # else # ifdef DL_NOW # define LT_DLLAZY_OR_NOW DL_NOW # else # define LT_DLLAZY_OR_NOW 0 # endif # endif # endif # endif #endif /* When -fvisbility=hidden is used, assume the code has been annotated correspondingly for the symbols needed. */ #if defined(__GNUC__) && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3)) int fnord () __attribute__((visibility("default"))); #endif int fnord () { return 42; } int main () { void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); int status = $lt_dlunknown; if (self) { if (dlsym (self,"fnord")) status = $lt_dlno_uscore; else { if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; else puts (dlerror ()); } /* dlclose (self); */ } else puts (dlerror ()); return status; } _LT_EOF if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 (eval $ac_link) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && test -s conftest${ac_exeext} 2>/dev/null; then (./conftest; exit; ) >&5 2>/dev/null lt_status=$? case x$lt_status in x$lt_dlno_uscore) lt_cv_dlopen_self_static=yes ;; x$lt_dlneed_uscore) lt_cv_dlopen_self_static=yes ;; x$lt_dlunknown|x*) lt_cv_dlopen_self_static=no ;; esac else : # compilation failed lt_cv_dlopen_self_static=no fi fi rm -fr conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self_static" >&5 $as_echo "$lt_cv_dlopen_self_static" >&6; } fi CPPFLAGS="$save_CPPFLAGS" LDFLAGS="$save_LDFLAGS" LIBS="$save_LIBS" ;; esac case $lt_cv_dlopen_self in yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;; *) enable_dlopen_self=unknown ;; esac case $lt_cv_dlopen_self_static in yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;; *) enable_dlopen_self_static=unknown ;; esac fi striplib= old_striplib= { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether stripping libraries is possible" >&5 $as_echo_n "checking whether stripping libraries is possible... " >&6; } if test -n "$STRIP" && $STRIP -V 2>&1 | $GREP "GNU strip" >/dev/null; then test -z "$old_striplib" && old_striplib="$STRIP --strip-debug" test -z "$striplib" && striplib="$STRIP --strip-unneeded" { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else # FIXME - insert some real tests, host_os isn't really good enough case $host_os in darwin*) if test -n "$STRIP" ; then striplib="$STRIP -x" old_striplib="$STRIP -S" { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi ;; *) { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } ;; esac fi # Report which library types will actually be built { $as_echo "$as_me:${as_lineno-$LINENO}: checking if libtool supports shared libraries" >&5 $as_echo_n "checking if libtool supports shared libraries... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $can_build_shared" >&5 $as_echo "$can_build_shared" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build shared libraries" >&5 $as_echo_n "checking whether to build shared libraries... " >&6; } test "$can_build_shared" = "no" && enable_shared=no # On AIX, shared libraries and static libraries use the same namespace, and # are all built from PIC. case $host_os in aix3*) test "$enable_shared" = yes && enable_static=no if test -n "$RANLIB"; then archive_cmds="$archive_cmds~\$RANLIB \$lib" postinstall_cmds='$RANLIB $lib' fi ;; aix[4-9]*) if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then test "$enable_shared" = yes && enable_static=no fi ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_shared" >&5 $as_echo "$enable_shared" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build static libraries" >&5 $as_echo_n "checking whether to build static libraries... " >&6; } # Make sure either enable_shared or enable_static is yes. test "$enable_shared" = yes || enable_static=yes { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_static" >&5 $as_echo "$enable_static" >&6; } fi ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu CC="$lt_save_CC" if test -n "$CXX" && ( test "X$CXX" != "Xno" && ( (test "X$CXX" = "Xg++" && `g++ -v >/dev/null 2>&1` ) || (test "X$CXX" != "Xg++"))) ; then ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C++ preprocessor" >&5 $as_echo_n "checking how to run the C++ preprocessor... " >&6; } if test -z "$CXXCPP"; then if ${ac_cv_prog_CXXCPP+:} false; then : $as_echo_n "(cached) " >&6 else # Double quotes because CXXCPP needs to be expanded for CXXCPP in "$CXX -E" "/lib/cpp" do ac_preproc_ok=false for ac_cxx_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_cxx_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_cxx_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : break fi done ac_cv_prog_CXXCPP=$CXXCPP fi CXXCPP=$ac_cv_prog_CXXCPP else ac_cv_prog_CXXCPP=$CXXCPP fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXXCPP" >&5 $as_echo "$CXXCPP" >&6; } ac_preproc_ok=false for ac_cxx_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_cxx_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_cxx_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "C++ preprocessor \"$CXXCPP\" fails sanity check See \`config.log' for more details" "$LINENO" 5; } fi ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu else _lt_caught_CXX_error=yes fi ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu archive_cmds_need_lc_CXX=no allow_undefined_flag_CXX= always_export_symbols_CXX=no archive_expsym_cmds_CXX= compiler_needs_object_CXX=no export_dynamic_flag_spec_CXX= hardcode_direct_CXX=no hardcode_direct_absolute_CXX=no hardcode_libdir_flag_spec_CXX= hardcode_libdir_separator_CXX= hardcode_minus_L_CXX=no hardcode_shlibpath_var_CXX=unsupported hardcode_automatic_CXX=no inherit_rpath_CXX=no module_cmds_CXX= module_expsym_cmds_CXX= link_all_deplibs_CXX=unknown old_archive_cmds_CXX=$old_archive_cmds reload_flag_CXX=$reload_flag reload_cmds_CXX=$reload_cmds no_undefined_flag_CXX= whole_archive_flag_spec_CXX= enable_shared_with_static_runtimes_CXX=no # Source file extension for C++ test sources. ac_ext=cpp # Object file extension for compiled C++ test sources. objext=o objext_CXX=$objext # No sense in running all these tests if we already determined that # the CXX compiler isn't working. Some variables (like enable_shared) # are currently assumed to apply to all compilers on this platform, # and will be corrupted by setting them based on a non-working compiler. if test "$_lt_caught_CXX_error" != yes; then # Code to be used in simple compile tests lt_simple_compile_test_code="int some_variable = 0;" # Code to be used in simple link tests lt_simple_link_test_code='int main(int, char *[]) { return(0); }' # ltmain only uses $CC for tagged configurations so make sure $CC is set. # If no C compiler was specified, use CC. LTCC=${LTCC-"$CC"} # If no C compiler flags were specified, use CFLAGS. LTCFLAGS=${LTCFLAGS-"$CFLAGS"} # Allow CC to be a program name with arguments. compiler=$CC # save warnings/boilerplate of simple test code ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" >conftest.$ac_ext eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_compiler_boilerplate=`cat conftest.err` $RM conftest* ac_outfile=conftest.$ac_objext echo "$lt_simple_link_test_code" >conftest.$ac_ext eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_linker_boilerplate=`cat conftest.err` $RM -r conftest* # Allow CC to be a program name with arguments. lt_save_CC=$CC lt_save_CFLAGS=$CFLAGS lt_save_LD=$LD lt_save_GCC=$GCC GCC=$GXX lt_save_with_gnu_ld=$with_gnu_ld lt_save_path_LD=$lt_cv_path_LD if test -n "${lt_cv_prog_gnu_ldcxx+set}"; then lt_cv_prog_gnu_ld=$lt_cv_prog_gnu_ldcxx else $as_unset lt_cv_prog_gnu_ld fi if test -n "${lt_cv_path_LDCXX+set}"; then lt_cv_path_LD=$lt_cv_path_LDCXX else $as_unset lt_cv_path_LD fi test -z "${LDCXX+set}" || LD=$LDCXX CC=${CXX-"c++"} CFLAGS=$CXXFLAGS compiler=$CC compiler_CXX=$CC for cc_temp in $compiler""; do case $cc_temp in compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; \-*) ;; *) break;; esac done cc_basename=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"` if test -n "$compiler"; then # We don't want -fno-exception when compiling C++ code, so set the # no_builtin_flag separately if test "$GXX" = yes; then lt_prog_compiler_no_builtin_flag_CXX=' -fno-builtin' else lt_prog_compiler_no_builtin_flag_CXX= fi if test "$GXX" = yes; then # Set up default GNU C++ configuration # Check whether --with-gnu-ld was given. if test "${with_gnu_ld+set}" = set; then : withval=$with_gnu_ld; test "$withval" = no || with_gnu_ld=yes else with_gnu_ld=no fi ac_prog=ld if test "$GCC" = yes; then # Check if gcc -print-prog-name=ld gives a path. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld used by $CC" >&5 $as_echo_n "checking for ld used by $CC... " >&6; } case $host in *-*-mingw*) # gcc leaves a trailing carriage return which upsets mingw ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; *) ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; esac case $ac_prog in # Accept absolute paths. [\\/]* | ?:[\\/]*) re_direlt='/[^/][^/]*/\.\./' # Canonicalize the pathname of ld ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'` while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"` done test -z "$LD" && LD="$ac_prog" ;; "") # If it fails, then pretend we aren't using GCC. ac_prog=ld ;; *) # If it is relative, then search for the first ld in PATH. with_gnu_ld=unknown ;; esac elif test "$with_gnu_ld" = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5 $as_echo_n "checking for GNU ld... " >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5 $as_echo_n "checking for non-GNU ld... " >&6; } fi if ${lt_cv_path_LD+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$LD"; then lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR for ac_dir in $PATH; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then lt_cv_path_LD="$ac_dir/$ac_prog" # Check to see if the program is GNU ld. I'd rather use --version, # but apparently some variants of GNU ld only accept -v. # Break only if it was the GNU/non-GNU ld that we prefer. case `"$lt_cv_path_LD" -v 2>&1 &5 $as_echo "$LD" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -z "$LD" && as_fn_error $? "no acceptable ld found in \$PATH" "$LINENO" 5 { $as_echo "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5 $as_echo_n "checking if the linker ($LD) is GNU ld... " >&6; } if ${lt_cv_prog_gnu_ld+:} false; then : $as_echo_n "(cached) " >&6 else # I'd rather use --version here, but apparently some GNU lds only accept -v. case `$LD -v 2>&1 &5 $as_echo "$lt_cv_prog_gnu_ld" >&6; } with_gnu_ld=$lt_cv_prog_gnu_ld # Check if GNU C++ uses GNU ld as the underlying linker, since the # archiving commands below assume that GNU ld is being used. if test "$with_gnu_ld" = yes; then archive_cmds_CXX='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds_CXX='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' export_dynamic_flag_spec_CXX='${wl}--export-dynamic' # If archive_cmds runs LD, not CC, wlarc should be empty # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to # investigate it a little bit more. (MM) wlarc='${wl}' # ancient GNU ld didn't support --whole-archive et. al. if eval "`$CC -print-prog-name=ld` --help 2>&1" | $GREP 'no-whole-archive' > /dev/null; then whole_archive_flag_spec_CXX="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' else whole_archive_flag_spec_CXX= fi else with_gnu_ld=no wlarc= # A generic and very simple default shared library creation # command for GNU C++ for the case where it uses the native # linker, instead of GNU ld. If possible, this setting should # overridden to take advantage of the native linker features on # the platform it is being used on. archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' fi # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' else GXX=no with_gnu_ld=no wlarc= fi # PORTME: fill in a description of your system's C++ link characteristics { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5 $as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; } ld_shlibs_CXX=yes case $host_os in aix3*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; aix[4-9]*) if test "$host_cpu" = ia64; then # On IA64, the linker does run time linking by default, so we don't # have to do anything special. aix_use_runtimelinking=no exp_sym_flag='-Bexport' no_entry_flag="" else aix_use_runtimelinking=no # Test if we are trying to use run time linking or normal # AIX style linking. If -brtl is somewhere in LDFLAGS, we # need to do runtime linking. case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*) for ld_flag in $LDFLAGS; do case $ld_flag in *-brtl*) aix_use_runtimelinking=yes break ;; esac done ;; esac exp_sym_flag='-bexport' no_entry_flag='-bnoentry' fi # When large executables or shared objects are built, AIX ld can # have problems creating the table of contents. If linking a library # or program results in "error TOC overflow" add -mminimal-toc to # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. archive_cmds_CXX='' hardcode_direct_CXX=yes hardcode_direct_absolute_CXX=yes hardcode_libdir_separator_CXX=':' link_all_deplibs_CXX=yes file_list_spec_CXX='${wl}-f,' if test "$GXX" = yes; then case $host_os in aix4.[012]|aix4.[012].*) # We only want to do this on AIX 4.2 and lower, the check # below for broken collect2 doesn't work under 4.3+ collect2name=`${CC} -print-prog-name=collect2` if test -f "$collect2name" && strings "$collect2name" | $GREP resolve_lib_name >/dev/null then # We have reworked collect2 : else # We have old collect2 hardcode_direct_CXX=unsupported # It fails to find uninstalled libraries when the uninstalled # path is not listed in the libpath. Setting hardcode_minus_L # to unsupported forces relinking hardcode_minus_L_CXX=yes hardcode_libdir_flag_spec_CXX='-L$libdir' hardcode_libdir_separator_CXX= fi esac shared_flag='-shared' if test "$aix_use_runtimelinking" = yes; then shared_flag="$shared_flag "'${wl}-G' fi else # not using gcc if test "$host_cpu" = ia64; then # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release # chokes on -Wl,-G. The following line is correct: shared_flag='-G' else if test "$aix_use_runtimelinking" = yes; then shared_flag='${wl}-G' else shared_flag='${wl}-bM:SRE' fi fi fi export_dynamic_flag_spec_CXX='${wl}-bexpall' # It seems that -bexpall does not export symbols beginning with # underscore (_), so it is better to generate a list of symbols to # export. always_export_symbols_CXX=yes if test "$aix_use_runtimelinking" = yes; then # Warning - without using the other runtime loading flags (-brtl), # -berok will link without error, but may produce a broken library. allow_undefined_flag_CXX='-berok' # Determine the default libpath from the value encoded in an empty # executable. if test "${lt_cv_aix_libpath+set}" = set; then aix_libpath=$lt_cv_aix_libpath else if ${lt_cv_aix_libpath__CXX+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : lt_aix_libpath_sed=' /Import File Strings/,/^$/ { /^0/ { s/^0 *\([^ ]*\) *$/\1/ p } }' lt_cv_aix_libpath__CXX=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` # Check for a 64-bit object if we didn't find anything. if test -z "$lt_cv_aix_libpath__CXX"; then lt_cv_aix_libpath__CXX=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` fi fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test -z "$lt_cv_aix_libpath__CXX"; then lt_cv_aix_libpath__CXX="/usr/lib:/lib" fi fi aix_libpath=$lt_cv_aix_libpath__CXX fi hardcode_libdir_flag_spec_CXX='${wl}-blibpath:$libdir:'"$aix_libpath" archive_expsym_cmds_CXX='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" else if test "$host_cpu" = ia64; then hardcode_libdir_flag_spec_CXX='${wl}-R $libdir:/usr/lib:/lib' allow_undefined_flag_CXX="-z nodefs" archive_expsym_cmds_CXX="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" else # Determine the default libpath from the value encoded in an # empty executable. if test "${lt_cv_aix_libpath+set}" = set; then aix_libpath=$lt_cv_aix_libpath else if ${lt_cv_aix_libpath__CXX+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : lt_aix_libpath_sed=' /Import File Strings/,/^$/ { /^0/ { s/^0 *\([^ ]*\) *$/\1/ p } }' lt_cv_aix_libpath__CXX=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` # Check for a 64-bit object if we didn't find anything. if test -z "$lt_cv_aix_libpath__CXX"; then lt_cv_aix_libpath__CXX=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` fi fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test -z "$lt_cv_aix_libpath__CXX"; then lt_cv_aix_libpath__CXX="/usr/lib:/lib" fi fi aix_libpath=$lt_cv_aix_libpath__CXX fi hardcode_libdir_flag_spec_CXX='${wl}-blibpath:$libdir:'"$aix_libpath" # Warning - without using the other run time loading flags, # -berok will link without error, but may produce a broken library. no_undefined_flag_CXX=' ${wl}-bernotok' allow_undefined_flag_CXX=' ${wl}-berok' if test "$with_gnu_ld" = yes; then # We only use this code for GNU lds that support --whole-archive. whole_archive_flag_spec_CXX='${wl}--whole-archive$convenience ${wl}--no-whole-archive' else # Exported symbols can be pulled into shared objects from archives whole_archive_flag_spec_CXX='$convenience' fi archive_cmds_need_lc_CXX=yes # This is similar to how AIX traditionally builds its shared # libraries. archive_expsym_cmds_CXX="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' fi fi ;; beos*) if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then allow_undefined_flag_CXX=unsupported # Joseph Beckenbach says some releases of gcc # support --undefined. This deserves some investigation. FIXME archive_cmds_CXX='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' else ld_shlibs_CXX=no fi ;; chorus*) case $cc_basename in *) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; esac ;; cygwin* | mingw* | pw32* | cegcc*) case $GXX,$cc_basename in ,cl* | no,cl*) # Native MSVC # hardcode_libdir_flag_spec is actually meaningless, as there is # no search path for DLLs. hardcode_libdir_flag_spec_CXX=' ' allow_undefined_flag_CXX=unsupported always_export_symbols_CXX=yes file_list_spec_CXX='@' # Tell ltmain to make .lib files, not .a files. libext=lib # Tell ltmain to make .dll files, not .so files. shrext_cmds=".dll" # FIXME: Setting linknames here is a bad hack. archive_cmds_CXX='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames=' archive_expsym_cmds_CXX='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then $SED -n -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' -e '1\\\!p' < $export_symbols > $output_objdir/$soname.exp; else $SED -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp; fi~ $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ linknames=' # The linker will not automatically build a static lib if we build a DLL. # _LT_TAGVAR(old_archive_from_new_cmds, CXX)='true' enable_shared_with_static_runtimes_CXX=yes # Don't use ranlib old_postinstall_cmds_CXX='chmod 644 $oldlib' postlink_cmds_CXX='lt_outputfile="@OUTPUT@"~ lt_tool_outputfile="@TOOL_OUTPUT@"~ case $lt_outputfile in *.exe|*.EXE) ;; *) lt_outputfile="$lt_outputfile.exe" lt_tool_outputfile="$lt_tool_outputfile.exe" ;; esac~ func_to_tool_file "$lt_outputfile"~ if test "$MANIFEST_TOOL" != ":" && test -f "$lt_outputfile.manifest"; then $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; $RM "$lt_outputfile.manifest"; fi' ;; *) # g++ # _LT_TAGVAR(hardcode_libdir_flag_spec, CXX) is actually meaningless, # as there is no search path for DLLs. hardcode_libdir_flag_spec_CXX='-L$libdir' export_dynamic_flag_spec_CXX='${wl}--export-all-symbols' allow_undefined_flag_CXX=unsupported always_export_symbols_CXX=no enable_shared_with_static_runtimes_CXX=yes if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' # If the export-symbols file already is a .def file (1st line # is EXPORTS), use it as is; otherwise, prepend... archive_expsym_cmds_CXX='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then cp $export_symbols $output_objdir/$soname.def; else echo EXPORTS > $output_objdir/$soname.def; cat $export_symbols >> $output_objdir/$soname.def; fi~ $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' else ld_shlibs_CXX=no fi ;; esac ;; darwin* | rhapsody*) archive_cmds_need_lc_CXX=no hardcode_direct_CXX=no hardcode_automatic_CXX=yes hardcode_shlibpath_var_CXX=unsupported if test "$lt_cv_ld_force_load" = "yes"; then whole_archive_flag_spec_CXX='`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience ${wl}-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`' else whole_archive_flag_spec_CXX='' fi link_all_deplibs_CXX=yes allow_undefined_flag_CXX="$_lt_dar_allow_undefined" case $cc_basename in ifort*) _lt_dar_can_shared=yes ;; *) _lt_dar_can_shared=$GCC ;; esac if test "$_lt_dar_can_shared" = "yes"; then output_verbose_link_cmd=func_echo_all archive_cmds_CXX="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}" module_cmds_CXX="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}" archive_expsym_cmds_CXX="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}" module_expsym_cmds_CXX="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}" if test "$lt_cv_apple_cc_single_mod" != "yes"; then archive_cmds_CXX="\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dsymutil}" archive_expsym_cmds_CXX="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dar_export_syms}${_lt_dsymutil}" fi else ld_shlibs_CXX=no fi ;; dgux*) case $cc_basename in ec++*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; ghcx*) # Green Hills C++ Compiler # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; *) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; esac ;; freebsd2.*) # C++ shared libraries reported to be fairly broken before # switch to ELF ld_shlibs_CXX=no ;; freebsd-elf*) archive_cmds_need_lc_CXX=no ;; freebsd* | dragonfly*) # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF # conventions ld_shlibs_CXX=yes ;; gnu*) ;; haiku*) archive_cmds_CXX='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' link_all_deplibs_CXX=yes ;; hpux9*) hardcode_libdir_flag_spec_CXX='${wl}+b ${wl}$libdir' hardcode_libdir_separator_CXX=: export_dynamic_flag_spec_CXX='${wl}-E' hardcode_direct_CXX=yes hardcode_minus_L_CXX=yes # Not in the search PATH, # but as the default # location of the library. case $cc_basename in CC*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; aCC*) archive_cmds_CXX='$RM $output_objdir/$soname~$CC -b ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $EGREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' ;; *) if test "$GXX" = yes; then archive_cmds_CXX='$RM $output_objdir/$soname~$CC -shared -nostdlib $pic_flag ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' else # FIXME: insert proper C++ library support ld_shlibs_CXX=no fi ;; esac ;; hpux10*|hpux11*) if test $with_gnu_ld = no; then hardcode_libdir_flag_spec_CXX='${wl}+b ${wl}$libdir' hardcode_libdir_separator_CXX=: case $host_cpu in hppa*64*|ia64*) ;; *) export_dynamic_flag_spec_CXX='${wl}-E' ;; esac fi case $host_cpu in hppa*64*|ia64*) hardcode_direct_CXX=no hardcode_shlibpath_var_CXX=no ;; *) hardcode_direct_CXX=yes hardcode_direct_absolute_CXX=yes hardcode_minus_L_CXX=yes # Not in the search PATH, # but as the default # location of the library. ;; esac case $cc_basename in CC*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; aCC*) case $host_cpu in hppa*64*) archive_cmds_CXX='$CC -b ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; ia64*) archive_cmds_CXX='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; *) archive_cmds_CXX='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; esac # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $GREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' ;; *) if test "$GXX" = yes; then if test $with_gnu_ld = no; then case $host_cpu in hppa*64*) archive_cmds_CXX='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; ia64*) archive_cmds_CXX='$CC -shared -nostdlib $pic_flag ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; *) archive_cmds_CXX='$CC -shared -nostdlib $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; esac fi else # FIXME: insert proper C++ library support ld_shlibs_CXX=no fi ;; esac ;; interix[3-9]*) hardcode_direct_CXX=no hardcode_shlibpath_var_CXX=no hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' export_dynamic_flag_spec_CXX='${wl}-E' # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. # Instead, shared libraries are loaded at an image base (0x10000000 by # default) and relocated if they conflict, which is a slow very memory # consuming and fragmenting process. To avoid this, we pick a random, # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link # time. Moving up from 0x10000000 also allows more sbrk(2) space. archive_cmds_CXX='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' archive_expsym_cmds_CXX='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' ;; irix5* | irix6*) case $cc_basename in CC*) # SGI C++ archive_cmds_CXX='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' # Archives containing C++ object files must be created using # "CC -ar", where "CC" is the IRIX C++ compiler. This is # necessary to make sure instantiated templates are included # in the archive. old_archive_cmds_CXX='$CC -ar -WR,-u -o $oldlib $oldobjs' ;; *) if test "$GXX" = yes; then if test "$with_gnu_ld" = no; then archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' else archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` -o $lib' fi fi link_all_deplibs_CXX=yes ;; esac hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator_CXX=: inherit_rpath_CXX=yes ;; linux* | k*bsd*-gnu | kopensolaris*-gnu) case $cc_basename in KCC*) # Kuck and Associates, Inc. (KAI) C++ Compiler # KCC will only create a shared library if the output file # ends with ".so" (or ".sl" for HP-UX), so rename the library # to its proper name (with version) after linking. archive_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' archive_expsym_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib ${wl}-retain-symbols-file,$export_symbols; mv \$templib $lib' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | $GREP "ld"`; rm -f libconftest$shared_ext; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' export_dynamic_flag_spec_CXX='${wl}--export-dynamic' # Archives containing C++ object files must be created using # "CC -Bstatic", where "CC" is the KAI C++ compiler. old_archive_cmds_CXX='$CC -Bstatic -o $oldlib $oldobjs' ;; icpc* | ecpc* ) # Intel C++ with_gnu_ld=yes # version 8.0 and above of icpc choke on multiply defined symbols # if we add $predep_objects and $postdep_objects, however 7.1 and # earlier do not add the objects themselves. case `$CC -V 2>&1` in *"Version 7."*) archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' ;; *) # Version 8.0 or newer tmp_idyn= case $host_cpu in ia64*) tmp_idyn=' -i_dynamic';; esac archive_cmds_CXX='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds_CXX='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' ;; esac archive_cmds_need_lc_CXX=no hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' export_dynamic_flag_spec_CXX='${wl}--export-dynamic' whole_archive_flag_spec_CXX='${wl}--whole-archive$convenience ${wl}--no-whole-archive' ;; pgCC* | pgcpp*) # Portland Group C++ compiler case `$CC -V` in *pgCC\ [1-5].* | *pgcpp\ [1-5].*) prelink_cmds_CXX='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $objs $libobjs $compile_deplibs~ compile_command="$compile_command `find $tpldir -name \*.o | sort | $NL2SP`"' old_archive_cmds_CXX='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $oldobjs$old_deplibs~ $AR $AR_FLAGS $oldlib$oldobjs$old_deplibs `find $tpldir -name \*.o | sort | $NL2SP`~ $RANLIB $oldlib' archive_cmds_CXX='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib' archive_expsym_cmds_CXX='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib' ;; *) # Version 6 and above use weak symbols archive_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib' archive_expsym_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib' ;; esac hardcode_libdir_flag_spec_CXX='${wl}--rpath ${wl}$libdir' export_dynamic_flag_spec_CXX='${wl}--export-dynamic' whole_archive_flag_spec_CXX='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' ;; cxx*) # Compaq C++ archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib ${wl}-retain-symbols-file $wl$export_symbols' runpath_var=LD_RUN_PATH hardcode_libdir_flag_spec_CXX='-rpath $libdir' hardcode_libdir_separator_CXX=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "X$list" | $Xsed' ;; xl* | mpixl* | bgxl*) # IBM XL 8.0 on PPC, with GNU ld hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' export_dynamic_flag_spec_CXX='${wl}--export-dynamic' archive_cmds_CXX='$CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' if test "x$supports_anon_versioning" = xyes; then archive_expsym_cmds_CXX='echo "{ global:" > $output_objdir/$libname.ver~ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ echo "local: *; };" >> $output_objdir/$libname.ver~ $CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' fi ;; *) case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C++ 5.9 no_undefined_flag_CXX=' -zdefs' archive_cmds_CXX='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' archive_expsym_cmds_CXX='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file ${wl}$export_symbols' hardcode_libdir_flag_spec_CXX='-R$libdir' whole_archive_flag_spec_CXX='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' compiler_needs_object_CXX=yes # Not sure whether something based on # $CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 # would be better. output_verbose_link_cmd='func_echo_all' # Archives containing C++ object files must be created using # "CC -xar", where "CC" is the Sun C++ compiler. This is # necessary to make sure instantiated templates are included # in the archive. old_archive_cmds_CXX='$CC -xar -o $oldlib $oldobjs' ;; esac ;; esac ;; lynxos*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; m88k*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; mvs*) case $cc_basename in cxx*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; *) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; esac ;; netbsd*) if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then archive_cmds_CXX='$LD -Bshareable -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags' wlarc= hardcode_libdir_flag_spec_CXX='-R$libdir' hardcode_direct_CXX=yes hardcode_shlibpath_var_CXX=no fi # Workaround some broken pre-1.5 toolchains output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP conftest.$objext | $SED -e "s:-lgcc -lc -lgcc::"' ;; *nto* | *qnx*) ld_shlibs_CXX=yes ;; openbsd2*) # C++ shared libraries are fairly broken ld_shlibs_CXX=no ;; openbsd*) if test -f /usr/libexec/ld.so; then hardcode_direct_CXX=yes hardcode_shlibpath_var_CXX=no hardcode_direct_absolute_CXX=yes archive_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then archive_expsym_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file,$export_symbols -o $lib' export_dynamic_flag_spec_CXX='${wl}-E' whole_archive_flag_spec_CXX="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' fi output_verbose_link_cmd=func_echo_all else ld_shlibs_CXX=no fi ;; osf3* | osf4* | osf5*) case $cc_basename in KCC*) # Kuck and Associates, Inc. (KAI) C++ Compiler # KCC will only create a shared library if the output file # ends with ".so" (or ".sl" for HP-UX), so rename the library # to its proper name (with version) after linking. archive_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo "$lib" | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' hardcode_libdir_separator_CXX=: # Archives containing C++ object files must be created using # the KAI C++ compiler. case $host in osf3*) old_archive_cmds_CXX='$CC -Bstatic -o $oldlib $oldobjs' ;; *) old_archive_cmds_CXX='$CC -o $oldlib $oldobjs' ;; esac ;; RCC*) # Rational C++ 2.4.1 # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; cxx*) case $host in osf3*) allow_undefined_flag_CXX=' ${wl}-expect_unresolved ${wl}\*' archive_cmds_CXX='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $soname `test -n "$verstring" && func_echo_all "${wl}-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' ;; *) allow_undefined_flag_CXX=' -expect_unresolved \*' archive_cmds_CXX='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' archive_expsym_cmds_CXX='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done~ echo "-hidden">> $lib.exp~ $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname ${wl}-input ${wl}$lib.exp `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib~ $RM $lib.exp' hardcode_libdir_flag_spec_CXX='-rpath $libdir' ;; esac hardcode_libdir_separator_CXX=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld" | $GREP -v "ld:"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' ;; *) if test "$GXX" = yes && test "$with_gnu_ld" = no; then allow_undefined_flag_CXX=' ${wl}-expect_unresolved ${wl}\*' case $host in osf3*) archive_cmds_CXX='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' ;; *) archive_cmds_CXX='$CC -shared $pic_flag -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' ;; esac hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator_CXX=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' else # FIXME: insert proper C++ library support ld_shlibs_CXX=no fi ;; esac ;; psos*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; sunos4*) case $cc_basename in CC*) # Sun C++ 4.x # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; lcc*) # Lucid # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; *) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; esac ;; solaris*) case $cc_basename in CC* | sunCC*) # Sun C++ 4.2, 5.x and Centerline C++ archive_cmds_need_lc_CXX=yes no_undefined_flag_CXX=' -zdefs' archive_cmds_CXX='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' archive_expsym_cmds_CXX='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -G${allow_undefined_flag} ${wl}-M ${wl}$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' hardcode_libdir_flag_spec_CXX='-R$libdir' hardcode_shlibpath_var_CXX=no case $host_os in solaris2.[0-5] | solaris2.[0-5].*) ;; *) # The compiler driver will combine and reorder linker options, # but understands `-z linker_flag'. # Supported since Solaris 2.6 (maybe 2.5.1?) whole_archive_flag_spec_CXX='-z allextract$convenience -z defaultextract' ;; esac link_all_deplibs_CXX=yes output_verbose_link_cmd='func_echo_all' # Archives containing C++ object files must be created using # "CC -xar", where "CC" is the Sun C++ compiler. This is # necessary to make sure instantiated templates are included # in the archive. old_archive_cmds_CXX='$CC -xar -o $oldlib $oldobjs' ;; gcx*) # Green Hills C++ Compiler archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' # The C++ compiler must be used to create the archive. old_archive_cmds_CXX='$CC $LDFLAGS -archive -o $oldlib $oldobjs' ;; *) # GNU C++ compiler with Solaris linker if test "$GXX" = yes && test "$with_gnu_ld" = no; then no_undefined_flag_CXX=' ${wl}-z ${wl}defs' if $CC --version | $GREP -v '^2\.7' > /dev/null; then archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' archive_expsym_cmds_CXX='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -shared $pic_flag -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' else # g++ 2.7 appears to require `-G' NOT `-shared' on this # platform. archive_cmds_CXX='$CC -G -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' archive_expsym_cmds_CXX='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -G -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -G $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' fi hardcode_libdir_flag_spec_CXX='${wl}-R $wl$libdir' case $host_os in solaris2.[0-5] | solaris2.[0-5].*) ;; *) whole_archive_flag_spec_CXX='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' ;; esac fi ;; esac ;; sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*) no_undefined_flag_CXX='${wl}-z,text' archive_cmds_need_lc_CXX=no hardcode_shlibpath_var_CXX=no runpath_var='LD_RUN_PATH' case $cc_basename in CC*) archive_cmds_CXX='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds_CXX='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' ;; *) archive_cmds_CXX='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds_CXX='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' ;; esac ;; sysv5* | sco3.2v5* | sco5v6*) # Note: We can NOT use -z defs as we might desire, because we do not # link with -lc, and that would cause any symbols used from libc to # always be unresolved, which means just about no library would # ever link correctly. If we're not using GNU ld we use -z text # though, which does catch some bad symbols but isn't as heavy-handed # as -z defs. no_undefined_flag_CXX='${wl}-z,text' allow_undefined_flag_CXX='${wl}-z,nodefs' archive_cmds_need_lc_CXX=no hardcode_shlibpath_var_CXX=no hardcode_libdir_flag_spec_CXX='${wl}-R,$libdir' hardcode_libdir_separator_CXX=':' link_all_deplibs_CXX=yes export_dynamic_flag_spec_CXX='${wl}-Bexport' runpath_var='LD_RUN_PATH' case $cc_basename in CC*) archive_cmds_CXX='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds_CXX='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' old_archive_cmds_CXX='$CC -Tprelink_objects $oldobjs~ '"$old_archive_cmds_CXX" reload_cmds_CXX='$CC -Tprelink_objects $reload_objs~ '"$reload_cmds_CXX" ;; *) archive_cmds_CXX='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds_CXX='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' ;; esac ;; tandem*) case $cc_basename in NCC*) # NonStop-UX NCC 3.20 # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; *) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; esac ;; vxworks*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; *) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs_CXX" >&5 $as_echo "$ld_shlibs_CXX" >&6; } test "$ld_shlibs_CXX" = no && can_build_shared=no GCC_CXX="$GXX" LD_CXX="$LD" ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... # Dependencies to place before and after the object being linked: predep_objects_CXX= postdep_objects_CXX= predeps_CXX= postdeps_CXX= compiler_lib_search_path_CXX= cat > conftest.$ac_ext <<_LT_EOF class Foo { public: Foo (void) { a = 0; } private: int a; }; _LT_EOF _lt_libdeps_save_CFLAGS=$CFLAGS case "$CC $CFLAGS " in #( *\ -flto*\ *) CFLAGS="$CFLAGS -fno-lto" ;; *\ -fwhopr*\ *) CFLAGS="$CFLAGS -fno-whopr" ;; *\ -fuse-linker-plugin*\ *) CFLAGS="$CFLAGS -fno-use-linker-plugin" ;; esac if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then # Parse the compiler output and extract the necessary # objects, libraries and library flags. # Sentinel used to keep track of whether or not we are before # the conftest object file. pre_test_object_deps_done=no for p in `eval "$output_verbose_link_cmd"`; do case ${prev}${p} in -L* | -R* | -l*) # Some compilers place space between "-{L,R}" and the path. # Remove the space. if test $p = "-L" || test $p = "-R"; then prev=$p continue fi # Expand the sysroot to ease extracting the directories later. if test -z "$prev"; then case $p in -L*) func_stripname_cnf '-L' '' "$p"; prev=-L; p=$func_stripname_result ;; -R*) func_stripname_cnf '-R' '' "$p"; prev=-R; p=$func_stripname_result ;; -l*) func_stripname_cnf '-l' '' "$p"; prev=-l; p=$func_stripname_result ;; esac fi case $p in =*) func_stripname_cnf '=' '' "$p"; p=$lt_sysroot$func_stripname_result ;; esac if test "$pre_test_object_deps_done" = no; then case ${prev} in -L | -R) # Internal compiler library paths should come after those # provided the user. The postdeps already come after the # user supplied libs so there is no need to process them. if test -z "$compiler_lib_search_path_CXX"; then compiler_lib_search_path_CXX="${prev}${p}" else compiler_lib_search_path_CXX="${compiler_lib_search_path_CXX} ${prev}${p}" fi ;; # The "-l" case would never come before the object being # linked, so don't bother handling this case. esac else if test -z "$postdeps_CXX"; then postdeps_CXX="${prev}${p}" else postdeps_CXX="${postdeps_CXX} ${prev}${p}" fi fi prev= ;; *.lto.$objext) ;; # Ignore GCC LTO objects *.$objext) # This assumes that the test object file only shows up # once in the compiler output. if test "$p" = "conftest.$objext"; then pre_test_object_deps_done=yes continue fi if test "$pre_test_object_deps_done" = no; then if test -z "$predep_objects_CXX"; then predep_objects_CXX="$p" else predep_objects_CXX="$predep_objects_CXX $p" fi else if test -z "$postdep_objects_CXX"; then postdep_objects_CXX="$p" else postdep_objects_CXX="$postdep_objects_CXX $p" fi fi ;; *) ;; # Ignore the rest. esac done # Clean up. rm -f a.out a.exe else echo "libtool.m4: error: problem compiling CXX test program" fi $RM -f confest.$objext CFLAGS=$_lt_libdeps_save_CFLAGS # PORTME: override above test on systems where it is broken case $host_os in interix[3-9]*) # Interix 3.5 installs completely hosed .la files for C++, so rather than # hack all around it, let's just trust "g++" to DTRT. predep_objects_CXX= postdep_objects_CXX= postdeps_CXX= ;; linux*) case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C++ 5.9 # The more standards-conforming stlport4 library is # incompatible with the Cstd library. Avoid specifying # it if it's in CXXFLAGS. Ignore libCrun as # -library=stlport4 depends on it. case " $CXX $CXXFLAGS " in *" -library=stlport4 "*) solaris_use_stlport4=yes ;; esac if test "$solaris_use_stlport4" != yes; then postdeps_CXX='-library=Cstd -library=Crun' fi ;; esac ;; solaris*) case $cc_basename in CC* | sunCC*) # The more standards-conforming stlport4 library is # incompatible with the Cstd library. Avoid specifying # it if it's in CXXFLAGS. Ignore libCrun as # -library=stlport4 depends on it. case " $CXX $CXXFLAGS " in *" -library=stlport4 "*) solaris_use_stlport4=yes ;; esac # Adding this requires a known-good setup of shared libraries for # Sun compiler versions before 5.6, else PIC objects from an old # archive will be linked into the output, leading to subtle bugs. if test "$solaris_use_stlport4" != yes; then postdeps_CXX='-library=Cstd -library=Crun' fi ;; esac ;; esac case " $postdeps_CXX " in *" -lc "*) archive_cmds_need_lc_CXX=no ;; esac compiler_lib_search_dirs_CXX= if test -n "${compiler_lib_search_path_CXX}"; then compiler_lib_search_dirs_CXX=`echo " ${compiler_lib_search_path_CXX}" | ${SED} -e 's! -L! !g' -e 's!^ !!'` fi lt_prog_compiler_wl_CXX= lt_prog_compiler_pic_CXX= lt_prog_compiler_static_CXX= # C++ specific cases for pic, static, wl, etc. if test "$GXX" = yes; then lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_static_CXX='-static' case $host_os in aix*) # All AIX code is PIC. if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor lt_prog_compiler_static_CXX='-Bstatic' fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support lt_prog_compiler_pic_CXX='-fPIC' ;; m68k) # FIXME: we need at least 68020 code to build shared libraries, but # adding the `-m68020' flag to GCC prevents building anything better, # like `-m68040'. lt_prog_compiler_pic_CXX='-m68020 -resident32 -malways-restore-a4' ;; esac ;; beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) # PIC is the default for these OSes. ;; mingw* | cygwin* | os2* | pw32* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). # Although the cygwin gcc ignores -fPIC, still need this for old-style # (--disable-auto-import) libraries lt_prog_compiler_pic_CXX='-DDLL_EXPORT' ;; darwin* | rhapsody*) # PIC is the default on this platform # Common symbols not allowed in MH_DYLIB files lt_prog_compiler_pic_CXX='-fno-common' ;; *djgpp*) # DJGPP does not support shared libraries at all lt_prog_compiler_pic_CXX= ;; haiku*) # PIC is the default for Haiku. # The "-static" flag exists, but is broken. lt_prog_compiler_static_CXX= ;; interix[3-9]*) # Interix 3.x gcc -fpic/-fPIC options generate broken code. # Instead, we relocate shared libraries at runtime. ;; sysv4*MP*) if test -d /usr/nec; then lt_prog_compiler_pic_CXX=-Kconform_pic fi ;; hpux*) # PIC is the default for 64-bit PA HP-UX, but not for 32-bit # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag # sets the default TLS model and affects inlining. case $host_cpu in hppa*64*) ;; *) lt_prog_compiler_pic_CXX='-fPIC' ;; esac ;; *qnx* | *nto*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. lt_prog_compiler_pic_CXX='-fPIC -shared' ;; *) lt_prog_compiler_pic_CXX='-fPIC' ;; esac else case $host_os in aix[4-9]*) # All AIX code is PIC. if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor lt_prog_compiler_static_CXX='-Bstatic' else lt_prog_compiler_static_CXX='-bnso -bI:/lib/syscalls.exp' fi ;; chorus*) case $cc_basename in cxch68*) # Green Hills C++ Compiler # _LT_TAGVAR(lt_prog_compiler_static, CXX)="--no_auto_instantiation -u __main -u __premain -u _abort -r $COOL_DIR/lib/libOrb.a $MVME_DIR/lib/CC/libC.a $MVME_DIR/lib/classix/libcx.s.a" ;; esac ;; mingw* | cygwin* | os2* | pw32* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). lt_prog_compiler_pic_CXX='-DDLL_EXPORT' ;; dgux*) case $cc_basename in ec++*) lt_prog_compiler_pic_CXX='-KPIC' ;; ghcx*) # Green Hills C++ Compiler lt_prog_compiler_pic_CXX='-pic' ;; *) ;; esac ;; freebsd* | dragonfly*) # FreeBSD uses GNU C++ ;; hpux9* | hpux10* | hpux11*) case $cc_basename in CC*) lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_static_CXX='${wl}-a ${wl}archive' if test "$host_cpu" != ia64; then lt_prog_compiler_pic_CXX='+Z' fi ;; aCC*) lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_static_CXX='${wl}-a ${wl}archive' case $host_cpu in hppa*64*|ia64*) # +Z the default ;; *) lt_prog_compiler_pic_CXX='+Z' ;; esac ;; *) ;; esac ;; interix*) # This is c89, which is MS Visual C++ (no shared libs) # Anyone wants to do a port? ;; irix5* | irix6* | nonstopux*) case $cc_basename in CC*) lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_static_CXX='-non_shared' # CC pic flag -KPIC is the default. ;; *) ;; esac ;; linux* | k*bsd*-gnu | kopensolaris*-gnu) case $cc_basename in KCC*) # KAI C++ Compiler lt_prog_compiler_wl_CXX='--backend -Wl,' lt_prog_compiler_pic_CXX='-fPIC' ;; ecpc* ) # old Intel C++ for x86_64 which still supported -KPIC. lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_pic_CXX='-KPIC' lt_prog_compiler_static_CXX='-static' ;; icpc* ) # Intel C++, used to be incompatible with GCC. # ICC 10 doesn't accept -KPIC any more. lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_pic_CXX='-fPIC' lt_prog_compiler_static_CXX='-static' ;; pgCC* | pgcpp*) # Portland Group C++ compiler lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_pic_CXX='-fpic' lt_prog_compiler_static_CXX='-Bstatic' ;; cxx*) # Compaq C++ # Make sure the PIC flag is empty. It appears that all Alpha # Linux and Compaq Tru64 Unix objects are PIC. lt_prog_compiler_pic_CXX= lt_prog_compiler_static_CXX='-non_shared' ;; xlc* | xlC* | bgxl[cC]* | mpixl[cC]*) # IBM XL 8.0, 9.0 on PPC and BlueGene lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_pic_CXX='-qpic' lt_prog_compiler_static_CXX='-qstaticlink' ;; *) case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C++ 5.9 lt_prog_compiler_pic_CXX='-KPIC' lt_prog_compiler_static_CXX='-Bstatic' lt_prog_compiler_wl_CXX='-Qoption ld ' ;; esac ;; esac ;; lynxos*) ;; m88k*) ;; mvs*) case $cc_basename in cxx*) lt_prog_compiler_pic_CXX='-W c,exportall' ;; *) ;; esac ;; netbsd*) ;; *qnx* | *nto*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. lt_prog_compiler_pic_CXX='-fPIC -shared' ;; osf3* | osf4* | osf5*) case $cc_basename in KCC*) lt_prog_compiler_wl_CXX='--backend -Wl,' ;; RCC*) # Rational C++ 2.4.1 lt_prog_compiler_pic_CXX='-pic' ;; cxx*) # Digital/Compaq C++ lt_prog_compiler_wl_CXX='-Wl,' # Make sure the PIC flag is empty. It appears that all Alpha # Linux and Compaq Tru64 Unix objects are PIC. lt_prog_compiler_pic_CXX= lt_prog_compiler_static_CXX='-non_shared' ;; *) ;; esac ;; psos*) ;; solaris*) case $cc_basename in CC* | sunCC*) # Sun C++ 4.2, 5.x and Centerline C++ lt_prog_compiler_pic_CXX='-KPIC' lt_prog_compiler_static_CXX='-Bstatic' lt_prog_compiler_wl_CXX='-Qoption ld ' ;; gcx*) # Green Hills C++ Compiler lt_prog_compiler_pic_CXX='-PIC' ;; *) ;; esac ;; sunos4*) case $cc_basename in CC*) # Sun C++ 4.x lt_prog_compiler_pic_CXX='-pic' lt_prog_compiler_static_CXX='-Bstatic' ;; lcc*) # Lucid lt_prog_compiler_pic_CXX='-pic' ;; *) ;; esac ;; sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) case $cc_basename in CC*) lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_pic_CXX='-KPIC' lt_prog_compiler_static_CXX='-Bstatic' ;; esac ;; tandem*) case $cc_basename in NCC*) # NonStop-UX NCC 3.20 lt_prog_compiler_pic_CXX='-KPIC' ;; *) ;; esac ;; vxworks*) ;; *) lt_prog_compiler_can_build_shared_CXX=no ;; esac fi case $host_os in # For platforms which do not support PIC, -DPIC is meaningless: *djgpp*) lt_prog_compiler_pic_CXX= ;; *) lt_prog_compiler_pic_CXX="$lt_prog_compiler_pic_CXX -DPIC" ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $compiler option to produce PIC" >&5 $as_echo_n "checking for $compiler option to produce PIC... " >&6; } if ${lt_cv_prog_compiler_pic_CXX+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_pic_CXX=$lt_prog_compiler_pic_CXX fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_CXX" >&5 $as_echo "$lt_cv_prog_compiler_pic_CXX" >&6; } lt_prog_compiler_pic_CXX=$lt_cv_prog_compiler_pic_CXX # # Check to make sure the PIC flag actually works. # if test -n "$lt_prog_compiler_pic_CXX"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler PIC flag $lt_prog_compiler_pic_CXX works" >&5 $as_echo_n "checking if $compiler PIC flag $lt_prog_compiler_pic_CXX works... " >&6; } if ${lt_cv_prog_compiler_pic_works_CXX+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_pic_works_CXX=no ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="$lt_prog_compiler_pic_CXX -DPIC" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. # The option is referenced via a variable to avoid confusing sed. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings other than the usual output. $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then lt_cv_prog_compiler_pic_works_CXX=yes fi fi $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_works_CXX" >&5 $as_echo "$lt_cv_prog_compiler_pic_works_CXX" >&6; } if test x"$lt_cv_prog_compiler_pic_works_CXX" = xyes; then case $lt_prog_compiler_pic_CXX in "" | " "*) ;; *) lt_prog_compiler_pic_CXX=" $lt_prog_compiler_pic_CXX" ;; esac else lt_prog_compiler_pic_CXX= lt_prog_compiler_can_build_shared_CXX=no fi fi # # Check to make sure the static flag actually works. # wl=$lt_prog_compiler_wl_CXX eval lt_tmp_static_flag=\"$lt_prog_compiler_static_CXX\" { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler static flag $lt_tmp_static_flag works" >&5 $as_echo_n "checking if $compiler static flag $lt_tmp_static_flag works... " >&6; } if ${lt_cv_prog_compiler_static_works_CXX+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_static_works_CXX=no save_LDFLAGS="$LDFLAGS" LDFLAGS="$LDFLAGS $lt_tmp_static_flag" echo "$lt_simple_link_test_code" > conftest.$ac_ext if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then # The linker can only warn and ignore the option if not recognized # So say no if there are warnings if test -s conftest.err; then # Append any errors to the config.log. cat conftest.err 1>&5 $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if diff conftest.exp conftest.er2 >/dev/null; then lt_cv_prog_compiler_static_works_CXX=yes fi else lt_cv_prog_compiler_static_works_CXX=yes fi fi $RM -r conftest* LDFLAGS="$save_LDFLAGS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_static_works_CXX" >&5 $as_echo "$lt_cv_prog_compiler_static_works_CXX" >&6; } if test x"$lt_cv_prog_compiler_static_works_CXX" = xyes; then : else lt_prog_compiler_static_CXX= fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 $as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } if ${lt_cv_prog_compiler_c_o_CXX+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_c_o_CXX=no $RM -r conftest 2>/dev/null mkdir conftest cd conftest mkdir out echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-o out/conftest2.$ac_objext" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then lt_cv_prog_compiler_c_o_CXX=yes fi fi chmod u+w . 2>&5 $RM conftest* # SGI C++ compiler will create directory out/ii_files/ for # template instantiation test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files $RM out/* && rmdir out cd .. $RM -r conftest $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o_CXX" >&5 $as_echo "$lt_cv_prog_compiler_c_o_CXX" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 $as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } if ${lt_cv_prog_compiler_c_o_CXX+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_c_o_CXX=no $RM -r conftest 2>/dev/null mkdir conftest cd conftest mkdir out echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-o out/conftest2.$ac_objext" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then lt_cv_prog_compiler_c_o_CXX=yes fi fi chmod u+w . 2>&5 $RM conftest* # SGI C++ compiler will create directory out/ii_files/ for # template instantiation test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files $RM out/* && rmdir out cd .. $RM -r conftest $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o_CXX" >&5 $as_echo "$lt_cv_prog_compiler_c_o_CXX" >&6; } hard_links="nottested" if test "$lt_cv_prog_compiler_c_o_CXX" = no && test "$need_locks" != no; then # do not overwrite the value of need_locks provided by the user { $as_echo "$as_me:${as_lineno-$LINENO}: checking if we can lock with hard links" >&5 $as_echo_n "checking if we can lock with hard links... " >&6; } hard_links=yes $RM conftest* ln conftest.a conftest.b 2>/dev/null && hard_links=no touch conftest.a ln conftest.a conftest.b 2>&5 || hard_links=no ln conftest.a conftest.b 2>/dev/null && hard_links=no { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hard_links" >&5 $as_echo "$hard_links" >&6; } if test "$hard_links" = no; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5 $as_echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;} need_locks=warn fi else need_locks=no fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5 $as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; } export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' exclude_expsyms_CXX='_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*' case $host_os in aix[4-9]*) # If we're using GNU nm, then we don't want the "-C" option. # -C means demangle to AIX nm, but means don't demangle with GNU nm # Also, AIX nm treats weak defined symbols like other global defined # symbols, whereas GNU nm marks them as "W". if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then export_symbols_cmds_CXX='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' else export_symbols_cmds_CXX='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' fi ;; pw32*) export_symbols_cmds_CXX="$ltdll_cmds" ;; cygwin* | mingw* | cegcc*) case $cc_basename in cl*) exclude_expsyms_CXX='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*' ;; *) export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1 DATA/;s/^.*[ ]__nm__\([^ ]*\)[ ][^ ]*/\1 DATA/;/^I[ ]/d;/^[AITW][ ]/s/.* //'\'' | sort | uniq > $export_symbols' exclude_expsyms_CXX='[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname' ;; esac ;; *) export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs_CXX" >&5 $as_echo "$ld_shlibs_CXX" >&6; } test "$ld_shlibs_CXX" = no && can_build_shared=no with_gnu_ld_CXX=$with_gnu_ld # # Do we need to explicitly link libc? # case "x$archive_cmds_need_lc_CXX" in x|xyes) # Assume -lc should be added archive_cmds_need_lc_CXX=yes if test "$enable_shared" = yes && test "$GCC" = yes; then case $archive_cmds_CXX in *'~'*) # FIXME: we may have to deal with multi-command sequences. ;; '$CC '*) # Test whether the compiler implicitly links with -lc since on some # systems, -lgcc has to come before -lc. If gcc already passes -lc # to ld, don't add -lc before -lgcc. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -lc should be explicitly linked in" >&5 $as_echo_n "checking whether -lc should be explicitly linked in... " >&6; } if ${lt_cv_archive_cmds_need_lc_CXX+:} false; then : $as_echo_n "(cached) " >&6 else $RM conftest* echo "$lt_simple_compile_test_code" > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } 2>conftest.err; then soname=conftest lib=conftest libobjs=conftest.$ac_objext deplibs= wl=$lt_prog_compiler_wl_CXX pic_flag=$lt_prog_compiler_pic_CXX compiler_flags=-v linker_flags=-v verstring= output_objdir=. libname=conftest lt_save_allow_undefined_flag=$allow_undefined_flag_CXX allow_undefined_flag_CXX= if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$archive_cmds_CXX 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1\""; } >&5 (eval $archive_cmds_CXX 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } then lt_cv_archive_cmds_need_lc_CXX=no else lt_cv_archive_cmds_need_lc_CXX=yes fi allow_undefined_flag_CXX=$lt_save_allow_undefined_flag else cat conftest.err 1>&5 fi $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_archive_cmds_need_lc_CXX" >&5 $as_echo "$lt_cv_archive_cmds_need_lc_CXX" >&6; } archive_cmds_need_lc_CXX=$lt_cv_archive_cmds_need_lc_CXX ;; esac fi ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking dynamic linker characteristics" >&5 $as_echo_n "checking dynamic linker characteristics... " >&6; } library_names_spec= libname_spec='lib$name' soname_spec= shrext_cmds=".so" postinstall_cmds= postuninstall_cmds= finish_cmds= finish_eval= shlibpath_var= shlibpath_overrides_runpath=unknown version_type=none dynamic_linker="$host_os ld.so" sys_lib_dlsearch_path_spec="/lib /usr/lib" need_lib_prefix=unknown hardcode_into_libs=no # when you set need_version to no, make sure it does not cause -set_version # flags to be left without arguments need_version=unknown case $host_os in aix3*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a' shlibpath_var=LIBPATH # AIX 3 has no versioning support, so we append a major version to the name. soname_spec='${libname}${release}${shared_ext}$major' ;; aix[4-9]*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no hardcode_into_libs=yes if test "$host_cpu" = ia64; then # AIX 5 supports IA64 library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH else # With GCC up to 2.95.x, collect2 would create an import file # for dependence libraries. The import file would start with # the line `#! .'. This would cause the generated library to # depend on `.', always an invalid library. This was fixed in # development snapshots of GCC prior to 3.0. case $host_os in aix4 | aix4.[01] | aix4.[01].*) if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' echo ' yes ' echo '#endif'; } | ${CC} -E - | $GREP yes > /dev/null; then : else can_build_shared=no fi ;; esac # AIX (on Power*) has no versioning support, so currently we can not hardcode correct # soname into executable. Probably we can add versioning support to # collect2, so additional links can be useful in future. if test "$aix_use_runtimelinking" = yes; then # If using run time linking (on AIX 4.2 or later) use lib.so # instead of lib.a to let people know that these are not # typical AIX shared libraries. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' else # We preserve .a as extension for shared libraries through AIX4.2 # and later when we are not doing run time linking. library_names_spec='${libname}${release}.a $libname.a' soname_spec='${libname}${release}${shared_ext}$major' fi shlibpath_var=LIBPATH fi ;; amigaos*) case $host_cpu in powerpc) # Since July 2007 AmigaOS4 officially supports .so libraries. # When compiling the executable, add -use-dynld -Lsobjs: to the compileline. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' ;; m68k) library_names_spec='$libname.ixlibrary $libname.a' # Create ${libname}_ixlibrary.a entries in /sys/libs. finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' ;; esac ;; beos*) library_names_spec='${libname}${shared_ext}' dynamic_linker="$host_os ld.so" shlibpath_var=LIBRARY_PATH ;; bsdi[45]*) version_type=linux # correct to gnu/linux during the next big refactor need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" # the default ld.so.conf also contains /usr/contrib/lib and # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow # libtool to hard-code these into programs ;; cygwin* | mingw* | pw32* | cegcc*) version_type=windows shrext_cmds=".dll" need_version=no need_lib_prefix=no case $GCC,$cc_basename in yes,*) # gcc library_names_spec='$libname.dll.a' # DLL is installed to $(libdir)/../bin by postinstall_cmds postinstall_cmds='base_file=`basename \${file}`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname~ chmod a+x \$dldir/$dlname~ if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; fi' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ dlpath=$dir/\$dldll~ $RM \$dlpath' shlibpath_overrides_runpath=yes case $host_os in cygwin*) # Cygwin DLLs use 'cyg' prefix rather than 'lib' soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' ;; mingw* | cegcc*) # MinGW DLLs use traditional 'lib' prefix soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' ;; pw32*) # pw32 DLLs use 'pw' prefix rather than 'lib' library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' ;; esac dynamic_linker='Win32 ld.exe' ;; *,cl*) # Native MSVC libname_spec='$name' soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' library_names_spec='${libname}.dll.lib' case $build_os in mingw*) sys_lib_search_path_spec= lt_save_ifs=$IFS IFS=';' for lt_path in $LIB do IFS=$lt_save_ifs # Let DOS variable expansion print the short 8.3 style file name. lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"` sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path" done IFS=$lt_save_ifs # Convert to MSYS style. sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | sed -e 's|\\\\|/|g' -e 's| \\([a-zA-Z]\\):| /\\1|g' -e 's|^ ||'` ;; cygwin*) # Convert to unix form, then to dos form, then back to unix form # but this time dos style (no spaces!) so that the unix form looks # like /cygdrive/c/PROGRA~1:/cygdr... sys_lib_search_path_spec=`cygpath --path --unix "$LIB"` sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null` sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` ;; *) sys_lib_search_path_spec="$LIB" if $ECHO "$sys_lib_search_path_spec" | $GREP ';[c-zC-Z]:/' >/dev/null; then # It is most probably a Windows format PATH. sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` else sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` fi # FIXME: find the short name or the path components, as spaces are # common. (e.g. "Program Files" -> "PROGRA~1") ;; esac # DLL is installed to $(libdir)/../bin by postinstall_cmds postinstall_cmds='base_file=`basename \${file}`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ dlpath=$dir/\$dldll~ $RM \$dlpath' shlibpath_overrides_runpath=yes dynamic_linker='Win32 link.exe' ;; *) # Assume MSVC wrapper library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib' dynamic_linker='Win32 ld.exe' ;; esac # FIXME: first we should search . and the directory the executable is in shlibpath_var=PATH ;; darwin* | rhapsody*) dynamic_linker="$host_os dyld" version_type=darwin need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${major}$shared_ext ${libname}$shared_ext' soname_spec='${libname}${release}${major}$shared_ext' shlibpath_overrides_runpath=yes shlibpath_var=DYLD_LIBRARY_PATH shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' ;; dgux*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH ;; freebsd* | dragonfly*) # DragonFly does not have aout. When/if they implement a new # versioning mechanism, adjust this. if test -x /usr/bin/objformat; then objformat=`/usr/bin/objformat` else case $host_os in freebsd[23].*) objformat=aout ;; *) objformat=elf ;; esac fi version_type=freebsd-$objformat case $version_type in freebsd-elf*) library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' need_version=no need_lib_prefix=no ;; freebsd-*) library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix' need_version=yes ;; esac shlibpath_var=LD_LIBRARY_PATH case $host_os in freebsd2.*) shlibpath_overrides_runpath=yes ;; freebsd3.[01]* | freebsdelf3.[01]*) shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; freebsd3.[2-9]* | freebsdelf3.[2-9]* | \ freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1) shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; *) # from 4.6 on, and DragonFly shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; esac ;; gnu*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; haiku*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no dynamic_linker="$host_os runtime_loader" library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LIBRARY_PATH shlibpath_overrides_runpath=yes sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib' hardcode_into_libs=yes ;; hpux9* | hpux10* | hpux11*) # Give a soname corresponding to the major version so that dld.sl refuses to # link against other versions. version_type=sunos need_lib_prefix=no need_version=no case $host_cpu in ia64*) shrext_cmds='.so' hardcode_into_libs=yes dynamic_linker="$host_os dld.so" shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' if test "X$HPUX_IA64_MODE" = X32; then sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" else sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" fi sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; hppa*64*) shrext_cmds='.sl' hardcode_into_libs=yes dynamic_linker="$host_os dld.sl" shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; *) shrext_cmds='.sl' dynamic_linker="$host_os dld.sl" shlibpath_var=SHLIB_PATH shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' ;; esac # HP-UX runs *really* slowly unless shared libraries are mode 555, ... postinstall_cmds='chmod 555 $lib' # or fails outright, so override atomically: install_override_mode=555 ;; interix[3-9]*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; irix5* | irix6* | nonstopux*) case $host_os in nonstopux*) version_type=nonstopux ;; *) if test "$lt_cv_prog_gnu_ld" = yes; then version_type=linux # correct to gnu/linux during the next big refactor else version_type=irix fi ;; esac need_lib_prefix=no need_version=no soname_spec='${libname}${release}${shared_ext}$major' library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}' case $host_os in irix5* | nonstopux*) libsuff= shlibsuff= ;; *) case $LD in # libtool.m4 will add one of these switches to LD *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") libsuff= shlibsuff= libmagic=32-bit;; *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") libsuff=32 shlibsuff=N32 libmagic=N32;; *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") libsuff=64 shlibsuff=64 libmagic=64-bit;; *) libsuff= shlibsuff= libmagic=never-match;; esac ;; esac shlibpath_var=LD_LIBRARY${shlibsuff}_PATH shlibpath_overrides_runpath=no sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" hardcode_into_libs=yes ;; # No shared lib support for Linux oldld, aout, or coff. linux*oldld* | linux*aout* | linux*coff*) dynamic_linker=no ;; # This must be glibc/ELF. linux* | k*bsd*-gnu | kopensolaris*-gnu) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no # Some binutils ld are patched to set DT_RUNPATH if ${lt_cv_shlibpath_overrides_runpath+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_shlibpath_overrides_runpath=no save_LDFLAGS=$LDFLAGS save_libdir=$libdir eval "libdir=/foo; wl=\"$lt_prog_compiler_wl_CXX\"; \ LDFLAGS=\"\$LDFLAGS $hardcode_libdir_flag_spec_CXX\"" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : if ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null; then : lt_cv_shlibpath_overrides_runpath=yes fi fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LDFLAGS=$save_LDFLAGS libdir=$save_libdir fi shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath # This implies no fast_install, which is unacceptable. # Some rework will be needed to allow for fast_install # before this can be enabled. hardcode_into_libs=yes # Append ld.so.conf contents to the search path if test -f /etc/ld.so.conf; then lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '` sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" fi # We used to test for /lib/ld.so.1 and disable shared libraries on # powerpc, because MkLinux only supported shared libraries with the # GNU dynamic linker. Since this was broken with cross compilers, # most powerpc-linux boxes support dynamic linking these days and # people can always --disable-shared, the test was removed, and we # assume the GNU/Linux dynamic linker is in use. dynamic_linker='GNU/Linux ld.so' ;; netbsd*) version_type=sunos need_lib_prefix=no need_version=no if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' dynamic_linker='NetBSD (a.out) ld.so' else library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' dynamic_linker='NetBSD ld.elf_so' fi shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; newsos6) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes ;; *nto* | *qnx*) version_type=qnx need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes dynamic_linker='ldqnx.so' ;; openbsd*) version_type=sunos sys_lib_dlsearch_path_spec="/usr/lib" need_lib_prefix=no # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs. case $host_os in openbsd3.3 | openbsd3.3.*) need_version=yes ;; *) need_version=no ;; esac library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' shlibpath_var=LD_LIBRARY_PATH if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then case $host_os in openbsd2.[89] | openbsd2.[89].*) shlibpath_overrides_runpath=no ;; *) shlibpath_overrides_runpath=yes ;; esac else shlibpath_overrides_runpath=yes fi ;; os2*) libname_spec='$name' shrext_cmds=".dll" need_lib_prefix=no library_names_spec='$libname${shared_ext} $libname.a' dynamic_linker='OS/2 ld.exe' shlibpath_var=LIBPATH ;; osf3* | osf4* | osf5*) version_type=osf need_lib_prefix=no need_version=no soname_spec='${libname}${release}${shared_ext}$major' library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" ;; rdos*) dynamic_linker=no ;; solaris*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes # ldd complains unless libraries are executable postinstall_cmds='chmod +x $lib' ;; sunos4*) version_type=sunos library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes if test "$with_gnu_ld" = yes; then need_lib_prefix=no fi need_version=yes ;; sysv4 | sysv4.3*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH case $host_vendor in sni) shlibpath_overrides_runpath=no need_lib_prefix=no runpath_var=LD_RUN_PATH ;; siemens) need_lib_prefix=no ;; motorola) need_lib_prefix=no need_version=no shlibpath_overrides_runpath=no sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' ;; esac ;; sysv4*MP*) if test -d /usr/nec ;then version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' soname_spec='$libname${shared_ext}.$major' shlibpath_var=LD_LIBRARY_PATH fi ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) version_type=freebsd-elf need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes if test "$with_gnu_ld" = yes; then sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' else sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' case $host_os in sco3.2v5*) sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" ;; esac fi sys_lib_dlsearch_path_spec='/usr/lib' ;; tpf*) # TPF is a cross-target only. Preferred cross-host = GNU/Linux. version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; uts4*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH ;; *) dynamic_linker=no ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: result: $dynamic_linker" >&5 $as_echo "$dynamic_linker" >&6; } test "$dynamic_linker" = no && can_build_shared=no variables_saved_for_relink="PATH $shlibpath_var $runpath_var" if test "$GCC" = yes; then variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" fi if test "${lt_cv_sys_lib_search_path_spec+set}" = set; then sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec" fi if test "${lt_cv_sys_lib_dlsearch_path_spec+set}" = set; then sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to hardcode library paths into programs" >&5 $as_echo_n "checking how to hardcode library paths into programs... " >&6; } hardcode_action_CXX= if test -n "$hardcode_libdir_flag_spec_CXX" || test -n "$runpath_var_CXX" || test "X$hardcode_automatic_CXX" = "Xyes" ; then # We can hardcode non-existent directories. if test "$hardcode_direct_CXX" != no && # If the only mechanism to avoid hardcoding is shlibpath_var, we # have to relink, otherwise we might link with an installed library # when we should be linking with a yet-to-be-installed one ## test "$_LT_TAGVAR(hardcode_shlibpath_var, CXX)" != no && test "$hardcode_minus_L_CXX" != no; then # Linking always hardcodes the temporary library directory. hardcode_action_CXX=relink else # We can link without hardcoding, and we can hardcode nonexisting dirs. hardcode_action_CXX=immediate fi else # We cannot hardcode anything, or else we can only hardcode existing # directories. hardcode_action_CXX=unsupported fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hardcode_action_CXX" >&5 $as_echo "$hardcode_action_CXX" >&6; } if test "$hardcode_action_CXX" = relink || test "$inherit_rpath_CXX" = yes; then # Fast installation is not supported enable_fast_install=no elif test "$shlibpath_overrides_runpath" = yes || test "$enable_shared" = no; then # Fast installation is not necessary enable_fast_install=needless fi fi # test -n "$compiler" CC=$lt_save_CC CFLAGS=$lt_save_CFLAGS LDCXX=$LD LD=$lt_save_LD GCC=$lt_save_GCC with_gnu_ld=$lt_save_with_gnu_ld lt_cv_path_LDCXX=$lt_cv_path_LD lt_cv_path_LD=$lt_save_path_LD lt_cv_prog_gnu_ldcxx=$lt_cv_prog_gnu_ld lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld fi # test "$_lt_caught_CXX_error" != yes ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu ac_config_commands="$ac_config_commands libtool" # Only expand once: #AM_PROG_LEX #AC_PROG_YACC # poslib if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. set dummy ${ac_tool_prefix}strip; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_STRIP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$STRIP"; then ac_cv_prog_STRIP="$STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_STRIP="${ac_tool_prefix}strip" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi STRIP=$ac_cv_prog_STRIP if test -n "$STRIP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5 $as_echo "$STRIP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_STRIP"; then ac_ct_STRIP=$STRIP # Extract the first word of "strip", so it can be a program name with args. set dummy strip; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_STRIP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_STRIP"; then ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_STRIP="strip" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP if test -n "$ac_ct_STRIP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5 $as_echo "$ac_ct_STRIP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_STRIP" = x; then STRIP="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac STRIP=$ac_ct_STRIP fi else STRIP="$ac_cv_prog_STRIP" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5 $as_echo_n "checking for ANSI C header files... " >&6; } if ${ac_cv_header_stdc+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include #include int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_cv_header_stdc=yes else ac_cv_header_stdc=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if test $ac_cv_header_stdc = yes; then # SunOS 4.x string.h does not declare mem*, contrary to ANSI. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "memchr" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "free" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. if test "$cross_compiling" = yes; then : : else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #if ((' ' & 0x0FF) == 0x020) # define ISLOWER(c) ('a' <= (c) && (c) <= 'z') # define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) #else # define ISLOWER(c) \ (('a' <= (c) && (c) <= 'i') \ || ('j' <= (c) && (c) <= 'r') \ || ('s' <= (c) && (c) <= 'z')) # define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) #endif #define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) int main () { int i; for (i = 0; i < 256; i++) if (XOR (islower (i), ISLOWER (i)) || toupper (i) != TOUPPER (i)) return 2; return 0; } _ACEOF if ac_fn_cxx_try_run "$LINENO"; then : else ac_cv_header_stdc=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5 $as_echo "$ac_cv_header_stdc" >&6; } if test $ac_cv_header_stdc = yes; then $as_echo "#define STDC_HEADERS 1" >>confdefs.h fi ac_fn_cxx_check_type "$LINENO" "size_t" "ac_cv_type_size_t" "$ac_includes_default" if test "x$ac_cv_type_size_t" = xyes; then : else cat >>confdefs.h <<_ACEOF #define size_t unsigned int _ACEOF fi # The Ultrix 4.2 mips builtin alloca declared by alloca.h only works # for constant arguments. Useless! { $as_echo "$as_me:${as_lineno-$LINENO}: checking for working alloca.h" >&5 $as_echo_n "checking for working alloca.h... " >&6; } if ${ac_cv_working_alloca_h+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { char *p = (char *) alloca (2 * sizeof (int)); if (p) return 0; ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : ac_cv_working_alloca_h=yes else ac_cv_working_alloca_h=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_working_alloca_h" >&5 $as_echo "$ac_cv_working_alloca_h" >&6; } if test $ac_cv_working_alloca_h = yes; then $as_echo "#define HAVE_ALLOCA_H 1" >>confdefs.h fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for alloca" >&5 $as_echo_n "checking for alloca... " >&6; } if ${ac_cv_func_alloca_works+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __GNUC__ # define alloca __builtin_alloca #else # ifdef _MSC_VER # include # define alloca _alloca # else # ifdef HAVE_ALLOCA_H # include # else # ifdef _AIX #pragma alloca # else # ifndef alloca /* predefined by HP cc +Olibcalls */ void *alloca (size_t); # endif # endif # endif # endif #endif int main () { char *p = (char *) alloca (1); if (p) return 0; ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : ac_cv_func_alloca_works=yes else ac_cv_func_alloca_works=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_alloca_works" >&5 $as_echo "$ac_cv_func_alloca_works" >&6; } if test $ac_cv_func_alloca_works = yes; then $as_echo "#define HAVE_ALLOCA 1" >>confdefs.h else # The SVR3 libPW and SVR4 libucb both contain incompatible functions # that cause trouble. Some versions do not even contain alloca or # contain a buggy version. If you still want to use their alloca, # use ar to extract alloca.o from them instead of compiling alloca.c. ALLOCA=\${LIBOBJDIR}alloca.$ac_objext $as_echo "#define C_ALLOCA 1" >>confdefs.h { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether \`alloca.c' needs Cray hooks" >&5 $as_echo_n "checking whether \`alloca.c' needs Cray hooks... " >&6; } if ${ac_cv_os_cray+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #if defined CRAY && ! defined CRAY2 webecray #else wenotbecray #endif _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "webecray" >/dev/null 2>&1; then : ac_cv_os_cray=yes else ac_cv_os_cray=no fi rm -f conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_os_cray" >&5 $as_echo "$ac_cv_os_cray" >&6; } if test $ac_cv_os_cray = yes; then for ac_func in _getb67 GETB67 getb67; do as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` ac_fn_cxx_check_func "$LINENO" "$ac_func" "$as_ac_var" if eval test \"x\$"$as_ac_var"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define CRAY_STACKSEG_END $ac_func _ACEOF break fi done fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking stack direction for C alloca" >&5 $as_echo_n "checking stack direction for C alloca... " >&6; } if ${ac_cv_c_stack_direction+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : ac_cv_c_stack_direction=0 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default int find_stack_direction (int *addr, int depth) { int dir, dummy = 0; if (! addr) addr = &dummy; *addr = addr < &dummy ? 1 : addr == &dummy ? 0 : -1; dir = depth ? find_stack_direction (addr, depth - 1) : 0; return dir + dummy; } int main (int argc, char **argv) { return find_stack_direction (0, argc + !argv + 20) < 0; } _ACEOF if ac_fn_cxx_try_run "$LINENO"; then : ac_cv_c_stack_direction=1 else ac_cv_c_stack_direction=-1 fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_stack_direction" >&5 $as_echo "$ac_cv_c_stack_direction" >&6; } cat >>confdefs.h <<_ACEOF #define STACK_DIRECTION $ac_cv_c_stack_direction _ACEOF fi for ac_header in arpa/inet.h fcntl.h inttypes.h limits.h malloc.h netdb.h netinet/in.h stddef.h stdint.h stdlib.h string.h sys/ioctl.h sys/socket.h sys/time.h syslog.h unistd.h wchar.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_cxx_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done for ac_header in poll.h sys/poll.h winsock2.h sys/select.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_cxx_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done for ac_header in slist ext/slist do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_cxx_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done if test x$ac_cv_header_poll_h = xyes || test x$ac_cv_header_sys_poll_h = xyes; then $as_echo "#define HAVE_POLL 1" >>confdefs.h fi ac_fn_cxx_check_decl "$LINENO" "IPV6_PKTINFO" "ac_cv_have_decl_IPV6_PKTINFO" " #include #include #include " if test "x$ac_cv_have_decl_IPV6_PKTINFO" = xyes; then : ac_have_decl=1 else ac_have_decl=0 fi cat >>confdefs.h <<_ACEOF #define HAVE_DECL_IPV6_PKTINFO $ac_have_decl _ACEOF ac_fn_cxx_check_decl "$LINENO" "IPV6_RECVPKTINFO" "ac_cv_have_decl_IPV6_RECVPKTINFO" " #include #include #include " if test "x$ac_cv_have_decl_IPV6_RECVPKTINFO" = xyes; then : ac_have_decl=1 else ac_have_decl=0 fi cat >>confdefs.h <<_ACEOF #define HAVE_DECL_IPV6_RECVPKTINFO $ac_have_decl _ACEOF # Checks for typedefs, structures, and compiler characteristics. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for stdbool.h that conforms to C99" >&5 $as_echo_n "checking for stdbool.h that conforms to C99... " >&6; } if ${ac_cv_header_stdbool_h+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #ifndef bool "error: bool is not defined" #endif #ifndef false "error: false is not defined" #endif #if false "error: false is not 0" #endif #ifndef true "error: true is not defined" #endif #if true != 1 "error: true is not 1" #endif #ifndef __bool_true_false_are_defined "error: __bool_true_false_are_defined is not defined" #endif struct s { _Bool s: 1; _Bool t; } s; char a[true == 1 ? 1 : -1]; char b[false == 0 ? 1 : -1]; char c[__bool_true_false_are_defined == 1 ? 1 : -1]; char d[(bool) 0.5 == true ? 1 : -1]; /* See body of main program for 'e'. */ char f[(_Bool) 0.0 == false ? 1 : -1]; char g[true]; char h[sizeof (_Bool)]; char i[sizeof s.t]; enum { j = false, k = true, l = false * true, m = true * 256 }; /* The following fails for HP aC++/ANSI C B3910B A.05.55 [Dec 04 2003]. */ _Bool n[m]; char o[sizeof n == m * sizeof n[0] ? 1 : -1]; char p[-1 - (_Bool) 0 < 0 && -1 - (bool) 0 < 0 ? 1 : -1]; /* Catch a bug in an HP-UX C compiler. See http://gcc.gnu.org/ml/gcc-patches/2003-12/msg02303.html http://lists.gnu.org/archive/html/bug-coreutils/2005-11/msg00161.html */ _Bool q = true; _Bool *pq = &q; int main () { bool e = &s; *pq |= q; *pq |= ! q; /* Refer to every declared value, to avoid compiler optimizations. */ return (!a + !b + !c + !d + !e + !f + !g + !h + !i + !!j + !k + !!l + !m + !n + !o + !p + !q + !pq); ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_cv_header_stdbool_h=yes else ac_cv_header_stdbool_h=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdbool_h" >&5 $as_echo "$ac_cv_header_stdbool_h" >&6; } ac_fn_cxx_check_type "$LINENO" "_Bool" "ac_cv_type__Bool" "$ac_includes_default" if test "x$ac_cv_type__Bool" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE__BOOL 1 _ACEOF fi if test $ac_cv_header_stdbool_h = yes; then $as_echo "#define HAVE_STDBOOL_H 1" >>confdefs.h fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for inline" >&5 $as_echo_n "checking for inline... " >&6; } if ${ac_cv_c_inline+:} false; then : $as_echo_n "(cached) " >&6 else ac_cv_c_inline=no for ac_kw in inline __inline__ __inline; do cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifndef __cplusplus typedef int foo_t; static $ac_kw foo_t static_foo () {return 0; } $ac_kw foo_t foo () {return 0; } #endif _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_cv_c_inline=$ac_kw fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext test "$ac_cv_c_inline" != no && break done fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_inline" >&5 $as_echo "$ac_cv_c_inline" >&6; } case $ac_cv_c_inline in inline | yes) ;; *) case $ac_cv_c_inline in no) ac_val=;; *) ac_val=$ac_cv_c_inline;; esac cat >>confdefs.h <<_ACEOF #ifndef __cplusplus #define inline $ac_val #endif _ACEOF ;; esac ac_fn_c_find_intX_t "$LINENO" "16" "ac_cv_c_int16_t" case $ac_cv_c_int16_t in #( no|yes) ;; #( *) cat >>confdefs.h <<_ACEOF #define int16_t $ac_cv_c_int16_t _ACEOF ;; esac ac_fn_c_find_intX_t "$LINENO" "32" "ac_cv_c_int32_t" case $ac_cv_c_int32_t in #( no|yes) ;; #( *) cat >>confdefs.h <<_ACEOF #define int32_t $ac_cv_c_int32_t _ACEOF ;; esac ac_fn_c_find_intX_t "$LINENO" "8" "ac_cv_c_int8_t" case $ac_cv_c_int8_t in #( no|yes) ;; #( *) cat >>confdefs.h <<_ACEOF #define int8_t $ac_cv_c_int8_t _ACEOF ;; esac ac_fn_cxx_check_type "$LINENO" "pid_t" "ac_cv_type_pid_t" "$ac_includes_default" if test "x$ac_cv_type_pid_t" = xyes; then : else cat >>confdefs.h <<_ACEOF #define pid_t int _ACEOF fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for C/C++ restrict keyword" >&5 $as_echo_n "checking for C/C++ restrict keyword... " >&6; } if ${ac_cv_c_restrict+:} false; then : $as_echo_n "(cached) " >&6 else ac_cv_c_restrict=no # The order here caters to the fact that C++ does not require restrict. for ac_kw in __restrict __restrict__ _Restrict restrict; do cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ typedef int * int_ptr; int foo (int_ptr $ac_kw ip) { return ip[0]; } int main () { int s[1]; int * $ac_kw t = s; t[0] = 0; return foo(t) ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_cv_c_restrict=$ac_kw fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext test "$ac_cv_c_restrict" != no && break done fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_restrict" >&5 $as_echo "$ac_cv_c_restrict" >&6; } case $ac_cv_c_restrict in restrict) ;; no) $as_echo "#define restrict /**/" >>confdefs.h ;; *) cat >>confdefs.h <<_ACEOF #define restrict $ac_cv_c_restrict _ACEOF ;; esac ac_fn_cxx_check_type "$LINENO" "size_t" "ac_cv_type_size_t" "$ac_includes_default" if test "x$ac_cv_type_size_t" = xyes; then : else cat >>confdefs.h <<_ACEOF #define size_t unsigned int _ACEOF fi ac_fn_cxx_check_type "$LINENO" "ssize_t" "ac_cv_type_ssize_t" "$ac_includes_default" if test "x$ac_cv_type_ssize_t" = xyes; then : else cat >>confdefs.h <<_ACEOF #define ssize_t int _ACEOF fi ac_fn_c_find_uintX_t "$LINENO" "16" "ac_cv_c_uint16_t" case $ac_cv_c_uint16_t in #( no|yes) ;; #( *) cat >>confdefs.h <<_ACEOF #define uint16_t $ac_cv_c_uint16_t _ACEOF ;; esac ac_fn_c_find_uintX_t "$LINENO" "32" "ac_cv_c_uint32_t" case $ac_cv_c_uint32_t in #( no|yes) ;; #( *) $as_echo "#define _UINT32_T 1" >>confdefs.h cat >>confdefs.h <<_ACEOF #define uint32_t $ac_cv_c_uint32_t _ACEOF ;; esac ac_fn_c_find_uintX_t "$LINENO" "64" "ac_cv_c_uint64_t" case $ac_cv_c_uint64_t in #( no|yes) ;; #( *) $as_echo "#define _UINT64_T 1" >>confdefs.h cat >>confdefs.h <<_ACEOF #define uint64_t $ac_cv_c_uint64_t _ACEOF ;; esac ac_fn_c_find_uintX_t "$LINENO" "8" "ac_cv_c_uint8_t" case $ac_cv_c_uint8_t in #( no|yes) ;; #( *) $as_echo "#define _UINT8_T 1" >>confdefs.h cat >>confdefs.h <<_ACEOF #define uint8_t $ac_cv_c_uint8_t _ACEOF ;; esac # Checks for library functions. for ac_header in vfork.h do : ac_fn_cxx_check_header_mongrel "$LINENO" "vfork.h" "ac_cv_header_vfork_h" "$ac_includes_default" if test "x$ac_cv_header_vfork_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_VFORK_H 1 _ACEOF fi done for ac_func in fork vfork do : as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` ac_fn_cxx_check_func "$LINENO" "$ac_func" "$as_ac_var" if eval test \"x\$"$as_ac_var"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 _ACEOF fi done if test "x$ac_cv_func_fork" = xyes; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for working fork" >&5 $as_echo_n "checking for working fork... " >&6; } if ${ac_cv_func_fork_works+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : ac_cv_func_fork_works=cross else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default int main () { /* By Ruediger Kuhlmann. */ return fork () < 0; ; return 0; } _ACEOF if ac_fn_cxx_try_run "$LINENO"; then : ac_cv_func_fork_works=yes else ac_cv_func_fork_works=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_fork_works" >&5 $as_echo "$ac_cv_func_fork_works" >&6; } else ac_cv_func_fork_works=$ac_cv_func_fork fi if test "x$ac_cv_func_fork_works" = xcross; then case $host in *-*-amigaos* | *-*-msdosdjgpp*) # Override, as these systems have only a dummy fork() stub ac_cv_func_fork_works=no ;; *) ac_cv_func_fork_works=yes ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: result $ac_cv_func_fork_works guessed because of cross compilation" >&5 $as_echo "$as_me: WARNING: result $ac_cv_func_fork_works guessed because of cross compilation" >&2;} fi ac_cv_func_vfork_works=$ac_cv_func_vfork if test "x$ac_cv_func_vfork" = xyes; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for working vfork" >&5 $as_echo_n "checking for working vfork... " >&6; } if ${ac_cv_func_vfork_works+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : ac_cv_func_vfork_works=cross else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Thanks to Paul Eggert for this test. */ $ac_includes_default #include #ifdef HAVE_VFORK_H # include #endif /* On some sparc systems, changes by the child to local and incoming argument registers are propagated back to the parent. The compiler is told about this with #include , but some compilers (e.g. gcc -O) don't grok . Test for this by using a static variable whose address is put into a register that is clobbered by the vfork. */ static void #ifdef __cplusplus sparc_address_test (int arg) # else sparc_address_test (arg) int arg; #endif { static pid_t child; if (!child) { child = vfork (); if (child < 0) { perror ("vfork"); _exit(2); } if (!child) { arg = getpid(); write(-1, "", 0); _exit (arg); } } } int main () { pid_t parent = getpid (); pid_t child; sparc_address_test (0); child = vfork (); if (child == 0) { /* Here is another test for sparc vfork register problems. This test uses lots of local variables, at least as many local variables as main has allocated so far including compiler temporaries. 4 locals are enough for gcc 1.40.3 on a Solaris 4.1.3 sparc, but we use 8 to be safe. A buggy compiler should reuse the register of parent for one of the local variables, since it will think that parent can't possibly be used any more in this routine. Assigning to the local variable will thus munge parent in the parent process. */ pid_t p = getpid(), p1 = getpid(), p2 = getpid(), p3 = getpid(), p4 = getpid(), p5 = getpid(), p6 = getpid(), p7 = getpid(); /* Convince the compiler that p..p7 are live; otherwise, it might use the same hardware register for all 8 local variables. */ if (p != p1 || p != p2 || p != p3 || p != p4 || p != p5 || p != p6 || p != p7) _exit(1); /* On some systems (e.g. IRIX 3.3), vfork doesn't separate parent from child file descriptors. If the child closes a descriptor before it execs or exits, this munges the parent's descriptor as well. Test for this by closing stdout in the child. */ _exit(close(fileno(stdout)) != 0); } else { int status; struct stat st; while (wait(&status) != child) ; return ( /* Was there some problem with vforking? */ child < 0 /* Did the child fail? (This shouldn't happen.) */ || status /* Did the vfork/compiler bug occur? */ || parent != getpid() /* Did the file descriptor bug occur? */ || fstat(fileno(stdout), &st) != 0 ); } } _ACEOF if ac_fn_cxx_try_run "$LINENO"; then : ac_cv_func_vfork_works=yes else ac_cv_func_vfork_works=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_vfork_works" >&5 $as_echo "$ac_cv_func_vfork_works" >&6; } fi; if test "x$ac_cv_func_fork_works" = xcross; then ac_cv_func_vfork_works=$ac_cv_func_vfork { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: result $ac_cv_func_vfork_works guessed because of cross compilation" >&5 $as_echo "$as_me: WARNING: result $ac_cv_func_vfork_works guessed because of cross compilation" >&2;} fi if test "x$ac_cv_func_vfork_works" = xyes; then $as_echo "#define HAVE_WORKING_VFORK 1" >>confdefs.h else $as_echo "#define vfork fork" >>confdefs.h fi if test "x$ac_cv_func_fork_works" = xyes; then $as_echo "#define HAVE_WORKING_FORK 1" >>confdefs.h fi for ac_func in bzero gethostbyaddr gethostname gethostbyname gettimeofday inet_ntoa inet_aton memchr memmove memset select socket strcasecmp strchr strdup strerror strncasecmp strstr strtol strtoul do : as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` ac_fn_cxx_check_func "$LINENO" "$ac_func" "$as_ac_var" if eval test \"x\$"$as_ac_var"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 _ACEOF fi done CFLAGS="$CFLAGS_SAVED" CPPFLAGS="$CPPFLAGS_SAVED" CXXFLAGS="$CXXFLAGS_SAVED" if test $ac_cv_func_socket = no; then # socket is not in the default libraries. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for socket in -lsocket" >&5 $as_echo_n "checking for socket in -lsocket... " >&6; } if ${ac_cv_lib_socket_socket+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lsocket $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char socket (); int main () { return socket (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : ac_cv_lib_socket_socket=yes else ac_cv_lib_socket_socket=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_socket_socket" >&5 $as_echo "$ac_cv_lib_socket_socket" >&6; } if test "x$ac_cv_lib_socket_socket" = xyes; then : LIB_LIBS="$LIB_LIBS -lsocket" fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for vsnprintf" >&5 $as_echo_n "checking for vsnprintf... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include int main () { char buff[1]; va_list valist; vsnprintf(buff, 1, "", valist); ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } $as_echo "#define HAVE_VSNPRINTF 1" >>confdefs.h else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if test $ac_cv_func_inet_aton = no; then # inet_aton is not in the default libraries. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for inet_aton in -lresolv" >&5 $as_echo_n "checking for inet_aton in -lresolv... " >&6; } if ${ac_cv_lib_resolv_inet_aton+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lresolv $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char inet_aton (); int main () { return inet_aton (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : ac_cv_lib_resolv_inet_aton=yes else ac_cv_lib_resolv_inet_aton=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_resolv_inet_aton" >&5 $as_echo "$ac_cv_lib_resolv_inet_aton" >&6; } if test "x$ac_cv_lib_resolv_inet_aton" = xyes; then : LIB_LIBS="$LIB_LIBS -lresolv" fi fi if test $ac_cv_func_gethostname = no; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for gethostname in -lnsl" >&5 $as_echo_n "checking for gethostname in -lnsl... " >&6; } if ${ac_cv_lib_nsl_gethostname+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lnsl $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char gethostname (); int main () { return gethostname (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : ac_cv_lib_nsl_gethostname=yes else ac_cv_lib_nsl_gethostname=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_nsl_gethostname" >&5 $as_echo "$ac_cv_lib_nsl_gethostname" >&6; } if test "x$ac_cv_lib_nsl_gethostname" = xyes; then : LIB_LIBS="$LIB_LIBS -lnsl" fi fi if test $ac_cv_func_gethostbyname = no; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for gethostbyname in -lnsl" >&5 $as_echo_n "checking for gethostbyname in -lnsl... " >&6; } if ${ac_cv_lib_nsl_gethostbyname+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lnsl $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char gethostbyname (); int main () { return gethostbyname (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : ac_cv_lib_nsl_gethostbyname=yes else ac_cv_lib_nsl_gethostbyname=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_nsl_gethostbyname" >&5 $as_echo "$ac_cv_lib_nsl_gethostbyname" >&6; } if test "x$ac_cv_lib_nsl_gethostbyname" = xyes; then : LIB_LIBS="$LIB_LIBS -lnsl" fi OLD_LIBS=$LIBS LIBS="$LIB_LIBS $LIBS -lws2_32" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { gethostbyname("test"); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : LIB_LIBS="$LIB_LIBS -lws2_32" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$OLD_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for struct sockaddr_in6" >&5 $as_echo_n "checking for struct sockaddr_in6... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include int main () { static struct sockaddr_in6 ac_i; ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } $as_echo "#define HAVE_IPV6 1" >>confdefs.h { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether struct sockaddr_in6 has a sin6_len field" >&5 $as_echo_n "checking whether struct sockaddr_in6 has a sin6_len field... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include int main () { static struct sockaddr_in6 ac_i;int ac_j = sizeof(ac_i.sin6_len); ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } $as_echo "#define HAVE_SIN6_LEN 1" >>confdefs.h else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether struct sockaddr_storage has a __ss_family field" >&5 $as_echo_n "checking whether struct sockaddr_storage has a __ss_family field... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include int main () { static struct sockaddr_storage ac_i;int ac_j = sizeof(ac_i.__ss_family); ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } $as_echo "#define HAVE___SS_FAMILY 1" >>confdefs.h else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: checking for struct sockaddr_storage" >&5 $as_echo_n "checking for struct sockaddr_storage... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef HAVE_WINSOCK2_H #include #else #include #include #include #endif int main () { static struct sockaddr_storage ac_i; ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } $as_echo "#define HAVE_SOCKADDR_STORAGE 1" >>confdefs.h else as_fn_error $? "For IPv6 you will need a struct sockaddr_storage!" "$LINENO" 5 fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether struct sockaddr_in has a sin_len field" >&5 $as_echo_n "checking whether struct sockaddr_in has a sin_len field... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include int main () { static struct sockaddr_in ac_i;int ac_j = sizeof(ac_i.sin_len); ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } $as_echo "#define HAVE_SIN_LEN 1" >>confdefs.h else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: checking for socklen_t" >&5 $as_echo_n "checking for socklen_t... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "socklen_t" >/dev/null 2>&1; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } $as_echo "#define HAVE_SOCKLEN_T 1" >>confdefs.h else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi rm -f conftest* { $as_echo "$as_me:${as_lineno-$LINENO}: checking which port is appropriate for this system" >&5 $as_echo_n "checking which port is appropriate for this system... " >&6; } # system=`uname -s` case $system in Linux) ARCH="LINUX" PORT_SUBDIR="Port-linux" PORT_CFLAGS="" PORT_LDFLAGS="" EXTRA_DIST_SUBDIRS="Port-bsd Port-winnt2k Port-sun" ;; Darwin | FreeBSD | NetBSD) ARCH="BSD" PORT_SUBDIR="Port-bsd" PORT_CFLAGS="" if test "$NEED_RFC_3542" == "yes"; then PORT_CFLAGS="-D__APPLE_USE_RFC_3542" fi PORT_LDFLAGS= EXTRA_DIST_SUBDIRS="Port-linux Port-winnt2k Port-sun" ;; OpenBSD) ARCH="BSD" PORT_SUBDIR="Port-bsd" PORT_CFLAGS="-DOPENBSD" PORT_LDFLAGS= EXTRA_DIST_SUBDIRS="Port-linux Port-winnt2k Port-sun" ;; SunOS) ARCH="SUNOS" PORT_SUBDIR="Port-sun" PORT_CFLAGS="-DSUNOS -D__EXTENSIONS__" PORT_LDFLAGS="-lsocket -lnsl" EXTRA_DIST_SUBDIRS="Port-linux Port-winnt2k Port-bsd" ;; MINGW32*) ARCH="WIN2K" PORT_LDFLAGS = "-lws2_32" PORT_CFLAGS = "-std=c99 -DMINGWBUILD" PORT_SUBDIR = "Port-win2k" EXTRA_DIST_SUBDIRS="Port-linux Port-bsd" ;; *) as_fn_error $? "\"Unsupported OS: uname returned $system\"" "$LINENO" 5 ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PORT_SUBDIR" >&5 $as_echo "$PORT_SUBDIR" >&6; } CFLAGS="${CFLAGS} ${PORT_CFLAGS}" LDFLAGS="${LDFLAGS} ${PORT_LDFLAGS}" CPPFLAGS="${CPPFLAGS} -D${ARCH}" CPPFLAGS="${CPPFLAGS} -Wall -pedantic -funsigned-char" # Check whether --enable- was given. if test "${enable_+set}" = set; then : enableval=$enable_; fi # Check whether --enable- was given. if test "${enable_+set}" = set; then : enableval=$enable_; fi ### debugging ################## # Check whether --enable-debug was given. if test "${enable_debug+set}" = set; then : enableval=$enable_debug; case "${enableval}" in yes) debug=yes ;; no) debug=no ;; *) as_fn_error $? "bad value ${enableval} for --enable-debug" "$LINENO" 5 ;; esac else debug=no fi if test x$debug = xyes; then OPTFLAG="-O0" CPPFLAGS="-g ${CPPFLAGS}" LINKPRINT="${LINKPRINT} debug" else OPTFLAG="-O2" fi # add -O2 or -O0 only if it isn't specified already by user TMP=`echo "$CPPFLAGS" | grep "\-O" -` if test "$CPPFLAGS" != "$TMP"; then CPPFLAGS="${OPTFLAG} ${CPPFLAGS}" fi ### electric-fence #################### # Check whether --enable-efence was given. if test "${enable_efence+set}" = set; then : enableval=$enable_efence; case "${enableval}" in yes) efence=yes ;; no) efence=no ;; *) as_fn_error $? "bad value ${enableval} for --enable-efence" "$LINENO" 5 ;; esac else efence=no fi if test x$efence = xyes; then LDFLAGS="${LDFLAGS} -lefence" LINKPRINT="${LINKPRINT} efence" fi ### reusing socket binding (bind SO_REUSEADDR) #################### # Check whether --enable-bind-reuse was given. if test "${enable_bind_reuse+set}" = set; then : enableval=$enable_bind_reuse; case "${enableval}" in yes) MOD_CLNT_BIND_REUSE=yes ;; no) MOD_CLNT_BIND_REUSE=no ;; *) as_fn_error $? "bad value ${enableval} for --enable-bind-reuse" "$LINENO" 5 ;; esac else MOD_CLNT_BIND_REUSE=yes fi if test x$MOD_CLNT_BIND_REUSE = xyes; then CPPFLAGS="${CPPFLAGS} -DMOD_CLNT_BIND_REUSE" fi ### reusing dst addr filter #################### # Check whether --enable-dst-addr-filter was given. if test "${enable_dst_addr_filter+set}" = set; then : enableval=$enable_dst_addr_filter; case "${enableval}" in yes) MOD_SRV_DST_ADDR_CHECK=yes ;; no) MOD_SRV_DST_ADDR_CHECK=no ;; *) as_fn_error $? "bad value ${enableval} for --enable-dst-addr-check" "$LINENO" 5 ;; esac else MOD_SRV_DST_ADDR_CHECK=yes fi if test $MOD_SRV_DST_ADDR_CHECK = yes; then MOD_SRV_DST_ADDR_CHECK_TRUE= MOD_SRV_DST_ADDR_CHECK_FALSE='#' else MOD_SRV_DST_ADDR_CHECK_TRUE='#' MOD_SRV_DST_ADDR_CHECK_FALSE= fi if test -z "$MOD_SRV_DST_ADDR_CHECK_TRUE"; then : $as_echo "#define MOD_SRV_DST_ADDR_CHECK 1" >>confdefs.h fi ### support for resolvconf tool (mostly Debian, probably) ############## # Check whether --enable-resolvconf was given. if test "${enable_resolvconf+set}" = set; then : enableval=$enable_resolvconf; case "${enableval}" in yes) MOD_RESOLVCONF=yes ;; no) MOD_RESOLVCONF=no ;; *) as_fn_error $? "bad value ${enablevald} for --enable-resolvconf" "$LINENO" 5 ;; esac else MOD_RESOLVCONF=no fi if test $MOD_RESOLVCONF = yes; then RESOLVCONF_TRUE= RESOLVCONF_FALSE='#' else RESOLVCONF_TRUE='#' RESOLVCONF_FALSE= fi if test -z "$RESOLVCONF_TRUE"; then : $as_echo "#define MOD_RESOLVCONF 1" >>confdefs.h fi ### DNS Update #################################### ### We may add separate parameter for client and server eventually ########## # Check whether --enable-dns-update was given. if test "${enable_dns_update+set}" = set; then : enableval=$enable_dns_update; case "${enableval}" in yes) MOD_CLNT_DISABLE_DNSUPDATE=no MOD_SRV_DISABLE_DNSUPDATE=no ;; no) MOD_CLNT_DISABLE_DNSUPDATE=yes MOD_SRV_DISABLE_DNSUPDATE=yes ;; *) as_fn_error $? "bad value ${enableval} for --enable-dns-update" "$LINENO" 5 ;; esac else MOD_CLNT_DISABLE_DNSUPDATE=no; MOD_SRV_DISABLE_DNSUPDATE=no fi if test x$MOD_CLNT_DISABLE_DNSUPDATE = xyes; then CPPFLAGS="${CPPFLAGS} -DMOD_CLNT_DISABLE_DNSUPDATE" fi if test x$MOD_SRV_DISABLE_DNSUPDATE = xyes; then CPPFLAGS="${CPPFLAGS} -DMOD_SRV_DISABLE_DNSUPDATE" fi ### Authentication ############################### # Check whether --enable-auth was given. if test "${enable_auth+set}" = set; then : enableval=$enable_auth; case "${enableval}" in yes) MOD_DISABLE_AUTH=no ;; no) MOD_DISABLE_AUTH=yes ;; *) as_fn_error $? "bad value ${enableval} for --enable-auth" "$LINENO" 5 ;; esac else MOD_DISABLE_AUTH=no fi if test x$MOD_DISABLE_AUTH = xyes; then CPPFLAGS="${CPPFLAGS} -DMOD_DISABLE_AUTH" fi ### gtests ################################################# # Check whether --with-gtest was given. if test "${with_gtest+set}" = set; then : withval=$with_gtest; gtest_path="$withval" else gtest_path="no" fi # Check whether --enable-gtest-static was given. if test "${enable_gtest_static+set}" = set; then : enableval=$enable_gtest_static; case "${enableval}" in yes) gtest_static=yes ;; no) gtest_static=no ;; *) as_fn_error $? "bad value ${enableval} for --enable-gtest-static" "$LINENO" 5 ;; esac else gtest_static=yes fi #echo "After gtest" if test "$gtest_path" != "no" then if test -x "${gtest_path}/scripts/gtest-config" then GTEST_CONFIG="${gtest_path}/scripts/gtest-config" GTEST_INCLUDES=`${GTEST_CONFIG} --cppflags` GTEST_LDFLAGS=`${GTEST_CONFIG} --ldflags` GTEST_LDADD=`${GTEST_CONFIG} --libs` # Linking gtest statically if test "$gtest_static" != "no" then GTEST_LDFLAGS="${GTEST_LDFLAGS} -static" fi else as_fn_error $? "Google test not found: couldn't execute ${gtest_path}/scripts/gtest-config" "$LINENO" 5 fi fi ### Link-state change detections ########################## # Check whether --enable-link-state was given. if test "${enable_link_state+set}" = set; then : enableval=$enable_link_state; case "${enableval}" in yes) MOD_CLNT_CONFIRM=yes ;; no) MOD_CLNT_CONFIRM=no ;; *) as_fn_error $? "bad value ${enableval} for --enable-link-state" "$LINENO" 5 ;; esac else MOD_CLNT_CONFIRM=yes fi if test x$MOD_CLNT_CONFIRM = xyes; then CPPFLAGS="${CPPFLAGS} -DMOD_CLNT_CONFIRM" fi if test x$MOD_CLNT_CONFIRM = xyes && test $ARCH = LINUX ; then echo "Link state detection enabled on Linux, adding -lpthreads" LDFLAGS="${LDFLAGS} -lpthread" else echo "Link state detection disabled or this is not Linux, NOT adding -lpthreads" fi ### Remote autoconf ###################################### # Check whether --enable-remote-autoconf was given. if test "${enable_remote_autoconf+set}" = set; then : enableval=$enable_remote_autoconf; case "${enableval}" in yes) MOD_REMOTE_AUTOCONF=yes ;; no) MOD_REMOTE_AUTOCONF=no ;; *) as_fn_error $? "bad value ${enableval} for --enable-remote-autoconf" "$LINENO" 5 ;; esac else MOD_REMOTE_AUTOCONF=no fi if test x$MOD_REMOTE_AUTOCONF = xyes; then CPPFLAGS="${CPPFLAGS} -DMOD_REMOTE_AUTOCONF" fi # Lists all port directories that are unused on this platform (e.g. BSD and winn2k on Linux) subdirs="$subdirs bison++" #AC_CONFIG_SUBDIRS([poslib]) if test "$gtest_path" != "no"; then echo "GTEST enabled, generating Makefiles" $as_echo "#define HAVE_GTEST 1" >>confdefs.h fi if test "$gtest_path" != "no"; then HAVE_GTEST_TRUE= HAVE_GTEST_FALSE='#' else HAVE_GTEST_TRUE='#' HAVE_GTEST_FALSE= fi ac_config_files="$ac_config_files Makefile AddrMgr/Makefile CfgMgr/Makefile ClntAddrMgr/Makefile ClntCfgMgr/Makefile ClntIfaceMgr/Makefile ClntMessages/Makefile ClntOptions/Makefile ClntTransMgr/Makefile IfaceMgr/Makefile Messages/Makefile Misc/Makefile Options/Makefile RelCfgMgr/Makefile RelIfaceMgr/Makefile RelMessages/Makefile RelOptions/Makefile RelTransMgr/Makefile Requestor/Makefile SrvAddrMgr/Makefile SrvCfgMgr/Makefile SrvIfaceMgr/Makefile SrvMessages/Makefile SrvOptions/Makefile SrvTransMgr/Makefile poslib/Makefile nettle/Makefile $PORT_SUBDIR/Makefile Port-linux/Makefile Port-bsd/Makefile Port-sun/Makefile Port-win32/Makefile Port-winnt2k/Makefile doc/Makefile Misc/Portable.h doc/doxygen.cfg doc/version.tex AddrMgr/tests/Makefile IfaceMgr/tests/Makefile Options/tests/Makefile SrvCfgMgr/tests/Makefile CfgMgr/tests/Makefile poslib/tests/Makefile Misc/tests/Makefile RelTransMgr/tests/Makefile tests/Makefile tests/Srv/Makefile tests/utils/Makefile" cat >confcache <<\_ACEOF # This file is a shell script that caches the results of configure # tests run on this system so they can be shared between configure # scripts and configure runs, see configure's option --config-cache. # It is not useful on other systems. If it contains results you don't # want to keep, you may remove or edit it. # # config.status only pays attention to the cache file if you give it # the --recheck option to rerun configure. # # `ac_cv_env_foo' variables (set or unset) will be overridden when # loading this file, other *unset* `ac_cv_foo' will be assigned the # following values. _ACEOF # The following way of writing the cache mishandles newlines in values, # but we know of no workaround that is simple, portable, and efficient. # So, we kill variables containing newlines. # Ultrix sh set writes to stderr and can't be redirected directly, # and sets the high bit in the cache file unless we assign to the vars. ( for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space=' '; set) 2>&1` in #( *${as_nl}ac_space=\ *) # `set' does not quote correctly, so add quotes: double-quote # substitution turns \\\\ into \\, and sed turns \\ into \. sed -n \ "s/'/'\\\\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" ;; #( *) # `set' quotes correctly as required by POSIX, so do not add quotes. sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) | sed ' /^ac_cv_env_/b end t clear :clear s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ t end s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ :end' >>confcache if diff "$cache_file" confcache >/dev/null 2>&1; then :; else if test -w "$cache_file"; then if test "x$cache_file" != "x/dev/null"; then { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 $as_echo "$as_me: updating cache $cache_file" >&6;} if test ! -f "$cache_file" || test -h "$cache_file"; then cat confcache >"$cache_file" else case $cache_file in #( */* | ?:*) mv -f confcache "$cache_file"$$ && mv -f "$cache_file"$$ "$cache_file" ;; #( *) mv -f confcache "$cache_file" ;; esac fi fi else { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 $as_echo "$as_me: not updating unwritable cache $cache_file" >&6;} fi fi rm -f confcache test "x$prefix" = xNONE && prefix=$ac_default_prefix # Let make expand exec_prefix. test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' DEFS=-DHAVE_CONFIG_H ac_libobjs= ac_ltlibobjs= U= for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue # 1. Remove the extension, and $U if already installed. ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' ac_i=`$as_echo "$ac_i" | sed "$ac_script"` # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR # will be set to the directory where LIBOBJS objects are built. as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext" as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo' done LIBOBJS=$ac_libobjs LTLIBOBJS=$ac_ltlibobjs { $as_echo "$as_me:${as_lineno-$LINENO}: checking that generated files are newer than configure" >&5 $as_echo_n "checking that generated files are newer than configure... " >&6; } if test -n "$am_sleep_pid"; then # Hide warnings about reused PIDs. wait $am_sleep_pid 2>/dev/null fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: done" >&5 $as_echo "done" >&6; } if test -n "$EXEEXT"; then am__EXEEXT_TRUE= am__EXEEXT_FALSE='#' else am__EXEEXT_TRUE='#' am__EXEEXT_FALSE= fi if test -z "${MAINTAINER_MODE_TRUE}" && test -z "${MAINTAINER_MODE_FALSE}"; then as_fn_error $? "conditional \"MAINTAINER_MODE\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${AMDEP_TRUE}" && test -z "${AMDEP_FALSE}"; then as_fn_error $? "conditional \"AMDEP\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${am__fastdepCXX_TRUE}" && test -z "${am__fastdepCXX_FALSE}"; then as_fn_error $? "conditional \"am__fastdepCXX\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then as_fn_error $? "conditional \"am__fastdepCC\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${MOD_SRV_DST_ADDR_CHECK_TRUE}" && test -z "${MOD_SRV_DST_ADDR_CHECK_FALSE}"; then as_fn_error $? "conditional \"MOD_SRV_DST_ADDR_CHECK\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${RESOLVCONF_TRUE}" && test -z "${RESOLVCONF_FALSE}"; then as_fn_error $? "conditional \"RESOLVCONF\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${HAVE_GTEST_TRUE}" && test -z "${HAVE_GTEST_FALSE}"; then as_fn_error $? "conditional \"HAVE_GTEST\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi : "${CONFIG_STATUS=./config.status}" ac_write_fail=0 ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files $CONFIG_STATUS" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5 $as_echo "$as_me: creating $CONFIG_STATUS" >&6;} as_write_fail=0 cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1 #! $SHELL # Generated by $as_me. # Run this file to recreate the current configuration. # Compiler output produced by configure, useful for debugging # configure, is in config.log if it exists. debug=false ac_cs_recheck=false ac_cs_silent=false SHELL=\${CONFIG_SHELL-$SHELL} export SHELL _ASEOF cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1 ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in #( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi $as_echo "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -pR' fi else as_ln_s='cp -pR' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi # as_fn_executable_p FILE # ----------------------- # Test if FILE is an executable regular file. as_fn_executable_p () { test -f "$1" && test -x "$1" } # as_fn_executable_p as_test_x='test -x' as_executable_p=as_fn_executable_p # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" exec 6>&1 ## ----------------------------------- ## ## Main body of $CONFIG_STATUS script. ## ## ----------------------------------- ## _ASEOF test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1 cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Save the log message, to keep $0 and so on meaningful, and to # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" This file was extended by dibbler $as_me 1.0.1, which was generated by GNU Autoconf 2.69. Invocation command line was CONFIG_FILES = $CONFIG_FILES CONFIG_HEADERS = $CONFIG_HEADERS CONFIG_LINKS = $CONFIG_LINKS CONFIG_COMMANDS = $CONFIG_COMMANDS $ $0 $@ on `(hostname || uname -n) 2>/dev/null | sed 1q` " _ACEOF case $ac_config_files in *" "*) set x $ac_config_files; shift; ac_config_files=$*;; esac case $ac_config_headers in *" "*) set x $ac_config_headers; shift; ac_config_headers=$*;; esac cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 # Files that config.status was made for. config_files="$ac_config_files" config_headers="$ac_config_headers" config_commands="$ac_config_commands" _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 ac_cs_usage="\ \`$as_me' instantiates files and other configuration actions from templates according to the current configuration. Unless the files and actions are specified as TAGs, all are instantiated by default. Usage: $0 [OPTION]... [TAG]... -h, --help print this help, then exit -V, --version print version number and configuration settings, then exit --config print configuration, then exit -q, --quiet, --silent do not print progress messages -d, --debug don't remove temporary files --recheck update $as_me by reconfiguring in the same conditions --file=FILE[:TEMPLATE] instantiate the configuration file FILE --header=FILE[:TEMPLATE] instantiate the configuration header FILE Configuration files: $config_files Configuration headers: $config_headers Configuration commands: $config_commands Report bugs to ." _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" ac_cs_version="\\ dibbler config.status 1.0.1 configured by $0, generated by GNU Autoconf 2.69, with options \\"\$ac_cs_config\\" Copyright (C) 2012 Free Software Foundation, Inc. This config.status script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it." ac_pwd='$ac_pwd' srcdir='$srcdir' INSTALL='$INSTALL' MKDIR_P='$MKDIR_P' AWK='$AWK' test -n "\$AWK" || AWK=awk _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # The default lists apply if the user does not specify any file. ac_need_defaults=: while test $# != 0 do case $1 in --*=?*) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` ac_shift=: ;; --*=) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg= ac_shift=: ;; *) ac_option=$1 ac_optarg=$2 ac_shift=shift ;; esac case $ac_option in # Handling of the options. -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) ac_cs_recheck=: ;; --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) $as_echo "$ac_cs_version"; exit ;; --config | --confi | --conf | --con | --co | --c ) $as_echo "$ac_cs_config"; exit ;; --debug | --debu | --deb | --de | --d | -d ) debug=: ;; --file | --fil | --fi | --f ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; '') as_fn_error $? "missing file argument" ;; esac as_fn_append CONFIG_FILES " '$ac_optarg'" ac_need_defaults=false;; --header | --heade | --head | --hea ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; esac as_fn_append CONFIG_HEADERS " '$ac_optarg'" ac_need_defaults=false;; --he | --h) # Conflict between --help and --header as_fn_error $? "ambiguous option: \`$1' Try \`$0 --help' for more information.";; --help | --hel | -h ) $as_echo "$ac_cs_usage"; exit ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil | --si | --s) ac_cs_silent=: ;; # This is an error. -*) as_fn_error $? "unrecognized option: \`$1' Try \`$0 --help' for more information." ;; *) as_fn_append ac_config_targets " $1" ac_need_defaults=false ;; esac shift done ac_configure_extra_args= if $ac_cs_silent; then exec 6>/dev/null ac_configure_extra_args="$ac_configure_extra_args --silent" fi _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 if \$ac_cs_recheck; then set X $SHELL '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion shift \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6 CONFIG_SHELL='$SHELL' export CONFIG_SHELL exec "\$@" fi _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 exec 5>>config.log { echo sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX ## Running $as_me. ## _ASBOX $as_echo "$ac_log" } >&5 _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 # # INIT-COMMANDS # AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir" # The HP-UX ksh and POSIX shell print the target directory to stdout # if CDPATH is set. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH sed_quote_subst='$sed_quote_subst' double_quote_subst='$double_quote_subst' delay_variable_subst='$delay_variable_subst' macro_version='`$ECHO "$macro_version" | $SED "$delay_single_quote_subst"`' macro_revision='`$ECHO "$macro_revision" | $SED "$delay_single_quote_subst"`' enable_shared='`$ECHO "$enable_shared" | $SED "$delay_single_quote_subst"`' enable_static='`$ECHO "$enable_static" | $SED "$delay_single_quote_subst"`' pic_mode='`$ECHO "$pic_mode" | $SED "$delay_single_quote_subst"`' enable_fast_install='`$ECHO "$enable_fast_install" | $SED "$delay_single_quote_subst"`' SHELL='`$ECHO "$SHELL" | $SED "$delay_single_quote_subst"`' ECHO='`$ECHO "$ECHO" | $SED "$delay_single_quote_subst"`' PATH_SEPARATOR='`$ECHO "$PATH_SEPARATOR" | $SED "$delay_single_quote_subst"`' host_alias='`$ECHO "$host_alias" | $SED "$delay_single_quote_subst"`' host='`$ECHO "$host" | $SED "$delay_single_quote_subst"`' host_os='`$ECHO "$host_os" | $SED "$delay_single_quote_subst"`' build_alias='`$ECHO "$build_alias" | $SED "$delay_single_quote_subst"`' build='`$ECHO "$build" | $SED "$delay_single_quote_subst"`' build_os='`$ECHO "$build_os" | $SED "$delay_single_quote_subst"`' SED='`$ECHO "$SED" | $SED "$delay_single_quote_subst"`' Xsed='`$ECHO "$Xsed" | $SED "$delay_single_quote_subst"`' GREP='`$ECHO "$GREP" | $SED "$delay_single_quote_subst"`' EGREP='`$ECHO "$EGREP" | $SED "$delay_single_quote_subst"`' FGREP='`$ECHO "$FGREP" | $SED "$delay_single_quote_subst"`' LD='`$ECHO "$LD" | $SED "$delay_single_quote_subst"`' NM='`$ECHO "$NM" | $SED "$delay_single_quote_subst"`' LN_S='`$ECHO "$LN_S" | $SED "$delay_single_quote_subst"`' max_cmd_len='`$ECHO "$max_cmd_len" | $SED "$delay_single_quote_subst"`' ac_objext='`$ECHO "$ac_objext" | $SED "$delay_single_quote_subst"`' exeext='`$ECHO "$exeext" | $SED "$delay_single_quote_subst"`' lt_unset='`$ECHO "$lt_unset" | $SED "$delay_single_quote_subst"`' lt_SP2NL='`$ECHO "$lt_SP2NL" | $SED "$delay_single_quote_subst"`' lt_NL2SP='`$ECHO "$lt_NL2SP" | $SED "$delay_single_quote_subst"`' lt_cv_to_host_file_cmd='`$ECHO "$lt_cv_to_host_file_cmd" | $SED "$delay_single_quote_subst"`' lt_cv_to_tool_file_cmd='`$ECHO "$lt_cv_to_tool_file_cmd" | $SED "$delay_single_quote_subst"`' reload_flag='`$ECHO "$reload_flag" | $SED "$delay_single_quote_subst"`' reload_cmds='`$ECHO "$reload_cmds" | $SED "$delay_single_quote_subst"`' OBJDUMP='`$ECHO "$OBJDUMP" | $SED "$delay_single_quote_subst"`' deplibs_check_method='`$ECHO "$deplibs_check_method" | $SED "$delay_single_quote_subst"`' file_magic_cmd='`$ECHO "$file_magic_cmd" | $SED "$delay_single_quote_subst"`' file_magic_glob='`$ECHO "$file_magic_glob" | $SED "$delay_single_quote_subst"`' want_nocaseglob='`$ECHO "$want_nocaseglob" | $SED "$delay_single_quote_subst"`' DLLTOOL='`$ECHO "$DLLTOOL" | $SED "$delay_single_quote_subst"`' sharedlib_from_linklib_cmd='`$ECHO "$sharedlib_from_linklib_cmd" | $SED "$delay_single_quote_subst"`' AR='`$ECHO "$AR" | $SED "$delay_single_quote_subst"`' AR_FLAGS='`$ECHO "$AR_FLAGS" | $SED "$delay_single_quote_subst"`' archiver_list_spec='`$ECHO "$archiver_list_spec" | $SED "$delay_single_quote_subst"`' STRIP='`$ECHO "$STRIP" | $SED "$delay_single_quote_subst"`' RANLIB='`$ECHO "$RANLIB" | $SED "$delay_single_quote_subst"`' old_postinstall_cmds='`$ECHO "$old_postinstall_cmds" | $SED "$delay_single_quote_subst"`' old_postuninstall_cmds='`$ECHO "$old_postuninstall_cmds" | $SED "$delay_single_quote_subst"`' old_archive_cmds='`$ECHO "$old_archive_cmds" | $SED "$delay_single_quote_subst"`' lock_old_archive_extraction='`$ECHO "$lock_old_archive_extraction" | $SED "$delay_single_quote_subst"`' CC='`$ECHO "$CC" | $SED "$delay_single_quote_subst"`' CFLAGS='`$ECHO "$CFLAGS" | $SED "$delay_single_quote_subst"`' compiler='`$ECHO "$compiler" | $SED "$delay_single_quote_subst"`' GCC='`$ECHO "$GCC" | $SED "$delay_single_quote_subst"`' lt_cv_sys_global_symbol_pipe='`$ECHO "$lt_cv_sys_global_symbol_pipe" | $SED "$delay_single_quote_subst"`' lt_cv_sys_global_symbol_to_cdecl='`$ECHO "$lt_cv_sys_global_symbol_to_cdecl" | $SED "$delay_single_quote_subst"`' lt_cv_sys_global_symbol_to_c_name_address='`$ECHO "$lt_cv_sys_global_symbol_to_c_name_address" | $SED "$delay_single_quote_subst"`' lt_cv_sys_global_symbol_to_c_name_address_lib_prefix='`$ECHO "$lt_cv_sys_global_symbol_to_c_name_address_lib_prefix" | $SED "$delay_single_quote_subst"`' nm_file_list_spec='`$ECHO "$nm_file_list_spec" | $SED "$delay_single_quote_subst"`' lt_sysroot='`$ECHO "$lt_sysroot" | $SED "$delay_single_quote_subst"`' objdir='`$ECHO "$objdir" | $SED "$delay_single_quote_subst"`' MAGIC_CMD='`$ECHO "$MAGIC_CMD" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_no_builtin_flag='`$ECHO "$lt_prog_compiler_no_builtin_flag" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_pic='`$ECHO "$lt_prog_compiler_pic" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_wl='`$ECHO "$lt_prog_compiler_wl" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_static='`$ECHO "$lt_prog_compiler_static" | $SED "$delay_single_quote_subst"`' lt_cv_prog_compiler_c_o='`$ECHO "$lt_cv_prog_compiler_c_o" | $SED "$delay_single_quote_subst"`' need_locks='`$ECHO "$need_locks" | $SED "$delay_single_quote_subst"`' MANIFEST_TOOL='`$ECHO "$MANIFEST_TOOL" | $SED "$delay_single_quote_subst"`' DSYMUTIL='`$ECHO "$DSYMUTIL" | $SED "$delay_single_quote_subst"`' NMEDIT='`$ECHO "$NMEDIT" | $SED "$delay_single_quote_subst"`' LIPO='`$ECHO "$LIPO" | $SED "$delay_single_quote_subst"`' OTOOL='`$ECHO "$OTOOL" | $SED "$delay_single_quote_subst"`' OTOOL64='`$ECHO "$OTOOL64" | $SED "$delay_single_quote_subst"`' libext='`$ECHO "$libext" | $SED "$delay_single_quote_subst"`' shrext_cmds='`$ECHO "$shrext_cmds" | $SED "$delay_single_quote_subst"`' extract_expsyms_cmds='`$ECHO "$extract_expsyms_cmds" | $SED "$delay_single_quote_subst"`' archive_cmds_need_lc='`$ECHO "$archive_cmds_need_lc" | $SED "$delay_single_quote_subst"`' enable_shared_with_static_runtimes='`$ECHO "$enable_shared_with_static_runtimes" | $SED "$delay_single_quote_subst"`' export_dynamic_flag_spec='`$ECHO "$export_dynamic_flag_spec" | $SED "$delay_single_quote_subst"`' whole_archive_flag_spec='`$ECHO "$whole_archive_flag_spec" | $SED "$delay_single_quote_subst"`' compiler_needs_object='`$ECHO "$compiler_needs_object" | $SED "$delay_single_quote_subst"`' old_archive_from_new_cmds='`$ECHO "$old_archive_from_new_cmds" | $SED "$delay_single_quote_subst"`' old_archive_from_expsyms_cmds='`$ECHO "$old_archive_from_expsyms_cmds" | $SED "$delay_single_quote_subst"`' archive_cmds='`$ECHO "$archive_cmds" | $SED "$delay_single_quote_subst"`' archive_expsym_cmds='`$ECHO "$archive_expsym_cmds" | $SED "$delay_single_quote_subst"`' module_cmds='`$ECHO "$module_cmds" | $SED "$delay_single_quote_subst"`' module_expsym_cmds='`$ECHO "$module_expsym_cmds" | $SED "$delay_single_quote_subst"`' with_gnu_ld='`$ECHO "$with_gnu_ld" | $SED "$delay_single_quote_subst"`' allow_undefined_flag='`$ECHO "$allow_undefined_flag" | $SED "$delay_single_quote_subst"`' no_undefined_flag='`$ECHO "$no_undefined_flag" | $SED "$delay_single_quote_subst"`' hardcode_libdir_flag_spec='`$ECHO "$hardcode_libdir_flag_spec" | $SED "$delay_single_quote_subst"`' hardcode_libdir_separator='`$ECHO "$hardcode_libdir_separator" | $SED "$delay_single_quote_subst"`' hardcode_direct='`$ECHO "$hardcode_direct" | $SED "$delay_single_quote_subst"`' hardcode_direct_absolute='`$ECHO "$hardcode_direct_absolute" | $SED "$delay_single_quote_subst"`' hardcode_minus_L='`$ECHO "$hardcode_minus_L" | $SED "$delay_single_quote_subst"`' hardcode_shlibpath_var='`$ECHO "$hardcode_shlibpath_var" | $SED "$delay_single_quote_subst"`' hardcode_automatic='`$ECHO "$hardcode_automatic" | $SED "$delay_single_quote_subst"`' inherit_rpath='`$ECHO "$inherit_rpath" | $SED "$delay_single_quote_subst"`' link_all_deplibs='`$ECHO "$link_all_deplibs" | $SED "$delay_single_quote_subst"`' always_export_symbols='`$ECHO "$always_export_symbols" | $SED "$delay_single_quote_subst"`' export_symbols_cmds='`$ECHO "$export_symbols_cmds" | $SED "$delay_single_quote_subst"`' exclude_expsyms='`$ECHO "$exclude_expsyms" | $SED "$delay_single_quote_subst"`' include_expsyms='`$ECHO "$include_expsyms" | $SED "$delay_single_quote_subst"`' prelink_cmds='`$ECHO "$prelink_cmds" | $SED "$delay_single_quote_subst"`' postlink_cmds='`$ECHO "$postlink_cmds" | $SED "$delay_single_quote_subst"`' file_list_spec='`$ECHO "$file_list_spec" | $SED "$delay_single_quote_subst"`' variables_saved_for_relink='`$ECHO "$variables_saved_for_relink" | $SED "$delay_single_quote_subst"`' need_lib_prefix='`$ECHO "$need_lib_prefix" | $SED "$delay_single_quote_subst"`' need_version='`$ECHO "$need_version" | $SED "$delay_single_quote_subst"`' version_type='`$ECHO "$version_type" | $SED "$delay_single_quote_subst"`' runpath_var='`$ECHO "$runpath_var" | $SED "$delay_single_quote_subst"`' shlibpath_var='`$ECHO "$shlibpath_var" | $SED "$delay_single_quote_subst"`' shlibpath_overrides_runpath='`$ECHO "$shlibpath_overrides_runpath" | $SED "$delay_single_quote_subst"`' libname_spec='`$ECHO "$libname_spec" | $SED "$delay_single_quote_subst"`' library_names_spec='`$ECHO "$library_names_spec" | $SED "$delay_single_quote_subst"`' soname_spec='`$ECHO "$soname_spec" | $SED "$delay_single_quote_subst"`' install_override_mode='`$ECHO "$install_override_mode" | $SED "$delay_single_quote_subst"`' postinstall_cmds='`$ECHO "$postinstall_cmds" | $SED "$delay_single_quote_subst"`' postuninstall_cmds='`$ECHO "$postuninstall_cmds" | $SED "$delay_single_quote_subst"`' finish_cmds='`$ECHO "$finish_cmds" | $SED "$delay_single_quote_subst"`' finish_eval='`$ECHO "$finish_eval" | $SED "$delay_single_quote_subst"`' hardcode_into_libs='`$ECHO "$hardcode_into_libs" | $SED "$delay_single_quote_subst"`' sys_lib_search_path_spec='`$ECHO "$sys_lib_search_path_spec" | $SED "$delay_single_quote_subst"`' sys_lib_dlsearch_path_spec='`$ECHO "$sys_lib_dlsearch_path_spec" | $SED "$delay_single_quote_subst"`' hardcode_action='`$ECHO "$hardcode_action" | $SED "$delay_single_quote_subst"`' enable_dlopen='`$ECHO "$enable_dlopen" | $SED "$delay_single_quote_subst"`' enable_dlopen_self='`$ECHO "$enable_dlopen_self" | $SED "$delay_single_quote_subst"`' enable_dlopen_self_static='`$ECHO "$enable_dlopen_self_static" | $SED "$delay_single_quote_subst"`' old_striplib='`$ECHO "$old_striplib" | $SED "$delay_single_quote_subst"`' striplib='`$ECHO "$striplib" | $SED "$delay_single_quote_subst"`' compiler_lib_search_dirs='`$ECHO "$compiler_lib_search_dirs" | $SED "$delay_single_quote_subst"`' predep_objects='`$ECHO "$predep_objects" | $SED "$delay_single_quote_subst"`' postdep_objects='`$ECHO "$postdep_objects" | $SED "$delay_single_quote_subst"`' predeps='`$ECHO "$predeps" | $SED "$delay_single_quote_subst"`' postdeps='`$ECHO "$postdeps" | $SED "$delay_single_quote_subst"`' compiler_lib_search_path='`$ECHO "$compiler_lib_search_path" | $SED "$delay_single_quote_subst"`' LD_CXX='`$ECHO "$LD_CXX" | $SED "$delay_single_quote_subst"`' reload_flag_CXX='`$ECHO "$reload_flag_CXX" | $SED "$delay_single_quote_subst"`' reload_cmds_CXX='`$ECHO "$reload_cmds_CXX" | $SED "$delay_single_quote_subst"`' old_archive_cmds_CXX='`$ECHO "$old_archive_cmds_CXX" | $SED "$delay_single_quote_subst"`' compiler_CXX='`$ECHO "$compiler_CXX" | $SED "$delay_single_quote_subst"`' GCC_CXX='`$ECHO "$GCC_CXX" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_no_builtin_flag_CXX='`$ECHO "$lt_prog_compiler_no_builtin_flag_CXX" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_pic_CXX='`$ECHO "$lt_prog_compiler_pic_CXX" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_wl_CXX='`$ECHO "$lt_prog_compiler_wl_CXX" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_static_CXX='`$ECHO "$lt_prog_compiler_static_CXX" | $SED "$delay_single_quote_subst"`' lt_cv_prog_compiler_c_o_CXX='`$ECHO "$lt_cv_prog_compiler_c_o_CXX" | $SED "$delay_single_quote_subst"`' archive_cmds_need_lc_CXX='`$ECHO "$archive_cmds_need_lc_CXX" | $SED "$delay_single_quote_subst"`' enable_shared_with_static_runtimes_CXX='`$ECHO "$enable_shared_with_static_runtimes_CXX" | $SED "$delay_single_quote_subst"`' export_dynamic_flag_spec_CXX='`$ECHO "$export_dynamic_flag_spec_CXX" | $SED "$delay_single_quote_subst"`' whole_archive_flag_spec_CXX='`$ECHO "$whole_archive_flag_spec_CXX" | $SED "$delay_single_quote_subst"`' compiler_needs_object_CXX='`$ECHO "$compiler_needs_object_CXX" | $SED "$delay_single_quote_subst"`' old_archive_from_new_cmds_CXX='`$ECHO "$old_archive_from_new_cmds_CXX" | $SED "$delay_single_quote_subst"`' old_archive_from_expsyms_cmds_CXX='`$ECHO "$old_archive_from_expsyms_cmds_CXX" | $SED "$delay_single_quote_subst"`' archive_cmds_CXX='`$ECHO "$archive_cmds_CXX" | $SED "$delay_single_quote_subst"`' archive_expsym_cmds_CXX='`$ECHO "$archive_expsym_cmds_CXX" | $SED "$delay_single_quote_subst"`' module_cmds_CXX='`$ECHO "$module_cmds_CXX" | $SED "$delay_single_quote_subst"`' module_expsym_cmds_CXX='`$ECHO "$module_expsym_cmds_CXX" | $SED "$delay_single_quote_subst"`' with_gnu_ld_CXX='`$ECHO "$with_gnu_ld_CXX" | $SED "$delay_single_quote_subst"`' allow_undefined_flag_CXX='`$ECHO "$allow_undefined_flag_CXX" | $SED "$delay_single_quote_subst"`' no_undefined_flag_CXX='`$ECHO "$no_undefined_flag_CXX" | $SED "$delay_single_quote_subst"`' hardcode_libdir_flag_spec_CXX='`$ECHO "$hardcode_libdir_flag_spec_CXX" | $SED "$delay_single_quote_subst"`' hardcode_libdir_separator_CXX='`$ECHO "$hardcode_libdir_separator_CXX" | $SED "$delay_single_quote_subst"`' hardcode_direct_CXX='`$ECHO "$hardcode_direct_CXX" | $SED "$delay_single_quote_subst"`' hardcode_direct_absolute_CXX='`$ECHO "$hardcode_direct_absolute_CXX" | $SED "$delay_single_quote_subst"`' hardcode_minus_L_CXX='`$ECHO "$hardcode_minus_L_CXX" | $SED "$delay_single_quote_subst"`' hardcode_shlibpath_var_CXX='`$ECHO "$hardcode_shlibpath_var_CXX" | $SED "$delay_single_quote_subst"`' hardcode_automatic_CXX='`$ECHO "$hardcode_automatic_CXX" | $SED "$delay_single_quote_subst"`' inherit_rpath_CXX='`$ECHO "$inherit_rpath_CXX" | $SED "$delay_single_quote_subst"`' link_all_deplibs_CXX='`$ECHO "$link_all_deplibs_CXX" | $SED "$delay_single_quote_subst"`' always_export_symbols_CXX='`$ECHO "$always_export_symbols_CXX" | $SED "$delay_single_quote_subst"`' export_symbols_cmds_CXX='`$ECHO "$export_symbols_cmds_CXX" | $SED "$delay_single_quote_subst"`' exclude_expsyms_CXX='`$ECHO "$exclude_expsyms_CXX" | $SED "$delay_single_quote_subst"`' include_expsyms_CXX='`$ECHO "$include_expsyms_CXX" | $SED "$delay_single_quote_subst"`' prelink_cmds_CXX='`$ECHO "$prelink_cmds_CXX" | $SED "$delay_single_quote_subst"`' postlink_cmds_CXX='`$ECHO "$postlink_cmds_CXX" | $SED "$delay_single_quote_subst"`' file_list_spec_CXX='`$ECHO "$file_list_spec_CXX" | $SED "$delay_single_quote_subst"`' hardcode_action_CXX='`$ECHO "$hardcode_action_CXX" | $SED "$delay_single_quote_subst"`' compiler_lib_search_dirs_CXX='`$ECHO "$compiler_lib_search_dirs_CXX" | $SED "$delay_single_quote_subst"`' predep_objects_CXX='`$ECHO "$predep_objects_CXX" | $SED "$delay_single_quote_subst"`' postdep_objects_CXX='`$ECHO "$postdep_objects_CXX" | $SED "$delay_single_quote_subst"`' predeps_CXX='`$ECHO "$predeps_CXX" | $SED "$delay_single_quote_subst"`' postdeps_CXX='`$ECHO "$postdeps_CXX" | $SED "$delay_single_quote_subst"`' compiler_lib_search_path_CXX='`$ECHO "$compiler_lib_search_path_CXX" | $SED "$delay_single_quote_subst"`' LTCC='$LTCC' LTCFLAGS='$LTCFLAGS' compiler='$compiler_DEFAULT' # A function that is used when there is no print builtin or printf. func_fallback_echo () { eval 'cat <<_LTECHO_EOF \$1 _LTECHO_EOF' } # Quote evaled strings. for var in SHELL \ ECHO \ PATH_SEPARATOR \ SED \ GREP \ EGREP \ FGREP \ LD \ NM \ LN_S \ lt_SP2NL \ lt_NL2SP \ reload_flag \ OBJDUMP \ deplibs_check_method \ file_magic_cmd \ file_magic_glob \ want_nocaseglob \ DLLTOOL \ sharedlib_from_linklib_cmd \ AR \ AR_FLAGS \ archiver_list_spec \ STRIP \ RANLIB \ CC \ CFLAGS \ compiler \ lt_cv_sys_global_symbol_pipe \ lt_cv_sys_global_symbol_to_cdecl \ lt_cv_sys_global_symbol_to_c_name_address \ lt_cv_sys_global_symbol_to_c_name_address_lib_prefix \ nm_file_list_spec \ lt_prog_compiler_no_builtin_flag \ lt_prog_compiler_pic \ lt_prog_compiler_wl \ lt_prog_compiler_static \ lt_cv_prog_compiler_c_o \ need_locks \ MANIFEST_TOOL \ DSYMUTIL \ NMEDIT \ LIPO \ OTOOL \ OTOOL64 \ shrext_cmds \ export_dynamic_flag_spec \ whole_archive_flag_spec \ compiler_needs_object \ with_gnu_ld \ allow_undefined_flag \ no_undefined_flag \ hardcode_libdir_flag_spec \ hardcode_libdir_separator \ exclude_expsyms \ include_expsyms \ file_list_spec \ variables_saved_for_relink \ libname_spec \ library_names_spec \ soname_spec \ install_override_mode \ finish_eval \ old_striplib \ striplib \ compiler_lib_search_dirs \ predep_objects \ postdep_objects \ predeps \ postdeps \ compiler_lib_search_path \ LD_CXX \ reload_flag_CXX \ compiler_CXX \ lt_prog_compiler_no_builtin_flag_CXX \ lt_prog_compiler_pic_CXX \ lt_prog_compiler_wl_CXX \ lt_prog_compiler_static_CXX \ lt_cv_prog_compiler_c_o_CXX \ export_dynamic_flag_spec_CXX \ whole_archive_flag_spec_CXX \ compiler_needs_object_CXX \ with_gnu_ld_CXX \ allow_undefined_flag_CXX \ no_undefined_flag_CXX \ hardcode_libdir_flag_spec_CXX \ hardcode_libdir_separator_CXX \ exclude_expsyms_CXX \ include_expsyms_CXX \ file_list_spec_CXX \ compiler_lib_search_dirs_CXX \ predep_objects_CXX \ postdep_objects_CXX \ predeps_CXX \ postdeps_CXX \ compiler_lib_search_path_CXX; do case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in *[\\\\\\\`\\"\\\$]*) eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED \\"\\\$sed_quote_subst\\"\\\`\\\\\\"" ;; *) eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" ;; esac done # Double-quote double-evaled strings. for var in reload_cmds \ old_postinstall_cmds \ old_postuninstall_cmds \ old_archive_cmds \ extract_expsyms_cmds \ old_archive_from_new_cmds \ old_archive_from_expsyms_cmds \ archive_cmds \ archive_expsym_cmds \ module_cmds \ module_expsym_cmds \ export_symbols_cmds \ prelink_cmds \ postlink_cmds \ postinstall_cmds \ postuninstall_cmds \ finish_cmds \ sys_lib_search_path_spec \ sys_lib_dlsearch_path_spec \ reload_cmds_CXX \ old_archive_cmds_CXX \ old_archive_from_new_cmds_CXX \ old_archive_from_expsyms_cmds_CXX \ archive_cmds_CXX \ archive_expsym_cmds_CXX \ module_cmds_CXX \ module_expsym_cmds_CXX \ export_symbols_cmds_CXX \ prelink_cmds_CXX \ postlink_cmds_CXX; do case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in *[\\\\\\\`\\"\\\$]*) eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\"" ;; *) eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" ;; esac done ac_aux_dir='$ac_aux_dir' xsi_shell='$xsi_shell' lt_shell_append='$lt_shell_append' # See if we are running on zsh, and set the options which allow our # commands through without removal of \ escapes INIT. if test -n "\${ZSH_VERSION+set}" ; then setopt NO_GLOB_SUBST fi PACKAGE='$PACKAGE' VERSION='$VERSION' TIMESTAMP='$TIMESTAMP' RM='$RM' ofile='$ofile' _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Handling of arguments. for ac_config_target in $ac_config_targets do case $ac_config_target in "include/dibbler-config.h") CONFIG_HEADERS="$CONFIG_HEADERS include/dibbler-config.h" ;; "depfiles") CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;; "libtool") CONFIG_COMMANDS="$CONFIG_COMMANDS libtool" ;; "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; "AddrMgr/Makefile") CONFIG_FILES="$CONFIG_FILES AddrMgr/Makefile" ;; "CfgMgr/Makefile") CONFIG_FILES="$CONFIG_FILES CfgMgr/Makefile" ;; "ClntAddrMgr/Makefile") CONFIG_FILES="$CONFIG_FILES ClntAddrMgr/Makefile" ;; "ClntCfgMgr/Makefile") CONFIG_FILES="$CONFIG_FILES ClntCfgMgr/Makefile" ;; "ClntIfaceMgr/Makefile") CONFIG_FILES="$CONFIG_FILES ClntIfaceMgr/Makefile" ;; "ClntMessages/Makefile") CONFIG_FILES="$CONFIG_FILES ClntMessages/Makefile" ;; "ClntOptions/Makefile") CONFIG_FILES="$CONFIG_FILES ClntOptions/Makefile" ;; "ClntTransMgr/Makefile") CONFIG_FILES="$CONFIG_FILES ClntTransMgr/Makefile" ;; "IfaceMgr/Makefile") CONFIG_FILES="$CONFIG_FILES IfaceMgr/Makefile" ;; "Messages/Makefile") CONFIG_FILES="$CONFIG_FILES Messages/Makefile" ;; "Misc/Makefile") CONFIG_FILES="$CONFIG_FILES Misc/Makefile" ;; "Options/Makefile") CONFIG_FILES="$CONFIG_FILES Options/Makefile" ;; "RelCfgMgr/Makefile") CONFIG_FILES="$CONFIG_FILES RelCfgMgr/Makefile" ;; "RelIfaceMgr/Makefile") CONFIG_FILES="$CONFIG_FILES RelIfaceMgr/Makefile" ;; "RelMessages/Makefile") CONFIG_FILES="$CONFIG_FILES RelMessages/Makefile" ;; "RelOptions/Makefile") CONFIG_FILES="$CONFIG_FILES RelOptions/Makefile" ;; "RelTransMgr/Makefile") CONFIG_FILES="$CONFIG_FILES RelTransMgr/Makefile" ;; "Requestor/Makefile") CONFIG_FILES="$CONFIG_FILES Requestor/Makefile" ;; "SrvAddrMgr/Makefile") CONFIG_FILES="$CONFIG_FILES SrvAddrMgr/Makefile" ;; "SrvCfgMgr/Makefile") CONFIG_FILES="$CONFIG_FILES SrvCfgMgr/Makefile" ;; "SrvIfaceMgr/Makefile") CONFIG_FILES="$CONFIG_FILES SrvIfaceMgr/Makefile" ;; "SrvMessages/Makefile") CONFIG_FILES="$CONFIG_FILES SrvMessages/Makefile" ;; "SrvOptions/Makefile") CONFIG_FILES="$CONFIG_FILES SrvOptions/Makefile" ;; "SrvTransMgr/Makefile") CONFIG_FILES="$CONFIG_FILES SrvTransMgr/Makefile" ;; "poslib/Makefile") CONFIG_FILES="$CONFIG_FILES poslib/Makefile" ;; "nettle/Makefile") CONFIG_FILES="$CONFIG_FILES nettle/Makefile" ;; "$PORT_SUBDIR/Makefile") CONFIG_FILES="$CONFIG_FILES $PORT_SUBDIR/Makefile" ;; "Port-linux/Makefile") CONFIG_FILES="$CONFIG_FILES Port-linux/Makefile" ;; "Port-bsd/Makefile") CONFIG_FILES="$CONFIG_FILES Port-bsd/Makefile" ;; "Port-sun/Makefile") CONFIG_FILES="$CONFIG_FILES Port-sun/Makefile" ;; "Port-win32/Makefile") CONFIG_FILES="$CONFIG_FILES Port-win32/Makefile" ;; "Port-winnt2k/Makefile") CONFIG_FILES="$CONFIG_FILES Port-winnt2k/Makefile" ;; "doc/Makefile") CONFIG_FILES="$CONFIG_FILES doc/Makefile" ;; "Misc/Portable.h") CONFIG_FILES="$CONFIG_FILES Misc/Portable.h" ;; "doc/doxygen.cfg") CONFIG_FILES="$CONFIG_FILES doc/doxygen.cfg" ;; "doc/version.tex") CONFIG_FILES="$CONFIG_FILES doc/version.tex" ;; "AddrMgr/tests/Makefile") CONFIG_FILES="$CONFIG_FILES AddrMgr/tests/Makefile" ;; "IfaceMgr/tests/Makefile") CONFIG_FILES="$CONFIG_FILES IfaceMgr/tests/Makefile" ;; "Options/tests/Makefile") CONFIG_FILES="$CONFIG_FILES Options/tests/Makefile" ;; "SrvCfgMgr/tests/Makefile") CONFIG_FILES="$CONFIG_FILES SrvCfgMgr/tests/Makefile" ;; "CfgMgr/tests/Makefile") CONFIG_FILES="$CONFIG_FILES CfgMgr/tests/Makefile" ;; "poslib/tests/Makefile") CONFIG_FILES="$CONFIG_FILES poslib/tests/Makefile" ;; "Misc/tests/Makefile") CONFIG_FILES="$CONFIG_FILES Misc/tests/Makefile" ;; "RelTransMgr/tests/Makefile") CONFIG_FILES="$CONFIG_FILES RelTransMgr/tests/Makefile" ;; "tests/Makefile") CONFIG_FILES="$CONFIG_FILES tests/Makefile" ;; "tests/Srv/Makefile") CONFIG_FILES="$CONFIG_FILES tests/Srv/Makefile" ;; "tests/utils/Makefile") CONFIG_FILES="$CONFIG_FILES tests/utils/Makefile" ;; *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;; esac done # If the user did not use the arguments to specify the items to instantiate, # then the envvar interface is used. Set only those that are not. # We use the long form for the default assignment because of an extremely # bizarre bug on SunOS 4.1.3. if $ac_need_defaults; then test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers test "${CONFIG_COMMANDS+set}" = set || CONFIG_COMMANDS=$config_commands fi # Have a temporary directory for convenience. Make it in the build tree # simply because there is no reason against having it here, and in addition, # creating and moving files from /tmp can sometimes cause problems. # Hook for its removal unless debugging. # Note that there is a small window in which the directory will not be cleaned: # after its creation but before its name has been assigned to `$tmp'. $debug || { tmp= ac_tmp= trap 'exit_status=$? : "${ac_tmp:=$tmp}" { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status ' 0 trap 'as_fn_exit 1' 1 2 13 15 } # Create a (secure) tmp directory for tmp files. { tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && test -d "$tmp" } || { tmp=./conf$$-$RANDOM (umask 077 && mkdir "$tmp") } || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5 ac_tmp=$tmp # Set up the scripts for CONFIG_FILES section. # No need to generate them if there are no CONFIG_FILES. # This happens for instance with `./config.status config.h'. if test -n "$CONFIG_FILES"; then ac_cr=`echo X | tr X '\015'` # On cygwin, bash can eat \r inside `` if the user requested igncr. # But we know of no other shell where ac_cr would be empty at this # point, so we can use a bashism as a fallback. if test "x$ac_cr" = x; then eval ac_cr=\$\'\\r\' fi ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' /dev/null` if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then ac_cs_awk_cr='\\r' else ac_cs_awk_cr=$ac_cr fi echo 'BEGIN {' >"$ac_tmp/subs1.awk" && _ACEOF { echo "cat >conf$$subs.awk <<_ACEOF" && echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' && echo "_ACEOF" } >conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'` ac_delim='%!_!# ' for ac_last_try in false false false false false :; do . ./conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X` if test $ac_delim_n = $ac_delim_num; then break elif $ac_last_try; then as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done rm -f conf$$subs.sh cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK && _ACEOF sed -n ' h s/^/S["/; s/!.*/"]=/ p g s/^[^!]*!// :repl t repl s/'"$ac_delim"'$// t delim :nl h s/\(.\{148\}\)..*/\1/ t more1 s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/ p n b repl :more1 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t nl :delim h s/\(.\{148\}\)..*/\1/ t more2 s/["\\]/\\&/g; s/^/"/; s/$/"/ p b :more2 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t delim ' >$CONFIG_STATUS || ac_write_fail=1 rm -f conf$$subs.awk cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 _ACAWK cat >>"\$ac_tmp/subs1.awk" <<_ACAWK && for (key in S) S_is_set[key] = 1 FS = "" } { line = $ 0 nfields = split(line, field, "@") substed = 0 len = length(field[1]) for (i = 2; i < nfields; i++) { key = field[i] keylen = length(key) if (S_is_set[key]) { value = S[key] line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3) len += length(value) + length(field[++i]) substed = 1 } else len += 1 + keylen } print line } _ACAWK _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g" else cat fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \ || as_fn_error $? "could not setup config files machinery" "$LINENO" 5 _ACEOF # VPATH may cause trouble with some makes, so we remove sole $(srcdir), # ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and # trailing colons and then remove the whole line if VPATH becomes empty # (actually we leave an empty line to preserve line numbers). if test "x$srcdir" = x.; then ac_vpsub='/^[ ]*VPATH[ ]*=[ ]*/{ h s/// s/^/:/ s/[ ]*$/:/ s/:\$(srcdir):/:/g s/:\${srcdir}:/:/g s/:@srcdir@:/:/g s/^:*// s/:*$// x s/\(=[ ]*\).*/\1/ G s/\n// s/^[^=]*=[ ]*$// }' fi cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 fi # test -n "$CONFIG_FILES" # Set up the scripts for CONFIG_HEADERS section. # No need to generate them if there are no CONFIG_HEADERS. # This happens for instance with `./config.status Makefile'. if test -n "$CONFIG_HEADERS"; then cat >"$ac_tmp/defines.awk" <<\_ACAWK || BEGIN { _ACEOF # Transform confdefs.h into an awk script `defines.awk', embedded as # here-document in config.status, that substitutes the proper values into # config.h.in to produce config.h. # Create a delimiter string that does not exist in confdefs.h, to ease # handling of long lines. ac_delim='%!_!# ' for ac_last_try in false false :; do ac_tt=`sed -n "/$ac_delim/p" confdefs.h` if test -z "$ac_tt"; then break elif $ac_last_try; then as_fn_error $? "could not make $CONFIG_HEADERS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done # For the awk script, D is an array of macro values keyed by name, # likewise P contains macro parameters if any. Preserve backslash # newline sequences. ac_word_re=[_$as_cr_Letters][_$as_cr_alnum]* sed -n ' s/.\{148\}/&'"$ac_delim"'/g t rset :rset s/^[ ]*#[ ]*define[ ][ ]*/ / t def d :def s/\\$// t bsnl s/["\\]/\\&/g s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ D["\1"]=" \3"/p s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2"/p d :bsnl s/["\\]/\\&/g s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ D["\1"]=" \3\\\\\\n"\\/p t cont s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2\\\\\\n"\\/p t cont d :cont n s/.\{148\}/&'"$ac_delim"'/g t clear :clear s/\\$// t bsnlc s/["\\]/\\&/g; s/^/"/; s/$/"/p d :bsnlc s/["\\]/\\&/g; s/^/"/; s/$/\\\\\\n"\\/p b cont ' >$CONFIG_STATUS || ac_write_fail=1 cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 for (key in D) D_is_set[key] = 1 FS = "" } /^[\t ]*#[\t ]*(define|undef)[\t ]+$ac_word_re([\t (]|\$)/ { line = \$ 0 split(line, arg, " ") if (arg[1] == "#") { defundef = arg[2] mac1 = arg[3] } else { defundef = substr(arg[1], 2) mac1 = arg[2] } split(mac1, mac2, "(") #) macro = mac2[1] prefix = substr(line, 1, index(line, defundef) - 1) if (D_is_set[macro]) { # Preserve the white space surrounding the "#". print prefix "define", macro P[macro] D[macro] next } else { # Replace #undef with comments. This is necessary, for example, # in the case of _POSIX_SOURCE, which is predefined and required # on some systems where configure will not decide to define it. if (defundef == "undef") { print "/*", prefix defundef, macro, "*/" next } } } { print } _ACAWK _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 as_fn_error $? "could not setup config headers machinery" "$LINENO" 5 fi # test -n "$CONFIG_HEADERS" eval set X " :F $CONFIG_FILES :H $CONFIG_HEADERS :C $CONFIG_COMMANDS" shift for ac_tag do case $ac_tag in :[FHLC]) ac_mode=$ac_tag; continue;; esac case $ac_mode$ac_tag in :[FHL]*:*);; :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;; :[FH]-) ac_tag=-:-;; :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; esac ac_save_IFS=$IFS IFS=: set x $ac_tag IFS=$ac_save_IFS shift ac_file=$1 shift case $ac_mode in :L) ac_source=$1;; :[FH]) ac_file_inputs= for ac_f do case $ac_f in -) ac_f="$ac_tmp/stdin";; *) # Look for the file first in the build tree, then in the source tree # (if the path is not absolute). The absolute path cannot be DOS-style, # because $ac_f cannot contain `:'. test -f "$ac_f" || case $ac_f in [\\/$]*) false;; *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; esac || as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;; esac case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac as_fn_append ac_file_inputs " '$ac_f'" done # Let's still pretend it is `configure' which instantiates (i.e., don't # use $as_me), people would be surprised to read: # /* config.h. Generated by config.status. */ configure_input='Generated from '` $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' `' by configure.' if test x"$ac_file" != x-; then configure_input="$ac_file. $configure_input" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5 $as_echo "$as_me: creating $ac_file" >&6;} fi # Neutralize special characters interpreted by sed in replacement strings. case $configure_input in #( *\&* | *\|* | *\\* ) ac_sed_conf_input=`$as_echo "$configure_input" | sed 's/[\\\\&|]/\\\\&/g'`;; #( *) ac_sed_conf_input=$configure_input;; esac case $ac_tag in *:-:* | *:-) cat >"$ac_tmp/stdin" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; esac ;; esac ac_dir=`$as_dirname -- "$ac_file" || $as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$ac_file" : 'X\(//\)[^/]' \| \ X"$ac_file" : 'X\(//\)$' \| \ X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$ac_file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` as_dir="$ac_dir"; as_fn_mkdir_p ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix case $ac_mode in :F) # # CONFIG_FILE # case $INSTALL in [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;; esac ac_MKDIR_P=$MKDIR_P case $MKDIR_P in [\\/$]* | ?:[\\/]* ) ;; */*) ac_MKDIR_P=$ac_top_build_prefix$MKDIR_P ;; esac _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # If the template does not know about datarootdir, expand it. # FIXME: This hack should be removed a few years after 2.60. ac_datarootdir_hack=; ac_datarootdir_seen= ac_sed_dataroot=' /datarootdir/ { p q } /@datadir@/p /@docdir@/p /@infodir@/p /@localedir@/p /@mandir@/p' case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in *datarootdir*) ac_datarootdir_seen=yes;; *@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 $as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_datarootdir_hack=' s&@datadir@&$datadir&g s&@docdir@&$docdir&g s&@infodir@&$infodir&g s&@localedir@&$localedir&g s&@mandir@&$mandir&g s&\\\${datarootdir}&$datarootdir&g' ;; esac _ACEOF # Neutralize VPATH when `$srcdir' = `.'. # Shell code in configure.ac might set extrasub. # FIXME: do we really want to maintain this feature? cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_sed_extra="$ac_vpsub $extrasub _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 :t /@[a-zA-Z_][a-zA-Z_0-9]*@/!b s|@configure_input@|$ac_sed_conf_input|;t t s&@top_builddir@&$ac_top_builddir_sub&;t t s&@top_build_prefix@&$ac_top_build_prefix&;t t s&@srcdir@&$ac_srcdir&;t t s&@abs_srcdir@&$ac_abs_srcdir&;t t s&@top_srcdir@&$ac_top_srcdir&;t t s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t s&@builddir@&$ac_builddir&;t t s&@abs_builddir@&$ac_abs_builddir&;t t s&@abs_top_builddir@&$ac_abs_top_builddir&;t t s&@INSTALL@&$ac_INSTALL&;t t s&@MKDIR_P@&$ac_MKDIR_P&;t t $ac_datarootdir_hack " eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \ >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5 test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } && { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \ "$ac_tmp/out"`; test -z "$ac_out"; } && { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&5 $as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&2;} rm -f "$ac_tmp/stdin" case $ac_file in -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";; *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";; esac \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; :H) # # CONFIG_HEADER # if test x"$ac_file" != x-; then { $as_echo "/* $configure_input */" \ && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" } >"$ac_tmp/config.h" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 if diff "$ac_file" "$ac_tmp/config.h" >/dev/null 2>&1; then { $as_echo "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5 $as_echo "$as_me: $ac_file is unchanged" >&6;} else rm -f "$ac_file" mv "$ac_tmp/config.h" "$ac_file" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 fi else $as_echo "/* $configure_input */" \ && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" \ || as_fn_error $? "could not create -" "$LINENO" 5 fi # Compute "$ac_file"'s index in $config_headers. _am_arg="$ac_file" _am_stamp_count=1 for _am_header in $config_headers :; do case $_am_header in $_am_arg | $_am_arg:* ) break ;; * ) _am_stamp_count=`expr $_am_stamp_count + 1` ;; esac done echo "timestamp for $_am_arg" >`$as_dirname -- "$_am_arg" || $as_expr X"$_am_arg" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$_am_arg" : 'X\(//\)[^/]' \| \ X"$_am_arg" : 'X\(//\)$' \| \ X"$_am_arg" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$_am_arg" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'`/stamp-h$_am_stamp_count ;; :C) { $as_echo "$as_me:${as_lineno-$LINENO}: executing $ac_file commands" >&5 $as_echo "$as_me: executing $ac_file commands" >&6;} ;; esac case $ac_file$ac_mode in "depfiles":C) test x"$AMDEP_TRUE" != x"" || { # Older Autoconf quotes --file arguments for eval, but not when files # are listed without --file. Let's play safe and only enable the eval # if we detect the quoting. case $CONFIG_FILES in *\'*) eval set x "$CONFIG_FILES" ;; *) set x $CONFIG_FILES ;; esac shift for mf do # Strip MF so we end up with the name of the file. mf=`echo "$mf" | sed -e 's/:.*$//'` # Check whether this is an Automake generated Makefile or not. # We used to match only the files named 'Makefile.in', but # some people rename them; so instead we look at the file content. # Grep'ing the first line is not enough: some people post-process # each Makefile.in and add a new line on top of each file to say so. # Grep'ing the whole file is not good either: AIX grep has a line # limit of 2048, but all sed's we know have understand at least 4000. if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then dirpart=`$as_dirname -- "$mf" || $as_expr X"$mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$mf" : 'X\(//\)[^/]' \| \ X"$mf" : 'X\(//\)$' \| \ X"$mf" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$mf" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` else continue fi # Extract the definition of DEPDIR, am__include, and am__quote # from the Makefile without running 'make'. DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` test -z "$DEPDIR" && continue am__include=`sed -n 's/^am__include = //p' < "$mf"` test -z "$am__include" && continue am__quote=`sed -n 's/^am__quote = //p' < "$mf"` # Find all dependency output files, they are included files with # $(DEPDIR) in their names. We invoke sed twice because it is the # simplest approach to changing $(DEPDIR) to its actual value in the # expansion. for file in `sed -n " s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g'`; do # Make sure the directory exists. test -f "$dirpart/$file" && continue fdir=`$as_dirname -- "$file" || $as_expr X"$file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$file" : 'X\(//\)[^/]' \| \ X"$file" : 'X\(//\)$' \| \ X"$file" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` as_dir=$dirpart/$fdir; as_fn_mkdir_p # echo "creating $dirpart/$file" echo '# dummy' > "$dirpart/$file" done done } ;; "libtool":C) # See if we are running on zsh, and set the options which allow our # commands through without removal of \ escapes. if test -n "${ZSH_VERSION+set}" ; then setopt NO_GLOB_SUBST fi cfgfile="${ofile}T" trap "$RM \"$cfgfile\"; exit 1" 1 2 15 $RM "$cfgfile" cat <<_LT_EOF >> "$cfgfile" #! $SHELL # `$ECHO "$ofile" | sed 's%^.*/%%'` - Provide generalized library-building support services. # Generated automatically by $as_me ($PACKAGE$TIMESTAMP) $VERSION # Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: # NOTE: Changes made to this file will be lost: look at ltmain.sh. # # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, # 2006, 2007, 2008, 2009, 2010, 2011 Free Software # Foundation, Inc. # Written by Gordon Matzigkeit, 1996 # # This file is part of GNU Libtool. # # GNU Libtool is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License as # published by the Free Software Foundation; either version 2 of # the License, or (at your option) any later version. # # As a special exception to the GNU General Public License, # if you distribute this file as part of a program or library that # is built using GNU Libtool, you may include this file under the # same distribution terms that you use for the rest of that program. # # GNU Libtool is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with GNU Libtool; see the file COPYING. If not, a copy # can be downloaded from http://www.gnu.org/licenses/gpl.html, or # obtained by writing to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # The names of the tagged configurations supported by this script. available_tags="CXX " # ### BEGIN LIBTOOL CONFIG # Which release of libtool.m4 was used? macro_version=$macro_version macro_revision=$macro_revision # Whether or not to build shared libraries. build_libtool_libs=$enable_shared # Whether or not to build static libraries. build_old_libs=$enable_static # What type of objects to build. pic_mode=$pic_mode # Whether or not to optimize for fast installation. fast_install=$enable_fast_install # Shell to use when invoking shell scripts. SHELL=$lt_SHELL # An echo program that protects backslashes. ECHO=$lt_ECHO # The PATH separator for the build system. PATH_SEPARATOR=$lt_PATH_SEPARATOR # The host system. host_alias=$host_alias host=$host host_os=$host_os # The build system. build_alias=$build_alias build=$build build_os=$build_os # A sed program that does not truncate output. SED=$lt_SED # Sed that helps us avoid accidentally triggering echo(1) options like -n. Xsed="\$SED -e 1s/^X//" # A grep program that handles long lines. GREP=$lt_GREP # An ERE matcher. EGREP=$lt_EGREP # A literal string matcher. FGREP=$lt_FGREP # A BSD- or MS-compatible name lister. NM=$lt_NM # Whether we need soft or hard links. LN_S=$lt_LN_S # What is the maximum length of a command? max_cmd_len=$max_cmd_len # Object file suffix (normally "o"). objext=$ac_objext # Executable file suffix (normally ""). exeext=$exeext # whether the shell understands "unset". lt_unset=$lt_unset # turn spaces into newlines. SP2NL=$lt_lt_SP2NL # turn newlines into spaces. NL2SP=$lt_lt_NL2SP # convert \$build file names to \$host format. to_host_file_cmd=$lt_cv_to_host_file_cmd # convert \$build files to toolchain format. to_tool_file_cmd=$lt_cv_to_tool_file_cmd # An object symbol dumper. OBJDUMP=$lt_OBJDUMP # Method to check whether dependent libraries are shared objects. deplibs_check_method=$lt_deplibs_check_method # Command to use when deplibs_check_method = "file_magic". file_magic_cmd=$lt_file_magic_cmd # How to find potential files when deplibs_check_method = "file_magic". file_magic_glob=$lt_file_magic_glob # Find potential files using nocaseglob when deplibs_check_method = "file_magic". want_nocaseglob=$lt_want_nocaseglob # DLL creation program. DLLTOOL=$lt_DLLTOOL # Command to associate shared and link libraries. sharedlib_from_linklib_cmd=$lt_sharedlib_from_linklib_cmd # The archiver. AR=$lt_AR # Flags to create an archive. AR_FLAGS=$lt_AR_FLAGS # How to feed a file listing to the archiver. archiver_list_spec=$lt_archiver_list_spec # A symbol stripping program. STRIP=$lt_STRIP # Commands used to install an old-style archive. RANLIB=$lt_RANLIB old_postinstall_cmds=$lt_old_postinstall_cmds old_postuninstall_cmds=$lt_old_postuninstall_cmds # Whether to use a lock for old archive extraction. lock_old_archive_extraction=$lock_old_archive_extraction # A C compiler. LTCC=$lt_CC # LTCC compiler flags. LTCFLAGS=$lt_CFLAGS # Take the output of nm and produce a listing of raw symbols and C names. global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe # Transform the output of nm in a proper C declaration. global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl # Transform the output of nm in a C name address pair. global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address # Transform the output of nm in a C name address pair when lib prefix is needed. global_symbol_to_c_name_address_lib_prefix=$lt_lt_cv_sys_global_symbol_to_c_name_address_lib_prefix # Specify filename containing input files for \$NM. nm_file_list_spec=$lt_nm_file_list_spec # The root where to search for dependent libraries,and in which our libraries should be installed. lt_sysroot=$lt_sysroot # The name of the directory that contains temporary libtool files. objdir=$objdir # Used to examine libraries when file_magic_cmd begins with "file". MAGIC_CMD=$MAGIC_CMD # Must we lock files when doing compilation? need_locks=$lt_need_locks # Manifest tool. MANIFEST_TOOL=$lt_MANIFEST_TOOL # Tool to manipulate archived DWARF debug symbol files on Mac OS X. DSYMUTIL=$lt_DSYMUTIL # Tool to change global to local symbols on Mac OS X. NMEDIT=$lt_NMEDIT # Tool to manipulate fat objects and archives on Mac OS X. LIPO=$lt_LIPO # ldd/readelf like tool for Mach-O binaries on Mac OS X. OTOOL=$lt_OTOOL # ldd/readelf like tool for 64 bit Mach-O binaries on Mac OS X 10.4. OTOOL64=$lt_OTOOL64 # Old archive suffix (normally "a"). libext=$libext # Shared library suffix (normally ".so"). shrext_cmds=$lt_shrext_cmds # The commands to extract the exported symbol list from a shared archive. extract_expsyms_cmds=$lt_extract_expsyms_cmds # Variables whose values should be saved in libtool wrapper scripts and # restored at link time. variables_saved_for_relink=$lt_variables_saved_for_relink # Do we need the "lib" prefix for modules? need_lib_prefix=$need_lib_prefix # Do we need a version for libraries? need_version=$need_version # Library versioning type. version_type=$version_type # Shared library runtime path variable. runpath_var=$runpath_var # Shared library path variable. shlibpath_var=$shlibpath_var # Is shlibpath searched before the hard-coded library search path? shlibpath_overrides_runpath=$shlibpath_overrides_runpath # Format of library name prefix. libname_spec=$lt_libname_spec # List of archive names. First name is the real one, the rest are links. # The last name is the one that the linker finds with -lNAME library_names_spec=$lt_library_names_spec # The coded name of the library, if different from the real name. soname_spec=$lt_soname_spec # Permission mode override for installation of shared libraries. install_override_mode=$lt_install_override_mode # Command to use after installation of a shared archive. postinstall_cmds=$lt_postinstall_cmds # Command to use after uninstallation of a shared archive. postuninstall_cmds=$lt_postuninstall_cmds # Commands used to finish a libtool library installation in a directory. finish_cmds=$lt_finish_cmds # As "finish_cmds", except a single script fragment to be evaled but # not shown. finish_eval=$lt_finish_eval # Whether we should hardcode library paths into libraries. hardcode_into_libs=$hardcode_into_libs # Compile-time system search path for libraries. sys_lib_search_path_spec=$lt_sys_lib_search_path_spec # Run-time system search path for libraries. sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec # Whether dlopen is supported. dlopen_support=$enable_dlopen # Whether dlopen of programs is supported. dlopen_self=$enable_dlopen_self # Whether dlopen of statically linked programs is supported. dlopen_self_static=$enable_dlopen_self_static # Commands to strip libraries. old_striplib=$lt_old_striplib striplib=$lt_striplib # The linker used to build libraries. LD=$lt_LD # How to create reloadable object files. reload_flag=$lt_reload_flag reload_cmds=$lt_reload_cmds # Commands used to build an old-style archive. old_archive_cmds=$lt_old_archive_cmds # A language specific compiler. CC=$lt_compiler # Is the compiler the GNU compiler? with_gcc=$GCC # Compiler flag to turn off builtin functions. no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag # Additional compiler flags for building library objects. pic_flag=$lt_lt_prog_compiler_pic # How to pass a linker flag through the compiler. wl=$lt_lt_prog_compiler_wl # Compiler flag to prevent dynamic linking. link_static_flag=$lt_lt_prog_compiler_static # Does compiler simultaneously support -c and -o options? compiler_c_o=$lt_lt_cv_prog_compiler_c_o # Whether or not to add -lc for building shared libraries. build_libtool_need_lc=$archive_cmds_need_lc # Whether or not to disallow shared libs when runtime libs are static. allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes # Compiler flag to allow reflexive dlopens. export_dynamic_flag_spec=$lt_export_dynamic_flag_spec # Compiler flag to generate shared objects directly from archives. whole_archive_flag_spec=$lt_whole_archive_flag_spec # Whether the compiler copes with passing no objects directly. compiler_needs_object=$lt_compiler_needs_object # Create an old-style archive from a shared archive. old_archive_from_new_cmds=$lt_old_archive_from_new_cmds # Create a temporary old-style archive to link instead of a shared archive. old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds # Commands used to build a shared archive. archive_cmds=$lt_archive_cmds archive_expsym_cmds=$lt_archive_expsym_cmds # Commands used to build a loadable module if different from building # a shared archive. module_cmds=$lt_module_cmds module_expsym_cmds=$lt_module_expsym_cmds # Whether we are building with GNU ld or not. with_gnu_ld=$lt_with_gnu_ld # Flag that allows shared libraries with undefined symbols to be built. allow_undefined_flag=$lt_allow_undefined_flag # Flag that enforces no undefined symbols. no_undefined_flag=$lt_no_undefined_flag # Flag to hardcode \$libdir into a binary during linking. # This must work even if \$libdir does not exist hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec # Whether we need a single "-rpath" flag with a separated argument. hardcode_libdir_separator=$lt_hardcode_libdir_separator # Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes # DIR into the resulting binary. hardcode_direct=$hardcode_direct # Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes # DIR into the resulting binary and the resulting library dependency is # "absolute",i.e impossible to change by setting \${shlibpath_var} if the # library is relocated. hardcode_direct_absolute=$hardcode_direct_absolute # Set to "yes" if using the -LDIR flag during linking hardcodes DIR # into the resulting binary. hardcode_minus_L=$hardcode_minus_L # Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR # into the resulting binary. hardcode_shlibpath_var=$hardcode_shlibpath_var # Set to "yes" if building a shared library automatically hardcodes DIR # into the library and all subsequent libraries and executables linked # against it. hardcode_automatic=$hardcode_automatic # Set to yes if linker adds runtime paths of dependent libraries # to runtime path list. inherit_rpath=$inherit_rpath # Whether libtool must link a program against all its dependency libraries. link_all_deplibs=$link_all_deplibs # Set to "yes" if exported symbols are required. always_export_symbols=$always_export_symbols # The commands to list exported symbols. export_symbols_cmds=$lt_export_symbols_cmds # Symbols that should not be listed in the preloaded symbols. exclude_expsyms=$lt_exclude_expsyms # Symbols that must always be exported. include_expsyms=$lt_include_expsyms # Commands necessary for linking programs (against libraries) with templates. prelink_cmds=$lt_prelink_cmds # Commands necessary for finishing linking programs. postlink_cmds=$lt_postlink_cmds # Specify filename containing input files. file_list_spec=$lt_file_list_spec # How to hardcode a shared library path into an executable. hardcode_action=$hardcode_action # The directories searched by this compiler when creating a shared library. compiler_lib_search_dirs=$lt_compiler_lib_search_dirs # Dependencies to place before and after the objects being linked to # create a shared library. predep_objects=$lt_predep_objects postdep_objects=$lt_postdep_objects predeps=$lt_predeps postdeps=$lt_postdeps # The library search path used internally by the compiler when linking # a shared library. compiler_lib_search_path=$lt_compiler_lib_search_path # ### END LIBTOOL CONFIG _LT_EOF case $host_os in aix3*) cat <<\_LT_EOF >> "$cfgfile" # AIX sometimes has problems with the GCC collect2 program. For some # reason, if we set the COLLECT_NAMES environment variable, the problems # vanish in a puff of smoke. if test "X${COLLECT_NAMES+set}" != Xset; then COLLECT_NAMES= export COLLECT_NAMES fi _LT_EOF ;; esac ltmain="$ac_aux_dir/ltmain.sh" # We use sed instead of cat because bash on DJGPP gets confused if # if finds mixed CR/LF and LF-only lines. Since sed operates in # text mode, it properly converts lines to CR/LF. This bash problem # is reportedly fixed, but why not run on old versions too? sed '$q' "$ltmain" >> "$cfgfile" \ || (rm -f "$cfgfile"; exit 1) if test x"$xsi_shell" = xyes; then sed -e '/^func_dirname ()$/,/^} # func_dirname /c\ func_dirname ()\ {\ \ case ${1} in\ \ */*) func_dirname_result="${1%/*}${2}" ;;\ \ * ) func_dirname_result="${3}" ;;\ \ esac\ } # Extended-shell func_dirname implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: sed -e '/^func_basename ()$/,/^} # func_basename /c\ func_basename ()\ {\ \ func_basename_result="${1##*/}"\ } # Extended-shell func_basename implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: sed -e '/^func_dirname_and_basename ()$/,/^} # func_dirname_and_basename /c\ func_dirname_and_basename ()\ {\ \ case ${1} in\ \ */*) func_dirname_result="${1%/*}${2}" ;;\ \ * ) func_dirname_result="${3}" ;;\ \ esac\ \ func_basename_result="${1##*/}"\ } # Extended-shell func_dirname_and_basename implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: sed -e '/^func_stripname ()$/,/^} # func_stripname /c\ func_stripname ()\ {\ \ # pdksh 5.2.14 does not do ${X%$Y} correctly if both X and Y are\ \ # positional parameters, so assign one to ordinary parameter first.\ \ func_stripname_result=${3}\ \ func_stripname_result=${func_stripname_result#"${1}"}\ \ func_stripname_result=${func_stripname_result%"${2}"}\ } # Extended-shell func_stripname implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: sed -e '/^func_split_long_opt ()$/,/^} # func_split_long_opt /c\ func_split_long_opt ()\ {\ \ func_split_long_opt_name=${1%%=*}\ \ func_split_long_opt_arg=${1#*=}\ } # Extended-shell func_split_long_opt implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: sed -e '/^func_split_short_opt ()$/,/^} # func_split_short_opt /c\ func_split_short_opt ()\ {\ \ func_split_short_opt_arg=${1#??}\ \ func_split_short_opt_name=${1%"$func_split_short_opt_arg"}\ } # Extended-shell func_split_short_opt implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: sed -e '/^func_lo2o ()$/,/^} # func_lo2o /c\ func_lo2o ()\ {\ \ case ${1} in\ \ *.lo) func_lo2o_result=${1%.lo}.${objext} ;;\ \ *) func_lo2o_result=${1} ;;\ \ esac\ } # Extended-shell func_lo2o implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: sed -e '/^func_xform ()$/,/^} # func_xform /c\ func_xform ()\ {\ func_xform_result=${1%.*}.lo\ } # Extended-shell func_xform implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: sed -e '/^func_arith ()$/,/^} # func_arith /c\ func_arith ()\ {\ func_arith_result=$(( $* ))\ } # Extended-shell func_arith implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: sed -e '/^func_len ()$/,/^} # func_len /c\ func_len ()\ {\ func_len_result=${#1}\ } # Extended-shell func_len implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: fi if test x"$lt_shell_append" = xyes; then sed -e '/^func_append ()$/,/^} # func_append /c\ func_append ()\ {\ eval "${1}+=\\${2}"\ } # Extended-shell func_append implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: sed -e '/^func_append_quoted ()$/,/^} # func_append_quoted /c\ func_append_quoted ()\ {\ \ func_quote_for_eval "${2}"\ \ eval "${1}+=\\\\ \\$func_quote_for_eval_result"\ } # Extended-shell func_append_quoted implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: # Save a `func_append' function call where possible by direct use of '+=' sed -e 's%func_append \([a-zA-Z_]\{1,\}\) "%\1+="%g' $cfgfile > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: else # Save a `func_append' function call even when '+=' is not available sed -e 's%func_append \([a-zA-Z_]\{1,\}\) "%\1="$\1%g' $cfgfile > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: fi if test x"$_lt_function_replace_fail" = x":"; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Unable to substitute extended shell functions in $ofile" >&5 $as_echo "$as_me: WARNING: Unable to substitute extended shell functions in $ofile" >&2;} fi mv -f "$cfgfile" "$ofile" || (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile") chmod +x "$ofile" cat <<_LT_EOF >> "$ofile" # ### BEGIN LIBTOOL TAG CONFIG: CXX # The linker used to build libraries. LD=$lt_LD_CXX # How to create reloadable object files. reload_flag=$lt_reload_flag_CXX reload_cmds=$lt_reload_cmds_CXX # Commands used to build an old-style archive. old_archive_cmds=$lt_old_archive_cmds_CXX # A language specific compiler. CC=$lt_compiler_CXX # Is the compiler the GNU compiler? with_gcc=$GCC_CXX # Compiler flag to turn off builtin functions. no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag_CXX # Additional compiler flags for building library objects. pic_flag=$lt_lt_prog_compiler_pic_CXX # How to pass a linker flag through the compiler. wl=$lt_lt_prog_compiler_wl_CXX # Compiler flag to prevent dynamic linking. link_static_flag=$lt_lt_prog_compiler_static_CXX # Does compiler simultaneously support -c and -o options? compiler_c_o=$lt_lt_cv_prog_compiler_c_o_CXX # Whether or not to add -lc for building shared libraries. build_libtool_need_lc=$archive_cmds_need_lc_CXX # Whether or not to disallow shared libs when runtime libs are static. allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes_CXX # Compiler flag to allow reflexive dlopens. export_dynamic_flag_spec=$lt_export_dynamic_flag_spec_CXX # Compiler flag to generate shared objects directly from archives. whole_archive_flag_spec=$lt_whole_archive_flag_spec_CXX # Whether the compiler copes with passing no objects directly. compiler_needs_object=$lt_compiler_needs_object_CXX # Create an old-style archive from a shared archive. old_archive_from_new_cmds=$lt_old_archive_from_new_cmds_CXX # Create a temporary old-style archive to link instead of a shared archive. old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds_CXX # Commands used to build a shared archive. archive_cmds=$lt_archive_cmds_CXX archive_expsym_cmds=$lt_archive_expsym_cmds_CXX # Commands used to build a loadable module if different from building # a shared archive. module_cmds=$lt_module_cmds_CXX module_expsym_cmds=$lt_module_expsym_cmds_CXX # Whether we are building with GNU ld or not. with_gnu_ld=$lt_with_gnu_ld_CXX # Flag that allows shared libraries with undefined symbols to be built. allow_undefined_flag=$lt_allow_undefined_flag_CXX # Flag that enforces no undefined symbols. no_undefined_flag=$lt_no_undefined_flag_CXX # Flag to hardcode \$libdir into a binary during linking. # This must work even if \$libdir does not exist hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec_CXX # Whether we need a single "-rpath" flag with a separated argument. hardcode_libdir_separator=$lt_hardcode_libdir_separator_CXX # Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes # DIR into the resulting binary. hardcode_direct=$hardcode_direct_CXX # Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes # DIR into the resulting binary and the resulting library dependency is # "absolute",i.e impossible to change by setting \${shlibpath_var} if the # library is relocated. hardcode_direct_absolute=$hardcode_direct_absolute_CXX # Set to "yes" if using the -LDIR flag during linking hardcodes DIR # into the resulting binary. hardcode_minus_L=$hardcode_minus_L_CXX # Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR # into the resulting binary. hardcode_shlibpath_var=$hardcode_shlibpath_var_CXX # Set to "yes" if building a shared library automatically hardcodes DIR # into the library and all subsequent libraries and executables linked # against it. hardcode_automatic=$hardcode_automatic_CXX # Set to yes if linker adds runtime paths of dependent libraries # to runtime path list. inherit_rpath=$inherit_rpath_CXX # Whether libtool must link a program against all its dependency libraries. link_all_deplibs=$link_all_deplibs_CXX # Set to "yes" if exported symbols are required. always_export_symbols=$always_export_symbols_CXX # The commands to list exported symbols. export_symbols_cmds=$lt_export_symbols_cmds_CXX # Symbols that should not be listed in the preloaded symbols. exclude_expsyms=$lt_exclude_expsyms_CXX # Symbols that must always be exported. include_expsyms=$lt_include_expsyms_CXX # Commands necessary for linking programs (against libraries) with templates. prelink_cmds=$lt_prelink_cmds_CXX # Commands necessary for finishing linking programs. postlink_cmds=$lt_postlink_cmds_CXX # Specify filename containing input files. file_list_spec=$lt_file_list_spec_CXX # How to hardcode a shared library path into an executable. hardcode_action=$hardcode_action_CXX # The directories searched by this compiler when creating a shared library. compiler_lib_search_dirs=$lt_compiler_lib_search_dirs_CXX # Dependencies to place before and after the objects being linked to # create a shared library. predep_objects=$lt_predep_objects_CXX postdep_objects=$lt_postdep_objects_CXX predeps=$lt_predeps_CXX postdeps=$lt_postdeps_CXX # The library search path used internally by the compiler when linking # a shared library. compiler_lib_search_path=$lt_compiler_lib_search_path_CXX # ### END LIBTOOL TAG CONFIG: CXX _LT_EOF ;; esac done # for ac_tag as_fn_exit 0 _ACEOF ac_clean_files=$ac_clean_files_save test $ac_write_fail = 0 || as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5 # configure is writing to config.log, and then calls config.status. # config.status does its own redirection, appending to config.log. # Unfortunately, on DOS this fails, as config.log is still kept open # by configure, so config.status won't be able to write to it; its # output is simply discarded. So we exec the FD to /dev/null, # effectively closing config.log, so it can be properly (re)opened and # appended to by config.status. When coming back to configure, we # need to make the FD available again. if test "$no_create" != yes; then ac_cs_success=: ac_config_status_args= test "$silent" = yes && ac_config_status_args="$ac_config_status_args --quiet" exec 5>/dev/null $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false exec 5>>config.log # Use ||, not &&, to avoid exiting from the if with $? = 1, which # would make configure fail if this is the last instruction. $ac_cs_success || as_fn_exit 1 fi # # CONFIG_SUBDIRS section. # if test "$no_recursion" != yes; then # Remove --cache-file, --srcdir, and --disable-option-checking arguments # so they do not pile up. ac_sub_configure_args= ac_prev= eval "set x $ac_configure_args" shift for ac_arg do if test -n "$ac_prev"; then ac_prev= continue fi case $ac_arg in -cache-file | --cache-file | --cache-fil | --cache-fi \ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) ac_prev=cache_file ;; -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* \ | --c=*) ;; --config-cache | -C) ;; -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) ac_prev=srcdir ;; -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) ;; -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) ac_prev=prefix ;; -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) ;; --disable-option-checking) ;; *) case $ac_arg in *\'*) ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; esac as_fn_append ac_sub_configure_args " '$ac_arg'" ;; esac done # Always prepend --prefix to ensure using the same prefix # in subdir configurations. ac_arg="--prefix=$prefix" case $ac_arg in *\'*) ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; esac ac_sub_configure_args="'$ac_arg' $ac_sub_configure_args" # Pass --silent if test "$silent" = yes; then ac_sub_configure_args="--silent $ac_sub_configure_args" fi # Always prepend --disable-option-checking to silence warnings, since # different subdirs can have different --enable and --with options. ac_sub_configure_args="--disable-option-checking $ac_sub_configure_args" ac_popdir=`pwd` for ac_dir in : $subdirs; do test "x$ac_dir" = x: && continue # Do not complain, so a configure script can configure whichever # parts of a large source tree are present. test -d "$srcdir/$ac_dir" || continue ac_msg="=== configuring in $ac_dir (`pwd`/$ac_dir)" $as_echo "$as_me:${as_lineno-$LINENO}: $ac_msg" >&5 $as_echo "$ac_msg" >&6 as_dir="$ac_dir"; as_fn_mkdir_p ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix cd "$ac_dir" # Check for guested configure; otherwise get Cygnus style configure. if test -f "$ac_srcdir/configure.gnu"; then ac_sub_configure=$ac_srcdir/configure.gnu elif test -f "$ac_srcdir/configure"; then ac_sub_configure=$ac_srcdir/configure elif test -f "$ac_srcdir/configure.in"; then # This should be Cygnus configure. ac_sub_configure=$ac_aux_dir/configure else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: no configuration information is in $ac_dir" >&5 $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2;} ac_sub_configure= fi # The recursion is here. if test -n "$ac_sub_configure"; then # Make the cache file name correct relative to the subdirectory. case $cache_file in [\\/]* | ?:[\\/]* ) ac_sub_cache_file=$cache_file ;; *) # Relative name. ac_sub_cache_file=$ac_top_build_prefix$cache_file ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: running $SHELL $ac_sub_configure $ac_sub_configure_args --cache-file=$ac_sub_cache_file --srcdir=$ac_srcdir" >&5 $as_echo "$as_me: running $SHELL $ac_sub_configure $ac_sub_configure_args --cache-file=$ac_sub_cache_file --srcdir=$ac_srcdir" >&6;} # The eval makes quoting arguments work. eval "\$SHELL \"\$ac_sub_configure\" $ac_sub_configure_args \ --cache-file=\"\$ac_sub_cache_file\" --srcdir=\"\$ac_srcdir\"" || as_fn_error $? "$ac_sub_configure failed for $ac_dir" "$LINENO" 5 fi cd "$ac_popdir" done fi if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} fi echo echo "Dibbler version : $PACKAGE_VERSION" echo "Selected OS port : $PORT_SUBDIR" echo "Actual OS : $system $s_version" echo "Debug : $debug" echo "Electric fence : $efence" echo "Socket bind reuse : $MOD_CLNT_BIND_REUSE" echo "DNS Update (clnt/srv) disabled: $MOD_CLNT_DISABLE_DNSUPDATE/$MOD_SRV_DISABLE_DNSUPDATE" echo "Authentication disabled : $MOD_DISABLE_AUTH" echo "Link-state change detection : $MOD_CLNT_CONFIRM" echo "/sbin/resolvconf support : $MOD_RESOLVCONF" echo echo "Experimental features:" echo "Remote autoconfigution : $MOD_REMOTE_AUTOCONF" echo echo "CFLAGS : $CFLAGS" echo "CPPFLAGS : $CPPFLAGS" echo "CXXFLAGS : $CXXFLAGS" echo "LDFLAGS : $LDFLAGS" echo echo "Google test : $gtest_path" if test "$gtest_path" != "no" then echo "GTEST_INCLUDES : $GTEST_INCLUDES" echo "GTEST_LDFLAGS : $GTEST_LDFLAGS" echo "GTEST_LDADD : $GTEST_LDADD" echo fi echo Type make to compile dibbler. echo dibbler-1.0.1/ClntOptions/0000775000175000017500000000000012561700421012371 500000000000000dibbler-1.0.1/ClntOptions/ClntOptTimeZone.cpp0000644000175000017500000000274612420536032016061 00000000000000/* * Dibbler - a portable DHCPv6 * * authors: Tomasz Mrugalski * Marek Senderski * * released under GNU GPL v2 licence */ #include "ClntOptTimeZone.h" #include "OptDUID.h" #include "ClntMsg.h" #include "Logger.h" TClntOptTimeZone::TClntOptTimeZone(const std::string& domain, TMsg* parent) :TOptString(OPTION_NEW_TZDB_TIMEZONE, domain, parent) { } TClntOptTimeZone::TClntOptTimeZone(char *buf, int bufsize, TMsg* parent) :TOptString(OPTION_NEW_TZDB_TIMEZONE, buf,bufsize, parent) { /// @todo: do some validity check } bool TClntOptTimeZone::isValid() const { /// @todo: check is somehow return true; } bool TClntOptTimeZone::doDuties() { std::string reason = "trying to set time zone."; int ifindex = Parent->getIface(); SPtr duid = (Ptr*)Parent->getOption(OPTION_SERVERID); if (!duid) { Log(Error) << "Unable to find proper DUID while " << reason << LogEnd; return false; } SPtr iface = (Ptr*)ClntIfaceMgr().getIfaceByID(ifindex); if (!iface) { Log(Error) << "Unable to find interface ifindex=" << ifindex << reason << LogEnd; return false; } SPtr cfgIface = ClntCfgMgr().getIface(ifindex); cfgIface->setTimezoneState(STATE_CONFIGURED); return iface->setTimezone(duid->getDUID(), Parent->getRemoteAddr(), Str); } /// @todo remove this void TClntOptTimeZone::setSrvDuid(SPtr duid) { SrvDUID=duid; } dibbler-1.0.1/ClntOptions/ClntOptAddrParams.h0000664000175000017500000000074412233256142016013 00000000000000/* * Dibbler - a portable DHCPv6 * * authors: Tomasz Mrugalski * * released under GNU GPL v2 only licence * * $Id: ClntOptAddrParams.h,v 1.3 2008-08-29 00:07:28 thomson Exp $ * */ #ifndef CLNTOPTADDRPARAMS_H #define CLNTOPTADDRPARAMS_H #include "OptInteger.h" class TClntOptAddrParams : public TOptInteger { public: TClntOptAddrParams(char * buf, int n, TMsg* parent); int getPrefix(); int getBitfield(); bool doDuties(); }; #endif dibbler-1.0.1/ClntOptions/ClntOptLifetime.cpp0000644000175000017500000000267712420536023016070 00000000000000/* * Dibbler - a portable DHCPv6 * * authors: Tomasz Mrugalski * Marek Senderski * * released under GNU GPL v2 only licence * */ #include "DHCPConst.h" #include "ClntOptLifetime.h" #include "OptDUID.h" #include "ClntMsg.h" #include "Logger.h" using namespace std; TClntOptLifetime::TClntOptLifetime(char * buf, int n, TMsg* parent) :TOptInteger(OPTION_INFORMATION_REFRESH_TIME, OPTION_INFORMATION_REFRESH_TIME_LEN, buf,n, parent){ } TClntOptLifetime::TClntOptLifetime( char pref, TMsg* parent) :TOptInteger(OPTION_INFORMATION_REFRESH_TIME, OPTION_INFORMATION_REFRESH_TIME_LEN, pref, parent) { } bool TClntOptLifetime::doDuties() { string reason = "trying to set Lifetime timer."; if (!Parent) { Log(Error) << "Unable to set lifetime: option parent not set." << LogEnd; return false; } int ifindex = Parent->getIface(); SPtr duid = (Ptr*)Parent->getOption(OPTION_SERVERID); if (!duid) { Log(Error) << "Unable to find proper DUID while " << reason << LogEnd; return false; } SPtr iface = (Ptr*)ClntIfaceMgr().getIfaceByID(ifindex); if (!iface) { Log(Error) << "Unable to find interface ifindex=" << ifindex << reason << LogEnd; return false; } SPtr cfgIface = ClntCfgMgr().getIface(ifindex); return iface->setLifetime(duid->getDUID(), Parent->getRemoteAddr(), Value); } dibbler-1.0.1/ClntOptions/ClntOptIA_NA.cpp0000644000175000017500000003227412304040124015166 00000000000000/* * Dibbler - a portable DHCPv6 * * authors: Tomasz Mrugalski * Marek Senderski * * released under GNU GPL v2 only licence * */ #include "AddrIA.h" #include "ClntCfgIA.h" #include "ClntOptIA_NA.h" #include "ClntOptIAAddress.h" #include "ClntOptStatusCode.h" #include "ClntOptAddrParams.h" #include "Logger.h" #include "Msg.h" #include "ClntAddrMgr.h" #include "ClntIfaceMgr.h" /** * Used in CONFIRM constructor * * @param clntAddrIA * @param zeroTimes * @param parent */ TClntOptIA_NA::TClntOptIA_NA(SPtr clntAddrIA, bool zeroTimes, TMsg* parent) :TOptIA_NA(clntAddrIA->getIAID(), zeroTimes?0:clntAddrIA->getT1(), zeroTimes?0:clntAddrIA->getT2(), parent), Iface_(0) { SPtr addr; clntAddrIA->firstAddr(); while ( addr = clntAddrIA->getAddr() ) { SubOptions.append( new TClntOptIAAddress(addr->get(), zeroTimes?0:addr->getPref(), zeroTimes?0:addr->getValid(), parent) ); } } /** * Used in DECLINE, RENEW and RELEASE * * @param addrIA * @param parent */ TClntOptIA_NA::TClntOptIA_NA(SPtr addrIA, TMsg* parent) :TOptIA_NA(addrIA->getIAID(),addrIA->getT1(),addrIA->getT2(), parent) { // should we include all addrs or tentative ones only? bool decline; if (parent->getType()==DECLINE_MSG) decline = true; else decline = false; bool zeroTimes = false; if ( (parent->getType()==RELEASE_MSG) || (parent->getType()==DECLINE_MSG)) { T1_ = 0; T2_ = 0; zeroTimes = true; } SPtr ptrAddr; addrIA->firstAddr(); while ( ptrAddr = addrIA->getAddr() ) { if ( !decline || (ptrAddr->getTentative()==ADDRSTATUS_YES) ) SubOptions.append(new TClntOptIAAddress(ptrAddr->get(), zeroTimes?0:ptrAddr->getPref(), zeroTimes?0:ptrAddr->getValid(),this->Parent) ); } DUID = SPtr(); // NULL } /** * Used in REQUEST constructor * * @param ClntCfgIA * @param ClntaddrIA * @param parent */ TClntOptIA_NA::TClntOptIA_NA(SPtr ClntCfgIA, SPtr ClntaddrIA, TMsg* parent) :TOptIA_NA(ClntaddrIA->getIAID(),ClntaddrIA->getT1(),ClntaddrIA->getT2(), parent) { //checkRequestConstructor ClntCfgIA->firstAddr(); SPtr ClntCfgAddr; /// @todo: keep allocated address in TAddrClient while ((ClntCfgAddr = ClntCfgIA->getAddr())&& ((ClntCfgIA->countAddr()-ClntaddrIA->countAddr())>this->countAddr() )) { SPtr ptrAddr=ClntaddrIA->getAddr(ClntCfgAddr->get()); if(!ptrAddr) SubOptions.append(new TClntOptIAAddress( ClntCfgAddr->get(), ClntCfgAddr->getPref(), ClntCfgAddr->getValid(), this->Parent)); } DUID = SPtr(); // NULL } /** * Used in SOLICIT constructor * * @param ClntCfgIA * @param parent */ TClntOptIA_NA::TClntOptIA_NA(SPtr ClntCfgIA, TMsg* parent) :TOptIA_NA(ClntCfgIA->getIAID(),ClntCfgIA->getT1(),ClntCfgIA->getT2(), parent) { ClntCfgIA->firstAddr(); SPtr ClntCfgAddr; // just copy all addresses defined in the CfgMgr while (ClntCfgAddr = ClntCfgIA->getAddr()) SubOptions.append(new TClntOptIAAddress(ClntCfgAddr->get(), ClntCfgAddr->getPref(), ClntCfgAddr->getValid(),this->Parent) ); DUID = SPtr(); // NULL } /** * Used to create object from received message * * @param buf * @param bufsize * @param parent */ TClntOptIA_NA::TClntOptIA_NA(char * buf,int bufsize, TMsg* parent) :TOptIA_NA(buf,bufsize, parent) { int pos=0; while(posbufsize) { Log(Warning) << "Truncated IA_NA option received." << LogEnd; return; } int code=buf[pos]*256+buf[pos+1]; pos+=2; int length=buf[pos]*256+buf[pos+1]; pos+=2; if ((code>0)&&(code<=24)) { if(allowOptInOpt(parent->getType(),OPTION_IA_NA,code)) { switch (code) { case OPTION_IAADDR: SubOptions.append( new TClntOptIAAddress(buf+pos,length,this->Parent)); break; case OPTION_STATUS_CODE: SubOptions.append( new TClntOptStatusCode(buf+pos,length,this->Parent)); break; default: Log(Warning) <<"Option opttype=" << code<< "not supported " <<" in field of message (type="<< parent->getType() <<") in this version of server."< TClntOptIA_NA::getAddr() { SPtr ptr; do { ptr = (Ptr*) SubOptions.get(); if (ptr) if (ptr->getOptType()==OPTION_IAADDR) return ptr; } while (ptr); return SPtr(); } int TClntOptIA_NA::countAddr() { SPtr< TOpt> ptr; SubOptions.first(); int count = 0; while ( ptr = SubOptions.get() ) { if (ptr->getOptType() == OPTION_IAADDR) count++; } return count; } int TClntOptIA_NA::getStatusCode() { SPtr option; if (option=getOption(OPTION_STATUS_CODE)) { SPtr statOpt=(Ptr*) option; return statOpt->getCode(); } return STATUSCODE_SUCCESS; } void TClntOptIA_NA::setContext(SPtr srvDuid, SPtr srvAddr, int iface) { DUID = srvDuid; Addr = srvAddr; Iface_ = iface; } TClntOptIA_NA::~TClntOptIA_NA() { } bool TClntOptIA_NA::doDuties() { // find this IA in addrMgr... SPtr ptrIA=ClntAddrMgr().getIA(this->getIAID()); if (!ptrIA) { // unknown IAID, ignore it Log(Warning) << "Received message contains unknown IA (IAID=" << this->getIAID() << "). We didn't order it. Weird... ignoring it." << LogEnd; return true; } // IAID found, set up new received options. SPtr ptrAddrAddr; SPtr ptrOptAddr; SPtr ptrIface; ptrIface = ClntIfaceMgr().getIfaceByID(Iface_); if (!ptrIface) { Log(Error) << "Interface with ifindex=" << Iface_ << " not found." << LogEnd; return true; } // for each address in IA option... this->firstAddr(); while (ptrOptAddr = this->getAddr() ) { ptrAddrAddr = ptrIA->getAddr( ptrOptAddr->getAddr() ); // no such address in DB ?? if (!ptrAddrAddr) { if (ptrOptAddr->getValid()) { int prefixLen = ptrIface->getPrefixLength(); if (ptrOptAddr->getOption(OPTION_ADDRPARAMS)) { Log(Debug) << "Experimental addr-params found." << LogEnd; SPtr optAddrParams = (Ptr*) ptrOptAddr->getOption(OPTION_ADDRPARAMS); prefixLen = optAddrParams->getPrefix(); } // add this address in addrDB... ptrIA->addAddr(ptrOptAddr->getAddr(), ptrOptAddr->getPref(), ptrOptAddr->getValid(), prefixLen); ptrIA->setDUID(this->DUID); // ... and in IfaceMgr - ptrIface->addAddr(ptrOptAddr->getAddr(), ptrOptAddr->getPref(), ptrOptAddr->getValid(), prefixLen); } else { Log(Warning) << "Server send new addr with valid lifetime 0." << LogEnd; } } else { // we have this addr in DB if ( ptrOptAddr->getValid() == 0 ) { // valid=0, release this address // delete address from addrDB ptrIA->delAddr(ptrOptAddr->getAddr()); // delete address from IfaceMgr ptrIface->delAddr(ptrOptAddr->getAddr(), ptrIface->getPrefixLength()); break; // analyze next option OPTION_IA_NA } // set up new options in IfaceMgr SPtr ptrIface = ClntIfaceMgr().getIfaceByID(Iface_); if (ptrIface) ptrIface->updateAddr(ptrOptAddr->getAddr(), ptrOptAddr->getPref(), ptrOptAddr->getValid()); // set up new options in addrDB ptrAddrAddr->setPref(ptrOptAddr->getPref()); ptrAddrAddr->setValid(ptrOptAddr->getValid()); ptrAddrAddr->setTimestamp(); } } SPtr ptrCfgIA; ptrCfgIA=ClntCfgMgr().getIA(ptrIA->getIAID()); if (getT1() && getT2()) { ptrIA->setT1( this->getT1() ); ptrIA->setT2( this->getT2() ); Log(Debug) << "RENEW(IA_NA) will be sent (T1) after " << ptrIA->getT1() << ", REBIND (T2) after " << ptrIA->getT2() << " seconds." << LogEnd; } else { this->firstAddr(); ptrOptAddr = this->getAddr(); if (ptrOptAddr) { ptrIA->setT1( ptrOptAddr->getPref()/2); ptrIA->setT2( (int)((ptrOptAddr->getPref())*0.7) ); Log(Notice) << "Server set T1 and T2 to 0. Choosing default (50%, " << "70% * prefered-lifetime): T1=" << ptrIA->getT1() << ", T2=" << ptrIA->getT2() << LogEnd; } } ptrIA->setTimestamp(); ptrIA->setState(STATE_CONFIGURED); ptrCfgIA->setState(STATE_CONFIGURED); return true; } //Counts all valid and diffrent addresses in sum of //addresses received in IA from server and addresses contained //in its counterpart IA in address manager int TClntOptIA_NA::countValidAddrs(SPtr ptrIA) { int count=0; //Counts addresses not received in Reply message //but which are in addrDB, and are still valid (valid>0) SPtr ptrAddr; ptrIA->firstAddr(); //For each addr in DB for this IA while(ptrAddr = ptrIA->getAddr()) { //If addr is still valid if (!ptrAddr->getValid()) continue; //and is not included in received option if (!this->getAddr(ptrAddr->get())) //we can increase counter count++; } //count all valid (valid>0) addresses received from server /// @todo: A) check if they repeats (possible with maliciious server) // B) and not already assigned in addrDB (in others IAs) // It's easy and worth checking // A) Create list of valid addrs and add new valid addr // only if it doesn't exist already on this list // B) Address can be assigned only in this IA, not in other // This could be ommited if VerifyIA worked prooperly this->firstAddr(); SPtr ptrOptIAAddr; while(ptrOptIAAddr=this->getAddr()) { if (!ptrOptIAAddr->getValid()) continue; //if (!ptrIA->getAddr(ptrOptIAAddr->getAddr())) count++; } return count; } SPtr TClntOptIA_NA::getAddr(SPtr addr) { SPtr optAddr; this->firstAddr(); while(optAddr=this->getAddr()) { //!memcmp(optAddr->getAddr(),addr,16) if ((*addr)==(*optAddr->getAddr())) return optAddr; }; return SPtr(); } void TClntOptIA_NA::releaseAddr(long IAID, SPtr addr ) { SPtr ptrIA = ClntAddrMgr().getIA(IAID); if (ptrIA) ptrIA->delAddr(addr); else Log(Warning) << "Unable to release addr: IA (" << IAID << ") not present in addrDB." << LogEnd; } void TClntOptIA_NA::setIface(int iface) { Iface_ = iface; } bool TClntOptIA_NA::isValid() const { const TOptList& opts = SubOptions.getSTL(); for (TOptList::const_iterator it = opts.begin(); it != opts.end(); ++it) { if ((*it)->getOptType() != OPTION_IAADDR) continue; const TOptIAAddress* addr = (const TOptIAAddress*)it->get(); if (addr->getAddr()->linkLocal()) { Log(Warning) << "Address " << addr->getAddr()->getPlain() << " used in IA_NA (IAID=" << IAID_ << ") is link local. The whole IA option is considered invalid." << LogEnd; return false; } } // RFC3315, section 22.4: // If a client receives an IA_NA with T1 greater than T2, and both T1 // and T2 are greater than 0, the client discards the IA_NA option and // processes the remainder of the message as though the server had not // included the invalid IA_NA option. if (T1_ > T2_) { Log(Warning) << "Received malformed IA_NA: T1(" << T1_ << ") is greater than T2(" << T2_ << "). Ignoring IA_NA." << LogEnd; return false; } return Valid; } dibbler-1.0.1/ClntOptions/ClntOptIA_PD.h0000664000175000017500000000250612420521666014653 00000000000000/* * Dibbler - a portable DHCPv6 * * author: Krzysztof Wnuk * changes: Tomasz Mrugalski * * released under GNU GPL v2 only licence */ #ifndef CLNTOPTIA_PD_H #define CLNTOPTIA_PD_H #include "OptIA_PD.h" #include "ClntOptIAPrefix.h" #include "ClntIfaceMgr.h" #include "IPv6Addr.h" class TOptIA_PD; class TClntOptIA_PD : public TOptIA_PD { public: TClntOptIA_PD(SPtr ClntCfgPD, TMsg* parent); TClntOptIA_PD(SPtr clntAddrPD, TMsg* parent); TClntOptIA_PD(char * buf, int bufsize, TMsg* parent); ~TClntOptIA_PD(); bool doDuties(); int getStatusCode(); void setContext(SPtr srvDuid, SPtr srvAddr, TMsg* originalMsg); void setIface(int iface); SPtr getPrefix(); void deletePrefix(SPtr prefix); SPtr getPrefix(SPtr prefix); void firstPrefix(); int countPrefix() const; bool isValid() const; bool addPrefixes(); bool updatePrefixes(); bool delPrefixes(); private: bool modifyPrefixes(TClntIfaceMgr::PrefixModifyMode mode); void setState(EState state); void clearContext(); SPtr Prefix; bool Unicast; SPtr DUID; int Iface; TMsg * OriginalMsg; }; #endif /* CLNTOPTIA_PD_H */ dibbler-1.0.1/ClntOptions/ClntOptPreference.h0000664000175000017500000000130612233256142016046 00000000000000/* * Dibbler - a portable DHCPv6 * * authors: Tomasz Mrugalski * Marek Senderski * * released under GNU GPL v2 only licence * * $Id: ClntOptPreference.h,v 1.3 2008-08-29 00:07:29 thomson Exp $ * * $Log: not supported by cvs2svn $ * Revision 1.2 2004-10-25 20:45:53 thomson * Option support, parsers rewritten. ClntIfaceMgr now handles options. * * */ #ifndef CLNTPREFERENCE_H #define CLNTPREFERENCE_H #include "DHCPConst.h" #include "OptInteger.h" class TClntOptPreference : public TOptInteger { public: TClntOptPreference( char * buf, int n, TMsg* parent); TClntOptPreference( char pref, TMsg* parent); bool doDuties(); }; #endif dibbler-1.0.1/ClntOptions/ClntOptLifetime.h0000664000175000017500000000104412233256142015525 00000000000000/* * Dibbler - a portable DHCPv6 * * authors: Tomasz Mrugalski * Marek Senderski * * released under GNU GPL v2 only licence * * $Id: ClntOptLifetime.h,v 1.3 2008-08-29 00:07:29 thomson Exp $ * */ #ifndef CLNTOPTLIFETIME_H #define CLNTOPTLIFETIME_H #include "DHCPConst.h" #include "OptInteger.h" class TClntOptLifetime : public TOptInteger { public: TClntOptLifetime(char * buf, int n, TMsg* parent); TClntOptLifetime(char pref, TMsg* parent); bool doDuties(); }; #endif dibbler-1.0.1/ClntOptions/ClntOptFQDN.cpp0000644000175000017500000000330412420536016015050 00000000000000/* * Dibbler - a portable DHCPv6 * * author: Krzysztof Wnuk * * released under GNU GPL v2 licence * */ #include "ClntOptFQDN.h" #include "OptDUID.h" #include "Logger.h" using namespace std; TClntOptFQDN::TClntOptFQDN(const std::string& domain, TMsg* parent) :TOptFQDN(domain, parent) { if (domain == "") { // The domain is empty but client request FQDN, so we let the server make the update setSFlag(true); } } TClntOptFQDN::TClntOptFQDN(char *buf, int bufsize, TMsg* parent) :TOptFQDN(buf, bufsize, parent) { /// @todo: do some validity check } bool TClntOptFQDN::doDuties() { if (getSFlag()) { Log(Notice) << "FQDN: DHCPv6 server made the DNS update for my name: " << getFQDN() << " ." << LogEnd; /// @todo: Check the DNS server with the given name. return true; } string reason = "trying to set FQDN."; if (!Parent) { Log(Error) << "Unable to set FQDN: option parent not set." << LogEnd; return false; } int ifindex = this->Parent->getIface(); SPtr addr = this->Parent->getRemoteAddr(); SPtr iface = (Ptr*)ClntIfaceMgr().getIfaceByID(ifindex); if (!iface) { Log(Error) << "Unable to find interface with ifindex=" << ifindex << " while " << reason << LogEnd; return false; } SPtr duid = (Ptr*)Parent->getOption(OPTION_SERVERID); if (!duid) { Log(Error) << "Unable to find proper DUID while " << reason << LogEnd; return false; } // this runs only when client is gonna update DNS server return iface->setFQDN(duid->getDUID(), addr,getFQDN()); } void TClntOptFQDN::setSrvDuid(SPtr duid) { SrvDUID=duid; } dibbler-1.0.1/ClntOptions/Makefile.am0000644000175000017500000000427212277722750014365 00000000000000noinst_LIBRARIES = libClntOptions.a libClntOptions_a_CPPFLAGS = -I$(top_srcdir)/Misc -I$(top_srcdir)/Options -I$(top_srcdir)/ClntMessages libClntOptions_a_CPPFLAGS += -I$(top_srcdir)/Messages -I$(top_srcdir)/ClntIfaceMgr -I$(top_srcdir)/IfaceMgr libClntOptions_a_CPPFLAGS += -I$(top_srcdir)/ClntCfgMgr -I$(top_srcdir)/CfgMgr -I$(top_srcdir)/ClntAddrMgr libClntOptions_a_CPPFLAGS += -I$(top_srcdir)/AddrMgr -I$(top_srcdir)/ClntTransMgr #libClntOptions_a_SOURCES = ClntOptAAAAuthentication.cpp ClntOptAAAAuthentication.h libClntOptions_a_SOURCES = ClntOptAddrParams.cpp ClntOptAddrParams.h #libClntOptions_a_SOURCES += ClntOptAuthentication.cpp ClntOptAuthentication.h #libClntOptions_a_SOURCES += ClntOptDNSServers.cpp ClntOptDNSServers.h #libClntOptions_a_SOURCES += ClntOptDomainName.cpp ClntOptDomainName.h libClntOptions_a_SOURCES += ClntOptElapsed.cpp ClntOptElapsed.h libClntOptions_a_SOURCES += ClntOptFQDN.cpp ClntOptFQDN.h libClntOptions_a_SOURCES += ClntOptIAAddress.cpp ClntOptIAAddress.h libClntOptions_a_SOURCES += ClntOptIA_NA.cpp ClntOptIA_NA.h libClntOptions_a_SOURCES += ClntOptIA_PD.cpp ClntOptIA_PD.h libClntOptions_a_SOURCES += ClntOptIAPrefix.cpp ClntOptIAPrefix.h #libClntOptions_a_SOURCES += ClntOptKeyGeneration.cpp ClntOptKeyGeneration.h libClntOptions_a_SOURCES += ClntOptLifetime.cpp ClntOptLifetime.h #libClntOptions_a_SOURCES += ClntOptNISDomain.cpp ClntOptNISDomain.h #libClntOptions_a_SOURCES += ClntOptNISPDomain.cpp ClntOptNISPDomain.h #libClntOptions_a_SOURCES += ClntOptNTPServers.cpp ClntOptNTPServers.h libClntOptions_a_SOURCES += ClntOptOptionRequest.cpp ClntOptOptionRequest.h libClntOptions_a_SOURCES += ClntOptPreference.cpp ClntOptPreference.h #libClntOptions_a_SOURCES += ClntOptSIPDomain.cpp ClntOptSIPDomain.h #libClntOptions_a_SOURCES += ClntOptSIPServer.cpp ClntOptSIPServer.h libClntOptions_a_SOURCES += ClntOptStatusCode.cpp ClntOptStatusCode.h libClntOptions_a_SOURCES += ClntOptTA.cpp ClntOptTA.h libClntOptions_a_SOURCES += ClntOptTimeZone.cpp ClntOptTimeZone.h #libClntOptions_a_SOURCES += ClntOptUserClass.cpp ClntOptUserClass.h #libClntOptions_a_SOURCES += ClntOptVendorClass.cpp ClntOptVendorClass.h #libClntOptions_a_SOURCES += ClntOptVendorSpec.cpp ClntOptVendorSpec.h dibbler-1.0.1/ClntOptions/ClntOptOptionRequest.cpp0000664000175000017500000000130712233256142017145 00000000000000/* * Dibbler - a portable DHCPv6 * * authors: Tomasz Mrugalski * Marek Senderski * * released under GNU GPL v2 only licence * */ #include "SmartPtr.h" #include "ClntCfgMgr.h" #include "ClntOptOptionRequest.h" TClntOptOptionRequest::TClntOptOptionRequest(SPtr ptrIface, TMsg* parent) :TOptOptionRequest(OPTION_ORO, parent) { // requested options are no longer added here // see void TClntMsg::appendRequestedOptions() for details } TClntOptOptionRequest::TClntOptOptionRequest( char * buf, int n, TMsg* parent) :TOptOptionRequest(OPTION_ORO, buf, n, parent) { } bool TClntOptOptionRequest::doDuties() { return false; } dibbler-1.0.1/ClntOptions/ClntOptTA.h0000644000175000017500000000216012277722750014304 00000000000000/* * Dibbler - a portable DHCPv6 * * authors: Tomasz Mrugalski * Marek Senderski * * released under GNU GPL v2 only licence * * $Id: ClntOptTA.h,v 1.4 2008-08-29 00:07:29 thomson Exp $ * */ class TOptTA; class TMsg; #ifndef CLNTIA_TA_H #define CLNTIA_TA_H #include "OptTA.h" #include "ClntOptIAAddress.h" #include "IPv6Addr.h" #include "Msg.h" class TClntOptTA : public TOptTA { public: TClntOptTA(unsigned int iaid, TMsg* parent); TClntOptTA(char * buf, int bufsize, TMsg* parent); TClntOptTA(SPtr ta, TMsg* parent); ~TClntOptTA(); bool doDuties(); int getStatusCode(); SPtr getAddr(); SPtr getAddr(SPtr addr); void firstAddr(); int countAddr(); bool isValid() const; void setIface(int iface); // used to override interface (e.g. when msg is received via loopback) void setContext(int iface, SPtr clntAddr); private: void releaseAddr(long IAID, SPtr addr ); SPtr Addr; int Iface; }; #endif /* CLNTIA_TA_H */ dibbler-1.0.1/ClntOptions/ClntOptElapsed.h0000664000175000017500000000077112233256142015352 00000000000000/* * Dibbler - a portable DHCPv6 * * authors: Tomasz Mrugalski * Marek Senderski * * released under GNU GPL v2 only licence */ #ifndef CLNTOPTELAPSED_H #define CLNTOPTELAPSED_H #include "OptInteger.h" class TClntOptElapsed : public TOptInteger { public: TClntOptElapsed(TMsg* parent); TClntOptElapsed( char * buf, int n, TMsg* parent); char * storeSelf(char* buf); bool doDuties(); private: unsigned long Timestamp; }; #endif dibbler-1.0.1/ClntOptions/ClntOptIA_NA.h0000644000175000017500000000256512304040124014633 00000000000000/* * Dibbler - a portable DHCPv6 * * authors: Tomasz Mrugalski * Marek Senderski * * released under GNU GPL v2 only licence */ #ifndef CLNTOPTIA_NA_H #define CLNTOPTIA_NA_H #include "ClntCfgIA.h" #include "OptIA_NA.h" #include "ClntOptIAAddress.h" #include "IPv6Addr.h" class TOptIA_NA; class TClntOptIA_NA : public TOptIA_NA { public: /// @todo: WTF? Why there are 5 different constructors??? There should be 2 or 3. TClntOptIA_NA(SPtr ClntCfgIA, TMsg* parent); TClntOptIA_NA(SPtr AddrIA, TMsg* parent); TClntOptIA_NA(SPtr clntAddrIA, bool zeroTimes, TMsg* parent); TClntOptIA_NA(SPtr ClntCfgIA, SPtr ClntaddrIA, TMsg* parent); TClntOptIA_NA(char * buf, int bufsize, TMsg* parent); ~TClntOptIA_NA(); bool doDuties(); int getStatusCode(); void setContext(SPtr srvDuid, SPtr srvAddr, int iface); void setIface(int iface); SPtr getAddr(); SPtr getAddr(SPtr addr); void firstAddr(); int countAddr(); bool isValid() const; private: void releaseAddr(long IAID, SPtr addr ); int countValidAddrs(SPtr ptrAddrIA); SPtr Addr; SPtr DUID; int Iface_; }; #endif /* IA_NA_H_HEADER_INCLUDED_C112064B */ dibbler-1.0.1/ClntOptions/ClntOptIAPrefix.h0000644000175000017500000000114212277722750015446 00000000000000/* * Dibbler - a portable DHCPv6 * * author: Krzysztof Wnuk * changes: Tomasz Mrugalski * * released under GNU GPL v2 only licence * */ #ifndef CLNTOPTIAPREFIX_H #define CLNTOPTIAPREFIX_H #include "SmartPtr.h" #include "Container.h" #include "OptIAPrefix.h" class TClntOptIAPrefix : public TOptIAPrefix { public: TClntOptIAPrefix(char *addr,int n, TMsg* parent); TClntOptIAPrefix(SPtr addr, long pref, long valid, char prefix_length, TMsg* parent); bool doDuties(); bool isValid() const; }; #endif /* CLNTOPTIAPREFIX_H */ dibbler-1.0.1/ClntOptions/ClntOptIAAddress.cpp0000644000175000017500000000445312556513242016133 00000000000000/* * Dibbler - a portable DHCPv6 * * authors: Tomasz Mrugalski * Marek Senderski * * released under GNU GPL v2 only licence * */ #include "Portable.h" #include "DHCPConst.h" #include "Opt.h" #include "OptIAAddress.h" #include "ClntOptIAAddress.h" #include "ClntOptStatusCode.h" #include "ClntOptAddrParams.h" #include "Logger.h" #include "IPv6Addr.h" #include "Msg.h" TClntOptIAAddress::TClntOptIAAddress(char * buf, int bufSize, TMsg* parent) :TOptIAAddress(buf, bufSize, parent) { SPtr opt; int MsgType = 0; if (parent) parent->getType(); int pos=0; while(posbufSize) { Log(Error) << "Message " << MsgType << " truncated. There are " << (bufSize-pos) << " bytes left to parse. Bytes ignored." << LogEnd; break; } unsigned short code = readUint16(buf+pos); pos += sizeof(uint16_t); unsigned short length = readUint16(buf+pos); pos += sizeof(uint16_t); if (pos+length>bufSize) { Log(Error) << "Invalid option (type=" << code << ", len=" << length << " received (msgtype=" << MsgType << "). Message dropped." << LogEnd; return; } if(allowOptInOpt(parent->getType(),OPTION_IAADDR,code)) { opt.reset(); switch (code) { case OPTION_STATUS_CODE: opt = new TClntOptStatusCode(buf+pos,length, this->Parent); break; case OPTION_ADDRPARAMS: opt = new TClntOptAddrParams(buf+pos, length, this->Parent); Log(Debug) << "AddrParams option received." << LogEnd; break; default: Log(Warning) <<"Suboption (type=" << code<< ") not supported " <<" in IAADDR option in message (type="<< parent->getType() <<")." << LogEnd; break; } if((opt)&&(opt->isValid())) SubOptions.append(opt); } else Log(Warning) << "Illegal option received, opttype=" << code << " in field options of IA_NA option"< addr, long pref, long valid, TMsg* parent) :TOptIAAddress(addr,pref,valid, parent) { } bool TClntOptIAAddress::doDuties() { return false; } bool TClntOptIAAddress::isValid() const { if (TOptIAAddress::isValid()) return this->getValid()>=this->getPref(); else return false; } dibbler-1.0.1/ClntOptions/ClntOptStatusCode.cpp0000664000175000017500000000103312233256142016376 00000000000000/* * Dibbler - a portable DHCPv6 * * authors: Tomasz Mrugalski * Marek Senderski * * released under GNU GPL v2 licence * * $Id: ClntOptStatusCode.cpp,v 1.3 2004-06-17 23:53:54 thomson Exp $ * * $Log: not supported by cvs2svn $ * Revision 1.2 2004/03/29 18:53:08 thomson * Author/Licence/cvs log/cvs version headers added. * * */ #include "ClntOptStatusCode.h" TClntOptStatusCode::TClntOptStatusCode( char * buf, int len, TMsg* parent) :TOptStatusCode(buf,len, parent) { } dibbler-1.0.1/ClntOptions/ClntOptIA_PD.cpp0000664000175000017500000003214112556513433015207 00000000000000/* * Dibbler - a portable DHCPv6 * * author: Krzysztof Wnuk * changes: Tomasz Mrugalski * * released under GNU GPL v2 only licence */ #include "AddrIA.h" #include "ClntCfgMgr.h" #include "ClntOptIA_PD.h" #include "ClntOptIAPrefix.h" #include "ClntOptStatusCode.h" #include "ClntIfaceMgr.h" #include "Logger.h" #include "Portable.h" #include "DHCPConst.h" using namespace std; /** * Used in REQUEST, RENEW, REBIND, DECLINE and RELEASE * * @param addrPD * @param parent */ TClntOptIA_PD::TClntOptIA_PD(SPtr addrPD, TMsg* parent) :TOptIA_PD(addrPD->getIAID(),addrPD->getT1(),addrPD->getT2(), parent), Unicast(false), Iface(-1) { bool zeroTimes = false; if ( (parent->getType()==RELEASE_MSG) || (parent->getType()==DECLINE_MSG)) { T1_ = 0; T2_ = 0; zeroTimes = true; } clearContext(); SPtr ptrPrefix; addrPD->firstPrefix(); while ( ptrPrefix = addrPD->getPrefix() ) { SubOptions.append(new TClntOptIAPrefix(ptrPrefix->get(), zeroTimes?0:ptrPrefix->getPref(), zeroTimes?0:ptrPrefix->getValid(), ptrPrefix->getLength(), this->Parent) ); } } /// @brief constructor used in building SOLICIT message /// /// @param cfgPD /// @param parent TClntOptIA_PD::TClntOptIA_PD(SPtr cfgPD, TMsg* parent) :TOptIA_PD(cfgPD->getIAID(), cfgPD->getT1(), cfgPD->getT2(), parent), Unicast(false), Iface(-1) { cfgPD->firstPrefix(); SPtr cfgPrefix; while (cfgPrefix = cfgPD->getPrefix() ) { SubOptions.append(new TClntOptIAPrefix(cfgPrefix->get(), cfgPrefix->getPref(), cfgPrefix->getValid(), cfgPrefix->getLength(), 0)); } clearContext(); } /** * Used to create object from received message * * @param buf * @param bufsize * @param parent */ TClntOptIA_PD::TClntOptIA_PD(char * buf,int bufsize, TMsg* parent) :TOptIA_PD(buf,bufsize, parent), Unicast(false) { int pos=0; while(pos0)&&(code<=26)) { if(allowOptInOpt(parent->getType(),OPTION_IA_PD,code)) { SPtr opt= SPtr(); switch (code) { case OPTION_IAPREFIX: SubOptions.append( new TClntOptIAPrefix(buf+pos,length,this->Parent)); break; case OPTION_STATUS_CODE: SubOptions.append( new TClntOptStatusCode(buf+pos,length,this->Parent)); break; default: Log(Warning) << "Option opttype=" << code<< "not supported " << " in field of message (type="<< parent->getType() << ") in this version of server."<isValid())) SubOptions.append(opt); } else Log(Warning) << "Illegal option received, opttype=" << code << " in field options of IA_PD option" << LogEnd; } else { Log(Warning) << "Unknown option in option IA_NA(optType=" << code << "). Option ignored." << LogEnd; }; pos+=length; } clearContext(); } void TClntOptIA_PD::firstPrefix() { SubOptions.first(); } SPtr TClntOptIA_PD::getPrefix() { SPtr ptr; do { ptr = (Ptr*) SubOptions.get(); if (ptr) if (ptr->getOptType()==OPTION_IAPREFIX) return ptr; } while (ptr); return SPtr(); } int TClntOptIA_PD::countPrefix() const { const TOptList& opts = SubOptions.getSTL(); int count = 0; for (TOptList::const_iterator opt = opts.begin(); opt != opts.end(); ++opt) { if ((*opt)->getOptType() != OPTION_IAPREFIX) continue; count++; } return count; } int TClntOptIA_PD::getStatusCode() { SPtr option; if (option=getOption(OPTION_STATUS_CODE)) { SPtr statOpt=(Ptr*) option; return statOpt->getCode(); } return STATUSCODE_SUCCESS; } void TClntOptIA_PD::setContext(SPtr srvDuid, SPtr srvAddr, TMsg * originalMsg) { DUID=srvDuid; if (srvAddr) { Unicast = true; } else { Unicast = false; } Prefix = srvAddr; OriginalMsg = originalMsg; Iface = originalMsg->getIface(); } TClntOptIA_PD::~TClntOptIA_PD() { } bool TClntOptIA_PD::doDuties() { if (!OriginalMsg) { Log(Error) << "Internal error. Unable to set prefixes: setContext() not called." << LogEnd; return false; } switch(OriginalMsg->getType()) { case REQUEST_MSG: case SOLICIT_MSG: return addPrefixes(); case RELEASE_MSG: return delPrefixes(); case RENEW_MSG: case REBIND_MSG: return updatePrefixes(); default: break; } return true; } void TClntOptIA_PD::deletePrefix(SPtr prefix) { TOptList& opts = SubOptions.getSTL(); for (TOptList::iterator opt = opts.begin(); opt != opts.end(); ++opt) { if ((*opt)->getOptType() == OPTION_IAPREFIX) { SPtr iaprefix = (Ptr*) *opt; if ((*prefix->getPrefix()) == (*iaprefix->getPrefix())) { opts.erase(opt); break; } } } } SPtr TClntOptIA_PD::getPrefix(SPtr prefix) { TOptList& opts = SubOptions.getSTL(); for (TOptList::iterator opt = opts.begin(); opt != opts.end(); ++opt) { if ((*opt)->getOptType() != OPTION_IAPREFIX) continue; SPtr iaprefix = (Ptr*) *opt; if ((*prefix) == (*iaprefix->getPrefix())) return iaprefix; } return SPtr(); // NULL } bool TClntOptIA_PD::addPrefixes() { return modifyPrefixes(TClntIfaceMgr::PREFIX_MODIFY_ADD); } bool TClntOptIA_PD::delPrefixes() { return modifyPrefixes(TClntIfaceMgr::PREFIX_MODIFY_DEL); } bool TClntOptIA_PD::updatePrefixes() { return modifyPrefixes(TClntIfaceMgr::PREFIX_MODIFY_UPDATE); } bool TClntOptIA_PD::modifyPrefixes(TClntIfaceMgr::PrefixModifyMode mode) { bool status = false; EState state = STATE_NOTCONFIGURED; SPtr prefix; string action; switch(mode) { case TClntIfaceMgr::PREFIX_MODIFY_ADD: action = "addition"; state = STATE_CONFIGURED; break; case TClntIfaceMgr::PREFIX_MODIFY_UPDATE: action = "update"; state = STATE_CONFIGURED; break; case TClntIfaceMgr::PREFIX_MODIFY_DEL: action = "delete"; state = STATE_NOTCONFIGURED; break; } if ( (mode==TClntIfaceMgr::PREFIX_MODIFY_ADD) || (mode==TClntIfaceMgr::PREFIX_MODIFY_UPDATE) ) { if ( (T1_ == 0) && (T2_ == 0) ) { TOptList& opts = SubOptions.getSTL(); for (TOptList::iterator it = opts.begin(); it != opts.end(); ++it) { if ((*it)->getOptType() != OPTION_IAPREFIX) continue; prefix = (Ptr*)(*it); T1_ = prefix->getPref()/2; T2_ = (int)((prefix->getPref())*0.7); Log(Notice) << "Server set T1 and T2 to 0. Choosing default (50%, " "70% * prefered-lifetime): T1=" << T1_ << ", T2=" << T2_ << LogEnd; } } } SPtr cfgIface = ClntCfgMgr().getIface(this->Iface); if (!cfgIface) { Log(Error) << "Unable to set PD state for iaid=" << getIAID() << " received on interface " << "ifindex=" << Iface << ": No such interface in CfgMgr found." << LogEnd; return false; } this->firstPrefix(); while (prefix = this->getPrefix() ) { switch (mode) { case TClntIfaceMgr::PREFIX_MODIFY_ADD: ClntAddrMgr().addPrefix(this->DUID, this->Prefix, cfgIface->getName(), this->Iface, IAID_, T1_, T2_, prefix->getPrefix(), prefix->getPref(), prefix->getValid(), prefix->getPrefixLength(), false); status = ClntIfaceMgr().addPrefix(this->Iface, prefix->getPrefix(), prefix->getPrefixLength(), prefix->getPref(), prefix->getValid(), static_cast(Parent->getNotifyScriptParams())); Log(Debug) << "RENEW(IA_PD) will be sent (T1) after " << T1_ << ", REBIND (T2) after " << T2_ << " seconds." << LogEnd; action = "addition"; break; case TClntIfaceMgr::PREFIX_MODIFY_UPDATE: ClntAddrMgr().updatePrefix(this->DUID, this->Prefix, cfgIface->getName(), this->Iface, IAID_, T1_, T2_, prefix->getPrefix(), prefix->getPref(), prefix->getValid(), prefix->getPrefixLength(), false); status = ClntIfaceMgr().updatePrefix(this->Iface, prefix->getPrefix(), prefix->getPrefixLength(), prefix->getPref(), prefix->getValid(), static_cast(Parent->getNotifyScriptParams())); Log(Debug) << "RENEW(IA_PD) will be sent (T1) after " << T1_ << ", REBIND (T2) after " << T2_ << " seconds." << LogEnd; action = "update"; break; case TClntIfaceMgr::PREFIX_MODIFY_DEL: ClntAddrMgr().delPrefix(ClntCfgMgr().getDUID(), IAID_, prefix->getPrefix(), false); status = ClntIfaceMgr().delPrefix(this->Iface, prefix->getPrefix(), prefix->getPrefixLength(), static_cast(Parent->getNotifyScriptParams())); action = "delete"; break; } if (!status) { string tmp = error_message(); Log(Error) << "Prefix error encountered during prefix " << action << " operation: " << tmp << LogEnd; // Let's pretend it was configured and renew it // setState(STATE_FAILED); //return true; } } setState(state); return true; } void TClntOptIA_PD::setIface(int iface) { this->Iface = iface; } bool TClntOptIA_PD::isValid() const { const TOptList& opts = SubOptions.getSTL(); for (TOptList::const_iterator it = opts.begin(); it != opts.end(); ++it) { if ((*it)->getOptType() != OPTION_IAPREFIX) continue; const TOptIAPrefix* prefix = (const TOptIAPrefix*)it->get(); if (prefix->getPrefix()->linkLocal()) { Log(Warning) << "Prefix " << prefix->getPrefix()->getPlain() << " used in IA_PD (IAID=" << IAID_ << ") is link local. The whole IA option is considered invalid." << LogEnd; return false; } } // Last paragraph in section 9 of RFC3633 // If a requesting router receives an IA_PD with T1 greater than T2, and // both T1 and T2 are greater than 0, the client discards the IA_PD // option and processes the remainder of the message as though the // delegating router had not included the IA_PD option. if (T1_ > T2_) { Log(Warning) << "Received malformed IA_PD: T1(" << T1_ << ") is greater than T2(" << T2_ << "). Ignoring IA_PD with iaid=" << IAID_ << LogEnd; return false; } return Valid; } void TClntOptIA_PD::setState(EState state) { SPtr cfgIface = ClntCfgMgr().getIface(this->Iface); if (!cfgIface) { Log(Error) << "Unable to set PD state for iaid=" << getIAID() << " received on interface " << "ifindex=" << Iface << ": No such interface in CfgMgr found." << LogEnd; return; } SPtr cfgPD = cfgIface->getPD(getIAID()); if (!cfgPD) { Log(Error) << "Unable to find PD with iaid=" << getIAID() << " on the " << cfgIface->getFullName() << " interface (CfgMgr)." << LogEnd; return; } cfgPD->setState(state); SPtr addrPD = ClntAddrMgr().getPD(getIAID()); if (!addrPD) { /* Log(Error) << "Unable to find PD with iaid=" << getIAID() << " on the " << cfgIface->getFullName() << " interface (AddrMgr)." << LogEnd; */ /* Don't complain about it. It is normal that IA is being deleted when there are no more prefixes in it */ return; } addrPD->setState(state); } void TClntOptIA_PD::clearContext() { DUID.reset(); OriginalMsg = 0; } dibbler-1.0.1/ClntOptions/ClntOptTimeZone.h0000644000175000017500000000145712277722750015542 00000000000000/* * Dibbler - a portable DHCPv6 * * authors: Tomasz Mrugalski * Marek Senderski * * released under GNU GPL v2 only licence * * $Id: ClntOptTimeZone.h,v 1.4 2008-08-29 00:07:29 thomson Exp $ * * $Log: not supported by cvs2svn $ * Revision 1.3 2004-10-25 20:45:53 thomson * Option support, parsers rewritten. ClntIfaceMgr now handles options. * * */ #ifndef CLNTOPTTIMEZONE_H #define CLNTOPTTIMEZONE_H #include "OptString.h" #include "DUID.h" class TClntOptTimeZone : public TOptString { public: TClntOptTimeZone(const std::string& domain, TMsg* parent); TClntOptTimeZone(char *buf, int bufsize, TMsg* parent); bool doDuties(); void setSrvDuid(SPtr duid); bool isValid() const; private: SPtr SrvDUID; }; #endif dibbler-1.0.1/ClntOptions/ClntOptStatusCode.h0000664000175000017500000000121512233256142016045 00000000000000/* * Dibbler - a portable DHCPv6 * * authors: Tomasz Mrugalski * Marek Senderski * * released under GNU GPL v2 only licence * * $Id: ClntOptStatusCode.h,v 1.3 2008-08-29 00:07:29 thomson Exp $ * * $Log: not supported by cvs2svn $ * Revision 1.2 2004-12-08 00:16:39 thomson * DOS end of lines corrected, header added. * */ #ifndef CLNTOPTSTATUSCODE_H #define CLNTOPTSTATUSCODE_H #include "OptStatusCode.h" #include "DHCPConst.h" class TClntOptStatusCode : public TOptStatusCode { public: TClntOptStatusCode( char * buf, int len, TMsg* parent); }; #endif /* CLNTOPTSTATUSCODE_H */ dibbler-1.0.1/ClntOptions/ClntOptIAAddress.h0000644000175000017500000000111412277722750015575 00000000000000/* * Dibbler - a portable DHCPv6 * * authors: Tomasz Mrugalski * Marek Senderski * * released under GNU GPL v2 only licence * */ #ifndef CLNTOPTIAADDRESS_H #define CLNTOPTIAADDRESS_H #include "SmartPtr.h" #include "Container.h" #include "OptIAAddress.h" class TClntOptIAAddress : public TOptIAAddress { public: TClntOptIAAddress(char *addr,int n, TMsg* parent); TClntOptIAAddress(SPtr addr, long pref, long valid, TMsg* parent); bool doDuties(); bool isValid() const; }; #endif /* CLNTOPTIAADDRESS_H */ dibbler-1.0.1/ClntOptions/ClntOptOptionRequest.h0000664000175000017500000000116512360220567016617 00000000000000/* * Dibbler - a portable DHCPv6 * * authors: Tomasz Mrugalski * Marek Senderski * * released under GNU GPL v2 only licence */ #ifndef CLNTOPTOPTIONREQUEST_H #define CLNTOPTOPTIONREQUEST_H #include "DHCPConst.h" #include "SmartPtr.h" #include "Opt.h" #include "OptOptionRequest.h" class TClntConfMgr; class TClntOptOptionRequest : public TOptOptionRequest { public: TClntOptOptionRequest(SPtr ptrIface, TMsg* parent); TClntOptOptionRequest( char * buf, int n, TMsg* parent); bool doDuties(); private: SPtr CfgMgr; }; #endif dibbler-1.0.1/ClntOptions/ClntOptPreference.cpp0000664000175000017500000000104412233256142016400 00000000000000/* * Dibbler - a portable DHCPv6 * * authors: Tomasz Mrugalski * Marek Senderski * * released under GNU GPL v2 only licence * */ #include "DHCPConst.h" #include "ClntOptPreference.h" TClntOptPreference::TClntOptPreference( char * buf, int n, TMsg* parent) :TOptInteger(OPTION_PREFERENCE, 1, buf,n, parent) { } TClntOptPreference::TClntOptPreference( char pref, TMsg* parent) :TOptInteger(OPTION_PREFERENCE, 1, pref, parent) { } bool TClntOptPreference::doDuties() { return true; } dibbler-1.0.1/ClntOptions/ClntOptFQDN.h0000664000175000017500000000151412233256142014521 00000000000000/* * Dibbler - a portable DHCPv6 * * author: Krzysztof Wnuk * * $Id: ClntOptFQDN.h,v 1.3 2006-10-06 00:42:13 thomson Exp $ * * $Log: not supported by cvs2svn $ * Revision 1.2 2006-03-02 00:59:22 thomson * ClntOptFQDN implemented for real. * * Revision 1.1 2004/10/25 20:45:53 thomson * Option support, parsers rewritten. ClntIfaceMgr now handles options. * * */ #ifndef CLNTOPTFQDN_H #define CLNTOPTFQDN_H #include "OptFQDN.h" #include "DUID.h" #include "SmartPtr.h" #include "ClntIfaceMgr.h" // void *updateDNS(void *IfaceMgr); class TClntOptFQDN : public TOptFQDN { public: TClntOptFQDN(const std::string& fqdn, TMsg* parent); TClntOptFQDN(char *buf, int bufsize, TMsg* parent); bool doDuties(); void setSrvDuid(SPtr duid); private: SPtr SrvDUID; }; #endif dibbler-1.0.1/ClntOptions/ClntOptTA.cpp0000644000175000017500000001714412556515501014641 00000000000000/* * Dibbler - a portable DHCPv6 * * authors: Tomasz Mrugalski * Marek Senderski * * released under GNU GPL v2 only licence * */ #include "AddrIA.h" #include "ClntOptTA.h" #include "ClntOptIAAddress.h" #include "ClntOptStatusCode.h" #include "ClntOptIAAddress.h" #include "OptDUID.h" #include "ClntAddrMgr.h" #include "ClntIfaceMgr.h" #include "Logger.h" /** * Constructor used during * * @param iaid * @param parent */ TClntOptTA::TClntOptTA(unsigned int iaid, TMsg* parent) :TOptTA(iaid, parent), Iface(-1) { // don't put any suboptions } /** * Constructor used during option reception * * @param buf * @param bufsize * @param parent */ TClntOptTA::TClntOptTA(char * buf,int bufsize, TMsg* parent) :TOptTA(buf,bufsize, parent), Iface(-1) { int pos=0, length=0; while(pos opt; if(!allowOptInOpt(parent->getType(),OPTION_IA_TA,code)) { Log(Warning) << "Option " << code << " is not allowed as suboption of " << OPTION_IA_TA << LogEnd; continue; } switch (code) { case OPTION_IAADDR: opt = new TClntOptIAAddress(buf+pos,length,this->Parent); break; case OPTION_STATUS_CODE: opt = new TClntOptStatusCode(buf+pos,length,this->Parent); break; default: Log(Warning) <<"Option " << code<< " in message (type=" << parent->getType() <<") is currently not supported."<isValid()) ) SubOptions.append(opt); pos+=length; } } TClntOptTA::TClntOptTA(SPtr ta, TMsg* parent) :TOptTA(ta->getIAID(), parent), Iface(-1) { ta->firstAddr(); SPtr addr; while (addr=ta->getAddr()) { SubOptions.append(new TClntOptIAAddress(addr->get(), 0, 0, parent)); } } void TClntOptTA::firstAddr() { SubOptions.first(); } SPtr TClntOptTA::getAddr() { SPtr ptr; do { ptr = (Ptr*) SubOptions.get(); if (ptr) if (ptr->getOptType()==OPTION_IAADDR) return ptr; } while (ptr); return SPtr(); // NULL } int TClntOptTA::countAddr() { SPtr ptr; SubOptions.first(); int count = 0; while ( ptr = SubOptions.get() ) { if (ptr->getOptType() == OPTION_IAADDR) count++; } return count; } int TClntOptTA::getStatusCode() { SPtr option; if (option=getOption(OPTION_STATUS_CODE)) { SPtr statOpt=(Ptr*) option; return statOpt->getCode(); } return STATUSCODE_SUCCESS; } TClntOptTA::~TClntOptTA() { } /** * This function sets everything in motion, i.e. sets up temporary addresses * * @return */bool TClntOptTA::doDuties() { // find this TA in addrMgr... SPtr ta = ClntAddrMgr().getTA(this->getIAID()); SPtr cfgIface; if (! (cfgIface = ClntCfgMgr().getIface(this->Iface)) ) { Log(Error) << "Unable to find TA class in the CfgMgr, on the " << this->Iface << " interface." << LogEnd; return true; } SPtr duid = (Ptr*)Parent->getOption(OPTION_SERVERID); if (!duid) { Log(Error) << "Unable to find proper DUID while setting TA." << LogEnd; return false; } if (!ta) { Log(Debug) << "Creating TA (iaid=" << this->getIAID() << ") in the addrDB." << LogEnd; ta = new TAddrIA(cfgIface->getName(), this->Iface, IATYPE_TA, SPtr() /*if unicast, then this->Addr*/, duid->getDUID(), DHCPV6_INFINITY, DHCPV6_INFINITY, this->getIAID()); ClntAddrMgr().addTA(ta); } // IAID found, set up new received options. SPtr addr; SPtr optAddr; SPtr ptrIface; ptrIface = ClntIfaceMgr().getIfaceByID(this->Iface); if (!ptrIface) { Log(Error) << "Interface " << this->Iface << " not found." << LogEnd; return true; } // for each address in IA option... this->firstAddr(); while (optAddr = this->getAddr() ) { addr = ta->getAddr( optAddr->getAddr() ); if (!addr) { // - no such address in DB - if (!optAddr->getValid()) { Log(Warning) << "Server send new addr with valid=0." << LogEnd; continue; } // add this address in addrDB... ta->addAddr(optAddr->getAddr(), optAddr->getPref(), optAddr->getValid()); ta->setDUID(duid->getDUID() ); // ... and in IfaceMgr - ptrIface->addAddr(optAddr->getAddr(), optAddr->getPref(), optAddr->getValid(), ptrIface->getPrefixLength()); Log(Notice) << "Temp. address " << *optAddr->getAddr() << " has been added to " << ptrIface->getName() << "/" << ptrIface->getID() << " interface." << LogEnd; } else { // - we have this addr in DB - if ( optAddr->getValid() == 0 ) { // valid=0, release this address and delete address from addrDB ta->delAddr(optAddr->getAddr()); // delete address from IfaceMgr ptrIface->delAddr(optAddr->getAddr(), ptrIface->getPrefixLength()); continue; // analyze next option OPTION_IA } // set up new options in IfaceMgr ptrIface->updateAddr(optAddr->getAddr(), optAddr->getPref(), optAddr->getValid()); // set up new options in addrDB addr->setPref(optAddr->getPref()); addr->setValid(optAddr->getValid()); addr->setTimestamp(); } } // mark this TA as configured SPtr cfgTA; cfgIface->firstTA(); cfgTA = cfgIface->getTA(); cfgTA->setState(STATE_CONFIGURED); ta->setState(STATE_CONFIGURED); return true; } SPtr TClntOptTA::getAddr(SPtr addr) { SPtr optAddr; this->firstAddr(); while(optAddr=this->getAddr()) { //!memcmp(optAddr->getAddr(),addr,16) if ((*addr)==(*optAddr->getAddr())) return optAddr; }; return SPtr(); } void TClntOptTA::releaseAddr(long IAID, SPtr addr ) { SPtr ptrIA = ClntAddrMgr().getIA(IAID); if (ptrIA) ptrIA->delAddr(addr); else Log(Warning) << "Unable to release addr: IA (" << IAID << ") not present in addrDB." << LogEnd; } bool TClntOptTA::isValid() const { const TOptList& opts = SubOptions.getSTL(); for (TOptList::const_iterator it = opts.begin(); it != opts.end(); ++it) { if ((*it)->getOptType() != OPTION_IAADDR) continue; const TOptIAAddress* addr = (const TOptIAAddress*)it->get(); if (addr->getAddr()->linkLocal()) { Log(Warning) << "Address " << addr->getAddr()->getPlain() << " used in IA_NA (IAID=" << IAID_ << ") is link local. The whole IA option is considered invalid." << LogEnd; return false; } } return true; } void TClntOptTA::setContext(int iface, SPtr clntAddr) { this->Iface = iface; this->Addr = clntAddr; } void TClntOptTA::setIface(int iface) { this->Iface = iface; } dibbler-1.0.1/ClntOptions/ClntOptAddrParams.cpp0000664000175000017500000000113212233256142016336 00000000000000/* * Dibbler - a portable DHCPv6 * * authors: Tomasz Mrugalski * * released under GNU GPL v2 only licence * * $Id: ClntOptAddrParams.cpp,v 1.3 2008-08-29 00:07:28 thomson Exp $ * */ #include "ClntOptAddrParams.h" #include "DHCPConst.h" TClntOptAddrParams::TClntOptAddrParams(char * buf, int n, TMsg* parent) :TOptInteger(OPTION_ADDRPARAMS, 2, buf, n, parent) { } int TClntOptAddrParams::getPrefix() { return (Value >> 8) & 0xff; } int TClntOptAddrParams::getBitfield() { return Value & 0xff; } bool TClntOptAddrParams::doDuties() { return true; } dibbler-1.0.1/ClntOptions/ClntOptIAPrefix.cpp0000644000175000017500000000405612556513230015777 00000000000000/* * Dibbler - a portable DHCPv6 * * author: Krzysztof Wnuk * * released under GNU GPL v2 only licence * */ #include "Portable.h" #include "DHCPConst.h" #include "Opt.h" #include "OptIAPrefix.h" #include "ClntOptIAPrefix.h" #include "ClntOptStatusCode.h" #include "Logger.h" #include "IPv6Addr.h" #include "Msg.h" TClntOptIAPrefix::TClntOptIAPrefix( char * buf, int bufSize, TMsg* parent) :TOptIAPrefix(buf, bufSize, parent) { SPtr opt; int pos=0; int MsgType = 0; if (parent) MsgType = parent->getType(); while(posbufSize) { Log(Error) << "Message " << MsgType << " truncated. There are " << (bufSize-pos) << " bytes left to parse. Bytes ignored." << LogEnd; break; } unsigned short code = readUint16(buf+pos); pos += sizeof(uint16_t); unsigned short length = readUint16(buf+pos); pos+= sizeof(uint16_t); if (pos+length>bufSize) { Log(Error) << "Invalid option (type=" << code << ", len=" << length << " received (msgtype=" << MsgType << "). Message dropped." << LogEnd; return; } if (allowOptInOpt(parent->getType(),OPTION_IAPREFIX,code)) { switch (code) { case OPTION_STATUS_CODE: opt = new TClntOptStatusCode(buf+pos,length, this->Parent); break; default: Log(Warning) <<"Option opttype=" << code<< "not supported " <<" in field of message (type="<< parent->getType() <<") in this version of client."<isValid())) SubOptions.append(opt); } pos += length; } } TClntOptIAPrefix::TClntOptIAPrefix(SPtr addr, long pref, long valid, char prefixLength, TMsg* parent) :TOptIAPrefix(addr,prefixLength,pref,valid, parent) { } bool TClntOptIAPrefix::doDuties() { return false; } bool TClntOptIAPrefix::isValid() const { if (!TOptIAPrefix::isValid()) return false; if (getValid() == 0) return false; return this->getValid() >= this->getPref(); } dibbler-1.0.1/ClntOptions/Makefile.in0000664000175000017500000014412712561652534014402 00000000000000# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = ClntOptions DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/depcomp ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/libtool.m4 \ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/include/dibbler-config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = LIBRARIES = $(noinst_LIBRARIES) ARFLAGS = cru AM_V_AR = $(am__v_AR_@AM_V@) am__v_AR_ = $(am__v_AR_@AM_DEFAULT_V@) am__v_AR_0 = @echo " AR " $@; am__v_AR_1 = libClntOptions_a_AR = $(AR) $(ARFLAGS) libClntOptions_a_LIBADD = am_libClntOptions_a_OBJECTS = \ libClntOptions_a-ClntOptAddrParams.$(OBJEXT) \ libClntOptions_a-ClntOptElapsed.$(OBJEXT) \ libClntOptions_a-ClntOptFQDN.$(OBJEXT) \ libClntOptions_a-ClntOptIAAddress.$(OBJEXT) \ libClntOptions_a-ClntOptIA_NA.$(OBJEXT) \ libClntOptions_a-ClntOptIA_PD.$(OBJEXT) \ libClntOptions_a-ClntOptIAPrefix.$(OBJEXT) \ libClntOptions_a-ClntOptLifetime.$(OBJEXT) \ libClntOptions_a-ClntOptOptionRequest.$(OBJEXT) \ libClntOptions_a-ClntOptPreference.$(OBJEXT) \ libClntOptions_a-ClntOptStatusCode.$(OBJEXT) \ libClntOptions_a-ClntOptTA.$(OBJEXT) \ libClntOptions_a-ClntOptTimeZone.$(OBJEXT) libClntOptions_a_OBJECTS = $(am_libClntOptions_a_OBJECTS) AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)/include depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) LTCXXCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CXXFLAGS) $(CXXFLAGS) AM_V_CXX = $(am__v_CXX_@AM_V@) am__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@) am__v_CXX_0 = @echo " CXX " $@; am__v_CXX_1 = CXXLD = $(CXX) CXXLINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \ $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CXXLD = $(am__v_CXXLD_@AM_V@) am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@) am__v_CXXLD_0 = @echo " CXXLD " $@; am__v_CXXLD_1 = COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(libClntOptions_a_SOURCES) DIST_SOURCES = $(libClntOptions_a_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALLOCA = @ALLOCA@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ ARCH = @ARCH@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ EXTRA_DIST_SUBDIRS = @EXTRA_DIST_SUBDIRS@ FGREP = @FGREP@ GREP = @GREP@ GTEST_INCLUDES = @GTEST_INCLUDES@ GTEST_LDADD = @GTEST_LDADD@ GTEST_LDFLAGS = @GTEST_LDFLAGS@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LINKPRINT = @LINKPRINT@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PORT_CFLAGS = @PORT_CFLAGS@ PORT_LDFLAGS = @PORT_LDFLAGS@ PORT_SUBDIR = @PORT_SUBDIR@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ subdirs = @subdirs@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ noinst_LIBRARIES = libClntOptions.a libClntOptions_a_CPPFLAGS = -I$(top_srcdir)/Misc \ -I$(top_srcdir)/Options -I$(top_srcdir)/ClntMessages \ -I$(top_srcdir)/Messages -I$(top_srcdir)/ClntIfaceMgr \ -I$(top_srcdir)/IfaceMgr -I$(top_srcdir)/ClntCfgMgr \ -I$(top_srcdir)/CfgMgr -I$(top_srcdir)/ClntAddrMgr \ -I$(top_srcdir)/AddrMgr -I$(top_srcdir)/ClntTransMgr #libClntOptions_a_SOURCES = ClntOptAAAAuthentication.cpp ClntOptAAAAuthentication.h #libClntOptions_a_SOURCES += ClntOptAuthentication.cpp ClntOptAuthentication.h #libClntOptions_a_SOURCES += ClntOptDNSServers.cpp ClntOptDNSServers.h #libClntOptions_a_SOURCES += ClntOptDomainName.cpp ClntOptDomainName.h #libClntOptions_a_SOURCES += ClntOptKeyGeneration.cpp ClntOptKeyGeneration.h #libClntOptions_a_SOURCES += ClntOptNISDomain.cpp ClntOptNISDomain.h #libClntOptions_a_SOURCES += ClntOptNISPDomain.cpp ClntOptNISPDomain.h #libClntOptions_a_SOURCES += ClntOptNTPServers.cpp ClntOptNTPServers.h #libClntOptions_a_SOURCES += ClntOptSIPDomain.cpp ClntOptSIPDomain.h #libClntOptions_a_SOURCES += ClntOptSIPServer.cpp ClntOptSIPServer.h libClntOptions_a_SOURCES = ClntOptAddrParams.cpp ClntOptAddrParams.h \ ClntOptElapsed.cpp ClntOptElapsed.h ClntOptFQDN.cpp \ ClntOptFQDN.h ClntOptIAAddress.cpp ClntOptIAAddress.h \ ClntOptIA_NA.cpp ClntOptIA_NA.h ClntOptIA_PD.cpp \ ClntOptIA_PD.h ClntOptIAPrefix.cpp ClntOptIAPrefix.h \ ClntOptLifetime.cpp ClntOptLifetime.h ClntOptOptionRequest.cpp \ ClntOptOptionRequest.h ClntOptPreference.cpp \ ClntOptPreference.h ClntOptStatusCode.cpp ClntOptStatusCode.h \ ClntOptTA.cpp ClntOptTA.h ClntOptTimeZone.cpp \ ClntOptTimeZone.h all: all-am .SUFFIXES: .SUFFIXES: .cpp .lo .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign ClntOptions/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign ClntOptions/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstLIBRARIES: -test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES) libClntOptions.a: $(libClntOptions_a_OBJECTS) $(libClntOptions_a_DEPENDENCIES) $(EXTRA_libClntOptions_a_DEPENDENCIES) $(AM_V_at)-rm -f libClntOptions.a $(AM_V_AR)$(libClntOptions_a_AR) libClntOptions.a $(libClntOptions_a_OBJECTS) $(libClntOptions_a_LIBADD) $(AM_V_at)$(RANLIB) libClntOptions.a mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libClntOptions_a-ClntOptAddrParams.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libClntOptions_a-ClntOptElapsed.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libClntOptions_a-ClntOptFQDN.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libClntOptions_a-ClntOptIAAddress.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libClntOptions_a-ClntOptIAPrefix.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libClntOptions_a-ClntOptIA_NA.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libClntOptions_a-ClntOptIA_PD.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libClntOptions_a-ClntOptLifetime.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libClntOptions_a-ClntOptOptionRequest.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libClntOptions_a-ClntOptPreference.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libClntOptions_a-ClntOptStatusCode.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libClntOptions_a-ClntOptTA.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libClntOptions_a-ClntOptTimeZone.Po@am__quote@ .cpp.o: @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $< .cpp.obj: @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .cpp.lo: @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LTCXXCOMPILE) -c -o $@ $< libClntOptions_a-ClntOptAddrParams.o: ClntOptAddrParams.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libClntOptions_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libClntOptions_a-ClntOptAddrParams.o -MD -MP -MF $(DEPDIR)/libClntOptions_a-ClntOptAddrParams.Tpo -c -o libClntOptions_a-ClntOptAddrParams.o `test -f 'ClntOptAddrParams.cpp' || echo '$(srcdir)/'`ClntOptAddrParams.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libClntOptions_a-ClntOptAddrParams.Tpo $(DEPDIR)/libClntOptions_a-ClntOptAddrParams.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='ClntOptAddrParams.cpp' object='libClntOptions_a-ClntOptAddrParams.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libClntOptions_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libClntOptions_a-ClntOptAddrParams.o `test -f 'ClntOptAddrParams.cpp' || echo '$(srcdir)/'`ClntOptAddrParams.cpp libClntOptions_a-ClntOptAddrParams.obj: ClntOptAddrParams.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libClntOptions_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libClntOptions_a-ClntOptAddrParams.obj -MD -MP -MF $(DEPDIR)/libClntOptions_a-ClntOptAddrParams.Tpo -c -o libClntOptions_a-ClntOptAddrParams.obj `if test -f 'ClntOptAddrParams.cpp'; then $(CYGPATH_W) 'ClntOptAddrParams.cpp'; else $(CYGPATH_W) '$(srcdir)/ClntOptAddrParams.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libClntOptions_a-ClntOptAddrParams.Tpo $(DEPDIR)/libClntOptions_a-ClntOptAddrParams.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='ClntOptAddrParams.cpp' object='libClntOptions_a-ClntOptAddrParams.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libClntOptions_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libClntOptions_a-ClntOptAddrParams.obj `if test -f 'ClntOptAddrParams.cpp'; then $(CYGPATH_W) 'ClntOptAddrParams.cpp'; else $(CYGPATH_W) '$(srcdir)/ClntOptAddrParams.cpp'; fi` libClntOptions_a-ClntOptElapsed.o: ClntOptElapsed.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libClntOptions_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libClntOptions_a-ClntOptElapsed.o -MD -MP -MF $(DEPDIR)/libClntOptions_a-ClntOptElapsed.Tpo -c -o libClntOptions_a-ClntOptElapsed.o `test -f 'ClntOptElapsed.cpp' || echo '$(srcdir)/'`ClntOptElapsed.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libClntOptions_a-ClntOptElapsed.Tpo $(DEPDIR)/libClntOptions_a-ClntOptElapsed.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='ClntOptElapsed.cpp' object='libClntOptions_a-ClntOptElapsed.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libClntOptions_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libClntOptions_a-ClntOptElapsed.o `test -f 'ClntOptElapsed.cpp' || echo '$(srcdir)/'`ClntOptElapsed.cpp libClntOptions_a-ClntOptElapsed.obj: ClntOptElapsed.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libClntOptions_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libClntOptions_a-ClntOptElapsed.obj -MD -MP -MF $(DEPDIR)/libClntOptions_a-ClntOptElapsed.Tpo -c -o libClntOptions_a-ClntOptElapsed.obj `if test -f 'ClntOptElapsed.cpp'; then $(CYGPATH_W) 'ClntOptElapsed.cpp'; else $(CYGPATH_W) '$(srcdir)/ClntOptElapsed.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libClntOptions_a-ClntOptElapsed.Tpo $(DEPDIR)/libClntOptions_a-ClntOptElapsed.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='ClntOptElapsed.cpp' object='libClntOptions_a-ClntOptElapsed.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libClntOptions_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libClntOptions_a-ClntOptElapsed.obj `if test -f 'ClntOptElapsed.cpp'; then $(CYGPATH_W) 'ClntOptElapsed.cpp'; else $(CYGPATH_W) '$(srcdir)/ClntOptElapsed.cpp'; fi` libClntOptions_a-ClntOptFQDN.o: ClntOptFQDN.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libClntOptions_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libClntOptions_a-ClntOptFQDN.o -MD -MP -MF $(DEPDIR)/libClntOptions_a-ClntOptFQDN.Tpo -c -o libClntOptions_a-ClntOptFQDN.o `test -f 'ClntOptFQDN.cpp' || echo '$(srcdir)/'`ClntOptFQDN.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libClntOptions_a-ClntOptFQDN.Tpo $(DEPDIR)/libClntOptions_a-ClntOptFQDN.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='ClntOptFQDN.cpp' object='libClntOptions_a-ClntOptFQDN.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libClntOptions_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libClntOptions_a-ClntOptFQDN.o `test -f 'ClntOptFQDN.cpp' || echo '$(srcdir)/'`ClntOptFQDN.cpp libClntOptions_a-ClntOptFQDN.obj: ClntOptFQDN.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libClntOptions_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libClntOptions_a-ClntOptFQDN.obj -MD -MP -MF $(DEPDIR)/libClntOptions_a-ClntOptFQDN.Tpo -c -o libClntOptions_a-ClntOptFQDN.obj `if test -f 'ClntOptFQDN.cpp'; then $(CYGPATH_W) 'ClntOptFQDN.cpp'; else $(CYGPATH_W) '$(srcdir)/ClntOptFQDN.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libClntOptions_a-ClntOptFQDN.Tpo $(DEPDIR)/libClntOptions_a-ClntOptFQDN.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='ClntOptFQDN.cpp' object='libClntOptions_a-ClntOptFQDN.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libClntOptions_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libClntOptions_a-ClntOptFQDN.obj `if test -f 'ClntOptFQDN.cpp'; then $(CYGPATH_W) 'ClntOptFQDN.cpp'; else $(CYGPATH_W) '$(srcdir)/ClntOptFQDN.cpp'; fi` libClntOptions_a-ClntOptIAAddress.o: ClntOptIAAddress.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libClntOptions_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libClntOptions_a-ClntOptIAAddress.o -MD -MP -MF $(DEPDIR)/libClntOptions_a-ClntOptIAAddress.Tpo -c -o libClntOptions_a-ClntOptIAAddress.o `test -f 'ClntOptIAAddress.cpp' || echo '$(srcdir)/'`ClntOptIAAddress.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libClntOptions_a-ClntOptIAAddress.Tpo $(DEPDIR)/libClntOptions_a-ClntOptIAAddress.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='ClntOptIAAddress.cpp' object='libClntOptions_a-ClntOptIAAddress.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libClntOptions_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libClntOptions_a-ClntOptIAAddress.o `test -f 'ClntOptIAAddress.cpp' || echo '$(srcdir)/'`ClntOptIAAddress.cpp libClntOptions_a-ClntOptIAAddress.obj: ClntOptIAAddress.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libClntOptions_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libClntOptions_a-ClntOptIAAddress.obj -MD -MP -MF $(DEPDIR)/libClntOptions_a-ClntOptIAAddress.Tpo -c -o libClntOptions_a-ClntOptIAAddress.obj `if test -f 'ClntOptIAAddress.cpp'; then $(CYGPATH_W) 'ClntOptIAAddress.cpp'; else $(CYGPATH_W) '$(srcdir)/ClntOptIAAddress.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libClntOptions_a-ClntOptIAAddress.Tpo $(DEPDIR)/libClntOptions_a-ClntOptIAAddress.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='ClntOptIAAddress.cpp' object='libClntOptions_a-ClntOptIAAddress.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libClntOptions_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libClntOptions_a-ClntOptIAAddress.obj `if test -f 'ClntOptIAAddress.cpp'; then $(CYGPATH_W) 'ClntOptIAAddress.cpp'; else $(CYGPATH_W) '$(srcdir)/ClntOptIAAddress.cpp'; fi` libClntOptions_a-ClntOptIA_NA.o: ClntOptIA_NA.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libClntOptions_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libClntOptions_a-ClntOptIA_NA.o -MD -MP -MF $(DEPDIR)/libClntOptions_a-ClntOptIA_NA.Tpo -c -o libClntOptions_a-ClntOptIA_NA.o `test -f 'ClntOptIA_NA.cpp' || echo '$(srcdir)/'`ClntOptIA_NA.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libClntOptions_a-ClntOptIA_NA.Tpo $(DEPDIR)/libClntOptions_a-ClntOptIA_NA.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='ClntOptIA_NA.cpp' object='libClntOptions_a-ClntOptIA_NA.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libClntOptions_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libClntOptions_a-ClntOptIA_NA.o `test -f 'ClntOptIA_NA.cpp' || echo '$(srcdir)/'`ClntOptIA_NA.cpp libClntOptions_a-ClntOptIA_NA.obj: ClntOptIA_NA.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libClntOptions_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libClntOptions_a-ClntOptIA_NA.obj -MD -MP -MF $(DEPDIR)/libClntOptions_a-ClntOptIA_NA.Tpo -c -o libClntOptions_a-ClntOptIA_NA.obj `if test -f 'ClntOptIA_NA.cpp'; then $(CYGPATH_W) 'ClntOptIA_NA.cpp'; else $(CYGPATH_W) '$(srcdir)/ClntOptIA_NA.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libClntOptions_a-ClntOptIA_NA.Tpo $(DEPDIR)/libClntOptions_a-ClntOptIA_NA.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='ClntOptIA_NA.cpp' object='libClntOptions_a-ClntOptIA_NA.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libClntOptions_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libClntOptions_a-ClntOptIA_NA.obj `if test -f 'ClntOptIA_NA.cpp'; then $(CYGPATH_W) 'ClntOptIA_NA.cpp'; else $(CYGPATH_W) '$(srcdir)/ClntOptIA_NA.cpp'; fi` libClntOptions_a-ClntOptIA_PD.o: ClntOptIA_PD.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libClntOptions_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libClntOptions_a-ClntOptIA_PD.o -MD -MP -MF $(DEPDIR)/libClntOptions_a-ClntOptIA_PD.Tpo -c -o libClntOptions_a-ClntOptIA_PD.o `test -f 'ClntOptIA_PD.cpp' || echo '$(srcdir)/'`ClntOptIA_PD.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libClntOptions_a-ClntOptIA_PD.Tpo $(DEPDIR)/libClntOptions_a-ClntOptIA_PD.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='ClntOptIA_PD.cpp' object='libClntOptions_a-ClntOptIA_PD.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libClntOptions_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libClntOptions_a-ClntOptIA_PD.o `test -f 'ClntOptIA_PD.cpp' || echo '$(srcdir)/'`ClntOptIA_PD.cpp libClntOptions_a-ClntOptIA_PD.obj: ClntOptIA_PD.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libClntOptions_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libClntOptions_a-ClntOptIA_PD.obj -MD -MP -MF $(DEPDIR)/libClntOptions_a-ClntOptIA_PD.Tpo -c -o libClntOptions_a-ClntOptIA_PD.obj `if test -f 'ClntOptIA_PD.cpp'; then $(CYGPATH_W) 'ClntOptIA_PD.cpp'; else $(CYGPATH_W) '$(srcdir)/ClntOptIA_PD.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libClntOptions_a-ClntOptIA_PD.Tpo $(DEPDIR)/libClntOptions_a-ClntOptIA_PD.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='ClntOptIA_PD.cpp' object='libClntOptions_a-ClntOptIA_PD.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libClntOptions_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libClntOptions_a-ClntOptIA_PD.obj `if test -f 'ClntOptIA_PD.cpp'; then $(CYGPATH_W) 'ClntOptIA_PD.cpp'; else $(CYGPATH_W) '$(srcdir)/ClntOptIA_PD.cpp'; fi` libClntOptions_a-ClntOptIAPrefix.o: ClntOptIAPrefix.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libClntOptions_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libClntOptions_a-ClntOptIAPrefix.o -MD -MP -MF $(DEPDIR)/libClntOptions_a-ClntOptIAPrefix.Tpo -c -o libClntOptions_a-ClntOptIAPrefix.o `test -f 'ClntOptIAPrefix.cpp' || echo '$(srcdir)/'`ClntOptIAPrefix.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libClntOptions_a-ClntOptIAPrefix.Tpo $(DEPDIR)/libClntOptions_a-ClntOptIAPrefix.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='ClntOptIAPrefix.cpp' object='libClntOptions_a-ClntOptIAPrefix.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libClntOptions_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libClntOptions_a-ClntOptIAPrefix.o `test -f 'ClntOptIAPrefix.cpp' || echo '$(srcdir)/'`ClntOptIAPrefix.cpp libClntOptions_a-ClntOptIAPrefix.obj: ClntOptIAPrefix.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libClntOptions_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libClntOptions_a-ClntOptIAPrefix.obj -MD -MP -MF $(DEPDIR)/libClntOptions_a-ClntOptIAPrefix.Tpo -c -o libClntOptions_a-ClntOptIAPrefix.obj `if test -f 'ClntOptIAPrefix.cpp'; then $(CYGPATH_W) 'ClntOptIAPrefix.cpp'; else $(CYGPATH_W) '$(srcdir)/ClntOptIAPrefix.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libClntOptions_a-ClntOptIAPrefix.Tpo $(DEPDIR)/libClntOptions_a-ClntOptIAPrefix.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='ClntOptIAPrefix.cpp' object='libClntOptions_a-ClntOptIAPrefix.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libClntOptions_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libClntOptions_a-ClntOptIAPrefix.obj `if test -f 'ClntOptIAPrefix.cpp'; then $(CYGPATH_W) 'ClntOptIAPrefix.cpp'; else $(CYGPATH_W) '$(srcdir)/ClntOptIAPrefix.cpp'; fi` libClntOptions_a-ClntOptLifetime.o: ClntOptLifetime.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libClntOptions_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libClntOptions_a-ClntOptLifetime.o -MD -MP -MF $(DEPDIR)/libClntOptions_a-ClntOptLifetime.Tpo -c -o libClntOptions_a-ClntOptLifetime.o `test -f 'ClntOptLifetime.cpp' || echo '$(srcdir)/'`ClntOptLifetime.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libClntOptions_a-ClntOptLifetime.Tpo $(DEPDIR)/libClntOptions_a-ClntOptLifetime.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='ClntOptLifetime.cpp' object='libClntOptions_a-ClntOptLifetime.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libClntOptions_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libClntOptions_a-ClntOptLifetime.o `test -f 'ClntOptLifetime.cpp' || echo '$(srcdir)/'`ClntOptLifetime.cpp libClntOptions_a-ClntOptLifetime.obj: ClntOptLifetime.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libClntOptions_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libClntOptions_a-ClntOptLifetime.obj -MD -MP -MF $(DEPDIR)/libClntOptions_a-ClntOptLifetime.Tpo -c -o libClntOptions_a-ClntOptLifetime.obj `if test -f 'ClntOptLifetime.cpp'; then $(CYGPATH_W) 'ClntOptLifetime.cpp'; else $(CYGPATH_W) '$(srcdir)/ClntOptLifetime.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libClntOptions_a-ClntOptLifetime.Tpo $(DEPDIR)/libClntOptions_a-ClntOptLifetime.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='ClntOptLifetime.cpp' object='libClntOptions_a-ClntOptLifetime.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libClntOptions_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libClntOptions_a-ClntOptLifetime.obj `if test -f 'ClntOptLifetime.cpp'; then $(CYGPATH_W) 'ClntOptLifetime.cpp'; else $(CYGPATH_W) '$(srcdir)/ClntOptLifetime.cpp'; fi` libClntOptions_a-ClntOptOptionRequest.o: ClntOptOptionRequest.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libClntOptions_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libClntOptions_a-ClntOptOptionRequest.o -MD -MP -MF $(DEPDIR)/libClntOptions_a-ClntOptOptionRequest.Tpo -c -o libClntOptions_a-ClntOptOptionRequest.o `test -f 'ClntOptOptionRequest.cpp' || echo '$(srcdir)/'`ClntOptOptionRequest.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libClntOptions_a-ClntOptOptionRequest.Tpo $(DEPDIR)/libClntOptions_a-ClntOptOptionRequest.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='ClntOptOptionRequest.cpp' object='libClntOptions_a-ClntOptOptionRequest.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libClntOptions_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libClntOptions_a-ClntOptOptionRequest.o `test -f 'ClntOptOptionRequest.cpp' || echo '$(srcdir)/'`ClntOptOptionRequest.cpp libClntOptions_a-ClntOptOptionRequest.obj: ClntOptOptionRequest.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libClntOptions_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libClntOptions_a-ClntOptOptionRequest.obj -MD -MP -MF $(DEPDIR)/libClntOptions_a-ClntOptOptionRequest.Tpo -c -o libClntOptions_a-ClntOptOptionRequest.obj `if test -f 'ClntOptOptionRequest.cpp'; then $(CYGPATH_W) 'ClntOptOptionRequest.cpp'; else $(CYGPATH_W) '$(srcdir)/ClntOptOptionRequest.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libClntOptions_a-ClntOptOptionRequest.Tpo $(DEPDIR)/libClntOptions_a-ClntOptOptionRequest.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='ClntOptOptionRequest.cpp' object='libClntOptions_a-ClntOptOptionRequest.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libClntOptions_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libClntOptions_a-ClntOptOptionRequest.obj `if test -f 'ClntOptOptionRequest.cpp'; then $(CYGPATH_W) 'ClntOptOptionRequest.cpp'; else $(CYGPATH_W) '$(srcdir)/ClntOptOptionRequest.cpp'; fi` libClntOptions_a-ClntOptPreference.o: ClntOptPreference.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libClntOptions_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libClntOptions_a-ClntOptPreference.o -MD -MP -MF $(DEPDIR)/libClntOptions_a-ClntOptPreference.Tpo -c -o libClntOptions_a-ClntOptPreference.o `test -f 'ClntOptPreference.cpp' || echo '$(srcdir)/'`ClntOptPreference.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libClntOptions_a-ClntOptPreference.Tpo $(DEPDIR)/libClntOptions_a-ClntOptPreference.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='ClntOptPreference.cpp' object='libClntOptions_a-ClntOptPreference.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libClntOptions_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libClntOptions_a-ClntOptPreference.o `test -f 'ClntOptPreference.cpp' || echo '$(srcdir)/'`ClntOptPreference.cpp libClntOptions_a-ClntOptPreference.obj: ClntOptPreference.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libClntOptions_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libClntOptions_a-ClntOptPreference.obj -MD -MP -MF $(DEPDIR)/libClntOptions_a-ClntOptPreference.Tpo -c -o libClntOptions_a-ClntOptPreference.obj `if test -f 'ClntOptPreference.cpp'; then $(CYGPATH_W) 'ClntOptPreference.cpp'; else $(CYGPATH_W) '$(srcdir)/ClntOptPreference.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libClntOptions_a-ClntOptPreference.Tpo $(DEPDIR)/libClntOptions_a-ClntOptPreference.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='ClntOptPreference.cpp' object='libClntOptions_a-ClntOptPreference.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libClntOptions_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libClntOptions_a-ClntOptPreference.obj `if test -f 'ClntOptPreference.cpp'; then $(CYGPATH_W) 'ClntOptPreference.cpp'; else $(CYGPATH_W) '$(srcdir)/ClntOptPreference.cpp'; fi` libClntOptions_a-ClntOptStatusCode.o: ClntOptStatusCode.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libClntOptions_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libClntOptions_a-ClntOptStatusCode.o -MD -MP -MF $(DEPDIR)/libClntOptions_a-ClntOptStatusCode.Tpo -c -o libClntOptions_a-ClntOptStatusCode.o `test -f 'ClntOptStatusCode.cpp' || echo '$(srcdir)/'`ClntOptStatusCode.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libClntOptions_a-ClntOptStatusCode.Tpo $(DEPDIR)/libClntOptions_a-ClntOptStatusCode.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='ClntOptStatusCode.cpp' object='libClntOptions_a-ClntOptStatusCode.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libClntOptions_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libClntOptions_a-ClntOptStatusCode.o `test -f 'ClntOptStatusCode.cpp' || echo '$(srcdir)/'`ClntOptStatusCode.cpp libClntOptions_a-ClntOptStatusCode.obj: ClntOptStatusCode.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libClntOptions_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libClntOptions_a-ClntOptStatusCode.obj -MD -MP -MF $(DEPDIR)/libClntOptions_a-ClntOptStatusCode.Tpo -c -o libClntOptions_a-ClntOptStatusCode.obj `if test -f 'ClntOptStatusCode.cpp'; then $(CYGPATH_W) 'ClntOptStatusCode.cpp'; else $(CYGPATH_W) '$(srcdir)/ClntOptStatusCode.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libClntOptions_a-ClntOptStatusCode.Tpo $(DEPDIR)/libClntOptions_a-ClntOptStatusCode.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='ClntOptStatusCode.cpp' object='libClntOptions_a-ClntOptStatusCode.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libClntOptions_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libClntOptions_a-ClntOptStatusCode.obj `if test -f 'ClntOptStatusCode.cpp'; then $(CYGPATH_W) 'ClntOptStatusCode.cpp'; else $(CYGPATH_W) '$(srcdir)/ClntOptStatusCode.cpp'; fi` libClntOptions_a-ClntOptTA.o: ClntOptTA.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libClntOptions_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libClntOptions_a-ClntOptTA.o -MD -MP -MF $(DEPDIR)/libClntOptions_a-ClntOptTA.Tpo -c -o libClntOptions_a-ClntOptTA.o `test -f 'ClntOptTA.cpp' || echo '$(srcdir)/'`ClntOptTA.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libClntOptions_a-ClntOptTA.Tpo $(DEPDIR)/libClntOptions_a-ClntOptTA.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='ClntOptTA.cpp' object='libClntOptions_a-ClntOptTA.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libClntOptions_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libClntOptions_a-ClntOptTA.o `test -f 'ClntOptTA.cpp' || echo '$(srcdir)/'`ClntOptTA.cpp libClntOptions_a-ClntOptTA.obj: ClntOptTA.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libClntOptions_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libClntOptions_a-ClntOptTA.obj -MD -MP -MF $(DEPDIR)/libClntOptions_a-ClntOptTA.Tpo -c -o libClntOptions_a-ClntOptTA.obj `if test -f 'ClntOptTA.cpp'; then $(CYGPATH_W) 'ClntOptTA.cpp'; else $(CYGPATH_W) '$(srcdir)/ClntOptTA.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libClntOptions_a-ClntOptTA.Tpo $(DEPDIR)/libClntOptions_a-ClntOptTA.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='ClntOptTA.cpp' object='libClntOptions_a-ClntOptTA.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libClntOptions_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libClntOptions_a-ClntOptTA.obj `if test -f 'ClntOptTA.cpp'; then $(CYGPATH_W) 'ClntOptTA.cpp'; else $(CYGPATH_W) '$(srcdir)/ClntOptTA.cpp'; fi` libClntOptions_a-ClntOptTimeZone.o: ClntOptTimeZone.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libClntOptions_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libClntOptions_a-ClntOptTimeZone.o -MD -MP -MF $(DEPDIR)/libClntOptions_a-ClntOptTimeZone.Tpo -c -o libClntOptions_a-ClntOptTimeZone.o `test -f 'ClntOptTimeZone.cpp' || echo '$(srcdir)/'`ClntOptTimeZone.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libClntOptions_a-ClntOptTimeZone.Tpo $(DEPDIR)/libClntOptions_a-ClntOptTimeZone.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='ClntOptTimeZone.cpp' object='libClntOptions_a-ClntOptTimeZone.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libClntOptions_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libClntOptions_a-ClntOptTimeZone.o `test -f 'ClntOptTimeZone.cpp' || echo '$(srcdir)/'`ClntOptTimeZone.cpp libClntOptions_a-ClntOptTimeZone.obj: ClntOptTimeZone.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libClntOptions_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libClntOptions_a-ClntOptTimeZone.obj -MD -MP -MF $(DEPDIR)/libClntOptions_a-ClntOptTimeZone.Tpo -c -o libClntOptions_a-ClntOptTimeZone.obj `if test -f 'ClntOptTimeZone.cpp'; then $(CYGPATH_W) 'ClntOptTimeZone.cpp'; else $(CYGPATH_W) '$(srcdir)/ClntOptTimeZone.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libClntOptions_a-ClntOptTimeZone.Tpo $(DEPDIR)/libClntOptions_a-ClntOptTimeZone.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='ClntOptTimeZone.cpp' object='libClntOptions_a-ClntOptTimeZone.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libClntOptions_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libClntOptions_a-ClntOptTimeZone.obj `if test -f 'ClntOptTimeZone.cpp'; then $(CYGPATH_W) 'ClntOptTimeZone.cpp'; else $(CYGPATH_W) '$(srcdir)/ClntOptTimeZone.cpp'; fi` mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LIBRARIES) installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool clean-noinstLIBRARIES \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \ clean-libtool clean-noinstLIBRARIES cscopelist-am ctags \ ctags-am distclean distclean-compile distclean-generic \ distclean-libtool distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-dvi install-dvi-am install-exec \ install-exec-am install-html install-html-am install-info \ install-info-am install-man install-pdf install-pdf-am \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ tags tags-am uninstall uninstall-am #libClntOptions_a_SOURCES += ClntOptUserClass.cpp ClntOptUserClass.h #libClntOptions_a_SOURCES += ClntOptVendorClass.cpp ClntOptVendorClass.h #libClntOptions_a_SOURCES += ClntOptVendorSpec.cpp ClntOptVendorSpec.h # 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: dibbler-1.0.1/ClntOptions/ClntOptElapsed.cpp0000644000175000017500000000161712277722750015716 00000000000000/* * Dibbler - a portable DHCPv6 * * authors: Tomasz Mrugalski * Marek Senderski * * released under GNU GPL v2 only licence * * $Id: ClntOptElapsed.cpp,v 1.8 2008-08-29 00:07:28 thomson Exp $ * */ #include "Portable.h" #include "DHCPConst.h" #include "ClntOptElapsed.h" #include "Logger.h" TClntOptElapsed::TClntOptElapsed( char * buf, int n, TMsg* parent) :TOptInteger(OPTION_ELAPSED_TIME, OPTION_ELAPSED_TIME_LEN, buf,n, parent) { Timestamp = (uint32_t)time(NULL); } TClntOptElapsed::TClntOptElapsed(TMsg* parent) :TOptInteger(OPTION_ELAPSED_TIME, OPTION_ELAPSED_TIME_LEN, 0, parent) { Timestamp = (uint32_t)time(NULL); } bool TClntOptElapsed::doDuties() { return false; } char * TClntOptElapsed::storeSelf(char* buf) { Value = (unsigned int)((uint32_t)time(NULL) - Timestamp)*100; return TOptInteger::storeSelf(buf); } dibbler-1.0.1/bison++/0000775000175000017500000000000012561700422011356 500000000000000dibbler-1.0.1/bison++/compile0000755000175000017500000001624512426743032012666 00000000000000#! /bin/sh # Wrapper for compilers which do not understand '-c -o'. scriptversion=2012-10-14.11; # UTC # Copyright (C) 1999-2013 Free Software Foundation, Inc. # Written by Tom Tromey . # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # This file is maintained in Automake, please report # bugs to or send patches to # . nl=' ' # We need space, tab and new line, in precisely that order. Quoting is # there to prevent tools from complaining about whitespace usage. IFS=" "" $nl" file_conv= # func_file_conv build_file lazy # Convert a $build file to $host form and store it in $file # Currently only supports Windows hosts. If the determined conversion # type is listed in (the comma separated) LAZY, no conversion will # take place. func_file_conv () { file=$1 case $file in / | /[!/]*) # absolute file, and not a UNC file if test -z "$file_conv"; then # lazily determine how to convert abs files case `uname -s` in MINGW*) file_conv=mingw ;; CYGWIN*) file_conv=cygwin ;; *) file_conv=wine ;; esac fi case $file_conv/,$2, in *,$file_conv,*) ;; mingw/*) file=`cmd //C echo "$file " | sed -e 's/"\(.*\) " *$/\1/'` ;; cygwin/*) file=`cygpath -m "$file" || echo "$file"` ;; wine/*) file=`winepath -w "$file" || echo "$file"` ;; esac ;; esac } # func_cl_dashL linkdir # Make cl look for libraries in LINKDIR func_cl_dashL () { func_file_conv "$1" if test -z "$lib_path"; then lib_path=$file else lib_path="$lib_path;$file" fi linker_opts="$linker_opts -LIBPATH:$file" } # func_cl_dashl library # Do a library search-path lookup for cl func_cl_dashl () { lib=$1 found=no save_IFS=$IFS IFS=';' for dir in $lib_path $LIB do IFS=$save_IFS if $shared && test -f "$dir/$lib.dll.lib"; then found=yes lib=$dir/$lib.dll.lib break fi if test -f "$dir/$lib.lib"; then found=yes lib=$dir/$lib.lib break fi if test -f "$dir/lib$lib.a"; then found=yes lib=$dir/lib$lib.a break fi done IFS=$save_IFS if test "$found" != yes; then lib=$lib.lib fi } # func_cl_wrapper cl arg... # Adjust compile command to suit cl func_cl_wrapper () { # Assume a capable shell lib_path= shared=: linker_opts= for arg do if test -n "$eat"; then eat= else case $1 in -o) # configure might choose to run compile as 'compile cc -o foo foo.c'. eat=1 case $2 in *.o | *.[oO][bB][jJ]) func_file_conv "$2" set x "$@" -Fo"$file" shift ;; *) func_file_conv "$2" set x "$@" -Fe"$file" shift ;; esac ;; -I) eat=1 func_file_conv "$2" mingw set x "$@" -I"$file" shift ;; -I*) func_file_conv "${1#-I}" mingw set x "$@" -I"$file" shift ;; -l) eat=1 func_cl_dashl "$2" set x "$@" "$lib" shift ;; -l*) func_cl_dashl "${1#-l}" set x "$@" "$lib" shift ;; -L) eat=1 func_cl_dashL "$2" ;; -L*) func_cl_dashL "${1#-L}" ;; -static) shared=false ;; -Wl,*) arg=${1#-Wl,} save_ifs="$IFS"; IFS=',' for flag in $arg; do IFS="$save_ifs" linker_opts="$linker_opts $flag" done IFS="$save_ifs" ;; -Xlinker) eat=1 linker_opts="$linker_opts $2" ;; -*) set x "$@" "$1" shift ;; *.cc | *.CC | *.cxx | *.CXX | *.[cC]++) func_file_conv "$1" set x "$@" -Tp"$file" shift ;; *.c | *.cpp | *.CPP | *.lib | *.LIB | *.Lib | *.OBJ | *.obj | *.[oO]) func_file_conv "$1" mingw set x "$@" "$file" shift ;; *) set x "$@" "$1" shift ;; esac fi shift done if test -n "$linker_opts"; then linker_opts="-link$linker_opts" fi exec "$@" $linker_opts exit 1 } eat= case $1 in '') echo "$0: No command. Try '$0 --help' for more information." 1>&2 exit 1; ;; -h | --h*) cat <<\EOF Usage: compile [--help] [--version] PROGRAM [ARGS] Wrapper for compilers which do not understand '-c -o'. Remove '-o dest.o' from ARGS, run PROGRAM with the remaining arguments, and rename the output as expected. If you are trying to build a whole package this is not the right script to run: please start by reading the file 'INSTALL'. Report bugs to . EOF exit $? ;; -v | --v*) echo "compile $scriptversion" exit $? ;; cl | *[/\\]cl | cl.exe | *[/\\]cl.exe ) func_cl_wrapper "$@" # Doesn't return... ;; esac ofile= cfile= for arg do if test -n "$eat"; then eat= else case $1 in -o) # configure might choose to run compile as 'compile cc -o foo foo.c'. # So we strip '-o arg' only if arg is an object. eat=1 case $2 in *.o | *.obj) ofile=$2 ;; *) set x "$@" -o "$2" shift ;; esac ;; *.c) cfile=$1 set x "$@" "$1" shift ;; *) set x "$@" "$1" shift ;; esac fi shift done if test -z "$ofile" || test -z "$cfile"; then # If no '-o' option was seen then we might have been invoked from a # pattern rule where we don't need one. That is ok -- this is a # normal compilation that the losing compiler can handle. If no # '.c' file was seen then we are probably linking. That is also # ok. exec "$@" fi # Name of file we expect compiler to create. cofile=`echo "$cfile" | sed 's|^.*[\\/]||; s|^[a-zA-Z]:||; s/\.c$/.o/'` # Create the lock directory. # Note: use '[/\\:.-]' here to ensure that we don't use the same name # that we are using for the .o file. Also, base the name on the expected # object file name, since that is what matters with a parallel build. lockdir=`echo "$cofile" | sed -e 's|[/\\:.-]|_|g'`.d while true; do if mkdir "$lockdir" >/dev/null 2>&1; then break fi sleep 1 done # FIXME: race condition here if user kills between mkdir and trap. trap "rmdir '$lockdir'; exit 1" 1 2 15 # Run the compile. "$@" ret=$? if test -f "$cofile"; then test "$cofile" = "$ofile" || mv "$cofile" "$ofile" elif test -f "${cofile}bj"; then test "${cofile}bj" = "$ofile" || mv "${cofile}bj" "$ofile" fi rmdir "$lockdir" exit $ret # Local Variables: # mode: shell-script # sh-indentation: 2 # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC" # time-stamp-end: "; # UTC" # End: dibbler-1.0.1/bison++/state.h0000664000175000017500000001110712233256142012570 00000000000000/* Type definitions for nondeterministic finite state machine for bison, Copyright (C) 1984, 1989 Free Software Foundation, Inc. This file is part of Bison, the GNU Compiler Compiler. Bison 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. Bison 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 Bison; see the file COPYING. If not, write to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ /* These type definitions are used to represent a nondeterministic finite state machine that parses the specified grammar. This information is generated by the function generate_states in the file LR0. Each state of the machine is described by a set of items -- particular positions in particular rules -- that are the possible places where parsing could continue when the machine is in this state. These symbols at these items are the allowable inputs that can follow now. A core represents one state. States are numbered in the number field. When generate_states is finished, the starting state is state 0 and nstates is the number of states. (A transition to a state whose state number is nstates indicates termination.) All the cores are chained together and first_state points to the first one (state 0). For each state there is a particular symbol which must have been the last thing accepted to reach that state. It is the accessing_symbol of the core. Each core contains a vector of nitems items which are the indices in the ritems vector of the items that are selected in this state. The link field is used for chaining buckets that hash states by their itemsets. This is for recognizing equivalent states and combining them when the states are generated. The two types of transitions are shifts (push the lookahead token and read another) and reductions (combine the last n things on the stack via a rule, replace them with the symbol that the rule derives, and leave the lookahead token alone). When the states are generated, these transitions are represented in two other lists. Each shifts structure describes the possible shift transitions out of one state, the state whose number is in the number field. The shifts structures are linked through next and first_shift points to them. Each contains a vector of numbers of the states that shift transitions can go to. The accessing_symbol fields of those states' cores say what kind of input leads to them. A shift to state zero should be ignored. Conflict resolution deletes shifts by changing them to zero. Each reductions structure describes the possible reductions at the state whose number is in the number field. The data is a list of nreds rules, represented by their rule numbers. first_reduction points to the list of these structures. Conflict resolution can decide that certain tokens in certain states should explicitly be errors (for implementing %nonassoc). For each state, the tokens that are errors for this reason are recorded in an errs structure, which has the state number in its number field. The rest of the errs structure is full of token numbers. There is at least one shift transition present in state zero. It leads to a next-to-final state whose accessing_symbol is the grammar's start symbol. The next-to-final state has one shift to the final state, whose accessing_symbol is zero (end of input). The final state has one shift, which goes to the termination state (whose number is nstates-1). The reason for the extra state at the end is to placate the parser's strategy of making all decisions one token ahead of its actions. */ typedef struct core { struct core *next; struct core *link; short number; short accessing_symbol; short nitems; short items[1]; } core; typedef struct shifts { struct shifts *next; short number; short nshifts; short internalShifts[1]; } shifts; typedef struct errs { short nerrs; short internalErrs[1]; } errs; typedef struct reductions { struct reductions *next; short number; short nreds; short rules[1]; } reductions; extern int nstates; extern core *first_state; extern shifts *first_shift; extern reductions *first_reduction; dibbler-1.0.1/bison++/install-sh0000755000175000017500000003325512277722750013324 00000000000000#!/bin/sh # install - install a program, script, or datafile scriptversion=2011-11-20.07; # UTC # This originates from X11R5 (mit/util/scripts/install.sh), which was # later released in X11R6 (xc/config/util/install.sh) with the # following copyright and license. # # Copyright (C) 1994 X Consortium # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to # deal in the Software without restriction, including without limitation the # rights to use, copy, modify, merge, publish, distribute, sublicense, and/or # sell copies of the Software, and to permit persons to whom the Software is # furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included in # all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE # X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN # AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC- # TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # # Except as contained in this notice, the name of the X Consortium shall not # be used in advertising or otherwise to promote the sale, use or other deal- # ings in this Software without prior written authorization from the X Consor- # tium. # # # FSF changes to this file are in the public domain. # # Calling this script install-sh is preferred over install.sh, to prevent # 'make' implicit rules from creating a file called install from it # when there is no Makefile. # # This script is compatible with the BSD install script, but was written # from scratch. nl=' ' IFS=" "" $nl" # set DOITPROG to echo to test this script # Don't use :- since 4.3BSD and earlier shells don't like it. doit=${DOITPROG-} if test -z "$doit"; then doit_exec=exec else doit_exec=$doit fi # Put in absolute file names if you don't have them in your path; # or use environment vars. chgrpprog=${CHGRPPROG-chgrp} chmodprog=${CHMODPROG-chmod} chownprog=${CHOWNPROG-chown} cmpprog=${CMPPROG-cmp} cpprog=${CPPROG-cp} mkdirprog=${MKDIRPROG-mkdir} mvprog=${MVPROG-mv} rmprog=${RMPROG-rm} stripprog=${STRIPPROG-strip} posix_glob='?' initialize_posix_glob=' test "$posix_glob" != "?" || { if (set -f) 2>/dev/null; then posix_glob= else posix_glob=: fi } ' posix_mkdir= # Desired mode of installed file. mode=0755 chgrpcmd= chmodcmd=$chmodprog chowncmd= mvcmd=$mvprog rmcmd="$rmprog -f" stripcmd= src= dst= dir_arg= dst_arg= copy_on_change=false no_target_directory= usage="\ Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE or: $0 [OPTION]... SRCFILES... DIRECTORY or: $0 [OPTION]... -t DIRECTORY SRCFILES... or: $0 [OPTION]... -d DIRECTORIES... In the 1st form, copy SRCFILE to DSTFILE. In the 2nd and 3rd, copy all SRCFILES to DIRECTORY. In the 4th, create DIRECTORIES. Options: --help display this help and exit. --version display version info and exit. -c (ignored) -C install only if different (preserve the last data modification time) -d create directories instead of installing files. -g GROUP $chgrpprog installed files to GROUP. -m MODE $chmodprog installed files to MODE. -o USER $chownprog installed files to USER. -s $stripprog installed files. -t DIRECTORY install into DIRECTORY. -T report an error if DSTFILE is a directory. Environment variables override the default commands: CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG RMPROG STRIPPROG " while test $# -ne 0; do case $1 in -c) ;; -C) copy_on_change=true;; -d) dir_arg=true;; -g) chgrpcmd="$chgrpprog $2" shift;; --help) echo "$usage"; exit $?;; -m) mode=$2 case $mode in *' '* | *' '* | *' '* | *'*'* | *'?'* | *'['*) echo "$0: invalid mode: $mode" >&2 exit 1;; esac shift;; -o) chowncmd="$chownprog $2" shift;; -s) stripcmd=$stripprog;; -t) dst_arg=$2 # Protect names problematic for 'test' and other utilities. case $dst_arg in -* | [=\(\)!]) dst_arg=./$dst_arg;; esac shift;; -T) no_target_directory=true;; --version) echo "$0 $scriptversion"; exit $?;; --) shift break;; -*) echo "$0: invalid option: $1" >&2 exit 1;; *) break;; esac shift done if test $# -ne 0 && test -z "$dir_arg$dst_arg"; then # When -d is used, all remaining arguments are directories to create. # When -t is used, the destination is already specified. # Otherwise, the last argument is the destination. Remove it from $@. for arg do if test -n "$dst_arg"; then # $@ is not empty: it contains at least $arg. set fnord "$@" "$dst_arg" shift # fnord fi shift # arg dst_arg=$arg # Protect names problematic for 'test' and other utilities. case $dst_arg in -* | [=\(\)!]) dst_arg=./$dst_arg;; esac done fi if test $# -eq 0; then if test -z "$dir_arg"; then echo "$0: no input file specified." >&2 exit 1 fi # It's OK to call 'install-sh -d' without argument. # This can happen when creating conditional directories. exit 0 fi if test -z "$dir_arg"; then do_exit='(exit $ret); exit $ret' trap "ret=129; $do_exit" 1 trap "ret=130; $do_exit" 2 trap "ret=141; $do_exit" 13 trap "ret=143; $do_exit" 15 # Set umask so as not to create temps with too-generous modes. # However, 'strip' requires both read and write access to temps. case $mode in # Optimize common cases. *644) cp_umask=133;; *755) cp_umask=22;; *[0-7]) if test -z "$stripcmd"; then u_plus_rw= else u_plus_rw='% 200' fi cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;; *) if test -z "$stripcmd"; then u_plus_rw= else u_plus_rw=,u+rw fi cp_umask=$mode$u_plus_rw;; esac fi for src do # Protect names problematic for 'test' and other utilities. case $src in -* | [=\(\)!]) src=./$src;; esac if test -n "$dir_arg"; then dst=$src dstdir=$dst test -d "$dstdir" dstdir_status=$? else # Waiting for this to be detected by the "$cpprog $src $dsttmp" command # might cause directories to be created, which would be especially bad # if $src (and thus $dsttmp) contains '*'. if test ! -f "$src" && test ! -d "$src"; then echo "$0: $src does not exist." >&2 exit 1 fi if test -z "$dst_arg"; then echo "$0: no destination specified." >&2 exit 1 fi dst=$dst_arg # If destination is a directory, append the input filename; won't work # if double slashes aren't ignored. if test -d "$dst"; then if test -n "$no_target_directory"; then echo "$0: $dst_arg: Is a directory" >&2 exit 1 fi dstdir=$dst dst=$dstdir/`basename "$src"` dstdir_status=0 else # Prefer dirname, but fall back on a substitute if dirname fails. dstdir=` (dirname "$dst") 2>/dev/null || expr X"$dst" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$dst" : 'X\(//\)[^/]' \| \ X"$dst" : 'X\(//\)$' \| \ X"$dst" : 'X\(/\)' \| . 2>/dev/null || echo X"$dst" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q' ` test -d "$dstdir" dstdir_status=$? fi fi obsolete_mkdir_used=false if test $dstdir_status != 0; then case $posix_mkdir in '') # Create intermediate dirs using mode 755 as modified by the umask. # This is like FreeBSD 'install' as of 1997-10-28. umask=`umask` case $stripcmd.$umask in # Optimize common cases. *[2367][2367]) mkdir_umask=$umask;; .*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;; *[0-7]) mkdir_umask=`expr $umask + 22 \ - $umask % 100 % 40 + $umask % 20 \ - $umask % 10 % 4 + $umask % 2 `;; *) mkdir_umask=$umask,go-w;; esac # With -d, create the new directory with the user-specified mode. # Otherwise, rely on $mkdir_umask. if test -n "$dir_arg"; then mkdir_mode=-m$mode else mkdir_mode= fi posix_mkdir=false case $umask in *[123567][0-7][0-7]) # POSIX mkdir -p sets u+wx bits regardless of umask, which # is incompatible with FreeBSD 'install' when (umask & 300) != 0. ;; *) tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$ trap 'ret=$?; rmdir "$tmpdir/d" "$tmpdir" 2>/dev/null; exit $ret' 0 if (umask $mkdir_umask && exec $mkdirprog $mkdir_mode -p -- "$tmpdir/d") >/dev/null 2>&1 then if test -z "$dir_arg" || { # Check for POSIX incompatibilities with -m. # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or # other-writable bit of parent directory when it shouldn't. # FreeBSD 6.1 mkdir -m -p sets mode of existing directory. ls_ld_tmpdir=`ls -ld "$tmpdir"` case $ls_ld_tmpdir in d????-?r-*) different_mode=700;; d????-?--*) different_mode=755;; *) false;; esac && $mkdirprog -m$different_mode -p -- "$tmpdir" && { ls_ld_tmpdir_1=`ls -ld "$tmpdir"` test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1" } } then posix_mkdir=: fi rmdir "$tmpdir/d" "$tmpdir" else # Remove any dirs left behind by ancient mkdir implementations. rmdir ./$mkdir_mode ./-p ./-- 2>/dev/null fi trap '' 0;; esac;; esac if $posix_mkdir && ( umask $mkdir_umask && $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir" ) then : else # The umask is ridiculous, or mkdir does not conform to POSIX, # or it failed possibly due to a race condition. Create the # directory the slow way, step by step, checking for races as we go. case $dstdir in /*) prefix='/';; [-=\(\)!]*) prefix='./';; *) prefix='';; esac eval "$initialize_posix_glob" oIFS=$IFS IFS=/ $posix_glob set -f set fnord $dstdir shift $posix_glob set +f IFS=$oIFS prefixes= for d do test X"$d" = X && continue prefix=$prefix$d if test -d "$prefix"; then prefixes= else if $posix_mkdir; then (umask=$mkdir_umask && $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break # Don't fail if two instances are running concurrently. test -d "$prefix" || exit 1 else case $prefix in *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;; *) qprefix=$prefix;; esac prefixes="$prefixes '$qprefix'" fi fi prefix=$prefix/ done if test -n "$prefixes"; then # Don't fail if two instances are running concurrently. (umask $mkdir_umask && eval "\$doit_exec \$mkdirprog $prefixes") || test -d "$dstdir" || exit 1 obsolete_mkdir_used=true fi fi fi if test -n "$dir_arg"; then { test -z "$chowncmd" || $doit $chowncmd "$dst"; } && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } && { test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false || test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1 else # Make a couple of temp file names in the proper directory. dsttmp=$dstdir/_inst.$$_ rmtmp=$dstdir/_rm.$$_ # Trap to clean up those temp files at exit. trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0 # Copy the file name to the temp name. (umask $cp_umask && $doit_exec $cpprog "$src" "$dsttmp") && # and set any options; do chmod last to preserve setuid bits. # # If any of these fail, we abort the whole thing. If we want to # ignore errors from any of these, just make sure not to ignore # errors from the above "$doit $cpprog $src $dsttmp" command. # { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } && { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } && { test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } && # If -C, don't bother to copy if it wouldn't change the file. if $copy_on_change && old=`LC_ALL=C ls -dlL "$dst" 2>/dev/null` && new=`LC_ALL=C ls -dlL "$dsttmp" 2>/dev/null` && eval "$initialize_posix_glob" && $posix_glob set -f && set X $old && old=:$2:$4:$5:$6 && set X $new && new=:$2:$4:$5:$6 && $posix_glob set +f && test "$old" = "$new" && $cmpprog "$dst" "$dsttmp" >/dev/null 2>&1 then rm -f "$dsttmp" else # Rename the file to the real destination. $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null || # The rename failed, perhaps because mv can't rename something else # to itself, or perhaps because mv is so ancient that it does not # support -f. { # Now remove or move aside any old file at destination location. # We try this two ways since rm can't unlink itself on some # systems and the destination file might be busy for other # reasons. In this case, the final cleanup might fail but the new # file should still install successfully. { test ! -f "$dst" || $doit $rmcmd -f "$dst" 2>/dev/null || { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null && { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; } } || { echo "$0: cannot unlink or rename $dst" >&2 (exit 1); exit 1 } } && # Now rename the file to the real destination. $doit $mvcmd "$dsttmp" "$dst" } fi || exit 1 trap '' 0 fi done # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC" # time-stamp-end: "; # UTC" # End: dibbler-1.0.1/bison++/ChangeLog0000664000175000017500000011751712233256142013065 00000000000000Changes between 1.19-8 and 1.21-8+ - bison.cc: #pragma alloca,in AIX must be put before any C declaration - bison.cc,h: avoid redeclaring yylval twice - bison.cc: changed __ALLOCA_return(num) to avoid unreached instruction warning. Changes between 1.19-6 and 1.21-8 - cosmetics... - bison.cc, bison.h : generalize MSDOS to WINDOWS and alike.... - bison.cc, bison.h : WINDOWS: simulate alloca with malloc, via macro Changes between 1.19-6 and 1.21-7 - bison.cc, bison.h : use macro to simulate goto in yyparse. for sun c++. - bison.cc : mismatch in #if between YY_USE_CLASS and compatibility just before including #define tokens. added a #endif and a #ifndef YY_USE_CLASS - generate enum to replace enventually the static const - output.c, files.c : manage to put #line in generated code, such that the generated code is correctly indicated in the output file. Changes between 1.19-5 and 1.21-6 - bison.h : parameter name forgotten in 'virtual void YY_@_ERROR(char *) YY_@_ERROR_BODY;' so inline cannot use the parameter. just add the name 'msg' as parameter. Changes between 1.19-3 and 1.21-5 - send on internet as patch 5 - patch according to release 1.21 of bison : > Mon Sep 6 15:32:32 1993 Noah Friedman (friedman@nutrimat.gnu.ai.mit.edu) > > * Version 1.22 released. > > * mkinstalldirs: New file. > > * Makefile.in (dist): Use .gz for extension, not .z. > (DISTFILES): New variable. > (dist): Use it instead of explicit file list. > Try to link each file separately, then copy file if ln fails. > (installdirs): Use mkinstalldirs script. > > Thu Jul 29 20:35:02 1993 David J. MacKenzie (djm@wookumz.gnu.ai.mit.edu) > > * Makefile.in (config.status): Run config.status --recheck, not > configure, to get the right args passed. > > Sat Jul 24 04:00:52 1993 Richard Stallman (rms@mole.gnu.ai.mit.edu) > > * bison.simple (yyparse): Init yychar1 to avoid warning. > > Sun Jul 4 16:05:58 1993 Richard Stallman (rms@mole.gnu.ai.mit.edu) > > * bison.simple (yyparse): Don't set yyval when yylen is 0. > > Sat Jun 26 15:54:04 1993 David J. MacKenzie (djm@wookumz.gnu.ai.mit.edu) > > * getargs.c (getargs): Exit after printing the version number. > Add --help and -h options. > (usage): New function. > > Fri Jun 25 15:11:25 1993 Richard Stallman (rms@mole.gnu.ai.mit.edu) > > * getargs.c (longopts): Allow `output' as an alternative. > > Wed Jun 16 17:02:37 1993 Richard Stallman (rms@mole.gnu.ai.mit.edu) > > * bison.simple (yyparse): Conditionalize the entire call to yyoverflow, > not just two arguments in it. > > Thu Jun 3 13:07:19 1993 Richard Stallman (rms@mole.gnu.ai.mit.edu) > > * bison.simple [__hpux] (alloca): Don't specify arg types. > > Fri May 7 05:53:17 1993 Noah Friedman (friedman@nutrimat.gnu.ai.mit.edu) > > * Makefile.in (install): Depend on `uninstall' and `installdirs'. > (installdirs): New target. > > Wed Apr 28 15:15:15 1993 Noah Friedman (friedman@nutrimat.gnu.ai.mit.edu) > > * reader.c: Remove declaration of atoi. > > Fri Apr 23 12:29:20 1993 Noah Friedman (friedman@nutrimat.gnu.ai.mit.edu) > > * new.h [!__STDC__] (FREE): Check x != 0. > Make expr to call `free' evaluate to 0. > > Tue Apr 20 01:43:44 1993 David J. MacKenzie (djm@kropotkin.gnu.ai.mit.edu) > > * files.c [MSDOS]: Use xmalloc, not malloc. > * allocate.c (xmalloc): Renamed from mallocate. Remove old wrapper. > * conflicts.c, symtab.c, files.c, LR0.c, new.h: Change callers. > * allocate.c (xrealloc): New function. > * new.h: Declare it. > * lex.c, reader.c: Use it. > > Sun Apr 18 00:45:56 1993 Noah Friedman (friedman@nutrimat.gnu.ai.mit.edu) > > * Version 1.21 released. > > * reader.c : Don't declare `realloc'. > > * Makefile.in (bison.s1): use `rm -f' since it's quieter. > (dist): make gzipped tar file. > > Fri Apr 16 21:24:10 1993 Noah Friedman (friedman@nutrimat.gnu.ai.mit.edu) > > * Makefile.in (Makefile, config.status, configure): New targets. > > Thu Apr 15 15:37:28 1993 Richard Stallman (rms@mole.gnu.ai.mit.edu) > > * main.c: Don't declare `abort'. > > * files.c: Don't declare `exit'. > > Thu Apr 15 02:42:38 1993 Noah Friedman (friedman@nutrimat.gnu.ai.mit.edu) > > * configure.in: Add AC_CONST. > > Wed Apr 14 00:51:17 1993 Richard Stallman (rms@mole.gnu.ai.mit.edu) > > * Makefile.in (all): Depend on bison.s1. > > Tue Apr 13 14:52:32 1993 Richard Stallman (rms@mole.gnu.ai.mit.edu) > > * Version 1.20 released. > > Wed Mar 24 21:45:47 1993 Richard Stallman (rms@wookumz.gnu.ai.mit.edu) > > * output.c (output_headers): Rename yynerrs if -p. > > Thu Mar 18 00:02:17 1993 Noah Friedman (friedman@nutrimat.gnu.ai.mit.edu) > > * system.h: Don't try to include stdlib.h unless HAVE_STDLIB_H is > defined. > > * configure.in: Check for stdlib.h. > > Wed Mar 17 14:44:27 1993 Richard Stallman (rms@mole.gnu.ai.mit.edu) > > * bison.simple [__hpux, not __GNUC__]: Declare alloca. > (yyparse): When printing the expected token types for an error, > Avoid negative indexes in yycheck and yytname. > > Sat Mar 13 23:31:25 1993 Richard Stallman (rms@mole.gnu.ai.mit.edu) > > * Makefile.in (files.o, .c.o): Put CPPFLAGS and CFLAGS last. > > Mon Mar 1 17:49:08 1993 Richard Stallman (rms@mole.gnu.ai.mit.edu) > > * bison.simple: Test __sgi like __sparc. > > Wed Feb 17 00:04:13 1993 Richard Stallman (rms@mole.gnu.ai.mit.edu) > > * conflicts.c (resolve_sr_conflict): Add extra parens in alloca call. > > * bison.simple [__GNUC__] (yyparse): Declare with prototype. > > Fri Jan 15 13:15:17 1993 Richard Stallman (rms@mole.gnu.ai.mit.edu) > > * conflicts.c (print_reduction): Near end, increment fp2 when mask > recycles. > > Wed Jan 13 04:15:03 1993 Richard Stallman (rms@mole.gnu.ai.mit.edu) > > * Makefile.in (bison.s1): New target. Modifies bison.simple. > (install): Install bison.s1, without changing it. > (clean): Delete bison.s1. > > Mon Jan 4 20:35:58 1993 Richard Stallman (rms@mole.gnu.ai.mit.edu) > > * reader.c (reader): Put Bison version in comment in output file. > > Tue Dec 22 19:00:58 1992 Richard Stallman (rms@mole.gnu.ai.mit.edu) > > * files.c (openfiles): Use .output, not .out, for outfile, > regardless of spec_name_prefix. > > Tue Dec 15 19:22:11 1992 Richard Stallman (rms@mole.gnu.ai.mit.edu) > > * output.c (output_gram): Include yyrhs in the same #if as yyprhs. > > Tue Dec 15 18:29:16 1992 Noah Friedman (friedman@nutrimat.gnu.ai.mit.edu) > > * output.c (output): output directives checking for __cplusplus as > well as __STDC__ to determine when to define "const" as an empty > token. (Patch from Wolfgang Glunz ) > > Tue Dec 8 21:51:23 1992 David J. MacKenzie (djm@kropotkin.gnu.ai.mit.edu) > > * system.h, conflicts.c: Replace USG with HAVE_STRING_H and > HAVE_MEMORY_H. > > Sat Nov 21 00:37:16 1992 David J. MacKenzie (djm@goldman.gnu.ai.mit.edu) > > * Makefile.in: Set and use $(MAKEINFO). > > Fri Nov 20 20:45:57 1992 Richard Stallman (rms@mole.gnu.ai.mit.edu) > > * files.c (done) [MSDOS]: Delete the tmpdefsfile with the rest. > > Thu Oct 8 21:55:52 1992 Richard Stallman (rms@mole.gnu.ai.mit.edu) > > * Makefile.in (dist): Put configure.bat in the distribution. > > Thu Oct 1 09:16:24 1992 David J. MacKenzie (djm@goldman.gnu.ai.mit.edu) > > * Makefile.in (install): cd to $(srcdir) before installing info files. > > Wed Sep 30 17:18:39 1992 Richard Stallman (rms@mole.gnu.ai.mit.edu) > > * Makefile.in (files.o): Supply $(DEFS), and $(CPPFLAGS). > Changes between 2.2 and 1.19-3 - version.c : change version name to (bison version-bison++ release), ie bison++-1.19-3 - Notes.txt : creation of this file, with mail transaction version 2.2 sent to compiler.ieec.com 4 may 93 A Coetmeur (coetmeur@icdc.fr). patch 2.2 *system.h getopt.c bison.cc : define _MSDOS if old fashionned MSDOS if defined *bison.cc: define _MSDOS if turbo C __MSDOS__ *bison.cc : include malloc.h if turboC *file.c : use _tempname instead of mktemp on DOS *file.c : delete forgoten temp file on DOS and VMS 3 may 93 A Coetmeur (coetmeur@icdc.fr). patch 2.1 *bison.h bison.cc:pb with YY_@_PARSE_PARAM, never defaultly-defined in c++/class, neither in stdc. Same change in bison.h and .cc. *files.c: -S option, and -H option inoperant because test is stupidely inverted. corrected. *files.h reader.c output.c : backquote not quoted in filename (dos). created function -> quoted_filename(). *reader.c : (int)0 passed to set_parser, instead of NULL, caused bug on DOS 16bit. Corrected in parse_define(). *bison.cc bison.h : %define LLOC not defined by default 24 Feb 93 Alain Coetmeur (coetmeur@icdc.fr ) *modifying all to support C++, and generate classes... *Option -H and -S to impose skeleton and header skeleton *use a header skeleton. *cut the 2 skeletons in many section separated by $ *put much output from reader to output.c *prefix shoul not be used with classes, though do work in C *semantic parser not to be used, not supported *version 2.0 alpha, proposed ??? *bison++.1 manpage made. modification are descripted. * C++ comment supported * #line automaticaly added in skeleton * coherent with flex++ version proposed by same author Fri Sep 25 18:06:28 1992 Richard Stallman (rms@mole.gnu.ai.mit.edu) * Version 1.19 released. * reader.c (parse_union_decl): Fix ending of C++ comment; don't lose the char after the newline. * configure.bat: New file. Thu Sep 24 16:23:15 1992 Richard Stallman (rms@mole.gnu.ai.mit.edu) * conflicts.c: Check for using alloca.h as getopt.c does. Sun Sep 6 08:01:53 1992 Karl Berry (karl@hayley) * files.c (openfiles): open `fdefines' after we have assigned a name to `tmpdefsfile', and only if `definesflag' is set. (done): only create the real .tab.h file if `definesflag' is set. * reader.c (packsymbols): don't close `fdefines' here. Sat Sep 5 15:02:11 1992 Richard Stallman (rms@mole.gnu.ai.mit.edu) * files.c (openfiles): Open fdefines as temp file, like ftable. (done): Copy temp defines file to real one, like main output file. Fri Aug 21 12:47:48 1992 Richard Stallman (rms@mole.gnu.ai.mit.edu) * Makefile.in (dist): Don't release mergedir.awk (install): Use sed, not awk. Don't depend on mergedir.awk. * mergedir.awk: File effectively deleted. Wed Jul 29 00:53:25 1992 Richard Stallman (rms@mole.gnu.ai.mit.edu) * bison.simple: Test __sparc along with __sparc__. Sat Jul 11 14:08:33 1992 Richard Stallman (rms@mole.gnu.ai.mit.edu) * lex.c (skip_white_space): Count \n just once at end of c++ comment. Fri Jun 26 00:00:30 1992 Richard Stallman (rms@mole.gnu.ai.mit.edu) * bison.simple: Comment fix; #line command updated. Wed Jun 24 15:12:42 1992 Richard Stallman (rms@mole.gnu.ai.mit.edu) * Makefile.in (install): Specify full new file name for the executable. Mon Jun 22 16:38:24 1992 Richard Stallman (rms@mole.gnu.ai.mit.edu) * Makefile.in (dist): Include bison.rnh in distribution. Sun Jun 21 22:42:13 1992 Eric Youngdale (youngdale@v6550c.nrl.navy.mil) Clean up rough edges in VMS port of bison, add support for remaining command line options. * bison.cld: Add /version, /yacc, /file_prefix, and /name_prefix switches. * build.com: General cleanup: add logic to automatically sense which C compiler is present; add code to cwd to the directory that contains bison sources; do not define XPFILE, XPFILE1 (correct defaults are applied in file.c). * files.c: Append _tab, not .tab when using /file_prefix under VMS. * system.h: Include string.h instead of strings.h (a la USG). * vmsgetargs.c: Add support for all switches added to bison.cld. Sun Jun 21 15:53:26 1992 Richard Stallman (rms@mole.gnu.ai.mit.edu) * Makefile.in (install): Always specify new file name for install. Redirect awk output to temp file and install that. Wed May 27 22:27:50 1992 Richard Stallman (rms@mole.gnu.ai.mit.edu) * bison.simple (yyparse): Make yybackup and yyerrlab1 always be used. Fri May 22 14:58:42 1992 Richard Stallman (rms@mole.gnu.ai.mit.edu) * Makefile.in (dist): Depend on bison.info (bison.info): Delete spurious <. Sun May 17 21:48:55 1992 Richard Stallman (rms@mole.gnu.ai.mit.edu) * Makefile.in (.c.o): New rule. Use $(DEFS) directly. (CFLAGS): Use just -g by default. (CDEBUG): Variable deleted. Thu May 7 00:03:37 1992 Richard Stallman (rms@mole.gnu.ai.mit.edu) * reader.c (copy_guard): Fix typo skipping comment. Mon May 4 01:23:21 1992 Richard Stallman (rms@mole.gnu.ai.mit.edu) * Version 1.18. * getargs.c (getargs): Change '0' to 0 in case for long options. Sun Apr 19 10:17:52 1992 Richard Stallman (rms@mole.gnu.ai.mit.edu) * reader.c (packsymbols): Handle -p when declaring yylval. Sat Apr 18 18:18:48 1992 Richard Stallman (rms@mole.gnu.ai.mit.edu) * output.c (output_gram): Output #endif properly at end of decl. Mon Mar 30 01:13:41 1992 Richard Stallman (rms@mole.gnu.ai.mit.edu) * Version 1.17. * Makefile.in (clean): Don't delete configuration files or TAGS. (distclean): New target; do delete those. Sat Mar 28 17:18:50 1992 Richard Stallman (rms@mole.gnu.ai.mit.edu) * output.c (output_gram): Conditionalize yyprhs on YYDEBUG. * LR0.c (augment_automaton): If copying sp->shifts to insert new shift, handle case of inserting at end. Sat Mar 21 23:25:47 1992 Richard Stallman (rms@mole.gnu.ai.mit.edu) * lex.c (skip_white_space): Handle C++ comments. * reader.c (copy_definition, parse_union_decl, copy_guard): (copy_action): Likewise. Sun Mar 8 01:22:21 1992 Richard Stallman (rms@mole.gnu.ai.mit.edu) * bison.simple (YYPOPSTACK): Fix typo. Sat Feb 29 03:53:06 1992 Richard Stallman (rms@mole.gnu.ai.mit.edu) * Makefile.in (install): Install bison.info* files one by one. Fri Feb 28 19:55:30 1992 David J. MacKenzie (djm@wookumz.gnu.ai.mit.edu) * bison.1: Document long options as starting with `--', not `+'. Sat Feb 1 00:08:09 1992 Richard Stallman (rms@mole.gnu.ai.mit.edu) * getargs.c (getargs): Accept value 0 from getopt_long. Thu Jan 30 23:39:15 1992 Richard Stallman (rms@mole.gnu.ai.mit.edu) * Makefile.in (mostlyclean): Renamed from `clean'. (clean): Renamed from 'distclean'. Dep on mostlyclean, not realclean. (realclean): Dep on clean. Mon Jan 27 21:59:19 1992 Richard Stallman (rms@mole.gnu.ai.mit.edu) * bison.simple: Use malloc, not xmalloc, and handle failure explicitly. Sun Jan 26 22:40:04 1992 Richard Stallman (rms@mole.gnu.ai.mit.edu) * conflicts.c (total_conflicts): Delete unused arg to fprintf. Tue Jan 21 23:17:44 1992 Richard Stallman (rms@mole.gnu.ai.mit.edu) * Version 1.16. Mon Jan 6 16:50:11 1992 Richard Stallman (rms at mole.gnu.ai.mit.edu) * Makefile (distclean): Depend on clean, not realclean. Don't rm TAGS. (realclean): rm TAGS here. * symtab.c (free_symtab): Don't free the type names. Sun Dec 29 22:25:40 1991 Richard Stallman (rms at mole.gnu.ai.mit.edu) * machine.h: MSDOS has 32-bit ints if __GO32__. Wed Dec 25 22:09:07 1991 David J. MacKenzie (djm at wookumz.gnu.ai.mit.edu) * bison.simple [_AIX]: Indent `#pragma alloca', so old C compilers don't choke on it. Mon Dec 23 02:10:16 1991 Richard Stallman (rms at mole.gnu.ai.mit.edu) * getopt.c, getopt1.c, getopt.h: Link them to standard source location. * alloca.c: Likewise. * Makefile.in (dist): Copy those files from current dir. * getargs.c: Update usage message. * LR0.c (augment_automaton): Put new shift in proper order. Fri Dec 20 18:39:20 1991 Richard Stallman (rms at mole.gnu.ai.mit.edu) * conflicts.c: Use memcpy if ANSI C library. * closure.c (set_fderives): Delete redundant assignment to vrow. * closure.c (print_firsts): Fix bounds and offset checking tags. * closure.c (tags): Declare just once at start of file. * LR0.c (allocate_itemsets): Eliminate unused var max. (augment_automaton): Test sp is non-null. * lalr.c (initialize_LA): Make the vectors at least 1 element long. * reader.c (readgram): Remove separate YYSTYPE default for MSDOS. Wed Dec 18 02:40:32 1991 Richard Stallman (rms at mole.gnu.ai.mit.edu) * print.c (print_grammar): Don't print disabled rules. Tue Dec 17 03:48:07 1991 Richard Stallman (rms at mole.gnu.ai.mit.edu) * lex.c (lex): Parse hex escapes properly. Handle \v when filling token_buffer. * lex.c: Include new.h. (token_buffer): Change to a pointer. (init_lex): Allocate initial buffer. (grow_token_buffer): New function. (lex, parse_percent_token): Use that. * reader.c (read_declarations): Call open_extra_files just once. (parse_token_decl): Don't free previous typename value. Don't increment nvars if symbol is already a nonterminal. (parse_union_decl): Catch unmatched close-brace. (parse_expect_decl): Null-terminate buffer. (copy_guard): Set brace_flag for {, not for }. * reader.c: Fix %% in calls to fatal. * reader.c (token_buffer): Just one extern decl, at top level. Declare as pointer. * symtab.c (free_symtab): Free type_name fields. Free symtab itself. Mon Nov 25 23:04:31 1991 Richard Stallman (rms at mole.gnu.ai.mit.edu) * bison.simple: Handle alloca for AIX. * Makefile.in (mandir): Compute default using manext. Sat Nov 2 21:39:32 1991 David J. MacKenzie (djm at wookumz.gnu.ai.mit.edu) * Update all files to GPL version 2. Fri Sep 6 01:51:36 1991 Richard Stallman (rms at mole.gnu.ai.mit.edu) * bison.simple (__yy_bcopy): Use builtin if GCC version 2. Mon Aug 26 22:09:12 1991 Richard Stallman (rms at mole.gnu.ai.mit.edu) * reader.c (parse_assoc_decl): Error if same symbol gets two precs. Mon Aug 26 16:42:09 1991 David J. MacKenzie (djm at pogo.gnu.ai.mit.edu) * Makefile.in, configure: Only put $< in Makefile if using VPATH, because older makes don't understand it. Fri Aug 23 00:05:54 1991 David J. MacKenzie (djm at apple-gunkies) * conflicts.c [_AIX]: #pragma alloca. * reduce.c: Don't define TRUE and FALSE if already defined. Mon Aug 12 22:49:58 1991 Richard Stallman (rms at mole.gnu.ai.mit.edu) * Makefile.in: Add deps on system.h. (install): Add some deps. Fri Aug 2 12:19:20 1991 David J. MacKenzie (djm at apple-gunkies) * Makefile.in (dist): Include texinfo.tex. * configure: Create config.status. Remove it and Makefile if interrupted while creating them. Thu Aug 1 23:14:01 1991 David J. MacKenzie (djm at apple-gunkies) * configure: Check for +srcdir etc. arg and look for Makefile.in in that directory. Set VPATH if srcdir is not `.'. * Makefile.in (prefix): Renamed from DESTDIR. Wed Jul 31 21:29:47 1991 Richard Stallman (rms at mole.gnu.ai.mit.edu) * print.c (print_grammar): Make output prettier. Break lines. Tue Jul 30 22:38:01 1991 Richard Stallman (rms at mole.gnu.ai.mit.edu) * print.c (print_grammar): New function. (verbose): Call it instead of printing token names here. Mon Jul 22 16:39:54 1991 Richard Stallman (rms at mole.gnu.ai.mit.edu) * vmsgetargs.c (spec_name_prefix, spec_file_prefix): Define variables. Wed Jul 10 01:38:25 1991 David J. MacKenzie (djm at wookumz.gnu.ai.mit.edu) * configure, Makefile.in: $(INSTALLPROG) -> $(INSTALL), $(INSTALLTEXT) -> $(INSTALLDATA). Tue Jul 9 00:53:58 1991 David J. MacKenzie (djm at wookumz.gnu.ai.mit.edu) * bison.simple: Don't include malloc.h if __TURBOC__. Sat Jul 6 15:18:12 1991 David J. MacKenzie (djm at geech.gnu.ai.mit.edu) * Replace Makefile with configure and Makefile.in. Update README with current compilation instructions. Mon Jul 1 23:12:20 1991 Richard Stallman (rms at mole.gnu.ai.mit.edu) * reader.c (reader): Make the output define YYBISON. Thu Jun 20 16:52:51 1991 David J. MacKenzie (djm at geech.gnu.ai.mit.edu) * Makefile (MANDIR, MANEXT): Install man page in /usr/local/man/man1/bison.1 by default, instead of /usr/man/manl/bison.l, for consistency with other GNU programs. * Makefile: Rename BINDIR et al. to lowercase to conform to GNU coding standards. (install): Make man page non-executable. Fri May 31 23:22:13 1991 Richard Stallman (rms at mole.gnu.ai.mit.edu) * Makefile (bison.info): New target. (realclean): New target. Thu May 2 16:36:19 1991 Richard Stallman (rms at mole.gnu.ai.mit.edu) * bison.simple: Use YYPRINT to print a token, if it's defined. Mon Apr 29 12:22:55 1991 Richard Stallman (rms at mole.gnu.ai.mit.edu) * lalr.c (transpose): Rename R to R_arg. (initialize_LA): Avoid shadowing variable j. * reader.c (packsymbols): Avoid shadowing variable i. * files.c: Declare exit and perror. * machine.h: Define MAXSHORT and MINSHORT for the eta-10. Tue Apr 2 20:49:12 1991 Richard Stallman (rms at mole.gnu.ai.mit.edu) * allocate.c (mallocate): Always allocate at least one byte. Tue Mar 19 22:17:19 1991 Richard Stallman (rms at mole.gnu.ai.mit.edu) * Makefile (dist): Put alloca.c into distribution. Wed Mar 6 17:45:42 1991 Richard Stallman (rms at mole.ai.mit.edu) * print.c (print_actions): Nicer output for final states. Thu Feb 21 20:39:53 1991 Richard Stallman (rms at mole.ai.mit.edu) * output.c (output_rule_data): Break lines in yytline based on hpos. Thu Feb 7 12:54:36 1991 Richard Stallman (rms at mole.ai.mit.edu) * bison.simple (yyparse): Move decl of yylsa before use. Tue Jan 15 23:41:33 1991 Richard Stallman (rms at mole.ai.mit.edu) * Version 1.14. * output.c (output_rule_data): Handle NULL in tags[i]. Fri Jan 11 17:27:24 1991 Richard Stallman (rms at mole.ai.mit.edu) * bison.simple: On MSDOS, include malloc.h. Sat Dec 29 19:59:55 1990 David J. MacKenzie (djm at wookumz.ai.mit.edu) * files.c: Use `mallocate' instead of `xmalloc' so no extra decl is needed. Wed Dec 19 18:31:21 1990 Richard Stallman (rms at mole.ai.mit.edu) * reader.c (readgram): Alternate YYSTYPE defn for MSDOS. * files.c [MSDOS]: Declare xmalloc. Thu Dec 13 12:45:54 1990 Richard Stallman (rms at mole.ai.mit.edu) * output.c (output_rule_data): Put all symbols in yytname. * bison.simple (yyparse): Delete extra fprintf arg when printing a result of reduction. Mon Dec 10 13:55:15 1990 Richard Stallman (rms at mole.ai.mit.edu) * reader.c (packsymbols): Don't declare yylval if pure_parser. Tue Oct 30 23:38:09 1990 Richard Stallman (rms at mole.ai.mit.edu) * Version 1.12. * LR0.c (augment_automaton): Fix bugs adding sp2 to chain of shifts. Tue Oct 23 17:41:49 1990 Richard Stallman (rms at mole.ai.mit.edu) * bison.simple: Don't define alloca if already defined. Sun Oct 21 22:10:53 1990 Richard Stallman (rms at mole.ai.mit.edu) * getopt.c: On VMS, use string.h. * main.c (main): Return type int. Mon Sep 10 16:59:01 1990 Richard Stallman (rms at mole.ai.mit.edu) * output.c (output_headers): Output macro defs for -p. * reader.c (readgram): Handle consecutive actions. * getargs.c (getargs): Rename -a to -p. * files.c (openfiles): Change names used for -b. Mon Aug 27 00:30:15 1990 Richard Stallman (rms at mole.ai.mit.edu) * reduce.c (reduce_grammar_tables): Don't map rlhs of disabled rule. Sun Aug 26 13:43:32 1990 Richard Stallman (rms at mole.ai.mit.edu) * closure.c (print_firsts, print_fderives): Use BITISSET to test bits. Thu Aug 23 22:13:40 1990 Richard Stallman (rms at mole.ai.mit.edu) * closure.c (print_firsts): vrowsize => varsetsize. (print_fderives): rrowsize => rulesetsize. Fri Aug 10 15:32:11 1990 Richard Stallman (rms at sugar-bombs.ai.mit.edu) * bison.simple (alloca): Don't define if already defined. (__yy_bcopy): Alternate definition for C++. Wed Jul 11 00:46:03 1990 David J. MacKenzie (djm at albert.ai.mit.edu) * getargs.c (getargs): Mention +yacc in usage message. Tue Jul 10 17:29:08 1990 Richard Stallman (rms at sugar-bombs.ai.mit.edu) * reader.c (parse_token_decl, copy_action): Set value_components_used if appropriate. (readgram): Inhibit output of YYSTYPE definition in that case. Sat Jun 30 13:47:57 1990 Richard Stallman (rms at sugar-bombs.ai.mit.edu) * output.c (output_parser): Define YYPURE if pure, and not otherwise. Don't define YYIMPURE. * bison.simple: Adjust conditionals accordingly. * bison.simple (YYLEX): If locations not in use, don't pass &yylloc. Thu Jun 28 12:32:21 1990 Richard Stallman (rms at sugar-bombs.ai.mit.edu) * getargs.c (longopts): Add `yacc'. Thu Jun 28 00:40:21 1990 David J. MacKenzie (djm at apple-gunkies) * getargs.c (getargs): Add long options. * Makefile: Link with getopt1.o and add getopt1.c and getopt.h to dist. * Move version number and description back into version.c from Makefile and getargs.c. * Makefile (dist): Extract version number from version.c. Tue Jun 26 13:16:35 1990 Richard Stallman (rms at sugar-bombs.ai.mit.edu) * output.c (output): Always call output_gram. * bison.simple (yyparse): Print rhs and lhs symbols of reduction rule. Thu Jun 21 00:15:40 1990 David J. MacKenzie (djm at albert.ai.mit.edu) * main.c: New global var `program_name' to hold argv[0] for error messages. * allocate.c, files.c, getargs.c, reader.c: Use `program_name' in messages instead of hardcoded "bison". Wed Jun 20 23:38:34 1990 David J. MacKenzie (djm at albert.ai.mit.edu) * Makefile: Specify Bison version here. Add rule to pass it to version.c. Encode it in distribution directory and tar file names. * version.c: Use version number from Makefile. * getargs.c (getargs): Print additional text that used to be part of version_string in version.c. Use -V instead of -version to print Bison version info. Print a usage message and exit if given an invalid option. Tue Jun 19 01:15:18 1990 Richard Stallman (rms at sugar-bombs.ai.mit.edu) * bison.simple: Fix a #line. * Makefile (INSTALL): New parameter. (install): Use that. (CFLAGS): Move definition to top. Sun Jun 17 17:10:21 1990 Richard Stallman (rms at sugar-bombs.ai.mit.edu) * reader.c (parse_type_decl): Ignore semicolon. Remove excess % from error messages. Sat Jun 16 19:15:48 1990 Richard Stallman (rms at sugar-bombs.ai.mit.edu) * Version 1.11. * Makefile (install): Ensure installed files readable. Tue Jun 12 12:50:56 EDT 1990 Jay Fenlason (hack@ai.mit.edu) * getargs.c: Declare spec_file_prefix * lex.c (lex): \a is '\007' instead of '007' * reader.c: include machine.h * files.h: Declare extern spec_name_prefix. Trivial patch from Thorsten Ohl (td12@ddagsi3.bitnet) Thu May 31 22:00:16 1990 Richard Stallman (rms at sugar-bombs.ai.mit.edu) * Version 1.10. * bison.simple (YYBACKUP, YYRECOVERING): New macros. (YYINITDEPTH): This is what used to be YYMAXDEPTH. (YYMAXDEPTH): This is what used to be YYMAXLIMIT. If the value is 0, use the default instead. (yyparse): Return 2 on stack overflow. Wed May 30 21:09:07 1990 Richard Stallman (rms at sugar-bombs.ai.mit.edu) * bison.simple (YYERROR): Jump to new label; don't print error message. (yyparse): Define label yyerrlab1. Wed May 16 13:23:58 1990 Richard Stallman (rms at sugar-bombs.ai.mit.edu) * files.c (openfiles): Support -b. * getargs.c (getargs): Likewise. * reader.c (readgram): Error if too many symbols. * lex.c (lex): Handle \a. Make error msgs more reliable. * reader.c (read_declarations): Make error msgs more reliable. Sun May 13 15:03:37 1990 Richard Stallman (rms at sugar-bombs.ai.mit.edu) * Version 1.09. * reduce.c (reduce_grammar_tables): Fix backward test. Sat May 12 21:05:34 1990 Richard Stallman (rms at sugar-bombs.ai.mit.edu) * Makefile (bison-dist.*): Rename targets and files to bison.*. (bison.tar): Make tar file to unpack into subdirectory named `bison'. Mon Apr 30 03:46:58 1990 Richard Stallman (rms at sugar-bombs.ai.mit.edu) * reduce.c (reduce_grammar_tables): Set rlhs to -1 for useless rules. * nullable.c (set_nullable): Ignore those rules. * derives.c (set_derives): Likewise. Mon Apr 23 15:16:09 1990 Richard Stallman (rms at sugar-bombs.ai.mit.edu) * bison.simple (yyparse): Mention rule number as well as line number. Thu Mar 29 00:00:43 1990 Richard Stallman (rms at sugar-bombs.ai.mit.edu) * bison.simple (__yy_bcopy): New function. (yyparse): Use that, not bcopy. Wed Mar 28 15:23:51 1990 Richard Stallman (rms at sugar-bombs.ai.mit.edu) * print.c (print_actions): Don't alter i and j spuriously when errp==0. Mon Mar 12 16:22:18 1990 Jim Kingdon (kingdon at pogo.ai.mit.edu) * bison.simple [__GNUC__]: Use builtin_alloca. Wed Mar 7 21:11:36 1990 Richard Stallman (rms at sugar-bombs.ai.mit.edu) * Makefile (install): Use mergedir.awk to process bison.simple for installation. * bison.simple (yyparse): New feature to include possible valid tokens in parse error message. Sat Mar 3 14:10:56 1990 Richard Stallman (rms at geech) * Version 1.08. Mon Feb 26 16:32:21 1990 Jim Kingdon (kingdon at pogo.ai.mit.edu) * print.c (print_actions) conflicts.c (print_reductions): Change "shift %d" to "shift, and go to state %d" and "reduce %d" to "reduce using rule %d" and "goto %d" to "go to state %d". print.c (print_core): Change "(%d)" to "(rule %d)". Tue Feb 20 14:22:47 EST 1990 Jay Fenlason (hack @ wookumz.ai.mit.edu) * bison.simple: Comment out unused yyresume: label. Fri Feb 9 16:14:34 EST 1990 Jay Fenlason (hack @ wookumz.ai.mit.edu) * bison.simple : surround all declarations and (remaining) uses of yyls* and yylloc with #ifdef YYLSP_NEEDED This will significantly cut down on stack usage, and gets rid of unused-variable msgs from GCC. Wed Jan 31 13:06:08 1990 Richard Stallman (rms at sugar-bombs.ai.mit.edu) * files.c (done) [VMS]: Don't delete files that weren't used. [VMS]: Let user override XPFILE and XPFILE1. Wed Jan 3 15:52:28 1990 Richard Stallman (rms at sugar-bombs.ai.mit.edu) * Version 1.07. Sat Dec 16 15:50:21 1989 Richard Stallman (rms at sugar-bombs.ai.mit.edu) * gram.c (dummy): New function. * reader.c (readgram): Detect error if two consec actions. Wed Nov 15 02:06:08 1989 Richard Stallman (rms at sugar-bombs.ai.mit.edu) * reduce.c (reduce_grammar_tables): Update rline like other tables. * Makefile (install): Install the man page. Sat Nov 11 03:21:58 1989 Richard Stallman (rms at sugar-bombs.ai.mit.edu) * output.c (output_rule_data): Write #if YYDEBUG around yyrline. Wed Oct 18 13:07:55 1989 Richard Stallman (rms at sugar-bombs.ai.mit.edu) * Version 1.06. * vmsgetargs.c (getargs): Downcase specified output file name. Fri Oct 13 17:48:14 1989 Richard Stallman (rms at sugar-bombs.ai.mit.edu) * reader.c (readgram): Warn if there is no default to use for $$ and one is needed. Fri Sep 29 12:51:53 1989 Richard Stallman (rms at sugar-bombs.ai.mit.edu) * Version 1.05. * vmsgetargs.h (getargs): Process outfile option. Fri Sep 8 03:05:14 1989 Richard Stallman (rms at sugar-bombs.ai.mit.edu) * Version 1.04. * reader.c (parse_union_decl): Count newlines even in comments. Wed Sep 6 22:03:19 1989 Richard Stallman (rms at sugar-bombs.ai.mit.edu) * files.c (openfiles): short_base_length was always == base_length. Thu Aug 24 16:55:06 1989 Richard Stallman (rms at apple-gunkies.ai.mit.edu) * Version 1.03. * files.c (openfiles): Write output into same dir as input, by default. Wed Aug 23 15:03:07 1989 Jay Fenlason (hack at gnu) * Makefile: Include system.h in bison-dist.tar Tue Aug 15 22:30:42 1989 Richard Stallman (rms at hobbes.ai.mit.edu) * version 1.03. * reader.c (reader): Output LTYPESTR to fdefines only after reading the grammar. Sun Aug 6 16:55:23 1989 Richard Stallman (rms at sugar-bombs.ai.mit.edu) * reader.c (read_declarations): Put space before comment to avoid bug in Green Hills C compiler. Mon Jun 19 20:14:01 1989 Richard Stallman (rms at sugar-bombs.ai.mit.edu) * allocate.c (xmalloc): New function. Fri Jun 16 23:59:40 1989 Richard Stallman (rms at sugar-bombs.ai.mit.edu) * build.com: Compile and link reduce.c. Fri Jun 9 23:00:54 1989 Richard Stallman (rms at sugar-bombs.ai.mit.edu) * reduce.c (reduce_grammar_tables): Adjust start_symbol when #s change. Sat May 27 17:57:29 1989 Richard Stallman (rms at sugar-bombs.ai.mit.edu) * reader.c (copy_definition, copy_guard): Don't object to \-newline inside strings. Mon May 22 12:30:59 1989 Richard Stallman (rms at sugar-bombs.ai.mit.edu) * files.c (openfiles): Alternate file names for MSDOS. (open_extra_files): Likewise. (done): On MSDOS, unlink temp files here, not in openfiles. * machine.h (BITS_PER_WORD): 16 on MSDOS. (MAXTABLE): Now defined in this file. * system.h: New file includes system-dependent headers. All relevant .c files include it. Thu Apr 27 17:00:47 1989 Richard Stallman (rms at sugar-bombs.ai.mit.edu) * version.c: Version 1.01. Tue Apr 18 12:46:05 1989 Randall Smith (randy at apple-gunkies.ai.mit.edu) * conflicts.c (total_conflicts): Fixed typo in yacc style output; mention conflicts if > 0. Sat Apr 15 17:36:18 1989 Richard Stallman (rms at sugar-bombs.ai.mit.edu) * reader.c (packsymbols): Start new symbols after 256. Wed Apr 12 14:09:09 1989 Richard Stallman (rms at sugar-bombs.ai.mit.edu) * reader.c (reader): Always assign code 256 to `error' token. Always set `translations' to 1 so this code gets handled. * bison.simple (YYERRCODE): Define it. Tue Apr 11 19:26:32 1989 Richard Stallman (rms at sugar-bombs.ai.mit.edu) * conflicts.c: If GNU C, use builtin alloca. * Makefile (install): Delete parser files before copying them. Thu Mar 30 13:51:17 1989 Richard Stallman (rms at sugar-bombs.ai.mit.edu) * getargs.c (getargs): Turn off checking of name Bison was invoked by. * Makefile (dist): Include ChangeLog in distrib. Thu Mar 23 15:19:41 1989 Jay Fenlason (hack at apple-gunkies.ai.mit.edu) * LR0.c closure.c conflicts.c derives.c files.c getargs.c lalr.c lex.c main.c nullable.c output.c print.c reader.c reduce.c symtab.c warshall.c: A first pass at getting gcc -Wall to shut up. Mostly declared functions as void, etc. * reduce.c moved 'extern int fixed_outfiles;' into print_notices() where it belongs. Wed Mar 1 12:33:28 1989 Randall Smith (randy at apple-gunkies.ai.mit.edu) * types.h, symtab.h, state.h, new.h, machine.h, lex.h, gram.h, files.h, closure.c, vmsgetargs.c, warshall.c, symtab.c, reduce.c, reader.c, print.c, output.c, nullable.c, main.c, lex.c, lalr.c, gram.c, getargs.c, files.c, derives.c, conflicts.c, allocate.c, LR0.c, Makefile, bison.simple: Changed copyright notices to be in accord with the new General Public License. * COPYING: Made a link to the new copying file. Wed Feb 22 06:18:20 1989 Richard Stallman (rms at sugar-bombs.ai.mit.edu) * new.h (FREE): Alternate definition for __STDC__ avoids error if `free' returns void. Tue Feb 21 15:03:34 1989 Richard Stallman (rms at sugar-bombs.ai.mit.edu) * reader.c (read_declarations): Double a `%' in a format string. (copy_definition, parse_start_decl, parse_token_decl): Likewise. (parse_type_decl, parse_union_decl, copy_guard, readgram, get_type). (copy_action): change a `fatal' to `fatals'. * lalr.c (map_goto): Initial high-end of binary search was off by 1. Sat Feb 18 08:49:57 1989 Richard Stallman (rms at sugar-bombs.ai.mit.edu) * bison.simple [sparc]: Include alloca.h. Wed Feb 15 06:24:36 1989 Richard Stallman (rms at sugar-bombs.ai.mit.edu) * reader.c (packsymbols): Write decl of yylval into .tab.h file. Sat Jan 28 18:19:05 1989 Richard Stallman (rms at sugar-bombs.ai.mit.edu) * bison.simple: Avoid comments on `#line' lines. * reader.c (LTYPESTR): Rearrange to avoid whitespace after \-newline. Mon Jan 9 18:43:08 1989 Richard Stallman (rms at sugar-bombs.ai.mit.edu) * conflicts.c (total_conflicts): if -y, use output syntax POSIX wants. * reduce.c (print_notices): likewise. * lex.c (lex): Handle \v, and \x hex escapes. * reader.c (reader): Merge output_ltype into here. Don't output YYLTYPE definition to .tab.h file unless the @ construct is used. * bison.simple: Define YYERROR, YYABORT, YYACCEPT here. * reader.c (output_ltype): Don't output them here. * bison.simple: YYDEBUG now should be 0 or 1. * output.c (output): For YYDEBUG, output conditional to define it only if not previously defined. Mon Jan 2 11:29:55 1989 Richard Stallman (rms at sugar-bombs.ai.mit.edu) * bison.simple (yyparse) [YYPURE]: Add local yynerrs. (yydebug): Declare global, but don't initialize, regardless of YYPURE. (yyparse): Don't declare yydebug here. Thu Dec 22 22:01:22 1988 Richard Stallman (rms at sugar-bombs.ai.mit.edu) * reduce.c (print_notices): Typo in message. Sun Dec 11 11:32:07 1988 Richard Stallman (rms at sugar-bombs.ai.mit.edu) * output.c (pack_table): Free only nonzero the elts of froms & tos. Thu Dec 8 16:26:46 1988 Richard Stallman (rms at sugar-bombs.ai.mit.edu) * gram.c (rprecsym): New vector indicates the %prec symbol for a rule. * reader.c (packgram): Allocate it and fill it in. * reduce.c (inaccessable_symbols): Use it to set V1. * reduce.c (print_results): Don't complain about useless token if it's in V1. Mon Dec 5 14:33:17 1988 Richard Stallman (rms at sugar-bombs.ai.mit.edu) * machine.h (RESETBIT, BITISSET): New macros. (SETBIT, WORDSIZE): Change to use BITS_PER_WORD. * reduce.c: New file, by David Bakin. Reduces the grammar. * Makefile: Compile it, link it, put it in dist. * main.c (main): Call reduce_grammar (in reduce.c). Thu Nov 17 18:33:04 1988 Richard Stallman (rms at sugar-bombs.ai.mit.edu) * conflicts.c: Don't declare alloca if including alloca.h. * bison.cld: Define qualifiers `nolines', `debug'. * vmsgetargs.c (getargs): Handle them. * output.c (output_program): Notice `nolinesflag'. * output.c (output_parser): Simplify logic for -l and #line. Avoid writing EOF char into output. Wed Oct 12 18:00:03 1988 Richard Stallman (rms at sugar-bombs.ai.mit.edu) * Implement `-l' option. * getopt.c: Set flag `nolinesflag'. * reader.c (copy_definition, parse_union_decl, copy_guard, copy_action) Obey that flag; don't generate #line. * output.c (output_parser): Discard #line's when copying the parser. Mon Sep 12 16:33:17 1988 Richard Stallman (rms at sugar-bombs.ai.mit.edu) * reader.c (copy_guard): Fix brace-counting for brace-surrounded guard. Thu Sep 8 20:09:53 1988 Richard Stallman (rms at sugar-bombs.ai.mit.edu) * bison.simple: Correct number in #line command. (yyparse): Call YYABORT instead of YYERROR, due to last change in output_ltype. Mon Sep 5 14:55:30 1988 Richard Stallman (rms at sugar-bombs.ai.mit.edu) * Makefile: New variable LIBS. Alternatives for USG. * conflicts.c [USG]: Define bcopy. * symtab.c [USG]: Include string.h instead of strings.h. * conflicts.c [sparc]: Include alloca.h. Tue Aug 2 08:38:38 1988 Richard Stallman (rms at sugar-bombs.ai.mit.edu) * reader.c (parse_token_decl): Ignore commas. Sat Jun 25 10:29:20 1988 Richard Stallman (rms at sugar-bombs.ai.mit.edu) * reader.c (output_ltype): Make YYERROR yacc-compatible (like YYFAIL). Fri Jun 24 11:25:11 1988 Richard Stallman (rms at sugar-bombs.ai.mit.edu) * getargs.c (getargs): -t sets debugflag. Eliminate upper case duplicate options. * output.c (output): If debugflag, output `#define YYDEBUG'. Thu May 26 06:04:21 1988 Richard Stallman (rms at frosted-flakes.ai.mit.edu) * allocate.c (mallocate): New name for `allocate' (which loses in VMS). Calls changed in LR0.c, conflicts.c, symtab.c, new.h. * getargs.c (getargs): If argv[0] is "yacc", set fixed_outfiles. Tue May 17 12:15:30 1988 Richard Stallman (rms at frosted-flakes.ai.mit.edu) * conflicts.c: Declare alloca. * reader.c: Declare realloc. * warshall.c (TC): Fix one arithmetic op that was omitted last time. Thu May 5 14:36:03 1988 Richard Stallman (rms at frosted-flakes.ai.mit.edu) * bison.simple: Conditionalize most refs to yylsp on YYLSP_NEEDED. * reader.c (copy_guard, copy_action): Notice if `@' is used. (reader): If it was, output `#define YYLSP_NEEDED'. Mon Apr 18 04:54:32 1988 Richard Stallman (rms at rice-krispies.ai.mit.edu) * bison.simple: New variable yynerr counts calls to yyerror. * lex.c (lex, case '='): Update lineno when skipping a newline. * reader.c (parse_expect_decl): ungetc the char that ends the number; don't read any further. This handles multi-line comments right and avoids incorrect lineno. * reader.c: Delete duplicate decl of symval. * warshall.c (RTC, TC): Cast ptrs to char *, not unsigned, for arith. Local Variables: mode: indented-text left-margin: 8 fill-column: 76 version-control: never End: dibbler-1.0.1/bison++/print.cc0000664000175000017500000001703712233256142012752 00000000000000/* Print information on generated parser, for bison, Copyright (C) 1984, 1986, 1989 Free Software Foundation, Inc. This file is part of Bison, the GNU Compiler Compiler. Bison 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. Bison 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 Bison; see the file COPYING. If not, write to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ #include #include "system.h" #include "machine.h" #include "new.h" #include "files.h" #include "gram.h" #include "state.h" extern char **tags; extern int nstates; extern short *accessing_symbol; extern core **state_table; extern shifts **shift_table; extern errs **err_table; extern reductions **reduction_table; extern char *consistent; extern char any_conflicts; extern char *conflicts; extern int final_state; extern void conflict_log(); extern void verbose_conflict_log(); extern void print_reductions(int); void print_token(int,int); void print_state(int); void print_core(int); void print_actions(int); void print_grammar(); void terse() { if (any_conflicts) { conflict_log(); } } void verbose() { register int i; if (any_conflicts) verbose_conflict_log(); print_grammar(); for (i = 0; i < nstates; i++) { print_state(i); } } void print_token(int extnum, int token) { fprintf(foutput, " type %d is %s\n", extnum, tags[token]); } void print_state(int state) { fprintf(foutput, "\n\nstate %d\n\n", state); print_core(state); print_actions(state); } void print_core(int state) { register int i; register int k; register int rule; register core *statep; register short *sp; register short *sp1; statep = state_table[state]; k = statep->nitems; if (k == 0) return; for (i = 0; i < k; i++) { sp1 = sp = ritem + statep->items[i]; while (*sp > 0) sp++; rule = -(*sp); fprintf(foutput, " %s -> ", tags[rlhs[rule]]); for (sp = ritem + rrhs[rule]; sp < sp1; sp++) { fprintf(foutput, "%s ", tags[*sp]); } putc('.', foutput); while (*sp > 0) { fprintf(foutput, " %s", tags[*sp]); sp++; } fprintf (foutput, " (rule %d)", rule); putc('\n', foutput); } putc('\n', foutput); } void print_actions(int state) { register int i; register int k; register int state1; register int symbol; register shifts *shiftp; register errs *errp; register reductions *redp; register int rule; shiftp = shift_table[state]; redp = reduction_table[state]; errp = err_table[state]; if (!shiftp && !redp) { if (final_state == state) fprintf(foutput, " $default\taccept\n"); else fprintf(foutput, " NO ACTIONS\n"); return; } if (shiftp) { k = shiftp->nshifts; for (i = 0; i < k; i++) { if (! shiftp->internalShifts[i]) continue; state1 = shiftp->internalShifts[i]; symbol = accessing_symbol[state1]; /* The following line used to be turned off. */ if (ISVAR(symbol)) break; if (symbol==0) /* I.e. strcmp(tags[symbol],"$")==0 */ fprintf(foutput, " $ \tgo to state %d\n", state1); else fprintf(foutput, " %-4s\tshift, and go to state %d\n", tags[symbol], state1); } if (i > 0) putc('\n', foutput); } else { i = 0; k = 0; } if (errp) { int j, nerrs; nerrs = errp->nerrs; for (j = 0; j < nerrs; j++) { if (! errp->internalErrs[j]) continue; symbol = errp->internalErrs[j]; fprintf(foutput, " %-4s\terror (nonassociative)\n", tags[symbol]); } if (j > 0) putc('\n', foutput); } if (consistent[state] && redp) { rule = redp->rules[0]; symbol = rlhs[rule]; fprintf(foutput, " $default\treduce using rule %d (%s)\n\n", rule, tags[symbol]); } else if (redp) { print_reductions(state); } if (i < k) { for (; i < k; i++) { if (! shiftp->internalShifts[i]) continue; state1 = shiftp->internalShifts[i]; symbol = accessing_symbol[state1]; fprintf(foutput, " %-4s\tgo to state %d\n", tags[symbol], state1); } putc('\n', foutput); } } #define END_TEST(end) \ if (column + strlen(buffer) > (end)) \ { fprintf (foutput, "%s\n ", buffer); column = 3; buffer[0] = 0; } \ else void print_grammar() { int i, j; short* rule; char buffer[90]; int column = 0; /* rule # : LHS -> RHS */ fputs("\nGrammar\n", foutput); for (i = 1; i <= nrules; i++) /* Don't print rules disabled in reduce_grammar_tables. */ if (rlhs[i] >= 0) { fprintf(foutput, "rule %-4d %s ->", i, tags[rlhs[i]]); rule = &ritem[rrhs[i]]; if (*rule > 0) while (*rule > 0) fprintf(foutput, " %s", tags[*rule++]); else fputs (" /* empty */", foutput); putc('\n', foutput); } /* TERMINAL (type #) : rule #s terminal is on RHS */ fputs("\nTerminals, with rules where they appear\n\n", foutput); fprintf(foutput, "%s (-1)\n", tags[0]); if (translations) { for (i = 0; i <= max_user_token_number; i++) if (token_translations[i] != 2) { buffer[0] = 0; column = strlen (tags[token_translations[i]]); fprintf(foutput, "%s", tags[token_translations[i]]); END_TEST (50); sprintf (buffer, " (%d)", i); for (j = 1; j <= nrules; j++) { for (rule = &ritem[rrhs[j]]; *rule > 0; rule++) if (*rule == token_translations[i]) { END_TEST (65); sprintf (buffer + strlen(buffer), " %d", j); break; } } fprintf (foutput, "%s\n", buffer); } } else for (i = 1; i < ntokens; i++) { buffer[0] = 0; column = strlen (tags[i]); fprintf(foutput, "%s", tags[i]); END_TEST (50); sprintf (buffer, " (%d)", i); for (j = 1; j <= nrules; j++) { for (rule = &ritem[rrhs[j]]; *rule > 0; rule++) if (*rule == i) { END_TEST (65); sprintf (buffer + strlen(buffer), " %d", j); break; } } fprintf (foutput, "%s\n", buffer); } fputs("\nNonterminals, with rules where they appear\n\n", foutput); for (i = ntokens; i <= nsyms - 1; i++) { int left_count = 0, right_count = 0; for (j = 1; j <= nrules; j++) { if (rlhs[j] == i) left_count++; for (rule = &ritem[rrhs[j]]; *rule > 0; rule++) if (*rule == i) { right_count++; break; } } buffer[0] = 0; fprintf(foutput, "%s", tags[i]); column = strlen (tags[i]); sprintf (buffer, " (%d)", i); END_TEST (0); if (left_count > 0) { END_TEST (50); sprintf (buffer + strlen(buffer), " on left:"); for (j = 1; j <= nrules; j++) { END_TEST (65); if (rlhs[j] == i) sprintf (buffer + strlen(buffer), " %d", j); } } if (right_count > 0) { if (left_count > 0) sprintf (buffer + strlen(buffer), ","); END_TEST (50); sprintf (buffer + strlen(buffer), " on right:"); for (j = 1; j <= nrules; j++) { for (rule = &ritem[rrhs[j]]; *rule > 0; rule++) if (*rule == i) { END_TEST (65); sprintf (buffer + strlen(buffer), " %d", j); break; } } } fprintf (foutput, "%s\n", buffer); } } dibbler-1.0.1/bison++/alloca.c0000664000175000017500000003321212233256142012677 00000000000000/* alloca.c -- allocate automatically reclaimed memory (Mostly) portable public-domain implementation -- D A Gwyn This implementation of the PWB library alloca function, which is used to allocate space off the run-time stack so that it is automatically reclaimed upon procedure exit, was inspired by discussions with J. Q. Johnson of Cornell. J.Otto Tennant contributed the Cray support. There are some preprocessor constants that can be defined when compiling for your specific system, for improved efficiency; however, the defaults should be okay. The general concept of this implementation is to keep track of all alloca-allocated blocks, and reclaim any that are found to be deeper in the stack than the current invocation. This heuristic does not reclaim storage as soon as it becomes invalid, but it will do so eventually. As a special case, alloca(0) reclaims storage without allocating any. It is a good idea to use alloca(0) in your main control loop, etc. to force garbage collection. */ #ifdef HAVE_CONFIG_H #include "config.h" #endif /* If compiling with GCC 2, this file's not needed. */ #if !defined (__GNUC__) || __GNUC__ < 2 /* If someone has defined alloca as a macro, there must be some other way alloca is supposed to work. */ #ifndef alloca #ifdef emacs #ifdef static /* actually, only want this if static is defined as "" -- this is for usg, in which emacs must undefine static in order to make unexec workable */ #ifndef STACK_DIRECTION you lose -- must know STACK_DIRECTION at compile-time #endif /* STACK_DIRECTION undefined */ #endif /* static */ #endif /* emacs */ /* If your stack is a linked list of frames, you have to provide an "address metric" ADDRESS_FUNCTION macro. */ #if defined (CRAY) && defined (CRAY_STACKSEG_END) long i00afunc (); #define ADDRESS_FUNCTION(arg) (char *) i00afunc (&(arg)) #else #define ADDRESS_FUNCTION(arg) &(arg) #endif #if __STDC__ typedef void *pointer; #else typedef char *pointer; #endif #define NULL 0 /* Different portions of Emacs need to call different versions of malloc. The Emacs executable needs alloca to call xmalloc, because ordinary malloc isn't protected from input signals. On the other hand, the utilities in lib-src need alloca to call malloc; some of them are very simple, and don't have an xmalloc routine. Non-Emacs programs expect this to call use xmalloc. Callers below should use malloc. */ #ifndef emacs #define malloc xmalloc #endif extern pointer malloc (); /* Define STACK_DIRECTION if you know the direction of stack growth for your system; otherwise it will be automatically deduced at run-time. STACK_DIRECTION > 0 => grows toward higher addresses STACK_DIRECTION < 0 => grows toward lower addresses STACK_DIRECTION = 0 => direction of growth unknown */ #ifndef STACK_DIRECTION #define STACK_DIRECTION 0 /* Direction unknown. */ #endif #if STACK_DIRECTION != 0 #define STACK_DIR STACK_DIRECTION /* Known at compile-time. */ #else /* STACK_DIRECTION == 0; need run-time code. */ static int stack_dir; /* 1 or -1 once known. */ #define STACK_DIR stack_dir static void find_stack_direction () { static char *addr = NULL; /* Address of first `dummy', once known. */ auto char dummy; /* To get stack address. */ if (addr == NULL) { /* Initial entry. */ addr = ADDRESS_FUNCTION (dummy); find_stack_direction (); /* Recurse once. */ } else { /* Second entry. */ if (ADDRESS_FUNCTION (dummy) > addr) stack_dir = 1; /* Stack grew upward. */ else stack_dir = -1; /* Stack grew downward. */ } } #endif /* STACK_DIRECTION == 0 */ /* An "alloca header" is used to: (a) chain together all alloca'ed blocks; (b) keep track of stack depth. It is very important that sizeof(header) agree with malloc alignment chunk size. The following default should work okay. */ #ifndef ALIGN_SIZE #define ALIGN_SIZE sizeof(double) #endif typedef union hdr { char align[ALIGN_SIZE]; /* To force sizeof(header). */ struct { union hdr *next; /* For chaining headers. */ char *deep; /* For stack depth measure. */ } h; } header; static header *last_alloca_header = NULL; /* -> last alloca header. */ /* Return a pointer to at least SIZE bytes of storage, which will be automatically reclaimed upon exit from the procedure that called alloca. Originally, this space was supposed to be taken from the current stack frame of the caller, but that method cannot be made to work for some implementations of C, for example under Gould's UTX/32. */ pointer alloca (size) unsigned size; { auto char probe; /* Probes stack depth: */ register char *depth = ADDRESS_FUNCTION (probe); #if STACK_DIRECTION == 0 if (STACK_DIR == 0) /* Unknown growth direction. */ find_stack_direction (); #endif /* Reclaim garbage, defined as all alloca'd storage that was allocated from deeper in the stack than currently. */ { register header *hp; /* Traverses linked list. */ for (hp = last_alloca_header; hp != NULL;) if ((STACK_DIR > 0 && hp->h.deep > depth) || (STACK_DIR < 0 && hp->h.deep < depth)) { register header *np = hp->h.next; free ((pointer) hp); /* Collect garbage. */ hp = np; /* -> next header. */ } else break; /* Rest are not deeper. */ last_alloca_header = hp; /* -> last valid storage. */ } if (size == 0) return NULL; /* No allocation required. */ /* Allocate combined header + user data storage. */ { register pointer new = malloc (sizeof (header) + size); /* Address of header. */ ((header *) new)->h.next = last_alloca_header; ((header *) new)->h.deep = depth; last_alloca_header = (header *) new; /* User storage begins just after header. */ return (pointer) ((char *) new + sizeof (header)); } } #if defined (CRAY) && defined (CRAY_STACKSEG_END) #ifdef DEBUG_I00AFUNC #include #endif #ifndef CRAY_STACK #define CRAY_STACK #ifndef CRAY2 /* Stack structures for CRAY-1, CRAY X-MP, and CRAY Y-MP */ struct stack_control_header { long shgrow:32; /* Number of times stack has grown. */ long shaseg:32; /* Size of increments to stack. */ long shhwm:32; /* High water mark of stack. */ long shsize:32; /* Current size of stack (all segments). */ }; /* The stack segment linkage control information occurs at the high-address end of a stack segment. (The stack grows from low addresses to high addresses.) The initial part of the stack segment linkage control information is 0200 (octal) words. This provides for register storage for the routine which overflows the stack. */ struct stack_segment_linkage { long ss[0200]; /* 0200 overflow words. */ long sssize:32; /* Number of words in this segment. */ long ssbase:32; /* Offset to stack base. */ long:32; long sspseg:32; /* Offset to linkage control of previous segment of stack. */ long:32; long sstcpt:32; /* Pointer to task common address block. */ long sscsnm; /* Private control structure number for microtasking. */ long ssusr1; /* Reserved for user. */ long ssusr2; /* Reserved for user. */ long sstpid; /* Process ID for pid based multi-tasking. */ long ssgvup; /* Pointer to multitasking thread giveup. */ long sscray[7]; /* Reserved for Cray Research. */ long ssa0; long ssa1; long ssa2; long ssa3; long ssa4; long ssa5; long ssa6; long ssa7; long sss0; long sss1; long sss2; long sss3; long sss4; long sss5; long sss6; long sss7; }; #else /* CRAY2 */ /* The following structure defines the vector of words returned by the STKSTAT library routine. */ struct stk_stat { long now; /* Current total stack size. */ long maxc; /* Amount of contiguous space which would be required to satisfy the maximum stack demand to date. */ long high_water; /* Stack high-water mark. */ long overflows; /* Number of stack overflow ($STKOFEN) calls. */ long hits; /* Number of internal buffer hits. */ long extends; /* Number of block extensions. */ long stko_mallocs; /* Block allocations by $STKOFEN. */ long underflows; /* Number of stack underflow calls ($STKRETN). */ long stko_free; /* Number of deallocations by $STKRETN. */ long stkm_free; /* Number of deallocations by $STKMRET. */ long segments; /* Current number of stack segments. */ long maxs; /* Maximum number of stack segments so far. */ long pad_size; /* Stack pad size. */ long current_address; /* Current stack segment address. */ long current_size; /* Current stack segment size. This number is actually corrupted by STKSTAT to include the fifteen word trailer area. */ long initial_address; /* Address of initial segment. */ long initial_size; /* Size of initial segment. */ }; /* The following structure describes the data structure which trails any stack segment. I think that the description in 'asdef' is out of date. I only describe the parts that I am sure about. */ struct stk_trailer { long this_address; /* Address of this block. */ long this_size; /* Size of this block (does not include this trailer). */ long unknown2; long unknown3; long link; /* Address of trailer block of previous segment. */ long unknown5; long unknown6; long unknown7; long unknown8; long unknown9; long unknown10; long unknown11; long unknown12; long unknown13; long unknown14; }; #endif /* CRAY2 */ #endif /* not CRAY_STACK */ #ifdef CRAY2 /* Determine a "stack measure" for an arbitrary ADDRESS. I doubt that "lint" will like this much. */ static long i00afunc (long *address) { struct stk_stat status; struct stk_trailer *trailer; long *block, size; long result = 0; /* We want to iterate through all of the segments. The first step is to get the stack status structure. We could do this more quickly and more directly, perhaps, by referencing the $LM00 common block, but I know that this works. */ STKSTAT (&status); /* Set up the iteration. */ trailer = (struct stk_trailer *) (status.current_address + status.current_size - 15); /* There must be at least one stack segment. Therefore it is a fatal error if "trailer" is null. */ if (trailer == 0) abort (); /* Discard segments that do not contain our argument address. */ while (trailer != 0) { block = (long *) trailer->this_address; size = trailer->this_size; if (block == 0 || size == 0) abort (); trailer = (struct stk_trailer *) trailer->link; if ((block <= address) && (address < (block + size))) break; } /* Set the result to the offset in this segment and add the sizes of all predecessor segments. */ result = address - block; if (trailer == 0) { return result; } do { if (trailer->this_size <= 0) abort (); result += trailer->this_size; trailer = (struct stk_trailer *) trailer->link; } while (trailer != 0); /* We are done. Note that if you present a bogus address (one not in any segment), you will get a different number back, formed from subtracting the address of the first block. This is probably not what you want. */ return (result); } #else /* not CRAY2 */ /* Stack address function for a CRAY-1, CRAY X-MP, or CRAY Y-MP. Determine the number of the cell within the stack, given the address of the cell. The purpose of this routine is to linearize, in some sense, stack addresses for alloca. */ static long i00afunc (long address) { long stkl = 0; long size, pseg, this_segment, stack; long result = 0; struct stack_segment_linkage *ssptr; /* Register B67 contains the address of the end of the current stack segment. If you (as a subprogram) store your registers on the stack and find that you are past the contents of B67, you have overflowed the segment. B67 also points to the stack segment linkage control area, which is what we are really interested in. */ stkl = CRAY_STACKSEG_END (); ssptr = (struct stack_segment_linkage *) stkl; /* If one subtracts 'size' from the end of the segment, one has the address of the first word of the segment. If this is not the first segment, 'pseg' will be nonzero. */ pseg = ssptr->sspseg; size = ssptr->sssize; this_segment = stkl - size; /* It is possible that calling this routine itself caused a stack overflow. Discard stack segments which do not contain the target address. */ while (!(this_segment <= address && address <= stkl)) { #ifdef DEBUG_I00AFUNC fprintf (stderr, "%011o %011o %011o\n", this_segment, address, stkl); #endif if (pseg == 0) break; stkl = stkl - pseg; ssptr = (struct stack_segment_linkage *) stkl; size = ssptr->sssize; pseg = ssptr->sspseg; this_segment = stkl - size; } result = address - this_segment; /* If you subtract pseg from the current end of the stack, you get the address of the previous stack segment's end. This seems a little convoluted to me, but I'll bet you save a cycle somewhere. */ while (pseg != 0) { #ifdef DEBUG_I00AFUNC fprintf (stderr, "%011o %011o\n", pseg, size); #endif stkl = stkl - pseg; ssptr = (struct stack_segment_linkage *) stkl; size = ssptr->sssize; pseg = ssptr->sspseg; result += size; } return (result); } #endif /* not CRAY2 */ #endif /* CRAY */ #endif /* no alloca */ #endif /* not GCC version 2 */ dibbler-1.0.1/bison++/system.h0000664000175000017500000000153712233256142013002 00000000000000#ifdef MSDOS #ifndef _MSDOS #define _MSDOS #endif #endif #if defined(HAVE_STDLIB_H) || defined(_MSDOS) #include #endif #if (defined(VMS) || defined(MSDOS)) && !defined(HAVE_STRING_H) #define HAVE_STRING_H 1 #endif #ifdef _MSDOS #include #define strlwr _strlwr #define strupr _strupr #define unlink _unlink #define mktemp _mktemp #endif /* MSDOS */ #if defined(STDC_HEADERS) || defined(HAVE_STRING_H) #include /* An ANSI string.h and pre-ANSI memory.h might conflict. */ #if !defined(STDC_HEADERS) && defined(HAVE_MEMORY_H) #include #endif /* not STDC_HEADERS and HAVE_MEMORY_H */ #define bcopy(src, dst, num) memcpy((dst), (src), (num)) #else /* not STDC_HEADERS and not HAVE_STRING_H */ #include /* memory.h and strings.h conflict on some systems. */ #endif /* not STDC_HEADERS and not HAVE_STRING_H */ dibbler-1.0.1/bison++/output.cc0000664000175000017500000010317012233256142013150 00000000000000/* Output the generated parsing program for bison, Copyright (C) 1984, 1986, 1989 Free Software Foundation, Inc. This file is part of Bison, the GNU Compiler Compiler. Bison 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. Bison 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 Bison; see the file COPYING. If not, write to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ /* functions to output parsing data to various files. Entries are: output_headers () Output constant strings to the beginning of certain files. output_trailers() Output constant strings to the ends of certain files. output () Output the parsing tables and the parser code to ftable. The parser tables consist of these tables. Starred ones needed only for the semantic parser. yytranslate = vector mapping yylex's token numbers into bison's token numbers. yytname = vector of string-names indexed by bison token number yyrline = vector of line-numbers of all rules. For yydebug printouts. yyrhs = vector of items of all rules. This is exactly what ritems contains. For yydebug and for semantic parser. yyprhs[r] = index in yyrhs of first item for rule r. yyr1[r] = symbol number of symbol that rule r derives. yyr2[r] = number of symbols composing right hand side of rule r. * yystos[s] = the symbol number of the symbol that leads to state s. yydefact[s] = default rule to reduce with in state s, when yytable doesn't specify something else to do. Zero means the default is an error. yydefgoto[i] = default state to go to after a reduction of a rule that generates variable ntokens + i, except when yytable specifies something else to do. yypact[s] = index in yytable of the portion describing state s. The lookahead token's type is used to index that portion to find out what to do. If the value in yytable is positive, we shift the token and go to that state. If the value is negative, it is minus a rule number to reduce by. If the value is zero, the default action from yydefact[s] is used. yypgoto[i] = the index in yytable of the portion describing what to do after reducing a rule that derives variable i + ntokens. This portion is indexed by the parser state number as of before the text for this nonterminal was read. The value from yytable is the state to go to. yytable = a vector filled with portions for different uses, found via yypact and yypgoto. yycheck = a vector indexed in parallel with yytable. It indicates, in a roundabout way, the bounds of the portion you are trying to examine. Suppose that the portion of yytable starts at index p and the index to be examined within the portion is i. Then if yycheck[p+i] != i, i is outside the bounds of what is actually allocated, and the default (from yydefact or yydefgoto) should be used. Otherwise, yytable[p+i] should be used. YYFINAL = the state number of the termination state. YYFLAG = most negative short int. Used to flag ?? YYNTBASE = ntokens. */ #include #include "system.h" #include "machine.h" #include "new.h" #include "files.h" #include "gram.h" #include "state.h" #include "symtab.h" extern bool bison_compability; extern int debugflag; extern int nolinesflag; extern int definesflag; char *quoted_filename(char* f); extern char **tags; extern int tokensetsize; extern int final_state; extern core **state_table; extern shifts **shift_table; extern errs **err_table; extern reductions **reduction_table; extern short *accessing_symbol; extern unsigned *LA; extern short *LAruleno; extern short *lookaheads; extern char *consistent; extern short *goto_map; extern short *from_state; extern short *to_state; extern char* xmalloc(unsigned); void output_token_translations(); void output_gram(); void output_stos(); void output_rule_data(); void output_defines(); void output_actions(); void token_actions(); void save_row(int); void goto_actions(); void save_column(int,int); void sort_actions(); void pack_table(); void output_base(); void output_table(); void output_check(); void output_parser(); void output_program(); void free_itemset(); void free_shifts(); void free_reductions(); void free_itemsets(); int action_row(int); int default_goto(int); int matching_state(int); int pack_vector(int); extern void berror(char*); extern void fatal(const char*); extern void fatals(const char*,void*); extern void fatals(const char*,void*,void*); extern void fatals(const char*,void*,void*,void*); extern void fatals(const char*,void*,void*,void*,void*); extern void fatals(const char*,void*,void*,void*,void*,void*); static int nvectors; static int nentries; static short **froms; static short **tos; static short *tally; static short *width; static short *actrow; static short *state_count; static short *order; static short *base; static short *pos; static short *table; static short *check; static int lowzero; static int high; void output_section(FILE* fin,FILE* fout); void output_token_defines_fmt(FILE* file,char* fmt,int notrans); extern bucket *errtoken; void output_token_defines(FILE* file); void output_token_const_def(FILE* file); void output_token_const_decl(FILE* file); void output_token_enum(FILE* file); extern int line_fparser; extern int line_fhskel; extern char *parser_fname; extern char *hskel_fname; extern char *version_string; #define GUARDSTR "\n#include \"%s\"\nextern int yyerror;\n\ extern int yycost;\nextern char * yymsg;\nextern YYSTYPE yyval;\n\n\ yyguard(n, yyvsp, yylsp)\nregister int n;\nregister YYSTYPE *yyvsp;\n\ register YYLTYPE *yylsp;\n\ {\n yyerror = 0;\nyycost = 0;\n yymsg = 0;\nswitch (n)\n {" #define ACTSTR "\n#include \"%s\"\nextern YYSTYPE yyval;\ \nextern int yychar;\ yyaction(n, yyvsp, yylsp)\nregister int n;\nregister YYSTYPE *yyvsp;\n\ register YYLTYPE *yylsp;\n{\n switch (n)\n{" #define ACTSTR_SIMPLE "\n switch (yyn) {\n" void output_before_read() { fprintf(ftable, "\n/* A Bison++ parser, made from %s */\n\n", infile); fprintf(ftable, " /* with Bison++ version %s */\n\n", version_string); /* Redefine certain symbols if -p was specified. */ if (spec_name_prefix) { fprintf(ftable, "#define yyparse %sparse\n",spec_name_prefix); fprintf(ftable, "#define yylex %slex\n",spec_name_prefix); fprintf(ftable, "#define yyerror %serror\n",spec_name_prefix); fprintf(ftable, "#define yylval %slval\n",spec_name_prefix); fprintf(ftable, "#define yychar %schar\n",spec_name_prefix); fprintf(ftable, "#define yydebug %sdebug\n",spec_name_prefix); } if(bison_compability==false) fprintf(ftable,"#define YY_USE_CLASS\n"); output_section(fparser,ftable); if(definesflag) output_section(fhskel,fdefines); }; void output_headers() { if(bison_compability==false) { fprintf(fbisoncomp,"#define YY_USE_CLASS\n"); } else { fprintf(fbisoncomp,"/*#define YY_USE_CLASS \n*/"); } output_section(fhskel,fbisoncomp); if(definesflag) output_section(fhskel,fdefines); output_section(fparser,ftable); if (pure_parser) { fprintf(ftable, "#define YY_%s_PURE 1\n",parser_name); if(definesflag) fprintf(fdefines, "#define YY_%s_PURE 1\n\n",parser_name); } /* start writing the guard and action files, if they are needed. */ if (semantic_parser) fprintf(fguard, GUARDSTR, attrsfile); fprintf(faction, (semantic_parser ? ACTSTR : ACTSTR_SIMPLE), attrsfile); if(definesflag) output_section(fhskel,fdefines); output_section(fparser,ftable); /* Rename certain symbols if -p was specified. */ if (spec_name_prefix) { fprintf(ftable, "#define YY_%s_PARSE %sparse\n", parser_name, spec_name_prefix); fprintf(ftable, "#define YY_%s_LEX %slex\n", parser_name, spec_name_prefix); fprintf(ftable, "#define YY_%s_ERROR %serror\n", parser_name, spec_name_prefix); fprintf(ftable, "#define YY_%s_LVAL %slval\n", parser_name, spec_name_prefix); fprintf(ftable, "#define YY_%s_CHAR %schar\n", parser_name, spec_name_prefix); fprintf(ftable, "#define YY_%s_DEBUG %sdebug\n", parser_name, spec_name_prefix); } if (spec_name_prefix && definesflag) { fprintf(fdefines, "#define YY_%s_PARSE %sparse\n", parser_name, spec_name_prefix); fprintf(fdefines, "#define YY_%s_LEX %slex\n", parser_name, spec_name_prefix); fprintf(fdefines, "#define YY_%s_ERROR %serror\n", parser_name, spec_name_prefix); fprintf(fdefines, "#define YY_%s_LVAL %slval\n", parser_name, spec_name_prefix); fprintf(fdefines, "#define YY_%s_CHAR %schar\n", parser_name, spec_name_prefix); fprintf(fdefines, "#define YY_%s_DEBUG %sdebug\n", parser_name, spec_name_prefix); } } void output_trailers() { if(definesflag) output_section(fhskel,fdefines); output_section(fparser,ftable); /* output the definition of YYLTYPE into the fattrs and fdefines files. */ if(debugflag) {fprintf(ftable, "#define YY_%s_DEBUG %d\n" ,parser_name,!!debugflag); if (definesflag) fprintf(fdefines, "#define YY_%s_DEBUG %d\n", parser_name,!!debugflag); } if(definesflag) output_section(fhskel,fdefines); output_section(fparser,ftable); /* Now we know whether we need the line-number stack. If we do, write its type into the .tab.h file. */ if (yylsp_needed) { /* fattrs winds up in the .tab.c file, before bison.simple. */ fprintf(ftable, "#define YYLSP_%s_NEEDED\n",parser_name); if (debugflag) if (definesflag) { fprintf(fdefines, "#define YY_%s_LSP_NEEDED\n", parser_name); } } if (semantic_parser) { fprintf(fguard, "\n }\n}\n"); fprintf(faction, "\n }\n}\n"); } else fprintf(faction, "\n}\n"); } void output() { int c; if (!semantic_parser) /* JF Put out other stuff */ { rewind(fattrs); while ((c=getc(fattrs))!=EOF) putc(c,ftable); } if (semantic_parser) fprintf(ftable, "#include \"%s\"\n", attrsfile); free_itemsets(); output_defines(); output_token_translations(); /* if (semantic_parser) */ /* This is now unconditional because debugging printouts can use it. */ output_gram(); FREE(ritem); if (semantic_parser) output_stos(); output_rule_data(); output_actions(); output_parser(); output_program(); } void output_token_translations() { register int i, j; /* register short *sp; JF unused */ if (translations) { fprintf(ftable, "\n#define YYTRANSLATE(x) ((unsigned)(x) <= %d ? yytranslate[x] : %d)\n", max_user_token_number, nsyms); if (ntokens < 127) /* play it very safe; check maximum element value. */ fprintf(ftable, "\nstatic const char yytranslate[] = { 0"); else fprintf(ftable, "\nstatic const short yytranslate[] = { 0"); j = 10; for (i = 1; i <= max_user_token_number; i++) { putc(',', ftable); if (j >= 10) { putc('\n', ftable); j = 1; } else { j++; } fprintf(ftable, "%6d", token_translations[i]); } fprintf(ftable, "\n};\n"); } else { fprintf(ftable, "\n#define YYTRANSLATE(x) (x)\n"); } } void output_gram() { register int i; register int j; register short *sp; /* With the ordinary parser, yyprhs and yyrhs are needed only for yydebug. */ if (!semantic_parser) fprintf(ftable, "\n#if YY_%s_DEBUG != 0",parser_name); fprintf(ftable, "\nstatic const short yyprhs[] = { 0"); j = 10; for (i = 1; i <= nrules; i++) { putc(',', ftable); if (j >= 10) { putc('\n', ftable); j = 1; } else { j++; } fprintf(ftable, "%6d", rrhs[i]); } fprintf(ftable, "\n};\n"); fprintf(ftable, "\nstatic const short yyrhs[] = {%6d", ritem[0]); j = 10; for (sp = ritem + 1; *sp; sp++) { putc(',', ftable); if (j >= 10) { putc('\n', ftable); j = 1; } else { j++; } if (*sp > 0) fprintf(ftable, "%6d", *sp); else fprintf(ftable, " 0"); } fprintf(ftable, "\n};\n"); if(!semantic_parser) fprintf(ftable, "\n#endif\n"); } void output_stos() { register int i; register int j; fprintf(ftable, "\nstatic const short yystos[] = { 0"); j = 10; for (i = 1; i < nstates; i++) { putc(',', ftable); if (j >= 10) { putc('\n', ftable); j = 1; } else { j++; } fprintf(ftable, "%6d", accessing_symbol[i]); } fprintf(ftable, "\n};\n"); } void output_rule_data() { register int i; register int j; fprintf(ftable, "\n#if (YY_%s_DEBUG != 0) || defined(YY_%s_ERROR_VERBOSE) \nstatic const short yyrline[] = { 0",parser_name,parser_name); j = 10; for (i = 1; i <= nrules; i++) { putc(',', ftable); if (j >= 10) { putc('\n', ftable); j = 1; } else { j++; } fprintf(ftable, "%6d", rline[i]); } /* Output the table of symbol names. */ fprintf(ftable, "\n};\n\nstatic const char * const yytname[] = { \"%s\"", tags[0]); j = strlen (tags[0]) + 44; for (i = 1; i <= nsyms; i++) { register char *p; putc(',', ftable); j++; if (j > 75) { putc('\n', ftable); j = 0; } putc ('\"', ftable); j++; for (p = tags[i]; p && *p; p++) { if (*p == '"' || *p == '\\') { fprintf(ftable, "\\%c", *p); j += 2; } else if (*p == '\n') { fprintf(ftable, "\\n"); j += 2; } else if (*p == '\t') { fprintf(ftable, "\\t"); j += 2; } else if (*p == '\b') { fprintf(ftable, "\\b"); j += 2; } else if (*p < 040 || *p >= 0177) { fprintf(ftable, "\\%03o", *p); j += 4; } else { putc(*p, ftable); j++; } } putc ('\"', ftable); j++; } fprintf(ftable, "\n};\n#endif\n\nstatic const short yyr1[] = { 0"); j = 10; for (i = 1; i <= nrules; i++) { putc(',', ftable); if (j >= 10) { putc('\n', ftable); j = 1; } else { j++; } fprintf(ftable, "%6d", rlhs[i]); } FREE(rlhs + 1); fprintf(ftable, "\n};\n\nstatic const short yyr2[] = { 0"); j = 10; for (i = 1; i < nrules; i++) { putc(',', ftable); if (j >= 10) { putc('\n', ftable); j = 1; } else { j++; } fprintf(ftable, "%6d", rrhs[i + 1] - rrhs[i] - 1); } putc(',', ftable); if (j >= 10) putc('\n', ftable); fprintf(ftable, "%6d\n};\n", nitems - rrhs[nrules] - 1); FREE(rrhs + 1); } void output_defines() { fprintf(ftable, "\n\n#define\tYYFINAL\t\t%d\n", final_state); fprintf(ftable, "#define\tYYFLAG\t\t%d\n", MINSHORT); fprintf(ftable, "#define\tYYNTBASE\t%d\n", ntokens); } /* compute and output yydefact, yydefgoto, yypact, yypgoto, yytable and yycheck. */ void output_actions() { nvectors = nstates + nvars; froms = NEW2(nvectors, short *); tos = NEW2(nvectors, short *); tally = NEW2(nvectors, short); width = NEW2(nvectors, short); token_actions(); free_shifts(); free_reductions(); FREE(lookaheads); FREE(LA); FREE(LAruleno); FREE(accessing_symbol); goto_actions(); FREE(goto_map + ntokens); FREE(from_state); FREE(to_state); sort_actions(); pack_table(); output_base(); output_table(); output_check(); } /* figure out the actions for the specified state, indexed by lookahead token type. The yydefact table is output now. The detailed info is saved for putting into yytable later. */ void token_actions() { register int i; register int j; register int k; actrow = NEW2(ntokens, short); k = action_row(0); fprintf(ftable, "\nstatic const short yydefact[] = {%6d", k); save_row(0); j = 10; for (i = 1; i < nstates; i++) { putc(',', ftable); if (j >= 10) { putc('\n', ftable); j = 1; } else { j++; } k = action_row(i); fprintf(ftable, "%6d", k); save_row(i); } fprintf(ftable, "\n};\n"); FREE(actrow); } /* Decide what to do for each type of token if seen as the lookahead token in specified state. The value returned is used as the default action (yydefact) for the state. In addition, actrow is filled with what to do for each kind of token, index by symbol number, with zero meaning do the default action. The value MINSHORT, a very negative number, means this situation is an error. The parser recognizes this value specially. This is where conflicts are resolved. The loop over lookahead rules considered lower-numbered rules last, and the last rule considered that likes a token gets to handle it. */ int action_row(int state) { register int i; register int j; register int k; register int m; register int n; register int count; register int default_rule; register int nreds; register int max; register int rule; register int shift_state; register int symbol; register unsigned mask; register unsigned *wordp; register reductions *redp; register shifts *shiftp; register errs *errp; int nodefault = 0; /* set nonzero to inhibit having any default reduction */ for (i = 0; i < ntokens; i++) actrow[i] = 0; default_rule = 0; nreds = 0; redp = reduction_table[state]; if (redp) { nreds = redp->nreds; if (nreds >= 1) { /* loop over all the rules available here which require lookahead */ m = lookaheads[state]; n = lookaheads[state + 1]; for (i = n - 1; i >= m; i--) { rule = - LAruleno[i]; wordp = LA + i * tokensetsize; mask = 1; /* and find each token which the rule finds acceptable to come next */ for (j = 0; j < ntokens; j++) { /* and record this rule as the rule to use if that token follows. */ if (mask & *wordp) actrow[j] = rule; mask <<= 1; if (mask == 0) { mask = 1; wordp++; } } } } } shiftp = shift_table[state]; /* now see which tokens are allowed for shifts in this state. For them, record the shift as the thing to do. So shift is preferred to reduce. */ if (shiftp) { k = shiftp->nshifts; for (i = 0; i < k; i++) { shift_state = shiftp->internalShifts[i]; if (! shift_state) continue; symbol = accessing_symbol[shift_state]; if (ISVAR(symbol)) break; actrow[symbol] = shift_state; /* do not use any default reduction if there is a shift for error */ if (symbol == error_token_number) nodefault = 1; } } errp = err_table[state]; /* See which tokens are an explicit error in this state (due to %nonassoc). For them, record MINSHORT as the action. */ if (errp) { k = errp->nerrs; for (i = 0; i < k; i++) { symbol = errp->internalErrs[i]; actrow[symbol] = MINSHORT; } } /* now find the most common reduction and make it the default action for this state. */ if (nreds >= 1 && ! nodefault) { if (consistent[state]) default_rule = redp->rules[0]; else { max = 0; for (i = m; i < n; i++) { count = 0; rule = - LAruleno[i]; for (j = 0; j < ntokens; j++) { if (actrow[j] == rule) count++; } if (count > max) { max = count; default_rule = rule; } } /* actions which match the default are replaced with zero, which means "use the default" */ if (max > 0) { for (j = 0; j < ntokens; j++) { if (actrow[j] == default_rule) actrow[j] = 0; } default_rule = - default_rule; } } } /* If have no default rule, the default is an error. So replace any action which says "error" with "use default". */ if (default_rule == 0) for (j = 0; j < ntokens; j++) { if (actrow[j] == MINSHORT) actrow[j] = 0; } return (default_rule); } void save_row(int state) { register int i; register int count; register short *sp; register short *sp1; register short *sp2; count = 0; for (i = 0; i < ntokens; i++) { if (actrow[i] != 0) count++; } if (count == 0) return; froms[state] = sp1 = sp = NEW2(count, short); tos[state] = sp2 = NEW2(count, short); for (i = 0; i < ntokens; i++) { if (actrow[i] != 0) { *sp1++ = i; *sp2++ = actrow[i]; } } tally[state] = count; width[state] = sp1[-1] - sp[0] + 1; } /* figure out what to do after reducing with each rule, depending on the saved state from before the beginning of parsing the data that matched this rule. The yydefgoto table is output now. The detailed info is saved for putting into yytable later. */ void goto_actions() { register int i; register int j; register int k; state_count = NEW2(nstates, short); k = default_goto(ntokens); fprintf(ftable, "\nstatic const short yydefgoto[] = {%6d", k); save_column(ntokens, k); j = 10; for (i = ntokens + 1; i < nsyms; i++) { putc(',', ftable); if (j >= 10) { putc('\n', ftable); j = 1; } else { j++; } k = default_goto(i); fprintf(ftable, "%6d", k); save_column(i, k); } fprintf(ftable, "\n};\n"); FREE(state_count); } int default_goto(int symbol) { register int i; register int m; register int n; register int default_state; register int max; m = goto_map[symbol]; n = goto_map[symbol + 1]; if (m == n) return (-1); for (i = 0; i < nstates; i++) state_count[i] = 0; for (i = m; i < n; i++) state_count[to_state[i]]++; max = 0; default_state = -1; for (i = 0; i < nstates; i++) { if (state_count[i] > max) { max = state_count[i]; default_state = i; } } return (default_state); } void save_column(int symbol, int default_state) { register int i; register int m; register int n; register short *sp; register short *sp1; register short *sp2; register int count; register int symno; m = goto_map[symbol]; n = goto_map[symbol + 1]; count = 0; for (i = m; i < n; i++) { if (to_state[i] != default_state) count++; } if (count == 0) return; symno = symbol - ntokens + nstates; froms[symno] = sp1 = sp = NEW2(count, short); tos[symno] = sp2 = NEW2(count, short); for (i = m; i < n; i++) { if (to_state[i] != default_state) { *sp1++ = from_state[i]; *sp2++ = to_state[i]; } } tally[symno] = count; width[symno] = sp1[-1] - sp[0] + 1; } /* the next few functions decide how to pack the actions and gotos information into yytable. */ void sort_actions() { register int i; register int j; register int k; register int t; register int w; order = NEW2(nvectors, short); nentries = 0; for (i = 0; i < nvectors; i++) { if (tally[i] > 0) { t = tally[i]; w = width[i]; j = nentries - 1; while (j >= 0 && (width[order[j]] < w)) j--; while (j >= 0 && (width[order[j]] == w) && (tally[order[j]] < t)) j--; for (k = nentries - 1; k > j; k--) order[k + 1] = order[k]; order[j + 1] = i; nentries++; } } } void pack_table() { register int i; register int place; register int state; base = NEW2(nvectors, short); pos = NEW2(nentries, short); table = NEW2(MAXTABLE, short); check = NEW2(MAXTABLE, short); lowzero = 0; high = 0; for (i = 0; i < nvectors; i++) base[i] = MINSHORT; for (i = 0; i < MAXTABLE; i++) check[i] = -1; for (i = 0; i < nentries; i++) { state = matching_state(i); if (state < 0) place = pack_vector(i); else place = base[state]; pos[i] = place; base[order[i]] = place; } for (i = 0; i < nvectors; i++) { if (froms[i]) FREE(froms[i]); if (tos[i]) FREE(tos[i]); } FREE(froms); FREE(tos); FREE(pos); } int matching_state(int vector) { register int i; register int j; register int k; register int t; register int w; register int match; register int prev; i = order[vector]; if (i >= nstates) return (-1); t = tally[i]; w = width[i]; for (prev = vector - 1; prev >= 0; prev--) { j = order[prev]; if (width[j] != w || tally[j] != t) return (-1); match = 1; for (k = 0; match && k < t; k++) { if (tos[j][k] != tos[i][k] || froms[j][k] != froms[i][k]) match = 0; } if (match) return (j); } return (-1); } int pack_vector(int vector) { register int i; register int j; register int k; register int t; register int loc; register int ok; register short *from; register short *to; i = order[vector]; t = tally[i]; if (t == 0) berror("pack_vector"); from = froms[i]; to = tos[i]; for (j = lowzero - from[0]; j < MAXTABLE; j++) { ok = 1; for (k = 0; ok && k < t; k++) { loc = j + from[k]; if (loc > MAXTABLE) fatals("maximum table size (%d) exceeded",(void*) MAXTABLE); if (table[loc] != 0) ok = 0; } for (k = 0; ok && k < vector; k++) { if (pos[k] == j) ok = 0; } if (ok) { for (k = 0; k < t; k++) { loc = j + from[k]; table[loc] = to[k]; check[loc] = from[k]; } while (table[lowzero] != 0) lowzero++; if (loc > high) high = loc; return (j); } } berror("pack_vector"); return 0; /* JF keep lint happy */ } /* the following functions output yytable, yycheck and the vectors whose elements index the portion starts */ void output_base() { register int i; register int j; fprintf(ftable, "\nstatic const short yypact[] = {%6d", base[0]); j = 10; for (i = 1; i < nstates; i++) { putc(',', ftable); if (j >= 10) { putc('\n', ftable); j = 1; } else { j++; } fprintf(ftable, "%6d", base[i]); } fprintf(ftable, "\n};\n\nstatic const short yypgoto[] = {%6d", base[nstates]); j = 10; for (i = nstates + 1; i < nvectors; i++) { putc(',', ftable); if (j >= 10) { putc('\n', ftable); j = 1; } else { j++; } fprintf(ftable, "%6d", base[i]); } fprintf(ftable, "\n};\n"); FREE(base); } void output_table() { register int i; register int j; fprintf(ftable, "\n\n#define\tYYLAST\t\t%d\n\n", high); fprintf(ftable, "\nstatic const short yytable[] = {%6d", table[0]); j = 10; for (i = 1; i <= high; i++) { putc(',', ftable); if (j >= 10) { putc('\n', ftable); j = 1; } else { j++; } fprintf(ftable, "%6d", table[i]); } fprintf(ftable, "\n};\n"); FREE(table); } void output_check() { register int i; register int j; fprintf(ftable, "\nstatic const short yycheck[] = {%6d", check[0]); j = 10; for (i = 1; i <= high; i++) { putc(',', ftable); if (j >= 10) { putc('\n', ftable); j = 1; } else { j++; } fprintf(ftable, "%6d", check[i]); } fprintf(ftable, "\n};\n"); FREE(check); } /* copy the parser code into the ftable file at the end. */ void output_parser() { register int c; output_section(fparser,ftable); rewind(faction); for(c=getc(faction);c!=EOF;c=getc(faction)) putc(c,ftable); output_section(fparser,ftable); } void output_section(FILE* fin,FILE* fout) { register int c; int dummy; int *pcounter=&dummy; char *fil_name; fil_name="?"; if(fin==fparser) {pcounter=&line_fparser;fil_name=parser_fname;} else if(fin==fhskel) {pcounter=&line_fhskel;fil_name=hskel_fname;} /* Loop over lines in the standard parser file. */ if (!nolinesflag) fprintf(fout, "\n#line %d \"%s\"\n", (*pcounter), quoted_filename(fil_name)); while (1) { /* now write out the line... */ for ( c = getc(fin); c != '\n' && c != EOF; c = getc(fin)) {if (c == '$') { if (!nolinesflag) {//something is wrong "\n/* #line %d \"%s\" */\n#line @\n", fprintf(fout, "\n #line %d \"%s\"\n", (*pcounter), quoted_filename(fil_name)); } return; } else if(c=='@') {fprintf(fout,"%s",parser_name); } else putc(c, fout); } if (c == EOF) break; else if(c=='\n') (*pcounter)++; putc(c, fout); } } void output_program() { register int c; extern int lineno; int is_escaped=0,is_commented=0; char quoted='\0',last='\0'; int len_match=0,i; char *match_open="%header{"; char *match_close="%}"; char *match_wait=match_open; if (!nolinesflag) fprintf(ftable, "#line %d \"%s\"\n", lineno, quoted_filename(infile)); for (c = getc(finput);c != EOF;last=c,c = getc(finput)) { if(!match_wait[len_match]) {if(match_wait==match_open) {match_wait=match_close; if (!nolinesflag && definesflag) fprintf(fdefines, "\n#line %d \"%s\"\n", lineno, quoted_filename(infile)); } else {match_wait=match_open;} len_match=0; } else if(c!=match_wait[len_match] || is_escaped || is_commented || quoted) {for(i=0;inext; FREE(cp); } } void free_shifts() { register shifts *sp,*sptmp;/* JF derefrenced freed ptr */ FREE(shift_table); for (sp = first_shift; sp; sp = sptmp) { sptmp=sp->next; FREE(sp); } } void free_reductions() { register reductions *rp,*rptmp;/* JF fixed freed ptr */ FREE(reduction_table); for (rp = first_reduction; rp; rp = rptmp) { rptmp=rp->next; FREE(rp); } } void output_token_defines(); void output_token_const_def(); void output_token_const_decl(); void output_about_token() { register int i; output_section(fparser,ftable); output_token_defines(ftable); output_section(fparser,ftable); output_token_const_decl(ftable); output_section(fparser,ftable); /* new section */ output_token_enum(ftable); /* enum */ output_section(fparser,ftable); output_token_const_def(ftable); output_section(fparser,ftable); if (definesflag) { output_section(fhskel,fdefines); output_token_defines(fdefines); output_section(fhskel,fdefines); output_token_const_decl(fdefines); output_section(fhskel,fdefines); /* new section */ output_token_enum(fdefines); /* enum */ output_section(fhskel,fdefines); if (semantic_parser) for (i = ntokens; i < nsyms; i++) { /* don't make these for dummy nonterminals made by gensym. */ if (*tags[i] != '@') fprintf(fdefines, "#define\tNT%s\t%d\n", tags[i], i); } } }; void output_token_defines(FILE* file) {output_token_defines_fmt(file,"#define\t%s\t%d\n",0); if (semantic_parser) output_token_defines_fmt(file,"#define\tT%s\t%d\n",1); }; void output_token_const_def(FILE* file) {char line[256]; sprintf(line,"const int YY_%s_CLASS::%%s=%%d;\n",parser_name); output_token_defines_fmt(file,line,0); sprintf(line,"const int YY_%s_CLASS::T%%s=%%d;\n",parser_name); if (semantic_parser) output_token_defines_fmt(file,line,1); }; void output_token_const_decl(FILE* file) {char line[256]; output_token_defines_fmt(file,"static const int %s;\n",0); if (semantic_parser) output_token_defines_fmt(file,"static const int T%s;\n",1); }; /* create a list like ,FIRST_TOKEN=256 ,SECOND_TOKEN=257 */ void output_token_enum(FILE* file) { output_token_defines_fmt(file,"\t,%s=%d\n",0); if (semantic_parser) /* just for compatibility with semantic parser */ output_token_defines_fmt(file,"\t,T%s=%d\n",1); }; void output_token_defines_fmt(FILE* file,char* fmt,int notrans) { bucket *bp; for (bp = firstsymbol; bp; bp = bp->next) { if (bp->value >= ntokens) continue; /* For named tokens, but not literal ones, define the name. */ /* The value is the user token number. */ if ('\'' != *tags[bp->value] && bp != errtoken) { register char *cp = tags[bp->value]; register char c; /* Don't #define nonliteral tokens whose names contain periods. */ while ((c = *cp++) && c != '.'); if (!c) { fprintf(file, fmt, tags[bp->value], (translations && !notrans ? bp->user_token_number : bp->value)); } } } putc('\n', file); } char *quoted_filename(char* f) { static char *buffer=NULL; static int buff_size=0; char *p; if(buff_size/dev/null'. To compile the package in a different directory from the one containing the source code, you must use a version of `make' that supports the VPATH variable, such as GNU `make'. `cd' to the directory where you want the object files and executables to go and run `configure'. `configure' automatically checks for the source code in the directory that `configure' is in and in `..'. If for some reason `configure' is not in the source code directory that you are configuring, then it will report that it can't find the source code. In that case, run `configure' with the option `--srcdir=DIR', where DIR is the directory that contains the source code. By default, `make install' will install the package's files in /usr/local/bin, /usr/local/lib, /usr/local/man, etc. You can specify an installation prefix other than /usr/local by giving `configure' the option `--prefix=PATH'. Alternately, you can do so by consistently giving a value for the `prefix' variable when you run `make', e.g., make prefix=/usr/gnu make prefix=/usr/gnu install You can specify separate installation prefixes for architecture-specific files and architecture-independent files. If you give `configure' the option `--exec-prefix=PATH' or set the `make' variable `exec_prefix' to PATH, the package will use PATH as the prefix for installing programs and libraries. Data files and documentation will still use the regular prefix. Normally, all files are installed using the regular prefix. Another `configure' option is useful mainly in `Makefile' rules for updating `config.status' and `Makefile'. The `--no-create' option figures out the configuration for your system and records it in `config.status', without actually configuring the package (creating `Makefile's and perhaps a configuration header file). Later, you can run `./config.status' to actually configure the package. You can also give `config.status' the `--recheck' option, which makes it re-run `configure' with the same arguments you used before. This option is useful if you change `configure'. Some packages pay attention to `--with-PACKAGE' options to `configure', where PACKAGE is something like `gnu-libc' or `x' (for the X Window System). The README should mention any --with- options that the package recognizes. `configure' ignores any other arguments that you give it. If your system requires unusual options for compilation or linking that `configure' doesn't know about, you can give `configure' initial values for some variables by setting them in the environment. In Bourne-compatible shells, you can do that on the command line like this: CC='gcc -traditional' DEFS=-D_POSIX_SOURCE ./configure The `make' variables that you might want to override with environment variables when running `configure' are: (For these variables, any value given in the environment overrides the value that `configure' would choose:) CC C compiler program. Default is `cc', or `gcc' if `gcc' is in your PATH. INSTALL Program to use to install files. Default is `install' if you have it, `cp' otherwise. (For these variables, any value given in the environment is added to the value that `configure' chooses:) DEFS Configuration options, in the form `-Dfoo -Dbar ...' Do not use this variable in packages that create a configuration header file. LIBS Libraries to link with, in the form `-lfoo -lbar ...' If you need to do unusual things to compile the package, we encourage you to figure out how `configure' could check whether to do them, and mail diffs or instructions to the address given in the README so we can include them in the next release. 2. Type `make' to compile the package. If you want, you can override the `make' variables CFLAGS and LDFLAGS like this: make CFLAGS=-O2 LDFLAGS=-s 3. If the package comes with self-tests and you want to run them, type `make check'. If you're not sure whether there are any, try it; if `make' responds with something like make: *** No way to make target `check'. Stop. then the package does not come with self-tests. 4. Type `make install' to install programs, data files, and documentation. 5. You can remove the program binaries and object files from the source directory by typing `make clean'. To also remove the Makefile(s), the header file containing system-dependent definitions (if the package uses one), and `config.status' (all the files that `configure' created), type `make distclean'. The file `configure.in' is used as a template to create `configure' by a program called `autoconf'. You will only need it if you want to regenerate `configure' using a newer version of `autoconf'. dibbler-1.0.1/bison++/symtab.cc0000664000175000017500000000474412233256142013116 00000000000000/* Symbol table manager for Bison, Copyright (C) 1984, 1989 Free Software Foundation, Inc. This file is part of Bison, the GNU Compiler Compiler. Bison 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. Bison 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 Bison; see the file COPYING. If not, write to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ #include #include "system.h" #include "new.h" #include "symtab.h" #include "gram.h" bucket **symtab; bucket *firstsymbol; bucket *lastsymbol; int hash(char* key) { register char *cp; register int k; cp = key; k = 0; while (*cp) k = ((k << 1) ^ (*cp++)) & 0x3fff; return (k % TABSIZE); } char * copys(char* s) { register int i; register char *cp; register char *result; i = 1; for (cp = s; *cp; cp++) i++; result = xmalloc((unsigned int)i); strcpy(result, s); return (result); } void tabinit() { /* register int i; JF unused */ symtab = NEW2(TABSIZE, bucket *); firstsymbol = NULL; lastsymbol = NULL; } bucket * getsym(char* key) { register int hashval; register bucket *bp; register int found; hashval = hash(key); bp = symtab[hashval]; found = 0; while (bp != NULL && found == 0) { if (strcmp(key, bp->tag) == 0) found = 1; else bp = bp->link; } if (found == 0) { nsyms++; bp = NEW(bucket); bp->link = symtab[hashval]; bp->next = NULL; bp->tag = copys(key); bp->internalClass = SUNKNOWN; if (firstsymbol == NULL) { firstsymbol = bp; lastsymbol = bp; } else { lastsymbol->next = bp; lastsymbol = bp; } symtab[hashval] = bp; } return (bp); } void free_symtab() { register int i; register bucket *bp,*bptmp;/* JF don't use ptr after free */ for (i = 0; i < TABSIZE; i++) { bp = symtab[i]; while (bp) { bptmp = bp->link; #if 0 /* This causes crashes because one string can appear more than once. */ if (bp->type_name) FREE(bp->type_name); #endif FREE(bp); bp = bptmp; } } FREE(symtab); } dibbler-1.0.1/bison++/bison.info-20000664000175000017500000013762612233256142013444 00000000000000This is bison.info, produced by makeinfo version 4.1 from bison.texinfo. START-INFO-DIR-ENTRY * bison: (bison). GNU Project parser generator (yacc replacement). END-INFO-DIR-ENTRY This file documents the Bison parser generator. Copyright (C) 1988, 89, 90, 91, 92, 93, 95, 98, 1999 Free Software Foundation, Inc. Permission is granted to make and distribute verbatim copies of this manual provided the copyright notice and this permission notice are preserved on all copies. Permission is granted to copy and distribute modified versions of this manual under the conditions for verbatim copying, provided also that the sections entitled "GNU General Public License" and "Conditions for Using Bison" are included exactly as in the original, and provided that the entire resulting derived work is distributed under the terms of a permission notice identical to this one. Permission is granted to copy and distribute translations of this manual into another language, under the above conditions for modified versions, except that the sections entitled "GNU General Public License", "Conditions for Using Bison" and this permission notice may be included in translations approved by the Free Software Foundation instead of in the original English.  File: bison.info, Node: Rpcalc Rules, Next: Rpcalc Lexer, Prev: Rpcalc Decls, Up: RPN Calc Grammar Rules for `rpcalc' -------------------------- Here are the grammar rules for the reverse polish notation calculator. input: /* empty */ | input line ; line: '\n' | exp '\n' { printf ("\t%.10g\n", $1); } ; exp: NUM { $$ = $1; } | exp exp '+' { $$ = $1 + $2; } | exp exp '-' { $$ = $1 - $2; } | exp exp '*' { $$ = $1 * $2; } | exp exp '/' { $$ = $1 / $2; } /* Exponentiation */ | exp exp '^' { $$ = pow ($1, $2); } /* Unary minus */ | exp 'n' { $$ = -$1; } ; %% The groupings of the rpcalc "language" defined here are the expression (given the name `exp'), the line of input (`line'), and the complete input transcript (`input'). Each of these nonterminal symbols has several alternate rules, joined by the `|' punctuator which is read as "or". The following sections explain what these rules mean. The semantics of the language is determined by the actions taken when a grouping is recognized. The actions are the C code that appears inside braces. *Note Actions::. You must specify these actions in C, but Bison provides the means for passing semantic values between the rules. In each action, the pseudo-variable `$$' stands for the semantic value for the grouping that the rule is going to construct. Assigning a value to `$$' is the main job of most actions. The semantic values of the components of the rule are referred to as `$1', `$2', and so on. * Menu: * Rpcalc Input:: * Rpcalc Line:: * Rpcalc Expr::  File: bison.info, Node: Rpcalc Input, Next: Rpcalc Line, Up: Rpcalc Rules Explanation of `input' ...................... Consider the definition of `input': input: /* empty */ | input line ; This definition reads as follows: "A complete input is either an empty string, or a complete input followed by an input line". Notice that "complete input" is defined in terms of itself. This definition is said to be "left recursive" since `input' appears always as the leftmost symbol in the sequence. *Note Recursive Rules: Recursion. The first alternative is empty because there are no symbols between the colon and the first `|'; this means that `input' can match an empty string of input (no tokens). We write the rules this way because it is legitimate to type `Ctrl-d' right after you start the calculator. It's conventional to put an empty alternative first and write the comment `/* empty */' in it. The second alternate rule (`input line') handles all nontrivial input. It means, "After reading any number of lines, read one more line if possible." The left recursion makes this rule into a loop. Since the first alternative matches empty input, the loop can be executed zero or more times. The parser function `yyparse' continues to process input until a grammatical error is seen or the lexical analyzer says there are no more input tokens; we will arrange for the latter to happen at end of file.  File: bison.info, Node: Rpcalc Line, Next: Rpcalc Expr, Prev: Rpcalc Input, Up: Rpcalc Rules Explanation of `line' ..................... Now consider the definition of `line': line: '\n' | exp '\n' { printf ("\t%.10g\n", $1); } ; The first alternative is a token which is a newline character; this means that rpcalc accepts a blank line (and ignores it, since there is no action). The second alternative is an expression followed by a newline. This is the alternative that makes rpcalc useful. The semantic value of the `exp' grouping is the value of `$1' because the `exp' in question is the first symbol in the alternative. The action prints this value, which is the result of the computation the user asked for. This action is unusual because it does not assign a value to `$$'. As a consequence, the semantic value associated with the `line' is uninitialized (its value will be unpredictable). This would be a bug if that value were ever used, but we don't use it: once rpcalc has printed the value of the user's input line, that value is no longer needed.  File: bison.info, Node: Rpcalc Expr, Prev: Rpcalc Line, Up: Rpcalc Rules Explanation of `expr' ..................... The `exp' grouping has several rules, one for each kind of expression. The first rule handles the simplest expressions: those that are just numbers. The second handles an addition-expression, which looks like two expressions followed by a plus-sign. The third handles subtraction, and so on. exp: NUM | exp exp '+' { $$ = $1 + $2; } | exp exp '-' { $$ = $1 - $2; } ... ; We have used `|' to join all the rules for `exp', but we could equally well have written them separately: exp: NUM ; exp: exp exp '+' { $$ = $1 + $2; } ; exp: exp exp '-' { $$ = $1 - $2; } ; ... Most of the rules have actions that compute the value of the expression in terms of the value of its parts. For example, in the rule for addition, `$1' refers to the first component `exp' and `$2' refers to the second one. The third component, `'+'', has no meaningful associated semantic value, but if it had one you could refer to it as `$3'. When `yyparse' recognizes a sum expression using this rule, the sum of the two subexpressions' values is produced as the value of the entire expression. *Note Actions::. You don't have to give an action for every rule. When a rule has no action, Bison by default copies the value of `$1' into `$$'. This is what happens in the first rule (the one that uses `NUM'). The formatting shown here is the recommended convention, but Bison does not require it. You can add or change whitespace as much as you wish. For example, this: exp : NUM | exp exp '+' {$$ = $1 + $2; } | ... means the same thing as this: exp: NUM | exp exp '+' { $$ = $1 + $2; } | ... The latter, however, is much more readable.  File: bison.info, Node: Rpcalc Lexer, Next: Rpcalc Main, Prev: Rpcalc Rules, Up: RPN Calc The `rpcalc' Lexical Analyzer ----------------------------- The lexical analyzer's job is low-level parsing: converting characters or sequences of characters into tokens. The Bison parser gets its tokens by calling the lexical analyzer. *Note The Lexical Analyzer Function `yylex': Lexical. Only a simple lexical analyzer is needed for the RPN calculator. This lexical analyzer skips blanks and tabs, then reads in numbers as `double' and returns them as `NUM' tokens. Any other character that isn't part of a number is a separate token. Note that the token-code for such a single-character token is the character itself. The return value of the lexical analyzer function is a numeric code which represents a token type. The same text used in Bison rules to stand for this token type is also a C expression for the numeric code for the type. This works in two ways. If the token type is a character literal, then its numeric code is the ASCII code for that character; you can use the same character literal in the lexical analyzer to express the number. If the token type is an identifier, that identifier is defined by Bison as a C macro whose definition is the appropriate number. In this example, therefore, `NUM' becomes a macro for `yylex' to use. The semantic value of the token (if it has one) is stored into the global variable `yylval', which is where the Bison parser will look for it. (The C data type of `yylval' is `YYSTYPE', which was defined at the beginning of the grammar; *note Declarations for `rpcalc': Rpcalc Decls..) A token type code of zero is returned if the end-of-file is encountered. (Bison recognizes any nonpositive value as indicating the end of the input.) Here is the code for the lexical analyzer: /* Lexical analyzer returns a double floating point number on the stack and the token NUM, or the ASCII character read if not a number. Skips all blanks and tabs, returns 0 for EOF. */ #include yylex () { int c; /* skip white space */ while ((c = getchar ()) == ' ' || c == '\t') ; /* process numbers */ if (c == '.' || isdigit (c)) { ungetc (c, stdin); scanf ("%lf", &yylval); return NUM; } /* return end-of-file */ if (c == EOF) return 0; /* return single chars */ return c; }  File: bison.info, Node: Rpcalc Main, Next: Rpcalc Error, Prev: Rpcalc Lexer, Up: RPN Calc The Controlling Function ------------------------ In keeping with the spirit of this example, the controlling function is kept to the bare minimum. The only requirement is that it call `yyparse' to start the process of parsing. main () { yyparse (); }  File: bison.info, Node: Rpcalc Error, Next: Rpcalc Gen, Prev: Rpcalc Main, Up: RPN Calc The Error Reporting Routine --------------------------- When `yyparse' detects a syntax error, it calls the error reporting function `yyerror' to print an error message (usually but not always `"parse error"'). It is up to the programmer to supply `yyerror' (*note Parser C-Language Interface: Interface.), so here is the definition we will use: #include yyerror (s) /* Called by yyparse on error */ char *s; { printf ("%s\n", s); } After `yyerror' returns, the Bison parser may recover from the error and continue parsing if the grammar contains a suitable error rule (*note Error Recovery::). Otherwise, `yyparse' returns nonzero. We have not written any error rules in this example, so any invalid input will cause the calculator program to exit. This is not clean behavior for a real calculator, but it is adequate in the first example.  File: bison.info, Node: Rpcalc Gen, Next: Rpcalc Compile, Prev: Rpcalc Error, Up: RPN Calc Running Bison to Make the Parser -------------------------------- Before running Bison to produce a parser, we need to decide how to arrange all the source code in one or more source files. For such a simple example, the easiest thing is to put everything in one file. The definitions of `yylex', `yyerror' and `main' go at the end, in the "additional C code" section of the file (*note The Overall Layout of a Bison Grammar: Grammar Layout.). For a large project, you would probably have several source files, and use `make' to arrange to recompile them. With all the source in a single file, you use the following command to convert it into a parser file: bison FILE_NAME.y In this example the file was called `rpcalc.y' (for "Reverse Polish CALCulator"). Bison produces a file named `FILE_NAME.tab.c', removing the `.y' from the original file name. The file output by Bison contains the source code for `yyparse'. The additional functions in the input file (`yylex', `yyerror' and `main') are copied verbatim to the output.  File: bison.info, Node: Rpcalc Compile, Prev: Rpcalc Gen, Up: RPN Calc Compiling the Parser File ------------------------- Here is how to compile and run the parser file: # List files in current directory. % ls rpcalc.tab.c rpcalc.y # Compile the Bison parser. # `-lm' tells compiler to search math library for `pow'. % cc rpcalc.tab.c -lm -o rpcalc # List files again. % ls rpcalc rpcalc.tab.c rpcalc.y The file `rpcalc' now contains the executable code. Here is an example session using `rpcalc'. % rpcalc 4 9 + 13 3 7 + 3 4 5 *+- -13 3 7 + 3 4 5 * + - n Note the unary minus, `n' 13 5 6 / 4 n + -3.166666667 3 4 ^ Exponentiation 81 ^D End-of-file indicator %  File: bison.info, Node: Infix Calc, Next: Simple Error Recovery, Prev: RPN Calc, Up: Examples Infix Notation Calculator: `calc' ================================= We now modify rpcalc to handle infix operators instead of postfix. Infix notation involves the concept of operator precedence and the need for parentheses nested to arbitrary depth. Here is the Bison code for `calc.y', an infix desk-top calculator. /* Infix notation calculator--calc */ %{ #define YYSTYPE double #include %} /* BISON Declarations */ %token NUM %left '-' '+' %left '*' '/' %left NEG /* negation--unary minus */ %right '^' /* exponentiation */ /* Grammar follows */ %% input: /* empty string */ | input line ; line: '\n' | exp '\n' { printf ("\t%.10g\n", $1); } ; exp: NUM { $$ = $1; } | exp '+' exp { $$ = $1 + $3; } | exp '-' exp { $$ = $1 - $3; } | exp '*' exp { $$ = $1 * $3; } | exp '/' exp { $$ = $1 / $3; } | '-' exp %prec NEG { $$ = -$2; } | exp '^' exp { $$ = pow ($1, $3); } | '(' exp ')' { $$ = $2; } ; %% The functions `yylex', `yyerror' and `main' can be the same as before. There are two important new features shown in this code. In the second section (Bison declarations), `%left' declares token types and says they are left-associative operators. The declarations `%left' and `%right' (right associativity) take the place of `%token' which is used to declare a token type name without associativity. (These tokens are single-character literals, which ordinarily don't need to be declared. We declare them here to specify the associativity.) Operator precedence is determined by the line ordering of the declarations; the higher the line number of the declaration (lower on the page or screen), the higher the precedence. Hence, exponentiation has the highest precedence, unary minus (`NEG') is next, followed by `*' and `/', and so on. *Note Operator Precedence: Precedence. The other important new feature is the `%prec' in the grammar section for the unary minus operator. The `%prec' simply instructs Bison that the rule `| '-' exp' has the same precedence as `NEG'--in this case the next-to-highest. *Note Context-Dependent Precedence: Contextual Precedence. Here is a sample run of `calc.y': % calc 4 + 4.5 - (34/(8*3+-3)) 6.880952381 -56 + 2 -54 3 ^ 2 9  File: bison.info, Node: Simple Error Recovery, Next: Multi-function Calc, Prev: Infix Calc, Up: Examples Simple Error Recovery ===================== Up to this point, this manual has not addressed the issue of "error recovery"--how to continue parsing after the parser detects a syntax error. All we have handled is error reporting with `yyerror'. Recall that by default `yyparse' returns after calling `yyerror'. This means that an erroneous input line causes the calculator program to exit. Now we show how to rectify this deficiency. The Bison language itself includes the reserved word `error', which may be included in the grammar rules. In the example below it has been added to one of the alternatives for `line': line: '\n' | exp '\n' { printf ("\t%.10g\n", $1); } | error '\n' { yyerrok; } ; This addition to the grammar allows for simple error recovery in the event of a parse error. If an expression that cannot be evaluated is read, the error will be recognized by the third rule for `line', and parsing will continue. (The `yyerror' function is still called upon to print its message as well.) The action executes the statement `yyerrok', a macro defined automatically by Bison; its meaning is that error recovery is complete (*note Error Recovery::). Note the difference between `yyerrok' and `yyerror'; neither one is a misprint. This form of error recovery deals with syntax errors. There are other kinds of errors; for example, division by zero, which raises an exception signal that is normally fatal. A real calculator program must handle this signal and use `longjmp' to return to `main' and resume parsing input lines; it would also have to discard the rest of the current line of input. We won't discuss this issue further because it is not specific to Bison programs.  File: bison.info, Node: Multi-function Calc, Next: Exercises, Prev: Simple Error Recovery, Up: Examples Multi-Function Calculator: `mfcalc' =================================== Now that the basics of Bison have been discussed, it is time to move on to a more advanced problem. The above calculators provided only five functions, `+', `-', `*', `/' and `^'. It would be nice to have a calculator that provides other mathematical functions such as `sin', `cos', etc. It is easy to add new operators to the infix calculator as long as they are only single-character literals. The lexical analyzer `yylex' passes back all non-number characters as tokens, so new grammar rules suffice for adding a new operator. But we want something more flexible: built-in functions whose syntax has this form: FUNCTION_NAME (ARGUMENT) At the same time, we will add memory to the calculator, by allowing you to create named variables, store values in them, and use them later. Here is a sample session with the multi-function calculator: % mfcalc pi = 3.141592653589 3.1415926536 sin(pi) 0.0000000000 alpha = beta1 = 2.3 2.3000000000 alpha 2.3000000000 ln(alpha) 0.8329091229 exp(ln(beta1)) 2.3000000000 % Note that multiple assignment and nested function calls are permitted. * Menu: * Decl: Mfcalc Decl. Bison declarations for multi-function calculator. * Rules: Mfcalc Rules. Grammar rules for the calculator. * Symtab: Mfcalc Symtab. Symbol table management subroutines.  File: bison.info, Node: Mfcalc Decl, Next: Mfcalc Rules, Up: Multi-function Calc Declarations for `mfcalc' ------------------------- Here are the C and Bison declarations for the multi-function calculator. %{ #include /* For math functions, cos(), sin(), etc. */ #include "calc.h" /* Contains definition of `symrec' */ %} %union { double val; /* For returning numbers. */ symrec *tptr; /* For returning symbol-table pointers */ } %token NUM /* Simple double precision number */ %token VAR FNCT /* Variable and Function */ %type exp %right '=' %left '-' '+' %left '*' '/' %left NEG /* Negation--unary minus */ %right '^' /* Exponentiation */ /* Grammar follows */ %% The above grammar introduces only two new features of the Bison language. These features allow semantic values to have various data types (*note More Than One Value Type: Multiple Types.). The `%union' declaration specifies the entire list of possible types; this is instead of defining `YYSTYPE'. The allowable types are now double-floats (for `exp' and `NUM') and pointers to entries in the symbol table. *Note The Collection of Value Types: Union Decl. Since values can now have various types, it is necessary to associate a type with each grammar symbol whose semantic value is used. These symbols are `NUM', `VAR', `FNCT', and `exp'. Their declarations are augmented with information about their data type (placed between angle brackets). The Bison construct `%type' is used for declaring nonterminal symbols, just as `%token' is used for declaring token types. We have not used `%type' before because nonterminal symbols are normally declared implicitly by the rules that define them. But `exp' must be declared explicitly so we can specify its value type. *Note Nonterminal Symbols: Type Decl.  File: bison.info, Node: Mfcalc Rules, Next: Mfcalc Symtab, Prev: Mfcalc Decl, Up: Multi-function Calc Grammar Rules for `mfcalc' -------------------------- Here are the grammar rules for the multi-function calculator. Most of them are copied directly from `calc'; three rules, those which mention `VAR' or `FNCT', are new. input: /* empty */ | input line ; line: '\n' | exp '\n' { printf ("\t%.10g\n", $1); } | error '\n' { yyerrok; } ; exp: NUM { $$ = $1; } | VAR { $$ = $1->value.var; } | VAR '=' exp { $$ = $3; $1->value.var = $3; } | FNCT '(' exp ')' { $$ = (*($1->value.fnctptr))($3); } | exp '+' exp { $$ = $1 + $3; } | exp '-' exp { $$ = $1 - $3; } | exp '*' exp { $$ = $1 * $3; } | exp '/' exp { $$ = $1 / $3; } | '-' exp %prec NEG { $$ = -$2; } | exp '^' exp { $$ = pow ($1, $3); } | '(' exp ')' { $$ = $2; } ; /* End of grammar */ %%  File: bison.info, Node: Mfcalc Symtab, Prev: Mfcalc Rules, Up: Multi-function Calc The `mfcalc' Symbol Table ------------------------- The multi-function calculator requires a symbol table to keep track of the names and meanings of variables and functions. This doesn't affect the grammar rules (except for the actions) or the Bison declarations, but it requires some additional C functions for support. The symbol table itself consists of a linked list of records. Its definition, which is kept in the header `calc.h', is as follows. It provides for either functions or variables to be placed in the table. /* Data type for links in the chain of symbols. */ struct symrec { char *name; /* name of symbol */ int type; /* type of symbol: either VAR or FNCT */ union { double var; /* value of a VAR */ double (*fnctptr)(); /* value of a FNCT */ } value; struct symrec *next; /* link field */ }; typedef struct symrec symrec; /* The symbol table: a chain of `struct symrec'. */ extern symrec *sym_table; symrec *putsym (); symrec *getsym (); The new version of `main' includes a call to `init_table', a function that initializes the symbol table. Here it is, and `init_table' as well: #include main () { init_table (); yyparse (); } yyerror (s) /* Called by yyparse on error */ char *s; { printf ("%s\n", s); } struct init { char *fname; double (*fnct)(); }; struct init arith_fncts[] = { "sin", sin, "cos", cos, "atan", atan, "ln", log, "exp", exp, "sqrt", sqrt, 0, 0 }; /* The symbol table: a chain of `struct symrec'. */ symrec *sym_table = (symrec *)0; init_table () /* puts arithmetic functions in table. */ { int i; symrec *ptr; for (i = 0; arith_fncts[i].fname != 0; i++) { ptr = putsym (arith_fncts[i].fname, FNCT); ptr->value.fnctptr = arith_fncts[i].fnct; } } By simply editing the initialization list and adding the necessary include files, you can add additional functions to the calculator. Two important functions allow look-up and installation of symbols in the symbol table. The function `putsym' is passed a name and the type (`VAR' or `FNCT') of the object to be installed. The object is linked to the front of the list, and a pointer to the object is returned. The function `getsym' is passed the name of the symbol to look up. If found, a pointer to that symbol is returned; otherwise zero is returned. symrec * putsym (sym_name,sym_type) char *sym_name; int sym_type; { symrec *ptr; ptr = (symrec *) malloc (sizeof (symrec)); ptr->name = (char *) malloc (strlen (sym_name) + 1); strcpy (ptr->name,sym_name); ptr->type = sym_type; ptr->value.var = 0; /* set value to 0 even if fctn. */ ptr->next = (struct symrec *)sym_table; sym_table = ptr; return ptr; } symrec * getsym (sym_name) char *sym_name; { symrec *ptr; for (ptr = sym_table; ptr != (symrec *) 0; ptr = (symrec *)ptr->next) if (strcmp (ptr->name,sym_name) == 0) return ptr; return 0; } The function `yylex' must now recognize variables, numeric values, and the single-character arithmetic operators. Strings of alphanumeric characters with a leading nondigit are recognized as either variables or functions depending on what the symbol table says about them. The string is passed to `getsym' for look up in the symbol table. If the name appears in the table, a pointer to its location and its type (`VAR' or `FNCT') is returned to `yyparse'. If it is not already in the table, then it is installed as a `VAR' using `putsym'. Again, a pointer and its type (which must be `VAR') is returned to `yyparse'. No change is needed in the handling of numeric values and arithmetic operators in `yylex'. #include yylex () { int c; /* Ignore whitespace, get first nonwhite character. */ while ((c = getchar ()) == ' ' || c == '\t'); if (c == EOF) return 0; /* Char starts a number => parse the number. */ if (c == '.' || isdigit (c)) { ungetc (c, stdin); scanf ("%lf", &yylval.val); return NUM; } /* Char starts an identifier => read the name. */ if (isalpha (c)) { symrec *s; static char *symbuf = 0; static int length = 0; int i; /* Initially make the buffer long enough for a 40-character symbol name. */ if (length == 0) length = 40, symbuf = (char *)malloc (length + 1); i = 0; do { /* If buffer is full, make it bigger. */ if (i == length) { length *= 2; symbuf = (char *)realloc (symbuf, length + 1); } /* Add this character to the buffer. */ symbuf[i++] = c; /* Get another character. */ c = getchar (); } while (c != EOF && isalnum (c)); ungetc (c, stdin); symbuf[i] = '\0'; s = getsym (symbuf); if (s == 0) s = putsym (symbuf, VAR); yylval.tptr = s; return s->type; } /* Any other character is a token by itself. */ return c; } This program is both powerful and flexible. You may easily add new functions, and it is a simple job to modify this code to install predefined variables such as `pi' or `e' as well.  File: bison.info, Node: Exercises, Prev: Multi-function Calc, Up: Examples Exercises ========= 1. Add some new functions from `math.h' to the initialization list. 2. Add another array that contains constants and their values. Then modify `init_table' to add these constants to the symbol table. It will be easiest to give the constants type `VAR'. 3. Make the program report an error if the user refers to an uninitialized variable in any way except to store a value in it.  File: bison.info, Node: Grammar File, Next: Interface, Prev: Examples, Up: Top Bison Grammar Files ******************* Bison takes as input a context-free grammar specification and produces a C-language function that recognizes correct instances of the grammar. The Bison grammar input file conventionally has a name ending in `.y'. * Menu: * Grammar Outline:: Overall layout of the grammar file. * Symbols:: Terminal and nonterminal symbols. * Rules:: How to write grammar rules. * Recursion:: Writing recursive rules. * Semantics:: Semantic values and actions. * Declarations:: All kinds of Bison declarations are described here. * Multiple Parsers:: Putting more than one Bison parser in one program.  File: bison.info, Node: Grammar Outline, Next: Symbols, Up: Grammar File Outline of a Bison Grammar ========================== A Bison grammar file has four main sections, shown here with the appropriate delimiters: %{ C DECLARATIONS %} BISON DECLARATIONS %% GRAMMAR RULES %% ADDITIONAL C CODE Comments enclosed in `/* ... */' may appear in any of the sections. * Menu: * C Declarations:: Syntax and usage of the C declarations section. * Bison Declarations:: Syntax and usage of the Bison declarations section. * Grammar Rules:: Syntax and usage of the grammar rules section. * C Code:: Syntax and usage of the additional C code section.  File: bison.info, Node: C Declarations, Next: Bison Declarations, Up: Grammar Outline The C Declarations Section -------------------------- The C DECLARATIONS section contains macro definitions and declarations of functions and variables that are used in the actions in the grammar rules. These are copied to the beginning of the parser file so that they precede the definition of `yyparse'. You can use `#include' to get the declarations from a header file. If you don't need any C declarations, you may omit the `%{' and `%}' delimiters that bracket this section.  File: bison.info, Node: Bison Declarations, Next: Grammar Rules, Prev: C Declarations, Up: Grammar Outline The Bison Declarations Section ------------------------------ The BISON DECLARATIONS section contains declarations that define terminal and nonterminal symbols, specify precedence, and so on. In some simple grammars you may not need any declarations. *Note Bison Declarations: Declarations.  File: bison.info, Node: Grammar Rules, Next: C Code, Prev: Bison Declarations, Up: Grammar Outline The Grammar Rules Section ------------------------- The "grammar rules" section contains one or more Bison grammar rules, and nothing else. *Note Syntax of Grammar Rules: Rules. There must always be at least one grammar rule, and the first `%%' (which precedes the grammar rules) may never be omitted even if it is the first thing in the file.  File: bison.info, Node: C Code, Prev: Grammar Rules, Up: Grammar Outline The Additional C Code Section ----------------------------- The ADDITIONAL C CODE section is copied verbatim to the end of the parser file, just as the C DECLARATIONS section is copied to the beginning. This is the most convenient place to put anything that you want to have in the parser file but which need not come before the definition of `yyparse'. For example, the definitions of `yylex' and `yyerror' often go here. *Note Parser C-Language Interface: Interface. If the last section is empty, you may omit the `%%' that separates it from the grammar rules. The Bison parser itself contains many static variables whose names start with `yy' and many macros whose names start with `YY'. It is a good idea to avoid using any such names (except those documented in this manual) in the additional C code section of the grammar file.  File: bison.info, Node: Symbols, Next: Rules, Prev: Grammar Outline, Up: Grammar File Symbols, Terminal and Nonterminal ================================= "Symbols" in Bison grammars represent the grammatical classifications of the language. A "terminal symbol" (also known as a "token type") represents a class of syntactically equivalent tokens. You use the symbol in grammar rules to mean that a token in that class is allowed. The symbol is represented in the Bison parser by a numeric code, and the `yylex' function returns a token type code to indicate what kind of token has been read. You don't need to know what the code value is; you can use the symbol to stand for it. A "nonterminal symbol" stands for a class of syntactically equivalent groupings. The symbol name is used in writing grammar rules. By convention, it should be all lower case. Symbol names can contain letters, digits (not at the beginning), underscores and periods. Periods make sense only in nonterminals. There are three ways of writing terminal symbols in the grammar: * A "named token type" is written with an identifier, like an identifier in C. By convention, it should be all upper case. Each such name must be defined with a Bison declaration such as `%token'. *Note Token Type Names: Token Decl. * A "character token type" (or "literal character token") is written in the grammar using the same syntax used in C for character constants; for example, `'+'' is a character token type. A character token type doesn't need to be declared unless you need to specify its semantic value data type (*note Data Types of Semantic Values: Value Type.), associativity, or precedence (*note Operator Precedence: Precedence.). By convention, a character token type is used only to represent a token that consists of that particular character. Thus, the token type `'+'' is used to represent the character `+' as a token. Nothing enforces this convention, but if you depart from it, your program will confuse other readers. All the usual escape sequences used in character literals in C can be used in Bison as well, but you must not use the null character as a character literal because its ASCII code, zero, is the code `yylex' returns for end-of-input (*note Calling Convention for `yylex': Calling Convention.). * A "literal string token" is written like a C string constant; for example, `"<="' is a literal string token. A literal string token doesn't need to be declared unless you need to specify its semantic value data type (*note Value Type::), associativity, precedence (*note Precedence::). You can associate the literal string token with a symbolic name as an alias, using the `%token' declaration (*note Token Declarations: Token Decl.). If you don't do that, the lexical analyzer has to retrieve the token number for the literal string token from the `yytname' table (*note Calling Convention::). *WARNING*: literal string tokens do not work in Yacc. By convention, a literal string token is used only to represent a token that consists of that particular string. Thus, you should use the token type `"<="' to represent the string `<=' as a token. Bison does not enforces this convention, but if you depart from it, people who read your program will be confused. All the escape sequences used in string literals in C can be used in Bison as well. A literal string token must contain two or more characters; for a token containing just one character, use a character token (see above). How you choose to write a terminal symbol has no effect on its grammatical meaning. That depends only on where it appears in rules and on when the parser function returns that symbol. The value returned by `yylex' is always one of the terminal symbols (or 0 for end-of-input). Whichever way you write the token type in the grammar rules, you write it the same way in the definition of `yylex'. The numeric code for a character token type is simply the ASCII code for the character, so `yylex' can use the identical character constant to generate the requisite code. Each named token type becomes a C macro in the parser file, so `yylex' can use the name to stand for the code. (This is why periods don't make sense in terminal symbols.) *Note Calling Convention for `yylex': Calling Convention. If `yylex' is defined in a separate file, you need to arrange for the token-type macro definitions to be available there. Use the `-d' option when you run Bison, so that it will write these macro definitions into a separate header file `NAME.tab.h' which you can include in the other source files that need it. *Note Invoking Bison: Invocation. The symbol `error' is a terminal symbol reserved for error recovery (*note Error Recovery::); you shouldn't use it for any other purpose. In particular, `yylex' should never return this value.  File: bison.info, Node: Rules, Next: Recursion, Prev: Symbols, Up: Grammar File Syntax of Grammar Rules ======================= A Bison grammar rule has the following general form: RESULT: COMPONENTS... ; where RESULT is the nonterminal symbol that this rule describes and COMPONENTS are various terminal and nonterminal symbols that are put together by this rule (*note Symbols::). For example, exp: exp '+' exp ; says that two groupings of type `exp', with a `+' token in between, can be combined into a larger grouping of type `exp'. Whitespace in rules is significant only to separate symbols. You can add extra whitespace as you wish. Scattered among the components can be ACTIONS that determine the semantics of the rule. An action looks like this: {C STATEMENTS} Usually there is only one action and it follows the components. *Note Actions::. Multiple rules for the same RESULT can be written separately or can be joined with the vertical-bar character `|' as follows: RESULT: RULE1-COMPONENTS... | RULE2-COMPONENTS... ... ; They are still considered distinct rules even when joined in this way. If COMPONENTS in a rule is empty, it means that RESULT can match the empty string. For example, here is how to define a comma-separated sequence of zero or more `exp' groupings: expseq: /* empty */ | expseq1 ; expseq1: exp | expseq1 ',' exp ; It is customary to write a comment `/* empty */' in each rule with no components.  File: bison.info, Node: Recursion, Next: Semantics, Prev: Rules, Up: Grammar File Recursive Rules =============== A rule is called "recursive" when its RESULT nonterminal appears also on its right hand side. Nearly all Bison grammars need to use recursion, because that is the only way to define a sequence of any number of somethings. Consider this recursive definition of a comma-separated sequence of one or more expressions: expseq1: exp | expseq1 ',' exp ; Since the recursive use of `expseq1' is the leftmost symbol in the right hand side, we call this "left recursion". By contrast, here the same construct is defined using "right recursion": expseq1: exp | exp ',' expseq1 ; Any kind of sequence can be defined using either left recursion or right recursion, but you should always use left recursion, because it can parse a sequence of any number of elements with bounded stack space. Right recursion uses up space on the Bison stack in proportion to the number of elements in the sequence, because all the elements must be shifted onto the stack before the rule can be applied even once. *Note The Bison Parser Algorithm: Algorithm, for further explanation of this. "Indirect" or "mutual" recursion occurs when the result of the rule does not appear directly on its right hand side, but does appear in rules for other nonterminals which do appear on its right hand side. For example: expr: primary | primary '+' primary ; primary: constant | '(' expr ')' ; defines two mutually-recursive nonterminals, since each refers to the other.  File: bison.info, Node: Semantics, Next: Declarations, Prev: Recursion, Up: Grammar File Defining Language Semantics =========================== The grammar rules for a language determine only the syntax. The semantics are determined by the semantic values associated with various tokens and groupings, and by the actions taken when various groupings are recognized. For example, the calculator calculates properly because the value associated with each expression is the proper number; it adds properly because the action for the grouping `X + Y' is to add the numbers associated with X and Y. * Menu: * Value Type:: Specifying one data type for all semantic values. * Multiple Types:: Specifying several alternative data types. * Actions:: An action is the semantic definition of a grammar rule. * Action Types:: Specifying data types for actions to operate on. * Mid-Rule Actions:: Most actions go at the end of a rule. This says when, why and how to use the exceptional action in the middle of a rule.  File: bison.info, Node: Value Type, Next: Multiple Types, Up: Semantics Data Types of Semantic Values ----------------------------- In a simple program it may be sufficient to use the same data type for the semantic values of all language constructs. This was true in the RPN and infix calculator examples (*note Reverse Polish Notation Calculator: RPN Calc.). Bison's default is to use type `int' for all semantic values. To specify some other type, define `YYSTYPE' as a macro, like this: #define YYSTYPE double This macro definition must go in the C declarations section of the grammar file (*note Outline of a Bison Grammar: Grammar Outline.).  File: bison.info, Node: Multiple Types, Next: Actions, Prev: Value Type, Up: Semantics More Than One Value Type ------------------------ In most programs, you will need different data types for different kinds of tokens and groupings. For example, a numeric constant may need type `int' or `long', while a string constant needs type `char *', and an identifier might need a pointer to an entry in the symbol table. To use more than one data type for semantic values in one parser, Bison requires you to do two things: * Specify the entire collection of possible data types, with the `%union' Bison declaration (*note The Collection of Value Types: Union Decl.). * Choose one of those types for each symbol (terminal or nonterminal) for which semantic values are used. This is done for tokens with the `%token' Bison declaration (*note Token Type Names: Token Decl.) and for groupings with the `%type' Bison declaration (*note Nonterminal Symbols: Type Decl.).  File: bison.info, Node: Actions, Next: Action Types, Prev: Multiple Types, Up: Semantics Actions ------- An action accompanies a syntactic rule and contains C code to be executed each time an instance of that rule is recognized. The task of most actions is to compute a semantic value for the grouping built by the rule from the semantic values associated with tokens or smaller groupings. An action consists of C statements surrounded by braces, much like a compound statement in C. It can be placed at any position in the rule; it is executed at that position. Most rules have just one action at the end of the rule, following all the components. Actions in the middle of a rule are tricky and used only for special purposes (*note Actions in Mid-Rule: Mid-Rule Actions.). The C code in an action can refer to the semantic values of the components matched by the rule with the construct `$N', which stands for the value of the Nth component. The semantic value for the grouping being constructed is `$$'. (Bison translates both of these constructs into array element references when it copies the actions into the parser file.) Here is a typical example: exp: ... | exp '+' exp { $$ = $1 + $3; } This rule constructs an `exp' from two smaller `exp' groupings connected by a plus-sign token. In the action, `$1' and `$3' refer to the semantic values of the two component `exp' groupings, which are the first and third symbols on the right hand side of the rule. The sum is stored into `$$' so that it becomes the semantic value of the addition-expression just recognized by the rule. If there were a useful semantic value associated with the `+' token, it could be referred to as `$2'. If you don't specify an action for a rule, Bison supplies a default: `$$ = $1'. Thus, the value of the first symbol in the rule becomes the value of the whole rule. Of course, the default rule is valid only if the two data types match. There is no meaningful default action for an empty rule; every empty rule must have an explicit action unless the rule's value does not matter. `$N' with N zero or negative is allowed for reference to tokens and groupings on the stack _before_ those that match the current rule. This is a very risky practice, and to use it reliably you must be certain of the context in which the rule is applied. Here is a case in which you can use this reliably: foo: expr bar '+' expr { ... } | expr bar '-' expr { ... } ; bar: /* empty */ { previous_expr = $0; } ; As long as `bar' is used only in the fashion shown here, `$0' always refers to the `expr' which precedes `bar' in the definition of `foo'.  File: bison.info, Node: Action Types, Next: Mid-Rule Actions, Prev: Actions, Up: Semantics Data Types of Values in Actions ------------------------------- If you have chosen a single data type for semantic values, the `$$' and `$N' constructs always have that data type. If you have used `%union' to specify a variety of data types, then you must declare a choice among these types for each terminal or nonterminal symbol that can have a semantic value. Then each time you use `$$' or `$N', its data type is determined by which symbol it refers to in the rule. In this example, exp: ... | exp '+' exp { $$ = $1 + $3; } `$1' and `$3' refer to instances of `exp', so they all have the data type declared for the nonterminal symbol `exp'. If `$2' were used, it would have the data type declared for the terminal symbol `'+'', whatever that might be. Alternatively, you can specify the data type when you refer to the value, by inserting `' after the `$' at the beginning of the reference. For example, if you have defined types as shown here: %union { int itype; double dtype; } then you can write `$1' to refer to the first subunit of the rule as an integer, or `$1' to refer to it as a double. dibbler-1.0.1/bison++/mkinstalldirs0000755000175000017500000000672212277722750014125 00000000000000#! /bin/sh # mkinstalldirs --- make directory hierarchy scriptversion=2009-04-28.21; # UTC # Original author: Noah Friedman # Created: 1993-05-16 # Public domain. # # This file is maintained in Automake, please report # bugs to or send patches to # . nl=' ' IFS=" "" $nl" errstatus=0 dirmode= usage="\ Usage: mkinstalldirs [-h] [--help] [--version] [-m MODE] DIR ... Create each directory DIR (with mode MODE, if specified), including all leading file name components. Report bugs to ." # process command line arguments while test $# -gt 0 ; do case $1 in -h | --help | --h*) # -h for help echo "$usage" exit $? ;; -m) # -m PERM arg shift test $# -eq 0 && { echo "$usage" 1>&2; exit 1; } dirmode=$1 shift ;; --version) echo "$0 $scriptversion" exit $? ;; --) # stop option processing shift break ;; -*) # unknown option echo "$usage" 1>&2 exit 1 ;; *) # first non-opt arg break ;; esac done for file do if test -d "$file"; then shift else break fi done case $# in 0) exit 0 ;; esac # Solaris 8's mkdir -p isn't thread-safe. If you mkdir -p a/b and # mkdir -p a/c at the same time, both will detect that a is missing, # one will create a, then the other will try to create a and die with # a "File exists" error. This is a problem when calling mkinstalldirs # from a parallel make. We use --version in the probe to restrict # ourselves to GNU mkdir, which is thread-safe. case $dirmode in '') if mkdir -p --version . >/dev/null 2>&1 && test ! -d ./--version; then echo "mkdir -p -- $*" exec mkdir -p -- "$@" else # On NextStep and OpenStep, the 'mkdir' command does not # recognize any option. It will interpret all options as # directories to create, and then abort because '.' already # exists. test -d ./-p && rmdir ./-p test -d ./--version && rmdir ./--version fi ;; *) if mkdir -m "$dirmode" -p --version . >/dev/null 2>&1 && test ! -d ./--version; then echo "mkdir -m $dirmode -p -- $*" exec mkdir -m "$dirmode" -p -- "$@" else # Clean up after NextStep and OpenStep mkdir. for d in ./-m ./-p ./--version "./$dirmode"; do test -d $d && rmdir $d done fi ;; esac for file do case $file in /*) pathcomp=/ ;; *) pathcomp= ;; esac oIFS=$IFS IFS=/ set fnord $file shift IFS=$oIFS for d do test "x$d" = x && continue pathcomp=$pathcomp$d case $pathcomp in -*) pathcomp=./$pathcomp ;; esac if test ! -d "$pathcomp"; then echo "mkdir $pathcomp" mkdir "$pathcomp" || lasterr=$? if test ! -d "$pathcomp"; then errstatus=$lasterr else if test ! -z "$dirmode"; then echo "chmod $dirmode $pathcomp" lasterr= chmod "$dirmode" "$pathcomp" || lasterr=$? if test ! -z "$lasterr"; then errstatus=$lasterr fi fi fi fi pathcomp=$pathcomp/ done done exit $errstatus # Local Variables: # mode: shell-script # sh-indentation: 2 # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC" # time-stamp-end: "; # UTC" # End: dibbler-1.0.1/bison++/types.h0000664000175000017500000000164312233256142012620 00000000000000/* Define data type for representing bison's grammar input as it is parsed, Copyright (C) 1984, 1989 Free Software Foundation, Inc. This file is part of Bison, the GNU Compiler Compiler. Bison 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. Bison 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 Bison; see the file COPYING. If not, write to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ typedef struct shorts { struct shorts *next; short value; } shorts; dibbler-1.0.1/bison++/getargs.cc0000664000175000017500000000673412233256142013254 00000000000000/* Parse command line arguments for bison, Copyright (C) 1984, 1986, 1989 Free Software Foundation, Inc. This file is part of Bison, the GNU Compiler Compiler. Bison 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. Bison 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 Bison; see the file COPYING. If not, write to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ #include #include "getopt.h" #include "system.h" #include "files.h" int verboseflag; int definesflag; int debugflag; int nolinesflag; char *spec_name_prefix; /* for -p. */ char *spec_file_prefix; /* for -b. */ extern int fixed_outfiles;/* for -y */ extern char *header_name; extern char *program_name; extern char *version_string; extern void fatal(); struct option longopts[] = { {"debug", 0, &debugflag, 1}, {"defines", 0, &definesflag, 1}, {"file-prefix", 1, 0, 'b'}, {"fixed-output-files", 0, &fixed_outfiles, 1}, {"name-prefix", 1, 0, 'a'}, {"no-lines", 0, &nolinesflag, 1}, {"output-file", 1, 0, 'o'}, {"output", 1, 0, 'o'}, {"verbose", 0, &verboseflag, 1}, {"version", 0, 0, 'V'}, {"yacc", 0, &fixed_outfiles, 1}, {"skeleton", 1, 0, 'S'}, {"headerskeleton", 1, 0, 'H'}, {"header-file", 1, 0, 'h'}, {"help", 0, 0, 'u'}, {"usage", 0, 0, 'u'}, {0, 0, 0, 0} }; void usage (FILE* stream) { fprintf (stderr, "\ Usage: %s [-dltvyVu] [-b file-prefix] [-p name-prefix]\n\ [-o outfile] [-h headerfile]\n\ [-S skeleton] [-H header-skeleton]\n\ [--debug] [--defines] [--fixed-output-files] [--no-lines]\n\ [--verbose] [--version] [--yacc] [--usage] [--help]\n\ [--file-prefix=prefix] [--name-prefix=prefix]\n\ [--skeleton=skeletonfile] [--headerskeleton=headerskeletonfile]\n\ [--output=outfile] [--header-name=header] grammar-file\n", program_name); } void getargs(int argc, char** argv) { register int c; verboseflag = 0; definesflag = 0; debugflag = 0; fixed_outfiles = 0; while ((c = getopt_long (argc, argv, "yvdltVuo:b:p:S:H:h:", longopts, (int *)0)) != EOF) { switch (c) { case 0: /* Certain long options cause getopt_long to return 0. */ break; case 'y': fixed_outfiles = 1; break; case 'V': printf("%s", version_string); exit(0); case 'v': verboseflag = 1; break; case 'd': definesflag = 1; break; case 'l': nolinesflag = 1; break; case 't': debugflag = 1; break; case 'o': spec_outfile = optarg; break; case 'b': spec_file_prefix = optarg; break; case 'p': spec_name_prefix = optarg; break; case 'S': cparserfile = optarg; break; case 'H': hskelfile = optarg; break; case 'h': header_name = optarg; break; case 'u': usage(stdout); exit (0); default: usage(stderr); exit (1); } } if (optind == argc) { fprintf(stderr, "%s: no grammar file given\n", program_name); exit(1); } if (optind < argc - 1) fprintf(stderr, "%s: warning: extra arguments ignored\n", program_name); infile = argv[optind]; } dibbler-1.0.1/bison++/files.cc0000664000175000017500000002215512233256142012715 00000000000000/* Open and close files for bison, Copyright (C) 1984, 1986, 1989 Free Software Foundation, Inc. This file is part of Bison, the GNU Compiler Compiler. Bison 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. Bison 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 Bison; see the file COPYING. If not, write to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ #ifndef XPFILE #define XPFILE "bison.cc" #endif #ifndef XPFILE1 #define XPFILE1 "bison.hairy" #endif #ifndef XHFILE #define XHFILE "bison.h" #endif #include #include "system.h" #include "files.h" #include "new.h" #include "gram.h" FILE *finput = NULL; FILE *foutput = NULL; FILE *fdefines = NULL; FILE *ftable = NULL; FILE *fattrs = NULL; FILE *fguard = NULL; FILE *faction = NULL; FILE *fparser = NULL; FILE *fbisoncomp = NULL; /* outputs YY_USE_CLASS defs (i.e bison or bison++ output*/ extern bool bison_compability; /* File name specified with -o for the output file, or 0 if no -o. */ char *spec_outfile; char *infile; char *outfile; char *defsfile; char *tabfile; char *attrsfile; char *guardfile; char *tmpattrsfile; char *tmptabfile; char *tmpdefsfile; char *tmpbisoncompfile; /* AC added */ char *hskelfile=NULL; char *cparserfile=NULL; FILE *fhskel=NULL; char *parser_name="parse"; int parser_defined=0; int line_fparser=1; int line_fhskel=1; char *parser_fname="bison.cc"; char *hskel_fname="bison.h"; char *header_name=NULL; /* AC added end*/ extern char *mktemp(); /* So the compiler won't complain */ extern char *getenv(); extern void perror(); FILE *tryopen(char*,char*); /* This might be a good idea */ extern void done(int); extern char *program_name; extern int verboseflag; extern int definesflag; int fixed_outfiles = 0; static char *c_suffixes[]= {".tab.c",".tab.cc",".tab.cpp",".tab.cxx",".tab.C", ".c",".cc",".cpp",".cxx",".C",".CPP",".CXX",".CC",(char *)0}; char* stringappend(char* string1, int end1, char* string2) { register char *ostring; register char *cp, *cp1; register int i; cp = string2; i = 0; while (*cp++) i++; ostring = NEW2(i+end1+1, char); cp = ostring; cp1 = string1; for (i = 0; i < end1; i++) *cp++ = *cp1++; cp1 = string2; while (*cp++ = *cp1++) ; return ostring; } /* JF this has been hacked to death. Nowaday it sets up the file names for the output files, and opens the tmp files and the parser */ // Cleaned up under bison_compability run.x void openfiles() { char *name_base; register char *cp; char *filename; int base_length; int short_base_length; char *tmp_base = "/tmp/b."; int tmp_len; tmp_len = strlen (tmp_base); if (spec_outfile) { /* -o was specified. The precise -o name will be used for ftable. For other output files, remove the ".c" or ".tab.c" suffix. */ name_base = spec_outfile; base_length = strlen (name_base); /* SHORT_BASE_LENGTH includes neither ".tab" nor ".c". */ char **suffix; for(suffix=c_suffixes;*suffix;suffix++) /* try to detect .c .cpp .tab.c ... options */ { if(strlen(name_base)>strlen(*suffix) && strcmp(name_base+base_length-strlen(*suffix),*suffix)==0) { base_length -= strlen(*suffix); break; } }; short_base_length=base_length; } else if (spec_file_prefix) { /* -b was specified. Construct names from it. */ /* SHORT_BASE_LENGTH includes neither ".tab" nor ".c". */ short_base_length = strlen (spec_file_prefix); /* Count room for `.tab'. */ base_length = short_base_length + 4; name_base = (char *) xmalloc (base_length + 1); /* Append `.tab'. */ strcpy (name_base, spec_file_prefix); strcat (name_base, ".tab"); } else { /* -o was not specified; compute output file name from input or use y.tab.c, etc., if -y was specified. */ if(fixed_outfiles) { name_base = (char*) malloc(sizeof(char)*10); strcpy(name_base,"y.y"); } else name_base = infile; /* BASE_LENGTH gets length of NAME_BASE, sans ".y" suffix if any. */ base_length = strlen (name_base); if (!strcmp (name_base + base_length - 2, ".y")) base_length -= 2; short_base_length = base_length; name_base = stringappend(name_base, short_base_length, ".tab"); base_length = short_base_length + 4; } finput = tryopen(infile, "r"); filename=cparserfile; if(filename==NULL) filename = getenv("BISON_SIMPLE"); { if(filename) { parser_fname=(char *)xmalloc(strlen(filename)+1); strcpy(parser_fname,filename); } else { parser_fname=(char *)xmalloc(strlen(PFILE)+1); strcpy(parser_fname,PFILE); } } fparser = tryopen(parser_fname, "r"); filename=hskelfile; if(filename==NULL) filename = getenv("BISON_SIMPLE_H"); { if(filename) { hskel_fname=(char *)xmalloc(strlen(filename)+1); strcpy(hskel_fname,filename); } else { hskel_fname=(char *)xmalloc(strlen(HFILE)+1); strcpy(hskel_fname,HFILE); } } fhskel = tryopen(hskel_fname, "r"); if (verboseflag) { if (spec_name_prefix) outfile = stringappend(name_base, short_base_length, ".out"); else outfile = stringappend(name_base, short_base_length, ".output"); foutput = tryopen(outfile, "w"); } faction = tmpfile(); fattrs = tmpfile(); ftable = tmpfile(); fbisoncomp = tmpfile(); if (definesflag) { if(header_name) defsfile=header_name; else defsfile = stringappend(name_base, base_length, ".h"); fdefines = tmpfile(); } /* These are opened by `done' or `open_extra_files', if at all */ if (spec_outfile) tabfile = spec_outfile; else tabfile = stringappend(name_base, base_length, ".c"); attrsfile = stringappend(name_base, short_base_length, ".stype.h"); guardfile = stringappend(name_base, short_base_length, ".guard.c"); } /* open the output files needed only for the semantic parser. This is done when %semantic_parser is seen in the declarations section. */ void open_extra_files() { FILE *ftmp; int c; char *filename, *cp; fclose(fparser); filename=cparserfile; if(filename!=NULL) filename = (char *) getenv ("BISON_HAIRY"); #ifdef _MSDOS /* File doesn't exist in current directory; try in INIT directory. */ cp = getenv("INIT"); if (filename == 0 && cp != NULL) {FILE *tst; filename = (char *)xmalloc(strlen(cp) + strlen(PFILE1) + 2); strcpy(filename, PFILE1); if((tst=fopen(filename,"r"))!=NULL) {fclose(tst);} else { strcpy(filename, cp); cp = filename + strlen(filename); *cp++ = '/'; strcpy(cp, PFILE1); } } #endif /* MSDOS */ { if(filename) { parser_fname=(char *)xmalloc(strlen(filename)+1); strcpy(parser_fname,filename); } else { parser_fname=(char *)xmalloc(strlen(PFILE1)+1); strcpy(parser_fname,PFILE1); } } fparser = tryopen(parser_fname, "r"); /* JF change from inline attrs file to separate one */ ftmp = tryopen(attrsfile, "w"); rewind(fattrs); while((c=getc(fattrs))!=EOF) /* Thank god for buffering */ putc(c,ftmp); fclose(fattrs); fattrs=ftmp; fguard = tryopen(guardfile, "w"); } /* JF to make file opening easier. This func tries to open file NAME with mode MODE, and prints an error message if it fails. */ FILE * tryopen(char* name, char* mode) { FILE *ptr; ptr = fopen(name, mode); if (ptr == NULL) { fprintf(stderr, "%s: ", program_name); perror(name); done(2); } return ptr; } void done(int k) { if (faction) fclose(faction); if (fattrs) fclose(fattrs); if (fguard) fclose(fguard); if (finput) fclose(finput); if (fparser) fclose(fparser); if (foutput) fclose(foutput); /* JF write out the output file */ if (k == 0 && ftable) { FILE *ftmp; register int c; ftmp=tryopen(tabfile, "w"); /* avoid reloading the definitions of tab.h */ fprintf(ftmp,"#define YY_%s_h_included\n",parser_name); if(bison_compability==false) fprintf(ftmp,"#define YY_USE_CLASS\n"); else fprintf(ftmp,"/*#define YY_USE_CLASS \n*/"); rewind(ftable); while((c=getc(ftable)) != EOF) putc(c,ftmp); fclose(ftmp); fclose(ftable); if (definesflag) { ftmp = tryopen(defsfile, "w"); fprintf(ftmp,"#ifndef YY_%s_h_included\n",parser_name); fprintf(ftmp,"#define YY_%s_h_included\n",parser_name); if(bison_compability==false) fprintf(ftmp,"#define YY_USE_CLASS\n"); else fprintf(ftmp,"/*#define YY_USE_CLASS \n*/"); fflush(fdefines); rewind(fdefines); while((c=getc(fdefines)) != EOF) putc(c,ftmp); fclose(fdefines); fprintf(ftmp,"#endif\n"); fclose(ftmp); } } } dibbler-1.0.1/bison++/bison.info0000664000175000017500000000725712233256142013301 00000000000000This is bison.info, produced by makeinfo version 4.1 from bison.texinfo. START-INFO-DIR-ENTRY * bison: (bison). GNU Project parser generator (yacc replacement). END-INFO-DIR-ENTRY This file documents the Bison parser generator. Copyright (C) 1988, 89, 90, 91, 92, 93, 95, 98, 1999 Free Software Foundation, Inc. Permission is granted to make and distribute verbatim copies of this manual provided the copyright notice and this permission notice are preserved on all copies. Permission is granted to copy and distribute modified versions of this manual under the conditions for verbatim copying, provided also that the sections entitled "GNU General Public License" and "Conditions for Using Bison" are included exactly as in the original, and provided that the entire resulting derived work is distributed under the terms of a permission notice identical to this one. Permission is granted to copy and distribute translations of this manual into another language, under the above conditions for modified versions, except that the sections entitled "GNU General Public License", "Conditions for Using Bison" and this permission notice may be included in translations approved by the Free Software Foundation instead of in the original English.  Indirect: bison.info-1: 1265 bison.info-2: 50236 bison.info-3: 98017 bison.info-4: 146975 bison.info-5: 195679  Tag Table: (Indirect) Node: Top1265 Node: Introduction8502 Node: Conditions9777 Node: Copying11243 Node: Concepts30433 Node: Language and Grammar31466 Node: Grammar in Bison36482 Node: Semantic Values38406 Node: Semantic Actions40507 Node: Bison Parser41690 Node: Stages44000 Node: Grammar Layout45283 Node: Examples46540 Node: RPN Calc47675 Node: Rpcalc Decls48649 Node: Rpcalc Rules50236 Node: Rpcalc Input52036 Node: Rpcalc Line53497 Node: Rpcalc Expr54612 Node: Rpcalc Lexer56557 Node: Rpcalc Main59116 Node: Rpcalc Error59494 Node: Rpcalc Gen60498 Node: Rpcalc Compile61646 Node: Infix Calc62521 Node: Simple Error Recovery65228 Node: Multi-function Calc67114 Node: Mfcalc Decl68681 Node: Mfcalc Rules70704 Node: Mfcalc Symtab72084 Node: Exercises78326 Node: Grammar File78832 Node: Grammar Outline79600 Node: C Declarations80334 Node: Bison Declarations80914 Node: Grammar Rules81326 Node: C Code81786 Node: Symbols82716 Node: Rules87795 Node: Recursion89433 Node: Semantics91144 Node: Value Type92241 Node: Multiple Types92913 Node: Actions93929 Node: Action Types96714 Node: Mid-Rule Actions98017 Node: Declarations103586 Node: Token Decl104905 Node: Precedence Decl106901 Node: Union Decl108452 Node: Type Decl109296 Node: Expect Decl110202 Node: Start Decl111748 Node: Pure Decl112126 Node: Decl Summary113801 Node: Multiple Parsers117315 Node: Interface118809 Node: Parser Function119681 Node: Lexical120516 Node: Calling Convention121922 Node: Token Values124681 Node: Token Positions125829 Node: Pure Calling126721 Node: Error Reporting129678 Node: Action Features131802 Node: Algorithm135463 Node: Look-Ahead137756 Node: Shift/Reduce139888 Node: Precedence142800 Node: Why Precedence143451 Node: Using Precedence145306 Node: Precedence Examples146274 Node: How Precedence146975 Node: Contextual Precedence148124 Node: Parser States149915 Node: Reduce/Reduce151158 Node: Mystery Conflicts154719 Node: Stack Overflow158105 Node: Error Recovery159478 Node: Context Dependency164614 Node: Semantic Tokens165462 Node: Lexical Tie-ins168479 Node: Tie-in Recovery170027 Node: Debugging172199 Node: Invocation175549 Node: Bison Options176212 Node: Option Cross Key180325 Node: VMS Invocation181207 Node: Table of Symbols181991 Node: Glossary189388 Node: Index195679  End Tag Table dibbler-1.0.1/bison++/conflict.cc0000664000175000017500000003647512233256142013426 00000000000000/* Find and resolve or report look-ahead conflicts for bison, Copyright (C) 1984, 1989 Free Software Foundation, Inc. This file is part of Bison, the GNU Compiler Compiler. Bison 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. Bison 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 Bison; see the file COPYING. If not, write to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ #ifdef _AIX #pragma alloca #endif #include #include "system.h" #include "machine.h" #include "new.h" #include "files.h" #include "gram.h" #include "state.h" #ifdef __GNUC__ #define alloca __builtin_alloca #elif defined (HAVE_ALLOCA_H) #include #elif defined( _AIX) #elif defined( _MSDOS) #ifndef alloca #include #define alloca _alloca #endif /* ndef alloca */ #else /* not msdos */ char *alloca (); #endif /* msdos ? */ extern char **tags; extern int tokensetsize; extern char *consistent; extern short *accessing_symbol; extern shifts **shift_table; extern unsigned *LA; extern short *LAruleno; extern short *lookaheads; extern int verboseflag; void set_conflicts(int); void resolve_sr_conflict(int,int); void flush_shift(int,int); void log_resolution(int,int,int,char*); void total_conflicts(); void count_sr_conflicts(int); void count_rr_conflicts(int); char any_conflicts; char *conflicts; errs **err_table; int expected_conflicts; static unsigned *shiftset; static unsigned *lookaheadset; static int src_total; static int rrc_total; static int src_count; static int rrc_count; void initialize_conflicts() { register int i; /* register errs *sp; JF unused */ conflicts = NEW2(nstates, char); shiftset = NEW2(tokensetsize, unsigned); lookaheadset = NEW2(tokensetsize, unsigned); err_table = NEW2(nstates, errs *); any_conflicts = 0; for (i = 0; i < nstates; i++) set_conflicts(i); } void set_conflicts(int state) { register int i; register int k; register shifts *shiftp; register unsigned *fp2; register unsigned *fp3; register unsigned *fp4; register unsigned *fp1; register int symbol; if (consistent[state]) return; for (i = 0; i < tokensetsize; i++) lookaheadset[i] = 0; shiftp = shift_table[state]; if (shiftp) { k = shiftp->nshifts; for (i = 0; i < k; i++) { symbol = accessing_symbol[shiftp->internalShifts[i]]; if (ISVAR(symbol)) break; SETBIT(lookaheadset, symbol); } } k = lookaheads[state + 1]; fp4 = lookaheadset + tokensetsize; /* loop over all rules which require lookahead in this state */ /* first check for shift-reduce conflict, and try to resolve using precedence */ for (i = lookaheads[state]; i < k; i++) if (rprec[LAruleno[i]]) { fp1 = LA + i * tokensetsize; fp2 = fp1; fp3 = lookaheadset; while (fp3 < fp4) { if (*fp2++ & *fp3++) { resolve_sr_conflict(state, i); break; } } } /* loop over all rules which require lookahead in this state */ /* Check for conflicts not resolved above. */ for (i = lookaheads[state]; i < k; i++) { fp1 = LA + i * tokensetsize; fp2 = fp1; fp3 = lookaheadset; while (fp3 < fp4) { if (*fp2++ & *fp3++) { conflicts[state] = 1; any_conflicts = 1; } } fp2 = fp1; fp3 = lookaheadset; while (fp3 < fp4) *fp3++ |= *fp2++; } } /* Attempt to resolve shift-reduce conflict for one rule by means of precedence declarations. It has already been checked that the rule has a precedence. A conflict is resolved by modifying the shift or reduce tables so that there is no longer a conflict. */ void resolve_sr_conflict(int state, int lookaheadnum) { register int i; register int mask; register unsigned *fp1; register unsigned *fp2; register int redprec; /* Extra parens avoid errors on Ultrix 4.3. */ errs *errp = (errs *) alloca ((sizeof(errs) + ntokens * sizeof(short))); short *errtokens = errp->internalErrs; /* find the rule to reduce by to get precedence of reduction */ redprec = rprec[LAruleno[lookaheadnum]]; mask = 1; fp1 = LA + lookaheadnum * tokensetsize; fp2 = lookaheadset; for (i = 0; i < ntokens; i++) { if ((mask & *fp2 & *fp1) && sprec[i]) /* Shift-reduce conflict occurs for token number i and it has a precedence. The precedence of shifting is that of token i. */ { if (sprec[i] < redprec) { if (verboseflag) log_resolution(state, lookaheadnum, i, "reduce"); *fp2 &= ~mask; /* flush the shift for this token */ flush_shift(state, i); } else if (sprec[i] > redprec) { if (verboseflag) log_resolution(state, lookaheadnum, i, "shift"); *fp1 &= ~mask; /* flush the reduce for this token */ } else { /* Matching precedence levels. For left association, keep only the reduction. For right association, keep only the shift. For nonassociation, keep neither. */ switch (sassoc[i]) { case RIGHT_ASSOC: if (verboseflag) log_resolution(state, lookaheadnum, i, "shift"); break; case LEFT_ASSOC: if (verboseflag) log_resolution(state, lookaheadnum, i, "reduce"); break; case NON_ASSOC: if (verboseflag) log_resolution(state, lookaheadnum, i, "an error"); break; } if (sassoc[i] != RIGHT_ASSOC) { *fp2 &= ~mask; /* flush the shift for this token */ flush_shift(state, i); } if (sassoc[i] != LEFT_ASSOC) { *fp1 &= ~mask; /* flush the reduce for this token */ } if (sassoc[i] == NON_ASSOC) { /* Record an explicit error for this token. */ *errtokens++ = i; } } } mask <<= 1; if (mask == 0) { mask = 1; fp2++; fp1++; } } errp->nerrs = errtokens - errp->internalErrs; if (errp->nerrs) { /* Some tokens have been explicitly made errors. Allocate a permanent errs structure for this state, to record them. */ i = (char *) errtokens - (char *) errp; err_table[state] = (errs *) xmalloc ((unsigned int)i); bcopy (errp, err_table[state], i); } else err_table[state] = 0; } /* turn off the shift recorded for the specified token in the specified state. Used when we resolve a shift-reduce conflict in favor of the reduction. */ void flush_shift(int state, int token) { register shifts *shiftp; register int k, i; /* register unsigned symbol; JF unused */ shiftp = shift_table[state]; if (shiftp) { k = shiftp->nshifts; for (i = 0; i < k; i++) { if (shiftp->internalShifts[i] && token == accessing_symbol[shiftp->internalShifts[i]]) (shiftp->internalShifts[i]) = 0; } } } void log_resolution(int state, int LAno, int token, char* resolution) { fprintf(foutput, "Conflict in state %d between rule %d and token %s resolved as %s.\n", state, LAruleno[LAno], tags[token], resolution); } void conflict_log() { register int i; src_total = 0; rrc_total = 0; for (i = 0; i < nstates; i++) { if (conflicts[i]) { count_sr_conflicts(i); count_rr_conflicts(i); src_total += src_count; rrc_total += rrc_count; } } total_conflicts(); } void verbose_conflict_log() { register int i; src_total = 0; rrc_total = 0; for (i = 0; i < nstates; i++) { if (conflicts[i]) { count_sr_conflicts(i); count_rr_conflicts(i); src_total += src_count; rrc_total += rrc_count; fprintf(foutput, "State %d contains", i); if (src_count == 1) fprintf(foutput, " 1 shift/reduce conflict"); else if (src_count > 1) fprintf(foutput, " %d shift/reduce conflicts", src_count); if (src_count > 0 && rrc_count > 0) fprintf(foutput, " and"); if (rrc_count == 1) fprintf(foutput, " 1 reduce/reduce conflict"); else if (rrc_count > 1) fprintf(foutput, " %d reduce/reduce conflicts", rrc_count); putc('.', foutput); putc('\n', foutput); } } total_conflicts(); } void total_conflicts() { extern int fixed_outfiles; if (src_total == expected_conflicts && rrc_total == 0) return; if (fixed_outfiles) { /* If invoked under the name `yacc', use the output format specified by POSIX. */ fprintf(stderr, "conflicts: "); if (src_total > 0) fprintf(stderr, " %d shift/reduce", src_total); if (src_total > 0 && rrc_total > 0) fprintf(stderr, ","); if (rrc_total > 0) fprintf(stderr, " %d reduce/reduce", rrc_total); putc('\n', stderr); } else { fprintf(stderr, "%s contains", infile); if (src_total == 1) fprintf(stderr, " 1 shift/reduce conflict"); else if (src_total > 1) fprintf(stderr, " %d shift/reduce conflicts", src_total); if (src_total > 0 && rrc_total > 0) fprintf(stderr, " and"); if (rrc_total == 1) fprintf(stderr, " 1 reduce/reduce conflict"); else if (rrc_total > 1) fprintf(stderr, " %d reduce/reduce conflicts", rrc_total); putc('.', stderr); putc('\n', stderr); } } void count_sr_conflicts(int state) { register int i; register int k; register int mask; register shifts *shiftp; register unsigned *fp1; register unsigned *fp2; register unsigned *fp3; register int symbol; src_count = 0; shiftp = shift_table[state]; if (!shiftp) return; for (i = 0; i < tokensetsize; i++) { shiftset[i] = 0; lookaheadset[i] = 0; } k = shiftp->nshifts; for (i = 0; i < k; i++) { if (! shiftp->internalShifts[i]) continue; symbol = accessing_symbol[shiftp->internalShifts[i]]; if (ISVAR(symbol)) break; SETBIT(shiftset, symbol); } k = lookaheads[state + 1]; fp3 = lookaheadset + tokensetsize; for (i = lookaheads[state]; i < k; i++) { fp1 = LA + i * tokensetsize; fp2 = lookaheadset; while (fp2 < fp3) *fp2++ |= *fp1++; } fp1 = shiftset; fp2 = lookaheadset; while (fp2 < fp3) *fp2++ &= *fp1++; mask = 1; fp2 = lookaheadset; for (i = 0; i < ntokens; i++) { if (mask & *fp2) src_count++; mask <<= 1; if (mask == 0) { mask = 1; fp2++; } } } void count_rr_conflicts(int state) { register int i; register int j; register int count; register unsigned mask; register unsigned *baseword; register unsigned *wordp; register int m; register int n; rrc_count = 0; m = lookaheads[state]; n = lookaheads[state + 1]; if (n - m < 2) return; mask = 1; baseword = LA + m * tokensetsize; for (i = 0; i < ntokens; i++) { wordp = baseword; count = 0; for (j = m; j < n; j++) { if (mask & *wordp) count++; wordp += tokensetsize; } if (count >= 2) rrc_count++; mask <<= 1; if (mask == 0) { mask = 1; baseword++; } } } void print_reductions(int state) { register int i; register int j; register int k; register unsigned *fp1; register unsigned *fp2; register unsigned *fp3; register unsigned *fp4; register int rule; register int symbol; register unsigned mask; register int m; register int n; register int default_LA; register int default_rule; register int cmax; register int count; register shifts *shiftp; register errs *errp; int nodefault = 0; for (i = 0; i < tokensetsize; i++) shiftset[i] = 0; shiftp = shift_table[state]; if (shiftp) { k = shiftp->nshifts; for (i = 0; i < k; i++) { if (! shiftp->internalShifts[i]) continue; symbol = accessing_symbol[shiftp->internalShifts[i]]; if (ISVAR(symbol)) break; /* if this state has a shift for the error token, don't use a default rule. */ if (symbol == error_token_number) nodefault = 1; SETBIT(shiftset, symbol); } } errp = err_table[state]; if (errp) { k = errp->nerrs; for (i = 0; i < k; i++) { if (! errp->internalErrs[i]) continue; symbol = errp->internalErrs[i]; SETBIT(shiftset, symbol); } } m = lookaheads[state]; n = lookaheads[state + 1]; if (n - m == 1 && ! nodefault) { default_rule = LAruleno[m]; fp1 = LA + m * tokensetsize; fp2 = shiftset; fp3 = lookaheadset; fp4 = lookaheadset + tokensetsize; while (fp3 < fp4) *fp3++ = *fp1++ & *fp2++; mask = 1; fp3 = lookaheadset; for (i = 0; i < ntokens; i++) { if (mask & *fp3) fprintf(foutput, " %-4s\t[reduce using rule %d (%s)]\n", tags[i], default_rule, tags[rlhs[default_rule]]); mask <<= 1; if (mask == 0) { mask = 1; fp3++; } } fprintf(foutput, " $default\treduce using rule %d (%s)\n\n", default_rule, tags[rlhs[default_rule]]); } else if (n - m >= 1) { cmax = 0; default_LA = -1; fp4 = lookaheadset + tokensetsize; if (! nodefault) for (i = m; i < n; i++) { fp1 = LA + i * tokensetsize; fp2 = shiftset; fp3 = lookaheadset; while (fp3 < fp4) *fp3++ = *fp1++ & ( ~ (*fp2++)); count = 0; mask = 1; fp3 = lookaheadset; for (j = 0; j < ntokens; j++) { if (mask & *fp3) count++; mask <<= 1; if (mask == 0) { mask = 1; fp3++; } } if (count > cmax) { cmax = count; default_LA = i; default_rule = LAruleno[i]; } fp2 = shiftset; fp3 = lookaheadset; while (fp3 < fp4) *fp2++ |= *fp3++; } for (i = 0; i < tokensetsize; i++) shiftset[i] = 0; if (shiftp) { k = shiftp->nshifts; for (i = 0; i < k; i++) { if (! shiftp->internalShifts[i]) continue; symbol = accessing_symbol[shiftp->internalShifts[i]]; if (ISVAR(symbol)) break; SETBIT(shiftset, symbol); } } mask = 1; fp1 = LA + m * tokensetsize; fp2 = shiftset; for (i = 0; i < ntokens; i++) { int defaulted = 0; if (mask & *fp2) count = 1; else count = 0; fp3 = fp1; for (j = m; j < n; j++) { if (mask & *fp3) { if (count == 0) { if (j != default_LA) { rule = LAruleno[j]; fprintf(foutput, " %-4s\treduce using rule %d (%s)\n", tags[i], rule, tags[rlhs[rule]]); } else defaulted = 1; count++; } else { if (defaulted) { rule = LAruleno[default_LA]; fprintf(foutput, " %-4s\treduce using rule %d (%s)\n", tags[i], rule, tags[rlhs[rule]]); defaulted = 0; } rule = LAruleno[j]; fprintf(foutput, " %-4s\t[reduce using rule %d (%s)]\n", tags[i], rule, tags[rlhs[rule]]); } } fp3 += tokensetsize; } mask <<= 1; if (mask == 0) { mask = 1; /* This used to be fp1, but I think fp2 is right because fp2 is where the words are fetched to test with mask in this loop. */ fp2++; } } if (default_LA >= 0) { fprintf(foutput, " $default\treduce using rule %d (%s)\n", default_rule, tags[rlhs[default_rule]]); } putc('\n', foutput); } } void finalize_conflicts() { FREE(conflicts); FREE(shiftset); FREE(lookaheadset); } dibbler-1.0.1/bison++/configure.ac0000644000175000017500000000131712277722750013600 00000000000000# Process this file with autoconf to produce a configure script. PACKAGE=bison++ AC_INIT([bison++], [2.21.5-dibbler], [alain.coetmeur@caissedesdepots.fr]) AC_CONFIG_SRCDIR([bison.cc]) AM_INIT_AUTOMAKE # DO NOT trigger rebuild rules, unless I tell you so. AM_MAINTAINER_MODE([disable]) # Checks for programs. AC_PROG_AWK AC_PROG_CXX AC_PROG_CC AC_PROG_INSTALL AC_PROG_LN_S # Checks for libraries. # Checks for header files. AC_HEADER_STDC AC_CHECK_HEADERS([alloca.h malloc.h memory.h stddef.h stdlib.h string.h strings.h]) # Checks for typedefs, structures, and compiler characteristics. AC_C_CONST AC_TYPE_SIZE_T # Checks for library functions. AC_FUNC_ALLOCA AC_FUNC_MALLOC AC_CONFIG_FILES([Makefile]) AC_OUTPUT dibbler-1.0.1/bison++/bison.cc0000644000175000017500000006272712277722750012747 00000000000000/* -*-C-*- Note some compilers choke on comments on `#line' lines. */ /* Skeleton output parser for bison, Copyright (C) 1984, 1989, 1990 Bob Corbett and Richard Stallman 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 1, 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., 675 Mass Ave, Cambridge, MA 02139, USA. As a special exception, when this file is copied by Bison++ into a Bison++ output file, you may use that output file without restriction. This special exception was added by the Free Software Foundation in version 1.24 of Bison, and has been in Bison++ since 1.21.9. */ /* HEADER SECTION */ #if defined( _MSDOS ) || defined(MSDOS) || defined(__MSDOS__) #define __MSDOS_AND_ALIKE #endif #if defined(_WINDOWS) && defined(_MSC_VER) #define __HAVE_NO_ALLOCA #define __MSDOS_AND_ALIKE #endif #ifndef alloca #if defined( __GNUC__) #define alloca __builtin_alloca #elif (!defined (__STDC__) && defined (sparc)) || defined (__sparc__) || defined (__sparc) || defined (__sgi) #include #elif defined (__MSDOS_AND_ALIKE) #include #ifndef __TURBOC__ /* MS C runtime lib */ #define alloca _alloca #endif #elif defined(_AIX) /* pragma must be put before any C/C++ instruction !! */ #pragma alloca #include #elif defined(__hpux) #ifdef __cplusplus extern "C" { void *alloca (unsigned int); }; #else /* not __cplusplus */ void *alloca (); #endif /* not __cplusplus */ #endif /* not _AIX not MSDOS, or __TURBOC__ or _AIX, not sparc. */ #endif /* alloca not defined. */ #ifdef c_plusplus #ifndef __cplusplus #define __cplusplus #endif #endif #ifdef __cplusplus #ifndef YY_USE_CLASS /*#warning "For C++ its recomended to use bison++, otherwise classes won't be generated"*/ #endif #else #ifndef __STDC__ #define const #endif #ifdef YY_USE_CLASS #error "This is a C++ header generated by bison++, please use a C++ compiler!" #endif #endif #include #define YYBISON 1 $/* %{ and %header{ and %union, during decl */ #define YY_@_BISON 1 #ifndef YY_@_COMPATIBILITY #ifndef YY_USE_CLASS #define YY_@_COMPATIBILITY 1 #else #define YY_@_COMPATIBILITY 0 #endif #endif #if YY_@_COMPATIBILITY != 0 /* backward compatibility */ #ifdef YYLTYPE #ifndef YY_@_LTYPE #define YY_@_LTYPE YYLTYPE #endif #endif /* Testing alternative bison solution /#ifdef YYSTYPE*/ #ifndef YY_@_STYPE #define YY_@_STYPE YYSTYPE #endif /*#endif*/ #ifdef YYDEBUG #ifndef YY_@_DEBUG #define YY_@_DEBUG YYDEBUG #endif #endif /* use goto to be compatible */ #ifndef YY_@_USE_GOTO #define YY_@_USE_GOTO 1 #endif #endif /* use no goto to be clean in C++ */ #ifndef YY_@_USE_GOTO #define YY_@_USE_GOTO 0 #endif #ifndef YY_@_PURE $/* YY_@_PURE */ #endif /* section apres lecture def, avant lecture grammaire S2 */ $/* prefix */ #ifndef YY_@_DEBUG $/* YY_@_DEBUG */ #endif #ifndef YY_@_LSP_NEEDED $ /* YY_@_LSP_NEEDED*/ #endif /* DEFAULT LTYPE*/ #ifdef YY_@_LSP_NEEDED #ifndef YY_@_LTYPE #ifndef BISON_YYLTYPE_ISDECLARED #define BISON_YYLTYPE_ISDECLARED typedef struct yyltype { int timestamp; int first_line; int first_column; int last_line; int last_column; char *text; } yyltype; #endif #define YY_@_LTYPE yyltype #endif #endif /* DEFAULT STYPE*/ /* We used to use `unsigned long' as YY_@_STYPE on MSDOS, but it seems better to be consistent. Most programs should declare their own type anyway. */ #ifndef YY_@_STYPE #define YY_@_STYPE int #endif /* DEFAULT MISCELANEOUS */ #ifndef YY_@_PARSE #define YY_@_PARSE yyparse #endif #ifndef YY_@_LEX #define YY_@_LEX yylex #endif #ifndef YY_@_LVAL #define YY_@_LVAL yylval #endif #ifndef YY_@_LLOC #define YY_@_LLOC yylloc #endif #ifndef YY_@_CHAR #define YY_@_CHAR yychar #endif #ifndef YY_@_NERRS #define YY_@_NERRS yynerrs #endif #ifndef YY_@_DEBUG_FLAG #define YY_@_DEBUG_FLAG yydebug #endif #ifndef YY_@_ERROR #define YY_@_ERROR yyerror #endif #ifndef YY_@_PARSE_PARAM #ifndef YY_USE_CLASS #ifdef YYPARSE_PARAM #define YY_@_PARSE_PARAM void* YYPARSE_PARAM #else #ifndef __STDC__ #ifndef __cplusplus #define YY_@_PARSE_PARAM #endif #endif #endif #endif #ifndef YY_@_PARSE_PARAM #define YY_@_PARSE_PARAM void #endif #endif #if YY_@_COMPATIBILITY != 0 /* backward compatibility */ #ifdef YY_@_LTYPE #ifndef YYLTYPE #define YYLTYPE YY_@_LTYPE #else /* WARNING obsolete !!! user defined YYLTYPE not reported into generated header */ #endif #endif /* Removed due to bison compabilityproblems /#ifndef YYSTYPE /#define YYSTYPE YY_@_STYPE /#else*/ /* WARNING obsolete !!! user defined YYSTYPE not reported into generated header */ /*#endif*/ #ifdef YY_@_PURE # ifndef YYPURE # define YYPURE YY_@_PURE # endif #endif #ifdef YY_@_DEBUG # ifndef YYDEBUG # define YYDEBUG YY_@_DEBUG # endif #endif #ifndef YY_@_ERROR_VERBOSE #ifdef YYERROR_VERBOSE #define YY_@_ERROR_VERBOSE YYERROR_VERBOSE #endif #endif #ifndef YY_@_LSP_NEEDED # ifdef YYLSP_NEEDED # define YY_@_LSP_NEEDED YYLSP_NEEDED # endif #endif #endif #ifndef YY_USE_CLASS /* TOKEN C */ $ /* #defines tokens */ #else /* CLASS */ #ifndef YY_@_CLASS #define YY_@_CLASS @ #endif #ifndef YY_@_INHERIT #define YY_@_INHERIT #endif #ifndef YY_@_MEMBERS #define YY_@_MEMBERS #endif #ifndef YY_@_LEX_BODY #define YY_@_LEX_BODY #endif #ifndef YY_@_ERROR_BODY #define YY_@_ERROR_BODY #endif #ifndef YY_@_CONSTRUCTOR_PARAM #define YY_@_CONSTRUCTOR_PARAM #endif #ifndef YY_@_CONSTRUCTOR_CODE #define YY_@_CONSTRUCTOR_CODE #endif #ifndef YY_@_CONSTRUCTOR_INIT #define YY_@_CONSTRUCTOR_INIT #endif /* choose between enum and const */ #ifndef YY_@_USE_CONST_TOKEN #define YY_@_USE_CONST_TOKEN 0 /* yes enum is more compatible with flex, */ /* so by default we use it */ #endif #if YY_@_USE_CONST_TOKEN != 0 #ifndef YY_@_ENUM_TOKEN #define YY_@_ENUM_TOKEN yy_@_enum_token #endif #endif class YY_@_CLASS YY_@_INHERIT { public: #if YY_@_USE_CONST_TOKEN != 0 /* static const int token ... */ $ /* decl const */ #else enum YY_@_ENUM_TOKEN { YY_@_NULL_TOKEN=0 $ /* enum token */ }; /* end of enum declaration */ #endif public: int YY_@_PARSE (YY_@_PARSE_PARAM); virtual void YY_@_ERROR(char *msg) YY_@_ERROR_BODY; #ifdef YY_@_PURE #ifdef YY_@_LSP_NEEDED virtual int YY_@_LEX (YY_@_STYPE *YY_@_LVAL,YY_@_LTYPE *YY_@_LLOC) YY_@_LEX_BODY; #else virtual int YY_@_LEX (YY_@_STYPE *YY_@_LVAL) YY_@_LEX_BODY; #endif #else virtual int YY_@_LEX() YY_@_LEX_BODY; YY_@_STYPE YY_@_LVAL; #ifdef YY_@_LSP_NEEDED YY_@_LTYPE YY_@_LLOC; #endif int YY_@_NERRS; int YY_@_CHAR; #endif #if YY_@_DEBUG != 0 int YY_@_DEBUG_FLAG; /* nonzero means print parse trace */ #endif public: YY_@_CLASS(YY_@_CONSTRUCTOR_PARAM); public: YY_@_MEMBERS }; /* other declare folow */ #if YY_@_USE_CONST_TOKEN != 0 $ /* const YY_@_CLASS::token */ #endif /*apres const */ YY_@_CLASS::YY_@_CLASS(YY_@_CONSTRUCTOR_PARAM) YY_@_CONSTRUCTOR_INIT { #if YY_@_DEBUG != 0 YY_@_DEBUG_FLAG=0; #endif YY_@_CONSTRUCTOR_CODE; } #endif $ /* fattrs + tables */ /* parser code folow */ /* This is the parser code that is written into each bison parser when the %semantic_parser declaration is not specified in the grammar. It was written by Richard Stallman by simplifying the hairy parser used when %semantic_parser is specified. */ /* Note: dollar marks section change the next is replaced by the list of actions, each action as one case of the switch. */ #if YY_@_USE_GOTO != 0 /* SUPRESSION OF GOTO : on some C++ compiler (sun c++) the goto is strictly forbidden if any constructor/destructor is used in the whole function (very stupid isn't it ?) so goto are to be replaced with a 'while/switch/case construct' here are the macro to keep some apparent compatibility */ #define YYGOTO(lb) {yy_gotostate=lb;continue;} #define YYBEGINGOTO enum yy_labels yy_gotostate=yygotostart; \ for(;;) switch(yy_gotostate) { case yygotostart: { #define YYLABEL(lb) } case lb: { #define YYENDGOTO } } #define YYBEGINDECLARELABEL enum yy_labels {yygotostart #define YYDECLARELABEL(lb) ,lb #define YYENDDECLARELABEL } #else /* macro to keep goto */ #define YYGOTO(lb) goto lb #define YYBEGINGOTO #define YYLABEL(lb) lb: #define YYENDGOTO #define YYBEGINDECLARELABEL #define YYDECLARELABEL(lb) #define YYENDDECLARELABEL #endif /* LABEL DECLARATION */ YYBEGINDECLARELABEL YYDECLARELABEL(yynewstate) YYDECLARELABEL(yybackup) /* YYDECLARELABEL(yyresume) */ YYDECLARELABEL(yydefault) YYDECLARELABEL(yyreduce) YYDECLARELABEL(yyerrlab) /* here on detecting error */ YYDECLARELABEL(yyerrlab1) /* here on error raised explicitly by an action */ YYDECLARELABEL(yyerrdefault) /* current state does not do anything special for the error token. */ YYDECLARELABEL(yyerrpop) /* pop the current state because it cannot handle the error token */ YYDECLARELABEL(yyerrhandle) YYENDDECLARELABEL /* ALLOCA SIMULATION */ /* __HAVE_NO_ALLOCA */ #ifdef __HAVE_NO_ALLOCA int __alloca_free_ptr(char *ptr,char *ref) {if(ptr!=ref) free(ptr); return 0;} #define __ALLOCA_alloca(size) malloc(size) #define __ALLOCA_free(ptr,ref) __alloca_free_ptr((char *)ptr,(char *)ref) #ifdef YY_@_LSP_NEEDED #define __ALLOCA_return(num) \ do { return( __ALLOCA_free(yyss,yyssa)+\ __ALLOCA_free(yyvs,yyvsa)+\ __ALLOCA_free(yyls,yylsa)+\ (num)); } while(0) #else #define __ALLOCA_return(num) \ do { return( __ALLOCA_free(yyss,yyssa)+\ __ALLOCA_free(yyvs,yyvsa)+\ (num)); } while(0) #endif #else #define __ALLOCA_return(num) do { return(num); } while(0) #define __ALLOCA_alloca(size) alloca(size) #define __ALLOCA_free(ptr,ref) #endif /* ENDALLOCA SIMULATION */ #define yyerrok (yyerrstatus = 0) #define yyclearin (YY_@_CHAR = YYEMPTY) #define YYEMPTY -2 #define YYEOF 0 #define YYACCEPT __ALLOCA_return(0) #define YYABORT __ALLOCA_return(1) #define YYERROR YYGOTO(yyerrlab1) /* Like YYERROR except do call yyerror. This remains here temporarily to ease the transition to the new meaning of YYERROR, for GCC. Once GCC version 2 has supplanted version 1, this can go. */ #define YYFAIL YYGOTO(yyerrlab) #define YYRECOVERING() (!!yyerrstatus) #define YYBACKUP(token, value) \ do \ if (YY_@_CHAR == YYEMPTY && yylen == 1) \ { YY_@_CHAR = (token), YY_@_LVAL = (value); \ yychar1 = YYTRANSLATE (YY_@_CHAR); \ YYPOPSTACK; \ YYGOTO(yybackup); \ } \ else \ { YY_@_ERROR ("syntax error: cannot back up"); YYERROR; } \ while (0) #define YYTERROR 1 #define YYERRCODE 256 #ifndef YY_@_PURE /* UNPURE */ #define YYLEX YY_@_LEX() #ifndef YY_USE_CLASS /* If nonreentrant, and not class , generate the variables here */ int YY_@_CHAR; /* the lookahead symbol */ YY_@_STYPE YY_@_LVAL; /* the semantic value of the */ /* lookahead symbol */ int YY_@_NERRS; /* number of parse errors so far */ #ifdef YY_@_LSP_NEEDED YY_@_LTYPE YY_@_LLOC; /* location data for the lookahead */ /* symbol */ #endif #endif #else /* PURE */ #ifdef YY_@_LSP_NEEDED #define YYLEX YY_@_LEX(&YY_@_LVAL, &YY_@_LLOC) #else #define YYLEX YY_@_LEX(&YY_@_LVAL) #endif #endif #ifndef YY_USE_CLASS #if YY_@_DEBUG != 0 int YY_@_DEBUG_FLAG; /* nonzero means print parse trace */ /* Since this is uninitialized, it does not stop multiple parsers from coexisting. */ #endif #endif /* YYINITDEPTH indicates the initial size of the parser's stacks */ #ifndef YYINITDEPTH #define YYINITDEPTH 200 #endif /* YYMAXDEPTH is the maximum size the stacks can grow to (effective only if the built-in stack extension method is used). */ #if YYMAXDEPTH == 0 #undef YYMAXDEPTH #endif #ifndef YYMAXDEPTH #define YYMAXDEPTH 10000 #endif #if __GNUC__ > 1 /* GNU C and GNU C++ define this. */ #define __yy_bcopy(FROM,TO,COUNT) __builtin_memcpy(TO,FROM,COUNT) #else /* not GNU C or C++ */ /* This is the most reliable way to avoid incompatibilities in available built-in functions on various systems. */ #ifdef __cplusplus static void __yy_bcopy (char *from, char *to, int count) #else #ifdef __STDC__ static void __yy_bcopy (char *from, char *to, int count) #else static void __yy_bcopy (from, to, count) char *from; char *to; int count; #endif #endif { register char *f = from; register char *t = to; register int i = count; while (i-- > 0) *t++ = *f++; } #endif int #ifdef YY_USE_CLASS YY_@_CLASS:: #endif YY_@_PARSE(YY_@_PARSE_PARAM) #ifndef __STDC__ #ifndef __cplusplus #ifndef YY_USE_CLASS /* parameter definition without protypes */ YY_@_PARSE_PARAM_DEF #endif #endif #endif { register int yystate; register int yyn; register short *yyssp; register YY_@_STYPE *yyvsp; int yyerrstatus; /* number of tokens to shift before error messages enabled */ int yychar1=0; /* lookahead token as an internal (translated) token number */ short yyssa[YYINITDEPTH]; /* the state stack */ YY_@_STYPE yyvsa[YYINITDEPTH]; /* the semantic value stack */ short *yyss = yyssa; /* refer to the stacks thru separate pointers */ YY_@_STYPE *yyvs = yyvsa; /* to allow yyoverflow to reallocate them elsewhere */ #ifdef YY_@_LSP_NEEDED YY_@_LTYPE yylsa[YYINITDEPTH]; /* the location stack */ YY_@_LTYPE *yyls = yylsa; YY_@_LTYPE *yylsp; #define YYPOPSTACK (yyvsp--, yyssp--, yylsp--) #else #define YYPOPSTACK (yyvsp--, yyssp--) #endif int yystacksize = YYINITDEPTH; #ifdef YY_@_PURE int YY_@_CHAR; YY_@_STYPE YY_@_LVAL; int YY_@_NERRS; #ifdef YY_@_LSP_NEEDED YY_@_LTYPE YY_@_LLOC; #endif #endif YY_@_STYPE yyval; /* the variable used to return */ /* semantic values from the action */ /* routines */ int yylen; /* start loop, in which YYGOTO may be used. */ YYBEGINGOTO #if YY_@_DEBUG != 0 if (YY_@_DEBUG_FLAG) fprintf(stderr, "Starting parse\n"); #endif yystate = 0; yyerrstatus = 0; YY_@_NERRS = 0; YY_@_CHAR = YYEMPTY; /* Cause a token to be read. */ /* Initialize stack pointers. Waste one element of value and location stack so that they stay on the same level as the state stack. The wasted elements are never initialized. */ yyssp = yyss - 1; yyvsp = yyvs; #ifdef YY_@_LSP_NEEDED yylsp = yyls; #endif /* Push a new state, which is found in yystate . */ /* In all cases, when you get here, the value and location stacks have just been pushed. so pushing a state here evens the stacks. */ YYLABEL(yynewstate) *++yyssp = yystate; if (yyssp >= yyss + yystacksize - 1) { /* Give user a chance to reallocate the stack */ /* Use copies of these so that the &'s don't force the real ones into memory. */ YY_@_STYPE *yyvs1 = yyvs; short *yyss1 = yyss; #ifdef YY_@_LSP_NEEDED YY_@_LTYPE *yyls1 = yyls; #endif /* Get the current used size of the three stacks, in elements. */ int size = yyssp - yyss + 1; #ifdef yyoverflow /* Each stack pointer address is followed by the size of the data in use in that stack, in bytes. */ #ifdef YY_@_LSP_NEEDED /* This used to be a conditional around just the two extra args, but that might be undefined if yyoverflow is a macro. */ yyoverflow("parser stack overflow", &yyss1, size * sizeof (*yyssp), &yyvs1, size * sizeof (*yyvsp), &yyls1, size * sizeof (*yylsp), &yystacksize); #else // cppcheck-suppress constStatement yyoverflow("parser stack overflow", &yyss1, size * sizeof (*yyssp), &yyvs1, size * sizeof (*yyvsp), &yystacksize); #endif yyss = yyss1; yyvs = yyvs1; #ifdef YY_@_LSP_NEEDED yyls = yyls1; #endif #else /* no yyoverflow */ /* Extend the stack our own way. */ if (yystacksize >= YYMAXDEPTH) { YY_@_ERROR(((char*)"parser stack overflow")); __ALLOCA_return(2); } yystacksize *= 2; if (yystacksize > YYMAXDEPTH) yystacksize = YYMAXDEPTH; yyss = (short *) __ALLOCA_alloca (yystacksize * sizeof (*yyssp)); __yy_bcopy ((char *)yyss1, (char *)yyss, size * sizeof (*yyssp)); __ALLOCA_free(yyss1,yyssa); yyvs = (YY_@_STYPE *) __ALLOCA_alloca (yystacksize * sizeof (*yyvsp)); __yy_bcopy ((char *)yyvs1, (char *)yyvs, size * sizeof (*yyvsp)); __ALLOCA_free(yyvs1,yyvsa); #ifdef YY_@_LSP_NEEDED yyls = (YY_@_LTYPE *) __ALLOCA_alloca (yystacksize * sizeof (*yylsp)); __yy_bcopy ((char *)yyls1, (char *)yyls, size * sizeof (*yylsp)); __ALLOCA_free(yyls1,yylsa); #endif #endif /* no yyoverflow */ yyssp = yyss + size - 1; yyvsp = yyvs + size - 1; #ifdef YY_@_LSP_NEEDED yylsp = yyls + size - 1; #endif #if YY_@_DEBUG != 0 if (YY_@_DEBUG_FLAG) fprintf(stderr, "Stack size increased to %d\n", yystacksize); #endif if (yyssp >= yyss + yystacksize - 1) YYABORT; } #if YY_@_DEBUG != 0 if (YY_@_DEBUG_FLAG) fprintf(stderr, "Entering state %d\n", yystate); #endif YYGOTO(yybackup); YYLABEL(yybackup) /* Do appropriate processing given the current state. */ /* Read a lookahead token if we need one and don't already have one. */ /* YYLABEL(yyresume) */ /* First try to decide what to do without reference to lookahead token. */ yyn = yypact[yystate]; if (yyn == YYFLAG) YYGOTO(yydefault); /* Not known => get a lookahead token if don't already have one. */ /* yychar is either YYEMPTY or YYEOF or a valid token in external form. */ if (YY_@_CHAR == YYEMPTY) { #if YY_@_DEBUG != 0 if (YY_@_DEBUG_FLAG) fprintf(stderr, "Reading a token: "); #endif YY_@_CHAR = YYLEX; } /* Convert token to internal form (in yychar1) for indexing tables with */ if (YY_@_CHAR <= 0) /* This means end of input. */ { yychar1 = 0; YY_@_CHAR = YYEOF; /* Don't call YYLEX any more */ #if YY_@_DEBUG != 0 if (YY_@_DEBUG_FLAG) fprintf(stderr, "Now at end of input.\n"); #endif } else { yychar1 = YYTRANSLATE(YY_@_CHAR); #if YY_@_DEBUG != 0 if (YY_@_DEBUG_FLAG) { fprintf (stderr, "Next token is %d (%s", YY_@_CHAR, yytname[yychar1]); /* Give the individual parser a way to print the precise meaning of a token, for further debugging info. */ #ifdef YYPRINT YYPRINT (stderr, YY_@_CHAR, YY_@_LVAL); #endif fprintf (stderr, ")\n"); } #endif } yyn += yychar1; if (yyn < 0 || yyn > YYLAST || yycheck[yyn] != yychar1) YYGOTO(yydefault); yyn = yytable[yyn]; /* yyn is what to do for this token type in this state. Negative => reduce, -yyn is rule number. Positive => shift, yyn is new state. New state is final state => don't bother to shift, just return success. 0, or most negative number => error. */ if (yyn < 0) { if (yyn == YYFLAG) YYGOTO(yyerrlab); yyn = -yyn; YYGOTO(yyreduce); } else if (yyn == 0) YYGOTO(yyerrlab); if (yyn == YYFINAL) YYACCEPT; /* Shift the lookahead token. */ #if YY_@_DEBUG != 0 if (YY_@_DEBUG_FLAG) fprintf(stderr, "Shifting token %d (%s), ", YY_@_CHAR, yytname[yychar1]); #endif /* Discard the token being shifted unless it is eof. */ if (YY_@_CHAR != YYEOF) YY_@_CHAR = YYEMPTY; *++yyvsp = YY_@_LVAL; #ifdef YY_@_LSP_NEEDED *++yylsp = YY_@_LLOC; #endif /* count tokens shifted since error; after three, turn off error status. */ if (yyerrstatus) yyerrstatus--; yystate = yyn; YYGOTO(yynewstate); /* Do the default action for the current state. */ YYLABEL(yydefault) yyn = yydefact[yystate]; if (yyn == 0) YYGOTO(yyerrlab); /* Do a reduction. yyn is the number of a rule to reduce with. */ YYLABEL(yyreduce) yylen = yyr2[yyn]; if (yylen > 0) yyval = yyvsp[1-yylen]; /* implement default value of the action */ #if YY_@_DEBUG != 0 if (YY_@_DEBUG_FLAG) { int i; fprintf (stderr, "Reducing via rule %d (line %d), ", yyn, yyrline[yyn]); /* Print the symbols being reduced, and their result. */ for (i = yyprhs[yyn]; yyrhs[i] > 0; i++) fprintf (stderr, "%s ", yytname[yyrhs[i]]); fprintf (stderr, " -> %s\n", yytname[yyr1[yyn]]); } #endif $ /* the action file gets copied in in place of this dollarsign */ yyvsp -= yylen; yyssp -= yylen; #ifdef YY_@_LSP_NEEDED yylsp -= yylen; #endif #if YY_@_DEBUG != 0 if (YY_@_DEBUG_FLAG) { short *ssp1 = yyss - 1; fprintf (stderr, "state stack now"); while (ssp1 != yyssp) fprintf (stderr, " %d", *++ssp1); fprintf (stderr, "\n"); } #endif *++yyvsp = yyval; #ifdef YY_@_LSP_NEEDED yylsp++; if (yylen == 0) { yylsp->first_line = YY_@_LLOC.first_line; yylsp->first_column = YY_@_LLOC.first_column; yylsp->last_line = (yylsp-1)->last_line; yylsp->last_column = (yylsp-1)->last_column; yylsp->text = 0; } else { yylsp->last_line = (yylsp+yylen-1)->last_line; yylsp->last_column = (yylsp+yylen-1)->last_column; } #endif /* Now "shift" the result of the reduction. Determine what state that goes to, based on the state we popped back to and the rule number reduced by. */ yyn = yyr1[yyn]; yystate = yypgoto[yyn - YYNTBASE] + *yyssp; if (yystate >= 0 && yystate <= YYLAST && yycheck[yystate] == *yyssp) yystate = yytable[yystate]; else yystate = yydefgoto[yyn - YYNTBASE]; YYGOTO(yynewstate); YYLABEL(yyerrlab) /* here on detecting error */ if (! yyerrstatus) /* If not already recovering from an error, report this error. */ { ++YY_@_NERRS; #ifdef YY_@_ERROR_VERBOSE yyn = yypact[yystate]; if (yyn > YYFLAG && yyn < YYLAST) { int size = 0; char *msg; int x, count; count = 0; /* Start X at -yyn if nec to avoid negative indexes in yycheck. */ for (x = (yyn < 0 ? -yyn : 0); x < (sizeof(yytname) / sizeof(char *)); x++) if (yycheck[x + yyn] == x) size += strlen(yytname[x]) + 15, count++; msg = (char *) malloc(size + 15); if (msg != 0) { strcpy(msg, "parse error"); if (count < 5) { count = 0; for (x = (yyn < 0 ? -yyn : 0); x < (sizeof(yytname) / sizeof(char *)); x++) if (yycheck[x + yyn] == x) { strcat(msg, count == 0 ? ", expecting `" : " or `"); strcat(msg, yytname[x]); strcat(msg, "'"); count++; } } YY_@_ERROR(msg); free(msg); } else YY_@_ERROR ("parse error; also virtual memory exceeded"); } else #endif /* YY_@_ERROR_VERBOSE */ YY_@_ERROR((char*)"parse error"); } YYGOTO(yyerrlab1); YYLABEL(yyerrlab1) /* here on error raised explicitly by an action */ if (yyerrstatus == 3) { /* if just tried and failed to reuse lookahead token after an error, discard it. */ /* return failure if at end of input */ if (YY_@_CHAR == YYEOF) YYABORT; #if YY_@_DEBUG != 0 if (YY_@_DEBUG_FLAG) fprintf(stderr, "Discarding token %d (%s).\n", YY_@_CHAR, yytname[yychar1]); #endif YY_@_CHAR = YYEMPTY; } /* Else will try to reuse lookahead token after shifting the error token. */ yyerrstatus = 3; /* Each real token shifted decrements this */ YYGOTO(yyerrhandle); YYLABEL(yyerrdefault) /* current state does not do anything special for the error token. */ #if 0 /* This is wrong; only states that explicitly want error tokens should shift them. */ yyn = yydefact[yystate]; /* If its default is to accept any token, ok. Otherwise pop it.*/ if (yyn) YYGOTO(yydefault); #endif YYLABEL(yyerrpop) /* pop the current state because it cannot handle the error token */ if (yyssp == yyss) YYABORT; yyvsp--; yystate = *--yyssp; #ifdef YY_@_LSP_NEEDED yylsp--; #endif #if YY_@_DEBUG != 0 if (YY_@_DEBUG_FLAG) { short *ssp1 = yyss - 1; fprintf (stderr, "Error: state stack now"); while (ssp1 != yyssp) fprintf (stderr, " %d", *++ssp1); fprintf (stderr, "\n"); } #endif YYLABEL(yyerrhandle) yyn = yypact[yystate]; if (yyn == YYFLAG) YYGOTO(yyerrdefault); yyn += YYTERROR; if (yyn < 0 || yyn > YYLAST || yycheck[yyn] != YYTERROR) YYGOTO(yyerrdefault); yyn = yytable[yyn]; if (yyn < 0) { if (yyn == YYFLAG) YYGOTO(yyerrpop); yyn = -yyn; YYGOTO(yyreduce); } else if (yyn == 0) YYGOTO(yyerrpop); if (yyn == YYFINAL) YYACCEPT; #if YY_@_DEBUG != 0 if (YY_@_DEBUG_FLAG) fprintf(stderr, "Shifting error token, "); #endif *++yyvsp = YY_@_LVAL; #ifdef YY_@_LSP_NEEDED *++yylsp = YY_@_LLOC; #endif yystate = yyn; YYGOTO(yynewstate); /* end loop, in which YYGOTO may be used. */ YYENDGOTO } /* END */ $ /* section 3 */ /* AFTER END , NEVER READ !!! */ dibbler-1.0.1/bison++/mdate-sh0000775000175000017500000000516712233256142012740 00000000000000#!/bin/sh # Get modification time of a file or directory and pretty-print it. # Copyright (C) 1995, 1996, 1997 Free Software Foundation, Inc. # written by Ulrich Drepper , June 1995 # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software Foundation, # Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. # Prevent date giving response in another language. LANG=C export LANG LC_ALL=C export LC_ALL LC_TIME=C export LC_TIME # Get the extended ls output of the file or directory. # On HPUX /bin/sh, "set" interprets "-rw-r--r--" as options, so the "x" below. if ls -L /dev/null 1>/dev/null 2>&1; then set - x`ls -L -l -d $1` else set - x`ls -l -d $1` fi # The month is at least the fourth argument # (3 shifts here, the next inside the loop). shift shift shift # Find the month. Next argument is day, followed by the year or time. month= until test $month do shift case $1 in Jan) month=January; nummonth=1;; Feb) month=February; nummonth=2;; Mar) month=March; nummonth=3;; Apr) month=April; nummonth=4;; May) month=May; nummonth=5;; Jun) month=June; nummonth=6;; Jul) month=July; nummonth=7;; Aug) month=August; nummonth=8;; Sep) month=September; nummonth=9;; Oct) month=October; nummonth=10;; Nov) month=November; nummonth=11;; Dec) month=December; nummonth=12;; esac done day=$2 # Here we have to deal with the problem that the ls output gives either # the time of day or the year. case $3 in *:*) set `date`; eval year=\$$# case $2 in Jan) nummonthtod=1;; Feb) nummonthtod=2;; Mar) nummonthtod=3;; Apr) nummonthtod=4;; May) nummonthtod=5;; Jun) nummonthtod=6;; Jul) nummonthtod=7;; Aug) nummonthtod=8;; Sep) nummonthtod=9;; Oct) nummonthtod=10;; Nov) nummonthtod=11;; Dec) nummonthtod=12;; esac # For the first six month of the year the time notation can also # be used for files modified in the last year. if (expr $nummonth \> $nummonthtod) > /dev/null; then year=`expr $year - 1` fi;; *) year=$3;; esac # The result. echo $day $month $year dibbler-1.0.1/bison++/files.h0000664000175000017500000000513012233256142012551 00000000000000/* File names and variables for bison, Copyright (C) 1984, 1989 Free Software Foundation, Inc. This file is part of Bison, the GNU Compiler Compiler. Bison 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. Bison 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 Bison; see the file COPYING. If not, write to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ /* These two should be pathnames for opening the sample parser files. When bison is installed, they should be absolute pathnames. XPFILE1 and XPFILE2 normally come from the Makefile. */ #define PFILE XPFILE /* Simple parser */ #define PFILE1 XPFILE1 /* Semantic parser */ extern FILE *finput; /* read grammar specifications */ extern FILE *foutput; /* optionally output messages describing the actions taken */ extern FILE *fdefines; /* optionally output #define's for token numbers. */ extern FILE *ftable; /* output the tables and the parser */ extern FILE *fattrs; /* if semantic parser, output a .h file that defines YYSTYPE */ /* and also contains all the %{ ... %} definitions. */ extern FILE *fguard; /* if semantic parser, output yyguard, containing all the guard code */ extern FILE *faction; /* output all the action code; precise form depends on which parser */ extern FILE *fparser; /* read the parser to copy into ftable */ extern FILE *fbisoncomp; /* outputs YY_USE_CLASS defs (i.e bison or bison++ output*/ /* File name specified with -o for the output file, or 0 if no -o. */ extern char *spec_outfile; extern char *spec_name_prefix; /* for -a, from getargs.c */ /* File name pfx specified with -b, or 0 if no -b. */ extern char *spec_file_prefix; extern char *infile; extern char *outfile; extern char *defsfile; extern char *tabfile; extern char *attrsfile; extern char *guardfile; extern char *actfile; /* AC addings */ #define HFILE XHFILE /* header Skeleton */ extern char *hskelfile; /* -H option : parser file name */ extern char *cparserfile; /* -S option header skeleton filename */ extern FILE *fhskel; extern char *parser_name; extern int parser_defined; extern int yylsp_needed; char *quoted_filename(char*); /* quote filename, especially on DOS */ /* AC added end*/ dibbler-1.0.1/bison++/getopt1.cc0000664000175000017500000001034312233256142013172 00000000000000/* getopt_long and getopt_long_only entry points for GNU getopt. Copyright (C) 1987, 88, 89, 90, 91, 92, 1993 Free Software Foundation, Inc. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ #ifdef HAVE_CONFIG_H /* We use instead of "config.h" so that a compilation using -I. -I$srcdir will use ./config.h rather than $srcdir/config.h (which it would do because getopt1.c was found in $srcdir). */ #include #endif #include "getopt.h" #ifndef __STDC__ /* This is a separate conditional since some stdc systems reject `defined (const)'. */ #ifndef const #define const #endif #endif #include /* Comment out all this code if we are using the GNU C Library, and are not actually compiling the library itself. This code is part of the GNU C Library, but also included in many other GNU distributions. Compiling and linking in this code is a waste when using the GNU C library (especially if it is a shared library). Rather than having every GNU program understand `configure --with-gnu-libc' and omit the object files, it is simpler to just do this in the source for each such file. */ #if defined (_LIBC) || !defined (__GNU_LIBRARY__) /* This needs to come after some library #include to get __GNU_LIBRARY__ defined. */ #ifdef __GNU_LIBRARY__ #include #else char *getenv (); #endif #ifndef NULL #define NULL 0 #endif int getopt_long (int argc, char *const *argv, const char *options, const struct option *long_options, int *opt_index) { return _getopt_internal (argc, argv, options, long_options, opt_index, 0); } /* Like getopt_long, but '-' as well as '--' can indicate a long option. If an option that starts with '-' (not '--') doesn't match a long option, but does match a short option, it is parsed as a short option instead. */ int getopt_long_only (int argc, char *const *argv, const char *options, const struct option *long_options, int *opt_index) { return _getopt_internal (argc, argv, options, long_options, opt_index, 1); } #endif /* _LIBC or not __GNU_LIBRARY__. */ #ifdef TEST #include int main (argc, argv) int argc; char **argv; { int c; int digit_optind = 0; while (1) { int this_option_optind = optind ? optind : 1; int option_index = 0; static struct option long_options[] = { {"add", 1, 0, 0}, {"append", 0, 0, 0}, {"delete", 1, 0, 0}, {"verbose", 0, 0, 0}, {"create", 0, 0, 0}, {"file", 1, 0, 0}, {0, 0, 0, 0} }; c = getopt_long (argc, argv, "abc:d:0123456789", long_options, &option_index); if (c == EOF) break; switch (c) { case 0: printf ("option %s", long_options[option_index].name); if (optarg) printf (" with arg %s", optarg); printf ("\n"); break; case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': if (digit_optind != 0 && digit_optind != this_option_optind) printf ("digits occur in two different argv-elements.\n"); digit_optind = this_option_optind; printf ("option %c\n", c); break; case 'a': printf ("option a\n"); break; case 'b': printf ("option b\n"); break; case 'c': printf ("option c with value `%s'\n", optarg); break; case 'd': printf ("option d with value `%s'\n", optarg); break; case '?': break; default: printf ("?? getopt returned character code 0%o ??\n", c); } } if (optind < argc) { printf ("non-option ARGV-elements: "); while (optind < argc) printf ("%s ", argv[optind++]); printf ("\n"); } exit (0); } #endif /* TEST */ dibbler-1.0.1/bison++/closure.cc0000664000175000017500000001514112233256142013264 00000000000000/* Subroutines for bison Copyright (C) 1984, 1989 Free Software Foundation, Inc. This file is part of Bison, the GNU Compiler Compiler. Bison 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. Bison 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 Bison; see the file COPYING. If not, write to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ /* subroutines of file LR0.c. Entry points: closure (items, n) Given a vector of item numbers items, of length n, set up ruleset and itemset to indicate what rules could be run and which items could be accepted when those items are the active ones. ruleset contains a bit for each rule. closure sets the bits for all rules which could potentially describe the next input to be read. itemset is a vector of item numbers; itemsetend points to just beyond the end of the part of it that is significant. closure places there the indices of all items which represent units of input that could arrive next. initialize_closure (n) Allocates the itemset and ruleset vectors, and precomputes useful data so that closure can be called. n is the number of elements to allocate for itemset. finalize_closure () Frees itemset, ruleset and internal data. */ #include #include "system.h" #include "machine.h" #include "new.h" #include "gram.h" extern short **derives; extern char **tags; void set_fderives(); void set_firsts(); extern void RTC(unsigned* R, int n); short *itemset; short *itemsetend; static unsigned *ruleset; /* internal data. See comments before set_fderives and set_firsts. */ static unsigned *fderives; static unsigned *firsts; /* number of words required to hold a bit for each rule */ static int rulesetsize; /* number of words required to hold a bit for each variable */ static int varsetsize; void initialize_closure(int n) { itemset = NEW2(n, short); rulesetsize = WORDSIZE(nrules + 1); ruleset = NEW2(rulesetsize, unsigned); set_fderives(); } /* set fderives to an nvars by nrules matrix of bits indicating which rules can help derive the beginning of the data for each nonterminal. For example, if symbol 5 can be derived as the sequence of symbols 8 3 20, and one of the rules for deriving symbol 8 is rule 4, then the [5 - ntokens, 4] bit in fderives is set. */ void set_fderives() { register unsigned *rrow; register unsigned *vrow; register int j; register unsigned cword; register short *rp; register int b; int ruleno; int i; fderives = NEW2(nvars * rulesetsize, unsigned) - ntokens * rulesetsize; set_firsts(); rrow = fderives + ntokens * rulesetsize; for (i = ntokens; i < nsyms; i++) { vrow = firsts + ((i - ntokens) * varsetsize); cword = *vrow++; b = 0; for (j = ntokens; j < nsyms; j++) { if (cword & (1 << b)) { rp = derives[j]; while ((ruleno = *rp++) > 0) { SETBIT(rrow, ruleno); } } b++; if (b >= BITS_PER_WORD && j + 1 < nsyms) { cword = *vrow++; b = 0; } } rrow += rulesetsize; } #ifdef DEBUG print_fderives(); #endif FREE(firsts); } /* set firsts to be an nvars by nvars bit matrix indicating which items can represent the beginning of the input corresponding to which other items. For example, if some rule expands symbol 5 into the sequence of symbols 8 3 20, the symbol 8 can be the beginning of the data for symbol 5, so the bit [8 - ntokens, 5 - ntokens] in firsts is set. */ void set_firsts() { register unsigned *row; /* register int done; JF unused */ register int symbol; register short *sp; register int rowsize; int i; varsetsize = rowsize = WORDSIZE(nvars); firsts = NEW2(nvars * rowsize, unsigned); row = firsts; for (i = ntokens; i < nsyms; i++) { sp = derives[i]; while (*sp >= 0) { symbol = ritem[rrhs[*sp++]]; if (ISVAR(symbol)) { symbol -= ntokens; SETBIT(row, symbol); } } row += rowsize; } RTC(firsts, nvars); #ifdef DEBUG print_firsts(); #endif } void closure(short* core, int n) { register int ruleno; register unsigned word; register short *csp; register unsigned *dsp; register unsigned *rsp; short *csend; unsigned *rsend; int symbol; int itemno; rsp = ruleset; rsend = ruleset + rulesetsize; csend = core + n; if (n == 0) { dsp = fderives + start_symbol * rulesetsize; while (rsp < rsend) *rsp++ = *dsp++; } else { while (rsp < rsend) *rsp++ = 0; csp = core; while (csp < csend) { symbol = ritem[*csp++]; if (ISVAR(symbol)) { dsp = fderives + symbol * rulesetsize; rsp = ruleset; while (rsp < rsend) *rsp++ |= *dsp++; } } } ruleno = 0; itemsetend = itemset; csp = core; rsp = ruleset; while (rsp < rsend) { word = *rsp++; if (word == 0) { ruleno += BITS_PER_WORD; } else { register int b; for (b = 0; b < BITS_PER_WORD; b++) { if (word & (1 << b)) { itemno = rrhs[ruleno]; while (csp < csend && *csp < itemno) *itemsetend++ = *csp++; *itemsetend++ = itemno; } ruleno++; } } } while (csp < csend) *itemsetend++ = *csp++; #ifdef DEBUG print_closure(n); #endif } void finalize_closure() { FREE(itemset); FREE(ruleset); FREE(fderives + ntokens * rulesetsize); } #ifdef DEBUG print_closure(int n) { register short *isp; printf("\n\nn = %d\n\n", n); for (isp = itemset; isp < itemsetend; isp++) printf(" %d\n", *isp); } print_firsts() { register int i; register int j; register unsigned *rowp; printf("\n\n\nFIRSTS\n\n"); for (i = ntokens; i < nsyms; i++) { printf("\n\n%s firsts\n\n", tags[i]); rowp = firsts + ((i - ntokens) * varsetsize); for (j = 0; j < nvars; j++) if (BITISSET (rowp, j)) printf(" %s\n", tags[j + ntokens]); } } print_fderives() { register int i; register int j; register unsigned *rp; printf("\n\n\nFDERIVES\n"); for (i = ntokens; i < nsyms; i++) { printf("\n\n%s derives\n\n", tags[i]); rp = fderives + i * rulesetsize; for (j = 0; j <= nrules; j++) if (BITISSET (rp, j)) printf(" %d\n", j); } fflush(stdout); } #endif dibbler-1.0.1/bison++/bison_pp.mak0000664000175000017500000001476512233256142013617 00000000000000ORIGIN = PWB ORIGIN_VER = 2.0 PROJ = BISON_PP PROJFILE = BISON_PP.MAK DEBUG = 1 CC = cl CFLAGS_G = /AL /W4 /Za /BATCH /Gt8 /DSTDC_HEADERS /DHAVE_STRERROR CFLAGS_D = /f /Od /Zi /Zr CFLAGS_R = /f- /Ot /Ol /Og /Oe /Oi /Gs CXX = cl CXXFLAGS_G = /W2 /BATCH CXXFLAGS_D = /f /Zi /Od CXXFLAGS_R = /f- /Ot /Oi /Ol /Oe /Og /Gs MAPFILE_D = NUL MAPFILE_R = NUL LFLAGS_G = /NOI /STACK:32000 /BATCH /ONERROR:NOEXE LFLAGS_D = /CO /FAR /PACKC LFLAGS_R = /EXE /FAR /PACKC LINKER = link ILINK = ilink LRF = echo > NUL ILFLAGS = /a /e RUNFLAGS = -dtv -o d:\tmp\test.cpp -h d:\tmp\test.h d:\tmp\test.y FILES = ALLOCATE.C CLOSURE.C DERIVES.C FILES.C GETARGS.C GETOPT.C GETOPT1.C\ GRAM.C LALR.C LEX.C MAIN.C NULLABLE.C OUTPUT.C PRINT.C READER.C\ REDUCE.C SYMTAB.C VERSION.C WARSHALL.C LR0.C CONFLICT.C OBJS = ALLOCATE.obj CLOSURE.obj DERIVES.obj FILES.obj GETARGS.obj GETOPT.obj\ GETOPT1.obj GRAM.obj LALR.obj LEX.obj MAIN.obj NULLABLE.obj OUTPUT.obj\ PRINT.obj READER.obj REDUCE.obj SYMTAB.obj VERSION.obj WARSHALL.obj\ LR0.obj CONFLICT.obj all: $(PROJ).exe .SUFFIXES: .SUFFIXES: .obj .c .SUFFIXES: .obj .c ALLOCATE.obj : ALLOCATE.C !IF $(DEBUG) @$(CC) @<<$(PROJ).rsp /c $(CFLAGS_G) $(CFLAGS_D) /FoALLOCATE.obj ALLOCATE.C << !ELSE @$(CC) @<<$(PROJ).rsp /c $(CFLAGS_G) $(CFLAGS_R) /FoALLOCATE.obj ALLOCATE.C << !ENDIF CLOSURE.obj : CLOSURE.C system.h machine.h new.h gram.h !IF $(DEBUG) @$(CC) @<<$(PROJ).rsp /c $(CFLAGS_G) $(CFLAGS_D) /FoCLOSURE.obj CLOSURE.C << !ELSE @$(CC) @<<$(PROJ).rsp /c $(CFLAGS_G) $(CFLAGS_R) /FoCLOSURE.obj CLOSURE.C << !ENDIF DERIVES.obj : DERIVES.C system.h new.h types.h gram.h !IF $(DEBUG) @$(CC) @<<$(PROJ).rsp /c $(CFLAGS_G) $(CFLAGS_D) /FoDERIVES.obj DERIVES.C << !ELSE @$(CC) @<<$(PROJ).rsp /c $(CFLAGS_G) $(CFLAGS_R) /FoDERIVES.obj DERIVES.C << !ENDIF FILES.obj : FILES.C system.h files.h new.h gram.h !IF $(DEBUG) @$(CC) @<<$(PROJ).rsp /c $(CFLAGS_G) $(CFLAGS_D) /FoFILES.obj FILES.C << !ELSE @$(CC) @<<$(PROJ).rsp /c $(CFLAGS_G) $(CFLAGS_R) /FoFILES.obj FILES.C << !ENDIF GETARGS.obj : GETARGS.C getopt.h system.h files.h !IF $(DEBUG) @$(CC) @<<$(PROJ).rsp /c $(CFLAGS_G) $(CFLAGS_D) /FoGETARGS.obj GETARGS.C << !ELSE @$(CC) @<<$(PROJ).rsp /c $(CFLAGS_G) $(CFLAGS_R) /FoGETARGS.obj GETARGS.C << !ENDIF GETOPT.obj : GETOPT.C getopt.h !IF $(DEBUG) @$(CC) @<<$(PROJ).rsp /c $(CFLAGS_G) $(CFLAGS_D) /FoGETOPT.obj GETOPT.C << !ELSE @$(CC) @<<$(PROJ).rsp /c $(CFLAGS_G) $(CFLAGS_R) /FoGETOPT.obj GETOPT.C << !ENDIF GETOPT1.obj : GETOPT1.C getopt.h !IF $(DEBUG) @$(CC) @<<$(PROJ).rsp /c $(CFLAGS_G) $(CFLAGS_D) /FoGETOPT1.obj GETOPT1.C << !ELSE @$(CC) @<<$(PROJ).rsp /c $(CFLAGS_G) $(CFLAGS_R) /FoGETOPT1.obj GETOPT1.C << !ENDIF GRAM.obj : GRAM.C !IF $(DEBUG) @$(CC) @<<$(PROJ).rsp /c $(CFLAGS_G) $(CFLAGS_D) /FoGRAM.obj GRAM.C << !ELSE @$(CC) @<<$(PROJ).rsp /c $(CFLAGS_G) $(CFLAGS_R) /FoGRAM.obj GRAM.C << !ENDIF LALR.obj : LALR.C system.h machine.h types.h state.h new.h gram.h !IF $(DEBUG) @$(CC) @<<$(PROJ).rsp /c $(CFLAGS_G) $(CFLAGS_D) /FoLALR.obj LALR.C << !ELSE @$(CC) @<<$(PROJ).rsp /c $(CFLAGS_G) $(CFLAGS_R) /FoLALR.obj LALR.C << !ENDIF LEX.obj : LEX.C system.h files.h symtab.h lex.h new.h !IF $(DEBUG) @$(CC) @<<$(PROJ).rsp /c $(CFLAGS_G) $(CFLAGS_D) /FoLEX.obj LEX.C << !ELSE @$(CC) @<<$(PROJ).rsp /c $(CFLAGS_G) $(CFLAGS_R) /FoLEX.obj LEX.C << !ENDIF MAIN.obj : MAIN.C system.h machine.h !IF $(DEBUG) @$(CC) @<<$(PROJ).rsp /c $(CFLAGS_G) $(CFLAGS_D) /FoMAIN.obj MAIN.C << !ELSE @$(CC) @<<$(PROJ).rsp /c $(CFLAGS_G) $(CFLAGS_R) /FoMAIN.obj MAIN.C << !ENDIF NULLABLE.obj : NULLABLE.C system.h types.h gram.h new.h !IF $(DEBUG) @$(CC) @<<$(PROJ).rsp /c $(CFLAGS_G) $(CFLAGS_D) /FoNULLABLE.obj NULLABLE.C << !ELSE @$(CC) @<<$(PROJ).rsp /c $(CFLAGS_G) $(CFLAGS_R) /FoNULLABLE.obj NULLABLE.C << !ENDIF OUTPUT.obj : OUTPUT.C system.h machine.h new.h files.h gram.h state.h symtab.h !IF $(DEBUG) @$(CC) @<<$(PROJ).rsp /c $(CFLAGS_G) $(CFLAGS_D) /FoOUTPUT.obj OUTPUT.C << !ELSE @$(CC) @<<$(PROJ).rsp /c $(CFLAGS_G) $(CFLAGS_R) /FoOUTPUT.obj OUTPUT.C << !ENDIF PRINT.obj : PRINT.C system.h machine.h new.h files.h gram.h state.h !IF $(DEBUG) @$(CC) @<<$(PROJ).rsp /c $(CFLAGS_G) $(CFLAGS_D) /FoPRINT.obj PRINT.C << !ELSE @$(CC) @<<$(PROJ).rsp /c $(CFLAGS_G) $(CFLAGS_R) /FoPRINT.obj PRINT.C << !ENDIF READER.obj : READER.C system.h files.h new.h symtab.h lex.h gram.h machine.h !IF $(DEBUG) @$(CC) @<<$(PROJ).rsp /c $(CFLAGS_G) $(CFLAGS_D) /FoREADER.obj READER.C << !ELSE @$(CC) @<<$(PROJ).rsp /c $(CFLAGS_G) $(CFLAGS_R) /FoREADER.obj READER.C << !ENDIF REDUCE.obj : REDUCE.C system.h files.h gram.h machine.h new.h !IF $(DEBUG) @$(CC) @<<$(PROJ).rsp /c $(CFLAGS_G) $(CFLAGS_D) /FoREDUCE.obj REDUCE.C << !ELSE @$(CC) @<<$(PROJ).rsp /c $(CFLAGS_G) $(CFLAGS_R) /FoREDUCE.obj REDUCE.C << !ENDIF SYMTAB.obj : SYMTAB.C system.h new.h symtab.h gram.h !IF $(DEBUG) @$(CC) @<<$(PROJ).rsp /c $(CFLAGS_G) $(CFLAGS_D) /FoSYMTAB.obj SYMTAB.C << !ELSE @$(CC) @<<$(PROJ).rsp /c $(CFLAGS_G) $(CFLAGS_R) /FoSYMTAB.obj SYMTAB.C << !ENDIF VERSION.obj : VERSION.C !IF $(DEBUG) @$(CC) @<<$(PROJ).rsp /c $(CFLAGS_G) $(CFLAGS_D) /FoVERSION.obj VERSION.C << !ELSE @$(CC) @<<$(PROJ).rsp /c $(CFLAGS_G) $(CFLAGS_R) /FoVERSION.obj VERSION.C << !ENDIF WARSHALL.obj : WARSHALL.C system.h machine.h !IF $(DEBUG) @$(CC) @<<$(PROJ).rsp /c $(CFLAGS_G) $(CFLAGS_D) /FoWARSHALL.obj WARSHALL.C << !ELSE @$(CC) @<<$(PROJ).rsp /c $(CFLAGS_G) $(CFLAGS_R) /FoWARSHALL.obj WARSHALL.C << !ENDIF LR0.obj : LR0.C system.h machine.h new.h gram.h state.h !IF $(DEBUG) @$(CC) @<<$(PROJ).rsp /c $(CFLAGS_G) $(CFLAGS_D) /FoLR0.obj LR0.C << !ELSE @$(CC) @<<$(PROJ).rsp /c $(CFLAGS_G) $(CFLAGS_R) /FoLR0.obj LR0.C << !ENDIF CONFLICT.obj : CONFLICT.C system.h machine.h new.h files.h gram.h state.h !IF $(DEBUG) @$(CC) @<<$(PROJ).rsp /c $(CFLAGS_G) $(CFLAGS_D) /FoCONFLICT.obj CONFLICT.C << !ELSE @$(CC) @<<$(PROJ).rsp /c $(CFLAGS_G) $(CFLAGS_R) /FoCONFLICT.obj CONFLICT.C << !ENDIF $(PROJ).exe : $(OBJS) !IF $(DEBUG) $(LRF) @<<$(PROJ).lrf $(RT_OBJS: = +^ ) $(OBJS: = +^ ) $@ $(MAPFILE_D) $(LIBS: = +^ ) + $(LLIBS_G: = +^ ) + $(LLIBS_D: = +^ ) $(DEF_FILE) $(LFLAGS_G) $(LFLAGS_D); << !ELSE $(LRF) @<<$(PROJ).lrf $(RT_OBJS: = +^ ) $(OBJS: = +^ ) $@ $(MAPFILE_R) $(LIBS: = +^ ) + $(LLIBS_G: = +^ ) + $(LLIBS_R: = +^ ) $(DEF_FILE) $(LFLAGS_G) $(LFLAGS_R); << !ENDIF $(LINKER) @$(PROJ).lrf .c.obj : !IF $(DEBUG) @$(CC) @<<$(PROJ).rsp /c $(CFLAGS_G) $(CFLAGS_D) /Fo$@ $< << !ELSE @$(CC) @<<$(PROJ).rsp /c $(CFLAGS_G) $(CFLAGS_R) /Fo$@ $< << !ENDIF run: $(PROJ).exe $(PROJ).exe $(RUNFLAGS) debug: $(PROJ).exe CV $(CVFLAGS) $(PROJ).exe $(RUNFLAGS) # << User_supplied_information >> dibbler-1.0.1/bison++/nullable.cc0000664000175000017500000000532312233256142013407 00000000000000/* Part of the bison parser generator, Copyright (C) 1984, 1989 Free Software Foundation, Inc. This file is part of Bison, the GNU Compiler Compiler. Bison 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. Bison 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 Bison; see the file COPYING. If not, write to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ /* set up nullable, a vector saying which nonterminals can expand into the null string. nullable[i - ntokens] is nonzero if symbol i can do so. */ #include #include "system.h" #include "types.h" #include "gram.h" #include "new.h" char *nullable; void set_nullable() { register short *r; register short *s1; register short *s2; register int ruleno; register int symbol; register shorts *p; short *squeue; short *rcount; shorts **rsets; shorts *relts; char any_tokens; short *r1; #ifdef TRACE fprintf(stderr, "Entering set_nullable"); #endif nullable = NEW2(nvars, char) - ntokens; squeue = NEW2(nvars, short); s1 = s2 = squeue; rcount = NEW2(nrules + 1, short); rsets = NEW2(nvars, shorts *) - ntokens; /* This is said to be more elements than we actually use. Supposedly nitems - nrules is enough. But why take the risk? */ relts = NEW2(nitems + nvars + 1, shorts); p = relts; r = ritem; while (*r) { if (*r < 0) { symbol = rlhs[-(*r++)]; if (symbol >= 0 && !nullable[symbol]) { nullable[symbol] = 1; *s2++ = symbol; } } else { r1 = r; any_tokens = 0; for (symbol = *r++; symbol > 0; symbol = *r++) { if (ISTOKEN(symbol)) any_tokens = 1; } if (!any_tokens) { ruleno = -symbol; r = r1; for (symbol = *r++; symbol > 0; symbol = *r++) { rcount[ruleno]++; p->next = rsets[symbol]; p->value = ruleno; rsets[symbol] = p; p++; } } } } while (s1 < s2) { p = rsets[*s1++]; while (p) { ruleno = p->value; p = p->next; if (--rcount[ruleno] == 0) { symbol = rlhs[ruleno]; if (symbol >= 0 && !nullable[symbol]) { nullable[symbol] = 1; *s2++ = symbol; } } } } FREE(squeue); FREE(rcount); FREE(rsets + ntokens); FREE(relts); } void free_nullable() { FREE(nullable + ntokens); } dibbler-1.0.1/bison++/bison.texinfo0000664000175000017500000061731012233256142014017 00000000000000\input texinfo @c -*-texinfo-*- @comment %**start of header @setfilename bison.info @include version.texi @settitle Bison @value{VERSION} @setchapternewpage odd @iftex @finalout @end iftex @c SMALL BOOK version @c This edition has been formatted so that you can format and print it in @c the smallbook format. @c @smallbook @c Set following if you have the new `shorttitlepage' command @c @clear shorttitlepage-enabled @c @set shorttitlepage-enabled @c ISPELL CHECK: done, 14 Jan 1993 --bob @c Check COPYRIGHT dates. should be updated in the titlepage, ifinfo @c titlepage; should NOT be changed in the GPL. --mew @iftex @syncodeindex fn cp @syncodeindex vr cp @syncodeindex tp cp @end iftex @ifinfo @synindex fn cp @synindex vr cp @synindex tp cp @end ifinfo @comment %**end of header @ifinfo @format START-INFO-DIR-ENTRY * bison: (bison). GNU Project parser generator (yacc replacement). END-INFO-DIR-ENTRY @end format @end ifinfo @ifinfo This file documents the Bison parser generator. Copyright (C) 1988, 89, 90, 91, 92, 93, 95, 98, 1999 Free Software Foundation, Inc. Permission is granted to make and distribute verbatim copies of this manual provided the copyright notice and this permission notice are preserved on all copies. @ignore Permission is granted to process this file through Tex and print the results, provided the printed document carries copying permission notice identical to this one except for the removal of this paragraph (this paragraph not being relevant to the printed manual). @end ignore Permission is granted to copy and distribute modified versions of this manual under the conditions for verbatim copying, provided also that the sections entitled ``GNU General Public License'' and ``Conditions for Using Bison'' are included exactly as in the original, and provided that the entire resulting derived work is distributed under the terms of a permission notice identical to this one. Permission is granted to copy and distribute translations of this manual into another language, under the above conditions for modified versions, except that the sections entitled ``GNU General Public License'', ``Conditions for Using Bison'' and this permission notice may be included in translations approved by the Free Software Foundation instead of in the original English. @end ifinfo @ifset shorttitlepage-enabled @shorttitlepage Bison @end ifset @titlepage @title Bison @subtitle The YACC-compatible Parser Generator @subtitle @value{UPDATED}, Bison Version @value{VERSION} @author by Charles Donnelly and Richard Stallman @page @vskip 0pt plus 1filll Copyright @copyright{} 1988, 89, 90, 91, 92, 93, 95, 98, 1999 Free Software Foundation @sp 2 Published by the Free Software Foundation @* 59 Temple Place, Suite 330 @* Boston, MA 02111-1307 USA @* Printed copies are available for $15 each.@* ISBN 1-882114-45-0 Permission is granted to make and distribute verbatim copies of this manual provided the copyright notice and this permission notice are preserved on all copies. @ignore Permission is granted to process this file through TeX and print the results, provided the printed document carries copying permission notice identical to this one except for the removal of this paragraph (this paragraph not being relevant to the printed manual). @end ignore Permission is granted to copy and distribute modified versions of this manual under the conditions for verbatim copying, provided also that the sections entitled ``GNU General Public License'' and ``Conditions for Using Bison'' are included exactly as in the original, and provided that the entire resulting derived work is distributed under the terms of a permission notice identical to this one. Permission is granted to copy and distribute translations of this manual into another language, under the above conditions for modified versions, except that the sections entitled ``GNU General Public License'', ``Conditions for Using Bison'' and this permission notice may be included in translations approved by the Free Software Foundation instead of in the original English. @sp 2 Cover art by Etienne Suvasa. @end titlepage @page @node Top, Introduction, (dir), (dir) @ifinfo This manual documents version @value{VERSION} of Bison. @end ifinfo @menu * Introduction:: * Conditions:: * Copying:: The GNU General Public License says how you can copy and share Bison Tutorial sections: * Concepts:: Basic concepts for understanding Bison. * Examples:: Three simple explained examples of using Bison. Reference sections: * Grammar File:: Writing Bison declarations and rules. * Interface:: C-language interface to the parser function @code{yyparse}. * Algorithm:: How the Bison parser works at run-time. * Error Recovery:: Writing rules for error recovery. * Context Dependency:: What to do if your language syntax is too messy for Bison to handle straightforwardly. * Debugging:: Debugging Bison parsers that parse wrong. * Invocation:: How to run Bison (to produce the parser source file). * Table of Symbols:: All the keywords of the Bison language are explained. * Glossary:: Basic concepts are explained. * Index:: Cross-references to the text. --- The Detailed Node Listing --- The Concepts of Bison * Language and Grammar:: Languages and context-free grammars, as mathematical ideas. * Grammar in Bison:: How we represent grammars for Bison's sake. * Semantic Values:: Each token or syntactic grouping can have a semantic value (the value of an integer, the name of an identifier, etc.). * Semantic Actions:: Each rule can have an action containing C code. * Bison Parser:: What are Bison's input and output, how is the output used? * Stages:: Stages in writing and running Bison grammars. * Grammar Layout:: Overall structure of a Bison grammar file. Examples * RPN Calc:: Reverse polish notation calculator; a first example with no operator precedence. * Infix Calc:: Infix (algebraic) notation calculator. Operator precedence is introduced. * Simple Error Recovery:: Continuing after syntax errors. * Multi-function Calc:: Calculator with memory and trig functions. It uses multiple data-types for semantic values. * Exercises:: Ideas for improving the multi-function calculator. Reverse Polish Notation Calculator * Decls: Rpcalc Decls. Bison and C declarations for rpcalc. * Rules: Rpcalc Rules. Grammar Rules for rpcalc, with explanation. * Lexer: Rpcalc Lexer. The lexical analyzer. * Main: Rpcalc Main. The controlling function. * Error: Rpcalc Error. The error reporting function. * Gen: Rpcalc Gen. Running Bison on the grammar file. * Comp: Rpcalc Compile. Run the C compiler on the output code. Grammar Rules for @code{rpcalc} * Rpcalc Input:: * Rpcalc Line:: * Rpcalc Expr:: Multi-Function Calculator: @code{mfcalc} * Decl: Mfcalc Decl. Bison declarations for multi-function calculator. * Rules: Mfcalc Rules. Grammar rules for the calculator. * Symtab: Mfcalc Symtab. Symbol table management subroutines. Bison Grammar Files * Grammar Outline:: Overall layout of the grammar file. * Symbols:: Terminal and nonterminal symbols. * Rules:: How to write grammar rules. * Recursion:: Writing recursive rules. * Semantics:: Semantic values and actions. * Declarations:: All kinds of Bison declarations are described here. * Multiple Parsers:: Putting more than one Bison parser in one program. Outline of a Bison Grammar * C Declarations:: Syntax and usage of the C declarations section. * Bison Declarations:: Syntax and usage of the Bison declarations section. * Grammar Rules:: Syntax and usage of the grammar rules section. * C Code:: Syntax and usage of the additional C code section. Defining Language Semantics * Value Type:: Specifying one data type for all semantic values. * Multiple Types:: Specifying several alternative data types. * Actions:: An action is the semantic definition of a grammar rule. * Action Types:: Specifying data types for actions to operate on. * Mid-Rule Actions:: Most actions go at the end of a rule. This says when, why and how to use the exceptional action in the middle of a rule. Bison Declarations * Token Decl:: Declaring terminal symbols. * Precedence Decl:: Declaring terminals with precedence and associativity. * Union Decl:: Declaring the set of all semantic value types. * Type Decl:: Declaring the choice of type for a nonterminal symbol. * Expect Decl:: Suppressing warnings about shift/reduce conflicts. * Start Decl:: Specifying the start symbol. * Pure Decl:: Requesting a reentrant parser. * Decl Summary:: Table of all Bison declarations. Parser C-Language Interface * Parser Function:: How to call @code{yyparse} and what it returns. * Lexical:: You must supply a function @code{yylex} which reads tokens. * Error Reporting:: You must supply a function @code{yyerror}. * Action Features:: Special features for use in actions. The Lexical Analyzer Function @code{yylex} * Calling Convention:: How @code{yyparse} calls @code{yylex}. * Token Values:: How @code{yylex} must return the semantic value of the token it has read. * Token Positions:: How @code{yylex} must return the text position (line number, etc.) of the token, if the actions want that. * Pure Calling:: How the calling convention differs in a pure parser (@pxref{Pure Decl, ,A Pure (Reentrant) Parser}). The Bison Parser Algorithm * Look-Ahead:: Parser looks one token ahead when deciding what to do. * Shift/Reduce:: Conflicts: when either shifting or reduction is valid. * Precedence:: Operator precedence works by resolving conflicts. * Contextual Precedence:: When an operator's precedence depends on context. * Parser States:: The parser is a finite-state-machine with stack. * Reduce/Reduce:: When two rules are applicable in the same situation. * Mystery Conflicts:: Reduce/reduce conflicts that look unjustified. * Stack Overflow:: What happens when stack gets full. How to avoid it. Operator Precedence * Why Precedence:: An example showing why precedence is needed. * Using Precedence:: How to specify precedence in Bison grammars. * Precedence Examples:: How these features are used in the previous example. * How Precedence:: How they work. Handling Context Dependencies * Semantic Tokens:: Token parsing can depend on the semantic context. * Lexical Tie-ins:: Token parsing can depend on the syntactic context. * Tie-in Recovery:: Lexical tie-ins have implications for how error recovery rules must be written. Invoking Bison * Bison Options:: All the options described in detail, in alphabetical order by short options. * Option Cross Key:: Alphabetical list of long options. * VMS Invocation:: Bison command syntax on VMS. @end menu @node Introduction, Conditions, Top, Top @unnumbered Introduction @cindex introduction @dfn{Bison} is a general-purpose parser generator that converts a grammar description for an LALR(1) context-free grammar into a C program to parse that grammar. Once you are proficient with Bison, you may use it to develop a wide range of language parsers, from those used in simple desk calculators to complex programming languages. Bison is upward compatible with Yacc: all properly-written Yacc grammars ought to work with Bison with no change. Anyone familiar with Yacc should be able to use Bison with little trouble. You need to be fluent in C programming in order to use Bison or to understand this manual. We begin with tutorial chapters that explain the basic concepts of using Bison and show three explained examples, each building on the last. If you don't know Bison or Yacc, start by reading these chapters. Reference chapters follow which describe specific aspects of Bison in detail. Bison was written primarily by Robert Corbett; Richard Stallman made it Yacc-compatible. Wilfred Hansen of Carnegie Mellon University added multicharacter string literals and other features. This edition corresponds to version @value{VERSION} of Bison. @node Conditions, Copying, Introduction, Top @unnumbered Conditions for Using Bison As of Bison version 1.24, we have changed the distribution terms for @code{yyparse} to permit using Bison's output in non-free programs. Formerly, Bison parsers could be used only in programs that were free software. The other GNU programming tools, such as the GNU C compiler, have never had such a requirement. They could always be used for non-free software. The reason Bison was different was not due to a special policy decision; it resulted from applying the usual General Public License to all of the Bison source code. The output of the Bison utility---the Bison parser file---contains a verbatim copy of a sizable piece of Bison, which is the code for the @code{yyparse} function. (The actions from your grammar are inserted into this function at one point, but the rest of the function is not changed.) When we applied the GPL terms to the code for @code{yyparse}, the effect was to restrict the use of Bison output to free software. We didn't change the terms because of sympathy for people who want to make software proprietary. @strong{Software should be free.} But we concluded that limiting Bison's use to free software was doing little to encourage people to make other software free. So we decided to make the practical conditions for using Bison match the practical conditions for using the other GNU tools. @node Copying, Concepts, Conditions, Top @unnumbered GNU GENERAL PUBLIC LICENSE @center Version 2, June 1991 @display Copyright @copyright{} 1989, 1991 Free Software Foundation, Inc. 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. @end display @unnumberedsec Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software---to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Library General Public License instead.) You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and modification follow. @iftex @unnumberedsec TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION @end iftex @ifinfo @center TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION @end ifinfo @enumerate 0 @item This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The ``Program'', below, refers to any such program or work, and a ``work based on the Program'' means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term ``modification''.) Each licensee is addressed as ``you''. Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. @item You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. @item You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: @enumerate a @item You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. @item You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. @item If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) @end enumerate These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. @item You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: @enumerate a @item Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, @item Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, @item Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) @end enumerate The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. @item You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. @item You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. @item Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. @item If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. @item If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. @item The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and ``any later version'', you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. @item If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. @iftex @heading NO WARRANTY @end iftex @ifinfo @center NO WARRANTY @end ifinfo @item BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM ``AS IS'' WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. @item IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. @end enumerate @iftex @heading END OF TERMS AND CONDITIONS @end iftex @ifinfo @center END OF TERMS AND CONDITIONS @end ifinfo @page @unnumberedsec How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the ``copyright'' line and a pointer to where the full notice is found. @smallexample @var{one line to give the program's name and a brief idea of what it does.} Copyright (C) 19@var{yy} @var{name of author} 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. @end smallexample Also add information on how to contact you by electronic and paper mail. If the program is interactive, make it output a short notice like this when it starts in an interactive mode: @smallexample Gnomovision version 69, Copyright (C) 19@var{yy} @var{name of author} Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. @end smallexample The hypothetical commands @samp{show w} and @samp{show c} should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than @samp{show w} and @samp{show c}; they could even be mouse-clicks or menu items---whatever suits your program. You should also get your employer (if you work as a programmer) or your school, if any, to sign a ``copyright disclaimer'' for the program, if necessary. Here is a sample; alter the names: @smallexample Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker. @var{signature of Ty Coon}, 1 April 1989 Ty Coon, President of Vice @end smallexample This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Library General Public License instead of this License. @node Concepts, Examples, Copying, Top @chapter The Concepts of Bison This chapter introduces many of the basic concepts without which the details of Bison will not make sense. If you do not already know how to use Bison or Yacc, we suggest you start by reading this chapter carefully. @menu * Language and Grammar:: Languages and context-free grammars, as mathematical ideas. * Grammar in Bison:: How we represent grammars for Bison's sake. * Semantic Values:: Each token or syntactic grouping can have a semantic value (the value of an integer, the name of an identifier, etc.). * Semantic Actions:: Each rule can have an action containing C code. * Bison Parser:: What are Bison's input and output, how is the output used? * Stages:: Stages in writing and running Bison grammars. * Grammar Layout:: Overall structure of a Bison grammar file. @end menu @node Language and Grammar, Grammar in Bison, , Concepts @section Languages and Context-Free Grammars @cindex context-free grammar @cindex grammar, context-free In order for Bison to parse a language, it must be described by a @dfn{context-free grammar}. This means that you specify one or more @dfn{syntactic groupings} and give rules for constructing them from their parts. For example, in the C language, one kind of grouping is called an `expression'. One rule for making an expression might be, ``An expression can be made of a minus sign and another expression''. Another would be, ``An expression can be an integer''. As you can see, rules are often recursive, but there must be at least one rule which leads out of the recursion. @cindex BNF @cindex Backus-Naur form The most common formal system for presenting such rules for humans to read is @dfn{Backus-Naur Form} or ``BNF'', which was developed in order to specify the language Algol 60. Any grammar expressed in BNF is a context-free grammar. The input to Bison is essentially machine-readable BNF. Not all context-free languages can be handled by Bison, only those that are LALR(1). In brief, this means that it must be possible to tell how to parse any portion of an input string with just a single token of look-ahead. Strictly speaking, that is a description of an LR(1) grammar, and LALR(1) involves additional restrictions that are hard to explain simply; but it is rare in actual practice to find an LR(1) grammar that fails to be LALR(1). @xref{Mystery Conflicts, , Mysterious Reduce/Reduce Conflicts}, for more information on this. @cindex symbols (abstract) @cindex token @cindex syntactic grouping @cindex grouping, syntactic In the formal grammatical rules for a language, each kind of syntactic unit or grouping is named by a @dfn{symbol}. Those which are built by grouping smaller constructs according to grammatical rules are called @dfn{nonterminal symbols}; those which can't be subdivided are called @dfn{terminal symbols} or @dfn{token types}. We call a piece of input corresponding to a single terminal symbol a @dfn{token}, and a piece corresponding to a single nonterminal symbol a @dfn{grouping}.@refill We can use the C language as an example of what symbols, terminal and nonterminal, mean. The tokens of C are identifiers, constants (numeric and string), and the various keywords, arithmetic operators and punctuation marks. So the terminal symbols of a grammar for C include `identifier', `number', `string', plus one symbol for each keyword, operator or punctuation mark: `if', `return', `const', `static', `int', `char', `plus-sign', `open-brace', `close-brace', `comma' and many more. (These tokens can be subdivided into characters, but that is a matter of lexicography, not grammar.) Here is a simple C function subdivided into tokens: @example int /* @r{keyword `int'} */ square (x) /* @r{identifier, open-paren,} */ /* @r{identifier, close-paren} */ int x; /* @r{keyword `int', identifier, semicolon} */ @{ /* @r{open-brace} */ return x * x; /* @r{keyword `return', identifier,} */ /* @r{asterisk, identifier, semicolon} */ @} /* @r{close-brace} */ @end example The syntactic groupings of C include the expression, the statement, the declaration, and the function definition. These are represented in the grammar of C by nonterminal symbols `expression', `statement', `declaration' and `function definition'. The full grammar uses dozens of additional language constructs, each with its own nonterminal symbol, in order to express the meanings of these four. The example above is a function definition; it contains one declaration, and one statement. In the statement, each @samp{x} is an expression and so is @samp{x * x}. Each nonterminal symbol must have grammatical rules showing how it is made out of simpler constructs. For example, one kind of C statement is the @code{return} statement; this would be described with a grammar rule which reads informally as follows: @quotation A `statement' can be made of a `return' keyword, an `expression' and a `semicolon'. @end quotation @noindent There would be many other rules for `statement', one for each kind of statement in C. @cindex start symbol One nonterminal symbol must be distinguished as the special one which defines a complete utterance in the language. It is called the @dfn{start symbol}. In a compiler, this means a complete input program. In the C language, the nonterminal symbol `sequence of definitions and declarations' plays this role. For example, @samp{1 + 2} is a valid C expression---a valid part of a C program---but it is not valid as an @emph{entire} C program. In the context-free grammar of C, this follows from the fact that `expression' is not the start symbol. The Bison parser reads a sequence of tokens as its input, and groups the tokens using the grammar rules. If the input is valid, the end result is that the entire token sequence reduces to a single grouping whose symbol is the grammar's start symbol. If we use a grammar for C, the entire input must be a `sequence of definitions and declarations'. If not, the parser reports a syntax error. @node Grammar in Bison, Semantic Values, Language and Grammar, Concepts @section From Formal Rules to Bison Input @cindex Bison grammar @cindex grammar, Bison @cindex formal grammar A formal grammar is a mathematical construct. To define the language for Bison, you must write a file expressing the grammar in Bison syntax: a @dfn{Bison grammar} file. @xref{Grammar File, ,Bison Grammar Files}. A nonterminal symbol in the formal grammar is represented in Bison input as an identifier, like an identifier in C. By convention, it should be in lower case, such as @code{expr}, @code{stmt} or @code{declaration}. The Bison representation for a terminal symbol is also called a @dfn{token type}. Token types as well can be represented as C-like identifiers. By convention, these identifiers should be upper case to distinguish them from nonterminals: for example, @code{INTEGER}, @code{IDENTIFIER}, @code{IF} or @code{RETURN}. A terminal symbol that stands for a particular keyword in the language should be named after that keyword converted to upper case. The terminal symbol @code{error} is reserved for error recovery. @xref{Symbols}. A terminal symbol can also be represented as a character literal, just like a C character constant. You should do this whenever a token is just a single character (parenthesis, plus-sign, etc.): use that same character in a literal as the terminal symbol for that token. A third way to represent a terminal symbol is with a C string constant containing several characters. @xref{Symbols}, for more information. The grammar rules also have an expression in Bison syntax. For example, here is the Bison rule for a C @code{return} statement. The semicolon in quotes is a literal character token, representing part of the C syntax for the statement; the naked semicolon, and the colon, are Bison punctuation used in every rule. @example stmt: RETURN expr ';' ; @end example @noindent @xref{Rules, ,Syntax of Grammar Rules}. @node Semantic Values, Semantic Actions, Grammar in Bison, Concepts @section Semantic Values @cindex semantic value @cindex value, semantic A formal grammar selects tokens only by their classifications: for example, if a rule mentions the terminal symbol `integer constant', it means that @emph{any} integer constant is grammatically valid in that position. The precise value of the constant is irrelevant to how to parse the input: if @samp{x+4} is grammatical then @samp{x+1} or @samp{x+3989} is equally grammatical.@refill But the precise value is very important for what the input means once it is parsed. A compiler is useless if it fails to distinguish between 4, 1 and 3989 as constants in the program! Therefore, each token in a Bison grammar has both a token type and a @dfn{semantic value}. @xref{Semantics, ,Defining Language Semantics}, for details. The token type is a terminal symbol defined in the grammar, such as @code{INTEGER}, @code{IDENTIFIER} or @code{','}. It tells everything you need to know to decide where the token may validly appear and how to group it with other tokens. The grammar rules know nothing about tokens except their types.@refill The semantic value has all the rest of the information about the meaning of the token, such as the value of an integer, or the name of an identifier. (A token such as @code{','} which is just punctuation doesn't need to have any semantic value.) For example, an input token might be classified as token type @code{INTEGER} and have the semantic value 4. Another input token might have the same token type @code{INTEGER} but value 3989. When a grammar rule says that @code{INTEGER} is allowed, either of these tokens is acceptable because each is an @code{INTEGER}. When the parser accepts the token, it keeps track of the token's semantic value. Each grouping can also have a semantic value as well as its nonterminal symbol. For example, in a calculator, an expression typically has a semantic value that is a number. In a compiler for a programming language, an expression typically has a semantic value that is a tree structure describing the meaning of the expression. @node Semantic Actions, Bison Parser, Semantic Values, Concepts @section Semantic Actions @cindex semantic actions @cindex actions, semantic In order to be useful, a program must do more than parse input; it must also produce some output based on the input. In a Bison grammar, a grammar rule can have an @dfn{action} made up of C statements. Each time the parser recognizes a match for that rule, the action is executed. @xref{Actions}. Most of the time, the purpose of an action is to compute the semantic value of the whole construct from the semantic values of its parts. For example, suppose we have a rule which says an expression can be the sum of two expressions. When the parser recognizes such a sum, each of the subexpressions has a semantic value which describes how it was built up. The action for this rule should create a similar sort of value for the newly recognized larger expression. For example, here is a rule that says an expression can be the sum of two subexpressions: @example expr: expr '+' expr @{ $$ = $1 + $3; @} ; @end example @noindent The action says how to produce the semantic value of the sum expression from the values of the two subexpressions. @node Bison Parser, Stages, Semantic Actions, Concepts @section Bison Output: the Parser File @cindex Bison parser @cindex Bison utility @cindex lexical analyzer, purpose @cindex parser When you run Bison, you give it a Bison grammar file as input. The output is a C source file that parses the language described by the grammar. This file is called a @dfn{Bison parser}. Keep in mind that the Bison utility and the Bison parser are two distinct programs: the Bison utility is a program whose output is the Bison parser that becomes part of your program. The job of the Bison parser is to group tokens into groupings according to the grammar rules---for example, to build identifiers and operators into expressions. As it does this, it runs the actions for the grammar rules it uses. The tokens come from a function called the @dfn{lexical analyzer} that you must supply in some fashion (such as by writing it in C). The Bison parser calls the lexical analyzer each time it wants a new token. It doesn't know what is ``inside'' the tokens (though their semantic values may reflect this). Typically the lexical analyzer makes the tokens by parsing characters of text, but Bison does not depend on this. @xref{Lexical, ,The Lexical Analyzer Function @code{yylex}}. The Bison parser file is C code which defines a function named @code{yyparse} which implements that grammar. This function does not make a complete C program: you must supply some additional functions. One is the lexical analyzer. Another is an error-reporting function which the parser calls to report an error. In addition, a complete C program must start with a function called @code{main}; you have to provide this, and arrange for it to call @code{yyparse} or the parser will never run. @xref{Interface, ,Parser C-Language Interface}. Aside from the token type names and the symbols in the actions you write, all variable and function names used in the Bison parser file begin with @samp{yy} or @samp{YY}. This includes interface functions such as the lexical analyzer function @code{yylex}, the error reporting function @code{yyerror} and the parser function @code{yyparse} itself. This also includes numerous identifiers used for internal purposes. Therefore, you should avoid using C identifiers starting with @samp{yy} or @samp{YY} in the Bison grammar file except for the ones defined in this manual. @node Stages, Grammar Layout, Bison Parser, Concepts @section Stages in Using Bison @cindex stages in using Bison @cindex using Bison The actual language-design process using Bison, from grammar specification to a working compiler or interpreter, has these parts: @enumerate @item Formally specify the grammar in a form recognized by Bison (@pxref{Grammar File, ,Bison Grammar Files}). For each grammatical rule in the language, describe the action that is to be taken when an instance of that rule is recognized. The action is described by a sequence of C statements. @item Write a lexical analyzer to process input and pass tokens to the parser. The lexical analyzer may be written by hand in C (@pxref{Lexical, ,The Lexical Analyzer Function @code{yylex}}). It could also be produced using Lex, but the use of Lex is not discussed in this manual. @item Write a controlling function that calls the Bison-produced parser. @item Write error-reporting routines. @end enumerate To turn this source code as written into a runnable program, you must follow these steps: @enumerate @item Run Bison on the grammar to produce the parser. @item Compile the code output by Bison, as well as any other source files. @item Link the object files to produce the finished product. @end enumerate @node Grammar Layout, , Stages, Concepts @section The Overall Layout of a Bison Grammar @cindex grammar file @cindex file format @cindex format of grammar file @cindex layout of Bison grammar The input file for the Bison utility is a @dfn{Bison grammar file}. The general form of a Bison grammar file is as follows: @example %@{ @var{C declarations} %@} @var{Bison declarations} %% @var{Grammar rules} %% @var{Additional C code} @end example @noindent The @samp{%%}, @samp{%@{} and @samp{%@}} are punctuation that appears in every Bison grammar file to separate the sections. The C declarations may define types and variables used in the actions. You can also use preprocessor commands to define macros used there, and use @code{#include} to include header files that do any of these things. The Bison declarations declare the names of the terminal and nonterminal symbols, and may also describe operator precedence and the data types of semantic values of various symbols. The grammar rules define how to construct each nonterminal symbol from its parts. The additional C code can contain any C code you want to use. Often the definition of the lexical analyzer @code{yylex} goes here, plus subroutines called by the actions in the grammar rules. In a simple program, all the rest of the program can go here. @node Examples, Grammar File, Concepts, Top @chapter Examples @cindex simple examples @cindex examples, simple Now we show and explain three sample programs written using Bison: a reverse polish notation calculator, an algebraic (infix) notation calculator, and a multi-function calculator. All three have been tested under BSD Unix 4.3; each produces a usable, though limited, interactive desk-top calculator. These examples are simple, but Bison grammars for real programming languages are written the same way. @ifinfo You can copy these examples out of the Info file and into a source file to try them. @end ifinfo @menu * RPN Calc:: Reverse polish notation calculator; a first example with no operator precedence. * Infix Calc:: Infix (algebraic) notation calculator. Operator precedence is introduced. * Simple Error Recovery:: Continuing after syntax errors. * Multi-function Calc:: Calculator with memory and trig functions. It uses multiple data-types for semantic values. * Exercises:: Ideas for improving the multi-function calculator. @end menu @node RPN Calc, Infix Calc, , Examples @section Reverse Polish Notation Calculator @cindex reverse polish notation @cindex polish notation calculator @cindex @code{rpcalc} @cindex calculator, simple The first example is that of a simple double-precision @dfn{reverse polish notation} calculator (a calculator using postfix operators). This example provides a good starting point, since operator precedence is not an issue. The second example will illustrate how operator precedence is handled. The source code for this calculator is named @file{rpcalc.y}. The @samp{.y} extension is a convention used for Bison input files. @menu * Decls: Rpcalc Decls. Bison and C declarations for rpcalc. * Rules: Rpcalc Rules. Grammar Rules for rpcalc, with explanation. * Lexer: Rpcalc Lexer. The lexical analyzer. * Main: Rpcalc Main. The controlling function. * Error: Rpcalc Error. The error reporting function. * Gen: Rpcalc Gen. Running Bison on the grammar file. * Comp: Rpcalc Compile. Run the C compiler on the output code. @end menu @node Rpcalc Decls, Rpcalc Rules, , RPN Calc @subsection Declarations for @code{rpcalc} Here are the C and Bison declarations for the reverse polish notation calculator. As in C, comments are placed between @samp{/*@dots{}*/}. @example /* Reverse polish notation calculator. */ %@{ #define YYSTYPE double #include %@} %token NUM %% /* Grammar rules and actions follow */ @end example The C declarations section (@pxref{C Declarations, ,The C Declarations Section}) contains two preprocessor directives. The @code{#define} directive defines the macro @code{YYSTYPE}, thus specifying the C data type for semantic values of both tokens and groupings (@pxref{Value Type, ,Data Types of Semantic Values}). The Bison parser will use whatever type @code{YYSTYPE} is defined as; if you don't define it, @code{int} is the default. Because we specify @code{double}, each token and each expression has an associated value, which is a floating point number. The @code{#include} directive is used to declare the exponentiation function @code{pow}. The second section, Bison declarations, provides information to Bison about the token types (@pxref{Bison Declarations, ,The Bison Declarations Section}). Each terminal symbol that is not a single-character literal must be declared here. (Single-character literals normally don't need to be declared.) In this example, all the arithmetic operators are designated by single-character literals, so the only terminal symbol that needs to be declared is @code{NUM}, the token type for numeric constants. @node Rpcalc Rules, Rpcalc Lexer, Rpcalc Decls, RPN Calc @subsection Grammar Rules for @code{rpcalc} Here are the grammar rules for the reverse polish notation calculator. @example input: /* empty */ | input line ; line: '\n' | exp '\n' @{ printf ("\t%.10g\n", $1); @} ; exp: NUM @{ $$ = $1; @} | exp exp '+' @{ $$ = $1 + $2; @} | exp exp '-' @{ $$ = $1 - $2; @} | exp exp '*' @{ $$ = $1 * $2; @} | exp exp '/' @{ $$ = $1 / $2; @} /* Exponentiation */ | exp exp '^' @{ $$ = pow ($1, $2); @} /* Unary minus */ | exp 'n' @{ $$ = -$1; @} ; %% @end example The groupings of the rpcalc ``language'' defined here are the expression (given the name @code{exp}), the line of input (@code{line}), and the complete input transcript (@code{input}). Each of these nonterminal symbols has several alternate rules, joined by the @samp{|} punctuator which is read as ``or''. The following sections explain what these rules mean. The semantics of the language is determined by the actions taken when a grouping is recognized. The actions are the C code that appears inside braces. @xref{Actions}. You must specify these actions in C, but Bison provides the means for passing semantic values between the rules. In each action, the pseudo-variable @code{$$} stands for the semantic value for the grouping that the rule is going to construct. Assigning a value to @code{$$} is the main job of most actions. The semantic values of the components of the rule are referred to as @code{$1}, @code{$2}, and so on. @menu * Rpcalc Input:: * Rpcalc Line:: * Rpcalc Expr:: @end menu @node Rpcalc Input, Rpcalc Line, , Rpcalc Rules @subsubsection Explanation of @code{input} Consider the definition of @code{input}: @example input: /* empty */ | input line ; @end example This definition reads as follows: ``A complete input is either an empty string, or a complete input followed by an input line''. Notice that ``complete input'' is defined in terms of itself. This definition is said to be @dfn{left recursive} since @code{input} appears always as the leftmost symbol in the sequence. @xref{Recursion, ,Recursive Rules}. The first alternative is empty because there are no symbols between the colon and the first @samp{|}; this means that @code{input} can match an empty string of input (no tokens). We write the rules this way because it is legitimate to type @kbd{Ctrl-d} right after you start the calculator. It's conventional to put an empty alternative first and write the comment @samp{/* empty */} in it. The second alternate rule (@code{input line}) handles all nontrivial input. It means, ``After reading any number of lines, read one more line if possible.'' The left recursion makes this rule into a loop. Since the first alternative matches empty input, the loop can be executed zero or more times. The parser function @code{yyparse} continues to process input until a grammatical error is seen or the lexical analyzer says there are no more input tokens; we will arrange for the latter to happen at end of file. @node Rpcalc Line, Rpcalc Expr, Rpcalc Input, Rpcalc Rules @subsubsection Explanation of @code{line} Now consider the definition of @code{line}: @example line: '\n' | exp '\n' @{ printf ("\t%.10g\n", $1); @} ; @end example The first alternative is a token which is a newline character; this means that rpcalc accepts a blank line (and ignores it, since there is no action). The second alternative is an expression followed by a newline. This is the alternative that makes rpcalc useful. The semantic value of the @code{exp} grouping is the value of @code{$1} because the @code{exp} in question is the first symbol in the alternative. The action prints this value, which is the result of the computation the user asked for. This action is unusual because it does not assign a value to @code{$$}. As a consequence, the semantic value associated with the @code{line} is uninitialized (its value will be unpredictable). This would be a bug if that value were ever used, but we don't use it: once rpcalc has printed the value of the user's input line, that value is no longer needed. @node Rpcalc Expr, , Rpcalc Line, Rpcalc Rules @subsubsection Explanation of @code{expr} The @code{exp} grouping has several rules, one for each kind of expression. The first rule handles the simplest expressions: those that are just numbers. The second handles an addition-expression, which looks like two expressions followed by a plus-sign. The third handles subtraction, and so on. @example exp: NUM | exp exp '+' @{ $$ = $1 + $2; @} | exp exp '-' @{ $$ = $1 - $2; @} @dots{} ; @end example We have used @samp{|} to join all the rules for @code{exp}, but we could equally well have written them separately: @example exp: NUM ; exp: exp exp '+' @{ $$ = $1 + $2; @} ; exp: exp exp '-' @{ $$ = $1 - $2; @} ; @dots{} @end example Most of the rules have actions that compute the value of the expression in terms of the value of its parts. For example, in the rule for addition, @code{$1} refers to the first component @code{exp} and @code{$2} refers to the second one. The third component, @code{'+'}, has no meaningful associated semantic value, but if it had one you could refer to it as @code{$3}. When @code{yyparse} recognizes a sum expression using this rule, the sum of the two subexpressions' values is produced as the value of the entire expression. @xref{Actions}. You don't have to give an action for every rule. When a rule has no action, Bison by default copies the value of @code{$1} into @code{$$}. This is what happens in the first rule (the one that uses @code{NUM}). The formatting shown here is the recommended convention, but Bison does not require it. You can add or change whitespace as much as you wish. For example, this: @example exp : NUM | exp exp '+' @{$$ = $1 + $2; @} | @dots{} @end example @noindent means the same thing as this: @example exp: NUM | exp exp '+' @{ $$ = $1 + $2; @} | @dots{} @end example @noindent The latter, however, is much more readable. @node Rpcalc Lexer, Rpcalc Main, Rpcalc Rules, RPN Calc @subsection The @code{rpcalc} Lexical Analyzer @cindex writing a lexical analyzer @cindex lexical analyzer, writing The lexical analyzer's job is low-level parsing: converting characters or sequences of characters into tokens. The Bison parser gets its tokens by calling the lexical analyzer. @xref{Lexical, ,The Lexical Analyzer Function @code{yylex}}. Only a simple lexical analyzer is needed for the RPN calculator. This lexical analyzer skips blanks and tabs, then reads in numbers as @code{double} and returns them as @code{NUM} tokens. Any other character that isn't part of a number is a separate token. Note that the token-code for such a single-character token is the character itself. The return value of the lexical analyzer function is a numeric code which represents a token type. The same text used in Bison rules to stand for this token type is also a C expression for the numeric code for the type. This works in two ways. If the token type is a character literal, then its numeric code is the ASCII code for that character; you can use the same character literal in the lexical analyzer to express the number. If the token type is an identifier, that identifier is defined by Bison as a C macro whose definition is the appropriate number. In this example, therefore, @code{NUM} becomes a macro for @code{yylex} to use. The semantic value of the token (if it has one) is stored into the global variable @code{yylval}, which is where the Bison parser will look for it. (The C data type of @code{yylval} is @code{YYSTYPE}, which was defined at the beginning of the grammar; @pxref{Rpcalc Decls, ,Declarations for @code{rpcalc}}.) A token type code of zero is returned if the end-of-file is encountered. (Bison recognizes any nonpositive value as indicating the end of the input.) Here is the code for the lexical analyzer: @example @group /* Lexical analyzer returns a double floating point number on the stack and the token NUM, or the ASCII character read if not a number. Skips all blanks and tabs, returns 0 for EOF. */ #include @end group @group yylex () @{ int c; /* skip white space */ while ((c = getchar ()) == ' ' || c == '\t') ; @end group @group /* process numbers */ if (c == '.' || isdigit (c)) @{ ungetc (c, stdin); scanf ("%lf", &yylval); return NUM; @} @end group @group /* return end-of-file */ if (c == EOF) return 0; /* return single chars */ return c; @} @end group @end example @node Rpcalc Main, Rpcalc Error, Rpcalc Lexer, RPN Calc @subsection The Controlling Function @cindex controlling function @cindex main function in simple example In keeping with the spirit of this example, the controlling function is kept to the bare minimum. The only requirement is that it call @code{yyparse} to start the process of parsing. @example @group main () @{ yyparse (); @} @end group @end example @node Rpcalc Error, Rpcalc Gen, Rpcalc Main, RPN Calc @subsection The Error Reporting Routine @cindex error reporting routine When @code{yyparse} detects a syntax error, it calls the error reporting function @code{yyerror} to print an error message (usually but not always @code{"parse error"}). It is up to the programmer to supply @code{yyerror} (@pxref{Interface, ,Parser C-Language Interface}), so here is the definition we will use: @example @group #include yyerror (s) /* Called by yyparse on error */ char *s; @{ printf ("%s\n", s); @} @end group @end example After @code{yyerror} returns, the Bison parser may recover from the error and continue parsing if the grammar contains a suitable error rule (@pxref{Error Recovery}). Otherwise, @code{yyparse} returns nonzero. We have not written any error rules in this example, so any invalid input will cause the calculator program to exit. This is not clean behavior for a real calculator, but it is adequate in the first example. @node Rpcalc Gen, Rpcalc Compile, Rpcalc Error, RPN Calc @subsection Running Bison to Make the Parser @cindex running Bison (introduction) Before running Bison to produce a parser, we need to decide how to arrange all the source code in one or more source files. For such a simple example, the easiest thing is to put everything in one file. The definitions of @code{yylex}, @code{yyerror} and @code{main} go at the end, in the ``additional C code'' section of the file (@pxref{Grammar Layout, ,The Overall Layout of a Bison Grammar}). For a large project, you would probably have several source files, and use @code{make} to arrange to recompile them. With all the source in a single file, you use the following command to convert it into a parser file: @example bison @var{file_name}.y @end example @noindent In this example the file was called @file{rpcalc.y} (for ``Reverse Polish CALCulator''). Bison produces a file named @file{@var{file_name}.tab.c}, removing the @samp{.y} from the original file name. The file output by Bison contains the source code for @code{yyparse}. The additional functions in the input file (@code{yylex}, @code{yyerror} and @code{main}) are copied verbatim to the output. @node Rpcalc Compile, , Rpcalc Gen, RPN Calc @subsection Compiling the Parser File @cindex compiling the parser Here is how to compile and run the parser file: @example @group # @r{List files in current directory.} % ls rpcalc.tab.c rpcalc.y @end group @group # @r{Compile the Bison parser.} # @r{@samp{-lm} tells compiler to search math library for @code{pow}.} % cc rpcalc.tab.c -lm -o rpcalc @end group @group # @r{List files again.} % ls rpcalc rpcalc.tab.c rpcalc.y @end group @end example The file @file{rpcalc} now contains the executable code. Here is an example session using @code{rpcalc}. @example % rpcalc 4 9 + 13 3 7 + 3 4 5 *+- -13 3 7 + 3 4 5 * + - n @r{Note the unary minus, @samp{n}} 13 5 6 / 4 n + -3.166666667 3 4 ^ @r{Exponentiation} 81 ^D @r{End-of-file indicator} % @end example @node Infix Calc, Simple Error Recovery, RPN Calc, Examples @section Infix Notation Calculator: @code{calc} @cindex infix notation calculator @cindex @code{calc} @cindex calculator, infix notation We now modify rpcalc to handle infix operators instead of postfix. Infix notation involves the concept of operator precedence and the need for parentheses nested to arbitrary depth. Here is the Bison code for @file{calc.y}, an infix desk-top calculator. @example /* Infix notation calculator--calc */ %@{ #define YYSTYPE double #include %@} /* BISON Declarations */ %token NUM %left '-' '+' %left '*' '/' %left NEG /* negation--unary minus */ %right '^' /* exponentiation */ /* Grammar follows */ %% input: /* empty string */ | input line ; line: '\n' | exp '\n' @{ printf ("\t%.10g\n", $1); @} ; exp: NUM @{ $$ = $1; @} | exp '+' exp @{ $$ = $1 + $3; @} | exp '-' exp @{ $$ = $1 - $3; @} | exp '*' exp @{ $$ = $1 * $3; @} | exp '/' exp @{ $$ = $1 / $3; @} | '-' exp %prec NEG @{ $$ = -$2; @} | exp '^' exp @{ $$ = pow ($1, $3); @} | '(' exp ')' @{ $$ = $2; @} ; %% @end example @noindent The functions @code{yylex}, @code{yyerror} and @code{main} can be the same as before. There are two important new features shown in this code. In the second section (Bison declarations), @code{%left} declares token types and says they are left-associative operators. The declarations @code{%left} and @code{%right} (right associativity) take the place of @code{%token} which is used to declare a token type name without associativity. (These tokens are single-character literals, which ordinarily don't need to be declared. We declare them here to specify the associativity.) Operator precedence is determined by the line ordering of the declarations; the higher the line number of the declaration (lower on the page or screen), the higher the precedence. Hence, exponentiation has the highest precedence, unary minus (@code{NEG}) is next, followed by @samp{*} and @samp{/}, and so on. @xref{Precedence, ,Operator Precedence}. The other important new feature is the @code{%prec} in the grammar section for the unary minus operator. The @code{%prec} simply instructs Bison that the rule @samp{| '-' exp} has the same precedence as @code{NEG}---in this case the next-to-highest. @xref{Contextual Precedence, ,Context-Dependent Precedence}. Here is a sample run of @file{calc.y}: @need 500 @example % calc 4 + 4.5 - (34/(8*3+-3)) 6.880952381 -56 + 2 -54 3 ^ 2 9 @end example @node Simple Error Recovery, Multi-function Calc, Infix Calc, Examples @section Simple Error Recovery @cindex error recovery, simple Up to this point, this manual has not addressed the issue of @dfn{error recovery}---how to continue parsing after the parser detects a syntax error. All we have handled is error reporting with @code{yyerror}. Recall that by default @code{yyparse} returns after calling @code{yyerror}. This means that an erroneous input line causes the calculator program to exit. Now we show how to rectify this deficiency. The Bison language itself includes the reserved word @code{error}, which may be included in the grammar rules. In the example below it has been added to one of the alternatives for @code{line}: @example @group line: '\n' | exp '\n' @{ printf ("\t%.10g\n", $1); @} | error '\n' @{ yyerrok; @} ; @end group @end example This addition to the grammar allows for simple error recovery in the event of a parse error. If an expression that cannot be evaluated is read, the error will be recognized by the third rule for @code{line}, and parsing will continue. (The @code{yyerror} function is still called upon to print its message as well.) The action executes the statement @code{yyerrok}, a macro defined automatically by Bison; its meaning is that error recovery is complete (@pxref{Error Recovery}). Note the difference between @code{yyerrok} and @code{yyerror}; neither one is a misprint.@refill This form of error recovery deals with syntax errors. There are other kinds of errors; for example, division by zero, which raises an exception signal that is normally fatal. A real calculator program must handle this signal and use @code{longjmp} to return to @code{main} and resume parsing input lines; it would also have to discard the rest of the current line of input. We won't discuss this issue further because it is not specific to Bison programs. @node Multi-function Calc, Exercises, Simple Error Recovery, Examples @section Multi-Function Calculator: @code{mfcalc} @cindex multi-function calculator @cindex @code{mfcalc} @cindex calculator, multi-function Now that the basics of Bison have been discussed, it is time to move on to a more advanced problem. The above calculators provided only five functions, @samp{+}, @samp{-}, @samp{*}, @samp{/} and @samp{^}. It would be nice to have a calculator that provides other mathematical functions such as @code{sin}, @code{cos}, etc. It is easy to add new operators to the infix calculator as long as they are only single-character literals. The lexical analyzer @code{yylex} passes back all non-number characters as tokens, so new grammar rules suffice for adding a new operator. But we want something more flexible: built-in functions whose syntax has this form: @example @var{function_name} (@var{argument}) @end example @noindent At the same time, we will add memory to the calculator, by allowing you to create named variables, store values in them, and use them later. Here is a sample session with the multi-function calculator: @example % mfcalc pi = 3.141592653589 3.1415926536 sin(pi) 0.0000000000 alpha = beta1 = 2.3 2.3000000000 alpha 2.3000000000 ln(alpha) 0.8329091229 exp(ln(beta1)) 2.3000000000 % @end example Note that multiple assignment and nested function calls are permitted. @menu * Decl: Mfcalc Decl. Bison declarations for multi-function calculator. * Rules: Mfcalc Rules. Grammar rules for the calculator. * Symtab: Mfcalc Symtab. Symbol table management subroutines. @end menu @node Mfcalc Decl, Mfcalc Rules, , Multi-function Calc @subsection Declarations for @code{mfcalc} Here are the C and Bison declarations for the multi-function calculator. @smallexample %@{ #include /* For math functions, cos(), sin(), etc. */ #include "calc.h" /* Contains definition of `symrec' */ %@} %union @{ double val; /* For returning numbers. */ symrec *tptr; /* For returning symbol-table pointers */ @} %token NUM /* Simple double precision number */ %token VAR FNCT /* Variable and Function */ %type exp %right '=' %left '-' '+' %left '*' '/' %left NEG /* Negation--unary minus */ %right '^' /* Exponentiation */ /* Grammar follows */ %% @end smallexample The above grammar introduces only two new features of the Bison language. These features allow semantic values to have various data types (@pxref{Multiple Types, ,More Than One Value Type}). The @code{%union} declaration specifies the entire list of possible types; this is instead of defining @code{YYSTYPE}. The allowable types are now double-floats (for @code{exp} and @code{NUM}) and pointers to entries in the symbol table. @xref{Union Decl, ,The Collection of Value Types}. Since values can now have various types, it is necessary to associate a type with each grammar symbol whose semantic value is used. These symbols are @code{NUM}, @code{VAR}, @code{FNCT}, and @code{exp}. Their declarations are augmented with information about their data type (placed between angle brackets). The Bison construct @code{%type} is used for declaring nonterminal symbols, just as @code{%token} is used for declaring token types. We have not used @code{%type} before because nonterminal symbols are normally declared implicitly by the rules that define them. But @code{exp} must be declared explicitly so we can specify its value type. @xref{Type Decl, ,Nonterminal Symbols}. @node Mfcalc Rules, Mfcalc Symtab, Mfcalc Decl, Multi-function Calc @subsection Grammar Rules for @code{mfcalc} Here are the grammar rules for the multi-function calculator. Most of them are copied directly from @code{calc}; three rules, those which mention @code{VAR} or @code{FNCT}, are new. @smallexample input: /* empty */ | input line ; line: '\n' | exp '\n' @{ printf ("\t%.10g\n", $1); @} | error '\n' @{ yyerrok; @} ; exp: NUM @{ $$ = $1; @} | VAR @{ $$ = $1->value.var; @} | VAR '=' exp @{ $$ = $3; $1->value.var = $3; @} | FNCT '(' exp ')' @{ $$ = (*($1->value.fnctptr))($3); @} | exp '+' exp @{ $$ = $1 + $3; @} | exp '-' exp @{ $$ = $1 - $3; @} | exp '*' exp @{ $$ = $1 * $3; @} | exp '/' exp @{ $$ = $1 / $3; @} | '-' exp %prec NEG @{ $$ = -$2; @} | exp '^' exp @{ $$ = pow ($1, $3); @} | '(' exp ')' @{ $$ = $2; @} ; /* End of grammar */ %% @end smallexample @node Mfcalc Symtab, , Mfcalc Rules, Multi-function Calc @subsection The @code{mfcalc} Symbol Table @cindex symbol table example The multi-function calculator requires a symbol table to keep track of the names and meanings of variables and functions. This doesn't affect the grammar rules (except for the actions) or the Bison declarations, but it requires some additional C functions for support. The symbol table itself consists of a linked list of records. Its definition, which is kept in the header @file{calc.h}, is as follows. It provides for either functions or variables to be placed in the table. @smallexample @group /* Data type for links in the chain of symbols. */ struct symrec @{ char *name; /* name of symbol */ int type; /* type of symbol: either VAR or FNCT */ union @{ double var; /* value of a VAR */ double (*fnctptr)(); /* value of a FNCT */ @} value; struct symrec *next; /* link field */ @}; @end group @group typedef struct symrec symrec; /* The symbol table: a chain of `struct symrec'. */ extern symrec *sym_table; symrec *putsym (); symrec *getsym (); @end group @end smallexample The new version of @code{main} includes a call to @code{init_table}, a function that initializes the symbol table. Here it is, and @code{init_table} as well: @smallexample @group #include main () @{ init_table (); yyparse (); @} @end group @group yyerror (s) /* Called by yyparse on error */ char *s; @{ printf ("%s\n", s); @} struct init @{ char *fname; double (*fnct)(); @}; @end group @group struct init arith_fncts[] = @{ "sin", sin, "cos", cos, "atan", atan, "ln", log, "exp", exp, "sqrt", sqrt, 0, 0 @}; /* The symbol table: a chain of `struct symrec'. */ symrec *sym_table = (symrec *)0; @end group @group init_table () /* puts arithmetic functions in table. */ @{ int i; symrec *ptr; for (i = 0; arith_fncts[i].fname != 0; i++) @{ ptr = putsym (arith_fncts[i].fname, FNCT); ptr->value.fnctptr = arith_fncts[i].fnct; @} @} @end group @end smallexample By simply editing the initialization list and adding the necessary include files, you can add additional functions to the calculator. Two important functions allow look-up and installation of symbols in the symbol table. The function @code{putsym} is passed a name and the type (@code{VAR} or @code{FNCT}) of the object to be installed. The object is linked to the front of the list, and a pointer to the object is returned. The function @code{getsym} is passed the name of the symbol to look up. If found, a pointer to that symbol is returned; otherwise zero is returned. @smallexample symrec * putsym (sym_name,sym_type) char *sym_name; int sym_type; @{ symrec *ptr; ptr = (symrec *) malloc (sizeof (symrec)); ptr->name = (char *) malloc (strlen (sym_name) + 1); strcpy (ptr->name,sym_name); ptr->type = sym_type; ptr->value.var = 0; /* set value to 0 even if fctn. */ ptr->next = (struct symrec *)sym_table; sym_table = ptr; return ptr; @} symrec * getsym (sym_name) char *sym_name; @{ symrec *ptr; for (ptr = sym_table; ptr != (symrec *) 0; ptr = (symrec *)ptr->next) if (strcmp (ptr->name,sym_name) == 0) return ptr; return 0; @} @end smallexample The function @code{yylex} must now recognize variables, numeric values, and the single-character arithmetic operators. Strings of alphanumeric characters with a leading nondigit are recognized as either variables or functions depending on what the symbol table says about them. The string is passed to @code{getsym} for look up in the symbol table. If the name appears in the table, a pointer to its location and its type (@code{VAR} or @code{FNCT}) is returned to @code{yyparse}. If it is not already in the table, then it is installed as a @code{VAR} using @code{putsym}. Again, a pointer and its type (which must be @code{VAR}) is returned to @code{yyparse}.@refill No change is needed in the handling of numeric values and arithmetic operators in @code{yylex}. @smallexample @group #include yylex () @{ int c; /* Ignore whitespace, get first nonwhite character. */ while ((c = getchar ()) == ' ' || c == '\t'); if (c == EOF) return 0; @end group @group /* Char starts a number => parse the number. */ if (c == '.' || isdigit (c)) @{ ungetc (c, stdin); scanf ("%lf", &yylval.val); return NUM; @} @end group @group /* Char starts an identifier => read the name. */ if (isalpha (c)) @{ symrec *s; static char *symbuf = 0; static int length = 0; int i; @end group @group /* Initially make the buffer long enough for a 40-character symbol name. */ if (length == 0) length = 40, symbuf = (char *)malloc (length + 1); i = 0; do @end group @group @{ /* If buffer is full, make it bigger. */ if (i == length) @{ length *= 2; symbuf = (char *)realloc (symbuf, length + 1); @} /* Add this character to the buffer. */ symbuf[i++] = c; /* Get another character. */ c = getchar (); @} @end group @group while (c != EOF && isalnum (c)); ungetc (c, stdin); symbuf[i] = '\0'; @end group @group s = getsym (symbuf); if (s == 0) s = putsym (symbuf, VAR); yylval.tptr = s; return s->type; @} /* Any other character is a token by itself. */ return c; @} @end group @end smallexample This program is both powerful and flexible. You may easily add new functions, and it is a simple job to modify this code to install predefined variables such as @code{pi} or @code{e} as well. @node Exercises, , Multi-function Calc, Examples @section Exercises @cindex exercises @enumerate @item Add some new functions from @file{math.h} to the initialization list. @item Add another array that contains constants and their values. Then modify @code{init_table} to add these constants to the symbol table. It will be easiest to give the constants type @code{VAR}. @item Make the program report an error if the user refers to an uninitialized variable in any way except to store a value in it. @end enumerate @node Grammar File, Interface, Examples, Top @chapter Bison Grammar Files Bison takes as input a context-free grammar specification and produces a C-language function that recognizes correct instances of the grammar. The Bison grammar input file conventionally has a name ending in @samp{.y}. @menu * Grammar Outline:: Overall layout of the grammar file. * Symbols:: Terminal and nonterminal symbols. * Rules:: How to write grammar rules. * Recursion:: Writing recursive rules. * Semantics:: Semantic values and actions. * Declarations:: All kinds of Bison declarations are described here. * Multiple Parsers:: Putting more than one Bison parser in one program. @end menu @node Grammar Outline, Symbols, , Grammar File @section Outline of a Bison Grammar A Bison grammar file has four main sections, shown here with the appropriate delimiters: @example %@{ @var{C declarations} %@} @var{Bison declarations} %% @var{Grammar rules} %% @var{Additional C code} @end example Comments enclosed in @samp{/* @dots{} */} may appear in any of the sections. @menu * C Declarations:: Syntax and usage of the C declarations section. * Bison Declarations:: Syntax and usage of the Bison declarations section. * Grammar Rules:: Syntax and usage of the grammar rules section. * C Code:: Syntax and usage of the additional C code section. @end menu @node C Declarations, Bison Declarations, , Grammar Outline @subsection The C Declarations Section @cindex C declarations section @cindex declarations, C The @var{C declarations} section contains macro definitions and declarations of functions and variables that are used in the actions in the grammar rules. These are copied to the beginning of the parser file so that they precede the definition of @code{yyparse}. You can use @samp{#include} to get the declarations from a header file. If you don't need any C declarations, you may omit the @samp{%@{} and @samp{%@}} delimiters that bracket this section. @node Bison Declarations, Grammar Rules, C Declarations, Grammar Outline @subsection The Bison Declarations Section @cindex Bison declarations (introduction) @cindex declarations, Bison (introduction) The @var{Bison declarations} section contains declarations that define terminal and nonterminal symbols, specify precedence, and so on. In some simple grammars you may not need any declarations. @xref{Declarations, ,Bison Declarations}. @node Grammar Rules, C Code, Bison Declarations, Grammar Outline @subsection The Grammar Rules Section @cindex grammar rules section @cindex rules section for grammar The @dfn{grammar rules} section contains one or more Bison grammar rules, and nothing else. @xref{Rules, ,Syntax of Grammar Rules}. There must always be at least one grammar rule, and the first @samp{%%} (which precedes the grammar rules) may never be omitted even if it is the first thing in the file. @node C Code, , Grammar Rules, Grammar Outline @subsection The Additional C Code Section @cindex additional C code section @cindex C code, section for additional The @var{additional C code} section is copied verbatim to the end of the parser file, just as the @var{C declarations} section is copied to the beginning. This is the most convenient place to put anything that you want to have in the parser file but which need not come before the definition of @code{yyparse}. For example, the definitions of @code{yylex} and @code{yyerror} often go here. @xref{Interface, ,Parser C-Language Interface}. If the last section is empty, you may omit the @samp{%%} that separates it from the grammar rules. The Bison parser itself contains many static variables whose names start with @samp{yy} and many macros whose names start with @samp{YY}. It is a good idea to avoid using any such names (except those documented in this manual) in the additional C code section of the grammar file. @node Symbols, Rules, Grammar Outline, Grammar File @section Symbols, Terminal and Nonterminal @cindex nonterminal symbol @cindex terminal symbol @cindex token type @cindex symbol @dfn{Symbols} in Bison grammars represent the grammatical classifications of the language. A @dfn{terminal symbol} (also known as a @dfn{token type}) represents a class of syntactically equivalent tokens. You use the symbol in grammar rules to mean that a token in that class is allowed. The symbol is represented in the Bison parser by a numeric code, and the @code{yylex} function returns a token type code to indicate what kind of token has been read. You don't need to know what the code value is; you can use the symbol to stand for it. A @dfn{nonterminal symbol} stands for a class of syntactically equivalent groupings. The symbol name is used in writing grammar rules. By convention, it should be all lower case. Symbol names can contain letters, digits (not at the beginning), underscores and periods. Periods make sense only in nonterminals. There are three ways of writing terminal symbols in the grammar: @itemize @bullet @item A @dfn{named token type} is written with an identifier, like an identifier in C. By convention, it should be all upper case. Each such name must be defined with a Bison declaration such as @code{%token}. @xref{Token Decl, ,Token Type Names}. @item @cindex character token @cindex literal token @cindex single-character literal A @dfn{character token type} (or @dfn{literal character token}) is written in the grammar using the same syntax used in C for character constants; for example, @code{'+'} is a character token type. A character token type doesn't need to be declared unless you need to specify its semantic value data type (@pxref{Value Type, ,Data Types of Semantic Values}), associativity, or precedence (@pxref{Precedence, ,Operator Precedence}). By convention, a character token type is used only to represent a token that consists of that particular character. Thus, the token type @code{'+'} is used to represent the character @samp{+} as a token. Nothing enforces this convention, but if you depart from it, your program will confuse other readers. All the usual escape sequences used in character literals in C can be used in Bison as well, but you must not use the null character as a character literal because its ASCII code, zero, is the code @code{yylex} returns for end-of-input (@pxref{Calling Convention, ,Calling Convention for @code{yylex}}). @item @cindex string token @cindex literal string token @cindex multi-character literal A @dfn{literal string token} is written like a C string constant; for example, @code{"<="} is a literal string token. A literal string token doesn't need to be declared unless you need to specify its semantic value data type (@pxref{Value Type}), associativity, precedence (@pxref{Precedence}). You can associate the literal string token with a symbolic name as an alias, using the @code{%token} declaration (@pxref{Token Decl, ,Token Declarations}). If you don't do that, the lexical analyzer has to retrieve the token number for the literal string token from the @code{yytname} table (@pxref{Calling Convention}). @strong{WARNING}: literal string tokens do not work in Yacc. By convention, a literal string token is used only to represent a token that consists of that particular string. Thus, you should use the token type @code{"<="} to represent the string @samp{<=} as a token. Bison does not enforces this convention, but if you depart from it, people who read your program will be confused. All the escape sequences used in string literals in C can be used in Bison as well. A literal string token must contain two or more characters; for a token containing just one character, use a character token (see above). @end itemize How you choose to write a terminal symbol has no effect on its grammatical meaning. That depends only on where it appears in rules and on when the parser function returns that symbol. The value returned by @code{yylex} is always one of the terminal symbols (or 0 for end-of-input). Whichever way you write the token type in the grammar rules, you write it the same way in the definition of @code{yylex}. The numeric code for a character token type is simply the ASCII code for the character, so @code{yylex} can use the identical character constant to generate the requisite code. Each named token type becomes a C macro in the parser file, so @code{yylex} can use the name to stand for the code. (This is why periods don't make sense in terminal symbols.) @xref{Calling Convention, ,Calling Convention for @code{yylex}}. If @code{yylex} is defined in a separate file, you need to arrange for the token-type macro definitions to be available there. Use the @samp{-d} option when you run Bison, so that it will write these macro definitions into a separate header file @file{@var{name}.tab.h} which you can include in the other source files that need it. @xref{Invocation, ,Invoking Bison}. The symbol @code{error} is a terminal symbol reserved for error recovery (@pxref{Error Recovery}); you shouldn't use it for any other purpose. In particular, @code{yylex} should never return this value. @node Rules, Recursion, Symbols, Grammar File @section Syntax of Grammar Rules @cindex rule syntax @cindex grammar rule syntax @cindex syntax of grammar rules A Bison grammar rule has the following general form: @example @group @var{result}: @var{components}@dots{} ; @end group @end example @noindent where @var{result} is the nonterminal symbol that this rule describes and @var{components} are various terminal and nonterminal symbols that are put together by this rule (@pxref{Symbols}). For example, @example @group exp: exp '+' exp ; @end group @end example @noindent says that two groupings of type @code{exp}, with a @samp{+} token in between, can be combined into a larger grouping of type @code{exp}. Whitespace in rules is significant only to separate symbols. You can add extra whitespace as you wish. Scattered among the components can be @var{actions} that determine the semantics of the rule. An action looks like this: @example @{@var{C statements}@} @end example @noindent Usually there is only one action and it follows the components. @xref{Actions}. @findex | Multiple rules for the same @var{result} can be written separately or can be joined with the vertical-bar character @samp{|} as follows: @ifinfo @example @var{result}: @var{rule1-components}@dots{} | @var{rule2-components}@dots{} @dots{} ; @end example @end ifinfo @iftex @example @group @var{result}: @var{rule1-components}@dots{} | @var{rule2-components}@dots{} @dots{} ; @end group @end example @end iftex @noindent They are still considered distinct rules even when joined in this way. If @var{components} in a rule is empty, it means that @var{result} can match the empty string. For example, here is how to define a comma-separated sequence of zero or more @code{exp} groupings: @example @group expseq: /* empty */ | expseq1 ; @end group @group expseq1: exp | expseq1 ',' exp ; @end group @end example @noindent It is customary to write a comment @samp{/* empty */} in each rule with no components. @node Recursion, Semantics, Rules, Grammar File @section Recursive Rules @cindex recursive rule A rule is called @dfn{recursive} when its @var{result} nonterminal appears also on its right hand side. Nearly all Bison grammars need to use recursion, because that is the only way to define a sequence of any number of somethings. Consider this recursive definition of a comma-separated sequence of one or more expressions: @example @group expseq1: exp | expseq1 ',' exp ; @end group @end example @cindex left recursion @cindex right recursion @noindent Since the recursive use of @code{expseq1} is the leftmost symbol in the right hand side, we call this @dfn{left recursion}. By contrast, here the same construct is defined using @dfn{right recursion}: @example @group expseq1: exp | exp ',' expseq1 ; @end group @end example @noindent Any kind of sequence can be defined using either left recursion or right recursion, but you should always use left recursion, because it can parse a sequence of any number of elements with bounded stack space. Right recursion uses up space on the Bison stack in proportion to the number of elements in the sequence, because all the elements must be shifted onto the stack before the rule can be applied even once. @xref{Algorithm, ,The Bison Parser Algorithm }, for further explanation of this. @cindex mutual recursion @dfn{Indirect} or @dfn{mutual} recursion occurs when the result of the rule does not appear directly on its right hand side, but does appear in rules for other nonterminals which do appear on its right hand side. For example: @example @group expr: primary | primary '+' primary ; @end group @group primary: constant | '(' expr ')' ; @end group @end example @noindent defines two mutually-recursive nonterminals, since each refers to the other. @node Semantics, Declarations, Recursion, Grammar File @section Defining Language Semantics @cindex defining language semantics @cindex language semantics, defining The grammar rules for a language determine only the syntax. The semantics are determined by the semantic values associated with various tokens and groupings, and by the actions taken when various groupings are recognized. For example, the calculator calculates properly because the value associated with each expression is the proper number; it adds properly because the action for the grouping @w{@samp{@var{x} + @var{y}}} is to add the numbers associated with @var{x} and @var{y}. @menu * Value Type:: Specifying one data type for all semantic values. * Multiple Types:: Specifying several alternative data types. * Actions:: An action is the semantic definition of a grammar rule. * Action Types:: Specifying data types for actions to operate on. * Mid-Rule Actions:: Most actions go at the end of a rule. This says when, why and how to use the exceptional action in the middle of a rule. @end menu @node Value Type, Multiple Types, , Semantics @subsection Data Types of Semantic Values @cindex semantic value type @cindex value type, semantic @cindex data types of semantic values @cindex default data type In a simple program it may be sufficient to use the same data type for the semantic values of all language constructs. This was true in the RPN and infix calculator examples (@pxref{RPN Calc, ,Reverse Polish Notation Calculator}). Bison's default is to use type @code{int} for all semantic values. To specify some other type, define @code{YYSTYPE} as a macro, like this: @example #define YYSTYPE double @end example @noindent This macro definition must go in the C declarations section of the grammar file (@pxref{Grammar Outline, ,Outline of a Bison Grammar}). @node Multiple Types, Actions, Value Type, Semantics @subsection More Than One Value Type In most programs, you will need different data types for different kinds of tokens and groupings. For example, a numeric constant may need type @code{int} or @code{long}, while a string constant needs type @code{char *}, and an identifier might need a pointer to an entry in the symbol table. To use more than one data type for semantic values in one parser, Bison requires you to do two things: @itemize @bullet @item Specify the entire collection of possible data types, with the @code{%union} Bison declaration (@pxref{Union Decl, ,The Collection of Value Types}). @item Choose one of those types for each symbol (terminal or nonterminal) for which semantic values are used. This is done for tokens with the @code{%token} Bison declaration (@pxref{Token Decl, ,Token Type Names}) and for groupings with the @code{%type} Bison declaration (@pxref{Type Decl, ,Nonterminal Symbols}). @end itemize @node Actions, Action Types, Multiple Types, Semantics @subsection Actions @cindex action @vindex $$ @vindex $@var{n} An action accompanies a syntactic rule and contains C code to be executed each time an instance of that rule is recognized. The task of most actions is to compute a semantic value for the grouping built by the rule from the semantic values associated with tokens or smaller groupings. An action consists of C statements surrounded by braces, much like a compound statement in C. It can be placed at any position in the rule; it is executed at that position. Most rules have just one action at the end of the rule, following all the components. Actions in the middle of a rule are tricky and used only for special purposes (@pxref{Mid-Rule Actions, ,Actions in Mid-Rule}). The C code in an action can refer to the semantic values of the components matched by the rule with the construct @code{$@var{n}}, which stands for the value of the @var{n}th component. The semantic value for the grouping being constructed is @code{$$}. (Bison translates both of these constructs into array element references when it copies the actions into the parser file.) Here is a typical example: @example @group exp: @dots{} | exp '+' exp @{ $$ = $1 + $3; @} @end group @end example @noindent This rule constructs an @code{exp} from two smaller @code{exp} groupings connected by a plus-sign token. In the action, @code{$1} and @code{$3} refer to the semantic values of the two component @code{exp} groupings, which are the first and third symbols on the right hand side of the rule. The sum is stored into @code{$$} so that it becomes the semantic value of the addition-expression just recognized by the rule. If there were a useful semantic value associated with the @samp{+} token, it could be referred to as @code{$2}.@refill @cindex default action If you don't specify an action for a rule, Bison supplies a default: @w{@code{$$ = $1}.} Thus, the value of the first symbol in the rule becomes the value of the whole rule. Of course, the default rule is valid only if the two data types match. There is no meaningful default action for an empty rule; every empty rule must have an explicit action unless the rule's value does not matter. @code{$@var{n}} with @var{n} zero or negative is allowed for reference to tokens and groupings on the stack @emph{before} those that match the current rule. This is a very risky practice, and to use it reliably you must be certain of the context in which the rule is applied. Here is a case in which you can use this reliably: @example @group foo: expr bar '+' expr @{ @dots{} @} | expr bar '-' expr @{ @dots{} @} ; @end group @group bar: /* empty */ @{ previous_expr = $0; @} ; @end group @end example As long as @code{bar} is used only in the fashion shown here, @code{$0} always refers to the @code{expr} which precedes @code{bar} in the definition of @code{foo}. @node Action Types, Mid-Rule Actions, Actions, Semantics @subsection Data Types of Values in Actions @cindex action data types @cindex data types in actions If you have chosen a single data type for semantic values, the @code{$$} and @code{$@var{n}} constructs always have that data type. If you have used @code{%union} to specify a variety of data types, then you must declare a choice among these types for each terminal or nonterminal symbol that can have a semantic value. Then each time you use @code{$$} or @code{$@var{n}}, its data type is determined by which symbol it refers to in the rule. In this example,@refill @example @group exp: @dots{} | exp '+' exp @{ $$ = $1 + $3; @} @end group @end example @noindent @code{$1} and @code{$3} refer to instances of @code{exp}, so they all have the data type declared for the nonterminal symbol @code{exp}. If @code{$2} were used, it would have the data type declared for the terminal symbol @code{'+'}, whatever that might be.@refill Alternatively, you can specify the data type when you refer to the value, by inserting @samp{<@var{type}>} after the @samp{$} at the beginning of the reference. For example, if you have defined types as shown here: @example @group %union @{ int itype; double dtype; @} @end group @end example @noindent then you can write @code{$1} to refer to the first subunit of the rule as an integer, or @code{$1} to refer to it as a double. @node Mid-Rule Actions, , Action Types, Semantics @subsection Actions in Mid-Rule @cindex actions in mid-rule @cindex mid-rule actions Occasionally it is useful to put an action in the middle of a rule. These actions are written just like usual end-of-rule actions, but they are executed before the parser even recognizes the following components. A mid-rule action may refer to the components preceding it using @code{$@var{n}}, but it may not refer to subsequent components because it is run before they are parsed. The mid-rule action itself counts as one of the components of the rule. This makes a difference when there is another action later in the same rule (and usually there is another at the end): you have to count the actions along with the symbols when working out which number @var{n} to use in @code{$@var{n}}. The mid-rule action can also have a semantic value. The action can set its value with an assignment to @code{$$}, and actions later in the rule can refer to the value using @code{$@var{n}}. Since there is no symbol to name the action, there is no way to declare a data type for the value in advance, so you must use the @samp{$<@dots{}>} construct to specify a data type each time you refer to this value. There is no way to set the value of the entire rule with a mid-rule action, because assignments to @code{$$} do not have that effect. The only way to set the value for the entire rule is with an ordinary action at the end of the rule. Here is an example from a hypothetical compiler, handling a @code{let} statement that looks like @samp{let (@var{variable}) @var{statement}} and serves to create a variable named @var{variable} temporarily for the duration of @var{statement}. To parse this construct, we must put @var{variable} into the symbol table while @var{statement} is parsed, then remove it afterward. Here is how it is done: @example @group stmt: LET '(' var ')' @{ $$ = push_context (); declare_variable ($3); @} stmt @{ $$ = $6; pop_context ($5); @} @end group @end example @noindent As soon as @samp{let (@var{variable})} has been recognized, the first action is run. It saves a copy of the current semantic context (the list of accessible variables) as its semantic value, using alternative @code{context} in the data-type union. Then it calls @code{declare_variable} to add the new variable to that list. Once the first action is finished, the embedded statement @code{stmt} can be parsed. Note that the mid-rule action is component number 5, so the @samp{stmt} is component number 6. After the embedded statement is parsed, its semantic value becomes the value of the entire @code{let}-statement. Then the semantic value from the earlier action is used to restore the prior list of variables. This removes the temporary @code{let}-variable from the list so that it won't appear to exist while the rest of the program is parsed. Taking action before a rule is completely recognized often leads to conflicts since the parser must commit to a parse in order to execute the action. For example, the following two rules, without mid-rule actions, can coexist in a working parser because the parser can shift the open-brace token and look at what follows before deciding whether there is a declaration or not: @example @group compound: '@{' declarations statements '@}' | '@{' statements '@}' ; @end group @end example @noindent But when we add a mid-rule action as follows, the rules become nonfunctional: @example @group compound: @{ prepare_for_local_variables (); @} '@{' declarations statements '@}' @end group @group | '@{' statements '@}' ; @end group @end example @noindent Now the parser is forced to decide whether to run the mid-rule action when it has read no farther than the open-brace. In other words, it must commit to using one rule or the other, without sufficient information to do it correctly. (The open-brace token is what is called the @dfn{look-ahead} token at this time, since the parser is still deciding what to do about it. @xref{Look-Ahead, ,Look-Ahead Tokens}.) You might think that you could correct the problem by putting identical actions into the two rules, like this: @example @group compound: @{ prepare_for_local_variables (); @} '@{' declarations statements '@}' | @{ prepare_for_local_variables (); @} '@{' statements '@}' ; @end group @end example @noindent But this does not help, because Bison does not realize that the two actions are identical. (Bison never tries to understand the C code in an action.) If the grammar is such that a declaration can be distinguished from a statement by the first token (which is true in C), then one solution which does work is to put the action after the open-brace, like this: @example @group compound: '@{' @{ prepare_for_local_variables (); @} declarations statements '@}' | '@{' statements '@}' ; @end group @end example @noindent Now the first token of the following declaration or statement, which would in any case tell Bison which rule to use, can still do so. Another solution is to bury the action inside a nonterminal symbol which serves as a subroutine: @example @group subroutine: /* empty */ @{ prepare_for_local_variables (); @} ; @end group @group compound: subroutine '@{' declarations statements '@}' | subroutine '@{' statements '@}' ; @end group @end example @noindent Now Bison can execute the action in the rule for @code{subroutine} without deciding which rule for @code{compound} it will eventually use. Note that the action is now at the end of its rule. Any mid-rule action can be converted to an end-of-rule action in this way, and this is what Bison actually does to implement mid-rule actions. @node Declarations, Multiple Parsers, Semantics, Grammar File @section Bison Declarations @cindex declarations, Bison @cindex Bison declarations The @dfn{Bison declarations} section of a Bison grammar defines the symbols used in formulating the grammar and the data types of semantic values. @xref{Symbols}. All token type names (but not single-character literal tokens such as @code{'+'} and @code{'*'}) must be declared. Nonterminal symbols must be declared if you need to specify which data type to use for the semantic value (@pxref{Multiple Types, ,More Than One Value Type}). The first rule in the file also specifies the start symbol, by default. If you want some other symbol to be the start symbol, you must declare it explicitly (@pxref{Language and Grammar, ,Languages and Context-Free Grammars}). @menu * Token Decl:: Declaring terminal symbols. * Precedence Decl:: Declaring terminals with precedence and associativity. * Union Decl:: Declaring the set of all semantic value types. * Type Decl:: Declaring the choice of type for a nonterminal symbol. * Expect Decl:: Suppressing warnings about shift/reduce conflicts. * Start Decl:: Specifying the start symbol. * Pure Decl:: Requesting a reentrant parser. * Decl Summary:: Table of all Bison declarations. @end menu @node Token Decl, Precedence Decl, , Declarations @subsection Token Type Names @cindex declaring token type names @cindex token type names, declaring @cindex declaring literal string tokens @findex %token The basic way to declare a token type name (terminal symbol) is as follows: @example %token @var{name} @end example Bison will convert this into a @code{#define} directive in the parser, so that the function @code{yylex} (if it is in this file) can use the name @var{name} to stand for this token type's code. Alternatively, you can use @code{%left}, @code{%right}, or @code{%nonassoc} instead of @code{%token}, if you wish to specify precedence. @xref{Precedence Decl, ,Operator Precedence}. You can explicitly specify the numeric code for a token type by appending an integer value in the field immediately following the token name: @example %token NUM 300 @end example @noindent It is generally best, however, to let Bison choose the numeric codes for all token types. Bison will automatically select codes that don't conflict with each other or with ASCII characters. In the event that the stack type is a union, you must augment the @code{%token} or other token declaration to include the data type alternative delimited by angle-brackets (@pxref{Multiple Types, ,More Than One Value Type}). For example: @example @group %union @{ /* define stack type */ double val; symrec *tptr; @} %token NUM /* define token NUM and its type */ @end group @end example You can associate a literal string token with a token type name by writing the literal string at the end of a @code{%token} declaration which declares the name. For example: @example %token arrow "=>" @end example @noindent For example, a grammar for the C language might specify these names with equivalent literal string tokens: @example %token OR "||" %token LE 134 "<=" %left OR "<=" @end example @noindent Once you equate the literal string and the token name, you can use them interchangeably in further declarations or the grammar rules. The @code{yylex} function can use the token name or the literal string to obtain the token type code number (@pxref{Calling Convention}). @node Precedence Decl, Union Decl, Token Decl, Declarations @subsection Operator Precedence @cindex precedence declarations @cindex declaring operator precedence @cindex operator precedence, declaring Use the @code{%left}, @code{%right} or @code{%nonassoc} declaration to declare a token and specify its precedence and associativity, all at once. These are called @dfn{precedence declarations}. @xref{Precedence, ,Operator Precedence}, for general information on operator precedence. The syntax of a precedence declaration is the same as that of @code{%token}: either @example %left @var{symbols}@dots{} @end example @noindent or @example %left <@var{type}> @var{symbols}@dots{} @end example And indeed any of these declarations serves the purposes of @code{%token}. But in addition, they specify the associativity and relative precedence for all the @var{symbols}: @itemize @bullet @item The associativity of an operator @var{op} determines how repeated uses of the operator nest: whether @samp{@var{x} @var{op} @var{y} @var{op} @var{z}} is parsed by grouping @var{x} with @var{y} first or by grouping @var{y} with @var{z} first. @code{%left} specifies left-associativity (grouping @var{x} with @var{y} first) and @code{%right} specifies right-associativity (grouping @var{y} with @var{z} first). @code{%nonassoc} specifies no associativity, which means that @samp{@var{x} @var{op} @var{y} @var{op} @var{z}} is considered a syntax error. @item The precedence of an operator determines how it nests with other operators. All the tokens declared in a single precedence declaration have equal precedence and nest together according to their associativity. When two tokens declared in different precedence declarations associate, the one declared later has the higher precedence and is grouped first. @end itemize @node Union Decl, Type Decl, Precedence Decl, Declarations @subsection The Collection of Value Types @cindex declaring value types @cindex value types, declaring @findex %union The @code{%union} declaration specifies the entire collection of possible data types for semantic values. The keyword @code{%union} is followed by a pair of braces containing the same thing that goes inside a @code{union} in C. For example: @example @group %union @{ double val; symrec *tptr; @} @end group @end example @noindent This says that the two alternative types are @code{double} and @code{symrec *}. They are given names @code{val} and @code{tptr}; these names are used in the @code{%token} and @code{%type} declarations to pick one of the types for a terminal or nonterminal symbol (@pxref{Type Decl, ,Nonterminal Symbols}). Note that, unlike making a @code{union} declaration in C, you do not write a semicolon after the closing brace. @node Type Decl, Expect Decl, Union Decl, Declarations @subsection Nonterminal Symbols @cindex declaring value types, nonterminals @cindex value types, nonterminals, declaring @findex %type @noindent When you use @code{%union} to specify multiple value types, you must declare the value type of each nonterminal symbol for which values are used. This is done with a @code{%type} declaration, like this: @example %type <@var{type}> @var{nonterminal}@dots{} @end example @noindent Here @var{nonterminal} is the name of a nonterminal symbol, and @var{type} is the name given in the @code{%union} to the alternative that you want (@pxref{Union Decl, ,The Collection of Value Types}). You can give any number of nonterminal symbols in the same @code{%type} declaration, if they have the same value type. Use spaces to separate the symbol names. You can also declare the value type of a terminal symbol. To do this, use the same @code{<@var{type}>} construction in a declaration for the terminal symbol. All kinds of token declarations allow @code{<@var{type}>}. @node Expect Decl, Start Decl, Type Decl, Declarations @subsection Suppressing Conflict Warnings @cindex suppressing conflict warnings @cindex preventing warnings about conflicts @cindex warnings, preventing @cindex conflicts, suppressing warnings of @findex %expect Bison normally warns if there are any conflicts in the grammar (@pxref{Shift/Reduce, ,Shift/Reduce Conflicts}), but most real grammars have harmless shift/reduce conflicts which are resolved in a predictable way and would be difficult to eliminate. It is desirable to suppress the warning about these conflicts unless the number of conflicts changes. You can do this with the @code{%expect} declaration. The declaration looks like this: @example %expect @var{n} @end example Here @var{n} is a decimal integer. The declaration says there should be no warning if there are @var{n} shift/reduce conflicts and no reduce/reduce conflicts. The usual warning is given if there are either more or fewer conflicts, or if there are any reduce/reduce conflicts. In general, using @code{%expect} involves these steps: @itemize @bullet @item Compile your grammar without @code{%expect}. Use the @samp{-v} option to get a verbose list of where the conflicts occur. Bison will also print the number of conflicts. @item Check each of the conflicts to make sure that Bison's default resolution is what you really want. If not, rewrite the grammar and go back to the beginning. @item Add an @code{%expect} declaration, copying the number @var{n} from the number which Bison printed. @end itemize Now Bison will stop annoying you about the conflicts you have checked, but it will warn you again if changes in the grammar result in additional conflicts. @node Start Decl, Pure Decl, Expect Decl, Declarations @subsection The Start-Symbol @cindex declaring the start symbol @cindex start symbol, declaring @cindex default start symbol @findex %start Bison assumes by default that the start symbol for the grammar is the first nonterminal specified in the grammar specification section. The programmer may override this restriction with the @code{%start} declaration as follows: @example %start @var{symbol} @end example @node Pure Decl, Decl Summary, Start Decl, Declarations @subsection A Pure (Reentrant) Parser @cindex reentrant parser @cindex pure parser @findex %pure_parser A @dfn{reentrant} program is one which does not alter in the course of execution; in other words, it consists entirely of @dfn{pure} (read-only) code. Reentrancy is important whenever asynchronous execution is possible; for example, a nonreentrant program may not be safe to call from a signal handler. In systems with multiple threads of control, a nonreentrant program must be called only within interlocks. Normally, Bison generates a parser which is not reentrant. This is suitable for most uses, and it permits compatibility with YACC. (The standard YACC interfaces are inherently nonreentrant, because they use statically allocated variables for communication with @code{yylex}, including @code{yylval} and @code{yylloc}.) Alternatively, you can generate a pure, reentrant parser. The Bison declaration @code{%pure_parser} says that you want the parser to be reentrant. It looks like this: @example %pure_parser @end example The result is that the communication variables @code{yylval} and @code{yylloc} become local variables in @code{yyparse}, and a different calling convention is used for the lexical analyzer function @code{yylex}. @xref{Pure Calling, ,Calling Conventions for Pure Parsers}, for the details of this. The variable @code{yynerrs} also becomes local in @code{yyparse} (@pxref{Error Reporting, ,The Error Reporting Function @code{yyerror}}). The convention for calling @code{yyparse} itself is unchanged. Whether the parser is pure has nothing to do with the grammar rules. You can generate either a pure parser or a nonreentrant parser from any valid grammar. @node Decl Summary, , Pure Decl, Declarations @subsection Bison Declaration Summary @cindex Bison declaration summary @cindex declaration summary @cindex summary, Bison declaration Here is a summary of all Bison declarations: @table @code @item %union Declare the collection of data types that semantic values may have (@pxref{Union Decl, ,The Collection of Value Types}). @item %token Declare a terminal symbol (token type name) with no precedence or associativity specified (@pxref{Token Decl, ,Token Type Names}). @item %right Declare a terminal symbol (token type name) that is right-associative (@pxref{Precedence Decl, ,Operator Precedence}). @item %left Declare a terminal symbol (token type name) that is left-associative (@pxref{Precedence Decl, ,Operator Precedence}). @item %nonassoc Declare a terminal symbol (token type name) that is nonassociative (using it in a way that would be associative is a syntax error) (@pxref{Precedence Decl, ,Operator Precedence}). @item %type Declare the type of semantic values for a nonterminal symbol (@pxref{Type Decl, ,Nonterminal Symbols}). @item %start Specify the grammar's start symbol (@pxref{Start Decl, ,The Start-Symbol}). @item %expect Declare the expected number of shift-reduce conflicts (@pxref{Expect Decl, ,Suppressing Conflict Warnings}). @item %pure_parser Request a pure (reentrant) parser program (@pxref{Pure Decl, ,A Pure (Reentrant) Parser}). @item %no_lines Don't generate any @code{#line} preprocessor commands in the parser file. Ordinarily Bison writes these commands in the parser file so that the C compiler and debuggers will associate errors and object code with your source file (the grammar file). This directive causes them to associate errors with the parser file, treating it an independent source file in its own right. @item %raw The output file @file{@var{name}.h} normally defines the tokens with Yacc-compatible token numbers. If this option is specified, the internal Bison numbers are used instead. (Yacc-compatible numbers start at 257 except for single character tokens; Bison assigns token numbers sequentially for all tokens starting at 3.) @item %token_table Generate an array of token names in the parser file. The name of the array is @code{yytname}; @code{yytname[@var{i}]} is the name of the token whose internal Bison token code number is @var{i}. The first three elements of @code{yytname} are always @code{"$"}, @code{"error"}, and @code{"$illegal"}; after these come the symbols defined in the grammar file. For single-character literal tokens and literal string tokens, the name in the table includes the single-quote or double-quote characters: for example, @code{"'+'"} is a single-character literal and @code{"\"<=\""} is a literal string token. All the characters of the literal string token appear verbatim in the string found in the table; even double-quote characters are not escaped. For example, if the token consists of three characters @samp{*"*}, its string in @code{yytname} contains @samp{"*"*"}. (In C, that would be written as @code{"\"*\"*\""}). When you specify @code{%token_table}, Bison also generates macro definitions for macros @code{YYNTOKENS}, @code{YYNNTS}, and @code{YYNRULES}, and @code{YYNSTATES}: @table @code @item YYNTOKENS The highest token number, plus one. @item YYNNTS The number of non-terminal symbols. @item YYNRULES The number of grammar rules, @item YYNSTATES The number of parser states (@pxref{Parser States}). @end table @end table @node Multiple Parsers,, Declarations, Grammar File @section Multiple Parsers in the Same Program Most programs that use Bison parse only one language and therefore contain only one Bison parser. But what if you want to parse more than one language with the same program? Then you need to avoid a name conflict between different definitions of @code{yyparse}, @code{yylval}, and so on. The easy way to do this is to use the option @samp{-p @var{prefix}} (@pxref{Invocation, ,Invoking Bison}). This renames the interface functions and variables of the Bison parser to start with @var{prefix} instead of @samp{yy}. You can use this to give each parser distinct names that do not conflict. The precise list of symbols renamed is @code{yyparse}, @code{yylex}, @code{yyerror}, @code{yynerrs}, @code{yylval}, @code{yychar} and @code{yydebug}. For example, if you use @samp{-p c}, the names become @code{cparse}, @code{clex}, and so on. @strong{All the other variables and macros associated with Bison are not renamed.} These others are not global; there is no conflict if the same name is used in different parsers. For example, @code{YYSTYPE} is not renamed, but defining this in different ways in different parsers causes no trouble (@pxref{Value Type, ,Data Types of Semantic Values}). The @samp{-p} option works by adding macro definitions to the beginning of the parser source file, defining @code{yyparse} as @code{@var{prefix}parse}, and so on. This effectively substitutes one name for the other in the entire parser file. @node Interface, Algorithm, Grammar File, Top @chapter Parser C-Language Interface @cindex C-language interface @cindex interface The Bison parser is actually a C function named @code{yyparse}. Here we describe the interface conventions of @code{yyparse} and the other functions that it needs to use. Keep in mind that the parser uses many C identifiers starting with @samp{yy} and @samp{YY} for internal purposes. If you use such an identifier (aside from those in this manual) in an action or in additional C code in the grammar file, you are likely to run into trouble. @menu * Parser Function:: How to call @code{yyparse} and what it returns. * Lexical:: You must supply a function @code{yylex} which reads tokens. * Error Reporting:: You must supply a function @code{yyerror}. * Action Features:: Special features for use in actions. @end menu @node Parser Function, Lexical, , Interface @section The Parser Function @code{yyparse} @findex yyparse You call the function @code{yyparse} to cause parsing to occur. This function reads tokens, executes actions, and ultimately returns when it encounters end-of-input or an unrecoverable syntax error. You can also write an action which directs @code{yyparse} to return immediately without reading further. The value returned by @code{yyparse} is 0 if parsing was successful (return is due to end-of-input). The value is 1 if parsing failed (return is due to a syntax error). In an action, you can cause immediate return from @code{yyparse} by using these macros: @table @code @item YYACCEPT @findex YYACCEPT Return immediately with value 0 (to report success). @item YYABORT @findex YYABORT Return immediately with value 1 (to report failure). @end table @node Lexical, Error Reporting, Parser Function, Interface @section The Lexical Analyzer Function @code{yylex} @findex yylex @cindex lexical analyzer The @dfn{lexical analyzer} function, @code{yylex}, recognizes tokens from the input stream and returns them to the parser. Bison does not create this function automatically; you must write it so that @code{yyparse} can call it. The function is sometimes referred to as a lexical scanner. In simple programs, @code{yylex} is often defined at the end of the Bison grammar file. If @code{yylex} is defined in a separate source file, you need to arrange for the token-type macro definitions to be available there. To do this, use the @samp{-d} option when you run Bison, so that it will write these macro definitions into a separate header file @file{@var{name}.tab.h} which you can include in the other source files that need it. @xref{Invocation, ,Invoking Bison}.@refill @menu * Calling Convention:: How @code{yyparse} calls @code{yylex}. * Token Values:: How @code{yylex} must return the semantic value of the token it has read. * Token Positions:: How @code{yylex} must return the text position (line number, etc.) of the token, if the actions want that. * Pure Calling:: How the calling convention differs in a pure parser (@pxref{Pure Decl, ,A Pure (Reentrant) Parser}). @end menu @node Calling Convention, Token Values, , Lexical @subsection Calling Convention for @code{yylex} The value that @code{yylex} returns must be the numeric code for the type of token it has just found, or 0 for end-of-input. When a token is referred to in the grammar rules by a name, that name in the parser file becomes a C macro whose definition is the proper numeric code for that token type. So @code{yylex} can use the name to indicate that type. @xref{Symbols}. When a token is referred to in the grammar rules by a character literal, the numeric code for that character is also the code for the token type. So @code{yylex} can simply return that character code. The null character must not be used this way, because its code is zero and that is what signifies end-of-input. Here is an example showing these things: @example yylex () @{ @dots{} if (c == EOF) /* Detect end of file. */ return 0; @dots{} if (c == '+' || c == '-') return c; /* Assume token type for `+' is '+'. */ @dots{} return INT; /* Return the type of the token. */ @dots{} @} @end example @noindent This interface has been designed so that the output from the @code{lex} utility can be used without change as the definition of @code{yylex}. If the grammar uses literal string tokens, there are two ways that @code{yylex} can determine the token type codes for them: @itemize @bullet @item If the grammar defines symbolic token names as aliases for the literal string tokens, @code{yylex} can use these symbolic names like all others. In this case, the use of the literal string tokens in the grammar file has no effect on @code{yylex}. @item @code{yylex} can find the multi-character token in the @code{yytname} table. The index of the token in the table is the token type's code. The name of a multi-character token is recorded in @code{yytname} with a double-quote, the token's characters, and another double-quote. The token's characters are not escaped in any way; they appear verbatim in the contents of the string in the table. Here's code for looking up a token in @code{yytname}, assuming that the characters of the token are stored in @code{token_buffer}. @smallexample for (i = 0; i < YYNTOKENS; i++) @{ if (yytname[i] != 0 && yytname[i][0] == '"' && strncmp (yytname[i] + 1, token_buffer, strlen (token_buffer)) && yytname[i][strlen (token_buffer) + 1] == '"' && yytname[i][strlen (token_buffer) + 2] == 0) break; @} @end smallexample The @code{yytname} table is generated only if you use the @code{%token_table} declaration. @xref{Decl Summary}. @end itemize @node Token Values, Token Positions, Calling Convention, Lexical @subsection Semantic Values of Tokens @vindex yylval In an ordinary (nonreentrant) parser, the semantic value of the token must be stored into the global variable @code{yylval}. When you are using just one data type for semantic values, @code{yylval} has that type. Thus, if the type is @code{int} (the default), you might write this in @code{yylex}: @example @group @dots{} yylval = value; /* Put value onto Bison stack. */ return INT; /* Return the type of the token. */ @dots{} @end group @end example When you are using multiple data types, @code{yylval}'s type is a union made from the @code{%union} declaration (@pxref{Union Decl, ,The Collection of Value Types}). So when you store a token's value, you must use the proper member of the union. If the @code{%union} declaration looks like this: @example @group %union @{ int intval; double val; symrec *tptr; @} @end group @end example @noindent then the code in @code{yylex} might look like this: @example @group @dots{} yylval.intval = value; /* Put value onto Bison stack. */ return INT; /* Return the type of the token. */ @dots{} @end group @end example @node Token Positions, Pure Calling, Token Values, Lexical @subsection Textual Positions of Tokens @vindex yylloc If you are using the @samp{@@@var{n}}-feature (@pxref{Action Features, ,Special Features for Use in Actions}) in actions to keep track of the textual locations of tokens and groupings, then you must provide this information in @code{yylex}. The function @code{yyparse} expects to find the textual location of a token just parsed in the global variable @code{yylloc}. So @code{yylex} must store the proper data in that variable. The value of @code{yylloc} is a structure and you need only initialize the members that are going to be used by the actions. The four members are called @code{first_line}, @code{first_column}, @code{last_line} and @code{last_column}. Note that the use of this feature makes the parser noticeably slower. @tindex YYLTYPE The data type of @code{yylloc} has the name @code{YYLTYPE}. @node Pure Calling, , Token Positions, Lexical @subsection Calling Conventions for Pure Parsers When you use the Bison declaration @code{%pure_parser} to request a pure, reentrant parser, the global communication variables @code{yylval} and @code{yylloc} cannot be used. (@xref{Pure Decl, ,A Pure (Reentrant) Parser}.) In such parsers the two global variables are replaced by pointers passed as arguments to @code{yylex}. You must declare them as shown here, and pass the information back by storing it through those pointers. @example yylex (lvalp, llocp) YYSTYPE *lvalp; YYLTYPE *llocp; @{ @dots{} *lvalp = value; /* Put value onto Bison stack. */ return INT; /* Return the type of the token. */ @dots{} @} @end example If the grammar file does not use the @samp{@@} constructs to refer to textual positions, then the type @code{YYLTYPE} will not be defined. In this case, omit the second argument; @code{yylex} will be called with only one argument. @vindex YYPARSE_PARAM If you use a reentrant parser, you can optionally pass additional parameter information to it in a reentrant way. To do so, define the macro @code{YYPARSE_PARAM} as a variable name. This modifies the @code{yyparse} function to accept one argument, of type @code{void *}, with that name. When you call @code{yyparse}, pass the address of an object, casting the address to @code{void *}. The grammar actions can refer to the contents of the object by casting the pointer value back to its proper type and then dereferencing it. Here's an example. Write this in the parser: @example %@{ struct parser_control @{ int nastiness; int randomness; @}; #define YYPARSE_PARAM parm %@} @end example @noindent Then call the parser like this: @example struct parser_control @{ int nastiness; int randomness; @}; @dots{} @{ struct parser_control foo; @dots{} /* @r{Store proper data in @code{foo}.} */ value = yyparse ((void *) &foo); @dots{} @} @end example @noindent In the grammar actions, use expressions like this to refer to the data: @example ((struct parser_control *) parm)->randomness @end example @vindex YYLEX_PARAM If you wish to pass the additional parameter data to @code{yylex}, define the macro @code{YYLEX_PARAM} just like @code{YYPARSE_PARAM}, as shown here: @example %@{ struct parser_control @{ int nastiness; int randomness; @}; #define YYPARSE_PARAM parm #define YYLEX_PARAM parm %@} @end example You should then define @code{yylex} to accept one additional argument---the value of @code{parm}. (This makes either two or three arguments in total, depending on whether an argument of type @code{YYLTYPE} is passed.) You can declare the argument as a pointer to the proper object type, or you can declare it as @code{void *} and access the contents as shown above. You can use @samp{%pure_parser} to request a reentrant parser without also using @code{YYPARSE_PARAM}. Then you should call @code{yyparse} with no arguments, as usual. @node Error Reporting, Action Features, Lexical, Interface @section The Error Reporting Function @code{yyerror} @cindex error reporting function @findex yyerror @cindex parse error @cindex syntax error The Bison parser detects a @dfn{parse error} or @dfn{syntax error} whenever it reads a token which cannot satisfy any syntax rule. A action in the grammar can also explicitly proclaim an error, using the macro @code{YYERROR} (@pxref{Action Features, ,Special Features for Use in Actions}). The Bison parser expects to report the error by calling an error reporting function named @code{yyerror}, which you must supply. It is called by @code{yyparse} whenever a syntax error is found, and it receives one argument. For a parse error, the string is normally @w{@code{"parse error"}}. @findex YYERROR_VERBOSE If you define the macro @code{YYERROR_VERBOSE} in the Bison declarations section (@pxref{Bison Declarations, ,The Bison Declarations Section}), then Bison provides a more verbose and specific error message string instead of just plain @w{@code{"parse error"}}. It doesn't matter what definition you use for @code{YYERROR_VERBOSE}, just whether you define it. The parser can detect one other kind of error: stack overflow. This happens when the input contains constructions that are very deeply nested. It isn't likely you will encounter this, since the Bison parser extends its stack automatically up to a very large limit. But if overflow happens, @code{yyparse} calls @code{yyerror} in the usual fashion, except that the argument string is @w{@code{"parser stack overflow"}}. The following definition suffices in simple programs: @example @group yyerror (s) char *s; @{ @end group @group fprintf (stderr, "%s\n", s); @} @end group @end example After @code{yyerror} returns to @code{yyparse}, the latter will attempt error recovery if you have written suitable error recovery grammar rules (@pxref{Error Recovery}). If recovery is impossible, @code{yyparse} will immediately return 1. @vindex yynerrs The variable @code{yynerrs} contains the number of syntax errors encountered so far. Normally this variable is global; but if you request a pure parser (@pxref{Pure Decl, ,A Pure (Reentrant) Parser}) then it is a local variable which only the actions can access. @node Action Features, , Error Reporting, Interface @section Special Features for Use in Actions @cindex summary, action features @cindex action features summary Here is a table of Bison constructs, variables and macros that are useful in actions. @table @samp @item $$ Acts like a variable that contains the semantic value for the grouping made by the current rule. @xref{Actions}. @item $@var{n} Acts like a variable that contains the semantic value for the @var{n}th component of the current rule. @xref{Actions}. @item $<@var{typealt}>$ Like @code{$$} but specifies alternative @var{typealt} in the union specified by the @code{%union} declaration. @xref{Action Types, ,Data Types of Values in Actions}. @item $<@var{typealt}>@var{n} Like @code{$@var{n}} but specifies alternative @var{typealt} in the union specified by the @code{%union} declaration. @xref{Action Types, ,Data Types of Values in Actions}.@refill @item YYABORT; Return immediately from @code{yyparse}, indicating failure. @xref{Parser Function, ,The Parser Function @code{yyparse}}. @item YYACCEPT; Return immediately from @code{yyparse}, indicating success. @xref{Parser Function, ,The Parser Function @code{yyparse}}. @item YYBACKUP (@var{token}, @var{value}); @findex YYBACKUP Unshift a token. This macro is allowed only for rules that reduce a single value, and only when there is no look-ahead token. It installs a look-ahead token with token type @var{token} and semantic value @var{value}; then it discards the value that was going to be reduced by this rule. If the macro is used when it is not valid, such as when there is a look-ahead token already, then it reports a syntax error with a message @samp{cannot back up} and performs ordinary error recovery. In either case, the rest of the action is not executed. @item YYEMPTY @vindex YYEMPTY Value stored in @code{yychar} when there is no look-ahead token. @item YYERROR; @findex YYERROR Cause an immediate syntax error. This statement initiates error recovery just as if the parser itself had detected an error; however, it does not call @code{yyerror}, and does not print any message. If you want to print an error message, call @code{yyerror} explicitly before the @samp{YYERROR;} statement. @xref{Error Recovery}. @item YYRECOVERING This macro stands for an expression that has the value 1 when the parser is recovering from a syntax error, and 0 the rest of the time. @xref{Error Recovery}. @item yychar Variable containing the current look-ahead token. (In a pure parser, this is actually a local variable within @code{yyparse}.) When there is no look-ahead token, the value @code{YYEMPTY} is stored in the variable. @xref{Look-Ahead, ,Look-Ahead Tokens}. @item yyclearin; Discard the current look-ahead token. This is useful primarily in error rules. @xref{Error Recovery}. @item yyerrok; Resume generating error messages immediately for subsequent syntax errors. This is useful primarily in error rules. @xref{Error Recovery}. @item @@@var{n} @findex @@@var{n} Acts like a structure variable containing information on the line numbers and column numbers of the @var{n}th component of the current rule. The structure has four members, like this: @example struct @{ int first_line, last_line; int first_column, last_column; @}; @end example Thus, to get the starting line number of the third component, you would use @samp{@@3.first_line}. In order for the members of this structure to contain valid information, you must make @code{yylex} supply this information about each token. If you need only certain members, then @code{yylex} need only fill in those members. The use of this feature makes the parser noticeably slower. @end table @node Algorithm, Error Recovery, Interface, Top @chapter The Bison Parser Algorithm @cindex Bison parser algorithm @cindex algorithm of parser @cindex shifting @cindex reduction @cindex parser stack @cindex stack, parser As Bison reads tokens, it pushes them onto a stack along with their semantic values. The stack is called the @dfn{parser stack}. Pushing a token is traditionally called @dfn{shifting}. For example, suppose the infix calculator has read @samp{1 + 5 *}, with a @samp{3} to come. The stack will have four elements, one for each token that was shifted. But the stack does not always have an element for each token read. When the last @var{n} tokens and groupings shifted match the components of a grammar rule, they can be combined according to that rule. This is called @dfn{reduction}. Those tokens and groupings are replaced on the stack by a single grouping whose symbol is the result (left hand side) of that rule. Running the rule's action is part of the process of reduction, because this is what computes the semantic value of the resulting grouping. For example, if the infix calculator's parser stack contains this: @example 1 + 5 * 3 @end example @noindent and the next input token is a newline character, then the last three elements can be reduced to 15 via the rule: @example expr: expr '*' expr; @end example @noindent Then the stack contains just these three elements: @example 1 + 15 @end example @noindent At this point, another reduction can be made, resulting in the single value 16. Then the newline token can be shifted. The parser tries, by shifts and reductions, to reduce the entire input down to a single grouping whose symbol is the grammar's start-symbol (@pxref{Language and Grammar, ,Languages and Context-Free Grammars}). This kind of parser is known in the literature as a bottom-up parser. @menu * Look-Ahead:: Parser looks one token ahead when deciding what to do. * Shift/Reduce:: Conflicts: when either shifting or reduction is valid. * Precedence:: Operator precedence works by resolving conflicts. * Contextual Precedence:: When an operator's precedence depends on context. * Parser States:: The parser is a finite-state-machine with stack. * Reduce/Reduce:: When two rules are applicable in the same situation. * Mystery Conflicts:: Reduce/reduce conflicts that look unjustified. * Stack Overflow:: What happens when stack gets full. How to avoid it. @end menu @node Look-Ahead, Shift/Reduce, , Algorithm @section Look-Ahead Tokens @cindex look-ahead token The Bison parser does @emph{not} always reduce immediately as soon as the last @var{n} tokens and groupings match a rule. This is because such a simple strategy is inadequate to handle most languages. Instead, when a reduction is possible, the parser sometimes ``looks ahead'' at the next token in order to decide what to do. When a token is read, it is not immediately shifted; first it becomes the @dfn{look-ahead token}, which is not on the stack. Now the parser can perform one or more reductions of tokens and groupings on the stack, while the look-ahead token remains off to the side. When no more reductions should take place, the look-ahead token is shifted onto the stack. This does not mean that all possible reductions have been done; depending on the token type of the look-ahead token, some rules may choose to delay their application. Here is a simple case where look-ahead is needed. These three rules define expressions which contain binary addition operators and postfix unary factorial operators (@samp{!}), and allow parentheses for grouping. @example @group expr: term '+' expr | term ; @end group @group term: '(' expr ')' | term '!' | NUMBER ; @end group @end example Suppose that the tokens @w{@samp{1 + 2}} have been read and shifted; what should be done? If the following token is @samp{)}, then the first three tokens must be reduced to form an @code{expr}. This is the only valid course, because shifting the @samp{)} would produce a sequence of symbols @w{@code{term ')'}}, and no rule allows this. If the following token is @samp{!}, then it must be shifted immediately so that @w{@samp{2 !}} can be reduced to make a @code{term}. If instead the parser were to reduce before shifting, @w{@samp{1 + 2}} would become an @code{expr}. It would then be impossible to shift the @samp{!} because doing so would produce on the stack the sequence of symbols @code{expr '!'}. No rule allows that sequence. @vindex yychar The current look-ahead token is stored in the variable @code{yychar}. @xref{Action Features, ,Special Features for Use in Actions}. @node Shift/Reduce, Precedence, Look-Ahead, Algorithm @section Shift/Reduce Conflicts @cindex conflicts @cindex shift/reduce conflicts @cindex dangling @code{else} @cindex @code{else}, dangling Suppose we are parsing a language which has if-then and if-then-else statements, with a pair of rules like this: @example @group if_stmt: IF expr THEN stmt | IF expr THEN stmt ELSE stmt ; @end group @end example @noindent Here we assume that @code{IF}, @code{THEN} and @code{ELSE} are terminal symbols for specific keyword tokens. When the @code{ELSE} token is read and becomes the look-ahead token, the contents of the stack (assuming the input is valid) are just right for reduction by the first rule. But it is also legitimate to shift the @code{ELSE}, because that would lead to eventual reduction by the second rule. This situation, where either a shift or a reduction would be valid, is called a @dfn{shift/reduce conflict}. Bison is designed to resolve these conflicts by choosing to shift, unless otherwise directed by operator precedence declarations. To see the reason for this, let's contrast it with the other alternative. Since the parser prefers to shift the @code{ELSE}, the result is to attach the else-clause to the innermost if-statement, making these two inputs equivalent: @example if x then if y then win (); else lose; if x then do; if y then win (); else lose; end; @end example But if the parser chose to reduce when possible rather than shift, the result would be to attach the else-clause to the outermost if-statement, making these two inputs equivalent: @example if x then if y then win (); else lose; if x then do; if y then win (); end; else lose; @end example The conflict exists because the grammar as written is ambiguous: either parsing of the simple nested if-statement is legitimate. The established convention is that these ambiguities are resolved by attaching the else-clause to the innermost if-statement; this is what Bison accomplishes by choosing to shift rather than reduce. (It would ideally be cleaner to write an unambiguous grammar, but that is very hard to do in this case.) This particular ambiguity was first encountered in the specifications of Algol 60 and is called the ``dangling @code{else}'' ambiguity. To avoid warnings from Bison about predictable, legitimate shift/reduce conflicts, use the @code{%expect @var{n}} declaration. There will be no warning as long as the number of shift/reduce conflicts is exactly @var{n}. @xref{Expect Decl, ,Suppressing Conflict Warnings}. The definition of @code{if_stmt} above is solely to blame for the conflict, but the conflict does not actually appear without additional rules. Here is a complete Bison input file that actually manifests the conflict: @example @group %token IF THEN ELSE variable %% @end group @group stmt: expr | if_stmt ; @end group @group if_stmt: IF expr THEN stmt | IF expr THEN stmt ELSE stmt ; @end group expr: variable ; @end example @node Precedence, Contextual Precedence, Shift/Reduce, Algorithm @section Operator Precedence @cindex operator precedence @cindex precedence of operators Another situation where shift/reduce conflicts appear is in arithmetic expressions. Here shifting is not always the preferred resolution; the Bison declarations for operator precedence allow you to specify when to shift and when to reduce. @menu * Why Precedence:: An example showing why precedence is needed. * Using Precedence:: How to specify precedence in Bison grammars. * Precedence Examples:: How these features are used in the previous example. * How Precedence:: How they work. @end menu @node Why Precedence, Using Precedence, , Precedence @subsection When Precedence is Needed Consider the following ambiguous grammar fragment (ambiguous because the input @w{@samp{1 - 2 * 3}} can be parsed in two different ways): @example @group expr: expr '-' expr | expr '*' expr | expr '<' expr | '(' expr ')' @dots{} ; @end group @end example @noindent Suppose the parser has seen the tokens @samp{1}, @samp{-} and @samp{2}; should it reduce them via the rule for the addition operator? It depends on the next token. Of course, if the next token is @samp{)}, we must reduce; shifting is invalid because no single rule can reduce the token sequence @w{@samp{- 2 )}} or anything starting with that. But if the next token is @samp{*} or @samp{<}, we have a choice: either shifting or reduction would allow the parse to complete, but with different results. To decide which one Bison should do, we must consider the results. If the next operator token @var{op} is shifted, then it must be reduced first in order to permit another opportunity to reduce the sum. The result is (in effect) @w{@samp{1 - (2 @var{op} 3)}}. On the other hand, if the subtraction is reduced before shifting @var{op}, the result is @w{@samp{(1 - 2) @var{op} 3}}. Clearly, then, the choice of shift or reduce should depend on the relative precedence of the operators @samp{-} and @var{op}: @samp{*} should be shifted first, but not @samp{<}. @cindex associativity What about input such as @w{@samp{1 - 2 - 5}}; should this be @w{@samp{(1 - 2) - 5}} or should it be @w{@samp{1 - (2 - 5)}}? For most operators we prefer the former, which is called @dfn{left association}. The latter alternative, @dfn{right association}, is desirable for assignment operators. The choice of left or right association is a matter of whether the parser chooses to shift or reduce when the stack contains @w{@samp{1 - 2}} and the look-ahead token is @samp{-}: shifting makes right-associativity. @node Using Precedence, Precedence Examples, Why Precedence, Precedence @subsection Specifying Operator Precedence @findex %left @findex %right @findex %nonassoc Bison allows you to specify these choices with the operator precedence declarations @code{%left} and @code{%right}. Each such declaration contains a list of tokens, which are operators whose precedence and associativity is being declared. The @code{%left} declaration makes all those operators left-associative and the @code{%right} declaration makes them right-associative. A third alternative is @code{%nonassoc}, which declares that it is a syntax error to find the same operator twice ``in a row''. The relative precedence of different operators is controlled by the order in which they are declared. The first @code{%left} or @code{%right} declaration in the file declares the operators whose precedence is lowest, the next such declaration declares the operators whose precedence is a little higher, and so on. @node Precedence Examples, How Precedence, Using Precedence, Precedence @subsection Precedence Examples In our example, we would want the following declarations: @example %left '<' %left '-' %left '*' @end example In a more complete example, which supports other operators as well, we would declare them in groups of equal precedence. For example, @code{'+'} is declared with @code{'-'}: @example %left '<' '>' '=' NE LE GE %left '+' '-' %left '*' '/' @end example @noindent (Here @code{NE} and so on stand for the operators for ``not equal'' and so on. We assume that these tokens are more than one character long and therefore are represented by names, not character literals.) @node How Precedence, , Precedence Examples, Precedence @subsection How Precedence Works The first effect of the precedence declarations is to assign precedence levels to the terminal symbols declared. The second effect is to assign precedence levels to certain rules: each rule gets its precedence from the last terminal symbol mentioned in the components. (You can also specify explicitly the precedence of a rule. @xref{Contextual Precedence, ,Context-Dependent Precedence}.) Finally, the resolution of conflicts works by comparing the precedence of the rule being considered with that of the look-ahead token. If the token's precedence is higher, the choice is to shift. If the rule's precedence is higher, the choice is to reduce. If they have equal precedence, the choice is made based on the associativity of that precedence level. The verbose output file made by @samp{-v} (@pxref{Invocation, ,Invoking Bison}) says how each conflict was resolved. Not all rules and not all tokens have precedence. If either the rule or the look-ahead token has no precedence, then the default is to shift. @node Contextual Precedence, Parser States, Precedence, Algorithm @section Context-Dependent Precedence @cindex context-dependent precedence @cindex unary operator precedence @cindex precedence, context-dependent @cindex precedence, unary operator @findex %prec Often the precedence of an operator depends on the context. This sounds outlandish at first, but it is really very common. For example, a minus sign typically has a very high precedence as a unary operator, and a somewhat lower precedence (lower than multiplication) as a binary operator. The Bison precedence declarations, @code{%left}, @code{%right} and @code{%nonassoc}, can only be used once for a given token; so a token has only one precedence declared in this way. For context-dependent precedence, you need to use an additional mechanism: the @code{%prec} modifier for rules.@refill The @code{%prec} modifier declares the precedence of a particular rule by specifying a terminal symbol whose precedence should be used for that rule. It's not necessary for that symbol to appear otherwise in the rule. The modifier's syntax is: @example %prec @var{terminal-symbol} @end example @noindent and it is written after the components of the rule. Its effect is to assign the rule the precedence of @var{terminal-symbol}, overriding the precedence that would be deduced for it in the ordinary way. The altered rule precedence then affects how conflicts involving that rule are resolved (@pxref{Precedence, ,Operator Precedence}). Here is how @code{%prec} solves the problem of unary minus. First, declare a precedence for a fictitious terminal symbol named @code{UMINUS}. There are no tokens of this type, but the symbol serves to stand for its precedence: @example @dots{} %left '+' '-' %left '*' %left UMINUS @end example Now the precedence of @code{UMINUS} can be used in specific rules: @example @group exp: @dots{} | exp '-' exp @dots{} | '-' exp %prec UMINUS @end group @end example @node Parser States, Reduce/Reduce, Contextual Precedence, Algorithm @section Parser States @cindex finite-state machine @cindex parser state @cindex state (of parser) The function @code{yyparse} is implemented using a finite-state machine. The values pushed on the parser stack are not simply token type codes; they represent the entire sequence of terminal and nonterminal symbols at or near the top of the stack. The current state collects all the information about previous input which is relevant to deciding what to do next. Each time a look-ahead token is read, the current parser state together with the type of look-ahead token are looked up in a table. This table entry can say, ``Shift the look-ahead token.'' In this case, it also specifies the new parser state, which is pushed onto the top of the parser stack. Or it can say, ``Reduce using rule number @var{n}.'' This means that a certain number of tokens or groupings are taken off the top of the stack, and replaced by one grouping. In other words, that number of states are popped from the stack, and one new state is pushed. There is one other alternative: the table can say that the look-ahead token is erroneous in the current state. This causes error processing to begin (@pxref{Error Recovery}). @node Reduce/Reduce, Mystery Conflicts, Parser States, Algorithm @section Reduce/Reduce Conflicts @cindex reduce/reduce conflict @cindex conflicts, reduce/reduce A reduce/reduce conflict occurs if there are two or more rules that apply to the same sequence of input. This usually indicates a serious error in the grammar. For example, here is an erroneous attempt to define a sequence of zero or more @code{word} groupings. @example sequence: /* empty */ @{ printf ("empty sequence\n"); @} | maybeword | sequence word @{ printf ("added word %s\n", $2); @} ; maybeword: /* empty */ @{ printf ("empty maybeword\n"); @} | word @{ printf ("single word %s\n", $1); @} ; @end example @noindent The error is an ambiguity: there is more than one way to parse a single @code{word} into a @code{sequence}. It could be reduced to a @code{maybeword} and then into a @code{sequence} via the second rule. Alternatively, nothing-at-all could be reduced into a @code{sequence} via the first rule, and this could be combined with the @code{word} using the third rule for @code{sequence}. There is also more than one way to reduce nothing-at-all into a @code{sequence}. This can be done directly via the first rule, or indirectly via @code{maybeword} and then the second rule. You might think that this is a distinction without a difference, because it does not change whether any particular input is valid or not. But it does affect which actions are run. One parsing order runs the second rule's action; the other runs the first rule's action and the third rule's action. In this example, the output of the program changes. Bison resolves a reduce/reduce conflict by choosing to use the rule that appears first in the grammar, but it is very risky to rely on this. Every reduce/reduce conflict must be studied and usually eliminated. Here is the proper way to define @code{sequence}: @example sequence: /* empty */ @{ printf ("empty sequence\n"); @} | sequence word @{ printf ("added word %s\n", $2); @} ; @end example Here is another common error that yields a reduce/reduce conflict: @example sequence: /* empty */ | sequence words | sequence redirects ; words: /* empty */ | words word ; redirects:/* empty */ | redirects redirect ; @end example @noindent The intention here is to define a sequence which can contain either @code{word} or @code{redirect} groupings. The individual definitions of @code{sequence}, @code{words} and @code{redirects} are error-free, but the three together make a subtle ambiguity: even an empty input can be parsed in infinitely many ways! Consider: nothing-at-all could be a @code{words}. Or it could be two @code{words} in a row, or three, or any number. It could equally well be a @code{redirects}, or two, or any number. Or it could be a @code{words} followed by three @code{redirects} and another @code{words}. And so on. Here are two ways to correct these rules. First, to make it a single level of sequence: @example sequence: /* empty */ | sequence word | sequence redirect ; @end example Second, to prevent either a @code{words} or a @code{redirects} from being empty: @example sequence: /* empty */ | sequence words | sequence redirects ; words: word | words word ; redirects:redirect | redirects redirect ; @end example @node Mystery Conflicts, Stack Overflow, Reduce/Reduce, Algorithm @section Mysterious Reduce/Reduce Conflicts Sometimes reduce/reduce conflicts can occur that don't look warranted. Here is an example: @example @group %token ID %% def: param_spec return_spec ',' ; param_spec: type | name_list ':' type ; @end group @group return_spec: type | name ':' type ; @end group @group type: ID ; @end group @group name: ID ; name_list: name | name ',' name_list ; @end group @end example It would seem that this grammar can be parsed with only a single token of look-ahead: when a @code{param_spec} is being read, an @code{ID} is a @code{name} if a comma or colon follows, or a @code{type} if another @code{ID} follows. In other words, this grammar is LR(1). @cindex LR(1) @cindex LALR(1) However, Bison, like most parser generators, cannot actually handle all LR(1) grammars. In this grammar, two contexts, that after an @code{ID} at the beginning of a @code{param_spec} and likewise at the beginning of a @code{return_spec}, are similar enough that Bison assumes they are the same. They appear similar because the same set of rules would be active---the rule for reducing to a @code{name} and that for reducing to a @code{type}. Bison is unable to determine at that stage of processing that the rules would require different look-ahead tokens in the two contexts, so it makes a single parser state for them both. Combining the two contexts causes a conflict later. In parser terminology, this occurrence means that the grammar is not LALR(1). In general, it is better to fix deficiencies than to document them. But this particular deficiency is intrinsically hard to fix; parser generators that can handle LR(1) grammars are hard to write and tend to produce parsers that are very large. In practice, Bison is more useful as it is now. When the problem arises, you can often fix it by identifying the two parser states that are being confused, and adding something to make them look distinct. In the above example, adding one rule to @code{return_spec} as follows makes the problem go away: @example @group %token BOGUS @dots{} %% @dots{} return_spec: type | name ':' type /* This rule is never used. */ | ID BOGUS ; @end group @end example This corrects the problem because it introduces the possibility of an additional active rule in the context after the @code{ID} at the beginning of @code{return_spec}. This rule is not active in the corresponding context in a @code{param_spec}, so the two contexts receive distinct parser states. As long as the token @code{BOGUS} is never generated by @code{yylex}, the added rule cannot alter the way actual input is parsed. In this particular example, there is another way to solve the problem: rewrite the rule for @code{return_spec} to use @code{ID} directly instead of via @code{name}. This also causes the two confusing contexts to have different sets of active rules, because the one for @code{return_spec} activates the altered rule for @code{return_spec} rather than the one for @code{name}. @example param_spec: type | name_list ':' type ; return_spec: type | ID ':' type ; @end example @node Stack Overflow, , Mystery Conflicts, Algorithm @section Stack Overflow, and How to Avoid It @cindex stack overflow @cindex parser stack overflow @cindex overflow of parser stack The Bison parser stack can overflow if too many tokens are shifted and not reduced. When this happens, the parser function @code{yyparse} returns a nonzero value, pausing only to call @code{yyerror} to report the overflow. @vindex YYMAXDEPTH By defining the macro @code{YYMAXDEPTH}, you can control how deep the parser stack can become before a stack overflow occurs. Define the macro with a value that is an integer. This value is the maximum number of tokens that can be shifted (and not reduced) before overflow. It must be a constant expression whose value is known at compile time. The stack space allowed is not necessarily allocated. If you specify a large value for @code{YYMAXDEPTH}, the parser actually allocates a small stack at first, and then makes it bigger by stages as needed. This increasing allocation happens automatically and silently. Therefore, you do not need to make @code{YYMAXDEPTH} painfully small merely to save space for ordinary inputs that do not need much stack. @cindex default stack limit The default value of @code{YYMAXDEPTH}, if you do not define it, is 10000. @vindex YYINITDEPTH You can control how much stack is allocated initially by defining the macro @code{YYINITDEPTH}. This value too must be a compile-time constant integer. The default is 200. @node Error Recovery, Context Dependency, Algorithm, Top @chapter Error Recovery @cindex error recovery @cindex recovery from errors It is not usually acceptable to have a program terminate on a parse error. For example, a compiler should recover sufficiently to parse the rest of the input file and check it for errors; a calculator should accept another expression. In a simple interactive command parser where each input is one line, it may be sufficient to allow @code{yyparse} to return 1 on error and have the caller ignore the rest of the input line when that happens (and then call @code{yyparse} again). But this is inadequate for a compiler, because it forgets all the syntactic context leading up to the error. A syntax error deep within a function in the compiler input should not cause the compiler to treat the following line like the beginning of a source file. @findex error You can define how to recover from a syntax error by writing rules to recognize the special token @code{error}. This is a terminal symbol that is always defined (you need not declare it) and reserved for error handling. The Bison parser generates an @code{error} token whenever a syntax error happens; if you have provided a rule to recognize this token in the current context, the parse can continue. For example: @example stmnts: /* empty string */ | stmnts '\n' | stmnts exp '\n' | stmnts error '\n' @end example The fourth rule in this example says that an error followed by a newline makes a valid addition to any @code{stmnts}. What happens if a syntax error occurs in the middle of an @code{exp}? The error recovery rule, interpreted strictly, applies to the precise sequence of a @code{stmnts}, an @code{error} and a newline. If an error occurs in the middle of an @code{exp}, there will probably be some additional tokens and subexpressions on the stack after the last @code{stmnts}, and there will be tokens to read before the next newline. So the rule is not applicable in the ordinary way. But Bison can force the situation to fit the rule, by discarding part of the semantic context and part of the input. First it discards states and objects from the stack until it gets back to a state in which the @code{error} token is acceptable. (This means that the subexpressions already parsed are discarded, back to the last complete @code{stmnts}.) At this point the @code{error} token can be shifted. Then, if the old look-ahead token is not acceptable to be shifted next, the parser reads tokens and discards them until it finds a token which is acceptable. In this example, Bison reads and discards input until the next newline so that the fourth rule can apply. The choice of error rules in the grammar is a choice of strategies for error recovery. A simple and useful strategy is simply to skip the rest of the current input line or current statement if an error is detected: @example stmnt: error ';' /* on error, skip until ';' is read */ @end example It is also useful to recover to the matching close-delimiter of an opening-delimiter that has already been parsed. Otherwise the close-delimiter will probably appear to be unmatched, and generate another, spurious error message: @example primary: '(' expr ')' | '(' error ')' @dots{} ; @end example Error recovery strategies are necessarily guesses. When they guess wrong, one syntax error often leads to another. In the above example, the error recovery rule guesses that an error is due to bad input within one @code{stmnt}. Suppose that instead a spurious semicolon is inserted in the middle of a valid @code{stmnt}. After the error recovery rule recovers from the first error, another syntax error will be found straightaway, since the text following the spurious semicolon is also an invalid @code{stmnt}. To prevent an outpouring of error messages, the parser will output no error message for another syntax error that happens shortly after the first; only after three consecutive input tokens have been successfully shifted will error messages resume. Note that rules which accept the @code{error} token may have actions, just as any other rules can. @findex yyerrok You can make error messages resume immediately by using the macro @code{yyerrok} in an action. If you do this in the error rule's action, no error messages will be suppressed. This macro requires no arguments; @samp{yyerrok;} is a valid C statement. @findex yyclearin The previous look-ahead token is reanalyzed immediately after an error. If this is unacceptable, then the macro @code{yyclearin} may be used to clear this token. Write the statement @samp{yyclearin;} in the error rule's action. For example, suppose that on a parse error, an error handling routine is called that advances the input stream to some point where parsing should once again commence. The next symbol returned by the lexical scanner is probably correct. The previous look-ahead token ought to be discarded with @samp{yyclearin;}. @vindex YYRECOVERING The macro @code{YYRECOVERING} stands for an expression that has the value 1 when the parser is recovering from a syntax error, and 0 the rest of the time. A value of 1 indicates that error messages are currently suppressed for new syntax errors. @node Context Dependency, Debugging, Error Recovery, Top @chapter Handling Context Dependencies The Bison paradigm is to parse tokens first, then group them into larger syntactic units. In many languages, the meaning of a token is affected by its context. Although this violates the Bison paradigm, certain techniques (known as @dfn{kludges}) may enable you to write Bison parsers for such languages. @menu * Semantic Tokens:: Token parsing can depend on the semantic context. * Lexical Tie-ins:: Token parsing can depend on the syntactic context. * Tie-in Recovery:: Lexical tie-ins have implications for how error recovery rules must be written. @end menu (Actually, ``kludge'' means any technique that gets its job done but is neither clean nor robust.) @node Semantic Tokens, Lexical Tie-ins, , Context Dependency @section Semantic Info in Token Types The C language has a context dependency: the way an identifier is used depends on what its current meaning is. For example, consider this: @example foo (x); @end example This looks like a function call statement, but if @code{foo} is a typedef name, then this is actually a declaration of @code{x}. How can a Bison parser for C decide how to parse this input? The method used in GNU C is to have two different token types, @code{IDENTIFIER} and @code{TYPENAME}. When @code{yylex} finds an identifier, it looks up the current declaration of the identifier in order to decide which token type to return: @code{TYPENAME} if the identifier is declared as a typedef, @code{IDENTIFIER} otherwise. The grammar rules can then express the context dependency by the choice of token type to recognize. @code{IDENTIFIER} is accepted as an expression, but @code{TYPENAME} is not. @code{TYPENAME} can start a declaration, but @code{IDENTIFIER} cannot. In contexts where the meaning of the identifier is @emph{not} significant, such as in declarations that can shadow a typedef name, either @code{TYPENAME} or @code{IDENTIFIER} is accepted---there is one rule for each of the two token types. This technique is simple to use if the decision of which kinds of identifiers to allow is made at a place close to where the identifier is parsed. But in C this is not always so: C allows a declaration to redeclare a typedef name provided an explicit type has been specified earlier: @example typedef int foo, bar, lose; static foo (bar); /* @r{redeclare @code{bar} as static variable} */ static int foo (lose); /* @r{redeclare @code{foo} as function} */ @end example Unfortunately, the name being declared is separated from the declaration construct itself by a complicated syntactic structure---the ``declarator''. As a result, the part of Bison parser for C needs to be duplicated, with all the nonterminal names changed: once for parsing a declaration in which a typedef name can be redefined, and once for parsing a declaration in which that can't be done. Here is a part of the duplication, with actions omitted for brevity: @example initdcl: declarator maybeasm '=' init | declarator maybeasm ; notype_initdcl: notype_declarator maybeasm '=' init | notype_declarator maybeasm ; @end example @noindent Here @code{initdcl} can redeclare a typedef name, but @code{notype_initdcl} cannot. The distinction between @code{declarator} and @code{notype_declarator} is the same sort of thing. There is some similarity between this technique and a lexical tie-in (described next), in that information which alters the lexical analysis is changed during parsing by other parts of the program. The difference is here the information is global, and is used for other purposes in the program. A true lexical tie-in has a special-purpose flag controlled by the syntactic context. @node Lexical Tie-ins, Tie-in Recovery, Semantic Tokens, Context Dependency @section Lexical Tie-ins @cindex lexical tie-in One way to handle context-dependency is the @dfn{lexical tie-in}: a flag which is set by Bison actions, whose purpose is to alter the way tokens are parsed. For example, suppose we have a language vaguely like C, but with a special construct @samp{hex (@var{hex-expr})}. After the keyword @code{hex} comes an expression in parentheses in which all integers are hexadecimal. In particular, the token @samp{a1b} must be treated as an integer rather than as an identifier if it appears in that context. Here is how you can do it: @example @group %@{ int hexflag; %@} %% @dots{} @end group @group expr: IDENTIFIER | constant | HEX '(' @{ hexflag = 1; @} expr ')' @{ hexflag = 0; $$ = $4; @} | expr '+' expr @{ $$ = make_sum ($1, $3); @} @dots{} ; @end group @group constant: INTEGER | STRING ; @end group @end example @noindent Here we assume that @code{yylex} looks at the value of @code{hexflag}; when it is nonzero, all integers are parsed in hexadecimal, and tokens starting with letters are parsed as integers if possible. The declaration of @code{hexflag} shown in the C declarations section of the parser file is needed to make it accessible to the actions (@pxref{C Declarations, ,The C Declarations Section}). You must also write the code in @code{yylex} to obey the flag. @node Tie-in Recovery, , Lexical Tie-ins, Context Dependency @section Lexical Tie-ins and Error Recovery Lexical tie-ins make strict demands on any error recovery rules you have. @xref{Error Recovery}. The reason for this is that the purpose of an error recovery rule is to abort the parsing of one construct and resume in some larger construct. For example, in C-like languages, a typical error recovery rule is to skip tokens until the next semicolon, and then start a new statement, like this: @example stmt: expr ';' | IF '(' expr ')' stmt @{ @dots{} @} @dots{} error ';' @{ hexflag = 0; @} ; @end example If there is a syntax error in the middle of a @samp{hex (@var{expr})} construct, this error rule will apply, and then the action for the completed @samp{hex (@var{expr})} will never run. So @code{hexflag} would remain set for the entire rest of the input, or until the next @code{hex} keyword, causing identifiers to be misinterpreted as integers. To avoid this problem the error recovery rule itself clears @code{hexflag}. There may also be an error recovery rule that works within expressions. For example, there could be a rule which applies within parentheses and skips to the close-parenthesis: @example @group expr: @dots{} | '(' expr ')' @{ $$ = $2; @} | '(' error ')' @dots{} @end group @end example If this rule acts within the @code{hex} construct, it is not going to abort that construct (since it applies to an inner level of parentheses within the construct). Therefore, it should not clear the flag: the rest of the @code{hex} construct should be parsed with the flag still in effect. What if there is an error recovery rule which might abort out of the @code{hex} construct or might not, depending on circumstances? There is no way you can write the action to determine whether a @code{hex} construct is being aborted or not. So if you are using a lexical tie-in, you had better make sure your error recovery rules are not of this kind. Each rule must be such that you can be sure that it always will, or always won't, have to clear the flag. @node Debugging, Invocation, Context Dependency, Top @chapter Debugging Your Parser @findex YYDEBUG @findex yydebug @cindex debugging @cindex tracing the parser If a Bison grammar compiles properly but doesn't do what you want when it runs, the @code{yydebug} parser-trace feature can help you figure out why. To enable compilation of trace facilities, you must define the macro @code{YYDEBUG} when you compile the parser. You could use @samp{-DYYDEBUG=1} as a compiler option or you could put @samp{#define YYDEBUG 1} in the C declarations section of the grammar file (@pxref{C Declarations, ,The C Declarations Section}). Alternatively, use the @samp{-t} option when you run Bison (@pxref{Invocation, ,Invoking Bison}). We always define @code{YYDEBUG} so that debugging is always possible. The trace facility uses @code{stderr}, so you must add @w{@code{#include }} to the C declarations section unless it is already there. Once you have compiled the program with trace facilities, the way to request a trace is to store a nonzero value in the variable @code{yydebug}. You can do this by making the C code do it (in @code{main}, perhaps), or you can alter the value with a C debugger. Each step taken by the parser when @code{yydebug} is nonzero produces a line or two of trace information, written on @code{stderr}. The trace messages tell you these things: @itemize @bullet @item Each time the parser calls @code{yylex}, what kind of token was read. @item Each time a token is shifted, the depth and complete contents of the state stack (@pxref{Parser States}). @item Each time a rule is reduced, which rule it is, and the complete contents of the state stack afterward. @end itemize To make sense of this information, it helps to refer to the listing file produced by the Bison @samp{-v} option (@pxref{Invocation, ,Invoking Bison}). This file shows the meaning of each state in terms of positions in various rules, and also what each state will do with each possible input token. As you read the successive trace messages, you can see that the parser is functioning according to its specification in the listing file. Eventually you will arrive at the place where something undesirable happens, and you will see which parts of the grammar are to blame. The parser file is a C program and you can use C debuggers on it, but it's not easy to interpret what it is doing. The parser function is a finite-state machine interpreter, and aside from the actions it executes the same code over and over. Only the values of variables show where in the grammar it is working. @findex YYPRINT The debugging information normally gives the token type of each token read, but not its semantic value. You can optionally define a macro named @code{YYPRINT} to provide a way to print the value. If you define @code{YYPRINT}, it should take three arguments. The parser will pass a standard I/O stream, the numeric code for the token type, and the token value (from @code{yylval}). Here is an example of @code{YYPRINT} suitable for the multi-function calculator (@pxref{Mfcalc Decl, ,Declarations for @code{mfcalc}}): @smallexample #define YYPRINT(file, type, value) yyprint (file, type, value) static void yyprint (file, type, value) FILE *file; int type; YYSTYPE value; @{ if (type == VAR) fprintf (file, " %s", value.tptr->name); else if (type == NUM) fprintf (file, " %d", value.val); @} @end smallexample @node Invocation, Table of Symbols, Debugging, Top @chapter Invoking Bison @cindex invoking Bison @cindex Bison invocation @cindex options for invoking Bison The usual way to invoke Bison is as follows: @example bison @var{infile} @end example Here @var{infile} is the grammar file name, which usually ends in @samp{.y}. The parser file's name is made by replacing the @samp{.y} with @samp{.tab.c}. Thus, the @samp{bison foo.y} filename yields @file{foo.tab.c}, and the @samp{bison hack/foo.y} filename yields @file{hack/foo.tab.c}.@refill @menu * Bison Options:: All the options described in detail, in alphabetical order by short options. * Option Cross Key:: Alphabetical list of long options. * VMS Invocation:: Bison command syntax on VMS. @end menu @node Bison Options, Option Cross Key, , Invocation @section Bison Options Bison supports both traditional single-letter options and mnemonic long option names. Long option names are indicated with @samp{--} instead of @samp{-}. Abbreviations for option names are allowed as long as they are unique. When a long option takes an argument, like @samp{--file-prefix}, connect the option name and the argument with @samp{=}. Here is a list of options that can be used with Bison, alphabetized by short option. It is followed by a cross key alphabetized by long option. @table @samp @item -b @var{file-prefix} @itemx --file-prefix=@var{prefix} Specify a prefix to use for all Bison output file names. The names are chosen as if the input file were named @file{@var{prefix}.c}. @item -d @itemx --defines Write an extra output file containing macro definitions for the token type names defined in the grammar and the semantic value type @code{YYSTYPE}, as well as a few @code{extern} variable declarations. If the parser output file is named @file{@var{name}.c} then this file is named @file{@var{name}.h}.@refill This output file is essential if you wish to put the definition of @code{yylex} in a separate source file, because @code{yylex} needs to be able to refer to token type codes and the variable @code{yylval}. @xref{Token Values, ,Semantic Values of Tokens}.@refill @item -l @itemx --no-lines Don't put any @code{#line} preprocessor commands in the parser file. Ordinarily Bison puts them in the parser file so that the C compiler and debuggers will associate errors with your source file, the grammar file. This option causes them to associate errors with the parser file, treating it as an independent source file in its own right. @item -n @itemx --no-parser Do not include any C code in the parser file; generate tables only. The parser file contains just @code{#define} directives and static variable declarations. This option also tells Bison to write the C code for the grammar actions into a file named @file{@var{filename}.act}, in the form of a brace-surrounded body fit for a @code{switch} statement. @item -o @var{outfile} @itemx --output-file=@var{outfile} Specify the name @var{outfile} for the parser file. The other output files' names are constructed from @var{outfile} as described under the @samp{-v} and @samp{-d} options. @item -p @var{prefix} @itemx --name-prefix=@var{prefix} Rename the external symbols used in the parser so that they start with @var{prefix} instead of @samp{yy}. The precise list of symbols renamed is @code{yyparse}, @code{yylex}, @code{yyerror}, @code{yynerrs}, @code{yylval}, @code{yychar} and @code{yydebug}. For example, if you use @samp{-p c}, the names become @code{cparse}, @code{clex}, and so on. @xref{Multiple Parsers, ,Multiple Parsers in the Same Program}. @item -r @itemx --raw Pretend that @code{%raw} was specified. @xref{Decl Summary}. @item -t @itemx --debug Output a definition of the macro @code{YYDEBUG} into the parser file, so that the debugging facilities are compiled. @xref{Debugging, ,Debugging Your Parser}. @item -v @itemx --verbose Write an extra output file containing verbose descriptions of the parser states and what is done for each type of look-ahead token in that state. This file also describes all the conflicts, both those resolved by operator precedence and the unresolved ones. The file's name is made by removing @samp{.tab.c} or @samp{.c} from the parser output file name, and adding @samp{.output} instead.@refill Therefore, if the input file is @file{foo.y}, then the parser file is called @file{foo.tab.c} by default. As a consequence, the verbose output file is called @file{foo.output}.@refill @item -V @itemx --version Print the version number of Bison and exit. @item -h @itemx --help Print a summary of the command-line options to Bison and exit. @need 1750 @item -y @itemx --yacc @itemx --fixed-output-files Equivalent to @samp{-o y.tab.c}; the parser output file is called @file{y.tab.c}, and the other outputs are called @file{y.output} and @file{y.tab.h}. The purpose of this option is to imitate Yacc's output file name conventions. Thus, the following shell script can substitute for Yacc:@refill @example bison -y $* @end example @end table @node Option Cross Key, VMS Invocation, Bison Options, Invocation @section Option Cross Key Here is a list of options, alphabetized by long option, to help you find the corresponding short option. @tex \def\leaderfill{\leaders\hbox to 1em{\hss.\hss}\hfill} {\tt \line{ --debug \leaderfill -t} \line{ --defines \leaderfill -d} \line{ --file-prefix \leaderfill -b} \line{ --fixed-output-files \leaderfill -y} \line{ --help \leaderfill -h} \line{ --name-prefix \leaderfill -p} \line{ --no-lines \leaderfill -l} \line{ --no-parser \leaderfill -n} \line{ --output-file \leaderfill -o} \line{ --raw \leaderfill -r} \line{ --token-table \leaderfill -k} \line{ --verbose \leaderfill -v} \line{ --version \leaderfill -V} \line{ --yacc \leaderfill -y} } @end tex @ifinfo @example --debug -t --defines -d --file-prefix=@var{prefix} -b @var{file-prefix} --fixed-output-files --yacc -y --help -h --name-prefix=@var{prefix} -p @var{name-prefix} --no-lines -l --no-parser -n --output-file=@var{outfile} -o @var{outfile} --raw -r --token-table -k --verbose -v --version -V @end example @end ifinfo @node VMS Invocation, , Option Cross Key, Invocation @section Invoking Bison under VMS @cindex invoking Bison under VMS @cindex VMS The command line syntax for Bison on VMS is a variant of the usual Bison command syntax---adapted to fit VMS conventions. To find the VMS equivalent for any Bison option, start with the long option, and substitute a @samp{/} for the leading @samp{--}, and substitute a @samp{_} for each @samp{-} in the name of the long option. For example, the following invocation under VMS: @example bison /debug/name_prefix=bar foo.y @end example @noindent is equivalent to the following command under POSIX. @example bison --debug --name-prefix=bar foo.y @end example The VMS file system does not permit filenames such as @file{foo.tab.c}. In the above example, the output file would instead be named @file{foo_tab.c}. @node Table of Symbols, Glossary, Invocation, Top @appendix Bison Symbols @cindex Bison symbols, table of @cindex symbols in Bison, table of @table @code @item error A token name reserved for error recovery. This token may be used in grammar rules so as to allow the Bison parser to recognize an error in the grammar without halting the process. In effect, a sentence containing an error may be recognized as valid. On a parse error, the token @code{error} becomes the current look-ahead token. Actions corresponding to @code{error} are then executed, and the look-ahead token is reset to the token that originally caused the violation. @xref{Error Recovery}. @item YYABORT Macro to pretend that an unrecoverable syntax error has occurred, by making @code{yyparse} return 1 immediately. The error reporting function @code{yyerror} is not called. @xref{Parser Function, ,The Parser Function @code{yyparse}}. @item YYACCEPT Macro to pretend that a complete utterance of the language has been read, by making @code{yyparse} return 0 immediately. @xref{Parser Function, ,The Parser Function @code{yyparse}}. @item YYBACKUP Macro to discard a value from the parser stack and fake a look-ahead token. @xref{Action Features, ,Special Features for Use in Actions}. @item YYERROR Macro to pretend that a syntax error has just been detected: call @code{yyerror} and then perform normal error recovery if possible (@pxref{Error Recovery}), or (if recovery is impossible) make @code{yyparse} return 1. @xref{Error Recovery}. @item YYERROR_VERBOSE Macro that you define with @code{#define} in the Bison declarations section to request verbose, specific error message strings when @code{yyerror} is called. @item YYINITDEPTH Macro for specifying the initial size of the parser stack. @xref{Stack Overflow}. @item YYLEX_PARAM Macro for specifying an extra argument (or list of extra arguments) for @code{yyparse} to pass to @code{yylex}. @xref{Pure Calling,, Calling Conventions for Pure Parsers}. @item YYLTYPE Macro for the data type of @code{yylloc}; a structure with four members. @xref{Token Positions, ,Textual Positions of Tokens}. @item yyltype Default value for YYLTYPE. @item YYMAXDEPTH Macro for specifying the maximum size of the parser stack. @xref{Stack Overflow}. @item YYPARSE_PARAM Macro for specifying the name of a parameter that @code{yyparse} should accept. @xref{Pure Calling,, Calling Conventions for Pure Parsers}. @item YYRECOVERING Macro whose value indicates whether the parser is recovering from a syntax error. @xref{Action Features, ,Special Features for Use in Actions}. @item YYSTYPE Macro for the data type of semantic values; @code{int} by default. @xref{Value Type, ,Data Types of Semantic Values}. @item yychar External integer variable that contains the integer value of the current look-ahead token. (In a pure parser, it is a local variable within @code{yyparse}.) Error-recovery rule actions may examine this variable. @xref{Action Features, ,Special Features for Use in Actions}. @item yyclearin Macro used in error-recovery rule actions. It clears the previous look-ahead token. @xref{Error Recovery}. @item yydebug External integer variable set to zero by default. If @code{yydebug} is given a nonzero value, the parser will output information on input symbols and parser action. @xref{Debugging, ,Debugging Your Parser}. @item yyerrok Macro to cause parser to recover immediately to its normal mode after a parse error. @xref{Error Recovery}. @item yyerror User-supplied function to be called by @code{yyparse} on error. The function receives one argument, a pointer to a character string containing an error message. @xref{Error Reporting, ,The Error Reporting Function @code{yyerror}}. @item yylex User-supplied lexical analyzer function, called with no arguments to get the next token. @xref{Lexical, ,The Lexical Analyzer Function @code{yylex}}. @item yylval External variable in which @code{yylex} should place the semantic value associated with a token. (In a pure parser, it is a local variable within @code{yyparse}, and its address is passed to @code{yylex}.) @xref{Token Values, ,Semantic Values of Tokens}. @item yylloc External variable in which @code{yylex} should place the line and column numbers associated with a token. (In a pure parser, it is a local variable within @code{yyparse}, and its address is passed to @code{yylex}.) You can ignore this variable if you don't use the @samp{@@} feature in the grammar actions. @xref{Token Positions, ,Textual Positions of Tokens}. @item yynerrs Global variable which Bison increments each time there is a parse error. (In a pure parser, it is a local variable within @code{yyparse}.) @xref{Error Reporting, ,The Error Reporting Function @code{yyerror}}. @item yyparse The parser function produced by Bison; call this function to start parsing. @xref{Parser Function, ,The Parser Function @code{yyparse}}. @item %left Bison declaration to assign left associativity to token(s). @xref{Precedence Decl, ,Operator Precedence}. @item %no_lines Bison declaration to avoid generating @code{#line} directives in the parser file. @xref{Decl Summary}. @item %nonassoc Bison declaration to assign nonassociativity to token(s). @xref{Precedence Decl, ,Operator Precedence}. @item %prec Bison declaration to assign a precedence to a specific rule. @xref{Contextual Precedence, ,Context-Dependent Precedence}. @item %pure_parser Bison declaration to request a pure (reentrant) parser. @xref{Pure Decl, ,A Pure (Reentrant) Parser}. @item %raw Bison declaration to use Bison internal token code numbers in token tables instead of the usual Yacc-compatible token code numbers. @xref{Decl Summary}. @item %right Bison declaration to assign right associativity to token(s). @xref{Precedence Decl, ,Operator Precedence}. @item %start Bison declaration to specify the start symbol. @xref{Start Decl, ,The Start-Symbol}. @item %token Bison declaration to declare token(s) without specifying precedence. @xref{Token Decl, ,Token Type Names}. @item %token_table Bison declaration to include a token name table in the parser file. @xref{Decl Summary}. @item %type Bison declaration to declare nonterminals. @xref{Type Decl, ,Nonterminal Symbols}. @item %union Bison declaration to specify several possible data types for semantic values. @xref{Union Decl, ,The Collection of Value Types}. @end table These are the punctuation and delimiters used in Bison input: @table @samp @item %% Delimiter used to separate the grammar rule section from the Bison declarations section or the additional C code section. @xref{Grammar Layout, ,The Overall Layout of a Bison Grammar}. @item %@{ %@} All code listed between @samp{%@{} and @samp{%@}} is copied directly to the output file uninterpreted. Such code forms the ``C declarations'' section of the input file. @xref{Grammar Outline, ,Outline of a Bison Grammar}. @item /*@dots{}*/ Comment delimiters, as in C. @item : Separates a rule's result from its components. @xref{Rules, ,Syntax of Grammar Rules}. @item ; Terminates a rule. @xref{Rules, ,Syntax of Grammar Rules}. @item | Separates alternate rules for the same result nonterminal. @xref{Rules, ,Syntax of Grammar Rules}. @end table @node Glossary, Index, Table of Symbols, Top @appendix Glossary @cindex glossary @table @asis @item Backus-Naur Form (BNF) Formal method of specifying context-free grammars. BNF was first used in the @cite{ALGOL-60} report, 1963. @xref{Language and Grammar, ,Languages and Context-Free Grammars}. @item Context-free grammars Grammars specified as rules that can be applied regardless of context. Thus, if there is a rule which says that an integer can be used as an expression, integers are allowed @emph{anywhere} an expression is permitted. @xref{Language and Grammar, ,Languages and Context-Free Grammars}. @item Dynamic allocation Allocation of memory that occurs during execution, rather than at compile time or on entry to a function. @item Empty string Analogous to the empty set in set theory, the empty string is a character string of length zero. @item Finite-state stack machine A ``machine'' that has discrete states in which it is said to exist at each instant in time. As input to the machine is processed, the machine moves from state to state as specified by the logic of the machine. In the case of the parser, the input is the language being parsed, and the states correspond to various stages in the grammar rules. @xref{Algorithm, ,The Bison Parser Algorithm }. @item Grouping A language construct that is (in general) grammatically divisible; for example, `expression' or `declaration' in C. @xref{Language and Grammar, ,Languages and Context-Free Grammars}. @item Infix operator An arithmetic operator that is placed between the operands on which it performs some operation. @item Input stream A continuous flow of data between devices or programs. @item Language construct One of the typical usage schemas of the language. For example, one of the constructs of the C language is the @code{if} statement. @xref{Language and Grammar, ,Languages and Context-Free Grammars}. @item Left associativity Operators having left associativity are analyzed from left to right: @samp{a+b+c} first computes @samp{a+b} and then combines with @samp{c}. @xref{Precedence, ,Operator Precedence}. @item Left recursion A rule whose result symbol is also its first component symbol; for example, @samp{expseq1 : expseq1 ',' exp;}. @xref{Recursion, ,Recursive Rules}. @item Left-to-right parsing Parsing a sentence of a language by analyzing it token by token from left to right. @xref{Algorithm, ,The Bison Parser Algorithm }. @item Lexical analyzer (scanner) A function that reads an input stream and returns tokens one by one. @xref{Lexical, ,The Lexical Analyzer Function @code{yylex}}. @item Lexical tie-in A flag, set by actions in the grammar rules, which alters the way tokens are parsed. @xref{Lexical Tie-ins}. @item Literal string token A token which constists of two or more fixed characters. @xref{Symbols}. @item Look-ahead token A token already read but not yet shifted. @xref{Look-Ahead, ,Look-Ahead Tokens}. @item LALR(1) The class of context-free grammars that Bison (like most other parser generators) can handle; a subset of LR(1). @xref{Mystery Conflicts, , Mysterious Reduce/Reduce Conflicts}. @item LR(1) The class of context-free grammars in which at most one token of look-ahead is needed to disambiguate the parsing of any piece of input. @item Nonterminal symbol A grammar symbol standing for a grammatical construct that can be expressed through rules in terms of smaller constructs; in other words, a construct that is not a token. @xref{Symbols}. @item Parse error An error encountered during parsing of an input stream due to invalid syntax. @xref{Error Recovery}. @item Parser A function that recognizes valid sentences of a language by analyzing the syntax structure of a set of tokens passed to it from a lexical analyzer. @item Postfix operator An arithmetic operator that is placed after the operands upon which it performs some operation. @item Reduction Replacing a string of nonterminals and/or terminals with a single nonterminal, according to a grammar rule. @xref{Algorithm, ,The Bison Parser Algorithm }. @item Reentrant A reentrant subprogram is a subprogram which can be in invoked any number of times in parallel, without interference between the various invocations. @xref{Pure Decl, ,A Pure (Reentrant) Parser}. @item Reverse polish notation A language in which all operators are postfix operators. @item Right recursion A rule whose result symbol is also its last component symbol; for example, @samp{expseq1: exp ',' expseq1;}. @xref{Recursion, ,Recursive Rules}. @item Semantics In computer languages, the semantics are specified by the actions taken for each instance of the language, i.e., the meaning of each statement. @xref{Semantics, ,Defining Language Semantics}. @item Shift A parser is said to shift when it makes the choice of analyzing further input from the stream rather than reducing immediately some already-recognized rule. @xref{Algorithm, ,The Bison Parser Algorithm }. @item Single-character literal A single character that is recognized and interpreted as is. @xref{Grammar in Bison, ,From Formal Rules to Bison Input}. @item Start symbol The nonterminal symbol that stands for a complete valid utterance in the language being parsed. The start symbol is usually listed as the first nonterminal symbol in a language specification. @xref{Start Decl, ,The Start-Symbol}. @item Symbol table A data structure where symbol names and associated data are stored during parsing to allow for recognition and use of existing information in repeated uses of a symbol. @xref{Multi-function Calc}. @item Token A basic, grammatically indivisible unit of a language. The symbol that describes a token in the grammar is a terminal symbol. The input of the Bison parser is a stream of tokens which comes from the lexical analyzer. @xref{Symbols}. @item Terminal symbol A grammar symbol that has no rules in the grammar and therefore is grammatically indivisible. The piece of text it represents is a token. @xref{Language and Grammar, ,Languages and Context-Free Grammars}. @end table @node Index, , Glossary, Top @unnumbered Index @printindex cp @contents @bye @c old menu * Introduction:: * Conditions:: * Copying:: The GNU General Public License says how you can copy and share Bison Tutorial sections: * Concepts:: Basic concepts for understanding Bison. * Examples:: Three simple explained examples of using Bison. Reference sections: * Grammar File:: Writing Bison declarations and rules. * Interface:: C-language interface to the parser function @code{yyparse}. * Algorithm:: How the Bison parser works at run-time. * Error Recovery:: Writing rules for error recovery. * Context Dependency::What to do if your language syntax is too messy for Bison to handle straightforwardly. * Debugging:: Debugging Bison parsers that parse wrong. * Invocation:: How to run Bison (to produce the parser source file). * Table of Symbols:: All the keywords of the Bison language are explained. * Glossary:: Basic concepts are explained. * Index:: Cross-references to the text. dibbler-1.0.1/bison++/FlexLexer.h0000664000175000017500000001411112233256142013344 00000000000000// -*-C++-*- // FlexLexer.h -- define interfaces for lexical analyzer classes generated // by flex // Copyright (c) 1993 The Regents of the University of California. // All rights reserved. // // This code is derived from software contributed to Berkeley by // Kent Williams and Tom Epperly. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions // are met: // 1. Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // 2. Redistributions in binary form must reproduce the above copyright // notice, this list of conditions and the following disclaimer in the // documentation and/or other materials provided with the distribution. // Neither the name of the University nor the names of its contributors // may be used to endorse or promote products derived from this software // without specific prior written permission. // THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR // IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED // WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR // PURPOSE. // This file defines FlexLexer, an abstract class which specifies the // external interface provided to flex C++ lexer objects, and yyFlexLexer, // which defines a particular lexer class. // // If you want to create multiple lexer classes, you use the -P flag // to rename each yyFlexLexer to some other xxFlexLexer. You then // include in your other sources once per lexer class: // // #undef yyFlexLexer // #define yyFlexLexer xxFlexLexer // #include // // #undef yyFlexLexer // #define yyFlexLexer zzFlexLexer // #include // ... #ifndef __FLEX_LEXER_H // Never included before - need to define base class. #define __FLEX_LEXER_H #include # ifndef FLEX_STD # define FLEX_STD std:: # endif extern "C++" { struct yy_buffer_state; typedef int yy_state_type; class FlexLexer { public: virtual ~FlexLexer() { } const char* YYText() const { return yytext; } int YYLeng() const { return yyleng; } virtual void yy_switch_to_buffer( struct yy_buffer_state* new_buffer ) = 0; virtual struct yy_buffer_state* yy_create_buffer( FLEX_STD istream* s, int size ) = 0; virtual void yy_delete_buffer( struct yy_buffer_state* b ) = 0; virtual void yyrestart( FLEX_STD istream* s ) = 0; virtual int yylex() = 0; // Call yylex with new input/output sources. int yylex( FLEX_STD istream* new_in, FLEX_STD ostream* new_out = 0 ) { switch_streams( new_in, new_out ); return yylex(); } // Switch to new input/output streams. A nil stream pointer // indicates "keep the current one". virtual void switch_streams( FLEX_STD istream* new_in = 0, FLEX_STD ostream* new_out = 0 ) = 0; int lineno() const { return yylineno; } int debug() const { return yy_flex_debug; } void set_debug( int flag ) { yy_flex_debug = flag; } protected: char* yytext; int yyleng; int yylineno; // only maintained if you use %option yylineno int yy_flex_debug; // only has effect with -d or "%option debug" }; } #endif // FLEXLEXER_H #if defined(yyFlexLexer) || ! defined(yyFlexLexerOnce) // Either this is the first time through (yyFlexLexerOnce not defined), // or this is a repeated include to define a different flavor of // yyFlexLexer, as discussed in the flex manual. #define yyFlexLexerOnce extern "C++" { class yyFlexLexer : public FlexLexer { public: // arg_yyin and arg_yyout default to the cin and cout, but we // only make that assignment when initializing in yylex(). yyFlexLexer( FLEX_STD istream* arg_yyin = 0, FLEX_STD ostream* arg_yyout = 0 ); virtual ~yyFlexLexer(); void yy_switch_to_buffer( struct yy_buffer_state* new_buffer ); struct yy_buffer_state* yy_create_buffer( FLEX_STD istream* s, int size ); void yy_delete_buffer( struct yy_buffer_state* b ); void yyrestart( FLEX_STD istream* s ); void yypush_buffer_state( struct yy_buffer_state* new_buffer ); void yypop_buffer_state(); virtual int yylex(); virtual void switch_streams( FLEX_STD istream* new_in, FLEX_STD ostream* new_out = 0 ); virtual int yywrap(); protected: virtual int LexerInput( char* buf, int max_size ); virtual void LexerOutput( const char* buf, int size ); virtual void LexerError( const char* msg ); void yyunput( int c, char* buf_ptr ); int yyinput(); void yy_load_buffer_state(); void yy_init_buffer( struct yy_buffer_state* b, FLEX_STD istream* s ); void yy_flush_buffer( struct yy_buffer_state* b ); int yy_start_stack_ptr; int yy_start_stack_depth; int* yy_start_stack; void yy_push_state( int new_state ); void yy_pop_state(); int yy_top_state(); yy_state_type yy_get_previous_state(); yy_state_type yy_try_NUL_trans( yy_state_type current_state ); int yy_get_next_buffer(); FLEX_STD istream* yyin; // input source for default LexerInput FLEX_STD ostream* yyout; // output sink for default LexerOutput // yy_hold_char holds the character lost when yytext is formed. char yy_hold_char; // Number of characters read into yy_ch_buf. int yy_n_chars; // Points to current character in buffer. char* yy_c_buf_p; int yy_init; // whether we need to initialize int yy_start; // start state number // Flag which is used to allow yywrap()'s to do buffer switches // instead of setting up a fresh yyin. A bit of a hack ... int yy_did_buffer_switch_on_eof; size_t yy_buffer_stack_top; /**< index of top of stack. */ size_t yy_buffer_stack_max; /**< capacity of stack. */ struct yy_buffer_state ** yy_buffer_stack; /**< Stack as an array. */ void yyensure_buffer_stack(void); // The following are not always needed, but may be depending // on use of certain flex features (like REJECT or yymore()). yy_state_type yy_last_accepting_state; char* yy_last_accepting_cpos; yy_state_type* yy_state_buf; yy_state_type* yy_state_ptr; char* yy_full_match; int* yy_full_state; int yy_full_lp; int yy_lp; int yy_looking_for_trail_begin; int yy_more_flag; int yy_more_len; int yy_more_offset; int yy_prev_more_offset; }; } #endif // yyFlexLexer || ! yyFlexLexerOnce dibbler-1.0.1/bison++/lex.h0000664000175000017500000000274212233256142012245 00000000000000/* Token type definitions for bison's input reader, Copyright (C) 1984, 1989 Free Software Foundation, Inc. This file is part of Bison, the GNU Compiler Compiler. Bison 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. Bison 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 Bison; see the file COPYING. If not, write to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ #define ENDFILE 0 #define IDENTIFIER 1 #define COMMA 2 #define COLON 3 #define SEMICOLON 4 #define BAR 5 #define LEFT_CURLY 6 #define TWO_PERCENTS 7 #define PERCENT_LEFT_CURLY 8 #define TOKEN 9 #define NTERM 10 #define GUARD 11 #define TYPE 12 #define UNION 13 #define START 14 #define LEFT 15 #define RIGHT 16 #define NONASSOC 17 #define PREC 18 #define SEMANTIC_PARSER 19 #define PURE_PARSER 20 #define TYPENAME 21 #define NUMBER 22 #define EXPECT 23 #define PERCENT_LEFT_CURLY_HEADER 24 #define PARSER_NAME 25 #define DEFINE_SYM 26 #define ILLEGAL 27 #define MAXTOKEN 1024 dibbler-1.0.1/bison++/main.cc0000664000175000017500000001021012233256142012524 00000000000000/* Top level entry point of bison, Copyright (C) 1984, 1986, 1989 Free Software Foundation, Inc. This file is part of Bison, the GNU Compiler Compiler. Bison 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. Bison 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 Bison; see the file COPYING. If not, write to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ #include #include using namespace std; #include "system.h" #include "machine.h" /* JF for MAXSHORT */ bool bison_compability; extern int lineno; extern int verboseflag; /* Nonzero means failure has been detected; don't write a parser file. */ int failure; /* The name this program was run with, for messages. */ char *program_name; extern void getargs(int,char**), openfiles(), reader(), reduce_grammar(); extern void set_derives(), set_nullable(), generate_states(); extern void lalr(), initialize_conflicts(), verbose(), terse(); extern void output(), done(int); void fatal(const char*); extern int fixed_outfiles; string getName(string FullPath) { int i = FullPath.length()-2; while(i > 0 && FullPath[i] != '/') i--; if(i<=0 || i+1>= FullPath.length()-1) return FullPath; else return FullPath.substr(i+1,FullPath.length()-1); } /* VMS complained about using `int'. */ int main(int argc, char** argv) { program_name = argv[0]; failure = 0; lineno = 0; getargs(argc, argv); string onlyName = getName(string(program_name)); if(onlyName != "bison++") { bison_compability=true; } else { if(onlyName != "yacc") fixed_outfiles = 1; bison_compability=false; } openfiles(); /* read the input. Copy some parts of it to fguard, faction, ftable and fattrs. In file reader.c. The other parts are recorded in the grammar; see gram.h. */ reader(); /* find useless nonterminals and productions and reduce the grammar. In file reduce.c */ reduce_grammar(); /* record other info about the grammar. In files derives and nullable. */ set_derives(); set_nullable(); /* convert to nondeterministic finite state machine. In file LR0. See state.h for more info. */ generate_states(); /* make it deterministic. In file lalr. */ lalr(); /* Find and record any conflicts: places where one token of lookahead is not enough to disambiguate the parsing. In file conflicts. Currently this does not do anything to resolve them; the trivial form of conflict resolution that exists is done in output. */ initialize_conflicts(); /* print information about results, if requested. In file print. */ if (verboseflag) verbose(); else terse(); /* output the tables and the parser to ftable. In file output. */ output(); done(failure); } /* functions to report errors which prevent a parser from being generated */ void toomany(char* s) { char buffer[200]; /* JF new msg */ sprintf(buffer, "limit of %d exceeded, too many %s", MAXSHORT, s); fatal(buffer); } void berror(char* s) { fprintf(stderr, "internal error, %s\n", s); abort(); } void fatal(const char* s) { extern char *infile; if (infile == 0) fprintf(stderr, "fatal error: %s\n", s); else fprintf(stderr, "\"%s\", line %d: %s\n", infile, lineno, s); done(1); } void fatals(const char* fmt,void* x1) { char buffer[200]; sprintf(buffer, fmt, x1); fatal(buffer); } void fatals(const char* fmt,void* x1,void* x2) { char buffer[200]; sprintf(buffer, fmt, x1,x2); fatal(buffer); } void fatals(const char* fmt,void* x1,void* x2,void* x3) { char buffer[200]; sprintf(buffer, fmt, x1,x2,x3); fatal(buffer); } void fatals(const char* fmt,void* x1,void* x2,void* x3,void* x4) { char buffer[200]; sprintf(buffer, fmt, x1,x2,x3,x4); fatal(buffer); } dibbler-1.0.1/bison++/bison.info-10000664000175000017500000014207412233256142013434 00000000000000This is bison.info, produced by makeinfo version 4.1 from bison.texinfo. START-INFO-DIR-ENTRY * bison: (bison). GNU Project parser generator (yacc replacement). END-INFO-DIR-ENTRY This file documents the Bison parser generator. Copyright (C) 1988, 89, 90, 91, 92, 93, 95, 98, 1999 Free Software Foundation, Inc. Permission is granted to make and distribute verbatim copies of this manual provided the copyright notice and this permission notice are preserved on all copies. Permission is granted to copy and distribute modified versions of this manual under the conditions for verbatim copying, provided also that the sections entitled "GNU General Public License" and "Conditions for Using Bison" are included exactly as in the original, and provided that the entire resulting derived work is distributed under the terms of a permission notice identical to this one. Permission is granted to copy and distribute translations of this manual into another language, under the above conditions for modified versions, except that the sections entitled "GNU General Public License", "Conditions for Using Bison" and this permission notice may be included in translations approved by the Free Software Foundation instead of in the original English.  File: bison.info, Node: Top, Next: Introduction, Prev: (dir), Up: (dir) This manual documents version 2.21.5 of Bison. * Menu: * Introduction:: * Conditions:: * Copying:: The GNU General Public License says how you can copy and share Bison Tutorial sections: * Concepts:: Basic concepts for understanding Bison. * Examples:: Three simple explained examples of using Bison. Reference sections: * Grammar File:: Writing Bison declarations and rules. * Interface:: C-language interface to the parser function `yyparse'. * Algorithm:: How the Bison parser works at run-time. * Error Recovery:: Writing rules for error recovery. * Context Dependency:: What to do if your language syntax is too messy for Bison to handle straightforwardly. * Debugging:: Debugging Bison parsers that parse wrong. * Invocation:: How to run Bison (to produce the parser source file). * Table of Symbols:: All the keywords of the Bison language are explained. * Glossary:: Basic concepts are explained. * Index:: Cross-references to the text. --- The Detailed Node Listing --- The Concepts of Bison * Language and Grammar:: Languages and context-free grammars, as mathematical ideas. * Grammar in Bison:: How we represent grammars for Bison's sake. * Semantic Values:: Each token or syntactic grouping can have a semantic value (the value of an integer, the name of an identifier, etc.). * Semantic Actions:: Each rule can have an action containing C code. * Bison Parser:: What are Bison's input and output, how is the output used? * Stages:: Stages in writing and running Bison grammars. * Grammar Layout:: Overall structure of a Bison grammar file. Examples * RPN Calc:: Reverse polish notation calculator; a first example with no operator precedence. * Infix Calc:: Infix (algebraic) notation calculator. Operator precedence is introduced. * Simple Error Recovery:: Continuing after syntax errors. * Multi-function Calc:: Calculator with memory and trig functions. It uses multiple data-types for semantic values. * Exercises:: Ideas for improving the multi-function calculator. Reverse Polish Notation Calculator * Decls: Rpcalc Decls. Bison and C declarations for rpcalc. * Rules: Rpcalc Rules. Grammar Rules for rpcalc, with explanation. * Lexer: Rpcalc Lexer. The lexical analyzer. * Main: Rpcalc Main. The controlling function. * Error: Rpcalc Error. The error reporting function. * Gen: Rpcalc Gen. Running Bison on the grammar file. * Comp: Rpcalc Compile. Run the C compiler on the output code. Grammar Rules for `rpcalc' * Rpcalc Input:: * Rpcalc Line:: * Rpcalc Expr:: Multi-Function Calculator: `mfcalc' * Decl: Mfcalc Decl. Bison declarations for multi-function calculator. * Rules: Mfcalc Rules. Grammar rules for the calculator. * Symtab: Mfcalc Symtab. Symbol table management subroutines. Bison Grammar Files * Grammar Outline:: Overall layout of the grammar file. * Symbols:: Terminal and nonterminal symbols. * Rules:: How to write grammar rules. * Recursion:: Writing recursive rules. * Semantics:: Semantic values and actions. * Declarations:: All kinds of Bison declarations are described here. * Multiple Parsers:: Putting more than one Bison parser in one program. Outline of a Bison Grammar * C Declarations:: Syntax and usage of the C declarations section. * Bison Declarations:: Syntax and usage of the Bison declarations section. * Grammar Rules:: Syntax and usage of the grammar rules section. * C Code:: Syntax and usage of the additional C code section. Defining Language Semantics * Value Type:: Specifying one data type for all semantic values. * Multiple Types:: Specifying several alternative data types. * Actions:: An action is the semantic definition of a grammar rule. * Action Types:: Specifying data types for actions to operate on. * Mid-Rule Actions:: Most actions go at the end of a rule. This says when, why and how to use the exceptional action in the middle of a rule. Bison Declarations * Token Decl:: Declaring terminal symbols. * Precedence Decl:: Declaring terminals with precedence and associativity. * Union Decl:: Declaring the set of all semantic value types. * Type Decl:: Declaring the choice of type for a nonterminal symbol. * Expect Decl:: Suppressing warnings about shift/reduce conflicts. * Start Decl:: Specifying the start symbol. * Pure Decl:: Requesting a reentrant parser. * Decl Summary:: Table of all Bison declarations. Parser C-Language Interface * Parser Function:: How to call `yyparse' and what it returns. * Lexical:: You must supply a function `yylex' which reads tokens. * Error Reporting:: You must supply a function `yyerror'. * Action Features:: Special features for use in actions. The Lexical Analyzer Function `yylex' * Calling Convention:: How `yyparse' calls `yylex'. * Token Values:: How `yylex' must return the semantic value of the token it has read. * Token Positions:: How `yylex' must return the text position (line number, etc.) of the token, if the actions want that. * Pure Calling:: How the calling convention differs in a pure parser (*note A Pure (Reentrant) Parser: Pure Decl.). The Bison Parser Algorithm * Look-Ahead:: Parser looks one token ahead when deciding what to do. * Shift/Reduce:: Conflicts: when either shifting or reduction is valid. * Precedence:: Operator precedence works by resolving conflicts. * Contextual Precedence:: When an operator's precedence depends on context. * Parser States:: The parser is a finite-state-machine with stack. * Reduce/Reduce:: When two rules are applicable in the same situation. * Mystery Conflicts:: Reduce/reduce conflicts that look unjustified. * Stack Overflow:: What happens when stack gets full. How to avoid it. Operator Precedence * Why Precedence:: An example showing why precedence is needed. * Using Precedence:: How to specify precedence in Bison grammars. * Precedence Examples:: How these features are used in the previous example. * How Precedence:: How they work. Handling Context Dependencies * Semantic Tokens:: Token parsing can depend on the semantic context. * Lexical Tie-ins:: Token parsing can depend on the syntactic context. * Tie-in Recovery:: Lexical tie-ins have implications for how error recovery rules must be written. Invoking Bison * Bison Options:: All the options described in detail, in alphabetical order by short options. * Option Cross Key:: Alphabetical list of long options. * VMS Invocation:: Bison command syntax on VMS.  File: bison.info, Node: Introduction, Next: Conditions, Prev: Top, Up: Top Introduction ************ "Bison" is a general-purpose parser generator that converts a grammar description for an LALR(1) context-free grammar into a C program to parse that grammar. Once you are proficient with Bison, you may use it to develop a wide range of language parsers, from those used in simple desk calculators to complex programming languages. Bison is upward compatible with Yacc: all properly-written Yacc grammars ought to work with Bison with no change. Anyone familiar with Yacc should be able to use Bison with little trouble. You need to be fluent in C programming in order to use Bison or to understand this manual. We begin with tutorial chapters that explain the basic concepts of using Bison and show three explained examples, each building on the last. If you don't know Bison or Yacc, start by reading these chapters. Reference chapters follow which describe specific aspects of Bison in detail. Bison was written primarily by Robert Corbett; Richard Stallman made it Yacc-compatible. Wilfred Hansen of Carnegie Mellon University added multicharacter string literals and other features. This edition corresponds to version 2.21.5 of Bison.  File: bison.info, Node: Conditions, Next: Copying, Prev: Introduction, Up: Top Conditions for Using Bison ************************** As of Bison version 1.24, we have changed the distribution terms for `yyparse' to permit using Bison's output in non-free programs. Formerly, Bison parsers could be used only in programs that were free software. The other GNU programming tools, such as the GNU C compiler, have never had such a requirement. They could always be used for non-free software. The reason Bison was different was not due to a special policy decision; it resulted from applying the usual General Public License to all of the Bison source code. The output of the Bison utility--the Bison parser file--contains a verbatim copy of a sizable piece of Bison, which is the code for the `yyparse' function. (The actions from your grammar are inserted into this function at one point, but the rest of the function is not changed.) When we applied the GPL terms to the code for `yyparse', the effect was to restrict the use of Bison output to free software. We didn't change the terms because of sympathy for people who want to make software proprietary. *Software should be free.* But we concluded that limiting Bison's use to free software was doing little to encourage people to make other software free. So we decided to make the practical conditions for using Bison match the practical conditions for using the other GNU tools.  File: bison.info, Node: Copying, Next: Concepts, Prev: Conditions, Up: Top GNU GENERAL PUBLIC LICENSE ************************** Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc. 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble ======== The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Library General Public License instead.) You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and modification follow. TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. 1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a. You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. b. You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. c. If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: a. Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, b. Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, c. Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. 6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. 7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. 10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs ============================================= If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. ONE LINE TO GIVE THE PROGRAM'S NAME AND A BRIEF IDEA OF WHAT IT DOES. Copyright (C) 19YY NAME OF AUTHOR 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. Also add information on how to contact you by electronic and paper mail. If the program is interactive, make it output a short notice like this when it starts in an interactive mode: Gnomovision version 69, Copyright (C) 19YY NAME OF AUTHOR Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker. SIGNATURE OF TY COON, 1 April 1989 Ty Coon, President of Vice This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Library General Public License instead of this License.  File: bison.info, Node: Concepts, Next: Examples, Prev: Copying, Up: Top The Concepts of Bison ********************* This chapter introduces many of the basic concepts without which the details of Bison will not make sense. If you do not already know how to use Bison or Yacc, we suggest you start by reading this chapter carefully. * Menu: * Language and Grammar:: Languages and context-free grammars, as mathematical ideas. * Grammar in Bison:: How we represent grammars for Bison's sake. * Semantic Values:: Each token or syntactic grouping can have a semantic value (the value of an integer, the name of an identifier, etc.). * Semantic Actions:: Each rule can have an action containing C code. * Bison Parser:: What are Bison's input and output, how is the output used? * Stages:: Stages in writing and running Bison grammars. * Grammar Layout:: Overall structure of a Bison grammar file.  File: bison.info, Node: Language and Grammar, Next: Grammar in Bison, Up: Concepts Languages and Context-Free Grammars =================================== In order for Bison to parse a language, it must be described by a "context-free grammar". This means that you specify one or more "syntactic groupings" and give rules for constructing them from their parts. For example, in the C language, one kind of grouping is called an `expression'. One rule for making an expression might be, "An expression can be made of a minus sign and another expression". Another would be, "An expression can be an integer". As you can see, rules are often recursive, but there must be at least one rule which leads out of the recursion. The most common formal system for presenting such rules for humans to read is "Backus-Naur Form" or "BNF", which was developed in order to specify the language Algol 60. Any grammar expressed in BNF is a context-free grammar. The input to Bison is essentially machine-readable BNF. Not all context-free languages can be handled by Bison, only those that are LALR(1). In brief, this means that it must be possible to tell how to parse any portion of an input string with just a single token of look-ahead. Strictly speaking, that is a description of an LR(1) grammar, and LALR(1) involves additional restrictions that are hard to explain simply; but it is rare in actual practice to find an LR(1) grammar that fails to be LALR(1). *Note Mysterious Reduce/Reduce Conflicts: Mystery Conflicts, for more information on this. In the formal grammatical rules for a language, each kind of syntactic unit or grouping is named by a "symbol". Those which are built by grouping smaller constructs according to grammatical rules are called "nonterminal symbols"; those which can't be subdivided are called "terminal symbols" or "token types". We call a piece of input corresponding to a single terminal symbol a "token", and a piece corresponding to a single nonterminal symbol a "grouping". We can use the C language as an example of what symbols, terminal and nonterminal, mean. The tokens of C are identifiers, constants (numeric and string), and the various keywords, arithmetic operators and punctuation marks. So the terminal symbols of a grammar for C include `identifier', `number', `string', plus one symbol for each keyword, operator or punctuation mark: `if', `return', `const', `static', `int', `char', `plus-sign', `open-brace', `close-brace', `comma' and many more. (These tokens can be subdivided into characters, but that is a matter of lexicography, not grammar.) Here is a simple C function subdivided into tokens: int /* keyword `int' */ square (x) /* identifier, open-paren, */ /* identifier, close-paren */ int x; /* keyword `int', identifier, semicolon */ { /* open-brace */ return x * x; /* keyword `return', identifier, */ /* asterisk, identifier, semicolon */ } /* close-brace */ The syntactic groupings of C include the expression, the statement, the declaration, and the function definition. These are represented in the grammar of C by nonterminal symbols `expression', `statement', `declaration' and `function definition'. The full grammar uses dozens of additional language constructs, each with its own nonterminal symbol, in order to express the meanings of these four. The example above is a function definition; it contains one declaration, and one statement. In the statement, each `x' is an expression and so is `x * x'. Each nonterminal symbol must have grammatical rules showing how it is made out of simpler constructs. For example, one kind of C statement is the `return' statement; this would be described with a grammar rule which reads informally as follows: A `statement' can be made of a `return' keyword, an `expression' and a `semicolon'. There would be many other rules for `statement', one for each kind of statement in C. One nonterminal symbol must be distinguished as the special one which defines a complete utterance in the language. It is called the "start symbol". In a compiler, this means a complete input program. In the C language, the nonterminal symbol `sequence of definitions and declarations' plays this role. For example, `1 + 2' is a valid C expression--a valid part of a C program--but it is not valid as an _entire_ C program. In the context-free grammar of C, this follows from the fact that `expression' is not the start symbol. The Bison parser reads a sequence of tokens as its input, and groups the tokens using the grammar rules. If the input is valid, the end result is that the entire token sequence reduces to a single grouping whose symbol is the grammar's start symbol. If we use a grammar for C, the entire input must be a `sequence of definitions and declarations'. If not, the parser reports a syntax error.  File: bison.info, Node: Grammar in Bison, Next: Semantic Values, Prev: Language and Grammar, Up: Concepts From Formal Rules to Bison Input ================================ A formal grammar is a mathematical construct. To define the language for Bison, you must write a file expressing the grammar in Bison syntax: a "Bison grammar" file. *Note Bison Grammar Files: Grammar File. A nonterminal symbol in the formal grammar is represented in Bison input as an identifier, like an identifier in C. By convention, it should be in lower case, such as `expr', `stmt' or `declaration'. The Bison representation for a terminal symbol is also called a "token type". Token types as well can be represented as C-like identifiers. By convention, these identifiers should be upper case to distinguish them from nonterminals: for example, `INTEGER', `IDENTIFIER', `IF' or `RETURN'. A terminal symbol that stands for a particular keyword in the language should be named after that keyword converted to upper case. The terminal symbol `error' is reserved for error recovery. *Note Symbols::. A terminal symbol can also be represented as a character literal, just like a C character constant. You should do this whenever a token is just a single character (parenthesis, plus-sign, etc.): use that same character in a literal as the terminal symbol for that token. A third way to represent a terminal symbol is with a C string constant containing several characters. *Note Symbols::, for more information. The grammar rules also have an expression in Bison syntax. For example, here is the Bison rule for a C `return' statement. The semicolon in quotes is a literal character token, representing part of the C syntax for the statement; the naked semicolon, and the colon, are Bison punctuation used in every rule. stmt: RETURN expr ';' ; *Note Syntax of Grammar Rules: Rules.  File: bison.info, Node: Semantic Values, Next: Semantic Actions, Prev: Grammar in Bison, Up: Concepts Semantic Values =============== A formal grammar selects tokens only by their classifications: for example, if a rule mentions the terminal symbol `integer constant', it means that _any_ integer constant is grammatically valid in that position. The precise value of the constant is irrelevant to how to parse the input: if `x+4' is grammatical then `x+1' or `x+3989' is equally grammatical. But the precise value is very important for what the input means once it is parsed. A compiler is useless if it fails to distinguish between 4, 1 and 3989 as constants in the program! Therefore, each token in a Bison grammar has both a token type and a "semantic value". *Note Defining Language Semantics: Semantics, for details. The token type is a terminal symbol defined in the grammar, such as `INTEGER', `IDENTIFIER' or `',''. It tells everything you need to know to decide where the token may validly appear and how to group it with other tokens. The grammar rules know nothing about tokens except their types. The semantic value has all the rest of the information about the meaning of the token, such as the value of an integer, or the name of an identifier. (A token such as `','' which is just punctuation doesn't need to have any semantic value.) For example, an input token might be classified as token type `INTEGER' and have the semantic value 4. Another input token might have the same token type `INTEGER' but value 3989. When a grammar rule says that `INTEGER' is allowed, either of these tokens is acceptable because each is an `INTEGER'. When the parser accepts the token, it keeps track of the token's semantic value. Each grouping can also have a semantic value as well as its nonterminal symbol. For example, in a calculator, an expression typically has a semantic value that is a number. In a compiler for a programming language, an expression typically has a semantic value that is a tree structure describing the meaning of the expression.  File: bison.info, Node: Semantic Actions, Next: Bison Parser, Prev: Semantic Values, Up: Concepts Semantic Actions ================ In order to be useful, a program must do more than parse input; it must also produce some output based on the input. In a Bison grammar, a grammar rule can have an "action" made up of C statements. Each time the parser recognizes a match for that rule, the action is executed. *Note Actions::. Most of the time, the purpose of an action is to compute the semantic value of the whole construct from the semantic values of its parts. For example, suppose we have a rule which says an expression can be the sum of two expressions. When the parser recognizes such a sum, each of the subexpressions has a semantic value which describes how it was built up. The action for this rule should create a similar sort of value for the newly recognized larger expression. For example, here is a rule that says an expression can be the sum of two subexpressions: expr: expr '+' expr { $$ = $1 + $3; } ; The action says how to produce the semantic value of the sum expression from the values of the two subexpressions.  File: bison.info, Node: Bison Parser, Next: Stages, Prev: Semantic Actions, Up: Concepts Bison Output: the Parser File ============================= When you run Bison, you give it a Bison grammar file as input. The output is a C source file that parses the language described by the grammar. This file is called a "Bison parser". Keep in mind that the Bison utility and the Bison parser are two distinct programs: the Bison utility is a program whose output is the Bison parser that becomes part of your program. The job of the Bison parser is to group tokens into groupings according to the grammar rules--for example, to build identifiers and operators into expressions. As it does this, it runs the actions for the grammar rules it uses. The tokens come from a function called the "lexical analyzer" that you must supply in some fashion (such as by writing it in C). The Bison parser calls the lexical analyzer each time it wants a new token. It doesn't know what is "inside" the tokens (though their semantic values may reflect this). Typically the lexical analyzer makes the tokens by parsing characters of text, but Bison does not depend on this. *Note The Lexical Analyzer Function `yylex': Lexical. The Bison parser file is C code which defines a function named `yyparse' which implements that grammar. This function does not make a complete C program: you must supply some additional functions. One is the lexical analyzer. Another is an error-reporting function which the parser calls to report an error. In addition, a complete C program must start with a function called `main'; you have to provide this, and arrange for it to call `yyparse' or the parser will never run. *Note Parser C-Language Interface: Interface. Aside from the token type names and the symbols in the actions you write, all variable and function names used in the Bison parser file begin with `yy' or `YY'. This includes interface functions such as the lexical analyzer function `yylex', the error reporting function `yyerror' and the parser function `yyparse' itself. This also includes numerous identifiers used for internal purposes. Therefore, you should avoid using C identifiers starting with `yy' or `YY' in the Bison grammar file except for the ones defined in this manual.  File: bison.info, Node: Stages, Next: Grammar Layout, Prev: Bison Parser, Up: Concepts Stages in Using Bison ===================== The actual language-design process using Bison, from grammar specification to a working compiler or interpreter, has these parts: 1. Formally specify the grammar in a form recognized by Bison (*note Bison Grammar Files: Grammar File.). For each grammatical rule in the language, describe the action that is to be taken when an instance of that rule is recognized. The action is described by a sequence of C statements. 2. Write a lexical analyzer to process input and pass tokens to the parser. The lexical analyzer may be written by hand in C (*note The Lexical Analyzer Function `yylex': Lexical.). It could also be produced using Lex, but the use of Lex is not discussed in this manual. 3. Write a controlling function that calls the Bison-produced parser. 4. Write error-reporting routines. To turn this source code as written into a runnable program, you must follow these steps: 1. Run Bison on the grammar to produce the parser. 2. Compile the code output by Bison, as well as any other source files. 3. Link the object files to produce the finished product.  File: bison.info, Node: Grammar Layout, Prev: Stages, Up: Concepts The Overall Layout of a Bison Grammar ===================================== The input file for the Bison utility is a "Bison grammar file". The general form of a Bison grammar file is as follows: %{ C DECLARATIONS %} BISON DECLARATIONS %% GRAMMAR RULES %% ADDITIONAL C CODE The `%%', `%{' and `%}' are punctuation that appears in every Bison grammar file to separate the sections. The C declarations may define types and variables used in the actions. You can also use preprocessor commands to define macros used there, and use `#include' to include header files that do any of these things. The Bison declarations declare the names of the terminal and nonterminal symbols, and may also describe operator precedence and the data types of semantic values of various symbols. The grammar rules define how to construct each nonterminal symbol from its parts. The additional C code can contain any C code you want to use. Often the definition of the lexical analyzer `yylex' goes here, plus subroutines called by the actions in the grammar rules. In a simple program, all the rest of the program can go here.  File: bison.info, Node: Examples, Next: Grammar File, Prev: Concepts, Up: Top Examples ******** Now we show and explain three sample programs written using Bison: a reverse polish notation calculator, an algebraic (infix) notation calculator, and a multi-function calculator. All three have been tested under BSD Unix 4.3; each produces a usable, though limited, interactive desk-top calculator. These examples are simple, but Bison grammars for real programming languages are written the same way. You can copy these examples out of the Info file and into a source file to try them. * Menu: * RPN Calc:: Reverse polish notation calculator; a first example with no operator precedence. * Infix Calc:: Infix (algebraic) notation calculator. Operator precedence is introduced. * Simple Error Recovery:: Continuing after syntax errors. * Multi-function Calc:: Calculator with memory and trig functions. It uses multiple data-types for semantic values. * Exercises:: Ideas for improving the multi-function calculator.  File: bison.info, Node: RPN Calc, Next: Infix Calc, Up: Examples Reverse Polish Notation Calculator ================================== The first example is that of a simple double-precision "reverse polish notation" calculator (a calculator using postfix operators). This example provides a good starting point, since operator precedence is not an issue. The second example will illustrate how operator precedence is handled. The source code for this calculator is named `rpcalc.y'. The `.y' extension is a convention used for Bison input files. * Menu: * Decls: Rpcalc Decls. Bison and C declarations for rpcalc. * Rules: Rpcalc Rules. Grammar Rules for rpcalc, with explanation. * Lexer: Rpcalc Lexer. The lexical analyzer. * Main: Rpcalc Main. The controlling function. * Error: Rpcalc Error. The error reporting function. * Gen: Rpcalc Gen. Running Bison on the grammar file. * Comp: Rpcalc Compile. Run the C compiler on the output code.  File: bison.info, Node: Rpcalc Decls, Next: Rpcalc Rules, Up: RPN Calc Declarations for `rpcalc' ------------------------- Here are the C and Bison declarations for the reverse polish notation calculator. As in C, comments are placed between `/*...*/'. /* Reverse polish notation calculator. */ %{ #define YYSTYPE double #include %} %token NUM %% /* Grammar rules and actions follow */ The C declarations section (*note The C Declarations Section: C Declarations.) contains two preprocessor directives. The `#define' directive defines the macro `YYSTYPE', thus specifying the C data type for semantic values of both tokens and groupings (*note Data Types of Semantic Values: Value Type.). The Bison parser will use whatever type `YYSTYPE' is defined as; if you don't define it, `int' is the default. Because we specify `double', each token and each expression has an associated value, which is a floating point number. The `#include' directive is used to declare the exponentiation function `pow'. The second section, Bison declarations, provides information to Bison about the token types (*note The Bison Declarations Section: Bison Declarations.). Each terminal symbol that is not a single-character literal must be declared here. (Single-character literals normally don't need to be declared.) In this example, all the arithmetic operators are designated by single-character literals, so the only terminal symbol that needs to be declared is `NUM', the token type for numeric constants. dibbler-1.0.1/bison++/lex.cc0000664000175000017500000002436212233256142012405 00000000000000/* Token-reader for Bison's input parser, Copyright (C) 1984, 1986, 1989 Free Software Foundation, Inc. This file is part of Bison, the GNU Compiler Compiler. Bison 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. Bison 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 Bison; see the file COPYING. If not, write to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ /* lex() is the entry point. It is called from reader.c. It returns one of the token-type codes defined in lex.h. When an identifier is seen, the code IDENTIFIER is returned and the name is looked up in the symbol table using symtab.c; symval is set to a pointer to the entry found. */ #include #include #include "system.h" #include "files.h" #include "symtab.h" #include "lex.h" #include "new.h" extern int lineno; extern int translations; int parse_percent_token(); extern void fatal(const char*); extern void fatals(const char*,void*); extern void fatals(const char*,void*,void*); extern void fatals(const char*,void*,void*,void*); extern void fatals(const char*,void*,void*,void*,void*); extern void fatals(const char*,void*,void*,void*,void*,void*); /* Buffer for storing the current token. */ char *token_buffer; /* Allocated size of token_buffer, not including space for terminator. */ static int maxtoken; bucket *symval; int numval; static int unlexed; /* these two describe a token to be reread */ static bucket *unlexed_symval; /* by the next call to lex */ void init_lex() { maxtoken = 100; token_buffer = NEW2 (maxtoken + 1, char); unlexed = -1; } static char * grow_token_buffer (char* p) { int offset = p - token_buffer; maxtoken *= 2; token_buffer = (char *) xrealloc(token_buffer, maxtoken + 1); return token_buffer + offset; } int skip_white_space() { register int c; register int inside; c = getc(finput); for (;;) { int cplus_comment; switch (c) { case '/': c = getc(finput); if (c != '*' && c != '/') fatals("unexpected `/%c' found", (void*) c); cplus_comment = (c == '/'); c = getc(finput); inside = 1; while (inside) { if (!cplus_comment && c == '*') { while (c == '*') c = getc(finput); if (c == '/') { inside = 0; c = getc(finput); } } else if (c == '\n') { lineno++; if (cplus_comment) inside = 0; c = getc(finput); } else if (c == EOF) fatal("unterminated comment"); else c = getc(finput); } break; case '\n': lineno++; case ' ': case '\t': case '\f': c = getc(finput); break; default: return (c); } } } void unlex(int token) { unlexed = token; unlexed_symval = symval; } int lex() { register int c; register char *p; if (unlexed >= 0) { symval = unlexed_symval; c = unlexed; unlexed = -1; return (c); } c = skip_white_space(); switch (c) { case EOF: return (ENDFILE); case 'A': case 'B': case 'C': case 'D': case 'E': case 'F': case 'G': case 'H': case 'I': case 'J': case 'K': case 'L': case 'M': case 'N': case 'O': case 'P': case 'Q': case 'R': case 'S': case 'T': case 'U': case 'V': case 'W': case 'X': case 'Y': case 'Z': case 'a': case 'b': case 'c': case 'd': case 'e': case 'f': case 'g': case 'h': case 'i': case 'j': case 'k': case 'l': case 'm': case 'n': case 'o': case 'p': case 'q': case 'r': case 's': case 't': case 'u': case 'v': case 'w': case 'x': case 'y': case 'z': case '.': case '_': p = token_buffer; while (isalnum(c) || c == '_' || c == '.') { if (p == token_buffer + maxtoken) p = grow_token_buffer(p); *p++ = c; c = getc(finput); } *p = 0; ungetc(c, finput); symval = getsym(token_buffer); return (IDENTIFIER); case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': { numval = 0; while (isdigit(c)) { numval = numval*10 + c - '0'; c = getc(finput); } ungetc(c, finput); return (NUMBER); } case '\'': translations = -1; /* parse the literal token and compute character code in code */ c = getc(finput); { register int code = 0; if (c == '\\') { c = getc(finput); if (c <= '7' && c >= '0') { while (c <= '7' && c >= '0') { code = (code * 8) + (c - '0'); c = getc(finput); if (code >= 256 || code < 0) fatals("malformatted literal token `\\%03o'", (void*) code); } } else { if (c == 't') code = '\t'; else if (c == 'n') code = '\n'; else if (c == 'a') code = '\007'; else if (c == 'r') code = '\r'; else if (c == 'f') code = '\f'; else if (c == 'b') code = '\b'; else if (c == 'v') code = 013; else if (c == 'x') { c = getc(finput); while ((c <= '9' && c >= '0') || (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z')) { code *= 16; if (c <= '9' && c >= '0') code += c - '0'; else if (c >= 'a' && c <= 'z') code += c - 'a' + 10; else if (c >= 'A' && c <= 'Z') code += c - 'A' + 10; if (code >= 256 || code<0)/* JF this said if(c>=128) */ fatals("malformatted literal token `\\x%x'",(void*) code); c = getc(finput); } ungetc(c, finput); } else if (c == '\\') code = '\\'; else if (c == '\'') code = '\''; else if (c == '\"') /* JF this is a good idea */ code = '\"'; else { if (c >= 040 && c <= 0177) fatals ("unknown escape sequence `\\%c'", (void*) c); else fatals ("unknown escape sequence: `\\' followed by char code 0x%x", (void*) c); } c = getc(finput); } } else { code = c; c = getc(finput); } if (c != '\'') fatal("multicharacter literal tokens not supported"); /* now fill token_buffer with the canonical name for this character as a literal token. Do not use what the user typed, so that '\012' and '\n' can be interchangeable. */ p = token_buffer; *p++ = '\''; if (code == '\\') { *p++ = '\\'; *p++ = '\\'; } else if (code == '\'') { *p++ = '\\'; *p++ = '\''; } else if (code >= 040 && code != 0177) *p++ = code; else if (code == '\t') { *p++ = '\\'; *p++ = 't'; } else if (code == '\n') { *p++ = '\\'; *p++ = 'n'; } else if (code == '\r') { *p++ = '\\'; *p++ = 'r'; } else if (code == '\v') { *p++ = '\\'; *p++ = 'v'; } else if (code == '\b') { *p++ = '\\'; *p++ = 'b'; } else if (code == '\f') { *p++ = '\\'; *p++ = 'f'; } else { *p++ = code / 0100 + '0'; *p++ = ((code / 010) & 07) + '0'; *p++ = (code & 07) + '0'; } *p++ = '\''; *p = 0; symval = getsym(token_buffer); symval->internalClass = STOKEN; if (! symval->user_token_number) symval->user_token_number = code; return (IDENTIFIER); } case ',': return (COMMA); case ':': return (COLON); case ';': return (SEMICOLON); case '|': return (BAR); case '{': return (LEFT_CURLY); case '=': do { c = getc(finput); if (c == '\n') lineno++; } while(c==' ' || c=='\n' || c=='\t'); if (c == '{') return(LEFT_CURLY); else { ungetc(c, finput); return(ILLEGAL); } case '<': p = token_buffer; c = getc(finput); while (c != '>') { if (c == '\n' || c == EOF) fatal("unterminated type name"); if (p == token_buffer + maxtoken) p = grow_token_buffer(p); *p++ = c; c = getc(finput); } *p = 0; return (TYPENAME); case '%': return (parse_percent_token()); default: return (ILLEGAL); } } /* parse a token which starts with %. Assumes the % has already been read and discarded. */ int parse_percent_token () { register int c; register char *p; p = token_buffer; c = getc(finput); switch (c) { case '%': return (TWO_PERCENTS); case '{': return (PERCENT_LEFT_CURLY); case '<': return (LEFT); case '>': return (RIGHT); case '2': return (NONASSOC); case '0': return (TOKEN); case '=': return (PREC); } if (!isalpha(c)) return (ILLEGAL); while (isalpha(c) || c == '_') { if (p == token_buffer + maxtoken) p = grow_token_buffer(p); *p++ = c; c = getc(finput); } ungetc(c, finput); *p = 0; if (strcmp(token_buffer, "token") == 0 || strcmp(token_buffer, "term") == 0) return (TOKEN); else if (strcmp(token_buffer, "nterm") == 0) return (NTERM); else if (strcmp(token_buffer, "type") == 0) return (TYPE); else if (strcmp(token_buffer, "guard") == 0) return (GUARD); else if (strcmp(token_buffer, "union") == 0) return (UNION); else if (strcmp(token_buffer, "expect") == 0) return (EXPECT); else if (strcmp(token_buffer, "start") == 0) return (START); else if (strcmp(token_buffer, "left") == 0) return (LEFT); else if (strcmp(token_buffer, "right") == 0) return (RIGHT); else if (strcmp(token_buffer, "nonassoc") == 0 || strcmp(token_buffer, "binary") == 0) return (NONASSOC); else if (strcmp(token_buffer, "semantic_parser") == 0) return (SEMANTIC_PARSER); else if (strcmp(token_buffer, "pure_parser") == 0) return (PURE_PARSER); else if (strcmp(token_buffer, "prec") == 0) return (PREC); else if (strcmp(token_buffer, "name") == 0) return (PARSER_NAME); else if (strcmp(token_buffer, "define") == 0) return (DEFINE_SYM); else if (strcmp(token_buffer, "header") == 0) { c=getc(finput); if(c=='{') return (PERCENT_LEFT_CURLY_HEADER); else return (ILLEGAL); } else return (ILLEGAL); } dibbler-1.0.1/bison++/lr0.cc0000664000175000017500000003643212233256142012313 00000000000000/* Generate the nondeterministic finite state machine for bison, Copyright (C) 1984, 1986, 1989 Free Software Foundation, Inc. This file is part of Bison, the GNU Compiler Compiler. Bison 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. Bison 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 Bison; see the file COPYING. If not, write to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ /* See comments in state.h for the data structures that represent it. The entry point is generate_states. */ #include #include "system.h" #include "machine.h" #include "new.h" #include "gram.h" #include "state.h" extern char *nullable; extern short *itemset; extern short *itemsetend; int nstates; int final_state; core *first_state; shifts *first_shift; reductions *first_reduction; int get_state(int); core *new_state(int); void new_itemsets(); void append_states(); void initialize_states(); void save_shifts(); void save_reductions(); void augment_automaton(); void insert_start_shift(); extern void initialize_closure(int); extern void closure(short*,int); extern void finalize_closure(); extern void toomany(char*); static core *this_state; static core *last_state; static shifts *last_shift; static reductions *last_reduction; static int nshifts; static short *shift_symbol; static short *redset; static short *shiftset; static short **kernel_base; static short **kernel_end; static short *kernel_items; /* hash table for states, to recognize equivalent ones. */ #define STATE_TABLE_SIZE 1009 static core **state_table; void allocate_itemsets() { register short *itemp; register int symbol; register int i; register int count; register short *symbol_count; count = 0; symbol_count = NEW2(nsyms, short); itemp = ritem; symbol = *itemp++; while (symbol) { if (symbol > 0) { count++; symbol_count[symbol]++; } symbol = *itemp++; } /* see comments before new_itemsets. All the vectors of items live inside kernel_items. The number of active items after some symbol cannot be more than the number of times that symbol appears as an item, which is symbol_count[symbol]. We allocate that much space for each symbol. */ kernel_base = NEW2(nsyms, short *); kernel_items = NEW2(count, short); count = 0; for (i = 0; i < nsyms; i++) { kernel_base[i] = kernel_items + count; count += symbol_count[i]; } shift_symbol = symbol_count; kernel_end = NEW2(nsyms, short *); } void allocate_storage() { allocate_itemsets(); shiftset = NEW2(nsyms, short); redset = NEW2(nrules + 1, short); state_table = NEW2(STATE_TABLE_SIZE, core *); } void free_storage() { FREE(shift_symbol); FREE(redset); FREE(shiftset); FREE(kernel_base); FREE(kernel_end); FREE(kernel_items); FREE(state_table); } /* compute the nondeterministic finite state machine (see state.h for details) from the grammar. */ void generate_states() { allocate_storage(); initialize_closure(nitems); initialize_states(); while (this_state) { /* Set up ruleset and itemset for the transitions out of this state. ruleset gets a 1 bit for each rule that could reduce now. itemset gets a vector of all the items that could be accepted next. */ closure(this_state->items, this_state->nitems); /* record the reductions allowed out of this state */ save_reductions(); /* find the itemsets of the states that shifts can reach */ new_itemsets(); /* find or create the core structures for those states */ append_states(); /* create the shifts structures for the shifts to those states, now that the state numbers transitioning to are known */ if (nshifts > 0) save_shifts(); /* states are queued when they are created; process them all */ this_state = this_state->next; } /* discard various storage */ finalize_closure(); free_storage(); /* set up initial and final states as parser wants them */ augment_automaton(); } /* Find which symbols can be shifted in the current state, and for each one record which items would be active after that shift. Uses the contents of itemset. shift_symbol is set to a vector of the symbols that can be shifted. For each symbol in the grammar, kernel_base[symbol] points to a vector of item numbers activated if that symbol is shifted, and kernel_end[symbol] points after the end of that vector. */ void new_itemsets() { register int i; register int shiftcount; register short *isp; register short *ksp; register int symbol; #ifdef TRACE fprintf(stderr, "Entering new_itemsets\n"); #endif for (i = 0; i < nsyms; i++) kernel_end[i] = NULL; shiftcount = 0; isp = itemset; while (isp < itemsetend) { i = *isp++; symbol = ritem[i]; if (symbol > 0) { ksp = kernel_end[symbol]; if (!ksp) { shift_symbol[shiftcount++] = symbol; ksp = kernel_base[symbol]; } *ksp++ = i + 1; kernel_end[symbol] = ksp; } } nshifts = shiftcount; } /* Use the information computed by new_itemsets to find the state numbers reached by each shift transition from the current state. shiftset is set up as a vector of state numbers of those states. */ void append_states() { register int i; register int j; register int symbol; #ifdef TRACE fprintf(stderr, "Entering append_states\n"); #endif /* first sort shift_symbol into increasing order */ for (i = 1; i < nshifts; i++) { symbol = shift_symbol[i]; j = i; while (j > 0 && shift_symbol[j - 1] > symbol) { shift_symbol[j] = shift_symbol[j - 1]; j--; } shift_symbol[j] = symbol; } for (i = 0; i < nshifts; i++) { symbol = shift_symbol[i]; shiftset[i] = get_state(symbol); } } /* find the state number for the state we would get to (from the current state) by shifting symbol. Create a new state if no equivalent one exists already. Used by append_states */ int get_state(int symbol) { register int key; register short *isp1; register short *isp2; register short *iend; register core *sp; register int found; int n; #ifdef TRACE fprintf(stderr, "Entering get_state, symbol = %d\n", symbol); #endif isp1 = kernel_base[symbol]; iend = kernel_end[symbol]; n = iend - isp1; /* add up the target state's active item numbers to get a hash key */ key = 0; while (isp1 < iend) key += *isp1++; key = key % STATE_TABLE_SIZE; sp = state_table[key]; if (sp) { found = 0; while (!found) { if (sp->nitems == n) { found = 1; isp1 = kernel_base[symbol]; isp2 = sp->items; while (found && isp1 < iend) { if (*isp1++ != *isp2++) found = 0; } } if (!found) { if (sp->link) { sp = sp->link; } else /* bucket exhausted and no match */ { sp = sp->link = new_state(symbol); found = 1; } } } } else /* bucket is empty */ { state_table[key] = sp = new_state(symbol); } return (sp->number); } /* subroutine of get_state. create a new state for those items, if necessary. */ core * new_state(int symbol) { register int n; register core *p; register short *isp1; register short *isp2; register short *iend; #ifdef TRACE fprintf(stderr, "Entering new_state, symbol = %d\n", symbol); #endif if (nstates >= MAXSHORT) toomany("states"); isp1 = kernel_base[symbol]; iend = kernel_end[symbol]; n = iend - isp1; p = (core *) xmalloc((unsigned) (sizeof(core) + (n - 1) * sizeof(short))); p->accessing_symbol = symbol; p->number = nstates; p->nitems = n; isp2 = p->items; while (isp1 < iend) *isp2++ = *isp1++; last_state->next = p; last_state = p; nstates++; return (p); } void initialize_states() { register core *p; /* register unsigned *rp1; JF unused */ /* register unsigned *rp2; JF unused */ /* register unsigned *rend; JF unused */ p = (core *) xmalloc((unsigned) (sizeof(core) - sizeof(short))); first_state = last_state = this_state = p; nstates = 1; } void save_shifts() { register shifts *p; register short *sp1; register short *sp2; register short *send; p = (shifts *) xmalloc((unsigned) (sizeof(shifts) + (nshifts - 1) * sizeof(short))); p->number = this_state->number; p->nshifts = nshifts; sp1 = shiftset; sp2 = p->internalShifts; send = shiftset + nshifts; while (sp1 < send) *sp2++ = *sp1++; if (last_shift) { last_shift->next = p; last_shift = p; } else { first_shift = p; last_shift = p; } } /* find which rules can be used for reduction transitions from the current state and make a reductions structure for the state to record their rule numbers. */ void save_reductions() { register short *isp; register short *rp1; register short *rp2; register int item; register int count; register reductions *p; short *rend; /* find and count the active items that represent ends of rules */ count = 0; for (isp = itemset; isp < itemsetend; isp++) { item = ritem[*isp]; if (item < 0) { redset[count++] = -item; } } /* make a reductions structure and copy the data into it. */ if (count) { p = (reductions *) xmalloc((unsigned) (sizeof(reductions) + (count - 1) * sizeof(short))); p->number = this_state->number; p->nreds = count; rp1 = redset; rp2 = p->rules; rend = rp1 + count; while (rp1 < rend) *rp2++ = *rp1++; if (last_reduction) { last_reduction->next = p; last_reduction = p; } else { first_reduction = p; last_reduction = p; } } } /* Make sure that the initial state has a shift that accepts the grammar's start symbol and goes to the next-to-final state, which has a shift going to the final state, which has a shift to the termination state. Create such states and shifts if they don't happen to exist already. */ void augment_automaton() { register int i; register int k; /* register int found; JF unused */ register core *statep; register shifts *sp; register shifts *sp2; register shifts *sp1; sp = first_shift; if (sp) { if (sp->number == 0) { k = sp->nshifts; statep = first_state->next; /* The states reached by shifts from first_state are numbered 1...K. Look for one reached by start_symbol. */ while (statep->accessing_symbol < start_symbol && statep->number < k) statep = statep->next; if (statep->accessing_symbol == start_symbol) { /* We already have a next-to-final state. Make sure it has a shift to what will be the final state. */ k = statep->number; while (sp && sp->number < k) { sp1 = sp; sp = sp->next; } if (sp && sp->number == k) { sp2 = (shifts *) xmalloc((unsigned) (sizeof(shifts) + sp->nshifts * sizeof(short))); sp2->number = k; sp2->nshifts = sp->nshifts + 1; sp2->internalShifts[0] = nstates; for (i = sp->nshifts; i > 0; i--) sp2->internalShifts[i] = sp->internalShifts[i - 1]; /* Patch sp2 into the chain of shifts in place of sp, following sp1. */ sp2->next = sp->next; sp1->next = sp2; if (sp == last_shift) last_shift = sp2; FREE(sp); } else { sp2 = NEW(shifts); sp2->number = k; sp2->nshifts = 1; sp2->internalShifts[0] = nstates; /* Patch sp2 into the chain of shifts between sp1 and sp. */ sp2->next = sp; sp1->next = sp2; if (sp == 0) last_shift = sp2; } } else { /* There is no next-to-final state as yet. */ /* Add one more shift in first_shift, going to the next-to-final state (yet to be made). */ sp = first_shift; sp2 = (shifts *) xmalloc(sizeof(shifts) + sp->nshifts * sizeof(short)); sp2->nshifts = sp->nshifts + 1; /* Stick this shift into the vector at the proper place. */ statep = first_state->next; for (k = 0, i = 0; i < sp->nshifts; k++, i++) { if (statep->accessing_symbol > start_symbol && i == k) sp2->internalShifts[k++] = nstates; sp2->internalShifts[k] = sp->internalShifts[i]; statep = statep->next; } if (i == k) sp2->internalShifts[k++] = nstates; /* Patch sp2 into the chain of shifts in place of sp, at the beginning. */ sp2->next = sp->next; first_shift = sp2; if (last_shift == sp) last_shift = sp2; FREE(sp); /* Create the next-to-final state, with shift to what will be the final state. */ insert_start_shift(); } } else { /* The initial state didn't even have any shifts. Give it one shift, to the next-to-final state. */ sp = NEW(shifts); sp->nshifts = 1; sp->internalShifts[0] = nstates; /* Patch sp into the chain of shifts at the beginning. */ sp->next = first_shift; first_shift = sp; /* Create the next-to-final state, with shift to what will be the final state. */ insert_start_shift(); } } else { /* There are no shifts for any state. Make one shift, from the initial state to the next-to-final state. */ sp = NEW(shifts); sp->nshifts = 1; sp->internalShifts[0] = nstates; /* Initialize the chain of shifts with sp. */ first_shift = sp; last_shift = sp; /* Create the next-to-final state, with shift to what will be the final state. */ insert_start_shift(); } /* Make the final state--the one that follows a shift from the next-to-final state. The symbol for that shift is 0 (end-of-file). */ statep = (core *) xmalloc((unsigned) (sizeof(core) - sizeof(short))); statep->number = nstates; last_state->next = statep; last_state = statep; /* Make the shift from the final state to the termination state. */ sp = NEW(shifts); sp->number = nstates++; sp->nshifts = 1; sp->internalShifts[0] = nstates; last_shift->next = sp; last_shift = sp; /* Note that the variable `final_state' refers to what we sometimes call the termination state. */ final_state = nstates; /* Make the termination state. */ statep = (core *) xmalloc((unsigned) (sizeof(core) - sizeof(short))); statep->number = nstates++; last_state->next = statep; last_state = statep; } /* subroutine of augment_automaton. Create the next-to-final state, to which a shift has already been made in the initial state. */ void insert_start_shift() { register core *statep; register shifts *sp; statep = (core *) xmalloc((unsigned) (sizeof(core) - sizeof(short))); statep->number = nstates; statep->accessing_symbol = start_symbol; last_state->next = statep; last_state = statep; /* Make a shift from this state to (what will be) the final state. */ sp = NEW(shifts); sp->number = nstates++; sp->nshifts = 1; sp->internalShifts[0] = nstates; last_shift->next = sp; last_shift = sp; } dibbler-1.0.1/bison++/warshall.cc0000664000175000017500000000456012233256142013430 00000000000000/* Generate transitive closure of a matrix, Copyright (C) 1984, 1989 Free Software Foundation, Inc. This file is part of Bison, the GNU Compiler Compiler. Bison 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. Bison 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 Bison; see the file COPYING. If not, write to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ #include #include "system.h" #include "machine.h" /* given n by n matrix of bits R, modify its contents to be the transive closure of what was given. */ void TC(unsigned* R, int n) { register int rowsize; register unsigned mask; register unsigned *rowj; register unsigned *rp; register unsigned *rend; register unsigned *ccol; unsigned *relend; unsigned *cword; unsigned *rowi; rowsize = WORDSIZE(n) * sizeof(unsigned); relend = (unsigned *) ((char *) R + (n * rowsize)); cword = R; mask = 1; rowi = R; while (rowi < relend) { ccol = cword; rowj = R; while (rowj < relend) { if (*ccol & mask) { rp = rowi; rend = (unsigned *) ((char *) rowj + rowsize); while (rowj < rend) *rowj++ |= *rp++; } else { rowj = (unsigned *) ((char *) rowj + rowsize); } ccol = (unsigned *) ((char *) ccol + rowsize); } mask <<= 1; if (mask == 0) { mask = 1; cword++; } rowi = (unsigned *) ((char *) rowi + rowsize); } } /* Reflexive Transitive Closure. Same as TC and then set all the bits on the diagonal of R. */ void RTC(unsigned* R, int n) { register int rowsize; register unsigned mask; register unsigned *rp; register unsigned *relend; TC(R, n); rowsize = WORDSIZE(n) * sizeof(unsigned); relend = (unsigned *) ((char *) R + n*rowsize); mask = 1; rp = R; while (rp < relend) { *rp |= mask; mask <<= 1; if (mask == 0) { mask = 1; rp++; } rp = (unsigned *) ((char *) rp + rowsize); } } dibbler-1.0.1/bison++/COPYING0000664000175000017500000004307612233256142012344 00000000000000 GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc. 675 Mass Ave, Cambridge, MA 02139, USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Library General Public License instead.) You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and modification follow. GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. 1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. 6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. 7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. 10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS Appendix: How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) 19yy 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., 675 Mass Ave, Cambridge, MA 02139, USA. Also add information on how to contact you by electronic and paper mail. If the program is interactive, make it output a short notice like this when it starts in an interactive mode: Gnomovision version 69, Copyright (C) 19yy name of author Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker. , 1 April 1989 Ty Coon, President of Vice This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Library General Public License instead of this License. dibbler-1.0.1/bison++/Makefile.am0000644000175000017500000000254412277722750013351 00000000000000bin_PROGRAMS = bison++ AUTOMAKE_OPTIONS = foreign bison___SOURCES = closure.cc alloca.c\ derives.cc \ getargs.cc \ getopt1.cc \ lalr.cc \ lr0.cc \ nullable.cc \ print.cc \ reduce.cc \ version.cc \ warshall.cc \ allocate.cc \ conflict.cc \ files.cc \ getopt.cc \ gram.cc \ lex.cc \ main.cc \ output.cc \ reader.cc \ symtab.cc\ old.c \ files.h FlexLexer.h getopt.h gram.h lex.h machine.h new.h \ state.h symtab.h system.h types.h dist_noinst_DATA = bison.cc bison.hairy bison.h dist_noinst_DATA += bison++.1 bison++.1.dman bison.cld dist_noinst_DATA += bison.info bison.info-1 bison.info-2 dist_noinst_DATA += bison.info-3 bison.info-4 bison.info-5 dist_noinst_DATA += bison_pp.mak bison.ps.gz dist_noinst_DATA += bison.rnh bison.texinfo dist_noinst_DATA += bison++.yacc bison++.yacc.1 dist_noinst_DATA += README++ REFERENCES version.texi #info_TEXINFOS = bison.texinfo #man_MANS = bison++.1 bison.1 bison++.yacc.1 pkgdata_DATA = bison.cc bison.hairy bison.h Example CXX=g++ PFILE = bison.cc PFILE1 = bison.hairy HFILE = bison.h AM_CPPFLAGS = -DXPFILE=\"$(datadir)/bison++/$(PFILE)\" \ -DXHFILE=\"$(datadir)/bison++/$(HFILE)\" \ -DXPFILE1=\"$(datadir)/bison++/$(PFILE1)\" install-exec-hook: cp bison $(bindir) cp bison++.yacc $(bindir) uninstall-hook: rm $(bindir)/bison++.yacc rm $(bindir)/bison dibbler-1.0.1/bison++/bison.rnh0000664000175000017500000000730012233256142013122 00000000000000.! .! RUNOFF source file for BISON.HLP .! .! This is a RUNOFF input file which will produce a VMS help file .! for the VMS HELP library. .! .! Date of last revision: June 21, 1992 .! .! .! Eric Youngdale .! .literal .end literal .no paging .no flags all .right margin 70 .left margin 1 .indent -1 1 BISON .skip The BISON command invokes the GNU BISON parser generator. .skip .literal BISON file-spec .end literal .skip .indent -1 2 Parameters .skip file-spec .skip Here file-spec is the grammar file name, which usually ends in .y. The parser file's name is made by replacing the .y with _tab.c. Thus, the command bison foo.y yields foo_tab.c. .skip .indent -1 2 Qualifiers .skip The following is the list of available qualifiers for BISON: .literal /DEBUG /DEFINES /FILE_PREFIX=prefix /FIXED_OUTFILES /NAME_PREFIX=prefix /NOLINES /OUTPUT=outfilefile /VERBOSE /VERSION /YACC .end literal .skip .indent -1 2 /DEBUG .skip Output a definition of the macro YYDEBUG into the parser file, so that the debugging facilities are compiled. .skip .indent -1 2 /DEFINES .skip Write an extra output file containing macro definitions for the token type names defined in the grammar and the semantic value type YYSTYPE, as well as a extern variable declarations. .skip If the parser output file is named "name.c" then this file is named "name.h". .skip This output file is essential if you wish to put the definition of yylex in a separate source file, because yylex needs to be able to refer to token type codes and the variable yylval. .skip .indent -1 2 /FILE_PREFIX .skip .literal /FILIE_PREFIX=prefix .end literal .skip Specify a prefix to use for all Bison output file names. The names are chosen as if the input file were named prefix.c .skip .indent -1 2 /FIXED_OUTFILES .skip Equivalent to /OUTPUT=y_tab.c; the parser output file is called y_tab.c, and the other outputs are called y.output and y_tab.h. The purpose of this switch is to imitate Yacc's output file name conventions. The /YACC qualifier is functionally equivalent to /FIXED_OUTFILES. The following command definition will work as a substitute for Yacc: .literal $YACC:==BISON/FIXED_OUTFILES .end literal .skip .indent -1 2 /NAME_PREFIX .skip .literal /NAME_PREFIX=prefix .end literal .skip Rename the external symbols used in the parser so that they start with "prefix" instead of "yy". The precise list of symbols renamed is yyparse, yylex, yyerror, yylval, yychar and yydebug. For example, if you use /NAME_PREFIX="c", the names become cparse, clex, and so on. .skip .indent -1 2 /NOLINES .skip Don't put any "#line" preprocessor commands in the parser file. Ordinarily Bison puts them in the parser file so that the C compiler and debuggers will associate errors with your source file, the grammar file. This option causes them to associate errors with the parser file, treating it an independent source file in its own right. .skip .indent -1 2 /OUTPUT .skip .literal /OUTPUT=outfile .end literal .skip Specify the name "outfile" for the parser file. .skip .indent -1 2 /VERBOSE .skip Write an extra output file containing verbose descriptions of the parser states and what is done for each type of look-ahead token in that state. .skip This file also describes all the conflicts, both those resolved by operator precedence and the unresolved ones. .skip The file's name is made by removing _tab.c or .c from the parser output file name, and adding .output instead. .skip Therefore, if the input file is foo.y, then the parser file is called foo_tab.c by default. As a consequence, the verbose output file is called foo.output. .skip .indent -1 2 /VERSION .skip Print the version number of Bison. .skip .indent -1 2 /YACC .skip See /FIXED_OUTFILES. .skip .indent -1 dibbler-1.0.1/bison++/gram.cc0000664000175000017500000000253112233256142012535 00000000000000/* Allocate input grammar variables for bison, Copyright (C) 1984, 1986, 1989 Free Software Foundation, Inc. This file is part of Bison, the GNU Compiler Compiler. Bison 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. Bison 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 Bison; see the file COPYING. If not, write to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ /* comments for these variables are in gram.h */ int nitems; int nrules; int nsyms; int ntokens; int nvars; short *ritem; short *rlhs; short *rrhs; short *rprec; short *rprecsym; short *sprec; short *rassoc; short *sassoc; short *token_translations; short *rline; int start_symbol; int translations; int max_user_token_number; int semantic_parser; int pure_parser; int error_token_number; /* This is to avoid linker problems which occur on VMS when using GCC, when the file in question contains data definitions only. */ void dummy() { } dibbler-1.0.1/bison++/bison++.yacc0000775000175000017500000000003612233256142013402 00000000000000#!/bin/sh exec bison -y "$@"dibbler-1.0.1/bison++/reduce.cc0000664000175000017500000003362012233256142013061 00000000000000/* Grammar reduction for Bison. Copyright (C) 1988, 1989 Free Software Foundation, Inc. This file is part of Bison, the GNU Compiler Compiler. Bison 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. Bison 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 Bison; see the file COPYING. If not, write to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ /* * Reduce the grammar: Find and eliminate unreachable terminals, * nonterminals, and productions. David S. Bakin. */ /* * Don't eliminate unreachable terminals: They may be used by the user's * parser. */ #include #include "system.h" #include "files.h" #include "gram.h" #include "machine.h" #include "new.h" extern char **tags; /* reader.c */ extern int verboseflag; /* getargs.c */ static int statisticsflag; /* XXXXXXX */ #ifndef TRUE #define TRUE (1) #define FALSE (0) #endif typedef unsigned *BSet; typedef short *rule; /* * N is set of all nonterminals which are not useless. P is set of all rules * which have no useless nonterminals in their RHS. V is the set of all * accessible symbols. */ static BSet N, P, V, V1; static int nuseful_productions, nuseless_productions, nuseful_nonterminals, nuseless_nonterminals; static void useless_nonterminals(); static void inaccessable_symbols(); static void reduce_grammar_tables(); static void print_results(); static void print_notices(); void dump_grammar(); extern void fatals(const char*,void*); extern void fatals(const char*,void*,void*); extern void fatals(const char*,void*,void*,void*); extern void fatals(const char*,void*,void*,void*,void*); extern void fatals(const char*,void*,void*,void*,void*,void*); bool bits_equal (BSet L, BSet R, int n) { int i; for (i = n - 1; i >= 0; i--) if (L[i] != R[i]) return FALSE; return TRUE; } int nbits (unsigned i) { int count = 0; while (i != 0) { i ^= (i & -i); ++count; } return count; } int bits_size (BSet S, int n) { int i, count = 0; for (i = n - 1; i >= 0; i--) count += nbits(S[i]); return count; } void reduce_grammar () { bool reduced; /* Allocate the global sets used to compute the reduced grammar */ N = NEW2(WORDSIZE(nvars), unsigned); P = NEW2(WORDSIZE(nrules + 1), unsigned); V = NEW2(WORDSIZE(nsyms), unsigned); V1 = NEW2(WORDSIZE(nsyms), unsigned); useless_nonterminals(); inaccessable_symbols(); reduced = (bool) (nuseless_nonterminals + nuseless_productions > 0); if (verboseflag) print_results(); if (reduced == FALSE) goto done_reducing; print_notices(); if (!BITISSET(N, start_symbol - ntokens)) fatals("Start symbol %s does not derive any sentence.", tags[start_symbol]); reduce_grammar_tables(); /* if (verboseflag) { fprintf(foutput, "REDUCED GRAMMAR\n\n"); dump_grammar(); } */ /**/ statisticsflag = FALSE; /* someday getopts should handle this */ if (statisticsflag == TRUE) fprintf(stderr, "reduced %s defines %d terminal%s, %d nonterminal%s\ , and %d production%s.\n", infile, ntokens, (ntokens == 1 ? "" : "s"), nvars, (nvars == 1 ? "" : "s"), nrules, (nrules == 1 ? "" : "s")); done_reducing: /* Free the global sets used to compute the reduced grammar */ FREE(N); FREE(V); FREE(P); } /* * Another way to do this would be with a set for each production and then do * subset tests against N, but even for the C grammar the whole reducing * process takes only 2 seconds on my 8Mhz AT. */ static bool useful_production (int i, BSet N) { rule r; short n; /* * A production is useful if all of the nonterminals in its RHS * appear in the set of useful nonterminals. */ for (r = &ritem[rrhs[i]]; *r > 0; r++) if (ISVAR(n = *r)) if (!BITISSET(N, n - ntokens)) return FALSE; return TRUE; } /* Remember that rules are 1-origin, symbols are 0-origin. */ static void useless_nonterminals () { BSet Np, Ns; int i, n; /* * N is set as built. Np is set being built this iteration. P is set * of all productions which have a RHS all in N. */ Np = NEW2(WORDSIZE(nvars), unsigned); /* * The set being computed is a set of nonterminals which can derive * the empty string or strings consisting of all terminals. At each * iteration a nonterminal is added to the set if there is a * production with that nonterminal as its LHS for which all the * nonterminals in its RHS are already in the set. Iterate until the * set being computed remains unchanged. Any nonterminals not in the * set at that point are useless in that they will never be used in * deriving a sentence of the language. * * This iteration doesn't use any special traversal over the * productions. A set is kept of all productions for which all the * nonterminals in the RHS are in useful. Only productions not in * this set are scanned on each iteration. At the end, this set is * saved to be used when finding useful productions: only productions * in this set will appear in the final grammar. */ n = 0; while (1) { for (i = WORDSIZE(nvars) - 1; i >= 0; i--) Np[i] = N[i]; for (i = 1; i <= nrules; i++) { if (!BITISSET(P, i)) { if (useful_production(i, N)) { SETBIT(Np, rlhs[i] - ntokens); SETBIT(P, i); } } } if (bits_equal(N, Np, WORDSIZE(nvars))) break; Ns = Np; Np = N; N = Ns; } FREE(N); N = Np; } static void inaccessable_symbols () { BSet Vp, Vs, Pp; int i, n; short t; rule r; /* * Find out which productions are reachable and which symbols are * used. Starting with an empty set of productions and a set of * symbols which only has the start symbol in it, iterate over all * productions until the set of productions remains unchanged for an * iteration. For each production which has a LHS in the set of * reachable symbols, add the production to the set of reachable * productions, and add all of the nonterminals in the RHS of the * production to the set of reachable symbols. * * Consider only the (partially) reduced grammar which has only * nonterminals in N and productions in P. * * The result is the set P of productions in the reduced grammar, and * the set V of symbols in the reduced grammar. * * Although this algorithm also computes the set of terminals which are * reachable, no terminal will be deleted from the grammar. Some * terminals might not be in the grammar but might be generated by * semantic routines, and so the user might want them available with * specified numbers. (Is this true?) However, the nonreachable * terminals are printed (if running in verbose mode) so that the user * can know. */ Vp = NEW2(WORDSIZE(nsyms), unsigned); Pp = NEW2(WORDSIZE(nrules + 1), unsigned); /* If the start symbol isn't useful, then nothing will be useful. */ if (!BITISSET(N, start_symbol - ntokens)) goto end_iteration; SETBIT(V, start_symbol); n = 0; while (1) { for (i = WORDSIZE(nsyms) - 1; i >= 0; i--) Vp[i] = V[i]; for (i = 1; i <= nrules; i++) { if (!BITISSET(Pp, i) && BITISSET(P, i) && BITISSET(V, rlhs[i])) { for (r = &ritem[rrhs[i]]; *r >= 0; r++) { if (ISTOKEN(t = *r) || BITISSET(N, t - ntokens)) { SETBIT(Vp, t); } } SETBIT(Pp, i); } } if (bits_equal(V, Vp, WORDSIZE(nsyms))) { break; } Vs = Vp; Vp = V; V = Vs; } end_iteration: FREE(V); V = Vp; /* Tokens 0, 1, and 2 are internal to Bison. Consider them useful. */ SETBIT(V, 0); /* end-of-input token */ SETBIT(V, 1); /* error token */ SETBIT(V, 2); /* illegal token */ FREE(P); P = Pp; nuseful_productions = bits_size(P, WORDSIZE(nrules + 1)); nuseless_productions = nrules - nuseful_productions; nuseful_nonterminals = 0; for (i = ntokens; i < nsyms; i++) if (BITISSET(V, i)) nuseful_nonterminals++; nuseless_nonterminals = nvars - nuseful_nonterminals; /* A token that was used in %prec should not be warned about. */ for (i = 1; i < nrules; i++) if (rprecsym[i] != 0) SETBIT(V1, rprecsym[i]); } static void reduce_grammar_tables () { /* This is turned off because we would need to change the numbers in the case statements in the actions file. */ #if 0 /* remove useless productions */ if (nuseless_productions > 0) { short np, pn, ni, pi; np = 0; ni = 0; for (pn = 1; pn <= nrules; pn++) { if (BITISSET(P, pn)) { np++; if (pn != np) { rlhs[np] = rlhs[pn]; rline[np] = rline[pn]; rprec[np] = rprec[pn]; rassoc[np] = rassoc[pn]; rrhs[np] = rrhs[pn]; if (rrhs[np] != ni) { pi = rrhs[np]; rrhs[np] = ni; while (ritem[pi] >= 0) ritem[ni++] = ritem[pi++]; ritem[ni++] = -np; } } else { while (ritem[ni++] >= 0); } } } ritem[ni] = 0; nrules -= nuseless_productions; nitems = ni; /* * Is it worth it to reduce the amount of memory for the * grammar? Probably not. */ } #endif /* 0 */ /* Disable useless productions, since they may contain useless nonterms that would get mapped below to -1 and confuse everyone. */ if (nuseless_productions > 0) { int pn; for (pn = 1; pn <= nrules; pn++) { if (!BITISSET(P, pn)) { rlhs[pn] = -1; } } } /* remove useless symbols */ if (nuseless_nonterminals > 0) { int i, n; /* short j; JF unused */ short *nontermmap; rule r; /* * create a map of nonterminal number to new nonterminal * number. -1 in the map means it was useless and is being * eliminated. */ nontermmap = NEW2(nvars, short) - ntokens; for (i = ntokens; i < nsyms; i++) nontermmap[i] = -1; n = ntokens; for (i = ntokens; i < nsyms; i++) if (BITISSET(V, i)) nontermmap[i] = n++; /* Shuffle elements of tables indexed by symbol number. */ for (i = ntokens; i < nsyms; i++) { n = nontermmap[i]; if (n >= 0) { sassoc[n] = sassoc[i]; sprec[n] = sprec[i]; tags[n] = tags[i]; } else { free(tags[i]); } } /* Replace all symbol numbers in valid data structures. */ for (i = 1; i <= nrules; i++) { /* Ignore the rules disabled above. */ if (rlhs[i] >= 0) rlhs[i] = nontermmap[rlhs[i]]; if (ISVAR (rprecsym[i])) /* Can this happen? */ rprecsym[i] = nontermmap[rprecsym[i]]; } for (r = ritem; *r; r++) if (ISVAR(*r)) *r = nontermmap[*r]; start_symbol = nontermmap[start_symbol]; nsyms -= nuseless_nonterminals; nvars -= nuseless_nonterminals; free(&nontermmap[ntokens]); } } static void print_results () { int i; /* short j; JF unused */ rule r; bool b; if (nuseless_nonterminals > 0) { fprintf(foutput, "Useless nonterminals:\n\n"); for (i = ntokens; i < nsyms; i++) if (!BITISSET(V, i)) fprintf(foutput, " %s\n", tags[i]); } b = FALSE; for (i = 0; i < ntokens; i++) { if (!BITISSET(V, i) && !BITISSET(V1, i)) { if (!b) { fprintf(foutput, "\n\nTerminals which are not used:\n\n"); b = TRUE; } fprintf(foutput, " %s\n", tags[i]); } } if (nuseless_productions > 0) { fprintf(foutput, "\n\nUseless rules:\n\n"); for (i = 1; i <= nrules; i++) { if (!BITISSET(P, i)) { fprintf(foutput, "#%-4d ", i); fprintf(foutput, "%s :\t", tags[rlhs[i]]); for (r = &ritem[rrhs[i]]; *r >= 0; r++) { fprintf(foutput, " %s", tags[*r]); } fprintf(foutput, ";\n"); } } } if (nuseless_nonterminals > 0 || nuseless_productions > 0 || b) fprintf(foutput, "\n\n"); } void dump_grammar () { int i; rule r; fprintf(foutput, "ntokens = %d, nvars = %d, nsyms = %d, nrules = %d, nitems = %d\n\n", ntokens, nvars, nsyms, nrules, nitems); fprintf(foutput, "Variables\n---------\n\n"); fprintf(foutput, "Value Sprec Sassoc Tag\n"); for (i = ntokens; i < nsyms; i++) fprintf(foutput, "%5d %5d %5d %s\n", i, sprec[i], sassoc[i], tags[i]); fprintf(foutput, "\n\n"); fprintf(foutput, "Rules\n-----\n\n"); for (i = 1; i <= nrules; i++) { fprintf(foutput, "%-5d(%5d%5d)%5d : (@%-5d)", i, rprec[i], rassoc[i], rlhs[i], rrhs[i]); for (r = &ritem[rrhs[i]]; *r > 0; r++) fprintf(foutput, "%5d", *r); fprintf(foutput, " [%d]\n", -(*r)); } fprintf(foutput, "\n\n"); fprintf(foutput, "Rules interpreted\n-----------------\n\n"); for (i = 1; i <= nrules; i++) { fprintf(foutput, "%-5d %s :", i, tags[rlhs[i]]); for (r = &ritem[rrhs[i]]; *r > 0; r++) fprintf(foutput, " %s", tags[*r]); fprintf(foutput, "\n"); } fprintf(foutput, "\n\n"); } static void print_notices () { extern int fixed_outfiles; if (fixed_outfiles && nuseless_productions) fprintf(stderr, "%d rules never reduced\n", nuseless_productions); fprintf(stderr, "%s contains ", infile); if (nuseless_nonterminals > 0) { fprintf(stderr, "%d useless nonterminal%s", nuseless_nonterminals, (nuseless_nonterminals == 1 ? "" : "s")); } if (nuseless_nonterminals > 0 && nuseless_productions > 0) fprintf(stderr, " and "); if (nuseless_productions > 0) { fprintf(stderr, "%d useless rule%s", nuseless_productions, (nuseless_productions == 1 ? "" : "s")); } fprintf(stderr, ".\n"); fflush(stderr); } dibbler-1.0.1/bison++/bison++.yacc.10000664000175000017500000001156312233256142013545 00000000000000.TH BISON 1 local .SH NAME bison \- GNU Project parser generator (yacc replacement) .SH SYNOPSIS .B bison [ .BI \-b " file-prefix" ] [ .BI \-\-file-prefix= file-prefix ] [ .B \-d ] [ .B \-\-defines ] [ .B \-l ] [ .B \-\-no-lines ] [ .BI \-o " outfile" ] [ .BI \-\-output-file= outfile ] [ .BI \-p " prefix" ] [ .BI \-\-name-prefix= prefix ] [ .B \-t ] [ .B \-\-debug ] [ .B \-v ] [ .B \-\-verbose ] [ .B \-V ] [ .B \-\-version ] [ .B \-y ] [ .B \-\-yacc ] [ .B \-\-fixed-output-files ] file .SH DESCRIPTION .I Bison is a parser generator in the style of .IR yacc (1). It should be upwardly compatible with input files designed for .IR yacc . .PP Input files should follow the .I yacc convention of ending in .BR .y . Unlike .IR yacc , the generated files do not have fixed names, but instead use the prefix of the input file. For instance, a grammar description file named .B parse.y would produce the generated parser in a file named .BR parse.tab.c , instead of .IR yacc 's .BR y.tab.c . .PP This description of the options that can be given to .I bison is adapted from the node .B Invocation in the .B bison.texinfo manual, which should be taken as authoritative. .PP .I Bison supports both traditional single-letter options and mnemonic long option names. Long option names are indicated with .B \-\- instead of .BR \- . Abbreviations for option names are allowed as long as they are unique. When a long option takes an argument, like .BR \-\-file-prefix , connect the option name and the argument with .BR = . .SS OPTIONS .TP .BI \-b " file-prefix" .br .ns .TP .BI \-\-file-prefix= file-prefix Specify a prefix to use for all .I bison output file names. The names are chosen as if the input file were named \fIfile-prefix\fB.c\fR. .TP .B \-d .br .ns .TP .B \-\-defines Write an extra output file containing macro definitions for the token type names defined in the grammar and the semantic value type .BR YYSTYPE , as well as a few .B extern variable declarations. .sp If the parser output file is named \fIname\fB.c\fR then this file is named \fIname\fB.h\fR. .sp This output file is essential if you wish to put the definition of .B yylex in a separate source file, because .B yylex needs to be able to refer to token type codes and the variable .BR yylval . .TP .B \-l .br .ns .TP .B \-\-no-lines Don't put any .B #line preprocessor commands in the parser file. Ordinarily .I bison puts them in the parser file so that the C compiler and debuggers will associate errors with your source file, the grammar file. This option causes them to associate errors with the parser file, treating it an independent source file in its own right. .TP .BI \-o " outfile" .br .ns .TP .BI \-\-output-file= outfile Specify the name .I outfile for the parser file. .sp The other output files' names are constructed from .I outfile as described under the .B \-v and .B \-d switches. .TP .BI \-p " prefix" .br .ns .TP .BI \-\-name-prefix= prefix Rename the external symbols used in the parser so that they start with .I prefix instead of .BR yy . The precise list of symbols renamed is .BR yyparse , .BR yylex , .BR yyerror , .BR yylval , .BR yychar , and .BR yydebug . .sp For example, if you use .BR "\-p c" , the names become .BR cparse , .BR clex , and so on. .TP .B \-t .br .ns .TP .B \-\-debug Output a definition of the macro .B YYDEBUG into the parser file, so that the debugging facilities are compiled. .TP .B \-v .br .ns .TP .B \-\-verbose Write an extra output file containing verbose descriptions of the parser states and what is done for each type of look-ahead token in that state. .sp This file also describes all the conflicts, both those resolved by operator precedence and the unresolved ones. .sp The file's name is made by removing .B .tab.c or .B .c from the parser output file name, and adding .B .output instead. .sp Therefore, if the input file is .BR foo.y , then the parser file is called .B foo.tab.c by default. As a consequence, the verbose output file is called .BR foo.output . .TP .B \-V .br .ns .TP .B \-\-version Print the version number of .IR bison . .TP .B \-y .br .ns .TP .B \-\-yacc .br .ns .TP .B \-\-fixed-output-files Equivalent to .BR "\-o y.tab.c" ; the parser output file is called .BR y.tab.c , and the other outputs are called .B y.output and .BR y.tab.h . The purpose of this switch is to imitate .IR yacc 's output file name conventions. Thus, the following shell script can substitute for .IR yacc : .sp .RS .ft B bison \-y $* .ft R .sp .RE .PP The long-named options can be introduced with `+' as well as `\-\-', for compatibility with previous releases. Eventually support for `+' will be removed, because it is incompatible with the POSIX.2 standard. .SH FILES /usr/local/lib/bison.simple simple parser .br /usr/local/lib/bison.hairy complicated parser .SH SEE ALSO .IR yacc (1) .br The .IR "Bison Reference Manual" , included as the file .B bison.texinfo in the .I bison source distribution. .SH DIAGNOSTICS Self explanatory. dibbler-1.0.1/bison++/bison.cld0000664000175000017500000000120112233256142013067 00000000000000! ! VMS BISON command definition file ! DEFINE VERB BISON IMAGE GNU_BISON:[000000]BISON PARAMETER P1,Label=BISON$INFILE,Prompt="File" value(required,type=$infile) QUALIFIER VERBOSE,Label=BISON$VERBOSE QUALIFIER DEFINES,Label=BISON$DEFINES QUALIFIER FIXED_OUTFILES,Label=BISON$FIXED_OUTFILES qualifier nolines,Label=BISON$NOLINES qualifier debug,Label=BISON$DEBUG qualifier output,value(type=$outfile),Label=BISON$OUTPUT qualifier version,label=BISON$VERSION qualifier yacc,label=BISON$YACC qualifier file_prefix,value(type=$outfile),label=BISON$FILE_PREFIX qualifier name_prefix,value(type=$outfile),LABEL=BISON$NAME_PREFIX dibbler-1.0.1/bison++/getopt.h0000664000175000017500000001053212233256142012753 00000000000000/* Declarations for getopt. Copyright (C) 1989, 1990, 1991, 1992, 1993 Free Software Foundation, Inc. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ #ifndef _GETOPT_H #define _GETOPT_H 1 #ifdef __cplusplus extern "C" { #endif /* For communication from `getopt' to the caller. When `getopt' finds an option that takes an argument, the argument value is returned here. Also, when `ordering' is RETURN_IN_ORDER, each non-option ARGV-element is returned here. */ extern char *optarg; /* Index in ARGV of the next element to be scanned. This is used for communication to and from the caller and for communication between successive calls to `getopt'. On entry to `getopt', zero means this is the first call; initialize. When `getopt' returns EOF, this is the index of the first of the non-option elements that the caller should itself scan. Otherwise, `optind' communicates from one call to the next how much of ARGV has been scanned so far. */ extern int optind; /* Callers store zero here to inhibit the error message `getopt' prints for unrecognized options. */ extern int opterr; /* Set to an option character which was unrecognized. */ extern int optopt; /* Describe the long-named options requested by the application. The LONG_OPTIONS argument to getopt_long or getopt_long_only is a vector of `struct option' terminated by an element containing a name which is zero. The field `has_arg' is: no_argument (or 0) if the option does not take an argument, required_argument (or 1) if the option requires an argument, optional_argument (or 2) if the option takes an optional argument. If the field `flag' is not NULL, it points to a variable that is set to the value given in the field `val' when the option is found, but left unchanged if the option is not found. To have a long-named option do something other than set an `int' to a compiled-in constant, such as set a value from `optarg', set the option's `flag' field to zero and its `val' field to a nonzero value (the equivalent single-letter option character, if there is one). For long options that have a zero `flag' field, `getopt' returns the contents of the `val' field. */ struct option { #if __STDC__ const char *name; #else char *name; #endif /* has_arg can't be an enum because some compilers complain about type mismatches in all the code that assumes it is an int. */ int has_arg; int *flag; int val; }; /* Names for the values of the `has_arg' field of `struct option'. */ #define no_argument 0 #define required_argument 1 #define optional_argument 2 #if __STDC__ #if defined(__GNU_LIBRARY__) /* Many other libraries have conflicting prototypes for getopt, with differences in the consts, in stdlib.h. To avoid compilation errors, only prototype getopt for the GNU C library. */ extern int getopt (int argc, char *const *argv, const char *shortopts); #else /* not __GNU_LIBRARY__ */ extern int getopt (); #endif /* not __GNU_LIBRARY__ */ extern int getopt_long (int argc, char *const *argv, const char *shortopts, const struct option *longopts, int *longind); extern int getopt_long_only (int argc, char *const *argv, const char *shortopts, const struct option *longopts, int *longind); /* Internal only. Users should not call this directly. */ extern int _getopt_internal (int argc, char *const *argv, const char *shortopts, const struct option *longopts, int *longind, int long_only); #else /* not __STDC__ */ extern int getopt (); extern int getopt_long (); extern int getopt_long_only (); extern int _getopt_internal (); #endif /* not __STDC__ */ #ifdef __cplusplus } #endif #endif /* _GETOPT_H */ dibbler-1.0.1/bison++/machine.h0000664000175000017500000000256012233256142013057 00000000000000/* Define machine-dependencies for bison, Copyright (C) 1984, 1989 Free Software Foundation, Inc. This file is part of Bison, the GNU Compiler Compiler. Bison 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. Bison 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 Bison; see the file COPYING. If not, write to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ #ifdef eta10 #define MAXSHORT 2147483647 #define MINSHORT -2147483648 #else #define MAXSHORT 32767 #define MINSHORT -32768 #endif #if defined (_MSDOS) && !defined (__GO32__) #define BITS_PER_WORD 16 #define MAXTABLE 16383 #else #define BITS_PER_WORD 32 #define MAXTABLE 32767 #endif #define WORDSIZE(n) (((n) + BITS_PER_WORD - 1) / BITS_PER_WORD) #define SETBIT(x, i) ((x)[(i)/BITS_PER_WORD] |= (1<<((i) % BITS_PER_WORD))) #define RESETBIT(x, i) ((x)[(i)/BITS_PER_WORD] &= ~(1<<((i) % BITS_PER_WORD))) #define BITISSET(x, i) (((x)[(i)/BITS_PER_WORD] & (1<<((i) % BITS_PER_WORD))) != 0) dibbler-1.0.1/bison++/old.c0000664000175000017500000000043112233256142012217 00000000000000/* JF changed to accept/deal with variable args. DO NOT change this to use varargs. It will appear to work but will break on systems that don't have the necessary library functions. This is the ONLY safe way to write such a function. */ /*VARARGS1*/ #include dibbler-1.0.1/bison++/bison.info-50000664000175000017500000003006012233256142013427 00000000000000This is bison.info, produced by makeinfo version 4.1 from bison.texinfo. START-INFO-DIR-ENTRY * bison: (bison). GNU Project parser generator (yacc replacement). END-INFO-DIR-ENTRY This file documents the Bison parser generator. Copyright (C) 1988, 89, 90, 91, 92, 93, 95, 98, 1999 Free Software Foundation, Inc. Permission is granted to make and distribute verbatim copies of this manual provided the copyright notice and this permission notice are preserved on all copies. Permission is granted to copy and distribute modified versions of this manual under the conditions for verbatim copying, provided also that the sections entitled "GNU General Public License" and "Conditions for Using Bison" are included exactly as in the original, and provided that the entire resulting derived work is distributed under the terms of a permission notice identical to this one. Permission is granted to copy and distribute translations of this manual into another language, under the above conditions for modified versions, except that the sections entitled "GNU General Public License", "Conditions for Using Bison" and this permission notice may be included in translations approved by the Free Software Foundation instead of in the original English.  File: bison.info, Node: Index, Prev: Glossary, Up: Top Index ***** * Menu: * $$: Actions. * $N: Actions. * %expect: Expect Decl. * %left: Using Precedence. * %nonassoc: Using Precedence. * %prec: Contextual Precedence. * %pure_parser: Pure Decl. * %right: Using Precedence. * %start: Start Decl. * %token: Token Decl. * %type: Type Decl. * %union: Union Decl. * @N: Action Features. * action: Actions. * action data types: Action Types. * action features summary: Action Features. * actions in mid-rule: Mid-Rule Actions. * actions, semantic: Semantic Actions. * additional C code section: C Code. * algorithm of parser: Algorithm. * associativity: Why Precedence. * Backus-Naur form: Language and Grammar. * Bison declaration summary: Decl Summary. * Bison declarations: Declarations. * Bison declarations (introduction): Bison Declarations. * Bison grammar: Grammar in Bison. * Bison invocation: Invocation. * Bison parser: Bison Parser. * Bison parser algorithm: Algorithm. * Bison symbols, table of: Table of Symbols. * Bison utility: Bison Parser. * BNF: Language and Grammar. * C code, section for additional: C Code. * C declarations section: C Declarations. * C-language interface: Interface. * calc: Infix Calc. * calculator, infix notation: Infix Calc. * calculator, multi-function: Multi-function Calc. * calculator, simple: RPN Calc. * character token: Symbols. * compiling the parser: Rpcalc Compile. * conflicts: Shift/Reduce. * conflicts, reduce/reduce: Reduce/Reduce. * conflicts, suppressing warnings of: Expect Decl. * context-dependent precedence: Contextual Precedence. * context-free grammar: Language and Grammar. * controlling function: Rpcalc Main. * dangling else: Shift/Reduce. * data types in actions: Action Types. * data types of semantic values: Value Type. * debugging: Debugging. * declaration summary: Decl Summary. * declarations, Bison: Declarations. * declarations, Bison (introduction): Bison Declarations. * declarations, C: C Declarations. * declaring literal string tokens: Token Decl. * declaring operator precedence: Precedence Decl. * declaring the start symbol: Start Decl. * declaring token type names: Token Decl. * declaring value types: Union Decl. * declaring value types, nonterminals: Type Decl. * default action: Actions. * default data type: Value Type. * default stack limit: Stack Overflow. * default start symbol: Start Decl. * defining language semantics: Semantics. * else, dangling: Shift/Reduce. * error: Error Recovery. * error recovery: Error Recovery. * error recovery, simple: Simple Error Recovery. * error reporting function: Error Reporting. * error reporting routine: Rpcalc Error. * examples, simple: Examples. * exercises: Exercises. * file format: Grammar Layout. * finite-state machine: Parser States. * formal grammar: Grammar in Bison. * format of grammar file: Grammar Layout. * glossary: Glossary. * grammar file: Grammar Layout. * grammar rule syntax: Rules. * grammar rules section: Grammar Rules. * grammar, Bison: Grammar in Bison. * grammar, context-free: Language and Grammar. * grouping, syntactic: Language and Grammar. * infix notation calculator: Infix Calc. * interface: Interface. * introduction: Introduction. * invoking Bison: Invocation. * invoking Bison under VMS: VMS Invocation. * LALR(1): Mystery Conflicts. * language semantics, defining: Semantics. * layout of Bison grammar: Grammar Layout. * left recursion: Recursion. * lexical analyzer: Lexical. * lexical analyzer, purpose: Bison Parser. * lexical analyzer, writing: Rpcalc Lexer. * lexical tie-in: Lexical Tie-ins. * literal string token: Symbols. * literal token: Symbols. * look-ahead token: Look-Ahead. * LR(1): Mystery Conflicts. * main function in simple example: Rpcalc Main. * mfcalc: Multi-function Calc. * mid-rule actions: Mid-Rule Actions. * multi-character literal: Symbols. * multi-function calculator: Multi-function Calc. * mutual recursion: Recursion. * nonterminal symbol: Symbols. * operator precedence: Precedence. * operator precedence, declaring: Precedence Decl. * options for invoking Bison: Invocation. * overflow of parser stack: Stack Overflow. * parse error: Error Reporting. * parser: Bison Parser. * parser stack: Algorithm. * parser stack overflow: Stack Overflow. * parser state: Parser States. * polish notation calculator: RPN Calc. * precedence declarations: Precedence Decl. * precedence of operators: Precedence. * precedence, context-dependent: Contextual Precedence. * precedence, unary operator: Contextual Precedence. * preventing warnings about conflicts: Expect Decl. * pure parser: Pure Decl. * recovery from errors: Error Recovery. * recursive rule: Recursion. * reduce/reduce conflict: Reduce/Reduce. * reduction: Algorithm. * reentrant parser: Pure Decl. * reverse polish notation: RPN Calc. * right recursion: Recursion. * rpcalc: RPN Calc. * rule syntax: Rules. * rules section for grammar: Grammar Rules. * running Bison (introduction): Rpcalc Gen. * semantic actions: Semantic Actions. * semantic value: Semantic Values. * semantic value type: Value Type. * shift/reduce conflicts: Shift/Reduce. * shifting: Algorithm. * simple examples: Examples. * single-character literal: Symbols. * stack overflow: Stack Overflow. * stack, parser: Algorithm. * stages in using Bison: Stages. * start symbol: Language and Grammar. * start symbol, declaring: Start Decl. * state (of parser): Parser States. * string token: Symbols. * summary, action features: Action Features. * summary, Bison declaration: Decl Summary. * suppressing conflict warnings: Expect Decl. * symbol: Symbols. * symbol table example: Mfcalc Symtab. * symbols (abstract): Language and Grammar. * symbols in Bison, table of: Table of Symbols. * syntactic grouping: Language and Grammar. * syntax error: Error Reporting. * syntax of grammar rules: Rules. * terminal symbol: Symbols. * token: Language and Grammar. * token type: Symbols. * token type names, declaring: Token Decl. * tracing the parser: Debugging. * unary operator precedence: Contextual Precedence. * using Bison: Stages. * value type, semantic: Value Type. * value types, declaring: Union Decl. * value types, nonterminals, declaring: Type Decl. * value, semantic: Semantic Values. * VMS: VMS Invocation. * warnings, preventing: Expect Decl. * writing a lexical analyzer: Rpcalc Lexer. * YYABORT: Parser Function. * YYACCEPT: Parser Function. * YYBACKUP: Action Features. * yychar: Look-Ahead. * yyclearin: Error Recovery. * yydebug: Debugging. * YYDEBUG: Debugging. * YYEMPTY: Action Features. * yyerrok: Error Recovery. * YYERROR: Action Features. * yyerror: Error Reporting. * YYERROR_VERBOSE: Error Reporting. * YYINITDEPTH: Stack Overflow. * yylex: Lexical. * YYLEX_PARAM: Pure Calling. * yylloc: Token Positions. * YYLTYPE: Token Positions. * yylval: Token Values. * YYMAXDEPTH: Stack Overflow. * yynerrs: Error Reporting. * yyparse: Parser Function. * YYPARSE_PARAM: Pure Calling. * YYPRINT: Debugging. * YYRECOVERING: Error Recovery. * |: Rules. dibbler-1.0.1/bison++/lalr.cc0000664000175000017500000003311412233256142012542 00000000000000/* Compute look-ahead criteria for bison, Copyright (C) 1984, 1986, 1989 Free Software Foundation, Inc. This file is part of Bison, the GNU Compiler Compiler. Bison 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. Bison 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 Bison; see the file COPYING. If not, write to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ /* Compute how to make the finite state machine deterministic; find which rules need lookahead in each state, and which lookahead tokens they accept. lalr(), the entry point, builds these data structures: goto_map, from_state and to_state record each shift transition which accepts a variable (a nonterminal). ngotos is the number of such transitions. from_state[t] is the state number which a transition leads from and to_state[t] is the state number it leads to. All the transitions that accept a particular variable are grouped together and goto_map[i - ntokens] is the index in from_state and to_state of the first of them. consistent[s] is nonzero if no lookahead is needed to decide what to do in state s. LAruleno is a vector which records the rules that need lookahead in various states. The elements of LAruleno that apply to state s are those from lookaheads[s] through lookaheads[s+1]-1. Each element of LAruleno is a rule number. If lr is the length of LAruleno, then a number from 0 to lr-1 can specify both a rule and a state where the rule might be applied. LA is a lr by ntokens matrix of bits. LA[l, i] is 1 if the rule LAruleno[l] is applicable in the appropriate state when the next token is symbol i. If LA[l, i] and LA[l, j] are both 1 for i != j, it is a conflict. */ #include #include "system.h" #include "machine.h" #include "types.h" #include "state.h" #include "new.h" #include "gram.h" extern short **derives; extern char *nullable; int tokensetsize; short *lookaheads; short *LAruleno; unsigned *LA; short *accessing_symbol; char *consistent; core **state_table; shifts **shift_table; reductions **reduction_table; short *goto_map; short *from_state; short *to_state; short **transpose(short**,int); void set_state_table(); void set_accessing_symbol(); void set_shift_table(); void set_reduction_table(); void set_maxrhs(); void initialize_LA(); void set_goto_map(); void initialize_F(); void build_relations(); void add_lookback_edge(int,int,int); void compute_FOLLOWS(); void compute_lookaheads(); void digraph(short**); void traverse(int); extern void toomany(char*); extern void berror(char*); static int infinity; static int maxrhs; static int ngotos; static unsigned *F; static short **includes; static shorts **lookback; static short **R; static short *INDEX; static short *VERTICES; static int top; void lalr() { tokensetsize = WORDSIZE(ntokens); set_state_table(); set_accessing_symbol(); set_shift_table(); set_reduction_table(); set_maxrhs(); initialize_LA(); set_goto_map(); initialize_F(); build_relations(); compute_FOLLOWS(); compute_lookaheads(); } void set_state_table() { register core *sp; state_table = NEW2(nstates, core *); for (sp = first_state; sp; sp = sp->next) state_table[sp->number] = sp; } void set_accessing_symbol() { register core *sp; accessing_symbol = NEW2(nstates, short); for (sp = first_state; sp; sp = sp->next) accessing_symbol[sp->number] = sp->accessing_symbol; } void set_shift_table() { register shifts *sp; shift_table = NEW2(nstates, shifts *); for (sp = first_shift; sp; sp = sp->next) shift_table[sp->number] = sp; } void set_reduction_table() { register reductions *rp; reduction_table = NEW2(nstates, reductions *); for (rp = first_reduction; rp; rp = rp->next) reduction_table[rp->number] = rp; } void set_maxrhs() { register short *itemp; register int length; register int max; length = 0; max = 0; for (itemp = ritem; *itemp; itemp++) { if (*itemp > 0) { length++; } else { if (length > max) max = length; length = 0; } } maxrhs = max; } void initialize_LA() { register int i; register int j; register int count; register reductions *rp; register shifts *sp; register short *np; consistent = NEW2(nstates, char); lookaheads = NEW2(nstates + 1, short); count = 0; for (i = 0; i < nstates; i++) { register int k; lookaheads[i] = count; rp = reduction_table[i]; sp = shift_table[i]; if (rp && (rp->nreds > 1 || (sp && ! ISVAR(accessing_symbol[sp->internalShifts[0]])))) count += rp->nreds; else consistent[i] = 1; if (sp) for (k = 0; k < sp->nshifts; k++) { if (accessing_symbol[sp->internalShifts[k]] == error_token_number) { consistent[i] = 0; break; } } } lookaheads[nstates] = count; if (count == 0) { LA = NEW2(1 * tokensetsize, unsigned); LAruleno = NEW2(1, short); lookback = NEW2(1, shorts *); } else { LA = NEW2(count * tokensetsize, unsigned); LAruleno = NEW2(count, short); lookback = NEW2(count, shorts *); } np = LAruleno; for (i = 0; i < nstates; i++) { if (!consistent[i]) { if (rp = reduction_table[i]) for (j = 0; j < rp->nreds; j++) *np++ = rp->rules[j]; } } } void set_goto_map() { register shifts *sp; register int i; register int symbol; register int k; register short *temp_map; register int state2; register int state1; goto_map = NEW2(nvars + 1, short) - ntokens; temp_map = NEW2(nvars + 1, short) - ntokens; ngotos = 0; for (sp = first_shift; sp; sp = sp->next) { for (i = sp->nshifts - 1; i >= 0; i--) { symbol = accessing_symbol[sp->internalShifts[i]]; if (ISTOKEN(symbol)) break; if (ngotos == MAXSHORT) toomany("gotos"); ngotos++; goto_map[symbol]++; } } k = 0; for (i = ntokens; i < nsyms; i++) { temp_map[i] = k; k += goto_map[i]; } for (i = ntokens; i < nsyms; i++) goto_map[i] = temp_map[i]; goto_map[nsyms] = ngotos; temp_map[nsyms] = ngotos; from_state = NEW2(ngotos, short); to_state = NEW2(ngotos, short); for (sp = first_shift; sp; sp = sp->next) { state1 = sp->number; for (i = sp->nshifts - 1; i >= 0; i--) { state2 = sp->internalShifts[i]; symbol = accessing_symbol[state2]; if (ISTOKEN(symbol)) break; k = temp_map[symbol]++; from_state[k] = state1; to_state[k] = state2; } } FREE(temp_map + ntokens); } /* Map_goto maps a state/symbol pair into its numeric representation. */ int map_goto(int state, int symbol) { register int high; register int low; register int middle; register int s; low = goto_map[symbol]; high = goto_map[symbol + 1] - 1; while (low <= high) { middle = (low + high) / 2; s = from_state[middle]; if (s == state) return (middle); else if (s < state) low = middle + 1; else high = middle - 1; } berror("map_goto"); /* NOTREACHED */ return 0; } void initialize_F() { register int i; register int j; register int k; register shifts *sp; register short *edge; register unsigned *rowp; register short *rp; register short **reads; register int nedges; register int stateno; register int symbol; register int nwords; nwords = ngotos * tokensetsize; F = NEW2(nwords, unsigned); reads = NEW2(ngotos, short *); edge = NEW2(ngotos + 1, short); nedges = 0; rowp = F; for (i = 0; i < ngotos; i++) { stateno = to_state[i]; sp = shift_table[stateno]; if (sp) { k = sp->nshifts; for (j = 0; j < k; j++) { symbol = accessing_symbol[sp->internalShifts[j]]; if (ISVAR(symbol)) break; SETBIT(rowp, symbol); } for (; j < k; j++) { symbol = accessing_symbol[sp->internalShifts[j]]; if (nullable[symbol]) edge[nedges++] = map_goto(stateno, symbol); } if (nedges) { reads[i] = rp = NEW2(nedges + 1, short); for (j = 0; j < nedges; j++) rp[j] = edge[j]; rp[nedges] = -1; nedges = 0; } } rowp += tokensetsize; } digraph(reads); for (i = 0; i < ngotos; i++) { if (reads[i]) FREE(reads[i]); } FREE(reads); FREE(edge); } void build_relations() { register int i; register int j; register int k; register short *rulep; register short *rp; register shifts *sp; register int length; register int nedges; register int done; register int state1; register int stateno; register int symbol1; register int symbol2; register short *shortp; register short *edge; register short *states; register short **new_includes; includes = NEW2(ngotos, short *); edge = NEW2(ngotos + 1, short); states = NEW2(maxrhs + 1, short); for (i = 0; i < ngotos; i++) { nedges = 0; state1 = from_state[i]; symbol1 = accessing_symbol[to_state[i]]; for (rulep = derives[symbol1]; *rulep > 0; rulep++) { length = 1; states[0] = state1; stateno = state1; for (rp = ritem + rrhs[*rulep]; *rp > 0; rp++) { symbol2 = *rp; sp = shift_table[stateno]; k = sp->nshifts; for (j = 0; j < k; j++) { stateno = sp->internalShifts[j]; if (accessing_symbol[stateno] == symbol2) break; } states[length++] = stateno; } if (!consistent[stateno]) add_lookback_edge(stateno, *rulep, i); length--; done = 0; while (!done) { done = 1; rp--; /* JF added rp>=ritem && I hope to god its right! */ if (rp>=ritem && ISVAR(*rp)) { stateno = states[--length]; edge[nedges++] = map_goto(stateno, *rp); if (nullable[*rp]) done = 0; } } } if (nedges) { includes[i] = shortp = NEW2(nedges + 1, short); for (j = 0; j < nedges; j++) shortp[j] = edge[j]; shortp[nedges] = -1; } } new_includes = transpose(includes, ngotos); for (i = 0; i < ngotos; i++) if (includes[i]) FREE(includes[i]); FREE(includes); includes = new_includes; FREE(edge); FREE(states); } void add_lookback_edge(int stateno, int ruleno, int gotono) { register int i; register int k; register int found; register shorts *sp; i = lookaheads[stateno]; k = lookaheads[stateno + 1]; found = 0; while (!found && i < k) { if (LAruleno[i] == ruleno) found = 1; else i++; } if (found == 0) berror("add_lookback_edge"); sp = NEW(shorts); sp->next = lookback[i]; sp->value = gotono; lookback[i] = sp; } short ** transpose(short** R_arg, int n) { register short **new_R; register short **temp_R; register short *nedges; register short *sp; register int i; register int k; nedges = NEW2(n, short); for (i = 0; i < n; i++) { sp = R_arg[i]; if (sp) { while (*sp >= 0) nedges[*sp++]++; } } new_R = NEW2(n, short *); temp_R = NEW2(n, short *); for (i = 0; i < n; i++) { k = nedges[i]; if (k > 0) { sp = NEW2(k + 1, short); new_R[i] = sp; temp_R[i] = sp; sp[k] = -1; } } FREE(nedges); for (i = 0; i < n; i++) { sp = R_arg[i]; if (sp) { while (*sp >= 0) *temp_R[*sp++]++ = i; } } FREE(temp_R); return (new_R); } void compute_FOLLOWS() { register int i; digraph(includes); for (i = 0; i < ngotos; i++) { if (includes[i]) FREE(includes[i]); } FREE(includes); } void compute_lookaheads() { register int i; register int n; register unsigned *fp1; register unsigned *fp2; register unsigned *fp3; register shorts *sp; register unsigned *rowp; /* register short *rulep; JF unused */ /* register int count; JF unused */ register shorts *sptmp;/* JF */ rowp = LA; n = lookaheads[nstates]; for (i = 0; i < n; i++) { fp3 = rowp + tokensetsize; for (sp = lookback[i]; sp; sp = sp->next) { fp1 = rowp; fp2 = F + tokensetsize * sp->value; while (fp1 < fp3) *fp1++ |= *fp2++; } rowp = fp3; } for (i = 0; i < n; i++) {/* JF removed ref to freed storage */ for (sp = lookback[i]; sp; sp = sptmp) { sptmp=sp->next; FREE(sp); } } FREE(lookback); FREE(F); } void digraph(short** relation) { register int i; infinity = ngotos + 2; INDEX = NEW2(ngotos + 1, short); VERTICES = NEW2(ngotos + 1, short); top = 0; R = relation; for (i = 0; i < ngotos; i++) INDEX[i] = 0; for (i = 0; i < ngotos; i++) { if (INDEX[i] == 0 && R[i]) traverse(i); } FREE(INDEX); FREE(VERTICES); } void traverse(int i) { register unsigned *fp1; register unsigned *fp2; register unsigned *fp3; register int j; register short *rp; int height; unsigned *base; VERTICES[++top] = i; INDEX[i] = height = top; base = F + i * tokensetsize; fp3 = base + tokensetsize; rp = R[i]; if (rp) { while ((j = *rp++) >= 0) { if (INDEX[j] == 0) traverse(j); if (INDEX[i] > INDEX[j]) INDEX[i] = INDEX[j]; fp1 = base; fp2 = F + j * tokensetsize; while (fp1 < fp3) *fp1++ |= *fp2++; } } if (INDEX[i] == height) { for (;;) { j = VERTICES[top--]; INDEX[j] = infinity; if (i == j) break; fp1 = base; fp2 = F + j * tokensetsize; while (fp1 < fp3) *fp2++ = *fp1++; } } } dibbler-1.0.1/bison++/bison.h0000664000175000017500000001203012233256142012556 00000000000000/* before anything */ #ifdef c_plusplus #ifndef __cplusplus #define __cplusplus #endif #endif $ /* If we generate a class #define YY_USE_CLASS goes here*/ #ifndef __cplusplus #ifdef YY_USE_CLASS #error "This is a C++ header generated by bison++, use a C++ compiler!" #endif #else #ifndef YY_USE_CLASS /* #warning "For C++ its recomended to use bison++, otherwise classes won't be generated"*/ #endif #endif #include $ /* %{ and %header{ and %union, during decl */ #ifndef YY_@_COMPATIBILITY #ifndef YY_USE_CLASS #define YY_@_COMPATIBILITY 1 #else #define YY_@_COMPATIBILITY 0 #endif #endif #if YY_@_COMPATIBILITY != 0 /* backward compatibility */ #ifdef YYLTYPE #ifndef YY_@_LTYPE #define YY_@_LTYPE YYLTYPE /* WARNING obsolete !!! user defined YYLTYPE not reported into generated header */ /* use %define LTYPE */ #endif #endif /*#ifdef YYSTYPE*/ #ifndef YY_@_STYPE #define YY_@_STYPE YYSTYPE /* WARNING obsolete !!! user defined YYSTYPE not reported into generated header */ /* use %define STYPE */ #endif /*#endif*/ #ifdef YYDEBUG #ifndef YY_@_DEBUG #define YY_@_DEBUG YYDEBUG /* WARNING obsolete !!! user defined YYDEBUG not reported into generated header */ /* use %define DEBUG */ #endif #endif /* use goto to be compatible */ #ifndef YY_@_USE_GOTO #define YY_@_USE_GOTO 1 #endif #endif /* use no goto to be clean in C++ */ #ifndef YY_@_USE_GOTO #define YY_@_USE_GOTO 0 #endif #ifndef YY_@_PURE $/* YY_@_PURE */ #endif $/* prefix */ #ifndef YY_@_DEBUG $/* YY_@_DEBUG */ #endif #ifndef YY_@_LSP_NEEDED $ /* YY_@_LSP_NEEDED*/ #endif /* DEFAULT LTYPE*/ #ifdef YY_@_LSP_NEEDED #ifndef YY_@_LTYPE #ifndef BISON_YYLTYPE_ISDECLARED #define BISON_YYLTYPE_ISDECLARED typedef struct yyltype { int timestamp; int first_line; int first_column; int last_line; int last_column; char *text; } yyltype; #endif #define YY_@_LTYPE yyltype #endif #endif /* DEFAULT STYPE*/ #ifndef YY_@_STYPE #define YY_@_STYPE int #endif /* DEFAULT MISCELANEOUS */ #ifndef YY_@_PARSE #define YY_@_PARSE yyparse #endif #ifndef YY_@_LEX #define YY_@_LEX yylex #endif #ifndef YY_@_LVAL #define YY_@_LVAL yylval #endif #ifndef YY_@_LLOC #define YY_@_LLOC yylloc #endif #ifndef YY_@_CHAR #define YY_@_CHAR yychar #endif #ifndef YY_@_NERRS #define YY_@_NERRS yynerrs #endif #ifndef YY_@_DEBUG_FLAG #define YY_@_DEBUG_FLAG yydebug #endif #ifndef YY_@_ERROR #define YY_@_ERROR yyerror #endif #ifndef YY_@_PARSE_PARAM #ifndef __STDC__ #ifndef __cplusplus #ifndef YY_USE_CLASS #define YY_@_PARSE_PARAM #ifndef YY_@_PARSE_PARAM_DEF #define YY_@_PARSE_PARAM_DEF #endif #endif #endif #endif #ifndef YY_@_PARSE_PARAM #define YY_@_PARSE_PARAM void #endif #endif /* TOKEN C */ #ifndef YY_USE_CLASS #ifndef YY_@_PURE #ifndef yylval extern YY_@_STYPE YY_@_LVAL; #else #if yylval != YY_@_LVAL extern YY_@_STYPE YY_@_LVAL; #else #warning "Namespace conflict, disabling some functionality (bison++ only)" #endif #endif #endif $ /* #defines token */ /* after #define tokens, before const tokens S5*/ #else #ifndef YY_@_CLASS #define YY_@_CLASS @ #endif #ifndef YY_@_INHERIT #define YY_@_INHERIT #endif #ifndef YY_@_MEMBERS #define YY_@_MEMBERS #endif #ifndef YY_@_LEX_BODY #define YY_@_LEX_BODY #endif #ifndef YY_@_ERROR_BODY #define YY_@_ERROR_BODY #endif #ifndef YY_@_CONSTRUCTOR_PARAM #define YY_@_CONSTRUCTOR_PARAM #endif /* choose between enum and const */ #ifndef YY_@_USE_CONST_TOKEN #define YY_@_USE_CONST_TOKEN 0 /* yes enum is more compatible with flex, */ /* so by default we use it */ #endif #if YY_@_USE_CONST_TOKEN != 0 #ifndef YY_@_ENUM_TOKEN #define YY_@_ENUM_TOKEN yy_@_enum_token #endif #endif class YY_@_CLASS YY_@_INHERIT { public: #if YY_@_USE_CONST_TOKEN != 0 /* static const int token ... */ $ /* decl const */ #else enum YY_@_ENUM_TOKEN { YY_@_NULL_TOKEN=0 $ /* enum token */ }; /* end of enum declaration */ #endif public: int YY_@_PARSE(YY_@_PARSE_PARAM); virtual void YY_@_ERROR(char *msg) YY_@_ERROR_BODY; #ifdef YY_@_PURE #ifdef YY_@_LSP_NEEDED virtual int YY_@_LEX(YY_@_STYPE *YY_@_LVAL,YY_@_LTYPE *YY_@_LLOC) YY_@_LEX_BODY; #else virtual int YY_@_LEX(YY_@_STYPE *YY_@_LVAL) YY_@_LEX_BODY; #endif #else virtual int YY_@_LEX() YY_@_LEX_BODY; YY_@_STYPE YY_@_LVAL; #ifdef YY_@_LSP_NEEDED YY_@_LTYPE YY_@_LLOC; #endif int YY_@_NERRS; int YY_@_CHAR; #endif #if YY_@_DEBUG != 0 public: int YY_@_DEBUG_FLAG; /* nonzero means print parse trace */ #endif public: YY_@_CLASS(YY_@_CONSTRUCTOR_PARAM); public: YY_@_MEMBERS }; /* other declare folow */ #endif #if YY_@_COMPATIBILITY != 0 /* backward compatibility */ /* Removed due to bison problems /#ifndef YYSTYPE / #define YYSTYPE YY_@_STYPE /#endif*/ #ifndef YYLTYPE #define YYLTYPE YY_@_LTYPE #endif #ifndef YYDEBUG #ifdef YY_@_DEBUG #define YYDEBUG YY_@_DEBUG #endif #endif #endif /* END */ $ /* section 3 %header{ */ /* AFTER END , NEVER READ !!! */ dibbler-1.0.1/bison++/depcomp0000755000175000017500000005570312277722750012677 00000000000000#! /bin/sh # depcomp - compile a program generating dependencies as side-effects scriptversion=2012-10-18.11; # UTC # Copyright (C) 1999-2013 Free Software Foundation, Inc. # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License # along with this program. If not, see . # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # Originally written by Alexandre Oliva . case $1 in '') echo "$0: No command. Try '$0 --help' for more information." 1>&2 exit 1; ;; -h | --h*) cat <<\EOF Usage: depcomp [--help] [--version] PROGRAM [ARGS] Run PROGRAMS ARGS to compile a file, generating dependencies as side-effects. Environment variables: depmode Dependency tracking mode. source Source file read by 'PROGRAMS ARGS'. object Object file output by 'PROGRAMS ARGS'. DEPDIR directory where to store dependencies. depfile Dependency file to output. tmpdepfile Temporary file to use when outputting dependencies. libtool Whether libtool is used (yes/no). Report bugs to . EOF exit $? ;; -v | --v*) echo "depcomp $scriptversion" exit $? ;; esac # Get the directory component of the given path, and save it in the # global variables '$dir'. Note that this directory component will # be either empty or ending with a '/' character. This is deliberate. set_dir_from () { case $1 in */*) dir=`echo "$1" | sed -e 's|/[^/]*$|/|'`;; *) dir=;; esac } # Get the suffix-stripped basename of the given path, and save it the # global variable '$base'. set_base_from () { base=`echo "$1" | sed -e 's|^.*/||' -e 's/\.[^.]*$//'` } # If no dependency file was actually created by the compiler invocation, # we still have to create a dummy depfile, to avoid errors with the # Makefile "include basename.Plo" scheme. make_dummy_depfile () { echo "#dummy" > "$depfile" } # Factor out some common post-processing of the generated depfile. # Requires the auxiliary global variable '$tmpdepfile' to be set. aix_post_process_depfile () { # If the compiler actually managed to produce a dependency file, # post-process it. if test -f "$tmpdepfile"; then # Each line is of the form 'foo.o: dependency.h'. # Do two passes, one to just change these to # $object: dependency.h # and one to simply output # dependency.h: # which is needed to avoid the deleted-header problem. { sed -e "s,^.*\.[$lower]*:,$object:," < "$tmpdepfile" sed -e "s,^.*\.[$lower]*:[$tab ]*,," -e 's,$,:,' < "$tmpdepfile" } > "$depfile" rm -f "$tmpdepfile" else make_dummy_depfile fi } # A tabulation character. tab=' ' # A newline character. nl=' ' # Character ranges might be problematic outside the C locale. # These definitions help. upper=ABCDEFGHIJKLMNOPQRSTUVWXYZ lower=abcdefghijklmnopqrstuvwxyz digits=0123456789 alpha=${upper}${lower} if test -z "$depmode" || test -z "$source" || test -z "$object"; then echo "depcomp: Variables source, object and depmode must be set" 1>&2 exit 1 fi # Dependencies for sub/bar.o or sub/bar.obj go into sub/.deps/bar.Po. depfile=${depfile-`echo "$object" | sed 's|[^\\/]*$|'${DEPDIR-.deps}'/&|;s|\.\([^.]*\)$|.P\1|;s|Pobj$|Po|'`} tmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`} rm -f "$tmpdepfile" # Avoid interferences from the environment. gccflag= dashmflag= # Some modes work just like other modes, but use different flags. We # parameterize here, but still list the modes in the big case below, # to make depend.m4 easier to write. Note that we *cannot* use a case # here, because this file can only contain one case statement. if test "$depmode" = hp; then # HP compiler uses -M and no extra arg. gccflag=-M depmode=gcc fi if test "$depmode" = dashXmstdout; then # This is just like dashmstdout with a different argument. dashmflag=-xM depmode=dashmstdout fi cygpath_u="cygpath -u -f -" if test "$depmode" = msvcmsys; then # This is just like msvisualcpp but w/o cygpath translation. # Just convert the backslash-escaped backslashes to single forward # slashes to satisfy depend.m4 cygpath_u='sed s,\\\\,/,g' depmode=msvisualcpp fi if test "$depmode" = msvc7msys; then # This is just like msvc7 but w/o cygpath translation. # Just convert the backslash-escaped backslashes to single forward # slashes to satisfy depend.m4 cygpath_u='sed s,\\\\,/,g' depmode=msvc7 fi if test "$depmode" = xlc; then # IBM C/C++ Compilers xlc/xlC can output gcc-like dependency information. gccflag=-qmakedep=gcc,-MF depmode=gcc fi case "$depmode" in gcc3) ## gcc 3 implements dependency tracking that does exactly what ## we want. Yay! Note: for some reason libtool 1.4 doesn't like ## it if -MD -MP comes after the -MF stuff. Hmm. ## Unfortunately, FreeBSD c89 acceptance of flags depends upon ## the command line argument order; so add the flags where they ## appear in depend2.am. Note that the slowdown incurred here ## affects only configure: in makefiles, %FASTDEP% shortcuts this. for arg do case $arg in -c) set fnord "$@" -MT "$object" -MD -MP -MF "$tmpdepfile" "$arg" ;; *) set fnord "$@" "$arg" ;; esac shift # fnord shift # $arg done "$@" stat=$? if test $stat -ne 0; then rm -f "$tmpdepfile" exit $stat fi mv "$tmpdepfile" "$depfile" ;; gcc) ## Note that this doesn't just cater to obsosete pre-3.x GCC compilers. ## but also to in-use compilers like IMB xlc/xlC and the HP C compiler. ## (see the conditional assignment to $gccflag above). ## There are various ways to get dependency output from gcc. Here's ## why we pick this rather obscure method: ## - Don't want to use -MD because we'd like the dependencies to end ## up in a subdir. Having to rename by hand is ugly. ## (We might end up doing this anyway to support other compilers.) ## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like ## -MM, not -M (despite what the docs say). Also, it might not be ## supported by the other compilers which use the 'gcc' depmode. ## - Using -M directly means running the compiler twice (even worse ## than renaming). if test -z "$gccflag"; then gccflag=-MD, fi "$@" -Wp,"$gccflag$tmpdepfile" stat=$? if test $stat -ne 0; then rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" echo "$object : \\" > "$depfile" # The second -e expression handles DOS-style file names with drive # letters. sed -e 's/^[^:]*: / /' \ -e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile" ## This next piece of magic avoids the "deleted header file" problem. ## The problem is that when a header file which appears in a .P file ## is deleted, the dependency causes make to die (because there is ## typically no way to rebuild the header). We avoid this by adding ## dummy dependencies for each header file. Too bad gcc doesn't do ## this for us directly. ## Some versions of gcc put a space before the ':'. On the theory ## that the space means something, we add a space to the output as ## well. hp depmode also adds that space, but also prefixes the VPATH ## to the object. Take care to not repeat it in the output. ## Some versions of the HPUX 10.20 sed can't process this invocation ## correctly. Breaking it into two sed invocations is a workaround. tr ' ' "$nl" < "$tmpdepfile" \ | sed -e 's/^\\$//' -e '/^$/d' -e "s|.*$object$||" -e '/:$/d' \ | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; hp) # This case exists only to let depend.m4 do its work. It works by # looking at the text of this script. This case will never be run, # since it is checked for above. exit 1 ;; sgi) if test "$libtool" = yes; then "$@" "-Wp,-MDupdate,$tmpdepfile" else "$@" -MDupdate "$tmpdepfile" fi stat=$? if test $stat -ne 0; then rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" if test -f "$tmpdepfile"; then # yes, the sourcefile depend on other files echo "$object : \\" > "$depfile" # Clip off the initial element (the dependent). Don't try to be # clever and replace this with sed code, as IRIX sed won't handle # lines with more than a fixed number of characters (4096 in # IRIX 6.2 sed, 8192 in IRIX 6.5). We also remove comment lines; # the IRIX cc adds comments like '#:fec' to the end of the # dependency line. tr ' ' "$nl" < "$tmpdepfile" \ | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' \ | tr "$nl" ' ' >> "$depfile" echo >> "$depfile" # The second pass generates a dummy entry for each header file. tr ' ' "$nl" < "$tmpdepfile" \ | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \ >> "$depfile" else make_dummy_depfile fi rm -f "$tmpdepfile" ;; xlc) # This case exists only to let depend.m4 do its work. It works by # looking at the text of this script. This case will never be run, # since it is checked for above. exit 1 ;; aix) # The C for AIX Compiler uses -M and outputs the dependencies # in a .u file. In older versions, this file always lives in the # current directory. Also, the AIX compiler puts '$object:' at the # start of each line; $object doesn't have directory information. # Version 6 uses the directory in both cases. set_dir_from "$object" set_base_from "$object" if test "$libtool" = yes; then tmpdepfile1=$dir$base.u tmpdepfile2=$base.u tmpdepfile3=$dir.libs/$base.u "$@" -Wc,-M else tmpdepfile1=$dir$base.u tmpdepfile2=$dir$base.u tmpdepfile3=$dir$base.u "$@" -M fi stat=$? if test $stat -ne 0; then rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" exit $stat fi for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" do test -f "$tmpdepfile" && break done aix_post_process_depfile ;; tcc) # tcc (Tiny C Compiler) understand '-MD -MF file' since version 0.9.26 # FIXME: That version still under development at the moment of writing. # Make that this statement remains true also for stable, released # versions. # It will wrap lines (doesn't matter whether long or short) with a # trailing '\', as in: # # foo.o : \ # foo.c \ # foo.h \ # # It will put a trailing '\' even on the last line, and will use leading # spaces rather than leading tabs (at least since its commit 0394caf7 # "Emit spaces for -MD"). "$@" -MD -MF "$tmpdepfile" stat=$? if test $stat -ne 0; then rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" # Each non-empty line is of the form 'foo.o : \' or ' dep.h \'. # We have to change lines of the first kind to '$object: \'. sed -e "s|.*:|$object :|" < "$tmpdepfile" > "$depfile" # And for each line of the second kind, we have to emit a 'dep.h:' # dummy dependency, to avoid the deleted-header problem. sed -n -e 's|^ *\(.*\) *\\$|\1:|p' < "$tmpdepfile" >> "$depfile" rm -f "$tmpdepfile" ;; ## The order of this option in the case statement is important, since the ## shell code in configure will try each of these formats in the order ## listed in this file. A plain '-MD' option would be understood by many ## compilers, so we must ensure this comes after the gcc and icc options. pgcc) # Portland's C compiler understands '-MD'. # Will always output deps to 'file.d' where file is the root name of the # source file under compilation, even if file resides in a subdirectory. # The object file name does not affect the name of the '.d' file. # pgcc 10.2 will output # foo.o: sub/foo.c sub/foo.h # and will wrap long lines using '\' : # foo.o: sub/foo.c ... \ # sub/foo.h ... \ # ... set_dir_from "$object" # Use the source, not the object, to determine the base name, since # that's sadly what pgcc will do too. set_base_from "$source" tmpdepfile=$base.d # For projects that build the same source file twice into different object # files, the pgcc approach of using the *source* file root name can cause # problems in parallel builds. Use a locking strategy to avoid stomping on # the same $tmpdepfile. lockdir=$base.d-lock trap " echo '$0: caught signal, cleaning up...' >&2 rmdir '$lockdir' exit 1 " 1 2 13 15 numtries=100 i=$numtries while test $i -gt 0; do # mkdir is a portable test-and-set. if mkdir "$lockdir" 2>/dev/null; then # This process acquired the lock. "$@" -MD stat=$? # Release the lock. rmdir "$lockdir" break else # If the lock is being held by a different process, wait # until the winning process is done or we timeout. while test -d "$lockdir" && test $i -gt 0; do sleep 1 i=`expr $i - 1` done fi i=`expr $i - 1` done trap - 1 2 13 15 if test $i -le 0; then echo "$0: failed to acquire lock after $numtries attempts" >&2 echo "$0: check lockdir '$lockdir'" >&2 exit 1 fi if test $stat -ne 0; then rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" # Each line is of the form `foo.o: dependent.h', # or `foo.o: dep1.h dep2.h \', or ` dep3.h dep4.h \'. # Do two passes, one to just change these to # `$object: dependent.h' and one to simply `dependent.h:'. sed "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile" # Some versions of the HPUX 10.20 sed can't process this invocation # correctly. Breaking it into two sed invocations is a workaround. sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" \ | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; hp2) # The "hp" stanza above does not work with aCC (C++) and HP's ia64 # compilers, which have integrated preprocessors. The correct option # to use with these is +Maked; it writes dependencies to a file named # 'foo.d', which lands next to the object file, wherever that # happens to be. # Much of this is similar to the tru64 case; see comments there. set_dir_from "$object" set_base_from "$object" if test "$libtool" = yes; then tmpdepfile1=$dir$base.d tmpdepfile2=$dir.libs/$base.d "$@" -Wc,+Maked else tmpdepfile1=$dir$base.d tmpdepfile2=$dir$base.d "$@" +Maked fi stat=$? if test $stat -ne 0; then rm -f "$tmpdepfile1" "$tmpdepfile2" exit $stat fi for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" do test -f "$tmpdepfile" && break done if test -f "$tmpdepfile"; then sed -e "s,^.*\.[$lower]*:,$object:," "$tmpdepfile" > "$depfile" # Add 'dependent.h:' lines. sed -ne '2,${ s/^ *// s/ \\*$// s/$/:/ p }' "$tmpdepfile" >> "$depfile" else make_dummy_depfile fi rm -f "$tmpdepfile" "$tmpdepfile2" ;; tru64) # The Tru64 compiler uses -MD to generate dependencies as a side # effect. 'cc -MD -o foo.o ...' puts the dependencies into 'foo.o.d'. # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put # dependencies in 'foo.d' instead, so we check for that too. # Subdirectories are respected. set_dir_from "$object" set_base_from "$object" if test "$libtool" = yes; then # Libtool generates 2 separate objects for the 2 libraries. These # two compilations output dependencies in $dir.libs/$base.o.d and # in $dir$base.o.d. We have to check for both files, because # one of the two compilations can be disabled. We should prefer # $dir$base.o.d over $dir.libs/$base.o.d because the latter is # automatically cleaned when .libs/ is deleted, while ignoring # the former would cause a distcleancheck panic. tmpdepfile1=$dir$base.o.d # libtool 1.5 tmpdepfile2=$dir.libs/$base.o.d # Likewise. tmpdepfile3=$dir.libs/$base.d # Compaq CCC V6.2-504 "$@" -Wc,-MD else tmpdepfile1=$dir$base.d tmpdepfile2=$dir$base.d tmpdepfile3=$dir$base.d "$@" -MD fi stat=$? if test $stat -ne 0; then rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" exit $stat fi for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" do test -f "$tmpdepfile" && break done # Same post-processing that is required for AIX mode. aix_post_process_depfile ;; msvc7) if test "$libtool" = yes; then showIncludes=-Wc,-showIncludes else showIncludes=-showIncludes fi "$@" $showIncludes > "$tmpdepfile" stat=$? grep -v '^Note: including file: ' "$tmpdepfile" if test $stat -ne 0; then rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" echo "$object : \\" > "$depfile" # The first sed program below extracts the file names and escapes # backslashes for cygpath. The second sed program outputs the file # name when reading, but also accumulates all include files in the # hold buffer in order to output them again at the end. This only # works with sed implementations that can handle large buffers. sed < "$tmpdepfile" -n ' /^Note: including file: *\(.*\)/ { s//\1/ s/\\/\\\\/g p }' | $cygpath_u | sort -u | sed -n ' s/ /\\ /g s/\(.*\)/'"$tab"'\1 \\/p s/.\(.*\) \\/\1:/ H $ { s/.*/'"$tab"'/ G p }' >> "$depfile" rm -f "$tmpdepfile" ;; msvc7msys) # This case exists only to let depend.m4 do its work. It works by # looking at the text of this script. This case will never be run, # since it is checked for above. exit 1 ;; #nosideeffect) # This comment above is used by automake to tell side-effect # dependency tracking mechanisms from slower ones. dashmstdout) # Important note: in order to support this mode, a compiler *must* # always write the preprocessed file to stdout, regardless of -o. "$@" || exit $? # Remove the call to Libtool. if test "$libtool" = yes; then while test "X$1" != 'X--mode=compile'; do shift done shift fi # Remove '-o $object'. IFS=" " for arg do case $arg in -o) shift ;; $object) shift ;; *) set fnord "$@" "$arg" shift # fnord shift # $arg ;; esac done test -z "$dashmflag" && dashmflag=-M # Require at least two characters before searching for ':' # in the target name. This is to cope with DOS-style filenames: # a dependency such as 'c:/foo/bar' could be seen as target 'c' otherwise. "$@" $dashmflag | sed "s|^[$tab ]*[^:$tab ][^:][^:]*:[$tab ]*|$object: |" > "$tmpdepfile" rm -f "$depfile" cat < "$tmpdepfile" > "$depfile" # Some versions of the HPUX 10.20 sed can't process this sed invocation # correctly. Breaking it into two sed invocations is a workaround. tr ' ' "$nl" < "$tmpdepfile" \ | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \ | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; dashXmstdout) # This case only exists to satisfy depend.m4. It is never actually # run, as this mode is specially recognized in the preamble. exit 1 ;; makedepend) "$@" || exit $? # Remove any Libtool call if test "$libtool" = yes; then while test "X$1" != 'X--mode=compile'; do shift done shift fi # X makedepend shift cleared=no eat=no for arg do case $cleared in no) set ""; shift cleared=yes ;; esac if test $eat = yes; then eat=no continue fi case "$arg" in -D*|-I*) set fnord "$@" "$arg"; shift ;; # Strip any option that makedepend may not understand. Remove # the object too, otherwise makedepend will parse it as a source file. -arch) eat=yes ;; -*|$object) ;; *) set fnord "$@" "$arg"; shift ;; esac done obj_suffix=`echo "$object" | sed 's/^.*\././'` touch "$tmpdepfile" ${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@" rm -f "$depfile" # makedepend may prepend the VPATH from the source file name to the object. # No need to regex-escape $object, excess matching of '.' is harmless. sed "s|^.*\($object *:\)|\1|" "$tmpdepfile" > "$depfile" # Some versions of the HPUX 10.20 sed can't process the last invocation # correctly. Breaking it into two sed invocations is a workaround. sed '1,2d' "$tmpdepfile" \ | tr ' ' "$nl" \ | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \ | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" "$tmpdepfile".bak ;; cpp) # Important note: in order to support this mode, a compiler *must* # always write the preprocessed file to stdout. "$@" || exit $? # Remove the call to Libtool. if test "$libtool" = yes; then while test "X$1" != 'X--mode=compile'; do shift done shift fi # Remove '-o $object'. IFS=" " for arg do case $arg in -o) shift ;; $object) shift ;; *) set fnord "$@" "$arg" shift # fnord shift # $arg ;; esac done "$@" -E \ | sed -n -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \ -e '/^#line [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \ | sed '$ s: \\$::' > "$tmpdepfile" rm -f "$depfile" echo "$object : \\" > "$depfile" cat < "$tmpdepfile" >> "$depfile" sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; msvisualcpp) # Important note: in order to support this mode, a compiler *must* # always write the preprocessed file to stdout. "$@" || exit $? # Remove the call to Libtool. if test "$libtool" = yes; then while test "X$1" != 'X--mode=compile'; do shift done shift fi IFS=" " for arg do case "$arg" in -o) shift ;; $object) shift ;; "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI") set fnord "$@" shift shift ;; *) set fnord "$@" "$arg" shift shift ;; esac done "$@" -E 2>/dev/null | sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::\1:p' | $cygpath_u | sort -u > "$tmpdepfile" rm -f "$depfile" echo "$object : \\" > "$depfile" sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::'"$tab"'\1 \\:p' >> "$depfile" echo "$tab" >> "$depfile" sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::\1\::p' >> "$depfile" rm -f "$tmpdepfile" ;; msvcmsys) # This case exists only to let depend.m4 do its work. It works by # looking at the text of this script. This case will never be run, # since it is checked for above. exit 1 ;; none) exec "$@" ;; *) echo "Unknown depmode $depmode" 1>&2 exit 1 ;; esac exit 0 # Local Variables: # mode: shell-script # sh-indentation: 2 # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC" # time-stamp-end: "; # UTC" # End: dibbler-1.0.1/bison++/version.texi0000664000175000017500000000013512233256142013656 00000000000000@set UPDATED 11 May 2011 @set UPDATED-MONTH May 2011 @set EDITION 2.21.5 @set VERSION 2.21.5 dibbler-1.0.1/bison++/missing0000755000175000017500000001533112277722750012712 00000000000000#! /bin/sh # Common wrapper for a few potentially missing GNU programs. scriptversion=2012-06-26.16; # UTC # Copyright (C) 1996-2013 Free Software Foundation, Inc. # Originally written by Fran,cois Pinard , 1996. # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License # along with this program. If not, see . # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. if test $# -eq 0; then echo 1>&2 "Try '$0 --help' for more information" exit 1 fi case $1 in --is-lightweight) # Used by our autoconf macros to check whether the available missing # script is modern enough. exit 0 ;; --run) # Back-compat with the calling convention used by older automake. shift ;; -h|--h|--he|--hel|--help) echo "\ $0 [OPTION]... PROGRAM [ARGUMENT]... Run 'PROGRAM [ARGUMENT]...', returning a proper advice when this fails due to PROGRAM being missing or too old. Options: -h, --help display this help and exit -v, --version output version information and exit Supported PROGRAM values: aclocal autoconf autoheader autom4te automake makeinfo bison yacc flex lex help2man Version suffixes to PROGRAM as well as the prefixes 'gnu-', 'gnu', and 'g' are ignored when checking the name. Send bug reports to ." exit $? ;; -v|--v|--ve|--ver|--vers|--versi|--versio|--version) echo "missing $scriptversion (GNU Automake)" exit $? ;; -*) echo 1>&2 "$0: unknown '$1' option" echo 1>&2 "Try '$0 --help' for more information" exit 1 ;; esac # Run the given program, remember its exit status. "$@"; st=$? # If it succeeded, we are done. test $st -eq 0 && exit 0 # Also exit now if we it failed (or wasn't found), and '--version' was # passed; such an option is passed most likely to detect whether the # program is present and works. case $2 in --version|--help) exit $st;; esac # Exit code 63 means version mismatch. This often happens when the user # tries to use an ancient version of a tool on a file that requires a # minimum version. if test $st -eq 63; then msg="probably too old" elif test $st -eq 127; then # Program was missing. msg="missing on your system" else # Program was found and executed, but failed. Give up. exit $st fi perl_URL=http://www.perl.org/ flex_URL=http://flex.sourceforge.net/ gnu_software_URL=http://www.gnu.org/software program_details () { case $1 in aclocal|automake) echo "The '$1' program is part of the GNU Automake package:" echo "<$gnu_software_URL/automake>" echo "It also requires GNU Autoconf, GNU m4 and Perl in order to run:" echo "<$gnu_software_URL/autoconf>" echo "<$gnu_software_URL/m4/>" echo "<$perl_URL>" ;; autoconf|autom4te|autoheader) echo "The '$1' program is part of the GNU Autoconf package:" echo "<$gnu_software_URL/autoconf/>" echo "It also requires GNU m4 and Perl in order to run:" echo "<$gnu_software_URL/m4/>" echo "<$perl_URL>" ;; esac } give_advice () { # Normalize program name to check for. normalized_program=`echo "$1" | sed ' s/^gnu-//; t s/^gnu//; t s/^g//; t'` printf '%s\n' "'$1' is $msg." configure_deps="'configure.ac' or m4 files included by 'configure.ac'" case $normalized_program in autoconf*) echo "You should only need it if you modified 'configure.ac'," echo "or m4 files included by it." program_details 'autoconf' ;; autoheader*) echo "You should only need it if you modified 'acconfig.h' or" echo "$configure_deps." program_details 'autoheader' ;; automake*) echo "You should only need it if you modified 'Makefile.am' or" echo "$configure_deps." program_details 'automake' ;; aclocal*) echo "You should only need it if you modified 'acinclude.m4' or" echo "$configure_deps." program_details 'aclocal' ;; autom4te*) echo "You might have modified some maintainer files that require" echo "the 'automa4te' program to be rebuilt." program_details 'autom4te' ;; bison*|yacc*) echo "You should only need it if you modified a '.y' file." echo "You may want to install the GNU Bison package:" echo "<$gnu_software_URL/bison/>" ;; lex*|flex*) echo "You should only need it if you modified a '.l' file." echo "You may want to install the Fast Lexical Analyzer package:" echo "<$flex_URL>" ;; help2man*) echo "You should only need it if you modified a dependency" \ "of a man page." echo "You may want to install the GNU Help2man package:" echo "<$gnu_software_URL/help2man/>" ;; makeinfo*) echo "You should only need it if you modified a '.texi' file, or" echo "any other file indirectly affecting the aspect of the manual." echo "You might want to install the Texinfo package:" echo "<$gnu_software_URL/texinfo/>" echo "The spurious makeinfo call might also be the consequence of" echo "using a buggy 'make' (AIX, DU, IRIX), in which case you might" echo "want to install GNU make:" echo "<$gnu_software_URL/make/>" ;; *) echo "You might have modified some files without having the proper" echo "tools for further handling them. Check the 'README' file, it" echo "often tells you about the needed prerequisites for installing" echo "this package. You may also peek at any GNU archive site, in" echo "case some other package contains this missing '$1' program." ;; esac } give_advice "$1" | sed -e '1s/^/WARNING: /' \ -e '2,$s/^/ /' >&2 # Propagate the correct exit status (expected to be 127 for a program # not found, 63 for a program that failed due to version mismatch). exit $st # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC" # time-stamp-end: "; # UTC" # End: dibbler-1.0.1/bison++/bison.hairy0000664000175000017500000001463612233256142013461 00000000000000/* header section */ #include #ifndef __STDC__ #define const #endif $ extern int timeclock; int yyerror; /* Yyerror and yycost are set by guards. */ int yycost; /* If yyerror is set to a nonzero value by a */ /* guard, the reduction with which the guard */ /* is associated is not performed, and the */ /* error recovery mechanism is invoked. */ /* Yycost indicates the cost of performing */ /* the reduction given the attributes of the */ /* symbols. */ /* YYMAXDEPTH indicates the size of the parser's state and value */ /* stacks. */ #ifndef YYMAXDEPTH #define YYMAXDEPTH 500 #endif /* YYMAXRULES must be at least as large as the number of rules that */ /* could be placed in the rule queue. That number could be determined */ /* from the grammar and the size of the stack, but, as yet, it is not. */ #ifndef YYMAXRULES #define YYMAXRULES 100 #endif #ifndef YYMAXBACKUP #define YYMAXBACKUP 100 #endif short yyss[YYMAXDEPTH]; /* the state stack */ YYSTYPE yyvs[YYMAXDEPTH]; /* the semantic value stack */ YYLTYPE yyls[YYMAXDEPTH]; /* the location stack */ short yyrq[YYMAXRULES]; /* the rule queue */ int yychar; /* the lookahead symbol */ YYSTYPE yylval; /* the semantic value of the */ /* lookahead symbol */ YYSTYPE yytval; /* the semantic value for the state */ /* at the top of the state stack. */ YYSTYPE yyval; /* the variable used to return */ /* semantic values from the action */ /* routines */ YYLTYPE yylloc; /* location data for the lookahead */ /* symbol */ YYLTYPE yytloc; /* location data for the state at the */ /* top of the state stack */ int yynunlexed; short yyunchar[YYMAXBACKUP]; YYSTYPE yyunval[YYMAXBACKUP]; YYLTYPE yyunloc[YYMAXBACKUP]; short *yygssp; /* a pointer to the top of the state */ /* stack; only set during error */ /* recovery. */ YYSTYPE *yygvsp; /* a pointer to the top of the value */ /* stack; only set during error */ /* recovery. */ YYLTYPE *yyglsp; /* a pointer to the top of the */ /* location stack; only set during */ /* error recovery. */ /* Yyget is an interface between the parser and the lexical analyzer. */ /* It is costly to provide such an interface, but it avoids requiring */ /* the lexical analyzer to be able to back up the scan. */ yyget() { if (yynunlexed > 0) { yynunlexed--; yychar = yyunchar[yynunlexed]; yylval = yyunval[yynunlexed]; yylloc = yyunloc[yynunlexed]; } else if (yychar <= 0) yychar = 0; else { yychar = yylex(); if (yychar < 0) yychar = 0; else yychar = YYTRANSLATE(yychar); } } yyunlex(chr, val, loc) int chr; YYSTYPE val; YYLTYPE loc; { yyunchar[yynunlexed] = chr; yyunval[yynunlexed] = val; yyunloc[yynunlexed] = loc; yynunlexed++; } yyrestore(first, last) register short *first; register short *last; { register short *ssp; register short *rp; register int symbol; register int state; register int tvalsaved; ssp = yygssp; yyunlex(yychar, yylval, yylloc); tvalsaved = 0; while (first != last) { symbol = yystos[*ssp]; if (symbol < YYNTBASE) { yyunlex(symbol, yytval, yytloc); tvalsaved = 1; ssp--; } ssp--; if (first == yyrq) first = yyrq + YYMAXRULES; first--; for (rp = yyrhs + yyprhs[*first]; symbol = *rp; rp++) { if (symbol < YYNTBASE) state = yytable[yypact[*ssp] + symbol]; else { state = yypgoto[symbol - YYNTBASE] + *ssp; if (state >= 0 && state <= YYLAST && yycheck[state] == *ssp) state = yytable[state]; else state = yydefgoto[symbol - YYNTBASE]; } *++ssp = state; } } if ( ! tvalsaved && ssp > yyss) { yyunlex(yystos[*ssp], yytval, yytloc); ssp--; } yygssp = ssp; } int yyparse() { register int yystate; register int yyn; register short *yyssp; register short *yyrq0; register short *yyptr; register YYSTYPE *yyvsp; int yylen; YYLTYPE *yylsp; short *yyrq1; short *yyrq2; yystate = 0; yyssp = yyss - 1; yyvsp = yyvs - 1; yylsp = yyls - 1; yyrq0 = yyrq; yyrq1 = yyrq0; yyrq2 = yyrq0; yychar = yylex(); if (yychar < 0) yychar = 0; else yychar = YYTRANSLATE(yychar); yynewstate: if (yyssp >= yyss + YYMAXDEPTH - 1) { yyabort("Parser Stack Overflow"); YYABORT; } *++yyssp = yystate; yyresume: yyn = yypact[yystate]; if (yyn == YYFLAG) goto yydefault; yyn += yychar; if (yyn < 0 || yyn > YYLAST || yycheck[yyn] != yychar) goto yydefault; yyn = yytable[yyn]; if (yyn < 0) { yyn = -yyn; goto yyreduce; } else if (yyn == 0) goto yyerrlab; yystate = yyn; yyptr = yyrq2; while (yyptr != yyrq1) { yyn = *yyptr++; yylen = yyr2[yyn]; yyvsp -= yylen; yylsp -= yylen; yyguard(yyn, yyvsp, yylsp); if (yyerror) goto yysemerr; yyaction(yyn, yyvsp, yylsp); *++yyvsp = yyval; yylsp++; if (yylen == 0) { yylsp->timestamp = timeclock; yylsp->first_line = yytloc.first_line; yylsp->first_column = yytloc.first_column; yylsp->last_line = (yylsp-1)->last_line; yylsp->last_column = (yylsp-1)->last_column; yylsp->text = 0; } else { yylsp->last_line = (yylsp+yylen-1)->last_line; yylsp->last_column = (yylsp+yylen-1)->last_column; } if (yyptr == yyrq + YYMAXRULES) yyptr = yyrq; } if (yystate == YYFINAL) YYACCEPT; yyrq2 = yyptr; yyrq1 = yyrq0; *++yyvsp = yytval; *++yylsp = yytloc; yytval = yylval; yytloc = yylloc; yyget(); goto yynewstate; yydefault: yyn = yydefact[yystate]; if (yyn == 0) goto yyerrlab; yyreduce: *yyrq0++ = yyn; if (yyrq0 == yyrq + YYMAXRULES) yyrq0 = yyrq; if (yyrq0 == yyrq2) { yyabort("Parser Rule Queue Overflow"); YYABORT; } yyssp -= yyr2[yyn]; yyn = yyr1[yyn]; yystate = yypgoto[yyn - YYNTBASE] + *yyssp; if (yystate >= 0 && yystate <= YYLAST && yycheck[yystate] == *yyssp) yystate = yytable[yystate]; else yystate = yydefgoto[yyn - YYNTBASE]; goto yynewstate; yysemerr: *--yyptr = yyn; yyrq2 = yyptr; yyvsp += yyr2[yyn]; yyerrlab: yygssp = yyssp; yygvsp = yyvsp; yyglsp = yylsp; yyrestore(yyrq0, yyrq2); yyrecover(); yystate = *yygssp; yyssp = yygssp; yyvsp = yygvsp; yyrq0 = yyrq; yyrq1 = yyrq0; yyrq2 = yyrq0; goto yyresume; } $ dibbler-1.0.1/bison++/REFERENCES0000664000175000017500000000225512233256142012647 00000000000000From phr Tue Jul 8 10:36:19 1986 Date: Tue, 8 Jul 86 00:52:24 EDT From: phr (Paul Rubin) To: riferguson%watmath.waterloo.edu@CSNET-RELAY.ARPA, tower Subject: Re: Bison documentation? The main difference between Bison and Yacc that I know of is that Bison supports the @N construction, which gives you access to the starting and ending line number and character number associated with any of the symbols in the current rule. Also, Bison supports the command `%expect N' which says not to mention the conflicts if there are N shift/reduce conflicts and no reduce/reduce conflicts. The differences in the algorithms stem mainly from the horrible kludges that Johnson had to perpetrate to make Yacc fit in a PDP-11. Also, Bison uses a faster but less space-efficient encoding for the parse tables (see Corbett's PhD thesis from Berkeley, "Static Semantics in Compiler Error Recovery", June 1985, Report No. UCB/CSD 85/251), and more modern technique for generating the lookahead sets. (See "Efficient Construction of LALR(1) Lookahead Sets" by F. DeRemer and A. Pennello, in ACM TOPLS Vol 4 No 4, October 1982. Their technique is the standard one now.) paul rubin free software foundation dibbler-1.0.1/bison++/configure0000775000175000017500000056160112561652527013232 00000000000000#! /bin/sh # Guess values for system-dependent variables and create Makefiles. # Generated by GNU Autoconf 2.69 for bison++ 2.21.5-dibbler. # # Report bugs to . # # # Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc. # # # This configure script is free software; the Free Software Foundation # gives unlimited permission to copy, distribute and modify it. ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in #( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH # Use a proper internal environment variable to ensure we don't fall # into an infinite loop, continuously re-executing ourselves. if test x"${_as_can_reexec}" != xno && test "x$CONFIG_SHELL" != x; then _as_can_reexec=no; export _as_can_reexec; # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV case $- in # (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail # out after a failed `exec'. $as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 as_fn_exit 255 fi # We don't want this to propagate to other subprocesses. { _as_can_reexec=; unset _as_can_reexec;} if test "x$CONFIG_SHELL" = x; then as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which # is contrary to our usage. Disable this feature. alias -g '\${1+\"\$@\"}'='\"\$@\"' setopt NO_GLOB_SUBST else case \`(set -o) 2>/dev/null\` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi " as_required="as_fn_return () { (exit \$1); } as_fn_success () { as_fn_return 0; } as_fn_failure () { as_fn_return 1; } as_fn_ret_success () { return 0; } as_fn_ret_failure () { return 1; } exitcode=0 as_fn_success || { exitcode=1; echo as_fn_success failed.; } as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; } as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; } as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; } if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then : else exitcode=1; echo positional parameters were not saved. fi test x\$exitcode = x0 || exit 1 test -x / || exit 1" as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" && test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1 test \$(( 1 + 1 )) = 2 || exit 1" if (eval "$as_required") 2>/dev/null; then : as_have_required=yes else as_have_required=no fi if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then : else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR as_found=false for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. as_found=: case $as_dir in #( /*) for as_base in sh bash ksh sh5; do # Try only shells that exist, to save several forks. as_shell=$as_dir/$as_base if { test -f "$as_shell" || test -f "$as_shell.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then : CONFIG_SHELL=$as_shell as_have_required=yes if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then : break 2 fi fi done;; esac as_found=false done $as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then : CONFIG_SHELL=$SHELL as_have_required=yes fi; } IFS=$as_save_IFS if test "x$CONFIG_SHELL" != x; then : export CONFIG_SHELL # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV case $- in # (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail # out after a failed `exec'. $as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 exit 255 fi if test x$as_have_required = xno; then : $as_echo "$0: This script requires a shell more modern than all" $as_echo "$0: the shells that I found on your system." if test x${ZSH_VERSION+set} = xset ; then $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should" $as_echo "$0: be upgraded to zsh 4.3.4 or later." else $as_echo "$0: Please tell bug-autoconf@gnu.org and $0: alain.coetmeur@caissedesdepots.fr about your system, $0: including any error possibly output before this $0: message. Then install a modern shell, or manually run $0: the script under such a shell if you do have one." fi exit 1 fi fi fi SHELL=${CONFIG_SHELL-/bin/sh} export SHELL # Unset more variables known to interfere with behavior of common tools. CLICOLOR_FORCE= GREP_OPTIONS= unset CLICOLOR_FORCE GREP_OPTIONS ## --------------------- ## ## M4sh Shell Functions. ## ## --------------------- ## # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p # as_fn_executable_p FILE # ----------------------- # Test if FILE is an executable regular file. as_fn_executable_p () { test -f "$1" && test -x "$1" } # as_fn_executable_p # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi $as_echo "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits as_lineno_1=$LINENO as_lineno_1a=$LINENO as_lineno_2=$LINENO as_lineno_2a=$LINENO eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" && test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || { # Blame Lee E. McMahon (1931-1989) for sed's syntax. :-) sed -n ' p /[$]LINENO/= ' <$as_myself | sed ' s/[$]LINENO.*/&-/ t lineno b :lineno N :loop s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ t loop s/-\n.*// ' >$as_me.lineno && chmod +x "$as_me.lineno" || { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; } # If we had to re-execute with $CONFIG_SHELL, we're ensured to have # already done that, so ensure we don't try to do so again and fall # in an infinite loop. This has already happened in practice. _as_can_reexec=no; export _as_can_reexec # Don't try to exec as it changes $[0], causing all sort of problems # (the dirname of $[0] is not the place where we might find the # original and so on. Autoconf is especially sensitive to this). . "./$as_me.lineno" # Exit status is that of the last command. exit } ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -pR' fi else as_ln_s='cp -pR' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi as_test_x='test -x' as_executable_p=as_fn_executable_p # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" test -n "$DJDIR" || exec 7<&0 &1 # Name of the host. # hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status, # so uname gets run too. ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` # # Initializations. # ac_default_prefix=/usr/local ac_clean_files= ac_config_libobj_dir=. LIBOBJS= cross_compiling=no subdirs= MFLAGS= MAKEFLAGS= # Identity of this package. PACKAGE_NAME='bison++' PACKAGE_TARNAME='bison--' PACKAGE_VERSION='2.21.5-dibbler' PACKAGE_STRING='bison++ 2.21.5-dibbler' PACKAGE_BUGREPORT='alain.coetmeur@caissedesdepots.fr' PACKAGE_URL='' ac_unique_file="bison.cc" # Factoring default headers for most tests. ac_includes_default="\ #include #ifdef HAVE_SYS_TYPES_H # include #endif #ifdef HAVE_SYS_STAT_H # include #endif #ifdef STDC_HEADERS # include # include #else # ifdef HAVE_STDLIB_H # include # endif #endif #ifdef HAVE_STRING_H # if !defined STDC_HEADERS && defined HAVE_MEMORY_H # include # endif # include #endif #ifdef HAVE_STRINGS_H # include #endif #ifdef HAVE_INTTYPES_H # include #endif #ifdef HAVE_STDINT_H # include #endif #ifdef HAVE_UNISTD_H # include #endif" ac_subst_vars='am__EXEEXT_FALSE am__EXEEXT_TRUE LTLIBOBJS LIBOBJS ALLOCA EGREP GREP CPP LN_S am__fastdepCC_FALSE am__fastdepCC_TRUE CCDEPMODE ac_ct_CC CFLAGS CC am__fastdepCXX_FALSE am__fastdepCXX_TRUE CXXDEPMODE am__nodep AMDEPBACKSLASH AMDEP_FALSE AMDEP_TRUE am__quote am__include DEPDIR OBJEXT EXEEXT ac_ct_CXX CPPFLAGS LDFLAGS CXXFLAGS CXX MAINT MAINTAINER_MODE_FALSE MAINTAINER_MODE_TRUE AM_BACKSLASH AM_DEFAULT_VERBOSITY AM_DEFAULT_V AM_V am__untar am__tar AMTAR am__leading_dot SET_MAKE AWK mkdir_p MKDIR_P INSTALL_STRIP_PROGRAM STRIP install_sh MAKEINFO AUTOHEADER AUTOMAKE AUTOCONF ACLOCAL VERSION PACKAGE CYGPATH_W am__isrc INSTALL_DATA INSTALL_SCRIPT INSTALL_PROGRAM target_alias host_alias build_alias LIBS ECHO_T ECHO_N ECHO_C DEFS mandir localedir libdir psdir pdfdir dvidir htmldir infodir docdir oldincludedir includedir localstatedir sharedstatedir sysconfdir datadir datarootdir libexecdir sbindir bindir program_transform_name prefix exec_prefix PACKAGE_URL PACKAGE_BUGREPORT PACKAGE_STRING PACKAGE_VERSION PACKAGE_TARNAME PACKAGE_NAME PATH_SEPARATOR SHELL' ac_subst_files='' ac_user_opts=' enable_option_checking enable_silent_rules enable_maintainer_mode enable_dependency_tracking ' ac_precious_vars='build_alias host_alias target_alias CXX CXXFLAGS LDFLAGS LIBS CPPFLAGS CCC CC CFLAGS CPP' # Initialize some variables set by options. ac_init_help= ac_init_version=false ac_unrecognized_opts= ac_unrecognized_sep= # The variables have the same names as the options, with # dashes changed to underlines. cache_file=/dev/null exec_prefix=NONE no_create= no_recursion= prefix=NONE program_prefix=NONE program_suffix=NONE program_transform_name=s,x,x, silent= site= srcdir= verbose= x_includes=NONE x_libraries=NONE # Installation directory options. # These are left unexpanded so users can "make install exec_prefix=/foo" # and all the variables that are supposed to be based on exec_prefix # by default will actually change. # Use braces instead of parens because sh, perl, etc. also accept them. # (The list follows the same order as the GNU Coding Standards.) bindir='${exec_prefix}/bin' sbindir='${exec_prefix}/sbin' libexecdir='${exec_prefix}/libexec' datarootdir='${prefix}/share' datadir='${datarootdir}' sysconfdir='${prefix}/etc' sharedstatedir='${prefix}/com' localstatedir='${prefix}/var' includedir='${prefix}/include' oldincludedir='/usr/include' docdir='${datarootdir}/doc/${PACKAGE_TARNAME}' infodir='${datarootdir}/info' htmldir='${docdir}' dvidir='${docdir}' pdfdir='${docdir}' psdir='${docdir}' libdir='${exec_prefix}/lib' localedir='${datarootdir}/locale' mandir='${datarootdir}/man' ac_prev= ac_dashdash= for ac_option do # If the previous option needs an argument, assign it. if test -n "$ac_prev"; then eval $ac_prev=\$ac_option ac_prev= continue fi case $ac_option in *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; *=) ac_optarg= ;; *) ac_optarg=yes ;; esac # Accept the important Cygnus configure options, so we can diagnose typos. case $ac_dashdash$ac_option in --) ac_dashdash=yes ;; -bindir | --bindir | --bindi | --bind | --bin | --bi) ac_prev=bindir ;; -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) bindir=$ac_optarg ;; -build | --build | --buil | --bui | --bu) ac_prev=build_alias ;; -build=* | --build=* | --buil=* | --bui=* | --bu=*) build_alias=$ac_optarg ;; -cache-file | --cache-file | --cache-fil | --cache-fi \ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) ac_prev=cache_file ;; -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) cache_file=$ac_optarg ;; --config-cache | -C) cache_file=config.cache ;; -datadir | --datadir | --datadi | --datad) ac_prev=datadir ;; -datadir=* | --datadir=* | --datadi=* | --datad=*) datadir=$ac_optarg ;; -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \ | --dataroo | --dataro | --datar) ac_prev=datarootdir ;; -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \ | --dataroot=* | --dataroo=* | --dataro=* | --datar=*) datarootdir=$ac_optarg ;; -disable-* | --disable-*) ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=no ;; -docdir | --docdir | --docdi | --doc | --do) ac_prev=docdir ;; -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*) docdir=$ac_optarg ;; -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv) ac_prev=dvidir ;; -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*) dvidir=$ac_optarg ;; -enable-* | --enable-*) ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=\$ac_optarg ;; -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ | --exec | --exe | --ex) ac_prev=exec_prefix ;; -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ | --exec=* | --exe=* | --ex=*) exec_prefix=$ac_optarg ;; -gas | --gas | --ga | --g) # Obsolete; use --with-gas. with_gas=yes ;; -help | --help | --hel | --he | -h) ac_init_help=long ;; -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) ac_init_help=recursive ;; -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) ac_init_help=short ;; -host | --host | --hos | --ho) ac_prev=host_alias ;; -host=* | --host=* | --hos=* | --ho=*) host_alias=$ac_optarg ;; -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht) ac_prev=htmldir ;; -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \ | --ht=*) htmldir=$ac_optarg ;; -includedir | --includedir | --includedi | --included | --include \ | --includ | --inclu | --incl | --inc) ac_prev=includedir ;; -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ | --includ=* | --inclu=* | --incl=* | --inc=*) includedir=$ac_optarg ;; -infodir | --infodir | --infodi | --infod | --info | --inf) ac_prev=infodir ;; -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) infodir=$ac_optarg ;; -libdir | --libdir | --libdi | --libd) ac_prev=libdir ;; -libdir=* | --libdir=* | --libdi=* | --libd=*) libdir=$ac_optarg ;; -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ | --libexe | --libex | --libe) ac_prev=libexecdir ;; -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ | --libexe=* | --libex=* | --libe=*) libexecdir=$ac_optarg ;; -localedir | --localedir | --localedi | --localed | --locale) ac_prev=localedir ;; -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*) localedir=$ac_optarg ;; -localstatedir | --localstatedir | --localstatedi | --localstated \ | --localstate | --localstat | --localsta | --localst | --locals) ac_prev=localstatedir ;; -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*) localstatedir=$ac_optarg ;; -mandir | --mandir | --mandi | --mand | --man | --ma | --m) ac_prev=mandir ;; -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) mandir=$ac_optarg ;; -nfp | --nfp | --nf) # Obsolete; use --without-fp. with_fp=no ;; -no-create | --no-create | --no-creat | --no-crea | --no-cre \ | --no-cr | --no-c | -n) no_create=yes ;; -no-recursion | --no-recursion | --no-recursio | --no-recursi \ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) no_recursion=yes ;; -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ | --oldin | --oldi | --old | --ol | --o) ac_prev=oldincludedir ;; -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) oldincludedir=$ac_optarg ;; -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) ac_prev=prefix ;; -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) prefix=$ac_optarg ;; -program-prefix | --program-prefix | --program-prefi | --program-pref \ | --program-pre | --program-pr | --program-p) ac_prev=program_prefix ;; -program-prefix=* | --program-prefix=* | --program-prefi=* \ | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) program_prefix=$ac_optarg ;; -program-suffix | --program-suffix | --program-suffi | --program-suff \ | --program-suf | --program-su | --program-s) ac_prev=program_suffix ;; -program-suffix=* | --program-suffix=* | --program-suffi=* \ | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) program_suffix=$ac_optarg ;; -program-transform-name | --program-transform-name \ | --program-transform-nam | --program-transform-na \ | --program-transform-n | --program-transform- \ | --program-transform | --program-transfor \ | --program-transfo | --program-transf \ | --program-trans | --program-tran \ | --progr-tra | --program-tr | --program-t) ac_prev=program_transform_name ;; -program-transform-name=* | --program-transform-name=* \ | --program-transform-nam=* | --program-transform-na=* \ | --program-transform-n=* | --program-transform-=* \ | --program-transform=* | --program-transfor=* \ | --program-transfo=* | --program-transf=* \ | --program-trans=* | --program-tran=* \ | --progr-tra=* | --program-tr=* | --program-t=*) program_transform_name=$ac_optarg ;; -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd) ac_prev=pdfdir ;; -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*) pdfdir=$ac_optarg ;; -psdir | --psdir | --psdi | --psd | --ps) ac_prev=psdir ;; -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*) psdir=$ac_optarg ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) silent=yes ;; -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) ac_prev=sbindir ;; -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ | --sbi=* | --sb=*) sbindir=$ac_optarg ;; -sharedstatedir | --sharedstatedir | --sharedstatedi \ | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ | --sharedst | --shareds | --shared | --share | --shar \ | --sha | --sh) ac_prev=sharedstatedir ;; -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ | --sha=* | --sh=*) sharedstatedir=$ac_optarg ;; -site | --site | --sit) ac_prev=site ;; -site=* | --site=* | --sit=*) site=$ac_optarg ;; -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) ac_prev=srcdir ;; -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) srcdir=$ac_optarg ;; -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ | --syscon | --sysco | --sysc | --sys | --sy) ac_prev=sysconfdir ;; -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) sysconfdir=$ac_optarg ;; -target | --target | --targe | --targ | --tar | --ta | --t) ac_prev=target_alias ;; -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) target_alias=$ac_optarg ;; -v | -verbose | --verbose | --verbos | --verbo | --verb) verbose=yes ;; -version | --version | --versio | --versi | --vers | -V) ac_init_version=: ;; -with-* | --with-*) ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=\$ac_optarg ;; -without-* | --without-*) ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=no ;; --x) # Obsolete; use --with-x. with_x=yes ;; -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ | --x-incl | --x-inc | --x-in | --x-i) ac_prev=x_includes ;; -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) x_includes=$ac_optarg ;; -x-libraries | --x-libraries | --x-librarie | --x-librari \ | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) ac_prev=x_libraries ;; -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) x_libraries=$ac_optarg ;; -*) as_fn_error $? "unrecognized option: \`$ac_option' Try \`$0 --help' for more information" ;; *=*) ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` # Reject names that are not valid shell variable names. case $ac_envvar in #( '' | [0-9]* | *[!_$as_cr_alnum]* ) as_fn_error $? "invalid variable name: \`$ac_envvar'" ;; esac eval $ac_envvar=\$ac_optarg export $ac_envvar ;; *) # FIXME: should be removed in autoconf 3.0. $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2 expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2 : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}" ;; esac done if test -n "$ac_prev"; then ac_option=--`echo $ac_prev | sed 's/_/-/g'` as_fn_error $? "missing argument to $ac_option" fi if test -n "$ac_unrecognized_opts"; then case $enable_option_checking in no) ;; fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;; *) $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;; esac fi # Check all directory arguments for consistency. for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ datadir sysconfdir sharedstatedir localstatedir includedir \ oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ libdir localedir mandir do eval ac_val=\$$ac_var # Remove trailing slashes. case $ac_val in */ ) ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'` eval $ac_var=\$ac_val;; esac # Be sure to have absolute directory names. case $ac_val in [\\/$]* | ?:[\\/]* ) continue;; NONE | '' ) case $ac_var in *prefix ) continue;; esac;; esac as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val" done # There might be people who depend on the old broken behavior: `$host' # used to hold the argument of --host etc. # FIXME: To remove some day. build=$build_alias host=$host_alias target=$target_alias # FIXME: To remove some day. if test "x$host_alias" != x; then if test "x$build_alias" = x; then cross_compiling=maybe elif test "x$build_alias" != "x$host_alias"; then cross_compiling=yes fi fi ac_tool_prefix= test -n "$host_alias" && ac_tool_prefix=$host_alias- test "$silent" = yes && exec 6>/dev/null ac_pwd=`pwd` && test -n "$ac_pwd" && ac_ls_di=`ls -di .` && ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || as_fn_error $? "working directory cannot be determined" test "X$ac_ls_di" = "X$ac_pwd_ls_di" || as_fn_error $? "pwd does not report name of working directory" # Find the source files, if location was not specified. if test -z "$srcdir"; then ac_srcdir_defaulted=yes # Try the directory containing this script, then the parent directory. ac_confdir=`$as_dirname -- "$as_myself" || $as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_myself" : 'X\(//\)[^/]' \| \ X"$as_myself" : 'X\(//\)$' \| \ X"$as_myself" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_myself" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` srcdir=$ac_confdir if test ! -r "$srcdir/$ac_unique_file"; then srcdir=.. fi else ac_srcdir_defaulted=no fi if test ! -r "$srcdir/$ac_unique_file"; then test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir" fi ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" ac_abs_confdir=`( cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg" pwd)` # When building in place, set srcdir=. if test "$ac_abs_confdir" = "$ac_pwd"; then srcdir=. fi # Remove unnecessary trailing slashes from srcdir. # Double slashes in file names in object file debugging info # mess up M-x gdb in Emacs. case $srcdir in */) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;; esac for ac_var in $ac_precious_vars; do eval ac_env_${ac_var}_set=\${${ac_var}+set} eval ac_env_${ac_var}_value=\$${ac_var} eval ac_cv_env_${ac_var}_set=\${${ac_var}+set} eval ac_cv_env_${ac_var}_value=\$${ac_var} done # # Report the --help message. # if test "$ac_init_help" = "long"; then # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF \`configure' configures bison++ 2.21.5-dibbler to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... To assign environment variables (e.g., CC, CFLAGS...), specify them as VAR=VALUE. See below for descriptions of some of the useful variables. Defaults for the options are specified in brackets. Configuration: -h, --help display this help and exit --help=short display options specific to this package --help=recursive display the short help of all the included packages -V, --version display version information and exit -q, --quiet, --silent do not print \`checking ...' messages --cache-file=FILE cache test results in FILE [disabled] -C, --config-cache alias for \`--cache-file=config.cache' -n, --no-create do not create output files --srcdir=DIR find the sources in DIR [configure dir or \`..'] Installation directories: --prefix=PREFIX install architecture-independent files in PREFIX [$ac_default_prefix] --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX [PREFIX] By default, \`make install' will install all the files in \`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify an installation prefix other than \`$ac_default_prefix' using \`--prefix', for instance \`--prefix=\$HOME'. For better control, use the options below. Fine tuning of the installation directories: --bindir=DIR user executables [EPREFIX/bin] --sbindir=DIR system admin executables [EPREFIX/sbin] --libexecdir=DIR program executables [EPREFIX/libexec] --sysconfdir=DIR read-only single-machine data [PREFIX/etc] --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] --localstatedir=DIR modifiable single-machine data [PREFIX/var] --libdir=DIR object code libraries [EPREFIX/lib] --includedir=DIR C header files [PREFIX/include] --oldincludedir=DIR C header files for non-gcc [/usr/include] --datarootdir=DIR read-only arch.-independent data root [PREFIX/share] --datadir=DIR read-only architecture-independent data [DATAROOTDIR] --infodir=DIR info documentation [DATAROOTDIR/info] --localedir=DIR locale-dependent data [DATAROOTDIR/locale] --mandir=DIR man documentation [DATAROOTDIR/man] --docdir=DIR documentation root [DATAROOTDIR/doc/bison--] --htmldir=DIR html documentation [DOCDIR] --dvidir=DIR dvi documentation [DOCDIR] --pdfdir=DIR pdf documentation [DOCDIR] --psdir=DIR ps documentation [DOCDIR] _ACEOF cat <<\_ACEOF Program names: --program-prefix=PREFIX prepend PREFIX to installed program names --program-suffix=SUFFIX append SUFFIX to installed program names --program-transform-name=PROGRAM run sed PROGRAM on installed program names _ACEOF fi if test -n "$ac_init_help"; then case $ac_init_help in short | recursive ) echo "Configuration of bison++ 2.21.5-dibbler:";; esac cat <<\_ACEOF Optional Features: --disable-option-checking ignore unrecognized --enable/--with options --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) --enable-FEATURE[=ARG] include FEATURE [ARG=yes] --enable-silent-rules less verbose build output (undo: "make V=1") --disable-silent-rules verbose build output (undo: "make V=0") --enable-maintainer-mode enable make rules and dependencies not useful (and sometimes confusing) to the casual installer --enable-dependency-tracking do not reject slow dependency extractors --disable-dependency-tracking speeds up one-time build Some influential environment variables: CXX C++ compiler command CXXFLAGS C++ compiler flags LDFLAGS linker flags, e.g. -L if you have libraries in a nonstandard directory LIBS libraries to pass to the linker, e.g. -l CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I if you have headers in a nonstandard directory CC C compiler command CFLAGS C compiler flags CPP C preprocessor Use these variables to override the choices made by `configure' or to help it to find libraries and programs with nonstandard names/locations. Report bugs to . _ACEOF ac_status=$? fi if test "$ac_init_help" = "recursive"; then # If there are subdirs, report their specific --help. for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue test -d "$ac_dir" || { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } || continue ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix cd "$ac_dir" || { ac_status=$?; continue; } # Check for guested configure. if test -f "$ac_srcdir/configure.gnu"; then echo && $SHELL "$ac_srcdir/configure.gnu" --help=recursive elif test -f "$ac_srcdir/configure"; then echo && $SHELL "$ac_srcdir/configure" --help=recursive else $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 fi || ac_status=$? cd "$ac_pwd" || { ac_status=$?; break; } done fi test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF bison++ configure 2.21.5-dibbler generated by GNU Autoconf 2.69 Copyright (C) 2012 Free Software Foundation, Inc. This configure script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it. _ACEOF exit fi ## ------------------------ ## ## Autoconf initialization. ## ## ------------------------ ## # ac_fn_cxx_try_compile LINENO # ---------------------------- # Try to compile conftest.$ac_ext, and return whether this succeeded. ac_fn_cxx_try_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_cxx_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_cxx_try_compile # ac_fn_c_try_compile LINENO # -------------------------- # Try to compile conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_compile # ac_fn_c_try_cpp LINENO # ---------------------- # Try to preprocess conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_cpp () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } > conftest.i && { test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || test ! -s conftest.err }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_cpp # ac_fn_c_try_run LINENO # ---------------------- # Try to link conftest.$ac_ext, and return whether this succeeded. Assumes # that executables *can* be run. ac_fn_c_try_run () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { ac_try='./conftest$ac_exeext' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then : ac_retval=0 else $as_echo "$as_me: program exited with status $ac_status" >&5 $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=$ac_status fi rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_run # ac_fn_c_check_header_mongrel LINENO HEADER VAR INCLUDES # ------------------------------------------------------- # Tests whether HEADER exists, giving a warning if it cannot be compiled using # the include files in INCLUDES and setting the cache variable VAR # accordingly. ac_fn_c_check_header_mongrel () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if eval \${$3+:} false; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } else # Is the header compilable? { $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 usability" >&5 $as_echo_n "checking $2 usability... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 #include <$2> _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_header_compiler=yes else ac_header_compiler=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler" >&5 $as_echo "$ac_header_compiler" >&6; } # Is the header present? { $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 presence" >&5 $as_echo_n "checking $2 presence... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include <$2> _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : ac_header_preproc=yes else ac_header_preproc=no fi rm -f conftest.err conftest.i conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5 $as_echo "$ac_header_preproc" >&6; } # So? What about this header? case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in #(( yes:no: ) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&5 $as_echo "$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 $as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} ;; no:yes:* ) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled" >&5 $as_echo "$as_me: WARNING: $2: present but cannot be compiled" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: check for missing prerequisite headers?" >&5 $as_echo "$as_me: WARNING: $2: check for missing prerequisite headers?" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation" >&5 $as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&5 $as_echo "$as_me: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 $as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} ( $as_echo "## ------------------------------------------------ ## ## Report this to alain.coetmeur@caissedesdepots.fr ## ## ------------------------------------------------ ##" ) | sed "s/^/$as_me: WARNING: /" >&2 ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else eval "$3=\$ac_header_compiler" fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_header_mongrel # ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES # ------------------------------------------------------- # Tests whether HEADER exists and can be compiled using the include files in # INCLUDES, setting the cache variable VAR accordingly. ac_fn_c_check_header_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 #include <$2> _ACEOF if ac_fn_c_try_compile "$LINENO"; then : eval "$3=yes" else eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_header_compile # ac_fn_c_check_type LINENO TYPE VAR INCLUDES # ------------------------------------------- # Tests whether TYPE exists after having included INCLUDES, setting cache # variable VAR accordingly. ac_fn_c_check_type () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else eval "$3=no" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main () { if (sizeof ($2)) return 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main () { if (sizeof (($2))) return 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : else eval "$3=yes" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_type # ac_fn_c_try_link LINENO # ----------------------- # Try to link conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_link () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext conftest$ac_exeext if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && { test "$cross_compiling" = yes || test -x conftest$ac_exeext }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would # interfere with the next link command; also delete a directory that is # left behind by Apple's compiler. We do this before executing the actions. rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_link # ac_fn_c_check_func LINENO FUNC VAR # ---------------------------------- # Tests whether FUNC exists, setting the cache variable VAR accordingly ac_fn_c_check_func () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Define $2 to an innocuous variant, in case declares $2. For example, HP-UX 11i declares gettimeofday. */ #define $2 innocuous_$2 /* System header to define __stub macros and hopefully few prototypes, which can conflict with char $2 (); below. Prefer to if __STDC__ is defined, since exists even on freestanding compilers. */ #ifdef __STDC__ # include #else # include #endif #undef $2 /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $2 (); /* 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_$2 || defined __stub___$2 choke me #endif int main () { return $2 (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : eval "$3=yes" else eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_func cat >config.log <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. It was created by bison++ $as_me 2.21.5-dibbler, which was generated by GNU Autoconf 2.69. Invocation command line was $ $0 $@ _ACEOF exec 5>>config.log { cat <<_ASUNAME ## --------- ## ## Platform. ## ## --------- ## hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` uname -m = `(uname -m) 2>/dev/null || echo unknown` uname -r = `(uname -r) 2>/dev/null || echo unknown` uname -s = `(uname -s) 2>/dev/null || echo unknown` uname -v = `(uname -v) 2>/dev/null || echo unknown` /usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` /bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` /bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` /usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown` /bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` /bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` _ASUNAME as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. $as_echo "PATH: $as_dir" done IFS=$as_save_IFS } >&5 cat >&5 <<_ACEOF ## ----------- ## ## Core tests. ## ## ----------- ## _ACEOF # Keep a trace of the command line. # Strip out --no-create and --no-recursion so they do not pile up. # Strip out --silent because we don't want to record it for future runs. # Also quote any args containing shell meta-characters. # Make two passes to allow for proper duplicate-argument suppression. ac_configure_args= ac_configure_args0= ac_configure_args1= ac_must_keep_next=false for ac_pass in 1 2 do for ac_arg do case $ac_arg in -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) continue ;; *\'*) ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; esac case $ac_pass in 1) as_fn_append ac_configure_args0 " '$ac_arg'" ;; 2) as_fn_append ac_configure_args1 " '$ac_arg'" if test $ac_must_keep_next = true; then ac_must_keep_next=false # Got value, back to normal. else case $ac_arg in *=* | --config-cache | -C | -disable-* | --disable-* \ | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ | -with-* | --with-* | -without-* | --without-* | --x) case "$ac_configure_args0 " in "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; esac ;; -* ) ac_must_keep_next=true ;; esac fi as_fn_append ac_configure_args " '$ac_arg'" ;; esac done done { ac_configure_args0=; unset ac_configure_args0;} { ac_configure_args1=; unset ac_configure_args1;} # When interrupted or exit'd, cleanup temporary files, and complete # config.log. We remove comments because anyway the quotes in there # would cause problems or look ugly. # WARNING: Use '\'' to represent an apostrophe within the trap. # WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug. trap 'exit_status=$? # Save into config.log some information that might help in debugging. { echo $as_echo "## ---------------- ## ## Cache variables. ## ## ---------------- ##" echo # The following way of writing the cache mishandles newlines in values, ( for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #( *${as_nl}ac_space=\ *) sed -n \ "s/'\''/'\''\\\\'\'''\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p" ;; #( *) sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) echo $as_echo "## ----------------- ## ## Output variables. ## ## ----------------- ##" echo for ac_var in $ac_subst_vars do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo if test -n "$ac_subst_files"; then $as_echo "## ------------------- ## ## File substitutions. ## ## ------------------- ##" echo for ac_var in $ac_subst_files do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo fi if test -s confdefs.h; then $as_echo "## ----------- ## ## confdefs.h. ## ## ----------- ##" echo cat confdefs.h echo fi test "$ac_signal" != 0 && $as_echo "$as_me: caught signal $ac_signal" $as_echo "$as_me: exit $exit_status" } >&5 rm -f core *.core core.conftest.* && rm -f -r conftest* confdefs* conf$$* $ac_clean_files && exit $exit_status ' 0 for ac_signal in 1 2 13 15; do trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal done ac_signal=0 # confdefs.h avoids OS command line length limits that DEFS can exceed. rm -f -r conftest* confdefs.h $as_echo "/* confdefs.h */" > confdefs.h # Predefined preprocessor variables. cat >>confdefs.h <<_ACEOF #define PACKAGE_NAME "$PACKAGE_NAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_TARNAME "$PACKAGE_TARNAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_VERSION "$PACKAGE_VERSION" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_STRING "$PACKAGE_STRING" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_URL "$PACKAGE_URL" _ACEOF # Let the site file select an alternate cache file if it wants to. # Prefer an explicitly selected file to automatically selected ones. ac_site_file1=NONE ac_site_file2=NONE if test -n "$CONFIG_SITE"; then # We do not want a PATH search for config.site. case $CONFIG_SITE in #(( -*) ac_site_file1=./$CONFIG_SITE;; */*) ac_site_file1=$CONFIG_SITE;; *) ac_site_file1=./$CONFIG_SITE;; esac elif test "x$prefix" != xNONE; then ac_site_file1=$prefix/share/config.site ac_site_file2=$prefix/etc/config.site else ac_site_file1=$ac_default_prefix/share/config.site ac_site_file2=$ac_default_prefix/etc/config.site fi for ac_site_file in "$ac_site_file1" "$ac_site_file2" do test "x$ac_site_file" = xNONE && continue if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5 $as_echo "$as_me: loading site script $ac_site_file" >&6;} sed 's/^/| /' "$ac_site_file" >&5 . "$ac_site_file" \ || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "failed to load site script $ac_site_file See \`config.log' for more details" "$LINENO" 5; } fi done if test -r "$cache_file"; then # Some versions of bash will fail to source /dev/null (special files # actually), so we avoid doing that. DJGPP emulates it as a regular file. if test /dev/null != "$cache_file" && test -f "$cache_file"; then { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5 $as_echo "$as_me: loading cache $cache_file" >&6;} case $cache_file in [\\/]* | ?:[\\/]* ) . "$cache_file";; *) . "./$cache_file";; esac fi else { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5 $as_echo "$as_me: creating cache $cache_file" >&6;} >$cache_file fi # Check that the precious variables saved in the cache have kept the same # value. ac_cache_corrupted=false for ac_var in $ac_precious_vars; do eval ac_old_set=\$ac_cv_env_${ac_var}_set eval ac_new_set=\$ac_env_${ac_var}_set eval ac_old_val=\$ac_cv_env_${ac_var}_value eval ac_new_val=\$ac_env_${ac_var}_value case $ac_old_set,$ac_new_set in set,) { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} ac_cache_corrupted=: ;; ,set) { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} ac_cache_corrupted=: ;; ,);; *) if test "x$ac_old_val" != "x$ac_new_val"; then # differences in whitespace do not lead to failure. ac_old_val_w=`echo x $ac_old_val` ac_new_val_w=`echo x $ac_new_val` if test "$ac_old_val_w" != "$ac_new_val_w"; then { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5 $as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} ac_cache_corrupted=: else { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5 $as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;} eval $ac_var=\$ac_old_val fi { $as_echo "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5 $as_echo "$as_me: former value: \`$ac_old_val'" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5 $as_echo "$as_me: current value: \`$ac_new_val'" >&2;} fi;; esac # Pass precious variables to config.status. if test "$ac_new_set" = set; then case $ac_new_val in *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; *) ac_arg=$ac_var=$ac_new_val ;; esac case " $ac_configure_args " in *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. *) as_fn_append ac_configure_args " '$ac_arg'" ;; esac fi done if $ac_cache_corrupted; then { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5 $as_echo "$as_me: error: changes in the environment can compromise the build" >&2;} as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5 fi ## -------------------- ## ## Main body of script. ## ## -------------------- ## ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu am__api_version='1.14' ac_aux_dir= for ac_dir in "$srcdir" "$srcdir/.." "$srcdir/../.."; do if test -f "$ac_dir/install-sh"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install-sh -c" break elif test -f "$ac_dir/install.sh"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install.sh -c" break elif test -f "$ac_dir/shtool"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/shtool install -c" break fi done if test -z "$ac_aux_dir"; then as_fn_error $? "cannot find install-sh, install.sh, or shtool in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" "$LINENO" 5 fi # These three variables are undocumented and unsupported, # and are intended to be withdrawn in a future Autoconf release. # They can cause serious problems if a builder's source tree is in a directory # whose full name contains unusual characters. ac_config_guess="$SHELL $ac_aux_dir/config.guess" # Please don't use this var. ac_config_sub="$SHELL $ac_aux_dir/config.sub" # Please don't use this var. ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var. # Find a good install program. We prefer a C program (faster), # so one script is as good as another. But avoid the broken or # incompatible versions: # SysV /etc/install, /usr/sbin/install # SunOS /usr/etc/install # IRIX /sbin/install # AIX /bin/install # AmigaOS /C/install, which installs bootblocks on floppy discs # AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag # AFS /usr/afsws/bin/install, which mishandles nonexistent args # SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" # OS/2's system install, which has a completely different semantic # ./install, which can be erroneously created by make from ./install.sh. # Reject install programs that cannot install multiple files. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5 $as_echo_n "checking for a BSD-compatible install... " >&6; } if test -z "$INSTALL"; then if ${ac_cv_path_install+:} false; then : $as_echo_n "(cached) " >&6 else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. # Account for people who put trailing slashes in PATH elements. case $as_dir/ in #(( ./ | .// | /[cC]/* | \ /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ ?:[\\/]os2[\\/]install[\\/]* | ?:[\\/]OS2[\\/]INSTALL[\\/]* | \ /usr/ucb/* ) ;; *) # OSF1 and SCO ODT 3.0 have their own names for install. # Don't use installbsd from OSF since it installs stuff as root # by default. for ac_prog in ginstall scoinst install; do for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then if test $ac_prog = install && grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # AIX install. It has an incompatible calling convention. : elif test $ac_prog = install && grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # program-specific install script used by HP pwplus--don't use. : else rm -rf conftest.one conftest.two conftest.dir echo one > conftest.one echo two > conftest.two mkdir conftest.dir if "$as_dir/$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir" && test -s conftest.one && test -s conftest.two && test -s conftest.dir/conftest.one && test -s conftest.dir/conftest.two then ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" break 3 fi fi fi done done ;; esac done IFS=$as_save_IFS rm -rf conftest.one conftest.two conftest.dir fi if test "${ac_cv_path_install+set}" = set; then INSTALL=$ac_cv_path_install else # As a last resort, use the slow shell script. Don't cache a # value for INSTALL within a source directory, because that will # break other packages using the cache if that directory is # removed, or if the value is a relative name. INSTALL=$ac_install_sh fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5 $as_echo "$INSTALL" >&6; } # Use test -z because SunOS4 sh mishandles braces in ${var-val}. # It thinks the first close brace ends the variable substitution. test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether build environment is sane" >&5 $as_echo_n "checking whether build environment is sane... " >&6; } # Reject unsafe characters in $srcdir or the absolute working directory # name. Accept space and tab only in the latter. am_lf=' ' case `pwd` in *[\\\"\#\$\&\'\`$am_lf]*) as_fn_error $? "unsafe absolute working directory name" "$LINENO" 5;; esac case $srcdir in *[\\\"\#\$\&\'\`$am_lf\ \ ]*) as_fn_error $? "unsafe srcdir value: '$srcdir'" "$LINENO" 5;; esac # Do 'set' in a subshell so we don't clobber the current shell's # arguments. Must try -L first in case configure is actually a # symlink; some systems play weird games with the mod time of symlinks # (eg FreeBSD returns the mod time of the symlink's containing # directory). if ( am_has_slept=no for am_try in 1 2; do echo "timestamp, slept: $am_has_slept" > conftest.file set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` if test "$*" = "X"; then # -L didn't work. set X `ls -t "$srcdir/configure" conftest.file` fi if test "$*" != "X $srcdir/configure conftest.file" \ && test "$*" != "X conftest.file $srcdir/configure"; then # If neither matched, then we have a broken ls. This can happen # if, for instance, CONFIG_SHELL is bash and it inherits a # broken ls alias from the environment. This has actually # happened. Such a system could not be considered "sane". as_fn_error $? "ls -t appears to fail. Make sure there is not a broken alias in your environment" "$LINENO" 5 fi if test "$2" = conftest.file || test $am_try -eq 2; then break fi # Just in case. sleep 1 am_has_slept=yes done test "$2" = conftest.file ) then # Ok. : else as_fn_error $? "newly created file is older than distributed files! Check your system clock" "$LINENO" 5 fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } # If we didn't sleep, we still need to ensure time stamps of config.status and # generated files are strictly newer. am_sleep_pid= if grep 'slept: no' conftest.file >/dev/null 2>&1; then ( sleep 1 ) & am_sleep_pid=$! fi rm -f conftest.file test "$program_prefix" != NONE && program_transform_name="s&^&$program_prefix&;$program_transform_name" # Use a double $ so make ignores it. test "$program_suffix" != NONE && program_transform_name="s&\$&$program_suffix&;$program_transform_name" # Double any \ or $. # By default was `s,x,x', remove it if useless. ac_script='s/[\\$]/&&/g;s/;s,x,x,$//' program_transform_name=`$as_echo "$program_transform_name" | sed "$ac_script"` # expand $ac_aux_dir to an absolute path am_aux_dir=`cd $ac_aux_dir && pwd` if test x"${MISSING+set}" != xset; then case $am_aux_dir in *\ * | *\ *) MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;; *) MISSING="\${SHELL} $am_aux_dir/missing" ;; esac fi # Use eval to expand $SHELL if eval "$MISSING --is-lightweight"; then am_missing_run="$MISSING " else am_missing_run= { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: 'missing' script is too old or missing" >&5 $as_echo "$as_me: WARNING: 'missing' script is too old or missing" >&2;} fi if test x"${install_sh}" != xset; then case $am_aux_dir in *\ * | *\ *) install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; *) install_sh="\${SHELL} $am_aux_dir/install-sh" esac fi # Installed binaries are usually stripped using 'strip' when the user # run "make install-strip". However 'strip' might not be the right # tool to use in cross-compilation environments, therefore Automake # will honor the 'STRIP' environment variable to overrule this program. if test "$cross_compiling" != no; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. set dummy ${ac_tool_prefix}strip; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_STRIP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$STRIP"; then ac_cv_prog_STRIP="$STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_STRIP="${ac_tool_prefix}strip" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi STRIP=$ac_cv_prog_STRIP if test -n "$STRIP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5 $as_echo "$STRIP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_STRIP"; then ac_ct_STRIP=$STRIP # Extract the first word of "strip", so it can be a program name with args. set dummy strip; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_STRIP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_STRIP"; then ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_STRIP="strip" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP if test -n "$ac_ct_STRIP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5 $as_echo "$ac_ct_STRIP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_STRIP" = x; then STRIP=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac STRIP=$ac_ct_STRIP fi else STRIP="$ac_cv_prog_STRIP" fi fi INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a thread-safe mkdir -p" >&5 $as_echo_n "checking for a thread-safe mkdir -p... " >&6; } if test -z "$MKDIR_P"; then if ${ac_cv_path_mkdir+:} false; then : $as_echo_n "(cached) " >&6 else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/opt/sfw/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in mkdir gmkdir; do for ac_exec_ext in '' $ac_executable_extensions; do as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext" || continue case `"$as_dir/$ac_prog$ac_exec_ext" --version 2>&1` in #( 'mkdir (GNU coreutils) '* | \ 'mkdir (coreutils) '* | \ 'mkdir (fileutils) '4.1*) ac_cv_path_mkdir=$as_dir/$ac_prog$ac_exec_ext break 3;; esac done done done IFS=$as_save_IFS fi test -d ./--version && rmdir ./--version if test "${ac_cv_path_mkdir+set}" = set; then MKDIR_P="$ac_cv_path_mkdir -p" else # As a last resort, use the slow shell script. Don't cache a # value for MKDIR_P within a source directory, because that will # break other packages using the cache if that directory is # removed, or if the value is a relative name. MKDIR_P="$ac_install_sh -d" fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MKDIR_P" >&5 $as_echo "$MKDIR_P" >&6; } for ac_prog in gawk mawk nawk awk do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_AWK+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$AWK"; then ac_cv_prog_AWK="$AWK" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_AWK="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi AWK=$ac_cv_prog_AWK if test -n "$AWK"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AWK" >&5 $as_echo "$AWK" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$AWK" && break done { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5 $as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; } set x ${MAKE-make} ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` if eval \${ac_cv_prog_make_${ac_make}_set+:} false; then : $as_echo_n "(cached) " >&6 else cat >conftest.make <<\_ACEOF SHELL = /bin/sh all: @echo '@@@%%%=$(MAKE)=@@@%%%' _ACEOF # GNU make sometimes prints "make[1]: Entering ...", which would confuse us. case `${MAKE-make} -f conftest.make 2>/dev/null` in *@@@%%%=?*=@@@%%%*) eval ac_cv_prog_make_${ac_make}_set=yes;; *) eval ac_cv_prog_make_${ac_make}_set=no;; esac rm -f conftest.make fi if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } SET_MAKE= else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } SET_MAKE="MAKE=${MAKE-make}" fi rm -rf .tst 2>/dev/null mkdir .tst 2>/dev/null if test -d .tst; then am__leading_dot=. else am__leading_dot=_ fi rmdir .tst 2>/dev/null # Check whether --enable-silent-rules was given. if test "${enable_silent_rules+set}" = set; then : enableval=$enable_silent_rules; fi case $enable_silent_rules in # ((( yes) AM_DEFAULT_VERBOSITY=0;; no) AM_DEFAULT_VERBOSITY=1;; *) AM_DEFAULT_VERBOSITY=1;; esac am_make=${MAKE-make} { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $am_make supports nested variables" >&5 $as_echo_n "checking whether $am_make supports nested variables... " >&6; } if ${am_cv_make_support_nested_variables+:} false; then : $as_echo_n "(cached) " >&6 else if $as_echo 'TRUE=$(BAR$(V)) BAR0=false BAR1=true V=1 am__doit: @$(TRUE) .PHONY: am__doit' | $am_make -f - >/dev/null 2>&1; then am_cv_make_support_nested_variables=yes else am_cv_make_support_nested_variables=no fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_make_support_nested_variables" >&5 $as_echo "$am_cv_make_support_nested_variables" >&6; } if test $am_cv_make_support_nested_variables = yes; then AM_V='$(V)' AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)' else AM_V=$AM_DEFAULT_VERBOSITY AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY fi AM_BACKSLASH='\' if test "`cd $srcdir && pwd`" != "`pwd`"; then # Use -I$(srcdir) only when $(srcdir) != ., so that make's output # is not polluted with repeated "-I." am__isrc=' -I$(srcdir)' # test to see if srcdir already configured if test -f $srcdir/config.status; then as_fn_error $? "source directory already configured; run \"make distclean\" there first" "$LINENO" 5 fi fi # test whether we have cygpath if test -z "$CYGPATH_W"; then if (cygpath --version) >/dev/null 2>/dev/null; then CYGPATH_W='cygpath -w' else CYGPATH_W=echo fi fi # Define the identity of the package. PACKAGE='bison--' VERSION='2.21.5-dibbler' cat >>confdefs.h <<_ACEOF #define PACKAGE "$PACKAGE" _ACEOF cat >>confdefs.h <<_ACEOF #define VERSION "$VERSION" _ACEOF # Some tools Automake needs. ACLOCAL=${ACLOCAL-"${am_missing_run}aclocal-${am__api_version}"} AUTOCONF=${AUTOCONF-"${am_missing_run}autoconf"} AUTOMAKE=${AUTOMAKE-"${am_missing_run}automake-${am__api_version}"} AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"} MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"} # For better backward compatibility. To be removed once Automake 1.9.x # dies out for good. For more background, see: # # mkdir_p='$(MKDIR_P)' # We need awk for the "check" target. The system "awk" is bad on # some platforms. # Always define AMTAR for backward compatibility. Yes, it's still used # in the wild :-( We should find a proper way to deprecate it ... AMTAR='$${TAR-tar}' # We'll loop over all known methods to create a tar archive until one works. _am_tools='gnutar pax cpio none' am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -' # POSIX will say in a future version that running "rm -f" with no argument # is OK; and we want to be able to make that assumption in our Makefile # recipes. So use an aggressive probe to check that the usage we want is # actually supported "in the wild" to an acceptable degree. # See automake bug#10828. # To make any issue more visible, cause the running configure to be aborted # by default if the 'rm' program in use doesn't match our expectations; the # user can still override this though. if rm -f && rm -fr && rm -rf; then : OK; else cat >&2 <<'END' Oops! Your 'rm' program seems unable to run without file operands specified on the command line, even when the '-f' option is present. This is contrary to the behaviour of most rm programs out there, and not conforming with the upcoming POSIX standard: Please tell bug-automake@gnu.org about your system, including the value of your $PATH and any error possibly output before this message. This can help us improve future automake versions. END if test x"$ACCEPT_INFERIOR_RM_PROGRAM" = x"yes"; then echo 'Configuration will proceed anyway, since you have set the' >&2 echo 'ACCEPT_INFERIOR_RM_PROGRAM variable to "yes"' >&2 echo >&2 else cat >&2 <<'END' Aborting the configuration process, to ensure you take notice of the issue. You can download and install GNU coreutils to get an 'rm' implementation that behaves properly: . If you want to complete the configuration process using your problematic 'rm' anyway, export the environment variable ACCEPT_INFERIOR_RM_PROGRAM to "yes", and re-run configure. END as_fn_error $? "Your 'rm' program is bad, sorry." "$LINENO" 5 fi fi # DO NOT trigger rebuild rules, unless I tell you so. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to enable maintainer-specific portions of Makefiles" >&5 $as_echo_n "checking whether to enable maintainer-specific portions of Makefiles... " >&6; } # Check whether --enable-maintainer-mode was given. if test "${enable_maintainer_mode+set}" = set; then : enableval=$enable_maintainer_mode; USE_MAINTAINER_MODE=$enableval else USE_MAINTAINER_MODE=no fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $USE_MAINTAINER_MODE" >&5 $as_echo "$USE_MAINTAINER_MODE" >&6; } if test $USE_MAINTAINER_MODE = yes; then MAINTAINER_MODE_TRUE= MAINTAINER_MODE_FALSE='#' else MAINTAINER_MODE_TRUE='#' MAINTAINER_MODE_FALSE= fi MAINT=$MAINTAINER_MODE_TRUE # Checks for programs. for ac_prog in gawk mawk nawk awk do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_AWK+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$AWK"; then ac_cv_prog_AWK="$AWK" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_AWK="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi AWK=$ac_cv_prog_AWK if test -n "$AWK"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AWK" >&5 $as_echo "$AWK" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$AWK" && break done ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu if test -z "$CXX"; then if test -n "$CCC"; then CXX=$CCC else if test -n "$ac_tool_prefix"; then for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CXX+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CXX"; then ac_cv_prog_CXX="$CXX" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CXX="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CXX=$ac_cv_prog_CXX if test -n "$CXX"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXX" >&5 $as_echo "$CXX" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$CXX" && break done fi if test -z "$CXX"; then ac_ct_CXX=$CXX for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CXX+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CXX"; then ac_cv_prog_ac_ct_CXX="$ac_ct_CXX" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CXX="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CXX=$ac_cv_prog_ac_ct_CXX if test -n "$ac_ct_CXX"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CXX" >&5 $as_echo "$ac_ct_CXX" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_CXX" && break done if test "x$ac_ct_CXX" = x; then CXX="g++" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CXX=$ac_ct_CXX fi fi fi fi # Provide some information about the compiler. $as_echo "$as_me:${as_lineno-$LINENO}: checking for C++ compiler version" >&5 set X $ac_compile ac_compiler=$2 for ac_option in --version -v -V -qversion; do { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? if test -s conftest.err; then sed '10a\ ... rest of stderr output deleted ... 10q' conftest.err >conftest.er1 cat conftest.er1 >&5 fi rm -f conftest.er1 conftest.err $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } done cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out" # Try to create an executable without -o first, disregard a.out. # It will help us diagnose broken compilers, and finding out an intuition # of exeext. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C++ compiler works" >&5 $as_echo_n "checking whether the C++ compiler works... " >&6; } ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` # The possible output files: ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*" ac_rmfiles= for ac_file in $ac_files do case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; * ) ac_rmfiles="$ac_rmfiles $ac_file";; esac done rm -f $ac_rmfiles if { { ac_try="$ac_link_default" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link_default") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : # Autoconf-2.13 could set the ac_cv_exeext variable to `no'. # So ignore a value of `no', otherwise this would lead to `EXEEXT = no' # in a Makefile. We should not override ac_cv_exeext if it was cached, # so that the user can short-circuit this test for compilers unknown to # Autoconf. for ac_file in $ac_files '' do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; [ab].out ) # We found the default executable, but exeext='' is most # certainly right. break;; *.* ) if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no; then :; else ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` fi # We set ac_cv_exeext here because the later test for it is not # safe: cross compilers may not add the suffix if given an `-o' # argument, so we may need to know it at that point already. # Even if this section looks crufty: it has the advantage of # actually working. break;; * ) break;; esac done test "$ac_cv_exeext" = no && ac_cv_exeext= else ac_file='' fi if test -z "$ac_file"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error 77 "C++ compiler cannot create executables See \`config.log' for more details" "$LINENO" 5; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for C++ compiler default output file name" >&5 $as_echo_n "checking for C++ compiler default output file name... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5 $as_echo "$ac_file" >&6; } ac_exeext=$ac_cv_exeext rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out ac_clean_files=$ac_clean_files_save { $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5 $as_echo_n "checking for suffix of executables... " >&6; } if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : # If both `conftest.exe' and `conftest' are `present' (well, observable) # catch `conftest.exe'. For instance with Cygwin, `ls conftest' will # work properly (i.e., refer to `conftest.exe'), while it won't with # `rm'. for ac_file in conftest.exe conftest conftest.*; do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` break;; * ) break;; esac done else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of executables: cannot compile and link See \`config.log' for more details" "$LINENO" 5; } fi rm -f conftest conftest$ac_cv_exeext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5 $as_echo "$ac_cv_exeext" >&6; } rm -f conftest.$ac_ext EXEEXT=$ac_cv_exeext ac_exeext=$EXEEXT cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { FILE *f = fopen ("conftest.out", "w"); return ferror (f) || fclose (f) != 0; ; return 0; } _ACEOF ac_clean_files="$ac_clean_files conftest.out" # Check that the compiler produces executables we can run. If not, either # the compiler is broken, or we cross compile. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5 $as_echo_n "checking whether we are cross compiling... " >&6; } if test "$cross_compiling" != yes; then { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } if { ac_try='./conftest$ac_cv_exeext' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then cross_compiling=no else if test "$cross_compiling" = maybe; then cross_compiling=yes else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot run C++ compiled programs. If you meant to cross compile, use \`--host'. See \`config.log' for more details" "$LINENO" 5; } fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5 $as_echo "$cross_compiling" >&6; } rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out ac_clean_files=$ac_clean_files_save { $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5 $as_echo_n "checking for suffix of object files... " >&6; } if ${ac_cv_objext+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.o conftest.obj if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : for ac_file in conftest.o conftest.obj conftest.*; do test -f "$ac_file" || continue; case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;; *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` break;; esac done else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of object files: cannot compile See \`config.log' for more details" "$LINENO" 5; } fi rm -f conftest.$ac_cv_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5 $as_echo "$ac_cv_objext" >&6; } OBJEXT=$ac_cv_objext ac_objext=$OBJEXT { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C++ compiler" >&5 $as_echo_n "checking whether we are using the GNU C++ compiler... " >&6; } if ${ac_cv_cxx_compiler_gnu+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_compiler_gnu=yes else ac_compiler_gnu=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_cxx_compiler_gnu=$ac_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cxx_compiler_gnu" >&5 $as_echo "$ac_cv_cxx_compiler_gnu" >&6; } if test $ac_compiler_gnu = yes; then GXX=yes else GXX= fi ac_test_CXXFLAGS=${CXXFLAGS+set} ac_save_CXXFLAGS=$CXXFLAGS { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CXX accepts -g" >&5 $as_echo_n "checking whether $CXX accepts -g... " >&6; } if ${ac_cv_prog_cxx_g+:} false; then : $as_echo_n "(cached) " >&6 else ac_save_cxx_werror_flag=$ac_cxx_werror_flag ac_cxx_werror_flag=yes ac_cv_prog_cxx_g=no CXXFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_cv_prog_cxx_g=yes else CXXFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : else ac_cxx_werror_flag=$ac_save_cxx_werror_flag CXXFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_cv_prog_cxx_g=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cxx_werror_flag=$ac_save_cxx_werror_flag fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cxx_g" >&5 $as_echo "$ac_cv_prog_cxx_g" >&6; } if test "$ac_test_CXXFLAGS" = set; then CXXFLAGS=$ac_save_CXXFLAGS elif test $ac_cv_prog_cxx_g = yes; then if test "$GXX" = yes; then CXXFLAGS="-g -O2" else CXXFLAGS="-g" fi else if test "$GXX" = yes; then CXXFLAGS="-O2" else CXXFLAGS= fi fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu DEPDIR="${am__leading_dot}deps" ac_config_commands="$ac_config_commands depfiles" am_make=${MAKE-make} cat > confinc << 'END' am__doit: @echo this is the am__doit target .PHONY: am__doit END # If we don't find an include directive, just comment out the code. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for style of include used by $am_make" >&5 $as_echo_n "checking for style of include used by $am_make... " >&6; } am__include="#" am__quote= _am_result=none # First try GNU make style include. echo "include confinc" > confmf # Ignore all kinds of additional output from 'make'. case `$am_make -s -f confmf 2> /dev/null` in #( *the\ am__doit\ target*) am__include=include am__quote= _am_result=GNU ;; esac # Now try BSD make style include. if test "$am__include" = "#"; then echo '.include "confinc"' > confmf case `$am_make -s -f confmf 2> /dev/null` in #( *the\ am__doit\ target*) am__include=.include am__quote="\"" _am_result=BSD ;; esac fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $_am_result" >&5 $as_echo "$_am_result" >&6; } rm -f confinc confmf # Check whether --enable-dependency-tracking was given. if test "${enable_dependency_tracking+set}" = set; then : enableval=$enable_dependency_tracking; fi if test "x$enable_dependency_tracking" != xno; then am_depcomp="$ac_aux_dir/depcomp" AMDEPBACKSLASH='\' am__nodep='_no' fi if test "x$enable_dependency_tracking" != xno; then AMDEP_TRUE= AMDEP_FALSE='#' else AMDEP_TRUE='#' AMDEP_FALSE= fi depcc="$CXX" am_compiler_list= { $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 $as_echo_n "checking dependency style of $depcc... " >&6; } if ${am_cv_CXX_dependencies_compiler_type+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up # making a dummy file named 'D' -- because '-MD' means "put the output # in D". rm -rf conftest.dir mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. cp "$am_depcomp" conftest.dir cd conftest.dir # We will build objects and dependencies in a subdirectory because # it helps to detect inapplicable dependency modes. For instance # both Tru64's cc and ICC support -MD to output dependencies as a # side effect of compilation, but ICC will put the dependencies in # the current directory while Tru64 will put them in the object # directory. mkdir sub am_cv_CXX_dependencies_compiler_type=none if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` fi am__universal=false case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac for depmode in $am_compiler_list; do # Setup a source with many dependencies, because some compilers # like to wrap large dependency lists on column 80 (with \), and # we should not choose a depcomp mode which is confused by this. # # We need to recreate these files for each test, as the compiler may # overwrite some of them when testing with obscure command lines. # This happens at least with the AIX C compiler. : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with # Solaris 10 /bin/sh. echo '/* dummy */' > sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf # We check with '-c' and '-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly # handle '-M -o', and we need to detect this. Also, some Intel # versions had trouble with output in subdirs. am__obj=sub/conftest.${OBJEXT-o} am__minus_obj="-o $am__obj" case $depmode in gcc) # This depmode causes a compiler race in universal mode. test "$am__universal" = false || continue ;; nosideeffect) # After this tag, mechanisms are not by side-effect, so they'll # only be used when explicitly requested. if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; msvc7 | msvc7msys | msvisualcpp | msvcmsys) # This compiler won't grok '-c -o', but also, the minuso test has # not run yet. These depmodes are late enough in the game, and # so weak that their functioning should not be impacted. am__obj=conftest.${OBJEXT-o} am__minus_obj= ;; none) break ;; esac if depmode=$depmode \ source=sub/conftest.c object=$am__obj \ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ >/dev/null 2>conftest.err && grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && grep $am__obj sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then # icc doesn't choke on unknown options, it will just issue warnings # or remarks (even with -Werror). So we grep stderr for any message # that says an option was ignored or not supported. # When given -MP, icc 7.0 and 7.1 complain thusly: # icc: Command line warning: ignoring option '-M'; no argument required # The diagnosis changed in icc 8.0: # icc: Command line remark: option '-MP' not supported if (grep 'ignoring option' conftest.err || grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else am_cv_CXX_dependencies_compiler_type=$depmode break fi fi done cd .. rm -rf conftest.dir else am_cv_CXX_dependencies_compiler_type=none fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CXX_dependencies_compiler_type" >&5 $as_echo "$am_cv_CXX_dependencies_compiler_type" >&6; } CXXDEPMODE=depmode=$am_cv_CXX_dependencies_compiler_type if test "x$enable_dependency_tracking" != xno \ && test "$am_cv_CXX_dependencies_compiler_type" = gcc3; then am__fastdepCXX_TRUE= am__fastdepCXX_FALSE='#' else am__fastdepCXX_TRUE='#' am__fastdepCXX_FALSE= fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. set dummy ${ac_tool_prefix}gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_CC"; then ac_ct_CC=$CC # Extract the first word of "gcc", so it can be a program name with args. set dummy gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi else CC="$ac_cv_prog_CC" fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. set dummy ${ac_tool_prefix}cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi fi if test -z "$CC"; then # Extract the first word of "cc", so it can be a program name with args. set dummy cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else ac_prog_rejected=no as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then ac_prog_rejected=yes continue fi ac_cv_prog_CC="cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS if test $ac_prog_rejected = yes; then # We found a bogon in the path, so make sure we never use it. set dummy $ac_cv_prog_CC shift if test $# != 0; then # We chose a different compiler from the bogus one. # However, it has the same basename, so the bogon will be chosen # first if we set CC to just the basename; use the full file name. shift ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" fi fi fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then for ac_prog in cl.exe do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$CC" && break done fi if test -z "$CC"; then ac_ct_CC=$CC for ac_prog in cl.exe do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_CC" && break done if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi fi fi test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "no acceptable C compiler found in \$PATH See \`config.log' for more details" "$LINENO" 5; } # Provide some information about the compiler. $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 set X $ac_compile ac_compiler=$2 for ac_option in --version -v -V -qversion; do { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? if test -s conftest.err; then sed '10a\ ... rest of stderr output deleted ... 10q' conftest.err >conftest.er1 cat conftest.er1 >&5 fi rm -f conftest.er1 conftest.err $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } done { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5 $as_echo_n "checking whether we are using the GNU C compiler... " >&6; } if ${ac_cv_c_compiler_gnu+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_compiler_gnu=yes else ac_compiler_gnu=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_c_compiler_gnu=$ac_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 $as_echo "$ac_cv_c_compiler_gnu" >&6; } if test $ac_compiler_gnu = yes; then GCC=yes else GCC= fi ac_test_CFLAGS=${CFLAGS+set} ac_save_CFLAGS=$CFLAGS { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 $as_echo_n "checking whether $CC accepts -g... " >&6; } if ${ac_cv_prog_cc_g+:} false; then : $as_echo_n "(cached) " >&6 else ac_save_c_werror_flag=$ac_c_werror_flag ac_c_werror_flag=yes ac_cv_prog_cc_g=no CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes else CFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : else ac_c_werror_flag=$ac_save_c_werror_flag CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_c_werror_flag=$ac_save_c_werror_flag fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 $as_echo "$ac_cv_prog_cc_g" >&6; } if test "$ac_test_CFLAGS" = set; then CFLAGS=$ac_save_CFLAGS elif test $ac_cv_prog_cc_g = yes; then if test "$GCC" = yes; then CFLAGS="-g -O2" else CFLAGS="-g" fi else if test "$GCC" = yes; then CFLAGS="-O2" else CFLAGS= fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 $as_echo_n "checking for $CC option to accept ISO C89... " >&6; } if ${ac_cv_prog_cc_c89+:} false; then : $as_echo_n "(cached) " >&6 else ac_cv_prog_cc_c89=no ac_save_CC=$CC cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include struct stat; /* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ struct buf { int x; }; FILE * (*rcsopen) (struct buf *, struct stat *, int); static char *e (p, i) char **p; int i; { return p[i]; } static char *f (char * (*g) (char **, int), char **p, ...) { char *s; va_list v; va_start (v,p); s = g (p, va_arg (v,int)); va_end (v); return s; } /* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has function prototypes and stuff, but not '\xHH' hex character constants. These don't provoke an error unfortunately, instead are silently treated as 'x'. The following induces an error, until -std is added to get proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an array size at least. It's necessary to write '\x00'==0 to get something that's true only with -std. */ int osf4_cc_array ['\x00' == 0 ? 1 : -1]; /* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters inside strings and character constants. */ #define FOO(x) 'x' int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; int test (int i, double x); struct s1 {int (*f) (int a);}; struct s2 {int (*f) (double a);}; int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); int argc; char **argv; int main () { return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; ; return 0; } _ACEOF for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" do CC="$ac_save_CC $ac_arg" if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_c89=$ac_arg fi rm -f core conftest.err conftest.$ac_objext test "x$ac_cv_prog_cc_c89" != "xno" && break done rm -f conftest.$ac_ext CC=$ac_save_CC fi # AC_CACHE_VAL case "x$ac_cv_prog_cc_c89" in x) { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 $as_echo "none needed" >&6; } ;; xno) { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 $as_echo "unsupported" >&6; } ;; *) CC="$CC $ac_cv_prog_cc_c89" { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 $as_echo "$ac_cv_prog_cc_c89" >&6; } ;; esac if test "x$ac_cv_prog_cc_c89" != xno; then : fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC understands -c and -o together" >&5 $as_echo_n "checking whether $CC understands -c and -o together... " >&6; } if ${am_cv_prog_cc_c_o+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF # Make sure it works both with $CC and with simple cc. # Following AC_PROG_CC_C_O, we do the test twice because some # compilers refuse to overwrite an existing .o file with -o, # though they will create one. am_cv_prog_cc_c_o=yes for am_i in 1 2; do if { echo "$as_me:$LINENO: $CC -c conftest.$ac_ext -o conftest2.$ac_objext" >&5 ($CC -c conftest.$ac_ext -o conftest2.$ac_objext) >&5 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } \ && test -f conftest2.$ac_objext; then : OK else am_cv_prog_cc_c_o=no break fi done rm -f core conftest* unset am_i fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_prog_cc_c_o" >&5 $as_echo "$am_cv_prog_cc_c_o" >&6; } if test "$am_cv_prog_cc_c_o" != yes; then # Losing compiler, so override with the script. # FIXME: It is wrong to rewrite CC. # But if we don't then we get into trouble of one sort or another. # A longer-term fix would be to have automake use am__CC in this case, # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)" CC="$am_aux_dir/compile $CC" fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu depcc="$CC" am_compiler_list= { $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 $as_echo_n "checking dependency style of $depcc... " >&6; } if ${am_cv_CC_dependencies_compiler_type+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up # making a dummy file named 'D' -- because '-MD' means "put the output # in D". rm -rf conftest.dir mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. cp "$am_depcomp" conftest.dir cd conftest.dir # We will build objects and dependencies in a subdirectory because # it helps to detect inapplicable dependency modes. For instance # both Tru64's cc and ICC support -MD to output dependencies as a # side effect of compilation, but ICC will put the dependencies in # the current directory while Tru64 will put them in the object # directory. mkdir sub am_cv_CC_dependencies_compiler_type=none if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` fi am__universal=false case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac for depmode in $am_compiler_list; do # Setup a source with many dependencies, because some compilers # like to wrap large dependency lists on column 80 (with \), and # we should not choose a depcomp mode which is confused by this. # # We need to recreate these files for each test, as the compiler may # overwrite some of them when testing with obscure command lines. # This happens at least with the AIX C compiler. : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with # Solaris 10 /bin/sh. echo '/* dummy */' > sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf # We check with '-c' and '-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly # handle '-M -o', and we need to detect this. Also, some Intel # versions had trouble with output in subdirs. am__obj=sub/conftest.${OBJEXT-o} am__minus_obj="-o $am__obj" case $depmode in gcc) # This depmode causes a compiler race in universal mode. test "$am__universal" = false || continue ;; nosideeffect) # After this tag, mechanisms are not by side-effect, so they'll # only be used when explicitly requested. if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; msvc7 | msvc7msys | msvisualcpp | msvcmsys) # This compiler won't grok '-c -o', but also, the minuso test has # not run yet. These depmodes are late enough in the game, and # so weak that their functioning should not be impacted. am__obj=conftest.${OBJEXT-o} am__minus_obj= ;; none) break ;; esac if depmode=$depmode \ source=sub/conftest.c object=$am__obj \ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ >/dev/null 2>conftest.err && grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && grep $am__obj sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then # icc doesn't choke on unknown options, it will just issue warnings # or remarks (even with -Werror). So we grep stderr for any message # that says an option was ignored or not supported. # When given -MP, icc 7.0 and 7.1 complain thusly: # icc: Command line warning: ignoring option '-M'; no argument required # The diagnosis changed in icc 8.0: # icc: Command line remark: option '-MP' not supported if (grep 'ignoring option' conftest.err || grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else am_cv_CC_dependencies_compiler_type=$depmode break fi fi done cd .. rm -rf conftest.dir else am_cv_CC_dependencies_compiler_type=none fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CC_dependencies_compiler_type" >&5 $as_echo "$am_cv_CC_dependencies_compiler_type" >&6; } CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type if test "x$enable_dependency_tracking" != xno \ && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then am__fastdepCC_TRUE= am__fastdepCC_FALSE='#' else am__fastdepCC_TRUE='#' am__fastdepCC_FALSE= fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ln -s works" >&5 $as_echo_n "checking whether ln -s works... " >&6; } LN_S=$as_ln_s if test "$LN_S" = "ln -s"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no, using $LN_S" >&5 $as_echo "no, using $LN_S" >&6; } fi # Checks for libraries. # Checks for header files. ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5 $as_echo_n "checking how to run the C preprocessor... " >&6; } # On Suns, sometimes $CPP names a directory. if test -n "$CPP" && test -d "$CPP"; then CPP= fi if test -z "$CPP"; then if ${ac_cv_prog_CPP+:} false; then : $as_echo_n "(cached) " >&6 else # Double quotes because CPP needs to be expanded for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp" do ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : break fi done ac_cv_prog_CPP=$CPP fi CPP=$ac_cv_prog_CPP else ac_cv_prog_CPP=$CPP fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5 $as_echo "$CPP" >&6; } ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "C preprocessor \"$CPP\" fails sanity check See \`config.log' for more details" "$LINENO" 5; } fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5 $as_echo_n "checking for grep that handles long lines and -e... " >&6; } if ${ac_cv_path_GREP+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$GREP"; then ac_path_GREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in grep ggrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_GREP" || continue # Check for GNU ac_path_GREP and select it if it is found. # Check for GNU $ac_path_GREP case `"$ac_path_GREP" --version 2>&1` in *GNU*) ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'GREP' >> "conftest.nl" "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_GREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_GREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_GREP"; then as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_GREP=$GREP fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5 $as_echo "$ac_cv_path_GREP" >&6; } GREP="$ac_cv_path_GREP" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5 $as_echo_n "checking for egrep... " >&6; } if ${ac_cv_path_EGREP+:} false; then : $as_echo_n "(cached) " >&6 else if echo a | $GREP -E '(a|b)' >/dev/null 2>&1 then ac_cv_path_EGREP="$GREP -E" else if test -z "$EGREP"; then ac_path_EGREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in egrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_EGREP" || continue # Check for GNU ac_path_EGREP and select it if it is found. # Check for GNU $ac_path_EGREP case `"$ac_path_EGREP" --version 2>&1` in *GNU*) ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'EGREP' >> "conftest.nl" "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_EGREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_EGREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_EGREP"; then as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_EGREP=$EGREP fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5 $as_echo "$ac_cv_path_EGREP" >&6; } EGREP="$ac_cv_path_EGREP" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5 $as_echo_n "checking for ANSI C header files... " >&6; } if ${ac_cv_header_stdc+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include #include int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_header_stdc=yes else ac_cv_header_stdc=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if test $ac_cv_header_stdc = yes; then # SunOS 4.x string.h does not declare mem*, contrary to ANSI. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "memchr" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "free" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. if test "$cross_compiling" = yes; then : : else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #if ((' ' & 0x0FF) == 0x020) # define ISLOWER(c) ('a' <= (c) && (c) <= 'z') # define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) #else # define ISLOWER(c) \ (('a' <= (c) && (c) <= 'i') \ || ('j' <= (c) && (c) <= 'r') \ || ('s' <= (c) && (c) <= 'z')) # define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) #endif #define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) int main () { int i; for (i = 0; i < 256; i++) if (XOR (islower (i), ISLOWER (i)) || toupper (i) != TOUPPER (i)) return 2; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : else ac_cv_header_stdc=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5 $as_echo "$ac_cv_header_stdc" >&6; } if test $ac_cv_header_stdc = yes; then $as_echo "#define STDC_HEADERS 1" >>confdefs.h fi # On IRIX 5.3, sys/types and inttypes.h are conflicting. for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \ inttypes.h stdint.h unistd.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default " if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done for ac_header in alloca.h malloc.h memory.h stddef.h stdlib.h string.h strings.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done # Checks for typedefs, structures, and compiler characteristics. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for an ANSI C-conforming const" >&5 $as_echo_n "checking for an ANSI C-conforming const... " >&6; } if ${ac_cv_c_const+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __cplusplus /* Ultrix mips cc rejects this sort of thing. */ typedef int charset[2]; const charset cs = { 0, 0 }; /* SunOS 4.1.1 cc rejects this. */ char const *const *pcpcc; char **ppc; /* NEC SVR4.0.2 mips cc rejects this. */ struct point {int x, y;}; static struct point const zero = {0,0}; /* AIX XL C 1.02.0.0 rejects this. It does not let you subtract one const X* pointer from another in an arm of an if-expression whose if-part is not a constant expression */ const char *g = "string"; pcpcc = &g + (g ? g-g : 0); /* HPUX 7.0 cc rejects these. */ ++pcpcc; ppc = (char**) pcpcc; pcpcc = (char const *const *) ppc; { /* SCO 3.2v4 cc rejects this sort of thing. */ char tx; char *t = &tx; char const *s = 0 ? (char *) 0 : (char const *) 0; *t++ = 0; if (s) return 0; } { /* Someone thinks the Sun supposedly-ANSI compiler will reject this. */ int x[] = {25, 17}; const int *foo = &x[0]; ++foo; } { /* Sun SC1.0 ANSI compiler rejects this -- but not the above. */ typedef const int *iptr; iptr p = 0; ++p; } { /* AIX XL C 1.02.0.0 rejects this sort of thing, saying "k.c", line 2.27: 1506-025 (S) Operand must be a modifiable lvalue. */ struct s { int j; const int *ap[3]; } bx; struct s *b = &bx; b->j = 5; } { /* ULTRIX-32 V3.1 (Rev 9) vcc rejects this */ const int foo = 10; if (!foo) return 0; } return !cs[0] && !zero.x; #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_c_const=yes else ac_cv_c_const=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_const" >&5 $as_echo "$ac_cv_c_const" >&6; } if test $ac_cv_c_const = no; then $as_echo "#define const /**/" >>confdefs.h fi ac_fn_c_check_type "$LINENO" "size_t" "ac_cv_type_size_t" "$ac_includes_default" if test "x$ac_cv_type_size_t" = xyes; then : else cat >>confdefs.h <<_ACEOF #define size_t unsigned int _ACEOF fi # Checks for library functions. # The Ultrix 4.2 mips builtin alloca declared by alloca.h only works # for constant arguments. Useless! { $as_echo "$as_me:${as_lineno-$LINENO}: checking for working alloca.h" >&5 $as_echo_n "checking for working alloca.h... " >&6; } if ${ac_cv_working_alloca_h+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { char *p = (char *) alloca (2 * sizeof (int)); if (p) return 0; ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_working_alloca_h=yes else ac_cv_working_alloca_h=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_working_alloca_h" >&5 $as_echo "$ac_cv_working_alloca_h" >&6; } if test $ac_cv_working_alloca_h = yes; then $as_echo "#define HAVE_ALLOCA_H 1" >>confdefs.h fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for alloca" >&5 $as_echo_n "checking for alloca... " >&6; } if ${ac_cv_func_alloca_works+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __GNUC__ # define alloca __builtin_alloca #else # ifdef _MSC_VER # include # define alloca _alloca # else # ifdef HAVE_ALLOCA_H # include # else # ifdef _AIX #pragma alloca # else # ifndef alloca /* predefined by HP cc +Olibcalls */ void *alloca (size_t); # endif # endif # endif # endif #endif int main () { char *p = (char *) alloca (1); if (p) return 0; ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_func_alloca_works=yes else ac_cv_func_alloca_works=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_alloca_works" >&5 $as_echo "$ac_cv_func_alloca_works" >&6; } if test $ac_cv_func_alloca_works = yes; then $as_echo "#define HAVE_ALLOCA 1" >>confdefs.h else # The SVR3 libPW and SVR4 libucb both contain incompatible functions # that cause trouble. Some versions do not even contain alloca or # contain a buggy version. If you still want to use their alloca, # use ar to extract alloca.o from them instead of compiling alloca.c. ALLOCA=\${LIBOBJDIR}alloca.$ac_objext $as_echo "#define C_ALLOCA 1" >>confdefs.h { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether \`alloca.c' needs Cray hooks" >&5 $as_echo_n "checking whether \`alloca.c' needs Cray hooks... " >&6; } if ${ac_cv_os_cray+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #if defined CRAY && ! defined CRAY2 webecray #else wenotbecray #endif _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "webecray" >/dev/null 2>&1; then : ac_cv_os_cray=yes else ac_cv_os_cray=no fi rm -f conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_os_cray" >&5 $as_echo "$ac_cv_os_cray" >&6; } if test $ac_cv_os_cray = yes; then for ac_func in _getb67 GETB67 getb67; do as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" if eval test \"x\$"$as_ac_var"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define CRAY_STACKSEG_END $ac_func _ACEOF break fi done fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking stack direction for C alloca" >&5 $as_echo_n "checking stack direction for C alloca... " >&6; } if ${ac_cv_c_stack_direction+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : ac_cv_c_stack_direction=0 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default int find_stack_direction (int *addr, int depth) { int dir, dummy = 0; if (! addr) addr = &dummy; *addr = addr < &dummy ? 1 : addr == &dummy ? 0 : -1; dir = depth ? find_stack_direction (addr, depth - 1) : 0; return dir + dummy; } int main (int argc, char **argv) { return find_stack_direction (0, argc + !argv + 20) < 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : ac_cv_c_stack_direction=1 else ac_cv_c_stack_direction=-1 fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_stack_direction" >&5 $as_echo "$ac_cv_c_stack_direction" >&6; } cat >>confdefs.h <<_ACEOF #define STACK_DIRECTION $ac_cv_c_stack_direction _ACEOF fi for ac_header in stdlib.h do : ac_fn_c_check_header_mongrel "$LINENO" "stdlib.h" "ac_cv_header_stdlib_h" "$ac_includes_default" if test "x$ac_cv_header_stdlib_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_STDLIB_H 1 _ACEOF fi done { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU libc compatible malloc" >&5 $as_echo_n "checking for GNU libc compatible malloc... " >&6; } if ${ac_cv_func_malloc_0_nonnull+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : ac_cv_func_malloc_0_nonnull=no else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #if defined STDC_HEADERS || defined HAVE_STDLIB_H # include #else char *malloc (); #endif int main () { return ! malloc (0); ; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : ac_cv_func_malloc_0_nonnull=yes else ac_cv_func_malloc_0_nonnull=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_malloc_0_nonnull" >&5 $as_echo "$ac_cv_func_malloc_0_nonnull" >&6; } if test $ac_cv_func_malloc_0_nonnull = yes; then : $as_echo "#define HAVE_MALLOC 1" >>confdefs.h else $as_echo "#define HAVE_MALLOC 0" >>confdefs.h case " $LIBOBJS " in *" malloc.$ac_objext "* ) ;; *) LIBOBJS="$LIBOBJS malloc.$ac_objext" ;; esac $as_echo "#define malloc rpl_malloc" >>confdefs.h fi ac_config_files="$ac_config_files Makefile" cat >confcache <<\_ACEOF # This file is a shell script that caches the results of configure # tests run on this system so they can be shared between configure # scripts and configure runs, see configure's option --config-cache. # It is not useful on other systems. If it contains results you don't # want to keep, you may remove or edit it. # # config.status only pays attention to the cache file if you give it # the --recheck option to rerun configure. # # `ac_cv_env_foo' variables (set or unset) will be overridden when # loading this file, other *unset* `ac_cv_foo' will be assigned the # following values. _ACEOF # The following way of writing the cache mishandles newlines in values, # but we know of no workaround that is simple, portable, and efficient. # So, we kill variables containing newlines. # Ultrix sh set writes to stderr and can't be redirected directly, # and sets the high bit in the cache file unless we assign to the vars. ( for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space=' '; set) 2>&1` in #( *${as_nl}ac_space=\ *) # `set' does not quote correctly, so add quotes: double-quote # substitution turns \\\\ into \\, and sed turns \\ into \. sed -n \ "s/'/'\\\\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" ;; #( *) # `set' quotes correctly as required by POSIX, so do not add quotes. sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) | sed ' /^ac_cv_env_/b end t clear :clear s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ t end s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ :end' >>confcache if diff "$cache_file" confcache >/dev/null 2>&1; then :; else if test -w "$cache_file"; then if test "x$cache_file" != "x/dev/null"; then { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 $as_echo "$as_me: updating cache $cache_file" >&6;} if test ! -f "$cache_file" || test -h "$cache_file"; then cat confcache >"$cache_file" else case $cache_file in #( */* | ?:*) mv -f confcache "$cache_file"$$ && mv -f "$cache_file"$$ "$cache_file" ;; #( *) mv -f confcache "$cache_file" ;; esac fi fi else { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 $as_echo "$as_me: not updating unwritable cache $cache_file" >&6;} fi fi rm -f confcache test "x$prefix" = xNONE && prefix=$ac_default_prefix # Let make expand exec_prefix. test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' # Transform confdefs.h into DEFS. # Protect against shell expansion while executing Makefile rules. # Protect against Makefile macro expansion. # # If the first sed substitution is executed (which looks for macros that # take arguments), then branch to the quote section. Otherwise, # look for a macro that doesn't take arguments. ac_script=' :mline /\\$/{ N s,\\\n,, b mline } t clear :clear s/^[ ]*#[ ]*define[ ][ ]*\([^ (][^ (]*([^)]*)\)[ ]*\(.*\)/-D\1=\2/g t quote s/^[ ]*#[ ]*define[ ][ ]*\([^ ][^ ]*\)[ ]*\(.*\)/-D\1=\2/g t quote b any :quote s/[ `~#$^&*(){}\\|;'\''"<>?]/\\&/g s/\[/\\&/g s/\]/\\&/g s/\$/$$/g H :any ${ g s/^\n// s/\n/ /g p } ' DEFS=`sed -n "$ac_script" confdefs.h` ac_libobjs= ac_ltlibobjs= U= for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue # 1. Remove the extension, and $U if already installed. ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' ac_i=`$as_echo "$ac_i" | sed "$ac_script"` # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR # will be set to the directory where LIBOBJS objects are built. as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext" as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo' done LIBOBJS=$ac_libobjs LTLIBOBJS=$ac_ltlibobjs { $as_echo "$as_me:${as_lineno-$LINENO}: checking that generated files are newer than configure" >&5 $as_echo_n "checking that generated files are newer than configure... " >&6; } if test -n "$am_sleep_pid"; then # Hide warnings about reused PIDs. wait $am_sleep_pid 2>/dev/null fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: done" >&5 $as_echo "done" >&6; } if test -n "$EXEEXT"; then am__EXEEXT_TRUE= am__EXEEXT_FALSE='#' else am__EXEEXT_TRUE='#' am__EXEEXT_FALSE= fi if test -z "${MAINTAINER_MODE_TRUE}" && test -z "${MAINTAINER_MODE_FALSE}"; then as_fn_error $? "conditional \"MAINTAINER_MODE\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${AMDEP_TRUE}" && test -z "${AMDEP_FALSE}"; then as_fn_error $? "conditional \"AMDEP\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${am__fastdepCXX_TRUE}" && test -z "${am__fastdepCXX_FALSE}"; then as_fn_error $? "conditional \"am__fastdepCXX\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then as_fn_error $? "conditional \"am__fastdepCC\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi : "${CONFIG_STATUS=./config.status}" ac_write_fail=0 ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files $CONFIG_STATUS" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5 $as_echo "$as_me: creating $CONFIG_STATUS" >&6;} as_write_fail=0 cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1 #! $SHELL # Generated by $as_me. # Run this file to recreate the current configuration. # Compiler output produced by configure, useful for debugging # configure, is in config.log if it exists. debug=false ac_cs_recheck=false ac_cs_silent=false SHELL=\${CONFIG_SHELL-$SHELL} export SHELL _ASEOF cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1 ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in #( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi $as_echo "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -pR' fi else as_ln_s='cp -pR' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi # as_fn_executable_p FILE # ----------------------- # Test if FILE is an executable regular file. as_fn_executable_p () { test -f "$1" && test -x "$1" } # as_fn_executable_p as_test_x='test -x' as_executable_p=as_fn_executable_p # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" exec 6>&1 ## ----------------------------------- ## ## Main body of $CONFIG_STATUS script. ## ## ----------------------------------- ## _ASEOF test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1 cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Save the log message, to keep $0 and so on meaningful, and to # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" This file was extended by bison++ $as_me 2.21.5-dibbler, which was generated by GNU Autoconf 2.69. Invocation command line was CONFIG_FILES = $CONFIG_FILES CONFIG_HEADERS = $CONFIG_HEADERS CONFIG_LINKS = $CONFIG_LINKS CONFIG_COMMANDS = $CONFIG_COMMANDS $ $0 $@ on `(hostname || uname -n) 2>/dev/null | sed 1q` " _ACEOF case $ac_config_files in *" "*) set x $ac_config_files; shift; ac_config_files=$*;; esac cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 # Files that config.status was made for. config_files="$ac_config_files" config_commands="$ac_config_commands" _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 ac_cs_usage="\ \`$as_me' instantiates files and other configuration actions from templates according to the current configuration. Unless the files and actions are specified as TAGs, all are instantiated by default. Usage: $0 [OPTION]... [TAG]... -h, --help print this help, then exit -V, --version print version number and configuration settings, then exit --config print configuration, then exit -q, --quiet, --silent do not print progress messages -d, --debug don't remove temporary files --recheck update $as_me by reconfiguring in the same conditions --file=FILE[:TEMPLATE] instantiate the configuration file FILE Configuration files: $config_files Configuration commands: $config_commands Report bugs to ." _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" ac_cs_version="\\ bison++ config.status 2.21.5-dibbler configured by $0, generated by GNU Autoconf 2.69, with options \\"\$ac_cs_config\\" Copyright (C) 2012 Free Software Foundation, Inc. This config.status script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it." ac_pwd='$ac_pwd' srcdir='$srcdir' INSTALL='$INSTALL' MKDIR_P='$MKDIR_P' AWK='$AWK' test -n "\$AWK" || AWK=awk _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # The default lists apply if the user does not specify any file. ac_need_defaults=: while test $# != 0 do case $1 in --*=?*) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` ac_shift=: ;; --*=) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg= ac_shift=: ;; *) ac_option=$1 ac_optarg=$2 ac_shift=shift ;; esac case $ac_option in # Handling of the options. -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) ac_cs_recheck=: ;; --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) $as_echo "$ac_cs_version"; exit ;; --config | --confi | --conf | --con | --co | --c ) $as_echo "$ac_cs_config"; exit ;; --debug | --debu | --deb | --de | --d | -d ) debug=: ;; --file | --fil | --fi | --f ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; '') as_fn_error $? "missing file argument" ;; esac as_fn_append CONFIG_FILES " '$ac_optarg'" ac_need_defaults=false;; --he | --h | --help | --hel | -h ) $as_echo "$ac_cs_usage"; exit ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil | --si | --s) ac_cs_silent=: ;; # This is an error. -*) as_fn_error $? "unrecognized option: \`$1' Try \`$0 --help' for more information." ;; *) as_fn_append ac_config_targets " $1" ac_need_defaults=false ;; esac shift done ac_configure_extra_args= if $ac_cs_silent; then exec 6>/dev/null ac_configure_extra_args="$ac_configure_extra_args --silent" fi _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 if \$ac_cs_recheck; then set X $SHELL '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion shift \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6 CONFIG_SHELL='$SHELL' export CONFIG_SHELL exec "\$@" fi _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 exec 5>>config.log { echo sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX ## Running $as_me. ## _ASBOX $as_echo "$ac_log" } >&5 _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 # # INIT-COMMANDS # AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir" _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Handling of arguments. for ac_config_target in $ac_config_targets do case $ac_config_target in "depfiles") CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;; "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;; esac done # If the user did not use the arguments to specify the items to instantiate, # then the envvar interface is used. Set only those that are not. # We use the long form for the default assignment because of an extremely # bizarre bug on SunOS 4.1.3. if $ac_need_defaults; then test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files test "${CONFIG_COMMANDS+set}" = set || CONFIG_COMMANDS=$config_commands fi # Have a temporary directory for convenience. Make it in the build tree # simply because there is no reason against having it here, and in addition, # creating and moving files from /tmp can sometimes cause problems. # Hook for its removal unless debugging. # Note that there is a small window in which the directory will not be cleaned: # after its creation but before its name has been assigned to `$tmp'. $debug || { tmp= ac_tmp= trap 'exit_status=$? : "${ac_tmp:=$tmp}" { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status ' 0 trap 'as_fn_exit 1' 1 2 13 15 } # Create a (secure) tmp directory for tmp files. { tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && test -d "$tmp" } || { tmp=./conf$$-$RANDOM (umask 077 && mkdir "$tmp") } || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5 ac_tmp=$tmp # Set up the scripts for CONFIG_FILES section. # No need to generate them if there are no CONFIG_FILES. # This happens for instance with `./config.status config.h'. if test -n "$CONFIG_FILES"; then ac_cr=`echo X | tr X '\015'` # On cygwin, bash can eat \r inside `` if the user requested igncr. # But we know of no other shell where ac_cr would be empty at this # point, so we can use a bashism as a fallback. if test "x$ac_cr" = x; then eval ac_cr=\$\'\\r\' fi ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' /dev/null` if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then ac_cs_awk_cr='\\r' else ac_cs_awk_cr=$ac_cr fi echo 'BEGIN {' >"$ac_tmp/subs1.awk" && _ACEOF { echo "cat >conf$$subs.awk <<_ACEOF" && echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' && echo "_ACEOF" } >conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'` ac_delim='%!_!# ' for ac_last_try in false false false false false :; do . ./conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X` if test $ac_delim_n = $ac_delim_num; then break elif $ac_last_try; then as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done rm -f conf$$subs.sh cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK && _ACEOF sed -n ' h s/^/S["/; s/!.*/"]=/ p g s/^[^!]*!// :repl t repl s/'"$ac_delim"'$// t delim :nl h s/\(.\{148\}\)..*/\1/ t more1 s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/ p n b repl :more1 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t nl :delim h s/\(.\{148\}\)..*/\1/ t more2 s/["\\]/\\&/g; s/^/"/; s/$/"/ p b :more2 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t delim ' >$CONFIG_STATUS || ac_write_fail=1 rm -f conf$$subs.awk cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 _ACAWK cat >>"\$ac_tmp/subs1.awk" <<_ACAWK && for (key in S) S_is_set[key] = 1 FS = "" } { line = $ 0 nfields = split(line, field, "@") substed = 0 len = length(field[1]) for (i = 2; i < nfields; i++) { key = field[i] keylen = length(key) if (S_is_set[key]) { value = S[key] line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3) len += length(value) + length(field[++i]) substed = 1 } else len += 1 + keylen } print line } _ACAWK _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g" else cat fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \ || as_fn_error $? "could not setup config files machinery" "$LINENO" 5 _ACEOF # VPATH may cause trouble with some makes, so we remove sole $(srcdir), # ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and # trailing colons and then remove the whole line if VPATH becomes empty # (actually we leave an empty line to preserve line numbers). if test "x$srcdir" = x.; then ac_vpsub='/^[ ]*VPATH[ ]*=[ ]*/{ h s/// s/^/:/ s/[ ]*$/:/ s/:\$(srcdir):/:/g s/:\${srcdir}:/:/g s/:@srcdir@:/:/g s/^:*// s/:*$// x s/\(=[ ]*\).*/\1/ G s/\n// s/^[^=]*=[ ]*$// }' fi cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 fi # test -n "$CONFIG_FILES" eval set X " :F $CONFIG_FILES :C $CONFIG_COMMANDS" shift for ac_tag do case $ac_tag in :[FHLC]) ac_mode=$ac_tag; continue;; esac case $ac_mode$ac_tag in :[FHL]*:*);; :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;; :[FH]-) ac_tag=-:-;; :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; esac ac_save_IFS=$IFS IFS=: set x $ac_tag IFS=$ac_save_IFS shift ac_file=$1 shift case $ac_mode in :L) ac_source=$1;; :[FH]) ac_file_inputs= for ac_f do case $ac_f in -) ac_f="$ac_tmp/stdin";; *) # Look for the file first in the build tree, then in the source tree # (if the path is not absolute). The absolute path cannot be DOS-style, # because $ac_f cannot contain `:'. test -f "$ac_f" || case $ac_f in [\\/$]*) false;; *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; esac || as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;; esac case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac as_fn_append ac_file_inputs " '$ac_f'" done # Let's still pretend it is `configure' which instantiates (i.e., don't # use $as_me), people would be surprised to read: # /* config.h. Generated by config.status. */ configure_input='Generated from '` $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' `' by configure.' if test x"$ac_file" != x-; then configure_input="$ac_file. $configure_input" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5 $as_echo "$as_me: creating $ac_file" >&6;} fi # Neutralize special characters interpreted by sed in replacement strings. case $configure_input in #( *\&* | *\|* | *\\* ) ac_sed_conf_input=`$as_echo "$configure_input" | sed 's/[\\\\&|]/\\\\&/g'`;; #( *) ac_sed_conf_input=$configure_input;; esac case $ac_tag in *:-:* | *:-) cat >"$ac_tmp/stdin" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; esac ;; esac ac_dir=`$as_dirname -- "$ac_file" || $as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$ac_file" : 'X\(//\)[^/]' \| \ X"$ac_file" : 'X\(//\)$' \| \ X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$ac_file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` as_dir="$ac_dir"; as_fn_mkdir_p ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix case $ac_mode in :F) # # CONFIG_FILE # case $INSTALL in [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;; esac ac_MKDIR_P=$MKDIR_P case $MKDIR_P in [\\/$]* | ?:[\\/]* ) ;; */*) ac_MKDIR_P=$ac_top_build_prefix$MKDIR_P ;; esac _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # If the template does not know about datarootdir, expand it. # FIXME: This hack should be removed a few years after 2.60. ac_datarootdir_hack=; ac_datarootdir_seen= ac_sed_dataroot=' /datarootdir/ { p q } /@datadir@/p /@docdir@/p /@infodir@/p /@localedir@/p /@mandir@/p' case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in *datarootdir*) ac_datarootdir_seen=yes;; *@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 $as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_datarootdir_hack=' s&@datadir@&$datadir&g s&@docdir@&$docdir&g s&@infodir@&$infodir&g s&@localedir@&$localedir&g s&@mandir@&$mandir&g s&\\\${datarootdir}&$datarootdir&g' ;; esac _ACEOF # Neutralize VPATH when `$srcdir' = `.'. # Shell code in configure.ac might set extrasub. # FIXME: do we really want to maintain this feature? cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_sed_extra="$ac_vpsub $extrasub _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 :t /@[a-zA-Z_][a-zA-Z_0-9]*@/!b s|@configure_input@|$ac_sed_conf_input|;t t s&@top_builddir@&$ac_top_builddir_sub&;t t s&@top_build_prefix@&$ac_top_build_prefix&;t t s&@srcdir@&$ac_srcdir&;t t s&@abs_srcdir@&$ac_abs_srcdir&;t t s&@top_srcdir@&$ac_top_srcdir&;t t s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t s&@builddir@&$ac_builddir&;t t s&@abs_builddir@&$ac_abs_builddir&;t t s&@abs_top_builddir@&$ac_abs_top_builddir&;t t s&@INSTALL@&$ac_INSTALL&;t t s&@MKDIR_P@&$ac_MKDIR_P&;t t $ac_datarootdir_hack " eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \ >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5 test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } && { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \ "$ac_tmp/out"`; test -z "$ac_out"; } && { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&5 $as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&2;} rm -f "$ac_tmp/stdin" case $ac_file in -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";; *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";; esac \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; :C) { $as_echo "$as_me:${as_lineno-$LINENO}: executing $ac_file commands" >&5 $as_echo "$as_me: executing $ac_file commands" >&6;} ;; esac case $ac_file$ac_mode in "depfiles":C) test x"$AMDEP_TRUE" != x"" || { # Older Autoconf quotes --file arguments for eval, but not when files # are listed without --file. Let's play safe and only enable the eval # if we detect the quoting. case $CONFIG_FILES in *\'*) eval set x "$CONFIG_FILES" ;; *) set x $CONFIG_FILES ;; esac shift for mf do # Strip MF so we end up with the name of the file. mf=`echo "$mf" | sed -e 's/:.*$//'` # Check whether this is an Automake generated Makefile or not. # We used to match only the files named 'Makefile.in', but # some people rename them; so instead we look at the file content. # Grep'ing the first line is not enough: some people post-process # each Makefile.in and add a new line on top of each file to say so. # Grep'ing the whole file is not good either: AIX grep has a line # limit of 2048, but all sed's we know have understand at least 4000. if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then dirpart=`$as_dirname -- "$mf" || $as_expr X"$mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$mf" : 'X\(//\)[^/]' \| \ X"$mf" : 'X\(//\)$' \| \ X"$mf" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$mf" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` else continue fi # Extract the definition of DEPDIR, am__include, and am__quote # from the Makefile without running 'make'. DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` test -z "$DEPDIR" && continue am__include=`sed -n 's/^am__include = //p' < "$mf"` test -z "$am__include" && continue am__quote=`sed -n 's/^am__quote = //p' < "$mf"` # Find all dependency output files, they are included files with # $(DEPDIR) in their names. We invoke sed twice because it is the # simplest approach to changing $(DEPDIR) to its actual value in the # expansion. for file in `sed -n " s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g'`; do # Make sure the directory exists. test -f "$dirpart/$file" && continue fdir=`$as_dirname -- "$file" || $as_expr X"$file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$file" : 'X\(//\)[^/]' \| \ X"$file" : 'X\(//\)$' \| \ X"$file" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` as_dir=$dirpart/$fdir; as_fn_mkdir_p # echo "creating $dirpart/$file" echo '# dummy' > "$dirpart/$file" done done } ;; esac done # for ac_tag as_fn_exit 0 _ACEOF ac_clean_files=$ac_clean_files_save test $ac_write_fail = 0 || as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5 # configure is writing to config.log, and then calls config.status. # config.status does its own redirection, appending to config.log. # Unfortunately, on DOS this fails, as config.log is still kept open # by configure, so config.status won't be able to write to it; its # output is simply discarded. So we exec the FD to /dev/null, # effectively closing config.log, so it can be properly (re)opened and # appended to by config.status. When coming back to configure, we # need to make the FD available again. if test "$no_create" != yes; then ac_cs_success=: ac_config_status_args= test "$silent" = yes && ac_config_status_args="$ac_config_status_args --quiet" exec 5>/dev/null $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false exec 5>>config.log # Use ||, not &&, to avoid exiting from the if with $? = 1, which # would make configure fail if this is the last instruction. $ac_cs_success || as_fn_exit 1 fi if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} fi dibbler-1.0.1/bison++/bison.info-30000664000175000017500000014205712233256142013437 00000000000000This is bison.info, produced by makeinfo version 4.1 from bison.texinfo. START-INFO-DIR-ENTRY * bison: (bison). GNU Project parser generator (yacc replacement). END-INFO-DIR-ENTRY This file documents the Bison parser generator. Copyright (C) 1988, 89, 90, 91, 92, 93, 95, 98, 1999 Free Software Foundation, Inc. Permission is granted to make and distribute verbatim copies of this manual provided the copyright notice and this permission notice are preserved on all copies. Permission is granted to copy and distribute modified versions of this manual under the conditions for verbatim copying, provided also that the sections entitled "GNU General Public License" and "Conditions for Using Bison" are included exactly as in the original, and provided that the entire resulting derived work is distributed under the terms of a permission notice identical to this one. Permission is granted to copy and distribute translations of this manual into another language, under the above conditions for modified versions, except that the sections entitled "GNU General Public License", "Conditions for Using Bison" and this permission notice may be included in translations approved by the Free Software Foundation instead of in the original English.  File: bison.info, Node: Mid-Rule Actions, Prev: Action Types, Up: Semantics Actions in Mid-Rule ------------------- Occasionally it is useful to put an action in the middle of a rule. These actions are written just like usual end-of-rule actions, but they are executed before the parser even recognizes the following components. A mid-rule action may refer to the components preceding it using `$N', but it may not refer to subsequent components because it is run before they are parsed. The mid-rule action itself counts as one of the components of the rule. This makes a difference when there is another action later in the same rule (and usually there is another at the end): you have to count the actions along with the symbols when working out which number N to use in `$N'. The mid-rule action can also have a semantic value. The action can set its value with an assignment to `$$', and actions later in the rule can refer to the value using `$N'. Since there is no symbol to name the action, there is no way to declare a data type for the value in advance, so you must use the `$<...>' construct to specify a data type each time you refer to this value. There is no way to set the value of the entire rule with a mid-rule action, because assignments to `$$' do not have that effect. The only way to set the value for the entire rule is with an ordinary action at the end of the rule. Here is an example from a hypothetical compiler, handling a `let' statement that looks like `let (VARIABLE) STATEMENT' and serves to create a variable named VARIABLE temporarily for the duration of STATEMENT. To parse this construct, we must put VARIABLE into the symbol table while STATEMENT is parsed, then remove it afterward. Here is how it is done: stmt: LET '(' var ')' { $$ = push_context (); declare_variable ($3); } stmt { $$ = $6; pop_context ($5); } As soon as `let (VARIABLE)' has been recognized, the first action is run. It saves a copy of the current semantic context (the list of accessible variables) as its semantic value, using alternative `context' in the data-type union. Then it calls `declare_variable' to add the new variable to that list. Once the first action is finished, the embedded statement `stmt' can be parsed. Note that the mid-rule action is component number 5, so the `stmt' is component number 6. After the embedded statement is parsed, its semantic value becomes the value of the entire `let'-statement. Then the semantic value from the earlier action is used to restore the prior list of variables. This removes the temporary `let'-variable from the list so that it won't appear to exist while the rest of the program is parsed. Taking action before a rule is completely recognized often leads to conflicts since the parser must commit to a parse in order to execute the action. For example, the following two rules, without mid-rule actions, can coexist in a working parser because the parser can shift the open-brace token and look at what follows before deciding whether there is a declaration or not: compound: '{' declarations statements '}' | '{' statements '}' ; But when we add a mid-rule action as follows, the rules become nonfunctional: compound: { prepare_for_local_variables (); } '{' declarations statements '}' | '{' statements '}' ; Now the parser is forced to decide whether to run the mid-rule action when it has read no farther than the open-brace. In other words, it must commit to using one rule or the other, without sufficient information to do it correctly. (The open-brace token is what is called the "look-ahead" token at this time, since the parser is still deciding what to do about it. *Note Look-Ahead Tokens: Look-Ahead.) You might think that you could correct the problem by putting identical actions into the two rules, like this: compound: { prepare_for_local_variables (); } '{' declarations statements '}' | { prepare_for_local_variables (); } '{' statements '}' ; But this does not help, because Bison does not realize that the two actions are identical. (Bison never tries to understand the C code in an action.) If the grammar is such that a declaration can be distinguished from a statement by the first token (which is true in C), then one solution which does work is to put the action after the open-brace, like this: compound: '{' { prepare_for_local_variables (); } declarations statements '}' | '{' statements '}' ; Now the first token of the following declaration or statement, which would in any case tell Bison which rule to use, can still do so. Another solution is to bury the action inside a nonterminal symbol which serves as a subroutine: subroutine: /* empty */ { prepare_for_local_variables (); } ; compound: subroutine '{' declarations statements '}' | subroutine '{' statements '}' ; Now Bison can execute the action in the rule for `subroutine' without deciding which rule for `compound' it will eventually use. Note that the action is now at the end of its rule. Any mid-rule action can be converted to an end-of-rule action in this way, and this is what Bison actually does to implement mid-rule actions.  File: bison.info, Node: Declarations, Next: Multiple Parsers, Prev: Semantics, Up: Grammar File Bison Declarations ================== The "Bison declarations" section of a Bison grammar defines the symbols used in formulating the grammar and the data types of semantic values. *Note Symbols::. All token type names (but not single-character literal tokens such as `'+'' and `'*'') must be declared. Nonterminal symbols must be declared if you need to specify which data type to use for the semantic value (*note More Than One Value Type: Multiple Types.). The first rule in the file also specifies the start symbol, by default. If you want some other symbol to be the start symbol, you must declare it explicitly (*note Languages and Context-Free Grammars: Language and Grammar.). * Menu: * Token Decl:: Declaring terminal symbols. * Precedence Decl:: Declaring terminals with precedence and associativity. * Union Decl:: Declaring the set of all semantic value types. * Type Decl:: Declaring the choice of type for a nonterminal symbol. * Expect Decl:: Suppressing warnings about shift/reduce conflicts. * Start Decl:: Specifying the start symbol. * Pure Decl:: Requesting a reentrant parser. * Decl Summary:: Table of all Bison declarations.  File: bison.info, Node: Token Decl, Next: Precedence Decl, Up: Declarations Token Type Names ---------------- The basic way to declare a token type name (terminal symbol) is as follows: %token NAME Bison will convert this into a `#define' directive in the parser, so that the function `yylex' (if it is in this file) can use the name NAME to stand for this token type's code. Alternatively, you can use `%left', `%right', or `%nonassoc' instead of `%token', if you wish to specify precedence. *Note Operator Precedence: Precedence Decl. You can explicitly specify the numeric code for a token type by appending an integer value in the field immediately following the token name: %token NUM 300 It is generally best, however, to let Bison choose the numeric codes for all token types. Bison will automatically select codes that don't conflict with each other or with ASCII characters. In the event that the stack type is a union, you must augment the `%token' or other token declaration to include the data type alternative delimited by angle-brackets (*note More Than One Value Type: Multiple Types.). For example: %union { /* define stack type */ double val; symrec *tptr; } %token NUM /* define token NUM and its type */ You can associate a literal string token with a token type name by writing the literal string at the end of a `%token' declaration which declares the name. For example: %token arrow "=>" For example, a grammar for the C language might specify these names with equivalent literal string tokens: %token OR "||" %token LE 134 "<=" %left OR "<=" Once you equate the literal string and the token name, you can use them interchangeably in further declarations or the grammar rules. The `yylex' function can use the token name or the literal string to obtain the token type code number (*note Calling Convention::).  File: bison.info, Node: Precedence Decl, Next: Union Decl, Prev: Token Decl, Up: Declarations Operator Precedence ------------------- Use the `%left', `%right' or `%nonassoc' declaration to declare a token and specify its precedence and associativity, all at once. These are called "precedence declarations". *Note Operator Precedence: Precedence, for general information on operator precedence. The syntax of a precedence declaration is the same as that of `%token': either %left SYMBOLS... or %left SYMBOLS... And indeed any of these declarations serves the purposes of `%token'. But in addition, they specify the associativity and relative precedence for all the SYMBOLS: * The associativity of an operator OP determines how repeated uses of the operator nest: whether `X OP Y OP Z' is parsed by grouping X with Y first or by grouping Y with Z first. `%left' specifies left-associativity (grouping X with Y first) and `%right' specifies right-associativity (grouping Y with Z first). `%nonassoc' specifies no associativity, which means that `X OP Y OP Z' is considered a syntax error. * The precedence of an operator determines how it nests with other operators. All the tokens declared in a single precedence declaration have equal precedence and nest together according to their associativity. When two tokens declared in different precedence declarations associate, the one declared later has the higher precedence and is grouped first.  File: bison.info, Node: Union Decl, Next: Type Decl, Prev: Precedence Decl, Up: Declarations The Collection of Value Types ----------------------------- The `%union' declaration specifies the entire collection of possible data types for semantic values. The keyword `%union' is followed by a pair of braces containing the same thing that goes inside a `union' in C. For example: %union { double val; symrec *tptr; } This says that the two alternative types are `double' and `symrec *'. They are given names `val' and `tptr'; these names are used in the `%token' and `%type' declarations to pick one of the types for a terminal or nonterminal symbol (*note Nonterminal Symbols: Type Decl.). Note that, unlike making a `union' declaration in C, you do not write a semicolon after the closing brace.  File: bison.info, Node: Type Decl, Next: Expect Decl, Prev: Union Decl, Up: Declarations Nonterminal Symbols ------------------- When you use `%union' to specify multiple value types, you must declare the value type of each nonterminal symbol for which values are used. This is done with a `%type' declaration, like this: %type NONTERMINAL... Here NONTERMINAL is the name of a nonterminal symbol, and TYPE is the name given in the `%union' to the alternative that you want (*note The Collection of Value Types: Union Decl.). You can give any number of nonterminal symbols in the same `%type' declaration, if they have the same value type. Use spaces to separate the symbol names. You can also declare the value type of a terminal symbol. To do this, use the same `' construction in a declaration for the terminal symbol. All kinds of token declarations allow `'.  File: bison.info, Node: Expect Decl, Next: Start Decl, Prev: Type Decl, Up: Declarations Suppressing Conflict Warnings ----------------------------- Bison normally warns if there are any conflicts in the grammar (*note Shift/Reduce Conflicts: Shift/Reduce.), but most real grammars have harmless shift/reduce conflicts which are resolved in a predictable way and would be difficult to eliminate. It is desirable to suppress the warning about these conflicts unless the number of conflicts changes. You can do this with the `%expect' declaration. The declaration looks like this: %expect N Here N is a decimal integer. The declaration says there should be no warning if there are N shift/reduce conflicts and no reduce/reduce conflicts. The usual warning is given if there are either more or fewer conflicts, or if there are any reduce/reduce conflicts. In general, using `%expect' involves these steps: * Compile your grammar without `%expect'. Use the `-v' option to get a verbose list of where the conflicts occur. Bison will also print the number of conflicts. * Check each of the conflicts to make sure that Bison's default resolution is what you really want. If not, rewrite the grammar and go back to the beginning. * Add an `%expect' declaration, copying the number N from the number which Bison printed. Now Bison will stop annoying you about the conflicts you have checked, but it will warn you again if changes in the grammar result in additional conflicts.  File: bison.info, Node: Start Decl, Next: Pure Decl, Prev: Expect Decl, Up: Declarations The Start-Symbol ---------------- Bison assumes by default that the start symbol for the grammar is the first nonterminal specified in the grammar specification section. The programmer may override this restriction with the `%start' declaration as follows: %start SYMBOL  File: bison.info, Node: Pure Decl, Next: Decl Summary, Prev: Start Decl, Up: Declarations A Pure (Reentrant) Parser ------------------------- A "reentrant" program is one which does not alter in the course of execution; in other words, it consists entirely of "pure" (read-only) code. Reentrancy is important whenever asynchronous execution is possible; for example, a nonreentrant program may not be safe to call from a signal handler. In systems with multiple threads of control, a nonreentrant program must be called only within interlocks. Normally, Bison generates a parser which is not reentrant. This is suitable for most uses, and it permits compatibility with YACC. (The standard YACC interfaces are inherently nonreentrant, because they use statically allocated variables for communication with `yylex', including `yylval' and `yylloc'.) Alternatively, you can generate a pure, reentrant parser. The Bison declaration `%pure_parser' says that you want the parser to be reentrant. It looks like this: %pure_parser The result is that the communication variables `yylval' and `yylloc' become local variables in `yyparse', and a different calling convention is used for the lexical analyzer function `yylex'. *Note Calling Conventions for Pure Parsers: Pure Calling, for the details of this. The variable `yynerrs' also becomes local in `yyparse' (*note The Error Reporting Function `yyerror': Error Reporting.). The convention for calling `yyparse' itself is unchanged. Whether the parser is pure has nothing to do with the grammar rules. You can generate either a pure parser or a nonreentrant parser from any valid grammar.  File: bison.info, Node: Decl Summary, Prev: Pure Decl, Up: Declarations Bison Declaration Summary ------------------------- Here is a summary of all Bison declarations: `%union' Declare the collection of data types that semantic values may have (*note The Collection of Value Types: Union Decl.). `%token' Declare a terminal symbol (token type name) with no precedence or associativity specified (*note Token Type Names: Token Decl.). `%right' Declare a terminal symbol (token type name) that is right-associative (*note Operator Precedence: Precedence Decl.). `%left' Declare a terminal symbol (token type name) that is left-associative (*note Operator Precedence: Precedence Decl.). `%nonassoc' Declare a terminal symbol (token type name) that is nonassociative (using it in a way that would be associative is a syntax error) (*note Operator Precedence: Precedence Decl.). `%type' Declare the type of semantic values for a nonterminal symbol (*note Nonterminal Symbols: Type Decl.). `%start' Specify the grammar's start symbol (*note The Start-Symbol: Start Decl.). `%expect' Declare the expected number of shift-reduce conflicts (*note Suppressing Conflict Warnings: Expect Decl.). `%pure_parser' Request a pure (reentrant) parser program (*note A Pure (Reentrant) Parser: Pure Decl.). `%no_lines' Don't generate any `#line' preprocessor commands in the parser file. Ordinarily Bison writes these commands in the parser file so that the C compiler and debuggers will associate errors and object code with your source file (the grammar file). This directive causes them to associate errors with the parser file, treating it an independent source file in its own right. `%raw' The output file `NAME.h' normally defines the tokens with Yacc-compatible token numbers. If this option is specified, the internal Bison numbers are used instead. (Yacc-compatible numbers start at 257 except for single character tokens; Bison assigns token numbers sequentially for all tokens starting at 3.) `%token_table' Generate an array of token names in the parser file. The name of the array is `yytname'; `yytname[I]' is the name of the token whose internal Bison token code number is I. The first three elements of `yytname' are always `"$"', `"error"', and `"$illegal"'; after these come the symbols defined in the grammar file. For single-character literal tokens and literal string tokens, the name in the table includes the single-quote or double-quote characters: for example, `"'+'"' is a single-character literal and `"\"<=\""' is a literal string token. All the characters of the literal string token appear verbatim in the string found in the table; even double-quote characters are not escaped. For example, if the token consists of three characters `*"*', its string in `yytname' contains `"*"*"'. (In C, that would be written as `"\"*\"*\""'). When you specify `%token_table', Bison also generates macro definitions for macros `YYNTOKENS', `YYNNTS', and `YYNRULES', and `YYNSTATES': `YYNTOKENS' The highest token number, plus one. `YYNNTS' The number of non-terminal symbols. `YYNRULES' The number of grammar rules, `YYNSTATES' The number of parser states (*note Parser States::).  File: bison.info, Node: Multiple Parsers, Prev: Declarations, Up: Grammar File Multiple Parsers in the Same Program ==================================== Most programs that use Bison parse only one language and therefore contain only one Bison parser. But what if you want to parse more than one language with the same program? Then you need to avoid a name conflict between different definitions of `yyparse', `yylval', and so on. The easy way to do this is to use the option `-p PREFIX' (*note Invoking Bison: Invocation.). This renames the interface functions and variables of the Bison parser to start with PREFIX instead of `yy'. You can use this to give each parser distinct names that do not conflict. The precise list of symbols renamed is `yyparse', `yylex', `yyerror', `yynerrs', `yylval', `yychar' and `yydebug'. For example, if you use `-p c', the names become `cparse', `clex', and so on. *All the other variables and macros associated with Bison are not renamed.* These others are not global; there is no conflict if the same name is used in different parsers. For example, `YYSTYPE' is not renamed, but defining this in different ways in different parsers causes no trouble (*note Data Types of Semantic Values: Value Type.). The `-p' option works by adding macro definitions to the beginning of the parser source file, defining `yyparse' as `PREFIXparse', and so on. This effectively substitutes one name for the other in the entire parser file.  File: bison.info, Node: Interface, Next: Algorithm, Prev: Grammar File, Up: Top Parser C-Language Interface *************************** The Bison parser is actually a C function named `yyparse'. Here we describe the interface conventions of `yyparse' and the other functions that it needs to use. Keep in mind that the parser uses many C identifiers starting with `yy' and `YY' for internal purposes. If you use such an identifier (aside from those in this manual) in an action or in additional C code in the grammar file, you are likely to run into trouble. * Menu: * Parser Function:: How to call `yyparse' and what it returns. * Lexical:: You must supply a function `yylex' which reads tokens. * Error Reporting:: You must supply a function `yyerror'. * Action Features:: Special features for use in actions.  File: bison.info, Node: Parser Function, Next: Lexical, Up: Interface The Parser Function `yyparse' ============================= You call the function `yyparse' to cause parsing to occur. This function reads tokens, executes actions, and ultimately returns when it encounters end-of-input or an unrecoverable syntax error. You can also write an action which directs `yyparse' to return immediately without reading further. The value returned by `yyparse' is 0 if parsing was successful (return is due to end-of-input). The value is 1 if parsing failed (return is due to a syntax error). In an action, you can cause immediate return from `yyparse' by using these macros: `YYACCEPT' Return immediately with value 0 (to report success). `YYABORT' Return immediately with value 1 (to report failure).  File: bison.info, Node: Lexical, Next: Error Reporting, Prev: Parser Function, Up: Interface The Lexical Analyzer Function `yylex' ===================================== The "lexical analyzer" function, `yylex', recognizes tokens from the input stream and returns them to the parser. Bison does not create this function automatically; you must write it so that `yyparse' can call it. The function is sometimes referred to as a lexical scanner. In simple programs, `yylex' is often defined at the end of the Bison grammar file. If `yylex' is defined in a separate source file, you need to arrange for the token-type macro definitions to be available there. To do this, use the `-d' option when you run Bison, so that it will write these macro definitions into a separate header file `NAME.tab.h' which you can include in the other source files that need it. *Note Invoking Bison: Invocation. * Menu: * Calling Convention:: How `yyparse' calls `yylex'. * Token Values:: How `yylex' must return the semantic value of the token it has read. * Token Positions:: How `yylex' must return the text position (line number, etc.) of the token, if the actions want that. * Pure Calling:: How the calling convention differs in a pure parser (*note A Pure (Reentrant) Parser: Pure Decl.).  File: bison.info, Node: Calling Convention, Next: Token Values, Up: Lexical Calling Convention for `yylex' ------------------------------ The value that `yylex' returns must be the numeric code for the type of token it has just found, or 0 for end-of-input. When a token is referred to in the grammar rules by a name, that name in the parser file becomes a C macro whose definition is the proper numeric code for that token type. So `yylex' can use the name to indicate that type. *Note Symbols::. When a token is referred to in the grammar rules by a character literal, the numeric code for that character is also the code for the token type. So `yylex' can simply return that character code. The null character must not be used this way, because its code is zero and that is what signifies end-of-input. Here is an example showing these things: yylex () { ... if (c == EOF) /* Detect end of file. */ return 0; ... if (c == '+' || c == '-') return c; /* Assume token type for `+' is '+'. */ ... return INT; /* Return the type of the token. */ ... } This interface has been designed so that the output from the `lex' utility can be used without change as the definition of `yylex'. If the grammar uses literal string tokens, there are two ways that `yylex' can determine the token type codes for them: * If the grammar defines symbolic token names as aliases for the literal string tokens, `yylex' can use these symbolic names like all others. In this case, the use of the literal string tokens in the grammar file has no effect on `yylex'. * `yylex' can find the multi-character token in the `yytname' table. The index of the token in the table is the token type's code. The name of a multi-character token is recorded in `yytname' with a double-quote, the token's characters, and another double-quote. The token's characters are not escaped in any way; they appear verbatim in the contents of the string in the table. Here's code for looking up a token in `yytname', assuming that the characters of the token are stored in `token_buffer'. for (i = 0; i < YYNTOKENS; i++) { if (yytname[i] != 0 && yytname[i][0] == '"' && strncmp (yytname[i] + 1, token_buffer, strlen (token_buffer)) && yytname[i][strlen (token_buffer) + 1] == '"' && yytname[i][strlen (token_buffer) + 2] == 0) break; } The `yytname' table is generated only if you use the `%token_table' declaration. *Note Decl Summary::.  File: bison.info, Node: Token Values, Next: Token Positions, Prev: Calling Convention, Up: Lexical Semantic Values of Tokens ------------------------- In an ordinary (nonreentrant) parser, the semantic value of the token must be stored into the global variable `yylval'. When you are using just one data type for semantic values, `yylval' has that type. Thus, if the type is `int' (the default), you might write this in `yylex': ... yylval = value; /* Put value onto Bison stack. */ return INT; /* Return the type of the token. */ ... When you are using multiple data types, `yylval''s type is a union made from the `%union' declaration (*note The Collection of Value Types: Union Decl.). So when you store a token's value, you must use the proper member of the union. If the `%union' declaration looks like this: %union { int intval; double val; symrec *tptr; } then the code in `yylex' might look like this: ... yylval.intval = value; /* Put value onto Bison stack. */ return INT; /* Return the type of the token. */ ...  File: bison.info, Node: Token Positions, Next: Pure Calling, Prev: Token Values, Up: Lexical Textual Positions of Tokens --------------------------- If you are using the `@N'-feature (*note Special Features for Use in Actions: Action Features.) in actions to keep track of the textual locations of tokens and groupings, then you must provide this information in `yylex'. The function `yyparse' expects to find the textual location of a token just parsed in the global variable `yylloc'. So `yylex' must store the proper data in that variable. The value of `yylloc' is a structure and you need only initialize the members that are going to be used by the actions. The four members are called `first_line', `first_column', `last_line' and `last_column'. Note that the use of this feature makes the parser noticeably slower. The data type of `yylloc' has the name `YYLTYPE'.  File: bison.info, Node: Pure Calling, Prev: Token Positions, Up: Lexical Calling Conventions for Pure Parsers ------------------------------------ When you use the Bison declaration `%pure_parser' to request a pure, reentrant parser, the global communication variables `yylval' and `yylloc' cannot be used. (*Note A Pure (Reentrant) Parser: Pure Decl.) In such parsers the two global variables are replaced by pointers passed as arguments to `yylex'. You must declare them as shown here, and pass the information back by storing it through those pointers. yylex (lvalp, llocp) YYSTYPE *lvalp; YYLTYPE *llocp; { ... *lvalp = value; /* Put value onto Bison stack. */ return INT; /* Return the type of the token. */ ... } If the grammar file does not use the `@' constructs to refer to textual positions, then the type `YYLTYPE' will not be defined. In this case, omit the second argument; `yylex' will be called with only one argument. If you use a reentrant parser, you can optionally pass additional parameter information to it in a reentrant way. To do so, define the macro `YYPARSE_PARAM' as a variable name. This modifies the `yyparse' function to accept one argument, of type `void *', with that name. When you call `yyparse', pass the address of an object, casting the address to `void *'. The grammar actions can refer to the contents of the object by casting the pointer value back to its proper type and then dereferencing it. Here's an example. Write this in the parser: %{ struct parser_control { int nastiness; int randomness; }; #define YYPARSE_PARAM parm %} Then call the parser like this: struct parser_control { int nastiness; int randomness; }; ... { struct parser_control foo; ... /* Store proper data in `foo'. */ value = yyparse ((void *) &foo); ... } In the grammar actions, use expressions like this to refer to the data: ((struct parser_control *) parm)->randomness If you wish to pass the additional parameter data to `yylex', define the macro `YYLEX_PARAM' just like `YYPARSE_PARAM', as shown here: %{ struct parser_control { int nastiness; int randomness; }; #define YYPARSE_PARAM parm #define YYLEX_PARAM parm %} You should then define `yylex' to accept one additional argument--the value of `parm'. (This makes either two or three arguments in total, depending on whether an argument of type `YYLTYPE' is passed.) You can declare the argument as a pointer to the proper object type, or you can declare it as `void *' and access the contents as shown above. You can use `%pure_parser' to request a reentrant parser without also using `YYPARSE_PARAM'. Then you should call `yyparse' with no arguments, as usual.  File: bison.info, Node: Error Reporting, Next: Action Features, Prev: Lexical, Up: Interface The Error Reporting Function `yyerror' ====================================== The Bison parser detects a "parse error" or "syntax error" whenever it reads a token which cannot satisfy any syntax rule. A action in the grammar can also explicitly proclaim an error, using the macro `YYERROR' (*note Special Features for Use in Actions: Action Features.). The Bison parser expects to report the error by calling an error reporting function named `yyerror', which you must supply. It is called by `yyparse' whenever a syntax error is found, and it receives one argument. For a parse error, the string is normally `"parse error"'. If you define the macro `YYERROR_VERBOSE' in the Bison declarations section (*note The Bison Declarations Section: Bison Declarations.), then Bison provides a more verbose and specific error message string instead of just plain `"parse error"'. It doesn't matter what definition you use for `YYERROR_VERBOSE', just whether you define it. The parser can detect one other kind of error: stack overflow. This happens when the input contains constructions that are very deeply nested. It isn't likely you will encounter this, since the Bison parser extends its stack automatically up to a very large limit. But if overflow happens, `yyparse' calls `yyerror' in the usual fashion, except that the argument string is `"parser stack overflow"'. The following definition suffices in simple programs: yyerror (s) char *s; { fprintf (stderr, "%s\n", s); } After `yyerror' returns to `yyparse', the latter will attempt error recovery if you have written suitable error recovery grammar rules (*note Error Recovery::). If recovery is impossible, `yyparse' will immediately return 1. The variable `yynerrs' contains the number of syntax errors encountered so far. Normally this variable is global; but if you request a pure parser (*note A Pure (Reentrant) Parser: Pure Decl.) then it is a local variable which only the actions can access.  File: bison.info, Node: Action Features, Prev: Error Reporting, Up: Interface Special Features for Use in Actions =================================== Here is a table of Bison constructs, variables and macros that are useful in actions. `$$' Acts like a variable that contains the semantic value for the grouping made by the current rule. *Note Actions::. `$N' Acts like a variable that contains the semantic value for the Nth component of the current rule. *Note Actions::. `$$' Like `$$' but specifies alternative TYPEALT in the union specified by the `%union' declaration. *Note Data Types of Values in Actions: Action Types. `$N' Like `$N' but specifies alternative TYPEALT in the union specified by the `%union' declaration. *Note Data Types of Values in Actions: Action Types. `YYABORT;' Return immediately from `yyparse', indicating failure. *Note The Parser Function `yyparse': Parser Function. `YYACCEPT;' Return immediately from `yyparse', indicating success. *Note The Parser Function `yyparse': Parser Function. `YYBACKUP (TOKEN, VALUE);' Unshift a token. This macro is allowed only for rules that reduce a single value, and only when there is no look-ahead token. It installs a look-ahead token with token type TOKEN and semantic value VALUE; then it discards the value that was going to be reduced by this rule. If the macro is used when it is not valid, such as when there is a look-ahead token already, then it reports a syntax error with a message `cannot back up' and performs ordinary error recovery. In either case, the rest of the action is not executed. `YYEMPTY' Value stored in `yychar' when there is no look-ahead token. `YYERROR;' Cause an immediate syntax error. This statement initiates error recovery just as if the parser itself had detected an error; however, it does not call `yyerror', and does not print any message. If you want to print an error message, call `yyerror' explicitly before the `YYERROR;' statement. *Note Error Recovery::. `YYRECOVERING' This macro stands for an expression that has the value 1 when the parser is recovering from a syntax error, and 0 the rest of the time. *Note Error Recovery::. `yychar' Variable containing the current look-ahead token. (In a pure parser, this is actually a local variable within `yyparse'.) When there is no look-ahead token, the value `YYEMPTY' is stored in the variable. *Note Look-Ahead Tokens: Look-Ahead. `yyclearin;' Discard the current look-ahead token. This is useful primarily in error rules. *Note Error Recovery::. `yyerrok;' Resume generating error messages immediately for subsequent syntax errors. This is useful primarily in error rules. *Note Error Recovery::. `@N' Acts like a structure variable containing information on the line numbers and column numbers of the Nth component of the current rule. The structure has four members, like this: struct { int first_line, last_line; int first_column, last_column; }; Thus, to get the starting line number of the third component, you would use `@3.first_line'. In order for the members of this structure to contain valid information, you must make `yylex' supply this information about each token. If you need only certain members, then `yylex' need only fill in those members. The use of this feature makes the parser noticeably slower.  File: bison.info, Node: Algorithm, Next: Error Recovery, Prev: Interface, Up: Top The Bison Parser Algorithm ************************** As Bison reads tokens, it pushes them onto a stack along with their semantic values. The stack is called the "parser stack". Pushing a token is traditionally called "shifting". For example, suppose the infix calculator has read `1 + 5 *', with a `3' to come. The stack will have four elements, one for each token that was shifted. But the stack does not always have an element for each token read. When the last N tokens and groupings shifted match the components of a grammar rule, they can be combined according to that rule. This is called "reduction". Those tokens and groupings are replaced on the stack by a single grouping whose symbol is the result (left hand side) of that rule. Running the rule's action is part of the process of reduction, because this is what computes the semantic value of the resulting grouping. For example, if the infix calculator's parser stack contains this: 1 + 5 * 3 and the next input token is a newline character, then the last three elements can be reduced to 15 via the rule: expr: expr '*' expr; Then the stack contains just these three elements: 1 + 15 At this point, another reduction can be made, resulting in the single value 16. Then the newline token can be shifted. The parser tries, by shifts and reductions, to reduce the entire input down to a single grouping whose symbol is the grammar's start-symbol (*note Languages and Context-Free Grammars: Language and Grammar.). This kind of parser is known in the literature as a bottom-up parser. * Menu: * Look-Ahead:: Parser looks one token ahead when deciding what to do. * Shift/Reduce:: Conflicts: when either shifting or reduction is valid. * Precedence:: Operator precedence works by resolving conflicts. * Contextual Precedence:: When an operator's precedence depends on context. * Parser States:: The parser is a finite-state-machine with stack. * Reduce/Reduce:: When two rules are applicable in the same situation. * Mystery Conflicts:: Reduce/reduce conflicts that look unjustified. * Stack Overflow:: What happens when stack gets full. How to avoid it.  File: bison.info, Node: Look-Ahead, Next: Shift/Reduce, Up: Algorithm Look-Ahead Tokens ================= The Bison parser does _not_ always reduce immediately as soon as the last N tokens and groupings match a rule. This is because such a simple strategy is inadequate to handle most languages. Instead, when a reduction is possible, the parser sometimes "looks ahead" at the next token in order to decide what to do. When a token is read, it is not immediately shifted; first it becomes the "look-ahead token", which is not on the stack. Now the parser can perform one or more reductions of tokens and groupings on the stack, while the look-ahead token remains off to the side. When no more reductions should take place, the look-ahead token is shifted onto the stack. This does not mean that all possible reductions have been done; depending on the token type of the look-ahead token, some rules may choose to delay their application. Here is a simple case where look-ahead is needed. These three rules define expressions which contain binary addition operators and postfix unary factorial operators (`!'), and allow parentheses for grouping. expr: term '+' expr | term ; term: '(' expr ')' | term '!' | NUMBER ; Suppose that the tokens `1 + 2' have been read and shifted; what should be done? If the following token is `)', then the first three tokens must be reduced to form an `expr'. This is the only valid course, because shifting the `)' would produce a sequence of symbols `term ')'', and no rule allows this. If the following token is `!', then it must be shifted immediately so that `2 !' can be reduced to make a `term'. If instead the parser were to reduce before shifting, `1 + 2' would become an `expr'. It would then be impossible to shift the `!' because doing so would produce on the stack the sequence of symbols `expr '!''. No rule allows that sequence. The current look-ahead token is stored in the variable `yychar'. *Note Special Features for Use in Actions: Action Features.  File: bison.info, Node: Shift/Reduce, Next: Precedence, Prev: Look-Ahead, Up: Algorithm Shift/Reduce Conflicts ====================== Suppose we are parsing a language which has if-then and if-then-else statements, with a pair of rules like this: if_stmt: IF expr THEN stmt | IF expr THEN stmt ELSE stmt ; Here we assume that `IF', `THEN' and `ELSE' are terminal symbols for specific keyword tokens. When the `ELSE' token is read and becomes the look-ahead token, the contents of the stack (assuming the input is valid) are just right for reduction by the first rule. But it is also legitimate to shift the `ELSE', because that would lead to eventual reduction by the second rule. This situation, where either a shift or a reduction would be valid, is called a "shift/reduce conflict". Bison is designed to resolve these conflicts by choosing to shift, unless otherwise directed by operator precedence declarations. To see the reason for this, let's contrast it with the other alternative. Since the parser prefers to shift the `ELSE', the result is to attach the else-clause to the innermost if-statement, making these two inputs equivalent: if x then if y then win (); else lose; if x then do; if y then win (); else lose; end; But if the parser chose to reduce when possible rather than shift, the result would be to attach the else-clause to the outermost if-statement, making these two inputs equivalent: if x then if y then win (); else lose; if x then do; if y then win (); end; else lose; The conflict exists because the grammar as written is ambiguous: either parsing of the simple nested if-statement is legitimate. The established convention is that these ambiguities are resolved by attaching the else-clause to the innermost if-statement; this is what Bison accomplishes by choosing to shift rather than reduce. (It would ideally be cleaner to write an unambiguous grammar, but that is very hard to do in this case.) This particular ambiguity was first encountered in the specifications of Algol 60 and is called the "dangling `else'" ambiguity. To avoid warnings from Bison about predictable, legitimate shift/reduce conflicts, use the `%expect N' declaration. There will be no warning as long as the number of shift/reduce conflicts is exactly N. *Note Suppressing Conflict Warnings: Expect Decl. The definition of `if_stmt' above is solely to blame for the conflict, but the conflict does not actually appear without additional rules. Here is a complete Bison input file that actually manifests the conflict: %token IF THEN ELSE variable %% stmt: expr | if_stmt ; if_stmt: IF expr THEN stmt | IF expr THEN stmt ELSE stmt ; expr: variable ;  File: bison.info, Node: Precedence, Next: Contextual Precedence, Prev: Shift/Reduce, Up: Algorithm Operator Precedence =================== Another situation where shift/reduce conflicts appear is in arithmetic expressions. Here shifting is not always the preferred resolution; the Bison declarations for operator precedence allow you to specify when to shift and when to reduce. * Menu: * Why Precedence:: An example showing why precedence is needed. * Using Precedence:: How to specify precedence in Bison grammars. * Precedence Examples:: How these features are used in the previous example. * How Precedence:: How they work.  File: bison.info, Node: Why Precedence, Next: Using Precedence, Up: Precedence When Precedence is Needed ------------------------- Consider the following ambiguous grammar fragment (ambiguous because the input `1 - 2 * 3' can be parsed in two different ways): expr: expr '-' expr | expr '*' expr | expr '<' expr | '(' expr ')' ... ; Suppose the parser has seen the tokens `1', `-' and `2'; should it reduce them via the rule for the addition operator? It depends on the next token. Of course, if the next token is `)', we must reduce; shifting is invalid because no single rule can reduce the token sequence `- 2 )' or anything starting with that. But if the next token is `*' or `<', we have a choice: either shifting or reduction would allow the parse to complete, but with different results. To decide which one Bison should do, we must consider the results. If the next operator token OP is shifted, then it must be reduced first in order to permit another opportunity to reduce the sum. The result is (in effect) `1 - (2 OP 3)'. On the other hand, if the subtraction is reduced before shifting OP, the result is `(1 - 2) OP 3'. Clearly, then, the choice of shift or reduce should depend on the relative precedence of the operators `-' and OP: `*' should be shifted first, but not `<'. What about input such as `1 - 2 - 5'; should this be `(1 - 2) - 5' or should it be `1 - (2 - 5)'? For most operators we prefer the former, which is called "left association". The latter alternative, "right association", is desirable for assignment operators. The choice of left or right association is a matter of whether the parser chooses to shift or reduce when the stack contains `1 - 2' and the look-ahead token is `-': shifting makes right-associativity.  File: bison.info, Node: Using Precedence, Next: Precedence Examples, Prev: Why Precedence, Up: Precedence Specifying Operator Precedence ------------------------------ Bison allows you to specify these choices with the operator precedence declarations `%left' and `%right'. Each such declaration contains a list of tokens, which are operators whose precedence and associativity is being declared. The `%left' declaration makes all those operators left-associative and the `%right' declaration makes them right-associative. A third alternative is `%nonassoc', which declares that it is a syntax error to find the same operator twice "in a row". The relative precedence of different operators is controlled by the order in which they are declared. The first `%left' or `%right' declaration in the file declares the operators whose precedence is lowest, the next such declaration declares the operators whose precedence is a little higher, and so on.  File: bison.info, Node: Precedence Examples, Next: How Precedence, Prev: Using Precedence, Up: Precedence Precedence Examples ------------------- In our example, we would want the following declarations: %left '<' %left '-' %left '*' In a more complete example, which supports other operators as well, we would declare them in groups of equal precedence. For example, `'+'' is declared with `'-'': %left '<' '>' '=' NE LE GE %left '+' '-' %left '*' '/' (Here `NE' and so on stand for the operators for "not equal" and so on. We assume that these tokens are more than one character long and therefore are represented by names, not character literals.) dibbler-1.0.1/bison++/version.cc0000664000175000017500000000022212233256142013267 00000000000000char *version_string = "bison++ Version 1.21.9-1, adapted from GNU bison by coetmeur@icdc.fr\nMaintained by Magnus Ekdahl \n"; dibbler-1.0.1/bison++/bison++.10000664000175000017500000003774612233256142012642 00000000000000.TH BISON++ 1 "3/3/93" "GNU and RDT" "COMMANDS" .SH "NAME" bison++ \- generate a parser in c or c++\. .SH "SYNOPSIS" \fBbison++\fP [\fB\-dltvyVu\fP] [\fB\-b\fP \fIfile\-prefix\fP] [\fB\-p\fP \fIname\-prefix\fP] [\fB\-o\fP \fIoutfile\fP] [\fB\-h\fP \fIheaderfile\fP] [\fB\-S\fP \fIskeleton\fP] [\fB\-H\fP \fIheader\-skeleton\fP] [\fB\-\-debug\fP] [\fB\-\-defines\fP] [\fB\-\-fixed\-output\-files\fP] [\fB\-\-no\-lines\fP] [\fB\-\-verbose\fP] [\fB\-\-version\fP] [\fB\-\-yacc\fP] [\fB\-\-usage\fP] [\fB\-\-help\fP] [\fB\-\-file\-prefix=\fP\fIprefix\fP] [\fB\-\-name\-prefix=\fP\fIprefix\fP] [\fB\-\-skeleton=\fP\fIskeletonfile\fP] [\fB\-\-headerskeleton=\fP\fIheaderskeletonfile\fP] [\fB\-\-output=\fP\fIoutfile\fP] [\fB\-\-header\-name=\fP\fIheader\fP] \fIgrammar\-file\fP .SH "DESCRIPTION" Generate a parser\. Based on \fBbison\fP version 1\.19\. See \fBbison\fP(1) for details of main functionality\. Only changes are reported here\. .PP You now generate a C++ class if you are compiling with a C++ compiler\. The generated header is far more rich than before, and is made from a skeleton\-header\. The code skeleton is also richer, and the generated code is less important compared to the skeletons\. It permit you to modify much things only by changing the two skeletons\. .PP In plain C, the \fBbison++\fP is compatible with standard \fBbison\fP\. .SH "OPTIONS" .\"bloc1[ .IP "\\fB\\-\\-name\\-prefix=\\fP\\fIprefix\\fP" .IP "\\fB\\-p\\fP \\fIprefix\\fP" Set prefix of names of yylex,yyerror\. keeped for compatibility, but you should prefer \fB%define LEX \fP\fInewname\fP, and similar\. .IP "\\fB\\-\\-skeleton=\\fP\\fIskeleton\\fP" .IP "\\fB\\-S\\fP \\fIskeleton\\fP" Set filename of code skeleton\. Default is \fBbison\.cc\fP\. .IP "\\fB\\-\\-headerskeleton=\\fP\\fIheader\\-skeleton\\fP" .IP "\\fB\\-H\\fP \\fIheader\\-skeleton\\fP" Set filename of header skeleton\. Default is \fBbison\.h\fP\. .IP "\\fB\\-\\-header\\-name=\\fP\\fIheader\\fP" .IP "\\fB\\-h\\fP \\fIheader\\fP" Set filename of header skeleton\. Default is \fBy\.tab\.h\fP, or \fIprefix\fP\.h if option \fB\-b\fP is used or \fIc_basename\fP\.h if \fB\-o\fP is used\. \fB\.c\fP, \fB\.cc\fP, \fB\.C\fP, \fB\.cpp\fP, \fB\.cxx\fP options for output files are replaced by \fB\.h\fP for header name\. .\"bloc1] .SH "DECLARATIONS" These are new declarations to put in the declaration section : .\"bloc1[ .IP "\\fB%name\\fP \\fIparser_name\\fP" Declare the name of this parser\. User for C++ class name, and to render many names unique\. default is \fBparse\fP\. Must be given before \fB%union\fP and \fB%define\fP, or never\. .IP "\\fB%define\\fP \\fIdefine_name\\fP \\fIcontent\\.\\.\\.\\fP" Declare a macro symbol in header and code\. The name of the symbol is \fBYY_\fP'\fIparser_name\fP'\fB_\fP'\fIdefine_name\fP'\. The content if given after, as with #define\. Newline can be escaped as with #define\. Many symbols are proposed for customisation\. .IP "\\fB%union\\fP" as with bison generate a union for semantic type\. The difference is that the union is named \fByy_\fP'\fIparser_name\fP'\fB_stype\fP\. .IP "\\fB%pure_parser\\fP" As with bison in C\. In C++ generate a parser where yylval, and yylloc (if needed) are passed as parameter to yylex, and where some instance variable are local to yyparse (like yydebug\.\.\.)\. Not very useful, since you can create multiple instances for reentering another parser\. .IP "\\fB%header{\\fP" Like \fB%{\fP, but include this text both in the header, and in the code\. End with \fB%}\fP\. When put in declaration section, the text is added before the definitions\. It can be put in the last section so that the text is added after all definition in the header, and in the last section at the current position in the code\. .\"bloc1] .PP Note that the order of these declaration is important, since they are translated into preprocessor sympols, typedef or code depending on their type\. For example use \fB%name\fP before any \fB%define\fP, since the name is needed to compose the name of the define symbols\. Order of \fB%header\fP and \fB%union\fP is important, since type may be undefined\. .SH "DECLARATION DEFINE SYMBOLS" These are the symbols you can define with \fB%define\fP in declaration section, or that are already defined\. Remind that they are replaced by a preprocessor \fB#define YY_\fP'\fIparser_name\fP'\fB_\fP'\fIname\fP\. .\"bloc1[ .IP "\\fBBISON\\fP" defined to \fB1\fP in the code\. used for conditional code\. Don't redefine it\. .IP "\\fBh_included\\fP" defined in the code, and in the header\. used for include anti\-reload\. Don't redefine it\. .IP "\\fBCOMPATIBILITY\\fP" Indicate if obsoleted defines are to be used and produced\. If defined to 0, indicate no compatibility needed, else if defined to non\-0, generate it\. If it is undefined, default is to be compatible if classes are not used\. .IP "\\fBUSE_GOTO\\fP" Indicates (if defined as 1) that \fBgoto\fP are to be used (for backward compatibility) in the parser function\. By default \fBgoto\fP are replaced with a \fBswitch\fP construction, to avoid problems with some compiler that don't support \fBgoto\fP and destructor in the same function block\. If \fBCOMPATIBILITY\fP is 1, and \fBUSE_GOTO\fP is not defined, then \fBUSE_GOTO\fP is defined to 1, to be compatible with older bison\. .IP "\\fBUSE_CONST_TOKEN\\fP" Indicate (if defined as 1) that \fBstatic const int\fP are to be used in C++, for token IDs\. By default an enum is used to define the token IDs instead of const\. .IP "\\fBENUM_TOKEN\\fP" When \fBenum\fP are used instead of \fBstatic const int\fP for token IDs, this symbol define the name of the enum type\. Defined to \fByy_\fP'\fIparser_name\fP'\fB_enum_token\fP by default\. .IP "\\fBPURE\\fP" Indicate that \fB%pure_parser\fP is asked\.\.\. Don't redefine it\. .IP "\\fBLSP_NEEDED\\fP" if defined indicate that @ construct is used, so \fBLLOC\fP stack is needed\. Can be defined to force use of location stack\. .IP "\\fBDEBUG\\fP" if defined to non\-0 activate debugging code\. See\fB YYDEBUG\fP in bison\. .IP "\\fBERROR_VERBOSE\\fP" if defined activate dump parser stack when error append\. .IP "\\fBSTYPE\\fP" the type of the semantic value of token\. defined by \fB%union\fP\. default is \fBint\fP\. See \fBYYSTYPE\fP in bison\. Don't redefine it, if you use a \fB%union\fP\. .IP "\\fBLTYPE\\fP" The token location type\. If needed default is \fByyltype\fP\. See \fBYYLTYPE\fP in bison\. default \fByyltype\fP is a typedef and struct defined as in old bison\. .IP "\\fBLLOC\\fP" The token location variable name\. If needed, default is \fByylloc\fP\. See \fByylloc\fP in bison\. .IP "\\fBLVAL\\fP" The token semantic value variable name\. Default \fByylval\fP\. See \fByylval\fP in bison\. .IP "\\fBCHAR\\fP" The lookahead token value variable name\. Default \fByychar\fP\. See \fByychar\fP in bison\. .IP "\\fBLEX\\fP" The scanner function name\. Default \fByylex\fP\. See \fByylex\fP in bison\. .IP "\\fBPARSE\\fP" The parser function name\. Default \fByyparse\fP\. See \fByyparse\fP in bison\. .IP "\\fBPARSE_PARAM\\fP" The parser function parameters declaration\. Default \fBvoid\fP in C++ or ANSIC, nothing if old C\. In ANSIC and C++ contain the prototype\. In old\-C comtaim just the list of parameters name\. Don't allows default value\. .IP "\\fBPARSE_PARAM_DEF\\fP" The parser function parameters definition, for old style C\. Default nothing\. For example to use an \fBint\fP parameter called \fBx\fP, PARSE_PARAM is \fBx\fP, and PARSE_PARAM_DEF is \fBint x;\fP\. In ANSIC or C++ it is unuseful and ignored\. .IP "\\fBERROR\\fP" The error function name\. Default \fByyerror\fP\. See \fByyerror\fP in bison\. .IP "\\fBNERRS\\fP" The error count name\. Default \fByynerrs\fP\. See \fByynerrs\fP in bison\. .IP "\\fBDEBUG_FLAG\\fP" The runtime debug flag\. Default \fByydebug\fP\. See \fByydebug\fP in bison\. .\"bloc1] .PP These are only used if class is generated\. .\"bloc1[ .IP "\\fBCLASS\\fP" The class name\. default is the parser name\. .IP "\\fBINHERIT\\fP" The inheritance list\. Don't forget the \fB:\fP before, if not empty list\. .IP "\\fBMEMBERS\\fP" List of members to add to the class definition, before ending it\. .IP "\\fBLEX_BODY\\fP" The scanner member function boby\. May be defined to \fB=0\fP for pure function, or to an inline body\. .IP "\\fBERROR_BODY\\fP" The error member function boby\. May be defined to \fB=0\fP for pure function, or to an inline body\. .IP "\\fBCONSTRUCTOR_PARAM\\fP" List of parameters of the constructor\. Dont allows default value\. .IP "\\fBCONSTRUCTOR_INIT\\fP" List of initialisation befor constructor call\. If not empty dont't forget the \fB:\fP before list of initialisation\. .IP "\\fBCONSTRUCTOR_CODE\\fP" Code added after internal initialisation in constructor\. .\"bloc1] .SH "OBSOLETED PREPROCESSOR SYMBOLS" if you use new features, the folowing symbols should not be used, though they are proposed\. The symbol \fBCOMPATIBILITY\fP control their disponibility\. Incoherence may arise if they are defined simultaneously with the new symbol\. .\"bloc1[ .IP "\\fBYYLTYPE\\fP" prefer \fB%define LTYPE\fP\. .IP "\\fBYYSTYPE\\fP" prefer \fB%define STYPE\fP\. .IP "\\fBYYDEBUG\\fP" prefer \fB%define DEBUG\fP\. .IP "\\fBYYERROR_VERBOSE\\fP" prefer \fB%define ERROR_VERBOSE\fP\. .IP "\\fBYYLSP_NEEDED\\fP" prefer \fB%define LSP_NEEDED\fP\. .IP "\\fByystype\\fP" Now a preprocessor symbol instead of a typedef\. prefer \fByy_\fP'\fIparser_name\fP'\fB_stype\fP\. .\"bloc1] .SH "CONSERVED PREPROCESSOR SYMBOLS" These symbols are kept, and cannot be defined elsewhere, since they control private parameters of the generated parser, or are actually unused\. You can \fB#define\fP them to the value you need, or indirectly to the name of a \fB%define\fP generated symbol if you want to be clean\. .\"bloc1[ .IP "\\fBYYINITDEPTH\\fP" initial stack depth\. .IP "\\fBYYMAXDEPTH\\fP" stack overflow limit depth\. .IP "\\fByyoverflow\\fP" instead of expand with alloca, realloc manualy or raise error\. .\"bloc1] .SH "OTHER ADDED PREPROCESSOR SYMBOLS" .\"bloc1[ .IP "\\fBYY_USE_CLASS\\fP" indicate that class will be produced\. Default if C++\. .\"bloc1] .SH "C++ CLASS GENERATED" To simplify the notation, we note \fB%SYMBOLNAME\fP the preprocessor symbol generated with a \fB%define\fP of this name\. In fact see the use of \fB%define\fP for it's real name\. .PP Note that there is sometime symbols that differ from only an underscore \fB_\fP, like \fByywrap\fP and \fByy_wrap\fP\. They are much different\. In this case \fByy_wrap()\fP is a virtual member function, and \fByywrap()\fP is a macro\. .SS "General Class declaration" class %CLASS %INHERIT .PP { .PP public: .PP #if %USE_CONST_TOKEN != 0 .PP static const TOKEN_NEXT; .PP static const AND_SO_ON; .PP // \.\.\. .PP #else .PP enum %ENUM_TOKEN { %NULL_TOKEN .\"bloc1[ .IP ,TOKEN_FIRST=256 .IP ,TOKEN_NEXT=257 .IP ,AND_SO_ON=258 .\"bloc1] .PP } ; .PP // \.\.\. .PP #endif .PP public: .PP int %PARSE (%PARSE_PARAM); .PP virtual void %ERROR(char *msg) %ERROR_BODY; .PP #ifdef %PURE .\"bloc1[ .IP // if %PURE , we must pass the value and (eventually) the location explicitely .IP #ifdef %LSP_NEEDED .IP // if and only if %LSP_NEEDED , we must pass the location explicitely .IP virtual int %LEX (%STYPE *%LVAL,%LTYPE *%LLOC) %LEX_BODY; .IP #else .IP virtual int %LEX (%STYPE *%LVAL) %LEX_BODY; .IP #endif .\"bloc1] .PP #else .\"bloc1[ .IP // if not %PURE , we must declare member to store the value and (eventually) the location explicitely .IP // if not %PURE ,%NERRS and %CHAR are not local variable to %PARSE, so must be member .IP virtual int %LEX() %LEX_BODY; .IP %STYPE %LVAL; .IP #ifdef %LSP_NEEDED .IP %LTYPE %LLOC; .IP #endif .IP int %NERRS; .IP int %CHAR; .\"bloc1] .PP #endif .PP #if %DEBUG != 0 .PP int %DEBUG_FLAG; /* nonzero means print parse trace */ .PP #endif .PP public: .PP %CLASS(%CONSTRUCTOR_PARAM); .PP public: .PP %MEMBERS .PP }; .PP // here are defined the token constants .PP // for example: .PP #if %USE_CONST_TOKEN != 0 .\"bloc1[ .IP const %CLASS::TOKEN_FIRST=1; .IP \.\.\. .\"bloc1] .PP #endif .PP // here is the construcor .PP %CLASS::%CLASS(%CONSTRUCTOR_PARAM) %CONSTRUCTOR_INIT .PP { .PP #if %DEBUG != 0 .PP %DEBUG_FLAG=0; .PP #endif .PP %CONSTRUCTOR_CODE; .PP }; .SS "Default Class declaration" // Here is the default declaration made in the header when you %define nothing .PP // typical yyltype .PP typedef struct yyltype .PP { .PP int timestamp; .PP int first_line; .PP int first_column; .PP int last_line; .PP int last_column; .PP char *text; .PP } yyltype; .PP // class definition .PP class parser .PP { .PP public: .PP enum yy_parser_enum_token { YY_parser_NULL_TOKEN .\"bloc1[ .IP ,TOKEN_FIRST=256 .IP ,TOKEN_NEXT=257 .IP ,AND_SO_ON=258 .\"bloc1] .PP } ; .PP // \.\.\. .PP public: .PP int yyparse (yyparse_PARAM); .PP virtual void yyerror(char *msg) ; .PP #ifdef YY_parser_PURE .\"bloc1[ .IP #ifdef YY_parser_LSP_NEEDED .IP virtual int yylex (int *yylval,yyltype *yylloc) ; .IP #else .IP virtual int yylex (int *yylval) ; .IP #endif .\"bloc1] .PP #else .\"bloc1[ .IP virtual int yylex() %LEX_BODY; .IP int yylval; .IP #ifdef YY_parser_LSP_NEEDED .IP yyltype yylloc; .IP #endif .IP int yynerrs; .IP int yychar; .\"bloc1] .PP #endif .PP #if YY_parser_DEBUG != 0 .PP int yydebug; .PP #endif .PP public: .PP parser(); .PP public: .PP }; .PP // here is the constructor code .PP parser::parser() .PP { .PP #if YY_parser_DEBUG != 0 .PP yydebug=0; .PP #endif .PP }; .SH "USAGE" Should replace \fBbison\fP, because it generate a far more customisable parser, still beeing compatible\. .PP You should always use the header facility\. .PP Use it with \fBflex++\fP (same author)\. .SH "EXEMPLES" This man page has been produced through a parser made in C++ with this version of \fBbison\fP and our version of \fBflex++\fP (same author)\. .SH "FILES" .\"bloc1[ .IP "\\fBbison\\.cc\\fP" main skeleton\. .IP "\\fBbison\\.h\\fP" header skeleton\. .IP "\\fBbison\\.hairy\\fP" old main skeleton for semantic parser\. Not adapted to this version\. Kept for future works\. .\"bloc1] .SH "ENVIRONNEMENT" .SH "DIAGNOSTICS" .SH "SEE ALSO" \fBbison\fP(1), \fBbison\.info\fP (use texinfo), \fBflex++\fP(1)\. .SH "DOCUMENTATION" .SH "BUGS" Tell us more ! .PP The \fB%semantic_parser\fP is no more supported\. If you want to use it, adapt the skeletons, and maybe \fBbison++\fP generator itself\. The reason is that it seems unused, unuseful, not documented, and too complex for us to support\. tell us if you use, need, or understand it\. .PP Header is not included in the parser code\. Change made in the generated header are not used in the parser code, even if you include it volontarily, since it is guarded against re\-include\. So don't modify it\. .PP For the same reasons, if you modify the header skeleton, or the code skeleton, report the changes in the other skeleton if applicable\. If not done, incoherent declarations may lead to unpredictable result\. .PP Use of defines for \fBYYLTYPE\fP, \fBYYSTYPE\fP, \fBYYDEBUG\fP is supported for backward compatibility in C, but should not be used with new features, as \fB%defines\fP or C++ classes\. You can define them, and use them as with old \fBbison\fP in C only\. .PP Parameters are richer than before, and nothing is removed\. POSIX compliance can be enforced by not using extensions\. If you want to forbide them, there is a good job ! .SH "FUTUR WORKS" tell us ! .PP Support semantic parser\. Is it really used ? .PP POSIX compliance\. is'nt it good now ? .PP Use lex and yacc (flex/bison) to generate the scanner/parser\. It would be comfortable for futur works, though very complicated\. Who feel it good ? .PP \fBiostream\fP : this is a great demand\. this work will be done as soon as possible\. The virtual members permit such work still easily\. .SH "INSTALLATION" With this install the executable is named bison++\. rename it bison if you want, because it could replace \fBbison\fP\. .SH "TESTS" .SH "AUTHORS" Alain Coe\*:tmeur (coetmeur@icdc\.fr), R&D department (RDT) , Informatique\-CDC, France\. .SH "RESTRICTIONS" The words 'author', and 'us' mean the author and colleages, not GNU\. We don't have contacted GNU about this, nowaday\. If you're in GNU, we are ready to propose it to you, and you may tell us what you think about\. .PP Based on GNU version 1\.21 of bison\. Modified by the author\. dibbler-1.0.1/bison++/gram.h0000664000175000017500000001017012233256142012375 00000000000000/* Data definitions for internal representation of bison's input, Copyright (C) 1984, 1986, 1989 Free Software Foundation, Inc. This file is part of Bison, the GNU Compiler Compiler. Bison 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. Bison 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 Bison; see the file COPYING. If not, write to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ /* representation of the grammar rules: ntokens is the number of tokens, and nvars is the number of variables (nonterminals). nsyms is the total number, ntokens + nvars. Each symbol (either token or variable) receives a symbol number. Numbers 0 to ntokens-1 are for tokens, and ntokens to nsyms-1 are for variables. Symbol number zero is the end-of-input token. This token is counted in ntokens. The rules receive rule numbers 1 to nrules in the order they are written. Actions and guards are accessed via the rule number. The rules themselves are described by three arrays: rrhs, rlhs and ritem. rlhs[R] is the symbol number of the left hand side of rule R. The right hand side is stored as symbol numbers in a portion of ritem. rrhs[R] contains the index in ritem of the beginning of the portion for rule R. If rlhs[R] is -1, the rule has been thrown out by reduce.c and should be ignored. The length of the portion is one greater than the number of symbols in the rule's right hand side. The last element in the portion contains minus R, which identifies it as the end of a portion and says which rule it is for. The portions of ritem come in order of increasing rule number and are followed by an element which is zero to mark the end. nitems is the total length of ritem, not counting the final zero. Each element of ritem is called an "item" and its index in ritem is an item number. Item numbers are used in the finite state machine to represent places that parsing can get to. Precedence levels are recorded in the vectors sprec and rprec. sprec records the precedence level of each symbol, rprec the precedence level of each rule. rprecsym is the symbol-number of the symbol in %prec for this rule (if any). Precedence levels are assigned in increasing order starting with 1 so that numerically higher precedence values mean tighter binding as they ought to. Zero as a symbol or rule's precedence means none is assigned. Associativities are recorded similarly in rassoc and sassoc. */ #define ISTOKEN(s) ((s) < ntokens) #define ISVAR(s) ((s) >= ntokens) extern int nitems; extern int nrules; extern int nsyms; extern int ntokens; extern int nvars; extern short *ritem; extern short *rlhs; extern short *rrhs; extern short *rprec; extern short *rprecsym; extern short *sprec; extern short *rassoc; extern short *sassoc; extern short *rline; /* Source line number of each rule */ extern int start_symbol; /* associativity values in elements of rassoc, sassoc. */ #define RIGHT_ASSOC 1 #define LEFT_ASSOC 2 #define NON_ASSOC 3 /* token translation table: indexed by a token number as returned by the user's yylex routine, it yields the internal token number used by the parser and throughout bison. If translations is zero, the translation table is not used because the two kinds of token numbers are the same. */ extern short *token_translations; extern int translations; extern int max_user_token_number; /* semantic_parser is nonzero if the input file says to use the hairy parser that provides for semantic error recovery. If it is zero, the yacc-compatible simplified parser is used. */ extern int semantic_parser; /* pure_parser is nonzero if should generate a parser that is all pure and reentrant. */ extern int pure_parser; /* error_token_number is the token number of the error token. */ extern int error_token_number; dibbler-1.0.1/bison++/aclocal.m40000664000175000017500000012510112556253076013152 00000000000000# generated automatically by aclocal 1.14.1 -*- Autoconf -*- # Copyright (C) 1996-2013 Free Software Foundation, Inc. # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. m4_ifndef([AC_CONFIG_MACRO_DIRS], [m4_defun([_AM_CONFIG_MACRO_DIRS], [])m4_defun([AC_CONFIG_MACRO_DIRS], [_AM_CONFIG_MACRO_DIRS($@)])]) m4_ifndef([AC_AUTOCONF_VERSION], [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl m4_if(m4_defn([AC_AUTOCONF_VERSION]), [2.69],, [m4_warning([this file was generated for autoconf 2.69. You have another version of autoconf. It may work, but is not guaranteed to. If you have problems, you may need to regenerate the build system entirely. To do so, use the procedure documented by the package, typically 'autoreconf'.])]) # Copyright (C) 2002-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_AUTOMAKE_VERSION(VERSION) # ---------------------------- # Automake X.Y traces this macro to ensure aclocal.m4 has been # generated from the m4 files accompanying Automake X.Y. # (This private macro should not be called outside this file.) AC_DEFUN([AM_AUTOMAKE_VERSION], [am__api_version='1.14' dnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to dnl require some minimum version. Point them to the right macro. m4_if([$1], [1.14.1], [], [AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl ]) # _AM_AUTOCONF_VERSION(VERSION) # ----------------------------- # aclocal traces this macro to find the Autoconf version. # This is a private macro too. Using m4_define simplifies # the logic in aclocal, which can simply ignore this definition. m4_define([_AM_AUTOCONF_VERSION], []) # AM_SET_CURRENT_AUTOMAKE_VERSION # ------------------------------- # Call AM_AUTOMAKE_VERSION and AM_AUTOMAKE_VERSION so they can be traced. # This function is AC_REQUIREd by AM_INIT_AUTOMAKE. AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION], [AM_AUTOMAKE_VERSION([1.14.1])dnl m4_ifndef([AC_AUTOCONF_VERSION], [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl _AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))]) # AM_AUX_DIR_EXPAND -*- Autoconf -*- # Copyright (C) 2001-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # For projects using AC_CONFIG_AUX_DIR([foo]), Autoconf sets # $ac_aux_dir to '$srcdir/foo'. In other projects, it is set to # '$srcdir', '$srcdir/..', or '$srcdir/../..'. # # Of course, Automake must honor this variable whenever it calls a # tool from the auxiliary directory. The problem is that $srcdir (and # therefore $ac_aux_dir as well) can be either absolute or relative, # depending on how configure is run. This is pretty annoying, since # it makes $ac_aux_dir quite unusable in subdirectories: in the top # source directory, any form will work fine, but in subdirectories a # relative path needs to be adjusted first. # # $ac_aux_dir/missing # fails when called from a subdirectory if $ac_aux_dir is relative # $top_srcdir/$ac_aux_dir/missing # fails if $ac_aux_dir is absolute, # fails when called from a subdirectory in a VPATH build with # a relative $ac_aux_dir # # The reason of the latter failure is that $top_srcdir and $ac_aux_dir # are both prefixed by $srcdir. In an in-source build this is usually # harmless because $srcdir is '.', but things will broke when you # start a VPATH build or use an absolute $srcdir. # # So we could use something similar to $top_srcdir/$ac_aux_dir/missing, # iff we strip the leading $srcdir from $ac_aux_dir. That would be: # am_aux_dir='\$(top_srcdir)/'`expr "$ac_aux_dir" : "$srcdir//*\(.*\)"` # and then we would define $MISSING as # MISSING="\${SHELL} $am_aux_dir/missing" # This will work as long as MISSING is not called from configure, because # unfortunately $(top_srcdir) has no meaning in configure. # However there are other variables, like CC, which are often used in # configure, and could therefore not use this "fixed" $ac_aux_dir. # # Another solution, used here, is to always expand $ac_aux_dir to an # absolute PATH. The drawback is that using absolute paths prevent a # configured tree to be moved without reconfiguration. AC_DEFUN([AM_AUX_DIR_EXPAND], [dnl Rely on autoconf to set up CDPATH properly. AC_PREREQ([2.50])dnl # expand $ac_aux_dir to an absolute path am_aux_dir=`cd $ac_aux_dir && pwd` ]) # AM_CONDITIONAL -*- Autoconf -*- # Copyright (C) 1997-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_CONDITIONAL(NAME, SHELL-CONDITION) # ------------------------------------- # Define a conditional. AC_DEFUN([AM_CONDITIONAL], [AC_PREREQ([2.52])dnl m4_if([$1], [TRUE], [AC_FATAL([$0: invalid condition: $1])], [$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl AC_SUBST([$1_TRUE])dnl AC_SUBST([$1_FALSE])dnl _AM_SUBST_NOTMAKE([$1_TRUE])dnl _AM_SUBST_NOTMAKE([$1_FALSE])dnl m4_define([_AM_COND_VALUE_$1], [$2])dnl if $2; then $1_TRUE= $1_FALSE='#' else $1_TRUE='#' $1_FALSE= fi AC_CONFIG_COMMANDS_PRE( [if test -z "${$1_TRUE}" && test -z "${$1_FALSE}"; then AC_MSG_ERROR([[conditional "$1" was never defined. Usually this means the macro was only invoked conditionally.]]) fi])]) # Copyright (C) 1999-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # There are a few dirty hacks below to avoid letting 'AC_PROG_CC' be # written in clear, in which case automake, when reading aclocal.m4, # will think it sees a *use*, and therefore will trigger all it's # C support machinery. Also note that it means that autoscan, seeing # CC etc. in the Makefile, will ask for an AC_PROG_CC use... # _AM_DEPENDENCIES(NAME) # ---------------------- # See how the compiler implements dependency checking. # NAME is "CC", "CXX", "OBJC", "OBJCXX", "UPC", or "GJC". # We try a few techniques and use that to set a single cache variable. # # We don't AC_REQUIRE the corresponding AC_PROG_CC since the latter was # modified to invoke _AM_DEPENDENCIES(CC); we would have a circular # dependency, and given that the user is not expected to run this macro, # just rely on AC_PROG_CC. AC_DEFUN([_AM_DEPENDENCIES], [AC_REQUIRE([AM_SET_DEPDIR])dnl AC_REQUIRE([AM_OUTPUT_DEPENDENCY_COMMANDS])dnl AC_REQUIRE([AM_MAKE_INCLUDE])dnl AC_REQUIRE([AM_DEP_TRACK])dnl m4_if([$1], [CC], [depcc="$CC" am_compiler_list=], [$1], [CXX], [depcc="$CXX" am_compiler_list=], [$1], [OBJC], [depcc="$OBJC" am_compiler_list='gcc3 gcc'], [$1], [OBJCXX], [depcc="$OBJCXX" am_compiler_list='gcc3 gcc'], [$1], [UPC], [depcc="$UPC" am_compiler_list=], [$1], [GCJ], [depcc="$GCJ" am_compiler_list='gcc3 gcc'], [depcc="$$1" am_compiler_list=]) AC_CACHE_CHECK([dependency style of $depcc], [am_cv_$1_dependencies_compiler_type], [if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up # making a dummy file named 'D' -- because '-MD' means "put the output # in D". rm -rf conftest.dir mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. cp "$am_depcomp" conftest.dir cd conftest.dir # We will build objects and dependencies in a subdirectory because # it helps to detect inapplicable dependency modes. For instance # both Tru64's cc and ICC support -MD to output dependencies as a # side effect of compilation, but ICC will put the dependencies in # the current directory while Tru64 will put them in the object # directory. mkdir sub am_cv_$1_dependencies_compiler_type=none if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n ['s/^#*\([a-zA-Z0-9]*\))$/\1/p'] < ./depcomp` fi am__universal=false m4_case([$1], [CC], [case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac], [CXX], [case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac]) for depmode in $am_compiler_list; do # Setup a source with many dependencies, because some compilers # like to wrap large dependency lists on column 80 (with \), and # we should not choose a depcomp mode which is confused by this. # # We need to recreate these files for each test, as the compiler may # overwrite some of them when testing with obscure command lines. # This happens at least with the AIX C compiler. : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with # Solaris 10 /bin/sh. echo '/* dummy */' > sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf # We check with '-c' and '-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly # handle '-M -o', and we need to detect this. Also, some Intel # versions had trouble with output in subdirs. am__obj=sub/conftest.${OBJEXT-o} am__minus_obj="-o $am__obj" case $depmode in gcc) # This depmode causes a compiler race in universal mode. test "$am__universal" = false || continue ;; nosideeffect) # After this tag, mechanisms are not by side-effect, so they'll # only be used when explicitly requested. if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; msvc7 | msvc7msys | msvisualcpp | msvcmsys) # This compiler won't grok '-c -o', but also, the minuso test has # not run yet. These depmodes are late enough in the game, and # so weak that their functioning should not be impacted. am__obj=conftest.${OBJEXT-o} am__minus_obj= ;; none) break ;; esac if depmode=$depmode \ source=sub/conftest.c object=$am__obj \ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ >/dev/null 2>conftest.err && grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && grep $am__obj sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then # icc doesn't choke on unknown options, it will just issue warnings # or remarks (even with -Werror). So we grep stderr for any message # that says an option was ignored or not supported. # When given -MP, icc 7.0 and 7.1 complain thusly: # icc: Command line warning: ignoring option '-M'; no argument required # The diagnosis changed in icc 8.0: # icc: Command line remark: option '-MP' not supported if (grep 'ignoring option' conftest.err || grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else am_cv_$1_dependencies_compiler_type=$depmode break fi fi done cd .. rm -rf conftest.dir else am_cv_$1_dependencies_compiler_type=none fi ]) AC_SUBST([$1DEPMODE], [depmode=$am_cv_$1_dependencies_compiler_type]) AM_CONDITIONAL([am__fastdep$1], [ test "x$enable_dependency_tracking" != xno \ && test "$am_cv_$1_dependencies_compiler_type" = gcc3]) ]) # AM_SET_DEPDIR # ------------- # Choose a directory name for dependency files. # This macro is AC_REQUIREd in _AM_DEPENDENCIES. AC_DEFUN([AM_SET_DEPDIR], [AC_REQUIRE([AM_SET_LEADING_DOT])dnl AC_SUBST([DEPDIR], ["${am__leading_dot}deps"])dnl ]) # AM_DEP_TRACK # ------------ AC_DEFUN([AM_DEP_TRACK], [AC_ARG_ENABLE([dependency-tracking], [dnl AS_HELP_STRING( [--enable-dependency-tracking], [do not reject slow dependency extractors]) AS_HELP_STRING( [--disable-dependency-tracking], [speeds up one-time build])]) if test "x$enable_dependency_tracking" != xno; then am_depcomp="$ac_aux_dir/depcomp" AMDEPBACKSLASH='\' am__nodep='_no' fi AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno]) AC_SUBST([AMDEPBACKSLASH])dnl _AM_SUBST_NOTMAKE([AMDEPBACKSLASH])dnl AC_SUBST([am__nodep])dnl _AM_SUBST_NOTMAKE([am__nodep])dnl ]) # Generate code to set up dependency tracking. -*- Autoconf -*- # Copyright (C) 1999-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # _AM_OUTPUT_DEPENDENCY_COMMANDS # ------------------------------ AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS], [{ # Older Autoconf quotes --file arguments for eval, but not when files # are listed without --file. Let's play safe and only enable the eval # if we detect the quoting. case $CONFIG_FILES in *\'*) eval set x "$CONFIG_FILES" ;; *) set x $CONFIG_FILES ;; esac shift for mf do # Strip MF so we end up with the name of the file. mf=`echo "$mf" | sed -e 's/:.*$//'` # Check whether this is an Automake generated Makefile or not. # We used to match only the files named 'Makefile.in', but # some people rename them; so instead we look at the file content. # Grep'ing the first line is not enough: some people post-process # each Makefile.in and add a new line on top of each file to say so. # Grep'ing the whole file is not good either: AIX grep has a line # limit of 2048, but all sed's we know have understand at least 4000. if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then dirpart=`AS_DIRNAME("$mf")` else continue fi # Extract the definition of DEPDIR, am__include, and am__quote # from the Makefile without running 'make'. DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` test -z "$DEPDIR" && continue am__include=`sed -n 's/^am__include = //p' < "$mf"` test -z "$am__include" && continue am__quote=`sed -n 's/^am__quote = //p' < "$mf"` # Find all dependency output files, they are included files with # $(DEPDIR) in their names. We invoke sed twice because it is the # simplest approach to changing $(DEPDIR) to its actual value in the # expansion. for file in `sed -n " s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g'`; do # Make sure the directory exists. test -f "$dirpart/$file" && continue fdir=`AS_DIRNAME(["$file"])` AS_MKDIR_P([$dirpart/$fdir]) # echo "creating $dirpart/$file" echo '# dummy' > "$dirpart/$file" done done } ])# _AM_OUTPUT_DEPENDENCY_COMMANDS # AM_OUTPUT_DEPENDENCY_COMMANDS # ----------------------------- # This macro should only be invoked once -- use via AC_REQUIRE. # # This code is only required when automatic dependency tracking # is enabled. FIXME. This creates each '.P' file that we will # need in order to bootstrap the dependency handling code. AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS], [AC_CONFIG_COMMANDS([depfiles], [test x"$AMDEP_TRUE" != x"" || _AM_OUTPUT_DEPENDENCY_COMMANDS], [AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"]) ]) # Do all the work for Automake. -*- Autoconf -*- # Copyright (C) 1996-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This macro actually does too much. Some checks are only needed if # your package does certain things. But this isn't really a big deal. dnl Redefine AC_PROG_CC to automatically invoke _AM_PROG_CC_C_O. m4_define([AC_PROG_CC], m4_defn([AC_PROG_CC]) [_AM_PROG_CC_C_O ]) # AM_INIT_AUTOMAKE(PACKAGE, VERSION, [NO-DEFINE]) # AM_INIT_AUTOMAKE([OPTIONS]) # ----------------------------------------------- # The call with PACKAGE and VERSION arguments is the old style # call (pre autoconf-2.50), which is being phased out. PACKAGE # and VERSION should now be passed to AC_INIT and removed from # the call to AM_INIT_AUTOMAKE. # We support both call styles for the transition. After # the next Automake release, Autoconf can make the AC_INIT # arguments mandatory, and then we can depend on a new Autoconf # release and drop the old call support. AC_DEFUN([AM_INIT_AUTOMAKE], [AC_PREREQ([2.65])dnl dnl Autoconf wants to disallow AM_ names. We explicitly allow dnl the ones we care about. m4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl AC_REQUIRE([AM_SET_CURRENT_AUTOMAKE_VERSION])dnl AC_REQUIRE([AC_PROG_INSTALL])dnl if test "`cd $srcdir && pwd`" != "`pwd`"; then # Use -I$(srcdir) only when $(srcdir) != ., so that make's output # is not polluted with repeated "-I." AC_SUBST([am__isrc], [' -I$(srcdir)'])_AM_SUBST_NOTMAKE([am__isrc])dnl # test to see if srcdir already configured if test -f $srcdir/config.status; then AC_MSG_ERROR([source directory already configured; run "make distclean" there first]) fi fi # test whether we have cygpath if test -z "$CYGPATH_W"; then if (cygpath --version) >/dev/null 2>/dev/null; then CYGPATH_W='cygpath -w' else CYGPATH_W=echo fi fi AC_SUBST([CYGPATH_W]) # Define the identity of the package. dnl Distinguish between old-style and new-style calls. m4_ifval([$2], [AC_DIAGNOSE([obsolete], [$0: two- and three-arguments forms are deprecated.]) m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl AC_SUBST([PACKAGE], [$1])dnl AC_SUBST([VERSION], [$2])], [_AM_SET_OPTIONS([$1])dnl dnl Diagnose old-style AC_INIT with new-style AM_AUTOMAKE_INIT. m4_if( m4_ifdef([AC_PACKAGE_NAME], [ok]):m4_ifdef([AC_PACKAGE_VERSION], [ok]), [ok:ok],, [m4_fatal([AC_INIT should be called with package and version arguments])])dnl AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME'])dnl AC_SUBST([VERSION], ['AC_PACKAGE_VERSION'])])dnl _AM_IF_OPTION([no-define],, [AC_DEFINE_UNQUOTED([PACKAGE], ["$PACKAGE"], [Name of package]) AC_DEFINE_UNQUOTED([VERSION], ["$VERSION"], [Version number of package])])dnl # Some tools Automake needs. AC_REQUIRE([AM_SANITY_CHECK])dnl AC_REQUIRE([AC_ARG_PROGRAM])dnl AM_MISSING_PROG([ACLOCAL], [aclocal-${am__api_version}]) AM_MISSING_PROG([AUTOCONF], [autoconf]) AM_MISSING_PROG([AUTOMAKE], [automake-${am__api_version}]) AM_MISSING_PROG([AUTOHEADER], [autoheader]) AM_MISSING_PROG([MAKEINFO], [makeinfo]) AC_REQUIRE([AM_PROG_INSTALL_SH])dnl AC_REQUIRE([AM_PROG_INSTALL_STRIP])dnl AC_REQUIRE([AC_PROG_MKDIR_P])dnl # For better backward compatibility. To be removed once Automake 1.9.x # dies out for good. For more background, see: # # AC_SUBST([mkdir_p], ['$(MKDIR_P)']) # We need awk for the "check" target. The system "awk" is bad on # some platforms. AC_REQUIRE([AC_PROG_AWK])dnl AC_REQUIRE([AC_PROG_MAKE_SET])dnl AC_REQUIRE([AM_SET_LEADING_DOT])dnl _AM_IF_OPTION([tar-ustar], [_AM_PROG_TAR([ustar])], [_AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])], [_AM_PROG_TAR([v7])])]) _AM_IF_OPTION([no-dependencies],, [AC_PROVIDE_IFELSE([AC_PROG_CC], [_AM_DEPENDENCIES([CC])], [m4_define([AC_PROG_CC], m4_defn([AC_PROG_CC])[_AM_DEPENDENCIES([CC])])])dnl AC_PROVIDE_IFELSE([AC_PROG_CXX], [_AM_DEPENDENCIES([CXX])], [m4_define([AC_PROG_CXX], m4_defn([AC_PROG_CXX])[_AM_DEPENDENCIES([CXX])])])dnl AC_PROVIDE_IFELSE([AC_PROG_OBJC], [_AM_DEPENDENCIES([OBJC])], [m4_define([AC_PROG_OBJC], m4_defn([AC_PROG_OBJC])[_AM_DEPENDENCIES([OBJC])])])dnl AC_PROVIDE_IFELSE([AC_PROG_OBJCXX], [_AM_DEPENDENCIES([OBJCXX])], [m4_define([AC_PROG_OBJCXX], m4_defn([AC_PROG_OBJCXX])[_AM_DEPENDENCIES([OBJCXX])])])dnl ]) AC_REQUIRE([AM_SILENT_RULES])dnl dnl The testsuite driver may need to know about EXEEXT, so add the dnl 'am__EXEEXT' conditional if _AM_COMPILER_EXEEXT was seen. This dnl macro is hooked onto _AC_COMPILER_EXEEXT early, see below. AC_CONFIG_COMMANDS_PRE(dnl [m4_provide_if([_AM_COMPILER_EXEEXT], [AM_CONDITIONAL([am__EXEEXT], [test -n "$EXEEXT"])])])dnl # POSIX will say in a future version that running "rm -f" with no argument # is OK; and we want to be able to make that assumption in our Makefile # recipes. So use an aggressive probe to check that the usage we want is # actually supported "in the wild" to an acceptable degree. # See automake bug#10828. # To make any issue more visible, cause the running configure to be aborted # by default if the 'rm' program in use doesn't match our expectations; the # user can still override this though. if rm -f && rm -fr && rm -rf; then : OK; else cat >&2 <<'END' Oops! Your 'rm' program seems unable to run without file operands specified on the command line, even when the '-f' option is present. This is contrary to the behaviour of most rm programs out there, and not conforming with the upcoming POSIX standard: Please tell bug-automake@gnu.org about your system, including the value of your $PATH and any error possibly output before this message. This can help us improve future automake versions. END if test x"$ACCEPT_INFERIOR_RM_PROGRAM" = x"yes"; then echo 'Configuration will proceed anyway, since you have set the' >&2 echo 'ACCEPT_INFERIOR_RM_PROGRAM variable to "yes"' >&2 echo >&2 else cat >&2 <<'END' Aborting the configuration process, to ensure you take notice of the issue. You can download and install GNU coreutils to get an 'rm' implementation that behaves properly: . If you want to complete the configuration process using your problematic 'rm' anyway, export the environment variable ACCEPT_INFERIOR_RM_PROGRAM to "yes", and re-run configure. END AC_MSG_ERROR([Your 'rm' program is bad, sorry.]) fi fi ]) dnl Hook into '_AC_COMPILER_EXEEXT' early to learn its expansion. Do not dnl add the conditional right here, as _AC_COMPILER_EXEEXT may be further dnl mangled by Autoconf and run in a shell conditional statement. m4_define([_AC_COMPILER_EXEEXT], m4_defn([_AC_COMPILER_EXEEXT])[m4_provide([_AM_COMPILER_EXEEXT])]) # When config.status generates a header, we must update the stamp-h file. # This file resides in the same directory as the config header # that is generated. The stamp files are numbered to have different names. # Autoconf calls _AC_AM_CONFIG_HEADER_HOOK (when defined) in the # loop where config.status creates the headers, so we can generate # our stamp files there. AC_DEFUN([_AC_AM_CONFIG_HEADER_HOOK], [# Compute $1's index in $config_headers. _am_arg=$1 _am_stamp_count=1 for _am_header in $config_headers :; do case $_am_header in $_am_arg | $_am_arg:* ) break ;; * ) _am_stamp_count=`expr $_am_stamp_count + 1` ;; esac done echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_count]) # Copyright (C) 2001-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_PROG_INSTALL_SH # ------------------ # Define $install_sh. AC_DEFUN([AM_PROG_INSTALL_SH], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl if test x"${install_sh}" != xset; then case $am_aux_dir in *\ * | *\ *) install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; *) install_sh="\${SHELL} $am_aux_dir/install-sh" esac fi AC_SUBST([install_sh])]) # Copyright (C) 2003-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # Check whether the underlying file-system supports filenames # with a leading dot. For instance MS-DOS doesn't. AC_DEFUN([AM_SET_LEADING_DOT], [rm -rf .tst 2>/dev/null mkdir .tst 2>/dev/null if test -d .tst; then am__leading_dot=. else am__leading_dot=_ fi rmdir .tst 2>/dev/null AC_SUBST([am__leading_dot])]) # Add --enable-maintainer-mode option to configure. -*- Autoconf -*- # From Jim Meyering # Copyright (C) 1996-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_MAINTAINER_MODE([DEFAULT-MODE]) # ---------------------------------- # Control maintainer-specific portions of Makefiles. # Default is to disable them, unless 'enable' is passed literally. # For symmetry, 'disable' may be passed as well. Anyway, the user # can override the default with the --enable/--disable switch. AC_DEFUN([AM_MAINTAINER_MODE], [m4_case(m4_default([$1], [disable]), [enable], [m4_define([am_maintainer_other], [disable])], [disable], [m4_define([am_maintainer_other], [enable])], [m4_define([am_maintainer_other], [enable]) m4_warn([syntax], [unexpected argument to AM@&t@_MAINTAINER_MODE: $1])]) AC_MSG_CHECKING([whether to enable maintainer-specific portions of Makefiles]) dnl maintainer-mode's default is 'disable' unless 'enable' is passed AC_ARG_ENABLE([maintainer-mode], [AS_HELP_STRING([--]am_maintainer_other[-maintainer-mode], am_maintainer_other[ make rules and dependencies not useful (and sometimes confusing) to the casual installer])], [USE_MAINTAINER_MODE=$enableval], [USE_MAINTAINER_MODE=]m4_if(am_maintainer_other, [enable], [no], [yes])) AC_MSG_RESULT([$USE_MAINTAINER_MODE]) AM_CONDITIONAL([MAINTAINER_MODE], [test $USE_MAINTAINER_MODE = yes]) MAINT=$MAINTAINER_MODE_TRUE AC_SUBST([MAINT])dnl ] ) # Check to see how 'make' treats includes. -*- Autoconf -*- # Copyright (C) 2001-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_MAKE_INCLUDE() # ----------------- # Check to see how make treats includes. AC_DEFUN([AM_MAKE_INCLUDE], [am_make=${MAKE-make} cat > confinc << 'END' am__doit: @echo this is the am__doit target .PHONY: am__doit END # If we don't find an include directive, just comment out the code. AC_MSG_CHECKING([for style of include used by $am_make]) am__include="#" am__quote= _am_result=none # First try GNU make style include. echo "include confinc" > confmf # Ignore all kinds of additional output from 'make'. case `$am_make -s -f confmf 2> /dev/null` in #( *the\ am__doit\ target*) am__include=include am__quote= _am_result=GNU ;; esac # Now try BSD make style include. if test "$am__include" = "#"; then echo '.include "confinc"' > confmf case `$am_make -s -f confmf 2> /dev/null` in #( *the\ am__doit\ target*) am__include=.include am__quote="\"" _am_result=BSD ;; esac fi AC_SUBST([am__include]) AC_SUBST([am__quote]) AC_MSG_RESULT([$_am_result]) rm -f confinc confmf ]) # Fake the existence of programs that GNU maintainers use. -*- Autoconf -*- # Copyright (C) 1997-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_MISSING_PROG(NAME, PROGRAM) # ------------------------------ AC_DEFUN([AM_MISSING_PROG], [AC_REQUIRE([AM_MISSING_HAS_RUN]) $1=${$1-"${am_missing_run}$2"} AC_SUBST($1)]) # AM_MISSING_HAS_RUN # ------------------ # Define MISSING if not defined so far and test if it is modern enough. # If it is, set am_missing_run to use it, otherwise, to nothing. AC_DEFUN([AM_MISSING_HAS_RUN], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl AC_REQUIRE_AUX_FILE([missing])dnl if test x"${MISSING+set}" != xset; then case $am_aux_dir in *\ * | *\ *) MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;; *) MISSING="\${SHELL} $am_aux_dir/missing" ;; esac fi # Use eval to expand $SHELL if eval "$MISSING --is-lightweight"; then am_missing_run="$MISSING " else am_missing_run= AC_MSG_WARN(['missing' script is too old or missing]) fi ]) # Helper functions for option handling. -*- Autoconf -*- # Copyright (C) 2001-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # _AM_MANGLE_OPTION(NAME) # ----------------------- AC_DEFUN([_AM_MANGLE_OPTION], [[_AM_OPTION_]m4_bpatsubst($1, [[^a-zA-Z0-9_]], [_])]) # _AM_SET_OPTION(NAME) # -------------------- # Set option NAME. Presently that only means defining a flag for this option. AC_DEFUN([_AM_SET_OPTION], [m4_define(_AM_MANGLE_OPTION([$1]), [1])]) # _AM_SET_OPTIONS(OPTIONS) # ------------------------ # OPTIONS is a space-separated list of Automake options. AC_DEFUN([_AM_SET_OPTIONS], [m4_foreach_w([_AM_Option], [$1], [_AM_SET_OPTION(_AM_Option)])]) # _AM_IF_OPTION(OPTION, IF-SET, [IF-NOT-SET]) # ------------------------------------------- # Execute IF-SET if OPTION is set, IF-NOT-SET otherwise. AC_DEFUN([_AM_IF_OPTION], [m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])]) # Copyright (C) 1999-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # _AM_PROG_CC_C_O # --------------- # Like AC_PROG_CC_C_O, but changed for automake. We rewrite AC_PROG_CC # to automatically call this. AC_DEFUN([_AM_PROG_CC_C_O], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl AC_REQUIRE_AUX_FILE([compile])dnl AC_LANG_PUSH([C])dnl AC_CACHE_CHECK( [whether $CC understands -c and -o together], [am_cv_prog_cc_c_o], [AC_LANG_CONFTEST([AC_LANG_PROGRAM([])]) # Make sure it works both with $CC and with simple cc. # Following AC_PROG_CC_C_O, we do the test twice because some # compilers refuse to overwrite an existing .o file with -o, # though they will create one. am_cv_prog_cc_c_o=yes for am_i in 1 2; do if AM_RUN_LOG([$CC -c conftest.$ac_ext -o conftest2.$ac_objext]) \ && test -f conftest2.$ac_objext; then : OK else am_cv_prog_cc_c_o=no break fi done rm -f core conftest* unset am_i]) if test "$am_cv_prog_cc_c_o" != yes; then # Losing compiler, so override with the script. # FIXME: It is wrong to rewrite CC. # But if we don't then we get into trouble of one sort or another. # A longer-term fix would be to have automake use am__CC in this case, # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)" CC="$am_aux_dir/compile $CC" fi AC_LANG_POP([C])]) # For backward compatibility. AC_DEFUN_ONCE([AM_PROG_CC_C_O], [AC_REQUIRE([AC_PROG_CC])]) # Copyright (C) 2001-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_RUN_LOG(COMMAND) # ------------------- # Run COMMAND, save the exit status in ac_status, and log it. # (This has been adapted from Autoconf's _AC_RUN_LOG macro.) AC_DEFUN([AM_RUN_LOG], [{ echo "$as_me:$LINENO: $1" >&AS_MESSAGE_LOG_FD ($1) >&AS_MESSAGE_LOG_FD 2>&AS_MESSAGE_LOG_FD ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD (exit $ac_status); }]) # Check to make sure that the build environment is sane. -*- Autoconf -*- # Copyright (C) 1996-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_SANITY_CHECK # --------------- AC_DEFUN([AM_SANITY_CHECK], [AC_MSG_CHECKING([whether build environment is sane]) # Reject unsafe characters in $srcdir or the absolute working directory # name. Accept space and tab only in the latter. am_lf=' ' case `pwd` in *[[\\\"\#\$\&\'\`$am_lf]]*) AC_MSG_ERROR([unsafe absolute working directory name]);; esac case $srcdir in *[[\\\"\#\$\&\'\`$am_lf\ \ ]]*) AC_MSG_ERROR([unsafe srcdir value: '$srcdir']);; esac # Do 'set' in a subshell so we don't clobber the current shell's # arguments. Must try -L first in case configure is actually a # symlink; some systems play weird games with the mod time of symlinks # (eg FreeBSD returns the mod time of the symlink's containing # directory). if ( am_has_slept=no for am_try in 1 2; do echo "timestamp, slept: $am_has_slept" > conftest.file set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` if test "$[*]" = "X"; then # -L didn't work. set X `ls -t "$srcdir/configure" conftest.file` fi if test "$[*]" != "X $srcdir/configure conftest.file" \ && test "$[*]" != "X conftest.file $srcdir/configure"; then # If neither matched, then we have a broken ls. This can happen # if, for instance, CONFIG_SHELL is bash and it inherits a # broken ls alias from the environment. This has actually # happened. Such a system could not be considered "sane". AC_MSG_ERROR([ls -t appears to fail. Make sure there is not a broken alias in your environment]) fi if test "$[2]" = conftest.file || test $am_try -eq 2; then break fi # Just in case. sleep 1 am_has_slept=yes done test "$[2]" = conftest.file ) then # Ok. : else AC_MSG_ERROR([newly created file is older than distributed files! Check your system clock]) fi AC_MSG_RESULT([yes]) # If we didn't sleep, we still need to ensure time stamps of config.status and # generated files are strictly newer. am_sleep_pid= if grep 'slept: no' conftest.file >/dev/null 2>&1; then ( sleep 1 ) & am_sleep_pid=$! fi AC_CONFIG_COMMANDS_PRE( [AC_MSG_CHECKING([that generated files are newer than configure]) if test -n "$am_sleep_pid"; then # Hide warnings about reused PIDs. wait $am_sleep_pid 2>/dev/null fi AC_MSG_RESULT([done])]) rm -f conftest.file ]) # Copyright (C) 2009-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_SILENT_RULES([DEFAULT]) # -------------------------- # Enable less verbose build rules; with the default set to DEFAULT # ("yes" being less verbose, "no" or empty being verbose). AC_DEFUN([AM_SILENT_RULES], [AC_ARG_ENABLE([silent-rules], [dnl AS_HELP_STRING( [--enable-silent-rules], [less verbose build output (undo: "make V=1")]) AS_HELP_STRING( [--disable-silent-rules], [verbose build output (undo: "make V=0")])dnl ]) case $enable_silent_rules in @%:@ ((( yes) AM_DEFAULT_VERBOSITY=0;; no) AM_DEFAULT_VERBOSITY=1;; *) AM_DEFAULT_VERBOSITY=m4_if([$1], [yes], [0], [1]);; esac dnl dnl A few 'make' implementations (e.g., NonStop OS and NextStep) dnl do not support nested variable expansions. dnl See automake bug#9928 and bug#10237. am_make=${MAKE-make} AC_CACHE_CHECK([whether $am_make supports nested variables], [am_cv_make_support_nested_variables], [if AS_ECHO([['TRUE=$(BAR$(V)) BAR0=false BAR1=true V=1 am__doit: @$(TRUE) .PHONY: am__doit']]) | $am_make -f - >/dev/null 2>&1; then am_cv_make_support_nested_variables=yes else am_cv_make_support_nested_variables=no fi]) if test $am_cv_make_support_nested_variables = yes; then dnl Using '$V' instead of '$(V)' breaks IRIX make. AM_V='$(V)' AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)' else AM_V=$AM_DEFAULT_VERBOSITY AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY fi AC_SUBST([AM_V])dnl AM_SUBST_NOTMAKE([AM_V])dnl AC_SUBST([AM_DEFAULT_V])dnl AM_SUBST_NOTMAKE([AM_DEFAULT_V])dnl AC_SUBST([AM_DEFAULT_VERBOSITY])dnl AM_BACKSLASH='\' AC_SUBST([AM_BACKSLASH])dnl _AM_SUBST_NOTMAKE([AM_BACKSLASH])dnl ]) # Copyright (C) 2001-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_PROG_INSTALL_STRIP # --------------------- # One issue with vendor 'install' (even GNU) is that you can't # specify the program used to strip binaries. This is especially # annoying in cross-compiling environments, where the build's strip # is unlikely to handle the host's binaries. # Fortunately install-sh will honor a STRIPPROG variable, so we # always use install-sh in "make install-strip", and initialize # STRIPPROG with the value of the STRIP variable (set by the user). AC_DEFUN([AM_PROG_INSTALL_STRIP], [AC_REQUIRE([AM_PROG_INSTALL_SH])dnl # Installed binaries are usually stripped using 'strip' when the user # run "make install-strip". However 'strip' might not be the right # tool to use in cross-compilation environments, therefore Automake # will honor the 'STRIP' environment variable to overrule this program. dnl Don't test for $cross_compiling = yes, because it might be 'maybe'. if test "$cross_compiling" != no; then AC_CHECK_TOOL([STRIP], [strip], :) fi INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" AC_SUBST([INSTALL_STRIP_PROGRAM])]) # Copyright (C) 2006-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # _AM_SUBST_NOTMAKE(VARIABLE) # --------------------------- # Prevent Automake from outputting VARIABLE = @VARIABLE@ in Makefile.in. # This macro is traced by Automake. AC_DEFUN([_AM_SUBST_NOTMAKE]) # AM_SUBST_NOTMAKE(VARIABLE) # -------------------------- # Public sister of _AM_SUBST_NOTMAKE. AC_DEFUN([AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE($@)]) # Check how to create a tarball. -*- Autoconf -*- # Copyright (C) 2004-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # _AM_PROG_TAR(FORMAT) # -------------------- # Check how to create a tarball in format FORMAT. # FORMAT should be one of 'v7', 'ustar', or 'pax'. # # Substitute a variable $(am__tar) that is a command # writing to stdout a FORMAT-tarball containing the directory # $tardir. # tardir=directory && $(am__tar) > result.tar # # Substitute a variable $(am__untar) that extract such # a tarball read from stdin. # $(am__untar) < result.tar # AC_DEFUN([_AM_PROG_TAR], [# Always define AMTAR for backward compatibility. Yes, it's still used # in the wild :-( We should find a proper way to deprecate it ... AC_SUBST([AMTAR], ['$${TAR-tar}']) # We'll loop over all known methods to create a tar archive until one works. _am_tools='gnutar m4_if([$1], [ustar], [plaintar]) pax cpio none' m4_if([$1], [v7], [am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -'], [m4_case([$1], [ustar], [# The POSIX 1988 'ustar' format is defined with fixed-size fields. # There is notably a 21 bits limit for the UID and the GID. In fact, # the 'pax' utility can hang on bigger UID/GID (see automake bug#8343 # and bug#13588). am_max_uid=2097151 # 2^21 - 1 am_max_gid=$am_max_uid # The $UID and $GID variables are not portable, so we need to resort # to the POSIX-mandated id(1) utility. Errors in the 'id' calls # below are definitely unexpected, so allow the users to see them # (that is, avoid stderr redirection). am_uid=`id -u || echo unknown` am_gid=`id -g || echo unknown` AC_MSG_CHECKING([whether UID '$am_uid' is supported by ustar format]) if test $am_uid -le $am_max_uid; then AC_MSG_RESULT([yes]) else AC_MSG_RESULT([no]) _am_tools=none fi AC_MSG_CHECKING([whether GID '$am_gid' is supported by ustar format]) if test $am_gid -le $am_max_gid; then AC_MSG_RESULT([yes]) else AC_MSG_RESULT([no]) _am_tools=none fi], [pax], [], [m4_fatal([Unknown tar format])]) AC_MSG_CHECKING([how to create a $1 tar archive]) # Go ahead even if we have the value already cached. We do so because we # need to set the values for the 'am__tar' and 'am__untar' variables. _am_tools=${am_cv_prog_tar_$1-$_am_tools} for _am_tool in $_am_tools; do case $_am_tool in gnutar) for _am_tar in tar gnutar gtar; do AM_RUN_LOG([$_am_tar --version]) && break done am__tar="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$$tardir"' am__tar_="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$tardir"' am__untar="$_am_tar -xf -" ;; plaintar) # Must skip GNU tar: if it does not support --format= it doesn't create # ustar tarball either. (tar --version) >/dev/null 2>&1 && continue am__tar='tar chf - "$$tardir"' am__tar_='tar chf - "$tardir"' am__untar='tar xf -' ;; pax) am__tar='pax -L -x $1 -w "$$tardir"' am__tar_='pax -L -x $1 -w "$tardir"' am__untar='pax -r' ;; cpio) am__tar='find "$$tardir" -print | cpio -o -H $1 -L' am__tar_='find "$tardir" -print | cpio -o -H $1 -L' am__untar='cpio -i -H $1 -d' ;; none) am__tar=false am__tar_=false am__untar=false ;; esac # If the value was cached, stop now. We just wanted to have am__tar # and am__untar set. test -n "${am_cv_prog_tar_$1}" && break # tar/untar a dummy directory, and stop if the command works. rm -rf conftest.dir mkdir conftest.dir echo GrepMe > conftest.dir/file AM_RUN_LOG([tardir=conftest.dir && eval $am__tar_ >conftest.tar]) rm -rf conftest.dir if test -s conftest.tar; then AM_RUN_LOG([$am__untar /dev/null 2>&1 && break fi done rm -rf conftest.dir AC_CACHE_VAL([am_cv_prog_tar_$1], [am_cv_prog_tar_$1=$_am_tool]) AC_MSG_RESULT([$am_cv_prog_tar_$1])]) AC_SUBST([am__tar]) AC_SUBST([am__untar]) ]) # _AM_PROG_TAR dibbler-1.0.1/bison++/new.h0000664000175000017500000000216612233256142012246 00000000000000/* Storage allocation interface for bison, Copyright (C) 1984, 1989 Free Software Foundation, Inc. This file is part of Bison, the GNU Compiler Compiler. Bison 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. Bison 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 Bison; see the file COPYING. If not, write to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ #define NEW(t) ((t *) xmalloc((unsigned) sizeof(t))) #define NEW2(n, t) ((t *) xmalloc((unsigned) ((n) * sizeof(t)))) #ifdef __STDC__ #define FREE(x) (x ? (void) free((char *) (x)) : (void)0) #else #define FREE(x) ((x) != 0 && (free ((char *) (x)), 0)) #endif extern char *xmalloc(unsigned); extern char *xrealloc(char*,unsigned); dibbler-1.0.1/bison++/README++0000664000175000017500000000136612233256142012313 00000000000000this is a modified version of bison the author of the changes is coetmeur@icdc.fr all is quite like the standard bison install, except : the bison++.man are man page that shows the differences between bison and bison++ the bison++.dman is a very readable file that generate the not as much readable troff/man file bison++.man on DOS, use bison_pp.mak to build the DOS EXE with MSC7 there are no big trick in it. it can be directly loaded in the PWB... if you want to use another compiler, just compile and link normally each source like on unix... use large memory model, and look at the -D option I have added in the MSC makefile... check also for compiler specific problems... you can else get the DOS exe that come normally aside this archive... dibbler-1.0.1/bison++/derives.cc0000664000175000017500000000435112233256142013252 00000000000000/* Match rules with nonterminals for bison, Copyright (C) 1984, 1989 Free Software Foundation, Inc. This file is part of Bison, the GNU Compiler Compiler. Bison 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. Bison 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 Bison; see the file COPYING. If not, write to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ /* set_derives finds, for each variable (nonterminal), which rules can derive it. It sets up the value of derives so that derives[i - ntokens] points to a vector of rule numbers, terminated with -1. */ #include #include "system.h" #include "new.h" #include "types.h" #include "gram.h" short **derives; void set_derives() { register int i; register int lhs; register shorts *p; register short *q; register shorts **dset; register shorts *delts; dset = NEW2(nvars, shorts *) - ntokens; delts = NEW2(nrules + 1, shorts); p = delts; for (i = nrules; i > 0; i--) { lhs = rlhs[i]; if (lhs >= 0) { p->next = dset[lhs]; p->value = i; dset[lhs] = p; p++; } } derives = NEW2(nvars, short *) - ntokens; q = NEW2(nvars + nrules, short); for (i = ntokens; i < nsyms; i++) { derives[i] = q; p = dset[i]; while (p) { *q++ = p->value; p = p->next; } *q++ = -1; } #ifdef DEBUG print_derives(); #endif FREE(dset + ntokens); FREE(delts); } void free_derives() { FREE(derives[ntokens]); FREE(derives + ntokens); } #ifdef DEBUG print_derives() { register int i; register short *sp; extern char **tags; printf("\n\n\nDERIVES\n\n"); for (i = ntokens; i < nsyms; i++) { printf("%s derives", tags[i]); for (sp = derives[i]; *sp > 0; sp++) { printf(" %d", *sp); } putchar('\n'); } putchar('\n'); } #endif dibbler-1.0.1/bison++/texinfo.tex0000664000175000017500000040250612233256142013504 00000000000000%% TeX macros to handle texinfo files % Copyright (C) 1985, 86, 88, 90, 91, 92, 1993 Free Software Foundation, Inc. %This texinfo.tex file is free software; you can redistribute it and/or %modify it under the terms of the GNU General Public License as %published by the Free Software Foundation; either version 2, or (at %your option) any later version. %This texinfo.tex file 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 texinfo.tex file; see the file COPYING. If not, write %to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, %USA. %In other words, you are welcome to use, share and improve this program. %You are forbidden to forbid anyone else to use, share and improve %what you give them. Help stamp out software-hoarding! \def\texinfoversion{2.112} \message{Loading texinfo package [Version \texinfoversion]:} % Print the version number if in a .fmt file. \everyjob{\message{[Texinfo version \texinfoversion]}\message{}} % Save some parts of plain tex whose names we will redefine. \let\ptexlbrace=\{ \let\ptexrbrace=\} \let\ptexdots=\dots \let\ptexdot=\. \let\ptexstar=\* \let\ptexend=\end \let\ptexbullet=\bullet \let\ptexb=\b \let\ptexc=\c \let\ptexi=\i \let\ptext=\t \let\ptexl=\l \let\ptexL=\L \def\tie{\penalty 10000\ } % Save plain tex definition of ~. \message{Basics,} \chardef\other=12 % If this character appears in an error message or help string, it % starts a new line in the output. \newlinechar = `^^J % Ignore a token. % \def\gobble#1{} \hyphenation{ap-pen-dix} \hyphenation{mini-buf-fer mini-buf-fers} \hyphenation{eshell} % Margin to add to right of even pages, to left of odd pages. \newdimen \bindingoffset \bindingoffset=0pt \newdimen \normaloffset \normaloffset=\hoffset \newdimen\pagewidth \newdimen\pageheight \pagewidth=\hsize \pageheight=\vsize % Sometimes it is convenient to have everything in the transcript file % and nothing on the terminal. We don't just call \tracingall here, % since that produces some useless output on the terminal. % \def\gloggingall{\begingroup \globaldefs = 1 \loggingall \endgroup}% \def\loggingall{\tracingcommands2 \tracingstats2 \tracingpages1 \tracingoutput1 \tracinglostchars1 \tracingmacros2 \tracingparagraphs1 \tracingrestores1 \showboxbreadth\maxdimen\showboxdepth\maxdimen }% %---------------------Begin change----------------------- % %%%% For @cropmarks command. % Dimensions to add cropmarks at corners Added by P. A. MacKay, 12 Nov. 1986 % \newdimen\cornerlong \newdimen\cornerthick \newdimen \topandbottommargin \newdimen \outerhsize \newdimen \outervsize \cornerlong=1pc\cornerthick=.3pt % These set size of cropmarks \outerhsize=7in %\outervsize=9.5in % Alternative @smallbook page size is 9.25in \outervsize=9.25in \topandbottommargin=.75in % %---------------------End change----------------------- % \onepageout takes a vbox as an argument. Note that \pagecontents % does insertions itself, but you have to call it yourself. \chardef\PAGE=255 \output={\onepageout{\pagecontents\PAGE}} \def\onepageout#1{\hoffset=\normaloffset \ifodd\pageno \advance\hoffset by \bindingoffset \else \advance\hoffset by -\bindingoffset\fi {\escapechar=`\\\relax % makes sure backslash is used in output files. \shipout\vbox{{\let\hsize=\pagewidth \makeheadline} \pagebody{#1}% {\let\hsize=\pagewidth \makefootline}}}% \advancepageno \ifnum\outputpenalty>-20000 \else\dosupereject\fi} %%%% For @cropmarks command %%%% % Here is a modification of the main output routine for Near East Publications % This provides right-angle cropmarks at all four corners. % The contents of the page are centerlined into the cropmarks, % and any desired binding offset is added as an \hskip on either % site of the centerlined box. (P. A. MacKay, 12 November, 1986) % \def\croppageout#1{\hoffset=0pt % make sure this doesn't mess things up {\escapechar=`\\\relax % makes sure backslash is used in output files. \shipout \vbox to \outervsize{\hsize=\outerhsize \vbox{\line{\ewtop\hfill\ewtop}} \nointerlineskip \line{\vbox{\moveleft\cornerthick\nstop} \hfill \vbox{\moveright\cornerthick\nstop}} \vskip \topandbottommargin \centerline{\ifodd\pageno\hskip\bindingoffset\fi \vbox{ {\let\hsize=\pagewidth \makeheadline} \pagebody{#1} {\let\hsize=\pagewidth \makefootline}} \ifodd\pageno\else\hskip\bindingoffset\fi} \vskip \topandbottommargin plus1fill minus1fill \boxmaxdepth\cornerthick \line{\vbox{\moveleft\cornerthick\nsbot} \hfill \vbox{\moveright\cornerthick\nsbot}} \nointerlineskip \vbox{\line{\ewbot\hfill\ewbot}} }} \advancepageno \ifnum\outputpenalty>-20000 \else\dosupereject\fi} % % Do @cropmarks to get crop marks \def\cropmarks{\let\onepageout=\croppageout } \def\pagebody#1{\vbox to\pageheight{\boxmaxdepth=\maxdepth #1}} {\catcode`\@ =11 \gdef\pagecontents#1{\ifvoid\topins\else\unvbox\topins\fi \dimen@=\dp#1 \unvbox#1 \ifvoid\footins\else\vskip\skip\footins\footnoterule \unvbox\footins\fi \ifr@ggedbottom \kern-\dimen@ \vfil \fi} } % % Here are the rules for the cropmarks. Note that they are % offset so that the space between them is truly \outerhsize or \outervsize % (P. A. MacKay, 12 November, 1986) % \def\ewtop{\vrule height\cornerthick depth0pt width\cornerlong} \def\nstop{\vbox {\hrule height\cornerthick depth\cornerlong width\cornerthick}} \def\ewbot{\vrule height0pt depth\cornerthick width\cornerlong} \def\nsbot{\vbox {\hrule height\cornerlong depth\cornerthick width\cornerthick}} % Parse an argument, then pass it to #1. The argument is the rest of % the input line (except we remove a trailing comment). #1 should be a % macro which expects an ordinary undelimited TeX argument. % \def\parsearg#1{% \let\next = #1% \begingroup \obeylines \futurelet\temp\parseargx } % If the next token is an obeyed space (from an @example environment or % the like), remove it and recurse. Otherwise, we're done. \def\parseargx{% % \obeyedspace is defined far below, after the definition of \sepspaces. \ifx\obeyedspace\temp \expandafter\parseargdiscardspace \else \expandafter\parseargline \fi } % Remove a single space (as the delimiter token to the macro call). {\obeyspaces % \gdef\parseargdiscardspace {\futurelet\temp\parseargx}} {\obeylines % \gdef\parseargline#1^^M{% \endgroup % End of the group started in \parsearg. % % First remove any @c comment, then any @comment. % Result of each macro is put in \toks0. \argremovec #1\c\relax % \expandafter\argremovecomment \the\toks0 \comment\relax % % % Call the caller's macro, saved as \next in \parsearg. \expandafter\next\expandafter{\the\toks0}% }% } % Since all \c{,omment} does is throw away the argument, we can let TeX % do that for us. The \relax here is matched by the \relax in the call % in \parseargline; it could be more or less anything, its purpose is % just to delimit the argument to the \c. \def\argremovec#1\c#2\relax{\toks0 = {#1}} \def\argremovecomment#1\comment#2\relax{\toks0 = {#1}} % \argremovec{,omment} might leave us with trailing spaces, though; e.g., % @end itemize @c foo % will have two active spaces as part of the argument with the % `itemize'. Here we remove all active spaces from #1, and assign the % result to \toks0. % % This loses if there are any *other* active characters besides spaces % in the argument -- _ ^ +, for example -- since they get expanded. % Fortunately, Texinfo does not define any such commands. (If it ever % does, the catcode of the characters in questionwill have to be changed % here.) But this means we cannot call \removeactivespaces as part of % \argremovec{,omment}, since @c uses \parsearg, and thus the argument % that \parsearg gets might well have any character at all in it. % \def\removeactivespaces#1{% \begingroup \ignoreactivespaces \edef\temp{#1}% \global\toks0 = \expandafter{\temp}% \endgroup } % Change the active space to expand to nothing. % \begingroup \obeyspaces \gdef\ignoreactivespaces{\obeyspaces\let =\empty} \endgroup \def\flushcr{\ifx\par\lisppar \def\next##1{}\else \let\next=\relax \fi \next} %% These are used to keep @begin/@end levels from running away %% Call \inENV within environments (after a \begingroup) \newif\ifENV \ENVfalse \def\inENV{\ifENV\relax\else\ENVtrue\fi} \def\ENVcheck{% \ifENV\errmessage{Still within an environment. Type Return to continue.} \endgroup\fi} % This is not perfect, but it should reduce lossage % @begin foo is the same as @foo, for now. \newhelp\EMsimple{Type to continue.} \outer\def\begin{\parsearg\beginxxx} \def\beginxxx #1{% \expandafter\ifx\csname #1\endcsname\relax {\errhelp=\EMsimple \errmessage{Undefined command @begin #1}}\else \csname #1\endcsname\fi} % @end foo executes the definition of \Efoo. % \def\end{\parsearg\endxxx} \def\endxxx #1{% \removeactivespaces{#1}% \edef\endthing{\the\toks0}% % \expandafter\ifx\csname E\endthing\endcsname\relax \expandafter\ifx\csname \endthing\endcsname\relax % There's no \foo, i.e., no ``environment'' foo. \errhelp = \EMsimple \errmessage{Undefined command `@end \endthing'}% \else \unmatchedenderror\endthing \fi \else % Everything's ok; the right environment has been started. \csname E\endthing\endcsname \fi } % There is an environment #1, but it hasn't been started. Give an error. % \def\unmatchedenderror#1{% \errhelp = \EMsimple \errmessage{This `@end #1' doesn't have a matching `@#1'}% } % Define the control sequence \E#1 to give an unmatched @end error. % \def\defineunmatchedend#1{% \expandafter\def\csname E#1\endcsname{\unmatchedenderror{#1}}% } % Single-spacing is done by various environments (specifically, in % \nonfillstart and \quotations). \newskip\singlespaceskip \singlespaceskip = \baselineskip \def\singlespace{% % Why was this kern here? It messes up equalizing space above and below % environments. --karl, 6may93 %{\advance \baselineskip by -\singlespaceskip %\kern \baselineskip}% \baselineskip=\singlespaceskip } %% Simple single-character @ commands % @@ prints an @ % Kludge this until the fonts are right (grr). \def\@{{\tt \char '100}} % This is turned off because it was never documented % and you can use @w{...} around a quote to suppress ligatures. %% Define @` and @' to be the same as ` and ' %% but suppressing ligatures. %\def\`{{`}} %\def\'{{'}} % Used to generate quoted braces. \def\mylbrace {{\tt \char '173}} \def\myrbrace {{\tt \char '175}} \let\{=\mylbrace \let\}=\myrbrace % @: forces normal size whitespace following. \def\:{\spacefactor=1000 } % @* forces a line break. \def\*{\hfil\break\hbox{}\ignorespaces} % @. is an end-of-sentence period. \def\.{.\spacefactor=3000 } % @w prevents a word break. Without the \leavevmode, @w at the % beginning of a paragraph, when TeX is still in vertical mode, would % produce a whole line of output instead of starting the paragraph. \def\w#1{\leavevmode\hbox{#1}} % @group ... @end group forces ... to be all on one page, by enclosing % it in a TeX vbox. We use \vtop instead of \vbox to construct the box % to keep its height that of a normal line. According to the rules for % \topskip (p.114 of the TeXbook), the glue inserted is % max (\topskip - \ht (first item), 0). If that height is large, % therefore, no glue is inserted, and the space between the headline and % the text is small, which looks bad. % \def\group{\begingroup \ifnum\catcode13=\active \else \errhelp = \groupinvalidhelp \errmessage{@group invalid in context where filling is enabled}% \fi % % The \vtop we start below produces a box with normal height and large % depth; thus, TeX puts \baselineskip glue before it, and (when the % next line of text is done) \lineskip glue after it. (See p.82 of % the TeXbook.) Thus, space below is not quite equal to space % above. But it's pretty close. \def\Egroup{% \egroup % End the \vtop. \endgroup % End the \group. }% % \vtop\bgroup % We have to put a strut on the last line in case the @group is in % the midst of an example, rather than completely enclosing it. % Otherwise, the interline space between the last line of the group % and the first line afterwards is too small. But we can't put the % strut in \Egroup, since there it would be on a line by itself. % Hence this just inserts a strut at the beginning of each line. \everypar = {\strut}% % % Since we have a strut on every line, we don't need any of TeX's % normal interline spacing. \offinterlineskip % % OK, but now we have to do something about blank % lines in the input in @example-like environments, which normally % just turn into \lisppar, which will insert no space now that we've % turned off the interline space. Simplest is to make them be an % empty paragraph. \ifx\par\lisppar \edef\par{\leavevmode \par}% % % Reset ^^M's definition to new definition of \par. \obeylines \fi % % We do @comment here in case we are called inside an environment, % such as @example, where each end-of-line in the input causes an % end-of-line in the output. We don't want the end-of-line after % the `@group' to put extra space in the output. Since @group % should appear on a line by itself (according to the Texinfo % manual), we don't worry about eating any user text. \comment } % % TeX puts in an \escapechar (i.e., `@') at the beginning of the help % message, so this ends up printing `@group can only ...'. % \newhelp\groupinvalidhelp{% group can only be used in environments such as @example,^^J% where each line of input produces a line of output.} % @need space-in-mils % forces a page break if there is not space-in-mils remaining. \newdimen\mil \mil=0.001in \def\need{\parsearg\needx} % Old definition--didn't work. %\def\needx #1{\par % %% This method tries to make TeX break the page naturally %% if the depth of the box does not fit. %{\baselineskip=0pt% %\vtop to #1\mil{\vfil}\kern -#1\mil\penalty 10000 %\prevdepth=-1000pt %}} \def\needx#1{% % Go into vertical mode, so we don't make a big box in the middle of a % paragraph. \par % % Don't add any leading before our big empty box, but allow a page % break, since the best break might be right here. \allowbreak \nointerlineskip \vtop to #1\mil{\vfil}% % % TeX does not even consider page breaks if a penalty added to the % main vertical list is 10000 or more. But in order to see if the % empty box we just added fits on the page, we must make it consider % page breaks. On the other hand, we don't want to actually break the % page after the empty box. So we use a penalty of 9999. % % There is an extremely small chance that TeX will actually break the % page at this \penalty, if there are no other feasible breakpoints in % sight. (If the user is using lots of big @group commands, which % almost-but-not-quite fill up a page, TeX will have a hard time doing % good page breaking, for example.) However, I could not construct an % example where a page broke at this \penalty; if it happens in a real % document, then we can reconsider our strategy. \penalty9999 % % Back up by the size of the box, whether we did a page break or not. \kern -#1\mil % % Do not allow a page break right after this kern. \nobreak } % @br forces paragraph break \let\br = \par % @dots{} output some dots \def\dots{$\ldots$} % @page forces the start of a new page \def\page{\par\vfill\supereject} % @exdent text.... % outputs text on separate line in roman font, starting at standard page margin % This records the amount of indent in the innermost environment. % That's how much \exdent should take out. \newskip\exdentamount % This defn is used inside fill environments such as @defun. \def\exdent{\parsearg\exdentyyy} \def\exdentyyy #1{{\hfil\break\hbox{\kern -\exdentamount{\rm#1}}\hfil\break}} % This defn is used inside nofill environments such as @example. \def\nofillexdent{\parsearg\nofillexdentyyy} \def\nofillexdentyyy #1{{\advance \leftskip by -\exdentamount \leftline{\hskip\leftskip{\rm#1}}}} %\hbox{{\rm#1}}\hfil\break}} % @include file insert text of that file as input. \def\include{\parsearg\includezzz} %Use \input\thisfile to avoid blank after \input, which may be an active %char (in which case the blank would become the \input argument). %The grouping keeps the value of \thisfile correct even when @include %is nested. \def\includezzz #1{\begingroup \def\thisfile{#1}\input\thisfile \endgroup} \def\thisfile{} % @center line outputs that line, centered \def\center{\parsearg\centerzzz} \def\centerzzz #1{{\advance\hsize by -\leftskip \advance\hsize by -\rightskip \centerline{#1}}} % @sp n outputs n lines of vertical space \def\sp{\parsearg\spxxx} \def\spxxx #1{\par \vskip #1\baselineskip} % @comment ...line which is ignored... % @c is the same as @comment % @ignore ... @end ignore is another way to write a comment \def\comment{\catcode 64=\other \catcode 123=\other \catcode 125=\other% \parsearg \commentxxx} \def\commentxxx #1{\catcode 64=0 \catcode 123=1 \catcode 125=2 } \let\c=\comment % Prevent errors for section commands. % Used in @ignore and in failing conditionals. \def\ignoresections{% \let\chapter=\relax \let\unnumbered=\relax \let\top=\relax \let\unnumberedsec=\relax \let\unnumberedsection=\relax \let\unnumberedsubsec=\relax \let\unnumberedsubsection=\relax \let\unnumberedsubsubsec=\relax \let\unnumberedsubsubsection=\relax \let\section=\relax \let\subsec=\relax \let\subsubsec=\relax \let\subsection=\relax \let\subsubsection=\relax \let\appendix=\relax \let\appendixsec=\relax \let\appendixsection=\relax \let\appendixsubsec=\relax \let\appendixsubsection=\relax \let\appendixsubsubsec=\relax \let\appendixsubsubsection=\relax \let\contents=\relax \let\smallbook=\relax \let\titlepage=\relax } % Used in nested conditionals, where we have to parse the Texinfo source % and so want to turn off most commands, in case they are used % incorrectly. % \def\ignoremorecommands{% \let\defcv = \relax \let\deffn = \relax \let\deffnx = \relax \let\defindex = \relax \let\defivar = \relax \let\defmac = \relax \let\defmethod = \relax \let\defop = \relax \let\defopt = \relax \let\defspec = \relax \let\deftp = \relax \let\deftypefn = \relax \let\deftypefun = \relax \let\deftypevar = \relax \let\deftypevr = \relax \let\defun = \relax \let\defvar = \relax \let\defvr = \relax \let\ref = \relax \let\xref = \relax \let\printindex = \relax \let\pxref = \relax \let\settitle = \relax \let\include = \relax \let\lowersections = \relax \let\down = \relax \let\raisesections = \relax \let\up = \relax \let\set = \relax \let\clear = \relax } % Ignore @ignore ... @end ignore. % \def\ignore{\doignore{ignore}} % Also ignore @ifinfo, @menu, and @direntry text. % \def\ifinfo{\doignore{ifinfo}} \def\menu{\doignore{menu}} \def\direntry{\doignore{direntry}} % Ignore text until a line `@end #1'. % \def\doignore#1{\begingroup % Don't complain about control sequences we have declared \outer. \ignoresections % % Define a command to swallow text until we reach `@end #1'. \long\def\doignoretext##1\end #1{\enddoignore}% % % Make sure that spaces turn into tokens that match what \doignoretext wants. \catcode32 = 10 % % And now expand that command. \doignoretext } % What we do to finish off ignored text. % \def\enddoignore{\endgroup\ignorespaces}% \newif\ifwarnedobs\warnedobsfalse \def\obstexwarn{% \ifwarnedobs\relax\else % We need to warn folks that they may have trouble with TeX 3.0. % This uses \immediate\write16 rather than \message to get newlines. \immediate\write16{} \immediate\write16{***WARNING*** for users of Unix TeX 3.0!} \immediate\write16{This manual trips a bug in TeX version 3.0 (tex hangs).} \immediate\write16{If you are running another version of TeX, relax.} \immediate\write16{If you are running Unix TeX 3.0, kill this TeX process.} \immediate\write16{ Then upgrade your TeX installation if you can.} \immediate\write16{If you are stuck with version 3.0, run the} \immediate\write16{ script ``tex3patch'' from the Texinfo distribution} \immediate\write16{ to use a workaround.} \immediate\write16{} \warnedobstrue \fi } % **In TeX 3.0, setting text in \nullfont hangs tex. For a % workaround (which requires the file ``dummy.tfm'' to be installed), % uncomment the following line: %%%%%\font\nullfont=dummy\let\obstexwarn=\relax % Ignore text, except that we keep track of conditional commands for % purposes of nesting, up to an `@end #1' command. % \def\nestedignore#1{% \obstexwarn % We must actually expand the ignored text to look for the @end % command, so that nested ignore constructs work. Thus, we put the % text into a \vbox and then do nothing with the result. To minimize % the change of memory overflow, we follow the approach outlined on % page 401 of the TeXbook: make the current font be a dummy font. % \setbox0 = \vbox\bgroup % Don't complain about control sequences we have declared \outer. \ignoresections % % Define `@end #1' to end the box, which will in turn undefine the % @end command again. \expandafter\def\csname E#1\endcsname{\egroup\ignorespaces}% % % We are going to be parsing Texinfo commands. Most cause no % trouble when they are used incorrectly, but some commands do % complicated argument parsing or otherwise get confused, so we % undefine them. % % We can't do anything about stray @-signs, unfortunately; % they'll produce `undefined control sequence' errors. \ignoremorecommands % % Set the current font to be \nullfont, a TeX primitive, and define % all the font commands to also use \nullfont. We don't use % dummy.tfm, as suggested in the TeXbook, because not all sites % might have that installed. Therefore, math mode will still % produce output, but that should be an extremely small amount of % stuff compared to the main input. % \nullfont \let\tenrm = \nullfont \let\tenit = \nullfont \let\tensl = \nullfont \let\tenbf = \nullfont \let\tentt = \nullfont \let\smallcaps = \nullfont \let\tensf = \nullfont % Similarly for index fonts (mostly for their use in % smallexample) \let\indrm = \nullfont \let\indit = \nullfont \let\indsl = \nullfont \let\indbf = \nullfont \let\indtt = \nullfont \let\indsc = \nullfont \let\indsf = \nullfont % % Don't complain when characters are missing from the fonts. \tracinglostchars = 0 % % Don't bother to do space factor calculations. \frenchspacing % % Don't report underfull hboxes. \hbadness = 10000 % % Do minimal line-breaking. \pretolerance = 10000 % % Do not execute instructions in @tex \def\tex{\doignore{tex}} } % @set VAR sets the variable VAR to an empty value. % @set VAR REST-OF-LINE sets VAR to the value REST-OF-LINE. % % Since we want to separate VAR from REST-OF-LINE (which might be % empty), we can't just use \parsearg; we have to insert a space of our % own to delimit the rest of the line, and then take it out again if we % didn't need it. % \def\set{\parsearg\setxxx} \def\setxxx#1{\setyyy#1 \endsetyyy} \def\setyyy#1 #2\endsetyyy{% \def\temp{#2}% \ifx\temp\empty \global\expandafter\let\csname SET#1\endcsname = \empty \else \setzzz{#1}#2\endsetzzz % Remove the trailing space \setxxx inserted. \fi } \def\setzzz#1#2 \endsetzzz{\expandafter\xdef\csname SET#1\endcsname{#2}} % @clear VAR clears (i.e., unsets) the variable VAR. % \def\clear{\parsearg\clearxxx} \def\clearxxx#1{\global\expandafter\let\csname SET#1\endcsname=\relax} % @value{foo} gets the text saved in variable foo. % \def\value#1{\expandafter \ifx\csname SET#1\endcsname\relax {\{No value for ``#1''\}} \else \csname SET#1\endcsname \fi} % @ifset VAR ... @end ifset reads the `...' iff VAR has been defined % with @set. % \def\ifset{\parsearg\ifsetxxx} \def\ifsetxxx #1{% \expandafter\ifx\csname SET#1\endcsname\relax \expandafter\ifsetfail \else \expandafter\ifsetsucceed \fi } \def\ifsetsucceed{\conditionalsucceed{ifset}} \def\ifsetfail{\nestedignore{ifset}} \defineunmatchedend{ifset} % @ifclear VAR ... @end ifclear reads the `...' iff VAR has never been % defined with @set, or has been undefined with @clear. % \def\ifclear{\parsearg\ifclearxxx} \def\ifclearxxx #1{% \expandafter\ifx\csname SET#1\endcsname\relax \expandafter\ifclearsucceed \else \expandafter\ifclearfail \fi } \def\ifclearsucceed{\conditionalsucceed{ifclear}} \def\ifclearfail{\nestedignore{ifclear}} \defineunmatchedend{ifclear} % @iftex always succeeds; we read the text following, through @end % iftex). But `@end iftex' should be valid only after an @iftex. % \def\iftex{\conditionalsucceed{iftex}} \defineunmatchedend{iftex} % We can't just want to start a group at @iftex (for example) and end it % at @end iftex, since then @set commands inside the conditional have no % effect (they'd get reverted at the end of the group). So we must % define \Eiftex to redefine itself to be its previous value. (We can't % just define it to fail again with an ``unmatched end'' error, since % the @ifset might be nested.) % \def\conditionalsucceed#1{% \edef\temp{% % Remember the current value of \E#1. \let\nece{prevE#1} = \nece{E#1}% % % At the `@end #1', redefine \E#1 to be its previous value. \def\nece{E#1}{\let\nece{E#1} = \nece{prevE#1}}% }% \temp } % We need to expand lots of \csname's, but we don't want to expand the % control sequences after we've constructed them. % \def\nece#1{\expandafter\noexpand\csname#1\endcsname} % @asis just yields its argument. Used with @table, for example. % \def\asis#1{#1} % @math means output in math mode. % We don't use $'s directly in the definition of \math because control % sequences like \math are expanded when the toc file is written. Then, % we read the toc file back, the $'s will be normal characters (as they % should be, according to the definition of Texinfo). So we must use a % control sequence to switch into and out of math mode. % % This isn't quite enough for @math to work properly in indices, but it % seems unlikely it will ever be needed there. % \let\implicitmath = $ \def\math#1{\implicitmath #1\implicitmath} % @bullet and @minus need the same treatment as @math, just above. \def\bullet{\implicitmath\ptexbullet\implicitmath} \def\minus{\implicitmath-\implicitmath} \def\node{\ENVcheck\parsearg\nodezzz} \def\nodezzz#1{\nodexxx [#1,]} \def\nodexxx[#1,#2]{\gdef\lastnode{#1}} \let\nwnode=\node \let\lastnode=\relax \def\donoderef{\ifx\lastnode\relax\else \expandafter\expandafter\expandafter\setref{\lastnode}\fi \let\lastnode=\relax} \def\unnumbnoderef{\ifx\lastnode\relax\else \expandafter\expandafter\expandafter\unnumbsetref{\lastnode}\fi \let\lastnode=\relax} \def\appendixnoderef{\ifx\lastnode\relax\else \expandafter\expandafter\expandafter\appendixsetref{\lastnode}\fi \let\lastnode=\relax} \let\refill=\relax % @setfilename is done at the beginning of every texinfo file. % So open here the files we need to have open while reading the input. % This makes it possible to make a .fmt file for texinfo. \def\setfilename{% \readauxfile \opencontents \openindices \fixbackslash % Turn off hack to swallow `\input texinfo'. \global\let\setfilename=\comment % Ignore extra @setfilename cmds. \comment % Ignore the actual filename. } \outer\def\bye{\pagealignmacro\tracingstats=1\ptexend} \def\inforef #1{\inforefzzz #1,,,,**} \def\inforefzzz #1,#2,#3,#4**{See Info file \file{\ignorespaces #3{}}, node \samp{\ignorespaces#1{}}} \message{fonts,} % Font-change commands. % Texinfo supports the sans serif font style, which plain TeX does not. % So we set up a \sf analogous to plain's \rm, etc. \newfam\sffam \def\sf{\fam=\sffam \tensf} \let\li = \sf % Sometimes we call it \li, not \sf. %% Try out Computer Modern fonts at \magstephalf \let\mainmagstep=\magstephalf \ifx\bigger\relax \let\mainmagstep=\magstep1 \font\textrm=cmr12 \font\texttt=cmtt12 \else \font\textrm=cmr10 scaled \mainmagstep \font\texttt=cmtt10 scaled \mainmagstep \fi % Instead of cmb10, you many want to use cmbx10. % cmbx10 is a prettier font on its own, but cmb10 % looks better when embedded in a line with cmr10. \font\textbf=cmb10 scaled \mainmagstep \font\textit=cmti10 scaled \mainmagstep \font\textsl=cmsl10 scaled \mainmagstep \font\textsf=cmss10 scaled \mainmagstep \font\textsc=cmcsc10 scaled \mainmagstep \font\texti=cmmi10 scaled \mainmagstep \font\textsy=cmsy10 scaled \mainmagstep % A few fonts for @defun, etc. \font\defbf=cmbx10 scaled \magstep1 %was 1314 \font\deftt=cmtt10 scaled \magstep1 \def\df{\let\tentt=\deftt \let\tenbf = \defbf \bf} % Fonts for indices and small examples. % We actually use the slanted font rather than the italic, % because texinfo normally uses the slanted fonts for that. % Do not make many font distinctions in general in the index, since they % aren't very useful. \font\ninett=cmtt9 \font\indrm=cmr9 \font\indit=cmsl9 \let\indsl=\indit \let\indtt=\ninett \let\indsf=\indrm \let\indbf=\indrm \let\indsc=\indrm \font\indi=cmmi9 \font\indsy=cmsy9 % Fonts for headings \font\chaprm=cmbx12 scaled \magstep2 \font\chapit=cmti12 scaled \magstep2 \font\chapsl=cmsl12 scaled \magstep2 \font\chaptt=cmtt12 scaled \magstep2 \font\chapsf=cmss12 scaled \magstep2 \let\chapbf=\chaprm \font\chapsc=cmcsc10 scaled\magstep3 \font\chapi=cmmi12 scaled \magstep2 \font\chapsy=cmsy10 scaled \magstep3 \font\secrm=cmbx12 scaled \magstep1 \font\secit=cmti12 scaled \magstep1 \font\secsl=cmsl12 scaled \magstep1 \font\sectt=cmtt12 scaled \magstep1 \font\secsf=cmss12 scaled \magstep1 \font\secbf=cmbx12 scaled \magstep1 \font\secsc=cmcsc10 scaled\magstep2 \font\seci=cmmi12 scaled \magstep1 \font\secsy=cmsy10 scaled \magstep2 % \font\ssecrm=cmbx10 scaled \magstep1 % This size an font looked bad. % \font\ssecit=cmti10 scaled \magstep1 % The letters were too crowded. % \font\ssecsl=cmsl10 scaled \magstep1 % \font\ssectt=cmtt10 scaled \magstep1 % \font\ssecsf=cmss10 scaled \magstep1 %\font\ssecrm=cmb10 scaled 1315 % Note the use of cmb rather than cmbx. %\font\ssecit=cmti10 scaled 1315 % Also, the size is a little larger than %\font\ssecsl=cmsl10 scaled 1315 % being scaled magstep1. %\font\ssectt=cmtt10 scaled 1315 %\font\ssecsf=cmss10 scaled 1315 %\let\ssecbf=\ssecrm \font\ssecrm=cmbx12 scaled \magstephalf \font\ssecit=cmti12 scaled \magstephalf \font\ssecsl=cmsl12 scaled \magstephalf \font\ssectt=cmtt12 scaled \magstephalf \font\ssecsf=cmss12 scaled \magstephalf \font\ssecbf=cmbx12 scaled \magstephalf \font\ssecsc=cmcsc10 scaled \magstep1 \font\sseci=cmmi12 scaled \magstephalf \font\ssecsy=cmsy10 scaled \magstep1 % The smallcaps and symbol fonts should actually be scaled \magstep1.5, % but that is not a standard magnification. % Fonts for title page: \font\titlerm = cmbx12 scaled \magstep3 \let\authorrm = \secrm % In order for the font changes to affect most math symbols and letters, % we have to define the \textfont of the standard families. Since % texinfo doesn't allow for producing subscripts and superscripts, we % don't bother to reset \scriptfont and \scriptscriptfont (which would % also require loading a lot more fonts). % \def\resetmathfonts{% \textfont0 = \tenrm \textfont1 = \teni \textfont2 = \tensy \textfont\itfam = \tenit \textfont\slfam = \tensl \textfont\bffam = \tenbf \textfont\ttfam = \tentt \textfont\sffam = \tensf } % The font-changing commands redefine the meanings of \tenSTYLE, instead % of just \STYLE. We do this so that font changes will continue to work % in math mode, where it is the current \fam that is relevant in most % cases, not the current. Plain TeX does, for example, % \def\bf{\fam=\bffam \tenbf} By redefining \tenbf, we obviate the need % to redefine \bf itself. \def\textfonts{% \let\tenrm=\textrm \let\tenit=\textit \let\tensl=\textsl \let\tenbf=\textbf \let\tentt=\texttt \let\smallcaps=\textsc \let\tensf=\textsf \let\teni=\texti \let\tensy=\textsy \resetmathfonts} \def\chapfonts{% \let\tenrm=\chaprm \let\tenit=\chapit \let\tensl=\chapsl \let\tenbf=\chapbf \let\tentt=\chaptt \let\smallcaps=\chapsc \let\tensf=\chapsf \let\teni=\chapi \let\tensy=\chapsy \resetmathfonts} \def\secfonts{% \let\tenrm=\secrm \let\tenit=\secit \let\tensl=\secsl \let\tenbf=\secbf \let\tentt=\sectt \let\smallcaps=\secsc \let\tensf=\secsf \let\teni=\seci \let\tensy=\secsy \resetmathfonts} \def\subsecfonts{% \let\tenrm=\ssecrm \let\tenit=\ssecit \let\tensl=\ssecsl \let\tenbf=\ssecbf \let\tentt=\ssectt \let\smallcaps=\ssecsc \let\tensf=\ssecsf \let\teni=\sseci \let\tensy=\ssecsy \resetmathfonts} \def\indexfonts{% \let\tenrm=\indrm \let\tenit=\indit \let\tensl=\indsl \let\tenbf=\indbf \let\tentt=\indtt \let\smallcaps=\indsc \let\tensf=\indsf \let\teni=\indi \let\tensy=\indsy \resetmathfonts} % Set up the default fonts, so we can use them for creating boxes. % \textfonts % Count depth in font-changes, for error checks \newcount\fontdepth \fontdepth=0 % Fonts for short table of contents. \font\shortcontrm=cmr12 \font\shortcontbf=cmbx12 \font\shortcontsl=cmsl12 %% Add scribe-like font environments, plus @l for inline lisp (usually sans %% serif) and @ii for TeX italic % \smartitalic{ARG} outputs arg in italics, followed by an italic correction % unless the following character is such as not to need one. \def\smartitalicx{\ifx\next,\else\ifx\next-\else\ifx\next.\else\/\fi\fi\fi} \def\smartitalic#1{{\sl #1}\futurelet\next\smartitalicx} \let\i=\smartitalic \let\var=\smartitalic \let\dfn=\smartitalic \let\emph=\smartitalic \let\cite=\smartitalic \def\b#1{{\bf #1}} \let\strong=\b % We can't just use \exhyphenpenalty, because that only has effect at % the end of a paragraph. Restore normal hyphenation at the end of the % group within which \nohyphenation is presumably called. % \def\nohyphenation{\hyphenchar\font = -1 \aftergroup\restorehyphenation} \def\restorehyphenation{\hyphenchar\font = `- } \def\t#1{% {\tt \nohyphenation \rawbackslash \frenchspacing #1}% \null } \let\ttfont = \t %\def\samp #1{`{\tt \rawbackslash \frenchspacing #1}'\null} \def\samp #1{`\tclose{#1}'\null} \def\key #1{{\tt \nohyphenation \uppercase{#1}}\null} \def\ctrl #1{{\tt \rawbackslash \hat}#1} \let\file=\samp % @code is a modification of @t, % which makes spaces the same size as normal in the surrounding text. \def\tclose#1{% {% % Change normal interword space to be same as for the current font. \spaceskip = \fontdimen2\font % % Switch to typewriter. \tt % % But `\ ' produces the large typewriter interword space. \def\ {{\spaceskip = 0pt{} }}% % % Turn off hyphenation. \nohyphenation % \rawbackslash \frenchspacing #1% }% \null } % We *must* turn on hyphenation at `-' and `_' in \code. % Otherwise, it is too hard to avoid overful hboxes % in the Emacs manual, the Library manual, etc. % Unfortunately, TeX uses one parameter (\hyphenchar) to control % both hyphenation at - and hyphenation within words. % We must therefore turn them both off (\tclose does that) % and arrange explicitly to hyphenate an a dash. % -- rms. { \catcode `\-=\active \catcode `\_=\active \global\def\code{\begingroup \catcode `\-=\active \let-\codedash \let_\codeunder \codex} } \def\codedash{-\discretionary{}{}{}} \def\codeunder{\normalunderscore\discretionary{}{}{}} \def\codex #1{\tclose{#1}\endgroup} %\let\exp=\tclose %Was temporary % @kbd is like @code, except that if the argument is just one @key command, % then @kbd has no effect. \def\xkey{\key} \def\kbdfoo#1#2#3\par{\def\one{#1}\def\three{#3}\def\threex{??}% \ifx\one\xkey\ifx\threex\three \key{#2}% \else\tclose{\look}\fi \else\tclose{\look}\fi} % Typeset a dimension, e.g., `in' or `pt'. The only reason for the % argument is to make the input look right: @dmn{pt} instead of % @dmn{}pt. % \def\dmn#1{\thinspace #1} \def\kbd#1{\def\look{#1}\expandafter\kbdfoo\look??\par} \def\l#1{{\li #1}\null} % \def\r#1{{\rm #1}} % roman font % Use of \lowercase was suggested. \def\sc#1{{\smallcaps#1}} % smallcaps font \def\ii#1{{\it #1}} % italic font \message{page headings,} \newskip\titlepagetopglue \titlepagetopglue = 1.5in \newskip\titlepagebottomglue \titlepagebottomglue = 2pc % First the title page. Must do @settitle before @titlepage. \def\titlefont#1{{\titlerm #1}} \newif\ifseenauthor \newif\iffinishedtitlepage \def\shorttitlepage{\parsearg\shorttitlepagezzz} \def\shorttitlepagezzz #1{\begingroup\hbox{}\vskip 1.5in \chaprm \centerline{#1}% \endgroup\page\hbox{}\page} \def\titlepage{\begingroup \parindent=0pt \textfonts \let\subtitlerm=\tenrm % I deinstalled the following change because \cmr12 is undefined. % This change was not in the ChangeLog anyway. --rms. % \let\subtitlerm=\cmr12 \def\subtitlefont{\subtitlerm \normalbaselineskip = 13pt \normalbaselines}% % \def\authorfont{\authorrm \normalbaselineskip = 16pt \normalbaselines}% % % Leave some space at the very top of the page. \vglue\titlepagetopglue % % Now you can print the title using @title. \def\title{\parsearg\titlezzz}% \def\titlezzz##1{\leftline{\titlefont{##1}} % print a rule at the page bottom also. \finishedtitlepagefalse \vskip4pt \hrule height 4pt width \hsize \vskip4pt}% % No rule at page bottom unless we print one at the top with @title. \finishedtitlepagetrue % % Now you can put text using @subtitle. \def\subtitle{\parsearg\subtitlezzz}% \def\subtitlezzz##1{{\subtitlefont \rightline{##1}}}% % % @author should come last, but may come many times. \def\author{\parsearg\authorzzz}% \def\authorzzz##1{\ifseenauthor\else\vskip 0pt plus 1filll\seenauthortrue\fi {\authorfont \leftline{##1}}}% % % Most title ``pages'' are actually two pages long, with space % at the top of the second. We don't want the ragged left on the second. \let\oldpage = \page \def\page{% \iffinishedtitlepage\else \finishtitlepage \fi \oldpage \let\page = \oldpage \hbox{}}% % \def\page{\oldpage \hbox{}} } \def\Etitlepage{% \iffinishedtitlepage\else \finishtitlepage \fi % It is important to do the page break before ending the group, % because the headline and footline are only empty inside the group. % If we use the new definition of \page, we always get a blank page % after the title page, which we certainly don't want. \oldpage \endgroup \HEADINGSon } \def\finishtitlepage{% \vskip4pt \hrule height 2pt width \hsize \vskip\titlepagebottomglue \finishedtitlepagetrue } %%% Set up page headings and footings. \let\thispage=\folio \newtoks \evenheadline % Token sequence for heading line of even pages \newtoks \oddheadline % Token sequence for heading line of odd pages \newtoks \evenfootline % Token sequence for footing line of even pages \newtoks \oddfootline % Token sequence for footing line of odd pages % Now make Tex use those variables \headline={{\textfonts\rm \ifodd\pageno \the\oddheadline \else \the\evenheadline \fi}} \footline={{\textfonts\rm \ifodd\pageno \the\oddfootline \else \the\evenfootline \fi}\HEADINGShook} \let\HEADINGShook=\relax % Commands to set those variables. % For example, this is what @headings on does % @evenheading @thistitle|@thispage|@thischapter % @oddheading @thischapter|@thispage|@thistitle % @evenfooting @thisfile|| % @oddfooting ||@thisfile \def\evenheading{\parsearg\evenheadingxxx} \def\oddheading{\parsearg\oddheadingxxx} \def\everyheading{\parsearg\everyheadingxxx} \def\evenfooting{\parsearg\evenfootingxxx} \def\oddfooting{\parsearg\oddfootingxxx} \def\everyfooting{\parsearg\everyfootingxxx} {\catcode`\@=0 % \gdef\evenheadingxxx #1{\evenheadingyyy #1@|@|@|@|\finish} \gdef\evenheadingyyy #1@|#2@|#3@|#4\finish{% \global\evenheadline={\rlap{\centerline{#2}}\line{#1\hfil#3}}} \gdef\oddheadingxxx #1{\oddheadingyyy #1@|@|@|@|\finish} \gdef\oddheadingyyy #1@|#2@|#3@|#4\finish{% \global\oddheadline={\rlap{\centerline{#2}}\line{#1\hfil#3}}} \gdef\everyheadingxxx #1{\everyheadingyyy #1@|@|@|@|\finish} \gdef\everyheadingyyy #1@|#2@|#3@|#4\finish{% \global\evenheadline={\rlap{\centerline{#2}}\line{#1\hfil#3}} \global\oddheadline={\rlap{\centerline{#2}}\line{#1\hfil#3}}} \gdef\evenfootingxxx #1{\evenfootingyyy #1@|@|@|@|\finish} \gdef\evenfootingyyy #1@|#2@|#3@|#4\finish{% \global\evenfootline={\rlap{\centerline{#2}}\line{#1\hfil#3}}} \gdef\oddfootingxxx #1{\oddfootingyyy #1@|@|@|@|\finish} \gdef\oddfootingyyy #1@|#2@|#3@|#4\finish{% \global\oddfootline={\rlap{\centerline{#2}}\line{#1\hfil#3}}} \gdef\everyfootingxxx #1{\everyfootingyyy #1@|@|@|@|\finish} \gdef\everyfootingyyy #1@|#2@|#3@|#4\finish{% \global\evenfootline={\rlap{\centerline{#2}}\line{#1\hfil#3}} \global\oddfootline={\rlap{\centerline{#2}}\line{#1\hfil#3}}} % }% unbind the catcode of @. % @headings double turns headings on for double-sided printing. % @headings single turns headings on for single-sided printing. % @headings off turns them off. % @headings on same as @headings double, retained for compatibility. % @headings after turns on double-sided headings after this page. % @headings doubleafter turns on double-sided headings after this page. % @headings singleafter turns on single-sided headings after this page. % By default, they are off. \def\headings #1 {\csname HEADINGS#1\endcsname} \def\HEADINGSoff{ \global\evenheadline={\hfil} \global\evenfootline={\hfil} \global\oddheadline={\hfil} \global\oddfootline={\hfil}} \HEADINGSoff % When we turn headings on, set the page number to 1. % For double-sided printing, put current file name in lower left corner, % chapter name on inside top of right hand pages, document % title on inside top of left hand pages, and page numbers on outside top % edge of all pages. \def\HEADINGSdouble{ %\pagealignmacro \global\pageno=1 \global\evenfootline={\hfil} \global\oddfootline={\hfil} \global\evenheadline={\line{\folio\hfil\thistitle}} \global\oddheadline={\line{\thischapter\hfil\folio}} } % For single-sided printing, chapter title goes across top left of page, % page number on top right. \def\HEADINGSsingle{ %\pagealignmacro \global\pageno=1 \global\evenfootline={\hfil} \global\oddfootline={\hfil} \global\evenheadline={\line{\thischapter\hfil\folio}} \global\oddheadline={\line{\thischapter\hfil\folio}} } \def\HEADINGSon{\HEADINGSdouble} \def\HEADINGSafter{\let\HEADINGShook=\HEADINGSdoublex} \let\HEADINGSdoubleafter=\HEADINGSafter \def\HEADINGSdoublex{% \global\evenfootline={\hfil} \global\oddfootline={\hfil} \global\evenheadline={\line{\folio\hfil\thistitle}} \global\oddheadline={\line{\thischapter\hfil\folio}} } \def\HEADINGSsingleafter{\let\HEADINGShook=\HEADINGSsinglex} \def\HEADINGSsinglex{% \global\evenfootline={\hfil} \global\oddfootline={\hfil} \global\evenheadline={\line{\thischapter\hfil\folio}} \global\oddheadline={\line{\thischapter\hfil\folio}} } % Subroutines used in generating headings % Produces Day Month Year style of output. \def\today{\number\day\space \ifcase\month\or January\or February\or March\or April\or May\or June\or July\or August\or September\or October\or November\or December\fi \space\number\year} % Use this if you want the Month Day, Year style of output. %\def\today{\ifcase\month\or %January\or February\or March\or April\or May\or June\or %July\or August\or September\or October\or November\or December\fi %\space\number\day, \number\year} % @settitle line... specifies the title of the document, for headings % It generates no output of its own \def\thistitle{No Title} \def\settitle{\parsearg\settitlezzz} \def\settitlezzz #1{\gdef\thistitle{#1}} \message{tables,} % @tabs -- simple alignment % These don't work. For one thing, \+ is defined as outer. % So these macros cannot even be defined. %\def\tabs{\parsearg\tabszzz} %\def\tabszzz #1{\settabs\+#1\cr} %\def\tabline{\parsearg\tablinezzz} %\def\tablinezzz #1{\+#1\cr} %\def\&{&} % Tables -- @table, @ftable, @vtable, @item(x), @kitem(x), @xitem(x). % default indentation of table text \newdimen\tableindent \tableindent=.8in % default indentation of @itemize and @enumerate text \newdimen\itemindent \itemindent=.3in % margin between end of table item and start of table text. \newdimen\itemmargin \itemmargin=.1in % used internally for \itemindent minus \itemmargin \newdimen\itemmax % Note @table, @vtable, and @vtable define @item, @itemx, etc., with % these defs. % They also define \itemindex % to index the item name in whatever manner is desired (perhaps none). \newif\ifitemxneedsnegativevskip \def\itemxpar{\par\ifitemxneedsnegativevskip\vskip-\parskip\nobreak\fi} \def\internalBitem{\smallbreak \parsearg\itemzzz} \def\internalBitemx{\itemxpar \parsearg\itemzzz} \def\internalBxitem "#1"{\def\xitemsubtopix{#1} \smallbreak \parsearg\xitemzzz} \def\internalBxitemx "#1"{\def\xitemsubtopix{#1} \itemxpar \parsearg\xitemzzz} \def\internalBkitem{\smallbreak \parsearg\kitemzzz} \def\internalBkitemx{\itemxpar \parsearg\kitemzzz} \def\kitemzzz #1{\dosubind {kw}{\code{#1}}{for {\bf \lastfunction}}% \itemzzz {#1}} \def\xitemzzz #1{\dosubind {kw}{\code{#1}}{for {\bf \xitemsubtopic}}% \itemzzz {#1}} \def\itemzzz #1{\begingroup % \advance\hsize by -\rightskip \advance\hsize by -\tableindent \setbox0=\hbox{\itemfont{#1}}% \itemindex{#1}% \nobreak % This prevents a break before @itemx. % % Be sure we are not still in the middle of a paragraph. %{\parskip = 0in %\par %}% % % If the item text does not fit in the space we have, put it on a line % by itself, and do not allow a page break either before or after that % line. We do not start a paragraph here because then if the next % command is, e.g., @kindex, the whatsit would get put into the % horizontal list on a line by itself, resulting in extra blank space. \ifdim \wd0>\itemmax % % Make this a paragraph so we get the \parskip glue and wrapping, % but leave it ragged-right. \begingroup \advance\leftskip by-\tableindent \advance\hsize by\tableindent \advance\rightskip by0pt plus1fil \leavevmode\unhbox0\par \endgroup % % We're going to be starting a paragraph, but we don't want the % \parskip glue -- logically it's part of the @item we just started. \nobreak \vskip-\parskip % % Stop a page break at the \parskip glue coming up. Unfortunately % we can't prevent a possible page break at the following % \baselineskip glue. \nobreak \endgroup \itemxneedsnegativevskipfalse \else % The item text fits into the space. Start a paragraph, so that the % following text (if any) will end up on the same line. Since that % text will be indented by \tableindent, we make the item text be in % a zero-width box. \noindent \rlap{\hskip -\tableindent\box0}\ignorespaces% \endgroup% \itemxneedsnegativevskiptrue% \fi } \def\item{\errmessage{@item while not in a table}} \def\itemx{\errmessage{@itemx while not in a table}} \def\kitem{\errmessage{@kitem while not in a table}} \def\kitemx{\errmessage{@kitemx while not in a table}} \def\xitem{\errmessage{@xitem while not in a table}} \def\xitemx{\errmessage{@xitemx while not in a table}} %% Contains a kludge to get @end[description] to work \def\description{\tablez{\dontindex}{1}{}{}{}{}} \def\table{\begingroup\inENV\obeylines\obeyspaces\tablex} {\obeylines\obeyspaces% \gdef\tablex #1^^M{% \tabley\dontindex#1 \endtabley}} \def\ftable{\begingroup\inENV\obeylines\obeyspaces\ftablex} {\obeylines\obeyspaces% \gdef\ftablex #1^^M{% \tabley\fnitemindex#1 \endtabley \def\Eftable{\endgraf\afterenvbreak\endgroup}% \let\Etable=\relax}} \def\vtable{\begingroup\inENV\obeylines\obeyspaces\vtablex} {\obeylines\obeyspaces% \gdef\vtablex #1^^M{% \tabley\vritemindex#1 \endtabley \def\Evtable{\endgraf\afterenvbreak\endgroup}% \let\Etable=\relax}} \def\dontindex #1{} \def\fnitemindex #1{\doind {fn}{\code{#1}}}% \def\vritemindex #1{\doind {vr}{\code{#1}}}% {\obeyspaces % \gdef\tabley#1#2 #3 #4 #5 #6 #7\endtabley{\endgroup% \tablez{#1}{#2}{#3}{#4}{#5}{#6}}} \def\tablez #1#2#3#4#5#6{% \aboveenvbreak % \begingroup % \def\Edescription{\Etable}% Neccessary kludge. \let\itemindex=#1% \ifnum 0#3>0 \advance \leftskip by #3\mil \fi % \ifnum 0#4>0 \tableindent=#4\mil \fi % \ifnum 0#5>0 \advance \rightskip by #5\mil \fi % \def\itemfont{#2}% \itemmax=\tableindent % \advance \itemmax by -\itemmargin % \advance \leftskip by \tableindent % \exdentamount=\tableindent \parindent = 0pt \parskip = \smallskipamount \ifdim \parskip=0pt \parskip=2pt \fi% \def\Etable{\endgraf\afterenvbreak\endgroup}% \let\item = \internalBitem % \let\itemx = \internalBitemx % \let\kitem = \internalBkitem % \let\kitemx = \internalBkitemx % \let\xitem = \internalBxitem % \let\xitemx = \internalBxitemx % } % This is the counter used by @enumerate, which is really @itemize \newcount \itemno \def\itemize{\parsearg\itemizezzz} \def\itemizezzz #1{% \begingroup % ended by the @end itemsize \itemizey {#1}{\Eitemize} } \def\itemizey #1#2{% \aboveenvbreak % \itemmax=\itemindent % \advance \itemmax by -\itemmargin % \advance \leftskip by \itemindent % \exdentamount=\itemindent \parindent = 0pt % \parskip = \smallskipamount % \ifdim \parskip=0pt \parskip=2pt \fi% \def#2{\endgraf\afterenvbreak\endgroup}% \def\itemcontents{#1}% \let\item=\itemizeitem} % Set sfcode to normal for the chars that usually have another value. % These are `.?!:;,' \def\frenchspacing{\sfcode46=1000 \sfcode63=1000 \sfcode33=1000 \sfcode58=1000 \sfcode59=1000 \sfcode44=1000 } % \splitoff TOKENS\endmark defines \first to be the first token in % TOKENS, and \rest to be the remainder. % \def\splitoff#1#2\endmark{\def\first{#1}\def\rest{#2}}% % Allow an optional argument of an uppercase letter, lowercase letter, % or number, to specify the first label in the enumerated list. No % argument is the same as `1'. % \def\enumerate{\parsearg\enumeratezzz} \def\enumeratezzz #1{\enumeratey #1 \endenumeratey} \def\enumeratey #1 #2\endenumeratey{% \begingroup % ended by the @end enumerate % % If we were given no argument, pretend we were given `1'. \def\thearg{#1}% \ifx\thearg\empty \def\thearg{1}\fi % % Detect if the argument is a single token. If so, it might be a % letter. Otherwise, the only valid thing it can be is a number. % (We will always have one token, because of the test we just made. % This is a good thing, since \splitoff doesn't work given nothing at % all -- the first parameter is undelimited.) \expandafter\splitoff\thearg\endmark \ifx\rest\empty % Only one token in the argument. It could still be anything. % A ``lowercase letter'' is one whose \lccode is nonzero. % An ``uppercase letter'' is one whose \lccode is both nonzero, and % not equal to itself. % Otherwise, we assume it's a number. % % We need the \relax at the end of the \ifnum lines to stop TeX from % continuing to look for a . % \ifnum\lccode\expandafter`\thearg=0\relax \numericenumerate % a number (we hope) \else % It's a letter. \ifnum\lccode\expandafter`\thearg=\expandafter`\thearg\relax \lowercaseenumerate % lowercase letter \else \uppercaseenumerate % uppercase letter \fi \fi \else % Multiple tokens in the argument. We hope it's a number. \numericenumerate \fi } % An @enumerate whose labels are integers. The starting integer is % given in \thearg. % \def\numericenumerate{% \itemno = \thearg \startenumeration{\the\itemno}% } % The starting (lowercase) letter is in \thearg. \def\lowercaseenumerate{% \itemno = \expandafter`\thearg \startenumeration{% % Be sure we're not beyond the end of the alphabet. \ifnum\itemno=0 \errmessage{No more lowercase letters in @enumerate; get a bigger alphabet}% \fi \char\lccode\itemno }% } % The starting (uppercase) letter is in \thearg. \def\uppercaseenumerate{% \itemno = \expandafter`\thearg \startenumeration{% % Be sure we're not beyond the end of the alphabet. \ifnum\itemno=0 \errmessage{No more uppercase letters in @enumerate; get a bigger alphabet} \fi \char\uccode\itemno }% } % Call itemizey, adding a period to the first argument and supplying the % common last two arguments. Also subtract one from the initial value in % \itemno, since @item increments \itemno. % \def\startenumeration#1{% \advance\itemno by -1 \itemizey{#1.}\Eenumerate\flushcr } % @alphaenumerate and @capsenumerate are abbreviations for giving an arg % to @enumerate. % \def\alphaenumerate{\enumerate{a}} \def\capsenumerate{\enumerate{A}} \def\Ealphaenumerate{\Eenumerate} \def\Ecapsenumerate{\Eenumerate} % Definition of @item while inside @itemize. \def\itemizeitem{% \advance\itemno by 1 {\let\par=\endgraf \smallbreak}% \ifhmode \errmessage{\in hmode at itemizeitem}\fi {\parskip=0in \hskip 0pt \hbox to 0pt{\hss \itemcontents\hskip \itemmargin}% \vadjust{\penalty 1200}}% \flushcr} \message{indexing,} % Index generation facilities % Define \newwrite to be identical to plain tex's \newwrite % except not \outer, so it can be used within \newindex. {\catcode`\@=11 \gdef\newwrite{\alloc@7\write\chardef\sixt@@n}} % \newindex {foo} defines an index named foo. % It automatically defines \fooindex such that % \fooindex ...rest of line... puts an entry in the index foo. % It also defines \fooindfile to be the number of the output channel for % the file that accumulates this index. The file's extension is foo. % The name of an index should be no more than 2 characters long % for the sake of vms. \def\newindex #1{ \expandafter\newwrite \csname#1indfile\endcsname% Define number for output file \openout \csname#1indfile\endcsname \jobname.#1 % Open the file \expandafter\xdef\csname#1index\endcsname{% % Define \xxxindex \noexpand\doindex {#1}} } % @defindex foo == \newindex{foo} \def\defindex{\parsearg\newindex} % Define @defcodeindex, like @defindex except put all entries in @code. \def\newcodeindex #1{ \expandafter\newwrite \csname#1indfile\endcsname% Define number for output file \openout \csname#1indfile\endcsname \jobname.#1 % Open the file \expandafter\xdef\csname#1index\endcsname{% % Define \xxxindex \noexpand\docodeindex {#1}} } \def\defcodeindex{\parsearg\newcodeindex} % @synindex foo bar makes index foo feed into index bar. % Do this instead of @defindex foo if you don't want it as a separate index. \def\synindex #1 #2 {% \expandafter\let\expandafter\synindexfoo\expandafter=\csname#2indfile\endcsname \expandafter\let\csname#1indfile\endcsname=\synindexfoo \expandafter\xdef\csname#1index\endcsname{% % Define \xxxindex \noexpand\doindex {#2}}% } % @syncodeindex foo bar similar, but put all entries made for index foo % inside @code. \def\syncodeindex #1 #2 {% \expandafter\let\expandafter\synindexfoo\expandafter=\csname#2indfile\endcsname \expandafter\let\csname#1indfile\endcsname=\synindexfoo \expandafter\xdef\csname#1index\endcsname{% % Define \xxxindex \noexpand\docodeindex {#2}}% } % Define \doindex, the driver for all \fooindex macros. % Argument #1 is generated by the calling \fooindex macro, % and it is "foo", the name of the index. % \doindex just uses \parsearg; it calls \doind for the actual work. % This is because \doind is more useful to call from other macros. % There is also \dosubind {index}{topic}{subtopic} % which makes an entry in a two-level index such as the operation index. \def\doindex#1{\edef\indexname{#1}\parsearg\singleindexer} \def\singleindexer #1{\doind{\indexname}{#1}} % like the previous two, but they put @code around the argument. \def\docodeindex#1{\edef\indexname{#1}\parsearg\singlecodeindexer} \def\singlecodeindexer #1{\doind{\indexname}{\code{#1}}} \def\indexdummies{% \def\_{{\realbackslash _}}% \def\w{\realbackslash w }% \def\bf{\realbackslash bf }% \def\rm{\realbackslash rm }% \def\sl{\realbackslash sl }% \def\sf{\realbackslash sf}% \def\tt{\realbackslash tt}% \def\gtr{\realbackslash gtr}% \def\less{\realbackslash less}% \def\hat{\realbackslash hat}% \def\char{\realbackslash char}% \def\TeX{\realbackslash TeX}% \def\dots{\realbackslash dots }% \def\copyright{\realbackslash copyright }% \def\tclose##1{\realbackslash tclose {##1}}% \def\code##1{\realbackslash code {##1}}% \def\samp##1{\realbackslash samp {##1}}% \def\t##1{\realbackslash r {##1}}% \def\r##1{\realbackslash r {##1}}% \def\i##1{\realbackslash i {##1}}% \def\b##1{\realbackslash b {##1}}% \def\cite##1{\realbackslash cite {##1}}% \def\key##1{\realbackslash key {##1}}% \def\file##1{\realbackslash file {##1}}% \def\var##1{\realbackslash var {##1}}% \def\kbd##1{\realbackslash kbd {##1}}% \def\dfn##1{\realbackslash dfn {##1}}% \def\emph##1{\realbackslash emph {##1}}% } % \indexnofonts no-ops all font-change commands. % This is used when outputting the strings to sort the index by. \def\indexdummyfont#1{#1} \def\indexdummytex{TeX} \def\indexdummydots{...} \def\indexnofonts{% \let\w=\indexdummyfont \let\t=\indexdummyfont \let\r=\indexdummyfont \let\i=\indexdummyfont \let\b=\indexdummyfont \let\emph=\indexdummyfont \let\strong=\indexdummyfont \let\cite=\indexdummyfont \let\sc=\indexdummyfont %Don't no-op \tt, since it isn't a user-level command % and is used in the definitions of the active chars like <, >, |... %\let\tt=\indexdummyfont \let\tclose=\indexdummyfont \let\code=\indexdummyfont \let\file=\indexdummyfont \let\samp=\indexdummyfont \let\kbd=\indexdummyfont \let\key=\indexdummyfont \let\var=\indexdummyfont \let\TeX=\indexdummytex \let\dots=\indexdummydots } % To define \realbackslash, we must make \ not be an escape. % We must first make another character (@) an escape % so we do not become unable to do a definition. {\catcode`\@=0 \catcode`\\=\other @gdef@realbackslash{\}} \let\indexbackslash=0 %overridden during \printindex. \def\doind #1#2{% {\count10=\lastpenalty % {\indexdummies % Must do this here, since \bf, etc expand at this stage \escapechar=`\\% {\let\folio=0% Expand all macros now EXCEPT \folio \def\rawbackslashxx{\indexbackslash}% \indexbackslash isn't defined now % so it will be output as is; and it will print as backslash in the indx. % % Now process the index-string once, with all font commands turned off, % to get the string to sort the index by. {\indexnofonts \xdef\temp1{#2}% }% % Now produce the complete index entry. We process the index-string again, % this time with font commands expanded, to get what to print in the index. \edef\temp{% \write \csname#1indfile\endcsname{% \realbackslash entry {\temp1}{\folio}{#2}}}% \temp }% }\penalty\count10}} \def\dosubind #1#2#3{% {\count10=\lastpenalty % {\indexdummies % Must do this here, since \bf, etc expand at this stage \escapechar=`\\% {\let\folio=0% \def\rawbackslashxx{\indexbackslash}% % % Now process the index-string once, with all font commands turned off, % to get the string to sort the index by. {\indexnofonts \xdef\temp1{#2 #3}% }% % Now produce the complete index entry. We process the index-string again, % this time with font commands expanded, to get what to print in the index. \edef\temp{% \write \csname#1indfile\endcsname{% \realbackslash entry {\temp1}{\folio}{#2}{#3}}}% \temp }% }\penalty\count10}} % The index entry written in the file actually looks like % \entry {sortstring}{page}{topic} % or % \entry {sortstring}{page}{topic}{subtopic} % The texindex program reads in these files and writes files % containing these kinds of lines: % \initial {c} % before the first topic whose initial is c % \entry {topic}{pagelist} % for a topic that is used without subtopics % \primary {topic} % for the beginning of a topic that is used with subtopics % \secondary {subtopic}{pagelist} % for each subtopic. % Define the user-accessible indexing commands % @findex, @vindex, @kindex, @cindex. \def\findex {\fnindex} \def\kindex {\kyindex} \def\cindex {\cpindex} \def\vindex {\vrindex} \def\tindex {\tpindex} \def\pindex {\pgindex} \def\cindexsub {\begingroup\obeylines\cindexsub} {\obeylines % \gdef\cindexsub "#1" #2^^M{\endgroup % \dosubind{cp}{#2}{#1}}} % Define the macros used in formatting output of the sorted index material. % This is what you call to cause a particular index to get printed. % Write % @unnumbered Function Index % @printindex fn \def\printindex{\parsearg\doprintindex} \def\doprintindex#1{% \tex \dobreak \chapheadingskip {10000} \catcode`\%=\other\catcode`\&=\other\catcode`\#=\other \catcode`\$=\other\catcode`\_=\other \catcode`\~=\other % % The following don't help, since the chars were translated % when the raw index was written, and their fonts were discarded % due to \indexnofonts. %\catcode`\"=\active %\catcode`\^=\active %\catcode`\_=\active %\catcode`\|=\active %\catcode`\<=\active %\catcode`\>=\active % % \def\indexbackslash{\rawbackslashxx} \indexfonts\rm \tolerance=9500 \advance\baselineskip -1pt \begindoublecolumns % % See if the index file exists and is nonempty. \openin 1 \jobname.#1s \ifeof 1 % \enddoublecolumns gets confused if there is no text in the index, % and it loses the chapter title and the aux file entries for the % index. The easiest way to prevent this problem is to make sure % there is some text. (Index is nonexistent) \else % % If the index file exists but is empty, then \openin leaves \ifeof % false. We have to make TeX try to read something from the file, so % it can discover if there is anything in it. \read 1 to \temp \ifeof 1 (Index is empty) \else \input \jobname.#1s \fi \fi \closein 1 \enddoublecolumns \Etex } % These macros are used by the sorted index file itself. % Change them to control the appearance of the index. % Same as \bigskipamount except no shrink. % \balancecolumns gets confused if there is any shrink. \newskip\initialskipamount \initialskipamount 12pt plus4pt \def\initial #1{% {\let\tentt=\sectt \let\tt=\sectt \let\sf=\sectt \ifdim\lastskip<\initialskipamount \removelastskip \penalty-200 \vskip \initialskipamount\fi \line{\secbf#1\hfill}\kern 2pt\penalty10000}} % This typesets a paragraph consisting of #1, dot leaders, and then #2 % flush to the right margin. It is used for index and table of contents % entries. The paragraph is indented by \leftskip. % \def\entry #1#2{\begingroup % % Start a new paragraph if necessary, so our assignments below can't % affect previous text. \par % % Do not fill out the last line with white space. \parfillskip = 0in % % No extra space above this paragraph. \parskip = 0in % % Do not prefer a separate line ending with a hyphen to fewer lines. \finalhyphendemerits = 0 % % \hangindent is only relevant when the entry text and page number % don't both fit on one line. In that case, bob suggests starting the % dots pretty far over on the line. Unfortunately, a large % indentation looks wrong when the entry text itself is broken across % lines. So we use a small indentation and put up with long leaders. % % \hangafter is reset to 1 (which is the value we want) at the start % of each paragraph, so we need not do anything with that. \hangindent=2em % % When the entry text needs to be broken, just fill out the first line % with blank space. \rightskip = 0pt plus1fil % % Start a ``paragraph'' for the index entry so the line breaking % parameters we've set above will have an effect. \noindent % % Insert the text of the index entry. TeX will do line-breaking on it. #1% % If there are no page numbers, don't output a line of dots. \def\tempa{#2} \def\tempb{} \ifx\tempa\tempb\ \else % % If we must, put the page number on a line of its own, and fill out % this line with blank space. (The \hfil is overwhelmed with the % fill leaders glue in \indexdotfill if the page number does fit.) \hfil\penalty50 \null\nobreak\indexdotfill % Have leaders before the page number. % % The `\ ' here is removed by the implicit \unskip that TeX does as % part of (the primitive) \par. Without it, a spurious underfull % \hbox ensues. \ #2% The page number ends the paragraph. \fi% \par \endgroup} % Like \dotfill except takes at least 1 em. \def\indexdotfill{\cleaders \hbox{$\mathsurround=0pt \mkern1.5mu . \mkern1.5mu$}\hskip 1em plus 1fill} \def\primary #1{\line{#1\hfil}} \newskip\secondaryindent \secondaryindent=0.5cm \def\secondary #1#2{ {\parfillskip=0in \parskip=0in \hangindent =1in \hangafter=1 \noindent\hskip\secondaryindent\hbox{#1}\indexdotfill #2\par }} %% Define two-column mode, which is used in indexes. %% Adapted from the TeXbook, page 416. \catcode `\@=11 \newbox\partialpage \newdimen\doublecolumnhsize \def\begindoublecolumns{\begingroup % Grab any single-column material above us. \output = {\global\setbox\partialpage =\vbox{\unvbox255\kern -\topskip \kern \baselineskip}}% \eject % % Now switch to the double-column output routine. \output={\doublecolumnout}% % % Change the page size parameters. We could do this once outside this % routine, in each of @smallbook, @afourpaper, and the default 8.5x11 % format, but then we repeat the same computation. Repeating a couple % of assignments once per index is clearly meaningless for the % execution time, so we may as well do it once. % % First we halve the line length, less a little for the gutter between % the columns. We compute the gutter based on the line length, so it % changes automatically with the paper format. The magic constant % below is chosen so that the gutter has the same value (well, +- < % 1pt) as it did when we hard-coded it. % % We put the result in a separate register, \doublecolumhsize, so we % can restore it in \pagesofar, after \hsize itself has (potentially) % been clobbered. % \doublecolumnhsize = \hsize \advance\doublecolumnhsize by -.04154\hsize \divide\doublecolumnhsize by 2 \hsize = \doublecolumnhsize % % Double the \vsize as well. (We don't need a separate register here, % since nobody clobbers \vsize.) \vsize = 2\vsize \doublecolumnpagegoal } \def\enddoublecolumns{\eject \endgroup \pagegoal=\vsize \unvbox\partialpage} \def\doublecolumnsplit{\splittopskip=\topskip \splitmaxdepth=\maxdepth \global\dimen@=\pageheight \global\advance\dimen@ by-\ht\partialpage \global\setbox1=\vsplit255 to\dimen@ \global\setbox0=\vbox{\unvbox1} \global\setbox3=\vsplit255 to\dimen@ \global\setbox2=\vbox{\unvbox3} \ifdim\ht0>\dimen@ \setbox255=\vbox{\unvbox0\unvbox2} \global\setbox255=\copy5 \fi \ifdim\ht2>\dimen@ \setbox255=\vbox{\unvbox0\unvbox2} \global\setbox255=\copy5 \fi } \def\doublecolumnpagegoal{% \dimen@=\vsize \advance\dimen@ by-2\ht\partialpage \global\pagegoal=\dimen@ } \def\pagesofar{\unvbox\partialpage % \hsize=\doublecolumnhsize % have to restore this since output routine \wd0=\hsize \wd2=\hsize \hbox to\pagewidth{\box0\hfil\box2}} \def\doublecolumnout{% \setbox5=\copy255 {\vbadness=10000 \doublecolumnsplit} \ifvbox255 \setbox0=\vtop to\dimen@{\unvbox0} \setbox2=\vtop to\dimen@{\unvbox2} \onepageout\pagesofar \unvbox255 \penalty\outputpenalty \else \setbox0=\vbox{\unvbox5} \ifvbox0 \dimen@=\ht0 \advance\dimen@ by\topskip \advance\dimen@ by-\baselineskip \divide\dimen@ by2 \splittopskip=\topskip \splitmaxdepth=\maxdepth {\vbadness=10000 \loop \global\setbox5=\copy0 \setbox1=\vsplit5 to\dimen@ \setbox3=\vsplit5 to\dimen@ \ifvbox5 \global\advance\dimen@ by1pt \repeat \setbox0=\vbox to\dimen@{\unvbox1} \setbox2=\vbox to\dimen@{\unvbox3} \global\setbox\partialpage=\vbox{\pagesofar} \doublecolumnpagegoal } \fi \fi } \catcode `\@=\other \message{sectioning,} % Define chapters, sections, etc. \newcount \chapno \newcount \secno \secno=0 \newcount \subsecno \subsecno=0 \newcount \subsubsecno \subsubsecno=0 % This counter is funny since it counts through charcodes of letters A, B, ... \newcount \appendixno \appendixno = `\@ \def\appendixletter{\char\the\appendixno} \newwrite \contentsfile % This is called from \setfilename. \def\opencontents{\openout \contentsfile = \jobname.toc} % Each @chapter defines this as the name of the chapter. % page headings and footings can use it. @section does likewise \def\thischapter{} \def\thissection{} \def\seccheck#1{\if \pageno<0 % \errmessage{@#1 not allowed after generating table of contents}\fi % } \def\chapternofonts{% \let\rawbackslash=\relax% \let\frenchspacing=\relax% \def\result{\realbackslash result} \def\equiv{\realbackslash equiv} \def\expansion{\realbackslash expansion} \def\print{\realbackslash print} \def\TeX{\realbackslash TeX} \def\dots{\realbackslash dots} \def\copyright{\realbackslash copyright} \def\tt{\realbackslash tt} \def\bf{\realbackslash bf } \def\w{\realbackslash w} \def\less{\realbackslash less} \def\gtr{\realbackslash gtr} \def\hat{\realbackslash hat} \def\char{\realbackslash char} \def\tclose##1{\realbackslash tclose {##1}} \def\code##1{\realbackslash code {##1}} \def\samp##1{\realbackslash samp {##1}} \def\r##1{\realbackslash r {##1}} \def\b##1{\realbackslash b {##1}} \def\key##1{\realbackslash key {##1}} \def\file##1{\realbackslash file {##1}} \def\kbd##1{\realbackslash kbd {##1}} % These are redefined because @smartitalic wouldn't work inside xdef. \def\i##1{\realbackslash i {##1}} \def\cite##1{\realbackslash cite {##1}} \def\var##1{\realbackslash var {##1}} \def\emph##1{\realbackslash emph {##1}} \def\dfn##1{\realbackslash dfn {##1}} } \newcount\absseclevel % used to calculate proper heading level \newcount\secbase\secbase=0 % @raise/lowersections modify this count % @raisesections: treat @section as chapter, @subsection as section, etc. \def\raisesections{\global\advance\secbase by -1} \let\up=\raisesections % original BFox name % @lowersections: treat @chapter as section, @section as subsection, etc. \def\lowersections{\global\advance\secbase by 1} \let\down=\lowersections % original BFox name % Choose a numbered-heading macro % #1 is heading level if unmodified by @raisesections or @lowersections % #2 is text for heading \def\numhead#1#2{\absseclevel=\secbase\advance\absseclevel by #1 \ifcase\absseclevel \chapterzzz{#2} \or \seczzz{#2} \or \numberedsubseczzz{#2} \or \numberedsubsubseczzz{#2} \else \ifnum \absseclevel<0 \chapterzzz{#2} \else \numberedsubsubseczzz{#2} \fi \fi } % like \numhead, but chooses appendix heading levels \def\apphead#1#2{\absseclevel=\secbase\advance\absseclevel by #1 \ifcase\absseclevel \appendixzzz{#2} \or \appendixsectionzzz{#2} \or \appendixsubseczzz{#2} \or \appendixsubsubseczzz{#2} \else \ifnum \absseclevel<0 \appendixzzz{#2} \else \appendixsubsubseczzz{#2} \fi \fi } % like \numhead, but chooses numberless heading levels \def\unnmhead#1#2{\absseclevel=\secbase\advance\absseclevel by #1 \ifcase\absseclevel \unnumberedzzz{#2} \or \unnumberedseczzz{#2} \or \unnumberedsubseczzz{#2} \or \unnumberedsubsubseczzz{#2} \else \ifnum \absseclevel<0 \unnumberedzzz{#2} \else \unnumberedsubsubseczzz{#2} \fi \fi } \def\thischaptername{No Chapter Title} \outer\def\chapter{\parsearg\chapteryyy} \def\chapteryyy #1{\numhead0{#1}} % normally numhead0 calls chapterzzz \def\chapterzzz #1{\seccheck{chapter}% \secno=0 \subsecno=0 \subsubsecno=0 \global\advance \chapno by 1 \message{Chapter \the\chapno}% \chapmacro {#1}{\the\chapno}% \gdef\thissection{#1}% \gdef\thischaptername{#1}% % We don't substitute the actual chapter name into \thischapter % because we don't want its macros evaluated now. \xdef\thischapter{Chapter \the\chapno: \noexpand\thischaptername}% {\chapternofonts% \edef\temp{{\realbackslash chapentry {#1}{\the\chapno}{\noexpand\folio}}}% \escapechar=`\\% \write \contentsfile \temp % \donoderef % \global\let\section = \numberedsec \global\let\subsection = \numberedsubsec \global\let\subsubsection = \numberedsubsubsec }} \outer\def\appendix{\parsearg\appendixyyy} \def\appendixyyy #1{\apphead0{#1}} % normally apphead0 calls appendixzzz \def\appendixzzz #1{\seccheck{appendix}% \secno=0 \subsecno=0 \subsubsecno=0 \global\advance \appendixno by 1 \message{Appendix \appendixletter}% \chapmacro {#1}{Appendix \appendixletter}% \gdef\thissection{#1}% \gdef\thischaptername{#1}% \xdef\thischapter{Appendix \appendixletter: \noexpand\thischaptername}% {\chapternofonts% \edef\temp{{\realbackslash chapentry {#1}{Appendix \appendixletter}{\noexpand\folio}}}% \escapechar=`\\% \write \contentsfile \temp % \appendixnoderef % \global\let\section = \appendixsec \global\let\subsection = \appendixsubsec \global\let\subsubsection = \appendixsubsubsec }} \outer\def\top{\parsearg\unnumberedyyy} \outer\def\unnumbered{\parsearg\unnumberedyyy} \def\unnumberedyyy #1{\unnmhead0{#1}} % normally unnmhead0 calls unnumberedzzz \def\unnumberedzzz #1{\seccheck{unnumbered}% \secno=0 \subsecno=0 \subsubsecno=0 % % This used to be simply \message{#1}, but TeX fully expands the % argument to \message. Therefore, if #1 contained @-commands, TeX % expanded them. For example, in `@unnumbered The @cite{Book}', TeX % expanded @cite (which turns out to cause errors because \cite is meant % to be executed, not expanded). % % Anyway, we don't want the fully-expanded definition of @cite to appear % as a result of the \message, we just want `@cite' itself. We use % \the to achieve this: TeX expands \the only once, % simply yielding the contents of the . \toks0 = {#1}\message{(\the\toks0)}% % \unnumbchapmacro {#1}% \gdef\thischapter{#1}\gdef\thissection{#1}% {\chapternofonts% \edef\temp{{\realbackslash unnumbchapentry {#1}{\noexpand\folio}}}% \escapechar=`\\% \write \contentsfile \temp % \unnumbnoderef % \global\let\section = \unnumberedsec \global\let\subsection = \unnumberedsubsec \global\let\subsubsection = \unnumberedsubsubsec }} \outer\def\numberedsec{\parsearg\secyyy} \def\secyyy #1{\numhead1{#1}} % normally calls seczzz \def\seczzz #1{\seccheck{section}% \subsecno=0 \subsubsecno=0 \global\advance \secno by 1 % \gdef\thissection{#1}\secheading {#1}{\the\chapno}{\the\secno}% {\chapternofonts% \edef\temp{{\realbackslash secentry % {#1}{\the\chapno}{\the\secno}{\noexpand\folio}}}% \escapechar=`\\% \write \contentsfile \temp % \donoderef % \penalty 10000 % }} \outer\def\appenixsection{\parsearg\appendixsecyyy} \outer\def\appendixsec{\parsearg\appendixsecyyy} \def\appendixsecyyy #1{\apphead1{#1}} % normally calls appendixsectionzzz \def\appendixsectionzzz #1{\seccheck{appendixsection}% \subsecno=0 \subsubsecno=0 \global\advance \secno by 1 % \gdef\thissection{#1}\secheading {#1}{\appendixletter}{\the\secno}% {\chapternofonts% \edef\temp{{\realbackslash secentry % {#1}{\appendixletter}{\the\secno}{\noexpand\folio}}}% \escapechar=`\\% \write \contentsfile \temp % \appendixnoderef % \penalty 10000 % }} \outer\def\unnumberedsec{\parsearg\unnumberedsecyyy} \def\unnumberedsecyyy #1{\unnmhead1{#1}} % normally calls unnumberedseczzz \def\unnumberedseczzz #1{\seccheck{unnumberedsec}% \plainsecheading {#1}\gdef\thissection{#1}% {\chapternofonts% \edef\temp{{\realbackslash unnumbsecentry{#1}{\noexpand\folio}}}% \escapechar=`\\% \write \contentsfile \temp % \unnumbnoderef % \penalty 10000 % }} \outer\def\numberedsubsec{\parsearg\numberedsubsecyyy} \def\numberedsubsecyyy #1{\numhead2{#1}} % normally calls numberedsubseczzz \def\numberedsubseczzz #1{\seccheck{subsection}% \gdef\thissection{#1}\subsubsecno=0 \global\advance \subsecno by 1 % \subsecheading {#1}{\the\chapno}{\the\secno}{\the\subsecno}% {\chapternofonts% \edef\temp{{\realbackslash subsecentry % {#1}{\the\chapno}{\the\secno}{\the\subsecno}{\noexpand\folio}}}% \escapechar=`\\% \write \contentsfile \temp % \donoderef % \penalty 10000 % }} \outer\def\appendixsubsec{\parsearg\appendixsubsecyyy} \def\appendixsubsecyyy #1{\apphead2{#1}} % normally calls appendixsubseczzz \def\appendixsubseczzz #1{\seccheck{appendixsubsec}% \gdef\thissection{#1}\subsubsecno=0 \global\advance \subsecno by 1 % \subsecheading {#1}{\appendixletter}{\the\secno}{\the\subsecno}% {\chapternofonts% \edef\temp{{\realbackslash subsecentry % {#1}{\appendixletter}{\the\secno}{\the\subsecno}{\noexpand\folio}}}% \escapechar=`\\% \write \contentsfile \temp % \appendixnoderef % \penalty 10000 % }} \outer\def\unnumberedsubsec{\parsearg\unnumberedsubsecyyy} \def\unnumberedsubsecyyy #1{\unnmhead2{#1}} %normally calls unnumberedsubseczzz \def\unnumberedsubseczzz #1{\seccheck{unnumberedsubsec}% \plainsecheading {#1}\gdef\thissection{#1}% {\chapternofonts% \edef\temp{{\realbackslash unnumbsubsecentry{#1}{\noexpand\folio}}}% \escapechar=`\\% \write \contentsfile \temp % \unnumbnoderef % \penalty 10000 % }} \outer\def\numberedsubsubsec{\parsearg\numberedsubsubsecyyy} \def\numberedsubsubsecyyy #1{\numhead3{#1}} % normally numberedsubsubseczzz \def\numberedsubsubseczzz #1{\seccheck{subsubsection}% \gdef\thissection{#1}\global\advance \subsubsecno by 1 % \subsubsecheading {#1} {\the\chapno}{\the\secno}{\the\subsecno}{\the\subsubsecno}% {\chapternofonts% \edef\temp{{\realbackslash subsubsecentry % {#1} {\the\chapno}{\the\secno}{\the\subsecno}{\the\subsubsecno} {\noexpand\folio}}}% \escapechar=`\\% \write \contentsfile \temp % \donoderef % \penalty 10000 % }} \outer\def\appendixsubsubsec{\parsearg\appendixsubsubsecyyy} \def\appendixsubsubsecyyy #1{\apphead3{#1}} % normally appendixsubsubseczzz \def\appendixsubsubseczzz #1{\seccheck{appendixsubsubsec}% \gdef\thissection{#1}\global\advance \subsubsecno by 1 % \subsubsecheading {#1} {\appendixletter}{\the\secno}{\the\subsecno}{\the\subsubsecno}% {\chapternofonts% \edef\temp{{\realbackslash subsubsecentry{#1}% {\appendixletter} {\the\secno}{\the\subsecno}{\the\subsubsecno}{\noexpand\folio}}}% \escapechar=`\\% \write \contentsfile \temp % \appendixnoderef % \penalty 10000 % }} \outer\def\unnumberedsubsubsec{\parsearg\unnumberedsubsubsecyyy} \def\unnumberedsubsubsecyyy #1{\unnmhead3{#1}} %normally unnumberedsubsubseczzz \def\unnumberedsubsubseczzz #1{\seccheck{unnumberedsubsubsec}% \plainsecheading {#1}\gdef\thissection{#1}% {\chapternofonts% \edef\temp{{\realbackslash unnumbsubsubsecentry{#1}{\noexpand\folio}}}% \escapechar=`\\% \write \contentsfile \temp % \unnumbnoderef % \penalty 10000 % }} % These are variants which are not "outer", so they can appear in @ifinfo. % Actually, they should now be obsolete; ordinary section commands should work. \def\infotop{\parsearg\unnumberedzzz} \def\infounnumbered{\parsearg\unnumberedzzz} \def\infounnumberedsec{\parsearg\unnumberedseczzz} \def\infounnumberedsubsec{\parsearg\unnumberedsubseczzz} \def\infounnumberedsubsubsec{\parsearg\unnumberedsubsubseczzz} \def\infoappendix{\parsearg\appendixzzz} \def\infoappendixsec{\parsearg\appendixseczzz} \def\infoappendixsubsec{\parsearg\appendixsubseczzz} \def\infoappendixsubsubsec{\parsearg\appendixsubsubseczzz} \def\infochapter{\parsearg\chapterzzz} \def\infosection{\parsearg\sectionzzz} \def\infosubsection{\parsearg\subsectionzzz} \def\infosubsubsection{\parsearg\subsubsectionzzz} % These macros control what the section commands do, according % to what kind of chapter we are in (ordinary, appendix, or unnumbered). % Define them by default for a numbered chapter. \global\let\section = \numberedsec \global\let\subsection = \numberedsubsec \global\let\subsubsection = \numberedsubsubsec % Define @majorheading, @heading and @subheading % NOTE on use of \vbox for chapter headings, section headings, and % such: % 1) We use \vbox rather than the earlier \line to permit % overlong headings to fold. % 2) \hyphenpenalty is set to 10000 because hyphenation in a % heading is obnoxious; this forbids it. % 3) Likewise, headings look best if no \parindent is used, and % if justification is not attempted. Hence \raggedright. \def\majorheading{\parsearg\majorheadingzzz} \def\majorheadingzzz #1{% {\advance\chapheadingskip by 10pt \chapbreak }% {\chapfonts \vbox{\hyphenpenalty=10000\tolerance=5000 \parindent=0pt\raggedright \rm #1\hfill}}\bigskip \par\penalty 200} \def\chapheading{\parsearg\chapheadingzzz} \def\chapheadingzzz #1{\chapbreak % {\chapfonts \vbox{\hyphenpenalty=10000\tolerance=5000 \parindent=0pt\raggedright \rm #1\hfill}}\bigskip \par\penalty 200} \def\heading{\parsearg\secheadingi} \def\subheading{\parsearg\subsecheadingi} \def\subsubheading{\parsearg\subsubsecheadingi} % These macros generate a chapter, section, etc. heading only % (including whitespace, linebreaking, etc. around it), % given all the information in convenient, parsed form. %%% Args are the skip and penalty (usually negative) \def\dobreak#1#2{\par\ifdim\lastskip<#1\removelastskip\penalty#2\vskip#1\fi} \def\setchapterstyle #1 {\csname CHAPF#1\endcsname} %%% Define plain chapter starts, and page on/off switching for it % Parameter controlling skip before chapter headings (if needed) \newskip \chapheadingskip \chapheadingskip = 30pt plus 8pt minus 4pt \def\chapbreak{\dobreak \chapheadingskip {-4000}} \def\chappager{\par\vfill\supereject} \def\chapoddpage{\chappager \ifodd\pageno \else \hbox to 0pt{} \chappager\fi} \def\setchapternewpage #1 {\csname CHAPPAG#1\endcsname} \def\CHAPPAGoff{ \global\let\pchapsepmacro=\chapbreak \global\let\pagealignmacro=\chappager} \def\CHAPPAGon{ \global\let\pchapsepmacro=\chappager \global\let\pagealignmacro=\chappager \global\def\HEADINGSon{\HEADINGSsingle}} \def\CHAPPAGodd{ \global\let\pchapsepmacro=\chapoddpage \global\let\pagealignmacro=\chapoddpage \global\def\HEADINGSon{\HEADINGSdouble}} \CHAPPAGon \def\CHAPFplain{ \global\let\chapmacro=\chfplain \global\let\unnumbchapmacro=\unnchfplain} \def\chfplain #1#2{% \pchapsepmacro {% \chapfonts \vbox{\hyphenpenalty=10000\tolerance=5000 \parindent=0pt\raggedright \rm #2\enspace #1}% }% \bigskip \penalty5000 } \def\unnchfplain #1{% \pchapsepmacro % {\chapfonts \vbox{\hyphenpenalty=10000\tolerance=5000 \parindent=0pt\raggedright \rm #1\hfill}}\bigskip \par\penalty 10000 % } \CHAPFplain % The default \def\unnchfopen #1{% \chapoddpage {\chapfonts \vbox{\hyphenpenalty=10000\tolerance=5000 \parindent=0pt\raggedright \rm #1\hfill}}\bigskip \par\penalty 10000 % } \def\chfopen #1#2{\chapoddpage {\chapfonts \vbox to 3in{\vfil \hbox to\hsize{\hfil #2} \hbox to\hsize{\hfil #1} \vfil}}% \par\penalty 5000 % } \def\CHAPFopen{ \global\let\chapmacro=\chfopen \global\let\unnumbchapmacro=\unnchfopen} % Parameter controlling skip before section headings. \newskip \subsecheadingskip \subsecheadingskip = 17pt plus 8pt minus 4pt \def\subsecheadingbreak{\dobreak \subsecheadingskip {-500}} \newskip \secheadingskip \secheadingskip = 21pt plus 8pt minus 4pt \def\secheadingbreak{\dobreak \secheadingskip {-1000}} % @paragraphindent is defined for the Info formatting commands only. \let\paragraphindent=\comment % Section fonts are the base font at magstep2, which produces % a size a bit more than 14 points in the default situation. \def\secheading #1#2#3{\secheadingi {#2.#3\enspace #1}} \def\plainsecheading #1{\secheadingi {#1}} \def\secheadingi #1{{\advance \secheadingskip by \parskip % \secheadingbreak}% {\secfonts \vbox{\hyphenpenalty=10000\tolerance=5000 \parindent=0pt\raggedright \rm #1\hfill}}% \ifdim \parskip<10pt \kern 10pt\kern -\parskip\fi \penalty 10000 } % Subsection fonts are the base font at magstep1, % which produces a size of 12 points. \def\subsecheading #1#2#3#4{\subsecheadingi {#2.#3.#4\enspace #1}} \def\subsecheadingi #1{{\advance \subsecheadingskip by \parskip % \subsecheadingbreak}% {\subsecfonts \vbox{\hyphenpenalty=10000\tolerance=5000 \parindent=0pt\raggedright \rm #1\hfill}}% \ifdim \parskip<10pt \kern 10pt\kern -\parskip\fi \penalty 10000 } \def\subsubsecfonts{\subsecfonts} % Maybe this should change: % Perhaps make sssec fonts scaled % magstep half \def\subsubsecheading #1#2#3#4#5{\subsubsecheadingi {#2.#3.#4.#5\enspace #1}} \def\subsubsecheadingi #1{{\advance \subsecheadingskip by \parskip % \subsecheadingbreak}% {\subsubsecfonts \vbox{\hyphenpenalty=10000\tolerance=5000 \parindent=0pt\raggedright \rm #1\hfill}}% \ifdim \parskip<10pt \kern 10pt\kern -\parskip\fi \penalty 10000} \message{toc printing,} % Finish up the main text and prepare to read what we've written % to \contentsfile. \newskip\contentsrightmargin \contentsrightmargin=1in \def\startcontents#1{% \pagealignmacro \immediate\closeout \contentsfile \ifnum \pageno>0 \pageno = -1 % Request roman numbered pages. \fi % Don't need to put `Contents' or `Short Contents' in the headline. % It is abundantly clear what they are. \unnumbchapmacro{#1}\def\thischapter{}% \begingroup % Set up to handle contents files properly. \catcode`\\=0 \catcode`\{=1 \catcode`\}=2 \catcode`\@=11 \raggedbottom % Worry more about breakpoints than the bottom. \advance\hsize by -\contentsrightmargin % Don't use the full line length. } % Normal (long) toc. \outer\def\contents{% \startcontents{Table of Contents}% \input \jobname.toc \endgroup \vfill \eject } % And just the chapters. \outer\def\summarycontents{% \startcontents{Short Contents}% % \let\chapentry = \shortchapentry \let\unnumbchapentry = \shortunnumberedentry % We want a true roman here for the page numbers. \secfonts \let\rm=\shortcontrm \let\bf=\shortcontbf \let\sl=\shortcontsl \rm \advance\baselineskip by 1pt % Open it up a little. \def\secentry ##1##2##3##4{} \def\unnumbsecentry ##1##2{} \def\subsecentry ##1##2##3##4##5{} \def\unnumbsubsecentry ##1##2{} \def\subsubsecentry ##1##2##3##4##5##6{} \def\unnumbsubsubsecentry ##1##2{} \input \jobname.toc \endgroup \vfill \eject } \let\shortcontents = \summarycontents % These macros generate individual entries in the table of contents. % The first argument is the chapter or section name. % The last argument is the page number. % The arguments in between are the chapter number, section number, ... % Chapter-level things, for both the long and short contents. \def\chapentry#1#2#3{\dochapentry{#2\labelspace#1}{#3}} % See comments in \dochapentry re vbox and related settings \def\shortchapentry#1#2#3{% \tocentry{\shortchaplabel{#2}\labelspace #1}{\doshortpageno{#3}}% } % Typeset the label for a chapter or appendix for the short contents. % The arg is, e.g. `Appendix A' for an appendix, or `3' for a chapter. % We could simplify the code here by writing out an \appendixentry % command in the toc file for appendices, instead of using \chapentry % for both, but it doesn't seem worth it. \setbox0 = \hbox{\shortcontrm Appendix } \newdimen\shortappendixwidth \shortappendixwidth = \wd0 \def\shortchaplabel#1{% % We typeset #1 in a box of constant width, regardless of the text of % #1, so the chapter titles will come out aligned. \setbox0 = \hbox{#1}% \dimen0 = \ifdim\wd0 > \shortappendixwidth \shortappendixwidth \else 0pt \fi % % This space should be plenty, since a single number is .5em, and the % widest letter (M) is 1em, at least in the Computer Modern fonts. % (This space doesn't include the extra space that gets added after % the label; that gets put in in \shortchapentry above.) \advance\dimen0 by 1.1em \hbox to \dimen0{#1\hfil}% } \def\unnumbchapentry#1#2{\dochapentry{#1}{#2}} \def\shortunnumberedentry#1#2{\tocentry{#1}{\doshortpageno{#2}}} % Sections. \def\secentry#1#2#3#4{\dosecentry{#2.#3\labelspace#1}{#4}} \def\unnumbsecentry#1#2{\dosecentry{#1}{#2}} % Subsections. \def\subsecentry#1#2#3#4#5{\dosubsecentry{#2.#3.#4\labelspace#1}{#5}} \def\unnumbsubsecentry#1#2{\dosubsecentry{#1}{#2}} % And subsubsections. \def\subsubsecentry#1#2#3#4#5#6{% \dosubsubsecentry{#2.#3.#4.#5\labelspace#1}{#6}} \def\unnumbsubsubsecentry#1#2{\dosubsubsecentry{#1}{#2}} % This parameter controls the indentation of the various levels. \newdimen\tocindent \tocindent = 3pc % Now for the actual typesetting. In all these, #1 is the text and #2 is the % page number. % % If the toc has to be broken over pages, we would want to be at chapters % if at all possible; hence the \penalty. \def\dochapentry#1#2{% \penalty-300 \vskip\baselineskip \begingroup \chapentryfonts \tocentry{#1}{\dopageno{#2}}% \endgroup \nobreak\vskip .25\baselineskip } \def\dosecentry#1#2{\begingroup \secentryfonts \leftskip=\tocindent \tocentry{#1}{\dopageno{#2}}% \endgroup} \def\dosubsecentry#1#2{\begingroup \subsecentryfonts \leftskip=2\tocindent \tocentry{#1}{\dopageno{#2}}% \endgroup} \def\dosubsubsecentry#1#2{\begingroup \subsubsecentryfonts \leftskip=3\tocindent \tocentry{#1}{\dopageno{#2}}% \endgroup} % Final typesetting of a toc entry; we use the same \entry macro as for % the index entries, but we want to suppress hyphenation here. (We % can't do that in the \entry macro, since index entries might consist % of hyphenated-identifiers-that-do-not-fit-on-a-line-and-nothing-else.) % \def\tocentry#1#2{\begingroup \hyphenpenalty = 10000 \entry{#1}{#2}% \endgroup} % Space between chapter (or whatever) number and the title. \def\labelspace{\hskip1em \relax} \def\dopageno#1{{\rm #1}} \def\doshortpageno#1{{\rm #1}} \def\chapentryfonts{\secfonts \rm} \def\secentryfonts{\textfonts} \let\subsecentryfonts = \textfonts \let\subsubsecentryfonts = \textfonts \message{environments,} % Since these characters are used in examples, it should be an even number of % \tt widths. Each \tt character is 1en, so two makes it 1em. % Furthermore, these definitions must come after we define our fonts. \newbox\dblarrowbox \newbox\longdblarrowbox \newbox\pushcharbox \newbox\bullbox \newbox\equivbox \newbox\errorbox \let\ptexequiv = \equiv %{\tentt %\global\setbox\dblarrowbox = \hbox to 1em{\hfil$\Rightarrow$\hfil} %\global\setbox\longdblarrowbox = \hbox to 1em{\hfil$\mapsto$\hfil} %\global\setbox\pushcharbox = \hbox to 1em{\hfil$\dashv$\hfil} %\global\setbox\equivbox = \hbox to 1em{\hfil$\ptexequiv$\hfil} % Adapted from the manmac format (p.420 of TeXbook) %\global\setbox\bullbox = \hbox to 1em{\kern.15em\vrule height .75ex width .85ex % depth .1ex\hfil} %} \def\point{$\star$} \def\result{\leavevmode\raise.15ex\hbox to 1em{\hfil$\Rightarrow$\hfil}} \def\expansion{\leavevmode\raise.1ex\hbox to 1em{\hfil$\mapsto$\hfil}} \def\print{\leavevmode\lower.1ex\hbox to 1em{\hfil$\dashv$\hfil}} \def\equiv{\leavevmode\lower.1ex\hbox to 1em{\hfil$\ptexequiv$\hfil}} % Adapted from the TeXbook's \boxit. {\tentt \global\dimen0 = 3em}% Width of the box. \dimen2 = .55pt % Thickness of rules % The text. (`r' is open on the right, `e' somewhat less so on the left.) \setbox0 = \hbox{\kern-.75pt \tensf error\kern-1.5pt} \global\setbox\errorbox=\hbox to \dimen0{\hfil \hsize = \dimen0 \advance\hsize by -5.8pt % Space to left+right. \advance\hsize by -2\dimen2 % Rules. \vbox{ \hrule height\dimen2 \hbox{\vrule width\dimen2 \kern3pt % Space to left of text. \vtop{\kern2.4pt \box0 \kern2.4pt}% Space above/below. \kern3pt\vrule width\dimen2}% Space to right. \hrule height\dimen2} \hfil} % The @error{} command. \def\error{\leavevmode\lower.7ex\copy\errorbox} % @tex ... @end tex escapes into raw Tex temporarily. % One exception: @ is still an escape character, so that @end tex works. % But \@ or @@ will get a plain tex @ character. \def\tex{\begingroup \catcode `\\=0 \catcode `\{=1 \catcode `\}=2 \catcode `\$=3 \catcode `\&=4 \catcode `\#=6 \catcode `\^=7 \catcode `\_=8 \catcode `\~=13 \let~=\tie \catcode `\%=14 \catcode 43=12 \catcode`\"=12 \catcode`\==12 \catcode`\|=12 \catcode`\<=12 \catcode`\>=12 \escapechar=`\\ % \let\{=\ptexlbrace \let\}=\ptexrbrace \let\.=\ptexdot \let\*=\ptexstar \let\dots=\ptexdots \def\@{@}% \let\bullet=\ptexbullet \let\b=\ptexb \let\c=\ptexc \let\i=\ptexi \let\t=\ptext \let\l=\ptexl \let\L=\ptexL % \let\Etex=\endgroup} % Define @lisp ... @endlisp. % @lisp does a \begingroup so it can rebind things, % including the definition of @endlisp (which normally is erroneous). % Amount to narrow the margins by for @lisp. \newskip\lispnarrowing \lispnarrowing=0.4in % This is the definition that ^^M gets inside @lisp, @example, and other % such environments. \null is better than a space, since it doesn't % have any width. \def\lisppar{\null\endgraf} % Make each space character in the input produce a normal interword % space in the output. Don't allow a line break at this space, as this % is used only in environments like @example, where each line of input % should produce a line of output anyway. % {\obeyspaces % \gdef\sepspaces{\obeyspaces\let =\tie}} % Define \obeyedspace to be our active space, whatever it is. This is % for use in \parsearg. {\sepspaces % \global\let\obeyedspace= } % This space is always present above and below environments. \newskip\envskipamount \envskipamount = 0pt % Make spacing and below environment symmetrical. We use \parskip here % to help in doing that, since in @example-like environments \parskip % is reset to zero; thus the \afterenvbreak inserts no space -- but the % start of the next paragraph will insert \parskip % \def\aboveenvbreak{{\advance\envskipamount by \parskip \endgraf \ifdim\lastskip<\envskipamount \removelastskip \penalty-50 \vskip\envskipamount \fi}} \let\afterenvbreak = \aboveenvbreak % \nonarrowing is a flag. If "set", @lisp etc don't narrow margins. \let\nonarrowing=\relax %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % \cartouche: draw rectangle w/rounded corners around argument \font\circle=lcircle10 \newdimen\circthick \newdimen\cartouter\newdimen\cartinner \newskip\normbskip\newskip\normpskip\newskip\normlskip \circthick=\fontdimen8\circle % \def\ctl{{\circle\char'013\hskip -6pt}}% 6pt from pl file: 1/2charwidth \def\ctr{{\hskip 6pt\circle\char'010}} \def\cbl{{\circle\char'012\hskip -6pt}} \def\cbr{{\hskip 6pt\circle\char'011}} \def\carttop{\hbox to \cartouter{\hskip\lskip \ctl\leaders\hrule height\circthick\hfil\ctr \hskip\rskip}} \def\cartbot{\hbox to \cartouter{\hskip\lskip \cbl\leaders\hrule height\circthick\hfil\cbr \hskip\rskip}} % \newskip\lskip\newskip\rskip \long\def\cartouche{% \begingroup \lskip=\leftskip \rskip=\rightskip \leftskip=0pt\rightskip=0pt %we want these *outside*. \cartinner=\hsize \advance\cartinner by-\lskip \advance\cartinner by-\rskip \cartouter=\hsize \advance\cartouter by 18pt % allow for 3pt kerns on either % side, and for 6pt waste from % each corner char \normbskip=\baselineskip \normpskip=\parskip \normlskip=\lineskip % Flag to tell @lisp, etc., not to narrow margin. \let\nonarrowing=\comment \vbox\bgroup \baselineskip=0pt\parskip=0pt\lineskip=0pt \carttop \hbox\bgroup \hskip\lskip \vrule\kern3pt \vbox\bgroup \hsize=\cartinner \kern3pt \begingroup \baselineskip=\normbskip \lineskip=\normlskip \parskip=\normpskip \vskip -\parskip \def\Ecartouche{% \endgroup \kern3pt \egroup \kern3pt\vrule \hskip\rskip \egroup \cartbot \egroup \endgroup }} % This macro is called at the beginning of all the @example variants, % inside a group. \def\nonfillstart{% \aboveenvbreak \inENV % This group ends at the end of the body \hfuzz = 12pt % Don't be fussy \sepspaces % Make spaces be word-separators rather than space tokens. \singlespace \let\par = \lisppar % don't ignore blank lines \obeylines % each line of input is a line of output \parskip = 0pt \parindent = 0pt \emergencystretch = 0pt % don't try to avoid overfull boxes % @cartouche defines \nonarrowing to inhibit narrowing % at next level down. \ifx\nonarrowing\relax \advance \leftskip by \lispnarrowing \exdentamount=\lispnarrowing \let\exdent=\nofillexdent \let\nonarrowing=\relax \fi } % To ending an @example-like environment, we first end the paragraph % (via \afterenvbreak's vertical glue), and then the group. That way we % keep the zero \parskip that the environments set -- \parskip glue % will be inserted at the beginning of the next paragraph in the % document, after the environment. % \def\nonfillfinish{\afterenvbreak\endgroup}% % This macro is \def\lisp{\begingroup \nonfillstart \let\Elisp = \nonfillfinish \tt \rawbackslash % have \ input char produce \ char from current font \gobble } % Define the \E... control sequence only if we are inside the % environment, so the error checking in \end will work. % % We must call \lisp last in the definition, since it reads the % return following the @example (or whatever) command. % \def\example{\begingroup \def\Eexample{\nonfillfinish\endgroup}\lisp} \def\smallexample{\begingroup \def\Esmallexample{\nonfillfinish\endgroup}\lisp} \def\smalllisp{\begingroup \def\Esmalllisp{\nonfillfinish\endgroup}\lisp} % @smallexample and @smalllisp. This is not used unless the @smallbook % command is given. Originally contributed by Pavel@xerox. % \def\smalllispx{\begingroup \nonfillstart \let\Esmalllisp = \nonfillfinish \let\Esmallexample = \nonfillfinish % % Smaller interline space and fonts for small examples. \baselineskip 10pt \indexfonts \tt \rawbackslash % output the \ character from the current font \gobble } % This is @display; same as @lisp except use roman font. % \def\display{\begingroup \nonfillstart \let\Edisplay = \nonfillfinish \gobble } % This is @format; same as @display except don't narrow margins. % \def\format{\begingroup \let\nonarrowing = t \nonfillstart \let\Eformat = \nonfillfinish \gobble } % @flushleft (same as @format) and @flushright. % \def\flushleft{\begingroup \let\nonarrowing = t \nonfillstart \let\Eflushleft = \nonfillfinish \gobble } \def\flushright{\begingroup \let\nonarrowing = t \nonfillstart \let\Eflushright = \nonfillfinish \advance\leftskip by 0pt plus 1fill \gobble} % @quotation does normal linebreaking and narrows the margins. % \def\quotation{% \begingroup\inENV %This group ends at the end of the @quotation body {\parskip=0pt % because we will skip by \parskip too, later \aboveenvbreak}% \singlespace \parindent=0pt \let\Equotation = \nonfillfinish % @cartouche defines \nonarrowing to inhibit narrowing % at next level down. \ifx\nonarrowing\relax \advance \leftskip by \lispnarrowing \advance \rightskip by \lispnarrowing \exdentamount=\lispnarrowing \let\nonarrowing=\relax \fi} \message{defuns,} % Define formatter for defuns % First, allow user to change definition object font (\df) internally \def\setdeffont #1 {\csname DEF#1\endcsname} \newskip\defbodyindent \defbodyindent=.4in \newskip\defargsindent \defargsindent=50pt \newskip\deftypemargin \deftypemargin=12pt \newskip\deflastargmargin \deflastargmargin=18pt \newcount\parencount % define \functionparens, which makes ( and ) and & do special things. % \functionparens affects the group it is contained in. \def\activeparens{% \catcode`\(=\active \catcode`\)=\active \catcode`\&=\active \catcode`\[=\active \catcode`\]=\active} % Make control sequences which act like normal parenthesis chars. \let\lparen = ( \let\rparen = ) {\activeparens % Now, smart parens don't turn on until &foo (see \amprm) % Be sure that we always have a definition for `(', etc. For example, % if the fn name has parens in it, \boldbrax will not be in effect yet, % so TeX would otherwise complain about undefined control sequence. \global\let(=\lparen \global\let)=\rparen \global\let[=\lbrack \global\let]=\rbrack \gdef\functionparens{\boldbrax\let&=\amprm\parencount=0 } \gdef\boldbrax{\let(=\opnr\let)=\clnr\let[=\lbrb\let]=\rbrb} % Definitions of (, ) and & used in args for functions. % This is the definition of ( outside of all parentheses. \gdef\oprm#1 {{\rm\char`\(}#1 \bf \let(=\opnested % \global\advance\parencount by 1 } % % This is the definition of ( when already inside a level of parens. \gdef\opnested{\char`\(\global\advance\parencount by 1 } % \gdef\clrm{% Print a paren in roman if it is taking us back to depth of 0. % also in that case restore the outer-level definition of (. \ifnum \parencount=1 {\rm \char `\)}\sl \let(=\oprm \else \char `\) \fi \global\advance \parencount by -1 } % If we encounter &foo, then turn on ()-hacking afterwards \gdef\amprm#1 {{\rm\}\let(=\oprm \let)=\clrm\ } % \gdef\normalparens{\boldbrax\let&=\ampnr} } % End of definition inside \activeparens %% These parens (in \boldbrax) actually are a little bolder than the %% contained text. This is especially needed for [ and ] \def\opnr{{\sf\char`\(}} \def\clnr{{\sf\char`\)}} \def\ampnr{\&} \def\lbrb{{\bf\char`\[}} \def\rbrb{{\bf\char`\]}} % First, defname, which formats the header line itself. % #1 should be the function name. % #2 should be the type of definition, such as "Function". \def\defname #1#2{% % Get the values of \leftskip and \rightskip as they were % outside the @def... \dimen2=\leftskip \advance\dimen2 by -\defbodyindent \dimen3=\rightskip \advance\dimen3 by -\defbodyindent \noindent % \setbox0=\hbox{\hskip \deflastargmargin{\rm #2}\hskip \deftypemargin}% \dimen0=\hsize \advance \dimen0 by -\wd0 % compute size for first line \dimen1=\hsize \advance \dimen1 by -\defargsindent %size for continuations \parshape 2 0in \dimen0 \defargsindent \dimen1 % % Now output arg 2 ("Function" or some such) % ending at \deftypemargin from the right margin, % but stuck inside a box of width 0 so it does not interfere with linebreaking {% Adjust \hsize to exclude the ambient margins, % so that \rightline will obey them. \advance \hsize by -\dimen2 \advance \hsize by -\dimen3 \rlap{\rightline{{\rm #2}\hskip \deftypemargin}}}% % Make all lines underfull and no complaints: \tolerance=10000 \hbadness=10000 \advance\leftskip by -\defbodyindent \exdentamount=\defbodyindent {\df #1}\enskip % Generate function name } % Actually process the body of a definition % #1 should be the terminating control sequence, such as \Edefun. % #2 should be the "another name" control sequence, such as \defunx. % #3 should be the control sequence that actually processes the header, % such as \defunheader. \def\defparsebody #1#2#3{\begingroup\inENV% Environment for definitionbody \medbreak % % Define the end token that this defining construct specifies % so that it will exit this group. \def#1{\endgraf\endgroup\medbreak}% \def#2{\begingroup\obeylines\activeparens\spacesplit#3}% \parindent=0in \advance\leftskip by \defbodyindent \advance \rightskip by \defbodyindent \exdentamount=\defbodyindent \begingroup % \catcode 61=\active % 61 is `=' \obeylines\activeparens\spacesplit#3} \def\defmethparsebody #1#2#3#4 {\begingroup\inENV % \medbreak % % Define the end token that this defining construct specifies % so that it will exit this group. \def#1{\endgraf\endgroup\medbreak}% \def#2##1 {\begingroup\obeylines\activeparens\spacesplit{#3{##1}}}% \parindent=0in \advance\leftskip by \defbodyindent \advance \rightskip by \defbodyindent \exdentamount=\defbodyindent \begingroup\obeylines\activeparens\spacesplit{#3{#4}}} \def\defopparsebody #1#2#3#4#5 {\begingroup\inENV % \medbreak % % Define the end token that this defining construct specifies % so that it will exit this group. \def#1{\endgraf\endgroup\medbreak}% \def#2##1 ##2 {\def#4{##1}% \begingroup\obeylines\activeparens\spacesplit{#3{##2}}}% \parindent=0in \advance\leftskip by \defbodyindent \advance \rightskip by \defbodyindent \exdentamount=\defbodyindent \begingroup\obeylines\activeparens\spacesplit{#3{#5}}} % These parsing functions are similar to the preceding ones % except that they do not make parens into active characters. % These are used for "variables" since they have no arguments. \def\defvarparsebody #1#2#3{\begingroup\inENV% Environment for definitionbody \medbreak % % Define the end token that this defining construct specifies % so that it will exit this group. \def#1{\endgraf\endgroup\medbreak}% \def#2{\begingroup\obeylines\spacesplit#3}% \parindent=0in \advance\leftskip by \defbodyindent \advance \rightskip by \defbodyindent \exdentamount=\defbodyindent \begingroup % \catcode 61=\active % \obeylines\spacesplit#3} % This is used for \def{tp,vr}parsebody. It could probably be used for % some of the others, too, with some judicious conditionals. % \def\parsebodycommon#1#2#3{% \begingroup\inENV % \medbreak % % Define the end token that this defining construct specifies % so that it will exit this group. \def#1{\endgraf\endgroup\medbreak}% \def#2##1 {\begingroup\obeylines\spacesplit{#3{##1}}}% \parindent=0in \advance\leftskip by \defbodyindent \advance \rightskip by \defbodyindent \exdentamount=\defbodyindent \begingroup\obeylines } \def\defvrparsebody#1#2#3#4 {% \parsebodycommon{#1}{#2}{#3}% \spacesplit{#3{#4}}% } % This loses on `@deftp {Data Type} {struct termios}' -- it thinks the % type is just `struct', because we lose the braces in `{struct % termios}' when \spacesplit reads its undelimited argument. Sigh. % \let\deftpparsebody=\defvrparsebody % % So, to get around this, we put \empty in with the type name. That % way, TeX won't find exactly `{...}' as an undelimited argument, and % won't strip off the braces. % \def\deftpparsebody #1#2#3#4 {% \parsebodycommon{#1}{#2}{#3}% \spacesplit{\parsetpheaderline{#3{#4}}}\empty } % Fine, but then we have to eventually remove the \empty *and* the % braces (if any). That's what this does, putting the result in \tptemp. % \def\removeemptybraces\empty#1\relax{\def\tptemp{#1}}% % After \spacesplit has done its work, this is called -- #1 is the final % thing to call, #2 the type name (which starts with \empty), and #3 % (which might be empty) the arguments. % \def\parsetpheaderline#1#2#3{% \removeemptybraces#2\relax #1{\tptemp}{#3}% }% \def\defopvarparsebody #1#2#3#4#5 {\begingroup\inENV % \medbreak % % Define the end token that this defining construct specifies % so that it will exit this group. \def#1{\endgraf\endgroup\medbreak}% \def#2##1 ##2 {\def#4{##1}% \begingroup\obeylines\spacesplit{#3{##2}}}% \parindent=0in \advance\leftskip by \defbodyindent \advance \rightskip by \defbodyindent \exdentamount=\defbodyindent \begingroup\obeylines\spacesplit{#3{#5}}} % Split up #2 at the first space token. % call #1 with two arguments: % the first is all of #2 before the space token, % the second is all of #2 after that space token. % If #2 contains no space token, all of it is passed as the first arg % and the second is passed as empty. {\obeylines \gdef\spacesplit#1#2^^M{\endgroup\spacesplitfoo{#1}#2 \relax\spacesplitfoo}% \long\gdef\spacesplitfoo#1#2 #3#4\spacesplitfoo{% \ifx\relax #3% #1{#2}{}\else #1{#2}{#3#4}\fi}} % So much for the things common to all kinds of definitions. % Define @defun. % First, define the processing that is wanted for arguments of \defun % Use this to expand the args and terminate the paragraph they make up \def\defunargs #1{\functionparens \sl % Expand, preventing hyphenation at `-' chars. % Note that groups don't affect changes in \hyphenchar. \hyphenchar\tensl=0 #1% \hyphenchar\tensl=45 \ifnum\parencount=0 \else \errmessage{unbalanced parens in @def arguments}\fi% \interlinepenalty=10000 \advance\rightskip by 0pt plus 1fil \endgraf\penalty 10000\vskip -\parskip\penalty 10000% } \def\deftypefunargs #1{% % Expand, preventing hyphenation at `-' chars. % Note that groups don't affect changes in \hyphenchar. \functionparens \code{#1}% \interlinepenalty=10000 \advance\rightskip by 0pt plus 1fil \endgraf\penalty 10000\vskip -\parskip\penalty 10000% } % Do complete processing of one @defun or @defunx line already parsed. % @deffn Command forward-char nchars \def\deffn{\defmethparsebody\Edeffn\deffnx\deffnheader} \def\deffnheader #1#2#3{\doind {fn}{\code{#2}}% \begingroup\defname {#2}{#1}\defunargs{#3}\endgroup % \catcode 61=\other % Turn off change made in \defparsebody } % @defun == @deffn Function \def\defun{\defparsebody\Edefun\defunx\defunheader} \def\defunheader #1#2{\doind {fn}{\code{#1}}% Make entry in function index \begingroup\defname {#1}{Function}% \defunargs {#2}\endgroup % \catcode 61=\other % Turn off change made in \defparsebody } % @deftypefun int foobar (int @var{foo}, float @var{bar}) \def\deftypefun{\defparsebody\Edeftypefun\deftypefunx\deftypefunheader} % #1 is the data type. #2 is the name and args. \def\deftypefunheader #1#2{\deftypefunheaderx{#1}#2 \relax} % #1 is the data type, #2 the name, #3 the args. \def\deftypefunheaderx #1#2 #3\relax{% \doind {fn}{\code{#2}}% Make entry in function index \begingroup\defname {\code{#1} #2}{Function}% \deftypefunargs {#3}\endgroup % \catcode 61=\other % Turn off change made in \defparsebody } % @deftypefn {Library Function} int foobar (int @var{foo}, float @var{bar}) \def\deftypefn{\defmethparsebody\Edeftypefn\deftypefnx\deftypefnheader} % #1 is the classification. #2 is the data type. #3 is the name and args. \def\deftypefnheader #1#2#3{\deftypefnheaderx{#1}{#2}#3 \relax} % #1 is the classification, #2 the data type, #3 the name, #4 the args. \def\deftypefnheaderx #1#2#3 #4\relax{% \doind {fn}{\code{#3}}% Make entry in function index \begingroup \normalparens % notably, turn off `&' magic, which prevents % at least some C++ text from working \defname {\code{#2} #3}{#1}% \deftypefunargs {#4}\endgroup % \catcode 61=\other % Turn off change made in \defparsebody } % @defmac == @deffn Macro \def\defmac{\defparsebody\Edefmac\defmacx\defmacheader} \def\defmacheader #1#2{\doind {fn}{\code{#1}}% Make entry in function index \begingroup\defname {#1}{Macro}% \defunargs {#2}\endgroup % \catcode 61=\other % Turn off change made in \defparsebody } % @defspec == @deffn Special Form \def\defspec{\defparsebody\Edefspec\defspecx\defspecheader} \def\defspecheader #1#2{\doind {fn}{\code{#1}}% Make entry in function index \begingroup\defname {#1}{Special Form}% \defunargs {#2}\endgroup % \catcode 61=\other % Turn off change made in \defparsebody } % This definition is run if you use @defunx % anywhere other than immediately after a @defun or @defunx. \def\deffnx #1 {\errmessage{@deffnx in invalid context}} \def\defunx #1 {\errmessage{@defunx in invalid context}} \def\defmacx #1 {\errmessage{@defmacx in invalid context}} \def\defspecx #1 {\errmessage{@defspecx in invalid context}} \def\deftypefnx #1 {\errmessage{@deftypefnx in invalid context}} \def\deftypeunx #1 {\errmessage{@deftypeunx in invalid context}} % @defmethod, and so on % @defop {Funny Method} foo-class frobnicate argument \def\defop #1 {\def\defoptype{#1}% \defopparsebody\Edefop\defopx\defopheader\defoptype} \def\defopheader #1#2#3{% \dosubind {fn}{\code{#2}}{on #1}% Make entry in function index \begingroup\defname {#2}{\defoptype{} on #1}% \defunargs {#3}\endgroup % } % @defmethod == @defop Method \def\defmethod{\defmethparsebody\Edefmethod\defmethodx\defmethodheader} \def\defmethodheader #1#2#3{% \dosubind {fn}{\code{#2}}{on #1}% entry in function index \begingroup\defname {#2}{Method on #1}% \defunargs {#3}\endgroup % } % @defcv {Class Option} foo-class foo-flag \def\defcv #1 {\def\defcvtype{#1}% \defopvarparsebody\Edefcv\defcvx\defcvarheader\defcvtype} \def\defcvarheader #1#2#3{% \dosubind {vr}{\code{#2}}{of #1}% Make entry in var index \begingroup\defname {#2}{\defcvtype{} of #1}% \defvarargs {#3}\endgroup % } % @defivar == @defcv {Instance Variable} \def\defivar{\defvrparsebody\Edefivar\defivarx\defivarheader} \def\defivarheader #1#2#3{% \dosubind {vr}{\code{#2}}{of #1}% Make entry in var index \begingroup\defname {#2}{Instance Variable of #1}% \defvarargs {#3}\endgroup % } % These definitions are run if you use @defmethodx, etc., % anywhere other than immediately after a @defmethod, etc. \def\defopx #1 {\errmessage{@defopx in invalid context}} \def\defmethodx #1 {\errmessage{@defmethodx in invalid context}} \def\defcvx #1 {\errmessage{@defcvx in invalid context}} \def\defivarx #1 {\errmessage{@defivarx in invalid context}} % Now @defvar % First, define the processing that is wanted for arguments of @defvar. % This is actually simple: just print them in roman. % This must expand the args and terminate the paragraph they make up \def\defvarargs #1{\normalparens #1% \interlinepenalty=10000 \endgraf\penalty 10000\vskip -\parskip\penalty 10000} % @defvr Counter foo-count \def\defvr{\defvrparsebody\Edefvr\defvrx\defvrheader} \def\defvrheader #1#2#3{\doind {vr}{\code{#2}}% \begingroup\defname {#2}{#1}\defvarargs{#3}\endgroup} % @defvar == @defvr Variable \def\defvar{\defvarparsebody\Edefvar\defvarx\defvarheader} \def\defvarheader #1#2{\doind {vr}{\code{#1}}% Make entry in var index \begingroup\defname {#1}{Variable}% \defvarargs {#2}\endgroup % } % @defopt == @defvr {User Option} \def\defopt{\defvarparsebody\Edefopt\defoptx\defoptheader} \def\defoptheader #1#2{\doind {vr}{\code{#1}}% Make entry in var index \begingroup\defname {#1}{User Option}% \defvarargs {#2}\endgroup % } % @deftypevar int foobar \def\deftypevar{\defvarparsebody\Edeftypevar\deftypevarx\deftypevarheader} % #1 is the data type. #2 is the name. \def\deftypevarheader #1#2{% \doind {vr}{\code{#2}}% Make entry in variables index \begingroup\defname {\code{#1} #2}{Variable}% \interlinepenalty=10000 \endgraf\penalty 10000\vskip -\parskip\penalty 10000 \endgroup} % @deftypevr {Global Flag} int enable \def\deftypevr{\defvrparsebody\Edeftypevr\deftypevrx\deftypevrheader} \def\deftypevrheader #1#2#3{\doind {vr}{\code{#3}}% \begingroup\defname {\code{#2} #3}{#1} \interlinepenalty=10000 \endgraf\penalty 10000\vskip -\parskip\penalty 10000 \endgroup} % This definition is run if you use @defvarx % anywhere other than immediately after a @defvar or @defvarx. \def\defvrx #1 {\errmessage{@defvrx in invalid context}} \def\defvarx #1 {\errmessage{@defvarx in invalid context}} \def\defoptx #1 {\errmessage{@defoptx in invalid context}} \def\deftypevarx #1 {\errmessage{@deftypevarx in invalid context}} \def\deftypevrx #1 {\errmessage{@deftypevrx in invalid context}} % Now define @deftp % Args are printed in bold, a slight difference from @defvar. \def\deftpargs #1{\bf \defvarargs{#1}} % @deftp Class window height width ... \def\deftp{\deftpparsebody\Edeftp\deftpx\deftpheader} \def\deftpheader #1#2#3{\doind {tp}{\code{#2}}% \begingroup\defname {#2}{#1}\deftpargs{#3}\endgroup} % This definition is run if you use @deftpx, etc % anywhere other than immediately after a @deftp, etc. \def\deftpx #1 {\errmessage{@deftpx in invalid context}} \message{cross reference,} % Define cross-reference macros \newwrite \auxfile \newif\ifhavexrefs % True if xref values are known. \newif\ifwarnedxrefs % True if we warned once that they aren't known. % \setref{foo} defines a cross-reference point named foo. \def\setref#1{% \dosetq{#1-title}{Ytitle}% \dosetq{#1-pg}{Ypagenumber}% \dosetq{#1-snt}{Ysectionnumberandtype}} \def\unnumbsetref#1{% \dosetq{#1-title}{Ytitle}% \dosetq{#1-pg}{Ypagenumber}% \dosetq{#1-snt}{Ynothing}} \def\appendixsetref#1{% \dosetq{#1-title}{Ytitle}% \dosetq{#1-pg}{Ypagenumber}% \dosetq{#1-snt}{Yappendixletterandtype}} % \xref, \pxref, and \ref generate cross-references to specified points. % For \xrefX, #1 is the node name, #2 the name of the Info % cross-reference, #3 the printed node name, #4 the name of the Info % file, #5 the name of the printed manual. All but the node name can be % omitted. % \def\pxref#1{see \xrefX[#1,,,,,,,]} \def\xref#1{See \xrefX[#1,,,,,,,]} \def\ref#1{\xrefX[#1,,,,,,,]} \def\xrefX[#1,#2,#3,#4,#5,#6]{\begingroup% \def\printedmanual{\ignorespaces #5}% \def\printednodename{\ignorespaces #3}% % \setbox1=\hbox{\printedmanual}% \setbox0=\hbox{\printednodename}% \ifdim \wd0=0pt% % No printed node name was explicitly given. \ifx SETxref-automatic-section-title % % This line should make the actual chapter or section title appear inside % the square brackets. Use the real section title if we have it. \ifdim \wd1>0pt% % It is in another manual, so we don't have it. \def\printednodename{\ignorespaces #1} \else% % We know the real title if we have the xref values. \ifhavexrefs \def\printednodename{\refx{#1-title}}% % Otherwise just copy the Info node name. \else \def\printednodename{\ignorespaces #1} \fi% \fi\def\printednodename{#1-title}% \else% This line just uses the node name. \def\printednodename{\ignorespaces #1}% \fi% ends \ifx SETxref-automatic-section-title \fi% ends \ifdim \wd0 % % % If we use \unhbox0 and \unhbox1 to print the node names, TeX does % not insert empty discretionaries after hyphens, which means that it % will not find a line break at a hyphen in a node names. Since some % manuals are best written with fairly long node names, containing % hyphens, this is a loss. Therefore, we simply give the text of % the node name again, so it is as if TeX is seeing it for the first % time. \ifdim \wd1>0pt section ``\printednodename'' in \cite{\printedmanual}% \else% \turnoffactive% \refx{#1-snt}{} [\printednodename], page\tie\refx{#1-pg}{}% \fi \endgroup} % \dosetq is the interface for calls from other macros % Use \turnoffactive so that punctuation chars such as underscore % work in node names. \def\dosetq #1#2{{\let\folio=0 \turnoffactive% \edef\next{\write\auxfile{\internalsetq {#1}{#2}}}% \next}} % \internalsetq {foo}{page} expands into % CHARACTERS 'xrdef {foo}{...expansion of \Ypage...} % When the aux file is read, ' is the escape character \def\internalsetq #1#2{'xrdef {#1}{\csname #2\endcsname}} % Things to be expanded by \internalsetq \def\Ypagenumber{\folio} \def\Ytitle{\thissection} \def\Ynothing{} \def\Ysectionnumberandtype{% \ifnum\secno=0 Chapter\xreftie\the\chapno % \else \ifnum \subsecno=0 Section\xreftie\the\chapno.\the\secno % \else \ifnum \subsubsecno=0 % Section\xreftie\the\chapno.\the\secno.\the\subsecno % \else % Section\xreftie\the\chapno.\the\secno.\the\subsecno.\the\subsubsecno % \fi \fi \fi } \def\Yappendixletterandtype{% \ifnum\secno=0 Appendix\xreftie'char\the\appendixno{}% \else \ifnum \subsecno=0 Section\xreftie'char\the\appendixno.\the\secno % \else \ifnum \subsubsecno=0 % Section\xreftie'char\the\appendixno.\the\secno.\the\subsecno % \else % Section\xreftie'char\the\appendixno.\the\secno.\the\subsecno.\the\subsubsecno % \fi \fi \fi } \gdef\xreftie{'tie} % Use TeX 3.0's \inputlineno to get the line number, for better error % messages, but if we're using an old version of TeX, don't do anything. % \ifx\inputlineno\thisisundefined \let\linenumber = \empty % Non-3.0. \else \def\linenumber{\the\inputlineno:\space} \fi % Define \refx{NAME}{SUFFIX} to reference a cross-reference string named NAME. % If its value is nonempty, SUFFIX is output afterward. \def\refx#1#2{% \expandafter\ifx\csname X#1\endcsname\relax % If not defined, say something at least. $\langle$un\-de\-fined$\rangle$% \ifhavexrefs \message{\linenumber Undefined cross reference `#1'.}% \else \ifwarnedxrefs\else \global\warnedxrefstrue \message{Cross reference values unknown; you must run TeX again.}% \fi \fi \else % It's defined, so just use it. \csname X#1\endcsname \fi #2% Output the suffix in any case. } % Read the last existing aux file, if any. No error if none exists. % This is the macro invoked by entries in the aux file. \def\xrdef #1#2{ {\catcode`\'=\other\expandafter \gdef \csname X#1\endcsname {#2}}} \def\readauxfile{% \begingroup \catcode `\^^@=\other \catcode `\=\other \catcode `\=\other \catcode `\^^C=\other \catcode `\^^D=\other \catcode `\^^E=\other \catcode `\^^F=\other \catcode `\^^G=\other \catcode `\^^H=\other \catcode `\ =\other \catcode `\^^L=\other \catcode `\=\other \catcode `\=\other \catcode `\=\other \catcode `\=\other \catcode `\=\other \catcode `\=\other \catcode `\=\other \catcode `\=\other \catcode `\=\other \catcode `\=\other \catcode `\=\other \catcode `\=\other \catcode 26=\other \catcode `\^^[=\other \catcode `\^^\=\other \catcode `\^^]=\other \catcode `\^^^=\other \catcode `\^^_=\other \catcode `\@=\other \catcode `\^=\other \catcode `\~=\other \catcode `\[=\other \catcode `\]=\other \catcode`\"=\other \catcode`\_=\other \catcode`\|=\other \catcode`\<=\other \catcode`\>=\other \catcode `\$=\other \catcode `\#=\other \catcode `\&=\other % `\+ does not work, so use 43. \catcode 43=\other % the aux file uses ' as the escape. % Turn off \ as an escape so we do not lose on % entries which were dumped with control sequences in their names. % For example, 'xrdef {$\leq $-fun}{page ...} made by @defun ^^ % Reference to such entries still does not work the way one would wish, % but at least they do not bomb out when the aux file is read in. \catcode `\{=1 \catcode `\}=2 \catcode `\%=\other \catcode `\'=0 \catcode `\\=\other \openin 1 \jobname.aux \ifeof 1 \else \closein 1 \input \jobname.aux \global\havexrefstrue \global\warnedobstrue \fi % Open the new aux file. Tex will close it automatically at exit. \openout \auxfile=\jobname.aux \endgroup} % Footnotes. \newcount \footnoteno % The trailing space in the following definition for supereject is % vital for proper filling; pages come out unaligned when you do a % pagealignmacro call if that space before the closing brace is % removed. \def\supereject{\par\penalty -20000\footnoteno =0 } % @footnotestyle is meaningful for info output only.. \let\footnotestyle=\comment \let\ptexfootnote=\footnote {\catcode `\@=11 % % Auto-number footnotes. Otherwise like plain. \gdef\footnote{% \global\advance\footnoteno by \@ne \edef\thisfootno{$^{\the\footnoteno}$}% % % In case the footnote comes at the end of a sentence, preserve the % extra spacing after we do the footnote number. \let\@sf\empty \ifhmode\edef\@sf{\spacefactor\the\spacefactor}\/\fi % % Remove inadvertent blank space before typesetting the footnote number. \unskip \thisfootno\@sf \footnotezzz }% % Don't bother with the trickery in plain.tex to not require the % footnote text as a parameter. Our footnotes don't need to be so general. % \long\gdef\footnotezzz#1{\insert\footins{% % We want to typeset this text as a normal paragraph, even if the % footnote reference occurs in (for example) a display environment. % So reset some parameters. \interlinepenalty\interfootnotelinepenalty \splittopskip\ht\strutbox % top baseline for broken footnotes \splitmaxdepth\dp\strutbox \floatingpenalty\@MM \leftskip\z@skip \rightskip\z@skip \spaceskip\z@skip \xspaceskip\z@skip \parindent\defaultparindent % % Hang the footnote text off the number. \hang \textindent{\thisfootno}% % % Don't crash into the line above the footnote text. Since this % expands into a box, it must come within the paragraph, lest it % provide a place where TeX can split the footnote. \footstrut #1\strut}% } }%end \catcode `\@=11 % Set the baselineskip to #1, and the lineskip and strut size % correspondingly. There is no deep meaning behind these magic numbers % used as factors; they just match (closely enough) what Knuth defined. % \def\lineskipfactor{.08333} \def\strutheightpercent{.70833} \def\strutdepthpercent {.29167} % \def\setleading#1{% \normalbaselineskip = #1\relax \normallineskip = \lineskipfactor\normalbaselineskip \normalbaselines \setbox\strutbox =\hbox{% \vrule width0pt height\strutheightpercent\baselineskip depth \strutdepthpercent \baselineskip }% } % @| inserts a changebar to the left of the current line. It should % surround any changed text. This approach does *not* work if the % change spans more than two lines of output. To handle that, we would % have adopt a much more difficult approach (putting marks into the main % vertical list for the beginning and end of each change). % \def\|{% % \vadjust can only be used in horizontal mode. \leavevmode % % Append this vertical mode material after the current line in the output. \vadjust{% % We want to insert a rule with the height and depth of the current % leading; that is exactly what \strutbox is supposed to record. \vskip-\baselineskip % % \vadjust-items are inserted at the left edge of the type. So % the \llap here moves out into the left-hand margin. \llap{% % % For a thicker or thinner bar, change the `1pt'. \vrule height\baselineskip width1pt % % This is the space between the bar and the text. \hskip 12pt }% }% } % For a final copy, take out the rectangles % that mark overfull boxes (in case you have decided % that the text looks ok even though it passes the margin). % \def\finalout{\overfullrule=0pt} % End of control word definitions. \message{and turning on texinfo input format.} \def\openindices{% \newindex{cp}% \newcodeindex{fn}% \newcodeindex{vr}% \newcodeindex{tp}% \newcodeindex{ky}% \newcodeindex{pg}% } % Set some numeric style parameters, for 8.5 x 11 format. %\hsize = 6.5in \newdimen\defaultparindent \defaultparindent = 15pt \parindent = \defaultparindent \parskip 18pt plus 1pt \setleading{15pt} \advance\topskip by 1.2cm % Prevent underfull vbox error messages. \vbadness=10000 % Following George Bush, just get rid of widows and orphans. \widowpenalty=10000 \clubpenalty=10000 % Use TeX 3.0's \emergencystretch to help line breaking, but if we're % using an old version of TeX, don't do anything. We want the amount of % stretch added to depend on the line length, hence the dependence on % \hsize. This makes it come to about 9pt for the 8.5x11 format. % \ifx\emergencystretch\thisisundefined % Allow us to assign to \emergencystretch anyway. \def\emergencystretch{\dimen0}% \else \emergencystretch = \hsize \divide\emergencystretch by 45 \fi % Use @smallbook to reset parameters for 7x9.5 format (or else 7x9.25) \def\smallbook{ % These values for secheadingskip and subsecheadingskip are % experiments. RJC 7 Aug 1992 \global\secheadingskip = 17pt plus 6pt minus 3pt \global\subsecheadingskip = 14pt plus 6pt minus 3pt \global\lispnarrowing = 0.3in \setleading{12pt} \advance\topskip by -1cm \global\parskip 3pt plus 1pt \global\hsize = 5in \global\vsize=7.5in \global\tolerance=700 \global\hfuzz=1pt \global\contentsrightmargin=0pt \global\pagewidth=\hsize \global\pageheight=\vsize \global\let\smalllisp=\smalllispx \global\let\smallexample=\smalllispx \global\def\Esmallexample{\Esmalllisp} } % Use @afourpaper to print on European A4 paper. \def\afourpaper{ \global\tolerance=700 \global\hfuzz=1pt \setleading{12pt} \global\parskip 15pt plus 1pt \global\vsize= 53\baselineskip \advance\vsize by \topskip %\global\hsize= 5.85in % A4 wide 10pt \global\hsize= 6.5in \global\outerhsize=\hsize \global\advance\outerhsize by 0.5in \global\outervsize=\vsize \global\advance\outervsize by 0.6in \global\pagewidth=\hsize \global\pageheight=\vsize } % Define macros to output various characters with catcode for normal text. \catcode`\"=\other \catcode`\~=\other \catcode`\^=\other \catcode`\_=\other \catcode`\|=\other \catcode`\<=\other \catcode`\>=\other \catcode`\+=\other \def\normaldoublequote{"} \def\normaltilde{~} \def\normalcaret{^} \def\normalunderscore{_} \def\normalverticalbar{|} \def\normalless{<} \def\normalgreater{>} \def\normalplus{+} % This macro is used to make a character print one way in ttfont % where it can probably just be output, and another way in other fonts, % where something hairier probably needs to be done. % % #1 is what to print if we are indeed using \tt; #2 is what to print % otherwise. Since all the Computer Modern typewriter fonts have zero % interword stretch (and shrink), and it is reasonable to expect all % typewriter fonts to have this, we can check that font parameter. % \def\ifusingtt#1#2{\ifdim \fontdimen3\the\font=0pt #1\else #2\fi} % Turn off all special characters except @ % (and those which the user can use as if they were ordinary). % Most of these we simply print from the \tt font, but for some, we can % use math or other variants that look better in normal text. \catcode`\"=\active \def\activedoublequote{{\tt \char '042}} \let"=\activedoublequote \catcode`\~=\active \def~{{\tt \char '176}} \chardef\hat=`\^ \catcode`\^=\active \def^{{\tt \hat}} \catcode`\_=\active \def_{\ifusingtt\normalunderscore\_} % Subroutine for the previous macro. \def\_{\lvvmode \kern.06em \vbox{\hrule width.3em height.1ex}} % \lvvmode is equivalent in function to \leavevmode. % Using \leavevmode runs into trouble when written out to % an index file due to the expansion of \leavevmode into ``\unhbox % \voidb@x'' ---which looks to TeX like ``\unhbox \voidb\x'' due to our % magic tricks with @. \def\lvvmode{\vbox to 0pt{}} \catcode`\|=\active \def|{{\tt \char '174}} \chardef \less=`\< \catcode`\<=\active \def<{{\tt \less}} \chardef \gtr=`\> \catcode`\>=\active \def>{{\tt \gtr}} \catcode`\+=\active \def+{{\tt \char 43}} %\catcode 27=\active %\def^^[{$\diamondsuit$} % Used sometimes to turn off (effectively) the active characters % even after parsing them. \def\turnoffactive{\let"=\normaldoublequote \let~=\normaltilde \let^=\normalcaret \let_=\normalunderscore \let|=\normalverticalbar \let<=\normalless \let>=\normalgreater \let+=\normalplus} % Set up an active definition for =, but don't enable it most of the time. {\catcode`\==\active \global\def={{\tt \char 61}}} \catcode`\@=0 % \rawbackslashxx output one backslash character in current font \global\chardef\rawbackslashxx=`\\ %{\catcode`\\=\other %@gdef@rawbackslashxx{\}} % \rawbackslash redefines \ as input to do \rawbackslashxx. {\catcode`\\=\active @gdef@rawbackslash{@let\=@rawbackslashxx }} % \normalbackslash outputs one backslash in fixed width font. \def\normalbackslash{{\tt\rawbackslashxx}} % Say @foo, not \foo, in error messages. \escapechar=`\@ % \catcode 17=0 % Define control-q \catcode`\\=\active % If a .fmt file is being used, we don't want the `\input texinfo' to show up. % That is what \eatinput is for; after that, the `\' should revert to printing % a backslash. % @gdef@eatinput input texinfo{@fixbackslash} @global@let\ = @eatinput % On the other hand, perhaps the file did not have a `\input texinfo'. Then % the first `\{ in the file would cause an error. This macro tries to fix % that, assuming it is called before the first `\' could plausibly occur. % @gdef@fixbackslash{@ifx\@eatinput @let\ = @normalbackslash @fi} %% These look ok in all fonts, so just make them not special. The @rm below %% makes sure that the current font starts out as the newly loaded cmr10 @catcode`@$=@other @catcode`@%=@other @catcode`@&=@other @catcode`@#=@other @textfonts @rm @c Local variables: @c page-delimiter: "^\\\\message" @c End: dibbler-1.0.1/bison++/allocate.cc0000664000175000017500000000302412233256142013371 00000000000000/* Allocate and clear storage for bison, Copyright (C) 1984, 1989 Free Software Foundation, Inc. This file is part of Bison, the GNU Compiler Compiler. Bison 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. Bison 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 Bison; see the file COPYING. If not, write to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ #include extern "C" char *calloc (unsigned,unsigned); extern "C" char *realloc (char*,unsigned); extern void done (int); extern char *program_name; char * xmalloc (unsigned n) { register char *block; /* Avoid uncertainty about what an arg of 0 will do. */ if (n == 0) n = 1; block = calloc (n, 1); if (block == NULL) { fprintf (stderr, "%s: memory exhausted\n", program_name); done (1); } return (block); } char * xrealloc (char* block, unsigned n) { /* Avoid uncertainty about what an arg of 0 will do. */ if (n == 0) n = 1; block = realloc (block, n); if (block == NULL) { fprintf (stderr, "%s: memory exhausted\n", program_name); done (1); } return (block); } dibbler-1.0.1/bison++/bison.info-40000664000175000017500000014146112233256142013436 00000000000000This is bison.info, produced by makeinfo version 4.1 from bison.texinfo. START-INFO-DIR-ENTRY * bison: (bison). GNU Project parser generator (yacc replacement). END-INFO-DIR-ENTRY This file documents the Bison parser generator. Copyright (C) 1988, 89, 90, 91, 92, 93, 95, 98, 1999 Free Software Foundation, Inc. Permission is granted to make and distribute verbatim copies of this manual provided the copyright notice and this permission notice are preserved on all copies. Permission is granted to copy and distribute modified versions of this manual under the conditions for verbatim copying, provided also that the sections entitled "GNU General Public License" and "Conditions for Using Bison" are included exactly as in the original, and provided that the entire resulting derived work is distributed under the terms of a permission notice identical to this one. Permission is granted to copy and distribute translations of this manual into another language, under the above conditions for modified versions, except that the sections entitled "GNU General Public License", "Conditions for Using Bison" and this permission notice may be included in translations approved by the Free Software Foundation instead of in the original English.  File: bison.info, Node: How Precedence, Prev: Precedence Examples, Up: Precedence How Precedence Works -------------------- The first effect of the precedence declarations is to assign precedence levels to the terminal symbols declared. The second effect is to assign precedence levels to certain rules: each rule gets its precedence from the last terminal symbol mentioned in the components. (You can also specify explicitly the precedence of a rule. *Note Context-Dependent Precedence: Contextual Precedence.) Finally, the resolution of conflicts works by comparing the precedence of the rule being considered with that of the look-ahead token. If the token's precedence is higher, the choice is to shift. If the rule's precedence is higher, the choice is to reduce. If they have equal precedence, the choice is made based on the associativity of that precedence level. The verbose output file made by `-v' (*note Invoking Bison: Invocation.) says how each conflict was resolved. Not all rules and not all tokens have precedence. If either the rule or the look-ahead token has no precedence, then the default is to shift.  File: bison.info, Node: Contextual Precedence, Next: Parser States, Prev: Precedence, Up: Algorithm Context-Dependent Precedence ============================ Often the precedence of an operator depends on the context. This sounds outlandish at first, but it is really very common. For example, a minus sign typically has a very high precedence as a unary operator, and a somewhat lower precedence (lower than multiplication) as a binary operator. The Bison precedence declarations, `%left', `%right' and `%nonassoc', can only be used once for a given token; so a token has only one precedence declared in this way. For context-dependent precedence, you need to use an additional mechanism: the `%prec' modifier for rules. The `%prec' modifier declares the precedence of a particular rule by specifying a terminal symbol whose precedence should be used for that rule. It's not necessary for that symbol to appear otherwise in the rule. The modifier's syntax is: %prec TERMINAL-SYMBOL and it is written after the components of the rule. Its effect is to assign the rule the precedence of TERMINAL-SYMBOL, overriding the precedence that would be deduced for it in the ordinary way. The altered rule precedence then affects how conflicts involving that rule are resolved (*note Operator Precedence: Precedence.). Here is how `%prec' solves the problem of unary minus. First, declare a precedence for a fictitious terminal symbol named `UMINUS'. There are no tokens of this type, but the symbol serves to stand for its precedence: ... %left '+' '-' %left '*' %left UMINUS Now the precedence of `UMINUS' can be used in specific rules: exp: ... | exp '-' exp ... | '-' exp %prec UMINUS  File: bison.info, Node: Parser States, Next: Reduce/Reduce, Prev: Contextual Precedence, Up: Algorithm Parser States ============= The function `yyparse' is implemented using a finite-state machine. The values pushed on the parser stack are not simply token type codes; they represent the entire sequence of terminal and nonterminal symbols at or near the top of the stack. The current state collects all the information about previous input which is relevant to deciding what to do next. Each time a look-ahead token is read, the current parser state together with the type of look-ahead token are looked up in a table. This table entry can say, "Shift the look-ahead token." In this case, it also specifies the new parser state, which is pushed onto the top of the parser stack. Or it can say, "Reduce using rule number N." This means that a certain number of tokens or groupings are taken off the top of the stack, and replaced by one grouping. In other words, that number of states are popped from the stack, and one new state is pushed. There is one other alternative: the table can say that the look-ahead token is erroneous in the current state. This causes error processing to begin (*note Error Recovery::).  File: bison.info, Node: Reduce/Reduce, Next: Mystery Conflicts, Prev: Parser States, Up: Algorithm Reduce/Reduce Conflicts ======================= A reduce/reduce conflict occurs if there are two or more rules that apply to the same sequence of input. This usually indicates a serious error in the grammar. For example, here is an erroneous attempt to define a sequence of zero or more `word' groupings. sequence: /* empty */ { printf ("empty sequence\n"); } | maybeword | sequence word { printf ("added word %s\n", $2); } ; maybeword: /* empty */ { printf ("empty maybeword\n"); } | word { printf ("single word %s\n", $1); } ; The error is an ambiguity: there is more than one way to parse a single `word' into a `sequence'. It could be reduced to a `maybeword' and then into a `sequence' via the second rule. Alternatively, nothing-at-all could be reduced into a `sequence' via the first rule, and this could be combined with the `word' using the third rule for `sequence'. There is also more than one way to reduce nothing-at-all into a `sequence'. This can be done directly via the first rule, or indirectly via `maybeword' and then the second rule. You might think that this is a distinction without a difference, because it does not change whether any particular input is valid or not. But it does affect which actions are run. One parsing order runs the second rule's action; the other runs the first rule's action and the third rule's action. In this example, the output of the program changes. Bison resolves a reduce/reduce conflict by choosing to use the rule that appears first in the grammar, but it is very risky to rely on this. Every reduce/reduce conflict must be studied and usually eliminated. Here is the proper way to define `sequence': sequence: /* empty */ { printf ("empty sequence\n"); } | sequence word { printf ("added word %s\n", $2); } ; Here is another common error that yields a reduce/reduce conflict: sequence: /* empty */ | sequence words | sequence redirects ; words: /* empty */ | words word ; redirects:/* empty */ | redirects redirect ; The intention here is to define a sequence which can contain either `word' or `redirect' groupings. The individual definitions of `sequence', `words' and `redirects' are error-free, but the three together make a subtle ambiguity: even an empty input can be parsed in infinitely many ways! Consider: nothing-at-all could be a `words'. Or it could be two `words' in a row, or three, or any number. It could equally well be a `redirects', or two, or any number. Or it could be a `words' followed by three `redirects' and another `words'. And so on. Here are two ways to correct these rules. First, to make it a single level of sequence: sequence: /* empty */ | sequence word | sequence redirect ; Second, to prevent either a `words' or a `redirects' from being empty: sequence: /* empty */ | sequence words | sequence redirects ; words: word | words word ; redirects:redirect | redirects redirect ;  File: bison.info, Node: Mystery Conflicts, Next: Stack Overflow, Prev: Reduce/Reduce, Up: Algorithm Mysterious Reduce/Reduce Conflicts ================================== Sometimes reduce/reduce conflicts can occur that don't look warranted. Here is an example: %token ID %% def: param_spec return_spec ',' ; param_spec: type | name_list ':' type ; return_spec: type | name ':' type ; type: ID ; name: ID ; name_list: name | name ',' name_list ; It would seem that this grammar can be parsed with only a single token of look-ahead: when a `param_spec' is being read, an `ID' is a `name' if a comma or colon follows, or a `type' if another `ID' follows. In other words, this grammar is LR(1). However, Bison, like most parser generators, cannot actually handle all LR(1) grammars. In this grammar, two contexts, that after an `ID' at the beginning of a `param_spec' and likewise at the beginning of a `return_spec', are similar enough that Bison assumes they are the same. They appear similar because the same set of rules would be active--the rule for reducing to a `name' and that for reducing to a `type'. Bison is unable to determine at that stage of processing that the rules would require different look-ahead tokens in the two contexts, so it makes a single parser state for them both. Combining the two contexts causes a conflict later. In parser terminology, this occurrence means that the grammar is not LALR(1). In general, it is better to fix deficiencies than to document them. But this particular deficiency is intrinsically hard to fix; parser generators that can handle LR(1) grammars are hard to write and tend to produce parsers that are very large. In practice, Bison is more useful as it is now. When the problem arises, you can often fix it by identifying the two parser states that are being confused, and adding something to make them look distinct. In the above example, adding one rule to `return_spec' as follows makes the problem go away: %token BOGUS ... %% ... return_spec: type | name ':' type /* This rule is never used. */ | ID BOGUS ; This corrects the problem because it introduces the possibility of an additional active rule in the context after the `ID' at the beginning of `return_spec'. This rule is not active in the corresponding context in a `param_spec', so the two contexts receive distinct parser states. As long as the token `BOGUS' is never generated by `yylex', the added rule cannot alter the way actual input is parsed. In this particular example, there is another way to solve the problem: rewrite the rule for `return_spec' to use `ID' directly instead of via `name'. This also causes the two confusing contexts to have different sets of active rules, because the one for `return_spec' activates the altered rule for `return_spec' rather than the one for `name'. param_spec: type | name_list ':' type ; return_spec: type | ID ':' type ;  File: bison.info, Node: Stack Overflow, Prev: Mystery Conflicts, Up: Algorithm Stack Overflow, and How to Avoid It =================================== The Bison parser stack can overflow if too many tokens are shifted and not reduced. When this happens, the parser function `yyparse' returns a nonzero value, pausing only to call `yyerror' to report the overflow. By defining the macro `YYMAXDEPTH', you can control how deep the parser stack can become before a stack overflow occurs. Define the macro with a value that is an integer. This value is the maximum number of tokens that can be shifted (and not reduced) before overflow. It must be a constant expression whose value is known at compile time. The stack space allowed is not necessarily allocated. If you specify a large value for `YYMAXDEPTH', the parser actually allocates a small stack at first, and then makes it bigger by stages as needed. This increasing allocation happens automatically and silently. Therefore, you do not need to make `YYMAXDEPTH' painfully small merely to save space for ordinary inputs that do not need much stack. The default value of `YYMAXDEPTH', if you do not define it, is 10000. You can control how much stack is allocated initially by defining the macro `YYINITDEPTH'. This value too must be a compile-time constant integer. The default is 200.  File: bison.info, Node: Error Recovery, Next: Context Dependency, Prev: Algorithm, Up: Top Error Recovery ************** It is not usually acceptable to have a program terminate on a parse error. For example, a compiler should recover sufficiently to parse the rest of the input file and check it for errors; a calculator should accept another expression. In a simple interactive command parser where each input is one line, it may be sufficient to allow `yyparse' to return 1 on error and have the caller ignore the rest of the input line when that happens (and then call `yyparse' again). But this is inadequate for a compiler, because it forgets all the syntactic context leading up to the error. A syntax error deep within a function in the compiler input should not cause the compiler to treat the following line like the beginning of a source file. You can define how to recover from a syntax error by writing rules to recognize the special token `error'. This is a terminal symbol that is always defined (you need not declare it) and reserved for error handling. The Bison parser generates an `error' token whenever a syntax error happens; if you have provided a rule to recognize this token in the current context, the parse can continue. For example: stmnts: /* empty string */ | stmnts '\n' | stmnts exp '\n' | stmnts error '\n' The fourth rule in this example says that an error followed by a newline makes a valid addition to any `stmnts'. What happens if a syntax error occurs in the middle of an `exp'? The error recovery rule, interpreted strictly, applies to the precise sequence of a `stmnts', an `error' and a newline. If an error occurs in the middle of an `exp', there will probably be some additional tokens and subexpressions on the stack after the last `stmnts', and there will be tokens to read before the next newline. So the rule is not applicable in the ordinary way. But Bison can force the situation to fit the rule, by discarding part of the semantic context and part of the input. First it discards states and objects from the stack until it gets back to a state in which the `error' token is acceptable. (This means that the subexpressions already parsed are discarded, back to the last complete `stmnts'.) At this point the `error' token can be shifted. Then, if the old look-ahead token is not acceptable to be shifted next, the parser reads tokens and discards them until it finds a token which is acceptable. In this example, Bison reads and discards input until the next newline so that the fourth rule can apply. The choice of error rules in the grammar is a choice of strategies for error recovery. A simple and useful strategy is simply to skip the rest of the current input line or current statement if an error is detected: stmnt: error ';' /* on error, skip until ';' is read */ It is also useful to recover to the matching close-delimiter of an opening-delimiter that has already been parsed. Otherwise the close-delimiter will probably appear to be unmatched, and generate another, spurious error message: primary: '(' expr ')' | '(' error ')' ... ; Error recovery strategies are necessarily guesses. When they guess wrong, one syntax error often leads to another. In the above example, the error recovery rule guesses that an error is due to bad input within one `stmnt'. Suppose that instead a spurious semicolon is inserted in the middle of a valid `stmnt'. After the error recovery rule recovers from the first error, another syntax error will be found straightaway, since the text following the spurious semicolon is also an invalid `stmnt'. To prevent an outpouring of error messages, the parser will output no error message for another syntax error that happens shortly after the first; only after three consecutive input tokens have been successfully shifted will error messages resume. Note that rules which accept the `error' token may have actions, just as any other rules can. You can make error messages resume immediately by using the macro `yyerrok' in an action. If you do this in the error rule's action, no error messages will be suppressed. This macro requires no arguments; `yyerrok;' is a valid C statement. The previous look-ahead token is reanalyzed immediately after an error. If this is unacceptable, then the macro `yyclearin' may be used to clear this token. Write the statement `yyclearin;' in the error rule's action. For example, suppose that on a parse error, an error handling routine is called that advances the input stream to some point where parsing should once again commence. The next symbol returned by the lexical scanner is probably correct. The previous look-ahead token ought to be discarded with `yyclearin;'. The macro `YYRECOVERING' stands for an expression that has the value 1 when the parser is recovering from a syntax error, and 0 the rest of the time. A value of 1 indicates that error messages are currently suppressed for new syntax errors.  File: bison.info, Node: Context Dependency, Next: Debugging, Prev: Error Recovery, Up: Top Handling Context Dependencies ***************************** The Bison paradigm is to parse tokens first, then group them into larger syntactic units. In many languages, the meaning of a token is affected by its context. Although this violates the Bison paradigm, certain techniques (known as "kludges") may enable you to write Bison parsers for such languages. * Menu: * Semantic Tokens:: Token parsing can depend on the semantic context. * Lexical Tie-ins:: Token parsing can depend on the syntactic context. * Tie-in Recovery:: Lexical tie-ins have implications for how error recovery rules must be written. (Actually, "kludge" means any technique that gets its job done but is neither clean nor robust.)  File: bison.info, Node: Semantic Tokens, Next: Lexical Tie-ins, Up: Context Dependency Semantic Info in Token Types ============================ The C language has a context dependency: the way an identifier is used depends on what its current meaning is. For example, consider this: foo (x); This looks like a function call statement, but if `foo' is a typedef name, then this is actually a declaration of `x'. How can a Bison parser for C decide how to parse this input? The method used in GNU C is to have two different token types, `IDENTIFIER' and `TYPENAME'. When `yylex' finds an identifier, it looks up the current declaration of the identifier in order to decide which token type to return: `TYPENAME' if the identifier is declared as a typedef, `IDENTIFIER' otherwise. The grammar rules can then express the context dependency by the choice of token type to recognize. `IDENTIFIER' is accepted as an expression, but `TYPENAME' is not. `TYPENAME' can start a declaration, but `IDENTIFIER' cannot. In contexts where the meaning of the identifier is _not_ significant, such as in declarations that can shadow a typedef name, either `TYPENAME' or `IDENTIFIER' is accepted--there is one rule for each of the two token types. This technique is simple to use if the decision of which kinds of identifiers to allow is made at a place close to where the identifier is parsed. But in C this is not always so: C allows a declaration to redeclare a typedef name provided an explicit type has been specified earlier: typedef int foo, bar, lose; static foo (bar); /* redeclare `bar' as static variable */ static int foo (lose); /* redeclare `foo' as function */ Unfortunately, the name being declared is separated from the declaration construct itself by a complicated syntactic structure--the "declarator". As a result, the part of Bison parser for C needs to be duplicated, with all the nonterminal names changed: once for parsing a declaration in which a typedef name can be redefined, and once for parsing a declaration in which that can't be done. Here is a part of the duplication, with actions omitted for brevity: initdcl: declarator maybeasm '=' init | declarator maybeasm ; notype_initdcl: notype_declarator maybeasm '=' init | notype_declarator maybeasm ; Here `initdcl' can redeclare a typedef name, but `notype_initdcl' cannot. The distinction between `declarator' and `notype_declarator' is the same sort of thing. There is some similarity between this technique and a lexical tie-in (described next), in that information which alters the lexical analysis is changed during parsing by other parts of the program. The difference is here the information is global, and is used for other purposes in the program. A true lexical tie-in has a special-purpose flag controlled by the syntactic context.  File: bison.info, Node: Lexical Tie-ins, Next: Tie-in Recovery, Prev: Semantic Tokens, Up: Context Dependency Lexical Tie-ins =============== One way to handle context-dependency is the "lexical tie-in": a flag which is set by Bison actions, whose purpose is to alter the way tokens are parsed. For example, suppose we have a language vaguely like C, but with a special construct `hex (HEX-EXPR)'. After the keyword `hex' comes an expression in parentheses in which all integers are hexadecimal. In particular, the token `a1b' must be treated as an integer rather than as an identifier if it appears in that context. Here is how you can do it: %{ int hexflag; %} %% ... expr: IDENTIFIER | constant | HEX '(' { hexflag = 1; } expr ')' { hexflag = 0; $$ = $4; } | expr '+' expr { $$ = make_sum ($1, $3); } ... ; constant: INTEGER | STRING ; Here we assume that `yylex' looks at the value of `hexflag'; when it is nonzero, all integers are parsed in hexadecimal, and tokens starting with letters are parsed as integers if possible. The declaration of `hexflag' shown in the C declarations section of the parser file is needed to make it accessible to the actions (*note The C Declarations Section: C Declarations.). You must also write the code in `yylex' to obey the flag.  File: bison.info, Node: Tie-in Recovery, Prev: Lexical Tie-ins, Up: Context Dependency Lexical Tie-ins and Error Recovery ================================== Lexical tie-ins make strict demands on any error recovery rules you have. *Note Error Recovery::. The reason for this is that the purpose of an error recovery rule is to abort the parsing of one construct and resume in some larger construct. For example, in C-like languages, a typical error recovery rule is to skip tokens until the next semicolon, and then start a new statement, like this: stmt: expr ';' | IF '(' expr ')' stmt { ... } ... error ';' { hexflag = 0; } ; If there is a syntax error in the middle of a `hex (EXPR)' construct, this error rule will apply, and then the action for the completed `hex (EXPR)' will never run. So `hexflag' would remain set for the entire rest of the input, or until the next `hex' keyword, causing identifiers to be misinterpreted as integers. To avoid this problem the error recovery rule itself clears `hexflag'. There may also be an error recovery rule that works within expressions. For example, there could be a rule which applies within parentheses and skips to the close-parenthesis: expr: ... | '(' expr ')' { $$ = $2; } | '(' error ')' ... If this rule acts within the `hex' construct, it is not going to abort that construct (since it applies to an inner level of parentheses within the construct). Therefore, it should not clear the flag: the rest of the `hex' construct should be parsed with the flag still in effect. What if there is an error recovery rule which might abort out of the `hex' construct or might not, depending on circumstances? There is no way you can write the action to determine whether a `hex' construct is being aborted or not. So if you are using a lexical tie-in, you had better make sure your error recovery rules are not of this kind. Each rule must be such that you can be sure that it always will, or always won't, have to clear the flag.  File: bison.info, Node: Debugging, Next: Invocation, Prev: Context Dependency, Up: Top Debugging Your Parser ********************* If a Bison grammar compiles properly but doesn't do what you want when it runs, the `yydebug' parser-trace feature can help you figure out why. To enable compilation of trace facilities, you must define the macro `YYDEBUG' when you compile the parser. You could use `-DYYDEBUG=1' as a compiler option or you could put `#define YYDEBUG 1' in the C declarations section of the grammar file (*note The C Declarations Section: C Declarations.). Alternatively, use the `-t' option when you run Bison (*note Invoking Bison: Invocation.). We always define `YYDEBUG' so that debugging is always possible. The trace facility uses `stderr', so you must add `#include ' to the C declarations section unless it is already there. Once you have compiled the program with trace facilities, the way to request a trace is to store a nonzero value in the variable `yydebug'. You can do this by making the C code do it (in `main', perhaps), or you can alter the value with a C debugger. Each step taken by the parser when `yydebug' is nonzero produces a line or two of trace information, written on `stderr'. The trace messages tell you these things: * Each time the parser calls `yylex', what kind of token was read. * Each time a token is shifted, the depth and complete contents of the state stack (*note Parser States::). * Each time a rule is reduced, which rule it is, and the complete contents of the state stack afterward. To make sense of this information, it helps to refer to the listing file produced by the Bison `-v' option (*note Invoking Bison: Invocation.). This file shows the meaning of each state in terms of positions in various rules, and also what each state will do with each possible input token. As you read the successive trace messages, you can see that the parser is functioning according to its specification in the listing file. Eventually you will arrive at the place where something undesirable happens, and you will see which parts of the grammar are to blame. The parser file is a C program and you can use C debuggers on it, but it's not easy to interpret what it is doing. The parser function is a finite-state machine interpreter, and aside from the actions it executes the same code over and over. Only the values of variables show where in the grammar it is working. The debugging information normally gives the token type of each token read, but not its semantic value. You can optionally define a macro named `YYPRINT' to provide a way to print the value. If you define `YYPRINT', it should take three arguments. The parser will pass a standard I/O stream, the numeric code for the token type, and the token value (from `yylval'). Here is an example of `YYPRINT' suitable for the multi-function calculator (*note Declarations for `mfcalc': Mfcalc Decl.): #define YYPRINT(file, type, value) yyprint (file, type, value) static void yyprint (file, type, value) FILE *file; int type; YYSTYPE value; { if (type == VAR) fprintf (file, " %s", value.tptr->name); else if (type == NUM) fprintf (file, " %d", value.val); }  File: bison.info, Node: Invocation, Next: Table of Symbols, Prev: Debugging, Up: Top Invoking Bison ************** The usual way to invoke Bison is as follows: bison INFILE Here INFILE is the grammar file name, which usually ends in `.y'. The parser file's name is made by replacing the `.y' with `.tab.c'. Thus, the `bison foo.y' filename yields `foo.tab.c', and the `bison hack/foo.y' filename yields `hack/foo.tab.c'. * Menu: * Bison Options:: All the options described in detail, in alphabetical order by short options. * Option Cross Key:: Alphabetical list of long options. * VMS Invocation:: Bison command syntax on VMS.  File: bison.info, Node: Bison Options, Next: Option Cross Key, Up: Invocation Bison Options ============= Bison supports both traditional single-letter options and mnemonic long option names. Long option names are indicated with `--' instead of `-'. Abbreviations for option names are allowed as long as they are unique. When a long option takes an argument, like `--file-prefix', connect the option name and the argument with `='. Here is a list of options that can be used with Bison, alphabetized by short option. It is followed by a cross key alphabetized by long option. `-b FILE-PREFIX' `--file-prefix=PREFIX' Specify a prefix to use for all Bison output file names. The names are chosen as if the input file were named `PREFIX.c'. `-d' `--defines' Write an extra output file containing macro definitions for the token type names defined in the grammar and the semantic value type `YYSTYPE', as well as a few `extern' variable declarations. If the parser output file is named `NAME.c' then this file is named `NAME.h'. This output file is essential if you wish to put the definition of `yylex' in a separate source file, because `yylex' needs to be able to refer to token type codes and the variable `yylval'. *Note Semantic Values of Tokens: Token Values. `-l' `--no-lines' Don't put any `#line' preprocessor commands in the parser file. Ordinarily Bison puts them in the parser file so that the C compiler and debuggers will associate errors with your source file, the grammar file. This option causes them to associate errors with the parser file, treating it as an independent source file in its own right. `-n' `--no-parser' Do not include any C code in the parser file; generate tables only. The parser file contains just `#define' directives and static variable declarations. This option also tells Bison to write the C code for the grammar actions into a file named `FILENAME.act', in the form of a brace-surrounded body fit for a `switch' statement. `-o OUTFILE' `--output-file=OUTFILE' Specify the name OUTFILE for the parser file. The other output files' names are constructed from OUTFILE as described under the `-v' and `-d' options. `-p PREFIX' `--name-prefix=PREFIX' Rename the external symbols used in the parser so that they start with PREFIX instead of `yy'. The precise list of symbols renamed is `yyparse', `yylex', `yyerror', `yynerrs', `yylval', `yychar' and `yydebug'. For example, if you use `-p c', the names become `cparse', `clex', and so on. *Note Multiple Parsers in the Same Program: Multiple Parsers. `-r' `--raw' Pretend that `%raw' was specified. *Note Decl Summary::. `-t' `--debug' Output a definition of the macro `YYDEBUG' into the parser file, so that the debugging facilities are compiled. *Note Debugging Your Parser: Debugging. `-v' `--verbose' Write an extra output file containing verbose descriptions of the parser states and what is done for each type of look-ahead token in that state. This file also describes all the conflicts, both those resolved by operator precedence and the unresolved ones. The file's name is made by removing `.tab.c' or `.c' from the parser output file name, and adding `.output' instead. Therefore, if the input file is `foo.y', then the parser file is called `foo.tab.c' by default. As a consequence, the verbose output file is called `foo.output'. `-V' `--version' Print the version number of Bison and exit. `-h' `--help' Print a summary of the command-line options to Bison and exit. `-y' `--yacc' `--fixed-output-files' Equivalent to `-o y.tab.c'; the parser output file is called `y.tab.c', and the other outputs are called `y.output' and `y.tab.h'. The purpose of this option is to imitate Yacc's output file name conventions. Thus, the following shell script can substitute for Yacc: bison -y $*  File: bison.info, Node: Option Cross Key, Next: VMS Invocation, Prev: Bison Options, Up: Invocation Option Cross Key ================ Here is a list of options, alphabetized by long option, to help you find the corresponding short option. --debug -t --defines -d --file-prefix=PREFIX -b FILE-PREFIX --fixed-output-files --yacc -y --help -h --name-prefix=PREFIX -p NAME-PREFIX --no-lines -l --no-parser -n --output-file=OUTFILE -o OUTFILE --raw -r --token-table -k --verbose -v --version -V  File: bison.info, Node: VMS Invocation, Prev: Option Cross Key, Up: Invocation Invoking Bison under VMS ======================== The command line syntax for Bison on VMS is a variant of the usual Bison command syntax--adapted to fit VMS conventions. To find the VMS equivalent for any Bison option, start with the long option, and substitute a `/' for the leading `--', and substitute a `_' for each `-' in the name of the long option. For example, the following invocation under VMS: bison /debug/name_prefix=bar foo.y is equivalent to the following command under POSIX. bison --debug --name-prefix=bar foo.y The VMS file system does not permit filenames such as `foo.tab.c'. In the above example, the output file would instead be named `foo_tab.c'.  File: bison.info, Node: Table of Symbols, Next: Glossary, Prev: Invocation, Up: Top Bison Symbols ************* `error' A token name reserved for error recovery. This token may be used in grammar rules so as to allow the Bison parser to recognize an error in the grammar without halting the process. In effect, a sentence containing an error may be recognized as valid. On a parse error, the token `error' becomes the current look-ahead token. Actions corresponding to `error' are then executed, and the look-ahead token is reset to the token that originally caused the violation. *Note Error Recovery::. `YYABORT' Macro to pretend that an unrecoverable syntax error has occurred, by making `yyparse' return 1 immediately. The error reporting function `yyerror' is not called. *Note The Parser Function `yyparse': Parser Function. `YYACCEPT' Macro to pretend that a complete utterance of the language has been read, by making `yyparse' return 0 immediately. *Note The Parser Function `yyparse': Parser Function. `YYBACKUP' Macro to discard a value from the parser stack and fake a look-ahead token. *Note Special Features for Use in Actions: Action Features. `YYERROR' Macro to pretend that a syntax error has just been detected: call `yyerror' and then perform normal error recovery if possible (*note Error Recovery::), or (if recovery is impossible) make `yyparse' return 1. *Note Error Recovery::. `YYERROR_VERBOSE' Macro that you define with `#define' in the Bison declarations section to request verbose, specific error message strings when `yyerror' is called. `YYINITDEPTH' Macro for specifying the initial size of the parser stack. *Note Stack Overflow::. `YYLEX_PARAM' Macro for specifying an extra argument (or list of extra arguments) for `yyparse' to pass to `yylex'. *Note Calling Conventions for Pure Parsers: Pure Calling. `YYLTYPE' Macro for the data type of `yylloc'; a structure with four members. *Note Textual Positions of Tokens: Token Positions. `yyltype' Default value for YYLTYPE. `YYMAXDEPTH' Macro for specifying the maximum size of the parser stack. *Note Stack Overflow::. `YYPARSE_PARAM' Macro for specifying the name of a parameter that `yyparse' should accept. *Note Calling Conventions for Pure Parsers: Pure Calling. `YYRECOVERING' Macro whose value indicates whether the parser is recovering from a syntax error. *Note Special Features for Use in Actions: Action Features. `YYSTYPE' Macro for the data type of semantic values; `int' by default. *Note Data Types of Semantic Values: Value Type. `yychar' External integer variable that contains the integer value of the current look-ahead token. (In a pure parser, it is a local variable within `yyparse'.) Error-recovery rule actions may examine this variable. *Note Special Features for Use in Actions: Action Features. `yyclearin' Macro used in error-recovery rule actions. It clears the previous look-ahead token. *Note Error Recovery::. `yydebug' External integer variable set to zero by default. If `yydebug' is given a nonzero value, the parser will output information on input symbols and parser action. *Note Debugging Your Parser: Debugging. `yyerrok' Macro to cause parser to recover immediately to its normal mode after a parse error. *Note Error Recovery::. `yyerror' User-supplied function to be called by `yyparse' on error. The function receives one argument, a pointer to a character string containing an error message. *Note The Error Reporting Function `yyerror': Error Reporting. `yylex' User-supplied lexical analyzer function, called with no arguments to get the next token. *Note The Lexical Analyzer Function `yylex': Lexical. `yylval' External variable in which `yylex' should place the semantic value associated with a token. (In a pure parser, it is a local variable within `yyparse', and its address is passed to `yylex'.) *Note Semantic Values of Tokens: Token Values. `yylloc' External variable in which `yylex' should place the line and column numbers associated with a token. (In a pure parser, it is a local variable within `yyparse', and its address is passed to `yylex'.) You can ignore this variable if you don't use the `@' feature in the grammar actions. *Note Textual Positions of Tokens: Token Positions. `yynerrs' Global variable which Bison increments each time there is a parse error. (In a pure parser, it is a local variable within `yyparse'.) *Note The Error Reporting Function `yyerror': Error Reporting. `yyparse' The parser function produced by Bison; call this function to start parsing. *Note The Parser Function `yyparse': Parser Function. `%left' Bison declaration to assign left associativity to token(s). *Note Operator Precedence: Precedence Decl. `%no_lines' Bison declaration to avoid generating `#line' directives in the parser file. *Note Decl Summary::. `%nonassoc' Bison declaration to assign nonassociativity to token(s). *Note Operator Precedence: Precedence Decl. `%prec' Bison declaration to assign a precedence to a specific rule. *Note Context-Dependent Precedence: Contextual Precedence. `%pure_parser' Bison declaration to request a pure (reentrant) parser. *Note A Pure (Reentrant) Parser: Pure Decl. `%raw' Bison declaration to use Bison internal token code numbers in token tables instead of the usual Yacc-compatible token code numbers. *Note Decl Summary::. `%right' Bison declaration to assign right associativity to token(s). *Note Operator Precedence: Precedence Decl. `%start' Bison declaration to specify the start symbol. *Note The Start-Symbol: Start Decl. `%token' Bison declaration to declare token(s) without specifying precedence. *Note Token Type Names: Token Decl. `%token_table' Bison declaration to include a token name table in the parser file. *Note Decl Summary::. `%type' Bison declaration to declare nonterminals. *Note Nonterminal Symbols: Type Decl. `%union' Bison declaration to specify several possible data types for semantic values. *Note The Collection of Value Types: Union Decl. These are the punctuation and delimiters used in Bison input: `%%' Delimiter used to separate the grammar rule section from the Bison declarations section or the additional C code section. *Note The Overall Layout of a Bison Grammar: Grammar Layout. `%{ %}' All code listed between `%{' and `%}' is copied directly to the output file uninterpreted. Such code forms the "C declarations" section of the input file. *Note Outline of a Bison Grammar: Grammar Outline. `/*...*/' Comment delimiters, as in C. `:' Separates a rule's result from its components. *Note Syntax of Grammar Rules: Rules. `;' Terminates a rule. *Note Syntax of Grammar Rules: Rules. `|' Separates alternate rules for the same result nonterminal. *Note Syntax of Grammar Rules: Rules.  File: bison.info, Node: Glossary, Next: Index, Prev: Table of Symbols, Up: Top Glossary ******** Backus-Naur Form (BNF) Formal method of specifying context-free grammars. BNF was first used in the `ALGOL-60' report, 1963. *Note Languages and Context-Free Grammars: Language and Grammar. Context-free grammars Grammars specified as rules that can be applied regardless of context. Thus, if there is a rule which says that an integer can be used as an expression, integers are allowed _anywhere_ an expression is permitted. *Note Languages and Context-Free Grammars: Language and Grammar. Dynamic allocation Allocation of memory that occurs during execution, rather than at compile time or on entry to a function. Empty string Analogous to the empty set in set theory, the empty string is a character string of length zero. Finite-state stack machine A "machine" that has discrete states in which it is said to exist at each instant in time. As input to the machine is processed, the machine moves from state to state as specified by the logic of the machine. In the case of the parser, the input is the language being parsed, and the states correspond to various stages in the grammar rules. *Note The Bison Parser Algorithm: Algorithm. Grouping A language construct that is (in general) grammatically divisible; for example, `expression' or `declaration' in C. *Note Languages and Context-Free Grammars: Language and Grammar. Infix operator An arithmetic operator that is placed between the operands on which it performs some operation. Input stream A continuous flow of data between devices or programs. Language construct One of the typical usage schemas of the language. For example, one of the constructs of the C language is the `if' statement. *Note Languages and Context-Free Grammars: Language and Grammar. Left associativity Operators having left associativity are analyzed from left to right: `a+b+c' first computes `a+b' and then combines with `c'. *Note Operator Precedence: Precedence. Left recursion A rule whose result symbol is also its first component symbol; for example, `expseq1 : expseq1 ',' exp;'. *Note Recursive Rules: Recursion. Left-to-right parsing Parsing a sentence of a language by analyzing it token by token from left to right. *Note The Bison Parser Algorithm: Algorithm. Lexical analyzer (scanner) A function that reads an input stream and returns tokens one by one. *Note The Lexical Analyzer Function `yylex': Lexical. Lexical tie-in A flag, set by actions in the grammar rules, which alters the way tokens are parsed. *Note Lexical Tie-ins::. Literal string token A token which constists of two or more fixed characters. *Note Symbols::. Look-ahead token A token already read but not yet shifted. *Note Look-Ahead Tokens: Look-Ahead. LALR(1) The class of context-free grammars that Bison (like most other parser generators) can handle; a subset of LR(1). *Note Mysterious Reduce/Reduce Conflicts: Mystery Conflicts. LR(1) The class of context-free grammars in which at most one token of look-ahead is needed to disambiguate the parsing of any piece of input. Nonterminal symbol A grammar symbol standing for a grammatical construct that can be expressed through rules in terms of smaller constructs; in other words, a construct that is not a token. *Note Symbols::. Parse error An error encountered during parsing of an input stream due to invalid syntax. *Note Error Recovery::. Parser A function that recognizes valid sentences of a language by analyzing the syntax structure of a set of tokens passed to it from a lexical analyzer. Postfix operator An arithmetic operator that is placed after the operands upon which it performs some operation. Reduction Replacing a string of nonterminals and/or terminals with a single nonterminal, according to a grammar rule. *Note The Bison Parser Algorithm: Algorithm. Reentrant A reentrant subprogram is a subprogram which can be in invoked any number of times in parallel, without interference between the various invocations. *Note A Pure (Reentrant) Parser: Pure Decl. Reverse polish notation A language in which all operators are postfix operators. Right recursion A rule whose result symbol is also its last component symbol; for example, `expseq1: exp ',' expseq1;'. *Note Recursive Rules: Recursion. Semantics In computer languages, the semantics are specified by the actions taken for each instance of the language, i.e., the meaning of each statement. *Note Defining Language Semantics: Semantics. Shift A parser is said to shift when it makes the choice of analyzing further input from the stream rather than reducing immediately some already-recognized rule. *Note The Bison Parser Algorithm: Algorithm. Single-character literal A single character that is recognized and interpreted as is. *Note From Formal Rules to Bison Input: Grammar in Bison. Start symbol The nonterminal symbol that stands for a complete valid utterance in the language being parsed. The start symbol is usually listed as the first nonterminal symbol in a language specification. *Note The Start-Symbol: Start Decl. Symbol table A data structure where symbol names and associated data are stored during parsing to allow for recognition and use of existing information in repeated uses of a symbol. *Note Multi-function Calc::. Token A basic, grammatically indivisible unit of a language. The symbol that describes a token in the grammar is a terminal symbol. The input of the Bison parser is a stream of tokens which comes from the lexical analyzer. *Note Symbols::. Terminal symbol A grammar symbol that has no rules in the grammar and therefore is grammatically indivisible. The piece of text it represents is a token. *Note Languages and Context-Free Grammars: Language and Grammar. dibbler-1.0.1/bison++/reader.cc0000664000175000017500000011506612233256142013061 00000000000000/* Input parser for bison Copyright (C) 1984, 1986, 1989 Free Software Foundation, Inc. This file is part of Bison, the GNU Compiler Compiler. Bison 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. Bison 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 Bison; see the file COPYING. If not, write to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ /* read in the grammar specification and record it in the format described in gram.h. All guards are copied into the fguard file and all actions into faction, in each case forming the body of a C function (yyguard or yyaction) which contains a switch statement to decide which guard or action to execute. The entry point is reader(). */ #include #include #include "system.h" #include "files.h" #include "new.h" #include "symtab.h" #include "lex.h" #include "gram.h" #include "machine.h" extern bool bison_compability; /* Number of slots allocated (but not necessarily used yet) in `rline' */ int rline_allocated; extern char *program_name; extern int definesflag; extern int nolinesflag; extern bucket *symval; extern int numval; extern int failure; extern int expected_conflicts; extern char *token_buffer; extern void init_lex(); extern void tabinit(); extern void output_headers(); extern void output_trailers(); extern void free_symtab(); extern void open_extra_files(); extern void fatal(const char*); extern void fatals(const char*,void*); extern void fatals(const char*,void*,void*); extern void fatals(const char*,void*,void*,void*); extern void fatals(const char*,void*,void*,void*,void*); extern void fatals(const char*,void*,void*,void*,void*,void*); extern void unlex(int); extern void done(int); extern int skip_white_space(); extern int parse_percent_token(); extern int lex(); void read_declarations(); void copy_definition(); void parse_token_decl(int,int); void parse_start_decl(); void parse_type_decl(); void parse_assoc_decl(int); void parse_union_decl(); void parse_expect_decl(); void readgram(); void record_rule_line(); void packsymbols(); void output_token_defines(); void packgram(); int read_signed_integer(FILE*); int get_type(); typedef struct symbol_list { struct symbol_list *next; bucket *sym; bucket *ruleprec; } symbol_list; void copy_action(symbol_list*,int); int lineno; symbol_list *grammar; int start_flag; bucket *startval; char **tags; /* Nonzero if components of semantic values are used, implying they must be unions. */ static int value_components_used; static int typed; /* nonzero if %union has been seen. */ static int lastprec; /* incremented for each %left, %right or %nonassoc seen */ static int gensym_count; /* incremented for each generated symbol */ bucket *errtoken; /* Nonzero if any action or guard uses the @n construct. */ int yylsp_needed; extern char *version_string; extern void output_before_read(); extern void output_about_token(); void set_parser_name(char*); void cputc(int); void hputc(int); void copy_header_definition(); void parse_name_declaration(); void parse_define(); void read_a_name(); extern FILE *finput; extern int lineno; void copy_a_definition (void (*do_put)(int)) { register int c; register int match; register int ended; register int after_percent; /* -1 while reading a character if prev char was % */ int cplus_comment; after_percent = 0; c = getc(finput); for (;;) { switch (c) { case '\n': (*do_put)(c); lineno++; break; case '%': after_percent = -1; break; case '\'': case '"': match = c; (*do_put)(c); c = getc(finput); while (c != match) { if (c == EOF || c == '\n') fatal("unterminated string"); (*do_put)(c); if (c == '\\') { c = getc(finput); if (c == EOF) fatal("unterminated string"); (*do_put)(c); if (c == '\n') lineno++; } c = getc(finput); } (*do_put)(c); break; case '/': (*do_put)(c); c = getc(finput); if (c != '*' && c != '/') continue; cplus_comment = (c == '/'); (*do_put)(c); c = getc(finput); ended = 0; while (!ended) { if (!cplus_comment && c == '*') { while (c == '*') { (*do_put)(c); c = getc(finput); } if (c == '/') { (*do_put)(c); ended = 1; } } else if (c == '\n') { lineno++; (*do_put)(c); if (cplus_comment) ended = 1; else c = getc(finput); } //else if (c == EOF) //fatal("unterminated comment in `%{' definition"); else { (*do_put)(c); c = getc(finput); } } break; case EOF: //fatal("unterminated `%{' definition"); default: (*do_put)(c); } c = getc(finput); if (after_percent) { if (c == '}') return; (*do_put)('%'); } after_percent = 0; } } void reader() { start_flag = 0; startval = NULL; /* start symbol not specified yet. */ #if 0 translations = 0; /* initially assume token number translation not needed. */ #endif /* Nowadays translations is always set to 1, since we give `error' a user-token-number to satisfy the Posix demand for YYERRCODE==256. */ translations = 1; nsyms = 1; nvars = 0; nrules = 0; nitems = 0; rline_allocated = 10; rline = NEW2(rline_allocated, short); typed = 0; lastprec = 0; gensym_count = 0; semantic_parser = 0; pure_parser = 0; yylsp_needed = 0; grammar = NULL; init_lex(); lineno = 1; /* initialize the symbol table. */ tabinit(); /* construct the error token */ errtoken = getsym("error"); errtoken->internalClass = STOKEN; errtoken->user_token_number = 256; /* Value specified by posix. */ /* construct a token that represents all undefined literal tokens. */ /* it is always token number 2. */ getsym("$illegal.")->internalClass = STOKEN; /* Read the declaration section. Copy %{ ... %} groups to ftable and fdefines file. Also notice any %token, %left, etc. found there. */ output_before_read(); read_declarations(); output_headers(); /* read in the grammar, build grammar in list form. write out guards and actions. */ readgram(); /* write closing delimiters for actions and guards. */ output_trailers(); /* assign the symbols their symbol numbers. Write #defines for the token symbols into fdefines if requested. */ packsymbols(); /* convert the grammar into the format described in gram.h. */ packgram(); /* free the symbol table data structure since symbols are now all referred to by symbol number. */ free_symtab(); } /* read from finput until %% is seen. Discard the %%. Handle any % declarations, and copy the contents of any %{ ... %} groups to ftable. */ void read_declarations () { register int c; register int tok; for (;;) { c = skip_white_space(); if (c == '%') { tok = parse_percent_token(); switch (tok) { case TWO_PERCENTS: return; case PERCENT_LEFT_CURLY: copy_definition(); break; case PERCENT_LEFT_CURLY_HEADER: copy_header_definition(); break; case TOKEN: parse_token_decl (STOKEN, SNTERM); break; case NTERM: parse_token_decl (SNTERM, STOKEN); break; case TYPE: parse_type_decl(); break; case START: parse_start_decl(); break; case UNION: parse_union_decl(); break; case EXPECT: parse_expect_decl(); break; case LEFT: parse_assoc_decl(LEFT_ASSOC); break; case RIGHT: parse_assoc_decl(RIGHT_ASSOC); break; case NONASSOC: parse_assoc_decl(NON_ASSOC); break; case SEMANTIC_PARSER: if (semantic_parser == 0) { semantic_parser = 1; open_extra_files(); fprintf(stderr, "semantic_parser no more supported in this version of bison !!! \n errors will be done ! use classic bison, use simple parser, or addapt this version to semantic parser\n"); } break; case PURE_PARSER: pure_parser = 1; break; case PARSER_NAME: parse_name_declaration(); break; case DEFINE_SYM: parse_define(); break; default: fatal("junk after `%%' in definition section"); } } else if (c == EOF) fatal("no input grammar"); else if (c >= 040 && c <= 0177) fatals ("unknown character `%c' in declaration section", (void*) c); else fatals ("unknown character with code 0x%x in declaration section", (void*) c); } } /* copy the contents of a %{ ... %} into the definitions file. The %{ has already been read. Return after reading the %}. */ void copy_definition () { if (!nolinesflag) fprintf(ftable, "#line %d \"%s\"\n", lineno, quoted_filename(infile)); copy_a_definition (cputc); } void copy_header_definition () { if (!nolinesflag) {fprintf(ftable, "#line %d \"%s\"\n", lineno, quoted_filename(infile)); if(definesflag) fprintf(fdefines, "#line %d \"%s\"\n", lineno, quoted_filename(infile)); } copy_a_definition (hputc); } void hputc(int c) { putc(c,ftable); if(definesflag) putc(c,fdefines); } void cputc(int c) { putc(c,ftable); } /* parse what comes after %token or %nterm. For %token, what_is is STOKEN and what_is_not is SNTERM. For %nterm, the arguments are reversed. */ void parse_token_decl (int what_is, int what_is_not) { register int token = 0; register int prev; char *internalTypename = 0; int k; /* start_lineno = lineno; JF */ for (;;) { if(ungetc(skip_white_space(), finput) == '%') return; /* if (lineno != start_lineno) return; JF */ /* we have not passed a newline, so the token now starting is in this declaration */ prev = token; token = lex(); if (token == COMMA) continue; if (token == TYPENAME) { k = strlen(token_buffer); internalTypename = NEW2(k + 1, char); strcpy(internalTypename, token_buffer); value_components_used = 1; } else if (token == IDENTIFIER) { int oldclass = symval->internalClass; if (symval->internalClass == what_is_not) fatals("symbol %s redefined", (void*) symval->tag); symval->internalClass = what_is; if (what_is == SNTERM && oldclass != SNTERM) symval->value = nvars++; if (internalTypename) { if (symval->type_name == NULL) symval->type_name = internalTypename; else fatals("type redeclaration for %s",(void*) symval->tag); } } else if (prev == IDENTIFIER && token == NUMBER) { symval->user_token_number = numval; translations = 1; } else fatal("invalid text in %token or %nterm declaration"); } } /* parse what comes after %start */ void parse_start_decl () { if (start_flag) fatal("multiple %start declarations"); start_flag = 1; if (lex() != IDENTIFIER) fatal("invalid %start declaration"); startval = symval; } /* read in a %type declaration and record its information for get_type_name to access */ void parse_type_decl () { register int k; register char *name; /* register int start_lineno; JF */ if (lex() != TYPENAME) fatal("ill-formed %type declaration"); k = strlen(token_buffer); name = NEW2(k + 1, char); strcpy(name, token_buffer); /* start_lineno = lineno; */ for (;;) { register int t; if(ungetc(skip_white_space(), finput) == '%') return; /* if (lineno != start_lineno) return; JF */ /* we have not passed a newline, so the token now starting is in this declaration */ t = lex(); switch (t) { case COMMA: case SEMICOLON: break; case IDENTIFIER: if (symval->type_name == NULL) symval->type_name = name; else fatals("type redeclaration for %s", (void*) symval->tag); break; default: fatal("invalid %type declaration"); } } } /* read in a %left, %right or %nonassoc declaration and record its information. */ /* assoc is either LEFT_ASSOC, RIGHT_ASSOC or NON_ASSOC. */ void parse_assoc_decl (int assoc) { register int k; register char *name = NULL; /* register int start_lineno; JF */ register int prev = 0; /* JF added = 0 to keep lint happy */ lastprec++; /* Assign a new precedence level, never 0. */ /* start_lineno = lineno; */ for (;;) { register int t; if(ungetc(skip_white_space(), finput) == '%') return; /* if (lineno != start_lineno) return; JF */ /* we have not passed a newline, so the token now starting is in this declaration */ t = lex(); switch (t) { case TYPENAME: k = strlen(token_buffer); name = NEW2(k + 1, char); strcpy(name, token_buffer); break; case COMMA: break; case IDENTIFIER: if (symval->prec != 0) fatals("redefining precedence of %s", (void*) symval->tag); symval->prec = lastprec; symval->assoc = assoc; if (symval->internalClass == SNTERM) fatals("symbol %s redefined", (void*) symval->tag); symval->internalClass = STOKEN; if (name) { /* record the type, if one is specified */ if (symval->type_name == NULL) symval->type_name = name; else fatals("type redeclaration for %s", (void*) symval->tag); } break; case NUMBER: if (prev == IDENTIFIER) { symval->user_token_number = numval; translations = 1; } else fatal("invalid text in association declaration"); break; case SEMICOLON: return; default: fatal("malformatted association declaration"); } prev = t; } } /* copy the union declaration into ftable (and fdefines), where it is made into the definition of YYSTYPE, the type of elements of the parser value stack. */ void parse_union_decl() { register int c; register int count; register int in_comment; int cplus_comment; if (typed) fatal("multiple %union declarations"); typed = 1; if (!nolinesflag) fprintf(ftable, "\n#line %d \"%s\"\n", lineno, quoted_filename(infile)); else fprintf(ftable, "\n"); fprintf(ftable, "typedef union"); if (definesflag) { if (!nolinesflag) fprintf(fdefines, "\n#line %d \"%s\"\n", lineno, quoted_filename(infile)); else fprintf(fdefines, "\n"); fprintf(fdefines, "typedef union"); } count = 0; in_comment = 0; c = getc(finput); while (c != EOF) { hputc(c); switch (c) { case '\n': lineno++; break; case '/': c = getc(finput); if (c != '*' && c != '/') ungetc(c, finput); else { hputc(c); cplus_comment = (c == '/'); in_comment = 1; c = getc(finput); while (in_comment) { hputc(c); if (c == '\n') { lineno++; if (cplus_comment) { in_comment = 0; break; } } if (c == EOF) fatal("unterminated comment"); if (!cplus_comment && c == '*') { c = getc(finput); if (c == '/') { hputc('/'); in_comment = 0; } } else c = getc(finput); } } break; case '{': count++; break; case '}': if (count == 0) fatal ("unmatched close-brace (`}')"); count--; if (count == 0) { set_parser_name(NULL); /* if undef, use default */ fprintf(ftable, " yy_%s_stype;\n#define YY_%s_STYPE yy_%s_stype\n", parser_name,parser_name,parser_name); if(bison_compability==true) { fprintf(ftable, "#ifndef YY_USE_CLASS\n#define YYSTYPE yy_%s_stype\n#endif\n",parser_name); } if (definesflag) { fprintf(fdefines, " yy_%s_stype;\n#define YY_%s_STYPE yy_%s_stype\n", parser_name,parser_name,parser_name); if(bison_compability==true) { fprintf(fdefines, "#ifndef YY_USE_CLASS\n#define YYSTYPE yy_%s_stype\n#endif\n",parser_name); } } /* JF don't choke on trailing semi */ c=skip_white_space(); if(c!=';') ungetc(c,finput); return; } } c = getc(finput); } } /* parse the declaration %expect N which says to expect N shift-reduce conflicts. */ void parse_expect_decl() { register int c; register int count; char buffer[20]; c = getc(finput); while (c == ' ' || c == '\t') c = getc(finput); count = 0; while (c >= '0' && c <= '9') { if (count < 20) buffer[count++] = c; c = getc(finput); } buffer[count] = 0; ungetc (c, finput); expected_conflicts = atoi (buffer); } /* that's all of parsing the declaration section */ /* Get the data type (alternative in the union) of the value for symbol n in rule rule. */ char * get_type_name(int n, symbol_list* rule) { static char *msg = "invalid $ value"; register int i; register symbol_list *rp; if (n < 0) fatal(msg); rp = rule; i = 0; while (i < n) { rp = rp->next; if (rp == NULL || rp->sym == NULL) fatal(msg); i++; } return (rp->sym->type_name); } /* after %guard is seen in the input file, copy the actual guard into the guards file. If the guard is followed by an action, copy that into the actions file. stack_offset is the number of values in the current rule so far, which says where to find $0 with respect to the top of the stack, for the simple parser in which the stack is not popped until after the guard is run. */ void copy_guard(symbol_list* rule, int stack_offset) { register int c; register int n; register int count; register int match; register int ended; register char *type_name; int brace_flag = 0; int cplus_comment; /* offset is always 0 if parser has already popped the stack pointer */ if (semantic_parser) stack_offset = 0; fprintf(fguard, "\ncase %d:\n", nrules); if (!nolinesflag) fprintf(fguard, "#line %d \"%s\"\n", lineno, quoted_filename(infile)); putc('{', fguard); count = 0; c = getc(finput); while (brace_flag ? (count > 0) : (c != ';')) { switch (c) { case '\n': putc(c, fguard); lineno++; break; case '{': putc(c, fguard); brace_flag = 1; count++; break; case '}': putc(c, fguard); if (count > 0) count--; else fatal("unmatched right brace ('}')"); break; case '\'': case '"': match = c; putc(c, fguard); c = getc(finput); while (c != match) { if (c == EOF || c == '\n') fatal("unterminated string"); putc(c, fguard); if (c == '\\') { c = getc(finput); if (c == EOF) fatal("unterminated string"); putc(c, fguard); if (c == '\n') lineno++; } c = getc(finput); } putc(c, fguard); break; case '/': putc(c, fguard); c = getc(finput); if (c != '*' && c != '/') continue; cplus_comment = (c == '/'); putc(c, fguard); c = getc(finput); ended = 0; while (!ended) { if (!cplus_comment && c == '*') { while (c == '*') { putc(c, fguard); c = getc(finput); } if (c == '/') { putc(c, fguard); ended = 1; } } else if (c == '\n') { lineno++; putc(c, fguard); if (cplus_comment) ended = 1; else c = getc(finput); } else if (c == EOF) fatal("unterminated comment"); else { putc(c, fguard); c = getc(finput); } } break; case '$': c = getc(finput); type_name = NULL; if (c == '<') { register char *cp = token_buffer; while ((c = getc(finput)) != '>' && c > 0) *cp++ = c; *cp = 0; type_name = token_buffer; c = getc(finput); } if (c == '$') { fprintf(fguard, "yyval"); if (!type_name) type_name = rule->sym->type_name; if (type_name) fprintf(fguard, ".%s", type_name); if(!type_name && typed) /* JF */ fprintf(stderr,"%s:%d: warning: $$ of '%s' has no declared type.\n",infile,lineno,rule->sym->tag); } else if (isdigit(c) || c == '-') { ungetc (c, finput); n = read_signed_integer(finput); c = getc(finput); if (!type_name && n > 0) type_name = get_type_name(n, rule); fprintf(fguard, "yyvsp[%d]", n - stack_offset); if (type_name) fprintf(fguard, ".%s", type_name); if(!type_name && typed) /* JF */ fprintf(stderr,"%s:%d: warning: $%d of '%s' has no declared type.\n",infile,lineno,n,rule->sym->tag); continue; } else fatals("$%c is invalid",(void*) c); /* JF changed style */ break; case '@': c = getc(finput); if (isdigit(c) || c == '-') { ungetc (c, finput); n = read_signed_integer(finput); c = getc(finput); } else fatals("@%c is invalid",(void*) c); /* JF changed style */ fprintf(fguard, "yylsp[%d]", n - stack_offset); yylsp_needed = 1; continue; case EOF: fatal("unterminated %guard clause"); default: putc(c, fguard); } if (c != '}' || count != 0) c = getc(finput); } c = skip_white_space(); fprintf(fguard, ";\n break;}"); if (c == '{') copy_action(rule, stack_offset); else if (c == '=') { c = getc(finput); if (c == '{') copy_action(rule, stack_offset); } else ungetc(c, finput); } /* Assuming that a { has just been seen, copy everything up to the matching } into the actions file. stack_offset is the number of values in the current rule so far, which says where to find $0 with respect to the top of the stack. */ void copy_action(symbol_list* rule, int stack_offset) { register int c; register int n; register int count; register int match; register int ended; register char *type_name; int cplus_comment; /* offset is always 0 if parser has already popped the stack pointer */ if (semantic_parser) stack_offset = 0; fprintf(faction, "\ncase %d:\n", nrules); if (!nolinesflag) fprintf(faction, "#line %d \"%s\"\n", lineno, quoted_filename(infile)); putc('{', faction); count = 1; c = getc(finput); while (count > 0) { while (c != '}') { switch (c) { case '\n': putc(c, faction); lineno++; break; case '{': putc(c, faction); count++; break; case '\'': case '"': match = c; putc(c, faction); c = getc(finput); while (c != match) { if (c == EOF || c == '\n') fatal("unterminated string"); putc(c, faction); if (c == '\\') { c = getc(finput); if (c == EOF) fatal("unterminated string"); putc(c, faction); if (c == '\n') lineno++; } c = getc(finput); } putc(c, faction); break; case '/': putc(c, faction); c = getc(finput); if (c != '*' && c != '/') continue; cplus_comment = (c == '/'); putc(c, faction); c = getc(finput); ended = 0; while (!ended) { if (!cplus_comment && c == '*') { while (c == '*') { putc(c, faction); c = getc(finput); } if (c == '/') { putc(c, faction); ended = 1; } } else if (c == '\n') { lineno++; putc(c, faction); if (cplus_comment) ended = 1; else c = getc(finput); } else if (c == EOF) fatal("unterminated comment"); else { putc(c, faction); c = getc(finput); } } break; case '$': c = getc(finput); type_name = NULL; if (c == '<') { register char *cp = token_buffer; while ((c = getc(finput)) != '>' && c > 0) *cp++ = c; *cp = 0; type_name = token_buffer; value_components_used = 1; c = getc(finput); } if (c == '$') { fprintf(faction, "yyval"); if (!type_name) type_name = get_type_name(0, rule); if (type_name) fprintf(faction, ".%s", type_name); if(!type_name && typed) /* JF */ fprintf(stderr,"%s:%d: warning: $$ of '%s' has no declared type.\n",infile,lineno,rule->sym->tag); } else if (isdigit(c) || c == '-') { ungetc (c, finput); n = read_signed_integer(finput); c = getc(finput); if (!type_name && n > 0) type_name = get_type_name(n, rule); fprintf(faction, "yyvsp[%d]", n - stack_offset); if (type_name) fprintf(faction, ".%s", type_name); if(!type_name && typed) /* JF */ fprintf(stderr,"%s:%d: warning: $%d of '%s' has no declared type.\n",infile,lineno,n,rule->sym->tag); continue; } else fatals("$%c is invalid",(void*) c); /* JF changed format */ break; case '@': c = getc(finput); if (isdigit(c) || c == '-') { ungetc (c, finput); n = read_signed_integer(finput); c = getc(finput); } else fatal("invalid @-construct"); fprintf(faction, "yylsp[%d]", n - stack_offset); yylsp_needed = 1; continue; case EOF: fatal("unmatched '{'"); default: putc(c, faction); } c = getc(finput); } /* above loop exits when c is '}' */ if (--count) { putc(c, faction); c = getc(finput); } } fprintf(faction, ";\n break;}"); } /* generate a dummy symbol, a nonterminal, whose name cannot conflict with the user's names. */ bucket * gensym() { register bucket *sym; sprintf (token_buffer, "@%d", ++gensym_count); sym = getsym(token_buffer); sym->internalClass = SNTERM; sym->value = nvars++; return (sym); } /* Parse the input grammar into a one symbol_list structure. Each rule is represented by a sequence of symbols: the left hand side followed by the contents of the right hand side, followed by a null pointer instead of a symbol to terminate the rule. The next symbol is the lhs of the following rule. All guards and actions are copied out to the appropriate files, labelled by the rule number they apply to. */ void readgram() { register int t; register bucket *lhs; register symbol_list *p; register symbol_list *p1; register bucket *bp; symbol_list *crule; /* points to first symbol_list of current rule. */ /* its symbol is the lhs of the rule. */ symbol_list *crule1; /* points to the symbol_list preceding crule. */ p1 = NULL; t = lex(); while (t != TWO_PERCENTS && t != ENDFILE) { if (t == IDENTIFIER || t == BAR) { register int actionflag = 0; int rulelength = 0; /* number of symbols in rhs of this rule so far */ int xactions = 0; /* JF for error checking */ bucket *first_rhs = 0; if (t == IDENTIFIER) { lhs = symval; t = lex(); if (t != COLON) fatal("ill-formed rule"); } if (nrules == 0) { if (t == BAR) fatal("grammar starts with vertical bar"); if (!start_flag) startval = lhs; } /* start a new rule and record its lhs. */ nrules++; nitems++; record_rule_line (); p = NEW(symbol_list); p->sym = lhs; crule1 = p1; if (p1) p1->next = p; else grammar = p; p1 = p; crule = p; /* mark the rule's lhs as a nonterminal if not already so. */ if (lhs->internalClass == SUNKNOWN) { lhs->internalClass = SNTERM; lhs->value = nvars; nvars++; } else if (lhs->internalClass == STOKEN) fatals("rule given for %s, which is a token", (void*) lhs->tag); /* read the rhs of the rule. */ for (;;) { t = lex(); if (! (t == IDENTIFIER || t == LEFT_CURLY)) break; /* If next token is an identifier, see if a colon follows it. If one does, exit this rule now. */ if (t == IDENTIFIER) { register bucket *ssave; register int t1; ssave = symval; t1 = lex(); unlex(t1); symval = ssave; if (t1 == COLON) break; if(!first_rhs) /* JF */ first_rhs = symval; /* Not followed by colon => process as part of this rule's rhs. */ } /* If we just passed an action, that action was in the middle of a rule, so make a dummy rule to reduce it to a non-terminal. */ if (actionflag) { register bucket *sdummy; /* Since the action was written out with this rule's */ /* number, we must write give the new rule this number */ /* by inserting the new rule before it. */ /* Make a dummy nonterminal, a gensym. */ sdummy = gensym(); /* Make a new rule, whose body is empty, before the current one, so that the action just read can belong to it. */ nrules++; nitems++; record_rule_line (); p = NEW(symbol_list); if (crule1) crule1->next = p; else grammar = p; p->sym = sdummy; crule1 = NEW(symbol_list); p->next = crule1; crule1->next = crule; /* insert the dummy generated by that rule into this rule. */ nitems++; p = NEW(symbol_list); p->sym = sdummy; p1->next = p; p1 = p; actionflag = 0; } if (t == IDENTIFIER) { nitems++; p = NEW(symbol_list); p->sym = symval; p1->next = p; p1 = p; } else /* handle an action. */ { copy_action(crule, rulelength); actionflag = 1; xactions++; /* JF */ } rulelength++; } /* Put an empty link in the list to mark the end of this rule */ p = NEW(symbol_list); p1->next = p; p1 = p; if (t == PREC) { t = lex(); crule->ruleprec = symval; t = lex(); } if (t == GUARD) { if (! semantic_parser) fatal("%guard present but %semantic_parser not specified"); copy_guard(crule, rulelength); t = lex(); } else if (t == LEFT_CURLY) { if (actionflag) fatal("two actions at end of one rule"); copy_action(crule, rulelength); t = lex(); } /* If $$ is being set in default way, warn if any type mismatch. */ else if (!xactions && first_rhs && lhs->type_name != first_rhs->type_name) { if (lhs->type_name == 0 || first_rhs->type_name == 0 || strcmp(lhs->type_name,first_rhs->type_name)) fprintf(stderr, "%s:%d: warning: type clash ('%s' '%s') on default action\n", infile, lineno, lhs->type_name ? lhs->type_name : "", first_rhs->type_name ? first_rhs->type_name : ""); } /* Warn if there is no default for $$ but we need one. */ else if (!xactions && !first_rhs && lhs->type_name != 0) fprintf(stderr, "%s:%d: warning: empty rule for typed nonterminal, and no action\n", infile, lineno); if (t == SEMICOLON) t = lex(); } /* these things can appear as alternatives to rules. */ else if (t == TOKEN) { parse_token_decl(STOKEN, SNTERM); t = lex(); } else if (t == NTERM) { parse_token_decl(SNTERM, STOKEN); t = lex(); } else if (t == TYPE) { t = get_type(); } else if (t == UNION) { parse_union_decl(); t = lex(); } else if (t == EXPECT) { parse_expect_decl(); t = lex(); } else if (t == START) { parse_start_decl(); t = lex(); } else fatal("invalid input"); } set_parser_name(NULL); /* if undef, use default */ if (nsyms > MAXSHORT) fatals("too many symbols (tokens plus nonterminals); maximum %d", (void*) MAXSHORT); if (nrules == 0) fatal("no input grammar"); if (typed == 0 /* JF put out same default YYSTYPE as YACC does */ && !value_components_used) { /* We used to use `unsigned long' as YYSTYPE on MSDOS, but it seems better to be consistent. Most programs should declare their own type anyway. */ fprintf(ftable, "\ #ifndef YY_USE_CLASS\n\ # ifndef YYSTYPE\n\ # define YYSTYPE int\n\ # define YYSTYPE_IS_TRIVIAL 1\n\ # endif\n\ #endif\n"); if (definesflag) fprintf(fdefines, "\ \ #ifndef YY_USE_CLASS\n\ # ifndef YYSTYPE\n\ # define YYSTYPE int\n\ # define YYSTYPE_IS_TRIVIAL 1\n\ # endif\n\ #endif\n"); } /* Report any undefined symbols and consider them nonterminals. */ for (bp = firstsymbol; bp; bp = bp->next) if (bp->internalClass == SUNKNOWN) { fprintf(stderr, "symbol %s used, not defined as token, and no rules for it\n", bp->tag); failure = 1; bp->internalClass = SNTERM; bp->value = nvars++; } ntokens = nsyms - nvars; } void record_rule_line () { /* Record each rule's source line number in rline table. */ if (nrules >= rline_allocated) { rline_allocated = nrules * 2; rline = (short *) xrealloc (( char*) rline, rline_allocated * sizeof (short)); } rline[nrules] = lineno; } /* read in a %type declaration and record its information for get_type_name to access */ int get_type() { register int k; register int t; register char *name; t = lex(); if (t != TYPENAME) fatal("ill-formed %type declaration"); k = strlen(token_buffer); name = NEW2(k + 1, char); strcpy(name, token_buffer); for (;;) { t = lex(); switch (t) { case SEMICOLON: return (lex()); case COMMA: break; case IDENTIFIER: if (symval->type_name == NULL) symval->type_name = name; else fatals("type redeclaration for %s", (void*) symval->tag); break; default: return (t); } } } /* assign symbol numbers, and write definition of token names into fdefines. Set up vectors tags and sprec of names and precedences of symbols. */ void packsymbols() { register bucket *bp; register int tokno = 1; register int i; register int last_user_token_number; /* int lossage = 0; JF set but not used */ tags = NEW2(nsyms + 1, char *); tags[0] = "$"; sprec = NEW2(nsyms, short); sassoc = NEW2(nsyms, short); max_user_token_number = 256; last_user_token_number = 256; for (bp = firstsymbol; bp; bp = bp->next) { if (bp->internalClass == SNTERM) { bp->value += ntokens; } else { if (translations && !(bp->user_token_number)) bp->user_token_number = ++last_user_token_number; if (bp->user_token_number > max_user_token_number) max_user_token_number = bp->user_token_number; bp->value = tokno++; } tags[bp->value] = bp->tag; sprec[bp->value] = bp->prec; sassoc[bp->value] = bp->assoc; } if (translations) { register int i; token_translations = NEW2(max_user_token_number+1, short); /* initialize all entries for literal tokens to 2, the internal token number for $illegal., which represents all invalid inputs. */ for (i = 0; i <= max_user_token_number; i++) token_translations[i] = 2; } for (bp = firstsymbol; bp; bp = bp->next) { if (bp->value >= ntokens) continue; if (translations) { if (token_translations[bp->user_token_number] != 2) { /* JF made this a call to fatals() */ fatals( "tokens %s and %s both assigned number %d", (void*) tags[token_translations[bp->user_token_number]], (void*) bp->tag, (void*) bp->user_token_number); } token_translations[bp->user_token_number] = bp->value; } } error_token_number = errtoken->value; if (startval->internalClass == SUNKNOWN) fatals("the start symbol %s is undefined", (void*) startval->tag); else if (startval->internalClass == STOKEN) fatals("the start symbol %s is a token", (void*) startval->tag); start_symbol = startval->value; output_about_token(); } /* convert the rules into the representation using rrhs, rlhs and ritems. */ void packgram() { register int itemno; register int ruleno; register symbol_list *p; /* register bucket *bp; JF unused */ bucket *ruleprec; ritem = NEW2(nitems + 1, short); rlhs = NEW2(nrules, short) - 1; rrhs = NEW2(nrules, short) - 1; rprec = NEW2(nrules, short) - 1; rprecsym = NEW2(nrules, short) - 1; rassoc = NEW2(nrules, short) - 1; itemno = 0; ruleno = 1; p = grammar; while (p) { rlhs[ruleno] = p->sym->value; rrhs[ruleno] = itemno; ruleprec = p->ruleprec; p = p->next; while (p && p->sym) { ritem[itemno++] = p->sym->value; /* A rule gets by default the precedence and associativity of the last token in it. */ if (p->sym->internalClass == STOKEN) { rprec[ruleno] = p->sym->prec; rassoc[ruleno] = p->sym->assoc; } if (p) p = p->next; } /* If this rule has a %prec, the specified symbol's precedence replaces the default. */ if (ruleprec) { rprec[ruleno] = ruleprec->prec; rassoc[ruleno] = ruleprec->assoc; rprecsym[ruleno] = ruleprec->value; } ritem[itemno++] = -ruleno; ruleno++; if (p) p = p->next; } ritem[itemno] = 0; } /* Read a signed integer from STREAM and return its value. */ int read_signed_integer (FILE* stream) { register int c = getc(stream); register int sign = 1; register int n; if (c == '-') { c = getc(stream); sign = -1; } n = 0; while (isdigit(c)) { n = 10*n + (c - '0'); c = getc(stream); } ungetc(c, stream); return n * sign; } void set_parser_name(char* n) { if(n) /* define */ {if(parser_defined) /* redef */ fatals("parser name already defined as \"%s\"and redefined to \"%s\"\n",(void*) parser_name,(void*) n); else parser_defined++; parser_name=(char *)xmalloc(strlen(n)+1); strcpy(parser_name,n); } else /* use only */ { if(!parser_defined) /* first use, default */ {parser_defined++; fprintf(stderr,"%s:%d parser name defined to default :\"%s\"\n" ,infile,lineno,parser_name); } else /* next use ok*/; } } void read_a_name(char* buf,int len) {int c,l; for(c = skip_white_space(),l=0; (isalnum(c) || c == '_'); c=getc(finput),l++) if(l=len) {buf[len-1]=0; fprintf(stderr,"%s:%d name too long, truncated to :\"%s\"\n" ,infile,lineno,buf); } else buf[l]=0; ungetc(c, finput); } ; void parse_name_declaration() {char name[65]; read_a_name(name,sizeof(name)); set_parser_name(name); } void parse_define() {char name[65]; int c; int after_backslash; read_a_name(name,sizeof(name)); set_parser_name(NULL); fprintf(ftable,"#define YY_%s_%s ",parser_name,name); if (definesflag) fprintf(fdefines,"#define YY_%s_%s ",parser_name,name); for(after_backslash=0,c=getc(finput); (after_backslash || c!='\n'); c=getc(finput)) {after_backslash=(c=='\\'); if(c=='\n') lineno++; if(c==EOF) {fatal("unexpected EOF in %define");} hputc(c); } hputc('\n');lineno++; } dibbler-1.0.1/bison++/bison++.1.dman0000664000175000017500000003547712233256142013557 00000000000000% %Z% %M% %Y% %Q% %I% %E% %U% (%F%) % % Nom du Fichier : bison++.dman % Titre : bison++ man page of modifications % Auteur: coetmeur@icdc.fr % Date de creation : 3/3/93 % % Description : % Document de reference : see bison.1 % Objet : present difference from bison 1.19 (standard) % and bison++ from which it has been made % % % historique : % |>date<| |>auteur<| |>objet<| % % header NOM SECTION DATE AUTEUR DOMAINE :HEADER BISON++ 1 "3/3/93" "GNU and RDT" "COMMANDS" :SECTION "NAME" bison++ - generate a parser in c or c++. :SECTION "SYNOPSIS" "bison++" ["-dltvyVu"] ["-b" ] ["-p" ] ["-o" ] ["-h" ] ["-S" ] ["-H" ] ["--debug"] ["--defines"] ["--fixed-output-files"] ["--no-lines"] ["--verbose"] ["--version"] ["--yacc"] ["--usage"] ["--help"] ["--file-prefix="] ["--name-prefix="] ["--skeleton="] ["--headerskeleton="] ["--output="] ["--header-name="
] :SECTION "DESCRIPTION" Generate a parser. Based on "bison" version 1.19. See "bison"(1) for details of main functionality. Only changes are reported here. You now generate a C++ class if you are compiling with a C++ compiler. The generated header is far more rich than before, and is made from a skeleton-header. The code skeleton is also richer, and the generated code is less important compared to the skeletons. It permit you to modify much things only by changing the two skeletons. In plain C, the "bison++" is compatible with standard "bison". :SECTION "OPTIONS" -{"--name-prefix="} -{"-p" } Set prefix of names of yylex,yyerror. keeped for compatibility, but you should prefer "\%define LEX ", and similar. -{"--skeleton="} -{"-S" } Set filename of code skeleton. Default is "bison.cc". -{"--headerskeleton="} -{"-H" } Set filename of header skeleton. Default is "bison.h". -{"--header-name="
} -{"-h"
} Set filename of header skeleton. Default is "y.tab.h", or .h if option "-b" is used or .h if "-o" is used. ".c", ".cc", ".C", ".cpp", ".cxx" options for output files are replaced by ".h" for header name. :SECTION "DECLARATIONS" These are new declarations to put in the declaration section : -{"\%name" } Declare the name of this parser. User for C++ class name, and to render many names unique. default is "parse". Must be given before "\%union" and "\%define", or never. -{"\%define" } Declare a macro symbol in header and code. The name of the symbol is "YY_"''"_"''. The content if given after, as with #define. Newline can be escaped as with #define. Many symbols are proposed for customisation. -{"\%union"} as with bison generate a union for semantic type. The difference is that the union is named "yy_"''"_stype". -{"\%pure_parser"} As with bison in C. In C++ generate a parser where yylval, and yylloc (if needed) are passed as parameter to yylex, and where some instance variable are local to yyparse (like yydebug...). Not very useful, since you can create multiple instances for reentering another parser. -{"\%header\{"} Like "\%\{", but include this text both in the header, and in the code. End with "\%\}". When put in declaration section, the text is added before the definitions. It can be put in the last section so that the text is added after all definition in the header, and in the last section at the current position in the code. Note that the order of these declaration is important, since they are translated into preprocessor sympols, typedef or code depending on their type. For example use "\%name" before any "\%define", since the name is needed to compose the name of the define symbols. Order of "\%header" and "\%union" is important, since type may be undefined. :SECTION "DECLARATION DEFINE SYMBOLS" These are the symbols you can define with "\%define" in declaration section, or that are already defined. Remind that they are replaced by a preprocessor "#define YY_"''"_"'. -{"BISON"} defined to "1" in the code. used for conditional code. Don't redefine it. -{"h_included"} defined in the code, and in the header. used for include anti-reload. Don't redefine it. -{"COMPATIBILITY"} Indicate if obsoleted defines are to be used and produced. If defined to 0, indicate no compatibility needed, else if defined to non-0, generate it. If it is undefined, default is to be compatible if classes are not used. -{"USE_GOTO"} Indicates (if defined as 1) that "goto" are to be used (for backward compatibility) in the parser function. By default "goto" are replaced with a "switch" construction, to avoid problems with some compiler that don't support "goto" and destructor in the same function block. If "COMPATIBILITY" is 1, and "USE_GOTO" is not defined, then "USE_GOTO" is defined to 1, to be compatible with older bison. -{"USE_CONST_TOKEN"} Indicate (if defined as 1) that "static const int" are to be used in C++, for token IDs. By default an enum is used to define the token IDs instead of const. -{"ENUM_TOKEN"} When "enum" are used instead of "static const int" for token IDs, this symbol define the name of the enum type. Defined to "yy_"''"_enum_token" by default. -{"PURE"} Indicate that "\%pure_parser" is asked... Don't redefine it. -{"LSP_NEEDED"} if defined indicate that @ construct is used, so "LLOC" stack is needed. Can be defined to force use of location stack. -{"DEBUG"} if defined to non-0 activate debugging code. See" YYDEBUG" in bison. -{"ERROR_VERBOSE"} if defined activate dump parser stack when error append. -{"STYPE"} the type of the semantic value of token. defined by "\%union". default is "int". See "YYSTYPE" in bison. Don't redefine it, if you use a "\%union". -{"LTYPE"} The token location type. If needed default is "yyltype". See "YYLTYPE" in bison. default "yyltype" is a typedef and struct defined as in old bison. -{"LLOC"} The token location variable name. If needed, default is "yylloc". See "yylloc" in bison. -{"LVAL"} The token semantic value variable name. Default "yylval". See "yylval" in bison. -{"CHAR"} The lookahead token value variable name. Default "yychar". See "yychar" in bison. -{"LEX"} The scanner function name. Default "yylex". See "yylex" in bison. -{"PARSE"} The parser function name. Default "yyparse". See "yyparse" in bison. -{"PARSE_PARAM"} The parser function parameters declaration. Default "void" in C++ or ANSIC, nothing if old C. In ANSIC and C++ contain the prototype. In old-C comtaim just the list of parameters name. Don't allows default value. -{"PARSE_PARAM_DEF"} The parser function parameters definition, for old style C. Default nothing. For example to use an "int" parameter called "x", PARSE_PARAM is "x", and PARSE_PARAM_DEF is "int x;". In ANSIC or C++ it is unuseful and ignored. -{"ERROR"} The error function name. Default "yyerror". See "yyerror" in bison. -{"NERRS"} The error count name. Default "yynerrs". See "yynerrs" in bison. -{"DEBUG_FLAG"} The runtime debug flag. Default "yydebug". See "yydebug" in bison. These are only used if class is generated. -{"CLASS"} The class name. default is the parser name. -{"INHERIT"} The inheritance list. Don't forget the ":" before, if not empty list. -{"MEMBERS"} List of members to add to the class definition, before ending it. -{"LEX_BODY"} The scanner member function boby. May be defined to "=0" for pure function, or to an inline body. -{"ERROR_BODY"} The error member function boby. May be defined to "=0" for pure function, or to an inline body. -{"CONSTRUCTOR_PARAM"} List of parameters of the constructor. Dont allows default value. -{"CONSTRUCTOR_INIT"} List of initialisation befor constructor call. If not empty dont't forget the ":" before list of initialisation. -{"CONSTRUCTOR_CODE"} Code added after internal initialisation in constructor. :SECTION "OBSOLETED PREPROCESSOR SYMBOLS" if you use new features, the folowing symbols should not be used, though they are proposed. The symbol "COMPATIBILITY" control their disponibility. Incoherence may arise if they are defined simultaneously with the new symbol. -{"YYLTYPE"} prefer "\%define LTYPE". -{"YYSTYPE"} prefer "\%define STYPE". -{"YYDEBUG"} prefer "\%define DEBUG". -{"YYERROR_VERBOSE"} prefer "\%define ERROR_VERBOSE". -{"YYLSP_NEEDED"} prefer "\%define LSP_NEEDED". -{"yystype"} Now a preprocessor symbol instead of a typedef. prefer "yy_"''"_stype". :SECTION "CONSERVED PREPROCESSOR SYMBOLS" These symbols are kept, and cannot be defined elsewhere, since they control private parameters of the generated parser, or are actually unused. You can "#define" them to the value you need, or indirectly to the name of a "\%define" generated symbol if you want to be clean. -{"YYINITDEPTH"} initial stack depth. -{"YYMAXDEPTH"} stack overflow limit depth. -{"yyoverflow"} instead of expand with alloca, realloc manualy or raise error. :SECTION "OTHER ADDED PREPROCESSOR SYMBOLS" -{"YY_USE_CLASS"} indicate that class will be produced. Default if C++. :SECTION "C++ CLASS GENERATED" To simplify the notation, we note "\%SYMBOLNAME" the preprocessor symbol generated with a "\%define" of this name. In fact see the use of "\%define" for it's real name. Note that there is sometime symbols that differ from only an underscore "_", like "yywrap" and "yy_wrap". They are much different. In this case "yy_wrap()" is a virtual member function, and "yywrap()" is a macro. :SSECTION "General Class declaration" class \%CLASS \%INHERIT \{ public: #if \%USE_CONST_TOKEN != 0 static const TOKEN_NEXT; static const AND_SO_ON; // ... #else enum \%ENUM_TOKEN \{ \%NULL_TOKEN > ,TOKEN_FIRST=256 > ,TOKEN_NEXT=257 > ,AND_SO_ON=258 \} ; // ... #endif public: int \%PARSE (\%PARSE_PARAM); virtual void \%ERROR(char *msg) \%ERROR_BODY; #ifdef \%PURE >// if \%PURE , we must pass the value and (eventually) the location explicitely >#ifdef \%LSP_NEEDED >// if and only if \%LSP_NEEDED , we must pass the location explicitely >virtual int \%LEX (\%STYPE *\%LVAL,\%LTYPE *\%LLOC) \%LEX_BODY; >#else >virtual int \%LEX (\%STYPE *\%LVAL) \%LEX_BODY; >#endif #else >// if not \%PURE , we must declare member to store the value and (eventually) the location explicitely >// if not \%PURE ,\%NERRS and \%CHAR are not local variable to \%PARSE, so must be member >virtual int \%LEX() \%LEX_BODY; >\%STYPE \%LVAL; >#ifdef \%LSP_NEEDED >\%LTYPE \%LLOC; >#endif >int \%NERRS; >int \%CHAR; #endif #if \%DEBUG != 0 int \%DEBUG_FLAG; /* nonzero means print parse trace */ #endif public: \%CLASS(\%CONSTRUCTOR_PARAM); public: \%MEMBERS \}; // here are defined the token constants // for example: #if \%USE_CONST_TOKEN != 0 >const \%CLASS::TOKEN_FIRST=1; >... #endif // here is the construcor \%CLASS::\%CLASS(\%CONSTRUCTOR_PARAM) \%CONSTRUCTOR_INIT \{ #if \%DEBUG != 0 \%DEBUG_FLAG=0; #endif \%CONSTRUCTOR_CODE; \}; :SSECTION "Default Class declaration" // Here is the default declaration made in the header when you \%define nothing // typical yyltype typedef struct yyltype \{ int timestamp; int first_line; int first_column; int last_line; int last_column; char *text; \} yyltype; // class definition class parser \{ public: enum yy_parser_enum_token \{ YY_parser_NULL_TOKEN > ,TOKEN_FIRST=256 > ,TOKEN_NEXT=257 > ,AND_SO_ON=258 \} ; // ... public: int yyparse (yyparse_PARAM); virtual void yyerror(char *msg) ; #ifdef YY_parser_PURE >#ifdef YY_parser_LSP_NEEDED >virtual int yylex (int *yylval,yyltype *yylloc) ; >#else >virtual int yylex (int *yylval) ; >#endif #else >virtual int yylex() \%LEX_BODY; >int yylval; >#ifdef YY_parser_LSP_NEEDED >yyltype yylloc; >#endif >int yynerrs; >int yychar; #endif #if YY_parser_DEBUG != 0 int yydebug; #endif public: parser(); public: \}; // here is the constructor code parser::parser() \{ #if YY_parser_DEBUG != 0 yydebug=0; #endif \}; :SECTION "USAGE" Should replace "bison", because it generate a far more customisable parser, still beeing compatible. You should always use the header facility. Use it with "flex++" (same author). :SECTION "EXEMPLES" This man page has been produced through a parser made in C++ with this version of "bison" and our version of "flex++" (same author). :SECTION "FILES" -{"bison.cc"} main skeleton. -{"bison.h"} header skeleton. -{"bison.hairy"} old main skeleton for semantic parser. Not adapted to this version. Kept for future works. :SECTION "ENVIRONNEMENT" :SECTION "DIAGNOSTICS" :SECTION "SEE ALSO" "bison"(1), "bison.info" (use texinfo), "flex++"(1). :SECTION "DOCUMENTATION" :SECTION "BUGS" Tell us more ! The "\%semantic_parser" is no more supported. If you want to use it, adapt the skeletons, and maybe "bison++" generator itself. The reason is that it seems unused, unuseful, not documented, and too complex for us to support. tell us if you use, need, or understand it. Header is not included in the parser code. Change made in the generated header are not used in the parser code, even if you include it volontarily, since it is guarded against re-include. So don't modify it. For the same reasons, if you modify the header skeleton, or the code skeleton, report the changes in the other skeleton if applicable. If not done, incoherent declarations may lead to unpredictable result. Use of defines for "YYLTYPE", "YYSTYPE", "YYDEBUG" is supported for backward compatibility in C, but should not be used with new features, as "\%defines" or C++ classes. You can define them, and use them as with old "bison" in C only. Parameters are richer than before, and nothing is removed. POSIX compliance can be enforced by not using extensions. If you want to forbide them, there is a good job ! :SECTION "FUTUR WORKS" tell us ! Support semantic parser. Is it really used ? POSIX compliance. is'nt it good now ? Use lex and yacc (flex/bison) to generate the scanner/parser. It would be comfortable for futur works, though very complicated. Who feel it good ? "iostream" : this is a great demand. this work will be done as soon as possible. The virtual members permit such work still easily. :SECTION "INSTALLATION" With this install the executable is named bison++. rename it bison if you want, because it could replace "bison". :SECTION "TESTS" :SECTION "AUTHORS" Alain Coëtmeur (coetmeur@icdc.fr), R&D department (RDT) , Informatique-CDC, France. :SECTION "RESTRICTIONS" The words 'author', and 'us' mean the author and colleages, not GNU. We don't have contacted GNU about this, nowaday. If you're in GNU, we are ready to propose it to you, and you may tell us what you think about. Based on GNU version 1.21 of bison. Modified by the author. dibbler-1.0.1/bison++/bison.ps.gz0000664000175000017500000057532012233256142013410 00000000000000‹ó*¬<bison.ps´ýk¯åÆ•- ~_±/¨ÚVƒd Õ‰CÜã>mê(ÔYJÛº%K:)ùÕ ÿ÷žcŒ\k§R¶ª ­Ô^‹ëMÆc>Çó¿ýÿë?Ù?ÿúWo2ý4†ÿößÚ»·Ÿ~÷õ»xùü_|óíßýûß¿,?­ëÛ—öõ7~÷Åo~ûÝËczùù§ŸñÙ§_¾\~ûò‹¯ýÝ?}÷Ö>ýÏ_|÷åÛxùÕß~ýÕOíì©ÿõéoÞ~û/)Vðÿ~÷ù[ûþýÛÏÞ~õ¹=w|ýû¯>ÿâ«ß_ÿé^¢ý[¶õ¥Î“½t}õyûúw¿{ûÕw߆ÿvþË?ý¯_ü_o…ïø‡—¿ûãÿøÓw:‹·~ûÓϾþÝßû{ð‘O¿úüÿüâ«·~zùÉ×þà›ñ•ÿëÓwŸþîíwoßÙY~þÍÿ¯5Æÿç‹}Ý7ïÞ~ûíÛÏý]¿øú÷ï>³ï{ùç·¿|ùú÷ß}ó{Ž„ ÚlÿÿCš¦ ×òö7_|õ¿Þ}ýÙ/Þ~÷/ß½ýÓg?ýæÝ×á¿ýáûÜùÅgß½ä_>ÇÁçoý2žü>÷ÉÏÞÛs±¿OŽ÷¿úâ«Ïñ–¿üì“_¼·ïù­üòý/ÂÏþr|²¿ÿü÷ߨý?ÿüýwï>ýêÛ/?ýî­½üÅ·_~ûòëO¿üöíËÏ>ù÷_üß¾¤ôR¦—ßýþK{æ·|¦þt±§‚žúÒ†é›/ÿíßósüíÿnÓüÅWïñmïÿ5¾<½'½ü$ýåýOÒKúË¿~‹ß‰Á&ìß>ûú«Ï>ýΞÃýüí·_ùûï¾øú+»Ì?à™ù੯Þþæå[LÛ #<ýÂó[í“x·.ç_8ïŸÞó¯Ç©ýóÏqBOï}þn}éøtzùôóÏùÿüó ¿ûô»w_üéå³ß¿{g OÞï/ûË;,Ô—oÿ«—OõíKüiŒØ _~÷ž/دýå×_¿ûôË/õÆ€“õÏàðß¾}ë_fSõßqÍ6ß¼}¯iûîÝïmÖlNÿ»-Ýßúå¯ß¾ýü}øö»O¿ûý·X-Ÿ<žÖ{mýáÝŸ}ýÍo¿}ÿÉÿC/¿´'ûÿüô»MÜJ?áÝ¿…Ÿ}Òã_#Ÿ‹ÿö³O¾úÊ~öÉ?]ºÿì»w¼ÿü×?ùîÓ/¾|׫VéÏ^ì˜Ë3|Ò¿þê»þó7o_²½þ§†ê×_}÷îOþÔaÛøÅ~Ì>ø­½øÕo>ùÕ§6¿|ùôÝ»Oÿ>9¾°OÙŽüå'Çï¿øòóöÛOᫀ ½}gcs}õÙ×/8»Ÿ½˜xÙßò믿~±üµýÄ_¦À/³MúÝüÁ~úå˯?ýÜ.ÁÎÕf\Ï¿Ú`|ûk¿²÷8Lv¨³Å ½ü,øÛ?ÿõ·ïm1à]¿Ô{þ•Ÿ/v‡%Ë‘{y|àzÿÍ×ßà÷`ÛÆ„ Îí>Çã“öÇ÷ÍNýåË·_ýæ»ß¾,\9¿yË—~ûê¥y¼ðÚŸÞ§©¾<¿žÇë¸Ç[þüêãÓýrš ßì=ŸÿéÕ›ÒóÏ¡—¾³¹üD³„C»Ê÷9{GÐþ‚¶ÆÏ°¸O¾øœcùîºûŒw¿ùFKHwÿƒ·OúþÛOÿ` ƾèÝ×¶5~ñ²kAàt§roÿÄã_Ü+ƒxv’¿|±Aóiƒò'8íO/íÏ/í·¼"<ø#OÒž³ÁÿìÓÏ~ûöó·øâ³·xÁÞ…íòØ?ùi²Ï~ôÏ/?å°ü®¬}¡K³~_}ùÂAãó×û>ðY8»çwám¿|y÷Ç¿¼ÿ.‰þòÅïLcýîÓoÿýÅ4ŠéÖ·6”ÿãý{ûMû.\ço¾ väCmó’êËï¾þÜ!ù9|ó¥FÄÉÛÏþòå×_CúúùÞÛY؇p2¶ñÃ'Ÿýö7ïí졾|~ ð_™†ûƒilÛ÷ñŽ7á ìÎvèç°¯ýÊäŽ_]†ýâX2_~û[ÿæIÛg³C$ÿonÓ ûË´,ãñ´Ìy 5qQxÁ®ˆ÷_¿»ÇFÂÚ4ù ¼ûà§Â‡?5Õ~Ì–=ŸÑ`ýïøàgÂG~ç³/ßÝ¿£aò©~!½ÕÖ•Þ~ýÅ—_~ËÕø·ÆVŸï·™ôov©„÷>ޏ œ•]Ô‡­¬o¾ü×÷öa{›Mç_‡/¦cÞk‘ð†ñÞf“tÜO¾O¾ó'õ8½÷Z¬xÒ7º]èý_¾Óç¦ÇyL÷yPô}þ—Ûe¨àìƒk¿Ÿ}r¾ÿä3|ñG%Ì¿A-õÕC Ø[±¿1_}>xå/”ÜöÙýCy¶ßs§ýaoä~ù½‰Rû™¡ ð7$ÙñÉ?½ÿì3xÚÃ_}ýÍûßûöÕ¬=øÉo¿þúß_þý«¯ÿøÕû0Û·}ò‹z¡0ûÙ‹L$Š”ß}ý‡·ß}ýÉ¿¼|ÌlÀ^ÖN¡mB‹ úÖÁ8…ŸnlˆOþ?ÿbóñó;‚ &"FÃû³OÞÚ‰; —"/÷I¿}}Òoçüòío¿þã7&~`s˜5ñî»÷áþ?ðñÏï³ÍôËOž„iÈþá3MÀÙËÐ×Ó²JÓÛ(MÏKÞÖù{¼ÁÀK^#/=¯/sÐô}ö‡wßÚ Õ7÷.{]JM?-+F&Û/_?)›ö—ùYøä›÷¸V»ÎŸÏüùÙ'Çùµ©ûÙ[šÿüOã?ÿ3ïþå½-„ŸÿË'0ÙgOý/ÿòå_þr¼òïïõ|ÿüó_¾ÿæÅ¾üvø;fšÄ²ã‰Ç_ãéÄC[0/:z÷êGßÚ‘>ôÝ{X 8ú“ýÄ/ÂãGþl§0Ép3;²Ò|_üÂå ®Çž°Ç÷0Â\òÜÝ ¯|Ü—¼¥¥NÕ¼ü%׸™«OA²úßßÝžúß ,÷¿M-üîÓoàaüÃKÿôå³ß}ûåö²½$óJ>Åz3O÷ó_ÿãíK»ýå=æÞ+þâ\ñ|í±\ñj[‹ÙDA,ý¨)÷xö¦Ò|Å47û«qŸÒl¾ÝËrÄT.¼¶Ïö¸Û®yÃûð8õ4Ù6~Æ>sšCîy/½÷Æ›}:–Þ¦u²¯Ùãt¼I)¾œ/WÀ}pe»Ô_Ù¥¾Ã•®Ñ.õWvgæMƵ^-u\~…×m×’.;ÚbovyÕ®,ÙÕã{)òY\Œã}9öi®Ë~®m²“mû†G-8Îö5ø´Ýຼ¯s]¾òŠÓÊkK×¶ç©æÅFsÆÕM/'Ϭ×-KšZç»fdž¸ëÌ0òö¹\a9ð+8£½½þ}þvùð·¯ü½Ÿþ§´Á·/Ï6 ~Énùõñ²oϹ-ǸjþÎdsgók·vb¸~=—.ß+ìÙîšY–m_–ÝVô\¾ð*Þ˜ú>•«`Þæ}Z[¹ðg_–K ötN ·¶*Çy%ž§}é¼—í(éz3ÛªøG —MÐT¢~È>wáüðuAßùøv|¥©Â\.Îþø‹vVÙÎ*Û«X”‹ýX±)å`à±QŒ6YoÕ‡ðq| ¾®××£¤#ŒÉµì>,qÙØ4^€ ¿^¹ŽË>eî#œæ”OìÛ16@¸î}ÂGãŠoLSˆ¼ÔeÇ“¶1·TÊ^KZÞ̳ VQç™G›êmJ;~k±i†%°ôj¿²ØÒ· K8Ä6Æ<¤›9UuÙÅãäf^øl'<>¶¯šñU‹ ¿øÞÛ—ÌFcK\)ÇêçñÓ„cíSXW)øAÖ0ú#;[põõ‚ѯ7 Zµk®¦5¦3̆yZßÌÌ&Ó¶¾m”n»Â¤Üe»%_SlGÛ¿Ùë¶}2vä— ^Û vi6–v6ºZ{ý„D,;L›OÇÑuLç°õ°÷¼Úxáóy ø-üæã÷ðôÓYDœW¼ÏgœzžËic°b 3¶v¾-V“ö6ìé”{ÉmC|`ð6“ÜضlUå´å©ìþ="-‡)‡Ö›«nWÍOB¤¦·ÎU’ÄÁö$ÖNŒ+öc±Ao×Xqí6o™£À—rã&XºÔCÇJƒ¤Ã…_Íf ÃÖY¹–†Åt÷øãÇ3<Û+¶~l§iwáLr|ì4œ«}ÎÙ®9`ýcw¶a.\þi—ßî˧ÀÕ7|®Š.k ñ…&ƒ&Aac!c7vÞö^\mÊKض¹b±Ø¤ÞW|5N ÷”é]ðÕ g‹óŒ­Ç¹¶_×Ðècv‹Ÿ[üg0ËsLi ’ÔEÆŒ8)xÎf¬DžgÕª³/ÅVäé¢qyºÐ€W±:bl+æ_oxµÞì$RÓÜe— ˜Å2Ü$•nVÀj­ßZ¤óMX¦Gì¯AšÛlqÆlåÚŸýŽ œ­` ¥K¸ðo±QhÚŽÎG—)X-ãV¤M n&Gí{bKRÅÆe 2+ÆÝ¹aøM´á»à m߯ëɧȕiñà=n&›x[M!­¹ãp½xFºŸp‰uJk4‡¨\ZÙ8Û³b’ç K‚ý·Ú.yoÖF4.{µ)XmÀ5ÆRʲ°4íÓ¬¤ëÂKiµ‡>Zmmåík*áò§ß„·BžÛ^æ6fnå•– }Pþ€ý¨½f35>‘h©]]XÑv!v_í>'HÕÙ¸á]Ágž׿™t\ÍØ²G11´â#Í&Á4æyL³z⩯íÝæþb‹¦&—”‚€¯c}çø°ËÂ(íÜh¸˜ËÔí¸pk˜4„ÍS Þi®Ù2媂þ=øÌbš\*fÝñ>ÁU4Oã`×dòØ–ßFǼœý°~Ú4 ¯ÎÁ´÷Ù§JH\2öUvoÒÀœÝ—ˆP±%<#›Fg)çò>{ûºV:D_ºÎMãÉQ.U´_¥dãX`cØ“Ós.6„‡-F[Îp°JZ-ÚOœ.#ͦm‡ëù/þõ«câm6; 宎·›©¶¬öTiÏ»ðJÛ¬Úh;-ûòKïZúlöÓ… u¤µkŽÌ¼³ÅŽS.[³ §ŒˆÀQáRï»7Ì_¡A°Á¾Ód’m4JÌȔʊ8Ž6¬;;ÉÂ( kþK†Œ* u¾ô6ûhá”–T=¬2cñå…?ÁeŸ¸äWhY¬"Æ¢¸s'k-ãÙÏ¿>¿,yž0"ب4Η0ã´¨Ξg—JfúÖ„ÛA/ƒÏêuûÈb' «è€p×9ㄦÿà¾úp[…ÿì¾úp[…ÚW[æ€Û9ȸ°û¿Ô¥]¡ ŽÝ†àMPË5y×÷°+²W kÍ Ëô*Ì@Çc| ¿Ð60"}¹ 6æëǰçÏã¼q¿ž¸•@ D ÁK‰6Ôc5F'ÂcíûB—ÍX§ÍÖ)}ð¼nÓîÂÅ?[`ô“6‚ÑÅ%qy,ËßžÌ;›X˜w0¶è5È[F憱å>µgÍ…Sk8µPǹɂp3ŽŽ3W›¹n5T,)¨ë‚Éà~Ämœ‹) »²ùPÊ£ƒ_°Õ“1*´8/…ºxº&Cl¡À'±µ‹¹pöž|1ó*6M}DàÇo’]¦éðœ92p¤Ö¼pqoo*²ri®H/k¼ÁZw7Wn\®]ï2^„`&½*åŒ9˜ àѼ6¹Å`¯ç1sÛ%ø–t§Èѵû¤šiÔÅeW]©óI-ž/Ÿiøk/ {AÆ0XSZ­ü$×ÝV˜¡=6˜ÒCzb8!°áäâ* ÇyïÅ2ï «¸M²úó)øG³,¨T2PNÅ­ü5Þš )’„ëÄ{(X¸…8áý`à‚ú“2„ „ß±OOá³V™|”}‘¡j6?qeôQ‘[:ŠºJÍUªôlxœÍÎ×ÑåïVÁQÐÛ5iË0ÆÖå’ê݉y³ 7Ådû4iãÙ›x¥ðwq 3úVÞ0½éÙ—ZëH0£dÀ2íc¨kº·€T ~Ê'{D/›ý‡1¸™Wð¬‡qí1Êú‡:¤LG”¾~YSdÑ ­±OîmÄ^ãàÐ3m¥P*n­?{+]&&uZ‚jžVFƒhL0ù‚s³f[íDéÍVp5;mSG°nŠ4'Í¥ò`>ÜšŒÝΣ‚ºôySÖvÞ‚‚ÊËQ˘ý ¶v:&;0þ²4 ÏÖS‡RRâ׆öB›©bîø›°Ð÷”Zu™²BéFæºû_ŒïÀiæL1ˆ|›V"Ì~I@¼˜í¨;žmÊF{F¸Gq'nԜҚ‹qÅ䘽nî6Å™¶lð Ë9A€¦iRβCŽbð4ki÷Øóêâ{h ŸÑqe²_:L:øØc+|=Ξ©cf¤q’ØÞºÇ-bÒXx\f¡wª#;édê^¿~2‚4A¥AJ6"2þ^iô)ÿ1â‰%y¥7b‰pë”rT4'lò†AêŠ_ç¯ ÐÙ'*Z }†ý•_M‡)•fF·}2I\Ìò¨$ßãgüj кàÕ(âcs{»A‚î³éŠëm.¢rlAá´‘/TÊÍ01 ÓÅtêŽÄ*ÔtPbM–æ.¬ËL¯_¨‡Ø1¸xC€ Þ……¦_n!v+•R¤vðˆá³…´¥]-GÏ.õQÚ4çp™y  •)Ù]Ra"nk"ªaB:>Ú¥¬•ÃúâNGk‡" s«?ðeÊNÛ,WbšR‹2¥NvMûÉ•.…­u&ûÈsá‘AmG6¯Èþ˜ù8eÌ0AÛüp ¤}yÉD‡t¤<Š2ó¶7§p¯†cTˆj¼k›VA š»m0»1ˆÜJI1w·H‚V4E§vö-ž—iQ“0¤ 9¿> M^üŠç»y3þÕÉPãI·Ì|Øi†Ùº aœhÞ(MCšiʘZ4SÆ8å]0:€­27l@Fø¨Ù„~fÜËd3¬ûøe0÷}ÅŽ0­h_þ!6&âøvM+t»Â©ÀØrfN‡©oˆ]!‡€ S? §Šð‘·®ó†l½ŽÇÚºNˈ Cœ"’u)B!ÑRèBaUu=œ;M™ÝpÉ|ø™ƒ›&á#zÕ¨#€¿‚hKÔGa’y™’€G«Œ^Û_…_ÊÌx~µ_…Ì;ºŸòÝ0žçàÖ%Z!âú8Ÿ‚C\F‡wáÒ<­Ÿbñ¨OëmÇkòª5£tð[ ‡OXÌ‘€¾˜U+B+±cqä‘c77æð5 ™ ¥ï€7~Ã<¦ROC† õX!VLVI¶S¨`¡Òt2kœ²w\4Á(2›'Z¯Žb®€ ƒ™è{n&¤Ó•ׯ5YZ[‰‘cXä\ð xo%²4{òÈ–H„+·B5Ñ÷[ö\%Yô´Ø¨ ÷Ÿ¹ áGc´?{ùìwß}1àè¨-š Ú@µ k"m†ÓCôý+¥–TßÌë þ9~æ;üŒíúOìál?8-Ä‚3÷ ˜$¿œ‹ƒþ]˜îv:¡R{g'Êp$$>[¦os™B6ñ]ûx¢ù¡çª€¢…]R¢2 Jöâ Þ^ÃØ4¡3@\._Q@ílÙf}½VDÐ/–æ¿Ð8tþ¨ËìáÙa 6ºúºÙ$¸jA¥‚\™:$ºB¤M1Pnn„€ls‚cÎSy“‘ªξÒ<fô³ðÅpnaNÀ¨ %Ž Ê0 Ð ÃÆbƒGsm’]&/žc¤ÐŠã¨Ò¢M–…<Æ#ZR ƒ@z1ß0+¬h™±”ä2.á1 é—Ô8‚b»dë·Ž/˜z¼€OÑ>b€‚wˆ`†Îh8 VfÓÍh4åÀPANö÷{Êt€%Q@l‡5ðk“"ãX\Ât¦.w§/4΃áÛ`ÎuB°`Ô†Ògº 6{§:§Ñ˜NÕÚÅ«gÅ»…Þ†Ô´Y¸ÀÂDw¦·âUÄ¡;æïòPGqU³M׸‚,¯¡º¢H¿D›H FØÕø(? $Q9÷Ós|„Öá¶&ÚvœiJents“K:ì„‘–JH`ï³”Ô¾ §" Aî@#D² ’ž,Ã[ç(H­Ïè¨ÌΕŒÝ1à׎Ç4™ñví'\ ìÞ”‹1'stÎsx¥hÛ.0IîZq XüI°~ ™¥Å¶ P]¶©ÌvJ¸ÔG»2vˆ¤Œh"¾9=¤–˜¹ÀÐ+é†óRzÙ"e$ì¤14'OÚc÷¶¨=ëp¡=1ÙtÁ l>ßd+‚‹¸’Íão—”ô£WÀTvÅâÂ@ƒ ¶£#x¾3¨åÉÊÜG!®Ž–äåKl,£ì™n Puõð“bå1 ¼ƒ‚md{1ÚòÑÔ("¨î»æ‰¤š`ìÂ4\Säú1O09à <´° ø »ð2âNØœ ÈN¿¦)XNLÂÚ$¨KÒ$Ÿ¾oEphøl÷±“ÛW8weÒ “¨Fó´˜6®C¹ wgø˜Êš@+ú‘î%EH^›ñ´èaüWNãqáé4šF!¼F¯þz^‚Ä—`+7r ”Ž/Á–´#—"A,/œ(™ÄcpûÐÆdšM§ó¶eXY“Õçø~V5øÊÁÕØÉÉ/Cª?Áèùð›OçÀsÂrTà©ô;×ÌTä fL/=/ÇfïEynWÇJ†.¤b/D¦9è¸Ùû³Z†,€;Heß~èKÌzž[UŒ\LT DTÑYçòÑ·™-x•ÿËE#µ¶„\Å(‡púÍ¿¢Mñ;m dô”¿CœŽ£µÉqŸ>(ÉuœØš,\|„÷b¥O§0N—¬.¢ŒxTá³IÐV¸v {ÚO> &p}pò¯vDAŠs 3jÔ/ÍÞ•ï]{ÂEñ½Çö » ß(yî‰8iþ¨@d{”óA‘¸h·AlÆ„ªÌÓV-À ]À ÓfJy£¶Ûz¤¶«Ì©ÁÔÚ ŽZ¶ é¶š7¡íí½•‘|h}–xÚÒÚq6²u6cqð¢"µz{p³‰‘8Ï¿x~Âù°*7Hйr†‰L²Oµì¶b-±œ*Ë¢Æ[Q†¦‚´ÜF‘Zb@—avhÌrœŒµÁ‰½vB¼ÖU,û«kPu6‘—\t³2Ê#ÛD‡´ÈdŠùÆwglQé/aPuÓõLZfæ" ¬&€YÑXzÓf¢mY0¦k„=¼L:´ØM誑þ•6i¬‡-0Ó°žMåÔøÈ²XÓYNÉBlŠè“ƒ§PVæˆ=Ûâr)¤¸9N)H7°¢`VhãÎͧÅ$ÓfìüÇ)ì“þÏâSa||¯…^gÇJÍí´¦ªÜ²±óWbÝlÅEA´`ç{ãNðÏŒ™ùÆøŠx:ªÇà›], Lݽßþ¨n3#ˆú;sm%Oâ o´>ޢܺcþk.^>ãQ*!êD}U¯½J£VÆ+@.^c¨bg£¢ÎÌ*hEÉR¤Ä¨ˆlCÊ<æëéÖêÕÚ„¤3ȸ£ø»J• Ë왼CZÒ½R ,í•Ö®£rõÓ‚ƒÈúryªßÇÌq€V…m˜÷† +p0½fOÉÝÎ`¢F‘øAÈŠ°3+Š­^P“p’4í^Ð(© eñJ±ÎQši]&‚ÔlôÃ8 ³k=ŒzÑ5Ös¥”³ÏMÛ˜ÀÄm0¹Ó»ÊXfÛƒ†6¬Ï"3Á]U1 Ù :ÕˆÀ­Ñb&«¥E?;nY;˜Už#ô`…æøHqíIÈï¬"éÑ“qkiR‚‘•H› y kóþºoä®ÑX,µÚŽüøì„ïO÷¢q—öjj&JKÂ4 8£B|Oðéñ óFãüÀóäÓm@+F‹:cÏGø¨ÙdK|{“©{»ˆbƒboÚPR¢ôeóZ8õ„0ªµ&E Sþÿß“c*C^3÷50I;VG<¦ôQ&OWj^½þ³8˜†(ئ}.Û¾\^œPëC •fƒüpÇ©³~z—)RT~ªÂý ²Q‰J9[PEW«æ]óÖVO©d/•Žˆ¥T.«@!)£…I~ÊhÑÙc²Ò¤§¸Dà1~ßWôíž_©qoL R2[¥Ãé-0¼¬Ü5öž0J„ר¸ Õ÷À`Ø ®a8¨rN;?¨ºPÂ:ËÈŠ9æKdø;bËц„&Ñ ÅÔŸÈs´öÍ^£óÕyfO°*õJtNa#¡¡t ÐÐv»U²cÖ¼TÝ‹Îtåòç² Ñ”3ñò+¼<Žçž}½02¨è@î§£m€#ÌÂa¿Å¾.k¤s]P­qð¢t Ôƒ&KÕ‡Y†< Ç[Ÿ.í¿«Âg˜W˜MǨÍmÄhuDÅB”3Ò4ÊOÝuÒp“ÒuB؆‡±êj`ôÅè6”¯3*J›ˆÌB0Í´ÆzËùH7Àp¥PŠ•FR° ‹ÞÏãi8a¦ HLgÚÆž ßFH êàíó„É"Ë[K&J5}pîqÅ‚¾Ü!¬uh0Á`ÉôanfúÁxáĿ2*Ù9Ø2-.–©«pf@àïÐÜeŸ’M‘Ù"„À‰Éè˜G¬‡eZÀ ÄQZ(µ¥æ5oHm°~›ëHŸ€˜¨9{’WáY` ÓÛéÙ©Pu˜Ý°H[Rt‡j#Šþd9ÜîAP5b@ÊpÌ”Íßs ßýbR ´GyØ‹Bg/P)ÄMˆ·e~^8¤cvëifÂáÖš./(Q"óÎÛÀåÚïŒP)Ó¢cgª‚~ÏѾ!8ú‰•d> ¾ éL‹üÈçAõ3*ZFÙé êt>Iø`âe$y4i@=¿Ü,zæuè1$xí_óЯ6äí¶œ8™&š¸’Û€mc$|7 ‘ èô\s§¢š ‘^f% M-p€bÎQ×L‘ôX‘è¿h×¢f—‘ém2]¸õp{G´Š6ºß[|k«£èö–`ðdè__‚J#–'–‹"$[b¹«KíU̬ë–\‰®å@È›ñ¡>†O+6<¹´Ópi_q"Er=ý˜B²4>f!.шª»æÛ¯Ûð£fi£¬Œ1bŒXÐÔÿu[C¦Føk¶P4²4þJä2g&éý2iÔ6ÎþE“„óÊ]ªê“»®Ÿ¿Ä¢|ìZMÓË8¼ïˆŠ‹ÁÐõ‰Ž© íÓ⫟F£wq,k“Ë‘tðÆÁðÖ”äì2Ï£ MX•$0A {µ9RËa@ÿ•³t*®1>ô©ªgäüŠ’XÌZaE zT:(˜‹œýáS’„H^ë¡4daà¥yˆÃ¦ÁŸ¦¼µíõÍ.óP`i&è&ÒJŽ/ÉšW%¸íG*bšòí@•¢EÁÕVí,è@´-Dàš‰>åtOÞˆ#ŸzÈ °½nã™™N“É‹´xK Eš^ÒüÓÙnÂ'öTšØB4v½¼6vâ„£Q¤*æ;NDp51uxá’šÀMb¿y¼ö|ö\ÛPÔœ¤šÜ-žU¿E*Ó.¬öP]FþÚÌ™Ê=Œ#1D“œƒ,Ïf¹}ÁíM,ðhb1§¦È›ˆt„:wºst¯£nB@¼µF‹<"ÜÕÜ‹„Û"‚â| Á¤`6´×§/dð˜4š²á£‰«ÿ‘H+ú]j 09¦…cÚ9èÂ3-£omÎ*’_©âpP_8Žéõá˜jÚ{° ½éTA2ràzlÛ¤=mNãŽíÁ{¤94×8&¹Á$Àã&ŽÍIx¨å ûN‡¸ˆ¿í¨·'ö¹•SEàErKïÕhCùèä“Ê ´¶åë)>×èRÕ´³8†K¿…ï +סèúÂ߬a‚ W[åõ#ByªÜ9oÖUŒT—bœÛ@3Yý°eeª(Ⱦ3iÜéñMœœ½G7é)—0]ûLÀõÓ¸šGæ‚, ´f€ù\¤ßò©ü#ÍË¢4ŒYŽûE<ï‚öÈvŸ`Ò¡,•#'Ói–¾‰}ŽÕS°ƒ›ŠU›’E›KR‚;Œ\C'¶À¹I%:HÿôTa‚Q<ÍßßD¬ ƈóañÂsÍv•)Â/÷õÁd¾ª;õ~Ö® Hpd7vMRҔǙ!eHp=fÝÎ ýxn,{#lÖ=1v”‰²7Á>ic$Jâ”R?ô¼UR‚üˆ¿åCžþð÷ó‡W’ÀÁš€üÓÙem’¦"(‚,êÜyšK‰æ.8ÊÝrg†<m(ȬAÝ$™ü¦g³oK·£ E±x •ÔÅX~µA¼˜€"^leÅziöpX_/´BÖ'†Ì6?ØûxX¸(@GZæmb¬fottšXŽêµKa]üs¬Æ‡ ¨:›në“ÄQ\÷.ï( rTÎûY‚o c¼ç|Œ€Ñ:(³ôDår?媀`Ïβ« Nu‘^õ¨|¤nuÒ´Ëfî?>c0b˜·;cË™2¹å<ж‘mD€?Éž…Œ¨^¡xú 9ÈÀ ï¦ I ‘æ¬èOƒ•´/‚ d –`ðCH"à°iÖ\^Ž•~ôÂ5hh3ÂÚJTAT1á‘Õðtð– ¢1ŠQ~«™ægv’¸Ó81`ùÆ$ä‹Ç݉˜Ve‘¶$5Ñ<äf‹RÀ¶E¸–àÆNœv öÞ˜XÛ3¥(­±­³µn>p •âmò‹]£€”¥ú²…?©^ærb†5€F ¼KP1{ÁºGZ‘M…ë«Ò½šÚ=˜ûÏôse1¼dà}‚üžs9¡_Y÷¥º˜îŒèš*ö,¥Gì¼¢ ©Ýüct¶Uû ©$š ¯Ú¿Hpp+Þïr~D{ \¾ެ^ Î]f¨jCŽJøQðͺøµ¨{¹êìÎæÂËÆ^Â×D}Mõ/,]8FŒ*'BTÈ™ú„T$¬­…è§›ž¤YÏ{ú‘Å7ùA Þá Ä‘@³EOi£u2¥\œTã‚sgîù{td²…ëXÖ6°qðõ6*3d¾3­Côµªï \ƒÅ8I³ì .pfq.TÜ&¢À1¬ö&L Cªk÷2rò$©‘wï¢1~eŽp{é…Ç™ÇÓ„¯^.±«l^g é$D…¢¸'n9džY?™ÞAn.£|©‘eW>ïrv(83âgYHÏ਴R1³5ÎíŸ5|™Vö/é[¾¶™×å4ã 33ÿG€ü¿&}½y˜ñ%ÅŸnËK^ÌÅüµÝ™‹I{°è(pꈉ.³SŠŸÑŸ¨z¯˜¿hIí¶Ÿ‡µÃ95oû·>xåC±X ôglÕ1îß$mxu°žFrüÁ­²u*]1àJ®ÙŽ+Gç9¿ƒ!W||Dèq¬+2 wêË!Šº¨) ;è„÷›Px?™ªZ(ÿW\ÍdqäW&"I ^X¶ƒ8Áå68íçñƒóÉcWž”; º‡Q÷¢ô PR`ŒGØE›…‹†‡`+"7Í&0’3‰¢úF…ߢ‡Œ¥ÑCñѵj!BŘÈü–•OóË1æòÜc1 “i`±îÙîæPPûcÃËD=#ó„Ï_Ì$(\ú¥ñbIÆu`Mpö§ÕÔ[Ù5™#d² ø¶vÏÈN‹­©uãRYT… ÁG^}1Š©gR/ßÐ$Á¢"†á¬‡F½€9&ÃX¤;OZ+.2'œ¤ýUÍ¥È&Å€¤d!ëÓuqœ¦¿¬et…¸@Dd;æÀcSè—ŽLõ³ä̱Ð>zÀ@qdF¡µ?QéŠ.\•:Ê~Ä ¼1G~xSGìåð`êÄ35Dnæ=‚nGã/„tÈå®W!vÐ^+*;í¤é‰¬4Kš.PŽ8Òªº–ê WR Ëâ1¾Å‹X]Ù>ý0¾$oe=*f^Á&gc¸òXFÐãÑáB¥-ª7¿Üec…œ–¥‰ðW´í6'Ò$çØõˆ²œ²•vƒ¶3Âq©Æª÷kL·©E»7wÒc±ãûowQTc:"6RÞšMì1oú+t„ Ò4FQU{Ø*¬´n£ Ê9+¼g[ùƸ/4Ó§ÃÆrçX:áÚõ \M¬ªOHçRé û(Êgo ƒW”¢1É<ªŽP8ç1&A¯ð&ÕÕ óGIÚ´;êT͆®ñaLŠaÌéºLÀo#I 3BËɯO°¥‰²<€c¾]dvrAÌCžœ Ëa¦NÕ“J­éÔ 6áðO¾“©Ñlý1|çMñÇÊÒeA”Ø”Š.éàg'Ég„¨™Å4ìSQÍÓ S]ü02™9M€JMÅ1) f£Bî*i|4äÀóXÎAzè¹?‡|íAJ„¦Yûíæ<7óiV †ÔXs?&E°Ë¬l1nó$˜4å¶ –ÕE—ØRàqz“Ga¬ŒW٬«T0 &#`ó’ãÊ/#šë¹U¢àDDß«hÐEý ¤±zÇÐqhÂ\àø¸ d{-ŽÒW®pªP!0°ªà]Q Ùê1r¶£äHrS.è ýŠf4¨ôÿ®‹é{S,X{)º›K’“ʨýóÞæ¦OëûyN×#Nýa‚‰&åõN@¤˜/7)µuã½BÂᱩDréfÓaÕ’œw¶éÙOÀPA˜-—$Ò§žbBYR(»[†GÓ:èí´ê0Õ@$ù˜Ž@Çv 9;yn­êkK³ù6°#„íf¸‘ ÓÓMŒ#Ur–ÄM¾cnRY­zì¦HHx`BõIãEó]Eü°øF‰¥T/“)¸7r Ê¢xšÐ£ØQ€©…!í$¢¤Ø™*ØüZƒØÇâä= Ä8†ÈDeFg%;Wõ㣟>rö%c'¤Íä÷x`¾»õ>;Á㪈{#:•·ÜP¡D4`­’ù øú6WXѽÍ}îRº4­â¥—ãPª"{pOžkÓËxõ=冎yoþâ }š1Í.ÂM¨Ã|ÍZd~ÛœúìTõÓi×k‘®é*áß‚Ës'ÍœŽgyþ»b¤T¨û­±Ñº˜!WMP`VìíÞ!5Ê0©ßIÏåd‰ÕV¥I/“·¤íðì9¾•h‡ëhØú¯jH“èB§èNcšØ¥#Mé;y®alh±JËäÃ[eê .óæTŽaDã'AŸôަnMXºÊÆ¡8 pÕ;h†‰·´‹jP7#ß¡lÇQï(#´Ö„Â¥}_ìûÖ¤|á¦Ral`qÈ‹™m…¶SÁ4í%J¹â;ªªÉ®Ïl“MG¹u¸Ê„y+ÖoãQ³ÈÈÚéÜ6Äpäî¥uÇí1ï·Ã\ºoò÷<ÇEázÒ§³/')¤5dlƒ«Rb–é˜2Øaàõ&Â%^Ö¡úì§µÞn»"ÓŠíàQ¹í‘êðjªçÏ ­fÁÐé÷]Ô’+YÆÅú[”¶ìžç8øÙƒÌxÑȇäÜ̹®ÏòÅN=¤ÊÊŠþ'zŸ˃/¤yJe´#ï…åK –îæ\2g‘6èè”: !©Ÿ ¥.”ø£ð÷.Lïæ'M Ê´=‘ÞàXåv˜6‰€­†¶ÒÑ/d…ºÔü‰áÁ¢þUÙKˆEj¾œÉya)½œºu„½3¸fšDäœL.ÈÇÓ=(*ZG1u—TÙ$;vúì@²”Ü¥tŒV'êQÑ¢¬ÚÉöè^aÐ8 ^™t\¹ áJÖÒ¹k²äX+Òœõ¿x!Ác¸äоd¼ØìByÉ-FwóB3pö¥h„ŒèS€"P‘ ì{æ¿ß^N,ɳrBÌØ¤²âM”^t¬{«D¶ ¸4¸õ`6+…A÷“R‚% ¶[§‚Z¸âËFâP¦ºûéyüÙwÕ(lJ„`P5ižRäé¹'cƒ­j²¢„â¨Úa: •MMŠ Td£Hb¤ Äè­ä¹ž+Œ‡ êªVK‚+³Lªð\A~‹rmÚ)ûíöØþBdÙ6ÅAÑÄÚüitj Pß\­$ƒ—ƒÙ¢è#”§Ç I] cîûÍ7ˆöAœâhÐ^Sq½ÃØ@g>àC UàµiÐo°’Ouç±ÀE³µ©Ì~ØwçEúûâ^¢MÞõŠ÷ãš´‘¼@ _rpÀ=¥Òî¢ÎÑciŒœBØQtYP°Cf ´a2½ÞÞ-kn\í£'œ(+…X ÷Š(ÓB½­ˆž™Ù¤@Ë¥xl/ˆí(jU1ù‚¦Ê¤º[!å×¥4Ñùe<ÅÝê7a4„ Ó˜ªÙYÂ5±]£Ì\ 'ÜÝsF&ÆØ¤Eœ–»àðèCe °Pd2¡{m9ŸQÞ®âož'^0ÂMæâž6‹mX„å #Ü!¨¤õÕ Üß8Kô@Ò«êÝÔKbÆärP® Z䜠Öéà0·‰^"²‚ìÀ !zi3󯙡&¦’ÔR–Ñ0‰ÐHÉ깊ëʇòHâÍFöG‰*5/""½«ïäȦˆ¤­ZFµý3ñb5äÆž ¶çZH(&.,îR [¹'î‹›Bc…͇¢&Ó $¦ !;lÆ;…ySÈÍWîS üÏ¢ôïý÷ÿÖ M·‡m’[).sÚ K‡£UËq”`'#hŒ[œ¢.=˜¥TÑÍÅvÂÛá¨LèaemþØ«fï¼RæÛò!X }»Ž~Q{µèÄ;È0¾°y<(W5*`bÌ}L¤XX÷³B<©dë‚´$lÍE:8Ä·.牃3’y>ñvú„©’†ÄHë:«•ùØñªÐ£&åœæ<Ù¶ÜË#sŠçxÀ·jsðèi{È ¬®‹.Ç[ÿg·Iû俺MÂ4Óß–ì蕯õ.Ó‘H§m°}à â¢Mþ°úÑÀ5­®ºŠùÆ5ÔZrlPó-ë왎×ì¯í =‹hdR ˆ¦Pˆ+Æ¢y Hž‚4åÒÔgá~ºÛ«xªÈNëz× Té ‰ÔWdól`Oì1gÃÊÞHºIâä‚yh¬È_صÜ]¸Ð –E¦aÀ‰G‡ªÕv?óØA"é¿xôh½4À¦R© ÀF¸þmVß [}ðî&0I€kRå v£bVÂÆˆéÇÖ–\<–°ìóƒ"yO,L€L!7 Ÿ+ÆÌîÓŒ1\GP»4Q-@Â(Œ¦ NÎÙT" ˆ ÞÊ[xöè‰V±d¤i÷²ÒA:L9ãá T²W £‘ð@ÞŒ{¦`žŽm-uñò¢2…¾1P8», ¨jvYHƒí‰šùÎþ0zÅ'‘ÃI*fsgúTOÛϵL˜= \L‹Cå\,ß±åÎpÎð” ŸJŸŠ-ûÕF$WóãÑ¿¹«òO“—üF哸iŒ(ѳ•wE©òtOQVõ” ¶R¯˜ƒT•sõEIA•åê>"é&-S:#¨Éõu)½€&·$î@* h 3(È%nƒ'Ä?;½ WÝÊ.áÍT»|R¤^ñ¥Zä/±PB¯î‚J:0\2zUj£+þ¬¸+¥KÞ!¸¢$¿( DúˆÒâ9ÅWNó~;Í¡+ úLA@œRP´žÕŸíH«P¹’¼”»¤8z»1´E¹;X~·ØAúh²=ÇËÞü²¯בQ¡B3ê¬öœ‡U6GÄW™/·„i|jI»Ø!fv^ªÇ΂àÃòR÷¨½`p¸>…žÙ÷cÛØRt¹Pz¬{dBSriO• ‘ò}¿;ìéŽñ6¤iMîr³‚´Ì…ÆÆ×½(izÐ3˱T àµæÕ _ È«<ª;„§ã'›s\õñFòAoïÙg[p-Û)²55æL>ãse´þ\¸žŽä¡;áL>Й§ÎÀòKì'WþdŠbÝ(¢àÆ|Ø÷Lê?ÜàÅ#éÛœËÖ&~Üx›éCÔ‚4L*y±²VPÈuªêA}/a¦S 4U¨ŽOx >LL%§h[iiG6BÙ¼³àŠÆo+ÙñÕŸî¤ÌónI@ Ò·&(ÞöxœDÀòß ù<4]§ýâ Ù°U.nÕ£\Þ'Q§ÇªÝ.´:!°öm9&_n1´[îÏ€òXÎ`å³q«¶q°N[˜k76´â6®¯ [·&º‰†®¬aÀfñZÉÔbA±¾Â”åüñ$L(ô­ƒÊÉZ¡†Ç¥kÙ_(Ñ&}ž‚³¤¿„ Y<;x81«‚Í’^h½‚GYØèœOÝßB†¬&(†˜øáV-l.(sžæ,#oÀ7^œx‹Ú.°÷©þ“‚³žsÏ‚cÈ `²zf¦$= 2ò GˆæèB]—Êն΃…ÙãeÇ»ž@ÄKKXÖÌÒÄ‘'°V%~¦–¶U?­å*¡fÄd§K Újˆ%ñ?ýxWâ·æJüêO·+±s%~kwæJdVO£JVIEªƒpg’uˆ-~O·d'ü(}d ]&^A4e½VdßÇ™ËvïòËD®ŸGEa@9µê™ S£C7÷%Ÿ³-ÉÖæùMÊŒ)—êlø±ùжÞÔP îÅ:àÖÌ«Â|”3@ëµg¡ÌtóÎlت#è.Yÿ@‰u=ßïÔUõ¼ö}ðË [$ »LÞmÙúq;¸ä€fèö|Ü/Mמ1"¼8.æœÔ×üûT"­½©°éKfàŽ',}â ñ(‹¬‚oûàÜ„ÛãÙŸ¢ýeƒ ˆ†^ž#ÖõΆ¯€ÈOšví¨ñüÅ‹Úóøt ‹Vª5bôÙñýº´×3&Uéw©Ö5³ <Þó‹×Ý åˆ`”¶SQ º'Xy@صi»Ñà ÖØéìl™Gv€ÊM¸ôh¼¦÷EÉÛXJEg‡*²R&V \•½u²éádqÔ纒/ìÓ¾LÇ\B)mÍç›Yþš¡ß«*=óܸJé`Ö2 ³¬He‘¹¢vvæÌ“Œ÷«32d6Ú+ëêUÅÔ+©N{WMtÈö‡Ü×Ç_Ã6#RöǪ́b–-LÔÈ3Ç hŽB¼ñÌÀ7³¾¸æåØf%ònhYäZ®ãîµQs¾„|d->7½Ú[ nIý± LƒÂPXãßAÏ5PöƒîÔrnÝ¡kjäo(xêÅKò`¢Èš 2ÊٸôÃÛ—b\`L8N+ËäGg ¬lÑP°øÉê8`¹1( +µ:V8âP:ñ;Œâö»©S€ÃkÞ9C)Ô†îÅ}üÕ¬ÖÈ;¶Ù»a¦?ï„ྠrbá9†•$«ý»(ŸQ‚xEaš0¼`lãƒ+’±Ñ |Z>·UyÙçZJ%´]W¨¹=à1fæR_Ð KP† s4Äv"l=êO©‘—‚}Rh‚_@ $9?½Í~€|E{lYœ™š˜Å ÉE@Ì_!Õ5Š$’†dÎ×BÖ0„J Æ£Au›I¾gKnSÝ|óÂZDÒöž³×,,!¯Ðø­ð‚O¶ˆUÅ©€¢JùÎA¶ÈiÖ&#fÂ¦È %$s–k¹É¢v_c/ŠÚ²xcïÁ&ï+)7K÷…Ô¨÷Áv§ñT0PÄ^M…ëŠÅ ‡-ÞˆF@aù »”z÷CaÔ_DŽ”$­ªCs'J FeT[a}‚kS×uÛÂqs$̯Á_•VŒwU¼½Sk.mó(e?ÎèˆÕ›TäÊ– ­É›n23Ä",V¦êØ]ãn¾ç5›§@ân†;„šV; ÷„à.íQu‰ HÂüı™Ìs»e™â8?䜒E“ ¿D*´¢!­NÛü•MþðÚ©ö=ìP3»Üƒ^raeôÀÂQ·z±þǮđw†=y?¶'Ë"üvm*A=¤¹u2{HÞÅ»N«s¶w̦(>5‰@ùµV©>M2Ö€œ¯MÃÒÑï}óR¡ê ,fQÉ⤊&°š{>—ª©!†žju¤  Üî5–Z¤} ^•U„wûç>¦Õ3wV!½‡œŒýíjµÅÖÆ4E ¥å<ek›ë¡t´ûhkq»"¿ÄÝŠŠü®´­ÄVã 2‹ÅR#ãŒUb-eð:¡J–ÆGw„AƒÆ_¦¾ÈS"<íÎ`ú¤5d®¢9Æ,bSæ am¯ˆAtkÂù€Ä½ùUjb|>‘d¹‹~ª§T–J¤h£‹%îGE4iz•ràŠ4b?ëM0c¶ ’ÏrJ"ðeŸZ-IžpÊDr$µ¦(µ:õŒ: G`8u!iaâ|r‹áY¥åª4×·á?nzÒ€Œš®á?b»Ú0—¶ëRa_bJŸi6ÌjŠ:Ž;û8$…¯,ÒFD*ÓôÈÁnøÍêhéä,&Y`¹ €Ý›ù(1í¶© <Þö,º0ØÆ:È©`“çObýê¹ÎçfÈ;YL¹y7[&ãÖ¤scqèFL”™Xµ·Ú"«³½œX1ûså~®ó¹… rAt¢N¯¶;ždÊy™Í9mÍVó›QsêóØÉ7›qAV«X]¬|;\)ª¦Ç_(â0’Ï`Һי|‚«-üÍšðªv½Az³ƒ Á$dV'j]·Ç¯Gz£íÁ2¡ è}ôµ.Éæ·ª]> ?ë²&ÓÒ|jMxncÜVæ?ýœðµ¸×ÕqÀbØ èV6;“™ }>l¶Ò Hg‚#Õlš]î‘ed§p.žÜè5íˆÊð,˘ó‹Ë3Í ³brH @¥kð7VL-M­B/¦ú³ShPß±K.@ØŒd va›7<†vFuÿC (È’6Ð8àž³Õ®,ù^ƒ Á¨(£õ'±“Øsô˜Í,™Ø nò@·÷AŠK#:ac«21˜ô Ó¥æ7±L±M1n^¬‡ ý0ivˆ$ŕ͞œú"“¼µ­—¸®—™H*"FÅ&ú*ϱ‚|æabDñìÕóPG 8`¶ü7³¨ØFô#k?<?džÚN’ÔæTrÁV#éhÁˆÅÈ‚ÿÌ¿>þêRÍö=ér--NB©¡¿ž=ž× ô­Ó‰v›“)©5¯æÔ‘q‹&®¼²½†?l ¬dV;ŸN%%¯­ÌÍe~Sd¦`™|EƒÇA+—?Gšš‹u; ý>+Á$P2¶z0ÓX4öWB]AOv›Ìî$˜œ0 ýç6º1J£¾uå›úÚ/×I(¬9AQ/ãmìÓ¶°ù*;¦àé™…5~ ‹•V¶m"{Æ~ž'b[ßN §×ŰoS˜ÐWÛöØq¹1ÁxUØ’x嬱ÚEº”Ø-HÀ>Ãg±=„ís_üŽÊ¡ñ[pЂÁ¼TÉ´viªÙ¿+ ö¸\f_VhôKÜYýf×…¬Ž­ËœuróùJЄ'iþ¶  ?NÒümA~œ¤ù‚æË-i0íBª< 4¦QÚÉÛ?!ž7þ0ÜŠ6²*–$‘òÝOÈ•Ñv‰òO{ˆ‘ÍÅH÷²hˆŽpíÌ ¡Ùn‰’‹•°˜Ot&‰èFÇŠL*«ÂsìEÉÁ´ËÓ««B·([ Œ,3m¨2ª`Ç烾`YmËfñëëß¹)g+rËpO‘A³MhòdSÀƒü»JýÃnäÎîZæ¶´AG˱@ç^ìÄc—¥€~uÞß4þ„%aÎñé–"ýÝúÉlB+¬ø>šãçN$pIŽIˆ]B&;]%á:ëÚqašKX_°Gr*ù®ÄG,°ˆÌÔ©¿~hýeb¦˜ ’ü Žèº¡ML»ïñŽSØï[qLæh²ãË i«ù*‰q÷×qñ qÔyv8 â¡-ÎÕ…#¬vÞòÉMŒ" ´þ³—Wð=ø[7Œyh{™1Õqå7`WÖX®FÛ¼®I-à ®®µ<„8$òÚ@FÈqãÃZx 48„ñ¬ñIClñ9²†Ç`¶þy‡“èo÷Gð_ ÉêÒvEûzF x[y tùóvF€ž™ÒDÿ¯´_öµ8–‹g'Ï~óÃ&Ó›ËãƬ]e$f‰àžhŽ˜È}Þ âBöw1ŸÙæ€Qé! G€±Ô~5˜PŠ·¤=FºßvZ“ðd®Â–§;¥b#JPö0˜ô³ë KT€HG&:—ñH4Å6;ÎÿpÇâbeÐp_l纣t'ס¹ùDPî—?±ãùv&,õ3Û0ÉàÓ¬¬öIŒlZ¬÷—'‚žãŽŽ ñiÃÁ±]$é{±,»zŠ9záà$Ì£p¬ÌHB¨8Ò§wœnÃn>Ý,kn–!bžømšÕåa“…:ºwAs@b¯ª×‚QYÅš²ó³2¾Cìq•5æ+7_èÊ™¸Ã¨ÃHÎì¡0¾n[x‹ ŒÞʲcKá'ÖšÞƒšd ‰?-È…»xÓ;ǵ™ l?* ÆÅlspZøþ1 ‘û‡}b®–Y4ÓÌfGëôp´ô·-ÁF£þtæÃͲ=Ï!?ä6é÷ÕÅß 5ÐÇ_€‚¨‹Ü<œÁ+¶¤f®ïŠgÊŒ\vA¤º•IŠ÷@ßçvÃÜAkJfrr¶ áŒ~òD»‘l6õ¾B'„bÚj{c4ˆXÙÉOv3׮ѤJWACñÈÆrÔÊÛEŠÁ£+‰ˆk÷ÃYÅt£ ¾¹ÃeÑ›£J—šZì^ÉW¬ …²W{Â{½‰ˆñ]QÝ(µ®’Ž @Èôüg»9&h¾ªÀتŽN,Ue²1Fw_@CÔH+º°Õ\e lZAb‘(%ZѰ߻œ6”Fhâo}¡§2qySÿ£õ7bâfï÷³»’—Eˤ/çÉ¥¯²~`\šêA̩ˋ6ô^‡ŠÉ Xÿ¢®~ì0u¶ØYǧÄV¿*h•0oƒïwnî,´ÕHô>å;wÿlXyOY[`ËÎï9Ñ7€^ÓŽP?¶(Vä™;\™¢kÒ‹.îE3"ê~_>H1½ ù/HHuOL-^Z {«‹Ë‰®0psЖ]ß4׸*âƒäŒkºtMj5ÓG{ÆÀf»²ê´Ð€–Ÿo/¯AHyíZg¿VDX—|ñz/8ú%2ëzÙ9ÒKxËrbfðdñ†xþÀx5ñȉðSŒ§1‚€v`À—Á†¥w$îªådÙ;<äî­ñlWó¸ñ¸û{.ûò®Abæ—uúùÀθ RoóÓñÏ8ZÛ ¡ò:·&ÄåäñQŽ2Wåì3ak!gÚI ­ˆ®à ËšæjA«&aÍîé `±5’±_mì—ÕŒqŵñï#†ˆx½¬¶dì²QK §pWPlò£qeTíÄÆ™Œ(W0ëPIâ‚9ô.tÂðì ‚ÛÛð˜¸=¹e/[˜šÊ†Þ{HVÃïÍxÑŸå,ÑësìÄ‹¯8Ij†§ YØìq©ÈÀ£²=¸0 ¦@èažêâoEÊ<.ó¥³#©lÔÌã‰K1=ËGd»¯à*XÅáˆÊ«¾¢l÷çp1õùhÌ9Þ†¢‹¼{±Ùßø5Û¼3³áHu73.û Ó <‚˜ö^”MYuvTb{çí(7{ÀÔ»›6)X“+Ìéð`[aóE:ÓBØ(S`R¶+)$»IÌQ•åÐbÔDF_¬~äµ#^õ<Èî4ƒQô­ Њ7ÚB©æZÃA¯@ø3»Ú#Xܶlb3iDB"‡”LÅ‘à®ð8h2X@moRP]Ümõ\…¤õó¢†Þ q3¥!ŠøbžÙ |¾“ìži•KµR”àwI${X­Œ"ãq¦“m¦âBphÀôiUˆ &TFå¥.™ }"öRi«Z$xêìÿuµ÷U:™åV`>†z(=ÛiÇ¿„Blüv’{…d•uŽÌL!ò !–©µóÉÈ'ÂÔ)êP0«–•Y§“•3Þ‚¼Û› :ÕfšÁzø¤E/ ¢ôü J&î+†m¯HZN>–n `Ž‚†õÎ5§êãgRDÇÀ\Ú1ªËd;U¥t qìèþçž[P¤ôÀÜy›Œ§¡A]¶†FùHøÁ+ÆÐ#‘ܱ¹NrÁñý› Ì{ÖË¢¬>ýXZÑ[2(†ôjÕ<_uWídöw®õ B^¢ª$ú6³#ÌØœâCƒMŒëfòß³¯5;4 2ãá ¼¡±¼9J› ˜»vr¹q…\5Mq›ª¾×`hÖW­ôT}ý(‰ Gbªs'@M÷äTûWQ4²fU¯ª2ÒþLÎ0PE§»òáºxg‹‹›î¥Jµ™-ØØÀš-®Ht=È’Ä­ICŸœ^”*kW1úÛú´¨´Ÿ€À?áH«›§Ó Ň:aNÏÖ¦àú>êãΔJqV2ʰdjÞ|â¯1·tÆóT|Áí’MD-Þô·e”ăÈ1D“X£"gÙç~ªS4‰«,Wp>&â~ÕVah­»MU Ie ØÛ]r«1¨B÷DüƒêNà·¡CU¿ A’XÐiöce–©P~U!L{X&‘^# éw«ˆ¯IúµÑ LÁ©!aN‚d§æJ,¬@{ Á~ðP “5±ÅqáHhsù¤îeåk\Âtð%‹ìâJ‚˜ªË`܇T”2dêˆJ¨¿Ò„a¨Âïud©t €$=¤üX˜_ü˜[TEÙÐ;,…sG9¢÷Z›Î«(¹œîz¬&#fiVÒ9P2틉™V3ðîT¬Ì'êrÂÛõô’ƒ_æñÐö¡†^Ÿµª(Ë,ÔÓ~¦MÓ÷ÆÀ‡ÀDä¨1oŒ+ÁùŠ¡ñ€>ò¿8K·²J¿ ,ŒT¦pNZ˜sKè_QÈIÓÑØBéÔ«Ð\hw19¤ª>2;þ™¦$1À6qL+ x„¹Ú°nôÙŽ9¡1æËÇ, à}kö§1âTpŒ{+ò¢úõ="¦‰¥@eÑ¢ã ¾Ä l™­)¼ë½nÈAªæ\Ø`'hã¹_è|Æî) ¦1Ñùš`²†2Iñ²ðEv6EHC¬2%s‹PE§ G'°ËùXr‚Ò÷¥GêãÊ©ÈÓ{yö¸^RrØ%…»õ—ö¥Ö«Í~ünÐ)=L5Ù^5Œ†d2Õ¤9¤Pʰ8¢(O„\£p¢L¤·ÚE ¸¨î•Ò¬ˆ yQ´+D ’*¯ LÉ}sè¹ Ò:È/˜Ò{ì×Ûøj‡$ÁÀ|€ß”5ÇÑ{b{®À£áæáÞô=\¥‚mŠVWÁ'P梤îÇâÜW?¼—ôóþ9#VíÅþЉ[d¹ u÷ÞæSMÿðÚBô 0Ý'Z7àöµ‰Pÿrœ¤,[™^/7îãt•aÛ£ïÌ@n®aÚÛ€@¿õ'0ijfòX?7[(ÚÙ¨žy¯Àà6Ó5¶×Êå”Ý`ֆܺá[Êì)¨‚!²ÂxNW‘½H·@ÔŦ¨z×l D QX8=·¬á9Ð魯'‰v i_¡c]¦^ÞQUM ØÔЙ¸È·« ¿|9ÓEPñàã7ã`ÕrV ­„Ø‘%Mkú«¦5Dõ^‡S§›-à’/ŽôN¢ïw² w§:ΙÂFáAÝÍZìv}ª‚Ÿ©2 ¤ÎôæÍ:'êi`3±²©ã줙\×jQK°ÜÅ¥ÕÙ²ZÙç—Û‰uÔлÚ÷10 Õ+\4FªPs1~¬ÙwzûŸS±£¸qÿMf¬2?Á[x© ÇÜ—FGž”wéèØåD M„M-ÓÇÙ– ¹(!»Ñi›E­èÁ¢)z?p3èrFš}õØÿ¼ÔªRGÔÁ{êûߟ_fÐíî}Ù ‡d“\£Eæ{®a‘)pK:²,^¶ŠºîL§š¿2x®­ŸëÆçÄÀð?‹t^ùB],DóèÄ´˜Š±+S=y!Ó”º0!´‹n„W2>îe±Í;øXY0´ßu°bŠ-˜ÔD•T1¼ŒGÏqu\¨ f$)eNìGËHúr9q¤¾¡<ÀžÚ¹Õo›Q[PýåØÎë[Í8.Ñ<› ≮\ßëyoÀto@ bQ`À:óƹF.îW†F¹7;âݾ3׃¶ÇÅB°¶`xìÁûÖd1rÊo,,Mnª8'•™+;Eˆ‚VÖÔâšE«0 F›U°:Šœ'^Kò‘ 7Új«â`}Í1äñä­Ìö™Å*Id»ÂxÞÈJu0Ûµè|¤¦.‚xaT,~`–™C©Nm9PˆÂ°øS?'߯—šB““¯§¼+Ù8ðeÿ%ܺú$Ý4Wƒ§”mÙ²H2m‰åü®6 ™ù„ùìíýø"á/^>ûÝgß~v7‹Jhõ…ÝfQ­WÑ*ÁÙ¸oh)±è:7˜jYžì®‚×àLÊÁôjÎÏ¡‚¢ u4©ÛJ lEèàJI,S(Y ‘n=K¢jKÌnôWa‘@Rù•zYªÉË]FåŒöÎçƒ5èdÓ=‘¢;é)QÞGÇHaR¡™n}SX"¤ óܹXóGÐOkžLdU“]ÒDF³ƒÂ£ap*…8úÓ¨ß?ýRô&·qÄŠ¯è_™TEˆ€X¼Ý­só«Û‚ÊFÃ(XñÍ"Ò~_–_áwHbÊv2×Þ6[[«è†<¸tÒð\ÉÍx“ô¯M䲡_Jº#À\£˜êb,Þ&©:Ùwcû¤xׇÝ¥NñôÁ¢/"ª=ÌòÁ]ƒ›­·ÑJì¯f7g©¶ýÊÄ.ãUû‰›N1û¹Gé/á/3˱䊚‡ ÎqÔ^3RNj1ÕF²u}"´ú/ÕÚQÝæNyž6œG°AäbzZ‚«7ÕŒ¸ u¤Ñø>²Y<ìBºY5d¡ÜËϽ‰ùû˺]u?#-ßb‘ýêkD7ïåGØá}•Ë%ff% 8ôªzŸ¼˜¼«Ø}”—-?`ÆAáy-Ÿ—]zU` ÷,®ZwBæ|á혯Enƒ†ú9¥¡øCU|$§ŸÊ¢”À‰¸²ÕÛy¼þš{ETþ‚8³ÜI [Ècò H‹8/Ò1>ó8u0Øá#Ú:Åb^[Qd¸—«,Z“²¶JN¶ê©jB¡SžŠÎf꣇2E׃ªÁ§ó™Î?˜ïçv²£]2…ް xèò¶O ;™äL|ž8›+ñù¤êÖ¦W¢÷BðÆl8&lK"˜kŸÔÇÒ~‚œDøm™èy2éEÈ•k1ënb¨ÙÊ(<¦[bÙš7Y¨ÊN$¶DCÍÓæ5a5Rb]fýnÑ{©h္€.j¯ó ÞƒqÈ.wⲤ5A²) ±Ø)”mTК=>òॹç_·Úò4ev†õ's:§º´ùšD܉`ätºHê®[Š®¢8 1 ýwÄ™Š`ª^ÙgUÓ„½åm÷DÖ´Û@VâÑ0}§ì®jJ[ò®oÜ Tscß­Ü/‘B#;aCkîЛd©2kîæY¶­¦kºlzμނR<Ï‚¿$)‡Û¡ öhm"h1ô¢1s"ô$yÓûÌûààWVñ:Ik‘÷h}‹›Ì¡:_Õ V’GŽE.ÂcrÍ›„ Y–ZÃ)6"ç‘ÉqžBa…§Î€Ô!à;º™”rדE'H—1J%6ç6égæ»Fñ&õ!Žú1°{£Rº€êKò8›È„¹,çâ½(RW.ó®ñæ«$†g^%ÈQ›±KÏá·`¾ð7½©}”iýÂ^ yzͲôã üÿ,@·y?èÿ¶»| Ì{/Â'5Kñé] ›o¿ëFëxEï"E“™eW9ê™¶7óú¢î•}ìð‡’ÐïÝî,Ýå#@ä6‚ëC”üeß^ê˜%²Ÿ/íºF2u9~Xá%OÝ=‹4³›¥) Öt&ÿ…©âŒÚi Až ÇšÔ ïZÉ2ïc|i@'9eèØÇÑæù”l’Õ|‡k^¼ú“V$­— ˜ ÀúÈZJGÕ\œm.NÊNç]/& ›wô’g«âTÍÒtnú>o‚Ò»;5b§å;~Í.nW…?£ÁˆÛšÍ›ÙË>Â23Mª0z(ø2¯”ÈWü¶Ø<’uô4¾m–AF¤ö¤§}L–£icR[!Rõ5Æ÷¨ì¤xâ(rÂó¥g¡U[ɰ€ñK†VZqZ¶»:ɘç6í&›²jiþ8@ÔÉàcºÛŠklbrÂösGUcÖ@:‹Ó$v1x°ù1Ò> Î&‘Ò)uþf?bˆçžªŠ]¤‘t7¯B ΂)íÃX¼èR }ÔgpTW³¥rØ+oJ îlUD‹øå‘ Í8žM'B}Ç9Ío ˜²‰r+ E‘,Rik@|1rëŽ2Úzf¢‹2À£fÓ>±*‚æ÷˜š·Ï|eí*½fc´þLCñ¶ú£Æ¥{É(!ƒ« »Q¯–òD¢ ´¸â·Š>Â㯉íÀ‹«ÏëbMšqì í?Öç“×.¼ ÖrÉ*¿þ~¯+ÌÍY¹w$Àì:Ï¿_]½oäü„ÅO‘o0ézYÃÊt5#5bÔAJß¾eõc½¸ÝQ- ¦fiA›u±ªÝÃ/Z²çA2‘?$ë;/{ySé1n´l²¸ÔÅO]艚ðŽN ½‰•ÈVª7ì)¤Ê÷–y#÷„Ètìžržuá²è#еc«›(ÔøÈ@9¥]sólîdo¾œâ‘B ;á!³è¥G+ 5y•‰âyqÚ¥UÒšaå ˜Ï¦öìêš®½³PU¾ÑlS)B‚î_Ð{fœäd+Q ÷#g¤(JÙV’´WmE3zG-™O\‘óH(P'èŽÊ€niÒ6+É«Ÿ±Êi‘ИÁã,9R‘ÀšD!x! Èd³Aë² ‹‚"S %h䵈Ì õ[D†Ÿq(±3Ÿ/x¾qmæVZCél"/b”½©ñ¬í-õ8šV0"ÅK`f²mÅ9È_Yv@=Gq%™Â(„)‚e –ZœÅ7‘‹Ìƒ¨#p‡?BÁ“ÄòÚOˆ)çkÙÐé8Ãr½©Â}D§õ.Äê?¹Óypç®Áƃa€˜Œª“²7±z”]Þø@îæƒÝ¡Áu@ƒ™Ü…ÖZö P#¶y^š“áì@`‘OÔ–†rÔL<š³™»2Æܳ3›DQØgQ†\£Å )ÓSŠZ"ñyC]`ÎtÒ·_òՙ矢êÞ†’ë5°W"/!_(4ü,ÛVõ â;1¼x‚‹Ë·™bÚ6”=ô®± Ñ;¶ªSéÌ6­IäGuÀHaF(g C_‘9ZêHØi“;Y•æüE$À]=šUǯÖUê¡‚Ñ#ËŸ} lxô²šlÒN›4á&ɼ@ä“íçæ1ܲ;œVWÝJðË.£‚#49D¶ÂxêI¢>^`íÔ·aX™“µ+¬´ñtyõÎ…YX;]Ë5ΆuaJ³uúl¡ð†$2Þñ0«c°Z:WFZ:kš­ÄO²G±+ žØ"θÜÕ Ð»ÍCû­¬.ÈØÕ‘±¶ ͚;ÑNúÌ%¬÷ït‡nBWʈûX˜ï$aw›‹î'nÛâ[o”L^È©þµ°BC£3àä v^IJ6±2*æ‘ö<×ÑP :à#YDZÊ ’#oÎ.zæ¦ç¦ÌÒS#Œð{ÛÿË%!‘C£4dB#I²›,AÁ\ˆ¡Á©íM/LhĮ̈ÀlšÈ4Þ¥Î)è™JÑË8Û}±Ÿãͨ?†«o»›(2€F Ý¿>ŸzwÆ!†—"W·¬ì[NiÈ £kö· ¢gňø TÔǤ]š 7 ×ui1‘Ë!KìCÆ,ÖÝGâ„f†b.Öèõxãçm§{ ÷.Äs6Yçû×gNå®…«úcó^OàëùÓOÿÀîàaU"†JÔÔˆ7Ž}+°ûØb0“ïc¢§”˜$¨R ì5Åè ZÛãIH%uâTËÉÇWþì˜iœÞèCƒ7’T&ŠÓRÕûNî<¸Þ!Ce´¡+ Úÿ57:¯¯¥Þ’:3 æF|éGø b,Ò™²S,(äꊛ‡ûÔº˜¦wóÞ"1P~ÁF_¸çdþSßÑ%«=H•€¿±ðGÙ3Z­\-TWÎæW…‚»\Úù—Ûþ&%L*lS&*KdSJü°’Ç”â¢N6‘$ó6U‹ø¼ )ùÓ% &•MD/ºùûC3€HJ‰U§ýÞT¶‰7u2»âã™ThO¦Á“86HVž!œ/¬Ð`餚ÞÐØnêa”TÔ*ī±tI糌~F ‡hd[nƒWxÓQ»3˜Û±ú–OàÛT/1xÚ þ´ù-T£ ¥nfe5¯a´Œî"Œ?-Én,MMý.¶TÆe%;0ãÌ«/å$f%24÷{Oí:k¡úD{ xñs?ÕÌ.ý˜Ø©£]Ljˆu[ÇL˜ìmr© ’Es}GÇŸ©×Ÿ­jD  i'äSƒ0OÿÔÄ¿¿|ö»o¿¼£ªó>±çæõ%M3£ª£e)EN7Ë9ŸFÐçÜuÕñšwB'£«%f»íIiކÊŒS¦-¥‚T½ïΡ—ºg ‘ ˆÐÀ®¬ywè$¹ÚÙû3¬†Ç§»éaããì=C#øXuŽl|ÎTñÀZŒžCÕóª’ ÆÌQš–ÂF/ Š=yT–J¦1 t¯†¥{U "2ꌑgtVš£s½C;²aJgBi_˜g…Øg/o=ÊcXàW>IL´ Š¿Ù‡DÆ€èQ¾[@¯c¡ÔTÑöÂùè`¡P)ΞsºBTÕCé°Ù^Ù|*#<‚ y @ˆ_µFÆ`£`DÒ„æIw3ñÓMfml¦` …7 aÎDGG ÃŒÚ´Ò¶5]oæ…LñÉùá•D§='½c”€N±Ÿ{©u“AV"Q #ÍØ“RŠ¢Hä]ê™ø|¼ïš‘§Ä_[¼ùÂÇo…O„Ï%…¾(ç`UýØ­  ªÝ5Ó‡$ò¸ ªë¢ÂÿC'}¯À÷¾mäA34—þàï#œ–'¶B ©™×€Œ®)¬£°—ñ¡ÔÙÊ ³ÊÎcN„}©êY¦&ÛSI"ˆ ÅŠ2p[Ož Õ»wÛ‚ùnô|íÉ‘NMYm†%Ô½³ƒnVm;¬°'{o°4P¾‰a&*ÁNžÈ˦;WJÁ‘´¿Ä®ç4µFµêTáÕCpÓk²üÜí`°ßhtÕY F˜Ú,j8ÀŠžÙñ+¯{تy´¬ÌAÍ @‡ä-®Ï|–ê'¥ÿ( ›²¢±>—jöA;qL&¹–GËQ$úpš˜ôo‰Y“$_õœÁÂ3;VÁTäûI“ˆPàÈ•‚x~¤2®Åà õ¦Îç#Ö¶+¨K¼MÐ,õ¬åáM_rºØÝl¿¨ ÊÒ¼ß&õˆÚ‚yÙ)Sm'L‡ ^ƒGV@㬈š1qù  ?Õn²þÜ$Z×~qØ€°CìÇ(ûž¬}ÞúóÑÚc«Ž!Ã2{kG¾b@¨üʃòÉP)( 2bâX­÷Íàõ—ö¯_‰Y…u‘ sªî™è‚•¾×Z{”é¾(;·°€µÌƒX˜!ÃçH ]¢lî\ˆE÷ªîKèæKu™M©zÓ½MW³ëùu0ã׬%&àIAg_²m€]sláó`狃BÝEV8ðá£Ý=þ1Óo9?;×TÞ~ÿì’ô»d¼y°—¹€ «ÚÈ¢`A .Ö<‹h@«¡XL@»à'ø9\hB†ÊÐ?½±Å3ÍÊ8 ¼£öe*UŒÀ”!RšùšS9j"˜³e>—ôSI²`æ:cïVï(ÃF|:›r9»a´‰w©£Íâg Ôy'Ƹæ_ ¨èR×S¬1'üÐ\Ù÷p£ÚŸ^ˆì0öXwТYukœ…:¹@Ž.ÞTÞ¼Ó×{Úœ qbHnò öÈkj¿‹U(B±ª1WšÂEdnWÿXqE+Î Yâ‹ÉåJF¥6rdZx¤FÎÍW^áÊs|ë4”4QÁ3åiÅé¾ø}èÞ罫ØŒ[¼ñx¦ÊfÖ¬ 8YƒÃd^²„S4âFñ°üîî0SÕîMªüõ¹ðT¶ðƒç2IP謈ßÙ³Êå •iL‰éYLò¾ÃQ¡íÈ#ÌÖY >¤ßºø‚ßD$ëT$n’š—š0ÊÞd ª f#™$¼`i±RÙ§Ì¢ ¹‘1 › t¦™DÓižxa˜¶Ä ÷«W|è¦NO! ós'€™ ^šõ©2„¸NÐèXòDIfÀÔ©è–ì—Dh¨Øº*ìH4Zám3 •\Þ4¯0óÕ¾œ±ú\‚)›P¿t 0œÍn$â#ƒ:U)=Ð%)™„Âó:F:n³‚á·%l–a»Ò›ß¤ÄÖªÎé÷HP£‡^ô&[áÒî€uÊé¦Ó$pã ô‚3/1óG8 Ç,¨¤ÚÛÖ,wú¼4Z/EÈf)LÙ¡¢>fÔ6åEå µM;qaÓw¸&G'@¯3¾ÂšØL¨¢Â;©ŽþË,ö%iÄé¦ì“Æ£¼ayÉû¼ÅƸgt}}þ;·è}q¹¹±<®(ç¸Ûýn~>‰Ž=bò`šfN9ª° .dºÔЙ¡´I)Ša0EJ¸S4Zó J÷y3nB¾d5Ÿ,¨íbÈ2ÊwÔµòƒÍŽ‹ dõ¼T1Cä‹n †£deÇ¿ÌNj]=(EaŸãKa¶#>ÈfW¤†‡J;:“*¯¹ÿQÔ[ B )x!‹(0Ι«¸v'R‚+_ÎîGæo7ù`yï¬à$͸î€^Q÷Á+É[ ÇF3 檷@Él‚'g¢/T 4H[xÆ©Eï̶.ëè‹Ð6ÎUͲ øÀTp©lç· 46ÐFv›jZ ‚›PŒ³_çâ½:oÕ™ñµ„ÚÞ‘Sœ§9³ëÑh9…ሻ#&—€0g‚ß çƆ“&Rƒêi"Ë#8x=Wé7Qì 8âöXŸb+ ©ˆS¸•ˆxCúrÅ;fDm¶?;¬+¨!H¾§òo \À²=m+A)œ€&` ’• &ï ä³7´“Øþ¯Ê^lŒ[Ùí¥íÕ|O§›Sèëb‡.!.‚°ÍUæÁÌmBÈTq106PVE&ÎÃcý¸îð˜;U8]…"ÔÓÊùukÃÓg‘œXïGµb 'ÀœïU\.5¾EÒ¡ø‰íƒÆ<ʬlñó#ÌMVãÅí0Iþ‘‚iÚmºË@¯À l@A¿¤ÄFô¥£„sg”Ï©ÔOžÕú cqD$ï*çXŸ€´åíìËþØ7ŽÂÁ¹X|¢l%1khÇ-¾‚ Òý ËÀ†DŠ›ƒ§‹ÒBýO¬Æúá?+1>ácCWãöD¼­Ì™…5é•/÷Qšøñf¿çÒ<—|=8*”WNä‚`'V5<½Èž†æ¦Ó%ÛZµÌ"ìî>N`„Â÷Ì 7Œ„À£ Uì.‹âtŽ@q8ý_'ˆ3¶GÜ¥ŠA.ŒÊk¡61ð¤6ô¥¤¸¦&Ð4emŽbS°Øü!‹ Ö3Ñ*™«J­à£¥«¶bw„™@ŸˆR‘ÁHÉÉ|¡cØM'sûìâ a—ŸcG:ã)ŒžXÎÞ>|*R¼:JÁá7òì_É[{7¹a$êÙ¨,gzªÎRBra€‹‰kfÁ~PÖESI 1—tö¬Âä|ÜÔÔ)r<Ò5\¯QPCné©N[)¾k€ÛT»?äµû{{N8 Èî`’9£ÈyÓ𤘨NÛæØ+Z± .šÜÚEd/ÌsÞs»° †š5DçÃ8ÅñÔlÕ}½±›¼Öj k¶>ˆ{1¨Ó½?½Ä?$(*_„•Cëh91=ŠLSb¦±žÒµ4È­‰þbÝ9O¤˜@Ù±m‘S5·‡)ç°bUÈ1Ç?¯DÀ¨d¶«†…á;Ô€å­9C9cqŒ÷«Á›¶³³SLuÌ €IÚÂÓ.°8ÄÕu H'WÄbxÑ…&OÚN63Ò©ˆ' ]9ù¢áÒ‚+‹Ík™²…ˆÊ›(ئ¬Á•(Ùât„w!íYN¦ L‹˜‘‰$Áz²ùú€Û÷´´/h»íÃÅ}ŽÅ6xÀd­îEYìkôˆE5Ô ·aGg|¡MÜÅ2ÀRöœ=f˜¡¥0*XòïÍÌ0Xöw‰HS°¾;+8i °™ ªš’j!ì‘1ЃÙUxÌŒ!CÛ+VHÖ80ë_vk+{0¬=Ó•Ñ‹t$…ͦÖ3kC†Õ›b`¸ãü¢0 xBLŽÌp®ÔˆÇdŠã–9KwüþH7W“¥üÂð“j°0Y@Ur8ÂÁ¢rò˜³BAÍT &`?Ê ‹c9P) =‰žÓ¦ÖV†këÀ“Eo´¸Â†BùòÙï¾ûî†Bo1|bÏmöxZ…Æ\±Å:;ÆYÈÒƒ0J*«:Þ?VÈ8GŸ2¼V3ó'o²Ò ØL5Ì«T­ªÆ}Ydê¼Ãt`þƒáÜÜÒW$Áy«ïò±ÈEƒ0\ö*w4‘_å=‡x˜/€¼b÷Io¾`"_se«‚òª~`›0i¶nr5½þ ̨LJ.÷šY«ŠÀ²ŠEá ݑΣ8e.R¹¥I»¾®£ô_l³Ó`0E°T'ÖýT‡ÄL:ƒ•'!ë¸ð³: BDÕQJŽ¥¬ã¨9(êÌN¤±x½Ã|(¬¹YDúuW¬ôW¥)õ•e±Ì[™šQª³$¨„X3Da„_‡G‰‡}b\7ѱÐ’E#¼Ùªèõ]{ö`*w;”«éf®HŒu1-6vÇÓ¬u_Ô·ÿRC6ü†t|°Âè“ùXÖÎ"ÎÃ[‚2áEo“ü: L*!ÙuG€)‘Ú‘ÿÝœ§ËÊóßvƪ‹lÝMc䂳gc¢–}”cöéÁkM­´½@4&ù-|© P[Þ¯„t["n”ßRmm]š E¶°¨î ”?BpÃSòˆDf%).ªøäVɓ—a¶ƒ ‡ë­h"3oÓÇú¤~ Û\2 ¡²÷BßReíŽ/ï»ÌñA¿‰ƒ¦frnnrB¿¨q©e`ñ’þ†ýÀ|Ù/‰@tŒ×Ñ„˜žÙïΩñà‹ âOˆ½Éf€QO¬Tr ²Ôê±å4§¦çÈ{…-|wvA-Äù‹)ÍBšìÉ{öV9.!ИمK•Ng“¬UáY21'iÇÈf,­Žð»üW&Uæ+ªä1¨¿.‡µÆ>xÑèÅ‘´e_Ë~ X.öTm:†1©}Û£tsÐçÀBó¾b¾ßɱz¨ábUÕu÷ ’W)<ÜSÜ>ÂP>÷.sïLbU±¿Òˆ;~V3 !_«àn%¯¼Ä P/ƒ(  2^o%äb™oÄßÏÚÈðHÎ É#ûq%U±·*ƒéÙþ¡A T…O}O5u(ßtìÅ䨋ÉKfÚ«£ž6“L¤¾ÚùB;ø¥ v­&sØLÚµ­ÝLÕ¬“2G@<E#Oœ/ü*ÍÛA>Ù²œˆÉ»AG½Vy?kVòkrgv¾Ï{˜8C‹Á;‹Ž Gï®*Ïúp²Fœ´{‡ §¡iÏfMÀ÷1—¸>4»F‰âXS’Ìl´œø¾û.I8›¹Jáü´²¸¢œ%ìyM9 ×`¶¹)ÐjÔßXüYqOÇqRr±œ'Œ±ëà8âx-879›Á,l´…5œOÒß|Ze0¢±©<Üü¦ÂwØØb˜éºÝÔøJã"Ø¿ —(nêáµe"øN[|k"ŠVÊ"è‰âdgÐD]Rƒš¤a‰s¨dV\‹öƒ= ‹õû®Fø¸¯Á­×èCû Î6¥ëå9…Þ^ÇEèE!L{?Ö« Òá‰{¦µ Dáªd2G<…QÈÄ`‹XEÀ=KŽÅØa—™ˆ¨\žËHˆø|äaÁ¤>Æ¿³&‹%IͺTëííÇØáF’$fc:„HÑkXž…iu˜­qXŒŒ`¶å[‰¬©Ø§KÆœ‘aï]ˆc¯ÊªåxR_&çe=™këRÄaØ©—0u°Ã¸VF†Ùm+‚ö­›z¾ìDýI ÁFlANÁG#û(9AÁuGrd’°Ù/Vw²óé”`ïM1Û3:~ ¹ä—©Ñ8½–€Þ ª† ÐÃzi¾4"b››}b—»Ï³:X>f•<,ŒŸ‚¨=úôjÞ¶³(j¿)i¢Î’@6=ÏëÅv Ðy†Ð®¿R_ ³ú/h19IÊIJ'à’ì’ `5g¶{Ù6áÀ¾ÐAg¡1VÞ!赘N‰éBÝÒHRŒD.½˜èf£©z¼áÛ))ÝCèÌ)ÞŠ<ýìkß…?Â% ®/,§Ó;¥“á!öbÔ6o=Ùc¼{©Î# ît»*ø•d¸¸Œ©„n»ä±(ÌrcVí²k–$4"ÏŠçªÉµ÷TÓyÒòŽŽïMMYjªlx¤ëLD$YêX¤p¨C3 hÁ`g_–÷¬ù8µ¥À¦Nx8Ë/Æ4ì‹Î‡‘§ NYàŽdÏØN,_®j^K¶}‚??«†|Ä,N¹¾ÐUézg$[µåC„Gá¨ö.HÀKFR´G<ðÍŽ]§(°ÍÞZÐ!Oø á!÷p«ˆ2htP€š¿Y'•¾¨J­•ýk#›w˜ÒW÷Ž•¼ 伎ä²×wYÔDˆ›E ìp[4'´Êl&%‘ó¨¥Ã¶¹˜ hÅá¶]Ù NÛé¢}‘þ+Ü-’F³Rç\õð—Ž’œNC¼#æU} ¦š¿Ô ‡Kîz ÓîHêÔÛ`ļ6 ÙŽCnŠ5ì›Ã­.ï× ù.}$3NÛJÖs¸Í‚ݹâˆî.…•|Ö¥Pºlz.ˆ.&tô«†‚5Á>+ÄKñ r”¿Ìj›´7U»Š$¯ëšgÌrÐ4ûtw5ܱž@¿‚i÷æœwìéŠë¹7†¾r546‘ïU-‘vV‹Æ8ÚÚ¢,˜¤Œ³÷²r¶y`ÒÐÒ .îž!¸–íñôÎY|È“¸ü$xÎeøçö*ß9a ¼혊o¬ãd‡ÚQDP¬cëã9 À.?!o CRÞaÆ–cÚŸOLæ aÇŸ:_'·®‰íý™o—\ÁýC¢t‰ª:o×›zxZøù9UDĪpçêF7°£5Ššùç0ŠÝq*bAŸ6EW—­AGLÀ3h¹Jâ«AFc7„ÃéБ«to<ûÕ«Ó­cLŸxhÊ"®ˆk%0<ªìx.J—¢pán^g_XHYÜ1f :H<Ž&õ¿ÿí?î˧ó{«ú%pÑÁP[½ˆ?†9?ð>ˆÂ ßåΰ’; "˜!v{ubð‹A³r¤5îx,"¦×ÙÐ:äMjÚnûé2fËÛ$7ÄùìâÜýb˜¬w¬~ß­Aiá·ƒáhÞQ’вzg"›ØAÚ{¬" #ÆÀRÚóÁ …pBOè§ØóÍ8ÍàÕƒÊ.*Þ«`u?@ 8”eª.½¼ª´¨ÒŒÓД•ù˜øt­Y íºÔë.µ½–fØæá±Ïù,M3£Þ«ò%H„¹Þ7Él¿!x ¤€ü|<·ªJíQ±ÓGu àµP×PõU ÏËe›õ`kà@Ç^ú l÷ */lEu®ACòâÆ szŠ}y>ö4—é$}–Cr¶æ1ׯJ^å OA>nýùÐCèÞXUêo}°±ßç"Ôû[šË%^t·=×&»“Ѐäem0©Ù@vxñäƒ"ø£³º<.¡\Åk'¶>õòô@ôÂ^iLÛòäQIK¸tˆÖ1:J¤:eI>›1¢¤{aåâŸU%èß©´<·kWÕˆ­‡Wjj$h®Ñ8  ¶ÌïYñ0Ä'¤Aœ¢ê½'tÔ¥, ÞC¨H1}“G›ºq2W„ ˜2dläËpÚÈ~)úPE*Ø‹)…rŸ¨ÜˆÉ”i“ðpS?°fevÒˆ—4²Gæçõ°]PX*yëæç0p=,Àe–±’Ôë‚Zã-wx Øá¸2pËÎTÌÛ‡ö£Zºês'vÙ\* 7+•RB&k\º°å)åN‚Õ€vþl× £þÔ½2ŃÚ\š]M0›ì9ñ¸¹û/1V@§e2ì\hú´»îôû¬©WK…ðijÂZ›š—5sráU¢jZ‚×\'ò·x;OBÈÔqv¬=`EáA©„_œÐð‘°B/Õ?_^!3ƒø]4 ¢rDá¶)%зå~'>¥À ¯x¤/dVTn ò\ÎFqwgy ÀSÃÃಒ-{˜]´î!;½; mtÜyš•ŒXòÉ©¤YÑû¹´“P?Ï%T åmÃUÄûºeir›Úr—Iò.¼esežÓ¼ÊÂTFO‘wžG_íW"¨_]†ºÝ&Ëõð*½Ï™Úu=ЛwöjuD€òªLŽblËݨ6¼§+ÙªÊÞ§7CTHÓŸNm ëq¯¼ƒ`ú–äÅ{¡Dßzß‚W³ñƒ«Ä‹ïHƒ(„=5OÔérâêÄÉòêèT›{ÔDáôE@„ð†{ô(¼jŽ}Iû…Š’Ä`@fmÐLÓ4ùqw¾ê9àDñg3°½ÖÑ7Ûð³’#±üúZKÓv•eš…‡s$««Ç^07Y]=07å¹±¶ZÙÀD²ðпìˆÝu:AÛÝ›ïgWù9ôk¦ÑËRË#>±°0#Äjº  0N?z °Ü» ä zbºÁþ-:ka~Mg›¼Ã*¢XRa ÄR\Ö$ÛØM5Ã@Ò“yO™¾8–`‘+‹`E`*kRļæGiŠ ÷ª"¨?1‹ß·æoÐcôÇ#A“é?ó<¹á îYøå ÷Ø•l¬Ù¥ôAkT= ;‹£~¨kU ÎH×Áy^ÚXÏ ì8:ŒÐ‡MÓnOãz 5w^&µ =°*Ü[ø4êß²ÙÙÙ1[剛]ù¾ìaô$-ý} þ W*'åi<—ÝìÔôà›ÑàßøƒP OÚS>¯2à,˜ŠjwÉq™°YšôÀ7°Í¶ð ! ["4)ã c‘Qý·oh‚Z1þõ[H;Õ—ñ¹ëc·áõSÐ40õèÚ ®êzh˜ ™½Å«þûÃ+×è­áz¼Nåñ³cLä8‘Ž\ŠÑÛ5)JG‡9ð>öž“˜2Âl¦y°æ¨xÏ™‹lËÀ7G:Ý®þŒ—úcªÃ_GÒ•ÓÏ…‹öu;‹ò”*Ì"ѱ¾vv¯€ü¥¸¦¶c%.p{©¤XT¦»›€–F6C püºøµS™V–åßÙÊÁÁ›\㈇êŠ&n¬¶èVRMÀwÚ’:oÅ.Ð3 wÅ%3m"úLÁ±¤OÚ‡d8朊ù0±¿HÚëÜ:ȰâËÆ‘s+„êÍb×Qc·½>Øv ÙÁÖKÃöq(K.Î=t¯øÜäD×, So(Ê#dY$EmÀa=©bß8µaiGäh2²óìªPË‘çD¸{÷FlQ4V ¢Ñ›Ž®1ÏÄFeM Ÿ)püܪë¶(Ùsþž–Q—QæòÀ€väc0æ¶«ï§,¶£;‚îfÇ^¨•IðF/qß…Ûj¦²âUØU[?ÅÉÕ°=zŽ^¬•£—ª?Yw”ù ˜¯‚ÇqÂGhP!A§öŽHþD"Z²xŸG"[Ôa6†k±‚È1-É“ˆ^Ë"F«ÆôHyF¸?ÄÝâÓ|c ®ïTT{t ’—,Æ@ä Rñ0‚¨#b*híP$tÊt&?˜ü$$3œ|Ѝ¾rJ’:œDÇÔË¥fX‚å·|Ã×¼[~‘íL{ý|dŽ/Ï}#kÊ Õ*AEž—âÚ<ßaŠ×‰C(:Ý]ÜåK®î°,æ° ©“{gDnä)ÇÚcš“0MVa\uÀV ˜2[“6gBµ]RïB™ç> Ît#áŸ$iæ°•ÜYÔj0ؼG$³ªvvCÆÉ8¨EÀ Òqù Ÿðà@™ÔØÂ TTÜá™EÛ ÎëFQ"é0+20^ÇL$5W‚½DM¤Òž~9ù:ªÅá~.Y‰QäË#Ý(÷dDŒœÒ1+‡í¨bIÜÂÙ f‰Š&t#”99>Tá£úà©­@õJÙgu€åíYP ?„úCô,iô"Ù œ!À‡Ö e£àõF2tÇrÖöx®ÈÖjnc­ñoε±÷É`Œà4Õº-äûg éT±-/VdÝëôÃE­¨+–ufð{T qö æQL8˜üôµŸºÐmÀ6)5* 7Bíʱ=–ñ!ö+‰|ÑFñ˜YõBÐØÆõgä6¥³Ä‹R0óõ@Ž’Á:ÐYÓi£€£Sß$n’Ü‘Þn½Ø”abpŒV í U­«ý_­fÌ’©Õ÷f¿4¤‚™ØitÏ.î»\˜ÓÊVxØHG*^¡5®GŽ%ª;Ðë€Õ«@°cn«"vÉE§>ê9Üoäv½q¨bÑ9´ìÉVë\¬= ºF†(sZL"MûH9°¤TÊ߇GÞ Î$1ªATÅG}Uñ1}íù!ôV˜Ïì!@ Ÿ£'Ï^cp}V¥Wž›® ÀdxVÏ4¶5wéiîÊGæŽPµ¨¦Ž muLÐß?ÎöÛøþë¶÷j…»÷8aúNZx¾Ît?gÀÌ^k¯†ìÙw´©*¯ÓÜ٘鮣 |ŽmL †1’Æâ&:Ëþn˜äû·¢BŠáIêÁ¢©-\ˆ#ñ ²Ææ~>p£ÊÉcºÛˆ„\cÒw6Æ†Ü ¤cEiN®ÜŠ˜¡€±W2H¨*DnŽScQ$"ßfùN7€­Ñ+æ'(G²jMô~ØqÌëùOäGöGZÄþ(°—ÖxT´»¿ûì¹—ÐÒ¥h¿JéÇ¿ TdŸh¡;YG '_Ï…õ,GNU*¾_Só@ R>NêÉëtFâQð#æÐËX—0JªoZÊá&z:ϰ–(®F?uD–êt@肼‡²í²¨U¢mFÚm5\nï=Lዦ0NŠÁzÖ[w€EaûD,oü8÷x÷žv % tô:À@œä€´­9#¦óf&h¸ò|˜o:e•˜58Äà—@ŸUÁœ®ÛeŸèÊÄAC?au¤Ýá$f2<d/a#Íb ›$þú„ÎÐw *àôO ƉÞÀÚ¨Õƒ„X>”•ý£¡éQ‚ã…]yö¨þ4"œáÖDlRû’á¸v©!C›ædTß#ô‡r×ßÌO1}1¼º¢ô=DÈhëÑüfBbUeXtEËMaGd–À"66b¤ÎÃ÷™¬¥¤Û&ø|.ìÁÙá™õ&C1¯6£È~îƒ_©|¡Aé¯%YòùD·ã’‡!g-C^Ë_[Ø6¡ñ††l«ü+ŠFŒ¹¢$CöT|S‹VpÜ‘méш´ph….bƒ8ccò±\r55¹Š¥3Y4Å޵4jÇOËÒ1î Ê@ÜS«Òª’¹Òk½ñm•zîR=m6"'G$üG–îÓÊm•;ö:yÒ´¥'.¸°‘ƹ©šW³­ÌæÌÁóP•´eØ»)äZÙ(ô|'Ãx„åÑV5rgSS”¸õ(u^›¢Zz7ìØé¹Ý»‚Än«t ä„JÚd†1Œ[ÆTå†Dõ+>v^Á/ŒC?¦óû~åKõ^lúðA¿þ^ÿì\§zO;10;w78ˆØMY:1ÿõ›.M¬G°ÉBN'ñ¢b€vR“ŠI–`Sí48I§Wtb!‹õî:B’“ÔŒ‹4? ¯²œˆçN=cæbíÞYºÆ"î2 ¢vq%"àÎæºÏFÈm¶WïÃÔOr¶EJ²™ÒÇE1HŽ&u€¶ ¼ýõê’~|gÛßÎé‹›ÎɤÀ'ö\Ê/išDç4Ê`FR@äÀ’ïZÀÝÿfF·÷£Ó¸s,¥æõ–˜ˆËó³™ä=7Öÿ_ª ΉŸ˜ÞÛ`/%èR—½A%þ­.D—±w’ÑЖëñ+©jÑsu*mö$‡çÇv`|°ÄÓ„æj-v{ErsôH×%$QmE§EƒÓõf°§ŽX(FEËbƒðì"ŠxA”)þ˜9~”Å $‡3ý(˜c¼F¬ËƒÂQ!vE]BSÄY¾¿c&$w`MØäy¸ìŽ)‡ù޵°V‹Ù”³/'­Iú–ÎÒ Ö-´´@2Élà 6I‚d*âlÙä(MÙ¬¬Ç5íΙ_oÎüà,¼(ÇÚ˾×~JAõ®t¹DRÉê u,  X‹ *«—€×› ¶hé'%SÍÆß‰ô_GKDØÌ¶kÁ˜XªZ¤‹h4n“m@ ¶ŠÇb¿#ð¾F/F±•±ÚÊØÃ3žŠ]mfXót8J+îzØ 5"Î+›«A¬-'fRt¶óíáPn4G:y­•ÅÌ­”áæ±å+:S¨š¡,†â3 '›ü²…Ðc݈x^YzªRÓ§[4k83» 2gÃrðáüѳT|¥zÃvӾغp²}•›“ñÑË[Åw :¨2cGé>ÊâÇ­î0W7d¼è+ʼ:ÀÄüÛáœe²¨:]´TNVJ–±¶IB{k‘)ˆ F­qÁ @¯Ѳ1…Ùajuæ(´ª‘ä:6‰ æhè~œEvÉįŠEu™½¬øb$«ê*aò$ÅY²Õy}È@QÌ–ujÃcY±¾›Å±Ð`¼“@´gƒâs¶ÙÁT±ŸA/¬M¢0élQmrùa†x Hx°ÐD M£Â”w!p¦ H‰®¥3 Ï ú­°*õBécDõ4òhGãò Ì7ÊõhóÂ)‹Än5(jèQÍ.2v¦‡G¥š,q"§M3ØB©®Ìâ2¢ü‘†dœ«Š=Έ}^ØËNžü ˆPs‚”ÄwMâæÓhÆývâªÑG6˜¼Ø‚ƒT·âBш\3oÃqy|u¡Û‰ÍdÆFºÚ:çn*Š»6ú©­Tí÷[‹(¾Co¾Œˆ/£ÁˆnÅ•÷DE¼·r»z=÷P[G; ›§¾0 OÉAÜydé¹Üœ,£–AøP\’o~¾éX ÞªÈÝë:›õØw^èäÒ´ "r•utjIÕ}„e l1›UÞd-Î67;'ôSó5‘}ýg_ÿYb¼/~ßuŸDW]Ø"qÊšÄiullߦԋsý-Q¼Ã®#}kÌ'>³3ÿëGøv5U[ªÑ?üf‚à3“Ëâõu…&îÒÄNˆ¶‚>“5¸ª<&Ô•TÀì*W6_D XÈU‰RjmXMÕ{=áãArIj-¸d$t’ÁKR$ç.ìÖW0sdÝ'ÁïXatsˆ tÑ ¨’]Ì×$Šë:s9h&I=¨F×I½N/µyFßn¶¯ÛÇÆâ×v·³¿“؆T‰J$Câωæ1 „²‡èÆô'V,9!¯±bíJhß쌄g1¡±¼I¸3ŠïýföBÚ`/¸`'Ûäê5ŸYÓ a¤A~‰Í<Éì¹e<©i4vºè1r÷À•¡†ÃFk„þÆc"¹]±¾OJµª]õèI%Ó‹U>ɦJ8ÌμÙ ¥Žн+)½'Ÿ[³4Á•Ϻ qΪ0$×¼‚£l_Ž6R+”¦e b"­OÁ"f¹J.ÓšnÉöÆ6A8¼»ô•¹K¿ú“¦ù§óK2wé«—ô2:KÙ¡?JÝ¡rÙÁb°=ûØÍÌäïã/¨º7!œ¶4æK½üÎìkžYš^RùéT_ðò~mwÑCU )©sÚãÉÐÃúf^h…¢ÿÉ×{xS¯Ø@…LÕBɹµ‰ GîQän„)¬y[®2Ÿç’ÞÌ[8o4 ĺ XH±¨¹¯˜¸‰<çJcEÌ$Q&àg(:SD=\PŒ#¬j½ÕÖ½³œ_É\¥óüHÜ«—¶%Ü¡±MîïÊ”)ø0*wEÚÿEVamÂ9 õ¢:ñ—,gèk;sxy>Ýró9mž*£Ùf¹h®93=ãëx‹¿€C.weÙZa'ÞÐ{>œi‹%¢d=½“ÍPÀ@Óî ¤–£à›‰^<4IJÙh‚VÚ=ûèd¬Pû¹±I–„ùñ(;P%Ìî´øÂ*ÄŽþ»_t4ç ÚÌWÎ¥×LVu •ªæ°hï¢[wÈ&ÿàÉ%‘hM†4ÿæ‹C½JfäÑò¦²V׿q¤AÁQ@ÍÛÏ\(•?:J®é¯ýÒšL­è†‹MÒ7­lÑn[–†¾o†Óó3Ò,Úâ{|ޔЦÝ~f<ä²Éã§b½@Zå±øŸ¸Ôx09G6´}EGðÒ|`hÒ ¢Õ[Õ5€úwágZžézâƒQĵrçùßݸ½-Lf«3³@(šá¬²ÁrJ›ë't²Úë°ΡˆPÑqœd#B”¿r²G&…IQNÒ—ÄÉ‘u8Dä“à…©:{…Ìëy[EººÈš„V†;†é„(+«™ˆLlì>¹G½ÕXþ÷Ø xo6»õT–TbÓö>~iš²¹Í!Ò˜¤V“}|˜@SÉ\Éz¥¡…Q€ˆ Ú-ʇ©1ºj'XÜu9¦ì” c§;ÕîŸl˜—Ôõ›$”ˆ¡¦*Á¨Ø¼Ý2u­ðŠ4—zNC%N*öÃMòïF&^%G“^e°âÆ¢[Œ Óíº68¤Äд1+uÓ›y&ROûÅTõ)ëðsò~ §Ešóœçøˆ‘LýH‰3¡/%5Â^):qái÷bÔÌx.,À°ZÉyaìçÈÇ@—ŸnÞŒLz\º]Uõ©ø°‰£Cm«QjÁÆš­õ¤HTÿëSöþÈóBP²¿ ÔßB^O)Å)Ⱦ9½Ÿ­Çgy±7£XhY¢†Ïö{,W)í¤M8ì(MEÝ+šìrÇm÷'ýÃâ´OM¢7¤UQ›„•÷MR€¯´IGã—ûÏtÁ íˆï£¶Qʱÿ7¤îR¿ëtp Ë)5¨€:Zª¤TNÃãÛyV®ílìÈG@Y¬öw"‘¬z™ãd¨> ›—5Û,F75FC±[h1¶¯(/$S`øzŠmÞNà0 A q¨ñJv4=L0°ô}FÊ ë¨NK¬¢TÉ–X¥¤šÔƒ¢ÎèØ‡ÍE ÄøJV ¬#bMuuÉ”nd„~!ñ)×kwNÆ+ñè<ÄÚHH~ø »hmêzÎmks<²©6ÎZ˜"[ðèUöSEöý¿'–õï€õ$ñ7Qcú­2N w èÃt›ß~̬äLE“9R?mê!:0Dn‘êÙÜð^¼2f%ô}Q_(óÑ Ýmf5ž^4P±q›±¬¹+;‹¥ÖÂX!¬W$á˜]×(WÉŠqªIhǬ³$¦;å£,˜Ig¬j=j–s=Ÿu®J–oª¨öÜq+„;Jâ H€tÜ)V³å“ Ó“%= FéËnM{>Ùö{¹dÉ®'—ª½„ÕÌz5†[4tMtÒ_†—C£M8q1 Î~ƒúùõg=97¥&¨¹G8…›â"Ä—¹sÄ&$ݳ…C2‡Ûz…y9³B·ùÕñÉk8±†y›?<ûtÚ›ŽÎ”*"ïKW‰Åß`õ/üåî…>CYýkø|¯Â FV‡ø ¶îá?#œ ¹Ã3Zª›N6óVÆÊY†l_>óÙV–ÛùÓ]O£ìÞŸMPÙz[Øv@>˜õ1å-:°º”6 ‘Ѥ\W[;.¦y–Ó”’f]ç£N˜ ¼jk2 ÏelÉºÚø›Z‹©k{z¯$!©e!X¤LJÚy}g!Tü|fñ­k_g4f/û›u ç?6bŸ8¶&KíïꌶUtµÀtÛ÷QrIwE"™¹;jòMše]W²‹nëV n÷mED;ãvaZd«D.˜ ¦?yP B‹¸‰êð‰pUVT`[me¢IæuØY6žmg­[‚6¿¥í) ¢hEU.•kœÛø«›nkIæ ã–ÿÌ«°s^WÓx&¯9à 8qåÃpø[óã"b%±M%ª+ƒ>°º¢Ùè‚pÂÝ‹©ìfX¡ÇÞ|‹ºþÆEþ Ã{öw¬ÞKˆKõ<” `µa¥$ ¦°ã"À Uíh܈àá„_7ôZ”³’Pý‚ôLAk–›¾ ˜ ImS#E)Cf Wô­…Ψà¹ÐòhGkC*xE²˜M¿ºÅúÕ±1¨/h¯Ç½}VmCL\ÃüÜÁÜv;S;HÂì-Û úÝYGy0×0ŒÒ¾D‹[!˃)U”sš>0¯ Uß%ÙŠ£Q­ƒ(ÛÀó…F÷0Qqô|üàBãS³fÇ„tµ^bÖd/Ë”Âæ¥Oâ5{mj΋0æ‘Æ Í&å«?Ó!ÂBñ?…© “ àVS¬%YaÉ}·H\@DAëoZW“h¹,hfvÀ-º·8þ®²ô5&#äó7ëä¼Û¿cÓ¬g—Sl!ÓôÜT\ÚLוbvLAO£½Öq_Q ³RØ£Ä6feõο€.•eG\I ûB¨íŒ‡ é 8i^W›y5þ¼o×u5·‹ûφ%¹ñ½p7è³ÅQ c‹foÆŠt€làãdyU³Ñ#¨\BÐ.µÚq,›oVd\ùn¸•dcºædÉ=1¤m"TìasyØ3‡ £BdB-‰ÕùL:Üx&õ™+yÖz—‡ì ôR+`WBn [„dcåAÔ³±øÛôDh¯R‡“Œqä±µt²#b·4~µ™ÚˆÙoHÚ‰Ÿ°ØE˜{`â*ãB0û$Œ¯ÄW™ïµtƒöÔÝ0El¸âºûp±ñsëñ{V0` B ¡Ô>Þ¡që™d‚Oé ­üA9Ô¦6þÚÁ–=¦7˾jÂcxO3-"3Ôg~;Y£q Úyd’ÏÛåÌÌrÍl¸ßÛÜ(“+·àÏ´Ë[ƒýº ‡¢~Äÿ`Nà¿Q×n£2+„gÖ•‰9ؾÉLP³@öðZ2 ¥m‚ –a»?*¯B̺vòÌ¾Ž‰Þyü%z‚xážÅ¿'WЂԙÈf·v¼‰PÊúÄ[Æ»°™),œ‚Ð]Á嘄Šc(éà_„µfg¤Ô%csÆÓé`£<“ú+×› „رcxºJæwScì/ôWWÏ*±‚$?4³£Ú郠3‚éÞl¥Óx vhÔ "ÑÚÂùžNí›ýò^_â²ë§*üÝE›7ü·Ë»P¯i›!3­ƒªÅ“0oœ«`¬ÁÇŸ—-¸`7+ NyÇÿ`’GsäÝ@‡òê7pLÙŨ€Ø²é˜‹ °‘!¼]U‹šҕΉë éÖÓr6W Ü [°Ý»Î\€U¬'ö CI#EMÊH‡ª¦™a/ªÌR£ÃÔG^UÂ@jš»â‚âé/ü2…§d¾ýHü;ÙÔa¥,u6F™”¥,;3o%b¶M9šÛ¼Ë$žÍHÇÓ¨Ê6“ i`6õ¾Ϭd-a´ºÂœÑØ!ÝþÚ…)Ð4z¨úÑðjõ€Ãʪm.ŒRV…0´e÷« œ"ï<³&ƒ•·ë½á“JƒúˆØøû‡šEÀL€é^£µùw•Á2ìúVÛï~¥izûý™+pùÚÁÆÐ÷óž2å^z&ÿéÏtÚxxÆ|<ƒ!ºHׂ±Þ½°mæ³hfÇgíƒã™NsÏŒ£B @(O™²Ã¶eÁhæ3¿‘|(åéàa|ôû-ä¹. i4sáKò¨1lì´<îçu²¥Ã¨¸àÖ²ØkfÆ–ýM½Ñi"žÔÃVÙO°'Qþ­D¼Dñ†g"¸8–Y . VBú‚î[‚ìÅ$Ðó÷‘„Œ¹ÊèÉô·«RhØžÅ[.Ñ4W*ð!Б6¶©²cvñ•Àø2‰Úœ}÷y0³÷Lx¦+Ñš™­cŽÄ”Ï»SÁk]»{œJHÄc6ñ^†Tm.Î9/Rï*« -y„pc:A½„æn‚ôp¢ú#6þÙA{Œ«_P6“yã<:ú%vT r1èáÑ(Âm|TÕEîbº(A¨Ec¨UªµÉ]ÍZìrõdTÙ–GU¯Ç5ŠB„ØÎìÛš“¡z7‘“í6·®‰G&òCÙ|e—Å“$¶gU_±žÒ×"Oų]Dåny­ç ™CÑ+ó…¢3ÖX1ï¥ 9bš&FÀ`¸¦¶Øt.C:1q™/AÆœIboØ¡µÁ˜Дfø È¢–’ÅXŽí}dlÑòø»÷Ì!ö7¥9Å`¦âa¢|ªòÍÊò“+Ûr¬‰ õG'ð!°Wã>x–G¶ Ò$T˜’G üz$Y™5d{=GOe/,Ö• žÄ`”Ñò×—|™"*˜c æG¦§É£ÈD¯ò´tB±-b Ê 5?º¾møX2­1p"¹k¯ÈÇÄ ª_¨€P£_hïH5g&ŸÔLŽ–¢Qæ¾k¼Î@#)œT¹$¡!”²õ<áñ̇ò+Æ£Tûúœ*®®{J¢©ä´ÇÄg£ÕÈÊ.}%27O1sºJVÏ]ψ4ò9Ÿ ´8‰U” Ž:eG~áÈË/šX=£ŒN¡6J.Ðwò-]4†³r5FïTAã Ã"‰%9vñHÚ*eO± f"ÌüK¯u)¾å- ÔÂq&595»íZ¦SAïÞãeN¾‰ò¥¨G–¸`ÈÅ1(uãM€e£tvi¶q H´„ó MqsÀdGÃ`h© €š—8Õ>ª€}4óN5 §WÑ Aô—¯ªkbÒjRŸ0­§ áÏu¡î #±7U¡€ÑºHFº¡–Z3Ú¬ä%Ú‚Òû<КvˆÐñ0¸^€†]o~­’ÉI”Yy£…¸·.Rb``Û¡¼´‘É5ídY`9,ß]b’.¢ˆA6÷µ ªa~þ Q”W^‹$ù½£Ÿç¦À²×‰DŠ«kôõ!Üh!]ßrÀ"‚¡‹™1-Y£$_ª÷ˆ¨+AhÉI `£¾CºÌ̽Lÿ'UȰ”œ}ѻʖK­xæRèNèhjb;bרöƒ6ЮµÜU[Е5ƒ\âìÍÍC…ÌjèNè@xÛ®è’ Ž!´‚{Ä×6˜Í:ê‘ÓbÆN>ˆ y- tüo^NÛ ÓQ¸à‹sT®Kƒâö:‚šGg±[“IUçÄ•Þlmj4Jâﶆ´Š£ oˆ÷Çp ææç!aпh/O¥þ<µF1|0Œ›ùfÙù¡Wyg¤bBÔÉ›.3»‘,ï´·€ÏàÍ{tT%L¼‘“Îú„ÚůEÀ®#”‡þ€ p°TAkRÉÑ?8_¸>Di8ô,Ò‰lè82UW’¡ °+HNÀÍ~ÇzþÆø{<²¯]G¸]ÎA1~‚ÉŽªÐüNsØšOäòÆ–î_µÇm†Pá6øY >úä÷cQ6ñv+Ì%²lM"¯­\ÃLKM u`)#ŽFµS‡‰òX×MÎtõ´¾á—\âfˆÜ“»V{ :‹ÉÄðo*IvP'ãÑU÷€¹ˆõ?c?OE=˜GC$ͶÇqÙe/dûÿšEïj³ [ ¦®¼Õf7oàX®×æH¾Õ‹íŽd&a¬åÕ ©û§†ë±Ñ?Üçá‡6úãâ×û¸Ò±Ý»=üG·»Núa]‘q›˜;ØÃV à •˜èÖ&ª×›¨/Ê&ÛJvWx²­ª[Vݱ‘±ÍmµvÌ Ø®icÍצš/Ö'o„ÜO²É¤Š l\Q‚Hã¦Bÿ;)Ù&j*.’¬ß?žjññr½Ÿe¸æao9J|tËÕå]/UÆ¥`’:µE€ù\?dañiaW5£-&®´å'ØbkçðÞƒZ;¬Æb;Oµ‘ ]yʨ óEQÄ[º´ô–CsùCW AzÇŽ4|å¹ßžs]_k‚“ÛWYåøØ¨ö¥D}è–Øi»/jU;_Þä¼±H«Ýþ1z+—á ƒ€ë|‹cgfyÅ[V^xÏT߇æÓa¥.uDA@2Á~¬£Ÿ:zKI4{Ð-ü·M±LR}lìaBöBpï'ðæD‹è°ñËI«Øä GÙ³(¯íY˜Žª $6wé k5‹U»sž¼ö|Kwg£BÔnAË,0±ü >•ÝâºÂ(K(;99TíÀçÑ]åUÓ€Z%åD„p,Ì>ÄqÄœ ²† $‘Äâ-(©hVõ)"K˜HáØÏêþcd­qÔ&iÅ`Ê‚ªR2¶Cò€¾cö†Ú+R],%OÌ${ì€5áLÕÅ?ÊT@É]@zD ²Ö …gj?Í_ËòÓ¸"¶ð.É`À¸òå<+½¥¡ƒ½À0â-££0È‹œçˆ&±ÄÙ‚òaµNcÎf¦)‹z~ýóÆ ícï¯{Kc¸7—»7HçÐpÕ0÷O/MöKæf£ØBO[uOJEyvb«ðò2'`¨ä<á/(ËIw%Џ|EòäÒ‰šä¿Öˆ¨ãd´÷Œ…*½°? ºX’Ŧ»¬hЍúFµ1L j7O·Ns˜21ŠàLåÀ8SYh/=ä8]È#€+WDüP¤pnKðV¡§Þ̽¾!ÞÁB‹åG\Ò÷úÓ\dÃóp?ŽBºñW¥B‰*˜Qj](àA”‘ô°5•–!FÍ)º'ùJžqë,´x|*Ân™QŽ×·3ì3™ÌP ÞreÕ˜ycºúp­eyäxlŽæÁõÊÁ:Gl"ŒŠõÝ =˜áÞcÜ—¨L˜ç.ºªO÷½@z%,õjs7Þ*šD×¹t\áÀV°:<1#gv<8e2ÅnF,vx†¿„2 î‘fç¹cViò¸ßÉ¢øt°EPÕZ$<ÿõ[j:ï|Ù}e›X ‘gšƒæ3vư"…§À<á¸hA5Í@î,Û®&n?¼jy¤U;-½ãk¥ÇÏ]Bâ¬hÈÁõ™ï•ZîõÛÇ›3^¾ƒ#)^Û jmqÙº¼x9µf±>]ú¥† d5+òPY´¾\W4êýȪÍÊ{@â›q¾Cg‹µð'ÇІ.‰b0©¶4x/´ ÍÕXðËÞ«£ ëÊ8 ,Œ C6‰T¢¬e{7²B˜Jónê1ÐØ˜„µ}‰%fbh'ý(ü¾yùìwßþù¦ð›Â'öÔô’VÐ>ÀÙì׈º]uSѰJ£X„¤† »<^ÕÇž{ q³;çή—#Ka»ø›OTõ_…ü½P½LÞlÖ'ÑN:h‡S2ÔL&ÊšàOtG{ì¬ «¢sƒµz9O9kµ"9ÊT÷·t¥fLƽè·ZÚI ƒ{ruÚÚÓE&óJÜ&|³ûŽr;>ñü¦ÇÇW=¾|ü\">@ ØA'¦ã„ý˜eĉ4DfÛíô L Âˆc(¨XTÚx¾ÿ`xau°Û¸xÝ8ìû¤ì&,ŒcßNòñ›ÕwˆeÆo'198ÝI¸,Ʊ»à`ž…ºðx“²È‹_²÷WhŽÓ鯚?âAF´Y»*Åõ,(¬8³Ç_[GZÓÑùsÓ·d/a:ߤå?Šò¿oV°µ¬‹íÿmw/iÊÚ ;æÑ J±hÚ¶$¼–º6µiô´ú"S³s׈2«Š†„b¤¨F“_ØQq¡B+ˆ'A‘ï%îá#ÂjX5»oðCœ3ŠåaR!ÿ[pYÕ&æä4Åd÷eèyæÙ¦l”]Lng]Œ}Ë•RV…ð‚âD¥ÍŒe]. ÷ã’ºËAܧƒ~«'îýûç‰PN³<ŸæGÎòŸþ‘nÎúh–↫‚¦°q ‰B˜í®H­l›Ë6ˆnv7vEâ‡:Æ~½yÕ3¸ÏH«¨Ž§Jkü¸ Iƒœ;³Ëlƒ‹ƒSQqëå¯Q÷ÃèSŽÐ¾ú´Ù(É»äTì‰\µO¾Msn% 2ÜÛgÏæî»&ǃe4êŽä2O …©A(Òè<­d$ìw‰SÄ[<à‰= „€•Íý±Bì:á ì&°;)¼‰H‹ p\ùÇÉ3J.öƒ]d;ªcF»cZÕõƒ’½»dò†RKÑ…ht4­Î„0÷ @”Ž‘®ë¼¦²ÛœÃ› ¼4ûlŠìÆ” lD24WñŒ34ž’WÈBiL/<íÆÃEŸ;C»,Š'R£ÁxC*þ Y!·ÂsRz$ƒj¥¢½©HˆÎ5÷$Š||Œ2šˆ• Oq,à‹Á.Ï"‚l‰Ã±æÃ‰ü@¨¾³arözc Ìm¾LËâ~ˆ2G/`3tvK!œŠ!ûÐe²=É"/O·š+Ì!ÈÝÉ0h—xj^Ù!  8˜ÂÀ¨ÁA…ÖŠWÖ’OÞ¹Ì ½¢r½Ÿ¶] "åfÝ€wñІĀãrôˆé¼K±¾¸HšÌç\½c²½}¬.ï‘K"ÓùÔW1FÒ RI°„ß…‰ŠPNÁeÁ¦Ä«b€<³²=3~g&öü!'¨0Ö|Œ®Ò6¢‡·l㣠c_ÔKrº–›mií2 Yð3G7ú‰©"3“™Ó¤nÇqÀ›Ëe›b_ÅÛ¹%aÀüÚÔŒF¹‹¶]dÔ"§•çG²žÇ#é•@déíÄšžçR%¸©ØKeê’aO• ¸‡Á^µD AaGµåˈ… –™0YÁƒ4þI ¸Ž• ¶n%Þ™wJµ‰g䢕¶´£»º“ÇU¡;û1xh™<üR#bŠñí“è=>ÖbрܩXŽ,Y®¨Zãè‡j¯¢ý Y«ÖáU¬ÈÉWc–ÇlWÓ ƒmw˜ß³{°9+‹w ÂZRDšò`€§F› tnwt£SÂåÙã2lîAwÔ•^žIÛœ7Å»ØÞf§´Ò,r)·an LE8ÆÆV“|&KFÏý`em{@ ÅöçÄu4Û(ŽäE`ÔÕÿ.Þæ]‡¶|ê3 *ñq8i!à=ÙÕI$N¹Ñ Ý·AâÅÞ¸ÐeÝ!ü$bgeÝzÖÍ,½œ)5ªà‚˜pt# À+Û`³]BX¥¬7EŸ”¿r³.Ñé¸?2¶ 9íýJÔÛÔÕ·®ÏÒcb5ÙhÁ R <èȘ,"Q!ò;ø¾1DP7»É…M¦9jÔ†¯˜Çf‘ ÚNÛ…´@WL߷݇¡¥ç:­¦»åt“™ÅNQäÈv3‹ ·™í–Nõ¸Ú[ ÞWíF‘bÉÛ2™á]a!š71ÕN6äEÍÕIÝn>AiAõd"º¼ˆª*²Fn-:íÀø0(Bš8Ì-|vQ{{Ä‚u,ŒA;°û=ñHd´Ñ¦pb_DVh¡¾í¦œu¬"^èÐáQÞ…¯P d»—çÇÉ)OKj( IÂÒÛ¼‹ô"ûLíÖÄÖ+ÆîÎã2º²ã$®@CÝÃ÷NbÄ@ªwG½’Ï2÷¹UÔ;¸³%êÉ®Á“¢ŒžR*r»<ŠÝʉ–z%Bœó#–1±óá=¯”lJ6=+YÇ€?o“¿2¤šjP.Å8ÔÓôlž>VoÏ.¸‹zwmIã#’ X»¤,:…²8$Ñy©18kòîN z‘sÕIÂÎÑÏ,8°8—C÷=«K¥RR=kf>q Lˆvùô¡í¯4QQ`œ*Çãéõˆ^­mŸZ±òÌÀlKwöQ¦¢·¬Û͵×PBMåvªWFiðÚò[¶'Wó@ï'V \ÏSõ·ÝÑðÚÅŸrîÿIO6/e=fz²,g_5”)¥BÓ¢S+h’ªiZjXÖ¬ªnˆ•¡/Ó¯<¥ëd)Ú´êÞK‚ٵ߄t»8Dƒ'$èE{¾‡k-ôf%xZSº§ þ² Æ¯d´ÃÖŸ˜vFRbüÈýÏÎyõ8-´µ­<µt÷H~+‹Ð8²ÊñÜ%9Y»É`ZÅgÇ~ Œ¸PÆ\jP…¯Ž° ç|A@†Œ忼‹)[WÔ€W»ºgƒ%'žÑú©‘lœ— Â’4/$jZ/•ÒŽ–å)áÚzÛiE)Ý;ºcã¬Øug3o^6qªpŒA¹V]áJvPä“ã%œ)°œ¤/Ôì…m¬´ä£!ö9¦`P3‰;âJÙzPûŸ¢td§#í*ð€äÕºš›øsµæÅa+g®‰òLÛÙT.£  C)210´Ö1…͘‘Gýú$C×tþbj8¯Û›'ÖºbÝœ¤©;ÉÐ×ÄG\¼ß†ç§È·030`ÇýªŽÙ¥Æ²ÕY©ˆ d‚Ï^‘ì*È5êiÈ3è;¼™Ìö™ÑÆ£²±½ +?T'TórÖ™Ìy™Ú·|rÞAØIž=3N¶FhU\î0YÝ<¡58´;ëM8’ÜIŠ;Q“—Ǧ綺0XjŒ?u8EàD1Ãw.G°a]ŠÙEg߉Aó,hhÉŒn$Ì#³ ²Wï£Zß^ãiµê2þ@ù` ¤}^“þf2˜^îš1V‚z=78ÍK·³Û –Àƒ\}ß¾#ð&Qèç‘ÄcAŽƒ+µ@އìÐŒ™¼N¹®{^'Ç6a&ºµAä"(2»½]²Á4vŸ×ä‘mM} P]€nÃóúP»—ŒefζÊÊ0Ô{ÙéÎÐ&¨P;î¯F´¿£TÕZÙKžî>Ðð4²à©œ ¡¡±‰" I{Bß[pÑ)ÿ¥ ¸‡ŠŠSeÑO9?=Ö½ˆí¼ô qoQ ¨hU2ÇG©ôÁ°ÄvÉ*5ƒµÞGõ£òé„ÕbÖÀu•o”®]Úy Ã6ÎÎõ²±{69e>71`M þÒ>ºŸHJWÕ²‚ Ãù; ¸¢ÇzÜu ÷!ù1œ#Cq¦Ô.à2AÔƒd%fÅíÛŠ¦bþGÜE$ñ—ÄØæ¼ÚÈ=ƽþ´EA7Ò/m[v—«ÉÊ wsÚ‚ð>\0Š u©gŒbCîÜ·PðÚ;‚.rê ël€?ÑV'Ûä\ÚAÖÎ5˜ôe}‘´ÞÜl•VI’ìdVb9~ %úû`,!% «/–^èU'–èþ¼SŸG†ò(f@U×;ÀY•Á‹¿ï¿\À ‡ç϶£èÌN ”pæ¨`ã$B±¦/B"ÆÆÔü’3.Õiÿ``Jñp¾%mržÿV“ŽçRœÂŒïk3>ûãÚžÆ#üøÙ‹iåDí²›Êñ'>ðµ”ûÏ ¹ð¡”ûÏ ¹ð¡”ûÏ ¹ð¡”»…\}rè/X†V…AÈèÁò\î¹ô+×(ª-Ýd|=¨áü†`Ô×BP™’ E™7Ž8^‰²ôeâ¾nQvíÙŒæ|ô‰#çC”5h$ƒÇZE†ºiÎÖÈ™ü_©Œ2RŽ>êè?BèLIð¾%T¥×_£KÑj©`óÕ꿙ߦñê´ë3yâÙ9ꈾw>XJXÕ[ý:—AÛ»›$‘;a]áñãS‹x‡ '“ñ?Ðë¢zmý'k?˜§'BáæÞG˱,ÃU=.ìtÚ‡ª?$&Xí³ö ¼í¤4 ªo*††€z¢ºÐóŒ2cÑ<ż­ؽLQýëé¸Ñ~ÉT¯×0›ü˜\_5 ³ âÑ*ü©ÊÓ!©(E| O ñð4‰»S[mDÜÍЀDÚ-ð êA24PJBsЧ’¤3©¿Aê–ÇÔ=,éþJè°óªŸg¥Œà³ .Bù2G7@º*©“ê‹Ú2{L¦½ËiòÄ»w<‚”ÕÃ,®¼¨G¬#%ªpbñ@ÉĨÂ/*uÝÜ{¶ÂõxIЬc¶¨ðc’ï‘—eIÎëÇHMT„F÷Áiö¶›pïõ‘(úœxÇHÜ;ßAN=dîsIAͯÀ½‚Fj:j²’ฌ.SwQóå’ô~ÞNâÝÃm`Cà‡÷£Ì§gsŸÞRЦ§FŸÊ2¤ýLª‚óG3Ö‹4Žc,6§^åQ0Þª±át%14!ž!x÷Úéí=Š=ogQÆ(§yU%Yõ@˜§JÊð\\Iª8Z'¸µSCWgÝÂìšÈÆNϼµ=|1_™ƒ9†  .,—ÒíhÅ OÆBW™UðGÆ£ÙGh€‚‰¤½IѼ:¯‘%a{øX>?äÑÈY,ЗX@ ] ½<Ý#ì.”»9¥Â ÷q/M+örÀ£TDxãP¸=ÔˆÑæ1œ5}Œ£ ¶d¨첃u*)‘C|ìŒE&ßOu|§âŒx]†(¤Ø&ar`®ªùŽ0~èþQÜ R@õ @-ù°QèÎê”E3æ†ÕR9ÅkÅ™ŒsE+6*8ål¯¸¬Ð¾ÁÔ/‰±wÑWÊD3–êúÚ™ðö «ªÎ ®rœ@p¸Ê¤kÁh‘Ì1Ópn^Ëw±Z¯ïäT$¿Móʽ:ËóU]cšU (š›á½Ó!g?­ÿ¹‹ú"¬ÑËÅ_¼K ƒ¾^Ò}u->_ËWüê.ª3' ¬KõÀÌBè´b ;`-yØav@"õøÊ[éELãä®B~KgÅ)î©ã€˜=äÝUkýá”­-GÞû²¤ÓìŽ9mTHâT$ÎI6Ù@¬ RHÅöhŠËûc >°8‚ÃTùQPZÒY¬Biµëâv5eœ)fQ2'+ôèTevõZÕ©;—ØJ‘_FkÖ߀ YÙ)ˆ Œ)Öd+ëáÜÊ•ô2•ô2Þ Æþ„T5:ážf¤øL‚Œ‹¬]<镃y`kWõt’èf¬ÕY²ÜBO©œP‘šùçUfŒ±“6BýêK!¼môÀ:jÕØ…J…×K \´DÔŠ"ÄtáOÀÓ”íûäršgÁD¡›û],|2‰ÎL‘ >¼d í“AáŒÊQDîéòQ]ÈêÁˆ422Á^SÈšrkZйÉJ'òšÔÃÍÆ* ±Æ€½{}"à§<ÜQ굎Äa°¿€d¯Êµ1ÄÓë)@È(ùA²@¸âvæÎ¾{o4µÂvÏK å0oñº­ö›­½¶UD6õÅà ÎB,ù² ÅA¹®âED7‰©½Šß3éš~§¤ˆ¾ï™Õà‘yRl>ÕUilÍÚ<ù×H™}ðh ÚÕïG®’÷”™…M«"ÏÆX.߇ÅK Ô—Qú(ÙD“QâzY²eW4­ôÁqdÛèPÁÖŠDC`lÅ qa¶„¸XÒµ£Æ-v0` ,ìöéE†œ½qÄC¾ž½tKÑ-²+2•šÙ`¿t•$è!­Rð`çû¨Ü¯÷Çë©#ÔDØ×ÂêñÈ$~Ta$íÒ=UÀ»w¸²î;:¥Ä›Æ™d´¼µwu‹à²IÉ9-Òèq‹?ÊÂÓæ`s@é!’û-‰§Ò½ÍQAwWÒnòͦAñJ¤Õ¶ÿŠfäðÑÍ›‰`Fcf«+_`sã[£Þ*âtðÀ©×9iÔaÝZ€Žbn±å—Íæµ÷R%ÛWNØRhžáCgC¬{f¦FnÀÖ‚=_`E¬Ù†5ˆRzfù3ù¤ìÅ¢ŽaIÏ2;7£¼žéhÐH]³z&­Þõ>H=;d>±¼;³¸ÏÚB+-Çy²;Ö,+à«€5ù<Á<ŽÅ„ŠÖ®>2ödeQžiAË7B uóe¯€O¨¨›×`K T:;Ë«‚îŠJín˜–Ø “í3‘#«£µè ØMâ¸dr•4•ä«#„mEΜ3„¬B2À‘ߨ] ï {jÏ<{qBMPCmò6餋ƒªPúòe8÷}^˜ƒX$à—úT¦l«•MÀ lÔjª« C‰0o³[™UF#2M[ §dN [G£cCŠ$ªv4W?Ö9‰BSÈF‘Í ì±i™Ä ßoÉé­¹§AÈÖ³øLQúFX<-“™ª?‡D⤵Y¬|©§ŽàÛ2±#÷uÞÕÑXàfDÀl¾øWÖ¸ŽY¼N~ËY>âØYµæ%hçÔpn\Ìò¡?!9ߟðÜŽb¾tÏ:Èiº!ôý&å5Þ¡è]Ê›ÚEzE †C|­_›–`¡ Ÿ…à0*þTŠb¬ze YK_Eð‚ð ˜3vv ¶$bMð«ƒïåÇȈ¶Å(:?9¯ÐÐjK»4oë—Õœ——BzE5¾ð>Q¹Ò,÷¾OdäÌY‹‹}4æó˜Q‹œ¾a¹.!§ìqÞç§–¯ÞCém—V¿ÎÊÅr+ÇÛwØþ%h«c›–Cax€*1–Yû¾ƒ-¯É#è׃˜Òé(›ˆ@Â#n`;__‘±QÜŠ’ˆ™]¤·„¨÷8(»ssg¥Õ–‹õÕNS!÷óò[Á%Áæë;yqžTÒ£’¢¥ ¥#‹—Qx¬¨Ü‹åJ|’œôX¾®’5V“É„ü’eŸ€ý‚|aŸPå­*è(¤?JôbÞ@ÌÎ4ç#™ü¸³|q%Nr,:åQŘJ¾¯KÕ˜aT[»×ë yÓ)½Zp&[f_pçh¯ÙFçA9"¦0±wËù6íQ‘ΉARÏ‘>² $ù¨ŠacQßYF))\h«²ËA•§­¦X‚®„«c‘Šö½©¢=§«0žD«“ì%VGbá­ EÏ œ‹«½çsæGœzÜA)@Dn”~2’ƒÙ( Ñ-â'óUæÖœŒî<Â"E€DØÛ‹ÈÞi›&ÚÐý=“¢üo¸…¸9Pã¨ØÄ‘ébê",™üb8$ú.Š :”#FÜÍQ?#OŒU ¿“ H¤±‘^Æ´w™twÙE蟕ò+Ÿ=ÇJ-M‡|Q˜@jT«j5àØ—%3wC%ßñ‡ò­ƒá @5´0ƒC"sÞú5W–x,Ê¢xáWÅq®‰È¬† !nP)¥ {r]r.õÑÃE(Ækˆ•k« F\Žâ÷ ­Ö«èÉ ¯ã°Bã,`mîOéXµèì¸Ùž  «ËË ¬|~aN•­’°éãÛçÈîÑg²áð“ÏÛDÇ÷‡†=”ø?#º’Cs%»æ±I@]Iàu¯é®»š(Ñ!;­ÿ^ XhºÅú£ñ‡= À#Ë—\”v¾/û¡üZá•⻕¾AõµQxk«?Ø û‹öŠ\Òe"&—Æ€}_I\ãc^«GðÙïW^hÐ’“ªì3œ¼Ë’U§…'IŸA¥vH)/¸ßm)žø E*y¡HâVúƤ>gq (È£H•¢ÔO*òg¢z©ÒÌ 8%6䄤ì#ÄŒb{Ðe‘tŸXº`.Dü¬©'Фŕ_\’p„ð„ÌH ·†GarÉ)DsÝ ÒŠ2À€^¥LÎHj;9 pJ)×9R’ ÿŽÐ5ŠøºDTyá+0î‹ûà³îmôä Ë+£DIÈ’kÓ© ²È;{†U÷ ¶-Wî ².‘;E[˜·ÖÅ^¨›*®©Š\@I 6r+  8ÐSÒ q,Rûß°×s„vf ÇOyÆ ?½ £1'S`_’ }IHïI5b¸`5$Ë/žpÂöÉñÓ+*©Ž.9¥¡ldÒ]vX•Lá§peiVR‘–\¾¡[2 ís1ýPÊëId'IèÌÌÀ‚¢(ÂzTl\2~Mr 8ÿ…RµŒ” p §¨³¬ô Åx¢ zÅvL磃è²z`ìÊØ•PÄ‹.Á«wI6D Äâ®\˜­Ö¸:z¥gþ+¿AzÃ9=R­MXQ;qéÎÒK•§Ï¯Ä5ËCŽhCΠa®æ!Š3ćd¸†òŽpŒp †j')\bg¾+¿ÃúUvL`Š÷ÐÎŽXç*l£=d/Ev˜¼”’¯LX–#÷¢e8ªIÁ¢êÏ*ÿ·kû[ªE.ñAÄаa$©NF:îÂÁØ“Vù/èÑÜÒ¶îI»hÉ’×(AKÁˆ9¾åñ·ÜoþŠoA«vø[êëÚ=O‰Š_ÜßôZ»àÆ—§ô•çÜîñ¶/!ôjÛþ‰ o怌$$3d NˆjÙ”“û: ³ª†üï5»eSR”ÐAdŸ0f¡y@ÆìBÎf9×…û°¡½½+€ ¡$€ò“‹è¼ÙŒ]_)&rq˜Ä ”/bF €–ŒBÎJR&¬} +Ê+ri ‰K}®;qÖJ¸lÎ: •ý±È%«›Ê,iÛ+¥w»î+ZyÅÛèG$tŠÄ:¡±û¢ã‡Ëéß h½àKÈS°ÍL»1]tÁd\5ʧVºC¾ëç“ÜmN&÷ÏÿØÈûÏIš•Br'zRÔQ0B;$ˇ$´FÄäо5T"kñÊ(3›³Y¡oú™×”]ÁÛ†÷/PùκŸ–`Lˆé5é=qžeWP,uq>‰>ÔïÀÂ’¸Z^²àÎr;_¸è_äÛ/¯Ï“¦‰TŒIL=Ù¶t$K3iWMˆ#{+k— ynÉÊoÕ!Ó̘V“Y·‘ HeI¿ å üf(I•-c$’&An¯_)¥|6"kž“½9'ݹå#lª QvbÂO¨ýFr¹«°6•B?•jßs÷BCV'tæ¢1$Gà‚¼qHÅ™KUC,¿äü©?-G¬šÈìà™«>'©·*)˜ *Wð\ÛßAÀ1`[/šiTK†^͈KÅ|ëÿ@Q#|{°Ô묳ˆ.¼•RvTƬ\>AéAIšQè•ýH:Žjúxr{È|·–ˆ8}î}{L““‡Ü ÌûùµŸØDxÈb{†ã¬¼ц‰“g‘-è{÷Ù"…™š‚J†®Ç2X~y2Ó™@ÆpdR"ü“¯»¼0”“u>{JÞK™kÆ."Ë2¿€'O`ƒ[ýÜÍååÆ.z2@¡ëCd/¬—b¯äÿeM‡2‰Æ©ÿæ®7l[1¾ÁÜüÿ>šjCÎĬR([RO€ ²bÂ[Åq*o5ç“Añ >“( }1ÁòÅŠ³Åô®àÞP¼]pQú¸OZÒÙkE¯ÙœKÍ0~É’o5µxU9G d3&nW%s¬0„§ÖrxN/„‡m6 éÇáH‰áfʯ@“€—÷•ÏGtϯeÉÏCúÌ–NzÙ…dƒäÄ´Fb:°ºPku—ˆ##%M·{{Hm]ÁÉÁãP<)xô ©8Ÿ4þ•›U¼k„,BNF2\Ý3Â#y°iÔÁ–U Ä!^:’‚’BîŒÚ74• E-ªËÖ;ºÂÔ&ÛNÌ·3WÂ0&ËáZ­®eA¸t…»P:êÊ!ØÄªapÄMP'©z0èJÂÔ¬=y§'Ï…ÞŸ¬ç’ËD·‚GØÖÔïÐ%ÐÊb¨•íîæÀ¡J%\–­{‚ýGpx ,I÷ã¼'õ3Òè…H¯£s˜½&ò1€1e¥K¼ ÐJ…suÉÓô®4 {Më&w¯tT²Uc‰dÁµþÕƒ4!ˆÓS’Lã.é¨ók’ù¤ÐZ—vjM%/ ó[JŸ?°ÑŠ_*Qlòµž»\s‰<)h ] ®ñ?›Æ1›úwd½ñ ±.}m‹•.‹‚ž¼:ú/Üâaþß×  B•JHE(…á*a€°vÛªg› G1o-L€¾H*‹%W×V ´‚;\ÇèB~¶ÄÍ £fw©[#ð6„(7é’960uQŒŽR€Ñ¬$ðå) ¦¤»L Êù×OP#±(“«ŒâÞþýTˆŽu}™N,ŸUÕÀm²Á“×Mö/Ìë2ú¹&5t޹@T kü‹±2ÎA Ì^ûДHȽw øaÀ%@UIw`ÄåFß±B2&eʨ¯¿CPUް-»× ÷“PSV:}Å\¸ü! "ü„XC d”rU’Mž#JT¢šÒ›(F2&YÈÃ%7³Â|ú ƒdjÖÈÇÀ6y(~“I«Ôååuvù‡žˆ†`O^‚x©õgbÿp´’I\9øS&ò‚œÅb¿.%'IHàkÇ”çW¢å Yñ‡ZßÑgKbáT9Ô12 Ïzá‘Ì]Ø…G”L;QÊi˜“ŒÜzòS‚?ȇ´žI=ürÀL ¡IÛ¨Ï{äBa=ááŸ#ô £ßÒnOY Ü„*rç>µ”à¸Ò+ÁºûŒÀe+÷=áíª^B‘°PL3¨^Ût¢ÌŒ‘ A,¯œyuy=¼+@¤ÜCôаË!¹4T‹ˆ›n]U9„Z@>"6®~&»£‚¾¬’â|:¢$©ð_KF{¤¤Ø’Ñ1Xx{ÚèJÛ|%)*îå|hz Hǹäœç’§´³—B…Èî§T»pÌjÐ+ j (ÀàsØUœg¦,¯º´ Âß5KÄÆI8Â}ïŽüa5 ;_ú£¹bC8xJ¡êuÿ `û¨ûßp"ÚiGxȨ«tLbBTª tL] ÷Øv%çyŸ‰Ch±“j¿äz¸áüJwd»&\Ãû€%¾²8ÓZ¿.žt¨i@'” u§8E˜‘tµtÖ°,3Þ*$KŸû,Ï!œJ$!U”šË5¥ÏªŸ+•µý\´ô9HDtC7 kÅ ŽCxÄ ’ô­ïg¯Ž^iÓˆÐÐr ÷¼¡û ±ÐS>ú]QWž’5DEK. nR:RÈV?G Ü™&Qö\[v€¸--.‡@Hw1’Rz /¿`‰Daá¯J«’ ¦);ÆI1Q̺­òÐÛ\¥íNÔ®..ýå7à´WìÇ^’öLF±P…`ÌjAÚ¬ üÌ‚Ð\ëò‚‚‡íoðjƒêón !ŸÕUß°µWá ‘ÒÄ嵬´JXs¯„qÿ’pº”Ó_Ôx®‘XÍ «Rl( _’²Ó¿¡ëfžõ§Ìßù¿#‹GȘÒ'Š>2u³¥â$¹ýd¿îÖr9Un'ïÉõeA*8¢Dʬ1п"yòµ¢s» æ»Ê ž:gàeq—9¦«5PÈ "´²«ž À_²ÿúÒ[Z!+V!œ”ÞžªÄG19›„¿ùy}ð艿¡»“½?Ω©O=JµÿGR5ˆ4Wÿr¿ôºUÌ/ž(½xEjSrl(Ÿ‹uò˜-S&˜ ´0õP…ÀcÕœ:›àT©¦&#AU:6õÁ> àà)á_ˆ ãºbi=ÇÉ–å~îqâ1ÎÔ”EÒ#!B|h¥l4ŒAî('žüÚãÉAr%* …ÿ‰Õá&,õ8¹«¿Ï…à0®IÄ ã+¯í7$¶3y‰ðß„å …‚*nÅÏ r»œÎhÉ3L¬+±JzjÚçú”û±yìÇúØHÌØè6¦@9£™õãxŒò?”˜Í~^2¡V'¡i»Š”ÔXºÍbŸHÞG^F\XCè[C×ÌÂìÍ×ç¯""ê*9¾†aåäráRuÅ )~¡TɬÃ5DíõêÚzVŽDmY „‘Y=°¹çˆÞà^Én¤]œŽ¨Dœ}1Z•²`Lð|…Ÿhˆ®š!ÿ-†›˜¢”+³–ZWc‚êjØ5Ù© —eWQùwD†!žéâ¹÷åN)pW§R zˆTªÁdqƒ:¬ÙxP¥,ÃWà_©lŸF7ˆ‡æWe&™â°ž‡‘„‘ÜèŠQ2µ\ÍjðZkš!X“Xy.ªÕ …ÿÅm$º°#b]Ë9êòFJ¤>Çu7Ѭ‹|íw”³5G /rB9þL…ÛÚýR~ׂiqN€œ’}´¤&Â)åsó Ò^:¤OÀæ©AA,²0«È S7…Ÿ•ß¡ò(Ú5EÖ)y’éî«Èà5*PTVýÿE£9É” C×€•[Hi„´AŸÊ%H¬çLQK¾I3Ð’@ÏÌ´Do<ÒP!W6˜û–J'Y€ÿˆ¤8ÆÆü”;!﬑rt*W¶Úg:ä¿sj  ï¥ý§TÈÊX6]¡\NDHr»Ÿ‹F’{¸¸ûʽr790Ruë]AúEÞìA{þîV˜`×t G×™Àûªah³9ô„Ôåÿˆ4¡ ª#¬6UB)ð–Q‚:–̰3tBzFs*ØßG×#Bøñ/¤dÓa®1À«÷RQø›Á>š!d¶{B\WUÅs? È¥¯?ã›(†ŒNн»ý1â`‘—ÞK‰H¯„âÕw~É$³›#qŠ£R9ZrÑ×)DyóW—× þß½ýé%€RÑßfƒH×(ªMbžÀP\ðÅe_q†„CtJU¦Ò+(ÿ–}¾¸òJ[&yeÖÉ2Bî@ /⻤~èóEI»;+$2A G¨Rͪ¤Ã„É¥?’ #]öNPKX&PDÓýV$Y’Ôfú‹÷rt%5™‘õÃT"tð‹a{÷5Þ í¸´eiaŒpžJ…Â-ÞËëQâÖ3RT×)ñ¼ZLáƒêw(-Ï@Ž"*·RŠØJŽu…Â%îíFü5õ÷Ô1T„½gHŸ°‘È›`îDQäø¡;`"0°×LɨYêù_ZErö“®ù*(B b0gi++tñ,å«>R^Ñ 1”Hp^ UŒË­¼t›cĸ9ÉÚæOù9Dª.ÿîÞ:|{Ò#Òx×bIi+L&`ƒì¹í*ÆwÄÎ ÞJ—?(,³ŽD€(!Ñ0ðéŸb$2]e³Î/.íçâ§ ö4üa hxf)>'üL8Áñˆ"OOþ‹ùWXr°d¡t¾صÈcxáœU‚À¡­ˆ) 1V¹‚‘ÊYÙÐDŸôO µ¥ôãÐR 1²j¯£.Y`†.¼» «¼WYi‘áÃ.©€.zè¿ïªÓu=28ŸA]´0‡…DH£„Äù%íª@ {TqëØG‡öGE1Aw Ð(øXȆ–CÃ^dÑ…ˆÖZ>€"‹ØDr¶2Ý%PéG”öÍ2×%@ÚÞ¹îå@Ðåyè%ˆîor2ÆïBnrԚΌډˆõËy D~IéD+ñ¿ØV]FʲìظFÐi%LÇzåòv:½6Rܹ0÷WÌ V¸#ò1z€ $uU‘‰"½æñ¦6‹0`)‡í÷™Y›Y"H{Ûz {‡m]hˆá78‡6ðª5p1Eh÷¢"jv“›éè*"ŸF- <7ú·Dú»» ¬˜—Q•û ¼‹R‡®Y¼ …ö§¢Ç·ËSMØØ9mC5¶“Z„†¤ïËÿÉ÷Q 8ékm…uPJŠ÷µÉ@RÂôÅ/'ás¥Hy|dc/®½JXÖ¾ÂfŸrM¤32úwqv¥7Xdûˆ¤²Ç¿IÄÀfÞBxC„´)q7ÂÌYœ…Ý=–í%•\xIxîÖÈK¥Y¥¸`’’vC®Å.M²ûwÂ%™I6$"†ù%×&ŠŸCÔ÷C„d$Ñw°D]Xòý×xÅ`A7™0½eÐ@QÒ m„Owf}w\VÅP$ŠÔœ`ƒÁùô^Ò!ëv²ÁÊ@eœaW‰ã“ûŠƒÁ¶’(ÚN讞 tvh”GѧQ«Ž5èøVœ®k´²ûê®—˜©¾ ›„×m;×døF¾='eŠ#·J¢?D!̺z˜Q¦1ãßdqšK®aÔÕ³¸¯]Ʋ«’k°¹Ý×sM œOºí´ÜÎkºð:Å ÁÓÅ»Ö|¿X\‚÷eoªïgB@–ÍåúÊpåmœÛ>ÙU.OÌÝE»] :H¬`–8Ú…Ý%ÔHìt貑½z$w+“J†¾yÚ×)êòrÙyK4F F6tú(לBÔÁ¯ø݉LžN¼Ä¶CÆÝ’ªot%ùTZ@ÿœ² »ð›«JF人$_Õ·Ì•.”Ë·x …¤ýè¢[=Q8Ç“§dx¸V¹•6Oú ±U-}Š^Ö†ê#ã@U¥:‡+[/4S26ѶÓåaÃ)ÙîâE­À=GŸÀ%?àè„’w‘÷•¨ðJýÿNš[.è,ÌÚPI'Ð2Í;šgjð H¡ÓÊÞºÊ18ØŠç`eÝÚ«ì› ÛP:/¯ÕEz[K¦Ø«)çaÂ.¡4 ü´ËPlpÆÃ˜§úE~ f#…OÞÅ¿Gj©0Ïê©@$$ÁMN ³K¬ó6–{–Ë! p¤Bv3P™²gKÆJÚÚ ÔGlÜ|â_"Ÿ"?äTKBRž¹¸@Ø)Yx02)R(½Rþ¡Cº‚KÓGé®ÌèÊ¢×$¢>#âQQ¡Bòâj-¿ë.áu"aÒ¯ g*YbáÚqóX€jWXƒI¡€Ö#°¦Å$XVŸÒ•´ ý%t÷CHâÏ.)N$:A§_qâPßIè ¥ê ‘! ö¹„f¶ÝÄYF¬.û8“Óä %(J£H9±“M^7_6_1ê—ü»¼E¬*¡iÁ¿$“}"¾žü½ºLÀLÉ‹¥#¨õ9õwäa ^V¼ž¶–J ŸÃ+¼¢WاFQåruyPpsy\e•´dÙêÁN8¾ë<è‘G¬µä}*‘.IÅ„}Ámþ‡ªBÝQkåKVžðóÑ ç@_ÐÓhËN‡lʶ@c©Äö’] ù á/(j®Ø’#eÊ q@GÂJ’GP§–fÔÍ.q6srèÄ!9ç…”¤D~B@ÓØô¥É¥<àQHã fð5Š»4TOS|Ú‚Ë&0ù[âk›y_M,Pš;r ïÚúŒ>%_hÌâ$¦—Ï$ wÁ«±<…$1ä©;p~{-ã‹.ŠËË?¤Y‘\}>ñÌödrócšdÝó*ï”ÉïÝÏÊ“4í ñÌ¥Xy“Ù+·Æ¯œÍXýºÛ¿ ê¥Û9†÷ðêD@½L°j/à(ôÚÿsG#ÿ”µ›e¢Æ6¤„<‰û[Ù+å_w•9ˆyœ ¾žK÷ Y9ìU½BþÛþy§…ŸÖMÆ€ô®ˆ R:©R²ãA.Â×òÎ’:ãw=¼.Ùq uŸáh/È·×,¥+º¯"‡ÑC˜B.ÿãЫJî‘=]á¾òP×ýþÀýéŽküläüñ’ÿ–‡ß½W&"&?uå‡2¢ÁWi‰Ú¢p¹=^OäC½ý!M»Bª™3}T½OHÀÀ^‘pUBÝ.%’ˆ X9èÅSK»Ԕüä÷R×ãÞïsãKì‚‹P%¿¾¨‚‰^pÀ} óßl ¦d_$Ó'î;´û‚^߈z}¦Õ×S2@ WðeJô yAùrÄíVµ>7ƒ¤šû˜<Ÿ¬‹–(Ÿ¨s@Ã[ÈyS¥õ¦Y哊¡0˜ŠÉ”ºÄˆ”¡p)ßþÕ…gÅxB¥ÏÙ“á<~¾}aÈ„pd§ù€BO¦|%•,dÁ¹#Ø[´“ËLˆÉÜGuÕw¡³×ç锓^Ú–®)½–˜U×È‘N©2É÷ÀÝK;ØK¡%!:d¾_–86'Gšk#}I|ÄÖ—»ÔubVw ¥Ï† WªëIŒ˜¶Ô#½;¤‡%7+ÄŒ„Ö]wK’*p îÄz™ð};˜‰þ«à S6Nˆ)»&²ýÈSÈ'¥Hþ&Þ˜8Žâžf†6çd®GZÊï‚jX5Ø$ rû“z_Â~/Â2õ=É>«ç­¼p}Åe‰'Ùm©±] oÍpT ÿ -?O¾õjšüÿäßlÖËõÜýý²ž7«·õîñÁýãºï7õ—'¿}So×ËÇ]³^ôºÝéC“¼«ÿ×U3ÙÜÈÜg¿?Ô›·Í¿»O_ ¯j×ùfœ\ÿ[çætÙùpZ”î·ÃÅx³¬·îÖWëÕª^.?œÎ:ãÕôtžtÞ4÷A÷÷¯ÎÛÝx¹¼Û“—ί㓧•{òz¦ÎùBIæ&Ц.ëU'd¸~pÏúaÓÌî¿»ÓrГßî '§e•&ø¨âCç½[î§Yqr#ßKý¾<¥ûïàÌ 5 ºgnœî¿©þ;Óçî߉ü¥Ôôõù·àsåßGŸNmF7u}êëMçíz¶sû/¤Æ¤eUßÈ>¹~\MDz°Î8·/W“sùX"±¨ûØ77Ëf»¨§îâ7ò¨nÐ;· ñ­r75û·â’è¸{ž•rÙrÀ/½Ópÿà×Îr<©å‰Þ>6»ú´îäy÷4ÁWÝËq_½\ow2ÜÛÎWî×Îf§ésqžOsyýß¾½àŠÞ qãß4+y3î²ûõdýÐ`qpŒc÷»ïOŸËÇÍrÌì=Û¬ïÝ‘'·ž4;|ÒÙÁ“žse%+ýåÛË׺nŸKqZlÖòìÍÔ]†Å[ïg¹¬Ý½e=ï¬Ö»fRÛN² >œn£ÏìSM¢Óû°©ÀÈä.î3nÊ—K÷Ú8>¨A)+²= ¹,ßý‰˜ËD,lxîŸ2šY<uç~í5mÜv+jlzNŒ\TÞ»›†Ã¯£ù˜wÜ»söjîg¢èö*ÌÄjÚìðݦ3[‹E‹'znciVsY’ñ¬æ²&ÆËí[f¼Ói^t¶õ„Wœujœpý½rs¼ÚÖ_èBï Ã0k ³é|»uc’ç‡%ýB&k#«¹YM–2¾ºSÿ8žì–²¥Ç2˜f¥Cl:k÷ê›ÕxyÆ1dýžƒÜ¬]?eÍg»Õ½¢„má^þãr'£¨“Ž›ÝFÂ[g½¹s7Â{ïO®Ç7ÑèdíÜ’ÐuìÌà ¦È2žöêË*72]€w76Žd2–åæ–¾u·SÖ«š Ï^݃…·øÌU—ÄËnÚÙ¹Ïo—c[*O-3Z#¹ÜØuá4™w–ãÕs¨£;tÇΙ{ NÅD_ÊøÆ=0ff`/N7Ã\íå?‹Wÿ™»Fýã¤~ØawÞÂ…™´–$ÆTbƸ6oýÚ¬mIÎüzt i¯Åik-΢¥¬È|ï=º'Ñ·ˆ»÷K¹ûýSw,³ =ZÈnV›öpë~ü ëÔVݾ¾«ŽËîYõùáù•õÜÇšÕvWaÍf²VVÁzž¸àIk›çô.éŒVs9?¹ÞÊ<ËÜï‡~T27㼎mÖíšÚy-âž<ÊÁ$&d;>w>Jìwc=w— ßÿïS¿K~îãÿö*οuR ¼_pZýº+äMÉÒ›™T2Oí129‘úýg’½_Vå F”cDiw Y¶ œÒ?Ž^Þ\¼r_ÿæÛËW/‡²>ÝF¯ßŽàqLécúÔ½«’_žnk¦Ysã|z|ïÖ‘¼h·ÜgîݧkýÖüÈÿ’ýÄ·úìÿ%?õ Ÿ3š§FR”ô õáó¼rԻћ¯ÞÒÁ»x}å¬Ôðë×W/ß½üúõ[8Å÷¯ß¸+¿þæ»—¯ÿ(ÞåÕË·ïÞ¼¼üV>sÚsË"- 9SäëóÎW__½¼~9¼ ‰Àgè¹Ë„¦%ÞÒÏšŠÏßäsæ«Ô`¢Ç©(Ëž›Š‹˜S·~üò4Ãö§5Ì\PwòÌå#îПJ4·•så…Xî Åâ|ú΄ øºþA–ïfíNF÷ÁÔ].á|ô0y_C›.w@ÅÀ{ž¹E!Úz%‡zc õPN³roÌŠ¥I>ò˪˽™¦œ©AZpǤçéé sÏþj¼Â¡»eXB·RL¤x?îžÇ!€Ó?º9¸w!îiš%º,nÕ_¤:‰iÖ…;žžgn˜î¶6 œ`œvDmîÝiƒüæq ·¯ó:söüáqw:ð ¸ðfæ×ßÃù@Ÿ 㸊'ÈùokzC;qfeÀß—nÜaˆ=oÿmV¿Ús>fVd‰5#EÞ~ˆ²Jñ•®Ç7 ª­n‘™ˆþçœmÿ)«4ž9½ðL<ë³^ŸÏÔ§ÍöÉȯéKKbÁ#Œ\|ù(Q©;`f.jÔÐÃ]V-·{Ò$zI¿èŠÂ“žw7ãÉ—éÉ7úq, .ç—v×ÜüL¸õ»äg~±_¨]an¥¦Á#1Ñ('I­¡c´Ì×˸Õóz½cHä¾áx9y\"Ûu?vÄüë©°Ó¥:­Š¾$)û’L>ÇA.óU=YŽ7jš°:$ ˜Ÿ\/;›‡‰êiÚ·?ù)#ü©þjQÅ#•¼§Ôå.˜ò 1:¶gŒáãÁæ±)iöï÷K¶a‘©ï;_Î6Ï‘ðÂm6G?>,Ç+~ÅèIZ#qÃkàQ¤þ}ß>aþÒÞ÷®ƒ¨¨Âˆ²c#b0ÛÈ„-5§™ hqd@OÞM£÷È:¨²•óU&TýãÃæsõSÞe4(lƒòa2¦œÓ$¶1Ãtú¥4—/¼ªDFlѹX—þÝZiÏöÃì×0æ‹(F˺\ûý® ¯hÏ\ìÍz¹d˜®íãjâgó§LŸëÙ¼—êÈe)Ç:pÇZîu´Ù Ãö¦–k½Ù1§õÆ4X{EòÄ©ÿSüdÿP×±]"ql=ŽíÍãj%£@‹'Ü-]ÿ¯Æw§‰d pTf‘—’–'Ÿqò=¹.í´Ë2*Í TÅA ×÷Í’ÃJè'ݶJ‚p’²ì§œÉϘÆ2Ml rÄYÁj,õr%9Ò5¸µ­‰Î³/Ýy` a}^à—ºãqpŸÈèé‚yÉÑ[Õ d–õ[ s2‹¢Ð4­0Þú'ܾ5Ù¿š·gv+£—Z½UÄ<53±OÜ3ÝÉ’‚+Ò~E´rËÝÁKJn~qË×fÐJ®ù²ÒqÂíHÂÀRïcÿd·#ù Ñ›¹iRôú™ŽTл6Ø<ù˜ÛñKÖ½E[6•ÕÀØ:º’ø¥>qtkÊèc[2ù‰‘¯åÔ2$Õ’¾¼žF¾_IA˲Añ!uÔlÜϸ&½‡DüÓžÒÁ€>wã•6©}¼uá`å¨?Ã-ÖAþ'»ÅéI™f6ÒÏr‹m°ÿñnq6à3”e€G\+ÖçÛȽ‹k …¾w§  Ê.ÁlŽLîG÷TòÜÁ¼ ³Zænʘ5ƒ1ú±ÞLš­›Éh%þßô–AI¢µžûE±ì¤HܹÇéD5±ÆˆÅ5×<ˆpDI_ë^ùiünt9Îᵸ½SìEð¿´’Õrmª¾‘4ãájå¹å_?îèd}†>·±¯mÕ~°Qþ‰×œüo¥å²j —Ó¼çØ=yˆÏƒç/E˜Ø*-’Î[–¡£¸ògxZþ™žz†¼=ÄB2¢Z ?DNëþ0Ã(ý‰>ý%»fYE)) ÒžÍño¸QÓXGs–ü‚9ûØà÷櫇DF¾̹‰»˜²þ:–<ÜP\i`P̶Q~2öøì„±Å!9OêªÇa©w[ãí'ÏÀf›{T籇¤ÒÓ8÷Ÿ•ûÍçæ±~Öiã·Þ¯8psì?`(ãéê"Œßú4ùyÑŸšT<"sæHˆäæÄ»(äq³%Ö'>ÅÓAò3“ƒÿéEÖBsyŸõÂî€OX2ñ|UKäÈÀ[Ö•5Žê>ÛÓÉÓû1ù%Õ=‚¥3rº/"Vá{Op¼ŸæÈŸK¢Åbê°—­f(ÍXiNj²‰÷ÉÔZ\²!æ© QC”¯ÖÍ9¿[Œå\ûz%yŒ¨RhàQ{€Ï„;]A²%²8Ô$-€Éƒ3he½ì§œXÉü׊KêôN}ÁÄ\Zæö¿dâ]–¹2ìE…\Mnþ·ž;qCª‰í*ê Nü¤E°øµR·Ÿ2‡EÎ7ÒïéãÁ¦$ÇW-šÖSÆÛä×ËÎ|ìµ1±‘1gGVር¡N~9ØçsϨÄÒKEÁfݾ 6·ð}6~\îb(û&Ÿ2êÄ»ÿkxÎÇkÅØBC“tÀ1V<­J¾Ÿk8š¡yjÅþÇÆ']™Ò?•xìg|*¯( ÈûÕÁ¹3ë¼ßK`ýBïûg•˜ån?A‘Úèiú5áµ,Њ»òͦžÔÓz5‰ói•üÔñÏOWh_ô¸ÜË,M8äü <´\jä° l5òIˆfˆÏ©Ÿæ|rÊíô/XÂÍzyªS[Ð†ì‡ ƒýÀ#>žHý%¿BôÝÚ;~A訫ÂF­­·Ò—±õšáZJ!e3Ù¹áýE'x#þí§Ð=?½~ŸÅƒK²~ÙÕÁõö^ýÛÝx³{ÞJªÍþsŽŽco£4ëÇk6èÙ¸µèu¡ÝK€Ž¿wQqôÚEðþÔÍ_¨eåg˜‹ÏZÉGp¡ì‰ëé`û¬åÀ’–±ÿÿQâÌ?µXñ¹YfQ"ß<­8°~”\÷U-?[[W³Ä†·Îàºÿ(5Ê[O©´?Ì2ÕN2ÉQKZ®Ðüà7§K}‘…¬Åás.;_ofcg_'Ÿë>†_í+¦¼d 0/Ë>ó…å‰Jbšïl°òD®²ä-›”Ü|bgÿìEøÔ9eÏÒëõÑ/,_ãÁ\V晄‘'Jô‰–õ‘‰Züš•5+¾—ô ó yšBÁ1 *>¬r÷=á{z @c?ùº…Ž´Œ¡¿JÅÃáu”}$cŠ˜i#Q“›vT)G#KÛÑÙ¶¿¾½µ4EY(êb`ÃÎ[~WýãîÐf]âë­vxhcãGF}_û³]ÌR³¥fS$VdÄ:j9X¡›=%"  £Ÿ]Jâ5Z*Ä!å ò½ME„À¬ ]Yìƒm‚¡¨ñù(ZûxÝòó;º:ÞJA Y #`¨iøq“Æ|)ëG¼Bó­«§fóU„Lö·Ò“þ^é)?)÷GÁ~,ikOìȲ*SÙê‡HB!+‹ÎÅr¾Þ4»Å½.Oµ,%Ÿ8_Ê’^Ú®,•¾B‚ßõÝó‹…t·ÅÍÙasõ~Iµý§#>vZFe§ÒÍl÷û7õôqpgêòº½—šU¾ûÏÂܼ˜KCÓSØÊS¥mé8š£Ç¢¹É^YàsÜ‚¤Õ£Äó‰•-÷4_ÿeQ¯dÁ¶à×u-íI°C“_’êÚOùYŠH‡Æº– ÍNNµF³>RŠgÿ6ñOi\ùd€õ–ôx8²²%S¸it_ìS/ÊûŸ(±$¿ ]Õz3‰:V³d¬z*ZóYÚ~ÃsÄ™h]ºÛ~åù‹û~G´„¥«ÒΟ¨áëªÖ6:žßÌnÆ™o4~ÎaósJð…ž=œõ‰¥JC&…€l»ñN2÷ÿh6j£;ªø)­~UZ*6ÜL9Á€‘)ÿ¬¸úg½•Ÿ’’)KµàÚ˜ÉWi½8_}غø°Y?ªûÝ~&ÆOÔÿµ:*޶yÙdÓ“òV"íû¦!T,8ÏÚe##Þ>óôºÇÚ]ê>—tÖüæåîã£OÍjò9ÞXoÀ†Óž‘õÄÁJÌëŒÐØ¥sÈ—€ÆfÞ§šêž„ë$¿ Õ=þoÒS¬bV!äb*+uÿä¦á9Œ´9ÿÇà'§»„¶h"¤.ôÃ"pþã©R6üTÚÒ×­Jz€•åz_®fkRVÌ ‰ûDÒëÿ³†Ÿå÷Ä¡Èüˆw1ìç´‹“^âþ(µS|ï–kši§h_#=©’ô¤wä /µïWâV~(eÏ!ÌZ¨XW$éæÍxÛL@X«¤eà”©Ý°#JK˜™7ûXr~ ÜÍn!»_€Ovqã^EÒ^6c<›,ƒ›Çf9…*‹Xœ·L©†„%t»sΖ¬¡—3®>¿ý§ëÕ3þÝÊÎ`õ^“ UX%gš,ôf+ +®,# ÜÔã)Ÿl§ôpÉçéDëÜySÏê òÝx&–º\rnÖ mž¨årq3¥ÕØ)I%ꔋ2­ú’ÃT[{[³âevãÆ^úühü@%o»]Jí¶eÅp4n‡6 ¼S ë¤óf€{s¸Þà»Ý‹Ó´‹çã¨Ålઞ*\–ݪ©n..LoÄ….$;Ráj–ÎþOù&ÿ4vNЊÆÓÝx¼Y¹åYˉüUífMnðíª1ÎÖ¾“ñtŠý&X84 ëèÆ“øÜ8RP` ­u¥¸­,àVÓ´n×nÖ½­§c “,«ÄD©§[³ƒ l·÷«©Úã&b“.r9ðy(‡ß>OivÒO²“êÈùŸ¹ã È>é@ä'ƒ$?é¹@Äö ÄE‹ôØ®ZTb ò6!jôM,få-ŠZÌŒº›Î…Þ8‹ ÷f"+„þù4=ÍÜ» ,½I0ëÆ´=ÔÁòý©’·ðBæ¸ûÃnIî.ò8hƒÔzP ÊŒ—vµ^ÑõðVxËŠ¬gßÜËùæ¾xFÃn[MÏr¸ErœÀÌ' Á .\Þø^³2·ã䃿 ‹Ç;%z®vÁ@Ü:Ù¶hv¹ Zzž®Ò!Ѽux€ÅYûù’¦³}4£9Þ*ËÉ\¿5ĸ……¤Þœµ_Ç­;»”z·«£­W’¡#1FµÍÙÂ{l6µF$Œ&e˜Ðá¯Sãî¿ÄÓÈf•—hüĘ(CéÛ«˜GpªÔÀ ¼ç˜ ÌšZ4s'œwvç\ 0Ó`Y°{r#1iÓÇÚÎçqdlÑ™ù or½l&bZ¦î§²ˆ_ÈrçFMÒnŽœ$øc¡ õG‚{ÀÇ­„Ânú"žró#”ûÅb¾F ¯Aü®ÄØá̯eMp¤Ös»ÏµÚ4Ž›÷ÃíK79R¢Ñ× Fz%eŸÙ°”̯˜‰?§œÿÅƸ1«8¡Õ‰i®¾Fg¯Ö°D‰E*Õ8_Ôí‰Cg­¹Âk³‰1hn‘˜X Ÿ KóíšæËžIL¤*p e‚l»,¹òÄ%CEnÖ"çWïd/fHÜ%v´ÆÒ.Ðb÷W©Èòž¤±Í³ãég§ä¾3Vœ¤Ý¤8q¦ŠÏóÆD0qt\§0ê|fTç ÏtžuK K˶?&ß„Sr@’>óßLK•=¥mþ³5òM L¶ÿÿû¸ªUDç48¯$”}a‹¯Rˆ{œöÝ+b!U¡g®ò<Êó¸+‰¾KòZ7O©é¸‘$}ÉÕ‹êÍâ)É÷›çîVT½™‹ê<‘‰Ý,Dì¦'ÇBл9 ‚7ò°)wøÈê¼ÌL:-¡–³„ÎüGeTŽÊÉÈ£¤)š†õ@Ô°Ôƒ~¾—ÃÁ !feù6âhÌLÎŒF\ƒµÎ§;-ìÐÕt*ií— µ¿<íõÕ1ÇÉXØúôò½›7É0ík:àO„¢Í|e{ÚÙdo!ÆöqÌÌŸ´SXˆéúÞg¦¶ ½äjª' :"ƒ©—d¹Ç;—hZÔÿظHþLÔ!dO:mÑ—™ùPuä@5[Ÿ5ÈÔbþ86¡ù\Ë1 w•[ª-´‡ùLߺ†÷<œè¥ïÍÛ?`bÍÜÕÎ_ÞÔÞ-Øsg9VΖdæmU}Ü" ÐMÅŽ"ôDÊͦ ±)˜ú)¸UOak¯ o˜]É¡¢G‘>¥èïÒg²¢ÝžÚQÉ"1•LÑÄôZt³˜µµ”­[Ê? Áé>ó¸[¬5lº¿·\ªþ)„œ·Î¹{»¾¯)rd׋k?GIxò ñ@™Fiï)ôEDØ·ln5·çfŽkïUs³— ö¯`q¸ ¦}"î\!@ÔÄàrˆ×LÆ:Ä âª‡6“OæJ²8Ñ‹~TVváG\E§0C·µóCØÞò‹óƒ.S¾ó¤ª6œ~¬cÝgê°"?4qg ßÄœ´B›¬‡žZ‰Mˆ©ˆ5ûæ$‰]±Gl5Í.ú|]œ 0oZ÷)œ–yÒ¶Æj©ß7 w‡“ ýÞïí‰"îm·­ ×Y®†Pë™(dòšíâýé™ ùß$Lêæ{ïb"d›y·\²ºŠ¦Á94sǼÞ1YVã>It£Ømvg“4Ç%æ‘A¥“T'‡+=!ôߘmÍ™n|.zù ó5E“F‹&¼V?ˆQõ/OÆ%ž(ýH’BÊh5×bDžvå´·ö š~w§Ä$ñ. Kâ.²×mH®/¢…d‹ê*©è–{§7DOnHI¨ÜÒ³&xùC;øÒiiø´cnÑV“ï‰Z»í]xêG»µ¼©†ð1¡}™ýQª(‚ ÔïÌ‹3i6À½VšŽ™=JòÁ“Ï7n›‰èu,5C—Gùî™,¦°PŽï•&„ªûš¸vk9Ó[k?1í¬­–¾Ì¢_Fr‰Úu¡Ùû³ÏŠÒÐ[ž‰™]zLÔ8j‰âw"?–pIëñ)i QÄø=–rÂ[Ôus.̶» Û<4VN¯q [Œ^ûá’Ɖ$ºqõGœ»åü ;‡{|à¥N*Mü™Šb{Dæä–eîw1^—ŒV&™‡ÌPÀ·UÛõOÓÌ—`0Š{_ÇXXRAƒ 1loWDF~Ó(UB´¾ÅóÌÈ•GA~´±ç››Ê Oºüp>¸côaKîÚKÆ&NÙŠTf~öW/ü’Ä}7Cgùš ÁÖŽ;\Bâ}KЇš —LÒÁnñ¯YÏ-Oɲáô¼ó1ƒ½\yÑ’‡ý=‚ݰ™,ox$o’ü/–[·: ÛìS_kÔ§z¶¥×°«}Ú æÚÍ÷ºsf=÷ó"³(ü7›SÛ:­ÛÁRBqA4…ª£‰"y™C¬t^,³Q/““,´MQÛ£Ç4줔çsPÍ7=g'Ô¾¨8Œ¶kÿÖy“òM§^¢À«‚·ãíÚwšŸÔݺwøn‘÷…?Ø2·^/ð/ø¡e)¬gK\ªEÑ,ÁàÔ$kÛ|¸ŠºÔ°….º»—ƒ­iC¨àÉÇmè)oDp¦lŠ›Ýº‘Kàγu½ò›Æ«ð9‡Aýòg*²ˆ ±©‘HK/æbéåKK¿Â6ùj|Ð ¨ Q]`Ve°’e#O±üÕÁ„qÃv?ið ßQó‚06äÔDkcB§u,¯øÄFUX¥;ëðŠ‡´ ÆÜ9û¶+% ™Ð_¤EW£_l6›Õ´ù¾™>âéëÎú{…Ùn©˜Q ¶Ï˜WBÌ!ñЧqûNË6‹Öý’cYÈ^D”µ6F¨U-òÌjJr™ÖêC]ŸóI—õØÏEco"ϕЄç[4«Ýè3†úMÛR<í‹Aóƪä"ã©_®;cÍnœ+h ļïP£x·%NiÑŽ¤ýbÙEÒ.b©È7ïb+11¨ /ÆŸŸ>$q.¯wâ‚o÷Gz$—×{*¨}6 ò2Ý#àôõäõ¼èžD³KÝ›Ñ=ëj‹ïÍôÛAsÍø]ê>î \‚lOWÑOÈ À‘i+9pgo|-rú¶Œµƒm\²éÄÕ¡u3¯zü ):çsäݤ„@“äS¿‹#’É‹õ’¾òv¬oOS_À\±Êdà™c ¸‹–î"Rraz"δg¦\…‰L£wøþ½²¦ˆT+、?òc&ÖµÞKw„:k°zXì:‡æŽLEW†SÁ/}ÿÞæËçf¼ Ð4Ð6ñ#뱊Ï6ú‚T´Bï¸àý˜(&LÙî:‘ s ï•s(ãtË#’Öw%r}_‚ñ›¦ÞL£Sp«ï6éŒïz¬†Üc--J´Œ£žÑÙWÚË(»“YŸWÖUÚE5λÖ:ÑÄîloµp·’aM#™á¹—ž{ÈܹùržŒ;ìf;©’c)ÒÔ‘®jÞncÝhº´ëG_Ü1[Ó¬4"ÖE eêƒQôX)ÔÇCkµMuyä½¥”EÆÓ©°UÕÒÒdÏû÷tU¿8ç Yˆï3âôXû…„h=6¡wm Š–$YÁ·G-(3 ,«·“i šÂ®Ä^L ¯é|á-ÄM>Ϥ¦¸m¦L#™g(¼C¦j–±èk›~£2/‚¾ó lçÐ-à®§g:”²ßÕ&s¿t‹XÒœÇ÷‹öÃs&|Іh)c]æq ÞªcC¿§ÙAžpQÝ'n_p÷cP=ãz3ßú½¸ {}×3t€Xý‚á´ ‡~°k:OµzÓzé÷§çlüEãl ¤ßí«À}¿ydBOG\§ à÷êêŽí ²ˆ°¨Hñº£’U›abi;ß«»Äòç^¯{¯îbòç­»?Û"¦8Èáܭќl¬›Wíx›v9·†¡”º·÷Îk|¼?£­÷ïód/E€·¿}h&ëÇ-fPÜvž3B=È‘äœXŒ"…¾.Š,¸kkªË@žõ&»IÂL_ÉÍÜd9nîë éFÆÈS×ZBqO#{KA–•€ûÀÿåþà<"tÁcÑNÅýv¯d¾ö•ýñÍV)!±3ëÈÈ’…®KÝ`Ly¯Ä¶m•fšºÈl„=4nMjì2DÎÒr œB±Wü5Î9ˆŬ(ñ?Ù¯àSK+&/Ù)õ”“™¹û@0lQË®aÌ4 †ÓÅròµ€õ&81!¿c·Ç™ µ×•*ÒúAíµåBŽæó8…0'«\ýcÈ0'·š%'Ys[g•j€ìok˜Õ{+†„Ç4ñ#Œ«¬LrE;z¾ç0ÌÛnNrà64ص² ±0@Pd5¯¬ÃlïšÞyˆŒ½Å=SÔòlÏ µ“˜SïÞó@j⋃Oäý.I±4D½ó¹7<õ[Ïé™bÃÈSÚÁ*™ðØøL}„OP—[äujX\´ÙÜÒ·J$°IÞEb|h—ó(úsó7òAÒ%Q™ÇÂNÜÚÒ%å^žWµ7  «w†×°'Hä¶eÚ=ÉSxí6[Œ ÂîT«aUШ˜Å…–<½}ˆšòª8És$1o¤ ÕîK&7Dº|Ö(ãëƒ:Lk5È¿5Ë~*8H~p1s/ÊÎ%¼Ÿ·ÈòäC+ÆBf˜Ý¢ dC3豇‹£û#‰òFrõsrëÙk ³cQü˜!I’Ø«c%ýóÅ@Ã}½Œý9-:º™²¦3—ÖJO£µ¼b烰¼_ß¡ìˉ.AÉú |ìØ^iµ´dP"í½4`>î,¥e¤%=" !6ëàM.à9oè,l,­QiŒ0c¼Z­Ý9{µœH€ÂJ¯ûÌ]Ë›¨?âM`yúu–[¡ÿÂê Ìûú,'7L²w¾,œ .YX‰ïBè?;(³+wšð<8°\¤$ƒ+º«)Ü €R  cçE”õ3„Æm”y Å;@*‚<3—Jª$ä1ij®e‘ç’¿h±½|ßÔ?°åΟ"ØÉÜ’ß~”Œ:G?J»é—, ç™Ï~‡}îbŒz9S”Fâì¥Éáš3„‘:âíwN„å´ˆkpìÚi­¢³VyÖ',€Á@ øøÎŒMŽÇN¼½Bǧ¬6BÂ%}ìÎçè…Q= ©HrµAè[Ø? +fÁ뜘p ÙË8§Á;?­¹! D4ÎÂnvç}mÔø9’åŠ6¸1ý:-Œh™õŒÌw›ïÈßh˜(B¡Ïr_u¢ww÷Y¸Qm4^T}ÀÃÀ0+|Ô¾­„¸1çÖœ;)º•„qIH~°2ÄÜûñÁbp s~F<ß(ÆB@gÐ}l.õó673zì嘘Ëpðc÷óºÕ#ØZ `ZC ’ú~ÑUÑí¦%$áGž‡Ñ,œÅQi1‰Pžq‹×ï¸åÎqá×Gv¦ŒTÀ¿ÙëjÑEÚ#ofG½}ø¥Àe‰ð[½!¢¬æíÂä–àLŸœQh‡°ìe•ÐÛ$ŒSÃЦéê'*ƒ «Ôœl/… •¿öFçVò|¼™:Ç{§$ Ê= \;Ám»é–Žü>>·:IóÄý‘ý2tmÅ8'Æ;>ÂÈ:$÷<3Fœ‚&ÊãD‰LþÖ;ê˜ÄÚ{åm-Pð"Û]„AtÆ;|ñ36N”vG¬¶êÕáuhå gªSÉ»­²låüøàCî¶VÍC+?…±˜ÝœxéiuVðÊpÊ´ ,•IíË:“@™s@­‚ïµÌ›"ÛDn>u¶vÃí:]^®hñǪ£v†Œ ¡šó¹,.ÒJ' ¤-³TjŠ£dûü 'Ílrâ¹*e¥Øï±{Þ·òÎæ™ðq"/áíŽ03­³f½|¼™8–ë »Å×X íD¬MÍ,ÌC†oû­Âõn6¿8¬èÌö€q½ò=-\ò¾é^ siñJ£Àüb‚îYFwȆ9ç©”`Çf“¨E•Ù¤{iŽ?—x S±ð fFtW.-P9ð âý*^¤Å9›ÐÚäÓ&–Iõ©Ý„r>“hB%¡.QŠH\êO‰ðlân¿ÖŽå†]„ c?ÄøªCì³/`“Ï H+8,7 nmM/Õ³vP¢ ,±fÑÄe“b„fJ?ƒÍ,Èh,ëÆ1‚ d%Ôc’@à˜{ÄèxÅ¢ç\£i_iF®¯ö«hŽ4–]m»l”k~¼tϸògý-ý‹V³ 0G(vè]­W’ ï(:7&F1€§ì;KîY'u„#m’Ö“Ï|{™‘éŽÏƒ<:fOžH§æ?dwQñŸ‡}oìúc÷ö6eéçß>Þl}ýæ`‘i›dÔÀ{#©S½ß;kŽ`KâÐ}[‡÷íæßp¦#£h£Y ?g!4ë÷ЙãSÖXB‣ A{Sb½fñÌi¢H‡y0³Ã§šé,|Ö°º…ßòêŸ#ÎGÀ‡r¹ôQ¼Šž£o"Ê—"3¾tÉÄg@oÝ–Ø¢åªiþU~F‚rJ•â}M,¯ À$.em·¤6bØ’wòÃÀÝw—ç‰v×5ÐcÖLºCÜcŒãr§ ̦Å%ž)ìÞ‚( PÜþFV"´¬?爜U–äicT§µåÎ|³Ä·¢n‰×«gÒ‹hfcÜT¿oپƲ|šB’S.¾&¢ó÷¤´ñÀÿº±Ào˜õdF º‰yÕšs Ëâ#øžFʲ=’Q TH35Íͪ^*šÞÛv +OO<Àßׯ[v wô õ½ù¡Þš¼/f€‘|\!°Uì,FRâ¬Ü3“(’½«a<Äô¯!w´p•¸#,#ÞŠ[,øÆ#S†©ë—¨õÓæ:ۆʄEpcÅ76Òƒ¸qÕ[챚­þ…¼–ØÜ€÷awö—ÁtÕEÕF¹lâžíß}„¸4„aEfÃE”)m­ÝÈDøN‹Òò>ÎT$w;GÓ(ø9|Ix¼=„$.¹k[£Yð„ ÛÈX$VˆpfYÅcá`0žA?z÷µ }}ÜÏfÒFñϴ𼈷Àâɨ†¡Y‘¢[¥8 ÍʸöÊÐp¿Ž,3ª²æ\Ê·Ë1±¤ØÍ £]Ǫ‹Ã´ü z4 'E–io½‘îŒâTS)‹p¢!T™½î;—ûþagíé?hÖ"^(ú@ÀÇ<Lfx Ù4¬Œyž%í4¡á€nã\ûVÛ}×ÍÔ²_ &tz-~Ýè[S;Ä,™ã½he„BüM WRE„‰Ò8r”@s½¯#³=yÛ!d1ýŒ`Q/ÓúüÖ÷¡ñ¸Ú¸NвŒÆJ5œÛ„•Ç·M´)¤Ƴ0Sx“‚°[³¿ ¡hˆáý¸Y™ÿ6{®9$Ù{¶™–Íx5QÜæ¾Ësv~ï¥%ذWmÐG17»#ITé=iRk÷Ñýí ’µ3Š“ÔËŽžØQF\Qà' sédòÐ0kJIözJnÏÚ‹zê+~{»1¬XmŽj`óŽ&å$“ÇyHªç¡A ã ¤*Я߬ÍM#¯sbúÌè!/°¼Zí@3‚&$ßÍ´>¦Ðþº¬q!Ô6î¿ú­á„mQ–O«:%Â*¶3Ý'ýªHD?ÂP(gÌèmEHõÕ%u´óùãGTo§s\$ºÝÜê²Ê„æ•£n!Éëˆsìa¹™_ôI‡NÔâ–ÍW4É¢[OÍ}³ \«!É&õV6Eݶ24ì~1øÍä7ç{ßz;K|K‡P©ÊO=!])LÜ|SG€†!æ³¹˜k沞ècÚL¬!nopÇ +>(~;‚3±¨’ñ¤w~(ñ:¾Ñ3Âq·lfŸ 7EWOöm”+ÂT¾®L3ÓšYX£‘¥Õd9¹´³£3Gkeü/‘'uôm|Š ªë&­¨ÎÆK„}\ŒÜrK3…) ŠN4q­Í¿f.ÙJ÷‹ûÿ6ÈéD?Ù-6mñ…0Øl!R™³Ù…Up³uúao&J+fËhAzÉ5 È{C¼vít$ë"æQ;k#žõ4iÕÛuÆ´Oæ¬Y€]ÎBM–ûo0è31ƒÝ.#Pn\Sô †TÒŸX/}JÎgMª‘lEë^+C³éb轚„6]X±ìœvA\Õl&÷[xhg°z3^âh˜µ°á[ß1}œD¨ñD-6ç(›†>k$]œ7+‚N~Ꚉv”Ó3i{«Hó‰â—;N‹o"¶tQ‹¿]læ8An©>Æÿ1 ‚•ý7tÞæzíC²ÙbOÿ½S_Ýã±Ô ä×mÄ"~ÛJâ›+lsØX' (\ðà2tëàÅ‚EMe„‡m9ÿÎDÓS¥`w_$÷Iáù¦Ùµ°@Žr>í£y&š3Ë­å ‘è'@Ìú®>w=ë©O¾-:§¥g´R¦;Y¢— L”x‚¯n‡§Úå úþõcÔ‡$õ;&û4sØž-Škéö]m”ž {wÿ±Ûå^'Òîyœ¦Oèê,Mc¡ÒJ‘ï‹eÛ_Mª“qÜغà ö‡£ãÅãCâÇ&ößO×+r ¬‘ߟ”Õ#uÞ™Veü»](›æ=ÒÝÆ¿= wþ™“z¿e²Çò…ó­&‹‡& “œÑnðÆ‘BêîÔKH(fhhGñMdýЪÛØGdbd¸09ìþÂm¬  =-–MíSG¸‚µßî{ LøƒYÁŸ²ŒZñð¬í\çeW¼ë~„ñ.=¤o7ißæÒ߇ªqÒÎÌÍ¢¾>£u6‹…OþnxzGݤym(¿ ¼›6¨Å¬›Ýå>±*ÒöÌû¯Q\x€¦íÎä'E~zkaSêè. à“Þ O뎧SVhšäùÍûc^Ë%h.ºÝ;Ü3ðú¶TLFˆç;+@\á’kòÛG“Ìö:Ð]´.€L±i“).ÌéáI‡ìÉýZ£µèí`nÃñvõðp\B|XTԢʙÒ5\æd¼­Ïüáļ€«ÉšÀz¯fG0•ü– ,Ãw0mPY«E@îìxó,U¤@Ê|7¾ÒUDôuÀmeßk±Öákú®ß,ˆäܦþ¾Ñ–_ã“Yh®M©[ (¢‚°µÄ3#ø£µÄ—-®¦:fj Oàþ®ôV§‘Ütq½o-3îýOI¨Þ7âŸÁF9Ïé¡Ù4;#¦µÅ_0K#e eäøW–]F$»Ÿãù67ŠÊæòj_´$o8JO¢@™ÎR¬ÔÏ*ÊBÚ }®ª×º;)œ=\g¥qYþn¿<º÷M¬ö™±‡ ‡Ä€T8?íçªPQø—`Ò¶ é¨ûPo}ßZÑ+C÷;i]\¼ Ž7BDã`\s¾fç]Û÷ïͱîH£ü†u[O EPç±åv‡Ž®LyœiÔk8 °¶¸6BÆÉÏY;òW3ݘՇ¥‰b/°Ý?Êc,ýªhÏÕÔvO Z(Úö»CZÌ<ýœyNWܽÂlpЛ1ó€L‹Ÿ·^']‚}Lç´ØGßeœ±6¹y8è,ø8À' Z70bÁŽ„éøÈl L€TÏ>ùuÅúaZRªhæ<í†S³äË) í™i~¼mŸµôD÷ç"’…2WËT¼²ÂÜ£à µ!Í=°(Zn,oÜ&{ªg€¢“k8n^†i~§šÔ•¦b´tCµÎ(‚9Øó"ÛÉöÁIZ&"2ýËàíƒÞ›¹±TsgBž4Zí8§ÊÏa‰Õ¼g+Ž'’Ö™÷‰k=7ô»TdqÝmšq¡ð’chÛâÕóH—­MɆ‘…̸ð•â5#Ç ùg½§Ó°èxš±u”´Ÿ¯E0³‰Šãjó}Lãd\fλxÔ…,»ð¥#µ¸­öcÌÈÕvŒ¸Õâ.Âe™AvGô!lÈßïL A苵wV}S{öüErƪÜÒSMfÞ/I.ýúkêcþåô9„/Þ¼¹xýî;lõ ´à7J‡ËÑðÂ]ù[·q¾ûÓHÖê÷³¯ÿøæâ+·4^¾kÆE{%KàÍhäþóõµ0$ýéB>úÇ‘œöî»oFrн¾$7B¾;‘át£á¨‡u/”J3ÜuݬPï¾v÷•ß,:£ÿõnôú lôæ«—ïÞ„_éò;gÿæ›W/Ÿ+„»tÀðâòÕÈ ûÕ…Þò/çtGÿË]~8úæûÚ_þ4zí.ñµ Y>&öRö$½Òv]¸Ê­°ª_¾v£ùË›—ï^¾þ£»ºŒ«Ôs%m|äÍË?þéOú?}ýêjôFfââõÕïÝcÚíÜSèõ…MêÝËÑ[2¶ðñÝÿþüòjÄél¿Š…;ï/ÞjÊØË—o¿p˃÷§¯¿•:˜hYûî] +•LØÿxùúJ^Öè%S»iùæÍè­¼ÚdÞÁ0_~åættu¦Ù×.îôzøêÛ+Ð^!Ï~ùí;¼cùóÕK÷NÜ÷Ý{üüÇ|iz™íÖ˜ðÀGµè|5z£3XQóOî#:?—/_½”Gè+#—[{/ß½vƒuÃÖµÓà-}C¨:üö•ûÞù7ß¾ùæë·#‘äsËè¥[¤Ì˜‚MÿÍË·ÿƒª±nn²êì³ÿóÛ Ü®„^nññ®_]¼êе›´ß“Û3¼Þh‰qÿîëoE¥ò­{Q¯®ô&í­–Dk@~w5º ß½üóH¢8÷uÉÛ·ß~5ò[føµ[¬Ê‰"÷p#Bó╨¼ Ýd¹¹xΊ~õ–+ÞýíÏ/‡|¡²üߌlU¾|£ÊÛ$;{óFÆðõkz Y W-ÍÃá¶¶òk™¶ÑŸe—Î;ß¾~%/iæ.ú?¿uÓ­»uÁÝÊ :Ó S…Kà~bŒþè Ì_ÅLnÀDm4Úº¡&÷——¯^éºn°¹ûjÝz²Êa]äíÍç×ÊwÌcþåO_kîÎÓW6c¨-Èí»°‘ÝÛvÏd”o#o¥ZKàâmË\á•È¢]\òŸåw‰¹x©“‚å'¯za+|Þ¹r¹ø 33z{&X ¿ýÓ©Ÿq¦ "à÷~ûÍhøR~VËœQÁÆ’gÅ[ý6ÌÙõÿù­l HU´îæˆ ·AäNuçkìyYbÀC#&OޏHN9Çûòµí\}‡üݾ‘ÿ>z”ŒJ £B”3¸áͺÀ!Ãô¼ú‹ æãJN|}]ï°~p¤âÉð$¿ºqÞÞŒ^»Eûä,—¿}cŸñ~î:ôÎør7ã…lÀ·om6_¾vWá»”G–·7ãL¼ûÓË7WjŸZg­.xˆmÐ>¾|õ훑¾›k2"˜ÑOÍVŠóS¾vK,Œ™‹YìÎBͽ_õþ«o‰‘½*~-WyûíðO L†27-ýÓ'×wDKü Kýr„õâ =ÿ î‹nê^ꪘÙÊ34Çáîu{á+%´ô¦‹[ã^£s^LJ´˜Ä<{r½r~%èD:⤧]gèÕqZÈ$íõÔÈ¿<íõõ[:‡¬PŒÇ\>‚Lí;åky'œ¢Ú)!sQäü;¥‚¿?}]ÿ¤c,nÚ’G¸¯Ú0’uíÇ•í[2Á{úm%SöQg‹š~ÎôA+Yj'9x_·VÅ]o ÝH;zÜ*;ˆGJ-m™®É™¿ .Œ6ªP8EU)¤2úÙê Àløö0 ޤÓq‘¹˜õ¹Þg=¾E?>Tü”˜;FŒöµÍ¾iñ·™$4Û¡b~0CºÙ×\%SÐǯÏPPßÛšGq[`ÄŸc³²¥ji»ýå.ª>nÇ3¾ò¶¯ô”“ø„¶‰Ê§·|™¡µ[¡ÊµvJx~°˜$žà6"[‰d£-¸ª™ÑÕp wˆ˜=cÿºµFrOu­7Ë*M˜ pá-D©»8IØ}g½Ðïßï¿_Hž«YÕÚ¡1§0v¤ñVû:ÒÊjmÂn†ƒ -ÀÌ$ >W  *£ú69§õ&H·…†¿VÏø»W‚^7γ1æ6M-x ¢Ž-ãEª=.gO¯…#H•&×K‘tÂSîhäÞw†Ò[!úàþOE\q7œaÄ11µñTZ*—lEwda°·¨hãl÷ƒÛ@/¤7Ë‹R,˜Vš]HUK 0os mK`¬º¯Éƒ=^× _y 4ùæ¶VOEzË…7z§Þ õ&æšfà­_ŸÏxxGï5{æwÖË«>wPfWò%}`8Ï\¨›~ ÇY`¢rn—æ»ËºpæÞ±Ô³7ÙqÅu"Y°;Ûö‹õCøÂ›¥7曚 8n­žñǼ¹eðèïýEã»ÚxHöÒúû:4äKñºa›þت;-”ãâ¢-}!à2‡­&šÍ¬YçÇÿ"œ‹7[Õ!°ÈÊ|+ EÆØË“´kïõ'ÇÞ¿v»­±]YÐ푱ç; ÛÔp€%ûûœ')5¨>„"ôÇÖ^Ȳã&=hr·(=F_ë ûLÖydÎ’¨˜]s.Âŵ+~×Qæ­†„š8`¢æBeʦÍ"Í´y[3mæ5Óæ˜ Ê=Í´B5ÓTn¨_öTäWZ×É6LÔ ±‹#ÚÔGÖš7‰Èé¦>ËV Äf½rShØè‡±&QA3 댩ò—³ƒ6ÏE«ò8о×:÷ë@ë:æË/šç°Z6wÊJ¡ukpÊtrgl_[clS_ gbüpÉxÆë/aKs辊-ýãj}¿þ¾ •!³-‹Nopm³Ús5Ù‹N:8}H`·)ŒE£Ýµ”a0ÚBl78v#ñÞÃaÐÕxqùöëW.Ò|õÂ#÷vâíÏîuÝ92#~ü››5©0þðŒÛIëÌb-èpEH™ ÄaÒÚ<d»UþC½”™ïpxRàêeÖ3•‰H™Íh–»a£küà&ϼ¨šßûP&é•EÐÄC.íï8ìݪ š’Ê·èüM&~ÙÁ…XÕg^îoòýµ3öë©·,^h¥1ô_›½õA•{T}éå–ÅµÞæ^ë-‰hËIÍXd®Õ¿k•VÃ3D({¢(ŒW}î}uÁ¾îì:Š˜TzŒŠU–L)ÕV|j?)*<ª>92/mÑO¼ ; öOÍ®}5Õt¿vC}>Y¿ÛW"ASh‘q¶ì~ûq‚¬ž…ÐÙ>JkETpÚeT!gHŒ7…\ÁÐѨ.W :³jÐS¶­½oµ¼ÄmÚJ(æùàïë ûM7- œ-É(F*e=cWqû”,²¬KX1`ÎÒz¤š:´I f(¿ðyÓNõ´¦úJ„À¶Ô˜H t+¾ žóNlæ'c–;T^è»óôKrœHb”¶0w'E!`VYß­?¬§Vµ)<§ þo>°ñ_q‚ZÌV  Xuw+Æ-Mhð0Ó/–µ(Qÿ[dîdÿ½G(·`賑—-•œ¾[x+>Yâ! ñÿWÅ}ôOãÉëñLUOÝy6ºŠ”S®㹋äXjâM®¸üÏ迤æ7lcÑLå¸û’ è¼û“Ï“ø÷¨Â5·³Æð?ËÁÕ•DÆ ,—( "ÛàEcð>Ñ_€O×{õVöL„®¦@„ä°c)yãeÚÍ#]8íÞ"ovlÏY³ñ˜ -›µ4-¡¡f©’ŠÆm™Ç5∠œlw&U§Ä&ôkч‹nÿˆH%PÀÍ]w¬1zñÑÄ@C °bªöÀ¤›¦U³Ãnfa˜€¤¡¾¿=ËF—ÏŠnróyÒ’IK¶ú"êèDØKT¥.IäÏÞ‘DÕp1~VB܈ôK¢Þ™RÎP`1»@Ÿ¢Ù¬‡Mš¶Å‰ÓÓ~W¿ bÿmEHé—á-Ë®ÀÒ_ŠŽtdL0–»}a#¹Â½‡£–$pMbÉOìVY¦1[#½àÈ)z¬ä^,ÎòÀ ê,RlãÄ2Ÿ¢"T°Ðú…äq)D7±XÚܪÚãvÉ|^o#Ö($ž@|ÄœL€&ÊmÑXï¢ ÿ²ì’PØeÞ¤H™‡LÏSöl¼RÝ‹-3Ì>¸÷xºtŽí»çךf„n,´?åPo˜XL³BßëËÏR´ùHÌžš,Ÿ£¯aLnãLýìYD4mµùi-Äø×ÔÇ¢ö4klr7F¶$9‡F—CŸ8/8 >k4{|³³½Bߎ²smÌèàŽÛÒ l™;{ö º–îÜýÚ\õ"KA¢’™›»-¼y$òœ Î¥tI" ‡7P4¥Ø*-lÔWSÄòŠ8•\­éˆ"x˜ÖÏ0ë8+8µcÅFÌÌÂ"ø¢‰A•Pªú›vðË™ªâ[_¯Ôq–Çòq‚ÒÊà`Ô±¯Éû x…gðY.V€mDŸ“”QèNaW.›±J*U2¨{˜°²À mQ Šïÿ…ûB™™X®:z:¢æØˆ’+•}“€s¬taU}HómùNZò§`.Åûá"0µ]ÁרÔç´[¸JdãT9”›°OÚbãÚÔ÷à-ÞB~?ݲÚМËFsz_É:!¶îæ}e!_¬Ê‚K°!¾$;Òn±U€i²Â“$%þy¹<€á½¯<ï䆇˜X+ÙP—ÈíÞ=nŸSþ*-dدÇr"øE^¶4îþþýåëë/Îâ¤ý”§/ø¿£‚Æ–ìPdƒÚ(/rí“g€DÛ8òî.–sÐ^öºŠõ»iYVÊÍÒLl娿7:¶]z½‰¶jìËÊA£W–g³zà:þÎ:¡%7à„ªC=iø‘Ç(ýàºaxÍhÌ*86»˜Nÿøò¦(4Š–3Yþ.ô›.#]E5êgÛm½sjRI{üêâÕˆwžÓ´d½´GÏ9óÚg ž6٫󵎃ˆi0."é‚:îÀº­.Ï™ùÑž´Zû>uSËŒ«ltg,°SwÆúwËÀu¿@nm·¾uEǤî,áúß=/Dýû´'vç-š„È?UçFcœélƒûƒî!´¾¨R´*ÀCÐÙ$w„,c?ÐæÚÈçÈ.ª³ÚS¦b3·zºí¥™žæb¼ñ¤ÜÒR ÄR³–Ál% üá!bµ´‘-9ÕäD„:Ù=B«Þ:™Ì+ãÖÔx¾mÜ ¿£LNÇ™xn{åÅhY1‡(PRÆ`°xë› ËóÊýù¯_‰éÚ4k ñÞÔâ[þžÿAüµqL7Û¿žaáÐôª3UŸXÌÑfà[k0í±nÙX¢)Gðå*¨–.‚å#2Ù´ØóƬ ØéªnsžàSžà{.Èã 0¶þpÇvË äÌÕû’= æCm?âØ¼‡^ŠÒï°¥áýÆØñ å›åÎûcÑ…5R(Áê–ó%c4æVˆ/˜Ó€COËnC¥tiôÙ¥¸­ss‡}1™Ö£õŠÎ!ÑÒS®ì^óm)*qr"iôçSÆ6m[ëMÚ*MÚJµ0¼Nc©[iÿ|¯g&¾æÌ š$ê0žûYš.Üwÿð\Ó‚e1í8•ç î-AIObN;Ñ·õ%–Ç•˜emÏpÖÌ?±›kKô*Å÷Vú\›tÃ)d‰ÀTéqÞ ƒ ¢ä„÷&ç™$«ÿ¶×ïð XÏ¿q>äÆÀÈzk]è>@85ÊD š®èùU À !ÔsfâK6Úþ­™Êd?S@Ýß6õîq³Âˆþ†7úLNŠ¿A½hÂ36x&‹ìoÊùºá§äžK´òLÄß8¨Õów&ÖÏtÁ•@\üm²tËÿF*.Èä?Ó¥2óé–7]dØ;!«`L”!Æ(à s’­ ÐÇ–nêS|·FìN,[J@—]­ë16ÞY¹ ¤ÌÂɶ±ý¶¬l&ì8lÑËu5«âv!?EN³‚È៼R¸&ÑíÆ6„z°¼ ¾§Æ ³ÏI1È´ØÖ¬v§½LFðûß"+Ö×/Y#4•öê@§-_üíï‘ó-»Èloÿí‘Îì{\qÑùÑ=  —+¶·ºÏ”\_µóEkäx>f?JZ?ã2À·Àú*ŸÆßO«TÚÓ¢'k­«Ó…~§è—ÒC5oYÄîA~t·ø­ûß"à®Ìžš¿îg‡CÚñª¶wLßþ~[ß»E±”dÕ~öâüóð!¢ Ǿ±—×ÌNÒ~"VÇxÙS<ñÌLñAecZ~T¥rÔÏ"š3 ¦|‡!IpæáYb‚>އ-€kZO–"_‚/ÀNvû*T4ñX"¿Ìc2ZSüæÞ6J$iæ±·õ"×m§4œ!¶¿ñ?¶Ïij}ËXÚæ ¼8ùãM=¢ûIr×ù[ôdVûsvð‰‡y¦g Ry)  ŠNmby”B báéúßiÇXçñKR/ ‰œÌ³H8³66f­!6\™†Yëñ5†„+x§˜2P®IC!$ð°b|N¾Þ¯÷è"û²o‘}/$ìäIÚœãÌЪúÙ«[³÷#ꊓš´4âæL%í¥fEj=:£×wnÕ8æ”̤µ„Qä¡ÕÜ­Ê[kVcÕN¶8H­ÐÀ³ Ãf‡Žß3z~i½ÒÖtË–Ö¶ßv@äì3‰¾¤M}3ChžäÅŸÒhô=ÙÆGwAf/³ Ï£v(#|›ç¨ßÎÇæ\‡{FBé“U Z&Gs-sò…Ræ¡ð‡T6Úã|“ÊáÇråµa=Æ!Û¤³WÈR6onáí’rµâ®zÜ©®itÄÅEP„ìÔ'+•ZØ´”üQâ†u'"_þ¤!ºØý869ºzÙaý79Gžóþ%’•8Tž[b8¥QßÔ&êÕf?ºßgçhg(Û-Þ`­½„ùÞ¨4ÑůÚŽ“ÎP—tÒ¯‘¢Ý[Ëms#ˆ©ƒWÜR_¯By‚5i‰+1Œ©zƒj3js§œ÷ÈP!  j ⻥‰Ø ’Xÿ¼R qnb‹‚ùY$´u,€¨ÛhÆQÍý, ¬¬ à 6ëf™1¼Ê(Ù°ªñ¯Ço°Ö,µHßvÝ.y$· Ÿû¸Á²R*“[¦ðbƒ»Õ|%½-¨ vÛ‡ùöÂT©·‡k98òB‘™èÆf›Eüjj`ç!müýi8±p0™“Óò1øö>­&( £öèüi ;ê\1•¬óÑÅäÀ¦*èJ²âeïš ?ÁÜjÉtü]\­ìדéoºZÎQ9 Àý@°5* +ÌÏIˆÑžlIÂ=Óô»’à mv{©MŒ3# ·$÷n£¦7$$¦uDxbKÆXÍ|°¥ÉêÕcÕôm–гÜzu¸ø[ÛÐ9¬9è2*-ÜÒT)5¯`,B€n{U¼è½Åªq»Éy\*ÑOâSì4)‘¾[œ·ŠuS³]Ê„4"/hXÈgu¬ýþ ñÔl¡–>õÙ˜­Üs€5€«otÍjzZVððÌKê…G›ùÙ2sÛXqCÏ'ÿ¼ì×Þ³µ6x´ À9)B^ª@' ¼¥Äõ£éiöŒhb‹,Û܇?‘ÚlÖMg»/X}>;íõYûeýÝí8o×ÚĬ2~ôæÑ /‡’ûK<52lÅ T¯3êÉÍ~FzcÚ7¢!çÓ±Á÷qO '^m«žvèø Äûæ • ×ZQá’¼'Oé_¼¢ ©³¤µ·vž¬í6¼û„±Ÿ6$Æ­«jŒž(YIóß™ Þåü´ê+æœ8LÁë¶12¹{˜µYýc(S\»3MêsÖ ¼ÔŒ&½õ Ë1>íÎ&,¶êó(’SŠ«Ã Ïð$óDW·WšWx®¸HT+ãC;³¶—ƒ°*æPº‹/?x ·B5eOñ}W퓞î_ @D¢¨Ú¯ç|—¡Êù'ï×’Ð5p£»{ù¢ÛSä¹TGäWÑö³d:>°·ÅГÇÊ$u޽„Ñ“QKÄ/!ƒ}"±ï}dŠuoèçxF5 –oŸ¬ ÈºtH˜ä¹Pswf¹™ü×·qRé¯g@»Ó@öh ‹~5€¬ŸŒŽ†ÂQÑD .m å3ŽÙòõe#ÎRïZÆÛgŒÙ¬ýdèý¾rSjéæü´ß–VÁ¤{Ã7]ii©•© ±Í, DýÓ#€‚º=ˆÛÎû³¿÷ð`·&åË.²¾¢pF‡¿ÞMÎߟ~É%>—‚ÖÀ¤]dï)5ê£13$N /$Ù›¸3̃Ô'ãUÞ§ ‰Œr=4ìÞ²ø¿=…±?µæ‰ñrË7f3bXìý­q³RH’vHƸ[*)ÄÅŽsNÚS 9ZÇÉáB>3M;k6‹xÜÜá‰üÙÿµñ¸¹6IÙëoþCj鲉>cFZk¤^ZP<â—4 ò•–šŒmÓÊiž)•¿ïºÖ`†©n^k¢™'oZ¥Ë^¢JŸûšíç¾4‹ðγùzG™tþíq½›¿÷\ÃrÞÛQ¶TÏÃNAˆ6Š­iI€Ó!Cê.xêž`ªÞO½0½ öhÝ™ö¡µ}PŒ&!õM^5…î×j·¦_7¥µe^Av%BÅz(Šõå)Õ9ô@,øÂdöŸ½xvZUÙI¿—&:Ì.z"Ý 9÷‚̓Nу#Žð£åWš ËØw%áLÎóøm-9¹eGê.¡þ¬ñÍxùXo™C+о…+Ø Gã-·f‡­z6õuÃÒ:ÏÑ-qqvöÿ%ë+pE@­à]iŽ™À:bÍ 'úÞ»RQ8ïÜd߯ø[@Œ2 bÖJ*ËÊ|Œ™*"m¶¤Z¤S¸Ì™a‰®R¨gçÍüUe— D“4Áñp ÒxcH´àJ4È#‰¾"y…G­Þ´$\c,œ3Ú›{7ö-þ—ŒKsðÐJ¿zŒØ›¹SÒ|É<@£y«$ü®°d™­qæß Ïi§Ú¿KCj ÖÚ_&—†ßÕ‡DJýoTÃMâ‹jbwÂèËÇWS@Ÿ §id€kOÕ>넪,Ï›.Ã}ýçcšèšdôÄsWà‚˜¨)wWÖêâ‚MȰúºÆ£líÖ¤™Ð€áénÛ®{i>ªqÃÕR}– Q!¡^ê1˜4‘Õ$‹b€·Dþ0‘¼@[h^ðÿгHé ÉP_dò.Ò\;lݧÕ&ÑŽ'Óû ;6Õ勼«($«=ŸÃBzg·5«bqˆà…+¯k )Ð&mXŠ ¼Ò´ŒW!Ññ6Ü ²‚s7Y Wb$îG•„k©vYDÀösÌ­6¸Hžö’| Æ­jð‰µ,ôF±Eß{—æVA…^y–úúV~õìì™ÍF/¥d], W]õ&z¤ 2ª€Në–iSµ×ʵa;" ºµ+ŒÉyÆDÖm©âÉcÆHð~¸ bl°Vú«Þ™si|¢MÈÎjã×;;ÓÃ24Ô&†/]_×wcP–y=~&Âå¨R¢MSyá‰e¬ë>7w®i­Þ¶1Æ"å® ¿¤aüÑCQ´¡«~h ³¶ZÉn©å3I~x˜GÃÛ·þ“±å³bAàpx©¡¥ ÑÇ>÷¾³ƒ4”&ßKÆ2žÂH:°ö YäLò‘T«ÖLó.xóo™ömûTÚ*)Зæ<ábli*z)¹øUÌâW¡À¦$Od¼&"·]Vw›¾ú> r“Yä°˜²÷â‰üÓ<ÞÉSëCj=­wÊóÕÉøAà¶/yªÂE½eÔ>ƒO…þÈ]{ÝŠ-lihüù„™ŽGŽ×w£`ü¼¸±µØÅÐÈésNö9æA6nA_´+f«µ9kóŠo…Œ˜ê[RåòŠ”÷¥ö>ζ]³ñW^¢`©B€7€­áåMÆì÷ ÐD„ý@Lì›\?ù(™—Ù±ò“^=ŠÌÍÓ=#†¡fâ¨fyiÃ^N`µKßù^Á3ôÈÄ  n­dæ¯+¸“—QÁúÖ1ÉËÜ&Œ)÷HPÛxj›¸¸‘EÅ…Ï|ª(Kg-—»÷>h!/”¨ +L‘õje$.ã¥$ïvk"Öö;Ôj]Œê.SKfqðmðQ©ö€ã]£l4u‹ÀÓ WGmª-RãÐ-}Ïé[øÆp‚Z1zkÐó'½h:µA32O‘Çí” UžG%ΘãI4Éi§D$]>‹Fv®Ùíðì/m|bS´õ‰À²¨|û(ö@«OËwþ“Ñ<ž¯V“Ðt úup¦XìÖ $”ÐDî¿£©ÅßulèWäo×PªôÌ1*–™P-3ò×^þÁ}­ƒÆd`Ô⢠¦8Û[hÅ> °jÆVö£˜-@k&Ô¾Q”_]´ÕÑØÞ5šŠnjÈbæEr»óUóï^ïÒ¹w±LÖ¹ŒõŒµcäN£qÿÁ˜R‚2Ù“nôyî>ù¯ºBBmÞ)ºšG즒–øJ:©mÒ1òghOùJk_:º¹6à©øÔýÃ㮘̓ííÜ^Ò p)åE¸¤ª¹k94ˆ§éQ·wÍÄ_TÑû"EyµµÎG¼7e{~@K2ŸðõFÚ®‰xQç;9rpÛ)˜«@Û‘ÆÛ€AR œxòü^_nÀÚ¤œA娗W7t.š»™”P,«æYuÎöMÔnï„õš27j¼M-)© q(&Yò^xŠæ÷Ê:ï-XR£œ)@2øóÐI/Î:ã¼¹ùϱû¼ o‹M?¢‘µ•-5ÌÓ˜0h„)ܱxÁÎhÜb[‡šBbÝ-ŒM/˜ö)AòT:_èlЦL³ÍK‰iD4i{8ÙV×}DíÑ´M5@М„»8·ðÕ'½`-­¿Ô1‚$JÍ•skÇÛàwÇs|r}ÊæI\»ÅØ„mÊDC €hÈgÜCÄ.jnBƒHB¸Ø„=£¹æº7ƒj—-µ^£F>Y|É,4€¨ÿô•ó$CåûŒñ§êeÈ«kˆŠ§÷ªØ®ÿo̓çðLÁÍÆ‚Æ›‰È ŠÀÞëž[í}ë‚éZ%rÌ” =Îùyg özç__E_ø«Nœ9Xù™Çd‘ÑÄR’ÒJ Ð*•=_éf¿m½ÿ¦e˜t>ö&]™/ˆ…¯:e Ê|Óù£bºØü>cCºÚJpAÄ”•§Ûñ|‹®²Ê〭Á¢Þk°@· U©â9?ôñæQ3sèîÈù￱= ¬õ2XüÖ£“Þ ¯!÷mìÆ${~ ä#å4ûï)‹žÈQây kÊúh‘†“•ºÉÔÕC­Âœõš(zm\[ÞÝ0 Ô=+ç§\aŸÊ+Íûft¾¬gŠ¿ä2´Ñä¤ÞŸËÓ9hñú,Y= ¿fÇgÎã—…WV¼Lnâ¤Ñ"Â(Gm&¤¦þqã€$É»…v½/øØ3 ³Û6Ý9ò¹Ûä…õÄL}¡{òмÌM90Z~ƇÏ£â"Foä©håøšõ°àW º•¥'Á®KréHŸ÷nì‘ÖW]ÖÜ¢ËvŽ‚úb¯BòÀõT#¬- .ëåh÷l–èôÖ0öN©àã•ðƒ^°žg ±]°Å^nNŸ ¡&|È2ûèÚG–`˱ç{Ú))—­Y\pÞ¬0•“X‚T¦›­'¾³ËzJ0ºŽ½²å9óv¾‰HÕb`NT§gª`ô_òÐFן¬æoN—{ˆž&Ä„§AÌ´y\¨ìmठdRÍŽ!ÔÜct×Ãe#iN¢çáˆ×é<7[ß øPäõÉëŽÝ¬W›ù"±<‹W*mõàïõEU÷¨é÷ºdd}ËÂõçû Tì+ñm‚~,]jï:ÿCü5*ÉË,Ü7Šª›&öÂg_wͲay¥µB~&¤Z7‘è¼jÖG]œ? òr_*CÀk^pË^ˆÝrØÍV»¯|®*ñÒtú2"TüÁˆ<§7“ÊJà „J¢ F¶H6€~?”[cWÀ‰–%0éÜ®oŒSKÛnhé’[-‘M#7éÖ÷\×Q«¬,HÏë¡;®‘¸³³(á£nöD}}lIiBÓ#Üæû¸Ô…¾¶›A”“vÜ#  0r•ÄWÌ#5FØIúõJkµ :Ž‹ÈE‰À>{-t[e½AZRkvuµŸH÷¸"”îXùÝÆ­®ß$ìß[…†zÂòVãå‡ú2í·ÁªÈ5âmDq$adªò æ/ñ(·­~¹m"u5ÏÙ¥9m“¾Ä)÷ê\¨¨ þnQǰs¿pä"i]ü, ~õÑi*R_BIî@¹åì™É,B²)Ä=½Ò­Ò]¨$ÿ¼߀<ô ¿Ç¢:Žø gä|A®ÙM ·qÉ&¬ [¶‘Ú{éÜ]_2QÄäÆIzßjfgfÇËîz´IH_ ç[ë/1ˆ‘l–ô»äV9D¨–kh2ÛÉB9¦59À,´ÒÀYI€‘»-[(°‚ˆÈwÔfxå_òExÉš@²¥’}âÝ~øàaó_•!~àm§Ì²n¥ ù³ûkÃ%Ë=¸$øt÷û¾Â+Žº IÝÛRºí–ËV·ò-%xtå½<‰+ÔTTðiû3É=.§¶?B•‡F(,{èŸ_Y–ª­6ëÝŒ9ì{ëû†VÊ/yA5!pFX3 ˜Œzð±6l[Õ~”–WÒØm}hå—{â×»2Xa9|ƒùiIù<÷íRŒÆüãFpɨүªAærysD¾A½ùÆæ¾ÙªXÜAIƒÆÚZÆ$aÖÐ?éðyÜ|Îε@€ ?ëkÇkÄ„ ö%è{¡S{ MÕ,h0E 3%I iاf{æ9| ¾1¯VßÔ´É•EXmkÍi±”MI2[w6[B€M9Ô•±©KסY[µ=Ww ©ß|¹í‘><—ZÁ'u`T›a“ËÎ#MûÅ–%>“§Á\ ÷¤MšCnÑVÔø”ÄG¸?#Ñ\væó?ío@ÙÅñ°Tà³FŸ«ŸcpcwÛz9ó„‰ófpE 6üðÁ€†M „øÝwúsíñäxÔ#ìÌSÙMg]Q)µÃœ…žÃý×:Œ#ç#ff9lzCûÇñ¨ßÔY£ñ ²4€C' Æfÿ»ŠøÄ3¨Ä‰ …&fÝOEíù³„ëv†a4\)©6sÆx’8ÀCá]S<=<6±<‰|«  `œŠ šd,}5<Ò‰e-ÇtŠ5÷§pÔ°Ç‚aðýD–¹ ™«oá\üòóx²Ø_]¯à¤†å<ó†š<ÂTzl+áÃ/5,…ágÛÞÖÝ‘yd„7¤D±·¡ÂD9À¸åt/!ãŸøkÇAŒâí¤f_‰èêIˆñ0ëI<íÓv'S¤ç̨KGt~Z‰ûüõŠËÏ ¦†çò šÎ|õÈí¾¶ÓìMÚ﫲ÖÈÐd|¾øƒm9åþ·ín:­gÑoh±šD¹lnä—SìÉÚ¼)ÍCƒœ#D.A>%½ûõæÍ×ÚH˜,FDÜÉ?½©—šK:ÏÁoÕùšGnþ#eôÕi¿˜ò9Z¦)_3cZ"a¾Â·ýθz¯F—ßþ‘‡ úe)Z|Çœ[gxÖ{ixkš2ôçË´Ó—ó媾yœÏ™÷}WúÑþì‰;;Ue| dÅe¦Ҏƒ²›'jÑ¿ÝòÒžœþ$+{ÝH&eðŽºå;ž»ÚéDËYÒ™-ðÙœjuÜ« Ä¡ÿúfƦ¨Ò!AÚÛ» RÛ3ÖÞÎH³€jÀ|y*±Y¿+ëĹ—2#9m"äù…9\5eƒE¦qLb©«LØ{œwrá^Õ:$OAµà{F|ï´(îÑEÈKy‡½²Mw>ˆ â‹Ô¿6 ÛÚíçòâ´)é¶(~J….sÔ#n»$fšõiÇ|~¤9Ó*¨÷Iäàp­‰+®Ÿ-…+úÖ,S©àTheÒ€Ù d÷³Àǰ0ÞÉÐ{çIžaådúΕP}õZ§›÷⺶®j£L`úE$Tö€pScÀ¢°Y'›µÝ O™÷»àR±t†|@íM@ ˜ jH4Þ :}XC_[ì¦ ÓÚÇ¥Âáâë½À*úƒV`zÂÀzYÞg•YiÚ¡ zùtuM¬¦ÊÛbiœCëF£Œp‹™O2‘ʯÒ}ÆÊ•ÀAǶDx*9෾Ɠç„ã[öz^å…sòcïݲ)Ú¹Y/µJìý1]ÁM¢‘Sg$ŸÇ6õowíCn·Pé åÜ–¥Œ–¡‹®CEA….ra™§¢™é¹w 4_ek…ŽÍ½Š›2•¾R@®W<º;–-óüV0ÆjAÝ¡ø ´Há™}ó¨Ë¬z-TÃoÃf-tg®È‘³}:¤¥gÈoíö°>Wl;B™yG[{®´HXGƒŸ¿™zk[A˜ÕVÌ«fuß~}s*FëV®(g¿%7}Ó†spµ°3†¤UIøÀNa¡½/£ôy*ƒ‰E”ïO—hԌū±ûÇ÷?iPH”Ž%®zØ Â.òA„ÞÑ]ÂÙò¾©xʼn•y,eêg–©_„êÃì°¶¢,ùà$ê‘›{Å’†BlÉÌ”ö<â¸=¼(¬Å´žÏÆé}·(ÿΟÇSÆ8„c¨h"VÍD¿òÏý„Zï$Ëù3=cë=c§j7ç}mÝÜ»—jŽOn-ÿÃ÷ª´à÷þ¸×:#_é§ýïœ 2<ö]ç"¤šj°^Ù~Péß^ôÖ ¶&ñÅKIì¡ñçÑ“*]eøÖ?C“ +AíFÓ5°Ö¢­åØ­ÙÿCD»säUSs¢~iÓ‡p!WÕ¶õ$Às„èÏJ7È÷ ÷§ÝKdùÑ|ñ׈åK´XEM ÆÝÄJÿ6¶ ,Šôñ*eãöpéGC©€L¤“ÚüaqÙænBŠ”Â²AÊÈ'›µÕi{7õ™×{–Ë#Yö_ŒÕâŠÆ3²Ö¶0wSŠòel£X „H“oÞ±Ú—2Šê,´!Ãd›¥iMxÇ,µbY)bUöº§ê7}œ°Þrzxê?êk-RËÌöªÿ1­uƒöS3Ò5T$‡§ð¢xEhÝðIÄÇ–¯j³3†&dëªÒ…¾ˆgw=dˆÞ¾ÇàšF¬¢©%3ëÑbŸ¢ïÓ¼a L‘ ”#iqƶˆJôD”ñ:‚yÄç Z¾íz§û@Áb_CÖ'*óÄb¤¹Sé˜L3°ócE¾&äã°äçšÛ§j¢§D¯#)½ˆœ± aY»”9­¹M«2뎔Ô*³Úÿš">nïG5Q£á¼£òŒ±6[h̠Ř¯>|Pâ©ÜÝù3ûT‰'ÓψEc±`4Òª-E—QŠ.|L͹†õ¯¹ì¤“Õ#éM Õ‚“;‘©"Q!•/CYGïy¶#ÿ/Yøét†åX·Òh á9”óÏÓXÜ©¤­“ãå¼¾ÙŒqöqYPÂ>î ¦ÿnsðÅ©ª«ÁÍ]îšçQI*|–Ø– àЋåÒÄ ©9ÝBïÂìÔ˜÷¶±Ê¨É;í\¾½ Ò·«æG÷¯â<Á÷dÛx¹‰¤½»u3&‡{8P| MϽ‹¦Ì´õG9TUÆ!é,áÝó³€óÖ³ÈΧ„„ÒeG}[¢s5Ÿî¿ ulÛ[Ã_ʺ†©Ž›²æ‘>õxˆ#ùn £s:߇°.»ì'ð…3HðIlQÓÞªî¹ ˆ¸`j‘m²—=ô̓+’TTžiÃ?-"Æé&VRZЙím·˜¦ëG÷Jž“È E<°hýÞEëwÖ4Oô5hJ’’Š;äªÞ“ø5Œ8l&ßwXÐè§Š°HU¾ PEÜÙÍzA ‰E&Á‚O»«àS£ŒÖL.#ZuC˜˜€vt’Jy=>J `A•9Ÿíö±Žä@pç³­ábù¹Öjšs—ÎPïàíù#ïö@’"% Vtgk²PÉ-SiKsc÷)‘²>‰£¶’yϺ=Šªÿ¨;¼yœðÕ'(_øè§Î£bEý£[áF´UšFèºs7c¿nD7Ç- ¯niAÎ÷‚4¶+$Y^€y`!ÛB6†¸‘W±Æ2©Þæú <öË\›©^Œ6ŽMÀ =ùÎÑF1‰ïŸ÷K-ýú¸ÙUÐ ·™ZVO(Ö„Ž´†+\{– ºî ™Ô˜é­j4wëôÿþ·ççç§kª h‘p UÁØ Ò ¬‡–C‡¡¶-e­" I6X9„—yMªÿeZÏÆ÷ÝÛwß}3‚êšr"fŸB¸Ã;æóζP)kà"¬0*ª¸w¥z%?Ø­ï€þýíWüU¬ƒÙ F‘ ©ï¸0ÝàÌ Z\ª{%ÛÌ‚Ä"î»ïÐc4ÈÄ1½¬8ƒ· Ân­¼…Ç4KÆ:NXˆ’ìÕ—Ÿ·NHûÒ “„—œ¹Â#Õ·ÁüU¥ñ¦ÜUr®‚£næùr¦šîÇ-A>A_¾=#I4»Ócˆ*­ñö…TgÄyœÇt-€5Lg‘–ÞÀ‹g>­™™'hlá©…˜Dx>•h ¯"†ä¨ 3c*w®ïBŠPx^Âp¡QwÀ“ïÉ:Ôj“B#ƒÐ·“XãNk%œíµa† ›ür=ÞEn@ÃF(É~ï÷Ðc?ôJ(·Róƒ 1oþIq¤!{ml×?RÎ̘FÌDh‚ÜãÁ—Ј;oíÈoÌš +ÚCì"“q¦Y`sWê ‹RÑØÇdô NÕG„ߌCù[_9·ŽPF'Y1C¬´,YshÈj«¼IYÜS>ô8SŸ+ %›>×\‹/`ˆ{™·åóß<"èÛ>0{´Æ^œêÛ#WÂèôbÛ¸;{eN”иÝn[½–G±Û u‹µïkœT`¡ýU{ÆS‰µy”lq†{ÛÏ•r’xÌf¾ÒMb)üc“ã٠Ѽ¸]‡0”võ“{þÈSn÷3 Óõ^‹K(+]ÎbßÞ´·ðæm£§f$`×"àÜÄ÷ý“¬HäÏüXƹÿÉÆis3:‚æ ¶#Û9›©ç{¾`1ÈbW°ÛrçG€Ü¡Z]¿„¾ß<òý&Á¡ºk9THgšyWÒº´?ú`úþa÷Ί.V0¦ÿðN°ì‰«>p/pÍ´ Õ.ùÝ—î$ƒÝû÷+7¦)è¡þAïOŒÚ\ e2í~ظSd†Cö‹÷ïwâd§Ý¹ûÜâ•þ&}úÂíR[%C±Þ¼@?¸»°»7X€d¡PMí°ÁÚEýØ7ÿäØÊ²Ð±ØØt„¿{枤ÿ‘&í¤ó›ìÅ©¸˜þj4ÿÇ®ö<¾Z²µçÒò½±ª—=q±ßâbÉCûí±‹õ!¾Üzz±ßô9.†IëU½“t€º½,™>2XrFÙù„³.Ÿ¬[I§Ö?ÐCÝó?uÏxÊïݽŒý&“—>ãm]ÔVU¼mÓùv5Þˆ•q&Fò½XÂvϬŸîÏÛ3·ØøÚ÷oø\VDÆdÆn\¥_ZYÑï'‘×OŽ,®âÅ\C^oRŽhDs;ݶ÷ï-%óŽzó¿¦UQÉú=N‚÷¡s­I¢l¾ò·‘t´Ž"ΙWžž ¶V:F²ÒMÀ  ¿ôߺՌœu=ªØÐ»ÍxEåg±±vþV¯¢-’-.&ëPß*Ù"" ý¬9f²t5Š£ˆYÙK`$w&*¿ûpë\³룉-Mÿ¡2^M-·ˆ{i'Ƚ3KKX¸.ï×›/T*Æ'S| Ôè›=ˆ×Ò²³ˆ*sëÇ*KZ­ˆ»}+En…+Û6ÇH¤SAîiÍ™k ·é³HÐT¶ZÂËé  /ÇP ž‡õ=($Læ6ê6ð‡{Tz(¥vÜB+q«×X{p„pG‰ßdPQn«7¼«êÕüƒ¨ø7ˆZfˆ±í‘2Ü—ìÖ÷-O˜+É$ßéXÀˆ™;}e‰ïr¤9÷bÍÞ1ÂRkŸÑ‚Fi^”•nt¼æòÔ‡mý8]?o×IÑ,+] ›rS³œ`¶Í³h.•‰=ÞºR“V+âyÔ¢¦Åy?6_“’º]$SRÊ‹­àѨ ¸·ÛR-`eI®Ý…ßÉ*Ι E3­ «8è[zw?ŸðÌÛ»é øÏ“›¸¯Wlµ:»m»ëWŸ•ß›zVo6&¿Í”¨>0±ú~“š—Šøì7Y`;§Ú 2%EJÀ‚º–I‰Y鉪eNäSÉIܦÀ‚á;lãû´Ã •ôšÈV‹5$x£(‚í'ýÁÄE׃'BÑ‘Èpr2 íUvJº—YHpÔ’Iù- Š1%¨1¼AtÛ‘cˆœB†P¹“qZ¸Æ}OàIŶ¢ç!(¶UAd€V)ºWéß:Á“~¡²n¯×nU™Î6[_ß¿ßê$?ˆÓ-uB$†om¢"ßž{A𜬹 ê[U¡HOöæn–ð²Ûq3µà\A‰ìÇœíȪô¸ÙjºA<5yé,(ÈaV"‚Å–Ò—‚ü2ªä²‹óBn‚ýG´×F”¡¼þIÔ¢E«6¤iä| þ‘u›B=Y„W ø*»ÝL[ÍìQ¦)ÑrêÄÅ”çˆÚF}wg[ªžÊU{ñïà$š)ïþÌúö Ô·1'¨¤Bӡ¸ˆ_ˆñ`c/ë¹[æ÷tðÛmÑÇÎ:ÃÝfù|JÐÁÆ]ªR³H,9÷ZzúÞÚem_|¹{¶%âˆòìpC hÿMì­:ñ¬ÃŠ„±70žÀ¡¸šiPH ¡z’˜´â*>nvt{½,–Îð¾àÛyµï Ã9Š~½¬Ý¡F°„ºå›æû†¢*JÐÐ¢ÎÆëÌôLµhN*P`ˆY'+GrÓñð{éR£³á ƒÏ{® Ààû©9V!Fœù*ì¶qÎÎùQe3t;6x0*¾Gù–K®n¿oø‘H•©^†¬¬‘PË®žãÅÞêlÿ7Øf/¹ +NTï |´!‘h<”*l!#Dû‰v\Q­%A#ºÁíˆÁ÷pB_h'†­g ¹g-öà¡Ùº½öHð‰2ïëñúÈ.Ù%ÜÒ°–W#ƒØÖšôM3Ùž®ð‹¼ŸÄèý­?Wh„g±Vª'pš-sñxå±05‹ß[zÛrYÝ·%éfJ æîY'n¡óˆ³“8²Ô›DeÚzìa€½Ô<²ì–)ÞK5$-øNª s‚­èg&­PœŽY:È•HðxZ-ëi²Ÿçø™iµÄ’iQz.ËØs° *ôÙŒJÇíœlÔ{î‹*Bú(:mñ¼ ö*f×wÓÕçRˆÃ)c„ÓÔ¨¼q¯çÎü4<1›<]ðáOÏ@ý&›{ê]€†Ý螘 Å…"‰"_œ8ædñ‹"y+r¶Ò7O8—óx2|v¡Qrfë­ƒ{êŒx ·—h"/áyà`‡HMÚq_Õ"’µ„‚±H.5è¢es? þGÙ:߯ Ñù†[-15ž³Gµe«È™*œÌyÜíÜž£óÓ¤²ÌEqdα,¾ÓÞ”V%‡_´“øqU–6Š 1Ì~naÅ£fÜ#Xå#;üÇ[/°4S˜s“ú”'—@Ôe5ƒýMȰe NcÃÞyãPXX ¶ò$µBëLel4´6÷¾²Îä¡ÙÆÜô³Ðä]À'>¢èáÒ'¢¶’kÖÄÛµÔ?®1}ã%zó¦‚Üm5%’òØèoT`+·§¦ÍìõÖ=™g <Ç~ñzê‹ ï)›ìæü0³žjÝÌ‹öÂXxï3¹Æ ‚Ä Ç€*ݬc~ë—dgƒò ,W´‘¿$=˜4øõWOcŸJ`¿ÄpQö²©Ìçž3 š3¥Ìñ$lÔU†°²låòOœn`«E²­*Ëp4OYÇ[KÒ¢Í[ßm­ú†Zõ*®sýVÖ½Ù©àX{¡«¼ß3f¿¥OÕtr»k©ÅAÍ;SÚ«‹<ÄíhZ¦âÆ|ßO•ökÚi8 ±Û¬¬tˆ’Œûy¸õx+Bª™žàÝ6bªmsyµ)£$ÙKOˆ_lúŠ- µÓ4Dî£Û§ «dûx³Û„Ô"áf[¹9µµÜ·²,ó•…¸²&ÎG‘g½ÖÍ’‘ï§Š"˜[¥˜ß5÷D)Lº+––a$^Å`ºä­‡%†Z­b9Ùœ³üg1)»Ùàèˬ½ðmZí:©Œ3.Ê~²äÙzuøæ‹¨ÛëðÒÁ1ýiõOµ¼@ͪÈû|Hâ”E&^M"–GRY÷©’=˜pAÚßÄÔª–­h‰ÑDå ã$õƒOðy[Àƒy1¤þ¢ûFTç-kÞ"4=dá§¶eÖk“ŸG½š¶VLÏB7í¨ ›í¥ØÛÁn½Ÿç.oÔç%ŒKEBÍvÇ×U¢ãn¥íI qy}u); ¬{·“±ùwû.Ò ¤µ`ìÈ.ï%uÒ ìBÉ\‘‡V)¹öIš¤á“Ð<"•!HÛV-¡…ÐcÅ 'yatJöeÝu¨=¸½E '×ø·Ç†-+b{šüÜëódn…èÎ)ò8¯©½BÁÀy\»zû 4TÉœŠô( G<’q¿\³]Hœä-­UÆŒšéõÊ€» šÃ—Œ¬d.g(‘E®L¢âw/xî¾yûLŒËÜ}gƒŽÍ"‰"¯„™r‚ËnŠøy-l?²A<å·e]@ÞŸðÛèGý!¥ØãÅ…RI’á)uĉó"`;ÆËL4È«T‹^I“˜6µdƒ%Î;·î„*„,°˜Gáé’³{åû/{‡hViÜ1bKQCqy¦4ätºŸ/9â¥.º9ÿ’#h‰ÞË«ÀŽm“].Xƒ´èzËž&ÖIúßÌêÚHÞÑgs²þ10ø¼Þ]2ùZb0vË6I×eЛ€sò‰‹¡¦!|N3×xŸÇÉKö¹K’ˆ»¤kg_ÌZ¢V¾ñ4{yV–ÎÚ|½Z2¬¹ Íœ6ÎEÔwªMB¤ŸZD¹_·ÍÞ|óºÕÈ%|ξ?+x^"JSFè=4 Ü52‡H&Z€»øøf{Æà Ì],]#‡Œcòä¼ íÓ@9Gq Vïåðß2ÿ+[T;Çý[§¸ âÊ ß®eï=8.K‰’–—£±&÷²ï ;V€iŒÔwúÏÐ^³D¯×»ÚD“Æ‘ …ñ¹"^_¨6Zycù›k{î1ˆu,¦À6DôpV§Ø_ÔFMŽý0}Ú|?Á*§¦ÛpaÈæÔq{Þ’açטˆðÓ? ²¹¡jy(DHXGÅa¾õ¼\Kv&*ÚWžæñØ#M\ú›Ý¶é'ùZ—[#˜*ÌkÐkk)±PCµ†Ç¯#ÙÛR&òPeÏo¬BshëÍÝÖÔ3‚zkuߤóÁÔ ^ά·~R+”qQ%>¼±±¹:ŽÑϸzV>^Šg¿ÍÈ]¹x;|éîôR_wx^ϡѮQN¹)|Ò«Ã÷¸Ý“·ÇÙøn‚  ÉÇ' }Už’ç ã¤”ó&žÇù^#F†3:šPrÎxöÚ}Û³ÀL¿Çi*±x³e¡<ö ñPäÍ] %‘Ÿí㑚myMŠ^žój7ë‡MÃÊÿ“"•š9Ýk{PHY1æÓÎB!b­¬¬¡ñLí”?žfž·T Ô{¬ROJ¨/ãµGúí ?²jï½ ¹I9_üý©ÇqŠzŽ‘›Ü‡(|Ö™/×78¦ö~‡®Gê÷î÷‘vÑCMÁ[+Øm¼íÔSõ%úÌzÉ41éË©âvƒ`û}øÆ;Ïz› MNšh\>ãßjïóƒM ÊšùÁâíªÄÝ^ZЛo)i cœ(G;%^ðÜ’f#•u´ÚOfM“W‡Í´‰ö-)1ú“æ®ö煉V*ž|â"ñY.báð,¢åÀÚв~CîO9¸à¾¸õ‘>ÄENÏ׳ç1¡·‹¥W“õ£b¥¡WÉW¢‰-q·¢l33kWðÅ­@:¼˜á«T°UŒÚFœ^ÖÖ¢*¹R™¢Òšžû ù‘i=löŽ­]`ùr?­—ž¸.ö~.)KYÌ ¢Æc¡ ;4µsïQ¬Lý5Iæ.CçßZ%¯ r©ÎêñþfGµšüÝxr×"}†fÛˆ7œ%:3Œä,4Õ)Í7áç°Pп߅ Õ?5êF}vE; è˜/êi7ŠD:ô, ðRÝ_TŒ¸¯½êçC³f¹$8sº½¿Ñx,hë¾³˜§ÖwxØ1?™X;Çq²äÒ÷ͪA&äþÜY!Ÿ?A/åÌ2b†44sÕvJªdçoD¥¾b¢ ÍôD/“æÑ¼ûóA50@87{Ñûð÷ÕX¢íîüßžmwq9»ñôƒÁþä[-òAáßjQÑ[-÷ÞêHyÝßĬœîñßMÊ+0ÇBU{ÙvLƒ4ËL3€N¤ÉYþhp6ÕÙ™íiÃ|ŠV~ÓÊÏ"6imïµr¿*â­¢KªF(•]‚˜ûP”É%aãÕ~ÁGjx•/XU@_µfJóø ¸Õ^ŒH³¦½²VŠjhLO¢çAgŸðzÖ)Ä…úFæÏrO‘ Ââ A…ä´_­A†ç½…d>ÝŠàWÿ`QqRÁ·wà3d'Î ’?«c¥Àìc|‘ÞKð'DÑ„½YSiYôÆ ™|zb¥çEíš{èßnÝæQŤgnç Ýçêì·º*Œîä\”º£x,+Œoa'ÀÖ|[ÙU‰²QbW!{ß-ºGtnæ7…Þ‰%(¸g†kO|ƒ¿—Jò”Çâ`úd§øtÂh75§UG?fq¯ 5 æE«%¥ž(¾E1¦ñÖŠII4oôØì” —7ò…M£ã‹³',Þ4îqÞăþ lÉžc¦J G”fpYÀ7ÿC³­ÏÐ[ßÑF3F´xóê‹4Aº&­\Glê“7F뺼ÜP Ú1C +ZW¶ºW=ó_Ãô³æ½difÉoËÁn‘´¯$&nðôs”üNÓ ÷‚øiŽ&Ë%µ=yD2kö+·!Ä«œÔ¸†›Ýf{ÓëÎ —ã©€ v{!B•ŸuôUämåIÑãIñ摱 n–<ÛáW^XˆÇ^ЀÁG…¼ÓK¤ @‚þh ¼Ðí9rM…<\æLg².AØ@€ ¤ÛqºGiPeò3ÔAØM¡ˆ¢Š†,,X؈œ 1ñÜ>¼ŒT uŠêVh{ôý#±>taêñ¶5b¢%¥™×Ö£2 ‹¬ª[_?åLôÉo=„ºÌ“ˆ?>6çÚUלì˸ÌbÛ4K,W]ò¶ãsÐOÏB“D–Ax„b¨ïßï‘iz†ê/JÔ ­ä€²}è…U=¾6`›ì®W´÷ CiŒýÙ«xª\¤AIà¯gHÍc¤¥[³ñzê(´½oæz|{ŠkjxXå²°GèeÝ8[ùR †%ÂãÍ!›.Ÿ3Ï7ö¸UÆ ûñ]í=š[¿x‰uF¶_\‡Tû…ÉΊ†2›Và¸ý‹xÔ·#I¾U±¡±  ÖáÈ´ ™½;Ö깞g/÷é¼]Ž#.€›ûĺ<Øm…žpS½ç—š0(qCÍÔžœwžSû¤ôù!wâäû“<;ù­øF@§…³4iEŠÛ0Þ½E{ÍÍ-í57jÔ™q=ïßÁÕ œçýû71e§X7ã}^¼Òê~! , CXŠ™É.½`³Ï;‘€O9§£HSTëÜþ|ðôî”>Ÿx.k9îÙF-&ÅÒÝ\}3ú–\Zo\ØÌmë§GîÑa±?<íze¢y~ÑfžoñæFª°Þ„c«ô,áÌW FàáDÚkØIAÜjÑÖAr›^Ä`÷èÝß‘õ´ù››ù‹Ø´]k¦ȘLQô’p3Þ5÷-W¢“¡Ä^!~+œ$ñçÑé«áŒtï RÀ$¬ËË}ެg=àôÎffjKD#X§;R»‹÷[>è)wÅ“,·xÕHKi7 þêM7C¡)“–h )Q)ÃÔ^EàÃoôr³Îr«1*¿£¸V‘êð{Œ±)¸+Ãx‚Ø'KmK«)XÖÝaÿQt©?_ÞÛZ'†£–ssfê8lëñÆÊŒBSxð͆D'[Ñ}áÆe¦Oz"ù®ÖƒN0ŠÛÎóõ©GKàÛ½^aÞGÓOÿxî¡Nqõô÷ÛSÌð§5Š:Ì5©ý/RÆZË-âÏ`ýT8u±'ÔR:é+ø}mÚéX¹ªÝXk(®æXŠ0Z+ÔŽ1|·X8÷x×ýyÓj¡lá®7à>þÝ^¿m–»ƒ$‘?û?;Ë·³Üi®»{jÖÉxV6€¸pÚu„Àò·‹Q$®´¨ö_’üjEŸìõ»1s9„QÊú(ÏŠR;ÌŒp%çù‡çyˆWrv‹¿PGNÓÐ+œÄ½Âªàô™½ÂÉçpð(hCïÞCjq WóO >kÿIŠ*­°¬üÜlOcRó½öŸ~vÈþöü3.ö„~ù^gÒâ{í«ýöðjÉþÕ~†æ/ƽ‹ý>ºØSØÛß»›y´g*<á€nTQйd*[6ÊÂ]y.û\ ¼¼£^Ž <í±ýïO¸ú’@Ö—Y_Ô¶#ëöÙûγ3~úì©gͺØó– T'îOùía~¿ø¬üþ‹à…m G/æã^D1ݽá“ý‚O;Q53úÏÇcbÑ ùC”_IÖQ=´¸Þ’©¸‡£¹ÇA¸Þ(y)ŽâÏêñîqP±åϬ-ºÙs2Ü/Wš·_„¶ö˜kÜ¢›˜¥Óž‚ùÕª¸Z·Oá÷¶þ 6Êƃ"MŠŽ0¹æó¨}ÇèTZ”µq$ÞCj1ÆñœÄÃóÏsû±Ú{ÌZœ1ñM©±æ"í¹1çEÝÐi+TøL°â)œwxÿm&é&¢xn’ ’‹ôÞqØ£Ò;ÎP^“w&"°¶qZì Iè÷*&ÂK1ˆÐ¨[–%HÚ÷Q¢c0)F`×õfÚ¸“´‘"t¢M7M”íR˜žž˜8®P!•–r`ŒZT’Ÿˆ¬Ï0êyja¥9N½¯#¥ ¼šÈYlT£""Lœï&*…{Üzü¶ïjjÓd¿0m>7t·†Œd„ì;£Uþ‰}Ä5Üf_k‹.‹´^àˆØ#èÝ[eï‡Ó¹lêzÅJ*†‘Ø8,G\Û^JǽýÈF§¯µá‰¡4® ¢pÁ3ˆéxÞUòóÏÒ~Ý3–©2RúG0nìQ`Ô¡{*IÉó ÞôoCVL¤F‘IäùVerè=Å*&­e‹Î¿Æ+cÞùÆ?L`›wz¹öš‘$×ô ißÜkù_íï öwnö׸ƘzS{€ãw®í]³=1«`qç-tgÓ2€£é§™cáYÎyP[÷äI|×yÞî–TþWÈ·ø¹0ls‹ÜP3ÎÿÏÛ{ú6š ÛlíG,]ùíµ;4UµVÃ?šHUdÔÜÜ­=×µ¦˜x•½r³<è@!>ò­«šýo RVQ(>´^1’ºz¥[rI1bq̧z ò‰KZ€cAÞ—jõCÞ-aÞÍò?\ ÉÿDI‘â¼¾alö¼øýûNÿ·y;“'¦1˜æazçý~wàÜ3Í;¸'}·ûxÙ³ëƒ-Ó`­Ô˜òyY´ªHz$Hx,ÂçónOÓvM¬S‚L’¹ê‘³rˆ£ÖÖYZ_v(õiâ2ÓtÞ·<4!Í«'œEDx¦ ¬èhÌg’eì{¢|HiêAJ Ri#ôýcayB­aæ½\ Ô{È„Æ#fÆçm.ÒÕµ5ûÀ¡p~Ú—%&¢d€V%*¾ÍMÉ0ô9›2*´ÖÖr55õXÏÖKÓö@€Ý("ÀzPgGÚ‰\0’¼¤ aGn¤=-=ãVÁ†l‘²¿6Áìêõc̆óoAèÁ6 åžÆ$ >€¸¯qg趯ÈhL™Ñø-SÄ|'ÞƒïaíyÒ8cà%€úÓ®ñ§Á?1³s,£áÙ0$I¶Þ†K÷Ïæ{ãóaÏ‹ÐzJ¿e˜Â3öŸš¨8šèe§ä¡>ƒÂ 1×ó¶í¹e‡B5J_ó¢zÀ&¾}k¿©µGÖc´8ª~·ù“¼¶ÕjŒvŸ ¬(ÊþAY;éPöžH:N«ñŸfêOgÈç¡Dös¥ã5gîzοæB¾{qÚ÷ð?­l1$ ú¡­KI(êq‚nÄÆFNëLÎF‘ì¢ÛN³ ©ÐmBêcÃY)©*°ÀjS)QòMÆtbºå]Éni[Quôƒþ ´úžüÌ·•جiË¿ÞD´ßAÎ>¢6%ž‘ wtæ¡&Å•aô Dž›i­È©m|µóÞK’›ƒÈº ¤\´^‡5ò…@ÅÝÃ3Nê²F#Ø"`-UŠ„+PRéÆœîž&L)ƒíÚîÜœzømê=õÝÖWºW"`ãøq·VE|‘ÓÔì6 Ð @y¶E·{ëc{ë,aC‰ç‚aVFšÇ¸¸½ÌŠ;·ÓDþìþì:Tñ¾@îrß;3U¼ô Xª|Ih*}f¹sɨ*x@½Ûšói !Ô:º^ @fè™òw¨‹§LH𪷶Fx ”Ei']¦üç÷¬B›v hKÒ<Á ‡sß@Á}Û ¿¾aÛ–ÆàWïÕ–mL u¦—0;¡Î³‡kcoêÂ`‚‰.ž[t †3¢­ÛŒ›­Jjã ª ò;IG˜¢ øŒUukÊ‘*Cän>Þ—"°(^ ‹²óA€)øèǺG¹ï›Çc'ñÂîJÛ,ˆ3‚åX¯æ·.¼2°úAǧžƒ‰5{å3ñiÒGg´YšÛV†|û‚ yÀG ?åW-ˆ&à‚Óf;o¦;§Þª©¶à, $óCUs&[}æÉ-¶®Èý%u‚4ŒÜèqë)‘çêØ yëëb3þé#4c˪Ø™ËÃxL‚ ÿ¬••âÌΙw·µ>Ýu&Êó†þÝS·ßå-'Ι¿"¤ `Ù—«n‚RãrŠ^ð§h6h)ŸB~s*ó¾‰/Ú¡Ò¢qâeÇ6 ‰»CsBQ´Q,úf/Eˆ{ÊÀmpyÜq½ ûwá_ÛaD Iéq’Ä4DéEÉßÄ9©³¨3µŽÀ^^T}Ä÷½X8xŽX#FË–Rp¬/bJ@í³fm³ž†d±rÑ n­µ3Ð(N׫ڈ ok=y*;K"ÓñòÀ-Z퀨€@AòQ©Óh™¸ <¢Ý€¯5ô¤ G•ëgQKúìèrH¸J÷ÔzcÕ8Ùné[ç °½ ºWÞÝ»°uë·Ê¶‰Æþé^gáZÇ8ÃïSÆ_䡊¨]UQÝ–-TV·Å¾ ¥[mÃ±Žª'ë¶ì¡ŠÔLÓ²òuÛ#S핞„Òfæ °Ìe#Þ÷ò§<è§Ë·e•=U¾MXEBk¯~«UÑî‘¢,굃~õQÑÕVÙ•ÍøYaÌ¢ò áŽ]¦ÝWëÃg©çȤºP"ÞHçtV®Íì^of²ó‡*¤3£LÞn.…Ö¦do>ð#†³'ÄžÛùKûâV¶ë€äß»]Ы‰Ä€Ÿ˜`š…{«çvr£Â¥óCáR¸K9dÖ^Eƒ—.Š4(•h빋zÎÅÍñÌ"³õ£¼¦û:Jƒ£Æý8ížÇ=wMà›Ô±y$6µ^N·_rþ ËsÍšÍv÷Bpz†–èð›Ézùx¿ja-—cûÆ¢UÃÃÏíó‰Ï„½~7Ø¿O*ü%mXô«Ò÷§á„Ç1‰@æÖâÒ‘èiQÝÕð';ö)Dð:tV‚Óò=hS?7ÍñœH–09P¬½ æü::Ø['lÓ lj“åš<ÏÐkXð!Ã=áïÉùË}©è´V ½ÁšL@±4gÉ(YDu§vãΠĶŠ$9?‹õK[º!’÷=ó„œó¨«L(:â7¡§ªOΡˆ¤þ÷Öï³FðF+v‰pý°YK0×bá‹CL5ˆúâOì+Tf=g¢ù3=Vï}V œ²g+«@™ï«>²H~ ò“„V8Ó{ðºð;bôš!T•Ôÿ›·ò?óÎß•ŒÛSÓ;ó>eÆg®Ÿ…j=öËÊßp€ S.EäÞON© ö6¦`¬Ií.”PˆRŸkq€2ie¤¢o»¿üØ Ìì2YרÏöñ%¹ÌóƒËäiÚ¾Ìo?ã2¿=¸L‘åíËxH‰À«Ó2cÇyÚ-û'i]2 {ɱqš:ßÙ¹}¨‰´¹é<ìÄ}3IûðYê¥$¬ð•|wáÌ­‚¬ ßÄÕM»ü<ÉR8%3KòÉI´›:¯[¶ ßú9þ|ýýK9¡-ÐKÇdÂ]æVGÚ«ÜÝ2àÌþ{~Œÿ™ÛÄþ´áü´óü°‚Ü/½Ý—UfÿægeÅá¹²~Ð?eö’¬)˜RÞõ*¾÷ÛèÏ­î6´#Ønæv¡ª¿÷æ=ÒÆ­âä ¤ÍÐÆ_¬ß/õb1Ð&!񾯨 Òf®­¢yÚäªä&âBÒ|»˜»V¶]’Æ£Ø2šµ©ý¹ó%´˜4ǘ4ÑqdmÛ@Kטº)Ù2Ø—6ÿ £?1fÿ]Îô»ÎЇ8Ýxå½l‘È&Ý6ØçÖmö©uìÊ¿!R„©^¯î©üc%ö­ôû!iÀF€ ¼ü þ(çMòî¿ÿÆ’ê¥ÅšHKj?Ë<ôN¢L$Ú E­oH¨Þ¹ÔF¤²¶êžÑÓôà#Ÿç4nÙÌMu ÊÒ†¶ð¦=_¸ŽÛôäJ´ó祶9âLNlÂ[Ì=,}á8–;àj©o7[„?ú ÇóoÛ9ã5V¯Åû’Ñš8X¾lÞhI}¯™u¾ÞÚÔ1½hîúELŽ8…?“]Hkp‹v‰Ï‹nOu[Š=×õɧ2Çj¾›ÔžL?á+XâÌ*,–Áê*OõÔW™˜SÝÁ"§ö©¦º°‹“£¤šô©Œ½aÓùÖ4ƒPw äüÌØÍáE-”»€‡“BY]^ ¼^a+Î?š êÆY+ÒèmwõSe¾uµè#˲©)•ç‰õðìñmIHÊ´„ «xjçf2%‹4ÔÜzÈ<ûf‹8$ÂtÅ–QY¯ÈÂç¼ú‰^})å™Ñî6vž¶áŒèšÔ™žÌ© ?*]Ô4Ìü<Êʦ-i"ŽÑñÄÈ¥‚øE}sÐf± š´IPiÎçN/hPÿ¦Uþ`aÓ/I†ÄIälãÂXÃÆ²ñïÿþ¬I úÐ_î»ÄÕ‰{¥ògö³‹U»‰&PžäžÞ阘ò$¡L~²-µøHÙð4½ÑÌèuئBj£ÅOá5jÓ%m^#4¹t~÷;7úåz;9ÊuÄÔÇ'›¦¶ñ°3¥£_ŒëÚ ê¶_P~L¢f‚Û_Òzâ¾v×yb‰2;=Á¹´ðtKäijfhŸ4^¥©çUJðÐd“#±RÚ(9Õ÷ ŽýpFΠ2ð¬û lIIŠî³'¦‰ôLÝðvfÑ­k¼§FüÜÄ¿¨Z_”EÈu‰ô{•3uŸ¼•û@’i<Ç€õ5 äi×ýñ;qlT,!àù¬¾Âì|e”ª3JU™ÐÖyº&c‰²Îhe‰€÷ði–(¬™D>šwѼîÞÏÝq‚¨<­G¢ò¼ÿQ,&?>LÇ;æƒý‰ k6/À8¤Ë#PqI i(…_yo |¢í—ÁÕŒ_÷»iXÍqBH3s]Η3¥Ÿ¯¢ÛXx$¿,R¼Ñ'7¡À=zñ¤Lžžg]Ïââ"Mž_Ž·ÞÍK¤ÒàK§ó#”zâß"×&­'òSVR4~' €òüá‹à:7”2´ý¹6~927b•‘Θswø×Äó"ï«è¿s'ÇH€E<; "ØA³¢a;?Jþ²¶Æ½$³ÛâÀìçvÚÀÁSÍú€Es+â|[ò¢ÂVù*°Uº5TG-ä¬8›X#ཀྵwãTÿ.½'¸o•k•ßýdï"ý¼Š/†øBôàãE·(øñ¥%¾âùkÅÓI0Ð~ž ºƒ4ËüUVê³Õ?>¼Ç71JëÓIмì=1¾¢aöoTF`ŸX Î “qÖwHµ– î=ѽo¥°h‰–©6™kÃ0­Ç½ÐLNµÐ'{Š$xK ¶NP[I„ÚŠüвÛ=`| øª94ÆÔÖ‰¤¨™·@U‡«tºO…‘°ÝÚØþ‹Jîñ²ä €*Ã_]“QH“æmOÀxâàž1øä_ç<ùŒ«Á8ì#`ÕèøZ|A²uÏáº^‘p6M¬àîü•¿m?ÜoêÉ3w «Ú‹=nO$ògñ³³•ƒv¶2`½B[ûãÊC;ÿ%+•ÿƒ"òß—/=m_'°Öè€õ ÍߺE€®1”á“ò ¿Ý=ì6/NS øÉË%ò›õò9é™jrêËÉ*GýM›øöŸ$m<š¼~7ô?ðÆ€¦õÓèý¼µž }XøRõ¤QñM¥íçHõ†š,ÝC½ý7y¦?¸IøóÅ¡=|§5y»ÕŸ-`í×¶¶KTàìò  âå?<Ô8ŸA™<P€Ãžý ‘uš^}y—–EñQä]Ú+úŸbNyý1æ^¥*³OR§Œ>B’ÊÁçQ§d©ŒÔ›6»UÀ‘"fÜ‹báFó¨c‚áЇ ±Ì²8^uÌ¢jA#%€¨*êˆY—}Ê·ðuuÍÁØ«ß,’=Á;µG¶èÁÏ  t@Þ¶HjÏÊmåÇRšfûŠ•Ýw ª%ñ_¯ÔŒÿ™…â U€®{ÞÉÊMš8ÓSi³\Ö Æ43ó@aY¡¸^éÛæ¤ÃÏ‹ƒ š©!„¤d‘Ú6dxŽžóÅ)°pB§ŒC€J»s§I7²R^-/7C _nºØÄl†^t­4Æ“»Ð %Ííáó*×cK½·C3R@÷dPÒ$/»—ñͯ]$¶ËÙ4ʆ•õû=PFÆ\ƒÎjjT²i0E±þ ªV"¨šWíÐm-ßEÅÝzýiëõGò«‹NQŸ&@;t±~Þ~{D6–µgÏ1v°ž“°ž!SîwfÚx·«Z2Òã͟Ɖr;@SÈZŠI2Ô'¶”* ß)\³™Ü½5…³ïÄÛsOw™VÐáN•ÙŒûÝAñ·Ƕ^½"$äôˆ‰cpŽxø‚_1h´hÓ<+”… ‘Œg˱Z¨·7~œ«ˆR*g"‰1(\ËµÓ¿ÃØn"Æá=)M4g‘´û®ØŽFà±Vfn´/ŸØmÍLäÅÀs'ôNBO-ˆñîQ¥ÈIè塨¥±0Í@>®º Úð/¬¨‹µf^–Ï-ó‚’ÚNZD,„¿ÌpѰÌ5· *›RÀ†D—§ü€óÉNnÚ¶ªóºIüpµWЦ‰;zfû¤S…æßöÊ¢Þ¾ï´jϴž–e3ivÒN8ðí„Ê8Ë™k¯—aY·Å¼çåbyù³<çåÝŸ@VÆÐí³IõÒA1Ÿ‚‘š6ßËË|ê{Ïÿð½lÅóïE<¯×+ýŒEW˜#(ù(“ž ““öEQæºÃ¯tðê¬GéÕ±¶ŽXA¡Åûíûè.3·›\Äü…»Ñé%­"óÂÊÖÏb$)àÝ꼘ƌŸ¤LŽP ^,=B øÛÏ üí±‹Ù£¤€GO>Á08@âY/ưTGö"žÓi{½`Qt?Ê1ø™Èg9+ý5]ô›„Ac|ÿì7K#s×i¨ëƒZƒ¡Æ„š9JɑҢÌPÍæ°RϨ•¿m;§ÒŒËØV¹×qË£þIаž"u»à¢ra>|$†ðrd*€!,­F«$Mc•MÕ2XVT’–QŠmÅE4vÓî+z  9Oá×èïôHb¹±u8ÇÚáqú^»ÙOïÈP騔)S€9‚¯HoÑ”bo¢±ÜB!ØOÛ ÅоŠH\uSÇcgTz)Rú¼ƒIkêçã&Wvpbl],¬ðdžAŽ;ìîŒ( ‘²vÿ Áfº5!ÜÝ–ls±Â ¤÷ùM.h¥pÕ´p5 óZúdæÓ—DMOz·ç³•=ÛKNŒ’0Ì[s¦Øf‹ žŸ`•°Ö€„´à{ñâ ÅÀ(¤ÆMÁv3·2D½RZ@ºq—k&è/ùÕ´žÑzi¶§Š öÿì µð^a²uy‘{¼š6M2’Ñ–׿¡ªº7š ^XTл8Ë=¥0¬¢I¦WqÓ^¤À”-Ê4Ædk¾h«Œ­ñ‚±âíNÓn7 jšy¿L®Š/ȼØËâá©ZùLOöB™ÅæÒsÛ.>(KÀ‘*®æè¿+$t@:Û³ü~§!qš‚Þ*-´uɰøš8[zø‹ïÒûȵvP!Ï"¯ºŠà³/+ã\ë"¼“™½7 ¿°ù‹=îflX·Ð›z9=•t™¹E ñò*¸¯¸¯µø,8¶{Ø_T*qy(ñ;í÷Ä[q|©}¶\hJGñ7w¢×zv®yUÙ…-$ ›UkɹWéþöpmŽÀ¹×ƒñw¿wÞºXµc¢wgºÛe½°ÊJ¾íŽÍyýä·å;{žtê–|"þl)à<¥QFß —™ ’AåsBv̳ ùÇ3Õàö™¨l— qå4;ΓÅDSv<û39ñúœâfXLêÚ÷÷"þÓ‰Ïï¥VFìªI2Ï­´wdb°ß—:÷ÝO VÔwUD[¿ÀÙ>nHÁÙE@¼S\°5‘Õ¢7OfÍQ ™3Û•¯ó8wI˜Ò½¸bZ*öÞþžRWL>©®xL\1I{ªÁKÝß4ý¤¼"=½´ôCκˆ'tŸ-0Æèæ)Ëry0ôŒö¿!eëàqËF¢—ö™“ðÁÕ~8§›%ÜVR‚Î2ÿ¹Àö_ÿŠh _íõÃÉ‘U}yÏ_ly,î¯gü]Ðù/&ë-ºoÝϨà;¡æoaõÈßù5ÅÊ*øb)¿c”¶\ÏùÍ<Ã+üÂ9âv;÷Wý*9n(ÿ¶ÙÙUåïúÍakW’{Zç/Y|¡d™úæ³Ää ‹ " »v3±¥V Õ·`2ÜJÉ…¿žŠ¥r?è¾0 £¾ èñ%¾ûZËuäýÀ3¸µ-îEŠ.˜3lùK‚ª×Þ]³=½Ý yÕÛÍUR†F¡å&"“-§#>]âUÏT´´Aoù6l]FÍ_ϱ\™ôüþ…'dW’IÍï~§°ú¢7(ƒÕÚ)Ü­E¢ç„lûcWÚ9µ-!!+Ÿ|/¨ÇqûƒËLvÔ·.»È“po–iô„9AÿAEÉ‹[;÷ºÙ0·H*›™kf¾·A0±5÷V­ð\ŽH/™ ^ÀEVâ< ÜT€ò­È"†c‘zDÝÇ(5¸w2fnÑ&òç1ÁÛüIÁ[ôx²:? 7n;ì¾X¦ýxë»çÐ2!üC rî#ãPbZ”G"×½‰&¶Âqè…ŸšWêsøš°|SÀN‰±¥Çš0{‚6[)ͤ•Òd¼8–Ö7^n‘{ b;ß`Ês/E¢~fQ¾|¯õõža»B`‡vÂÛDo6Û¬[ÔFJ¾ÝYSb o¸UFôŒòG¬w‰\`ß2ÎÒ£n%kO³:g3ßÕë§9äZ¬|¡IÈ_ ŠÓ…‚v ¥y|9cYb¶~”æÄFéø*œníÇ Ñ ¤öêw(ÌÙóÀp­Mµ× TXŒr+<´B1aÔ²óêàØŽ]Û€8h®fjdq08^`)5xÔ› þÎË›Rs'˜GžÔ8OÑZFçÚŒ¯¸&G?%™M½Pø^ØI}¼GœàjóÖÅv›e½²‹áißþÎ=Lê½¶ ˆî³“‡ø¬¿ÃYø–¡ÿÐø_4¾ý?Œ'ñ)jE=ä‚q€x„}ãŒÕlAwÁfŠ!ƒ¨b6Ù­ÎlÄÀ-ë"Á!J÷/Þ¥Në^Ð6—‰‚|?í)ŒIØ9ŸÀ¿®ŒjC^Æ¿ äR¯ÜÀ²’0D7 ’Åùü‘H'z ðÔ( ¤žZÿ©ÃÛÙíntxÛRš'èéjü¼‘#{qÔg© ¥2¤©|ÒÒéáÞŸúiõý{•ìÖù¸#"AÇÖˆ4žü ½ò®ûzê¨>ä{O쑜·×šàÞ§*ÑL§üƒn7d@(j[-B¼çqÕ² xÏkõwx/ÒÄ~×ç®TCÎH‘&&wÁqpGÄ4ˆM .྆IORóoÙ,Âj'Ž R£¡Ìöè$»]Öã©Á^ŠY…Õzõœý©„„ÞÆ”¾3‚ð=1ê~ ƒF¥2>ü§Æ²Ï:9:÷ˆ¥Ú柴f(gpW!27é—EÀ#Ì"¡à¢‡Ñ«/¿ÛxÞ[úÌ<¨n©:PsØQ3—ŸÈÕXìŸXK*I£ÔÓh›óð€goÔeÁÃT¾—pÁ+œi^êá49<е¯Ý$§~R¼‘S²ð²±S2;ÙwJ´UÎŽ2sEj™ž©:ëÎz!䘫•`.° 4š¡¨-$9ãkYY6Ü®,´KïÄ˜Ž“ i’·Ì#'ÍT2ee_ˆrè™â‡÷DØ¢¨U…bÀ”ð-ÏûX&PÐóc >\ëäW*¿#š¾ £CþzM¬AèOœ"IÉ5£Œ®gm«ÉÚ«m—زuhƒÁ4ÐàE´u¦¼ýÜYÁDþüÙb¡ùžXè^Nh‚\¹æ„Xu6ÖIß¼(F¶‰²@ü÷¨½0¦APµM&/_ÎWkÈ[ 4’^q;ÚM"z‰÷!QB£–ïü4±P^Ë¥lÊ×®ËÏbMHiŒ5Aý–;õ”;lc7žƒ½6ö“ÀbÐÈ«D“Û3›Q *ê¸îüËàbP“ÁŒ~év/Ša„{ã¦ös)oº‡–e#˜y"„§x”`~@àCäAغ0•'`ËÙbþ+Yœë¶ôüîµ&‘kø2™á*úOÎÊJްf*@áYv77 šÇÃÌPó;Þ}V”YÏK³eëÇ´5YYöüÈòî”ø^L7dä²^wlÊÈ5»yœ)‰YWŸ¸¬~–qhsWs¥aÅ>JÚùÄLÒ1ð~Rlnæ€Ö¹ß!ï }š³N4Ê 8tý8_¸°ý9}uüH%UtŸûý!Ý^šktÒ¬ÄA× `š0g:ê©,¨[xhP™,°Uõ—5ž¾èžizM'¤±(!‹FópM牊"cj+%ï‘â4d™ðS}Ó5ê÷9µEÉ“‘3d@`ðr&¥¦?0{\.Ï ¦q牱ošùÜ}EÝËu †òдíxŽT²Ç½\ RÝÄSãtùý[ý­ÌAöBI·ÿèd äŽtpáS²Ólb¼à¾,¡ÿ“c-«ÒžùbÊ¥ûü®-úS‹=0CÞø_›ßýî¯LC€øä?RõýÜþA×xÅÖÒY[ÛA™„ë2™pñȶ-,)H &8¨Â½·²Nòc¢ù“¢ØžvNµ ½¬¶ÿG²ûó¿þWœÔ㥳¢Á ró {ÒòÉBô­,˜³¿êžwg‚1ÄTX[]¾–ñ/Ø®C~JåÙš©¶5 ý9LŠÚ*™‰c×J»½À\s¾³ïÖíqý@Ú‹ÚøQeN œfUæ-°R'j/VâòéëŽV–”f¢– Þ|ðø„hWEÞ¯DIKôÀb¼–öSmæ ,k&pKÇ ^96Ùƒ¶pP÷Împ#áŠ[XUáð;ådd*I%uШ BdVç¬í%qØÜsXh#wVÐ+žÄ¬ìuçv}5¹K눠V§^»Ì“"¢çY]cèD,qOÀ¬E{á;³&Ú ^Y³êˆiS(QBŠI <Æ|( šhT+HY:ŸlŽf´Üj®üWÃ(ó Îi®Dþü¤M®q\ÌÔ}û×uƒ}GTKÉÓœ\¯;ùi¿ë¿¸chEÓ/Š&oט—xžð%lIi0Sä²”ýo[Ø"N8#ÚÚÀkÓ6…£ïΠJÒë=jB^ îòs¯C&¯pL…ïA _ñ Jýn6`OhšVcr·% "L­ß³z‹ïu‹™ ŒÙ-në|0œ8üØ…R”C}ÀF W2fxýÄsT|ûRP)‚a2Ë´û­UM£Œ{Ôª©œ Ò2—6g1_?î–^IhÆq¤7a/<7¥5‰\0b·Æ•ÐM¨s0Ó'§ýÜ€"¦ä¹Ž¯Â<5e[MÚ±ü5~p¯ûaÓÊlZ/›{á³Ø~iš¦§z Óª§Œ C.ü¶~€ ½r¿8ëV9¿uTbIç¬ß _óõYÞ/øÍ?¶%èŽÐïûRoPòKmÀdãMû¥ ¯ “Ö Èã§Fêdš¯0ŸkŸ6¤žaÞÕÞøŒ8‡ƒyjÕñìí°ù#×8¬%Þׇî«Wmaë?A‡SžG-¨°óµ,Ú“{+ŸØz^ؽ a‹hSPA´{½^Ø»­j,ÓeΩ†õÝGÜE° ìAoR—`džFH:*Ì·Î.LoMÙìy+Jßä¢í'³ÀÒK2\FÜ-Š_଼ŠrÄ•êwÓ6Ôø£„Q)YÿúâiR£V2]s½nÛ=ìk["z³´ °A]Y>ù¥‹Š”VÒ»4'ñî³Ñ3þVÈìLŸ0̾ÂÿÑÊ£¤ÐL$òh¦`ÀpO^ýL{À ê·ï‚ƒ»¾ovÞCÑG …Ðñ/ÚbÉ´^º7Ø™ úÕêác]¶ºn­$Oõ(î–lo·x懧·ŒÄÔQí&«¸eŽÚ¤äî#ûf_¯E×xÜÏfí`‰¬Q—j^í)B±×L¸ˆ[ÕfIK÷úV'Ø3yAMX ‹àdk1µÍ´E¯ßfd¶Ø4ˆ%uqéÚ˜ì ô€¡'e7ꆓR‰¢Ÿ¡ÚãWNÈE§(µé­"™ßä^KBäÿ°õmÑ2{Å WDï°Çw¸'Pú1«·€ _8þŒ E Çß»NÖ$†`-H85ÏU$l{ÈÃʵ:¯ª…4 $\ø•Ë#¨YAfv @„5ºuÒ­-Ë{Oü 6#á¼§JGðfÛM\%QYã6•S:MzR0ýßLîÉ¡#ÅÛ9ÇÛÔÆ¸îÏñ}©’ *,ªžãÇaK©‡}6thŒ¦£€òí ðˆäV bs·&Å,“Ö,/@¹2{û߻ìË~´4†D©9ÀJ/÷Ðxl˜uš„Ëóžeëó›„þ µ¡TN‹oG5—ûóK‘õ »ñ%ö’¬À  ˜æ.Uî…¹(Y4ü/÷¥Ød&Pr´Úe"áBô1È©aû¥ljêý4ºRŒÕ^²QÑsDò Ü6ÊuH$Ý#ƒ3•g2ðʹð×…d~4O I•©1ùCT5 jtÛGRF¬¼¸´ÌŸÓWFîšs}îuœq¿ß¬úï-·;É:s*°¤›Eô£‹ Úr_Â3–aÛ¡9×ý ²Ù£÷Aˆ|‘ŠK—^…³òñØZÌ ÂÜ$VÅZ"»×á1 Ͳ[áù³<‡º²uwtuM‘"’$¯D°LòZ?b É§<Ôh,‡Ê1±B&Š0,Xyí.€ñWñ ÅF¼ÿмè)¯®Èt=Ø’v•XŠrŽÂòËžUš·áëï”쟷(/^ !Ã/ïÍóæì¼Æ·NÚŠ—¢eO1´§zæQ\c^¥%ÍH¿¤Äkó³é‹d>YÿZß¼ë&KOú7©ŸÓö¦4úõ%É,Yß ë+Y¦‰¼-sB"#ô:ßòµHèþØhf«èÖH$ b^C>(RP£–`K*/û|í+#«JF2¨_¾¦¢UŒx°DoRY¿Ìbø÷>£šSí!abº‘Éþü#·_ð\æ<“¶~cŽêge³&¹Ÿ&†™•ÖÂ3d¢1–#Æa9â¶.%“B7ÿÅ™Ê7IÂh<”?©þ1}Ú p9æ<Ú°‚"‚Ld‰|fËl:%è¾K%⑸B&,&W_!`އ„¸Cšóo¾ˆpQj1´/‘„œ“‚hØ0€ÐùßPœsÒ²°`ÞG—4ÄãçïFØ÷¨‰½î:Ñ)Ñg"˜Ý·9–°DX02¤¸:jrÛ F%Xíw-ÌÕEDl7XìZw}f¹S#¶â¼ŸLßíRø©|€@y÷2yúûbß>—L%Ó¡ß²Ú+Ž«>½ 7HŒ¬(çhÈW~#ù"qw‡0St¶š?¦’EäG`Öïí¦fc_ø‘àðŦȿì?Ïô£0T÷û{X»j¿\(4}ßûXêÇýPî÷1ÒLæËl%´ìØbu‰¡qãñ?K)†2㤷”¬îBš§Åf$&cÉ« Mâ›Â¹Ç=˜ŒKªó‹áúvfÛÃÒòuÑÀÌ)£xþòí«7ý?¿a{bAƒ =·’88×.—D›&Šø kgY]çý&8 ×ò*g“DÍì(¡PǦU~u¼‰T'p€$ž×çc˜º-µöè¶,²áµg=vÌ:¹F*ç©›¸"ö ø^ù¢ƒ¼¼èw ro'ðžüòWO8çfדŽo](' š\¸#0ºþœ½dïøcþöRå”Y5•_…x#µz#ÕƒI¾á.¤A|zÖ*ú3ÿbV¦ŒbškSø1c©]|ÓŸxñ5rñµçßü‘‡Ê,ßmÝ#W2Lµ“;yåxµu'.ß±Ô&—Yst™!w…]²°l`rXÍ”í†ÚïëŸâVE‹"й!±àBðéTüé`ÜõßÂd<övÛcd~éöÈçmÙç Îçhùý\4ìÕ3@r©·‡nÄx[Hu¹ßå4YS8Gt³^È„T&‹ÒDU”Ɇ`·"ñ{Äš›²n(ãfqºdÙt¾«§†4ƒ3$…s˜K6’㯌XÇóÅæ°æpyÊ ö“um½±íœl”ÕsMô­`T{ùÕço>ÿ*-#ÐøÈð÷l=*°B¯üîF¯Á?ÉÑY.å×2¶½ÓU~$/°prQñ'ƒŸo#&ÉÜ­nè¼,ÒU‚7ªènaL9”Ë{¿k©™:çk­ä÷©<ñ²Ægn‡IÔÉâ%í±¼mâþ«UWçnè$j”J®Ä«*5Ñ_þ*BäoÕ],g‰ãÄ3h‚z^'.«8^Knó±¼×ÀñÂ(KЧVqjd˺sß·[ÉÐÉÃ.…c¦QõËV²W&H©v#3]¯Æ¹^ÁGƒfÑÚètI¼9tºç±õƒÑôhŠ+FSþK$Vâõ;fR*wÛÏ(Ãæ²PžP¿uþAûªq’õ`aÇ4èHå.¦bp³þr}@‘€è…¤*«ãè¶õá¾…V©`€WŸå#Ðøÿž3s×.JODeg/âg ûú“Ž‚8I.*$r’wå4„Xw‚Öi¢U6EÅ{ç̤Ck=¸NÀq7ß#¦ZðƒöUÅeÔÂÀˆ=ð}[Åš¾äËC}*ÑÍ"\ÅDcµ”ÉP %ÅL;wO Ü[¦å䣃´eÑa©kà{$ŒØä= Ž”>\½laªdaXò¸i±¤þO©D+T ÅÜÅ *¯t=Œ9äéCwT.¹ð™u}Z§Á'׿sMÁËIJIœ+×G£JRϾ`ÚHn ÚB†ã9/‰ K*œ9¬±0¢!Ó¸€âµX©:úÑáJN,xi{Ï­Ì™oÜLKdT}|g©Óå‰|\Ò;À÷$'û‘`hª ¥L*æüagôž{^ëÕ³€ÒeLsɸ¯<-üÀ§æÐq{[é%õŠ" vvTya:2 ¤~l¤5#Š’¹å.íPx/¸)צ©¾-{)IíS"nË„«šÅñµõ½!»`‡o@ësE•Ë“Ø4uÜ®£ã†­}*‚½þ‘¶*¥ƒ 5œÞNwN4#1‰-5´öžÁ LîLÖ>EЪ²A6/º¸Ñ˺t; “µf3G»mŠ-á=·%_CŸ `óØ­¹KeÌt'~åë~úMÕÙ@З«Ø•³½“àv¼Ò ×½½±ê8`è[-ÏÊíËZ¤ÁÖ +mŠ9 L^Š”c?¡ ‚ ÑûÿXæÛ–1ÿ½{ïûŠ Ô¦ôXÈ1$—ñÄwÑz%í^Û÷þÖ2®¨Éôk( JÉT!EÃðú|NÅ£­H½Øx­YkHßBº;®‡?Ró$¿±7 ß1 Ôµ0+Ï!µs< rHv:×\4¡Ñk|3ÅmÌ_Ñ7í‹”–YOÑvj÷šV&éü³_ßñáZn„Ðk ñî~Ç =Ô=eÔ+*b1š¸H.vÀÚ8pÀ ™ÁÛ7l"ÖÃÚºâ\Ui`]½¿Ù)`F?Ö‡w¶‚\e‰†ñL:ŠØéÓ  ¦ÒΡQQKç _ kv,Dý²„Ä íð~ï×¢aùTœ¶L¥¶Q Ç,u0@ò`B<6ç/”YDz Ø‹Sô¢<¸ šq“‹ ­¤ù›%eaö ¼] ûå®û`Z; "99ÐbÎÕQ*É.c£à¦gh6` ôŸÅjìÔz0¼O­M›8zØ6,Ã|-Þ¡íY¹ IÕ&ºôÜ~3TþXê½QLT—fœÁâýV’H²-):ƒÒm¬J BžÏœò¦ ÚVqй6ëwG ?O銳…ÂMNQ:g§UfèvS–” *Bªì‹\:ÓŽjIêàMìÔ}Dõ‡ÂdîŸÐ ¬ß14Ñݯ·Ò@ȧI¿Þ4ÄG`CU…¯a‘Æé jÙÿ4^®¶ÀâFè€HS@\âôæ÷“ÝMƒ@Aì–Ò¸4"C«»îU¨óXöHz˜c`Ðí[Þ[SÐk¼]BÚœô­¡w»µ|as|ÔjÙ|дɵä0nfÇ«O|¢H+&€µ:tÍq•&Œ¦^n„tGÑ}B”´G–ôÆò}Ýž¹‚³Q!Mdã;ü• 2+ëÓ:пþCÄ× ‡O+ø5UÖÜ$]í Mcq*pê*ne’WÅÞ㩺âl9´€fƒî‡1ãý_.5cÊ¢ëp(0\j <åTcUÁl­“æi8kB4Á­ºäµ³b¡_·¿åNµ‹u…ëm·‰Ê\­E|H™å¢F`sùaAgfP©’œØß ù^¥1mÏ¥ñ~’§7RÀ„*þºÕìòøb:sS6ŒMBC¿”ÿØ—fŠí?çÓÂ.·<ÅŽ‘¯»?°n32•+œ’Žíú¿ß€]|õZ(ñueBFÏÈEÃeäc%Ÿ“ƒ Q¨°N^w7(]"|ÃuÃ#Á£ª¹\Ÿ3V…Í^¡Ò›s¸~lNnõoÙ‹·Ç5–p…gÁêŒã)¿]J¸%…±U\ßÁ¹è‡Ÿ÷~Í¥îÉ•+ಮ™³;‡·É 8zc ò´»ET¾Ñ×/–ºÔs'î ]h95ªå”gÓ(ÀÔ>㿞ÌG*©ò’ŒòïÏ™}YïÔ|î…fôõùÓ‹§h+¿cж!À´© 4I‚b¤`ìåýþ°½5 ÁÆ¥ë:ž'Ë¡Ç&ÓÚ‹Sz¹U•¼æMB`Ÿ|.Hí,±Øµ#×µd×µwÏïwûî»gÄòªJsW…$‡ÝUl üR#ï#Ük¼Ûä!·òñ7|íP^ÑïJPÊ9f.MØ2r9´œD^òœ¤]e‚ZÅÏÓøÉŽ ¨PõèM_Áõõë¬6`v›€8M+oÀÕ¯ˆ,X5½P¾B*wį5ÅS 8ž`9~× fÚ‚™aKšyƒšHàÖ'u¼Å—p€$‹Ð¤‰9œ5„—Ó<ü© Ëš.x7ÁäÁs#W“`œ`ýõÑ –È¢ZGÿ#dÅqº˜ntÃ޽3ËÏý’‡Å ñ¯ôíQŽ“Ômïû;ˆX.جlŽ¥ì¹Pjų±Ðsñ{o¾ò(ÍyòZ{£ÀÔ® “30ž+±ÀRJtÒˆRX‚õÝ·]}@z{k‰=úê œ÷çšÚËò_j™G"–8mðub ÷dPË.\l’ë˜G½»[3:ˆ×ý{,½"2_b¾lLù2ߓ֞ûÖ¼—ëf nNÇþ™Â_¡™@vŽscõýG©‚æébãHï;Ø)I80ÓÍù› KsJáŽM ª¨ÂÜ]3LLwX€i¡¿Ñ,ocF™}ÍXkÔqÕJx§•ðHŒQGuPhiê;}Ý7b¥q³µg;~\ͯk}‘£¨­hCmRuÖ=3~ªS¼Ú&¼tûq7*Èh˜ý5Ž)ð jq=È[šÝz:™#!ѨýL2õ ø¿Ûup Yq±tÊ“ú/5=­ÿdPŽ£iV Ú—C/5¨ƒèÎgQ}1jîTŒš ½Œ}GÙØ«éÞ³;3?×qǬ.“»y5l³_#®sò":ëÂùTûžf¬—Ô›G£™:¬ãÞa G2au$[­µPôšso‘žKÐ6ì):qRrÝ$”_ÇVؘàÐŒA°®#Ä_ÅÎp”¯ýŒ°w¯µÃ<þ¤ò½¡Þ™‰ÆÊL„Þ”Y#6Ó¾;¡¢îeêi¢+Ês ‘7Œ€‹¥d‡ŠW’ò‘Í(±öùþ¾·“eñ[Û¤<­93ÆWpcÚiv#e=yŠ=R²ln‹`"|4ʙŠÑ]§”àXé¸-œîrò<û¯<ÑQ{þÕ—Ÿ+ËUÉ ý ¥¶z@ö¸—Üx=„ÌR9»™o¾’ê¥äEl×ÝžÒìŸo d¿²Ç{m6ÕrD1†¯_ä)P†U½à›½Û+û$;ÉCt‘ #ª—RܾcLpdLçÜ… “ À.Gqü5­]Ýñ÷„ˆ8gó¾¥vø·ïþôåk“»õã €ìoävâôrˆ [à^ê_ؘÙôQJ¡±tûdâ D ´2ºb€„‰z g°PÍSaÈàôÑ^÷ÚH+<õR¤ÖG fâ8ø² MUš9‘[8bq‚ÿ|Á¤ß¸ð  y™‹(sÇ]¨•þ@0œéw-j_ LJ£­Hmø¹®C,KãÌtZf‰ÄåŒïc Xjãðª@mgÇüF®÷wã?øÃ—J{ϵ»±?Ë;¸ÞÜ Ýû‹Šlz©J`>×j§ª D"Ã⨷ÅáF«ø´¥0ÖŸ°p6jA”zð?V²RdÄŒ—n€J.‘ ãnø™>¼œ ¿Á­ŸGŸÕù­¥løÇ²NÊAÎ?éLÛÛTf*Êé[šAQ ÂRìŠ9Ãóôü#0bËrËÔœ‡å Ê@u¼ìu*QÁð„a¿]ðÓ3aóä<Cž.\|l¢Ê®ÕyaˆZƒÉþ‘7¼žðwÿ#1[<(ÂçÉ @÷¤ó€ü¤»Ã±Ì J¡5n#Ì íø í Ao!îw;ÉË®,D&FJ†)Á©S;o2œW [–’Û=Ó1Òƒ¤$²xZß«˜‡, o‚2Ô ‘ür˜oÏ‘Méè÷Zα+—Ë/¼„K·œqmàÿ¸Gðä´O€O˜ŽGÊ™Å#R»æ¦‡•\Ç4»•ÁC<’ &èµÚe„»S¨ ÊNé-küN•»Bçëm·Z­+_-“='IˆÃæúæÁòië\ 9pD4ážäÈ4]úò‘³Õ2cÿ”‘üýãþЭ.©zoÆ>/3ëæ`õW:°7 ý -±g·ëb£œèx¡­eJ>rЉÂ…íf80ÆGBò™çð‚#ÎMÏÌ4¯àJSdç?DmâÀ*M¤ç´±Ü¤?…ÕÒ|gOÂO¶Ùºàhs (-ù‰8nó˜œ}H[ÍlI‰{–ì­p\¨ä†—ûD3 ¨z¯÷@лÅf¿*:Õ‹¨ìeöšOƒ¢—.¥: øÒJS5…1ºþ½“=ãÞÎÜ„yãCt¿áŸ Ï©8ô¶ÿ^šs´½™½&ieðëCFËà‡\,Q`ô3¤DC$Îû`*Ÿç¬øÔЄ²ÌÈ'ô=û¿)ˆßé’bÏb\õ=ö`ë'Ö°Q˜œ^%t.ºÞ •âHšG´› ®øNnÉ¿[ßï/ Êç®+¡‘Îf~#1¶_Ó{I ÑÞ'…c;9 mæÇNð(=Áüfõ§"ÎE •ánŽ"Ÿ’’¦s\Yz‘‡9U¹ «lv«zlG›˜ú–d*T?Øçð…Ï›F¾ÃþþV·¤»¡òà¼w9vX­ýVo-=’¬³¥9‘0o‹ŸD*; Ëà¥K÷V|«u^‹RÓâLdNÈn ø¥·C¦­í;%ˆªvZ*îoR‹Y…t0f¦GObnMþݱ±Ïë‚“ÏUóÄKÌ%>* €Öo9 >G*M=Ìpîd ?S mrªÛåä´÷\ï'ÉôÉ’»°šÒ³¨…"ñÓˆÏÑ+.«Œ‘Ql´Klâ»}^˜05ÅÀ#^sq3§ªŸg—ÁµH©«’>:$þ¾Ýâk²úp¨yýô÷fÖ •Ð5 ÿá¼)`3åöh·âz»€Q»x~ ë¼=•øð÷·–™²,Ÿpí¢fø—4mÒ6¬l8æ¹IÚ0Âmf0 ÓÎ>e+¥ì݃ý3l¥€à5ÃÙz_6QO¿–8»¶eŒÆ"F O÷ƒù‡é×Ò.KÈ" ¡ú1.Ð[ š%T¨nö'\>ék@ϲ`Ÿöă 7UC<JŒ]ºväw+ëØ´›X“ßÃ,b•\+Ûî¨1Ðtö[²«xÓJƵÌù ”ÙÅW7¸¦¡µûÈÄ¡be#ßò8çkwm×íoPQA[Y«ELækà°«ÖDjûàNb®ˆÙú;´ÚI“uì‡õJ3Œ9Yyzåäò`3qʏ%Ê-Ó‹}uâIøÊ êàä-ßXH„Vù…§6I–¿Þn]#ÅŽ½—( ›÷²cIï¿qk?9П“b¦ÌØ£bæåžmòÙÀƒ#gE3yÞSï»LT¤® ;6âÇ‘‹¬âÄÊzo\eí’µ^.†jWÙ.m(dzÀÇ2H*=}KUA?ªð%p7Ô#|p™$¾\ï\ÖÛØÇ‚×M²éGƒ×³lŠÄÈǃWNGÎÐ&Öÿc!•Š$<Q ©Èa‹\£áOõ ˜ƒ*= 쬘ÒÍz¨=eÌØ6q{IFrŽÎáSíó±ýBÅÛ§Jð$Î{Îq®Æ<\ݸ°vnì¢5²I Ñ zÀã0s­ù; ŒgP2Ô¥Ò*ÆÞÂþ˜h7¯ØÐÄÚ¦¸/šŽ‡íËuÿ;õ×±»f\c7Æ%v†³¯§j“i< Q¶úÍ1dé‚£AÍDô»ƒú¯¸øò‚ lÚòK¶ÅC¶öõù¯5Ld ›šEëL–)¨çHòfEqKP½_"HëâÓÀÑ–ÓwU„}sNŒQpÎ6 ´”¥ž.é÷ÉNj÷Ï`e÷|RNLÚ½cµYüýtL`kAnô[Œÿ OœKÂ2àw*:-°ÿÀ3 Ç¥M[ÿ—ø‰_gF$u-Këà4uö÷ú1xbo|r•½$K’©ªN_KãU(F3éüýä—+ùÙ\€`ǿ܉À _üÞ¢+WŒœŸ2NkbÑ ÑÜ5§ʹÀ\¾Xö.¸ê)V|ÄÊJ’CÔ6]' f€ÒÌ‘O×3&‡mød¥ÜbO¨Â'éBgío”¤M㸬™%´R~I.TùYµÂÒì)®rW”*¼8º~Er³Z6Æ¥dº–Žö5)r¬N6€¯šÜû’Ïh?%—ZQä)s²j¼¶N\[3âÁµ ¶âÎr%Kcý!Çéyæ/Åç mâ$¿Ù4¶;×¥ú Ìà~±ŸÇ…¤}B6¢´ú[HÍÂZnD¨ˆ!¢nŸ+]ÓØÏ%®U¥…†po] •ðBÅ4Ô§ÊüI«r©®Æ“;t«ª7âæ•B›ˆ+ZJp±ïx©NhêªfeªìRÜŸ %~/©×{mTòP‘¢Ög2( ñ‹SNè·ûûgÏÙ “TDêyoÝ„¨·e¢¿D 4ÍWúÆÂ4Èe“-0ø>Ä B <ì‘êÕñQ§­MìGÛ3~l"Š_;“ÖàDasflEÇHöBhc‘CP»o{r2ø6+qö&Æ!…ßÖ'pÛLçúT·aÛºXiŽE"hèC•¥ .5qx~IÎþ–}#›ž§Ê,MvC ]4äŠsRä°†LÝ dbÚ˜0g¸ìÑÃÒ„V‚»Õ8u‹ð»R¾sJ›²ÖB†Ÿ±2-¡&311&™Ðºû&Øš"EåÌ·ö©1M|Ü×{ÕìáDˆ¦Ð2ÃjiÇñ~mô‚"ý Ê´Z‚÷úܼñEÓ”ð,|HêÈñEÅ™rlL.Æ$¦í®¿ ©kÆÞ›NmŠ\¨}ÆŸ¯‡´é¬Ìû½èÏé),[þ(–m*X6NnÞ¨aøn¯ÞÚž·ºÝÈò3¹\ÈnMÞ!7§®J! ÒJP¥Ë/Yc×1 qÐW¬¡-ûþœOÊ@d}bP Y„…“_ÚIàQÄ””Z™FÊ@ãË]Eä'éaOi¸3±]{â׋1Ã*ûäÞÅþ$K=Æ}C;Ú{ß÷~çºßÚ0®†µœ¤Sª°Fí•zDÁ½d$.ˆ ›€+ÇúŸ÷Ä€ÕI×Âf^„§‹8‡ü ¿(kɸ>šdòQTóe®c]‰UfvÌÛ­W>De—Â@³I6ešcg ½£7tÎm#D"Ç^Ó±Wö‡Û-Ð)þìõ;áâ²ïÖB–e}d51 ’&¿ìgJ¿îÍÅù¯Àûu¿o¿•¿…Dü_Y^ÎÏæ“‘«o¿Ó¹¤Ï|RЧn$‰ž&z4o’Ñù'æh&òLJÔQÎw{g¿¹"\Oؘž\+s øò€ 쪳ÊPk× •êѳr¦gEãñ|²½vÆV.¶hÉùÂnx›ƒ5êýè~ñÈG%> ŒËŒí^¸›—Û;ÕT¬EXp¤x©k_:àðš´bóÞÈÊ÷M,–ËJ‘É‘~‹õûׄ¿Ž×#¯©z<Ñ,v[˜op¨E’aŸP—«N2óœl¹LÓÛH $ÉÍ1³¢p¿¾T½6ÖRrÇ\‡Ó’ñàL²9Xá¾?¶U&Î3%”Å_€«`l1aÌĘ™aQ\Ø·´øê Uæ0¯VÈ–¦Æ<È)”ÎÌ\’\õRne¨¦9+T,Srˆzkuôªd—€–$~|à6ðñwôc™j~cpæ_u"9QçðÑ0?Ǽ)Ìá­¾D ËÄ@š›!>+fÕ‰?nª4':ú>U2С›z¡xNCNé•¢Réõ ¾‡K?¨«g“ÒvåÄÈ"íóäŸKdM‰Ì¤Ãì¤6Aji“Phf³™‚VFÜBŒ¢7N´ôƒDL%“ÎuäãU²·t »øPÅ·>qzðoË?òΑ"%˜£1±%aNÒl¼`õC³Èwc¥°×j¯=çÊÒ¥}ƒr“¹ i<ÎbÇÉA,ôõlÆDE3¤^Âîß¶ZsnÆÁ…X€7…ÅbeÅÈÞ~õ‡|Ü-yvŒéŽÔÊà’,úU£WA¬,ÝAsÅ ói´Ø{³šIî4‰¥’ êßö·ÅüìÃ6Ü&9+QmœJv–(`Q¾hvª·À92"TD,…¸NÈ–uÑÙJ1{PEúá$w$yùGîuEVŠž «ŠËSpÏíæøì„<0Uä9gns/–Vªß‹gÈ—eIŽï‚kvtd~ú9Ø_$E·½ÇOq»Œ´/Öì4e9 §^ûo”&ÞÛPõm?Ýß®·ýýÌr£CM*;…péþñlÖ{p'ƒx~Ò´yîG§mŠ%”i›Íæ¨T¼{0†wÅoÓžgwgqÔ+} ærx]—ŠRà,ºjö÷vý•Ùiâ1›ŒÄuöÿ‚ô‹ŸQÜ9QiwdÓÑ9Ç%˜/Ì]A'’Û¿•ý\È3ìÆŸìÆŸå¹mÊôQgy åã[5äå42óç“Ñd°W†cÓ˜° ÃûòÊœ‘N3vÔ¿VC"¿ Vuɧ@ô ¨çϽpÀ5„XE}.w®-²Uä‹—• >Ö9[mª’’t‡½k@¢FÒ6óô[Έ7qÅY5Wq)—¶‰³QÖ‹»Ä[îÏl”‰km$%B„õóçC˜}C>ŸcG–×ÑHÀ„÷å½úP[‰Šã{AýäŒ}$â´ 3ýö.e‹ÅòÙúü&¨mŸúˆä¢ÌŒ#{{ß{’ùȧµ‰zW3èq²Žó ÔÕûÆqŸ×÷ÌÎ#H ¶„ägœ³Ì§º{·Rü‘ؾÞk¥F*î.aî ØôEO^ù 1Q›у3°^kèÉ´¨Þ Në;î r俈3– ïLµ\¨#Ðr¦G€ªPXv¿Óô€YͼKx¦-½³×°´ 2ØÌV®Œª|±cI mø¨Ê1"l2àóJÙ ¸þ™?àukÑql|ËAÍÀ¸•ÎNth|C½€í8ZQáã]ðˆ9hc¶QgÅnF¤LxØ¢iG×·Ú‹¾U Vïã­ix¬Îá%ÌÔñ;Æ:Pí8æ½Øg`‹¯BG‘[›(­>•i©RŠë—™ëŒñµÔ¹; ÜÄw™FsÈrŸ6ˆþ¾·>»ÇW£õš%o+WP"èi6Õr! øË™4(³œÃX¾]ÝõÎÕ·DRÅ Íñ(ŸË¿7òËÞ9¹ÝÈ?g½k¦ÿ¼^¤_e=@÷oúM ,%ˆùǰ¨_žµtFéÒã¢~ù£Â(z„ò JÞmG'g\жNBrÀƒVË ľië€Û*½!0ºë„uR™‘kFF5ö]híp–G[!ÌÖ”±ÝÖ¨‹%ísàðÀ`² N˜F–á1*LÐôGâ?ø>Dh•‚ÈC`ú NÎÎ [–&¡‘†J\ÒÐ0èn;¢J¯”‹¬¯çüy6 [ aI!–•Œ³kü3vßiBŠ[_©Ì$#žÞõÈ4'EçuˆÙh‚ö”XÅ¥©Ò‰h„£P®#‰A/<„’~qOó«˜qá¸KÉÙt"YѤ3® ]è?¸S­ÛhIë±ñ03wHØ~½§ ¿ð‰Ç fæð÷†ÆäªÉ‡Åm ³i%ÏY›n%ۼʑmYY¹:qeIh2giOIˆ„Ùd\õ”ü"í)AºîoϨé)d3$ªÿã“+oíÐØw}þÙUjÑ'•€0~Ü h_`³ˆç#Sû;£ØßÔ¿"HËW‰©äo@?ǾaÏïìãññ!ç6£®xˆ€ É ôì $MÞÍù/›Qè7Éj?ôšPgøÊx&3CЩ@z@ LGÆŽsBïn×[úúýù“O»ï:4ó ÷ámÔí{;IM«‹%þÏeò_OÈÇœ½ÏŒ_ÿrqòð]ûžùxÁÉ=?duÓ©ª¥©Pp¢ïXûÞ%Ïðð%ÁØ,`“\©JNqD_'÷”*|Æl%b†X¦f$hB«ÛÃAÜ8b4k³º'+Žˆ?v61/°‡â”ï«ÃÞb±¤—„©yŸ×ÆÀ¿~òt+¿ µ]™Gí5j¡Š‰6zõ?Õ~Ê>)eâþÁú*þŒÄÎÿ“®¹Â)kªCNjÏär`Ð;nürgü+‰x(¬½')˜~¯$4k«„lRùôVehNO‰è-6Ä®BPÅ…úTzÈ:fDŠv’Ã¥Ì!¼ñ¸É e!Ù˜‡²D®äèÄ—èµû؉/'ÈÄ_jN|ï)–§N|Éš´ÿÂ?ù?qâ¥Qû'žxéÖæ/ýØG~'ù²þý sÜã¨` ~©à}*ÛÝM/=u{ä öë07•³’Ä(ŽûsDßÞw’![ 3 Í•nŽÇý˜*¨±ÂËhèÿ5↹øÅ”ºÁ /G¥00ô£}Î3•µ¥tZTPu»õ¸3ˆ ¥ÜßáÃ`»¼?mÿxì…¯Ú½0*NRãH ¼OyˆÞ£‡ã+Ÿw.t†ëýWüµþß|þgïM0íüÞLJoœñý¥ink§é… )+½`šxÁÀ‹nÅUZ þo£ÇÂP&œ™ %*6Â>ÑiµY>hÒ&Åe_G؞˧v¢JÒmVý˜‡ÜÞ¸9îÂÞ~Ašžx’É<Ño>…+— ˆ1iM“¦k«MLYÔ…ý\éŸúмòlR˜d'õüßXÉ+©¾Ýм)þŠmÕ±}ÇF´©‡AZ`Û‰§t©ŒzäÏÁ'Y/–¹âilýA)–Z#/ò`pÇzr$ ?qò²¬2Ý‹Ks£w”˜E様HX3¦]ƒŠHÓŠÙ×išžzp”/újìÝ1½Ìe¢Ký×\êuBл¿7ÐÂBv4ñ3Ô ¡ÌÓŸ cN«ÂÒ¸Ù;GÁ”Š„IÁ×ñ®ÐdÅŒ€ÙÓK l±æAÐÜ7*ÓT`Ű#åh†ºvVÏœ,Òž=äS¬×¤´Ðó¢Bda‘…$ìá4 {dÁn΋¹Í3peàþ¥p1ú,R*¡Z·¹|È)ã¤Za¨x`YvèùŠv ¯0l Ï¥€{W; qu§åÜC[-"ÔFXÈQOh¬µe¯@9éPväE¸q‹±p† JíUw­D¯¯)¾²~™KXï*é–ÈŒÎãJÅÞ3°ÿiáil6Õ²Û;á„Ò#ÉΦ¯¼€«nå| !+H!ËÙ›F#i爄ò@ø&{ø†«\ïƒq€øSM{„0QãÚ)ÔŸ%üôDÏ›OÏFH9-¥Z(•²s@¸Z;•ÚÁü”â ѺêݳyŽ‹~›ñ-Š=³á¢Â.xw©33ÍÕÃúúAšŽÇR“yO‚¤MñUCä•ù¬`NPŒ‰äÞ·µ7¸)µC!°~ˆY#ÈáEoÐál~#4U Dq˧hoLžÂ:Q|®Ú³ºâˆÃá†X(Æ iºc¦š+é¤{À™­QæÜØÅ<4÷s#W_Å-#LûÎ_¾}õ¦Ð¼ct¶¤ÄÊ‘7ö…¤=,bª¬í>Ä{RÅ_óR)·æ5wNº¸¯‰]H”¡nn݃¥/s BâÔ5骜!•l“ŒíBg…ýl¹¾_U)ƒVã ù°`IW(ù‚ëî¶;8]"O"ÇôƒdÜ郈8ùfÇ;GÉ%ÜÿtW+ºZ¦™]­lrb«~¢%ï$…ÕÁÊǺ½„Ó…Š `ŽH äØÂiÕ ‹õ N:(Šõ÷voÿˆ8ôpw؉0èxÄÈU–ë"Öç¿ìòkr2úSòÙäìÄhø³->£\&,‡Ê*/4>äܦ…\ó'M¬Ï0Jd¦1D¥jWd¸â•S³ð†¬M7ó† uŒZp×!*[©Ô_–¾:ÇñS,9r0´ƒ£X0ƒË`³'è^ÁW+êÓ ¤Ýþ£j°óYylBÑ]½Û~ß?çɯ~ý„æ,vüøùûߟð÷Êiºg¿ôÙkÞ°YQöÿJ_þå¯äËãéL¾,²ßý´üï ^ÍÅ¡Fï6üR3†ýkÓNí”1Ü«ì°m·mЀ t²v•T¡Fê eÙÐoš ÔËÈôGP(•uÎæ©)E×ëñ$š¶F¥^¹yfÞ.+&¨¬w±÷2Á¹3 k„êܯù4®¹ Ç·@ ­ØqÛCL`Lëw‚K¯”W$túèìU3’éU 8ØÞnþ,Ê#”)`¬oÎÇ…¨C…"ŸMc&¨-ïCÂáŒ^¤ ag|½7ù„SÞõuê]#xÒ³®Í 79¢Y·£‚Ýä´vBÀ[Œaƒ^)ßÔ)7[È-a=8÷¯……Ê<"AB ‘˜TÜÏ´é†Tµ”™ëw+¦£‰S!Eô˜çü¬×©ã®Âcç“âB…þ‚+"ùîB®·Ò›ÂOKCÇ»Çlb&߬ÍEòA·Oõ€)o{d§Nµ‹AXDñ\Êù÷YÌ©¡Ó[{ì ”ÓÖ>CåydÌòC޲w¨óI6xLsŠ4+h9ûèo0¤uT¨&ÚŠÓ.”æ2à&ÒŠDnãdáë”î‡[fIJ)ˆ–Ru*v¢2Úh{›p˜ShûBz ÑùâÀUEJoÊ`“s2ŠCÉ]µf’‰á’EæÔ6sëŠrÝÑ$,$åÝK»Žòîï¤×ô‘QðöÂN6(ýTÿ×l„!™xŽgW1ÂhqFê&Õ7ÿ*ïp,›Ü'½7”˛ֻ›­úëJÖÁ¢æLν;‡ìyäxBοv\Àx‡Iœi?&B³å¿ M4åJždð1'¶/— Ôk8žç\S·;ápØ–’Lw-Ì“–ðÎE ž ¼â(@‹7íU¢xÆ“¡ƒœ §rÅ×MB9^aãdM³µýqä=Y4‰}ù`3ùÎ,H‰øÍÌPÄq+B»PˆÀÞÍPHŠ{}ˆc òdæJüôNtOȧŽåàðóû…î19bæÓIäˆW'Ôˆ>NȇŽ@ù”н«NOÎ˃ÐSÄP›_!Ê…XF“>¾² Dd©ÝN%÷X“‚ƒ¨É‘ÞFº åf%B`\{I¨‘þºkßÝ _Þˆ镤|òµ}4´Gk÷0唵,€îY&ü¼%^ä÷¼]Yêh²§ÃÀP(¯¥Ü-Î&“à¾M¹ÑªÛ®7,õ¹ò2›Z›Èr½Ý‹@0SÔpûráÂoQÌõ™/%ñÃ¥}wæaM…«3½’%D>"‰¹qèîÖUÚú# Ê^o½=΋׮ Y™yD„Úåsð}iö9Ü/«jjë¹~ëT-yv– ‹—#ão›*—ðеzűY Æ0£)’Ú¸t÷\;b‡;0yNÿ/™½û” …†žƒ·MâÛ˜ÃĤùɯ´r)(¡’T­-YûÈ„8 S=–d šÈƒ‹XRá*®·bV}CJ£ßåC=Š¥I2ð¦XYË Á]¶Y‡JÜkG›éÐSHËù,u46Î'j2T!)阜ÇmÌ%ã¦sê},C2Lˉk°¬ú‚sÄwŸìš:œØygÅ„û7¥ä!•1èßäÉ¡%‡NDv>T ðï‘•–Nd€ÊhÔý5³Ú[i,× 2Li‘Iδ2öcº6|”9¹üzˆ”É[A‘ƒÏ `„ŽV^Wçÿ©>õnƒ¾QàhŠùÜãQ€µÛPNq i:fLf^«Ú)=°ÉÕ–Ç„^#æã‘^T|äÌ:¾yKŒ†¿øªZÝ/«áøé,ßX64'ÒŸk@ó–Üa "a¬Œüâ~¨ÅÙ.v·k†Øƒ:ñ;þ!VN̘5¾År¨ vÑíú;öÁ•À TÎ;Âè„¥Ùã˜yÑØmšçë@ÇÍjÓ ¨Û›JJ>O¸­Œ ri](¸ò±ïvòK‚ì[ç³Ð†k]3ö9¸eêþàÜÉ”‘s Dª¦.¨­“Ãê¿ÄH!\äV³éMÅ5,Dàbgfötåèÿ¥k:ñZ«îA04† ù™ªúE3çŒÌ= àHÓ_Ócl< ~ÅYìʵ¬-ôâ¶Âew g6‚TD ÇÅ}€p¢±+ÛЦ…ʪ­•Jßî@×xXœXó›·Iž"‡ÖâØ'ý‰•Iaà©!Í„†Á85>ÁÊ¢BƒLËìl\ú³8—™ý(_€Û¥ýÖÅî0G#16Úþ$„š[ž˜Tª>¯«ï•€Í½ßSÖ§ž#F ÃOP¤!K& ûE“7S’ÚË(2$A™îcã»§—{±·ãGtTÕݹô0a›?Hé½b‰gÛõ‡Ë0ÕFIT~ZCÑ™^û…¹rBM}ùCÕž"3‘(½®R9gÀÑÁ_ñ¶FªgÊŘÑJåxãDÓò~wu”`ûž9#á2thc”öùÔô$^V—®F ¨Ž§­­8ŽeI¶…2©ØN\Sòâ"v2y'@!0î§{§ca)q‘ø³”‹Ëúú ®P4ýDį´½leQ^àbQ2 |^ŽsƒŒÅÁö8í¼T³Ž#²l–'ÓîýËÕJJ›è†ú=›8¢7J£™2(¶–§œQÂÕ}\ÇŽ<|A·D1Rne¨ÎJ4µ ³W>uÌ^Ì Eì~|7ýË€ë ¨/íÖ«OnQ>Bª%É-[ ‚»`ˆò.1\Ò–ÏXW9áfÏ « »F×#rj:“±ÿ"hÏ›hciÉo±NpsÌdEìleÌLYÔ·„¿ô ¦z)«Ÿcº·ûý=3½@뢵˜‹WÜ©¯·k·?¡C?ˆHqd£ 耲¹*ð ±þƒÚx´ÁÅÄ¿ã¡Ôç·p^LFÎÚÆw;îžc— pØuQ >ÏÁÓÕ&eÇ´š-ÏÇê8i´`„e…3ÔGs}ñ»”üVX… }î@ñS!Òá4З÷;îðúªâtõN‚æ÷Ïúþ[’ú§°àÓ™9/ÙqعïÁEwįøî•‰ƒr%Œ«-Gò‰oOæôžeb`c¹»«Ÿ çåÒª56ä³Èn.fvt¼¤KkŽ4IÆ#ü 0›ÞàŽ^ÿ†qéD}I­pý«¯ vzõlJn˜›žåƒÉIUDÂþƒ5^=˜’·rÂùÃÅþaƒ)Øm7DÖ# my3E»¢À © ÷Ó‘@Ð(]¸¹N}ëˆùÝA¥Ü´¢–KÆiD¥Á¢_b+ËÕ´†Í³«íDZêÒÃ?ôŽÆ­)@ ~ÔÞK,ý×Ür*å‚RDáÑásçWÊ~y/¤Ý)“¡b?+œÓ:'ï¹ã:²´šc`úÇÏ5ôTºÀ±Ù~ÅJD饉”ÔnÛ¢³UYE˜qgwïHusÙÔyÝqä&Ë(á$’ ,Aúƒ¶—©6DpUô–•5¨G¹·ºµ$Ò‘ˆèeÿ·¯^‰¡z/á z!;ª£Ij…?ÆŸÒ™ª‘µi‚dÿ»M«%@Q~*Ƴ øÍ6ƒÕº`tG‘\qBIñwIJ)@îš³hkD…i nÃ9ž ¢L§%ßtÖàÍ[,¢ë¤‚ÓYsf:#¤3ЦSÃáQ¤K ý_®·Ki9^ïbpå£âÄ£³#¡ZÝ),³ñZYÂkÙCúœ1Ã%µiµãô´o¥Y ¾ž²‚!<3 ½˜ê Ì3î¿Jéyb›Þ`˜’­|sp,VøFÞáÚŽåhêÚ0Ö;»ˆ®Ð×MGhÚ’®ûî¨bv´ÔõÑÆ KÛ-g“TŸd9·F±„kkÄ_É í•µPÄóLÏÚ²³:öi.%Æ™‚«žËc\¤Èã¥óÍŠýÖíxP‹Þ´>üa¥D‡û[qeÁDö"£“5QØz §ΕÒ;3¾d²A»Í÷8ÓЗ2ÚUuXtk¼‹uâ'–cCù!%>Ô¤±ØŸ’Z3ŽÊ ±’ùhý:T|§}ƒ¡ê_º W~‡Ýýšò ýs¾ªäöU½«’)÷¤n¬\Œ‚Œ Žgc¯Aw>æÔ}îXBN.q« oÝ +?t.¡°„®Dq÷óÔU†w EôÿôØ*iª3U^0–4#"i)«Cc;Ð’m‡´±r¸´ú4!Ô€!;9‡k" VÂá`UÆ#è%†V® ñª)"3Zž^[Þe\“ge]Ò»¤Ò ž§ êý³ßÞÓ7˜ÜÉ«XÍi1®‹|°Šœwí²¢enѺ>ñ2Æ£®ùÙ¸_¹þÏò_ÿ™{2!_ëÊæ9‡ÖŸJñÃ)tãHNô¾k5,<.͵Iã2ñm>~5¿Ë~iРKþ¢ëï™úãøj0¨îc=>{ßäÃ53$%'ãaïÂÑ<0Ô×Kª!¥ðûS÷ÁZïû›ß:Å(M°G¼×=Š_23G2S¢Ëú{ÐH÷qÛOP¢12œ‹þ»h=Ž-æý”ŒJ?+ ™ý”œ¥S 9¤ÃAF?'Ý1¦DõÂöŽ~2…QRPXYãWÜgó2Ó½ÑýÓ]£ºúY’Sè4/GƒSPþ÷W¿ÒWmÝ«V¿j¯éß²‰' Ëa*ñšËG^óÇÞ2dŤˆoi RšÅ¬T®¾î2}×UÊŸÁ¬,'I&ªÁ²¶ü®òsîMƒ¼ªä›¥!{ÃãR»y++=ÙV±ÚS¬ôp<“­¶BzøiÃu0SÈÑ ƒÊüÑäbLÜž™Ìr“ÎräÖ|€£ÈËÑàÜÌLÌö¨€>Âpy$$÷¸@Càr÷qŸs¨; L¥ß ð9ל džJ4˜y–¥€Ì<¼ˆ`⸠T®·§{î܆”ìÕ#0ª ­ %޳ýøèmò<'Ü(åL7>s•’ÙÂÛí€O¢åüLOvT;6KT¬.¥ÌR Vòp#íÞ ~óöþŽW^‚ÃÌŠÛ0§¯|[ñŠš!×¶I#ŠîôãÕ`½74¯bèeþ_šY§û60!tìÝø§AZ*×4Ö¦½ç+ÇÎÐâ>>cO"sÖeU}¸oâ†x“Ècš·Él Ž(= ˜»­aâ¥O_ÿæëß1X(œLk`ÝÁ'G(°¦g~æºåPf]S'—„¡6B²\/–”íè ˜Ø©47°¦JV€"¾8^õùŒ®ÚOí1ý(ÌùeÓQdà’±h õ5ZóÚÜOa @û\º'd+ ¢’Rñè·jïGJÃ*(ÝK3ÀÊFêy% c—t sr=lr í)æ ¼ °Žy-$¿ÝªDãc¢¨¤™§@`Qÿô§·‘ŸèV{‘˜¬¸Ü¶é&*•b\c†Ž *¥T8oqJ‰Ü»äW¸_‹ ܈7‘‡Û2FåeóÊB%¬fΊÑ‚ZäÕ2ŠäŠzSÂ-bûhN< •\ñkM Ez¾½ ¨Kž×ÐAÜK¨†rj @ ÊêÃ>±è$î¸ݤ\Àá±ÌÀ”c +ÜFû~—/+{?pDºä\=xQ2™j¼f†°6ŠÝÖÕNB¤S¤’‹UþŒk>WŸ<3)öáÒ’ŒŽŠ-LäLƒF)ZkÊr0WÂ%ÿG±Ç|ç¬ÜœÐò¹y8ãRòô‡ïº7*—½é¯»~õ„7Aÿ_4‰?<Üÿ¼]™O$æt÷*ñY‰¿cmûa÷›¤ýNleAÃ3Å|]‘îpí ¥dK[ c)P\€Á§¶³ÝmèÁ+3>LWÄšª¼Ñkm$²ñòfʽfxrG6DòNl¤ðÓ“B%§Y´1idÊÍÆµŠñ-ÙŽ¡£(¯Ub½M3¦;ÉäT ÌØsÚ¾°œ–ãð ¨ ‰æCtÀ[ÍîÌ4G_ÐdßÊp…z©ÚÐ]içi¢Jß•#Ñ-ˆÀx6V,;†¶÷clDJÖÿÔ©½bÍÂÊüìÜoµGšƒœbï….ž;LØpÉäç0Ss´,.L’Q<§²€z Ôò~ÇÝø’‰c7>Ò/åP,¬Ë3G›ë'¢¨ÁøU[[LÍçûÇ LÛò5í1¯’¯*?8·–c| ûz*³ˆ¡•S¾Ó˜„4=œJ™Ë‡»¦…äË‘ôÃuÀR«ˆ†èÖTýÕ ŠöW’iæûÔYyù›T¥9‘¦œI§ñè1$mKK*%Ï A©Å­ç¬R«ü_-Û~.­E…ÿ’]K1ß³‘È`s*Z­^yMÛÅÒ¤‘`R("ÊmÜd#-¿}"Ó/¥:ÖGÔ†•˜òGkÓòÛdfY$í[7³Ú­Œ ñîQKgΩuÙ"™å¹(3 ·òZÛtåp‘c­•å-ƒå¿äÒ¥' g|h&ó‘ü/eÓbÍFr.>Ýr¶åLæï©4¡zRå39Ao•d>Ô@wç®~T\2Õ^Á‰‘#šÑÁœÍA=/—ÈÊy°äì]£AÃSÅUCª¸½TP´x 8íf£ñH½¬kÅ œu÷ÆO%Psm˜áixŘE#²vä,ï¡Üê±ßá·³ ‘Þ¥sî%Yoþ{ç#.–Bîöô"]"NP«°ÐÖ¹Ëý}I»•¹•ö@³­€¤GLˆ‹ý¼,ŸÊ~Ù÷–lÉ€TÖ¥$•Ê2O¶ÖA 'qÆ™n-bÌZÅ}á0Ö´œk“%$uG»¿·;Q²^ðܽæQIÀzÚZ_PÛj¿ÔýVã”Í$3UM\:"¤©pÒÇWáôóùð¶)Ûà+)‘wk\¼ïV•dì¦SÐ÷1!X¸ƒ‚´Jh’®ùšÛïÒöQ;œ_SŽßZš«€[ee×t7t½™æ‘1mºé0 ³ÙÈŽ•6“ `€~!![¤ê ÆAÝJp:êVG]kûÑ Ž¤±=¤ÈQ!ãœY" Ûo8~% aÍ3ÅCy­k}­Jº™’ >ÄÆ1‰kBjâ6"»ºê¸ã3öNAžO³#Ï:J¾ZH›;×Nd5(ÝŠH9•e™V«Í=ËÇãB‘¿ÜSÃ7ÂW{ÏÅòË]ïŸYYŸ¸G¦Òždš%˜Uw¼¤ª+žb%i§ÉÔ¶ñÉË$7ÑX1 ¦ÐfŰ@ò-ãKð@àלì0„w‹È•ц!_áÞw_9ßJçÒ ]ŽLR}^LJßI,8—ê}Øb4žææ}௿aËÚéŽø3Ιrz»V1MËi Î¿§¸È¡¸(ÀÖ&éÑ#ŒTCgx%Uí+‘†¦sS%H~Y H…Ñý[s¿,"0Ó@ ïcÿòÄ2}øoœç'©Ç‚ȩ́gUž|Ò›¯ªY¬Ÿh+¯êH_»ŒÛÊ´‚ŽœÒ˜2Jêlèªã‡!Qê|;DÛgª®Wõ$ŸŒÅ: ¨Ë82÷n¥=‡î–±nB¥ìí=)¸ é/÷[¸¬Ç‡îjù»æœ©¦•ìñù3ê.`32I(Þ0ÍOþô‰k’_H‚ª@æåÄëã â HåÉû÷O~ù«þ'¢Ô«ø²Èëíx½xB0„–¯Â) U¥$¥ {ã¤O§Eb°N©Q¾ ¿¿n#û.·ì8d¯¡/ìI¬¯Å ÇˆÉ )p3&Ó}3ï5NA¥ âj¿\0ƒX×å_øÕ¬³#9ƒÙ Ö ÃÀù§ sÑÁÄz¤Ch5ÒøÙ“ŸY`Á÷Yß:bQÜ ö.ðµ>æIÿœ' úî͆oóW±Ìhe2.£Os£^7oè€Xʦê¦ù™üÿ'JáÎ.r ½aîÎ.3Ns Øõ©+Bƒ:óŸ…ˆ<59ÝœLNã׋ü4ô±½“døüÝÿ÷õço-M,ûù»·ú³m<ý?|õõg¯ßÆ"‡Å•ý?½}÷òÝkùÚsŽ˹Üzñ‡²,£\Ô¨Œp³†ÉDØ8{–ÀÔÆÓïÝ­ï÷¬“r%I¤éÄ~m¨C}¬K÷Ñ&ÝÞ!æÌ‹Ö"íÕµœðcÏW«Ös!!ªf_â„aFb~…<¦ªßñÇÌ#ê#"˜Ø§ån)ÂŽ¯ÆT‚ý’ûÈØ%x‹Sï3~Ó)±Ü7p!EÎôñÇxèÏÉ¿93ÎŽ‘3ßõöŒ|ù$ÕjŠÇj5utÛ‡¥Æ;X·R#¯wÚcë oLGñtFÀ S’ï°ÂÀ°¼ØJ4,A×dÜÞ\.Zæwn›Ü‹ƒþ&ïä1n„w¬O§QSPüÔr.±R²æ¶J¡.$¹²•vJtj…¤A5²mo~Aa ¢‘LøNpŒ>ÖÝoü³ÐÀ €³éÌämÇBò³®žj¥Gòh$ŠHL»KvÕ-Ë{íŒëUoõbH<±Ü¾:äZ‹šx*dsИfÀêÉ\¢ãŠyG %º’&ýaù®ý‚¤5ÅQˆ`Öº6ôœ.zҜ¯cÞ‡ »Þn¯ÜÍe…­AŸ‚MÃÌ=#™ăYÉê=‰ vC$Y¾>1Š•úE½0˜ñ°§ïø`uµR~K(J2WWNÁKÏôÃb¹”G6ŽÙºû¡Z]òW/kXÎt(úøË]u¨LIJ݈ÿïYàVÅK<×6¡â±×VÖL-1rì¸Äkë(ÝGØÖ©ABqiž0˜áZ–V}`Ô›¦ƒ!Fº¨š 5DN'!;w£tKFªj 5(v)î*Uòªÿ¹b—'ÊS͉ÚT}\›’¶±&™P¤Ê¥ ç:~¤Nb.'Fšùü(ÒllWºL´ŸÏ—v÷Ö*†Ùm]-ŠëNÉ¡ÄH–G•(iw3êZäYQŒç”ë¹æÀØðpÜíØõ´àêá³-™¢0CÔ•±Þ)Œ*ÐV6,œ²›î„™e}ü¦`— :€édŲf½ý@”zJ,! ˆp6.´¥ öT’z]„ãs¢a`útWïµ¸à–¯ôËÇÝjÓ™ÆEŒ["3Iâ ^Wû¯ëD¶Qå+‘ñC çÉ[   ]•L(LóÁ¢k¸Ì;&ýs†ð:A¾Žûë¿»>eL¿§¦ÄÑ ”e~ 3À´™~F?w¹ú¥3ÒG0Î-´7¾{[<Ü*H~àú(?²˜c΀þ_ú_b¤ ¥nrƒH´V*nüj¤5è#ÚŸºVÖç‰áNy­õ¶\ëÛ%AfU51­Ýïú|ÿ¡7š‡{ŠÞVâ¸È%7‹%ÊÊܘ÷¶Bâ•‘ë³>Ρ ûùÙxèÏé©Â~þXaYg½­ ?g?Y—YÇnnDׯ.?‹‚oüU™ÍÁç4.|œ½=/ŸÍè{æH2©“{LEYÛcÀpBU‹ ]…#\°Ybé3UÂæ¢é+w]  ]hL“‹EÐc肵ü^º]´kH»NIÕø©(O%¢S^Òž3úü›èÎGÂJƒ Ùѳ¨•æ¸X†Ú5æ4ñyœ’s}þ«êNØÀiõqÃJÑ,Ý0$crkÝU¯@Ô);nDÙª›µÅ‘•ón¾†Å®r»ýéO.æÍ~6›I“¤U„nžÙæûh–ü.♡ÉS6Ì=$*¤ pÀv"gZKž¡S"‹ŽÓ‘È^-DoÃP:Šs _E<›×ÉcBsñ ¹ ƒy9~ˆä2ÈdL¦òý(°eX›ü~cDM€ù‰1—ð+g»¿œ—$;¨¼ÈoÇÓЖQÔ¢{›1ð•m1a)‰üÐŒK¯>[;‰©l ¡ÍàOÞDÖ>HìFF£3É X>°=çþ¨&¬$‡‹Ú®À/MæV2=à¸eÍ4jŒ>Üï6{áE`Jð@l Ëí½ì¯=+]nëKNT,zÅ‚.›ÞÈfc(ðwŦ&çaZóqÚþXÄöGÉ{3r„’c…xÁ¡J*òûôü×6¹üZ8„N"O·R)Á|ÓtrZQÄfD@}ž•¦™‘Òñ%ú ŸpK†´<5â,Re ÝhJƒú!—ã¨ï¹EF-ÇÕ=—u¶`ÇÀü ?¯TÚúµP ®<qŽõ±ÑCb(™Ê¿êPz˸è8e¿Þ°CF¿^ CÝ\º’­¶ÉO瀿٘û’©„Ú´9ŸêB²åmMlj²¯=ZNMf2”’]{kÐÖŠRKÚúÓËW¯^ùβø_ñóq£ú½ œtí±ÒàHz·½”þeGy±¬£Dt¨ñ›¿ùâ«w±aæŸÿÍì‘ߤå¹ßUö›3U.Iº'±bŸI{sþR{Ø?fÎ(æáˆr2‰e މo¬!¾‰ ñDE൓.î1IÒ ,·Í¦û+£ˆœ4V¸ vݳ-ÙüåÖ`i„åälò’K­·¬†¨õsK8Eê†ë$WÑzKØTŒ×…®3¥‰®á‹HýéM”ùYPƊΉx§úh×Ò†ïø> ¾=£'–åŽ2¬ÂEÒ‡§½Qƌݿ‹ªÌ ®qI¿-ʾþFÌTü:ˆ ?ÖÝ2Ó‹&/ˆ÷GWieeóm}rRÅÔQ ®>çmd Gâ]D#̘ڌã¼b¤?ý cvGJ‘‹ÆCm–hNtJ8Ê®˜¾kjáž-γ¦È“Kß*#Gy(‰¥èÒ°^ \g|B»5®´Bšô(›;y‚Z\^Gµu¤ßCŠb8‰æ*½pÍ=c³LÈܽŒy /ì3¸ÐÝÁØÐdcFŠÁG˜‚¹E×Hu:`ª^9l–f µÝ&hµ¦/à(¹eḭ̀‹ˆ6>JQáÒ m«¶È`÷‘}OÙŽŒ)ßútds”l-i­ëÓù•¯&*P•2sˆ Å1“„ô‡„ß6ÎV–ùtê8T¦Ža]ZS…éN½¬ÖÝmÑÖmS Ãc&e‡ B<ÓÂX\«”|Y f°È÷Ïwýõ¦½/Þ©ÖÕqžA0t©è¤td§Ö©;w2wNyõppž ® Å.brÄUÒý*ÑÓò¢§…=šWÇOÂùúW¸Á8³AÍ6¨Ö[Ã;mNu“ݺDçz1„)$ÜÚ¨m…¢·Ì¼­S0[§‹´FŠË«$‰VÇqN‘wó¶©à3w[ ¤¢«H<—³éD×°˜JÔ£ËØª­IÑZì¥ËX'ª# ²ÊÄE]Ú5Î-S˜€¤J'K©&YïäyÚŽ¾Þo­@¨DoØúáìÉòPâ5¤}u¼*¸IHÍœmCÀX•Œ$#7²¨ˆ Á Ÿ|åÆù þGÇ™øŠ;†W±Ý1s”Ñ*?Ðv)͘hmžŸÞۊÄq磱^²¾ßó¾"ª8•½Y…^@"¿çF4†Ó1©[æ/N%µ÷&$³ò°ôNødú?û«àDæ¬üIZÚÝæ tVRàõCôýùwÛnEòc y¦m)™0Aõ™äH?fŠ  ,úïÏÉšþêWý€_ñ[bCšê¾Hl A…¯#|±T²¾b½áñ,;›¡áÄb”‹ Ï‘¯ÕÌF( ñéÏé²üûßqfZú»úüéåÓ~ýƒC–¡ú¬qêùòųTzø%ˆ:Mz¸a¡a5RÿxÁúºbbVHF'µ ®]·½Á›Ïß½}Yý¥¯t äcAcÇ\™3u4脳¾2Òt¢Ê3U!EFÏçF;ˆ°M!mx¼Q›7ì€ “4ŸbÁóÌÒɶs}0ú=–™žœœ7 ö‘˜˜¤Ûþ¹Otºáw…‚ZHƒáªO¥#º9bï•|à k¯¥4SIJ+Ê%Õ ±PÕIsfºn’˜e–¤18ÄÎà:º·,ò˜çå)±9J%N íßSýùý]‡vÇ~µ8´¤C©[ìÓŸÿ8è¶Ÿ+¢ Î‹rž„£“×-“m§£©£¢³qÆŸs¶ŽËhuUÍ£´–ý8/¤|RÉ/JS¬c†NsËàS õi`mÞÀ‰bx­~`nçåãOF“£E2d'…ûCrÊ¡MàÖ?rÕ@#Ò–‰%H§–Ú -´«êE.®fLË4 £Ÿñw´ÁÜçOÝíGÆFx,MØlµ™̽ÛÉWk Fé‰ÝJCP q–Ó†ˆDu²…åÔ Ή‡ìé^y¤Ó¬µdÊŠiyØ?D¨ø¹©I%8_íyÀ# aÒ±Ä[+P;xYŠxÜf?^ÄÞÛCÌCDÂ\KßD+ð$(]Šméâ.7pz§Û#àÃx[ȯx*ië_­l–œ†¼¿“Â’‡‘wF½xÐÆ>¡€¤»Ñ)Ùi=f8Y´7øµ0&€×ÜîÌDBŠPšÛN"~’ÁÙîkbZ„ÂxJ…võøé%p}¾?ïú/þªÿ¹QwÐ"n#ú…À?ÿyï‡Éd|VŒÁú·gM)&îÅuо›îÏý‹ýÛ¯«ÍÇy(¦×üŸÿC·}æ›ÑŸû'÷nÅõùÓ'O郃Oôƒý m–·w4É“ëóŸ÷Î.ô^——¤B Š9*ý—Iå¾n2ûÔûgýkÐ/•#ôèô¿Ôú!É÷–Çßë?÷s¢¥ù³¹B2æ2ÿ/9œzÔcOÊíI£þïúeÎ …»jqóâÍuY€î,•9Îs—èœ'½Nœ¯g³$éwÅÞ¯€ÿ@öÖ3†øøÎô=¦y6Ô51]ð‚É2§ n´}3à ú¯‡Ó%&„|³+¥†tY ‘q÷Øœ9¯¦¹ç„ ìô;ù{»¢ rɈJÅdo¹c”[aO‘C÷Ó¯í ±µéˆË&øâIê]êÝ5æÔ“ƒ JJàç-“•OŒ€¡.Gè dNð™LM†uâ{4Td‘íÊ5'ik@ÜKCG³b3‘qINé0m¹Ô%Ú¨ >Œ`q+`*.DÌ®Ž WžrHÁ\2ƒñÞ|X „I,ÉQÜÜJ;(j­5»S¹²“{ÛÏ&Y ?Gÿkx†1B‹%†  ÒüÁæR|õÍò‹góÒM_‚¼ÿ¤*r’·&|±¼q¡Ç–ÐÐèìã¡QøXltcQ:R"~+Šp€l5T¼ ÃR’vì·›T‹QȶòSˆúL7#5詬pÉ`ü.ÁѧR³@”2ÈT×à4?[ÒLÒ›ªN«÷ÎÎ×äkû䤸(WCSý=æcË|Œoæ¶…&êÍ?j½Y¹à–¯×.ÏêÓñ> x[ùΛà;F07ÂHC¡Éé¤<°GbÌ”‰ûìã\Ý}ø?Ÿ‹ãž™8.»*8×ô§Šãö¡7™}Õ¦mœj.K©PÍ%A]ºi4>/9Ž×¥ùºç¤I´™“ßòê[òbÇl28½}œœÛñ½â—á`‹<9Å5¹69¿ Ÿ_ÅE†Vϯµ|4=>Àåtòè?žÜ X»ž`DÔÅ|ìž-øžÕë³ú@Q"ÔA;oß)±7Â|. ®YUû@T;î•.¹‚4+¤IÑeÍŒK&¯×$™â‰£¶Ý±z!P'v/ Eò¬Œ†ƒ1Ôâ6s¦¯R‘»~'« ©J%ò¤4B©V,ö&’õpÊ&º¶™xe™G@¤`d\Þš+â#ÆB­ŸBn÷Hƒç0èŸ&EØ#€ŽÑ[îµà,tP¤ìÉ׌´"έaå3ja§)HüÖ*%&yÌá j”H`7fRr¢›ÁIf(Ú>6¢­!¼ùÃcõÉ€#d%ÓH•»òóÀ6C<Œ ý¤”)€n/aKpòf¸[Ú¥!l8;âëëþZ™ä-·àŸói¡ð•jpo…Ýlk|{1#¨ áHXj׉A0‹ì=³kšžÁPÂzÉ-Sën·?| ’‹ç¿‘_ðõ.·ëû[£e©ßõùz¡ß®ü½~%D¹qh]Kƒ½¥JµAÎ"|µ­ªí5wÕ¸r[Õ‚¸w³í½Øª_ò‡>ìÚGáyC“\;kÝ>G%I·QWêæ&\5ƒ?‹Ô•WZ?.b@SË´ád™voµÌ# &ó©FüÚm7h"àÉPÐk"ûNHi(Ã*láN¸I*#&¹8ñ ×èH8'–£•3_ nœPb™ÜðsÞHêÏêNç•J^Èî~ÜÕ¦„(,/ ñ÷o^öçèK½`¾ê âó|(µ9v3o÷OÝö ÜS¼ipøûXÐæ„wg⨅‚'uXïÖ}¼°©÷z’šêdñn±ç³¾æþ6&µÛÉUÜN–®ÏcÝsΗ32§ÖúmJæ+̲Æïs¨^Î4qv“\T+Sö»6D‘pº¡Ž4QÌ×Cñ(Ff¡Ëaøüv±o‡1£?É4ö)µ†!3U2JK•M‘Ì«ÁùÚã_‚*S#UD/HÏö‹ ½ø2ýòåWo_Ûÿùò"Ë„vŒ&Å2©X=E<éÙ„¶ Ó®*f 2}a›Í{ Ðb¹¬î4eVùeº0-V—»¢S9Ÿ O„ŽUcÁ0JZcn)À~cx¼ý‰vÆ–WOD¿†;Öºf÷|“²È]Hb±?ÄÈ«¶oñ žé€A3ð3ïºdÙHÁ×pÊâÑt†@@Ë nÄ'Õ¸;©·4ž¼‹y&Twè¤ák¢¶±éVr+¸[”Œ/÷?É t댄IŒ ê4¥dMáìáªÍ’kÙ„Ò èRÐBÏ,2y@"M ÛÇ,Ú‹~X¢€â9ŸOÖ4ËʱãÌÿ›à bãÈw¥w•7¤d(YT2$Ÿ2”–OÙ`îú••” o|ú·~ú÷ÝÞò?â)œ¼øÿWž¡w@É5{ —ž=ˆ[þhŸFý¨g‘gûû·²äiZ¥uÚnù¸´Ê¼v>Ë¿v>-§½v«Ž}í|>.ãk ÔÛ³eÐlÊ?Q@EGÕ ‡DôD[þÁbLàIïÅØ„óŸ!Ëñú‡½Æ©³b ÿLƒb†VÐÈÝI{šÈÈú}Žø…Ä_-å VAç~e‹©ØóZûSj¼"_åQ‰_fÔˆ”Ýy|ÁWx›R ·ïŸ]þ:®¤"VÇA“M¸¹-ÎŽ„÷[KMm¸oåo¼X9ö/œ¯0¨€ïõ}+~; ô|b1)åK•žÝkÒ°]ñÅf^w ¯[æmœÆ"°g'ñìä©o™·4ù¾áô©9Wøô©!Ç8Ø©ŸÓŒÅã¶‚ÜÑ?ÙÉlñçjþÜÀSžMŠ@æÿkŘ©XGâôª‹éQ÷ýß~M 7Ä·…Óns›<{ŒCø ÞÍrÎÃß9 šg®õS&Çîâ1üPZíÄ}±Ì õvÒ#Ïî/ÌLצa¢Šo„p¥7b¸ÅfÅ~D%¿¥ÀZšÕâØïA#ë˜ ¹îb½>ò¿‘㘕Bè±NžàÒZä4 U»‘þàBK@©C`bm5¸í½‹7v2I¢… Æ!£Øi©öft$5÷$,¤ÏܺFÛqk¬ö~/íæõ1Æø;J³Ž;§{¹z¨ž`áp„§äO™šüº“y›Ç"¡îe5y@’ƒµ¡yû$eÀ ÅV¥ô¤Ò K[|PX¯4í`l uÔ0ÌïGÈ¡l|¿ïC?mle* ¿@3m ó2œ•ᤦ°Ð‹³S]aL÷ÁM®Ó±ëup⸎,`­ òÑü/7.?§Z·Ð³øù ­5xk§ËÍ-‹°±ètmؠ؃Âm¯¸À%í:û}—íë‡ÈÏîõÍjÛ¯žMɤ¼®Fi2íNBáeà .½¿á×ݲ;2î>Y/º[^‰H­ð}‹—¼@´ƒ‹ÁÝøú«¯¾øÊ+«v‰ÎJI /Gª!ªnŠª¯ ¶Ñ•6˜ •CäéV"¹ÁM®e¦£ù©öW i5¡Š•ÖÕx)c§€ê¯bþ;ûç׃u u ±Ž³“êR'6Éo9P×1GGMšww‘FWÅ›×¢%c!œk'zvq9ùmÈl°GÂxʉ }5(ðd "cw­wY)å>_ruš»€h»£VÍD(R(5tãh(hb¡q¹tì 'ɱ{òlQʆEÞßÌ{Cg-¤rbØ‘ßþñõW¿ùâíkãõî6bÁÛS ó=+óé¾uøKÏtÅp§p§Œ…™âJ¼¸ì><~ ´¥eO£Š{vÇ\ƒ+NW:±vÀƒ‡Ñ°–­ØM¢º4óE“ÂÊ*qþk£‹’¤#<×þ§× -›Ëj {œ.ykPóžÅ&Uâý¯ûÉ?¤÷)ç2 :8¤Ôæ¨â®2Fތآ™,FØ™Ÿâ:]V ¡<6Ìt¢ S×Ñð-Ëæ^Rq‘ôè¦C!Hy~ãç…Q’—Ó À|K‘ᪿz6ÎÕŸV0ªXøïÓc™WVRJ¥/BL—zšVJêü³x…ŠÛz·ýÀ Ç¢°ŽNYŽH.Qû€ =—žAŠ»’ß§öOdizK¿Œa¦¼Í« 5TèŒßx@6Õ’vdœßiȸ0:Gzþ€4Œ@¿¥¥´è7÷ZÅK ®íóÞ?.ÎôųeªdÓϹ‚Xo±š¯€}‹vpâ;ûN}—Ö%½‡ÊÕÚQ‘òBAig'3rCfó»>(Yo¿òlMZQØÕ¤º‹MHKÝ_ýN–•pBÕÚmœ‚Ç)DÞU¼Wä8_¡¯/-Hà2ëÛ=J‚¤$2Ó‹Õwý‹j¶‡Uÿ}2]O úþýæ ýמ²xs˜þƒÃõQ.X¬—à(UD•6“Rì޳ŸÖQÁF¥æÛ_ÅýÞöËsíîãet²wÌT±Š[Þ©Nsé’÷JŠS•gß)šŸŸÚž'Œ IcŒ6† ·V°Xµ:Ÿ—=Vÿˆ?SA<—ifÐ1é8/ó’[œ’_•óLYø[®ì»ÔR¾:ÚìRúðL –¡ºóLtá9ma4Iôzž*7ÕÇÔäÚ : }6ξ—ÁªgÑÖ YsÄqM2í¸D>W?2nÎ3!Í4Æ ^’ÃÝ€fm56kxTŸœG.j%å㎪Æ5Wk«û¢1·öÂ}Lé“5âÅÞ13%iƒ~ªS¢E®1]JF’вKa)%ŒŠq9c%Ÿ¿ÀÑfˆ6EKìj+ÿ=Â%u·‘Šcøï×ûJ© ÄÝf(µ‘j ³22° Œ‘ãB|qyË}GEÉdyÅÆÒ |d™nã-Ü ä´DÇŸ|¢5ÆÞRDž=FŠ4ÛÞYs{²¯y’Cócê¥ ÓÐì)C¾"B•½ñàdà¤8r¿Sú>ÚŠù™£ð†1iÞ‡~.¤¼ý¶1ŸÏÎ&e ?‹SÅÞÙcÅ^¾ñçn>òÆÅ³šœÕ0Ø·Îjó1ý(T7ÔÐHw ‰>©Ï¥aæ_8½ØiÓ™›˜_òÌÄ\Òb}x¶#óûëO<Åõ,ŸÉ<ÝÈ&E*„Y ½{.®ýÄg&ü;¸+Þ½Tô ö¼•±•·§@¾ >ŸOÒWÏnÂcóTGd›pD.ÙÔÿQ¨ªÑ”Á¶¾y¤ŒÙÏ«¨ÓÍ‘”ŒÀ#óJÃþõ`/‚çz>€tzõsµNrs4ÉGsŽ~³•9ÖÊ¿ÂΓGÅ`»K›eâüfÙlrj‚?2¿áÇ&øì§Lp°Î …ÊÖF§É<–Œ‚èÝ{ õ +ñÇ®•ñP6J ­ÓÕ³© f—Eò–%󌒷ÁôéÓ2<ø~éV5‰RX¨ûu¯M?.äÎËXœ&¾,(³Ò·eÝe²šÞ¶yüm[ÿ¶+eÍê_Ué\ÊìèU[÷ªóI¢ÎqáçU9/ S{Óß¼|õ¿þ²Öûs9DšSÄ.(1“ØY©4’»î¦'ÏA7úõ÷ ×Xçd‚‚WSvVá·ˆàJ00³:[s%Ýà–úUW÷àÊnòFýøÝýʺ#y1Ö ³o@Ö‰ZXݵ³ ‰eñ‹~EãGžqD,8ê>£XpuN)é·êD닲Ö7-‘ síß%šLºa©‚ó„¹Ûû’‘zaEÙ–!VÝ~¹Ø­´ž®O(©sn@høXot…ŒD Ã’Vº+§j!¥\¾1'Üå<’4ÛÄŠÄÊNÃ}Ç¢“û½y¶®ÆÁ绕&"O§Ñ32¸+®¤yŶ$Ì hs›åeÿXÊ£ ÖèÂîD™3——Ý+'—K–kÎSÀ9 Ú”škõhIò}Iê ¹¿KŽË•Qv`¹ôDà) r´½Ð²nÃHNR,]¬†Öâ­œÇ84­.íª¨û+Ѱ~¹ MæJðÇy1ó–âõ¾|gÔ«sr”}sì¯4'ú†Nh9ƒÝ8¥V¡ß¥!¤ æ¥Å‹=š&ã ¤Þ ­aaÆ(V¿EL΄ÊÂPRÅú¸ÊrÅü lFœš3RÀR eÀúH͉ÄUÐ3SLHŠœbÇ›¡ÒNwØWkJ€´ –ü¤¼aµÍCIÙ^kvæ‚™¬ª#Um†z…œôQˆoŠ‚û𛔌Wéymÿ ìŽqJ ?!O‘<¥ 6Kò¤ ¥û[ù| +°)ÝÕ°00Ú¸Ž(ÐtÕyûUYÙiæ¯RŸBi5…R§P ’7‡›E¡¦âÿ”Yžø?_½~õÅ_õæóßù­WæE©F0RJ8×%bE$—!` „a˜¢Um{=j™‚³qçfÀAÍgà Hv&›P½äióaÙ£ˆ™Û± ™a‡û¥în}„0ÏMÈ%{­ ÊR\¤Á<úÞ1ß¶Mï$/¢/vBV7ƒ’ƒZ¦¢WpvQ[ók‚ÍÁªwóðá8—s!3%¡\ˆÈv9…Ï$|ßP9L³/G©–î%N(%lp" „fp=×¢™°3úz#"²Ë›ÁéJ¶M®Pf¶×±ËHŒsçD‹Û£Æ&$udäÎ'mÎ…æÿ3ÕKöv‚ás¥‡ÕY9‡ëå”ÖdÕ©£>Î0½ßMr[rºã« lZÈ™ ±)Í„‹GÀÅ9a‹ÖA‚êZ²$G7¬Îf6S 7¼c¸Æééâ]ËëQ(CRëÞòüÄÜ8G=“©s!þÃçûÎË÷5IKÞ0K5;2Fm‚'Œ¾†’΄ ­ ìE!¹ƒ ÉY2°N“õ s׊Ë^ìØqrn©óµ;ÕùZœè|r˜¾åy)Ac6OÜü}$¿÷ÑY 'S¨ÿü4ßá§±?NÚGÆ8ŸÿkŽó!ËOæUÇšŠ(&?qN'§ç4˧©AóšJlLFg“I ?Ç'ìÃdôÓ$6ú0s2%üùäGÅ+ÇbeŒ»QÓæËu³Ýõ÷Ø-™1 yª°1~6ÓQ®¸Ji×+ć0Á¢pª¼˜Žþ°›‚'9»!ßwÙßÒûVR`¼Þª¦ð!VT'•Ø-k¿b¬ÿ|7$%éR’+ÑÕÐ*l­=aÊJ12.±ì%4ù£ÚŽšƒucß › ² ¦®¨¤èÎõCá £ˆ }ÛQëM±6fêÕ„:€|ʱ ’Üí6¬:ƒá/ï×P½ìÄßÜñµ)':ã×þ9]ô±ÿä©´`.Wp—äóElÊÂ* -56{+r0ÊXñ9´&¼«¡^sKqí…Éêcx°òšf˜›F¦׌EͳF¡+ \©£ü_f–}p«ª!‘H¬'e žsiþgÿ©§?{*Y„BÅRŒ“*{ew$0£Á¦TÐyÊ Ê/Òø‘q”“" '< RPË/a%ËÀÙ¡ì/X¯F)î£9¨„ T)(È˽@šS7Ü2⪺ '¹:–œÉ&½›61P¹Ê K N]X®ÖëÊß`•­Ur{ä3óì¢'r—®Aq|çYd:äõöl-C+¼Ê^rM7ãJþógøu¹®Ž@Ú ŠbÊížØ°&R‡Z«õS ’ÂÖåàÃC.«ªw'³þ@|£A¦¾¨:Fè|%= ?.åäï*Ñ*Ýsrx+-Õf™ÉùesK’­Ù&Âîi¹ÙÈd´N¨.§ì35`ÏXÈ1ÛÛÛK Uù„3Æã,Á2Vi«Þ+?ÄÄ@,ïÄÒr‘ Fá8³Søouú«ûþƒ Á$^„ôUÈHEoð{äR6ZÎð¦>é´Q‰sŠD[¼-ѽjÎ3ÊH-flé©^ÒÉâª*Ø- „ M?Üæ|ð=D+úSú—{É@£,Ý‹²O‹"oI{fHõ‰•Bæ c„/—›ÊÝèf‚´üxlÚ@ ¡N„aÞ¿7R±~ô´²Ox4Ü£º8X™¯O©‹"=ÑÞîÄ¿ª–ؾp6Ò´ÚŠˆ@nÁûŒ².Šøuê´×­^+Er\çBN¦ CdyZ=H.ÜV‹Mã`¦nwT aaïU墭pÄVýú½ÐÎ=mÜ[rãÞýh­i®!ƒÑýXõ€Þ-ôHàz»È ö'/*+'lQ[/¬”L1{EäÌkáþ‘#8„7=(k…š'·îŽH Uµ¢{>Œ%m±¯´øË7öj&ýËxwΑţ–V&ÈÀr76qB姈¼_Àó…+x`™xÁ+{^÷îçvGxË6ý"ÝÜR3ù7 ©ñã&J_Œàö ¢zö=è}µ(ÕçÕ£ë6+ÆÞõÌqc›>{€¬ß_t:͉~–‚쿃â®ÿLÿw”:§‹éÅ0/•ŸMfþ<% ;É?&ƒQއN?¢ƒzúþü) Ãihžò`¦mPý¿üþA41è>ÿú¿yý>ÍÒ/°½PKAó}L¦¾-FyïCu—=9ãìIn9Ñ)z7ì ¶vWœ{Q" » :¾wœõaç4´8³ÿΑ‚ðf·ð ´Í)æ?½æöQ8µ]5¯sÍaÍRÂ…x ñ1èÜk6 qHcÑ——«a!ƒXO2šPÕg*BÆ%;´‡f…ïw{DÎ[!ÿD³cÚL¢-®úr’Â6Kà 8„ú±¨h±4Ž$ïï%=3Å-GÌÜ´¹¶A¹Ö±n 'cVXžý½Äã$¡ñJÍ£+uÍN–¼Ì¿ÙBIü¹‚{ŽÄ²*—JÑh^7DÖ?ç}úo¶GgÒ-œ¤‚JøºÀHa¥kœ¥÷lr|f‡Þt$)¹8‘»‡Q¡©bÛ¤,L¬û×¶ÀqãRé19]M\bNw@ÿ3êÚs‰V0(~7Âx’+éeé;‚( Ñ ìj]±d8#Ûª(dç—*u«ëþÌŠ:'Â~ªò;’›c Ø&̳.|‡Õq»¶=µkWöžì¼-w½{‡'c¯6n¯«>[s;“yPRäÒôXa]%–’3CÍŽÈ–"N1ü%i~måNß~ÿøV_îܪZ‚PëùÍ?ÞóZÃBN…Ê6+&g'Šxè[Zã_|ÅÅð>ê¥.±ŽÊ[Èùüèž.â{Ii/LSùÝiR»UÍÞÑ^Ö9éêKÁž1Lþû²ZïÅ]<¸ìø 'ä—ýs‘"(q ß-º§;óa†tÄÌ›C€1:U]ýíþp{xþlÖßÊù!Ó›ß&·ê»ß¿þ‰óÛîМët‰öŸlN}¬>ýÙÛרÃú¥8‚^H'Þhêû@2›·†E,ªôìÇØÿЧÅ¥Œ ø5þ«ÓÐ’øzÂqF‚ñzŽZ[1G8¡»•¿ú4yŒ‡3Ïþ…Ÿ®|Œ®Å¾)˜:. ê>â7—ŠÎGH? …¸¦õ­¬ÿ³«2_dé Tî”@`}µ=Òîž%ÊL?:Í î"#>÷Ѻ½qhÏJhüvûX/Å¢š ƒ£¥µ±öUáB°®šŽ5·5fcã*dAgW˜óƵæŒêZ-!”5œKÕÝg=ðžsE,ËÍ}(ƒñÛ ±r2x¡DkÿHsþ^€§ºD4‚÷ rçðÇ_¯ý•óAøÄœkDHX[þ‚6›\>¿“s@¸¨—fžL•%’ ²añjU«”ni¿]gÖ¡‰{ØÞ­¶lTqW0°¼(Hž6k”*·?ßI?y1í̺ä Ѻˆ.ZÕ{|¹…¤}^tÑSeYæöV\ë‚ssÚöÓ1ßãº:€_ŽÏŽ“öº#YWFÔ¥Ì9M];i$ôáë-Ú˜¯S~2¼AÍ«,XŸ8 gƒ½ÜFL.Õ™$sÄŒ‡ƒ”ãµ:§+ಟÙøÛ‚Ÿ•Ù”iÚ6½ÉãÄmžúÒßäê÷ž›„}Ê2Û±uÈõ/÷ÁüùËB"U°É¦ƒo‡\?böùVÁÓßw"’Cí-†s·¯^(#•H6þ1«í Ü{`:׿ xZ+kÒ‡A£·r2þx2>`pú ÖBÍÛ)Ô2Íû”ŽŸL!U¬6œè–b+±,Ÿ;ÒNÀ–…ŠË)ôÏâªÂC1i·®ud"‚ºŸ,'Q}³ý/&¸ÜþE‹9Í'ÿíŤÕ¬)à!y1ò x¾ÕÄ™\·?ìoÏA§ Ò•ònèÿ’«ÛÍýöž´Šˆ——~ÛØ7ÃÉG½Í2ed‰˜).ût}ÔŽ·Û_ãE©é¿Ø»Áݾ…i_žY–] íb™1ô€±÷îýˆAz¥8ë}vúsö¿û)¶Ü,ñ‰-mTòÓ /š…G¾‰†¬qö«Næ3€#÷ZêY–g…Ç™| ¦Ð¯NPž…‘u'½ºêÔ×H¸ZY³÷§âÄnU b‡Ïzÿ ½ë±Ñ"Bc2B –9`ðãýÆo½Þ—JÆ™û9£Rm¤æ Ën%DesßJYL<„}eÜ₯äm|è¨ÌÿC·¿ûM ÀN ä "÷èÉõ×[,×¥]¢*c!Íú´cÈÕšŒLÆÂ»1VË{ÿ~ÕGBk£ ÃùÇÍø„ÉÖ Îê‡í‘¥ƒ¤Ù;:¥\²Ð±THŸÂnƒÊð‘odüÑ—È¢Zõe*ÓÀ!M|­Ú{EBR \ÊܤEsa¥ &Î>&‚†.—ðš£NÕlÜIMZ¨(t?m4]Ào!¡çÀµ5ü¿UV:¤´ µÐ& ÅlDò*‰o×JVõÃbIÍ×+©ŠÑCNü¤c(n÷/2âh4>Fîwô*n«@ðÿ‘ÂÿÛór*Y†ñÞ˜¹½Ç+M¯Ð Ö: ÜCîê'ê^h¢jdŒ¯ñ„µÁ—çBlŒ%À^Ud4Õkœ&ìè]!ÉJdÕmälººâ‹PNV|! O³HTÉšÉHhô1u«!;S¢¤—ôL`¢`Dùô5úÿü4Æ(s /,G@Iôl6§ôîßÙŸÐ%ÿÌÁ¿¡\Á8Û>íú]qÚ¡y$çp–åæÂ0ép–—å<þòÚ›¾ªaoŒ ÅD†ÉwÜx¤I!¡üô¯` ¿Œ!KL#hœl ÙÇD¬˜œÎ& ¸‚ßYç*CG@8ºŠ+Fl¹b”@Ͱ½PöΡŠirx é‚ùi=ÐPfæK¾‡l˜îiÈ/$Ê©Nóš)43‰ä‚å\ìŸÖ¢¬¥ ÷¥&cÀLÈNÁ_Ò•¤Ä´kw«J 㙈¤ô«E`xéJ@~Ÿ£ÈÑýT {ûEÕbµ×!ÍÓW‰ëè¤ ¨é{Ѩ÷‡ô‹ÿ`’â…„|Î9Bž¹3)#]"Ñ ¶PÂÙI.3Õ©&¨jI.S}QE,»¬yèýý3 @Í9,ôá`q¡ï2)ô•äJò ÔjÛÏüÎÊ< >ðËô RG¡îü©ûœ–íÊN QNã?ÇP¾x!­bãÙqe.³ÈÝÊ œMÝW±_.$ð›h­®Aêe¬,0šËJ&ü÷/ptá®X‡DŽpËôc4ŸD€èÎ¥³²Ròý’ ;. ÿ»ˆÄ8 eõy¸X›(”"Y$wþEÍßÒªYÃá—¿ ÓõÂô3ÝX®ø­MnÛøv”=íª@R1pø«z`´ó™kâ¹ìÿ™Ž ZÏÈvg-­‡–C9€ß8A‡¥½„k¹ÊÌˉOV›æ~¦?Ö1Fþú—6se³“â/í ŽEºeõœCƒP–}iKˆ-ûž¼1 ª7sbÞê4¢A-€zM—yLbª¡´xëw !{¹ímžs;3¾ôÞ ‡¥[Jà¾4âW»tš?öÓÊÄãÌÏþá‚›Wæ%ðƒÝn¯”Œòۛ통Œå|GL*3¶pµÎî}0+ $ˆJ(ë±ÝSâa=%u¿ùÍ*1r‡}ÿ¾³îŒ'Ê ^@&úö7ywt“ùÓÕ¾—Éõ¥½M8öÕæ±ÃYq¯“s²Ñ¥ —° @lZõÈew¥ÂÍæÉ&û ªtdõtÄn§Íh뢰õä [9,Ìcü™›¤¢Â5yÝö‡ K*‰§{OÒÃm¿mÌ4ÃÛXZ ž@ü|—džeƒÿþýO¥œY 9Â{©ô{‹¬èç4³ÝÛpCX¦,{ò¨Œëý{NcŸÔ°ŽêÒRº‘-/x¼•"B™)î|¯Ä¾; ¸GÙFRRån!ßS‹Ž¾-šŠ9Õ[‰Xœ`WQŽ›-«3›5$Qp£Ó»Qgig? ƒëýSlŸ•BfÏ'¼äþ{¶LxÕ/½}ïg„:ÛÝhÆM&YÄ$dä$«Åm-Ôfðee=ÜîƒÔ¹~‚¸ãɦ&”!l뽇†ÔÚÈ©EBSðÍÉ¡ãÛÜp[)Ÿ1òˆÇQ}tÝù²Ú¡Ã¥âúÖsF¶+‚õÀKråѦê­Dɰûá >k|ÙÚ[=@pjÓ*1Ë)LBsßI† b[yzÿk²¯(ŽÅ9D®…’Ñ\ስ÷ƒ¡ÙàÔŒ¤ýð(’w–F½3)edŠ\×ì§š5pÒãlDRwqRÁ4ׂi}>Ó&ŽÈ˜óßvL¢Ì•5«7Ê‘âùâz³=Ì·Õ É¦ŸLZX¯ƒ9»£I¾J2¿^´öÚ?ãdÏ\vXIF¶Pµ-€òÝ *9µÝé–ñê3>›fþýoÁcÆ£L€±ŠÕï‘«3pG•ÍçÓ}zô%¾Ô7ë”äÃ^¬ ü‰¤AY÷ð‡aö™oΘ«‹¿xa}Mñ7$dõToz\h²$WNÆB†š‚ Ÿl"5#ýH§Ž!†“o©0ÂÛûÃP1â‹Ñ`iÂ컘1{/¸ÐÈ6'¤ÂXmo¸€õtÂIá|:§Ç^ꢵ2p6f×"fÆ¡–  iƒÇA)]™¾Ï·"l´ÂCiŒéÖëŒwf­Åœ MeÉÊy_'Yæ¨Û+Nõ9wõÊb0%OÂB g‰Ù€6Ûd^ÈS¢¨üªªÌŠÒ™è™lmN¿L¬fN’ y¶Žfï f¯ÿ«S%ô³¬èC\±_ÔPR1¤}zc°í݈}¹,Äz™å úqH©Œ‘R@“ZüËûú_–W'+Ña™Ó• µbpºc(Xãd]zkz ŒÏ,Q2Co¯‹ ÃŽŒ{”.èêÕf[Ñ9b^Ж%»¢ÈYÒ ¥)¹”Þ'¬ª„]¨ÀiBD›Iû™ :UÚÀ¶bVÐímÅÝî.NÛ Ý‘÷öDt};ÔVÖ‡ÎÚtÅÛÊ&€[,öèQ©µ–È ÐLèS…·×”¡¼MôîÓEdˇí»C!n’eŠ)ˆ $¹¢p¿qh¾†)©ÉkÕ¤çMص¨2âÖo:AlÆ*ì ¾5z«¸<_øj^ÆZ»¡ÒÙµ$E÷TC„“,UǛƦc:d*øÒÀϨ’³}4 ÈíÐ èg(2V62ÝVì]oºýíógã\ÊuL±'Ú¢ýãyÒoÑÜÆ:;‰>8'Ct2 ‹B¶¥@§®æ0’GÕǪcR h§úi¯Ì +­4kÞÅ ŒœM­˜œÍùÕ¤J>øÕÔq%´Qi¯ÂQÅE¶Fcž+‹uIžZŠÙúo*"yâ³Á4Áòä×™q'‡^î–®„j×qÑÄ$΀ŸK8í’é|Š~=K¬QÛ’´‡M&.øÅb”#½±iº<ÝL›ºùyP´A°{CV `s‚·¬ñìä<þÓîKøàâ,¦ÐKâö]±ÚU¤šc-}^j̾úñQ;•¸]·ŠtÃÙñÐ%=heÑ&iެݴ‘>¸\¹*s>ÑBú¾JN>`¯æ‘âÖB¦ yÛÄVj¡LÖ^Å©4_ ÂÎ|£õw Ôà+”_'`ïúˆ?¨Z®w|m¢_õ$®é,¨)„謀X/';=/þ—ÙylBàhu‘èèn·ý°®n•wDo<½\mûÛW¸hGªXôbxÏ S7¿z1›Éõß¿`ÿŠ÷t›™¥¨‡¡)‹µBvòë?¼ùüë·Öq,úÚÂå ºÇ}½kpjh-ÑšîÆ!9îáÑ+J¨™öq‰Ì̵Tv81ä¥:¬x|[ÉtM¸ÿu Üç¾ÐL:H|ù±·Ç9,ü˼œ¦ G™ ¨Å…Ls¢|3‘“nèá!-ß]ˆ/nÐ>Ʊ²ÿÓfÎÆòD‘ç3C¹=ïC5Z~˜ ôþ»µ»Jâ”Õ}Y+Qäpˆ4e»ˆŸkÜ•¥f†Ìüá1cH#!*Sl -ÀÒh™Ë.!se€¤°Jžä­%ÈL„›I]q/Ënp;‘ÚZxë5ûXˆ~T«+#ëæÖô:eŸw%VîvVM4É=Ìœ³äë©Òöá­¢|)žDirFl(ýŸÙ)ˆÒä1ˆzß‘àxùX»ÛJÜÓÁ‘ëZ©±$×—Ð-{2ݳ4•Ä·IýÙm%foŽ=@éïwþ÷y‡ÊTaèþŽ oPE BÃVuýgaÂNÚ³v†ÃÝ» Zô Þ¿ë[˜OÄßœð0äæ®vS Æøn…˜tK„È*ãµüÞð;å ?@¬w3'#ŸéÖ˜¨Ô £-ztd7úù,óc°x ¦@†íØ!7Ãì!2A¡V†}/$ K1N•2P å>Aq¦`˜'Z7ï¤5‰h¯X+”y¯´KˆèM%¤Ñ#"¢¾>:p䫘aöZY¾TX}Ú"4Ž¥L›œŒ”6¨Ô;2-¸+9–ИýFÆ«¬˜Â;°¿p’ ¢ò¡…øÏ ¬´×éˆbL©¡– SM˜³ÿ;=o8¡¼K”@yòwQ–¢Uâ7íuO þÏÙD4mªŠždï#µ—‰ ?œɠbÿ¦"ËÈÅ£ÚOS¶ãU×Ëxv›û= *Ù¹u¥‹v«ŽEƒº†øµQ†·ñR'4d¸kh4W~÷ÑãEi<«0a7€ÅG F²éØØU 㦫~aˆs—…¤(¥~&öó½Ã°§{p*#íŽñù‰líAçC¶á)‰2±¾]ø|oã²Z“šMa¯˜sÊw¼mÁ5³“»N…ö@Ú*„…u„õv™Ï¢µçxÏJðe‡ð~iLÙP $„ÎMäp¨úü¯Õn›°»ò=‚pö"çÕÌÇ•°õâcꟳ~ú/~F›®mûŸýâY–Kjebiìæ\±)z¢ÓG"65I÷nÔ?´™‰[ ¨—ÿáC…qáÆ¥:¥öFµ »ÿÁOú›ˆ>é.V+¤}ðÁöÜÉp×çŸäÜŸý!|µ6ªù„’a6„çýÇO½gQ²ÇÞÓ`/*¿VdÓ\ÞÓÞ"Äñ‰‡I/¼Dã_¢w/>ɸeç¯(<Í8s ¯•é°âèX]³5®çϦ#Óèx• $|„€­cŒÝ¹ÇYÑùu¢Ux¦{KåBåRæË­˜ä¼lk*±$_ ¶ Ë4ÝR²–¶pÜ/KÍÏ\@Þ©(4ÉïUtQGKgª»(3ï"'I1‘çó2¹ \i2çîIjŸ\.¹Ø±f¶!MvcãitðqjÀ¹Vç¿Ê¼°ŽúªR´ÓWWÖ«¯¨ÂÒÝQ®ZoÑ9 |Cu×eÞI=Ó•Ä©•_ò¹CÌñ‘c upZ()!”Ô¾¢€LLŠFê:Õ)•ˆ–“$‚Ž-›ôM,«³Äø}ì­ˆ©Ýr:äœáC${h%•×ëO¬îºýÍC,ìã”I“ø$àY¯õóØy·ã¾'d¥æ#¦ »_u v”œIcñ±t”7~ì. K·y T_c)“j1¶¸Z«pt‡=Þsð^ÓÙi¯)ŒY±ø'{MâLŒób"ÎÄ)ßHs4÷ÂcÎÑa2íCÒ@æÿ[“);|s™8a>ƒËo—R 4Ö°ÖHEÚÓF,óÐUë‹_´á#/Ø$Ë~’—Ë”ºãÓ.éË2Cäï¾¹=y¸\ð‘³yž›Ï™eHôáûÏŸe³9ÿ*gmÓÎ ûwY¼½."ýjV€{@ž9.…â”ôyÿÀ•<íÚž6)çŸGGÊŸ™Žsó+³¹OãVr[kKì}ætÑ£"Ri‘äÓîÖÊH:Yåœy’¨˜ª_bƒdé‘<;Š]D@èƒénÿ®[H¹ OƱç¤ëÍñY¾ˆ?¿÷Î`Ïéû»±/ë]U](û&-­/o¨‰åÿ¬=üMÀ`D÷€"æ9«µ)÷ãW) G(·za§ê#¾—ãÊKN4h4?§ÐW`7à&Ú¼ý¿I-‰Q¥† ‡{qèýŠ'Ç“èÉt¿׃ÓlÃÒ¢ëø__I4!ò(³ÐÝ*ç^'>äc¤+¶„Ú–W:Ê9‰kOÁFî‚ ÉpQ|u,ø¥Zý–(".¾léÚ²1Sz©ˆÇé_/yŠ,øgįë'?Ës€s` zMö*ï/Äöq”qëF»y´& Ò}¹‘[î¼ÒÒçSôîýžSe\[ôYGºÁ\Nô.»cp•àËóÅør%nÔH½ –»bTGÑu*©M4ÇìÅè'›îbdtxerx^|Ävó˜Ïå…´´¼ pBý+QÑÃxÏÈïpšÎªHK«W á,ç<]–wiž‹Ÿäh`ìÈy¥oâÕÕG¾ 3ùèÝUÌ&ÆxÊòñò"l¬ænÊl:‰È£«Ìg#»±Êr6Mn¬dÒK¦·\U!]™ÒsÜŒ…„“SNLþáaÜоi¢²f)Oß[SdY ‰!£(— 4eñ.}Húô%Ô«ÜíØBÀ•R)º¾•°¬©+'áÄó¡s6;›–þ,N¼f0kÈ¡ô©8²“!QÒ$#8÷ªªµâÜ_/‹Ûo÷w„¤álîá~·á¿hΟ^„îÁÏ»K7ˆÙŒH£è™Ï‰ÚI>2Ÿ9¨ь>oo&£Ì³y!Í>q>Ÿžå2N šåhd*ŸfÚ%Á¹SØWÕm4 4C‰B›ç;'BrJüµ‰¡/I¢SdæJ­€<(Ê’`õÜZ  KºNµ¸ª ýlÖ‡`^øokQN¡à`ÁÁç·káÒÕ~á ë‹×G0འ›X¯Íkùí*¹„£”H Jh+_@ã@ëü¶<ôϾzžE¨ÒÏ¿·›£á‹gK>ºÌü+”ç+nãw$½"r½ÝíÉÿèW²?«HªfzV ^Ç_… ‹íc Ú€o6šBñ[ˆzEËnc hõÃa¡uÌ¥ áš£SÖOÞZe©äwjªåñLJ;„ÁÊÁ,e \E¬Ú*]Vu$š½è¶E»d8öföÝmG)¯>HÚlï›6–cY­b{u ;Æ1eß?vè’6*Ç{8£þ‘¦#ogIhÚÁt÷j†È õîØj:œòN,Íþw£úžŽ4sÍ~eÙ;è‚Äx^W"WK¿¦ß1÷D…€Ç‘†;ךÁý…ÑFÃ?†©¨†Z&ªefuöfM„¹HK—†Ö‹ˆIž‰`S±#`DœGä?I9.° ‘}Pth›tGCiD2«¾‹S¥F“B ú»S5çZ”üZ1¯4E*…¹‘y’37ÉlS“¬V{¯™nÉ¥ÃHVï@aŸCTá/þ`zó×]L1Ž'› -¸ÚŒÌɵ‚›…ØrS«ñ«c¥eð8‘¸ÑÉ8ˆ ±CœOÍö“û\ lìOÈKhg›EÎÇóÙÀr?šö! ôXJËg¸;ޝ†|ŽľU ;xd»éÙuH‘eÓª*¦¥*nÏDI¨ëóá“üŽD¶wä‘oûÿõý…ÉcýÿÍU÷úüåwÏÂ\þ ô(îO¦®?bvJ’ÛI`‰Å”´·ö›L™ÚÕìDìÏÙ…ÙôfHc¢ä‰U°¾‚Hû»’DÀ™–Ë£[ÝJL»Ù´ÁÁ´­¹£ñÍ8м6ŠsÙl7À%6\r_]hìÂGj¥™&Öœéc\0F-âç gVP°«„½'nOC´Ú\)˜)§æ7œsÕº Sß¼], 9I¿ô§?ýáå}úúËw¿M¶âÖ*8ÒaÅ>{ Twö@ï¸.)˜½álÆy£DèšW\¤›AÞ,$Û f IaŠvç§Z‡•°¯ÂæXbî…6E×.£](“ ;RõmTоG‰ôiòÓПü¡»åJX}¯Ã1¢]|zÏ ^;EÐ÷në†tß¼â&³è Ñ{rQýF:N¼¬0‘ ~3!A õÔÌ(³n;œÂ GKnʹFW¨hw·Œ e1Óq&Œ­Gû»B½ERîk¢¿DúëÒcÛá‚Ã'ûµg€ËT8GJÇKŸ"J­ â³6]»¹$‹EFúô!@ËЀ¨Ü%݈µt¾¿e¼¿iÀF^k´ Åû –’ï3×Õ%·Y§ÊòÎz’פPÅ?s4‘`’’+œRç‚Z#<ô¼fÓýµŠât@W\Ô&gî:«òÓäH¹ T©Ï£•ˆ¥ i#qP²¥æÏ÷ê,\³‡RKoƒcX Ù¨#Qˆ¢0ì7õÞï¾S¤ûEÚ›‡2 zWKenÃ7âoMÉí„PÙ«×!ÕǦs¬©<î-„ñ¶óÄþæƒn4­£Ã˜ÜOw<~×q¾oùQN­ 0ÈDÕîõm»®RÌK˜ÅS{!'»¶Ö®$¶eæ‰]ò,Ÿ¦=ŒŽ VzùXB‡ýávsØ?ç4zŠq¦X`ÇI’_Ï‹±añð=âáxÿ~óTP.“|ø¯ÄWÑÆÏ¼ª:ÅÏȺó§püòÉ|æõXõÜïmdNßÒaMá±ô×0µ”ž¸F3Rc#óQ}Ûá«8J…U†„zh&Õ"˜9!¥åmh©ayA9†x­y™©ÌÅ*½Nà{§†‚؇…y<öÛ¶¾ù¶[­p•km¡âÿÝx`˜ÄG·÷.õò®¥ç p€ÑXúáô¾ÒQØ ËC6á,ìÝݺ«ŒR•úÇwØ¢)ƒz`ÏórB^oµ<0x,ÊWß0¨ó}^«®nÒ•+'~–°Bm2KüAø"‹IÙïÞ'}0d“Ö K71)n"&ÞloFÝ<À³¬¬ä²E¾–Ó]ðÑÖÇóT{âbêÛ¢¡.e|×>ATiz‘JàHÊT땪zÅ)•ì6awekf¹ îÙî#ïêB¶ªÖ㹤€FŽ3ª@šTzÖ=ÆÅ÷#ŒÚC!Q1´Bÿ!¡…½0nN”‚–‹©Â[.4ÖÆYWr†¤Û5Kì«$7äËŽ~AüWœ_JZúÜH?¼W”É^œü~±?<£ÈûÕD¼0¼úx°òm·ÖFWJ~B_FüºòICýÔ‘BaC” ÚµÑÆz õ3 Ïk ¹®žÍÀ!ÂÞRn 2é<È„5YŽúhSƒWn±¦½ö ÑÊúev¨´ßØk8AùZØ—ƒ“&î|""Ó|¿d š™ºÏ0WÍärk'5J&Òž¥6Å]¼Iê2hîòŠ«ï ×Äè©:6 "â:I%ÌnO®ÖK-ªåò„¥Äì¼V._ºÁõnIK×ќ/lÓ1ÌÆo¡Z0V© ¦×•s->†‚ÁòÛ¢,BDNJÑq èÉ媺»÷ý0l\±ÇüpˆVhH·Šëã”0JË|D䯝\Õ8#œ])Ë,ÓT-Ûñó1¶kOÐjÝæ>Õ:‘\4æ '1«rÈÉl:¤:kÜÇzã nR¡ÎÞ륀›`h$æféè sgÉcOã”ÎJUÃoº»È°h«r:¿Ñ”²‡@ 7§žåY9)2-+ZK÷zÅLòrAÅ ½ «V"â)4!rFŸó‘Ñéxúâé³ùØ9’1Pfßå~C;¢Å§kÎ!பÈÍDò}¦¬m”;ÊL˜‹¾2s•Ö•|Ì%õ<9J·‹ƒS„_®·ûêr…^Sºq£×¤"#º,%‚;1ªrÈI¶Øäá„àLWš¬$ õ…ÑdJû1ýÁ(ª#ŸÃuúÊ]™î7úNdS…ɧ¾D±©è;êî>å?é}"*O4 pÓ* Á»®?}8@' ª©¥©´:áTKyiUÝô‘ÖD³@NO%6óÇ›ˆ)©dŒx#ðô£-g"…¶&õmƒ?¾µ!ºòLuÞÜ÷ÿAX\3\W#5Ç?“o¸Ûnš IxyS$Á½Ä“âSÆÒµÈµ˜¢‚,JìKwžÖ æuPfóˆÿ.8µ•¾ˆƒÝm˜J‡ùTtíùXßWšúù°X¹”Œär*¼æÅ1Ö’†*»SÄ͵bÑC ¢¶ëù_#ý;½v˜Ý§ÿJµ£{Pj@–,„6‚Ózàdlð ^Â6&ïæÄ¬…tڒ颵Հôƒõòl/’†çSI9×@ÔÄû o£ßÂ:‘   Rçn3AD1êK¢×À)/ Í³èåAš¤ó}ØÎX-Ngsvb6‘cå¨ÐJ°‹ŽÛ«îØ÷;òW£ ÖfÙüÍÍ‘i"¯p;]¾ÈñgFŠœíd¼O uñ~t6IµnwÀ¶J ¬>€,ð Ô¸^k¤ÁhÜD‘§ZÞ›ÄfpjÚYY̿ޗ¾Þ Я$«ÃuÃʼN0 ò:°Í{Ñ­•’4Áî¨6ðùöPER3öiV>°ª‚¼Çrbæè‡—¥0ž7ç×\ýZì}^Ãiø—qW°¼‰Ò«£s§Ðká|Ul*,q|[²E··Õª[  ZëÉý¬+¥Ÿ/ö5nrã{‘E¡qžg_JR$áW[%@¯£ºK—¸OÑÚÈa% —T²7 ¹ËI¶Š¢%®x+MœèÙMAlE¯!ªºhà8AT£ˆzä!EBÞö…êPTÚqÕ¥rØt›½R²PyŽf§™‹ ´þeGLĽϳY¬þÚïZ x’UÒC]H'¯2‹qþ¸ß,–—ŒÌËÁ¦¢±ÇE$ŠJ1¼ÊKR×¥¬)meÙ¿G ½p ñIlá=0árrlDqŠ1ñ Nœb,QBB›wù}›ù$2Ü/¶ë0ãc@šcN¶LDîMÞl/ 1aRåÏ’rûtB4`kΙÓï÷¦”ýäFE¶‰zZ¹T@Wº[6]¶ypŠ»Tp¹5HÃöÖ ¥ÐÍŠª;m¶ñsÕÈ…žÁ —À¸šs«úiN%ŸBì!ÒüI1¢’Âß ¡WȺú ô“„°­vŠpé;Ás“ȬVãs¹Â:æì;fLÍgh,µÍ߇÷Â%ñï¸PŇB¶L5úh³hx6 zòÛW¯_}ñÇ×_½ùüwŒ1—ö^º–ZIcG“òv¶¢õÀ;8A3Êò»ó‘Ò¡w»g¢T=gn¹ŒÕÉú•âú…¥•ÕÚ¨ ©ÞMˆ%S8\åþÓŒ¯Ò6Ö1%Pä£èZ/ýuÁ¾¼Ä·+ó•3¸ZNeÊÚcGa?$)žgÓy ?g?†˜ vâ÷zîr•Ÿ‘|â͹ÓÝBÃT6…Bø´HÁÓg3ŠìA˜ª¨cÓÛ§dƒqèS«ÀwvձŪknµ[â`9)â4D`WÅ&·e®m‘kúMš–vn ¬ŒOwÕ Îñ› 6¶R—­›æ>qýbdKµ­UmÕ%¨8G)üdtÑX™´;ì“ÎV1$/×ÄÄÖмŒ$_ýé^²z:.X=:1SháUZ_ª‹Â“Út¹G-ö} 6˜$‡›õýŠván"(†›;Ui·¥aû\Y-¿Î¢á…P©UQ3Ñ©“Úܱé˜ã´¾?©0>¯Åöþ=è h‹Ð“нtoɘ¶Ó¬†úüzû q¸8X®]: ”#ƒìÙ¸N©¡ö±‰«l?ô~¢jfÅdÂÓ«L ÙȽ¯‘{gƒM½UW«,2ZÄ~ý× ÐEPÿ¿°ç÷âùŽç,ö+7?p¹f.R¤Cç5i–ÄÖ£2o¸bcä%æ•;܈8Iä_Dx꞉S{B-GÊñÜ9¿8pÜÏšIZN7<ͨøD¾6¼x¨©Ú‰KÊ šl:Â×z»åŒÌûóˆ,6„X~@nµ½B°ºA3*†¬:ѹ=ütÚ¥dký]U`¼hdE_Uè ¦QvÛ°Fó>¶¥æ#°?ÕM^‚—ÁÆðõ~°|¬¬oàÜýÂ¥¡ Àè üôUÄ{w\tÐâ¹yû½£óï|1gÓ©\Ìà ¢¾CôuÅõ‡ó»Ï¿îöJÁ;8ÚIu`Ýn_:Òkvuœ@åvüן¿{óÛ7¯¿B1Æ·Ø÷n²ä]ßýéËן¿üÃk Z2V‡ðÜ„XOk°]ìßäÍ}¡ ž¶Uj‚5) !pL²J‚‡1§‡^ª¯L÷´Ž¸ðCí=—eñºÓ§¦D3fìý=$yû"gU÷®¶”ÑàõôšÔ•°PMX%¬B!-ÙÅ싹e€'frGâÊOÊ<Å‚R[³jÈ©4Äa³\ƒ3Na` Ùjri£ö—¤›¨ÀN4Kä* ˜><ƒ7" ±ypª€£¹Å^5I{wA2õ•}Ÿ‰FGƒ¥áÜÜÎú'òÊ_½™ÙÒéö“2TÖ!èJ!¿!<že¢?¶ghÏ®Šô¡jl«è„ï vÀÐhI[$üö…»bÊ'u'ÖvYˆQdå>ƒ^/”± Ù ï Hh±R¸ó±É¬ÅbvJCU?‹¬×4“BÈÖxNl‚ªhŽeÿÎØ€k©Eò]îšÇ:ƒp&Š#¾mÎ=:üb ” %+<}z×ü“Rç’Îxnú“ö§VDõº=ß>0"®yÓq½?X0bô£GÞD˜¨•/‹"g~ðUÅ:Š¢±´fÈ=ê-Æ‹­ÑªÄ¹§ †qÆ#ƒl†lý_)æ¨IÚc=Dލ)žsšü‡Y%‡ÛÖ%β1ƒ»GHÝ2žK·Lk–›øRÜYÅö]„¥RÌC'b›Lm‚…M„=´2Fg°®;0 B§‰xÄ‚ŒÐ¯—œ£gB’-Œ3ÌÒ¿)'¤ÈÉ¥è–Øv[„ôIòW˜šIʃÜ|¦/¬7؇…‚€ö"?A¡FLXï:ø×¥T~ö ˆšâ7q˜ðài€ôó"†þ<}%þ¼¹K¬G·–åY9ÊÆ|2¿&…Ãý†ó` ›¢É†ùcŒò  ñF’;¢P„ÑNœ:Ý ÷ìî—ÐèýÌj-R4Nß2NˆŠŽ(ê4nkQ„èt¿cžšºô·¶»'J˜M^7z§Á˜Ã¨Íûõ%Õv¨4GœŒ¸cU$81w èPó–ÑOýð©Sîx[¯í‰Q%teç’nu£g^=ךóR$}Vª™)i«JNµ>Z$^H4ÓfÓ¥}m …½P¹w­ÄÂuÞ2ò1=v4‰„¼GÄ @ý>=ØOVÎHa<(#]a•q! ÷vÑГӉÆm‹D&»5¾ïî|{K’‰+“„ü@ ²ÈiH]SS– VœÕrýüÙl2¥î%ÖÕ½ÃÚ{Ê!<ýÕSúd(çH€Ò·¹‚<ª†Ö»Š_›2“0³i‘šsor{sô­ cÐþRžÍF¡ÿ“ˆûŽkÍåcµf¢Õšå'ü[þ­®õ­¨’—šÈ;?b™¾ógp3ÏŒPY ‘¼¡9B¬½ º+:ÞFùí^eø,vªrÕ£iðüö¨ÏN­éUº>¨¸×Z/z{üÚJw­ |˜öÜ L>hØíP¼Á^¨æÄs§4]Æ§á‡ÆWÛµ¥û½k¢m‹Ð “”qEvÕ%Ò=ïIn¹ëø‚\‰~ÙûgÁp¦ƒußèXÂMUÕ¢ùÜ´¿7ÇS<ëÅúa»>¢Ù"·Hª¦ÁìDkÁ€ÖÛè|ïyʸ¤IR«Ó©ØðÈW%ÐÆ3Öé±¶—øÒÍÓ¬·ˆ*´*«jUU‰»û”,¤X” b¼;mz¹_ ^`wÏí:;²8+ úùØâp‰oú«wÑDF”ÝŽ:)4ƒ.ÕâBó Dü5М²Ê9eõ™ ¤8ï06ÉDÍ'rí“ B>Ì"IÿX¦*þ¡ÀBÉi¨w-b²´x”M<Ú–&?BiþyíÖ_|<ªƒ%I—^ÌGÓòì!t[i‹®Ý¹4†²“hT ïäņLŽ‘ä,ÏÅ-¤õ΂+nñƒ«aÖdáóy‘z ¹'§ eƒ˜Æzua)Já½D[[숩«Äáq\J3mõCoߟÓÝÐ]Þ¤rÐÏxöŸJÀx’¢´ê†ñ <’·šr!z)—'ÕšŠ …ý¤qÄAü˂寒Ú}ïýðˆKdÓcc¿tïpdÐÿÞ‚B©ÛÅZú¨ßH÷Ud‚‰ú.o 3°È>h ³¶>×&bÑh˳q(ä2á‹DsµŒ˜G]ìÓ|jŒ¯jÔ"딨YHÕOwj„ÜnÅD©·Ò<¬˜9˜µ„)®þ¦T$Üj}`G±ŸÅz½hTfjD¬oôép@1͇¤WE–yZ¬"‡œ2­óó>´eAŒÏYJ¼œR„Ó©ª'¤ÕeQ„î÷¯ÿKt¬d`´'dŒý›ýŠŠd¬.EžGÁY(ìÜšQwüÝi9>ùÝQïkgm1ƒjÊ'ŸôŸøUÿÿ?)£ðV1ç2&Eüýü©þô+Ê dôxy0Õ·ûû[t„}’]Pä“ zÄxäUmóIáX¦á4éÜ€Wåqe[i6Cšøvaå¶Î”êÇð÷×’…lj²ÞÔèhHÅøm%²è:Uõù„KØ ‡ÙÍëcÙÍkÞý¶›f|b¦…è®q;Ä~+½L®Æ´w›P Âý p‡<ý‘—2œªóÔ>(—RpÙÒ}6à €SÆ¢kÑÒAÚ5¢EŒ«‰U~û‚¸íγËÏÏÌ«K8g‹ç*þª-8…Ì÷áNüÜÇZÃñË¢k J–ÖV¢ÄÜÉæpÆ‘ª•¡ \}ఙ𠖷wZÿl#wåK°àì×½ââ™í7ÁfÊ ßž¿ù­ƒÇ;=Z_Éߢ[”îD½~³ûO¯É~ˆ¥!_jüîàþ2‰†ÔÑOîA`Úû,7 |6+'ÒPQ §mdléO‡ŽêÉ&JÆcŸô¦Ù“æI³“)j.²©.¢ºž¶þJ‡à“Üÿ 7ÃõúHN•cRYS![Ô{…3WÒ…ª e«t¤ –H;pûŸ¡Ý#qühá‘÷v‹,€¿ Ásf|à\ðž0ïÝ-¡Jn¥µ‘ZÄæYk^¸CšàUŸQ›·ã«¤‘* >’ÀäBèØE8ª§°Ro•™#3Äjtû£ößÅžÛÕÕ…Jh‘%èpÉ=óq&6½Ö(Ÿ—ÏkrüÃ)[Çé톜ûÛeõ qÒ;iнUVKÜ¿Ž/Ìõ5ÙW³9Œá¼Ù‹V'z,]Ï£ð¥þV„$¥ï$¡˜éc"AíÄ¿@¤±ÄkYN³¾Ѽ¶S[F3 ¯eÿ“I4û¨Eþ jºòÉ,gÓe‘ 5ϱ• 9s÷IˆrÂ\±ˆ0Z²R¿ÿ“üE?ÖhŸNù‘† Öù€‰~—‹‰…èôMÊ"tK – ê›ít*ÄÐë~¯8ØvEÌkiSn¶ž(ÿƒã\D"FîDªq»—Y‡ËZµ¿].é@Óš) IÉr°T®‘Æø{ùÁ3I‰É`Wº·)DFWKš—±)¥÷ ½þ9ãÇèK.8˜þBÈ´½,Z+Z’Ntc‘A¼s%è<>‚ÅTy 5`ª_©÷î*k9Þx|ôi÷&ø2ŒÉ²ºµƒPgB°tz7 ]º¼!aC6¡Ÿ× °‡‰×KÛÓ×mÙí–÷·‰öaÅ¿?› BRmÙ$úZ1Æ¡AýtáËØÇνÔha‹2 È–©òk£, x±tݤKÕJ‰MÓÃ1Ø•RûãßSº޾„3H÷±$fÙGn¨†ÛÀ^9Ý>ŽöÄLØÛcb(¶¿‡(:v‰+ñeéæç•ëçBÄ„—#eÞú)y-`îë»·fjæsBFà¤xÛC¹W1ÃHUy¿«¢Ž‹›ù >7äØÕKÿ\y×Ãæéáâùµ”ä.–àBÉ%¬G¹ÉÙ,ôgvªZ5ù‰”oÓ³YèÏÕI8øiõá¾iÀÀ?òa¬pÅ| , ÌszN NSÐòŒAËñ1 ·ê“òô@Ù‡òÊ.Pv&8ƒïA|H%¬Oâ6°â+Ýж1`µ§Ú¨$ý¾uQÅÛb-•“ODºƒˆ_¸Å™LE¦îáaE¯ÂÕ*ÎI\v ô/ÔÕâÀû›·Q[­ïâÁÅâæYqV„þ¾r_Ì8ŽÀ?$äu´®7nøå>Ž\,‰?¾cši;‰qëGZÆ0ã Ã㧯óõïøøõÂô¾ˆËr’ÿJ²\46IfÙï)?jŠR+hš)M²±ôÇÒÍ—ŸÊX~•Åž%n+ã«Xh¾úàâó`< Y§*B‚^@ûrþ¿UU“]Ú+×çöC×ëÌë~•¢Ï„ORSÍ€À¥¦8“ÄAðôiJ uÎ*]ǬRóxRI ý¥Çɤé#Šö|póÜï+ëø”÷¾<Ä$¾LW‘ÄÅ*âíѳßþý3øÄѾÅë´. 2ïÇüÍ›zð7\‰Äþ|wÕ™éˆwŽjƒ²äîùÜ¡ Ãañ£’†Ñi/®¦W³þ—¾Q ɧIâñí=­%`:IÀœ—3L[›¹*F]ì{ƒÄnÐ!± Ujã™/B‰vˆÈBúƒƒÛ7òSPFSͶܭ#•>mg“}Єj6.ñ;VJÁ±¾Öc­²h|Å>t½-‚†‘!@µ÷ - …’· üÓŸ~ûåWo>÷[Njõ3|Xõ÷¯ðNsT,oιÔË'ò‚—n¨Ápÿì áï5½.äj÷ùk…!¯Îô7*¯»’³>OˆªuÃblx‚2âøvFávÓt„,S³¡Vg«BæÒ¯Š´± {Ÿš³4YËÂÕV©¨½µLfMÅèW~ÙÏ]·½jíP®)Ý0§'¤:·\ß#==S^©<¸1‰Èš'Ü~4“©òü`#àu¾`O;·‰—!ÖrH¤¯þGÖp»¹Üý±”ËÕ]§|b8Äw[ÃígŒê&êšýak¸Ä“,ñ “uI#]ìåSŨ³Pm‡é™¿G0™Â´¸U¼eexˆÞëôTð¯Ð¼#‰uø\ðEÓ¢¸÷ý.R1²Ú¬ÑRízÛ·'°G-îs¼j0®‰Ÿj¯cåF­?·Úv@‚.G,g TöëE¤l®€°_XAV{›b—˜#k¶ÞŸ¬Úà¾:÷­“žb<{ÇÌ/¬Ÿ!ö±±¸œ¡˜0Ï›@ÈÅ À…% ¶ÂÉÆ¦$ш6JcÝ*f¶ˆ¨ì:‰A”††øìŸ?#¤@>|ðŽnÖé³Éˆ¡˜æî#¦ín«aÏb%f°=ꮘ HÑC„ÅÆìú½P]ñ(feñ±Q”: âêÃG#Ýû«yÇ{)~•Ï*j¨‹å‹ñŽÐ€*GæÍÙˆŠ<1ÒEi]ïI~ºSå*zèi^ª}¼ëó œŠþ-©Ç3ÿØ[B–çz‘È,5JÜOW…Çi«2‡£ª¨Q9ŽW~ï£×LèZ­é%©¿S‰x+F39«ñŠêMQLÇI®qDž•Œª À%rAJwÛÜèxïEÝU5#^bÝp \Ã8£r]%§LPFÁº4Dý’.u]ÔçýN³V3u û™ð.W{är5ærµº¢ärQmðBM2ÂF‹°QuL» Û='7Ÿ©°œ)bÂaέU»Û=Sæ5âÄtì´"ãÓ™‘g¢nfùC×1ÁÈ÷ì)Å>eªCB½×«­¢}E“‘çü…•÷¡ðëìê»~zÆË}ÂáÐ(Ù¡l.fÚºŽúÈP]°wÉF\aÓÝUÚ»,¶hJ’nïÄT°X¨Ao™|PJÐÜ©êqöËëËW—nµU0îá øØ#»Š4ËM=]…IŠyÎZ§;ySæ×øí§Î©é¡swUí».æ*QšòôW˜¢›h ­x}#B)ª`´rÊ”"NOwù‡õÂ6X‰ü·ðMÜÒ‚kîG©‡SFdñîqö_Á ó,5ãVä Ð`Ôÿï§±i£ZìYƒ‡We>ˆOñ²1GÄŽÜPÕ‰2`i"â=6WÍ2‹ªK=q· !%«¤ÄK-;{`D8€Ôʵò¤7@0ÅÐfDQãÔ°D¸V}#/¸cF;þ•”Æ¿ ë^è¼Ç#:°©c'ˆ–1Êʼn¤eÆè:ÅRSCŠ ¦ü¿å %Ì0¬y%f‹¹»Å!©Ï>€ÇoR¼´]KL“ÚÂÆäXÓš7L, _NA|LçïåùD·P¨ß¸Q ¿cæX$³,árzÜ+ ëF8µØô#>§Žãì2a Èó¥Ø °Ók)\YDÍ2I¨ptT¡v‘Lt³pë[ñ@üXÈÄ”T C¼‘¢‘'ñ”4jNî{! œCÐjaJ;›i¯Vço~ñ…ôªT‹[a†é¿ÈEÕ FÑõåßöÔ‡ó*uV’uO<{Ž¢qÚ Z:ÒÞÛÞéü®t1*ª+@% Δ«P ŽFK õ¸ášîï;æmX-Œ7ôzëCwéXôþƒKÜDDS~5¾Ê{ÿ쨟bv6+ýYœÊPÏËPƒ©ýš PB¦ ŸßN¸íîÐùM>Ñà†x@xÌßÑ7òáÆ>ÕIc£Užé÷¹ÅBDŽõoß|öšØÌõiÜ$¦ÏüÓŸÞR÷e?$÷t‘6ýÛ³r69ÓŽïY“®:ÿ•Bÿøò+¢©e"qª±}mCÍùÜåxÿÄÞàêpwØ]þšN=á%é7Dü´Z#n`V~«¡ßêŸóù×½Óã_‹?¶r?Öÿ‰¼þ­DõÃåžŸÍÆþüQÚùsc1ô¾+ê ²Jʧó´v0gõ˜7Á‡ñ÷ÆEüô„ÿ;¶ç˜gó®¹âÒŰ2hˆg'b©óz™kâ`AE·!>ÊÝ}7ý³Ä¶ëD[ŽûH'ùJy¢2Æ•uø:Ì~Ô¾“DÇw£¤t¯Œ-ÙL‹µû1tÁƒHD;™¥ùjUYfñ¡ö‡lì8nôA\(ó¼ü ÃC]øŒç†9=ndÃñáÇYaüܸü± 9Ö/ÛÒKh›£ÿFߺÏăsiûš+S_¬+ëÎiÜ™ðëüF,]ø`-MÜ”F¿Pä1…âCØ4ëêr­ ÝNFv»©n·ø-§¶d›w¡ÖÊDz|¶+[ú $ vlSVÒï] Èè./c2J-DAºUmn¸éé€Í}”fê£ßÆD²Ü/‹>ÔÅ\ìõåä ¯2úMš}Ø7›(ùr©JeøR¥¿ÙúƒË$@1Ú¸x6&ƒ¢GiGe±) ]pÙ‡Ùu÷ƒ]3@Ã/·› Ù€k5€þ“¡ó?ë-2‡¿0ý¡Aç÷^[’>Ê~¡»Á¡Ò\¹ZJ³66në»vÁ@œî¯Iç#8n‘i½cêIî ‹|L*‚ªÄ@ §M¤pú`´΂6»øÑ•|þZEÕõ'‘™Êp»Á%–…¾å-_½ ÆH»Â¹—­Ω‚U×Ö˜ Ù _üÒÜy];®ëäš„µ\j]$šó­Ÿ «D„Ûô„Ü8¯¿ÿGûmF•ù»ü®Ú¡ÇO†?)ñ¢Øc= Ó³IíJÙBéé8ÕåÆ4s¿þîƒS(G¥ÿ·Ë‡ÅréÇ\fã,= ?T«K¶8{?ü2Gqèõ_îM¤|­R™*é³¶ýVxHü©2û®p#>E;Èï7©2¬¼À6jÞðÀ xºÜ€KçbK‚>Ï’ðWòç¯þ¹ÖÜ@+oá¸$MDz¥0j±ý€BYÎÔõéıÿø?ÉõkÑ{–%#£L­j˜ؘ Õ’˜ùe¤1p!Ñõä>ô"øU£¨ð0Gc¸«ÔÒ~'ŸÉö÷ö‡îp¨Do²Åøü¬;¼Ä©ØñÉÏD­v’K\Æ_½GÜô tÉŸ‹VBæwÝ[¦N”W3ÁÙSQ1È“ý¹¿©ú;s»ùõuלé ’uyU“]¢k«…¨Ï|¿W}#Whž²OÁ\±à×x òJør™EIoŸûÍš¨¼j+\cÛÑœKÒeÅÝëíÎ 13¢¾ôç)™×Ù£2¯¸jçÞ*’>JŒ’Øùß¡íFj“cQh-Z/k˜`ÉÂI,Yæºyk­KƒÞK”1èá‚— É“ýVu5hås»± ÁTgxAŒ¼­¤ÎKh@E(bãáŒôÓÆX+¦Š}3MټΒÛèr½]ʽå ã·Ò—”ªW–¾¹ÿ¿µÒŽ´N¤”Ký¹Ÿñ«àHûÎDB]súŽÂÁ}¢ßÏFÀ‚cäx‡rv¥˜/~îârC,Çôƒ?<B¶§ ÄJÎY ñ‹~E/ë¾\ÁôÚ»úî¾»Γg7Áúü ’«gqj#8š‰,4þUg§ÌF5†ý³ÄœÏ´É™Î¼#¸öÇ&›ÍóÈðÝOÆ®Â^?C?’P¡þæCb.üªÀIü,gøhË"P¡äV­Üǘˆ÷ Ž`ïmþ먑4 ~<ƒ •ÈcÌ?.^ôíéWÞÆÈ•¢W^WUŒX5“b›<‡M^ô/A/CDïÌ~Âäɱñ8¦,DK5f,LÊ5V}ôm,)Z«ÕÌBVTny ì(¶l “µG£yľ5ÂjÀ–™Aß’¨Gä›`áç¬ô]®u21’²uDæÍmÏ­ùy'M°MJ¿å6޷탃$.é·œŒÖï9´²;S†¦&~muöqS~Š©Xš|>%ºcKSdÓÂþ&ñŒóYÜ›¶7Õæ’kîÝŠgNßMHqŒèÅü·ŠQb-°ÿ‡/ˆ„$®o-¨/Ø ^°r}Áe|»)^®DûB¤ áµIÔ2/]ºÍ29rçé%\lI(³É̽ûj°¨ú ¿¤Ýà±—»«ê굚`W?v î“ñ¼Hš½èà®a ùtfê%+ÔK©÷W•Ô¤NSÖASàXyŸ˜ÃŒ¹\üzøêÑ2ª¸Ó®fËåH.ЈlgË.°€-”›¸&Âwnx#H5—Û"†…·Ö<%8Ø_qˆQðˆý”80] U» Uñ>º¶}TNæ§v‚ܯ:YûKõ…õ~ÆfÈ‘¾¥À€;*÷GòPàgúÀ" ^mÆnƒÆùÌ'~P—'œôÞI¿<éA„¡·î2+â°Ÿð Ôe7“–™Ê…îþ>’þ@áÖòÈ ¿ý[Úýî\ôÞ?ö‹ýjkN¿‘VQ^·ÖàÚùìrV¸/Øe{ážæNì„Û©¸À,;›Mý9ù—•ÖfY,­Ï$,i®3ì¬1»åº*"¯‰lÔ`U>vÍ ˜Ê‹Â ª¾H©IêN¾Ñ$]bì¥óõÌy’}ƒ/‘ãYÁ¤¡=mÓ¨EWQ›S&¥Þ óÜ ôÃSí|Ü…œü†ß2@ÞUšú/ø,=Q’fIBY¦”Œg#Ëòa8;2¦É· 1µ*Í R-%+LF³4Ú6Y µû§ÞŽsRÖZ%é`7B‘ºÐç­,ÛñÏÀ¢XêÑU<—ºß+W/¹£Œ'©/ l  t¿#<‘–²?ö»çÕïâ¥Ôã0ïšÏ^~öÕûóŒÚX|ÝVþì‡öNòýÁ¥WñF ì¯YKÊÖ`èäj`ìËo–ÛÒðWFKIÛÁµmHÕ’rÏùnÙ$ÕŒl6*ýžë‡r×Ê–Ãÿ>uÕ„l.„Îâ<ᇸ۠#žS’ôŒ¿á!®£AàËÈfÿªèŠûíù¢¯–ð¢Õ 1¹öÞ3ç˜ ØÆ;Ì¡§6L¦è²ðžD:ˆä Æ&Ù{[;¿H^Æíg« åZ*À×€)t»í†~p}.ˆ”?’n…GÀ1Álî#«%£:ª‰¡~°‡r-!uOöB.è˜iµTyô9Ö¿ ŽW 7ëŠ,ÉoÞ¼ýâóoß¾ùן½ö÷C>ŒcüËŸúýË7_ý) FÀ$øi°Å]ë¦5ƪ?êË c¹½ëð¯bá{Ïë6’/T•†/Nær42s»¹É+¡·6“v¢i*-Îl,… Ê€­E…¨Wi‡tˆDµ”¿ºêHMŠˆÑ<¾WÑá@»@*?àÕ•G0ÊW‡Clfi†û‚¶M4…P“0^Ê”ýX*ë(éƒâPûÆ1§ˆì î~Wé¤9×IfK‡­^I kÈE»ÂRÀ²L€:‘ƒß{÷ßj„Ë·äÐ÷~vÃÛƒ ^Ôœ¯“Ší²?½A0€òß²SÐ9ì‘vÑí¼X› ¾œ(|7W­”å"mÅx¬@›öŽÀzè˜r‘ŸcKÄ\»ëV«ÊX !ŽÊd¶d²êž•Ͻp68pŠ ÇõÀpH;ËgjÈ 6d\Ñæâê+”÷Úóÿ[ 5×(;Ã…bûÇ*–h™T!ƒµh%Á å)A o±¦r&kãÇØí*žÒ-³2pá Ý€\Øìb‘q>;+óRšîβ)ô·Kn¼®Ï‰Zéªÿ)þß?öýgÃ?óaÿ甩¹<ð ÐÀÄD@?@Œ¬äÿóÑÁ…ŸøƒÿÔ›ÌsFe`t%XÓÂx–y„¬dþÏþØû-x`x`,tz²J j:›ÀRøŒŸWò‡ õ«â:þ´ÚÅZ†“SÖðø¦sÙttj’ôAἨÃÑ||Q[á|Ä#teÚmÃûßXøç––vG ’ÿp©ÿÉü'Òá6ÿïÒd§ðèÖ˜6Iµø,13r|ü „ÿÎ’þ”½ÂcÛðØ8¡£®Í[4ÿ£éÿí3»åá±w’¦¡£}ûøŽ ÿË›L OÜͰœŸÍfþœž*çƒûkðú˜Öùgî—ÿÅ­ûŸxT¤#>æ'.Ôÿн=õ”sŃPÆìeøð¯Xöð?½pHb:Vÿ­”@”жûNQŸ1ÌDÐLœsYúÅ[8tóÉLiê¹f×ÿÃ/þ³Û¬¤O´9Ÿÿ%Pz‡ø6ÊÇ&¸uÐ8éîÞÞ£9yGðט‡Sc¨: ®`Æ\å"P§Úk-*Èi#_2ÂZ†®ê€w8ÄLÒ°—AÔLpF›§ÿþï0.à’à‘¿:õ¬œi*8£ B¸*¬,‡©>w祥óÒZkf6AÜ)}ÆP¶È}p¤Ï‰ñ©¼ ¨ˆ#ª&•* —èÎWÒˈð½F±›ÃºÞŒf®þÚݲãL"ÚÁuyÁ_QñÑAcâTÉÇô‘':N×›ê¶O¡å³ª]åÿâ»ü¶Û/!`¹ë±ô¯ñqõÃãv3/­â”ë¢)­mJ% øF„K¸[…¾Žûl¸ N¾ÈÓ¶áMÚ<¾ICܤt»È8À}…õù—_¼}ó_¾ÙØ:i²94œœÙ+¤çµ{¤;âêÙd$™§‰lÉá¬ìèîx/^ðÉs’÷ÍÑ6Ú_fsÏ£JÅÙðm±ÓÞsŸR£ßP3ŸÈ·¾cÌ›¶%2¤¶ï÷¦ß3K}üþóg“Œ0h¥×oã?¢w­?óÿê7Ñgö-Ùúü‡ÄZ>}6# TNõ$=Ëò™Kö|ëѧüÝñtøÝ6Öü×Úäk“ÙÑOÆfšþ~˜ 4ö¤àûSê)H6~ðïÎGþ«)n5Ë‘>wÿè¿Z@‹ÎþuOÍ‚ñuÓQ÷ÿš¼q‘åþ»Í=n,FÜÿÃ2Ág3K”Ù?ôó•—‡U‹úÇ?¼ÊÐéØ :CÆ1RH”ƒ ©;iíÕ§Á G…&ÊŸ¹,© •KmV÷UµÁ«õWŸ ùß~òï‹ÕâŽ)ö¥Ósñ?ÕÅ{ͲyBR¢,®ƒ€žÑœW§°Õ¹té¶ÑZÛ;ß)‰™K¿’PI¤·Ð)Qðý‡K­ STÀ ƒ÷/âr'Úëj±bXæ°D9"**æ2‡ø~ߟ™Gôa±è¼ÑÚC¿´,ÞMè%ÈÆhðHH;e¦‰P:6‹Æœoë÷'ËÇ”Ùdz„þ²Œ¿ !~+h‡àäåÂËjÛU'œ“ =R5 ~ÃdŒUpgA†ëJôRŠÑ1F[2 ý¤¥€NàJb…ñÄ<ÝÑCï˜ê‰ Ú[Öm¯>-dqe [:‰lš­„Àf+Ó10ü fp‚Z“-d1²›ÿÖd…+Lp$Îõªsôïýˆ¾MG4ˆÅ‹³Ù<П³±øË;å þ½‘—ÏûPcòöA9¶ëý³þ6¤þéóY‘v>Ó3ò ð£¾|Fįòt@Óƒú•í?F2M `™à¨‘ì.ý—*ŠbÈ,î %B·}µûNÛzäø&_ŠRQ¤=;õÏ¼Öø,²ìJORç9[©”ªå.íA¬ÔÚÔR¼xQ½ÚÔ¨£Ú êìTk™å£>f#c¸½£ß.Ö‚› q‰A‰7!€ÚýI%§n„±jYEy9ÁÌ­b'¼Æ·™F‡Àø//@ ”8vü;ª›Ñû¨nßB«§ªþI."yY\{ pð{ª3&þºˆµ“m˜8DD.- Þ‹4JT{)2¢Ï ­¿0íùàç”ðά.LYD[u² Põt •çdë êL›õJ÷xAxJs×tÊœ‚zå*ß×m™>W®ýø…F «&„üay—ÊÉ»Ñw¹QzQ’wá.`5¶úÓËß|ñÕ»gYYòùû“¸³á#Ü ‚ªRúé{>ɉS¿Ú|S} "}ˆ­Šõdñ„õ1辰óæ)¦AÄŒ÷;Ú¥Úzë×9Uâ+.žÀãš+Œ&‹n;94F;"ôƒò9/ú.X˜1=.¾^Žä3Y^e4ã|×DκV›õ§”zUß舛d\È‚Ìò,肼zõúËwÏæ“dA¤AíÔ‚ôütÄ€EM¹ Æ 88ƒÉÖQ:[”³™¨€ >`D E–‡±Yñ5êdUF”üIVùƱö‚ €ŒH57wÕÇæŽá2e–î AneK&±ö²\wõo^¾ú¿_9œÄO"AuöK&ãY¸R3XrŽ©Ì’—Ÿz‰µð¬ÁàmFÁ“»á] P¨œÜM%ÍÈÛ˜>éo;ñ¹»_Lk.½¯4?(†.r$6çã©LF9/u2^õÕ_ñ‘NƉåtFrŽlœk'«ˆýÃI3(U3-:ÛÇ£ƒFÓ†¹˜ŒX\, ìƒ1ñ¯_Å+)‹auõ€O¯ê ³Š•7‰½»|$y…QL…¯‘ÜÙ4#ÊÔ ÐįJ¼Ž»Ôš²ÆiÕox7€>²_iãß®ÈÚÈIiγ+mý‘ôB]ŒHBºBÇ}”_M9+”¸uþö¯¿úÍož E6º^té&ÄísÌŽ%=Ùµgg©I´Î"·„l¼6®ñnÀ¾ËÌs‚~•fµ4Ÿ£úY‘3ZTÓ6 ñÈ&¶Þj®ö³±NÉ›Ïß¼û´7§¿`Í|ì§ãZŽTD\GØÒu€T5Çåùž<·›Sè0³ WŒAáµMpÕcFU¿Uó‘Llü‚'…dàFF¬us>™ ä­˜N'ú>Ÿ½þ¯o¿|ùÕË?HCölr´¼,Æ”¾R€Ÿw-¸å&ARN_ñˆí¹ðÌgý6"¤î÷82׉í—‘hÐÞ )¯m2é!À'½!Ì{Sx}þÍ«~5…iF“Áe%L‹îK–¼°[d/'»ÌÀÙ'm>ýbŒÇÒÀO§6•hºZÅ©ÙYá¿]L·R¢=!N[o%ðz!*lŒ0fÝéݪ¡Òïé[z ÷Å“Ó>ÑýÂgy)ÝàP.ŠÜ¸ÅÕ„u?å±¼‹cÙ+ôò³øï½ƒQŠƒQŽÇ³ do Ý²ÿ´ª÷k ߨ 9Îêg‹ogš3yâ4úxù_ñ•³bî7e©,mœ³Þrþ€äýý-¨Eþ*ŽK›²GWÁµ©zÄâû£†1Ìá¦Ç3‡#yâ´Õþ´Å–ma |ùÕÛ×ñ¸I«G|³ê#¯Õ%@Ý…hõ¥bÔQ®•Âá l¡ÿywpÂŽ®·#!Næ3ÓÅ3³ŠgÆ™6HîKýHÎLôÆGéƒòl> ýŸ³ù©R~ù£}Ý<•_½~õE1‘¾-ÖGyÐt‹ÌœÞÃò*ÌžiïHVq+'®ìÞ5ûrÕ@ 0vˆà"¹‚ŽêIǬƒcÔ3[þ3˜óÉt¦³òö]ï¦~ûu¿É^~öÙ¯^rãÆl–ÞQR›ÚPe¤wÛõqyû‰2Ë…šZ¤Ñ G>¸n6ÃJ iä˜)„bWo7©ÁHpf(×âÝo¡€ ¦£‡Q¬Ewù݃d. ivœ3ánSÞmÀ„§§|/7ê§ŽžýöÃ(36[æµpj`4}tRsádPE@ÎB3cp FB Â,;ªy½ þr?z9$wC}¢Pvôþ…ESÄÒ(©Æ—®ØSë§^ å A‹è09 €Bß5Ýà á­AïÿQ8;h¦€bnIã]¶‹Ý³lžóÛ¿þAT¢˜>DqO­ûÍ%šöä7ðŒ¹/×Ç줊ár?¥[˜ $— ÌZ¹0 ÉÇ÷œ“¦™;¶v¼Ÿé4²¼r§-•’^Ÿx•B„:s:%E“!QU‚ÕšìÇ¥f&’)sñJ”ùZ¹1+: D(%Ì,>ÂÌ‘ŽC0]Æáé’¬ºWÑ:ɦëSïóhªÂG‚ȳ~LlKX§qy1CûíS¨°ª—'eŒ)å¸TÔ˜læEÓL1u-{=ȶ¡c=ƒp\úkž¡‘ ªš$<¡zŽb©b4N…³ÌIŠG€ þl©p\“¢'¢ŠvÈŒ›h†VÄ0¦Á6…á–}GÝ ºàMŸØo£8”C—°LWI‡*Óî“l›tšôøÿü˜hñ0çµ º¥{ô$e ÐKž­¤R•ä“™M?m ›#û;Ò$7w¸÷Ý·Ät»¸¬T¨"‡½ÒkGî. ‰jæ²[ècùE§ó2z –ˆÅ"ûè½ÑÖü¤6—þMwq£}Mm´XSGQNélË\¶ì(šô‡h#_—x“d¤¶¦O)C -ˆ=¥“JÆ‘2`õh¢¶ìR*:Žo÷Ð[꜃t°/á·fw8­84¾âPk ¥±`%y‹iqìé*n_ÇS-p~ô0ÿjG‹N³‡+^3tµ\>D+G¥ËKJu%é€,ÖÅ®Ñ ½Høº$þÛlÓ©ÔÀø¼©”Á/]’t K K¾×Ê™ßxIÄlsL¾9©#kôF8NI# $¤‹É¨HÈÁ3‚™œðáäý’Vlñ‹¿Ö¸Geº @&ç°4©k0УðPpús¼„<é º8ð@–Ò„ˆ´øˆ'GO 9ò.ÌR’iᬠX¬V¤­,1 tû—@ñRµ²|V¤w(bT{´Êý:_÷W½›£|:u+ù+À…(LCtå•d —)%Ž)ËfœZiÉ „ã•n ôé•nd¥[%”$ OÚr»¾¿=Á¸Ê>&áLFQ8*È8Ú1é²³ªú# 2h Ä–ý¨#ãG@I4 ã[,„t™¶OV^tèeٛǖV ·]?Ìf³Ý™kØ­AÎ2¸NÞ‹ÉÞ˜ñ-tOæSéå6ÐÀ8‹·çQÚÓ¨¯V(M>;Úœ*:âzþ@ò.ü)ºîMs)Üñ¢ƒã}ê£ËØMæ™ZæMoÅ÷ñªüÝzûv§Ï[éÌŒÒ.cÎNzÇå®rf8âw¢4×Nº·yw%…ì~‹Q Í–…µ^…Û„3wœŽLƒGc0ðOn5Û#'sËÍ©K‘ó_ HnÇÕãÕÉôvŒ—ÁT¹T¦£”ál "­¤zbε8R˜¢f[éÈ}!ŒnîÖ>#Âx:!¡b;P²7'raYœŒXZlþÛeYJ¸ñ‹GÐhÿrßÝEïuô”9Æ2@Q ±eÈÚqЬªòTÆ•ñY$èÏÑ¿ Ð3ö€ž”²I+¨’ßËά4D̺ó–‘'HaZ•ðEp—ôõúüÉž:Ù‰Ö¤PÄü›—e e¢Ø :ÍNƒ•õM<Ï“gð÷Pq2Oø°ËSïÚ!¶ë·hÃyP1™á˜‹D â>×ÿoK˜¢•Äó¶œó¶äîýÖU} ‡5¸u*{õwJ?Z|©ñk÷h·ù¬^«ïÏ÷Ä;?3nÇñÑå GòãGÞ <åKŠ1V„?òj~åD8>²™{›”nñ#«•ÉvÝy~ó£W¦ PÀ—WêÔ´ï= ýZYjrö8/³F‚èã‹”%»0¶aÒØ‡[mrzìÊEÒ/ÒP°Ð™‘3"ùÊƵ^˜êˆ”†&’íæÍè㤱8К‹ Šw)õY!'Úl^_Î"êZ k‚Õå3o«fˆ·ƒÞŽ{;bG4ü)¸¥[Я a|‰^£·]ÚMýV¤•ßDŸ í÷åêX¢dP|Å1‰ötOùI0èõµèñ¾Kóí£±Ã…Ã;#›†#´ºç7/ƒüfí¢›M¸N¡¨§ªM(›ƒ‹‡6<Œ n}¾˜Ít~ _‡A¾²¹QëÈéIÛÕÊ/? /7k¬»;•¾µ¤<u\! …å5ƒr¾gnÊI‘¶¨øÓlÓ±Xß } Ë>¯=àcgŠˆ+ï‚za>éK­ä99ÌÓÉv®‚_–¨ÐÏ!¹ïdmKŸ´W·õÍRå#Ò‡³ŠÁ­_ÒÈw½@ô¤äVMÔ6QZ³× ´D—GAˆëéêLVÚŒÏa§Þ;æ}{Péýùæä]På—ÖR¾£B!ïžN[™fÒ“v×+Öþ¿"§¸ Vš©'ôš=h|mH7xõƒ“EÿÉ¡·Íñ? ´TÈþÏÎ)Eîe†˜&ŒK¡Ì×€j6JOf™í¢qŠ(>f·kš³Ë/ t…¬‡´¾}•˯¼Šá¹m•ÞÁ 3ôkzhìÙö ~šÙûŽ,¥]Häö{_©n{ÆÕmîsŽî 1ðs—Öõñ›áZª7]1çÿù¼õìÍKª'Ì ×–ÿ k²‘ɡ޿8øº¦M7P‰`.•Kßå^Ñþ:öK„XÇâÆ\¹ÇWî'¦s˜ T€˜„·œ¼úéí«ãn.õùˆ¡‘dÐÍlüÝÞ¦ÀO,wx¼’z“ڙРÀ@v)&¨Þ>²ÖÍL@¢EKÜ%$x ÞÛw(­¥B«>ŒÈÛ‘¦3ùµpQj'É=ʼ^ËP2¾dB&Ãå=r*^Š‘+1”NF¬0X E ÄjÚ蔆;¿“5sj- ›pU@2™FÔœÇâ:=PÅÚõ’e)Ž¢Öz®úÒË.ÛìeWš—vƒÌ¿PWsN£p‹®ØàOøçkFÃUÎâÞê8]ê;Kø&ñ›á3Èä#kF›¨±1xc ¡쉱F^²!LÂÝÔ_|±áCEx^ËÕ?3¼¥è“èRZ3PÍ®Š«Åò‹Òq§®J®ŽñZè \ ˆ™½lY«8-À¶ScÊ–PÝÐy„þš²HøfnX®(|+‰ö¿˜‰qi1Ú)}ìôêz%„!¡Q0ž…k’û‹ Q£Æ‚  ´©š F °VŽÁbéTZ w|(`l8u߈ÓQEcIqí¡X€¥„(X%~’¼HNŒÌÖKª¡(Žk´«| uÅë¹m: ZTØóz~îÿí‰6z™ˆ²Un-Qé†ÖØ…x c9P' ýܑ㭇ÕXÞâ38`ɦ.ñÇ%ÖCWejì5Ðåf(—XMå9©9ÈVW  Ï{ð&¬Ü`‚Ú\ªw¬¶ýà•# !ùEþIɯ$Ä£ŒnÄ/_ñÝ‹óÞ°fcGUY "2/5NµÐl4{ÉA»ß©÷K—Á”„—&qǯG«ªý—jm¡PA*è)®†ÖF–mWæ*ÁÙ'riƒ£‘¥ý€Z&N…õH>S ƒxr`9xŽVGíÑS„•5“ŲZM‰+R!»‰Vá$`Üý´\¬Ñ*«¨ÔÇÛMÀÄ‹Ì;–¿ì‰söhÅŸæáÁ¯ˆ´# âTˆ½4!²YUeŒ9kîÈg‚’šÇéÌLjþ{Kö¯ Ù¿;å(ÚP+ò²ªŠc ’M+N˜J×ÜpBuégŒ]Ën­t)ÃNŽø6쬅×tÁ0“otâøÔ?N6w§%HF+y™;„:(9IW…{‘x‘ …paZ½\  p‰½"  w‚>q\~Ô£{'E&|1nAi^À×0$h‘I· §Òòá3@†H2U´„J@h0RF#%Q”tûI”(i–(몰$=_E4eôB&tÙÈ­ÞI{ÞØÖ‡ÜšMUb)P9©§U  €ùU¹ìpÊ NDCz-7ˆÊi»7ƒíjÑD 4ßãÈÚ»°ß…ukçÓŒ(Ñ…‰´9¡š òÌ}?”«E $a~P`Ânû±Hy䤨K×¾8qŒÏLí'ç]*Á×9ç muH¤M³¶ÀkÒ*ã致|ˆ=ù=ÿ&…?@4¬{CG¯²®Öÿ51Aœ»®šq¬NV ƒåZÝ~²p~½3mñÀ4•°YÁñçm©×âhVÕãH5Öá)¤²bo4YóÌ%Ž$1„·°5¸®ŠQ¡ó #«„ÄjûLI2|üØð" ¬ÊÇŸ3žÃ8`£©ØëÅ@jÒï'KR걚ÚÒÞgX…!9¤-( ‘ê÷š i!íÝêù®æAã3˜–å¸>Ž”ÜJ¬Á‘‘Ñr °P—€<ï(ŠM’„O©ˆ|gµ5ÖCJ‚ŽÔN7†{Ç$䣞̽4”ýÒÑb-KÅù3†ÜÆnå§Œ/ z-„½MÇkÇ>ýC'HÆH¬«÷~*Ñ'w£Ã•bª›ªµ[6vXíý‹”i¶ÌØæˆpZHàǹPÐySðJl´2FTšîT©<Ó¸ =ëÐ}Ô PdmÁ†‚ jÄç®Ó‰ÑòIÚ6¾/‘«v*œS$Rø&3üWðẀ߯=F,ÙØmüFØA°qÄÏEyNž=ˆò'­5ûñ´%œyªÂXŸÃ{&‡@RA~Æm™q¾ÑW – ßë]AC¡9çD˜Ç@Å(5hTfh‡÷=d¥ýßJ%Ø”ÀZæãÆg„úê»áh´XŽÙïVQÍáuÀ†È.²è5bç*¡!äÃ7b|1 TJã`½só>À‡QíÒ»'ìƒ.ÿF2ѰOJˆ¸ÁÿmxŸÀ`VÆYLnBí;„rŠ¢RéØ:!ü½§¹fuUÔJ"¢4¦5¢³#c!ê‚+B_–®Wß&@Sç1©ëM±Õº™SowÓm¤áŠrM¹hn$*ùãðv`hqfU=Ŷâ …KÜJÞj`S€†]øf³ý"pg‘5M©°ˆI8=yQ#msà5}t8Òõøi lL¥"|ÉqOIW ÕÓƒíÑ;Rɼ^©“ 0ÔpÒ<ÖâÄ0LÒ†–Ã{ mì‚ü ï(ÚØKÈ/ Eq2Q°‚#‘…Ó\IÁ¡Þ¢¹”Kx¯—ë¥ìîÈU̲ k9L…¤"~P©9É©¶+]Ò&ºÐA<5ƒX@%_âºã@ÓµTªI?’íuLCj´ã…/•žv ¨Å¸%É ¼Ç%xå©× ‡Þ¢ò‘>ßô²Ú$úÄ¥jÙUµˆËë¨lk%$ áWqœŒ]"d„.K5K©¦ÿPôxqÕds ¥é2 >vŒW’TCrï›Te N¨¤‚¢žãØG€~|ðãSu2¬øîöCNDtºé{Ð /S+ÁÀBÚ Χ{ÂåõÆq骤rþ*àQ¯ÙäŠJ=dn…€7eŽ—ï龬Wñë«Ð dË»Oø†o`Q ‚¸wž›Ðù:û»ÁøÆÒŽ+»kØÔIƒ!îZLˆDFâq2d¦o)+¶¸ñX¼Òœi\ú<Ñ1鸶—0ÿíÚ'æéË¿¸ `®ýòRÕÐÊy‘ÙàÃÍ6¶2œ/W}y/"Ϥ BÚâÚÏÕé+)Têcã;8ÔÐhGi„Ônû¾ÿñÚ^ÜÕ±‹£Æ­çÃÙÈb“Vª ÐhW"ÎÁ¶š~û8¬«ÑÑF¢µ€¤˜¤ZѬomç9gì­úd–e®ÈÆ[PÉC®Y¸¨hdíö²¦æŠ¬ÃÔµð-Ìt×I9]¶NÀB:Æ‹áqŒyà HòT¯ŒÍ(0(âo±·qx¼˜† p<Š>6IW£$$ª:m”Q8ð ƒÇ «©³À­tš2Ëq¹ËÑò1Q|’¤÷öˆ#ÄI>e­QF¼ ¯ô½,ÊŲpZÞGõ̺mæzêNb—ßLOyy¸*šºu©Òù&a)…ÛÓCáR‡>õ2!£8á`#ý‰ÁôÀ˜ ò Õö<¾Ùžû,Âô}ìÇÚƒ®¡_;[üøA{Wz©ñ”ä`Ð3ôk÷6ÑÀs*T~Î=™Ùê|`Õƒ×ì¦BU iÓ÷’¯p4Ÿ3G“ž6ã§u\/€ Õ¢[µFké™®E¯¬77GU|¯}ÐϤ]õoº•kÚ¥#kôz¸ÔÀ+m·Ûè1@Ü/¯ï’r}» 8:²oÔãŸ:xy¼ çÌñ„ª&¹áÐ,J gqW8EéÅz>2 úl>âI›ºëµ:¯!R 9Wq$Cƒ¿¶NšÝPóßÚ ›®AlìqEèËÇõŠu"}¯õJ{jã{2t»’pƒ˜¤9ÂK$ÝîF^Õ¨BVCË9„«B•Jqy ñ„t†íÖK˜²Ö~Êïý˻ӓ×Ï^Úƒ-8íAõëõ’£·®´÷+7°ªÖº0•’fÌçÊmÿ#1"Ü^„ vQ«.<¼¤DÑHôž4(“ôºÐ6µ±,vt9žÖæ‰k^Rc8BZ¡Ÿ/®~8ìæÜ\_ë“0|QÄK©!Ž6 ¶ÒÇÀ&/‚ÎëQNqíÓ¬7ã—˜ëŠv™¨½¬f£ê]Ž]a9‹Jæ‚úÍKÆÃ϶fô÷ÒCc¨¤Ä‚ZªU3Y’;™ayüj]ûv$µ†À#¯íøü…r½þHÈŒ©0['#NlªŠæˆ^~%>|†LØ@xÙ•Çùí’W<¹é!RqÎ7/9÷8.Ø+tì:vtJiww¡úqà#Ó•x5./_ò†ªybÒÝ´¸“ ÙC†Jï­ªuioAëÙÀ!9?—¦TþZç^Œß×LZàkë: éŽX,ï[‡jÀÛÚ`|bJh×+§ƒwU3Y ‰McÎx˜•Fñ‚™ðƶç™<…c¨P¶ ¾]öWfò‘5-ñg,Ís¤Îy†(#¸VN &˜´É¡³~d5!VÚžêxëȜ˲t°_ÿ"¶šÁ¤éÐõ W6ÍÌÀb9fä`Á=ðpˆÀJ–v0@[ ÂÖ†W[Çs¤›uù0]l^64ˆàã É·ŽÄ4í2¶å‡¦ËBžx‚|µG‘E`ª€Ëê­D0êŒ%üP†èìÕØ¡ùbïXBLTí7‚’é°Í• dÒBJ"™gD‡e:58m£ÁTÛ±Žaÿ°vÄIÁÍí‡ÿ£,GT›`or©Þ´ä\M‰(/M¼¥˜„Õ ¨Õë‡t+_PŸSî·:\1½[ìNÖFÔ RË%oi±eREqiXp)ˆúX:*ñå$ÝüþLÃEé—Û“v³…VµšªkXæ‘3„Y‚8„ G ®Õ±á\C%ÙO.U€Á³þ<#ý|og6D¶KèÞ¦nA¿üòêìùɳ³Wg~çµàìí›÷<ŒŒN5ÄïüZs¹Híä5YáÖ’»›NIÛKZM±ƒ¡\n)zŸ« yî€K¥MuÚR]¢ޱã8mM³1pÊz¨õÔ黎ï'æo\2àÜšM»‹ é¦ U#îtH¡6Íùù‹è?YRì]Æ(sŒ‘&Zðî´‹ëZc?sŠ•Qèþ„! «¯é 2’Žg»Œf¥diˆBP¼Eq$ìg×t‘µÛ+¤:K®y}ÂF7ëw™:@×Ükö?\aÑo‡F*ùÈç²Ñ¬1žzK\†?º/LÙÍœîz„ž‘APCò/Tó‹@ o–,´8F®`uºÐG|þ £üÏ+ÿnÞIÜæòUõl¸RÉß+1lTÑ ñÃ9ït„˜‚dlÒ÷t£ósõ·¾@„÷Iг’†w¨Ér#NöŽI¹ä‰:;æk`KsÃäc(YêúvìmIW¥kF³µ¤_ˆ–濾ÏIJà¾\õ´ºÖ ÖJsñôêäÇ%Ù—â 6o ä·1Ò:wãç¾¥ÌwÝ‚´/ìùÚóÔéK/h¢‹Ä³Ãò옆ý§J.Šc•³Òö×,𯒾tâ+'N¶NÑ–x|”t(pÚyÀ.GR%hp‰î>|5‡ooZ+­¢ÓÌ.SX0NVÞŽc#-×»¢ô ›¾ó„ÖÜž+dÅumçÞÅgnß[èñ¬Lø0’åC"OM`ÎbÛÑþ@¦f$Mø—&êþÖ% ­5­«ÅR6;¶¹ÃEECVœ•ðò†ö‘Fƒé÷ªâ¢jl*°± gÖ/@<éƒ!TrÛ¸bQ/ìo#ú‹q˺R?À¥ ëW+á„ðå[ÉPÙÙküotŸ¥ùÂÁ7Bôþ  ¬óó³¶ãZ܆ìAÔ´3Y^[Í›2X>WØÂ ‚ð"VÕjVø”&{ÁCíçÇ^¡dуr¥•䎱iv̧kë#­<“v|[;"_»µÿ o…LdÀ%w5+†µ¬äìù*¾hÄžM9ÀAz0èúµ· «KwaupÅ¡‘Îùùó@?»jyEO» ÈqÚAW¸=†f ‘ûz¬Ó‘zøcœú9⋵TQFµÞáWg.½ÿçp%µý²¥Ä:ú€¹{ÄG,¹hq$_VºÅ™†‹Cmºc»<Õ¶"²8Y“Ìåþ±6€zÝòÐ?vA&:Ñi•±Ñií–xFöÍÇ êï6†áü®s¬æÅ1åqE4G$%ž£eæ½ez].ãSad–•ÀèñÙÌ¡ùÅF û,WMváxKP,±Âè(`e(ÏT¢éŠ‹®i¾ú iŒþGU|Ò>¯\©BÈHÁ »x$Afסx½öM8’»›I™»èÃ!<=l±Ôr+¢ÿj 1µ½ºÂNÓ-ÞŠ±Þà×ÕçbV£ç›> ïìA¡‰ë·ÔhžK(?^¥2}ºÐlü§jLnaCvYÕæT³c¥ÚøSN&Ö?…\¼Ê‘Cþ5…m[¯+NGNdÊ)`q>¡¼ú ÞKˆ"lë·,pÑñ0RîØ'n_ h7ŒHRÅÊûåøù JèpŠh8ZJÛÎS®¨:Q”k×2tÌ×m’!Œˆç§ ¡ä‘¢ÇÆÏ5…–}_¹ÆCWÃååúZ*§¾¿¡ñ8ÊDºº }Å«ŒåèðHÊ‹õRòÑÄÿÛÚ{0nµSÆ‚eÏaQU ¸Wm}‰¬7æ&¬š¤Oôí •¿Ó%\Ê[¨jýÔþèÛë¡3G<"VÙ:e­fæ@ •JvùefTbëüw˜” ~âÔÀŠ»Y“ƒ—$P:ª—­Š„²—¾ÿ±WªäE::ì á”Ï”Ÿ>ì\fTtthúä¶¾~°¡’ا€#{jÿÔMõ™ÿÎõuºõ£}ËX§kr5ÃÃéB¥KùÙþò/ëZºŽÝ'eP¶}öT眿 Î5fŒõªÖx5fVš5Û3<2Læ°FìØÚK ?¿®Œ)èSÓ•ýöŠ» 9„Á]HQPðlÒÆënl:)®äuv}duaÆÄì!9°ÕûѲº& ž¾üz\êQ«zM§ž|±Â=£ Ùðp4¨¨_rHdÛ©ä f[OCüèOÊr5¾^g[¹5*d&º@¡ç V0¬ÄaOÓx.¤Cé÷0NþK$(Zø¾(K0š8HûŽo¤u>bÐ÷ޝoQt·/͸ێ¬o*;.TÑö³ÃËFÙÿNm[¦ÅÁƒNŠØCe¸ùæ¾S/¾;¬áêC¬¹ 'ZÙ]“â‰ÝŸðBŽÄ~3FÅП{Q´ÂÄ”¨pƽ Rµª‹Y Zë Í}äC ³PT4„H;=íÐZs:hX»x@ŠH¤•Á]G(c.&ÕÇ™—ºP¤—ÒjTX3œy=}<’ðgµtžQ°aõhǘºýBƒ<=×ܼ¤-Ì0²0TWŒµûÃdÆ ½ °óÈýÔAb…|‘Ùb ž3:€[J@o%ûNë¡äk–°÷¡WáF-Ž25¢bS]ò©“yb“W“Wû®Ö`ëˆ6Ù-ê;Ôs€þ 8÷“j>wÌy…LtÇ ÊÌ}ÃTÔu¬ùéÖV*YVên{‹ûáìµ4âyûËïÔY±bĽ¿ËZ¬9D—ÈÞ{ÉS©Å ÒåÔ¡ÅÞT€/>®ÖW4÷¨MâLc)þ€ÉRÀ[3ŽG cº¤„ÝÈ#ŸxàœµË!At‰7Ú‚órhSIyéHù:²µ ×<DAL×s¨ðd3u¡p6ôe.¹Ú¤Ü„ùRá-”T2±d ßõzµ n+↣)+Ð4ƒ[åøâ; ò+ÜÛÃԋ´C†„(VmQ{ŽMô*´ö½5‹—Í0 .+B°1´gk„A’=Dõ:´ ‹®Àj±ôõsK¡„ñ¤ ÇÂbFOx½/ á™¯BxR SÓHdj‡(%`"1‹ß·Oy=v‚N‹•+¢ÖûXÇþ`† :—¥áFä x —(ô/æ(w›D¥&ëK螥©\!ë—þjд­ w๠|7êì©‚ íÈ*€èð>| ‰âÃ!Ñ][I´_„‰âIôÅ¢Í3¦ÃǦLL¸†d#ßšEWÀxï0sâ¹4{Ö ÆO Lѧ„UnëTfb¹£KçìñÿýõäÍÊ^1Ü•õà¶›SA§‰Àëóunò«ài;Ùª&_1K´óI+i·¸Y!½8¾[ïÌœïñ 4Èg¿„æocÓ ažÊï?Ý3´áF3Î ¬Ä0+ÀÇ|¥“Q’î;Ë¥¸GGŒX£9!GéØ# /ƒûMÎäüã«#xjü_uÄò-øWO‚ßàQ-|U’æ<w°øŠ{ÀÇÎ0º´™¶Af—áD:Æ“">ªN— Ÿ+—ŸY-=éœK ò:m¥qLŸœ]@löJ„ÞI‘8hf4¬ýz ÔH±ô+QûÕ³r\Øt…^T:Lø¦³hyx,ðð:m0»Ë5ò+ê š$I -º u³&Î×µÛW\¦S5§Z6G5˜Ä õSú*t#jƘGàçνð"HÑb6­RÀ’x 蕸 …1á >åÖY!Ô8 Ÿ ÛF¶o¶ Ë™$VNÿ—˜ åv•:Í+¹‰‡s°DwR]~ ”7»GèQ"VËÂÅQŸCå1$ :ïO$IæJsâ‚1vwG«ª¶Av`ýPúµ¿ok&dAp¡j–&ºh8¡Ú9GœN­7Ý?(*à0UR»ÔZ­š³’°:V‘õb ØÑ©gÕ\ ò""Ŭ:ìJ5sߤžÃ­sžñ+G~@¨¢_i×§^ÌmLüåüŸv;`8ÚÊhÁ([°J<ôH[«)+Ã8È IA™`|19ä±£‚òr/ÆŽ§Þ‹#äkMìÇBâ®Éi¨iÕ¸&£ÚT£×dÁ×ä_“_“4œ®i†7J>¬0Cy}/ãçqÿ¢µ ÖcÎbëखzܵ¦îÂ@€àùÑ,vF.Y—‘hJý¦]+Â/Ýcr=E[~ìŠç®î–ˆ ÓVA(Ù)8gLˆŠœÓŒå ·BŽ@ªz,[| ŸÀ/+¤øÅN€ WC‡Ã',Õ]qf4¨žmf>Übuy¼-ÇF™ÂNòl@E†éoö#óÙ=­‡\õåÊ^j^;%Õ ÁáDrâ¨p5*)økÆò5ÇŠ"‡"Ë Å}:Úˆ¸šn°«uaÈUŸâš©ã•þ  ñí€y©µ¡¬‡$Ç·íz¬H8/׈ Q/9öRÑ‚ðíÈ,n›ML2%9´°;íåË&c&Ä@!„œ¦õ6×ÒU‘³%4n=IÙà ×ÝÐ6ŽƒØpé«".Xµ™‘˜lŒ›Þ¼GdfJÁü,Ç@6;iì‘Ï!_Ëj®!Þ°™“4Ù U0÷LMeßµfp• ÎôE‹8‹çrÍ>ñH÷¶’|¼²kDöÒ~lµ²QH ¦"š9…pW £³!€[úm4J7Ö¼øDl%gvÕ)i>ÂÃþ±§íFµÍhu~úv'*ï=Ôµ3u¹!…sê*Æt‰ùÇw4Þž©Ï rTKW7õô°Ê·£J¥sÖZYÍF’Ü1'1§VŽ>&DÍÅJd©E™¢äê½iŒuu:ljKŽ»ŽÈF´ir+¯Åù|Q ïÃÌ %KÖ®lN,›¿çOçc{w:-‡'ª²¯½VÕ÷u[LíR}Õ IVŽç1MÒŽ&vCNÎËao2å ælŠ’Í¡¯!$RiŽrè”ØLøŠÜÓqãÅ”säyätâÙó-dN4‡WȺ\²‹oïÚ†m¿ U¢-yë‹[0‚ªaòPß`Èj£|·ò°®´¶R&ê|,!«ð$‰dAŒfå` 溥¦¸V¯i$£¢ôC8S-Ž.ÃVÌf+jÝJÀL@ìì^JÒ &C*Ñ6aÌ ßP°ŠÍ Àía­EÖZ|¥«ò”3´ÚÙ§x¼†ó‘÷ÿqŸ÷ÑEAJ$/´žEëóTèv¦È…ÕͰÙyúèflS#Þ˜(8–ѱ:…Ë‹óùòcžNüE¶F®?Å΄@÷ Tޯȿ‚çªhû°yÜšÙÄ;USÑÁ×WÛ‡|bE–€ \ÄO dÛ=^²y²Lä[·¡±À¼‹F =Û[hø?ìåùjk©ê ‡¡IsÔ@-9ª"ß°øäÌËÔå8K£¼ò)`M­œš2@¤º/_஥ö9“á¼ú¯¡ë;ØKCjå$0¨äá±húzh½©}áŒ(5páSàD¶/¶Ô®º¬Êú:äËhæÎ1¾ ¦9 }wm>ƒ%ñ8Ä‘Âfü­÷­Rn¿;´ §¶;ílýÚí°_P|.ÙõVüžõ˜©8h‡ZF»ý3UxKãŽëÐçÞR‰ +`Ì‹`šÅ-Û1w è¡xÕÏxJó±KŠãt|møcxD48ò‹½DãŸ9ZÌ€Ú:B«-îÍbï#(®Åøl’þuˆ„‰ð¦ CЀŽ2†üJ/L^޾¾Nû€íÛy+Ôãpç¿7…–®r¨ $Ú£:úd’¾"“²‘÷$Á‘D€h J§BÌ»‹ÑYW£­Iyã¡5Emƒš•毨Pñ x6ὦ s=-f‹5Éá‰|¡À3a¤#€þ󷯟½ ±ÀÛ翾>}óá}È0Š‘áG»Cƒ~‡»…yDQC݉Xœ q (”Ÿ4’ŽB2±ÿ/«Dž _e>…ê½û|ƒÇàûU3`5Mwd¬ÞrÀ×"ìÙ[ÝO]DúA*CÉ¥Ýôö8Ûæ‹òÆŽÕ¦gcÌj°©k™1¢×óè5æžêÕ&MÅÏ7|7îH"ôÂaÉçyM¾û%T÷< ÆHVaN `«ÛÀ…;I;1ø­ý`²°¹ŠÈ€,üÁ ùáûѳºx±L Bž‰t튔'ÊÍ«YÒä¾âî¨ú\¥ìàñBÇ Ø ˜é±?qA‡œ"f£>åâ’€&49c ˆdãûÓ“†Ý:FêN"(ù\4¼“\xV, _P*Yö|Pݢê^HÍ/°*-ýt@Q“1®çˆz©óH*0`À"Fz]*ñ¸N NI{I æ f §0(&Þmä¦Mˆ>ŠZ©SÿëA†Ê_tÈVÊM?P×Bž]p²¹(ˆÙÑÍP7•«bJp@zÊzD¯eÒÒ®Ïx±'1_Ø /ÔÇêç=uŒãܘ)½àOà«ÂLˆåÙa¢h6êTéå‚]òÒa‡ÓèÌÑå>àïê˜.ŒŽSgs§FºaXoFÂ\ÿtN×I½·?E7g°ÆŠ•6:¡ƒš—ºÅg=‘øjƒD–ªhƒ¿¯gÏ~ÄŒi ¾Ç$z!TgíŽÀÀÚ„Ïž òl¶BÏÞ:yåÀíóƒ=ħÅoF…* *qB©‰1ã‹rÃøçOãço"OŸ n™ú—Ø÷뺢½W¯NŸ3Áoûö%åŸ#Ç%éö¨åÉöz iP:D’y6s(…´å–Y¯Eíðkb!*“ô æÇ΋hD‡…óZÙ;vþ¶šQÖÄÓõ•I-B…8ÆgÄ7Ähwl[c}|Es¬Èßtk\¨Ú—S;ضôÎNL#ºÕlÖc_„TÜ´ ×ÒW£f]'$˽Æ[Õ½UE\®GšÄõH˜ßî(°7Í7´oØ/ƒK$hæ…ÆÕLÌçÍÓ¸,> }bJ.™B†:“ãì'Ãm¸Ä wƒ]ós¨˜ˆ\­`›xK ÀÊä.Z $’'$\‘Âs@«9" *Wf«P©ö“sHçT_Wvyšh Ã%,ó‹½}ãŠlµd˜|(Å‹ô6ãÕŸ îfÒN¯­¥¨Íùw|Þؕû/?ýôîô§^Z²0¼¸9ûð³}ÆÙ›§¿œÚ_Þ|°_óûãoßý›¼û`ÃH5N5²™Ó]pŽñðn[´»k¦Î«`;¦„šCS'¾U! X q…ˆ! <¡¹ßñ:¡,“Z‰tÁpÂPU½9‡»ž,D‰óv!û¦X.TÛYs>¬†œKf *¬38ã‚ËuD°nÒûš<é< a§[˜½–L9—ùBúÓéú0tÜéo¡Á©šSI ~«+'íîƒà9ÚŠG`mI€…_5fÉr‘†bR0]ÍÃÉ„öõªxr$p1zGp€ÖWqŠÙÚLâ*¨¥ L=p?+}´Â¡*©L³]ú[U3˜ì6º@Kîâ¶ÅåB¡b¹ á´§ÜÓwôÍ¥Uæ–È0ÏcÜÂÙ——Q‡–¨7yüÔŸÇ…Ç:^‹mVð’§Ö¦òðITQ2Ýö;x‰%\†®*‡üä­‡ö4‘ìw¿ë²ÂþÃYÏA"áÆ]² ™Ž3ª¬vPÕ”å¡àæ=òƒõAp¢g¡øõn^–ÍJ'AýÖ@ÍÊé»×gofÀ®q5…Òz"PÜÞÔ°…Ö?Z“Î=á‘à·)™‹¾2Irãê)>CüÈL™SQ|&ªY-•{‚ìÆ+#FZ@üC·æh$*ýà"ª+C|–«ë•§âl–Ö‡/ÇUÊYôrìá60æîAÒ¦¶`5o#w¿.ù̕ç.vÜÔP’¨3A¾žëw™Ï\PëV‡êÉF5%*I2Ç‚]›bVØ Âb@OH=’yvŠJˆ^zLúc¹Qù(ÖÛÖhm=L¬%c”/Mõ"ÒêS×Ñ5ƒ_£sAz/01"ÁÀhë+M´¤ªè,Á=CÃÐ9¨†Üä“ô`5í=öò׿¾;eŽÖ»ÓßÎÞg*dúðóÙ{:ýgÏOß¼çödÜùƒºÉA—@lÀfó¸Þq¼Ñ|à$4 ‘ºŽØ£¡´i %¦®÷QŠztÚÞ¬yÔÈÇot²ë8åxæÁüA* #j‘ͦÑHJ^Rõü¦¤°jãž%cE´l×Õ²L0I$WzéêלrPhqÑ ‰{“ )ÃNg”Y>Fá¼^«Òp²Ÿøî²žø•°ß. 76*–srîÅE}!G/g­éjuýÃ÷ßúôééd¾~ºXN¾·[ÿËᢅæR‹Ö÷Ô|©-ΨbÑšø¡î¿°Ò1,k´¥C"™(xR3k²¶‹-¡N|U\nÁûÉ«¥ðeàîµ-M0’ZÃQòšÝ1Ic¥÷C5ZÓZ›ßì¸Y¯À ‚ÒósfÞ)€L­–ÑŒ<ñ†xU1K´Ÿ.g^g!²Er»^{/¥)oÚ,árÌD¯xèÙymÖcîoÌpÇ×¾ ¢ò¼ ñk.IéÐ5IC‘”çÄ[猅 ¸|ƒ‘–ñrX®À~q=‰T[™@à MÚÍ-¬Êf†o3¤2'(³Xg¢ü"„®hS7%k‹8²¿„¦aÝ\“ÙYIÓv×ÀÑs¢¯*\,î§o$Ów©QéæNI4N œ0ôÿ#yâæ´eÁf®á#ô¬Í ~K÷‡î…ÍW§Ô6•§ÒмxqúæÅ¯¯°×Šq׸DÖZ¤ûê Œû||ü3Ô54$ÜTÕ1]á5¬¹ÝÇÖlm„q£Ì%ŽëD»fyr·(YläÈ ò_9«Ë[ ‘l{F–ɤÅ"ÌZ[‚Í8Pë~bº,mÓ $ ”­N#á9®I¶“ßïôˆDA„]T<ÙFµ]4zn·Þòã—N\Æn§ý#)d¯é t,;¦ŸQ,þ‹gsQn¹ Éó@1ŽîŸ£¦¶® kÛ@v‡w¢o¼Àl­0ì²Ï![fÒ¬rÅ ŠçÀ­_ȳ 7~s×mRz¤ †%|úáœgZ€?¾Ö;øâêøë Nä'Ö[{éŽà’Ý` ;›ÿÈwŇ$hZg¤u@²Z¯Ftû””6àˆK‚N@x‘ÀôËåbNôÉ?ð€lUòìÒ=[ž3‘è1 <)/å ……K¥þç¢ó2}CŽ”úKîø¸c}¿ûî©5v":ýœ­ÝY(bùé`úï †„È‘X„n™ªùb'˜}ø ¬B½b…{†\Ô²µöúf5ßJz•YªmÍS–S¥×KBéºÈçÀëÝ$*Jwp¬ŸJsÅojoùóù"è#}‹<ÕKúm£ø=yýüüFŠoÖ@cñf¾“ÛwKZØ'?‚”áùNR`7 XŒ=bïzr@½(îr#·ÚèŠF{FªÃþ¨€²Ú£¥ßt„XBWHZi³Ë‰$Öu¤í\57ƒðOö Î(ë2süÂi0jN¿.fŠtQm4uL–#4ã7öD{±¤¸Ï9mj‹u”¾¶‘¨° ×­[è&ÕRúÇ v¸£kmÃIé[ï$7ø-Ûdôwö™;` ì:¿å[žsf§ï³u)ûÆqëxþGZ’nÒæ>ðÿ„Ÿè¥ø‰qëŸèÏt]ެù+ìû_)¿ÓÓàÏÖ¬xÀÿ›ÛüЮ#ïëàåÇVÞÆ«ô ÍÀ«Z—8É›/´õ+Ì^„þßÜ÷Ãúg >‚²ŽhÎkuÞÎ;üW ™UzIú«âó5uÈëyKz_yÙ{½‹¹çBܸªÁ¾;ÔIÚOü zO]¦‹`©°,Ó=ì3ó%qoÑã¥éæüY¯íßšÏa]/F@d)2,ÅÖ½ö(/µó ‚ër üÀIÓm×ôß4ˆG?þ›Ó/oÑá·@ÇN÷ëeñW{‘ÔÄãLÝ ¤X[Ÿ¯þÿ¶S“wdÓ÷y»t³®/Ç)IÛÓ>yÀþ4û0^‡?ëD;¾Gˆœ¾B½¢Òæ?Ë+è*ô“Àx®—ÖúÓ¼‚Ø}¸Wør]àøš»ßG?ֻޝÞƒA`=×sŠwþ4 !¸Pš‹õ¯ügVûbì+ýë?ö¿v <ô"¾í”ÜhàÜÅœ15½#Ncž÷ Vç_Õ‘êÞâ…íEnåZa—e[_Ȥ½6LWÑú~Á~šóö³î5î‹o8îóÿyÊîHÆ–-k÷2Þ'üçd3ñňötù·ÌÌÇ}]zÝ ›¥¡ÿ›ÁUÔWÀŠŽ‡+è‹Î[_®—„'Þýõ7þ½†t×wÊu¿%ØfY†¬N8ܲ®ÐS‰’¡WW¤Ô@ýÅoîƒöG.nj‡­T–ƒ?9Ô: ž ¾^UãcbrÎ=¦ú&nª» dåC…¥Ð²c¶°«+GI7 ãÊÇ0¢;çSÎYÎNPÖÍ:ñP¡æDÍ æT,†2¢;´½½E.“šd¼¹¹–²›(¯Î(ŒàPGÍŸLÚaPîó.%ª.O`þálB²Ó+ix]2D|©‡Ã|ÜÇÝñ5«íÂ#Ù‹d7(š£ýW“µ²ÖÆ´¾ìˆ“Ýjn½³näœçàI“ýÆN{=¶ÿÎ[—ëúøÍp½äb0ˆdnØ¡oò"¹l‡„§;Ï Ö&ÀmÐq1š‡ž3j4é0ñ`é¿Ë}DœY?Š ò¼“œ‰¹§ô™Ë#çߨ!¦7Œ‘t*¢%Nø‡ûüð°k°Ò¸–å s ’w¡l ƒ á+ʯ9øc$xÐýzg@'o‹ Ly =tËК<=ØÿÂÛ% oÀoëÑêMØcÏ;ï#U̬Åñr×p¾ F ãI9s¬6‡\FÞ_à£}C§M,Xì8 ÙÆÃª¿\Ùuÿh×}1Cw_îé¼Â` €:Ù·}ײ ú p7ÜœëU5«àÙúõ¾ø{DŽÑ‚è°y½: TÔž½ûÆF‡Ù Ïe½üàj|jý|röî𸠲³?]…ø—{Ý_=ªjæû¼/:)êñ¢áÓ_ýv€‘¿?{ýË«S¿.èÁÝù=h¶M0\æê>{ó2ðÑö:‰{ßPn¿$ÖŰî†Ë7=ÇŸ G?ðœ}?ñF"Ué¼íW“dúúÓ‡f82qù¬KŠõÁ?’áD7ª¯#JR|ýäÀµîV{Óbh??ž ç“5÷ù[lU,K*E"ޝÞwöB6pmñß:™ PÓQ£áltèiò mìÑ>¿E*o‘´4Ð;¬gÃÕb©ú¤*™f>´Ð2Ìçú¶¯¯œUÕà‰a¡Ô$•BõîÙ3ó@ꊳîTÈqµQäY(Á†Ðå ”´\̵ußMà ÷íâ¸éN"§!z6Ó|ŒR%¢¾§é›U_4‹Ç•ë®èRxëlÖ¾†ßãêT–:3­álM3ïÙ˜6‡{ ãb½øqñq=™€Å˜„sô÷…^Âl:‰=1—i¿ÛÅ =tÊ¢§ífŽçV§ü~pA×Áª<¶A'ǦiF>ûæ®Ý΃t¸*n¼¬ `uç w"«InnC0ÜæX·Mée @Õ-Cx~÷¤Ò¯šÛº™NX z­s gÕ ¤ÚªEóSßÖÚž¹Gœºk¥]êU§·Ls@ ”%ÅT­äÝ…~ð<èì:EW2èlDÊ@ššDPdÚ(¶™{³.ñ9Ìò~¾e\zø”ºi©˜bxAì-ÍáÒ.ºp^Ú—¡"Ël}3ÕŸ4P˜Gc÷)ßS]Ò¬‹’ÒÆümçJ™æ”5”éY}Ø»RKc ½œo¨rhn†PŠ›Ï—Ùø5g@ó©y[†ÛÏzÑpÍÇaÒ¿+ˆµ7ü(Ïc ¤æü6—`Ü0/Yµ‘´¦p‚:zyÛZŽÆ8­„ú$*[¸]’wïy9ç;˜欛Ñë¦1ÜBî É’4ÖﺠåÞy­B´>ï>Ì÷™ÎŽº:c)üÐoß7€ÿ¯ÍÅß5Ÿu%u!SÞIºøÊ_t3¡Ý!λ¦÷HÓE‚wÏrìß•uÄg}‘p0 TËÅüJAˆ\¯€eEÉÄ:ðË‘æA¼¸]Ðb_¢©¼ŸHME±\Z_'ql…ê’K’Àzî‡ñ ÀBPY™¤ë "Îí¢`|Sî¢ìܰËvyÐ#&Þ"=z9ØÜ~¨—æì´wX-*]c‹¥(êzÔh௠󱵦gÓ÷Ð[·#^µùMc3­åb½"‘åd¹zï8¹ŽOP,ÓIµiõâ_²žýqktj/ÆY)Ïšd„qñ¹XŽ*Òè =€[/å·)P<3Ë“ÔT iw ÿÞÙRëhÿå0#øs³h„o.{De¬=¹œ‘£J©/nØ4Ì»LïZ §–¬Ö‘ét„Šý’唉÷òÅ+ÁÑ©² ]‘Á€qx's-—‹2àT„áëäCXLèAª”œ™™(Ïío¸ºÅný&ÕQjDw1/_ŸJ)ZÒýª8Fï.UËCú và«  ™ìÓr)RÈhðH0¥3ž^—è˜ئá2!.adK–Þ“mu°¥î­,ú½‘æÑB$Y’òYùIйLÎNælQ×À.oQ{\Ö|©jê@ÃL§‡Zf·xÐÔ9ïÇóÏí$ýˆÉ­ÁŠ«¿°úP_Ê-¤Î½¾‡Nh&ÚKÚÍ eùùé ÔõG”s ؤ€VF&ÞßDÅãÖÿÞèºå•Ãß§* p”hQ'3ï•1¿3]“`RãyßÉhäÄ:u×Ö¿Óü²ì¹e|¥bé«ÃLBzzšvrût&E~=!¯)3(•†¶Š yJ NX—i¶³5[ˆ‹ö ¨SÃÒ=ØôÇ©÷V„¨#£ï 7ÁfŽ#7/Gߢä.Ì1Ù]DžU~ép#6~çf[v뛄®Š É<íåÙƒö"°¿½~¿¿òºhþ5¾bŸù k'¢tñJê39h¯N^½;o%”kk‡̽ÞCzI)fŠnc3.Cv @ÍX_Ûn5ÇnåÕÎ2Ô@̆à•ÛÕ^‡n /ø4ð]Ýb'XìjŸÖV]¼,G-$@9Y³6™OŽï[jµ$PžÅU¶h@ÍŠÏh ‡•·³/ÿU,·Ð GibçXÛ‘EÍ:èlìÇjüX |¹¾BâËw*lº“3ê.ɺè½uiP$Ҹ׬Ùk|ê(JRfÜëu›£ZUÅquSmÐãéå|Þ“RÔ~·o¾¸œ;›N»—¥ôVT3Ý.¥³á85Rò9@8 4ŸÙ1¾o$E(‰*Uóv†3Hýê>Ûý©o+¥¬Dår.ýÍH?ÆIKå|yd7.uúvQ´—RUô/晌UÈk/#¿: #–ñMÇBV*u–j§1¤ÅåñpJŠ1_büu¿zï“ÍråïV ã{-QÔä™T›CúÄœºPBeâ‰`w3>w.‚Ê ë*Ñ+ÉÚÂùùE‹ÞR¹16žO!©ôÍýù˜‘n°’ ™Öîm‰¦µ‡4û}­®Šu$¹–™¡‘ªìE4Á°:èqx÷A[º‰ŽœlÖö‘O¶žÏ¥~tyU=Ÿnç÷`½ƒ]y²Ï#gU%h#ÈÕ·õaìq3´n˜Î î£Þ™<ŽZP§Y&;€¡cpªâÆŠŸá.ÜÈ_Øâ*“ÄU.å®Ðª-mÔÜíY4äxÌ£¦ÓZÓƒ4Aö9Ò}èRÜ©õmB×U“ö£[ݤ)zJ…·¸è>ì,î¼ÚÓWW®s¦Ú}n d='žA9>"+îA ÜžñJÃAr]çL.]¹DL\[;üHe ´V ‹ï\)‰…̽«Ôcö±‘×K!Ùˆ »Šûw‘ Ä|ycõ2ɽÓ2¸Žˆ^6™£ˆÂ¹‹|:ÄÊÜ1x4ªyd–…7j ˜ {0RI‚@•1Âÿ~"Ž¡UDm™F…ºÐ d_Þ &¸W1¬Q¶žqó: Jñƒ{d.¶Ûvá©›“qâeÁ6`9r9ͪÅÛÁ‚Œ+ßÙÕ‘¥0[bµœKï]ˆ‰÷6<ü{ëæ˜[PuÕÈ2Ø3´™ÂD²¦‚K-Þ¹Â`ÿ[CM™;VyWZW,¯·`vå7!8ÞÍ›xÎ;èªÂ€]HåùˆšÛÀÍ}2î4.?Þ³ÑÍsº„û¾w<÷ÞÑäø žüCjOTtÂU÷Y®çó1cº« ùá¢D AÕXÉDªýo­÷®–K¤H÷½¢TW ?¸/óé¡ô8í’K´1㡆…›;•öö›.¹ æÆœössÓ˜ãÒɬI^°<Ö«ðKx´ xëiU®œG ¾óTcù´rŸ1í. ÔUoå]jÇñá<%ÿÐZö®tRë‹:(÷•œŽ™k¡µQ5û(b _eš÷\yŽšäYqË\õÂ܃iÄïÒ<Æ]±]WÄGfÞHoCS懲ü8yUMí¸ZÎÖñKìªÈ¤y@IÔ¾÷…n@Ú‘OŠP‚~ ©©Âè‰y¨¸ö­-DÏÑд„˜4\,ÞKÈéÝ%ŠxôöN®TFÌ[§ ò’Þăg®¡Ë˜äM¦áÞ£ ½5\º>)᡹=SÖw õ;=íÌm'ªó"UÌù¸½–Ö£¸ÛjiÔÂI^UEŽi/±PšèC\ú~7³ä¡;"b¯ÑÀD’vÏðïÝZVÖ²?æ{ëßìÀ½ËHû¨Øk§M'Pä$B%¼†³ÓPÆ ª–÷P ¦ÛUšåT[[«AÝVûª*Û_vªÁ×#z¸ºªÍí2½/yúXÕ«¹àtsC»Nc€µvµ†k⨭ µSbtŸ*LQ>ˆ)ôÄ6ÇÉW­\±Ô'šçújÉÀ<°IÕ×j»E輟eZPÛ#õ’\ü,îèt[ç¯]"wî¤I0D©ê‘,õí—vïZj›k~6÷±²Ý6'|¦Ay'ãQÎlÿ ®,,Û3IÚÒÌ©òìK9öMt™þ>íä…?c³”äP_ÑŒ#gE|Bò~EõBögƒë›tºh°¼ÓGÙ»Zì½C¡Î_ÂfÖ½ßãýƒuhÓšn¶¾Áð#ÝM‚ÄIN-¦/ÝBä.jV1 []º "t_Ïîí«le;¯IÆÙ“6ŠíT€K{î4‘§eÙ¤™Ù*’ñ»‰ï|ï®æLzͦj}×ÞÙc§³¼›¹zÔÂ_G¢èH9eG,ðoR§Ø̪ÃG쨡·úxîFyI­P„vE0ÖXÇ–ñµoS•±—º¡ÜD-@û^<̃aÆ4Qªý3[òÉ-}G_˾×!hu°;Zï|³ @ýéDÊÒÚh G…¥iöXè^sHZq¡²fŽü—aà£D}BÚàvÄÕX“Gu ¯U•ÚÄ × ;–$@©z›•Œ™i´ZÙ[Ü­‹:d¯'ɥ߅LÉ&Rÿý÷“goß}Èà_)WÚ÷åu+wRK™\7”žôV·Ãþüô—‡=sÿñ?®‹¦„”ŽëÒuƒvòüß~ýekõúƒ2í'®ƒ× ÒÿpÜúòe4.ÿ4 t× "Õ†ööf]a¹á ™ªoª÷¨Æ°§Ãβž‘aC3ýþöÑ‘óðÀö\O–´«›þÅé³_òÊÐ÷8°ŒlŒ¿“ttü§¯ùð{8ÿæãÍ÷þýVg0ûŽœÞÑmOxËå×÷Ï7×7Ý_ö|—<ÿòÖûßìcoÜYÒ9‹ ¨ÕKîöÏ»woßÝïü>ª7¹uü}×(&3áøÿúÛé»goߟ®–rP•&çUšM\A2è¦:ÁgoÎ>¼°NÁÏH]<\«ûÎ>Ð;©ŒZtë6ú_LZ,_÷ „®º2i’'º+^þû_9ywòú“þÍÂv§~¤Üý4k«™Í£ÇlȽ—<¿º/GfOÛºÍ_½zûü¯/N_žüúêC~–cøød[ =µÕ@š·‡ûêÃᅵþI.{7ÉùÀ9¹³?lÌö§Ù%¹¶Pê÷u^Ÿü»ØÂü|óÐÐþÖ«äÊWÔv{ÎÃÛ+¾þ“x¸z¥½nW7 —`þI6}æŠ:œ‡níøûS±æ>_4nÝ¿½Ö½a­Ut|;Gü—wgo>üIÁž² Ëñøß>kݨ³7?¦ém±ÕGÝàšÜ°nwS):¥æ­†ïmUŠNw)E+;åÃrXÍŠ¥)æc³®‹å¸­¾·:ž.——óŧùëÿ·*íGNß¾4ÿ9Hºc¶dibbler-1.0.1/bison++/Makefile.in0000664000175000017500000007311312556253077013365 00000000000000# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : bin_PROGRAMS = bison++$(EXEEXT) subdir = . DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/configure $(am__configure_deps) mkinstalldirs \ depcomp $(dist_noinst_DATA) COPYING ChangeLog INSTALL compile \ install-sh mdate-sh missing texinfo.tex ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \ configure.lineno config.status.lineno mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am__installdirs = "$(DESTDIR)$(bindir)" "$(DESTDIR)$(pkgdatadir)" PROGRAMS = $(bin_PROGRAMS) am_bison___OBJECTS = closure.$(OBJEXT) alloca.$(OBJEXT) \ derives.$(OBJEXT) getargs.$(OBJEXT) getopt1.$(OBJEXT) \ lalr.$(OBJEXT) lr0.$(OBJEXT) nullable.$(OBJEXT) \ print.$(OBJEXT) reduce.$(OBJEXT) version.$(OBJEXT) \ warshall.$(OBJEXT) allocate.$(OBJEXT) conflict.$(OBJEXT) \ files.$(OBJEXT) getopt.$(OBJEXT) gram.$(OBJEXT) lex.$(OBJEXT) \ main.$(OBJEXT) output.$(OBJEXT) reader.$(OBJEXT) \ symtab.$(OBJEXT) old.$(OBJEXT) bison___OBJECTS = $(am_bison___OBJECTS) bison___LDADD = $(LDADD) AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) AM_V_CXX = $(am__v_CXX_@AM_V@) am__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@) am__v_CXX_0 = @echo " CXX " $@; am__v_CXX_1 = CXXLD = $(CXX) CXXLINK = $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) \ -o $@ AM_V_CXXLD = $(am__v_CXXLD_@AM_V@) am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@) am__v_CXXLD_0 = @echo " CXXLD " $@; am__v_CXXLD_1 = SOURCES = $(bison___SOURCES) DIST_SOURCES = $(bison___SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } DATA = $(dist_noinst_DATA) $(pkgdata_DATA) am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags CSCOPE = cscope AM_RECURSIVE_TARGETS = cscope DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) distdir = $(PACKAGE)-$(VERSION) top_distdir = $(distdir) am__remove_distdir = \ if test -d "$(distdir)"; then \ find "$(distdir)" -type d ! -perm -200 -exec chmod u+w {} ';' \ && rm -rf "$(distdir)" \ || { sleep 5 && rm -rf "$(distdir)"; }; \ else :; fi am__post_remove_distdir = $(am__remove_distdir) DIST_ARCHIVES = $(distdir).tar.gz GZIP_ENV = --best DIST_TARGETS = dist-gzip distuninstallcheck_listfiles = find . -type f -print am__distuninstallcheck_listfiles = $(distuninstallcheck_listfiles) \ | sed 's|^\./|$(prefix)/|' | grep -v '$(infodir)/dir$$' distcleancheck_listfiles = find . -type f -print ACLOCAL = @ACLOCAL@ ALLOCA = @ALLOCA@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = g++ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build_alias = @build_alias@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host_alias = @host_alias@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ AUTOMAKE_OPTIONS = foreign bison___SOURCES = closure.cc alloca.c\ derives.cc \ getargs.cc \ getopt1.cc \ lalr.cc \ lr0.cc \ nullable.cc \ print.cc \ reduce.cc \ version.cc \ warshall.cc \ allocate.cc \ conflict.cc \ files.cc \ getopt.cc \ gram.cc \ lex.cc \ main.cc \ output.cc \ reader.cc \ symtab.cc\ old.c \ files.h FlexLexer.h getopt.h gram.h lex.h machine.h new.h \ state.h symtab.h system.h types.h dist_noinst_DATA = bison.cc bison.hairy bison.h bison++.1 \ bison++.1.dman bison.cld bison.info bison.info-1 bison.info-2 \ bison.info-3 bison.info-4 bison.info-5 bison_pp.mak \ bison.ps.gz bison.rnh bison.texinfo bison++.yacc \ bison++.yacc.1 README++ REFERENCES version.texi #info_TEXINFOS = bison.texinfo #man_MANS = bison++.1 bison.1 bison++.yacc.1 pkgdata_DATA = bison.cc bison.hairy bison.h Example PFILE = bison.cc PFILE1 = bison.hairy HFILE = bison.h AM_CPPFLAGS = -DXPFILE=\"$(datadir)/bison++/$(PFILE)\" \ -DXHFILE=\"$(datadir)/bison++/$(HFILE)\" \ -DXPFILE1=\"$(datadir)/bison++/$(PFILE1)\" all: all-am .SUFFIXES: .SUFFIXES: .c .cc .o .obj am--refresh: Makefile @: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ echo ' cd $(srcdir) && $(AUTOMAKE) --foreign'; \ $(am__cd) $(srcdir) && $(AUTOMAKE) --foreign \ && exit 0; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ echo ' $(SHELL) ./config.status'; \ $(SHELL) ./config.status;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) $(SHELL) ./config.status --recheck $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) $(am__cd) $(srcdir) && $(AUTOCONF) $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) $(am__cd) $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS) $(am__aclocal_m4_deps): install-binPROGRAMS: $(bin_PROGRAMS) @$(NORMAL_INSTALL) @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(bindir)'"; \ $(MKDIR_P) "$(DESTDIR)$(bindir)" || exit 1; \ fi; \ for p in $$list; do echo "$$p $$p"; done | \ sed 's/$(EXEEXT)$$//' | \ while read p p1; do if test -f $$p \ ; then echo "$$p"; echo "$$p"; else :; fi; \ done | \ sed -e 'p;s,.*/,,;n;h' \ -e 's|.*|.|' \ -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \ sed 'N;N;N;s,\n, ,g' | \ $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \ { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ if ($$2 == $$4) files[d] = files[d] " " $$1; \ else { print "f", $$3 "/" $$4, $$1; } } \ END { for (d in files) print "f", d, files[d] }' | \ while read type dir files; do \ if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ test -z "$$files" || { \ echo " $(INSTALL_PROGRAM_ENV) $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(bindir)$$dir'"; \ $(INSTALL_PROGRAM_ENV) $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \ } \ ; done uninstall-binPROGRAMS: @$(NORMAL_UNINSTALL) @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ files=`for p in $$list; do echo "$$p"; done | \ sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \ -e 's/$$/$(EXEEXT)/' \ `; \ test -n "$$list" || exit 0; \ echo " ( cd '$(DESTDIR)$(bindir)' && rm -f" $$files ")"; \ cd "$(DESTDIR)$(bindir)" && rm -f $$files clean-binPROGRAMS: -test -z "$(bin_PROGRAMS)" || rm -f $(bin_PROGRAMS) bison++$(EXEEXT): $(bison___OBJECTS) $(bison___DEPENDENCIES) $(EXTRA_bison___DEPENDENCIES) @rm -f bison++$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(bison___OBJECTS) $(bison___LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/alloca.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/allocate.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/closure.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/conflict.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/derives.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/files.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/getargs.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/getopt.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/getopt1.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gram.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lalr.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lex.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lr0.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/main.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nullable.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/old.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/output.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/print.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/reader.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/reduce.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/symtab.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/version.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/warshall.Po@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .cc.o: @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $< .cc.obj: @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` install-pkgdataDATA: $(pkgdata_DATA) @$(NORMAL_INSTALL) @list='$(pkgdata_DATA)'; test -n "$(pkgdatadir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(pkgdatadir)'"; \ $(MKDIR_P) "$(DESTDIR)$(pkgdatadir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(pkgdatadir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(pkgdatadir)" || exit $$?; \ done uninstall-pkgdataDATA: @$(NORMAL_UNINSTALL) @list='$(pkgdata_DATA)'; test -n "$(pkgdatadir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(pkgdatadir)'; $(am__uninstall_files_from_dir) ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscope: cscope.files test ! -s cscope.files \ || $(CSCOPE) -b -q $(AM_CSCOPEFLAGS) $(CSCOPEFLAGS) -i cscope.files $(CSCOPE_ARGS) clean-cscope: -rm -f cscope.files cscope.files: clean-cscope cscopelist cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags -rm -f cscope.out cscope.in.out cscope.po.out cscope.files distdir: $(DISTFILES) $(am__remove_distdir) test -d "$(distdir)" || mkdir "$(distdir)" @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done -test -n "$(am__skip_mode_fix)" \ || find "$(distdir)" -type d ! -perm -755 \ -exec chmod u+rwx,go+rx {} \; -o \ ! -type d ! -perm -444 -links 1 -exec chmod a+r {} \; -o \ ! -type d ! -perm -400 -exec chmod a+r {} \; -o \ ! -type d ! -perm -444 -exec $(install_sh) -c -m a+r {} {} \; \ || chmod -R a+r "$(distdir)" dist-gzip: distdir tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz $(am__post_remove_distdir) dist-bzip2: distdir tardir=$(distdir) && $(am__tar) | BZIP2=$${BZIP2--9} bzip2 -c >$(distdir).tar.bz2 $(am__post_remove_distdir) dist-lzip: distdir tardir=$(distdir) && $(am__tar) | lzip -c $${LZIP_OPT--9} >$(distdir).tar.lz $(am__post_remove_distdir) dist-xz: distdir tardir=$(distdir) && $(am__tar) | XZ_OPT=$${XZ_OPT--e} xz -c >$(distdir).tar.xz $(am__post_remove_distdir) dist-tarZ: distdir @echo WARNING: "Support for shar distribution archives is" \ "deprecated." >&2 @echo WARNING: "It will be removed altogether in Automake 2.0" >&2 tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z $(am__post_remove_distdir) dist-shar: distdir @echo WARNING: "Support for distribution archives compressed with" \ "legacy program 'compress' is deprecated." >&2 @echo WARNING: "It will be removed altogether in Automake 2.0" >&2 shar $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).shar.gz $(am__post_remove_distdir) dist-zip: distdir -rm -f $(distdir).zip zip -rq $(distdir).zip $(distdir) $(am__post_remove_distdir) dist dist-all: $(MAKE) $(AM_MAKEFLAGS) $(DIST_TARGETS) am__post_remove_distdir='@:' $(am__post_remove_distdir) # This target untars the dist file and tries a VPATH configuration. Then # it guarantees that the distribution is self-contained by making another # tarfile. distcheck: dist case '$(DIST_ARCHIVES)' in \ *.tar.gz*) \ GZIP=$(GZIP_ENV) gzip -dc $(distdir).tar.gz | $(am__untar) ;;\ *.tar.bz2*) \ bzip2 -dc $(distdir).tar.bz2 | $(am__untar) ;;\ *.tar.lz*) \ lzip -dc $(distdir).tar.lz | $(am__untar) ;;\ *.tar.xz*) \ xz -dc $(distdir).tar.xz | $(am__untar) ;;\ *.tar.Z*) \ uncompress -c $(distdir).tar.Z | $(am__untar) ;;\ *.shar.gz*) \ GZIP=$(GZIP_ENV) gzip -dc $(distdir).shar.gz | unshar ;;\ *.zip*) \ unzip $(distdir).zip ;;\ esac chmod -R a-w $(distdir) chmod u+w $(distdir) mkdir $(distdir)/_build $(distdir)/_inst chmod a-w $(distdir) test -d $(distdir)/_build || exit 0; \ dc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\/]:[\\/],/,'` \ && dc_destdir="$${TMPDIR-/tmp}/am-dc-$$$$/" \ && am__cwd=`pwd` \ && $(am__cd) $(distdir)/_build \ && ../configure \ $(AM_DISTCHECK_CONFIGURE_FLAGS) \ $(DISTCHECK_CONFIGURE_FLAGS) \ --srcdir=.. --prefix="$$dc_install_base" \ && $(MAKE) $(AM_MAKEFLAGS) \ && $(MAKE) $(AM_MAKEFLAGS) dvi \ && $(MAKE) $(AM_MAKEFLAGS) check \ && $(MAKE) $(AM_MAKEFLAGS) install \ && $(MAKE) $(AM_MAKEFLAGS) installcheck \ && $(MAKE) $(AM_MAKEFLAGS) uninstall \ && $(MAKE) $(AM_MAKEFLAGS) distuninstallcheck_dir="$$dc_install_base" \ distuninstallcheck \ && chmod -R a-w "$$dc_install_base" \ && ({ \ (cd ../.. && umask 077 && mkdir "$$dc_destdir") \ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" install \ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" uninstall \ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" \ distuninstallcheck_dir="$$dc_destdir" distuninstallcheck; \ } || { rm -rf "$$dc_destdir"; exit 1; }) \ && rm -rf "$$dc_destdir" \ && $(MAKE) $(AM_MAKEFLAGS) dist \ && rm -rf $(DIST_ARCHIVES) \ && $(MAKE) $(AM_MAKEFLAGS) distcleancheck \ && cd "$$am__cwd" \ || exit 1 $(am__post_remove_distdir) @(echo "$(distdir) archives ready for distribution: "; \ list='$(DIST_ARCHIVES)'; for i in $$list; do echo $$i; done) | \ sed -e 1h -e 1s/./=/g -e 1p -e 1x -e '$$p' -e '$$x' distuninstallcheck: @test -n '$(distuninstallcheck_dir)' || { \ echo 'ERROR: trying to run $@ with an empty' \ '$$(distuninstallcheck_dir)' >&2; \ exit 1; \ }; \ $(am__cd) '$(distuninstallcheck_dir)' || { \ echo 'ERROR: cannot chdir into $(distuninstallcheck_dir)' >&2; \ exit 1; \ }; \ test `$(am__distuninstallcheck_listfiles) | wc -l` -eq 0 \ || { echo "ERROR: files left after uninstall:" ; \ if test -n "$(DESTDIR)"; then \ echo " (check DESTDIR support)"; \ fi ; \ $(distuninstallcheck_listfiles) ; \ exit 1; } >&2 distcleancheck: distclean @if test '$(srcdir)' = . ; then \ echo "ERROR: distcleancheck can only run from a VPATH build" ; \ exit 1 ; \ fi @test `$(distcleancheck_listfiles) | wc -l` -eq 0 \ || { echo "ERROR: files left in build directory after distclean:" ; \ $(distcleancheck_listfiles) ; \ exit 1; } >&2 check-am: all-am check: check-am all-am: Makefile $(PROGRAMS) $(DATA) installdirs: for dir in "$(DESTDIR)$(bindir)" "$(DESTDIR)$(pkgdatadir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-binPROGRAMS clean-generic mostlyclean-am distclean: distclean-am -rm -f $(am__CONFIG_DISTCLEAN_FILES) -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-pkgdataDATA install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-binPROGRAMS @$(NORMAL_INSTALL) $(MAKE) $(AM_MAKEFLAGS) install-exec-hook install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f $(am__CONFIG_DISTCLEAN_FILES) -rm -rf $(top_srcdir)/autom4te.cache -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-binPROGRAMS uninstall-pkgdataDATA @$(NORMAL_INSTALL) $(MAKE) $(AM_MAKEFLAGS) uninstall-hook .MAKE: install-am install-exec-am install-strip uninstall-am .PHONY: CTAGS GTAGS TAGS all all-am am--refresh check check-am clean \ clean-binPROGRAMS clean-cscope clean-generic cscope \ cscopelist-am ctags ctags-am dist dist-all dist-bzip2 \ dist-gzip dist-lzip dist-shar dist-tarZ dist-xz dist-zip \ distcheck distclean distclean-compile distclean-generic \ distclean-tags distcleancheck distdir distuninstallcheck dvi \ dvi-am html html-am info info-am install install-am \ install-binPROGRAMS install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-exec-hook \ install-html install-html-am install-info install-info-am \ install-man install-pdf install-pdf-am install-pkgdataDATA \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic pdf pdf-am ps ps-am tags tags-am uninstall \ uninstall-am uninstall-binPROGRAMS uninstall-hook \ uninstall-pkgdataDATA install-exec-hook: cp bison $(bindir) cp bison++.yacc $(bindir) uninstall-hook: rm $(bindir)/bison++.yacc rm $(bindir)/bison # 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: dibbler-1.0.1/bison++/getopt.cc0000664000175000017500000005174012233256142013117 00000000000000/* Getopt for GNU. NOTE: getopt is now part of the C library, so if you don't know what "Keep this file name-space clean" means, talk to roland@gnu.ai.mit.edu before changing it! Copyright (C) 1987, 88, 89, 90, 91, 92, 1993 Free Software Foundation, Inc. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ #ifdef HAVE_CONFIG_H /* We use instead of "config.h" so that a compilation using -I. -I$srcdir will use ./config.h rather than $srcdir/config.h (which it would do because getopt.c was found in $srcdir). */ #include #endif #ifndef __STDC__ /* This is a separate conditional since some stdc systems reject `defined (const)'. */ #ifndef const #define const #endif #endif /* This tells Alpha OSF/1 not to define a getopt prototype in . */ #ifndef _NO_PROTO #define _NO_PROTO #endif #include #include #include /* Comment out all this code if we are using the GNU C Library, and are not actually compiling the library itself. This code is part of the GNU C Library, but also included in many other GNU distributions. Compiling and linking in this code is a waste when using the GNU C library (especially if it is a shared library). Rather than having every GNU program understand `configure --with-gnu-libc' and omit the object files, it is simpler to just do this in the source for each such file. */ #if defined (_LIBC) || !defined (__GNU_LIBRARY__) /* This needs to come after some library #include to get __GNU_LIBRARY__ defined. */ #ifdef __GNU_LIBRARY__ /* Don't include stdlib.h for non-GNU C libraries because some of them contain conflicting prototypes for getopt. */ #include #endif /* GNU C library. */ /* If GETOPT_COMPAT is defined, `+' as well as `--' can introduce a long-named option. Because this is not POSIX.2 compliant, it is being phased out. */ /* #define GETOPT_COMPAT */ /* This version of `getopt' appears to the caller like standard Unix `getopt' but it behaves differently for the user, since it allows the user to intersperse the options with the other arguments. As `getopt' works, it permutes the elements of ARGV so that, when it is done, all the options precede everything else. Thus all application programs are extended to handle flexible argument order. Setting the environment variable POSIXLY_CORRECT disables permutation. Then the behavior is completely standard. GNU application programs can use a third alternative mode in which they can distinguish the relative order of options and other arguments. */ #include "getopt.h" /* For communication from `getopt' to the caller. When `getopt' finds an option that takes an argument, the argument value is returned here. Also, when `ordering' is RETURN_IN_ORDER, each non-option ARGV-element is returned here. */ char *optarg = 0; /* Index in ARGV of the next element to be scanned. This is used for communication to and from the caller and for communication between successive calls to `getopt'. On entry to `getopt', zero means this is the first call; initialize. When `getopt' returns EOF, this is the index of the first of the non-option elements that the caller should itself scan. Otherwise, `optind' communicates from one call to the next how much of ARGV has been scanned so far. */ /* XXX 1003.2 says this must be 1 before any call. */ int optind = 0; /* The next char to be scanned in the option-element in which the last option character we returned was found. This allows us to pick up the scan where we left off. If this is zero, or a null string, it means resume the scan by advancing to the next ARGV-element. */ static char *nextchar; /* Callers store zero here to inhibit the error message for unrecognized options. */ int opterr = 1; /* Set to an option character which was unrecognized. This must be initialized on some systems to avoid linking in the system's own getopt implementation. */ int optopt = '?'; /* Describe how to deal with options that follow non-option ARGV-elements. If the caller did not specify anything, the default is REQUIRE_ORDER if the environment variable POSIXLY_CORRECT is defined, PERMUTE otherwise. REQUIRE_ORDER means don't recognize them as options; stop option processing when the first non-option is seen. This is what Unix does. This mode of operation is selected by either setting the environment variable POSIXLY_CORRECT, or using `+' as the first character of the list of option characters. PERMUTE is the default. We permute the contents of ARGV as we scan, so that eventually all the non-options are at the end. This allows options to be given in any order, even with programs that were not written to expect this. RETURN_IN_ORDER is an option available to programs that were written to expect options and other ARGV-elements in any order and that care about the ordering of the two. We describe each non-option ARGV-element as if it were the argument of an option with character code 1. Using `-' as the first character of the list of option characters selects this mode of operation. The special argument `--' forces an end of option-scanning regardless of the value of `ordering'. In the case of RETURN_IN_ORDER, only `--' can cause `getopt' to return EOF with `optind' != ARGC. */ static enum { REQUIRE_ORDER, PERMUTE, RETURN_IN_ORDER } ordering; #ifdef __GNU_LIBRARY__ /* We want to avoid inclusion of string.h with non-GNU libraries because there are many ways it can cause trouble. On some systems, it contains special magic macros that don't work in GCC. */ #include #define my_index strchr #else /* Avoid depending on library functions or files whose names are inconsistent. */ char *getenv (); static char * my_index (const char *str, int chr) { while (*str) { if (*str == chr) return (char *) str; str++; } return 0; } /* If using GCC, we can safely declare strlen this way. If not using GCC, it is ok not to declare it. (Supposedly there are some machines where it might get a warning, but changing this conditional to __STDC__ is too risky.) */ #ifdef __GNUC__ #ifdef IN_GCC #include "gstddef.h" #else #include #endif extern size_t strlen (const char *); #endif #endif /* GNU C library. */ /* Handle permutation of arguments. */ /* Describe the part of ARGV that contains non-options that have been skipped. `first_nonopt' is the index in ARGV of the first of them; `last_nonopt' is the index after the last of them. */ static int first_nonopt; static int last_nonopt; /* Exchange two adjacent subsequences of ARGV. One subsequence is elements [first_nonopt,last_nonopt) which contains all the non-options that have been skipped so far. The other is elements [last_nonopt,optind), which contains all the options processed since those non-options were skipped. `first_nonopt' and `last_nonopt' are relocated so that they describe the new indices of the non-options in ARGV after they are moved. */ static void exchange (char **argv) { int bottom = first_nonopt; int middle = last_nonopt; int top = optind; char *tem; /* Exchange the shorter segment with the far end of the longer segment. That puts the shorter segment into the right place. It leaves the longer segment in the right place overall, but it consists of two parts that need to be swapped next. */ while (top > middle && middle > bottom) { if (top - middle > middle - bottom) { /* Bottom segment is the short one. */ int len = middle - bottom; register int i; /* Swap it with the top part of the top segment. */ for (i = 0; i < len; i++) { tem = argv[bottom + i]; argv[bottom + i] = argv[top - (middle - bottom) + i]; argv[top - (middle - bottom) + i] = tem; } /* Exclude the moved bottom segment from further swapping. */ top -= len; } else { /* Top segment is the short one. */ int len = top - middle; register int i; /* Swap it with the bottom part of the bottom segment. */ for (i = 0; i < len; i++) { tem = argv[bottom + i]; argv[bottom + i] = argv[middle + i]; argv[middle + i] = tem; } /* Exclude the moved top segment from further swapping. */ bottom += len; } } /* Update records for the slots the non-options now occupy. */ first_nonopt += (optind - last_nonopt); last_nonopt = optind; } /* Scan elements of ARGV (whose length is ARGC) for option characters given in OPTSTRING. If an element of ARGV starts with '-', and is not exactly "-" or "--", then it is an option element. The characters of this element (aside from the initial '-') are option characters. If `getopt' is called repeatedly, it returns successively each of the option characters from each of the option elements. If `getopt' finds another option character, it returns that character, updating `optind' and `nextchar' so that the next call to `getopt' can resume the scan with the following option character or ARGV-element. If there are no more option characters, `getopt' returns `EOF'. Then `optind' is the index in ARGV of the first ARGV-element that is not an option. (The ARGV-elements have been permuted so that those that are not options now come last.) OPTSTRING is a string containing the legitimate option characters. If an option character is seen that is not listed in OPTSTRING, return '?' after printing an error message. If you set `opterr' to zero, the error message is suppressed but we still return '?'. If a char in OPTSTRING is followed by a colon, that means it wants an arg, so the following text in the same ARGV-element, or the text of the following ARGV-element, is returned in `optarg'. Two colons mean an option that wants an optional arg; if there is text in the current ARGV-element, it is returned in `optarg', otherwise `optarg' is set to zero. If OPTSTRING starts with `-' or `+', it requests different methods of handling the non-option ARGV-elements. See the comments about RETURN_IN_ORDER and REQUIRE_ORDER, above. Long-named options begin with `--' instead of `-'. Their names may be abbreviated as long as the abbreviation is unique or is an exact match for some defined option. If they have an argument, it follows the option name in the same ARGV-element, separated from the option name by a `=', or else the in next ARGV-element. When `getopt' finds a long-named option, it returns 0 if that option's `flag' field is nonzero, the value of the option's `val' field if the `flag' field is zero. The elements of ARGV aren't really const, because we permute them. But we pretend they're const in the prototype to be compatible with other systems. LONGOPTS is a vector of `struct option' terminated by an element containing a name which is zero. LONGIND returns the index in LONGOPT of the long-named option found. It is only valid when a long-named option has been found by the most recent call. If LONG_ONLY is nonzero, '-' as well as '--' can introduce long-named options. */ int _getopt_internal (int argc, char *const *argv, const char *optstring, const struct option *longopts, int *longind, int long_only) { int option_index; optarg = 0; /* Initialize the internal data when the first call is made. Start processing options with ARGV-element 1 (since ARGV-element 0 is the program name); the sequence of previously skipped non-option ARGV-elements is empty. */ if (optind == 0) { first_nonopt = last_nonopt = optind = 1; nextchar = NULL; /* Determine how to handle the ordering of options and nonoptions. */ if (optstring[0] == '-') { ordering = RETURN_IN_ORDER; ++optstring; } else if (optstring[0] == '+') { ordering = REQUIRE_ORDER; ++optstring; } else if (getenv ("POSIXLY_CORRECT") != NULL) ordering = REQUIRE_ORDER; else ordering = PERMUTE; } if (nextchar == NULL || *nextchar == '\0') { if (ordering == PERMUTE) { /* If we have just processed some options following some non-options, exchange them so that the options come first. */ if (first_nonopt != last_nonopt && last_nonopt != optind) exchange ((char **) argv); else if (last_nonopt != optind) first_nonopt = optind; /* Now skip any additional non-options and extend the range of non-options previously skipped. */ while (optind < argc && (argv[optind][0] != '-' || argv[optind][1] == '\0') #ifdef GETOPT_COMPAT && (longopts == NULL || argv[optind][0] != '+' || argv[optind][1] == '\0') #endif /* GETOPT_COMPAT */ ) optind++; last_nonopt = optind; } /* Special ARGV-element `--' means premature end of options. Skip it like a null option, then exchange with previous non-options as if it were an option, then skip everything else like a non-option. */ if (optind != argc && !strcmp (argv[optind], "--")) { optind++; if (first_nonopt != last_nonopt && last_nonopt != optind) exchange ((char **) argv); else if (first_nonopt == last_nonopt) first_nonopt = optind; last_nonopt = argc; optind = argc; } /* If we have done all the ARGV-elements, stop the scan and back over any non-options that we skipped and permuted. */ if (optind == argc) { /* Set the next-arg-index to point at the non-options that we previously skipped, so the caller will digest them. */ if (first_nonopt != last_nonopt) optind = first_nonopt; return EOF; } /* If we have come to a non-option and did not permute it, either stop the scan or describe it to the caller and pass it by. */ if ((argv[optind][0] != '-' || argv[optind][1] == '\0') #ifdef GETOPT_COMPAT && (longopts == NULL || argv[optind][0] != '+' || argv[optind][1] == '\0') #endif /* GETOPT_COMPAT */ ) { if (ordering == REQUIRE_ORDER) return EOF; optarg = argv[optind++]; return 1; } /* We have found another option-ARGV-element. Start decoding its characters. */ nextchar = (argv[optind] + 1 + (longopts != NULL && argv[optind][1] == '-')); } if (longopts != NULL && ((argv[optind][0] == '-' && (argv[optind][1] == '-' || long_only)) #ifdef GETOPT_COMPAT || argv[optind][0] == '+' #endif /* GETOPT_COMPAT */ )) { const struct option *p; char *s = nextchar; int exact = 0; int ambig = 0; const struct option *pfound = NULL; int indfound; while (*s && *s != '=') s++; /* Test all options for either exact match or abbreviated matches. */ for (p = longopts, option_index = 0; p->name; p++, option_index++) if (!strncmp (p->name, nextchar, s - nextchar)) { if (s - nextchar == strlen (p->name)) { /* Exact match found. */ pfound = p; indfound = option_index; exact = 1; break; } else if (pfound == NULL) { /* First nonexact match found. */ pfound = p; indfound = option_index; } else /* Second nonexact match found. */ ambig = 1; } if (ambig && !exact) { if (opterr) fprintf (stderr, "%s: option `%s' is ambiguous\n", argv[0], argv[optind]); nextchar += strlen (nextchar); optind++; return '?'; } if (pfound != NULL) { option_index = indfound; optind++; if (*s) { /* Don't test has_arg with >, because some C compilers don't allow it to be used on enums. */ if (pfound->has_arg) optarg = s + 1; else { if (opterr) { if (argv[optind - 1][1] == '-') /* --option */ fprintf (stderr, "%s: option `--%s' doesn't allow an argument\n", argv[0], pfound->name); else /* +option or -option */ fprintf (stderr, "%s: option `%c%s' doesn't allow an argument\n", argv[0], argv[optind - 1][0], pfound->name); } nextchar += strlen (nextchar); return '?'; } } else if (pfound->has_arg == 1) { if (optind < argc) optarg = argv[optind++]; else { if (opterr) fprintf (stderr, "%s: option `%s' requires an argument\n", argv[0], argv[optind - 1]); nextchar += strlen (nextchar); return optstring[0] == ':' ? ':' : '?'; } } nextchar += strlen (nextchar); if (longind != NULL) *longind = option_index; if (pfound->flag) { *(pfound->flag) = pfound->val; return 0; } return pfound->val; } /* Can't find it as a long option. If this is not getopt_long_only, or the option starts with '--' or is not a valid short option, then it's an error. Otherwise interpret it as a short option. */ if (!long_only || argv[optind][1] == '-' #ifdef GETOPT_COMPAT || argv[optind][0] == '+' #endif /* GETOPT_COMPAT */ || my_index (optstring, *nextchar) == NULL) { if (opterr) { if (argv[optind][1] == '-') /* --option */ fprintf (stderr, "%s: unrecognized option `--%s'\n", argv[0], nextchar); else /* +option or -option */ fprintf (stderr, "%s: unrecognized option `%c%s'\n", argv[0], argv[optind][0], nextchar); } nextchar = (char *) ""; optind++; return '?'; } } /* Look at and handle the next option-character. */ { char c = *nextchar++; char *temp = my_index (optstring, c); /* Increment `optind' when we start to process its last character. */ if (*nextchar == '\0') ++optind; if (temp == NULL || c == ':') { if (opterr) { #if 0 if (c < 040 || c >= 0177) fprintf (stderr, "%s: unrecognized option, character code 0%o\n", argv[0], c); else fprintf (stderr, "%s: unrecognized option `-%c'\n", argv[0], c); #else /* 1003.2 specifies the format of this message. */ fprintf (stderr, "%s: illegal option -- %c\n", argv[0], c); #endif } optopt = c; return '?'; } if (temp[1] == ':') { if (temp[2] == ':') { /* This is an option that accepts an argument optionally. */ if (*nextchar != '\0') { optarg = nextchar; optind++; } else optarg = 0; nextchar = NULL; } else { /* This is an option that requires an argument. */ if (*nextchar != '\0') { optarg = nextchar; /* If we end this ARGV-element by taking the rest as an arg, we must advance to the next element now. */ optind++; } else if (optind == argc) { if (opterr) { #if 0 fprintf (stderr, "%s: option `-%c' requires an argument\n", argv[0], c); #else /* 1003.2 specifies the format of this message. */ fprintf (stderr, "%s: option requires an argument -- %c\n", argv[0], c); #endif } optopt = c; if (optstring[0] == ':') c = ':'; else c = '?'; } else /* We already incremented `optind' once; increment it again when taking next ARGV-elt as argument. */ optarg = argv[optind++]; nextchar = NULL; } } return c; } } int getopt (int argc, char *const *argv, const char *optstring) { return _getopt_internal (argc, argv, optstring, (const struct option *) 0, (int *) 0, 0); } #endif /* _LIBC or not __GNU_LIBRARY__. */ #ifdef TEST /* Compile with -DTEST to make an executable for use in testing the above definition of `getopt'. */ int main (argc, argv) int argc; char **argv; { int c; int digit_optind = 0; while (1) { int this_option_optind = optind ? optind : 1; c = getopt (argc, argv, "abc:d:0123456789"); if (c == EOF) break; switch (c) { case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': if (digit_optind != 0 && digit_optind != this_option_optind) printf ("digits occur in two different argv-elements.\n"); digit_optind = this_option_optind; printf ("option %c\n", c); break; case 'a': printf ("option a\n"); break; case 'b': printf ("option b\n"); break; case 'c': printf ("option c with value `%s'\n", optarg); break; case '?': break; default: printf ("?? getopt returned character code 0%o ??\n", c); } } if (optind < argc) { printf ("non-option ARGV-elements: "); while (optind < argc) printf ("%s ", argv[optind++]); printf ("\n"); } exit (0); } #endif /* TEST */ dibbler-1.0.1/bison++/symtab.h0000664000175000017500000000235512233256142012754 00000000000000/* Definitions for symtab.c and callers, part of bison, Copyright (C) 1984, 1989 Free Software Foundation, Inc. This file is part of Bison, the GNU Compiler Compiler. Bison 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. Bison 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 Bison; see the file COPYING. If not, write to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ #define TABSIZE 1009 /* symbol classes */ #define SUNKNOWN 0 #define STOKEN 1 #define SNTERM 2 typedef struct bucket { struct bucket *link; struct bucket *next; char *tag; char *type_name; short value; short prec; short assoc; short user_token_number; char internalClass; } bucket; extern bucket **symtab; extern bucket *firstsymbol; extern bucket *getsym(char*); dibbler-1.0.1/Requestor/0000775000175000017500000000000012561700422012107 500000000000000dibbler-1.0.1/Requestor/ReqCfgMgr.cpp0000644000175000017500000000030712304040124014335 00000000000000/* * Dibbler - a portable DHCPv6 * * authors: Tomasz Mrugalski * * Released under GNU GPL v2 licence * * $Id: ReqCfgMgr.cpp,v 1.1 2007-12-02 10:31:59 thomson Exp $ */ dibbler-1.0.1/Requestor/ReqMsg.cpp0000644000175000017500000000154412304040124013722 00000000000000/* * Dibbler - a portable DHCPv6 * * authors: Tomasz Mrugalski * * Released under GNU GPL v2 licence * * $Id: ReqMsg.cpp,v 1.2 2007-12-03 16:59:17 thomson Exp $ */ #include #include "ReqMsg.h" #include "DHCPConst.h" using namespace std; TReqMsg::TReqMsg(int iface, SPtr addr, int msgType) :TMsg(iface, addr, msgType) { } // used to create TMsg object based on received char[] data TReqMsg::TReqMsg(int iface, SPtr addr, char* &buf, int &bufSize) :TMsg(iface, addr, buf, bufSize) { } std::string TReqMsg::getName() const { switch (MsgType) { case LEASEQUERY_MSG: return "LEASEQUERY"; case LEASEQUERY_REPLY_MSG: return "LEASEQUERY_RSP"; default: return "unknown"; } } void TReqMsg::addOption(SPtr opt) { Options.push_back(opt); } dibbler-1.0.1/Requestor/Makefile.am0000644000175000017500000000053412277722750014077 00000000000000noinst_LIBRARIES = libRequestor.a libRequestor_a_CPPFLAGS = -I$(top_srcdir)/Misc -I$(top_srcdir)/Messages libRequestor_a_CPPFLAGS += -I$(top_srcdir)/Options -I$(top_srcdir)/IfaceMgr libRequestor_a_SOURCES = ReqCfgMgr.cpp ReqCfgMgr.h ReqMsg.cpp ReqMsg.h ReqOpt.cpp ReqOpt.h ReqOpts.cpp ReqTransMgr.cpp ReqTransMgr.h dist_noinst_DATA = TODO.txt dibbler-1.0.1/Requestor/ReqOpts.cpp0000644000175000017500000000002312277722750014135 00000000000000#include "ReqOpt.h"dibbler-1.0.1/Requestor/ReqCfgMgr.h0000644000175000017500000000065612304040124014011 00000000000000/* * Dibbler - a portable DHCPv6 * * authors: Tomasz Mrugalski * * Released under GNU GPL v2 licence * * $Id: ReqCfgMgr.h,v 1.3 2007-12-08 04:14:03 thomson Exp $ */ #ifndef REQCFGMGR_H #define REQCFGMGR_H typedef struct { // global parameters char * iface; int timeout; char * dstaddr; // message specific parameters char * addr; char * duid; } ReqCfgMgr; #endif dibbler-1.0.1/Requestor/Requestor.h0000644000175000017500000000000012304040124014144 00000000000000dibbler-1.0.1/Requestor/ReqTransMgr.h0000644000175000017500000000137512304040124014400 00000000000000/* * Dibbler - a portable DHCPv6 * * authors: Tomasz Mrugalski * * Released under GNU GPL v2 licence * * $Id: ReqTransMgr.h,v 1.5 2008-01-01 20:21:14 thomson Exp $ */ #ifndef REQIFACEMGR_H #define REQIFACEMGR_H #include "IfaceMgr.h" #include "ReqCfgMgr.h" class ReqTransMgr { public: ReqTransMgr(TIfaceMgr * ifaceMgr); void SetParams(ReqCfgMgr * cfgMgr); bool BindSockets(); bool SendMsg(); bool WaitForRsp(); private: void PrintRsp(char * buf, int bufLen); bool ParseOpts(int msgType, int recurseLevel, char * buf, int bufLen); std::string BinToString(char * buf, int bufLen); TIfaceMgr * IfaceMgr; SPtr Iface; ReqCfgMgr * CfgMgr; SPtr Socket; }; #endif dibbler-1.0.1/Requestor/Requestor.cpp0000644000175000017500000001214212304040124014511 00000000000000/* * Dibbler - a portable DHCPv6 * * author: Tomasz Mrugalski * * Released under GNU GPL v2 licence * */ #include #include #include "Portable.h" #include "ReqCfgMgr.h" #include "Portable.h" #include "IfaceMgr.h" #include "ReqTransMgr.h" #include "Logger.h" #ifdef WIN32 #include #include #endif using namespace std; void printHelp() { cout << "Usage:" << endl << "-i IFACE - send query using iface inteface, e.g. -i eth0" << endl << "-addr ADDR - query about address, e.g. -addr 2000::43" << endl << "-duid DUID - query about DUID, e.g. -duid 00:11:22:33:44:55:66:77:88" << endl << "-timeout 10 - query timeout, specified in seconds" << endl << "-dstaddr 2000::1 - destination address (by default it is ff02::1:2)" << endl; } bool parseCmdLine(ReqCfgMgr *a, int argc, char *argv[]) { char * addr = 0; char * duid = 0; char * iface = 0; char * dstaddr = 0; int timeout = 60; // default timeout value for (int i=1; iaddr = addr; a->duid = duid; a->iface = iface; a->timeout= timeout; a->dstaddr = dstaddr; return true; } int initWin() { #ifdef WIN32 WSADATA wsaData; if( WSAStartup( MAKEWORD( 2, 2 ), &wsaData )) { cout << "Unable to load WinSock 2.2 library." << endl; return -1; } #endif return 0; } int main(int argc, char *argv[]) { ReqCfgMgr a; initWin(); srand(static_cast(time(NULL))); // Windows logger::setLogName("Requestor"); logger::Initialize((char*)REQLOG_FILE); cout << DIBBLER_COPYRIGHT1 << " (REQUESTOR)" << endl; cout << DIBBLER_COPYRIGHT2 << endl; cout << DIBBLER_COPYRIGHT3 << endl; cout << DIBBLER_COPYRIGHT4 << endl; cout << endl; if (!parseCmdLine(&a, argc, argv)) { Log(Crit) << "Aborted. Invalid command-line parameters or help called." << LogEnd; printHelp(); return -1; } TIfaceMgr * ifaceMgr = new TIfaceMgr(REQIFACEMGR_FILE, true); ReqTransMgr * transMgr = new ReqTransMgr(ifaceMgr); transMgr->SetParams(&a); if (!transMgr->BindSockets()) { Log(Crit) << "Aborted. Socket binding failed." << LogEnd; return LOWLEVEL_ERROR_BIND_FAILED; } if (!transMgr->SendMsg()) { Log(Crit) << "Aborted. Message transmission failed." << LogEnd; return LOWLEVEL_ERROR_SOCKET; } if (!transMgr->WaitForRsp()) { } delete transMgr; return LOWLEVEL_NO_ERROR; } /* linker workarounds: dummy functions */ extern "C" { void *hmac_sha (const char *buffer, size_t len, char *key, size_t key_len, char *resbuf, int type) { return 0; } void *hmac_md5 (const char *buffer, size_t len, char *key, size_t key_len, char *resbuf) { return 0; } } #ifndef WIN32 //unsigned getDigestSize(enum DigestTypes type) { return 0; } #endif dibbler-1.0.1/Requestor/ReqMsg.h0000644000175000017500000000104312304040124013361 00000000000000/* * Dibbler - a portable DHCPv6 * * authors: Tomasz Mrugalski * * released under GNU GPL v2 only licence * */ #ifndef REQMSG_H #define REQMSG_H #include #include "Msg.h" #include "SmartPtr.h" class TReqMsg: public TMsg { public: TReqMsg(int iface, SPtr addr, int msgType); // used to create TMsg object based on received char[] data TReqMsg(int iface, SPtr addr, char* &buf, int &bufSize); void addOption(SPtr opt); std::string getName() const; }; #endif dibbler-1.0.1/Requestor/TODO.txt0000664000175000017500000000032612233256142013337 00000000000000 Requestor TODO ---------------- - bind socket on loopback (server and requestor on the same machine) - make dst address configurable Requestor Questions --------------------- - which address send this data to? dibbler-1.0.1/Requestor/ReqTransMgr.cpp0000644000175000017500000002273012420536342014744 00000000000000/* * Dibbler - a portable DHCPv6 * * authors: Tomasz Mrugalski * * Released under GNU GPL v2 licence * */ #include #include #include #include "SocketIPv6.h" #include "ReqTransMgr.h" #include "ReqMsg.h" #include "OptAddr.h" #include "OptDUID.h" #include "OptGeneric.h" #include "Logger.h" #include "ReqOpt.h" #include "Portable.h" #include "hex.h" using namespace std; ReqTransMgr::ReqTransMgr(TIfaceMgr * ifaceMgr) :CfgMgr(NULL) { IfaceMgr = ifaceMgr; } void ReqTransMgr::SetParams(ReqCfgMgr * cfgMgr) { CfgMgr = cfgMgr; } bool ReqTransMgr::BindSockets() { if (!CfgMgr) { Log(Crit) << "Unable to bind sockets: no configration set." << LogEnd; return false; } Iface = IfaceMgr->getIfaceByName(CfgMgr->iface); if (!Iface) { Log(Crit) << "Unable to bind sockets: Interface " << CfgMgr->iface << " not found." << LogEnd; return false; } #ifndef WIN32 Log(Info) << "Binding socket on loopback interface." << LogEnd; SPtr ptrIface; SPtr loopback; IfaceMgr->firstIface(); while (ptrIface=IfaceMgr->getIface()) { if (!ptrIface->flagLoopback()) { continue; } loopback = ptrIface; break; } if (!loopback) { Log(Crit) << "Loopback interface not found!" << LogEnd; return false; } SPtr loopAddr = new TIPv6Addr("::", true); Log(Notice) << "Creating control (" << *loopAddr << ") socket on the " << loopback->getName() << "/" << loopback->getID() << " interface." << LogEnd; if (!loopback->addSocket(loopAddr,DHCPCLIENT_PORT, false, true)) { Log(Crit) << "Proper socket creation failed." << LogEnd; return false; } loopback->firstSocket(); Socket = loopback->getSocket(); if (!Socket) { Log(Crit) << "No socket found. Something is wrong." << LogEnd; return false; } Log(Debug) << "Socket " << Socket->getFD() << " created on the " << loopback->getFullName() << " interface." << LogEnd; #endif // get link-local address char* llAddr = 0; Iface->firstLLAddress(); llAddr=Iface->getLLAddress(); if (!llAddr) { Log(Error) << "Interface " << Iface->getFullName() << " does not have link-layer address. Weird." << LogEnd; return false; } SPtr ll = new TIPv6Addr(llAddr); if (!Iface->addSocket(ll, DHCPCLIENT_PORT, true, true)) { Log(Crit) << "Socket creation or binding failed." << LogEnd; return false; } Iface->firstSocket(); Socket = Iface->getSocket(); if (!Socket) { Log(Crit) << "No socket found. Something is wrong." << LogEnd; return false; } Log(Debug) << "Socket " << Socket->getFD() << " created on the " << Iface->getFullName() << " interface." << LogEnd; return true; } bool ReqTransMgr::SendMsg() { // TODO SPtr dstAddr; if (!CfgMgr->dstaddr) dstAddr = new TIPv6Addr("ff02::1:2", true); else dstAddr = new TIPv6Addr(CfgMgr->dstaddr, true); Log(Debug) << "Transmitting data on the " << Iface->getFullName() << " interface to " << dstAddr->getPlain() << " address." << LogEnd; TReqMsg * msg = new TReqMsg(Iface->getID(), dstAddr, LEASEQUERY_MSG); char buf[1024]; int bufLen; memset(buf, 1024, 0xff); if (CfgMgr->addr) { Log(Debug) << "Creating ADDRESS-based query. Asking for " << CfgMgr->addr << " address." << LogEnd; // Address based query buf[0] = QUERY_BY_ADDRESS; // buf[1..16] - link address, leave as :: memset(buf+1, 0, 16); bufLen = 17; // add new IAADDR option SPtr a = new TIPv6Addr(CfgMgr->addr, true); TReqOptAddr * optAddr = new TReqOptAddr(OPTION_IAADDR, a, msg); optAddr->storeSelf(buf+bufLen); bufLen += optAddr->getSize(); delete optAddr; } else { Log(Debug) << "Creating DUID-based query. Asking for " << CfgMgr->duid << " DUID." << LogEnd; // DUID based query buf[0] = QUERY_BY_CLIENTID; // buf[1..16] - link address, leave as :: memset(buf+1, 0, 16); bufLen = 17; SPtr duid = new TDUID(CfgMgr->duid); TReqOptDUID * optDuid = new TReqOptDUID(OPTION_CLIENTID, duid, msg); optDuid->storeSelf(buf+bufLen); bufLen += optDuid->getSize(); delete optDuid; } SPtr clientDuid = new TDUID("00:01:00:01:0e:ec:13:db:00:02:02:02:02:02"); SPtr opt = new TReqOptDUID(OPTION_CLIENTID, clientDuid, msg); msg->addOption(opt); opt = new TReqOptGeneric(OPTION_LQ_QUERY, buf, bufLen, msg); msg->addOption(opt); char msgbuf[1024]; int msgbufLen; memset(msgbuf, 0xff, 1024); msgbufLen = msg->storeSelf(msgbuf); Log(Debug) << msg->getSize() << "-byte long LQ_QUERY message prepared." << LogEnd; if (this->Socket->send(msgbuf, msgbufLen, dstAddr, DHCPSERVER_PORT)<0) { Log(Error) << "Message transmission failed." << LogEnd; return false; } Log(Info) << "LQ_QUERY message sent." << LogEnd; return true; } bool ReqTransMgr::WaitForRsp() { char buf[1024]; int bufLen = 1024; memset(buf, 0, bufLen); SPtr sender = new TIPv6Addr(); SPtr myaddr(new TIPv6Addr()); int sockFD; Log(Debug) << "Waiting " << CfgMgr->timeout << " seconds for reply reception." << LogEnd; sockFD = this->IfaceMgr->select(CfgMgr->timeout, buf, bufLen, sender, myaddr); Log(Debug) << "Returned socketID=" << sockFD << LogEnd; if (sockFD>0) { Log(Info) << "Received " << bufLen << " bytes response." << LogEnd; PrintRsp(buf, bufLen); } else { Log(Error) << "Response not received. Timeout or socket error." << LogEnd; return false; } return true; } void ReqTransMgr::PrintRsp(char * buf, int bufLen) { if (bufLen < 4) { Log(Error) << "Unable to print message: truncated (min. len=4 required)." << LogEnd; } int msgType = buf[0]; int transId = buf[1] + 256*buf[2] + 256*256*buf[3]; Log(Info) << "MsgType: " << msgType << ", transID=0x" << hex << transId << dec << LogEnd; ParseOpts(msgType, 0, buf+4, bufLen-4); } bool ReqTransMgr::ParseOpts(int msgType, int recurseLevel, char * buf, int bufLen) { std::ostringstream o; for (int i=0; i ptr; bool print = true; while (posbufLen) { Log(Error) << linePrefix << "Message " << msgType << " truncated. There are " << (bufLen-pos) << " bytes left to parse. Bytes ignored." << LogEnd; return false; } unsigned short code = readUint16(buf+pos); pos += sizeof(uint16_t); unsigned short length = readUint16(buf+pos); pos += sizeof(uint16_t); if (pos+length>bufLen) { Log(Error) << linePrefix << "Truncated option (type=" << code << ", len=" << length << " received in message << " << msgType << ". Option ignored." << LogEnd; pos += length; continue; } if (!allowOptInMsg(msgType,code)) { Log(Warning) << linePrefix << "Invalid option received: Option " << code << " not allowed in message type " << msgType << ". Ignored." << LogEnd; pos+=length; continue; } if (!recurseLevel && !allowOptInOpt(msgType,0,code)) { Log(Warning) << "Invalid option received: Option " << code << " not allowed in message type "<< msgType << " as a base option (as suboption only permitted). Ignored." << LogEnd; pos+=length; continue; } string name, o; o = ""; name = ""; switch (code) { case OPTION_STATUS_CODE: { name ="Status Code"; unsigned int st = buf[pos]*256 + buf[pos+1]; char *Message = new char[length+10]; memcpy(Message,buf+pos+2,length-2); sprintf(Message+length-2, "(%u)", st); o = string(Message); delete [] Message; break; } case OPTION_CLIENTID: name = "ClientID"; o = BinToString(buf+pos, length); break; case OPTION_SERVERID: name = "ServerID"; o = BinToString(buf+pos, length); break; case OPTION_LQ_QUERY: name = "LQ Query Option"; break; case OPTION_CLIENT_DATA: name = "LQ Client Data Option"; Log(Info) << linePrefix << "Option " << name << "(code=" << code << "), len=" << length << LogEnd; ParseOpts(msgType, recurseLevel+1, buf+pos, length); print = false; break; case OPTION_CLT_TIME: { name = "LQ Client Last Transmission Time"; unsigned int t = readUint32(buf+pos); ostringstream out; out << t << " second(s)"; o = out.str(); break; } case OPTION_LQ_RELAY_DATA: name = "LQ Relay Data"; break; case OPTION_LQ_CLIENT_LINK: name = "LQ Client Link"; break; case OPTION_IAADDR: { TIPv6Addr * addr = new TIPv6Addr(buf+pos, false); unsigned int pref = readUint32(buf+pos+16); unsigned int valid = readUint32(buf+pos+20); name = "IAADDR"; ostringstream out; out << "addr=" << addr->getPlain() << ", pref=" << pref << ", valid=" << valid; o = out.str(); break; } default: break; } if (print) Log(Info) << linePrefix << "Option " << name << "(code=" << code << "), len=" << length << ": " << o << LogEnd; print = true; pos+=length; } return true; } string ReqTransMgr::BinToString(char * buf, int bufLen) { return (hexToText((uint8_t*)buf, bufLen, true)); } dibbler-1.0.1/Requestor/Makefile.in0000664000175000017500000007125712561652535014123 00000000000000# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = Requestor DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/depcomp $(dist_noinst_DATA) ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/libtool.m4 \ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/include/dibbler-config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = LIBRARIES = $(noinst_LIBRARIES) ARFLAGS = cru AM_V_AR = $(am__v_AR_@AM_V@) am__v_AR_ = $(am__v_AR_@AM_DEFAULT_V@) am__v_AR_0 = @echo " AR " $@; am__v_AR_1 = libRequestor_a_AR = $(AR) $(ARFLAGS) libRequestor_a_LIBADD = am_libRequestor_a_OBJECTS = libRequestor_a-ReqCfgMgr.$(OBJEXT) \ libRequestor_a-ReqMsg.$(OBJEXT) \ libRequestor_a-ReqOpt.$(OBJEXT) \ libRequestor_a-ReqOpts.$(OBJEXT) \ libRequestor_a-ReqTransMgr.$(OBJEXT) libRequestor_a_OBJECTS = $(am_libRequestor_a_OBJECTS) AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)/include depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) LTCXXCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CXXFLAGS) $(CXXFLAGS) AM_V_CXX = $(am__v_CXX_@AM_V@) am__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@) am__v_CXX_0 = @echo " CXX " $@; am__v_CXX_1 = CXXLD = $(CXX) CXXLINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \ $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CXXLD = $(am__v_CXXLD_@AM_V@) am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@) am__v_CXXLD_0 = @echo " CXXLD " $@; am__v_CXXLD_1 = COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(libRequestor_a_SOURCES) DIST_SOURCES = $(libRequestor_a_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac DATA = $(dist_noinst_DATA) am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALLOCA = @ALLOCA@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ ARCH = @ARCH@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ EXTRA_DIST_SUBDIRS = @EXTRA_DIST_SUBDIRS@ FGREP = @FGREP@ GREP = @GREP@ GTEST_INCLUDES = @GTEST_INCLUDES@ GTEST_LDADD = @GTEST_LDADD@ GTEST_LDFLAGS = @GTEST_LDFLAGS@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LINKPRINT = @LINKPRINT@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PORT_CFLAGS = @PORT_CFLAGS@ PORT_LDFLAGS = @PORT_LDFLAGS@ PORT_SUBDIR = @PORT_SUBDIR@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ subdirs = @subdirs@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ noinst_LIBRARIES = libRequestor.a libRequestor_a_CPPFLAGS = -I$(top_srcdir)/Misc \ -I$(top_srcdir)/Messages -I$(top_srcdir)/Options \ -I$(top_srcdir)/IfaceMgr libRequestor_a_SOURCES = ReqCfgMgr.cpp ReqCfgMgr.h ReqMsg.cpp ReqMsg.h ReqOpt.cpp ReqOpt.h ReqOpts.cpp ReqTransMgr.cpp ReqTransMgr.h dist_noinst_DATA = TODO.txt all: all-am .SUFFIXES: .SUFFIXES: .cpp .lo .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign Requestor/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign Requestor/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstLIBRARIES: -test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES) libRequestor.a: $(libRequestor_a_OBJECTS) $(libRequestor_a_DEPENDENCIES) $(EXTRA_libRequestor_a_DEPENDENCIES) $(AM_V_at)-rm -f libRequestor.a $(AM_V_AR)$(libRequestor_a_AR) libRequestor.a $(libRequestor_a_OBJECTS) $(libRequestor_a_LIBADD) $(AM_V_at)$(RANLIB) libRequestor.a mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libRequestor_a-ReqCfgMgr.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libRequestor_a-ReqMsg.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libRequestor_a-ReqOpt.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libRequestor_a-ReqOpts.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libRequestor_a-ReqTransMgr.Po@am__quote@ .cpp.o: @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $< .cpp.obj: @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .cpp.lo: @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LTCXXCOMPILE) -c -o $@ $< libRequestor_a-ReqCfgMgr.o: ReqCfgMgr.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libRequestor_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libRequestor_a-ReqCfgMgr.o -MD -MP -MF $(DEPDIR)/libRequestor_a-ReqCfgMgr.Tpo -c -o libRequestor_a-ReqCfgMgr.o `test -f 'ReqCfgMgr.cpp' || echo '$(srcdir)/'`ReqCfgMgr.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libRequestor_a-ReqCfgMgr.Tpo $(DEPDIR)/libRequestor_a-ReqCfgMgr.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='ReqCfgMgr.cpp' object='libRequestor_a-ReqCfgMgr.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libRequestor_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libRequestor_a-ReqCfgMgr.o `test -f 'ReqCfgMgr.cpp' || echo '$(srcdir)/'`ReqCfgMgr.cpp libRequestor_a-ReqCfgMgr.obj: ReqCfgMgr.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libRequestor_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libRequestor_a-ReqCfgMgr.obj -MD -MP -MF $(DEPDIR)/libRequestor_a-ReqCfgMgr.Tpo -c -o libRequestor_a-ReqCfgMgr.obj `if test -f 'ReqCfgMgr.cpp'; then $(CYGPATH_W) 'ReqCfgMgr.cpp'; else $(CYGPATH_W) '$(srcdir)/ReqCfgMgr.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libRequestor_a-ReqCfgMgr.Tpo $(DEPDIR)/libRequestor_a-ReqCfgMgr.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='ReqCfgMgr.cpp' object='libRequestor_a-ReqCfgMgr.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libRequestor_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libRequestor_a-ReqCfgMgr.obj `if test -f 'ReqCfgMgr.cpp'; then $(CYGPATH_W) 'ReqCfgMgr.cpp'; else $(CYGPATH_W) '$(srcdir)/ReqCfgMgr.cpp'; fi` libRequestor_a-ReqMsg.o: ReqMsg.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libRequestor_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libRequestor_a-ReqMsg.o -MD -MP -MF $(DEPDIR)/libRequestor_a-ReqMsg.Tpo -c -o libRequestor_a-ReqMsg.o `test -f 'ReqMsg.cpp' || echo '$(srcdir)/'`ReqMsg.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libRequestor_a-ReqMsg.Tpo $(DEPDIR)/libRequestor_a-ReqMsg.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='ReqMsg.cpp' object='libRequestor_a-ReqMsg.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libRequestor_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libRequestor_a-ReqMsg.o `test -f 'ReqMsg.cpp' || echo '$(srcdir)/'`ReqMsg.cpp libRequestor_a-ReqMsg.obj: ReqMsg.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libRequestor_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libRequestor_a-ReqMsg.obj -MD -MP -MF $(DEPDIR)/libRequestor_a-ReqMsg.Tpo -c -o libRequestor_a-ReqMsg.obj `if test -f 'ReqMsg.cpp'; then $(CYGPATH_W) 'ReqMsg.cpp'; else $(CYGPATH_W) '$(srcdir)/ReqMsg.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libRequestor_a-ReqMsg.Tpo $(DEPDIR)/libRequestor_a-ReqMsg.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='ReqMsg.cpp' object='libRequestor_a-ReqMsg.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libRequestor_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libRequestor_a-ReqMsg.obj `if test -f 'ReqMsg.cpp'; then $(CYGPATH_W) 'ReqMsg.cpp'; else $(CYGPATH_W) '$(srcdir)/ReqMsg.cpp'; fi` libRequestor_a-ReqOpt.o: ReqOpt.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libRequestor_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libRequestor_a-ReqOpt.o -MD -MP -MF $(DEPDIR)/libRequestor_a-ReqOpt.Tpo -c -o libRequestor_a-ReqOpt.o `test -f 'ReqOpt.cpp' || echo '$(srcdir)/'`ReqOpt.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libRequestor_a-ReqOpt.Tpo $(DEPDIR)/libRequestor_a-ReqOpt.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='ReqOpt.cpp' object='libRequestor_a-ReqOpt.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libRequestor_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libRequestor_a-ReqOpt.o `test -f 'ReqOpt.cpp' || echo '$(srcdir)/'`ReqOpt.cpp libRequestor_a-ReqOpt.obj: ReqOpt.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libRequestor_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libRequestor_a-ReqOpt.obj -MD -MP -MF $(DEPDIR)/libRequestor_a-ReqOpt.Tpo -c -o libRequestor_a-ReqOpt.obj `if test -f 'ReqOpt.cpp'; then $(CYGPATH_W) 'ReqOpt.cpp'; else $(CYGPATH_W) '$(srcdir)/ReqOpt.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libRequestor_a-ReqOpt.Tpo $(DEPDIR)/libRequestor_a-ReqOpt.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='ReqOpt.cpp' object='libRequestor_a-ReqOpt.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libRequestor_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libRequestor_a-ReqOpt.obj `if test -f 'ReqOpt.cpp'; then $(CYGPATH_W) 'ReqOpt.cpp'; else $(CYGPATH_W) '$(srcdir)/ReqOpt.cpp'; fi` libRequestor_a-ReqOpts.o: ReqOpts.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libRequestor_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libRequestor_a-ReqOpts.o -MD -MP -MF $(DEPDIR)/libRequestor_a-ReqOpts.Tpo -c -o libRequestor_a-ReqOpts.o `test -f 'ReqOpts.cpp' || echo '$(srcdir)/'`ReqOpts.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libRequestor_a-ReqOpts.Tpo $(DEPDIR)/libRequestor_a-ReqOpts.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='ReqOpts.cpp' object='libRequestor_a-ReqOpts.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libRequestor_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libRequestor_a-ReqOpts.o `test -f 'ReqOpts.cpp' || echo '$(srcdir)/'`ReqOpts.cpp libRequestor_a-ReqOpts.obj: ReqOpts.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libRequestor_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libRequestor_a-ReqOpts.obj -MD -MP -MF $(DEPDIR)/libRequestor_a-ReqOpts.Tpo -c -o libRequestor_a-ReqOpts.obj `if test -f 'ReqOpts.cpp'; then $(CYGPATH_W) 'ReqOpts.cpp'; else $(CYGPATH_W) '$(srcdir)/ReqOpts.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libRequestor_a-ReqOpts.Tpo $(DEPDIR)/libRequestor_a-ReqOpts.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='ReqOpts.cpp' object='libRequestor_a-ReqOpts.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libRequestor_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libRequestor_a-ReqOpts.obj `if test -f 'ReqOpts.cpp'; then $(CYGPATH_W) 'ReqOpts.cpp'; else $(CYGPATH_W) '$(srcdir)/ReqOpts.cpp'; fi` libRequestor_a-ReqTransMgr.o: ReqTransMgr.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libRequestor_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libRequestor_a-ReqTransMgr.o -MD -MP -MF $(DEPDIR)/libRequestor_a-ReqTransMgr.Tpo -c -o libRequestor_a-ReqTransMgr.o `test -f 'ReqTransMgr.cpp' || echo '$(srcdir)/'`ReqTransMgr.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libRequestor_a-ReqTransMgr.Tpo $(DEPDIR)/libRequestor_a-ReqTransMgr.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='ReqTransMgr.cpp' object='libRequestor_a-ReqTransMgr.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libRequestor_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libRequestor_a-ReqTransMgr.o `test -f 'ReqTransMgr.cpp' || echo '$(srcdir)/'`ReqTransMgr.cpp libRequestor_a-ReqTransMgr.obj: ReqTransMgr.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libRequestor_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libRequestor_a-ReqTransMgr.obj -MD -MP -MF $(DEPDIR)/libRequestor_a-ReqTransMgr.Tpo -c -o libRequestor_a-ReqTransMgr.obj `if test -f 'ReqTransMgr.cpp'; then $(CYGPATH_W) 'ReqTransMgr.cpp'; else $(CYGPATH_W) '$(srcdir)/ReqTransMgr.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libRequestor_a-ReqTransMgr.Tpo $(DEPDIR)/libRequestor_a-ReqTransMgr.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='ReqTransMgr.cpp' object='libRequestor_a-ReqTransMgr.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libRequestor_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libRequestor_a-ReqTransMgr.obj `if test -f 'ReqTransMgr.cpp'; then $(CYGPATH_W) 'ReqTransMgr.cpp'; else $(CYGPATH_W) '$(srcdir)/ReqTransMgr.cpp'; fi` mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LIBRARIES) $(DATA) installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool clean-noinstLIBRARIES \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \ clean-libtool clean-noinstLIBRARIES cscopelist-am ctags \ ctags-am distclean distclean-compile distclean-generic \ distclean-libtool distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-dvi install-dvi-am install-exec \ install-exec-am install-html install-html-am install-info \ install-info-am install-man install-pdf install-pdf-am \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ tags tags-am uninstall uninstall-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: dibbler-1.0.1/Requestor/ReqOpt.h0000644000175000017500000000142112304040124013375 00000000000000/* * Dibbler - a portable DHCPv6 * * authors: Tomasz Mrugalski * * released under GNU GPL v2 only licence * * $Id: ReqOpt.h,v 1.3 2008-08-29 00:07:33 thomson Exp $ * */ #ifndef REQOPT_H #define REQOPT_H #include "Opt.h" #include "OptIAAddress.h" #include "OptDUID.h" #include "OptGeneric.h" class TReqOptAddr : public TOptIAAddress { public: TReqOptAddr(int type, SPtr addr, TMsg * parent); protected: bool doDuties(); }; class TReqOptDUID : public TOptDUID { public: TReqOptDUID(int type, SPtr duid, TMsg* parent); protected: bool doDuties(); }; class TReqOptGeneric : public TOptGeneric { public: TReqOptGeneric(int optType, char * data, int dataLen, TMsg* parent); protected: bool doDuties(); }; #endif dibbler-1.0.1/Requestor/ReqOpt.cpp0000644000175000017500000000136212304040124013734 00000000000000/* * Dibbler - a portable DHCPv6 * * authors: Tomasz Mrugalski * * released under GNU GPL v2 only licence * * $Id: ReqOpt.cpp,v 1.3 2008-08-29 00:07:33 thomson Exp $ * */ #include "ReqOpt.h" TReqOptAddr::TReqOptAddr(int type, SPtr addr, TMsg * parent) :TOptIAAddress(addr, 0x33333333, 0x88888888, parent) { } bool TReqOptAddr::doDuties() { return true; } TReqOptDUID::TReqOptDUID(int type, SPtr duid, TMsg* parent) :TOptDUID(type, duid, parent) { } bool TReqOptDUID::doDuties() { return true; } TReqOptGeneric::TReqOptGeneric(int optType, char * data, int dataLen, TMsg* parent) :TOptGeneric(optType, data, dataLen, parent) { } bool TReqOptGeneric::doDuties() { return true; } dibbler-1.0.1/ltmain.sh0000644000175000017500000105162712277722750011704 00000000000000 # libtool (GNU libtool) 2.4.2 # Written by Gordon Matzigkeit , 1996 # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, 2006, # 2007, 2008, 2009, 2010, 2011 Free Software Foundation, Inc. # This is free software; see the source for copying conditions. There is NO # warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # GNU Libtool is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # As a special exception to the GNU General Public License, # if you distribute this file as part of a program or library that # is built using GNU Libtool, you may include this file under the # same distribution terms that you use for the rest of that program. # # GNU Libtool is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # # You should have received a copy of the GNU General Public License # along with GNU Libtool; see the file COPYING. If not, a copy # can be downloaded from http://www.gnu.org/licenses/gpl.html, # or obtained by writing to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # Usage: $progname [OPTION]... [MODE-ARG]... # # Provide generalized library-building support services. # # --config show all configuration variables # --debug enable verbose shell tracing # -n, --dry-run display commands without modifying any files # --features display basic configuration information and exit # --mode=MODE use operation mode MODE # --preserve-dup-deps don't remove duplicate dependency libraries # --quiet, --silent don't print informational messages # --no-quiet, --no-silent # print informational messages (default) # --no-warn don't display warning messages # --tag=TAG use configuration variables from tag TAG # -v, --verbose print more informational messages than default # --no-verbose don't print the extra informational messages # --version print version information # -h, --help, --help-all print short, long, or detailed help message # # MODE must be one of the following: # # clean remove files from the build directory # compile compile a source file into a libtool object # execute automatically set library path, then run a program # finish complete the installation of libtool libraries # install install libraries or executables # link create a library or an executable # uninstall remove libraries from an installed directory # # MODE-ARGS vary depending on the MODE. When passed as first option, # `--mode=MODE' may be abbreviated as `MODE' or a unique abbreviation of that. # Try `$progname --help --mode=MODE' for a more detailed description of MODE. # # When reporting a bug, please describe a test case to reproduce it and # include the following information: # # host-triplet: $host # shell: $SHELL # compiler: $LTCC # compiler flags: $LTCFLAGS # linker: $LD (gnu? $with_gnu_ld) # $progname: (GNU libtool) 2.4.2 # automake: $automake_version # autoconf: $autoconf_version # # Report bugs to . # GNU libtool home page: . # General help using GNU software: . PROGRAM=libtool PACKAGE=libtool VERSION=2.4.2 TIMESTAMP="" package_revision=1.3337 # Be Bourne compatible if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then emulate sh NULLCMD=: # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in *posix*) set -o posix;; esac fi BIN_SH=xpg4; export BIN_SH # for Tru64 DUALCASE=1; export DUALCASE # for MKS sh # A function that is used when there is no print builtin or printf. func_fallback_echo () { eval 'cat <<_LTECHO_EOF $1 _LTECHO_EOF' } # NLS nuisances: We save the old values to restore during execute mode. lt_user_locale= lt_safe_locale= for lt_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES do eval "if test \"\${$lt_var+set}\" = set; then save_$lt_var=\$$lt_var $lt_var=C export $lt_var lt_user_locale=\"$lt_var=\\\$save_\$lt_var; \$lt_user_locale\" lt_safe_locale=\"$lt_var=C; \$lt_safe_locale\" fi" done LC_ALL=C LANGUAGE=C export LANGUAGE LC_ALL $lt_unset CDPATH # Work around backward compatibility issue on IRIX 6.5. On IRIX 6.4+, sh # is ksh but when the shell is invoked as "sh" and the current value of # the _XPG environment variable is not equal to 1 (one), the special # positional parameter $0, within a function call, is the name of the # function. progpath="$0" : ${CP="cp -f"} test "${ECHO+set}" = set || ECHO=${as_echo-'printf %s\n'} : ${MAKE="make"} : ${MKDIR="mkdir"} : ${MV="mv -f"} : ${RM="rm -f"} : ${SHELL="${CONFIG_SHELL-/bin/sh}"} : ${Xsed="$SED -e 1s/^X//"} # Global variables: EXIT_SUCCESS=0 EXIT_FAILURE=1 EXIT_MISMATCH=63 # $? = 63 is used to indicate version mismatch to missing. EXIT_SKIP=77 # $? = 77 is used to indicate a skipped test to automake. exit_status=$EXIT_SUCCESS # Make sure IFS has a sensible default lt_nl=' ' IFS=" $lt_nl" dirname="s,/[^/]*$,," basename="s,^.*/,," # func_dirname file append nondir_replacement # Compute the dirname of FILE. If nonempty, add APPEND to the result, # otherwise set result to NONDIR_REPLACEMENT. func_dirname () { func_dirname_result=`$ECHO "${1}" | $SED "$dirname"` if test "X$func_dirname_result" = "X${1}"; then func_dirname_result="${3}" else func_dirname_result="$func_dirname_result${2}" fi } # func_dirname may be replaced by extended shell implementation # func_basename file func_basename () { func_basename_result=`$ECHO "${1}" | $SED "$basename"` } # func_basename may be replaced by extended shell implementation # func_dirname_and_basename file append nondir_replacement # perform func_basename and func_dirname in a single function # call: # dirname: Compute the dirname of FILE. If nonempty, # add APPEND to the result, otherwise set result # to NONDIR_REPLACEMENT. # value returned in "$func_dirname_result" # basename: Compute filename of FILE. # value retuned in "$func_basename_result" # Implementation must be kept synchronized with func_dirname # and func_basename. For efficiency, we do not delegate to # those functions but instead duplicate the functionality here. func_dirname_and_basename () { # Extract subdirectory from the argument. func_dirname_result=`$ECHO "${1}" | $SED -e "$dirname"` if test "X$func_dirname_result" = "X${1}"; then func_dirname_result="${3}" else func_dirname_result="$func_dirname_result${2}" fi func_basename_result=`$ECHO "${1}" | $SED -e "$basename"` } # func_dirname_and_basename may be replaced by extended shell implementation # func_stripname prefix suffix name # strip PREFIX and SUFFIX off of NAME. # PREFIX and SUFFIX must not contain globbing or regex special # characters, hashes, percent signs, but SUFFIX may contain a leading # dot (in which case that matches only a dot). # func_strip_suffix prefix name func_stripname () { case ${2} in .*) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%\\\\${2}\$%%"`;; *) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%${2}\$%%"`;; esac } # func_stripname may be replaced by extended shell implementation # These SED scripts presuppose an absolute path with a trailing slash. pathcar='s,^/\([^/]*\).*$,\1,' pathcdr='s,^/[^/]*,,' removedotparts=':dotsl s@/\./@/@g t dotsl s,/\.$,/,' collapseslashes='s@/\{1,\}@/@g' finalslash='s,/*$,/,' # func_normal_abspath PATH # Remove doubled-up and trailing slashes, "." path components, # and cancel out any ".." path components in PATH after making # it an absolute path. # value returned in "$func_normal_abspath_result" func_normal_abspath () { # Start from root dir and reassemble the path. func_normal_abspath_result= func_normal_abspath_tpath=$1 func_normal_abspath_altnamespace= case $func_normal_abspath_tpath in "") # Empty path, that just means $cwd. func_stripname '' '/' "`pwd`" func_normal_abspath_result=$func_stripname_result return ;; # The next three entries are used to spot a run of precisely # two leading slashes without using negated character classes; # we take advantage of case's first-match behaviour. ///*) # Unusual form of absolute path, do nothing. ;; //*) # Not necessarily an ordinary path; POSIX reserves leading '//' # and for example Cygwin uses it to access remote file shares # over CIFS/SMB, so we conserve a leading double slash if found. func_normal_abspath_altnamespace=/ ;; /*) # Absolute path, do nothing. ;; *) # Relative path, prepend $cwd. func_normal_abspath_tpath=`pwd`/$func_normal_abspath_tpath ;; esac # Cancel out all the simple stuff to save iterations. We also want # the path to end with a slash for ease of parsing, so make sure # there is one (and only one) here. func_normal_abspath_tpath=`$ECHO "$func_normal_abspath_tpath" | $SED \ -e "$removedotparts" -e "$collapseslashes" -e "$finalslash"` while :; do # Processed it all yet? if test "$func_normal_abspath_tpath" = / ; then # If we ascended to the root using ".." the result may be empty now. if test -z "$func_normal_abspath_result" ; then func_normal_abspath_result=/ fi break fi func_normal_abspath_tcomponent=`$ECHO "$func_normal_abspath_tpath" | $SED \ -e "$pathcar"` func_normal_abspath_tpath=`$ECHO "$func_normal_abspath_tpath" | $SED \ -e "$pathcdr"` # Figure out what to do with it case $func_normal_abspath_tcomponent in "") # Trailing empty path component, ignore it. ;; ..) # Parent dir; strip last assembled component from result. func_dirname "$func_normal_abspath_result" func_normal_abspath_result=$func_dirname_result ;; *) # Actual path component, append it. func_normal_abspath_result=$func_normal_abspath_result/$func_normal_abspath_tcomponent ;; esac done # Restore leading double-slash if one was found on entry. func_normal_abspath_result=$func_normal_abspath_altnamespace$func_normal_abspath_result } # func_relative_path SRCDIR DSTDIR # generates a relative path from SRCDIR to DSTDIR, with a trailing # slash if non-empty, suitable for immediately appending a filename # without needing to append a separator. # value returned in "$func_relative_path_result" func_relative_path () { func_relative_path_result= func_normal_abspath "$1" func_relative_path_tlibdir=$func_normal_abspath_result func_normal_abspath "$2" func_relative_path_tbindir=$func_normal_abspath_result # Ascend the tree starting from libdir while :; do # check if we have found a prefix of bindir case $func_relative_path_tbindir in $func_relative_path_tlibdir) # found an exact match func_relative_path_tcancelled= break ;; $func_relative_path_tlibdir*) # found a matching prefix func_stripname "$func_relative_path_tlibdir" '' "$func_relative_path_tbindir" func_relative_path_tcancelled=$func_stripname_result if test -z "$func_relative_path_result"; then func_relative_path_result=. fi break ;; *) func_dirname $func_relative_path_tlibdir func_relative_path_tlibdir=${func_dirname_result} if test "x$func_relative_path_tlibdir" = x ; then # Have to descend all the way to the root! func_relative_path_result=../$func_relative_path_result func_relative_path_tcancelled=$func_relative_path_tbindir break fi func_relative_path_result=../$func_relative_path_result ;; esac done # Now calculate path; take care to avoid doubling-up slashes. func_stripname '' '/' "$func_relative_path_result" func_relative_path_result=$func_stripname_result func_stripname '/' '/' "$func_relative_path_tcancelled" if test "x$func_stripname_result" != x ; then func_relative_path_result=${func_relative_path_result}/${func_stripname_result} fi # Normalisation. If bindir is libdir, return empty string, # else relative path ending with a slash; either way, target # file name can be directly appended. if test ! -z "$func_relative_path_result"; then func_stripname './' '' "$func_relative_path_result/" func_relative_path_result=$func_stripname_result fi } # The name of this program: func_dirname_and_basename "$progpath" progname=$func_basename_result # Make sure we have an absolute path for reexecution: case $progpath in [\\/]*|[A-Za-z]:\\*) ;; *[\\/]*) progdir=$func_dirname_result progdir=`cd "$progdir" && pwd` progpath="$progdir/$progname" ;; *) save_IFS="$IFS" IFS=${PATH_SEPARATOR-:} for progdir in $PATH; do IFS="$save_IFS" test -x "$progdir/$progname" && break done IFS="$save_IFS" test -n "$progdir" || progdir=`pwd` progpath="$progdir/$progname" ;; esac # Sed substitution that helps us do robust quoting. It backslashifies # metacharacters that are still active within double-quoted strings. Xsed="${SED}"' -e 1s/^X//' sed_quote_subst='s/\([`"$\\]\)/\\\1/g' # Same as above, but do not quote variable references. double_quote_subst='s/\(["`\\]\)/\\\1/g' # Sed substitution that turns a string into a regex matching for the # string literally. sed_make_literal_regex='s,[].[^$\\*\/],\\&,g' # Sed substitution that converts a w32 file name or path # which contains forward slashes, into one that contains # (escaped) backslashes. A very naive implementation. lt_sed_naive_backslashify='s|\\\\*|\\|g;s|/|\\|g;s|\\|\\\\|g' # Re-`\' parameter expansions in output of double_quote_subst that were # `\'-ed in input to the same. If an odd number of `\' preceded a '$' # in input to double_quote_subst, that '$' was protected from expansion. # Since each input `\' is now two `\'s, look for any number of runs of # four `\'s followed by two `\'s and then a '$'. `\' that '$'. bs='\\' bs2='\\\\' bs4='\\\\\\\\' dollar='\$' sed_double_backslash="\ s/$bs4/&\\ /g s/^$bs2$dollar/$bs&/ s/\\([^$bs]\\)$bs2$dollar/\\1$bs2$bs$dollar/g s/\n//g" # Standard options: opt_dry_run=false opt_help=false opt_quiet=false opt_verbose=false opt_warning=: # func_echo arg... # Echo program name prefixed message, along with the current mode # name if it has been set yet. func_echo () { $ECHO "$progname: ${opt_mode+$opt_mode: }$*" } # func_verbose arg... # Echo program name prefixed message in verbose mode only. func_verbose () { $opt_verbose && func_echo ${1+"$@"} # A bug in bash halts the script if the last line of a function # fails when set -e is in force, so we need another command to # work around that: : } # func_echo_all arg... # Invoke $ECHO with all args, space-separated. func_echo_all () { $ECHO "$*" } # func_error arg... # Echo program name prefixed message to standard error. func_error () { $ECHO "$progname: ${opt_mode+$opt_mode: }"${1+"$@"} 1>&2 } # func_warning arg... # Echo program name prefixed warning message to standard error. func_warning () { $opt_warning && $ECHO "$progname: ${opt_mode+$opt_mode: }warning: "${1+"$@"} 1>&2 # bash bug again: : } # func_fatal_error arg... # Echo program name prefixed message to standard error, and exit. func_fatal_error () { func_error ${1+"$@"} exit $EXIT_FAILURE } # func_fatal_help arg... # Echo program name prefixed message to standard error, followed by # a help hint, and exit. func_fatal_help () { func_error ${1+"$@"} func_fatal_error "$help" } help="Try \`$progname --help' for more information." ## default # func_grep expression filename # Check whether EXPRESSION matches any line of FILENAME, without output. func_grep () { $GREP "$1" "$2" >/dev/null 2>&1 } # func_mkdir_p directory-path # Make sure the entire path to DIRECTORY-PATH is available. func_mkdir_p () { my_directory_path="$1" my_dir_list= if test -n "$my_directory_path" && test "$opt_dry_run" != ":"; then # Protect directory names starting with `-' case $my_directory_path in -*) my_directory_path="./$my_directory_path" ;; esac # While some portion of DIR does not yet exist... while test ! -d "$my_directory_path"; do # ...make a list in topmost first order. Use a colon delimited # list incase some portion of path contains whitespace. my_dir_list="$my_directory_path:$my_dir_list" # If the last portion added has no slash in it, the list is done case $my_directory_path in */*) ;; *) break ;; esac # ...otherwise throw away the child directory and loop my_directory_path=`$ECHO "$my_directory_path" | $SED -e "$dirname"` done my_dir_list=`$ECHO "$my_dir_list" | $SED 's,:*$,,'` save_mkdir_p_IFS="$IFS"; IFS=':' for my_dir in $my_dir_list; do IFS="$save_mkdir_p_IFS" # mkdir can fail with a `File exist' error if two processes # try to create one of the directories concurrently. Don't # stop in that case! $MKDIR "$my_dir" 2>/dev/null || : done IFS="$save_mkdir_p_IFS" # Bail out if we (or some other process) failed to create a directory. test -d "$my_directory_path" || \ func_fatal_error "Failed to create \`$1'" fi } # func_mktempdir [string] # Make a temporary directory that won't clash with other running # libtool processes, and avoids race conditions if possible. If # given, STRING is the basename for that directory. func_mktempdir () { my_template="${TMPDIR-/tmp}/${1-$progname}" if test "$opt_dry_run" = ":"; then # Return a directory name, but don't create it in dry-run mode my_tmpdir="${my_template}-$$" else # If mktemp works, use that first and foremost my_tmpdir=`mktemp -d "${my_template}-XXXXXXXX" 2>/dev/null` if test ! -d "$my_tmpdir"; then # Failing that, at least try and use $RANDOM to avoid a race my_tmpdir="${my_template}-${RANDOM-0}$$" save_mktempdir_umask=`umask` umask 0077 $MKDIR "$my_tmpdir" umask $save_mktempdir_umask fi # If we're not in dry-run mode, bomb out on failure test -d "$my_tmpdir" || \ func_fatal_error "cannot create temporary directory \`$my_tmpdir'" fi $ECHO "$my_tmpdir" } # func_quote_for_eval arg # Aesthetically quote ARG to be evaled later. # This function returns two values: FUNC_QUOTE_FOR_EVAL_RESULT # is double-quoted, suitable for a subsequent eval, whereas # FUNC_QUOTE_FOR_EVAL_UNQUOTED_RESULT has merely all characters # which are still active within double quotes backslashified. func_quote_for_eval () { case $1 in *[\\\`\"\$]*) func_quote_for_eval_unquoted_result=`$ECHO "$1" | $SED "$sed_quote_subst"` ;; *) func_quote_for_eval_unquoted_result="$1" ;; esac case $func_quote_for_eval_unquoted_result in # Double-quote args containing shell metacharacters to delay # word splitting, command substitution and and variable # expansion for a subsequent eval. # Many Bourne shells cannot handle close brackets correctly # in scan sets, so we specify it separately. *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") func_quote_for_eval_result="\"$func_quote_for_eval_unquoted_result\"" ;; *) func_quote_for_eval_result="$func_quote_for_eval_unquoted_result" esac } # func_quote_for_expand arg # Aesthetically quote ARG to be evaled later; same as above, # but do not quote variable references. func_quote_for_expand () { case $1 in *[\\\`\"]*) my_arg=`$ECHO "$1" | $SED \ -e "$double_quote_subst" -e "$sed_double_backslash"` ;; *) my_arg="$1" ;; esac case $my_arg in # Double-quote args containing shell metacharacters to delay # word splitting and command substitution for a subsequent eval. # Many Bourne shells cannot handle close brackets correctly # in scan sets, so we specify it separately. *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") my_arg="\"$my_arg\"" ;; esac func_quote_for_expand_result="$my_arg" } # func_show_eval cmd [fail_exp] # Unless opt_silent is true, then output CMD. Then, if opt_dryrun is # not true, evaluate CMD. If the evaluation of CMD fails, and FAIL_EXP # is given, then evaluate it. func_show_eval () { my_cmd="$1" my_fail_exp="${2-:}" ${opt_silent-false} || { func_quote_for_expand "$my_cmd" eval "func_echo $func_quote_for_expand_result" } if ${opt_dry_run-false}; then :; else eval "$my_cmd" my_status=$? if test "$my_status" -eq 0; then :; else eval "(exit $my_status); $my_fail_exp" fi fi } # func_show_eval_locale cmd [fail_exp] # Unless opt_silent is true, then output CMD. Then, if opt_dryrun is # not true, evaluate CMD. If the evaluation of CMD fails, and FAIL_EXP # is given, then evaluate it. Use the saved locale for evaluation. func_show_eval_locale () { my_cmd="$1" my_fail_exp="${2-:}" ${opt_silent-false} || { func_quote_for_expand "$my_cmd" eval "func_echo $func_quote_for_expand_result" } if ${opt_dry_run-false}; then :; else eval "$lt_user_locale $my_cmd" my_status=$? eval "$lt_safe_locale" if test "$my_status" -eq 0; then :; else eval "(exit $my_status); $my_fail_exp" fi fi } # func_tr_sh # Turn $1 into a string suitable for a shell variable name. # Result is stored in $func_tr_sh_result. All characters # not in the set a-zA-Z0-9_ are replaced with '_'. Further, # if $1 begins with a digit, a '_' is prepended as well. func_tr_sh () { case $1 in [0-9]* | *[!a-zA-Z0-9_]*) func_tr_sh_result=`$ECHO "$1" | $SED 's/^\([0-9]\)/_\1/; s/[^a-zA-Z0-9_]/_/g'` ;; * ) func_tr_sh_result=$1 ;; esac } # func_version # Echo version message to standard output and exit. func_version () { $opt_debug $SED -n '/(C)/!b go :more /\./!{ N s/\n# / / b more } :go /^# '$PROGRAM' (GNU /,/# warranty; / { s/^# // s/^# *$// s/\((C)\)[ 0-9,-]*\( [1-9][0-9]*\)/\1\2/ p }' < "$progpath" exit $? } # func_usage # Echo short help message to standard output and exit. func_usage () { $opt_debug $SED -n '/^# Usage:/,/^# *.*--help/ { s/^# // s/^# *$// s/\$progname/'$progname'/ p }' < "$progpath" echo $ECHO "run \`$progname --help | more' for full usage" exit $? } # func_help [NOEXIT] # Echo long help message to standard output and exit, # unless 'noexit' is passed as argument. func_help () { $opt_debug $SED -n '/^# Usage:/,/# Report bugs to/ { :print s/^# // s/^# *$// s*\$progname*'$progname'* s*\$host*'"$host"'* s*\$SHELL*'"$SHELL"'* s*\$LTCC*'"$LTCC"'* s*\$LTCFLAGS*'"$LTCFLAGS"'* s*\$LD*'"$LD"'* s/\$with_gnu_ld/'"$with_gnu_ld"'/ s/\$automake_version/'"`(${AUTOMAKE-automake} --version) 2>/dev/null |$SED 1q`"'/ s/\$autoconf_version/'"`(${AUTOCONF-autoconf} --version) 2>/dev/null |$SED 1q`"'/ p d } /^# .* home page:/b print /^# General help using/b print ' < "$progpath" ret=$? if test -z "$1"; then exit $ret fi } # func_missing_arg argname # Echo program name prefixed message to standard error and set global # exit_cmd. func_missing_arg () { $opt_debug func_error "missing argument for $1." exit_cmd=exit } # func_split_short_opt shortopt # Set func_split_short_opt_name and func_split_short_opt_arg shell # variables after splitting SHORTOPT after the 2nd character. func_split_short_opt () { my_sed_short_opt='1s/^\(..\).*$/\1/;q' my_sed_short_rest='1s/^..\(.*\)$/\1/;q' func_split_short_opt_name=`$ECHO "$1" | $SED "$my_sed_short_opt"` func_split_short_opt_arg=`$ECHO "$1" | $SED "$my_sed_short_rest"` } # func_split_short_opt may be replaced by extended shell implementation # func_split_long_opt longopt # Set func_split_long_opt_name and func_split_long_opt_arg shell # variables after splitting LONGOPT at the `=' sign. func_split_long_opt () { my_sed_long_opt='1s/^\(--[^=]*\)=.*/\1/;q' my_sed_long_arg='1s/^--[^=]*=//' func_split_long_opt_name=`$ECHO "$1" | $SED "$my_sed_long_opt"` func_split_long_opt_arg=`$ECHO "$1" | $SED "$my_sed_long_arg"` } # func_split_long_opt may be replaced by extended shell implementation exit_cmd=: magic="%%%MAGIC variable%%%" magic_exe="%%%MAGIC EXE variable%%%" # Global variables. nonopt= preserve_args= lo2o="s/\\.lo\$/.${objext}/" o2lo="s/\\.${objext}\$/.lo/" extracted_archives= extracted_serial=0 # If this variable is set in any of the actions, the command in it # will be execed at the end. This prevents here-documents from being # left over by shells. exec_cmd= # func_append var value # Append VALUE to the end of shell variable VAR. func_append () { eval "${1}=\$${1}\${2}" } # func_append may be replaced by extended shell implementation # func_append_quoted var value # Quote VALUE and append to the end of shell variable VAR, separated # by a space. func_append_quoted () { func_quote_for_eval "${2}" eval "${1}=\$${1}\\ \$func_quote_for_eval_result" } # func_append_quoted may be replaced by extended shell implementation # func_arith arithmetic-term... func_arith () { func_arith_result=`expr "${@}"` } # func_arith may be replaced by extended shell implementation # func_len string # STRING may not start with a hyphen. func_len () { func_len_result=`expr "${1}" : ".*" 2>/dev/null || echo $max_cmd_len` } # func_len may be replaced by extended shell implementation # func_lo2o object func_lo2o () { func_lo2o_result=`$ECHO "${1}" | $SED "$lo2o"` } # func_lo2o may be replaced by extended shell implementation # func_xform libobj-or-source func_xform () { func_xform_result=`$ECHO "${1}" | $SED 's/\.[^.]*$/.lo/'` } # func_xform may be replaced by extended shell implementation # func_fatal_configuration arg... # Echo program name prefixed message to standard error, followed by # a configuration failure hint, and exit. func_fatal_configuration () { func_error ${1+"$@"} func_error "See the $PACKAGE documentation for more information." func_fatal_error "Fatal configuration error." } # func_config # Display the configuration for all the tags in this script. func_config () { re_begincf='^# ### BEGIN LIBTOOL' re_endcf='^# ### END LIBTOOL' # Default configuration. $SED "1,/$re_begincf CONFIG/d;/$re_endcf CONFIG/,\$d" < "$progpath" # Now print the configurations for the tags. for tagname in $taglist; do $SED -n "/$re_begincf TAG CONFIG: $tagname\$/,/$re_endcf TAG CONFIG: $tagname\$/p" < "$progpath" done exit $? } # func_features # Display the features supported by this script. func_features () { echo "host: $host" if test "$build_libtool_libs" = yes; then echo "enable shared libraries" else echo "disable shared libraries" fi if test "$build_old_libs" = yes; then echo "enable static libraries" else echo "disable static libraries" fi exit $? } # func_enable_tag tagname # Verify that TAGNAME is valid, and either flag an error and exit, or # enable the TAGNAME tag. We also add TAGNAME to the global $taglist # variable here. func_enable_tag () { # Global variable: tagname="$1" re_begincf="^# ### BEGIN LIBTOOL TAG CONFIG: $tagname\$" re_endcf="^# ### END LIBTOOL TAG CONFIG: $tagname\$" sed_extractcf="/$re_begincf/,/$re_endcf/p" # Validate tagname. case $tagname in *[!-_A-Za-z0-9,/]*) func_fatal_error "invalid tag name: $tagname" ;; esac # Don't test for the "default" C tag, as we know it's # there but not specially marked. case $tagname in CC) ;; *) if $GREP "$re_begincf" "$progpath" >/dev/null 2>&1; then taglist="$taglist $tagname" # Evaluate the configuration. Be careful to quote the path # and the sed script, to avoid splitting on whitespace, but # also don't use non-portable quotes within backquotes within # quotes we have to do it in 2 steps: extractedcf=`$SED -n -e "$sed_extractcf" < "$progpath"` eval "$extractedcf" else func_error "ignoring unknown tag $tagname" fi ;; esac } # func_check_version_match # Ensure that we are using m4 macros, and libtool script from the same # release of libtool. func_check_version_match () { if test "$package_revision" != "$macro_revision"; then if test "$VERSION" != "$macro_version"; then if test -z "$macro_version"; then cat >&2 <<_LT_EOF $progname: Version mismatch error. This is $PACKAGE $VERSION, but the $progname: definition of this LT_INIT comes from an older release. $progname: You should recreate aclocal.m4 with macros from $PACKAGE $VERSION $progname: and run autoconf again. _LT_EOF else cat >&2 <<_LT_EOF $progname: Version mismatch error. This is $PACKAGE $VERSION, but the $progname: definition of this LT_INIT comes from $PACKAGE $macro_version. $progname: You should recreate aclocal.m4 with macros from $PACKAGE $VERSION $progname: and run autoconf again. _LT_EOF fi else cat >&2 <<_LT_EOF $progname: Version mismatch error. This is $PACKAGE $VERSION, revision $package_revision, $progname: but the definition of this LT_INIT comes from revision $macro_revision. $progname: You should recreate aclocal.m4 with macros from revision $package_revision $progname: of $PACKAGE $VERSION and run autoconf again. _LT_EOF fi exit $EXIT_MISMATCH fi } # Shorthand for --mode=foo, only valid as the first argument case $1 in clean|clea|cle|cl) shift; set dummy --mode clean ${1+"$@"}; shift ;; compile|compil|compi|comp|com|co|c) shift; set dummy --mode compile ${1+"$@"}; shift ;; execute|execut|execu|exec|exe|ex|e) shift; set dummy --mode execute ${1+"$@"}; shift ;; finish|finis|fini|fin|fi|f) shift; set dummy --mode finish ${1+"$@"}; shift ;; install|instal|insta|inst|ins|in|i) shift; set dummy --mode install ${1+"$@"}; shift ;; link|lin|li|l) shift; set dummy --mode link ${1+"$@"}; shift ;; uninstall|uninstal|uninsta|uninst|unins|unin|uni|un|u) shift; set dummy --mode uninstall ${1+"$@"}; shift ;; esac # Option defaults: opt_debug=: opt_dry_run=false opt_config=false opt_preserve_dup_deps=false opt_features=false opt_finish=false opt_help=false opt_help_all=false opt_silent=: opt_warning=: opt_verbose=: opt_silent=false opt_verbose=false # Parse options once, thoroughly. This comes as soon as possible in the # script to make things like `--version' happen as quickly as we can. { # this just eases exit handling while test $# -gt 0; do opt="$1" shift case $opt in --debug|-x) opt_debug='set -x' func_echo "enabling shell trace mode" $opt_debug ;; --dry-run|--dryrun|-n) opt_dry_run=: ;; --config) opt_config=: func_config ;; --dlopen|-dlopen) optarg="$1" opt_dlopen="${opt_dlopen+$opt_dlopen }$optarg" shift ;; --preserve-dup-deps) opt_preserve_dup_deps=: ;; --features) opt_features=: func_features ;; --finish) opt_finish=: set dummy --mode finish ${1+"$@"}; shift ;; --help) opt_help=: ;; --help-all) opt_help_all=: opt_help=': help-all' ;; --mode) test $# = 0 && func_missing_arg $opt && break optarg="$1" opt_mode="$optarg" case $optarg in # Valid mode arguments: clean|compile|execute|finish|install|link|relink|uninstall) ;; # Catch anything else as an error *) func_error "invalid argument for $opt" exit_cmd=exit break ;; esac shift ;; --no-silent|--no-quiet) opt_silent=false func_append preserve_args " $opt" ;; --no-warning|--no-warn) opt_warning=false func_append preserve_args " $opt" ;; --no-verbose) opt_verbose=false func_append preserve_args " $opt" ;; --silent|--quiet) opt_silent=: func_append preserve_args " $opt" opt_verbose=false ;; --verbose|-v) opt_verbose=: func_append preserve_args " $opt" opt_silent=false ;; --tag) test $# = 0 && func_missing_arg $opt && break optarg="$1" opt_tag="$optarg" func_append preserve_args " $opt $optarg" func_enable_tag "$optarg" shift ;; -\?|-h) func_usage ;; --help) func_help ;; --version) func_version ;; # Separate optargs to long options: --*=*) func_split_long_opt "$opt" set dummy "$func_split_long_opt_name" "$func_split_long_opt_arg" ${1+"$@"} shift ;; # Separate non-argument short options: -\?*|-h*|-n*|-v*) func_split_short_opt "$opt" set dummy "$func_split_short_opt_name" "-$func_split_short_opt_arg" ${1+"$@"} shift ;; --) break ;; -*) func_fatal_help "unrecognized option \`$opt'" ;; *) set dummy "$opt" ${1+"$@"}; shift; break ;; esac done # Validate options: # save first non-option argument if test "$#" -gt 0; then nonopt="$opt" shift fi # preserve --debug test "$opt_debug" = : || func_append preserve_args " --debug" case $host in *cygwin* | *mingw* | *pw32* | *cegcc*) # don't eliminate duplications in $postdeps and $predeps opt_duplicate_compiler_generated_deps=: ;; *) opt_duplicate_compiler_generated_deps=$opt_preserve_dup_deps ;; esac $opt_help || { # Sanity checks first: func_check_version_match if test "$build_libtool_libs" != yes && test "$build_old_libs" != yes; then func_fatal_configuration "not configured to build any kind of library" fi # Darwin sucks eval std_shrext=\"$shrext_cmds\" # Only execute mode is allowed to have -dlopen flags. if test -n "$opt_dlopen" && test "$opt_mode" != execute; then func_error "unrecognized option \`-dlopen'" $ECHO "$help" 1>&2 exit $EXIT_FAILURE fi # Change the help message to a mode-specific one. generic_help="$help" help="Try \`$progname --help --mode=$opt_mode' for more information." } # Bail if the options were screwed $exit_cmd $EXIT_FAILURE } ## ----------- ## ## Main. ## ## ----------- ## # func_lalib_p file # True iff FILE is a libtool `.la' library or `.lo' object file. # This function is only a basic sanity check; it will hardly flush out # determined imposters. func_lalib_p () { test -f "$1" && $SED -e 4q "$1" 2>/dev/null \ | $GREP "^# Generated by .*$PACKAGE" > /dev/null 2>&1 } # func_lalib_unsafe_p file # True iff FILE is a libtool `.la' library or `.lo' object file. # This function implements the same check as func_lalib_p without # resorting to external programs. To this end, it redirects stdin and # closes it afterwards, without saving the original file descriptor. # As a safety measure, use it only where a negative result would be # fatal anyway. Works if `file' does not exist. func_lalib_unsafe_p () { lalib_p=no if test -f "$1" && test -r "$1" && exec 5<&0 <"$1"; then for lalib_p_l in 1 2 3 4 do read lalib_p_line case "$lalib_p_line" in \#\ Generated\ by\ *$PACKAGE* ) lalib_p=yes; break;; esac done exec 0<&5 5<&- fi test "$lalib_p" = yes } # func_ltwrapper_script_p file # True iff FILE is a libtool wrapper script # This function is only a basic sanity check; it will hardly flush out # determined imposters. func_ltwrapper_script_p () { func_lalib_p "$1" } # func_ltwrapper_executable_p file # True iff FILE is a libtool wrapper executable # This function is only a basic sanity check; it will hardly flush out # determined imposters. func_ltwrapper_executable_p () { func_ltwrapper_exec_suffix= case $1 in *.exe) ;; *) func_ltwrapper_exec_suffix=.exe ;; esac $GREP "$magic_exe" "$1$func_ltwrapper_exec_suffix" >/dev/null 2>&1 } # func_ltwrapper_scriptname file # Assumes file is an ltwrapper_executable # uses $file to determine the appropriate filename for a # temporary ltwrapper_script. func_ltwrapper_scriptname () { func_dirname_and_basename "$1" "" "." func_stripname '' '.exe' "$func_basename_result" func_ltwrapper_scriptname_result="$func_dirname_result/$objdir/${func_stripname_result}_ltshwrapper" } # func_ltwrapper_p file # True iff FILE is a libtool wrapper script or wrapper executable # This function is only a basic sanity check; it will hardly flush out # determined imposters. func_ltwrapper_p () { func_ltwrapper_script_p "$1" || func_ltwrapper_executable_p "$1" } # func_execute_cmds commands fail_cmd # Execute tilde-delimited COMMANDS. # If FAIL_CMD is given, eval that upon failure. # FAIL_CMD may read-access the current command in variable CMD! func_execute_cmds () { $opt_debug save_ifs=$IFS; IFS='~' for cmd in $1; do IFS=$save_ifs eval cmd=\"$cmd\" func_show_eval "$cmd" "${2-:}" done IFS=$save_ifs } # func_source file # Source FILE, adding directory component if necessary. # Note that it is not necessary on cygwin/mingw to append a dot to # FILE even if both FILE and FILE.exe exist: automatic-append-.exe # behavior happens only for exec(3), not for open(2)! Also, sourcing # `FILE.' does not work on cygwin managed mounts. func_source () { $opt_debug case $1 in */* | *\\*) . "$1" ;; *) . "./$1" ;; esac } # func_resolve_sysroot PATH # Replace a leading = in PATH with a sysroot. Store the result into # func_resolve_sysroot_result func_resolve_sysroot () { func_resolve_sysroot_result=$1 case $func_resolve_sysroot_result in =*) func_stripname '=' '' "$func_resolve_sysroot_result" func_resolve_sysroot_result=$lt_sysroot$func_stripname_result ;; esac } # func_replace_sysroot PATH # If PATH begins with the sysroot, replace it with = and # store the result into func_replace_sysroot_result. func_replace_sysroot () { case "$lt_sysroot:$1" in ?*:"$lt_sysroot"*) func_stripname "$lt_sysroot" '' "$1" func_replace_sysroot_result="=$func_stripname_result" ;; *) # Including no sysroot. func_replace_sysroot_result=$1 ;; esac } # func_infer_tag arg # Infer tagged configuration to use if any are available and # if one wasn't chosen via the "--tag" command line option. # Only attempt this if the compiler in the base compile # command doesn't match the default compiler. # arg is usually of the form 'gcc ...' func_infer_tag () { $opt_debug if test -n "$available_tags" && test -z "$tagname"; then CC_quoted= for arg in $CC; do func_append_quoted CC_quoted "$arg" done CC_expanded=`func_echo_all $CC` CC_quoted_expanded=`func_echo_all $CC_quoted` case $@ in # Blanks in the command may have been stripped by the calling shell, # but not from the CC environment variable when configure was run. " $CC "* | "$CC "* | " $CC_expanded "* | "$CC_expanded "* | \ " $CC_quoted"* | "$CC_quoted "* | " $CC_quoted_expanded "* | "$CC_quoted_expanded "*) ;; # Blanks at the start of $base_compile will cause this to fail # if we don't check for them as well. *) for z in $available_tags; do if $GREP "^# ### BEGIN LIBTOOL TAG CONFIG: $z$" < "$progpath" > /dev/null; then # Evaluate the configuration. eval "`${SED} -n -e '/^# ### BEGIN LIBTOOL TAG CONFIG: '$z'$/,/^# ### END LIBTOOL TAG CONFIG: '$z'$/p' < $progpath`" CC_quoted= for arg in $CC; do # Double-quote args containing other shell metacharacters. func_append_quoted CC_quoted "$arg" done CC_expanded=`func_echo_all $CC` CC_quoted_expanded=`func_echo_all $CC_quoted` case "$@ " in " $CC "* | "$CC "* | " $CC_expanded "* | "$CC_expanded "* | \ " $CC_quoted"* | "$CC_quoted "* | " $CC_quoted_expanded "* | "$CC_quoted_expanded "*) # The compiler in the base compile command matches # the one in the tagged configuration. # Assume this is the tagged configuration we want. tagname=$z break ;; esac fi done # If $tagname still isn't set, then no tagged configuration # was found and let the user know that the "--tag" command # line option must be used. if test -z "$tagname"; then func_echo "unable to infer tagged configuration" func_fatal_error "specify a tag with \`--tag'" # else # func_verbose "using $tagname tagged configuration" fi ;; esac fi } # func_write_libtool_object output_name pic_name nonpic_name # Create a libtool object file (analogous to a ".la" file), # but don't create it if we're doing a dry run. func_write_libtool_object () { write_libobj=${1} if test "$build_libtool_libs" = yes; then write_lobj=\'${2}\' else write_lobj=none fi if test "$build_old_libs" = yes; then write_oldobj=\'${3}\' else write_oldobj=none fi $opt_dry_run || { cat >${write_libobj}T </dev/null` if test "$?" -eq 0 && test -n "${func_convert_core_file_wine_to_w32_tmp}"; then func_convert_core_file_wine_to_w32_result=`$ECHO "$func_convert_core_file_wine_to_w32_tmp" | $SED -e "$lt_sed_naive_backslashify"` else func_convert_core_file_wine_to_w32_result= fi fi } # end: func_convert_core_file_wine_to_w32 # func_convert_core_path_wine_to_w32 ARG # Helper function used by path conversion functions when $build is *nix, and # $host is mingw, cygwin, or some other w32 environment. Relies on a correctly # configured wine environment available, with the winepath program in $build's # $PATH. Assumes ARG has no leading or trailing path separator characters. # # ARG is path to be converted from $build format to win32. # Result is available in $func_convert_core_path_wine_to_w32_result. # Unconvertible file (directory) names in ARG are skipped; if no directory names # are convertible, then the result may be empty. func_convert_core_path_wine_to_w32 () { $opt_debug # unfortunately, winepath doesn't convert paths, only file names func_convert_core_path_wine_to_w32_result="" if test -n "$1"; then oldIFS=$IFS IFS=: for func_convert_core_path_wine_to_w32_f in $1; do IFS=$oldIFS func_convert_core_file_wine_to_w32 "$func_convert_core_path_wine_to_w32_f" if test -n "$func_convert_core_file_wine_to_w32_result" ; then if test -z "$func_convert_core_path_wine_to_w32_result"; then func_convert_core_path_wine_to_w32_result="$func_convert_core_file_wine_to_w32_result" else func_append func_convert_core_path_wine_to_w32_result ";$func_convert_core_file_wine_to_w32_result" fi fi done IFS=$oldIFS fi } # end: func_convert_core_path_wine_to_w32 # func_cygpath ARGS... # Wrapper around calling the cygpath program via LT_CYGPATH. This is used when # when (1) $build is *nix and Cygwin is hosted via a wine environment; or (2) # $build is MSYS and $host is Cygwin, or (3) $build is Cygwin. In case (1) or # (2), returns the Cygwin file name or path in func_cygpath_result (input # file name or path is assumed to be in w32 format, as previously converted # from $build's *nix or MSYS format). In case (3), returns the w32 file name # or path in func_cygpath_result (input file name or path is assumed to be in # Cygwin format). Returns an empty string on error. # # ARGS are passed to cygpath, with the last one being the file name or path to # be converted. # # Specify the absolute *nix (or w32) name to cygpath in the LT_CYGPATH # environment variable; do not put it in $PATH. func_cygpath () { $opt_debug if test -n "$LT_CYGPATH" && test -f "$LT_CYGPATH"; then func_cygpath_result=`$LT_CYGPATH "$@" 2>/dev/null` if test "$?" -ne 0; then # on failure, ensure result is empty func_cygpath_result= fi else func_cygpath_result= func_error "LT_CYGPATH is empty or specifies non-existent file: \`$LT_CYGPATH'" fi } #end: func_cygpath # func_convert_core_msys_to_w32 ARG # Convert file name or path ARG from MSYS format to w32 format. Return # result in func_convert_core_msys_to_w32_result. func_convert_core_msys_to_w32 () { $opt_debug # awkward: cmd appends spaces to result func_convert_core_msys_to_w32_result=`( cmd //c echo "$1" ) 2>/dev/null | $SED -e 's/[ ]*$//' -e "$lt_sed_naive_backslashify"` } #end: func_convert_core_msys_to_w32 # func_convert_file_check ARG1 ARG2 # Verify that ARG1 (a file name in $build format) was converted to $host # format in ARG2. Otherwise, emit an error message, but continue (resetting # func_to_host_file_result to ARG1). func_convert_file_check () { $opt_debug if test -z "$2" && test -n "$1" ; then func_error "Could not determine host file name corresponding to" func_error " \`$1'" func_error "Continuing, but uninstalled executables may not work." # Fallback: func_to_host_file_result="$1" fi } # end func_convert_file_check # func_convert_path_check FROM_PATHSEP TO_PATHSEP FROM_PATH TO_PATH # Verify that FROM_PATH (a path in $build format) was converted to $host # format in TO_PATH. Otherwise, emit an error message, but continue, resetting # func_to_host_file_result to a simplistic fallback value (see below). func_convert_path_check () { $opt_debug if test -z "$4" && test -n "$3"; then func_error "Could not determine the host path corresponding to" func_error " \`$3'" func_error "Continuing, but uninstalled executables may not work." # Fallback. This is a deliberately simplistic "conversion" and # should not be "improved". See libtool.info. if test "x$1" != "x$2"; then lt_replace_pathsep_chars="s|$1|$2|g" func_to_host_path_result=`echo "$3" | $SED -e "$lt_replace_pathsep_chars"` else func_to_host_path_result="$3" fi fi } # end func_convert_path_check # func_convert_path_front_back_pathsep FRONTPAT BACKPAT REPL ORIG # Modifies func_to_host_path_result by prepending REPL if ORIG matches FRONTPAT # and appending REPL if ORIG matches BACKPAT. func_convert_path_front_back_pathsep () { $opt_debug case $4 in $1 ) func_to_host_path_result="$3$func_to_host_path_result" ;; esac case $4 in $2 ) func_append func_to_host_path_result "$3" ;; esac } # end func_convert_path_front_back_pathsep ################################################## # $build to $host FILE NAME CONVERSION FUNCTIONS # ################################################## # invoked via `$to_host_file_cmd ARG' # # In each case, ARG is the path to be converted from $build to $host format. # Result will be available in $func_to_host_file_result. # func_to_host_file ARG # Converts the file name ARG from $build format to $host format. Return result # in func_to_host_file_result. func_to_host_file () { $opt_debug $to_host_file_cmd "$1" } # end func_to_host_file # func_to_tool_file ARG LAZY # converts the file name ARG from $build format to toolchain format. Return # result in func_to_tool_file_result. If the conversion in use is listed # in (the comma separated) LAZY, no conversion takes place. func_to_tool_file () { $opt_debug case ,$2, in *,"$to_tool_file_cmd",*) func_to_tool_file_result=$1 ;; *) $to_tool_file_cmd "$1" func_to_tool_file_result=$func_to_host_file_result ;; esac } # end func_to_tool_file # func_convert_file_noop ARG # Copy ARG to func_to_host_file_result. func_convert_file_noop () { func_to_host_file_result="$1" } # end func_convert_file_noop # func_convert_file_msys_to_w32 ARG # Convert file name ARG from (mingw) MSYS to (mingw) w32 format; automatic # conversion to w32 is not available inside the cwrapper. Returns result in # func_to_host_file_result. func_convert_file_msys_to_w32 () { $opt_debug func_to_host_file_result="$1" if test -n "$1"; then func_convert_core_msys_to_w32 "$1" func_to_host_file_result="$func_convert_core_msys_to_w32_result" fi func_convert_file_check "$1" "$func_to_host_file_result" } # end func_convert_file_msys_to_w32 # func_convert_file_cygwin_to_w32 ARG # Convert file name ARG from Cygwin to w32 format. Returns result in # func_to_host_file_result. func_convert_file_cygwin_to_w32 () { $opt_debug func_to_host_file_result="$1" if test -n "$1"; then # because $build is cygwin, we call "the" cygpath in $PATH; no need to use # LT_CYGPATH in this case. func_to_host_file_result=`cygpath -m "$1"` fi func_convert_file_check "$1" "$func_to_host_file_result" } # end func_convert_file_cygwin_to_w32 # func_convert_file_nix_to_w32 ARG # Convert file name ARG from *nix to w32 format. Requires a wine environment # and a working winepath. Returns result in func_to_host_file_result. func_convert_file_nix_to_w32 () { $opt_debug func_to_host_file_result="$1" if test -n "$1"; then func_convert_core_file_wine_to_w32 "$1" func_to_host_file_result="$func_convert_core_file_wine_to_w32_result" fi func_convert_file_check "$1" "$func_to_host_file_result" } # end func_convert_file_nix_to_w32 # func_convert_file_msys_to_cygwin ARG # Convert file name ARG from MSYS to Cygwin format. Requires LT_CYGPATH set. # Returns result in func_to_host_file_result. func_convert_file_msys_to_cygwin () { $opt_debug func_to_host_file_result="$1" if test -n "$1"; then func_convert_core_msys_to_w32 "$1" func_cygpath -u "$func_convert_core_msys_to_w32_result" func_to_host_file_result="$func_cygpath_result" fi func_convert_file_check "$1" "$func_to_host_file_result" } # end func_convert_file_msys_to_cygwin # func_convert_file_nix_to_cygwin ARG # Convert file name ARG from *nix to Cygwin format. Requires Cygwin installed # in a wine environment, working winepath, and LT_CYGPATH set. Returns result # in func_to_host_file_result. func_convert_file_nix_to_cygwin () { $opt_debug func_to_host_file_result="$1" if test -n "$1"; then # convert from *nix to w32, then use cygpath to convert from w32 to cygwin. func_convert_core_file_wine_to_w32 "$1" func_cygpath -u "$func_convert_core_file_wine_to_w32_result" func_to_host_file_result="$func_cygpath_result" fi func_convert_file_check "$1" "$func_to_host_file_result" } # end func_convert_file_nix_to_cygwin ############################################# # $build to $host PATH CONVERSION FUNCTIONS # ############################################# # invoked via `$to_host_path_cmd ARG' # # In each case, ARG is the path to be converted from $build to $host format. # The result will be available in $func_to_host_path_result. # # Path separators are also converted from $build format to $host format. If # ARG begins or ends with a path separator character, it is preserved (but # converted to $host format) on output. # # All path conversion functions are named using the following convention: # file name conversion function : func_convert_file_X_to_Y () # path conversion function : func_convert_path_X_to_Y () # where, for any given $build/$host combination the 'X_to_Y' value is the # same. If conversion functions are added for new $build/$host combinations, # the two new functions must follow this pattern, or func_init_to_host_path_cmd # will break. # func_init_to_host_path_cmd # Ensures that function "pointer" variable $to_host_path_cmd is set to the # appropriate value, based on the value of $to_host_file_cmd. to_host_path_cmd= func_init_to_host_path_cmd () { $opt_debug if test -z "$to_host_path_cmd"; then func_stripname 'func_convert_file_' '' "$to_host_file_cmd" to_host_path_cmd="func_convert_path_${func_stripname_result}" fi } # func_to_host_path ARG # Converts the path ARG from $build format to $host format. Return result # in func_to_host_path_result. func_to_host_path () { $opt_debug func_init_to_host_path_cmd $to_host_path_cmd "$1" } # end func_to_host_path # func_convert_path_noop ARG # Copy ARG to func_to_host_path_result. func_convert_path_noop () { func_to_host_path_result="$1" } # end func_convert_path_noop # func_convert_path_msys_to_w32 ARG # Convert path ARG from (mingw) MSYS to (mingw) w32 format; automatic # conversion to w32 is not available inside the cwrapper. Returns result in # func_to_host_path_result. func_convert_path_msys_to_w32 () { $opt_debug func_to_host_path_result="$1" if test -n "$1"; then # Remove leading and trailing path separator characters from ARG. MSYS # behavior is inconsistent here; cygpath turns them into '.;' and ';.'; # and winepath ignores them completely. func_stripname : : "$1" func_to_host_path_tmp1=$func_stripname_result func_convert_core_msys_to_w32 "$func_to_host_path_tmp1" func_to_host_path_result="$func_convert_core_msys_to_w32_result" func_convert_path_check : ";" \ "$func_to_host_path_tmp1" "$func_to_host_path_result" func_convert_path_front_back_pathsep ":*" "*:" ";" "$1" fi } # end func_convert_path_msys_to_w32 # func_convert_path_cygwin_to_w32 ARG # Convert path ARG from Cygwin to w32 format. Returns result in # func_to_host_file_result. func_convert_path_cygwin_to_w32 () { $opt_debug func_to_host_path_result="$1" if test -n "$1"; then # See func_convert_path_msys_to_w32: func_stripname : : "$1" func_to_host_path_tmp1=$func_stripname_result func_to_host_path_result=`cygpath -m -p "$func_to_host_path_tmp1"` func_convert_path_check : ";" \ "$func_to_host_path_tmp1" "$func_to_host_path_result" func_convert_path_front_back_pathsep ":*" "*:" ";" "$1" fi } # end func_convert_path_cygwin_to_w32 # func_convert_path_nix_to_w32 ARG # Convert path ARG from *nix to w32 format. Requires a wine environment and # a working winepath. Returns result in func_to_host_file_result. func_convert_path_nix_to_w32 () { $opt_debug func_to_host_path_result="$1" if test -n "$1"; then # See func_convert_path_msys_to_w32: func_stripname : : "$1" func_to_host_path_tmp1=$func_stripname_result func_convert_core_path_wine_to_w32 "$func_to_host_path_tmp1" func_to_host_path_result="$func_convert_core_path_wine_to_w32_result" func_convert_path_check : ";" \ "$func_to_host_path_tmp1" "$func_to_host_path_result" func_convert_path_front_back_pathsep ":*" "*:" ";" "$1" fi } # end func_convert_path_nix_to_w32 # func_convert_path_msys_to_cygwin ARG # Convert path ARG from MSYS to Cygwin format. Requires LT_CYGPATH set. # Returns result in func_to_host_file_result. func_convert_path_msys_to_cygwin () { $opt_debug func_to_host_path_result="$1" if test -n "$1"; then # See func_convert_path_msys_to_w32: func_stripname : : "$1" func_to_host_path_tmp1=$func_stripname_result func_convert_core_msys_to_w32 "$func_to_host_path_tmp1" func_cygpath -u -p "$func_convert_core_msys_to_w32_result" func_to_host_path_result="$func_cygpath_result" func_convert_path_check : : \ "$func_to_host_path_tmp1" "$func_to_host_path_result" func_convert_path_front_back_pathsep ":*" "*:" : "$1" fi } # end func_convert_path_msys_to_cygwin # func_convert_path_nix_to_cygwin ARG # Convert path ARG from *nix to Cygwin format. Requires Cygwin installed in a # a wine environment, working winepath, and LT_CYGPATH set. Returns result in # func_to_host_file_result. func_convert_path_nix_to_cygwin () { $opt_debug func_to_host_path_result="$1" if test -n "$1"; then # Remove leading and trailing path separator characters from # ARG. msys behavior is inconsistent here, cygpath turns them # into '.;' and ';.', and winepath ignores them completely. func_stripname : : "$1" func_to_host_path_tmp1=$func_stripname_result func_convert_core_path_wine_to_w32 "$func_to_host_path_tmp1" func_cygpath -u -p "$func_convert_core_path_wine_to_w32_result" func_to_host_path_result="$func_cygpath_result" func_convert_path_check : : \ "$func_to_host_path_tmp1" "$func_to_host_path_result" func_convert_path_front_back_pathsep ":*" "*:" : "$1" fi } # end func_convert_path_nix_to_cygwin # func_mode_compile arg... func_mode_compile () { $opt_debug # Get the compilation command and the source file. base_compile= srcfile="$nonopt" # always keep a non-empty value in "srcfile" suppress_opt=yes suppress_output= arg_mode=normal libobj= later= pie_flag= for arg do case $arg_mode in arg ) # do not "continue". Instead, add this to base_compile lastarg="$arg" arg_mode=normal ;; target ) libobj="$arg" arg_mode=normal continue ;; normal ) # Accept any command-line options. case $arg in -o) test -n "$libobj" && \ func_fatal_error "you cannot specify \`-o' more than once" arg_mode=target continue ;; -pie | -fpie | -fPIE) func_append pie_flag " $arg" continue ;; -shared | -static | -prefer-pic | -prefer-non-pic) func_append later " $arg" continue ;; -no-suppress) suppress_opt=no continue ;; -Xcompiler) arg_mode=arg # the next one goes into the "base_compile" arg list continue # The current "srcfile" will either be retained or ;; # replaced later. I would guess that would be a bug. -Wc,*) func_stripname '-Wc,' '' "$arg" args=$func_stripname_result lastarg= save_ifs="$IFS"; IFS=',' for arg in $args; do IFS="$save_ifs" func_append_quoted lastarg "$arg" done IFS="$save_ifs" func_stripname ' ' '' "$lastarg" lastarg=$func_stripname_result # Add the arguments to base_compile. func_append base_compile " $lastarg" continue ;; *) # Accept the current argument as the source file. # The previous "srcfile" becomes the current argument. # lastarg="$srcfile" srcfile="$arg" ;; esac # case $arg ;; esac # case $arg_mode # Aesthetically quote the previous argument. func_append_quoted base_compile "$lastarg" done # for arg case $arg_mode in arg) func_fatal_error "you must specify an argument for -Xcompile" ;; target) func_fatal_error "you must specify a target with \`-o'" ;; *) # Get the name of the library object. test -z "$libobj" && { func_basename "$srcfile" libobj="$func_basename_result" } ;; esac # Recognize several different file suffixes. # If the user specifies -o file.o, it is replaced with file.lo case $libobj in *.[cCFSifmso] | \ *.ada | *.adb | *.ads | *.asm | \ *.c++ | *.cc | *.ii | *.class | *.cpp | *.cxx | \ *.[fF][09]? | *.for | *.java | *.go | *.obj | *.sx | *.cu | *.cup) func_xform "$libobj" libobj=$func_xform_result ;; esac case $libobj in *.lo) func_lo2o "$libobj"; obj=$func_lo2o_result ;; *) func_fatal_error "cannot determine name of library object from \`$libobj'" ;; esac func_infer_tag $base_compile for arg in $later; do case $arg in -shared) test "$build_libtool_libs" != yes && \ func_fatal_configuration "can not build a shared library" build_old_libs=no continue ;; -static) build_libtool_libs=no build_old_libs=yes continue ;; -prefer-pic) pic_mode=yes continue ;; -prefer-non-pic) pic_mode=no continue ;; esac done func_quote_for_eval "$libobj" test "X$libobj" != "X$func_quote_for_eval_result" \ && $ECHO "X$libobj" | $GREP '[]~#^*{};<>?"'"'"' &()|`$[]' \ && func_warning "libobj name \`$libobj' may not contain shell special characters." func_dirname_and_basename "$obj" "/" "" objname="$func_basename_result" xdir="$func_dirname_result" lobj=${xdir}$objdir/$objname test -z "$base_compile" && \ func_fatal_help "you must specify a compilation command" # Delete any leftover library objects. if test "$build_old_libs" = yes; then removelist="$obj $lobj $libobj ${libobj}T" else removelist="$lobj $libobj ${libobj}T" fi # On Cygwin there's no "real" PIC flag so we must build both object types case $host_os in cygwin* | mingw* | pw32* | os2* | cegcc*) pic_mode=default ;; esac if test "$pic_mode" = no && test "$deplibs_check_method" != pass_all; then # non-PIC code in shared libraries is not supported pic_mode=default fi # Calculate the filename of the output object if compiler does # not support -o with -c if test "$compiler_c_o" = no; then output_obj=`$ECHO "$srcfile" | $SED 's%^.*/%%; s%\.[^.]*$%%'`.${objext} lockfile="$output_obj.lock" else output_obj= need_locks=no lockfile= fi # Lock this critical section if it is needed # We use this script file to make the link, it avoids creating a new file if test "$need_locks" = yes; then until $opt_dry_run || ln "$progpath" "$lockfile" 2>/dev/null; do func_echo "Waiting for $lockfile to be removed" sleep 2 done elif test "$need_locks" = warn; then if test -f "$lockfile"; then $ECHO "\ *** ERROR, $lockfile exists and contains: `cat $lockfile 2>/dev/null` This indicates that another process is trying to use the same temporary object file, and libtool could not work around it because your compiler does not support \`-c' and \`-o' together. If you repeat this compilation, it may succeed, by chance, but you had better avoid parallel builds (make -j) in this platform, or get a better compiler." $opt_dry_run || $RM $removelist exit $EXIT_FAILURE fi func_append removelist " $output_obj" $ECHO "$srcfile" > "$lockfile" fi $opt_dry_run || $RM $removelist func_append removelist " $lockfile" trap '$opt_dry_run || $RM $removelist; exit $EXIT_FAILURE' 1 2 15 func_to_tool_file "$srcfile" func_convert_file_msys_to_w32 srcfile=$func_to_tool_file_result func_quote_for_eval "$srcfile" qsrcfile=$func_quote_for_eval_result # Only build a PIC object if we are building libtool libraries. if test "$build_libtool_libs" = yes; then # Without this assignment, base_compile gets emptied. fbsd_hideous_sh_bug=$base_compile if test "$pic_mode" != no; then command="$base_compile $qsrcfile $pic_flag" else # Don't build PIC code command="$base_compile $qsrcfile" fi func_mkdir_p "$xdir$objdir" if test -z "$output_obj"; then # Place PIC objects in $objdir func_append command " -o $lobj" fi func_show_eval_locale "$command" \ 'test -n "$output_obj" && $RM $removelist; exit $EXIT_FAILURE' if test "$need_locks" = warn && test "X`cat $lockfile 2>/dev/null`" != "X$srcfile"; then $ECHO "\ *** ERROR, $lockfile contains: `cat $lockfile 2>/dev/null` but it should contain: $srcfile This indicates that another process is trying to use the same temporary object file, and libtool could not work around it because your compiler does not support \`-c' and \`-o' together. If you repeat this compilation, it may succeed, by chance, but you had better avoid parallel builds (make -j) in this platform, or get a better compiler." $opt_dry_run || $RM $removelist exit $EXIT_FAILURE fi # Just move the object if needed, then go on to compile the next one if test -n "$output_obj" && test "X$output_obj" != "X$lobj"; then func_show_eval '$MV "$output_obj" "$lobj"' \ 'error=$?; $opt_dry_run || $RM $removelist; exit $error' fi # Allow error messages only from the first compilation. if test "$suppress_opt" = yes; then suppress_output=' >/dev/null 2>&1' fi fi # Only build a position-dependent object if we build old libraries. if test "$build_old_libs" = yes; then if test "$pic_mode" != yes; then # Don't build PIC code command="$base_compile $qsrcfile$pie_flag" else command="$base_compile $qsrcfile $pic_flag" fi if test "$compiler_c_o" = yes; then func_append command " -o $obj" fi # Suppress compiler output if we already did a PIC compilation. func_append command "$suppress_output" func_show_eval_locale "$command" \ '$opt_dry_run || $RM $removelist; exit $EXIT_FAILURE' if test "$need_locks" = warn && test "X`cat $lockfile 2>/dev/null`" != "X$srcfile"; then $ECHO "\ *** ERROR, $lockfile contains: `cat $lockfile 2>/dev/null` but it should contain: $srcfile This indicates that another process is trying to use the same temporary object file, and libtool could not work around it because your compiler does not support \`-c' and \`-o' together. If you repeat this compilation, it may succeed, by chance, but you had better avoid parallel builds (make -j) in this platform, or get a better compiler." $opt_dry_run || $RM $removelist exit $EXIT_FAILURE fi # Just move the object if needed if test -n "$output_obj" && test "X$output_obj" != "X$obj"; then func_show_eval '$MV "$output_obj" "$obj"' \ 'error=$?; $opt_dry_run || $RM $removelist; exit $error' fi fi $opt_dry_run || { func_write_libtool_object "$libobj" "$objdir/$objname" "$objname" # Unlock the critical section if it was locked if test "$need_locks" != no; then removelist=$lockfile $RM "$lockfile" fi } exit $EXIT_SUCCESS } $opt_help || { test "$opt_mode" = compile && func_mode_compile ${1+"$@"} } func_mode_help () { # We need to display help for each of the modes. case $opt_mode in "") # Generic help is extracted from the usage comments # at the start of this file. func_help ;; clean) $ECHO \ "Usage: $progname [OPTION]... --mode=clean RM [RM-OPTION]... FILE... Remove files from the build directory. RM is the name of the program to use to delete files associated with each FILE (typically \`/bin/rm'). RM-OPTIONS are options (such as \`-f') to be passed to RM. If FILE is a libtool library, object or program, all the files associated with it are deleted. Otherwise, only FILE itself is deleted using RM." ;; compile) $ECHO \ "Usage: $progname [OPTION]... --mode=compile COMPILE-COMMAND... SOURCEFILE Compile a source file into a libtool library object. This mode accepts the following additional options: -o OUTPUT-FILE set the output file name to OUTPUT-FILE -no-suppress do not suppress compiler output for multiple passes -prefer-pic try to build PIC objects only -prefer-non-pic try to build non-PIC objects only -shared do not build a \`.o' file suitable for static linking -static only build a \`.o' file suitable for static linking -Wc,FLAG pass FLAG directly to the compiler COMPILE-COMMAND is a command to be used in creating a \`standard' object file from the given SOURCEFILE. The output file name is determined by removing the directory component from SOURCEFILE, then substituting the C source code suffix \`.c' with the library object suffix, \`.lo'." ;; execute) $ECHO \ "Usage: $progname [OPTION]... --mode=execute COMMAND [ARGS]... Automatically set library path, then run a program. This mode accepts the following additional options: -dlopen FILE add the directory containing FILE to the library path This mode sets the library path environment variable according to \`-dlopen' flags. If any of the ARGS are libtool executable wrappers, then they are translated into their corresponding uninstalled binary, and any of their required library directories are added to the library path. Then, COMMAND is executed, with ARGS as arguments." ;; finish) $ECHO \ "Usage: $progname [OPTION]... --mode=finish [LIBDIR]... Complete the installation of libtool libraries. Each LIBDIR is a directory that contains libtool libraries. The commands that this mode executes may require superuser privileges. Use the \`--dry-run' option if you just want to see what would be executed." ;; install) $ECHO \ "Usage: $progname [OPTION]... --mode=install INSTALL-COMMAND... Install executables or libraries. INSTALL-COMMAND is the installation command. The first component should be either the \`install' or \`cp' program. The following components of INSTALL-COMMAND are treated specially: -inst-prefix-dir PREFIX-DIR Use PREFIX-DIR as a staging area for installation The rest of the components are interpreted as arguments to that command (only BSD-compatible install options are recognized)." ;; link) $ECHO \ "Usage: $progname [OPTION]... --mode=link LINK-COMMAND... Link object files or libraries together to form another library, or to create an executable program. LINK-COMMAND is a command using the C compiler that you would use to create a program from several object files. The following components of LINK-COMMAND are treated specially: -all-static do not do any dynamic linking at all -avoid-version do not add a version suffix if possible -bindir BINDIR specify path to binaries directory (for systems where libraries must be found in the PATH setting at runtime) -dlopen FILE \`-dlpreopen' FILE if it cannot be dlopened at runtime -dlpreopen FILE link in FILE and add its symbols to lt_preloaded_symbols -export-dynamic allow symbols from OUTPUT-FILE to be resolved with dlsym(3) -export-symbols SYMFILE try to export only the symbols listed in SYMFILE -export-symbols-regex REGEX try to export only the symbols matching REGEX -LLIBDIR search LIBDIR for required installed libraries -lNAME OUTPUT-FILE requires the installed library libNAME -module build a library that can dlopened -no-fast-install disable the fast-install mode -no-install link a not-installable executable -no-undefined declare that a library does not refer to external symbols -o OUTPUT-FILE create OUTPUT-FILE from the specified objects -objectlist FILE Use a list of object files found in FILE to specify objects -precious-files-regex REGEX don't remove output files matching REGEX -release RELEASE specify package release information -rpath LIBDIR the created library will eventually be installed in LIBDIR -R[ ]LIBDIR add LIBDIR to the runtime path of programs and libraries -shared only do dynamic linking of libtool libraries -shrext SUFFIX override the standard shared library file extension -static do not do any dynamic linking of uninstalled libtool libraries -static-libtool-libs do not do any dynamic linking of libtool libraries -version-info CURRENT[:REVISION[:AGE]] specify library version info [each variable defaults to 0] -weak LIBNAME declare that the target provides the LIBNAME interface -Wc,FLAG -Xcompiler FLAG pass linker-specific FLAG directly to the compiler -Wl,FLAG -Xlinker FLAG pass linker-specific FLAG directly to the linker -XCClinker FLAG pass link-specific FLAG to the compiler driver (CC) All other options (arguments beginning with \`-') are ignored. Every other argument is treated as a filename. Files ending in \`.la' are treated as uninstalled libtool libraries, other files are standard or library object files. If the OUTPUT-FILE ends in \`.la', then a libtool library is created, only library objects (\`.lo' files) may be specified, and \`-rpath' is required, except when creating a convenience library. If OUTPUT-FILE ends in \`.a' or \`.lib', then a standard library is created using \`ar' and \`ranlib', or on Windows using \`lib'. If OUTPUT-FILE ends in \`.lo' or \`.${objext}', then a reloadable object file is created, otherwise an executable program is created." ;; uninstall) $ECHO \ "Usage: $progname [OPTION]... --mode=uninstall RM [RM-OPTION]... FILE... Remove libraries from an installation directory. RM is the name of the program to use to delete files associated with each FILE (typically \`/bin/rm'). RM-OPTIONS are options (such as \`-f') to be passed to RM. If FILE is a libtool library, all the files associated with it are deleted. Otherwise, only FILE itself is deleted using RM." ;; *) func_fatal_help "invalid operation mode \`$opt_mode'" ;; esac echo $ECHO "Try \`$progname --help' for more information about other modes." } # Now that we've collected a possible --mode arg, show help if necessary if $opt_help; then if test "$opt_help" = :; then func_mode_help else { func_help noexit for opt_mode in compile link execute install finish uninstall clean; do func_mode_help done } | sed -n '1p; 2,$s/^Usage:/ or: /p' { func_help noexit for opt_mode in compile link execute install finish uninstall clean; do echo func_mode_help done } | sed '1d /^When reporting/,/^Report/{ H d } $x /information about other modes/d /more detailed .*MODE/d s/^Usage:.*--mode=\([^ ]*\) .*/Description of \1 mode:/' fi exit $? fi # func_mode_execute arg... func_mode_execute () { $opt_debug # The first argument is the command name. cmd="$nonopt" test -z "$cmd" && \ func_fatal_help "you must specify a COMMAND" # Handle -dlopen flags immediately. for file in $opt_dlopen; do test -f "$file" \ || func_fatal_help "\`$file' is not a file" dir= case $file in *.la) func_resolve_sysroot "$file" file=$func_resolve_sysroot_result # Check to see that this really is a libtool archive. func_lalib_unsafe_p "$file" \ || func_fatal_help "\`$lib' is not a valid libtool archive" # Read the libtool library. dlname= library_names= func_source "$file" # Skip this library if it cannot be dlopened. if test -z "$dlname"; then # Warn if it was a shared library. test -n "$library_names" && \ func_warning "\`$file' was not linked with \`-export-dynamic'" continue fi func_dirname "$file" "" "." dir="$func_dirname_result" if test -f "$dir/$objdir/$dlname"; then func_append dir "/$objdir" else if test ! -f "$dir/$dlname"; then func_fatal_error "cannot find \`$dlname' in \`$dir' or \`$dir/$objdir'" fi fi ;; *.lo) # Just add the directory containing the .lo file. func_dirname "$file" "" "." dir="$func_dirname_result" ;; *) func_warning "\`-dlopen' is ignored for non-libtool libraries and objects" continue ;; esac # Get the absolute pathname. absdir=`cd "$dir" && pwd` test -n "$absdir" && dir="$absdir" # Now add the directory to shlibpath_var. if eval "test -z \"\$$shlibpath_var\""; then eval "$shlibpath_var=\"\$dir\"" else eval "$shlibpath_var=\"\$dir:\$$shlibpath_var\"" fi done # This variable tells wrapper scripts just to set shlibpath_var # rather than running their programs. libtool_execute_magic="$magic" # Check if any of the arguments is a wrapper script. args= for file do case $file in -* | *.la | *.lo ) ;; *) # Do a test to see if this is really a libtool program. if func_ltwrapper_script_p "$file"; then func_source "$file" # Transform arg to wrapped name. file="$progdir/$program" elif func_ltwrapper_executable_p "$file"; then func_ltwrapper_scriptname "$file" func_source "$func_ltwrapper_scriptname_result" # Transform arg to wrapped name. file="$progdir/$program" fi ;; esac # Quote arguments (to preserve shell metacharacters). func_append_quoted args "$file" done if test "X$opt_dry_run" = Xfalse; then if test -n "$shlibpath_var"; then # Export the shlibpath_var. eval "export $shlibpath_var" fi # Restore saved environment variables for lt_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES do eval "if test \"\${save_$lt_var+set}\" = set; then $lt_var=\$save_$lt_var; export $lt_var else $lt_unset $lt_var fi" done # Now prepare to actually exec the command. exec_cmd="\$cmd$args" else # Display what would be done. if test -n "$shlibpath_var"; then eval "\$ECHO \"\$shlibpath_var=\$$shlibpath_var\"" echo "export $shlibpath_var" fi $ECHO "$cmd$args" exit $EXIT_SUCCESS fi } test "$opt_mode" = execute && func_mode_execute ${1+"$@"} # func_mode_finish arg... func_mode_finish () { $opt_debug libs= libdirs= admincmds= for opt in "$nonopt" ${1+"$@"} do if test -d "$opt"; then func_append libdirs " $opt" elif test -f "$opt"; then if func_lalib_unsafe_p "$opt"; then func_append libs " $opt" else func_warning "\`$opt' is not a valid libtool archive" fi else func_fatal_error "invalid argument \`$opt'" fi done if test -n "$libs"; then if test -n "$lt_sysroot"; then sysroot_regex=`$ECHO "$lt_sysroot" | $SED "$sed_make_literal_regex"` sysroot_cmd="s/\([ ']\)$sysroot_regex/\1/g;" else sysroot_cmd= fi # Remove sysroot references if $opt_dry_run; then for lib in $libs; do echo "removing references to $lt_sysroot and \`=' prefixes from $lib" done else tmpdir=`func_mktempdir` for lib in $libs; do sed -e "${sysroot_cmd} s/\([ ']-[LR]\)=/\1/g; s/\([ ']\)=/\1/g" $lib \ > $tmpdir/tmp-la mv -f $tmpdir/tmp-la $lib done ${RM}r "$tmpdir" fi fi if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then for libdir in $libdirs; do if test -n "$finish_cmds"; then # Do each command in the finish commands. func_execute_cmds "$finish_cmds" 'admincmds="$admincmds '"$cmd"'"' fi if test -n "$finish_eval"; then # Do the single finish_eval. eval cmds=\"$finish_eval\" $opt_dry_run || eval "$cmds" || func_append admincmds " $cmds" fi done fi # Exit here if they wanted silent mode. $opt_silent && exit $EXIT_SUCCESS if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then echo "----------------------------------------------------------------------" echo "Libraries have been installed in:" for libdir in $libdirs; do $ECHO " $libdir" done echo echo "If you ever happen to want to link against installed libraries" echo "in a given directory, LIBDIR, you must either use libtool, and" echo "specify the full pathname of the library, or use the \`-LLIBDIR'" echo "flag during linking and do at least one of the following:" if test -n "$shlibpath_var"; then echo " - add LIBDIR to the \`$shlibpath_var' environment variable" echo " during execution" fi if test -n "$runpath_var"; then echo " - add LIBDIR to the \`$runpath_var' environment variable" echo " during linking" fi if test -n "$hardcode_libdir_flag_spec"; then libdir=LIBDIR eval flag=\"$hardcode_libdir_flag_spec\" $ECHO " - use the \`$flag' linker flag" fi if test -n "$admincmds"; then $ECHO " - have your system administrator run these commands:$admincmds" fi if test -f /etc/ld.so.conf; then echo " - have your system administrator add LIBDIR to \`/etc/ld.so.conf'" fi echo echo "See any operating system documentation about shared libraries for" case $host in solaris2.[6789]|solaris2.1[0-9]) echo "more information, such as the ld(1), crle(1) and ld.so(8) manual" echo "pages." ;; *) echo "more information, such as the ld(1) and ld.so(8) manual pages." ;; esac echo "----------------------------------------------------------------------" fi exit $EXIT_SUCCESS } test "$opt_mode" = finish && func_mode_finish ${1+"$@"} # func_mode_install arg... func_mode_install () { $opt_debug # There may be an optional sh(1) argument at the beginning of # install_prog (especially on Windows NT). if test "$nonopt" = "$SHELL" || test "$nonopt" = /bin/sh || # Allow the use of GNU shtool's install command. case $nonopt in *shtool*) :;; *) false;; esac; then # Aesthetically quote it. func_quote_for_eval "$nonopt" install_prog="$func_quote_for_eval_result " arg=$1 shift else install_prog= arg=$nonopt fi # The real first argument should be the name of the installation program. # Aesthetically quote it. func_quote_for_eval "$arg" func_append install_prog "$func_quote_for_eval_result" install_shared_prog=$install_prog case " $install_prog " in *[\\\ /]cp\ *) install_cp=: ;; *) install_cp=false ;; esac # We need to accept at least all the BSD install flags. dest= files= opts= prev= install_type= isdir=no stripme= no_mode=: for arg do arg2= if test -n "$dest"; then func_append files " $dest" dest=$arg continue fi case $arg in -d) isdir=yes ;; -f) if $install_cp; then :; else prev=$arg fi ;; -g | -m | -o) prev=$arg ;; -s) stripme=" -s" continue ;; -*) ;; *) # If the previous option needed an argument, then skip it. if test -n "$prev"; then if test "x$prev" = x-m && test -n "$install_override_mode"; then arg2=$install_override_mode no_mode=false fi prev= else dest=$arg continue fi ;; esac # Aesthetically quote the argument. func_quote_for_eval "$arg" func_append install_prog " $func_quote_for_eval_result" if test -n "$arg2"; then func_quote_for_eval "$arg2" fi func_append install_shared_prog " $func_quote_for_eval_result" done test -z "$install_prog" && \ func_fatal_help "you must specify an install program" test -n "$prev" && \ func_fatal_help "the \`$prev' option requires an argument" if test -n "$install_override_mode" && $no_mode; then if $install_cp; then :; else func_quote_for_eval "$install_override_mode" func_append install_shared_prog " -m $func_quote_for_eval_result" fi fi if test -z "$files"; then if test -z "$dest"; then func_fatal_help "no file or destination specified" else func_fatal_help "you must specify a destination" fi fi # Strip any trailing slash from the destination. func_stripname '' '/' "$dest" dest=$func_stripname_result # Check to see that the destination is a directory. test -d "$dest" && isdir=yes if test "$isdir" = yes; then destdir="$dest" destname= else func_dirname_and_basename "$dest" "" "." destdir="$func_dirname_result" destname="$func_basename_result" # Not a directory, so check to see that there is only one file specified. set dummy $files; shift test "$#" -gt 1 && \ func_fatal_help "\`$dest' is not a directory" fi case $destdir in [\\/]* | [A-Za-z]:[\\/]*) ;; *) for file in $files; do case $file in *.lo) ;; *) func_fatal_help "\`$destdir' must be an absolute directory name" ;; esac done ;; esac # This variable tells wrapper scripts just to set variables rather # than running their programs. libtool_install_magic="$magic" staticlibs= future_libdirs= current_libdirs= for file in $files; do # Do each installation. case $file in *.$libext) # Do the static libraries later. func_append staticlibs " $file" ;; *.la) func_resolve_sysroot "$file" file=$func_resolve_sysroot_result # Check to see that this really is a libtool archive. func_lalib_unsafe_p "$file" \ || func_fatal_help "\`$file' is not a valid libtool archive" library_names= old_library= relink_command= func_source "$file" # Add the libdir to current_libdirs if it is the destination. if test "X$destdir" = "X$libdir"; then case "$current_libdirs " in *" $libdir "*) ;; *) func_append current_libdirs " $libdir" ;; esac else # Note the libdir as a future libdir. case "$future_libdirs " in *" $libdir "*) ;; *) func_append future_libdirs " $libdir" ;; esac fi func_dirname "$file" "/" "" dir="$func_dirname_result" func_append dir "$objdir" if test -n "$relink_command"; then # Determine the prefix the user has applied to our future dir. inst_prefix_dir=`$ECHO "$destdir" | $SED -e "s%$libdir\$%%"` # Don't allow the user to place us outside of our expected # location b/c this prevents finding dependent libraries that # are installed to the same prefix. # At present, this check doesn't affect windows .dll's that # are installed into $libdir/../bin (currently, that works fine) # but it's something to keep an eye on. test "$inst_prefix_dir" = "$destdir" && \ func_fatal_error "error: cannot install \`$file' to a directory not ending in $libdir" if test -n "$inst_prefix_dir"; then # Stick the inst_prefix_dir data into the link command. relink_command=`$ECHO "$relink_command" | $SED "s%@inst_prefix_dir@%-inst-prefix-dir $inst_prefix_dir%"` else relink_command=`$ECHO "$relink_command" | $SED "s%@inst_prefix_dir@%%"` fi func_warning "relinking \`$file'" func_show_eval "$relink_command" \ 'func_fatal_error "error: relink \`$file'\'' with the above command before installing it"' fi # See the names of the shared library. set dummy $library_names; shift if test -n "$1"; then realname="$1" shift srcname="$realname" test -n "$relink_command" && srcname="$realname"T # Install the shared library and build the symlinks. func_show_eval "$install_shared_prog $dir/$srcname $destdir/$realname" \ 'exit $?' tstripme="$stripme" case $host_os in cygwin* | mingw* | pw32* | cegcc*) case $realname in *.dll.a) tstripme="" ;; esac ;; esac if test -n "$tstripme" && test -n "$striplib"; then func_show_eval "$striplib $destdir/$realname" 'exit $?' fi if test "$#" -gt 0; then # Delete the old symlinks, and create new ones. # Try `ln -sf' first, because the `ln' binary might depend on # the symlink we replace! Solaris /bin/ln does not understand -f, # so we also need to try rm && ln -s. for linkname do test "$linkname" != "$realname" \ && func_show_eval "(cd $destdir && { $LN_S -f $realname $linkname || { $RM $linkname && $LN_S $realname $linkname; }; })" done fi # Do each command in the postinstall commands. lib="$destdir/$realname" func_execute_cmds "$postinstall_cmds" 'exit $?' fi # Install the pseudo-library for information purposes. func_basename "$file" name="$func_basename_result" instname="$dir/$name"i func_show_eval "$install_prog $instname $destdir/$name" 'exit $?' # Maybe install the static library, too. test -n "$old_library" && func_append staticlibs " $dir/$old_library" ;; *.lo) # Install (i.e. copy) a libtool object. # Figure out destination file name, if it wasn't already specified. if test -n "$destname"; then destfile="$destdir/$destname" else func_basename "$file" destfile="$func_basename_result" destfile="$destdir/$destfile" fi # Deduce the name of the destination old-style object file. case $destfile in *.lo) func_lo2o "$destfile" staticdest=$func_lo2o_result ;; *.$objext) staticdest="$destfile" destfile= ;; *) func_fatal_help "cannot copy a libtool object to \`$destfile'" ;; esac # Install the libtool object if requested. test -n "$destfile" && \ func_show_eval "$install_prog $file $destfile" 'exit $?' # Install the old object if enabled. if test "$build_old_libs" = yes; then # Deduce the name of the old-style object file. func_lo2o "$file" staticobj=$func_lo2o_result func_show_eval "$install_prog \$staticobj \$staticdest" 'exit $?' fi exit $EXIT_SUCCESS ;; *) # Figure out destination file name, if it wasn't already specified. if test -n "$destname"; then destfile="$destdir/$destname" else func_basename "$file" destfile="$func_basename_result" destfile="$destdir/$destfile" fi # If the file is missing, and there is a .exe on the end, strip it # because it is most likely a libtool script we actually want to # install stripped_ext="" case $file in *.exe) if test ! -f "$file"; then func_stripname '' '.exe' "$file" file=$func_stripname_result stripped_ext=".exe" fi ;; esac # Do a test to see if this is really a libtool program. case $host in *cygwin* | *mingw*) if func_ltwrapper_executable_p "$file"; then func_ltwrapper_scriptname "$file" wrapper=$func_ltwrapper_scriptname_result else func_stripname '' '.exe' "$file" wrapper=$func_stripname_result fi ;; *) wrapper=$file ;; esac if func_ltwrapper_script_p "$wrapper"; then notinst_deplibs= relink_command= func_source "$wrapper" # Check the variables that should have been set. test -z "$generated_by_libtool_version" && \ func_fatal_error "invalid libtool wrapper script \`$wrapper'" finalize=yes for lib in $notinst_deplibs; do # Check to see that each library is installed. libdir= if test -f "$lib"; then func_source "$lib" fi libfile="$libdir/"`$ECHO "$lib" | $SED 's%^.*/%%g'` ### testsuite: skip nested quoting test if test -n "$libdir" && test ! -f "$libfile"; then func_warning "\`$lib' has not been installed in \`$libdir'" finalize=no fi done relink_command= func_source "$wrapper" outputname= if test "$fast_install" = no && test -n "$relink_command"; then $opt_dry_run || { if test "$finalize" = yes; then tmpdir=`func_mktempdir` func_basename "$file$stripped_ext" file="$func_basename_result" outputname="$tmpdir/$file" # Replace the output file specification. relink_command=`$ECHO "$relink_command" | $SED 's%@OUTPUT@%'"$outputname"'%g'` $opt_silent || { func_quote_for_expand "$relink_command" eval "func_echo $func_quote_for_expand_result" } if eval "$relink_command"; then : else func_error "error: relink \`$file' with the above command before installing it" $opt_dry_run || ${RM}r "$tmpdir" continue fi file="$outputname" else func_warning "cannot relink \`$file'" fi } else # Install the binary that we compiled earlier. file=`$ECHO "$file$stripped_ext" | $SED "s%\([^/]*\)$%$objdir/\1%"` fi fi # remove .exe since cygwin /usr/bin/install will append another # one anyway case $install_prog,$host in */usr/bin/install*,*cygwin*) case $file:$destfile in *.exe:*.exe) # this is ok ;; *.exe:*) destfile=$destfile.exe ;; *:*.exe) func_stripname '' '.exe' "$destfile" destfile=$func_stripname_result ;; esac ;; esac func_show_eval "$install_prog\$stripme \$file \$destfile" 'exit $?' $opt_dry_run || if test -n "$outputname"; then ${RM}r "$tmpdir" fi ;; esac done for file in $staticlibs; do func_basename "$file" name="$func_basename_result" # Set up the ranlib parameters. oldlib="$destdir/$name" func_to_tool_file "$oldlib" func_convert_file_msys_to_w32 tool_oldlib=$func_to_tool_file_result func_show_eval "$install_prog \$file \$oldlib" 'exit $?' if test -n "$stripme" && test -n "$old_striplib"; then func_show_eval "$old_striplib $tool_oldlib" 'exit $?' fi # Do each command in the postinstall commands. func_execute_cmds "$old_postinstall_cmds" 'exit $?' done test -n "$future_libdirs" && \ func_warning "remember to run \`$progname --finish$future_libdirs'" if test -n "$current_libdirs"; then # Maybe just do a dry run. $opt_dry_run && current_libdirs=" -n$current_libdirs" exec_cmd='$SHELL $progpath $preserve_args --finish$current_libdirs' else exit $EXIT_SUCCESS fi } test "$opt_mode" = install && func_mode_install ${1+"$@"} # func_generate_dlsyms outputname originator pic_p # Extract symbols from dlprefiles and create ${outputname}S.o with # a dlpreopen symbol table. func_generate_dlsyms () { $opt_debug my_outputname="$1" my_originator="$2" my_pic_p="${3-no}" my_prefix=`$ECHO "$my_originator" | sed 's%[^a-zA-Z0-9]%_%g'` my_dlsyms= if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then if test -n "$NM" && test -n "$global_symbol_pipe"; then my_dlsyms="${my_outputname}S.c" else func_error "not configured to extract global symbols from dlpreopened files" fi fi if test -n "$my_dlsyms"; then case $my_dlsyms in "") ;; *.c) # Discover the nlist of each of the dlfiles. nlist="$output_objdir/${my_outputname}.nm" func_show_eval "$RM $nlist ${nlist}S ${nlist}T" # Parse the name list into a source file. func_verbose "creating $output_objdir/$my_dlsyms" $opt_dry_run || $ECHO > "$output_objdir/$my_dlsyms" "\ /* $my_dlsyms - symbol resolution table for \`$my_outputname' dlsym emulation. */ /* Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION */ #ifdef __cplusplus extern \"C\" { #endif #if defined(__GNUC__) && (((__GNUC__ == 4) && (__GNUC_MINOR__ >= 4)) || (__GNUC__ > 4)) #pragma GCC diagnostic ignored \"-Wstrict-prototypes\" #endif /* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests. */ #if defined(_WIN32) || defined(__CYGWIN__) || defined(_WIN32_WCE) /* DATA imports from DLLs on WIN32 con't be const, because runtime relocations are performed -- see ld's documentation on pseudo-relocs. */ # define LT_DLSYM_CONST #elif defined(__osf__) /* This system does not cope well with relocations in const data. */ # define LT_DLSYM_CONST #else # define LT_DLSYM_CONST const #endif /* External symbol declarations for the compiler. */\ " if test "$dlself" = yes; then func_verbose "generating symbol list for \`$output'" $opt_dry_run || echo ': @PROGRAM@ ' > "$nlist" # Add our own program objects to the symbol list. progfiles=`$ECHO "$objs$old_deplibs" | $SP2NL | $SED "$lo2o" | $NL2SP` for progfile in $progfiles; do func_to_tool_file "$progfile" func_convert_file_msys_to_w32 func_verbose "extracting global C symbols from \`$func_to_tool_file_result'" $opt_dry_run || eval "$NM $func_to_tool_file_result | $global_symbol_pipe >> '$nlist'" done if test -n "$exclude_expsyms"; then $opt_dry_run || { eval '$EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T' eval '$MV "$nlist"T "$nlist"' } fi if test -n "$export_symbols_regex"; then $opt_dry_run || { eval '$EGREP -e "$export_symbols_regex" "$nlist" > "$nlist"T' eval '$MV "$nlist"T "$nlist"' } fi # Prepare the list of exported symbols if test -z "$export_symbols"; then export_symbols="$output_objdir/$outputname.exp" $opt_dry_run || { $RM $export_symbols eval "${SED} -n -e '/^: @PROGRAM@ $/d' -e 's/^.* \(.*\)$/\1/p' "'< "$nlist" > "$export_symbols"' case $host in *cygwin* | *mingw* | *cegcc* ) eval "echo EXPORTS "'> "$output_objdir/$outputname.def"' eval 'cat "$export_symbols" >> "$output_objdir/$outputname.def"' ;; esac } else $opt_dry_run || { eval "${SED} -e 's/\([].[*^$]\)/\\\\\1/g' -e 's/^/ /' -e 's/$/$/'"' < "$export_symbols" > "$output_objdir/$outputname.exp"' eval '$GREP -f "$output_objdir/$outputname.exp" < "$nlist" > "$nlist"T' eval '$MV "$nlist"T "$nlist"' case $host in *cygwin* | *mingw* | *cegcc* ) eval "echo EXPORTS "'> "$output_objdir/$outputname.def"' eval 'cat "$nlist" >> "$output_objdir/$outputname.def"' ;; esac } fi fi for dlprefile in $dlprefiles; do func_verbose "extracting global C symbols from \`$dlprefile'" func_basename "$dlprefile" name="$func_basename_result" case $host in *cygwin* | *mingw* | *cegcc* ) # if an import library, we need to obtain dlname if func_win32_import_lib_p "$dlprefile"; then func_tr_sh "$dlprefile" eval "curr_lafile=\$libfile_$func_tr_sh_result" dlprefile_dlbasename="" if test -n "$curr_lafile" && func_lalib_p "$curr_lafile"; then # Use subshell, to avoid clobbering current variable values dlprefile_dlname=`source "$curr_lafile" && echo "$dlname"` if test -n "$dlprefile_dlname" ; then func_basename "$dlprefile_dlname" dlprefile_dlbasename="$func_basename_result" else # no lafile. user explicitly requested -dlpreopen . $sharedlib_from_linklib_cmd "$dlprefile" dlprefile_dlbasename=$sharedlib_from_linklib_result fi fi $opt_dry_run || { if test -n "$dlprefile_dlbasename" ; then eval '$ECHO ": $dlprefile_dlbasename" >> "$nlist"' else func_warning "Could not compute DLL name from $name" eval '$ECHO ": $name " >> "$nlist"' fi func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32 eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe | $SED -e '/I __imp/d' -e 's/I __nm_/D /;s/_nm__//' >> '$nlist'" } else # not an import lib $opt_dry_run || { eval '$ECHO ": $name " >> "$nlist"' func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32 eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe >> '$nlist'" } fi ;; *) $opt_dry_run || { eval '$ECHO ": $name " >> "$nlist"' func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32 eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe >> '$nlist'" } ;; esac done $opt_dry_run || { # Make sure we have at least an empty file. test -f "$nlist" || : > "$nlist" if test -n "$exclude_expsyms"; then $EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T $MV "$nlist"T "$nlist" fi # Try sorting and uniquifying the output. if $GREP -v "^: " < "$nlist" | if sort -k 3 /dev/null 2>&1; then sort -k 3 else sort +2 fi | uniq > "$nlist"S; then : else $GREP -v "^: " < "$nlist" > "$nlist"S fi if test -f "$nlist"S; then eval "$global_symbol_to_cdecl"' < "$nlist"S >> "$output_objdir/$my_dlsyms"' else echo '/* NONE */' >> "$output_objdir/$my_dlsyms" fi echo >> "$output_objdir/$my_dlsyms" "\ /* The mapping between symbol names and symbols. */ typedef struct { const char *name; void *address; } lt_dlsymlist; extern LT_DLSYM_CONST lt_dlsymlist lt_${my_prefix}_LTX_preloaded_symbols[]; LT_DLSYM_CONST lt_dlsymlist lt_${my_prefix}_LTX_preloaded_symbols[] = {\ { \"$my_originator\", (void *) 0 }," case $need_lib_prefix in no) eval "$global_symbol_to_c_name_address" < "$nlist" >> "$output_objdir/$my_dlsyms" ;; *) eval "$global_symbol_to_c_name_address_lib_prefix" < "$nlist" >> "$output_objdir/$my_dlsyms" ;; esac echo >> "$output_objdir/$my_dlsyms" "\ {0, (void *) 0} }; /* This works around a problem in FreeBSD linker */ #ifdef FREEBSD_WORKAROUND static const void *lt_preloaded_setup() { return lt_${my_prefix}_LTX_preloaded_symbols; } #endif #ifdef __cplusplus } #endif\ " } # !$opt_dry_run pic_flag_for_symtable= case "$compile_command " in *" -static "*) ;; *) case $host in # compiling the symbol table file with pic_flag works around # a FreeBSD bug that causes programs to crash when -lm is # linked before any other PIC object. But we must not use # pic_flag when linking with -static. The problem exists in # FreeBSD 2.2.6 and is fixed in FreeBSD 3.1. *-*-freebsd2.*|*-*-freebsd3.0*|*-*-freebsdelf3.0*) pic_flag_for_symtable=" $pic_flag -DFREEBSD_WORKAROUND" ;; *-*-hpux*) pic_flag_for_symtable=" $pic_flag" ;; *) if test "X$my_pic_p" != Xno; then pic_flag_for_symtable=" $pic_flag" fi ;; esac ;; esac symtab_cflags= for arg in $LTCFLAGS; do case $arg in -pie | -fpie | -fPIE) ;; *) func_append symtab_cflags " $arg" ;; esac done # Now compile the dynamic symbol file. func_show_eval '(cd $output_objdir && $LTCC$symtab_cflags -c$no_builtin_flag$pic_flag_for_symtable "$my_dlsyms")' 'exit $?' # Clean up the generated files. func_show_eval '$RM "$output_objdir/$my_dlsyms" "$nlist" "${nlist}S" "${nlist}T"' # Transform the symbol file into the correct name. symfileobj="$output_objdir/${my_outputname}S.$objext" case $host in *cygwin* | *mingw* | *cegcc* ) if test -f "$output_objdir/$my_outputname.def"; then compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%"` finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%"` else compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$symfileobj%"` finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$symfileobj%"` fi ;; *) compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$symfileobj%"` finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$symfileobj%"` ;; esac ;; *) func_fatal_error "unknown suffix for \`$my_dlsyms'" ;; esac else # We keep going just in case the user didn't refer to # lt_preloaded_symbols. The linker will fail if global_symbol_pipe # really was required. # Nullify the symbol file. compile_command=`$ECHO "$compile_command" | $SED "s% @SYMFILE@%%"` finalize_command=`$ECHO "$finalize_command" | $SED "s% @SYMFILE@%%"` fi } # func_win32_libid arg # return the library type of file 'arg' # # Need a lot of goo to handle *both* DLLs and import libs # Has to be a shell function in order to 'eat' the argument # that is supplied when $file_magic_command is called. # Despite the name, also deal with 64 bit binaries. func_win32_libid () { $opt_debug win32_libid_type="unknown" win32_fileres=`file -L $1 2>/dev/null` case $win32_fileres in *ar\ archive\ import\ library*) # definitely import win32_libid_type="x86 archive import" ;; *ar\ archive*) # could be an import, or static # Keep the egrep pattern in sync with the one in _LT_CHECK_MAGIC_METHOD. if eval $OBJDUMP -f $1 | $SED -e '10q' 2>/dev/null | $EGREP 'file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)' >/dev/null; then func_to_tool_file "$1" func_convert_file_msys_to_w32 win32_nmres=`eval $NM -f posix -A \"$func_to_tool_file_result\" | $SED -n -e ' 1,100{ / I /{ s,.*,import, p q } }'` case $win32_nmres in import*) win32_libid_type="x86 archive import";; *) win32_libid_type="x86 archive static";; esac fi ;; *DLL*) win32_libid_type="x86 DLL" ;; *executable*) # but shell scripts are "executable" too... case $win32_fileres in *MS\ Windows\ PE\ Intel*) win32_libid_type="x86 DLL" ;; esac ;; esac $ECHO "$win32_libid_type" } # func_cygming_dll_for_implib ARG # # Platform-specific function to extract the # name of the DLL associated with the specified # import library ARG. # Invoked by eval'ing the libtool variable # $sharedlib_from_linklib_cmd # Result is available in the variable # $sharedlib_from_linklib_result func_cygming_dll_for_implib () { $opt_debug sharedlib_from_linklib_result=`$DLLTOOL --identify-strict --identify "$1"` } # func_cygming_dll_for_implib_fallback_core SECTION_NAME LIBNAMEs # # The is the core of a fallback implementation of a # platform-specific function to extract the name of the # DLL associated with the specified import library LIBNAME. # # SECTION_NAME is either .idata$6 or .idata$7, depending # on the platform and compiler that created the implib. # # Echos the name of the DLL associated with the # specified import library. func_cygming_dll_for_implib_fallback_core () { $opt_debug match_literal=`$ECHO "$1" | $SED "$sed_make_literal_regex"` $OBJDUMP -s --section "$1" "$2" 2>/dev/null | $SED '/^Contents of section '"$match_literal"':/{ # Place marker at beginning of archive member dllname section s/.*/====MARK====/ p d } # These lines can sometimes be longer than 43 characters, but # are always uninteresting /:[ ]*file format pe[i]\{,1\}-/d /^In archive [^:]*:/d # Ensure marker is printed /^====MARK====/p # Remove all lines with less than 43 characters /^.\{43\}/!d # From remaining lines, remove first 43 characters s/^.\{43\}//' | $SED -n ' # Join marker and all lines until next marker into a single line /^====MARK====/ b para H $ b para b :para x s/\n//g # Remove the marker s/^====MARK====// # Remove trailing dots and whitespace s/[\. \t]*$// # Print /./p' | # we now have a list, one entry per line, of the stringified # contents of the appropriate section of all members of the # archive which possess that section. Heuristic: eliminate # all those which have a first or second character that is # a '.' (that is, objdump's representation of an unprintable # character.) This should work for all archives with less than # 0x302f exports -- but will fail for DLLs whose name actually # begins with a literal '.' or a single character followed by # a '.'. # # Of those that remain, print the first one. $SED -e '/^\./d;/^.\./d;q' } # func_cygming_gnu_implib_p ARG # This predicate returns with zero status (TRUE) if # ARG is a GNU/binutils-style import library. Returns # with nonzero status (FALSE) otherwise. func_cygming_gnu_implib_p () { $opt_debug func_to_tool_file "$1" func_convert_file_msys_to_w32 func_cygming_gnu_implib_tmp=`$NM "$func_to_tool_file_result" | eval "$global_symbol_pipe" | $EGREP ' (_head_[A-Za-z0-9_]+_[ad]l*|[A-Za-z0-9_]+_[ad]l*_iname)$'` test -n "$func_cygming_gnu_implib_tmp" } # func_cygming_ms_implib_p ARG # This predicate returns with zero status (TRUE) if # ARG is an MS-style import library. Returns # with nonzero status (FALSE) otherwise. func_cygming_ms_implib_p () { $opt_debug func_to_tool_file "$1" func_convert_file_msys_to_w32 func_cygming_ms_implib_tmp=`$NM "$func_to_tool_file_result" | eval "$global_symbol_pipe" | $GREP '_NULL_IMPORT_DESCRIPTOR'` test -n "$func_cygming_ms_implib_tmp" } # func_cygming_dll_for_implib_fallback ARG # Platform-specific function to extract the # name of the DLL associated with the specified # import library ARG. # # This fallback implementation is for use when $DLLTOOL # does not support the --identify-strict option. # Invoked by eval'ing the libtool variable # $sharedlib_from_linklib_cmd # Result is available in the variable # $sharedlib_from_linklib_result func_cygming_dll_for_implib_fallback () { $opt_debug if func_cygming_gnu_implib_p "$1" ; then # binutils import library sharedlib_from_linklib_result=`func_cygming_dll_for_implib_fallback_core '.idata$7' "$1"` elif func_cygming_ms_implib_p "$1" ; then # ms-generated import library sharedlib_from_linklib_result=`func_cygming_dll_for_implib_fallback_core '.idata$6' "$1"` else # unknown sharedlib_from_linklib_result="" fi } # func_extract_an_archive dir oldlib func_extract_an_archive () { $opt_debug f_ex_an_ar_dir="$1"; shift f_ex_an_ar_oldlib="$1" if test "$lock_old_archive_extraction" = yes; then lockfile=$f_ex_an_ar_oldlib.lock until $opt_dry_run || ln "$progpath" "$lockfile" 2>/dev/null; do func_echo "Waiting for $lockfile to be removed" sleep 2 done fi func_show_eval "(cd \$f_ex_an_ar_dir && $AR x \"\$f_ex_an_ar_oldlib\")" \ 'stat=$?; rm -f "$lockfile"; exit $stat' if test "$lock_old_archive_extraction" = yes; then $opt_dry_run || rm -f "$lockfile" fi if ($AR t "$f_ex_an_ar_oldlib" | sort | sort -uc >/dev/null 2>&1); then : else func_fatal_error "object name conflicts in archive: $f_ex_an_ar_dir/$f_ex_an_ar_oldlib" fi } # func_extract_archives gentop oldlib ... func_extract_archives () { $opt_debug my_gentop="$1"; shift my_oldlibs=${1+"$@"} my_oldobjs="" my_xlib="" my_xabs="" my_xdir="" for my_xlib in $my_oldlibs; do # Extract the objects. case $my_xlib in [\\/]* | [A-Za-z]:[\\/]*) my_xabs="$my_xlib" ;; *) my_xabs=`pwd`"/$my_xlib" ;; esac func_basename "$my_xlib" my_xlib="$func_basename_result" my_xlib_u=$my_xlib while :; do case " $extracted_archives " in *" $my_xlib_u "*) func_arith $extracted_serial + 1 extracted_serial=$func_arith_result my_xlib_u=lt$extracted_serial-$my_xlib ;; *) break ;; esac done extracted_archives="$extracted_archives $my_xlib_u" my_xdir="$my_gentop/$my_xlib_u" func_mkdir_p "$my_xdir" case $host in *-darwin*) func_verbose "Extracting $my_xabs" # Do not bother doing anything if just a dry run $opt_dry_run || { darwin_orig_dir=`pwd` cd $my_xdir || exit $? darwin_archive=$my_xabs darwin_curdir=`pwd` darwin_base_archive=`basename "$darwin_archive"` darwin_arches=`$LIPO -info "$darwin_archive" 2>/dev/null | $GREP Architectures 2>/dev/null || true` if test -n "$darwin_arches"; then darwin_arches=`$ECHO "$darwin_arches" | $SED -e 's/.*are://'` darwin_arch= func_verbose "$darwin_base_archive has multiple architectures $darwin_arches" for darwin_arch in $darwin_arches ; do func_mkdir_p "unfat-$$/${darwin_base_archive}-${darwin_arch}" $LIPO -thin $darwin_arch -output "unfat-$$/${darwin_base_archive}-${darwin_arch}/${darwin_base_archive}" "${darwin_archive}" cd "unfat-$$/${darwin_base_archive}-${darwin_arch}" func_extract_an_archive "`pwd`" "${darwin_base_archive}" cd "$darwin_curdir" $RM "unfat-$$/${darwin_base_archive}-${darwin_arch}/${darwin_base_archive}" done # $darwin_arches ## Okay now we've a bunch of thin objects, gotta fatten them up :) darwin_filelist=`find unfat-$$ -type f -name \*.o -print -o -name \*.lo -print | $SED -e "$basename" | sort -u` darwin_file= darwin_files= for darwin_file in $darwin_filelist; do darwin_files=`find unfat-$$ -name $darwin_file -print | sort | $NL2SP` $LIPO -create -output "$darwin_file" $darwin_files done # $darwin_filelist $RM -rf unfat-$$ cd "$darwin_orig_dir" else cd $darwin_orig_dir func_extract_an_archive "$my_xdir" "$my_xabs" fi # $darwin_arches } # !$opt_dry_run ;; *) func_extract_an_archive "$my_xdir" "$my_xabs" ;; esac my_oldobjs="$my_oldobjs "`find $my_xdir -name \*.$objext -print -o -name \*.lo -print | sort | $NL2SP` done func_extract_archives_result="$my_oldobjs" } # func_emit_wrapper [arg=no] # # Emit a libtool wrapper script on stdout. # Don't directly open a file because we may want to # incorporate the script contents within a cygwin/mingw # wrapper executable. Must ONLY be called from within # func_mode_link because it depends on a number of variables # set therein. # # ARG is the value that the WRAPPER_SCRIPT_BELONGS_IN_OBJDIR # variable will take. If 'yes', then the emitted script # will assume that the directory in which it is stored is # the $objdir directory. This is a cygwin/mingw-specific # behavior. func_emit_wrapper () { func_emit_wrapper_arg1=${1-no} $ECHO "\ #! $SHELL # $output - temporary wrapper script for $objdir/$outputname # Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION # # The $output program cannot be directly executed until all the libtool # libraries that it depends on are installed. # # This wrapper script should never be moved out of the build directory. # If it is, it will not operate correctly. # Sed substitution that helps us do robust quoting. It backslashifies # metacharacters that are still active within double-quoted strings. sed_quote_subst='$sed_quote_subst' # Be Bourne compatible if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then emulate sh NULLCMD=: # Zsh 3.x and 4.x performs word splitting on \${1+\"\$@\"}, which # is contrary to our usage. Disable this feature. alias -g '\${1+\"\$@\"}'='\"\$@\"' setopt NO_GLOB_SUBST else case \`(set -o) 2>/dev/null\` in *posix*) set -o posix;; esac fi BIN_SH=xpg4; export BIN_SH # for Tru64 DUALCASE=1; export DUALCASE # for MKS sh # The HP-UX ksh and POSIX shell print the target directory to stdout # if CDPATH is set. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH relink_command=\"$relink_command\" # This environment variable determines our operation mode. if test \"\$libtool_install_magic\" = \"$magic\"; then # install mode needs the following variables: generated_by_libtool_version='$macro_version' notinst_deplibs='$notinst_deplibs' else # When we are sourced in execute mode, \$file and \$ECHO are already set. if test \"\$libtool_execute_magic\" != \"$magic\"; then file=\"\$0\"" qECHO=`$ECHO "$ECHO" | $SED "$sed_quote_subst"` $ECHO "\ # A function that is used when there is no print builtin or printf. func_fallback_echo () { eval 'cat <<_LTECHO_EOF \$1 _LTECHO_EOF' } ECHO=\"$qECHO\" fi # Very basic option parsing. These options are (a) specific to # the libtool wrapper, (b) are identical between the wrapper # /script/ and the wrapper /executable/ which is used only on # windows platforms, and (c) all begin with the string "--lt-" # (application programs are unlikely to have options which match # this pattern). # # There are only two supported options: --lt-debug and # --lt-dump-script. There is, deliberately, no --lt-help. # # The first argument to this parsing function should be the # script's $0 value, followed by "$@". lt_option_debug= func_parse_lt_options () { lt_script_arg0=\$0 shift for lt_opt do case \"\$lt_opt\" in --lt-debug) lt_option_debug=1 ;; --lt-dump-script) lt_dump_D=\`\$ECHO \"X\$lt_script_arg0\" | $SED -e 's/^X//' -e 's%/[^/]*$%%'\` test \"X\$lt_dump_D\" = \"X\$lt_script_arg0\" && lt_dump_D=. lt_dump_F=\`\$ECHO \"X\$lt_script_arg0\" | $SED -e 's/^X//' -e 's%^.*/%%'\` cat \"\$lt_dump_D/\$lt_dump_F\" exit 0 ;; --lt-*) \$ECHO \"Unrecognized --lt- option: '\$lt_opt'\" 1>&2 exit 1 ;; esac done # Print the debug banner immediately: if test -n \"\$lt_option_debug\"; then echo \"${outputname}:${output}:\${LINENO}: libtool wrapper (GNU $PACKAGE$TIMESTAMP) $VERSION\" 1>&2 fi } # Used when --lt-debug. Prints its arguments to stdout # (redirection is the responsibility of the caller) func_lt_dump_args () { lt_dump_args_N=1; for lt_arg do \$ECHO \"${outputname}:${output}:\${LINENO}: newargv[\$lt_dump_args_N]: \$lt_arg\" lt_dump_args_N=\`expr \$lt_dump_args_N + 1\` done } # Core function for launching the target application func_exec_program_core () { " case $host in # Backslashes separate directories on plain windows *-*-mingw | *-*-os2* | *-cegcc*) $ECHO "\ if test -n \"\$lt_option_debug\"; then \$ECHO \"${outputname}:${output}:\${LINENO}: newargv[0]: \$progdir\\\\\$program\" 1>&2 func_lt_dump_args \${1+\"\$@\"} 1>&2 fi exec \"\$progdir\\\\\$program\" \${1+\"\$@\"} " ;; *) $ECHO "\ if test -n \"\$lt_option_debug\"; then \$ECHO \"${outputname}:${output}:\${LINENO}: newargv[0]: \$progdir/\$program\" 1>&2 func_lt_dump_args \${1+\"\$@\"} 1>&2 fi exec \"\$progdir/\$program\" \${1+\"\$@\"} " ;; esac $ECHO "\ \$ECHO \"\$0: cannot exec \$program \$*\" 1>&2 exit 1 } # A function to encapsulate launching the target application # Strips options in the --lt-* namespace from \$@ and # launches target application with the remaining arguments. func_exec_program () { case \" \$* \" in *\\ --lt-*) for lt_wr_arg do case \$lt_wr_arg in --lt-*) ;; *) set x \"\$@\" \"\$lt_wr_arg\"; shift;; esac shift done ;; esac func_exec_program_core \${1+\"\$@\"} } # Parse options func_parse_lt_options \"\$0\" \${1+\"\$@\"} # Find the directory that this script lives in. thisdir=\`\$ECHO \"\$file\" | $SED 's%/[^/]*$%%'\` test \"x\$thisdir\" = \"x\$file\" && thisdir=. # Follow symbolic links until we get to the real thisdir. file=\`ls -ld \"\$file\" | $SED -n 's/.*-> //p'\` while test -n \"\$file\"; do destdir=\`\$ECHO \"\$file\" | $SED 's%/[^/]*\$%%'\` # If there was a directory component, then change thisdir. if test \"x\$destdir\" != \"x\$file\"; then case \"\$destdir\" in [\\\\/]* | [A-Za-z]:[\\\\/]*) thisdir=\"\$destdir\" ;; *) thisdir=\"\$thisdir/\$destdir\" ;; esac fi file=\`\$ECHO \"\$file\" | $SED 's%^.*/%%'\` file=\`ls -ld \"\$thisdir/\$file\" | $SED -n 's/.*-> //p'\` done # Usually 'no', except on cygwin/mingw when embedded into # the cwrapper. WRAPPER_SCRIPT_BELONGS_IN_OBJDIR=$func_emit_wrapper_arg1 if test \"\$WRAPPER_SCRIPT_BELONGS_IN_OBJDIR\" = \"yes\"; then # special case for '.' if test \"\$thisdir\" = \".\"; then thisdir=\`pwd\` fi # remove .libs from thisdir case \"\$thisdir\" in *[\\\\/]$objdir ) thisdir=\`\$ECHO \"\$thisdir\" | $SED 's%[\\\\/][^\\\\/]*$%%'\` ;; $objdir ) thisdir=. ;; esac fi # Try to get the absolute directory name. absdir=\`cd \"\$thisdir\" && pwd\` test -n \"\$absdir\" && thisdir=\"\$absdir\" " if test "$fast_install" = yes; then $ECHO "\ program=lt-'$outputname'$exeext progdir=\"\$thisdir/$objdir\" if test ! -f \"\$progdir/\$program\" || { file=\`ls -1dt \"\$progdir/\$program\" \"\$progdir/../\$program\" 2>/dev/null | ${SED} 1q\`; \\ test \"X\$file\" != \"X\$progdir/\$program\"; }; then file=\"\$\$-\$program\" if test ! -d \"\$progdir\"; then $MKDIR \"\$progdir\" else $RM \"\$progdir/\$file\" fi" $ECHO "\ # relink executable if necessary if test -n \"\$relink_command\"; then if relink_command_output=\`eval \$relink_command 2>&1\`; then : else $ECHO \"\$relink_command_output\" >&2 $RM \"\$progdir/\$file\" exit 1 fi fi $MV \"\$progdir/\$file\" \"\$progdir/\$program\" 2>/dev/null || { $RM \"\$progdir/\$program\"; $MV \"\$progdir/\$file\" \"\$progdir/\$program\"; } $RM \"\$progdir/\$file\" fi" else $ECHO "\ program='$outputname' progdir=\"\$thisdir/$objdir\" " fi $ECHO "\ if test -f \"\$progdir/\$program\"; then" # fixup the dll searchpath if we need to. # # Fix the DLL searchpath if we need to. Do this before prepending # to shlibpath, because on Windows, both are PATH and uninstalled # libraries must come first. if test -n "$dllsearchpath"; then $ECHO "\ # Add the dll search path components to the executable PATH PATH=$dllsearchpath:\$PATH " fi # Export our shlibpath_var if we have one. if test "$shlibpath_overrides_runpath" = yes && test -n "$shlibpath_var" && test -n "$temp_rpath"; then $ECHO "\ # Add our own library path to $shlibpath_var $shlibpath_var=\"$temp_rpath\$$shlibpath_var\" # Some systems cannot cope with colon-terminated $shlibpath_var # The second colon is a workaround for a bug in BeOS R4 sed $shlibpath_var=\`\$ECHO \"\$$shlibpath_var\" | $SED 's/::*\$//'\` export $shlibpath_var " fi $ECHO "\ if test \"\$libtool_execute_magic\" != \"$magic\"; then # Run the actual program with our arguments. func_exec_program \${1+\"\$@\"} fi else # The program doesn't exist. \$ECHO \"\$0: error: \\\`\$progdir/\$program' does not exist\" 1>&2 \$ECHO \"This script is just a wrapper for \$program.\" 1>&2 \$ECHO \"See the $PACKAGE documentation for more information.\" 1>&2 exit 1 fi fi\ " } # func_emit_cwrapperexe_src # emit the source code for a wrapper executable on stdout # Must ONLY be called from within func_mode_link because # it depends on a number of variable set therein. func_emit_cwrapperexe_src () { cat < #include #ifdef _MSC_VER # include # include # include #else # include # include # ifdef __CYGWIN__ # include # endif #endif #include #include #include #include #include #include #include #include /* declarations of non-ANSI functions */ #if defined(__MINGW32__) # ifdef __STRICT_ANSI__ int _putenv (const char *); # endif #elif defined(__CYGWIN__) # ifdef __STRICT_ANSI__ char *realpath (const char *, char *); int putenv (char *); int setenv (const char *, const char *, int); # endif /* #elif defined (other platforms) ... */ #endif /* portability defines, excluding path handling macros */ #if defined(_MSC_VER) # define setmode _setmode # define stat _stat # define chmod _chmod # define getcwd _getcwd # define putenv _putenv # define S_IXUSR _S_IEXEC # ifndef _INTPTR_T_DEFINED # define _INTPTR_T_DEFINED # define intptr_t int # endif #elif defined(__MINGW32__) # define setmode _setmode # define stat _stat # define chmod _chmod # define getcwd _getcwd # define putenv _putenv #elif defined(__CYGWIN__) # define HAVE_SETENV # define FOPEN_WB "wb" /* #elif defined (other platforms) ... */ #endif #if defined(PATH_MAX) # define LT_PATHMAX PATH_MAX #elif defined(MAXPATHLEN) # define LT_PATHMAX MAXPATHLEN #else # define LT_PATHMAX 1024 #endif #ifndef S_IXOTH # define S_IXOTH 0 #endif #ifndef S_IXGRP # define S_IXGRP 0 #endif /* path handling portability macros */ #ifndef DIR_SEPARATOR # define DIR_SEPARATOR '/' # define PATH_SEPARATOR ':' #endif #if defined (_WIN32) || defined (__MSDOS__) || defined (__DJGPP__) || \ defined (__OS2__) # define HAVE_DOS_BASED_FILE_SYSTEM # define FOPEN_WB "wb" # ifndef DIR_SEPARATOR_2 # define DIR_SEPARATOR_2 '\\' # endif # ifndef PATH_SEPARATOR_2 # define PATH_SEPARATOR_2 ';' # endif #endif #ifndef DIR_SEPARATOR_2 # define IS_DIR_SEPARATOR(ch) ((ch) == DIR_SEPARATOR) #else /* DIR_SEPARATOR_2 */ # define IS_DIR_SEPARATOR(ch) \ (((ch) == DIR_SEPARATOR) || ((ch) == DIR_SEPARATOR_2)) #endif /* DIR_SEPARATOR_2 */ #ifndef PATH_SEPARATOR_2 # define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR) #else /* PATH_SEPARATOR_2 */ # define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR_2) #endif /* PATH_SEPARATOR_2 */ #ifndef FOPEN_WB # define FOPEN_WB "w" #endif #ifndef _O_BINARY # define _O_BINARY 0 #endif #define XMALLOC(type, num) ((type *) xmalloc ((num) * sizeof(type))) #define XFREE(stale) do { \ if (stale) { free ((void *) stale); stale = 0; } \ } while (0) #if defined(LT_DEBUGWRAPPER) static int lt_debug = 1; #else static int lt_debug = 0; #endif const char *program_name = "libtool-wrapper"; /* in case xstrdup fails */ void *xmalloc (size_t num); char *xstrdup (const char *string); const char *base_name (const char *name); char *find_executable (const char *wrapper); char *chase_symlinks (const char *pathspec); int make_executable (const char *path); int check_executable (const char *path); char *strendzap (char *str, const char *pat); void lt_debugprintf (const char *file, int line, const char *fmt, ...); void lt_fatal (const char *file, int line, const char *message, ...); static const char *nonnull (const char *s); static const char *nonempty (const char *s); void lt_setenv (const char *name, const char *value); char *lt_extend_str (const char *orig_value, const char *add, int to_end); void lt_update_exe_path (const char *name, const char *value); void lt_update_lib_path (const char *name, const char *value); char **prepare_spawn (char **argv); void lt_dump_script (FILE *f); EOF cat <= 0) && (st.st_mode & (S_IXUSR | S_IXGRP | S_IXOTH))) return 1; else return 0; } int make_executable (const char *path) { int rval = 0; struct stat st; lt_debugprintf (__FILE__, __LINE__, "(make_executable): %s\n", nonempty (path)); if ((!path) || (!*path)) return 0; if (stat (path, &st) >= 0) { rval = chmod (path, st.st_mode | S_IXOTH | S_IXGRP | S_IXUSR); } return rval; } /* Searches for the full path of the wrapper. Returns newly allocated full path name if found, NULL otherwise Does not chase symlinks, even on platforms that support them. */ char * find_executable (const char *wrapper) { int has_slash = 0; const char *p; const char *p_next; /* static buffer for getcwd */ char tmp[LT_PATHMAX + 1]; int tmp_len; char *concat_name; lt_debugprintf (__FILE__, __LINE__, "(find_executable): %s\n", nonempty (wrapper)); if ((wrapper == NULL) || (*wrapper == '\0')) return NULL; /* Absolute path? */ #if defined (HAVE_DOS_BASED_FILE_SYSTEM) if (isalpha ((unsigned char) wrapper[0]) && wrapper[1] == ':') { concat_name = xstrdup (wrapper); if (check_executable (concat_name)) return concat_name; XFREE (concat_name); } else { #endif if (IS_DIR_SEPARATOR (wrapper[0])) { concat_name = xstrdup (wrapper); if (check_executable (concat_name)) return concat_name; XFREE (concat_name); } #if defined (HAVE_DOS_BASED_FILE_SYSTEM) } #endif for (p = wrapper; *p; p++) if (*p == '/') { has_slash = 1; break; } if (!has_slash) { /* no slashes; search PATH */ const char *path = getenv ("PATH"); if (path != NULL) { for (p = path; *p; p = p_next) { const char *q; size_t p_len; for (q = p; *q; q++) if (IS_PATH_SEPARATOR (*q)) break; p_len = q - p; p_next = (*q == '\0' ? q : q + 1); if (p_len == 0) { /* empty path: current directory */ if (getcwd (tmp, LT_PATHMAX) == NULL) lt_fatal (__FILE__, __LINE__, "getcwd failed: %s", nonnull (strerror (errno))); tmp_len = strlen (tmp); concat_name = XMALLOC (char, tmp_len + 1 + strlen (wrapper) + 1); memcpy (concat_name, tmp, tmp_len); concat_name[tmp_len] = '/'; strcpy (concat_name + tmp_len + 1, wrapper); } else { concat_name = XMALLOC (char, p_len + 1 + strlen (wrapper) + 1); memcpy (concat_name, p, p_len); concat_name[p_len] = '/'; strcpy (concat_name + p_len + 1, wrapper); } if (check_executable (concat_name)) return concat_name; XFREE (concat_name); } } /* not found in PATH; assume curdir */ } /* Relative path | not found in path: prepend cwd */ if (getcwd (tmp, LT_PATHMAX) == NULL) lt_fatal (__FILE__, __LINE__, "getcwd failed: %s", nonnull (strerror (errno))); tmp_len = strlen (tmp); concat_name = XMALLOC (char, tmp_len + 1 + strlen (wrapper) + 1); memcpy (concat_name, tmp, tmp_len); concat_name[tmp_len] = '/'; strcpy (concat_name + tmp_len + 1, wrapper); if (check_executable (concat_name)) return concat_name; XFREE (concat_name); return NULL; } char * chase_symlinks (const char *pathspec) { #ifndef S_ISLNK return xstrdup (pathspec); #else char buf[LT_PATHMAX]; struct stat s; char *tmp_pathspec = xstrdup (pathspec); char *p; int has_symlinks = 0; while (strlen (tmp_pathspec) && !has_symlinks) { lt_debugprintf (__FILE__, __LINE__, "checking path component for symlinks: %s\n", tmp_pathspec); if (lstat (tmp_pathspec, &s) == 0) { if (S_ISLNK (s.st_mode) != 0) { has_symlinks = 1; break; } /* search backwards for last DIR_SEPARATOR */ p = tmp_pathspec + strlen (tmp_pathspec) - 1; while ((p > tmp_pathspec) && (!IS_DIR_SEPARATOR (*p))) p--; if ((p == tmp_pathspec) && (!IS_DIR_SEPARATOR (*p))) { /* no more DIR_SEPARATORS left */ break; } *p = '\0'; } else { lt_fatal (__FILE__, __LINE__, "error accessing file \"%s\": %s", tmp_pathspec, nonnull (strerror (errno))); } } XFREE (tmp_pathspec); if (!has_symlinks) { return xstrdup (pathspec); } tmp_pathspec = realpath (pathspec, buf); if (tmp_pathspec == 0) { lt_fatal (__FILE__, __LINE__, "could not follow symlinks for %s", pathspec); } return xstrdup (tmp_pathspec); #endif } char * strendzap (char *str, const char *pat) { size_t len, patlen; assert (str != NULL); assert (pat != NULL); len = strlen (str); patlen = strlen (pat); if (patlen <= len) { str += len - patlen; if (strcmp (str, pat) == 0) *str = '\0'; } return str; } void lt_debugprintf (const char *file, int line, const char *fmt, ...) { va_list args; if (lt_debug) { (void) fprintf (stderr, "%s:%s:%d: ", program_name, file, line); va_start (args, fmt); (void) vfprintf (stderr, fmt, args); va_end (args); } } static void lt_error_core (int exit_status, const char *file, int line, const char *mode, const char *message, va_list ap) { fprintf (stderr, "%s:%s:%d: %s: ", program_name, file, line, mode); vfprintf (stderr, message, ap); fprintf (stderr, ".\n"); if (exit_status >= 0) exit (exit_status); } void lt_fatal (const char *file, int line, const char *message, ...) { va_list ap; va_start (ap, message); lt_error_core (EXIT_FAILURE, file, line, "FATAL", message, ap); va_end (ap); } static const char * nonnull (const char *s) { return s ? s : "(null)"; } static const char * nonempty (const char *s) { return (s && !*s) ? "(empty)" : nonnull (s); } void lt_setenv (const char *name, const char *value) { lt_debugprintf (__FILE__, __LINE__, "(lt_setenv) setting '%s' to '%s'\n", nonnull (name), nonnull (value)); { #ifdef HAVE_SETENV /* always make a copy, for consistency with !HAVE_SETENV */ char *str = xstrdup (value); setenv (name, str, 1); #else int len = strlen (name) + 1 + strlen (value) + 1; char *str = XMALLOC (char, len); sprintf (str, "%s=%s", name, value); if (putenv (str) != EXIT_SUCCESS) { XFREE (str); } #endif } } char * lt_extend_str (const char *orig_value, const char *add, int to_end) { char *new_value; if (orig_value && *orig_value) { int orig_value_len = strlen (orig_value); int add_len = strlen (add); new_value = XMALLOC (char, add_len + orig_value_len + 1); if (to_end) { strcpy (new_value, orig_value); strcpy (new_value + orig_value_len, add); } else { strcpy (new_value, add); strcpy (new_value + add_len, orig_value); } } else { new_value = xstrdup (add); } return new_value; } void lt_update_exe_path (const char *name, const char *value) { lt_debugprintf (__FILE__, __LINE__, "(lt_update_exe_path) modifying '%s' by prepending '%s'\n", nonnull (name), nonnull (value)); if (name && *name && value && *value) { char *new_value = lt_extend_str (getenv (name), value, 0); /* some systems can't cope with a ':'-terminated path #' */ int len = strlen (new_value); while (((len = strlen (new_value)) > 0) && IS_PATH_SEPARATOR (new_value[len-1])) { new_value[len-1] = '\0'; } lt_setenv (name, new_value); XFREE (new_value); } } void lt_update_lib_path (const char *name, const char *value) { lt_debugprintf (__FILE__, __LINE__, "(lt_update_lib_path) modifying '%s' by prepending '%s'\n", nonnull (name), nonnull (value)); if (name && *name && value && *value) { char *new_value = lt_extend_str (getenv (name), value, 0); lt_setenv (name, new_value); XFREE (new_value); } } EOF case $host_os in mingw*) cat <<"EOF" /* Prepares an argument vector before calling spawn(). Note that spawn() does not by itself call the command interpreter (getenv ("COMSPEC") != NULL ? getenv ("COMSPEC") : ({ OSVERSIONINFO v; v.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); GetVersionEx(&v); v.dwPlatformId == VER_PLATFORM_WIN32_NT; }) ? "cmd.exe" : "command.com"). Instead it simply concatenates the arguments, separated by ' ', and calls CreateProcess(). We must quote the arguments since Win32 CreateProcess() interprets characters like ' ', '\t', '\\', '"' (but not '<' and '>') in a special way: - Space and tab are interpreted as delimiters. They are not treated as delimiters if they are surrounded by double quotes: "...". - Unescaped double quotes are removed from the input. Their only effect is that within double quotes, space and tab are treated like normal characters. - Backslashes not followed by double quotes are not special. - But 2*n+1 backslashes followed by a double quote become n backslashes followed by a double quote (n >= 0): \" -> " \\\" -> \" \\\\\" -> \\" */ #define SHELL_SPECIAL_CHARS "\"\\ \001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037" #define SHELL_SPACE_CHARS " \001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037" char ** prepare_spawn (char **argv) { size_t argc; char **new_argv; size_t i; /* Count number of arguments. */ for (argc = 0; argv[argc] != NULL; argc++) ; /* Allocate new argument vector. */ new_argv = XMALLOC (char *, argc + 1); /* Put quoted arguments into the new argument vector. */ for (i = 0; i < argc; i++) { const char *string = argv[i]; if (string[0] == '\0') new_argv[i] = xstrdup ("\"\""); else if (strpbrk (string, SHELL_SPECIAL_CHARS) != NULL) { int quote_around = (strpbrk (string, SHELL_SPACE_CHARS) != NULL); size_t length; unsigned int backslashes; const char *s; char *quoted_string; char *p; length = 0; backslashes = 0; if (quote_around) length++; for (s = string; *s != '\0'; s++) { char c = *s; if (c == '"') length += backslashes + 1; length++; if (c == '\\') backslashes++; else backslashes = 0; } if (quote_around) length += backslashes + 1; quoted_string = XMALLOC (char, length + 1); p = quoted_string; backslashes = 0; if (quote_around) *p++ = '"'; for (s = string; *s != '\0'; s++) { char c = *s; if (c == '"') { unsigned int j; for (j = backslashes + 1; j > 0; j--) *p++ = '\\'; } *p++ = c; if (c == '\\') backslashes++; else backslashes = 0; } if (quote_around) { unsigned int j; for (j = backslashes; j > 0; j--) *p++ = '\\'; *p++ = '"'; } *p = '\0'; new_argv[i] = quoted_string; } else new_argv[i] = (char *) string; } new_argv[argc] = NULL; return new_argv; } EOF ;; esac cat <<"EOF" void lt_dump_script (FILE* f) { EOF func_emit_wrapper yes | $SED -n -e ' s/^\(.\{79\}\)\(..*\)/\1\ \2/ h s/\([\\"]\)/\\\1/g s/$/\\n/ s/\([^\n]*\).*/ fputs ("\1", f);/p g D' cat <<"EOF" } EOF } # end: func_emit_cwrapperexe_src # func_win32_import_lib_p ARG # True if ARG is an import lib, as indicated by $file_magic_cmd func_win32_import_lib_p () { $opt_debug case `eval $file_magic_cmd \"\$1\" 2>/dev/null | $SED -e 10q` in *import*) : ;; *) false ;; esac } # func_mode_link arg... func_mode_link () { $opt_debug case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*) # It is impossible to link a dll without this setting, and # we shouldn't force the makefile maintainer to figure out # which system we are compiling for in order to pass an extra # flag for every libtool invocation. # allow_undefined=no # FIXME: Unfortunately, there are problems with the above when trying # to make a dll which has undefined symbols, in which case not # even a static library is built. For now, we need to specify # -no-undefined on the libtool link line when we can be certain # that all symbols are satisfied, otherwise we get a static library. allow_undefined=yes ;; *) allow_undefined=yes ;; esac libtool_args=$nonopt base_compile="$nonopt $@" compile_command=$nonopt finalize_command=$nonopt compile_rpath= finalize_rpath= compile_shlibpath= finalize_shlibpath= convenience= old_convenience= deplibs= old_deplibs= compiler_flags= linker_flags= dllsearchpath= lib_search_path=`pwd` inst_prefix_dir= new_inherited_linker_flags= avoid_version=no bindir= dlfiles= dlprefiles= dlself=no export_dynamic=no export_symbols= export_symbols_regex= generated= libobjs= ltlibs= module=no no_install=no objs= non_pic_objects= precious_files_regex= prefer_static_libs=no preload=no prev= prevarg= release= rpath= xrpath= perm_rpath= temp_rpath= thread_safe=no vinfo= vinfo_number=no weak_libs= single_module="${wl}-single_module" func_infer_tag $base_compile # We need to know -static, to get the right output filenames. for arg do case $arg in -shared) test "$build_libtool_libs" != yes && \ func_fatal_configuration "can not build a shared library" build_old_libs=no break ;; -all-static | -static | -static-libtool-libs) case $arg in -all-static) if test "$build_libtool_libs" = yes && test -z "$link_static_flag"; then func_warning "complete static linking is impossible in this configuration" fi if test -n "$link_static_flag"; then dlopen_self=$dlopen_self_static fi prefer_static_libs=yes ;; -static) if test -z "$pic_flag" && test -n "$link_static_flag"; then dlopen_self=$dlopen_self_static fi prefer_static_libs=built ;; -static-libtool-libs) if test -z "$pic_flag" && test -n "$link_static_flag"; then dlopen_self=$dlopen_self_static fi prefer_static_libs=yes ;; esac build_libtool_libs=no build_old_libs=yes break ;; esac done # See if our shared archives depend on static archives. test -n "$old_archive_from_new_cmds" && build_old_libs=yes # Go through the arguments, transforming them on the way. while test "$#" -gt 0; do arg="$1" shift func_quote_for_eval "$arg" qarg=$func_quote_for_eval_unquoted_result func_append libtool_args " $func_quote_for_eval_result" # If the previous option needs an argument, assign it. if test -n "$prev"; then case $prev in output) func_append compile_command " @OUTPUT@" func_append finalize_command " @OUTPUT@" ;; esac case $prev in bindir) bindir="$arg" prev= continue ;; dlfiles|dlprefiles) if test "$preload" = no; then # Add the symbol object into the linking commands. func_append compile_command " @SYMFILE@" func_append finalize_command " @SYMFILE@" preload=yes fi case $arg in *.la | *.lo) ;; # We handle these cases below. force) if test "$dlself" = no; then dlself=needless export_dynamic=yes fi prev= continue ;; self) if test "$prev" = dlprefiles; then dlself=yes elif test "$prev" = dlfiles && test "$dlopen_self" != yes; then dlself=yes else dlself=needless export_dynamic=yes fi prev= continue ;; *) if test "$prev" = dlfiles; then func_append dlfiles " $arg" else func_append dlprefiles " $arg" fi prev= continue ;; esac ;; expsyms) export_symbols="$arg" test -f "$arg" \ || func_fatal_error "symbol file \`$arg' does not exist" prev= continue ;; expsyms_regex) export_symbols_regex="$arg" prev= continue ;; framework) case $host in *-*-darwin*) case "$deplibs " in *" $qarg.ltframework "*) ;; *) func_append deplibs " $qarg.ltframework" # this is fixed later ;; esac ;; esac prev= continue ;; inst_prefix) inst_prefix_dir="$arg" prev= continue ;; objectlist) if test -f "$arg"; then save_arg=$arg moreargs= for fil in `cat "$save_arg"` do # func_append moreargs " $fil" arg=$fil # A libtool-controlled object. # Check to see that this really is a libtool object. if func_lalib_unsafe_p "$arg"; then pic_object= non_pic_object= # Read the .lo file func_source "$arg" if test -z "$pic_object" || test -z "$non_pic_object" || test "$pic_object" = none && test "$non_pic_object" = none; then func_fatal_error "cannot find name of object for \`$arg'" fi # Extract subdirectory from the argument. func_dirname "$arg" "/" "" xdir="$func_dirname_result" if test "$pic_object" != none; then # Prepend the subdirectory the object is found in. pic_object="$xdir$pic_object" if test "$prev" = dlfiles; then if test "$build_libtool_libs" = yes && test "$dlopen_support" = yes; then func_append dlfiles " $pic_object" prev= continue else # If libtool objects are unsupported, then we need to preload. prev=dlprefiles fi fi # CHECK ME: I think I busted this. -Ossama if test "$prev" = dlprefiles; then # Preload the old-style object. func_append dlprefiles " $pic_object" prev= fi # A PIC object. func_append libobjs " $pic_object" arg="$pic_object" fi # Non-PIC object. if test "$non_pic_object" != none; then # Prepend the subdirectory the object is found in. non_pic_object="$xdir$non_pic_object" # A standard non-PIC object func_append non_pic_objects " $non_pic_object" if test -z "$pic_object" || test "$pic_object" = none ; then arg="$non_pic_object" fi else # If the PIC object exists, use it instead. # $xdir was prepended to $pic_object above. non_pic_object="$pic_object" func_append non_pic_objects " $non_pic_object" fi else # Only an error if not doing a dry-run. if $opt_dry_run; then # Extract subdirectory from the argument. func_dirname "$arg" "/" "" xdir="$func_dirname_result" func_lo2o "$arg" pic_object=$xdir$objdir/$func_lo2o_result non_pic_object=$xdir$func_lo2o_result func_append libobjs " $pic_object" func_append non_pic_objects " $non_pic_object" else func_fatal_error "\`$arg' is not a valid libtool object" fi fi done else func_fatal_error "link input file \`$arg' does not exist" fi arg=$save_arg prev= continue ;; precious_regex) precious_files_regex="$arg" prev= continue ;; release) release="-$arg" prev= continue ;; rpath | xrpath) # We need an absolute path. case $arg in [\\/]* | [A-Za-z]:[\\/]*) ;; *) func_fatal_error "only absolute run-paths are allowed" ;; esac if test "$prev" = rpath; then case "$rpath " in *" $arg "*) ;; *) func_append rpath " $arg" ;; esac else case "$xrpath " in *" $arg "*) ;; *) func_append xrpath " $arg" ;; esac fi prev= continue ;; shrext) shrext_cmds="$arg" prev= continue ;; weak) func_append weak_libs " $arg" prev= continue ;; xcclinker) func_append linker_flags " $qarg" func_append compiler_flags " $qarg" prev= func_append compile_command " $qarg" func_append finalize_command " $qarg" continue ;; xcompiler) func_append compiler_flags " $qarg" prev= func_append compile_command " $qarg" func_append finalize_command " $qarg" continue ;; xlinker) func_append linker_flags " $qarg" func_append compiler_flags " $wl$qarg" prev= func_append compile_command " $wl$qarg" func_append finalize_command " $wl$qarg" continue ;; *) eval "$prev=\"\$arg\"" prev= continue ;; esac fi # test -n "$prev" prevarg="$arg" case $arg in -all-static) if test -n "$link_static_flag"; then # See comment for -static flag below, for more details. func_append compile_command " $link_static_flag" func_append finalize_command " $link_static_flag" fi continue ;; -allow-undefined) # FIXME: remove this flag sometime in the future. func_fatal_error "\`-allow-undefined' must not be used because it is the default" ;; -avoid-version) avoid_version=yes continue ;; -bindir) prev=bindir continue ;; -dlopen) prev=dlfiles continue ;; -dlpreopen) prev=dlprefiles continue ;; -export-dynamic) export_dynamic=yes continue ;; -export-symbols | -export-symbols-regex) if test -n "$export_symbols" || test -n "$export_symbols_regex"; then func_fatal_error "more than one -exported-symbols argument is not allowed" fi if test "X$arg" = "X-export-symbols"; then prev=expsyms else prev=expsyms_regex fi continue ;; -framework) prev=framework continue ;; -inst-prefix-dir) prev=inst_prefix continue ;; # The native IRIX linker understands -LANG:*, -LIST:* and -LNO:* # so, if we see these flags be careful not to treat them like -L -L[A-Z][A-Z]*:*) case $with_gcc/$host in no/*-*-irix* | /*-*-irix*) func_append compile_command " $arg" func_append finalize_command " $arg" ;; esac continue ;; -L*) func_stripname "-L" '' "$arg" if test -z "$func_stripname_result"; then if test "$#" -gt 0; then func_fatal_error "require no space between \`-L' and \`$1'" else func_fatal_error "need path for \`-L' option" fi fi func_resolve_sysroot "$func_stripname_result" dir=$func_resolve_sysroot_result # We need an absolute path. case $dir in [\\/]* | [A-Za-z]:[\\/]*) ;; *) absdir=`cd "$dir" && pwd` test -z "$absdir" && \ func_fatal_error "cannot determine absolute directory name of \`$dir'" dir="$absdir" ;; esac case "$deplibs " in *" -L$dir "* | *" $arg "*) # Will only happen for absolute or sysroot arguments ;; *) # Preserve sysroot, but never include relative directories case $dir in [\\/]* | [A-Za-z]:[\\/]* | =*) func_append deplibs " $arg" ;; *) func_append deplibs " -L$dir" ;; esac func_append lib_search_path " $dir" ;; esac case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*) testbindir=`$ECHO "$dir" | $SED 's*/lib$*/bin*'` case :$dllsearchpath: in *":$dir:"*) ;; ::) dllsearchpath=$dir;; *) func_append dllsearchpath ":$dir";; esac case :$dllsearchpath: in *":$testbindir:"*) ;; ::) dllsearchpath=$testbindir;; *) func_append dllsearchpath ":$testbindir";; esac ;; esac continue ;; -l*) if test "X$arg" = "X-lc" || test "X$arg" = "X-lm"; then case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-beos* | *-cegcc* | *-*-haiku*) # These systems don't actually have a C or math library (as such) continue ;; *-*-os2*) # These systems don't actually have a C library (as such) test "X$arg" = "X-lc" && continue ;; *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*) # Do not include libc due to us having libc/libc_r. test "X$arg" = "X-lc" && continue ;; *-*-rhapsody* | *-*-darwin1.[012]) # Rhapsody C and math libraries are in the System framework func_append deplibs " System.ltframework" continue ;; *-*-sco3.2v5* | *-*-sco5v6*) # Causes problems with __ctype test "X$arg" = "X-lc" && continue ;; *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*) # Compiler inserts libc in the correct place for threads to work test "X$arg" = "X-lc" && continue ;; esac elif test "X$arg" = "X-lc_r"; then case $host in *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*) # Do not include libc_r directly, use -pthread flag. continue ;; esac fi func_append deplibs " $arg" continue ;; -module) module=yes continue ;; # Tru64 UNIX uses -model [arg] to determine the layout of C++ # classes, name mangling, and exception handling. # Darwin uses the -arch flag to determine output architecture. -model|-arch|-isysroot|--sysroot) func_append compiler_flags " $arg" func_append compile_command " $arg" func_append finalize_command " $arg" prev=xcompiler continue ;; -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe \ |-threads|-fopenmp|-openmp|-mp|-xopenmp|-omp|-qsmp=*) func_append compiler_flags " $arg" func_append compile_command " $arg" func_append finalize_command " $arg" case "$new_inherited_linker_flags " in *" $arg "*) ;; * ) func_append new_inherited_linker_flags " $arg" ;; esac continue ;; -multi_module) single_module="${wl}-multi_module" continue ;; -no-fast-install) fast_install=no continue ;; -no-install) case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-darwin* | *-cegcc*) # The PATH hackery in wrapper scripts is required on Windows # and Darwin in order for the loader to find any dlls it needs. func_warning "\`-no-install' is ignored for $host" func_warning "assuming \`-no-fast-install' instead" fast_install=no ;; *) no_install=yes ;; esac continue ;; -no-undefined) allow_undefined=no continue ;; -objectlist) prev=objectlist continue ;; -o) prev=output ;; -precious-files-regex) prev=precious_regex continue ;; -release) prev=release continue ;; -rpath) prev=rpath continue ;; -R) prev=xrpath continue ;; -R*) func_stripname '-R' '' "$arg" dir=$func_stripname_result # We need an absolute path. case $dir in [\\/]* | [A-Za-z]:[\\/]*) ;; =*) func_stripname '=' '' "$dir" dir=$lt_sysroot$func_stripname_result ;; *) func_fatal_error "only absolute run-paths are allowed" ;; esac case "$xrpath " in *" $dir "*) ;; *) func_append xrpath " $dir" ;; esac continue ;; -shared) # The effects of -shared are defined in a previous loop. continue ;; -shrext) prev=shrext continue ;; -static | -static-libtool-libs) # The effects of -static are defined in a previous loop. # We used to do the same as -all-static on platforms that # didn't have a PIC flag, but the assumption that the effects # would be equivalent was wrong. It would break on at least # Digital Unix and AIX. continue ;; -thread-safe) thread_safe=yes continue ;; -version-info) prev=vinfo continue ;; -version-number) prev=vinfo vinfo_number=yes continue ;; -weak) prev=weak continue ;; -Wc,*) func_stripname '-Wc,' '' "$arg" args=$func_stripname_result arg= save_ifs="$IFS"; IFS=',' for flag in $args; do IFS="$save_ifs" func_quote_for_eval "$flag" func_append arg " $func_quote_for_eval_result" func_append compiler_flags " $func_quote_for_eval_result" done IFS="$save_ifs" func_stripname ' ' '' "$arg" arg=$func_stripname_result ;; -Wl,*) func_stripname '-Wl,' '' "$arg" args=$func_stripname_result arg= save_ifs="$IFS"; IFS=',' for flag in $args; do IFS="$save_ifs" func_quote_for_eval "$flag" func_append arg " $wl$func_quote_for_eval_result" func_append compiler_flags " $wl$func_quote_for_eval_result" func_append linker_flags " $func_quote_for_eval_result" done IFS="$save_ifs" func_stripname ' ' '' "$arg" arg=$func_stripname_result ;; -Xcompiler) prev=xcompiler continue ;; -Xlinker) prev=xlinker continue ;; -XCClinker) prev=xcclinker continue ;; # -msg_* for osf cc -msg_*) func_quote_for_eval "$arg" arg="$func_quote_for_eval_result" ;; # Flags to be passed through unchanged, with rationale: # -64, -mips[0-9] enable 64-bit mode for the SGI compiler # -r[0-9][0-9]* specify processor for the SGI compiler # -xarch=*, -xtarget=* enable 64-bit mode for the Sun compiler # +DA*, +DD* enable 64-bit mode for the HP compiler # -q* compiler args for the IBM compiler # -m*, -t[45]*, -txscale* architecture-specific flags for GCC # -F/path path to uninstalled frameworks, gcc on darwin # -p, -pg, --coverage, -fprofile-* profiling flags for GCC # @file GCC response files # -tp=* Portland pgcc target processor selection # --sysroot=* for sysroot support # -O*, -flto*, -fwhopr*, -fuse-linker-plugin GCC link-time optimization # -stdlib=* select c++ std lib with clang -64|-mips[0-9]|-r[0-9][0-9]*|-xarch=*|-xtarget=*|+DA*|+DD*|-q*|-m*| \ -t[45]*|-txscale*|-p|-pg|--coverage|-fprofile-*|-F*|@*|-tp=*|--sysroot=*| \ -O*|-flto*|-fwhopr*|-fuse-linker-plugin|-stdlib=*) func_quote_for_eval "$arg" arg="$func_quote_for_eval_result" func_append compile_command " $arg" func_append finalize_command " $arg" func_append compiler_flags " $arg" continue ;; # Some other compiler flag. -* | +*) func_quote_for_eval "$arg" arg="$func_quote_for_eval_result" ;; *.$objext) # A standard object. func_append objs " $arg" ;; *.lo) # A libtool-controlled object. # Check to see that this really is a libtool object. if func_lalib_unsafe_p "$arg"; then pic_object= non_pic_object= # Read the .lo file func_source "$arg" if test -z "$pic_object" || test -z "$non_pic_object" || test "$pic_object" = none && test "$non_pic_object" = none; then func_fatal_error "cannot find name of object for \`$arg'" fi # Extract subdirectory from the argument. func_dirname "$arg" "/" "" xdir="$func_dirname_result" if test "$pic_object" != none; then # Prepend the subdirectory the object is found in. pic_object="$xdir$pic_object" if test "$prev" = dlfiles; then if test "$build_libtool_libs" = yes && test "$dlopen_support" = yes; then func_append dlfiles " $pic_object" prev= continue else # If libtool objects are unsupported, then we need to preload. prev=dlprefiles fi fi # CHECK ME: I think I busted this. -Ossama if test "$prev" = dlprefiles; then # Preload the old-style object. func_append dlprefiles " $pic_object" prev= fi # A PIC object. func_append libobjs " $pic_object" arg="$pic_object" fi # Non-PIC object. if test "$non_pic_object" != none; then # Prepend the subdirectory the object is found in. non_pic_object="$xdir$non_pic_object" # A standard non-PIC object func_append non_pic_objects " $non_pic_object" if test -z "$pic_object" || test "$pic_object" = none ; then arg="$non_pic_object" fi else # If the PIC object exists, use it instead. # $xdir was prepended to $pic_object above. non_pic_object="$pic_object" func_append non_pic_objects " $non_pic_object" fi else # Only an error if not doing a dry-run. if $opt_dry_run; then # Extract subdirectory from the argument. func_dirname "$arg" "/" "" xdir="$func_dirname_result" func_lo2o "$arg" pic_object=$xdir$objdir/$func_lo2o_result non_pic_object=$xdir$func_lo2o_result func_append libobjs " $pic_object" func_append non_pic_objects " $non_pic_object" else func_fatal_error "\`$arg' is not a valid libtool object" fi fi ;; *.$libext) # An archive. func_append deplibs " $arg" func_append old_deplibs " $arg" continue ;; *.la) # A libtool-controlled library. func_resolve_sysroot "$arg" if test "$prev" = dlfiles; then # This library was specified with -dlopen. func_append dlfiles " $func_resolve_sysroot_result" prev= elif test "$prev" = dlprefiles; then # The library was specified with -dlpreopen. func_append dlprefiles " $func_resolve_sysroot_result" prev= else func_append deplibs " $func_resolve_sysroot_result" fi continue ;; # Some other compiler argument. *) # Unknown arguments in both finalize_command and compile_command need # to be aesthetically quoted because they are evaled later. func_quote_for_eval "$arg" arg="$func_quote_for_eval_result" ;; esac # arg # Now actually substitute the argument into the commands. if test -n "$arg"; then func_append compile_command " $arg" func_append finalize_command " $arg" fi done # argument parsing loop test -n "$prev" && \ func_fatal_help "the \`$prevarg' option requires an argument" if test "$export_dynamic" = yes && test -n "$export_dynamic_flag_spec"; then eval arg=\"$export_dynamic_flag_spec\" func_append compile_command " $arg" func_append finalize_command " $arg" fi oldlibs= # calculate the name of the file, without its directory func_basename "$output" outputname="$func_basename_result" libobjs_save="$libobjs" if test -n "$shlibpath_var"; then # get the directories listed in $shlibpath_var eval shlib_search_path=\`\$ECHO \"\${$shlibpath_var}\" \| \$SED \'s/:/ /g\'\` else shlib_search_path= fi eval sys_lib_search_path=\"$sys_lib_search_path_spec\" eval sys_lib_dlsearch_path=\"$sys_lib_dlsearch_path_spec\" func_dirname "$output" "/" "" output_objdir="$func_dirname_result$objdir" func_to_tool_file "$output_objdir/" tool_output_objdir=$func_to_tool_file_result # Create the object directory. func_mkdir_p "$output_objdir" # Determine the type of output case $output in "") func_fatal_help "you must specify an output file" ;; *.$libext) linkmode=oldlib ;; *.lo | *.$objext) linkmode=obj ;; *.la) linkmode=lib ;; *) linkmode=prog ;; # Anything else should be a program. esac specialdeplibs= libs= # Find all interdependent deplibs by searching for libraries # that are linked more than once (e.g. -la -lb -la) for deplib in $deplibs; do if $opt_preserve_dup_deps ; then case "$libs " in *" $deplib "*) func_append specialdeplibs " $deplib" ;; esac fi func_append libs " $deplib" done if test "$linkmode" = lib; then libs="$predeps $libs $compiler_lib_search_path $postdeps" # Compute libraries that are listed more than once in $predeps # $postdeps and mark them as special (i.e., whose duplicates are # not to be eliminated). pre_post_deps= if $opt_duplicate_compiler_generated_deps; then for pre_post_dep in $predeps $postdeps; do case "$pre_post_deps " in *" $pre_post_dep "*) func_append specialdeplibs " $pre_post_deps" ;; esac func_append pre_post_deps " $pre_post_dep" done fi pre_post_deps= fi deplibs= newdependency_libs= newlib_search_path= need_relink=no # whether we're linking any uninstalled libtool libraries notinst_deplibs= # not-installed libtool libraries notinst_path= # paths that contain not-installed libtool libraries case $linkmode in lib) passes="conv dlpreopen link" for file in $dlfiles $dlprefiles; do case $file in *.la) ;; *) func_fatal_help "libraries can \`-dlopen' only libtool libraries: $file" ;; esac done ;; prog) compile_deplibs= finalize_deplibs= alldeplibs=no newdlfiles= newdlprefiles= passes="conv scan dlopen dlpreopen link" ;; *) passes="conv" ;; esac for pass in $passes; do # The preopen pass in lib mode reverses $deplibs; put it back here # so that -L comes before libs that need it for instance... if test "$linkmode,$pass" = "lib,link"; then ## FIXME: Find the place where the list is rebuilt in the wrong ## order, and fix it there properly tmp_deplibs= for deplib in $deplibs; do tmp_deplibs="$deplib $tmp_deplibs" done deplibs="$tmp_deplibs" fi if test "$linkmode,$pass" = "lib,link" || test "$linkmode,$pass" = "prog,scan"; then libs="$deplibs" deplibs= fi if test "$linkmode" = prog; then case $pass in dlopen) libs="$dlfiles" ;; dlpreopen) libs="$dlprefiles" ;; link) libs="$deplibs %DEPLIBS% $dependency_libs" ;; esac fi if test "$linkmode,$pass" = "lib,dlpreopen"; then # Collect and forward deplibs of preopened libtool libs for lib in $dlprefiles; do # Ignore non-libtool-libs dependency_libs= func_resolve_sysroot "$lib" case $lib in *.la) func_source "$func_resolve_sysroot_result" ;; esac # Collect preopened libtool deplibs, except any this library # has declared as weak libs for deplib in $dependency_libs; do func_basename "$deplib" deplib_base=$func_basename_result case " $weak_libs " in *" $deplib_base "*) ;; *) func_append deplibs " $deplib" ;; esac done done libs="$dlprefiles" fi if test "$pass" = dlopen; then # Collect dlpreopened libraries save_deplibs="$deplibs" deplibs= fi for deplib in $libs; do lib= found=no case $deplib in -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe \ |-threads|-fopenmp|-openmp|-mp|-xopenmp|-omp|-qsmp=*) if test "$linkmode,$pass" = "prog,link"; then compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" else func_append compiler_flags " $deplib" if test "$linkmode" = lib ; then case "$new_inherited_linker_flags " in *" $deplib "*) ;; * ) func_append new_inherited_linker_flags " $deplib" ;; esac fi fi continue ;; -l*) if test "$linkmode" != lib && test "$linkmode" != prog; then func_warning "\`-l' is ignored for archives/objects" continue fi func_stripname '-l' '' "$deplib" name=$func_stripname_result if test "$linkmode" = lib; then searchdirs="$newlib_search_path $lib_search_path $compiler_lib_search_dirs $sys_lib_search_path $shlib_search_path" else searchdirs="$newlib_search_path $lib_search_path $sys_lib_search_path $shlib_search_path" fi for searchdir in $searchdirs; do for search_ext in .la $std_shrext .so .a; do # Search the libtool library lib="$searchdir/lib${name}${search_ext}" if test -f "$lib"; then if test "$search_ext" = ".la"; then found=yes else found=no fi break 2 fi done done if test "$found" != yes; then # deplib doesn't seem to be a libtool library if test "$linkmode,$pass" = "prog,link"; then compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" else deplibs="$deplib $deplibs" test "$linkmode" = lib && newdependency_libs="$deplib $newdependency_libs" fi continue else # deplib is a libtool library # If $allow_libtool_libs_with_static_runtimes && $deplib is a stdlib, # We need to do some special things here, and not later. if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then case " $predeps $postdeps " in *" $deplib "*) if func_lalib_p "$lib"; then library_names= old_library= func_source "$lib" for l in $old_library $library_names; do ll="$l" done if test "X$ll" = "X$old_library" ; then # only static version available found=no func_dirname "$lib" "" "." ladir="$func_dirname_result" lib=$ladir/$old_library if test "$linkmode,$pass" = "prog,link"; then compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" else deplibs="$deplib $deplibs" test "$linkmode" = lib && newdependency_libs="$deplib $newdependency_libs" fi continue fi fi ;; *) ;; esac fi fi ;; # -l *.ltframework) if test "$linkmode,$pass" = "prog,link"; then compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" else deplibs="$deplib $deplibs" if test "$linkmode" = lib ; then case "$new_inherited_linker_flags " in *" $deplib "*) ;; * ) func_append new_inherited_linker_flags " $deplib" ;; esac fi fi continue ;; -L*) case $linkmode in lib) deplibs="$deplib $deplibs" test "$pass" = conv && continue newdependency_libs="$deplib $newdependency_libs" func_stripname '-L' '' "$deplib" func_resolve_sysroot "$func_stripname_result" func_append newlib_search_path " $func_resolve_sysroot_result" ;; prog) if test "$pass" = conv; then deplibs="$deplib $deplibs" continue fi if test "$pass" = scan; then deplibs="$deplib $deplibs" else compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" fi func_stripname '-L' '' "$deplib" func_resolve_sysroot "$func_stripname_result" func_append newlib_search_path " $func_resolve_sysroot_result" ;; *) func_warning "\`-L' is ignored for archives/objects" ;; esac # linkmode continue ;; # -L -R*) if test "$pass" = link; then func_stripname '-R' '' "$deplib" func_resolve_sysroot "$func_stripname_result" dir=$func_resolve_sysroot_result # Make sure the xrpath contains only unique directories. case "$xrpath " in *" $dir "*) ;; *) func_append xrpath " $dir" ;; esac fi deplibs="$deplib $deplibs" continue ;; *.la) func_resolve_sysroot "$deplib" lib=$func_resolve_sysroot_result ;; *.$libext) if test "$pass" = conv; then deplibs="$deplib $deplibs" continue fi case $linkmode in lib) # Linking convenience modules into shared libraries is allowed, # but linking other static libraries is non-portable. case " $dlpreconveniencelibs " in *" $deplib "*) ;; *) valid_a_lib=no case $deplibs_check_method in match_pattern*) set dummy $deplibs_check_method; shift match_pattern_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"` if eval "\$ECHO \"$deplib\"" 2>/dev/null | $SED 10q \ | $EGREP "$match_pattern_regex" > /dev/null; then valid_a_lib=yes fi ;; pass_all) valid_a_lib=yes ;; esac if test "$valid_a_lib" != yes; then echo $ECHO "*** Warning: Trying to link with static lib archive $deplib." echo "*** I have the capability to make that library automatically link in when" echo "*** you link to this library. But I can only do this if you have a" echo "*** shared version of the library, which you do not appear to have" echo "*** because the file extensions .$libext of this argument makes me believe" echo "*** that it is just a static archive that I should not use here." else echo $ECHO "*** Warning: Linking the shared library $output against the" $ECHO "*** static library $deplib is not portable!" deplibs="$deplib $deplibs" fi ;; esac continue ;; prog) if test "$pass" != link; then deplibs="$deplib $deplibs" else compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" fi continue ;; esac # linkmode ;; # *.$libext *.lo | *.$objext) if test "$pass" = conv; then deplibs="$deplib $deplibs" elif test "$linkmode" = prog; then if test "$pass" = dlpreopen || test "$dlopen_support" != yes || test "$build_libtool_libs" = no; then # If there is no dlopen support or we're linking statically, # we need to preload. func_append newdlprefiles " $deplib" compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" else func_append newdlfiles " $deplib" fi fi continue ;; %DEPLIBS%) alldeplibs=yes continue ;; esac # case $deplib if test "$found" = yes || test -f "$lib"; then : else func_fatal_error "cannot find the library \`$lib' or unhandled argument \`$deplib'" fi # Check to see that this really is a libtool archive. func_lalib_unsafe_p "$lib" \ || func_fatal_error "\`$lib' is not a valid libtool archive" func_dirname "$lib" "" "." ladir="$func_dirname_result" dlname= dlopen= dlpreopen= libdir= library_names= old_library= inherited_linker_flags= # If the library was installed with an old release of libtool, # it will not redefine variables installed, or shouldnotlink installed=yes shouldnotlink=no avoidtemprpath= # Read the .la file func_source "$lib" # Convert "-framework foo" to "foo.ltframework" if test -n "$inherited_linker_flags"; then tmp_inherited_linker_flags=`$ECHO "$inherited_linker_flags" | $SED 's/-framework \([^ $]*\)/\1.ltframework/g'` for tmp_inherited_linker_flag in $tmp_inherited_linker_flags; do case " $new_inherited_linker_flags " in *" $tmp_inherited_linker_flag "*) ;; *) func_append new_inherited_linker_flags " $tmp_inherited_linker_flag";; esac done fi dependency_libs=`$ECHO " $dependency_libs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` if test "$linkmode,$pass" = "lib,link" || test "$linkmode,$pass" = "prog,scan" || { test "$linkmode" != prog && test "$linkmode" != lib; }; then test -n "$dlopen" && func_append dlfiles " $dlopen" test -n "$dlpreopen" && func_append dlprefiles " $dlpreopen" fi if test "$pass" = conv; then # Only check for convenience libraries deplibs="$lib $deplibs" if test -z "$libdir"; then if test -z "$old_library"; then func_fatal_error "cannot find name of link library for \`$lib'" fi # It is a libtool convenience library, so add in its objects. func_append convenience " $ladir/$objdir/$old_library" func_append old_convenience " $ladir/$objdir/$old_library" elif test "$linkmode" != prog && test "$linkmode" != lib; then func_fatal_error "\`$lib' is not a convenience library" fi tmp_libs= for deplib in $dependency_libs; do deplibs="$deplib $deplibs" if $opt_preserve_dup_deps ; then case "$tmp_libs " in *" $deplib "*) func_append specialdeplibs " $deplib" ;; esac fi func_append tmp_libs " $deplib" done continue fi # $pass = conv # Get the name of the library we link against. linklib= if test -n "$old_library" && { test "$prefer_static_libs" = yes || test "$prefer_static_libs,$installed" = "built,no"; }; then linklib=$old_library else for l in $old_library $library_names; do linklib="$l" done fi if test -z "$linklib"; then func_fatal_error "cannot find name of link library for \`$lib'" fi # This library was specified with -dlopen. if test "$pass" = dlopen; then if test -z "$libdir"; then func_fatal_error "cannot -dlopen a convenience library: \`$lib'" fi if test -z "$dlname" || test "$dlopen_support" != yes || test "$build_libtool_libs" = no; then # If there is no dlname, no dlopen support or we're linking # statically, we need to preload. We also need to preload any # dependent libraries so libltdl's deplib preloader doesn't # bomb out in the load deplibs phase. func_append dlprefiles " $lib $dependency_libs" else func_append newdlfiles " $lib" fi continue fi # $pass = dlopen # We need an absolute path. case $ladir in [\\/]* | [A-Za-z]:[\\/]*) abs_ladir="$ladir" ;; *) abs_ladir=`cd "$ladir" && pwd` if test -z "$abs_ladir"; then func_warning "cannot determine absolute directory name of \`$ladir'" func_warning "passing it literally to the linker, although it might fail" abs_ladir="$ladir" fi ;; esac func_basename "$lib" laname="$func_basename_result" # Find the relevant object directory and library name. if test "X$installed" = Xyes; then if test ! -f "$lt_sysroot$libdir/$linklib" && test -f "$abs_ladir/$linklib"; then func_warning "library \`$lib' was moved." dir="$ladir" absdir="$abs_ladir" libdir="$abs_ladir" else dir="$lt_sysroot$libdir" absdir="$lt_sysroot$libdir" fi test "X$hardcode_automatic" = Xyes && avoidtemprpath=yes else if test ! -f "$ladir/$objdir/$linklib" && test -f "$abs_ladir/$linklib"; then dir="$ladir" absdir="$abs_ladir" # Remove this search path later func_append notinst_path " $abs_ladir" else dir="$ladir/$objdir" absdir="$abs_ladir/$objdir" # Remove this search path later func_append notinst_path " $abs_ladir" fi fi # $installed = yes func_stripname 'lib' '.la' "$laname" name=$func_stripname_result # This library was specified with -dlpreopen. if test "$pass" = dlpreopen; then if test -z "$libdir" && test "$linkmode" = prog; then func_fatal_error "only libraries may -dlpreopen a convenience library: \`$lib'" fi case "$host" in # special handling for platforms with PE-DLLs. *cygwin* | *mingw* | *cegcc* ) # Linker will automatically link against shared library if both # static and shared are present. Therefore, ensure we extract # symbols from the import library if a shared library is present # (otherwise, the dlopen module name will be incorrect). We do # this by putting the import library name into $newdlprefiles. # We recover the dlopen module name by 'saving' the la file # name in a special purpose variable, and (later) extracting the # dlname from the la file. if test -n "$dlname"; then func_tr_sh "$dir/$linklib" eval "libfile_$func_tr_sh_result=\$abs_ladir/\$laname" func_append newdlprefiles " $dir/$linklib" else func_append newdlprefiles " $dir/$old_library" # Keep a list of preopened convenience libraries to check # that they are being used correctly in the link pass. test -z "$libdir" && \ func_append dlpreconveniencelibs " $dir/$old_library" fi ;; * ) # Prefer using a static library (so that no silly _DYNAMIC symbols # are required to link). if test -n "$old_library"; then func_append newdlprefiles " $dir/$old_library" # Keep a list of preopened convenience libraries to check # that they are being used correctly in the link pass. test -z "$libdir" && \ func_append dlpreconveniencelibs " $dir/$old_library" # Otherwise, use the dlname, so that lt_dlopen finds it. elif test -n "$dlname"; then func_append newdlprefiles " $dir/$dlname" else func_append newdlprefiles " $dir/$linklib" fi ;; esac fi # $pass = dlpreopen if test -z "$libdir"; then # Link the convenience library if test "$linkmode" = lib; then deplibs="$dir/$old_library $deplibs" elif test "$linkmode,$pass" = "prog,link"; then compile_deplibs="$dir/$old_library $compile_deplibs" finalize_deplibs="$dir/$old_library $finalize_deplibs" else deplibs="$lib $deplibs" # used for prog,scan pass fi continue fi if test "$linkmode" = prog && test "$pass" != link; then func_append newlib_search_path " $ladir" deplibs="$lib $deplibs" linkalldeplibs=no if test "$link_all_deplibs" != no || test -z "$library_names" || test "$build_libtool_libs" = no; then linkalldeplibs=yes fi tmp_libs= for deplib in $dependency_libs; do case $deplib in -L*) func_stripname '-L' '' "$deplib" func_resolve_sysroot "$func_stripname_result" func_append newlib_search_path " $func_resolve_sysroot_result" ;; esac # Need to link against all dependency_libs? if test "$linkalldeplibs" = yes; then deplibs="$deplib $deplibs" else # Need to hardcode shared library paths # or/and link against static libraries newdependency_libs="$deplib $newdependency_libs" fi if $opt_preserve_dup_deps ; then case "$tmp_libs " in *" $deplib "*) func_append specialdeplibs " $deplib" ;; esac fi func_append tmp_libs " $deplib" done # for deplib continue fi # $linkmode = prog... if test "$linkmode,$pass" = "prog,link"; then if test -n "$library_names" && { { test "$prefer_static_libs" = no || test "$prefer_static_libs,$installed" = "built,yes"; } || test -z "$old_library"; }; then # We need to hardcode the library path if test -n "$shlibpath_var" && test -z "$avoidtemprpath" ; then # Make sure the rpath contains only unique directories. case "$temp_rpath:" in *"$absdir:"*) ;; *) func_append temp_rpath "$absdir:" ;; esac fi # Hardcode the library path. # Skip directories that are in the system default run-time # search path. case " $sys_lib_dlsearch_path " in *" $absdir "*) ;; *) case "$compile_rpath " in *" $absdir "*) ;; *) func_append compile_rpath " $absdir" ;; esac ;; esac case " $sys_lib_dlsearch_path " in *" $libdir "*) ;; *) case "$finalize_rpath " in *" $libdir "*) ;; *) func_append finalize_rpath " $libdir" ;; esac ;; esac fi # $linkmode,$pass = prog,link... if test "$alldeplibs" = yes && { test "$deplibs_check_method" = pass_all || { test "$build_libtool_libs" = yes && test -n "$library_names"; }; }; then # We only need to search for static libraries continue fi fi link_static=no # Whether the deplib will be linked statically use_static_libs=$prefer_static_libs if test "$use_static_libs" = built && test "$installed" = yes; then use_static_libs=no fi if test -n "$library_names" && { test "$use_static_libs" = no || test -z "$old_library"; }; then case $host in *cygwin* | *mingw* | *cegcc*) # No point in relinking DLLs because paths are not encoded func_append notinst_deplibs " $lib" need_relink=no ;; *) if test "$installed" = no; then func_append notinst_deplibs " $lib" need_relink=yes fi ;; esac # This is a shared library # Warn about portability, can't link against -module's on some # systems (darwin). Don't bleat about dlopened modules though! dlopenmodule="" for dlpremoduletest in $dlprefiles; do if test "X$dlpremoduletest" = "X$lib"; then dlopenmodule="$dlpremoduletest" break fi done if test -z "$dlopenmodule" && test "$shouldnotlink" = yes && test "$pass" = link; then echo if test "$linkmode" = prog; then $ECHO "*** Warning: Linking the executable $output against the loadable module" else $ECHO "*** Warning: Linking the shared library $output against the loadable module" fi $ECHO "*** $linklib is not portable!" fi if test "$linkmode" = lib && test "$hardcode_into_libs" = yes; then # Hardcode the library path. # Skip directories that are in the system default run-time # search path. case " $sys_lib_dlsearch_path " in *" $absdir "*) ;; *) case "$compile_rpath " in *" $absdir "*) ;; *) func_append compile_rpath " $absdir" ;; esac ;; esac case " $sys_lib_dlsearch_path " in *" $libdir "*) ;; *) case "$finalize_rpath " in *" $libdir "*) ;; *) func_append finalize_rpath " $libdir" ;; esac ;; esac fi if test -n "$old_archive_from_expsyms_cmds"; then # figure out the soname set dummy $library_names shift realname="$1" shift libname=`eval "\\$ECHO \"$libname_spec\""` # use dlname if we got it. it's perfectly good, no? if test -n "$dlname"; then soname="$dlname" elif test -n "$soname_spec"; then # bleh windows case $host in *cygwin* | mingw* | *cegcc*) func_arith $current - $age major=$func_arith_result versuffix="-$major" ;; esac eval soname=\"$soname_spec\" else soname="$realname" fi # Make a new name for the extract_expsyms_cmds to use soroot="$soname" func_basename "$soroot" soname="$func_basename_result" func_stripname 'lib' '.dll' "$soname" newlib=libimp-$func_stripname_result.a # If the library has no export list, then create one now if test -f "$output_objdir/$soname-def"; then : else func_verbose "extracting exported symbol list from \`$soname'" func_execute_cmds "$extract_expsyms_cmds" 'exit $?' fi # Create $newlib if test -f "$output_objdir/$newlib"; then :; else func_verbose "generating import library for \`$soname'" func_execute_cmds "$old_archive_from_expsyms_cmds" 'exit $?' fi # make sure the library variables are pointing to the new library dir=$output_objdir linklib=$newlib fi # test -n "$old_archive_from_expsyms_cmds" if test "$linkmode" = prog || test "$opt_mode" != relink; then add_shlibpath= add_dir= add= lib_linked=yes case $hardcode_action in immediate | unsupported) if test "$hardcode_direct" = no; then add="$dir/$linklib" case $host in *-*-sco3.2v5.0.[024]*) add_dir="-L$dir" ;; *-*-sysv4*uw2*) add_dir="-L$dir" ;; *-*-sysv5OpenUNIX* | *-*-sysv5UnixWare7.[01].[10]* | \ *-*-unixware7*) add_dir="-L$dir" ;; *-*-darwin* ) # if the lib is a (non-dlopened) module then we can not # link against it, someone is ignoring the earlier warnings if /usr/bin/file -L $add 2> /dev/null | $GREP ": [^:]* bundle" >/dev/null ; then if test "X$dlopenmodule" != "X$lib"; then $ECHO "*** Warning: lib $linklib is a module, not a shared library" if test -z "$old_library" ; then echo echo "*** And there doesn't seem to be a static archive available" echo "*** The link will probably fail, sorry" else add="$dir/$old_library" fi elif test -n "$old_library"; then add="$dir/$old_library" fi fi esac elif test "$hardcode_minus_L" = no; then case $host in *-*-sunos*) add_shlibpath="$dir" ;; esac add_dir="-L$dir" add="-l$name" elif test "$hardcode_shlibpath_var" = no; then add_shlibpath="$dir" add="-l$name" else lib_linked=no fi ;; relink) if test "$hardcode_direct" = yes && test "$hardcode_direct_absolute" = no; then add="$dir/$linklib" elif test "$hardcode_minus_L" = yes; then add_dir="-L$absdir" # Try looking first in the location we're being installed to. if test -n "$inst_prefix_dir"; then case $libdir in [\\/]*) func_append add_dir " -L$inst_prefix_dir$libdir" ;; esac fi add="-l$name" elif test "$hardcode_shlibpath_var" = yes; then add_shlibpath="$dir" add="-l$name" else lib_linked=no fi ;; *) lib_linked=no ;; esac if test "$lib_linked" != yes; then func_fatal_configuration "unsupported hardcode properties" fi if test -n "$add_shlibpath"; then case :$compile_shlibpath: in *":$add_shlibpath:"*) ;; *) func_append compile_shlibpath "$add_shlibpath:" ;; esac fi if test "$linkmode" = prog; then test -n "$add_dir" && compile_deplibs="$add_dir $compile_deplibs" test -n "$add" && compile_deplibs="$add $compile_deplibs" else test -n "$add_dir" && deplibs="$add_dir $deplibs" test -n "$add" && deplibs="$add $deplibs" if test "$hardcode_direct" != yes && test "$hardcode_minus_L" != yes && test "$hardcode_shlibpath_var" = yes; then case :$finalize_shlibpath: in *":$libdir:"*) ;; *) func_append finalize_shlibpath "$libdir:" ;; esac fi fi fi if test "$linkmode" = prog || test "$opt_mode" = relink; then add_shlibpath= add_dir= add= # Finalize command for both is simple: just hardcode it. if test "$hardcode_direct" = yes && test "$hardcode_direct_absolute" = no; then add="$libdir/$linklib" elif test "$hardcode_minus_L" = yes; then add_dir="-L$libdir" add="-l$name" elif test "$hardcode_shlibpath_var" = yes; then case :$finalize_shlibpath: in *":$libdir:"*) ;; *) func_append finalize_shlibpath "$libdir:" ;; esac add="-l$name" elif test "$hardcode_automatic" = yes; then if test -n "$inst_prefix_dir" && test -f "$inst_prefix_dir$libdir/$linklib" ; then add="$inst_prefix_dir$libdir/$linklib" else add="$libdir/$linklib" fi else # We cannot seem to hardcode it, guess we'll fake it. add_dir="-L$libdir" # Try looking first in the location we're being installed to. if test -n "$inst_prefix_dir"; then case $libdir in [\\/]*) func_append add_dir " -L$inst_prefix_dir$libdir" ;; esac fi add="-l$name" fi if test "$linkmode" = prog; then test -n "$add_dir" && finalize_deplibs="$add_dir $finalize_deplibs" test -n "$add" && finalize_deplibs="$add $finalize_deplibs" else test -n "$add_dir" && deplibs="$add_dir $deplibs" test -n "$add" && deplibs="$add $deplibs" fi fi elif test "$linkmode" = prog; then # Here we assume that one of hardcode_direct or hardcode_minus_L # is not unsupported. This is valid on all known static and # shared platforms. if test "$hardcode_direct" != unsupported; then test -n "$old_library" && linklib="$old_library" compile_deplibs="$dir/$linklib $compile_deplibs" finalize_deplibs="$dir/$linklib $finalize_deplibs" else compile_deplibs="-l$name -L$dir $compile_deplibs" finalize_deplibs="-l$name -L$dir $finalize_deplibs" fi elif test "$build_libtool_libs" = yes; then # Not a shared library if test "$deplibs_check_method" != pass_all; then # We're trying link a shared library against a static one # but the system doesn't support it. # Just print a warning and add the library to dependency_libs so # that the program can be linked against the static library. echo $ECHO "*** Warning: This system can not link to static lib archive $lib." echo "*** I have the capability to make that library automatically link in when" echo "*** you link to this library. But I can only do this if you have a" echo "*** shared version of the library, which you do not appear to have." if test "$module" = yes; then echo "*** But as you try to build a module library, libtool will still create " echo "*** a static module, that should work as long as the dlopening application" echo "*** is linked with the -dlopen flag to resolve symbols at runtime." if test -z "$global_symbol_pipe"; then echo echo "*** However, this would only work if libtool was able to extract symbol" echo "*** lists from a program, using \`nm' or equivalent, but libtool could" echo "*** not find such a program. So, this module is probably useless." echo "*** \`nm' from GNU binutils and a full rebuild may help." fi if test "$build_old_libs" = no; then build_libtool_libs=module build_old_libs=yes else build_libtool_libs=no fi fi else deplibs="$dir/$old_library $deplibs" link_static=yes fi fi # link shared/static library? if test "$linkmode" = lib; then if test -n "$dependency_libs" && { test "$hardcode_into_libs" != yes || test "$build_old_libs" = yes || test "$link_static" = yes; }; then # Extract -R from dependency_libs temp_deplibs= for libdir in $dependency_libs; do case $libdir in -R*) func_stripname '-R' '' "$libdir" temp_xrpath=$func_stripname_result case " $xrpath " in *" $temp_xrpath "*) ;; *) func_append xrpath " $temp_xrpath";; esac;; *) func_append temp_deplibs " $libdir";; esac done dependency_libs="$temp_deplibs" fi func_append newlib_search_path " $absdir" # Link against this library test "$link_static" = no && newdependency_libs="$abs_ladir/$laname $newdependency_libs" # ... and its dependency_libs tmp_libs= for deplib in $dependency_libs; do newdependency_libs="$deplib $newdependency_libs" case $deplib in -L*) func_stripname '-L' '' "$deplib" func_resolve_sysroot "$func_stripname_result";; *) func_resolve_sysroot "$deplib" ;; esac if $opt_preserve_dup_deps ; then case "$tmp_libs " in *" $func_resolve_sysroot_result "*) func_append specialdeplibs " $func_resolve_sysroot_result" ;; esac fi func_append tmp_libs " $func_resolve_sysroot_result" done if test "$link_all_deplibs" != no; then # Add the search paths of all dependency libraries for deplib in $dependency_libs; do path= case $deplib in -L*) path="$deplib" ;; *.la) func_resolve_sysroot "$deplib" deplib=$func_resolve_sysroot_result func_dirname "$deplib" "" "." dir=$func_dirname_result # We need an absolute path. case $dir in [\\/]* | [A-Za-z]:[\\/]*) absdir="$dir" ;; *) absdir=`cd "$dir" && pwd` if test -z "$absdir"; then func_warning "cannot determine absolute directory name of \`$dir'" absdir="$dir" fi ;; esac if $GREP "^installed=no" $deplib > /dev/null; then case $host in *-*-darwin*) depdepl= eval deplibrary_names=`${SED} -n -e 's/^library_names=\(.*\)$/\1/p' $deplib` if test -n "$deplibrary_names" ; then for tmp in $deplibrary_names ; do depdepl=$tmp done if test -f "$absdir/$objdir/$depdepl" ; then depdepl="$absdir/$objdir/$depdepl" darwin_install_name=`${OTOOL} -L $depdepl | awk '{if (NR == 2) {print $1;exit}}'` if test -z "$darwin_install_name"; then darwin_install_name=`${OTOOL64} -L $depdepl | awk '{if (NR == 2) {print $1;exit}}'` fi func_append compiler_flags " ${wl}-dylib_file ${wl}${darwin_install_name}:${depdepl}" func_append linker_flags " -dylib_file ${darwin_install_name}:${depdepl}" path= fi fi ;; *) path="-L$absdir/$objdir" ;; esac else eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $deplib` test -z "$libdir" && \ func_fatal_error "\`$deplib' is not a valid libtool archive" test "$absdir" != "$libdir" && \ func_warning "\`$deplib' seems to be moved" path="-L$absdir" fi ;; esac case " $deplibs " in *" $path "*) ;; *) deplibs="$path $deplibs" ;; esac done fi # link_all_deplibs != no fi # linkmode = lib done # for deplib in $libs if test "$pass" = link; then if test "$linkmode" = "prog"; then compile_deplibs="$new_inherited_linker_flags $compile_deplibs" finalize_deplibs="$new_inherited_linker_flags $finalize_deplibs" else compiler_flags="$compiler_flags "`$ECHO " $new_inherited_linker_flags" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` fi fi dependency_libs="$newdependency_libs" if test "$pass" = dlpreopen; then # Link the dlpreopened libraries before other libraries for deplib in $save_deplibs; do deplibs="$deplib $deplibs" done fi if test "$pass" != dlopen; then if test "$pass" != conv; then # Make sure lib_search_path contains only unique directories. lib_search_path= for dir in $newlib_search_path; do case "$lib_search_path " in *" $dir "*) ;; *) func_append lib_search_path " $dir" ;; esac done newlib_search_path= fi if test "$linkmode,$pass" != "prog,link"; then vars="deplibs" else vars="compile_deplibs finalize_deplibs" fi for var in $vars dependency_libs; do # Add libraries to $var in reverse order eval tmp_libs=\"\$$var\" new_libs= for deplib in $tmp_libs; do # FIXME: Pedantically, this is the right thing to do, so # that some nasty dependency loop isn't accidentally # broken: #new_libs="$deplib $new_libs" # Pragmatically, this seems to cause very few problems in # practice: case $deplib in -L*) new_libs="$deplib $new_libs" ;; -R*) ;; *) # And here is the reason: when a library appears more # than once as an explicit dependence of a library, or # is implicitly linked in more than once by the # compiler, it is considered special, and multiple # occurrences thereof are not removed. Compare this # with having the same library being listed as a # dependency of multiple other libraries: in this case, # we know (pedantically, we assume) the library does not # need to be listed more than once, so we keep only the # last copy. This is not always right, but it is rare # enough that we require users that really mean to play # such unportable linking tricks to link the library # using -Wl,-lname, so that libtool does not consider it # for duplicate removal. case " $specialdeplibs " in *" $deplib "*) new_libs="$deplib $new_libs" ;; *) case " $new_libs " in *" $deplib "*) ;; *) new_libs="$deplib $new_libs" ;; esac ;; esac ;; esac done tmp_libs= for deplib in $new_libs; do case $deplib in -L*) case " $tmp_libs " in *" $deplib "*) ;; *) func_append tmp_libs " $deplib" ;; esac ;; *) func_append tmp_libs " $deplib" ;; esac done eval $var=\"$tmp_libs\" done # for var fi # Last step: remove runtime libs from dependency_libs # (they stay in deplibs) tmp_libs= for i in $dependency_libs ; do case " $predeps $postdeps $compiler_lib_search_path " in *" $i "*) i="" ;; esac if test -n "$i" ; then func_append tmp_libs " $i" fi done dependency_libs=$tmp_libs done # for pass if test "$linkmode" = prog; then dlfiles="$newdlfiles" fi if test "$linkmode" = prog || test "$linkmode" = lib; then dlprefiles="$newdlprefiles" fi case $linkmode in oldlib) if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then func_warning "\`-dlopen' is ignored for archives" fi case " $deplibs" in *\ -l* | *\ -L*) func_warning "\`-l' and \`-L' are ignored for archives" ;; esac test -n "$rpath" && \ func_warning "\`-rpath' is ignored for archives" test -n "$xrpath" && \ func_warning "\`-R' is ignored for archives" test -n "$vinfo" && \ func_warning "\`-version-info/-version-number' is ignored for archives" test -n "$release" && \ func_warning "\`-release' is ignored for archives" test -n "$export_symbols$export_symbols_regex" && \ func_warning "\`-export-symbols' is ignored for archives" # Now set the variables for building old libraries. build_libtool_libs=no oldlibs="$output" func_append objs "$old_deplibs" ;; lib) # Make sure we only generate libraries of the form `libNAME.la'. case $outputname in lib*) func_stripname 'lib' '.la' "$outputname" name=$func_stripname_result eval shared_ext=\"$shrext_cmds\" eval libname=\"$libname_spec\" ;; *) test "$module" = no && \ func_fatal_help "libtool library \`$output' must begin with \`lib'" if test "$need_lib_prefix" != no; then # Add the "lib" prefix for modules if required func_stripname '' '.la' "$outputname" name=$func_stripname_result eval shared_ext=\"$shrext_cmds\" eval libname=\"$libname_spec\" else func_stripname '' '.la' "$outputname" libname=$func_stripname_result fi ;; esac if test -n "$objs"; then if test "$deplibs_check_method" != pass_all; then func_fatal_error "cannot build libtool library \`$output' from non-libtool objects on this host:$objs" else echo $ECHO "*** Warning: Linking the shared library $output against the non-libtool" $ECHO "*** objects $objs is not portable!" func_append libobjs " $objs" fi fi test "$dlself" != no && \ func_warning "\`-dlopen self' is ignored for libtool libraries" set dummy $rpath shift test "$#" -gt 1 && \ func_warning "ignoring multiple \`-rpath's for a libtool library" install_libdir="$1" oldlibs= if test -z "$rpath"; then if test "$build_libtool_libs" = yes; then # Building a libtool convenience library. # Some compilers have problems with a `.al' extension so # convenience libraries should have the same extension an # archive normally would. oldlibs="$output_objdir/$libname.$libext $oldlibs" build_libtool_libs=convenience build_old_libs=yes fi test -n "$vinfo" && \ func_warning "\`-version-info/-version-number' is ignored for convenience libraries" test -n "$release" && \ func_warning "\`-release' is ignored for convenience libraries" else # Parse the version information argument. save_ifs="$IFS"; IFS=':' set dummy $vinfo 0 0 0 shift IFS="$save_ifs" test -n "$7" && \ func_fatal_help "too many parameters to \`-version-info'" # convert absolute version numbers to libtool ages # this retains compatibility with .la files and attempts # to make the code below a bit more comprehensible case $vinfo_number in yes) number_major="$1" number_minor="$2" number_revision="$3" # # There are really only two kinds -- those that # use the current revision as the major version # and those that subtract age and use age as # a minor version. But, then there is irix # which has an extra 1 added just for fun # case $version_type in # correct linux to gnu/linux during the next big refactor darwin|linux|osf|windows|none) func_arith $number_major + $number_minor current=$func_arith_result age="$number_minor" revision="$number_revision" ;; freebsd-aout|freebsd-elf|qnx|sunos) current="$number_major" revision="$number_minor" age="0" ;; irix|nonstopux) func_arith $number_major + $number_minor current=$func_arith_result age="$number_minor" revision="$number_minor" lt_irix_increment=no ;; esac ;; no) current="$1" revision="$2" age="$3" ;; esac # Check that each of the things are valid numbers. case $current in 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;; *) func_error "CURRENT \`$current' must be a nonnegative integer" func_fatal_error "\`$vinfo' is not valid version information" ;; esac case $revision in 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;; *) func_error "REVISION \`$revision' must be a nonnegative integer" func_fatal_error "\`$vinfo' is not valid version information" ;; esac case $age in 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;; *) func_error "AGE \`$age' must be a nonnegative integer" func_fatal_error "\`$vinfo' is not valid version information" ;; esac if test "$age" -gt "$current"; then func_error "AGE \`$age' is greater than the current interface number \`$current'" func_fatal_error "\`$vinfo' is not valid version information" fi # Calculate the version variables. major= versuffix= verstring= case $version_type in none) ;; darwin) # Like Linux, but with the current version available in # verstring for coding it into the library header func_arith $current - $age major=.$func_arith_result versuffix="$major.$age.$revision" # Darwin ld doesn't like 0 for these options... func_arith $current + 1 minor_current=$func_arith_result xlcverstring="${wl}-compatibility_version ${wl}$minor_current ${wl}-current_version ${wl}$minor_current.$revision" verstring="-compatibility_version $minor_current -current_version $minor_current.$revision" ;; freebsd-aout) major=".$current" versuffix=".$current.$revision"; ;; freebsd-elf) major=".$current" versuffix=".$current" ;; irix | nonstopux) if test "X$lt_irix_increment" = "Xno"; then func_arith $current - $age else func_arith $current - $age + 1 fi major=$func_arith_result case $version_type in nonstopux) verstring_prefix=nonstopux ;; *) verstring_prefix=sgi ;; esac verstring="$verstring_prefix$major.$revision" # Add in all the interfaces that we are compatible with. loop=$revision while test "$loop" -ne 0; do func_arith $revision - $loop iface=$func_arith_result func_arith $loop - 1 loop=$func_arith_result verstring="$verstring_prefix$major.$iface:$verstring" done # Before this point, $major must not contain `.'. major=.$major versuffix="$major.$revision" ;; linux) # correct to gnu/linux during the next big refactor func_arith $current - $age major=.$func_arith_result versuffix="$major.$age.$revision" ;; osf) func_arith $current - $age major=.$func_arith_result versuffix=".$current.$age.$revision" verstring="$current.$age.$revision" # Add in all the interfaces that we are compatible with. loop=$age while test "$loop" -ne 0; do func_arith $current - $loop iface=$func_arith_result func_arith $loop - 1 loop=$func_arith_result verstring="$verstring:${iface}.0" done # Make executables depend on our current version. func_append verstring ":${current}.0" ;; qnx) major=".$current" versuffix=".$current" ;; sunos) major=".$current" versuffix=".$current.$revision" ;; windows) # Use '-' rather than '.', since we only want one # extension on DOS 8.3 filesystems. func_arith $current - $age major=$func_arith_result versuffix="-$major" ;; *) func_fatal_configuration "unknown library version type \`$version_type'" ;; esac # Clear the version info if we defaulted, and they specified a release. if test -z "$vinfo" && test -n "$release"; then major= case $version_type in darwin) # we can't check for "0.0" in archive_cmds due to quoting # problems, so we reset it completely verstring= ;; *) verstring="0.0" ;; esac if test "$need_version" = no; then versuffix= else versuffix=".0.0" fi fi # Remove version info from name if versioning should be avoided if test "$avoid_version" = yes && test "$need_version" = no; then major= versuffix= verstring="" fi # Check to see if the archive will have undefined symbols. if test "$allow_undefined" = yes; then if test "$allow_undefined_flag" = unsupported; then func_warning "undefined symbols not allowed in $host shared libraries" build_libtool_libs=no build_old_libs=yes fi else # Don't allow undefined symbols. allow_undefined_flag="$no_undefined_flag" fi fi func_generate_dlsyms "$libname" "$libname" "yes" func_append libobjs " $symfileobj" test "X$libobjs" = "X " && libobjs= if test "$opt_mode" != relink; then # Remove our outputs, but don't remove object files since they # may have been created when compiling PIC objects. removelist= tempremovelist=`$ECHO "$output_objdir/*"` for p in $tempremovelist; do case $p in *.$objext | *.gcno) ;; $output_objdir/$outputname | $output_objdir/$libname.* | $output_objdir/${libname}${release}.*) if test "X$precious_files_regex" != "X"; then if $ECHO "$p" | $EGREP -e "$precious_files_regex" >/dev/null 2>&1 then continue fi fi func_append removelist " $p" ;; *) ;; esac done test -n "$removelist" && \ func_show_eval "${RM}r \$removelist" fi # Now set the variables for building old libraries. if test "$build_old_libs" = yes && test "$build_libtool_libs" != convenience ; then func_append oldlibs " $output_objdir/$libname.$libext" # Transform .lo files to .o files. oldobjs="$objs "`$ECHO "$libobjs" | $SP2NL | $SED "/\.${libext}$/d; $lo2o" | $NL2SP` fi # Eliminate all temporary directories. #for path in $notinst_path; do # lib_search_path=`$ECHO "$lib_search_path " | $SED "s% $path % %g"` # deplibs=`$ECHO "$deplibs " | $SED "s% -L$path % %g"` # dependency_libs=`$ECHO "$dependency_libs " | $SED "s% -L$path % %g"` #done if test -n "$xrpath"; then # If the user specified any rpath flags, then add them. temp_xrpath= for libdir in $xrpath; do func_replace_sysroot "$libdir" func_append temp_xrpath " -R$func_replace_sysroot_result" case "$finalize_rpath " in *" $libdir "*) ;; *) func_append finalize_rpath " $libdir" ;; esac done if test "$hardcode_into_libs" != yes || test "$build_old_libs" = yes; then dependency_libs="$temp_xrpath $dependency_libs" fi fi # Make sure dlfiles contains only unique files that won't be dlpreopened old_dlfiles="$dlfiles" dlfiles= for lib in $old_dlfiles; do case " $dlprefiles $dlfiles " in *" $lib "*) ;; *) func_append dlfiles " $lib" ;; esac done # Make sure dlprefiles contains only unique files old_dlprefiles="$dlprefiles" dlprefiles= for lib in $old_dlprefiles; do case "$dlprefiles " in *" $lib "*) ;; *) func_append dlprefiles " $lib" ;; esac done if test "$build_libtool_libs" = yes; then if test -n "$rpath"; then case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-beos* | *-cegcc* | *-*-haiku*) # these systems don't actually have a c library (as such)! ;; *-*-rhapsody* | *-*-darwin1.[012]) # Rhapsody C library is in the System framework func_append deplibs " System.ltframework" ;; *-*-netbsd*) # Don't link with libc until the a.out ld.so is fixed. ;; *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*) # Do not include libc due to us having libc/libc_r. ;; *-*-sco3.2v5* | *-*-sco5v6*) # Causes problems with __ctype ;; *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*) # Compiler inserts libc in the correct place for threads to work ;; *) # Add libc to deplibs on all other systems if necessary. if test "$build_libtool_need_lc" = "yes"; then func_append deplibs " -lc" fi ;; esac fi # Transform deplibs into only deplibs that can be linked in shared. name_save=$name libname_save=$libname release_save=$release versuffix_save=$versuffix major_save=$major # I'm not sure if I'm treating the release correctly. I think # release should show up in the -l (ie -lgmp5) so we don't want to # add it in twice. Is that correct? release="" versuffix="" major="" newdeplibs= droppeddeps=no case $deplibs_check_method in pass_all) # Don't check for shared/static. Everything works. # This might be a little naive. We might want to check # whether the library exists or not. But this is on # osf3 & osf4 and I'm not really sure... Just # implementing what was already the behavior. newdeplibs=$deplibs ;; test_compile) # This code stresses the "libraries are programs" paradigm to its # limits. Maybe even breaks it. We compile a program, linking it # against the deplibs as a proxy for the library. Then we can check # whether they linked in statically or dynamically with ldd. $opt_dry_run || $RM conftest.c cat > conftest.c </dev/null` $nocaseglob else potential_libs=`ls $i/$libnameglob[.-]* 2>/dev/null` fi for potent_lib in $potential_libs; do # Follow soft links. if ls -lLd "$potent_lib" 2>/dev/null | $GREP " -> " >/dev/null; then continue fi # The statement above tries to avoid entering an # endless loop below, in case of cyclic links. # We might still enter an endless loop, since a link # loop can be closed while we follow links, # but so what? potlib="$potent_lib" while test -h "$potlib" 2>/dev/null; do potliblink=`ls -ld $potlib | ${SED} 's/.* -> //'` case $potliblink in [\\/]* | [A-Za-z]:[\\/]*) potlib="$potliblink";; *) potlib=`$ECHO "$potlib" | $SED 's,[^/]*$,,'`"$potliblink";; esac done if eval $file_magic_cmd \"\$potlib\" 2>/dev/null | $SED -e 10q | $EGREP "$file_magic_regex" > /dev/null; then func_append newdeplibs " $a_deplib" a_deplib="" break 2 fi done done fi if test -n "$a_deplib" ; then droppeddeps=yes echo $ECHO "*** Warning: linker path does not have real file for library $a_deplib." echo "*** I have the capability to make that library automatically link in when" echo "*** you link to this library. But I can only do this if you have a" echo "*** shared version of the library, which you do not appear to have" echo "*** because I did check the linker path looking for a file starting" if test -z "$potlib" ; then $ECHO "*** with $libname but no candidates were found. (...for file magic test)" else $ECHO "*** with $libname and none of the candidates passed a file format test" $ECHO "*** using a file magic. Last file checked: $potlib" fi fi ;; *) # Add a -L argument. func_append newdeplibs " $a_deplib" ;; esac done # Gone through all deplibs. ;; match_pattern*) set dummy $deplibs_check_method; shift match_pattern_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"` for a_deplib in $deplibs; do case $a_deplib in -l*) func_stripname -l '' "$a_deplib" name=$func_stripname_result if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then case " $predeps $postdeps " in *" $a_deplib "*) func_append newdeplibs " $a_deplib" a_deplib="" ;; esac fi if test -n "$a_deplib" ; then libname=`eval "\\$ECHO \"$libname_spec\""` for i in $lib_search_path $sys_lib_search_path $shlib_search_path; do potential_libs=`ls $i/$libname[.-]* 2>/dev/null` for potent_lib in $potential_libs; do potlib="$potent_lib" # see symlink-check above in file_magic test if eval "\$ECHO \"$potent_lib\"" 2>/dev/null | $SED 10q | \ $EGREP "$match_pattern_regex" > /dev/null; then func_append newdeplibs " $a_deplib" a_deplib="" break 2 fi done done fi if test -n "$a_deplib" ; then droppeddeps=yes echo $ECHO "*** Warning: linker path does not have real file for library $a_deplib." echo "*** I have the capability to make that library automatically link in when" echo "*** you link to this library. But I can only do this if you have a" echo "*** shared version of the library, which you do not appear to have" echo "*** because I did check the linker path looking for a file starting" if test -z "$potlib" ; then $ECHO "*** with $libname but no candidates were found. (...for regex pattern test)" else $ECHO "*** with $libname and none of the candidates passed a file format test" $ECHO "*** using a regex pattern. Last file checked: $potlib" fi fi ;; *) # Add a -L argument. func_append newdeplibs " $a_deplib" ;; esac done # Gone through all deplibs. ;; none | unknown | *) newdeplibs="" tmp_deplibs=`$ECHO " $deplibs" | $SED 's/ -lc$//; s/ -[LR][^ ]*//g'` if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then for i in $predeps $postdeps ; do # can't use Xsed below, because $i might contain '/' tmp_deplibs=`$ECHO " $tmp_deplibs" | $SED "s,$i,,"` done fi case $tmp_deplibs in *[!\ \ ]*) echo if test "X$deplibs_check_method" = "Xnone"; then echo "*** Warning: inter-library dependencies are not supported in this platform." else echo "*** Warning: inter-library dependencies are not known to be supported." fi echo "*** All declared inter-library dependencies are being dropped." droppeddeps=yes ;; esac ;; esac versuffix=$versuffix_save major=$major_save release=$release_save libname=$libname_save name=$name_save case $host in *-*-rhapsody* | *-*-darwin1.[012]) # On Rhapsody replace the C library with the System framework newdeplibs=`$ECHO " $newdeplibs" | $SED 's/ -lc / System.ltframework /'` ;; esac if test "$droppeddeps" = yes; then if test "$module" = yes; then echo echo "*** Warning: libtool could not satisfy all declared inter-library" $ECHO "*** dependencies of module $libname. Therefore, libtool will create" echo "*** a static module, that should work as long as the dlopening" echo "*** application is linked with the -dlopen flag." if test -z "$global_symbol_pipe"; then echo echo "*** However, this would only work if libtool was able to extract symbol" echo "*** lists from a program, using \`nm' or equivalent, but libtool could" echo "*** not find such a program. So, this module is probably useless." echo "*** \`nm' from GNU binutils and a full rebuild may help." fi if test "$build_old_libs" = no; then oldlibs="$output_objdir/$libname.$libext" build_libtool_libs=module build_old_libs=yes else build_libtool_libs=no fi else echo "*** The inter-library dependencies that have been dropped here will be" echo "*** automatically added whenever a program is linked with this library" echo "*** or is declared to -dlopen it." if test "$allow_undefined" = no; then echo echo "*** Since this library must not contain undefined symbols," echo "*** because either the platform does not support them or" echo "*** it was explicitly requested with -no-undefined," echo "*** libtool will only create a static version of it." if test "$build_old_libs" = no; then oldlibs="$output_objdir/$libname.$libext" build_libtool_libs=module build_old_libs=yes else build_libtool_libs=no fi fi fi fi # Done checking deplibs! deplibs=$newdeplibs fi # Time to change all our "foo.ltframework" stuff back to "-framework foo" case $host in *-*-darwin*) newdeplibs=`$ECHO " $newdeplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` new_inherited_linker_flags=`$ECHO " $new_inherited_linker_flags" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` deplibs=`$ECHO " $deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` ;; esac # move library search paths that coincide with paths to not yet # installed libraries to the beginning of the library search list new_libs= for path in $notinst_path; do case " $new_libs " in *" -L$path/$objdir "*) ;; *) case " $deplibs " in *" -L$path/$objdir "*) func_append new_libs " -L$path/$objdir" ;; esac ;; esac done for deplib in $deplibs; do case $deplib in -L*) case " $new_libs " in *" $deplib "*) ;; *) func_append new_libs " $deplib" ;; esac ;; *) func_append new_libs " $deplib" ;; esac done deplibs="$new_libs" # All the library-specific variables (install_libdir is set above). library_names= old_library= dlname= # Test again, we may have decided not to build it any more if test "$build_libtool_libs" = yes; then # Remove ${wl} instances when linking with ld. # FIXME: should test the right _cmds variable. case $archive_cmds in *\$LD\ *) wl= ;; esac if test "$hardcode_into_libs" = yes; then # Hardcode the library paths hardcode_libdirs= dep_rpath= rpath="$finalize_rpath" test "$opt_mode" != relink && rpath="$compile_rpath$rpath" for libdir in $rpath; do if test -n "$hardcode_libdir_flag_spec"; then if test -n "$hardcode_libdir_separator"; then func_replace_sysroot "$libdir" libdir=$func_replace_sysroot_result if test -z "$hardcode_libdirs"; then hardcode_libdirs="$libdir" else # Just accumulate the unique libdirs. case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) ;; *) func_append hardcode_libdirs "$hardcode_libdir_separator$libdir" ;; esac fi else eval flag=\"$hardcode_libdir_flag_spec\" func_append dep_rpath " $flag" fi elif test -n "$runpath_var"; then case "$perm_rpath " in *" $libdir "*) ;; *) func_append perm_rpath " $libdir" ;; esac fi done # Substitute the hardcoded libdirs into the rpath. if test -n "$hardcode_libdir_separator" && test -n "$hardcode_libdirs"; then libdir="$hardcode_libdirs" eval "dep_rpath=\"$hardcode_libdir_flag_spec\"" fi if test -n "$runpath_var" && test -n "$perm_rpath"; then # We should set the runpath_var. rpath= for dir in $perm_rpath; do func_append rpath "$dir:" done eval "$runpath_var='$rpath\$$runpath_var'; export $runpath_var" fi test -n "$dep_rpath" && deplibs="$dep_rpath $deplibs" fi shlibpath="$finalize_shlibpath" test "$opt_mode" != relink && shlibpath="$compile_shlibpath$shlibpath" if test -n "$shlibpath"; then eval "$shlibpath_var='$shlibpath\$$shlibpath_var'; export $shlibpath_var" fi # Get the real and link names of the library. eval shared_ext=\"$shrext_cmds\" eval library_names=\"$library_names_spec\" set dummy $library_names shift realname="$1" shift if test -n "$soname_spec"; then eval soname=\"$soname_spec\" else soname="$realname" fi if test -z "$dlname"; then dlname=$soname fi lib="$output_objdir/$realname" linknames= for link do func_append linknames " $link" done # Use standard objects if they are pic test -z "$pic_flag" && libobjs=`$ECHO "$libobjs" | $SP2NL | $SED "$lo2o" | $NL2SP` test "X$libobjs" = "X " && libobjs= delfiles= if test -n "$export_symbols" && test -n "$include_expsyms"; then $opt_dry_run || cp "$export_symbols" "$output_objdir/$libname.uexp" export_symbols="$output_objdir/$libname.uexp" func_append delfiles " $export_symbols" fi orig_export_symbols= case $host_os in cygwin* | mingw* | cegcc*) if test -n "$export_symbols" && test -z "$export_symbols_regex"; then # exporting using user supplied symfile if test "x`$SED 1q $export_symbols`" != xEXPORTS; then # and it's NOT already a .def file. Must figure out # which of the given symbols are data symbols and tag # them as such. So, trigger use of export_symbols_cmds. # export_symbols gets reassigned inside the "prepare # the list of exported symbols" if statement, so the # include_expsyms logic still works. orig_export_symbols="$export_symbols" export_symbols= always_export_symbols=yes fi fi ;; esac # Prepare the list of exported symbols if test -z "$export_symbols"; then if test "$always_export_symbols" = yes || test -n "$export_symbols_regex"; then func_verbose "generating symbol list for \`$libname.la'" export_symbols="$output_objdir/$libname.exp" $opt_dry_run || $RM $export_symbols cmds=$export_symbols_cmds save_ifs="$IFS"; IFS='~' for cmd1 in $cmds; do IFS="$save_ifs" # Take the normal branch if the nm_file_list_spec branch # doesn't work or if tool conversion is not needed. case $nm_file_list_spec~$to_tool_file_cmd in *~func_convert_file_noop | *~func_convert_file_msys_to_w32 | ~*) try_normal_branch=yes eval cmd=\"$cmd1\" func_len " $cmd" len=$func_len_result ;; *) try_normal_branch=no ;; esac if test "$try_normal_branch" = yes \ && { test "$len" -lt "$max_cmd_len" \ || test "$max_cmd_len" -le -1; } then func_show_eval "$cmd" 'exit $?' skipped_export=false elif test -n "$nm_file_list_spec"; then func_basename "$output" output_la=$func_basename_result save_libobjs=$libobjs save_output=$output output=${output_objdir}/${output_la}.nm func_to_tool_file "$output" libobjs=$nm_file_list_spec$func_to_tool_file_result func_append delfiles " $output" func_verbose "creating $NM input file list: $output" for obj in $save_libobjs; do func_to_tool_file "$obj" $ECHO "$func_to_tool_file_result" done > "$output" eval cmd=\"$cmd1\" func_show_eval "$cmd" 'exit $?' output=$save_output libobjs=$save_libobjs skipped_export=false else # The command line is too long to execute in one step. func_verbose "using reloadable object file for export list..." skipped_export=: # Break out early, otherwise skipped_export may be # set to false by a later but shorter cmd. break fi done IFS="$save_ifs" if test -n "$export_symbols_regex" && test "X$skipped_export" != "X:"; then func_show_eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"' func_show_eval '$MV "${export_symbols}T" "$export_symbols"' fi fi fi if test -n "$export_symbols" && test -n "$include_expsyms"; then tmp_export_symbols="$export_symbols" test -n "$orig_export_symbols" && tmp_export_symbols="$orig_export_symbols" $opt_dry_run || eval '$ECHO "$include_expsyms" | $SP2NL >> "$tmp_export_symbols"' fi if test "X$skipped_export" != "X:" && test -n "$orig_export_symbols"; then # The given exports_symbols file has to be filtered, so filter it. func_verbose "filter symbol list for \`$libname.la' to tag DATA exports" # FIXME: $output_objdir/$libname.filter potentially contains lots of # 's' commands which not all seds can handle. GNU sed should be fine # though. Also, the filter scales superlinearly with the number of # global variables. join(1) would be nice here, but unfortunately # isn't a blessed tool. $opt_dry_run || $SED -e '/[ ,]DATA/!d;s,\(.*\)\([ \,].*\),s|^\1$|\1\2|,' < $export_symbols > $output_objdir/$libname.filter func_append delfiles " $export_symbols $output_objdir/$libname.filter" export_symbols=$output_objdir/$libname.def $opt_dry_run || $SED -f $output_objdir/$libname.filter < $orig_export_symbols > $export_symbols fi tmp_deplibs= for test_deplib in $deplibs; do case " $convenience " in *" $test_deplib "*) ;; *) func_append tmp_deplibs " $test_deplib" ;; esac done deplibs="$tmp_deplibs" if test -n "$convenience"; then if test -n "$whole_archive_flag_spec" && test "$compiler_needs_object" = yes && test -z "$libobjs"; then # extract the archives, so we have objects to list. # TODO: could optimize this to just extract one archive. whole_archive_flag_spec= fi if test -n "$whole_archive_flag_spec"; then save_libobjs=$libobjs eval libobjs=\"\$libobjs $whole_archive_flag_spec\" test "X$libobjs" = "X " && libobjs= else gentop="$output_objdir/${outputname}x" func_append generated " $gentop" func_extract_archives $gentop $convenience func_append libobjs " $func_extract_archives_result" test "X$libobjs" = "X " && libobjs= fi fi if test "$thread_safe" = yes && test -n "$thread_safe_flag_spec"; then eval flag=\"$thread_safe_flag_spec\" func_append linker_flags " $flag" fi # Make a backup of the uninstalled library when relinking if test "$opt_mode" = relink; then $opt_dry_run || eval '(cd $output_objdir && $RM ${realname}U && $MV $realname ${realname}U)' || exit $? fi # Do each of the archive commands. if test "$module" = yes && test -n "$module_cmds" ; then if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then eval test_cmds=\"$module_expsym_cmds\" cmds=$module_expsym_cmds else eval test_cmds=\"$module_cmds\" cmds=$module_cmds fi else if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then eval test_cmds=\"$archive_expsym_cmds\" cmds=$archive_expsym_cmds else eval test_cmds=\"$archive_cmds\" cmds=$archive_cmds fi fi if test "X$skipped_export" != "X:" && func_len " $test_cmds" && len=$func_len_result && test "$len" -lt "$max_cmd_len" || test "$max_cmd_len" -le -1; then : else # The command line is too long to link in one step, link piecewise # or, if using GNU ld and skipped_export is not :, use a linker # script. # Save the value of $output and $libobjs because we want to # use them later. If we have whole_archive_flag_spec, we # want to use save_libobjs as it was before # whole_archive_flag_spec was expanded, because we can't # assume the linker understands whole_archive_flag_spec. # This may have to be revisited, in case too many # convenience libraries get linked in and end up exceeding # the spec. if test -z "$convenience" || test -z "$whole_archive_flag_spec"; then save_libobjs=$libobjs fi save_output=$output func_basename "$output" output_la=$func_basename_result # Clear the reloadable object creation command queue and # initialize k to one. test_cmds= concat_cmds= objlist= last_robj= k=1 if test -n "$save_libobjs" && test "X$skipped_export" != "X:" && test "$with_gnu_ld" = yes; then output=${output_objdir}/${output_la}.lnkscript func_verbose "creating GNU ld script: $output" echo 'INPUT (' > $output for obj in $save_libobjs do func_to_tool_file "$obj" $ECHO "$func_to_tool_file_result" >> $output done echo ')' >> $output func_append delfiles " $output" func_to_tool_file "$output" output=$func_to_tool_file_result elif test -n "$save_libobjs" && test "X$skipped_export" != "X:" && test "X$file_list_spec" != X; then output=${output_objdir}/${output_la}.lnk func_verbose "creating linker input file list: $output" : > $output set x $save_libobjs shift firstobj= if test "$compiler_needs_object" = yes; then firstobj="$1 " shift fi for obj do func_to_tool_file "$obj" $ECHO "$func_to_tool_file_result" >> $output done func_append delfiles " $output" func_to_tool_file "$output" output=$firstobj\"$file_list_spec$func_to_tool_file_result\" else if test -n "$save_libobjs"; then func_verbose "creating reloadable object files..." output=$output_objdir/$output_la-${k}.$objext eval test_cmds=\"$reload_cmds\" func_len " $test_cmds" len0=$func_len_result len=$len0 # Loop over the list of objects to be linked. for obj in $save_libobjs do func_len " $obj" func_arith $len + $func_len_result len=$func_arith_result if test "X$objlist" = X || test "$len" -lt "$max_cmd_len"; then func_append objlist " $obj" else # The command $test_cmds is almost too long, add a # command to the queue. if test "$k" -eq 1 ; then # The first file doesn't have a previous command to add. reload_objs=$objlist eval concat_cmds=\"$reload_cmds\" else # All subsequent reloadable object files will link in # the last one created. reload_objs="$objlist $last_robj" eval concat_cmds=\"\$concat_cmds~$reload_cmds~\$RM $last_robj\" fi last_robj=$output_objdir/$output_la-${k}.$objext func_arith $k + 1 k=$func_arith_result output=$output_objdir/$output_la-${k}.$objext objlist=" $obj" func_len " $last_robj" func_arith $len0 + $func_len_result len=$func_arith_result fi done # Handle the remaining objects by creating one last # reloadable object file. All subsequent reloadable object # files will link in the last one created. test -z "$concat_cmds" || concat_cmds=$concat_cmds~ reload_objs="$objlist $last_robj" eval concat_cmds=\"\${concat_cmds}$reload_cmds\" if test -n "$last_robj"; then eval concat_cmds=\"\${concat_cmds}~\$RM $last_robj\" fi func_append delfiles " $output" else output= fi if ${skipped_export-false}; then func_verbose "generating symbol list for \`$libname.la'" export_symbols="$output_objdir/$libname.exp" $opt_dry_run || $RM $export_symbols libobjs=$output # Append the command to create the export file. test -z "$concat_cmds" || concat_cmds=$concat_cmds~ eval concat_cmds=\"\$concat_cmds$export_symbols_cmds\" if test -n "$last_robj"; then eval concat_cmds=\"\$concat_cmds~\$RM $last_robj\" fi fi test -n "$save_libobjs" && func_verbose "creating a temporary reloadable object file: $output" # Loop through the commands generated above and execute them. save_ifs="$IFS"; IFS='~' for cmd in $concat_cmds; do IFS="$save_ifs" $opt_silent || { func_quote_for_expand "$cmd" eval "func_echo $func_quote_for_expand_result" } $opt_dry_run || eval "$cmd" || { lt_exit=$? # Restore the uninstalled library and exit if test "$opt_mode" = relink; then ( cd "$output_objdir" && \ $RM "${realname}T" && \ $MV "${realname}U" "$realname" ) fi exit $lt_exit } done IFS="$save_ifs" if test -n "$export_symbols_regex" && ${skipped_export-false}; then func_show_eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"' func_show_eval '$MV "${export_symbols}T" "$export_symbols"' fi fi if ${skipped_export-false}; then if test -n "$export_symbols" && test -n "$include_expsyms"; then tmp_export_symbols="$export_symbols" test -n "$orig_export_symbols" && tmp_export_symbols="$orig_export_symbols" $opt_dry_run || eval '$ECHO "$include_expsyms" | $SP2NL >> "$tmp_export_symbols"' fi if test -n "$orig_export_symbols"; then # The given exports_symbols file has to be filtered, so filter it. func_verbose "filter symbol list for \`$libname.la' to tag DATA exports" # FIXME: $output_objdir/$libname.filter potentially contains lots of # 's' commands which not all seds can handle. GNU sed should be fine # though. Also, the filter scales superlinearly with the number of # global variables. join(1) would be nice here, but unfortunately # isn't a blessed tool. $opt_dry_run || $SED -e '/[ ,]DATA/!d;s,\(.*\)\([ \,].*\),s|^\1$|\1\2|,' < $export_symbols > $output_objdir/$libname.filter func_append delfiles " $export_symbols $output_objdir/$libname.filter" export_symbols=$output_objdir/$libname.def $opt_dry_run || $SED -f $output_objdir/$libname.filter < $orig_export_symbols > $export_symbols fi fi libobjs=$output # Restore the value of output. output=$save_output if test -n "$convenience" && test -n "$whole_archive_flag_spec"; then eval libobjs=\"\$libobjs $whole_archive_flag_spec\" test "X$libobjs" = "X " && libobjs= fi # Expand the library linking commands again to reset the # value of $libobjs for piecewise linking. # Do each of the archive commands. if test "$module" = yes && test -n "$module_cmds" ; then if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then cmds=$module_expsym_cmds else cmds=$module_cmds fi else if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then cmds=$archive_expsym_cmds else cmds=$archive_cmds fi fi fi if test -n "$delfiles"; then # Append the command to remove temporary files to $cmds. eval cmds=\"\$cmds~\$RM $delfiles\" fi # Add any objects from preloaded convenience libraries if test -n "$dlprefiles"; then gentop="$output_objdir/${outputname}x" func_append generated " $gentop" func_extract_archives $gentop $dlprefiles func_append libobjs " $func_extract_archives_result" test "X$libobjs" = "X " && libobjs= fi save_ifs="$IFS"; IFS='~' for cmd in $cmds; do IFS="$save_ifs" eval cmd=\"$cmd\" $opt_silent || { func_quote_for_expand "$cmd" eval "func_echo $func_quote_for_expand_result" } $opt_dry_run || eval "$cmd" || { lt_exit=$? # Restore the uninstalled library and exit if test "$opt_mode" = relink; then ( cd "$output_objdir" && \ $RM "${realname}T" && \ $MV "${realname}U" "$realname" ) fi exit $lt_exit } done IFS="$save_ifs" # Restore the uninstalled library and exit if test "$opt_mode" = relink; then $opt_dry_run || eval '(cd $output_objdir && $RM ${realname}T && $MV $realname ${realname}T && $MV ${realname}U $realname)' || exit $? if test -n "$convenience"; then if test -z "$whole_archive_flag_spec"; then func_show_eval '${RM}r "$gentop"' fi fi exit $EXIT_SUCCESS fi # Create links to the real library. for linkname in $linknames; do if test "$realname" != "$linkname"; then func_show_eval '(cd "$output_objdir" && $RM "$linkname" && $LN_S "$realname" "$linkname")' 'exit $?' fi done # If -module or -export-dynamic was specified, set the dlname. if test "$module" = yes || test "$export_dynamic" = yes; then # On all known operating systems, these are identical. dlname="$soname" fi fi ;; obj) if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then func_warning "\`-dlopen' is ignored for objects" fi case " $deplibs" in *\ -l* | *\ -L*) func_warning "\`-l' and \`-L' are ignored for objects" ;; esac test -n "$rpath" && \ func_warning "\`-rpath' is ignored for objects" test -n "$xrpath" && \ func_warning "\`-R' is ignored for objects" test -n "$vinfo" && \ func_warning "\`-version-info' is ignored for objects" test -n "$release" && \ func_warning "\`-release' is ignored for objects" case $output in *.lo) test -n "$objs$old_deplibs" && \ func_fatal_error "cannot build library object \`$output' from non-libtool objects" libobj=$output func_lo2o "$libobj" obj=$func_lo2o_result ;; *) libobj= obj="$output" ;; esac # Delete the old objects. $opt_dry_run || $RM $obj $libobj # Objects from convenience libraries. This assumes # single-version convenience libraries. Whenever we create # different ones for PIC/non-PIC, this we'll have to duplicate # the extraction. reload_conv_objs= gentop= # reload_cmds runs $LD directly, so let us get rid of # -Wl from whole_archive_flag_spec and hope we can get by with # turning comma into space.. wl= if test -n "$convenience"; then if test -n "$whole_archive_flag_spec"; then eval tmp_whole_archive_flags=\"$whole_archive_flag_spec\" reload_conv_objs=$reload_objs\ `$ECHO "$tmp_whole_archive_flags" | $SED 's|,| |g'` else gentop="$output_objdir/${obj}x" func_append generated " $gentop" func_extract_archives $gentop $convenience reload_conv_objs="$reload_objs $func_extract_archives_result" fi fi # If we're not building shared, we need to use non_pic_objs test "$build_libtool_libs" != yes && libobjs="$non_pic_objects" # Create the old-style object. reload_objs="$objs$old_deplibs "`$ECHO "$libobjs" | $SP2NL | $SED "/\.${libext}$/d; /\.lib$/d; $lo2o" | $NL2SP`" $reload_conv_objs" ### testsuite: skip nested quoting test output="$obj" func_execute_cmds "$reload_cmds" 'exit $?' # Exit if we aren't doing a library object file. if test -z "$libobj"; then if test -n "$gentop"; then func_show_eval '${RM}r "$gentop"' fi exit $EXIT_SUCCESS fi if test "$build_libtool_libs" != yes; then if test -n "$gentop"; then func_show_eval '${RM}r "$gentop"' fi # Create an invalid libtool object if no PIC, so that we don't # accidentally link it into a program. # $show "echo timestamp > $libobj" # $opt_dry_run || eval "echo timestamp > $libobj" || exit $? exit $EXIT_SUCCESS fi if test -n "$pic_flag" || test "$pic_mode" != default; then # Only do commands if we really have different PIC objects. reload_objs="$libobjs $reload_conv_objs" output="$libobj" func_execute_cmds "$reload_cmds" 'exit $?' fi if test -n "$gentop"; then func_show_eval '${RM}r "$gentop"' fi exit $EXIT_SUCCESS ;; prog) case $host in *cygwin*) func_stripname '' '.exe' "$output" output=$func_stripname_result.exe;; esac test -n "$vinfo" && \ func_warning "\`-version-info' is ignored for programs" test -n "$release" && \ func_warning "\`-release' is ignored for programs" test "$preload" = yes \ && test "$dlopen_support" = unknown \ && test "$dlopen_self" = unknown \ && test "$dlopen_self_static" = unknown && \ func_warning "\`LT_INIT([dlopen])' not used. Assuming no dlopen support." case $host in *-*-rhapsody* | *-*-darwin1.[012]) # On Rhapsody replace the C library is the System framework compile_deplibs=`$ECHO " $compile_deplibs" | $SED 's/ -lc / System.ltframework /'` finalize_deplibs=`$ECHO " $finalize_deplibs" | $SED 's/ -lc / System.ltframework /'` ;; esac case $host in *-*-darwin*) # Don't allow lazy linking, it breaks C++ global constructors # But is supposedly fixed on 10.4 or later (yay!). if test "$tagname" = CXX ; then case ${MACOSX_DEPLOYMENT_TARGET-10.0} in 10.[0123]) func_append compile_command " ${wl}-bind_at_load" func_append finalize_command " ${wl}-bind_at_load" ;; esac fi # Time to change all our "foo.ltframework" stuff back to "-framework foo" compile_deplibs=`$ECHO " $compile_deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` finalize_deplibs=`$ECHO " $finalize_deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` ;; esac # move library search paths that coincide with paths to not yet # installed libraries to the beginning of the library search list new_libs= for path in $notinst_path; do case " $new_libs " in *" -L$path/$objdir "*) ;; *) case " $compile_deplibs " in *" -L$path/$objdir "*) func_append new_libs " -L$path/$objdir" ;; esac ;; esac done for deplib in $compile_deplibs; do case $deplib in -L*) case " $new_libs " in *" $deplib "*) ;; *) func_append new_libs " $deplib" ;; esac ;; *) func_append new_libs " $deplib" ;; esac done compile_deplibs="$new_libs" func_append compile_command " $compile_deplibs" func_append finalize_command " $finalize_deplibs" if test -n "$rpath$xrpath"; then # If the user specified any rpath flags, then add them. for libdir in $rpath $xrpath; do # This is the magic to use -rpath. case "$finalize_rpath " in *" $libdir "*) ;; *) func_append finalize_rpath " $libdir" ;; esac done fi # Now hardcode the library paths rpath= hardcode_libdirs= for libdir in $compile_rpath $finalize_rpath; do if test -n "$hardcode_libdir_flag_spec"; then if test -n "$hardcode_libdir_separator"; then if test -z "$hardcode_libdirs"; then hardcode_libdirs="$libdir" else # Just accumulate the unique libdirs. case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) ;; *) func_append hardcode_libdirs "$hardcode_libdir_separator$libdir" ;; esac fi else eval flag=\"$hardcode_libdir_flag_spec\" func_append rpath " $flag" fi elif test -n "$runpath_var"; then case "$perm_rpath " in *" $libdir "*) ;; *) func_append perm_rpath " $libdir" ;; esac fi case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*) testbindir=`${ECHO} "$libdir" | ${SED} -e 's*/lib$*/bin*'` case :$dllsearchpath: in *":$libdir:"*) ;; ::) dllsearchpath=$libdir;; *) func_append dllsearchpath ":$libdir";; esac case :$dllsearchpath: in *":$testbindir:"*) ;; ::) dllsearchpath=$testbindir;; *) func_append dllsearchpath ":$testbindir";; esac ;; esac done # Substitute the hardcoded libdirs into the rpath. if test -n "$hardcode_libdir_separator" && test -n "$hardcode_libdirs"; then libdir="$hardcode_libdirs" eval rpath=\" $hardcode_libdir_flag_spec\" fi compile_rpath="$rpath" rpath= hardcode_libdirs= for libdir in $finalize_rpath; do if test -n "$hardcode_libdir_flag_spec"; then if test -n "$hardcode_libdir_separator"; then if test -z "$hardcode_libdirs"; then hardcode_libdirs="$libdir" else # Just accumulate the unique libdirs. case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) ;; *) func_append hardcode_libdirs "$hardcode_libdir_separator$libdir" ;; esac fi else eval flag=\"$hardcode_libdir_flag_spec\" func_append rpath " $flag" fi elif test -n "$runpath_var"; then case "$finalize_perm_rpath " in *" $libdir "*) ;; *) func_append finalize_perm_rpath " $libdir" ;; esac fi done # Substitute the hardcoded libdirs into the rpath. if test -n "$hardcode_libdir_separator" && test -n "$hardcode_libdirs"; then libdir="$hardcode_libdirs" eval rpath=\" $hardcode_libdir_flag_spec\" fi finalize_rpath="$rpath" if test -n "$libobjs" && test "$build_old_libs" = yes; then # Transform all the library objects into standard objects. compile_command=`$ECHO "$compile_command" | $SP2NL | $SED "$lo2o" | $NL2SP` finalize_command=`$ECHO "$finalize_command" | $SP2NL | $SED "$lo2o" | $NL2SP` fi func_generate_dlsyms "$outputname" "@PROGRAM@" "no" # template prelinking step if test -n "$prelink_cmds"; then func_execute_cmds "$prelink_cmds" 'exit $?' fi wrappers_required=yes case $host in *cegcc* | *mingw32ce*) # Disable wrappers for cegcc and mingw32ce hosts, we are cross compiling anyway. wrappers_required=no ;; *cygwin* | *mingw* ) if test "$build_libtool_libs" != yes; then wrappers_required=no fi ;; *) if test "$need_relink" = no || test "$build_libtool_libs" != yes; then wrappers_required=no fi ;; esac if test "$wrappers_required" = no; then # Replace the output file specification. compile_command=`$ECHO "$compile_command" | $SED 's%@OUTPUT@%'"$output"'%g'` link_command="$compile_command$compile_rpath" # We have no uninstalled library dependencies, so finalize right now. exit_status=0 func_show_eval "$link_command" 'exit_status=$?' if test -n "$postlink_cmds"; then func_to_tool_file "$output" postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'` func_execute_cmds "$postlink_cmds" 'exit $?' fi # Delete the generated files. if test -f "$output_objdir/${outputname}S.${objext}"; then func_show_eval '$RM "$output_objdir/${outputname}S.${objext}"' fi exit $exit_status fi if test -n "$compile_shlibpath$finalize_shlibpath"; then compile_command="$shlibpath_var=\"$compile_shlibpath$finalize_shlibpath\$$shlibpath_var\" $compile_command" fi if test -n "$finalize_shlibpath"; then finalize_command="$shlibpath_var=\"$finalize_shlibpath\$$shlibpath_var\" $finalize_command" fi compile_var= finalize_var= if test -n "$runpath_var"; then if test -n "$perm_rpath"; then # We should set the runpath_var. rpath= for dir in $perm_rpath; do func_append rpath "$dir:" done compile_var="$runpath_var=\"$rpath\$$runpath_var\" " fi if test -n "$finalize_perm_rpath"; then # We should set the runpath_var. rpath= for dir in $finalize_perm_rpath; do func_append rpath "$dir:" done finalize_var="$runpath_var=\"$rpath\$$runpath_var\" " fi fi if test "$no_install" = yes; then # We don't need to create a wrapper script. link_command="$compile_var$compile_command$compile_rpath" # Replace the output file specification. link_command=`$ECHO "$link_command" | $SED 's%@OUTPUT@%'"$output"'%g'` # Delete the old output file. $opt_dry_run || $RM $output # Link the executable and exit func_show_eval "$link_command" 'exit $?' if test -n "$postlink_cmds"; then func_to_tool_file "$output" postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'` func_execute_cmds "$postlink_cmds" 'exit $?' fi exit $EXIT_SUCCESS fi if test "$hardcode_action" = relink; then # Fast installation is not supported link_command="$compile_var$compile_command$compile_rpath" relink_command="$finalize_var$finalize_command$finalize_rpath" func_warning "this platform does not like uninstalled shared libraries" func_warning "\`$output' will be relinked during installation" else if test "$fast_install" != no; then link_command="$finalize_var$compile_command$finalize_rpath" if test "$fast_install" = yes; then relink_command=`$ECHO "$compile_var$compile_command$compile_rpath" | $SED 's%@OUTPUT@%\$progdir/\$file%g'` else # fast_install is set to needless relink_command= fi else link_command="$compile_var$compile_command$compile_rpath" relink_command="$finalize_var$finalize_command$finalize_rpath" fi fi # Replace the output file specification. link_command=`$ECHO "$link_command" | $SED 's%@OUTPUT@%'"$output_objdir/$outputname"'%g'` # Delete the old output files. $opt_dry_run || $RM $output $output_objdir/$outputname $output_objdir/lt-$outputname func_show_eval "$link_command" 'exit $?' if test -n "$postlink_cmds"; then func_to_tool_file "$output_objdir/$outputname" postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output_objdir/$outputname"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'` func_execute_cmds "$postlink_cmds" 'exit $?' fi # Now create the wrapper script. func_verbose "creating $output" # Quote the relink command for shipping. if test -n "$relink_command"; then # Preserve any variables that may affect compiler behavior for var in $variables_saved_for_relink; do if eval test -z \"\${$var+set}\"; then relink_command="{ test -z \"\${$var+set}\" || $lt_unset $var || { $var=; export $var; }; }; $relink_command" elif eval var_value=\$$var; test -z "$var_value"; then relink_command="$var=; export $var; $relink_command" else func_quote_for_eval "$var_value" relink_command="$var=$func_quote_for_eval_result; export $var; $relink_command" fi done relink_command="(cd `pwd`; $relink_command)" relink_command=`$ECHO "$relink_command" | $SED "$sed_quote_subst"` fi # Only actually do things if not in dry run mode. $opt_dry_run || { # win32 will think the script is a binary if it has # a .exe suffix, so we strip it off here. case $output in *.exe) func_stripname '' '.exe' "$output" output=$func_stripname_result ;; esac # test for cygwin because mv fails w/o .exe extensions case $host in *cygwin*) exeext=.exe func_stripname '' '.exe' "$outputname" outputname=$func_stripname_result ;; *) exeext= ;; esac case $host in *cygwin* | *mingw* ) func_dirname_and_basename "$output" "" "." output_name=$func_basename_result output_path=$func_dirname_result cwrappersource="$output_path/$objdir/lt-$output_name.c" cwrapper="$output_path/$output_name.exe" $RM $cwrappersource $cwrapper trap "$RM $cwrappersource $cwrapper; exit $EXIT_FAILURE" 1 2 15 func_emit_cwrapperexe_src > $cwrappersource # The wrapper executable is built using the $host compiler, # because it contains $host paths and files. If cross- # compiling, it, like the target executable, must be # executed on the $host or under an emulation environment. $opt_dry_run || { $LTCC $LTCFLAGS -o $cwrapper $cwrappersource $STRIP $cwrapper } # Now, create the wrapper script for func_source use: func_ltwrapper_scriptname $cwrapper $RM $func_ltwrapper_scriptname_result trap "$RM $func_ltwrapper_scriptname_result; exit $EXIT_FAILURE" 1 2 15 $opt_dry_run || { # note: this script will not be executed, so do not chmod. if test "x$build" = "x$host" ; then $cwrapper --lt-dump-script > $func_ltwrapper_scriptname_result else func_emit_wrapper no > $func_ltwrapper_scriptname_result fi } ;; * ) $RM $output trap "$RM $output; exit $EXIT_FAILURE" 1 2 15 func_emit_wrapper no > $output chmod +x $output ;; esac } exit $EXIT_SUCCESS ;; esac # See if we need to build an old-fashioned archive. for oldlib in $oldlibs; do if test "$build_libtool_libs" = convenience; then oldobjs="$libobjs_save $symfileobj" addlibs="$convenience" build_libtool_libs=no else if test "$build_libtool_libs" = module; then oldobjs="$libobjs_save" build_libtool_libs=no else oldobjs="$old_deplibs $non_pic_objects" if test "$preload" = yes && test -f "$symfileobj"; then func_append oldobjs " $symfileobj" fi fi addlibs="$old_convenience" fi if test -n "$addlibs"; then gentop="$output_objdir/${outputname}x" func_append generated " $gentop" func_extract_archives $gentop $addlibs func_append oldobjs " $func_extract_archives_result" fi # Do each command in the archive commands. if test -n "$old_archive_from_new_cmds" && test "$build_libtool_libs" = yes; then cmds=$old_archive_from_new_cmds else # Add any objects from preloaded convenience libraries if test -n "$dlprefiles"; then gentop="$output_objdir/${outputname}x" func_append generated " $gentop" func_extract_archives $gentop $dlprefiles func_append oldobjs " $func_extract_archives_result" fi # POSIX demands no paths to be encoded in archives. We have # to avoid creating archives with duplicate basenames if we # might have to extract them afterwards, e.g., when creating a # static archive out of a convenience library, or when linking # the entirety of a libtool archive into another (currently # not supported by libtool). if (for obj in $oldobjs do func_basename "$obj" $ECHO "$func_basename_result" done | sort | sort -uc >/dev/null 2>&1); then : else echo "copying selected object files to avoid basename conflicts..." gentop="$output_objdir/${outputname}x" func_append generated " $gentop" func_mkdir_p "$gentop" save_oldobjs=$oldobjs oldobjs= counter=1 for obj in $save_oldobjs do func_basename "$obj" objbase="$func_basename_result" case " $oldobjs " in " ") oldobjs=$obj ;; *[\ /]"$objbase "*) while :; do # Make sure we don't pick an alternate name that also # overlaps. newobj=lt$counter-$objbase func_arith $counter + 1 counter=$func_arith_result case " $oldobjs " in *[\ /]"$newobj "*) ;; *) if test ! -f "$gentop/$newobj"; then break; fi ;; esac done func_show_eval "ln $obj $gentop/$newobj || cp $obj $gentop/$newobj" func_append oldobjs " $gentop/$newobj" ;; *) func_append oldobjs " $obj" ;; esac done fi func_to_tool_file "$oldlib" func_convert_file_msys_to_w32 tool_oldlib=$func_to_tool_file_result eval cmds=\"$old_archive_cmds\" func_len " $cmds" len=$func_len_result if test "$len" -lt "$max_cmd_len" || test "$max_cmd_len" -le -1; then cmds=$old_archive_cmds elif test -n "$archiver_list_spec"; then func_verbose "using command file archive linking..." for obj in $oldobjs do func_to_tool_file "$obj" $ECHO "$func_to_tool_file_result" done > $output_objdir/$libname.libcmd func_to_tool_file "$output_objdir/$libname.libcmd" oldobjs=" $archiver_list_spec$func_to_tool_file_result" cmds=$old_archive_cmds else # the command line is too long to link in one step, link in parts func_verbose "using piecewise archive linking..." save_RANLIB=$RANLIB RANLIB=: objlist= concat_cmds= save_oldobjs=$oldobjs oldobjs= # Is there a better way of finding the last object in the list? for obj in $save_oldobjs do last_oldobj=$obj done eval test_cmds=\"$old_archive_cmds\" func_len " $test_cmds" len0=$func_len_result len=$len0 for obj in $save_oldobjs do func_len " $obj" func_arith $len + $func_len_result len=$func_arith_result func_append objlist " $obj" if test "$len" -lt "$max_cmd_len"; then : else # the above command should be used before it gets too long oldobjs=$objlist if test "$obj" = "$last_oldobj" ; then RANLIB=$save_RANLIB fi test -z "$concat_cmds" || concat_cmds=$concat_cmds~ eval concat_cmds=\"\${concat_cmds}$old_archive_cmds\" objlist= len=$len0 fi done RANLIB=$save_RANLIB oldobjs=$objlist if test "X$oldobjs" = "X" ; then eval cmds=\"\$concat_cmds\" else eval cmds=\"\$concat_cmds~\$old_archive_cmds\" fi fi fi func_execute_cmds "$cmds" 'exit $?' done test -n "$generated" && \ func_show_eval "${RM}r$generated" # Now create the libtool archive. case $output in *.la) old_library= test "$build_old_libs" = yes && old_library="$libname.$libext" func_verbose "creating $output" # Preserve any variables that may affect compiler behavior for var in $variables_saved_for_relink; do if eval test -z \"\${$var+set}\"; then relink_command="{ test -z \"\${$var+set}\" || $lt_unset $var || { $var=; export $var; }; }; $relink_command" elif eval var_value=\$$var; test -z "$var_value"; then relink_command="$var=; export $var; $relink_command" else func_quote_for_eval "$var_value" relink_command="$var=$func_quote_for_eval_result; export $var; $relink_command" fi done # Quote the link command for shipping. relink_command="(cd `pwd`; $SHELL $progpath $preserve_args --mode=relink $libtool_args @inst_prefix_dir@)" relink_command=`$ECHO "$relink_command" | $SED "$sed_quote_subst"` if test "$hardcode_automatic" = yes ; then relink_command= fi # Only create the output if not a dry run. $opt_dry_run || { for installed in no yes; do if test "$installed" = yes; then if test -z "$install_libdir"; then break fi output="$output_objdir/$outputname"i # Replace all uninstalled libtool libraries with the installed ones newdependency_libs= for deplib in $dependency_libs; do case $deplib in *.la) func_basename "$deplib" name="$func_basename_result" func_resolve_sysroot "$deplib" eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $func_resolve_sysroot_result` test -z "$libdir" && \ func_fatal_error "\`$deplib' is not a valid libtool archive" func_append newdependency_libs " ${lt_sysroot:+=}$libdir/$name" ;; -L*) func_stripname -L '' "$deplib" func_replace_sysroot "$func_stripname_result" func_append newdependency_libs " -L$func_replace_sysroot_result" ;; -R*) func_stripname -R '' "$deplib" func_replace_sysroot "$func_stripname_result" func_append newdependency_libs " -R$func_replace_sysroot_result" ;; *) func_append newdependency_libs " $deplib" ;; esac done dependency_libs="$newdependency_libs" newdlfiles= for lib in $dlfiles; do case $lib in *.la) func_basename "$lib" name="$func_basename_result" eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $lib` test -z "$libdir" && \ func_fatal_error "\`$lib' is not a valid libtool archive" func_append newdlfiles " ${lt_sysroot:+=}$libdir/$name" ;; *) func_append newdlfiles " $lib" ;; esac done dlfiles="$newdlfiles" newdlprefiles= for lib in $dlprefiles; do case $lib in *.la) # Only pass preopened files to the pseudo-archive (for # eventual linking with the app. that links it) if we # didn't already link the preopened objects directly into # the library: func_basename "$lib" name="$func_basename_result" eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $lib` test -z "$libdir" && \ func_fatal_error "\`$lib' is not a valid libtool archive" func_append newdlprefiles " ${lt_sysroot:+=}$libdir/$name" ;; esac done dlprefiles="$newdlprefiles" else newdlfiles= for lib in $dlfiles; do case $lib in [\\/]* | [A-Za-z]:[\\/]*) abs="$lib" ;; *) abs=`pwd`"/$lib" ;; esac func_append newdlfiles " $abs" done dlfiles="$newdlfiles" newdlprefiles= for lib in $dlprefiles; do case $lib in [\\/]* | [A-Za-z]:[\\/]*) abs="$lib" ;; *) abs=`pwd`"/$lib" ;; esac func_append newdlprefiles " $abs" done dlprefiles="$newdlprefiles" fi $RM $output # place dlname in correct position for cygwin # In fact, it would be nice if we could use this code for all target # systems that can't hard-code library paths into their executables # and that have no shared library path variable independent of PATH, # but it turns out we can't easily determine that from inspecting # libtool variables, so we have to hard-code the OSs to which it # applies here; at the moment, that means platforms that use the PE # object format with DLL files. See the long comment at the top of # tests/bindir.at for full details. tdlname=$dlname case $host,$output,$installed,$module,$dlname in *cygwin*,*lai,yes,no,*.dll | *mingw*,*lai,yes,no,*.dll | *cegcc*,*lai,yes,no,*.dll) # If a -bindir argument was supplied, place the dll there. if test "x$bindir" != x ; then func_relative_path "$install_libdir" "$bindir" tdlname=$func_relative_path_result$dlname else # Otherwise fall back on heuristic. tdlname=../bin/$dlname fi ;; esac $ECHO > $output "\ # $outputname - a libtool library file # Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION # # Please DO NOT delete this file! # It is necessary for linking the library. # The name that we can dlopen(3). dlname='$tdlname' # Names of this library. library_names='$library_names' # The name of the static archive. old_library='$old_library' # Linker flags that can not go in dependency_libs. inherited_linker_flags='$new_inherited_linker_flags' # Libraries that this one depends upon. dependency_libs='$dependency_libs' # Names of additional weak libraries provided by this library weak_library_names='$weak_libs' # Version information for $libname. current=$current age=$age revision=$revision # Is this an already installed library? installed=$installed # Should we warn about portability when linking against -modules? shouldnotlink=$module # Files to dlopen/dlpreopen dlopen='$dlfiles' dlpreopen='$dlprefiles' # Directory that this library needs to be installed in: libdir='$install_libdir'" if test "$installed" = no && test "$need_relink" = yes; then $ECHO >> $output "\ relink_command=\"$relink_command\"" fi done } # Do a symbolic link so that the libtool archive can be found in # LD_LIBRARY_PATH before the program is installed. func_show_eval '( cd "$output_objdir" && $RM "$outputname" && $LN_S "../$outputname" "$outputname" )' 'exit $?' ;; esac exit $EXIT_SUCCESS } { test "$opt_mode" = link || test "$opt_mode" = relink; } && func_mode_link ${1+"$@"} # func_mode_uninstall arg... func_mode_uninstall () { $opt_debug RM="$nonopt" files= rmforce= exit_status=0 # This variable tells wrapper scripts just to set variables rather # than running their programs. libtool_install_magic="$magic" for arg do case $arg in -f) func_append RM " $arg"; rmforce=yes ;; -*) func_append RM " $arg" ;; *) func_append files " $arg" ;; esac done test -z "$RM" && \ func_fatal_help "you must specify an RM program" rmdirs= for file in $files; do func_dirname "$file" "" "." dir="$func_dirname_result" if test "X$dir" = X.; then odir="$objdir" else odir="$dir/$objdir" fi func_basename "$file" name="$func_basename_result" test "$opt_mode" = uninstall && odir="$dir" # Remember odir for removal later, being careful to avoid duplicates if test "$opt_mode" = clean; then case " $rmdirs " in *" $odir "*) ;; *) func_append rmdirs " $odir" ;; esac fi # Don't error if the file doesn't exist and rm -f was used. if { test -L "$file"; } >/dev/null 2>&1 || { test -h "$file"; } >/dev/null 2>&1 || test -f "$file"; then : elif test -d "$file"; then exit_status=1 continue elif test "$rmforce" = yes; then continue fi rmfiles="$file" case $name in *.la) # Possibly a libtool archive, so verify it. if func_lalib_p "$file"; then func_source $dir/$name # Delete the libtool libraries and symlinks. for n in $library_names; do func_append rmfiles " $odir/$n" done test -n "$old_library" && func_append rmfiles " $odir/$old_library" case "$opt_mode" in clean) case " $library_names " in *" $dlname "*) ;; *) test -n "$dlname" && func_append rmfiles " $odir/$dlname" ;; esac test -n "$libdir" && func_append rmfiles " $odir/$name $odir/${name}i" ;; uninstall) if test -n "$library_names"; then # Do each command in the postuninstall commands. func_execute_cmds "$postuninstall_cmds" 'test "$rmforce" = yes || exit_status=1' fi if test -n "$old_library"; then # Do each command in the old_postuninstall commands. func_execute_cmds "$old_postuninstall_cmds" 'test "$rmforce" = yes || exit_status=1' fi # FIXME: should reinstall the best remaining shared library. ;; esac fi ;; *.lo) # Possibly a libtool object, so verify it. if func_lalib_p "$file"; then # Read the .lo file func_source $dir/$name # Add PIC object to the list of files to remove. if test -n "$pic_object" && test "$pic_object" != none; then func_append rmfiles " $dir/$pic_object" fi # Add non-PIC object to the list of files to remove. if test -n "$non_pic_object" && test "$non_pic_object" != none; then func_append rmfiles " $dir/$non_pic_object" fi fi ;; *) if test "$opt_mode" = clean ; then noexename=$name case $file in *.exe) func_stripname '' '.exe' "$file" file=$func_stripname_result func_stripname '' '.exe' "$name" noexename=$func_stripname_result # $file with .exe has already been added to rmfiles, # add $file without .exe func_append rmfiles " $file" ;; esac # Do a test to see if this is a libtool program. if func_ltwrapper_p "$file"; then if func_ltwrapper_executable_p "$file"; then func_ltwrapper_scriptname "$file" relink_command= func_source $func_ltwrapper_scriptname_result func_append rmfiles " $func_ltwrapper_scriptname_result" else relink_command= func_source $dir/$noexename fi # note $name still contains .exe if it was in $file originally # as does the version of $file that was added into $rmfiles func_append rmfiles " $odir/$name $odir/${name}S.${objext}" if test "$fast_install" = yes && test -n "$relink_command"; then func_append rmfiles " $odir/lt-$name" fi if test "X$noexename" != "X$name" ; then func_append rmfiles " $odir/lt-${noexename}.c" fi fi fi ;; esac func_show_eval "$RM $rmfiles" 'exit_status=1' done # Try to remove the ${objdir}s in the directories where we deleted files for dir in $rmdirs; do if test -d "$dir"; then func_show_eval "rmdir $dir >/dev/null 2>&1" fi done exit $exit_status } { test "$opt_mode" = uninstall || test "$opt_mode" = clean; } && func_mode_uninstall ${1+"$@"} test -z "$opt_mode" && { help="$generic_help" func_fatal_help "you must specify a MODE" } test -z "$exec_cmd" && \ func_fatal_help "invalid operation mode \`$opt_mode'" if test -n "$exec_cmd"; then eval exec "$exec_cmd" exit $EXIT_FAILURE fi exit $exit_status # The TAGs below are defined such that we never get into a situation # in which we disable both kinds of libraries. Given conflicting # choices, we go for a static library, that is the most portable, # since we can't tell whether shared libraries were disabled because # the user asked for that or because the platform doesn't support # them. This is particularly important on AIX, because we don't # support having both static and shared libraries enabled at the same # time on that platform, so we default to a shared-only configuration. # If a disable-shared tag is given, we'll fallback to a static-only # configuration. But we'll never go from static-only to shared-only. # ### BEGIN LIBTOOL TAG CONFIG: disable-shared build_libtool_libs=no build_old_libs=yes # ### END LIBTOOL TAG CONFIG: disable-shared # ### BEGIN LIBTOOL TAG CONFIG: disable-static build_old_libs=`case $build_libtool_libs in yes) echo no;; *) echo yes;; esac` # ### END LIBTOOL TAG CONFIG: disable-static # Local Variables: # mode:shell-script # sh-indentation:2 # End: # vi:sw=2 dibbler-1.0.1/aclocal.m40000664000175000017500000012733412561652524011721 00000000000000# generated automatically by aclocal 1.14.1 -*- Autoconf -*- # Copyright (C) 1996-2013 Free Software Foundation, Inc. # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. m4_ifndef([AC_CONFIG_MACRO_DIRS], [m4_defun([_AM_CONFIG_MACRO_DIRS], [])m4_defun([AC_CONFIG_MACRO_DIRS], [_AM_CONFIG_MACRO_DIRS($@)])]) m4_ifndef([AC_AUTOCONF_VERSION], [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl m4_if(m4_defn([AC_AUTOCONF_VERSION]), [2.69],, [m4_warning([this file was generated for autoconf 2.69. You have another version of autoconf. It may work, but is not guaranteed to. If you have problems, you may need to regenerate the build system entirely. To do so, use the procedure documented by the package, typically 'autoreconf'.])]) # Copyright (C) 2002-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_AUTOMAKE_VERSION(VERSION) # ---------------------------- # Automake X.Y traces this macro to ensure aclocal.m4 has been # generated from the m4 files accompanying Automake X.Y. # (This private macro should not be called outside this file.) AC_DEFUN([AM_AUTOMAKE_VERSION], [am__api_version='1.14' dnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to dnl require some minimum version. Point them to the right macro. m4_if([$1], [1.14.1], [], [AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl ]) # _AM_AUTOCONF_VERSION(VERSION) # ----------------------------- # aclocal traces this macro to find the Autoconf version. # This is a private macro too. Using m4_define simplifies # the logic in aclocal, which can simply ignore this definition. m4_define([_AM_AUTOCONF_VERSION], []) # AM_SET_CURRENT_AUTOMAKE_VERSION # ------------------------------- # Call AM_AUTOMAKE_VERSION and AM_AUTOMAKE_VERSION so they can be traced. # This function is AC_REQUIREd by AM_INIT_AUTOMAKE. AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION], [AM_AUTOMAKE_VERSION([1.14.1])dnl m4_ifndef([AC_AUTOCONF_VERSION], [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl _AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))]) # AM_AUX_DIR_EXPAND -*- Autoconf -*- # Copyright (C) 2001-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # For projects using AC_CONFIG_AUX_DIR([foo]), Autoconf sets # $ac_aux_dir to '$srcdir/foo'. In other projects, it is set to # '$srcdir', '$srcdir/..', or '$srcdir/../..'. # # Of course, Automake must honor this variable whenever it calls a # tool from the auxiliary directory. The problem is that $srcdir (and # therefore $ac_aux_dir as well) can be either absolute or relative, # depending on how configure is run. This is pretty annoying, since # it makes $ac_aux_dir quite unusable in subdirectories: in the top # source directory, any form will work fine, but in subdirectories a # relative path needs to be adjusted first. # # $ac_aux_dir/missing # fails when called from a subdirectory if $ac_aux_dir is relative # $top_srcdir/$ac_aux_dir/missing # fails if $ac_aux_dir is absolute, # fails when called from a subdirectory in a VPATH build with # a relative $ac_aux_dir # # The reason of the latter failure is that $top_srcdir and $ac_aux_dir # are both prefixed by $srcdir. In an in-source build this is usually # harmless because $srcdir is '.', but things will broke when you # start a VPATH build or use an absolute $srcdir. # # So we could use something similar to $top_srcdir/$ac_aux_dir/missing, # iff we strip the leading $srcdir from $ac_aux_dir. That would be: # am_aux_dir='\$(top_srcdir)/'`expr "$ac_aux_dir" : "$srcdir//*\(.*\)"` # and then we would define $MISSING as # MISSING="\${SHELL} $am_aux_dir/missing" # This will work as long as MISSING is not called from configure, because # unfortunately $(top_srcdir) has no meaning in configure. # However there are other variables, like CC, which are often used in # configure, and could therefore not use this "fixed" $ac_aux_dir. # # Another solution, used here, is to always expand $ac_aux_dir to an # absolute PATH. The drawback is that using absolute paths prevent a # configured tree to be moved without reconfiguration. AC_DEFUN([AM_AUX_DIR_EXPAND], [dnl Rely on autoconf to set up CDPATH properly. AC_PREREQ([2.50])dnl # expand $ac_aux_dir to an absolute path am_aux_dir=`cd $ac_aux_dir && pwd` ]) # AM_COND_IF -*- Autoconf -*- # Copyright (C) 2008-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # _AM_COND_IF # _AM_COND_ELSE # _AM_COND_ENDIF # -------------- # These macros are only used for tracing. m4_define([_AM_COND_IF]) m4_define([_AM_COND_ELSE]) m4_define([_AM_COND_ENDIF]) # AM_COND_IF(COND, [IF-TRUE], [IF-FALSE]) # --------------------------------------- # If the shell condition COND is true, execute IF-TRUE, otherwise execute # IF-FALSE. Allow automake to learn about conditional instantiating macros # (the AC_CONFIG_FOOS). AC_DEFUN([AM_COND_IF], [m4_ifndef([_AM_COND_VALUE_$1], [m4_fatal([$0: no such condition "$1"])])dnl _AM_COND_IF([$1])dnl if test -z "$$1_TRUE"; then : m4_n([$2])[]dnl m4_ifval([$3], [_AM_COND_ELSE([$1])dnl else $3 ])dnl _AM_COND_ENDIF([$1])dnl fi[]dnl ]) # AM_CONDITIONAL -*- Autoconf -*- # Copyright (C) 1997-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_CONDITIONAL(NAME, SHELL-CONDITION) # ------------------------------------- # Define a conditional. AC_DEFUN([AM_CONDITIONAL], [AC_PREREQ([2.52])dnl m4_if([$1], [TRUE], [AC_FATAL([$0: invalid condition: $1])], [$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl AC_SUBST([$1_TRUE])dnl AC_SUBST([$1_FALSE])dnl _AM_SUBST_NOTMAKE([$1_TRUE])dnl _AM_SUBST_NOTMAKE([$1_FALSE])dnl m4_define([_AM_COND_VALUE_$1], [$2])dnl if $2; then $1_TRUE= $1_FALSE='#' else $1_TRUE='#' $1_FALSE= fi AC_CONFIG_COMMANDS_PRE( [if test -z "${$1_TRUE}" && test -z "${$1_FALSE}"; then AC_MSG_ERROR([[conditional "$1" was never defined. Usually this means the macro was only invoked conditionally.]]) fi])]) # Copyright (C) 1999-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # There are a few dirty hacks below to avoid letting 'AC_PROG_CC' be # written in clear, in which case automake, when reading aclocal.m4, # will think it sees a *use*, and therefore will trigger all it's # C support machinery. Also note that it means that autoscan, seeing # CC etc. in the Makefile, will ask for an AC_PROG_CC use... # _AM_DEPENDENCIES(NAME) # ---------------------- # See how the compiler implements dependency checking. # NAME is "CC", "CXX", "OBJC", "OBJCXX", "UPC", or "GJC". # We try a few techniques and use that to set a single cache variable. # # We don't AC_REQUIRE the corresponding AC_PROG_CC since the latter was # modified to invoke _AM_DEPENDENCIES(CC); we would have a circular # dependency, and given that the user is not expected to run this macro, # just rely on AC_PROG_CC. AC_DEFUN([_AM_DEPENDENCIES], [AC_REQUIRE([AM_SET_DEPDIR])dnl AC_REQUIRE([AM_OUTPUT_DEPENDENCY_COMMANDS])dnl AC_REQUIRE([AM_MAKE_INCLUDE])dnl AC_REQUIRE([AM_DEP_TRACK])dnl m4_if([$1], [CC], [depcc="$CC" am_compiler_list=], [$1], [CXX], [depcc="$CXX" am_compiler_list=], [$1], [OBJC], [depcc="$OBJC" am_compiler_list='gcc3 gcc'], [$1], [OBJCXX], [depcc="$OBJCXX" am_compiler_list='gcc3 gcc'], [$1], [UPC], [depcc="$UPC" am_compiler_list=], [$1], [GCJ], [depcc="$GCJ" am_compiler_list='gcc3 gcc'], [depcc="$$1" am_compiler_list=]) AC_CACHE_CHECK([dependency style of $depcc], [am_cv_$1_dependencies_compiler_type], [if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up # making a dummy file named 'D' -- because '-MD' means "put the output # in D". rm -rf conftest.dir mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. cp "$am_depcomp" conftest.dir cd conftest.dir # We will build objects and dependencies in a subdirectory because # it helps to detect inapplicable dependency modes. For instance # both Tru64's cc and ICC support -MD to output dependencies as a # side effect of compilation, but ICC will put the dependencies in # the current directory while Tru64 will put them in the object # directory. mkdir sub am_cv_$1_dependencies_compiler_type=none if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n ['s/^#*\([a-zA-Z0-9]*\))$/\1/p'] < ./depcomp` fi am__universal=false m4_case([$1], [CC], [case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac], [CXX], [case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac]) for depmode in $am_compiler_list; do # Setup a source with many dependencies, because some compilers # like to wrap large dependency lists on column 80 (with \), and # we should not choose a depcomp mode which is confused by this. # # We need to recreate these files for each test, as the compiler may # overwrite some of them when testing with obscure command lines. # This happens at least with the AIX C compiler. : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with # Solaris 10 /bin/sh. echo '/* dummy */' > sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf # We check with '-c' and '-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly # handle '-M -o', and we need to detect this. Also, some Intel # versions had trouble with output in subdirs. am__obj=sub/conftest.${OBJEXT-o} am__minus_obj="-o $am__obj" case $depmode in gcc) # This depmode causes a compiler race in universal mode. test "$am__universal" = false || continue ;; nosideeffect) # After this tag, mechanisms are not by side-effect, so they'll # only be used when explicitly requested. if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; msvc7 | msvc7msys | msvisualcpp | msvcmsys) # This compiler won't grok '-c -o', but also, the minuso test has # not run yet. These depmodes are late enough in the game, and # so weak that their functioning should not be impacted. am__obj=conftest.${OBJEXT-o} am__minus_obj= ;; none) break ;; esac if depmode=$depmode \ source=sub/conftest.c object=$am__obj \ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ >/dev/null 2>conftest.err && grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && grep $am__obj sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then # icc doesn't choke on unknown options, it will just issue warnings # or remarks (even with -Werror). So we grep stderr for any message # that says an option was ignored or not supported. # When given -MP, icc 7.0 and 7.1 complain thusly: # icc: Command line warning: ignoring option '-M'; no argument required # The diagnosis changed in icc 8.0: # icc: Command line remark: option '-MP' not supported if (grep 'ignoring option' conftest.err || grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else am_cv_$1_dependencies_compiler_type=$depmode break fi fi done cd .. rm -rf conftest.dir else am_cv_$1_dependencies_compiler_type=none fi ]) AC_SUBST([$1DEPMODE], [depmode=$am_cv_$1_dependencies_compiler_type]) AM_CONDITIONAL([am__fastdep$1], [ test "x$enable_dependency_tracking" != xno \ && test "$am_cv_$1_dependencies_compiler_type" = gcc3]) ]) # AM_SET_DEPDIR # ------------- # Choose a directory name for dependency files. # This macro is AC_REQUIREd in _AM_DEPENDENCIES. AC_DEFUN([AM_SET_DEPDIR], [AC_REQUIRE([AM_SET_LEADING_DOT])dnl AC_SUBST([DEPDIR], ["${am__leading_dot}deps"])dnl ]) # AM_DEP_TRACK # ------------ AC_DEFUN([AM_DEP_TRACK], [AC_ARG_ENABLE([dependency-tracking], [dnl AS_HELP_STRING( [--enable-dependency-tracking], [do not reject slow dependency extractors]) AS_HELP_STRING( [--disable-dependency-tracking], [speeds up one-time build])]) if test "x$enable_dependency_tracking" != xno; then am_depcomp="$ac_aux_dir/depcomp" AMDEPBACKSLASH='\' am__nodep='_no' fi AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno]) AC_SUBST([AMDEPBACKSLASH])dnl _AM_SUBST_NOTMAKE([AMDEPBACKSLASH])dnl AC_SUBST([am__nodep])dnl _AM_SUBST_NOTMAKE([am__nodep])dnl ]) # Generate code to set up dependency tracking. -*- Autoconf -*- # Copyright (C) 1999-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # _AM_OUTPUT_DEPENDENCY_COMMANDS # ------------------------------ AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS], [{ # Older Autoconf quotes --file arguments for eval, but not when files # are listed without --file. Let's play safe and only enable the eval # if we detect the quoting. case $CONFIG_FILES in *\'*) eval set x "$CONFIG_FILES" ;; *) set x $CONFIG_FILES ;; esac shift for mf do # Strip MF so we end up with the name of the file. mf=`echo "$mf" | sed -e 's/:.*$//'` # Check whether this is an Automake generated Makefile or not. # We used to match only the files named 'Makefile.in', but # some people rename them; so instead we look at the file content. # Grep'ing the first line is not enough: some people post-process # each Makefile.in and add a new line on top of each file to say so. # Grep'ing the whole file is not good either: AIX grep has a line # limit of 2048, but all sed's we know have understand at least 4000. if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then dirpart=`AS_DIRNAME("$mf")` else continue fi # Extract the definition of DEPDIR, am__include, and am__quote # from the Makefile without running 'make'. DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` test -z "$DEPDIR" && continue am__include=`sed -n 's/^am__include = //p' < "$mf"` test -z "$am__include" && continue am__quote=`sed -n 's/^am__quote = //p' < "$mf"` # Find all dependency output files, they are included files with # $(DEPDIR) in their names. We invoke sed twice because it is the # simplest approach to changing $(DEPDIR) to its actual value in the # expansion. for file in `sed -n " s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g'`; do # Make sure the directory exists. test -f "$dirpart/$file" && continue fdir=`AS_DIRNAME(["$file"])` AS_MKDIR_P([$dirpart/$fdir]) # echo "creating $dirpart/$file" echo '# dummy' > "$dirpart/$file" done done } ])# _AM_OUTPUT_DEPENDENCY_COMMANDS # AM_OUTPUT_DEPENDENCY_COMMANDS # ----------------------------- # This macro should only be invoked once -- use via AC_REQUIRE. # # This code is only required when automatic dependency tracking # is enabled. FIXME. This creates each '.P' file that we will # need in order to bootstrap the dependency handling code. AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS], [AC_CONFIG_COMMANDS([depfiles], [test x"$AMDEP_TRUE" != x"" || _AM_OUTPUT_DEPENDENCY_COMMANDS], [AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"]) ]) # Do all the work for Automake. -*- Autoconf -*- # Copyright (C) 1996-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This macro actually does too much. Some checks are only needed if # your package does certain things. But this isn't really a big deal. dnl Redefine AC_PROG_CC to automatically invoke _AM_PROG_CC_C_O. m4_define([AC_PROG_CC], m4_defn([AC_PROG_CC]) [_AM_PROG_CC_C_O ]) # AM_INIT_AUTOMAKE(PACKAGE, VERSION, [NO-DEFINE]) # AM_INIT_AUTOMAKE([OPTIONS]) # ----------------------------------------------- # The call with PACKAGE and VERSION arguments is the old style # call (pre autoconf-2.50), which is being phased out. PACKAGE # and VERSION should now be passed to AC_INIT and removed from # the call to AM_INIT_AUTOMAKE. # We support both call styles for the transition. After # the next Automake release, Autoconf can make the AC_INIT # arguments mandatory, and then we can depend on a new Autoconf # release and drop the old call support. AC_DEFUN([AM_INIT_AUTOMAKE], [AC_PREREQ([2.65])dnl dnl Autoconf wants to disallow AM_ names. We explicitly allow dnl the ones we care about. m4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl AC_REQUIRE([AM_SET_CURRENT_AUTOMAKE_VERSION])dnl AC_REQUIRE([AC_PROG_INSTALL])dnl if test "`cd $srcdir && pwd`" != "`pwd`"; then # Use -I$(srcdir) only when $(srcdir) != ., so that make's output # is not polluted with repeated "-I." AC_SUBST([am__isrc], [' -I$(srcdir)'])_AM_SUBST_NOTMAKE([am__isrc])dnl # test to see if srcdir already configured if test -f $srcdir/config.status; then AC_MSG_ERROR([source directory already configured; run "make distclean" there first]) fi fi # test whether we have cygpath if test -z "$CYGPATH_W"; then if (cygpath --version) >/dev/null 2>/dev/null; then CYGPATH_W='cygpath -w' else CYGPATH_W=echo fi fi AC_SUBST([CYGPATH_W]) # Define the identity of the package. dnl Distinguish between old-style and new-style calls. m4_ifval([$2], [AC_DIAGNOSE([obsolete], [$0: two- and three-arguments forms are deprecated.]) m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl AC_SUBST([PACKAGE], [$1])dnl AC_SUBST([VERSION], [$2])], [_AM_SET_OPTIONS([$1])dnl dnl Diagnose old-style AC_INIT with new-style AM_AUTOMAKE_INIT. m4_if( m4_ifdef([AC_PACKAGE_NAME], [ok]):m4_ifdef([AC_PACKAGE_VERSION], [ok]), [ok:ok],, [m4_fatal([AC_INIT should be called with package and version arguments])])dnl AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME'])dnl AC_SUBST([VERSION], ['AC_PACKAGE_VERSION'])])dnl _AM_IF_OPTION([no-define],, [AC_DEFINE_UNQUOTED([PACKAGE], ["$PACKAGE"], [Name of package]) AC_DEFINE_UNQUOTED([VERSION], ["$VERSION"], [Version number of package])])dnl # Some tools Automake needs. AC_REQUIRE([AM_SANITY_CHECK])dnl AC_REQUIRE([AC_ARG_PROGRAM])dnl AM_MISSING_PROG([ACLOCAL], [aclocal-${am__api_version}]) AM_MISSING_PROG([AUTOCONF], [autoconf]) AM_MISSING_PROG([AUTOMAKE], [automake-${am__api_version}]) AM_MISSING_PROG([AUTOHEADER], [autoheader]) AM_MISSING_PROG([MAKEINFO], [makeinfo]) AC_REQUIRE([AM_PROG_INSTALL_SH])dnl AC_REQUIRE([AM_PROG_INSTALL_STRIP])dnl AC_REQUIRE([AC_PROG_MKDIR_P])dnl # For better backward compatibility. To be removed once Automake 1.9.x # dies out for good. For more background, see: # # AC_SUBST([mkdir_p], ['$(MKDIR_P)']) # We need awk for the "check" target. The system "awk" is bad on # some platforms. AC_REQUIRE([AC_PROG_AWK])dnl AC_REQUIRE([AC_PROG_MAKE_SET])dnl AC_REQUIRE([AM_SET_LEADING_DOT])dnl _AM_IF_OPTION([tar-ustar], [_AM_PROG_TAR([ustar])], [_AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])], [_AM_PROG_TAR([v7])])]) _AM_IF_OPTION([no-dependencies],, [AC_PROVIDE_IFELSE([AC_PROG_CC], [_AM_DEPENDENCIES([CC])], [m4_define([AC_PROG_CC], m4_defn([AC_PROG_CC])[_AM_DEPENDENCIES([CC])])])dnl AC_PROVIDE_IFELSE([AC_PROG_CXX], [_AM_DEPENDENCIES([CXX])], [m4_define([AC_PROG_CXX], m4_defn([AC_PROG_CXX])[_AM_DEPENDENCIES([CXX])])])dnl AC_PROVIDE_IFELSE([AC_PROG_OBJC], [_AM_DEPENDENCIES([OBJC])], [m4_define([AC_PROG_OBJC], m4_defn([AC_PROG_OBJC])[_AM_DEPENDENCIES([OBJC])])])dnl AC_PROVIDE_IFELSE([AC_PROG_OBJCXX], [_AM_DEPENDENCIES([OBJCXX])], [m4_define([AC_PROG_OBJCXX], m4_defn([AC_PROG_OBJCXX])[_AM_DEPENDENCIES([OBJCXX])])])dnl ]) AC_REQUIRE([AM_SILENT_RULES])dnl dnl The testsuite driver may need to know about EXEEXT, so add the dnl 'am__EXEEXT' conditional if _AM_COMPILER_EXEEXT was seen. This dnl macro is hooked onto _AC_COMPILER_EXEEXT early, see below. AC_CONFIG_COMMANDS_PRE(dnl [m4_provide_if([_AM_COMPILER_EXEEXT], [AM_CONDITIONAL([am__EXEEXT], [test -n "$EXEEXT"])])])dnl # POSIX will say in a future version that running "rm -f" with no argument # is OK; and we want to be able to make that assumption in our Makefile # recipes. So use an aggressive probe to check that the usage we want is # actually supported "in the wild" to an acceptable degree. # See automake bug#10828. # To make any issue more visible, cause the running configure to be aborted # by default if the 'rm' program in use doesn't match our expectations; the # user can still override this though. if rm -f && rm -fr && rm -rf; then : OK; else cat >&2 <<'END' Oops! Your 'rm' program seems unable to run without file operands specified on the command line, even when the '-f' option is present. This is contrary to the behaviour of most rm programs out there, and not conforming with the upcoming POSIX standard: Please tell bug-automake@gnu.org about your system, including the value of your $PATH and any error possibly output before this message. This can help us improve future automake versions. END if test x"$ACCEPT_INFERIOR_RM_PROGRAM" = x"yes"; then echo 'Configuration will proceed anyway, since you have set the' >&2 echo 'ACCEPT_INFERIOR_RM_PROGRAM variable to "yes"' >&2 echo >&2 else cat >&2 <<'END' Aborting the configuration process, to ensure you take notice of the issue. You can download and install GNU coreutils to get an 'rm' implementation that behaves properly: . If you want to complete the configuration process using your problematic 'rm' anyway, export the environment variable ACCEPT_INFERIOR_RM_PROGRAM to "yes", and re-run configure. END AC_MSG_ERROR([Your 'rm' program is bad, sorry.]) fi fi ]) dnl Hook into '_AC_COMPILER_EXEEXT' early to learn its expansion. Do not dnl add the conditional right here, as _AC_COMPILER_EXEEXT may be further dnl mangled by Autoconf and run in a shell conditional statement. m4_define([_AC_COMPILER_EXEEXT], m4_defn([_AC_COMPILER_EXEEXT])[m4_provide([_AM_COMPILER_EXEEXT])]) # When config.status generates a header, we must update the stamp-h file. # This file resides in the same directory as the config header # that is generated. The stamp files are numbered to have different names. # Autoconf calls _AC_AM_CONFIG_HEADER_HOOK (when defined) in the # loop where config.status creates the headers, so we can generate # our stamp files there. AC_DEFUN([_AC_AM_CONFIG_HEADER_HOOK], [# Compute $1's index in $config_headers. _am_arg=$1 _am_stamp_count=1 for _am_header in $config_headers :; do case $_am_header in $_am_arg | $_am_arg:* ) break ;; * ) _am_stamp_count=`expr $_am_stamp_count + 1` ;; esac done echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_count]) # Copyright (C) 2001-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_PROG_INSTALL_SH # ------------------ # Define $install_sh. AC_DEFUN([AM_PROG_INSTALL_SH], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl if test x"${install_sh}" != xset; then case $am_aux_dir in *\ * | *\ *) install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; *) install_sh="\${SHELL} $am_aux_dir/install-sh" esac fi AC_SUBST([install_sh])]) # Copyright (C) 2003-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # Check whether the underlying file-system supports filenames # with a leading dot. For instance MS-DOS doesn't. AC_DEFUN([AM_SET_LEADING_DOT], [rm -rf .tst 2>/dev/null mkdir .tst 2>/dev/null if test -d .tst; then am__leading_dot=. else am__leading_dot=_ fi rmdir .tst 2>/dev/null AC_SUBST([am__leading_dot])]) # Add --enable-maintainer-mode option to configure. -*- Autoconf -*- # From Jim Meyering # Copyright (C) 1996-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_MAINTAINER_MODE([DEFAULT-MODE]) # ---------------------------------- # Control maintainer-specific portions of Makefiles. # Default is to disable them, unless 'enable' is passed literally. # For symmetry, 'disable' may be passed as well. Anyway, the user # can override the default with the --enable/--disable switch. AC_DEFUN([AM_MAINTAINER_MODE], [m4_case(m4_default([$1], [disable]), [enable], [m4_define([am_maintainer_other], [disable])], [disable], [m4_define([am_maintainer_other], [enable])], [m4_define([am_maintainer_other], [enable]) m4_warn([syntax], [unexpected argument to AM@&t@_MAINTAINER_MODE: $1])]) AC_MSG_CHECKING([whether to enable maintainer-specific portions of Makefiles]) dnl maintainer-mode's default is 'disable' unless 'enable' is passed AC_ARG_ENABLE([maintainer-mode], [AS_HELP_STRING([--]am_maintainer_other[-maintainer-mode], am_maintainer_other[ make rules and dependencies not useful (and sometimes confusing) to the casual installer])], [USE_MAINTAINER_MODE=$enableval], [USE_MAINTAINER_MODE=]m4_if(am_maintainer_other, [enable], [no], [yes])) AC_MSG_RESULT([$USE_MAINTAINER_MODE]) AM_CONDITIONAL([MAINTAINER_MODE], [test $USE_MAINTAINER_MODE = yes]) MAINT=$MAINTAINER_MODE_TRUE AC_SUBST([MAINT])dnl ] ) # Check to see how 'make' treats includes. -*- Autoconf -*- # Copyright (C) 2001-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_MAKE_INCLUDE() # ----------------- # Check to see how make treats includes. AC_DEFUN([AM_MAKE_INCLUDE], [am_make=${MAKE-make} cat > confinc << 'END' am__doit: @echo this is the am__doit target .PHONY: am__doit END # If we don't find an include directive, just comment out the code. AC_MSG_CHECKING([for style of include used by $am_make]) am__include="#" am__quote= _am_result=none # First try GNU make style include. echo "include confinc" > confmf # Ignore all kinds of additional output from 'make'. case `$am_make -s -f confmf 2> /dev/null` in #( *the\ am__doit\ target*) am__include=include am__quote= _am_result=GNU ;; esac # Now try BSD make style include. if test "$am__include" = "#"; then echo '.include "confinc"' > confmf case `$am_make -s -f confmf 2> /dev/null` in #( *the\ am__doit\ target*) am__include=.include am__quote="\"" _am_result=BSD ;; esac fi AC_SUBST([am__include]) AC_SUBST([am__quote]) AC_MSG_RESULT([$_am_result]) rm -f confinc confmf ]) # Fake the existence of programs that GNU maintainers use. -*- Autoconf -*- # Copyright (C) 1997-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_MISSING_PROG(NAME, PROGRAM) # ------------------------------ AC_DEFUN([AM_MISSING_PROG], [AC_REQUIRE([AM_MISSING_HAS_RUN]) $1=${$1-"${am_missing_run}$2"} AC_SUBST($1)]) # AM_MISSING_HAS_RUN # ------------------ # Define MISSING if not defined so far and test if it is modern enough. # If it is, set am_missing_run to use it, otherwise, to nothing. AC_DEFUN([AM_MISSING_HAS_RUN], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl AC_REQUIRE_AUX_FILE([missing])dnl if test x"${MISSING+set}" != xset; then case $am_aux_dir in *\ * | *\ *) MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;; *) MISSING="\${SHELL} $am_aux_dir/missing" ;; esac fi # Use eval to expand $SHELL if eval "$MISSING --is-lightweight"; then am_missing_run="$MISSING " else am_missing_run= AC_MSG_WARN(['missing' script is too old or missing]) fi ]) # Helper functions for option handling. -*- Autoconf -*- # Copyright (C) 2001-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # _AM_MANGLE_OPTION(NAME) # ----------------------- AC_DEFUN([_AM_MANGLE_OPTION], [[_AM_OPTION_]m4_bpatsubst($1, [[^a-zA-Z0-9_]], [_])]) # _AM_SET_OPTION(NAME) # -------------------- # Set option NAME. Presently that only means defining a flag for this option. AC_DEFUN([_AM_SET_OPTION], [m4_define(_AM_MANGLE_OPTION([$1]), [1])]) # _AM_SET_OPTIONS(OPTIONS) # ------------------------ # OPTIONS is a space-separated list of Automake options. AC_DEFUN([_AM_SET_OPTIONS], [m4_foreach_w([_AM_Option], [$1], [_AM_SET_OPTION(_AM_Option)])]) # _AM_IF_OPTION(OPTION, IF-SET, [IF-NOT-SET]) # ------------------------------------------- # Execute IF-SET if OPTION is set, IF-NOT-SET otherwise. AC_DEFUN([_AM_IF_OPTION], [m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])]) # Copyright (C) 1999-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # _AM_PROG_CC_C_O # --------------- # Like AC_PROG_CC_C_O, but changed for automake. We rewrite AC_PROG_CC # to automatically call this. AC_DEFUN([_AM_PROG_CC_C_O], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl AC_REQUIRE_AUX_FILE([compile])dnl AC_LANG_PUSH([C])dnl AC_CACHE_CHECK( [whether $CC understands -c and -o together], [am_cv_prog_cc_c_o], [AC_LANG_CONFTEST([AC_LANG_PROGRAM([])]) # Make sure it works both with $CC and with simple cc. # Following AC_PROG_CC_C_O, we do the test twice because some # compilers refuse to overwrite an existing .o file with -o, # though they will create one. am_cv_prog_cc_c_o=yes for am_i in 1 2; do if AM_RUN_LOG([$CC -c conftest.$ac_ext -o conftest2.$ac_objext]) \ && test -f conftest2.$ac_objext; then : OK else am_cv_prog_cc_c_o=no break fi done rm -f core conftest* unset am_i]) if test "$am_cv_prog_cc_c_o" != yes; then # Losing compiler, so override with the script. # FIXME: It is wrong to rewrite CC. # But if we don't then we get into trouble of one sort or another. # A longer-term fix would be to have automake use am__CC in this case, # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)" CC="$am_aux_dir/compile $CC" fi AC_LANG_POP([C])]) # For backward compatibility. AC_DEFUN_ONCE([AM_PROG_CC_C_O], [AC_REQUIRE([AC_PROG_CC])]) # Copyright (C) 2001-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_RUN_LOG(COMMAND) # ------------------- # Run COMMAND, save the exit status in ac_status, and log it. # (This has been adapted from Autoconf's _AC_RUN_LOG macro.) AC_DEFUN([AM_RUN_LOG], [{ echo "$as_me:$LINENO: $1" >&AS_MESSAGE_LOG_FD ($1) >&AS_MESSAGE_LOG_FD 2>&AS_MESSAGE_LOG_FD ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD (exit $ac_status); }]) # Check to make sure that the build environment is sane. -*- Autoconf -*- # Copyright (C) 1996-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_SANITY_CHECK # --------------- AC_DEFUN([AM_SANITY_CHECK], [AC_MSG_CHECKING([whether build environment is sane]) # Reject unsafe characters in $srcdir or the absolute working directory # name. Accept space and tab only in the latter. am_lf=' ' case `pwd` in *[[\\\"\#\$\&\'\`$am_lf]]*) AC_MSG_ERROR([unsafe absolute working directory name]);; esac case $srcdir in *[[\\\"\#\$\&\'\`$am_lf\ \ ]]*) AC_MSG_ERROR([unsafe srcdir value: '$srcdir']);; esac # Do 'set' in a subshell so we don't clobber the current shell's # arguments. Must try -L first in case configure is actually a # symlink; some systems play weird games with the mod time of symlinks # (eg FreeBSD returns the mod time of the symlink's containing # directory). if ( am_has_slept=no for am_try in 1 2; do echo "timestamp, slept: $am_has_slept" > conftest.file set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` if test "$[*]" = "X"; then # -L didn't work. set X `ls -t "$srcdir/configure" conftest.file` fi if test "$[*]" != "X $srcdir/configure conftest.file" \ && test "$[*]" != "X conftest.file $srcdir/configure"; then # If neither matched, then we have a broken ls. This can happen # if, for instance, CONFIG_SHELL is bash and it inherits a # broken ls alias from the environment. This has actually # happened. Such a system could not be considered "sane". AC_MSG_ERROR([ls -t appears to fail. Make sure there is not a broken alias in your environment]) fi if test "$[2]" = conftest.file || test $am_try -eq 2; then break fi # Just in case. sleep 1 am_has_slept=yes done test "$[2]" = conftest.file ) then # Ok. : else AC_MSG_ERROR([newly created file is older than distributed files! Check your system clock]) fi AC_MSG_RESULT([yes]) # If we didn't sleep, we still need to ensure time stamps of config.status and # generated files are strictly newer. am_sleep_pid= if grep 'slept: no' conftest.file >/dev/null 2>&1; then ( sleep 1 ) & am_sleep_pid=$! fi AC_CONFIG_COMMANDS_PRE( [AC_MSG_CHECKING([that generated files are newer than configure]) if test -n "$am_sleep_pid"; then # Hide warnings about reused PIDs. wait $am_sleep_pid 2>/dev/null fi AC_MSG_RESULT([done])]) rm -f conftest.file ]) # Copyright (C) 2009-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_SILENT_RULES([DEFAULT]) # -------------------------- # Enable less verbose build rules; with the default set to DEFAULT # ("yes" being less verbose, "no" or empty being verbose). AC_DEFUN([AM_SILENT_RULES], [AC_ARG_ENABLE([silent-rules], [dnl AS_HELP_STRING( [--enable-silent-rules], [less verbose build output (undo: "make V=1")]) AS_HELP_STRING( [--disable-silent-rules], [verbose build output (undo: "make V=0")])dnl ]) case $enable_silent_rules in @%:@ ((( yes) AM_DEFAULT_VERBOSITY=0;; no) AM_DEFAULT_VERBOSITY=1;; *) AM_DEFAULT_VERBOSITY=m4_if([$1], [yes], [0], [1]);; esac dnl dnl A few 'make' implementations (e.g., NonStop OS and NextStep) dnl do not support nested variable expansions. dnl See automake bug#9928 and bug#10237. am_make=${MAKE-make} AC_CACHE_CHECK([whether $am_make supports nested variables], [am_cv_make_support_nested_variables], [if AS_ECHO([['TRUE=$(BAR$(V)) BAR0=false BAR1=true V=1 am__doit: @$(TRUE) .PHONY: am__doit']]) | $am_make -f - >/dev/null 2>&1; then am_cv_make_support_nested_variables=yes else am_cv_make_support_nested_variables=no fi]) if test $am_cv_make_support_nested_variables = yes; then dnl Using '$V' instead of '$(V)' breaks IRIX make. AM_V='$(V)' AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)' else AM_V=$AM_DEFAULT_VERBOSITY AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY fi AC_SUBST([AM_V])dnl AM_SUBST_NOTMAKE([AM_V])dnl AC_SUBST([AM_DEFAULT_V])dnl AM_SUBST_NOTMAKE([AM_DEFAULT_V])dnl AC_SUBST([AM_DEFAULT_VERBOSITY])dnl AM_BACKSLASH='\' AC_SUBST([AM_BACKSLASH])dnl _AM_SUBST_NOTMAKE([AM_BACKSLASH])dnl ]) # Copyright (C) 2001-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_PROG_INSTALL_STRIP # --------------------- # One issue with vendor 'install' (even GNU) is that you can't # specify the program used to strip binaries. This is especially # annoying in cross-compiling environments, where the build's strip # is unlikely to handle the host's binaries. # Fortunately install-sh will honor a STRIPPROG variable, so we # always use install-sh in "make install-strip", and initialize # STRIPPROG with the value of the STRIP variable (set by the user). AC_DEFUN([AM_PROG_INSTALL_STRIP], [AC_REQUIRE([AM_PROG_INSTALL_SH])dnl # Installed binaries are usually stripped using 'strip' when the user # run "make install-strip". However 'strip' might not be the right # tool to use in cross-compilation environments, therefore Automake # will honor the 'STRIP' environment variable to overrule this program. dnl Don't test for $cross_compiling = yes, because it might be 'maybe'. if test "$cross_compiling" != no; then AC_CHECK_TOOL([STRIP], [strip], :) fi INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" AC_SUBST([INSTALL_STRIP_PROGRAM])]) # Copyright (C) 2006-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # _AM_SUBST_NOTMAKE(VARIABLE) # --------------------------- # Prevent Automake from outputting VARIABLE = @VARIABLE@ in Makefile.in. # This macro is traced by Automake. AC_DEFUN([_AM_SUBST_NOTMAKE]) # AM_SUBST_NOTMAKE(VARIABLE) # -------------------------- # Public sister of _AM_SUBST_NOTMAKE. AC_DEFUN([AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE($@)]) # Check how to create a tarball. -*- Autoconf -*- # Copyright (C) 2004-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # _AM_PROG_TAR(FORMAT) # -------------------- # Check how to create a tarball in format FORMAT. # FORMAT should be one of 'v7', 'ustar', or 'pax'. # # Substitute a variable $(am__tar) that is a command # writing to stdout a FORMAT-tarball containing the directory # $tardir. # tardir=directory && $(am__tar) > result.tar # # Substitute a variable $(am__untar) that extract such # a tarball read from stdin. # $(am__untar) < result.tar # AC_DEFUN([_AM_PROG_TAR], [# Always define AMTAR for backward compatibility. Yes, it's still used # in the wild :-( We should find a proper way to deprecate it ... AC_SUBST([AMTAR], ['$${TAR-tar}']) # We'll loop over all known methods to create a tar archive until one works. _am_tools='gnutar m4_if([$1], [ustar], [plaintar]) pax cpio none' m4_if([$1], [v7], [am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -'], [m4_case([$1], [ustar], [# The POSIX 1988 'ustar' format is defined with fixed-size fields. # There is notably a 21 bits limit for the UID and the GID. In fact, # the 'pax' utility can hang on bigger UID/GID (see automake bug#8343 # and bug#13588). am_max_uid=2097151 # 2^21 - 1 am_max_gid=$am_max_uid # The $UID and $GID variables are not portable, so we need to resort # to the POSIX-mandated id(1) utility. Errors in the 'id' calls # below are definitely unexpected, so allow the users to see them # (that is, avoid stderr redirection). am_uid=`id -u || echo unknown` am_gid=`id -g || echo unknown` AC_MSG_CHECKING([whether UID '$am_uid' is supported by ustar format]) if test $am_uid -le $am_max_uid; then AC_MSG_RESULT([yes]) else AC_MSG_RESULT([no]) _am_tools=none fi AC_MSG_CHECKING([whether GID '$am_gid' is supported by ustar format]) if test $am_gid -le $am_max_gid; then AC_MSG_RESULT([yes]) else AC_MSG_RESULT([no]) _am_tools=none fi], [pax], [], [m4_fatal([Unknown tar format])]) AC_MSG_CHECKING([how to create a $1 tar archive]) # Go ahead even if we have the value already cached. We do so because we # need to set the values for the 'am__tar' and 'am__untar' variables. _am_tools=${am_cv_prog_tar_$1-$_am_tools} for _am_tool in $_am_tools; do case $_am_tool in gnutar) for _am_tar in tar gnutar gtar; do AM_RUN_LOG([$_am_tar --version]) && break done am__tar="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$$tardir"' am__tar_="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$tardir"' am__untar="$_am_tar -xf -" ;; plaintar) # Must skip GNU tar: if it does not support --format= it doesn't create # ustar tarball either. (tar --version) >/dev/null 2>&1 && continue am__tar='tar chf - "$$tardir"' am__tar_='tar chf - "$tardir"' am__untar='tar xf -' ;; pax) am__tar='pax -L -x $1 -w "$$tardir"' am__tar_='pax -L -x $1 -w "$tardir"' am__untar='pax -r' ;; cpio) am__tar='find "$$tardir" -print | cpio -o -H $1 -L' am__tar_='find "$tardir" -print | cpio -o -H $1 -L' am__untar='cpio -i -H $1 -d' ;; none) am__tar=false am__tar_=false am__untar=false ;; esac # If the value was cached, stop now. We just wanted to have am__tar # and am__untar set. test -n "${am_cv_prog_tar_$1}" && break # tar/untar a dummy directory, and stop if the command works. rm -rf conftest.dir mkdir conftest.dir echo GrepMe > conftest.dir/file AM_RUN_LOG([tardir=conftest.dir && eval $am__tar_ >conftest.tar]) rm -rf conftest.dir if test -s conftest.tar; then AM_RUN_LOG([$am__untar /dev/null 2>&1 && break fi done rm -rf conftest.dir AC_CACHE_VAL([am_cv_prog_tar_$1], [am_cv_prog_tar_$1=$_am_tool]) AC_MSG_RESULT([$am_cv_prog_tar_$1])]) AC_SUBST([am__tar]) AC_SUBST([am__untar]) ]) # _AM_PROG_TAR m4_include([m4/libtool.m4]) m4_include([m4/ltoptions.m4]) m4_include([m4/ltsugar.m4]) m4_include([m4/ltversion.m4]) m4_include([m4/lt~obsolete.m4]) dibbler-1.0.1/RelMessages/0000775000175000017500000000000012561700422012330 500000000000000dibbler-1.0.1/RelMessages/RelMsgRelayRepl.cpp0000664000175000017500000000357612233256142016001 00000000000000/* * Dibbler - a portable DHCPv6 * * authors: Tomasz Mrugalski * Marek Senderski * * released under GNU GPL v2 only licence * */ #include "Logger.h" #include "RelMsg.h" #include "RelMsgRelayRepl.h" #include "SmartPtr.h" int TRelMsgRelayRepl::getSize() { int pktsize=0; TOptList::iterator opt; for (opt = Options.begin(); opt!=Options.end(); ++opt) { pktsize += (*opt)->getSize(); } return pktsize + MIN_RELAYREPL_LEN; } TRelMsgRelayRepl::TRelMsgRelayRepl(int iface, SPtr addr, char * data, int dataLen) :TRelMsg(iface, addr, 0, 0) // 0,0 - avoid decoding anything { this->MsgType = RELAY_REPL_MSG; if (dataLen < MIN_RELAYREPL_LEN) { Log(Warning) << "Truncated RELAY_REPL message received." << LogEnd; return; } this->MsgType = data[0]; // ignored this->HopCount = data[1]; if (this->HopCount >= HOP_COUNT_LIMIT) { Log(Warning) << "RelayForw with hopLimit " << this->HopCount << " received (max. allowed is " << HOP_COUNT_LIMIT << ". Message dropped." << LogEnd; return; } this->LinkAddr = new TIPv6Addr(data+2, false); this->PeerAddr = new TIPv6Addr(data+18, false); data += 34; dataLen -= 34; // decode options this->decodeOpts(data, dataLen); } bool TRelMsgRelayRepl::check() { return true; } std::string TRelMsgRelayRepl::getName() const { return "RELAY_REPL"; } int TRelMsgRelayRepl::storeSelf(char * buffer) { char *start = buffer; *(buffer++) = (char)this->MsgType; *(buffer++) = (char)this->HopCount; this->LinkAddr->storeSelf(buffer); buffer += 16; this->PeerAddr->storeSelf(buffer); buffer += 16; TOptList::iterator option; for (option=Options.begin(); option!=Options.end(); ++option) { (*option)->storeSelf(buffer); buffer += (*option)->getSize(); } return buffer-start; } dibbler-1.0.1/RelMessages/RelMsgRelayRepl.h0000664000175000017500000000116412233256142015435 00000000000000/* * Dibbler - a portable DHCPv6 * * authors: Tomasz Mrugalski * Marek Senderski * * released under GNU GPL v2 only licence * */ class TRelMsgRelayRepl; #ifndef RELMSGRELAYREPL_H #define RELMSGRELAYREPL_H #include "RelMsg.h" #define MIN_RELAYREPL_LEN 34 class TRelMsgRelayRepl: public TRelMsg { public: TRelMsgRelayRepl(int iface, SPtr addr, char * data, int dataLen); int getSize(); int storeSelf(char * buffer); std::string getName() const; bool check(); private: SPtr PeerAddr; SPtr LinkAddr; }; #endif dibbler-1.0.1/RelMessages/RelMsg.cpp0000664000175000017500000000525712556515145014170 00000000000000/* * Dibbler - a portable DHCPv6 * * authors: Tomasz Mrugalski * Marek Senderski * * released under GNU GPL v2 only licence * */ #include "Portable.h" #include "Logger.h" #include "RelMsg.h" #include "OptDUID.h" #include "RelOptInterfaceID.h" #include "RelOptRelayMsg.h" #include "RelOptGeneric.h" //Constructor builds message on the basis of received message TRelMsg::TRelMsg(int iface, SPtr addr, char* data, int dataLen) :TMsg(iface, addr, data, dataLen), DestIface(0) { // data+=4, dataLen-=4 is modified in TMsg if (dataLen<=0) // avoid decoding of empty messages. return; this->HopCount = 0; this->decodeOpts(data, dataLen); } void TRelMsg::decodeOpts(char * buf, int bufSize) { int pos=0; SPtr ptr; while (posbufSize) { Log(Error) << "Message " << MsgType << " truncated. There are " << (bufSize-pos) << " bytes left to parse. Bytes ignored." << LogEnd; break; } unsigned short code = readUint16(buf+pos); pos += sizeof(uint16_t); unsigned short length = readUint16(buf+pos); pos += sizeof(uint16_t); if (pos+length>bufSize) { Log(Error) << "Invalid option (type=" << code << ", len=" << length << " received (msgtype=" << MsgType << "). Message dropped." << LogEnd; IsDone = true; return; } if (!allowOptInMsg(this->MsgType,code)) { Log(Warning) << "Option " << code << " not allowed in message type="<< MsgType <<". Ignoring." << LogEnd; pos+=length; continue; } if (!allowOptInOpt(this->MsgType,0,code)) { Log(Warning) <<"Option " << code << " can't be present in message (type=" << MsgType <<") directly. Ignoring." << LogEnd; pos+=length; continue; } ptr.reset(); switch (code) { case OPTION_RELAY_MSG: ptr = new TRelOptRelayMsg(buf+pos,length,this); break; case OPTION_INTERFACE_ID: ptr = new TRelOptInterfaceID(buf+pos,length,this); break; case OPTION_CLIENTID: ptr = new TOptDUID(code, buf+pos, length, this); break; default: ptr = new TRelOptGeneric(code, buf+pos, length, this); break; } if ( (ptr) && (ptr->isValid()) ) Options.push_back( ptr ); else Log(Warning) << "Option " << code << " is invalid. Option ignored." << LogEnd; pos+=length; } } void TRelMsg::setDestination(int iface, SPtr dest) { this->DestIface = iface; this->DestAddr = dest; } int TRelMsg::getDestIface() { return this->DestIface; } SPtr TRelMsg::getDestAddr() { return this->DestAddr; } int TRelMsg::getHopCount() { return this->HopCount; } dibbler-1.0.1/RelMessages/Makefile.am0000664000175000017500000000057212233256142014311 00000000000000noinst_LIBRARIES = libRelMessages.a libRelMessages_a_CPPFLAGS = -I$(top_srcdir)/Misc libRelMessages_a_CPPFLAGS += -I$(top_srcdir)/Messages libRelMessages_a_CPPFLAGS += -I$(top_srcdir)/Options -I$(top_srcdir)/RelOptions libRelMessages_a_SOURCES = RelMsg.cpp RelMsgGeneric.cpp RelMsgGeneric.h RelMsg.h RelMsgRelayForw.cpp RelMsgRelayForw.h RelMsgRelayRepl.cpp RelMsgRelayRepl.h dibbler-1.0.1/RelMessages/RelMsgGeneric.cpp0000664000175000017500000000234312233256142015445 00000000000000/* * Dibbler - a portable DHCPv6 * * authors: Tomasz Mrugalski * Marek Senderski * * released under GNU GPL v2 only licence * */ #include #include "RelMsgGeneric.h" using namespace std; TRelMsgGeneric::TRelMsgGeneric(int iface, SPtr addr, char * data, int dataLen) :TRelMsg(iface, addr, data, dataLen) { } bool TRelMsgGeneric::check() { return true; } std::string TRelMsgGeneric::getName() const { switch (this->MsgType) { case SOLICIT_MSG: return "SOLICIT"; case ADVERTISE_MSG: return "ADVERTISE"; case REQUEST_MSG: return "REQUEST"; case CONFIRM_MSG: return "CONFIRM"; case RENEW_MSG: return "RENEW"; case REBIND_MSG: return "REBIND"; case REPLY_MSG: return "REPLY"; case RELEASE_MSG: return "RELEASE"; case DECLINE_MSG: return "DECLINE"; case RECONFIGURE_MSG: return "RECONFIGURE"; case INFORMATION_REQUEST_MSG: return "INF-REQUEST"; case RELAY_FORW_MSG: return "RELAY_FORW"; case RELAY_REPL_MSG: return "RELAY_REPL"; default: return "UNKNOWN/GENERIC"; } } dibbler-1.0.1/RelMessages/RelMsgRelayForw.h0000664000175000017500000000116412233256142015450 00000000000000/* * Dibbler - a portable DHCPv6 * * authors: Tomasz Mrugalski * Marek Senderski * * released under GNU GPL v2 only licence * */ #ifndef RELMSGRELAYFORW_H #define RELMSGRELAYFORW_H #include "RelMsg.h" #include "IPv6Addr.h" #define MIN_RELAYFORW_LEN 34 class TRelMsgRelayForw: public TRelMsg { public: TRelMsgRelayForw(int iface, SPtr addr, char * data, int dataLen); std::string getName() const; bool check(); int storeSelf(char * buffer); int getSize(); private: SPtr PeerAddr; SPtr LinkAddr; }; #endif dibbler-1.0.1/RelMessages/RelMsg.h0000664000175000017500000000133112413230313013601 00000000000000/* * Dibbler - a portable DHCPv6 * * authors: Tomasz Mrugalski * Marek Senderski * * released under GNU GPL v2 only licence * */ class TRelMsg; #ifndef RELMSG_H #define RELMSG_H #include "Msg.h" class TRelMsg : public TMsg { public: TRelMsg(int iface, SPtr addr, char* data, int dataLen); virtual bool check() = 0; void setDestination(int ifindex, SPtr dest); int getDestIface(); SPtr getDestAddr(); void decodeOpts(char * data, int dataLen); int getHopCount(); protected: int DestIface; SPtr DestAddr; int HopCount; // mormal messages =0, RELAY_FORW, RELAY_REPL = (0..32) }; #endif dibbler-1.0.1/RelMessages/RelMsgGeneric.h0000664000175000017500000000067312233256142015116 00000000000000/* * Dibbler - a portable DHCPv6 * * authors: Tomasz Mrugalski * Marek Senderski * * released under GNU GPL v2 only licence * */ #ifndef RELMSGGENERIC_H #define RELMSGGENERIC_H #include "RelMsg.h" class TRelMsgGeneric: public TRelMsg { public: TRelMsgGeneric(int iface, SPtr addr, char * data, int dataLen); std::string getName() const; bool check(); }; #endif dibbler-1.0.1/RelMessages/Makefile.in0000664000175000017500000006647512561652535014352 00000000000000# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = RelMessages DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/depcomp ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/libtool.m4 \ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/include/dibbler-config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = LIBRARIES = $(noinst_LIBRARIES) ARFLAGS = cru AM_V_AR = $(am__v_AR_@AM_V@) am__v_AR_ = $(am__v_AR_@AM_DEFAULT_V@) am__v_AR_0 = @echo " AR " $@; am__v_AR_1 = libRelMessages_a_AR = $(AR) $(ARFLAGS) libRelMessages_a_LIBADD = am_libRelMessages_a_OBJECTS = libRelMessages_a-RelMsg.$(OBJEXT) \ libRelMessages_a-RelMsgGeneric.$(OBJEXT) \ libRelMessages_a-RelMsgRelayForw.$(OBJEXT) \ libRelMessages_a-RelMsgRelayRepl.$(OBJEXT) libRelMessages_a_OBJECTS = $(am_libRelMessages_a_OBJECTS) AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)/include depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) LTCXXCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CXXFLAGS) $(CXXFLAGS) AM_V_CXX = $(am__v_CXX_@AM_V@) am__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@) am__v_CXX_0 = @echo " CXX " $@; am__v_CXX_1 = CXXLD = $(CXX) CXXLINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \ $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CXXLD = $(am__v_CXXLD_@AM_V@) am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@) am__v_CXXLD_0 = @echo " CXXLD " $@; am__v_CXXLD_1 = COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(libRelMessages_a_SOURCES) DIST_SOURCES = $(libRelMessages_a_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALLOCA = @ALLOCA@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ ARCH = @ARCH@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ EXTRA_DIST_SUBDIRS = @EXTRA_DIST_SUBDIRS@ FGREP = @FGREP@ GREP = @GREP@ GTEST_INCLUDES = @GTEST_INCLUDES@ GTEST_LDADD = @GTEST_LDADD@ GTEST_LDFLAGS = @GTEST_LDFLAGS@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LINKPRINT = @LINKPRINT@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PORT_CFLAGS = @PORT_CFLAGS@ PORT_LDFLAGS = @PORT_LDFLAGS@ PORT_SUBDIR = @PORT_SUBDIR@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ subdirs = @subdirs@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ noinst_LIBRARIES = libRelMessages.a libRelMessages_a_CPPFLAGS = -I$(top_srcdir)/Misc \ -I$(top_srcdir)/Messages -I$(top_srcdir)/Options \ -I$(top_srcdir)/RelOptions libRelMessages_a_SOURCES = RelMsg.cpp RelMsgGeneric.cpp RelMsgGeneric.h RelMsg.h RelMsgRelayForw.cpp RelMsgRelayForw.h RelMsgRelayRepl.cpp RelMsgRelayRepl.h all: all-am .SUFFIXES: .SUFFIXES: .cpp .lo .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign RelMessages/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign RelMessages/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstLIBRARIES: -test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES) libRelMessages.a: $(libRelMessages_a_OBJECTS) $(libRelMessages_a_DEPENDENCIES) $(EXTRA_libRelMessages_a_DEPENDENCIES) $(AM_V_at)-rm -f libRelMessages.a $(AM_V_AR)$(libRelMessages_a_AR) libRelMessages.a $(libRelMessages_a_OBJECTS) $(libRelMessages_a_LIBADD) $(AM_V_at)$(RANLIB) libRelMessages.a mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libRelMessages_a-RelMsg.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libRelMessages_a-RelMsgGeneric.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libRelMessages_a-RelMsgRelayForw.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libRelMessages_a-RelMsgRelayRepl.Po@am__quote@ .cpp.o: @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $< .cpp.obj: @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .cpp.lo: @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LTCXXCOMPILE) -c -o $@ $< libRelMessages_a-RelMsg.o: RelMsg.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libRelMessages_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libRelMessages_a-RelMsg.o -MD -MP -MF $(DEPDIR)/libRelMessages_a-RelMsg.Tpo -c -o libRelMessages_a-RelMsg.o `test -f 'RelMsg.cpp' || echo '$(srcdir)/'`RelMsg.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libRelMessages_a-RelMsg.Tpo $(DEPDIR)/libRelMessages_a-RelMsg.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='RelMsg.cpp' object='libRelMessages_a-RelMsg.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libRelMessages_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libRelMessages_a-RelMsg.o `test -f 'RelMsg.cpp' || echo '$(srcdir)/'`RelMsg.cpp libRelMessages_a-RelMsg.obj: RelMsg.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libRelMessages_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libRelMessages_a-RelMsg.obj -MD -MP -MF $(DEPDIR)/libRelMessages_a-RelMsg.Tpo -c -o libRelMessages_a-RelMsg.obj `if test -f 'RelMsg.cpp'; then $(CYGPATH_W) 'RelMsg.cpp'; else $(CYGPATH_W) '$(srcdir)/RelMsg.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libRelMessages_a-RelMsg.Tpo $(DEPDIR)/libRelMessages_a-RelMsg.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='RelMsg.cpp' object='libRelMessages_a-RelMsg.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libRelMessages_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libRelMessages_a-RelMsg.obj `if test -f 'RelMsg.cpp'; then $(CYGPATH_W) 'RelMsg.cpp'; else $(CYGPATH_W) '$(srcdir)/RelMsg.cpp'; fi` libRelMessages_a-RelMsgGeneric.o: RelMsgGeneric.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libRelMessages_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libRelMessages_a-RelMsgGeneric.o -MD -MP -MF $(DEPDIR)/libRelMessages_a-RelMsgGeneric.Tpo -c -o libRelMessages_a-RelMsgGeneric.o `test -f 'RelMsgGeneric.cpp' || echo '$(srcdir)/'`RelMsgGeneric.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libRelMessages_a-RelMsgGeneric.Tpo $(DEPDIR)/libRelMessages_a-RelMsgGeneric.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='RelMsgGeneric.cpp' object='libRelMessages_a-RelMsgGeneric.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libRelMessages_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libRelMessages_a-RelMsgGeneric.o `test -f 'RelMsgGeneric.cpp' || echo '$(srcdir)/'`RelMsgGeneric.cpp libRelMessages_a-RelMsgGeneric.obj: RelMsgGeneric.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libRelMessages_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libRelMessages_a-RelMsgGeneric.obj -MD -MP -MF $(DEPDIR)/libRelMessages_a-RelMsgGeneric.Tpo -c -o libRelMessages_a-RelMsgGeneric.obj `if test -f 'RelMsgGeneric.cpp'; then $(CYGPATH_W) 'RelMsgGeneric.cpp'; else $(CYGPATH_W) '$(srcdir)/RelMsgGeneric.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libRelMessages_a-RelMsgGeneric.Tpo $(DEPDIR)/libRelMessages_a-RelMsgGeneric.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='RelMsgGeneric.cpp' object='libRelMessages_a-RelMsgGeneric.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libRelMessages_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libRelMessages_a-RelMsgGeneric.obj `if test -f 'RelMsgGeneric.cpp'; then $(CYGPATH_W) 'RelMsgGeneric.cpp'; else $(CYGPATH_W) '$(srcdir)/RelMsgGeneric.cpp'; fi` libRelMessages_a-RelMsgRelayForw.o: RelMsgRelayForw.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libRelMessages_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libRelMessages_a-RelMsgRelayForw.o -MD -MP -MF $(DEPDIR)/libRelMessages_a-RelMsgRelayForw.Tpo -c -o libRelMessages_a-RelMsgRelayForw.o `test -f 'RelMsgRelayForw.cpp' || echo '$(srcdir)/'`RelMsgRelayForw.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libRelMessages_a-RelMsgRelayForw.Tpo $(DEPDIR)/libRelMessages_a-RelMsgRelayForw.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='RelMsgRelayForw.cpp' object='libRelMessages_a-RelMsgRelayForw.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libRelMessages_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libRelMessages_a-RelMsgRelayForw.o `test -f 'RelMsgRelayForw.cpp' || echo '$(srcdir)/'`RelMsgRelayForw.cpp libRelMessages_a-RelMsgRelayForw.obj: RelMsgRelayForw.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libRelMessages_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libRelMessages_a-RelMsgRelayForw.obj -MD -MP -MF $(DEPDIR)/libRelMessages_a-RelMsgRelayForw.Tpo -c -o libRelMessages_a-RelMsgRelayForw.obj `if test -f 'RelMsgRelayForw.cpp'; then $(CYGPATH_W) 'RelMsgRelayForw.cpp'; else $(CYGPATH_W) '$(srcdir)/RelMsgRelayForw.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libRelMessages_a-RelMsgRelayForw.Tpo $(DEPDIR)/libRelMessages_a-RelMsgRelayForw.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='RelMsgRelayForw.cpp' object='libRelMessages_a-RelMsgRelayForw.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libRelMessages_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libRelMessages_a-RelMsgRelayForw.obj `if test -f 'RelMsgRelayForw.cpp'; then $(CYGPATH_W) 'RelMsgRelayForw.cpp'; else $(CYGPATH_W) '$(srcdir)/RelMsgRelayForw.cpp'; fi` libRelMessages_a-RelMsgRelayRepl.o: RelMsgRelayRepl.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libRelMessages_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libRelMessages_a-RelMsgRelayRepl.o -MD -MP -MF $(DEPDIR)/libRelMessages_a-RelMsgRelayRepl.Tpo -c -o libRelMessages_a-RelMsgRelayRepl.o `test -f 'RelMsgRelayRepl.cpp' || echo '$(srcdir)/'`RelMsgRelayRepl.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libRelMessages_a-RelMsgRelayRepl.Tpo $(DEPDIR)/libRelMessages_a-RelMsgRelayRepl.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='RelMsgRelayRepl.cpp' object='libRelMessages_a-RelMsgRelayRepl.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libRelMessages_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libRelMessages_a-RelMsgRelayRepl.o `test -f 'RelMsgRelayRepl.cpp' || echo '$(srcdir)/'`RelMsgRelayRepl.cpp libRelMessages_a-RelMsgRelayRepl.obj: RelMsgRelayRepl.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libRelMessages_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libRelMessages_a-RelMsgRelayRepl.obj -MD -MP -MF $(DEPDIR)/libRelMessages_a-RelMsgRelayRepl.Tpo -c -o libRelMessages_a-RelMsgRelayRepl.obj `if test -f 'RelMsgRelayRepl.cpp'; then $(CYGPATH_W) 'RelMsgRelayRepl.cpp'; else $(CYGPATH_W) '$(srcdir)/RelMsgRelayRepl.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libRelMessages_a-RelMsgRelayRepl.Tpo $(DEPDIR)/libRelMessages_a-RelMsgRelayRepl.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='RelMsgRelayRepl.cpp' object='libRelMessages_a-RelMsgRelayRepl.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libRelMessages_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libRelMessages_a-RelMsgRelayRepl.obj `if test -f 'RelMsgRelayRepl.cpp'; then $(CYGPATH_W) 'RelMsgRelayRepl.cpp'; else $(CYGPATH_W) '$(srcdir)/RelMsgRelayRepl.cpp'; fi` mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LIBRARIES) installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool clean-noinstLIBRARIES \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \ clean-libtool clean-noinstLIBRARIES cscopelist-am ctags \ ctags-am distclean distclean-compile distclean-generic \ distclean-libtool distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-dvi install-dvi-am install-exec \ install-exec-am install-html install-html-am install-info \ install-info-am install-man install-pdf install-pdf-am \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ tags tags-am uninstall uninstall-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: dibbler-1.0.1/RelMessages/RelMsgRelayForw.cpp0000664000175000017500000000406612233256142016007 00000000000000/* * Dibbler - a portable DHCPv6 * * authors: Tomasz Mrugalski * Marek Senderski * * released under GNU GPL v2 only licence * */ #include "Logger.h" #include "RelMsg.h" #include "RelMsgRelayForw.h" // --- options --- TRelMsgRelayForw::TRelMsgRelayForw(int iface, SPtr addr, char * data, int dataLen) :TRelMsg(iface, addr, 0, 0) // 0,0 - avoid decoding anything { this->MsgType = RELAY_FORW_MSG; if (dataLen < MIN_RELAYFORW_LEN) { Log(Warning) << "Truncated RELAY_FORW message received." << LogEnd; return; } this->MsgType = data[0]; // ignored this->HopCount = data[1]; if (this->HopCount >= HOP_COUNT_LIMIT) { Log(Warning) << "RelayForw with hopLimit " << this->HopCount << " received (max. allowed is " << HOP_COUNT_LIMIT << ". Message dropped." << LogEnd; return; } this->LinkAddr = new TIPv6Addr(data+2, false); this->PeerAddr = new TIPv6Addr(data+18, false); Log(Debug) << "Relaying RELAY_FORW with link:" << LinkAddr->getPlain() << ", peer:" << PeerAddr->getPlain() << " and hop count:" << this->HopCount << "." << LogEnd; data += 34; dataLen -= 34; // decode options this->decodeOpts(data, dataLen); } bool TRelMsgRelayForw::check() { return true; } std::string TRelMsgRelayForw::getName() const { return "RELAY_FORW"; } int TRelMsgRelayForw::storeSelf(char * buffer) { char *start = buffer; *(buffer++) = (char)this->MsgType; *(buffer++) = (char)this->HopCount; this->LinkAddr->storeSelf(buffer); buffer += 16; this->PeerAddr->storeSelf(buffer); buffer += 16; TOptList::iterator option; for (option=Options.begin(); option!=Options.end(); ++option) { (*option)->storeSelf(buffer); buffer += (*option)->getSize(); } return buffer-start; } int TRelMsgRelayForw::getSize() { int pktsize=0; TOptList::iterator opt; for (opt = Options.begin(); opt!=Options.end(); ++opt) { pktsize += (*opt)->getSize(); } return pktsize + MIN_RELAYFORW_LEN; } dibbler-1.0.1/m4/0000775000175000017500000000000012561700415010440 500000000000000dibbler-1.0.1/m4/libtool.m40000664000175000017500000105721612233256142012301 00000000000000# libtool.m4 - Configure libtool for the host system. -*-Autoconf-*- # # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, # 2006, 2007, 2008, 2009, 2010, 2011 Free Software # Foundation, Inc. # Written by Gordon Matzigkeit, 1996 # # This file is free software; the Free Software Foundation gives # unlimited permission to copy and/or distribute it, with or without # modifications, as long as this notice is preserved. m4_define([_LT_COPYING], [dnl # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, # 2006, 2007, 2008, 2009, 2010, 2011 Free Software # Foundation, Inc. # Written by Gordon Matzigkeit, 1996 # # This file is part of GNU Libtool. # # GNU Libtool is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License as # published by the Free Software Foundation; either version 2 of # the License, or (at your option) any later version. # # As a special exception to the GNU General Public License, # if you distribute this file as part of a program or library that # is built using GNU Libtool, you may include this file under the # same distribution terms that you use for the rest of that program. # # GNU Libtool is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with GNU Libtool; see the file COPYING. If not, a copy # can be downloaded from http://www.gnu.org/licenses/gpl.html, or # obtained by writing to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. ]) # serial 57 LT_INIT # LT_PREREQ(VERSION) # ------------------ # Complain and exit if this libtool version is less that VERSION. m4_defun([LT_PREREQ], [m4_if(m4_version_compare(m4_defn([LT_PACKAGE_VERSION]), [$1]), -1, [m4_default([$3], [m4_fatal([Libtool version $1 or higher is required], 63)])], [$2])]) # _LT_CHECK_BUILDDIR # ------------------ # Complain if the absolute build directory name contains unusual characters m4_defun([_LT_CHECK_BUILDDIR], [case `pwd` in *\ * | *\ *) AC_MSG_WARN([Libtool does not cope well with whitespace in `pwd`]) ;; esac ]) # LT_INIT([OPTIONS]) # ------------------ AC_DEFUN([LT_INIT], [AC_PREREQ([2.58])dnl We use AC_INCLUDES_DEFAULT AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT])dnl AC_BEFORE([$0], [LT_LANG])dnl AC_BEFORE([$0], [LT_OUTPUT])dnl AC_BEFORE([$0], [LTDL_INIT])dnl m4_require([_LT_CHECK_BUILDDIR])dnl dnl Autoconf doesn't catch unexpanded LT_ macros by default: m4_pattern_forbid([^_?LT_[A-Z_]+$])dnl m4_pattern_allow([^(_LT_EOF|LT_DLGLOBAL|LT_DLLAZY_OR_NOW|LT_MULTI_MODULE)$])dnl dnl aclocal doesn't pull ltoptions.m4, ltsugar.m4, or ltversion.m4 dnl unless we require an AC_DEFUNed macro: AC_REQUIRE([LTOPTIONS_VERSION])dnl AC_REQUIRE([LTSUGAR_VERSION])dnl AC_REQUIRE([LTVERSION_VERSION])dnl AC_REQUIRE([LTOBSOLETE_VERSION])dnl m4_require([_LT_PROG_LTMAIN])dnl _LT_SHELL_INIT([SHELL=${CONFIG_SHELL-/bin/sh}]) dnl Parse OPTIONS _LT_SET_OPTIONS([$0], [$1]) # This can be used to rebuild libtool when needed LIBTOOL_DEPS="$ltmain" # Always use our own libtool. LIBTOOL='$(SHELL) $(top_builddir)/libtool' AC_SUBST(LIBTOOL)dnl _LT_SETUP # Only expand once: m4_define([LT_INIT]) ])# LT_INIT # Old names: AU_ALIAS([AC_PROG_LIBTOOL], [LT_INIT]) AU_ALIAS([AM_PROG_LIBTOOL], [LT_INIT]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_PROG_LIBTOOL], []) dnl AC_DEFUN([AM_PROG_LIBTOOL], []) # _LT_CC_BASENAME(CC) # ------------------- # Calculate cc_basename. Skip known compiler wrappers and cross-prefix. m4_defun([_LT_CC_BASENAME], [for cc_temp in $1""; do case $cc_temp in compile | *[[\\/]]compile | ccache | *[[\\/]]ccache ) ;; distcc | *[[\\/]]distcc | purify | *[[\\/]]purify ) ;; \-*) ;; *) break;; esac done cc_basename=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"` ]) # _LT_FILEUTILS_DEFAULTS # ---------------------- # It is okay to use these file commands and assume they have been set # sensibly after `m4_require([_LT_FILEUTILS_DEFAULTS])'. m4_defun([_LT_FILEUTILS_DEFAULTS], [: ${CP="cp -f"} : ${MV="mv -f"} : ${RM="rm -f"} ])# _LT_FILEUTILS_DEFAULTS # _LT_SETUP # --------- m4_defun([_LT_SETUP], [AC_REQUIRE([AC_CANONICAL_HOST])dnl AC_REQUIRE([AC_CANONICAL_BUILD])dnl AC_REQUIRE([_LT_PREPARE_SED_QUOTE_VARS])dnl AC_REQUIRE([_LT_PROG_ECHO_BACKSLASH])dnl _LT_DECL([], [PATH_SEPARATOR], [1], [The PATH separator for the build system])dnl dnl _LT_DECL([], [host_alias], [0], [The host system])dnl _LT_DECL([], [host], [0])dnl _LT_DECL([], [host_os], [0])dnl dnl _LT_DECL([], [build_alias], [0], [The build system])dnl _LT_DECL([], [build], [0])dnl _LT_DECL([], [build_os], [0])dnl dnl AC_REQUIRE([AC_PROG_CC])dnl AC_REQUIRE([LT_PATH_LD])dnl AC_REQUIRE([LT_PATH_NM])dnl dnl AC_REQUIRE([AC_PROG_LN_S])dnl test -z "$LN_S" && LN_S="ln -s" _LT_DECL([], [LN_S], [1], [Whether we need soft or hard links])dnl dnl AC_REQUIRE([LT_CMD_MAX_LEN])dnl _LT_DECL([objext], [ac_objext], [0], [Object file suffix (normally "o")])dnl _LT_DECL([], [exeext], [0], [Executable file suffix (normally "")])dnl dnl m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_CHECK_SHELL_FEATURES])dnl m4_require([_LT_PATH_CONVERSION_FUNCTIONS])dnl m4_require([_LT_CMD_RELOAD])dnl m4_require([_LT_CHECK_MAGIC_METHOD])dnl m4_require([_LT_CHECK_SHAREDLIB_FROM_LINKLIB])dnl m4_require([_LT_CMD_OLD_ARCHIVE])dnl m4_require([_LT_CMD_GLOBAL_SYMBOLS])dnl m4_require([_LT_WITH_SYSROOT])dnl _LT_CONFIG_LIBTOOL_INIT([ # See if we are running on zsh, and set the options which allow our # commands through without removal of \ escapes INIT. if test -n "\${ZSH_VERSION+set}" ; then setopt NO_GLOB_SUBST fi ]) if test -n "${ZSH_VERSION+set}" ; then setopt NO_GLOB_SUBST fi _LT_CHECK_OBJDIR m4_require([_LT_TAG_COMPILER])dnl case $host_os in aix3*) # AIX sometimes has problems with the GCC collect2 program. For some # reason, if we set the COLLECT_NAMES environment variable, the problems # vanish in a puff of smoke. if test "X${COLLECT_NAMES+set}" != Xset; then COLLECT_NAMES= export COLLECT_NAMES fi ;; esac # Global variables: ofile=libtool can_build_shared=yes # All known linkers require a `.a' archive for static linking (except MSVC, # which needs '.lib'). libext=a with_gnu_ld="$lt_cv_prog_gnu_ld" old_CC="$CC" old_CFLAGS="$CFLAGS" # Set sane defaults for various variables test -z "$CC" && CC=cc test -z "$LTCC" && LTCC=$CC test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS test -z "$LD" && LD=ld test -z "$ac_objext" && ac_objext=o _LT_CC_BASENAME([$compiler]) # Only perform the check for file, if the check method requires it test -z "$MAGIC_CMD" && MAGIC_CMD=file case $deplibs_check_method in file_magic*) if test "$file_magic_cmd" = '$MAGIC_CMD'; then _LT_PATH_MAGIC fi ;; esac # Use C for the default configuration in the libtool script LT_SUPPORTED_TAG([CC]) _LT_LANG_C_CONFIG _LT_LANG_DEFAULT_CONFIG _LT_CONFIG_COMMANDS ])# _LT_SETUP # _LT_PREPARE_SED_QUOTE_VARS # -------------------------- # Define a few sed substitution that help us do robust quoting. m4_defun([_LT_PREPARE_SED_QUOTE_VARS], [# Backslashify metacharacters that are still active within # double-quoted strings. sed_quote_subst='s/\([["`$\\]]\)/\\\1/g' # Same as above, but do not quote variable references. double_quote_subst='s/\([["`\\]]\)/\\\1/g' # Sed substitution to delay expansion of an escaped shell variable in a # double_quote_subst'ed string. delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g' # Sed substitution to delay expansion of an escaped single quote. delay_single_quote_subst='s/'\''/'\'\\\\\\\'\''/g' # Sed substitution to avoid accidental globbing in evaled expressions no_glob_subst='s/\*/\\\*/g' ]) # _LT_PROG_LTMAIN # --------------- # Note that this code is called both from `configure', and `config.status' # now that we use AC_CONFIG_COMMANDS to generate libtool. Notably, # `config.status' has no value for ac_aux_dir unless we are using Automake, # so we pass a copy along to make sure it has a sensible value anyway. m4_defun([_LT_PROG_LTMAIN], [m4_ifdef([AC_REQUIRE_AUX_FILE], [AC_REQUIRE_AUX_FILE([ltmain.sh])])dnl _LT_CONFIG_LIBTOOL_INIT([ac_aux_dir='$ac_aux_dir']) ltmain="$ac_aux_dir/ltmain.sh" ])# _LT_PROG_LTMAIN ## ------------------------------------- ## ## Accumulate code for creating libtool. ## ## ------------------------------------- ## # So that we can recreate a full libtool script including additional # tags, we accumulate the chunks of code to send to AC_CONFIG_COMMANDS # in macros and then make a single call at the end using the `libtool' # label. # _LT_CONFIG_LIBTOOL_INIT([INIT-COMMANDS]) # ---------------------------------------- # Register INIT-COMMANDS to be passed to AC_CONFIG_COMMANDS later. m4_define([_LT_CONFIG_LIBTOOL_INIT], [m4_ifval([$1], [m4_append([_LT_OUTPUT_LIBTOOL_INIT], [$1 ])])]) # Initialize. m4_define([_LT_OUTPUT_LIBTOOL_INIT]) # _LT_CONFIG_LIBTOOL([COMMANDS]) # ------------------------------ # Register COMMANDS to be passed to AC_CONFIG_COMMANDS later. m4_define([_LT_CONFIG_LIBTOOL], [m4_ifval([$1], [m4_append([_LT_OUTPUT_LIBTOOL_COMMANDS], [$1 ])])]) # Initialize. m4_define([_LT_OUTPUT_LIBTOOL_COMMANDS]) # _LT_CONFIG_SAVE_COMMANDS([COMMANDS], [INIT_COMMANDS]) # ----------------------------------------------------- m4_defun([_LT_CONFIG_SAVE_COMMANDS], [_LT_CONFIG_LIBTOOL([$1]) _LT_CONFIG_LIBTOOL_INIT([$2]) ]) # _LT_FORMAT_COMMENT([COMMENT]) # ----------------------------- # Add leading comment marks to the start of each line, and a trailing # full-stop to the whole comment if one is not present already. m4_define([_LT_FORMAT_COMMENT], [m4_ifval([$1], [ m4_bpatsubst([m4_bpatsubst([$1], [^ *], [# ])], [['`$\]], [\\\&])]m4_bmatch([$1], [[!?.]$], [], [.]) )]) ## ------------------------ ## ## FIXME: Eliminate VARNAME ## ## ------------------------ ## # _LT_DECL([CONFIGNAME], VARNAME, VALUE, [DESCRIPTION], [IS-TAGGED?]) # ------------------------------------------------------------------- # CONFIGNAME is the name given to the value in the libtool script. # VARNAME is the (base) name used in the configure script. # VALUE may be 0, 1 or 2 for a computed quote escaped value based on # VARNAME. Any other value will be used directly. m4_define([_LT_DECL], [lt_if_append_uniq([lt_decl_varnames], [$2], [, ], [lt_dict_add_subkey([lt_decl_dict], [$2], [libtool_name], [m4_ifval([$1], [$1], [$2])]) lt_dict_add_subkey([lt_decl_dict], [$2], [value], [$3]) m4_ifval([$4], [lt_dict_add_subkey([lt_decl_dict], [$2], [description], [$4])]) lt_dict_add_subkey([lt_decl_dict], [$2], [tagged?], [m4_ifval([$5], [yes], [no])])]) ]) # _LT_TAGDECL([CONFIGNAME], VARNAME, VALUE, [DESCRIPTION]) # -------------------------------------------------------- m4_define([_LT_TAGDECL], [_LT_DECL([$1], [$2], [$3], [$4], [yes])]) # lt_decl_tag_varnames([SEPARATOR], [VARNAME1...]) # ------------------------------------------------ m4_define([lt_decl_tag_varnames], [_lt_decl_filter([tagged?], [yes], $@)]) # _lt_decl_filter(SUBKEY, VALUE, [SEPARATOR], [VARNAME1..]) # --------------------------------------------------------- m4_define([_lt_decl_filter], [m4_case([$#], [0], [m4_fatal([$0: too few arguments: $#])], [1], [m4_fatal([$0: too few arguments: $#: $1])], [2], [lt_dict_filter([lt_decl_dict], [$1], [$2], [], lt_decl_varnames)], [3], [lt_dict_filter([lt_decl_dict], [$1], [$2], [$3], lt_decl_varnames)], [lt_dict_filter([lt_decl_dict], $@)])[]dnl ]) # lt_decl_quote_varnames([SEPARATOR], [VARNAME1...]) # -------------------------------------------------- m4_define([lt_decl_quote_varnames], [_lt_decl_filter([value], [1], $@)]) # lt_decl_dquote_varnames([SEPARATOR], [VARNAME1...]) # --------------------------------------------------- m4_define([lt_decl_dquote_varnames], [_lt_decl_filter([value], [2], $@)]) # lt_decl_varnames_tagged([SEPARATOR], [VARNAME1...]) # --------------------------------------------------- m4_define([lt_decl_varnames_tagged], [m4_assert([$# <= 2])dnl _$0(m4_quote(m4_default([$1], [[, ]])), m4_ifval([$2], [[$2]], [m4_dquote(lt_decl_tag_varnames)]), m4_split(m4_normalize(m4_quote(_LT_TAGS)), [ ]))]) m4_define([_lt_decl_varnames_tagged], [m4_ifval([$3], [lt_combine([$1], [$2], [_], $3)])]) # lt_decl_all_varnames([SEPARATOR], [VARNAME1...]) # ------------------------------------------------ m4_define([lt_decl_all_varnames], [_$0(m4_quote(m4_default([$1], [[, ]])), m4_if([$2], [], m4_quote(lt_decl_varnames), m4_quote(m4_shift($@))))[]dnl ]) m4_define([_lt_decl_all_varnames], [lt_join($@, lt_decl_varnames_tagged([$1], lt_decl_tag_varnames([[, ]], m4_shift($@))))dnl ]) # _LT_CONFIG_STATUS_DECLARE([VARNAME]) # ------------------------------------ # Quote a variable value, and forward it to `config.status' so that its # declaration there will have the same value as in `configure'. VARNAME # must have a single quote delimited value for this to work. m4_define([_LT_CONFIG_STATUS_DECLARE], [$1='`$ECHO "$][$1" | $SED "$delay_single_quote_subst"`']) # _LT_CONFIG_STATUS_DECLARATIONS # ------------------------------ # We delimit libtool config variables with single quotes, so when # we write them to config.status, we have to be sure to quote all # embedded single quotes properly. In configure, this macro expands # each variable declared with _LT_DECL (and _LT_TAGDECL) into: # # ='`$ECHO "$" | $SED "$delay_single_quote_subst"`' m4_defun([_LT_CONFIG_STATUS_DECLARATIONS], [m4_foreach([_lt_var], m4_quote(lt_decl_all_varnames), [m4_n([_LT_CONFIG_STATUS_DECLARE(_lt_var)])])]) # _LT_LIBTOOL_TAGS # ---------------- # Output comment and list of tags supported by the script m4_defun([_LT_LIBTOOL_TAGS], [_LT_FORMAT_COMMENT([The names of the tagged configurations supported by this script])dnl available_tags="_LT_TAGS"dnl ]) # _LT_LIBTOOL_DECLARE(VARNAME, [TAG]) # ----------------------------------- # Extract the dictionary values for VARNAME (optionally with TAG) and # expand to a commented shell variable setting: # # # Some comment about what VAR is for. # visible_name=$lt_internal_name m4_define([_LT_LIBTOOL_DECLARE], [_LT_FORMAT_COMMENT(m4_quote(lt_dict_fetch([lt_decl_dict], [$1], [description])))[]dnl m4_pushdef([_libtool_name], m4_quote(lt_dict_fetch([lt_decl_dict], [$1], [libtool_name])))[]dnl m4_case(m4_quote(lt_dict_fetch([lt_decl_dict], [$1], [value])), [0], [_libtool_name=[$]$1], [1], [_libtool_name=$lt_[]$1], [2], [_libtool_name=$lt_[]$1], [_libtool_name=lt_dict_fetch([lt_decl_dict], [$1], [value])])[]dnl m4_ifval([$2], [_$2])[]m4_popdef([_libtool_name])[]dnl ]) # _LT_LIBTOOL_CONFIG_VARS # ----------------------- # Produce commented declarations of non-tagged libtool config variables # suitable for insertion in the LIBTOOL CONFIG section of the `libtool' # script. Tagged libtool config variables (even for the LIBTOOL CONFIG # section) are produced by _LT_LIBTOOL_TAG_VARS. m4_defun([_LT_LIBTOOL_CONFIG_VARS], [m4_foreach([_lt_var], m4_quote(_lt_decl_filter([tagged?], [no], [], lt_decl_varnames)), [m4_n([_LT_LIBTOOL_DECLARE(_lt_var)])])]) # _LT_LIBTOOL_TAG_VARS(TAG) # ------------------------- m4_define([_LT_LIBTOOL_TAG_VARS], [m4_foreach([_lt_var], m4_quote(lt_decl_tag_varnames), [m4_n([_LT_LIBTOOL_DECLARE(_lt_var, [$1])])])]) # _LT_TAGVAR(VARNAME, [TAGNAME]) # ------------------------------ m4_define([_LT_TAGVAR], [m4_ifval([$2], [$1_$2], [$1])]) # _LT_CONFIG_COMMANDS # ------------------- # Send accumulated output to $CONFIG_STATUS. Thanks to the lists of # variables for single and double quote escaping we saved from calls # to _LT_DECL, we can put quote escaped variables declarations # into `config.status', and then the shell code to quote escape them in # for loops in `config.status'. Finally, any additional code accumulated # from calls to _LT_CONFIG_LIBTOOL_INIT is expanded. m4_defun([_LT_CONFIG_COMMANDS], [AC_PROVIDE_IFELSE([LT_OUTPUT], dnl If the libtool generation code has been placed in $CONFIG_LT, dnl instead of duplicating it all over again into config.status, dnl then we will have config.status run $CONFIG_LT later, so it dnl needs to know what name is stored there: [AC_CONFIG_COMMANDS([libtool], [$SHELL $CONFIG_LT || AS_EXIT(1)], [CONFIG_LT='$CONFIG_LT'])], dnl If the libtool generation code is destined for config.status, dnl expand the accumulated commands and init code now: [AC_CONFIG_COMMANDS([libtool], [_LT_OUTPUT_LIBTOOL_COMMANDS], [_LT_OUTPUT_LIBTOOL_COMMANDS_INIT])]) ])#_LT_CONFIG_COMMANDS # Initialize. m4_define([_LT_OUTPUT_LIBTOOL_COMMANDS_INIT], [ # The HP-UX ksh and POSIX shell print the target directory to stdout # if CDPATH is set. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH sed_quote_subst='$sed_quote_subst' double_quote_subst='$double_quote_subst' delay_variable_subst='$delay_variable_subst' _LT_CONFIG_STATUS_DECLARATIONS LTCC='$LTCC' LTCFLAGS='$LTCFLAGS' compiler='$compiler_DEFAULT' # A function that is used when there is no print builtin or printf. func_fallback_echo () { eval 'cat <<_LTECHO_EOF \$[]1 _LTECHO_EOF' } # Quote evaled strings. for var in lt_decl_all_varnames([[ \ ]], lt_decl_quote_varnames); do case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in *[[\\\\\\\`\\"\\\$]]*) eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED \\"\\\$sed_quote_subst\\"\\\`\\\\\\"" ;; *) eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" ;; esac done # Double-quote double-evaled strings. for var in lt_decl_all_varnames([[ \ ]], lt_decl_dquote_varnames); do case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in *[[\\\\\\\`\\"\\\$]]*) eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\"" ;; *) eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" ;; esac done _LT_OUTPUT_LIBTOOL_INIT ]) # _LT_GENERATED_FILE_INIT(FILE, [COMMENT]) # ------------------------------------ # Generate a child script FILE with all initialization necessary to # reuse the environment learned by the parent script, and make the # file executable. If COMMENT is supplied, it is inserted after the # `#!' sequence but before initialization text begins. After this # macro, additional text can be appended to FILE to form the body of # the child script. The macro ends with non-zero status if the # file could not be fully written (such as if the disk is full). m4_ifdef([AS_INIT_GENERATED], [m4_defun([_LT_GENERATED_FILE_INIT],[AS_INIT_GENERATED($@)])], [m4_defun([_LT_GENERATED_FILE_INIT], [m4_require([AS_PREPARE])]dnl [m4_pushdef([AS_MESSAGE_LOG_FD])]dnl [lt_write_fail=0 cat >$1 <<_ASEOF || lt_write_fail=1 #! $SHELL # Generated by $as_me. $2 SHELL=\${CONFIG_SHELL-$SHELL} export SHELL _ASEOF cat >>$1 <<\_ASEOF || lt_write_fail=1 AS_SHELL_SANITIZE _AS_PREPARE exec AS_MESSAGE_FD>&1 _ASEOF test $lt_write_fail = 0 && chmod +x $1[]dnl m4_popdef([AS_MESSAGE_LOG_FD])])])# _LT_GENERATED_FILE_INIT # LT_OUTPUT # --------- # This macro allows early generation of the libtool script (before # AC_OUTPUT is called), incase it is used in configure for compilation # tests. AC_DEFUN([LT_OUTPUT], [: ${CONFIG_LT=./config.lt} AC_MSG_NOTICE([creating $CONFIG_LT]) _LT_GENERATED_FILE_INIT(["$CONFIG_LT"], [# Run this file to recreate a libtool stub with the current configuration.]) cat >>"$CONFIG_LT" <<\_LTEOF lt_cl_silent=false exec AS_MESSAGE_LOG_FD>>config.log { echo AS_BOX([Running $as_me.]) } >&AS_MESSAGE_LOG_FD lt_cl_help="\ \`$as_me' creates a local libtool stub from the current configuration, for use in further configure time tests before the real libtool is generated. Usage: $[0] [[OPTIONS]] -h, --help print this help, then exit -V, --version print version number, then exit -q, --quiet do not print progress messages -d, --debug don't remove temporary files Report bugs to ." lt_cl_version="\ m4_ifset([AC_PACKAGE_NAME], [AC_PACKAGE_NAME ])config.lt[]dnl m4_ifset([AC_PACKAGE_VERSION], [ AC_PACKAGE_VERSION]) configured by $[0], generated by m4_PACKAGE_STRING. Copyright (C) 2011 Free Software Foundation, Inc. This config.lt script is free software; the Free Software Foundation gives unlimited permision to copy, distribute and modify it." while test $[#] != 0 do case $[1] in --version | --v* | -V ) echo "$lt_cl_version"; exit 0 ;; --help | --h* | -h ) echo "$lt_cl_help"; exit 0 ;; --debug | --d* | -d ) debug=: ;; --quiet | --q* | --silent | --s* | -q ) lt_cl_silent=: ;; -*) AC_MSG_ERROR([unrecognized option: $[1] Try \`$[0] --help' for more information.]) ;; *) AC_MSG_ERROR([unrecognized argument: $[1] Try \`$[0] --help' for more information.]) ;; esac shift done if $lt_cl_silent; then exec AS_MESSAGE_FD>/dev/null fi _LTEOF cat >>"$CONFIG_LT" <<_LTEOF _LT_OUTPUT_LIBTOOL_COMMANDS_INIT _LTEOF cat >>"$CONFIG_LT" <<\_LTEOF AC_MSG_NOTICE([creating $ofile]) _LT_OUTPUT_LIBTOOL_COMMANDS AS_EXIT(0) _LTEOF chmod +x "$CONFIG_LT" # configure is writing to config.log, but config.lt does its own redirection, # appending to config.log, which fails on DOS, as config.log is still kept # open by configure. Here we exec the FD to /dev/null, effectively closing # config.log, so it can be properly (re)opened and appended to by config.lt. lt_cl_success=: test "$silent" = yes && lt_config_lt_args="$lt_config_lt_args --quiet" exec AS_MESSAGE_LOG_FD>/dev/null $SHELL "$CONFIG_LT" $lt_config_lt_args || lt_cl_success=false exec AS_MESSAGE_LOG_FD>>config.log $lt_cl_success || AS_EXIT(1) ])# LT_OUTPUT # _LT_CONFIG(TAG) # --------------- # If TAG is the built-in tag, create an initial libtool script with a # default configuration from the untagged config vars. Otherwise add code # to config.status for appending the configuration named by TAG from the # matching tagged config vars. m4_defun([_LT_CONFIG], [m4_require([_LT_FILEUTILS_DEFAULTS])dnl _LT_CONFIG_SAVE_COMMANDS([ m4_define([_LT_TAG], m4_if([$1], [], [C], [$1]))dnl m4_if(_LT_TAG, [C], [ # See if we are running on zsh, and set the options which allow our # commands through without removal of \ escapes. if test -n "${ZSH_VERSION+set}" ; then setopt NO_GLOB_SUBST fi cfgfile="${ofile}T" trap "$RM \"$cfgfile\"; exit 1" 1 2 15 $RM "$cfgfile" cat <<_LT_EOF >> "$cfgfile" #! $SHELL # `$ECHO "$ofile" | sed 's%^.*/%%'` - Provide generalized library-building support services. # Generated automatically by $as_me ($PACKAGE$TIMESTAMP) $VERSION # Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: # NOTE: Changes made to this file will be lost: look at ltmain.sh. # _LT_COPYING _LT_LIBTOOL_TAGS # ### BEGIN LIBTOOL CONFIG _LT_LIBTOOL_CONFIG_VARS _LT_LIBTOOL_TAG_VARS # ### END LIBTOOL CONFIG _LT_EOF case $host_os in aix3*) cat <<\_LT_EOF >> "$cfgfile" # AIX sometimes has problems with the GCC collect2 program. For some # reason, if we set the COLLECT_NAMES environment variable, the problems # vanish in a puff of smoke. if test "X${COLLECT_NAMES+set}" != Xset; then COLLECT_NAMES= export COLLECT_NAMES fi _LT_EOF ;; esac _LT_PROG_LTMAIN # We use sed instead of cat because bash on DJGPP gets confused if # if finds mixed CR/LF and LF-only lines. Since sed operates in # text mode, it properly converts lines to CR/LF. This bash problem # is reportedly fixed, but why not run on old versions too? sed '$q' "$ltmain" >> "$cfgfile" \ || (rm -f "$cfgfile"; exit 1) _LT_PROG_REPLACE_SHELLFNS mv -f "$cfgfile" "$ofile" || (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile") chmod +x "$ofile" ], [cat <<_LT_EOF >> "$ofile" dnl Unfortunately we have to use $1 here, since _LT_TAG is not expanded dnl in a comment (ie after a #). # ### BEGIN LIBTOOL TAG CONFIG: $1 _LT_LIBTOOL_TAG_VARS(_LT_TAG) # ### END LIBTOOL TAG CONFIG: $1 _LT_EOF ])dnl /m4_if ], [m4_if([$1], [], [ PACKAGE='$PACKAGE' VERSION='$VERSION' TIMESTAMP='$TIMESTAMP' RM='$RM' ofile='$ofile'], []) ])dnl /_LT_CONFIG_SAVE_COMMANDS ])# _LT_CONFIG # LT_SUPPORTED_TAG(TAG) # --------------------- # Trace this macro to discover what tags are supported by the libtool # --tag option, using: # autoconf --trace 'LT_SUPPORTED_TAG:$1' AC_DEFUN([LT_SUPPORTED_TAG], []) # C support is built-in for now m4_define([_LT_LANG_C_enabled], []) m4_define([_LT_TAGS], []) # LT_LANG(LANG) # ------------- # Enable libtool support for the given language if not already enabled. AC_DEFUN([LT_LANG], [AC_BEFORE([$0], [LT_OUTPUT])dnl m4_case([$1], [C], [_LT_LANG(C)], [C++], [_LT_LANG(CXX)], [Go], [_LT_LANG(GO)], [Java], [_LT_LANG(GCJ)], [Fortran 77], [_LT_LANG(F77)], [Fortran], [_LT_LANG(FC)], [Windows Resource], [_LT_LANG(RC)], [m4_ifdef([_LT_LANG_]$1[_CONFIG], [_LT_LANG($1)], [m4_fatal([$0: unsupported language: "$1"])])])dnl ])# LT_LANG # _LT_LANG(LANGNAME) # ------------------ m4_defun([_LT_LANG], [m4_ifdef([_LT_LANG_]$1[_enabled], [], [LT_SUPPORTED_TAG([$1])dnl m4_append([_LT_TAGS], [$1 ])dnl m4_define([_LT_LANG_]$1[_enabled], [])dnl _LT_LANG_$1_CONFIG($1)])dnl ])# _LT_LANG m4_ifndef([AC_PROG_GO], [ ############################################################ # NOTE: This macro has been submitted for inclusion into # # GNU Autoconf as AC_PROG_GO. When it is available in # # a released version of Autoconf we should remove this # # macro and use it instead. # ############################################################ m4_defun([AC_PROG_GO], [AC_LANG_PUSH(Go)dnl AC_ARG_VAR([GOC], [Go compiler command])dnl AC_ARG_VAR([GOFLAGS], [Go compiler flags])dnl _AC_ARG_VAR_LDFLAGS()dnl AC_CHECK_TOOL(GOC, gccgo) if test -z "$GOC"; then if test -n "$ac_tool_prefix"; then AC_CHECK_PROG(GOC, [${ac_tool_prefix}gccgo], [${ac_tool_prefix}gccgo]) fi fi if test -z "$GOC"; then AC_CHECK_PROG(GOC, gccgo, gccgo, false) fi ])#m4_defun ])#m4_ifndef # _LT_LANG_DEFAULT_CONFIG # ----------------------- m4_defun([_LT_LANG_DEFAULT_CONFIG], [AC_PROVIDE_IFELSE([AC_PROG_CXX], [LT_LANG(CXX)], [m4_define([AC_PROG_CXX], defn([AC_PROG_CXX])[LT_LANG(CXX)])]) AC_PROVIDE_IFELSE([AC_PROG_F77], [LT_LANG(F77)], [m4_define([AC_PROG_F77], defn([AC_PROG_F77])[LT_LANG(F77)])]) AC_PROVIDE_IFELSE([AC_PROG_FC], [LT_LANG(FC)], [m4_define([AC_PROG_FC], defn([AC_PROG_FC])[LT_LANG(FC)])]) dnl The call to [A][M_PROG_GCJ] is quoted like that to stop aclocal dnl pulling things in needlessly. AC_PROVIDE_IFELSE([AC_PROG_GCJ], [LT_LANG(GCJ)], [AC_PROVIDE_IFELSE([A][M_PROG_GCJ], [LT_LANG(GCJ)], [AC_PROVIDE_IFELSE([LT_PROG_GCJ], [LT_LANG(GCJ)], [m4_ifdef([AC_PROG_GCJ], [m4_define([AC_PROG_GCJ], defn([AC_PROG_GCJ])[LT_LANG(GCJ)])]) m4_ifdef([A][M_PROG_GCJ], [m4_define([A][M_PROG_GCJ], defn([A][M_PROG_GCJ])[LT_LANG(GCJ)])]) m4_ifdef([LT_PROG_GCJ], [m4_define([LT_PROG_GCJ], defn([LT_PROG_GCJ])[LT_LANG(GCJ)])])])])]) AC_PROVIDE_IFELSE([AC_PROG_GO], [LT_LANG(GO)], [m4_define([AC_PROG_GO], defn([AC_PROG_GO])[LT_LANG(GO)])]) AC_PROVIDE_IFELSE([LT_PROG_RC], [LT_LANG(RC)], [m4_define([LT_PROG_RC], defn([LT_PROG_RC])[LT_LANG(RC)])]) ])# _LT_LANG_DEFAULT_CONFIG # Obsolete macros: AU_DEFUN([AC_LIBTOOL_CXX], [LT_LANG(C++)]) AU_DEFUN([AC_LIBTOOL_F77], [LT_LANG(Fortran 77)]) AU_DEFUN([AC_LIBTOOL_FC], [LT_LANG(Fortran)]) AU_DEFUN([AC_LIBTOOL_GCJ], [LT_LANG(Java)]) AU_DEFUN([AC_LIBTOOL_RC], [LT_LANG(Windows Resource)]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_CXX], []) dnl AC_DEFUN([AC_LIBTOOL_F77], []) dnl AC_DEFUN([AC_LIBTOOL_FC], []) dnl AC_DEFUN([AC_LIBTOOL_GCJ], []) dnl AC_DEFUN([AC_LIBTOOL_RC], []) # _LT_TAG_COMPILER # ---------------- m4_defun([_LT_TAG_COMPILER], [AC_REQUIRE([AC_PROG_CC])dnl _LT_DECL([LTCC], [CC], [1], [A C compiler])dnl _LT_DECL([LTCFLAGS], [CFLAGS], [1], [LTCC compiler flags])dnl _LT_TAGDECL([CC], [compiler], [1], [A language specific compiler])dnl _LT_TAGDECL([with_gcc], [GCC], [0], [Is the compiler the GNU compiler?])dnl # If no C compiler was specified, use CC. LTCC=${LTCC-"$CC"} # If no C compiler flags were specified, use CFLAGS. LTCFLAGS=${LTCFLAGS-"$CFLAGS"} # Allow CC to be a program name with arguments. compiler=$CC ])# _LT_TAG_COMPILER # _LT_COMPILER_BOILERPLATE # ------------------------ # Check for compiler boilerplate output or warnings with # the simple compiler test code. m4_defun([_LT_COMPILER_BOILERPLATE], [m4_require([_LT_DECL_SED])dnl ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" >conftest.$ac_ext eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_compiler_boilerplate=`cat conftest.err` $RM conftest* ])# _LT_COMPILER_BOILERPLATE # _LT_LINKER_BOILERPLATE # ---------------------- # Check for linker boilerplate output or warnings with # the simple link test code. m4_defun([_LT_LINKER_BOILERPLATE], [m4_require([_LT_DECL_SED])dnl ac_outfile=conftest.$ac_objext echo "$lt_simple_link_test_code" >conftest.$ac_ext eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_linker_boilerplate=`cat conftest.err` $RM -r conftest* ])# _LT_LINKER_BOILERPLATE # _LT_REQUIRED_DARWIN_CHECKS # ------------------------- m4_defun_once([_LT_REQUIRED_DARWIN_CHECKS],[ case $host_os in rhapsody* | darwin*) AC_CHECK_TOOL([DSYMUTIL], [dsymutil], [:]) AC_CHECK_TOOL([NMEDIT], [nmedit], [:]) AC_CHECK_TOOL([LIPO], [lipo], [:]) AC_CHECK_TOOL([OTOOL], [otool], [:]) AC_CHECK_TOOL([OTOOL64], [otool64], [:]) _LT_DECL([], [DSYMUTIL], [1], [Tool to manipulate archived DWARF debug symbol files on Mac OS X]) _LT_DECL([], [NMEDIT], [1], [Tool to change global to local symbols on Mac OS X]) _LT_DECL([], [LIPO], [1], [Tool to manipulate fat objects and archives on Mac OS X]) _LT_DECL([], [OTOOL], [1], [ldd/readelf like tool for Mach-O binaries on Mac OS X]) _LT_DECL([], [OTOOL64], [1], [ldd/readelf like tool for 64 bit Mach-O binaries on Mac OS X 10.4]) AC_CACHE_CHECK([for -single_module linker flag],[lt_cv_apple_cc_single_mod], [lt_cv_apple_cc_single_mod=no if test -z "${LT_MULTI_MODULE}"; then # By default we will add the -single_module flag. You can override # by either setting the environment variable LT_MULTI_MODULE # non-empty at configure time, or by adding -multi_module to the # link flags. rm -rf libconftest.dylib* echo "int foo(void){return 1;}" > conftest.c echo "$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ -dynamiclib -Wl,-single_module conftest.c" >&AS_MESSAGE_LOG_FD $LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ -dynamiclib -Wl,-single_module conftest.c 2>conftest.err _lt_result=$? # If there is a non-empty error log, and "single_module" # appears in it, assume the flag caused a linker warning if test -s conftest.err && $GREP single_module conftest.err; then cat conftest.err >&AS_MESSAGE_LOG_FD # Otherwise, if the output was created with a 0 exit code from # the compiler, it worked. elif test -f libconftest.dylib && test $_lt_result -eq 0; then lt_cv_apple_cc_single_mod=yes else cat conftest.err >&AS_MESSAGE_LOG_FD fi rm -rf libconftest.dylib* rm -f conftest.* fi]) AC_CACHE_CHECK([for -exported_symbols_list linker flag], [lt_cv_ld_exported_symbols_list], [lt_cv_ld_exported_symbols_list=no save_LDFLAGS=$LDFLAGS echo "_main" > conftest.sym LDFLAGS="$LDFLAGS -Wl,-exported_symbols_list,conftest.sym" AC_LINK_IFELSE([AC_LANG_PROGRAM([],[])], [lt_cv_ld_exported_symbols_list=yes], [lt_cv_ld_exported_symbols_list=no]) LDFLAGS="$save_LDFLAGS" ]) AC_CACHE_CHECK([for -force_load linker flag],[lt_cv_ld_force_load], [lt_cv_ld_force_load=no cat > conftest.c << _LT_EOF int forced_loaded() { return 2;} _LT_EOF echo "$LTCC $LTCFLAGS -c -o conftest.o conftest.c" >&AS_MESSAGE_LOG_FD $LTCC $LTCFLAGS -c -o conftest.o conftest.c 2>&AS_MESSAGE_LOG_FD echo "$AR cru libconftest.a conftest.o" >&AS_MESSAGE_LOG_FD $AR cru libconftest.a conftest.o 2>&AS_MESSAGE_LOG_FD echo "$RANLIB libconftest.a" >&AS_MESSAGE_LOG_FD $RANLIB libconftest.a 2>&AS_MESSAGE_LOG_FD cat > conftest.c << _LT_EOF int main() { return 0;} _LT_EOF echo "$LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a" >&AS_MESSAGE_LOG_FD $LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a 2>conftest.err _lt_result=$? if test -s conftest.err && $GREP force_load conftest.err; then cat conftest.err >&AS_MESSAGE_LOG_FD elif test -f conftest && test $_lt_result -eq 0 && $GREP forced_load conftest >/dev/null 2>&1 ; then lt_cv_ld_force_load=yes else cat conftest.err >&AS_MESSAGE_LOG_FD fi rm -f conftest.err libconftest.a conftest conftest.c rm -rf conftest.dSYM ]) case $host_os in rhapsody* | darwin1.[[012]]) _lt_dar_allow_undefined='${wl}-undefined ${wl}suppress' ;; darwin1.*) _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; darwin*) # darwin 5.x on # if running on 10.5 or later, the deployment target defaults # to the OS version, if on x86, and 10.4, the deployment # target defaults to 10.4. Don't you love it? case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in 10.0,*86*-darwin8*|10.0,*-darwin[[91]]*) _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;; 10.[[012]]*) _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; 10.*) _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;; esac ;; esac if test "$lt_cv_apple_cc_single_mod" = "yes"; then _lt_dar_single_mod='$single_module' fi if test "$lt_cv_ld_exported_symbols_list" = "yes"; then _lt_dar_export_syms=' ${wl}-exported_symbols_list,$output_objdir/${libname}-symbols.expsym' else _lt_dar_export_syms='~$NMEDIT -s $output_objdir/${libname}-symbols.expsym ${lib}' fi if test "$DSYMUTIL" != ":" && test "$lt_cv_ld_force_load" = "no"; then _lt_dsymutil='~$DSYMUTIL $lib || :' else _lt_dsymutil= fi ;; esac ]) # _LT_DARWIN_LINKER_FEATURES([TAG]) # --------------------------------- # Checks for linker and compiler features on darwin m4_defun([_LT_DARWIN_LINKER_FEATURES], [ m4_require([_LT_REQUIRED_DARWIN_CHECKS]) _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_automatic, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported if test "$lt_cv_ld_force_load" = "yes"; then _LT_TAGVAR(whole_archive_flag_spec, $1)='`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience ${wl}-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`' m4_case([$1], [F77], [_LT_TAGVAR(compiler_needs_object, $1)=yes], [FC], [_LT_TAGVAR(compiler_needs_object, $1)=yes]) else _LT_TAGVAR(whole_archive_flag_spec, $1)='' fi _LT_TAGVAR(link_all_deplibs, $1)=yes _LT_TAGVAR(allow_undefined_flag, $1)="$_lt_dar_allow_undefined" case $cc_basename in ifort*) _lt_dar_can_shared=yes ;; *) _lt_dar_can_shared=$GCC ;; esac if test "$_lt_dar_can_shared" = "yes"; then output_verbose_link_cmd=func_echo_all _LT_TAGVAR(archive_cmds, $1)="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}" _LT_TAGVAR(module_cmds, $1)="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}" _LT_TAGVAR(archive_expsym_cmds, $1)="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}" _LT_TAGVAR(module_expsym_cmds, $1)="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}" m4_if([$1], [CXX], [ if test "$lt_cv_apple_cc_single_mod" != "yes"; then _LT_TAGVAR(archive_cmds, $1)="\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dsymutil}" _LT_TAGVAR(archive_expsym_cmds, $1)="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dar_export_syms}${_lt_dsymutil}" fi ],[]) else _LT_TAGVAR(ld_shlibs, $1)=no fi ]) # _LT_SYS_MODULE_PATH_AIX([TAGNAME]) # ---------------------------------- # Links a minimal program and checks the executable # for the system default hardcoded library path. In most cases, # this is /usr/lib:/lib, but when the MPI compilers are used # the location of the communication and MPI libs are included too. # If we don't find anything, use the default library path according # to the aix ld manual. # Store the results from the different compilers for each TAGNAME. # Allow to override them for all tags through lt_cv_aix_libpath. m4_defun([_LT_SYS_MODULE_PATH_AIX], [m4_require([_LT_DECL_SED])dnl if test "${lt_cv_aix_libpath+set}" = set; then aix_libpath=$lt_cv_aix_libpath else AC_CACHE_VAL([_LT_TAGVAR([lt_cv_aix_libpath_], [$1])], [AC_LINK_IFELSE([AC_LANG_PROGRAM],[ lt_aix_libpath_sed='[ /Import File Strings/,/^$/ { /^0/ { s/^0 *\([^ ]*\) *$/\1/ p } }]' _LT_TAGVAR([lt_cv_aix_libpath_], [$1])=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` # Check for a 64-bit object if we didn't find anything. if test -z "$_LT_TAGVAR([lt_cv_aix_libpath_], [$1])"; then _LT_TAGVAR([lt_cv_aix_libpath_], [$1])=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` fi],[]) if test -z "$_LT_TAGVAR([lt_cv_aix_libpath_], [$1])"; then _LT_TAGVAR([lt_cv_aix_libpath_], [$1])="/usr/lib:/lib" fi ]) aix_libpath=$_LT_TAGVAR([lt_cv_aix_libpath_], [$1]) fi ])# _LT_SYS_MODULE_PATH_AIX # _LT_SHELL_INIT(ARG) # ------------------- m4_define([_LT_SHELL_INIT], [m4_divert_text([M4SH-INIT], [$1 ])])# _LT_SHELL_INIT # _LT_PROG_ECHO_BACKSLASH # ----------------------- # Find how we can fake an echo command that does not interpret backslash. # In particular, with Autoconf 2.60 or later we add some code to the start # of the generated configure script which will find a shell with a builtin # printf (which we can use as an echo command). m4_defun([_LT_PROG_ECHO_BACKSLASH], [ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO AC_MSG_CHECKING([how to print strings]) # Test print first, because it will be a builtin if present. if test "X`( print -r -- -n ) 2>/dev/null`" = X-n && \ test "X`print -r -- $ECHO 2>/dev/null`" = "X$ECHO"; then ECHO='print -r --' elif test "X`printf %s $ECHO 2>/dev/null`" = "X$ECHO"; then ECHO='printf %s\n' else # Use this function as a fallback that always works. func_fallback_echo () { eval 'cat <<_LTECHO_EOF $[]1 _LTECHO_EOF' } ECHO='func_fallback_echo' fi # func_echo_all arg... # Invoke $ECHO with all args, space-separated. func_echo_all () { $ECHO "$*" } case "$ECHO" in printf*) AC_MSG_RESULT([printf]) ;; print*) AC_MSG_RESULT([print -r]) ;; *) AC_MSG_RESULT([cat]) ;; esac m4_ifdef([_AS_DETECT_SUGGESTED], [_AS_DETECT_SUGGESTED([ test -n "${ZSH_VERSION+set}${BASH_VERSION+set}" || ( ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO PATH=/empty FPATH=/empty; export PATH FPATH test "X`printf %s $ECHO`" = "X$ECHO" \ || test "X`print -r -- $ECHO`" = "X$ECHO" )])]) _LT_DECL([], [SHELL], [1], [Shell to use when invoking shell scripts]) _LT_DECL([], [ECHO], [1], [An echo program that protects backslashes]) ])# _LT_PROG_ECHO_BACKSLASH # _LT_WITH_SYSROOT # ---------------- AC_DEFUN([_LT_WITH_SYSROOT], [AC_MSG_CHECKING([for sysroot]) AC_ARG_WITH([sysroot], [ --with-sysroot[=DIR] Search for dependent libraries within DIR (or the compiler's sysroot if not specified).], [], [with_sysroot=no]) dnl lt_sysroot will always be passed unquoted. We quote it here dnl in case the user passed a directory name. lt_sysroot= case ${with_sysroot} in #( yes) if test "$GCC" = yes; then lt_sysroot=`$CC --print-sysroot 2>/dev/null` fi ;; #( /*) lt_sysroot=`echo "$with_sysroot" | sed -e "$sed_quote_subst"` ;; #( no|'') ;; #( *) AC_MSG_RESULT([${with_sysroot}]) AC_MSG_ERROR([The sysroot must be an absolute path.]) ;; esac AC_MSG_RESULT([${lt_sysroot:-no}]) _LT_DECL([], [lt_sysroot], [0], [The root where to search for ]dnl [dependent libraries, and in which our libraries should be installed.])]) # _LT_ENABLE_LOCK # --------------- m4_defun([_LT_ENABLE_LOCK], [AC_ARG_ENABLE([libtool-lock], [AS_HELP_STRING([--disable-libtool-lock], [avoid locking (might break parallel builds)])]) test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes # Some flags need to be propagated to the compiler or linker for good # libtool support. case $host in ia64-*-hpux*) # Find out which ABI we are using. echo 'int i;' > conftest.$ac_ext if AC_TRY_EVAL(ac_compile); then case `/usr/bin/file conftest.$ac_objext` in *ELF-32*) HPUX_IA64_MODE="32" ;; *ELF-64*) HPUX_IA64_MODE="64" ;; esac fi rm -rf conftest* ;; *-*-irix6*) # Find out which ABI we are using. echo '[#]line '$LINENO' "configure"' > conftest.$ac_ext if AC_TRY_EVAL(ac_compile); then if test "$lt_cv_prog_gnu_ld" = yes; then case `/usr/bin/file conftest.$ac_objext` in *32-bit*) LD="${LD-ld} -melf32bsmip" ;; *N32*) LD="${LD-ld} -melf32bmipn32" ;; *64-bit*) LD="${LD-ld} -melf64bmip" ;; esac else case `/usr/bin/file conftest.$ac_objext` in *32-bit*) LD="${LD-ld} -32" ;; *N32*) LD="${LD-ld} -n32" ;; *64-bit*) LD="${LD-ld} -64" ;; esac fi fi rm -rf conftest* ;; x86_64-*kfreebsd*-gnu|x86_64-*linux*|ppc*-*linux*|powerpc*-*linux*| \ s390*-*linux*|s390*-*tpf*|sparc*-*linux*) # Find out which ABI we are using. echo 'int i;' > conftest.$ac_ext if AC_TRY_EVAL(ac_compile); then case `/usr/bin/file conftest.o` in *32-bit*) case $host in x86_64-*kfreebsd*-gnu) LD="${LD-ld} -m elf_i386_fbsd" ;; x86_64-*linux*) LD="${LD-ld} -m elf_i386" ;; ppc64-*linux*|powerpc64-*linux*) LD="${LD-ld} -m elf32ppclinux" ;; s390x-*linux*) LD="${LD-ld} -m elf_s390" ;; sparc64-*linux*) LD="${LD-ld} -m elf32_sparc" ;; esac ;; *64-bit*) case $host in x86_64-*kfreebsd*-gnu) LD="${LD-ld} -m elf_x86_64_fbsd" ;; x86_64-*linux*) LD="${LD-ld} -m elf_x86_64" ;; ppc*-*linux*|powerpc*-*linux*) LD="${LD-ld} -m elf64ppc" ;; s390*-*linux*|s390*-*tpf*) LD="${LD-ld} -m elf64_s390" ;; sparc*-*linux*) LD="${LD-ld} -m elf64_sparc" ;; esac ;; esac fi rm -rf conftest* ;; *-*-sco3.2v5*) # On SCO OpenServer 5, we need -belf to get full-featured binaries. SAVE_CFLAGS="$CFLAGS" CFLAGS="$CFLAGS -belf" AC_CACHE_CHECK([whether the C compiler needs -belf], lt_cv_cc_needs_belf, [AC_LANG_PUSH(C) AC_LINK_IFELSE([AC_LANG_PROGRAM([[]],[[]])],[lt_cv_cc_needs_belf=yes],[lt_cv_cc_needs_belf=no]) AC_LANG_POP]) if test x"$lt_cv_cc_needs_belf" != x"yes"; then # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf CFLAGS="$SAVE_CFLAGS" fi ;; *-*solaris*) # Find out which ABI we are using. echo 'int i;' > conftest.$ac_ext if AC_TRY_EVAL(ac_compile); then case `/usr/bin/file conftest.o` in *64-bit*) case $lt_cv_prog_gnu_ld in yes*) case $host in i?86-*-solaris*) LD="${LD-ld} -m elf_x86_64" ;; sparc*-*-solaris*) LD="${LD-ld} -m elf64_sparc" ;; esac # GNU ld 2.21 introduced _sol2 emulations. Use them if available. if ${LD-ld} -V | grep _sol2 >/dev/null 2>&1; then LD="${LD-ld}_sol2" fi ;; *) if ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then LD="${LD-ld} -64" fi ;; esac ;; esac fi rm -rf conftest* ;; esac need_locks="$enable_libtool_lock" ])# _LT_ENABLE_LOCK # _LT_PROG_AR # ----------- m4_defun([_LT_PROG_AR], [AC_CHECK_TOOLS(AR, [ar], false) : ${AR=ar} : ${AR_FLAGS=cru} _LT_DECL([], [AR], [1], [The archiver]) _LT_DECL([], [AR_FLAGS], [1], [Flags to create an archive]) AC_CACHE_CHECK([for archiver @FILE support], [lt_cv_ar_at_file], [lt_cv_ar_at_file=no AC_COMPILE_IFELSE([AC_LANG_PROGRAM], [echo conftest.$ac_objext > conftest.lst lt_ar_try='$AR $AR_FLAGS libconftest.a @conftest.lst >&AS_MESSAGE_LOG_FD' AC_TRY_EVAL([lt_ar_try]) if test "$ac_status" -eq 0; then # Ensure the archiver fails upon bogus file names. rm -f conftest.$ac_objext libconftest.a AC_TRY_EVAL([lt_ar_try]) if test "$ac_status" -ne 0; then lt_cv_ar_at_file=@ fi fi rm -f conftest.* libconftest.a ]) ]) if test "x$lt_cv_ar_at_file" = xno; then archiver_list_spec= else archiver_list_spec=$lt_cv_ar_at_file fi _LT_DECL([], [archiver_list_spec], [1], [How to feed a file listing to the archiver]) ])# _LT_PROG_AR # _LT_CMD_OLD_ARCHIVE # ------------------- m4_defun([_LT_CMD_OLD_ARCHIVE], [_LT_PROG_AR AC_CHECK_TOOL(STRIP, strip, :) test -z "$STRIP" && STRIP=: _LT_DECL([], [STRIP], [1], [A symbol stripping program]) AC_CHECK_TOOL(RANLIB, ranlib, :) test -z "$RANLIB" && RANLIB=: _LT_DECL([], [RANLIB], [1], [Commands used to install an old-style archive]) # Determine commands to create old-style static archives. old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs' old_postinstall_cmds='chmod 644 $oldlib' old_postuninstall_cmds= if test -n "$RANLIB"; then case $host_os in openbsd*) old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$tool_oldlib" ;; *) old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$tool_oldlib" ;; esac old_archive_cmds="$old_archive_cmds~\$RANLIB \$tool_oldlib" fi case $host_os in darwin*) lock_old_archive_extraction=yes ;; *) lock_old_archive_extraction=no ;; esac _LT_DECL([], [old_postinstall_cmds], [2]) _LT_DECL([], [old_postuninstall_cmds], [2]) _LT_TAGDECL([], [old_archive_cmds], [2], [Commands used to build an old-style archive]) _LT_DECL([], [lock_old_archive_extraction], [0], [Whether to use a lock for old archive extraction]) ])# _LT_CMD_OLD_ARCHIVE # _LT_COMPILER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS, # [OUTPUT-FILE], [ACTION-SUCCESS], [ACTION-FAILURE]) # ---------------------------------------------------------------- # Check whether the given compiler option works AC_DEFUN([_LT_COMPILER_OPTION], [m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_DECL_SED])dnl AC_CACHE_CHECK([$1], [$2], [$2=no m4_if([$4], , [ac_outfile=conftest.$ac_objext], [ac_outfile=$4]) echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="$3" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. # The option is referenced via a variable to avoid confusing sed. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&AS_MESSAGE_LOG_FD) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&AS_MESSAGE_LOG_FD echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings other than the usual output. $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then $2=yes fi fi $RM conftest* ]) if test x"[$]$2" = xyes; then m4_if([$5], , :, [$5]) else m4_if([$6], , :, [$6]) fi ])# _LT_COMPILER_OPTION # Old name: AU_ALIAS([AC_LIBTOOL_COMPILER_OPTION], [_LT_COMPILER_OPTION]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_COMPILER_OPTION], []) # _LT_LINKER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS, # [ACTION-SUCCESS], [ACTION-FAILURE]) # ---------------------------------------------------- # Check whether the given linker option works AC_DEFUN([_LT_LINKER_OPTION], [m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_DECL_SED])dnl AC_CACHE_CHECK([$1], [$2], [$2=no save_LDFLAGS="$LDFLAGS" LDFLAGS="$LDFLAGS $3" echo "$lt_simple_link_test_code" > conftest.$ac_ext if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then # The linker can only warn and ignore the option if not recognized # So say no if there are warnings if test -s conftest.err; then # Append any errors to the config.log. cat conftest.err 1>&AS_MESSAGE_LOG_FD $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if diff conftest.exp conftest.er2 >/dev/null; then $2=yes fi else $2=yes fi fi $RM -r conftest* LDFLAGS="$save_LDFLAGS" ]) if test x"[$]$2" = xyes; then m4_if([$4], , :, [$4]) else m4_if([$5], , :, [$5]) fi ])# _LT_LINKER_OPTION # Old name: AU_ALIAS([AC_LIBTOOL_LINKER_OPTION], [_LT_LINKER_OPTION]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_LINKER_OPTION], []) # LT_CMD_MAX_LEN #--------------- AC_DEFUN([LT_CMD_MAX_LEN], [AC_REQUIRE([AC_CANONICAL_HOST])dnl # find the maximum length of command line arguments AC_MSG_CHECKING([the maximum length of command line arguments]) AC_CACHE_VAL([lt_cv_sys_max_cmd_len], [dnl i=0 teststring="ABCD" case $build_os in msdosdjgpp*) # On DJGPP, this test can blow up pretty badly due to problems in libc # (any single argument exceeding 2000 bytes causes a buffer overrun # during glob expansion). Even if it were fixed, the result of this # check would be larger than it should be. lt_cv_sys_max_cmd_len=12288; # 12K is about right ;; gnu*) # Under GNU Hurd, this test is not required because there is # no limit to the length of command line arguments. # Libtool will interpret -1 as no limit whatsoever lt_cv_sys_max_cmd_len=-1; ;; cygwin* | mingw* | cegcc*) # On Win9x/ME, this test blows up -- it succeeds, but takes # about 5 minutes as the teststring grows exponentially. # Worse, since 9x/ME are not pre-emptively multitasking, # you end up with a "frozen" computer, even though with patience # the test eventually succeeds (with a max line length of 256k). # Instead, let's just punt: use the minimum linelength reported by # all of the supported platforms: 8192 (on NT/2K/XP). lt_cv_sys_max_cmd_len=8192; ;; mint*) # On MiNT this can take a long time and run out of memory. lt_cv_sys_max_cmd_len=8192; ;; amigaos*) # On AmigaOS with pdksh, this test takes hours, literally. # So we just punt and use a minimum line length of 8192. lt_cv_sys_max_cmd_len=8192; ;; netbsd* | freebsd* | openbsd* | darwin* | dragonfly*) # This has been around since 386BSD, at least. Likely further. if test -x /sbin/sysctl; then lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax` elif test -x /usr/sbin/sysctl; then lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax` else lt_cv_sys_max_cmd_len=65536 # usable default for all BSDs fi # And add a safety zone lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` ;; interix*) # We know the value 262144 and hardcode it with a safety zone (like BSD) lt_cv_sys_max_cmd_len=196608 ;; os2*) # The test takes a long time on OS/2. lt_cv_sys_max_cmd_len=8192 ;; osf*) # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not # nice to cause kernel panics so lets avoid the loop below. # First set a reasonable default. lt_cv_sys_max_cmd_len=16384 # if test -x /sbin/sysconfig; then case `/sbin/sysconfig -q proc exec_disable_arg_limit` in *1*) lt_cv_sys_max_cmd_len=-1 ;; esac fi ;; sco3.2v5*) lt_cv_sys_max_cmd_len=102400 ;; sysv5* | sco5v6* | sysv4.2uw2*) kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null` if test -n "$kargmax"; then lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[[ ]]//'` else lt_cv_sys_max_cmd_len=32768 fi ;; *) lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null` if test -n "$lt_cv_sys_max_cmd_len"; then lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` else # Make teststring a little bigger before we do anything with it. # a 1K string should be a reasonable start. for i in 1 2 3 4 5 6 7 8 ; do teststring=$teststring$teststring done SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}} # If test is not a shell built-in, we'll probably end up computing a # maximum length that is only half of the actual maximum length, but # we can't tell. while { test "X"`env echo "$teststring$teststring" 2>/dev/null` \ = "X$teststring$teststring"; } >/dev/null 2>&1 && test $i != 17 # 1/2 MB should be enough do i=`expr $i + 1` teststring=$teststring$teststring done # Only check the string length outside the loop. lt_cv_sys_max_cmd_len=`expr "X$teststring" : ".*" 2>&1` teststring= # Add a significant safety factor because C++ compilers can tack on # massive amounts of additional arguments before passing them to the # linker. It appears as though 1/2 is a usable value. lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2` fi ;; esac ]) if test -n $lt_cv_sys_max_cmd_len ; then AC_MSG_RESULT($lt_cv_sys_max_cmd_len) else AC_MSG_RESULT(none) fi max_cmd_len=$lt_cv_sys_max_cmd_len _LT_DECL([], [max_cmd_len], [0], [What is the maximum length of a command?]) ])# LT_CMD_MAX_LEN # Old name: AU_ALIAS([AC_LIBTOOL_SYS_MAX_CMD_LEN], [LT_CMD_MAX_LEN]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_SYS_MAX_CMD_LEN], []) # _LT_HEADER_DLFCN # ---------------- m4_defun([_LT_HEADER_DLFCN], [AC_CHECK_HEADERS([dlfcn.h], [], [], [AC_INCLUDES_DEFAULT])dnl ])# _LT_HEADER_DLFCN # _LT_TRY_DLOPEN_SELF (ACTION-IF-TRUE, ACTION-IF-TRUE-W-USCORE, # ACTION-IF-FALSE, ACTION-IF-CROSS-COMPILING) # ---------------------------------------------------------------- m4_defun([_LT_TRY_DLOPEN_SELF], [m4_require([_LT_HEADER_DLFCN])dnl if test "$cross_compiling" = yes; then : [$4] else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext <<_LT_EOF [#line $LINENO "configure" #include "confdefs.h" #if HAVE_DLFCN_H #include #endif #include #ifdef RTLD_GLOBAL # define LT_DLGLOBAL RTLD_GLOBAL #else # ifdef DL_GLOBAL # define LT_DLGLOBAL DL_GLOBAL # else # define LT_DLGLOBAL 0 # endif #endif /* We may have to define LT_DLLAZY_OR_NOW in the command line if we find out it does not work in some platform. */ #ifndef LT_DLLAZY_OR_NOW # ifdef RTLD_LAZY # define LT_DLLAZY_OR_NOW RTLD_LAZY # else # ifdef DL_LAZY # define LT_DLLAZY_OR_NOW DL_LAZY # else # ifdef RTLD_NOW # define LT_DLLAZY_OR_NOW RTLD_NOW # else # ifdef DL_NOW # define LT_DLLAZY_OR_NOW DL_NOW # else # define LT_DLLAZY_OR_NOW 0 # endif # endif # endif # endif #endif /* When -fvisbility=hidden is used, assume the code has been annotated correspondingly for the symbols needed. */ #if defined(__GNUC__) && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3)) int fnord () __attribute__((visibility("default"))); #endif int fnord () { return 42; } int main () { void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); int status = $lt_dlunknown; if (self) { if (dlsym (self,"fnord")) status = $lt_dlno_uscore; else { if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; else puts (dlerror ()); } /* dlclose (self); */ } else puts (dlerror ()); return status; }] _LT_EOF if AC_TRY_EVAL(ac_link) && test -s conftest${ac_exeext} 2>/dev/null; then (./conftest; exit; ) >&AS_MESSAGE_LOG_FD 2>/dev/null lt_status=$? case x$lt_status in x$lt_dlno_uscore) $1 ;; x$lt_dlneed_uscore) $2 ;; x$lt_dlunknown|x*) $3 ;; esac else : # compilation failed $3 fi fi rm -fr conftest* ])# _LT_TRY_DLOPEN_SELF # LT_SYS_DLOPEN_SELF # ------------------ AC_DEFUN([LT_SYS_DLOPEN_SELF], [m4_require([_LT_HEADER_DLFCN])dnl if test "x$enable_dlopen" != xyes; then enable_dlopen=unknown enable_dlopen_self=unknown enable_dlopen_self_static=unknown else lt_cv_dlopen=no lt_cv_dlopen_libs= case $host_os in beos*) lt_cv_dlopen="load_add_on" lt_cv_dlopen_libs= lt_cv_dlopen_self=yes ;; mingw* | pw32* | cegcc*) lt_cv_dlopen="LoadLibrary" lt_cv_dlopen_libs= ;; cygwin*) lt_cv_dlopen="dlopen" lt_cv_dlopen_libs= ;; darwin*) # if libdl is installed we need to link against it AC_CHECK_LIB([dl], [dlopen], [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"],[ lt_cv_dlopen="dyld" lt_cv_dlopen_libs= lt_cv_dlopen_self=yes ]) ;; *) AC_CHECK_FUNC([shl_load], [lt_cv_dlopen="shl_load"], [AC_CHECK_LIB([dld], [shl_load], [lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-ldld"], [AC_CHECK_FUNC([dlopen], [lt_cv_dlopen="dlopen"], [AC_CHECK_LIB([dl], [dlopen], [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"], [AC_CHECK_LIB([svld], [dlopen], [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld"], [AC_CHECK_LIB([dld], [dld_link], [lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-ldld"]) ]) ]) ]) ]) ]) ;; esac if test "x$lt_cv_dlopen" != xno; then enable_dlopen=yes else enable_dlopen=no fi case $lt_cv_dlopen in dlopen) save_CPPFLAGS="$CPPFLAGS" test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H" save_LDFLAGS="$LDFLAGS" wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\" save_LIBS="$LIBS" LIBS="$lt_cv_dlopen_libs $LIBS" AC_CACHE_CHECK([whether a program can dlopen itself], lt_cv_dlopen_self, [dnl _LT_TRY_DLOPEN_SELF( lt_cv_dlopen_self=yes, lt_cv_dlopen_self=yes, lt_cv_dlopen_self=no, lt_cv_dlopen_self=cross) ]) if test "x$lt_cv_dlopen_self" = xyes; then wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\" AC_CACHE_CHECK([whether a statically linked program can dlopen itself], lt_cv_dlopen_self_static, [dnl _LT_TRY_DLOPEN_SELF( lt_cv_dlopen_self_static=yes, lt_cv_dlopen_self_static=yes, lt_cv_dlopen_self_static=no, lt_cv_dlopen_self_static=cross) ]) fi CPPFLAGS="$save_CPPFLAGS" LDFLAGS="$save_LDFLAGS" LIBS="$save_LIBS" ;; esac case $lt_cv_dlopen_self in yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;; *) enable_dlopen_self=unknown ;; esac case $lt_cv_dlopen_self_static in yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;; *) enable_dlopen_self_static=unknown ;; esac fi _LT_DECL([dlopen_support], [enable_dlopen], [0], [Whether dlopen is supported]) _LT_DECL([dlopen_self], [enable_dlopen_self], [0], [Whether dlopen of programs is supported]) _LT_DECL([dlopen_self_static], [enable_dlopen_self_static], [0], [Whether dlopen of statically linked programs is supported]) ])# LT_SYS_DLOPEN_SELF # Old name: AU_ALIAS([AC_LIBTOOL_DLOPEN_SELF], [LT_SYS_DLOPEN_SELF]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_DLOPEN_SELF], []) # _LT_COMPILER_C_O([TAGNAME]) # --------------------------- # Check to see if options -c and -o are simultaneously supported by compiler. # This macro does not hard code the compiler like AC_PROG_CC_C_O. m4_defun([_LT_COMPILER_C_O], [m4_require([_LT_DECL_SED])dnl m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_TAG_COMPILER])dnl AC_CACHE_CHECK([if $compiler supports -c -o file.$ac_objext], [_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)], [_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=no $RM -r conftest 2>/dev/null mkdir conftest cd conftest mkdir out echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-o out/conftest2.$ac_objext" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&AS_MESSAGE_LOG_FD) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&AS_MESSAGE_LOG_FD echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then _LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes fi fi chmod u+w . 2>&AS_MESSAGE_LOG_FD $RM conftest* # SGI C++ compiler will create directory out/ii_files/ for # template instantiation test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files $RM out/* && rmdir out cd .. $RM -r conftest $RM conftest* ]) _LT_TAGDECL([compiler_c_o], [lt_cv_prog_compiler_c_o], [1], [Does compiler simultaneously support -c and -o options?]) ])# _LT_COMPILER_C_O # _LT_COMPILER_FILE_LOCKS([TAGNAME]) # ---------------------------------- # Check to see if we can do hard links to lock some files if needed m4_defun([_LT_COMPILER_FILE_LOCKS], [m4_require([_LT_ENABLE_LOCK])dnl m4_require([_LT_FILEUTILS_DEFAULTS])dnl _LT_COMPILER_C_O([$1]) hard_links="nottested" if test "$_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)" = no && test "$need_locks" != no; then # do not overwrite the value of need_locks provided by the user AC_MSG_CHECKING([if we can lock with hard links]) hard_links=yes $RM conftest* ln conftest.a conftest.b 2>/dev/null && hard_links=no touch conftest.a ln conftest.a conftest.b 2>&5 || hard_links=no ln conftest.a conftest.b 2>/dev/null && hard_links=no AC_MSG_RESULT([$hard_links]) if test "$hard_links" = no; then AC_MSG_WARN([`$CC' does not support `-c -o', so `make -j' may be unsafe]) need_locks=warn fi else need_locks=no fi _LT_DECL([], [need_locks], [1], [Must we lock files when doing compilation?]) ])# _LT_COMPILER_FILE_LOCKS # _LT_CHECK_OBJDIR # ---------------- m4_defun([_LT_CHECK_OBJDIR], [AC_CACHE_CHECK([for objdir], [lt_cv_objdir], [rm -f .libs 2>/dev/null mkdir .libs 2>/dev/null if test -d .libs; then lt_cv_objdir=.libs else # MS-DOS does not allow filenames that begin with a dot. lt_cv_objdir=_libs fi rmdir .libs 2>/dev/null]) objdir=$lt_cv_objdir _LT_DECL([], [objdir], [0], [The name of the directory that contains temporary libtool files])dnl m4_pattern_allow([LT_OBJDIR])dnl AC_DEFINE_UNQUOTED(LT_OBJDIR, "$lt_cv_objdir/", [Define to the sub-directory in which libtool stores uninstalled libraries.]) ])# _LT_CHECK_OBJDIR # _LT_LINKER_HARDCODE_LIBPATH([TAGNAME]) # -------------------------------------- # Check hardcoding attributes. m4_defun([_LT_LINKER_HARDCODE_LIBPATH], [AC_MSG_CHECKING([how to hardcode library paths into programs]) _LT_TAGVAR(hardcode_action, $1)= if test -n "$_LT_TAGVAR(hardcode_libdir_flag_spec, $1)" || test -n "$_LT_TAGVAR(runpath_var, $1)" || test "X$_LT_TAGVAR(hardcode_automatic, $1)" = "Xyes" ; then # We can hardcode non-existent directories. if test "$_LT_TAGVAR(hardcode_direct, $1)" != no && # If the only mechanism to avoid hardcoding is shlibpath_var, we # have to relink, otherwise we might link with an installed library # when we should be linking with a yet-to-be-installed one ## test "$_LT_TAGVAR(hardcode_shlibpath_var, $1)" != no && test "$_LT_TAGVAR(hardcode_minus_L, $1)" != no; then # Linking always hardcodes the temporary library directory. _LT_TAGVAR(hardcode_action, $1)=relink else # We can link without hardcoding, and we can hardcode nonexisting dirs. _LT_TAGVAR(hardcode_action, $1)=immediate fi else # We cannot hardcode anything, or else we can only hardcode existing # directories. _LT_TAGVAR(hardcode_action, $1)=unsupported fi AC_MSG_RESULT([$_LT_TAGVAR(hardcode_action, $1)]) if test "$_LT_TAGVAR(hardcode_action, $1)" = relink || test "$_LT_TAGVAR(inherit_rpath, $1)" = yes; then # Fast installation is not supported enable_fast_install=no elif test "$shlibpath_overrides_runpath" = yes || test "$enable_shared" = no; then # Fast installation is not necessary enable_fast_install=needless fi _LT_TAGDECL([], [hardcode_action], [0], [How to hardcode a shared library path into an executable]) ])# _LT_LINKER_HARDCODE_LIBPATH # _LT_CMD_STRIPLIB # ---------------- m4_defun([_LT_CMD_STRIPLIB], [m4_require([_LT_DECL_EGREP]) striplib= old_striplib= AC_MSG_CHECKING([whether stripping libraries is possible]) if test -n "$STRIP" && $STRIP -V 2>&1 | $GREP "GNU strip" >/dev/null; then test -z "$old_striplib" && old_striplib="$STRIP --strip-debug" test -z "$striplib" && striplib="$STRIP --strip-unneeded" AC_MSG_RESULT([yes]) else # FIXME - insert some real tests, host_os isn't really good enough case $host_os in darwin*) if test -n "$STRIP" ; then striplib="$STRIP -x" old_striplib="$STRIP -S" AC_MSG_RESULT([yes]) else AC_MSG_RESULT([no]) fi ;; *) AC_MSG_RESULT([no]) ;; esac fi _LT_DECL([], [old_striplib], [1], [Commands to strip libraries]) _LT_DECL([], [striplib], [1]) ])# _LT_CMD_STRIPLIB # _LT_SYS_DYNAMIC_LINKER([TAG]) # ----------------------------- # PORTME Fill in your ld.so characteristics m4_defun([_LT_SYS_DYNAMIC_LINKER], [AC_REQUIRE([AC_CANONICAL_HOST])dnl m4_require([_LT_DECL_EGREP])dnl m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_DECL_OBJDUMP])dnl m4_require([_LT_DECL_SED])dnl m4_require([_LT_CHECK_SHELL_FEATURES])dnl AC_MSG_CHECKING([dynamic linker characteristics]) m4_if([$1], [], [ if test "$GCC" = yes; then case $host_os in darwin*) lt_awk_arg="/^libraries:/,/LR/" ;; *) lt_awk_arg="/^libraries:/" ;; esac case $host_os in mingw* | cegcc*) lt_sed_strip_eq="s,=\([[A-Za-z]]:\),\1,g" ;; *) lt_sed_strip_eq="s,=/,/,g" ;; esac lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e $lt_sed_strip_eq` case $lt_search_path_spec in *\;*) # if the path contains ";" then we assume it to be the separator # otherwise default to the standard path separator (i.e. ":") - it is # assumed that no part of a normal pathname contains ";" but that should # okay in the real world where ";" in dirpaths is itself problematic. lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED 's/;/ /g'` ;; *) lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED "s/$PATH_SEPARATOR/ /g"` ;; esac # Ok, now we have the path, separated by spaces, we can step through it # and add multilib dir if necessary. lt_tmp_lt_search_path_spec= lt_multi_os_dir=`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null` for lt_sys_path in $lt_search_path_spec; do if test -d "$lt_sys_path/$lt_multi_os_dir"; then lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path/$lt_multi_os_dir" else test -d "$lt_sys_path" && \ lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path" fi done lt_search_path_spec=`$ECHO "$lt_tmp_lt_search_path_spec" | awk ' BEGIN {RS=" "; FS="/|\n";} { lt_foo=""; lt_count=0; for (lt_i = NF; lt_i > 0; lt_i--) { if ($lt_i != "" && $lt_i != ".") { if ($lt_i == "..") { lt_count++; } else { if (lt_count == 0) { lt_foo="/" $lt_i lt_foo; } else { lt_count--; } } } } if (lt_foo != "") { lt_freq[[lt_foo]]++; } if (lt_freq[[lt_foo]] == 1) { print lt_foo; } }'` # AWK program above erroneously prepends '/' to C:/dos/paths # for these hosts. case $host_os in mingw* | cegcc*) lt_search_path_spec=`$ECHO "$lt_search_path_spec" |\ $SED 's,/\([[A-Za-z]]:\),\1,g'` ;; esac sys_lib_search_path_spec=`$ECHO "$lt_search_path_spec" | $lt_NL2SP` else sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" fi]) library_names_spec= libname_spec='lib$name' soname_spec= shrext_cmds=".so" postinstall_cmds= postuninstall_cmds= finish_cmds= finish_eval= shlibpath_var= shlibpath_overrides_runpath=unknown version_type=none dynamic_linker="$host_os ld.so" sys_lib_dlsearch_path_spec="/lib /usr/lib" need_lib_prefix=unknown hardcode_into_libs=no # when you set need_version to no, make sure it does not cause -set_version # flags to be left without arguments need_version=unknown case $host_os in aix3*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a' shlibpath_var=LIBPATH # AIX 3 has no versioning support, so we append a major version to the name. soname_spec='${libname}${release}${shared_ext}$major' ;; aix[[4-9]]*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no hardcode_into_libs=yes if test "$host_cpu" = ia64; then # AIX 5 supports IA64 library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH else # With GCC up to 2.95.x, collect2 would create an import file # for dependence libraries. The import file would start with # the line `#! .'. This would cause the generated library to # depend on `.', always an invalid library. This was fixed in # development snapshots of GCC prior to 3.0. case $host_os in aix4 | aix4.[[01]] | aix4.[[01]].*) if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' echo ' yes ' echo '#endif'; } | ${CC} -E - | $GREP yes > /dev/null; then : else can_build_shared=no fi ;; esac # AIX (on Power*) has no versioning support, so currently we can not hardcode correct # soname into executable. Probably we can add versioning support to # collect2, so additional links can be useful in future. if test "$aix_use_runtimelinking" = yes; then # If using run time linking (on AIX 4.2 or later) use lib.so # instead of lib.a to let people know that these are not # typical AIX shared libraries. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' else # We preserve .a as extension for shared libraries through AIX4.2 # and later when we are not doing run time linking. library_names_spec='${libname}${release}.a $libname.a' soname_spec='${libname}${release}${shared_ext}$major' fi shlibpath_var=LIBPATH fi ;; amigaos*) case $host_cpu in powerpc) # Since July 2007 AmigaOS4 officially supports .so libraries. # When compiling the executable, add -use-dynld -Lsobjs: to the compileline. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' ;; m68k) library_names_spec='$libname.ixlibrary $libname.a' # Create ${libname}_ixlibrary.a entries in /sys/libs. finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([[^/]]*\)\.ixlibrary$%\1%'\''`; test $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' ;; esac ;; beos*) library_names_spec='${libname}${shared_ext}' dynamic_linker="$host_os ld.so" shlibpath_var=LIBRARY_PATH ;; bsdi[[45]]*) version_type=linux # correct to gnu/linux during the next big refactor need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" # the default ld.so.conf also contains /usr/contrib/lib and # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow # libtool to hard-code these into programs ;; cygwin* | mingw* | pw32* | cegcc*) version_type=windows shrext_cmds=".dll" need_version=no need_lib_prefix=no case $GCC,$cc_basename in yes,*) # gcc library_names_spec='$libname.dll.a' # DLL is installed to $(libdir)/../bin by postinstall_cmds postinstall_cmds='base_file=`basename \${file}`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname~ chmod a+x \$dldir/$dlname~ if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; fi' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ dlpath=$dir/\$dldll~ $RM \$dlpath' shlibpath_overrides_runpath=yes case $host_os in cygwin*) # Cygwin DLLs use 'cyg' prefix rather than 'lib' soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' m4_if([$1], [],[ sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/lib/w32api"]) ;; mingw* | cegcc*) # MinGW DLLs use traditional 'lib' prefix soname_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' ;; pw32*) # pw32 DLLs use 'pw' prefix rather than 'lib' library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' ;; esac dynamic_linker='Win32 ld.exe' ;; *,cl*) # Native MSVC libname_spec='$name' soname_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' library_names_spec='${libname}.dll.lib' case $build_os in mingw*) sys_lib_search_path_spec= lt_save_ifs=$IFS IFS=';' for lt_path in $LIB do IFS=$lt_save_ifs # Let DOS variable expansion print the short 8.3 style file name. lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"` sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path" done IFS=$lt_save_ifs # Convert to MSYS style. sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | sed -e 's|\\\\|/|g' -e 's| \\([[a-zA-Z]]\\):| /\\1|g' -e 's|^ ||'` ;; cygwin*) # Convert to unix form, then to dos form, then back to unix form # but this time dos style (no spaces!) so that the unix form looks # like /cygdrive/c/PROGRA~1:/cygdr... sys_lib_search_path_spec=`cygpath --path --unix "$LIB"` sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null` sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` ;; *) sys_lib_search_path_spec="$LIB" if $ECHO "$sys_lib_search_path_spec" | [$GREP ';[c-zC-Z]:/' >/dev/null]; then # It is most probably a Windows format PATH. sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` else sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` fi # FIXME: find the short name or the path components, as spaces are # common. (e.g. "Program Files" -> "PROGRA~1") ;; esac # DLL is installed to $(libdir)/../bin by postinstall_cmds postinstall_cmds='base_file=`basename \${file}`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ dlpath=$dir/\$dldll~ $RM \$dlpath' shlibpath_overrides_runpath=yes dynamic_linker='Win32 link.exe' ;; *) # Assume MSVC wrapper library_names_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext} $libname.lib' dynamic_linker='Win32 ld.exe' ;; esac # FIXME: first we should search . and the directory the executable is in shlibpath_var=PATH ;; darwin* | rhapsody*) dynamic_linker="$host_os dyld" version_type=darwin need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${major}$shared_ext ${libname}$shared_ext' soname_spec='${libname}${release}${major}$shared_ext' shlibpath_overrides_runpath=yes shlibpath_var=DYLD_LIBRARY_PATH shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' m4_if([$1], [],[ sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/local/lib"]) sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' ;; dgux*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH ;; freebsd* | dragonfly*) # DragonFly does not have aout. When/if they implement a new # versioning mechanism, adjust this. if test -x /usr/bin/objformat; then objformat=`/usr/bin/objformat` else case $host_os in freebsd[[23]].*) objformat=aout ;; *) objformat=elf ;; esac fi version_type=freebsd-$objformat case $version_type in freebsd-elf*) library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' need_version=no need_lib_prefix=no ;; freebsd-*) library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix' need_version=yes ;; esac shlibpath_var=LD_LIBRARY_PATH case $host_os in freebsd2.*) shlibpath_overrides_runpath=yes ;; freebsd3.[[01]]* | freebsdelf3.[[01]]*) shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; freebsd3.[[2-9]]* | freebsdelf3.[[2-9]]* | \ freebsd4.[[0-5]] | freebsdelf4.[[0-5]] | freebsd4.1.1 | freebsdelf4.1.1) shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; *) # from 4.6 on, and DragonFly shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; esac ;; gnu*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; haiku*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no dynamic_linker="$host_os runtime_loader" library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LIBRARY_PATH shlibpath_overrides_runpath=yes sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib' hardcode_into_libs=yes ;; hpux9* | hpux10* | hpux11*) # Give a soname corresponding to the major version so that dld.sl refuses to # link against other versions. version_type=sunos need_lib_prefix=no need_version=no case $host_cpu in ia64*) shrext_cmds='.so' hardcode_into_libs=yes dynamic_linker="$host_os dld.so" shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' if test "X$HPUX_IA64_MODE" = X32; then sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" else sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" fi sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; hppa*64*) shrext_cmds='.sl' hardcode_into_libs=yes dynamic_linker="$host_os dld.sl" shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; *) shrext_cmds='.sl' dynamic_linker="$host_os dld.sl" shlibpath_var=SHLIB_PATH shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' ;; esac # HP-UX runs *really* slowly unless shared libraries are mode 555, ... postinstall_cmds='chmod 555 $lib' # or fails outright, so override atomically: install_override_mode=555 ;; interix[[3-9]]*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; irix5* | irix6* | nonstopux*) case $host_os in nonstopux*) version_type=nonstopux ;; *) if test "$lt_cv_prog_gnu_ld" = yes; then version_type=linux # correct to gnu/linux during the next big refactor else version_type=irix fi ;; esac need_lib_prefix=no need_version=no soname_spec='${libname}${release}${shared_ext}$major' library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}' case $host_os in irix5* | nonstopux*) libsuff= shlibsuff= ;; *) case $LD in # libtool.m4 will add one of these switches to LD *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") libsuff= shlibsuff= libmagic=32-bit;; *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") libsuff=32 shlibsuff=N32 libmagic=N32;; *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") libsuff=64 shlibsuff=64 libmagic=64-bit;; *) libsuff= shlibsuff= libmagic=never-match;; esac ;; esac shlibpath_var=LD_LIBRARY${shlibsuff}_PATH shlibpath_overrides_runpath=no sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" hardcode_into_libs=yes ;; # No shared lib support for Linux oldld, aout, or coff. linux*oldld* | linux*aout* | linux*coff*) dynamic_linker=no ;; # This must be glibc/ELF. linux* | k*bsd*-gnu | kopensolaris*-gnu) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no # Some binutils ld are patched to set DT_RUNPATH AC_CACHE_VAL([lt_cv_shlibpath_overrides_runpath], [lt_cv_shlibpath_overrides_runpath=no save_LDFLAGS=$LDFLAGS save_libdir=$libdir eval "libdir=/foo; wl=\"$_LT_TAGVAR(lt_prog_compiler_wl, $1)\"; \ LDFLAGS=\"\$LDFLAGS $_LT_TAGVAR(hardcode_libdir_flag_spec, $1)\"" AC_LINK_IFELSE([AC_LANG_PROGRAM([],[])], [AS_IF([ ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null], [lt_cv_shlibpath_overrides_runpath=yes])]) LDFLAGS=$save_LDFLAGS libdir=$save_libdir ]) shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath # This implies no fast_install, which is unacceptable. # Some rework will be needed to allow for fast_install # before this can be enabled. hardcode_into_libs=yes # Append ld.so.conf contents to the search path if test -f /etc/ld.so.conf; then lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \[$]2)); skip = 1; } { if (!skip) print \[$]0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '` sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" fi # We used to test for /lib/ld.so.1 and disable shared libraries on # powerpc, because MkLinux only supported shared libraries with the # GNU dynamic linker. Since this was broken with cross compilers, # most powerpc-linux boxes support dynamic linking these days and # people can always --disable-shared, the test was removed, and we # assume the GNU/Linux dynamic linker is in use. dynamic_linker='GNU/Linux ld.so' ;; netbsd*) version_type=sunos need_lib_prefix=no need_version=no if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' dynamic_linker='NetBSD (a.out) ld.so' else library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' dynamic_linker='NetBSD ld.elf_so' fi shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; newsos6) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes ;; *nto* | *qnx*) version_type=qnx need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes dynamic_linker='ldqnx.so' ;; openbsd*) version_type=sunos sys_lib_dlsearch_path_spec="/usr/lib" need_lib_prefix=no # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs. case $host_os in openbsd3.3 | openbsd3.3.*) need_version=yes ;; *) need_version=no ;; esac library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' shlibpath_var=LD_LIBRARY_PATH if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then case $host_os in openbsd2.[[89]] | openbsd2.[[89]].*) shlibpath_overrides_runpath=no ;; *) shlibpath_overrides_runpath=yes ;; esac else shlibpath_overrides_runpath=yes fi ;; os2*) libname_spec='$name' shrext_cmds=".dll" need_lib_prefix=no library_names_spec='$libname${shared_ext} $libname.a' dynamic_linker='OS/2 ld.exe' shlibpath_var=LIBPATH ;; osf3* | osf4* | osf5*) version_type=osf need_lib_prefix=no need_version=no soname_spec='${libname}${release}${shared_ext}$major' library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" ;; rdos*) dynamic_linker=no ;; solaris*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes # ldd complains unless libraries are executable postinstall_cmds='chmod +x $lib' ;; sunos4*) version_type=sunos library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes if test "$with_gnu_ld" = yes; then need_lib_prefix=no fi need_version=yes ;; sysv4 | sysv4.3*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH case $host_vendor in sni) shlibpath_overrides_runpath=no need_lib_prefix=no runpath_var=LD_RUN_PATH ;; siemens) need_lib_prefix=no ;; motorola) need_lib_prefix=no need_version=no shlibpath_overrides_runpath=no sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' ;; esac ;; sysv4*MP*) if test -d /usr/nec ;then version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' soname_spec='$libname${shared_ext}.$major' shlibpath_var=LD_LIBRARY_PATH fi ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) version_type=freebsd-elf need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes if test "$with_gnu_ld" = yes; then sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' else sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' case $host_os in sco3.2v5*) sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" ;; esac fi sys_lib_dlsearch_path_spec='/usr/lib' ;; tpf*) # TPF is a cross-target only. Preferred cross-host = GNU/Linux. version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; uts4*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH ;; *) dynamic_linker=no ;; esac AC_MSG_RESULT([$dynamic_linker]) test "$dynamic_linker" = no && can_build_shared=no variables_saved_for_relink="PATH $shlibpath_var $runpath_var" if test "$GCC" = yes; then variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" fi if test "${lt_cv_sys_lib_search_path_spec+set}" = set; then sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec" fi if test "${lt_cv_sys_lib_dlsearch_path_spec+set}" = set; then sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec" fi _LT_DECL([], [variables_saved_for_relink], [1], [Variables whose values should be saved in libtool wrapper scripts and restored at link time]) _LT_DECL([], [need_lib_prefix], [0], [Do we need the "lib" prefix for modules?]) _LT_DECL([], [need_version], [0], [Do we need a version for libraries?]) _LT_DECL([], [version_type], [0], [Library versioning type]) _LT_DECL([], [runpath_var], [0], [Shared library runtime path variable]) _LT_DECL([], [shlibpath_var], [0],[Shared library path variable]) _LT_DECL([], [shlibpath_overrides_runpath], [0], [Is shlibpath searched before the hard-coded library search path?]) _LT_DECL([], [libname_spec], [1], [Format of library name prefix]) _LT_DECL([], [library_names_spec], [1], [[List of archive names. First name is the real one, the rest are links. The last name is the one that the linker finds with -lNAME]]) _LT_DECL([], [soname_spec], [1], [[The coded name of the library, if different from the real name]]) _LT_DECL([], [install_override_mode], [1], [Permission mode override for installation of shared libraries]) _LT_DECL([], [postinstall_cmds], [2], [Command to use after installation of a shared archive]) _LT_DECL([], [postuninstall_cmds], [2], [Command to use after uninstallation of a shared archive]) _LT_DECL([], [finish_cmds], [2], [Commands used to finish a libtool library installation in a directory]) _LT_DECL([], [finish_eval], [1], [[As "finish_cmds", except a single script fragment to be evaled but not shown]]) _LT_DECL([], [hardcode_into_libs], [0], [Whether we should hardcode library paths into libraries]) _LT_DECL([], [sys_lib_search_path_spec], [2], [Compile-time system search path for libraries]) _LT_DECL([], [sys_lib_dlsearch_path_spec], [2], [Run-time system search path for libraries]) ])# _LT_SYS_DYNAMIC_LINKER # _LT_PATH_TOOL_PREFIX(TOOL) # -------------------------- # find a file program which can recognize shared library AC_DEFUN([_LT_PATH_TOOL_PREFIX], [m4_require([_LT_DECL_EGREP])dnl AC_MSG_CHECKING([for $1]) AC_CACHE_VAL(lt_cv_path_MAGIC_CMD, [case $MAGIC_CMD in [[\\/*] | ?:[\\/]*]) lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path. ;; *) lt_save_MAGIC_CMD="$MAGIC_CMD" lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR dnl $ac_dummy forces splitting on constant user-supplied paths. dnl POSIX.2 word splitting is done only on the output of word expansions, dnl not every word. This closes a longstanding sh security hole. ac_dummy="m4_if([$2], , $PATH, [$2])" for ac_dir in $ac_dummy; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. if test -f $ac_dir/$1; then lt_cv_path_MAGIC_CMD="$ac_dir/$1" if test -n "$file_magic_test_file"; then case $deplibs_check_method in "file_magic "*) file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` MAGIC_CMD="$lt_cv_path_MAGIC_CMD" if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | $EGREP "$file_magic_regex" > /dev/null; then : else cat <<_LT_EOF 1>&2 *** Warning: the command libtool uses to detect shared libraries, *** $file_magic_cmd, produces output that libtool cannot recognize. *** The result is that libtool may fail to recognize shared libraries *** as such. This will affect the creation of libtool libraries that *** depend on shared libraries, but programs linked with such libtool *** libraries will work regardless of this problem. Nevertheless, you *** may want to report the problem to your system manager and/or to *** bug-libtool@gnu.org _LT_EOF fi ;; esac fi break fi done IFS="$lt_save_ifs" MAGIC_CMD="$lt_save_MAGIC_CMD" ;; esac]) MAGIC_CMD="$lt_cv_path_MAGIC_CMD" if test -n "$MAGIC_CMD"; then AC_MSG_RESULT($MAGIC_CMD) else AC_MSG_RESULT(no) fi _LT_DECL([], [MAGIC_CMD], [0], [Used to examine libraries when file_magic_cmd begins with "file"])dnl ])# _LT_PATH_TOOL_PREFIX # Old name: AU_ALIAS([AC_PATH_TOOL_PREFIX], [_LT_PATH_TOOL_PREFIX]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_PATH_TOOL_PREFIX], []) # _LT_PATH_MAGIC # -------------- # find a file program which can recognize a shared library m4_defun([_LT_PATH_MAGIC], [_LT_PATH_TOOL_PREFIX(${ac_tool_prefix}file, /usr/bin$PATH_SEPARATOR$PATH) if test -z "$lt_cv_path_MAGIC_CMD"; then if test -n "$ac_tool_prefix"; then _LT_PATH_TOOL_PREFIX(file, /usr/bin$PATH_SEPARATOR$PATH) else MAGIC_CMD=: fi fi ])# _LT_PATH_MAGIC # LT_PATH_LD # ---------- # find the pathname to the GNU or non-GNU linker AC_DEFUN([LT_PATH_LD], [AC_REQUIRE([AC_PROG_CC])dnl AC_REQUIRE([AC_CANONICAL_HOST])dnl AC_REQUIRE([AC_CANONICAL_BUILD])dnl m4_require([_LT_DECL_SED])dnl m4_require([_LT_DECL_EGREP])dnl m4_require([_LT_PROG_ECHO_BACKSLASH])dnl AC_ARG_WITH([gnu-ld], [AS_HELP_STRING([--with-gnu-ld], [assume the C compiler uses GNU ld @<:@default=no@:>@])], [test "$withval" = no || with_gnu_ld=yes], [with_gnu_ld=no])dnl ac_prog=ld if test "$GCC" = yes; then # Check if gcc -print-prog-name=ld gives a path. AC_MSG_CHECKING([for ld used by $CC]) case $host in *-*-mingw*) # gcc leaves a trailing carriage return which upsets mingw ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; *) ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; esac case $ac_prog in # Accept absolute paths. [[\\/]]* | ?:[[\\/]]*) re_direlt='/[[^/]][[^/]]*/\.\./' # Canonicalize the pathname of ld ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'` while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"` done test -z "$LD" && LD="$ac_prog" ;; "") # If it fails, then pretend we aren't using GCC. ac_prog=ld ;; *) # If it is relative, then search for the first ld in PATH. with_gnu_ld=unknown ;; esac elif test "$with_gnu_ld" = yes; then AC_MSG_CHECKING([for GNU ld]) else AC_MSG_CHECKING([for non-GNU ld]) fi AC_CACHE_VAL(lt_cv_path_LD, [if test -z "$LD"; then lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR for ac_dir in $PATH; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then lt_cv_path_LD="$ac_dir/$ac_prog" # Check to see if the program is GNU ld. I'd rather use --version, # but apparently some variants of GNU ld only accept -v. # Break only if it was the GNU/non-GNU ld that we prefer. case `"$lt_cv_path_LD" -v 2>&1 &1 /dev/null 2>&1; then lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' lt_cv_file_magic_cmd='func_win32_libid' else # Keep this pattern in sync with the one in func_win32_libid. lt_cv_deplibs_check_method='file_magic file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)' lt_cv_file_magic_cmd='$OBJDUMP -f' fi ;; cegcc*) # use the weaker test based on 'objdump'. See mingw*. lt_cv_deplibs_check_method='file_magic file format pe-arm-.*little(.*architecture: arm)?' lt_cv_file_magic_cmd='$OBJDUMP -f' ;; darwin* | rhapsody*) lt_cv_deplibs_check_method=pass_all ;; freebsd* | dragonfly*) if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then case $host_cpu in i*86 ) # Not sure whether the presence of OpenBSD here was a mistake. # Let's accept both of them until this is cleared up. lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[[3-9]]86 (compact )?demand paged shared library' lt_cv_file_magic_cmd=/usr/bin/file lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*` ;; esac else lt_cv_deplibs_check_method=pass_all fi ;; gnu*) lt_cv_deplibs_check_method=pass_all ;; haiku*) lt_cv_deplibs_check_method=pass_all ;; hpux10.20* | hpux11*) lt_cv_file_magic_cmd=/usr/bin/file case $host_cpu in ia64*) lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|ELF-[[0-9]][[0-9]]) shared object file - IA64' lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so ;; hppa*64*) [lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF[ -][0-9][0-9])(-bit)?( [LM]SB)? shared object( file)?[, -]* PA-RISC [0-9]\.[0-9]'] lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl ;; *) lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|PA-RISC[[0-9]]\.[[0-9]]) shared library' lt_cv_file_magic_test_file=/usr/lib/libc.sl ;; esac ;; interix[[3-9]]*) # PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so|\.a)$' ;; irix5* | irix6* | nonstopux*) case $LD in *-32|*"-32 ") libmagic=32-bit;; *-n32|*"-n32 ") libmagic=N32;; *-64|*"-64 ") libmagic=64-bit;; *) libmagic=never-match;; esac lt_cv_deplibs_check_method=pass_all ;; # This must be glibc/ELF. linux* | k*bsd*-gnu | kopensolaris*-gnu) lt_cv_deplibs_check_method=pass_all ;; netbsd*) if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$' else lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so|_pic\.a)$' fi ;; newos6*) lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (executable|dynamic lib)' lt_cv_file_magic_cmd=/usr/bin/file lt_cv_file_magic_test_file=/usr/lib/libnls.so ;; *nto* | *qnx*) lt_cv_deplibs_check_method=pass_all ;; openbsd*) if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|\.so|_pic\.a)$' else lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$' fi ;; osf3* | osf4* | osf5*) lt_cv_deplibs_check_method=pass_all ;; rdos*) lt_cv_deplibs_check_method=pass_all ;; solaris*) lt_cv_deplibs_check_method=pass_all ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) lt_cv_deplibs_check_method=pass_all ;; sysv4 | sysv4.3*) case $host_vendor in motorola) lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (shared object|dynamic lib) M[[0-9]][[0-9]]* Version [[0-9]]' lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*` ;; ncr) lt_cv_deplibs_check_method=pass_all ;; sequent) lt_cv_file_magic_cmd='/bin/file' lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB (shared object|dynamic lib )' ;; sni) lt_cv_file_magic_cmd='/bin/file' lt_cv_deplibs_check_method="file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB dynamic lib" lt_cv_file_magic_test_file=/lib/libc.so ;; siemens) lt_cv_deplibs_check_method=pass_all ;; pc) lt_cv_deplibs_check_method=pass_all ;; esac ;; tpf*) lt_cv_deplibs_check_method=pass_all ;; esac ]) file_magic_glob= want_nocaseglob=no if test "$build" = "$host"; then case $host_os in mingw* | pw32*) if ( shopt | grep nocaseglob ) >/dev/null 2>&1; then want_nocaseglob=yes else file_magic_glob=`echo aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ | $SED -e "s/\(..\)/s\/[[\1]]\/[[\1]]\/g;/g"` fi ;; esac fi file_magic_cmd=$lt_cv_file_magic_cmd deplibs_check_method=$lt_cv_deplibs_check_method test -z "$deplibs_check_method" && deplibs_check_method=unknown _LT_DECL([], [deplibs_check_method], [1], [Method to check whether dependent libraries are shared objects]) _LT_DECL([], [file_magic_cmd], [1], [Command to use when deplibs_check_method = "file_magic"]) _LT_DECL([], [file_magic_glob], [1], [How to find potential files when deplibs_check_method = "file_magic"]) _LT_DECL([], [want_nocaseglob], [1], [Find potential files using nocaseglob when deplibs_check_method = "file_magic"]) ])# _LT_CHECK_MAGIC_METHOD # LT_PATH_NM # ---------- # find the pathname to a BSD- or MS-compatible name lister AC_DEFUN([LT_PATH_NM], [AC_REQUIRE([AC_PROG_CC])dnl AC_CACHE_CHECK([for BSD- or MS-compatible name lister (nm)], lt_cv_path_NM, [if test -n "$NM"; then # Let the user override the test. lt_cv_path_NM="$NM" else lt_nm_to_check="${ac_tool_prefix}nm" if test -n "$ac_tool_prefix" && test "$build" = "$host"; then lt_nm_to_check="$lt_nm_to_check nm" fi for lt_tmp_nm in $lt_nm_to_check; do lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. tmp_nm="$ac_dir/$lt_tmp_nm" if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext" ; then # Check to see if the nm accepts a BSD-compat flag. # Adding the `sed 1q' prevents false positives on HP-UX, which says: # nm: unknown option "B" ignored # Tru64's nm complains that /dev/null is an invalid object file case `"$tmp_nm" -B /dev/null 2>&1 | sed '1q'` in */dev/null* | *'Invalid file or object type'*) lt_cv_path_NM="$tmp_nm -B" break ;; *) case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in */dev/null*) lt_cv_path_NM="$tmp_nm -p" break ;; *) lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but continue # so that we can try to find one that supports BSD flags ;; esac ;; esac fi done IFS="$lt_save_ifs" done : ${lt_cv_path_NM=no} fi]) if test "$lt_cv_path_NM" != "no"; then NM="$lt_cv_path_NM" else # Didn't find any BSD compatible name lister, look for dumpbin. if test -n "$DUMPBIN"; then : # Let the user override the test. else AC_CHECK_TOOLS(DUMPBIN, [dumpbin "link -dump"], :) case `$DUMPBIN -symbols /dev/null 2>&1 | sed '1q'` in *COFF*) DUMPBIN="$DUMPBIN -symbols" ;; *) DUMPBIN=: ;; esac fi AC_SUBST([DUMPBIN]) if test "$DUMPBIN" != ":"; then NM="$DUMPBIN" fi fi test -z "$NM" && NM=nm AC_SUBST([NM]) _LT_DECL([], [NM], [1], [A BSD- or MS-compatible name lister])dnl AC_CACHE_CHECK([the name lister ($NM) interface], [lt_cv_nm_interface], [lt_cv_nm_interface="BSD nm" echo "int some_variable = 0;" > conftest.$ac_ext (eval echo "\"\$as_me:$LINENO: $ac_compile\"" >&AS_MESSAGE_LOG_FD) (eval "$ac_compile" 2>conftest.err) cat conftest.err >&AS_MESSAGE_LOG_FD (eval echo "\"\$as_me:$LINENO: $NM \\\"conftest.$ac_objext\\\"\"" >&AS_MESSAGE_LOG_FD) (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out) cat conftest.err >&AS_MESSAGE_LOG_FD (eval echo "\"\$as_me:$LINENO: output\"" >&AS_MESSAGE_LOG_FD) cat conftest.out >&AS_MESSAGE_LOG_FD if $GREP 'External.*some_variable' conftest.out > /dev/null; then lt_cv_nm_interface="MS dumpbin" fi rm -f conftest*]) ])# LT_PATH_NM # Old names: AU_ALIAS([AM_PROG_NM], [LT_PATH_NM]) AU_ALIAS([AC_PROG_NM], [LT_PATH_NM]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AM_PROG_NM], []) dnl AC_DEFUN([AC_PROG_NM], []) # _LT_CHECK_SHAREDLIB_FROM_LINKLIB # -------------------------------- # how to determine the name of the shared library # associated with a specific link library. # -- PORTME fill in with the dynamic library characteristics m4_defun([_LT_CHECK_SHAREDLIB_FROM_LINKLIB], [m4_require([_LT_DECL_EGREP]) m4_require([_LT_DECL_OBJDUMP]) m4_require([_LT_DECL_DLLTOOL]) AC_CACHE_CHECK([how to associate runtime and link libraries], lt_cv_sharedlib_from_linklib_cmd, [lt_cv_sharedlib_from_linklib_cmd='unknown' case $host_os in cygwin* | mingw* | pw32* | cegcc*) # two different shell functions defined in ltmain.sh # decide which to use based on capabilities of $DLLTOOL case `$DLLTOOL --help 2>&1` in *--identify-strict*) lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib ;; *) lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib_fallback ;; esac ;; *) # fallback: assume linklib IS sharedlib lt_cv_sharedlib_from_linklib_cmd="$ECHO" ;; esac ]) sharedlib_from_linklib_cmd=$lt_cv_sharedlib_from_linklib_cmd test -z "$sharedlib_from_linklib_cmd" && sharedlib_from_linklib_cmd=$ECHO _LT_DECL([], [sharedlib_from_linklib_cmd], [1], [Command to associate shared and link libraries]) ])# _LT_CHECK_SHAREDLIB_FROM_LINKLIB # _LT_PATH_MANIFEST_TOOL # ---------------------- # locate the manifest tool m4_defun([_LT_PATH_MANIFEST_TOOL], [AC_CHECK_TOOL(MANIFEST_TOOL, mt, :) test -z "$MANIFEST_TOOL" && MANIFEST_TOOL=mt AC_CACHE_CHECK([if $MANIFEST_TOOL is a manifest tool], [lt_cv_path_mainfest_tool], [lt_cv_path_mainfest_tool=no echo "$as_me:$LINENO: $MANIFEST_TOOL '-?'" >&AS_MESSAGE_LOG_FD $MANIFEST_TOOL '-?' 2>conftest.err > conftest.out cat conftest.err >&AS_MESSAGE_LOG_FD if $GREP 'Manifest Tool' conftest.out > /dev/null; then lt_cv_path_mainfest_tool=yes fi rm -f conftest*]) if test "x$lt_cv_path_mainfest_tool" != xyes; then MANIFEST_TOOL=: fi _LT_DECL([], [MANIFEST_TOOL], [1], [Manifest tool])dnl ])# _LT_PATH_MANIFEST_TOOL # LT_LIB_M # -------- # check for math library AC_DEFUN([LT_LIB_M], [AC_REQUIRE([AC_CANONICAL_HOST])dnl LIBM= case $host in *-*-beos* | *-*-cegcc* | *-*-cygwin* | *-*-haiku* | *-*-pw32* | *-*-darwin*) # These system don't have libm, or don't need it ;; *-ncr-sysv4.3*) AC_CHECK_LIB(mw, _mwvalidcheckl, LIBM="-lmw") AC_CHECK_LIB(m, cos, LIBM="$LIBM -lm") ;; *) AC_CHECK_LIB(m, cos, LIBM="-lm") ;; esac AC_SUBST([LIBM]) ])# LT_LIB_M # Old name: AU_ALIAS([AC_CHECK_LIBM], [LT_LIB_M]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_CHECK_LIBM], []) # _LT_COMPILER_NO_RTTI([TAGNAME]) # ------------------------------- m4_defun([_LT_COMPILER_NO_RTTI], [m4_require([_LT_TAG_COMPILER])dnl _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)= if test "$GCC" = yes; then case $cc_basename in nvcc*) _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -Xcompiler -fno-builtin' ;; *) _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin' ;; esac _LT_COMPILER_OPTION([if $compiler supports -fno-rtti -fno-exceptions], lt_cv_prog_compiler_rtti_exceptions, [-fno-rtti -fno-exceptions], [], [_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)="$_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1) -fno-rtti -fno-exceptions"]) fi _LT_TAGDECL([no_builtin_flag], [lt_prog_compiler_no_builtin_flag], [1], [Compiler flag to turn off builtin functions]) ])# _LT_COMPILER_NO_RTTI # _LT_CMD_GLOBAL_SYMBOLS # ---------------------- m4_defun([_LT_CMD_GLOBAL_SYMBOLS], [AC_REQUIRE([AC_CANONICAL_HOST])dnl AC_REQUIRE([AC_PROG_CC])dnl AC_REQUIRE([AC_PROG_AWK])dnl AC_REQUIRE([LT_PATH_NM])dnl AC_REQUIRE([LT_PATH_LD])dnl m4_require([_LT_DECL_SED])dnl m4_require([_LT_DECL_EGREP])dnl m4_require([_LT_TAG_COMPILER])dnl # Check for command to grab the raw symbol name followed by C symbol from nm. AC_MSG_CHECKING([command to parse $NM output from $compiler object]) AC_CACHE_VAL([lt_cv_sys_global_symbol_pipe], [ # These are sane defaults that work on at least a few old systems. # [They come from Ultrix. What could be older than Ultrix?!! ;)] # Character class describing NM global symbol codes. symcode='[[BCDEGRST]]' # Regexp to match symbols that can be accessed directly from C. sympat='\([[_A-Za-z]][[_A-Za-z0-9]]*\)' # Define system-specific variables. case $host_os in aix*) symcode='[[BCDT]]' ;; cygwin* | mingw* | pw32* | cegcc*) symcode='[[ABCDGISTW]]' ;; hpux*) if test "$host_cpu" = ia64; then symcode='[[ABCDEGRST]]' fi ;; irix* | nonstopux*) symcode='[[BCDEGRST]]' ;; osf*) symcode='[[BCDEGQRST]]' ;; solaris*) symcode='[[BDRT]]' ;; sco3.2v5*) symcode='[[DT]]' ;; sysv4.2uw2*) symcode='[[DT]]' ;; sysv5* | sco5v6* | unixware* | OpenUNIX*) symcode='[[ABDT]]' ;; sysv4) symcode='[[DFNSTU]]' ;; esac # If we're using GNU nm, then use its standard symbol codes. case `$NM -V 2>&1` in *GNU* | *'with BFD'*) symcode='[[ABCDGIRSTW]]' ;; esac # Transform an extracted symbol line into a proper C declaration. # Some systems (esp. on ia64) link data and code symbols differently, # so use this general approach. lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'" # Transform an extracted symbol line into symbol name and symbol address lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([[^ ]]*\)[[ ]]*$/ {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([[^ ]]*\) \([[^ ]]*\)$/ {\"\2\", (void *) \&\2},/p'" lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="sed -n -e 's/^: \([[^ ]]*\)[[ ]]*$/ {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([[^ ]]*\) \(lib[[^ ]]*\)$/ {\"\2\", (void *) \&\2},/p' -e 's/^$symcode* \([[^ ]]*\) \([[^ ]]*\)$/ {\"lib\2\", (void *) \&\2},/p'" # Handle CRLF in mingw tool chain opt_cr= case $build_os in mingw*) opt_cr=`$ECHO 'x\{0,1\}' | tr x '\015'` # option cr in regexp ;; esac # Try without a prefix underscore, then with it. for ac_symprfx in "" "_"; do # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol. symxfrm="\\1 $ac_symprfx\\2 \\2" # Write the raw and C identifiers. if test "$lt_cv_nm_interface" = "MS dumpbin"; then # Fake it for dumpbin and say T for any non-static function # and D for any global variable. # Also find C++ and __fastcall symbols from MSVC++, # which start with @ or ?. lt_cv_sys_global_symbol_pipe="$AWK ['"\ " {last_section=section; section=\$ 3};"\ " /^COFF SYMBOL TABLE/{for(i in hide) delete hide[i]};"\ " /Section length .*#relocs.*(pick any)/{hide[last_section]=1};"\ " \$ 0!~/External *\|/{next};"\ " / 0+ UNDEF /{next}; / UNDEF \([^|]\)*()/{next};"\ " {if(hide[section]) next};"\ " {f=0}; \$ 0~/\(\).*\|/{f=1}; {printf f ? \"T \" : \"D \"};"\ " {split(\$ 0, a, /\||\r/); split(a[2], s)};"\ " s[1]~/^[@?]/{print s[1], s[1]; next};"\ " s[1]~prfx {split(s[1],t,\"@\"); print t[1], substr(t[1],length(prfx))}"\ " ' prfx=^$ac_symprfx]" else lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[[ ]]\($symcode$symcode*\)[[ ]][[ ]]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'" fi lt_cv_sys_global_symbol_pipe="$lt_cv_sys_global_symbol_pipe | sed '/ __gnu_lto/d'" # Check to see that the pipe works correctly. pipe_works=no rm -f conftest* cat > conftest.$ac_ext <<_LT_EOF #ifdef __cplusplus extern "C" { #endif char nm_test_var; void nm_test_func(void); void nm_test_func(void){} #ifdef __cplusplus } #endif int main(){nm_test_var='a';nm_test_func();return(0);} _LT_EOF if AC_TRY_EVAL(ac_compile); then # Now try to grab the symbols. nlist=conftest.nm if AC_TRY_EVAL(NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist) && test -s "$nlist"; then # Try sorting and uniquifying the output. if sort "$nlist" | uniq > "$nlist"T; then mv -f "$nlist"T "$nlist" else rm -f "$nlist"T fi # Make sure that we snagged all the symbols we need. if $GREP ' nm_test_var$' "$nlist" >/dev/null; then if $GREP ' nm_test_func$' "$nlist" >/dev/null; then cat <<_LT_EOF > conftest.$ac_ext /* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests. */ #if defined(_WIN32) || defined(__CYGWIN__) || defined(_WIN32_WCE) /* DATA imports from DLLs on WIN32 con't be const, because runtime relocations are performed -- see ld's documentation on pseudo-relocs. */ # define LT@&t@_DLSYM_CONST #elif defined(__osf__) /* This system does not cope well with relocations in const data. */ # define LT@&t@_DLSYM_CONST #else # define LT@&t@_DLSYM_CONST const #endif #ifdef __cplusplus extern "C" { #endif _LT_EOF # Now generate the symbol file. eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | $GREP -v main >> conftest.$ac_ext' cat <<_LT_EOF >> conftest.$ac_ext /* The mapping between symbol names and symbols. */ LT@&t@_DLSYM_CONST struct { const char *name; void *address; } lt__PROGRAM__LTX_preloaded_symbols[[]] = { { "@PROGRAM@", (void *) 0 }, _LT_EOF $SED "s/^$symcode$symcode* \(.*\) \(.*\)$/ {\"\2\", (void *) \&\2},/" < "$nlist" | $GREP -v main >> conftest.$ac_ext cat <<\_LT_EOF >> conftest.$ac_ext {0, (void *) 0} }; /* This works around a problem in FreeBSD linker */ #ifdef FREEBSD_WORKAROUND static const void *lt_preloaded_setup() { return lt__PROGRAM__LTX_preloaded_symbols; } #endif #ifdef __cplusplus } #endif _LT_EOF # Now try linking the two files. mv conftest.$ac_objext conftstm.$ac_objext lt_globsym_save_LIBS=$LIBS lt_globsym_save_CFLAGS=$CFLAGS LIBS="conftstm.$ac_objext" CFLAGS="$CFLAGS$_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)" if AC_TRY_EVAL(ac_link) && test -s conftest${ac_exeext}; then pipe_works=yes fi LIBS=$lt_globsym_save_LIBS CFLAGS=$lt_globsym_save_CFLAGS else echo "cannot find nm_test_func in $nlist" >&AS_MESSAGE_LOG_FD fi else echo "cannot find nm_test_var in $nlist" >&AS_MESSAGE_LOG_FD fi else echo "cannot run $lt_cv_sys_global_symbol_pipe" >&AS_MESSAGE_LOG_FD fi else echo "$progname: failed program was:" >&AS_MESSAGE_LOG_FD cat conftest.$ac_ext >&5 fi rm -rf conftest* conftst* # Do not use the global_symbol_pipe unless it works. if test "$pipe_works" = yes; then break else lt_cv_sys_global_symbol_pipe= fi done ]) if test -z "$lt_cv_sys_global_symbol_pipe"; then lt_cv_sys_global_symbol_to_cdecl= fi if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then AC_MSG_RESULT(failed) else AC_MSG_RESULT(ok) fi # Response file support. if test "$lt_cv_nm_interface" = "MS dumpbin"; then nm_file_list_spec='@' elif $NM --help 2>/dev/null | grep '[[@]]FILE' >/dev/null; then nm_file_list_spec='@' fi _LT_DECL([global_symbol_pipe], [lt_cv_sys_global_symbol_pipe], [1], [Take the output of nm and produce a listing of raw symbols and C names]) _LT_DECL([global_symbol_to_cdecl], [lt_cv_sys_global_symbol_to_cdecl], [1], [Transform the output of nm in a proper C declaration]) _LT_DECL([global_symbol_to_c_name_address], [lt_cv_sys_global_symbol_to_c_name_address], [1], [Transform the output of nm in a C name address pair]) _LT_DECL([global_symbol_to_c_name_address_lib_prefix], [lt_cv_sys_global_symbol_to_c_name_address_lib_prefix], [1], [Transform the output of nm in a C name address pair when lib prefix is needed]) _LT_DECL([], [nm_file_list_spec], [1], [Specify filename containing input files for $NM]) ]) # _LT_CMD_GLOBAL_SYMBOLS # _LT_COMPILER_PIC([TAGNAME]) # --------------------------- m4_defun([_LT_COMPILER_PIC], [m4_require([_LT_TAG_COMPILER])dnl _LT_TAGVAR(lt_prog_compiler_wl, $1)= _LT_TAGVAR(lt_prog_compiler_pic, $1)= _LT_TAGVAR(lt_prog_compiler_static, $1)= m4_if([$1], [CXX], [ # C++ specific cases for pic, static, wl, etc. if test "$GXX" = yes; then _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' case $host_os in aix*) # All AIX code is PIC. if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; m68k) # FIXME: we need at least 68020 code to build shared libraries, but # adding the `-m68020' flag to GCC prevents building anything better, # like `-m68040'. _LT_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4' ;; esac ;; beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) # PIC is the default for these OSes. ;; mingw* | cygwin* | os2* | pw32* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). # Although the cygwin gcc ignores -fPIC, still need this for old-style # (--disable-auto-import) libraries m4_if([$1], [GCJ], [], [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) ;; darwin* | rhapsody*) # PIC is the default on this platform # Common symbols not allowed in MH_DYLIB files _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common' ;; *djgpp*) # DJGPP does not support shared libraries at all _LT_TAGVAR(lt_prog_compiler_pic, $1)= ;; haiku*) # PIC is the default for Haiku. # The "-static" flag exists, but is broken. _LT_TAGVAR(lt_prog_compiler_static, $1)= ;; interix[[3-9]]*) # Interix 3.x gcc -fpic/-fPIC options generate broken code. # Instead, we relocate shared libraries at runtime. ;; sysv4*MP*) if test -d /usr/nec; then _LT_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic fi ;; hpux*) # PIC is the default for 64-bit PA HP-UX, but not for 32-bit # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag # sets the default TLS model and affects inlining. case $host_cpu in hppa*64*) ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; esac ;; *qnx* | *nto*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; esac else case $host_os in aix[[4-9]]*) # All AIX code is PIC. if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' else _LT_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp' fi ;; chorus*) case $cc_basename in cxch68*) # Green Hills C++ Compiler # _LT_TAGVAR(lt_prog_compiler_static, $1)="--no_auto_instantiation -u __main -u __premain -u _abort -r $COOL_DIR/lib/libOrb.a $MVME_DIR/lib/CC/libC.a $MVME_DIR/lib/classix/libcx.s.a" ;; esac ;; mingw* | cygwin* | os2* | pw32* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). m4_if([$1], [GCJ], [], [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) ;; dgux*) case $cc_basename in ec++*) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' ;; ghcx*) # Green Hills C++ Compiler _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' ;; *) ;; esac ;; freebsd* | dragonfly*) # FreeBSD uses GNU C++ ;; hpux9* | hpux10* | hpux11*) case $cc_basename in CC*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive' if test "$host_cpu" != ia64; then _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z' fi ;; aCC*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive' case $host_cpu in hppa*64*|ia64*) # +Z the default ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z' ;; esac ;; *) ;; esac ;; interix*) # This is c89, which is MS Visual C++ (no shared libs) # Anyone wants to do a port? ;; irix5* | irix6* | nonstopux*) case $cc_basename in CC*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' # CC pic flag -KPIC is the default. ;; *) ;; esac ;; linux* | k*bsd*-gnu | kopensolaris*-gnu) case $cc_basename in KCC*) # KAI C++ Compiler _LT_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; ecpc* ) # old Intel C++ for x86_64 which still supported -KPIC. _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' ;; icpc* ) # Intel C++, used to be incompatible with GCC. # ICC 10 doesn't accept -KPIC any more. _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' ;; pgCC* | pgcpp*) # Portland Group C++ compiler _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; cxx*) # Compaq C++ # Make sure the PIC flag is empty. It appears that all Alpha # Linux and Compaq Tru64 Unix objects are PIC. _LT_TAGVAR(lt_prog_compiler_pic, $1)= _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; xlc* | xlC* | bgxl[[cC]]* | mpixl[[cC]]*) # IBM XL 8.0, 9.0 on PPC and BlueGene _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-qpic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-qstaticlink' ;; *) case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C++ 5.9 _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' ;; esac ;; esac ;; lynxos*) ;; m88k*) ;; mvs*) case $cc_basename in cxx*) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-W c,exportall' ;; *) ;; esac ;; netbsd*) ;; *qnx* | *nto*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' ;; osf3* | osf4* | osf5*) case $cc_basename in KCC*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,' ;; RCC*) # Rational C++ 2.4.1 _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' ;; cxx*) # Digital/Compaq C++ _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' # Make sure the PIC flag is empty. It appears that all Alpha # Linux and Compaq Tru64 Unix objects are PIC. _LT_TAGVAR(lt_prog_compiler_pic, $1)= _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; *) ;; esac ;; psos*) ;; solaris*) case $cc_basename in CC* | sunCC*) # Sun C++ 4.2, 5.x and Centerline C++ _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' ;; gcx*) # Green Hills C++ Compiler _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' ;; *) ;; esac ;; sunos4*) case $cc_basename in CC*) # Sun C++ 4.x _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; lcc*) # Lucid _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' ;; *) ;; esac ;; sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) case $cc_basename in CC*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; esac ;; tandem*) case $cc_basename in NCC*) # NonStop-UX NCC 3.20 _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' ;; *) ;; esac ;; vxworks*) ;; *) _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no ;; esac fi ], [ if test "$GCC" = yes; then _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' case $host_os in aix*) # All AIX code is PIC. if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; m68k) # FIXME: we need at least 68020 code to build shared libraries, but # adding the `-m68020' flag to GCC prevents building anything better, # like `-m68040'. _LT_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4' ;; esac ;; beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) # PIC is the default for these OSes. ;; mingw* | cygwin* | pw32* | os2* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). # Although the cygwin gcc ignores -fPIC, still need this for old-style # (--disable-auto-import) libraries m4_if([$1], [GCJ], [], [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) ;; darwin* | rhapsody*) # PIC is the default on this platform # Common symbols not allowed in MH_DYLIB files _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common' ;; haiku*) # PIC is the default for Haiku. # The "-static" flag exists, but is broken. _LT_TAGVAR(lt_prog_compiler_static, $1)= ;; hpux*) # PIC is the default for 64-bit PA HP-UX, but not for 32-bit # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag # sets the default TLS model and affects inlining. case $host_cpu in hppa*64*) # +Z the default ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; esac ;; interix[[3-9]]*) # Interix 3.x gcc -fpic/-fPIC options generate broken code. # Instead, we relocate shared libraries at runtime. ;; msdosdjgpp*) # Just because we use GCC doesn't mean we suddenly get shared libraries # on systems that don't support them. _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no enable_shared=no ;; *nto* | *qnx*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' ;; sysv4*MP*) if test -d /usr/nec; then _LT_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic fi ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; esac case $cc_basename in nvcc*) # Cuda Compiler Driver 2.2 _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Xlinker ' if test -n "$_LT_TAGVAR(lt_prog_compiler_pic, $1)"; then _LT_TAGVAR(lt_prog_compiler_pic, $1)="-Xcompiler $_LT_TAGVAR(lt_prog_compiler_pic, $1)" fi ;; esac else # PORTME Check for flag to pass linker flags through the system compiler. case $host_os in aix*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' else _LT_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp' fi ;; mingw* | cygwin* | pw32* | os2* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). m4_if([$1], [GCJ], [], [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) ;; hpux9* | hpux10* | hpux11*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but # not for PA HP-UX. case $host_cpu in hppa*64*|ia64*) # +Z the default ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z' ;; esac # Is there a better lt_prog_compiler_static that works with the bundled CC? _LT_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive' ;; irix5* | irix6* | nonstopux*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' # PIC (with -KPIC) is the default. _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; linux* | k*bsd*-gnu | kopensolaris*-gnu) case $cc_basename in # old Intel for x86_64 which still supported -KPIC. ecc*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' ;; # icc used to be incompatible with GCC. # ICC 10 doesn't accept -KPIC any more. icc* | ifort*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' ;; # Lahey Fortran 8.1. lf95*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='--shared' _LT_TAGVAR(lt_prog_compiler_static, $1)='--static' ;; nagfor*) # NAG Fortran compiler _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,-Wl,,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; pgcc* | pgf77* | pgf90* | pgf95* | pgfortran*) # Portland Group compilers (*not* the Pentium gcc compiler, # which looks to be a dead project) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; ccc*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' # All Alpha code is PIC. _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; xl* | bgxl* | bgf* | mpixl*) # IBM XL C 8.0/Fortran 10.1, 11.1 on PPC and BlueGene _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-qpic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-qstaticlink' ;; *) case `$CC -V 2>&1 | sed 5q` in *Sun\ Ceres\ Fortran* | *Sun*Fortran*\ [[1-7]].* | *Sun*Fortran*\ 8.[[0-3]]*) # Sun Fortran 8.3 passes all unrecognized flags to the linker _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' _LT_TAGVAR(lt_prog_compiler_wl, $1)='' ;; *Sun\ F* | *Sun*Fortran*) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' ;; *Sun\ C*) # Sun C 5.9 _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' ;; *Intel*\ [[CF]]*Compiler*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' ;; *Portland\ Group*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; esac ;; esac ;; newsos6) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; *nto* | *qnx*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' ;; osf3* | osf4* | osf5*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' # All OSF/1 code is PIC. _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; rdos*) _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; solaris*) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' case $cc_basename in f77* | f90* | f95* | sunf77* | sunf90* | sunf95*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ';; *) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,';; esac ;; sunos4*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; sysv4 | sysv4.2uw2* | sysv4.3*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; sysv4*MP*) if test -d /usr/nec ;then _LT_TAGVAR(lt_prog_compiler_pic, $1)='-Kconform_pic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' fi ;; sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; unicos*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no ;; uts4*) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; *) _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no ;; esac fi ]) case $host_os in # For platforms which do not support PIC, -DPIC is meaningless: *djgpp*) _LT_TAGVAR(lt_prog_compiler_pic, $1)= ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)="$_LT_TAGVAR(lt_prog_compiler_pic, $1)@&t@m4_if([$1],[],[ -DPIC],[m4_if([$1],[CXX],[ -DPIC],[])])" ;; esac AC_CACHE_CHECK([for $compiler option to produce PIC], [_LT_TAGVAR(lt_cv_prog_compiler_pic, $1)], [_LT_TAGVAR(lt_cv_prog_compiler_pic, $1)=$_LT_TAGVAR(lt_prog_compiler_pic, $1)]) _LT_TAGVAR(lt_prog_compiler_pic, $1)=$_LT_TAGVAR(lt_cv_prog_compiler_pic, $1) # # Check to make sure the PIC flag actually works. # if test -n "$_LT_TAGVAR(lt_prog_compiler_pic, $1)"; then _LT_COMPILER_OPTION([if $compiler PIC flag $_LT_TAGVAR(lt_prog_compiler_pic, $1) works], [_LT_TAGVAR(lt_cv_prog_compiler_pic_works, $1)], [$_LT_TAGVAR(lt_prog_compiler_pic, $1)@&t@m4_if([$1],[],[ -DPIC],[m4_if([$1],[CXX],[ -DPIC],[])])], [], [case $_LT_TAGVAR(lt_prog_compiler_pic, $1) in "" | " "*) ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)=" $_LT_TAGVAR(lt_prog_compiler_pic, $1)" ;; esac], [_LT_TAGVAR(lt_prog_compiler_pic, $1)= _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no]) fi _LT_TAGDECL([pic_flag], [lt_prog_compiler_pic], [1], [Additional compiler flags for building library objects]) _LT_TAGDECL([wl], [lt_prog_compiler_wl], [1], [How to pass a linker flag through the compiler]) # # Check to make sure the static flag actually works. # wl=$_LT_TAGVAR(lt_prog_compiler_wl, $1) eval lt_tmp_static_flag=\"$_LT_TAGVAR(lt_prog_compiler_static, $1)\" _LT_LINKER_OPTION([if $compiler static flag $lt_tmp_static_flag works], _LT_TAGVAR(lt_cv_prog_compiler_static_works, $1), $lt_tmp_static_flag, [], [_LT_TAGVAR(lt_prog_compiler_static, $1)=]) _LT_TAGDECL([link_static_flag], [lt_prog_compiler_static], [1], [Compiler flag to prevent dynamic linking]) ])# _LT_COMPILER_PIC # _LT_LINKER_SHLIBS([TAGNAME]) # ---------------------------- # See if the linker supports building shared libraries. m4_defun([_LT_LINKER_SHLIBS], [AC_REQUIRE([LT_PATH_LD])dnl AC_REQUIRE([LT_PATH_NM])dnl m4_require([_LT_PATH_MANIFEST_TOOL])dnl m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_DECL_EGREP])dnl m4_require([_LT_DECL_SED])dnl m4_require([_LT_CMD_GLOBAL_SYMBOLS])dnl m4_require([_LT_TAG_COMPILER])dnl AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries]) m4_if([$1], [CXX], [ _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' _LT_TAGVAR(exclude_expsyms, $1)=['_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*'] case $host_os in aix[[4-9]]*) # If we're using GNU nm, then we don't want the "-C" option. # -C means demangle to AIX nm, but means don't demangle with GNU nm # Also, AIX nm treats weak defined symbols like other global defined # symbols, whereas GNU nm marks them as "W". if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then _LT_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' else _LT_TAGVAR(export_symbols_cmds, $1)='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' fi ;; pw32*) _LT_TAGVAR(export_symbols_cmds, $1)="$ltdll_cmds" ;; cygwin* | mingw* | cegcc*) case $cc_basename in cl*) _LT_TAGVAR(exclude_expsyms, $1)='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*' ;; *) _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1 DATA/;s/^.*[[ ]]__nm__\([[^ ]]*\)[[ ]][[^ ]]*/\1 DATA/;/^I[[ ]]/d;/^[[AITW]][[ ]]/s/.* //'\'' | sort | uniq > $export_symbols' _LT_TAGVAR(exclude_expsyms, $1)=['[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname'] ;; esac ;; *) _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' ;; esac ], [ runpath_var= _LT_TAGVAR(allow_undefined_flag, $1)= _LT_TAGVAR(always_export_symbols, $1)=no _LT_TAGVAR(archive_cmds, $1)= _LT_TAGVAR(archive_expsym_cmds, $1)= _LT_TAGVAR(compiler_needs_object, $1)=no _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no _LT_TAGVAR(export_dynamic_flag_spec, $1)= _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' _LT_TAGVAR(hardcode_automatic, $1)=no _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= _LT_TAGVAR(hardcode_libdir_separator, $1)= _LT_TAGVAR(hardcode_minus_L, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported _LT_TAGVAR(inherit_rpath, $1)=no _LT_TAGVAR(link_all_deplibs, $1)=unknown _LT_TAGVAR(module_cmds, $1)= _LT_TAGVAR(module_expsym_cmds, $1)= _LT_TAGVAR(old_archive_from_new_cmds, $1)= _LT_TAGVAR(old_archive_from_expsyms_cmds, $1)= _LT_TAGVAR(thread_safe_flag_spec, $1)= _LT_TAGVAR(whole_archive_flag_spec, $1)= # include_expsyms should be a list of space-separated symbols to be *always* # included in the symbol list _LT_TAGVAR(include_expsyms, $1)= # exclude_expsyms can be an extended regexp of symbols to exclude # it will be wrapped by ` (' and `)$', so one must not match beginning or # end of line. Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc', # as well as any symbol that contains `d'. _LT_TAGVAR(exclude_expsyms, $1)=['_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*'] # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out # platforms (ab)use it in PIC code, but their linkers get confused if # the symbol is explicitly referenced. Since portable code cannot # rely on this symbol name, it's probably fine to never include it in # preloaded symbol tables. # Exclude shared library initialization/finalization symbols. dnl Note also adjust exclude_expsyms for C++ above. extract_expsyms_cmds= case $host_os in cygwin* | mingw* | pw32* | cegcc*) # FIXME: the MSVC++ port hasn't been tested in a loooong time # When not using gcc, we currently assume that we are using # Microsoft Visual C++. if test "$GCC" != yes; then with_gnu_ld=no fi ;; interix*) # we just hope/assume this is gcc and not c89 (= MSVC++) with_gnu_ld=yes ;; openbsd*) with_gnu_ld=no ;; esac _LT_TAGVAR(ld_shlibs, $1)=yes # On some targets, GNU ld is compatible enough with the native linker # that we're better off using the native interface for both. lt_use_gnu_ld_interface=no if test "$with_gnu_ld" = yes; then case $host_os in aix*) # The AIX port of GNU ld has always aspired to compatibility # with the native linker. However, as the warning in the GNU ld # block says, versions before 2.19.5* couldn't really create working # shared libraries, regardless of the interface used. case `$LD -v 2>&1` in *\ \(GNU\ Binutils\)\ 2.19.5*) ;; *\ \(GNU\ Binutils\)\ 2.[[2-9]]*) ;; *\ \(GNU\ Binutils\)\ [[3-9]]*) ;; *) lt_use_gnu_ld_interface=yes ;; esac ;; *) lt_use_gnu_ld_interface=yes ;; esac fi if test "$lt_use_gnu_ld_interface" = yes; then # If archive_cmds runs LD, not CC, wlarc should be empty wlarc='${wl}' # Set some defaults for GNU ld with shared library support. These # are reset later if shared libraries are not supported. Putting them # here allows them to be overridden if necessary. runpath_var=LD_RUN_PATH _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' # ancient GNU ld didn't support --whole-archive et. al. if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then _LT_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' else _LT_TAGVAR(whole_archive_flag_spec, $1)= fi supports_anon_versioning=no case `$LD -v 2>&1` in *GNU\ gold*) supports_anon_versioning=yes ;; *\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.10.*) ;; # catch versions < 2.11 *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... *\ 2.11.*) ;; # other 2.11 versions *) supports_anon_versioning=yes ;; esac # See if GNU ld supports shared libraries. case $host_os in aix[[3-9]]*) # On AIX/PPC, the GNU linker is very broken if test "$host_cpu" != ia64; then _LT_TAGVAR(ld_shlibs, $1)=no cat <<_LT_EOF 1>&2 *** Warning: the GNU linker, at least up to release 2.19, is reported *** to be unable to reliably create shared libraries on AIX. *** Therefore, libtool is disabling shared libraries support. If you *** really care for shared libraries, you may want to install binutils *** 2.20 or above, or modify your PATH so that a non-GNU linker is found. *** You will then need to restart the configuration process. _LT_EOF fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='' ;; m68k) _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_minus_L, $1)=yes ;; esac ;; beos*) if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then _LT_TAGVAR(allow_undefined_flag, $1)=unsupported # Joseph Beckenbach says some releases of gcc # support --undefined. This deserves some investigation. FIXME _LT_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; cygwin* | mingw* | pw32* | cegcc*) # _LT_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless, # as there is no search path for DLLs. _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-all-symbols' _LT_TAGVAR(allow_undefined_flag, $1)=unsupported _LT_TAGVAR(always_export_symbols, $1)=no _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1 DATA/;s/^.*[[ ]]__nm__\([[^ ]]*\)[[ ]][[^ ]]*/\1 DATA/;/^I[[ ]]/d;/^[[AITW]][[ ]]/s/.* //'\'' | sort | uniq > $export_symbols' _LT_TAGVAR(exclude_expsyms, $1)=['[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname'] if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' # If the export-symbols file already is a .def file (1st line # is EXPORTS), use it as is; otherwise, prepend... _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then cp $export_symbols $output_objdir/$soname.def; else echo EXPORTS > $output_objdir/$soname.def; cat $export_symbols >> $output_objdir/$soname.def; fi~ $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; haiku*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(link_all_deplibs, $1)=yes ;; interix[[3-9]]*) _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. # Instead, shared libraries are loaded at an image base (0x10000000 by # default) and relocated if they conflict, which is a slow very memory # consuming and fragmenting process. To avoid this, we pick a random, # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link # time. Moving up from 0x10000000 also allows more sbrk(2) space. _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' ;; gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu) tmp_diet=no if test "$host_os" = linux-dietlibc; then case $cc_basename in diet\ *) tmp_diet=yes;; # linux-dietlibc with static linking (!diet-dyn) esac fi if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \ && test "$tmp_diet" = no then tmp_addflag=' $pic_flag' tmp_sharedflag='-shared' case $cc_basename,$host_cpu in pgcc*) # Portland Group C compiler _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' tmp_addflag=' $pic_flag' ;; pgf77* | pgf90* | pgf95* | pgfortran*) # Portland Group f77 and f90 compilers _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' tmp_addflag=' $pic_flag -Mnomain' ;; ecc*,ia64* | icc*,ia64*) # Intel C compiler on ia64 tmp_addflag=' -i_dynamic' ;; efc*,ia64* | ifort*,ia64*) # Intel Fortran compiler on ia64 tmp_addflag=' -i_dynamic -nofor_main' ;; ifc* | ifort*) # Intel Fortran compiler tmp_addflag=' -nofor_main' ;; lf95*) # Lahey Fortran 8.1 _LT_TAGVAR(whole_archive_flag_spec, $1)= tmp_sharedflag='--shared' ;; xl[[cC]]* | bgxl[[cC]]* | mpixl[[cC]]*) # IBM XL C 8.0 on PPC (deal with xlf below) tmp_sharedflag='-qmkshrobj' tmp_addflag= ;; nvcc*) # Cuda Compiler Driver 2.2 _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' _LT_TAGVAR(compiler_needs_object, $1)=yes ;; esac case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C 5.9 _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' _LT_TAGVAR(compiler_needs_object, $1)=yes tmp_sharedflag='-G' ;; *Sun\ F*) # Sun Fortran 8.3 tmp_sharedflag='-G' ;; esac _LT_TAGVAR(archive_cmds, $1)='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' if test "x$supports_anon_versioning" = xyes; then _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ echo "local: *; };" >> $output_objdir/$libname.ver~ $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' fi case $cc_basename in xlf* | bgf* | bgxlf* | mpixlf*) # IBM XL Fortran 10.1 on PPC cannot create shared libs itself _LT_TAGVAR(whole_archive_flag_spec, $1)='--whole-archive$convenience --no-whole-archive' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(archive_cmds, $1)='$LD -shared $libobjs $deplibs $linker_flags -soname $soname -o $lib' if test "x$supports_anon_versioning" = xyes; then _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ echo "local: *; };" >> $output_objdir/$libname.ver~ $LD -shared $libobjs $deplibs $linker_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib' fi ;; esac else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; netbsd*) if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' wlarc= else _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' fi ;; solaris*) if $LD -v 2>&1 | $GREP 'BFD 2\.8' > /dev/null; then _LT_TAGVAR(ld_shlibs, $1)=no cat <<_LT_EOF 1>&2 *** Warning: The releases 2.8.* of the GNU linker cannot reliably *** create shared libraries on Solaris systems. Therefore, libtool *** is disabling shared libraries support. We urge you to upgrade GNU *** binutils to release 2.9.1 or newer. Another option is to modify *** your PATH or compiler configuration so that the native linker is *** used, and then restart. _LT_EOF elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*) case `$LD -v 2>&1` in *\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.1[[0-5]].*) _LT_TAGVAR(ld_shlibs, $1)=no cat <<_LT_EOF 1>&2 *** Warning: Releases of the GNU linker prior to 2.16.91.0.3 can not *** reliably create shared libraries on SCO systems. Therefore, libtool *** is disabling shared libraries support. We urge you to upgrade GNU *** binutils to release 2.16.91.0.3 or newer. Another option is to modify *** your PATH or compiler configuration so that the native linker is *** used, and then restart. _LT_EOF ;; *) # For security reasons, it is highly recommended that you always # use absolute paths for naming shared libraries, and exclude the # DT_RUNPATH tag from executables and libraries. But doing so # requires that you compile everything twice, which is a pain. if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; esac ;; sunos4*) _LT_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' wlarc= _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; *) if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; esac if test "$_LT_TAGVAR(ld_shlibs, $1)" = no; then runpath_var= _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= _LT_TAGVAR(export_dynamic_flag_spec, $1)= _LT_TAGVAR(whole_archive_flag_spec, $1)= fi else # PORTME fill in a description of your system's linker (not GNU ld) case $host_os in aix3*) _LT_TAGVAR(allow_undefined_flag, $1)=unsupported _LT_TAGVAR(always_export_symbols, $1)=yes _LT_TAGVAR(archive_expsym_cmds, $1)='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname' # Note: this linker hardcodes the directories in LIBPATH if there # are no directories specified by -L. _LT_TAGVAR(hardcode_minus_L, $1)=yes if test "$GCC" = yes && test -z "$lt_prog_compiler_static"; then # Neither direct hardcoding nor static linking is supported with a # broken collect2. _LT_TAGVAR(hardcode_direct, $1)=unsupported fi ;; aix[[4-9]]*) if test "$host_cpu" = ia64; then # On IA64, the linker does run time linking by default, so we don't # have to do anything special. aix_use_runtimelinking=no exp_sym_flag='-Bexport' no_entry_flag="" else # If we're using GNU nm, then we don't want the "-C" option. # -C means demangle to AIX nm, but means don't demangle with GNU nm # Also, AIX nm treats weak defined symbols like other global # defined symbols, whereas GNU nm marks them as "W". if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then _LT_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' else _LT_TAGVAR(export_symbols_cmds, $1)='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' fi aix_use_runtimelinking=no # Test if we are trying to use run time linking or normal # AIX style linking. If -brtl is somewhere in LDFLAGS, we # need to do runtime linking. case $host_os in aix4.[[23]]|aix4.[[23]].*|aix[[5-9]]*) for ld_flag in $LDFLAGS; do if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then aix_use_runtimelinking=yes break fi done ;; esac exp_sym_flag='-bexport' no_entry_flag='-bnoentry' fi # When large executables or shared objects are built, AIX ld can # have problems creating the table of contents. If linking a library # or program results in "error TOC overflow" add -mminimal-toc to # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. _LT_TAGVAR(archive_cmds, $1)='' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_direct_absolute, $1)=yes _LT_TAGVAR(hardcode_libdir_separator, $1)=':' _LT_TAGVAR(link_all_deplibs, $1)=yes _LT_TAGVAR(file_list_spec, $1)='${wl}-f,' if test "$GCC" = yes; then case $host_os in aix4.[[012]]|aix4.[[012]].*) # We only want to do this on AIX 4.2 and lower, the check # below for broken collect2 doesn't work under 4.3+ collect2name=`${CC} -print-prog-name=collect2` if test -f "$collect2name" && strings "$collect2name" | $GREP resolve_lib_name >/dev/null then # We have reworked collect2 : else # We have old collect2 _LT_TAGVAR(hardcode_direct, $1)=unsupported # It fails to find uninstalled libraries when the uninstalled # path is not listed in the libpath. Setting hardcode_minus_L # to unsupported forces relinking _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)= fi ;; esac shared_flag='-shared' if test "$aix_use_runtimelinking" = yes; then shared_flag="$shared_flag "'${wl}-G' fi else # not using gcc if test "$host_cpu" = ia64; then # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release # chokes on -Wl,-G. The following line is correct: shared_flag='-G' else if test "$aix_use_runtimelinking" = yes; then shared_flag='${wl}-G' else shared_flag='${wl}-bM:SRE' fi fi fi _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-bexpall' # It seems that -bexpall does not export symbols beginning with # underscore (_), so it is better to generate a list of symbols to export. _LT_TAGVAR(always_export_symbols, $1)=yes if test "$aix_use_runtimelinking" = yes; then # Warning - without using the other runtime loading flags (-brtl), # -berok will link without error, but may produce a broken library. _LT_TAGVAR(allow_undefined_flag, $1)='-berok' # Determine the default libpath from the value encoded in an # empty executable. _LT_SYS_MODULE_PATH_AIX([$1]) _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" else if test "$host_cpu" = ia64; then _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib' _LT_TAGVAR(allow_undefined_flag, $1)="-z nodefs" _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" else # Determine the default libpath from the value encoded in an # empty executable. _LT_SYS_MODULE_PATH_AIX([$1]) _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" # Warning - without using the other run time loading flags, # -berok will link without error, but may produce a broken library. _LT_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok' _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok' if test "$with_gnu_ld" = yes; then # We only use this code for GNU lds that support --whole-archive. _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive' else # Exported symbols can be pulled into shared objects from archives _LT_TAGVAR(whole_archive_flag_spec, $1)='$convenience' fi _LT_TAGVAR(archive_cmds_need_lc, $1)=yes # This is similar to how AIX traditionally builds its shared libraries. _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' fi fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='' ;; m68k) _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_minus_L, $1)=yes ;; esac ;; bsdi[[45]]*) _LT_TAGVAR(export_dynamic_flag_spec, $1)=-rdynamic ;; cygwin* | mingw* | pw32* | cegcc*) # When not using gcc, we currently assume that we are using # Microsoft Visual C++. # hardcode_libdir_flag_spec is actually meaningless, as there is # no search path for DLLs. case $cc_basename in cl*) # Native MSVC _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' ' _LT_TAGVAR(allow_undefined_flag, $1)=unsupported _LT_TAGVAR(always_export_symbols, $1)=yes _LT_TAGVAR(file_list_spec, $1)='@' # Tell ltmain to make .lib files, not .a files. libext=lib # Tell ltmain to make .dll files, not .so files. shrext_cmds=".dll" # FIXME: Setting linknames here is a bad hack. _LT_TAGVAR(archive_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames=' _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then sed -n -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' -e '1\\\!p' < $export_symbols > $output_objdir/$soname.exp; else sed -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp; fi~ $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ linknames=' # The linker will not automatically build a static lib if we build a DLL. # _LT_TAGVAR(old_archive_from_new_cmds, $1)='true' _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes _LT_TAGVAR(exclude_expsyms, $1)='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*' _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1,DATA/'\'' | $SED -e '\''/^[[AITW]][[ ]]/s/.*[[ ]]//'\'' | sort | uniq > $export_symbols' # Don't use ranlib _LT_TAGVAR(old_postinstall_cmds, $1)='chmod 644 $oldlib' _LT_TAGVAR(postlink_cmds, $1)='lt_outputfile="@OUTPUT@"~ lt_tool_outputfile="@TOOL_OUTPUT@"~ case $lt_outputfile in *.exe|*.EXE) ;; *) lt_outputfile="$lt_outputfile.exe" lt_tool_outputfile="$lt_tool_outputfile.exe" ;; esac~ if test "$MANIFEST_TOOL" != ":" && test -f "$lt_outputfile.manifest"; then $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; $RM "$lt_outputfile.manifest"; fi' ;; *) # Assume MSVC wrapper _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' ' _LT_TAGVAR(allow_undefined_flag, $1)=unsupported # Tell ltmain to make .lib files, not .a files. libext=lib # Tell ltmain to make .dll files, not .so files. shrext_cmds=".dll" # FIXME: Setting linknames here is a bad hack. _LT_TAGVAR(archive_cmds, $1)='$CC -o $lib $libobjs $compiler_flags `func_echo_all "$deplibs" | $SED '\''s/ -lc$//'\''` -link -dll~linknames=' # The linker will automatically build a .lib file if we build a DLL. _LT_TAGVAR(old_archive_from_new_cmds, $1)='true' # FIXME: Should let the user specify the lib program. _LT_TAGVAR(old_archive_cmds, $1)='lib -OUT:$oldlib$oldobjs$old_deplibs' _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes ;; esac ;; darwin* | rhapsody*) _LT_DARWIN_LINKER_FEATURES($1) ;; dgux*) _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor # support. Future versions do this automatically, but an explicit c++rt0.o # does not break anything, and helps significantly (at the cost of a little # extra space). freebsd2.2*) _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; # Unfortunately, older versions of FreeBSD 2 do not have this feature. freebsd2.*) _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; # FreeBSD 3 and greater uses gcc -shared to do shared libraries. freebsd* | dragonfly*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; hpux9*) if test "$GCC" = yes; then _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared $pic_flag ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' else _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' fi _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: _LT_TAGVAR(hardcode_direct, $1)=yes # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' ;; hpux10*) if test "$GCC" = yes && test "$with_gnu_ld" = no; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' else _LT_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' fi if test "$with_gnu_ld" = no; then _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_direct_absolute, $1)=yes _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. _LT_TAGVAR(hardcode_minus_L, $1)=yes fi ;; hpux11*) if test "$GCC" = yes && test "$with_gnu_ld" = no; then case $host_cpu in hppa*64*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' ;; ia64*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' ;; esac else case $host_cpu in hppa*64*) _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' ;; ia64*) _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' ;; *) m4_if($1, [], [ # Older versions of the 11.00 compiler do not understand -b yet # (HP92453-01 A.11.01.20 doesn't, HP92453-01 B.11.X.35175-35176.GP does) _LT_LINKER_OPTION([if $CC understands -b], _LT_TAGVAR(lt_cv_prog_compiler__b, $1), [-b], [_LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'], [_LT_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'])], [_LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags']) ;; esac fi if test "$with_gnu_ld" = no; then _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: case $host_cpu in hppa*64*|ia64*) _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; *) _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_direct_absolute, $1)=yes _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. _LT_TAGVAR(hardcode_minus_L, $1)=yes ;; esac fi ;; irix5* | irix6* | nonstopux*) if test "$GCC" = yes; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' # Try to use the -exported_symbol ld option, if it does not # work, assume that -exports_file does not work either and # implicitly export all symbols. # This should be the same for all languages, so no per-tag cache variable. AC_CACHE_CHECK([whether the $host_os linker accepts -exported_symbol], [lt_cv_irix_exported_symbol], [save_LDFLAGS="$LDFLAGS" LDFLAGS="$LDFLAGS -shared ${wl}-exported_symbol ${wl}foo ${wl}-update_registry ${wl}/dev/null" AC_LINK_IFELSE( [AC_LANG_SOURCE( [AC_LANG_CASE([C], [[int foo (void) { return 0; }]], [C++], [[int foo (void) { return 0; }]], [Fortran 77], [[ subroutine foo end]], [Fortran], [[ subroutine foo end]])])], [lt_cv_irix_exported_symbol=yes], [lt_cv_irix_exported_symbol=no]) LDFLAGS="$save_LDFLAGS"]) if test "$lt_cv_irix_exported_symbol" = yes; then _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations ${wl}-exports_file ${wl}$export_symbols -o $lib' fi else _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -exports_file $export_symbols -o $lib' fi _LT_TAGVAR(archive_cmds_need_lc, $1)='no' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: _LT_TAGVAR(inherit_rpath, $1)=yes _LT_TAGVAR(link_all_deplibs, $1)=yes ;; netbsd*) if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out else _LT_TAGVAR(archive_cmds, $1)='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF fi _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; newsos6) _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; *nto* | *qnx*) ;; openbsd*) if test -f /usr/libexec/ld.so; then _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=yes if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' else case $host_os in openbsd[[01]].* | openbsd2.[[0-7]] | openbsd2.[[0-7]].*) _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' ;; esac fi else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; os2*) _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(allow_undefined_flag, $1)=unsupported _LT_TAGVAR(archive_cmds, $1)='$ECHO "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~echo DATA >> $output_objdir/$libname.def~echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def' _LT_TAGVAR(old_archive_from_new_cmds, $1)='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def' ;; osf3*) if test "$GCC" = yes; then _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' else _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' fi _LT_TAGVAR(archive_cmds_need_lc, $1)='no' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: ;; osf4* | osf5*) # as osf3* with the addition of -msym flag if test "$GCC" = yes; then _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $pic_flag $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' else _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; printf "%s\\n" "-hidden">> $lib.exp~ $CC -shared${allow_undefined_flag} ${wl}-input ${wl}$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib~$RM $lib.exp' # Both c and cxx compiler support -rpath directly _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' fi _LT_TAGVAR(archive_cmds_need_lc, $1)='no' _LT_TAGVAR(hardcode_libdir_separator, $1)=: ;; solaris*) _LT_TAGVAR(no_undefined_flag, $1)=' -z defs' if test "$GCC" = yes; then wlarc='${wl}' _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' else case `$CC -V 2>&1` in *"Compilers 5.0"*) wlarc='' _LT_TAGVAR(archive_cmds, $1)='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp' ;; *) wlarc='${wl}' _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' ;; esac fi _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no case $host_os in solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; *) # The compiler driver will combine and reorder linker options, # but understands `-z linker_flag'. GCC discards it without `$wl', # but is careful enough not to reorder. # Supported since Solaris 2.6 (maybe 2.5.1?) if test "$GCC" = yes; then _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' else _LT_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract' fi ;; esac _LT_TAGVAR(link_all_deplibs, $1)=yes ;; sunos4*) if test "x$host_vendor" = xsequent; then # Use $CC to link under sequent, because it throws in some extra .o # files that make .init and .fini sections work. _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags' else _LT_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' fi _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; sysv4) case $host_vendor in sni) _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_direct, $1)=yes # is this really true??? ;; siemens) ## LD is ld it makes a PLAMLIB ## CC just makes a GrossModule. _LT_TAGVAR(archive_cmds, $1)='$LD -G -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(reload_cmds, $1)='$CC -r -o $output$reload_objs' _LT_TAGVAR(hardcode_direct, $1)=no ;; motorola) _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_direct, $1)=no #Motorola manual says yes, but my tests say they lie ;; esac runpath_var='LD_RUN_PATH' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; sysv4.3*) _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(export_dynamic_flag_spec, $1)='-Bexport' ;; sysv4*MP*) if test -d /usr/nec; then _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no runpath_var=LD_RUN_PATH hardcode_runpath_var=yes _LT_TAGVAR(ld_shlibs, $1)=yes fi ;; sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*) _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no runpath_var='LD_RUN_PATH' if test "$GCC" = yes; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' else _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' fi ;; sysv5* | sco3.2v5* | sco5v6*) # Note: We can NOT use -z defs as we might desire, because we do not # link with -lc, and that would cause any symbols used from libc to # always be unresolved, which means just about no library would # ever link correctly. If we're not using GNU ld we use -z text # though, which does catch some bad symbols but isn't as heavy-handed # as -z defs. _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' _LT_TAGVAR(allow_undefined_flag, $1)='${wl}-z,nodefs' _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R,$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=':' _LT_TAGVAR(link_all_deplibs, $1)=yes _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Bexport' runpath_var='LD_RUN_PATH' if test "$GCC" = yes; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' else _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' fi ;; uts4*) _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; *) _LT_TAGVAR(ld_shlibs, $1)=no ;; esac if test x$host_vendor = xsni; then case $host in sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Blargedynsym' ;; esac fi fi ]) AC_MSG_RESULT([$_LT_TAGVAR(ld_shlibs, $1)]) test "$_LT_TAGVAR(ld_shlibs, $1)" = no && can_build_shared=no _LT_TAGVAR(with_gnu_ld, $1)=$with_gnu_ld _LT_DECL([], [libext], [0], [Old archive suffix (normally "a")])dnl _LT_DECL([], [shrext_cmds], [1], [Shared library suffix (normally ".so")])dnl _LT_DECL([], [extract_expsyms_cmds], [2], [The commands to extract the exported symbol list from a shared archive]) # # Do we need to explicitly link libc? # case "x$_LT_TAGVAR(archive_cmds_need_lc, $1)" in x|xyes) # Assume -lc should be added _LT_TAGVAR(archive_cmds_need_lc, $1)=yes if test "$enable_shared" = yes && test "$GCC" = yes; then case $_LT_TAGVAR(archive_cmds, $1) in *'~'*) # FIXME: we may have to deal with multi-command sequences. ;; '$CC '*) # Test whether the compiler implicitly links with -lc since on some # systems, -lgcc has to come before -lc. If gcc already passes -lc # to ld, don't add -lc before -lgcc. AC_CACHE_CHECK([whether -lc should be explicitly linked in], [lt_cv_]_LT_TAGVAR(archive_cmds_need_lc, $1), [$RM conftest* echo "$lt_simple_compile_test_code" > conftest.$ac_ext if AC_TRY_EVAL(ac_compile) 2>conftest.err; then soname=conftest lib=conftest libobjs=conftest.$ac_objext deplibs= wl=$_LT_TAGVAR(lt_prog_compiler_wl, $1) pic_flag=$_LT_TAGVAR(lt_prog_compiler_pic, $1) compiler_flags=-v linker_flags=-v verstring= output_objdir=. libname=conftest lt_save_allow_undefined_flag=$_LT_TAGVAR(allow_undefined_flag, $1) _LT_TAGVAR(allow_undefined_flag, $1)= if AC_TRY_EVAL(_LT_TAGVAR(archive_cmds, $1) 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) then lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1)=no else lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1)=yes fi _LT_TAGVAR(allow_undefined_flag, $1)=$lt_save_allow_undefined_flag else cat conftest.err 1>&5 fi $RM conftest* ]) _LT_TAGVAR(archive_cmds_need_lc, $1)=$lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1) ;; esac fi ;; esac _LT_TAGDECL([build_libtool_need_lc], [archive_cmds_need_lc], [0], [Whether or not to add -lc for building shared libraries]) _LT_TAGDECL([allow_libtool_libs_with_static_runtimes], [enable_shared_with_static_runtimes], [0], [Whether or not to disallow shared libs when runtime libs are static]) _LT_TAGDECL([], [export_dynamic_flag_spec], [1], [Compiler flag to allow reflexive dlopens]) _LT_TAGDECL([], [whole_archive_flag_spec], [1], [Compiler flag to generate shared objects directly from archives]) _LT_TAGDECL([], [compiler_needs_object], [1], [Whether the compiler copes with passing no objects directly]) _LT_TAGDECL([], [old_archive_from_new_cmds], [2], [Create an old-style archive from a shared archive]) _LT_TAGDECL([], [old_archive_from_expsyms_cmds], [2], [Create a temporary old-style archive to link instead of a shared archive]) _LT_TAGDECL([], [archive_cmds], [2], [Commands used to build a shared archive]) _LT_TAGDECL([], [archive_expsym_cmds], [2]) _LT_TAGDECL([], [module_cmds], [2], [Commands used to build a loadable module if different from building a shared archive.]) _LT_TAGDECL([], [module_expsym_cmds], [2]) _LT_TAGDECL([], [with_gnu_ld], [1], [Whether we are building with GNU ld or not]) _LT_TAGDECL([], [allow_undefined_flag], [1], [Flag that allows shared libraries with undefined symbols to be built]) _LT_TAGDECL([], [no_undefined_flag], [1], [Flag that enforces no undefined symbols]) _LT_TAGDECL([], [hardcode_libdir_flag_spec], [1], [Flag to hardcode $libdir into a binary during linking. This must work even if $libdir does not exist]) _LT_TAGDECL([], [hardcode_libdir_separator], [1], [Whether we need a single "-rpath" flag with a separated argument]) _LT_TAGDECL([], [hardcode_direct], [0], [Set to "yes" if using DIR/libNAME${shared_ext} during linking hardcodes DIR into the resulting binary]) _LT_TAGDECL([], [hardcode_direct_absolute], [0], [Set to "yes" if using DIR/libNAME${shared_ext} during linking hardcodes DIR into the resulting binary and the resulting library dependency is "absolute", i.e impossible to change by setting ${shlibpath_var} if the library is relocated]) _LT_TAGDECL([], [hardcode_minus_L], [0], [Set to "yes" if using the -LDIR flag during linking hardcodes DIR into the resulting binary]) _LT_TAGDECL([], [hardcode_shlibpath_var], [0], [Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into the resulting binary]) _LT_TAGDECL([], [hardcode_automatic], [0], [Set to "yes" if building a shared library automatically hardcodes DIR into the library and all subsequent libraries and executables linked against it]) _LT_TAGDECL([], [inherit_rpath], [0], [Set to yes if linker adds runtime paths of dependent libraries to runtime path list]) _LT_TAGDECL([], [link_all_deplibs], [0], [Whether libtool must link a program against all its dependency libraries]) _LT_TAGDECL([], [always_export_symbols], [0], [Set to "yes" if exported symbols are required]) _LT_TAGDECL([], [export_symbols_cmds], [2], [The commands to list exported symbols]) _LT_TAGDECL([], [exclude_expsyms], [1], [Symbols that should not be listed in the preloaded symbols]) _LT_TAGDECL([], [include_expsyms], [1], [Symbols that must always be exported]) _LT_TAGDECL([], [prelink_cmds], [2], [Commands necessary for linking programs (against libraries) with templates]) _LT_TAGDECL([], [postlink_cmds], [2], [Commands necessary for finishing linking programs]) _LT_TAGDECL([], [file_list_spec], [1], [Specify filename containing input files]) dnl FIXME: Not yet implemented dnl _LT_TAGDECL([], [thread_safe_flag_spec], [1], dnl [Compiler flag to generate thread safe objects]) ])# _LT_LINKER_SHLIBS # _LT_LANG_C_CONFIG([TAG]) # ------------------------ # Ensure that the configuration variables for a C compiler are suitably # defined. These variables are subsequently used by _LT_CONFIG to write # the compiler configuration to `libtool'. m4_defun([_LT_LANG_C_CONFIG], [m4_require([_LT_DECL_EGREP])dnl lt_save_CC="$CC" AC_LANG_PUSH(C) # Source file extension for C test sources. ac_ext=c # Object file extension for compiled C test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # Code to be used in simple compile tests lt_simple_compile_test_code="int some_variable = 0;" # Code to be used in simple link tests lt_simple_link_test_code='int main(){return(0);}' _LT_TAG_COMPILER # Save the default compiler, since it gets overwritten when the other # tags are being tested, and _LT_TAGVAR(compiler, []) is a NOP. compiler_DEFAULT=$CC # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... if test -n "$compiler"; then _LT_COMPILER_NO_RTTI($1) _LT_COMPILER_PIC($1) _LT_COMPILER_C_O($1) _LT_COMPILER_FILE_LOCKS($1) _LT_LINKER_SHLIBS($1) _LT_SYS_DYNAMIC_LINKER($1) _LT_LINKER_HARDCODE_LIBPATH($1) LT_SYS_DLOPEN_SELF _LT_CMD_STRIPLIB # Report which library types will actually be built AC_MSG_CHECKING([if libtool supports shared libraries]) AC_MSG_RESULT([$can_build_shared]) AC_MSG_CHECKING([whether to build shared libraries]) test "$can_build_shared" = "no" && enable_shared=no # On AIX, shared libraries and static libraries use the same namespace, and # are all built from PIC. case $host_os in aix3*) test "$enable_shared" = yes && enable_static=no if test -n "$RANLIB"; then archive_cmds="$archive_cmds~\$RANLIB \$lib" postinstall_cmds='$RANLIB $lib' fi ;; aix[[4-9]]*) if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then test "$enable_shared" = yes && enable_static=no fi ;; esac AC_MSG_RESULT([$enable_shared]) AC_MSG_CHECKING([whether to build static libraries]) # Make sure either enable_shared or enable_static is yes. test "$enable_shared" = yes || enable_static=yes AC_MSG_RESULT([$enable_static]) _LT_CONFIG($1) fi AC_LANG_POP CC="$lt_save_CC" ])# _LT_LANG_C_CONFIG # _LT_LANG_CXX_CONFIG([TAG]) # -------------------------- # Ensure that the configuration variables for a C++ compiler are suitably # defined. These variables are subsequently used by _LT_CONFIG to write # the compiler configuration to `libtool'. m4_defun([_LT_LANG_CXX_CONFIG], [m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_DECL_EGREP])dnl m4_require([_LT_PATH_MANIFEST_TOOL])dnl if test -n "$CXX" && ( test "X$CXX" != "Xno" && ( (test "X$CXX" = "Xg++" && `g++ -v >/dev/null 2>&1` ) || (test "X$CXX" != "Xg++"))) ; then AC_PROG_CXXCPP else _lt_caught_CXX_error=yes fi AC_LANG_PUSH(C++) _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(allow_undefined_flag, $1)= _LT_TAGVAR(always_export_symbols, $1)=no _LT_TAGVAR(archive_expsym_cmds, $1)= _LT_TAGVAR(compiler_needs_object, $1)=no _LT_TAGVAR(export_dynamic_flag_spec, $1)= _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= _LT_TAGVAR(hardcode_libdir_separator, $1)= _LT_TAGVAR(hardcode_minus_L, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported _LT_TAGVAR(hardcode_automatic, $1)=no _LT_TAGVAR(inherit_rpath, $1)=no _LT_TAGVAR(module_cmds, $1)= _LT_TAGVAR(module_expsym_cmds, $1)= _LT_TAGVAR(link_all_deplibs, $1)=unknown _LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds _LT_TAGVAR(reload_flag, $1)=$reload_flag _LT_TAGVAR(reload_cmds, $1)=$reload_cmds _LT_TAGVAR(no_undefined_flag, $1)= _LT_TAGVAR(whole_archive_flag_spec, $1)= _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no # Source file extension for C++ test sources. ac_ext=cpp # Object file extension for compiled C++ test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # No sense in running all these tests if we already determined that # the CXX compiler isn't working. Some variables (like enable_shared) # are currently assumed to apply to all compilers on this platform, # and will be corrupted by setting them based on a non-working compiler. if test "$_lt_caught_CXX_error" != yes; then # Code to be used in simple compile tests lt_simple_compile_test_code="int some_variable = 0;" # Code to be used in simple link tests lt_simple_link_test_code='int main(int, char *[[]]) { return(0); }' # ltmain only uses $CC for tagged configurations so make sure $CC is set. _LT_TAG_COMPILER # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE # Allow CC to be a program name with arguments. lt_save_CC=$CC lt_save_CFLAGS=$CFLAGS lt_save_LD=$LD lt_save_GCC=$GCC GCC=$GXX lt_save_with_gnu_ld=$with_gnu_ld lt_save_path_LD=$lt_cv_path_LD if test -n "${lt_cv_prog_gnu_ldcxx+set}"; then lt_cv_prog_gnu_ld=$lt_cv_prog_gnu_ldcxx else $as_unset lt_cv_prog_gnu_ld fi if test -n "${lt_cv_path_LDCXX+set}"; then lt_cv_path_LD=$lt_cv_path_LDCXX else $as_unset lt_cv_path_LD fi test -z "${LDCXX+set}" || LD=$LDCXX CC=${CXX-"c++"} CFLAGS=$CXXFLAGS compiler=$CC _LT_TAGVAR(compiler, $1)=$CC _LT_CC_BASENAME([$compiler]) if test -n "$compiler"; then # We don't want -fno-exception when compiling C++ code, so set the # no_builtin_flag separately if test "$GXX" = yes; then _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin' else _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)= fi if test "$GXX" = yes; then # Set up default GNU C++ configuration LT_PATH_LD # Check if GNU C++ uses GNU ld as the underlying linker, since the # archiving commands below assume that GNU ld is being used. if test "$with_gnu_ld" = yes; then _LT_TAGVAR(archive_cmds, $1)='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' # If archive_cmds runs LD, not CC, wlarc should be empty # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to # investigate it a little bit more. (MM) wlarc='${wl}' # ancient GNU ld didn't support --whole-archive et. al. if eval "`$CC -print-prog-name=ld` --help 2>&1" | $GREP 'no-whole-archive' > /dev/null; then _LT_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' else _LT_TAGVAR(whole_archive_flag_spec, $1)= fi else with_gnu_ld=no wlarc= # A generic and very simple default shared library creation # command for GNU C++ for the case where it uses the native # linker, instead of GNU ld. If possible, this setting should # overridden to take advantage of the native linker features on # the platform it is being used on. _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' fi # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' else GXX=no with_gnu_ld=no wlarc= fi # PORTME: fill in a description of your system's C++ link characteristics AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries]) _LT_TAGVAR(ld_shlibs, $1)=yes case $host_os in aix3*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; aix[[4-9]]*) if test "$host_cpu" = ia64; then # On IA64, the linker does run time linking by default, so we don't # have to do anything special. aix_use_runtimelinking=no exp_sym_flag='-Bexport' no_entry_flag="" else aix_use_runtimelinking=no # Test if we are trying to use run time linking or normal # AIX style linking. If -brtl is somewhere in LDFLAGS, we # need to do runtime linking. case $host_os in aix4.[[23]]|aix4.[[23]].*|aix[[5-9]]*) for ld_flag in $LDFLAGS; do case $ld_flag in *-brtl*) aix_use_runtimelinking=yes break ;; esac done ;; esac exp_sym_flag='-bexport' no_entry_flag='-bnoentry' fi # When large executables or shared objects are built, AIX ld can # have problems creating the table of contents. If linking a library # or program results in "error TOC overflow" add -mminimal-toc to # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. _LT_TAGVAR(archive_cmds, $1)='' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_direct_absolute, $1)=yes _LT_TAGVAR(hardcode_libdir_separator, $1)=':' _LT_TAGVAR(link_all_deplibs, $1)=yes _LT_TAGVAR(file_list_spec, $1)='${wl}-f,' if test "$GXX" = yes; then case $host_os in aix4.[[012]]|aix4.[[012]].*) # We only want to do this on AIX 4.2 and lower, the check # below for broken collect2 doesn't work under 4.3+ collect2name=`${CC} -print-prog-name=collect2` if test -f "$collect2name" && strings "$collect2name" | $GREP resolve_lib_name >/dev/null then # We have reworked collect2 : else # We have old collect2 _LT_TAGVAR(hardcode_direct, $1)=unsupported # It fails to find uninstalled libraries when the uninstalled # path is not listed in the libpath. Setting hardcode_minus_L # to unsupported forces relinking _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)= fi esac shared_flag='-shared' if test "$aix_use_runtimelinking" = yes; then shared_flag="$shared_flag "'${wl}-G' fi else # not using gcc if test "$host_cpu" = ia64; then # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release # chokes on -Wl,-G. The following line is correct: shared_flag='-G' else if test "$aix_use_runtimelinking" = yes; then shared_flag='${wl}-G' else shared_flag='${wl}-bM:SRE' fi fi fi _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-bexpall' # It seems that -bexpall does not export symbols beginning with # underscore (_), so it is better to generate a list of symbols to # export. _LT_TAGVAR(always_export_symbols, $1)=yes if test "$aix_use_runtimelinking" = yes; then # Warning - without using the other runtime loading flags (-brtl), # -berok will link without error, but may produce a broken library. _LT_TAGVAR(allow_undefined_flag, $1)='-berok' # Determine the default libpath from the value encoded in an empty # executable. _LT_SYS_MODULE_PATH_AIX([$1]) _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" else if test "$host_cpu" = ia64; then _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib' _LT_TAGVAR(allow_undefined_flag, $1)="-z nodefs" _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" else # Determine the default libpath from the value encoded in an # empty executable. _LT_SYS_MODULE_PATH_AIX([$1]) _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" # Warning - without using the other run time loading flags, # -berok will link without error, but may produce a broken library. _LT_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok' _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok' if test "$with_gnu_ld" = yes; then # We only use this code for GNU lds that support --whole-archive. _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive' else # Exported symbols can be pulled into shared objects from archives _LT_TAGVAR(whole_archive_flag_spec, $1)='$convenience' fi _LT_TAGVAR(archive_cmds_need_lc, $1)=yes # This is similar to how AIX traditionally builds its shared # libraries. _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' fi fi ;; beos*) if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then _LT_TAGVAR(allow_undefined_flag, $1)=unsupported # Joseph Beckenbach says some releases of gcc # support --undefined. This deserves some investigation. FIXME _LT_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; chorus*) case $cc_basename in *) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; esac ;; cygwin* | mingw* | pw32* | cegcc*) case $GXX,$cc_basename in ,cl* | no,cl*) # Native MSVC # hardcode_libdir_flag_spec is actually meaningless, as there is # no search path for DLLs. _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' ' _LT_TAGVAR(allow_undefined_flag, $1)=unsupported _LT_TAGVAR(always_export_symbols, $1)=yes _LT_TAGVAR(file_list_spec, $1)='@' # Tell ltmain to make .lib files, not .a files. libext=lib # Tell ltmain to make .dll files, not .so files. shrext_cmds=".dll" # FIXME: Setting linknames here is a bad hack. _LT_TAGVAR(archive_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames=' _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then $SED -n -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' -e '1\\\!p' < $export_symbols > $output_objdir/$soname.exp; else $SED -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp; fi~ $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ linknames=' # The linker will not automatically build a static lib if we build a DLL. # _LT_TAGVAR(old_archive_from_new_cmds, $1)='true' _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes # Don't use ranlib _LT_TAGVAR(old_postinstall_cmds, $1)='chmod 644 $oldlib' _LT_TAGVAR(postlink_cmds, $1)='lt_outputfile="@OUTPUT@"~ lt_tool_outputfile="@TOOL_OUTPUT@"~ case $lt_outputfile in *.exe|*.EXE) ;; *) lt_outputfile="$lt_outputfile.exe" lt_tool_outputfile="$lt_tool_outputfile.exe" ;; esac~ func_to_tool_file "$lt_outputfile"~ if test "$MANIFEST_TOOL" != ":" && test -f "$lt_outputfile.manifest"; then $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; $RM "$lt_outputfile.manifest"; fi' ;; *) # g++ # _LT_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless, # as there is no search path for DLLs. _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-all-symbols' _LT_TAGVAR(allow_undefined_flag, $1)=unsupported _LT_TAGVAR(always_export_symbols, $1)=no _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' # If the export-symbols file already is a .def file (1st line # is EXPORTS), use it as is; otherwise, prepend... _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then cp $export_symbols $output_objdir/$soname.def; else echo EXPORTS > $output_objdir/$soname.def; cat $export_symbols >> $output_objdir/$soname.def; fi~ $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; esac ;; darwin* | rhapsody*) _LT_DARWIN_LINKER_FEATURES($1) ;; dgux*) case $cc_basename in ec++*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; ghcx*) # Green Hills C++ Compiler # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; *) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; esac ;; freebsd2.*) # C++ shared libraries reported to be fairly broken before # switch to ELF _LT_TAGVAR(ld_shlibs, $1)=no ;; freebsd-elf*) _LT_TAGVAR(archive_cmds_need_lc, $1)=no ;; freebsd* | dragonfly*) # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF # conventions _LT_TAGVAR(ld_shlibs, $1)=yes ;; gnu*) ;; haiku*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(link_all_deplibs, $1)=yes ;; hpux9*) _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH, # but as the default # location of the library. case $cc_basename in CC*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; aCC*) _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -b ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $EGREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' ;; *) if test "$GXX" = yes; then _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared -nostdlib $pic_flag ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' else # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no fi ;; esac ;; hpux10*|hpux11*) if test $with_gnu_ld = no; then _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: case $host_cpu in hppa*64*|ia64*) ;; *) _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' ;; esac fi case $host_cpu in hppa*64*|ia64*) _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; *) _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_direct_absolute, $1)=yes _LT_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH, # but as the default # location of the library. ;; esac case $cc_basename in CC*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; aCC*) case $host_cpu in hppa*64*) _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; ia64*) _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; esac # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $GREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' ;; *) if test "$GXX" = yes; then if test $with_gnu_ld = no; then case $host_cpu in hppa*64*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; ia64*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $pic_flag ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; esac fi else # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no fi ;; esac ;; interix[[3-9]]*) _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. # Instead, shared libraries are loaded at an image base (0x10000000 by # default) and relocated if they conflict, which is a slow very memory # consuming and fragmenting process. To avoid this, we pick a random, # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link # time. Moving up from 0x10000000 also allows more sbrk(2) space. _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' ;; irix5* | irix6*) case $cc_basename in CC*) # SGI C++ _LT_TAGVAR(archive_cmds, $1)='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' # Archives containing C++ object files must be created using # "CC -ar", where "CC" is the IRIX C++ compiler. This is # necessary to make sure instantiated templates are included # in the archive. _LT_TAGVAR(old_archive_cmds, $1)='$CC -ar -WR,-u -o $oldlib $oldobjs' ;; *) if test "$GXX" = yes; then if test "$with_gnu_ld" = no; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' else _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` -o $lib' fi fi _LT_TAGVAR(link_all_deplibs, $1)=yes ;; esac _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: _LT_TAGVAR(inherit_rpath, $1)=yes ;; linux* | k*bsd*-gnu | kopensolaris*-gnu) case $cc_basename in KCC*) # Kuck and Associates, Inc. (KAI) C++ Compiler # KCC will only create a shared library if the output file # ends with ".so" (or ".sl" for HP-UX), so rename the library # to its proper name (with version) after linking. _LT_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib ${wl}-retain-symbols-file,$export_symbols; mv \$templib $lib' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | $GREP "ld"`; rm -f libconftest$shared_ext; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' # Archives containing C++ object files must be created using # "CC -Bstatic", where "CC" is the KAI C++ compiler. _LT_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs' ;; icpc* | ecpc* ) # Intel C++ with_gnu_ld=yes # version 8.0 and above of icpc choke on multiply defined symbols # if we add $predep_objects and $postdep_objects, however 7.1 and # earlier do not add the objects themselves. case `$CC -V 2>&1` in *"Version 7."*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' ;; *) # Version 8.0 or newer tmp_idyn= case $host_cpu in ia64*) tmp_idyn=' -i_dynamic';; esac _LT_TAGVAR(archive_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' ;; esac _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive' ;; pgCC* | pgcpp*) # Portland Group C++ compiler case `$CC -V` in *pgCC\ [[1-5]].* | *pgcpp\ [[1-5]].*) _LT_TAGVAR(prelink_cmds, $1)='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $objs $libobjs $compile_deplibs~ compile_command="$compile_command `find $tpldir -name \*.o | sort | $NL2SP`"' _LT_TAGVAR(old_archive_cmds, $1)='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $oldobjs$old_deplibs~ $AR $AR_FLAGS $oldlib$oldobjs$old_deplibs `find $tpldir -name \*.o | sort | $NL2SP`~ $RANLIB $oldlib' _LT_TAGVAR(archive_cmds, $1)='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib' ;; *) # Version 6 and above use weak symbols _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib' ;; esac _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}--rpath ${wl}$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' ;; cxx*) # Compaq C++ _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib ${wl}-retain-symbols-file $wl$export_symbols' runpath_var=LD_RUN_PATH _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "X$list" | $Xsed' ;; xl* | mpixl* | bgxl*) # IBM XL 8.0 on PPC, with GNU ld _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' _LT_TAGVAR(archive_cmds, $1)='$CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' if test "x$supports_anon_versioning" = xyes; then _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ echo "local: *; };" >> $output_objdir/$libname.ver~ $CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' fi ;; *) case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C++ 5.9 _LT_TAGVAR(no_undefined_flag, $1)=' -zdefs' _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file ${wl}$export_symbols' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' _LT_TAGVAR(compiler_needs_object, $1)=yes # Not sure whether something based on # $CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 # would be better. output_verbose_link_cmd='func_echo_all' # Archives containing C++ object files must be created using # "CC -xar", where "CC" is the Sun C++ compiler. This is # necessary to make sure instantiated templates are included # in the archive. _LT_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs' ;; esac ;; esac ;; lynxos*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; m88k*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; mvs*) case $cc_basename in cxx*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; *) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; esac ;; netbsd*) if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags' wlarc= _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no fi # Workaround some broken pre-1.5 toolchains output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP conftest.$objext | $SED -e "s:-lgcc -lc -lgcc::"' ;; *nto* | *qnx*) _LT_TAGVAR(ld_shlibs, $1)=yes ;; openbsd2*) # C++ shared libraries are fairly broken _LT_TAGVAR(ld_shlibs, $1)=no ;; openbsd*) if test -f /usr/libexec/ld.so; then _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=yes _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file,$export_symbols -o $lib' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' _LT_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' fi output_verbose_link_cmd=func_echo_all else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; osf3* | osf4* | osf5*) case $cc_basename in KCC*) # Kuck and Associates, Inc. (KAI) C++ Compiler # KCC will only create a shared library if the output file # ends with ".so" (or ".sl" for HP-UX), so rename the library # to its proper name (with version) after linking. _LT_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo "$lib" | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: # Archives containing C++ object files must be created using # the KAI C++ compiler. case $host in osf3*) _LT_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs' ;; *) _LT_TAGVAR(old_archive_cmds, $1)='$CC -o $oldlib $oldobjs' ;; esac ;; RCC*) # Rational C++ 2.4.1 # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; cxx*) case $host in osf3*) _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $soname `test -n "$verstring" && func_echo_all "${wl}-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' ;; *) _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done~ echo "-hidden">> $lib.exp~ $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname ${wl}-input ${wl}$lib.exp `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib~ $RM $lib.exp' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' ;; esac _LT_TAGVAR(hardcode_libdir_separator, $1)=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld" | $GREP -v "ld:"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' ;; *) if test "$GXX" = yes && test "$with_gnu_ld" = no; then _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' case $host in osf3*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' ;; esac _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' else # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no fi ;; esac ;; psos*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; sunos4*) case $cc_basename in CC*) # Sun C++ 4.x # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; lcc*) # Lucid # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; *) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; esac ;; solaris*) case $cc_basename in CC* | sunCC*) # Sun C++ 4.2, 5.x and Centerline C++ _LT_TAGVAR(archive_cmds_need_lc,$1)=yes _LT_TAGVAR(no_undefined_flag, $1)=' -zdefs' _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -G${allow_undefined_flag} ${wl}-M ${wl}$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no case $host_os in solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; *) # The compiler driver will combine and reorder linker options, # but understands `-z linker_flag'. # Supported since Solaris 2.6 (maybe 2.5.1?) _LT_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract' ;; esac _LT_TAGVAR(link_all_deplibs, $1)=yes output_verbose_link_cmd='func_echo_all' # Archives containing C++ object files must be created using # "CC -xar", where "CC" is the Sun C++ compiler. This is # necessary to make sure instantiated templates are included # in the archive. _LT_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs' ;; gcx*) # Green Hills C++ Compiler _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' # The C++ compiler must be used to create the archive. _LT_TAGVAR(old_archive_cmds, $1)='$CC $LDFLAGS -archive -o $oldlib $oldobjs' ;; *) # GNU C++ compiler with Solaris linker if test "$GXX" = yes && test "$with_gnu_ld" = no; then _LT_TAGVAR(no_undefined_flag, $1)=' ${wl}-z ${wl}defs' if $CC --version | $GREP -v '^2\.7' > /dev/null; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -shared $pic_flag -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' else # g++ 2.7 appears to require `-G' NOT `-shared' on this # platform. _LT_TAGVAR(archive_cmds, $1)='$CC -G -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -G -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -G $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' fi _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $wl$libdir' case $host_os in solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; *) _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' ;; esac fi ;; esac ;; sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*) _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no runpath_var='LD_RUN_PATH' case $cc_basename in CC*) _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' ;; esac ;; sysv5* | sco3.2v5* | sco5v6*) # Note: We can NOT use -z defs as we might desire, because we do not # link with -lc, and that would cause any symbols used from libc to # always be unresolved, which means just about no library would # ever link correctly. If we're not using GNU ld we use -z text # though, which does catch some bad symbols but isn't as heavy-handed # as -z defs. _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' _LT_TAGVAR(allow_undefined_flag, $1)='${wl}-z,nodefs' _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R,$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=':' _LT_TAGVAR(link_all_deplibs, $1)=yes _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Bexport' runpath_var='LD_RUN_PATH' case $cc_basename in CC*) _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(old_archive_cmds, $1)='$CC -Tprelink_objects $oldobjs~ '"$_LT_TAGVAR(old_archive_cmds, $1)" _LT_TAGVAR(reload_cmds, $1)='$CC -Tprelink_objects $reload_objs~ '"$_LT_TAGVAR(reload_cmds, $1)" ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' ;; esac ;; tandem*) case $cc_basename in NCC*) # NonStop-UX NCC 3.20 # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; *) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; esac ;; vxworks*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; *) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; esac AC_MSG_RESULT([$_LT_TAGVAR(ld_shlibs, $1)]) test "$_LT_TAGVAR(ld_shlibs, $1)" = no && can_build_shared=no _LT_TAGVAR(GCC, $1)="$GXX" _LT_TAGVAR(LD, $1)="$LD" ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... _LT_SYS_HIDDEN_LIBDEPS($1) _LT_COMPILER_PIC($1) _LT_COMPILER_C_O($1) _LT_COMPILER_FILE_LOCKS($1) _LT_LINKER_SHLIBS($1) _LT_SYS_DYNAMIC_LINKER($1) _LT_LINKER_HARDCODE_LIBPATH($1) _LT_CONFIG($1) fi # test -n "$compiler" CC=$lt_save_CC CFLAGS=$lt_save_CFLAGS LDCXX=$LD LD=$lt_save_LD GCC=$lt_save_GCC with_gnu_ld=$lt_save_with_gnu_ld lt_cv_path_LDCXX=$lt_cv_path_LD lt_cv_path_LD=$lt_save_path_LD lt_cv_prog_gnu_ldcxx=$lt_cv_prog_gnu_ld lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld fi # test "$_lt_caught_CXX_error" != yes AC_LANG_POP ])# _LT_LANG_CXX_CONFIG # _LT_FUNC_STRIPNAME_CNF # ---------------------- # func_stripname_cnf prefix suffix name # strip PREFIX and SUFFIX off of NAME. # PREFIX and SUFFIX must not contain globbing or regex special # characters, hashes, percent signs, but SUFFIX may contain a leading # dot (in which case that matches only a dot). # # This function is identical to the (non-XSI) version of func_stripname, # except this one can be used by m4 code that may be executed by configure, # rather than the libtool script. m4_defun([_LT_FUNC_STRIPNAME_CNF],[dnl AC_REQUIRE([_LT_DECL_SED]) AC_REQUIRE([_LT_PROG_ECHO_BACKSLASH]) func_stripname_cnf () { case ${2} in .*) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%\\\\${2}\$%%"`;; *) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%${2}\$%%"`;; esac } # func_stripname_cnf ])# _LT_FUNC_STRIPNAME_CNF # _LT_SYS_HIDDEN_LIBDEPS([TAGNAME]) # --------------------------------- # Figure out "hidden" library dependencies from verbose # compiler output when linking a shared library. # Parse the compiler output and extract the necessary # objects, libraries and library flags. m4_defun([_LT_SYS_HIDDEN_LIBDEPS], [m4_require([_LT_FILEUTILS_DEFAULTS])dnl AC_REQUIRE([_LT_FUNC_STRIPNAME_CNF])dnl # Dependencies to place before and after the object being linked: _LT_TAGVAR(predep_objects, $1)= _LT_TAGVAR(postdep_objects, $1)= _LT_TAGVAR(predeps, $1)= _LT_TAGVAR(postdeps, $1)= _LT_TAGVAR(compiler_lib_search_path, $1)= dnl we can't use the lt_simple_compile_test_code here, dnl because it contains code intended for an executable, dnl not a library. It's possible we should let each dnl tag define a new lt_????_link_test_code variable, dnl but it's only used here... m4_if([$1], [], [cat > conftest.$ac_ext <<_LT_EOF int a; void foo (void) { a = 0; } _LT_EOF ], [$1], [CXX], [cat > conftest.$ac_ext <<_LT_EOF class Foo { public: Foo (void) { a = 0; } private: int a; }; _LT_EOF ], [$1], [F77], [cat > conftest.$ac_ext <<_LT_EOF subroutine foo implicit none integer*4 a a=0 return end _LT_EOF ], [$1], [FC], [cat > conftest.$ac_ext <<_LT_EOF subroutine foo implicit none integer a a=0 return end _LT_EOF ], [$1], [GCJ], [cat > conftest.$ac_ext <<_LT_EOF public class foo { private int a; public void bar (void) { a = 0; } }; _LT_EOF ], [$1], [GO], [cat > conftest.$ac_ext <<_LT_EOF package foo func foo() { } _LT_EOF ]) _lt_libdeps_save_CFLAGS=$CFLAGS case "$CC $CFLAGS " in #( *\ -flto*\ *) CFLAGS="$CFLAGS -fno-lto" ;; *\ -fwhopr*\ *) CFLAGS="$CFLAGS -fno-whopr" ;; *\ -fuse-linker-plugin*\ *) CFLAGS="$CFLAGS -fno-use-linker-plugin" ;; esac dnl Parse the compiler output and extract the necessary dnl objects, libraries and library flags. if AC_TRY_EVAL(ac_compile); then # Parse the compiler output and extract the necessary # objects, libraries and library flags. # Sentinel used to keep track of whether or not we are before # the conftest object file. pre_test_object_deps_done=no for p in `eval "$output_verbose_link_cmd"`; do case ${prev}${p} in -L* | -R* | -l*) # Some compilers place space between "-{L,R}" and the path. # Remove the space. if test $p = "-L" || test $p = "-R"; then prev=$p continue fi # Expand the sysroot to ease extracting the directories later. if test -z "$prev"; then case $p in -L*) func_stripname_cnf '-L' '' "$p"; prev=-L; p=$func_stripname_result ;; -R*) func_stripname_cnf '-R' '' "$p"; prev=-R; p=$func_stripname_result ;; -l*) func_stripname_cnf '-l' '' "$p"; prev=-l; p=$func_stripname_result ;; esac fi case $p in =*) func_stripname_cnf '=' '' "$p"; p=$lt_sysroot$func_stripname_result ;; esac if test "$pre_test_object_deps_done" = no; then case ${prev} in -L | -R) # Internal compiler library paths should come after those # provided the user. The postdeps already come after the # user supplied libs so there is no need to process them. if test -z "$_LT_TAGVAR(compiler_lib_search_path, $1)"; then _LT_TAGVAR(compiler_lib_search_path, $1)="${prev}${p}" else _LT_TAGVAR(compiler_lib_search_path, $1)="${_LT_TAGVAR(compiler_lib_search_path, $1)} ${prev}${p}" fi ;; # The "-l" case would never come before the object being # linked, so don't bother handling this case. esac else if test -z "$_LT_TAGVAR(postdeps, $1)"; then _LT_TAGVAR(postdeps, $1)="${prev}${p}" else _LT_TAGVAR(postdeps, $1)="${_LT_TAGVAR(postdeps, $1)} ${prev}${p}" fi fi prev= ;; *.lto.$objext) ;; # Ignore GCC LTO objects *.$objext) # This assumes that the test object file only shows up # once in the compiler output. if test "$p" = "conftest.$objext"; then pre_test_object_deps_done=yes continue fi if test "$pre_test_object_deps_done" = no; then if test -z "$_LT_TAGVAR(predep_objects, $1)"; then _LT_TAGVAR(predep_objects, $1)="$p" else _LT_TAGVAR(predep_objects, $1)="$_LT_TAGVAR(predep_objects, $1) $p" fi else if test -z "$_LT_TAGVAR(postdep_objects, $1)"; then _LT_TAGVAR(postdep_objects, $1)="$p" else _LT_TAGVAR(postdep_objects, $1)="$_LT_TAGVAR(postdep_objects, $1) $p" fi fi ;; *) ;; # Ignore the rest. esac done # Clean up. rm -f a.out a.exe else echo "libtool.m4: error: problem compiling $1 test program" fi $RM -f confest.$objext CFLAGS=$_lt_libdeps_save_CFLAGS # PORTME: override above test on systems where it is broken m4_if([$1], [CXX], [case $host_os in interix[[3-9]]*) # Interix 3.5 installs completely hosed .la files for C++, so rather than # hack all around it, let's just trust "g++" to DTRT. _LT_TAGVAR(predep_objects,$1)= _LT_TAGVAR(postdep_objects,$1)= _LT_TAGVAR(postdeps,$1)= ;; linux*) case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C++ 5.9 # The more standards-conforming stlport4 library is # incompatible with the Cstd library. Avoid specifying # it if it's in CXXFLAGS. Ignore libCrun as # -library=stlport4 depends on it. case " $CXX $CXXFLAGS " in *" -library=stlport4 "*) solaris_use_stlport4=yes ;; esac if test "$solaris_use_stlport4" != yes; then _LT_TAGVAR(postdeps,$1)='-library=Cstd -library=Crun' fi ;; esac ;; solaris*) case $cc_basename in CC* | sunCC*) # The more standards-conforming stlport4 library is # incompatible with the Cstd library. Avoid specifying # it if it's in CXXFLAGS. Ignore libCrun as # -library=stlport4 depends on it. case " $CXX $CXXFLAGS " in *" -library=stlport4 "*) solaris_use_stlport4=yes ;; esac # Adding this requires a known-good setup of shared libraries for # Sun compiler versions before 5.6, else PIC objects from an old # archive will be linked into the output, leading to subtle bugs. if test "$solaris_use_stlport4" != yes; then _LT_TAGVAR(postdeps,$1)='-library=Cstd -library=Crun' fi ;; esac ;; esac ]) case " $_LT_TAGVAR(postdeps, $1) " in *" -lc "*) _LT_TAGVAR(archive_cmds_need_lc, $1)=no ;; esac _LT_TAGVAR(compiler_lib_search_dirs, $1)= if test -n "${_LT_TAGVAR(compiler_lib_search_path, $1)}"; then _LT_TAGVAR(compiler_lib_search_dirs, $1)=`echo " ${_LT_TAGVAR(compiler_lib_search_path, $1)}" | ${SED} -e 's! -L! !g' -e 's!^ !!'` fi _LT_TAGDECL([], [compiler_lib_search_dirs], [1], [The directories searched by this compiler when creating a shared library]) _LT_TAGDECL([], [predep_objects], [1], [Dependencies to place before and after the objects being linked to create a shared library]) _LT_TAGDECL([], [postdep_objects], [1]) _LT_TAGDECL([], [predeps], [1]) _LT_TAGDECL([], [postdeps], [1]) _LT_TAGDECL([], [compiler_lib_search_path], [1], [The library search path used internally by the compiler when linking a shared library]) ])# _LT_SYS_HIDDEN_LIBDEPS # _LT_LANG_F77_CONFIG([TAG]) # -------------------------- # Ensure that the configuration variables for a Fortran 77 compiler are # suitably defined. These variables are subsequently used by _LT_CONFIG # to write the compiler configuration to `libtool'. m4_defun([_LT_LANG_F77_CONFIG], [AC_LANG_PUSH(Fortran 77) if test -z "$F77" || test "X$F77" = "Xno"; then _lt_disable_F77=yes fi _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(allow_undefined_flag, $1)= _LT_TAGVAR(always_export_symbols, $1)=no _LT_TAGVAR(archive_expsym_cmds, $1)= _LT_TAGVAR(export_dynamic_flag_spec, $1)= _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= _LT_TAGVAR(hardcode_libdir_separator, $1)= _LT_TAGVAR(hardcode_minus_L, $1)=no _LT_TAGVAR(hardcode_automatic, $1)=no _LT_TAGVAR(inherit_rpath, $1)=no _LT_TAGVAR(module_cmds, $1)= _LT_TAGVAR(module_expsym_cmds, $1)= _LT_TAGVAR(link_all_deplibs, $1)=unknown _LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds _LT_TAGVAR(reload_flag, $1)=$reload_flag _LT_TAGVAR(reload_cmds, $1)=$reload_cmds _LT_TAGVAR(no_undefined_flag, $1)= _LT_TAGVAR(whole_archive_flag_spec, $1)= _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no # Source file extension for f77 test sources. ac_ext=f # Object file extension for compiled f77 test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # No sense in running all these tests if we already determined that # the F77 compiler isn't working. Some variables (like enable_shared) # are currently assumed to apply to all compilers on this platform, # and will be corrupted by setting them based on a non-working compiler. if test "$_lt_disable_F77" != yes; then # Code to be used in simple compile tests lt_simple_compile_test_code="\ subroutine t return end " # Code to be used in simple link tests lt_simple_link_test_code="\ program t end " # ltmain only uses $CC for tagged configurations so make sure $CC is set. _LT_TAG_COMPILER # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE # Allow CC to be a program name with arguments. lt_save_CC="$CC" lt_save_GCC=$GCC lt_save_CFLAGS=$CFLAGS CC=${F77-"f77"} CFLAGS=$FFLAGS compiler=$CC _LT_TAGVAR(compiler, $1)=$CC _LT_CC_BASENAME([$compiler]) GCC=$G77 if test -n "$compiler"; then AC_MSG_CHECKING([if libtool supports shared libraries]) AC_MSG_RESULT([$can_build_shared]) AC_MSG_CHECKING([whether to build shared libraries]) test "$can_build_shared" = "no" && enable_shared=no # On AIX, shared libraries and static libraries use the same namespace, and # are all built from PIC. case $host_os in aix3*) test "$enable_shared" = yes && enable_static=no if test -n "$RANLIB"; then archive_cmds="$archive_cmds~\$RANLIB \$lib" postinstall_cmds='$RANLIB $lib' fi ;; aix[[4-9]]*) if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then test "$enable_shared" = yes && enable_static=no fi ;; esac AC_MSG_RESULT([$enable_shared]) AC_MSG_CHECKING([whether to build static libraries]) # Make sure either enable_shared or enable_static is yes. test "$enable_shared" = yes || enable_static=yes AC_MSG_RESULT([$enable_static]) _LT_TAGVAR(GCC, $1)="$G77" _LT_TAGVAR(LD, $1)="$LD" ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... _LT_COMPILER_PIC($1) _LT_COMPILER_C_O($1) _LT_COMPILER_FILE_LOCKS($1) _LT_LINKER_SHLIBS($1) _LT_SYS_DYNAMIC_LINKER($1) _LT_LINKER_HARDCODE_LIBPATH($1) _LT_CONFIG($1) fi # test -n "$compiler" GCC=$lt_save_GCC CC="$lt_save_CC" CFLAGS="$lt_save_CFLAGS" fi # test "$_lt_disable_F77" != yes AC_LANG_POP ])# _LT_LANG_F77_CONFIG # _LT_LANG_FC_CONFIG([TAG]) # ------------------------- # Ensure that the configuration variables for a Fortran compiler are # suitably defined. These variables are subsequently used by _LT_CONFIG # to write the compiler configuration to `libtool'. m4_defun([_LT_LANG_FC_CONFIG], [AC_LANG_PUSH(Fortran) if test -z "$FC" || test "X$FC" = "Xno"; then _lt_disable_FC=yes fi _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(allow_undefined_flag, $1)= _LT_TAGVAR(always_export_symbols, $1)=no _LT_TAGVAR(archive_expsym_cmds, $1)= _LT_TAGVAR(export_dynamic_flag_spec, $1)= _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= _LT_TAGVAR(hardcode_libdir_separator, $1)= _LT_TAGVAR(hardcode_minus_L, $1)=no _LT_TAGVAR(hardcode_automatic, $1)=no _LT_TAGVAR(inherit_rpath, $1)=no _LT_TAGVAR(module_cmds, $1)= _LT_TAGVAR(module_expsym_cmds, $1)= _LT_TAGVAR(link_all_deplibs, $1)=unknown _LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds _LT_TAGVAR(reload_flag, $1)=$reload_flag _LT_TAGVAR(reload_cmds, $1)=$reload_cmds _LT_TAGVAR(no_undefined_flag, $1)= _LT_TAGVAR(whole_archive_flag_spec, $1)= _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no # Source file extension for fc test sources. ac_ext=${ac_fc_srcext-f} # Object file extension for compiled fc test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # No sense in running all these tests if we already determined that # the FC compiler isn't working. Some variables (like enable_shared) # are currently assumed to apply to all compilers on this platform, # and will be corrupted by setting them based on a non-working compiler. if test "$_lt_disable_FC" != yes; then # Code to be used in simple compile tests lt_simple_compile_test_code="\ subroutine t return end " # Code to be used in simple link tests lt_simple_link_test_code="\ program t end " # ltmain only uses $CC for tagged configurations so make sure $CC is set. _LT_TAG_COMPILER # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE # Allow CC to be a program name with arguments. lt_save_CC="$CC" lt_save_GCC=$GCC lt_save_CFLAGS=$CFLAGS CC=${FC-"f95"} CFLAGS=$FCFLAGS compiler=$CC GCC=$ac_cv_fc_compiler_gnu _LT_TAGVAR(compiler, $1)=$CC _LT_CC_BASENAME([$compiler]) if test -n "$compiler"; then AC_MSG_CHECKING([if libtool supports shared libraries]) AC_MSG_RESULT([$can_build_shared]) AC_MSG_CHECKING([whether to build shared libraries]) test "$can_build_shared" = "no" && enable_shared=no # On AIX, shared libraries and static libraries use the same namespace, and # are all built from PIC. case $host_os in aix3*) test "$enable_shared" = yes && enable_static=no if test -n "$RANLIB"; then archive_cmds="$archive_cmds~\$RANLIB \$lib" postinstall_cmds='$RANLIB $lib' fi ;; aix[[4-9]]*) if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then test "$enable_shared" = yes && enable_static=no fi ;; esac AC_MSG_RESULT([$enable_shared]) AC_MSG_CHECKING([whether to build static libraries]) # Make sure either enable_shared or enable_static is yes. test "$enable_shared" = yes || enable_static=yes AC_MSG_RESULT([$enable_static]) _LT_TAGVAR(GCC, $1)="$ac_cv_fc_compiler_gnu" _LT_TAGVAR(LD, $1)="$LD" ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... _LT_SYS_HIDDEN_LIBDEPS($1) _LT_COMPILER_PIC($1) _LT_COMPILER_C_O($1) _LT_COMPILER_FILE_LOCKS($1) _LT_LINKER_SHLIBS($1) _LT_SYS_DYNAMIC_LINKER($1) _LT_LINKER_HARDCODE_LIBPATH($1) _LT_CONFIG($1) fi # test -n "$compiler" GCC=$lt_save_GCC CC=$lt_save_CC CFLAGS=$lt_save_CFLAGS fi # test "$_lt_disable_FC" != yes AC_LANG_POP ])# _LT_LANG_FC_CONFIG # _LT_LANG_GCJ_CONFIG([TAG]) # -------------------------- # Ensure that the configuration variables for the GNU Java Compiler compiler # are suitably defined. These variables are subsequently used by _LT_CONFIG # to write the compiler configuration to `libtool'. m4_defun([_LT_LANG_GCJ_CONFIG], [AC_REQUIRE([LT_PROG_GCJ])dnl AC_LANG_SAVE # Source file extension for Java test sources. ac_ext=java # Object file extension for compiled Java test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # Code to be used in simple compile tests lt_simple_compile_test_code="class foo {}" # Code to be used in simple link tests lt_simple_link_test_code='public class conftest { public static void main(String[[]] argv) {}; }' # ltmain only uses $CC for tagged configurations so make sure $CC is set. _LT_TAG_COMPILER # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE # Allow CC to be a program name with arguments. lt_save_CC=$CC lt_save_CFLAGS=$CFLAGS lt_save_GCC=$GCC GCC=yes CC=${GCJ-"gcj"} CFLAGS=$GCJFLAGS compiler=$CC _LT_TAGVAR(compiler, $1)=$CC _LT_TAGVAR(LD, $1)="$LD" _LT_CC_BASENAME([$compiler]) # GCJ did not exist at the time GCC didn't implicitly link libc in. _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds _LT_TAGVAR(reload_flag, $1)=$reload_flag _LT_TAGVAR(reload_cmds, $1)=$reload_cmds ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... if test -n "$compiler"; then _LT_COMPILER_NO_RTTI($1) _LT_COMPILER_PIC($1) _LT_COMPILER_C_O($1) _LT_COMPILER_FILE_LOCKS($1) _LT_LINKER_SHLIBS($1) _LT_LINKER_HARDCODE_LIBPATH($1) _LT_CONFIG($1) fi AC_LANG_RESTORE GCC=$lt_save_GCC CC=$lt_save_CC CFLAGS=$lt_save_CFLAGS ])# _LT_LANG_GCJ_CONFIG # _LT_LANG_GO_CONFIG([TAG]) # -------------------------- # Ensure that the configuration variables for the GNU Go compiler # are suitably defined. These variables are subsequently used by _LT_CONFIG # to write the compiler configuration to `libtool'. m4_defun([_LT_LANG_GO_CONFIG], [AC_REQUIRE([LT_PROG_GO])dnl AC_LANG_SAVE # Source file extension for Go test sources. ac_ext=go # Object file extension for compiled Go test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # Code to be used in simple compile tests lt_simple_compile_test_code="package main; func main() { }" # Code to be used in simple link tests lt_simple_link_test_code='package main; func main() { }' # ltmain only uses $CC for tagged configurations so make sure $CC is set. _LT_TAG_COMPILER # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE # Allow CC to be a program name with arguments. lt_save_CC=$CC lt_save_CFLAGS=$CFLAGS lt_save_GCC=$GCC GCC=yes CC=${GOC-"gccgo"} CFLAGS=$GOFLAGS compiler=$CC _LT_TAGVAR(compiler, $1)=$CC _LT_TAGVAR(LD, $1)="$LD" _LT_CC_BASENAME([$compiler]) # Go did not exist at the time GCC didn't implicitly link libc in. _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds _LT_TAGVAR(reload_flag, $1)=$reload_flag _LT_TAGVAR(reload_cmds, $1)=$reload_cmds ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... if test -n "$compiler"; then _LT_COMPILER_NO_RTTI($1) _LT_COMPILER_PIC($1) _LT_COMPILER_C_O($1) _LT_COMPILER_FILE_LOCKS($1) _LT_LINKER_SHLIBS($1) _LT_LINKER_HARDCODE_LIBPATH($1) _LT_CONFIG($1) fi AC_LANG_RESTORE GCC=$lt_save_GCC CC=$lt_save_CC CFLAGS=$lt_save_CFLAGS ])# _LT_LANG_GO_CONFIG # _LT_LANG_RC_CONFIG([TAG]) # ------------------------- # Ensure that the configuration variables for the Windows resource compiler # are suitably defined. These variables are subsequently used by _LT_CONFIG # to write the compiler configuration to `libtool'. m4_defun([_LT_LANG_RC_CONFIG], [AC_REQUIRE([LT_PROG_RC])dnl AC_LANG_SAVE # Source file extension for RC test sources. ac_ext=rc # Object file extension for compiled RC test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # Code to be used in simple compile tests lt_simple_compile_test_code='sample MENU { MENUITEM "&Soup", 100, CHECKED }' # Code to be used in simple link tests lt_simple_link_test_code="$lt_simple_compile_test_code" # ltmain only uses $CC for tagged configurations so make sure $CC is set. _LT_TAG_COMPILER # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE # Allow CC to be a program name with arguments. lt_save_CC="$CC" lt_save_CFLAGS=$CFLAGS lt_save_GCC=$GCC GCC= CC=${RC-"windres"} CFLAGS= compiler=$CC _LT_TAGVAR(compiler, $1)=$CC _LT_CC_BASENAME([$compiler]) _LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes if test -n "$compiler"; then : _LT_CONFIG($1) fi GCC=$lt_save_GCC AC_LANG_RESTORE CC=$lt_save_CC CFLAGS=$lt_save_CFLAGS ])# _LT_LANG_RC_CONFIG # LT_PROG_GCJ # ----------- AC_DEFUN([LT_PROG_GCJ], [m4_ifdef([AC_PROG_GCJ], [AC_PROG_GCJ], [m4_ifdef([A][M_PROG_GCJ], [A][M_PROG_GCJ], [AC_CHECK_TOOL(GCJ, gcj,) test "x${GCJFLAGS+set}" = xset || GCJFLAGS="-g -O2" AC_SUBST(GCJFLAGS)])])[]dnl ]) # Old name: AU_ALIAS([LT_AC_PROG_GCJ], [LT_PROG_GCJ]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([LT_AC_PROG_GCJ], []) # LT_PROG_GO # ---------- AC_DEFUN([LT_PROG_GO], [AC_CHECK_TOOL(GOC, gccgo,) ]) # LT_PROG_RC # ---------- AC_DEFUN([LT_PROG_RC], [AC_CHECK_TOOL(RC, windres,) ]) # Old name: AU_ALIAS([LT_AC_PROG_RC], [LT_PROG_RC]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([LT_AC_PROG_RC], []) # _LT_DECL_EGREP # -------------- # If we don't have a new enough Autoconf to choose the best grep # available, choose the one first in the user's PATH. m4_defun([_LT_DECL_EGREP], [AC_REQUIRE([AC_PROG_EGREP])dnl AC_REQUIRE([AC_PROG_FGREP])dnl test -z "$GREP" && GREP=grep _LT_DECL([], [GREP], [1], [A grep program that handles long lines]) _LT_DECL([], [EGREP], [1], [An ERE matcher]) _LT_DECL([], [FGREP], [1], [A literal string matcher]) dnl Non-bleeding-edge autoconf doesn't subst GREP, so do it here too AC_SUBST([GREP]) ]) # _LT_DECL_OBJDUMP # -------------- # If we don't have a new enough Autoconf to choose the best objdump # available, choose the one first in the user's PATH. m4_defun([_LT_DECL_OBJDUMP], [AC_CHECK_TOOL(OBJDUMP, objdump, false) test -z "$OBJDUMP" && OBJDUMP=objdump _LT_DECL([], [OBJDUMP], [1], [An object symbol dumper]) AC_SUBST([OBJDUMP]) ]) # _LT_DECL_DLLTOOL # ---------------- # Ensure DLLTOOL variable is set. m4_defun([_LT_DECL_DLLTOOL], [AC_CHECK_TOOL(DLLTOOL, dlltool, false) test -z "$DLLTOOL" && DLLTOOL=dlltool _LT_DECL([], [DLLTOOL], [1], [DLL creation program]) AC_SUBST([DLLTOOL]) ]) # _LT_DECL_SED # ------------ # Check for a fully-functional sed program, that truncates # as few characters as possible. Prefer GNU sed if found. m4_defun([_LT_DECL_SED], [AC_PROG_SED test -z "$SED" && SED=sed Xsed="$SED -e 1s/^X//" _LT_DECL([], [SED], [1], [A sed program that does not truncate output]) _LT_DECL([], [Xsed], ["\$SED -e 1s/^X//"], [Sed that helps us avoid accidentally triggering echo(1) options like -n]) ])# _LT_DECL_SED m4_ifndef([AC_PROG_SED], [ ############################################################ # NOTE: This macro has been submitted for inclusion into # # GNU Autoconf as AC_PROG_SED. When it is available in # # a released version of Autoconf we should remove this # # macro and use it instead. # ############################################################ m4_defun([AC_PROG_SED], [AC_MSG_CHECKING([for a sed that does not truncate output]) AC_CACHE_VAL(lt_cv_path_SED, [# Loop through the user's path and test for sed and gsed. # Then use that list of sed's as ones to test for truncation. as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for lt_ac_prog in sed gsed; do for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$lt_ac_prog$ac_exec_ext"; then lt_ac_sed_list="$lt_ac_sed_list $as_dir/$lt_ac_prog$ac_exec_ext" fi done done done IFS=$as_save_IFS lt_ac_max=0 lt_ac_count=0 # Add /usr/xpg4/bin/sed as it is typically found on Solaris # along with /bin/sed that truncates output. for lt_ac_sed in $lt_ac_sed_list /usr/xpg4/bin/sed; do test ! -f $lt_ac_sed && continue cat /dev/null > conftest.in lt_ac_count=0 echo $ECHO_N "0123456789$ECHO_C" >conftest.in # Check for GNU sed and select it if it is found. if "$lt_ac_sed" --version 2>&1 < /dev/null | grep 'GNU' > /dev/null; then lt_cv_path_SED=$lt_ac_sed break fi while true; do cat conftest.in conftest.in >conftest.tmp mv conftest.tmp conftest.in cp conftest.in conftest.nl echo >>conftest.nl $lt_ac_sed -e 's/a$//' < conftest.nl >conftest.out || break cmp -s conftest.out conftest.nl || break # 10000 chars as input seems more than enough test $lt_ac_count -gt 10 && break lt_ac_count=`expr $lt_ac_count + 1` if test $lt_ac_count -gt $lt_ac_max; then lt_ac_max=$lt_ac_count lt_cv_path_SED=$lt_ac_sed fi done done ]) SED=$lt_cv_path_SED AC_SUBST([SED]) AC_MSG_RESULT([$SED]) ])#AC_PROG_SED ])#m4_ifndef # Old name: AU_ALIAS([LT_AC_PROG_SED], [AC_PROG_SED]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([LT_AC_PROG_SED], []) # _LT_CHECK_SHELL_FEATURES # ------------------------ # Find out whether the shell is Bourne or XSI compatible, # or has some other useful features. m4_defun([_LT_CHECK_SHELL_FEATURES], [AC_MSG_CHECKING([whether the shell understands some XSI constructs]) # Try some XSI features xsi_shell=no ( _lt_dummy="a/b/c" test "${_lt_dummy##*/},${_lt_dummy%/*},${_lt_dummy#??}"${_lt_dummy%"$_lt_dummy"}, \ = c,a/b,b/c, \ && eval 'test $(( 1 + 1 )) -eq 2 \ && test "${#_lt_dummy}" -eq 5' ) >/dev/null 2>&1 \ && xsi_shell=yes AC_MSG_RESULT([$xsi_shell]) _LT_CONFIG_LIBTOOL_INIT([xsi_shell='$xsi_shell']) AC_MSG_CHECKING([whether the shell understands "+="]) lt_shell_append=no ( foo=bar; set foo baz; eval "$[1]+=\$[2]" && test "$foo" = barbaz ) \ >/dev/null 2>&1 \ && lt_shell_append=yes AC_MSG_RESULT([$lt_shell_append]) _LT_CONFIG_LIBTOOL_INIT([lt_shell_append='$lt_shell_append']) if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then lt_unset=unset else lt_unset=false fi _LT_DECL([], [lt_unset], [0], [whether the shell understands "unset"])dnl # test EBCDIC or ASCII case `echo X|tr X '\101'` in A) # ASCII based system # \n is not interpreted correctly by Solaris 8 /usr/ucb/tr lt_SP2NL='tr \040 \012' lt_NL2SP='tr \015\012 \040\040' ;; *) # EBCDIC based system lt_SP2NL='tr \100 \n' lt_NL2SP='tr \r\n \100\100' ;; esac _LT_DECL([SP2NL], [lt_SP2NL], [1], [turn spaces into newlines])dnl _LT_DECL([NL2SP], [lt_NL2SP], [1], [turn newlines into spaces])dnl ])# _LT_CHECK_SHELL_FEATURES # _LT_PROG_FUNCTION_REPLACE (FUNCNAME, REPLACEMENT-BODY) # ------------------------------------------------------ # In `$cfgfile', look for function FUNCNAME delimited by `^FUNCNAME ()$' and # '^} FUNCNAME ', and replace its body with REPLACEMENT-BODY. m4_defun([_LT_PROG_FUNCTION_REPLACE], [dnl { sed -e '/^$1 ()$/,/^} # $1 /c\ $1 ()\ {\ m4_bpatsubsts([$2], [$], [\\], [^\([ ]\)], [\\\1]) } # Extended-shell $1 implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: ]) # _LT_PROG_REPLACE_SHELLFNS # ------------------------- # Replace existing portable implementations of several shell functions with # equivalent extended shell implementations where those features are available.. m4_defun([_LT_PROG_REPLACE_SHELLFNS], [if test x"$xsi_shell" = xyes; then _LT_PROG_FUNCTION_REPLACE([func_dirname], [dnl case ${1} in */*) func_dirname_result="${1%/*}${2}" ;; * ) func_dirname_result="${3}" ;; esac]) _LT_PROG_FUNCTION_REPLACE([func_basename], [dnl func_basename_result="${1##*/}"]) _LT_PROG_FUNCTION_REPLACE([func_dirname_and_basename], [dnl case ${1} in */*) func_dirname_result="${1%/*}${2}" ;; * ) func_dirname_result="${3}" ;; esac func_basename_result="${1##*/}"]) _LT_PROG_FUNCTION_REPLACE([func_stripname], [dnl # pdksh 5.2.14 does not do ${X%$Y} correctly if both X and Y are # positional parameters, so assign one to ordinary parameter first. func_stripname_result=${3} func_stripname_result=${func_stripname_result#"${1}"} func_stripname_result=${func_stripname_result%"${2}"}]) _LT_PROG_FUNCTION_REPLACE([func_split_long_opt], [dnl func_split_long_opt_name=${1%%=*} func_split_long_opt_arg=${1#*=}]) _LT_PROG_FUNCTION_REPLACE([func_split_short_opt], [dnl func_split_short_opt_arg=${1#??} func_split_short_opt_name=${1%"$func_split_short_opt_arg"}]) _LT_PROG_FUNCTION_REPLACE([func_lo2o], [dnl case ${1} in *.lo) func_lo2o_result=${1%.lo}.${objext} ;; *) func_lo2o_result=${1} ;; esac]) _LT_PROG_FUNCTION_REPLACE([func_xform], [ func_xform_result=${1%.*}.lo]) _LT_PROG_FUNCTION_REPLACE([func_arith], [ func_arith_result=$(( $[*] ))]) _LT_PROG_FUNCTION_REPLACE([func_len], [ func_len_result=${#1}]) fi if test x"$lt_shell_append" = xyes; then _LT_PROG_FUNCTION_REPLACE([func_append], [ eval "${1}+=\\${2}"]) _LT_PROG_FUNCTION_REPLACE([func_append_quoted], [dnl func_quote_for_eval "${2}" dnl m4 expansion turns \\\\ into \\, and then the shell eval turns that into \ eval "${1}+=\\\\ \\$func_quote_for_eval_result"]) # Save a `func_append' function call where possible by direct use of '+=' sed -e 's%func_append \([[a-zA-Z_]]\{1,\}\) "%\1+="%g' $cfgfile > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: else # Save a `func_append' function call even when '+=' is not available sed -e 's%func_append \([[a-zA-Z_]]\{1,\}\) "%\1="$\1%g' $cfgfile > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: fi if test x"$_lt_function_replace_fail" = x":"; then AC_MSG_WARN([Unable to substitute extended shell functions in $ofile]) fi ]) # _LT_PATH_CONVERSION_FUNCTIONS # ----------------------------- # Determine which file name conversion functions should be used by # func_to_host_file (and, implicitly, by func_to_host_path). These are needed # for certain cross-compile configurations and native mingw. m4_defun([_LT_PATH_CONVERSION_FUNCTIONS], [AC_REQUIRE([AC_CANONICAL_HOST])dnl AC_REQUIRE([AC_CANONICAL_BUILD])dnl AC_MSG_CHECKING([how to convert $build file names to $host format]) AC_CACHE_VAL(lt_cv_to_host_file_cmd, [case $host in *-*-mingw* ) case $build in *-*-mingw* ) # actually msys lt_cv_to_host_file_cmd=func_convert_file_msys_to_w32 ;; *-*-cygwin* ) lt_cv_to_host_file_cmd=func_convert_file_cygwin_to_w32 ;; * ) # otherwise, assume *nix lt_cv_to_host_file_cmd=func_convert_file_nix_to_w32 ;; esac ;; *-*-cygwin* ) case $build in *-*-mingw* ) # actually msys lt_cv_to_host_file_cmd=func_convert_file_msys_to_cygwin ;; *-*-cygwin* ) lt_cv_to_host_file_cmd=func_convert_file_noop ;; * ) # otherwise, assume *nix lt_cv_to_host_file_cmd=func_convert_file_nix_to_cygwin ;; esac ;; * ) # unhandled hosts (and "normal" native builds) lt_cv_to_host_file_cmd=func_convert_file_noop ;; esac ]) to_host_file_cmd=$lt_cv_to_host_file_cmd AC_MSG_RESULT([$lt_cv_to_host_file_cmd]) _LT_DECL([to_host_file_cmd], [lt_cv_to_host_file_cmd], [0], [convert $build file names to $host format])dnl AC_MSG_CHECKING([how to convert $build file names to toolchain format]) AC_CACHE_VAL(lt_cv_to_tool_file_cmd, [#assume ordinary cross tools, or native build. lt_cv_to_tool_file_cmd=func_convert_file_noop case $host in *-*-mingw* ) case $build in *-*-mingw* ) # actually msys lt_cv_to_tool_file_cmd=func_convert_file_msys_to_w32 ;; esac ;; esac ]) to_tool_file_cmd=$lt_cv_to_tool_file_cmd AC_MSG_RESULT([$lt_cv_to_tool_file_cmd]) _LT_DECL([to_tool_file_cmd], [lt_cv_to_tool_file_cmd], [0], [convert $build files to toolchain format])dnl ])# _LT_PATH_CONVERSION_FUNCTIONS dibbler-1.0.1/m4/lt~obsolete.m40000664000175000017500000001375612233256142013207 00000000000000# lt~obsolete.m4 -- aclocal satisfying obsolete definitions. -*-Autoconf-*- # # Copyright (C) 2004, 2005, 2007, 2009 Free Software Foundation, Inc. # Written by Scott James Remnant, 2004. # # This file is free software; the Free Software Foundation gives # unlimited permission to copy and/or distribute it, with or without # modifications, as long as this notice is preserved. # serial 5 lt~obsolete.m4 # These exist entirely to fool aclocal when bootstrapping libtool. # # In the past libtool.m4 has provided macros via AC_DEFUN (or AU_DEFUN) # which have later been changed to m4_define as they aren't part of the # exported API, or moved to Autoconf or Automake where they belong. # # The trouble is, aclocal is a bit thick. It'll see the old AC_DEFUN # in /usr/share/aclocal/libtool.m4 and remember it, then when it sees us # using a macro with the same name in our local m4/libtool.m4 it'll # pull the old libtool.m4 in (it doesn't see our shiny new m4_define # and doesn't know about Autoconf macros at all.) # # So we provide this file, which has a silly filename so it's always # included after everything else. This provides aclocal with the # AC_DEFUNs it wants, but when m4 processes it, it doesn't do anything # because those macros already exist, or will be overwritten later. # We use AC_DEFUN over AU_DEFUN for compatibility with aclocal-1.6. # # Anytime we withdraw an AC_DEFUN or AU_DEFUN, remember to add it here. # Yes, that means every name once taken will need to remain here until # we give up compatibility with versions before 1.7, at which point # we need to keep only those names which we still refer to. # This is to help aclocal find these macros, as it can't see m4_define. AC_DEFUN([LTOBSOLETE_VERSION], [m4_if([1])]) m4_ifndef([AC_LIBTOOL_LINKER_OPTION], [AC_DEFUN([AC_LIBTOOL_LINKER_OPTION])]) m4_ifndef([AC_PROG_EGREP], [AC_DEFUN([AC_PROG_EGREP])]) m4_ifndef([_LT_AC_PROG_ECHO_BACKSLASH], [AC_DEFUN([_LT_AC_PROG_ECHO_BACKSLASH])]) m4_ifndef([_LT_AC_SHELL_INIT], [AC_DEFUN([_LT_AC_SHELL_INIT])]) m4_ifndef([_LT_AC_SYS_LIBPATH_AIX], [AC_DEFUN([_LT_AC_SYS_LIBPATH_AIX])]) m4_ifndef([_LT_PROG_LTMAIN], [AC_DEFUN([_LT_PROG_LTMAIN])]) m4_ifndef([_LT_AC_TAGVAR], [AC_DEFUN([_LT_AC_TAGVAR])]) m4_ifndef([AC_LTDL_ENABLE_INSTALL], [AC_DEFUN([AC_LTDL_ENABLE_INSTALL])]) m4_ifndef([AC_LTDL_PREOPEN], [AC_DEFUN([AC_LTDL_PREOPEN])]) m4_ifndef([_LT_AC_SYS_COMPILER], [AC_DEFUN([_LT_AC_SYS_COMPILER])]) m4_ifndef([_LT_AC_LOCK], [AC_DEFUN([_LT_AC_LOCK])]) m4_ifndef([AC_LIBTOOL_SYS_OLD_ARCHIVE], [AC_DEFUN([AC_LIBTOOL_SYS_OLD_ARCHIVE])]) m4_ifndef([_LT_AC_TRY_DLOPEN_SELF], [AC_DEFUN([_LT_AC_TRY_DLOPEN_SELF])]) m4_ifndef([AC_LIBTOOL_PROG_CC_C_O], [AC_DEFUN([AC_LIBTOOL_PROG_CC_C_O])]) m4_ifndef([AC_LIBTOOL_SYS_HARD_LINK_LOCKS], [AC_DEFUN([AC_LIBTOOL_SYS_HARD_LINK_LOCKS])]) m4_ifndef([AC_LIBTOOL_OBJDIR], [AC_DEFUN([AC_LIBTOOL_OBJDIR])]) m4_ifndef([AC_LTDL_OBJDIR], [AC_DEFUN([AC_LTDL_OBJDIR])]) m4_ifndef([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH], [AC_DEFUN([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH])]) m4_ifndef([AC_LIBTOOL_SYS_LIB_STRIP], [AC_DEFUN([AC_LIBTOOL_SYS_LIB_STRIP])]) m4_ifndef([AC_PATH_MAGIC], [AC_DEFUN([AC_PATH_MAGIC])]) m4_ifndef([AC_PROG_LD_GNU], [AC_DEFUN([AC_PROG_LD_GNU])]) m4_ifndef([AC_PROG_LD_RELOAD_FLAG], [AC_DEFUN([AC_PROG_LD_RELOAD_FLAG])]) m4_ifndef([AC_DEPLIBS_CHECK_METHOD], [AC_DEFUN([AC_DEPLIBS_CHECK_METHOD])]) m4_ifndef([AC_LIBTOOL_PROG_COMPILER_NO_RTTI], [AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_NO_RTTI])]) m4_ifndef([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE], [AC_DEFUN([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE])]) m4_ifndef([AC_LIBTOOL_PROG_COMPILER_PIC], [AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_PIC])]) m4_ifndef([AC_LIBTOOL_PROG_LD_SHLIBS], [AC_DEFUN([AC_LIBTOOL_PROG_LD_SHLIBS])]) m4_ifndef([AC_LIBTOOL_POSTDEP_PREDEP], [AC_DEFUN([AC_LIBTOOL_POSTDEP_PREDEP])]) m4_ifndef([LT_AC_PROG_EGREP], [AC_DEFUN([LT_AC_PROG_EGREP])]) m4_ifndef([LT_AC_PROG_SED], [AC_DEFUN([LT_AC_PROG_SED])]) m4_ifndef([_LT_CC_BASENAME], [AC_DEFUN([_LT_CC_BASENAME])]) m4_ifndef([_LT_COMPILER_BOILERPLATE], [AC_DEFUN([_LT_COMPILER_BOILERPLATE])]) m4_ifndef([_LT_LINKER_BOILERPLATE], [AC_DEFUN([_LT_LINKER_BOILERPLATE])]) m4_ifndef([_AC_PROG_LIBTOOL], [AC_DEFUN([_AC_PROG_LIBTOOL])]) m4_ifndef([AC_LIBTOOL_SETUP], [AC_DEFUN([AC_LIBTOOL_SETUP])]) m4_ifndef([_LT_AC_CHECK_DLFCN], [AC_DEFUN([_LT_AC_CHECK_DLFCN])]) m4_ifndef([AC_LIBTOOL_SYS_DYNAMIC_LINKER], [AC_DEFUN([AC_LIBTOOL_SYS_DYNAMIC_LINKER])]) m4_ifndef([_LT_AC_TAGCONFIG], [AC_DEFUN([_LT_AC_TAGCONFIG])]) m4_ifndef([AC_DISABLE_FAST_INSTALL], [AC_DEFUN([AC_DISABLE_FAST_INSTALL])]) m4_ifndef([_LT_AC_LANG_CXX], [AC_DEFUN([_LT_AC_LANG_CXX])]) m4_ifndef([_LT_AC_LANG_F77], [AC_DEFUN([_LT_AC_LANG_F77])]) m4_ifndef([_LT_AC_LANG_GCJ], [AC_DEFUN([_LT_AC_LANG_GCJ])]) m4_ifndef([AC_LIBTOOL_LANG_C_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_C_CONFIG])]) m4_ifndef([_LT_AC_LANG_C_CONFIG], [AC_DEFUN([_LT_AC_LANG_C_CONFIG])]) m4_ifndef([AC_LIBTOOL_LANG_CXX_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_CXX_CONFIG])]) m4_ifndef([_LT_AC_LANG_CXX_CONFIG], [AC_DEFUN([_LT_AC_LANG_CXX_CONFIG])]) m4_ifndef([AC_LIBTOOL_LANG_F77_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_F77_CONFIG])]) m4_ifndef([_LT_AC_LANG_F77_CONFIG], [AC_DEFUN([_LT_AC_LANG_F77_CONFIG])]) m4_ifndef([AC_LIBTOOL_LANG_GCJ_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_GCJ_CONFIG])]) m4_ifndef([_LT_AC_LANG_GCJ_CONFIG], [AC_DEFUN([_LT_AC_LANG_GCJ_CONFIG])]) m4_ifndef([AC_LIBTOOL_LANG_RC_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_RC_CONFIG])]) m4_ifndef([_LT_AC_LANG_RC_CONFIG], [AC_DEFUN([_LT_AC_LANG_RC_CONFIG])]) m4_ifndef([AC_LIBTOOL_CONFIG], [AC_DEFUN([AC_LIBTOOL_CONFIG])]) m4_ifndef([_LT_AC_FILE_LTDLL_C], [AC_DEFUN([_LT_AC_FILE_LTDLL_C])]) m4_ifndef([_LT_REQUIRED_DARWIN_CHECKS], [AC_DEFUN([_LT_REQUIRED_DARWIN_CHECKS])]) m4_ifndef([_LT_AC_PROG_CXXCPP], [AC_DEFUN([_LT_AC_PROG_CXXCPP])]) m4_ifndef([_LT_PREPARE_SED_QUOTE_VARS], [AC_DEFUN([_LT_PREPARE_SED_QUOTE_VARS])]) m4_ifndef([_LT_PROG_ECHO_BACKSLASH], [AC_DEFUN([_LT_PROG_ECHO_BACKSLASH])]) m4_ifndef([_LT_PROG_F77], [AC_DEFUN([_LT_PROG_F77])]) m4_ifndef([_LT_PROG_FC], [AC_DEFUN([_LT_PROG_FC])]) m4_ifndef([_LT_PROG_CXX], [AC_DEFUN([_LT_PROG_CXX])]) dibbler-1.0.1/m4/ltsugar.m40000664000175000017500000001042412233256142012303 00000000000000# ltsugar.m4 -- libtool m4 base layer. -*-Autoconf-*- # # Copyright (C) 2004, 2005, 2007, 2008 Free Software Foundation, Inc. # Written by Gary V. Vaughan, 2004 # # This file is free software; the Free Software Foundation gives # unlimited permission to copy and/or distribute it, with or without # modifications, as long as this notice is preserved. # serial 6 ltsugar.m4 # This is to help aclocal find these macros, as it can't see m4_define. AC_DEFUN([LTSUGAR_VERSION], [m4_if([0.1])]) # lt_join(SEP, ARG1, [ARG2...]) # ----------------------------- # Produce ARG1SEPARG2...SEPARGn, omitting [] arguments and their # associated separator. # Needed until we can rely on m4_join from Autoconf 2.62, since all earlier # versions in m4sugar had bugs. m4_define([lt_join], [m4_if([$#], [1], [], [$#], [2], [[$2]], [m4_if([$2], [], [], [[$2]_])$0([$1], m4_shift(m4_shift($@)))])]) m4_define([_lt_join], [m4_if([$#$2], [2], [], [m4_if([$2], [], [], [[$1$2]])$0([$1], m4_shift(m4_shift($@)))])]) # lt_car(LIST) # lt_cdr(LIST) # ------------ # Manipulate m4 lists. # These macros are necessary as long as will still need to support # Autoconf-2.59 which quotes differently. m4_define([lt_car], [[$1]]) m4_define([lt_cdr], [m4_if([$#], 0, [m4_fatal([$0: cannot be called without arguments])], [$#], 1, [], [m4_dquote(m4_shift($@))])]) m4_define([lt_unquote], $1) # lt_append(MACRO-NAME, STRING, [SEPARATOR]) # ------------------------------------------ # Redefine MACRO-NAME to hold its former content plus `SEPARATOR'`STRING'. # Note that neither SEPARATOR nor STRING are expanded; they are appended # to MACRO-NAME as is (leaving the expansion for when MACRO-NAME is invoked). # No SEPARATOR is output if MACRO-NAME was previously undefined (different # than defined and empty). # # This macro is needed until we can rely on Autoconf 2.62, since earlier # versions of m4sugar mistakenly expanded SEPARATOR but not STRING. m4_define([lt_append], [m4_define([$1], m4_ifdef([$1], [m4_defn([$1])[$3]])[$2])]) # lt_combine(SEP, PREFIX-LIST, INFIX, SUFFIX1, [SUFFIX2...]) # ---------------------------------------------------------- # Produce a SEP delimited list of all paired combinations of elements of # PREFIX-LIST with SUFFIX1 through SUFFIXn. Each element of the list # has the form PREFIXmINFIXSUFFIXn. # Needed until we can rely on m4_combine added in Autoconf 2.62. m4_define([lt_combine], [m4_if(m4_eval([$# > 3]), [1], [m4_pushdef([_Lt_sep], [m4_define([_Lt_sep], m4_defn([lt_car]))])]]dnl [[m4_foreach([_Lt_prefix], [$2], [m4_foreach([_Lt_suffix], ]m4_dquote(m4_dquote(m4_shift(m4_shift(m4_shift($@)))))[, [_Lt_sep([$1])[]m4_defn([_Lt_prefix])[$3]m4_defn([_Lt_suffix])])])])]) # lt_if_append_uniq(MACRO-NAME, VARNAME, [SEPARATOR], [UNIQ], [NOT-UNIQ]) # ----------------------------------------------------------------------- # Iff MACRO-NAME does not yet contain VARNAME, then append it (delimited # by SEPARATOR if supplied) and expand UNIQ, else NOT-UNIQ. m4_define([lt_if_append_uniq], [m4_ifdef([$1], [m4_if(m4_index([$3]m4_defn([$1])[$3], [$3$2$3]), [-1], [lt_append([$1], [$2], [$3])$4], [$5])], [lt_append([$1], [$2], [$3])$4])]) # lt_dict_add(DICT, KEY, VALUE) # ----------------------------- m4_define([lt_dict_add], [m4_define([$1($2)], [$3])]) # lt_dict_add_subkey(DICT, KEY, SUBKEY, VALUE) # -------------------------------------------- m4_define([lt_dict_add_subkey], [m4_define([$1($2:$3)], [$4])]) # lt_dict_fetch(DICT, KEY, [SUBKEY]) # ---------------------------------- m4_define([lt_dict_fetch], [m4_ifval([$3], m4_ifdef([$1($2:$3)], [m4_defn([$1($2:$3)])]), m4_ifdef([$1($2)], [m4_defn([$1($2)])]))]) # lt_if_dict_fetch(DICT, KEY, [SUBKEY], VALUE, IF-TRUE, [IF-FALSE]) # ----------------------------------------------------------------- m4_define([lt_if_dict_fetch], [m4_if(lt_dict_fetch([$1], [$2], [$3]), [$4], [$5], [$6])]) # lt_dict_filter(DICT, [SUBKEY], VALUE, [SEPARATOR], KEY, [...]) # -------------------------------------------------------------- m4_define([lt_dict_filter], [m4_if([$5], [], [], [lt_join(m4_quote(m4_default([$4], [[, ]])), lt_unquote(m4_split(m4_normalize(m4_foreach(_Lt_key, lt_car([m4_shiftn(4, $@)]), [lt_if_dict_fetch([$1], _Lt_key, [$2], [$3], [_Lt_key ])])))))])[]dnl ]) dibbler-1.0.1/m4/ltoptions.m40000664000175000017500000003007312233256142012657 00000000000000# Helper functions for option handling. -*- Autoconf -*- # # Copyright (C) 2004, 2005, 2007, 2008, 2009 Free Software Foundation, # Inc. # Written by Gary V. Vaughan, 2004 # # This file is free software; the Free Software Foundation gives # unlimited permission to copy and/or distribute it, with or without # modifications, as long as this notice is preserved. # serial 7 ltoptions.m4 # This is to help aclocal find these macros, as it can't see m4_define. AC_DEFUN([LTOPTIONS_VERSION], [m4_if([1])]) # _LT_MANGLE_OPTION(MACRO-NAME, OPTION-NAME) # ------------------------------------------ m4_define([_LT_MANGLE_OPTION], [[_LT_OPTION_]m4_bpatsubst($1__$2, [[^a-zA-Z0-9_]], [_])]) # _LT_SET_OPTION(MACRO-NAME, OPTION-NAME) # --------------------------------------- # Set option OPTION-NAME for macro MACRO-NAME, and if there is a # matching handler defined, dispatch to it. Other OPTION-NAMEs are # saved as a flag. m4_define([_LT_SET_OPTION], [m4_define(_LT_MANGLE_OPTION([$1], [$2]))dnl m4_ifdef(_LT_MANGLE_DEFUN([$1], [$2]), _LT_MANGLE_DEFUN([$1], [$2]), [m4_warning([Unknown $1 option `$2'])])[]dnl ]) # _LT_IF_OPTION(MACRO-NAME, OPTION-NAME, IF-SET, [IF-NOT-SET]) # ------------------------------------------------------------ # Execute IF-SET if OPTION is set, IF-NOT-SET otherwise. m4_define([_LT_IF_OPTION], [m4_ifdef(_LT_MANGLE_OPTION([$1], [$2]), [$3], [$4])]) # _LT_UNLESS_OPTIONS(MACRO-NAME, OPTION-LIST, IF-NOT-SET) # ------------------------------------------------------- # Execute IF-NOT-SET unless all options in OPTION-LIST for MACRO-NAME # are set. m4_define([_LT_UNLESS_OPTIONS], [m4_foreach([_LT_Option], m4_split(m4_normalize([$2])), [m4_ifdef(_LT_MANGLE_OPTION([$1], _LT_Option), [m4_define([$0_found])])])[]dnl m4_ifdef([$0_found], [m4_undefine([$0_found])], [$3 ])[]dnl ]) # _LT_SET_OPTIONS(MACRO-NAME, OPTION-LIST) # ---------------------------------------- # OPTION-LIST is a space-separated list of Libtool options associated # with MACRO-NAME. If any OPTION has a matching handler declared with # LT_OPTION_DEFINE, dispatch to that macro; otherwise complain about # the unknown option and exit. m4_defun([_LT_SET_OPTIONS], [# Set options m4_foreach([_LT_Option], m4_split(m4_normalize([$2])), [_LT_SET_OPTION([$1], _LT_Option)]) m4_if([$1],[LT_INIT],[ dnl dnl Simply set some default values (i.e off) if boolean options were not dnl specified: _LT_UNLESS_OPTIONS([LT_INIT], [dlopen], [enable_dlopen=no ]) _LT_UNLESS_OPTIONS([LT_INIT], [win32-dll], [enable_win32_dll=no ]) dnl dnl If no reference was made to various pairs of opposing options, then dnl we run the default mode handler for the pair. For example, if neither dnl `shared' nor `disable-shared' was passed, we enable building of shared dnl archives by default: _LT_UNLESS_OPTIONS([LT_INIT], [shared disable-shared], [_LT_ENABLE_SHARED]) _LT_UNLESS_OPTIONS([LT_INIT], [static disable-static], [_LT_ENABLE_STATIC]) _LT_UNLESS_OPTIONS([LT_INIT], [pic-only no-pic], [_LT_WITH_PIC]) _LT_UNLESS_OPTIONS([LT_INIT], [fast-install disable-fast-install], [_LT_ENABLE_FAST_INSTALL]) ]) ])# _LT_SET_OPTIONS ## --------------------------------- ## ## Macros to handle LT_INIT options. ## ## --------------------------------- ## # _LT_MANGLE_DEFUN(MACRO-NAME, OPTION-NAME) # ----------------------------------------- m4_define([_LT_MANGLE_DEFUN], [[_LT_OPTION_DEFUN_]m4_bpatsubst(m4_toupper([$1__$2]), [[^A-Z0-9_]], [_])]) # LT_OPTION_DEFINE(MACRO-NAME, OPTION-NAME, CODE) # ----------------------------------------------- m4_define([LT_OPTION_DEFINE], [m4_define(_LT_MANGLE_DEFUN([$1], [$2]), [$3])[]dnl ])# LT_OPTION_DEFINE # dlopen # ------ LT_OPTION_DEFINE([LT_INIT], [dlopen], [enable_dlopen=yes ]) AU_DEFUN([AC_LIBTOOL_DLOPEN], [_LT_SET_OPTION([LT_INIT], [dlopen]) AC_DIAGNOSE([obsolete], [$0: Remove this warning and the call to _LT_SET_OPTION when you put the `dlopen' option into LT_INIT's first parameter.]) ]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_DLOPEN], []) # win32-dll # --------- # Declare package support for building win32 dll's. LT_OPTION_DEFINE([LT_INIT], [win32-dll], [enable_win32_dll=yes case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-cegcc*) AC_CHECK_TOOL(AS, as, false) AC_CHECK_TOOL(DLLTOOL, dlltool, false) AC_CHECK_TOOL(OBJDUMP, objdump, false) ;; esac test -z "$AS" && AS=as _LT_DECL([], [AS], [1], [Assembler program])dnl test -z "$DLLTOOL" && DLLTOOL=dlltool _LT_DECL([], [DLLTOOL], [1], [DLL creation program])dnl test -z "$OBJDUMP" && OBJDUMP=objdump _LT_DECL([], [OBJDUMP], [1], [Object dumper program])dnl ])# win32-dll AU_DEFUN([AC_LIBTOOL_WIN32_DLL], [AC_REQUIRE([AC_CANONICAL_HOST])dnl _LT_SET_OPTION([LT_INIT], [win32-dll]) AC_DIAGNOSE([obsolete], [$0: Remove this warning and the call to _LT_SET_OPTION when you put the `win32-dll' option into LT_INIT's first parameter.]) ]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_WIN32_DLL], []) # _LT_ENABLE_SHARED([DEFAULT]) # ---------------------------- # implement the --enable-shared flag, and supports the `shared' and # `disable-shared' LT_INIT options. # DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. m4_define([_LT_ENABLE_SHARED], [m4_define([_LT_ENABLE_SHARED_DEFAULT], [m4_if($1, no, no, yes)])dnl AC_ARG_ENABLE([shared], [AS_HELP_STRING([--enable-shared@<:@=PKGS@:>@], [build shared libraries @<:@default=]_LT_ENABLE_SHARED_DEFAULT[@:>@])], [p=${PACKAGE-default} case $enableval in yes) enable_shared=yes ;; no) enable_shared=no ;; *) enable_shared=no # Look at the argument we got. We use all the common list separators. lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for pkg in $enableval; do IFS="$lt_save_ifs" if test "X$pkg" = "X$p"; then enable_shared=yes fi done IFS="$lt_save_ifs" ;; esac], [enable_shared=]_LT_ENABLE_SHARED_DEFAULT) _LT_DECL([build_libtool_libs], [enable_shared], [0], [Whether or not to build shared libraries]) ])# _LT_ENABLE_SHARED LT_OPTION_DEFINE([LT_INIT], [shared], [_LT_ENABLE_SHARED([yes])]) LT_OPTION_DEFINE([LT_INIT], [disable-shared], [_LT_ENABLE_SHARED([no])]) # Old names: AC_DEFUN([AC_ENABLE_SHARED], [_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[shared]) ]) AC_DEFUN([AC_DISABLE_SHARED], [_LT_SET_OPTION([LT_INIT], [disable-shared]) ]) AU_DEFUN([AM_ENABLE_SHARED], [AC_ENABLE_SHARED($@)]) AU_DEFUN([AM_DISABLE_SHARED], [AC_DISABLE_SHARED($@)]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AM_ENABLE_SHARED], []) dnl AC_DEFUN([AM_DISABLE_SHARED], []) # _LT_ENABLE_STATIC([DEFAULT]) # ---------------------------- # implement the --enable-static flag, and support the `static' and # `disable-static' LT_INIT options. # DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. m4_define([_LT_ENABLE_STATIC], [m4_define([_LT_ENABLE_STATIC_DEFAULT], [m4_if($1, no, no, yes)])dnl AC_ARG_ENABLE([static], [AS_HELP_STRING([--enable-static@<:@=PKGS@:>@], [build static libraries @<:@default=]_LT_ENABLE_STATIC_DEFAULT[@:>@])], [p=${PACKAGE-default} case $enableval in yes) enable_static=yes ;; no) enable_static=no ;; *) enable_static=no # Look at the argument we got. We use all the common list separators. lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for pkg in $enableval; do IFS="$lt_save_ifs" if test "X$pkg" = "X$p"; then enable_static=yes fi done IFS="$lt_save_ifs" ;; esac], [enable_static=]_LT_ENABLE_STATIC_DEFAULT) _LT_DECL([build_old_libs], [enable_static], [0], [Whether or not to build static libraries]) ])# _LT_ENABLE_STATIC LT_OPTION_DEFINE([LT_INIT], [static], [_LT_ENABLE_STATIC([yes])]) LT_OPTION_DEFINE([LT_INIT], [disable-static], [_LT_ENABLE_STATIC([no])]) # Old names: AC_DEFUN([AC_ENABLE_STATIC], [_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[static]) ]) AC_DEFUN([AC_DISABLE_STATIC], [_LT_SET_OPTION([LT_INIT], [disable-static]) ]) AU_DEFUN([AM_ENABLE_STATIC], [AC_ENABLE_STATIC($@)]) AU_DEFUN([AM_DISABLE_STATIC], [AC_DISABLE_STATIC($@)]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AM_ENABLE_STATIC], []) dnl AC_DEFUN([AM_DISABLE_STATIC], []) # _LT_ENABLE_FAST_INSTALL([DEFAULT]) # ---------------------------------- # implement the --enable-fast-install flag, and support the `fast-install' # and `disable-fast-install' LT_INIT options. # DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. m4_define([_LT_ENABLE_FAST_INSTALL], [m4_define([_LT_ENABLE_FAST_INSTALL_DEFAULT], [m4_if($1, no, no, yes)])dnl AC_ARG_ENABLE([fast-install], [AS_HELP_STRING([--enable-fast-install@<:@=PKGS@:>@], [optimize for fast installation @<:@default=]_LT_ENABLE_FAST_INSTALL_DEFAULT[@:>@])], [p=${PACKAGE-default} case $enableval in yes) enable_fast_install=yes ;; no) enable_fast_install=no ;; *) enable_fast_install=no # Look at the argument we got. We use all the common list separators. lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for pkg in $enableval; do IFS="$lt_save_ifs" if test "X$pkg" = "X$p"; then enable_fast_install=yes fi done IFS="$lt_save_ifs" ;; esac], [enable_fast_install=]_LT_ENABLE_FAST_INSTALL_DEFAULT) _LT_DECL([fast_install], [enable_fast_install], [0], [Whether or not to optimize for fast installation])dnl ])# _LT_ENABLE_FAST_INSTALL LT_OPTION_DEFINE([LT_INIT], [fast-install], [_LT_ENABLE_FAST_INSTALL([yes])]) LT_OPTION_DEFINE([LT_INIT], [disable-fast-install], [_LT_ENABLE_FAST_INSTALL([no])]) # Old names: AU_DEFUN([AC_ENABLE_FAST_INSTALL], [_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[fast-install]) AC_DIAGNOSE([obsolete], [$0: Remove this warning and the call to _LT_SET_OPTION when you put the `fast-install' option into LT_INIT's first parameter.]) ]) AU_DEFUN([AC_DISABLE_FAST_INSTALL], [_LT_SET_OPTION([LT_INIT], [disable-fast-install]) AC_DIAGNOSE([obsolete], [$0: Remove this warning and the call to _LT_SET_OPTION when you put the `disable-fast-install' option into LT_INIT's first parameter.]) ]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_ENABLE_FAST_INSTALL], []) dnl AC_DEFUN([AM_DISABLE_FAST_INSTALL], []) # _LT_WITH_PIC([MODE]) # -------------------- # implement the --with-pic flag, and support the `pic-only' and `no-pic' # LT_INIT options. # MODE is either `yes' or `no'. If omitted, it defaults to `both'. m4_define([_LT_WITH_PIC], [AC_ARG_WITH([pic], [AS_HELP_STRING([--with-pic@<:@=PKGS@:>@], [try to use only PIC/non-PIC objects @<:@default=use both@:>@])], [lt_p=${PACKAGE-default} case $withval in yes|no) pic_mode=$withval ;; *) pic_mode=default # Look at the argument we got. We use all the common list separators. lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for lt_pkg in $withval; do IFS="$lt_save_ifs" if test "X$lt_pkg" = "X$lt_p"; then pic_mode=yes fi done IFS="$lt_save_ifs" ;; esac], [pic_mode=default]) test -z "$pic_mode" && pic_mode=m4_default([$1], [default]) _LT_DECL([], [pic_mode], [0], [What type of objects to build])dnl ])# _LT_WITH_PIC LT_OPTION_DEFINE([LT_INIT], [pic-only], [_LT_WITH_PIC([yes])]) LT_OPTION_DEFINE([LT_INIT], [no-pic], [_LT_WITH_PIC([no])]) # Old name: AU_DEFUN([AC_LIBTOOL_PICMODE], [_LT_SET_OPTION([LT_INIT], [pic-only]) AC_DIAGNOSE([obsolete], [$0: Remove this warning and the call to _LT_SET_OPTION when you put the `pic-only' option into LT_INIT's first parameter.]) ]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_PICMODE], []) ## ----------------- ## ## LTDL_INIT Options ## ## ----------------- ## m4_define([_LTDL_MODE], []) LT_OPTION_DEFINE([LTDL_INIT], [nonrecursive], [m4_define([_LTDL_MODE], [nonrecursive])]) LT_OPTION_DEFINE([LTDL_INIT], [recursive], [m4_define([_LTDL_MODE], [recursive])]) LT_OPTION_DEFINE([LTDL_INIT], [subproject], [m4_define([_LTDL_MODE], [subproject])]) m4_define([_LTDL_TYPE], []) LT_OPTION_DEFINE([LTDL_INIT], [installable], [m4_define([_LTDL_TYPE], [installable])]) LT_OPTION_DEFINE([LTDL_INIT], [convenience], [m4_define([_LTDL_TYPE], [convenience])]) dibbler-1.0.1/m4/ltversion.m40000664000175000017500000000126212233256142012647 00000000000000# ltversion.m4 -- version numbers -*- Autoconf -*- # # Copyright (C) 2004 Free Software Foundation, Inc. # Written by Scott James Remnant, 2004 # # This file is free software; the Free Software Foundation gives # unlimited permission to copy and/or distribute it, with or without # modifications, as long as this notice is preserved. # @configure_input@ # serial 3337 ltversion.m4 # This file is part of GNU Libtool m4_define([LT_PACKAGE_VERSION], [2.4.2]) m4_define([LT_PACKAGE_REVISION], [1.3337]) AC_DEFUN([LTVERSION_VERSION], [macro_version='2.4.2' macro_revision='1.3337' _LT_DECL(, macro_version, 0, [Which release of libtool.m4 was used?]) _LT_DECL(, macro_revision, 0) ]) dibbler-1.0.1/ClntMessages/0000775000175000017500000000000012561700421012505 500000000000000dibbler-1.0.1/ClntMessages/ClntMsgRenew.h0000664000175000017500000000126212233256142015151 00000000000000/* * Dibbler - a portable DHCPv6 * * authors: Tomasz Mrugalski * Marek Senderski * * released under GNU GPL v2 only licence * * $Id: ClntMsgRenew.h,v 1.7 2008-08-29 00:07:28 thomson Exp $ * */ #ifndef CLNTMSGRENEW_H #define CLNTMSGRENEW_H #include "ClntMsg.h" #include "ClntOptIA_NA.h" class TClntMsgRenew : public TClntMsg { public: TClntMsgRenew(List(TAddrIA) IALst, List(TAddrIA) PDLst); void answer(SPtr Rep); void doDuties(); bool check(); std::string getName() const; ~TClntMsgRenew(); void updateIA(SPtr ptrOptIA); void releaseIA(long IAID); private: }; #endif dibbler-1.0.1/ClntMessages/ClntMsg.h0000664000175000017500000000441312420521666014155 00000000000000/* * Dibbler - a portable DHCPv6 * * authors: Tomasz Mrugalski * Marek Senderski * changes: Michal Kowalczuk * * released under GNU GPL v2 only licence */ #ifndef CLNTMSG_H #define CLNTMSG_H #include "Msg.h" #include "ClntIfaceMgr.h" #include "ClntTransMgr.h" #include "ClntCfgMgr.h" #include "ClntAddrMgr.h" #include "SmartPtr.h" #include "Opt.h" class TClntMsg : public TMsg { public: TClntMsg(int iface, SPtr addr, char* buf, int bufSize); TClntMsg(int iface, SPtr addr, int msgType); ~TClntMsg(); unsigned long getTimeout(); void send(); SPtr parseExtraOption(const char *buf, unsigned int code, unsigned int length); //answer for a specific message virtual void doDuties() = 0; virtual bool check() = 0; void setIface(int iface); // used to override when we have received msg via loopback interface. void copyAAASPI(SPtr q); void appendTAOptions(bool switchToInProcess); // append all TAs, which are currently in the NOTCONFIGURED state // void appendPDOptions(bool switchToInProcess); // append all PDs, which are currently in the NOTCONFIGURED state void appendAuthenticationOption(); void appendElapsedOption(); void appendRequestedOptions(); bool checkReceivedAuthOption(); bool validateReplayDetection(); // virtual std::string getName() = 0; virtual void answer(SPtr reply); void getReconfKeyFromAddrMgr(); void deletePD(SPtr pd_); protected: bool check(bool clntIDmandatory, bool srvIDmandatory); bool appendClientID(); long IRT; // Initial Retransmission Time long MRT; // Maximum Retransmission Time long MRC; // Maximum Retransmission Count long MRD; // Maximum Retransmission Duration int RC; // Retransmission counter (counts to 0) int RT; // Retransmission timeout (in seconds) int FirstTimeStamp; // timestamp of the first transmission int LastTimeStamp; // timestamp of the last transmission private: void setDefaults(); void invalidAllowOptInMsg(int msg, int opt); void invalidAllowOptInOpt(int msg, int parentOpt, int childOpt); }; #endif dibbler-1.0.1/ClntMessages/ClntMsgInfRequest.h0000664000175000017500000000120712233256142016155 00000000000000/* * Dibbler - a portable DHCPv6 * * authors: Tomasz Mrugalski * Marek Senderski * * released under GNU GPL v2 only licence * */ class TClntIfaceMgr; #ifndef CLNTMSGINFREQUEST_H #define CLNTMSGINFREQUEST_H #include "SmartPtr.h" #include "ClntMsg.h" #include "ClntCfgMgr.h" class TClntMsgInfRequest : public TClntMsg { public: TClntMsgInfRequest(TOptList ReqOpts, int iface); TClntMsgInfRequest(SPtr iface); void answer(SPtr msg); void doDuties(); bool check(); std::string getName() const; ~TClntMsgInfRequest(); }; #endif dibbler-1.0.1/ClntMessages/ClntMsgRequest.h0000664000175000017500000000161212233256142015520 00000000000000/* * Dibbler - a portable DHCPv6 * * authors: Tomasz Mrugalski * Marek Senderski * changes: Krzysztof Wnuk * released under GNU GPL v2 only licence * */ class TClntIfaceMgr; #ifndef CLNTMSGREQUEST_H #define CLNTMSGREQUEST_H #include "SmartPtr.h" #include "ClntMsg.h" class TClntMsgRequest : public TClntMsg { public: TClntMsgRequest(TOptList opts, int iface); TClntMsgRequest(List(TAddrIA) requestIALst, SPtr srvDUID, int iface); void answer(SPtr msg); void doDuties(); bool check(); std::string getName() const; ~TClntMsgRequest(); private: void setState(TOptList opts, EState state); void copyAddrsFromAdvertise(SPtr adv); void copyPrefixesFromAdvertise(SPtr adv); }; #endif /* CLNTMSGREQUEST_H */ dibbler-1.0.1/ClntMessages/ClntMsgInfRequest.cpp0000664000175000017500000001274412556514415016530 00000000000000/* * Dibbler - a portable DHCPv6 * * authors: Tomasz Mrugalski * Marek Senderski * changes: Michal Kowalczuk * * released under GNU GPL v2 only licence * * $Id: ClntMsgInfRequest.cpp,v 1.16 2009-03-24 23:17:17 thomson Exp $ * */ #include "ClntMsgInfRequest.h" #include "SmartPtr.h" #include "DHCPConst.h" #include "Container.h" #include "ClntIfaceMgr.h" #include "ClntMsgAdvertise.h" #include "OptDUID.h" #include "ClntOptIA_NA.h" #include "ClntOptElapsed.h" #include "Logger.h" #include "ClntOptOptionRequest.h" #include "ClntCfgIface.h" #include "ClntOptTimeZone.h" #include TClntMsgInfRequest::TClntMsgInfRequest(SPtr iface) :TClntMsg(iface->getID(), SPtr(), INFORMATION_REQUEST_MSG) { IRT = INF_TIMEOUT; MRT = INF_MAX_RT; MRC = 0; MRD = 0; RT= 0 ; Iface=iface->getID(); IsDone=false; if (!ClntCfgMgr().anonInfRequest()) { Options.push_back(new TOptDUID(OPTION_CLIENTID, ClntCfgMgr().getDUID(), this)); } else { Log(Info) << "Sending anonymous INF-REQUEST (ClientID not included)." << LogEnd; } // Append the options we want to configure appendRequestedOptions(); // If there is no ORO (or it is empty), skip the message. SPtr oro = (Ptr*) getOption(OPTION_ORO); if (!oro || !oro->count()) { IsDone = true; return; } appendAuthenticationOption(); appendElapsedOption(); send(); } //opts - all options list WITHOUT serverDUID including server id TClntMsgInfRequest::TClntMsgInfRequest(TOptList ReqOpts, int iface) :TClntMsg(iface, SPtr(), INFORMATION_REQUEST_MSG) { IRT = INF_TIMEOUT; MRT = INF_MAX_RT; MRC = 0; MRD = 0; RT=0; Iface=iface; IsDone=false; SPtr ptrIface = ClntIfaceMgr().getIfaceByID(iface); if (!ptrIface) { Log(Error) << "Unable to find interface with ifindex=" << iface << " while trying to generate INF-REQUEST." << LogEnd; IsDone = true; return; } Log(Debug) << "Creating INF-REQUEST on the " << ptrIface->getFullName() << "." << LogEnd; // copy whole list from Verify ... Options = ReqOpts; SPtr opt; firstOption(); while(opt=getOption()) { switch (opt->getOptType()) { //These options possibly receipt from verify transaction //can't appear in request message and have to be deleted case OPTION_UNICAST: case OPTION_STATUS_CODE: case OPTION_PREFERENCE: case OPTION_IA_TA: case OPTION_RELAY_MSG: case OPTION_SERVERID: case OPTION_IA_NA: case OPTION_IAADDR: case OPTION_RAPID_COMMIT: case OPTION_INTERFACE_ID: case OPTION_RECONF_MSG: case OPTION_AUTH: case OPTION_ELAPSED_TIME: //delete the old elapsed option,as we will append a new one delOption(opt->getOptType()); break; } //The other options can be included in Information request option //CLIENTID,ORO,ELAPSED_TIME,USER_CLASS,VENDOR_CLASS, //VENDOR_OPTS,DNS_RESOLVERS,DOMAIN_LIST,NTP_SERVERS,TIME_ZONE, //RECONF_ACCEPT - maybe also SERVERID if information request //is answer to reconfigure message } appendElapsedOption(); appendAuthenticationOption(); this->send(); } void TClntMsgInfRequest::answer(SPtr msg) { copyAAASPI(msg); TClntMsg::answer(msg); #if 0 //which option have we requested from server SPtr ptrORO; ptrORO = (Ptr*)getOption(OPTION_ORO); SPtr option; msg->firstOption(); while(option = msg->getOption()) { //if option did what it was supposed to do ??? if (!option->doDuties()) { // Log(Debug) << "Setting option " << option->getOptType() << " failed." << LogEnd; continue; } if ( ptrORO && (ptrORO->isOption(option->getOptType())) ) ptrORO->delOption(option->getOptType()); SPtr requestOpt; this->firstOption(); while ( requestOpt = this->getOption()) { if (requestOpt->getOptType()==option->getOptType()) { delOption(requestOpt->getOptType()); break; } }//while } ptrORO->delOption(OPTION_INFORMATION_REFRESH_TIME); if (ptrORO && ptrORO->count()) { if (ClntCfgMgr().insistMode()){ Log(Notice) << "Insist-mode enabled. Not all options were assigned ("; for (int i=0; icount(); i++) Log(Cont) << ptrORO->getReqOpt(i) << " "; Log(Cont) << "). Sending new INFORMATION-REQUEST." << LogEnd; ClntTransMgr().sendInfRequest(Options,Iface); } else { Log(Notice) << "Insist-mode disabled. Not all options were assigned ("; for (int i=0; icount(); i++) Log(Cont) << ptrORO->getReqOpt(i) << " "; Log(Cont) << "). They will remain unconfigured." << LogEnd; IsDone = true; } } else { Log(Debug) << "All requested options were assigned." << LogEnd; IsDone=true; } return; #endif } void TClntMsgInfRequest::doDuties() { //timeout is reached, so let's retrasmit this message send(); return; } bool TClntMsgInfRequest::check() { return false; } std::string TClntMsgInfRequest::getName() const { return "INF-REQUEST"; } TClntMsgInfRequest::~TClntMsgInfRequest() { } dibbler-1.0.1/ClntMessages/ClntMsgRebind.cpp0000644000175000017500000002241212556514637015643 00000000000000/* * Dibbler - a portable DHCPv6 * * authors: Tomasz Mrugalski * Marek Senderski * changes: Michal Kowalczuk * * released under GNU GPL v2 only licence * */ #include #include #include #include "SmartPtr.h" #include "ClntMsg.h" #include "ClntMsgRebind.h" #include "ClntOptIA_NA.h" #include "ClntOptIA_PD.h" #include "OptDUID.h" #include "OptAddr.h" #include "AddrIA.h" #include "Logger.h" #include "ClntOptOptionRequest.h" #include "ClntOptStatusCode.h" using namespace std; TClntMsgRebind::TClntMsgRebind(TOptList ptrOpts, int iface) :TClntMsg(iface, SPtr(), REBIND_MSG) { Options=ptrOpts; IRT=REB_TIMEOUT; MRT=REB_MAX_RT; MRC=0; RT=0; // there are options copied from RENEW. Get rid of some of them delOption(OPTION_ELAPSED_TIME); delOption(OPTION_SERVERID); SPtr opt; // calculate timeout (how long should be the REBIND message transmitted) unsigned long maxMRD=0; firstOption(); while(opt=getOption()) { switch (opt->getOptType()) { case OPTION_IA_NA: { SPtr ptrIA=(Ptr*) opt; SPtr ptrAddrIA= ClntAddrMgr().getIA(ptrIA->getIAID()); if (ptrAddrIA && maxMRDgetMaxValidTimeout()) maxMRD=ptrAddrIA->getMaxValidTimeout(); break; } case OPTION_IA_PD: { SPtr pd = (Ptr*) opt; SPtr addrPd = ClntAddrMgr().getPD(pd->getIAID()); if (addrPd && maxMRDgetMaxValidTimeout()) maxMRD=addrPd->getMaxValidTimeout(); break; } } } MRD= maxMRD; appendElapsedOption(); appendAuthenticationOption(); IsDone = false; send(); } void TClntMsgRebind::answer(SPtr Reply) { TClntMsg::answer(Reply); return; #if 0 /// @todo: Fix REPLY support for REBIND SPtr opt; // get DUID SPtr ptrDUID; ptrDUID = (Ptr*) Reply->getOption(OPTION_SERVERID); SPtr ptrOptionReqOpt=(Ptr*)getOption(OPTION_ORO); Reply->firstOption(); // for each option in message... (there should be only one IA option, as we send // separate RENEW for each IA, but we check all options anyway) while ( opt = Reply->getOption() ) { switch (opt->getOptType()) { case OPTION_IA_NA: { iaCnt++; SPtr ptrOptIA = (Ptr*)opt; if (ptrOptIA->getStatusCode()!=STATUSCODE_SUCCESS) { if(ptrOptIA->getStatusCode() == STATUSCODE_NOBINDING){ ClntTransMgr().sendRequest(Options,Iface); IsDone = true; return; }else{ SPtr status = (Ptr*) ptrOptIA->getOption(OPTION_STATUS_CODE); Log(Warning) << "Received IA (iaid=" << ptrOptIA->getIAID() << ") with status code " << StatusCodeToString(status->getCode()) << ": " << status->getText() << LogEnd; break; } } ptrOptIA->setContext(ClntIfaceMgr, ClntTransMgr, ClntCfgMgr, ClntAddrMgr, ptrDUID->getDUID(), SPtr() /*NULL*/, Reply->getIface()); ptrOptIA->doDuties(); break; } case OPTION_IA_PD: { iaCnt++; SPtr pd = (Ptr*) opt; if (pd->getStatusCode() != STATUSCODE_SUCCESS) { if(pd->getStatusCode() == STATUSCODE_NOBINDING){ ClntTransMgr->sendRequest(Options,Iface); IsDone = true; return; } else{ SPtr status = (Ptr*) pd->getOption(OPTION_STATUS_CODE); Log(Warning) << "Received PD (iaid=" << pd->getIAID() << ") with status code " << StatusCodeToString(status->getCode()) << ": " << status->getText() << LogEnd; break; } } pd->setContext(ClntIfaceMgr, ClntTransMgr, ClntCfgMgr, ClntAddrMgr, ptrDUID->getDUID(), 0, (TMsg*)this); pd->doDuties(); break; } case OPTION_ORO: case OPTION_RELAY_MSG: case OPTION_INTERFACE_ID: case OPTION_IAADDR: case OPTION_RECONF_MSG: Log(Warning) << "Illegal option (" << opt->getOptType() << ") in received REPLY message." << LogEnd; break; default: // what to do with unknown/other options? execute them opt->setParent(this); opt->doDuties(); } } //Here we received answer from our server, which updated the "whole information" //There is no use to send Rebind even if server realesed some addresses/IAs //in such a case new Solicit message should be sent if(iaCnt) IsDone = true; #endif } void TClntMsgRebind::updateIA(SPtr ptrOptIA, SPtr optSrvDUID, SPtr optUnicast) { SPtr< TAddrIA> ptrAddrIA; bool found = false; // ..find IA in addrMgr... ClntAddrMgr().firstIA(); while (ptrAddrIA = ClntAddrMgr().getIA() ) { if (ptrOptIA->getIAID() == ptrAddrIA->getIAID()) { found = true; break; } } if (found) { // set new server's DUID to handle this IA ptrAddrIA->setDUID(optSrvDUID->getDUID()); // if (optUnicast) { ptrAddrIA->setUnicast(optUnicast->getAddr()); } else { ptrAddrIA->setMulticast(); } // IAID found, set up new received options. SPtr ptrAddrAddr; SPtr ptrOptAddr; // are all addrs configured? if (ptrOptIA->countAddr() != ptrAddrIA->countAddr() ) { this->releaseIA(ptrOptIA->getIAID()); } // for each address in IA option... ptrOptIA->firstAddr(); while (ptrOptAddr = ptrOptIA->getAddr() ) { ptrAddrAddr = ptrAddrIA->getAddr( ptrOptAddr->getAddr() ); if (!ptrAddrAddr) { // there is no such addr in db /// @todo: what to do with new addrs? // (Thomson:I think we should RELEASE all addrs, and issue new REQUEST for this IA) } else { if ( (ptrOptAddr->getPref() == 0) || (ptrOptAddr->getValid() == 0) ) { releaseIA( ptrOptIA->getIAID() ); break; // analyze next option OPTION_IA_NA } // set up new options if (ptrOptAddr->getPref() != ptrAddrAddr->getPref() ) { // received diffrent prefered-lifetime /// @todo: } if (ptrOptAddr->getValid() != ptrAddrAddr->getValid() ) { // received diffrent prefered-lifetime /// @todo: } ptrAddrAddr->setTimestamp(); } } ptrAddrIA->setT1( ptrOptIA->getT1() ); ptrAddrIA->setT2( ptrOptIA->getT2() ); ptrAddrIA->setTimestamp(); ptrAddrIA->setState(STATE_CONFIGURED); } else { // unknown IAID, ignore it Log(Warning) << "Received message contains unknown IA (IAID=" << ptrOptIA->getIAID() << "). Ignoring it." << LogEnd; } } void TClntMsgRebind::doDuties() { SPtr iface = ClntIfaceMgr().getIfaceByID(this->Iface); if (!MRD) { ostringstream iaLst; ostringstream pdLst; SPtr ptrOpt; firstOption(); while(ptrOpt=getOption()) { switch( ptrOpt->getOptType()) { case OPTION_IA_NA: { SPtr ptrIA=(Ptr*)ptrOpt; iaLst << ptrIA->getIAID() << " "; releaseIA(ptrIA->getIAID()); break; } case OPTION_IA_PD: { SPtr ptrPD = (Ptr*)ptrOpt; ptrPD->setContext(SPtr(), SPtr(), this); ptrPD->delPrefixes(); break; } }; } Log(Warning) << "REBIND for the IA(s):" << iaLst.str() << ", PD(s):" << pdLst.str() << " failed on the " << iface->getFullName() << " interface." << LogEnd; Log(Warning) << "Restarting server discovery process." << LogEnd; IsDone=true; } else this->send(); } void TClntMsgRebind::releaseIA(int IAID) { SPtr ptrAddrIA=ClntAddrMgr().getIA(IAID); if (!ptrAddrIA) { Log(Error) << "IA has not been found in Address Manager."<< LogEnd; return; } SPtr ptrAddr; ptrAddrIA->firstAddr(); while(ptrAddr=ptrAddrIA->getAddr()) { //remove outdated address from interface SPtr ptrIface = ClntIfaceMgr().getIfaceByID(ptrAddrIA->getIfindex()); if (!ptrIface) { Log(Error) << "Unable to find interface with ifindex " << ptrAddrIA->getIfindex() << LogEnd; continue; } ptrIface->delAddr(ptrAddr->get(), ptrIface->getPrefixLength()); //and from db ptrAddrIA->delAddr(ptrAddr->get()); } ptrAddrIA->setState(STATE_NOTCONFIGURED); SPtr cfgIA = ClntCfgMgr().getIA(IAID); if (!cfgIA) return; cfgIA->setState(STATE_NOTCONFIGURED); } bool TClntMsgRebind::check() { return 0; } std::string TClntMsgRebind::getName() const { return "REBIND"; } TClntMsgRebind::~TClntMsgRebind() { } dibbler-1.0.1/ClntMessages/ClntMsgAdvertise.cpp0000644000175000017500000000327112277722750016365 00000000000000/* * Dibbler - a portable DHCPv6 * * authors: Tomasz Mrugalski * Marek Senderski * changes: Michal Kowalczuk * * released under GNU GPL v2 only licence * */ #include #include "ClntMsgAdvertise.h" #include "OptInteger.h" #include "OptDUID.h" #include "ClntOptPreference.h" using namespace std; /* * creates buffer based on buffer */ TClntMsgAdvertise::TClntMsgAdvertise(int iface, SPtr addr, char* buf, int buflen) :TClntMsg(iface,addr,buf,buflen) { } bool TClntMsgAdvertise::check() { return TClntMsg::check(true /* clientID mandatory */, true /* serverID mandatory */ ); } int TClntMsgAdvertise::getPreference() { SPtr ptr; ptr = (Ptr*) this->getOption(OPTION_PREFERENCE); if (!ptr) return 0; return ptr->getValue(); } void TClntMsgAdvertise::answer(SPtr Rep) { // this should never happen } void TClntMsgAdvertise::doDuties() { // this should never happen } string TClntMsgAdvertise::getName() const { return "ADVERTISE"; } string TClntMsgAdvertise::getInfo() { ostringstream tmp; SPtr pref; SPtr srvID; pref = (Ptr*) getOption(OPTION_PREFERENCE); srvID = (Ptr*) getOption(OPTION_SERVERID); if (srvID) { tmp << "Server ID=" << srvID->getDUID()->getPlain(); } else { tmp << "malformed (Server ID option missing)"; } if (pref) { tmp << ", preference=" << pref->getValue(); } else { tmp << ", no preference option, assumed 0"; } return tmp.str(); } TClntMsgAdvertise::~TClntMsgAdvertise() { } dibbler-1.0.1/ClntMessages/ClntMsg.cpp0000664000175000017500000011655412556514604014526 00000000000000/* * Dibbler - a portable DHCPv6 * * authors: Tomasz Mrugalski * Marek Senderski * changes: Michal Kowalczuk * Mateusz Ozga * * released under GNU GPL v2 only licence */ #include #include #include #include "Portable.h" #include "ClntCfgMgr.h" #include "ClntMsg.h" #include "ClntTransMgr.h" #include "OptGeneric.h" #include "OptEmpty.h" #include "OptAddrLst.h" #include "OptAddr.h" #include "OptDUID.h" #include "OptDomainLst.h" #include "OptRtPrefix.h" #include "ClntOptIA_NA.h" #include "ClntOptIA_PD.h" #include "ClntOptTA.h" #include "ClntOptOptionRequest.h" #include "ClntOptPreference.h" #include "OptReconfigureMsg.h" #include "ClntOptElapsed.h" #include "ClntOptStatusCode.h" #include "ClntOptTimeZone.h" #include "ClntOptFQDN.h" #include "OptAddrLst.h" #include "ClntOptLifetime.h" #include "OptAuthentication.h" #include "hex.h" #include "Logger.h" using namespace std; static string msgs[] = { "", "SOLICIT", "ADVERTISE", "REQUEST", "CONFIRM", "RENEW", "REBIND", "REPLY", "RELEASE", "DECLINE", "RECONFIGURE", "INF-REQUEST", "RELAY-FORWARD" "RELAY-REPLY", "LEASEQUERY", "LEASEQUERY-REPLY"}; void TClntMsg::invalidAllowOptInMsg(int msg, int opt) { string name; if (msg<=15) name = msgs[msg]; Log(Warning) << "Option " << opt << " is not allowed in the " << name << " message. Ignoring." << LogEnd; } void TClntMsg::invalidAllowOptInOpt(int msg, int parentOpt, int childOpt) { string name; if (msg<=15) name = msgs[msg]; if (parentOpt==0) Log(Warning) << "Option " << childOpt << " is not allowed directly in " << name << " message. Ignoring." << LogEnd; else Log(Warning) << "Option " << childOpt << " is not allowed in the " << parentOpt << " in the " << name << " message. Ignoring." << LogEnd; } /** * creates message, based on a received buffer * * @param iface * @param addr * @param buf * @param bufSize */ TClntMsg::TClntMsg(int iface, SPtr addr, char* buf, int bufSize) :TMsg(iface, addr, buf, bufSize) { setDefaults(); //After reading message code and transactionID //read options contained in message int pos=0; SPtr ptr; while (posbufSize) { Log(Error) << "Message " << MsgType << " truncated. There are " << (bufSize-pos) << " bytes left to parse. Bytes ignored." << LogEnd; break; } unsigned short code = readUint16(buf+pos); pos += sizeof(uint16_t); unsigned short length = readUint16(buf+pos); pos += sizeof(uint16_t); if (pos+length>bufSize) { Log(Error) << "Invalid option (type=" << code << ", len=" << length << " received (msgtype=" << MsgType << "). Message dropped." << LogEnd; IsDone = true; return; } if (!allowOptInMsg(MsgType,code)) { this->invalidAllowOptInMsg(MsgType, code); pos+=length; continue; } if (!allowOptInOpt(MsgType,0,code)) { this->invalidAllowOptInOpt(MsgType, 0, code); pos+=length; continue; } ptr.reset(); switch (code) { case OPTION_CLIENTID: case OPTION_SERVERID: ptr = new TOptDUID(code, buf+pos, length, this); break; case OPTION_IA_NA: ptr = new TClntOptIA_NA(buf+pos, length, this); break; case OPTION_IA_PD: ptr = new TClntOptIA_PD(buf+pos, length, this); break; case OPTION_ORO: ptr = new TClntOptOptionRequest(buf+pos, length, this); break; case OPTION_PREFERENCE: ptr = new TClntOptPreference(buf+pos, length, this); break; case OPTION_ELAPSED_TIME: ptr = new TClntOptElapsed(buf+pos, length, this); break; case OPTION_UNICAST: ptr = new TOptAddr(OPTION_UNICAST, buf+pos, length, this); break; case OPTION_STATUS_CODE: ptr = new TClntOptStatusCode(buf+pos, length, this); break; case OPTION_RAPID_COMMIT: ptr = new TOptEmpty(code, buf+pos, length, this); break; case OPTION_NIS_SERVERS: case OPTION_NISP_SERVERS: case OPTION_DNS_SERVERS: case OPTION_SNTP_SERVERS: case OPTION_SIP_SERVER_A: ptr = new TOptAddrLst(code, buf+pos, length, this); break; case OPTION_DOMAIN_LIST: case OPTION_SIP_SERVER_D: case OPTION_NIS_DOMAIN_NAME: case OPTION_NISP_DOMAIN_NAME: ptr = new TOptDomainLst(code, buf+pos, length, this); break; case OPTION_NEW_TZDB_TIMEZONE: ptr = new TClntOptTimeZone(buf+pos, length, this); break; case OPTION_FQDN: ptr = new TClntOptFQDN(buf+pos, length, this); break; case OPTION_INFORMATION_REFRESH_TIME: ptr = new TClntOptLifetime(buf+pos, length, this); break; case OPTION_AFTR_NAME: ptr = new TOptDomainLst(code, buf+pos, length, this); break; case OPTION_IA_TA: { ptr = new TClntOptTA(buf+pos, length, this); break; } #ifndef MOD_DISABLE_AUTH case OPTION_AUTH: if (ClntCfgMgr().getAuthProtocol() == AUTH_PROTO_DIBBLER) { DigestType_ = ClntCfgMgr().getDigest(); } ptr = new TOptAuthentication(buf+pos, length, this); break; #endif case OPTION_VENDOR_OPTS: { ptr = new TOptVendorSpecInfo(code, buf+pos, length, this); break; } case OPTION_RECONF_MSG: { ptr = new TOptReconfigureMsg(buf+pos, length, this); break; } case OPTION_RECONF_ACCEPT: { ptr = new TOptEmpty(OPTION_RECONF_ACCEPT, buf+pos, length, this); break; } case OPTION_NEXT_HOP: { ptr = new TOptAddr(code, buf+pos, length, this); break; } case OPTION_RTPREFIX: { ptr = new TOptRtPrefix(buf+pos, length, this); break; } case OPTION_USER_CLASS: case OPTION_VENDOR_CLASS: case OPTION_RELAY_MSG: case OPTION_INTERFACE_ID: Log(Warning) << "Option " << code<< " in message " << MsgType << " is not supported." << LogEnd; break; default: ptr = parseExtraOption(buf+pos, code, length); if (!ptr) { Log(Warning) << "Unknown option: " << code << ", length=" << length << ". Ignored." << LogEnd; pos+=length; continue; } } if ( (ptr) && (ptr->isValid()) ) { Options.push_back( ptr ); } else { Log(Warning) << "Option " << code << " is invalid. Ignoring." << LogEnd; } pos+=length; } SPtr optSrvID = (Ptr*)this->getOption(OPTION_SERVERID); if (!optSrvID) { Log(Warning) << "Message " << this->MsgType << " does not contain SERVERID option. Ignoring." << LogEnd; this->IsDone = true; return; } // @todo: confirm verification here } SPtr TClntMsg::parseExtraOption(const char *buf, unsigned int code, unsigned int length) { SPtr ptr; SPtr cfgIface = TClntCfgMgr::instance().getIface(Iface); TClntCfgIface::TOptionStatusLst ExtraOpts = cfgIface->getExtraOptions(); for (TClntCfgIface::TOptionStatusLst::iterator exp = ExtraOpts.begin(); exp != ExtraOpts.end(); ++exp) { if (code != (*exp)->OptionType) continue; stringstream tmp; tmp << "Received expected extra option: type=" << code << ", size=" << length << ", layout="; switch ( (*exp)->Layout) { case TOpt::Layout_Addr: { ptr = new TOptAddr(code, buf, length, this); Log(Info) << tmp.str() << "single-address" << LogEnd; break; } case TOpt::Layout_AddrLst: { ptr = new TOptAddrLst(code, buf, length, this); Log(Info) << tmp.str() << "list-of-addesses" << LogEnd; break; } case TOpt::Layout_String: { ptr = new TOptString(code, buf, length, this); Log(Info) << tmp.str() << "single string" << LogEnd; break; } case TOpt::Layout_StringLst: { ptr = new TOptDomainLst(code, buf, length, this); Log(Info) << tmp.str() << "list-of-strings" << LogEnd; break; } case TOpt::Layout_Generic: default: { ptr = new TOptGeneric(code, buf, length, this); Log(Info) << tmp.str() << "generic" << LogEnd; break; } } } return ptr; } TClntMsg::TClntMsg(int iface, SPtr addr, int msgType) :TMsg(iface,addr,msgType) { setDefaults(); } TClntMsg::~TClntMsg() { } void TClntMsg::setDefaults() { FirstTimeStamp = time(NULL); LastTimeStamp = time(NULL); RC = 0; RT = 0; IRT = 0; MRT = 0; MRC = 0; MRD = 0; #ifndef MOD_DISABLE_AUTH DigestType_ = ClntCfgMgr().getDigest(); #endif /// @todo: This should be moved to TMsg PeerAddr_.reset(); } unsigned long TClntMsg::getTimeout() { long diff = (LastTimeStamp+RT) - time(NULL); return (diff<0) ? 0 : diff; } void TClntMsg::send() { char* pkt = new char[getSize()]; srand((uint32_t)time(NULL)); if (!RC) RT=(int)(0.5+IRT+IRT*(0.2*(double)rand()/(double)RAND_MAX-0.1)); else RT =(int)(0.5+2.0*RT+RT*(0.2*(double)rand()/(double)RAND_MAX-0.1)); if (MRT != 0 && RT>MRT) RT = (int)(0.5+MRT + MRT*(0.2*(double)rand()/(double)RAND_MAX-0.1)); if ((MRD != 0) && (RT>MRD)) RT = MRD; if (MRD) MRD -= RT; RC++; this->storeSelf(pkt); SPtr ptrIface = ClntIfaceMgr().getIfaceByID(Iface); if (!ptrIface) { Log(Error) << "Unable to find interface with ifindex=" << Iface << ". Message not sent." << LogEnd; delete [] pkt; return; } if (PeerAddr_) { Log(Debug) << "Sending " << this->getName() << "(opts:"; SPtr opt; firstOption(); while (opt=getOption()) { Log(Cont) << opt->getOptType() << " "; } Log(Cont) << ") on " << ptrIface->getName() << "/" << Iface << " to unicast addr " << *PeerAddr_ << "." << LogEnd; ClntIfaceMgr().sendUnicast(Iface,pkt,getSize(),PeerAddr_); } else { Log(Debug) << "Sending " << this->getName() << "(opts:"; SPtr opt; firstOption(); while (opt=getOption()) { Log(Cont) << opt->getOptType() << " "; } Log(Cont) << ") on " << ptrIface->getName() << "/" << Iface << " to multicast." << LogEnd; ClntIfaceMgr().sendMulticast(Iface, pkt, getSize()); } LastTimeStamp = time(NULL); delete [] pkt; } void TClntMsg::copyAAASPI(SPtr q) { SPI_ = q->SPI_; AuthKey_ = q->AuthKey_; } void TClntMsg::setIface(int iface) { this->Iface = iface; SPtr opt; firstOption(); while ( opt = getOption() ) { switch ( opt->getOptType() ) { case OPTION_IA_NA: { SPtr ia = (Ptr*) opt; ia->setIface(iface); break; } case OPTION_IA_TA: { SPtr ta = (Ptr*) opt; ta->setIface(iface); break; } default: continue; } } } /** * @brief appends authentication option. * */ void TClntMsg::appendAuthenticationOption() { #ifndef MOD_DISABLE_AUTH uint8_t algorithm = 0; // algorithm is protocol specific DigestType_ = DIGEST_NONE; // ClntAddrMgr().firstClient(); // SPtr client = ClntAddrMgr().getClient(); string realm; switch (ClntCfgMgr().getAuthProtocol()) { case AUTH_PROTO_NONE: { algorithm = 0; // Do not sent AUTH with proto=0. return; } case AUTH_PROTO_DELAYED: { algorithm = 1; realm = ClntCfgMgr().getAuthRealm(); break; } case AUTH_PROTO_RECONFIGURE_KEY: { // RFC 3315, section 21.5.1 // When reconfigure-key is enabled, client does not send anything return; } case AUTH_PROTO_DIBBLER: { // Mechanism proposed by Kowalczuk DigestType_ = ClntCfgMgr().getDigest(); algorithm = static_cast(DigestType_); setSPI(ClntCfgMgr().getSPI()); SPtr optORO = (Ptr*) getOption(OPTION_ORO); if (optORO) { // request Authentication optORO->addOption(OPTION_AUTH); } break; } default: { Log(Error) << "Auth: Invalid protocol specified. Can't sent AUTH option." << LogEnd; return; } } SPtr auth = new TOptAuthentication(ClntCfgMgr().getAuthProtocol(), algorithm, ClntCfgMgr().getAuthReplay(), this); // Realm is used by delayed-auth only. Even fro delayed-auth, it is set // only for non-SOLICIT messages if (MsgType != SOLICIT_MSG && !realm.empty()) { auth->setRealm(realm); } // replay detection if (ClntCfgMgr().getAuthReplay() == AUTH_REPLAY_MONOTONIC) { auth->setReplayDetection(ClntAddrMgr().getNextReplayDetectionValue()); } addOption((Ptr*)auth); // otherwise replay value is zero #endif } void TClntMsg::appendElapsedOption() { // include ELAPSED option if (!getOption(OPTION_ELAPSED_TIME)) Options.push_back(new TClntOptElapsed(this)); } /* CHANGED in this function: According to RFC3315,'status==STATE_NOTCONFIGURED' is not a must. * this method adds requested (which have status==STATE_NOTCONFIGURED) options */ void TClntMsg::appendRequestedOptions() { // find configuration specified in config file SPtr iface = ClntCfgMgr().getIface(this->Iface); if (!iface) { Log(Error) << "Unable to find interface with ifindex=" << this->Iface << LogEnd; return; } if ( (MsgType==SOLICIT_MSG || MsgType==REQUEST_MSG) && ClntCfgMgr().getReconfigure()) { SPtr optReconfigure = new TOptEmpty(OPTION_RECONF_ACCEPT, this); Options.push_back( (Ptr*) optReconfigure); } SPtr optORO = new TClntOptOptionRequest(iface, this); if (iface->getUnicast()) { optORO->addOption(OPTION_UNICAST); Log(Debug) << "Adding UNICAST to ORO." << LogEnd; } if (ClntCfgMgr().addInfRefreshTime()) { optORO->addOption(OPTION_INFORMATION_REFRESH_TIME); Log(Debug) << "Adding INFORMATION REFRESH TIME to ORO." << LogEnd; } // --- option: DNS-SERVERS --- if ( iface->isReqDNSServer() ) { optORO->addOption(OPTION_DNS_SERVERS); List(TIPv6Addr) * dnsLst = iface->getProposedDNSServerLst(); if (dnsLst->count()) { // if there are any hints specified in config file, include them Options.push_back( new TOptAddrLst(OPTION_DNS_SERVERS, *dnsLst, this) ); } iface->setDNSServerState(STATE_INPROCESS); } // --- option: DOMAINS -- if ( iface->isReqDomain() ) { optORO->addOption(OPTION_DOMAIN_LIST); List(string) * domainsLst = iface->getProposedDomainLst(); if ( domainsLst->count() ) { // if there are any hints specified in config file, include them Options.push_back( new TOptDomainLst(OPTION_DOMAIN_LIST, *domainsLst, this)); } iface->setDomainState(STATE_INPROCESS); } // --- option: NTP SERVER --- if ( iface->isReqNTPServer() ) { optORO->addOption(OPTION_SNTP_SERVERS); List(TIPv6Addr) * ntpLst = iface->getProposedNTPServerLst(); if (ntpLst->count()) { // if there are any hints specified in config file, include them Options.push_back( new TOptAddrLst(OPTION_SNTP_SERVERS, *ntpLst, this) ); } iface->setNTPServerState(STATE_INPROCESS); } // --- option: TIMEZONE --- if ( iface->isReqTimezone() ) { optORO->addOption(OPTION_NEW_TZDB_TIMEZONE); string timezone = iface->getProposedTimezone(); if (timezone.length()) { // if there are any hints specified in config file, include them SPtr opt = new TClntOptTimeZone(timezone,this); Options.push_back( (Ptr*)opt ); } iface->setTimezoneState(STATE_INPROCESS); } // --- option: SIP-SERVERS --- if ( iface->isReqSIPServer() ) { optORO->addOption(OPTION_SIP_SERVER_A); List(TIPv6Addr) * lst = iface->getProposedSIPServerLst(); if ( lst->count()) { // if there are any hints specified in config file, include them Options.push_back( new TOptAddrLst(OPTION_SIP_SERVER_A, *lst, this ) ); } iface->setSIPServerState(STATE_INPROCESS); } // --- option: SIP-DOMAINS --- if ( iface->isReqSIPDomain() ) { optORO->addOption(OPTION_SIP_SERVER_D); List(string) * domainsLst = iface->getProposedSIPDomainLst(); if ( domainsLst->count() ) { // if there are any hints specified in config file, include them Options.push_back( new TOptDomainLst(OPTION_SIP_SERVER_D, *domainsLst, this )); } iface->setSIPDomainState(STATE_INPROCESS); } // --- option: FQDN --- if ( iface->isReqFQDN() ) { optORO->addOption(OPTION_FQDN); string fqdn = iface->getProposedFQDN(); { SPtr opt = new TClntOptFQDN( fqdn,this ); opt->setSFlag(ClntCfgMgr().getFQDNFlagS()); Options.push_back( (Ptr*)opt ); } iface->setFQDNState(STATE_INPROCESS); } // --- option: NIS-SERVERS --- if ( iface->isReqNISServer() ) { optORO->addOption(OPTION_NIS_SERVERS); List(TIPv6Addr) * lst = iface->getProposedNISServerLst(); if ( lst->count() ) { // if there are any hints specified in config file, include them Options.push_back( new TOptAddrLst(OPTION_NIS_SERVERS, *lst, this )); } iface->setNISServerState(STATE_INPROCESS); } // --- option: NIS-DOMAIN --- if ( iface->isReqNISDomain() ) { optORO->addOption(OPTION_NIS_DOMAIN_NAME); string domain = iface->getProposedNISDomain(); if (domain.length()) { Options.push_back( new TOptDomainLst(OPTION_NIS_DOMAIN_NAME, domain, this) ); } iface->setNISDomainState(STATE_INPROCESS); } // --- option: NIS+-SERVERS --- if ( iface->isReqNISPServer() ) { optORO->addOption(OPTION_NISP_SERVERS); List(TIPv6Addr) * lst = iface->getProposedNISPServerLst(); if ( lst->count() ) { // if there are any hints specified in config file, include them Options.push_back( new TOptAddrLst(OPTION_NISP_SERVERS, *lst, this) ); } iface->setNISPServerState(STATE_INPROCESS); } // --- option: NIS+-DOMAIN --- if ( iface->isReqNISPDomain() ) { optORO->addOption(OPTION_NISP_DOMAIN_NAME); string domain = iface->getProposedNISPDomain(); if (domain.length()) { Options.push_back( new TOptDomainLst(OPTION_NISP_DOMAIN_NAME, domain, this) ); } iface->setNISPDomainState(STATE_INPROCESS); } // --- option: Prefix Delegation --- // prefix delegation is supported in a similar way to IA and TA // see ClntTransMgr::checkSolicit() for details // --- option: LIFETIME --- if ( iface->isReqLifetime() && (this->MsgType == INFORMATION_REQUEST_MSG) && optORO->count() ) optORO->addOption(OPTION_INFORMATION_REFRESH_TIME); // --- option: VENDOR-SPEC --- if ( iface->isReqVendorSpec() ) { optORO->addOption(OPTION_VENDOR_OPTS); iface->setVendorSpecState(STATE_INPROCESS); SPtr optVendor; iface->firstVendorSpec(); while (optVendor = iface->getVendorSpec()) { Options.push_back( (Ptr*) optVendor); } } // --- option: Routing --- if ( (this->MsgType == SOLICIT_MSG || this->MsgType == REQUEST_MSG || this->MsgType == RENEW_MSG || this->MsgType == REBIND_MSG || this->MsgType == INFORMATION_REQUEST_MSG) && iface->isRoutingEnabled() ) { optORO->addOption(OPTION_NEXT_HOP); optORO->addOption(OPTION_RTPREFIX); // only for debugging Log(Debug) << "Adding NEXT_HOP and RTPREFIX to ORO." << LogEnd; } // --- option: ADDRPARAMS --- SPtr ia; iface->firstIA(); bool addrParams = false; while (ia = iface->getIA()) { if (ia->getAddrParams()) addrParams = true; } if (addrParams) optORO->addOption(OPTION_ADDRPARAMS); appendElapsedOption(); // --- generic options --- TClntCfgIface::TOptionStatusLst& genericOpts = iface->getExtraOptions(); for (TClntCfgIface::TOptionStatusLst::iterator gen = genericOpts.begin(); gen!=genericOpts.end(); ++gen) { if ( (*gen)->State == STATE_NOTCONFIGURED || (*gen)->State == STATE_INPROCESS || (*gen)->State == STATE_CONFIRMME) { optORO->addOption( (*gen)->OptionType); if ( (*gen)->Option && (*gen)->Always) Options.push_back( (*gen)->Option ); } } #ifdef MOD_REMOTE_AUTOCONF if (ClntCfgMgr().getRemoteAutoconf()) optORO->addOption(OPTION_NEIGHBORS); #endif // final setup: Did we add any options at all? if ( optORO->count() ) Options.push_back( (Ptr*) optORO ); } /** * append all TA options, which are currently in the STATE_NOTCONFIGURED state. * * @param switchToInProcess - switch them to STATE_INPROCESS state? */ void TClntMsg::appendTAOptions(bool switchToInProcess) { SPtr ptrIface; SPtr ptrTA; ClntCfgMgr().firstIface(); // for each interface... while ( ptrIface = ClntCfgMgr().getIface() ) { ptrIface->firstTA(); // ... find TA... while ( ptrTA = ptrIface->getTA() ) { if (ptrTA->getState()!=STATE_NOTCONFIGURED) continue; // ... which are not yet configured SPtr ptrOpt = new TClntOptTA(ptrTA->getIAID(), this); Options.push_back ( (Ptr*) ptrOpt); Log(Debug) << "TA option (IAID=" << ptrTA->getIAID() << ") was added." << LogEnd; if (switchToInProcess) ptrTA->setState(STATE_INPROCESS); } } } bool TClntMsg::appendClientID() { SPtr ptr; ptr = new TOptDUID(OPTION_CLIENTID, ClntCfgMgr().getDUID(), this ); Options.push_back( ptr ); return true; } bool TClntMsg::check(bool clntIDmandatory, bool srvIDmandatory) { bool status = TMsg::check(clntIDmandatory, srvIDmandatory); SPtr clnID; if ( (clnID=(Ptr*)getOption(OPTION_CLIENTID)) && !( *(clnID->getDUID())==(*(ClntCfgMgr().getDUID())) ) ) { Log(Warning) << "Message " << this->getName() << " received with mismatched ClientID option. Message dropped." << LogEnd; return false; } return status; } /** * method is used to process received REPLY message (as an answer for REQUEST or * as an answer for SOLICIT with RAPID COMMIT option) * * @param reply */ void TClntMsg::answer(SPtr reply) { SPtr ptrDUID; ptrDUID = (Ptr*) reply->getOption(OPTION_SERVERID); if (!ptrDUID) { Log(Warning) << "Received REPLY message without SERVER ID option. Message ignored." << LogEnd; return; } SPtr duid = ptrDUID->getDUID(); SPtr iface = (Ptr*)ClntIfaceMgr().getIfaceByID(getIface()); if (!iface) { Log(Error) << "Unable to find physical interface with ifindex=" << getIface() << LogEnd; return; } SPtr cfgIface = ClntCfgMgr().getIface( getIface() ); if (!cfgIface) { Log(Error) << "Unable to find configuration interface with ifindex=" << getIface() << LogEnd; } // analyse all options received SPtr option; // Check authentication first. If the checks fail, we need to drop the whole message // without using its contents. if (!reply->checkReceivedAuthOption()) { Log(Warning) << "AUTH: AUTH option verification failed. Ignoring message." << LogEnd; return; } // find ORO in received options SPtr optORO = (Ptr*) this->getOption(OPTION_ORO); reply->firstOption(); while (option = reply->getOption() ) { if (optORO) optORO->delOption(option->getOptType()); // delete received option from ORO switch (option->getOptType()) { case OPTION_IA_NA: { SPtr clntOpt = (Ptr*)option; if (clntOpt->getStatusCode()!=STATUSCODE_SUCCESS) { Log(Warning) << "Received IA (IAID=" << clntOpt->getIAID() << ") with non-success status:" << clntOpt->getStatusCode() << ", IA ignored." << LogEnd; break; } // configure received IA clntOpt->setContext(duid, SPtr()/* srvAddr used is unicast */, this->Iface); clntOpt->doDuties(); // delete that IA from request list for (TOptList::iterator requestOpt = Options.begin(); requestOpt!=Options.end(); ++requestOpt) { if ( (*requestOpt)->getOptType()!=OPTION_IA_NA) continue; SPtr ptrIA = (Ptr*) (*requestOpt); if ( ptrIA->getIAID() == clntOpt->getIAID() ) { requestOpt = Options.erase(requestOpt); break; } } // delete request for IA, if it was mentioned in Option Request if ( optORO && optORO->isOption(OPTION_IA_NA) ) optORO->delOption(OPTION_IA_NA); break; } case OPTION_IA_TA: { SPtr ta = (Ptr*) option; if (ta->getStatusCode()!=STATUSCODE_SUCCESS) { Log(Warning) << "Received TA (IAID=" << ta->getIAID() << ") with non-success status:" << ta->getStatusCode() << ", TA ignored." << LogEnd; break; } SPtr requestOpt; // delete that TA from request list for (TOptList::iterator requestOpt = Options.begin(); requestOpt!=Options.end(); ++requestOpt) { if ( (*requestOpt)->getOptType()!=OPTION_IA_TA) continue; SPtr ptrTA = (Ptr*) (*requestOpt); if ( ta->getIAID() == ptrTA->getIAID() ) { requestOpt = Options.erase(requestOpt); break; } } ta->setIface(Iface); ta->doDuties(); break; } case OPTION_IA_PD: { SPtr pd = (Ptr*) option; if (pd->getStatusCode()!=STATUSCODE_SUCCESS) { Log(Warning) << "Received PD (PDAID=" << pd->getIAID() << ") with non-success status:" << pd->getStatusCode() << ", PD ignored." << LogEnd; break; } if (!pd->getOption(OPTION_IAPREFIX)) { Log(Notice) << "Received IA_PD without prefixes, ignoring." << LogEnd; break; } bool pdOk = true; int prefixCount = pd->countPrefixes(); pd->firstPrefix(); SPtr ppref; while (ppref = pd->getPrefix()) { if (!ppref->isValid()) { Log(Warning) << "Option IA_PREFIX from IA_PD " << pd->getIAID() << " is not valid." << LogEnd; // RFC 3633, section 10: // A requesting router discards any prefixes for which the // preferred lifetime is greater than the valid lifetime. pd->deletePrefix(ppref); prefixCount--; if (!prefixCount) { // ia_pd hasn't got any valid prefixes. if (ClntCfgMgr().insistMode()) { // if insist-mode is enabled and one of received // pd's has no valid prefixes, answer is rejected. pdOk = false; } break; } } } if (!pdOk) { break; } // configure received PD pd->setContext(duid, SPtr()/* srvAddr used in unicast */, this); pd->doDuties(); // delete that PD from request list for (TOptList::iterator requestOpt = Options.begin(); requestOpt!=Options.end(); ++requestOpt) { if ( (*requestOpt)->getOptType()!=OPTION_IA_PD) continue; SPtr reqPD = (Ptr*) (*requestOpt); if ( pd->getIAID() == reqPD->getIAID() ) { requestOpt = Options.erase(requestOpt); break; } } // delete request for PD, if it was mentioned in Option Request if ( optORO && optORO->isOption(OPTION_IA_PD) ) optORO->delOption(OPTION_IA_PD); break; } case OPTION_DNS_SERVERS: { SPtr dnsservers = (Ptr*) option; cfgIface->setDNSServerState(STATE_CONFIGURED); iface->setDNSServerLst(duid, reply->getRemoteAddr(), dnsservers->getAddrLst()); break; } case OPTION_NIS_SERVERS: { SPtr nisservers = (Ptr*) option; cfgIface->setNISServerState(STATE_CONFIGURED); iface->setNISServerLst(duid, reply->getRemoteAddr(), nisservers->getAddrLst()); break; } case OPTION_NISP_SERVERS: { SPtr nispservers = (Ptr*) option; cfgIface->setNISPServerState(STATE_CONFIGURED); iface->setNISPServerLst(duid, reply->getRemoteAddr(), nispservers->getAddrLst()); break; } case OPTION_SNTP_SERVERS: { SPtr ntpservers = (Ptr*) option; cfgIface->setNTPServerState(STATE_CONFIGURED); iface->setNTPServerLst(duid, reply->getRemoteAddr(), ntpservers->getAddrLst()); break; } case OPTION_SIP_SERVER_A: { SPtr sipservers = (Ptr*) option; cfgIface->setSIPServerState(STATE_CONFIGURED); iface->setSIPServerLst(duid, reply->getRemoteAddr(), sipservers->getAddrLst()); break; } case OPTION_DOMAIN_LIST: { SPtr domains = (Ptr*) option; cfgIface->setDomainState(STATE_CONFIGURED); iface->setDomainLst(duid, reply->getRemoteAddr(), domains->getDomainLst() ); break; } case OPTION_SIP_SERVER_D: { SPtr sipdomains = (Ptr*) option; cfgIface->setSIPDomainState(STATE_CONFIGURED); iface->setSIPDomainLst(duid, reply->getRemoteAddr(), sipdomains->getDomainLst() ); break; } case OPTION_NIS_DOMAIN_NAME: { SPtr nisdomain = (Ptr*) option; List(string) domains = nisdomain->getDomainLst(); if (domains.count() == 1) { cfgIface->setNISDomainState(STATE_CONFIGURED); iface->setNISDomain(duid, reply->getRemoteAddr(), nisdomain->getDomain()); } else { Log(Warning) << "Malformed NIS Domain option received. " << domains.count() << " domain(s) received, expected exactly 1." << LogEnd; cfgIface->setNISDomainState(STATE_FAILED); } break; } case OPTION_NISP_DOMAIN_NAME: { SPtr nispdomain = (Ptr*) option; List(string) domains = nispdomain->getDomainLst(); if (domains.count() == 1) { cfgIface->setNISPDomainState(STATE_CONFIGURED); iface->setNISPDomain(duid, reply->getRemoteAddr(), nispdomain->getDomain()); } else { Log(Warning) << "Malformed NIS+ Domain option received. " << domains.count() << " domain(s) received, expected exactly 1." << LogEnd; cfgIface->setNISDomainState(STATE_FAILED); } break; } #ifdef MOD_REMOTE_AUTOCONF case OPTION_NEIGHBORS: { SPtr neighbors = (Ptr*) option; ClntTransMgr().updateNeighbors(reply->getIface(), neighbors); break; } #endif case OPTION_IAADDR: Log(Warning) << "Option OPTION_IAADDR misplaced." << LogEnd; break; default: { SPtr requestOpt; if ( optORO && (optORO->isOption(option->getOptType())) ) optORO->delOption(option->getOptType()); //Log(Debug) << "Setting up option " << option->getOptType() << "." << LogEnd; if (!option->doDuties()) { Log(Warning) << "Setting option " << option->getOptType() << " failed." << LogEnd; // do nothing about it } // find options specified in this message firstOption(); while ( requestOpt = getOption() ) { if ( requestOpt->getOptType() == option->getOptType() ) { delOption(requestOpt->getOptType()); }//if }//while } } // switch } //Options and IAs serviced by server are removed from requestOptions list SPtr requestOpt; firstOption(); bool iaLeft = false; bool taLeft = false; bool pdLeft = false; while ( requestOpt = getOption() ) { if (requestOpt->getOptType() == OPTION_IA_NA) iaLeft = true; if (requestOpt->getOptType() == OPTION_IA_TA) taLeft = true; if (requestOpt->getOptType() == OPTION_IA_PD) pdLeft = true; } // taLeft = false; if (iaLeft || taLeft || pdLeft) { // send new Request to another server Log(Notice) << "There are still " << (iaLeft?"some IA(s)":"") << (taLeft?"TA":"") << (pdLeft?"some PD(s)":"") << " to configure." << LogEnd; ClntTransMgr().sendRequest(this->Options, this->Iface); } else { if (optORO) optORO->delOption(OPTION_ADDRPARAMS); // don't insist on getting ADDR-PARAMS if ( optORO && (optORO->count()) ) { Log(Warning) << "All IA(s), TA and PD(s) has been configured, but some options ("; for (int i=0; i< optORO->count(); i++) Log(Cont) << optORO->getReqOpt(i) << " "; Log(Cont) << ") were not assigned." << LogEnd; if (ClntCfgMgr().insistMode()) { Log(Notice) << "Insist-mode enabled, sending INF-REQUEST." << LogEnd; ClntTransMgr().sendInfRequest(this->Options, this->Iface); } else { Log(Notice) << "Insist-mode disabled, giving up (not sending INF-REQUEST)." << LogEnd; /// @todo: set proper options to FAILED state } } } IsDone = true; return; } bool TClntMsg::checkReceivedAuthOption() { #ifdef MOD_DISABLE_AUTH return true; #else // Note that this method does not verify digests. That is verified elsewhere // see TMsg::validateAuthInfo() from TClntIfaceMgr::select() and from // TSrvIfaceMgr::select() // This method checks additional things. // If replay detection fails, we don't bother to try anything fancy if (!validateReplayDetection()) { return false; } switch (ClntCfgMgr().getAuthProtocol()) { case AUTH_PROTO_NONE: { return true; } case AUTH_PROTO_DELAYED: { SPtr auth = (Ptr*)getOption(OPTION_AUTH); if (!auth) { return false; } if (auth->getProto() != AUTH_PROTO_DELAYED) { Log(Warning) << "AUTH: Bad protocol in auth: expected 2(delayed-auth), but got " << int(auth->getProto()) << ", auth option ignored." << LogEnd; return false; } if (auth->getAlgorithm() != 1) { Log(Warning) << "AUTH: Bad algorithm in auth option: expected 1 (HMAC-MD5), but got " << int(auth->getAlgorithm()) << ", key ignored." << LogEnd; return false; } if (auth->getRDM() != AUTH_REPLAY_NONE) { Log(Warning) << "AUTH: Bad replay detection method (RDM) value: expected 0," << ", but got " << auth->getRDM() << LogEnd; // This is small issue enough, so we can continue. } return true; } case AUTH_PROTO_RECONFIGURE_KEY: { bool optional = (MsgType != RECONFIGURE_MSG); SPtr auth = (Ptr*)getOption(OPTION_AUTH); if (!auth) { // there's no auth option. We can't store anything return optional; } if (auth->getProto() != AUTH_PROTO_RECONFIGURE_KEY) { Log(Warning) << "AUTH: Bad protocol in auth: expected 3(reconfigure-key), but got " << auth->getProto() << ", key ignored." << LogEnd; return optional; } if (auth->getAlgorithm() != 1) { Log(Warning) << "AUTH: Bad algorithm in auth option: expected 1, but got " << auth->getAlgorithm() << ", key ignored." << LogEnd; return optional; } if (auth->getRDM() != AUTH_REPLAY_NONE) { Log(Warning) << "AUTH: Bad replay detection method (RDM) value: expected 0," << ", but got " << auth->getRDM() << LogEnd; // This is small issue enough, so we can continue. } vector key; auth->getPayload(key); if (key.size() != RECONFIGURE_KEY_AUTHINFO_SIZE) { Log(Warning) << "AUTH: Invalid authentication information length, expected " << RECONFIGURE_KEY_AUTHINFO_SIZE << "(1 for type, 16 for reconfigure-key value), got " << key.size() << LogEnd; return optional; } switch (MsgType) { case RECONFIGURE_MSG: { /// @todo calculate HMAC-MD5 checksum and compare it against stored key Log(Error) << "Support for reconfigure-key in RECONFIGURE message not implementd yet." << LogEnd; return false; } case REPLY_MSG: { if (key[0] != 1) { // see RFC3315, section 21.5.1 Log(Warning) << "AUTH: Invalid type " << key[0] << " in AUTH for reconfigure-key" << " protocol, expected 1, key ingored." << LogEnd; return true; } key.erase(key.begin()); // delete first octect (it is type 1) // Store the reconfigure-key ClntAddrMgr().firstClient(); SPtr client = ClntAddrMgr().getClient(); if (!client) { Log(Crit) << "Auth: internal error. Info about this client (myself) is not found." << LogEnd; return false; } client->ReconfKey_ = key; Log(Info) << "AUTH: Received reconfigure-key " << hexToText(key, true, false) << LogEnd; return true; } default: Log(Warning) << "AUTH: AUTH option not expected in message " << MsgType << LogEnd; return true; } } case AUTH_PROTO_DIBBLER: { return true; } } #endif return false; } void TClntMsg::getReconfKeyFromAddrMgr() { ClntAddrMgr().firstClient(); SPtr client = ClntAddrMgr().getClient(); if (!client) { Log(Crit) << "Auth: internal error. Info about this client (myself) is not found." << LogEnd; return; } AuthKey_ = client->ReconfKey_; } bool TClntMsg::validateReplayDetection() { #ifdef MOD_DISABLE_AUTH return true; #else if (ClntCfgMgr().getAuthReplay() == AUTH_REPLAY_NONE) { // we don't care about replay detection return true; } // get the client's (ours) information ClntAddrMgr().firstClient(); SPtr client = ClntAddrMgr().getClient(); if (!client) { Log(Crit) << "Auth: internal error. Info about this client (myself) is not found." << LogEnd; return false; } SPtr auth = (Ptr*)getOption(OPTION_AUTH); if (!auth) { // there's no auth option. We can't protect against replays return true; } uint64_t received = auth->getReplayDetection(); uint64_t last_received = client->getReplayDetectionRcvd(); if (last_received < received) { Log(Debug) << "Auth: Replay detection field should be greater than " << last_received << " and it actually is (" << received << ")" << LogEnd; client->setReplayDetectionRcvd(received); return true; } else { Log(Warning) << "Auth: Replayed message detected: previously received: " << last_received << ", now received " << received << LogEnd; return false; } return true; // not really needed #endif } void TClntMsg::deletePD(SPtr pd_) { SPtr pd = (Ptr*) pd_; for (TOptList::iterator opt = Options.begin(); opt != Options.end(); ++opt) { if ( (*opt)->getOptType() != OPTION_IA_PD) continue; SPtr delPD = (Ptr*) (*opt); if ( pd->getIAID() == delPD->getIAID() ) { opt = Options.erase(opt); break; } } } dibbler-1.0.1/ClntMessages/ClntMsgSolicit.h0000664000175000017500000000200512233256142015473 00000000000000/* * Dibbler - a portable DHCPv6 * * authors: Tomasz Mrugalski * Marek Senderski * changes: Krzysztof Wnuk * released under GNU GPL v2 only licence * * $Id: ClntMsgSolicit.h,v 1.7 2008-08-29 00:07:28 thomson Exp $ * */ class TClntIfaceMgr; #ifndef CLNTMSGSOLICIT_H #define CLNTMSGSOLICIT_H #include "ClntMsg.h" #include "ClntCfgMgr.h" #include "ClntCfgIA.h" class TClntMsgSolicit : public TClntMsg { public: TClntMsgSolicit(int iface, SPtr addr, List(TClntCfgIA) iaLst, SPtr ta, List(TClntCfgPD) pdLst, bool rapid=false, bool remoteAutoconf = false); void answer(SPtr msg); void doDuties(); bool shallRejectAnswer(SPtr msg); void sortAnswers(); std::string getName() const; bool check(); ~TClntMsgSolicit(); private: // method returns max. preference value of received ADVERTISE messages int getMaxPreference(); }; #endif dibbler-1.0.1/ClntMessages/Makefile.am0000644000175000017500000000162612277722750014501 00000000000000noinst_LIBRARIES = libClntMessages.a libClntMessages_a_CPPFLAGS = -I$(top_srcdir)/Misc -I$(top_srcdir)/Messages -I$(top_srcdir)/Options -I$(top_srcdir)/ClntOptions libClntMessages_a_CPPFLAGS += -I$(top_srcdir)/ClntIfaceMgr -I$(top_srcdir)/IfaceMgr -I$(top_srcdir)/ClntCfgMgr libClntMessages_a_CPPFLAGS += -I$(top_srcdir)/CfgMgr -I$(top_srcdir)/AddrMgr -I$(top_srcdir)/ClntAddrMgr libClntMessages_a_CPPFLAGS += -I$(top_srcdir)/ClntTransMgr -I$(top_srcdir)/poslib libClntMessages_a_SOURCES = ClntMsgAdvertise.cpp ClntMsgAdvertise.h ClntMsgConfirm.cpp ClntMsgConfirm.h ClntMsg.cpp ClntMsgDecline.cpp ClntMsgDecline.h ClntMsg.h ClntMsgInfRequest.cpp ClntMsgInfRequest.h ClntMsgRebind.cpp ClntMsgRebind.h ClntMsgRelease.cpp ClntMsgRelease.h ClntMsgRenew.cpp ClntMsgRenew.h ClntMsgReply.cpp ClntMsgReply.h ClntMsgRequest.cpp ClntMsgRequest.h ClntMsgSolicit.cpp ClntMsgSolicit.h ClntMsgReconfigure.cpp ClntMsgReconfigure.h dibbler-1.0.1/ClntMessages/ClntMsgReconfigure.cpp0000644000175000017500000000241712277722750016710 00000000000000/* * Dibbler - a portable DHCPv6 * * author: Grzegorz Pluto * changes: Tomasz Mrugalski * * released under GNU GPL v2 or later licence * */ #include #include "ClntMsgReconfigure.h" #include "OptInteger.h" #include "OptDUID.h" #include "OptReconfigureMsg.h" #include "DHCPConst.h" #include "Logger.h" /* * creates buffer based on buffer */ TClntMsgReconfigure::TClntMsgReconfigure(int iface, SPtr addr, char* buf, int buflen) :TClntMsg(iface,addr,buf,buflen) { } bool TClntMsgReconfigure::check() { /// @todo: check if reconfigure-message option is received, if not, drop the message SPtr reconfMsg = (Ptr*) getOption(OPTION_RECONF_MSG); if (!reconfMsg) { Log(Warning) << "Received Reconfigure message without mandatory reconfigure-message option. Dropped." << LogEnd; return false; } if (TransID != 0) { Log(Warning) << "Received Reconfigure message with non-zero transaction-id (" << TransID << "). Dropped" << LogEnd; return false; } return TClntMsg::check(true /* clientID mandatory */, true /* serverID mandatory */ ); } void TClntMsgReconfigure::doDuties() { } TClntMsgReconfigure::~TClntMsgReconfigure() { } dibbler-1.0.1/ClntMessages/ClntMsgRelease.cpp0000644000175000017500000001161012556514460016010 00000000000000/* * Dibbler - a portable DHCPv6 * * authors: Tomasz Mrugalski * Marek Senderski * changes: Krzysztof Wnuk * Michal Kowalczuk * * released under GNU GPL v2 only licence * */ #include "ClntMsgRelease.h" #include "DHCPConst.h" #include "SmartPtr.h" #include "Container.h" #include "AddrIA.h" #include "OptDUID.h" #include "ClntCfgMgr.h" #include "ClntOptIA_NA.h" #include "ClntOptTA.h" #include "ClntOptIA_PD.h" #include #include "Logger.h" #include "ClntAddrMgr.h" #include "AddrMgr.h" #include "AddrIA.h" #include "AddrAddr.h" using namespace std; /** * create RELEASE message * * @param iface * @param addr * @param iaLst - IA_NA list, which are served by on server on one link * @param ta - IA_TA to be released * @param pdLst - IA_PD list to be released */ TClntMsgRelease::TClntMsgRelease(int iface, SPtr addr, List(TAddrIA) iaLst, SPtr ta, List(TAddrIA) pdLst) :TClntMsg(iface, addr, RELEASE_MSG) { SPtr srvDUID; IRT=REL_TIMEOUT; MRT=0; MRC=REL_MAX_RC; MRD=0; RT=0; // obtain IA, TA or PD, so server DUID can be obtained SPtr x; if (iaLst.count()) { iaLst.first(); x = iaLst.get(); } if (!x) x = ta; if (!x) { pdLst.first(); x = pdLst.get(); } if (!x) { Log(Error) << "Unable to send RELEASE. No IA, TA or PD provided." << LogEnd; this->IsDone = true; return; } if (!x->getDUID()) { Log(Error) << "Unable to send RELEASE. Unable to find DUID. " << LogEnd; this->IsDone = true; return; } srvDUID = x->getDUID(); Options.push_back(new TOptDUID(OPTION_SERVERID, srvDUID,this)); Options.push_back(new TOptDUID(OPTION_CLIENTID, ClntCfgMgr().getDUID(),this)); // --- RELEASE IA --- iaLst.first(); while(x=iaLst.get()) { Options.push_back(new TClntOptIA_NA(x,this)); SPtr ptrAddr; SPtr ptrIface; ptrIface = (Ptr*)ClntIfaceMgr().getIfaceByID(x->getIfindex()); if (!ptrIface) { Log(Warning) << "Unable to find interface with ifindex " << x->getIfindex() << " while creating RELEASE." << LogEnd; continue; } x->firstAddr(); while (ptrAddr = x->getAddr()) { ptrIface->delAddr(ptrAddr->get(), ptrAddr->getPrefix()); } // --- DNS Update --- SPtr dns = x->getFQDNDnsServer(); if (dns) { string fqdn = ptrIface->getFQDN(); ClntIfaceMgr().fqdnDel(ptrIface, x, fqdn); } // --- DNS Update --- } // --- RELEASE TA --- if (ta) { Options.push_back(new TClntOptTA(ta, this)); SPtr ptrIface; ptrIface = (Ptr*)ClntIfaceMgr().getIfaceByID(ta->getIfindex()); if (ptrIface) { SPtr addr; ta->firstAddr(); while (addr = ta->getAddr()) { ptrIface->delAddr(addr->get(), addr->getPrefix()); } } else { Log(Warning) << "Unable to find interface with ifindex " << ta->getIfindex() << " while creating RELEASE." << LogEnd; } } // --- RELEASE PD --- SPtr pd; pdLst.first(); while(pd=pdLst.get()) { SPtr pdOpt = new TClntOptIA_PD(pd,this); Options.push_back( (Ptr*)pdOpt ); pdOpt->setContext(srvDUID, addr, this); pdOpt->delPrefixes(); ClntAddrMgr().delPD(pd->getIAID() ); } appendElapsedOption(); appendAuthenticationOption(); IsDone = false; send(); } void TClntMsgRelease::answer(SPtr rep) { SPtr rspSrvID = (Ptr*) rep->getOption(OPTION_SERVERID); SPtr msgSrvID = (Ptr*) getOption(OPTION_SERVERID); if (!rspSrvID) { Log(Warning) << "Received reply to RELEASE without SERVER-ID option." << LogEnd; } if (!msgSrvID) { Log(Error) << "Sent RELEASE did not contain SERVER-ID. That seems to be my fault. Sorry." << LogEnd; } if (rspSrvID && msgSrvID && (!(*msgSrvID->getDUID()==*rspSrvID->getDUID()))) { Log(Error) << "Internal error. RELEASE sent to server with DUID=" << msgSrvID->getPlain() << ", but response returned with " << rspSrvID->getPlain() << LogEnd; } IsDone = true; // we don't care. We sent release, we are shutting down anyway. } void TClntMsgRelease::doDuties() { if (RC!=MRC) send(); else IsDone=true; return; } bool TClntMsgRelease::check() { return false; } std::string TClntMsgRelease::getName() const { return "RELEASE"; } TClntMsgRelease::~TClntMsgRelease() { } dibbler-1.0.1/ClntMessages/ClntMsgReply.cpp0000664000175000017500000000266012556514351015531 00000000000000/* * Dibbler - a portable DHCPv6 * * authors: Tomasz Mrugalski * Marek Senderski * * released under GNU GPL v2 only licence * * $Id: ClntMsgReply.cpp,v 1.9 2008-08-29 00:07:28 thomson Exp $ * */ #include "SmartPtr.h" #include "ClntMsgReply.h" #include "ClntOptIAAddress.h" TClntMsgReply::TClntMsgReply(int iface, SPtr addr, char* buf, int bufSize) :TClntMsg(iface, addr,buf,bufSize) { } void TClntMsgReply::answer(SPtr Reply) { // this should never happen. After receiving REPLY for e.g. REQUEST, // request->answer(reply) is called. Client nevers sends reply msg, so // this method will never be called. } void TClntMsgReply::doDuties() { } bool TClntMsgReply::check() { bool anonInfReq = ClntCfgMgr().anonInfRequest(); return TClntMsg::check(!anonInfReq /* clientID mandatory */, true /* serverID mandatory */ ); } std::string TClntMsgReply::getName() const { return "REPLY"; } SPtr TClntMsgReply::getFirstAddr() { firstOption(); SPtr opt, subopt; while (opt=getOption()) { if (opt->getOptType() != OPTION_IA_NA) continue; opt->firstOption(); while (subopt=opt->getOption()) { if (subopt->getOptType() != OPTION_IAADDR) continue; SPtr optAddr = (Ptr*) subopt; return optAddr->getAddr(); } } return SPtr(); // NULL } TClntMsgReply::~TClntMsgReply() { } dibbler-1.0.1/ClntMessages/ClntMsgReply.h0000664000175000017500000000121012233256142015155 00000000000000/* * Dibbler - a portable DHCPv6 * * authors: Tomasz Mrugalski * Marek Senderski * changes: Krzysztof Wnuk * * released under GNU GPL v2 only licence * */ class TClntMsgReply; #ifndef CLNTMSGREPLY_H #define CLNTMSGREPLY_H #include "ClntMsg.h" class TClntMsgReply : public TClntMsg { public: TClntMsgReply(int iface, SPtr addr, char* buf, int bufSize); SPtr getFirstAddr(); void answer(SPtr Rep); void doDuties(); bool check(); std::string getName() const; ~TClntMsgReply(); }; #endif /* CLNTMSGREPLY_H */ dibbler-1.0.1/ClntMessages/ClntMsgDecline.h0000664000175000017500000000107012233256142015431 00000000000000/* * Dibbler - a portable DHCPv6 * * authors: Tomasz Mrugalski * Marek Senderski * * released under GNU GPL v2 only licence * */ class TClntMsgDecline; #ifndef CLNTMSGDECLINE_H #define CLNTMSGDECLINE_H #include "ClntMsg.h" class TClntMsgDecline : public TClntMsg { public: TClntMsgDecline(int iface, SPtr addr, List(TAddrIA) IALst); bool check(); void answer(SPtr Rep); void doDuties(); std::string getName() const; ~TClntMsgDecline(); private: }; #endif dibbler-1.0.1/ClntMessages/ClntMsgRelease.h0000664000175000017500000000134612233256142015454 00000000000000/* * Dibbler - a portable DHCPv6 * * authors: Tomasz Mrugalski * Marek Senderski * * released under GNU GPL v2 only licence * */ class TClntMsgRelease; #ifndef CLNTMSGRELEASE_H #define CLNTMSGRELEASE_H #include "ClntMsg.h" class TClntMsgRelease : public TClntMsg { public: /* TClntMsgRelease(int iface, SPtr addr=NULL); */ TClntMsgRelease(int iface, SPtr addr, List(TAddrIA) iaLst, SPtr ta, List(TAddrIA) pdLst); void answer(SPtr Rep); void doDuties(); bool check(); std::string getName() const; ~TClntMsgRelease(); }; #endif /* CLNTMSGRELEASE_H */ dibbler-1.0.1/ClntMessages/ClntMsgConfirm.h0000664000175000017500000000132212233256142015463 00000000000000/* * Dibbler - a portable DHCPv6 * * authors: Tomasz Mrugalski * Marek Senderski * * released under GNU GPL v2 only licence * */ class TClntMsgConfirm; #ifndef CLNTMSGCONFIRM_H #define CLNTMSGCONFIRM_H #include "ClntMsg.h" #include "ClntIfaceMgr.h" #include "ClntCfgIface.h" #include "ClntCfgIA.h" class TClntMsgConfirm : public TClntMsg { public: TClntMsgConfirm(unsigned int iface, List(TAddrIA) iaLst); bool check(); void answer(SPtr Rep); void doDuties(); unsigned long getTimeout(); std::string getName() const; void addrsAccepted(); void addrsRejected(); ~TClntMsgConfirm(); }; #endif /* CLNTMSGCONFIRM_H */ dibbler-1.0.1/ClntMessages/ClntMsgRequest.cpp0000644000175000017500000002207212556514424016064 00000000000000/* * Dibbler - a portable DHCPv6 * * authors: Tomasz Mrugalski * Marek Senderski * changes: Krzysztof Wnuk * Michal Kowalczuk * * released under GNU GPL v2 only licence * * $Id: ClntMsgRequest.cpp,v 1.29 2009-03-24 23:17:17 thomson Exp $ * */ #include "ClntMsgRequest.h" #include "SmartPtr.h" #include "DHCPConst.h" #include "OptDUID.h" #include "OptAddr.h" #include "ClntIfaceMgr.h" #include "ClntMsgAdvertise.h" #include "ClntOptIA_NA.h" #include "ClntOptTA.h" #include "ClntOptIA_PD.h" #include "ClntOptElapsed.h" #include "ClntOptOptionRequest.h" #include "ClntOptStatusCode.h" #include "ClntTransMgr.h" #include #include "Logger.h" /* * opts - options list WITHOUT serverDUID */ TClntMsgRequest::TClntMsgRequest(TOptList opts, int iface) :TClntMsg(iface, SPtr(), REQUEST_MSG) { IRT = REQ_TIMEOUT; MRT = REQ_MAX_RT; MRC = REQ_MAX_RC; MRD = 0; RT=0; Iface=iface; IsDone=false; int backupCount = ClntTransMgr().getAdvertiseLstCount(); if (!backupCount) { Log(Error) << "Unable to send REQUEST. There are no backup servers left." << LogEnd; setState( opts, STATE_NOTCONFIGURED); this->IsDone = true; return; } Log(Info) << "Creating REQUEST. Backup server list contains " << backupCount << " server(s)." << LogEnd; ClntTransMgr().printAdvertiseLst(); // get server DUID from the first advertise SPtr srvDUID = ClntTransMgr().getAdvertiseDUID(); ClntTransMgr().firstAdvertise(); SPtr advertise = (Ptr*) ClntTransMgr().getAdvertise(); this->copyAAASPI((SPtr)advertise); // remove just used server ClntTransMgr().delFirstAdvertise(); // copy whole list from SOLICIT ... Options = opts; // set proper Parent in copied options TOptList::iterator opt=Options.begin(); while (opt!=Options.end()) { if ( (*opt)->getOptType() == OPTION_ELAPSED_TIME) opt = Options.erase(opt); else { (*opt)->setParent(this); ++opt; } } // copy addresses offered in ADVERTISE copyAddrsFromAdvertise((Ptr*) advertise); copyPrefixesFromAdvertise((Ptr*) advertise); // does this server support unicast? SPtr cfgIface = ClntCfgMgr().getIface(iface); if (!cfgIface) { Log(Error) << "Unable to find interface with ifindex " << iface << "." << LogEnd; IsDone = true; return; } SPtr unicast = (Ptr*) advertise->getOption(OPTION_UNICAST); if (unicast && !cfgIface->getUnicast()) { Log(Info) << "Server offers unicast (" << *unicast->getAddr() << ") communication, but this client is not configured to so." << LogEnd; } if (unicast && cfgIface->getUnicast()) { Log(Debug) << "Server supports unicast on address " << *unicast->getAddr() << "." << LogEnd; //this->PeerAddr = unicast->getAddr(); firstOption(); SPtr opt; // set this unicast address in each IA in AddrMgr while ( opt = getOption() ) { /// @todo: add support for unicast in IA_TA and IA_PD if (opt->getOptType()!=OPTION_IA_NA) continue; SPtr ptrOptIA = (Ptr*) opt; SPtr ptrAddrIA = ClntAddrMgr().getIA(ptrOptIA->getIAID()); if (!ptrAddrIA) { Log(Crit) << "IA with IAID=" << ptrOptIA->getIAID() << " not found." << LogEnd; continue; } ptrAddrIA->setUnicast(unicast->getAddr()); } } // ... and append server's DUID from ADVERTISE Options.push_back( srvDUID ); appendElapsedOption(); appendAuthenticationOption(); IsDone = false; send(); } TClntMsgRequest::TClntMsgRequest(List(TAddrIA) IAs, SPtr srvDUID, int iface) :TClntMsg(iface, SPtr(), REQUEST_MSG) { IRT = REQ_TIMEOUT; MRT = REQ_MAX_RT; MRC = REQ_MAX_RC; MRD = 0; RT=0; Iface=iface; IsDone=false; SPtr ptr; ptr = new TOptDUID(OPTION_CLIENTID, ClntCfgMgr().getDUID(), this ); Options.push_back( ptr ); if (!srvDUID) { Log(Error) << "Unable to send REQUEST: ServerId not specified.\n" << LogEnd; IsDone = true; return; } ptr = (Ptr*) new TOptDUID(OPTION_SERVERID, srvDUID,this); // all IAs provided by checkSolicit SPtr ClntAddrIA; Options.push_back( ptr ); IAs.first(); while (ClntAddrIA = IAs.get()) { SPtr ClntCfgIA = ClntCfgMgr().getIA(ClntAddrIA->getIAID()); SPtr IA_NA = new TClntOptIA_NA(ClntCfgIA, ClntAddrIA, this); Options.push_back((Ptr*)IA_NA); } appendElapsedOption(); appendAuthenticationOption(); this->IsDone = false; this->send(); } /* * analyse REPLY received for this REQUEST */ void TClntMsgRequest::answer(SPtr msg) { this->copyAAASPI(msg); #ifdef MOD_CLNT_CONFIRM /* CHANGED here: When the client receives a NotOnLink status from the server in * response to a Request, the client can either re-issue the Request * without specifying any addresses or restart the DHCP server discovery * process. */ SPtr optStateCode = (Ptr*)msg->getOption(OPTION_STATUS_CODE); if( optStateCode && STATUSCODE_NOTONLINK == optStateCode->getCode()){ SPtr opt; firstOption(); while(opt = getOption()){ if(opt->getOptType() != OPTION_IA_NA){ continue; } SPtr IA_NA = (Ptr*)opt; IA_NA->delOption(OPTION_IAADDR); } return; } #endif TClntMsg::answer(msg); } void TClntMsgRequest::doDuties() { // timeout is reached and we still don't have answer, retransmit if (RC>MRC) { ClntTransMgr().sendRequest(Options, Iface); IsDone = true; return; } send(); return; } bool TClntMsgRequest::check() { return false; } std::string TClntMsgRequest::getName() const { return "REQUEST"; } /** * method is used when REQUEST transmission was attempted, but there are no more servers * on the backup list. When this method is called, it is sure that some IAs, TA or PDs will * remain not configured (as there are no servers available, which could configure it) * * @param options list of still unconfigured options * @param state state to be set in CfgMgr */ void TClntMsgRequest::setState(TOptList options, EState state) { SPtr opt; SPtr ia; SPtr ta; SPtr pd; SPtr cfgIa; SPtr cfgTa; SPtr cfgPd; SPtr iface = ClntCfgMgr().getIface(Iface); if (!iface) { Log(Error) << "Unable to find interface with ifindex=" << Iface << LogEnd; return; } for (TOptList::iterator opt = options.begin(); opt!=options.end(); ++opt) { switch ( (*opt)->getOptType()) { case OPTION_IA_NA: { ia = (Ptr*) (*opt); cfgIa = iface->getIA(ia->getIAID()); if (cfgIa) cfgIa->setState(state); break; } case OPTION_IA_TA: { ia = (Ptr*) (*opt); iface->firstTA(); cfgTa = iface->getTA(); if (cfgTa) cfgTa->setState(state); break; } case OPTION_IA_PD: { pd = (Ptr*) (*opt); cfgPd = iface->getPD(pd->getIAID()); if (cfgPd) cfgPd->setState(state); break; } default: continue; } } } void TClntMsgRequest::copyAddrsFromAdvertise(SPtr adv) { if (ClntCfgMgr().insistMode()) return; // insist-mode on, so ask for the address user specified again SPtr opt1, opt2, opt3; SPtr ia1, ia2; this->copyAAASPI(adv); firstOption(); while (opt1 = getOption()) { if (opt1->getOptType()!=OPTION_IA_NA) continue; // ignore all options except IA_NA adv->firstOption(); while (opt2 = adv->getOption()) { if (opt2->getOptType() != OPTION_IA_NA) continue; ia1 = (Ptr*) opt1; ia2 = (Ptr*) opt2; if (ia1->getIAID() != ia2->getIAID()) continue; // found IA in ADVERTISE, now copy all addrs ia1->delAllOptions(); ia2->firstOption(); while (opt3 = ia2->getOption()) { if (opt3->getOptType() == OPTION_IAADDR) ia1->addOption(opt3); } } } } void TClntMsgRequest::copyPrefixesFromAdvertise(SPtr adv) { if (ClntCfgMgr().insistMode()) return; // insist-mode on, so ask for the address user specified again SPtr opt1, opt2, opt3; SPtr ia1, ia2; this->copyAAASPI(adv); firstOption(); while (opt1 = getOption()) { if (opt1->getOptType()!=OPTION_IA_PD) continue; // ignore all options except IA_NA adv->firstOption(); while (opt2 = adv->getOption()) { if (opt2->getOptType() != OPTION_IA_PD) continue; ia1 = (Ptr*) opt1; ia2 = (Ptr*) opt2; if (ia1->getIAID() != ia2->getIAID()) continue; // found IA_PD in ADVERTISE, now copy all addrs ia1->delAllOptions(); ia2->firstOption(); while (opt3 = ia2->getOption()) { if (opt3->getOptType() == OPTION_IAPREFIX) ia1->addOption(opt3); } } } } TClntMsgRequest::~TClntMsgRequest() { } dibbler-1.0.1/ClntMessages/ClntMsgAdvertise.h0000664000175000017500000000145112233256142016017 00000000000000/* * Dibbler - a portable DHCPv6 * * authors: Tomasz Mrugalski * Marek Senderski * * released under GNU GPL v2 only licence * * $Id: ClntMsgAdvertise.h,v 1.6 2008-08-29 00:07:28 thomson Exp $ * */ #ifndef SRVMSGADVERTISE_H #define SRVMSGADVERTISE_H #include "ClntMsg.h" class TClntMsgAdvertise : public TClntMsg { public: /* TClntMsgAdvertise(int iface, SPtr addr); */ TClntMsgAdvertise(int iface, SPtr addr, char* buf, int bufSize); // returns preference value (default value is 0) int getPreference(); bool check(); void answer(SPtr Rep); void doDuties(); std::string getName() const; std::string getInfo(); ~TClntMsgAdvertise(); }; #endif dibbler-1.0.1/ClntMessages/ClntMsgConfirm.cpp0000644000175000017500000001324112556514333016026 00000000000000/* * Dibbler - a portable DHCPv6 * * authors: Tomasz Mrugalski * Marek Senderski * changes: Michal Kowalczuk * * released under GNU GPL v2 only licence * */ #include "SmartPtr.h" #include "ClntMsgConfirm.h" #include "OptDUID.h" #include "ClntOptStatusCode.h" #include "ClntOptIA_NA.h" #include "DHCPConst.h" #include "Logger.h" // iaLst - contain all IA's to be checked (they have to be in the same link) TClntMsgConfirm::TClntMsgConfirm(unsigned int iface, List(TAddrIA) iaLst) :TClntMsg(iface, SPtr(), CONFIRM_MSG) { IRT = CNF_TIMEOUT; MRT = CNF_MAX_RT; MRC = 0; MRD = CNF_MAX_RD; //The client sets the "msg-type" field to CONFIRM. The client //generates a transaction ID and inserts this value in the //"transaction-id" field. //The client MUST include a Client Identifier option to identify itself //to the server. Options.push_back(new TOptDUID(OPTION_CLIENTID, ClntCfgMgr().getDUID(), this ) ); //The client includes IA options for all of the IAs //assigned to the interface for which the Confirm message is being //sent. The IA options include all of the addresses the client //currently has associated with those IAs. The client SHOULD set the //T1 and T2 fields in any IA_NA options, and the preferred-lifetime and //valid-lifetime fields in the IA Address options to 0, as the server //will ignore these fields. SPtr ia; iaLst.first(); while(ia=iaLst.get()) Options.push_back(new TClntOptIA_NA(ia,true,this)); appendRequestedOptions(); appendElapsedOption(); appendAuthenticationOption(); IsDone = false; send(); } void TClntMsgConfirm::answer(SPtr reply) { SPtr status; status = (Ptr*) reply->getOption(OPTION_STATUS_CODE); if (!status) { Log(Warning) << "Received malformed REPLY for CONFIRM: no status option." << LogEnd; addrsRejected(); return; } switch (status->getCode() ) { case STATUSCODE_SUCCESS: addrsAccepted(); IsDone = true; break; case STATUSCODE_NOTONLINK: addrsRejected(); IsDone = true; break; case STATUSCODE_UNSPECFAIL: case STATUSCODE_NOADDRSAVAIL: case STATUSCODE_NOBINDING: case STATUSCODE_USEMULTICAST: default: Log(Warning) << "REPLY for CONFIRM received with invalid (" << status->getCode() << ") status code." << LogEnd; break; } return; } void TClntMsgConfirm::addrsAccepted() { SPtr ptrIA; SPtr ptrOpt; this->firstOption(); SPtr ptrAddrAddr; while ( ptrOpt = this->getOption() ) { if (ptrOpt->getOptType()!=OPTION_IA_NA) continue; SPtr ptrOptIA = (Ptr*) ptrOpt; ptrIA = ClntAddrMgr().getIA( ptrOptIA->getIAID() ); if (!ptrIA) continue; // Uncomment this line if you don't want RENEW to be sent after // CONFIRM exchange is complete ptrIA->setState(STATE_CONFIGURED); // Once confirmed, this triggers the ptrIA->setTimestamp( (uint32_t)time(NULL) - ptrIA->getT1() ); SPtr ptrIface = ClntIfaceMgr().getIfaceByID(ptrIA->getIfindex()); if (!ptrIface) continue; ptrIA->firstAddr(); while (ptrAddrAddr = ptrIA->getAddr()) { ptrIface->addAddr(ptrAddrAddr->get(),ptrAddrAddr->getPref(), ptrAddrAddr->getValid(), ptrIface->getPrefixLength()); } } } void TClntMsgConfirm::addrsRejected() { SPtr ptrIA; SPtr ptrOpt; this->firstOption(); while ( ptrOpt = this->getOption() ) { if (ptrOpt->getOptType()!=OPTION_IA_NA) continue; SPtr ptrOptIA = (Ptr*) ptrOpt; ptrIA = ClntAddrMgr().getIA(ptrOptIA->getIAID()); if (!ptrIA) continue; // release all addrs SPtr ptrIface; ptrIface = ClntIfaceMgr().getIfaceByID(ptrIA->getIfindex()); if (!ptrIface) { Log(Crit) << "We have addresses assigned to non-existing interface." "Help! Somebody stole an interface!" << LogEnd; ptrIA->setState(STATE_NOTCONFIGURED); return; } SPtr ptrAddr; ptrIA->firstAddr(); while (ptrAddr = ptrIA->getAddr() ) { // remove addr from ... ptrIface->delAddr( ptrAddr->get(), ptrIface->getPrefixLength() ); // ... and from DB ptrIA->delAddr( ptrAddr->get() ); } //not only the address should be rejected, but also the original IA should be deleted and using a new IA to process SOLICIT SPtr ptrCfgIA = ClntCfgMgr().getIA(ptrOptIA->getIAID()); ptrCfgIA->reset(); ptrIA->reset(); } ClntAddrMgr().firstIA(); } void TClntMsgConfirm::doDuties() { //The first Confirm message from the client on the interface MUST be //delayed by a random amount of time between 0 and CNF_MAX_DELAY. /// @todo: MRD counters are a mess. if (!MRD) { // MRD reached. Nobody said that out addrs are faulty, so we suppose // they are ok. Use them Log(Info) << "MRD reached and there is no valid response for CONFIRM. " << "Assuming addresses are valid." << LogEnd; addrsAccepted(); IsDone = true; return; } send(); } unsigned long TClntMsgConfirm::getTimeout() { return 0; } bool TClntMsgConfirm::check() { return 0; } std::string TClntMsgConfirm::getName() const { return "CONFIRM"; } TClntMsgConfirm::~TClntMsgConfirm() { } dibbler-1.0.1/ClntMessages/ClntMsgSolicit.cpp0000664000175000017500000003255312420536206016041 00000000000000/* * Dibbler - a portable DHCPv6 * * authors: Tomasz Mrugalski * Marek Senderski * chamges: Krzysztof Wnuk * released under GNU GPL v2 only licence * * $Id: ClntMsgSolicit.cpp,v 1.27 2009-03-24 23:17:17 thomson Exp $ */ #include "SmartPtr.h" #include "Msg.h" #include "ClntIfaceMgr.h" #include "ClntCfgIface.h" #include "ClntCfgIA.h" #include "ClntMsg.h" #include "ClntMsgSolicit.h" #include "ClntMsgAdvertise.h" #include "ClntOptIA_NA.h" #include "ClntOptTA.h" #include "ClntOptIA_PD.h" #include "OptDUID.h" #include "ClntOptOptionRequest.h" #include "ClntOptElapsed.h" #include "ClntOptPreference.h" #include "OptEmpty.h" #include "ClntOptStatusCode.h" #include #include "Logger.h" TClntMsgSolicit::TClntMsgSolicit(int iface, SPtr addr, List(TClntCfgIA) iaLst, SPtr ta, List(TClntCfgPD) pdLst, bool rapid, bool remoteAutoconf) :TClntMsg(iface, addr, SOLICIT_MSG) { IRT=SOL_TIMEOUT; MRT=SOL_MAX_RT; MRC=0; //these both below mean there is no ending condition and transactions MRD=0; //lasts till receiving answer RT=0; // ClientIdentifier option appendClientID(); SPtr addrIA; // all IAs are provided by ::checkSolicit() SPtr ia; iaLst.first(); while (ia = iaLst.get()) { SPtr iaOpt; iaOpt = new TClntOptIA_NA(ia, this); Options.push_back( (Ptr*)iaOpt ); if (!remoteAutoconf) ia->setState(STATE_INPROCESS); addrIA = ClntAddrMgr().getIA(ia->getIAID()); if (addrIA) addrIA->setState(STATE_INPROCESS); else Log(Error) << "AddrMgr does not have IA with IAID=" << ia->getIAID() << LogEnd; } // TA is provided by ::checkSolicit() if (ta) { SPtr taOpt = new TClntOptTA(ta->getIAID(), this); Options.push_back( (Ptr*) taOpt); if (!remoteAutoconf) ta->setState(STATE_INPROCESS); addrIA = ClntAddrMgr().getTA(ta->getIAID()); if (addrIA) addrIA->setState(STATE_INPROCESS); else Log(Error) << "AddrMgr does not have TA with IAID=" << ia->getIAID() << LogEnd; } // all PDs are provided by ::checkSolicit() SPtr pd; pdLst.first(); while ( pd = pdLst.get() ) { SPtr pdOpt = new TClntOptIA_PD(pd, this); Options.push_back( (Ptr*)pdOpt ); if (!remoteAutoconf) pd->setState(STATE_INPROCESS); addrIA = ClntAddrMgr().getPD(pd->getIAID()); if (addrIA) addrIA->setState(STATE_INPROCESS); else Log(Error) << "AddrMgr does not have PD with IAID=" << pd->getIAID() << LogEnd; } if (rapid) Options.push_back(new TOptEmpty(OPTION_RAPID_COMMIT, this)); // RECONF-ACCEPT is added in TClntMsg::appendRequestedOptions() // append and switch to INPROCESS state if (!remoteAutoconf) appendTAOptions(true); // append options specified in the config file if (!remoteAutoconf) appendRequestedOptions(); appendAuthenticationOption(); IsDone = false; send(); } void TClntMsgSolicit::answer(SPtr msg) { if (shallRejectAnswer(msg)) { Log(Info) << "Server message was rejected." << LogEnd; return; } switch (msg->getType()) { case ADVERTISE_MSG: { if (this->getOption(OPTION_RAPID_COMMIT)) { Log(Info) << "Server responded with ADVERTISE instead of REPLY, probably does not support" " RAPID-COMMIT." << LogEnd; } ClntTransMgr().addAdvertise((Ptr*)msg); SPtr prefOpt = (Ptr*) msg->getOption(OPTION_PREFERENCE); if (prefOpt && (prefOpt->getValue() == 255) ) { Log(Info) << "ADVERTISE message with preference set to 255 received, so wait time for" " other possible ADVERTISE messages is skipped." << LogEnd; ClntTransMgr().sendRequest(Options, Iface); IsDone = true; return; } if (this->RC > 1) { ClntTransMgr().sendRequest(Options, Iface); IsDone = true; return; } break; } case REPLY_MSG: { if (!this->getOption(OPTION_RAPID_COMMIT)) { Log(Warning) << "REPLY received, but SOLICIT was sent without RAPID_COMMIT. Ignoring." << LogEnd; return; } if (!msg->getOption(OPTION_RAPID_COMMIT)) { Log(Warning) << "REPLY as answer for SOLICIT received without RAPID_COMMIT. Ignoring." << LogEnd; return; } TClntMsg::answer(msg); break; } default: Log(Warning) << "Invalid message type (" << msg->getType() << ") received as answer for SOLICIT message." << LogEnd; return; } } /// @brief check if received message should be accepted. /// /// The following conditions are checked: /// - is server on the black-list? /// - are all requested options present? /// - is there requested IA option? /// - is there requested TA option? /// - is there requested PD option? /// - is requested PD option valid? /// /// @param msg server's REPLY /// /// @return true if REPLY is rejected bool TClntMsgSolicit::shallRejectAnswer(SPtr msg) { bool somethingAssigned = false; // this == solicit or request // msg == reply SPtr srvDUID = (Ptr*) msg->getOption(OPTION_SERVERID); if (!srvDUID) { Log(Notice) << "No server identifier provided. Message ignored." << LogEnd; return true; } //is this server rejected? SPtr iface = ClntCfgMgr().getIface(this->Iface); if (!iface) { Log(Error) << "Unable to find iface=" << this->Iface << "." << LogEnd; return true; } if (iface->isServerRejected(msg->getRemoteAddr(), srvDUID->getDUID())) { Log(Notice) << "Server was rejected (duid=" << srvDUID->getDUID() << ")." << LogEnd; return true; } // have we asked for IA? bool iaOk = true; if (this->getOption(OPTION_IA_NA)) { /// @todo Check if proper IAIDs are returned, also if all IA were answered (if requested /// several IAs were requested) /// @todo Check all IA_NAs, not just first one SPtr ia = (Ptr*)msg->getOption(OPTION_IA_NA); if (!ia) { Log(Notice) << "IA_NA option requested, but not present in this message. Ignored." << LogEnd; iaOk = false; } else { if (!ia->getOption(OPTION_IAADDR)) { Log(Notice) << "IA_NA option returned, but without any addresses. Ignored." << LogEnd; iaOk = false; } SPtr st = (Ptr*)ia->getOption(OPTION_STATUS_CODE); if (st && st->getCode()!= STATUSCODE_SUCCESS) { Log(Notice) << "IA_NA has status code!=SUCCESS: " << st->getCode() << "(" << st->getText() << "). Ignored." << LogEnd; iaOk = false; } } if (iaOk) somethingAssigned = true; } // have we asked for TA? bool taOk = true; if (this->getOption(OPTION_IA_TA)) { SPtr ta = (Ptr*)msg->getOption(OPTION_IA_TA); if (!ta) { Log(Notice) << "TA option requested, but not present in this message. Ignored." << LogEnd; taOk = false; } else { if (!ta->getOption(OPTION_IAADDR)) { Log(Notice) << "TA option received, but without IAADDR" << LogEnd; taOk = false; } SPtr st = (Ptr*)ta->getOption(OPTION_STATUS_CODE); if (st && st->getCode()!= STATUSCODE_SUCCESS) { Log(Notice) << "IA_TA has status code!=SUCCESS: " << st->getCode() << "(" << st->getText() << "). Ignored." << LogEnd; taOk = false; } } if (taOk) somethingAssigned = true; } // have we asked for PD? int msgPd = 0; // number of the IA_PDs requested msg->firstOption(); SPtr optTemp; while (optTemp = msg->getOption()) { if (optTemp->getOptType() == OPTION_IA_PD) { msgPd++; } } bool pdOk = true; bool pdFound = false; int pdcnt = 0; // number of usable IA_PD options in the response SPtr opt_sent; // iterates over options in solicit SPtr opt_rcvd; // iterates over options in received response // Let's get over all options in sent message (solicit) firstOption(); while (opt_sent = getOption()) { if (opt_sent->getOptType() != OPTION_IA_PD) continue; // ignore all options except IA_PD SPtr pdSol = (Ptr*) opt_sent; // Now for each sent IA_PD, try to find matching response msg->firstOption(); while (opt_rcvd = msg->getOption()) { // Let's ignore options other than IA_PD if (opt_rcvd->getOptType() != OPTION_IA_PD) continue; // Let's ignore IA_PDs with different IAID SPtr pdResp = (Ptr*) opt_rcvd; if (pdSol->getIAID() != pdResp->getIAID()) continue; // Found in response ia_pd that matches ia_pd from solicit pdFound = true; pdcnt++; if (!pdResp->getOption(OPTION_IAPREFIX)) { Log(Notice) << "Received PD with IAID = " << pdResp->getIAID() << " without " "any prefixes." << LogEnd; pdcnt--; if (ClntCfgMgr().insistMode()) { Log(Notice) << "Received response with IA_PD without any prefixes, " << "insist mode enabled, so rejecting this answer." << LogEnd; pdOk = false; break; } else { //insist-mode off if (msgPd == 1) { //if there was only one PD and it has no prefixes, reject. pdOk = false; break; } else if (msgPd > 1) { // if there were more than 1 PDs, delete the one without prefixes. deletePD(opt_rcvd); } continue; } } // ia_pd has some ia_prefix options, let's take a look at them int prefixCount = pdResp->countPrefixes(); pdResp->firstPrefix(); SPtr ppref; while (ppref = pdResp->getPrefix()) { if (!ppref->isValid()) { Log(Warning) << "Option IA_PREFIX from IA_PD " << pdResp->getIAID() << " is not valid." << LogEnd; // RFC 3633, section 10: // A requesting router discards any prefixes for which the // preferred lifetime is greater than the valid lifetime. pdResp->deletePrefix(ppref); prefixCount--; if (!prefixCount) { // ia_pd hasn't got any valid prefixes. pdcnt--; if (ClntCfgMgr().insistMode()) { // if insist-mode is enabled and one of received // pd's has no valid prefixes, answer is rejected. pdOk = false; Log(Notice) << "Received IA_PD with a prefix that has lifetime 0." << "Insist mode enabled, so rejecting this answer." << LogEnd; } // no valid prefixes and insist-mode is off? delete PD; // if not deleted, it will be copied to REQUEST message; // this leads to situation where IA_PD in REQUEST has no prefixes; deletePD(opt_rcvd); break; } } } SPtr st = (Ptr*)pdResp->getOption(OPTION_STATUS_CODE); if (st && st->getCode()!= STATUSCODE_SUCCESS) { Log(Notice) << "IA_NA has status code!=SUCCESS: " << st->getCode() << "(" << st->getText() << "). Ignored." << LogEnd; pdOk = false; } } if (!pdFound) { Log(Notice) << "PD option(s) requested, but not returned in this message." " Ignored." << LogEnd; pdOk = false; break; } } if (!pdcnt) { // if all of ia_pd's in received answer were malformed, reject answer. pdOk = false; } if (pdOk) somethingAssigned = true; if (!somethingAssigned) return true; // this advertise does not offers us anything if (!ClntCfgMgr().insistMode()) return false; // accept this advertise // insist-mode enabled. We MUST get everything we wanted or we reject this answer if (iaOk && taOk && pdOk) return false; else return true; } void TClntMsgSolicit::doDuties() { if ( ClntTransMgr().getAdvertiseLstCount() ) { // there is a timeout, but we have already answers and all is ok ClntTransMgr().sendRequest(Options, Iface); IsDone = true; return; } send(); } bool TClntMsgSolicit::check() { return false; } std::string TClntMsgSolicit::getName() const { return "SOLICIT"; } TClntMsgSolicit::~TClntMsgSolicit() { } dibbler-1.0.1/ClntMessages/ClntMsgReconfigure.h0000644000175000017500000000106312277722750016351 00000000000000/* * Dibbler - a portable DHCPv6 * * authors: Grzegorz Pluto * changes: Tomasz Mrugalski * * released under GNU GPL v2 or later licence * */ #ifndef CLNTMSGRECONFIGURE_H #define CLNTMSGRECONFIGURE_H #include "ClntMsg.h" class TClntMsgReconfigure : public TClntMsg { public: TClntMsgReconfigure(int iface, SPtr addr, char* buf, int bufSize); bool check(); void doDuties(); std::string getName() const { return std::string("RECONFIGURE"); } ~TClntMsgReconfigure(); }; #endif dibbler-1.0.1/ClntMessages/ClntMsgRenew.cpp0000644000175000017500000001335312556514557015525 00000000000000/* * Dibbler - a portable DHCPv6 * * authors: Tomasz Mrugalski * Marek Senderski * changes: Krzysztof Wnuk * Michal Kowalczuk * * released under GNU GPL v2 only licence * * $Id: ClntMsgRenew.cpp,v 1.23 2009-03-24 23:17:17 thomson Exp $ * */ #include "ClntMsgRenew.h" #include "DHCPConst.h" #include "ClntOptIA_NA.h" #include "ClntOptIA_PD.h" #include "OptDUID.h" #include "ClntOptOptionRequest.h" #include "ClntOptStatusCode.h" #include "Logger.h" #include "ClntTransMgr.h" #include "ClntIfaceMgr.h" #include TClntMsgRenew::TClntMsgRenew(List(TAddrIA) IALst, List(TAddrIA) PDLst) :TClntMsg(0, SPtr(), RENEW_MSG) { // set transmission parameters IRT=REN_TIMEOUT; MRT=REN_MAX_RT; MRC=0; RT=0; if (IALst.count() + PDLst.count() == 0) { Log(Error) << "Unable to send RENEW. No IAs and no PDs defined." << LogEnd; IsDone = true; return; } // retransmit until T2 has been reached or any address has expired //it should be the same for all IAs unsigned int timeout = DHCPV6_INFINITY; SPtr ia; if (IALst.count()) { IALst.first(); ia = IALst.get(); } else { PDLst.first(); ia = PDLst.get(); } if (!ia) { Log(Error) << "No IA to renew. Something is wrong." << LogEnd; IsDone = true; return; } MRD = ia->getT2Timeout(); Iface = ia->getIfindex(); PeerAddr_ = ia->getSrvAddr(); if (RT>MRD) RT=MRD; // store our DUID Options.push_back(new TOptDUID(OPTION_CLIENTID, ClntCfgMgr().getDUID(), this)); // and say who's this message is for if (IALst.count()) Options.push_back( new TOptDUID(OPTION_SERVERID,IALst.getFirst()->getDUID(),this)); else Options.push_back( new TOptDUID(OPTION_SERVERID,PDLst.getFirst()->getDUID(),this)); //Store all IAs to renew IALst.first(); while(ia=IALst.get()) { if (timeout > ia->getT2Timeout()) timeout = ia->getT2Timeout(); Options.push_back(new TClntOptIA_NA(ia,this)); } PDLst.first(); while (ia=PDLst.get()) { if (timeout > ia->getT2Timeout()) timeout = ia->getT2Timeout(); Options.push_back(new TClntOptIA_PD(ia, this)); } appendRequestedOptions(); appendAuthenticationOption(); IsDone = false; send(); } void TClntMsgRenew::answer(SPtr Reply) { SPtr opt; unsigned int iaCnt = 0; // get DUID SPtr srvDUID; srvDUID = (Ptr*) this->getOption(OPTION_SERVERID); SPtr ptrOptionReqOpt=(Ptr*)getOption(OPTION_ORO); Reply->firstOption(); // for each option in message... (there should be only one IA option, as we send // separate RENEW for each IA, but we check all options anyway) while ( opt = Reply->getOption() ) { switch (opt->getOptType()) { case OPTION_IA_NA: { iaCnt++; SPtr ptrOptIA = (Ptr*)opt; if (ptrOptIA->getStatusCode()!=STATUSCODE_SUCCESS) { if(ptrOptIA->getStatusCode() == STATUSCODE_NOBINDING){ ClntTransMgr().sendRequest(Options, Iface); IsDone = true; return; }else{ SPtr status = (Ptr*) ptrOptIA->getOption(OPTION_STATUS_CODE); Log(Warning) << "Received IA (iaid=" << ptrOptIA->getIAID() << ") with status code " << StatusCodeToString(status->getCode()) << ": " << status->getText() << LogEnd; break; } } ptrOptIA->setContext(srvDUID->getDUID(), SPtr(), Reply->getIface()); ptrOptIA->doDuties(); break; } case OPTION_IA_PD: { iaCnt++; SPtr pd = (Ptr*) opt; if (pd->getStatusCode() != STATUSCODE_SUCCESS) { if(pd->getStatusCode() == STATUSCODE_NOBINDING){ ClntTransMgr().sendRequest(Options,Iface); IsDone = true; return; } else{ SPtr status = (Ptr*) pd->getOption(OPTION_STATUS_CODE); Log(Warning) << "Received PD (iaid=" << pd->getIAID() << ") with status code " << StatusCodeToString(status->getCode()) << ": " << status->getText() << LogEnd; break; } } pd->setContext(srvDUID->getDUID(), SPtr(), (TMsg*)this); pd->doDuties(); break; } case OPTION_ORO: case OPTION_RELAY_MSG: case OPTION_INTERFACE_ID: case OPTION_IAADDR: case OPTION_RECONF_MSG: Log(Warning) << "Illegal option (" << opt->getOptType() << ") in received REPLY message." << LogEnd; break; default: // what to do with unknown/other options? execute them opt->setParent(this); opt->doDuties(); } } //Here we received answer from our server, which updated the "whole information" //There is no use to send Rebind even if server realesed some addresses/IAs //in such a case new Solicit message should be sent IsDone = true; } /** * @brief changes IA state to not cofigured. * * @param iaid */ void TClntMsgRenew::releaseIA(long iaid) { SPtr ia = ClntAddrMgr().getIA(iaid); if(ia){ ia->setState(STATE_NOTCONFIGURED); } } void TClntMsgRenew::doDuties() { /// @todo: increase RT from REN_TIMEOUT to REN_MAX_RT // should we send RENEW once more or start sending REBIND if (!MRD) { Log(Notice) << "RENEW remains unanswered and timeout T2 reached, so REBIND will be sent." << LogEnd; ClntTransMgr().sendRebind(Options,getIface()); IsDone = true; return; } send(); } bool TClntMsgRenew::check() { // this should never happen return false; } std::string TClntMsgRenew::getName() const { return "RENEW"; } TClntMsgRenew::~TClntMsgRenew() { } dibbler-1.0.1/ClntMessages/ClntMsgDecline.cpp0000664000175000017500000000347712233256142016001 00000000000000/* * Dibbler - a portable DHCPv6 * * authors: Tomasz Mrugalski * Marek Senderski * changes: Michal Kowalczuk * * released under GNU GPL v2 only licence * */ #include "ClntMsgDecline.h" #include "OptDUID.h" #include "AddrIA.h" #include "ClntOptIA_NA.h" TClntMsgDecline::TClntMsgDecline(int iface, SPtr addr, List(TAddrIA) IALst) :TClntMsg(iface, addr, DECLINE_MSG) { IRT=DEC_TIMEOUT; MRT=0; //these both below mean there is no ending condition and transactions //lasts till receiving answer MRC=DEC_MAX_RC; MRD=0; RT=0; // include our ClientIdentifier SPtr ptr; ptr = new TOptDUID(OPTION_CLIENTID, ClntCfgMgr().getDUID(), this ); Options.push_back( ptr ); // include server's DUID ptr = new TOptDUID(OPTION_SERVERID, IALst.getFirst()->getDUID(),this); Options.push_back( ptr ); // create IAs SPtr ptrIA; IALst.first(); while ( ptrIA = IALst.get() ) { Options.push_back( new TClntOptIA_NA(ptrIA,this)); } appendElapsedOption(); appendAuthenticationOption(); IsDone = false; send(); } void TClntMsgDecline::answer(SPtr rep) { /// @todo: Is UseMulticast option included? SPtr repSrvID= (Ptr*) rep->getOption(OPTION_SERVERID); SPtr msgSrvID= (Ptr*) this->getOption(OPTION_SERVERID); if ((!repSrvID)|| (!(*msgSrvID->getDUID()==*repSrvID->getDUID()))) return; IsDone = true; } void TClntMsgDecline::doDuties() { if (RC!=MRC) send(); else IsDone=true; return; } bool TClntMsgDecline::check() { return false; } std::string TClntMsgDecline::getName() const { return "DECLINE"; } TClntMsgDecline::~TClntMsgDecline() { } dibbler-1.0.1/ClntMessages/ClntMsgRebind.h0000664000175000017500000000156312233256142015300 00000000000000/* * Dibbler - a portable DHCPv6 * * authors: Tomasz Mrugalski * Marek Senderski * * released under GNU GPL v2 only licence * * $Id: ClntMsgRebind.h,v 1.5 2008-08-29 00:07:28 thomson Exp $ * */ class TClntMsgRebind; #ifndef CLNTMSGREBIND_H #define CLNTMSGREBIND_H #include "ClntMsg.h" #include "ClntOptIA_NA.h" #include "OptDUID.h" #include "OptAddr.h" class TClntMsgRebind : public TClntMsg { public: TClntMsgRebind(TOptList ptrOpts, int iface); void answer(SPtr Rep); void doDuties(); bool check(); std::string getName() const; ~TClntMsgRebind(); private: void updateIA(SPtr ptrOptIA, SPtr optSrvDUID, SPtr optUnicast); void releaseIA(int IAID); void releasePD(int IAID); }; #endif /* REBIND_H_HEADER_INCLUDED_C1126D16 */ dibbler-1.0.1/ClntMessages/Makefile.in0000664000175000017500000013534512561652534014520 00000000000000# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = ClntMessages DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/depcomp ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/libtool.m4 \ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/include/dibbler-config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = LIBRARIES = $(noinst_LIBRARIES) ARFLAGS = cru AM_V_AR = $(am__v_AR_@AM_V@) am__v_AR_ = $(am__v_AR_@AM_DEFAULT_V@) am__v_AR_0 = @echo " AR " $@; am__v_AR_1 = libClntMessages_a_AR = $(AR) $(ARFLAGS) libClntMessages_a_LIBADD = am_libClntMessages_a_OBJECTS = \ libClntMessages_a-ClntMsgAdvertise.$(OBJEXT) \ libClntMessages_a-ClntMsgConfirm.$(OBJEXT) \ libClntMessages_a-ClntMsg.$(OBJEXT) \ libClntMessages_a-ClntMsgDecline.$(OBJEXT) \ libClntMessages_a-ClntMsgInfRequest.$(OBJEXT) \ libClntMessages_a-ClntMsgRebind.$(OBJEXT) \ libClntMessages_a-ClntMsgRelease.$(OBJEXT) \ libClntMessages_a-ClntMsgRenew.$(OBJEXT) \ libClntMessages_a-ClntMsgReply.$(OBJEXT) \ libClntMessages_a-ClntMsgRequest.$(OBJEXT) \ libClntMessages_a-ClntMsgSolicit.$(OBJEXT) \ libClntMessages_a-ClntMsgReconfigure.$(OBJEXT) libClntMessages_a_OBJECTS = $(am_libClntMessages_a_OBJECTS) AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)/include depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) LTCXXCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CXXFLAGS) $(CXXFLAGS) AM_V_CXX = $(am__v_CXX_@AM_V@) am__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@) am__v_CXX_0 = @echo " CXX " $@; am__v_CXX_1 = CXXLD = $(CXX) CXXLINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \ $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CXXLD = $(am__v_CXXLD_@AM_V@) am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@) am__v_CXXLD_0 = @echo " CXXLD " $@; am__v_CXXLD_1 = COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(libClntMessages_a_SOURCES) DIST_SOURCES = $(libClntMessages_a_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALLOCA = @ALLOCA@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ ARCH = @ARCH@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ EXTRA_DIST_SUBDIRS = @EXTRA_DIST_SUBDIRS@ FGREP = @FGREP@ GREP = @GREP@ GTEST_INCLUDES = @GTEST_INCLUDES@ GTEST_LDADD = @GTEST_LDADD@ GTEST_LDFLAGS = @GTEST_LDFLAGS@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LINKPRINT = @LINKPRINT@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PORT_CFLAGS = @PORT_CFLAGS@ PORT_LDFLAGS = @PORT_LDFLAGS@ PORT_SUBDIR = @PORT_SUBDIR@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ subdirs = @subdirs@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ noinst_LIBRARIES = libClntMessages.a libClntMessages_a_CPPFLAGS = -I$(top_srcdir)/Misc \ -I$(top_srcdir)/Messages -I$(top_srcdir)/Options \ -I$(top_srcdir)/ClntOptions -I$(top_srcdir)/ClntIfaceMgr \ -I$(top_srcdir)/IfaceMgr -I$(top_srcdir)/ClntCfgMgr \ -I$(top_srcdir)/CfgMgr -I$(top_srcdir)/AddrMgr \ -I$(top_srcdir)/ClntAddrMgr -I$(top_srcdir)/ClntTransMgr \ -I$(top_srcdir)/poslib libClntMessages_a_SOURCES = ClntMsgAdvertise.cpp ClntMsgAdvertise.h ClntMsgConfirm.cpp ClntMsgConfirm.h ClntMsg.cpp ClntMsgDecline.cpp ClntMsgDecline.h ClntMsg.h ClntMsgInfRequest.cpp ClntMsgInfRequest.h ClntMsgRebind.cpp ClntMsgRebind.h ClntMsgRelease.cpp ClntMsgRelease.h ClntMsgRenew.cpp ClntMsgRenew.h ClntMsgReply.cpp ClntMsgReply.h ClntMsgRequest.cpp ClntMsgRequest.h ClntMsgSolicit.cpp ClntMsgSolicit.h ClntMsgReconfigure.cpp ClntMsgReconfigure.h all: all-am .SUFFIXES: .SUFFIXES: .cpp .lo .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign ClntMessages/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign ClntMessages/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstLIBRARIES: -test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES) libClntMessages.a: $(libClntMessages_a_OBJECTS) $(libClntMessages_a_DEPENDENCIES) $(EXTRA_libClntMessages_a_DEPENDENCIES) $(AM_V_at)-rm -f libClntMessages.a $(AM_V_AR)$(libClntMessages_a_AR) libClntMessages.a $(libClntMessages_a_OBJECTS) $(libClntMessages_a_LIBADD) $(AM_V_at)$(RANLIB) libClntMessages.a mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libClntMessages_a-ClntMsg.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libClntMessages_a-ClntMsgAdvertise.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libClntMessages_a-ClntMsgConfirm.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libClntMessages_a-ClntMsgDecline.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libClntMessages_a-ClntMsgInfRequest.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libClntMessages_a-ClntMsgRebind.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libClntMessages_a-ClntMsgReconfigure.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libClntMessages_a-ClntMsgRelease.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libClntMessages_a-ClntMsgRenew.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libClntMessages_a-ClntMsgReply.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libClntMessages_a-ClntMsgRequest.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libClntMessages_a-ClntMsgSolicit.Po@am__quote@ .cpp.o: @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $< .cpp.obj: @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .cpp.lo: @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LTCXXCOMPILE) -c -o $@ $< libClntMessages_a-ClntMsgAdvertise.o: ClntMsgAdvertise.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libClntMessages_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libClntMessages_a-ClntMsgAdvertise.o -MD -MP -MF $(DEPDIR)/libClntMessages_a-ClntMsgAdvertise.Tpo -c -o libClntMessages_a-ClntMsgAdvertise.o `test -f 'ClntMsgAdvertise.cpp' || echo '$(srcdir)/'`ClntMsgAdvertise.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libClntMessages_a-ClntMsgAdvertise.Tpo $(DEPDIR)/libClntMessages_a-ClntMsgAdvertise.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='ClntMsgAdvertise.cpp' object='libClntMessages_a-ClntMsgAdvertise.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libClntMessages_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libClntMessages_a-ClntMsgAdvertise.o `test -f 'ClntMsgAdvertise.cpp' || echo '$(srcdir)/'`ClntMsgAdvertise.cpp libClntMessages_a-ClntMsgAdvertise.obj: ClntMsgAdvertise.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libClntMessages_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libClntMessages_a-ClntMsgAdvertise.obj -MD -MP -MF $(DEPDIR)/libClntMessages_a-ClntMsgAdvertise.Tpo -c -o libClntMessages_a-ClntMsgAdvertise.obj `if test -f 'ClntMsgAdvertise.cpp'; then $(CYGPATH_W) 'ClntMsgAdvertise.cpp'; else $(CYGPATH_W) '$(srcdir)/ClntMsgAdvertise.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libClntMessages_a-ClntMsgAdvertise.Tpo $(DEPDIR)/libClntMessages_a-ClntMsgAdvertise.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='ClntMsgAdvertise.cpp' object='libClntMessages_a-ClntMsgAdvertise.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libClntMessages_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libClntMessages_a-ClntMsgAdvertise.obj `if test -f 'ClntMsgAdvertise.cpp'; then $(CYGPATH_W) 'ClntMsgAdvertise.cpp'; else $(CYGPATH_W) '$(srcdir)/ClntMsgAdvertise.cpp'; fi` libClntMessages_a-ClntMsgConfirm.o: ClntMsgConfirm.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libClntMessages_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libClntMessages_a-ClntMsgConfirm.o -MD -MP -MF $(DEPDIR)/libClntMessages_a-ClntMsgConfirm.Tpo -c -o libClntMessages_a-ClntMsgConfirm.o `test -f 'ClntMsgConfirm.cpp' || echo '$(srcdir)/'`ClntMsgConfirm.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libClntMessages_a-ClntMsgConfirm.Tpo $(DEPDIR)/libClntMessages_a-ClntMsgConfirm.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='ClntMsgConfirm.cpp' object='libClntMessages_a-ClntMsgConfirm.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libClntMessages_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libClntMessages_a-ClntMsgConfirm.o `test -f 'ClntMsgConfirm.cpp' || echo '$(srcdir)/'`ClntMsgConfirm.cpp libClntMessages_a-ClntMsgConfirm.obj: ClntMsgConfirm.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libClntMessages_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libClntMessages_a-ClntMsgConfirm.obj -MD -MP -MF $(DEPDIR)/libClntMessages_a-ClntMsgConfirm.Tpo -c -o libClntMessages_a-ClntMsgConfirm.obj `if test -f 'ClntMsgConfirm.cpp'; then $(CYGPATH_W) 'ClntMsgConfirm.cpp'; else $(CYGPATH_W) '$(srcdir)/ClntMsgConfirm.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libClntMessages_a-ClntMsgConfirm.Tpo $(DEPDIR)/libClntMessages_a-ClntMsgConfirm.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='ClntMsgConfirm.cpp' object='libClntMessages_a-ClntMsgConfirm.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libClntMessages_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libClntMessages_a-ClntMsgConfirm.obj `if test -f 'ClntMsgConfirm.cpp'; then $(CYGPATH_W) 'ClntMsgConfirm.cpp'; else $(CYGPATH_W) '$(srcdir)/ClntMsgConfirm.cpp'; fi` libClntMessages_a-ClntMsg.o: ClntMsg.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libClntMessages_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libClntMessages_a-ClntMsg.o -MD -MP -MF $(DEPDIR)/libClntMessages_a-ClntMsg.Tpo -c -o libClntMessages_a-ClntMsg.o `test -f 'ClntMsg.cpp' || echo '$(srcdir)/'`ClntMsg.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libClntMessages_a-ClntMsg.Tpo $(DEPDIR)/libClntMessages_a-ClntMsg.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='ClntMsg.cpp' object='libClntMessages_a-ClntMsg.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libClntMessages_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libClntMessages_a-ClntMsg.o `test -f 'ClntMsg.cpp' || echo '$(srcdir)/'`ClntMsg.cpp libClntMessages_a-ClntMsg.obj: ClntMsg.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libClntMessages_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libClntMessages_a-ClntMsg.obj -MD -MP -MF $(DEPDIR)/libClntMessages_a-ClntMsg.Tpo -c -o libClntMessages_a-ClntMsg.obj `if test -f 'ClntMsg.cpp'; then $(CYGPATH_W) 'ClntMsg.cpp'; else $(CYGPATH_W) '$(srcdir)/ClntMsg.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libClntMessages_a-ClntMsg.Tpo $(DEPDIR)/libClntMessages_a-ClntMsg.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='ClntMsg.cpp' object='libClntMessages_a-ClntMsg.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libClntMessages_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libClntMessages_a-ClntMsg.obj `if test -f 'ClntMsg.cpp'; then $(CYGPATH_W) 'ClntMsg.cpp'; else $(CYGPATH_W) '$(srcdir)/ClntMsg.cpp'; fi` libClntMessages_a-ClntMsgDecline.o: ClntMsgDecline.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libClntMessages_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libClntMessages_a-ClntMsgDecline.o -MD -MP -MF $(DEPDIR)/libClntMessages_a-ClntMsgDecline.Tpo -c -o libClntMessages_a-ClntMsgDecline.o `test -f 'ClntMsgDecline.cpp' || echo '$(srcdir)/'`ClntMsgDecline.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libClntMessages_a-ClntMsgDecline.Tpo $(DEPDIR)/libClntMessages_a-ClntMsgDecline.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='ClntMsgDecline.cpp' object='libClntMessages_a-ClntMsgDecline.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libClntMessages_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libClntMessages_a-ClntMsgDecline.o `test -f 'ClntMsgDecline.cpp' || echo '$(srcdir)/'`ClntMsgDecline.cpp libClntMessages_a-ClntMsgDecline.obj: ClntMsgDecline.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libClntMessages_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libClntMessages_a-ClntMsgDecline.obj -MD -MP -MF $(DEPDIR)/libClntMessages_a-ClntMsgDecline.Tpo -c -o libClntMessages_a-ClntMsgDecline.obj `if test -f 'ClntMsgDecline.cpp'; then $(CYGPATH_W) 'ClntMsgDecline.cpp'; else $(CYGPATH_W) '$(srcdir)/ClntMsgDecline.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libClntMessages_a-ClntMsgDecline.Tpo $(DEPDIR)/libClntMessages_a-ClntMsgDecline.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='ClntMsgDecline.cpp' object='libClntMessages_a-ClntMsgDecline.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libClntMessages_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libClntMessages_a-ClntMsgDecline.obj `if test -f 'ClntMsgDecline.cpp'; then $(CYGPATH_W) 'ClntMsgDecline.cpp'; else $(CYGPATH_W) '$(srcdir)/ClntMsgDecline.cpp'; fi` libClntMessages_a-ClntMsgInfRequest.o: ClntMsgInfRequest.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libClntMessages_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libClntMessages_a-ClntMsgInfRequest.o -MD -MP -MF $(DEPDIR)/libClntMessages_a-ClntMsgInfRequest.Tpo -c -o libClntMessages_a-ClntMsgInfRequest.o `test -f 'ClntMsgInfRequest.cpp' || echo '$(srcdir)/'`ClntMsgInfRequest.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libClntMessages_a-ClntMsgInfRequest.Tpo $(DEPDIR)/libClntMessages_a-ClntMsgInfRequest.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='ClntMsgInfRequest.cpp' object='libClntMessages_a-ClntMsgInfRequest.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libClntMessages_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libClntMessages_a-ClntMsgInfRequest.o `test -f 'ClntMsgInfRequest.cpp' || echo '$(srcdir)/'`ClntMsgInfRequest.cpp libClntMessages_a-ClntMsgInfRequest.obj: ClntMsgInfRequest.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libClntMessages_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libClntMessages_a-ClntMsgInfRequest.obj -MD -MP -MF $(DEPDIR)/libClntMessages_a-ClntMsgInfRequest.Tpo -c -o libClntMessages_a-ClntMsgInfRequest.obj `if test -f 'ClntMsgInfRequest.cpp'; then $(CYGPATH_W) 'ClntMsgInfRequest.cpp'; else $(CYGPATH_W) '$(srcdir)/ClntMsgInfRequest.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libClntMessages_a-ClntMsgInfRequest.Tpo $(DEPDIR)/libClntMessages_a-ClntMsgInfRequest.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='ClntMsgInfRequest.cpp' object='libClntMessages_a-ClntMsgInfRequest.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libClntMessages_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libClntMessages_a-ClntMsgInfRequest.obj `if test -f 'ClntMsgInfRequest.cpp'; then $(CYGPATH_W) 'ClntMsgInfRequest.cpp'; else $(CYGPATH_W) '$(srcdir)/ClntMsgInfRequest.cpp'; fi` libClntMessages_a-ClntMsgRebind.o: ClntMsgRebind.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libClntMessages_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libClntMessages_a-ClntMsgRebind.o -MD -MP -MF $(DEPDIR)/libClntMessages_a-ClntMsgRebind.Tpo -c -o libClntMessages_a-ClntMsgRebind.o `test -f 'ClntMsgRebind.cpp' || echo '$(srcdir)/'`ClntMsgRebind.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libClntMessages_a-ClntMsgRebind.Tpo $(DEPDIR)/libClntMessages_a-ClntMsgRebind.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='ClntMsgRebind.cpp' object='libClntMessages_a-ClntMsgRebind.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libClntMessages_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libClntMessages_a-ClntMsgRebind.o `test -f 'ClntMsgRebind.cpp' || echo '$(srcdir)/'`ClntMsgRebind.cpp libClntMessages_a-ClntMsgRebind.obj: ClntMsgRebind.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libClntMessages_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libClntMessages_a-ClntMsgRebind.obj -MD -MP -MF $(DEPDIR)/libClntMessages_a-ClntMsgRebind.Tpo -c -o libClntMessages_a-ClntMsgRebind.obj `if test -f 'ClntMsgRebind.cpp'; then $(CYGPATH_W) 'ClntMsgRebind.cpp'; else $(CYGPATH_W) '$(srcdir)/ClntMsgRebind.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libClntMessages_a-ClntMsgRebind.Tpo $(DEPDIR)/libClntMessages_a-ClntMsgRebind.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='ClntMsgRebind.cpp' object='libClntMessages_a-ClntMsgRebind.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libClntMessages_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libClntMessages_a-ClntMsgRebind.obj `if test -f 'ClntMsgRebind.cpp'; then $(CYGPATH_W) 'ClntMsgRebind.cpp'; else $(CYGPATH_W) '$(srcdir)/ClntMsgRebind.cpp'; fi` libClntMessages_a-ClntMsgRelease.o: ClntMsgRelease.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libClntMessages_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libClntMessages_a-ClntMsgRelease.o -MD -MP -MF $(DEPDIR)/libClntMessages_a-ClntMsgRelease.Tpo -c -o libClntMessages_a-ClntMsgRelease.o `test -f 'ClntMsgRelease.cpp' || echo '$(srcdir)/'`ClntMsgRelease.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libClntMessages_a-ClntMsgRelease.Tpo $(DEPDIR)/libClntMessages_a-ClntMsgRelease.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='ClntMsgRelease.cpp' object='libClntMessages_a-ClntMsgRelease.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libClntMessages_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libClntMessages_a-ClntMsgRelease.o `test -f 'ClntMsgRelease.cpp' || echo '$(srcdir)/'`ClntMsgRelease.cpp libClntMessages_a-ClntMsgRelease.obj: ClntMsgRelease.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libClntMessages_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libClntMessages_a-ClntMsgRelease.obj -MD -MP -MF $(DEPDIR)/libClntMessages_a-ClntMsgRelease.Tpo -c -o libClntMessages_a-ClntMsgRelease.obj `if test -f 'ClntMsgRelease.cpp'; then $(CYGPATH_W) 'ClntMsgRelease.cpp'; else $(CYGPATH_W) '$(srcdir)/ClntMsgRelease.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libClntMessages_a-ClntMsgRelease.Tpo $(DEPDIR)/libClntMessages_a-ClntMsgRelease.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='ClntMsgRelease.cpp' object='libClntMessages_a-ClntMsgRelease.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libClntMessages_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libClntMessages_a-ClntMsgRelease.obj `if test -f 'ClntMsgRelease.cpp'; then $(CYGPATH_W) 'ClntMsgRelease.cpp'; else $(CYGPATH_W) '$(srcdir)/ClntMsgRelease.cpp'; fi` libClntMessages_a-ClntMsgRenew.o: ClntMsgRenew.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libClntMessages_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libClntMessages_a-ClntMsgRenew.o -MD -MP -MF $(DEPDIR)/libClntMessages_a-ClntMsgRenew.Tpo -c -o libClntMessages_a-ClntMsgRenew.o `test -f 'ClntMsgRenew.cpp' || echo '$(srcdir)/'`ClntMsgRenew.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libClntMessages_a-ClntMsgRenew.Tpo $(DEPDIR)/libClntMessages_a-ClntMsgRenew.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='ClntMsgRenew.cpp' object='libClntMessages_a-ClntMsgRenew.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libClntMessages_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libClntMessages_a-ClntMsgRenew.o `test -f 'ClntMsgRenew.cpp' || echo '$(srcdir)/'`ClntMsgRenew.cpp libClntMessages_a-ClntMsgRenew.obj: ClntMsgRenew.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libClntMessages_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libClntMessages_a-ClntMsgRenew.obj -MD -MP -MF $(DEPDIR)/libClntMessages_a-ClntMsgRenew.Tpo -c -o libClntMessages_a-ClntMsgRenew.obj `if test -f 'ClntMsgRenew.cpp'; then $(CYGPATH_W) 'ClntMsgRenew.cpp'; else $(CYGPATH_W) '$(srcdir)/ClntMsgRenew.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libClntMessages_a-ClntMsgRenew.Tpo $(DEPDIR)/libClntMessages_a-ClntMsgRenew.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='ClntMsgRenew.cpp' object='libClntMessages_a-ClntMsgRenew.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libClntMessages_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libClntMessages_a-ClntMsgRenew.obj `if test -f 'ClntMsgRenew.cpp'; then $(CYGPATH_W) 'ClntMsgRenew.cpp'; else $(CYGPATH_W) '$(srcdir)/ClntMsgRenew.cpp'; fi` libClntMessages_a-ClntMsgReply.o: ClntMsgReply.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libClntMessages_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libClntMessages_a-ClntMsgReply.o -MD -MP -MF $(DEPDIR)/libClntMessages_a-ClntMsgReply.Tpo -c -o libClntMessages_a-ClntMsgReply.o `test -f 'ClntMsgReply.cpp' || echo '$(srcdir)/'`ClntMsgReply.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libClntMessages_a-ClntMsgReply.Tpo $(DEPDIR)/libClntMessages_a-ClntMsgReply.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='ClntMsgReply.cpp' object='libClntMessages_a-ClntMsgReply.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libClntMessages_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libClntMessages_a-ClntMsgReply.o `test -f 'ClntMsgReply.cpp' || echo '$(srcdir)/'`ClntMsgReply.cpp libClntMessages_a-ClntMsgReply.obj: ClntMsgReply.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libClntMessages_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libClntMessages_a-ClntMsgReply.obj -MD -MP -MF $(DEPDIR)/libClntMessages_a-ClntMsgReply.Tpo -c -o libClntMessages_a-ClntMsgReply.obj `if test -f 'ClntMsgReply.cpp'; then $(CYGPATH_W) 'ClntMsgReply.cpp'; else $(CYGPATH_W) '$(srcdir)/ClntMsgReply.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libClntMessages_a-ClntMsgReply.Tpo $(DEPDIR)/libClntMessages_a-ClntMsgReply.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='ClntMsgReply.cpp' object='libClntMessages_a-ClntMsgReply.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libClntMessages_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libClntMessages_a-ClntMsgReply.obj `if test -f 'ClntMsgReply.cpp'; then $(CYGPATH_W) 'ClntMsgReply.cpp'; else $(CYGPATH_W) '$(srcdir)/ClntMsgReply.cpp'; fi` libClntMessages_a-ClntMsgRequest.o: ClntMsgRequest.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libClntMessages_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libClntMessages_a-ClntMsgRequest.o -MD -MP -MF $(DEPDIR)/libClntMessages_a-ClntMsgRequest.Tpo -c -o libClntMessages_a-ClntMsgRequest.o `test -f 'ClntMsgRequest.cpp' || echo '$(srcdir)/'`ClntMsgRequest.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libClntMessages_a-ClntMsgRequest.Tpo $(DEPDIR)/libClntMessages_a-ClntMsgRequest.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='ClntMsgRequest.cpp' object='libClntMessages_a-ClntMsgRequest.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libClntMessages_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libClntMessages_a-ClntMsgRequest.o `test -f 'ClntMsgRequest.cpp' || echo '$(srcdir)/'`ClntMsgRequest.cpp libClntMessages_a-ClntMsgRequest.obj: ClntMsgRequest.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libClntMessages_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libClntMessages_a-ClntMsgRequest.obj -MD -MP -MF $(DEPDIR)/libClntMessages_a-ClntMsgRequest.Tpo -c -o libClntMessages_a-ClntMsgRequest.obj `if test -f 'ClntMsgRequest.cpp'; then $(CYGPATH_W) 'ClntMsgRequest.cpp'; else $(CYGPATH_W) '$(srcdir)/ClntMsgRequest.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libClntMessages_a-ClntMsgRequest.Tpo $(DEPDIR)/libClntMessages_a-ClntMsgRequest.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='ClntMsgRequest.cpp' object='libClntMessages_a-ClntMsgRequest.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libClntMessages_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libClntMessages_a-ClntMsgRequest.obj `if test -f 'ClntMsgRequest.cpp'; then $(CYGPATH_W) 'ClntMsgRequest.cpp'; else $(CYGPATH_W) '$(srcdir)/ClntMsgRequest.cpp'; fi` libClntMessages_a-ClntMsgSolicit.o: ClntMsgSolicit.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libClntMessages_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libClntMessages_a-ClntMsgSolicit.o -MD -MP -MF $(DEPDIR)/libClntMessages_a-ClntMsgSolicit.Tpo -c -o libClntMessages_a-ClntMsgSolicit.o `test -f 'ClntMsgSolicit.cpp' || echo '$(srcdir)/'`ClntMsgSolicit.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libClntMessages_a-ClntMsgSolicit.Tpo $(DEPDIR)/libClntMessages_a-ClntMsgSolicit.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='ClntMsgSolicit.cpp' object='libClntMessages_a-ClntMsgSolicit.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libClntMessages_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libClntMessages_a-ClntMsgSolicit.o `test -f 'ClntMsgSolicit.cpp' || echo '$(srcdir)/'`ClntMsgSolicit.cpp libClntMessages_a-ClntMsgSolicit.obj: ClntMsgSolicit.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libClntMessages_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libClntMessages_a-ClntMsgSolicit.obj -MD -MP -MF $(DEPDIR)/libClntMessages_a-ClntMsgSolicit.Tpo -c -o libClntMessages_a-ClntMsgSolicit.obj `if test -f 'ClntMsgSolicit.cpp'; then $(CYGPATH_W) 'ClntMsgSolicit.cpp'; else $(CYGPATH_W) '$(srcdir)/ClntMsgSolicit.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libClntMessages_a-ClntMsgSolicit.Tpo $(DEPDIR)/libClntMessages_a-ClntMsgSolicit.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='ClntMsgSolicit.cpp' object='libClntMessages_a-ClntMsgSolicit.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libClntMessages_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libClntMessages_a-ClntMsgSolicit.obj `if test -f 'ClntMsgSolicit.cpp'; then $(CYGPATH_W) 'ClntMsgSolicit.cpp'; else $(CYGPATH_W) '$(srcdir)/ClntMsgSolicit.cpp'; fi` libClntMessages_a-ClntMsgReconfigure.o: ClntMsgReconfigure.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libClntMessages_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libClntMessages_a-ClntMsgReconfigure.o -MD -MP -MF $(DEPDIR)/libClntMessages_a-ClntMsgReconfigure.Tpo -c -o libClntMessages_a-ClntMsgReconfigure.o `test -f 'ClntMsgReconfigure.cpp' || echo '$(srcdir)/'`ClntMsgReconfigure.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libClntMessages_a-ClntMsgReconfigure.Tpo $(DEPDIR)/libClntMessages_a-ClntMsgReconfigure.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='ClntMsgReconfigure.cpp' object='libClntMessages_a-ClntMsgReconfigure.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libClntMessages_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libClntMessages_a-ClntMsgReconfigure.o `test -f 'ClntMsgReconfigure.cpp' || echo '$(srcdir)/'`ClntMsgReconfigure.cpp libClntMessages_a-ClntMsgReconfigure.obj: ClntMsgReconfigure.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libClntMessages_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libClntMessages_a-ClntMsgReconfigure.obj -MD -MP -MF $(DEPDIR)/libClntMessages_a-ClntMsgReconfigure.Tpo -c -o libClntMessages_a-ClntMsgReconfigure.obj `if test -f 'ClntMsgReconfigure.cpp'; then $(CYGPATH_W) 'ClntMsgReconfigure.cpp'; else $(CYGPATH_W) '$(srcdir)/ClntMsgReconfigure.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libClntMessages_a-ClntMsgReconfigure.Tpo $(DEPDIR)/libClntMessages_a-ClntMsgReconfigure.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='ClntMsgReconfigure.cpp' object='libClntMessages_a-ClntMsgReconfigure.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libClntMessages_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libClntMessages_a-ClntMsgReconfigure.obj `if test -f 'ClntMsgReconfigure.cpp'; then $(CYGPATH_W) 'ClntMsgReconfigure.cpp'; else $(CYGPATH_W) '$(srcdir)/ClntMsgReconfigure.cpp'; fi` mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LIBRARIES) installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool clean-noinstLIBRARIES \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \ clean-libtool clean-noinstLIBRARIES cscopelist-am ctags \ ctags-am distclean distclean-compile distclean-generic \ distclean-libtool distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-dvi install-dvi-am install-exec \ install-exec-am install-html install-html-am install-info \ install-info-am install-man install-pdf install-pdf-am \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ tags tags-am uninstall uninstall-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: dibbler-1.0.1/Port-win32/0000775000175000017500000000000012561700422012002 500000000000000dibbler-1.0.1/Port-win32/WinService.h0000644000175000017500000000430112304040124014134 00000000000000/* * Dibbler - a portable DHCPv6 * * authors: Tomasz Mrugalski * Marek Senderski * changes: Hernan Martinez * * Released under GNU GPL v2 licence * */ #ifndef _WINSERVICE_ #define _WINSERVICE_ #include #include #define SERVICE_CONTROL_USER 128 typedef enum { STATUS, START, STOP, INSTALL, UNINSTALL, SERVICE, RUN, HELP, INVALID } EServiceState; class TWinService { public: std::string ServiceDir; TWinService(const char* serviceName, const char* dispName, DWORD deviceType=SERVICE_DEMAND_START, char* dependencies=NULL, char* descr=NULL); static void WINAPI ServiceMain(DWORD dwArgc, LPTSTR* lpszArgv); static void WINAPI Handler(DWORD dwOpcode); void LogEvent(WORD wType, DWORD dwID, const char* pszS1 = NULL, const char* pszS2 = NULL, const char* pszS3 = NULL); bool IsInstalled(); bool IsInstalled(const char *name); bool Install(); bool Uninstall(); bool StartService(); /* invoked to trigger start */ bool RunService(); /* actual service start and run */ bool StopService(); void SetStatus(DWORD dwState); bool Initialize(); void showStatus(); bool verifyPort(); int getStatus(); bool isRunning(const char * name); bool isRunning(); bool isRunAsAdmin(); virtual void Run(); virtual bool OnInit(); virtual void OnStop(); virtual void OnInterrogate(); virtual void OnPause(); virtual void OnContinue(); virtual void OnShutdown(); virtual bool OnUserControl(DWORD dwOpcode); ~TWinService(void); static const char ADMIN_REQUIRED_STR[]; protected: SERVICE_STATUS Status; SERVICE_STATUS_HANDLE hServiceStatus; BOOL IsRunning; char ServiceName[64]; int MajorVersion; int MinorVersion; DWORD ServiceType; char Dependencies[64]; char* DisplayName; char* descr; static TWinService* ServicePtr; HANDLE EventSource; }; #endif dibbler-1.0.1/Port-win32/client-win32.vs2013.rc0000644000175000017500000000104712277722750015437 00000000000000// Microsoft Visual C++ generated resource script. // #include "resource1.h" #define APSTUDIO_READONLY_SYMBOLS ///////////////////////////////////////////////////////////////////////////// // // Generated from the TEXTINCLUDE 2 resource. // //#include "afxres.h" ///////////////////////////////////////////////////////////////////////////// #undef APSTUDIO_READONLY_SYMBOLS // Icon with lowest ID value placed first to ensure application icon // remains consistent on all systems. IDI_ICON1 ICON "client-win32.ico" dibbler-1.0.1/Port-win32/ClntService.cpp0000664000175000017500000001121012561700136014644 00000000000000/* * Dibbler - a portable DHCPv6 * * authors: Tomasz Mrugalski * Marek Senderski * * $Id: ClntService.cpp,v 1.24 2008-08-30 20:41:06 thomson Exp $ * * Released under GNU GPL v2 licence * */ #include #include "ClntService.h" #include "DHCPClient.h" #include "portable.h" #include "logger.h" #include "DHCPConst.h" #include TDHCPClient * clntPtr; TClntService StaticService; using namespace std; extern std::string CLNTCONF_FILE; extern std::string CLNTLOG_FILE; TClntService::TClntService() :TWinService("DHCPv6Client","Dibbler - a DHCPv6 client",SERVICE_AUTO_START, "tcpip6\0winmgmt\0", "Dibbler - a portable DHCPv6. This is DHCPv6 client," " version " DIBBLER_VERSION ".") { // Depend on 'tcpip6' service only if it's Windows XP or Windows 2003. // Vista and above have IPv6 in the TCP stack and it's not a standalone service. OSVERSIONINFO verinfo; verinfo.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); GetVersionEx(&verinfo); char dependenciesV5[] = "RpcSS\0tcpip6\0winmgmt\0"; char dependenciesV6[] = "RpcSS\0winmgmt\0"; if ( verinfo.dwMajorVersion <= 5 ) memcpy(Dependencies, dependenciesV5, sizeof(dependenciesV5)); else memcpy(Dependencies, dependenciesV6, sizeof(dependenciesV6)); } EServiceState TClntService::ParseStandardArgs(int argc,char* argv[]) { bool dirFound = false; EServiceState status = INVALID; int n = 1; while(nstop(); } void TClntService::OnStop() { clntPtr->stop(); } void TClntService::Run() { if (_chdir(this->ServiceDir.c_str())) { Log(Crit) << "Unable to change directory to " << this->ServiceDir << ". Aborting.\n" << LogEnd; return; } string confile = CLNTCONF_FILE; string oldconf = CLNTCONF_FILE+(string)"-old"; string workdir = this->ServiceDir; string addrfile = CLNTADDRMGR_FILE; string logFile = CLNTLOG_FILE; logger::setLogName("Client"); logger::Initialize((char*)logFile.c_str()); Log(Crit) << DIBBLER_COPYRIGHT1 << "(CLIENT, WinXP/2003/Vista/7/8 port)" << LogEnd; TDHCPClient client(workdir+"\\"+confile); clntPtr = &client; // remember address client.setWorkdir(this->ServiceDir); if (!client.isDone()) client.run(); } void TClntService::setState(EServiceState status) { this->status = status; } TClntService::~TClntService(void) { } dibbler-1.0.1/Port-win32/server-win32.vs2013.vcxproj.filters0000644000175000017500000007322612277722750020235 00000000000000 {86e8050e-5bfe-4cb1-9671-46ebe07b8cc5} cpp;c;cxx;def;odl;idl;hpj;bat;asm {a927762b-aca5-48e8-a6a6-b4a67eb41e18} {fa420f0b-f761-4c9e-afde-99d6fd0c4b5c} {ddeb8147-75cc-4d02-8887-91c98b4d8f6d} {c88b5ba0-9153-44c4-b3bc-241b379915ef} {71c48f42-888b-4a39-81ee-c8afc8f07b46} {f1d17239-78d7-420a-b3aa-e863682cc836} {e640cae5-6445-497e-98db-75ba70c8dc5d} {e71f90ba-bc51-4f3d-9e53-36da74186ec1} {a6c96f1c-ff11-498c-8dcc-ce91ab9e4a7d} {2a0b564c-81bf-41b6-9b2c-0d6440ee0774} {6a5a905f-aaea-44dd-8e17-4d685214149a} {763b84e0-836c-40c7-b51e-11cefaa7a43e} h;hpp;hxx;hm;inl;inc {e8cbb352-f6d7-4d44-bfdd-a74ccc6678eb} {54ddb565-0ce0-43bc-b520-093eeb2b6849} {c2f92e98-abaf-46cf-95de-60fba05b3245} {cf30d581-5ddd-4419-8744-ad9294dd0510} {3949a84d-e98f-49f0-a6a2-1d030c627969} {9c0241fb-83fb-449b-8ab6-6ff876de8de3} {f5fd5772-a9cc-47f4-8c53-20022838a72a} {eca0f8ba-2bca-4b10-9f84-46fa02eb78a3} {ebede59b-8628-4f84-bb4f-f0f7319f2514} {a69197c3-b487-4f6e-9313-dd5114a70878} {133e24f8-d21b-45b9-b98b-18b68546e341} {9beb6ef0-02b5-4ad1-9134-279d726750cd} Source Files Source Files\AddrMgr Source Files\AddrMgr Source Files\AddrMgr Source Files\AddrMgr Source Files\AddrMgr Source Files\AddrMgr Source Files\IfaceMgr Source Files\IfaceMgr Source Files\IfaceMgr Source Files\IfaceMgr Source Files\IfaceMgr Source Files\Options Source Files\Options Source Files\Options Source Files\Options Source Files\Options Source Files\Options Source Files\Options Source Files\Options Source Files\Options Source Files\Options Source Files\Options Source Files\Options Source Files\Options Source Files\Options Source Files\Options Source Files\Options Source Files\Options Source Files\Options Source Files\Options Source Files\Options Source Files\Options Source Files\Options Source Files\Options Source Files\Options Source Files\SrvOptions Source Files\SrvOptions Source Files\SrvOptions Source Files\SrvOptions Source Files\SrvOptions Source Files\SrvOptions Source Files\SrvOptions Source Files\SrvOptions Source Files\SrvOptions Source Files\SrvMessages Source Files\SrvMessages Source Files\SrvMessages Source Files\SrvMessages Source Files\SrvMessages Source Files\SrvMessages Source Files\SrvMessages Source Files\SrvMessages Source Files\SrvMessages Source Files\SrvMessages Source Files\SrvMessages Source Files\SrvMessages Source Files\SrvMessages Source Files\SrvMessages Source Files\SrvMessages Source Files\CfgMgr Source Files\CfgMgr Source Files\CfgMgr Source Files\misc Source Files\misc Source Files\misc Source Files\misc Source Files\misc Source Files\misc Source Files\misc Source Files\misc Source Files\misc Source Files\misc Source Files\misc Source Files\misc Source Files\misc Source Files\misc Source Files\misc Source Files\misc Source Files\misc Source Files\misc Source Files\port-win32 Source Files\port-win32 Source Files\port-win32 Source Files\port-win32 Source Files\poslib Source Files\poslib Source Files\poslib Source Files\poslib Source Files\poslib Source Files\poslib Source Files\poslib Source Files\poslib Source Files\poslib Source Files\poslib Source Files\poslib Source Files\SrvCfgMgr Source Files\SrvCfgMgr Source Files\SrvCfgMgr Source Files\SrvCfgMgr Source Files\SrvCfgMgr Source Files\SrvCfgMgr Source Files\SrvCfgMgr Source Files\SrvCfgMgr Source Files\SrvCfgMgr Source Files\SrvCfgMgr Source Files\SrvCfgMgr Source Files\SrvCfgMgr Source Files\SrvCfgMgr Source Files\SrvCfgMgr Source Files\SrvCfgMgr Source Files\SrvCfgMgr Source Files\nettle Source Files\nettle Source Files\nettle Source Files\nettle Source Files\nettle Source Files\nettle Source Files\nettle Source Files\nettle Source Files\SrvCfgMgr Source Files\SrvCfgMgr Header Files\AddrMgr Header Files\AddrMgr Header Files\AddrMgr Header Files\AddrMgr Header Files\AddrMgr Header Files\IfaceMgr Header Files\IfaceMgr Header Files\IfaceMgr Header Files\IfaceMgr Header Files\Options Header Files\Options Header Files\Options Header Files\Options Header Files\Options Header Files\Options Header Files\Options Header Files\Options Header Files\Options Header Files\Options Header Files\Options Header Files\Options Header Files\Options Header Files\Options Header Files\Options Header Files\Options Header Files\Options Header Files\Options Header Files\Options Header Files\Options Header Files\Options Header Files\SrvOptions Header Files\SrvOptions Header Files\SrvOptions Header Files\SrvOptions Header Files\SrvOptions Header Files\SrvOptions Header Files\SrvOptions Header Files\SrvOptions Header Files\SrvOptions Header Files\SrvOptions Header Files\SrvOptions Header Files\SrvOptions Header Files\SrvOptions Header Files\SrvOptions Header Files\SrvOptions Header Files\SrvOptions Header Files\SrvOptions Header Files\SrvOptions Header Files\SrvOptions Header Files\SrvOptions Header Files\SrvOptions Header Files\CfgMgr Header Files\CfgMgr Header Files\CfgMgr Header Files\CfgMgr Header Files\CfgMgr Header Files\CfgMgr Header Files\CfgMgr Header Files\CfgMgr Header Files\CfgMgr Header Files\CfgMgr Header Files\CfgMgr Header Files\CfgMgr Header Files\CfgMgr Header Files\CfgMgr Header Files\misc Header Files\misc Header Files\misc Header Files\misc Header Files\misc Header Files\misc Header Files\misc Header Files\misc Header Files\misc Header Files\misc Header Files\misc Header Files\misc Header Files\misc Header Files\port-win32 Header Files\port-win32 Header Files\port-win32 Header Files\port-win32 Header Files\port-win32 Header Files\SrvIfaceMgr Header Files\SrvIfaceMgr Header Files\SrvAddrMgr Header Files\SrvMessages Header Files\SrvMessages Header Files\SrvMessages Header Files\SrvMessages Header Files\SrvMessages Header Files\SrvMessages Header Files\SrvMessages Header Files\SrvMessages Header Files\SrvMessages Header Files\SrvMessages Header Files\SrvMessages Header Files\SrvMessages Header Files\SrvMessages Header Files\SrvTransMgr Header Files\nettle Header Files\nettle Header Files\nettle Header Files\nettle Header Files\nettle Header Files\nettle Header Files\nettle Header Files\nettle Header Files\nettle Header Files\nettle dibbler-1.0.1/Port-win32/addrpack.c0000664000175000017500000001152012233256142013637 00000000000000#include #include #include void print_packed(char addr[]); #define NS_INADDRSZ 4 /* IPv4 T_A */ #define NS_IN6ADDRSZ 16 /* IPv6 T_AAAA */ #define NS_INT16SZ 2 /* #/bytes of data in a u_int16_t */ #define u_char unsigned char #define u_int unsigned int static int inet_pton4(const char * src, char * dst) { int saw_digit, octets, ch; u_char tmp[NS_INADDRSZ], *tp; saw_digit = 0; octets = 0; *(tp = tmp) = 0; while ((ch = *src++) != '\0') { if (ch >= '0' && ch <= '9') { u_int new = *tp * 10 + (ch - '0'); if (new > 255) return (0); *tp = new; if (! saw_digit) { if (++octets > 4) return (0); saw_digit = 1; } } else if (ch == '.' && saw_digit) { if (octets == 4) return (0); *++tp = 0; saw_digit = 0; } else return (0); } if (octets < 4) return (0); memcpy(dst, tmp, NS_INADDRSZ); return (1); } int inet_pton6(const char *src, char * dst) { static char xdigits[] = "0123456789abcdef"; u_char tmp[NS_IN6ADDRSZ], *tp, *endp, *colonp; const char *curtok; int ch, saw_xdigit; u_int val; memset(tmp, '\0', NS_IN6ADDRSZ); tp = tmp; endp = tp + NS_IN6ADDRSZ; colonp = NULL; /* Leading :: requires some special handling. */ if (*src == ':') if (*++src != ':') return (0); curtok = src; saw_xdigit = 0; val = 0; while ((ch = tolower (*src++)) != '\0') { char * pch; pch = strchr(xdigits, ch); if (pch != NULL) { val <<= 4; val |= (pch - xdigits); if (val > 0xffff) return (0); saw_xdigit = 1; continue; } if (ch == ':') { curtok = src; if (!saw_xdigit) { if (colonp) return (0); colonp = tp; continue; } else if (*src == '\0') { return (0); } if (tp + NS_INT16SZ > endp) return (0); *tp++ = (u_char) (val >> 8) & 0xff; *tp++ = (u_char) val & 0xff; saw_xdigit = 0; val = 0; continue; } if (ch == '.' && ((tp + NS_INADDRSZ) <= endp) && inet_pton4(curtok, tp) > 0) { tp += NS_INADDRSZ; saw_xdigit = 0; break; /* '\0' was seen by inet_pton4(). */ } return (0); } if (saw_xdigit) { if (tp + NS_INT16SZ > endp) return (0); *tp++ = (u_char) (val >> 8) & 0xff; *tp++ = (u_char) val & 0xff; } if (colonp != NULL) { /* * Since some memmove()'s erroneously fail to handle * overlapping regions, we'll do the shift by hand. */ const int n = tp - colonp; int i; if (tp == endp) return (0); for (i = 1; i <= n; i++) { endp[- i] = colonp[n - i]; colonp[n - i] = 0; } tp = endp; } if (tp != endp) return (0); memcpy(dst, tmp, NS_IN6ADDRSZ); return (1); } char * inet_ntop4(const char * src, char * dst) { char tmp[sizeof "255.255.255.255"]; sprintf(tmp,"%u.%u.%u.%u", src[0], src[1], src[2], src[3]); return strcpy(dst, tmp); } char * inet_ntop6(const unsigned char * src, char * dst) { char tmp[sizeof "ffff:ffff:ffff:ffff:ffff:ffff:255.255.255.255"], *tp; struct { int base, len; } best, cur; u_int words[NS_IN6ADDRSZ / NS_INT16SZ]; int i; /* * Preprocess: * Copy the input (bytewise) array into a wordwise array. * Find the longest run of 0x00's in src[] for :: shorthanding. */ memset(words, '\0', sizeof words); for (i = 0; i < NS_IN6ADDRSZ; i += 2) words[i / 2] = (src[i] << 8) | src[i + 1]; best.base = -1; cur.base = -1; for (i = 0; i < (NS_IN6ADDRSZ / NS_INT16SZ); i++) { if (words[i] == 0) { if (cur.base == -1) cur.base = i, cur.len = 1; else cur.len++; } else { if (cur.base != -1) { if (best.base == -1 || cur.len > best.len) best = cur; cur.base = -1; } } } if (cur.base != -1) { if (best.base == -1 || cur.len > best.len) best = cur; } if (best.base != -1 && best.len < 2) best.base = -1; /* * Format the result. */ tp = tmp; for (i = 0; i < (NS_IN6ADDRSZ / NS_INT16SZ); i++) { /* Are we inside the best run of 0x00's? */ if (best.base != -1 && i >= best.base && i < (best.base + best.len)) { if (i == best.base) *tp++ = ':'; continue; } /* Are we following an initial run of 0x00s or any real hex? */ if (i != 0) *tp++ = ':'; /* Is this address an encapsulated IPv4? */ if (i == 6 && best.base == 0 && (best.len == 6 || (best.len == 5 && words[5] == 0xffff))) { if (!inet_ntop4(src+12, tp)) return (NULL); tp += strlen(tp); break; } tp += sprintf(tp, "%x", words[i]); } /* Was it a trailing run of 0x00's? */ if (best.base != -1 && (best.base + best.len) == (NS_IN6ADDRSZ / NS_INT16SZ)) *tp++ = ':'; *tp++ = '\0'; return strcpy(dst, tmp); } void print_packed(char * addr) { /* for (int i=0; i<16;i++) { cout.fill('0'); cout.width(2); cout << hex << (int)(unsigned char)addr[i]; if (i%2==1 && i!=15) cout << ":"; }*/ int i=0; for (;i<16;i++) { printf("%02x",*(unsigned char*)(addr+i)); if ((i%2) && i<15) printf(":"); } } dibbler-1.0.1/Port-win32/server.log0000664000175000017500000000000012233256142013722 00000000000000dibbler-1.0.1/Port-win32/server-win32.vs2013.rc0000644000175000017500000000164412277722750015472 00000000000000// Microsoft Visual C++ generated resource script. // #include "resource2.h" #define APSTUDIO_READONLY_SYMBOLS ///////////////////////////////////////////////////////////////////////////// // // Generated from the TEXTINCLUDE 2 resource. // //#include "afxres.h" ///////////////////////////////////////////////////////////////////////////// #undef APSTUDIO_READONLY_SYMBOLS ///////////////////////////////////////////////////////////////////////////// // Polish resources ///////////////////////////////////////////////////////////////////////////// // // Icon // // Icon with lowest ID value placed first to ensure application icon // remains consistent on all systems. IDI_ICON1 ICON "server-win32.ico" ///////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////// // English (U.S.) resources dibbler-1.0.1/Port-win32/WinService.cpp0000644000175000017500000004104512304040124014475 00000000000000/* * Dibbler - a portable DHCPv6 * * authors: Tomasz Mrugalski * Marek Senderski * changes: Hernan Martinez * * Released under GNU GPL v2 licence * */ #include "Portable.h" #include #include "winservice.h" #include "Logger.h" const char TWinService::ADMIN_REQUIRED_STR[] = "This action requires administrative privileges."; TWinService* TWinService::ServicePtr= NULL; TWinService::TWinService(const char* serviceName, const char* dispName, DWORD serviceType, char* dependencies, char * descr) { ServicePtr = this; strncpy(ServiceName, serviceName, sizeof(ServiceName)-1); ServiceType = serviceType; strncpy(Dependencies, dependencies, sizeof(Dependencies)-1); MajorVersion = 1; MinorVersion = 0; EventSource = NULL; this->descr = descr; // set service status hServiceStatus = NULL; Status.dwServiceType = SERVICE_WIN32_OWN_PROCESS; Status.dwCurrentState = SERVICE_STOPPED; Status.dwControlsAccepted = SERVICE_ACCEPT_STOP; Status.dwWin32ExitCode = 0; Status.dwServiceSpecificExitCode = 0; Status.dwCheckPoint = 0; Status.dwWaitHint = 0; IsRunning = FALSE; DisplayName=new char[strlen(dispName)+1]; strcpy(DisplayName,dispName); } TWinService::~TWinService(void) { if (EventSource) DeregisterEventSource(EventSource); } void TWinService::ServiceMain(DWORD dwArgc, LPTSTR* lpszArgv) { // Get a pointer to the C++ object TWinService* pService = ServicePtr; // Register the control request handler pService->Status.dwCurrentState = SERVICE_START_PENDING; pService->hServiceStatus = RegisterServiceCtrlHandler(pService->ServiceName,Handler); if (pService->hServiceStatus==NULL) { return; } // Start the initialisation if (pService->Initialize()) { // Do the real work. // When the Run function returns, the service has stopped. pService->IsRunning = TRUE; pService->Status.dwWin32ExitCode = 0; pService->Status.dwCheckPoint = 0; pService->Status.dwWaitHint = 0; pService->Run(); } // Tell the service manager we are stopped pService->SetStatus(SERVICE_STOPPED); } void TWinService::Handler(DWORD dwOpcode) { // Get a pointer to the object TWinService* pService = ServicePtr; switch (dwOpcode) { case SERVICE_CONTROL_STOP: // 1 pService->SetStatus(SERVICE_STOP_PENDING); pService->OnStop(); pService->IsRunning = FALSE; break; case SERVICE_CONTROL_PAUSE: // 2 pService->OnPause(); break; case SERVICE_CONTROL_CONTINUE: // 3 pService->OnContinue(); break; case SERVICE_CONTROL_INTERROGATE: // 4 pService->OnInterrogate(); break; case SERVICE_CONTROL_SHUTDOWN: // 5 pService->OnShutdown(); break; default: if (dwOpcode >= SERVICE_CONTROL_USER) { if (!pService->OnUserControl(dwOpcode)) { } } else { } break; } // Report current status SetServiceStatus(pService->hServiceStatus, &pService->Status); } void TWinService::LogEvent(WORD wType, DWORD dwID, const char* pszS1, const char* pszS2, const char* pszS3) { const char* ps[3]; ps[0] = pszS1; ps[1] = pszS2; ps[2] = pszS3; int iStr = 0; for (int i = 0; i < 3; i++) if (ps[i] != NULL) iStr++; // Check the event source has been registered and if // not then register it now if (!EventSource) EventSource = ::RegisterEventSource(NULL,ServiceName); if (EventSource) ReportEvent(EventSource,wType,0,dwID,NULL,iStr,0,ps,NULL); } bool TWinService::IsInstalled() { return this->IsInstalled(this->ServiceName); } bool TWinService::IsInstalled(const char *name) { bool result = false; // Open the Service Control Manager SC_HANDLE hSCM = ::OpenSCManager(NULL, // local machine NULL, // ServicesActive database SC_MANAGER_ALL_ACCESS); // full access if (hSCM) { // Try to open the service SC_HANDLE hService = OpenService(hSCM,name,SERVICE_QUERY_CONFIG); if (hService) { result = true; CloseServiceHandle(hService); } CloseServiceHandle(hSCM); } return result; } bool TWinService::Install() { if (this->IsInstalled()) { Log(Crit) << "Service " << ServiceName << " is already installed." << LogEnd; return false; } // Open the Service Control Manager SC_HANDLE hSCM = ::OpenSCManager(NULL, // local machine NULL, // ServicesActive database SC_MANAGER_ALL_ACCESS); // full access if (!hSCM) return false; // Get the executable file path char filePath[_MAX_PATH]; GetModuleFileName(NULL, filePath, sizeof(filePath)); int i = strlen(filePath); sprintf(filePath+i, " service -d \"%s\"",ServiceDir.c_str()); // Create the service //printf("Install(): filepath=[%s]\nServiceName=[%s]\n",filePath,ServiceName); //printf("ServiceDir=[%s]\n",ServiceDir.c_str()); SC_HANDLE hService = CreateService( hSCM,ServiceName, DisplayName, SERVICE_ALL_ACCESS, SERVICE_WIN32_OWN_PROCESS, ServiceType, SERVICE_ERROR_NORMAL, filePath,NULL,NULL,Dependencies,NULL,NULL); if (!hService) { CloseServiceHandle(hSCM); Log(Crit) << "Unable to create " << ServiceName << " service." << LogEnd; return FALSE; } SERVICE_DESCRIPTION sdBuf; sdBuf.lpDescription = this->descr; ChangeServiceConfig2(hService,SERVICE_CONFIG_DESCRIPTION, &sdBuf ); CloseServiceHandle(hService); CloseServiceHandle(hSCM); Log(Notice) << "Service " << ServiceName << " has been installed." << LogEnd; return true; } bool TWinService::Uninstall() { if (this->isRunning()) { Log(Crit) << "Unable to stop. Service " << ServiceName << " is running." << LogEnd; return false; } if (!this->IsInstalled()) { Log(Crit) << "Service " << ServiceName << " is not installed." << LogEnd; return false; } // Open the Service Control Manager SC_HANDLE hSCM = OpenSCManager(NULL,NULL,SC_MANAGER_ALL_ACCESS); if (!hSCM) { Log(Crit) << "Unable to open Service Control Manager." << LogEnd; return false; } bool result = false; SC_HANDLE hService = ::OpenService(hSCM,ServiceName,DELETE); if (!hService) { Log(Crit) << "Unable to open " << ServiceName << " service for deletion." << LogEnd; CloseServiceHandle(hSCM); return false; } if (!DeleteService(hService)) { Log(Crit) << "Unable to delete " << ServiceName << " service." << LogEnd; CloseServiceHandle(hService); CloseServiceHandle(hSCM); return false; } CloseServiceHandle(hService); CloseServiceHandle(hSCM); Log(Notice) << "Service " << ServiceName << " has been uninstalled." << LogEnd; return result; } /* this method is called when service is being started (by service itself) */ bool TWinService::RunService() { SERVICE_TABLE_ENTRY st[] = { {ServiceName, ServiceMain}, {NULL, NULL} }; BOOL result = StartServiceCtrlDispatcher(st); return result?true:false; } /* this method is called from console, when someone wants to start service */ bool TWinService::StartService() { if (!IsInstalled()) { Log(Crit) << "Unable to start. Service " << ServiceName << " is not installed." << LogEnd; return false; } // open a handle to the SCM SC_HANDLE handle = ::OpenSCManager( NULL, NULL, SC_MANAGER_ALL_ACCESS ); if(!handle) { Log(Crit) << "Could not connect to SCM dataase" << LogEnd; return false; } // open a handle to the service SC_HANDLE service = ::OpenService( handle, ServiceName, GENERIC_EXECUTE ); if(!service) { ::CloseServiceHandle( handle ); Log(Crit) << "Could not get handle to " << ServiceName << " service" << LogEnd; return false; } // and start the service! if( !::StartService( service, 0, NULL ) ) { Log(Crit) << "Service " << ServiceName << " startup failed." << LogEnd; ::CloseServiceHandle( service ); ::CloseServiceHandle( handle ); return false; } Log(Notice) << "Service " << ServiceName << " started." << LogEnd; ::CloseServiceHandle( service ); ::CloseServiceHandle( handle ); return true; } bool TWinService::StopService() { if (!IsInstalled()) { Log(Crit) << "Unable to stop. Service " << ServiceName << " is not installed." << LogEnd; return false; } // open a handle to the SCM SC_HANDLE handle = ::OpenSCManager( NULL, NULL, SC_MANAGER_ALL_ACCESS ); if(!handle) { Log(Crit) << "Could not connect to SCM database" << LogEnd; return false; } // open a handle to the service SC_HANDLE service = ::OpenService( handle, ServiceName, GENERIC_EXECUTE ); if(!service) { ::CloseServiceHandle( handle ); Log(Crit) << "Unable to open service " << ServiceName << LogEnd; return false; } // send the STOP control request to the service SERVICE_STATUS status; ::ControlService( service, SERVICE_CONTROL_STOP, &status ); ::CloseServiceHandle( service ); ::CloseServiceHandle( handle ); if (status.dwCurrentState == SERVICE_STOP_PENDING) { Log(Notice) << "Service " << ServiceName << " stop process initialized." << LogEnd; return true; } if( status.dwCurrentState != SERVICE_STOPPED ) { Log(Crit) << "Service " << ServiceName << " stop failed." << LogEnd; return false; } Log(Notice) << "Service " << ServiceName << " stopped." << LogEnd; return true; } void TWinService::SetStatus(DWORD dwState) { Status.dwCurrentState = dwState; SetServiceStatus(hServiceStatus, &Status); } bool TWinService::Initialize() { // Start the initialization SetStatus(SERVICE_START_PENDING); // Perform the actual initialization bool result = OnInit(); // Set final state Status.dwWin32ExitCode = GetLastError(); Status.dwCheckPoint = 0; Status.dwWaitHint = 0; if (!result) { SetStatus(SERVICE_STOPPED); return false; } SetStatus(SERVICE_RUNNING); return true; } void TWinService::Run() { printf("WinService::Run()\n"); return; } bool TWinService::OnInit() { return true; } void TWinService::OnStop() { } void TWinService::OnInterrogate() { } void TWinService::OnPause() { } void TWinService::OnContinue() { } void TWinService::OnShutdown() { } bool TWinService::OnUserControl(DWORD dwOpcode) { return false; } int TWinService::getStatus() { return Status.dwCurrentState; } bool TWinService::isRunning() { return isRunning(this->ServiceName); } bool TWinService::isRunning(const char * name) { DWORD state = 0; // Open the Service Control Manager SC_HANDLE hSCM = ::OpenSCManager(NULL,NULL,SC_MANAGER_ALL_ACCESS); if (!hSCM) { //Log(Crit) << "Unable to open Service Control Manager." << LogEnd; return false; } // Try to open the service SC_HANDLE hService = OpenService(hSCM,name, GENERIC_READ); if (!hService) { //Log(Crit) << "Unable to open " << name << " service." << LogEnd; CloseServiceHandle(hSCM); return false; } SERVICE_STATUS service; LPSERVICE_STATUS ptr = &service; memset((void*)&service,0, sizeof(SERVICE_STATUS) ); if (QueryServiceStatus(hService, ptr)) { state = ptr->dwCurrentState; } CloseServiceHandle(hService); CloseServiceHandle(hSCM); switch (state) { case SERVICE_STOPPED: return false; case SERVICE_RUNNING: return true; case SERVICE_START_PENDING: default: return false; } return false; } void TWinService::showStatus() { bool serverInst, clientInst, relayInst; bool serverRun, clientRun, relayRun; serverInst = this->IsInstalled("DHCPv6Server"); clientInst = this->IsInstalled("DHCPv6Client"); relayInst = this->IsInstalled("DHCPv6Relay"); relayRun = this->isRunning("DHCPV6Relay"); serverRun = this->isRunning("DHCPv6Server"); clientRun = this->isRunning("DHCPv6Client"); Log(Notice) << "Dibbler server : " << (serverInst? "INSTALLED":"NOT INSTALLED") << ", " << (serverRun ? "RUNNING":"NOT RUNNING") << LogEnd; Log(Notice) << "Dibbler client : " << (clientInst? "INSTALLED":"NOT INSTALLED") << ", " << (clientRun ? "RUNNING":"NOT RUNNING") << LogEnd; Log(Notice) << "Dibbler relay : " << (relayInst ? "INSTALLED":"NOT INSTALLED") << ", " << (relayRun ? "RUNNING":"NOT RUNNING") << LogEnd; } bool TWinService::verifyPort() { // does this proper Dibbler port for this windows? OSVERSIONINFO verinfo; verinfo.dwOSVersionInfoSize=sizeof(OSVERSIONINFO); GetVersionEx(&verinfo); bool ok=false; if ((verinfo.dwMajorVersion==5) && (verinfo.dwMinorVersion==1)) { Log(Notice) << "Windows XP detected (majorVersion=" << verinfo.dwMajorVersion << ", minorVersion=" << verinfo.dwMinorVersion << "), so this is proper port." << LogEnd; ok = true; } if ((verinfo.dwMajorVersion==5) && (verinfo.dwMinorVersion==2)) { Log(Notice) << "Windows 2003 detected (majorVersion=" << verinfo.dwMajorVersion << ", minorVersion=" << verinfo.dwMinorVersion << "), so this is proper port." << LogEnd; ok = true; } if ((verinfo.dwMajorVersion==6) && (verinfo.dwMinorVersion==0)) { Log(Notice) << "Windows Vista detected (majorVersion=" << verinfo.dwMajorVersion << ", minorVersion=" << verinfo.dwMinorVersion << "), so this is proper port." << LogEnd; ok = true; } if ((verinfo.dwMajorVersion==6) && (verinfo.dwMinorVersion==1)) { Log(Notice) << "Windows7 detected (majorVersion=" << verinfo.dwMajorVersion << ", minorVersion=" << verinfo.dwMinorVersion << "), so this is proper port." << LogEnd; ok = true; } if ((verinfo.dwMajorVersion==6) && (verinfo.dwMinorVersion==2)) { Log(Notice) << "Windows 8 detected (majorVersion=" << verinfo.dwMajorVersion << ", minorVersion=" << verinfo.dwMinorVersion << "), so this is proper port." << LogEnd; ok = true; } if (!ok) { Log(Warning) << "Unsupported operating system detected (majorVersion=" << verinfo.dwMajorVersion << ", minorVersion=" << verinfo.dwMinorVersion << ")." << LogEnd; Log(Notice) << "Unsupported systems (there's separate Dibbler version for those systems):" << LogEnd; Log(Notice) << "Windows NT4: major<5 minor=0" << LogEnd; Log(Notice) << "Windows 2000: major=5 minor=0" << LogEnd; Log(Notice) << "Supported systems:" << LogEnd; Log(Notice) << "Windows XP: major=5 minor=1" << LogEnd; Log(Notice) << "Windows 2003: major=5 minor=2" << LogEnd; Log(Notice) << "Windows Vista: major=6 minor=0" << LogEnd; Log(Notice) << "Windows 7: major=6 minor=1" << LogEnd; Log(Notice) << "Windows 8: major=6 minor=2" << LogEnd; } return ok; } /// @brief Check if the running process has administrative privileges /// /// @return true if run as admin bool TWinService::isRunAsAdmin() { BOOL fIsRunAsAdmin = FALSE; PSID pAdministratorsGroup = NULL; // Allocate and initialize a SID of the administrators group. SID_IDENTIFIER_AUTHORITY NtAuthority = SECURITY_NT_AUTHORITY; if ( AllocateAndInitializeSid( &NtAuthority, 2, SECURITY_BUILTIN_DOMAIN_RID, DOMAIN_ALIAS_RID_ADMINS, 0, 0, 0, 0, 0, 0, &pAdministratorsGroup) ) { // Determine whether the SID of administrators group is enabled in // the primary access token of the process. CheckTokenMembership(NULL, pAdministratorsGroup, &fIsRunAsAdmin); // Cleanup for all allocated resources. FreeSid(pAdministratorsGroup); } return fIsRunAsAdmin == TRUE; } dibbler-1.0.1/Port-win32/client-win32.vs2013.vcxproj.filters0000644000175000017500000007346312304040124020163 00000000000000 {242774fd-4406-4970-8006-9b48c980c704} cpp;c;cxx;def;odl;idl;hpj;bat;asm {cc6e4705-b1d3-4206-b5dd-452f353117a7} {63b963f1-23b7-4458-a01f-a08827a06276} {3de376fe-4898-4c76-9dc5-10db1d0e5e73} {8f6f070d-f852-4bad-82a8-1405713bc5fa} {122a366b-8da3-4ee0-873f-8c7b9cafe5dc} {7644d6c4-f7bd-4318-a7a9-d18a54fcb55b} {8b268bd3-6927-4ad4-b9be-43b8c1e2d7c0} {15c2d4c7-7f03-49d1-a4ac-4a8039831ca3} {6686d70e-0aeb-4b24-9c2a-184004d1f178} {44a91e13-7b8b-4c01-bbee-28f52236980c} {caa8fe45-0cc1-4bf8-9622-efbc2dbf7b35} {db425f38-9c79-4b34-9a92-ff67049bd6da} h;hpp;hxx;hm;inl;inc {826fa36e-50fa-4316-a7ad-a7fc77697dbf} {ea1e644d-97de-48c3-9dd4-6588f3ab1729} {713d37ab-da4e-4f6b-aae4-f0acf44f0154} {775f1d38-c8ce-4227-9f48-801aad64a46f} {781d476a-c527-4ebe-8f9e-642577c51eef} {7ef828f9-4c68-4e46-9562-0da1c0cfc791} {4ae8858f-f57f-46a1-9043-ea51715ad697} {2f0d553b-9f2c-4e59-8af7-66865c655784} {3e2e835a-3c07-4c81-bae0-fcdbac59e42a} {b898bb45-2f62-4d3c-9b8a-34922f67e312} {ab3f67e7-9a2f-48b3-85e3-6e6930a01283} {81a7c10c-3b1c-420b-8ad7-13d456ec29ac} Source Files Source Files\AddrMgr Source Files\AddrMgr Source Files\AddrMgr Source Files\AddrMgr Source Files\AddrMgr Source Files\AddrMgr Source Files\IfaceMgr Source Files\IfaceMgr Source Files\IfaceMgr Source Files\IfaceMgr Source Files\IfaceMgr Source Files\IfaceMgr Source Files\Options Source Files\Options Source Files\Options Source Files\Options Source Files\Options Source Files\Options Source Files\Options Source Files\Options Source Files\Options Source Files\Options Source Files\Options Source Files\Options Source Files\Options Source Files\Options Source Files\Options Source Files\Options Source Files\Options Source Files\Options Source Files\Options Source Files\Options Source Files\Options Source Files\Options Source Files\Options Source Files\ClntOptions Source Files\ClntOptions Source Files\ClntOptions Source Files\ClntOptions Source Files\ClntOptions Source Files\ClntOptions Source Files\ClntOptions Source Files\ClntOptions Source Files\ClntOptions Source Files\ClntOptions Source Files\ClntOptions Source Files\ClntOptions Source Files\ClntOptions Source Files\ClntMessages Source Files\ClntMessages Source Files\ClntMessages Source Files\ClntMessages Source Files\ClntMessages Source Files\ClntMessages Source Files\ClntMessages Source Files\ClntMessages Source Files\ClntMessages Source Files\ClntMessages Source Files\ClntMessages Source Files\ClntMessages Source Files\ClntMessages Source Files\ClntMessages Source Files\ClntMessages Source Files\CfgMgr Source Files\CfgMgr Source Files\CfgMgr Source Files\misc Source Files\misc Source Files\misc Source Files\misc Source Files\misc Source Files\misc Source Files\misc Source Files\misc Source Files\misc Source Files\misc Source Files\misc Source Files\misc Source Files\misc Source Files\misc Source Files\misc Source Files\misc Source Files\port-win32 Source Files\port-win32 Source Files\port-win32 Source Files\port-win32 Source Files\poslib Source Files\poslib Source Files\poslib Source Files\poslib Source Files\poslib Source Files\poslib Source Files\poslib Source Files\poslib Source Files\poslib Source Files\poslib Source Files\poslib Source Files\ClntCfgMgr Source Files\ClntCfgMgr Source Files\ClntCfgMgr Source Files\ClntCfgMgr Source Files\ClntCfgMgr Source Files\ClntCfgMgr Source Files\ClntCfgMgr Source Files\ClntCfgMgr Source Files\ClntCfgMgr Source Files\ClntCfgMgr Source Files\ClntCfgMgr Source Files\nettle Source Files\nettle Source Files\nettle Source Files\nettle Source Files\nettle Source Files\nettle Source Files\nettle Source Files\nettle Source Files\ClntCfgMgr Header Files\AddrMgr Header Files\AddrMgr Header Files\AddrMgr Header Files\AddrMgr Header Files\AddrMgr Header Files\AddrMgr Header Files\IfaceMgr Header Files\IfaceMgr Header Files\IfaceMgr Header Files\IfaceMgr Header Files\IfaceMgr Header Files\CfgMgr Header Files\CfgMgr Header Files\CfgMgr Header Files\CfgMgr Header Files\Options Header Files\Options Header Files\Options Header Files\Options Header Files\Options Header Files\Options Header Files\Options Header Files\Options Header Files\Options Header Files\Options Header Files\Options Header Files\Options Header Files\Options Header Files\Options Header Files\Options Header Files\Options Header Files\Options Header Files\Options Header Files\Options Header Files\Options Header Files\Options Header Files\Options Header Files\Options Header Files\Options Header Files\ClntOptions Header Files\ClntOptions Header Files\ClntOptions Header Files\ClntOptions Header Files\ClntOptions Header Files\ClntOptions Header Files\ClntOptions Header Files\ClntOptions Header Files\ClntOptions Header Files\ClntOptions Header Files\ClntOptions Header Files\ClntOptions Header Files\ClntOptions Header Files\ClntMessages Header Files\ClntMessages Header Files\ClntMessages Header Files\ClntMessages Header Files\ClntMessages Header Files\ClntMessages Header Files\ClntMessages Header Files\ClntMessages Header Files\ClntMessages Header Files\ClntMessages Header Files\ClntMessages Header Files\misc Header Files\misc Header Files\misc Header Files\misc Header Files\misc Header Files\misc Header Files\misc Header Files\misc Header Files\misc Header Files\misc Header Files\misc Header Files\misc Header Files\misc Header Files\misc Header Files\misc Header Files\misc Header Files\port-win32 Header Files\port-win32 Header Files\port-win32 Header Files\port-win32 Header Files\poslib Header Files\poslib Header Files\poslib Header Files\poslib Header Files\poslib Header Files\poslib Header Files\poslib Header Files\poslib Header Files\ClntTransMgr Header Files\ClntCfgMgr Header Files\ClntCfgMgr Header Files\ClntCfgMgr Header Files\ClntCfgMgr Header Files\ClntCfgMgr Header Files\ClntCfgMgr Header Files\ClntCfgMgr Header Files\ClntCfgMgr Header Files\ClntCfgMgr Header Files\ClntCfgMgr Header Files\ClntCfgMgr Header Files\ClntCfgMgr Header Files\nettle Header Files\nettle Header Files\nettle Header Files\nettle Header Files\nettle Header Files\nettle Header Files\nettle Header Files\nettle Header Files\nettle Header Files\nettle dibbler-1.0.1/Port-win32/relay-win32.ico0000664000175000017500000000566612233256142014510 00000000000000 è& ¨( @€€€€€€€€€ÀÀÀ€€€ÿÿÿÿÿÿÿÿÿÿÿÿÌÌÌÌ ÌÌÌÌÌÌÀ" ÌÌÌÌÌÌ À"" ÌÌÌÌÀ Ì*¢¢ ÌÌÌÀ`ÌÀª**" ÌÌÌÌ Ì*ªª¢¢ ÌÌÌÌÌ"*ªªª" ÌÌÌÌÀ" ªªªª¢" ÌÌ "" §ªªª¢"ÎÀ """ zzªª""ììÂ"""""§§§ª¢".ÎÎÂbb"""§zzª".îîìâ&&"" ¯w§ª.îîîîÂrbb""zwzz¢îîîî'f&""" §w¢.îîîâvgbb"" ú§®îîîîî'"v&&" ÿúîîîîîîâÌ"rb" ÿïîîîîîâîìÌ'f" ÿþþ"îîî". Ì'f"ÿÿâ".îîâ⢠Âr"ÿþò¢.îîîî* Ì""ò*¢"îîîîâ¢ÌÌ *ª¢".îîîî,ÌÌÀ zª""îîîîìì̧÷ªª".â,îîÌÀ zª¢""",î̧÷ªªª¢""ÌÌ §÷ªªª¢",À ªzªª" ªªªªÿðÿÿ€ÿþü?øðàÀÀ€€€€€€ÀÀàðøü?þÿ€ÿÿðÿ( @€€€€€€€€€ÀÀÀÀÜÀðʦÔðÿ±âÿŽÔÿkÆÿH¸ÿ%ªÿªÿ’Üz¹b–Js2PÔãÿ±ÇÿŽ«ÿkÿHsÿ%WÿUÿIÜ=¹1–%sPÔÔÿ±±ÿŽŽÿkkÿHHÿ%%ÿþܹ–sPãÔÿDZÿ«ŽÿkÿsHÿW%ÿUÿIÜ=¹1–%sPðÔÿâ±ÿÔŽÿÆkÿ¸Hÿª%ÿªÿ’Üz¹b–Js2PÿÔÿÿ±ÿÿŽÿÿkÿÿHÿÿ%ÿþþÜܹ¹––ssPPÿÔðÿ±âÿŽÔÿkÆÿH¸ÿ%ªÿªÜ’¹z–bsJP2ÿÔãÿ±ÇÿŽ«ÿkÿHsÿ%WÿUÜI¹=–1s%PÿÔÔÿ±±ÿŽŽÿkkÿHHÿ%%þܹ–sPÿãÔÿDZÿ«ŽÿkÿsHÿW%ÿUÜI¹=–1s%PÿðÔÿâ±ÿÔŽÿÆkÿ¸Hÿª%ÿªÜ’¹z–bsJP2ÿÿÔÿÿ±ÿÿŽÿÿkÿÿHÿÿ%þþÜܹ¹––ssPPðÿÔâÿ±ÔÿŽÆÿk¸ÿHªÿ%ªÿ’Üz¹b–Js2PãÿÔÇÿ±«ÿŽÿksÿHWÿ%UÿIÜ=¹1–%sPÔÿÔ±ÿ±ŽÿŽkÿkHÿH%ÿ%þܹ–sPÔÿã±ÿÇŽÿ«kÿHÿs%ÿWÿUÜI¹=–1s%PÔÿð±ÿâŽÿÔkÿÆHÿ¸%ÿªÿªÜ’¹z–bsJP2Ôÿÿ±ÿÿŽÿÿkÿÿHÿÿ%ÿÿþþÜܹ¹––ssPPòòòæææÚÚÚÎÎζ¶¶ªªªžžž’’’†††zzznnnbbbVVVJJJ>>>222&&&ðûÿ¤  €€€ÿÿÿÿÿÿÿÿÿÿÿÿ~~~~~~~~~~~~~~~o~o~~~~½Çǽoooooooo~o~~½~~½ÇÇÇǽooo{o{oooo½Õ½~~½®®Ç®Çǽ½o{{o{ooo½«½~~~Ç®®Ç®Ç®ÇÇǽ{{{o{ooo½ooo½½Ç««®®®®Ç®Çǽ{{{{{{o{oo½½Õսǫ®«®®®®ÇÇǽ{{{{{{{oo½¼¼¼½Õ®«««®«®«®®ÇÇǽ{{{{{½o½Ç¼¼¼¼Õ½®«²««®«®®®ÇÇǽˆ{ˆ{½Ç½Ç¼Ç¼¼¼½Õ®²«²««®«®ÇÇÇÕˆ{ˆ{{ÕÇÇÇǼǼ¼¼Õ®²«²«²««®Çǽ½ˆ{ˆ{ˆ{Õ«¯«ÇǼǼ¼Õ½®²²«²«««Ç½½ˆˆˆˆˆˆ{ˆÕ¯«¯«¼Ç¼Ç¼½Õ®â²²«²««½†ˆ†ˆˆˆˆˆˆ{Õ²¯«¯«¼Ç¼¼¼½ ®²²²«²««½†ˆ†ˆ†ˆˆˆÕ²««¯«¯Ç¼Ç¼¼Õ Ž®²²²«½½†††ˆ†ˆ†ˆÕ²««²«¯«¯¯¼Ç¼Õ ŽŽ®®²®†“††††ˆ†ˆ†ˆÕ²¼¼²«¯«¯«Ç¼Õ âŽŽŽ®““†“††††ˆ†ˆ†ˆÕ{{¼¼²¯«¯Ç¼Õ Žâޓޓ““††††††ˆ†Õˆˆˆ{{{¼²««ÇÇÕ ŽâޓޓÕÕ††††ˆ“¼ÕÕ†Õ½{{¼²««ÇÇ âŽâŽ“ÕÇÇÕ†††††“¼†¼®Õ½{{¼²ÇǼ ŽâŽ“ŽÕ®ÇÕˆ††††ˆ†ˆ†¼®Õ½{{¼¼Ç¼ ŽâÕÕ®®ÇÇÕˆ††††ˆ†ˆ†¼®¼{{{{¼ âÕ«««®ÇÇÇÕˆ††††ˆ†ˆ†¼{{{{{{®²â²«®®ÇÇÇÕˆ††ˆ†ˆˆˆ†{ˆ{{{®²â²«®®®ÇÇÕˆ†ÕÕ{ˆˆˆˆ{{{®²â²««®®ÇÇÕÕÇÇÕÕ{ˆˆ{{®²â²«««®®®®ÇÇÇÇÕ{{{{®®²â²««««®®®ÇÇÇÕ{{®®®²â²«««®®ÇÇÕ®®®®®®®®ÿðÿÿ€ÿþü?øðàÀÀ€€€€€€ÀÀàðøü?þÿ€ÿÿðÿdibbler-1.0.1/Port-win32/resource1.h0000664000175000017500000000066712233256142014015 00000000000000//{{NO_DEPENDENCIES}} // Microsoft Visual C++ generated include file. // Used by client-win32.rc // #define IDI_ICON1 101 // Next default values for new objects // #ifdef APSTUDIO_INVOKED #ifndef APSTUDIO_READONLY_SYMBOLS #define _APS_NEXT_RESOURCE_VALUE 102 #define _APS_NEXT_COMMAND_VALUE 40001 #define _APS_NEXT_CONTROL_VALUE 1001 #define _APS_NEXT_SYMED_VALUE 101 #endif #endif dibbler-1.0.1/Port-win32/resource-requestor.h0000664000175000017500000000067412233256142015761 00000000000000//{{NO_DEPENDENCIES}} // Microsoft Visual C++ generated include file. // Used by dibbler-requestor.rc // #define IDI_ICON1 102 // Next default values for new objects // #ifdef APSTUDIO_INVOKED #ifndef APSTUDIO_READONLY_SYMBOLS #define _APS_NEXT_RESOURCE_VALUE 103 #define _APS_NEXT_COMMAND_VALUE 40001 #define _APS_NEXT_CONTROL_VALUE 1001 #define _APS_NEXT_SYMED_VALUE 101 #endif #endif dibbler-1.0.1/Port-win32/RelService.h0000664000175000017500000000126212233256142014140 00000000000000/* * Dibbler - a portable DHCPv6 * * authors: Tomasz Mrugalski * Marek Senderski * * released under GNU GPL v2 only licence */ #ifndef RELSERVICE_H #define RELSERVICE_H #include #include #include "winservice.h" #include "DHCPRelay.h" class TRelService; extern TRelService StaticService; class TRelService : public TWinService { public: TRelService(void); void Run(); void OnStop(); EServiceState ParseStandardArgs(int argc,char* argv[]); void setState(EServiceState status); static TRelService * getHandle() { return &StaticService; } ~TRelService(void); private: EServiceState status; }; #endifdibbler-1.0.1/Port-win32/ClntService.h0000664000175000017500000000123012233256142014311 00000000000000/* * Dibbler - a portable DHCPv6 * * authors: Tomasz Mrugalski * Marek Senderski * * released under GNU GPL v2 only licence */ #ifndef CLNTSERVICE_H #define CLNTSERVICE_H #include "winservice.h" class TClntService; extern TClntService StaticService; class TClntService : public TWinService { public: TClntService(void); void Run(); void OnStop(); void OnShutdown(); ~TClntService(void); EServiceState ParseStandardArgs(int argc, char* argv[]); void setState(EServiceState status); static TClntService * getHandle() { return &StaticService; } private: EServiceState status; }; #endif dibbler-1.0.1/Port-win32/Makefile.am0000644000175000017500000000177012360253736013771 00000000000000SUBDIRS = . dist_noinst_DATA = addrpack.c client-win32.cpp ClntService.cpp ClntService.h dibbler-config.h dist_noinst_DATA += client-win32.vs2013.rc client-win32.vs2013.vcxproj client-win32.vs2013.vcxproj.filters dist_noinst_DATA += dibbler-requestor.rc lowlevel-win32.c relay-win32.cpp stdbool.h dist_noinst_DATA += relay-win32.vs2013.rc relay-win32.vs2013.vcxproj relay-win32.vs2013.vcxproj.filters dist_noinst_DATA += RelService.cpp RelService.h dist_noinst_DATA += requestor-win32.vs2013.vcxproj requestor-win32.vs2013.vcxproj.filters dist_noinst_DATA += resource1.h resource2.h resource8.h resource.h dist_noinst_DATA += resource-requestor.h server-win32.cpp dist_noinst_DATA += server-win32.vs2013.rc server-win32.vs2013.vcxproj server-win32.vs2013.vcxproj.filters dist_noinst_DATA += SrvService.cpp SrvService.h unistd.h WinService.cpp WinService.h dist_noinst_DATA += client.log client-win32.ico dibbler.iss dibbler-win32.vs2013.sln relay.log dist_noinst_DATA += relay-win32.ico server.log server-win32.ico dibbler-1.0.1/Port-win32/client-win32.ico0000664000175000017500000000566612233256142014652 00000000000000 è& ¨( @€€€€€€€€€ÀÀÀ€€€ÿÿÿÿÿÿÿÿÿÿÿÿÌÌÌÌ ÌÌÌÌÌÌÀ" ÌÌÌÌÌÌ À"" ÌÌÌÌÀ Ì*¢¢ ÌÌÌÀ`ÌÀª**" ÌÌÌÌ Ì*ªª¢¢ ÌÌÌÌÌ"*ªªª" ÌÌÌÌÀ" ªªªª¢" ÌÌ "" §ªªª¢"ÎÀ """ zzªª""ììÂ"""""§§§ª¢".ÎÎÂbb"""§zzª".îîìâ&&"" ¯w§ª.îîîîÂrbb""zwzz¢îîîî'f&""" §w¢.îîîâvgbb"" ú§®îîîîî'"v&&" ÿúîîîîîîâÌ"rb" ÿïîîîîîâîìÌ'f" ÿþþ"îîî". Ì'f"ÿÿâ".îîâ⢠Âr"ÿþò¢.îîîî* Ì""ò*¢"îîîîâ¢ÌÌ *ª¢".îîîî,ÌÌÀ zª""îîîîìì̧÷ªª".â,îîÌÀ zª¢""",î̧÷ªªª¢""ÌÌ §÷ªªª¢",À ªzªª" ªªªªÿðÿÿ€ÿþü?øðàÀÀ€€€€€€ÀÀàðøü?þÿ€ÿÿðÿ( @€€€€€€€€€ÀÀÀÀÜÀðʦÔðÿ±âÿŽÔÿkÆÿH¸ÿ%ªÿªÿ’Üz¹b–Js2PÔãÿ±ÇÿŽ«ÿkÿHsÿ%WÿUÿIÜ=¹1–%sPÔÔÿ±±ÿŽŽÿkkÿHHÿ%%ÿþܹ–sPãÔÿDZÿ«ŽÿkÿsHÿW%ÿUÿIÜ=¹1–%sPðÔÿâ±ÿÔŽÿÆkÿ¸Hÿª%ÿªÿ’Üz¹b–Js2PÿÔÿÿ±ÿÿŽÿÿkÿÿHÿÿ%ÿþþÜܹ¹––ssPPÿÔðÿ±âÿŽÔÿkÆÿH¸ÿ%ªÿªÜ’¹z–bsJP2ÿÔãÿ±ÇÿŽ«ÿkÿHsÿ%WÿUÜI¹=–1s%PÿÔÔÿ±±ÿŽŽÿkkÿHHÿ%%þܹ–sPÿãÔÿDZÿ«ŽÿkÿsHÿW%ÿUÜI¹=–1s%PÿðÔÿâ±ÿÔŽÿÆkÿ¸Hÿª%ÿªÜ’¹z–bsJP2ÿÿÔÿÿ±ÿÿŽÿÿkÿÿHÿÿ%þþÜܹ¹––ssPPðÿÔâÿ±ÔÿŽÆÿk¸ÿHªÿ%ªÿ’Üz¹b–Js2PãÿÔÇÿ±«ÿŽÿksÿHWÿ%UÿIÜ=¹1–%sPÔÿÔ±ÿ±ŽÿŽkÿkHÿH%ÿ%þܹ–sPÔÿã±ÿÇŽÿ«kÿHÿs%ÿWÿUÜI¹=–1s%PÔÿð±ÿâŽÿÔkÿÆHÿ¸%ÿªÿªÜ’¹z–bsJP2Ôÿÿ±ÿÿŽÿÿkÿÿHÿÿ%ÿÿþþÜܹ¹––ssPPòòòæææÚÚÚÎÎζ¶¶ªªªžžž’’’†††zzznnnbbbVVVJJJ>>>222&&&ðûÿ¤  €€€ÿÿÿÿÿÿÿÿÿÿÿÿ~~~~~~~~~~~~~~~o~o~~~~½Çǽoooooooo~o~~½~~½ÇÇÇǽooo{o{oooo½Õ½~~½®®Ç®Çǽ½o{{o{ooo½«½~~~Ç®®Ç®Ç®ÇÇǽ{{{o{ooo½ooo½½Ç««®®®®Ç®Çǽ{{{{{{o{oo½½Õսǫ®«®®®®ÇÇǽ{{{{{{{oo½¼¼¼½Õ®«««®«®«®®ÇÇǽ{{{{{½o½Ç¼¼¼¼Õ½®«²««®«®®®ÇÇǽˆ{ˆ{½Ç½Ç¼Ç¼¼¼½Õ®²«²««®«®ÇÇÇÕˆ{ˆ{{ÕÇÇÇǼǼ¼¼Õ®²«²«²««®Çǽ½ˆ{ˆ{ˆ{Õ«¯«ÇǼǼ¼Õ½®²²«²«««Ç½½ˆˆˆˆˆˆ{ˆÕ¯«¯«¼Ç¼Ç¼½Õ®â²²«²««½†ˆ†ˆˆˆˆˆˆ{Õ²¯«¯«¼Ç¼¼¼½ ®²²²«²««½†ˆ†ˆ†ˆˆˆÕ²««¯«¯Ç¼Ç¼¼Õ Ž®²²²«½½†††ˆ†ˆ†ˆÕ²««²«¯«¯¯¼Ç¼Õ ŽŽ®®²®†“††††ˆ†ˆ†ˆÕ²¼¼²«¯«¯«Ç¼Õ âŽŽŽ®““†“††††ˆ†ˆ†ˆÕ{{¼¼²¯«¯Ç¼Õ Žâޓޓ““††††††ˆ†Õˆˆˆ{{{¼²««ÇÇÕ ŽâޓޓÕÕ††††ˆ“¼ÕÕ†Õ½{{¼²««ÇÇ âŽâŽ“ÕÇÇÕ†††††“¼†¼®Õ½{{¼²ÇǼ ŽâŽ“ŽÕ®ÇÕˆ††††ˆ†ˆ†¼®Õ½{{¼¼Ç¼ ŽâÕÕ®®ÇÇÕˆ††††ˆ†ˆ†¼®¼{{{{¼ âÕ«««®ÇÇÇÕˆ††††ˆ†ˆ†¼{{{{{{®²â²«®®ÇÇÇÕˆ††ˆ†ˆˆˆ†{ˆ{{{®²â²«®®®ÇÇÕˆ†ÕÕ{ˆˆˆˆ{{{®²â²««®®ÇÇÕÕÇÇÕÕ{ˆˆ{{®²â²«««®®®®ÇÇÇÇÕ{{{{®®²â²««««®®®ÇÇÇÕ{{®®®²â²«««®®ÇÇÕ®®®®®®®®ÿðÿÿ€ÿþü?øðàÀÀ€€€€€€ÀÀàðøü?þÿ€ÿÿðÿdibbler-1.0.1/Port-win32/resource2.h0000664000175000017500000000066712233256142014016 00000000000000//{{NO_DEPENDENCIES}} // Microsoft Visual C++ generated include file. // Used by server-win32.rc // #define IDI_ICON1 101 // Next default values for new objects // #ifdef APSTUDIO_INVOKED #ifndef APSTUDIO_READONLY_SYMBOLS #define _APS_NEXT_RESOURCE_VALUE 102 #define _APS_NEXT_COMMAND_VALUE 40001 #define _APS_NEXT_CONTROL_VALUE 1001 #define _APS_NEXT_SYMED_VALUE 101 #endif #endif dibbler-1.0.1/Port-win32/client.log0000664000175000017500000000000012233256142013672 00000000000000dibbler-1.0.1/Port-win32/resource8.h0000664000175000017500000000066612233256142014023 00000000000000//{{NO_DEPENDENCIES}} // Microsoft Visual C++ generated include file. // Used by relay-win32.rc // #define IDI_ICON1 101 // Next default values for new objects // #ifdef APSTUDIO_INVOKED #ifndef APSTUDIO_READONLY_SYMBOLS #define _APS_NEXT_RESOURCE_VALUE 102 #define _APS_NEXT_COMMAND_VALUE 40001 #define _APS_NEXT_CONTROL_VALUE 1001 #define _APS_NEXT_SYMED_VALUE 101 #endif #endif dibbler-1.0.1/Port-win32/server-win32.ico0000664000175000017500000000566612233256142014702 00000000000000 è& ¨( @€€€€€€€€€ÀÀÀ€€€ÿÿÿÿÿÿÿÿÿÿÿÿÌÌÌÌ ÌÌÌÌÌÌÀ" ÌÌÌÌÌÌ À"" ÌÌÌÌÀ Ì*¢¢ ÌÌÌÀ`ÌÀª**" ÌÌÌÌ Ì*ªª¢¢ ÌÌÌÌÌ"*ªªª" ÌÌÌÌÀ" ªªªª¢" ÌÌ "" §ªªª¢"ÎÀ """ zzªª""ììÂ"""""§§§ª¢".ÎÎÂbb"""§zzª".îîìâ&&"" ¯w§ª.îîîîÂrbb""zwzz¢îîîî'f&""" §w¢.îîîâvgbb"" ú§®îîîîî'"v&&" ÿúîîîîîîâÌ"rb" ÿïîîîîîâîìÌ'f" ÿþþ"îîî". Ì'f"ÿÿâ".îîâ⢠Âr"ÿþò¢.îîîî* Ì""ò*¢"îîîîâ¢ÌÌ *ª¢".îîîî,ÌÌÀ zª""îîîîìì̧÷ªª".â,îîÌÀ zª¢""",î̧÷ªªª¢""ÌÌ §÷ªªª¢",À ªzªª" ªªªªÿðÿÿ€ÿþü?øðàÀÀ€€€€€€ÀÀàðøü?þÿ€ÿÿðÿ( @€€€€€€€€€ÀÀÀÀÜÀðʦÔðÿ±âÿŽÔÿkÆÿH¸ÿ%ªÿªÿ’Üz¹b–Js2PÔãÿ±ÇÿŽ«ÿkÿHsÿ%WÿUÿIÜ=¹1–%sPÔÔÿ±±ÿŽŽÿkkÿHHÿ%%ÿþܹ–sPãÔÿDZÿ«ŽÿkÿsHÿW%ÿUÿIÜ=¹1–%sPðÔÿâ±ÿÔŽÿÆkÿ¸Hÿª%ÿªÿ’Üz¹b–Js2PÿÔÿÿ±ÿÿŽÿÿkÿÿHÿÿ%ÿþþÜܹ¹––ssPPÿÔðÿ±âÿŽÔÿkÆÿH¸ÿ%ªÿªÜ’¹z–bsJP2ÿÔãÿ±ÇÿŽ«ÿkÿHsÿ%WÿUÜI¹=–1s%PÿÔÔÿ±±ÿŽŽÿkkÿHHÿ%%þܹ–sPÿãÔÿDZÿ«ŽÿkÿsHÿW%ÿUÜI¹=–1s%PÿðÔÿâ±ÿÔŽÿÆkÿ¸Hÿª%ÿªÜ’¹z–bsJP2ÿÿÔÿÿ±ÿÿŽÿÿkÿÿHÿÿ%þþÜܹ¹––ssPPðÿÔâÿ±ÔÿŽÆÿk¸ÿHªÿ%ªÿ’Üz¹b–Js2PãÿÔÇÿ±«ÿŽÿksÿHWÿ%UÿIÜ=¹1–%sPÔÿÔ±ÿ±ŽÿŽkÿkHÿH%ÿ%þܹ–sPÔÿã±ÿÇŽÿ«kÿHÿs%ÿWÿUÜI¹=–1s%PÔÿð±ÿâŽÿÔkÿÆHÿ¸%ÿªÿªÜ’¹z–bsJP2Ôÿÿ±ÿÿŽÿÿkÿÿHÿÿ%ÿÿþþÜܹ¹––ssPPòòòæææÚÚÚÎÎζ¶¶ªªªžžž’’’†††zzznnnbbbVVVJJJ>>>222&&&ðûÿ¤  €€€ÿÿÿÿÿÿÿÿÿÿÿÿ~~~~~~~~~~~~~~~o~o~~~~½Çǽoooooooo~o~~½~~½ÇÇÇǽooo{o{oooo½Õ½~~½®®Ç®Çǽ½o{{o{ooo½«½~~~Ç®®Ç®Ç®ÇÇǽ{{{o{ooo½ooo½½Ç««®®®®Ç®Çǽ{{{{{{o{oo½½Õսǫ®«®®®®ÇÇǽ{{{{{{{oo½¼¼¼½Õ®«««®«®«®®ÇÇǽ{{{{{½o½Ç¼¼¼¼Õ½®«²««®«®®®ÇÇǽˆ{ˆ{½Ç½Ç¼Ç¼¼¼½Õ®²«²««®«®ÇÇÇÕˆ{ˆ{{ÕÇÇÇǼǼ¼¼Õ®²«²«²««®Çǽ½ˆ{ˆ{ˆ{Õ«¯«ÇǼǼ¼Õ½®²²«²«««Ç½½ˆˆˆˆˆˆ{ˆÕ¯«¯«¼Ç¼Ç¼½Õ®â²²«²««½†ˆ†ˆˆˆˆˆˆ{Õ²¯«¯«¼Ç¼¼¼½ ®²²²«²««½†ˆ†ˆ†ˆˆˆÕ²««¯«¯Ç¼Ç¼¼Õ Ž®²²²«½½†††ˆ†ˆ†ˆÕ²««²«¯«¯¯¼Ç¼Õ ŽŽ®®²®†“††††ˆ†ˆ†ˆÕ²¼¼²«¯«¯«Ç¼Õ âŽŽŽ®““†“††††ˆ†ˆ†ˆÕ{{¼¼²¯«¯Ç¼Õ Žâޓޓ““††††††ˆ†Õˆˆˆ{{{¼²««ÇÇÕ ŽâޓޓÕÕ††††ˆ“¼ÕÕ†Õ½{{¼²««ÇÇ âŽâŽ“ÕÇÇÕ†††††“¼†¼®Õ½{{¼²ÇǼ ŽâŽ“ŽÕ®ÇÕˆ††††ˆ†ˆ†¼®Õ½{{¼¼Ç¼ ŽâÕÕ®®ÇÇÕˆ††††ˆ†ˆ†¼®¼{{{{¼ âÕ«««®ÇÇÇÕˆ††††ˆ†ˆ†¼{{{{{{®²â²«®®ÇÇÇÕˆ††ˆ†ˆˆˆ†{ˆ{{{®²â²«®®®ÇÇÕˆ†ÕÕ{ˆˆˆˆ{{{®²â²««®®ÇÇÕÕÇÇÕÕ{ˆˆ{{®²â²«««®®®®ÇÇÇÇÕ{{{{®®²â²««««®®®ÇÇÇÕ{{®®®²â²«««®®ÇÇÕ®®®®®®®®ÿðÿÿ€ÿþü?øðàÀÀ€€€€€€ÀÀàðøü?þÿ€ÿÿðÿdibbler-1.0.1/Port-win32/relay-win32.vs2013.vcxproj.filters0000664000175000017500000003020112426742324020022 00000000000000 {fa97716e-c31f-4947-b024-506778284bd6} cpp;c;cxx;def;odl;idl;hpj;bat;asm {6852e24c-d14c-4a84-a766-0ef541bcfd7f} {85448e6f-5b56-4096-af97-4cb036474d71} {c6a9fae6-3663-4dc9-bc95-e6c6460cce71} {3da7be29-e90c-419a-b708-9098213709a8} {497f4be9-f5e8-49fe-b55c-e34786bfce27} {21012a27-8156-4bfa-bf79-54565e3fa573} {a629b57b-ddaf-44cd-b0eb-7e8a5684c64d} {e69b2e55-ebe4-4395-9127-c62a553d2942} h;hpp;hxx;hm;inl;inc {f9ac314a-6c1e-4344-a178-ec6d8f2df4d1} {4cd43b74-87ab-44f6-81cd-b7459ceba1a5} {754bae33-4ac9-46d6-bc77-780a2de225d2} {61a91dac-14d5-4e5d-b524-bb496ef6559c} {59384773-d48f-4033-a82c-abe140619517} {34708bc3-9225-4587-a873-23f476d7ccbf} {a74a0f8b-7d3b-4b96-a923-3157385d5d58} {c23ca751-ab66-4ffe-b65c-4b48316e7abc} Source Files Source Files\IfaceMgr Source Files\IfaceMgr Source Files\IfaceMgr Source Files\IfaceMgr Source Files\Options Source Files\Options Source Files\Options Source Files\Options Source Files\Options Source Files\Options Source Files\Options Source Files\Options Source Files\Options Source Files\Options Source Files\RelOptions Source Files\RelOptions Source Files\RelOptions Source Files\RelOptions Source Files\RelOptions Source Files\RelMessages Source Files\RelMessages Source Files\RelMessages Source Files\RelMessages Source Files\RelMessages Source Files\CfgMgr Source Files\CfgMgr Source Files\CfgMgr Source Files\CfgMgr Source Files\CfgMgr Source Files\CfgMgr Source Files\CfgMgr Source Files\misc Source Files\misc Source Files\misc Source Files\misc Source Files\misc Source Files\misc Source Files\misc Source Files\misc Source Files\misc Source Files\misc Source Files\port-win32 Source Files\port-win32 Source Files\port-win32 Source Files\port-win32 Source Files\Options Header Files Header Files\IfaceMgr Header Files\IfaceMgr Header Files\IfaceMgr Header Files\IfaceMgr Header Files\Options Header Files\Options Header Files\Options Header Files\Options Header Files\RelOptions Header Files\RelOptions Header Files\RelOptions Header Files\CfgMgr Header Files\CfgMgr Header Files\CfgMgr Header Files\CfgMgr Header Files\CfgMgr Header Files\CfgMgr Header Files\CfgMgr Header Files\misc Header Files\misc Header Files\misc Header Files\misc Header Files\misc Header Files\misc Header Files\misc Header Files\misc Header Files\misc Header Files\misc Header Files\misc Header Files\port-win32 Header Files\port-win32 Header Files\Messages Header Files\Messages Header Files\Messages Header Files\Messages Header Files\RelTransMgr Header Files\Options dibbler-1.0.1/Port-win32/requestor-win32.vs2013.vcxproj.filters0000644000175000017500000001603012304040124020721 00000000000000 {4FC737F1-C7A5-4376-A066-2A32D752A2FF} cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx {e422e90a-1d0c-43c9-adf3-e3c1044cf99d} {224699c7-4f32-4c48-88ce-bde18088c0ba} {6774e933-cee9-4e1a-81da-b19a9736f60a} {f45a4385-34c7-4657-ae86-0e098329f769} {4d7a2f8d-4a96-407b-85c6-18cad89fb8f3} {37fce8c8-fea1-44eb-996d-8d7f65677a14} {93995380-89BD-4b04-88EB-625FBE52EBFB} h;hpp;hxx;hm;inl;inc;xsd {453e4546-8b15-4947-8c01-3007edce0838} {d354f265-711f-4940-a2b7-898a43a7f283} {0c2f282f-fcd9-430d-a98a-1dc53dbc21c0} {6839000f-9323-4959-9fb0-e1255af2886c} {aabb7910-6759-431f-ad36-a90a9a5cdd84} Source Files\port-win32 Source Files\Requestor Source Files\Requestor Source Files\Requestor Source Files\Requestor Source Files\Requestor Source Files\Misc Source Files\Misc Source Files\Misc Source Files\Misc Source Files\Misc Source Files\Misc Source Files\Misc Source Files\Misc Source Files\Messages Source Files\Options Source Files\Options Source Files\Options Source Files\Options Source Files\Options Source Files\Options Source Files\Options Source Files\Options Source Files\IfaceMgr Source Files\IfaceMgr Source Files\IfaceMgr Header Files Header Files Header Files\Requestor Header Files\Requestor Header Files\Requestor Header Files\Requestor Header Files\IfaceMgr Header Files\IfaceMgr Header Files\IfaceMgr Header Files\Misc Header Files\Misc Header Files\Misc Header Files\Messages Header Files\Options Header Files\Options Header Files\Options Header Files\Options Header Files\Options dibbler-1.0.1/Port-win32/relay-win32.vs2013.rc0000644000175000017500000000037312277722750015276 00000000000000// Microsoft Visual C++ generated resource script. // #include "resource8.h" // Icon with lowest ID value placed first to ensure application icon // remains consistent on all systems. IDI_ICON1 ICON "relay-win32.ico" dibbler-1.0.1/Port-win32/dibbler-config.h0000644000175000017500000000506612277722750014762 00000000000000/* Misc/dibbler-config.h. Generated from dibbler-config.h.in by configure. */ /* Misc/dibbler-config.h.in. Generated from configure.in by autoheader. */ /* machine is bigendian */ /* #undef ENDIAN_BIG */ /* machine is littleendian */ #define ENDIAN_LITTLE 1 /* Define to 1 if you have the header file. */ #define HAVE_DLFCN_H 1 /* Define to 1 if you have the `gethostbyname' function. */ #define HAVE_GETHOSTBYNAME 1 /* Define to 1 if you have the `gethostname' function. */ #define HAVE_GETHOSTNAME 1 /* Define to 1 if you have the `inet_aton' function. */ #define HAVE_INET_ATON 1 #define HAVE_SOCKADDR_STORAGE 1 #define HAVE_IPV6 /* Define to 1 if you have the header file. */ // #define HAVE_INTTYPES_H 1 // not available in WIN32 /* Define to 1 if you have the header file. */ #define HAVE_MEMORY_H 1 /* Define to 1 if you have the `select' function. */ #define HAVE_SELECT 1 /* Define to 1 if you have the `socket' function. */ #define HAVE_SOCKET 1 /* Define to 1 if you have the header file. */ #define HAVE_STDINT_H 1 /* Define to 1 if you have the header file. */ #define HAVE_STDLIB_H 1 /* Define to 1 if you have the header file. */ #define HAVE_STRINGS_H 1 /* Define to 1 if you have the header file. */ #define HAVE_STRING_H 1 /* Define to 1 if you have the header file. */ #define HAVE_SYS_STAT_H 1 /* Define to 1 if you have the header file. */ #define HAVE_SYS_TYPES_H 1 /* Define to 1 if you have the header file. */ #define HAVE_UNISTD_H 1 /* Define to the sub-directory in which libtool stores uninstalled libraries. */ #define LT_OBJDIR ".libs/" /* Define to the address where bug reports for this package should be sent. */ #define PACKAGE_BUGREPORT "" /* Define to the full name of this package. */ #define PACKAGE_NAME "" /* Define to the full name and version of this package. */ #define PACKAGE_STRING "" /* Define to the one symbol short name of this package. */ #define PACKAGE_TARNAME "" /* Define to the home page for this package. */ #define PACKAGE_URL "" /* Define to the version of this package. */ #define PACKAGE_VERSION "" /* Define to 1 if you have the ANSI C header files. */ #define STDC_HEADERS 1 /* Define WORDS_BIGENDIAN to 1 if your processor stores words with the most significant byte first (like Motorola and SPARC, unlike Intel). */ #if defined AC_APPLE_UNIVERSAL_BUILD # if defined __BIG_ENDIAN__ # define WORDS_BIGENDIAN 1 # endif #else # ifndef WORDS_BIGENDIAN /* # undef WORDS_BIGENDIAN */ # endif #endif dibbler-1.0.1/Port-win32/relay-win32.cpp0000664000175000017500000000666312426742324014524 00000000000000/* * Dibbler - a portable DHCPv6 * * authors: Tomasz Mrugalski * Marek Senderski * changes: Hernan Martinez * * Released under GNU GPL v2 licence * */ #include #include #include #include #include "Portable.h" #include "DHCPRelay.h" #include "WinService.h" #include "RelService.h" #include "Logger.h" extern "C" int lowlevelInit(); extern TDHCPRelay * relPtr; using namespace std; void usage() { cout << "Usage:" << endl; cout << " dibbler-relay.exe ACTION [-d c:\\path\\to\\config\\file]" << endl << " ACTION = status|start|stop|install|uninstall|run" << endl << " status - show status and exit" << endl << " start - start installed service" << endl << " stop - stop installed service" << endl << " install - install service" << endl << " uninstall - uninstall service" << endl << " run - run in console" << endl << endl << " -d parameter is optional." << endl; } /* * Handle the CTRL-C, CTRL-BREAK signal. */ BOOL CtrlHandler( DWORD fdwCtrlType ) { switch( fdwCtrlType ) { case CTRL_C_EVENT: { relPtr->stop(); return TRUE; } case CTRL_BREAK_EVENT: return FALSE; } return TRUE; } int main(int argc, char* argv[]) { cout << DIBBLER_COPYRIGHT1 << " (RELAY, WinXP/2003/Vista/7/8 port)" << endl; cout << DIBBLER_COPYRIGHT2 << endl; cout << DIBBLER_COPYRIGHT3 << endl; cout << DIBBLER_COPYRIGHT4 << endl; cout << endl; // get the service object TRelService * RelService = TRelService::getHandle(); WSADATA wsaData; if( WSAStartup( MAKEWORD( 2, 2 ), &wsaData )) { cout<<"Unable to load WinSock 2.2"<ParseStandardArgs(argc, argv); RelService->setState(status); // is this proper port? if (!RelService->verifyPort()) { Log(Crit) << "Operating system version is not supported by this Dibbler port." << LogEnd; return -1; } SetConsoleCtrlHandler( (PHANDLER_ROUTINE) CtrlHandler, TRUE ); // Check for administrative privileges for some of the actions switch ( status ) { case START: case STOP: case INSTALL: case UNINSTALL: if ( !RelService->isRunAsAdmin() ) { Log(Crit) << RelService->ADMIN_REQUIRED_STR << LogEnd; return -1; } break; default: break; } switch (status) { case STATUS: { RelService->showStatus(); break; }; case START: { RelService->StartService(); break; } case STOP: { RelService->StopService(); break; } case INSTALL: { RelService->Install(); break; } case UNINSTALL: { RelService->Uninstall(); break; } case RUN: { RelService->Run(); break; } case SERVICE: { RelService->RunService(); break; } case INVALID: { Log(Crit) << "Invalid usage." << endl; // No break here; fall through to help } case HELP: default: { usage(); } } return 0; } dibbler-1.0.1/Port-win32/relay-win32.vs2013.vcxproj0000664000175000017500000006377512426742324016401 00000000000000 Debug32 Win32 Debug32 x64 Debug64 Win32 Debug64 x64 Release32 Win32 Release32 x64 Release64 Win32 Release64 x64 relay-win32 {F3D13220-6D1A-43A5-B753-AA107DAC773D} ManagedCProj Application v120_xp MultiByte false Application v120_xp MultiByte false Application v120_xp MultiByte false Application v120_xp MultiByte false Application v120_xp MultiByte false Application v120_xp MultiByte false Application v120_xp MultiByte false Application v120_xp MultiByte false <_ProjectFileVersion>12.0.21005.1 $(SolutionDir)\$(Configuration)\bin\ $(Configuration)\$(TargetName).obj\ true false dibbler-relay true false dibbler-relay $(SolutionDir)\$(Configuration)\bin\ $(Configuration)\$(TargetName).obj\ true false dibbler-relay true false dibbler-relay $(SolutionDir)\$(Configuration)\bin\ $(Configuration)\$(TargetName).obj\ true false dibbler-relay $(SolutionDir)\$(Configuration)\bin\ $(Configuration)\$(TargetName).obj\ true false dibbler-relay true false dibbler-relay true false dibbler-relay /MP /J %(AdditionalOptions) Disabled ..;.;include;..\TransMgr;..\RelTransMgr;..\RelOptions;..\RelMessages;..\RelIfaceMgr;..\RelCfgMgr;..\Options;..\Misc;..\Messages;..\IfaceMgr;..\CfgMgr;%(AdditionalIncludeDirectories) WIN32;MOD_DISABLE_AUTH;_DEBUG;%(PreprocessorDefinitions) false Default MultiThreadedDebug true Level3 ProgramDatabase 4996;%(DisableSpecificWarnings) ws2_32.lib;Iphlpapi.lib;%(AdditionalDependencies) $(OutDir)$(TargetName)$(TargetExt) true false Console /MP /J %(AdditionalOptions) Disabled ..;.;include;..\TransMgr;..\RelTransMgr;..\RelOptions;..\RelMessages;..\RelIfaceMgr;..\RelCfgMgr;..\Options;..\Misc;..\Messages;..\IfaceMgr;..\CfgMgr;%(AdditionalIncludeDirectories) WIN32;MOD_DISABLE_AUTH;_DEBUG;%(PreprocessorDefinitions) false Default MultiThreadedDebug true Level3 ProgramDatabase 4996;%(DisableSpecificWarnings) ws2_32.lib;Iphlpapi.lib;%(AdditionalDependencies) $(OutDir)$(TargetName)$(TargetExt) true false Console /MP /J %(AdditionalOptions) Disabled ..;.;include;..\TransMgr;..\RelTransMgr;..\RelOptions;..\RelMessages;..\RelIfaceMgr;..\RelCfgMgr;..\Options;..\Misc;..\Messages;..\IfaceMgr;..\CfgMgr;%(AdditionalIncludeDirectories) WIN32;MOD_DISABLE_AUTH;_DEBUG;%(PreprocessorDefinitions) false Default MultiThreadedDebug true Level3 ProgramDatabase 4996;%(DisableSpecificWarnings) ws2_32.lib;Iphlpapi.lib;%(AdditionalDependencies) $(OutDir)$(TargetName)$(TargetExt) true false Console /MP /J %(AdditionalOptions) Disabled ..;.;include;..\TransMgr;..\RelTransMgr;..\RelOptions;..\RelMessages;..\RelIfaceMgr;..\RelCfgMgr;..\Options;..\Misc;..\Messages;..\IfaceMgr;..\CfgMgr;%(AdditionalIncludeDirectories) WIN32;MOD_DISABLE_AUTH;_DEBUG;%(PreprocessorDefinitions) false Default MultiThreadedDebug true Level3 ProgramDatabase 4996;%(DisableSpecificWarnings) ws2_32.lib;Iphlpapi.lib;%(AdditionalDependencies) $(OutDir)$(TargetName)$(TargetExt) true false Console /MP /J %(AdditionalOptions) MaxSpeed OnlyExplicitInline ..;.;include;..\TransMgr;..\RelTransMgr;..\RelOptions;..\RelMessages;..\RelIfaceMgr;..\RelCfgMgr;..\Options;..\Misc;..\Messages;..\IfaceMgr;..\CfgMgr;%(AdditionalIncludeDirectories) WIN32;MOD_DISABLE_AUTH;%(PreprocessorDefinitions) false MultiThreaded Level3 ProgramDatabase 4996;%(DisableSpecificWarnings) ws2_32.lib;Iphlpapi.lib;%(AdditionalDependencies) $(OutDir)$(TargetName)$(TargetExt) true false Console /MP /J %(AdditionalOptions) MaxSpeed OnlyExplicitInline ..;.;include;..\TransMgr;..\RelTransMgr;..\RelOptions;..\RelMessages;..\RelIfaceMgr;..\RelCfgMgr;..\Options;..\Misc;..\Messages;..\IfaceMgr;..\CfgMgr;%(AdditionalIncludeDirectories) WIN32;MOD_DISABLE_AUTH;%(PreprocessorDefinitions) false MultiThreaded Level3 ProgramDatabase 4996;%(DisableSpecificWarnings) ws2_32.lib;Iphlpapi.lib;%(AdditionalDependencies) $(OutDir)$(TargetName)$(TargetExt) true false Console /MP /J %(AdditionalOptions) MaxSpeed OnlyExplicitInline ..;.;include;..\TransMgr;..\RelTransMgr;..\RelOptions;..\RelMessages;..\RelIfaceMgr;..\RelCfgMgr;..\Options;..\Misc;..\Messages;..\IfaceMgr;..\CfgMgr;%(AdditionalIncludeDirectories) WIN32;MOD_DISABLE_AUTH;%(PreprocessorDefinitions) false MultiThreaded Level3 ProgramDatabase 4996;%(DisableSpecificWarnings) ws2_32.lib;Iphlpapi.lib;%(AdditionalDependencies) $(OutDir)$(TargetName)$(TargetExt) true false Console /MP /J %(AdditionalOptions) MaxSpeed OnlyExplicitInline ..;.;include;..\TransMgr;..\RelTransMgr;..\RelOptions;..\RelMessages;..\RelIfaceMgr;..\RelCfgMgr;..\Options;..\Misc;..\Messages;..\IfaceMgr;..\CfgMgr;%(AdditionalIncludeDirectories) WIN32;MOD_DISABLE_AUTH;%(PreprocessorDefinitions) false MultiThreaded Level3 ProgramDatabase 4996;%(DisableSpecificWarnings) ws2_32.lib;Iphlpapi.lib;%(AdditionalDependencies) $(OutDir)$(TargetName)$(TargetExt) true false Console {b4a3663c-44d7-46d2-b397-9d7e0e4eb557} false dibbler-1.0.1/Port-win32/SrvService.cpp0000644000175000017500000001043712277722750014540 00000000000000/* * Dibbler - a portable DHCPv6 * * authors: Tomasz Mrugalski * Marek Senderski * * Released under GNU GPL v2 licence * */ #include #include #include #include "SrvService.h" #include "DHCPClient.h" #include "Logger.h" #include "DHCPConst.h" TDHCPServer * srvPtr; TSrvService StaticService; using namespace std; TSrvService::TSrvService() : TWinService("DHCPv6Server","Dibbler - a DHCPv6 server",SERVICE_AUTO_START, "RpcSS\0tcpip6\0winmgmt\0", "Dibbler - a portable DHCPv6. This is DHCPv6 server, version " DIBBLER_VERSION ".") { // Depend on 'tcpip6' service only if it's Windows XP or Windows 2003. // Vista and above have IPv6 in the TCP stack and it's not a standalone service. OSVERSIONINFO verinfo; verinfo.dwOSVersionInfoSize=sizeof(OSVERSIONINFO); GetVersionEx(&verinfo); char dependenciesV5[] = "RpcSS\0tcpip6\0winmgmt\0"; char dependenciesV6[] = "RpcSS\0winmgmt\0"; if( verinfo.dwMajorVersion <= 5 ) memcpy(Dependencies, dependenciesV5, sizeof(dependenciesV5)); else memcpy(Dependencies, dependenciesV6, sizeof(dependenciesV6)); } EServiceState TSrvService::ParseStandardArgs(int argc,char* argv[]) { bool dirFound = false; EServiceState status = INVALID; int n=1; while (nstop(); } void TSrvService::Run() { if (_chdir(this->ServiceDir.c_str())) { Log(Crit) << "Unable to change directory to " << this->ServiceDir << ". Aborting.\n" << LogEnd; return; } string confile = SRVCONF_FILE; string oldconf = SRVCONF_FILE+(string)"-old"; string workdir = this->ServiceDir; string addrfile = SRVADDRMGR_FILE; string logFile = SRVLOG_FILE; logger::setLogName("Srv"); logger::Initialize((char*)logFile.c_str()); Log(Crit) << DIBBLER_COPYRIGHT1 << " (SERVER, WinXP/2003/Vista/Win7 port)" << LogEnd; TDHCPServer server(confile); srvPtr = &server; // remember address server.setWorkdir(this->ServiceDir); if (!server.isDone()) server.run(); } void TSrvService::setState(EServiceState status) { this->status = status; } dibbler-1.0.1/Port-win32/lowlevel-win32.c0000644000175000017500000005122212351545450014664 00000000000000/* * Dibbler - a portable DHCPv6 * * authors: Tomasz Mrugalski * Marek Senderski * * released under GNU GPL v2 licence * */ #define WIN32_LEAN_AND_MEAN /* tells stdlib.h to include rand_s - more secure version */ #define _CRT_RAND_S #include /* causes compilation errors on Visual Studio 2008 because of IPAddr type being undefined */ /* commented out for now */ /* #include */ #include #include #include #include #include #include #include #include #include #include #include #include "Portable.h" #include "DHCPConst.h" char netshPath[256]; char cmdPath[256]; #define ERROR_MESSAGE_SIZE 1024 static char Message[ERROR_MESSAGE_SIZE] = {0}; static void error_message_set(int errCode); static void error_message_set_string(char *str); /* Find netsh.exe */ int lowlevelInit() { char buf[256]; FILE *f; int i; i = GetEnvironmentVariable("SYSTEMROOT",buf, 256); if (!i) { error_message_set_string("Environment variable SYSTEMROOT not set.\n"); return 0; } strcpy(buf+i,"\\system32\\netsh.exe"); if (!(f=fopen(buf,"r"))) { sprintf(Message, "Unable to open %s file.\n",buf); return 0; } fclose(f); memcpy(netshPath, buf,256); strcpy(buf+i,"\\system32\\cmd.exe"); memcpy(cmdPath, buf,256); return 1; } /* when updating this file, remember to also update copy in Port-winnt2k/lowlevel-winnt2k.c */ uint32_t getAAASPIfromFile() { char filename[1024]; struct stat st; uint32_t ret; FILE *file; strcpy(filename, "AAA-SPI"); if (stat(filename, &st)) return 0; file = fopen(filename, "r"); if (!file) return 0; fscanf(file, "%10x", &ret); fclose(file); return ret; } /* when updating this file, remember to also update copy in Port-winnt2k/lowlevel-winnt2k.c */ char * getAAAKeyFilename(uint32_t SPI) { static char filename[1024]; if (SPI) snprintf(filename, 1024, "%s%s%x", "", "AAA-key-", SPI); else strcpy(filename, "AAA-key"); return filename; } /* when updating this file, remember to also update copy in Port-winnt2k/lowlevel-winnt2k.c */ char * getAAAKey(uint32_t SPI, uint32_t *len) { char * filename; struct stat st; char * retval; int offset = 0; int fd; int ret; filename = getAAAKeyFilename(SPI); if (stat(filename, &st)) return NULL; fd = open(filename, O_RDONLY); if (0 > fd) return NULL; retval = malloc(st.st_size); if (!retval) return NULL; while (offset < st.st_size) { ret = read(fd, retval + offset, st.st_size - offset); if (!ret) break; if (ret < 0) { free(retval); return NULL; } offset += ret; } close(fd); if (offset != st.st_size) { free(retval); return NULL; } *len = st.st_size; return retval; } char * error_message() { return Message; } void error_message_set(int errCode) { char tmp[ERROR_MESSAGE_SIZE-10]; FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS | FORMAT_MESSAGE_MAX_WIDTH_MASK, NULL, errCode, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPSTR)tmp, ERROR_MESSAGE_SIZE-10, NULL); sprintf(Message, "Error %d: %s\n", errCode, tmp); } void error_message_set_string(char *str) { strncpy(Message, str, ERROR_MESSAGE_SIZE); } void if_list_release(struct iface * list) { struct iface * tmp; while (list) { tmp = list->next; if (list->linkaddrcount) free(list->linkaddr); free(list); list = tmp; } } extern struct iface* if_list_get() { char* buffer=NULL; unsigned long buflen; struct iface* iface; struct iface* retval; struct sockaddr_in6 *addrpck; char* addr; char * gaddr; int linkLocalAddrCnt; int globalAddrCnt; PIP_ADAPTER_ADDRESSES adaptaddr; PIP_ADAPTER_UNICAST_ADDRESS linkaddr; buflen=0; GetAdaptersAddresses(AF_INET6, GAA_FLAG_SKIP_ANYCAST|GAA_FLAG_SKIP_MULTICAST|GAA_FLAG_SKIP_DNS_SERVER, NULL, (PIP_ADAPTER_ADDRESSES) buffer, &buflen); if (!buflen) { // no interfaces found. Probably IPv6 is not installed. return NULL; } buffer=(char*)malloc(buflen); GetAdaptersAddresses(AF_INET6,GAA_FLAG_SKIP_ANYCAST|GAA_FLAG_SKIP_MULTICAST |GAA_FLAG_SKIP_DNS_SERVER,NULL,(PIP_ADAPTER_ADDRESSES) buffer,&buflen); adaptaddr=(PIP_ADAPTER_ADDRESSES) buffer; retval=iface=(struct iface*) malloc(sizeof(struct iface)); while(adaptaddr){ //set interface name and id WideCharToMultiByte( CP_ACP, 0, adaptaddr->FriendlyName, -1, iface->name,MAX_IFNAME_LENGTH, NULL, NULL ); iface->id=adaptaddr->IfIndex; iface->id=adaptaddr->Ipv6IfIndex; //set hardware type of interface iface->hardwareType=adaptaddr->IfType; //set physical address - require during DUID generation memcpy(iface->mac,adaptaddr->PhysicalAddress,adaptaddr->PhysicalAddressLength); //set link local addresses available on interface iface->maclen=adaptaddr->PhysicalAddressLength; iface->globaladdrcount = 0; iface->globaladdr = 0; linkaddr=adaptaddr->FirstUnicastAddress; //for evert unicast address on iface linkLocalAddrCnt= 0; globalAddrCnt = 0; while(linkaddr) { addrpck=(struct sockaddr_in6*)linkaddr->Address.lpSockaddr; if (IN6_IS_ADDR_LINKLOCAL(( (struct in6_addr*) (&addrpck->sin6_addr)))) { linkLocalAddrCnt++; } else { globalAddrCnt++; } linkaddr=linkaddr->Next; } iface->linkaddrcount = linkLocalAddrCnt; iface->globaladdrcount = globalAddrCnt; iface->linkaddr = NULL; iface->globaladdr = NULL; iface->linkaddr = (char*) malloc(linkLocalAddrCnt*16); iface->globaladdr = (char*) malloc(globalAddrCnt*16); addr = iface->linkaddr; gaddr= iface->globaladdr; linkaddr=adaptaddr->FirstUnicastAddress; while(linkaddr) { addrpck=(struct sockaddr_in6*)linkaddr->Address.lpSockaddr; if (IN6_IS_ADDR_LINKLOCAL(( (struct in6_addr*) (&addrpck->sin6_addr)))) { memcpy(addr,&(addrpck->sin6_addr),16); addr+=16; } else { memcpy(gaddr, &(addrpck->sin6_addr), 16); gaddr+=16; } linkaddr=linkaddr->Next; } //set interface flags iface->flags=0; if (adaptaddr->OperStatus == IfOperStatusUp) iface->flags |= IFF_UP|IFF_RUNNING|IFF_MULTICAST; if (adaptaddr->IfType==IF_TYPE_SOFTWARE_LOOPBACK) iface->flags |= IFF_LOOPBACK; //go to next returned adapter if (adaptaddr->Next) iface->next=(struct iface*) malloc(sizeof(struct iface)); else iface->next=NULL; adaptaddr=adaptaddr->Next; iface=iface->next; } free(buffer); return retval; } extern int is_addr_tentative(char* ifacename, int iface, char* plainAddr) { char* buffer=NULL; struct sockaddr_in6 *addrpck; PIP_ADAPTER_ADDRESSES adaptaddr; PIP_ADAPTER_UNICAST_ADDRESS linkaddr; char netAddr[16]; unsigned long buflen=0; PIP_ADAPTER_UNICAST_ADDRESS found=NULL; inet_pton6(plainAddr,netAddr); GetAdaptersAddresses(AF_INET6,GAA_FLAG_SKIP_ANYCAST|GAA_FLAG_SKIP_MULTICAST |GAA_FLAG_SKIP_DNS_SERVER,NULL,(PIP_ADAPTER_ADDRESSES) buffer,&buflen); buffer=(char*)malloc(buflen); GetAdaptersAddresses(AF_INET6,GAA_FLAG_SKIP_ANYCAST|GAA_FLAG_SKIP_MULTICAST |GAA_FLAG_SKIP_DNS_SERVER,NULL,(PIP_ADAPTER_ADDRESSES) buffer,&buflen); adaptaddr=(PIP_ADAPTER_ADDRESSES) buffer; while(adaptaddr&&(!found)) { linkaddr=adaptaddr->FirstUnicastAddress; //for evert unicast address on iface while(linkaddr&&(!found)) { addrpck=(struct sockaddr_in6*)linkaddr->Address.lpSockaddr; if (!memcmp((struct in6_addr*)(&addrpck->sin6_addr),netAddr,16)) found=linkaddr; linkaddr=linkaddr->Next; } adaptaddr=adaptaddr->Next; } free(buffer); if (!found) return ADDRSTATUS_UNKNOWN; /* not found */ if (found->DadState==IpDadStateDuplicate) return ADDRSTATUS_YES; /* tentative */ else return ADDRSTATUS_NO; /* not tentative */ } extern int ipaddr_add(const char * ifacename, int ifaceid, const char * addr, unsigned long pref, unsigned long valid, int prefixLen) { // netsh interface ipv6 add address interface="eth0" address=2000::123 validlifetime=120 preferredlifetime=60 char arg1[]="interface"; char arg2[]="ipv6"; char arg3[]="add"; char arg4[]="address"; char arg5[256]; // interface=... char arg6[256]; // address=... char arg7[256]; // valid char arg8[256]; // pref intptr_t i; sprintf(arg5,"interface=\"%s\"", ifacename); sprintf(arg6,"address=%s", addr); sprintf(arg7,"validlifetime=%u", valid); sprintf(arg8,"preferredlifetime=%u", pref); // use _P_DETACH to speed things up, (but the tentative detection will surely fail) i=_spawnl(_P_WAIT, netshPath, netshPath, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, NULL); if (i) { i = _spawnl(_P_WAIT, netshPath, netshPath, arg1, arg2, "set", arg4, arg5, arg6, arg7, arg8, NULL); } return i; } int ipaddr_update(const char* ifacename, int ifindex, const char* addr, unsigned long pref, unsigned long valid, int prefixLength) { return ipaddr_add(ifacename, ifindex, addr, pref, valid, prefixLength); } int ipaddr_del(const char * ifacename, int ifaceid, const char * addr, int prefixLength) { // netsh interface ipv6 add address interface=eth0 address=2000::123 validlifetime=120 preferredlifetime=60 char arg1[]="interface"; char arg2[]="ipv6"; char arg3[]="delete"; char arg4[]="address"; char arg5[256]; // interface=... char arg6[256]; // address=... intptr_t i; sprintf(arg5,"interface=\"%s\"", ifacename); sprintf(arg6,"address=%s", addr); i=_spawnl(_P_WAIT, netshPath, netshPath, arg1, arg2, arg3, arg4, arg5, arg6, NULL); return i; } SOCKET mcast=0; extern int sock_add(char * ifacename,int ifaceid, char * addr, int port, int thisifaceonly, int reuse) { SOCKET s; struct sockaddr_in6 bindme; struct ipv6_mreq ipmreq; int hops=1; char packedAddr[16]; inet_pton6(addr,packedAddr); if ((s=socket(AF_INET6,SOCK_DGRAM, 0)) == INVALID_SOCKET) return -2; memset(&bindme, 0, sizeof(bindme)); bindme.sin6_family = AF_INET6; bindme.sin6_port = htons(port); if (IN6_IS_ADDR_LINKLOCAL((IN6_ADDR*)packedAddr)) bindme.sin6_scope_id = ifaceid; if (!IN6_IS_ADDR_MULTICAST((IN6_ADDR*)packedAddr)) { inet_pton6(addr, (char*)&bindme.sin6_addr); } // REUSEADDR must be before bind() in order to take effect if (setsockopt(s, SOL_SOCKET, SO_REUSEADDR, (const char*)&hops, sizeof(hops))) { error_message_set(WSAGetLastError()); return LOWLEVEL_ERROR_REUSE_FAILED; } if (bind(s, (struct sockaddr*)&bindme, sizeof(bindme))) { error_message_set(WSAGetLastError()); return LOWLEVEL_ERROR_BIND_FAILED; } if (IN6_IS_ADDR_MULTICAST((IN6_ADDR*)packedAddr)) { /* multicast */ ipmreq.ipv6mr_interface=ifaceid; memcpy(&ipmreq.ipv6mr_multiaddr,packedAddr,16); if(setsockopt(s,IPPROTO_IPV6,IPV6_ADD_MEMBERSHIP,(char*)&ipmreq,sizeof(ipmreq))) { error_message_set(WSAGetLastError()); return LOWLEVEL_ERROR_MCAST_MEMBERSHIP; } if(setsockopt(s,IPPROTO_IPV6,IPV6_MULTICAST_HOPS,(char*)&hops,sizeof(hops))) { error_message_set(WSAGetLastError()); return LOWLEVEL_ERROR_MCAST_HOPS; } } return s; } int sock_del(int fd) { return closesocket(fd); } int sock_send(int fd, char * addr, char * buf, int buflen, int port,int iface) { ADDRINFO inforemote,*remote; char addrStr[sizeof("ffff:ffff:ffff:ffff:ffff:ffff:255.255.255.255")+5]; char portStr[10]; int i; char packaddr[16]; char ifaceStr[10]; memset(addrStr, 0, sizeof(addrStr)); memset(portStr, 0, sizeof(portStr)); memset(packaddr, 0, sizeof(packaddr)); memset(ifaceStr, 0, sizeof(ifaceStr)); strcpy(addrStr,addr); itoa(port,portStr,10); itoa(iface,ifaceStr,10); inet_pton6(addrStr,packaddr); if(IN6_IS_ADDR_LINKLOCAL((struct in6_addr*)packaddr) ||IN6_IS_ADDR_SITELOCAL((struct in6_addr*)packaddr)) strcat(strcat(addrStr,"%"),ifaceStr); memset(&inforemote, 0, sizeof(inforemote)); inforemote.ai_flags=AI_NUMERICHOST; inforemote.ai_family=PF_INET6; inforemote.ai_socktype=SOCK_DGRAM; inforemote.ai_protocol=IPPROTO_IPV6; //inet_ntop6(addr,addrStr); if(getaddrinfo(addrStr,portStr,&inforemote,&remote)) return 0; i=sendto(fd,buf,buflen,0,remote->ai_addr,remote->ai_addrlen); freeaddrinfo(remote); if (i==SOCKET_ERROR) { error_message_set(WSAGetLastError()); return LOWLEVEL_ERROR_UNSPEC; } return LOWLEVEL_NO_ERROR; } int sock_recv(int fd, char * myPlainAddr, char * peerPlainAddr, char * buf, int buflen) { struct sockaddr_in6 info; int infolen ; int readBytes; infolen=sizeof(info); if(!(readBytes=recvfrom(fd,buf,buflen,0,(SOCKADDR*)&info,&infolen))) { sprintf(Message, "socket reception failed (recvfrom() function returned 0 bytes read)\n"); return LOWLEVEL_ERROR_UNSPEC; } else { inet_ntop6(info.sin6_addr.u.Byte,peerPlainAddr); return readBytes; } } extern int dns_add(const char* ifname, int ifaceid, const char* addrPlain) { // netsh interface ipv6 add dns "eth0" address=2000::123 char arg1[]="interface"; char arg2[]="ipv6"; char arg3[]="add"; char arg4[]="dns"; char arg5[256]; // interface=... char arg6[256]; // address=... intptr_t i; sprintf(arg5,"\"%s\"", ifname); sprintf(arg6,"address=%s", addrPlain); i=_spawnl(_P_WAIT,netshPath,netshPath,arg1,arg2,arg3,arg4,arg5,arg6,NULL); if (i == 0) { return LOWLEVEL_NO_ERROR; } else { sprintf(Message, "%s %s %s %s %s %s %s returned non-zero returncode %d", netshPath, arg1, arg2, arg3, arg4, arg5, arg6, i); return LOWLEVEL_ERROR_UNSPEC; } } extern int dns_del(const char* ifname, int ifaceid, const char* addrPlain) { // netsh interface ipv6 add dns interface="eth0" address=2000::123 char arg1[]="interface"; char arg2[]="ipv6"; char arg3[]="delete"; char arg4[]="dns"; char arg5[256]; // interface=... char arg6[256]; // address=... intptr_t i; sprintf(arg5,"\"%s\"", ifname); if (addrPlain) sprintf(arg6,"address=%s", addrPlain); else sprintf(arg6,"all"); i=_spawnl(_P_WAIT,netshPath,netshPath,arg1,arg2,arg3,arg4,arg5,arg6,NULL); if (i == 0) { return LOWLEVEL_NO_ERROR; } else { sprintf(Message, "%s %s %s %s %s %s %s returned non-zero returncode %d", netshPath, arg1, arg2, arg3, arg4, arg5, arg6, i); return LOWLEVEL_ERROR_UNSPEC; } } extern int domain_add(const char* ifname, int ifaceid, const char* domain) { return LOWLEVEL_NO_ERROR; } extern int domain_del(const char* ifname, int ifaceid, const char* domain) { return LOWLEVEL_NO_ERROR; } int ntp_add(const char* ifname, int ifindex, const char* addrPlain){ return LOWLEVEL_NO_ERROR; } int ntp_del(const char* ifname, int ifindex, const char* addrPlain){ return LOWLEVEL_NO_ERROR; } int timezone_set(const char* ifname, int ifindex, const char* timezone){ return LOWLEVEL_NO_ERROR; } int timezone_del(const char* ifname, int ifindex, const char* timezone){ return LOWLEVEL_NO_ERROR; } int sipserver_add(const char* ifname, int ifindex, const char* addrPlain){ return LOWLEVEL_NO_ERROR; } int sipserver_del(const char* ifname, int ifindex, const char* addrPlain){ return LOWLEVEL_NO_ERROR; } int sipdomain_add(const char* ifname, int ifindex, const char* domain){ return LOWLEVEL_NO_ERROR; } int sipdomain_del(const char* ifname, int ifindex, const char* domain){ return LOWLEVEL_NO_ERROR; } int nisserver_add(const char* ifname, int ifindex, const char* addrPlain){ return LOWLEVEL_NO_ERROR; } int nisserver_del(const char* ifname, int ifindex, const char* addrPlain){ return LOWLEVEL_NO_ERROR; } int nisdomain_set(const char* ifname, int ifindex, const char* domain){ return LOWLEVEL_NO_ERROR; } int nisdomain_del(const char* ifname, int ifindex, const char* domain){ return LOWLEVEL_NO_ERROR; } int nisplusserver_add(const char* ifname, int ifindex, const char* addrPlain){ return LOWLEVEL_NO_ERROR; } int nisplusserver_del(const char* ifname, int ifindex, const char* addrPlain){ return LOWLEVEL_NO_ERROR; } int nisplusdomain_set(const char* ifname, int ifindex, const char* domain){ return LOWLEVEL_NO_ERROR; } int nisplusdomain_del(const char* ifname, int ifindex, const char* domain){ return LOWLEVEL_NO_ERROR; } int prefix_add(const char* ifname, int ifindex, const char* prefixPlain, int prefixLength, unsigned long prefered, unsigned long valid) { // netsh interface ipv6 add route 2000::/64 "eth1" preferredlifetime=1000 validlifetime=2000 store=active [publish=age] char arg1[]="interface"; char arg2[]="ipv6"; char arg3[]="add"; char arg4[]="route"; char arg5[256]; // prefix char arg6[256]; // interface=... char arg7[256]; // preferredlifetime=... char arg8[256]; // validlifetime=... char arg9[]="store=active"; char arg10[]="publish=age"; intptr_t i; char buf[2000]; sprintf(arg5, "%s/%d", prefixPlain, prefixLength); sprintf(arg6,"interface=\"%s\"", ifname); sprintf(arg7,"preferredlifetime=%u", prefered); sprintf(arg8,"validlifetime=%u", valid); sprintf(buf, "%s %s %s %s %s %s %s %s %s %s", arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10); i=_spawnl(_P_WAIT,netshPath,netshPath,arg1,arg2,arg3,arg4,arg5,arg6,arg7,arg8,arg9,arg10, NULL); // if error code is non-zero, then the addition failed. One of the reasons why this // could happen is because the address or prefix already exists, so we'll try // to update its parameters (if this is RENEW/REBIND) if (i) { i = _spawnl(_P_WAIT, netshPath, netshPath, arg1, arg2, "set", arg4, arg5, arg6, arg7, arg8, arg9, arg10, NULL); } return i; } int prefix_update(const char* ifname, int ifindex, const char* prefixPlain, int prefixLength, unsigned long prefered, unsigned long valid) { return prefix_add(ifname, ifindex, prefixPlain, prefixLength, prefered, valid); } int prefix_del(const char* ifname, int ifindex, const char* prefixPlain, int prefixLength) { // netsh interface ipv6 del route 2000::/64 "eth1" char arg1[]="interface"; char arg2[]="ipv6"; char arg3[]="delete"; char arg4[]="route"; char arg5[256]; // prefix char arg6[256]; // interface=... intptr_t i; sprintf(arg5, "%s/%d", prefixPlain, prefixLength); sprintf(arg6,"interface=\"%s\"", ifname); i=_spawnl(_P_WAIT,netshPath,netshPath,arg1,arg2,arg3,arg4,arg5,arg6, NULL); if (i==-1) { /// @todo: some better error support return -1; } return LOWLEVEL_NO_ERROR; } void link_state_change_init(volatile struct link_state_notify_t * monitored_links, volatile int * notify) { /// @todo: implement this } void link_state_change_cleanup() { /// @todo: implement this } int execute(const char *filename, const char * argv[], const char *env[]) { intptr_t i; i=_spawnvpe(_P_WAIT, filename, argv, env); return i; } int get_mac_from_ipv6(const char* iface_name, int ifindex, const char* v6addr, char* mac, int* mac_len) { /// @todo: Implement MAC reading for Windows return LOWLEVEL_ERROR_NOT_IMPLEMENTED; } /** @brief returns host name of this host * * @param hostname buffer (hostname will be stored here) * @param hostname_len length of the buffer * @return LOWLEVEL_NO_ERROR if successful, appropriate LOWLEVEL_ERROR_* otherwise */ int get_hostname(char* hostname, int hostname_len) { memset(hostname,0, hostname_len); if (GetComputerNameExA(ComputerNameDnsFullyQualified, hostname, &hostname_len)) { return LOWLEVEL_NO_ERROR; } return LOWLEVEL_ERROR_UNSPEC; } void fill_random(uint8_t* buffer, int len) { unsigned int number; int i = 0; for (i=0; i < len; ++i) { rand_s(&number); buffer[i] = (number%256); } } dibbler-1.0.1/Port-win32/stdbool.h0000644000175000017500000000117712277722750013561 00000000000000 #ifndef _STDBOOL_H #define _STDBOOL_H #include /* C99 Boolean types for compilers without C99 support */ /* http://www.opengroup.org/onlinepubs/009695399/basedefs/stdbool.h.html */ #if !defined(__cplusplus) /* _Bool builtin type is included in GCC */ /* ISO C Standard: 5.2.5 An object declared as type _Bool is large enough to store the values 0 and 1. */ /* We choose 8 bit to match C++ */ /* It must also promote to integer */ #ifndef WIN32 typedef uint8_t _Bool; #endif /* ISO C Standard: 7.16 Boolean type */ #define bool _Bool #define true 1 #define false 0 #define __bool_true_false_are_defined 1 #endif #endifdibbler-1.0.1/Port-win32/resource.h0000664000175000017500000000061012233256142013720 00000000000000//{{NO_DEPENDENCIES}} // Microsoft Visual C++ generated include file. // Used by client-win32.rc // Next default values for new objects // #ifdef APSTUDIO_INVOKED #ifndef APSTUDIO_READONLY_SYMBOLS #define _APS_NEXT_RESOURCE_VALUE 101 #define _APS_NEXT_COMMAND_VALUE 40001 #define _APS_NEXT_CONTROL_VALUE 1001 #define _APS_NEXT_SYMED_VALUE 101 #endif #endif dibbler-1.0.1/Port-win32/client-win32.vs2013.vcxproj0000664000175000017500000012637312426742324016535 00000000000000 Debug32 Win32 Debug32 x64 Debug64 Win32 Debug64 x64 Release32 Win32 Release32 x64 Release64 Win32 Release64 x64 client-win32 {F3A8782D-88E1-4604-AF79-CC225A3F64F4} Win32Proj Application v120_xp MultiByte Application v120_xp MultiByte Application v120_xp MultiByte Application v120_xp MultiByte Application v120_xp MultiByte Application v120_xp MultiByte Application v120_xp MultiByte Application v120_xp MultiByte <_ProjectFileVersion>12.0.21005.1 $(SolutionDir)\$(Configuration)\bin\ $(Configuration)\$(TargetName).obj\ true false dibbler-client true false dibbler-client $(SolutionDir)\$(Configuration)\bin\ $(Configuration)\$(TargetName).obj\ true false dibbler-client true false dibbler-client $(SolutionDir)\$(Configuration)\bin\ $(Configuration)\$(TargetName).obj\ false false dibbler-client $(SolutionDir)\$(Configuration)\bin\ $(Configuration)\$(TargetName).obj\ false false dibbler-client false false dibbler-client false false dibbler-client /MP /J %(AdditionalOptions) Disabled ..;.;include;..\nettle;..\poslib;..\Options;..\misc;..\Messages;..\IfaceMgr;..\ClntTransMgr;..\ClntParser;..\ClntOptions;..\ClntMessages;..\ClntIfaceMgr;..\ClntCfgMgr;..\ClntAddrMgr;..\CfgMgr;..\AddrMgr;%(AdditionalIncludeDirectories) WIN32;_DEBUG;_CONSOLE;YYDEBUG; _WIN32;%(PreprocessorDefinitions) false Sync Default MultiThreadedDebug true true Level3 EditAndContinue 4996;%(DisableSpecificWarnings) ws2_32.lib;Iphlpapi.lib;%(AdditionalDependencies) $(OutDir)$(TargetName)$(TargetExt) true $(OutDir)$(TargetName).pdb Console false MachineX86 /MP /J %(AdditionalOptions) Disabled ..;.;include;..\nettle;..\poslib;..\Options;..\misc;..\Messages;..\IfaceMgr;..\ClntTransMgr;..\ClntParser;..\ClntOptions;..\ClntMessages;..\ClntIfaceMgr;..\ClntCfgMgr;..\ClntAddrMgr;..\CfgMgr;..\AddrMgr;%(AdditionalIncludeDirectories) WIN32;_DEBUG;_CONSOLE;YYDEBUG; _WIN32;%(PreprocessorDefinitions) false Sync Default MultiThreadedDebug true true Level3 ProgramDatabase 4996;%(DisableSpecificWarnings) ws2_32.lib;Iphlpapi.lib;%(AdditionalDependencies) $(OutDir)$(TargetName)$(TargetExt) true $(OutDir)$(TargetName).pdb Console false /MP /J %(AdditionalOptions) Disabled ..;.;include;..\nettle;..\poslib;..\Options;..\misc;..\Messages;..\IfaceMgr;..\ClntTransMgr;..\ClntParser;..\ClntOptions;..\ClntMessages;..\ClntIfaceMgr;..\ClntCfgMgr;..\ClntAddrMgr;..\CfgMgr;..\AddrMgr;%(AdditionalIncludeDirectories) WIN32;_DEBUG;_CONSOLE;YYDEBUG; _WIN32;%(PreprocessorDefinitions) false Sync Default MultiThreadedDebug true true Level3 EditAndContinue 4996;%(DisableSpecificWarnings) ws2_32.lib;Iphlpapi.lib;%(AdditionalDependencies) $(OutDir)$(TargetName)$(TargetExt) true $(OutDir)$(TargetName).pdb Console false MachineX86 /MP /J %(AdditionalOptions) Disabled ..;.;include;..\nettle;..\poslib;..\Options;..\misc;..\Messages;..\IfaceMgr;..\ClntTransMgr;..\ClntParser;..\ClntOptions;..\ClntMessages;..\ClntIfaceMgr;..\ClntCfgMgr;..\ClntAddrMgr;..\CfgMgr;..\AddrMgr;%(AdditionalIncludeDirectories) WIN32;_DEBUG;_CONSOLE;YYDEBUG; _WIN32;%(PreprocessorDefinitions) false Sync Default MultiThreadedDebug true true Level3 ProgramDatabase 4996;%(DisableSpecificWarnings) ws2_32.lib;Iphlpapi.lib;%(AdditionalDependencies) $(OutDir)$(TargetName)$(TargetExt) true $(OutDir)$(TargetName).pdb Console false /MP /J %(AdditionalOptions) MaxSpeed OnlyExplicitInline true .;..;..\nettle;..\poslib;..\Options;..\misc;..\Messages;..\IfaceMgr;..\ClntTransMgr;..\ClntParser;..\ClntOptions;..\ClntMessages;..\ClntIfaceMgr;..\ClntCfgMgr;..\ClntAddrMgr;..\CfgMgr;..\AddrMgr;%(AdditionalIncludeDirectories) WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) true Sync Default MultiThreaded true true Level1 ProgramDatabase 4996;%(DisableSpecificWarnings) ws2_32.lib;Iphlpapi.lib;%(AdditionalDependencies) $(OutDir)$(TargetName)$(TargetExt) true Console true true false MachineX86 /MP /J %(AdditionalOptions) MaxSpeed OnlyExplicitInline true .;..;..\nettle;..\poslib;..\Options;..\misc;..\Messages;..\IfaceMgr;..\ClntTransMgr;..\ClntParser;..\ClntOptions;..\ClntMessages;..\ClntIfaceMgr;..\ClntCfgMgr;..\ClntAddrMgr;..\CfgMgr;..\AddrMgr;%(AdditionalIncludeDirectories) WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) true Sync Default MultiThreaded true true Level1 ProgramDatabase 4996;%(DisableSpecificWarnings) ws2_32.lib;Iphlpapi.lib;%(AdditionalDependencies) $(OutDir)$(TargetName)$(TargetExt) true Console true true false MachineX86 /MP /J %(AdditionalOptions) MaxSpeed OnlyExplicitInline true .;..;..\nettle;..\poslib;..\Options;..\misc;..\Messages;..\IfaceMgr;..\ClntTransMgr;..\ClntParser;..\ClntOptions;..\ClntMessages;..\ClntIfaceMgr;..\ClntCfgMgr;..\ClntAddrMgr;..\CfgMgr;..\AddrMgr;%(AdditionalIncludeDirectories) WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) true Sync Default MultiThreaded true true Level1 ProgramDatabase 4996;%(DisableSpecificWarnings) ws2_32.lib;Iphlpapi.lib;%(AdditionalDependencies) $(OutDir)$(TargetName)$(TargetExt) true Console true true false /MP /J %(AdditionalOptions) MaxSpeed OnlyExplicitInline true .;..;..\nettle;..\poslib;..\Options;..\misc;..\Messages;..\IfaceMgr;..\ClntTransMgr;..\ClntParser;..\ClntOptions;..\ClntMessages;..\ClntIfaceMgr;..\ClntCfgMgr;..\ClntAddrMgr;..\CfgMgr;..\AddrMgr;%(AdditionalIncludeDirectories) WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) true Sync Default MultiThreaded true true Level1 ProgramDatabase 4996;%(DisableSpecificWarnings) ws2_32.lib;Iphlpapi.lib;%(AdditionalDependencies) $(OutDir)$(TargetName)$(TargetExt) true Console true true false $(IntDir)%(Filename)1.obj $(IntDir)%(Filename)1.obj $(IntDir)%(Filename)1.obj $(IntDir)%(Filename)1.obj $(IntDir)%(Filename)1.obj $(IntDir)%(Filename)1.obj $(IntDir)%(Filename)1.obj $(IntDir)%(Filename)1.obj $(IntDir)%(Filename)1.obj $(IntDir)%(Filename)1.obj $(IntDir)%(Filename)1.obj $(IntDir)%(Filename)1.obj $(IntDir)%(Filename)1.obj $(IntDir)%(Filename)1.obj $(IntDir)%(Filename)1.obj $(IntDir)%(Filename)1.obj $(IntDir)%(Filename)1.obj $(IntDir)%(Filename)1.obj $(IntDir)%(Filename)1.obj $(IntDir)%(Filename)1.obj $(IntDir)%(Filename)1.obj $(IntDir)%(Filename)1.obj $(IntDir)%(Filename)1.obj $(IntDir)%(Filename)1.obj $(IntDir)%(Filename)1.obj $(IntDir)%(Filename)1.obj $(IntDir)%(Filename)1.obj $(IntDir)%(Filename)1.obj $(IntDir)%(Filename)1.obj $(IntDir)%(Filename)1.obj $(IntDir)%(Filename)1.obj $(IntDir)%(Filename)1.obj $(IntDir)%(Filename)1.obj $(IntDir)%(Filename)1.obj $(IntDir)%(Filename)1.obj $(IntDir)%(Filename)1.obj $(IntDir)%(Filename)1.obj $(IntDir)%(Filename)1.obj $(IntDir)%(Filename)1.obj $(IntDir)%(Filename)1.obj $(IntDir)%(Filename)1.obj $(IntDir)%(Filename)1.obj $(IntDir)%(Filename)1.obj $(IntDir)%(Filename)1.obj $(IntDir)%(Filename)1.obj $(IntDir)%(Filename)1.obj $(IntDir)%(Filename)1.obj $(IntDir)%(Filename)1.obj $(IntDir)%(Filename)1.obj $(IntDir)%(Filename)1.obj $(IntDir)%(Filename)1.obj $(IntDir)%(Filename)1.obj $(IntDir)%(Filename)1.obj $(IntDir)%(Filename)1.obj $(IntDir)%(Filename)1.obj $(IntDir)%(Filename)1.obj {b4a3663c-44d7-46d2-b397-9d7e0e4eb557} false dibbler-1.0.1/Port-win32/SrvService.h0000664000175000017500000000126412233256142014172 00000000000000/* * Dibbler - a portable DHCPv6 * * authors: Tomasz Mrugalski * Marek Senderski * * released under GNU GPL v2 only licence */ #ifndef SRVSERVICE_H #define SRVSERVICE_H #include #include #include "winservice.h" #include "DHCPServer.h" class TSrvService; extern TSrvService StaticService; class TSrvService : public TWinService { public: TSrvService(void); void Run(); void OnStop(); EServiceState ParseStandardArgs(int argc,char* argv[]); void setState(EServiceState status); static TSrvService * getHandle() { return &StaticService; } ~TSrvService(void); private: EServiceState status; }; #endifdibbler-1.0.1/Port-win32/RelService.cpp0000664000175000017500000000720212233256142014473 00000000000000/* * Dibbler - a portable DHCPv6 * * authors: Tomasz Mrugalski * Marek Senderski * * Released under GNU GPL v2 licence * */ #include #include #include #include "RelService.h" #include "DHCPRelay.h" #include "Portable.h" #include "Logger.h" #include "DHCPConst.h" using namespace std; TDHCPRelay * relPtr; TRelService StaticService; TRelService::TRelService() :TWinService("DHCPv6Relay","Dibbler - a DHCPv6 relay",SERVICE_AUTO_START, "RpcSS\0tcpip6\0winmgmt\0", "Dibbler - a portable DHCPv6. This is DHCPv6 Relay, version " DIBBLER_VERSION ".") { } EServiceState TRelService::ParseStandardArgs(int argc,char* argv[]) { bool dirFound = false; EServiceState status = INVALID; int n=1; while (nstop(); } void TRelService::Run() { if (_chdir(this->ServiceDir.c_str())) { Log(Crit) << "Unable to change directory to " << this->ServiceDir << ". Aborting.\n" << LogEnd; return; } string confile = RELCONF_FILE; string oldconf = RELCONF_FILE+(string)"-old"; string workdir = this->ServiceDir; string logFile = RELLOG_FILE; logger::setLogName("Rel"); logger::Initialize((char*)logFile.c_str()); Log(Crit) << DIBBLER_COPYRIGHT1 << " (RELAY, WinXP/2003/Vista port)" << LogEnd; TDHCPRelay relay(workdir+"\\"+confile); relPtr = &relay; // remember address relay.setWorkdir(this->ServiceDir); if (!relay.isDone()) relay.run(); } void TRelService::setState(EServiceState status) { this->status = status; } dibbler-1.0.1/Port-win32/server-win32.cpp0000664000175000017500000000670612426742324014714 00000000000000/* * Dibbler - a portable DHCPv6 * * authors: Tomasz Mrugalski * Marek Senderski * changes: Hernan Martinez * * Released under GNU GPL v2 licence * */ #include #include #include #include #include "Portable.h" #include "DHCPServer.h" #include "WinService.h" #include "SrvService.h" #include "Logger.h" extern "C" int lowlevelInit(); extern TDHCPServer * srvPtr; using namespace std; void usage() { cout << "Usage:" << endl; cout << " dibbler-server.exe ACTION [-d c:\\path\\to\\config\\file]" << endl << " ACTION = status|start|stop|install|uninstall|run" << endl << " status - show status and exit" << endl << " start - start installed service" << endl << " stop - stop installed service" << endl << " install - install service" << endl << " uninstall - uninstall service" << endl << " run - run in console" << endl << endl << " -d paramters is now optional." << endl; } /* * Handle the CTRL-C, CTRL-BREAK signal. */ BOOL CtrlHandler( DWORD fdwCtrlType ) { switch( fdwCtrlType ) { case CTRL_C_EVENT: { srvPtr->stop(); return TRUE; } case CTRL_BREAK_EVENT: return FALSE; } return TRUE; } int main(int argc, char* argv[]) { cout << DIBBLER_COPYRIGHT1 << " (SERVER, WinXP/2003/Vista/7/8 port)" << endl; cout << DIBBLER_COPYRIGHT2 << endl; cout << DIBBLER_COPYRIGHT3 << endl; cout << DIBBLER_COPYRIGHT4 << endl; cout << endl; // get the service object TSrvService * SrvService = TSrvService::getHandle(); WSADATA wsaData; if( WSAStartup( MAKEWORD( 2, 2 ), &wsaData )) { cout<<"Unable to load WinSock 2.2"<ParseStandardArgs(argc, argv); SrvService->setState(status); // is this proper port? if (!SrvService->verifyPort()) { Log(Crit) << "Operating system version is not supported by this Dibbler port." << LogEnd; return -1; } SetConsoleCtrlHandler( (PHANDLER_ROUTINE) CtrlHandler, TRUE ); // Check for administrative privileges for some of the actions switch ( status ) { case START: case STOP: case INSTALL: case UNINSTALL: if( !SrvService->isRunAsAdmin() ) { Log(Crit) << SrvService->ADMIN_REQUIRED_STR << LogEnd; return -1; } break; default: break; } switch (status) { case STATUS: { SrvService->showStatus(); break; }; case START: { SrvService->StartService(); break; } case STOP: { SrvService->StopService(); break; } case INSTALL: { SrvService->Install(); break; } case UNINSTALL: { SrvService->Uninstall(); break; } case RUN: { SrvService->Run(); break; } case SERVICE: { SrvService->RunService(); break; } case INVALID: { Log(Crit) << "Invalid usage." << LogEnd; // No break here; fall through to help } case HELP: default: { usage(); } } return 0; } dibbler-1.0.1/Port-win32/server-win32.vs2013.vcxproj0000664000175000017500000010445112426742324016556 00000000000000 Debug32 Win32 Debug32 x64 Debug64 Win32 Debug64 x64 Release32 Win32 Release32 x64 Release64 Win32 Release64 x64 server-win32 {B4A3663C-44D7-46D2-B397-9D7E0E4EB557} server-win32 ManagedCProj Application v120_xp MultiByte false Application v120_xp MultiByte false Application v120_xp MultiByte false Application v120_xp MultiByte false Application v120_xp MultiByte false Application v120_xp MultiByte false Application v120_xp MultiByte false Application v120_xp MultiByte false <_ProjectFileVersion>12.0.21005.1 $(SolutionDir)\$(Configuration)\bin\ $(Configuration)\$(TargetName).obj\ false dibbler-server false dibbler-server $(SolutionDir)\$(Configuration)\bin\ $(Configuration)\$(TargetName).obj\ false dibbler-server false dibbler-server $(SolutionDir)\$(Configuration)\bin\ $(Configuration)\$(TargetName).obj\ true false dibbler-server $(SolutionDir)\$(Configuration)\bin\ $(Configuration)\$(TargetName).obj\ true false dibbler-server true false dibbler-server true false dibbler-server /MP /J %(AdditionalOptions) Disabled ..;.;..\nettle;include;..\TransMgr;..\SrvTransMgr;..\SrvOptions;..\SrvMessages;..\SrvIfaceMgr;..\SrvCfgMgr;..\SrvAddrMgr;..\Options;..\misc;..\Messages;..\IfaceMgr;..\CfgMgr;..\AddrMgr;..\poslib;%(AdditionalIncludeDirectories) WIN32;_DEBUG;%(PreprocessorDefinitions) false Default MultiThreadedDebug true true Level3 ProgramDatabase 4996;%(DisableSpecificWarnings) ws2_32.lib;Iphlpapi.lib;%(AdditionalDependencies) $(OutDir)$(TargetName)$(TargetExt) true false Console /MP /J %(AdditionalOptions) Disabled ..;.;..\nettle;include;..\TransMgr;..\SrvTransMgr;..\SrvOptions;..\SrvMessages;..\SrvIfaceMgr;..\SrvCfgMgr;..\SrvAddrMgr;..\Options;..\misc;..\Messages;..\IfaceMgr;..\CfgMgr;..\AddrMgr;..\poslib;%(AdditionalIncludeDirectories) WIN32;_DEBUG;%(PreprocessorDefinitions) false Default MultiThreadedDebug true true Level3 ProgramDatabase 4996;%(DisableSpecificWarnings) ws2_32.lib;Iphlpapi.lib;%(AdditionalDependencies) $(OutDir)$(TargetName)$(TargetExt) true false Console /MP /J %(AdditionalOptions) Disabled ..;.;..\nettle;include;..\TransMgr;..\SrvTransMgr;..\SrvOptions;..\SrvMessages;..\SrvIfaceMgr;..\SrvCfgMgr;..\SrvAddrMgr;..\Options;..\misc;..\Messages;..\IfaceMgr;..\CfgMgr;..\AddrMgr;..\poslib;%(AdditionalIncludeDirectories) WIN32;_DEBUG;%(PreprocessorDefinitions) false Default MultiThreadedDebug true true Level3 ProgramDatabase 4996;%(DisableSpecificWarnings) ws2_32.lib;Iphlpapi.lib;%(AdditionalDependencies) $(OutDir)$(TargetName)$(TargetExt) true false Console /MP /J %(AdditionalOptions) Disabled ..;.;..\nettle;include;..\TransMgr;..\SrvTransMgr;..\SrvOptions;..\SrvMessages;..\SrvIfaceMgr;..\SrvCfgMgr;..\SrvAddrMgr;..\Options;..\misc;..\Messages;..\IfaceMgr;..\CfgMgr;..\AddrMgr;..\poslib;%(AdditionalIncludeDirectories) WIN32;_DEBUG;%(PreprocessorDefinitions) false Default MultiThreadedDebug true true Level3 ProgramDatabase 4996;%(DisableSpecificWarnings) ws2_32.lib;Iphlpapi.lib;%(AdditionalDependencies) $(OutDir)$(TargetName)$(TargetExt) true false Console /MP /J %(AdditionalOptions) MaxSpeed OnlyExplicitInline ..;.;include;..\TransMgr;..\SrvTransMgr;..\SrvOptions;..\SrvMessages;..\SrvIfaceMgr;..\SrvCfgMgr;..\SrvAddrMgr;..\Options;..\misc;..\Messages;..\IfaceMgr;..\CfgMgr;..\AddrMgr;..\poslib;..\nettle;%(AdditionalIncludeDirectories) WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) true false Default MultiThreaded Level3 ProgramDatabase 4996;%(DisableSpecificWarnings) ws2_32.lib;Iphlpapi.lib;%(AdditionalDependencies) $(OutDir)$(TargetName)$(TargetExt) true false Console /MP /J %(AdditionalOptions) MaxSpeed OnlyExplicitInline ..;.;include;..\TransMgr;..\SrvTransMgr;..\SrvOptions;..\SrvMessages;..\SrvIfaceMgr;..\SrvCfgMgr;..\SrvAddrMgr;..\Options;..\misc;..\Messages;..\IfaceMgr;..\CfgMgr;..\AddrMgr;..\poslib;..\nettle;%(AdditionalIncludeDirectories) WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) true false Default MultiThreaded Level3 ProgramDatabase 4996;%(DisableSpecificWarnings) ws2_32.lib;Iphlpapi.lib;%(AdditionalDependencies) $(OutDir)$(TargetName)$(TargetExt) true false Console /MP /J %(AdditionalOptions) MaxSpeed OnlyExplicitInline ..;.;include;..\TransMgr;..\SrvTransMgr;..\SrvOptions;..\SrvMessages;..\SrvIfaceMgr;..\SrvCfgMgr;..\SrvAddrMgr;..\Options;..\misc;..\Messages;..\IfaceMgr;..\CfgMgr;..\AddrMgr;..\poslib;..\nettle;%(AdditionalIncludeDirectories) WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) true false Default MultiThreaded Level3 ProgramDatabase 4996;%(DisableSpecificWarnings) ws2_32.lib;Iphlpapi.lib;%(AdditionalDependencies) $(OutDir)$(TargetName)$(TargetExt) true false Console /MP /J %(AdditionalOptions) MaxSpeed OnlyExplicitInline ..;.;include;..\TransMgr;..\SrvTransMgr;..\SrvOptions;..\SrvMessages;..\SrvIfaceMgr;..\SrvCfgMgr;..\SrvAddrMgr;..\Options;..\misc;..\Messages;..\IfaceMgr;..\CfgMgr;..\AddrMgr;..\poslib;..\nettle;%(AdditionalIncludeDirectories) WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) true false Default MultiThreaded Level3 ProgramDatabase 4996;%(DisableSpecificWarnings) ws2_32.lib;Iphlpapi.lib;%(AdditionalDependencies) $(OutDir)$(TargetName)$(TargetExt) true false Console dibbler-1.0.1/Port-win32/relay.log0000664000175000017500000000000012233256142013530 00000000000000dibbler-1.0.1/Port-win32/requestor-win32.vs2013.vcxproj0000664000175000017500000005507112426742324017304 00000000000000 Debug32 Win32 Debug32 x64 Debug64 Win32 Debug64 x64 Release32 Win32 Release32 x64 Release64 Win32 Release64 x64 requestor-win32 {67D615F8-4E5F-42F8-BE4C-197F348155AE} Win32Proj Application v120_xp MultiByte Application v120_xp MultiByte Application v120_xp MultiByte Application v120_xp MultiByte Application v120_xp MultiByte Application v120_xp MultiByte Application v120_xp MultiByte Application v120_xp MultiByte <_ProjectFileVersion>12.0.21005.1 $(SolutionDir)\$(Configuration)\bin\ $(Configuration)\$(TargetName).obj\ true false dibbler-requestor true false dibbler-requestor $(SolutionDir)\$(Configuration)\bin\ $(Configuration)\$(TargetName).obj\ true false dibbler-requestor true false dibbler-requestor $(SolutionDir)\$(Configuration)\bin\ $(Configuration)\$(TargetName).obj\ false false dibbler-requestor $(SolutionDir)\$(Configuration)\bin\ $(Configuration)\$(TargetName).obj\ false false dibbler-requestor false false dibbler-requestor false false dibbler-requestor /MP %(AdditionalOptions) Disabled ..;.;include;..\Options;..\misc;..\Messages;..\IfaceMgr;..\Requestor;%(AdditionalIncludeDirectories) WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) false Default MultiThreadedDebug Level1 EditAndContinue ws2_32.lib;Iphlpapi.lib;%(AdditionalDependencies) $(OutDir)$(TargetName)$(TargetExt) true $(OutDir)dibbler-requestor.pdb Console false MachineX86 /MP %(AdditionalOptions) Disabled ..;.;include;..\Options;..\misc;..\Messages;..\IfaceMgr;..\Requestor;%(AdditionalIncludeDirectories) WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) false Default MultiThreadedDebug Level1 ProgramDatabase ws2_32.lib;Iphlpapi.lib;%(AdditionalDependencies) $(OutDir)$(TargetName)$(TargetExt) true $(OutDir)dibbler-requestor.pdb Console false /MP %(AdditionalOptions) Disabled ..;.;include;..\Options;..\misc;..\Messages;..\IfaceMgr;..\Requestor;%(AdditionalIncludeDirectories) WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) false Default MultiThreadedDebug Level1 EditAndContinue ws2_32.lib;Iphlpapi.lib;%(AdditionalDependencies) $(OutDir)$(TargetName)$(TargetExt) true $(OutDir)dibbler-requestor.pdb Console false MachineX86 /MP %(AdditionalOptions) Disabled ..;.;include;..\Options;..\misc;..\Messages;..\IfaceMgr;..\Requestor;%(AdditionalIncludeDirectories) WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) false Default MultiThreadedDebug Level1 ProgramDatabase ws2_32.lib;Iphlpapi.lib;%(AdditionalDependencies) $(OutDir)$(TargetName)$(TargetExt) true $(OutDir)dibbler-requestor.pdb Console false /MP /J %(AdditionalOptions) ..;.;include;..\Options;..\misc;..\Messages;..\IfaceMgr;..\Requestor;%(AdditionalIncludeDirectories) WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) MultiThreaded Level3 ProgramDatabase 4996;%(DisableSpecificWarnings) ws2_32.lib;Iphlpapi.lib;%(AdditionalDependencies) $(OutDir)$(TargetName)$(TargetExt) true Console true true false MachineX86 /MP /J %(AdditionalOptions) ..;.;include;..\Options;..\misc;..\Messages;..\IfaceMgr;..\Requestor;%(AdditionalIncludeDirectories) WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) MultiThreaded Level3 ProgramDatabase 4996;%(DisableSpecificWarnings) ws2_32.lib;Iphlpapi.lib;%(AdditionalDependencies) $(OutDir)$(TargetName)$(TargetExt) true Console true true false MachineX86 /MP /J %(AdditionalOptions) ..;.;include;..\Options;..\misc;..\Messages;..\IfaceMgr;..\Requestor;%(AdditionalIncludeDirectories) WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) MultiThreaded Level3 ProgramDatabase 4996;%(DisableSpecificWarnings) ws2_32.lib;Iphlpapi.lib;%(AdditionalDependencies) $(OutDir)$(TargetName)$(TargetExt) true Console true true false /MP /J %(AdditionalOptions) ..;.;include;..\Options;..\misc;..\Messages;..\IfaceMgr;..\Requestor;%(AdditionalIncludeDirectories) WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) MultiThreaded Level3 ProgramDatabase 4996;%(DisableSpecificWarnings) ws2_32.lib;Iphlpapi.lib;%(AdditionalDependencies) $(OutDir)$(TargetName)$(TargetExt) true Console true true false {f3d13220-6d1a-43a5-b753-aa107dac773d} false dibbler-1.0.1/Port-win32/unistd.h0000644000175000017500000000024012277722750013407 00000000000000/* * This file is part of the Mingw32 package. * * unistd.h maps (roughly) to io.h */ #ifndef __STRICT_ANSI__ #include #include #endif dibbler-1.0.1/Port-win32/dibbler-requestor.rc0000664000175000017500000000023212233256142015700 00000000000000// Microsoft Visual C++ generated resource script. // #include "resource-requestor.h" IDI_ICON1 ICON "server-win32.ico" dibbler-1.0.1/Port-win32/dibbler-win32.vs2013.sln0000664000175000017500000001315412426742324015753 00000000000000Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio Express 2013 for Windows Desktop VisualStudioVersion = 12.0.21005.1 MinimumVisualStudioVersion = 10.0.40219.1 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "client-win32", "client-win32.vs2013.vcxproj", "{F3A8782D-88E1-4604-AF79-CC225A3F64F4}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "requestor-win32", "requestor-win32.vs2013.vcxproj", "{67D615F8-4E5F-42F8-BE4C-197F348155AE}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "server-win32", "server-win32.vs2013.vcxproj", "{B4A3663C-44D7-46D2-B397-9D7E0E4EB557}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "relay-win32", "relay-win32.vs2013.vcxproj", "{F3D13220-6D1A-43A5-B753-AA107DAC773D}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug32|Win32 = Debug32|Win32 Debug32|x64 = Debug32|x64 Debug64|Win32 = Debug64|Win32 Debug64|x64 = Debug64|x64 Release32|Win32 = Release32|Win32 Release32|x64 = Release32|x64 Release64|Win32 = Release64|Win32 Release64|x64 = Release64|x64 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution {F3A8782D-88E1-4604-AF79-CC225A3F64F4}.Debug32|Win32.ActiveCfg = Debug32|Win32 {F3A8782D-88E1-4604-AF79-CC225A3F64F4}.Debug32|Win32.Build.0 = Debug32|Win32 {F3A8782D-88E1-4604-AF79-CC225A3F64F4}.Debug32|x64.ActiveCfg = Debug32|x64 {F3A8782D-88E1-4604-AF79-CC225A3F64F4}.Debug32|x64.Build.0 = Debug32|x64 {F3A8782D-88E1-4604-AF79-CC225A3F64F4}.Debug64|Win32.ActiveCfg = Debug64|Win32 {F3A8782D-88E1-4604-AF79-CC225A3F64F4}.Debug64|Win32.Build.0 = Debug64|Win32 {F3A8782D-88E1-4604-AF79-CC225A3F64F4}.Debug64|x64.ActiveCfg = Debug64|x64 {F3A8782D-88E1-4604-AF79-CC225A3F64F4}.Debug64|x64.Build.0 = Debug64|x64 {F3A8782D-88E1-4604-AF79-CC225A3F64F4}.Release32|Win32.ActiveCfg = Release32|Win32 {F3A8782D-88E1-4604-AF79-CC225A3F64F4}.Release32|Win32.Build.0 = Release32|Win32 {F3A8782D-88E1-4604-AF79-CC225A3F64F4}.Release32|x64.ActiveCfg = Release32|x64 {F3A8782D-88E1-4604-AF79-CC225A3F64F4}.Release32|x64.Build.0 = Release32|x64 {F3A8782D-88E1-4604-AF79-CC225A3F64F4}.Release64|Win32.ActiveCfg = Release64|Win32 {F3A8782D-88E1-4604-AF79-CC225A3F64F4}.Release64|Win32.Build.0 = Release64|Win32 {F3A8782D-88E1-4604-AF79-CC225A3F64F4}.Release64|x64.ActiveCfg = Release64|x64 {F3A8782D-88E1-4604-AF79-CC225A3F64F4}.Release64|x64.Build.0 = Release64|x64 {67D615F8-4E5F-42F8-BE4C-197F348155AE}.Debug32|Win32.ActiveCfg = Debug32|Win32 {67D615F8-4E5F-42F8-BE4C-197F348155AE}.Debug32|Win32.Build.0 = Debug32|Win32 {67D615F8-4E5F-42F8-BE4C-197F348155AE}.Debug32|x64.ActiveCfg = Debug32|Win32 {67D615F8-4E5F-42F8-BE4C-197F348155AE}.Debug64|Win32.ActiveCfg = Debug64|Win32 {67D615F8-4E5F-42F8-BE4C-197F348155AE}.Debug64|Win32.Build.0 = Debug64|Win32 {67D615F8-4E5F-42F8-BE4C-197F348155AE}.Debug64|x64.ActiveCfg = Debug64|x64 {67D615F8-4E5F-42F8-BE4C-197F348155AE}.Debug64|x64.Build.0 = Debug64|x64 {67D615F8-4E5F-42F8-BE4C-197F348155AE}.Release32|Win32.ActiveCfg = Release32|Win32 {67D615F8-4E5F-42F8-BE4C-197F348155AE}.Release32|Win32.Build.0 = Release32|Win32 {67D615F8-4E5F-42F8-BE4C-197F348155AE}.Release32|x64.ActiveCfg = Release32|Win32 {67D615F8-4E5F-42F8-BE4C-197F348155AE}.Release64|Win32.ActiveCfg = Release64|Win32 {67D615F8-4E5F-42F8-BE4C-197F348155AE}.Release64|x64.ActiveCfg = Release64|x64 {67D615F8-4E5F-42F8-BE4C-197F348155AE}.Release64|x64.Build.0 = Release64|x64 {B4A3663C-44D7-46D2-B397-9D7E0E4EB557}.Debug32|Win32.ActiveCfg = Debug32|Win32 {B4A3663C-44D7-46D2-B397-9D7E0E4EB557}.Debug32|Win32.Build.0 = Debug32|Win32 {B4A3663C-44D7-46D2-B397-9D7E0E4EB557}.Debug32|x64.ActiveCfg = Debug32|Win32 {B4A3663C-44D7-46D2-B397-9D7E0E4EB557}.Debug64|Win32.ActiveCfg = Debug64|Win32 {B4A3663C-44D7-46D2-B397-9D7E0E4EB557}.Debug64|Win32.Build.0 = Debug64|Win32 {B4A3663C-44D7-46D2-B397-9D7E0E4EB557}.Debug64|x64.ActiveCfg = Debug64|x64 {B4A3663C-44D7-46D2-B397-9D7E0E4EB557}.Debug64|x64.Build.0 = Debug64|x64 {B4A3663C-44D7-46D2-B397-9D7E0E4EB557}.Release32|Win32.ActiveCfg = Release32|Win32 {B4A3663C-44D7-46D2-B397-9D7E0E4EB557}.Release32|Win32.Build.0 = Release32|Win32 {B4A3663C-44D7-46D2-B397-9D7E0E4EB557}.Release32|x64.ActiveCfg = Release32|Win32 {B4A3663C-44D7-46D2-B397-9D7E0E4EB557}.Release64|Win32.ActiveCfg = Release64|Win32 {B4A3663C-44D7-46D2-B397-9D7E0E4EB557}.Release64|x64.ActiveCfg = Release64|x64 {B4A3663C-44D7-46D2-B397-9D7E0E4EB557}.Release64|x64.Build.0 = Release64|x64 {F3D13220-6D1A-43A5-B753-AA107DAC773D}.Debug32|Win32.ActiveCfg = Debug32|Win32 {F3D13220-6D1A-43A5-B753-AA107DAC773D}.Debug32|Win32.Build.0 = Debug32|Win32 {F3D13220-6D1A-43A5-B753-AA107DAC773D}.Debug32|x64.ActiveCfg = Debug32|Win32 {F3D13220-6D1A-43A5-B753-AA107DAC773D}.Debug64|Win32.ActiveCfg = Debug64|Win32 {F3D13220-6D1A-43A5-B753-AA107DAC773D}.Debug64|Win32.Build.0 = Debug64|Win32 {F3D13220-6D1A-43A5-B753-AA107DAC773D}.Debug64|x64.ActiveCfg = Debug64|x64 {F3D13220-6D1A-43A5-B753-AA107DAC773D}.Debug64|x64.Build.0 = Debug64|x64 {F3D13220-6D1A-43A5-B753-AA107DAC773D}.Release32|Win32.ActiveCfg = Release32|Win32 {F3D13220-6D1A-43A5-B753-AA107DAC773D}.Release32|Win32.Build.0 = Release32|Win32 {F3D13220-6D1A-43A5-B753-AA107DAC773D}.Release32|x64.ActiveCfg = Release32|Win32 {F3D13220-6D1A-43A5-B753-AA107DAC773D}.Release64|Win32.ActiveCfg = Release64|Win32 {F3D13220-6D1A-43A5-B753-AA107DAC773D}.Release64|x64.ActiveCfg = Release64|x64 {F3D13220-6D1A-43A5-B753-AA107DAC773D}.Release64|x64.Build.0 = Release64|x64 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection EndGlobal dibbler-1.0.1/Port-win32/Makefile.in0000664000175000017500000004576012561652535014016 00000000000000# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = Port-win32 DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(dist_noinst_DATA) ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/libtool.m4 \ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/include/dibbler-config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = SOURCES = DIST_SOURCES = RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \ ctags-recursive dvi-recursive html-recursive info-recursive \ install-data-recursive install-dvi-recursive \ install-exec-recursive install-html-recursive \ install-info-recursive install-pdf-recursive \ install-ps-recursive install-recursive installcheck-recursive \ installdirs-recursive pdf-recursive ps-recursive \ tags-recursive uninstall-recursive am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac DATA = $(dist_noinst_DATA) RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive am__recursive_targets = \ $(RECURSIVE_TARGETS) \ $(RECURSIVE_CLEAN_TARGETS) \ $(am__extra_recursive_targets) AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \ distdir am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags DIST_SUBDIRS = $(SUBDIRS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) am__relativize = \ dir0=`pwd`; \ sed_first='s,^\([^/]*\)/.*$$,\1,'; \ sed_rest='s,^[^/]*/*,,'; \ sed_last='s,^.*/\([^/]*\)$$,\1,'; \ sed_butlast='s,/*[^/]*$$,,'; \ while test -n "$$dir1"; do \ first=`echo "$$dir1" | sed -e "$$sed_first"`; \ if test "$$first" != "."; then \ if test "$$first" = ".."; then \ dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ else \ first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ if test "$$first2" = "$$first"; then \ dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ else \ dir2="../$$dir2"; \ fi; \ dir0="$$dir0"/"$$first"; \ fi; \ fi; \ dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ done; \ reldir="$$dir2" ACLOCAL = @ACLOCAL@ ALLOCA = @ALLOCA@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ ARCH = @ARCH@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ EXTRA_DIST_SUBDIRS = @EXTRA_DIST_SUBDIRS@ FGREP = @FGREP@ GREP = @GREP@ GTEST_INCLUDES = @GTEST_INCLUDES@ GTEST_LDADD = @GTEST_LDADD@ GTEST_LDFLAGS = @GTEST_LDFLAGS@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LINKPRINT = @LINKPRINT@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PORT_CFLAGS = @PORT_CFLAGS@ PORT_LDFLAGS = @PORT_LDFLAGS@ PORT_SUBDIR = @PORT_SUBDIR@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ subdirs = @subdirs@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ SUBDIRS = . dist_noinst_DATA = addrpack.c client-win32.cpp ClntService.cpp \ ClntService.h dibbler-config.h client-win32.vs2013.rc \ client-win32.vs2013.vcxproj \ client-win32.vs2013.vcxproj.filters dibbler-requestor.rc \ lowlevel-win32.c relay-win32.cpp stdbool.h \ relay-win32.vs2013.rc relay-win32.vs2013.vcxproj \ relay-win32.vs2013.vcxproj.filters RelService.cpp RelService.h \ requestor-win32.vs2013.vcxproj \ requestor-win32.vs2013.vcxproj.filters resource1.h resource2.h \ resource8.h resource.h resource-requestor.h server-win32.cpp \ server-win32.vs2013.rc server-win32.vs2013.vcxproj \ server-win32.vs2013.vcxproj.filters SrvService.cpp \ SrvService.h unistd.h WinService.cpp WinService.h client.log \ client-win32.ico dibbler.iss dibbler-win32.vs2013.sln \ relay.log relay-win32.ico server.log server-win32.ico all: all-recursive .SUFFIXES: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign Port-win32/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign Port-win32/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs # This directory's subdirectories are mostly independent; you can cd # into them and run 'make' without going through this Makefile. # To change the values of 'make' variables: instead of editing Makefiles, # (1) if the variable is set in 'config.status', edit 'config.status' # (which will cause the Makefiles to be regenerated when you run 'make'); # (2) otherwise, pass the desired values on the 'make' command line. $(am__recursive_targets): @fail=; \ if $(am__make_keepgoing); then \ failcom='fail=yes'; \ else \ failcom='exit 1'; \ fi; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-recursive TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ empty_fix=.; \ else \ include_option=--include; \ empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-recursive CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-recursive cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ $(am__make_dryrun) \ || test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ $(am__relativize); \ new_distdir=$$reldir; \ dir1=$$subdir; dir2="$(top_distdir)"; \ $(am__relativize); \ new_top_distdir=$$reldir; \ echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ ($(am__cd) $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$new_top_distdir" \ distdir="$$new_distdir" \ am__remove_distdir=: \ am__skip_length_check=: \ am__skip_mode_fix=: \ distdir) \ || exit 1; \ fi; \ done check-am: all-am check: check-recursive all-am: Makefile $(DATA) installdirs: installdirs-recursive installdirs-am: install: install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-recursive clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-recursive -rm -f Makefile distclean-am: clean-am distclean-generic distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive html-am: info: info-recursive info-am: install-data-am: install-dvi: install-dvi-recursive install-dvi-am: install-exec-am: install-html: install-html-recursive install-html-am: install-info: install-info-recursive install-info-am: install-man: install-pdf: install-pdf-recursive install-pdf-am: install-ps: install-ps-recursive install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-recursive -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: .MAKE: $(am__recursive_targets) install-am install-strip .PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am check \ check-am clean clean-generic clean-libtool cscopelist-am ctags \ ctags-am distclean distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ installdirs-am maintainer-clean maintainer-clean-generic \ mostlyclean mostlyclean-generic mostlyclean-libtool pdf pdf-am \ ps ps-am tags tags-am uninstall uninstall-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: dibbler-1.0.1/Port-win32/client-win32.cpp0000664000175000017500000000715612561700136014657 00000000000000/* * Dibbler - a portable DHCPv6 * * authors: Tomasz Mrugalski * Marek Senderski * changes: Hernan Martinez * * Released under GNU GPL v2 licence * */ #include #include #include #include #include #include "WinService.h" #include "ClntService.h" #include "Portable.h" #include "DHCPClient.h" #include "logger.h" #include extern "C" int lowlevelInit(); std::string WORKDIR(DEFAULT_WORKDIR); std::string CLNTCONF_FILE(DEFAULT_CLNTCONF_FILE); std::string CLNTLOG_FILE(DEFAULT_CLNTLOG_FILE); using namespace std; void usage() { cout << "Usage:" << endl; cout << " dibbler-client.exe ACTION [-d c:\\path\\to\\config\\file]" << endl << " ACTION = status|start|stop|install|uninstall|run" << endl << " status - show status and exit" << endl << " start - start installed service" << endl << " stop - stop installed service" << endl << " install - install service" << endl << " uninstall - uninstall service" << endl << " run - run interactively" << endl << " help - displays usage info." << endl << endl << " Note: -d parameter is optional." << endl; } extern TDHCPClient * clntPtr; /* * Handle the CTRL-C, CTRL-BREAK signal. */ BOOL CtrlHandler( DWORD fdwCtrlType ) { switch( fdwCtrlType ) { case CTRL_C_EVENT: { clntPtr->stop(); return TRUE; } case CTRL_BREAK_EVENT: return FALSE; } return TRUE; } int main(int argc, char* argv[]) { // get the service object TClntService * Client = TClntService::getHandle(); WSADATA wsaData; cout << DIBBLER_COPYRIGHT1 << " (CLIENT, WinXP/2003/Vista/7/8 port)" << endl; cout << DIBBLER_COPYRIGHT2 << endl; cout << DIBBLER_COPYRIGHT3 << endl; cout << DIBBLER_COPYRIGHT4 << endl; cout << endl; SetConsoleCtrlHandler( (PHANDLER_ROUTINE) CtrlHandler, TRUE ); if( WSAStartup( MAKEWORD( 2, 2 ), &wsaData )) { cout << "Unable to load WinSock 2.2 library." << endl; return -1; } EServiceState status = Client->ParseStandardArgs(argc, argv); Client->setState(status); // is this proper port? if (!Client->verifyPort()) { Log(Crit) << "Operating system version is not supported by this Dibbler port." << LogEnd; return -1; } // find ipv6.exe (or netsh.exe in future implementations) if (!lowlevelInit()) { clog << "lowlevelInit() failed. Startup aborted." << endl; return -1; } // Check for administrative privileges for some of the actions switch ( status ) { case START: case STOP: case INSTALL: case UNINSTALL: if ( !Client->isRunAsAdmin() ) { Log(Crit) << Client->ADMIN_REQUIRED_STR << LogEnd; return -1; } break; default: break; } switch(status) { case STATUS: { Client->showStatus(); break; } case START: { Client->StartService(); break; } case STOP: { Client->StopService(); break; } case INSTALL: { Client->Install(); break; } case UNINSTALL: { Client->Uninstall(); break; } case RUN: { Client->Run(); break; } case SERVICE: { Client->RunService(); break; } case INVALID: { Log(Crit) << "Invalid usage." << LogEnd; } case HELP: default: { usage(); } } return 0; } dibbler-1.0.1/Port-win32/dibbler.iss0000664000175000017500000001001512561662037014053 00000000000000; -- Example1.iss -- ; Demonstrates copying 3 files and creating an icon. ; SEE THE DOCUMENTATION FOR DETAILS ON CREATING .ISS SCRIPT FILES! [Setup] AppName=Dibbler - a portable DHCPv6 AppVerName=Dibbler 1.0.1 (WinXP/2003/Vista/7/8 port) OutputBaseFilename=dibbler-1.0.0-win32 OutputDir=.. DefaultDirName={sd}\dibbler DefaultGroupName=Dibbler UninstallDisplayIcon={app}\MyProg.exe Compression=lzma SolidCompression=yes LicenseFile=..\license InfoAfterFile=..\RELNOTES AlwaysShowComponentsList = yes [Components] Name: "Server"; Description: "DHCPv6 server"; Types: Full Compact; Name: "Client"; Description: "DHCPv6 client"; Types: Full Compact; Name: "Relay"; Description: "DHCPv6 relay"; Types: Full; Name: "Documentation"; Description: "User's Guide"; Types: Full Compact; Name: "Tools"; Description: "DHCPv6 requestor and other tools"; Types: Full; [Files] Source: "Debug32\bin\dibbler-client.exe"; DestDir: "{app}"; Components: Client; Source: "..\doc\examples\client*.conf"; DestDir: "{app}\examples"; Components: Client; Source: "..\doc\examples\client-win32.conf"; DestDir: "{app}"; DestName: "client.conf"; Components: Client; Source: "client.log"; DestDir: "{app}"; Components: Client; Source: "Debug32\bin\dibbler-relay.exe"; DestDir: "{app}"; Components: Relay; Source: "..\doc\examples\relay*.conf"; DestDir: "{app}\examples"; Components: Relay; Source: "relay.log"; DestDir: "{app}"; Components: Relay; Source: "Debug32\bin\dibbler-server.exe"; DestDir: "{app}"; Components: Server; Source: "Debug32\bin\dibbler-requestor.exe"; DestDir: "{app}"; Components: Tools; Source: "..\doc\examples\server*.conf"; DestDir: "{app}\examples"; Components: Server; Source: "..\doc\examples\server-win32.conf"; DestDir: "{app}"; DestName: "server.conf"; Components: Server; Source: "server.log"; DestDir: "{app}"; Components: Server; Source: "..\doc\dibbler-user.pdf"; DestDir: "{app}"; Components: Documentation; Source: "..\CHANGELOG"; DestDir: "{app}"; DestName: "CHANGELOG.txt"; Source: "..\RELNOTES"; DestDir: "{app}"; DestName: "RELNOTES.txt"; Flags: isreadme; Source: "..\AUTHORS"; DestDir: "{app}"; DestName: "AUTHORS.txt"; [Icons] Name: "{group}\User's Guide"; Filename: "{app}\dibbler-user.pdf" Name: "{group}\Release notes"; Filename: "notepad.exe"; Parameters: "{app}\RELNOTES.txt" Name: "{group}\Client Run in the console"; Filename: "{app}\dibbler-client.exe"; WorkingDir: "{app}"; Parameters: " run -d ""{app}"" "; Name: "{group}\Client Install as service"; Filename: "{app}\dibbler-client.exe"; WorkingDir: "{app}"; Parameters: "install -d ""{app}"" "; Name: "{group}\Client Remove service"; Filename: "{app}\dibbler-client.exe"; WorkingDir: "{app}"; Parameters: "uninstall"; Name: "{group}\Client View log file"; Filename: "notepad.exe"; WorkingDir: "{app}"; Parameters: "{app}\dibbler-client.log" Name: "{group}\Client Edit config file"; Filename: "notepad.exe"; WorkingDir: "{app}"; Parameters: "{app}\client.conf" Name: "{group}\Server Run in the console"; Filename: "{app}\dibbler-server.exe"; WorkingDir: "{app}"; Parameters: "run -d ""{app}"" "; Name: "{group}\Server Install as service"; Filename: "{app}\dibbler-server.exe"; Parameters: "install -d ""{app}"" "; Name: "{group}\Server Remove service"; Filename: "{app}\dibbler-server.exe"; Parameters: "uninstall"; Name: "{group}\Server View log file"; Filename: "{win}\notepad.exe"; Parameters: "{app}\dibbler-server.log" Name: "{group}\Server Edit config file"; Filename: "{win}\notepad.exe"; Parameters: "{app}\server.conf" Name: "{group}\Relay Run in the console"; Filename: "{app}\dibbler-relay.exe";Parameters: "run -d ""{app}"" "; Name: "{group}\Relay Install as service"; Filename: "{app}\dibbler-relay.exe";Parameters: "install -d ""{app}"" "; Name: "{group}\Relay Remove service"; Filename: "{app}\dibbler-relay.exe"; Parameters: "uninstall"; Name: "{group}\Relay View log file"; Filename: "notepad.exe"; Parameters: "{app}\dibbler-relay.log" Name: "{group}\Relay Edit config file"; Filename: "notepad.exe"; Parameters: "{app}\relay.conf" Name: "{group}\Remove Dibbler"; Filename: {app}\unins000.exe dibbler-1.0.1/SrvMessages/0000775000175000017500000000000012561700420012356 500000000000000dibbler-1.0.1/SrvMessages/SrvMsgSolicit.cpp0000664000175000017500000000162312233256142015557 00000000000000/* * Dibbler - a portable DHCPv6 * * authors: Tomasz Mrugalski * Marek Senderski * * released under GNU GPL v2 only licence * * $Id: SrvMsgSolicit.cpp,v 1.6 2008-08-29 00:07:35 thomson Exp $ * */ #include "SrvMsgSolicit.h" #include "Msg.h" #include "SmartPtr.h" #include "SrvMsg.h" #include "AddrClient.h" #include TSrvMsgSolicit::TSrvMsgSolicit(int iface, SPtr addr, char* buf, int bufSize) :TSrvMsg(iface, addr, buf, bufSize) { } void TSrvMsgSolicit::doDuties() { // this function should not be called on the server side } std::string TSrvMsgSolicit::getName() const { return "SOLICIT"; } bool TSrvMsgSolicit::check() { return TSrvMsg::check(true /* ClientID required */, false /* ServerID not allowed */); } unsigned long TSrvMsgSolicit::getTimeout() { return 0; } TSrvMsgSolicit::~TSrvMsgSolicit() { } dibbler-1.0.1/SrvMessages/SrvMsgRelease.h0000664000175000017500000000114212233256142015172 00000000000000/* * Dibbler - a portable DHCPv6 * * authors: Tomasz Mrugalski * Marek Senderski * changes: Krzysztof Wnuk * released under GNU GPL v2 only licence * */ class TSrvMsgRelease; #ifndef SRVMSGRELEASE_H #define SRVMSGRELEASE_H #include "SrvMsg.h" class TSrvMsgRelease : public TSrvMsg { public: TSrvMsgRelease(int iface, SPtr addr, char* buf, int bufSize); void doDuties(); unsigned long getTimeout(); bool check(); std::string getName() const; ~TSrvMsgRelease(); }; #endif /* SRVMSGRELEASE_H */ dibbler-1.0.1/SrvMessages/SrvMsgLeaseQuery.cpp0000644000175000017500000000253212304040124016214 00000000000000/* * Dibbler - a portable DHCPv6 * * authors: Tomasz Mrugalski * * released under GNU GPL v2 only licence * * $Id: SrvMsgLeaseQuery.cpp,v 1.4 2008-08-29 00:07:35 thomson Exp $ * */ #include "SrvMsgLeaseQuery.h" #include "SmartPtr.h" #include "DHCPConst.h" #include "SrvIfaceMgr.h" #include "SrvMsgAdvertise.h" #include "SrvOptIA_NA.h" #include "AddrClient.h" #include "Logger.h" TSrvMsgLeaseQuery::TSrvMsgLeaseQuery(int iface, SPtr addr, char* buf, int bufSize) :TSrvMsg(iface,addr,buf,bufSize) { } void TSrvMsgLeaseQuery::doDuties() { return; } bool TSrvMsgLeaseQuery::check() { /// @todo: validation if (!getOption(OPTION_CLIENTID)) { Log(Warning) << "LQ: Lease Query message does not contain required CLIENT-ID option." << LogEnd; return false; } return true; } TSrvMsgLeaseQuery::~TSrvMsgLeaseQuery() { } std::string TSrvMsgLeaseQuery::getName() const { return "LEASE-QUERY"; } dibbler-1.0.1/SrvMessages/SrvMsgRelease.cpp0000664000175000017500000000127112233256142015530 00000000000000/* * Dibbler - a portable DHCPv6 * * authors: Tomasz Mrugalski * Marek Senderski * * released under GNU GPL v2 only licence * */ #include "SrvMsgRelease.h" #include "AddrClient.h" TSrvMsgRelease::TSrvMsgRelease(int iface, SPtr addr, char* buf, int bufSize) :TSrvMsg(iface, addr, buf, bufSize) { } void TSrvMsgRelease::doDuties() { } unsigned long TSrvMsgRelease::getTimeout() { return 0; } bool TSrvMsgRelease::check() { return TSrvMsg::check(true /* ClientID required */, true /* ServerID required */); } std::string TSrvMsgRelease::getName() const { return "RELEASE"; } TSrvMsgRelease::~TSrvMsgRelease() { } dibbler-1.0.1/SrvMessages/SrvMsgRenew.cpp0000664000175000017500000000127212233256142015231 00000000000000/* * Dibbler - a portable DHCPv6 * * authors: Tomasz Mrugalski * Marek Senderski * * released under GNU GPL v2 only licence * */ #include "SrvMsgRenew.h" #include "SrvCfgMgr.h" #include "DHCPConst.h" TSrvMsgRenew::TSrvMsgRenew(int iface, SPtr addr, char* buf, int bufSize) :TSrvMsg(iface,addr,buf,bufSize) { } void TSrvMsgRenew::doDuties() { } unsigned long TSrvMsgRenew::getTimeout() { return 0; } bool TSrvMsgRenew::check() { return TSrvMsg::check(true /* ClientID required */, true /* ServerID required */); } std::string TSrvMsgRenew::getName() const { return "RENEW"; } TSrvMsgRenew::~TSrvMsgRenew() { } dibbler-1.0.1/SrvMessages/SrvMsgLeaseQueryReply.h0000644000175000017500000000166412304040124016702 00000000000000/* * Dibbler - a portable DHCPv6 * * authors: Tomasz Mrugalski * * released under GNU GPL v2 only licence * * $Id: SrvMsgLeaseQueryReply.h,v 1.3 2008-08-29 00:07:35 thomson Exp $ * */ #ifndef SRVMSGLEASEQUERYREPLY_H #define SRVMSGLEASEQUERYREPLY_H #include "SrvMsg.h" #include "SrvMsgLeaseQuery.h" #include "Logger.h" #include "SrvOptLQ.h" #include "AddrClient.h" class TSrvMsgLeaseQueryReply : public TSrvMsg { public: TSrvMsgLeaseQueryReply(SPtr query); bool queryByAddress(SPtr q, SPtr queryMsg); bool queryByClientID(SPtr q, SPtr queryMsg); void appendClientData(SPtr cli); bool answer(SPtr query); bool check(); void doDuties(); unsigned long getTimeout(); std::string getName() const; ~TSrvMsgLeaseQueryReply(); }; #endif /* SRVMSGLEASEQUERYREPLY_H */ dibbler-1.0.1/SrvMessages/SrvMsgRequest.h0000664000175000017500000000245312233256142015250 00000000000000/* * Dibbler - a portable DHCPv6 * * authors: Tomasz Mrugalski * Marek Senderski * changes: Krzysztof Wnuk * released under GNU GPL v2 only licence * * $Id: SrvMsgRequest.h,v 1.6 2008-08-29 00:07:35 thomson Exp $ * */ class TSrvMsgRequest; #ifndef SRVMSGREQUEST_H #define SRVMSGREQUEST_H #include "SmartPtr.h" #include "SrvMsg.h" #include "SrvAddrMgr.h" #include "SrvCfgMgr.h" #include "SrvIfaceMgr.h" #include "IPv6Addr.h" class TSrvMsgRequest : public TSrvMsg { public: TSrvMsgRequest(int iface, SPtr addr, char* buf, int bufSize); void doDuties(); bool check(); unsigned long getTimeout(); ~TSrvMsgRequest(); std::string getName() const; private: }; #endif /* SRVMSGREQUEST_H */ dibbler-1.0.1/SrvMessages/SrvMsgDecline.h0000664000175000017500000000173512233256142015165 00000000000000/* * Dibbler - a portable DHCPv6 * * authors: Tomasz Mrugalski * Marek Senderski * * released under GNU GPL v2 only licence * */ #ifndef SRVMSGDECLINE_H #define SRVMSGDECLINE_H #include "SrvMsg.h" class TSrvMsgDecline : public TSrvMsg { public: TSrvMsgDecline(int iface, SPtr addr, char* buf, int bufSize); bool check(); std::string getName() const; void doDuties(); unsigned long getTimeout(); ~TSrvMsgDecline(); }; #endif /* SRVMSGDECLINE_H */ dibbler-1.0.1/SrvMessages/SrvMsgLeaseQuery.h0000644000175000017500000000160312304040124015657 00000000000000/* * Dibbler - a portable DHCPv6 * * authors: Tomasz Mrugalski * * released under GNU GPL v2 only licence * */ class TSrvMsgLeaseQuery; #ifndef SRVMSGLEASEQUERY_H #define SRVMSGLEASEQUERY_H #include "SmartPtr.h" #include "SrvMsg.h" #include "IPv6Addr.h" class TSrvMsgLeaseQuery : public TSrvMsg { public: TSrvMsgLeaseQuery(int iface, SPtr addr, char* buf, int bufSize); void doDuties(); bool check(); ~TSrvMsgLeaseQuery(); std::string getName() const; private: }; #endif /* SRVMSGREQUEST_H */ dibbler-1.0.1/SrvMessages/Makefile.am0000644000175000017500000000226112277722750014347 00000000000000noinst_LIBRARIES = libSrvMessages.a libSrvMessages_a_CPPFLAGS = -I$(top_srcdir)/Misc -I$(top_srcdir)/Messages -I$(top_srcdir)/Options -I$(top_srcdir)/SrvOptions libSrvMessages_a_CPPFLAGS += -I$(top_srcdir)/SrvIfaceMgr -I$(top_srcdir)/IfaceMgr -I$(top_srcdir)/SrvCfgMgr libSrvMessages_a_CPPFLAGS += -I$(top_srcdir)/CfgMgr -I$(top_srcdir)/AddrMgr -I$(top_srcdir)/SrvAddrMgr libSrvMessages_a_CPPFLAGS += -I$(top_srcdir)/SrvTransMgr libSrvMessages_a_CPPFLAGS += -I$(top_srcdir)/poslib/poslib -I$(top_srcdir)/poslib libSrvMessages_a_SOURCES = SrvMsgAdvertise.cpp SrvMsgAdvertise.h SrvMsgConfirm.cpp SrvMsgConfirm.h libSrvMessages_a_SOURCES += SrvMsg.cpp SrvMsg.h SrvMsgDecline.cpp SrvMsgDecline.h libSrvMessages_a_SOURCES += SrvMsgInfRequest.cpp SrvMsgInfRequest.h SrvMsgLeaseQuery.cpp SrvMsgLeaseQuery.h libSrvMessages_a_SOURCES += SrvMsgLeaseQueryReply.cpp SrvMsgLeaseQueryReply.h SrvMsgRebind.cpp SrvMsgRebind.h libSrvMessages_a_SOURCES += SrvMsgRelease.cpp SrvMsgRelease.h SrvMsgRenew.cpp SrvMsgRenew.h libSrvMessages_a_SOURCES += SrvMsgReply.cpp SrvMsgReply.h SrvMsgRequest.cpp SrvMsgRequest.h libSrvMessages_a_SOURCES += SrvMsgSolicit.cpp SrvMsgSolicit.h SrvMsgReconfigure.cpp SrvMsgReconfigure.h dibbler-1.0.1/SrvMessages/SrvMsgReply.cpp0000664000175000017500000006032312560471634015256 00000000000000/* * Dibbler - a portable DHCPv6 * * authors: Tomasz Mrugalski * Marek Senderski * changes: Michal Kowalczuk * * released under GNU GPL v2 only licence * */ #include #include "SmartPtr.h" #include "OptEmpty.h" // rapid-commit option #include "SrvMsgReply.h" #include "SrvMsg.h" #include "OptOptionRequest.h" #include "OptStatusCode.h" #include "SrvOptIAAddress.h" #include "SrvOptIA_NA.h" #include "SrvOptIA_PD.h" #include "SrvOptTA.h" #include "SrvOptFQDN.h" #include "AddrClient.h" #include "AddrIA.h" #include "AddrAddr.h" #include "IfaceMgr.h" #include "Logger.h" using namespace std; /** * this constructor is used to create REPLY message as a response for CONFIRM message * * @param confirm */ TSrvMsgReply::TSrvMsgReply(SPtr confirm) :TSrvMsg(confirm->getIface(),confirm->getRemoteAddr(), REPLY_MSG, confirm->getTransID()) { getORO( (Ptr*)confirm ); copyClientID((Ptr*)confirm ); copyRelayInfo((Ptr*)confirm); copyAAASPI((Ptr*)confirm); copyRemoteID((Ptr*)confirm); if (!handleConfirmOptions( confirm->getOptLst() )) { IsDone = true; return; } appendMandatoryOptions(ORO); appendAuthenticationOption(ClientDUID); this->MRT_ = 31; IsDone = false; } bool TSrvMsgReply::handleConfirmOptions(TOptList & options) { SPtr cfgIface = SrvCfgMgr().getIfaceByID(Iface); if (!cfgIface) { Log(Crit) << "Msg received through not configured interface. " "Somebody call an exorcist!" << LogEnd; IsDone = true; return false; } EAddrStatus onLink = ADDRSTATUS_YES; int checkCnt = 0; TOptList::iterator opt = options.begin(); while ( (opt!=options.end()) && (onLink==ADDRSTATUS_YES) ) { switch ( (*opt)->getOptType()) { case OPTION_IA_NA: { SPtr ia = (Ptr*) (*opt); // now we check whether this IA exists in Server Address database or not. SPtr opt; ia->firstOption(); while ((opt = ia->getOption()) && (onLink == ADDRSTATUS_YES) ) { if (opt->getOptType() != OPTION_IAADDR){ continue; } SPtr optAddr = (Ptr*) opt; onLink = cfgIface->confirmAddress(IATYPE_IA, optAddr->getAddr()); checkCnt++; } break; } case OPTION_IA_TA: { SPtr ta = (Ptr*) (*opt); SPtr opt; ta->firstOption(); while ((opt = ta->getOption()) && (onLink == ADDRSTATUS_YES)) { if (opt->getOptType() != OPTION_IAADDR) continue; SPtr optAddr = (Ptr*) opt; onLink = cfgIface->confirmAddress(IATYPE_TA, optAddr->getAddr()); checkCnt++; } break; } case OPTION_IA_PD: { SPtr ta = (Ptr*) (*opt); SPtr opt; ta->firstOption(); while ((opt = ta->getOption()) && (onLink == ADDRSTATUS_YES)) { if (opt->getOptType() != OPTION_IAPREFIX) continue; SPtr optPrefix = (Ptr*) opt; onLink = cfgIface->confirmAddress(IATYPE_PD, optPrefix->getPrefix()); checkCnt++; } break; } default: handleDefaultOption(*opt); break; } ++opt; } if (!checkCnt) { Log(Info) << "No addresses or prefixes in CONFIRM. Not sending reply." << LogEnd; return false; } switch (onLink) { case ADDRSTATUS_YES: { SPtr ptrCode = new TOptStatusCode(STATUSCODE_SUCCESS, "Your addresses are correct for this link! Yay!", this); Options.push_back( (Ptr*) ptrCode); return true; } case ADDRSTATUS_NO: { SPtr ptrCode = new TOptStatusCode(STATUSCODE_NOTONLINK, "Sorry, those addresses are not valid for this link.", this); Options.push_back( (Ptr*) ptrCode ); return true; } default: case ADDRSTATUS_UNKNOWN: { Log(Info) << "Address/prefix being confirmed is outside of defined class," << " but there is no subnet defined, so can't answer authoritatively." << " Will not send answer." << LogEnd; return false; } } // should never get here return false; } /* * this constructor is used to create REPLY message as a response for DECLINE message * * @param decline */ TSrvMsgReply::TSrvMsgReply(SPtr decline) :TSrvMsg(decline->getIface(), decline->getRemoteAddr(), REPLY_MSG, decline->getTransID()) { getORO( (Ptr*)decline ); copyClientID( (Ptr*)decline ); copyRelayInfo( (Ptr*)decline ); copyAAASPI( (Ptr*)decline ); copyRemoteID( (Ptr*)decline ); SPtr ptrOpt; SPtr ptrClient = SrvAddrMgr().getClient(ClientDUID); if (!ptrClient) { Log(Warning) << "Received DECLINE from unknown client, DUID=" << *ClientDUID << ". Ignored." << LogEnd; IsDone = true; return; } SPtr declinedDUID = new TDUID("X",1); SPtr declinedClient = SrvAddrMgr().getClient( declinedDUID ); if (!declinedClient) { declinedClient = new TAddrClient( declinedDUID ); SrvAddrMgr().addClient(declinedClient); } decline->firstOption(); while (ptrOpt = decline->getOption() ) { switch (ptrOpt->getOptType()) { case OPTION_IA_NA: { SPtr ptrIA_NA = (Ptr*) ptrOpt; SPtr ptrIA = ptrClient->getIA(ptrIA_NA->getIAID()); if (!ptrIA) { Options.push_back( new TSrvOptIA_NA(ptrIA_NA->getIAID(), 0, 0, STATUSCODE_NOBINDING, "No such IA is bound.",this) ); continue; } // create empty IA SPtr replyIA_NA = new TSrvOptIA_NA(ptrIA_NA->getIAID(), 0, 0, this); int AddrsDeclinedCnt = 0; // IA found in DB, now move each addr in DB to "declined-client" and // ignore those, which are not present id DB SPtr subOpt; SPtr addr; ptrOpt->firstOption(); while( subOpt = ptrOpt->getOption() ) { if (subOpt->getOptType()==OPTION_IAADDR) { addr = (Ptr*) subOpt; // remove declined address from client if (SrvAddrMgr().delClntAddr(ptrClient->getDUID(), ptrIA_NA->getIAID(), addr->getAddr(), false)) { // add this address to DECLINED dummy client SrvAddrMgr().addClntAddr(declinedDUID, new TIPv6Addr("::", true), // client-address decline->getIface(), 0, 0, 0, // IAID addr->getAddr(), // declined address DECLINED_TIMEOUT, DECLINED_TIMEOUT, false); // set pref/valid lifetimes to 0 addr->setValid(0); addr->setPref(0); // ... and finally append it in reply replyIA_NA->addOption( subOpt ); AddrsDeclinedCnt++; } }; } Options.push_back((Ptr*)replyIA_NA); char buf[10]; sprintf(buf,"%d",AddrsDeclinedCnt); string tmp = buf; SPtr optStatusCode = new TOptStatusCode(STATUSCODE_SUCCESS, tmp + " addrs declined.", this); replyIA_NA->addOption( (Ptr*) optStatusCode ); break; }; case OPTION_IA_TA: Log(Info) << "TA address declined. It's temporary, so let's ignore it entirely." << LogEnd; break; default: handleDefaultOption(ptrOpt); break; } } appendMandatoryOptions(ORO); appendAuthenticationOption(ClientDUID); IsDone = false; MRT_ = 31; } /** * this constructor is used to create REPLY message as a response for REBIND message * * @param rebind */ TSrvMsgReply::TSrvMsgReply(SPtr rebind) :TSrvMsg(rebind->getIface(),rebind->getRemoteAddr(), REPLY_MSG, rebind->getTransID()) { getORO( (Ptr*)rebind ); copyClientID( (Ptr*)rebind ); copyRelayInfo( (Ptr*)rebind ); copyAAASPI( (Ptr*)rebind ); copyRemoteID( (Ptr*)rebind ); unsigned long addrCount=0; SPtr ptrOpt; rebind->firstOption(); while (ptrOpt = rebind->getOption() ) { switch (ptrOpt->getOptType()) { case OPTION_IA_NA: { SPtr optIA_NA; optIA_NA = new TSrvOptIA_NA((Ptr*)ptrOpt, rebind->getRemoteAddr(), ClientDUID, rebind->getIface(), addrCount, REBIND_MSG, this); if (optIA_NA->getStatusCode() != STATUSCODE_NOBINDING ) Options.push_back((Ptr*)optIA_NA); else { this->IsDone = true; Log(Notice) << "REBIND received with unknown addresses and " << "was silently discarded." << LogEnd; return; } break; } case OPTION_IA_PD: { SPtr pd; pd = new TSrvOptIA_PD( (Ptr*)rebind, (Ptr*) ptrOpt, this); Options.push_back((Ptr*)pd); break; } case OPTION_IAADDR: case OPTION_RAPID_COMMIT: case OPTION_STATUS_CODE: case OPTION_PREFERENCE: case OPTION_UNICAST: Log(Warning) << "Invalid option (" <getOptType() << ") received." << LogEnd; break; default: handleDefaultOption(ptrOpt); break; } } appendMandatoryOptions(ORO); appendRequestedOptions(ClientDUID, rebind->getRemoteAddr(),rebind->getIface(), ORO); appendAuthenticationOption(ClientDUID); IsDone = false; MRT_ = 0; } /** * this constructor is used to create REPLY message as a response for RELEASE message * * @param release */ TSrvMsgReply::TSrvMsgReply(SPtr release) :TSrvMsg(release->getIface(),release->getRemoteAddr(), REPLY_MSG, release->getTransID()) { getORO( (Ptr*) release ); copyClientID( (Ptr*) release ); copyRelayInfo((Ptr*)release); copyAAASPI((Ptr*)release); copyRemoteID((Ptr*)release); /// @todo When the server receives a Release message via unicast from a client /// to which the server has not sent a unicast option, the server /// discards the Release message and responds with a Reply message /// containing a Status Code option with value UseMulticast, a Server /// Identifier option containing the server's DUID, the Client Identifier /// option from the client message, and no other options. // for notify script TNotifyScriptParams* notifyParams = new TNotifyScriptParams(); SPtr opt, subOpt; SPtr client = SrvAddrMgr().getClient(ClientDUID); if (!client) { Log(Warning) << "Received RELEASE from unknown client DUID=" << ClientDUID->getPlain() << LogEnd; IsDone = true; return; } SPtr ptrIface = SrvCfgMgr().getIfaceByID( this->Iface ); if (!ptrIface) { Log(Crit) << "Msg received through not configured interface. " "Somebody call an exorcist!" << LogEnd; IsDone = true; return; } appendMandatoryOptions(ORO); appendAuthenticationOption(ClientDUID); release->firstOption(); while(opt=release->getOption()) { switch (opt->getOptType()) { case OPTION_IA_NA: { SPtr clntIA = (Ptr*) opt; SPtr addr; bool anyDeleted=false; // does this client has IA? (iaid check) SPtr ptrIA = client->getIA(clntIA->getIAID() ); if (!ptrIA) { Log(Warning) << "No such IA (iaid=" << clntIA->getIAID() << ") found for client:" << ClientDUID->getPlain() << LogEnd; Options.push_back( new TSrvOptIA_NA(clntIA->getIAID(), 0, 0, STATUSCODE_NOBINDING,"No such IA is bound.",this) ); continue; } // if there was DNS Update performed, execute deleting Update SPtr fqdn = ptrIA->getFQDN(); if (fqdn) { delFQDN(ptrIface, ptrIA, fqdn); } // let's verify each address clntIA->firstOption(); while(subOpt=clntIA->getOption()) { if (subOpt->getOptType()!=OPTION_IAADDR) continue; addr = (Ptr*) subOpt; if (SrvAddrMgr().delClntAddr(ClientDUID, clntIA->getIAID(), addr->getAddr(), false) ) { notifyParams->addAddr(addr->getAddr(), 0, 0, "SRV"); SrvCfgMgr().delClntAddr(this->Iface,addr->getAddr()); anyDeleted=true; } else { Log(Warning) << "No such binding found: client=" << ClientDUID->getPlain() << ", IA (iaid=" << clntIA->getIAID() << "), addr="<< addr->getAddr()->getPlain() << LogEnd; }; }; // send result to the client if (!anyDeleted) { SPtr ansIA(new TSrvOptIA_NA(clntIA->getIAID(), clntIA->getT1(),clntIA->getT2(),this)); Options.push_back((Ptr*)ansIA); ansIA->addOption(new TOptStatusCode(STATUSCODE_NOBINDING, "Not every address had binding.",this)); }; break; } case OPTION_IA_TA: { SPtr ta = (Ptr*) opt; bool anyDeleted = false; SPtr ptrIA = client->getTA(ta->getIAID() ); if (!ptrIA) { Log(Warning) << "No such TA (iaid=" << ta->getIAID() << ") found for client:" << ClientDUID->getPlain() << LogEnd; Options.push_back( new TSrvOptTA(ta->getIAID(), STATUSCODE_NOBINDING, "No such IA is bound.", this) ); continue; } // let's verify each address ta->firstOption(); while ( subOpt = (Ptr*) ta->getOption() ) { if (subOpt->getOptType()!=OPTION_IAADDR) continue; SPtr addr = (Ptr*) subOpt; if (SrvAddrMgr().delTAAddr(ClientDUID, ta->getIAID(), addr->getAddr(), false) ) { notifyParams->addAddr(addr->getAddr(), 0, 0 , ""); SrvCfgMgr().delTAAddr(this->Iface); anyDeleted=true; } else { Log(Warning) << "No such binding found: client=" << ClientDUID->getPlain() << ", TA (iaid=" << ta->getIAID() << "), addr="<< addr->getAddr()->getPlain() << LogEnd; }; } // send results to the client if (!anyDeleted) { SPtr answerTA = new TSrvOptTA(ta->getIAID(), STATUSCODE_NOBINDING, "Not every address had binding.", this); Options.push_back((Ptr*)answerTA); }; break; } case OPTION_IA_PD: { SPtr pd = (Ptr*) opt; SPtr prefix; bool anyDeleted=false; // does this client has PD? (iaid check) SPtr ptrPD = client->getPD( pd->getIAID() ); if (!ptrPD) { Log(Warning) << "No such PD (iaid=" << pd->getIAID() << ") found for client:" << ClientDUID->getPlain() << LogEnd; Options.push_back( new TSrvOptIA_PD(pd->getIAID(), 0, 0, STATUSCODE_NOBINDING,"No such PD is bound.",this) ); continue; } // let's verify each address pd->firstOption(); while(subOpt=pd->getOption()) { if (subOpt->getOptType()!=OPTION_IAPREFIX) continue; prefix = (Ptr*) subOpt; if (SrvAddrMgr().delPrefix(ClientDUID, pd->getIAID(), prefix->getPrefix(), false) ) { notifyParams->addPrefix(prefix->getPrefix(), prefix->getPrefixLength(), 0, 0); SrvCfgMgr().decrPrefixCount(Iface, prefix->getPrefix()); anyDeleted=true; } else { Log(Warning) << "PD: No such binding found: client=" << ClientDUID->getPlain() << ", PD (iaid=" << pd->getIAID() << "), addr="<< prefix->getPrefix()->getPlain() << LogEnd; }; }; // send result to the client if (!anyDeleted) { Options.push_back(new TSrvOptIA_PD(pd->getIAID(), 0u, 0u, STATUSCODE_NOBINDING, "Not every address had binding.", this)); }; break; } default: handleDefaultOption(opt); break; }; // switch(...) } // while Options.push_back(new TOptStatusCode(STATUSCODE_SUCCESS, "All IAs in RELEASE message were processed.",this)); NotifyScripts = notifyParams; IsDone = false; MRT_ = 46; } // used as RENEW reply TSrvMsgReply::TSrvMsgReply(SPtr renew) :TSrvMsg(renew->getIface(),renew->getRemoteAddr(), REPLY_MSG, renew->getTransID()) { getORO( (Ptr*)renew ); copyClientID( (Ptr*)renew ); copyRelayInfo((Ptr*)renew); copyAAASPI((Ptr*)renew); copyRemoteID((Ptr*)renew); unsigned long addrCount=0; SPtr ptrOpt; renew->firstOption(); while (ptrOpt = renew->getOption() ) { switch (ptrOpt->getOptType()) { case OPTION_IA_NA: { SPtr optIA_NA; optIA_NA = new TSrvOptIA_NA((Ptr*)ptrOpt, renew->getRemoteAddr(), ClientDUID, renew->getIface(), addrCount, RENEW_MSG, this); Options.push_back((Ptr*)optIA_NA); break; } case OPTION_IA_PD: { SPtr optPD; optPD = new TSrvOptIA_PD((Ptr*) renew, (Ptr*)ptrOpt, this); Options.push_back( (Ptr*) optPD); break; } case OPTION_IA_TA: Log(Warning) << "TA option present. Temporary addreses cannot be renewed." << LogEnd; break; //Invalid options in RENEW message case OPTION_RELAY_MSG : case OPTION_INTERFACE_ID : case OPTION_RECONF_MSG: case OPTION_IAADDR: case OPTION_PREFERENCE: case OPTION_RAPID_COMMIT: case OPTION_UNICAST: case OPTION_STATUS_CODE: Log(Warning) << "Invalid option "<getOptType()<<" received." << LogEnd; break; default: handleDefaultOption(ptrOpt); // do nothing with remaining options break; } } appendMandatoryOptions(ORO); appendRequestedOptions(ClientDUID,renew->getRemoteAddr(),renew->getIface(), ORO); appendAuthenticationOption(ClientDUID); IsDone = false; MRT_ = 0; } /** * this constructor is used to construct REPLY for REQUEST message * * @param request */ TSrvMsgReply::TSrvMsgReply(SPtr request) :TSrvMsg(request->getIface(), request->getRemoteAddr(), REPLY_MSG, request->getTransID()) { getORO( (Ptr*)request ); copyClientID( (Ptr*)request ); copyRelayInfo( (Ptr*)request ); copyAAASPI( (Ptr*)request ); copyRemoteID( (Ptr*)request ); processOptions((Ptr*)request, false); // be verbose appendMandatoryOptions(ORO); appendRequestedOptions(ClientDUID, PeerAddr_, Iface, ORO); appendAuthenticationOption(ClientDUID); #ifndef MOD_DISABLE_AUTH SPtr reconfAccept = request->getOption(OPTION_RECONF_ACCEPT); if (reconfAccept) { appendReconfigureKey(); } #endif IsDone = false; MRT_ = 330; } /// @brief ctor used for generating REPLY message as SOLICIT response (in rapid-commit mode) /// /// @param solicit client's message TSrvMsgReply::TSrvMsgReply(SPtr solicit) :TSrvMsg(solicit->getIface(), solicit->getRemoteAddr(), REPLY_MSG, solicit->getTransID()) { getORO( (Ptr*)solicit ); copyClientID( (Ptr*)solicit ); copyRelayInfo( (Ptr*)solicit ); copyAAASPI( (Ptr*)solicit ); copyRemoteID( (Ptr*)solicit ); processOptions((Ptr*) solicit, false); // append RAPID-COMMIT option Options.push_back(new TOptEmpty(OPTION_RAPID_COMMIT, this)); appendMandatoryOptions(ORO); appendRequestedOptions(ClientDUID, PeerAddr_, Iface, ORO); appendAuthenticationOption(ClientDUID); IsDone = false; MRT_ = 330; } // INFORMATION-REQUEST answer TSrvMsgReply::TSrvMsgReply(SPtr infRequest) :TSrvMsg(infRequest->getIface(), infRequest->getRemoteAddr(),REPLY_MSG,infRequest->getTransID()) { getORO( (Ptr*)infRequest ); copyClientID( (Ptr*)infRequest ); copyRelayInfo((Ptr*)infRequest); copyAAASPI((Ptr*)infRequest); copyRemoteID((Ptr*)infRequest); Log(Debug) << "Received INF-REQUEST requesting " << showRequestedOptions(ORO) << "." << LogEnd; infRequest->firstOption(); SPtr ptrOpt; while (ptrOpt = infRequest->getOption() ) { switch (ptrOpt->getOptType()) { case OPTION_RELAY_MSG : case OPTION_SERVERID : case OPTION_INTERFACE_ID: case OPTION_STATUS_CODE : case OPTION_IAADDR : case OPTION_PREFERENCE : case OPTION_UNICAST : case OPTION_RECONF_MSG : case OPTION_IA_NA : case OPTION_IA_TA : Log(Warning) << "Invalid option " << ptrOpt->getOptType() <<" received." << LogEnd; break; default: handleDefaultOption(ptrOpt); break; } } appendMandatoryOptions(ORO); if ( !appendRequestedOptions(ClientDUID, infRequest->getRemoteAddr(), infRequest->getIface(), ORO) ) { Log(Warning) << "No options to answer in INF-REQUEST, so REPLY will not be send." << LogEnd; IsDone=true; return; } appendAuthenticationOption(ClientDUID); IsDone = false; MRT_ = 330; } TSrvMsgReply::TSrvMsgReply(SPtr msg, TOptList& options) :TSrvMsg(msg->getIface(), msg->getRemoteAddr(), REPLY_MSG, msg->getTransID()) { // Let's just use specified options as they are Options = options; // Append client-id SPtr client_id = msg->getOption(OPTION_CLIENTID); if (client_id) { Options.push_back(client_id); } // Append server-id SPtr ptrSrvID; ptrSrvID = new TOptDUID(OPTION_SERVERID, SrvCfgMgr().getDUID(), this); Options.push_back((Ptr*)ptrSrvID); MRT_ = 330; IsDone = false; } void TSrvMsgReply::doDuties() { IsDone = true; } unsigned long TSrvMsgReply::getTimeout() { unsigned long diff = (uint32_t)time(NULL) - FirstTimeStamp_; if (diff > SERVER_REPLY_CACHE_TIMEOUT) return 0; return SERVER_REPLY_CACHE_TIMEOUT - diff; } bool TSrvMsgReply::check() { /* not used on the server side */ /* we generate REPLY messages, so they are *GOOD*. */ return false; } TSrvMsgReply::~TSrvMsgReply() { } string TSrvMsgReply::getName() const { return "REPLY"; } dibbler-1.0.1/SrvMessages/SrvMsgLeaseQueryReply.cpp0000644000175000017500000001525712556507455017270 00000000000000/* * Dibbler - a portable DHCPv6 * * authors: Tomasz Mrugalski * Marek Senderski * changes: Michal Kowalczuk * * released under GNU GPL v2 only licence * */ #include "SrvMsgLeaseQueryReply.h" #include "Logger.h" #include "SrvOptLQ.h" #include "OptStatusCode.h" #include "OptDUID.h" #include "SrvOptIAAddress.h" #include "SrvOptIAPrefix.h" #include "AddrClient.h" #include "SrvCfgMgr.h" using namespace std; TSrvMsgLeaseQueryReply::TSrvMsgLeaseQueryReply(SPtr query) :TSrvMsg(query->getIface(), query->getRemoteAddr(), LEASEQUERY_REPLY_MSG, query->getTransID()) { if (!answer(query)) { Log(Error) << "LQ: LQ-QUERY response generation failed." << LogEnd; IsDone = true; } else { Log(Debug) << "LQ: LQ-QUERY response generation successful." << LogEnd; IsDone = false; } } /** * * * @param queryMsg * * @return true - answer should be sent */ bool TSrvMsgLeaseQueryReply::answer(SPtr queryMsg) { int count = 0; SPtr opt; bool ok = true; Log(Info) << "LQ: Generating new LEASEQUERY_RESP message." << LogEnd; queryMsg->firstOption(); while ( opt = queryMsg->getOption()) { switch (opt->getOptType()) { case OPTION_LQ_QUERY: { count++; SPtr q = (Ptr*) opt; switch (q->getQueryType()) { case QUERY_BY_ADDRESS: ok = queryByAddress(q, queryMsg); break; case QUERY_BY_CLIENTID: ok = queryByClientID(q, queryMsg); break; default: Options.push_back(new TOptStatusCode(STATUSCODE_UNKNOWNQUERYTYPE, "Invalid Query type.", this) ); Log(Warning) << "LQ: Invalid query type (" << q->getQueryType() << " received." << LogEnd; return true; } if (!ok) { Log(Warning) << "LQ: Malformed query detected." << LogEnd; return false; } break; } case OPTION_CLIENTID: // copy the client-id option Options.push_back(opt); break; } } if (!count) { Options.push_back(new TOptStatusCode(STATUSCODE_MALFORMEDQUERY, "Required LQ_QUERY option missing.", this)); return true; } // append SERVERID SPtr serverID; serverID = new TOptDUID(OPTION_SERVERID, SrvCfgMgr().getDUID(), this); Options.push_back((Ptr*)serverID); // allocate buffer this->send(); return true; } bool TSrvMsgLeaseQueryReply::queryByAddress(SPtr q, SPtr queryMsg) { SPtr opt; q->firstOption(); SPtr addr; SPtr link = q->getLinkAddr(); while ( opt = q->getOption() ) { if (opt->getOptType() == OPTION_IAADDR) addr = (Ptr*) opt; } if (!addr) { Options.push_back(new TOptStatusCode(STATUSCODE_MALFORMEDQUERY, "Required IAADDR suboption missing.", this)); return true; } // search for client SPtr cli = SrvAddrMgr().getClient( addr->getAddr() ); if (!cli) { Log(Warning) << "LQ: Assignement for client addr=" << addr->getAddr()->getPlain() << " not found." << LogEnd; Options.push_back( new TOptStatusCode(STATUSCODE_NOTCONFIGURED, "No binding for this address found.", this) ); return true; } appendClientData(cli); return true; } bool TSrvMsgLeaseQueryReply::queryByClientID(SPtr q, SPtr queryMsg) { SPtr opt; SPtr duidOpt; SPtr duid; SPtr link = q->getLinkAddr(); q->firstOption(); while ( opt = q->getOption() ) { if (opt->getOptType() == OPTION_CLIENTID) { duidOpt = (Ptr*) opt; duid = duidOpt->getDUID(); } } if (!duid) { Options.push_back( new TOptStatusCode(STATUSCODE_UNSPECFAIL, "You didn't send your ClientID.", this) ); return true; } // search for client SPtr cli = SrvAddrMgr().getClient( duid ); if (!cli) { Log(Warning) << "LQ: Assignement for client duid=" << duid->getPlain() << " not found." << LogEnd; Options.push_back( new TOptStatusCode(STATUSCODE_NOTCONFIGURED, "No binding for this DUID found.", this) ); return true; } appendClientData(cli); return true; } void TSrvMsgLeaseQueryReply::appendClientData(SPtr cli) { Log(Debug) << "LQ: Appending data for client " << cli->getDUID()->getPlain() << LogEnd; SPtr cliData = new TSrvOptLQClientData(this); SPtr ia; SPtr addr; SPtr prefix; unsigned long nowTs = (uint32_t) time(NULL); unsigned long cliTs = cli->getLastTimestamp(); unsigned long diff = nowTs - cliTs; Log(Debug) << "LQ: modifying the lifetimes (client last seen " << diff << "secs ago)." << LogEnd; // add all assigned addresses cli->firstIA(); while ( ia = cli->getIA() ) { ia->firstAddr(); while ( addr=ia->getAddr() ) { unsigned long a = addr->getPref() - diff; unsigned long b = addr->getValid() - diff; cliData->addOption( new TSrvOptIAAddress(addr->get(), a, b, this) ); } } // add all assigned prefixes cli->firstPD(); while ( ia = cli->getPD() ) { ia->firstPrefix(); while (prefix = ia->getPrefix()) { cliData->addOption( new TSrvOptIAPrefix( prefix->get(), prefix->getLength(), prefix->getPref(), prefix->getValid(), this)); } } cliData->addOption(new TOptDUID(OPTION_CLIENTID, cli->getDUID(), this)); /// @todo: add all temporary addresses // add CLT_TIME Log(Debug) << "LQ: Adding CLT_TIME option: " << diff << " second(s)." << LogEnd; cliData->addOption( new TSrvOptLQClientTime(diff, this)); Options.push_back((Ptr*)cliData); } bool TSrvMsgLeaseQueryReply::check() { // this should never happen return true; } TSrvMsgLeaseQueryReply::~TSrvMsgLeaseQueryReply() { } unsigned long TSrvMsgLeaseQueryReply::getTimeout() { return 0; } void TSrvMsgLeaseQueryReply::doDuties() { IsDone = true; } string TSrvMsgLeaseQueryReply::getName() const { return "LEASE-QUERY-REPLY"; } dibbler-1.0.1/SrvMessages/SrvMsgReconfigure.h0000644000175000017500000000117312277722750016077 00000000000000/* * Dibbler - a portable DHCPv6 * * author: Grzegorz Pluto * changes: Tomasz Mrugalski * * released under GNU GPL v2 only licence * */ #ifndef SRVMSGRECONFIGURE_H #define SRVMSGRECONFIGURE_H #include "SrvMsg.h" #include "SrvMsgSolicit.h" class TSrvMsgReconfigure : public TSrvMsg { public: // creates object based on a buffer TSrvMsgReconfigure(int iface, SPtr clientAddr, int msgType, SPtr clientDuid); bool check(); void doDuties(); unsigned long getTimeout(); std::string getName() const; ~TSrvMsgReconfigure(); }; #endif /* SRVMSGRECONFIGURE_H */ dibbler-1.0.1/SrvMessages/SrvMsgDecline.cpp0000664000175000017500000000222512233256142015513 00000000000000/* * Dibbler - a portable DHCPv6 * * authors: Tomasz Mrugalski * Marek Senderski * * released under GNU GPL v2 only licence * */ #include "SrvMsgDecline.h" #include "AddrClient.h" #include "OptDUID.h" TSrvMsgDecline::TSrvMsgDecline(int iface, SPtr addr, char* buf, int bufSize) :TSrvMsg(iface,addr,buf,bufSize) { } void TSrvMsgDecline::doDuties() { } unsigned long TSrvMsgDecline::getTimeout() { return 0; } bool TSrvMsgDecline::check() { return TSrvMsg::check(true /* ClientID required */, true /* ServerID mandatory */); } TSrvMsgDecline::~TSrvMsgDecline() { } std::string TSrvMsgDecline::getName() const { return "DECLINE"; } dibbler-1.0.1/SrvMessages/SrvMsgReply.h0000644000175000017500000000332412420534422014705 00000000000000/* * Dibbler - a portable DHCPv6 * * authors: Tomasz Mrugalski * Marek Senderski * changes: Krzysztof Wnuk * released under GNU GPL v2 only licence * */ class TSrvMsgReply; #ifndef SRVMSGREPLY_H #define SRVMSGREPLY_H #include "SrvMsg.h" #include "SrvMsgConfirm.h" #include "SrvMsgDecline.h" #include "SrvMsgRequest.h" #include "SrvMsgReply.h" #include "SrvMsgRebind.h" #include "SrvMsgRenew.h" #include "SrvMsgRelease.h" #include "SrvMsgSolicit.h" #include "SrvMsgInfRequest.h" #include "SrvOptIAAddress.h" #include "OptDUID.h" class TSrvMsgReply : public TSrvMsg { public: TSrvMsgReply(SPtr question); TSrvMsgReply(SPtr question); TSrvMsgReply(SPtr question); TSrvMsgReply(SPtr question); TSrvMsgReply(SPtr question); TSrvMsgReply(SPtr question); TSrvMsgReply(SPtr question); TSrvMsgReply(SPtr question); TSrvMsgReply(SPtr msg, TOptList& options); void doDuties(); unsigned long getTimeout(); bool check(); std::string getName() const; ~TSrvMsgReply(); private: bool handleSolicitOptions(TOptList& options); bool handleRequestOptions(TOptList& options); bool handleRenewOptions(TOptList& options); bool handleRebindOptions(TOptList& options); bool handleReleaseOptions(TOptList& options); bool handleDeclineOptions(TOptList& options); bool handleConfirmOptions(TOptList& options); bool handleInfRequestOptions(TOptList& options); EAddrStatus confirmAddress(TIAType type, SPtr addr); }; #endif /* SRVMSGREPLY_H */ dibbler-1.0.1/SrvMessages/SrvMsg.h0000644000175000017500000001137412474423046013705 00000000000000/* * Dibbler - a portable DHCPv6 * * authors: Tomasz Mrugalski * Marek Senderski * changes: Krzysztof Wnuk * Michal Kowalczuk * * released under GNU GPL v2 only licence * */ #ifndef SRVMSG_H #define SRVMSG_H #include #include "Msg.h" #include "SmartPtr.h" #include "SrvAddrMgr.h" #include "IPv6Addr.h" #include "SrvCfgIface.h" #include "OptOptionRequest.h" #include "SrvOptInterfaceID.h" #include "SrvOptFQDN.h" #include "SrvOptIA_NA.h" #include "SrvOptTA.h" #include "SrvOptIA_PD.h" #include "OptVendorData.h" #include "OptGeneric.h" class TSrvMsg : public TMsg { public: struct RelayInfo { int Hop_; SPtr LinkAddr_; SPtr PeerAddr_; size_t Len_; TOptList EchoList_; }; TSrvMsg(int iface, SPtr addr, char* buf, int bufSize); TSrvMsg(int iface, SPtr addr, int msgType, long transID); void copyRelayInfo(SPtr q); void copyAAASPI(SPtr q); void copyRemoteID(SPtr q); bool copyClientID(SPtr donor); void appendAuthenticationOption(SPtr duid); bool appendMandatoryOptions(SPtr oro, bool includeClientID = true); bool appendRequestedOptions(SPtr duid, SPtr addr, int iface, SPtr reqOpt); std::string showRequestedOptions(SPtr oro); bool appendVendorSpec(SPtr duid, int iface, int vendor, SPtr reqOpt); void appendStatusCode(); #ifndef MOD_DISABLE_AUTH void appendReconfigureKey(); bool validateReplayDetection(); #endif /// @todo: modify this to use RelayInfo structure void addRelayInfo(SPtr linkAddr, SPtr peerAddr, int hop, const TOptList& echoList); bool releaseAll(bool quiet); virtual bool check() = 0; /// @todo: get out with this shit void setRemoteID(SPtr remoteID); SPtr getRemoteID(); unsigned long getTimeout(); void doDuties(); void send(int dstPort = 0); void processOptions(SPtr clientMsg, bool quiet); SPtr getClientDUID(); SPtr getClientPeer(); /// @brief sets message type (used in testing only) /// /// @param type type of a message (RELAY_FORW or RELAY_REPL) inline void setMsgType(uint8_t type) { forceMsgType_ = type; } /// @brief clears relay information (used in testing only) void clearRelayInfo() { RelayInfo_.clear(); } /// @brief Relay information /// /// Let's make this public, so there are issues with reference /// being returned and then used past them message lifetime std::vector RelayInfo_; void setPhysicalIface(int iface); int getPhysicalIface() const; protected: void setDefaults(); SPtr ORO; void handleDefaultOption(SPtr ptrOpt); void getORO(SPtr clientMessage); SPtr ClientDUID; bool check(bool clntIDmandatory, bool srvIDmandatory); void processIA_NA(SPtr clientMsg, SPtr q); void processIA_TA(SPtr clientMsg, SPtr q); void processIA_PD(SPtr clientMsg, SPtr q); void processFQDN(SPtr clientMsg, SPtr q); #if 0 SPtr prepareFQDN(SPtr requestFQDN, SPtr clntDuid, SPtr clntAddr, std::string hint, bool doRealUpdate); void fqdnRelease(SPtr ptrIface, SPtr ia, SPtr fqdn); #endif SPtr addFQDN(int iface, SPtr requestFQDN, SPtr clntDuid, SPtr clntAddr, std::string hint, bool doRealUpdate); void delFQDN(SPtr cfgIface, SPtr ptrIA, SPtr fqdn); int storeSelfRelay(char * buf, uint8_t relayLevel, ESrvIfaceIdOrder order); unsigned long FirstTimeStamp_; // timestamp of first message transmission unsigned long MRT_; // maximum retransmission timeout /// @todo: this should be moved to RelayInfo_ structure SPtr RemoteID; // this MAY be set, if message was recevied via relay // AND relay appended RemoteID /// used in tests only. If non-zero, send message type is set to that type uint8_t forceMsgType_; /// physical interface from/to which message was received/should be sent int physicalIface_; }; typedef std::vector< SPtr > SrvMsgList; #endif dibbler-1.0.1/SrvMessages/SrvMsgAdvertise.cpp0000644000175000017500000000346412474423305016106 00000000000000/* * Dibbler - a portable DHCPv6 * * authors: Tomasz Mrugalski * Marek Senderski * changes: Michal Kowalczuk * * released under GNU GPL v2 only licence * */ #include "SrvMsgAdvertise.h" #include "Logger.h" #include "OptOptionRequest.h" #include "OptDUID.h" #include "SrvOptIA_NA.h" #include "SrvOptTA.h" #include "OptStatusCode.h" #include "SrvOptFQDN.h" #include "SrvOptIA_PD.h" #include "SrvTransMgr.h" #include "Logger.h" using namespace std; TSrvMsgAdvertise::TSrvMsgAdvertise(SPtr solicit) :TSrvMsg(solicit->getIface(),solicit->getRemoteAddr(), ADVERTISE_MSG, solicit->getTransID()) { getORO((Ptr*)solicit); copyClientID((Ptr*)solicit); copyRelayInfo(solicit); copyAAASPI(solicit); copyRemoteID(solicit); if (!handleSolicitOptions(solicit)) { IsDone = true; return; } IsDone = false; } bool TSrvMsgAdvertise::handleSolicitOptions(SPtr solicit) { processOptions((Ptr*)solicit, true); // quietly // append serverID, preference and possibly unicast appendMandatoryOptions(ORO); //if client requested parameters and policy doesn't forbid from answering appendRequestedOptions(ClientDUID, PeerAddr_, Iface, ORO); appendStatusCode(); // this is ADVERTISE only, so we need to release assigned addresses releaseAll(true); // release it quietly appendAuthenticationOption(ClientDUID); MRT_ = 0; return true; } bool TSrvMsgAdvertise::check() { // this should never happen return true; } TSrvMsgAdvertise::~TSrvMsgAdvertise() { } unsigned long TSrvMsgAdvertise::getTimeout() { return 0; } void TSrvMsgAdvertise::doDuties() { IsDone = true; } std::string TSrvMsgAdvertise::getName() const{ return "ADVERTISE"; } dibbler-1.0.1/SrvMessages/SrvMsgAdvertise.h0000644000175000017500000000114512277722750015554 00000000000000/* * Dibbler - a portable DHCPv6 * * authors: Tomasz Mrugalski * Marek Senderski * * released under GNU GPL v2 only licence * */ #ifndef SRVMSGADVERTISE_H #define SRVMSGADVERTISE_H #include "SrvMsg.h" class TSrvMsgAdvertise : public TSrvMsg { public: // creates object based on a buffer TSrvMsgAdvertise(SPtr question); bool check(); bool handleSolicitOptions(SPtr solicit); void doDuties(); unsigned long getTimeout(); std::string getName() const; ~TSrvMsgAdvertise(); }; #endif /* SRVMSGADVERTISE_H */ dibbler-1.0.1/SrvMessages/SrvMsgRequest.cpp0000664000175000017500000000266612233256142015611 00000000000000/* * Dibbler - a portable DHCPv6 * * authors: Tomasz Mrugalski * Marek Senderski * changes: Krzysztof Wnuk * released under GNU GPL v2 only licence * * $Id: SrvMsgRequest.cpp,v 1.9 2008-08-29 00:07:35 thomson Exp $ * */ #include "SrvMsgRequest.h" #include "SmartPtr.h" #include "DHCPConst.h" #include "SrvIfaceMgr.h" #include "SrvMsgAdvertise.h" #include "SrvOptIA_NA.h" #include "AddrClient.h" TSrvMsgRequest::TSrvMsgRequest(int iface, SPtr addr, char* buf, int bufSize) :TSrvMsg(iface,addr,buf,bufSize) { } void TSrvMsgRequest::doDuties() { return; } bool TSrvMsgRequest::check() { return TSrvMsg::check(true /* ClientID required */, true /* ServerID required */); } unsigned long TSrvMsgRequest::getTimeout() { return 0; } TSrvMsgRequest::~TSrvMsgRequest() { } std::string TSrvMsgRequest::getName() const { return "REQUEST"; } dibbler-1.0.1/SrvMessages/SrvMsgConfirm.h0000664000175000017500000000156712233256142015222 00000000000000/* * Dibbler - a portable DHCPv6 * * authors: Tomasz Mrugalski * Marek Senderski * * released under GNU GPL v2 only licence * * $Id: SrvMsgConfirm.h,v 1.5 2008-08-29 00:07:34 thomson Exp $ * */ #ifndef SRVMSGCONFIRM_H #define SRVMSGCONFIRM_H #include "SrvMsg.h" #include "SrvIfaceMgr.h" #include "SrvTransMgr.h" #include "SrvCfgMgr.h" #include "SrvAddrMgr.h" // Client sends CONFIRM to a server to verify that his addresses // are still valid. It could happen when: // 1. client has restated // 2. client changed link class TSrvMsgConfirm : public TSrvMsg { public: TSrvMsgConfirm(int iface, SPtr addr, char* buf, int bufSize); void doDuties(); bool check(); unsigned long getTimeout(); /// @todo this is obsolete ~TSrvMsgConfirm(); std::string getName() const; }; #endif /* SRVMSGCONFIRM_H*/ dibbler-1.0.1/SrvMessages/SrvMsgRebind.cpp0000664000175000017500000000143612233256142015356 00000000000000/* * Dibbler - a portable DHCPv6 * * authors: Tomasz Mrugalski * Marek Senderski * * released under GNU GPL v2 only licence * * $Id: SrvMsgRebind.cpp,v 1.6 2008-08-29 00:07:35 thomson Exp $ * */ #include "SmartPtr.h" #include "SrvMsg.h" #include "SrvMsgRebind.h" #include "AddrClient.h" TSrvMsgRebind::TSrvMsgRebind(int iface, SPtr addr, char* buf, int bufSize) :TSrvMsg(iface, addr,buf,bufSize) { } void TSrvMsgRebind::doDuties() { } unsigned long TSrvMsgRebind::getTimeout() { return 0; } bool TSrvMsgRebind::check() { return TSrvMsg::check(true /* ClientID required */, false /* ServerID not allowed */); } std::string TSrvMsgRebind::getName() const { return "REBIND"; } TSrvMsgRebind::~TSrvMsgRebind() { } dibbler-1.0.1/SrvMessages/SrvMsgRenew.h0000664000175000017500000000110112233256142014665 00000000000000/* * Dibbler - a portable DHCPv6 * * authors: Tomasz Mrugalski * Marek Senderski * chamges Krzysztof Wnuk * released under GNU GPL v2 only licence * */ #ifndef SRVMSGRENEW_H #define SRVMSGRENEW_H #include "SrvMsg.h" class TSrvMsgRenew : public TSrvMsg { public: TSrvMsgRenew(int iface, SPtr addr, char* buf, int bufSize); void doDuties(); unsigned long getTimeout(); std::string getName() const; bool check(); ~TSrvMsgRenew(); }; #endif /* SRVMSGRENEW_H */ dibbler-1.0.1/SrvMessages/SrvMsgReconfigure.cpp0000644000175000017500000000432712277722750016436 00000000000000/* * Dibbler - a portable DHCPv6 * * author: Grzgorz Pluto * changes: Tomasz Mrugalski * * released under GNU GPL v2 only licence * */ #include "SrvMsgReconfigure.h" #include "Logger.h" #include "SrvOptIA_NA.h" #include "SrvOptTA.h" #include "OptStatusCode.h" #include "OptReconfigureMsg.h" #include "OptDUID.h" #include "Opt.h" #include "SrvOptIA_PD.h" #include "OptReconfigureMsg.h" #include "OptAuthentication.h" #include "Logger.h" #include "hex.h" #include "Key.h" TSrvMsgReconfigure::TSrvMsgReconfigure(int iface, SPtr clientAddr, int msgType, SPtr clientDuid) :TSrvMsg(iface, clientAddr, RECONFIGURE_MSG, 0/*trans-id*/) { // include our DUID (server-id) Options.push_back(new TOptDUID(OPTION_SERVERID, SrvCfgMgr().getDUID(), this)); // include his DUID (client-id) Options.push_back(new TOptDUID(OPTION_CLIENTID, clientDuid, this)); // include Reconfigure Message Options.push_back(new TOptReconfigureMsg(msgType, this) ); SPtr cli = SrvAddrMgr().getClient(clientDuid); if (cli && cli->ReconfKey_.size() > 0) { setAuthKey(cli->ReconfKey_); Log(Debug) << "Auth: Setting reconfigure-key to " << hexToText(&cli->ReconfKey_[0], cli->ReconfKey_.size()) << LogEnd; // insert authentication option SPtr optAuth = new TOptAuthentication(AUTH_PROTO_RECONFIGURE_KEY, 1, AUTH_REPLAY_NONE, this); TKey tmp(17,0); tmp[0] = 2; // see RFC3315, section 21.5.1 optAuth->setPayload(tmp); Options.push_back((Ptr*)optAuth); } else { Log(Warning) << "Auth: No reconfigure-key specified for client. Sending" << " without key, client will likely to ignore this update." << LogEnd; } send(); return; } bool TSrvMsgReconfigure::check() { // this should never happen return true; } TSrvMsgReconfigure::~TSrvMsgReconfigure() { } unsigned long TSrvMsgReconfigure::getTimeout() { return 0; } void TSrvMsgReconfigure::doDuties() { IsDone = true; } std::string TSrvMsgReconfigure::getName() const { return "RECONFIGURE"; } dibbler-1.0.1/SrvMessages/SrvMsg.cpp0000644000175000017500000011551112556511102014226 00000000000000/* * Dibbler - a portable DHCPv6 * * authors: Tomasz Mrugalski * Marek Senderski * changes: Krzysztof Wnuk * Michal Kowalczuk * * released under GNU GPL v2 only licence */ #include #include "Portable.h" #include "SrvMsg.h" #include "OptEmpty.h" #include "OptDUID.h" #include "OptAddr.h" #include "OptString.h" #include "SrvOptIA_NA.h" #include "SrvOptIA_PD.h" #include "OptStatusCode.h" #include "OptGeneric.h" #include "SrvOptLQ.h" #include "SrvOptTA.h" #include "SrvCfgOptions.h" #include "SrvOptFQDN.h" #include "OptAddrLst.h" #include "OptDomainLst.h" #include "OptUserClass.h" #include "OptVendorClass.h" #include "OptAuthentication.h" #include "Logger.h" #include "SrvIfaceMgr.h" #include "AddrClient.h" using namespace std; /** * this constructor is used to build message as a reply to the received message * (i.e. it is used to contruct ADVERTISE or REPLY) * * @param iface * @param addr * @param msgType * @param transID */ TSrvMsg::TSrvMsg(int iface, SPtr addr, int msgType, long transID) :TMsg(iface, addr, msgType, transID), FirstTimeStamp_((uint32_t)time(NULL)), MRT_(0), forceMsgType_(0), physicalIface_(iface) { } /** * this constructor builds message based on the buffer * (i.e. SOLICIT, REQUEST, RENEW, REBIND, RELEASE, INF-REQUEST, DECLINE) * * @param iface * @param addr * @param buf * @param bufSize */ TSrvMsg::TSrvMsg(int iface, SPtr addr, char* buf, int bufSize) :TMsg(iface, addr, buf, bufSize), forceMsgType_(0), physicalIface_(iface) { setDefaults(); int pos=0; while (posbufSize) { Log(Error) << "Message " << MsgType << " truncated. There are " << (bufSize-pos) << " bytes left to parse. Bytes ignored." << LogEnd; break; } unsigned short code = buf[pos]*256 + buf[pos+1]; pos+=2; unsigned short length = buf[pos]*256 + buf[pos+1]; pos+=2; if (pos+length>bufSize) { Log(Error) << "Malformed option (type=" << code << ", len=" << length << ", offset from beginning of DHCPv6 message=" << pos+4 /* 4=msg-type+trans-id */ << ") received (msgtype=" << MsgType << "). Message dropped." << LogEnd; IsDone = true; return; } SPtr ptr; if (!allowOptInMsg(MsgType,code)) { Log(Warning) << "Option " << code << " not allowed in message type="<< MsgType <<". Option ignored." << LogEnd; pos+=length; continue; } if (!allowOptInOpt(MsgType,0,code)) { Log(Warning) <<"Option " << code << " can't be present in message (type=" << MsgType <<") directly. Option ignored." << LogEnd; pos+=length; continue; } ptr.reset(); switch (code) { case OPTION_CLIENTID: ptr = new TOptDUID(OPTION_CLIENTID, buf+pos, length, this); break; case OPTION_SERVERID: ptr = new TOptDUID(OPTION_SERVERID, buf+pos, length, this); break; case OPTION_IA_NA: ptr = new TSrvOptIA_NA(buf+pos,length,this); break; case OPTION_ORO: ptr = new TOptOptionRequest(OPTION_ORO, buf+pos, length, this); break; case OPTION_PREFERENCE: ptr = new TOptInteger(OPTION_PREFERENCE, 1, buf+pos, length, this); break; case OPTION_ELAPSED_TIME: ptr = new TOptInteger(OPTION_ELAPSED_TIME, OPTION_ELAPSED_TIME_LEN, buf+pos, length, this); break; case OPTION_UNICAST: ptr = new TOptAddr(OPTION_UNICAST, buf+pos, length, this); break; case OPTION_STATUS_CODE: ptr = new TOptStatusCode(buf+pos,length,this); break; case OPTION_RAPID_COMMIT: ptr = new TOptEmpty(code, buf+pos, length, this); break; case OPTION_DNS_SERVERS: case OPTION_SNTP_SERVERS: case OPTION_SIP_SERVER_A: case OPTION_NIS_SERVERS: case OPTION_NISP_SERVERS: ptr = new TOptAddrLst(code, buf+pos, length, this); break; case OPTION_DOMAIN_LIST: case OPTION_SIP_SERVER_D: case OPTION_NIS_DOMAIN_NAME: case OPTION_NISP_DOMAIN_NAME: ptr = new TOptDomainLst(code, buf+pos, length, this); break; case OPTION_NEW_TZDB_TIMEZONE: ptr = new TOptString(OPTION_NEW_TZDB_TIMEZONE, buf+pos, length, this); break; case OPTION_FQDN: ptr = new TSrvOptFQDN(buf+pos, length, this); break; case OPTION_INFORMATION_REFRESH_TIME: ptr = new TOptInteger(OPTION_INFORMATION_REFRESH_TIME, OPTION_INFORMATION_REFRESH_TIME_LEN, buf+pos, length, this); break; case OPTION_IA_TA: ptr = new TSrvOptTA(buf+pos, length, this); break; case OPTION_IA_PD: ptr = new TSrvOptIA_PD(buf+pos, length, this); break; case OPTION_LQ_QUERY: ptr = new TSrvOptLQ(buf+pos, length, this); break; // remaining LQ options are not supported to be received by server case OPTION_AUTH: ptr = new TOptAuthentication(buf+pos, length, this); #ifndef MOD_DISABLE_AUTH if (SrvCfgMgr().getDigest() != DIGEST_NONE) { SPtr optDUID = (SPtr)this->getOption(OPTION_CLIENTID); if (optDUID) { SPtr client = SrvAddrMgr().getClient(optDUID->getDUID()); if (client) client->setSPI(SPI_); } } #endif break; case OPTION_VENDOR_OPTS: ptr = new TOptVendorSpecInfo(code, buf+pos, length, this); break; case OPTION_RECONF_ACCEPT: ptr = new TOptEmpty(code, buf+pos, length, this); break; case OPTION_USER_CLASS: ptr = new TOptUserClass(code, buf+pos, length, this); break; case OPTION_VENDOR_CLASS: ptr = new TOptVendorClass(code, buf+pos, length, this); break; case OPTION_RECONF_MSG: case OPTION_RELAY_MSG: default: Log(Warning) << "Option type " << code << " not supported yet." << LogEnd; break; } if ( (ptr) && (ptr->isValid()) ) Options.push_back( ptr ); else Log(Warning) << "Option type " << code << " invalid. Option ignored." << LogEnd; pos += length; } } void TSrvMsg::setDefaults() { #ifndef MOD_DISABLE_AUTH DigestType_ = SrvCfgMgr().getDigest(); // AuthKeys = SrvCfgMgr().AuthKeys; #endif FirstTimeStamp_ = (uint32_t)time(NULL); MRT_ = 0; } /// Processes options in incoming message and assigns leases and options, if possible. /// This method may be used in any message that causes server to assign anything, i.e. /// SOLICIT, REQUEST, RENEW, REBIND (and possibly CONFIRM) /// /// @param clientMsg client message /// @param quiet (false will make this method verbose) void TSrvMsg::processOptions(SPtr clientMsg, bool quiet) { SPtr opt; SPtr clntAddr = PeerAddr_; // --- process this message --- clientMsg->firstOption(); while ( opt = clientMsg->getOption()) { switch (opt->getOptType()) { case OPTION_IA_NA : { processIA_NA((Ptr*)clientMsg, (Ptr*) opt); break; } case OPTION_IA_TA: { processIA_TA((Ptr*)clientMsg, (Ptr*) opt); break; } case OPTION_IA_PD: { processIA_PD((Ptr*)clientMsg, (Ptr*) opt); break; } case OPTION_AUTH : { ORO->addOption(OPTION_AUTH); break; } case OPTION_FQDN : { // skip processing for now (we need to process all IA_NA/IA_TA first) break; } case OPTION_VENDOR_OPTS: { SPtr v = (Ptr*) opt; appendVendorSpec(ClientDUID, Iface, v->getVendor(), ORO); break; } case OPTION_PREFERENCE: case OPTION_UNICAST: case OPTION_RELAY_MSG: case OPTION_INTERFACE_ID: case OPTION_RECONF_MSG : case OPTION_STATUS_CODE : { Log(Warning) << "Invalid option (" << opt->getOptType() << ") received. " << "Client is not supposed to send it. Option ignored." << LogEnd; break; } case OPTION_RECONF_ACCEPT: { /// @todo: remember that client supports reconfigure break; } default: { handleDefaultOption(opt); break; } } // end of switch } // end of while // process FQDN afer all addresses are processed opt = clientMsg->getOption(OPTION_FQDN); if (opt) { processFQDN((Ptr*)clientMsg, (Ptr*) opt); } } /// @brief Releases all addresses and prefixes specified in this message. /// /// @param quiet be quiet (false = verbose) /// /// @return true, if anything was released bool TSrvMsg::releaseAll(bool quiet) { bool released = false; SPtr opt; this->firstOption(); while ( opt = this->getOption()) { switch (opt->getOptType()) { case OPTION_IA_NA: { SPtr ptrOptIA_NA; ptrOptIA_NA = (Ptr*) opt; ptrOptIA_NA->releaseAllAddrs(quiet); released = true; break; } case OPTION_IA_TA: { SPtr ta; ta = (Ptr*) opt; ta->releaseAllAddrs(quiet); released = true; break; } case OPTION_IA_PD: { SPtr pd; pd = (Ptr*) opt; pd->releaseAllPrefixes(quiet); released = true; break; } default: { continue; } } } return released; } void TSrvMsg::doDuties() { if ( !this->getTimeout() ) this->IsDone = true; } unsigned long TSrvMsg::getTimeout() { uint32_t now = (uint32_t)time(NULL); if (FirstTimeStamp_ + MRT_ - now > 0 ) return FirstTimeStamp_ + MRT_ - now; else return 0; } void TSrvMsg::addRelayInfo(SPtr linkAddr, SPtr peerAddr, int hop, const TOptList& echolist) { RelayInfo info; info.LinkAddr_ = linkAddr; info.PeerAddr_ = peerAddr; info.Hop_ = hop; info.EchoList_ = echolist; info.Len_ = 0; /// @todo: what about this? RelayInfo_.push_back(info); } void TSrvMsg::send(int dstPort /* = 0 */) { char* buf = new char[getSize() < 2048? 2048:getSize()]; int offset = 0; int port; SPtr gen; SPtr ptrIface; SPtr under; ptrIface = (Ptr*) SrvIfaceMgr().getIfaceByID(this->Iface); if (!ptrIface) { SPtr cfgIface = SrvCfgMgr().getIfaceByID(this->Iface); if (!cfgIface) { Log(Error) << "Can't send message: interface with ifindex=" << this->Iface << " not found." << LogEnd; delete [] buf; return; } if (cfgIface->getRelayID()==-1) { Log(Error) << "Can't send message: interface " << cfgIface->getFullName() << " is invalid relay." << LogEnd; delete [] buf; return; } ptrIface = (Ptr*) SrvIfaceMgr().getIfaceByID(cfgIface->getRelayID()); if (!ptrIface) { Log(Error) << "Can't send message: interface " << cfgIface->getFullName() << " has invalid physical interface defined (ifindex=" << cfgIface->getRelayID() << "." << LogEnd; delete [] buf; return; } } Log(Notice) << "Sending " << this->getName() << " on " << ptrIface->getFullName() << hex << ",transID=0x" << this->getTransID() << dec << ", opts:"; SPtr ptrOpt; this->firstOption(); while (ptrOpt = this->getOption() ) Log(Cont) << " " << ptrOpt->getOptType(); Log(Cont) << ", " << RelayInfo_.size() << " relay(s)." << LogEnd; port = DHCPCLIENT_PORT; if (!RelayInfo_.empty()) { port = DHCPSERVER_PORT; if (RelayInfo_.size() > HOP_COUNT_LIMIT) { Log(Error) << "Unable to send message. Got " << RelayInfo_.size() << " relay entries (" << HOP_COUNT_LIMIT << " is allowed maximum." << LogEnd; delete [] buf; return; } size_t len = getSize(); RelayInfo_.back().Len_ = len; for (int i = RelayInfo_.size() - 1; i > 0; i--) { SPtr interface_id = TOpt::getOption(RelayInfo_[i].EchoList_, OPTION_INTERFACE_ID); // 38 = 34 bytes (relay header) + 4 bytes (relay-msg option header) RelayInfo_[i-1].Len_ = RelayInfo_[i].Len_ + 38; if (interface_id && (SrvCfgMgr().getInterfaceIDOrder()!=SRV_IFACE_ID_ORDER_NONE)) { RelayInfo_[i-1].Len_ += interface_id->getSize(); for (TOptList::iterator it = RelayInfo_[i].EchoList_.begin(); it != RelayInfo_[i].EchoList_.end(); ++it) { RelayInfo_[i-1].Len_ += (*it)->getSize(); } //RelayInfo_[i].EchoList_.first(); //while (gen = RelayInfo_[i].EchoList_.get()) { // RelayInfo_[i-1].Len_ += gen->getSize(); //} } } #if 0 // calculate lengths of all relays Len_[Relays_ - 1] = getSize(); for (int i = Relays_ - 1; i > 0; i--) { Len_[i-1] = Len_[i] + 38; // 34 bytes (relay header) + 4 bytes (relay-msg option header) if (InterfaceIDTbl_[i] && (SrvCfgMgr().getInterfaceIDOrder()!=SRV_IFACE_ID_ORDER_NONE)) { Len_[i-1] += InterfaceIDTbl_[i]->getSize(); EchoListTbl_[i].first(); while (gen = EchoListTbl_[i].get()) { Len_[i-1] += gen->getSize(); } } } #endif // recursive storeSelf offset += storeSelfRelay(buf, 0, SrvCfgMgr().getInterfaceIDOrder() ); Log(Debug) << "Sending " << this->getSize() << "(packet)+" << offset << "(relay headers) data on the " << ptrIface->getFullName() << " interface." << LogEnd; } else { offset += this->storeSelf(buf+offset); } if (dstPort) { port = dstPort; } SrvIfaceMgr().send(ptrIface->getID(), buf, offset, PeerAddr_, port); delete [] buf; } SPtr TSrvMsg::getClientDUID() { SPtr opt; opt = getOption(OPTION_CLIENTID); if (!opt) return SPtr(); // NULL SPtr clientid = (Ptr*) opt; return clientid->getDUID(); } void TSrvMsg::processIA_NA(SPtr clientMsg, SPtr queryOpt) { SPtr optIA_NA; optIA_NA = new TSrvOptIA_NA( queryOpt, clientMsg, this); Options.push_back(optIA_NA); } void TSrvMsg::processIA_TA(SPtr clientMsg, SPtr queryOpt) { SPtr optTA; optTA = new TSrvOptTA(queryOpt, clientMsg, clientMsg->getType(), this); Options.push_back(optTA); } void TSrvMsg::processIA_PD(SPtr clientMsg, SPtr queryOpt) { SPtr optPD; optPD = new TSrvOptIA_PD(clientMsg, queryOpt, this); Options.push_back(optPD); } #ifndef MOD_DISABLE_AUTH void TSrvMsg::appendReconfigureKey() { // Let's see if we have a key for this particular client SPtr client = SrvAddrMgr().getClient(ClientDUID); if (!client) { return; // something is wrong (or this is solicit) } // are we using something better than reconfigure key already? if (getOption(OPTION_AUTH)) { // yes, there's auth option included already. Let's not use RECONFIGURE_KEY then return; } SPtr auth = new TOptAuthentication(AUTH_PROTO_RECONFIGURE_KEY, 1, AUTH_REPLAY_NONE, this); switch (MsgType) { case REPLY_MSG: { // If there is no reconfigure key nonce generated client->generateReconfKey(); // insert reconfigure nonce vector key(17, 0); key[0] = 1; // reconfigure key (see RFC3315, 21.5.1) memcpy(&key[1], &client->ReconfKey_[0], 16); auth->setPayload(key); break; } case RECONFIGURE_MSG: { // insert hash-key vector key(0, 17); key[0] = 2; // HMAC-MD5 (see RFC3315, 21.5.1) auth->setPayload(key); break; } default: { // don't include reconfigure-key in any other message type return; } } Options.push_back((Ptr*)auth); } #endif void TSrvMsg::processFQDN(SPtr clientMsg, SPtr requestFQDN) { string hint = requestFQDN->getFQDN(); SPtr optFQDN; bool doRealUpdate = false; if (clientMsg->getType() == REQUEST_MSG || clientMsg->getType() == RELEASE_MSG) { doRealUpdate = true; } SPtr clntAssignedAddr = SrvAddrMgr().getFirstAddr(ClientDUID); if (!clntAssignedAddr) { clntAssignedAddr = PeerAddr_; // it's better than nothing. Put it in FQDN option, // doRealUpdate = false; // but do not do the actual update } optFQDN = addFQDN(Iface, requestFQDN, ClientDUID, clntAssignedAddr, hint, doRealUpdate); if (optFQDN) Options.push_back((Ptr*) optFQDN); } /** * creates FQDN option and executes DNS Update procedure (if necessary) * * @param iface interface index * @param requestFQDN requested Fully Qualified Domain Name * @param clntDuid client DUID * @param clntAddr client address * @param hint hint used to get name (it may or may not be used) * @param doRealUpdate - should the real update be performed (for example if response for * SOLICIT is prepare, this should be set to false) * * @return FQDN option */ SPtr TSrvMsg::addFQDN(int iface, SPtr requestFQDN, SPtr clntDuid, SPtr clntAddr, std::string hint, bool doRealUpdate) { SPtr optFQDN; SPtr cfgIface = SrvCfgMgr().getIfaceByID(iface); if (!cfgIface) { Log(Crit) << "Msg received through not configured interface. " "Somebody call an exorcist!" << LogEnd; this->IsDone = true; return SPtr(); // NULL } // FQDN is chosen, "" if no name for this host is found. if (!cfgIface->supportFQDN()) { Log(Error) << "FQDN is not defined on " << cfgIface->getFullName() << " interface." << LogEnd; return SPtr(); // NULL } Log(Debug) << "Requesting FQDN for client with DUID=" << clntDuid->getPlain() << ", addr=" << clntAddr->getPlain() << LogEnd; SPtr fqdn = cfgIface->getFQDNName(clntDuid,clntAddr, hint); if (!fqdn) { Log(Debug) << "Unable to find FQDN for this client." << LogEnd; return SPtr(); // NULL } optFQDN = new TSrvOptFQDN(fqdn->getName(), NULL); optFQDN->setSFlag(false); // Setting the O Flag correctly according to the difference between O flags optFQDN->setOFlag(requestFQDN->getSFlag() /*xor 0*/); string fqdnName = fqdn->getName(); if (requestFQDN->getNFlag()) { Log(Notice) << "FQDN: No DNS Update required." << LogEnd; return optFQDN; } fqdn->setUsed(true); int FQDNMode = cfgIface->getFQDNMode(); Log(Debug) << "FQDN: Adding FQDN Option in REPLY message: " << fqdnName << ", FQDNMode=" << FQDNMode << LogEnd; if ( FQDNMode==1 || FQDNMode==2 ) { //Log(Debug) << "FQDN: Server configuration allows DNS updates for " << clntDuid->getPlain() // << LogEnd; if (FQDNMode == 1) optFQDN->setSFlag(false); else optFQDN->setSFlag(true); // letting client update his AAAA // Setting the O Flag correctly according to the difference between O flags optFQDN->setOFlag(requestFQDN->getSFlag() /*xor 0*/); SPtr DNSAddr = SrvCfgMgr().getDDNSAddress(iface); if (!DNSAddr) { Log(Error) << "DDNS: DNS Update aborted. DNS server address is not specified." << LogEnd; return SPtr(); // NULL } SPtr ptrAddrClient = SrvAddrMgr().getClient(clntDuid); if (!ptrAddrClient) { Log(Warning) << "Unable to find client." << LogEnd; return SPtr(); // NULL } ptrAddrClient->firstIA(); SPtr ptrAddrIA = ptrAddrClient->getIA(); if (!ptrAddrIA) { Log(Warning) << "Client does not have any IA(s) assigned." << LogEnd; return SPtr(); // NULL } ptrAddrIA->firstAddr(); SPtr addr = ptrAddrIA->getAddr(); if (!addr) { Log(Warning) << "Client does not have any address(es) assigned." << LogEnd; return SPtr(); // NULL } // regardless of the result, store the info ptrAddrIA->setFQDN(fqdn); ptrAddrIA->setFQDNDnsServer(DNSAddr); if (doRealUpdate) { Log(Notice) << "FQDN: About to perform DNS Update: IP=" << addr->get()->getPlain() << " and FQDN=" << fqdnName << LogEnd; SrvIfaceMgr().addFQDN(cfgIface->getID(), DNSAddr, addr->get(), fqdnName); } else { Log(Debug) << "FQDN: Skipping DNS Update." << LogEnd; } } else { Log(Debug) << "Server configuration does NOT allow DNS updates for " << clntDuid->getPlain() << LogEnd; optFQDN->setNFlag(true); } return optFQDN; } void TSrvMsg::delFQDN(SPtr cfgIface, SPtr ptrIA, SPtr fqdn) { string fqdnName = fqdn->getName(); fqdn->setUsed(false); SPtr dns = ptrIA->getFQDNDnsServer(); if (!dns) { Log(Warning) << "Unable to find DNS Server for IA=" << ptrIA->getIAID() << LogEnd; return; } ptrIA->firstAddr(); SPtr addrAddr = ptrIA->getAddr(); SPtr clntAddr; if (!addrAddr) { Log(Error) << "Client does not have any addresses asigned to IA (IAID=" << ptrIA->getIAID() << ")." << LogEnd; return; } clntAddr = addrAddr->get(); if (!clntAddr) { // WTF? Removing FQDN for a client without address? Log(Error) << "Failed to remove FQDN for client: " << "no address assigned for this client in database." << LogEnd; return; } // do the actual update over wire SrvIfaceMgr().delFQDN(cfgIface->getID(), dns, clntAddr, fqdnName); } void TSrvMsg::copyRemoteID(SPtr q) { this->RemoteID = q->getRemoteID(); } bool TSrvMsg::copyClientID(SPtr donor) { SPtr x = donor->getOption(OPTION_CLIENTID); if (x) { SPtr optDuid = (Ptr*) x; ClientDUID = optDuid->getDUID(); return true; } return false; } SPtr TSrvMsg::getClientPeer() { if (!RelayInfo_.empty()) { return RelayInfo_[0].PeerAddr_; //first hop ? } return PeerAddr_; } void TSrvMsg::copyRelayInfo(SPtr q) { RelayInfo_ = q->RelayInfo_; } /** * stores message in a buffer, used in relayed messages * * @param buf buffer for data to be stored * @param relayDepth number or current relay level * @param order order of the interface-id option (before, after or omit) * * @return - number of bytes used */ int TSrvMsg::storeSelfRelay(char * buf, uint8_t relayDepth, ESrvIfaceIdOrder order) { int offset = 0; if (relayDepth == RelayInfo_.size()) { return storeSelf(buf); } buf[offset++] = forceMsgType_?forceMsgType_:RELAY_REPL_MSG; buf[offset++] = RelayInfo_[relayDepth].Hop_; RelayInfo_[relayDepth].LinkAddr_->storeSelf(buf+offset); RelayInfo_[relayDepth].PeerAddr_->storeSelf(buf+offset+16); offset += 32; SPtr interfaceid = TOpt::getOption(RelayInfo_[relayDepth].EchoList_, OPTION_INTERFACE_ID); if (order == SRV_IFACE_ID_ORDER_BEFORE) { if (interfaceid) { interfaceid->storeSelf(buf+offset); offset += interfaceid->getSize(); } } writeUint16((buf+offset), OPTION_RELAY_MSG); offset += sizeof(uint16_t); writeUint16((buf+offset), RelayInfo_[relayDepth].Len_); offset += sizeof(uint16_t); offset += storeSelfRelay(buf+offset, relayDepth+1, order); if (order == SRV_IFACE_ID_ORDER_AFTER) { if (interfaceid) { interfaceid->storeSelf(buf+offset); offset += interfaceid->getSize(); } } SPtr echo; for (TOptList::const_iterator it = RelayInfo_[relayDepth].EchoList_.begin(); it != RelayInfo_[relayDepth].EchoList_.end(); ++it) { if ((*it)->getOptType() == OPTION_ERO) { echo = *it; } } if (echo) { SPtr ero = (Ptr*) echo; for (TOptList::const_iterator it = RelayInfo_[relayDepth].EchoList_.begin(); it != RelayInfo_[relayDepth].EchoList_.end(); ++it) { if (ero->isOption((*it)->getOptType())) { Log(Debug) << "Echoing back option " << (*it)->getOptType() << ", length " << (*it)->getSize() << LogEnd; (*it)->storeSelf(buf+offset); offset += (*it)->getSize(); } } } #if 0 SPtr gen; RelayInfo_[relayDepth].EchoList_.first(); while (gen = RelayInfo_[relayDepth].EchoList_.get()) { Log(Debug) << "Echoing back option " << gen->getOptType() << ", length " << gen->getSize() << LogEnd; gen->storeSelf(buf+offset); offset += gen->getSize(); } #endif return offset; } void TSrvMsg::copyAAASPI(SPtr q) { #ifndef MOD_DISABLE_AUTH //this->AAASPI = q->getAAASPI(); SPI_ = q->SPI_; AuthKey_ = q->AuthKey_; DigestType_ = q->DigestType_; #endif } /** * this function appends authentication option * */ void TSrvMsg::appendAuthenticationOption(SPtr duid) { uint8_t algo = 0; #ifndef MOD_DISABLE_AUTH if (!duid) { Log(Error) << "Auth: No duid! Probably internal error. Authentication option not appended." << LogEnd; return; } switch (SrvCfgMgr().getAuthProtocol()) { case AUTH_PROTO_NONE: return; case AUTH_PROTO_DELAYED: { uint32_t key_id = SrvCfgMgr().getDelayedAuthKeyID(SRV_KEYMAP_FILE, duid); if (!key_id) { Log(Info) << "AUTH: no key-id specified for client with DUID " << duid->getPlain() << LogEnd; return; } setSPI(key_id); if (!loadAuthKey()) { Log(Error) << "AUTH: Failed to load key with key-id: " << hex << key_id << LogEnd; return; } algo = 1; // HMAC-MD5 break; } case AUTH_PROTO_RECONFIGURE_KEY: // Server is supposed to include reconfigure-key in RECONFIGURE message only if (MsgType != RECONFIGURE_MSG) return; case AUTH_PROTO_DIBBLER: /// @todo: server now forces its default algorithm. It should be possible /// for the server to keep using whatever the client chose. DigestType_ = SrvCfgMgr().getDigest(); if (DigestType_ == DIGEST_NONE) { return; } algo = DigestType_; Log(Debug) << "Auth: Dibbler protocol, setting digest type to " << getDigestName(DigestType_) << LogEnd; SPtr client = SrvAddrMgr().getClient(duid); if (client && !client->getSPI() && getSPI()) client->setSPI(getSPI()); if (getSPI() == 0) { Log(Info) << "Auth: no key selected (SPI=0) for this message, will not include AUTH option." << LogEnd; return; } } if (!getOption(OPTION_AUTH)) { SPtr auth = new TOptAuthentication(SrvCfgMgr().getAuthProtocol(), algo, SrvCfgMgr().getAuthReplay(), this); auth->setReplayDetection(SrvAddrMgr().getNextReplayDetectionValue()); auth->setRealm(SrvCfgMgr().getAuthRealm()); // defined for delayed-auth only Options.push_back((Ptr*)auth); } #endif } bool TSrvMsg::appendMandatoryOptions(SPtr oro, bool clientID /* =true */) { // include our DUID (Server ID) SPtr ptrSrvID; ptrSrvID = new TOptDUID(OPTION_SERVERID, SrvCfgMgr().getDUID(), this); Options.push_back((Ptr*)ptrSrvID); oro->delOption(OPTION_SERVERID); // include his DUID (Client ID) if (clientID && ClientDUID) { SPtr clientDuid = new TOptDUID(OPTION_CLIENTID, ClientDUID, this); Options.push_back( (Ptr*)clientDuid); } // ... and our preference SPtr ptrPreference; unsigned char preference = SrvCfgMgr().getIfaceByID(Iface)->getPreference(); Log(Debug) << "Preference set to " << (int)preference << "." << LogEnd; ptrPreference = new TOptInteger(OPTION_PREFERENCE, 1, preference, this); Options.push_back((Ptr*)ptrPreference); oro->delOption(OPTION_PREFERENCE); // does this server support unicast? SPtr unicastAddr = SrvCfgMgr().getIfaceByID(Iface)->getUnicast(); if (unicastAddr) { SPtr optUnicast = new TOptAddr(OPTION_UNICAST, unicastAddr, this); Options.push_back((Ptr*)optUnicast); oro->delOption(OPTION_UNICAST); } return true; } /** * this function appends all standard options * * @param duid * @param addr * @param iface * @param reqOpts * * @return true, if any options (conveying configuration paramter) has been appended */ bool TSrvMsg::appendRequestedOptions(SPtr duid, SPtr addr, int iface, SPtr reqOpts) { bool newOptionAssigned = false; // client didn't want any option? Or maybe we're not supporting this client? if (!reqOpts->count()) return false; SPtr ptrIface=SrvCfgMgr().getIfaceByID(iface); if (!ptrIface) { Log(Error) << "Unable to find interface (ifindex=" << iface << "). Something is wrong." << LogEnd; return false; } SPtr ex = ptrIface->getClientException(duid, this, false/* false = verbose */); /// @todo: Make this an array of options and handle them in an uniform manner // --- option: DNS resolvers --- // --- option: DOMAIN LIST --- // --- option: NTP servers --- // --- option: TIMEZONE --- // --- option: SIP SERVERS is now handled with common extra options mechanism --- // --- option: SIP DOMAINS is now handled with common extra options mechanism --- // --- option: NIS SERVERS is now handled with common extra options mechanism --- // --- option: NIS DOMAIN is now handled with common extra options mechanism --- // --- option: NISP SERVERS is now handled with common extra options mechanism --- // --- option: NISP DOMAIN is now handled with common extra options mechanism --- // --- option: FQDN --- // see processFQDN() method // --- option: VENDOR SPEC --- if ( reqOpts->isOption(OPTION_VENDOR_OPTS)) { if (appendVendorSpec(duid, iface, 0, reqOpts)) newOptionAssigned = true; } // --- option: INFORMATION_REFRESH_TIME --- // this option should be checked last // --- option: forced options first --- TOptList extraOpts; // possible additional options TOptList forcedOpts; // forced (asked for or not, will send them anyway) if (ex) { extraOpts = ex->getExtraOptions(); forcedOpts = ex->getForcedOptions(); } if (!ex || !extraOpts.size()) extraOpts = ptrIface->getExtraOptions(); if (!ex || !forcedOpts.size()) forcedOpts = ptrIface->getForcedOptions(); for (TOptList::iterator gen = forcedOpts.begin(); gen!=forcedOpts.end(); ++gen) { Log(Debug) << "Appending mandatory extra option " << (*gen)->getOptType() << " (" << (*gen)->getSize() << ")" << LogEnd; Options.push_back( (Ptr*) *gen); reqOpts->delOption( (*gen)->getOptType() ); newOptionAssigned = true; } for (TOptList::iterator gen = extraOpts.begin(); gen!=extraOpts.end(); ++gen) { if (reqOpts->isOption( (*gen)->getOptType())) { Log(Debug) << "Appending requested extra option " << (*gen)->getOptType() << " (" << (*gen)->getSize() << ")" << LogEnd; Options.push_back( (Ptr*) *gen); newOptionAssigned = true; } } #ifdef AUTH_CRAP // --- option: KEYGEN --- #ifndef MOD_DISABLE_AUTH if ( reqOpts->isOption(OPTION_KEYGEN) && SrvCfgMgr().getDigest() != DIGEST_NONE ) { // && this->MsgType == ADVERTISE_MSG ) { SPtr optKeyGeneration = new TSrvOptKeyGeneration(this); Options.push_back( (Ptr*)optKeyGeneration); } #endif #endif return newOptionAssigned; } /** * this function prints all options specified in the ORO option */ string TSrvMsg::showRequestedOptions(SPtr oro) { ostringstream x; int i = oro->count(); x << i << " opts"; if (i) x << ":"; for (i=0;icount();i++) { x << " " << oro->getReqOpt(i); } return x.str(); } bool TSrvMsg::check(bool clntIDmandatory, bool srvIDmandatory) { bool status = TMsg::check(clntIDmandatory, srvIDmandatory); SPtr optSrvID = (Ptr*) this->getOption(OPTION_SERVERID); if (optSrvID) { if ( !( *(SrvCfgMgr().getDUID()) == *(optSrvID->getDUID()) ) ) { Log(Debug) << "Wrong ServerID value detected. This message is not for me. Message ignored." << LogEnd; return false; } } return status; } bool TSrvMsg::appendVendorSpec(SPtr duid, int iface, int vendor, SPtr reqOpt) { reqOpt->delOption(OPTION_VENDOR_OPTS); SPtr ptrIface=SrvCfgMgr().getIfaceByID(iface); if (!ptrIface) { Log(Error) << "Unable to find interface with ifindex=" << iface << LogEnd; return false; } Log(Debug) << "Client requested vendor-spec. info (vendor=" << vendor << ")." << LogEnd; SPtr ex = ptrIface->getClientException(duid, this, true); SPtr vs; List(TOptVendorSpecInfo) vsLst; if (ex) { vsLst = ex->getVendorSpecLst(vendor); } else { vsLst = ptrIface->getVendorSpecLst(vendor); } if (!vsLst.count()) vsLst = ptrIface->getVendorSpecLst(vendor); if (vsLst.count()) { vsLst.first(); while (vs=vsLst.get()) { Options.push_back( (Ptr*)vs); } return true; } Log(Debug) << "Unable to find suitable vendor-specific info option." << LogEnd; return false; } #ifndef MOD_DISABLE_AUTH /// verifies if the received packet is a replayed message /// /// @return true if message is ok (false if it is replayed and should be dropped) bool TSrvMsg::validateReplayDetection() { if (SrvCfgMgr().getAuthReplay() == AUTH_REPLAY_NONE) { // we don't care about replay detection return true; } // get the client's information SPtr client; SPtr optDUID = (Ptr*)getOption(OPTION_CLIENTID); if (optDUID) { client = SrvAddrMgr().getClient(optDUID->getDUID()); } // This is either anonymous inf-request, // Or this is the first transmission from the client if (!client) { return true; } SPtr auth = (Ptr*)getOption(OPTION_AUTH); if (!auth) { // there's no auth option. We can't protect against replays return true; } uint64_t received = auth->getReplayDetection(); uint64_t last_received = client->getReplayDetectionRcvd(); if (last_received < received) { Log(Debug) << "Auth: Replay detection field should be greater than " << last_received << " and it actually is (" << received << ")" << LogEnd; client->setReplayDetectionRcvd(received); return true; } else { Log(Warning) << "Auth: Replayed message detected: previously received: " << last_received << ", now received " << received << LogEnd; return false; } return true; // not really needed } #endif void TSrvMsg::setRemoteID(SPtr remoteID) { RemoteID = remoteID; } SPtr TSrvMsg::getRemoteID() { return RemoteID; } /** * copy status-code to top-level if something is wrong (i.e. status-code!=SUCCESS) * */ void TSrvMsg::appendStatusCode() { SPtr rootLevel, optLevel; SPtr opt; //rootLevel = getOption(OPTION_STATUS_CODE); firstOption(); while (opt = getOption()) { switch ( opt->getOptType() ) { case OPTION_IA_NA: { if (optLevel= (Ptr*)opt->getOption(OPTION_STATUS_CODE)) { if (optLevel->getCode() != STATUSCODE_SUCCESS) { // copy status code to root-level delOption(OPTION_STATUS_CODE); rootLevel = new TOptStatusCode(optLevel->getCode(), optLevel->getText(), this); Options.push_back( (Ptr*) rootLevel); return; } } } default: { } } } } void TSrvMsg::handleDefaultOption(SPtr ptrOpt) { int opt = ptrOpt->getOptType(); // RECONF_ACCEPT is the last standard option defined in RFC3315 // All other options are considered extensions if (opt > OPTION_RECONF_ACCEPT && !ORO->isOption(opt) && !getOption(opt)) { ORO->addOption(opt); } } /** * finds OPTION_REQUEST OPTION in options * * @param msg - parent message */ void TSrvMsg::getORO(SPtr msg) { ORO = (Ptr*)msg->getOption(OPTION_ORO); if (!ORO) ORO = new TOptOptionRequest(OPTION_ORO, this); } /// @brief sets physical interface index /// /// This may be different than Iface_ for relayed messages void TSrvMsg::setPhysicalIface(int iface) { physicalIface_ = iface; } /// @brief returns physical interface index /// /// This may be different than Iface_ for relayed messages int TSrvMsg::getPhysicalIface() const { return physicalIface_; } dibbler-1.0.1/SrvMessages/SrvMsgConfirm.cpp0000664000175000017500000000142612233256142015547 00000000000000/* * Dibbler - a portable DHCPv6 * * authors: Tomasz Mrugalski * Marek Senderski * * released under GNU GPL v2 only licence * * $Id: SrvMsgConfirm.cpp,v 1.6 2008-08-29 00:07:34 thomson Exp $ * */ #include "SmartPtr.h" #include "AddrClient.h" #include "SrvMsgConfirm.h" TSrvMsgConfirm::TSrvMsgConfirm(int iface, SPtr addr, char* buf, int bufSize) :TSrvMsg(iface, addr,buf,bufSize) { } void TSrvMsgConfirm::doDuties() { } unsigned long TSrvMsgConfirm::getTimeout() { return 0; } bool TSrvMsgConfirm::check() { return TSrvMsg::check(true /* ClientID required */, false /* ServerID not allowed */); } TSrvMsgConfirm::~TSrvMsgConfirm() { } std::string TSrvMsgConfirm::getName() const { return "CONFIRM"; } dibbler-1.0.1/SrvMessages/SrvMsgInfRequest.h0000664000175000017500000000123412233256142015701 00000000000000/* * Dibbler - a portable DHCPv6 * * authors: Tomasz Mrugalski * Marek Senderski * * released under GNU GPL v2 only licence * */ #ifndef SRVINFREQUEST_H #define SRVINFREQUEST_H #include "SmartPtr.h" #include "SrvMsg.h" #include "IPv6Addr.h" class TSrvMsgInfRequest : public TSrvMsg { public: TSrvMsgInfRequest(int iface, SPtr addr, char* buf, int bufSize); void doDuties(); bool check(); unsigned long getTimeout(); std::string getName() const; ~TSrvMsgInfRequest(); private: SPtr AddrMgr; List(TMsg) BackupSrvLst; }; #endif /* SRVMSGINFREQUEST_H */ dibbler-1.0.1/SrvMessages/Makefile.in0000664000175000017500000014613412561652535014371 00000000000000# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = SrvMessages DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/depcomp ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/libtool.m4 \ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/include/dibbler-config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = LIBRARIES = $(noinst_LIBRARIES) ARFLAGS = cru AM_V_AR = $(am__v_AR_@AM_V@) am__v_AR_ = $(am__v_AR_@AM_DEFAULT_V@) am__v_AR_0 = @echo " AR " $@; am__v_AR_1 = libSrvMessages_a_AR = $(AR) $(ARFLAGS) libSrvMessages_a_LIBADD = am_libSrvMessages_a_OBJECTS = \ libSrvMessages_a-SrvMsgAdvertise.$(OBJEXT) \ libSrvMessages_a-SrvMsgConfirm.$(OBJEXT) \ libSrvMessages_a-SrvMsg.$(OBJEXT) \ libSrvMessages_a-SrvMsgDecline.$(OBJEXT) \ libSrvMessages_a-SrvMsgInfRequest.$(OBJEXT) \ libSrvMessages_a-SrvMsgLeaseQuery.$(OBJEXT) \ libSrvMessages_a-SrvMsgLeaseQueryReply.$(OBJEXT) \ libSrvMessages_a-SrvMsgRebind.$(OBJEXT) \ libSrvMessages_a-SrvMsgRelease.$(OBJEXT) \ libSrvMessages_a-SrvMsgRenew.$(OBJEXT) \ libSrvMessages_a-SrvMsgReply.$(OBJEXT) \ libSrvMessages_a-SrvMsgRequest.$(OBJEXT) \ libSrvMessages_a-SrvMsgSolicit.$(OBJEXT) \ libSrvMessages_a-SrvMsgReconfigure.$(OBJEXT) libSrvMessages_a_OBJECTS = $(am_libSrvMessages_a_OBJECTS) AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)/include depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) LTCXXCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CXXFLAGS) $(CXXFLAGS) AM_V_CXX = $(am__v_CXX_@AM_V@) am__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@) am__v_CXX_0 = @echo " CXX " $@; am__v_CXX_1 = CXXLD = $(CXX) CXXLINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \ $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CXXLD = $(am__v_CXXLD_@AM_V@) am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@) am__v_CXXLD_0 = @echo " CXXLD " $@; am__v_CXXLD_1 = COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(libSrvMessages_a_SOURCES) DIST_SOURCES = $(libSrvMessages_a_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALLOCA = @ALLOCA@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ ARCH = @ARCH@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ EXTRA_DIST_SUBDIRS = @EXTRA_DIST_SUBDIRS@ FGREP = @FGREP@ GREP = @GREP@ GTEST_INCLUDES = @GTEST_INCLUDES@ GTEST_LDADD = @GTEST_LDADD@ GTEST_LDFLAGS = @GTEST_LDFLAGS@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LINKPRINT = @LINKPRINT@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PORT_CFLAGS = @PORT_CFLAGS@ PORT_LDFLAGS = @PORT_LDFLAGS@ PORT_SUBDIR = @PORT_SUBDIR@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ subdirs = @subdirs@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ noinst_LIBRARIES = libSrvMessages.a libSrvMessages_a_CPPFLAGS = -I$(top_srcdir)/Misc \ -I$(top_srcdir)/Messages -I$(top_srcdir)/Options \ -I$(top_srcdir)/SrvOptions -I$(top_srcdir)/SrvIfaceMgr \ -I$(top_srcdir)/IfaceMgr -I$(top_srcdir)/SrvCfgMgr \ -I$(top_srcdir)/CfgMgr -I$(top_srcdir)/AddrMgr \ -I$(top_srcdir)/SrvAddrMgr -I$(top_srcdir)/SrvTransMgr \ -I$(top_srcdir)/poslib/poslib -I$(top_srcdir)/poslib libSrvMessages_a_SOURCES = SrvMsgAdvertise.cpp SrvMsgAdvertise.h \ SrvMsgConfirm.cpp SrvMsgConfirm.h SrvMsg.cpp SrvMsg.h \ SrvMsgDecline.cpp SrvMsgDecline.h SrvMsgInfRequest.cpp \ SrvMsgInfRequest.h SrvMsgLeaseQuery.cpp SrvMsgLeaseQuery.h \ SrvMsgLeaseQueryReply.cpp SrvMsgLeaseQueryReply.h \ SrvMsgRebind.cpp SrvMsgRebind.h SrvMsgRelease.cpp \ SrvMsgRelease.h SrvMsgRenew.cpp SrvMsgRenew.h SrvMsgReply.cpp \ SrvMsgReply.h SrvMsgRequest.cpp SrvMsgRequest.h \ SrvMsgSolicit.cpp SrvMsgSolicit.h SrvMsgReconfigure.cpp \ SrvMsgReconfigure.h all: all-am .SUFFIXES: .SUFFIXES: .cpp .lo .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign SrvMessages/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign SrvMessages/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstLIBRARIES: -test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES) libSrvMessages.a: $(libSrvMessages_a_OBJECTS) $(libSrvMessages_a_DEPENDENCIES) $(EXTRA_libSrvMessages_a_DEPENDENCIES) $(AM_V_at)-rm -f libSrvMessages.a $(AM_V_AR)$(libSrvMessages_a_AR) libSrvMessages.a $(libSrvMessages_a_OBJECTS) $(libSrvMessages_a_LIBADD) $(AM_V_at)$(RANLIB) libSrvMessages.a mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libSrvMessages_a-SrvMsg.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libSrvMessages_a-SrvMsgAdvertise.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libSrvMessages_a-SrvMsgConfirm.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libSrvMessages_a-SrvMsgDecline.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libSrvMessages_a-SrvMsgInfRequest.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libSrvMessages_a-SrvMsgLeaseQuery.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libSrvMessages_a-SrvMsgLeaseQueryReply.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libSrvMessages_a-SrvMsgRebind.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libSrvMessages_a-SrvMsgReconfigure.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libSrvMessages_a-SrvMsgRelease.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libSrvMessages_a-SrvMsgRenew.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libSrvMessages_a-SrvMsgReply.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libSrvMessages_a-SrvMsgRequest.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libSrvMessages_a-SrvMsgSolicit.Po@am__quote@ .cpp.o: @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $< .cpp.obj: @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .cpp.lo: @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LTCXXCOMPILE) -c -o $@ $< libSrvMessages_a-SrvMsgAdvertise.o: SrvMsgAdvertise.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libSrvMessages_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libSrvMessages_a-SrvMsgAdvertise.o -MD -MP -MF $(DEPDIR)/libSrvMessages_a-SrvMsgAdvertise.Tpo -c -o libSrvMessages_a-SrvMsgAdvertise.o `test -f 'SrvMsgAdvertise.cpp' || echo '$(srcdir)/'`SrvMsgAdvertise.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libSrvMessages_a-SrvMsgAdvertise.Tpo $(DEPDIR)/libSrvMessages_a-SrvMsgAdvertise.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='SrvMsgAdvertise.cpp' object='libSrvMessages_a-SrvMsgAdvertise.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libSrvMessages_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libSrvMessages_a-SrvMsgAdvertise.o `test -f 'SrvMsgAdvertise.cpp' || echo '$(srcdir)/'`SrvMsgAdvertise.cpp libSrvMessages_a-SrvMsgAdvertise.obj: SrvMsgAdvertise.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libSrvMessages_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libSrvMessages_a-SrvMsgAdvertise.obj -MD -MP -MF $(DEPDIR)/libSrvMessages_a-SrvMsgAdvertise.Tpo -c -o libSrvMessages_a-SrvMsgAdvertise.obj `if test -f 'SrvMsgAdvertise.cpp'; then $(CYGPATH_W) 'SrvMsgAdvertise.cpp'; else $(CYGPATH_W) '$(srcdir)/SrvMsgAdvertise.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libSrvMessages_a-SrvMsgAdvertise.Tpo $(DEPDIR)/libSrvMessages_a-SrvMsgAdvertise.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='SrvMsgAdvertise.cpp' object='libSrvMessages_a-SrvMsgAdvertise.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libSrvMessages_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libSrvMessages_a-SrvMsgAdvertise.obj `if test -f 'SrvMsgAdvertise.cpp'; then $(CYGPATH_W) 'SrvMsgAdvertise.cpp'; else $(CYGPATH_W) '$(srcdir)/SrvMsgAdvertise.cpp'; fi` libSrvMessages_a-SrvMsgConfirm.o: SrvMsgConfirm.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libSrvMessages_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libSrvMessages_a-SrvMsgConfirm.o -MD -MP -MF $(DEPDIR)/libSrvMessages_a-SrvMsgConfirm.Tpo -c -o libSrvMessages_a-SrvMsgConfirm.o `test -f 'SrvMsgConfirm.cpp' || echo '$(srcdir)/'`SrvMsgConfirm.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libSrvMessages_a-SrvMsgConfirm.Tpo $(DEPDIR)/libSrvMessages_a-SrvMsgConfirm.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='SrvMsgConfirm.cpp' object='libSrvMessages_a-SrvMsgConfirm.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libSrvMessages_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libSrvMessages_a-SrvMsgConfirm.o `test -f 'SrvMsgConfirm.cpp' || echo '$(srcdir)/'`SrvMsgConfirm.cpp libSrvMessages_a-SrvMsgConfirm.obj: SrvMsgConfirm.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libSrvMessages_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libSrvMessages_a-SrvMsgConfirm.obj -MD -MP -MF $(DEPDIR)/libSrvMessages_a-SrvMsgConfirm.Tpo -c -o libSrvMessages_a-SrvMsgConfirm.obj `if test -f 'SrvMsgConfirm.cpp'; then $(CYGPATH_W) 'SrvMsgConfirm.cpp'; else $(CYGPATH_W) '$(srcdir)/SrvMsgConfirm.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libSrvMessages_a-SrvMsgConfirm.Tpo $(DEPDIR)/libSrvMessages_a-SrvMsgConfirm.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='SrvMsgConfirm.cpp' object='libSrvMessages_a-SrvMsgConfirm.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libSrvMessages_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libSrvMessages_a-SrvMsgConfirm.obj `if test -f 'SrvMsgConfirm.cpp'; then $(CYGPATH_W) 'SrvMsgConfirm.cpp'; else $(CYGPATH_W) '$(srcdir)/SrvMsgConfirm.cpp'; fi` libSrvMessages_a-SrvMsg.o: SrvMsg.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libSrvMessages_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libSrvMessages_a-SrvMsg.o -MD -MP -MF $(DEPDIR)/libSrvMessages_a-SrvMsg.Tpo -c -o libSrvMessages_a-SrvMsg.o `test -f 'SrvMsg.cpp' || echo '$(srcdir)/'`SrvMsg.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libSrvMessages_a-SrvMsg.Tpo $(DEPDIR)/libSrvMessages_a-SrvMsg.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='SrvMsg.cpp' object='libSrvMessages_a-SrvMsg.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libSrvMessages_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libSrvMessages_a-SrvMsg.o `test -f 'SrvMsg.cpp' || echo '$(srcdir)/'`SrvMsg.cpp libSrvMessages_a-SrvMsg.obj: SrvMsg.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libSrvMessages_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libSrvMessages_a-SrvMsg.obj -MD -MP -MF $(DEPDIR)/libSrvMessages_a-SrvMsg.Tpo -c -o libSrvMessages_a-SrvMsg.obj `if test -f 'SrvMsg.cpp'; then $(CYGPATH_W) 'SrvMsg.cpp'; else $(CYGPATH_W) '$(srcdir)/SrvMsg.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libSrvMessages_a-SrvMsg.Tpo $(DEPDIR)/libSrvMessages_a-SrvMsg.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='SrvMsg.cpp' object='libSrvMessages_a-SrvMsg.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libSrvMessages_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libSrvMessages_a-SrvMsg.obj `if test -f 'SrvMsg.cpp'; then $(CYGPATH_W) 'SrvMsg.cpp'; else $(CYGPATH_W) '$(srcdir)/SrvMsg.cpp'; fi` libSrvMessages_a-SrvMsgDecline.o: SrvMsgDecline.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libSrvMessages_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libSrvMessages_a-SrvMsgDecline.o -MD -MP -MF $(DEPDIR)/libSrvMessages_a-SrvMsgDecline.Tpo -c -o libSrvMessages_a-SrvMsgDecline.o `test -f 'SrvMsgDecline.cpp' || echo '$(srcdir)/'`SrvMsgDecline.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libSrvMessages_a-SrvMsgDecline.Tpo $(DEPDIR)/libSrvMessages_a-SrvMsgDecline.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='SrvMsgDecline.cpp' object='libSrvMessages_a-SrvMsgDecline.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libSrvMessages_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libSrvMessages_a-SrvMsgDecline.o `test -f 'SrvMsgDecline.cpp' || echo '$(srcdir)/'`SrvMsgDecline.cpp libSrvMessages_a-SrvMsgDecline.obj: SrvMsgDecline.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libSrvMessages_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libSrvMessages_a-SrvMsgDecline.obj -MD -MP -MF $(DEPDIR)/libSrvMessages_a-SrvMsgDecline.Tpo -c -o libSrvMessages_a-SrvMsgDecline.obj `if test -f 'SrvMsgDecline.cpp'; then $(CYGPATH_W) 'SrvMsgDecline.cpp'; else $(CYGPATH_W) '$(srcdir)/SrvMsgDecline.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libSrvMessages_a-SrvMsgDecline.Tpo $(DEPDIR)/libSrvMessages_a-SrvMsgDecline.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='SrvMsgDecline.cpp' object='libSrvMessages_a-SrvMsgDecline.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libSrvMessages_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libSrvMessages_a-SrvMsgDecline.obj `if test -f 'SrvMsgDecline.cpp'; then $(CYGPATH_W) 'SrvMsgDecline.cpp'; else $(CYGPATH_W) '$(srcdir)/SrvMsgDecline.cpp'; fi` libSrvMessages_a-SrvMsgInfRequest.o: SrvMsgInfRequest.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libSrvMessages_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libSrvMessages_a-SrvMsgInfRequest.o -MD -MP -MF $(DEPDIR)/libSrvMessages_a-SrvMsgInfRequest.Tpo -c -o libSrvMessages_a-SrvMsgInfRequest.o `test -f 'SrvMsgInfRequest.cpp' || echo '$(srcdir)/'`SrvMsgInfRequest.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libSrvMessages_a-SrvMsgInfRequest.Tpo $(DEPDIR)/libSrvMessages_a-SrvMsgInfRequest.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='SrvMsgInfRequest.cpp' object='libSrvMessages_a-SrvMsgInfRequest.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libSrvMessages_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libSrvMessages_a-SrvMsgInfRequest.o `test -f 'SrvMsgInfRequest.cpp' || echo '$(srcdir)/'`SrvMsgInfRequest.cpp libSrvMessages_a-SrvMsgInfRequest.obj: SrvMsgInfRequest.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libSrvMessages_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libSrvMessages_a-SrvMsgInfRequest.obj -MD -MP -MF $(DEPDIR)/libSrvMessages_a-SrvMsgInfRequest.Tpo -c -o libSrvMessages_a-SrvMsgInfRequest.obj `if test -f 'SrvMsgInfRequest.cpp'; then $(CYGPATH_W) 'SrvMsgInfRequest.cpp'; else $(CYGPATH_W) '$(srcdir)/SrvMsgInfRequest.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libSrvMessages_a-SrvMsgInfRequest.Tpo $(DEPDIR)/libSrvMessages_a-SrvMsgInfRequest.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='SrvMsgInfRequest.cpp' object='libSrvMessages_a-SrvMsgInfRequest.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libSrvMessages_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libSrvMessages_a-SrvMsgInfRequest.obj `if test -f 'SrvMsgInfRequest.cpp'; then $(CYGPATH_W) 'SrvMsgInfRequest.cpp'; else $(CYGPATH_W) '$(srcdir)/SrvMsgInfRequest.cpp'; fi` libSrvMessages_a-SrvMsgLeaseQuery.o: SrvMsgLeaseQuery.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libSrvMessages_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libSrvMessages_a-SrvMsgLeaseQuery.o -MD -MP -MF $(DEPDIR)/libSrvMessages_a-SrvMsgLeaseQuery.Tpo -c -o libSrvMessages_a-SrvMsgLeaseQuery.o `test -f 'SrvMsgLeaseQuery.cpp' || echo '$(srcdir)/'`SrvMsgLeaseQuery.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libSrvMessages_a-SrvMsgLeaseQuery.Tpo $(DEPDIR)/libSrvMessages_a-SrvMsgLeaseQuery.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='SrvMsgLeaseQuery.cpp' object='libSrvMessages_a-SrvMsgLeaseQuery.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libSrvMessages_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libSrvMessages_a-SrvMsgLeaseQuery.o `test -f 'SrvMsgLeaseQuery.cpp' || echo '$(srcdir)/'`SrvMsgLeaseQuery.cpp libSrvMessages_a-SrvMsgLeaseQuery.obj: SrvMsgLeaseQuery.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libSrvMessages_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libSrvMessages_a-SrvMsgLeaseQuery.obj -MD -MP -MF $(DEPDIR)/libSrvMessages_a-SrvMsgLeaseQuery.Tpo -c -o libSrvMessages_a-SrvMsgLeaseQuery.obj `if test -f 'SrvMsgLeaseQuery.cpp'; then $(CYGPATH_W) 'SrvMsgLeaseQuery.cpp'; else $(CYGPATH_W) '$(srcdir)/SrvMsgLeaseQuery.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libSrvMessages_a-SrvMsgLeaseQuery.Tpo $(DEPDIR)/libSrvMessages_a-SrvMsgLeaseQuery.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='SrvMsgLeaseQuery.cpp' object='libSrvMessages_a-SrvMsgLeaseQuery.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libSrvMessages_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libSrvMessages_a-SrvMsgLeaseQuery.obj `if test -f 'SrvMsgLeaseQuery.cpp'; then $(CYGPATH_W) 'SrvMsgLeaseQuery.cpp'; else $(CYGPATH_W) '$(srcdir)/SrvMsgLeaseQuery.cpp'; fi` libSrvMessages_a-SrvMsgLeaseQueryReply.o: SrvMsgLeaseQueryReply.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libSrvMessages_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libSrvMessages_a-SrvMsgLeaseQueryReply.o -MD -MP -MF $(DEPDIR)/libSrvMessages_a-SrvMsgLeaseQueryReply.Tpo -c -o libSrvMessages_a-SrvMsgLeaseQueryReply.o `test -f 'SrvMsgLeaseQueryReply.cpp' || echo '$(srcdir)/'`SrvMsgLeaseQueryReply.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libSrvMessages_a-SrvMsgLeaseQueryReply.Tpo $(DEPDIR)/libSrvMessages_a-SrvMsgLeaseQueryReply.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='SrvMsgLeaseQueryReply.cpp' object='libSrvMessages_a-SrvMsgLeaseQueryReply.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libSrvMessages_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libSrvMessages_a-SrvMsgLeaseQueryReply.o `test -f 'SrvMsgLeaseQueryReply.cpp' || echo '$(srcdir)/'`SrvMsgLeaseQueryReply.cpp libSrvMessages_a-SrvMsgLeaseQueryReply.obj: SrvMsgLeaseQueryReply.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libSrvMessages_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libSrvMessages_a-SrvMsgLeaseQueryReply.obj -MD -MP -MF $(DEPDIR)/libSrvMessages_a-SrvMsgLeaseQueryReply.Tpo -c -o libSrvMessages_a-SrvMsgLeaseQueryReply.obj `if test -f 'SrvMsgLeaseQueryReply.cpp'; then $(CYGPATH_W) 'SrvMsgLeaseQueryReply.cpp'; else $(CYGPATH_W) '$(srcdir)/SrvMsgLeaseQueryReply.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libSrvMessages_a-SrvMsgLeaseQueryReply.Tpo $(DEPDIR)/libSrvMessages_a-SrvMsgLeaseQueryReply.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='SrvMsgLeaseQueryReply.cpp' object='libSrvMessages_a-SrvMsgLeaseQueryReply.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libSrvMessages_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libSrvMessages_a-SrvMsgLeaseQueryReply.obj `if test -f 'SrvMsgLeaseQueryReply.cpp'; then $(CYGPATH_W) 'SrvMsgLeaseQueryReply.cpp'; else $(CYGPATH_W) '$(srcdir)/SrvMsgLeaseQueryReply.cpp'; fi` libSrvMessages_a-SrvMsgRebind.o: SrvMsgRebind.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libSrvMessages_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libSrvMessages_a-SrvMsgRebind.o -MD -MP -MF $(DEPDIR)/libSrvMessages_a-SrvMsgRebind.Tpo -c -o libSrvMessages_a-SrvMsgRebind.o `test -f 'SrvMsgRebind.cpp' || echo '$(srcdir)/'`SrvMsgRebind.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libSrvMessages_a-SrvMsgRebind.Tpo $(DEPDIR)/libSrvMessages_a-SrvMsgRebind.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='SrvMsgRebind.cpp' object='libSrvMessages_a-SrvMsgRebind.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libSrvMessages_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libSrvMessages_a-SrvMsgRebind.o `test -f 'SrvMsgRebind.cpp' || echo '$(srcdir)/'`SrvMsgRebind.cpp libSrvMessages_a-SrvMsgRebind.obj: SrvMsgRebind.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libSrvMessages_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libSrvMessages_a-SrvMsgRebind.obj -MD -MP -MF $(DEPDIR)/libSrvMessages_a-SrvMsgRebind.Tpo -c -o libSrvMessages_a-SrvMsgRebind.obj `if test -f 'SrvMsgRebind.cpp'; then $(CYGPATH_W) 'SrvMsgRebind.cpp'; else $(CYGPATH_W) '$(srcdir)/SrvMsgRebind.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libSrvMessages_a-SrvMsgRebind.Tpo $(DEPDIR)/libSrvMessages_a-SrvMsgRebind.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='SrvMsgRebind.cpp' object='libSrvMessages_a-SrvMsgRebind.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libSrvMessages_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libSrvMessages_a-SrvMsgRebind.obj `if test -f 'SrvMsgRebind.cpp'; then $(CYGPATH_W) 'SrvMsgRebind.cpp'; else $(CYGPATH_W) '$(srcdir)/SrvMsgRebind.cpp'; fi` libSrvMessages_a-SrvMsgRelease.o: SrvMsgRelease.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libSrvMessages_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libSrvMessages_a-SrvMsgRelease.o -MD -MP -MF $(DEPDIR)/libSrvMessages_a-SrvMsgRelease.Tpo -c -o libSrvMessages_a-SrvMsgRelease.o `test -f 'SrvMsgRelease.cpp' || echo '$(srcdir)/'`SrvMsgRelease.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libSrvMessages_a-SrvMsgRelease.Tpo $(DEPDIR)/libSrvMessages_a-SrvMsgRelease.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='SrvMsgRelease.cpp' object='libSrvMessages_a-SrvMsgRelease.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libSrvMessages_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libSrvMessages_a-SrvMsgRelease.o `test -f 'SrvMsgRelease.cpp' || echo '$(srcdir)/'`SrvMsgRelease.cpp libSrvMessages_a-SrvMsgRelease.obj: SrvMsgRelease.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libSrvMessages_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libSrvMessages_a-SrvMsgRelease.obj -MD -MP -MF $(DEPDIR)/libSrvMessages_a-SrvMsgRelease.Tpo -c -o libSrvMessages_a-SrvMsgRelease.obj `if test -f 'SrvMsgRelease.cpp'; then $(CYGPATH_W) 'SrvMsgRelease.cpp'; else $(CYGPATH_W) '$(srcdir)/SrvMsgRelease.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libSrvMessages_a-SrvMsgRelease.Tpo $(DEPDIR)/libSrvMessages_a-SrvMsgRelease.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='SrvMsgRelease.cpp' object='libSrvMessages_a-SrvMsgRelease.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libSrvMessages_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libSrvMessages_a-SrvMsgRelease.obj `if test -f 'SrvMsgRelease.cpp'; then $(CYGPATH_W) 'SrvMsgRelease.cpp'; else $(CYGPATH_W) '$(srcdir)/SrvMsgRelease.cpp'; fi` libSrvMessages_a-SrvMsgRenew.o: SrvMsgRenew.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libSrvMessages_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libSrvMessages_a-SrvMsgRenew.o -MD -MP -MF $(DEPDIR)/libSrvMessages_a-SrvMsgRenew.Tpo -c -o libSrvMessages_a-SrvMsgRenew.o `test -f 'SrvMsgRenew.cpp' || echo '$(srcdir)/'`SrvMsgRenew.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libSrvMessages_a-SrvMsgRenew.Tpo $(DEPDIR)/libSrvMessages_a-SrvMsgRenew.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='SrvMsgRenew.cpp' object='libSrvMessages_a-SrvMsgRenew.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libSrvMessages_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libSrvMessages_a-SrvMsgRenew.o `test -f 'SrvMsgRenew.cpp' || echo '$(srcdir)/'`SrvMsgRenew.cpp libSrvMessages_a-SrvMsgRenew.obj: SrvMsgRenew.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libSrvMessages_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libSrvMessages_a-SrvMsgRenew.obj -MD -MP -MF $(DEPDIR)/libSrvMessages_a-SrvMsgRenew.Tpo -c -o libSrvMessages_a-SrvMsgRenew.obj `if test -f 'SrvMsgRenew.cpp'; then $(CYGPATH_W) 'SrvMsgRenew.cpp'; else $(CYGPATH_W) '$(srcdir)/SrvMsgRenew.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libSrvMessages_a-SrvMsgRenew.Tpo $(DEPDIR)/libSrvMessages_a-SrvMsgRenew.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='SrvMsgRenew.cpp' object='libSrvMessages_a-SrvMsgRenew.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libSrvMessages_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libSrvMessages_a-SrvMsgRenew.obj `if test -f 'SrvMsgRenew.cpp'; then $(CYGPATH_W) 'SrvMsgRenew.cpp'; else $(CYGPATH_W) '$(srcdir)/SrvMsgRenew.cpp'; fi` libSrvMessages_a-SrvMsgReply.o: SrvMsgReply.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libSrvMessages_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libSrvMessages_a-SrvMsgReply.o -MD -MP -MF $(DEPDIR)/libSrvMessages_a-SrvMsgReply.Tpo -c -o libSrvMessages_a-SrvMsgReply.o `test -f 'SrvMsgReply.cpp' || echo '$(srcdir)/'`SrvMsgReply.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libSrvMessages_a-SrvMsgReply.Tpo $(DEPDIR)/libSrvMessages_a-SrvMsgReply.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='SrvMsgReply.cpp' object='libSrvMessages_a-SrvMsgReply.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libSrvMessages_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libSrvMessages_a-SrvMsgReply.o `test -f 'SrvMsgReply.cpp' || echo '$(srcdir)/'`SrvMsgReply.cpp libSrvMessages_a-SrvMsgReply.obj: SrvMsgReply.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libSrvMessages_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libSrvMessages_a-SrvMsgReply.obj -MD -MP -MF $(DEPDIR)/libSrvMessages_a-SrvMsgReply.Tpo -c -o libSrvMessages_a-SrvMsgReply.obj `if test -f 'SrvMsgReply.cpp'; then $(CYGPATH_W) 'SrvMsgReply.cpp'; else $(CYGPATH_W) '$(srcdir)/SrvMsgReply.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libSrvMessages_a-SrvMsgReply.Tpo $(DEPDIR)/libSrvMessages_a-SrvMsgReply.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='SrvMsgReply.cpp' object='libSrvMessages_a-SrvMsgReply.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libSrvMessages_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libSrvMessages_a-SrvMsgReply.obj `if test -f 'SrvMsgReply.cpp'; then $(CYGPATH_W) 'SrvMsgReply.cpp'; else $(CYGPATH_W) '$(srcdir)/SrvMsgReply.cpp'; fi` libSrvMessages_a-SrvMsgRequest.o: SrvMsgRequest.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libSrvMessages_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libSrvMessages_a-SrvMsgRequest.o -MD -MP -MF $(DEPDIR)/libSrvMessages_a-SrvMsgRequest.Tpo -c -o libSrvMessages_a-SrvMsgRequest.o `test -f 'SrvMsgRequest.cpp' || echo '$(srcdir)/'`SrvMsgRequest.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libSrvMessages_a-SrvMsgRequest.Tpo $(DEPDIR)/libSrvMessages_a-SrvMsgRequest.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='SrvMsgRequest.cpp' object='libSrvMessages_a-SrvMsgRequest.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libSrvMessages_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libSrvMessages_a-SrvMsgRequest.o `test -f 'SrvMsgRequest.cpp' || echo '$(srcdir)/'`SrvMsgRequest.cpp libSrvMessages_a-SrvMsgRequest.obj: SrvMsgRequest.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libSrvMessages_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libSrvMessages_a-SrvMsgRequest.obj -MD -MP -MF $(DEPDIR)/libSrvMessages_a-SrvMsgRequest.Tpo -c -o libSrvMessages_a-SrvMsgRequest.obj `if test -f 'SrvMsgRequest.cpp'; then $(CYGPATH_W) 'SrvMsgRequest.cpp'; else $(CYGPATH_W) '$(srcdir)/SrvMsgRequest.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libSrvMessages_a-SrvMsgRequest.Tpo $(DEPDIR)/libSrvMessages_a-SrvMsgRequest.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='SrvMsgRequest.cpp' object='libSrvMessages_a-SrvMsgRequest.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libSrvMessages_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libSrvMessages_a-SrvMsgRequest.obj `if test -f 'SrvMsgRequest.cpp'; then $(CYGPATH_W) 'SrvMsgRequest.cpp'; else $(CYGPATH_W) '$(srcdir)/SrvMsgRequest.cpp'; fi` libSrvMessages_a-SrvMsgSolicit.o: SrvMsgSolicit.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libSrvMessages_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libSrvMessages_a-SrvMsgSolicit.o -MD -MP -MF $(DEPDIR)/libSrvMessages_a-SrvMsgSolicit.Tpo -c -o libSrvMessages_a-SrvMsgSolicit.o `test -f 'SrvMsgSolicit.cpp' || echo '$(srcdir)/'`SrvMsgSolicit.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libSrvMessages_a-SrvMsgSolicit.Tpo $(DEPDIR)/libSrvMessages_a-SrvMsgSolicit.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='SrvMsgSolicit.cpp' object='libSrvMessages_a-SrvMsgSolicit.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libSrvMessages_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libSrvMessages_a-SrvMsgSolicit.o `test -f 'SrvMsgSolicit.cpp' || echo '$(srcdir)/'`SrvMsgSolicit.cpp libSrvMessages_a-SrvMsgSolicit.obj: SrvMsgSolicit.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libSrvMessages_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libSrvMessages_a-SrvMsgSolicit.obj -MD -MP -MF $(DEPDIR)/libSrvMessages_a-SrvMsgSolicit.Tpo -c -o libSrvMessages_a-SrvMsgSolicit.obj `if test -f 'SrvMsgSolicit.cpp'; then $(CYGPATH_W) 'SrvMsgSolicit.cpp'; else $(CYGPATH_W) '$(srcdir)/SrvMsgSolicit.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libSrvMessages_a-SrvMsgSolicit.Tpo $(DEPDIR)/libSrvMessages_a-SrvMsgSolicit.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='SrvMsgSolicit.cpp' object='libSrvMessages_a-SrvMsgSolicit.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libSrvMessages_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libSrvMessages_a-SrvMsgSolicit.obj `if test -f 'SrvMsgSolicit.cpp'; then $(CYGPATH_W) 'SrvMsgSolicit.cpp'; else $(CYGPATH_W) '$(srcdir)/SrvMsgSolicit.cpp'; fi` libSrvMessages_a-SrvMsgReconfigure.o: SrvMsgReconfigure.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libSrvMessages_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libSrvMessages_a-SrvMsgReconfigure.o -MD -MP -MF $(DEPDIR)/libSrvMessages_a-SrvMsgReconfigure.Tpo -c -o libSrvMessages_a-SrvMsgReconfigure.o `test -f 'SrvMsgReconfigure.cpp' || echo '$(srcdir)/'`SrvMsgReconfigure.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libSrvMessages_a-SrvMsgReconfigure.Tpo $(DEPDIR)/libSrvMessages_a-SrvMsgReconfigure.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='SrvMsgReconfigure.cpp' object='libSrvMessages_a-SrvMsgReconfigure.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libSrvMessages_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libSrvMessages_a-SrvMsgReconfigure.o `test -f 'SrvMsgReconfigure.cpp' || echo '$(srcdir)/'`SrvMsgReconfigure.cpp libSrvMessages_a-SrvMsgReconfigure.obj: SrvMsgReconfigure.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libSrvMessages_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libSrvMessages_a-SrvMsgReconfigure.obj -MD -MP -MF $(DEPDIR)/libSrvMessages_a-SrvMsgReconfigure.Tpo -c -o libSrvMessages_a-SrvMsgReconfigure.obj `if test -f 'SrvMsgReconfigure.cpp'; then $(CYGPATH_W) 'SrvMsgReconfigure.cpp'; else $(CYGPATH_W) '$(srcdir)/SrvMsgReconfigure.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libSrvMessages_a-SrvMsgReconfigure.Tpo $(DEPDIR)/libSrvMessages_a-SrvMsgReconfigure.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='SrvMsgReconfigure.cpp' object='libSrvMessages_a-SrvMsgReconfigure.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libSrvMessages_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libSrvMessages_a-SrvMsgReconfigure.obj `if test -f 'SrvMsgReconfigure.cpp'; then $(CYGPATH_W) 'SrvMsgReconfigure.cpp'; else $(CYGPATH_W) '$(srcdir)/SrvMsgReconfigure.cpp'; fi` mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LIBRARIES) installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool clean-noinstLIBRARIES \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \ clean-libtool clean-noinstLIBRARIES cscopelist-am ctags \ ctags-am distclean distclean-compile distclean-generic \ distclean-libtool distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-dvi install-dvi-am install-exec \ install-exec-am install-html install-html-am install-info \ install-info-am install-man install-pdf install-pdf-am \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ tags tags-am uninstall uninstall-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: dibbler-1.0.1/SrvMessages/SrvMsgRebind.h0000664000175000017500000000103212233256142015013 00000000000000/* * Dibbler - a portable DHCPv6 * * authors: Tomasz Mrugalski * Marek Senderski * * released under GNU GPL v2 only licence * */ #ifndef SRVMSGREBIND_H #define SRVMSGREBIND_H #include "SrvMsg.h" class TSrvMsgRebind : public TSrvMsg { public: TSrvMsgRebind(int iface, SPtr addr, char* buf, int bufSize); void doDuties(); std::string getName() const; unsigned long getTimeout(); bool check(); ~TSrvMsgRebind(); }; #endif /* SRVMSGREBIND_H */ dibbler-1.0.1/SrvMessages/SrvMsgSolicit.h0000664000175000017500000000231312233256142015221 00000000000000/* * Dibbler - a portable DHCPv6 * * authors: Tomasz Mrugalski * Marek Senderski * changes: Krzysztof Wnuk * released under GNU GPL v2 only licence * * $Id: SrvMsgSolicit.h,v 1.6 2008-08-29 00:07:35 thomson Exp $ * */ class TSrvMsgSolicit; #ifndef SRVMSGSOLICIT_H #define SRVMSGSOLICIT_H #include "SrvMsg.h" #include "SmartPtr.h" class TSrvMsgSolicit : public TSrvMsg { public: TSrvMsgSolicit(int iface, SPtr addr, char* buf, int bufSzie); void doDuties(); void sortAnswers(); std::string getName() const; unsigned long getTimeout(); bool check(); ~TSrvMsgSolicit(); private: void setAttribs(int iface, char* addr, int msgType); }; #endif /* SRVMSGSOLICIT_H*/ dibbler-1.0.1/SrvMessages/SrvMsgInfRequest.cpp0000664000175000017500000000147112233256142016237 00000000000000/* * Dibbler - a portable DHCPv6 * * authors: Tomasz Mrugalski * Marek Senderski * * released under GNU GPL v2 only licence * */ #include "SrvMsgInfRequest.h" #include "SmartPtr.h" #include "DHCPConst.h" #include "SrvMsgAdvertise.h" TSrvMsgInfRequest::TSrvMsgInfRequest(int iface, SPtr addr, char* buf, int bufSize) :TSrvMsg(iface, addr, buf, bufSize) { } void TSrvMsgInfRequest::doDuties() { return; } bool TSrvMsgInfRequest::check() { /* client is not required (but is allowed) to include ClientID option, also ServerID is optional */ return true; } unsigned long TSrvMsgInfRequest::getTimeout() { return 0; } std::string TSrvMsgInfRequest::getName() const { return "INF-REQUEST"; } TSrvMsgInfRequest::~TSrvMsgInfRequest(){ } dibbler-1.0.1/RelTransMgr/0000775000175000017500000000000012561700422012316 500000000000000dibbler-1.0.1/RelTransMgr/tests/0000775000175000017500000000000012561700422013460 500000000000000dibbler-1.0.1/RelTransMgr/tests/RelTransMgr_unittest.cc0000664000175000017500000001644012413230313020044 00000000000000#include "RelTransMgr.h" #include "RelIfaceMgr.h" #include "RelCfgMgr.h" #include "RelMsgGeneric.h" #include "hex.h" #include using namespace std; namespace { class NakedRelIfaceMgr: public TRelIfaceMgr { public: NakedRelIfaceMgr(const std::string& xmlFile) : TRelIfaceMgr(xmlFile) { TRelIfaceMgr::Instance = this; } ~NakedRelIfaceMgr() { TRelIfaceMgr::Instance = NULL; } }; class NakedRelCfgMgr : public TRelCfgMgr { public: NakedRelCfgMgr(const std::string& config, const std::string& dbfile) :TRelCfgMgr(config, dbfile) { TRelCfgMgr::Instance = this; } ~NakedRelCfgMgr() { TRelCfgMgr::Instance = NULL; } }; class NakedRelTransMgr : public TRelTransMgr { public: NakedRelTransMgr(const std::string& xml) :TRelTransMgr(xml) { Instance = this; } ~NakedRelTransMgr() { if (Instance) { Instance = 0; } } using TRelTransMgr::getLinkAddrFromDuid; using TRelTransMgr::getLinkAddrFromSrcAddr; using TRelTransMgr::getClientLinkLayerAddr; }; TEST(RelTransMgrTest, getLinkAddrFromDUID) { NakedRelCfgMgr cfgmgr("dummy.conf", "dummy.xml"); uint8_t data_llt[] = { 1, // type 1 = SOLICIT 0xca, 0xfe, 0x01, // trans-id = 0xcafe01 0, 1, // option type 1 (client-id) 0, 14, // option lenth 14 0, 1, // DUID type (1 = DUID-LLT) 0, 1, // hardware type 0x15, 0x9e, 0x3c, 0x8f, // timestamp 1, 2, 3, 4, 5, 6, // MAC address 0, 3, // option type 3 (IA_NA) 0, 12, // option length 12 0, 0, 0, 1, // iaid = 1 0, 0, 0, 0, // T1 = 0 0, 0, 0, 0 // T2 = 0 }; uint8_t data_ll[] = { 1, // type 1 = SOLICIT 0xca, 0xfe, 0x01, // trans-id = 0xcafe01 0, 1, // option type 1 (client-id) 0, 10, // option lenth 10 0, 3, // DUID type (3 = DUID-LL) 0, 1, // hardware type 1, 2, 3, 4, 5, 6, // MAC address 0, 3, // option type 3 (IA_NA) 0, 12, // option length 12 0, 0, 0, 1, // iaid = 1 0, 0, 0, 0, // T1 = 0 0, 0, 0, 0 // T2 = 0 }; uint8_t data_en[] = { 1, // type 1 = SOLICIT 0xca, 0xfe, 0x01, // trans-id = 0xcafe01 0, 1, // option type 1 (client-id) 0, 14, // option lenth 10 0, 2, // DUID type (2 = DUID-EN) 0, 1, // hardware type 0x1, 0x02, 0x03, 0x04, // EN=0x1020304 5, 6, 7, 8, 9, 10, // MAC address 0, 3, // option type 3 (IA_NA) 0, 12, // option length 12 0, 0, 0, 1, // iaid = 1 0, 0, 0, 0, // T1 = 0 0, 0, 0, 0 // T2 = 0 }; uint8_t expected_clientaddr[] = { 0, OPTION_CLIENT_LINKLAYER_ADDR, // option code 0, 8, // option lenth 0, 1, // hardware type 1, 2, 3, 4, 5, 6 // MAC address (6 letters) }; SPtr peer(new TIPv6Addr("fe80::1122:33ff:fe44:5566")); SPtr msg1(new TRelMsgGeneric(1, peer, (char*)data_llt, sizeof(data_llt))); SPtr msg2(new TRelMsgGeneric(1, peer, (char*)data_ll, sizeof(data_ll))); SPtr msg3(new TRelMsgGeneric(1, peer, (char*)data_en, sizeof(data_en))); NakedRelTransMgr transmgr("./tmp.xml"); SPtr opt; // Case 1: DUID-LLT // message1 must have client-id option, and it should be DUID-LLT opt = msg1->getOption(OPTION_CLIENTID); ASSERT_TRUE(opt); ASSERT_NO_THROW(opt = transmgr.getLinkAddrFromDuid(opt)); ASSERT_TRUE(opt); EXPECT_EQ(12, opt->getSize()); char output[100]; char* ptr; memset(output, 0, 100); ASSERT_NO_THROW(ptr = opt->storeSelf(output)); EXPECT_EQ(12, ptr - output); std::cout << "Received: " << hexToText((uint8_t*)output, 12, true, false) << std::endl; std::cout << "Expected: "<< hexToText((uint8_t*)expected_clientaddr, 12, true, false) << std::endl; EXPECT_FALSE(memcmp(output, expected_clientaddr, 12)); // Case 2: DUID-LL opt = msg2->getOption(OPTION_CLIENTID); ASSERT_TRUE(opt); ASSERT_NO_THROW(opt = transmgr.getLinkAddrFromDuid(opt)); ASSERT_TRUE(opt); EXPECT_EQ(12, opt->getSize()); memset(output, 0, 100); ASSERT_NO_THROW(ptr = opt->storeSelf(output)); EXPECT_EQ(12, ptr - output); std::cout << "Received: " << hexToText((uint8_t*)output, 12, true, false) << std::endl; std::cout << "Expected: "<< hexToText((uint8_t*)expected_clientaddr, 12, true, false) << std::endl; EXPECT_FALSE(memcmp(output, expected_clientaddr, 12)); // Case 3: DUID-EN, should not return anything opt = msg3->getOption(OPTION_CLIENTID); ASSERT_TRUE(opt); ASSERT_NO_THROW(opt = transmgr.getLinkAddrFromDuid(opt)); EXPECT_FALSE(opt); } TEST(RelTransMgrTest, getLinkAddrFromSrcAddr) { NakedRelCfgMgr cfgmgr("dummy.conf", "dummy.xml"); NakedRelIfaceMgr ifacemgr("ifacemgr.xml"); char data[1]; // just a minimalistic payload // expected address uint8_t expected_clientaddr[] = { 0, OPTION_CLIENT_LINKLAYER_ADDR, // option code 0, 8, // option lenth 0, 1, // hardware type 0x11, 0x22, 0x33, 0x44, 0x55, 0x66 // MAC address (6 letters) }; // Test uses interface with ifindex=1, let's find out its hardware type // (that's usually loopback) SPtr iface = RelIfaceMgr().getIfaceByID(1); ASSERT_TRUE(iface); writeUint16((char*)expected_clientaddr + 4, iface->getHardwareType()); SPtr linklocal(new TIPv6Addr("fe80::1122:33ff:fe44:5566", true)); SPtr nonlocal(new TIPv6Addr("fe80::1122:33ab:cd44:5566", true)); SPtr random(new TIPv6Addr("fe80::4c3a:561e:f0a8:1d64c", true)); SPtr global(new TIPv6Addr("2001:db8::1", true)); SPtr msg1(new TRelMsgGeneric(1, linklocal, (char*)data, 0)); SPtr msg2(new TRelMsgGeneric(1, nonlocal, (char*)data, 0)); SPtr msg3(new TRelMsgGeneric(1, random, (char*)data, 0)); SPtr msg4(new TRelMsgGeneric(1, global, (char*)data, 0)); NakedRelTransMgr transmgr("./tmp.xml"); SPtr opt; // Case 1: source address is linklocal // message1 must have client-id option, and it should be DUID-LLT ASSERT_NO_THROW(opt = transmgr.getLinkAddrFromSrcAddr(msg1)); ASSERT_TRUE(opt); ASSERT_EQ(12, opt->getSize()); char output[100]; char* ptr; memset(output, 0, 100); ASSERT_NO_THROW(ptr = opt->storeSelf(output)); EXPECT_EQ(12, ptr - output); std::cout << "Received: " << hexToText((uint8_t*)output, 12, true, false) << std::endl; std::cout << "Expected: "<< hexToText((uint8_t*)expected_clientaddr, 12, true, false) << std::endl; EXPECT_FALSE(memcmp(output, expected_clientaddr, 12)); // Case 2: Source address looks sort of like link local, but not really. ASSERT_NO_THROW(opt = transmgr.getLinkAddrFromSrcAddr(msg2)); EXPECT_FALSE(opt); // Case 3: Source is link local, but EUI-64 is not used (random is used instead) ASSERT_NO_THROW(opt = transmgr.getLinkAddrFromSrcAddr(msg3)); EXPECT_FALSE(opt); // Case 4: Source is global ASSERT_NO_THROW(opt = transmgr.getLinkAddrFromSrcAddr(msg4)); EXPECT_FALSE(opt); } } dibbler-1.0.1/RelTransMgr/tests/run_tests.cpp0000664000175000017500000000031412413230313016121 00000000000000#define STDC_HEADERS 1 #include #include int main(int argc, char* argv[]) { testing::InitGoogleTest(&argc, argv); int status = RUN_ALL_TESTS(); return status; } dibbler-1.0.1/RelTransMgr/tests/Makefile.am0000664000175000017500000000324712413230313015433 00000000000000AM_CPPFLAGS = -I$(top_srcdir)/RelTransMgr AM_CPPFLAGS += -I$(top_srcdir)/Options AM_CPPFLAGS += -I$(top_srcdir)/RelOptions AM_CPPFLAGS += -I$(top_srcdir)/Messages AM_CPPFLAGS += -I$(top_srcdir)/RelMessages AM_CPPFLAGS += -I$(top_srcdir)/RelIfaceMgr AM_CPPFLAGS += -I$(top_srcdir)/IfaceMgr AM_CPPFLAGS += -I$(top_srcdir)/RelCfgMgr AM_CPPFLAGS += -I$(top_srcdir)/CfgMgr AM_CPPFLAGS += -I$(top_srcdir)/Misc # This is to workaround long long in gtest.h AM_CPPFLAGS += $(GTEST_INCLUDES) -Wno-long-long -Wno-variadic-macros info: @echo "GTEST_LDADD=$(GTEST_LDADD)" @echo "GTEST_LDFLAGS=$(GTEST_LDFLAGS)" @echo "GTEST_INCLUDES=$(GTEST_INCLUDES)" @echo "HAVE_GTEST=$(HAVE_GTEST)" TESTS = if HAVE_GTEST TESTS += RelTransMgr_tests RelTransMgr_tests_SOURCES = run_tests.cpp RelTransMgr_tests_SOURCES += RelTransMgr_unittest.cc RelTransMgr_tests_LDFLAGS = $(AM_LDFLAGS) $(GTEST_LDFLAGS) RelTransMgr_tests_LDADD = $(GTEST_LDADD) RelTransMgr_tests_LDADD += $(top_builddir)/RelTransMgr/libRelTransMgr.a RelTransMgr_tests_LDADD += $(top_builddir)/RelIfaceMgr/libRelIfaceMgr.a RelTransMgr_tests_LDADD += $(top_builddir)/IfaceMgr/libIfaceMgr.a RelTransMgr_tests_LDADD += $(top_builddir)/RelCfgMgr/libRelCfgMgr.a RelTransMgr_tests_LDADD += $(top_builddir)/CfgMgr/libCfgMgr.a RelTransMgr_tests_LDADD += $(top_builddir)/RelMessages/libRelMessages.a RelTransMgr_tests_LDADD += $(top_builddir)/Messages/libMessages.a RelTransMgr_tests_LDADD += $(top_builddir)/Misc/libMisc.a RelTransMgr_tests_LDADD += $(top_builddir)/Options/libOptions.a RelTransMgr_tests_LDADD += $(top_builddir)/RelOptions/libRelOptions.a RelTransMgr_tests_LDADD += $(top_builddir)/@PORT_SUBDIR@/libLowLevel.a endif noinst_PROGRAMS = $(TESTS) dibbler-1.0.1/RelTransMgr/tests/Makefile.in0000664000175000017500000010562712561652535015473 00000000000000# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ TESTS = $(am__EXEEXT_1) @HAVE_GTEST_TRUE@am__append_1 = RelTransMgr_tests noinst_PROGRAMS = $(am__EXEEXT_2) subdir = RelTransMgr/tests DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/depcomp $(top_srcdir)/test-driver ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/libtool.m4 \ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/include/dibbler-config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = @HAVE_GTEST_TRUE@am__EXEEXT_1 = RelTransMgr_tests$(EXEEXT) am__EXEEXT_2 = $(am__EXEEXT_1) PROGRAMS = $(noinst_PROGRAMS) am__RelTransMgr_tests_SOURCES_DIST = run_tests.cpp \ RelTransMgr_unittest.cc @HAVE_GTEST_TRUE@am_RelTransMgr_tests_OBJECTS = run_tests.$(OBJEXT) \ @HAVE_GTEST_TRUE@ RelTransMgr_unittest.$(OBJEXT) RelTransMgr_tests_OBJECTS = $(am_RelTransMgr_tests_OBJECTS) am__DEPENDENCIES_1 = @HAVE_GTEST_TRUE@RelTransMgr_tests_DEPENDENCIES = \ @HAVE_GTEST_TRUE@ $(am__DEPENDENCIES_1) \ @HAVE_GTEST_TRUE@ $(top_builddir)/RelTransMgr/libRelTransMgr.a \ @HAVE_GTEST_TRUE@ $(top_builddir)/RelIfaceMgr/libRelIfaceMgr.a \ @HAVE_GTEST_TRUE@ $(top_builddir)/IfaceMgr/libIfaceMgr.a \ @HAVE_GTEST_TRUE@ $(top_builddir)/RelCfgMgr/libRelCfgMgr.a \ @HAVE_GTEST_TRUE@ $(top_builddir)/CfgMgr/libCfgMgr.a \ @HAVE_GTEST_TRUE@ $(top_builddir)/RelMessages/libRelMessages.a \ @HAVE_GTEST_TRUE@ $(top_builddir)/Messages/libMessages.a \ @HAVE_GTEST_TRUE@ $(top_builddir)/Misc/libMisc.a \ @HAVE_GTEST_TRUE@ $(top_builddir)/Options/libOptions.a \ @HAVE_GTEST_TRUE@ $(top_builddir)/RelOptions/libRelOptions.a \ @HAVE_GTEST_TRUE@ $(top_builddir)/@PORT_SUBDIR@/libLowLevel.a AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = RelTransMgr_tests_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CXXLD) \ $(AM_CXXFLAGS) $(CXXFLAGS) $(RelTransMgr_tests_LDFLAGS) \ $(LDFLAGS) -o $@ AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)/include depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) LTCXXCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CXXFLAGS) $(CXXFLAGS) AM_V_CXX = $(am__v_CXX_@AM_V@) am__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@) am__v_CXX_0 = @echo " CXX " $@; am__v_CXX_1 = CXXLD = $(CXX) CXXLINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \ $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CXXLD = $(am__v_CXXLD_@AM_V@) am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@) am__v_CXXLD_0 = @echo " CXXLD " $@; am__v_CXXLD_1 = SOURCES = $(RelTransMgr_tests_SOURCES) DIST_SOURCES = $(am__RelTransMgr_tests_SOURCES_DIST) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags am__tty_colors_dummy = \ mgn= red= grn= lgn= blu= brg= std=; \ am__color_tests=no am__tty_colors = { \ $(am__tty_colors_dummy); \ if test "X$(AM_COLOR_TESTS)" = Xno; then \ am__color_tests=no; \ elif test "X$(AM_COLOR_TESTS)" = Xalways; then \ am__color_tests=yes; \ elif test "X$$TERM" != Xdumb && { test -t 1; } 2>/dev/null; then \ am__color_tests=yes; \ fi; \ if test $$am__color_tests = yes; then \ red=''; \ grn=''; \ lgn=''; \ blu=''; \ mgn=''; \ brg=''; \ std=''; \ fi; \ } am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__recheck_rx = ^[ ]*:recheck:[ ]* am__global_test_result_rx = ^[ ]*:global-test-result:[ ]* am__copy_in_global_log_rx = ^[ ]*:copy-in-global-log:[ ]* # A command that, given a newline-separated list of test names on the # standard input, print the name of the tests that are to be re-run # upon "make recheck". am__list_recheck_tests = $(AWK) '{ \ recheck = 1; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ { \ if ((getline line2 < ($$0 ".log")) < 0) \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[nN][Oo]/) \ { \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[yY][eE][sS]/) \ { \ break; \ } \ }; \ if (recheck) \ print $$0; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # A command that, given a newline-separated list of test names on the # standard input, create the global log from their .trs and .log files. am__create_global_log = $(AWK) ' \ function fatal(msg) \ { \ print "fatal: making $@: " msg | "cat >&2"; \ exit 1; \ } \ function rst_section(header) \ { \ print header; \ len = length(header); \ for (i = 1; i <= len; i = i + 1) \ printf "="; \ printf "\n\n"; \ } \ { \ copy_in_global_log = 1; \ global_test_result = "RUN"; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".trs"); \ if (line ~ /$(am__global_test_result_rx)/) \ { \ sub("$(am__global_test_result_rx)", "", line); \ sub("[ ]*$$", "", line); \ global_test_result = line; \ } \ else if (line ~ /$(am__copy_in_global_log_rx)[nN][oO]/) \ copy_in_global_log = 0; \ }; \ if (copy_in_global_log) \ { \ rst_section(global_test_result ": " $$0); \ while ((rc = (getline line < ($$0 ".log"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".log"); \ print line; \ }; \ printf "\n"; \ }; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # Restructured Text title. am__rst_title = { sed 's/.*/ & /;h;s/./=/g;p;x;s/ *$$//;p;g' && echo; } # Solaris 10 'make', and several other traditional 'make' implementations, # pass "-e" to $(SHELL), and POSIX 2008 even requires this. Work around it # by disabling -e (using the XSI extension "set +e") if it's set. am__sh_e_setup = case $$- in *e*) set +e;; esac # Default flags passed to test drivers. am__common_driver_flags = \ --color-tests "$$am__color_tests" \ --enable-hard-errors "$$am__enable_hard_errors" \ --expect-failure "$$am__expect_failure" # To be inserted before the command running the test. Creates the # directory for the log if needed. Stores in $dir the directory # containing $f, in $tst the test, in $log the log. Executes the # developer- defined test setup AM_TESTS_ENVIRONMENT (if any), and # passes TESTS_ENVIRONMENT. Set up options for the wrapper that # will run the test scripts (or their associated LOG_COMPILER, if # thy have one). am__check_pre = \ $(am__sh_e_setup); \ $(am__vpath_adj_setup) $(am__vpath_adj) \ $(am__tty_colors); \ srcdir=$(srcdir); export srcdir; \ case "$@" in \ */*) am__odir=`echo "./$@" | sed 's|/[^/]*$$||'`;; \ *) am__odir=.;; \ esac; \ test "x$$am__odir" = x"." || test -d "$$am__odir" \ || $(MKDIR_P) "$$am__odir" || exit $$?; \ if test -f "./$$f"; then dir=./; \ elif test -f "$$f"; then dir=; \ else dir="$(srcdir)/"; fi; \ tst=$$dir$$f; log='$@'; \ if test -n '$(DISABLE_HARD_ERRORS)'; then \ am__enable_hard_errors=no; \ else \ am__enable_hard_errors=yes; \ fi; \ case " $(XFAIL_TESTS) " in \ *[\ \ ]$$f[\ \ ]* | *[\ \ ]$$dir$$f[\ \ ]*) \ am__expect_failure=yes;; \ *) \ am__expect_failure=no;; \ esac; \ $(AM_TESTS_ENVIRONMENT) $(TESTS_ENVIRONMENT) # A shell command to get the names of the tests scripts with any registered # extension removed (i.e., equivalently, the names of the test logs, with # the '.log' extension removed). The result is saved in the shell variable # '$bases'. This honors runtime overriding of TESTS and TEST_LOGS. Sadly, # we cannot use something simpler, involving e.g., "$(TEST_LOGS:.log=)", # since that might cause problem with VPATH rewrites for suffix-less tests. # See also 'test-harness-vpath-rewrite.sh' and 'test-trs-basic.sh'. am__set_TESTS_bases = \ bases='$(TEST_LOGS)'; \ bases=`for i in $$bases; do echo $$i; done | sed 's/\.log$$//'`; \ bases=`echo $$bases` RECHECK_LOGS = $(TEST_LOGS) AM_RECURSIVE_TARGETS = check recheck TEST_SUITE_LOG = test-suite.log TEST_EXTENSIONS = @EXEEXT@ .test LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver LOG_COMPILE = $(LOG_COMPILER) $(AM_LOG_FLAGS) $(LOG_FLAGS) am__set_b = \ case '$@' in \ */*) \ case '$*' in \ */*) b='$*';; \ *) b=`echo '$@' | sed 's/\.log$$//'`; \ esac;; \ *) \ b='$*';; \ esac am__test_logs1 = $(TESTS:=.log) am__test_logs2 = $(am__test_logs1:@EXEEXT@.log=.log) TEST_LOGS = $(am__test_logs2:.test.log=.log) TEST_LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver TEST_LOG_COMPILE = $(TEST_LOG_COMPILER) $(AM_TEST_LOG_FLAGS) \ $(TEST_LOG_FLAGS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALLOCA = @ALLOCA@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ ARCH = @ARCH@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ EXTRA_DIST_SUBDIRS = @EXTRA_DIST_SUBDIRS@ FGREP = @FGREP@ GREP = @GREP@ GTEST_INCLUDES = @GTEST_INCLUDES@ GTEST_LDADD = @GTEST_LDADD@ GTEST_LDFLAGS = @GTEST_LDFLAGS@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LINKPRINT = @LINKPRINT@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PORT_CFLAGS = @PORT_CFLAGS@ PORT_LDFLAGS = @PORT_LDFLAGS@ PORT_SUBDIR = @PORT_SUBDIR@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ subdirs = @subdirs@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ # This is to workaround long long in gtest.h AM_CPPFLAGS = -I$(top_srcdir)/RelTransMgr -I$(top_srcdir)/Options \ -I$(top_srcdir)/RelOptions -I$(top_srcdir)/Messages \ -I$(top_srcdir)/RelMessages -I$(top_srcdir)/RelIfaceMgr \ -I$(top_srcdir)/IfaceMgr -I$(top_srcdir)/RelCfgMgr \ -I$(top_srcdir)/CfgMgr -I$(top_srcdir)/Misc $(GTEST_INCLUDES) \ -Wno-long-long -Wno-variadic-macros @HAVE_GTEST_TRUE@RelTransMgr_tests_SOURCES = run_tests.cpp \ @HAVE_GTEST_TRUE@ RelTransMgr_unittest.cc @HAVE_GTEST_TRUE@RelTransMgr_tests_LDFLAGS = $(AM_LDFLAGS) $(GTEST_LDFLAGS) @HAVE_GTEST_TRUE@RelTransMgr_tests_LDADD = $(GTEST_LDADD) \ @HAVE_GTEST_TRUE@ $(top_builddir)/RelTransMgr/libRelTransMgr.a \ @HAVE_GTEST_TRUE@ $(top_builddir)/RelIfaceMgr/libRelIfaceMgr.a \ @HAVE_GTEST_TRUE@ $(top_builddir)/IfaceMgr/libIfaceMgr.a \ @HAVE_GTEST_TRUE@ $(top_builddir)/RelCfgMgr/libRelCfgMgr.a \ @HAVE_GTEST_TRUE@ $(top_builddir)/CfgMgr/libCfgMgr.a \ @HAVE_GTEST_TRUE@ $(top_builddir)/RelMessages/libRelMessages.a \ @HAVE_GTEST_TRUE@ $(top_builddir)/Messages/libMessages.a \ @HAVE_GTEST_TRUE@ $(top_builddir)/Misc/libMisc.a \ @HAVE_GTEST_TRUE@ $(top_builddir)/Options/libOptions.a \ @HAVE_GTEST_TRUE@ $(top_builddir)/RelOptions/libRelOptions.a \ @HAVE_GTEST_TRUE@ $(top_builddir)/@PORT_SUBDIR@/libLowLevel.a all: all-am .SUFFIXES: .SUFFIXES: .cc .cpp .lo .log .o .obj .test .test$(EXEEXT) .trs $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign RelTransMgr/tests/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign RelTransMgr/tests/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstPROGRAMS: @list='$(noinst_PROGRAMS)'; test -n "$$list" || exit 0; \ echo " rm -f" $$list; \ rm -f $$list || exit $$?; \ test -n "$(EXEEXT)" || exit 0; \ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ echo " rm -f" $$list; \ rm -f $$list RelTransMgr_tests$(EXEEXT): $(RelTransMgr_tests_OBJECTS) $(RelTransMgr_tests_DEPENDENCIES) $(EXTRA_RelTransMgr_tests_DEPENDENCIES) @rm -f RelTransMgr_tests$(EXEEXT) $(AM_V_CXXLD)$(RelTransMgr_tests_LINK) $(RelTransMgr_tests_OBJECTS) $(RelTransMgr_tests_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/RelTransMgr_unittest.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/run_tests.Po@am__quote@ .cc.o: @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $< .cc.obj: @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .cc.lo: @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LTCXXCOMPILE) -c -o $@ $< .cpp.o: @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $< .cpp.obj: @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .cpp.lo: @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LTCXXCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags # Recover from deleted '.trs' file; this should ensure that # "rm -f foo.log; make foo.trs" re-run 'foo.test', and re-create # both 'foo.log' and 'foo.trs'. Break the recipe in two subshells # to avoid problems with "make -n". .log.trs: rm -f $< $@ $(MAKE) $(AM_MAKEFLAGS) $< # Leading 'am--fnord' is there to ensure the list of targets does not # expand to empty, as could happen e.g. with make check TESTS=''. am--fnord $(TEST_LOGS) $(TEST_LOGS:.log=.trs): $(am__force_recheck) am--force-recheck: @: $(TEST_SUITE_LOG): $(TEST_LOGS) @$(am__set_TESTS_bases); \ am__f_ok () { test -f "$$1" && test -r "$$1"; }; \ redo_bases=`for i in $$bases; do \ am__f_ok $$i.trs && am__f_ok $$i.log || echo $$i; \ done`; \ if test -n "$$redo_bases"; then \ redo_logs=`for i in $$redo_bases; do echo $$i.log; done`; \ redo_results=`for i in $$redo_bases; do echo $$i.trs; done`; \ if $(am__make_dryrun); then :; else \ rm -f $$redo_logs && rm -f $$redo_results || exit 1; \ fi; \ fi; \ if test -n "$$am__remaking_logs"; then \ echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \ "recursion detected" >&2; \ else \ am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \ fi; \ if $(am__make_dryrun); then :; else \ st=0; \ errmsg="fatal: making $(TEST_SUITE_LOG): failed to create"; \ for i in $$redo_bases; do \ test -f $$i.trs && test -r $$i.trs \ || { echo "$$errmsg $$i.trs" >&2; st=1; }; \ test -f $$i.log && test -r $$i.log \ || { echo "$$errmsg $$i.log" >&2; st=1; }; \ done; \ test $$st -eq 0 || exit 1; \ fi @$(am__sh_e_setup); $(am__tty_colors); $(am__set_TESTS_bases); \ ws='[ ]'; \ results=`for b in $$bases; do echo $$b.trs; done`; \ test -n "$$results" || results=/dev/null; \ all=` grep "^$$ws*:test-result:" $$results | wc -l`; \ pass=` grep "^$$ws*:test-result:$$ws*PASS" $$results | wc -l`; \ fail=` grep "^$$ws*:test-result:$$ws*FAIL" $$results | wc -l`; \ skip=` grep "^$$ws*:test-result:$$ws*SKIP" $$results | wc -l`; \ xfail=`grep "^$$ws*:test-result:$$ws*XFAIL" $$results | wc -l`; \ xpass=`grep "^$$ws*:test-result:$$ws*XPASS" $$results | wc -l`; \ error=`grep "^$$ws*:test-result:$$ws*ERROR" $$results | wc -l`; \ if test `expr $$fail + $$xpass + $$error` -eq 0; then \ success=true; \ else \ success=false; \ fi; \ br='==================='; br=$$br$$br$$br$$br; \ result_count () \ { \ if test x"$$1" = x"--maybe-color"; then \ maybe_colorize=yes; \ elif test x"$$1" = x"--no-color"; then \ maybe_colorize=no; \ else \ echo "$@: invalid 'result_count' usage" >&2; exit 4; \ fi; \ shift; \ desc=$$1 count=$$2; \ if test $$maybe_colorize = yes && test $$count -gt 0; then \ color_start=$$3 color_end=$$std; \ else \ color_start= color_end=; \ fi; \ echo "$${color_start}# $$desc $$count$${color_end}"; \ }; \ create_testsuite_report () \ { \ result_count $$1 "TOTAL:" $$all "$$brg"; \ result_count $$1 "PASS: " $$pass "$$grn"; \ result_count $$1 "SKIP: " $$skip "$$blu"; \ result_count $$1 "XFAIL:" $$xfail "$$lgn"; \ result_count $$1 "FAIL: " $$fail "$$red"; \ result_count $$1 "XPASS:" $$xpass "$$red"; \ result_count $$1 "ERROR:" $$error "$$mgn"; \ }; \ { \ echo "$(PACKAGE_STRING): $(subdir)/$(TEST_SUITE_LOG)" | \ $(am__rst_title); \ create_testsuite_report --no-color; \ echo; \ echo ".. contents:: :depth: 2"; \ echo; \ for b in $$bases; do echo $$b; done \ | $(am__create_global_log); \ } >$(TEST_SUITE_LOG).tmp || exit 1; \ mv $(TEST_SUITE_LOG).tmp $(TEST_SUITE_LOG); \ if $$success; then \ col="$$grn"; \ else \ col="$$red"; \ test x"$$VERBOSE" = x || cat $(TEST_SUITE_LOG); \ fi; \ echo "$${col}$$br$${std}"; \ echo "$${col}Testsuite summary for $(PACKAGE_STRING)$${std}"; \ echo "$${col}$$br$${std}"; \ create_testsuite_report --maybe-color; \ echo "$$col$$br$$std"; \ if $$success; then :; else \ echo "$${col}See $(subdir)/$(TEST_SUITE_LOG)$${std}"; \ if test -n "$(PACKAGE_BUGREPORT)"; then \ echo "$${col}Please report to $(PACKAGE_BUGREPORT)$${std}"; \ fi; \ echo "$$col$$br$$std"; \ fi; \ $$success || exit 1 check-TESTS: @list='$(RECHECK_LOGS)'; test -z "$$list" || rm -f $$list @list='$(RECHECK_LOGS:.log=.trs)'; test -z "$$list" || rm -f $$list @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ log_list=`for i in $$bases; do echo $$i.log; done`; \ trs_list=`for i in $$bases; do echo $$i.trs; done`; \ log_list=`echo $$log_list`; trs_list=`echo $$trs_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) TEST_LOGS="$$log_list"; \ exit $$?; recheck: all @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ bases=`for i in $$bases; do echo $$i; done \ | $(am__list_recheck_tests)` || exit 1; \ log_list=`for i in $$bases; do echo $$i.log; done`; \ log_list=`echo $$log_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) \ am__force_recheck=am--force-recheck \ TEST_LOGS="$$log_list"; \ exit $$? RelTransMgr_tests.log: RelTransMgr_tests$(EXEEXT) @p='RelTransMgr_tests$(EXEEXT)'; \ b='RelTransMgr_tests'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) .test.log: @p='$<'; \ $(am__set_b); \ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) @am__EXEEXT_TRUE@.test$(EXEEXT).log: @am__EXEEXT_TRUE@ @p='$<'; \ @am__EXEEXT_TRUE@ $(am__set_b); \ @am__EXEEXT_TRUE@ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ @am__EXEEXT_TRUE@ --log-file $$b.log --trs-file $$b.trs \ @am__EXEEXT_TRUE@ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ @am__EXEEXT_TRUE@ "$$tst" $(AM_TESTS_FD_REDIRECT) distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am $(MAKE) $(AM_MAKEFLAGS) check-TESTS check: check-am all-am: Makefile $(PROGRAMS) installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: -test -z "$(TEST_LOGS)" || rm -f $(TEST_LOGS) -test -z "$(TEST_LOGS:.log=.trs)" || rm -f $(TEST_LOGS:.log=.trs) -test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool clean-noinstPROGRAMS \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: check-am install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-TESTS check-am clean \ clean-generic clean-libtool clean-noinstPROGRAMS cscopelist-am \ ctags ctags-am distclean distclean-compile distclean-generic \ distclean-libtool distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-dvi install-dvi-am install-exec \ install-exec-am install-html install-html-am install-info \ install-info-am install-man install-pdf install-pdf-am \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ recheck tags tags-am uninstall uninstall-am info: @echo "GTEST_LDADD=$(GTEST_LDADD)" @echo "GTEST_LDFLAGS=$(GTEST_LDFLAGS)" @echo "GTEST_INCLUDES=$(GTEST_INCLUDES)" @echo "HAVE_GTEST=$(HAVE_GTEST)" # 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: dibbler-1.0.1/RelTransMgr/Makefile.am0000664000175000017500000000100712413230313014261 00000000000000SUBDIRS = . if HAVE_GTEST SUBDIRS += tests endif noinst_LIBRARIES = libRelTransMgr.a libRelTransMgr_a_CPPFLAGS = -I$(top_srcdir)/Misc libRelTransMgr_a_CPPFLAGS += -I$(top_srcdir)/Options -I$(top_srcdir)/RelOptions libRelTransMgr_a_CPPFLAGS += -I$(top_srcdir)/RelCfgMgr -I$(top_srcdir)/CfgMgr libRelTransMgr_a_CPPFLAGS += -I$(top_srcdir)/Messages -I$(top_srcdir)/RelMessages libRelTransMgr_a_CPPFLAGS += -I$(top_srcdir)/IfaceMgr -I$(top_srcdir)/RelIfaceMgr libRelTransMgr_a_SOURCES = RelTransMgr.cpp RelTransMgr.h dibbler-1.0.1/RelTransMgr/RelTransMgr.cpp0000664000175000017500000003641312556515273015165 00000000000000/* * Dibbler - a portable DHCPv6 * * authors: Tomasz Mrugalski * Marek Senderski * * released under GNU GPL v2 only licence * */ #define MAX_PACKET_LEN 1452 #define RELAY_FORW_MSG_LEN 36 #include #include #include #include #include "RelTransMgr.h" #include "RelCfgMgr.h" #include "RelIfaceMgr.h" #include "RelOptInterfaceID.h" #include "RelOptEcho.h" #include "RelOptGeneric.h" #include "Logger.h" #include "Portable.h" TRelTransMgr * TRelTransMgr::Instance = 0; // singleton implementation TRelTransMgr::TRelTransMgr(const std::string& xmlFile) :XmlFile(xmlFile), IsDone(false) { // for each interface in CfgMgr, create socket (in IfaceMgr) SPtr confIface; RelCfgMgr().firstIface(); while (confIface=RelCfgMgr().getIface()) { if (!this->openSocket(confIface)) { this->IsDone = true; break; } } } /* * opens proper (multicast or unicast) socket on interface */ bool TRelTransMgr::openSocket(SPtr cfgIface) { SPtr iface = RelIfaceMgr().getIfaceByID(cfgIface->getID()); if (!iface) { Log(Crit) << "Unable to find " << cfgIface->getName() << "/" << cfgIface->getID() << " interface in the IfaceMgr." << LogEnd; return false; } SPtr srvUnicast = cfgIface->getServerUnicast(); SPtr clntUnicast = cfgIface->getClientUnicast(); SPtr addr; if (cfgIface->getServerMulticast() || srvUnicast) { iface->firstGlobalAddr(); addr = iface->getGlobalAddr(); if (!addr) { Log(Warning) << "No global address defined on the " << iface->getFullName() << " interface." << " Trying to bind link local address, but expect troubles with relaying." << LogEnd; iface->firstLLAddress(); addr = new TIPv6Addr(iface->getLLAddress()); } Log(Notice) << "Creating srv unicast (" << addr->getPlain() << ") socket on the " << iface->getName() << "/" << iface->getID() << " interface." << LogEnd; if (!iface->addSocket(addr, DHCPSERVER_PORT, true, false)) { Log(Crit) << "Proper socket creation failed." << LogEnd; return false; } } if (cfgIface->getClientMulticast()) { addr = new TIPv6Addr(ALL_DHCP_RELAY_AGENTS_AND_SERVERS, true); Log(Notice) << "Creating clnt multicast (" << addr->getPlain() << ") socket on the " << iface->getName() << "/" << iface->getID() << " interface." << LogEnd; if (!iface->addSocket(addr, DHCPSERVER_PORT, true, false)) { Log(Crit) << "Proper socket creation failed." << LogEnd; return false; } } if (clntUnicast) { addr = new TIPv6Addr(ALL_DHCP_RELAY_AGENTS_AND_SERVERS, true); Log(Notice) << "Creating clnt unicast (" << clntUnicast->getPlain() << ") socket on the " << iface->getName() << "/" << iface->getID() << " interface." << LogEnd; if (!iface->addSocket(clntUnicast, DHCPSERVER_PORT, true, false)) { Log(Crit) << "Proper socket creation failed." << LogEnd; return false; } } return true; } /** * relays normal (i.e. not server replies) messages to defined servers */ void TRelTransMgr::relayMsg(SPtr msg) { static char buf[MAX_PACKET_LEN]; int offset = 0; int bufLen; int hopCount = 0; if (!msg->check()) { Log(Warning) << "Invalid message received." << LogEnd; return; } if (msg->getDestAddr()) { this->relayMsgRepl(msg); return; } if (msg->getType() == RELAY_FORW_MSG) { hopCount = msg->getHopCount()+1; } // prepare message SPtr iface = RelIfaceMgr().getIfaceByID(msg->getIface()); SPtr addr; // store header buf[offset++] = RELAY_FORW_MSG; buf[offset++] = hopCount; // store link-addr iface->firstGlobalAddr(); addr = iface->getGlobalAddr(); if (!addr) { Log(Warning) << "Interface " << iface->getFullName() << " does not have global address." << LogEnd; addr = new TIPv6Addr("::", true); } addr->storeSelf(buf+offset); offset += 16; // store peer-addr addr = msg->getRemoteAddr(); addr->storeSelf(buf+offset); offset += 16; SPtr cfgIface; cfgIface = RelCfgMgr().getIfaceByID(msg->getIface()); TRelOptInterfaceID ifaceID(cfgIface->getInterfaceID(), 0); if (RelCfgMgr().getInterfaceIDOrder()==REL_IFACE_ID_ORDER_BEFORE) { // store InterfaceID option ifaceID.storeSelf(buf + offset); offset += ifaceID.getSize(); Log(Debug) << "Interface-id option added before relayed message." << LogEnd; } // store relay msg option writeUint16((buf+offset), OPTION_RELAY_MSG); offset += sizeof(uint16_t); writeUint16((buf+offset), msg->getSize()); offset += sizeof(uint16_t); bufLen = msg->storeSelf(buf+offset); offset += bufLen; if (RelCfgMgr().getInterfaceIDOrder()==REL_IFACE_ID_ORDER_AFTER) { // store InterfaceID option ifaceID.storeSelf(buf + offset); offset += ifaceID.getSize(); Log(Debug) << "Interface-id option added after relayed message." << LogEnd; } if (RelCfgMgr().getInterfaceIDOrder()==REL_IFACE_ID_ORDER_NONE) { Log(Warning) << "Interface-id option not added (interface-id-order omit used in relay.conf). " << "That is a debugging feature and violates RFC3315. Use with caution." << LogEnd; } SPtr remoteID = RelCfgMgr().getRemoteID(); if (remoteID) { remoteID->storeSelf(buf+offset); offset += remoteID->getSize(); Log(Debug) << "Appended RemoteID with " << remoteID->getVendorDataLen() << "-byte long data (option length=" << remoteID->getSize() << ")." << LogEnd; } SPtr relayID = RelCfgMgr().getRelayID(); if (relayID) { relayID->storeSelf(buf + offset); offset += relayID->getSize(); Log(Debug) << "Appended Relay-ID with " << relayID->getSize() << " bytes." << LogEnd; } if (RelCfgMgr().getClientLinkLayerAddress()) { SPtr lladdr = getClientLinkLayerAddr(msg); if (lladdr) { Log(Debug) << "Appended client link-layer address option with " << lladdr->getSize() << " bytes." << LogEnd; lladdr->storeSelf(buf + offset); offset += lladdr->getSize(); } } SPtr echo = RelCfgMgr().getEcho(); if (echo) { echo->storeSelf(buf+offset); offset += echo->getSize(); Log(Debug) << "Appended EchoRequest option with "; int i=0; char tmpBuf[256]; for (i=0;i<255;i++) tmpBuf[i] = 255-i; for (int i=0; icount(); i++) { int code = echo->getReqOpt(i); SPtr gen = new TRelOptGeneric(code, tmpBuf, 4, 0); gen->storeSelf(buf+offset); offset += gen->getSize(); Log(Cont) << code << " "; } Log(Cont) << " opt(s)." << LogEnd; } RelCfgMgr().firstIface(); while (cfgIface = RelCfgMgr().getIface()) { if (cfgIface->getServerUnicast()) { Log(Notice) << "Relaying encapsulated " << msg->getName() << " message on the " << cfgIface->getFullName() << " interface to unicast (" << cfgIface->getServerUnicast()->getPlain() << ") address, port " << DHCPSERVER_PORT << "." << LogEnd; if (!RelIfaceMgr().send(cfgIface->getID(), buf, offset, cfgIface->getServerUnicast(), DHCPSERVER_PORT)) { Log(Error) << "Failed to send data to server unicast address." << LogEnd; } } if (cfgIface->getServerMulticast()) { addr = new TIPv6Addr(ALL_DHCP_SERVERS, true); Log(Notice) << "Relaying encapsulated " << msg->getName() << " message on the " << cfgIface->getFullName() << " interface to multicast (" << addr->getPlain() << ") address, port " << DHCPSERVER_PORT << "." << LogEnd; if (!RelIfaceMgr().send(cfgIface->getID(), buf, offset, addr, DHCPSERVER_PORT)) { Log(Error) << "Failed to send data to server multicast address." << LogEnd; } } } // save DB state regardless of action taken RelCfgMgr().dump(); } void TRelTransMgr::relayMsgRepl(SPtr msg) { int port; SPtr cfgIface = RelCfgMgr().getIfaceByInterfaceID(msg->getDestIface()); if (!cfgIface) { Log(Error) << "Unable to relay message: Invalid interfaceID value:" << msg->getDestIface() << LogEnd; return; } SPtr iface = RelIfaceMgr().getIfaceByID(cfgIface->getID()); SPtr addr = msg->getDestAddr(); static char buf[MAX_PACKET_LEN]; int bufLen; if (!iface) { Log(Warning) << "Unable to find interface with interfaceID=" << msg->getDestIface() << LogEnd; return; } bufLen = msg->storeSelf(buf); if (msg->getType() == RELAY_REPL_MSG) port = DHCPSERVER_PORT; else port = DHCPCLIENT_PORT; Log(Notice) << "Relaying decapsulated " << msg->getName() << " message on the " << iface->getFullName() << " interface to the " << addr->getPlain() << ", port " << port << "." << LogEnd; if (!RelIfaceMgr().send(iface->getID(), buf, bufLen, addr, port)) { Log(Error) << "Failed to decapsulated data." << LogEnd; } } SPtr TRelTransMgr::getLinkAddrFromDuid(SPtr duid_opt) { if (!duid_opt) return TOptPtr(); // NULL // We need at least option header and duid type if (duid_opt->getSize() < 6) return TOptPtr(); // NULL // Create a vector and store whole DUID there. std::vector buffer(duid_opt->getSize(), 0); duid_opt->storeSelf((char*)&buffer[0]); char* buf = (char*)&buffer[0]; buf += sizeof(uint16_t); // skip first 2 bytes (option code) uint16_t len = readUint16(buf); // read option length buf += sizeof(uint16_t); // stored length must be total option size, without the header if (len + 4u != duid_opt->getSize()) return TOptPtr(); // NULL uint16_t duid_type = readUint16(buf); // read duid type buf += sizeof(uint16_t); len -= sizeof(uint16_t); std::vector linkaddr; switch (duid_type) { case DUID_TYPE_LLT: { // 7: hw type (16 bits), time (32 bits), at least 1 byte of MAC if (len < 7) { return TOptPtr(); // NULL } // Read hardware type uint16_t hw_type = readUint16(buf); buf += sizeof(uint16_t); len -= sizeof(uint16_t); // Skip duid creation time buf += sizeof(uint32_t); len -= sizeof(uint32_t); // Now store hardware type + MAC linkaddr.resize(len + sizeof(uint16_t)); char* out = (char*)&linkaddr[0]; out = writeUint16(out, hw_type); // hw type (2) memcpy(out, buf, len); return SPtr(new TOptGeneric(OPTION_CLIENT_LINKLAYER_ADDR, (const char*)&linkaddr[0], linkaddr.size(), NULL)); } case DUID_TYPE_LL: { // 3: hw type (16 bits), at least 1 byte of MAC if (len < 3) { return TOptPtr(); // NULL } // Read hardware type uint16_t hw_type = readUint16(buf); buf += sizeof(uint16_t); len -= sizeof(uint16_t); // Now store hardware type + MAC linkaddr.resize(len + sizeof(uint16_t)); char* out = (char*)&linkaddr[0]; out = writeUint16(out, hw_type); memcpy(out, buf, len); return SPtr(new TOptGeneric(OPTION_CLIENT_LINKLAYER_ADDR, (const char*)&linkaddr[0], linkaddr.size(), NULL)); } default: return TOptPtr(); // NULL } } SPtr TRelTransMgr::getLinkAddrFromSrcAddr(SPtr msg) { SPtr srcAddr = msg->getRemoteAddr(); if (!srcAddr || !srcAddr->linkLocal()) return TOptPtr(); // NULL std::vector mac(8,0); // store hardware type SPtr iface = RelIfaceMgr().getIfaceByID(msg->getIface()); if (!iface) { // Should never happen return TOptPtr(); // NULL } writeUint16((char*)&mac[0], iface->getHardwareType()); // now extract MAC address from the source address char* addr = srcAddr->getAddr(); if ( (addr[11] != 0xff) || (addr[12] != 0xfe) ) { return TOptPtr(); // NULL } memcpy(&mac[2], addr + 8, 3); memcpy(&mac[5], addr + 13, 3); // Ok, create the option and return it return SPtr(new TOptGeneric(OPTION_CLIENT_LINKLAYER_ADDR, (char*)&mac[0], 8, NULL)); } SPtr TRelTransMgr::getClientLinkLayerAddr(SPtr msg) { // Ignore messages that are not directly from client if ( (msg->getType() == RELAY_FORW_MSG) || (msg->getType() == RELAY_REPL_MSG)) return TOptPtr(); // NULL // Ok, this seems to be a message from a client. Let's try to // extract its DUID SPtr opt = msg->getOption(OPTION_CLIENTID); if (opt) { SPtr linkaddr = getLinkAddrFromDuid(opt); if (linkaddr) { return linkaddr; } } // Ok, let's try to extract the MAC address from source link-local // address. return getLinkAddrFromSrcAddr(msg); } void TRelTransMgr::shutdown() { IsDone = true; } bool TRelTransMgr::isDone() { return this->IsDone; } bool TRelTransMgr::doDuties() { return false; } char* TRelTransMgr::getCtrlAddr() { return this->ctrlAddr; } int TRelTransMgr::getCtrlIface() { return this->ctrlIface; } void TRelTransMgr::dump() { std::ofstream xmlDump; xmlDump.open(this->XmlFile.c_str()); xmlDump << *this; xmlDump.close(); } TRelTransMgr::~TRelTransMgr() { Log(Debug) << "RelTransMgr cleanup." << LogEnd; } void TRelTransMgr::instanceCreate(const std::string& xmlFile) { if (Instance) Log(Crit) << "RelTransMgr instance already created. Application error!" << LogEnd; Instance = new TRelTransMgr(xmlFile); } TRelTransMgr& TRelTransMgr::instance() { if (!Instance) { Log(Crit) << "RelTransMgr istance not created yet. Application error. Emergency shutdown." << LogEnd; exit(EXIT_FAILURE); } return *Instance; } std::ostream & operator<<(std::ostream &s, TRelTransMgr &x) { s << "" << std::endl; s << "" << std::endl; s << "" << std::endl; return s; } // Stub definitions, added because they are called in TMsg::storeSelf() extern "C" { void *hmac_sha (const char *buffer, size_t len, char *key, size_t key_len, char *resbuf, int type) { return NULL; } void *hmac_md5 (const char *buffer, size_t len, char *key, size_t key_len, char *resbuf) { return NULL; } } dibbler-1.0.1/RelTransMgr/Makefile.in0000664000175000017500000006151312561652535014324 00000000000000# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ @HAVE_GTEST_TRUE@am__append_1 = tests subdir = RelTransMgr DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/depcomp ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/libtool.m4 \ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/include/dibbler-config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = LIBRARIES = $(noinst_LIBRARIES) ARFLAGS = cru AM_V_AR = $(am__v_AR_@AM_V@) am__v_AR_ = $(am__v_AR_@AM_DEFAULT_V@) am__v_AR_0 = @echo " AR " $@; am__v_AR_1 = libRelTransMgr_a_AR = $(AR) $(ARFLAGS) libRelTransMgr_a_LIBADD = am_libRelTransMgr_a_OBJECTS = libRelTransMgr_a-RelTransMgr.$(OBJEXT) libRelTransMgr_a_OBJECTS = $(am_libRelTransMgr_a_OBJECTS) AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)/include depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) LTCXXCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CXXFLAGS) $(CXXFLAGS) AM_V_CXX = $(am__v_CXX_@AM_V@) am__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@) am__v_CXX_0 = @echo " CXX " $@; am__v_CXX_1 = CXXLD = $(CXX) CXXLINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \ $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CXXLD = $(am__v_CXXLD_@AM_V@) am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@) am__v_CXXLD_0 = @echo " CXXLD " $@; am__v_CXXLD_1 = COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(libRelTransMgr_a_SOURCES) DIST_SOURCES = $(libRelTransMgr_a_SOURCES) RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \ ctags-recursive dvi-recursive html-recursive info-recursive \ install-data-recursive install-dvi-recursive \ install-exec-recursive install-html-recursive \ install-info-recursive install-pdf-recursive \ install-ps-recursive install-recursive installcheck-recursive \ installdirs-recursive pdf-recursive ps-recursive \ tags-recursive uninstall-recursive am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive am__recursive_targets = \ $(RECURSIVE_TARGETS) \ $(RECURSIVE_CLEAN_TARGETS) \ $(am__extra_recursive_targets) AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \ distdir am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags DIST_SUBDIRS = . tests DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) am__relativize = \ dir0=`pwd`; \ sed_first='s,^\([^/]*\)/.*$$,\1,'; \ sed_rest='s,^[^/]*/*,,'; \ sed_last='s,^.*/\([^/]*\)$$,\1,'; \ sed_butlast='s,/*[^/]*$$,,'; \ while test -n "$$dir1"; do \ first=`echo "$$dir1" | sed -e "$$sed_first"`; \ if test "$$first" != "."; then \ if test "$$first" = ".."; then \ dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ else \ first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ if test "$$first2" = "$$first"; then \ dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ else \ dir2="../$$dir2"; \ fi; \ dir0="$$dir0"/"$$first"; \ fi; \ fi; \ dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ done; \ reldir="$$dir2" ACLOCAL = @ACLOCAL@ ALLOCA = @ALLOCA@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ ARCH = @ARCH@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ EXTRA_DIST_SUBDIRS = @EXTRA_DIST_SUBDIRS@ FGREP = @FGREP@ GREP = @GREP@ GTEST_INCLUDES = @GTEST_INCLUDES@ GTEST_LDADD = @GTEST_LDADD@ GTEST_LDFLAGS = @GTEST_LDFLAGS@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LINKPRINT = @LINKPRINT@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PORT_CFLAGS = @PORT_CFLAGS@ PORT_LDFLAGS = @PORT_LDFLAGS@ PORT_SUBDIR = @PORT_SUBDIR@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ subdirs = @subdirs@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ SUBDIRS = . $(am__append_1) noinst_LIBRARIES = libRelTransMgr.a libRelTransMgr_a_CPPFLAGS = -I$(top_srcdir)/Misc \ -I$(top_srcdir)/Options -I$(top_srcdir)/RelOptions \ -I$(top_srcdir)/RelCfgMgr -I$(top_srcdir)/CfgMgr \ -I$(top_srcdir)/Messages -I$(top_srcdir)/RelMessages \ -I$(top_srcdir)/IfaceMgr -I$(top_srcdir)/RelIfaceMgr libRelTransMgr_a_SOURCES = RelTransMgr.cpp RelTransMgr.h all: all-recursive .SUFFIXES: .SUFFIXES: .cpp .lo .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign RelTransMgr/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign RelTransMgr/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstLIBRARIES: -test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES) libRelTransMgr.a: $(libRelTransMgr_a_OBJECTS) $(libRelTransMgr_a_DEPENDENCIES) $(EXTRA_libRelTransMgr_a_DEPENDENCIES) $(AM_V_at)-rm -f libRelTransMgr.a $(AM_V_AR)$(libRelTransMgr_a_AR) libRelTransMgr.a $(libRelTransMgr_a_OBJECTS) $(libRelTransMgr_a_LIBADD) $(AM_V_at)$(RANLIB) libRelTransMgr.a mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libRelTransMgr_a-RelTransMgr.Po@am__quote@ .cpp.o: @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $< .cpp.obj: @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .cpp.lo: @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LTCXXCOMPILE) -c -o $@ $< libRelTransMgr_a-RelTransMgr.o: RelTransMgr.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libRelTransMgr_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libRelTransMgr_a-RelTransMgr.o -MD -MP -MF $(DEPDIR)/libRelTransMgr_a-RelTransMgr.Tpo -c -o libRelTransMgr_a-RelTransMgr.o `test -f 'RelTransMgr.cpp' || echo '$(srcdir)/'`RelTransMgr.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libRelTransMgr_a-RelTransMgr.Tpo $(DEPDIR)/libRelTransMgr_a-RelTransMgr.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='RelTransMgr.cpp' object='libRelTransMgr_a-RelTransMgr.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libRelTransMgr_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libRelTransMgr_a-RelTransMgr.o `test -f 'RelTransMgr.cpp' || echo '$(srcdir)/'`RelTransMgr.cpp libRelTransMgr_a-RelTransMgr.obj: RelTransMgr.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libRelTransMgr_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libRelTransMgr_a-RelTransMgr.obj -MD -MP -MF $(DEPDIR)/libRelTransMgr_a-RelTransMgr.Tpo -c -o libRelTransMgr_a-RelTransMgr.obj `if test -f 'RelTransMgr.cpp'; then $(CYGPATH_W) 'RelTransMgr.cpp'; else $(CYGPATH_W) '$(srcdir)/RelTransMgr.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libRelTransMgr_a-RelTransMgr.Tpo $(DEPDIR)/libRelTransMgr_a-RelTransMgr.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='RelTransMgr.cpp' object='libRelTransMgr_a-RelTransMgr.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libRelTransMgr_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libRelTransMgr_a-RelTransMgr.obj `if test -f 'RelTransMgr.cpp'; then $(CYGPATH_W) 'RelTransMgr.cpp'; else $(CYGPATH_W) '$(srcdir)/RelTransMgr.cpp'; fi` mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs # This directory's subdirectories are mostly independent; you can cd # into them and run 'make' without going through this Makefile. # To change the values of 'make' variables: instead of editing Makefiles, # (1) if the variable is set in 'config.status', edit 'config.status' # (which will cause the Makefiles to be regenerated when you run 'make'); # (2) otherwise, pass the desired values on the 'make' command line. $(am__recursive_targets): @fail=; \ if $(am__make_keepgoing); then \ failcom='fail=yes'; \ else \ failcom='exit 1'; \ fi; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-recursive TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ empty_fix=.; \ else \ include_option=--include; \ empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-recursive CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-recursive cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ $(am__make_dryrun) \ || test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ $(am__relativize); \ new_distdir=$$reldir; \ dir1=$$subdir; dir2="$(top_distdir)"; \ $(am__relativize); \ new_top_distdir=$$reldir; \ echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ ($(am__cd) $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$new_top_distdir" \ distdir="$$new_distdir" \ am__remove_distdir=: \ am__skip_length_check=: \ am__skip_mode_fix=: \ distdir) \ || exit 1; \ fi; \ done check-am: all-am check: check-recursive all-am: Makefile $(LIBRARIES) installdirs: installdirs-recursive installdirs-am: install: install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-recursive clean-am: clean-generic clean-libtool clean-noinstLIBRARIES \ mostlyclean-am distclean: distclean-recursive -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive html-am: info: info-recursive info-am: install-data-am: install-dvi: install-dvi-recursive install-dvi-am: install-exec-am: install-html: install-html-recursive install-html-am: install-info: install-info-recursive install-info-am: install-man: install-pdf: install-pdf-recursive install-pdf-am: install-ps: install-ps-recursive install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-recursive -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: .MAKE: $(am__recursive_targets) install-am install-strip .PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am check \ check-am clean clean-generic clean-libtool \ clean-noinstLIBRARIES cscopelist-am ctags ctags-am distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ installdirs-am maintainer-clean maintainer-clean-generic \ mostlyclean mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf pdf-am ps ps-am tags tags-am uninstall \ uninstall-am # 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: dibbler-1.0.1/RelTransMgr/RelTransMgr.h0000664000175000017500000000235012413230313014600 00000000000000/* * Dibbler - a portable DHCPv6 * * authors: Tomasz Mrugalski * Marek Senderski * * released under GNU GPL v2 only licence * */ class TRelTransMgr; #ifndef RELTRANSMGR_H #define RELTRANSMGR_H #include #include "SmartPtr.h" #include "RelCfgIface.h" #include "RelMsg.h" #define RelTransMgr() (TRelTransMgr::instance()) class TRelTransMgr { friend std::ostream & operator<<(std::ostream &strum, TRelTransMgr &x); public: static void instanceCreate(const std::string& xmlFile); static TRelTransMgr& instance(); ~TRelTransMgr(); bool openSocket(SPtr confIface); bool doDuties(); void relayMsg(SPtr msg); void relayMsgRepl(SPtr msg); void dump(); bool isDone(); void shutdown(); char * getCtrlAddr(); int getCtrlIface(); protected: TRelTransMgr(const std::string& xmlFile); static TRelTransMgr * Instance; SPtr getClientLinkLayerAddr(SPtr msg); SPtr getLinkAddrFromSrcAddr(SPtr msg); SPtr getLinkAddrFromDuid(SPtr duid_opt); private: std::string XmlFile; bool IsDone; int ctrlIface; char ctrlAddr[48]; }; #endif dibbler-1.0.1/Makefile.in0000664000175000017500000016445112561652534012130 00000000000000# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ @HAVE_GTEST_TRUE@am__append_1 = tests/utils @HAVE_GTEST_TRUE@am__append_2 = tests sbin_PROGRAMS = dibbler-client$(EXEEXT) dibbler-server$(EXEEXT) \ dibbler-relay$(EXEEXT) dibbler-requestor$(EXEEXT) subdir = . DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/configure $(am__configure_deps) \ $(top_srcdir)/include/dibbler-config.h.in depcomp \ $(dist_noinst_DATA) $(nobase_dist_doc_DATA) AUTHORS TODO \ compile config.guess config.sub install-sh missing ltmain.sh ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/libtool.m4 \ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \ configure.lineno config.status.lineno mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/include/dibbler-config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am__installdirs = "$(DESTDIR)$(sbindir)" "$(DESTDIR)$(docdir)" PROGRAMS = $(sbin_PROGRAMS) am_dibbler_client_OBJECTS = dibbler_client-dibbler-client.$(OBJEXT) \ dibbler_client-DHCPClient.$(OBJEXT) dibbler_client_OBJECTS = $(am_dibbler_client_OBJECTS) dibbler_client_DEPENDENCIES = AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = am_dibbler_relay_OBJECTS = dibbler_relay-dibbler-relay.$(OBJEXT) \ dibbler_relay-DHCPRelay.$(OBJEXT) dibbler_relay_OBJECTS = $(am_dibbler_relay_OBJECTS) dibbler_relay_DEPENDENCIES = am_dibbler_requestor_OBJECTS = dibbler_requestor-Requestor.$(OBJEXT) dibbler_requestor_OBJECTS = $(am_dibbler_requestor_OBJECTS) dibbler_requestor_DEPENDENCIES = am_dibbler_server_OBJECTS = dibbler_server-dibbler-server.$(OBJEXT) \ dibbler_server-DHCPServer.$(OBJEXT) dibbler_server_OBJECTS = $(am_dibbler_server_OBJECTS) dibbler_server_DEPENDENCIES = AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)/include depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) LTCXXCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CXXFLAGS) $(CXXFLAGS) AM_V_CXX = $(am__v_CXX_@AM_V@) am__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@) am__v_CXX_0 = @echo " CXX " $@; am__v_CXX_1 = CXXLD = $(CXX) CXXLINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \ $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CXXLD = $(am__v_CXXLD_@AM_V@) am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@) am__v_CXXLD_0 = @echo " CXXLD " $@; am__v_CXXLD_1 = COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(dibbler_client_SOURCES) $(dibbler_relay_SOURCES) \ $(dibbler_requestor_SOURCES) $(dibbler_server_SOURCES) DIST_SOURCES = $(dibbler_client_SOURCES) $(dibbler_relay_SOURCES) \ $(dibbler_requestor_SOURCES) $(dibbler_server_SOURCES) RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \ ctags-recursive dvi-recursive html-recursive info-recursive \ install-data-recursive install-dvi-recursive \ install-exec-recursive install-html-recursive \ install-info-recursive install-pdf-recursive \ install-ps-recursive install-recursive installcheck-recursive \ installdirs-recursive pdf-recursive ps-recursive \ tags-recursive uninstall-recursive am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } DATA = $(dist_noinst_DATA) $(nobase_dist_doc_DATA) RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive am__recursive_targets = \ $(RECURSIVE_TARGETS) \ $(RECURSIVE_CLEAN_TARGETS) \ $(am__extra_recursive_targets) AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \ cscope distdir dist dist-all distcheck am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags CSCOPE = cscope DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) distdir = $(PACKAGE)-$(VERSION) top_distdir = $(distdir) am__remove_distdir = \ if test -d "$(distdir)"; then \ find "$(distdir)" -type d ! -perm -200 -exec chmod u+w {} ';' \ && rm -rf "$(distdir)" \ || { sleep 5 && rm -rf "$(distdir)"; }; \ else :; fi am__post_remove_distdir = $(am__remove_distdir) am__relativize = \ dir0=`pwd`; \ sed_first='s,^\([^/]*\)/.*$$,\1,'; \ sed_rest='s,^[^/]*/*,,'; \ sed_last='s,^.*/\([^/]*\)$$,\1,'; \ sed_butlast='s,/*[^/]*$$,,'; \ while test -n "$$dir1"; do \ first=`echo "$$dir1" | sed -e "$$sed_first"`; \ if test "$$first" != "."; then \ if test "$$first" = ".."; then \ dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ else \ first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ if test "$$first2" = "$$first"; then \ dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ else \ dir2="../$$dir2"; \ fi; \ dir0="$$dir0"/"$$first"; \ fi; \ fi; \ dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ done; \ reldir="$$dir2" DIST_ARCHIVES = $(distdir).tar.gz GZIP_ENV = --best DIST_TARGETS = dist-gzip distuninstallcheck_listfiles = find . -type f -print am__distuninstallcheck_listfiles = $(distuninstallcheck_listfiles) \ | sed 's|^\./|$(prefix)/|' | grep -v '$(infodir)/dir$$' distcleancheck_listfiles = find . -type f -print ACLOCAL = @ACLOCAL@ ALLOCA = @ALLOCA@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ ARCH = @ARCH@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ EXTRA_DIST_SUBDIRS = @EXTRA_DIST_SUBDIRS@ FGREP = @FGREP@ GREP = @GREP@ GTEST_INCLUDES = @GTEST_INCLUDES@ GTEST_LDADD = @GTEST_LDADD@ GTEST_LDFLAGS = @GTEST_LDFLAGS@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LINKPRINT = @LINKPRINT@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PORT_CFLAGS = @PORT_CFLAGS@ PORT_LDFLAGS = @PORT_LDFLAGS@ PORT_SUBDIR = @PORT_SUBDIR@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ subdirs = @subdirs@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ AUTOMAKE_OPTIONS = foreign COMMON_SUBDIRS = @PORT_SUBDIR@ nettle $(am__append_1) Misc poslib \ Messages Options AddrMgr CfgMgr IfaceMgr doc SRV_SUBDIRS = SrvOptions SrvIfaceMgr SrvAddrMgr SrvMessages SrvTransMgr SrvCfgMgr REL_SUBDIRS = RelCfgMgr RelIfaceMgr RelMessages RelOptions RelTransMgr CLNT_SUBDIRS = ClntOptions ClntTransMgr ClntAddrMgr ClntCfgMgr ClntIfaceMgr ClntMessages REQ_SUBDIRS = Requestor SUBDIRS = $(COMMON_SUBDIRS) $(SRV_SUBDIRS) $(CLNT_SUBDIRS) \ $(REL_SUBDIRS) $(REQ_SUBDIRS) $(am__append_2) DIST_SUBDIRS = $(COMMON_SUBDIRS) $(SRV_SUBDIRS) $(CLNT_SUBDIRS) \ $(REL_SUBDIRS) $(REQ_SUBDIRS) Port-win32 bison++ \ @EXTRA_DIST_SUBDIRS@ tests dibbler_client_SOURCES = \ $(top_srcdir)/@PORT_SUBDIR@/dibbler-client.cpp \ $(top_srcdir)/Misc/DHCPClient.cpp \ $(top_srcdir)/Misc/DHCPClient.h dibbler_client_CPPFLAGS = -I$(top_srcdir)/Misc \ -I$(top_srcdir)/ClntTransMgr -I$(top_srcdir)/ClntCfgMgr \ -I$(top_srcdir)/CfgMgr -I$(top_srcdir)/Options \ -I$(top_srcdir)/ClntOptions -I$(top_srcdir)/ClntIfaceMgr \ -I$(top_srcdir)/IfaceMgr -I$(top_srcdir)/AddrMgr \ -I$(top_srcdir)/ClntAddrMgr -I$(top_srcdir)/ClntMessages \ -I$(top_srcdir)/Messages dibbler_client_LDADD = -L$(top_builddir)/ClntTransMgr -lClntTransMgr \ -L$(top_builddir)/ClntMessages -lClntMessages -lClntTransMgr \ -L$(top_builddir)/ClntOptions -lClntOptions \ -L$(top_builddir)/ClntCfgMgr -lClntCfgMgr \ -L$(top_builddir)/ClntIfaceMgr -lClntIfaceMgr -lClntMessages \ -lClntCfgMgr -L$(top_builddir)/CfgMgr -lCfgMgr \ -L$(top_builddir)/ClntAddrMgr -lClntAddrMgr \ -L$(top_builddir)/IfaceMgr -lIfaceMgr \ -L$(top_builddir)/AddrMgr -lAddrMgr -L$(top_builddir)/poslib \ -lPoslib -L$(top_builddir)/nettle -lNettle \ -L$(top_builddir)/Options -lOptions -L$(top_builddir)/Messages \ -lMessages -lOptions -lMessages \ -L$(top_builddir)/@PORT_SUBDIR@ -lLowLevel \ -L$(top_builddir)/Misc -lMisc -lClntOptions -lOptions dibbler_server_SOURCES = \ $(top_srcdir)/@PORT_SUBDIR@/dibbler-server.cpp \ $(top_srcdir)/Misc/DHCPServer.cpp \ $(top_srcdir)/Misc/DHCPServer.h dibbler_server_CPPFLAGS = -I$(top_srcdir)/Misc \ -I$(top_srcdir)/SrvTransMgr -I$(top_srcdir)/SrvCfgMgr \ -I$(top_srcdir)/CfgMgr -I$(top_srcdir)/Options \ -I$(top_srcdir)/SrvOptions -I$(top_srcdir)/SrvIfaceMgr \ -I$(top_srcdir)/IfaceMgr -I$(top_srcdir)/AddrMgr \ -I$(top_srcdir)/SrvAddrMgr -I$(top_srcdir)/SrvMessages \ -I$(top_srcdir)/Messages dibbler_server_LDADD = -L$(top_builddir)/SrvOptions -lSrvOptions \ -L$(top_builddir)/SrvMessages -lSrvMessages \ -L$(top_builddir)/SrvIfaceMgr -lSrvIfaceMgr \ -L$(top_builddir)/SrvCfgMgr -lSrvCfgMgr -lSrvOptions \ -lSrvMessages -lSrvIfaceMgr -lSrvCfgMgr \ -L$(top_builddir)/SrvTransMgr -lSrvTransMgr \ -L$(top_builddir)/SrvAddrMgr -lSrvAddrMgr \ -L$(top_builddir)/IfaceMgr -lIfaceMgr \ -L$(top_builddir)/AddrMgr -lAddrMgr -L$(top_builddir)/poslib \ -lPoslib -L$(top_builddir)/Options -lOptions \ -L$(top_builddir)/Messages -lMessages -L$(top_builddir)/CfgMgr \ -lCfgMgr -L$(top_builddir)/@PORT_SUBDIR@ -lLowLevel \ -L$(top_builddir)/Misc -lMisc -lSrvCfgMgr -lSrvMessages \ -lCfgMgr -lSrvOptions -lOptions -lIfaceMgr -lPoslib -lMisc \ -L$(top_builddir)/nettle -lNettle dibbler_relay_SOURCES = $(top_srcdir)/@PORT_SUBDIR@/dibbler-relay.cpp \ $(top_srcdir)/Misc/DHCPRelay.cpp \ $(top_srcdir)/Misc/DHCPRelay.h dibbler_relay_CPPFLAGS = -I$(top_srcdir)/Misc \ -I$(top_srcdir)/RelTransMgr -I$(top_srcdir)/RelCfgMgr \ -I$(top_srcdir)/CfgMgr -I$(top_srcdir)/Options \ -I$(top_srcdir)/RelOptions -I$(top_srcdir)/RelIfaceMgr \ -I$(top_srcdir)/IfaceMgr -I$(top_srcdir)/AddrMgr \ -I$(top_srcdir)/RelAddrMgr -I$(top_srcdir)/RelMessages \ -I$(top_srcdir)/Messages dibbler_relay_LDADD = -L$(top_builddir)/RelTransMgr -lRelTransMgr \ -L$(top_builddir)/RelIfaceMgr -lRelIfaceMgr \ -L$(top_builddir)/RelCfgMgr -lRelCfgMgr -lRelIfaceMgr \ -L$(top_builddir)/RelMessages -lRelMessages -lRelCfgMgr \ -L$(top_builddir)/CfgMgr -lCfgMgr -L$(top_builddir)/RelOptions \ -lRelOptions -L$(top_builddir)/IfaceMgr -lIfaceMgr \ -L$(top_builddir)/poslib -lPoslib -L$(top_builddir)/Messages \ -lMessages -L$(top_builddir)/Options -lOptions \ -L$(top_builddir)/@PORT_SUBDIR@ -lLowLevel \ -L$(top_builddir)/Misc -lMisc dibbler_requestor_SOURCES = $(top_srcdir)/Requestor/Requestor.cpp $(top_srcdir)/Requestor/Requestor.h dibbler_requestor_CPPFLAGS = -I$(top_srcdir)/Misc \ -I$(top_srcdir)/Options -I$(top_srcdir)/Messages \ -I$(top_srcdir)/Requestor -I$(top_srcdir)/IfaceMgr dibbler_requestor_LDADD = -L$(top_builddir)/Requestor -lRequestor \ -L$(top_builddir)/Messages -lMessages \ -L$(top_builddir)/IfaceMgr -lIfaceMgr -L$(top_builddir)/Misc \ -lMisc -L$(top_builddir)/Options -lOptions \ -L$(top_builddir)/@PORT_SUBDIR@ -lLowLevel nobase_dist_doc_DATA = CHANGELOG LICENSE RELNOTES \ scripts/notify-scripts/client-notify-linux.sh \ scripts/notify-scripts/client-notify-macos.sh \ scripts/notify-scripts/client-notify-bsd.sh \ scripts/notify-scripts/server-notify.sh \ scripts/bison-sanitizer.py scripts/remote-autoconf dist_noinst_DATA = m4/libtool.m4 m4/lt~obsolete.m4 m4/ltoptions.m4 \ m4/ltsugar.m4 m4/ltversion.m4 scripts tests all: all-recursive .SUFFIXES: .SUFFIXES: .cpp .lo .o .obj am--refresh: Makefile @: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ echo ' cd $(srcdir) && $(AUTOMAKE) --foreign'; \ $(am__cd) $(srcdir) && $(AUTOMAKE) --foreign \ && exit 0; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ echo ' $(SHELL) ./config.status'; \ $(SHELL) ./config.status;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) $(SHELL) ./config.status --recheck $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) $(am__cd) $(srcdir) && $(AUTOCONF) $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) $(am__cd) $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS) $(am__aclocal_m4_deps): include/dibbler-config.h: include/stamp-h1 @test -f $@ || rm -f include/stamp-h1 @test -f $@ || $(MAKE) $(AM_MAKEFLAGS) include/stamp-h1 include/stamp-h1: $(top_srcdir)/include/dibbler-config.h.in $(top_builddir)/config.status @rm -f include/stamp-h1 cd $(top_builddir) && $(SHELL) ./config.status include/dibbler-config.h $(top_srcdir)/include/dibbler-config.h.in: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) ($(am__cd) $(top_srcdir) && $(AUTOHEADER)) rm -f include/stamp-h1 touch $@ distclean-hdr: -rm -f include/dibbler-config.h include/stamp-h1 install-sbinPROGRAMS: $(sbin_PROGRAMS) @$(NORMAL_INSTALL) @list='$(sbin_PROGRAMS)'; test -n "$(sbindir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(sbindir)'"; \ $(MKDIR_P) "$(DESTDIR)$(sbindir)" || exit 1; \ fi; \ for p in $$list; do echo "$$p $$p"; done | \ sed 's/$(EXEEXT)$$//' | \ while read p p1; do if test -f $$p \ || test -f $$p1 \ ; then echo "$$p"; echo "$$p"; else :; fi; \ done | \ sed -e 'p;s,.*/,,;n;h' \ -e 's|.*|.|' \ -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \ sed 'N;N;N;s,\n, ,g' | \ $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \ { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ if ($$2 == $$4) files[d] = files[d] " " $$1; \ else { print "f", $$3 "/" $$4, $$1; } } \ END { for (d in files) print "f", d, files[d] }' | \ while read type dir files; do \ if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ test -z "$$files" || { \ echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(sbindir)$$dir'"; \ $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(sbindir)$$dir" || exit $$?; \ } \ ; done uninstall-sbinPROGRAMS: @$(NORMAL_UNINSTALL) @list='$(sbin_PROGRAMS)'; test -n "$(sbindir)" || list=; \ files=`for p in $$list; do echo "$$p"; done | \ sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \ -e 's/$$/$(EXEEXT)/' \ `; \ test -n "$$list" || exit 0; \ echo " ( cd '$(DESTDIR)$(sbindir)' && rm -f" $$files ")"; \ cd "$(DESTDIR)$(sbindir)" && rm -f $$files clean-sbinPROGRAMS: @list='$(sbin_PROGRAMS)'; test -n "$$list" || exit 0; \ echo " rm -f" $$list; \ rm -f $$list || exit $$?; \ test -n "$(EXEEXT)" || exit 0; \ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ echo " rm -f" $$list; \ rm -f $$list dibbler-client$(EXEEXT): $(dibbler_client_OBJECTS) $(dibbler_client_DEPENDENCIES) $(EXTRA_dibbler_client_DEPENDENCIES) @rm -f dibbler-client$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(dibbler_client_OBJECTS) $(dibbler_client_LDADD) $(LIBS) dibbler-relay$(EXEEXT): $(dibbler_relay_OBJECTS) $(dibbler_relay_DEPENDENCIES) $(EXTRA_dibbler_relay_DEPENDENCIES) @rm -f dibbler-relay$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(dibbler_relay_OBJECTS) $(dibbler_relay_LDADD) $(LIBS) dibbler-requestor$(EXEEXT): $(dibbler_requestor_OBJECTS) $(dibbler_requestor_DEPENDENCIES) $(EXTRA_dibbler_requestor_DEPENDENCIES) @rm -f dibbler-requestor$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(dibbler_requestor_OBJECTS) $(dibbler_requestor_LDADD) $(LIBS) dibbler-server$(EXEEXT): $(dibbler_server_OBJECTS) $(dibbler_server_DEPENDENCIES) $(EXTRA_dibbler_server_DEPENDENCIES) @rm -f dibbler-server$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(dibbler_server_OBJECTS) $(dibbler_server_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dibbler_client-DHCPClient.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dibbler_client-dibbler-client.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dibbler_relay-DHCPRelay.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dibbler_relay-dibbler-relay.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dibbler_requestor-Requestor.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dibbler_server-DHCPServer.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dibbler_server-dibbler-server.Po@am__quote@ .cpp.o: @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $< .cpp.obj: @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .cpp.lo: @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LTCXXCOMPILE) -c -o $@ $< dibbler_client-dibbler-client.o: $(top_srcdir)/@PORT_SUBDIR@/dibbler-client.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dibbler_client_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT dibbler_client-dibbler-client.o -MD -MP -MF $(DEPDIR)/dibbler_client-dibbler-client.Tpo -c -o dibbler_client-dibbler-client.o `test -f '$(top_srcdir)/@PORT_SUBDIR@/dibbler-client.cpp' || echo '$(srcdir)/'`$(top_srcdir)/@PORT_SUBDIR@/dibbler-client.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dibbler_client-dibbler-client.Tpo $(DEPDIR)/dibbler_client-dibbler-client.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$(top_srcdir)/@PORT_SUBDIR@/dibbler-client.cpp' object='dibbler_client-dibbler-client.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dibbler_client_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o dibbler_client-dibbler-client.o `test -f '$(top_srcdir)/@PORT_SUBDIR@/dibbler-client.cpp' || echo '$(srcdir)/'`$(top_srcdir)/@PORT_SUBDIR@/dibbler-client.cpp dibbler_client-dibbler-client.obj: $(top_srcdir)/@PORT_SUBDIR@/dibbler-client.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dibbler_client_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT dibbler_client-dibbler-client.obj -MD -MP -MF $(DEPDIR)/dibbler_client-dibbler-client.Tpo -c -o dibbler_client-dibbler-client.obj `if test -f '$(top_srcdir)/@PORT_SUBDIR@/dibbler-client.cpp'; then $(CYGPATH_W) '$(top_srcdir)/@PORT_SUBDIR@/dibbler-client.cpp'; else $(CYGPATH_W) '$(srcdir)/$(top_srcdir)/@PORT_SUBDIR@/dibbler-client.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dibbler_client-dibbler-client.Tpo $(DEPDIR)/dibbler_client-dibbler-client.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$(top_srcdir)/@PORT_SUBDIR@/dibbler-client.cpp' object='dibbler_client-dibbler-client.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dibbler_client_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o dibbler_client-dibbler-client.obj `if test -f '$(top_srcdir)/@PORT_SUBDIR@/dibbler-client.cpp'; then $(CYGPATH_W) '$(top_srcdir)/@PORT_SUBDIR@/dibbler-client.cpp'; else $(CYGPATH_W) '$(srcdir)/$(top_srcdir)/@PORT_SUBDIR@/dibbler-client.cpp'; fi` dibbler_client-DHCPClient.o: $(top_srcdir)/Misc/DHCPClient.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dibbler_client_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT dibbler_client-DHCPClient.o -MD -MP -MF $(DEPDIR)/dibbler_client-DHCPClient.Tpo -c -o dibbler_client-DHCPClient.o `test -f '$(top_srcdir)/Misc/DHCPClient.cpp' || echo '$(srcdir)/'`$(top_srcdir)/Misc/DHCPClient.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dibbler_client-DHCPClient.Tpo $(DEPDIR)/dibbler_client-DHCPClient.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$(top_srcdir)/Misc/DHCPClient.cpp' object='dibbler_client-DHCPClient.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dibbler_client_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o dibbler_client-DHCPClient.o `test -f '$(top_srcdir)/Misc/DHCPClient.cpp' || echo '$(srcdir)/'`$(top_srcdir)/Misc/DHCPClient.cpp dibbler_client-DHCPClient.obj: $(top_srcdir)/Misc/DHCPClient.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dibbler_client_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT dibbler_client-DHCPClient.obj -MD -MP -MF $(DEPDIR)/dibbler_client-DHCPClient.Tpo -c -o dibbler_client-DHCPClient.obj `if test -f '$(top_srcdir)/Misc/DHCPClient.cpp'; then $(CYGPATH_W) '$(top_srcdir)/Misc/DHCPClient.cpp'; else $(CYGPATH_W) '$(srcdir)/$(top_srcdir)/Misc/DHCPClient.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dibbler_client-DHCPClient.Tpo $(DEPDIR)/dibbler_client-DHCPClient.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$(top_srcdir)/Misc/DHCPClient.cpp' object='dibbler_client-DHCPClient.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dibbler_client_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o dibbler_client-DHCPClient.obj `if test -f '$(top_srcdir)/Misc/DHCPClient.cpp'; then $(CYGPATH_W) '$(top_srcdir)/Misc/DHCPClient.cpp'; else $(CYGPATH_W) '$(srcdir)/$(top_srcdir)/Misc/DHCPClient.cpp'; fi` dibbler_relay-dibbler-relay.o: $(top_srcdir)/@PORT_SUBDIR@/dibbler-relay.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dibbler_relay_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT dibbler_relay-dibbler-relay.o -MD -MP -MF $(DEPDIR)/dibbler_relay-dibbler-relay.Tpo -c -o dibbler_relay-dibbler-relay.o `test -f '$(top_srcdir)/@PORT_SUBDIR@/dibbler-relay.cpp' || echo '$(srcdir)/'`$(top_srcdir)/@PORT_SUBDIR@/dibbler-relay.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dibbler_relay-dibbler-relay.Tpo $(DEPDIR)/dibbler_relay-dibbler-relay.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$(top_srcdir)/@PORT_SUBDIR@/dibbler-relay.cpp' object='dibbler_relay-dibbler-relay.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dibbler_relay_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o dibbler_relay-dibbler-relay.o `test -f '$(top_srcdir)/@PORT_SUBDIR@/dibbler-relay.cpp' || echo '$(srcdir)/'`$(top_srcdir)/@PORT_SUBDIR@/dibbler-relay.cpp dibbler_relay-dibbler-relay.obj: $(top_srcdir)/@PORT_SUBDIR@/dibbler-relay.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dibbler_relay_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT dibbler_relay-dibbler-relay.obj -MD -MP -MF $(DEPDIR)/dibbler_relay-dibbler-relay.Tpo -c -o dibbler_relay-dibbler-relay.obj `if test -f '$(top_srcdir)/@PORT_SUBDIR@/dibbler-relay.cpp'; then $(CYGPATH_W) '$(top_srcdir)/@PORT_SUBDIR@/dibbler-relay.cpp'; else $(CYGPATH_W) '$(srcdir)/$(top_srcdir)/@PORT_SUBDIR@/dibbler-relay.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dibbler_relay-dibbler-relay.Tpo $(DEPDIR)/dibbler_relay-dibbler-relay.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$(top_srcdir)/@PORT_SUBDIR@/dibbler-relay.cpp' object='dibbler_relay-dibbler-relay.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dibbler_relay_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o dibbler_relay-dibbler-relay.obj `if test -f '$(top_srcdir)/@PORT_SUBDIR@/dibbler-relay.cpp'; then $(CYGPATH_W) '$(top_srcdir)/@PORT_SUBDIR@/dibbler-relay.cpp'; else $(CYGPATH_W) '$(srcdir)/$(top_srcdir)/@PORT_SUBDIR@/dibbler-relay.cpp'; fi` dibbler_relay-DHCPRelay.o: $(top_srcdir)/Misc/DHCPRelay.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dibbler_relay_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT dibbler_relay-DHCPRelay.o -MD -MP -MF $(DEPDIR)/dibbler_relay-DHCPRelay.Tpo -c -o dibbler_relay-DHCPRelay.o `test -f '$(top_srcdir)/Misc/DHCPRelay.cpp' || echo '$(srcdir)/'`$(top_srcdir)/Misc/DHCPRelay.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dibbler_relay-DHCPRelay.Tpo $(DEPDIR)/dibbler_relay-DHCPRelay.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$(top_srcdir)/Misc/DHCPRelay.cpp' object='dibbler_relay-DHCPRelay.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dibbler_relay_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o dibbler_relay-DHCPRelay.o `test -f '$(top_srcdir)/Misc/DHCPRelay.cpp' || echo '$(srcdir)/'`$(top_srcdir)/Misc/DHCPRelay.cpp dibbler_relay-DHCPRelay.obj: $(top_srcdir)/Misc/DHCPRelay.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dibbler_relay_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT dibbler_relay-DHCPRelay.obj -MD -MP -MF $(DEPDIR)/dibbler_relay-DHCPRelay.Tpo -c -o dibbler_relay-DHCPRelay.obj `if test -f '$(top_srcdir)/Misc/DHCPRelay.cpp'; then $(CYGPATH_W) '$(top_srcdir)/Misc/DHCPRelay.cpp'; else $(CYGPATH_W) '$(srcdir)/$(top_srcdir)/Misc/DHCPRelay.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dibbler_relay-DHCPRelay.Tpo $(DEPDIR)/dibbler_relay-DHCPRelay.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$(top_srcdir)/Misc/DHCPRelay.cpp' object='dibbler_relay-DHCPRelay.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dibbler_relay_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o dibbler_relay-DHCPRelay.obj `if test -f '$(top_srcdir)/Misc/DHCPRelay.cpp'; then $(CYGPATH_W) '$(top_srcdir)/Misc/DHCPRelay.cpp'; else $(CYGPATH_W) '$(srcdir)/$(top_srcdir)/Misc/DHCPRelay.cpp'; fi` dibbler_requestor-Requestor.o: $(top_srcdir)/Requestor/Requestor.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dibbler_requestor_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT dibbler_requestor-Requestor.o -MD -MP -MF $(DEPDIR)/dibbler_requestor-Requestor.Tpo -c -o dibbler_requestor-Requestor.o `test -f '$(top_srcdir)/Requestor/Requestor.cpp' || echo '$(srcdir)/'`$(top_srcdir)/Requestor/Requestor.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dibbler_requestor-Requestor.Tpo $(DEPDIR)/dibbler_requestor-Requestor.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$(top_srcdir)/Requestor/Requestor.cpp' object='dibbler_requestor-Requestor.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dibbler_requestor_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o dibbler_requestor-Requestor.o `test -f '$(top_srcdir)/Requestor/Requestor.cpp' || echo '$(srcdir)/'`$(top_srcdir)/Requestor/Requestor.cpp dibbler_requestor-Requestor.obj: $(top_srcdir)/Requestor/Requestor.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dibbler_requestor_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT dibbler_requestor-Requestor.obj -MD -MP -MF $(DEPDIR)/dibbler_requestor-Requestor.Tpo -c -o dibbler_requestor-Requestor.obj `if test -f '$(top_srcdir)/Requestor/Requestor.cpp'; then $(CYGPATH_W) '$(top_srcdir)/Requestor/Requestor.cpp'; else $(CYGPATH_W) '$(srcdir)/$(top_srcdir)/Requestor/Requestor.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dibbler_requestor-Requestor.Tpo $(DEPDIR)/dibbler_requestor-Requestor.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$(top_srcdir)/Requestor/Requestor.cpp' object='dibbler_requestor-Requestor.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dibbler_requestor_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o dibbler_requestor-Requestor.obj `if test -f '$(top_srcdir)/Requestor/Requestor.cpp'; then $(CYGPATH_W) '$(top_srcdir)/Requestor/Requestor.cpp'; else $(CYGPATH_W) '$(srcdir)/$(top_srcdir)/Requestor/Requestor.cpp'; fi` dibbler_server-dibbler-server.o: $(top_srcdir)/@PORT_SUBDIR@/dibbler-server.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dibbler_server_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT dibbler_server-dibbler-server.o -MD -MP -MF $(DEPDIR)/dibbler_server-dibbler-server.Tpo -c -o dibbler_server-dibbler-server.o `test -f '$(top_srcdir)/@PORT_SUBDIR@/dibbler-server.cpp' || echo '$(srcdir)/'`$(top_srcdir)/@PORT_SUBDIR@/dibbler-server.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dibbler_server-dibbler-server.Tpo $(DEPDIR)/dibbler_server-dibbler-server.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$(top_srcdir)/@PORT_SUBDIR@/dibbler-server.cpp' object='dibbler_server-dibbler-server.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dibbler_server_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o dibbler_server-dibbler-server.o `test -f '$(top_srcdir)/@PORT_SUBDIR@/dibbler-server.cpp' || echo '$(srcdir)/'`$(top_srcdir)/@PORT_SUBDIR@/dibbler-server.cpp dibbler_server-dibbler-server.obj: $(top_srcdir)/@PORT_SUBDIR@/dibbler-server.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dibbler_server_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT dibbler_server-dibbler-server.obj -MD -MP -MF $(DEPDIR)/dibbler_server-dibbler-server.Tpo -c -o dibbler_server-dibbler-server.obj `if test -f '$(top_srcdir)/@PORT_SUBDIR@/dibbler-server.cpp'; then $(CYGPATH_W) '$(top_srcdir)/@PORT_SUBDIR@/dibbler-server.cpp'; else $(CYGPATH_W) '$(srcdir)/$(top_srcdir)/@PORT_SUBDIR@/dibbler-server.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dibbler_server-dibbler-server.Tpo $(DEPDIR)/dibbler_server-dibbler-server.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$(top_srcdir)/@PORT_SUBDIR@/dibbler-server.cpp' object='dibbler_server-dibbler-server.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dibbler_server_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o dibbler_server-dibbler-server.obj `if test -f '$(top_srcdir)/@PORT_SUBDIR@/dibbler-server.cpp'; then $(CYGPATH_W) '$(top_srcdir)/@PORT_SUBDIR@/dibbler-server.cpp'; else $(CYGPATH_W) '$(srcdir)/$(top_srcdir)/@PORT_SUBDIR@/dibbler-server.cpp'; fi` dibbler_server-DHCPServer.o: $(top_srcdir)/Misc/DHCPServer.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dibbler_server_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT dibbler_server-DHCPServer.o -MD -MP -MF $(DEPDIR)/dibbler_server-DHCPServer.Tpo -c -o dibbler_server-DHCPServer.o `test -f '$(top_srcdir)/Misc/DHCPServer.cpp' || echo '$(srcdir)/'`$(top_srcdir)/Misc/DHCPServer.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dibbler_server-DHCPServer.Tpo $(DEPDIR)/dibbler_server-DHCPServer.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$(top_srcdir)/Misc/DHCPServer.cpp' object='dibbler_server-DHCPServer.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dibbler_server_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o dibbler_server-DHCPServer.o `test -f '$(top_srcdir)/Misc/DHCPServer.cpp' || echo '$(srcdir)/'`$(top_srcdir)/Misc/DHCPServer.cpp dibbler_server-DHCPServer.obj: $(top_srcdir)/Misc/DHCPServer.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dibbler_server_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT dibbler_server-DHCPServer.obj -MD -MP -MF $(DEPDIR)/dibbler_server-DHCPServer.Tpo -c -o dibbler_server-DHCPServer.obj `if test -f '$(top_srcdir)/Misc/DHCPServer.cpp'; then $(CYGPATH_W) '$(top_srcdir)/Misc/DHCPServer.cpp'; else $(CYGPATH_W) '$(srcdir)/$(top_srcdir)/Misc/DHCPServer.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dibbler_server-DHCPServer.Tpo $(DEPDIR)/dibbler_server-DHCPServer.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$(top_srcdir)/Misc/DHCPServer.cpp' object='dibbler_server-DHCPServer.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dibbler_server_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o dibbler_server-DHCPServer.obj `if test -f '$(top_srcdir)/Misc/DHCPServer.cpp'; then $(CYGPATH_W) '$(top_srcdir)/Misc/DHCPServer.cpp'; else $(CYGPATH_W) '$(srcdir)/$(top_srcdir)/Misc/DHCPServer.cpp'; fi` mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs distclean-libtool: -rm -f libtool config.lt install-nobase_dist_docDATA: $(nobase_dist_doc_DATA) @$(NORMAL_INSTALL) @list='$(nobase_dist_doc_DATA)'; test -n "$(docdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(docdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(docdir)" || exit 1; \ fi; \ $(am__nobase_list) | while read dir files; do \ xfiles=; for file in $$files; do \ if test -f "$$file"; then xfiles="$$xfiles $$file"; \ else xfiles="$$xfiles $(srcdir)/$$file"; fi; done; \ test -z "$$xfiles" || { \ test "x$$dir" = x. || { \ echo " $(MKDIR_P) '$(DESTDIR)$(docdir)/$$dir'"; \ $(MKDIR_P) "$(DESTDIR)$(docdir)/$$dir"; }; \ echo " $(INSTALL_DATA) $$xfiles '$(DESTDIR)$(docdir)/$$dir'"; \ $(INSTALL_DATA) $$xfiles "$(DESTDIR)$(docdir)/$$dir" || exit $$?; }; \ done uninstall-nobase_dist_docDATA: @$(NORMAL_UNINSTALL) @list='$(nobase_dist_doc_DATA)'; test -n "$(docdir)" || list=; \ $(am__nobase_strip_setup); files=`$(am__nobase_strip)`; \ dir='$(DESTDIR)$(docdir)'; $(am__uninstall_files_from_dir) # This directory's subdirectories are mostly independent; you can cd # into them and run 'make' without going through this Makefile. # To change the values of 'make' variables: instead of editing Makefiles, # (1) if the variable is set in 'config.status', edit 'config.status' # (which will cause the Makefiles to be regenerated when you run 'make'); # (2) otherwise, pass the desired values on the 'make' command line. $(am__recursive_targets): @fail=; \ if $(am__make_keepgoing); then \ failcom='fail=yes'; \ else \ failcom='exit 1'; \ fi; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-recursive TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ empty_fix=.; \ else \ include_option=--include; \ empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-recursive CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscope: cscope.files test ! -s cscope.files \ || $(CSCOPE) -b -q $(AM_CSCOPEFLAGS) $(CSCOPEFLAGS) -i cscope.files $(CSCOPE_ARGS) clean-cscope: -rm -f cscope.files cscope.files: clean-cscope cscopelist cscopelist: cscopelist-recursive cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags -rm -f cscope.out cscope.in.out cscope.po.out cscope.files distdir: $(DISTFILES) $(am__remove_distdir) test -d "$(distdir)" || mkdir "$(distdir)" @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ $(am__make_dryrun) \ || test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ $(am__relativize); \ new_distdir=$$reldir; \ dir1=$$subdir; dir2="$(top_distdir)"; \ $(am__relativize); \ new_top_distdir=$$reldir; \ echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ ($(am__cd) $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$new_top_distdir" \ distdir="$$new_distdir" \ am__remove_distdir=: \ am__skip_length_check=: \ am__skip_mode_fix=: \ distdir) \ || exit 1; \ fi; \ done -test -n "$(am__skip_mode_fix)" \ || find "$(distdir)" -type d ! -perm -755 \ -exec chmod u+rwx,go+rx {} \; -o \ ! -type d ! -perm -444 -links 1 -exec chmod a+r {} \; -o \ ! -type d ! -perm -400 -exec chmod a+r {} \; -o \ ! -type d ! -perm -444 -exec $(install_sh) -c -m a+r {} {} \; \ || chmod -R a+r "$(distdir)" dist-gzip: distdir tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz $(am__post_remove_distdir) dist-bzip2: distdir tardir=$(distdir) && $(am__tar) | BZIP2=$${BZIP2--9} bzip2 -c >$(distdir).tar.bz2 $(am__post_remove_distdir) dist-lzip: distdir tardir=$(distdir) && $(am__tar) | lzip -c $${LZIP_OPT--9} >$(distdir).tar.lz $(am__post_remove_distdir) dist-xz: distdir tardir=$(distdir) && $(am__tar) | XZ_OPT=$${XZ_OPT--e} xz -c >$(distdir).tar.xz $(am__post_remove_distdir) dist-tarZ: distdir @echo WARNING: "Support for shar distribution archives is" \ "deprecated." >&2 @echo WARNING: "It will be removed altogether in Automake 2.0" >&2 tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z $(am__post_remove_distdir) dist-shar: distdir @echo WARNING: "Support for distribution archives compressed with" \ "legacy program 'compress' is deprecated." >&2 @echo WARNING: "It will be removed altogether in Automake 2.0" >&2 shar $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).shar.gz $(am__post_remove_distdir) dist-zip: distdir -rm -f $(distdir).zip zip -rq $(distdir).zip $(distdir) $(am__post_remove_distdir) dist dist-all: $(MAKE) $(AM_MAKEFLAGS) $(DIST_TARGETS) am__post_remove_distdir='@:' $(am__post_remove_distdir) # This target untars the dist file and tries a VPATH configuration. Then # it guarantees that the distribution is self-contained by making another # tarfile. distcheck: dist case '$(DIST_ARCHIVES)' in \ *.tar.gz*) \ GZIP=$(GZIP_ENV) gzip -dc $(distdir).tar.gz | $(am__untar) ;;\ *.tar.bz2*) \ bzip2 -dc $(distdir).tar.bz2 | $(am__untar) ;;\ *.tar.lz*) \ lzip -dc $(distdir).tar.lz | $(am__untar) ;;\ *.tar.xz*) \ xz -dc $(distdir).tar.xz | $(am__untar) ;;\ *.tar.Z*) \ uncompress -c $(distdir).tar.Z | $(am__untar) ;;\ *.shar.gz*) \ GZIP=$(GZIP_ENV) gzip -dc $(distdir).shar.gz | unshar ;;\ *.zip*) \ unzip $(distdir).zip ;;\ esac chmod -R a-w $(distdir) chmod u+w $(distdir) mkdir $(distdir)/_build $(distdir)/_inst chmod a-w $(distdir) test -d $(distdir)/_build || exit 0; \ dc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\/]:[\\/],/,'` \ && dc_destdir="$${TMPDIR-/tmp}/am-dc-$$$$/" \ && am__cwd=`pwd` \ && $(am__cd) $(distdir)/_build \ && ../configure \ $(AM_DISTCHECK_CONFIGURE_FLAGS) \ $(DISTCHECK_CONFIGURE_FLAGS) \ --srcdir=.. --prefix="$$dc_install_base" \ && $(MAKE) $(AM_MAKEFLAGS) \ && $(MAKE) $(AM_MAKEFLAGS) dvi \ && $(MAKE) $(AM_MAKEFLAGS) check \ && $(MAKE) $(AM_MAKEFLAGS) install \ && $(MAKE) $(AM_MAKEFLAGS) installcheck \ && $(MAKE) $(AM_MAKEFLAGS) uninstall \ && $(MAKE) $(AM_MAKEFLAGS) distuninstallcheck_dir="$$dc_install_base" \ distuninstallcheck \ && chmod -R a-w "$$dc_install_base" \ && ({ \ (cd ../.. && umask 077 && mkdir "$$dc_destdir") \ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" install \ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" uninstall \ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" \ distuninstallcheck_dir="$$dc_destdir" distuninstallcheck; \ } || { rm -rf "$$dc_destdir"; exit 1; }) \ && rm -rf "$$dc_destdir" \ && $(MAKE) $(AM_MAKEFLAGS) dist \ && rm -rf $(DIST_ARCHIVES) \ && $(MAKE) $(AM_MAKEFLAGS) distcleancheck \ && cd "$$am__cwd" \ || exit 1 $(am__post_remove_distdir) @(echo "$(distdir) archives ready for distribution: "; \ list='$(DIST_ARCHIVES)'; for i in $$list; do echo $$i; done) | \ sed -e 1h -e 1s/./=/g -e 1p -e 1x -e '$$p' -e '$$x' distuninstallcheck: @test -n '$(distuninstallcheck_dir)' || { \ echo 'ERROR: trying to run $@ with an empty' \ '$$(distuninstallcheck_dir)' >&2; \ exit 1; \ }; \ $(am__cd) '$(distuninstallcheck_dir)' || { \ echo 'ERROR: cannot chdir into $(distuninstallcheck_dir)' >&2; \ exit 1; \ }; \ test `$(am__distuninstallcheck_listfiles) | wc -l` -eq 0 \ || { echo "ERROR: files left after uninstall:" ; \ if test -n "$(DESTDIR)"; then \ echo " (check DESTDIR support)"; \ fi ; \ $(distuninstallcheck_listfiles) ; \ exit 1; } >&2 distcleancheck: distclean @if test '$(srcdir)' = . ; then \ echo "ERROR: distcleancheck can only run from a VPATH build" ; \ exit 1 ; \ fi @test `$(distcleancheck_listfiles) | wc -l` -eq 0 \ || { echo "ERROR: files left in build directory after distclean:" ; \ $(distcleancheck_listfiles) ; \ exit 1; } >&2 check-am: all-am check: check-recursive all-am: Makefile $(PROGRAMS) $(DATA) installdirs: installdirs-recursive installdirs-am: for dir in "$(DESTDIR)$(sbindir)" "$(DESTDIR)$(docdir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-recursive clean-am: clean-generic clean-libtool clean-sbinPROGRAMS \ mostlyclean-am distclean: distclean-recursive -rm -f $(am__CONFIG_DISTCLEAN_FILES) -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-hdr distclean-libtool distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive html-am: info: info-recursive info-am: install-data-am: install-nobase_dist_docDATA install-dvi: install-dvi-recursive install-dvi-am: install-exec-am: install-sbinPROGRAMS install-html: install-html-recursive install-html-am: install-info: install-info-recursive install-info-am: install-man: install-pdf: install-pdf-recursive install-pdf-am: install-ps: install-ps-recursive install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-recursive -rm -f $(am__CONFIG_DISTCLEAN_FILES) -rm -rf $(top_srcdir)/autom4te.cache -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: uninstall-nobase_dist_docDATA uninstall-sbinPROGRAMS .MAKE: $(am__recursive_targets) install-am install-strip .PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am \ am--refresh check check-am clean clean-cscope clean-generic \ clean-libtool clean-sbinPROGRAMS cscope cscopelist-am ctags \ ctags-am dist dist-all dist-bzip2 dist-gzip dist-lzip \ dist-shar dist-tarZ dist-xz dist-zip distcheck distclean \ distclean-compile distclean-generic distclean-hdr \ distclean-libtool distclean-tags distcleancheck distdir \ distuninstallcheck dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-nobase_dist_docDATA install-pdf install-pdf-am \ install-ps install-ps-am install-sbinPROGRAMS install-strip \ installcheck installcheck-am installdirs installdirs-am \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ pdf pdf-am ps ps-am tags tags-am uninstall uninstall-am \ uninstall-nobase_dist_docDATA uninstall-sbinPROGRAMS common-libs: for dir in $(COMMON_SUBDIRS) ; do \ $(MAKE) -C $$dir ; \ done client-libs: for dir in $(CLNT_SUBDIRS) ; do \ $(MAKE) -C $$dir ; \ done server-libs: for dir in $(SRV_SUBDIRS) ; do \ $(MAKE) -C $$dir ; \ done relay-libs: for dir in $(REL_SUBDIRS) ; do \ $(MAKE) -C $$dir ; \ done requestor-libs: for dir in $(REQ_SUBDIRS) ; do \ $(MAKE) -C $$dir ; \ done client: common-libs client-libs $(MAKE) dibbler-client server: common-libs server-libs $(MAKE) dibbler-server relay: common-libs relay-libs $(MAKE) dibbler-relay requestor: common-libs requestor-libs $(MAKE) dibbler-requestor # these are conditional directories. Therefore they are not added to # dist directory. bison: bison/bison++ bison/bison++: @echo "[CONFIG ] /bison++/" cd $(top_srcdir)/bison++; ./configure --host=$(CHOST) --build=$(CBUILD) >configure.log @echo "[MAKE ] /bison++/bison++" $(MAKE) -C $(top_srcdir)/bison++ parser: $(MAKE) -C SrvCfgMgr parser $(MAKE) -C ClntCfgMgr parser $(MAKE) -C RelCfgMgr parser .PHONY: common-libs # 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: dibbler-1.0.1/poslib/0000775000175000017500000000000012561700417011412 500000000000000dibbler-1.0.1/poslib/socket.cpp0000644000175000017500000003256512277722750013347 00000000000000/* Posadis - A DNS Server Socket functions Copyright (C) 2002 Meilof Veeningen 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., 675 Mass Ave, Cambridge, MA 02139, USA. */ #include "syssocket.h" #include "socket.h" #include "sysstring.h" #include "exception.h" #include "lexfn.h" #include "postime.h" #include #ifndef WIN32 #include #endif bool posclient_quitflag = false; int struct_pf(_addr *addr) { if (addr->s_family == AF_INET) return PF_INET; else if (addr->s_family == AF_INET6) return PF_INET6; return -1; } int struct_len(_addr *addr) { if (addr->s_family == AF_INET) return sizeof(sockaddr_in); else if (addr->s_family == AF_INET6) return sizeof(sockaddr_in6); return -1; } #ifdef _WIN32 /* static socket library initialization */ class __init_socklib { public: __init_socklib() { WSADATA info; WSAStartup(MAKEWORD(2, 2), &info); } ~__init_socklib() { WSACleanup(); } } __static_init_socklib; #endif void setnonblock(int sockid) { #ifdef _WIN32 long int val = 1; u_long req = FIONBIO; ioctlsocket(sockid, val, &req); #else if (fcntl(sockid, F_SETFL, O_NONBLOCK) < 0) { closesocket(sockid); throw PException("Could not set socket to non-blocking"); } #endif } int udpcreateserver(_addr* socketaddr) { int sockid; int one = 1; if ((sockid = socket(struct_pf(socketaddr), SOCK_DGRAM, IPPROTO_UDP)) < 0) throw PException("Could not create UDP socket!"); if (bind(sockid, (sockaddr *)(socketaddr), struct_len(socketaddr)) < 0) { closesocket(sockid); throw PException("Could not bind to socket!"); } setsockopt(sockid, SOL_SOCKET, SO_REUSEADDR, (char *)&one, sizeof(one)); setnonblock(sockid); return sockid; } void udpclose(int sockid) { closesocket(sockid); } int udpread(int sockid, const char *buff, int len, _addr *addr) { socklen_t addr_size = sizeof(_addr); int ret = recvfrom(sockid, (char*)buff, len, 0, (sockaddr *) addr, &addr_size); if (ret <= 0) throw PException("Could not receive data from UDP socket"); return ret; } void udpsend(int sockid, const char *buff, int len, _addr *addr) { if (sendto(sockid, (char*)buff, len, 0, (sockaddr *)addr, struct_len(addr)) < 0) throw PException(true, "Could not send UDP packet: sock %d, err %d", sockid, errno); } int tcpcreateserver(_addr *socketaddr) { int sockid; int one = 1; if ((sockid = socket(struct_pf(socketaddr), SOCK_STREAM, IPPROTO_TCP)) < 0) throw PException("Could not create TCP socket"); if (bind(sockid, (sockaddr *)socketaddr, struct_len(socketaddr)) < 0) { closesocket(sockid); throw PException("Could not bind TCP socket"); } setsockopt(sockid, SOL_SOCKET, SO_REUSEADDR, (char *)&one, sizeof(one)); setnonblock(sockid); if (listen(sockid, 5) < 0) { closesocket(sockid); throw PException("Could not listen to TCP socket"); } return sockid; } int tcpopen(_addr *addr) { int sockid; if ((sockid = socket(struct_pf(addr), SOCK_STREAM, IPPROTO_TCP)) < 0) throw PException("Could not create TCP socket"); if (connect(sockid, (sockaddr *)addr, struct_len(addr)) < 0) { closesocket(sockid); std::string txt = addr_to_string(addr, false); throw PException(true, "Could not connect TCP socket to dst addr=%s", txt.c_str()); } return sockid; } int tcpopen_from(_addr *to, _addr *source) { int sockid; if ((sockid = socket(struct_pf(to), SOCK_STREAM, IPPROTO_TCP)) < 0) throw PException("Could not create TCP socket"); if (bind(sockid, (sockaddr *)source, struct_len(source)) < 0) { closesocket(sockid); throw PException("Could not bind TCP socket"); } if (connect(sockid, (sockaddr *)to, struct_len(to)) < 0) { closesocket(sockid); throw PException("Could not connect TCP socket"); } return sockid; } void tcpclose(int socket) { closesocket(socket); } int tcpaccept(int socket, _addr *askaddr) { _addr querier; socklen_t len = sizeof(_addr); int ret = accept(socket, (sockaddr *)&querier, &len); if (ret < 0) throw PException("Could not accept TCP connection"); if (askaddr) memcpy(askaddr, &querier, len); return ret; } int tcpsend(int socket, const char *buff, int bufflen) { int ret = send(socket, buff, bufflen, 0); if (ret < 0 && errno != EAGAIN) throw PException("Could not send TCP message"); return ret; } int tcpread(int socket, const char *buff, int bufflen) { int ret = recv(socket, (char*)buff, bufflen, 0); if (ret < 0) { if (errno == EAGAIN) return 0; throw PException(true, "Could not read TCP message"); } return ret; } void tcpsendall(int sockid, const char *buff, int len, int maxtime) { smallset_t set; postime_t end = getcurtime() + maxtime, cur; int ret, x; set.init(1); set.set(0, sockid); while (len > 0) { while ((cur = getcurtime()) <= end) { set.init(1); set.set(0, sockid); x = end.after(cur); if (x > 1000) x = 1000; set.waitwrite(x); if (set.canwrite(0) || posclient_quitflag) break; } if (!set.canwrite(0)) throw PException("Could not send buffer"); ret = tcpsend(sockid, buff, len); buff += ret; len -= ret; } } void tcpreadall(int sockid, const char *buff, int len, int maxtime) { smallset_t set; postime_t end = getcurtime() + maxtime, cur; int ret, x; set.init(1); set.set(0, sockid); while (len > 0) { while ((cur = getcurtime()) <= end) { set.init(1); set.set(0, sockid); x = end.after(cur); if (x > 1000) x = 1000; set.wait(x); if (set.isdata(0) || posclient_quitflag) break; } // set.check(); if (!set.isdata(0)) { throw PException("Could not read TCP message: no data"); } ret = tcpread(sockid, buff, len); if (ret == 0) throw PException("TCP client hung up!"); buff += ret; len -= ret; } } bool tcpisopen(int sockid) { smallset_t set; set.init(1); set.set(0, sockid); set.check(); if (!set.isdata(0)) return true; char buff[1]; if (recv(sockid, buff, 1, MSG_PEEK) <= 0) return false; else return true; } /* address functions */ void getaddress_ip4(_addr *res, const unsigned char *ipv4_data, int port) { memset(res, 0, sizeof(_addr)); #ifdef HAVE_SIN_LEN ((sockaddr_in *)res)->sin_len = sizeof(_addr); #endif ((sockaddr_in *)res)->sin_family = AF_INET; ((sockaddr_in *)res)->sin_port = htons(port); memcpy(&((sockaddr_in *)res)->sin_addr.s_addr, ipv4_data, 4); } void getaddress_ip6(_addr *res, const unsigned char *ipv6_data, int port) { memset(res, 0, sizeof(_addr)); #ifdef HAVE_SIN6_LEN ((sockaddr_in6 *)res)->sin6_len = sizeof(_addr); #endif ((sockaddr_in6 *)res)->sin6_family = AF_INET6; ((sockaddr_in6 *)res)->sin6_port = htons(port); memcpy(&((sockaddr_in6 *)res)->sin6_addr, ipv6_data, 16); } void getaddress(_addr *res, const char *ip, int port) { char *ptr = strchr((char*)ip, ':'); if (ptr) { /* ipv6 */ memset(res, 0, sizeof(sockaddr_in6)); #ifdef HAVE_SIN6_LEN ((sockaddr_in6 *)res)->sin6_len = sizeof(sockaddr_in6); #endif ((sockaddr_in6 *)res)->sin6_family = AF_INET6; ((sockaddr_in6 *)res)->sin6_port = htons(port); txt_to_ipv6((unsigned char *)&((sockaddr_in6 *)res)->sin6_addr, ip); return; } /* ipv4 */ memset(res, 0, sizeof(sockaddr_in)); #ifdef HAVE_SIN_LEN ((sockaddr_in *)res)->sin_len = sizeof(sockaddr_in); #endif ((sockaddr_in *)res)->sin_family = AF_INET; ((sockaddr_in *)res)->sin_port = htons(port); txt_to_ip((unsigned char *)&((sockaddr_in *)res)->sin_addr, ip); } void addr_setport(_addr *addr, int port) { ((sockaddr_in *)addr)->sin_port = htons(port); } int addr_getport(_addr *addr) { return ntohs(((sockaddr_in *)addr)->sin_port); } bool address_lookup(_addr *res, const char *name, int port) { struct hostent *ent; if (strchr(name, ':')) { /* try ipv6 */ getaddress(res, name, port); return true; } ent = gethostbyname(name); if (!ent) return false; memset(res, 0, sizeof(_addr)); #ifdef HAVE_SIN_LEN ((sockaddr_in *)res)->sin_len = sizeof(_addr); #endif ((sockaddr_in *)res)->sin_family = ent->h_addrtype; ((sockaddr_in *)res)->sin_port = htons(port); memcpy(&((sockaddr_in *)res)->sin_addr, ent->h_addr, ent->h_length); return true; } bool address_matches(_addr *addr1, _addr *addr2) { if (addr1->s_family != addr2->s_family) return false; if (addr1->s_family == AF_INET) return (memcmp(&((sockaddr_in *)addr1)->sin_addr, &((sockaddr_in *)addr2)->sin_addr, 4) == 0); else if (addr1->s_family == AF_INET6) return (memcmp(&((sockaddr_in6 *)addr1)->sin6_addr, &((sockaddr_in6 *)addr2)->sin6_addr, 16) == 0); return false; } bool addrport_matches(_addr *addr1, _addr *addr2) { if (address_matches(addr1, addr2)) { if (addr1->s_family == AF_INET) return ((sockaddr_in *)addr1)->sin_port == ((sockaddr_in *)addr2)->sin_port; else if (addr1->s_family == AF_INET6) return ((sockaddr_in6 *)addr1)->sin6_port == ((sockaddr_in6 *)addr2)->sin6_port; } return false; } bool sock_is_ipv6(_addr *a) { return (a->s_family == AF_INET6); } bool addr_is_ipv6(_addr *a) { return sock_is_ipv6(a); } bool sock_is_ipv4(_addr *a) { return (a->s_family == AF_INET); } bool addr_is_ipv4(_addr *a) { return sock_is_ipv4(a); } unsigned char *get_ipv4_ptr(_addr *a) { return (unsigned char *)&((sockaddr_in *)a)->sin_addr; } bool addr_is_any(_addr *addr) { unsigned char *ptr = get_ipv4_ptr(addr); return (ptr[0] == 0 && ptr[1] == 0 && ptr[2] == 0 && ptr[3] == 0); } bool addr_is_none(_addr *addr) { unsigned char *ptr = get_ipv4_ptr(addr); return (ptr[0] == 255 && ptr[1] == 255 && ptr[2] == 255 && ptr[3] == 255); } unsigned char *get_ipv6_ptr(_addr *a) { return (unsigned char *)&((sockaddr_in6 *)a)->sin6_addr; } stl_string addr_to_string(const _addr *addr, bool include_port) { unsigned char *caddr; char msg[64]; if (addr->s_family == AF_INET) { /* IPv4 */ caddr = (unsigned char *)&((sockaddr_in *)addr)->sin_addr; sprintf(msg, "%d.%d.%d.%d", caddr[0], caddr[1], caddr[2], caddr[3]); if (include_port) sprintf(msg + strlen(msg),"#%d", ntohs(((sockaddr_in *)addr)->sin_port) & 32767); return stl_string(msg); } if (addr->s_family == AF_INET6) { /* IPv6 */ caddr = (unsigned char *)&((sockaddr_in6 *)addr)->sin6_addr; sprintf(msg, "%x:%x:%x:%x:%x:%x:%x:%x", caddr[0]*256+ caddr[1], caddr[2]*256+ caddr[3], caddr[4]*256+ caddr[5], caddr[6]*256+ caddr[7], caddr[8]*256+ caddr[9], caddr[10]*256+ caddr[11], caddr[12]*256+ caddr[13], caddr[14]*256+ caddr[15]); if (include_port) sprintf(msg + strlen(msg), "#%d",ntohs(((sockaddr_in6 *)addr)->sin6_port) & 32767); return stl_string(msg); } sprintf(msg, "", addr->s_family); return stl_string(msg); } smallset_t::smallset_t() { nitems = 0; items = NULL; } smallset_t::~smallset_t() { destroy(); } void smallset_t::init(int size) { if (nitems) destroy(); nitems = size; items = (pollfd *)malloc(size * sizeof(pollfd)); } void smallset_t::set(int ix, int socket) { items[ix].fd = socket; } void smallset_t::destroy() { free(items); items = NULL; nitems = 0; } void smallset_t::check() { wait(0); } void smallset_t::runpoll(int msecs) { int ret; while (1) { ret = poll(items, nitems, (msecs >= 1000) ? 1000 : msecs); if (ret < 0 && errno != EINTR) { throw PException(true, "Error during poll: %d->%d", ret, errno); } if (ret > 0) return; if (posclient_quitflag) return; if (msecs <= 1000) return; msecs -= 1000; // if (msecs == 0) return; } } void smallset_t::wait(int msecs) { int x; if (msecs < 0) msecs = 0; for (x = 0; x < nitems; x++) { items[x].events = POLLIN; items[x].revents = 0; } runpoll(msecs); } void smallset_t::waitwrite(int msecs) { int x; if (msecs < 0) msecs = 0; for (x = 0; x < nitems; x++) { items[x].events = POLLOUT; items[x].revents = 0; } runpoll(msecs); } bool smallset_t::canwrite(int ix) { return (items[ix].revents & POLLOUT); } bool smallset_t::isdata(int ix) { return (items[ix].revents & POLLIN); } bool smallset_t::iserror(int ix) { return (items[ix].revents & POLLERR); } bool smallset_t::ishup(int ix) { return (items[ix].revents & POLLHUP); } int getprotocolbyname(const char *name) { struct protoent *protocol; try { int t = txt_to_int(name); return t; } catch (PException p) { } if ((protocol = getprotobyname(name)) == NULL) throw PException(true, "Unknown protocol %s", name); return protocol->p_proto; } int getserviceportbyname(const char *name) { struct servent *service; try { int t = txt_to_int(name); return t; } catch (PException p) { } if ((service = getservbyname(name, NULL)) == NULL) throw PException(true, "Unknown service %s", name); return ntohs(service->s_port); } dibbler-1.0.1/poslib/resolver.cpp0000644000175000017500000002131512277722750013707 00000000000000/* Posadis - A DNS Server Dns Resolver API Copyright (C) 2002 Meilof Veeningen 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., 675 Mass Ave, Cambridge, MA 02139, USA. */ #include "dibbler-config.h" #include "socket.h" #include "exception.h" #include "random.h" #include "resolver.h" #include "postime.h" #include #ifndef _WIN32 #include #include #endif WaitAnswerData::WaitAnswerData(u_int16 _r_id, _addr &_from) { r_id = _r_id; from = _from; } pos_resolver::pos_resolver() { /* default values */ n_udp_tries = 1; udp_tries = (int *)malloc(3 * sizeof(int)); udp_tries[0] = 1000; udp_tries[1] = 3000; // ignored for now udp_tries[2] = 6000; // ignored for now tcp_timeout = 1000; } pos_resolver::~pos_resolver() { free(udp_tries); } /* tcp queries */ int pos_resolver::tcpconnect(_addr *res) { return tcpopen(res); } void pos_resolver::tcpdisconnect(int sockid) { tcpclose(sockid); } void pos_resolver::tcpquery(DnsMessage *q, DnsMessage*& a, int sockid) { q->ID = posrandom(); tcpsendmessage(q, sockid); if (!a) a = q->initialize_answer (); try { tcpwaitanswer(a, sockid); } catch (PException p) { if (a) delete a; a = NULL; throw p; } if (a->ID != q->ID) { delete a; a = NULL; throw PException("Answer ID does not match question ID!"); } } void pos_resolver::tcpsendmessage(DnsMessage *msg, int sockid) { unsigned char len[2]; message_buff buff = msg->compile(TCP_MSG_SIZE); if (buff.len > 65536) return; len[0] = buff.len / 256; len[1] = buff.len; tcpsendall(sockid, (char*)len, 2, tcp_timeout / 4); tcpsendall(sockid, (char*)buff.msg, buff.len, tcp_timeout / 4); } void pos_resolver::tcpwaitanswer(DnsMessage*& ans, int sockid) { unsigned char len_b[2]; unsigned char *msg = NULL; int len; postime_t end = getcurtime() + tcp_timeout; try { tcpreadall(sockid, (char*)len_b, 2, end.after(getcurtime())); len = len_b[0] * 256 + len_b[1]; msg = new unsigned char[len]; tcpreadall(sockid, (char*)msg, len, end.after(getcurtime())); ans = new DnsMessage(); ans->read_from_data(msg, len); } catch(PException p) { if (msg) { delete [] msg; msg = NULL; } if (ans) { delete ans; ans = NULL; } throw p; } if (msg) { delete [] msg; msg = NULL; } } /* stand-alone client resolver */ pos_cliresolver::pos_cliresolver() : pos_resolver(), is_tcp(false) { sockid = -1; quit_flag = false; #ifndef _WIN32 if (pipe(clipipes) != 0) { throw PException("Failed to create pipe."); } #endif } pos_cliresolver::~pos_cliresolver() { #ifndef _WIN32 close(clipipes[0]); close(clipipes[1]); #endif } void pos_cliresolver::stop() { quit_flag = true; if (sockid > 0) { #ifdef _WIN32 if (is_tcp) tcpclose(sockid); else udpclose(sockid); sockid = -1; #else if (write(clipipes[1], "x", 1) == -1) { throw PException("Pipe write failed."); } #endif } } void pos_cliresolver::clrstop() { quit_flag = false; #ifndef _WIN32 char buff; smallset_t set; set.init(1); set.set(0, clipipes[0]); set.check(); while (set.isdata(0)) { if (read(clipipes[0], &buff, 1) == -1) { throw PException("Client pipe read failed"); } set.check(); } #endif } void pos_cliresolver::query(DnsMessage *q, DnsMessage*& a, _addr *server, int flags) { stl_slist(_addr) servers; servers.push_front(*server); query(q, a, servers, flags); } _addr pos_cliresolver::query(DnsMessage *q, DnsMessage*& a, stl_slist(_addr) &servers, int flags) { int x = -1; stl_slist(_addr)::iterator server, sbegin; stl_slist(WaitAnswerData) waitdata; stl_slist(WaitAnswerData)::iterator it; int ipv4sock = 0; int ipv6sock = 0; unsigned char addr[] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}; _addr tmp; clrstop(); if (servers.empty()) throw PException("Empty servers list for query"); int z = posrandom() % servers.size(); sbegin = servers.begin(); while (z) { z--; ++sbegin; } while (++x < n_udp_tries) { server = sbegin; do { try { /* register and assign a new query ID */ if (!q->ID) q->ID = posrandom(); if (sock_is_ipv6(&*server)) { if (!ipv6sock) { getaddress_ip6(&tmp, addr, 0); ipv6sock = udpcreateserver(&tmp); } sockid = ipv6sock; } else if (sock_is_ipv4(&*server)) { if (!ipv4sock) { getaddress_ip4(&tmp, addr, 0); ipv4sock = udpcreateserver(&tmp); } sockid = ipv4sock; } else throw PException("Unknown address family"); sendmessage(q, &*server, sockid); waitdata.push_front(WaitAnswerData(q->ID, *server)); if (a) delete a; a = q->initialize_answer (); if (waitanswer(a, waitdata, udp_tries[x], it, sockid)) { /* answer received */ if (a->TC && flags == Q_DFL) { delete a; a = q->initialize_answer (); /* retry using TCP */ sockid = 0; try { sockid = tcpconnect(&it->from); tcpquery(q, a, sockid); } catch (PException p) { tcpdisconnect(sockid); throw PException("Failed to retry using TCP: ", p); } tcpdisconnect(sockid); } else if (a->RCODE == RCODE_SRVFAIL || a->RCODE == RCODE_REFUSED || a->RCODE == RCODE_NOTIMP) { stl_slist(_addr)::iterator tmpit = server; ++tmpit; if (tmpit == servers.end()) tmpit = servers.begin(); if (tmpit != sbegin) throw PException("Answer has error RCODE"); } if (ipv6sock) udpclose(ipv6sock); ipv6sock = 0; if (ipv4sock) udpclose(ipv4sock); ipv4sock = 0; return it->from; } else if (quit_flag) throw PException("Interrupted"); } catch(PException p) { if (a) delete a; a = NULL; if (ipv6sock) udpclose(ipv6sock); ipv6sock = 0; if (ipv4sock) udpclose(ipv4sock); ipv4sock = 0; stl_slist(_addr)::iterator s2 = server; ++s2; if (s2 == servers.end()) s2 = servers.begin(); if (s2 == sbegin) throw PException("Resolving failed: ", p); } ++server; if (server == servers.end()) server = servers.begin(); } while (server != sbegin); } if (ipv6sock) udpclose(ipv6sock); ipv6sock = 0; if (ipv4sock) udpclose(ipv4sock); ipv4sock = 0; throw PException("No server could be reached!"); } void pos_cliresolver::sendmessage(DnsMessage *msg, _addr *res, int sockid) { message_buff buff = msg->compile(UDP_MSG_SIZE); udpsend(sockid, (char*)buff.msg, buff.len, res); } bool pos_cliresolver::waitanswer(DnsMessage*& ans, stl_slist(WaitAnswerData)& wait, int timeout, stl_slist(WaitAnswerData)::iterator& wit, int sockid) { /* client implementation */ _addr src; smallset_t set; postime_t end = getcurtime() + timeout; while (1) { #ifdef _WIN32 set.init(1); set.set(0, sockid); #else set.init(2); set.set(0, sockid); set.set(1, clipipes[0]); #endif set.wait(end.after(getcurtime())); #ifndef _WIN32 if (set.isdata(1)) { char data; if (read(clipipes[0], &data, 1) == -1) { throw PException("Socket read failed"); } } #endif if (!set.iserror(0) && !set.ishup(0) && set.isdata(0)) { unsigned char msg[UDP_MSG_SIZE]; int len = udpread(sockid, (char*)msg, sizeof(msg), &src); wit = wait.begin(); while (wit != wait.end()) { if (address_matches(&wit->from, &src)) { try { ans->read_from_data(msg, len); } catch (PException p) { if (len >= 12 && (msg[2]&2)) { /* message was truncated */ delete ans; ans = new DnsMessage(); ans->TC = true; return true; } throw p; } return true; } wit++; } /* the answer was not from someone we wanted */ throw PException("Got answer from unexpected server!"); } else return false; } // return false; } dibbler-1.0.1/poslib/tests/0000775000175000017500000000000012561700417012554 500000000000000dibbler-1.0.1/poslib/tests/run_tests.cc0000644000175000017500000000031712277722750015040 00000000000000 #define STDC_HEADERS 1 #include #include int main(int argc, char* argv[]) { testing::InitGoogleTest(&argc, argv); int status = RUN_ALL_TESTS(); return status; } dibbler-1.0.1/poslib/tests/Makefile.am0000644000175000017500000000132112277722750014533 00000000000000AM_CPPFLAGS = -I$(top_srcdir) AM_CPPFLAGS += -I$(top_srcdir)/Misc AM_CPPFLAGS += -I$(top_srcdir)/poslib AM_CPPFLAGS += -I$(top_srcdir)/nettle # This is to workaround long long in gtest.h AM_CPPFLAGS += $(GTEST_INCLUDES) -Wno-long-long -Wno-variadic-macros TESTS = if HAVE_GTEST TESTS += tsig_tests tsig_tests_SOURCES = run_tests.cc tsig_tests_SOURCES += tsig_unittest.cc tsig_tests_LDFLAGS = $(AM_LDFLAGS) $(GTEST_LDFLAGS) tsig_tests_LDADD = $(GTEST_LDADD) tsig_tests_LDADD += $(top_builddir)/Misc/libMisc.a tsig_tests_LDADD += $(top_builddir)/poslib/libPoslib.a tsig_tests_LDADD += $(top_builddir)/nettle/libNettle.a tsig_tests_LDADD += $(top_builddir)/tests/utils/libTestUtils.a endif noinst_PROGRAMS = $(TESTS) dibbler-1.0.1/poslib/tests/tsig_unittest.cc0000644000175000017500000000674512277722750015732 00000000000000 #include #include "poslib.h" #include "tests/utils/poslib_utils.h" using namespace std; using namespace test; class TSIGTest : public ::testing::Test { public: TSIGTest() : Hostname_("foo"), Domain_("example.org"), TTL_("2h"/* DNSUPDATE_DEFAULT_TTL */), Msg_(NULL), Answer_(NULL) { Msg_ = new DnsMessage(); Msg_->OPCODE = OPCODE_UPDATE; } void addAAAA(const string& ip, const string& host, const string& zone) { domainname domain(zone.c_str()); ASSERT_TRUE(Msg_); DnsRR rr; rr.NAME = domainname(Hostname_.c_str(), domain ); rr.TYPE = qtype_getcode("AAAA", false); rr.TTL = txt_to_int(TTL_.c_str()); string data = rr_fromstring(rr.TYPE, ip.c_str(), domain); rr.RDLENGTH = data.size(); rr.RDATA = (unsigned char*)memdup(data.c_str(), rr.RDLENGTH); Msg_->authority.push_back(rr); } void msgStoreSelf() { msgStoreSelf(Msg_); } void msgStoreSelf(DnsMessage * msg) { Buffer_ = msg->compile(UDP_MSG_SIZE); } #if 0 void hexToBin(const std::string& hex, message_buff &dst) { size_t len = hex.length()/2; unsigned char * bin = new unsigned char[len]; for (unsigned int i = 0; i < 2*len; i+=2) { if (!isxdigit(hex[i]) || !isxdigit(hex[i+1])) { throw ("Invalid character "); } bin[i/2] = (hex[i]-'0')*(isdigit(hex[i])>0) + (tolower(hex[i])-'a' + 10)*(isalpha(hex[i])>0); bin[i/2] <<= 4; bin[i/2] += (hex[i+1]-'0')*(isdigit(hex[i+1])>0) + (tolower(hex[i+1])-'a' + 10)*(isalpha(hex[i+1])>0); } dst.msg = bin; dst.len = len; dst.is_static = false; } bool cmpBuffers(const message_buff& a, const message_buff&b) { if (a.len != b.len) return false; return (!memcmp(a.msg, b.msg, a.len)); } #endif void msgSend(const std::string& srvAddr, DnsMessage * msg) { _addr server; memset(&server, 0, sizeof(server)); #ifndef WIN32 // LINUX, BSD server.ss_family = AF_INET6; #else // WINDOWS server.sa_family = AF_INET6; #endif txt_to_addr(&server, srvAddr.c_str()); pos_cliresolver res; res.udp_tries[0] = 1000; // 1000ms res.n_udp_tries = 1; // just one timeout // Answer_ is null here, but response will be set there res.query(Msg_, Answer_, &server, Q_NOTCP); EXPECT_TRUE(Answer_); if (Answer_ && Answer_->RCODE != RCODE_NOERROR) { throw PException((char*)str_rcode(Answer_->RCODE).c_str()); } } string Hostname_; // = "foo"; string Domain_; // = "example.org"; string TTL_; // = string(DNSUPDATE_DEFAULT_TTL); DnsMessage * Msg_; DnsMessage * Answer_; message_buff Buffer_; }; TEST_F(TSIGTest, AAAA_update) { Msg_->questions.push_back(DnsQuestion(domainname(Domain_.c_str()), DNS_TYPE_SOA, CLASS_IN)); Msg_->ID = 257; addAAAA("2000::1", Hostname_, Domain_); msgStoreSelf(Msg_); // stores in Buffer_ message_buff bin; // exported from wireshark (RMB on DNS(query) -> Copy -> Bytes -> Hex Stream) hexToBin("010128000001000000010000076578616d706c65036f7267000006000103666f6fc00c001c000100001c20001020000000000000000000000000000001", bin); EXPECT_TRUE(cmpBuffers(Buffer_, bin)); // uncomment this to see what was actually built // msgSend("2001:db8:1::1", Msg_); } dibbler-1.0.1/poslib/tests/Makefile.in0000664000175000017500000010016212561652536014551 00000000000000# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ TESTS = $(am__EXEEXT_1) @HAVE_GTEST_TRUE@am__append_1 = tsig_tests noinst_PROGRAMS = $(am__EXEEXT_2) subdir = poslib/tests DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/depcomp $(top_srcdir)/test-driver ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/libtool.m4 \ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/include/dibbler-config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = @HAVE_GTEST_TRUE@am__EXEEXT_1 = tsig_tests$(EXEEXT) am__EXEEXT_2 = $(am__EXEEXT_1) PROGRAMS = $(noinst_PROGRAMS) am__tsig_tests_SOURCES_DIST = run_tests.cc tsig_unittest.cc @HAVE_GTEST_TRUE@am_tsig_tests_OBJECTS = run_tests.$(OBJEXT) \ @HAVE_GTEST_TRUE@ tsig_unittest.$(OBJEXT) tsig_tests_OBJECTS = $(am_tsig_tests_OBJECTS) am__DEPENDENCIES_1 = @HAVE_GTEST_TRUE@tsig_tests_DEPENDENCIES = $(am__DEPENDENCIES_1) \ @HAVE_GTEST_TRUE@ $(top_builddir)/Misc/libMisc.a \ @HAVE_GTEST_TRUE@ $(top_builddir)/poslib/libPoslib.a \ @HAVE_GTEST_TRUE@ $(top_builddir)/nettle/libNettle.a \ @HAVE_GTEST_TRUE@ $(top_builddir)/tests/utils/libTestUtils.a AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = tsig_tests_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \ $(CXXFLAGS) $(tsig_tests_LDFLAGS) $(LDFLAGS) -o $@ AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)/include depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) LTCXXCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CXXFLAGS) $(CXXFLAGS) AM_V_CXX = $(am__v_CXX_@AM_V@) am__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@) am__v_CXX_0 = @echo " CXX " $@; am__v_CXX_1 = CXXLD = $(CXX) CXXLINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \ $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CXXLD = $(am__v_CXXLD_@AM_V@) am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@) am__v_CXXLD_0 = @echo " CXXLD " $@; am__v_CXXLD_1 = SOURCES = $(tsig_tests_SOURCES) DIST_SOURCES = $(am__tsig_tests_SOURCES_DIST) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags am__tty_colors_dummy = \ mgn= red= grn= lgn= blu= brg= std=; \ am__color_tests=no am__tty_colors = { \ $(am__tty_colors_dummy); \ if test "X$(AM_COLOR_TESTS)" = Xno; then \ am__color_tests=no; \ elif test "X$(AM_COLOR_TESTS)" = Xalways; then \ am__color_tests=yes; \ elif test "X$$TERM" != Xdumb && { test -t 1; } 2>/dev/null; then \ am__color_tests=yes; \ fi; \ if test $$am__color_tests = yes; then \ red=''; \ grn=''; \ lgn=''; \ blu=''; \ mgn=''; \ brg=''; \ std=''; \ fi; \ } am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__recheck_rx = ^[ ]*:recheck:[ ]* am__global_test_result_rx = ^[ ]*:global-test-result:[ ]* am__copy_in_global_log_rx = ^[ ]*:copy-in-global-log:[ ]* # A command that, given a newline-separated list of test names on the # standard input, print the name of the tests that are to be re-run # upon "make recheck". am__list_recheck_tests = $(AWK) '{ \ recheck = 1; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ { \ if ((getline line2 < ($$0 ".log")) < 0) \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[nN][Oo]/) \ { \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[yY][eE][sS]/) \ { \ break; \ } \ }; \ if (recheck) \ print $$0; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # A command that, given a newline-separated list of test names on the # standard input, create the global log from their .trs and .log files. am__create_global_log = $(AWK) ' \ function fatal(msg) \ { \ print "fatal: making $@: " msg | "cat >&2"; \ exit 1; \ } \ function rst_section(header) \ { \ print header; \ len = length(header); \ for (i = 1; i <= len; i = i + 1) \ printf "="; \ printf "\n\n"; \ } \ { \ copy_in_global_log = 1; \ global_test_result = "RUN"; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".trs"); \ if (line ~ /$(am__global_test_result_rx)/) \ { \ sub("$(am__global_test_result_rx)", "", line); \ sub("[ ]*$$", "", line); \ global_test_result = line; \ } \ else if (line ~ /$(am__copy_in_global_log_rx)[nN][oO]/) \ copy_in_global_log = 0; \ }; \ if (copy_in_global_log) \ { \ rst_section(global_test_result ": " $$0); \ while ((rc = (getline line < ($$0 ".log"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".log"); \ print line; \ }; \ printf "\n"; \ }; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # Restructured Text title. am__rst_title = { sed 's/.*/ & /;h;s/./=/g;p;x;s/ *$$//;p;g' && echo; } # Solaris 10 'make', and several other traditional 'make' implementations, # pass "-e" to $(SHELL), and POSIX 2008 even requires this. Work around it # by disabling -e (using the XSI extension "set +e") if it's set. am__sh_e_setup = case $$- in *e*) set +e;; esac # Default flags passed to test drivers. am__common_driver_flags = \ --color-tests "$$am__color_tests" \ --enable-hard-errors "$$am__enable_hard_errors" \ --expect-failure "$$am__expect_failure" # To be inserted before the command running the test. Creates the # directory for the log if needed. Stores in $dir the directory # containing $f, in $tst the test, in $log the log. Executes the # developer- defined test setup AM_TESTS_ENVIRONMENT (if any), and # passes TESTS_ENVIRONMENT. Set up options for the wrapper that # will run the test scripts (or their associated LOG_COMPILER, if # thy have one). am__check_pre = \ $(am__sh_e_setup); \ $(am__vpath_adj_setup) $(am__vpath_adj) \ $(am__tty_colors); \ srcdir=$(srcdir); export srcdir; \ case "$@" in \ */*) am__odir=`echo "./$@" | sed 's|/[^/]*$$||'`;; \ *) am__odir=.;; \ esac; \ test "x$$am__odir" = x"." || test -d "$$am__odir" \ || $(MKDIR_P) "$$am__odir" || exit $$?; \ if test -f "./$$f"; then dir=./; \ elif test -f "$$f"; then dir=; \ else dir="$(srcdir)/"; fi; \ tst=$$dir$$f; log='$@'; \ if test -n '$(DISABLE_HARD_ERRORS)'; then \ am__enable_hard_errors=no; \ else \ am__enable_hard_errors=yes; \ fi; \ case " $(XFAIL_TESTS) " in \ *[\ \ ]$$f[\ \ ]* | *[\ \ ]$$dir$$f[\ \ ]*) \ am__expect_failure=yes;; \ *) \ am__expect_failure=no;; \ esac; \ $(AM_TESTS_ENVIRONMENT) $(TESTS_ENVIRONMENT) # A shell command to get the names of the tests scripts with any registered # extension removed (i.e., equivalently, the names of the test logs, with # the '.log' extension removed). The result is saved in the shell variable # '$bases'. This honors runtime overriding of TESTS and TEST_LOGS. Sadly, # we cannot use something simpler, involving e.g., "$(TEST_LOGS:.log=)", # since that might cause problem with VPATH rewrites for suffix-less tests. # See also 'test-harness-vpath-rewrite.sh' and 'test-trs-basic.sh'. am__set_TESTS_bases = \ bases='$(TEST_LOGS)'; \ bases=`for i in $$bases; do echo $$i; done | sed 's/\.log$$//'`; \ bases=`echo $$bases` RECHECK_LOGS = $(TEST_LOGS) AM_RECURSIVE_TARGETS = check recheck TEST_SUITE_LOG = test-suite.log TEST_EXTENSIONS = @EXEEXT@ .test LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver LOG_COMPILE = $(LOG_COMPILER) $(AM_LOG_FLAGS) $(LOG_FLAGS) am__set_b = \ case '$@' in \ */*) \ case '$*' in \ */*) b='$*';; \ *) b=`echo '$@' | sed 's/\.log$$//'`; \ esac;; \ *) \ b='$*';; \ esac am__test_logs1 = $(TESTS:=.log) am__test_logs2 = $(am__test_logs1:@EXEEXT@.log=.log) TEST_LOGS = $(am__test_logs2:.test.log=.log) TEST_LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver TEST_LOG_COMPILE = $(TEST_LOG_COMPILER) $(AM_TEST_LOG_FLAGS) \ $(TEST_LOG_FLAGS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALLOCA = @ALLOCA@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ ARCH = @ARCH@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ EXTRA_DIST_SUBDIRS = @EXTRA_DIST_SUBDIRS@ FGREP = @FGREP@ GREP = @GREP@ GTEST_INCLUDES = @GTEST_INCLUDES@ GTEST_LDADD = @GTEST_LDADD@ GTEST_LDFLAGS = @GTEST_LDFLAGS@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LINKPRINT = @LINKPRINT@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PORT_CFLAGS = @PORT_CFLAGS@ PORT_LDFLAGS = @PORT_LDFLAGS@ PORT_SUBDIR = @PORT_SUBDIR@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ subdirs = @subdirs@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ # This is to workaround long long in gtest.h AM_CPPFLAGS = -I$(top_srcdir) -I$(top_srcdir)/Misc \ -I$(top_srcdir)/poslib -I$(top_srcdir)/nettle \ $(GTEST_INCLUDES) -Wno-long-long -Wno-variadic-macros @HAVE_GTEST_TRUE@tsig_tests_SOURCES = run_tests.cc tsig_unittest.cc @HAVE_GTEST_TRUE@tsig_tests_LDFLAGS = $(AM_LDFLAGS) $(GTEST_LDFLAGS) @HAVE_GTEST_TRUE@tsig_tests_LDADD = $(GTEST_LDADD) \ @HAVE_GTEST_TRUE@ $(top_builddir)/Misc/libMisc.a \ @HAVE_GTEST_TRUE@ $(top_builddir)/poslib/libPoslib.a \ @HAVE_GTEST_TRUE@ $(top_builddir)/nettle/libNettle.a \ @HAVE_GTEST_TRUE@ $(top_builddir)/tests/utils/libTestUtils.a all: all-am .SUFFIXES: .SUFFIXES: .cc .lo .log .o .obj .test .test$(EXEEXT) .trs $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign poslib/tests/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign poslib/tests/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstPROGRAMS: @list='$(noinst_PROGRAMS)'; test -n "$$list" || exit 0; \ echo " rm -f" $$list; \ rm -f $$list || exit $$?; \ test -n "$(EXEEXT)" || exit 0; \ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ echo " rm -f" $$list; \ rm -f $$list tsig_tests$(EXEEXT): $(tsig_tests_OBJECTS) $(tsig_tests_DEPENDENCIES) $(EXTRA_tsig_tests_DEPENDENCIES) @rm -f tsig_tests$(EXEEXT) $(AM_V_CXXLD)$(tsig_tests_LINK) $(tsig_tests_OBJECTS) $(tsig_tests_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/run_tests.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tsig_unittest.Po@am__quote@ .cc.o: @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $< .cc.obj: @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .cc.lo: @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LTCXXCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags # Recover from deleted '.trs' file; this should ensure that # "rm -f foo.log; make foo.trs" re-run 'foo.test', and re-create # both 'foo.log' and 'foo.trs'. Break the recipe in two subshells # to avoid problems with "make -n". .log.trs: rm -f $< $@ $(MAKE) $(AM_MAKEFLAGS) $< # Leading 'am--fnord' is there to ensure the list of targets does not # expand to empty, as could happen e.g. with make check TESTS=''. am--fnord $(TEST_LOGS) $(TEST_LOGS:.log=.trs): $(am__force_recheck) am--force-recheck: @: $(TEST_SUITE_LOG): $(TEST_LOGS) @$(am__set_TESTS_bases); \ am__f_ok () { test -f "$$1" && test -r "$$1"; }; \ redo_bases=`for i in $$bases; do \ am__f_ok $$i.trs && am__f_ok $$i.log || echo $$i; \ done`; \ if test -n "$$redo_bases"; then \ redo_logs=`for i in $$redo_bases; do echo $$i.log; done`; \ redo_results=`for i in $$redo_bases; do echo $$i.trs; done`; \ if $(am__make_dryrun); then :; else \ rm -f $$redo_logs && rm -f $$redo_results || exit 1; \ fi; \ fi; \ if test -n "$$am__remaking_logs"; then \ echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \ "recursion detected" >&2; \ else \ am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \ fi; \ if $(am__make_dryrun); then :; else \ st=0; \ errmsg="fatal: making $(TEST_SUITE_LOG): failed to create"; \ for i in $$redo_bases; do \ test -f $$i.trs && test -r $$i.trs \ || { echo "$$errmsg $$i.trs" >&2; st=1; }; \ test -f $$i.log && test -r $$i.log \ || { echo "$$errmsg $$i.log" >&2; st=1; }; \ done; \ test $$st -eq 0 || exit 1; \ fi @$(am__sh_e_setup); $(am__tty_colors); $(am__set_TESTS_bases); \ ws='[ ]'; \ results=`for b in $$bases; do echo $$b.trs; done`; \ test -n "$$results" || results=/dev/null; \ all=` grep "^$$ws*:test-result:" $$results | wc -l`; \ pass=` grep "^$$ws*:test-result:$$ws*PASS" $$results | wc -l`; \ fail=` grep "^$$ws*:test-result:$$ws*FAIL" $$results | wc -l`; \ skip=` grep "^$$ws*:test-result:$$ws*SKIP" $$results | wc -l`; \ xfail=`grep "^$$ws*:test-result:$$ws*XFAIL" $$results | wc -l`; \ xpass=`grep "^$$ws*:test-result:$$ws*XPASS" $$results | wc -l`; \ error=`grep "^$$ws*:test-result:$$ws*ERROR" $$results | wc -l`; \ if test `expr $$fail + $$xpass + $$error` -eq 0; then \ success=true; \ else \ success=false; \ fi; \ br='==================='; br=$$br$$br$$br$$br; \ result_count () \ { \ if test x"$$1" = x"--maybe-color"; then \ maybe_colorize=yes; \ elif test x"$$1" = x"--no-color"; then \ maybe_colorize=no; \ else \ echo "$@: invalid 'result_count' usage" >&2; exit 4; \ fi; \ shift; \ desc=$$1 count=$$2; \ if test $$maybe_colorize = yes && test $$count -gt 0; then \ color_start=$$3 color_end=$$std; \ else \ color_start= color_end=; \ fi; \ echo "$${color_start}# $$desc $$count$${color_end}"; \ }; \ create_testsuite_report () \ { \ result_count $$1 "TOTAL:" $$all "$$brg"; \ result_count $$1 "PASS: " $$pass "$$grn"; \ result_count $$1 "SKIP: " $$skip "$$blu"; \ result_count $$1 "XFAIL:" $$xfail "$$lgn"; \ result_count $$1 "FAIL: " $$fail "$$red"; \ result_count $$1 "XPASS:" $$xpass "$$red"; \ result_count $$1 "ERROR:" $$error "$$mgn"; \ }; \ { \ echo "$(PACKAGE_STRING): $(subdir)/$(TEST_SUITE_LOG)" | \ $(am__rst_title); \ create_testsuite_report --no-color; \ echo; \ echo ".. contents:: :depth: 2"; \ echo; \ for b in $$bases; do echo $$b; done \ | $(am__create_global_log); \ } >$(TEST_SUITE_LOG).tmp || exit 1; \ mv $(TEST_SUITE_LOG).tmp $(TEST_SUITE_LOG); \ if $$success; then \ col="$$grn"; \ else \ col="$$red"; \ test x"$$VERBOSE" = x || cat $(TEST_SUITE_LOG); \ fi; \ echo "$${col}$$br$${std}"; \ echo "$${col}Testsuite summary for $(PACKAGE_STRING)$${std}"; \ echo "$${col}$$br$${std}"; \ create_testsuite_report --maybe-color; \ echo "$$col$$br$$std"; \ if $$success; then :; else \ echo "$${col}See $(subdir)/$(TEST_SUITE_LOG)$${std}"; \ if test -n "$(PACKAGE_BUGREPORT)"; then \ echo "$${col}Please report to $(PACKAGE_BUGREPORT)$${std}"; \ fi; \ echo "$$col$$br$$std"; \ fi; \ $$success || exit 1 check-TESTS: @list='$(RECHECK_LOGS)'; test -z "$$list" || rm -f $$list @list='$(RECHECK_LOGS:.log=.trs)'; test -z "$$list" || rm -f $$list @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ log_list=`for i in $$bases; do echo $$i.log; done`; \ trs_list=`for i in $$bases; do echo $$i.trs; done`; \ log_list=`echo $$log_list`; trs_list=`echo $$trs_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) TEST_LOGS="$$log_list"; \ exit $$?; recheck: all @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ bases=`for i in $$bases; do echo $$i; done \ | $(am__list_recheck_tests)` || exit 1; \ log_list=`for i in $$bases; do echo $$i.log; done`; \ log_list=`echo $$log_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) \ am__force_recheck=am--force-recheck \ TEST_LOGS="$$log_list"; \ exit $$? tsig_tests.log: tsig_tests$(EXEEXT) @p='tsig_tests$(EXEEXT)'; \ b='tsig_tests'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) .test.log: @p='$<'; \ $(am__set_b); \ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) @am__EXEEXT_TRUE@.test$(EXEEXT).log: @am__EXEEXT_TRUE@ @p='$<'; \ @am__EXEEXT_TRUE@ $(am__set_b); \ @am__EXEEXT_TRUE@ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ @am__EXEEXT_TRUE@ --log-file $$b.log --trs-file $$b.trs \ @am__EXEEXT_TRUE@ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ @am__EXEEXT_TRUE@ "$$tst" $(AM_TESTS_FD_REDIRECT) distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am $(MAKE) $(AM_MAKEFLAGS) check-TESTS check: check-am all-am: Makefile $(PROGRAMS) installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: -test -z "$(TEST_LOGS)" || rm -f $(TEST_LOGS) -test -z "$(TEST_LOGS:.log=.trs)" || rm -f $(TEST_LOGS:.log=.trs) -test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool clean-noinstPROGRAMS \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: check-am install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-TESTS check-am clean \ clean-generic clean-libtool clean-noinstPROGRAMS cscopelist-am \ ctags ctags-am distclean distclean-compile distclean-generic \ distclean-libtool distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-dvi install-dvi-am install-exec \ install-exec-am install-html install-html-am install-info \ install-info-am install-man install-pdf install-pdf-am \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ recheck tags tags-am uninstall uninstall-am # 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: dibbler-1.0.1/poslib/lexfn.cpp0000664000175000017500000005361012560471634013164 00000000000000/* Posadis - A DNS Server Lexical functions Copyright (C) 2002 Meilof Veeningen 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., 675 Mass Ave, Cambridge, MA 02139, USA. */ #include #include "dnsmessage.h" #include "domainfn.h" #include "sysstring.h" #include "rr.h" #include "exception.h" #include "lexfn.h" #include "Portable.h" using namespace std; bool txt_to_bool(const char *buff) { if (strcmpi(buff, "yes") == 0) return true; if (strcmpi(buff, "true") == 0) return true; if (strcmpi(buff, "1") == 0) return true; if (strcmpi(buff, "on") == 0) return true; if (strcmpi(buff, "yo") == 0) return true; if (strcmpi(buff, "absolutely") == 0) return true; if (strcmpi(buff, "y") == 0) return true; if (strcmpi(buff, "j") == 0) return true; /* for dutch people out there ;) */ if (strcmpi(buff, "no") == 0) return false; if (strcmpi(buff, "false") == 0) return false; if (strcmpi(buff, "0") == 0) return false; if (strcmpi(buff, "off") == 0) return false; if (strcmpi(buff, "nope") == 0) return false; if (strcmpi(buff, "never") == 0) return false; if (strcmpi(buff, "n") == 0) return false; throw PException(true, "Unknown boolean value %s", buff); } /* converts a buffer to a long numeric value, with postfix (e.g. 68K->68*1024) support */ int txt_to_int_internal(const char *_buff, bool support_negative) { char *buff = (char *)_buff; int val = 0, tmpval = 0; bool neg = false; bool have_digit = false; if (*buff == '-') { if (!support_negative) throw PException(true, "Negative number not supported: %s", _buff); neg = true; buff++; } while (1) { if (*buff >= '0' && *buff <= '9') { tmpval *= 10; tmpval += *buff - '0'; have_digit = true; } else { if (*buff == '\0') { val += tmpval; if (!have_digit) throw PException(true, "Incorrect numeric value %s", _buff); return neg ? -val : val; } if (*buff == 'K') tmpval *= 1024; else if (*buff == 'M') tmpval *= 1048576; else if (*buff == 'G') tmpval *= 1073741824; else if (*buff == 's'); else if (*buff == 'm') tmpval *= 60; else if (*buff == 'h') tmpval *= 3600; else if (*buff == 'd') tmpval *= 86400; else if (*buff == 'w') tmpval *= 604800; else if (*buff == 'y') tmpval *= 31536000; else throw PException(true, "Incorrect numeric value %s", _buff); val += tmpval; tmpval = 0; } buff++; } } int txt_to_negint(const char *buff) { return txt_to_int_internal(buff, true); } int txt_to_int(const char *buff) { return txt_to_int_internal(buff, false); } /* converts a buffer to an 32-bit ip number */ int txt_to_ip(unsigned char ip[4], const char *_buff, bool do_portion) { char *buff = (char *)_buff; int p = 0, tmp = 0, node = 0; if (strcmpi(buff, "any") == 0) { ip[0] = 0; ip[1] = 0; ip[2] = 0; ip[3]= 0; return 4; } else if (strcmpi(buff, "local") == 0) { ip[0] = 127; ip[1] = 0; ip[2] = 0; ip[3] = 1; return 4; } else if (strcmpi(buff, "none") == 0) { ip[0] = 255; ip[1] = 255; ip[2] = 255; ip[3] = 255; } ip[0] = 0; ip[1] = 0; ip[2] = 0; ip[3] = 0; while (buff[p] != '\0') { if (isdigit(buff[p])) { node *= 10; node += buff[p] - '0'; if (node > 255) throw PException("IP node value exceeds 255"); } else if (buff[p] == '*') { if (do_portion) { return tmp; } else { return 4; } } else { if (buff[p] == '.') { if (buff[p + 1] == '.') { throw PException("Expecting some value after dot"); } else if (buff[p + 1] == '\0') break; if (tmp >= 3) throw PException("More than three dots in IP number"); ip[tmp++] = (char)node; node = 0; } else throw PException("Unknown character in IP number"); } p++; } ip[tmp++] = (unsigned char)node; if (tmp != 4 && !do_portion) throw PException("Not enough nodes in IP number"); return tmp; } char incr_mask[8] = { 0, 128, 192, 224, 240, 248, 252, 254 }; void txt_to_iprange(unsigned char *iprange, const char *val) { char buff[128]; char *ptr; int x; if (strcmpi(val, "any") == 0) { memset(iprange, 0, 8); return; } if (strcmpi(val, "none") == 0) { memset(iprange, 255, 4); memset(iprange + 4, 0, 4); return; } if ((ptr = strchr((char*)val, '/')) != NULL) { if (strchr(ptr, '.')) { /* complete IP number */ txt_to_ip(iprange, ptr + 1); } else { memset(iprange, 0, 4); x = txt_to_int(ptr + 1); if (x > 128) throw PException("IPv6 mask value too long"); int z; for (z = 0; x >= 8; x -= 8) iprange[z++] = 255; iprange[z] = incr_mask[x]; } if ((ptr - val) >= (signed)sizeof(buff)) throw PException("Ip number too long"); memcpy(buff, val, ptr - val); buff[ptr - val] = '\0'; txt_to_ip(iprange + 4, buff); } else { memset(iprange, 0, 4); for (x = txt_to_ip(iprange + 4, val, true) - 1; x >= 0; x--) iprange[x] = 255; } } bool iprange_matches(const unsigned char *iprange, const unsigned char *ip) { for (int x = 0; x < 4; x++) if ((ip[x] ^ iprange[x+4]) & iprange[x]) return false; return true; } int hextoint(char val) { if (val >= '0' && val <= '9') { return val - '0'; } else if (val >= 'a' && val <= 'f') { return val - 'a' + 10; } else if (val >= 'A' && val <= 'F') { return val - 'A' + 10; } else return -1; } /* converts a buffer to a 128-bit ipv6 number */ int txt_to_ipv6(unsigned char ipv6[16], const char *buff, bool do_portion) { int multigroup_pos = -1; int pos = -1; int node = 0; /* the pair we're working on */ int nodeval = -1; /* node value */ int nodestart = 0; /* start pos of node */ int chval; int x; memset(ipv6, 0, 16); if (strcmpi(buff, ":any") == 0) return 16; if (strcmpi(buff, ":local") == 0) { ipv6[15] = 1; return 16; } while (buff[++pos] != '\0') { if (buff[pos] == '.') { /* an imbedded ipv4 */ if (node + 2 > 8) throw PException("No room for embedded IPv4 in IPv6 address"); try { txt_to_ip(&ipv6[node*2], &buff[nodestart]); } catch(PException p) { throw PException("Error in embedded IPv4 number: ", p); } node++; if (node == 8) break; nodeval = -1; break; } if (buff[pos] == ':') { /* write the previous node */ if (pos) { if (nodeval == -1) throw PException("IPv6 address has empty node value"); ipv6[node*2] = nodeval / 256; ipv6[node*2 + 1] = nodeval; } else { if (buff[pos + 1] != ':') throw PException("IPv6 address should have ::"); node--; } if (buff[pos + 1] == ':') { /* we're having a multigroup indicator here */ multigroup_pos = node + 1; pos++; } node++; if (node > 7) throw PException("IPv6 address has too much nodes"); nodeval = -1; nodestart = pos + 1; } else if (buff[pos] == '*') { return node * 2; } else { chval = hextoint(buff[pos]); if (chval < 0) throw PException("Incorrect hex in IPv6 address"); if (nodeval == -1) nodeval = chval; else nodeval = (nodeval * 16) + chval; if (nodeval > 65535) throw PException("IPv6 node val too large"); } } if (nodeval != -1) { ipv6[node*2] = nodeval / 256; ipv6[node*2 + 1] = nodeval; } else { if (buff[pos - 1] == ':' && buff[pos - 2] != ':') throw PException("Expected :: in IPv6 address"); } if (multigroup_pos != -1) { for (x = 15; x >= 14 - 2 * (node - multigroup_pos); x--) ipv6[x] = ipv6[x - 2 * (7 - node)]; memset(&ipv6[multigroup_pos * 2], 0, 14 - (2*node)); } else { if (node < 7) throw PException("Too less nodes in IPv6 address"); } return 16; } void txt_to_ip6range(unsigned char *iprange, const char *val) { char buff[128]; char *ptr; int x; if (strcmpi(val, "any") == 0) { memset(iprange, 0, 32); return; } if (strcmpi(val, "none") == 0) { memset(iprange, 255, 16); memset(iprange + 16, 0, 16); return; } if ((ptr = (char*)strchr(val, '/')) != NULL) { if (strchr(ptr, ':')) { /* complete IPv6 number */ txt_to_ipv6(iprange, ptr + 1); } else { memset(iprange, 0, 16); x = txt_to_int(ptr + 1); if (x > 128) throw PException("IPv6 mask value too long"); int z; for (z = 0; x >= 8; x -= 8) iprange[z++] = 255; iprange[z] = incr_mask[x]; } if ((ptr - val) >= (signed)sizeof(buff)) throw PException("Ip number too long"); memcpy(buff, val, ptr - val); buff[ptr - val] = '\0'; txt_to_ipv6(iprange + 16, buff); } else { memset(iprange, 0, 16); for (x = txt_to_ipv6(iprange + 16, val, true) - 1; x >= 0; x--) iprange[x] = 255; } } bool ip6range_matches(const unsigned char *iprange, const unsigned char *ip) { for (int x = 0; x < 16; x++) if ((ip[x] ^ iprange[x+16]) & iprange[x]) return false; return true; } #define R_IP4 0 #define R_IP6 1 #define R_NONE 2 #define R_ANY 3 bool in_addrrange_list(stl_list(addrrange) &lst, _addr *a) { stl_list(addrrange)::iterator it = lst.begin(); while (it != lst.end()) { if (addrrange_matches(it->range, a)) return true; ++it; } return false; } #ifdef HAVE_SLIST bool in_addrrange_list(stl_slist(addrrange) &lst, _addr *a) { stl_slist(addrrange)::iterator it = lst.begin(); while (it != lst.end()) { if (addrrange_matches(it->range, a)) return true; ++it; } return false; } #endif #ifdef HAVE_SLIST bool in_addr_list(stl_slist(_addr) &lst, _addr *a, bool match_port) { stl_slist(_addr)::iterator it = lst.begin(); while (it != lst.end()) { if (match_port) { if (addrport_matches(&*it, a)) return true; } else { if (address_matches(&*it, a)) return true; } ++it; } return false; } #endif bool in_addr_list(stl_list(_addr) &lst, _addr *a, bool match_port) { stl_list(_addr)::iterator it = lst.begin(); while (it != lst.end()) { if (match_port) { if (addrport_matches(&*it, a)) return true; } else { if (address_matches(&*it, a)) return true; } ++it; } return false; } void txt_to_addrrange(unsigned char *iprange, const char *val) { if (strcmpi(val, "any") == 0) { iprange[0] = R_ANY; return; } if (strcmpi(val, "none") == 0) { iprange[0] = R_NONE; return; } if (!strchr(val, ':')) { iprange[0] = R_IP4; txt_to_iprange(iprange + 1, val); } else { iprange[0] = R_IP6; txt_to_ip6range(iprange + 1, val); } } bool addrrange_matches(const unsigned char *iprange, _addr *a) { switch (iprange[0]) { case R_NONE: return false; case R_ANY: return true; case R_IP4: return iprange_matches(iprange + 1, get_ipv4_ptr(a)); case R_IP6: return ip6range_matches(iprange + 1, get_ipv6_ptr(a)); } return false; } /* converts an email address to a domain name (may be a or a true email address) */ void txt_to_email(_domain target, const char *src, _cdomain origin) { unsigned char dom[DOM_LEN]; char *cptr; if ((cptr = (char *)strchr(src, '@')) != NULL && !(cptr[0] == '@' && cptr[1] == 0)) { /* contains a '@', so assume it's an email address */ if (src[0] == '@') throw PException("Incorrect email address/domain name: begins with @"); domfromlabel(target, src, cptr - src); txt_to_dname(dom, cptr + 1); domcat(target, dom); } else { /* common domain name */ txt_to_dname(target, src, origin); } } /* converts a textual representation for a domain name to an rfc */ #define hexfromint(hex) (((hex) < 10) ? (hex) + '0' : ((hex) - 10) + 'a') void txt_to_dname(_domain target, const char *src, _cdomain origin) { char *ptr; unsigned char label[DOM_LEN]; unsigned char tmp[16]; char hex; int ttmp, ret; if (src[0] == '@' && src[1] == '\0') { /* nothing but the origin */ if (!origin) target[0] = '\0'; else memcpy(target, origin, domlen((_domain)origin)); return; } target[0] = '\0'; if (src[0] == '.' && src[1] == '\0') return; while (*src) { if (src[0] == '.' && src[1] != '\0') { /* our extension: allow .192.168.* and .dead:beef:* */ if (strchr(src + 1, ':')) { if (domlen(target) + 42 >= DOM_LEN) throw PException("IPv6 domainname doesn't fit"); ret = txt_to_ipv6(tmp, src + 1, true); for (ttmp = ret - 1; ttmp >= 0; ttmp--) { hex = hexfromint(tmp[ttmp] & 15); domfromlabel(target + domlen(target) - 1, &hex, 1); hex = hexfromint(tmp[ttmp] / 16); domfromlabel(target + domlen(target) - 1, &hex, 1); } domcat(target, (_domain) "\3ip6\3int"); return; } else { /* ipv4 */ if (domlen(target) + 14 >= DOM_LEN) throw PException("IPv6 domainname doesn't fit"); ret = txt_to_ip(tmp, src + 1, true); for (ttmp = ret - 1; ttmp >= 0; ttmp--) { sprintf((char*)tmp + 4, "%d", tmp[ttmp]); domfromlabel(target + domlen(target) - 1, (char*)tmp + 4); } domcat(target, (_domain) "\7in-addr\4arpa"); return; } } ptr = (char *)strchr(src, '.'); if (ptr) { if (ptr == src) throw PException("Zero length label"); domfromlabel(label, src, ptr - src); domcat(target, label); src = ptr + 1; } else { /* end of relative domain name */ domfromlabel(label, src); domcat(target, label); if (origin) domcat(target, (_domain)origin); return; } } } /** * \brief convert text to address * * Converts the text pointed to by addr to an _addr address structure. If * the client parameter is set to true, the default IP is \p 127.0.0.1, else * it is \p 0.0.0.0 . Addresses can be given by only an address, only a port, * or a combination separated by a \p \# . Being based on the txt_to_ip and * txt_to_ipv6 functions, this function also supports the literval values * \c any , \c local, \c :any and \c :local . * * \param ret Memory to store result in * \param addr Text describing the address * \param default_port Default port if none is given * \param is_client Influences default address */ void txt_to_addr(_addr *ret, const char *addr, int default_port, bool is_client) { char taddr[128]; char *ptr = strchr((char *)addr, '#'); if (ptr) { if ((unsigned)(ptr - addr) > (unsigned)sizeof(taddr)) throw PException("Address too long"); memcpy(taddr, addr, (unsigned)(ptr - addr)); taddr[ptr-addr] = '\0'; txt_to_addr(ret, taddr, default_port, is_client); addr_setport(ret, txt_to_int(ptr + 1)); } else { try { int x = txt_to_int(addr); if (is_client) getaddress(ret, "127.0.0.1", x); else getaddress(ret, "0.0.0.0", x); } catch (PException p) { getaddress(ret, addr, default_port); } } } u_int32 poslib_degstr(char *&src, char pre, char post) { int deg, min = 0, sec = 0, msec = 0; u_int32 ret; string tmp; deg = txt_to_int(read_entry(src).c_str()); tmp = read_entry(src); if (isdigit(tmp[0])) { min = txt_to_int(tmp.c_str()); tmp = read_entry(src); if (isdigit(tmp[0])) { if (strchr(tmp.c_str(), '.')) { if (sscanf(tmp.c_str(), "%10d.%10d", &sec, &msec) != 2) throw PException(true, "Malformed LOC RR: invalid angle seconds %s", tmp.c_str()); } else sec = txt_to_int(tmp.c_str()); tmp = read_entry(src); } } ret = msec + sec * 1000 + min * 60000 + deg * 3600000; if (toupper(tmp[0]) == post) ret = 2147483648u + ret; else if (toupper(tmp[0]) == pre) ret = 2147483648u - ret; else throw PException(true, "Malformed LOC RR: expected '%c' or '%c', got %s", pre, post, tmp.c_str()); return ret; } unsigned char poslib_loc_precision(const char *str) { int x, y = 0; int n = 0; if (sscanf(str, "%4d.%6dm", &x, &y) < 1) throw PException(true, "Invalid precision: %s", str); x = x*100+y; while (x >= 10) { x/=10; n++; } return (x << 4) + n; } void txt_to_loc(unsigned char *res, char *&src) { stl_string tmp; u_int32 t; int x,y; res[0] = 0; /* version */ /* read longitude, latitude */ t = poslib_degstr(src, 'S', 'N'); memcpy(res + 4, uint32_buff(t), 4); t = poslib_degstr(src, 'W', 'E'); memcpy(res + 8, uint32_buff(t), 4); /* read altitude */ x = y = 0; tmp = read_entry(src); if (sscanf(tmp.c_str(), "%4d.%10dm", &x, &y) <= 0) throw PException("Invalid altitude"); memcpy(res + 12, uint32_buff((x*100+y)+10000000), 4); if (src[0]) /* size */ res[1] = poslib_loc_precision(read_entry(src).c_str()); else res[1] = 0x12; if (src[0]) /* hor */ res[2] = poslib_loc_precision(read_entry(src).c_str()); else res[2] = 0x16; if (src[0]) /* ver */ res[3] = poslib_loc_precision(read_entry(src).c_str()); else res[3] = 0x13; } int power10ed(unsigned char val) { int exp = val%15; int n = 1; while (--exp) n *= 10; return n * (val >> 4); } stl_string pos_degtostring(uint32_t val, char plus, char min) { char buff[32]; char mod; if (val >= 2147483648u) { mod = plus; val -= 2147483648u; } else { mod = min; val = 2147483648u - val; } sprintf(buff, "%d %d %.3f %c", val / 3600000, (val % 3600000) / 60000, (float)((val % 60000) / 1000), mod); return buff; } stl_string str_degrees(uint32_t value, char pos, char neg) { char post; char buff[32]; if (value > 2147483648u) { post = pos; value -= 2147483648u; } else { post = neg; value = 2147483648u - value; } sprintf(buff, "%d %d %d.%2d %c", value/360000,(value%360000)/6000,(value%6000)/100,value%100, post); return buff; } stl_string str_loc(const unsigned char *locrr) { stl_string ret; char locbuff[96]; uint32_t size = power10ed(locrr[1]), horpre = power10ed(locrr[2]), verpre = power10ed(locrr[3]), lati = uint32_value(locrr+4), longi = uint32_value(locrr+8), alti = uint32_value(locrr+12); sprintf(locbuff, "%.2fm %.2fm %.2fm %.2fm", ((float)(alti-10000000))/100, (float)size / 100, (float)horpre / 100, (float)verpre / 100); ret = pos_degtostring(lati, 'N', 'S') + " " + pos_degtostring(longi, 'E', 'W') + " " + locbuff; printf("Ret: %s\n", ret.c_str()); return ret; } uint16_t txt_to_qclass(const char *str, bool allow_q) { if (strcmpi(str, "IN") == 0) return CLASS_IN; if (strcmpi(str, "CS") == 0) return CLASS_CS; if (strcmpi(str, "CH") == 0) return CLASS_CH; if (strcmpi(str, "HS") == 0) return CLASS_HS; if (allow_q) { if (strcmpi(str, "ANY") == 0) return QCLASS_ANY; if (strcmpi(str, "NONE") == 0) return QCLASS_NONE; } throw PException(true, "Unknown class type %s", str); } stl_string intstring(u_int16 x) { char tmp[16]; snprintf(tmp, 15, "%u", x); return stl_string(tmp); } stl_string str_type(u_int16 type) { rr_type *rrtype = rrtype_getinfo(type); if (rrtype) return rrtype->name; return intstring(type); } stl_string str_qtype(u_int16 qtype) { if (qtype == QTYPE_AXFR) return "AXFR"; if (qtype == QTYPE_IXFR) return "IXFR"; if (qtype == QTYPE_MAILB) return "MAILB"; if (qtype == QTYPE_MAILA) return "MAILA"; if (qtype == QTYPE_ALL) return "ANY"; if (qtype == QTYPE_NONE) return "NONE"; return str_type(qtype); } stl_string str_class(u_int16 ctype) { if (ctype == CLASS_IN) return "IN"; if (ctype == CLASS_CS) return "CS"; if (ctype == CLASS_CH) return "CH"; if (ctype == CLASS_HS) return "HS"; return intstring(ctype); } stl_string str_qclass(u_int16 qctype) { if (qctype == QCLASS_ALL) return "ANY"; if (qctype == QCLASS_NONE) return "NONE"; return str_class(qctype); } /* OPCODEs */ stl_string str_opcode(u_int16 opcode) { if (opcode == OPCODE_QUERY) return "QUERY"; if (opcode == OPCODE_IQUERY) return "IQUERY"; if (opcode == OPCODE_STATUS) return "STATUS"; if (opcode == OPCODE_COMPLETION) return "COMPL"; if (opcode == OPCODE_NOTIFY) return "NOTIFY"; if (opcode == OPCODE_UPDATE) return "UPDATE"; return intstring(opcode); } stl_string str_rcode(int rcode) { if (rcode == RCODE_NOERROR) return "NOERROR"; if (rcode == RCODE_QUERYERR) return "QUERYERR"; if (rcode == RCODE_SRVFAIL) return "SRVFAIL"; if (rcode == RCODE_NXDOMAIN) return "NXDOMAIN"; if (rcode == RCODE_NOTIMP) return "NOTIMP"; if (rcode == RCODE_REFUSED) return "REFUSED"; if (rcode == RCODE_YXDOMAIN) return "YXDOMAIN"; if (rcode == RCODE_YXRRSET) return "YXRRSET"; if (rcode == RCODE_NXRRSET) return "NXRRSET"; if (rcode == RCODE_NOTAUTH) return "NOTAUTH"; if (rcode == RCODE_NOTZONE) return "NOTZONE"; if (rcode == RCODE_BADSIG) return "BADSIG"; if (rcode == RCODE_BADKEY) return "BADKEY"; if (rcode == RCODE_BADTIME) return "BADTIME"; return intstring(rcode); } stl_string str_ttl(uint32_t ttl) { char val[16]; stl_string res; struct _factor { char prefix; uint32_t factor; } factors[] = { {'y',31536000}, {'w',604800}, {'d',86400}, {'h',3600}, {'m',60}, {'s',1} }; _factor *f = &factors[0]; int x; if (ttl == 0) return "0"; while (f->factor != 1) { if (ttl >= f->factor) { x = ttl / f->factor; sprintf(val, "%d%c", x, f->prefix); res += val; ttl -= x * f->factor; } if (ttl == 0) return res; f++; } sprintf(val, "%u", ttl); res += val; return res; } dibbler-1.0.1/poslib/w32poll.h0000664000175000017500000000273712233256142013013 00000000000000/* Posadis - A DNS Server Poll for Win32 Copyright (C) 2001 Meilof Veeningen 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., 675 Mass Ave, Cambridge, MA 02139, USA. */ #ifndef __POSLIB_W32POLL_H #define __POSLIB_W32POLL_H #ifndef WIN32 struct pollfd { int fd; /* file descriptor */ short events; /* requested events */ short revents; /* returned events */ }; #define POLLIN 0x0001 /* There is data to read */ #define POLLPRI 0x0002 /* There is urgent data to read */ #define POLLOUT 0x0004 /* Writing now will not block */ #define POLLERR 0x0008 /* Error condition */ #define POLLHUP 0x0010 /* Hung up */ #define POLLNVAL 0x0020 /* Invalid request: fd not open */ #endif int poll(struct pollfd *ufds, unsigned int nfds, int timeout); #endif /* __POSLIB_W32POLL_H */ dibbler-1.0.1/poslib/types.h0000644000175000017500000000434412277722750012662 00000000000000/* Posadis - A DNS Server Data types Copyright (C) 2002 Meilof Veeningen 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., 675 Mass Ave, Cambridge, MA 02139, USA. */ #ifndef __POSLIB_TYPES_H #define __POSLIB_TYPES_H #include "dibbler-config.h" #if defined(__BORLANDC__) && defined(HAVE_INTTYPES_H) && defined(__WCHAR_TYPE__) /* the following is a fix for a bug in the GNU C header inttypes.h, raised by borland c */ # ifdef __WCHAR_TYPE__ typedef __WCHAR_TYPE__ __gwchar_t; # else # define __need_wchar_t # include typedef wchar_t __gwchar_t; # endif # define ____gwchar_t_defined 1 #endif #ifdef HAVE_INTTYPES_H #include #endif #ifdef HAVE_STDINT_H #include #endif #if !defined(HAVE_INTTYPES_H) && !defined(HAVE_STDINT_H) && !defined(uint16_t) # define uint16_t unsigned short # define uint32_t unsigned int # define uint48_t unsigned long long #endif /*! \file poslib/types.h * \brief typedefs * * Contains some typedefs used in Poslib */ typedef uint16_t u_int16; /**< Represents a 16-bit unsigned number. */ typedef uint32_t u_int32; /**< Represents a 32-bit unsigned number. */ typedef uint64_t u_int48; /**< Represents a 48-bit unsigned number. */ typedef char u_int4; /**< Represents an unsigned number containing at least 4 bits. */ typedef char u_int3; /**< Represents an unsigned number containing at least 3 bits. */ typedef unsigned char* _domain; /**< Represents a binary domain name. */ typedef const unsigned char* _cdomain; /**< Const domainname */ #endif /* __POSLIB_TYPES_H */ dibbler-1.0.1/poslib/dnsdefs.h0000644000175000017500000001274612277722750013151 00000000000000/* Posadis - A DNS Server DNS definitions Copyright (C) 2002 Meilof Veeningen 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., 675 Mass Ave, Cambridge, MA 02139, USA. */ #ifndef __DNS_DNSDEFS_H #define __DNS_DNSDEFS_H /*! \file poslib/dnsdefs.h * \brief DNS definitions * * This file contains \#defines for the various RR types, QTYPEs, RCODEs, * OPCODEs and such, as mostly defined in RFC 1035. */ /* RR types */ #define DNS_TYPE_A 1 /**< IPv4 address RR type */ #define DNS_TYPE_NS 2 /**< Nameserver RR type */ #define DNS_TYPE_MD 3 /**< Mail Domain RR type (deprecated) */ #define DNS_TYPE_MF 4 /**< Mail Forwarder RR type (deprecated) */ #define DNS_TYPE_CNAME 5 /**< Canonical Name RR type */ #define DNS_TYPE_SOA 6 /**< Start of Authority RR type */ #define DNS_TYPE_MB 7 /**< Mail Box RR type (experimental) */ #define DNS_TYPE_MG 8 /**< Mail Group RR type (experimental) */ #define DNS_TYPE_MR 9 /**< Mail Rename RR type (experimental) */ #define DNS_TYPE_NULL 10 /**< NULL RR type (experimental) */ #define DNS_TYPE_WKS 11 /**< Well-Known Services RR type */ #define DNS_TYPE_PTR 12 /**< Pointer RR type */ #define DNS_TYPE_HINFO 13 /**< Host Info RR type */ #define DNS_TYPE_MINFO 14 /**< Mailbox Info RR type */ #define DNS_TYPE_MX 15 /**< Mail eXchanger RR type */ #define DNS_TYPE_TXT 16 /**< Text RR type */ #define DNS_TYPE_RP 17 /**< Responsible Person RR type */ #define DNS_TYPE_AFSDB 18 /**< Andrew File System Database RR type */ #define DNS_TYPE_PX 26 /**< DNS X.400 Mail Mapping Information RR type */ #define DNS_TYPE_AAAA 28 /**< IPv6 address RR type */ #define DNS_TYPE_LOC 29 /**< LOC (location) RR type */ #define DNS_TYPE_SRV 33 /**< Services RR type */ #define DNS_TYPE_NAPTR 35 /**< Naming Authority Pointer RR type */ #define DNS_TYPE_A6 38 /**< Prefixed IPv6 address (experimental) */ #define DNS_TYPE_DNAME 39 /**< Sub-canonical Domain Name RR type (experimental) */ #define DNS_TYPE_TSIG 250 /**< Secure Key Transaction Authentication (RFC 2845) */ /* QTYPEs */ #define QTYPE_NONE 0 /**< No RR (DNS update) */ #define QTYPE_IXFR 251 /**< Incremental Zone Transfer QTYPE */ #define QTYPE_AXFR 252 /**< Complete Zone Transfer QTYPE */ #define QTYPE_MAILB 253 /**< Mailbox-related RRs QTYPE (experimental) */ #define QTYPE_MAILA 254 /**< Mail agent RRs QTYPE (deprecated) */ #define QTYPE_ALL 255 /**< All RR types QTYPE */ #define QTYPE_ANY 255 /**< All RR types QTYPE */ /* DNS classes */ #define CLASS_IN 1 /**< Internet class */ #define CLASS_CS 2 /**< CSNET class */ #define CLASS_CH 3 /**< Chaos class */ #define CLASS_HS 4 /**< Hesiod class */ /* QCLASSes */ #define QCLASS_NONE 254 /**< No class (for DNS update) */ #define QCLASS_ANY 255 /**< Any class */ #define QCLASS_ALL 255 /**< All classes */ /* RCODEs */ #define RCODE_NOERROR 0 /**< No error */ #define RCODE_QUERYERR 1 /**< Error in query */ #define RCODE_SERVFAIL 2 /**< Server failure */ #define RCODE_SRVFAIL 2 /**< Server failure */ #define RCODE_NXDOMAIN 3 /**< Domain name doesn't exist */ #define RCODE_NOTIMP 4 /**< Feature not implemented */ #define RCODE_REFUSED 5 /**< Action refused */ #define RCODE_YXDOMAIN 6 /**< Domain name should'nt exist (DNS Update) */ #define RCODE_YXRRSET 7 /**< RRset shouldn't exist (DNS Update) */ #define RCODE_NXRRSET 8 /**< RRset doesn't exist (DNS Update) */ #define RCODE_NOTAUTH 9 /**< Not authoritative when required */ #define RCODE_NOTZONE 10 /**< Domain name not in zone */ #define RCODE_BADSIG 16 /**< Bad signature */ #define RCODE_BADKEY 17 /**< Bad key */ #define RCODE_BADTIME 18 /**< Bad sign time */ /* OPCODEs */ #define OPCODE_QUERY 0 /**< Normal query */ #define OPCODE_IQUERY 1 /**< Inverse query (deprecated) */ #define OPCODE_STATUS 2 /**< Status request */ #define OPCODE_COMPLETION 3 /**< Completion query (deprecated) */ #define OPCODE_NOTIFY 4 /**< Notification message */ #define OPCODE_UPDATE 5 /**< DNS update message */ #endif /* __DNS_DNSDEFS_H */ dibbler-1.0.1/poslib/dnssec-sign.h0000644000175000017500000000714012277722750013730 00000000000000/* Posadis - A DNS Server Dns Message signing Copyright (C) 2005 Meilof Veeningen 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., 675 Mass Ave, Cambridge, MA 02139, USA. */ #ifndef __POSLIB_DNSSEC_SIGN_H #define __POSLIB_DNSSEC_SIGN_H /*! \file poslib/dnssec-sign.h * \brief DNS message signing * * This file contains code related to signing DNS messages and verifying signed * messages. */ #include "dnsmessage.h" /*! * \brief Verify TSIG signature * * Using the original TSIG record and the sign key #DnsMessage::sign_key, verify whether * the DNS message is correctly signed; if not, an exception will be thrown * and the check_tsig's error will be set to indicate the error that occured * when checking the DNS message. * * If use_orig_mac is set, the MAC from the original message will be included * in the check MAC, as dictated by RFC 2845, section 4.2. The original TSIG * record's MAC will be updated to match the answer's MAC. * The message length this function takes, is the message length without * the TSIG record included in the message, as returned by #DnsMessage::read_from_data. * * \param check_tsig TSIG record to check against * \param message_tsig TSIG record from the message * \param key Key to use * \param message Binary representation of message to check */ void verify_signature (DnsRR *check_tsig, DnsRR *message_tsig, stl_string key, message_buff message); stl_string calc_mac (DnsRR &tsig_rr, message_buff message, stl_string sign_key, message_buff *extra = NULL); /**< Calculate message MAC */ stl_string base64_decode (const char *str); /**< Base64-decode strings */ /*! * \brief create sparse TSIG record * * Creates a TSIG RR with suitable values for use as #DnsMessage::tsig_rr in checking and * signing of DNS messages. * * \param keyname Name of the key * \param fudge Permitted time difference between signing and checking * \param sign_algorithm Algorithm used to sign the message (currently, only the default is supported) * \return The TSIG record */ DnsRR *tsig_record (domainname keyname, uint16_t fudge = 600, domainname sign_algorithm = "HMAC-MD5.SIG-ALG.REG.INT"); /*! * \brief get sign parameters from key string * * Sets the TSIG signing parameters from a key string; see the other * #tsig_from_string for syntax. */ void tsig_from_string (DnsRR*& tsig_rr, stl_string& sign_key, const char* keystring); /*! * \brief set message sign parameters from key string * * Sets the TSIG signing parameters for a DNS message from a key string, which * is a string with the format keyname:key[:fudge]. The key is in BASE64 * encoded form; if no fudge is given, the default fudge value of #tsig_record * will be used. * * \param message The message to set TSIG parameters of * \param keystring The key string */ void tsig_from_string (DnsMessage *message, const char *keystring); void print_buff (int size, const unsigned char* buff); #endif /* __POSLIB_DNSSEC_SIGN_H */ dibbler-1.0.1/poslib/sysstl.h0000664000175000017500000000361012233256142013041 00000000000000/* Posadis - A DNS Server Universal include file for string functions, since different OS'ses use different directories Copyright (C) 2001 Meilof Veeningen 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., 675 Mass Ave, Cambridge, MA 02139, USA. */ #ifndef __POSLIB_SYSSTL_H #define __POSLIB_SYSSTL_H #include "dibbler-config.h" #include "sysstring.h" #include #ifdef HAVE_SLIST # include #else # ifdef HAVE_EXT_SLIST # define HAVE_SLIST # include # else # define slist std::list # endif #endif #include #ifdef _LEAKCHECK_ /* Use malloc_alloc for leak checking * * This code is _very_ platform-specific. I know this not to work on Mandrake * Linux using gcc 3.2, and, iirc, it doesn't work with gcc-2.96 on mdk either. * It does work on my debian box however, so I'll do my leak tests on that * one. */ #define stl_string std::basic_string, malloc_alloc > #define stl_slist(type) slist #define stl_list(type) std::list #else #define stl_slist(type) slist #define stl_list(type) std::list #define stl_string std::string #endif #ifdef HAVE_EXT_SLIST using namespace __gnu_cxx; #endif #endif /* __POSLIB_SYSSTL_H */ dibbler-1.0.1/poslib/AUTHORS0000664000175000017500000000005712233256142012401 00000000000000Meilof Veeningen dibbler-1.0.1/poslib/vsnprintf.cpp0000664000175000017500000001621212233256142014066 00000000000000/* This file was taken from the proftpd package (www.proftpd.net) and adapted for use in the Posadis Domain Name Server. This library 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 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 Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this library; see the file COPYING.LIB. If not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. */ #include #include #include #include "dibbler-config.h" #ifndef HAVE_VSNPRINTF static size_t strnlen(const char *s, size_t count) { const char *sc; for(sc = s; count-- && *sc != '\0'; ++sc) ; return sc - s; } static int skip_atoi(const char **s) { int i = 0; while(isdigit(**s)) i = i * 10 + *((*s)++) - '0'; return i; } #define ZEROPAD 1 #define SIGN 2 #define PLUS 4 #define SPACE 8 #define LEFT 16 #define SPECIAL 32 #define LARGE 64 static char *number(char *str, long num, int base, int size, int precision, int type, size_t *max_size) { char c,sign,tmp[66] = {'\0'}; const char *digits="0123456789abcdefghijklmnopqrstuvwxyz"; int i; size_t msize; msize = *max_size; if(type & LARGE) digits = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"; if(type & LEFT) type &= ~ZEROPAD; if(base < 2 || base > 36) return 0; c = (type & ZEROPAD) ? '0' : ' '; sign = 0; if(type & SIGN) { if(num < 0) { sign = '-'; num = -num; size--; } else if(type & PLUS) { sign = '+'; size--; } else if(type & SPACE) { sign = ' '; size--; } } if(type & SPECIAL) { if(base == 16) size -= 2; else if(base == 8) size--; } i = 0; if(num == 0) tmp[i++] = '0'; else while(num != 0) { tmp[i++] = digits[((unsigned long) num) % (unsigned) base]; num /= base; } if(i > precision) precision = i; size -= precision; if(!(type & (ZEROPAD+LEFT))) while(size-- > 0 && msize) { *str++ = ' '; msize--; } if(sign && msize) { *str++ = sign; msize--; } if(msize) { if(type & SPECIAL) if(base == 8) { *str++ = '0'; msize--; } else if(base == 16) { *str++ = '0'; msize--; if(msize) { *str++ = digits[33]; msize--; } } } if(!(type & LEFT)) while(size-- > 0 && msize) { *str++ = c; msize--; } while(i < precision-- && msize) { *str++ = '0'; msize--; } while(i-- > 0 && msize) { *str++ = tmp[i]; msize--; } while(size-- > 0 && msize) { *str++ = ' '; msize--; } *max_size = msize; return str; } /* ** This vsnprintf() emulation does not implement the conversions: ** %e, %E, %g, %G, %wc, %ws ** The %f implementation is limited. */ int vsnprintf(char *buf, size_t size, const char *fmt, va_list args) { int len; unsigned long num; int i, base; char *str; const char *s; int flags; int dotflag; int field_width; int precision; int qualifier; size--; for(str = buf; *fmt && size; ++fmt) { if(*fmt != '%') { *str++ = *fmt; size--; continue; } flags = 0; dotflag = 0; repeat: ++fmt; switch(*fmt) { case '-': flags |= LEFT; goto repeat; case '+': flags |= PLUS; goto repeat; case ' ': flags |= SPACE; goto repeat; case '#': flags |= SPECIAL; goto repeat; case '0': flags |= ZEROPAD; goto repeat; } field_width = -1; if(isdigit(*fmt)) field_width = skip_atoi(&fmt); else if(*fmt == '*') { ++fmt; field_width = va_arg(args,int); if(field_width < 0) { field_width = - field_width; flags |= LEFT; } } precision = -1; if(*fmt == '.') { dotflag++; ++fmt; if(isdigit(*fmt)) precision = skip_atoi(&fmt); else if(*fmt == '*') { ++fmt; precision = va_arg(args,int); } /* NB: the default precision value is conversion dependent */ } qualifier = -1; if(*fmt == 'h' || *fmt == 'l' || *fmt == 'L') { qualifier = *fmt; ++fmt; } base = 10; switch(*fmt) { case 'c': if(!(flags & LEFT)) while(--field_width > 0 && size) { *str++ = ' '; size--; } if(size) { *str++ = (unsigned char)va_arg(args,int); size--; } while(--field_width > 0 && size) { *str++ = ' '; size--; } continue; case 's': if ( dotflag && precision < 0 ) precision = 0; s = va_arg(args,char*); if(!s) s = "(null)"; len = strnlen(s, precision); if(!(flags & LEFT)) while(len < field_width-- && size) { *str++ = ' '; size--; } for(i = 0; i < len && size; ++i) { *str++ = *s++; size--; } while(len < field_width-- && size) { *str++ = ' '; size--; } continue; case 'p': if ( dotflag && precision < 0 ) precision = 0; if(field_width == -1) { field_width = 2 * sizeof(void*); flags |= ZEROPAD; } str = number(str, (unsigned long)va_arg(args,void*),16, field_width, precision, flags, &size); continue; case 'n': if(qualifier == 'l') { long *ip = va_arg(args,long*); *ip = (str - buf); } else { int *ip = va_arg(args,int*); *ip = (str - buf); } continue; case 'o': base = 8; break; case 'X': flags |= LARGE; case 'x': base = 16; break; case 'd': case 'i': flags |= SIGN; case 'u': break; default: if(*fmt != '%') *str++ = '%'; if(*fmt && size) { *str++ = *fmt; size--; } else --fmt; continue; } if(qualifier == 'l') num = va_arg(args,unsigned long); else if(qualifier == 'h') { if(flags & SIGN) num = (short)va_arg(args, int); else num = (unsigned short)va_arg(args,unsigned); } else if(flags & SIGN) num = va_arg(args,int); else num = va_arg(args, unsigned int); if ( dotflag && precision < 0 ) precision = 0; str = number(str,num,base,field_width,precision,flags,&size); } *str = '\0'; return str - buf; } #ifndef HAVE_SNPRINTF int snprintf(char *buf, size_t size, const char *fmt, ...) { va_list args; int i; va_start(args,fmt); i = vsnprintf(buf,size,fmt,args); va_end(args); return i; } #endif /* HAVE_SNPRINTF */ #else int foo_bar_baz() { return 0; } #endif /* HAVE_VSNPRINTF */ dibbler-1.0.1/poslib/vsnprintf.h0000664000175000017500000000215712233256142013536 00000000000000/* Posadis - A DNS Server Header file for proftpd vsnprintf function Copyright (C) 2002 Meilof Veeningen 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., 675 Mass Ave, Cambridge, MA 02139, USA. */ #ifndef __POSLIB_VSNPRINTF_H #define __POSLIB_VSNPRINTF_H #include "dibbler-config.h" #ifndef HAVE_VSNPRINTF #include int vsnprintf(char *, size_t, const char *, va_list); #endif #ifdef WIN32 #define vsnprintf _vsnprintf #endif #endif /* __POSLIB_VSNPRINTF_H */ dibbler-1.0.1/poslib/rr.cpp0000644000175000017500000004471112277722750012476 00000000000000/* Posadis - A DNS Server Resource Records Meilof Veeningen 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., 675 Mass Ave, Cambridge, MA 02139, USA. */ #include "dnsmessage.h" #include "domainfn.h" #include "sysstring.h" #include "exception.h" #include "bits.h" #include "lexfn.h" #include "rr.h" #include "domainfn.h" /* the RR type database */ const rr_type rr_types[] = { { "A", 1, "i", R_NONE }, { "NS", 2, "d", R_ASPCOMPRESS }, { "MD", 3, "d", R_ASPCOMPRESS }, { "MF", 4, "d", R_ASPCOMPRESS }, { "CNAME", 5, "d", R_COMPRESS }, { "SOA", 6, "dmltttt", R_COMPRESS }, { "NULL", 10, "n", R_NONE }, { "WKS", 11, "iw", R_NONE }, { "PTR", 12, "d", R_COMPRESS }, { "HINFO", 13, "cc", R_NONE }, { "MX", 15, "sd", R_ASPCOMPRESS }, { "TXT", 16, "h", R_NONE }, { "RP", 17, "md", R_NONE }, { "AFSDB", 18, "sd", R_ASP, }, { "PX", 26, "sdd", R_NONE }, { "AAAA", 28, "6", R_NONE }, { "LOC", 29, "o", R_NONE }, { "SRV", 33, "sssd", R_ASP, }, { "NAPTR", 35, "sscccd", R_NONE }, { "A6", 38, "7", R_NONE }, { "DNAME", 39, "d", R_ASP }, { "KEY", 250, "d4s*ss*", R_NONE }, }; const int n_rr_types = sizeof(rr_types) / sizeof(rr_type); rr_type *rrtype_getinfo(u_int16 type) { int t; for (t = 0; t < n_rr_types; t++) if (rr_types[t].type == type) return (rr_type *)&rr_types[t]; return NULL; } rr_type *rrtype_getinfo(const char *name) { int t; for (t = 0; t < n_rr_types; t++) if (strcmpi(rr_types[t].name, name) == 0) return (rr_type *)&rr_types[t]; return NULL; } char *rrtype_getname(u_int16 type) { rr_type *info = rrtype_getinfo(type); if (info) return info->name; else return NULL; } uint16_t qtype_getcode(const char *name, bool allow_qtype) { try { uint16_t ret = txt_to_int(name); if (!is_common_rr(ret)) throw PException(); return ret; } catch (PException p) { if (allow_qtype) { if (strcmpi(name, "maila") == 0) return QTYPE_MAILA; if (strcmpi(name, "mailb") == 0) return QTYPE_MAILB; if (strcmpi(name, "ixfr") == 0) return QTYPE_IXFR; if (strcmpi(name, "axfr") == 0) return QTYPE_AXFR; if (strcmpi(name, "any") == 0) return QTYPE_ANY; if (strcmpi(name, "all") == 0) return QTYPE_ANY; } rr_type *t = rrtype_getinfo(name); if (!t) throw PException(true, "Qtype %s not supported", name); return t->type; } } bool answers_qtype(uint16_t rrtype, uint16_t qtype) { return (rrtype == qtype || qtype == QTYPE_ANY || (qtype == QTYPE_MAILA && (rrtype == DNS_TYPE_MF || rrtype == DNS_TYPE_MD)) || (qtype == QTYPE_MAILB && (rrtype >= DNS_TYPE_MB && rrtype <= DNS_TYPE_MR))); } bool is_common_rr(uint16_t rrtype) { return (rrtype < QTYPE_IXFR); } /* this function complains when, to get to know the length, it has to exceed the buffer border. otherwise, it returns the length whether it's beyond the border or not. len is guaranteed to be at least one. */ int rr_len(char prop, message_buff &buff, int ix, int len) { unsigned char *ptr; int x; switch (prop) { case 'd': /* a domain name */ case 'm': /* email address */ return dom_comprlen(buff, ix); case 'i': /* ipv4 number */ case 'l': /* 32-bit number */ case 't': return 4; case 's': /* 16-bit number */ return 2; case 'c': /* character string */ return buff.msg[ix] + 1; case 'h': /* character strings */ ptr = buff.msg + ix; while (ptr - buff.msg - ix < len) ptr += *ptr + 1; if (ptr != buff.msg + ix + len) throw PException("Character strings too long for RR"); return len; case 'n': /* NULL rdata */ return len; case 'w': /* well-known services */ if (len < 5) throw PException("WKS RR too long for RR"); return len; case '6': /* ipv6 address */ return 16; case '7': /* ipv6 address + prefix */ x = ((135 - buff.msg[ix]) / 8); /* prefix length in bytes */ if (x + 1 >= len) throw PException("A6 too long for RR"); if (buff.msg[ix] != 0) /* domain name nessecary */ x += dom_comprlen(buff, ix + x + 1); return x + 1; case 'o': /* DNS LOC */ if (buff.msg[ix] != 0) throw PException("Unsupported LOC version"); return 16; case '4': /* uint48 */ return 6; case '*': /* data with length prefix */ if (len < 2) throw PException ("Data too long for RR"); return buff.msg[ix] * 256 + buff.msg[ix+1] + 2; } throw PException(true, "Unknown RR item type %c", prop); } void rr_read(u_int16 RRTYPE, unsigned char*& RDATA, uint16_t &RDLEN, message_buff &buff, int ix, int len) { rr_type *info = rrtype_getinfo(RRTYPE); char *ptr; stl_string res; _domain dom; if (ix + len > buff.len) throw PException("RR doesn't fit in DNS message"); if (info) { /* we support the RR type */ try { ptr = info->properties; while (*ptr) { int x; x = rr_len(*ptr, buff, ix, len); if (x > len) throw PException("RR item too long!"); if (*ptr == 'd' || *ptr == 'm') { /* domain name: needs to be decompressed */ dom = dom_uncompress(buff, ix); res.append((char*)dom, domlen(dom)); free(dom); } else { res.append((char*)buff.msg + ix, x); } ix += x; len -= x; ptr++; } if (len != 0) throw PException("extra data in RR"); } catch(PException p) { throw PException("Parsing RR failed: ", p); } if (len != 0) throw PException("RR length too long"); } else { /* we do not support the RR type: just copy it altogether */ res.append((char*)buff.msg + ix, len); } RDLEN = res.length(); RDATA = (unsigned char *)memdup((void *)res.c_str(), res.length()); } void rr_write(u_int16 RRTYPE, unsigned char *RDATA, uint16_t RDLEN, stl_string &dnsmessage, stl_slist(dom_compr_info) *comprinfo) { rr_type *info = rrtype_getinfo(RRTYPE); char *ptr; int len, ix = 0; message_buff rrbuff(RDATA, RDLEN); if (!info || !(info->flags & R_COMPRESS) || !comprinfo) { dnsmessage.append((char*)RDATA, RDLEN); return; } ptr = info->properties; while (*ptr) { len = rr_len(*ptr, rrbuff, ix, RDLEN - ix); if ((*ptr == 'd' || *ptr == 'm') && comprinfo) { /* compress dname */ dom_write(dnsmessage, RDATA + ix, comprinfo); } else { dnsmessage.append((char*)RDATA + ix, len); } ix += len; ptr++; } } stl_string rr_tostring(u_int16 RRTYPE, const unsigned char *_RDATA, int RDLENGTH) { return rr_torelstring(RRTYPE, _RDATA, RDLENGTH, ""); } stl_string rr_property_to_string(char type, const unsigned char*& RDATA, int RDLENGTH, domainname& zone) { char buff[128]; const unsigned char *ptr; std::string ret; domainname dom; int x, y; message_buff msgbuff = message_buff((unsigned char*)RDATA, RDLENGTH); switch (type) { case 'd': // domain name case 'm': // email address dom = domainname(true, RDATA); RDATA += domlen((_domain)RDATA); if (zone == "") return dom.tostring(); else return dom.torelstring(zone); case 'i': // ipv4 address sprintf(buff, "%d.%d.%d.%d", RDATA[0], RDATA[1], RDATA[2], RDATA[3]); RDATA += 4; return buff; case 's': // 16-bit value sprintf(buff, "%d", RDATA[0] * 256 + RDATA[1]); RDATA += 2; return buff; case 'l': // 32-bit value sprintf(buff, "%d", RDATA[0] * 16777216 + RDATA[1] * 65536 + RDATA[2] * 256 + RDATA[3]); RDATA += 4; return buff; case 't': ret = str_ttl(RDATA[0] * 16777216 + RDATA[1] * 65536 + RDATA[2] * 256 + RDATA[3]); RDATA += 4; return ret; case 'c': // character string ret.append("\""); ret.append((char*)RDATA + 1, (int)*RDATA); ret.append("\""); RDATA += *RDATA + 1; return ret; case 'h': // character strings ptr = RDATA + RDLENGTH; while (RDATA < ptr) { ret.append("\""); ret.append((char*)RDATA + 1, (int)*RDATA); ret.append("\" "); RDATA += *RDATA + 1; } return ret; case '6': sprintf(buff, "%x:%x:%x:%x:%x:%x:%x:%x", RDATA[0]*256 + RDATA[1], RDATA[2]*256 + RDATA[3], RDATA[4]*256 + RDATA[5], RDATA[6]*256 + RDATA[7], RDATA[8]*256 + RDATA[9], RDATA[10]*256 + RDATA[11], RDATA[12]*256 + RDATA[13], RDATA[14]*256 + RDATA[15]); RDATA += 16; return buff; case 'w': // well-known services sprintf(buff, "%d", *(RDATA++)); ret.append(buff); y = 0; ptr = RDATA + RDLENGTH; while (RDATA < ptr) { for (x = 0; x < 8; x++) { if (bitisset(RDATA, x)) { sprintf(buff, " %d", y + x); ret.append((char*)buff); } } y += 8; RDATA++; } return ret; case 'o': // RFC1876 location information return str_loc(RDATA); case '4': // 3-byte integer sprintf(buff, "%lu", (unsigned long)uint48_value (RDATA)); RDATA += 6; return buff; case '*': // length+data x = RDATA[0] * 256 + RDATA[1]; if (x == 0) buff[0] = 0; else sprintf(buff, "(%d bytes)", x); RDATA += x + 2; return buff; default: return "?"; } } stl_string rr_torelstring(u_int16 RRTYPE, const unsigned char *_RDATA, int RDLENGTH, domainname zone) { rr_type *info = rrtype_getinfo(RRTYPE); char *ptr; const unsigned char *RDATA = _RDATA; stl_string ret; if (!info) return ""; ptr = info->properties; while (*ptr) { ret.append (rr_property_to_string (*ptr, RDATA, RDLENGTH - (int)(RDATA - _RDATA), zone)); ptr++; if (*ptr) ret.append (" "); } return ret; } void read_line(char *buff, FILE *f, int *linenum, int *linenum_old, int buffsz) { bool inb = false; int c; int pos = 0; if (linenum && linenum_old) *linenum_old = *linenum; while (!feof(f)) { /* line reading magic */ c = fgetc(f); if (c == EOF) break; switch (c) { case '\n': case '\r': /* line end */ if (c == '\n' && linenum) (*linenum)++; while (!feof(f)) { c = fgetc(f); if (c == '\n' && linenum) (*linenum)++; if (c != '\n' && c != '\r') { ungetc(c, f); break; } } if (feof(f) || !inb) goto rln_finished; continue; case '(': inb = true; continue; case ')': inb = false; continue; case '"': if (pos > buffsz - 2) throw PException("Line too long"); buff[pos++] = '"'; do { c = fgetc(f); if (c == '"') break; if (c == '\n' && linenum) (*linenum)++; if (pos > buffsz - 3) throw PException("Line too long"); if (feof(f)) throw PException("EOF in quotes"); buff[pos++] = c; } while (1); buff[pos++] = '"'; continue; case ';': /* find end of line */ while (!feof(f) && c != '\n' && c != '\r') c = fgetc(f); if (!feof(f)) ungetc(c,f); continue; case '\\': c = fgetc(f); if (c == '\n') { if (*linenum) (*linenum)++; c = fgetc(f); if (c != '\r') ungetc(c, f); continue; } if (c != '\n' && c != '\r' && c != '(' && c != ')' && c != '"' && c != '\\') { ungetc(c, f); c = '\\'; } default: if (pos > buffsz - 2) throw PException("Line too long"); buff[pos++] = c; } } rln_finished: buff[pos] = 0; } stl_string read_entry(char*& data) { char buff[256]; unsigned int len = 0; bool in_quote = false; char *tmp = data; if (*tmp == 0) throw PException("Unexpected end-of-line"); while (*tmp != '\0' && (in_quote || (*tmp != ' ' && *tmp != '\t'))) { if (*tmp == '\\' && (*(tmp+1) == '\\' || *(tmp+1) == ' ' || *(tmp+1) == '\t')) tmp++; else if (*tmp == '"') { in_quote = !in_quote; tmp++; continue; } if (len >= sizeof(buff) - 1) throw PException("Data too long!"); buff[len++] = *tmp; tmp++; } /* find beginning of next entry */ while (*tmp == ' ' || *tmp == '\t') tmp++; data = tmp; buff[len] = 0; return stl_string(buff); } stl_string rr_fromstring(u_int16 RRTYPE, const char *_data, _domain origin) { stl_string ret; stl_string tmp; char buff[256]; int val, x; domainname tdom; char *data = (char*)_data; rr_type *info = rrtype_getinfo(RRTYPE); char *ptr; if (!info) throw PException("Unknown RR type"); ptr = info->properties; while (*ptr) { switch (*ptr) { case 'd': case 'm': tmp = read_entry(data); tdom = domainname(tmp.c_str(), origin); ret.append((char*)tdom.c_str(), tdom.len()); break; case 'i': tmp = read_entry(data); txt_to_ip((unsigned char*)buff, (char *)tmp.c_str()); ret.append(buff, 4); break; case 's': tmp = read_entry(data); val = txt_to_int((char *)tmp.c_str()); ret.append((char*)uint16_buff(val), 2); break; case '4': // TODO: this should actually also accept long longs? tmp = read_entry(data); val = txt_to_int((char *)tmp.c_str()); ret.append((char*)uint48_buff(val), 6); break; case 'l': case 't': tmp = read_entry(data); val = txt_to_int((char *)tmp.c_str()); ret.append((char*)uint32_buff(val), 4); break; case '6': tmp = read_entry(data); txt_to_ipv6((unsigned char*)buff, (char *)tmp.c_str()); ret.append(buff, 16); break; case 'c': tmp = read_entry(data); if (tmp.size() > 63) throw PException("Character string too long"); buff[0] = strlen(tmp.c_str()); ret.append(buff, 1); ret.append(tmp.c_str(), strlen(tmp.c_str())); break; case 'h': tmp = read_entry(data); while (1) { if (tmp.size() > 63) throw PException("Character string too long"); buff[0] = tmp.size(); ret.append(buff, 1); ret.append(tmp.c_str(), strlen(tmp.c_str())); if (*data == 0) break; tmp = read_entry(data); } break; case 'w': tmp = read_entry(data); buff[0] = getprotocolbyname(tmp.c_str()); ret.append(buff, 1); memset(buff, 0, sizeof(buff)); x = 0; /* highest port */ while (*data) { val = getserviceportbyname(read_entry(data).c_str()); if (val >= (signed)sizeof(buff) * 8) throw PException(true, "Port number %d too large", val); buff[val / 8] |= (1 << (val%8)); } ret.append(buff, (x / 8) + 1); break; case 'o': txt_to_loc((unsigned char *)buff, data); ret.append(buff, 16); break; case '*': break; default: throw PException("Unknown RR property type"); } ptr++; } if (*data) throw PException("Extra data on RR line"); return ret; } stl_string rr_fromstring(u_int16 RRTYPE, const char *data, domainname origin) { return rr_fromstring(RRTYPE, data, origin.c_str()); } void rr_goto(unsigned char*& RDATA, u_int16 RRTYPE, int ix) { rr_type *info = rrtype_getinfo(RRTYPE); if (!info) throw PException("Unknown RR type"); int len; char *ptr = info->properties; message_buff buff; for (int x = 0; x < ix; x++) { if (ptr[x] == '\0') throw PException("RR does not contain that property"); buff = message_buff(RDATA, 65535); len = rr_len(ptr[x], buff, 0, 65536); RDATA += len; } } _domain rr_getbindomain(const unsigned char *_RDATA, u_int16 RRTYPE, int ix) { unsigned char *RDATA = (unsigned char*)_RDATA; rr_goto(RDATA, RRTYPE, ix); return domdup(RDATA); } domainname rr_getdomain(const unsigned char *RDATA, u_int16 RRTYPE, int ix) { domainname dom; _domain ptr = rr_getbindomain(RDATA, RRTYPE, ix); dom = domainname(true, ptr); free(ptr); return dom; } _domain rr_getbinmail(const unsigned char *RDATA, u_int16 RRTYPE, int ix) { return rr_getbindomain(RDATA, RRTYPE, ix); } domainname rr_getmail(const unsigned char *RDATA, u_int16 RRTYPE, int ix) { return rr_getdomain(RDATA, RRTYPE, ix); } u_int16 rr_getshort(const unsigned char *_RDATA, u_int16 RRTYPE, int ix) { unsigned char *RDATA = (unsigned char*)_RDATA; rr_goto(RDATA, RRTYPE, ix); return uint16_value (RDATA); } u_int32 rr_getlong(const unsigned char *_RDATA, u_int16 RRTYPE, int ix) { unsigned char *RDATA = (unsigned char*)_RDATA; rr_goto(RDATA, RRTYPE, ix); return uint32_value (RDATA); } u_int48 rr_getlonglong(const unsigned char *_RDATA, u_int16 RRTYPE, int ix) { unsigned char *RDATA = (unsigned char*)_RDATA; rr_goto(RDATA, RRTYPE, ix); return uint48_value (RDATA); } unsigned char *rr_getip4(const unsigned char *_RDATA, u_int16 RRTYPE, int ix) { unsigned char *RDATA = (unsigned char*)_RDATA; rr_goto(RDATA, RRTYPE, ix); unsigned char *ret = (unsigned char *)malloc(4); memcpy(ret, RDATA, 4); return ret; } unsigned char *rr_getip6(const unsigned char *_RDATA, uint16_t RRTYPE, int ix) { unsigned char *RDATA = (unsigned char*)_RDATA; rr_goto(RDATA, RRTYPE, ix); unsigned char *ret = (unsigned char *)malloc(16); memcpy(ret, RDATA, 16); return ret; } unsigned char *rr_getdata(const unsigned char *_RDATA, uint16_t RRTYPE, int ix) { unsigned char *RDATA = (unsigned char*)_RDATA; rr_goto(RDATA, RRTYPE, ix); return RDATA; } dibbler-1.0.1/poslib/exception.cpp0000644000175000017500000000346712277722750014054 00000000000000/* Posadis - A DNS Server Exception class Copyright (C) 2002 Meilof Veeningen 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., 675 Mass Ave, Cambridge, MA 02139, USA. */ #include "exception.h" #include "sysstring.h" #include #include PException::PException() { message = strdup(""); } PException::PException(const char *_message) { message = strdup(_message); } PException::PException(const char *_message, const PException &p) { size_t len = strlen(_message) + strlen(p.message) + 1; message = (char*) malloc(len); strncpy(message, _message, len - 1); strncat(message, p.message, len - 1); } PException::PException(const PException& p) { message = strdup(p.message); } PException::PException(bool formatted, const char *_message, ...) { va_list list; char buff[1024]; va_start(list, _message); vsnprintf(buff, sizeof(buff), _message, list); va_end(list); message = strdup(buff); } PException& PException::operator=(const PException& p) { if (this != &p) { free(message); if (p.message) message = strdup(p.message); else message = NULL; } return *this; } PException::~PException() { if (message) free(message); } dibbler-1.0.1/poslib/Makefile.am0000644000175000017500000000135612277722750013401 00000000000000SUBDIRS = . if HAVE_GTEST SUBDIRS += tests endif noinst_LIBRARIES = libPoslib.a AM_CPPFLAGS = -I$(top_srcdir) -I$(top_srcdir)/include -I$(top_srcdir)/nettle -I$(top_srcdir)/Misc libPoslib_a_SOURCES = \ dnsmessage.cpp \ domainfn.cpp \ dnssec-sign.cpp \ dnssec-sign.h \ exception.cpp \ lexfn.cpp \ masterfile.cpp \ postime.cpp \ random.cpp \ resolver.cpp \ rr.cpp \ socket.cpp \ vsnprintf.cpp \ bits.h \ dnsmessage.h \ dnsdefs.h \ domainfn.h \ exception.h \ lexfn.h \ masterfile.h \ poslib.h \ postime.h \ random.h \ resolver.h \ rr.h \ socket.h \ syssocket.h \ sysstl.h \ sysstring.h \ syssocket.h \ types.h \ vsnprintf.h dist_noinst_DATA = w32poll.cpp w32poll.h ChangeLog-poslib dibbler-1.0.1/poslib/random.cpp0000664000175000017500000000274312233256142013321 00000000000000/* Posadis - A DNS Server Randomize functions Copyright (C) 2002 Meilof Veeningen 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., 675 Mass Ave, Cambridge, MA 02139, USA. */ #ifndef WIN32 #include #endif #include #include #ifdef __BORLANDC__ #include #endif #include "random.h" char randomstate[256]; class _random_system { public: _random_system() { #ifndef _WIN32 initstate(time(NULL), randomstate, sizeof(randomstate)); setstate(randomstate); srandom(time(NULL)); #else srand(time(NULL)); #endif } ~_random_system() { } } __random_system; int posrandom() { #ifdef _WIN32 int ret = rand(); #else int ret = random(); #endif return ret; } int possr_prev = 0; int possimplerandom() { int t; t = (possr_prev*3877 + 29573) % 139968; possr_prev = t; return t; } dibbler-1.0.1/poslib/exception.h0000644000175000017500000001005312277722750013506 00000000000000/* Posadis - A DNS Server Exception class Copyright (C) 2002 Meilof Veeningen 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., 675 Mass Ave, Cambridge, MA 02139, USA. */ #ifndef __POSLIB_EXCEPTION_H #define __POSLIB_EXCEPTION_H /*! \file poslib/exception.h * \brief Poslib exception mechanism * * This file hosts the PException class, the class all Poslib functions use * to notify the caller of an error. */ /*! * \brief Poslib exception class * * This is the class all Poslib functions will use when they want to notify the * caller in case of an error. It has only one member, #message, which is a * free-form message describing the error. It can be constructed in various * ways: by specifying a message, a format string with arguments, and a * combination of a message and an other exception. */ class PException { public: /*! * \brief default constructor * * This default constructor for the exception class sets the #message to "". */ PException(); /*! * \brief copy constructor * * This destructor makes a copy of another PException. * \param p The PException to copy */ PException(const PException& p); /*! * \brief constructor with message * * This constructor takes the message to store in the PException. The message * parameter will be copied to the PException using a strdup(). * \param _message The message for the exception */ PException(const char *_message); /*! * \brief constructor with message and another exception * * This constructor takes a message, and another PException. The #message * variable will consists of the _message parameter and the message of the * p parameter. This can be really convenient if you want to re-throw an * exception, for example: * \code * try { * domainname x = "www.acdam.net"; * (...) * } catch (PException p) { * throw PException("Process failed: ", p); * } * \endcode * \param _message Error message * \param p Exception whose message is appended to the error message */ PException(const char *_message, const PException &p); /*! * \brief constructor with format string * * This constructor can be used for formatting an error message. The first * boolean parameter is only there so that this can be distinguished from * other constructors; it has no actual meaning currently (we are thinking * what meaning we could give it though - so stay tuned :) ). * * This code internally calls vsnprintf, so you don't need to bother about * buffer overflows. Do note that the message will be trimmed of at 1024 * characters if it becomes too long. * \param formatted Ignored. * \param message The format string message * \param ... Arguments for the format string */ PException(bool formatted, const char *message, ...); /*! * \brief destructor * * This destructor frees all memory associated with the exception object. */ ~PException(); /*! * \brief assignment operator * * This function assigns the message from the PException p to this object. * \param p The PException to copy * \return This exception object */ PException& operator=(const PException& p); /*! * \brief the exception error message * * The error message of the exception. This is just one piece of free-form * text. You can always assume this value is non-NULL. */ char *message; }; #endif /* __POSLIB_EXCEPTION_H */ dibbler-1.0.1/poslib/dnsmessage.h0000644000175000017500000005045312277722750013651 00000000000000/* Posadis - A DNS Server Dns Message handling Copyright (C) 2002 Meilof Veeningen 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., 675 Mass Ave, Cambridge, MA 02139, USA. */ class DnsRR; #ifndef __POSLIB_DNSMESSAGE_H #define __POSLIB_DNSMESSAGE_H class message_buff; #include #include "dnsdefs.h" #include "types.h" #include "sysstl.h" #include "domainfn.h" /* when constructed with the message and length, the data is regarded static and not cleaned up on destruction */ /** \file poslib/dnsmessage.h * \brief DNS message functions * * This file contains functions and classes for dealing with DNS messages. The * DnsMessage class is used to represent a DNS message, and some functions for * reading numbers from binary DNS data are also included. */ /*! * \brief message buffer * * This is a structure that can hold a piece of binary data and its length. * Depending on the way it is constructed, or whether is_static is set, it * will choose whether or not to free the resources associated with it upon * destruction. */ class message_buff { public: /*! * \brief static constructor * * This constructor will just set the msg pointer to the address pointed to * by \p _msg, and copy the length. It will not copy the data, and, when the * structure is destroyed, the data will not be freed (e.g., it sets * is_static to \p true), unless you set is_dynamic to true. * \param _msg Source data * \param _len Source length * \param is_dynamic Whether the data is dynamic. */ message_buff(unsigned char *_msg, int _len, bool is_dynamic = false); /*! * \brief copy constructor * * This constructor will copy the specified message buffer. If the source * message buffer is dynamic (e.g. \p buff.is_static is false), the data * will be dynamically copied. * \param buff The buffer to copy */ message_buff(const message_buff& buff); /*! * \brief dynamic constructor * * This constructor will set msg to NULL, len to 0 and is_static to false. * Thus, it will creatr a dynamic message buffer whose msg will be destroyed * by the destructor. */ message_buff(); /*! * \brief destructor * * If is_static is set to false, this destructor will free the memory * associated with msg. */ ~message_buff(); /*! * \brief assignment operator * * This operator will copy the given message buffer. It works the same as * message_buff(const messagebuf &buff). * \param buff Message buffer to copy */ message_buff& operator=(const message_buff& buff); /*! * \brief whether the message is static * * This determines whether the msg field is static - that is, whether it * should be freed by the message_buffer ( \p false ) or not. The default value * of this depends on the used constructor. */ bool is_static; /*! * \brief buffer length * * The length, in bytes, of the data pointed to by msg. */ int len; /*! * \brief buffer * * The data the message_buff holds. */ unsigned char *msg; }; /*! * \brief DNS question object * * This object holds a DNS question object - an entry in the question section * of a DNS message. */ class DnsQuestion { public: /*! * \brief constructor * * This is the default constructor. */ DnsQuestion(); /*! * \brief copy constructor * * This constructor copies the given question. * \param q Question to copy */ DnsQuestion(const DnsQuestion& q); /*! * \brief assignment * * This is the assignment operator. It works in the same way as the copy * constructor. */ DnsQuestion& operator=(const DnsQuestion& q); /** * @brief constructor * * This constructor takes values for the various fields of the question * structure. * @param qname Domain name to query * @param qtype Type to query * @param qclass Class the data is in (or CLASS_IN if none specified) */ DnsQuestion(domainname qname, u_int16 qtype, u_int16 qclass = CLASS_IN); /*! * \brief destructor * * Frees data associated with the object. */ ~DnsQuestion(); /*! * \brief query domain name * * Domain name to query for. */ domainname QNAME; /*! * \brief query type * * The type of data to query for. This can be a RR type constant (for * example, DNS_TYPE_A), or a QTYPE_* constant (for example, QTYPE_ANY). * These constants can be found in the dnsdefs.h header. */ u_int16 QTYPE; /*! * \brief query class * * The class to query. This is mainly historical, the only class that is used * nowadays is CLASS_IN (the internet). Other values as CLASS_HS for Hesiod, * CLASS_CH for chaos, and CLASS_CS for CSNET. The QCLASS_ANY constant means * you don't care what class, but this is usually not supported. The list of * constants can be found in the dnsdefs.h header. */ u_int16 QCLASS; }; /*! * \brief resource record * * This class represents a resource record (RR), the fundamental building block * of the DNS. A RR contains type-dependent information in its RDATA field, as * well as some general information on the RR itself, such as its TTL. */ class DnsRR { public: /*! * \brief constructor * * This is the default constructor. */ DnsRR(); /*! * \brief comparator */ bool operator==(const DnsRR& other); /*! * \brief sort comparison function * * This function defines an order on DnsRRs, returning -1 if the current item * is smaller, 0 if two DnsRRs are equal, and 1 otherwise. The items are * sorted, in order, by their #CLASS, #NAME, #TYPE (SOA going before other * types), #TTL and #RDATA fields. * \param other Other RR * \return Result of the comparison */ int compareTo(const DnsRR& other) const; bool operator<(const DnsRR& rr) const; bool operator<=(const DnsRR& rr) const; bool operator>(const DnsRR& rr) const; bool operator>=(const DnsRR& rr) const; /*! * \brief constructor taking some fields * * This constructor sets the values of many of the class members, but not for * the RR data. * \param NAME The domain name * \param TYPE Resource Record type * \param CLASS Class the RR is in * \param TTL Time To Live for the RR */ DnsRR(domainname NAME, u_int16 TYPE, u_int16 CLASS, u_int32 TTL); /*! * \brief constructor taking some fields * * This constructor sets the values of all class members, including * the RR data. * \param NAME The domain name * \param TYPE Resource Record type * \param CLASS Class the RR is in * \param TTL Time To Live for the RR * \param RDLENGTH Length of RR data * \param RDATA RR data (this is copied into the RR) */ DnsRR(domainname NAME, u_int16 TYPE, u_int16 CLASS, u_int32 TTL, uint16_t RDLENGTH, const unsigned char *RDATA); /*! * \brief copy constructor * * This constructor copies the given RR. It dynamically allocates its own * copy of the RRs #RDATA field. * \param rr Resource Record to copy */ DnsRR(const DnsRR& rr); /*! * \brief assignment operator * * The assignment operator works the same as the copy constructor. * \param rr Resource Record to copy */ DnsRR& operator=(const DnsRR& rr); /*! * \brief destructor * * Frees all memory associated with the RR, including the #RDATA. */ ~DnsRR(); /*! * \brief domain name * * The domain name the Resource Record is bound to. Defaults to the root * domain. */ domainname NAME; /*! * \brief RR type * * The type of the RR. One of the constants defined in dnsdefs.h, for example * #DNS_TYPE_A or #DNS_TYPE_MX (or the value of the rr_type.type field). */ u_int16 TYPE; /*! * \brief class * * The DNS class the RR is in. See DnsQuestion::QCLASS for a list, except that * it can not be #QCLASS_ALL in this case. Defaults to #CLASS_IN. */ u_int16 CLASS; /*! * \brief time to live * * The time to live for the RR - that is, the time in seconds it may be * stored in cache. */ u_int32 TTL; /*! * \brief length of RR data * * The length in bytes of the data pointed to by #RDATA. */ u_int16 RDLENGTH; /*! * \brief RR data * * Binary data for the RR. Use the RR functions from rr.h to interpret this * field. Automatically freed upon destruction. * \sa rr_tostring(), rr_getdomain(), rr_getmail(), ... */ unsigned char *RDATA; // RDLENGTH copy of data before TSIG_RR is signed uint16_t presign_RDLENGTH; // RDATA copy of data before TSIG_RR is signed unsigned char *presign_RDATA; }; /*! * \brief DNS message * * This structure holds a DNS message, the message type with which DNS servers * talk to each other. It has member functions for reading data from binary DNS * messages, and to create a binary DNS message from the structure. */ class DnsMessage { public: /*! * \brief constructor * * This constructs an empty DNS message, with all fields set to defaults. */ DnsMessage(); /*! * \brief destructor * * This destroys the DNS message. */ ~DnsMessage(); /*! * \brief message ID * * This is the message ID field of the DNS message. This number is set by * client software, and is copied into the response by the server in order * for clients to be able to track queries. Note that the Posadis resolver * sets this value for you, so there's no need to do that yourself in client * applications. */ u_int16 ID; /*! * \brief query bit * * This bit is set to \p false for queries, and \p true for answers. */ bool QR; /*! * \brief operation * * This is the type of operation the query is. The most common are * OPCODE_QUERY for queries, OPCODE_UPDATE for dynamic updates, and * OPCODE_NOTIFY for DNS notifications. Possible values are in dnsdefs.h. */ u_int4 OPCODE; /*! * \brief authoritative answer * * This is set to \p true by the server if it was authoritative for the * zone the query was in. Note that, if the answer contains CNAMEs, this does * not nessecarily mean the server was also authoritative for the domain the * CNAME pointed to. */ bool AA; /*! * \brief truncated * * Set to \p true by the server if the answer was cut off because it didn't * fit in a UDP packet. Unless you instruct it not to, the Posadis resolver * will automatically retry using TCP to get the complete answer. */ bool TC; /*! * \brief recursion desired * * Set this to \p true to instruct the server to do recursive operation * (e.g. consult other nameservers to find the right answer). Note that * servers may refuse to do this, and will set the #RA field accordingly. */ bool RD; /*! * \brief recursion available * * Set to the server indicating whether it is willing to provide recursive * service. Note that, even if recursion was not desired (see #RD), this * value might still be set. */ bool RA; /*! * \brief reserved bits * * This the value of three currently reserved bits in the DNS message. * Though these bits currently have no meaning and servers might require * them to be zero, Poslib is able to read and write them. */ u_int3 Z; /*! * \brief return code * * Code indicating whether the query was succesful. Some famous RCODEs, * which are defined in dnsdefs.h, are: RCODE_NOERROR to indicate success, * RCODE_NXDOMAIN if the domain name queried for didn't exist, or * RCODE_SERVFAIL in case of a server failure. */ u_int4 RCODE; /*! * \brief question section * * This section should contain exactly one DnsQuestion object for common DNS * queries. This query is usually copied into the response by the server. */ stl_list(DnsQuestion) questions; /*! * \brief answer section * * This section, filled by the server, contains the Resource Records that * form a direct answer to the query. */ stl_list(DnsRR) answers; /*! * \brief authority section * * This section contains pointers to authoritative sources for the information. * Most nameservers put the nameserver list for the domain names in the * section here. */ stl_list(DnsRR) authority; /** * \brief additional section * * This section contains additional information that might be interesting for * the client, for example addresses for NS or MX records in the answer or * authority sections. */ stl_list(DnsRR) additional; /** * \brief read DNS message * * This function will read DNS message information from the binary DNS * message pointed to by data. If the DNS message contains a TSIG record, the * function returns the number of bytes read before the TSIG record. * This information is nessecary in case you want to call #verify_signature on * the message manually. * * If the #tsig_rr is non-NULL, the message is verified; if it is NULL and * the message still contains a TSIG record, then #tsig_rr is set to the * TSIG record found in the message (for use in later checking). * * \param data Binary DNS message * \param len Length of message * \return The length of the data read, not including a TSIG record if it is * present */ int read_from_data(unsigned char *data, int len); /** * \brief compile DNS message * * This function will compile the DNS message into the binary format sent * over UDP or TCP connections. * \param maxlen Maximum length. If the message exceeds this limit, it will be cut off and the #TC bit will be set. This should be \p 65535 for TCP messages and \p 512 for UDP messages. * \return The compiled DNS message */ message_buff compile(int maxlen); static void write_rr(DnsRR &rr, stl_string &message, stl_slist(dom_compr_info) *comprinfo, int flags = 0); void write_section(stl_list(DnsRR)& section, int lenpos, stl_string& message, stl_slist(dom_compr_info) &comprinfo, int maxlen, bool is_additional = false); void read_section(stl_list(DnsRR)& section, int count, message_buff &buff, int &pos, unsigned int *tsig_pos = NULL); static DnsRR read_rr(message_buff &buff, int &pos, int flags = 0); /** * \brief TSIG record for message * * When compiling a message, if tsig_rr is non-null, this TSIG record will be * used to sign the DNS message, in combination with the key sign_key. * * When reading a message, if tsig_rr is non-null, this TSIG record will be * used to verify the DNS message, in combination with the key sign_key * (i.e., #verify_signature will be called automatically). If it is set to * NULL and the message is signed, instead, it will be set to the TSIG record * found in the message. * * When calling #verify_signature, this record will be used to * verify the DNS message. */ DnsRR *tsig_rr; /// optional tsig_rr signing time (if set to 0, time(NULL) will be used time_t tsig_rr_signtime; /** * \brief TSIG key for message * * Key to use when signing or verifying a signed message; see #tsig_rr. */ stl_string sign_key; /** * \brief create answer message * TODO: rename? * Creates a DNS message that has the same sign key, so that read_data * can check whether it is an answer to the DNS message. * TODO: note: not for clients * \return the answer message */ DnsMessage *initialize_answer(); }; u_int16 uint16_value(const unsigned char *buff); u_int32 uint32_value(const unsigned char *buff); u_int48 uint48_value(const unsigned char *buff); unsigned char *uint16_buff(uint16_t val); unsigned char *uint32_buff(uint32_t val); unsigned char *uint48_buff(u_int48 val); /// @brief create a query message /// /// Creates a Dns question message which can be used to query a DNS server. /// This message is dynamically allocated, so you'll have to delete it yourself. /// /// @param qname Domain name to query. See DnsQuestion::QNAME. /// @param qtype Type of RR to query. See DnsQuestion::QTYPE for more information. /// Defaults to \p DNS_TYPE_A . /// @param rd whether we want the server to do recursion. See DnsMessage::RD. /// Defaults to \p true . /// @param qclass The class to query in. See DnsQuestion::QCLASS. Defaults to /// \p CLASS_IN . /// @return DNS message containing the query. DnsMessage *create_query(domainname qname, uint16_t qtype = DNS_TYPE_A, bool rd = true, uint16_t qclass = CLASS_IN); /*! * \brief ipv4 address * * Class representing an IPv4 address. */ class a_record { public: char address[4]; /// The four-byte IPv4 address. }; /// Gets the first address in the answer to an address query. a_record get_a_record(DnsMessage *a); /// Gets a list of addresses in the answer to an address query. stl_list(a_record) get_a_records(DnsMessage *a, bool fail_if_none = false); /** * \brief ipv6 address * * Class representing an IPv6 address. */ class aaaa_record { public: char address[16]; /// The sixteen-byte IPv6 address. }; /// Gets the first IPv6 address in the answer to an IPv6 address query. aaaa_record get_aaaa_record(DnsMessage *a); /// Gets a list of addresses in the answer to an IPv6 address query. stl_list(aaaa_record) get_aaaa_records(DnsMessage *a, bool fail_if_none = false); /** * @brief mx record * * Class representing an Mail eXchanger (MX) record. */ class mx_record { public: uint16_t preference; /**< Prefence value: the lower, the better. */ domainname server; /**< Domain name for the mail server. */ }; /// Gets the first MX record in te answer to a MX query. mx_record get_mx_record(DnsMessage *a); /// Gets a list of MX records in te answer to a MX query. stl_list(mx_record) get_mx_records(DnsMessage *a, bool fail_if_none = false); /// Gets the first NS record in te answer to a NS query. domainname get_ns_record(DnsMessage *a); /// Gets the list of NS records in te answer to a NS query. stl_list(domainname) get_ns_records(DnsMessage *a, bool fail_if_none = false); /// Gets the first PTR record in te answer to a PTR query. domainname get_ptr_record(DnsMessage *a); /// Gets the list of PTR records in te answer to a PTR query. stl_list(domainname) get_ptr_records(DnsMessage *a, bool fail_if_none = false); /// Structure for RR data returned by get_records class rrdat { public: rrdat(uint16_t, uint16_t, unsigned char *); //! constructor uint16_t type; //! rr type uint16_t len; //! rdata length unsigned char *msg; //! rdata }; /// Gets a list of all RRs in the answer section answering the DNS query. May follow CNAMEs. /// @param a /// @param fail_if_none /// @param follow_cname /// @param followed_cnames /// @return stl_list(rrdat) get_records(DnsMessage *a, bool fail_if_none = false, bool follow_cname = true, stl_list(domainname) *followed_cnames = NULL); /// Enumeration of different possible answer types enum _answer_type { A_ERROR, //! Error A_CNAME, //! Alias A_NXDOMAIN, //! Domain doesn't exist A_ANSWER, //! Answer A_REFERRAL, //! Referral to other server A_NODATA //! No such data }; /// @brief Returns the answer type of an answer message for a given query /// /// @param msg /// @param qname /// @param qtype /// /// @return answer type _answer_type check_answer_type(DnsMessage *msg, domainname &qname, uint16_t qtype); /// @brief Returns true if the given RRset is present in the DNS message section /// /// @param rrlist a list of Resource Records /// @param name the name that is looked for /// @param type type of query /// /// @return true, if requested domainname exists, false otherwise bool has_rrset(stl_list(DnsRR) &rrlist, domainname &name, uint16_t type = QTYPE_ANY); #endif /* __POSLIB_DNSMESSAGE_H */ dibbler-1.0.1/poslib/domainfn.cpp0000644000175000017500000002731112277722750013643 00000000000000/* Posadis - A DNS Server Domain functions Copyright (C) 2002 Meilof Veeningen 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., 675 Mass Ave, Cambridge, MA 02139, USA. */ #include "dnsmessage.h" #include "domainfn.h" #include "lexfn.h" #include "exception.h" #include "sysstl.h" #include "sysstring.h" void *memdup(const void *src, int len) { if (len == 0) return NULL; void *ret = malloc(len); memcpy(ret, src, len); return ret; } #define DOM_RECLEVEL 10 int dom_comprlen(message_buff &buff, int ix) { int len = 0; unsigned char x; unsigned char *ptr = buff.msg + ix, *end = buff.msg + buff.len; while (true) { if (ptr >= end) throw PException("Domain name exceeds message borders"); if (*ptr == 0) /* we're at the end! */ return len + 1; if ((*ptr & 192) == 192) { if (ptr + 1 >= end) throw PException("Compression offset exceeds message borders"); return len + 2; } x = *ptr & 192; if (x != 0) throw PException("Unknown domain label type"); len += *ptr + 1; ptr += *ptr + 1; if (len >= 255) throw PException("Domain name too long"); } } _domain dom_uncompress(message_buff &buff, int ix) { int reclevel = 0, len = 0, val; unsigned char *ptr = buff.msg + ix, *end = buff.msg + buff.len; unsigned char dbuff[255]; while (true) { if (ptr >= end) throw PException("Domain name exceeds message borders"); if (*ptr == 0) { /* we're at the end! */ dbuff[len] = '\0'; return domdup(dbuff); } if ((*ptr & 192) == 192) { if (++reclevel >= DOM_RECLEVEL) throw PException("Max dom recursion level reached"); if (ptr + 1 >= end) throw PException("Compression offset exceeds message borders"); val = (ptr[0] & 63) * 256 + ptr[1]; if (val >= (ptr - buff.msg)) throw PException("Bad compression offset"); ptr = buff.msg + val; continue; } if ((*ptr & 192) != 0) throw PException("Unknown domain label type"); if (len + *ptr + 1 >= 255) throw PException("Domain name too long"); if (ptr + *ptr + 1 >= end) throw PException("Domain name exceeds message borders"); memcpy(dbuff + len, ptr, *ptr + 1); len += *ptr + 1; ptr += *ptr + 1; } // return domdup(dbuff); } dom_compr_info::dom_compr_info(_cdomain _dom, int _ix, int _nl, int _nul) { dom = _dom; ix = _ix; nl = _nl; nul = _nul; } int dom_partiallength(_cdomain _dom, int n) { _domain dom = (_domain) _dom; int len = 0; while (--n >= 0) { len += *dom + 1; dom += *dom + 1; } return len; } void dom_write(stl_string &ret, _cdomain dom, stl_slist(dom_compr_info) *comprinfo) { if (!comprinfo) { ret.append((char *)dom, domlen(dom)); return; } stl_slist(dom_compr_info)::iterator it = comprinfo->begin(), best = comprinfo->end(); int nlabels = dom_nlabels(dom) - 1, x; int ix = ret.size(); while (it != comprinfo->end()) { if (nlabels >= it->nl && (best == comprinfo->end() || best->nul < it->nul)) { if (domcmp(domfrom(dom, nlabels - it->nl), it->dom)) { /* the same! */ best = it; if (nlabels == best->nl) break; /* perfect match */ } } ++it; } /* let's go! */ if (best == comprinfo->end()) { ret.append((char *)dom, domlen(dom)); x = nlabels; /* number of stored labels */ } else { unsigned char val; ret.append((char *)dom, dom_partiallength(dom, nlabels - best->nl)); val = (best->ix / 256) | 192; ret.append((char *)&val, 1); val = best->ix; ret.append((char*)&val, 1); x = nlabels - best->nl; /* number of stored labels */ } /* add our information to the list */ _cdomain pdom = dom; for (int z = 0; z < x; z++) { if (ix + (pdom - dom) >= 16384) break; comprinfo->push_front(dom_compr_info(pdom, ix + (pdom - dom), nlabels - z, x - z)); pdom += *pdom + 1; } } _domain domfrom(_cdomain dom, int ix) { while (ix > 0) { if (*dom == 0) throw PException("Domain label index out of bounds"); dom += *dom + 1; ix--; } return (_domain) dom; } bool domisparent(_cdomain parent, _cdomain child) { int x = domlen(parent), y = domlen(child); if (x > y) return false; return domcmp(parent, child + y - x); } int domlen(_cdomain dom) { int len = 1; while (*dom) { if (*dom > 63) throw PException(true, "Unknown domain nibble %d", *dom); len += *dom + 1; dom += *dom + 1; if (len > 255) throw PException("Length too long"); } return len; } _domain domdup(_cdomain dom) { return (_domain) memdup(dom, domlen(dom)); } bool domlcmp(_cdomain dom1, _cdomain dom2) { _domain a = (_domain) dom1; _domain b = (_domain) dom2; if (*a != *b) return false; for (int t = 1; t <= *a; t++) if (tolower(a[t]) != tolower(b[t])) return false; return true; } bool domcmp(_cdomain _dom1, _cdomain _dom2) { _domain dom1 = (_domain)_dom1, dom2 = (_domain)_dom2; if (*dom1 != *dom2) return false; int x = domlen(dom1), y = domlen(dom2); if (x != y) return false; while (*dom1) { if (*dom1 != *dom2) return false; for (int t = 1; t <= *dom1; t++) if (tolower(dom1[t]) != tolower(dom2[t])) return false; dom1 += *dom1 + 1; dom2 += *dom2 + 1; } return true; } domainname::domainname() { domain = (unsigned char *)strdup(""); } domainname::domainname(const char *string, const domainname& origin) { unsigned char tmp[DOM_LEN]; txt_to_email(tmp, string, origin.domain); domain = domdup(tmp); } domainname::domainname(const char *string, _cdomain origin) { unsigned char tmp[DOM_LEN]; txt_to_email(tmp, string, origin); domain = domdup(tmp); } domainname::domainname(message_buff &buff, int ix) { domain = dom_uncompress(buff, ix); } domainname::domainname(bool val, const unsigned char* dom) { domain = domdup(dom); } domainname::domainname(const domainname& nam) { domain = domdup(nam.domain); } domainname::~domainname() { free(domain); } domainname& domainname::operator=(const domainname& nam) { if (this != &nam) { if (domain) free(domain); domain = domdup(nam.domain); } return *this; } // cppcheck-suppress operatorEqToSelf domainname& domainname::operator=(const char *buff) { unsigned char tmp[DOM_LEN]; if (domain) { free(domain); domain = NULL; } txt_to_dname(tmp, buff, (unsigned char *)""); domain = domdup(tmp); return *this; } bool domainname::operator==(const domainname& nam) const { return domcmp(domain, nam.domain); } bool domainname::operator!=(const domainname& nam) const { return !domcmp(domain, nam.domain); } domainname& domainname::operator+=(const domainname& nam) { int lenres = domlen(domain), lensrc = domlen(nam.domain); if (lenres + lensrc - 1 > DOM_LEN) throw PException("Domain name too long"); unsigned char * tmp = (unsigned char *)realloc(domain, lenres + lensrc - 1); if (tmp != NULL) { domain = tmp; } memcpy(domain + lenres - 1, nam.domain, lensrc); return *this; } domainname& domainname::operator+(const domainname& nam) { domainname *ret = new domainname(*this); ret->operator+=(nam); return *ret; } bool domainname::operator>=(const domainname& dom) const { return domisparent(dom.domain, domain); } bool domainname::operator>(const domainname& dom) const { return !domcmp(dom.domain, domain) && domisparent(dom.domain, domain); } _domain domainname::c_str() const { if (domain == NULL) throw PException("Domain name is empty"); return domain; } int domainname::len() const { return domlen(domain); } stl_string domainname::tostring() const { return dom_tostring(domain); } int domainname::nlabels() const { return dom_nlabels(domain); } stl_string domainname::label(int ix) const { return dom_label(domain, ix); } domainname domainname::from(int ix) const { stl_string ret; unsigned char *dom = domain; while (ix > 0) { if (*dom == 0) throw PException("Domain label index out of bounds"); dom += *dom + 1; ix--; } return domainname(true, dom); } domainname domainname::to(int labels) const { unsigned char ptr[DOM_LEN]; domto(ptr, domain, labels); return domainname(true, ptr); } stl_string domainname::torelstring(const domainname &root) const { if (*this == root) { return "@"; } else if (*this >= root) { stl_string str = to(nlabels() - root.nlabels()).tostring(); str.resize(str.size() - 1); return str; } else return tostring(); } stl_string domainname::canonical () const { unsigned char val[DOM_LEN]; int len = domlen (domain); memcpy (val, domain, len); unsigned char *lenlabel = val; for (int t = 0; t < len; t++) { if (val + t == lenlabel) lenlabel += *lenlabel + 1; else val[t] = tolower (val[t]); } return std::string ((char*)val, len); } int domainname::ncommon(const domainname &dom) const { return domncommon(domain, dom.domain); } void domcat(_domain res, _cdomain src) { int lenres = domlen(res), lensrc = domlen(src); if (lenres + lensrc - 1 > DOM_LEN) throw PException("Domain name too long"); memcpy(res + lenres - 1, src, lensrc); } void domcpy(_domain res, _cdomain src) { memcpy(res, src, domlen(src)); } void domfromlabel(_domain dom, const char *label, int len) { if (len == -1) len = strlen(label); if (len > DOMLABEL_LEN) throw PException(true, "Domain name label %s too long", label); dom[0] = len; memcpy(dom + 1, label, len); dom[len + 1] = '\0'; } int dom_nlabels(_cdomain dom) { int n_labels = 1; while (*dom) { dom += *dom + 1; n_labels++; } return n_labels; } stl_string dom_label(_cdomain dom, int label) { stl_string ret; while (label > 0) { if (*dom == 0) return ""; dom += *dom + 1; label--; } ret.append((char*)dom + 1, (int)*dom); return ret; } _domain dom_plabel(_cdomain dom, int label) { unsigned char *ret = (unsigned char *)dom; if (label < 0) throw PException("Negative label accessed"); while (label--) { if (*ret == 0) throw PException("Label not in domain name"); ret += *ret + 1; } return (_domain) ret; } stl_string dom_tostring(_cdomain dom) { if (*dom == '\0') return "."; stl_string x; while (*dom != '\0') { x.append((char*)dom + 1, (int)*dom); x.append("."); dom += *dom + 1; } return x; } int domncommon(_cdomain _dom1, _cdomain _dom2) { _domain dom1 = (_domain)_dom1, dom2 = (_domain)_dom2; int a = dom_nlabels(dom1), b = dom_nlabels(dom2); if (a > b) dom1 = dom_plabel(dom1, a - b); else dom2 = dom_plabel(dom2, b - a); int x = 0; while (*dom1) { if (domlcmp(dom1, dom2)) x++; else x = 0; dom1 += *dom1 + 1; dom2 += *dom2 + 1; } return x; } int domccmp(_cdomain _dom1, _cdomain _dom2) { _domain dom1 = (_domain)_dom1, dom2 = (_domain)_dom2; int x = domncommon(dom1, dom2), y = dom_nlabels(dom1), z = dom_nlabels(dom2); if (x == y - 1) { if (x == z - 1) return 0; else return -1; } else if (x == z - 1) { return 1; } else { /* check the last label */ return strcmpi(dom_label(dom1, y - x - 2).c_str(), dom_label(dom2, z - x - 2).c_str()); } } void domto(_domain ret, _cdomain src, int labels) { _domain ptr = dom_plabel(src, labels); memcpy(ret, src, ptr - src); ret[ptr - src] = '\0'; } dibbler-1.0.1/poslib/poslib.h0000644000175000017500000001222212277722750013000 00000000000000/* Posadis - A DNS Server Include all poslib headers Copyright (C) 2002 Meilof Veeningen 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., 675 Mass Ave, Cambridge, MA 02139, USA. */ #ifndef __POSLIB_POSLIB_H #define __POSLIB_POSLIB_H /*! @page poslib Poslib documentation * * \section poslibIntro Introduction * Poslib is a DNS client/server library written in C++, which is available for * many different platforms, including Linux, FreeBSD and other Unices, but * also the Windows family of operating systems. This documentation describes * the C++ interface of Poslib. * * Poslib consists of two parts: a client part, \p libposlib, and a server * part, \p libposserver. The client library offers functionality for * resolving (see pos_cliresolver), domain-name manupulation (the domainname * class), and DNS message creation (the DnsMessage class). Also, it provices * a system-independent abstaction layer for socket functionality (socket.h). * The functions of the client library can be accessed by * \#including . * * The server library, based on the client core, can be used to develop Domain * Name System servers. By implementing a query entry-point function using the * Poslib library of functions, you can easily create DNS servers, without * worrying about low-level details such as DNS message compilation, * domain-name compression and UDP/TCP transmission. It also contains a * generic logging mechanism, as well as a threading system based on pthreads. * The poslib server functionality is in . * * See also: * - \ref poslibClient, */ /*! * \page poslibClient Using the client library * * \section clientexceptions Exceptions * * The Poslib library is built using 100% pure C++. One of the implications of * this is, that Poslib uses \b exceptions all the way. This is a very * important thing, because when a poslib function fails to do its job, it will * throw an exception to notify you of its failure, instead of just returning * an error value the C way. For this exception handling, Poslib uses its own * exception class, PException, which has one member variable, * PException::message, which will contain a description of the error. For * example, you could call a Poslib function thus: * * \code * try { * domainname x = "www"; // this might throw an exception * x += "acdam.net"; // this might fail as well * } catch (PException p) { * printf("Error during domain name construction: %s\n", p.message); * } * \endcode * * Another issue is the usage of the STL. Poslib uses the STL on several * occasions, including the nonstandard \p slist. Poslib refers to this * STL objects as \p stl_slist, \p stl_list and \p stl_string. This is because * for debug builds, we use the \p malloc_alloc allocator. These typedefs make * life with STL much easier. So, when you use Poslib STL objects, be sure to * refer to them using the \p stl_* typedefs. * * Either way, enough about this, let's start writing some code! Here's a * simple example, that will lookup an IP address for a given domain name: * * \include host.cpp * * This example uses the following Poslib functionality: * - txt_to_addr() to interpret the argument specifying the server address * - create_query() to create a query DnsMessage object * - pos_cliresolver::query() to query the DNS server * - get_a_record() to extract the A record from the answer * * Also, note the use of the \p try...catch block with the PException object * we used here. Any error that might occur will be caught by this block and * reported to the user. * * On my Linux box, I compiled this code using the following command (this * should work on any Unix box, and possibly also under Mingw's MSys for * Windows): * \verbatim g++ `poslib-config --libs --cflags` host.cpp -o host \endverbatim * * You can read more information about the various pieces Poslib contains by * viewing the source file and class documentation. */ /*! \file poslib/poslib.h * \brief Poslib main include file * * This file can be used to include all Poslib client header files in one. * See \ref poslibClient. */ #include "bits.h" #include "dnsdefs.h" #include "dnsmessage.h" #include "dnssec-sign.h" #include "domainfn.h" #include "exception.h" #include "lexfn.h" #include "masterfile.h" #include "postime.h" #include "random.h" #include "resolver.h" #include "rr.h" #include "socket.h" #include "syssocket.h" #include "sysstl.h" #include "sysstring.h" #include "types.h" #include "vsnprintf.h" #endif /* __POSLIB_POSLIB_H */ dibbler-1.0.1/poslib/masterfile.h0000644000175000017500000001335712277722750013655 00000000000000/* Posadis - A DNS Server Master file reading functionality Copyright (C) 2002 Meilof Veeningen 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., 675 Mass Ave, Cambridge, MA 02139, USA. */ #ifndef __POSLIB_MASTERFILE_H #define __POSLIB_MASTERFILE_H #include #include "dnsmessage.h" #include "domainfn.h" /*! \file poslib/masterfile.h * \brief Master file reading routines * * In this file, you will find everything you need to start reading and * interpreting master files today! */ /*! * \brief error callback function * * This user callback function will be called by #read_master_file if a * non-terminal error has occured in the master file (e.g. one RR could * not be read). It can be handled by the application to display the error * message. * \sa #read_master_file * \param user_dat User data supplied to #read_master_file * \param fname File name of the master file * \param linenum Current line number * \param message The error message */ typedef void(*error_callback)(void *user_dat, const char *fname, int linenum, const char *message); /*! * \brief literal RR callback function * * Callback function getting literal RR data back from the reader. This can * be used by editors to preserve the way the user spelled an RR, for example * by using '2h' instead of 7200. The implication of this is that there is * no guarantee the actual RR data has the right syntax. If however this is * not the case, the error callback is called. If the data contains data * relative to a non-znroot origin, it is converted to make it relative to the * zone root. * \sa #read_master_file * \param user_dat User data supplied to #read_master_file * \param dom The domain name * \param ttl TTL value * \param type The RR type * \param rrdata The RR data * \param origin The zone root */ typedef void(*rr_literal_callback)(void *user_dat, const char *dom, const char *ttl, const char *type, const char *rrdata, domainname origin); /*! * \brief compiled RR callback function * * Callback function getting a compiled resource record. * \sa #read_master_file * \param user_dat User data supplied to #read_master_file * \param rr The RR */ typedef void(*rr_callback)(void *user_dat, DnsRR *rr); /*! * \brief comment callback function * * Callback function for line comments, that is lines beginning with a ';' * sign. These can be used to embed configuration options in master files. * \sa #read_master_file * \param user_dat User data supplied to #read_master_file * \param comment The comment (with the initial ';' chomped off) */ typedef void(*comment_callback)(void *user_dat, const char *comment); #define POSLIB_MF_AUTOPROBE 1 /**< ignore given znroot and guess from file name */ #define POSLIB_MF_NOSOA 2 /**< Do not require SOA record */ /*! * \brief read master files * * This function will read the given master file for you, calling the * supplied callbacks when nessecary. This function contains a fairly simple * lexical analyzer which supports most standard master file features, but * not the '$include' functionality. If the function detects a syntax error, * it will call the error callback function, but it will continue reading * the file. * \param file Master file to open * \param znroot Root domain of zone * \param userdat User data supplied to callbacks * \param err Error callback function called when an error occurs * \param rr_cb Callback called for each RR, passing binary data (optional) * \param rrl_cb Callback called for each RR, passing literal data (optional) * \param comm_cb Callback for comments (optional) * \param flags One of POSLIB_MF_AUTOPROBE, POSLIB_MF_NOSOA */ void read_master_file(const char *file, domainname &znroot, void *userdat, error_callback err, rr_callback rr_cb, rr_literal_callback rrl_cb, comment_callback comm_cb, int flags); /*! * \brief guess zone name from file name * * This function will do an educated guess on the zone name for a given file. * For example, a file called 'db.acdam.net' will probably be of the 'acdam.net' * zone. Supported are the 'db.' prefix and the '.prm' postfix. * \param file file name * \return Guess for zone name */ domainname guess_zone_name(const char *file); /*! * \brief try and open a file for reading * * This function tests whether the given filename is a directory, and if it * isn't, it will try opening it and return a C-style FILE* pointer. * \param file file name * \return FILE* pointer, or \p NULL on error */ FILE *try_fopen_r(const char *file); /*! * \brief try and open a file * * This function tests whether the given filename is a directory, and if it * isn't, it will try opening it and return a C-style FILE* pointer. * @param file file name * @param mode access mode * @return FILE* pointer, or \p NULL on error */ FILE *try_fopen(const char *file, const char *mode); /*! * \brief check for existence of file * * This function tests whether the given file exists and is a common file. * \param file file name * \return \p true if the file exists, \p false otherwise */ bool file_exists(const char *file); #endif /* __POSLIB_MASTERFILE_H */ dibbler-1.0.1/poslib/lexfn.h0000644000175000017500000002232512277722750012631 00000000000000/* Posadis - A DNS Server Lexical functions Copyright (C) 2002 Meilof Veeningen 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., 675 Mass Ave, Cambridge, MA 02139, USA. */ #ifndef __POSLIB_LEXFN_H #define __POSLIB_LEXFN_H /** \file poslib/lexfn.h * \brief lexical functions * * Functions for converting free-form text to various types of data. */ #include "types.h" #include "socket.h" #include "sysstl.h" #include "dnsdefs.h" /** * \brief convert text to boolean * * Converts text to a boolean value. The following positive values are * supported: \p yes \p true \p 1 \p on \p yo \p absolutely . The following * negative values are supported: \p no \p false \p 0 \p off \p nope \p never . * \param buff Buffer containing boolean * \return Either true or false. */ bool txt_to_bool(const char *buff); /** * \brief convert text to numbers * * Converts text to a number. This function uses postfix operators, and can * also handle negative amounts. * \param buff Buffer containing text * \return Numeric value of the buffer * \sa \ref txt_to_int */ int txt_to_negint(const char *buff); /** * \brief convert text to numbers * * Converts text to a number. This function uses postfix operators. It doesn't * support negative numbers. * \param buff Buffer containing text * \return Numeric value of the buffer * \sa \ref txt_to_negint */ int txt_to_int(const char *buff); /** * \brief convert text to ipv4 * * Converts the text to an IPv4 address. As an extension, Poslib also supports * the literal \p any value, which maps to \p 0.0.0.0 and the \p local value, * which maps to \p 127.0.0.1 . * \param ip Target * \param buff Source * \param do_portion If true, also accept portions such as 192.*. * \return The number of nodes of the address (4 for a complete one) */ int txt_to_ip(unsigned char ip[4], const char *buff, bool do_portion = false); /** * \brief Size of an IP range buffer * * The size, in characters, of an IP range buffer. */ #define sz_iprange 8 /** * \brief Convert text to an IP range * * Converts the buffer to an IPv4 IP range, in the form of ip[/nsig]. * \param iprange Result buffer (should be of size \ref sz_iprange). * \param val String value describing the range */ void txt_to_iprange(unsigned char *iprange, const char *val); /** * \brief Checks for IPv4 ranges * * Returns \p true if the given IP number is in the given IP range. * \param iprange The IP range * \param ip The IPv4 number * \return \p true if the ip is within the range * \sa \ref txt_to_ip, \ref txt_to_iprange */ bool iprange_matches(const unsigned char *iprange, const unsigned char *ip); /** * \brief convert text to ipv6 * * Converts the text to an IPv6 address. As an extension, Poslib also supports * the literal \p :any value, mapping to \p ::0 and the \p :local value, * mapping to \p ::1 . * * \param ipv6 Target * \param buff Source * \param do_portion If true, also accepts portions such as dead:beef:* * \return The number of nodes of the address (16 for a complete one) */ int txt_to_ipv6(unsigned char ipv6[16], const char *buff, bool do_portion = false); /** * \brief Size of an IPv6 range buffer * * The size, in characters, of an IPv6 range buffer. */ #define sz_ip6range 32 /** * \brief Convert text to an IPv6 range * * Converts the buffer to an IPv6 IP range, in the form of ip[/nsig]. * \param iprange Result buffer (should be of size \ref sz_ip6range). * \param val String value describing the range */ void txt_to_ip6range(const char *iprange, const char *val); /** * \brief Checks for IPv6 ranges * * Returns \p true if the given IPv6 number is in the given IP range. * \param iprange The IPv6 range * \param ip The IPv6 number * \return \p true if the ip is within the range * \sa \ref txt_to_ipv6, \ref txt_to_ip6range */ bool ip6range_matches(const unsigned char *iprange, const unsigned char *ip); /** * \brief Size of an generic address range buffer * * The size, in characters, of an generic address range buffer. */ #define sz_addrrange 33 /** * \brief Convert text to an address range * * Converts the buffer to an address IP range, in the form of ip[/nsig]. * \param iprange Result buffer (should be of size \ref sz_addrrange). * \param val String value describing the range */ void txt_to_addrrange(unsigned char *iprange, const char *val); /** * \brief Checks for range matches * * Returns \p true if the given address number is in the given IP range. * \param iprange The address range * \param a The address * \return \p true if the ip is within the range * \sa \ref txt_to_addrrange */ bool addrrange_matches(const unsigned char *iprange, _addr *a); /** * \brief Address range class */ class addrrange { public: unsigned char range[sz_addrrange]; }; /** * \brief looks item up in match list * * This function returns true if the given address matches one of the address * match items of the address match list. * \param lst Address range list * \param a Address to check * \return true if the address matches one of the items in the list */ bool in_addrrange_list(stl_list(addrrange) &lst, _addr *a); #ifdef HAVE_SLIST /** * \brief looks item up in match list * * This function returns true if the given address matches one of the address * match items of the address match list. * \param lst Address range list * \param a Address to check * \return true if the address matches one of the items in the list */ bool in_addrrange_list(stl_slist(addrrange) &lst, _addr *a); #endif /** * \brief looks item up in address list * * This function returns true if the given address is one of the addresses * in the address match list. * \param lst Address list * \param a Address to check * \param match_port Whether the port should also match * \return true if the address matches one of the items in the list */ bool in_addr_list(stl_list(_addr) &lst, _addr *a, bool match_port = false); #ifdef HAVE_SLIST /** * \brief looks item up in address list * * This function returns true if the given address is one of the addresses * in the address match list. * \param lst Address list * \param a Address to check * \param match_port Whether the port should also match * \return true if the address matches one of the items in the list */ bool in_addr_list(stl_slist(_addr) &lst, _addr *a, bool match_port = false); #endif /** * \brief convert e-mail address to binary domain name * * Converts the domain name or email address in src to a binary domain name. * \param target Target * \param src Source * \param origin Origin for relative domain names */ void txt_to_email(_domain target, const char *src, _cdomain origin = NULL); /** * \brief convert text domain name to binary domain name * * Converts the domain name or in src to a binary domain name. * \param target Target * \param src Source * \param origin Origin for relative domain names */ void txt_to_dname(_domain target, const char *src, _cdomain origin = NULL); void txt_to_addr(_addr *ret, const char *addr, int default_port = DNS_PORT, bool is_client = true); /*! * \brief convert text to LOC RR * * Converts the text pointed to by rr to LOC information as described in * RFC 1876. * \param res (used to be: Memory to store result in (should be >= 16 bytes)) * \param src * */ void txt_to_loc(unsigned char *res, char *&src); /*! * \brief convert text to DNS class * * Converts text to one of the class constants supported by DNS (CLASS_IN, * CLASS_HS, CLASS_CH, CLASS_CS), or, if allow_q is set, possibly to a * supported QCLASS (CLASS_NONE or CLASS_ANY). Only symbolic constants are * allowed; numeric values result in an exception. * \param str String to convert * \param allow_q Whether to allow QCLASSes (defaults to true) * * \return A DNS CLASS or QCLASS constant */ uint16_t txt_to_qclass(const char *str, bool allow_q = true); stl_string str_type(u_int16 type); /**< Returns string representation for the RR type. */ stl_string str_qtype(u_int16 qtype); /**< Returns string representation for the QTYPE. */ stl_string str_class(u_int16 ctype); /**< Returns string representation for the RR CLASS. */ stl_string str_qclass(u_int16 qctype); /**< Returns string representation for the QCLASS. */ stl_string str_opcode(u_int16 opcode); /**< Returns string representation for the OPCODE. */ stl_string str_rcode(int rcode); /**< Returns string representation for the RCODE. */ stl_string str_ttl(uint32_t ttl); /**< Returns string representation for the ttl (e.g. 2h1m) */ stl_string str_loc(const unsigned char *rr); /**< Returns string representation for a LOC RR */ stl_string intstring(u_int16 x); /**< Converts int to string */ #endif /* __POSLIB_LEXFN_H */ dibbler-1.0.1/poslib/sysstring.h0000664000175000017500000000245212233256142013550 00000000000000/* Posadis - A DNS Server Universal include file for string functions Copyright (C) 2002 Meilof Veeningen 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., 675 Mass Ave, Cambridge, MA 02139, USA. */ #ifndef __POSLIB_SYSSTRING_H #define __POSLIB_SYSSTRING_H #include #include #include #include /* linux & bloodshed string comp functions have other names than the win32 ones */ #if !defined(__BORLANDC__) && !defined(WIN32) #define stricmp strcasecmp #define strcmpi strcasecmp #define strncmpi strncasecmp #endif #ifdef WIN32 #define strncmpi _strnicmp #endif #include "vsnprintf.h" #endif /* __POSLIB_SYSSTRING_H */ dibbler-1.0.1/poslib/ChangeLog-poslib0000664000175000017500000002635712233256142014404 00000000000000ChangeLog for Poslib Stable CVS * Initial cache file mode for master files no longer gives the "non-initial SOA ignored" message * Made ServerSocket virtual as it should have been * Made the server list a list of ServerSocket*'s rather than ServerSockets (thanks to the misdesign of the STL) * Added NONE/ANY values for classes/types required for DNS update (i.e. constant definitions and lexical function support) * Added support for empty records in case of DNS update messages * Fixed Borland C++ makefiles to fix requirement of a complete rebuild after changes * Fixed one-off (too conservative) error in DNS message reading * Made lower level DNS message functions (read/write RR) publicly available * Added rr_torelstring * Added txt_to_class * Removed extra trailing space in rr_to(rel)string * When SOA record is converted to string, TTL short notation (i.e. 2h) is used. * Reading master file without autoprobing: origin is set to zone root by default. * Added support for "none" IPv4 address, added addr_is_any and addr_is_none functions * Switched to pkg-config (removing the poslib-config script) * Default prefix /usr removed (i.e., will now be /usr/local) * Replaced yet more char*s by const char* * Added support for .123. and .123 type domain names * Fixed bug in handling of unknown RRs * Renamed poslib-config.h to poslib.h (hope this doesn't break things) * Fixed bug in pthread detection, causing problems with OpenBSD. * Added rr_property_to_string, for more advanced RR-to-string functions * Mass-conversion char->unsigned char * Fixed bug where rr_getip6 would return only four bytes * Fixed bug in converting character strings and WKS records to string * Fixed bug in domain name compression (seems to have got lost along the way) Version 1.0.5 * Master file reader now allows you to skip certain checks to make it more useful for initial cache files. * Also accept ".dns" extension for master files * Win32 poll implementation: if we're not waiting for sockets, do timeout rather than direct return. Version 1.0.4 * Show zero TTL's as '0', not '' * Fixed error message for invalid TTLs * LOC (location) RR support * Fixed bug in master file reading when parsing comments in multi-line RRs * Fixed bug in master file where strange things would happen with commented parentheses Version 1.0.3 * Fixed bug where queries with the RD bit would be answered, possibly causing a flood in combination with IP spoofing. [Thanks to roy at dnss.ec] * Fixed bug where, if Posadis is at its max number of threads and it receives a message with size smaller than the buffer size, the ID with which an answer is sent back is wrong. [Thanks to dou0228 at msn.com] * Fixed bug where posthreads would neither be joined nor detached, causing a memory leak. [Thanks to dou0228 at msn.com] * Fix check for -lpthread on Linux * Fixed bug where "no threads left" error answer code would assert the question list being nonempty. * Made the fix for non-detached posthreads more Borland C++/pthreadVC.dll-proof (detaching a joined thread apparently results in undefined behavior; for Borland C++ this means a crash). * Removed erroneous in_addr6 references in Windows IPv6 code * Added poslib_config_init() function to reset config values * Made poslib/server/server.h include configuration.h * Added configuration.h to poslib/server/server.h * Fixed bug for /length-type IP ranges Version 1.0.2 * Changed occurences of "RR" in domain function error messages to "domain". * Fixed bug while attempting to refer to domain names with offset >= 16384 in DNS message (doesn't fit in compression pointer) * Now automagically set the ID of an answer message to the ID of the query * If truncation happens in answer or authority, also set item count of remaining sections to zero. * If we get an answer which is not truncated at a RR border with right AN,NS,AD-counts, we still accept the answer as truncated and retry the query * Made IPv6 work again with Borland C++ * Fixed bug where masterfile.cpp would not be compiled along with Borland C++ * Added more logically named addr_is_* alternatives to sock_is_* * Fixed bug causing pos_srvresolver to block if sending the query failed (this will probably only occur if the server sockets haven't been opened properly) * Fixed bug where the .dead:beeef extension to domain names would be postfixed by ipv6.int rather than ip6.int * For performance reasons, the configuration settings are now no longer protected by mutexes; if you want to set 'em, do it before starting the server thread. * Fixed bug where, if IPv6 support was enabled but no sockaddr_storage was available (Win32 systems, mainly), Posadis would use the smaller sockaddr structure, resulting in crashes if it was actually used. * Fixed problem where a completely empty master file gave an "Unexpected EOF" error. * The log implementation now flushes the log file after writing a message. * Fixed bug where exceptions in the cliresolver would not be correctly handled. * Now automagically try another server if a SRVFAIL, REFUSED or NOTIMP is found as an answer in pos_cliresolver. * Very simple, more efficient, possimplerandom() implementation * Grep s/authoritive/authoritative/ * Enhanced pseudo-domain support: support ns1..dead::beef * Fixed problem with poslib-config with non-bash shells * Fixed typo: 'quites'->'quotes' * Added support for "y", "j" and "n" booleans * Added check_answer_type, has_rrset functions Version 1.0.1 * Put off optimisations by default (caused problems on FreeBSD) * Build fixes for FreeBSD * Fixed _really_ stupid bug where txt_to_bool would always return true (thanks to Aleksandr Chechulin) * Fixed bug causing TCP queries not to work in some cases * Made waiting for TCP data use end time rather than twice the half timeout. * Made txt_to_int only return nonnegative numbers, and make it not accept only postfixes anymore. Added txt_to_negint which also supports negative numbers. * Fixed problem in master file reader causing inexplicit domain names not to work. Version 1.0 * Added dnstimeago to Unix tarballs * Added stl_list variant of addrrange function * Fixed memory leak (thanks John MacDonald) in zero-byte allocations * Added posclient_quitflag to make socket functions end more quickly * Made UDP sockets SO_REUSEADDR as well Version 0.9.7 (31 May 2003) * Fixed issue where addr_in_list(slist, ...) would not be available because pos6-config.h was not included. * Added option to include the function pointer logging functionality, but not use it yet by setting function pointer to NULL. * Fixed function pointer logging bug * Fixed w32poll: struct timeval uses microsec rather than millisec (causes 100% CPU usage under Windows) * Made standard logging variables available if POS_DEFAULTLOG is not defined (so that other source files can use then), and documented them. * Added decent vsnprintf() check for Unix (caused problems in logging) Version 0.9.6 (23 May 2003) * Added address range class * Added str_ttl function * Poslib now sets the QR bit for you * Added in_addr_list function * Added postime_t::operator+= * Now make clients explicitly open srvresolver * Added option to disable stderr logging on runtime Version 0.9.5 (4 March 2003) * API addition: read_line's line counter would point to next line rather than current. * Support for literal "any" and "local" strings as IPv4/6 addresses. * Made pos_cliresolver::query() start at a random position in the query list. * Added support for IP ranges with netmasks * Threads amount limit * TCP connections limit/support for priority clients * Made UDP server sockets nonblocking * Added master file reading functionality * Fixed really stupid txt_to_email bug * Fixed POS_DEFAULTLOG_FILE (didn't work at all!) * added possimplerandom() Version 0.9.4 (25 February 2003) * Now return an error for character strings that are too long. * Added various small dom_ functions, including domncommon(); * read_entry no longer unescapes chars other than space or tab * Added domainname::to and ::torelstring() * rr_fromstring now uses const char * * Added support for WKS * Added qtype_getcode() function Version 0.9.3 (8 February 2003) * Added txt_to_bool() function. * Removed 'f' RR property type (should be 'n') * Added support for reading TXT, HINFO rrs from master files * Fixed read_entry to support spaces and tabs within quotes * Replaced some instances of 'string' by 'stl_string' in fileclient and fileserver. * Malloc_alloc allocation now works on my newly installed debian box. Expect some leak test results soon! * Fixed memory leak in DnsMessage::compile(), and other small leaks. * PACKAGE and VERSION are no longer in poslib-config.h * Now default flags=Q_DFL for 2nd pos_resolver::query() function in implementations. * Added read_line function from Pos6, which can really help master file reading routines. * Fixed txt_to_int to return correct "incorrect numeric value %s" message. * Fixed crash when copying an PException(). Additionally, PException("") now sets message to "" instead of NULL. * Now using autoconf-2.52, thus no acconfig.h anymore Version 0.9.2 (20 January 2003) * Changed default prefix to '/usr/' * Now also default flags=Q_DFL for query with server list * Added user cleanup function to Poslib * Compilation fixes (Debian on RISC, *BSD) * Fixed problem where a mutex could be used before its initialization, depending on your compilers class construction order. * Enhanced pthreads check in configure.in * Enhanced ipv6 check in configure.in * Now works on Debian Alpha * Fixed important segfaults in txt_to_email, txt_to_ip (causing const data to be written to). * Bugfix for txt_to_ipv6 (set s_family to AF_INET instead of AF_INET6) * Fixed address_lookup for ipv6 * Added Posadis extension to support .192.168.*-type domain names * Fixed typo ("zondata" instead of "zonedata") * Poslib-config output for --libs --server now on one line (fixes some configure problems) * Fixed poslib-config to avoid problems when echo doesn't support "-n" (for example on Solaris). Version 0.9.1 (22 december 2002) * Some documentation fixes * Added support for Borland C++ * Added async stop for pos_cliresolver * Fixed bug causing server to crash when calling requestid_checkexpired * Fixed bug for wicked compilers trying to initialize their own stuff before the poslib static constructor for pos_resolver was called. * Added CNAME, QTYPE=ANY following to get_records() * Fixed tocstr() * Added support for Kylix OE 3.0 * Maded pos_cliresolver interruptable * Better and more portable random-numbers (more specifically, it should also work on OSX). * Changed addr_to_string order * Important txt_to_email fix (in fact this didn't quite work until now. * Minor txt_to_ip bug fix (192.168.1. would be interpreted as 192.168.1.0) * Implemented domainname::operator!= * Now works on OSX * Bugfix for domainname::operator+ * Implemented operator>> (NOTE: the meaning of the operator has changed since the CVS release of 18-12-2002! Check the docs for details) * Domainname::from fix * Removed "additional section processing" option from DNS_TYPE_CNAME Version 0.9.0 (30 novermber 2002) * Initial public release dibbler-1.0.1/poslib/postime.cpp0000664000175000017500000000723212233256142013517 00000000000000/* Posadis - A DNS Server Posadis time functions Copyright (C) 2002 Meilof Veeningen 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., 675 Mass Ave, Cambridge, MA 02139, USA. */ #include "dibbler-config.h" #include "postime.h" #include #if defined(WIN32) #include #else #include #endif #include #ifndef HAVE_GETTIMEOFDAY #include #include //typedef int timezone; void gettimeofday(timeval *a, int *b) { struct timeb _gettimeofday_tmp; ftime(&_gettimeofday_tmp); a->tv_sec = _gettimeofday_tmp.time; a->tv_usec = _gettimeofday_tmp.millitm * 1000; } #endif postime_t::postime_t() { sec = 0; msec = 0; } postime_t::postime_t(int msecs) { sec = msecs / 1000; msec = msecs % 1000; } bool postime_t::operator==(const postime_t& tm) { return (sec == tm.sec && msec == tm.msec); } bool postime_t::operator<=(const postime_t& tm) { return (sec < tm.sec || (sec == tm.sec && msec <= tm.msec)); } bool postime_t::operator<(const postime_t& tm) { return (sec < tm.sec || (sec == tm.sec && msec < tm.msec)); } bool postime_t::operator>=(const postime_t& tm) { return (sec > tm.sec || (sec == tm.sec && msec >= tm.msec)); } bool postime_t::operator>(const postime_t& tm) { return (sec > tm.sec || (sec == tm.sec && msec > tm.msec)); } bool postime_t::operator>(const timespec& tm) { return (sec > tm.tv_sec || (sec == tm.tv_sec && msec > (tm.tv_nsec / 1000000))); } int postime_t::after(const postime_t &tm) { return (sec - tm.sec) * 1000 + (msec - tm.msec); } postime_t postime_t::operator+(int msecs) { postime_t ret = postime_t(); long x = msec + msecs; ret.msec = x % 1000; ret.sec = sec + x / 1000; return ret; } postime_t& postime_t::operator+=(int msecs) { long x = msec + msecs; msec = x % 1000; sec = sec + x / 1000; return *this; } postime_t postime_t::operator-(const postime_t &tm) { postime_t res = postime_t(); long x = msec - tm.msec; res.msec = x % 1000; res.sec += sec - tm.sec + x / 1000; return res; } postime_t postime_t::operator+(const postime_t &tm) { postime_t res = postime_t(); long x; x = msec + tm.msec; res.msec = x % 1000; res.sec = sec + tm.sec + x / 1000; return res; } postime_t &postime_t::operator+=(const postime_t &tm) { long x; x = msec + tm.msec; msec = x % 1000; sec = sec + tm.sec + x / 1000; return *this; } postime_t& postime_t::operator=(const postime_t &tm) { sec = tm.sec; msec = tm.msec; return *this; } postime_t getcurtime() { timeval tmp; postime_t res; gettimeofday(&tmp, NULL); res.sec = tmp.tv_sec; res.msec = tmp.tv_usec / 1000; return res; } timespec postimespec(int timeout) { timespec end; timeval end2; gettimeofday(&end2, NULL); end.tv_sec = end2.tv_sec; end.tv_nsec = end2.tv_usec * 1000; end.tv_nsec += ((timeout % 1000) * 1000000); end.tv_sec += (timeout / 1000) + (end.tv_nsec / 1000000000); end.tv_nsec = end.tv_nsec % 1000000000; return end; } dibbler-1.0.1/poslib/random.h0000664000175000017500000000260412233256142012762 00000000000000/* Posadis - A DNS Server Include file for randomize functions Copyright (C) 2002 Meilof Veeningen 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., 675 Mass Ave, Cambridge, MA 02139, USA. */ #ifndef __POSLIB_RANDOM_H #define __POSLIB_RANDOM_H /*! \file poslib/random.h * \brief returns random numbers * * This source file hosts the posrandom() function for generating random * numbers. */ /*! * \brief return strong random number * * This function returns a strongly random number that should be unpredictable. */ int posrandom(); /*! * \brief return simple random number * * This function returns a simple random number, and therefore, it is much * faster than posrandom(). */ int possimplerandom(); #endif /* __POSLIB_RANDOM_H */ dibbler-1.0.1/poslib/bits.h0000644000175000017500000000537312277722750012462 00000000000000/* Posadis - A DNS Server Bit manipulation Copyright (C) 2002 Meilof Veeningen 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., 675 Mass Ave, Cambridge, MA 02139, USA. */ #ifndef __POSLIB_BITS_H #define __POSLIB_BITS_H /*! \file poslib/bits.h * \brief bitmask manipulation * * This source file provides some macros to easily handle bit masks, which * are basically just character arrays. These macros do not handle the creation * of bitmasks, so you'll need to do that yourself. To create a bitmask for * x bits, allocate a character array of (x + 7) / 8 bytes. And be sure to * memset() it to reset all bits in one! Also note the first bitmap index is * zero and the last one is x - 1. */ /*! * \brief set a bit in the bitmask * * Sets the bit value for the given bit in the bitmask. * \param a The bitmask, a character array * \param b Bit index in the bitmask */ #define poslib_bitset(a, b) ( (a)[b / 8] |= 1 << (7 - (b % 8)) ) /*! * \brief reset a bit in the bitmask * * Resets the bit value for the given bit in the bitmask. * \param a The bitmask, a character array * \param b Bit index in the bitmask */ #define poslib_bitreset(a, b) ( (a)[b / 8] &= ~(1 << (7 - (b % 8))) ) /*! * \brief sets the value of a bit in the bitmask * * Sets the value of a bit in the bitmask. If c is non-zero, the given bit is * set, otherwise, the given bit is reset. This can come in handy if you want * to do #bitsetval(a, b, #bitisset(c, d)). * \param a The bitmask, a character array * \param b Bit index in the bitmask * \param c Boolean value to set the bit to */ #define bitsetval(a, b, c) ( (c) ? poslib_bitset(a, b) : poslib_bitreset(a, b) ) /*! * \brief checks whether a bit is set * * This function checks whether a given bit in the bitmask is set. If the bit * is set, the function returns nonzero. Note that it _might_ return 1, but * that it usually doesn't so don't depend on that! * \param a The bitmask, a character array * \param b Bit index in the bitmask * \return Nonzero if the bit is, set, zero if not. */ #define bitisset(a, b) ( (a)[b / 8] & (1 << (7 - (b % 8))) ) #endif /* __POSLIB_BITS_H */ dibbler-1.0.1/poslib/dnsmessage.cpp0000644000175000017500000004713112277722750014203 00000000000000/* Posadis - A DNS Server Dns Message handling Copyright (C) 2002 Meilof Veeningen 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., 675 Mass Ave, Cambridge, MA 02139, USA. */ #include "sysstl.h" #include "dnsmessage.h" #include "domainfn.h" #include "exception.h" #include "rr.h" #include "lexfn.h" #include "dnssec-sign.h" message_buff::message_buff() { is_static = false; msg = NULL; len = 0; } message_buff::message_buff(unsigned char *_msg, int _len, bool _is_dynamic) { is_static = !_is_dynamic; msg = _msg; len = _len; } message_buff::message_buff(const message_buff& buff) { if (buff.is_static) { msg = buff.msg; len = buff.len; is_static = true; } else { if (buff.msg) msg = (unsigned char *)memdup(buff.msg, buff.len); else msg = NULL; len = buff.len; is_static = false; } } message_buff::~message_buff() { if (!is_static) free(msg); } message_buff& message_buff::operator=(const message_buff& buff) { if (this != &buff) { if (buff.is_static) { msg = buff.msg; len = buff.len; is_static = true; } else { if (buff.msg) msg = (unsigned char *)memdup(buff.msg, buff.len); else msg = NULL; len = buff.len; is_static = false; } } return *this; } DnsQuestion::DnsQuestion() :QNAME(""), QTYPE(0), QCLASS(CLASS_IN) { } DnsQuestion::DnsQuestion(const DnsQuestion& q) :QNAME(q.QNAME), QTYPE(q.QTYPE), QCLASS(q.QCLASS) { } DnsQuestion& DnsQuestion::operator=(const DnsQuestion &q) { if (this != &q) { QNAME = q.QNAME; QTYPE = q.QTYPE; QCLASS = q.QCLASS; } return *this; } DnsQuestion::DnsQuestion(domainname _QNAME, u_int16 _QTYPE, u_int16 _QCLASS) { QNAME = _QNAME; QTYPE = _QTYPE; QCLASS = _QCLASS; } DnsQuestion::~DnsQuestion() { } DnsRR::DnsRR() :NAME(""), TYPE(0), CLASS(CLASS_IN), TTL(0), RDLENGTH(0), RDATA(NULL), presign_RDLENGTH(0), presign_RDATA(NULL) { } DnsRR::DnsRR(domainname name, u_int16 type, u_int16 rrClass, u_int32 ttl) :NAME(name), TYPE(type), CLASS(rrClass), TTL(ttl), RDLENGTH(0), RDATA(NULL), presign_RDLENGTH(0), presign_RDATA(NULL) { } DnsRR::DnsRR(domainname name, u_int16 type, u_int16 rrClass, u_int32 ttl, uint16_t _RDLENGTH, const unsigned char *_RDATA) :NAME(name), TYPE(type), CLASS(rrClass), TTL(ttl) { RDLENGTH = _RDLENGTH; RDATA = (unsigned char *)memdup(_RDATA, _RDLENGTH); presign_RDATA = NULL; presign_RDLENGTH = 0; } DnsRR::DnsRR(const DnsRR& rr) :NAME(rr.NAME), TYPE(rr.TYPE), CLASS(rr.CLASS), TTL(rr.TTL) { RDATA = (unsigned char *)memdup(rr.RDATA, rr.RDLENGTH); RDLENGTH = rr.RDLENGTH; presign_RDATA = NULL; presign_RDLENGTH = 0; if (rr.presign_RDATA) { presign_RDATA = (unsigned char*)memdup(rr.presign_RDATA, rr.presign_RDLENGTH); presign_RDLENGTH = rr.presign_RDLENGTH; } } DnsRR::~DnsRR() { if (RDATA) free(RDATA); if (presign_RDATA) free(presign_RDATA); } DnsRR& DnsRR::operator=(const DnsRR& rr) { if (this != &rr) { free(RDATA); NAME = rr.NAME; TYPE = rr.TYPE; CLASS = rr.CLASS; TTL = rr.TTL; RDATA = (unsigned char *)memdup(rr.RDATA, rr.RDLENGTH); RDLENGTH = rr.RDLENGTH; presign_RDATA = (unsigned char*)memdup(rr.presign_RDATA, rr.presign_RDLENGTH); presign_RDLENGTH = rr.presign_RDLENGTH; } return *this; } bool DnsRR::operator==(const DnsRR& other) { return (TYPE == other.TYPE && TTL == other.TTL && RDLENGTH == other.RDLENGTH && CLASS == other.CLASS && NAME == other.NAME && memcmp(RDATA, other.RDATA, RDLENGTH) == 0); } #define INTCMP(x, y) ( (x)<(y)?-1: ((x)==(y)?0:-1) ) #define COMPARE(expr) { int tmp; if ((tmp = (expr)) != 0) return tmp; } #define SPECIFIC(x, y, expr) if ( (x)==(expr) && (y)!=(expr) ) return -1; \ else if ( (y)==(expr) && (x)!=(expr) ) return 1 int DnsRR::compareTo(const DnsRR& other) const { COMPARE(INTCMP(CLASS, other.CLASS)); COMPARE(domccmp(NAME.c_str(), other.NAME.c_str())); SPECIFIC(TYPE, other.TYPE, DNS_TYPE_SOA); COMPARE(INTCMP(TYPE, other.TYPE)); COMPARE(INTCMP(TTL, other.TTL)); COMPARE(INTCMP(rr_tostring(TYPE, RDATA, RDLENGTH).c_str(), rr_tostring(other.TYPE, other.RDATA, other.RDLENGTH))); return 0; } bool DnsRR::operator<(const DnsRR& rr) const { return compareTo(rr) == -1; } bool DnsRR::operator<=(const DnsRR& rr) const { return compareTo(rr) <= 0; } bool DnsRR::operator>(const DnsRR& rr) const { return compareTo(rr) == 1; } bool DnsRR::operator>=(const DnsRR& rr) const { return compareTo(rr) >= 0; } DnsMessage::DnsMessage() { ID = 0; QR = false; OPCODE = 0; AA = false; TC = false; RD = false; RA = false; Z = 0; RCODE = 0; tsig_rr = NULL; tsig_rr_signtime = 0; // pick current time during message sending } DnsMessage::~DnsMessage() { if (tsig_rr) delete tsig_rr; } DnsMessage* DnsMessage::initialize_answer () { DnsMessage *a = new DnsMessage (); if (tsig_rr) a->tsig_rr = new DnsRR (*tsig_rr); a->sign_key = sign_key; return a; } /* flags != 0 currently means we accept zero-length (UPDATE) rrs */ DnsRR DnsMessage::read_rr(message_buff &buff, int &pos, int flags) { DnsRR rr; int x; domainname dom; if (pos >= buff.len) throw PException("Message too small for RR"); x = dom_comprlen(buff, pos); if (pos + x + 10 > buff.len) throw PException("Message too small for RR"); rr.NAME = domainname(buff, pos); rr.TYPE = uint16_value(buff.msg + pos + x); rr.CLASS = uint16_value(buff.msg + pos + x + 2); rr.TTL = uint32_value(buff.msg + pos + x + 4); pos += x + 10; x = uint16_value(buff.msg + pos - 2); if (x != 0 || !flags) rr_read(rr.TYPE, rr.RDATA, rr.RDLENGTH, buff, pos, x); pos += x; return rr; } void DnsMessage::read_section(stl_list(DnsRR)& section, int count, message_buff &buff, int &pos, unsigned int *tsig_pos) { while (--count >= 0) { int origpos = pos; DnsRR rr = read_rr(buff, pos, (OPCODE == OPCODE_UPDATE) ? 1 : 0); if (rr.TYPE == DNS_TYPE_TSIG && tsig_pos) *tsig_pos = origpos; section.push_back(rr); } } int DnsMessage::read_from_data(unsigned char *data, int len) { message_buff buff(data, len); int qdc, adc, nsc, arc, t, x, pos = 12; if (len < 12) throw PException("Corrupted DNS packet: too small for header"); ID = uint16_value(data); QR = data[2] & 128; OPCODE = (data[2] & 120) >> 3; AA = data[2] & 4; TC = data[2] & 2; RD = data[2] & 1; RA = data[3] & 128; Z = (data[3] & 112) >> 3; RCODE = data[3] & 15; qdc = uint16_value(data + 4); adc = uint16_value(data + 6); nsc = uint16_value(data + 8); arc = uint16_value(data + 10); /* read question section */ for (t = 0; t < qdc; t++) { if (pos >= len) throw PException("Message too small for question item!"); x = dom_comprlen(buff, pos); if (pos + x + 4 > len) throw PException("Message too small for question item !"); questions.push_back(DnsQuestion(domainname(buff, pos), uint16_value(data + pos + x), uint16_value(data + pos + x + 2))); pos += x; pos += 4; } /* read other sections */ read_section(answers, adc, buff, pos); read_section(authority, nsc, buff, pos); unsigned int tsig_loc = 0; read_section(additional, arc, buff, pos, &tsig_loc); if (tsig_loc == 0) { /* unsigned message */ if (tsig_rr != NULL) throw PException (true, "Unsigned answer to signed message (key=%s)", tsig_rr->NAME.tocstr()); return 0; } DnsRR message_tsig = additional.back(); additional.pop_back(); if (tsig_rr == NULL) { /* no automatic checking; set tsig_rr to found RR */ tsig_rr = new DnsRR(message_tsig); } else { verify_signature (tsig_rr, &message_tsig, sign_key, message_buff (data, tsig_loc)); } if (tsig_loc) { return tsig_loc; } else { return pos; } } class PTruncatedException { public: PTruncatedException() { } }; void DnsMessage::write_rr(DnsRR &rr, stl_string &message, stl_slist(dom_compr_info) *comprinfo, int flags) { dom_write(message, rr.NAME.c_str(), comprinfo); message.append((char*)uint16_buff(rr.TYPE), 2); message.append((char*)uint16_buff(rr.CLASS), 2); message.append((char*)uint32_buff(rr.TTL), 4); message.append((char*)uint16_buff(rr.RDLENGTH), 2); int p = message.size(); if (rr.RDLENGTH != 0 || !flags) rr_write(rr.TYPE, rr.RDATA, rr.RDLENGTH, message, comprinfo); int x = message.size(); message[p - 2] = (x - p) / 256; message[p - 1] = (x - p); } void DnsMessage::write_section(stl_list(DnsRR)& section, int lenpos, stl_string& message, stl_slist(dom_compr_info) &comprinfo, int maxlen, bool is_additional) { stl_list(DnsRR)::iterator it = section.begin(); int n = 0, x; x = message.size(); while (it != section.end()) { write_rr(*it, message, &comprinfo, (OPCODE == OPCODE_UPDATE) ? 1 : 0); if (maxlen != -1 && message.size() > (unsigned)maxlen) { /* truncate it here */ message.resize(x); if (!is_additional) message[2] |= 2; message[lenpos] = n / 256; message[lenpos + 1] = n; throw PTruncatedException(); } x = message.size(); ++it; n++; } /* write number of written items */ message[lenpos] = n / 256; message[lenpos + 1] = n; } message_buff DnsMessage::compile(int maxlen) { stl_string msg; unsigned char ch; stl_slist(dom_compr_info) comprinfo; try { msg.append((char*)uint16_buff(ID), 2); if (QR) ch = 128; else ch = 0; ch += OPCODE << 3; if (AA) ch += 4; if (TC) ch += 2; if (RD) ch++; msg.append((char*)&ch, 1); if (RA) ch = 128; else ch = 0; ch += Z << 4; ch += RCODE; msg.append((char*)&ch, 1); msg.append((char*)uint16_buff(0), 2); msg.append((char*)uint16_buff(0), 2); msg.append((char*)uint16_buff(0), 2); msg.append((char*)uint16_buff(0), 2); /* write questions */ stl_list(DnsQuestion)::iterator it = questions.begin(); int x, n = 0; while (it != questions.end()) { x = msg.size(); dom_write(msg, it->QNAME.c_str(), &comprinfo); msg.append((char*)uint16_buff(it->QTYPE), 2); msg.append((char*)uint16_buff(it->QCLASS), 2); if (msg.size() > (unsigned)maxlen) { /* truncate it here */ msg.resize(x); msg[2] |= 2; msg[4] = n / 256; /// @todo: is this safe if chars are unsigned? msg[5] = n; throw PTruncatedException(); } ++it; n++; } /* write number of written items */ msg[4] = n / 256; msg[5] = n; /* other sections */ write_section(answers, 6, msg, comprinfo, maxlen); write_section(authority, 8, msg, comprinfo, maxlen); write_section(additional, 10, msg, comprinfo, maxlen, true); } catch (const PTruncatedException &p) { } catch (const PException &p) { throw PException("Dns Message creation failed: ", p); } /* DNS message signing */ if (tsig_rr != NULL) { /* increase answer count */ int n = uint16_value ((unsigned char*)msg.c_str() + 10) + 1; msg[10] = n / 256; msg[11] = n % 256; /* set ID, time signed of TSIG RR */ memcpy (rr_getdata (tsig_rr->RDATA, DNS_TYPE_TSIG, 4), uint16_buff (ID), 2); // thomson: Useful for testing it is possible to force specific signtime if (!tsig_rr_signtime) tsig_rr_signtime = time(NULL); memcpy (rr_getdata (tsig_rr->RDATA, DNS_TYPE_TSIG, 1), uint48_buff (tsig_rr_signtime), 6); message_buff extra; unsigned char *ptr = rr_getdata (tsig_rr->RDATA, DNS_TYPE_TSIG, 3); int ptrlen = uint16_value (ptr); if (ptrlen) extra = message_buff (ptr, ptrlen + 2); stl_string key = calc_mac (*tsig_rr, message_buff ((unsigned char*) msg.c_str(), msg.size()), sign_key, &extra); /* store digest in tsig RR */ // thomson: to be able to sign the message multiple times, uncomment: if (tsig_rr->presign_RDLENGTH == 0) { tsig_rr->presign_RDLENGTH = tsig_rr->RDLENGTH; tsig_rr->presign_RDATA = (unsigned char*)memdup(tsig_rr->RDATA, tsig_rr->RDLENGTH); } stl_string newdata; int digestpos = rr_getdata (tsig_rr->RDATA, DNS_TYPE_TSIG, 3) - tsig_rr->RDATA, digestlen = uint16_value (tsig_rr->RDATA + digestpos); newdata.append ((char*)tsig_rr->RDATA, digestpos); newdata.append ((char*)uint16_buff (key.size ()), 2); newdata.append (key); newdata.append ((char*)tsig_rr->RDATA + digestpos + 2 + digestlen, tsig_rr->RDLENGTH - (digestpos + digestlen + 2)); free (tsig_rr->RDATA); tsig_rr->RDATA = (unsigned char *) memdup (newdata.c_str(), newdata.size()); tsig_rr->RDLENGTH = newdata.size (); /* TODO: if things don't fit, remove the rest of the message and set the TC bit */ write_rr (*tsig_rr, msg, &comprinfo, 0); // thomson: to be able to sign the message multiple times, uncomment: // free(tsig_rr->RDATA); // tsig_rr->RDATA = old_RDATA; // tsig_rr->RDLENGTH = old_RDLENGTH; } int len = msg.size(); return message_buff((unsigned char *)memdup((char *)msg.c_str(), len), len, true); } unsigned char _tmp[6]; unsigned char *uint16_buff(uint16_t val) { _tmp[0] = val / 256; _tmp[1] = val & 255; return _tmp; } unsigned char *uint32_buff(uint32_t val) { _tmp[0] = val / (1 << 24); _tmp[1] = val / (1 << 16); _tmp[2] = val / (1 << 8); _tmp[3] = val; return _tmp; } unsigned char *uint48_buff(u_int48 val) { _tmp[0] = val / ((u_int48)1 << 40); _tmp[1] = val / ((u_int48)1 << 32); _tmp[2] = val / ((u_int48)1 << 24); _tmp[3] = val / ((u_int48)1 << 16); _tmp[4] = val / ((u_int48)1 << 8); _tmp[5] = val; return _tmp; } u_int16 uint16_value(const unsigned char *buff) { return buff[0] * 256 + buff[1]; } u_int32 uint32_value(const unsigned char *buff) { return uint16_value(buff) * 65536 + uint16_value(buff + 2); } u_int48 uint48_value(const unsigned char *buff) { return uint32_value(buff) * 65536 + uint16_value(buff + 4); } DnsMessage *create_query(domainname qname, uint16_t qtype, bool rd, uint16_t qclass) { DnsMessage *ret = new DnsMessage(); ret->RD = rd; ret->questions.push_front(DnsQuestion(qname, qtype, qclass)); return ret; } a_record get_a_record(DnsMessage *a) { return *get_a_records(a, true).begin(); } stl_list(a_record) get_a_records(DnsMessage *a, bool fail_if_none) { stl_list(a_record) ret; a_record rec; stl_list(rrdat) res = get_records(a, fail_if_none); stl_list(rrdat)::iterator it = res.begin(); while (it != res.end()) { memcpy(rec.address, it->msg, 4); ret.push_back(rec); ++it; } return ret; } aaaa_record get_aaaa_record(DnsMessage *a) { return *get_aaaa_records(a, true).begin(); } stl_list(aaaa_record) get_aaaa_records(DnsMessage *a, bool fail_if_none) { stl_list(aaaa_record) ret; aaaa_record rec; stl_list(rrdat) res = get_records(a, fail_if_none, DNS_TYPE_AAAA); stl_list(rrdat)::iterator it = res.begin(); while (it != res.end()) { memcpy(rec.address, it->msg, 16); ret.push_back(rec); ++it; } return ret; } mx_record get_mx_record(DnsMessage *a) { return *get_mx_records(a, true).begin(); } stl_list(mx_record) get_mx_records(DnsMessage *a, bool fail_if_none) { stl_list(mx_record) ret; mx_record rec; stl_list(rrdat) res = get_records(a, fail_if_none); stl_list(rrdat)::iterator it = res.begin(); while (it != res.end()) { rec.preference = rr_getshort(it->msg, DNS_TYPE_MX, 0); rec.server = rr_getdomain(it->msg, DNS_TYPE_MX, 1); ret.push_back(rec); ++it; } return ret; } domainname get_ns_record(DnsMessage *a) { return *get_ns_records(a, true).begin(); } stl_list(domainname) get_ns_records(DnsMessage *a, bool fail_if_none) { stl_list(domainname) ret; stl_list(rrdat) res = get_records(a, fail_if_none); stl_list(rrdat)::iterator it = res.begin(); while (it != res.end()) { ret.push_back(rr_getdomain(it->msg, DNS_TYPE_NS, 0)); ++it; } return ret; } domainname get_ptr_record(DnsMessage *a) { return *get_ptr_records(a, true).begin(); } stl_list(domainname) get_ptr_records(DnsMessage *a, bool fail_if_none) { stl_list(domainname) ret; stl_list(rrdat) res = get_records(a, fail_if_none); stl_list(rrdat)::iterator it = res.begin(); while (it != res.end()) { ret.push_back(rr_getdomain(it->msg, DNS_TYPE_PTR, 0)); ++it; } return ret; } rrdat::rrdat(uint16_t _type, uint16_t _len, unsigned char *_msg) { type = _type; len = _len; msg = _msg; } stl_list(rrdat) i_get_records(DnsMessage *a, bool fail_if_none, bool follow_cname, int reclevel, domainname &dname, uint16_t qtype, stl_list(domainname) *fcn) { stl_list(rrdat) ret; domainname dm; if (reclevel < 0) throw PException("CNAME recursion level reached"); /* look for records */ stl_list(DnsRR)::iterator it = a->answers.begin(); while (it != a->answers.end()) { if (it->NAME == dname) { if (it->TYPE == DNS_TYPE_CNAME && follow_cname && qtype != DNS_TYPE_CNAME) { dm = domainname(true, it->RDATA); if (fcn) fcn->push_back(dm); return i_get_records(a, fail_if_none, true, --reclevel, dm, qtype, fcn); } else if (it->TYPE == qtype || qtype == QTYPE_ALL) ret.push_back(rrdat(it->TYPE, it->RDLENGTH, it->RDATA)); } ++it; } if (fail_if_none && ret.begin() == ret.end()) throw PException("No such data available"); return ret; } stl_list(rrdat) get_records(DnsMessage *a, bool fail_if_none, bool follow_cname, stl_list(domainname) *fcn) { if (a->RCODE != RCODE_NOERROR) throw PException(true, "Query returned error: %s\n", str_rcode(a->RCODE).c_str()); if (a->questions.begin() == a->questions.end()) throw PException("No question item in message"); return i_get_records(a, fail_if_none, follow_cname, 10, a->questions.begin()->QNAME, a->questions.begin()->QTYPE, fcn); } bool has_rrset(stl_list(DnsRR) &rrlist, domainname &name, uint16_t type) { std::list::iterator it = rrlist.begin(); while (it != rrlist.end()) { if (it->NAME == name && answers_qtype(it->TYPE, type)) return true; ++it; } return false; } bool has_parental_rrset(stl_list(DnsRR)& section, domainname &qname, uint16_t type) { stl_list(DnsRR)::iterator it = section.begin(); while (it != section.end()) { if (it->TYPE == type && qname >= it->NAME) return true; ++it; } return false; } _answer_type check_answer_type(DnsMessage *msg, domainname &qname, uint16_t qtype) { if (msg->RCODE != RCODE_NOERROR && msg->RCODE != RCODE_NXDOMAIN) return A_ERROR; if (qtype != DNS_TYPE_CNAME && has_rrset(msg->answers, qname, DNS_TYPE_CNAME)) return A_CNAME; if (msg->RCODE == RCODE_NXDOMAIN) return A_NXDOMAIN; if (has_rrset(msg->answers, qname, qtype)) return A_ANSWER; if (has_parental_rrset(msg->authority, qname, DNS_TYPE_NS) && !has_parental_rrset(msg->authority, qname, DNS_TYPE_SOA)) return A_REFERRAL; return A_NODATA; } dibbler-1.0.1/poslib/syssocket.h0000664000175000017500000000377312233256142013541 00000000000000/* Posadis - A DNS Server Universal include file for sockets, since different OS'ses use different directories Copyright (C) 2001 Meilof Veeningen 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., 675 Mass Ave, Cambridge, MA 02139, USA. */ #ifndef __POSLIB_SYSSOCKET_H #define __POSLIB_SYSSOCKET_H #include "dibbler-config.h" #ifdef _WIN32 # include # include #else # include # ifdef HAVE_SYS_POLL_H # include # else # ifdef HAVE_POLL_H # include # else # include "w32poll.h" # endif # endif # include # include # include # include # include # include # include # define closesocket close #endif #ifndef HAVE_SOCKLEN_T #define socklen_t int #endif #ifdef HAVE_SOCKADDR_STORAGE # ifdef HAVE___SS_FAMILY # define s_family __ss_family # else # define s_family ss_family # endif # ifdef __BORLANDC__ # define sockaddr_storage sockaddr_in6 # undef s_family # define s_family sin6_family # endif #else # define sockaddr_storage sockaddr # define s_family sa_family # ifdef HAVE_IPV6 # warning sockaddr_storage not available: ipv6 support has been disabled! # endif # undef HAVE_IPV6 #endif #ifndef HAVE_POLL # include "w32poll.h" #endif #endif /* __POSLIB_SYSSOCKET_H */ dibbler-1.0.1/poslib/postime.h0000664000175000017500000001537012233256142013166 00000000000000/* Posadis - A DNS Server Posadis time functions Copyright (C) 2002 Meilof Veeningen 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., 675 Mass Ave, Cambridge, MA 02139, USA. */ #ifndef __POSLIB_POSTIME_H #define __POSLIB_POSTIME_H #ifndef WIN32 #include #endif #include "types.h" #ifdef WIN32 #include struct timespec { time_t tv_sec; /* Seconds. */ long int tv_nsec; /* Nanoseconds. */ }; #endif /*! \file poslib/postime.h * \brief Posadis time functions * * The functions in this source file, as well as the postime_t class defined * here, provide easy access to times in a system-independent way. */ /*! * \brief Time with millisecond precision * * The postime_t class offers system-independent time handling with * millisecond precision. Using its member functions and operators, one can * manipulate times in an inituive way. */ class postime_t { public: /*! * \brief postime_t constructor * * This constructor sets the number of seconds and the number of * milliseconds to zero. */ postime_t(); /*! * \brief constructor with a number of milliseconds * * This constructor takes a number of milliseconds. If this number is * greater than 1000, the number is split in a number of seconds and * a number of milliseconds. This function is mainly useful for offsets. * \param msecs Number of milliseconds * \sa postime_t() */ postime_t(int msecs); /*! * \brief time assignment * * This assignment operator copies the given time to the current time. * \param t The time to assign * \return The assigned time */ postime_t& operator=(const postime_t &t); /*! * \brief number of seconds * * This is the number of seconds of the time. For absolute times, this * is the number of seconds since the UNIX epoch as returned by the * gettimeofday() function. */ long sec; /*! * \brief number of milliseconds * * This is the number of milliseconds. This value can range from 0 to * 999. If you assign a value greater than 999 to this, results are * undefined. */ long msec; /*! * \brief equality check * * This operator checks whether two times are equal, that is, both the * number of seconds and the number of milliseconds are the same * \param t The time to compare with */ bool operator==(const postime_t &t); /*! * \brief less than or equal * * This operator checks whether this time is before or the same as the * argument, t. * \param t The time to compare with */ bool operator<=(const postime_t &t); /*! * \brief less than * * This operator checks whether this time is before the argument, t. * \param t The time to compare with */ bool operator<(const postime_t &t); /*! * \brief greater than or equal * * This operator checks whether this time is after or the same as the * argument, t. * \param t The time to compare with */ bool operator>=(const postime_t &t); /*! * \brief greater than * * This operator checks whether the time is after the argument, t. * \param t The time to compare with */ bool operator>(const postime_t &t); /*! * \brief greater than timespec * * This operator checks whether the time is after the argument, t. * t is a timespec, as returned by the postimespec() function, and as * required by pthread_cond_timedwait function. * \param t The time to compare with * \sa postimespec() */ bool operator>(const timespec &t); /*! * \brief Number of milliseconds after t * * This function returns the amount of time between this time and the time * specified by t. If this time is after t, this value is positive, if * this time is before t, the return value is negative. * \param t The time to compare with * \return The number of milliseconds the time is after t */ int after(const postime_t &t); /*! * \brief time substraction * * This function substracts t from the given time and returns the result. * \param t The time to substract * \return The result of the substraction */ postime_t operator-(const postime_t &t); /*! * \brief time addition * * This function adds t to the given time and returns the result. This is * probably only useful if at least one of the given times is an offset. * \param t The time to add * \return The result of the addition */ postime_t operator+(const postime_t &t); /*! * \brief time millisecond addition * * This function adds the given amount of milliseconds to the time and * returns the result. * \param t The number of milliseconds to add * \return The result of the addition */ postime_t operator+(int t); /*! * \brief time addition * * This function adds t to the given time and returns the result. This is * probably only useful if at least one of the given times is an offset. * \param t The time to add * \return This */ postime_t& operator+=(const postime_t &t); /*! * \brief time millisecond addition * * This function adds the given amount of milliseconds to the time and * returns the result. * \param t The number of milliseconds to add * \return This */ postime_t& operator+=(int t); }; /*! * \brief get the current time * * Retrieves the current time with millisecond precision and stores it in a * postime_t structure. * \return The current time */ postime_t getcurtime(); /*! * \brief timespec for given millisecond timeout * * Returns a timespec structure that can be used, among other things, for the * pthread_cond_timedwait function (which is what it was designed for). * \param timeout Number of milliseconds from now the timespec is set to * \return A timespec structure containing an absolute time. */ timespec postimespec(int timeout); #endif /* __POSLIB_POSTIME_H */ dibbler-1.0.1/poslib/NEWS0000664000175000017500000000065312233256142012032 00000000000000----------- Poslib NEWS ----------- When I (occasionally) update this file, it will contain some release highlights. Poslib 0.9.2 * Full IPv6 support (was a bit incomplete and buggy before), both for servers and clients. * Support for a load more platforms * Yet some more bug fixes Poslib 0.9.1 * Added async stop for client resolver * Added Borland C++ support * Various bug fixes Poslib 0.9.0 * Initial releasedibbler-1.0.1/poslib/resolver.h0000644000175000017500000003146412277722750013362 00000000000000/* Posadis - A DNS Server Dns Resolver API Copyright (C) 2002 Meilof Veeningen 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., 675 Mass Ave, Cambridge, MA 02139, USA. */ #ifndef __POSLIB_RESOLVER_H #define __POSLIB_RESOLVER_H #include "sysstl.h" #include "socket.h" #include "dnsmessage.h" /*! \file poslib/resolver.h * \brief Posadis resolver functionality * * This file contains the Posadis resolver implementation. It contains the base * pos_resolver class, which does not contain the implementation for the * resolver. There are two resolver implementations: pos_cliresolver for client * programs and pos_srvresolver for server programs. */ /*! * \brief default flags for the pos_resolver::query function * * This define contains the default flags for the 'flag' parameter of the * pos_resolver::query function. This means trying UDP at first, and if the * answer is truncated, try TCP next. */ #define Q_DFL 0 /*! * \brief 'no-tcp' flag for pos_resolver::query * * This flag instructs the pos_resolver::query function not to retry the query * using TCP if the UDP answer is truncated. This means the answer returned by * the function might be truncated, which can be checked by looking at the * DnsMessage::TC flag. */ #define Q_NOTCP 1 class WaitAnswerData { public: WaitAnswerData(u_int16 _r_id, _addr& _from); u_int16 r_id; _addr from; }; /*! * \brief Posadis abstract resolver class * * This is the abstract base class for the Posadis resolver functionality. The * pos_resolver class offers functions for both UDP and TCP resolving. For UDP * resolving, use the high-level query() functions. sendmessage() and * waitanswer() are low-level functions that applications would not normally * want to call. The same goes for TCP: tcpconnect() tcpdisconnect() and * tcpquery() are the functions it's all about. * * You can modify some parameters by setting member functions of the class, and * by specifying custom flags for the query functions. * * Like we mentioned, this is an abstract class that should _not_ be used * directly. For client applications, use the pos_cliresolver class, and for * server applications, use pos_srvresolver. * * Note that pos_resolver actually _does_ contain a complete TCP * implementation, so, theoretically it could be instantiated directly for use * as a TCP resolver. This is however not encouraged. */ class pos_resolver { public: /*! * \brief default constructor * * This constructor intializes the resolver, and sets the udp_tries, * n_udp_tries and tcp_timeout values to their defaults. */ pos_resolver(); /*! * \brief destructor * * This function clears all memory associated with the resolver object. */ virtual ~pos_resolver(); /*! * \brief number of UDP attempts * * Sets the number of times Posadis attempts to retry querying using UDP if * a previous attempt did not return an answer. If you change this value, * you should also change #udp_tries to have at least as many items as this * value. */ int n_udp_tries; /*! * \brief UDP timeout values * * This is an array of UDP retry values, in milliseconds. This array can be * changed by hand. If you want to change the dimensions, a mere realloc() * is enough. Just make sure it has at least as many items as the * #n_udp_tries value, otherwise your application might crash :( */ int *udp_tries; /*! * \brief TCP timeout value * * This is the time, in milliseconds, we're willing to wait for TCP * transmission. Because there are four operations involved in a TCP query * (two send operations and two read operations), each operation gets 25% * of this timeout to complete. Since TCP is a connection-based protocol, * we're not responsible for retransmission, thus we only attempt queries * once. */ int tcp_timeout; /*! * \brief high-level query function * * This function will query the given DNS server for the information * identified by the DNS query message q. If it succeeds, it will return and * put the answer from the server in a, which need not be initialized * previously (in fact, this will result in a memory leak). If not, it will * raise a PException. * * If the query() function does not receive an answer in time, it will retry * for #n_udp_tries times, using the timeout values from the #udp_tries * array. If the answer it receives is truncated, it will retry using TCP, * unless instructed not to by the flags parameter. * * The behavior of the query function can be changed by the flags parameter. * Currently, this can only be Q_DFL (default flags) or Q_NOTCP (do not retry * using UDP). * \param q The DNS query message * \param a Variable to put the answer in * \param server The server to query * \param flags Flags controlling query behavior. */ virtual void query(DnsMessage *q, DnsMessage*& a, _addr *server, int flags = Q_DFL) = 0; /*! * \brief high-level query function using multiple servers * * This function generally behaves the same as the query() function, except * it takes a list of servers instead of one. The query algorithm differs in * that for each timeout value from #udp_tries, all servers will be queried. * Also, if the answer is truncated, _only_ the server that returned the * truncated answer will be tried using TCP. This function will start * querying at a random place in the servers list; after that, it will run * through all servers listed in the order in which you specify them. * * \param q * \param a likely an answer * \param servers List of servers to query * \param flags * * \return The address of the server that returned this answer * \sa query() */ virtual _addr query(DnsMessage *q, DnsMessage*& a, stl_slist(_addr) &servers, int flags = Q_DFL) = 0; /*! * \brief low-level resolver function for sending a message * * This function sends a DNS message to a specified server using UDP. * \param msg The DNS message to send * \param res The host to send the message to * \param sockid Implementation-dependent argument. */ virtual void sendmessage(DnsMessage *msg, _addr *res, int sockid = -1) = 0; /*! * \brief low-level resolver function for waiting for an answer * * This function waits for at most the amount of milliseconds specified * by timeout until an answer to our query arrives. Since multiple * messages for the same query might have been sent out, it asks for a list * of sent queries. * * If no answer is received in time, this function will raise an exception. * \param ans If an answer is received, it will be put in this variable. This * should already be a valid DNS message, presumably initialized * with q->initialize_answer() * \param wait List of sent queries we might get an answer to * \param timeout Number of milliseconds to wait at most * \param it If an answer is received, this iterator will point to the * message this was an answer to. * \param sockid Implementation-dependent argument. */ virtual bool waitanswer(DnsMessage*& ans, stl_slist(WaitAnswerData)& wait, int timeout, stl_slist(WaitAnswerData)::iterator& it, int sockid = -1) = 0; /*! * \brief establishes a TCP connection to a DNS server * * This function will try to connect to the given address using TCP. * \param res The server to connect to * \return A socket identifier to use for other tcp resolver functions * \sa tcpdisconnect() */ virtual int tcpconnect(_addr *res); /*! * \brief disconnects from a DNS server * * This function will disconnect from a server we connected to earlier using * tcpconnect(). * \sa tcpconnect() */ virtual void tcpdisconnect(int sockid); /*! * \brief TCP query function * * This is the high-level TCP query function. It will query the server we * connected to, and put the answer to the query q in a. It will wait at * most #tcp_timeout milliseconds before it receives an answer. * * If the function receives a message which does not answer our query, it * will stop waiting and raise an exception. * \param q The DNS query message * \param a Variable to put the answer in * \param sockid The TCP connection (as returned by tcpconnect()) */ virtual void tcpquery(DnsMessage *q, DnsMessage*& a, int sockid); /*! * \brief TCP low-level function for sending a message * * This function sends a DNS message over a TCP connection. * \param msg The message to send * \param sockid The TCP connection (as returned by tcpconnect()) */ virtual void tcpsendmessage(DnsMessage *msg, int sockid); /*! * \brief TCP low-level function for waiting for an answer * * This function waits for at most #tcp_timeout milliseconds until it * receives an answer from the server on the other end of the line. Unlike * its UDP conterpart, this function does not check whether the server * actually answered our query. * \param ans Variable to put the received message in. This should already * point to an existing DNS message, which should be initialized * by calling q->initialize_answer(); even if an error occurs, * this may be non-NULL. * \param sockid The TCP connection (as returned by tcpconnect()) */ virtual void tcpwaitanswer(DnsMessage*& ans, int sockid); }; /*! * \brief resolver for client applications * * This is an implementation of the pos_resolver class meant for client * applications. It does not maintain a centralized query database like * pos_srvresolver. Instead, it will open up a new socket for each query it * attempts. The advantage is that it does not require the multi-thread * architecture pos_srvresolver depends on. * * pos_cliresolver implements the pos_resolver query(), sendmessage() and * waitanswer() functions. */ class pos_cliresolver : public pos_resolver { public: /*! * \brief resolver constructor * * Resolver for the client resolver. */ pos_cliresolver(); /*! * \brief destructor * * Destructor for the client resolver */ virtual ~pos_cliresolver(); void query(DnsMessage *q, DnsMessage*& a, _addr *server, int flags = Q_DFL); _addr query(DnsMessage *q, DnsMessage*& a, stl_slist(_addr) &servers, int flags = Q_DFL); /*! * \brief low-level resolver function for sending a message * * This function sends a DNS message to a specified server using UDP. * \param msg The DNS message to send * \param res The host to send the message to * \param sockid The socket to use */ void sendmessage(DnsMessage *msg, _addr *res, int sockid = -1); /*! * \brief low-level resolver function for waiting for an answer * * This function waits for at most the amount of milliseconds specified * by timeout until an answer to our query arrives. Since multiple * messages for the same query might have been sent out, it asks for a list * of sent queries. * * If no answer is received in time, this function will raise an exception. * \param ans If an answer is received, it ill be put in this variable. This * should already be a valid DNS message, presumably initialized * with q->initialize_answer() * \param wait List of sent queries we might get an answer to * \param timeout Number of milliseconds to wait at most * \param it If an answer is received, this iterator will point to the * message this was an answer to. * \param sockid The socket id the answers will come from. */ bool waitanswer(DnsMessage*& ans, stl_slist(WaitAnswerData)& wait, int timeout, stl_slist(WaitAnswerData)::iterator& it, int sockid = -1); /*! * \brief stops the resolving process asap * * This function will try to stop the resolving process as soon as possible. * Thus, it will need to be called asynchronously (since the query functions * block), either from another thread or from a signal handler. It will tease * the query functions a bit by closing their sockets, and urge them to * quit. */ void stop(); private: void clrstop(); int sockid; bool quit_flag; bool is_tcp; #ifndef _WIN32 int clipipes[2]; #endif }; #endif /* __POSLIB_RESOLVER_H */ dibbler-1.0.1/poslib/dnssec-sign.cpp0000644000175000017500000002112712277722750014264 00000000000000/* Posadis - A DNS Server Dns Message signing Copyright (C) 2005 Meilof Veeningen 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., 675 Mass Ave, Cambridge, MA 02139, USA. */ #include "poslib.h" #include "dnssec-sign.h" extern "C" { #include "nettle/hmac.h" #include "nettle/base64.h" #include "nettle/md5.h" } /// @brief verifies TSIG of received response /// /// Make sure that message_buff is trimmed down to not include TSIG /// record, as it must be passed in message_tsig. /// /// @param check_tsig TSIG RR from the original message /// @param message_tsig TSIR RR from the response message that we are validating /// @param key the key used for signing /// @param message received message (without TSIG record) void verify_signature (DnsRR *check_tsig, DnsRR *message_tsig, stl_string key, message_buff message) { if (!message_tsig) throw PException (true, "Unsigned answer to a signed message (key %s)", check_tsig->NAME.tocstr ()); unsigned char *errorptr = rr_getdata (check_tsig->RDATA, DNS_TYPE_TSIG, 5); domainname alg_name = rr_getdomain (check_tsig->RDATA, DNS_TYPE_TSIG), rr_alg_name = rr_getdomain (message_tsig->RDATA, DNS_TYPE_TSIG); if (rr_alg_name != alg_name || check_tsig->NAME != message_tsig->NAME) { memcpy (errorptr, uint16_buff (RCODE_BADKEY), 2); throw PException (true, "Key name/algorithm does not match: question signed with %s, answer " "signed with %s", check_tsig->NAME.tocstr(), message_tsig->NAME.tocstr()); } unsigned char *rr_macpos = rr_getdata (message_tsig->RDATA, DNS_TYPE_TSIG, 3), *macpos = rr_getdata (check_tsig->RDATA, DNS_TYPE_TSIG, 3); uint16_t rr_maclen = uint16_value (rr_macpos), maclen = uint16_value (macpos); if ((message.msg[3] & 15) == RCODE_NOTAUTH) { /* error! */ uint16_t err = rr_getshort (message_tsig->RDATA, DNS_TYPE_TSIG, 5); if (err == RCODE_BADSIG) throw PException (true, "Question signed with %s had bad signature", check_tsig->NAME.tocstr()); else if (err == RCODE_BADKEY) throw PException (true, "Question was signed with bad key (%s)", check_tsig->NAME.tocstr()); else if (err == RCODE_BADTIME) throw PException (true, "Question sign time invalid (query time %d, answer time %d)", uint48_value (rr_getdata (check_tsig->RDATA, DNS_TYPE_TSIG, 1)), uint48_value (rr_getdata (message_tsig->RDATA, DNS_TYPE_TSIG, 1))); else throw PException (true, "Unknown sign error: %d", err); } time_t clienttime = time (NULL); u_int48 servertime = uint48_value (rr_getdata (check_tsig->RDATA, DNS_TYPE_TSIG, 1)); uint16_t fudge = rr_getshort (check_tsig->RDATA, DNS_TYPE_TSIG, 2); if ( (clienttime > servertime && clienttime - servertime > fudge) || (servertime > clienttime && servertime - clienttime > fudge) ) { throw PException (true, "Answer sign time invalid (answer time %d, real time %d)", uint48_value (rr_getdata (message_tsig->RDATA, DNS_TYPE_TSIG, 1)), clienttime); // TODO: set TSIG error of check_tsig for servers } if (rr_maclen != MD5_DIGEST_SIZE) { memcpy (errorptr, uint16_buff (RCODE_BADSIG), 2); throw PException (true, "Incorrect MAC size: %d", rr_maclen); } /* calculate MAC */ message_buff ext; /* TODO: document: if this is from a message, it actually means that the message was unsigned, but we should still include the two length */ if (maclen) ext = message_buff (macpos, maclen + 2); stl_string mac = calc_mac (*message_tsig, message, key, &ext); if (memcmp (mac.c_str(), rr_macpos + 2, MD5_DIGEST_SIZE) != 0) { memcpy (errorptr, uint16_buff (RCODE_BADSIG), 2); throw PException (true, "Message signed with key %s has bad signature", message_tsig->NAME.tocstr ()); } } //#undef hmac_md5_update //void hmac_md5_update (struct hmac_md5_ctx *md5, int len, const unsigned char* ptr) { // print_buff (len, ptr); // nettle_hmac_md5_update (md5, len, ptr); //} stl_string calc_mac (DnsRR &tsig_rr, message_buff msg, stl_string sign_key, message_buff *extra) { struct hmac_md5_ctx md5; unsigned char md5res [MD5_DIGEST_SIZE]; memset (&md5, 0, sizeof (hmac_md5_ctx)); unsigned char *digestpos = rr_getdata (tsig_rr.RDATA, DNS_TYPE_TSIG, 3); uint16_t digestlen = uint16_value (digestpos); // print_buff (sign_key.size(), (unsigned char*)sign_key.c_str()); hmac_md5_set_key(&md5, sign_key.size(), (uint8_t *)sign_key.c_str()); // printf ("Begin MAC calculation\n"); /* original MAC */ if (extra && extra->len) hmac_md5_update(&md5, extra->len, extra->msg); /* message */ hmac_md5_update(&md5, 10, msg.msg); hmac_md5_update(&md5, 2, uint16_buff (uint16_value (msg.msg + 10) - 1)); hmac_md5_update(&md5, msg.len - 12, msg.msg + 12); /* tsig rr */ stl_string canname = tsig_rr.NAME.canonical(); hmac_md5_update(&md5, canname.size(), (const uint8_t *)canname.c_str()); hmac_md5_update(&md5, 2, uint16_buff (QCLASS_ANY)); hmac_md5_update(&md5, 4, uint32_buff (0)); /* start of TSIG rrdata */ domainname dom = domainname (true, tsig_rr.RDATA); canname = dom.canonical(); hmac_md5_update (&md5, canname.size(), (const uint8_t*)canname.c_str()); hmac_md5_update(&md5, 8, digestpos - 8); /* rest, excluding original ID */ hmac_md5_update(&md5, tsig_rr.RDLENGTH - (digestpos - tsig_rr.RDATA) - digestlen - 4, digestpos + digestlen + 4); hmac_md5_digest(&md5, MD5_DIGEST_SIZE, md5res); // printf ("End MAC calculation\n"); // print_buff (MD5_DIGEST_SIZE, md5res); stl_string ret; ret.append ((char*)md5res, MD5_DIGEST_SIZE); return ret; } stl_string base64_decode (const char *line) { stl_string ret; unsigned len = strlen (line); char *res = (char *)malloc (len); struct base64_decode_ctx str; base64_decode_init (&str); base64_decode_update (&str, &len, (uint8_t*)res, len, (uint8_t*)line); base64_decode_final (&str); ret.append (res, len); free (res); return ret; } stl_string base64_encode (const char *buff, int bufflen) { stl_string ret; unsigned len = strlen (buff); char *res = (char *) malloc (BASE64_ENCODE_LENGTH (bufflen)); struct base64_encode_ctx str; base64_encode_init (&str); len = base64_encode_update (&str, (uint8_t *) res, len, (uint8_t*) buff); // TODO: args? base64_encode_final (&str, (uint8_t*) res); ret.append (res, len); free (res); return ret; } DnsRR *tsig_record (domainname keyname, uint16_t fudge, domainname sign_algorithm) { DnsRR *tsig_rr = new DnsRR (keyname, DNS_TYPE_TSIG, QCLASS_ANY, 0); stl_string tsig_rrdata; tsig_rrdata.append ((char *)sign_algorithm.c_str (), sign_algorithm.len ()); tsig_rrdata.append (6, '\0'); /* empty signtime */ tsig_rrdata.append ((char *)uint16_buff (fudge), 2); tsig_rrdata.append (8, '\0'); /* empty MAC; original ID; error; other length */ tsig_rr->RDLENGTH = tsig_rrdata.size (); tsig_rr->RDATA = (unsigned char*) memdup (tsig_rrdata.c_str(), tsig_rr->RDLENGTH); return tsig_rr; } void tsig_from_string (DnsRR*& tsig_rr, stl_string& sign_key, const char* keystring) { stl_string keyname, key; const char *ptr; ptr = strchr (keystring, ':'); if (!ptr) throw PException (true, "%s is not a valid key string (should be keyname:key)", keystring); keyname.append (keystring, (int)(ptr - keystring)); keystring = ptr + 1; ptr = strchr (keystring, ':'); key.append (keystring, ptr ? (int)(ptr - keystring) : strlen (keystring)); if (tsig_rr) { delete tsig_rr; tsig_rr = NULL; } if (ptr) { int fudge = txt_to_int (ptr + 1); tsig_rr = tsig_record (keyname.c_str (), fudge); } else { tsig_rr = tsig_record (keyname.c_str ()); } sign_key = base64_decode (key.c_str ()); } void tsig_from_string (DnsMessage *message, const char *keystring) { tsig_from_string (message->tsig_rr, message->sign_key, keystring); } dibbler-1.0.1/poslib/rr.h0000664000175000017500000003560612560471634012145 00000000000000/* Posadis - A DNS Server Resource Records Meilof Veeningen 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., 675 Mass Ave, Cambridge, MA 02139, USA. */ #ifndef __POSLIB_RR_H #define __POSLIB_RR_H #include "dnsmessage.h" /*! \file poslib/rr.h * \brief Resource-record information database * * This file contains functions to deal with Resource Records, the information * chunks contained by DNS messages. It has functions for converting RRs to * text and back, and to extract information from them. */ /*! * \brief flags for Resource Record types * * These are flags for the rr_type::flags member for Resource Record * information. */ enum _rr_flags { R_NONE = 0, /**< No RR flags */ R_ASP = 1, /**< Do additional section processing for domain names in this Resource Record */ R_COMPRESS = 2, /**< Compress domain names in this RR in outgoing DNS messages */ R_ASPCOMPRESS = 3 /**< Do both additional section processing and domain name compression */ }; /*! * \brief Resource Record information * * The rr_type structure contains information about the information a Resource * Record type contains, and how it needs to be handled. It is mainly of * interest for the internal RR functions declared in the rr.h header file. */ struct rr_type { /*! * \brief RR type name * * This is the name of the RR type. This information is case-insensitive, * though by convention all RR types have an uppercase name. */ char name[9]; /*! * \brief RR type code * * The 16-bit identifier code for the RR. This is the value that appears * directly in DNS messages to identify the RR type. */ u_int16 type; /*! * \brief list of properties for the RR type * * This is a string, in which each character stands for a chunk of * information in the RR data. Each possible type has its own code: * \p d for a domain name, * \p i for a ip number * \p s for a short number (16-bit unsigned) * \p l for a long number (32-bit unsigned) * \p t for a ttl value (32-bit unsigned; same as l, but different string * representation * \p c for a chararacter string * \p h for multiple character strings * \p n for a NULL RR * \p w for a well-known services list * \p 6 for an IPv6 address * \p 7 for an IPv6 prefix * \p m for an email-address. * \p o for LOC information */ char properties[9]; /*! * \brief flags for the RR * * These flags determine how the RR is treated when reading from or writing * to a DNS message. See the documentation for #_rr_flags for more * information. */ _rr_flags flags; }; /*! * \brief number of supported rr types * * This is the number of RR types supported by Poslib. Thus, it is also the * number of entries in the #rr_types array. * \sa #rr_types */ extern const int n_rr_types; /*! * \brief array of supported rr types * * This array contains information for all RR types supported by Poslib. For * information about the meaning of the fields, see the rr_type documentation. * This array contains exactly #n_rr_types elements. * \sa #n_rr_types * \sa rr_type */ extern const rr_type rr_types[]; /* low-level RR information */ /*! * \brief retrieves RR information * * This function retrieves information about a Resource Record by its 16-bit * unique identifier as found in DNS messages. If no matching RR type is found, * this function returnes \p NULL. * \param type The RR type code * \return The RR type information, or \p NULL if none was found */ rr_type *rrtype_getinfo(u_int16 type); /*! * \brief retrieves RR information by name * * This function retrieves information a Resource Record by its name. If no * matching RR type is found, this function returns \p NULL. * \param name The RR name (case insensitive) * \return The RR type information, or \p NULL if none was found */ rr_type *rrtype_getinfo(const char *name); /*! * \brief retrieves RR name * * This function returns the name for a RR type by its 16-bit code. If no * matching RR type is found, this function returns \p NULL. * \param type The 16-bit RR code * \return Name of the RR, or \p NULL if none was found */ char *rrtype_getname(u_int16 type); /*! * \brief retrieves qtype code * * This function tries to return the QTYPE code for a given string, that can * either be a RR, "any", "ixfr", "axfr", "maila" or "mailb", or a numeric * value. * \param name * \param allow_qtype If set to false (default true), only allow common types * \return The 16-bit QTYPE value for the given string */ uint16_t qtype_getcode(const char *name, bool allow_qtype = true); /*! * \brief check whether RR type answers QTYPE * * This function checks whether the given RR type provides an answer to the * given QTYPE. This is the case if qtype matches rrtype, or if qtype is * \p QTYPE_ANY , or if qtype is \p QTYPE_MAILB or \p QTYPE_MAILA and rrtype * is an appropriate RR type. * \param rrtype Resource Record type * \param qtype Question type * \return \p true if the rrtype provides an answer to the qtype. */ bool answers_qtype(uint16_t rrtype, uint16_t qtype); /*! * \brief check whether the RR type is a common RR * * This function returns true if rrtype is a common RR type (that is, not a * query type like \p QTYPE_ANY or \p QTYPE_IXFR . Note that this does not * nessecarily mean Poslib supports the given RR type. * \param rrtype Resource Record type to check * \return \p true if the rrtype is a common RR type */ bool is_common_rr(uint16_t rrtype); /*! * \brief read a Resource Record from a DNS message * * This function reads a Resource Record from a DNS message or other binary * data source. It will decompress compressed domain names in the RR on the * way, and return the data in the RDLEN and RDATA arguments. * \param RRTYPE The type of RR to read * \param RDATA This will hold the RR data if the function succeeds * \param RDLEN This will hold the length of the RR if the function succeeds * \param buff The message_buff the RR is stored in * \param ix Index in the buffer the RR begins * \param len Length the RR takes in the buffer */ void rr_read(u_int16 RRTYPE, unsigned char*& RDATA, uint16_t &RDLEN, message_buff &buff, int ix, int len); /*! * \brief write a Resource Record to a DNS message * * This function writes a Resource Record to a DNS message. It will compress * domain names along the way. * \param RRTYPE The type of RR to write * \param RDATA Pointer to the RR data * \param RDLEN Length of the RR data * \param dnsmessage The message to write to * \param comprinfo List of compressed domain names in DNS message, or NULL for no compression */ void rr_write(u_int16 RRTYPE, unsigned char *RDATA, uint16_t RDLEN, stl_string &dnsmessage, stl_slist(dom_compr_info) *comprinfo); /*! * \brief convert a binary RR to string * * This function converts the binary RR to a human-readable string in master * file format. * \param RRTYPE The RR type * \param RDATA The binary RR data * \param RDLENGTH Length of the binary RR data * \return A string describing the RR * \sa rr_fromstring() */ stl_string rr_tostring(u_int16 RRTYPE, const unsigned char *RDATA, int RDLENGTH); /*! * \brief Convert RR property to strings * * Converts a RR property as in rr_type.property, to string. * \param type Property type (see rr_type.property) * \param RDATA RR data * \param RDLENGTH Lenth of rest of RR * \param zone Zone to make domains relative to */ stl_string rr_property_to_string(char type, const unsigned char*& RDATA, int RDLENGTH, domainname& zone); /*! * \brief convert a binary RR to string * * This function converts the binary RR to a human-readable string in master * file format. * \param RRTYPE The RR type * \param RDATA The binary RR data * \param RDLENGTH Length of the binary RR data * \param zone If given, domain names in the RR will be relative to that zone where possible. * \return A string describing the RR * \sa rr_fromstring() */ stl_string rr_torelstring(u_int16 RRTYPE, const unsigned char *RDATA, int RDLENGTH, domainname zone); /*! * \brief convert a string to binary RR data * * This function converts a string describing a Resource Record to binary RR * data. The string should be in master file format - that is, if multiple * arguments are to be put in the RR data, they should be separated by any * number of spaces and tabs. For example, MX data might be "10 mail.yo.net.". * You can specify an origin to which domain names are considered relative by * means of the origin parameter. * \param rrtype Type of the RR * \param data The text describing the RR * \param origin If given, the domain name relative domain names are considered relative to. This should be a binary domain name, like the domainname::domain field. If not given, domain names are considered relative to the root domain. * \return Binary data describing the RR * \sa rr_tostring() */ stl_string rr_fromstring(u_int16 rrtype, const char *data, _domain origin = (unsigned char*)""); /*! * \brief convert a string to binary RR data * * This function converts a string describing a Resource Record to binary RR * data. The string should be in master file format - that is, if multiple * arguments are to be put in the RR data, they should be separated by any * number of spaces and tabs. For example, MX data might be "10 mail.yo.net.". * You can specify an origin to which domain names are considered relative by * means of the origin parameter. * \param RRTYPE Type of the RR * \param data The text describing the RR * \param origin If given, the domain name relative domain names are considered relative to. This should be a binary domain name, like the domainname::domain field. If not given, domain names are considered relative to the root domain. * \return The domainname * \sa rr_tostring() */ stl_string rr_fromstring(u_int16 RRTYPE, const char *data, domainname origin); /*! * \brief reads a domain name from RR data * * This function will read a domain name, in binary for, from RR data. * The _domain it returns is dynamically allocated. The index is the property * index in the RR data, beginning with 0, e.g. the domain name in the \p MX * RR is one. * * \param RDATA The RR data * \param RRTYPE Type of RR * \param ix If given, property index in the RR (defaults to zero) * \return Domain name at the specified position in the RR */ _domain rr_getbindomain(const unsigned char *RDATA, u_int16 RRTYPE, int ix = 0); /*! * \brief reads a domain name from RR data * * Variant of the rr_getbindomain() function returning a domainname structure. */ domainname rr_getdomain(const unsigned char *RDATA, u_int16 RRTYPE, int ix = 0); /*! * \brief reads an email address from RR data * * This is currently an alias for rr_getdomain(). */ _domain rr_getbinmail(const unsigned char *RDATA, u_int16 RRTYPE, int ix = 0); /*! * \brief reads a domain name from RR data * * Variant of the rr_getbinmail() function returning a domainname structure. */ domainname rr_getmail(const char *RDATA, u_int16 RRTYPE, int ix = 0); /*! * \brief read a 16-bit value from RR data * * For details, see rr_getdomain(). */ u_int16 rr_getshort(const unsigned char *RDATA, u_int16 RRTYPE, int ix = 0); /*! * \brief read a 32-bit value from RR data * * For details, see rr_getdomain(). */ u_int32 rr_getlong(const unsigned char *RDATA, u_int16 RRTYPE, int ix = 0); /*! * \brief read a 48-bit value from RR data * * For details, see rr_getdomain(). */ u_int48 rr_getuint48(const unsigned char *RDATA, u_int16 RRTYPE, int ix = 0); /*! * \brief read an IP address from RR data * * For details, see rr_getdomain(). Data is dynamically allocated. */ unsigned char *rr_getip4(const unsigned char *RDATA, u_int16 RRTYPE, int ix = 0); /*! * \brief read an IPv6 address from RR data * * For details, see rr_getdomain(). Data is dynamically allocated. */ unsigned char *rr_getip6(const unsigned char *RDATA, u_int16 RRTYPE, int ix = 0); /*! * \brief return pointer to start of data in RR * * For details, see rr_getdomain(). */ unsigned char *rr_getdata(const unsigned char *RDATA, u_int16 RRTYPE, int ix = 0); /*! * \brief read next item in a space-delimited string * * This function reads the next item from a space-delimited string. It will * raise an exception if none is found, and it will update the char pointer * on the way. Quotes, unless escaped by a backslash, will not be included * in the resulting string. Note that currently the maximum length of an * entry is 256 bytes. * * \param data Pointer to string (gets updated) * \return The next entry in the string * \sa read_line */ stl_string read_entry(char*& data); /*! * \brief read line from master/configuration file * * This function attempts to read a line from the file pointed to by f, placing * the results in the "buff" buffer of "buffsz" bytes. This function, which is * suitable for reading entries in a DNS master file, can automagically detect * escaping characters with special meaning, and it can read multi-line lines * with "(" and ")". The results that are placed in the buffer are suitable for * use in the read_entry function. * * One important thing in this context is the line number counter: as you can * see there are two line number counters, which is nessecary because the * line read function will always go to the beginning of the next source line * before exiting. Thus, the line number counter would point to the beginning * of the next (non-read) line. To prevent this, another pointer is given which * is at the beginning of the function set to the current, accurate, line * number. For this, a right value of the first pointer is required, though. * Note that linenum should be initially set to 1 before the first read_line call. * * \param buff Buffer to place the results in * \param f The file to read from * \param linenum Pointer to line number counter (may be NULL; points to next * source line) * \param linenum2 Pointer to current line number. * \param buffsz Size in bytes of the buffer (defaults to 1024) * \sa read_entry */ void read_line(char *buff, FILE *f, int *linenum = NULL, int *linenum2 = NULL, int buffsz = 1024); #endif /* __POSLIB_RR_H */ dibbler-1.0.1/poslib/w32poll.cpp0000644000175000017500000000576112277722750013357 00000000000000/* Posadis - A DNS Server Win32 poll implementation Copyright (C) 2002 Meilof Veeningen 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., 675 Mass Ave, Cambridge, MA 02139, USA. */ #include "dibbler-config.h" #include "syssocket.h" #ifndef HAVE_POLL #include "syssocket.h" #include "sysstring.h" #include "w32poll.h" #ifdef _WIN32 #define ECONNRESET WSAECONNRESET #define ECONNREFUSED WSAECONNREFUSED #define ENETDOWN WSAENETDOWN #define ECONNABORTED WSAECONNABORTED #define EBADF WSAEBADF #endif #include fd_set set_in, set_out, set_err; int poll(struct pollfd *ufds, unsigned int nfds, int timeout) { int ret = 0; unsigned int x; /* convert to msecs */ struct timeval tv = { timeout / 1000, (timeout % 1000) * 1000 }; bool have_inerr = false; bool have_out = false; FD_ZERO(&set_in); FD_ZERO(&set_out); FD_ZERO(&set_err); // at first, initialize the sockets for (x = 0; x < nfds; x++) { if (ufds[x].events & POLLIN) { have_inerr = true; FD_SET((unsigned int)ufds[x].fd, &set_in); } if (ufds[x].events & POLLOUT) { FD_SET((unsigned int)ufds[x].fd, &set_out); have_out = true; } if (ufds[x].events & POLLERR) { FD_SET((unsigned int)ufds[x].fd, &set_err); have_inerr = true; } } if (have_inerr) { // call select ret = select(FD_SETSIZE - 1, &set_in, NULL, &set_err, &tv); if (ret < 0) { return -1; } } if (have_out || !have_inerr) { // ..twice tv.tv_sec = 0; tv.tv_usec = 0; select(FD_SETSIZE - 1, NULL, &set_out, NULL, &tv); } // set right values for (x = 0; x < nfds; x++) { ufds[x].revents = 0; if (FD_ISSET(ufds[x].fd, &set_in)) ufds[x].revents |= POLLIN; if (FD_ISSET(ufds[x].fd, &set_out)) ufds[x].revents |= POLLOUT; if (FD_ISSET(ufds[x].fd, &set_err)) { ufds[x].revents |= POLLERR; /* check for hup */ u_long arg = 0; socklen_t arglen = sizeof(arg); if (!getsockopt(ufds[x].fd, SOL_SOCKET, SO_ERROR, (char *)&arg, &arglen) && arg != 0) { switch (arg) { case ECONNRESET: case ECONNREFUSED: case ENETDOWN: case ECONNABORTED: ufds[x].revents |= POLLHUP; break; case EBADF: ufds[x].revents |= POLLERR; break; } ufds[x].revents |= POLLERR; } } } return ret; } #endif dibbler-1.0.1/poslib/socket.h0000644000175000017500000001673712277722750013017 00000000000000/* Posadis - A DNS Server Socket functions Copyright (C) 2002 Meilof Veeningen 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., 675 Mass Ave, Cambridge, MA 02139, USA. */ #ifndef __POSLIB_SOCKET_H #define __POSLIB_SOCKET_H #include "syssocket.h" #include "sysstl.h" /*! \file poslib/socket.h * \brief system-indepent socket functions * * System-indepent socket functions. */ /*! * \brief address type * * This type offers a system-independent type representing an IPv4/IPv6 * address. Internally, this is a typedef to sockaddr_storage. */ typedef sockaddr_storage _addr; #define UDP_MSG_SIZE 512 /**< Maximum size of an UDP packet. */ #define TCP_MSG_SIZE 65536 /**< Maximum size of a TCP packet. */ #define DNS_PORT 53 /**< Default port for DNS. */ #define T_UDP 1 /**< Constant for UDP connections. */ #define T_TCP 2 /**< Constant for TCP connections. */ /** Set to true if you want to close down your application when sockets might still be active. */ extern bool posclient_quitflag; /* udp socket functions */ /** Opens an UDP server at the specified address/port, returning the socket id. */ int udpcreateserver(_addr *a); /** Closes an UDP connection, both server and client. */ void udpclose(int sockid); /** Reads data from an UDP connection. The address of the sender is put in addr. */ int udpread(int sockid, const char *buff, int len, _addr *addr); /** Sends data to the specified server through UDP. */ void udpsend(int sockid, const char *buff, int len, _addr *addr); /* tcp socket functions */ /** Opens a TCP server at the specified address/port, returning the socket id. */ int tcpcreateserver(_addr *a); /** Opens a TCP client connection to the specified server. */ int tcpopen(_addr *a); /** Opens a TCP client coonection to the specified server from the specificed source address. */ int tcpopen_from(_addr *to, _addr *source); /** Closes a TCP client/server connection. */ void tcpclose(int sockid); /** Accepts a client connection on a TCP server connection. */ int tcpaccept(int sockid, _addr *addr); /** Sends data through the TCP connection. Doesn't guarantee all data is sent, but returns immediately. */ int tcpsend(int sockid, const char *buff, int len); /** Sends all data through the TCP connection. Take at most \p maxtime milliseconds. */ void tcpsendall(int sockid, const char *buff, int len, int maxtime); /** Reads data from the TCP connection. Doesn't guarantee all data is read, but returns immediately. */ int tcpread(int sockid, const char *buff, int len); /** Reads \p len bytes through the TCP connection. Take at most \p maxtime milliseconds. */ void tcpreadall(int sockid, const char *buff, int len, int maxtime); /** Checks whether the TCP connection is still open. */ bool tcpisopen(int sockid); /* address functions */ /** Converts an IPv4 binary address to an _addr structure. */ void getaddress_ip4(_addr *res, const unsigned char *ipv4_data, int port = 0); /** Converts an IPv6 binary address to an _addr structure. */ void getaddress_ip6(_addr *res, const unsigned char *ipv6_data, int port = 0); /** Converts an textual address (either IPv4/IPv6) to an _addr structure. */ void getaddress(_addr *res, const char *data, int port = 0); /** Looks up the specified domain name using the system resolver, and creates an _addr structure. */ bool address_lookup(_addr *res, const char *name, int port); /** Sets the port of an _addr structure. */ void addr_setport(_addr *addr, int port); /** Gets the port of an _addr structure. */ int addr_getport(_addr *addr); /** Checks whether both _addr structures point to the same address. */ bool address_matches(_addr *a1, _addr *a2); /** Checks whether both _addr structures point to the same address and port. */ bool addrport_matches(_addr *a1, _addr *a2); /** Checks whether the address is an IPv4 address (obsolete, use #addr_is_ipv6). */ bool sock_is_ipv6(_addr *a); /** Checks whether the address is an IPv4 address. */ bool addr_is_ipv6(_addr *a); /** Checks whether the address is an IPv6 address (obsolete, use #addr_is_ipv4). */ bool sock_is_ipv4(_addr *a); /** Checks whether the address is an IPv6 address. */ bool addr_is_ipv4(_addr *a); /** Returns pointer to the four bytes of the IPv4 address. */ unsigned char *get_ipv4_ptr(_addr *a); bool addr_is_any(_addr *addr); /** Returns true if the given address is the IPv4 any address */ bool addr_is_none(_addr *addr); /** Returns true if the given address is the IPv4 none address */ /** Returns pointer to the sixteen bytes of the IPv6 address. */ unsigned char* get_ipv6_ptr(_addr *a); /** Converts the _addr structure to a human-readable string. */ stl_string addr_to_string(const _addr *addr, bool include_port = true); /* small watchset functions */ /*! * \brief checks whether data is avaiable on sockets * * This is a structure which is used to track whether data is avaible on a * series of sockets. As such, it is a replacement for, and actually a wrapper * for, the standard Unix poll() and select() functions. */ class smallset_t { public: smallset_t(); /**< Constructor. */ ~smallset_t(); /**< Destructor. */ void init(int ix); /**< Intiailizes the structure to hold \p ix sockets. */ void set(int ix, int socket); /**< Adds the socket at the specified index. */ void check(); /**< Check the status of the sockets. */ void waitwrite(int msecs); /**< Wait for at most the specified time until we can write on a socket. */ void wait(int msecs); /**< Wait for at most the specified time until data is received. */ bool canwrite(int ix); /**< Returns true if you can write non-blockingly to the socket at \p ix. */ bool isdata(int ix); /**< Returns true if you can read non-blockingly from the socket at \p ix. */ bool iserror(int ix); /**< Returns true if an error occured on the socket at \p ix. */ bool ishup(int ix); /**< Returns true if the connection was hung up. */ private: void runpoll(int msecs); void destroy(); int nitems; /**< Number of sockets. */ pollfd *items; /**< Information for the sockets. */ }; /*! * \brief returns the internet protocol ID from name * * Uses the system's getprotobyname() function to look up the service ID for * a given protocol (usually, "udp" or "tcp"). Additionally, if the given * string is a number, it will return that number. * * \param name The protocol name * \return The internet protocol ID */ int getprotocolbyname(const char *name); /*! * \brief returns the internet service port from name * * Uses the system's getservbyname() function to look up the port for * a given service (for example, "http" or "ftp"). Additionally, if the given * string is a number, it will return that number. * * \param name The service name * \return The service port */ int getserviceportbyname(const char *name); #endif /* __POSLIB_SOCKET_H */ dibbler-1.0.1/poslib/Makefile.in0000664000175000017500000005774412561652536013430 00000000000000# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ @HAVE_GTEST_TRUE@am__append_1 = tests subdir = poslib DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/depcomp $(dist_noinst_DATA) AUTHORS NEWS ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/libtool.m4 \ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/include/dibbler-config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = LIBRARIES = $(noinst_LIBRARIES) ARFLAGS = cru AM_V_AR = $(am__v_AR_@AM_V@) am__v_AR_ = $(am__v_AR_@AM_DEFAULT_V@) am__v_AR_0 = @echo " AR " $@; am__v_AR_1 = libPoslib_a_AR = $(AR) $(ARFLAGS) libPoslib_a_LIBADD = am_libPoslib_a_OBJECTS = dnsmessage.$(OBJEXT) domainfn.$(OBJEXT) \ dnssec-sign.$(OBJEXT) exception.$(OBJEXT) lexfn.$(OBJEXT) \ masterfile.$(OBJEXT) postime.$(OBJEXT) random.$(OBJEXT) \ resolver.$(OBJEXT) rr.$(OBJEXT) socket.$(OBJEXT) \ vsnprintf.$(OBJEXT) libPoslib_a_OBJECTS = $(am_libPoslib_a_OBJECTS) AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)/include depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = LTCXXCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CXXFLAGS) $(CXXFLAGS) AM_V_CXX = $(am__v_CXX_@AM_V@) am__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@) am__v_CXX_0 = @echo " CXX " $@; am__v_CXX_1 = CXXLD = $(CXX) CXXLINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \ $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CXXLD = $(am__v_CXXLD_@AM_V@) am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@) am__v_CXXLD_0 = @echo " CXXLD " $@; am__v_CXXLD_1 = COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(libPoslib_a_SOURCES) DIST_SOURCES = $(libPoslib_a_SOURCES) RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \ ctags-recursive dvi-recursive html-recursive info-recursive \ install-data-recursive install-dvi-recursive \ install-exec-recursive install-html-recursive \ install-info-recursive install-pdf-recursive \ install-ps-recursive install-recursive installcheck-recursive \ installdirs-recursive pdf-recursive ps-recursive \ tags-recursive uninstall-recursive am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac DATA = $(dist_noinst_DATA) RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive am__recursive_targets = \ $(RECURSIVE_TARGETS) \ $(RECURSIVE_CLEAN_TARGETS) \ $(am__extra_recursive_targets) AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \ distdir am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags DIST_SUBDIRS = . tests DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) am__relativize = \ dir0=`pwd`; \ sed_first='s,^\([^/]*\)/.*$$,\1,'; \ sed_rest='s,^[^/]*/*,,'; \ sed_last='s,^.*/\([^/]*\)$$,\1,'; \ sed_butlast='s,/*[^/]*$$,,'; \ while test -n "$$dir1"; do \ first=`echo "$$dir1" | sed -e "$$sed_first"`; \ if test "$$first" != "."; then \ if test "$$first" = ".."; then \ dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ else \ first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ if test "$$first2" = "$$first"; then \ dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ else \ dir2="../$$dir2"; \ fi; \ dir0="$$dir0"/"$$first"; \ fi; \ fi; \ dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ done; \ reldir="$$dir2" ACLOCAL = @ACLOCAL@ ALLOCA = @ALLOCA@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ ARCH = @ARCH@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ EXTRA_DIST_SUBDIRS = @EXTRA_DIST_SUBDIRS@ FGREP = @FGREP@ GREP = @GREP@ GTEST_INCLUDES = @GTEST_INCLUDES@ GTEST_LDADD = @GTEST_LDADD@ GTEST_LDFLAGS = @GTEST_LDFLAGS@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LINKPRINT = @LINKPRINT@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PORT_CFLAGS = @PORT_CFLAGS@ PORT_LDFLAGS = @PORT_LDFLAGS@ PORT_SUBDIR = @PORT_SUBDIR@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ subdirs = @subdirs@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ SUBDIRS = . $(am__append_1) noinst_LIBRARIES = libPoslib.a AM_CPPFLAGS = -I$(top_srcdir) -I$(top_srcdir)/include -I$(top_srcdir)/nettle -I$(top_srcdir)/Misc libPoslib_a_SOURCES = \ dnsmessage.cpp \ domainfn.cpp \ dnssec-sign.cpp \ dnssec-sign.h \ exception.cpp \ lexfn.cpp \ masterfile.cpp \ postime.cpp \ random.cpp \ resolver.cpp \ rr.cpp \ socket.cpp \ vsnprintf.cpp \ bits.h \ dnsmessage.h \ dnsdefs.h \ domainfn.h \ exception.h \ lexfn.h \ masterfile.h \ poslib.h \ postime.h \ random.h \ resolver.h \ rr.h \ socket.h \ syssocket.h \ sysstl.h \ sysstring.h \ syssocket.h \ types.h \ vsnprintf.h dist_noinst_DATA = w32poll.cpp w32poll.h ChangeLog-poslib all: all-recursive .SUFFIXES: .SUFFIXES: .cpp .lo .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign poslib/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign poslib/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstLIBRARIES: -test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES) libPoslib.a: $(libPoslib_a_OBJECTS) $(libPoslib_a_DEPENDENCIES) $(EXTRA_libPoslib_a_DEPENDENCIES) $(AM_V_at)-rm -f libPoslib.a $(AM_V_AR)$(libPoslib_a_AR) libPoslib.a $(libPoslib_a_OBJECTS) $(libPoslib_a_LIBADD) $(AM_V_at)$(RANLIB) libPoslib.a mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dnsmessage.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dnssec-sign.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/domainfn.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/exception.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lexfn.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/masterfile.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/postime.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/random.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/resolver.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rr.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/socket.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/vsnprintf.Po@am__quote@ .cpp.o: @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $< .cpp.obj: @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .cpp.lo: @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LTCXXCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs # This directory's subdirectories are mostly independent; you can cd # into them and run 'make' without going through this Makefile. # To change the values of 'make' variables: instead of editing Makefiles, # (1) if the variable is set in 'config.status', edit 'config.status' # (which will cause the Makefiles to be regenerated when you run 'make'); # (2) otherwise, pass the desired values on the 'make' command line. $(am__recursive_targets): @fail=; \ if $(am__make_keepgoing); then \ failcom='fail=yes'; \ else \ failcom='exit 1'; \ fi; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-recursive TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ empty_fix=.; \ else \ include_option=--include; \ empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-recursive CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-recursive cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ $(am__make_dryrun) \ || test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ $(am__relativize); \ new_distdir=$$reldir; \ dir1=$$subdir; dir2="$(top_distdir)"; \ $(am__relativize); \ new_top_distdir=$$reldir; \ echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ ($(am__cd) $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$new_top_distdir" \ distdir="$$new_distdir" \ am__remove_distdir=: \ am__skip_length_check=: \ am__skip_mode_fix=: \ distdir) \ || exit 1; \ fi; \ done check-am: all-am check: check-recursive all-am: Makefile $(LIBRARIES) $(DATA) installdirs: installdirs-recursive installdirs-am: install: install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-recursive clean-am: clean-generic clean-libtool clean-noinstLIBRARIES \ mostlyclean-am distclean: distclean-recursive -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive html-am: info: info-recursive info-am: install-data-am: install-dvi: install-dvi-recursive install-dvi-am: install-exec-am: install-html: install-html-recursive install-html-am: install-info: install-info-recursive install-info-am: install-man: install-pdf: install-pdf-recursive install-pdf-am: install-ps: install-ps-recursive install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-recursive -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: .MAKE: $(am__recursive_targets) install-am install-strip .PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am check \ check-am clean clean-generic clean-libtool \ clean-noinstLIBRARIES cscopelist-am ctags ctags-am distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ installdirs-am maintainer-clean maintainer-clean-generic \ mostlyclean mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf pdf-am ps ps-am tags tags-am uninstall \ uninstall-am # 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: dibbler-1.0.1/poslib/domainfn.h0000644000175000017500000004264212277722750013314 00000000000000/* Posadis - A DNS Server Domain functions Copyright (C) 2002 Meilof Veeningen 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., 675 Mass Ave, Cambridge, MA 02139, USA. */ #ifndef __POSLIB_DOMAINFN_H #define __POSLIB_DOMAINFN_H class domainname; #include "sysstl.h" #include "dnsmessage.h" /*! \file poslib/domainfn.h * \brief domain-name manipulation * * This source file offers various functions for domain-name manipulation. * Firstly, it offers the domainname class, which is a C++ class representing * a domain name. Secondly, it offers various functions for reading and * writing domain names from and to DNS messages, and thirdly, it offers * functions which can be used to manipulate domain names as they would * appear in DNS messages. These functions use the _domain typedef to * represent such a domain name. Usually you will not need to call these * yourself. */ /*! * \brief Maximum length of binary domain name * * This is the maximum length of a decompressed binary domain name. */ #define DOM_LEN 255 /*! * \brief Maximum length of domain name label * * This is the maximum length of a domain name label, not including the length * byte (in binary data), or the trailing \p '\0' label. */ #define DOMLABEL_LEN 63 /*! * \brief class representing a domain name * * This class represents a domain name. It offers functions to add domain * names together, retrieving labels from the domainname, and converting it to * human-readable strings and the binary format used in DNS messages. */ class domainname { public: /*! * \brief default constructor * * This constructor sets the domain name to ".", the root domain. */ domainname(); /*! * \brief constructor from human-readable text * * This constructor takes a domain name in human-readable notation, e.g. * "www.acdam.net", and an origin. If a relative domain name is given, it * will be considered relative to the specified origin. * \param text Human-readable domain name * \param origin Origin to which relative domain names are relative */ domainname(const char *text, const domainname& origin); /*! * \brief constructor from human-readable text * * This constructor takes a domain name in human-readable notation, e.g. * "www.acdam.net", and optionally an origin. The origin is in the binary * _domain format as found in DNS messages. In case of a relative domain * name, it is considered relative to this origin (or to the root domain, if * no origin is given). * \param text Human-readable domain name * \param origin Origin, in binary format, to which relative domain names are * relative */ domainname(const char *text, _cdomain origin = (unsigned char*)""); /*! * \brief constructor from data in a DNS message * * This constructor takes a DNS message, stored in a message_buff structor, * and an offset in this message where the domain name is to begin. This * function will decompress the domain name if nessecary. * \param buff A DNS message * \param ix Offset in the DNS message */ domainname(message_buff &buff, int ix); /*! * \brief constructor from binary domain name * * This constructor takes a domain name in binary form. Since a domain name * in binary form is a char *, just like a human-readable domain name, this * contructor takes a boolean value as well to prevent it from being * ambiguous. The value of the boolean is silently ignored. * \param is_binary Ignored * \param dom The binary domain name */ domainname(bool is_binary, const unsigned char* dom); /*! * \brief copy constructor * * This constructor just copies the given domainname structore. * \param nam The domain name */ domainname(const domainname& nam); /*! * \brief equality test * * Tests whether the two domain names are the same. Comparison is done in * a case-insensitive way. * \param nam Domain name to compare with * \return True if the domain names are the same */ bool operator==(const domainname& nam) const; /*! * \brief negatice equality test * * Tests whether the two domain names are the same. Comparison is done in * a case-insensitive way. * \param nam Domain name to compare with * \return True if the domain names are not the same */ bool operator!=(const domainname& nam) const; /*! * \brief assignment * * Assigns another domain name * \param nam The domain name to assign * \return The assigned domain name */ domainname& operator=(const domainname& nam); /*! * \brief assignment from human-readable text * * Assigns another domain name, given in human-readable text. Relative * domain names are considered relative to the root domain * \param buff The domain name in human-readable text * \return The assigned domain name */ domainname& operator=(const char *buff); /*! * \brief concatenation using += * * Appends another domain name to the current domain name. The current * domain name becomes a child domain of the appended domain name, for * example, domainname("www") += domainname("acdam.net") would become * \p www.acdam.net. * \param dom Domain name to append * \return The resulting domain name * \sa #operator+ */ domainname& operator+=(const domainname& dom); /*! * \brief concatenation using + * * Appends two domain names, returning a third. The first domain name * becomes a child domain of the second one. * \param dom The domain name to append * \return The result of the concaternation. */ domainname& operator+(const domainname& dom); /*! * \brief parent-child test * * Tests whether we are the child domain of the given domain name. This * function also returns true if the child and parent domains are the same. * \param dom Domain name to test * \return True if we are the parent * \sa operator> */ bool operator>=(const domainname& dom) const; /*! * \brief parent-child test * * Tests whether we are the child domain of the given domain name. Returns * false if the child and parent domain names given are the same. * \param dom Domain name to test * \return True if we are the parent * \sa operator>= */ bool operator>(const domainname& dom) const; /*! * \brief destructor * * Frees resources associated with the domain name */ ~domainname(); /*! * \brief binary representation of domain * * Returns the binary representation of the domain name as it would appear * in DNS messages (though in uncompressed form). * \return Binary representation for the domain name */ _domain c_str() const; /*! * \brief length of binary representation * * Returns the length, in bytes, also counting the terminating \\r \\0 * character, of the binary representation of the domain name. * \return Length of binary representation */ int len() const; /*! * \brief convert to human-readable string * * Converts the domain name to a human-readable string. The string will * always have a trailing dot. * \return Human-readable domain name * \sa tocstr() */ stl_string tostring() const; /*! * \brief convert to human-readable character array * * Converts the domain name to a human-readable character array. It will * also have a trailing dot. This is static data, so if you want a copy, * use a strdup(). * \sa tostring() */ #define tocstr() tostring().c_str() /*! * \brief number of labels of the domain name * * Returns the number of labels in the domain name, also counting the root * \p '\0' label at the end, * \return Number of labels * \sa label() */ int nlabels() const; /*! * \brief label in domain name * * Returns a label in the domain name. This is just plain human-readable * text. It does not contain dots. * \param ix Label index (0 <= ix < nlabels()) * \return The label at the specified index * \sa nlabels() */ stl_string label(int ix) const; /*! * \brief domain-name portion * * Returns the portion of the domain name from the label specified by ix. * \param ix Label index (inclusive) * \return The domain name portion * \sa nlabels(), to() */ domainname from(int ix) const; /*! * \brief domain-name portion * * Returns a domain name consisting of the first \c label labels of the given * domain name. * \param labels Number of labels * \return The domain name portion * \sa from() */ domainname to(int labels) const; /*! * \brief return relative representation * * Returns a string representation of the domain name, relative to the given * origin. If the domain is not a child of the given root, the complete, * absolte domain name is returned. If we are the domain name queried * itself, an "@" is returned. * \param root Domain name this domain is relative to * \return Relative string representation * \sa tostring() */ stl_string torelstring(const domainname &root) const; /*! * \brief RFC 2345 canonical form * * Returns the RFC 2535 canonical form of the domain name. The canonical form * is a unique binary representation of a domain name that is used for * checksummming domain names. * \return The Canonical form of the RR */ stl_string canonical () const; /*! * \brief check label match count * * Returns the number of labels the two domain names have in common at their * ends; for example this returns 2 for \c www.acdam.net and * \c www.foo.acdam.net . * \param dom The domain name to check with * \return Number of common labels * \sa nlabels() */ int ncommon(const domainname &dom) const; private: unsigned char *domain; }; /*! * \brief static binary domain name * * Use this typedef if you want to declare a static _domain variable. */ typedef unsigned char _sdomain[DOM_LEN]; /*! * \brief dump memory * * This is an alternative to the c strdup() function, but instead it can dump * any type of memory, as long as you give the right length. * \param src Source memory location * \param len Length of data * \return A newly-allocated copy of src. */ void *memdup(const void *src, int len); /*! * \brief compressed length * * This function returns the compressed length - that is, the length the domain * takes up in the DNS message - of a domain name. * \param buff A DNS messagee * \param ix Index of the domain name * \return Length in bytes the domain name takes up. */ int dom_comprlen(message_buff &buff, int ix); /*! * \brief uncompress domain name * * This function decompresses a domain name in a DNS message. It returns the * binary, decompressed data describing the domain name. * \param buff A DNS message * \param ix Index of the domain name * \return Uncompressed binary domain name (dynamically allocated) */ _domain dom_uncompress(message_buff &buff, int ix); /*! * \brief internal domain name compression structure * * Internal structure for domain name compression */ struct dom_compr_info { public: dom_compr_info(_cdomain _dom, int _ix, int _nl, int _nul); /**< Constructor. */ _cdomain dom; /**< Pointer to binary domain. */ int ix; /**< Index in message. */ int nl; /**< Total number of labels. */ int nul; /**< Number of uncompressed labels. */ }; /*! * \brief compress domain name * * This function writes a domain name to the end of a DNS message, compressing * it if possible. * \param ret A (partial) DNS message * \param dom Domain name to write * \param compr List of earlier compressed domain names, or NULL if no compression */ void dom_write(stl_string &ret, _cdomain dom, stl_slist(dom_compr_info)* compr); /* traditional domain-name functions */ /*! * \brief domain name portion pointer * * Returns a pointer to the portion of the domain name from the ix'th label. * \param dom Domain name * \param ix Index * \return Domain name portion */ _domain domfrom(_cdomain dom, int ix); /*! * \brief test for parent<->child relationship * * Tests whether the first domain name is a parent of the second domain name. * \param parent Parent domain * \param child Child domain * \return True if \p parent is indeed a parent of \p child . */ bool domisparent(_cdomain parent, _cdomain child); /*! * \brief length of binary domain name * * Returns the length, in bytes, including the trailing '\0' character, of * the domain name. * \param dom Domain name * \return Length of the domain name */ int domlen(_cdomain dom); /*! * \brief dynamic copy of binary domain name * * Makes a dynamically allocated copy of a domain name. * \param dom Domain name * \return Copy of domain name * \sa domcpy() */ _domain domdup(_cdomain dom); /*! * \brief compare binary domain labels * * Checks whether both binary domain name start with the same label. * \param dom1 First domain name * \param dom2 Second domain name * \return \p true if the domain names start with the same label */ bool domlcmp(_cdomain dom1, _cdomain dom2); /*! * \brief compare binary domain names * * Checks whether both binary domain names are equal. * \param dom1 First domain name * \param dom2 Second domain name * \return \p true if the domain names are equal */ bool domcmp(_cdomain dom1, _cdomain dom2); /*! * \brief domain name concatenation * * Appends \p src to \p target. Since it does not re-allocate memory, Make sure * that \p target can hold at least DOM_MAX bytes. * \param target Target * \param src Source */ void domcat(_domain target, _cdomain src); /*! * \brief static copy of binary domain name * * Makes a static copy of a domain name. Make sure that \p res can hold at least * DOM_MAX bytes. * \param res Target * \param src Source * \sa domdup() */ void domcpy(_domain res, _cdomain src); /*! * \brief create domain name from label * * Creates a domain name containing just one label: the string argument given. * If a length is given, only the first few characters of the string are used. * Make sure that \p dom can hold at least DOM_MAX bytes. * \param dom Result * \param label String label * \param len If given, length of string label (default: strlen(label)). */ void domfromlabel(_domain dom, const char *label, int len = -1); /*! * \brief to-string conversion * * Converts the domain name to a human-readable string. Contains the trailing * dot. * \param dom The domain name * \return Human-readable string. */ stl_string dom_tostring(_cdomain dom); /*! * \brief number of labels * * Returns the number of labels, also counting the empty '\0' label, of the * domain name. * \param dom The domain name * \return Number of labels */ int dom_nlabels(_cdomain dom); /*! * \brief label of domain name * * Returns a label of the domain name in human-readable form. * \param dom The domain name * \param label Label index (0 <= label < dom_nlabels(dom)) * \return The label * \sa dom_nlabels() */ stl_string dom_label(_cdomain dom, int label); /*! * \brief label of domain name * * Returns a label of the domain name as a pointer to the position in the domain. * \param dom The domain name * \param label Label index (0 < label < dom_nlabels(dom)) * \return The label * \sa dom_nlabels() */ _domain dom_plabel(_cdomain dom, int label); /*! * \brief check label match count * * Returns the number of labels the two domain names have in common at their * ends; for example this returns 2 for \c www.acdam.net and * \c www.foo.acdam.net . * \param dom1 The domain name to check with * \param dom2 The domain name to check against * \return Number of common labels * \sa nlabels() */ int domncommon(_cdomain dom1, _cdomain dom2); /*! * \brief compare domain names * * This function offers a way to compare domain names the way the \c strcmp * do. It operates in such a way that child domains are greater than parent * domains, and for for other domains, the first non-matching domain label is * compared using strcmpi. For example, \c www.foo.acdam.net is greater than * \c bar.acdam.net because \c foo is greater than \c bar which is the first * non-matching label after the common \c acdam.net part of the domain names. * * \param dom1 First domain name * \param dom2 Second domain name * \return <0, 0 or >0 if the first domain name is smaller than, equal to, or * larger than the second one, respectively. */ int domccmp(_cdomain dom1, _cdomain dom2); /*! * \brief return domain name portion * * Returns a domain name consisting of the first \c label labels of the given * domain name. The \c ret buffer should be large enough to hold the result * to prevent a buffer overflow. * * \param ret Result buffer * \param src Source domain * \param labels Number of labels to include */ void domto(_domain ret, _cdomain src, int labels); #endif /* __POSLIB_DOMAINFN_H */ dibbler-1.0.1/poslib/masterfile.cpp0000664000175000017500000002062712233256142014175 00000000000000/* Posadis - A DNS Server Master file reading functionality Copyright (C) 2002 Meilof Veeningen 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., 675 Mass Ave, Cambridge, MA 02139, USA. */ #include #include "masterfile.h" #include "exception.h" #include "rr.h" #include "lexfn.h" #include "sysstring.h" #include #ifdef WIN32 const char pathdelim = '\\'; #define S_ISREG(x) 1 /* always return 1 */ #else const char pathdelim = '/'; #endif stl_string rrdata_convertdoms(rr_type *rr, domainname znroot, domainname origin, char *ptr) { stl_string ret, tmp; char *cptr = rr->properties; domainname tmpd; while (*cptr) { tmp = read_entry(ptr); if (*cptr == 'd' || *cptr == 'm') { /* domain name */ if (!(*cptr == 'm' && strchr(tmp.c_str(), '@')) && tmp[tmp.size() - 1] != '.') { /* domain name is relative to a non-root origin. convert it to a root origin */ tmpd = domainname(tmp.c_str(), origin); if (ret.size()) ret += " "; ret += tmpd.torelstring(znroot); cptr++; continue; } } if (ret.size()) ret += " "; ret += tmp; cptr++; } return ret; } domainname guess_zone_name(const char *file) { const char *ptr = file + strlen(file) - 1; char tmp[256]; int t; while (ptr >= file) { if (*ptr == pathdelim) { ptr++; break; } ptr--; } t = strlen(ptr); if (tolower(ptr[0]) == 'd' && tolower(ptr[1]) == 'b' && ptr[2] == '.') { return ptr + 3; } else if (t >= 4 && (strncmpi(ptr + t - 4, ".prm", 4) == 0 || strncmpi(ptr + t - 4, ".dns", 4) == 0)) { if (strlen(ptr) - 4 >= 256) throw PException("File name too long!"); memcpy(tmp, ptr, t - 4); tmp[t - 4] = '\0'; return domainname((char*)tmp); } else return ptr; } bool file_exists(const char *file) { struct stat st; if (stat(file, &st) == 0) return true; else return false; } FILE *try_fopen_r(const char *file) { struct stat st; if (stat(file, &st) != 0) return NULL; else if (!S_ISREG(st.st_mode)) return NULL; else return fopen(file, "r"); } FILE *try_fopen(const char *file, const char *mode) { struct stat st; int ret = stat(file, &st); if (strcmpi(mode, "r") == 0 && ret != 0) return NULL; if (ret == 0 && !S_ISREG(st.st_mode)) return NULL; return fopen(file, mode); } void read_master_file(const char *file, domainname &znroot, void *userdat, error_callback err, rr_callback rr_cb, rr_literal_callback rrl_cb, comment_callback comm_cb, int flags) { bool has_znroot = !(flags&POSLIB_MF_AUTOPROBE), has_soa = false; char buff[1024]; char *ptr, *p2; int c; bool ttl_given = false; stl_string ttl = "3600"; domainname origin, nam; int linenum = 1, linenum2; stl_string str, tmp, t2, t3, nm; DnsRR rr; rr_type *type = NULL; FILE *f = try_fopen_r(file); if (!f) throw PException(true, "Could not open %s", file); c = fgetc(f); if (c != EOF) ungetc(c, f); if (has_znroot) origin = znroot; try { begin: while (!feof(f)) { /* since the poslib functions will filter out comments, let's do them ourselves */ if (comm_cb) { c = fgetc(f); if (c == ';') { if (!fgets(buff, 1024, f)) { break; } ptr = buff + strlen(buff) - 1; while (ptr >= buff && (*ptr == '\n' || *ptr == '\r')) *ptr = '\0'; comm_cb(userdat, buff); continue; } ungetc(c, f); } try { read_line(buff, f, &linenum, &linenum2); } catch (PException p) { break; } if (buff[0] == 0) goto begin; ptr = buff; while (*ptr == ' ' || *ptr == '\t') ptr++; if (*ptr == '\0') continue; if (buff[0] == '$') { if (strncmpi(buff, "$ttl ", 4) == 0) { ttl = buff + 5; ttl_given = true; } else if (strncmpi(buff, "$origin ", 8) == 0) { /* origin */ origin = domainname(buff + 8, znroot); if (!has_znroot) { /* first entry. this is the zone root */ znroot = origin; has_znroot = true; } } else err(userdat, file, linenum2, PException(true, "Unknown directive %s", buff).message); continue; } if (!has_znroot) { znroot = guess_zone_name(file); origin = znroot; has_znroot = true; } if (buff[0] != ' ' && buff[0] != '\t') { nam = domainname(read_entry(ptr).c_str(), origin); } else if (!has_soa) { err(userdat, file, linenum2, "First record in zone should have a domain name! Using origin instead."); nam = origin; } /* can be class or ttl or rrtype */ while (1) { str = read_entry(ptr); if (str == "IN" || str == "HS" || str == "CH" || str == "HS" || str == "in" || str == "hs" || str == "ch" || str == "hs") { /* class */ continue; } else if ((type = rrtype_getinfo(str.c_str())) != NULL) { break; } else { try { txt_to_int(str.c_str()); ttl_given = true; } catch (PException p) { err(userdat, file, linenum2, PException(true, "Invalid TTL/RR type %s!", str.c_str()).message); goto begin; } ttl = str.c_str(); } } if (!has_soa) { if (type->type != DNS_TYPE_SOA) { if (!(flags & POSLIB_MF_NOSOA)) { err(userdat, file, linenum2, "First record was no SOA record; using default SOA record instead."); if (rr_cb) { rr.NAME = znroot; rr.TYPE = DNS_TYPE_SOA; rr.TTL = 3600; tmp = rr_fromstring(DNS_TYPE_SOA, "ns1 hostmaster 1 2h 1h 1d 2h", znroot); rr.RDLENGTH = tmp.size(); rr.RDATA = (unsigned char *)memdup(tmp.c_str(), tmp.size()); rr_cb(userdat, &rr); } if (rrl_cb) rrl_cb(userdat, "@", "1h", "SOA", "ns1 hostmaster 1 2h 1h 1d 2h", znroot); } else if (!ttl_given) { err(userdat, file, linenum2, "First record should have TTL value; using 1h for now."); ttl = "3600"; ttl_given = true; } } else { if (!ttl_given) { p2 = ptr; read_entry(p2); read_entry(p2); read_entry(p2); read_entry(p2); read_entry(p2); read_entry(p2); t3 = read_entry(p2); if (strlen(t3.c_str()) < 32) ttl = t3; } } has_soa = true; } else if (type->type == DNS_TYPE_SOA && !(flags & POSLIB_MF_NOSOA)) { err(userdat, file, linenum2, "Non-initial SOA record ignored"); continue; } if (!(nam >= znroot)) { err(userdat, file, linenum2, PException(true, "Ignoring domain name %s outside of zone %s!", nam.tocstr(), znroot.tocstr()).message); continue; } if (rr_cb) { try { rr.NAME = nam; rr.TYPE = type->type; rr.TTL = txt_to_int(ttl.c_str()); tmp = rr_fromstring(type->type, ptr, origin); rr.RDLENGTH = tmp.size(); rr.RDATA = (unsigned char *)memdup(tmp.c_str(), tmp.size()); rr_cb(userdat, &rr); } catch (PException p) { err(userdat, file, linenum2, p.message); } } if (rrl_cb) { try { t2 = ptr; nm = nam.torelstring(znroot); tmp = rr_fromstring(type->type, ptr, origin); if (origin != znroot) t2 = rrdata_convertdoms(type, znroot, origin, ptr); } catch (PException p) { err(userdat, file, linenum2, p.message); } rrl_cb(userdat, nm.c_str(), ttl.c_str(), type->name, t2.c_str(), znroot); } } } catch (PException p) { fclose(f); throw p; } fclose(f); } dibbler-1.0.1/SrvIfaceMgr/0000775000175000017500000000000012561700420012264 500000000000000dibbler-1.0.1/SrvIfaceMgr/SrvIfaceMgr.h0000644000175000017500000000374012420531202014521 00000000000000/* * Dibbler - a portable DHCPv6 * * authors: Tomasz Mrugalski * Marek Senderski * changes: Petr Pisar * * released under GNU GPL v2 only licence * */ #ifndef SRVIFACEMGR_H #define SRVIFACEMGR_H #include "SmartPtr.h" #include "IfaceMgr.h" #include "Iface.h" #include "SrvMsg.h" #define SrvIfaceMgr() (TSrvIfaceMgr::instance()) class TSrvIfaceMgr :public TIfaceMgr { public: static void instanceCreate(const std::string& xmlDumpFile); static TSrvIfaceMgr &instance(); ~TSrvIfaceMgr(); friend std::ostream & operator <<(std::ostream & strum, TSrvIfaceMgr &x); SPtr decodeMsg(int ifindex, SPtr peer, char * buf, int bufsize); SPtr decodeRelayForw(SPtr physicalIface, SPtr peer, char * buf, int bufsize); //bool setupRelay(std::string name, int ifindex, int underIfindex, // SPtr interfaceID); void dump(); // --- transmission/reception methods --- virtual bool send(int iface, char *msg, int size, SPtr addr, int port); virtual int receive(unsigned long timeout, char* buf, int& bufsize, SPtr peer, SPtr myaddr); // ---receives messages--- SPtr select(unsigned long timeout); bool addFQDN(int iface, SPtr dnsAddr, SPtr addr, const std::string& domainname); bool delFQDN(int iface, SPtr dnsAddr, SPtr addr, const std::string& domainname); virtual void notifyScripts(const std::string& scriptName, SPtr question, SPtr answer); void redetectIfaces(); protected: TSrvIfaceMgr(const std::string& xmlFile); static TSrvIfaceMgr * Instance; std::string XmlFile; }; #endif dibbler-1.0.1/SrvIfaceMgr/Makefile.am0000644000175000017500000000112712277722750014255 00000000000000noinst_LIBRARIES = libSrvIfaceMgr.a libSrvIfaceMgr_a_CPPFLAGS = -I$(top_srcdir)/Misc -I$(top_srcdir)/IfaceMgr libSrvIfaceMgr_a_CPPFLAGS += -I$(top_srcdir)/SrvCfgMgr -I$(top_srcdir)/CfgMgr libSrvIfaceMgr_a_CPPFLAGS += -I$(top_srcdir)/Options -I$(top_srcdir)/SrvOptions libSrvIfaceMgr_a_CPPFLAGS += -I$(top_srcdir)/AddrMgr -I$(top_srcdir)/SrvAddrMgr -I$(top_srcdir)/SrvTransMgr libSrvIfaceMgr_a_CPPFLAGS += -I$(top_srcdir)/SrvMessages -I$(top_srcdir)/Messages libSrvIfaceMgr_a_CPPFLAGS += -I$(top_srcdir)/poslib/poslib -I$(top_srcdir)/poslib libSrvIfaceMgr_a_SOURCES = SrvIfaceMgr.cpp SrvIfaceMgr.h dibbler-1.0.1/SrvIfaceMgr/SrvIfaceMgr.cpp0000644000175000017500000007105412556507004015074 00000000000000/* * Dibbler - a portable DHCPv6 * * authors: Tomasz Mrugalski * Marek Senderski * changes: Michal Kowalczuk * Petr Pisar * * released under GNU GPL v2 only licence * */ #include #include #include #include #ifndef WIN32 #include #include #endif #include "Portable.h" #include "SmartPtr.h" #include "SrvIfaceMgr.h" #include "Msg.h" #include "SrvMsg.h" #include "Logger.h" #include "SrvMsgSolicit.h" #include "SrvMsgRequest.h" #include "SrvMsgConfirm.h" #include "SrvMsgRenew.h" #include "SrvMsgRebind.h" #include "SrvMsgRelease.h" #include "SrvMsgDecline.h" #include "SrvMsgInfRequest.h" #include "SrvMsgLeaseQuery.h" #include "SrvOptInterfaceID.h" #include "IPv6Addr.h" #include "AddrClient.h" #include "Iface.h" #include "OptOptionRequest.h" #include "OptGeneric.h" #include "OptVendorData.h" #include "OptIAAddress.h" #include "OptIAPrefix.h" #include "DNSUpdate.h" using namespace std; TSrvIfaceMgr * TSrvIfaceMgr::Instance = 0; /* * constructor. */ TSrvIfaceMgr::TSrvIfaceMgr(const std::string& xmlFile) : TIfaceMgr(xmlFile, false) { struct iface * ptr; struct iface * ifaceList; this->XmlFile = xmlFile; // get interface list ifaceList = if_list_get(); // external (C coded) function ptr = ifaceList; if (!ifaceList) { IsDone = true; Log(Crit) << "Unable to read info interfaces. Make sure " << "you are using proper port (i.e. win32 on WindowsXP or 2003)" << " and you have IPv6 support enabled." << LogEnd; return; } while (ptr!=NULL) { Log(Notice) << "Detected iface " << ptr->name << "/" << ptr->id // << ", flags=" << ptr->flags << ", MAC=" << this->printMac(ptr->mac, ptr->maclen) << "." << LogEnd; SPtr iface(new TIfaceIface(ptr->name,ptr->id, ptr->flags, ptr->mac, ptr->maclen, ptr->linkaddr, ptr->linkaddrcount, ptr->globaladdr, ptr->globaladdrcount, ptr->hardwareType)); this->IfaceLst.append((Ptr*) iface); ptr = ptr->next; } if_list_release(ifaceList); // allocated in pure C, and so release it there dump(); } TSrvIfaceMgr::~TSrvIfaceMgr() { Log(Debug) << "SrvIfaceMgr cleanup." << LogEnd; } void TSrvIfaceMgr::dump() { std::ofstream xmlDump; xmlDump.open( this->XmlFile.c_str() ); xmlDump << *this; xmlDump.close(); } /** * sends data to client. Uses unicast address as source * @param iface interface index * @param msg - buffer containing message ready to send * @param size - size of message * @param addr destination IPv6 address * @param port destination UDP port * @return true if message was send successfully */ bool TSrvIfaceMgr::send(int iface, char *msg, int size, SPtr addr, int port) { // find this interface SPtr ptrIface; ptrIface = this->getIfaceByID(iface); if (!ptrIface) { Log(Error) << "Send failed: No such interface id=" << iface << LogEnd; return false; } // find this socket SPtr sock; SPtr backup; ptrIface->firstSocket(); while (sock = ptrIface->getSocket()) { if (sock->multicast()) continue; // don't send anything via multicast sockets if (!backup) { backup = sock; } if (!addr->linkLocal() && sock->getAddr()->linkLocal()) continue; // we need socket bound to global address if dst is global addr if (addr->linkLocal() && !sock->getAddr()->linkLocal()) continue; // lets' not use global address as source is dst is link-local break; } if (!sock && !backup) { Log(Error) << "Send failed: interface " << ptrIface->getFullName() << " has no suitable open sockets." << LogEnd; return false; } if (!sock) { Log(Warning) << "No preferred socket found for transmission to " << addr->getPlain() << " on interface " << ptrIface->getFullName() << ". Using backup socket " << backup->getFD() << LogEnd; sock = backup; } // send it! if (sock->send(msg,size,addr,port) == 0) { return true; // all ok } else { return false; } } /// @brief tries to receive a packet /// /// This method is virtual for the purpose of easy faking packet /// reception in tests /// /// @param timeout select() timeout in seconds /// @param buf pointer to reception buffer /// @param bufsize reference to buffer size (will be updated to received packet size /// if reception is successful) /// @param peer address of the pkt sender /// @param myaddr address the packet was received on /// /// @return socket descriptor (or negative values for errors) /// int TSrvIfaceMgr::receive(unsigned long timeout, char* buf, int& bufsize, SPtr peer, SPtr myaddr) { return TIfaceMgr::select(timeout, buf, bufsize, peer, myaddr); } // @brief reads messages from all interfaces // it's wrapper around IfaceMgr::select(...) method // // @param timeout how long can we wait for packets (in seconds) // @return message object (or NULL) SPtr TSrvIfaceMgr::select(unsigned long timeout) { // static buffer speeds things up. We use maximum size for UDP (almost 64k) // to be on the safe side. Otherwise someone could send us a fragmented // huge UDP packet and we would be in for a surprise. :) const int maxBufsize = 0xffff - 20 - 8; int bufsize=maxBufsize; static char buf[maxBufsize]; SPtr peer(new TIPv6Addr()); SPtr myaddr(new TIPv6Addr()); int sockid; // read data sockid = receive(timeout, buf, bufsize, peer, myaddr); if (sockid < 0) { return SPtr(); // NULL } SPtr ptr; if (bufsize<4) { if (bufsize == 1 && buf[0] == CONTROL_MSG) { Log(Debug) << "Control message received." << LogEnd; return SPtr(); // NULL } Log(Warning) << "Received message is too short (" << bufsize << ") bytes, at least 4 are required." << LogEnd; return SPtr(); // NULL } // check message type int msgtype = buf[0]; SPtr ptrIface; // get interface ptrIface = (Ptr*)getIfaceBySocket(sockid); Log(Debug) << "Received " << bufsize << " bytes on interface " << ptrIface->getName() << "/" << ptrIface->getID() << " (socket=" << sockid << ", addr=" << *peer << "." << ")." << LogEnd; // create specific message object switch (msgtype) { case SOLICIT_MSG: case REQUEST_MSG: case CONFIRM_MSG: case RENEW_MSG: case REBIND_MSG: case RELEASE_MSG: case DECLINE_MSG: case INFORMATION_REQUEST_MSG: case LEASEQUERY_MSG: { ptr = decodeMsg(ptrIface->getID(), peer, buf, bufsize); break; } case RELAY_FORW_MSG: { ptr = decodeRelayForw(ptrIface, peer, buf, bufsize); break; } case ADVERTISE_MSG: case REPLY_MSG: case RECONFIGURE_MSG: case RELAY_REPL_MSG: case LEASEQUERY_REPLY_MSG: Log(Warning) << "Illegal message type " << msgtype << " received." << LogEnd; return SPtr(); // NULL default: Log(Warning) << "Message type " << msgtype << " not supported. Ignoring." << LogEnd; return SPtr(); // NULL } if (!ptr) return SPtr(); // NULL ptr->setLocalAddr(myaddr); #ifndef MOD_DISABLE_AUTH if (!ptr->validateReplayDetection()) { Log(Warning) << "Auth: message replay detection failed, message dropped" << LogEnd; return SPtr(); // NULL } bool authOk = ptr->validateAuthInfo(buf, bufsize, SrvCfgMgr().getAuthProtocol(), SrvCfgMgr().getAuthDigests()); if (SrvCfgMgr().getAuthDropUnauthenticated() && !ptr->getSPI()) { Log(Warning) << "Auth: authorization is mandatory, but incoming message" << " does not include AUTH option. Message dropped." << LogEnd; return SPtr(); // NULL } if (SrvCfgMgr().getAuthDropUnauthenticated() && !authOk) { Log(Warning) << "Auth: Received packet failed validation, which is mandatory." << " Message dropped." << LogEnd; return SPtr(); // NULL } #endif /// @todo: Implement support for draft-ietf-dhc-link-layer-address-opt char mac[20]; // maximum mac address for Infiniband is 20 bytes int mac_len = sizeof(mac); if (get_mac_from_ipv6(ptrIface->getName(), ptrIface->getID(), peer->getPlain(), mac, &mac_len) == 0) { /// @todo: Store MAC address in the message, so it could be logged later or added /// to the database TDUID tmp(mac, mac_len); // packed Log(Debug) << "Received message from IPv6 address " << peer->getPlain() << ", mac=" << tmp.getPlain() << " on interface " << ptrIface->getFullName() << LogEnd; } return ptr; } #if 0 bool TSrvIfaceMgr::setupRelay(std::string name, int ifindex, int underIfindex, SPtr interfaceID) { SPtr under = (Ptr*)this->getIfaceByID(underIfindex); if (!under) { Log(Crit) << "Unable to setup " << name << "/" << ifindex << " relay: underlaying interface with id=" << underIfindex << " is not present in the system or does not support IPv6." << LogEnd; return false; } if (!under->flagUp()) { Log(Crit) << "Unable to setup " << name << "/" << ifindex << " relay: underlaying interface " << under->getName() << "/" << underIfindex << " is down." << LogEnd; return false; } SPtr relay = new TSrvIfaceIface((const char*)name.c_str(), ifindex, IFF_UP | IFF_RUNNING | IFF_MULTICAST, // flags 0, // MAC 0, // MAC length 0,0, // link address 0,0, // global addresses 0); // hardware type relay->setUnderlaying(under); this->IfaceLst.append((Ptr*)relay); if (!under->appendRelay(relay, interfaceID)) { Log(Crit) << "Unable to setup " << name << "/" << ifindex << " relay: underlaying interface " << under->getName() << "/" << underIfindex << " already has " << HOP_COUNT_LIMIT << " relays defined." << LogEnd; return false; } Log(Notice) << "Relay " << name << "/" << ifindex << " (underlaying " << under->getName() << "/" << under->getID() << ") has been configured." << LogEnd; return true; } #endif SPtr TSrvIfaceMgr::decodeRelayForw(SPtr physicalIface, SPtr peer, char * buf, int bufsize) { SPtr linkAddrTbl[HOP_COUNT_LIMIT]; SPtr peerAddrTbl[HOP_COUNT_LIMIT]; int hopTbl[HOP_COUNT_LIMIT]; TOptList echoListTbl[HOP_COUNT_LIMIT]; int relays=0; // number of nested RELAY_FORW messages SPtr remoteID; SPtr echo; SPtr gen; int ifindex = -1; char * relay_buf = buf; int relay_bufsize = bufsize; for (int j=0;j0 && buf[0]==RELAY_FORW_MSG) { /* decode RELAY_FORW message */ if (bufsize < 34) { Log(Warning) << "Truncated RELAY_FORW message received." << LogEnd; return SPtr(); // NULL } SPtr ptrIfaceID; how_found = ""; char type = buf[0]; if (type!=RELAY_FORW_MSG) return SPtr(); // NULL int hopCount = buf[1]; int optRelayCnt = 0; int optIfaceIDCnt = 0; SPtr linkAddr = new TIPv6Addr(buf+2,false); SPtr peerAddr = new TIPv6Addr(buf+18, false); buf+=34; bufsize-=34; // options: only INTERFACE-ID and RELAY_MSG are allowed while (bufsize>=4) { unsigned short code = readUint16(buf); buf += sizeof(uint16_t); bufsize -= sizeof(uint16_t); int len = readUint16(buf); buf += sizeof(uint16_t); bufsize -= sizeof(uint16_t); gen.reset(); if (len > bufsize) { Log(Warning) << "Truncated option " << code << ": " << bufsize << " bytes remaining, but length is " << len << "." << LogEnd; return SPtr(); // NULL } switch (code) { case OPTION_INTERFACE_ID: if (bufsize < 1) { Log(Warning) << "Truncated INTERFACE_ID option (length: " << bufsize << ") in RELAY_FORW message. Message dropped." << LogEnd; return SPtr(); // NULL } ptrIfaceID = new TSrvOptInterfaceID(buf, len, 0); gen = (Ptr*)ptrIfaceID; optIfaceIDCnt++; break; case OPTION_RELAY_MSG: relay_buf = buf; relay_bufsize = len; optRelayCnt++; break; case OPTION_REMOTE_ID: remoteID = new TOptVendorData(OPTION_REMOTE_ID, buf, len, 0); gen = (Ptr*) remoteID; break; case OPTION_ERO: Log(Debug) << "Echo Request received in RELAY_FORW." << LogEnd; gen = new TOptOptionRequest(OPTION_ERO, buf, len, 0); break; default: gen = new TOptGeneric(code, buf, len, 0); } if (gen) { echoListTbl[relays].push_back(gen); } buf += len; bufsize -= len; } #if 0 // remember options to be echoed echoListTbl[relays].first(); while (gen = echoListTbl[relays].get()) { if (!echo) { Log(Warning) << "Invalid option (" << gen->getOptType() << ") in RELAY_FORW message was ignored." << LogEnd; echoListTbl[relays].del(); } else { if (!echo->isOption(gen->getOptType())) { Log(Warning) << "Invalid option (" << gen->getOptType() << ") in RELAY_FORW message was ignored." << LogEnd; echoListTbl[relays].del(); } else { Log(Info) << "Option " << gen->getOptType() << " will be echoed back." << LogEnd; } } } #endif // remember those links linkAddrTbl[relays] = linkAddr; peerAddrTbl[relays] = peerAddr; hopTbl[relays] = hopCount; relays++; if (relays> HOP_COUNT_LIMIT) { Log(Error) << "Message is nested more than allowed " << HOP_COUNT_LIMIT << " times. Message dropped." << LogEnd; return SPtr(); // NULL } if (optRelayCnt!=1) { Log(Error) << optRelayCnt << " RELAY_MSG options received, but exactly one was " << "expected. Message dropped." << LogEnd; return SPtr(); // NULL } if (optIfaceIDCnt>1) { Log(Error) << "More than one (" << optIfaceIDCnt << ") interface-ID options received, but exactly 1 was expected. " << "Message dropped." << LogEnd; return SPtr(); // NULL } Log(Info) << "RELAY_FORW was decapsulated: link=" << linkAddr->getPlain() << ", peer=" << peerAddr->getPlain(); // --- selectSubnet() starts here --- bool guessMode = SrvCfgMgr().guessMode(); // First try to find a relay based on the interface-id option if (ptrIfaceID) { Log(Cont) << ", interfaceID len=" << ptrIfaceID->getSize() << LogEnd; ifindex = SrvCfgMgr().getRelayByInterfaceID(ptrIfaceID); if (ifindex == -1) { Log(Debug) << "Unable to find relay interface with interfaceID=" << ptrIfaceID->getPlain() << " defined on the " << physicalIface->getFullName() << " interface." << LogEnd; } else { how_found = "using interface-id=" + ptrIfaceID->getPlain(); } } else { Log(Cont) << ", no interface-id option." << LogEnd; } // then try to find a relay based on the link address if (ifindex == -1) { ifindex = SrvCfgMgr().getRelayByLinkAddr(linkAddr); if (ifindex == -1) { Log(Info) << "Unable to find relay interface using link address: " << linkAddr->getPlain() << LogEnd; } else { how_found = string("using link-addr=") + linkAddr->getPlain(); } } // the last hope - use guess-mode to get any relay if ((ifindex == -1) && guessMode) { ifindex = SrvCfgMgr().getAnyRelay(); if (ifindex != -1) { how_found = "using guess-mode"; } } // --- selectSubnet() ends here --- // now switch to relay interface buf = relay_buf; bufsize = relay_bufsize; } if (ifindex == -1) { Log(Warning) << "Unable to find appropriate interface for this RELAY-FORW." << LogEnd; return SPtr(); // NULL } else { SPtr cfgIface = SrvCfgMgr().getIfaceByID(ifindex); Log(Notice) << "Found relay " << cfgIface->getFullName() << " by " << how_found << LogEnd; } SPtr msg = decodeMsg(ifindex, peer, relay_buf, relay_bufsize); if (!msg) { return SPtr(); // NULL } for (int i=0; iaddRelayInfo(linkAddrTbl[i], peerAddrTbl[i], hopTbl[i], echoListTbl[i]); } msg->setPhysicalIface(physicalIface->getID()); if (remoteID) { Log(Debug) << "RemoteID received: vendor=" << remoteID->getVendor() << ", length=" << remoteID->getVendorDataLen() << "." << LogEnd; msg->setRemoteID(remoteID); /// @todo: WTF is that? ----v remoteID.reset(); remoteID = msg->getRemoteID(); PrintHex("RemoteID:", (uint8_t*)remoteID->getVendorData(), remoteID->getVendorDataLen()); } return (Ptr*)msg; } SPtr TSrvIfaceMgr::decodeMsg(int ifaceid, SPtr peer, char * buf, int bufsize) { if (bufsize < 4) {// 4 is the minimum DHCPv6 packet size (type + 3 bytes for transaction-id) Log(Warning) << "Truncated message received (len " << bufsize << ", at least 4 is required)." << LogEnd; return SPtr(); // NULL } switch (buf[0]) { case SOLICIT_MSG: return new TSrvMsgSolicit(ifaceid, peer, buf, bufsize); case REQUEST_MSG: return new TSrvMsgRequest(ifaceid, peer, buf, bufsize); case CONFIRM_MSG: return new TSrvMsgConfirm(ifaceid, peer, buf, bufsize); case RENEW_MSG: return new TSrvMsgRenew (ifaceid, peer, buf, bufsize); case REBIND_MSG: return new TSrvMsgRebind (ifaceid, peer, buf, bufsize); case RELEASE_MSG: return new TSrvMsgRelease(ifaceid, peer, buf, bufsize); case DECLINE_MSG: return new TSrvMsgDecline(ifaceid, peer, buf, bufsize); case INFORMATION_REQUEST_MSG: return new TSrvMsgInfRequest(ifaceid, peer, buf, bufsize); case LEASEQUERY_MSG: return new TSrvMsgLeaseQuery(ifaceid, peer, buf, bufsize); default: Log(Warning) << "Illegal message type " << (int)(buf[0]) << " received." << LogEnd; return SPtr(); // NULL } } /** * Compares current flags of interfaces with old flags. If change is detected, * stored flags of the interface are updated */ void TSrvIfaceMgr::redetectIfaces() { struct iface * ptr; struct iface * ifaceList; SPtr iface; ifaceList = if_list_get(); // external (C coded) function ptr = ifaceList; if (!ifaceList) { Log(Error) << "Unable to read interface info. Inactive mode failed." << LogEnd; return; } while (ptr!=NULL) { iface = getIfaceByID(ptr->id); if (iface && (ptr->flags!=iface->getFlags())) { Log(Notice) << "Flags on interface " << iface->getFullName() << " has changed (old=" << hex <getFlags() << ", new=" << ptr->flags << ")." << dec << LogEnd; iface->updateState(ptr); } ptr = ptr->next; } if_list_release(ifaceList); // allocated in pure C, and so release it there } void TSrvIfaceMgr::instanceCreate(const std::string& xmlDumpFile) { if (Instance) { Log(Crit) << "SrvIfaceMgr instance already created! Application error." << LogEnd; return; // don't create second instance } Instance = new TSrvIfaceMgr(xmlDumpFile); } TSrvIfaceMgr & TSrvIfaceMgr::instance() { if (!Instance) { Log(Crit) << "SrvIfaceMgr not create yet. Application error. Emergency shutdown." << LogEnd; exit(EXIT_FAILURE); } return *Instance; } bool TSrvIfaceMgr::addFQDN(int iface, SPtr dnsAddr, SPtr addr, const std::string& name) { bool success = true; #ifndef MOD_SRV_DISABLE_DNSUPDATE SPtr cfgIface = SrvCfgMgr().getIfaceByID(iface); if (!cfgIface) { Log(Error) << "Unable find cfgIface with ifindex=" << iface << ", DDNS failed." << LogEnd; return false; } DnsUpdateModeCfg FQDNMode = static_cast(cfgIface->getFQDNMode()); SPtr key = SrvCfgMgr().getKey(); TCfgMgr::DNSUpdateProtocol proto = SrvCfgMgr().getDDNSProtocol(); DNSUpdate::DnsUpdateProtocol proto2 = DNSUpdate::DNSUPDATE_TCP; if (proto == TCfgMgr::DNSUPDATE_UDP) proto2 = DNSUpdate::DNSUPDATE_UDP; if (proto == TCfgMgr::DNSUPDATE_ANY) proto2 = DNSUpdate::DNSUPDATE_ANY; unsigned int timeout = SrvCfgMgr().getDDNSTimeout(); // FQDNMode: 0 = NONE, 1 = PTR only, 2 = BOTH PTR and AAAA if ((FQDNMode == DNSUPDATE_MODE_PTR) || (FQDNMode == DNSUPDATE_MODE_BOTH)) { //Test for DNS update char zoneroot[128]; doRevDnsZoneRoot(addr->getAddr(), zoneroot, cfgIface->getRevDNSZoneRootLength()); /* add PTR only */ DnsUpdateResult result = DNSUPDATE_SKIP; DNSUpdate *act = new DNSUpdate(dnsAddr->getPlain(), zoneroot, name, addr->getPlain(), DNSUPDATE_PTR, proto2); if (key) { act->setTSIG(key->Name_, key->getPackedData(), key->getAlgorithmText(), key->Fudge_); } result = act->run(timeout); act->showResult(result); delete act; success = (result == DNSUPDATE_SUCCESS); } if (FQDNMode == DNSUPDATE_MODE_BOTH) { DnsUpdateResult result = DNSUPDATE_SKIP; DNSUpdate *act = new DNSUpdate(dnsAddr->getPlain(), "", name, addr->getPlain(), DNSUPDATE_AAAA, proto2); if (key) { act->setTSIG(key->Name_, key->getPackedData(), key->getAlgorithmText(), key->Fudge_); } result = act->run(timeout); act->showResult(result); delete act; success = (result == DNSUPDATE_SUCCESS) && success; } #else Log(Info) << "DNSUpdate not compiled in. Pretending success." << LogEnd; #endif return success; } bool TSrvIfaceMgr::delFQDN(int iface, SPtr dnsAddr, SPtr addr, const std::string& name) { bool success = true; #ifndef MOD_SRV_DISABLE_DNSUPDATE SPtr cfgIface = SrvCfgMgr().getIfaceByID(iface); if (!cfgIface) { Log(Error) << "Unable find cfgIface with ifindex=" << iface << ", DDNS failed." << LogEnd; return false; } DnsUpdateModeCfg FQDNMode = static_cast(cfgIface->getFQDNMode()); SPtr key = SrvCfgMgr().getKey(); char zoneroot[128]; doRevDnsZoneRoot(addr->getAddr(), zoneroot, cfgIface->getRevDNSZoneRootLength()); // that's ugly but required. Otherwise we would have to include CfgMgr.h in DNSUpdate.h // and that would include both poslib and Dibbler headers in one place. Universe would // implode then. TCfgMgr::DNSUpdateProtocol proto = SrvCfgMgr().getDDNSProtocol(); DNSUpdate::DnsUpdateProtocol proto2 = DNSUpdate::DNSUPDATE_TCP; if (proto == TCfgMgr::DNSUPDATE_UDP) proto2 = DNSUpdate::DNSUPDATE_UDP; if (proto == TCfgMgr::DNSUPDATE_ANY) proto2 = DNSUpdate::DNSUPDATE_ANY; unsigned int timeout = SrvCfgMgr().getDDNSTimeout(); // FQDNMode: 0 = NONE, 1 = PTR only, 2 = BOTH PTR and AAAA if ((FQDNMode == DNSUPDATE_MODE_PTR) || (FQDNMode == DNSUPDATE_MODE_BOTH)) { /* PTR cleanup */ // Log(Notice) << "FQDN: Attempting to clean up PTR record in DNS Server " // << dnsAddr->getPlain() << ", IP = " << addr->getPlain() // << " and FQDN=" << name << LogEnd; DNSUpdate *act = new DNSUpdate(dnsAddr->getPlain(), zoneroot, name, addr->getPlain(), DNSUPDATE_PTR_CLEANUP, proto2); if (key) { act->setTSIG(key->Name_, key->getPackedData(), key->getAlgorithmText(), key->Fudge_); } int result = act->run(timeout); act->showResult(result); delete act; success = (result == DNSUPDATE_SUCCESS); } if (FQDNMode == DNSUPDATE_MODE_BOTH) { /* AAAA Cleanup */ //Log(Notice) << "FQDN: Attempting to clean up AAAA and PTR record in DNS Server " // << dnsAddr->getPlain() << ", IP = " << addr->getPlain() // << " and FQDN=" << name << LogEnd; DNSUpdate *act = new DNSUpdate(dnsAddr->getPlain(), "", name, addr->getPlain(), DNSUPDATE_AAAA_CLEANUP, proto2); if (key) { act->setTSIG(key->Name_, key->getPackedData(), key->getAlgorithmText(), key->Fudge_); } int result = act->run(timeout); act->showResult(result); delete act; success = (result == DNSUPDATE_SUCCESS) && success; } #else Log(Info) << "DNSUpdate not compiled in. Pretending success." << LogEnd; #endif return success; } void TSrvIfaceMgr::notifyScripts(const std::string& scriptName, SPtr question, SPtr answer) { TNotifyScriptParams* params = (TNotifyScriptParams*)answer->getNotifyScriptParams(); // add info about relays SPtr reply = (Ptr*)answer; const vector relayInfo = reply->RelayInfo_; stringstream relaysNum; relaysNum << relayInfo.size(); params->addParam("RELAYS", relaysNum.str()); int cnt = 1; for (vector::const_reverse_iterator relay = relayInfo.rbegin(); relay != relayInfo.rend(); ++relay) { stringstream peer; stringstream link; peer << "RELAY" << cnt << "_PEER"; link << "RELAY" << cnt << "_LINK"; params->addParam(peer.str(), relay->PeerAddr_->getPlain()); params->addParam(link.str(), relay->LinkAddr_->getPlain()); cnt++; } TIfaceMgr::notifyScripts(scriptName, question, answer); } ostream & operator <<(ostream & strum, TSrvIfaceMgr &x) { strum << "" << std::endl; SPtr ptr; x.IfaceLst.first(); while ( ptr= (Ptr*) x.IfaceLst.get() ) { strum << *ptr; } strum << "" << std::endl; return strum; } dibbler-1.0.1/SrvIfaceMgr/Makefile.in0000664000175000017500000005121712561652535014274 00000000000000# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = SrvIfaceMgr DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/depcomp ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/libtool.m4 \ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/include/dibbler-config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = LIBRARIES = $(noinst_LIBRARIES) ARFLAGS = cru AM_V_AR = $(am__v_AR_@AM_V@) am__v_AR_ = $(am__v_AR_@AM_DEFAULT_V@) am__v_AR_0 = @echo " AR " $@; am__v_AR_1 = libSrvIfaceMgr_a_AR = $(AR) $(ARFLAGS) libSrvIfaceMgr_a_LIBADD = am_libSrvIfaceMgr_a_OBJECTS = libSrvIfaceMgr_a-SrvIfaceMgr.$(OBJEXT) libSrvIfaceMgr_a_OBJECTS = $(am_libSrvIfaceMgr_a_OBJECTS) AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)/include depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) LTCXXCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CXXFLAGS) $(CXXFLAGS) AM_V_CXX = $(am__v_CXX_@AM_V@) am__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@) am__v_CXX_0 = @echo " CXX " $@; am__v_CXX_1 = CXXLD = $(CXX) CXXLINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \ $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CXXLD = $(am__v_CXXLD_@AM_V@) am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@) am__v_CXXLD_0 = @echo " CXXLD " $@; am__v_CXXLD_1 = COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(libSrvIfaceMgr_a_SOURCES) DIST_SOURCES = $(libSrvIfaceMgr_a_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALLOCA = @ALLOCA@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ ARCH = @ARCH@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ EXTRA_DIST_SUBDIRS = @EXTRA_DIST_SUBDIRS@ FGREP = @FGREP@ GREP = @GREP@ GTEST_INCLUDES = @GTEST_INCLUDES@ GTEST_LDADD = @GTEST_LDADD@ GTEST_LDFLAGS = @GTEST_LDFLAGS@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LINKPRINT = @LINKPRINT@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PORT_CFLAGS = @PORT_CFLAGS@ PORT_LDFLAGS = @PORT_LDFLAGS@ PORT_SUBDIR = @PORT_SUBDIR@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ subdirs = @subdirs@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ noinst_LIBRARIES = libSrvIfaceMgr.a libSrvIfaceMgr_a_CPPFLAGS = -I$(top_srcdir)/Misc \ -I$(top_srcdir)/IfaceMgr -I$(top_srcdir)/SrvCfgMgr \ -I$(top_srcdir)/CfgMgr -I$(top_srcdir)/Options \ -I$(top_srcdir)/SrvOptions -I$(top_srcdir)/AddrMgr \ -I$(top_srcdir)/SrvAddrMgr -I$(top_srcdir)/SrvTransMgr \ -I$(top_srcdir)/SrvMessages -I$(top_srcdir)/Messages \ -I$(top_srcdir)/poslib/poslib -I$(top_srcdir)/poslib libSrvIfaceMgr_a_SOURCES = SrvIfaceMgr.cpp SrvIfaceMgr.h all: all-am .SUFFIXES: .SUFFIXES: .cpp .lo .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign SrvIfaceMgr/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign SrvIfaceMgr/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstLIBRARIES: -test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES) libSrvIfaceMgr.a: $(libSrvIfaceMgr_a_OBJECTS) $(libSrvIfaceMgr_a_DEPENDENCIES) $(EXTRA_libSrvIfaceMgr_a_DEPENDENCIES) $(AM_V_at)-rm -f libSrvIfaceMgr.a $(AM_V_AR)$(libSrvIfaceMgr_a_AR) libSrvIfaceMgr.a $(libSrvIfaceMgr_a_OBJECTS) $(libSrvIfaceMgr_a_LIBADD) $(AM_V_at)$(RANLIB) libSrvIfaceMgr.a mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libSrvIfaceMgr_a-SrvIfaceMgr.Po@am__quote@ .cpp.o: @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $< .cpp.obj: @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .cpp.lo: @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LTCXXCOMPILE) -c -o $@ $< libSrvIfaceMgr_a-SrvIfaceMgr.o: SrvIfaceMgr.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libSrvIfaceMgr_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libSrvIfaceMgr_a-SrvIfaceMgr.o -MD -MP -MF $(DEPDIR)/libSrvIfaceMgr_a-SrvIfaceMgr.Tpo -c -o libSrvIfaceMgr_a-SrvIfaceMgr.o `test -f 'SrvIfaceMgr.cpp' || echo '$(srcdir)/'`SrvIfaceMgr.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libSrvIfaceMgr_a-SrvIfaceMgr.Tpo $(DEPDIR)/libSrvIfaceMgr_a-SrvIfaceMgr.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='SrvIfaceMgr.cpp' object='libSrvIfaceMgr_a-SrvIfaceMgr.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libSrvIfaceMgr_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libSrvIfaceMgr_a-SrvIfaceMgr.o `test -f 'SrvIfaceMgr.cpp' || echo '$(srcdir)/'`SrvIfaceMgr.cpp libSrvIfaceMgr_a-SrvIfaceMgr.obj: SrvIfaceMgr.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libSrvIfaceMgr_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libSrvIfaceMgr_a-SrvIfaceMgr.obj -MD -MP -MF $(DEPDIR)/libSrvIfaceMgr_a-SrvIfaceMgr.Tpo -c -o libSrvIfaceMgr_a-SrvIfaceMgr.obj `if test -f 'SrvIfaceMgr.cpp'; then $(CYGPATH_W) 'SrvIfaceMgr.cpp'; else $(CYGPATH_W) '$(srcdir)/SrvIfaceMgr.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libSrvIfaceMgr_a-SrvIfaceMgr.Tpo $(DEPDIR)/libSrvIfaceMgr_a-SrvIfaceMgr.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='SrvIfaceMgr.cpp' object='libSrvIfaceMgr_a-SrvIfaceMgr.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libSrvIfaceMgr_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libSrvIfaceMgr_a-SrvIfaceMgr.obj `if test -f 'SrvIfaceMgr.cpp'; then $(CYGPATH_W) 'SrvIfaceMgr.cpp'; else $(CYGPATH_W) '$(srcdir)/SrvIfaceMgr.cpp'; fi` mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LIBRARIES) installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool clean-noinstLIBRARIES \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \ clean-libtool clean-noinstLIBRARIES cscopelist-am ctags \ ctags-am distclean distclean-compile distclean-generic \ distclean-libtool distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-dvi install-dvi-am install-exec \ install-exec-am install-html install-html-am install-info \ install-info-am install-man install-pdf install-pdf-am \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ tags tags-am uninstall uninstall-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: dibbler-1.0.1/ClntAddrMgr/0000775000175000017500000000000012561700421012256 500000000000000dibbler-1.0.1/ClntAddrMgr/Makefile.am0000664000175000017500000000025012233256142014231 00000000000000noinst_LIBRARIES = libClntAddrMgr.a libClntAddrMgr_a_CPPFLAGS = -I$(top_srcdir)/Misc -I$(top_srcdir)/AddrMgr libClntAddrMgr_a_SOURCES = ClntAddrMgr.cpp ClntAddrMgr.h dibbler-1.0.1/ClntAddrMgr/ClntAddrMgr.h0000644000175000017500000000464212277722750014531 00000000000000/* * Dibbler - a portable DHCPv6 * * authors: Tomasz Mrugalski * Marek Senderski * * released under GNU GPL v2 only licence * */ #ifndef CLNTADDRMGR_H #define CLNTADDRMGR_H #include "Container.h" #include "SmartPtr.h" #include "AddrIA.h" #include "AddrMgr.h" #include "Portable.h" #include "IPv6Addr.h" #include "ScriptParams.h" #define ClntAddrMgr() (TClntAddrMgr::instance()) class TClntAddrMgr : public TAddrMgr { private: TClntAddrMgr(SPtr clientDuid, bool useConfirm, const std::string& xmlFile, bool loadDB); public: static TClntAddrMgr& instance(); static void instanceCreate(SPtr clientDUID, bool useConfirm, const std::string& xmlFile, bool loadDB); unsigned long getT1Timeout(); unsigned long getT2Timeout(); unsigned long getPrefTimeout(); unsigned long getValidTimeout(); unsigned long getTimeout(); unsigned long getTentativeTimeout(); // --- IA --- void firstIA(); SPtr getIA(); SPtr getIA(unsigned long IAID); void addIA(SPtr ptr); bool delIA(long IAID); int countIA(); void setIA2Confirm(volatile link_state_notify_t * changedLinks); SPtr getPreferredAddr(); // --- PD --- void firstPD(); SPtr getPD(); SPtr getPD(unsigned long IAID); void addPD(SPtr ptr); bool delPD(long IAID); int countPD(); bool addPrefix(SPtr srvDuid , SPtr srvAddr, const std::string& ifacename, int iface, unsigned long IAID, unsigned long T1, unsigned long T2, SPtr prefix, unsigned long pref, unsigned long valid, int length, bool quiet); bool updatePrefix(SPtr srvDuid , SPtr srvAddr, const std::string& ifname, int iface, unsigned long IAID, unsigned long T1, unsigned long T2, SPtr prefix, unsigned long pref, unsigned long valid, int length, bool quiet); // --- TA --- void firstTA(); SPtr getTA(); SPtr getTA(unsigned long iaid); void addTA(SPtr ptr); bool delTA(unsigned long iaid); int countTA(); ~TClntAddrMgr(); void doDuties(); void processLoadedDB(); protected: void print(std::ostream &x); private: SPtr Client; static TClntAddrMgr * Instance; }; #endif dibbler-1.0.1/ClntAddrMgr/ClntAddrMgr.cpp0000644000175000017500000002154712556514200015054 00000000000000/* * Dibbler - a portable DHCPv6 * * authors: Tomasz Mrugalski * Marek Senderski * * released under GNU GPL v2 only licence * */ #include "SmartPtr.h" #include "AddrIA.h" #include "ClntAddrMgr.h" #include "AddrClient.h" #include "Logger.h" using namespace std; TClntAddrMgr * TClntAddrMgr::Instance = 0; void TClntAddrMgr::instanceCreate(SPtr clientDUID, bool useConfirm, const std::string& xmlFile, bool loadDB) { if (Instance) { Log(Crit) << "Attempt to create another instance of TClntAddrMgr!" << LogEnd; return; } Instance = new TClntAddrMgr(clientDUID, useConfirm, xmlFile, loadDB); } TClntAddrMgr& TClntAddrMgr::instance() { return *Instance; } /** * @brief Client Address Manager constructor * * constructor used for creation of client version of address manager * * @param clientDUID pointer to client DUID * @param useConfirm should confirm be used or not? * @param xmlFile XML filename (AddrMgr dumps will be stored there) * @param loadDB should existing dump be loaded? * */ TClntAddrMgr::TClntAddrMgr(SPtr clientDUID, bool useConfirm, const std::string& xmlFile, bool loadDB) :TAddrMgr(xmlFile, useConfirm) { // client may have been already loaded from client-AddrMgr.xml file firstClient(); if (!getClient()) { // add this client (with proper duid) SPtr client = new TAddrClient(clientDUID); addClient(client); } // set Client field DeleteEmptyClient = false; // don't delete this client, even when IAs or PD has been removed firstClient(); Client = getClient(); if (useConfirm) processLoadedDB(); } void TClntAddrMgr::processLoadedDB() { SPtr ia; Client->firstIA(); while (ia=Client->getIA()) { ia->setState(STATE_CONFIRMME); } Client->firstPD(); while (ia=Client->getPD()) { ia->setState(STATE_CONFIRMME); } } unsigned long TClntAddrMgr::getT1Timeout() { return Client->getT1Timeout(); } unsigned long TClntAddrMgr::getT2Timeout() { return Client->getT2Timeout(); } unsigned long TClntAddrMgr::getPrefTimeout() { return Client->getPrefTimeout(); } unsigned long TClntAddrMgr::getValidTimeout() { return Client->getValidTimeout(); } unsigned long TClntAddrMgr::getTimeout() { unsigned long val, val2; val = this->getT1Timeout(); if ( (val2 = this->getT2Timeout()) < val) val = val2; // no special action is required after preferred timeout reached // (except perhaps logging that we are screwed, as no new connections could // be created) //if ( (val2 = this->getPrefTimeout()) < val) // val = val2; if ( (val2 = this->getValidTimeout()) < val) val = val2; return val; } unsigned long TClntAddrMgr::getTentativeTimeout() { SPtr ptrIA; Client->firstIA(); uint32_t min = DHCPV6_INFINITY; while(ptrIA=Client->getIA()) { uint32_t tmp = ptrIA->getTentativeTimeout(); if (min > tmp) min = tmp; } return min; } /** * @brief Removes outdated addresses * * removes addresses that already expired. May also perform * other duties. This method should be called periodically. * */ void TClntAddrMgr::doDuties() { SPtr ptrIA; SPtr ptrAddr; firstIA(); while ( ptrIA = this->getIA() ) { ptrIA->firstAddr(); while( ptrAddr=ptrIA->getAddr()) { //Removing outdated addresses if(!ptrAddr->getValidTimeout()) { ptrIA->delAddr(ptrAddr->get()); Log(Info) << "Expired address " << ptrAddr->get()->getPlain() << " from IA " << ptrIA->getIAID() << " has been removed from addrDB." << LogEnd; } } if ( ((ptrIA->getState() == STATE_CONFIGURED) || (ptrIA->getState() == STATE_CONFIRMME)) && !ptrIA->countAddr()) { ptrIA->setState(STATE_NOTCONFIGURED); } } } void TClntAddrMgr::firstIA() { Client->firstIA(); } SPtr TClntAddrMgr::getIA() { return Client->getIA(); } bool TClntAddrMgr::delIA(long IAID) { return Client->delIA(IAID); } void TClntAddrMgr::addIA(SPtr ptr) { Client->addIA(ptr); } int TClntAddrMgr::countIA() { return Client->countIA(); } TClntAddrMgr::~TClntAddrMgr() { Client.reset(); Log(Debug) << "ClntAddrMgr cleanup." << LogEnd; } SPtr TClntAddrMgr::getIA(unsigned long IAID) { SPtr ptrIA; Client->firstIA(); while (ptrIA = Client->getIA() ) { if (ptrIA->getIAID() == IAID) return ptrIA; } return SPtr(); } /** * sets specified interface to CONFIRMME state * when network switch off signal received, the funtion will be invoked to * set valid IA to CONFIRMME state. * * @param changedLinks structure containing interface indexes to be confirmed */ void TClntAddrMgr::setIA2Confirm(volatile link_state_notify_t * changedLinks) { SPtr ptrIA; this->firstIA(); while(ptrIA = this->getIA()){ bool found = false; int ifindex = ptrIA->getIfindex(); // interface index of this IA // is this index on the list of interfaces to be confirmed? for (int i=0; i < MAX_LINK_STATE_CHANGES_AT_ONCE; i++) if (changedLinks->ifindex[i]==ifindex) found = true; if (!found) continue; if( (ptrIA->getState() == STATE_CONFIGURED || ptrIA->getState() == STATE_INPROCESS) ) { ptrIA->setState(STATE_CONFIRMME); Log(Notice) << "Network switch off event detected. do Confirmming." << LogEnd; } } } // pd functions void TClntAddrMgr::firstPD() { Client->firstPD(); } SPtr TClntAddrMgr::getPD() { return Client->getPD(); } bool TClntAddrMgr::delPD(long IAID) { return Client->delPD(IAID); } void TClntAddrMgr::addPD(SPtr ptr) { Client->addPD(ptr); } int TClntAddrMgr::countPD() { return Client->countPD(); } SPtr TClntAddrMgr::getPD(unsigned long IAID) { SPtr ptrPD; this->Client->firstPD(); while (ptrPD = this->Client->getPD() ) { if (ptrPD->getIAID() == IAID) return ptrPD; } return SPtr(); // NULL } void TClntAddrMgr::firstTA() { Client->firstTA(); } SPtr TClntAddrMgr::getTA() { return Client->getTA(); } SPtr TClntAddrMgr::getTA(unsigned long iaid) { SPtr ta; this->Client->firstTA(); while (ta = this->Client->getTA() ) { if (ta->getIAID() == iaid) return ta; } return SPtr(); // NULL } void TClntAddrMgr::addTA(SPtr ptr) { Client->addTA(ptr); } bool TClntAddrMgr::delTA(unsigned long iaid) { return Client->delTA(iaid); } int TClntAddrMgr::countTA() { return Client->countTA(); } void TClntAddrMgr::print(std::ostream &) { } /** * @brief Adds a prefix. * * @param srvDuid Server DUID * @param srvAddr Server address. * @param iface interface index * @param IAID IAID * @param T1 T1 timer * @param T2 T2 timer * @param prefix prefix * @param pref prefered lifetime * @param valid valid lifetime * @param length prefix length * @param quiet quiet mode (true=be quiet) * * @return true if successful, false otherwise */ bool TClntAddrMgr::addPrefix(SPtr srvDuid , SPtr srvAddr, const std::string& ifacename, int iface, unsigned long IAID, unsigned long T1, unsigned long T2, SPtr prefix, unsigned long pref, unsigned long valid, int length, bool quiet) { if (!prefix) { Log(Error) << "Attempt to add null prefix failed." << LogEnd; return false; } // find this client SPtr ptrClient; this->firstClient(); ptrClient = getClient(); return TAddrMgr::addPrefix(ptrClient, srvDuid, srvAddr, ifacename, iface, IAID, T1, T2, prefix, pref, valid, length, quiet); } bool TClntAddrMgr::updatePrefix(SPtr srvDuid , SPtr srvAddr, const std::string& ifname, int iface, unsigned long IAID, unsigned long T1, unsigned long T2, SPtr prefix, unsigned long pref, unsigned long valid, int length, bool quiet) { if (!prefix) { Log(Error) << "Attempt to update null prefix failed." << LogEnd; return false; } // find this client SPtr ptrClient; this->firstClient(); ptrClient = getClient(); return TAddrMgr::updatePrefix(ptrClient, srvDuid, srvAddr, iface, IAID, T1, T2, prefix, pref, valid, length, quiet); } SPtr TClntAddrMgr::getPreferredAddr() { SPtr ia; SPtr addr; firstIA(); while ( ia = getIA() ) { if (ia->getTentative() != ADDRSTATUS_NO) continue; ia->firstAddr(); while (addr = ia->getAddr()) { if (addr->getTentative() == ADDRSTATUS_NO) return addr->get(); // return the first address from first non-tentative //if (is_addr_tentative(NULL, ia->getIface(), addr->get()->getPlain()) == LOWLEVEL_TENTATIVE_NO) } } return SPtr(); // NULL } dibbler-1.0.1/ClntAddrMgr/Makefile.in0000664000175000017500000005053712561652534014270 00000000000000# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = ClntAddrMgr DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/depcomp ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/libtool.m4 \ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/include/dibbler-config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = LIBRARIES = $(noinst_LIBRARIES) ARFLAGS = cru AM_V_AR = $(am__v_AR_@AM_V@) am__v_AR_ = $(am__v_AR_@AM_DEFAULT_V@) am__v_AR_0 = @echo " AR " $@; am__v_AR_1 = libClntAddrMgr_a_AR = $(AR) $(ARFLAGS) libClntAddrMgr_a_LIBADD = am_libClntAddrMgr_a_OBJECTS = libClntAddrMgr_a-ClntAddrMgr.$(OBJEXT) libClntAddrMgr_a_OBJECTS = $(am_libClntAddrMgr_a_OBJECTS) AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)/include depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) LTCXXCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CXXFLAGS) $(CXXFLAGS) AM_V_CXX = $(am__v_CXX_@AM_V@) am__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@) am__v_CXX_0 = @echo " CXX " $@; am__v_CXX_1 = CXXLD = $(CXX) CXXLINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \ $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CXXLD = $(am__v_CXXLD_@AM_V@) am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@) am__v_CXXLD_0 = @echo " CXXLD " $@; am__v_CXXLD_1 = COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(libClntAddrMgr_a_SOURCES) DIST_SOURCES = $(libClntAddrMgr_a_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALLOCA = @ALLOCA@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ ARCH = @ARCH@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ EXTRA_DIST_SUBDIRS = @EXTRA_DIST_SUBDIRS@ FGREP = @FGREP@ GREP = @GREP@ GTEST_INCLUDES = @GTEST_INCLUDES@ GTEST_LDADD = @GTEST_LDADD@ GTEST_LDFLAGS = @GTEST_LDFLAGS@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LINKPRINT = @LINKPRINT@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PORT_CFLAGS = @PORT_CFLAGS@ PORT_LDFLAGS = @PORT_LDFLAGS@ PORT_SUBDIR = @PORT_SUBDIR@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ subdirs = @subdirs@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ noinst_LIBRARIES = libClntAddrMgr.a libClntAddrMgr_a_CPPFLAGS = -I$(top_srcdir)/Misc -I$(top_srcdir)/AddrMgr libClntAddrMgr_a_SOURCES = ClntAddrMgr.cpp ClntAddrMgr.h all: all-am .SUFFIXES: .SUFFIXES: .cpp .lo .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign ClntAddrMgr/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign ClntAddrMgr/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstLIBRARIES: -test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES) libClntAddrMgr.a: $(libClntAddrMgr_a_OBJECTS) $(libClntAddrMgr_a_DEPENDENCIES) $(EXTRA_libClntAddrMgr_a_DEPENDENCIES) $(AM_V_at)-rm -f libClntAddrMgr.a $(AM_V_AR)$(libClntAddrMgr_a_AR) libClntAddrMgr.a $(libClntAddrMgr_a_OBJECTS) $(libClntAddrMgr_a_LIBADD) $(AM_V_at)$(RANLIB) libClntAddrMgr.a mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libClntAddrMgr_a-ClntAddrMgr.Po@am__quote@ .cpp.o: @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $< .cpp.obj: @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .cpp.lo: @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LTCXXCOMPILE) -c -o $@ $< libClntAddrMgr_a-ClntAddrMgr.o: ClntAddrMgr.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libClntAddrMgr_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libClntAddrMgr_a-ClntAddrMgr.o -MD -MP -MF $(DEPDIR)/libClntAddrMgr_a-ClntAddrMgr.Tpo -c -o libClntAddrMgr_a-ClntAddrMgr.o `test -f 'ClntAddrMgr.cpp' || echo '$(srcdir)/'`ClntAddrMgr.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libClntAddrMgr_a-ClntAddrMgr.Tpo $(DEPDIR)/libClntAddrMgr_a-ClntAddrMgr.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='ClntAddrMgr.cpp' object='libClntAddrMgr_a-ClntAddrMgr.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libClntAddrMgr_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libClntAddrMgr_a-ClntAddrMgr.o `test -f 'ClntAddrMgr.cpp' || echo '$(srcdir)/'`ClntAddrMgr.cpp libClntAddrMgr_a-ClntAddrMgr.obj: ClntAddrMgr.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libClntAddrMgr_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libClntAddrMgr_a-ClntAddrMgr.obj -MD -MP -MF $(DEPDIR)/libClntAddrMgr_a-ClntAddrMgr.Tpo -c -o libClntAddrMgr_a-ClntAddrMgr.obj `if test -f 'ClntAddrMgr.cpp'; then $(CYGPATH_W) 'ClntAddrMgr.cpp'; else $(CYGPATH_W) '$(srcdir)/ClntAddrMgr.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libClntAddrMgr_a-ClntAddrMgr.Tpo $(DEPDIR)/libClntAddrMgr_a-ClntAddrMgr.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='ClntAddrMgr.cpp' object='libClntAddrMgr_a-ClntAddrMgr.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libClntAddrMgr_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libClntAddrMgr_a-ClntAddrMgr.obj `if test -f 'ClntAddrMgr.cpp'; then $(CYGPATH_W) 'ClntAddrMgr.cpp'; else $(CYGPATH_W) '$(srcdir)/ClntAddrMgr.cpp'; fi` mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LIBRARIES) installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool clean-noinstLIBRARIES \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \ clean-libtool clean-noinstLIBRARIES cscopelist-am ctags \ ctags-am distclean distclean-compile distclean-generic \ distclean-libtool distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-dvi install-dvi-am install-exec \ install-exec-am install-html install-html-am install-info \ install-info-am install-man install-pdf install-pdf-am \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ tags tags-am uninstall uninstall-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: